!function(g,I){if("object"==typeof exports&&"object"==typeof module)module.exports=I();else if("function"==typeof define&&define.amd)define([],I);else{var n=I();for(var t in n)("object"==typeof exports?exports:g)[t]=n[t]}}(window,(function(){return function(g){var I={};function n(t){if(I[t])return I[t].exports;var e=I[t]={i:t,l:!1,exports:{}};return g[t].call(e.exports,e,e.exports,n),e.l=!0,e.exports}return n.m=g,n.c=I,n.d=function(g,I,t){n.o(g,I)||Object.defineProperty(g,I,{enumerable:!0,get:t})},n.r=function(g){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(g,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(g,"__esModule",{value:!0})},n.t=function(g,I){if(1&I&&(g=n(g)),8&I)return g;if(4&I&&"object"==typeof g&&g&&g.__esModule)return g;var t=Object.create(null);if(n.r(t),Object.defineProperty(t,"default",{enumerable:!0,value:g}),2&I&&"string"!=typeof g)for(var e in g)n.d(t,e,function(I){return g[I]}.bind(null,e));return t},n.n=function(g){var I=g&&g.__esModule?function(){return g.default}:function(){return g};return n.d(I,"a",I),I},n.o=function(g,I){return Object.prototype.hasOwnProperty.call(g,I)},n.p="",n(n.s=96)}([function(module,__webpack_exports__,__webpack_require__){"use strict";eval('// ESM COMPAT FLAG\n__webpack_require__.r(__webpack_exports__);\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, "contains", function() { return /* reexport */ esm_contains; });\n__webpack_require__.d(__webpack_exports__, "includes", function() { return /* reexport */ esm_contains; });\n__webpack_require__.d(__webpack_exports__, "difference", function() { return /* reexport */ esm_difference; });\n__webpack_require__.d(__webpack_exports__, "find", function() { return /* reexport */ esm_find; });\n__webpack_require__.d(__webpack_exports__, "findIndex", function() { return /* reexport */ find_index; });\n__webpack_require__.d(__webpack_exports__, "firstValue", function() { return /* reexport */ first_value; });\n__webpack_require__.d(__webpack_exports__, "flatten", function() { return /* reexport */ esm_flatten; });\n__webpack_require__.d(__webpack_exports__, "flattenDeep", function() { return /* reexport */ flatten_deep; });\n__webpack_require__.d(__webpack_exports__, "getRange", function() { return /* reexport */ get_range; });\n__webpack_require__.d(__webpack_exports__, "pull", function() { return /* reexport */ esm_pull; });\n__webpack_require__.d(__webpack_exports__, "pullAt", function() { return /* reexport */ pull_at; });\n__webpack_require__.d(__webpack_exports__, "reduce", function() { return /* reexport */ esm_reduce; });\n__webpack_require__.d(__webpack_exports__, "remove", function() { return /* reexport */ esm_remove; });\n__webpack_require__.d(__webpack_exports__, "sortBy", function() { return /* reexport */ sort_by; });\n__webpack_require__.d(__webpack_exports__, "union", function() { return /* reexport */ esm_union; });\n__webpack_require__.d(__webpack_exports__, "uniq", function() { return /* reexport */ uniq; });\n__webpack_require__.d(__webpack_exports__, "valuesOfKey", function() { return /* reexport */ values_of_key; });\n__webpack_require__.d(__webpack_exports__, "head", function() { return /* reexport */ head; });\n__webpack_require__.d(__webpack_exports__, "last", function() { return /* reexport */ last_last; });\n__webpack_require__.d(__webpack_exports__, "startsWith", function() { return /* reexport */ starts_with; });\n__webpack_require__.d(__webpack_exports__, "endsWith", function() { return /* reexport */ ends_with; });\n__webpack_require__.d(__webpack_exports__, "filter", function() { return /* reexport */ esm_filter; });\n__webpack_require__.d(__webpack_exports__, "every", function() { return /* reexport */ esm_every; });\n__webpack_require__.d(__webpack_exports__, "some", function() { return /* reexport */ esm_some; });\n__webpack_require__.d(__webpack_exports__, "group", function() { return /* reexport */ group; });\n__webpack_require__.d(__webpack_exports__, "groupBy", function() { return /* reexport */ group_by; });\n__webpack_require__.d(__webpack_exports__, "groupToMap", function() { return /* reexport */ groupToMap; });\n__webpack_require__.d(__webpack_exports__, "getWrapBehavior", function() { return /* reexport */ get_wrap_behavior; });\n__webpack_require__.d(__webpack_exports__, "wrapBehavior", function() { return /* reexport */ wrap_behavior; });\n__webpack_require__.d(__webpack_exports__, "number2color", function() { return /* reexport */ number2color; });\n__webpack_require__.d(__webpack_exports__, "parseRadius", function() { return /* reexport */ parse_radius; });\n__webpack_require__.d(__webpack_exports__, "clamp", function() { return /* reexport */ esm_clamp; });\n__webpack_require__.d(__webpack_exports__, "fixedBase", function() { return /* reexport */ fixed_base; });\n__webpack_require__.d(__webpack_exports__, "isDecimal", function() { return /* reexport */ is_decimal; });\n__webpack_require__.d(__webpack_exports__, "isEven", function() { return /* reexport */ is_even; });\n__webpack_require__.d(__webpack_exports__, "isInteger", function() { return /* reexport */ is_integer; });\n__webpack_require__.d(__webpack_exports__, "isNegative", function() { return /* reexport */ is_negative; });\n__webpack_require__.d(__webpack_exports__, "isNumberEqual", function() { return /* reexport */ isNumberEqual; });\n__webpack_require__.d(__webpack_exports__, "isOdd", function() { return /* reexport */ is_odd; });\n__webpack_require__.d(__webpack_exports__, "isPositive", function() { return /* reexport */ is_positive; });\n__webpack_require__.d(__webpack_exports__, "max", function() { return /* reexport */ esm_max; });\n__webpack_require__.d(__webpack_exports__, "maxBy", function() { return /* reexport */ max_by; });\n__webpack_require__.d(__webpack_exports__, "min", function() { return /* reexport */ esm_min; });\n__webpack_require__.d(__webpack_exports__, "minBy", function() { return /* reexport */ min_by; });\n__webpack_require__.d(__webpack_exports__, "mod", function() { return /* reexport */ esm_mod; });\n__webpack_require__.d(__webpack_exports__, "toDegree", function() { return /* reexport */ to_degree; });\n__webpack_require__.d(__webpack_exports__, "toInteger", function() { return /* reexport */ to_integer; });\n__webpack_require__.d(__webpack_exports__, "toRadian", function() { return /* reexport */ to_radian; });\n__webpack_require__.d(__webpack_exports__, "forIn", function() { return /* reexport */ for_in; });\n__webpack_require__.d(__webpack_exports__, "has", function() { return /* reexport */ has; });\n__webpack_require__.d(__webpack_exports__, "hasKey", function() { return /* reexport */ has_key; });\n__webpack_require__.d(__webpack_exports__, "hasValue", function() { return /* reexport */ has_value; });\n__webpack_require__.d(__webpack_exports__, "keys", function() { return /* reexport */ esm_keys; });\n__webpack_require__.d(__webpack_exports__, "isMatch", function() { return /* reexport */ is_match; });\n__webpack_require__.d(__webpack_exports__, "values", function() { return /* reexport */ esm_values; });\n__webpack_require__.d(__webpack_exports__, "lowerCase", function() { return /* reexport */ lower_case; });\n__webpack_require__.d(__webpack_exports__, "lowerFirst", function() { return /* reexport */ lower_first; });\n__webpack_require__.d(__webpack_exports__, "substitute", function() { return /* reexport */ esm_substitute; });\n__webpack_require__.d(__webpack_exports__, "upperCase", function() { return /* reexport */ upper_case; });\n__webpack_require__.d(__webpack_exports__, "upperFirst", function() { return /* reexport */ upper_first; });\n__webpack_require__.d(__webpack_exports__, "getType", function() { return /* reexport */ get_type; });\n__webpack_require__.d(__webpack_exports__, "isArguments", function() { return /* reexport */ is_arguments; });\n__webpack_require__.d(__webpack_exports__, "isArray", function() { return /* reexport */ is_array; });\n__webpack_require__.d(__webpack_exports__, "isArrayLike", function() { return /* reexport */ is_array_like; });\n__webpack_require__.d(__webpack_exports__, "isBoolean", function() { return /* reexport */ is_boolean; });\n__webpack_require__.d(__webpack_exports__, "isDate", function() { return /* reexport */ is_date; });\n__webpack_require__.d(__webpack_exports__, "isError", function() { return /* reexport */ is_error; });\n__webpack_require__.d(__webpack_exports__, "isFunction", function() { return /* reexport */ is_function; });\n__webpack_require__.d(__webpack_exports__, "isFinite", function() { return /* reexport */ is_finite; });\n__webpack_require__.d(__webpack_exports__, "isNil", function() { return /* reexport */ is_nil; });\n__webpack_require__.d(__webpack_exports__, "isNull", function() { return /* reexport */ is_null; });\n__webpack_require__.d(__webpack_exports__, "isNumber", function() { return /* reexport */ is_number; });\n__webpack_require__.d(__webpack_exports__, "isObject", function() { return /* reexport */ is_object; });\n__webpack_require__.d(__webpack_exports__, "isObjectLike", function() { return /* reexport */ is_object_like; });\n__webpack_require__.d(__webpack_exports__, "isPlainObject", function() { return /* reexport */ is_plain_object; });\n__webpack_require__.d(__webpack_exports__, "isPrototype", function() { return /* reexport */ is_prototype; });\n__webpack_require__.d(__webpack_exports__, "isRegExp", function() { return /* reexport */ is_reg_exp; });\n__webpack_require__.d(__webpack_exports__, "isString", function() { return /* reexport */ is_string; });\n__webpack_require__.d(__webpack_exports__, "isType", function() { return /* reexport */ is_type; });\n__webpack_require__.d(__webpack_exports__, "isUndefined", function() { return /* reexport */ is_undefined; });\n__webpack_require__.d(__webpack_exports__, "isElement", function() { return /* reexport */ is_element; });\n__webpack_require__.d(__webpack_exports__, "requestAnimationFrame", function() { return /* reexport */ requestAnimationFrame; });\n__webpack_require__.d(__webpack_exports__, "clearAnimationFrame", function() { return /* reexport */ cancelAnimationFrame; });\n__webpack_require__.d(__webpack_exports__, "augment", function() { return /* reexport */ esm_augment; });\n__webpack_require__.d(__webpack_exports__, "clone", function() { return /* reexport */ esm_clone; });\n__webpack_require__.d(__webpack_exports__, "debounce", function() { return /* reexport */ esm_debounce; });\n__webpack_require__.d(__webpack_exports__, "memoize", function() { return /* reexport */ memoize; });\n__webpack_require__.d(__webpack_exports__, "deepMix", function() { return /* reexport */ deep_mix; });\n__webpack_require__.d(__webpack_exports__, "each", function() { return /* reexport */ esm_each; });\n__webpack_require__.d(__webpack_exports__, "extend", function() { return /* reexport */ esm_extend; });\n__webpack_require__.d(__webpack_exports__, "indexOf", function() { return /* reexport */ index_of; });\n__webpack_require__.d(__webpack_exports__, "isEmpty", function() { return /* reexport */ is_empty; });\n__webpack_require__.d(__webpack_exports__, "isEqual", function() { return /* reexport */ is_equal; });\n__webpack_require__.d(__webpack_exports__, "isEqualWith", function() { return /* reexport */ is_equal_with; });\n__webpack_require__.d(__webpack_exports__, "map", function() { return /* reexport */ esm_map; });\n__webpack_require__.d(__webpack_exports__, "mapValues", function() { return /* reexport */ map_values; });\n__webpack_require__.d(__webpack_exports__, "mix", function() { return /* reexport */ mix; });\n__webpack_require__.d(__webpack_exports__, "assign", function() { return /* reexport */ mix; });\n__webpack_require__.d(__webpack_exports__, "get", function() { return /* reexport */ get; });\n__webpack_require__.d(__webpack_exports__, "set", function() { return /* reexport */ set; });\n__webpack_require__.d(__webpack_exports__, "pick", function() { return /* reexport */ pick; });\n__webpack_require__.d(__webpack_exports__, "omit", function() { return /* reexport */ omit; });\n__webpack_require__.d(__webpack_exports__, "throttle", function() { return /* reexport */ throttle; });\n__webpack_require__.d(__webpack_exports__, "toArray", function() { return /* reexport */ to_array; });\n__webpack_require__.d(__webpack_exports__, "toString", function() { return /* reexport */ to_string; });\n__webpack_require__.d(__webpack_exports__, "uniqueId", function() { return /* reexport */ unique_id; });\n__webpack_require__.d(__webpack_exports__, "noop", function() { return /* reexport */ noop; });\n__webpack_require__.d(__webpack_exports__, "identity", function() { return /* reexport */ esm_identity; });\n__webpack_require__.d(__webpack_exports__, "size", function() { return /* reexport */ size; });\n__webpack_require__.d(__webpack_exports__, "measureTextWidth", function() { return /* reexport */ measure_text_width; });\n__webpack_require__.d(__webpack_exports__, "getEllipsisText", function() { return /* reexport */ get_ellipsis_text; });\n__webpack_require__.d(__webpack_exports__, "Cache", function() { return /* reexport */ cache; });\n\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/is-array-like.js\nvar isArrayLike = function (value) {\n /**\n * isArrayLike([1, 2, 3]) => true\n * isArrayLike(document.body.children) => true\n * isArrayLike(\'abc\') => true\n * isArrayLike(Function) => false\n */\n return value !== null && typeof value !== \'function\' && isFinite(value.length);\n};\n/* harmony default export */ var is_array_like = (isArrayLike);\n//# sourceMappingURL=is-array-like.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/contains.js\n\nvar contains = function (arr, value) {\n if (!is_array_like(arr)) {\n return false;\n }\n return arr.indexOf(value) > -1;\n};\n/* harmony default export */ var esm_contains = (contains);\n//# sourceMappingURL=contains.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/filter.js\n\nvar filter = function (arr, func) {\n if (!is_array_like(arr)) {\n return arr;\n }\n var result = [];\n for (var index = 0; index < arr.length; index++) {\n var value = arr[index];\n if (func(value, index)) {\n result.push(value);\n }\n }\n return result;\n};\n/* harmony default export */ var esm_filter = (filter);\n//# sourceMappingURL=filter.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/difference.js\n\n\n/**\n * Flattens `array` a single level deep.\n *\n * @param {Array} arr The array to inspect.\n * @param {Array} values The values to exclude.\n * @return {Array} Returns the new array of filtered values.\n * @example\n * difference([2, 1], [2, 3]); // => [1]\n */\nvar difference = function (arr, values) {\n if (values === void 0) { values = []; }\n return esm_filter(arr, function (value) { return !esm_contains(values, value); });\n};\n/* harmony default export */ var esm_difference = (difference);\n//# sourceMappingURL=difference.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/is-type.js\nvar is_type_toString = {}.toString;\nvar isType = function (value, type) { return is_type_toString.call(value) === \'[object \' + type + \']\'; };\n/* harmony default export */ var is_type = (isType);\n//# sourceMappingURL=is-type.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/is-function.js\n/**\n * 是否为函数\n * @param {*} fn 对象\n * @return {Boolean} 是否函数\n */\n\n/* harmony default export */ var is_function = (function (value) {\n return is_type(value, \'Function\');\n});\n//# sourceMappingURL=is-function.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/is-nil.js\n// isFinite,\nvar isNil = function (value) {\n /**\n * isNil(null) => true\n * isNil() => true\n */\n return value === null || value === undefined;\n};\n/* harmony default export */ var is_nil = (isNil);\n//# sourceMappingURL=is-nil.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/is-array.js\n\n/* harmony default export */ var is_array = (function (value) {\n return Array.isArray ?\n Array.isArray(value) :\n is_type(value, \'Array\');\n});\n//# sourceMappingURL=is-array.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/is-object.js\n/* harmony default export */ var is_object = (function (value) {\n /**\n * isObject({}) => true\n * isObject([1, 2, 3]) => true\n * isObject(Function) => true\n * isObject(null) => false\n */\n var type = typeof value;\n return value !== null && type === \'object\' || type === \'function\';\n});\n//# sourceMappingURL=is-object.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/each.js\n\n\nfunction each(elements, func) {\n if (!elements) {\n return;\n }\n var rst;\n if (is_array(elements)) {\n for (var i = 0, len = elements.length; i < len; i++) {\n rst = func(elements[i], i);\n if (rst === false) {\n break;\n }\n }\n }\n else if (is_object(elements)) {\n for (var k in elements) {\n if (elements.hasOwnProperty(k)) {\n rst = func(elements[k], k);\n if (rst === false) {\n break;\n }\n }\n }\n }\n}\n/* harmony default export */ var esm_each = (each);\n//# sourceMappingURL=each.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/keys.js\n\n\nvar keys_keys = Object.keys ? function (obj) { return Object.keys(obj); } : function (obj) {\n var result = [];\n esm_each(obj, function (value, key) {\n if (!(is_function(obj) && key === \'prototype\')) {\n result.push(key);\n }\n });\n return result;\n};\n/* harmony default export */ var esm_keys = (keys_keys);\n//# sourceMappingURL=keys.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/is-match.js\n\n\nfunction isMatch(obj, attrs) {\n var _keys = esm_keys(attrs);\n var length = _keys.length;\n if (is_nil(obj))\n return !length;\n for (var i = 0; i < length; i += 1) {\n var key = _keys[i];\n if (attrs[key] !== obj[key] || !(key in obj)) {\n return false;\n }\n }\n return true;\n}\n/* harmony default export */ var is_match = (isMatch);\n//# sourceMappingURL=is-match.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/is-object-like.js\nvar isObjectLike = function (value) {\n /**\n * isObjectLike({}) => true\n * isObjectLike([1, 2, 3]) => true\n * isObjectLike(Function) => false\n * isObjectLike(null) => false\n */\n return typeof value === \'object\' && value !== null;\n};\n/* harmony default export */ var is_object_like = (isObjectLike);\n//# sourceMappingURL=is-object-like.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/is-plain-object.js\n\n\nvar isPlainObject = function (value) {\n /**\n * isObjectLike(new Foo) => false\n * isObjectLike([1, 2, 3]) => false\n * isObjectLike({ x: 0, y: 0 }) => true\n * isObjectLike(Object.create(null)) => true\n */\n if (!is_object_like(value) || !is_type(value, \'Object\')) {\n return false;\n }\n if (Object.getPrototypeOf(value) === null) {\n return true;\n }\n var proto = value;\n while (Object.getPrototypeOf(proto) !== null) {\n proto = Object.getPrototypeOf(proto);\n }\n return Object.getPrototypeOf(value) === proto;\n};\n/* harmony default export */ var is_plain_object = (isPlainObject);\n//# sourceMappingURL=is-plain-object.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/find.js\n\n\n\n\nfunction find(arr, predicate) {\n if (!is_array(arr))\n return null;\n var _predicate;\n if (is_function(predicate)) {\n _predicate = predicate;\n }\n if (is_plain_object(predicate)) {\n _predicate = function (a) { return is_match(a, predicate); };\n }\n if (_predicate) {\n for (var i = 0; i < arr.length; i += 1) {\n if (_predicate(arr[i])) {\n return arr[i];\n }\n }\n }\n return null;\n}\n/* harmony default export */ var esm_find = (find);\n//# sourceMappingURL=find.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/find-index.js\nfunction findIndex(arr, predicate, fromIndex) {\n if (fromIndex === void 0) { fromIndex = 0; }\n for (var i = fromIndex; i < arr.length; i++) {\n if (predicate(arr[i], i)) {\n // 找到终止循环\n return i;\n }\n }\n return -1;\n}\n/* harmony default export */ var find_index = (findIndex);\n//# sourceMappingURL=find-index.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/first-value.js\n\n\nvar firstValue = function (data, name) {\n var rst = null;\n for (var i = 0; i < data.length; i++) {\n var obj = data[i];\n var value = obj[name];\n if (!is_nil(value)) {\n if (is_array(value)) {\n rst = value[0]; // todo 这里是否应该使用递归,调用 firstValue @绝云\n }\n else {\n rst = value;\n }\n break;\n }\n }\n return rst;\n};\n/* harmony default export */ var first_value = (firstValue);\n//# sourceMappingURL=first-value.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/flatten.js\n\n/**\n * Flattens `array` a single level deep.\n *\n * @param {Array} arr The array to flatten.\n * @return {Array} Returns the new flattened array.\n * @example\n *\n * flatten([1, [2, [3, [4]], 5]]); // => [1, 2, [3, [4]], 5]\n */\nvar flatten = function (arr) {\n if (!is_array(arr)) {\n return [];\n }\n var rst = [];\n for (var i = 0; i < arr.length; i++) {\n rst = rst.concat(arr[i]);\n }\n return rst;\n};\n/* harmony default export */ var esm_flatten = (flatten);\n//# sourceMappingURL=flatten.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/flatten-deep.js\n\n/**\n * Flattens `array` a single level deep.\n *\n * @param {Array} arr The array to flatten.\n * @param {Array} result The array to return.\n * @return {Array} Returns the new flattened array.\n * @example\n *\n * flattenDeep([1, [2, [3, [4]], 5]]); // => [1, 2, 3, 4, 5]\n */\nvar flattenDeep = function (arr, result) {\n if (result === void 0) { result = []; }\n if (!is_array(arr)) {\n result.push(arr);\n }\n else {\n for (var i = 0; i < arr.length; i += 1) {\n flattenDeep(arr[i], result);\n }\n }\n return result;\n};\n/* harmony default export */ var flatten_deep = (flattenDeep);\n//# sourceMappingURL=flatten-deep.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/max.js\n\n/**\n * @param {Array} arr The array to iterate over.\n * @return {*} Returns the maximum value.\n * @example\n *\n * max([1, 2]);\n * // => 2\n *\n * max([]);\n * // => undefined\n *\n * const data = new Array(1250010).fill(1).map((d,idx) => idx);\n *\n * max(data);\n * // => 1250010\n * // Math.max(...data) will encounter "Maximum call stack size exceeded" error\n */\n/* harmony default export */ var esm_max = (function (arr) {\n if (!is_array(arr)) {\n return undefined;\n }\n return arr.reduce(function (prev, curr) {\n return Math.max(prev, curr);\n }, arr[0]);\n});\n//# sourceMappingURL=max.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/min.js\n\n/**\n * @param {Array} arr The array to iterate over.\n * @return {*} Returns the minimum value.\n * @example\n *\n * min([1, 2]);\n * // => 1\n *\n * min([]);\n * // => undefined\n *\n * const data = new Array(1250010).fill(1).map((d,idx) => idx);\n *\n * min(data);\n * // => 1250010\n * // Math.min(...data) will encounter "Maximum call stack size exceeded" error\n */\n/* harmony default export */ var esm_min = (function (arr) {\n if (!is_array(arr)) {\n return undefined;\n }\n return arr.reduce(function (prev, curr) {\n return Math.min(prev, curr);\n }, arr[0]);\n});\n//# sourceMappingURL=min.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/get-range.js\n\n\n\nvar getRange = function (values) {\n // 存在 NaN 时,min,max 判定会出问题\n var filterValues = values.filter(function (v) { return !isNaN(v); });\n if (!filterValues.length) {\n // 如果没有数值则直接返回0\n return {\n min: 0,\n max: 0,\n };\n }\n if (is_array(values[0])) {\n var tmp = [];\n for (var i = 0; i < values.length; i++) {\n tmp = tmp.concat(values[i]);\n }\n filterValues = tmp;\n }\n var max = esm_max(filterValues);\n var min = esm_min(filterValues);\n return {\n min: min,\n max: max,\n };\n};\n/* harmony default export */ var get_range = (getRange);\n//# sourceMappingURL=get-range.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/pull.js\nvar arrPrototype = Array.prototype;\nvar splice = arrPrototype.splice;\nvar indexOf = arrPrototype.indexOf;\nvar pull = function (arr) {\n var values = [];\n for (var _i = 1; _i < arguments.length; _i++) {\n values[_i - 1] = arguments[_i];\n }\n for (var i = 0; i < values.length; i++) {\n var value = values[i];\n var fromIndex = -1;\n while ((fromIndex = indexOf.call(arr, value)) > -1) {\n splice.call(arr, fromIndex, 1);\n }\n }\n return arr;\n};\n/* harmony default export */ var esm_pull = (pull);\n//# sourceMappingURL=pull.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/pull-at.js\n\nvar pull_at_splice = Array.prototype.splice;\nvar pull_at_pullAt = function pullAt(arr, indexes) {\n if (!is_array_like(arr)) {\n return [];\n }\n var length = arr ? indexes.length : 0;\n var last = length - 1;\n while (length--) {\n var previous = void 0;\n var index = indexes[length];\n if (length === last || index !== previous) {\n previous = index;\n pull_at_splice.call(arr, index, 1);\n }\n }\n return arr;\n};\n/* harmony default export */ var pull_at = (pull_at_pullAt);\n//# sourceMappingURL=pull-at.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/reduce.js\n\n\n\nvar reduce = function (arr, fn, init) {\n if (!is_array(arr) && !is_plain_object(arr)) {\n return arr;\n }\n var result = init;\n esm_each(arr, function (data, i) {\n result = fn(result, data, i);\n });\n return result;\n};\n/* harmony default export */ var esm_reduce = (reduce);\n//# sourceMappingURL=reduce.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/remove.js\n\n\nvar remove = function (arr, predicate) {\n /**\n * const arr = [1, 2, 3, 4]\n * const evens = remove(arr, n => n % 2 == 0)\n * console.log(arr) // => [1, 3]\n * console.log(evens) // => [2, 4]\n */\n var result = [];\n if (!is_array_like(arr)) {\n return result;\n }\n var i = -1;\n var indexes = [];\n var length = arr.length;\n while (++i < length) {\n var value = arr[i];\n if (predicate(value, i, arr)) {\n result.push(value);\n indexes.push(i);\n }\n }\n pull_at(arr, indexes);\n return result;\n};\n/* harmony default export */ var esm_remove = (remove);\n//# sourceMappingURL=remove.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/is-string.js\n\n/* harmony default export */ var is_string = (function (str) {\n return is_type(str, \'String\');\n});\n//# sourceMappingURL=is-string.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/sort-by.js\n\n\n\nfunction sortBy(arr, key) {\n var comparer;\n if (is_function(key)) {\n comparer = function (a, b) { return key(a) - key(b); };\n }\n else {\n var keys_1 = [];\n if (is_string(key)) {\n keys_1.push(key);\n }\n else if (is_array(key)) {\n keys_1 = key;\n }\n comparer = function (a, b) {\n for (var i = 0; i < keys_1.length; i += 1) {\n var prop = keys_1[i];\n if (a[prop] > b[prop]) {\n return 1;\n }\n if (a[prop] < b[prop]) {\n return -1;\n }\n }\n return 0;\n };\n }\n arr.sort(comparer);\n return arr;\n}\n/* harmony default export */ var sort_by = (sortBy);\n//# sourceMappingURL=sort-by.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/uniq.js\nfunction uniq(arr, cache) {\n if (cache === void 0) { cache = new Map(); }\n var r = [];\n if (Array.isArray(arr)) {\n for (var i = 0, len = arr.length; i < len; i++) {\n var item = arr[i];\n // 加一个 cache,提升性能\n if (!cache.has(item)) {\n r.push(item);\n cache.set(item, true);\n }\n }\n }\n return r;\n}\n//# sourceMappingURL=uniq.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/union.js\n\nvar union = function () {\n var sources = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n sources[_i] = arguments[_i];\n }\n return uniq([].concat.apply([], sources));\n};\n/* harmony default export */ var esm_union = (union);\n//# sourceMappingURL=union.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/values-of-key.js\n\n\n/* harmony default export */ var values_of_key = (function (data, name) {\n var rst = [];\n var tmpMap = {};\n for (var i = 0; i < data.length; i++) {\n var obj = data[i];\n var value = obj[name];\n if (!is_nil(value)) {\n // flatten\n if (!is_array(value)) {\n value = [value];\n }\n for (var j = 0; j < value.length; j++) {\n var val = value[j];\n // unique\n if (!tmpMap[val]) {\n rst.push(val);\n tmpMap[val] = true;\n }\n }\n }\n }\n return rst;\n});\n//# sourceMappingURL=values-of-key.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/head.js\n\nfunction head(o) {\n if (is_array_like(o)) {\n return o[0];\n }\n return undefined;\n}\n//# sourceMappingURL=head.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/last.js\n\nfunction last_last(o) {\n if (is_array_like(o)) {\n var arr = o;\n return arr[arr.length - 1];\n }\n return undefined;\n}\n//# sourceMappingURL=last.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/starts-with.js\n\n\nfunction startsWith(arr, e) {\n return (is_array(arr) || is_string(arr)) ? arr[0] === e : false;\n}\n/* harmony default export */ var starts_with = (startsWith);\n//# sourceMappingURL=starts-with.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/ends-with.js\n\n\nfunction endsWith(arr, e) {\n return (is_array(arr) || is_string(arr)) ? arr[arr.length - 1] === e : false;\n}\n/* harmony default export */ var ends_with = (endsWith);\n//# sourceMappingURL=ends-with.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/every.js\n/**\n * 只要有一个不满足条件就返回 false\n * @param arr\n * @param func\n */\nvar every = function (arr, func) {\n for (var i = 0; i < arr.length; i++) {\n if (!func(arr[i], i))\n return false;\n }\n return true;\n};\n/* harmony default export */ var esm_every = (every);\n//# sourceMappingURL=every.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/some.js\n/**\n * 只要有一个满足条件就返回 true\n * @param arr\n * @param func\n */\nvar some = function (arr, func) {\n for (var i = 0; i < arr.length; i++) {\n if (func(arr[i], i))\n return true;\n }\n return false;\n};\n/* harmony default export */ var esm_some = (some);\n//# sourceMappingURL=some.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/group-by.js\n\n\nvar group_by_hasOwnProperty = Object.prototype.hasOwnProperty;\nfunction groupBy(data, condition) {\n if (!condition || !is_array(data)) {\n return {};\n }\n var result = {};\n // 兼容方法和 字符串的写法\n var predicate = is_function(condition) ? condition : function (item) { return item[condition]; };\n var key;\n for (var i = 0; i < data.length; i++) {\n var item = data[i];\n key = predicate(item);\n if (group_by_hasOwnProperty.call(result, key)) {\n result[key].push(item);\n }\n else {\n result[key] = [item];\n }\n }\n return result;\n}\n/* harmony default export */ var group_by = (groupBy);\n//# sourceMappingURL=group-by.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/group-to-map.js\n\n\n\n/**\n * 将数据分组成 map\n * @param data\n * @param condition\n */\nfunction groupToMap(data, condition) {\n if (!condition) {\n return {\n 0: data,\n };\n }\n if (!is_function(condition)) {\n // 如果是字符串,则按照 a*b 风格成数组\n var paramscondition_1 = is_array(condition) ? condition : condition.replace(/\\s+/g, \'\').split(\'*\');\n condition = function (row) {\n var unique = \'_\'; // 避免出现数字作为Key的情况,会进行按照数字的排序\n // 根据字段列表的值,拼接成 key\n for (var i = 0, l = paramscondition_1.length; i < l; i++) {\n unique += row[paramscondition_1[i]] && row[paramscondition_1[i]].toString();\n }\n return unique;\n };\n }\n return group_by(data, condition);\n}\n//# sourceMappingURL=group-to-map.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/group.js\n\n/* harmony default export */ var group = (function (data, condition) {\n if (!condition) {\n // 没有条件,则自身改成数组\n return [data];\n }\n var groups = groupToMap(data, condition);\n var array = [];\n for (var i in groups) {\n array.push(groups[i]);\n }\n return array;\n});\n//# sourceMappingURL=group.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/get-wrap-behavior.js\n/**\n * 获取封装的事件\n * @protected\n * @param {Object} obj 对象\n * @param {String} action 事件名称\n * @return {Function} 返回事件处理函数\n */\nfunction getWrapBehavior(obj, action) {\n return obj[\'_wrap_\' + action];\n}\n/* harmony default export */ var get_wrap_behavior = (getWrapBehavior);\n//# sourceMappingURL=get-wrap-behavior.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/wrap-behavior.js\n/**\n * 封装事件,便于使用上下文this,和便于解除事件时使用\n * @protected\n * @param {Object} obj 对象\n * @param {String} action 事件名称\n * @return {Function} 返回事件处理函数\n */\nfunction wrapBehavior(obj, action) {\n if (obj[\'_wrap_\' + action]) {\n return obj[\'_wrap_\' + action];\n }\n var method = function (e) {\n obj[action](e);\n };\n obj[\'_wrap_\' + action] = method;\n return method;\n}\n/* harmony default export */ var wrap_behavior = (wrapBehavior);\n//# sourceMappingURL=wrap-behavior.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/number2color.js\nvar numColorCache = {};\nfunction numberToColor(num) {\n // 增加缓存\n var color = numColorCache[num];\n if (!color) {\n var str = num.toString(16);\n for (var i = str.length; i < 6; i++) {\n str = \'0\' + str;\n }\n color = \'#\' + str;\n numColorCache[num] = color;\n }\n return color;\n}\n/* harmony default export */ var number2color = (numberToColor);\n//# sourceMappingURL=number2color.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/parse-radius.js\n\nfunction parseRadius(radius) {\n var r1 = 0, r2 = 0, r3 = 0, r4 = 0;\n if (is_array(radius)) {\n if (radius.length === 1) {\n r1 = r2 = r3 = r4 = radius[0];\n }\n else if (radius.length === 2) {\n r1 = r3 = radius[0];\n r2 = r4 = radius[1];\n }\n else if (radius.length === 3) {\n r1 = radius[0];\n r2 = r4 = radius[1];\n r3 = radius[2];\n }\n else {\n r1 = radius[0];\n r2 = radius[1];\n r3 = radius[2];\n r4 = radius[3];\n }\n }\n else {\n r1 = r2 = r3 = r4 = radius;\n }\n return {\n r1: r1,\n r2: r2,\n r3: r3,\n r4: r4\n };\n}\n/* harmony default export */ var parse_radius = (parseRadius);\n//# sourceMappingURL=parse-radius.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/clamp.js\nvar clamp = function (a, min, max) {\n if (a < min) {\n return min;\n }\n else if (a > max) {\n return max;\n }\n return a;\n};\n/* harmony default export */ var esm_clamp = (clamp);\n//# sourceMappingURL=clamp.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/fixed-base.js\nvar fixedBase = function (v, base) {\n var str = base.toString();\n var index = str.indexOf(\'.\');\n if (index === -1) {\n return Math.round(v);\n }\n var length = str.substr(index + 1).length;\n if (length > 20) {\n length = 20;\n }\n return parseFloat(v.toFixed(length));\n};\n/* harmony default export */ var fixed_base = (fixedBase);\n//# sourceMappingURL=fixed-base.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/is-number.js\n/**\n * 判断是否数字\n * @return {Boolean} 是否数字\n */\n\nvar isNumber = function (value) {\n return is_type(value, \'Number\');\n};\n/* harmony default export */ var is_number = (isNumber);\n//# sourceMappingURL=is-number.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/is-decimal.js\n\nvar isDecimal = function (num) {\n return is_number(num) && num % 1 !== 0;\n};\n/* harmony default export */ var is_decimal = (isDecimal);\n//# sourceMappingURL=is-decimal.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/is-even.js\n\nvar isEven = function (num) {\n return is_number(num) && num % 2 === 0;\n};\n/* harmony default export */ var is_even = (isEven);\n//# sourceMappingURL=is-even.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/is-integer.js\n\nvar isInteger = Number.isInteger ? Number.isInteger : function (num) {\n return is_number(num) && num % 1 === 0;\n};\n/* harmony default export */ var is_integer = (isInteger);\n//# sourceMappingURL=is-integer.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/is-negative.js\n\nvar isNegative = function (num) {\n return is_number(num) && num < 0;\n};\n/* harmony default export */ var is_negative = (isNegative);\n//# sourceMappingURL=is-negative.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/is-number-equal.js\nvar PRECISION = 0.00001; // numbers less than this is considered as 0\nfunction isNumberEqual(a, b, precision) {\n if (precision === void 0) { precision = PRECISION; }\n return Math.abs((a - b)) < precision;\n}\n;\n//# sourceMappingURL=is-number-equal.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/is-odd.js\n\nvar isOdd = function (num) {\n return is_number(num) && num % 2 !== 0;\n};\n/* harmony default export */ var is_odd = (isOdd);\n//# sourceMappingURL=is-odd.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/is-positive.js\n\nvar isPositive = function (num) {\n return is_number(num) && num > 0;\n};\n/* harmony default export */ var is_positive = (isPositive);\n//# sourceMappingURL=is-positive.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/max-by.js\n\n\n/**\n * @param {Array} arr The array to iterate over.\n * @param {Function} [fn] The iteratee invoked per element.\n * @return {*} Returns the maximum value.\n * @example\n *\n * var objects = [{ \'n\': 1 }, { \'n\': 2 }];\n *\n * maxBy(objects, function(o) { return o.n; });\n * // => { \'n\': 2 }\n *\n * maxBy(objects, \'n\');\n * // => { \'n\': 2 }\n */\n/* harmony default export */ var max_by = (function (arr, fn) {\n if (!is_array(arr)) {\n return undefined;\n }\n var maxItem;\n var max = -Infinity;\n for (var i = 0; i < arr.length; i++) {\n var item = arr[i];\n var v = is_function(fn) ? fn(item) : item[fn];\n if (v > max) {\n maxItem = item;\n max = v;\n }\n }\n return maxItem;\n});\n//# sourceMappingURL=max-by.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/min-by.js\n\n\n/**\n * @param {Array} arr The array to iterate over.\n * @param {Function} [fn] The iteratee invoked per element.\n * @return {*} Returns the minimum value.\n * @example\n *\n * var objects = [{ \'n\': 1 }, { \'n\': 2 }];\n *\n * minBy(objects, function(o) { return o.n; });\n * // => { \'n\': 1 }\n *\n * minBy(objects, \'n\');\n * // => { \'n\': 1 }\n */\n/* harmony default export */ var min_by = (function (arr, fn) {\n if (!is_array(arr)) {\n return undefined;\n }\n var minItem;\n var min = Infinity;\n for (var i = 0; i < arr.length; i++) {\n var item = arr[i];\n var v = is_function(fn) ? fn(item) : item[fn];\n if (v < min) {\n minItem = item;\n min = v;\n }\n }\n return minItem;\n});\n//# sourceMappingURL=min-by.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/mod.js\nvar mod = function (n, m) {\n return ((n % m) + m) % m;\n};\n/* harmony default export */ var esm_mod = (mod);\n//# sourceMappingURL=mod.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/to-degree.js\nvar DEGREE = 180 / Math.PI;\nvar toDegree = function (radian) {\n return DEGREE * radian;\n};\n/* harmony default export */ var to_degree = (toDegree);\n//# sourceMappingURL=to-degree.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/to-integer.js\n/* harmony default export */ var to_integer = (parseInt);\n//# sourceMappingURL=to-integer.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/to-radian.js\nvar RADIAN = Math.PI / 180;\nvar toRadian = function (degree) {\n return RADIAN * degree;\n};\n/* harmony default export */ var to_radian = (toRadian);\n//# sourceMappingURL=to-radian.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/for-in.js\n\n/* harmony default export */ var for_in = (esm_each);\n//# sourceMappingURL=for-in.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/has.js\n/* harmony default export */ var has = (function (obj, key) { return obj.hasOwnProperty(key); });\n//# sourceMappingURL=has.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/has-key.js\n\n/* harmony default export */ var has_key = (has);\n//# sourceMappingURL=has-key.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/values.js\n\n\n// @ts-ignore\nvar values_values = Object.values ? function (obj) { return Object.values(obj); } : function (obj) {\n var result = [];\n esm_each(obj, function (value, key) {\n if (!(is_function(obj) && key === \'prototype\')) {\n result.push(value);\n }\n });\n return result;\n};\n/* harmony default export */ var esm_values = (values_values);\n//# sourceMappingURL=values.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/has-value.js\n\n\n/* harmony default export */ var has_value = (function (obj, value) { return esm_contains(esm_values(obj), value); });\n//# sourceMappingURL=has-value.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/to-string.js\n\n/* harmony default export */ var to_string = (function (value) {\n if (is_nil(value))\n return \'\';\n return value.toString();\n});\n//# sourceMappingURL=to-string.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/lower-case.js\n\nvar lowerCase = function (str) {\n return to_string(str).toLowerCase();\n};\n/* harmony default export */ var lower_case = (lowerCase);\n//# sourceMappingURL=lower-case.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/lower-first.js\n\nvar lowerFirst = function (value) {\n var str = to_string(value);\n return str.charAt(0).toLowerCase() + str.substring(1);\n};\n/* harmony default export */ var lower_first = (lowerFirst);\n//# sourceMappingURL=lower-first.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/substitute.js\nfunction substitute(str, o) {\n if (!str || !o) {\n return str;\n }\n return str.replace(/\\\\?\\{([^{}]+)\\}/g, function (match, name) {\n if (match.charAt(0) === \'\\\\\') {\n return match.slice(1);\n }\n return (o[name] === undefined) ? \'\' : o[name];\n });\n}\n/* harmony default export */ var esm_substitute = (substitute);\n//# sourceMappingURL=substitute.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/upper-case.js\n\nvar upperCase = function (str) {\n return to_string(str).toUpperCase();\n};\n/* harmony default export */ var upper_case = (upperCase);\n//# sourceMappingURL=upper-case.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/upper-first.js\n\nvar upperFirst = function (value) {\n var str = to_string(value);\n return str.charAt(0).toUpperCase() + str.substring(1);\n};\n/* harmony default export */ var upper_first = (upperFirst);\n//# sourceMappingURL=upper-first.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/get-type.js\nvar get_type_toString = {}.toString;\nvar getType = function (value) {\n return get_type_toString.call(value).replace(/^\\[object /, \'\').replace(/]$/, \'\');\n};\n/* harmony default export */ var get_type = (getType);\n//# sourceMappingURL=get-type.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/is-arguments.js\n/**\n * 是否是参数类型\n *\n * @param {Object} value 测试的值\n * @return {Boolean}\n */\n\nvar isArguments = function (value) {\n return is_type(value, \'Arguments\');\n};\n/* harmony default export */ var is_arguments = (isArguments);\n//# sourceMappingURL=is-arguments.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/is-boolean.js\n/**\n * 是否是布尔类型\n *\n * @param {Object} value 测试的值\n * @return {Boolean}\n */\n\nvar isBoolean = function (value) {\n return is_type(value, \'Boolean\');\n};\n/* harmony default export */ var is_boolean = (isBoolean);\n//# sourceMappingURL=is-boolean.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/is-date.js\n\nvar isDate = function (value) {\n return is_type(value, \'Date\');\n};\n/* harmony default export */ var is_date = (isDate);\n//# sourceMappingURL=is-date.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/is-error.js\n/**\n * 是否是参数类型\n *\n * @param {Object} value 测试的值\n * @return {Boolean}\n */\n\nvar isError = function (value) {\n return is_type(value, \'Error\');\n};\n/* harmony default export */ var is_error = (isError);\n//# sourceMappingURL=is-error.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/is-finite.js\n/**\n * 判断是否为有限数\n * @return {Boolean}\n */\n\n/* harmony default export */ var is_finite = (function (value) {\n return is_number(value) && isFinite(value);\n});\n//# sourceMappingURL=is-finite.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/is-null.js\nvar isNull = function (value) {\n return value === null;\n};\n/* harmony default export */ var is_null = (isNull);\n//# sourceMappingURL=is-null.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/is-prototype.js\nvar objectProto = Object.prototype;\nvar isPrototype = function (value) {\n var Ctor = value && value.constructor;\n var proto = (typeof Ctor === \'function\' && Ctor.prototype) || objectProto;\n return value === proto;\n};\n/* harmony default export */ var is_prototype = (isPrototype);\n//# sourceMappingURL=is-prototype.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/is-reg-exp.js\n\nvar isRegExp = function (str) {\n return is_type(str, \'RegExp\');\n};\n/* harmony default export */ var is_reg_exp = (isRegExp);\n//# sourceMappingURL=is-reg-exp.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/is-undefined.js\nvar isUndefined = function (value) {\n return value === undefined;\n};\n/* harmony default export */ var is_undefined = (isUndefined);\n//# sourceMappingURL=is-undefined.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/is-element.js\n/**\n * 判断是否HTML元素\n * @return {Boolean} 是否HTML元素\n */\nvar isElement = function (o) {\n return o instanceof Element || o instanceof HTMLDocument;\n};\n/* harmony default export */ var is_element = (isElement);\n//# sourceMappingURL=is-element.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/request-animation-frame.js\nfunction requestAnimationFrame(fn) {\n var method = window.requestAnimationFrame ||\n window.webkitRequestAnimationFrame ||\n // @ts-ignore\n window.mozRequestAnimationFrame ||\n // @ts-ignore\n window.msRequestAnimationFrame ||\n function (f) {\n return setTimeout(f, 16);\n };\n return method(fn);\n}\n;\n//# sourceMappingURL=request-animation-frame.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/clear-animation-frame.js\nfunction cancelAnimationFrame(handler) {\n var method = window.cancelAnimationFrame ||\n window.webkitCancelAnimationFrame ||\n // @ts-ignore\n window.mozCancelAnimationFrame ||\n // @ts-ignore\n window.msCancelAnimationFrame ||\n clearTimeout;\n method(handler);\n}\n;\n//# sourceMappingURL=clear-animation-frame.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/mix.js\n// FIXME: Mutable param should be forbidden in static lang.\nfunction _mix(dist, obj) {\n for (var key in obj) {\n if (obj.hasOwnProperty(key) && key !== \'constructor\' && obj[key] !== undefined) {\n dist[key] = obj[key];\n }\n }\n}\nfunction mix(dist, src1, src2, src3) {\n if (src1)\n _mix(dist, src1);\n if (src2)\n _mix(dist, src2);\n if (src3)\n _mix(dist, src3);\n return dist;\n}\n//# sourceMappingURL=mix.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/augment.js\n\n\nvar augment = function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n var c = args[0];\n for (var i = 1; i < args.length; i++) {\n var obj = args[i];\n if (is_function(obj)) {\n obj = obj.prototype;\n }\n mix(c.prototype, obj);\n }\n};\n/* harmony default export */ var esm_augment = (augment);\n//# sourceMappingURL=augment.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/clone.js\n\nvar clone = function (obj) {\n if (typeof obj !== \'object\' || obj === null) {\n return obj;\n }\n var rst;\n if (is_array(obj)) {\n rst = [];\n for (var i = 0, l = obj.length; i < l; i++) {\n if (typeof obj[i] === \'object\' && obj[i] != null) {\n rst[i] = clone(obj[i]);\n }\n else {\n rst[i] = obj[i];\n }\n }\n }\n else {\n rst = {};\n for (var k in obj) {\n if (typeof obj[k] === \'object\' && obj[k] != null) {\n rst[k] = clone(obj[k]);\n }\n else {\n rst[k] = obj[k];\n }\n }\n }\n return rst;\n};\n/* harmony default export */ var esm_clone = (clone);\n//# sourceMappingURL=clone.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/debounce.js\nfunction debounce(func, wait, immediate) {\n var timeout;\n return function () {\n var context = this, args = arguments;\n var later = function () {\n timeout = null;\n if (!immediate) {\n func.apply(context, args);\n }\n };\n var callNow = immediate && !timeout;\n clearTimeout(timeout);\n timeout = setTimeout(later, wait);\n if (callNow) {\n func.apply(context, args);\n }\n };\n}\n/* harmony default export */ var esm_debounce = (debounce);\n//# sourceMappingURL=debounce.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/memoize.js\n\n/**\n * _.memoize(calColor);\n * _.memoize(calColor, (...args) => args[0]);\n * @param f\n * @param resolver\n */\n/* harmony default export */ var memoize = (function (f, resolver) {\n if (!is_function(f)) {\n throw new TypeError(\'Expected a function\');\n }\n var memoized = function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n // 使用方法构造 key,如果不存在 resolver,则直接取第一个参数作为 key\n var key = resolver ? resolver.apply(this, args) : args[0];\n var cache = memoized.cache;\n if (cache.has(key)) {\n return cache.get(key);\n }\n var result = f.apply(this, args);\n // 缓存起来\n cache.set(key, result);\n return result;\n };\n memoized.cache = new Map();\n return memoized;\n});\n//# sourceMappingURL=memoize.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/deep-mix.js\n\n\nvar MAX_MIX_LEVEL = 5;\nfunction _deepMix(dist, src, level, maxLevel) {\n level = level || 0;\n maxLevel = maxLevel || MAX_MIX_LEVEL;\n for (var key in src) {\n if (src.hasOwnProperty(key)) {\n var value = src[key];\n if (value !== null && is_plain_object(value)) {\n if (!is_plain_object(dist[key])) {\n dist[key] = {};\n }\n if (level < maxLevel) {\n _deepMix(dist[key], value, level + 1, maxLevel);\n }\n else {\n dist[key] = src[key];\n }\n }\n else if (is_array(value)) {\n dist[key] = [];\n dist[key] = dist[key].concat(value);\n }\n else if (value !== undefined) {\n dist[key] = value;\n }\n }\n }\n}\n// todo 重写\nvar deepMix = function (rst) {\n var args = [];\n for (var _i = 1; _i < arguments.length; _i++) {\n args[_i - 1] = arguments[_i];\n }\n for (var i = 0; i < args.length; i += 1) {\n _deepMix(rst, args[i]);\n }\n return rst;\n};\n/* harmony default export */ var deep_mix = (deepMix);\n//# sourceMappingURL=deep-mix.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/extend.js\n\n\nvar extend = function (subclass, superclass, overrides, staticOverrides) {\n // 如果只提供父类构造函数,则自动生成子类构造函数\n if (!is_function(superclass)) {\n overrides = superclass;\n superclass = subclass;\n subclass = function () { };\n }\n var create = Object.create ?\n function (proto, c) {\n return Object.create(proto, {\n constructor: {\n value: c\n }\n });\n } :\n function (proto, c) {\n function Tmp() { }\n Tmp.prototype = proto;\n var o = new Tmp();\n o.constructor = c;\n return o;\n };\n var superObj = create(superclass.prototype, subclass); // new superclass(),//实例化父类作为子类的prototype\n subclass.prototype = mix(superObj, subclass.prototype); // 指定子类的prototype\n subclass.superclass = create(superclass.prototype, superclass);\n mix(superObj, overrides);\n mix(subclass, staticOverrides);\n return subclass;\n};\n/* harmony default export */ var esm_extend = (extend);\n//# sourceMappingURL=extend.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/index-of.js\n\nvar index_of_indexOf = function (arr, obj) {\n if (!is_array_like(arr)) {\n return -1;\n }\n var m = Array.prototype.indexOf;\n if (m) {\n return m.call(arr, obj);\n }\n var index = -1;\n for (var i = 0; i < arr.length; i++) {\n if (arr[i] === obj) {\n index = i;\n break;\n }\n }\n return index;\n};\n/* harmony default export */ var index_of = (index_of_indexOf);\n//# sourceMappingURL=index-of.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/is-empty.js\n\n\n\n\nvar is_empty_hasOwnProperty = Object.prototype.hasOwnProperty;\nfunction isEmpty(value) {\n /**\n * isEmpty(null) => true\n * isEmpty() => true\n * isEmpty(true) => true\n * isEmpty(1) => true\n * isEmpty([1, 2, 3]) => false\n * isEmpty(\'abc\') => false\n * isEmpty({ a: 1 }) => false\n */\n if (is_nil(value)) {\n return true;\n }\n if (is_array_like(value)) {\n return !value.length;\n }\n var type = get_type(value);\n if (type === \'Map\' || type === \'Set\') {\n return !value.size;\n }\n if (is_prototype(value)) {\n return !Object.keys(value).length;\n }\n for (var key in value) {\n if (is_empty_hasOwnProperty.call(value, key)) {\n return false;\n }\n }\n return true;\n}\n/* harmony default export */ var is_empty = (isEmpty);\n//# sourceMappingURL=is-empty.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/is-equal.js\n\n\n\nvar isEqual = function (value, other) {\n if (value === other) {\n return true;\n }\n if (!value || !other) {\n return false;\n }\n if (is_string(value) || is_string(other)) {\n return false;\n }\n if (is_array_like(value) || is_array_like(other)) {\n if (value.length !== other.length) {\n return false;\n }\n var rst = true;\n for (var i = 0; i < value.length; i++) {\n rst = isEqual(value[i], other[i]);\n if (!rst) {\n break;\n }\n }\n return rst;\n }\n if (is_object_like(value) || is_object_like(other)) {\n var valueKeys = Object.keys(value);\n var otherKeys = Object.keys(other);\n if (valueKeys.length !== otherKeys.length) {\n return false;\n }\n var rst = true;\n for (var i = 0; i < valueKeys.length; i++) {\n rst = isEqual(value[valueKeys[i]], other[valueKeys[i]]);\n if (!rst) {\n break;\n }\n }\n return rst;\n }\n return false;\n};\n/* harmony default export */ var is_equal = (isEqual);\n//# sourceMappingURL=is-equal.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/is-equal-with.js\n\n\n/**\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {Function} [fn] The function to customize comparisons.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * function isGreeting(value) {\n * return /^h(?:i|ello)$/.test(value);\n * }\n *\n * function customizer(objValue, othValue) {\n * if (isGreeting(objValue) && isGreeting(othValue)) {\n * return true;\n * }\n * }\n *\n * var array = [\'hello\', \'goodbye\'];\n * var other = [\'hi\', \'goodbye\'];\n *\n * isEqualWith(array, other, customizer); // => true\n */\n/* harmony default export */ var is_equal_with = (function (value, other, fn) {\n if (!is_function(fn)) {\n return is_equal(value, other);\n }\n return !!fn(value, other);\n});\n//# sourceMappingURL=is-equal-with.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/map.js\n\nvar map = function (arr, func) {\n if (!is_array_like(arr)) {\n // @ts-ignore\n return arr;\n }\n var result = [];\n for (var index = 0; index < arr.length; index++) {\n var value = arr[index];\n result.push(func(value, index));\n }\n return result;\n};\n/* harmony default export */ var esm_map = (map);\n//# sourceMappingURL=map.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/map-values.js\n\n\nvar identity = function (v) { return v; };\n/* harmony default export */ var map_values = (function (object, func) {\n if (func === void 0) { func = identity; }\n var r = {};\n if (is_object(object) && !is_nil(object)) {\n Object.keys(object).forEach(function (key) {\n // @ts-ignore\n r[key] = func(object[key], key);\n });\n }\n return r;\n});\n//# sourceMappingURL=map-values.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/get.js\n\n/**\n * https://github.com/developit/dlv/blob/master/index.js\n * @param obj\n * @param key\n * @param defaultValue\n */\n/* harmony default export */ var get = (function (obj, key, defaultValue) {\n var p = 0;\n var keyArr = is_string(key) ? key.split(\'.\') : key;\n while (obj && p < keyArr.length) {\n obj = obj[keyArr[p++]];\n }\n return (obj === undefined || p < keyArr.length) ? defaultValue : obj;\n});\n//# sourceMappingURL=get.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/set.js\n\n\n\n/**\n * https://github.com/developit/dlv/blob/master/index.js\n * @param obj\n * @param path\n * @param value\n */\n/* harmony default export */ var set = (function (obj, path, value) {\n var o = obj;\n var keyArr = is_string(path) ? path.split(\'.\') : path;\n keyArr.forEach(function (key, idx) {\n // 不是最后一个\n if (idx < keyArr.length - 1) {\n if (!is_object(o[key])) {\n o[key] = is_number(keyArr[idx + 1]) ? [] : {};\n }\n o = o[key];\n }\n else {\n o[key] = value;\n }\n });\n return obj;\n});\n//# sourceMappingURL=set.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/pick.js\n\n\nvar pick_hasOwnProperty = Object.prototype.hasOwnProperty;\n/* harmony default export */ var pick = (function (object, keys) {\n if (object === null || !is_plain_object(object)) {\n return {};\n }\n var result = {};\n esm_each(keys, function (key) {\n if (pick_hasOwnProperty.call(object, key)) {\n result[key] = object[key];\n }\n });\n return result;\n});\n//# sourceMappingURL=pick.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/omit.js\n\n/* harmony default export */ var omit = (function (obj, keys) {\n return esm_reduce(obj, function (r, curr, key) {\n if (!keys.includes(key)) {\n r[key] = curr;\n }\n return r;\n }, {});\n});\n//# sourceMappingURL=omit.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/throttle.js\n/* harmony default export */ var throttle = (function (func, wait, options) {\n var timeout, context, args, result;\n var previous = 0;\n if (!options)\n options = {};\n var later = function () {\n previous = options.leading === false ? 0 : Date.now();\n timeout = null;\n result = func.apply(context, args);\n if (!timeout)\n context = args = null;\n };\n var throttled = function () {\n var now = Date.now();\n if (!previous && options.leading === false)\n previous = now;\n var remaining = wait - (now - previous);\n context = this;\n args = arguments;\n if (remaining <= 0 || remaining > wait) {\n if (timeout) {\n clearTimeout(timeout);\n timeout = null;\n }\n previous = now;\n result = func.apply(context, args);\n if (!timeout)\n context = args = null;\n }\n else if (!timeout && options.trailing !== false) {\n timeout = setTimeout(later, remaining);\n }\n return result;\n };\n throttled.cancel = function () {\n clearTimeout(timeout);\n previous = 0;\n timeout = context = args = null;\n };\n return throttled;\n});\n//# sourceMappingURL=throttle.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/to-array.js\n\n/* harmony default export */ var to_array = (function (value) {\n return is_array_like(value) ? Array.prototype.slice.call(value) : [];\n});\n//# sourceMappingURL=to-array.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/unique-id.js\nvar unique_id_map = {};\n/* harmony default export */ var unique_id = (function (prefix) {\n prefix = prefix || \'g\';\n if (!unique_id_map[prefix]) {\n unique_id_map[prefix] = 1;\n }\n else {\n unique_id_map[prefix] += 1;\n }\n return prefix + unique_id_map[prefix];\n});\n//# sourceMappingURL=unique-id.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/noop.js\n/* harmony default export */ var noop = (function () { });\n//# sourceMappingURL=noop.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/identity.js\n/* harmony default export */ var esm_identity = (function (v) { return v; });\n//# sourceMappingURL=identity.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/size.js\n\n\nfunction size(o) {\n if (is_nil(o)) {\n return 0;\n }\n if (is_array_like(o)) {\n return o.length;\n }\n return Object.keys(o).length;\n}\n//# sourceMappingURL=size.js.map\n// EXTERNAL MODULE: ./node_modules/tslib/tslib.es6.js\nvar tslib_es6 = __webpack_require__(1);\n\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/measure-text-width.js\n\n\n\n\nvar ctx;\n/**\n * 计算文本的宽度\n */\n/* harmony default export */ var measure_text_width = (memoize(function (text, font) {\n if (font === void 0) { font = {}; }\n var fontSize = font.fontSize, fontFamily = font.fontFamily, fontWeight = font.fontWeight, fontStyle = font.fontStyle, fontVariant = font.fontVariant;\n if (!ctx) {\n ctx = document.createElement(\'canvas\').getContext(\'2d\');\n }\n ctx.font = [fontStyle, fontVariant, fontWeight, fontSize + "px", fontFamily].join(\' \');\n return ctx.measureText(is_string(text) ? text : \'\').width;\n}, function (text, font) {\n if (font === void 0) { font = {}; }\n return Object(tslib_es6["__spreadArrays"])([text], esm_values(font)).join(\'\');\n}));\n//# sourceMappingURL=measure-text-width.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/get-ellipsis-text.js\n\n\n\n/**\n * 获取文本的 ... 文本。\n * 算法(减少每次 measureText 的长度,measureText 的性能跟字符串时间相关):\n * 1. 先通过 STEP 逐步计算,找到最后一个小于 maxWidth 的字符串\n * 2. 然后对最后这个字符串二分计算\n * @param text 需要计算的文本, 由于历史原因 除了支持string,还支持空值,number和数组等\n * @param maxWidth 最大宽度\n * @param font 字体\n * @param str 要替换的文本\n */\n/* harmony default export */ var get_ellipsis_text = (function (text, maxWidth, font, str) {\n if (str === void 0) { str = \'...\'; }\n var STEP = 16; // 每次 16,调参工程师\n var PLACEHOLDER_WIDTH = measure_text_width(str, font);\n var leftText = !is_string(text) ? to_string(text) : text;\n var leftWidth = maxWidth;\n var r = []; // 最终的分段字符串\n var currentText;\n var currentWidth;\n if (measure_text_width(text, font) <= maxWidth) {\n return text;\n }\n // 首先通过 step 计算,找出最大的未超出长度的\n // eslint-disable-next-line no-constant-condition\n while (true) {\n // 更新字符串\n currentText = leftText.substr(0, STEP);\n // 计算宽度\n currentWidth = measure_text_width(currentText, font);\n // 超出剩余宽度,则停止\n if (currentWidth + PLACEHOLDER_WIDTH > leftWidth) {\n if (currentWidth > leftWidth) {\n break;\n }\n }\n r.push(currentText);\n // 没有超出,则计算剩余宽度\n leftWidth -= currentWidth;\n leftText = leftText.substr(STEP);\n // 字符串整体没有超出\n if (!leftText) {\n return r.join(\'\');\n }\n }\n // 最下的最后一个 STEP,使用 1 递增(用二分效果更高)\n // eslint-disable-next-line no-constant-condition\n while (true) {\n // 更新字符串\n currentText = leftText.substr(0, 1);\n // 计算宽度\n currentWidth = measure_text_width(currentText, font);\n // 超出剩余宽度,则停止\n if (currentWidth + PLACEHOLDER_WIDTH > leftWidth) {\n break;\n }\n r.push(currentText);\n // 没有超出,则计算剩余宽度\n leftWidth -= currentWidth;\n leftText = leftText.substr(1);\n if (!leftText) {\n return r.join(\'\');\n }\n }\n return "" + r.join(\'\') + str;\n});\n//# sourceMappingURL=get-ellipsis-text.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/cache.js\n/**\n * k-v 存储\n */\nvar default_1 = /** @class */ (function () {\n function default_1() {\n this.map = {};\n }\n default_1.prototype.has = function (key) {\n return this.map[key] !== undefined;\n };\n default_1.prototype.get = function (key, def) {\n var v = this.map[key];\n return v === undefined ? def : v;\n };\n default_1.prototype.set = function (key, value) {\n this.map[key] = value;\n };\n default_1.prototype.clear = function () {\n this.map = {};\n };\n default_1.prototype.delete = function (key) {\n delete this.map[key];\n };\n default_1.prototype.size = function () {\n return Object.keys(this.map).length;\n };\n return default_1;\n}());\n/* harmony default export */ var cache = (default_1);\n//# sourceMappingURL=cache.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/util/esm/index.js\n// array\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n// event\n\n\n// format\n\n\n// math\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n// object\n\n\n\n\n\n\n\n// string\n\n\n\n\n\n// type\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n// other\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n// text\n\n\n// 不知道为什么,需要把这个 export,不然 ts 会报类型错误\n\n//# sourceMappingURL=index.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvdXRpbC9lc20vaXMtYXJyYXktbGlrZS5qcz9lN2NkIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di91dGlsL2VzbS9jb250YWlucy5qcz84YmM4Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di91dGlsL2VzbS9maWx0ZXIuanM/N2ZlMSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvdXRpbC9lc20vZGlmZmVyZW5jZS5qcz8zYTQwIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di91dGlsL2VzbS9pcy10eXBlLmpzPzYwNDciLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L3V0aWwvZXNtL2lzLWZ1bmN0aW9uLmpzPzEwODYiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L3V0aWwvZXNtL2lzLW5pbC5qcz8xMmE2Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di91dGlsL2VzbS9pcy1hcnJheS5qcz8yN2EwIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di91dGlsL2VzbS9pcy1vYmplY3QuanM/ZDdhNSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvdXRpbC9lc20vZWFjaC5qcz9iNDE3Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di91dGlsL2VzbS9rZXlzLmpzP2U4N2EiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L3V0aWwvZXNtL2lzLW1hdGNoLmpzP2NjNTUiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L3V0aWwvZXNtL2lzLW9iamVjdC1saWtlLmpzP2Y4MGQiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L3V0aWwvZXNtL2lzLXBsYWluLW9iamVjdC5qcz82MTEzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di91dGlsL2VzbS9maW5kLmpzP2ZmZDYiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L3V0aWwvZXNtL2ZpbmQtaW5kZXguanM/YzQ5ZiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvdXRpbC9lc20vZmlyc3QtdmFsdWUuanM/NjExYyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvdXRpbC9lc20vZmxhdHRlbi5qcz9hZGI3Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di91dGlsL2VzbS9mbGF0dGVuLWRlZXAuanM/MzM4MSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvdXRpbC9lc20vbWF4LmpzPzgyMDkiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L3V0aWwvZXNtL21pbi5qcz81YzExIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di91dGlsL2VzbS9nZXQtcmFuZ2UuanM/YjVkOCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvdXRpbC9lc20vcHVsbC5qcz84ZDJkIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di91dGlsL2VzbS9wdWxsLWF0LmpzPzY1N2EiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L3V0aWwvZXNtL3JlZHVjZS5qcz85Mzk2Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di91dGlsL2VzbS9yZW1vdmUuanM/MzFjZSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvdXRpbC9lc20vaXMtc3RyaW5nLmpzPzE3M2MiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L3V0aWwvZXNtL3NvcnQtYnkuanM/MDc0NiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvdXRpbC9lc20vdW5pcS5qcz8zODdiIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di91dGlsL2VzbS91bmlvbi5qcz9kODJlIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di91dGlsL2VzbS92YWx1ZXMtb2Yta2V5LmpzPzQ1NjkiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L3V0aWwvZXNtL2hlYWQuanM/ZTUxYyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvdXRpbC9lc20vbGFzdC5qcz9hNWZkIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di91dGlsL2VzbS9zdGFydHMtd2l0aC5qcz85NGZjIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di91dGlsL2VzbS9lbmRzLXdpdGguanM/Yjg1NiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvdXRpbC9lc20vZXZlcnkuanM/NDE0YiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvdXRpbC9lc20vc29tZS5qcz83YjMwIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di91dGlsL2VzbS9ncm91cC1ieS5qcz84NjZlIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di91dGlsL2VzbS9ncm91cC10by1tYXAuanM/YmRlNiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvdXRpbC9lc20vZ3JvdXAuanM/NjQyMSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvdXRpbC9lc20vZ2V0LXdyYXAtYmVoYXZpb3IuanM/NzA4MSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvdXRpbC9lc20vd3JhcC1iZWhhdmlvci5qcz8wYTQxIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di91dGlsL2VzbS9udW1iZXIyY29sb3IuanM/NjkzZSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvdXRpbC9lc20vcGFyc2UtcmFkaXVzLmpzPzNkNTAiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L3V0aWwvZXNtL2NsYW1wLmpzPzk4NTMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L3V0aWwvZXNtL2ZpeGVkLWJhc2UuanM/MWIzZiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvdXRpbC9lc20vaXMtbnVtYmVyLmpzPzcwNTgiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L3V0aWwvZXNtL2lzLWRlY2ltYWwuanM/MTEwZSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvdXRpbC9lc20vaXMtZXZlbi5qcz8xNjliIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di91dGlsL2VzbS9pcy1pbnRlZ2VyLmpzP2RhZTQiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L3V0aWwvZXNtL2lzLW5lZ2F0aXZlLmpzPzJhODAiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L3V0aWwvZXNtL2lzLW51bWJlci1lcXVhbC5qcz83ZTQ4Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di91dGlsL2VzbS9pcy1vZGQuanM/MzEyZSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvdXRpbC9lc20vaXMtcG9zaXRpdmUuanM/MjJlZiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvdXRpbC9lc20vbWF4LWJ5LmpzPzI1YzIiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L3V0aWwvZXNtL21pbi1ieS5qcz8xNjk0Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di91dGlsL2VzbS9tb2QuanM/MDkzMiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvdXRpbC9lc20vdG8tZGVncmVlLmpzPzk5NTgiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L3V0aWwvZXNtL3RvLWludGVnZXIuanM/NDMwYSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvdXRpbC9lc20vdG8tcmFkaWFuLmpzP2UxNzciLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L3V0aWwvZXNtL2Zvci1pbi5qcz83OGU3Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di91dGlsL2VzbS9oYXMuanM/NDY5NSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvdXRpbC9lc20vaGFzLWtleS5qcz9lMTZkIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di91dGlsL2VzbS92YWx1ZXMuanM/NmQ5MiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvdXRpbC9lc20vaGFzLXZhbHVlLmpzPzJhYWUiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L3V0aWwvZXNtL3RvLXN0cmluZy5qcz8xYjczIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di91dGlsL2VzbS9sb3dlci1jYXNlLmpzP2Q3YjciLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L3V0aWwvZXNtL2xvd2VyLWZpcnN0LmpzP2M2MDgiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L3V0aWwvZXNtL3N1YnN0aXR1dGUuanM/MDI5ZiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvdXRpbC9lc20vdXBwZXItY2FzZS5qcz9mNjE2Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di91dGlsL2VzbS91cHBlci1maXJzdC5qcz9kNjRiIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di91dGlsL2VzbS9nZXQtdHlwZS5qcz9hMmVmIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di91dGlsL2VzbS9pcy1hcmd1bWVudHMuanM/MjA1OCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvdXRpbC9lc20vaXMtYm9vbGVhbi5qcz9mMjliIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di91dGlsL2VzbS9pcy1kYXRlLmpzP2RjYzMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L3V0aWwvZXNtL2lzLWVycm9yLmpzPzExODYiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L3V0aWwvZXNtL2lzLWZpbml0ZS5qcz84MmE4Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di91dGlsL2VzbS9pcy1udWxsLmpzP2RkYzEiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L3V0aWwvZXNtL2lzLXByb3RvdHlwZS5qcz9jNzAyIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di91dGlsL2VzbS9pcy1yZWctZXhwLmpzPzJmNjAiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L3V0aWwvZXNtL2lzLXVuZGVmaW5lZC5qcz9jYTNlIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di91dGlsL2VzbS9pcy1lbGVtZW50LmpzP2IwZWIiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L3V0aWwvZXNtL3JlcXVlc3QtYW5pbWF0aW9uLWZyYW1lLmpzPzNlNjMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L3V0aWwvZXNtL2NsZWFyLWFuaW1hdGlvbi1mcmFtZS5qcz81YjA0Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di91dGlsL2VzbS9taXguanM/NzU4MyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvdXRpbC9lc20vYXVnbWVudC5qcz9lNmQ5Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di91dGlsL2VzbS9jbG9uZS5qcz9iMDEzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di91dGlsL2VzbS9kZWJvdW5jZS5qcz85ZDc1Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di91dGlsL2VzbS9tZW1vaXplLmpzPzlhZTMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L3V0aWwvZXNtL2RlZXAtbWl4LmpzP2U0MzUiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L3V0aWwvZXNtL2V4dGVuZC5qcz8yYmQ3Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di91dGlsL2VzbS9pbmRleC1vZi5qcz83YWJiIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di91dGlsL2VzbS9pcy1lbXB0eS5qcz8zNzlmIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di91dGlsL2VzbS9pcy1lcXVhbC5qcz9kMzVmIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di91dGlsL2VzbS9pcy1lcXVhbC13aXRoLmpzPzE5MDYiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L3V0aWwvZXNtL21hcC5qcz9hNmY5Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di91dGlsL2VzbS9tYXAtdmFsdWVzLmpzP2M3NmEiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L3V0aWwvZXNtL2dldC5qcz80MzE3Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di91dGlsL2VzbS9zZXQuanM/ZjY2NSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvdXRpbC9lc20vcGljay5qcz85MTAwIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di91dGlsL2VzbS9vbWl0LmpzPzA3ZGYiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L3V0aWwvZXNtL3Rocm90dGxlLmpzP2YzNzYiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L3V0aWwvZXNtL3RvLWFycmF5LmpzPzJmMjciLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L3V0aWwvZXNtL3VuaXF1ZS1pZC5qcz85MWI1Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di91dGlsL2VzbS9ub29wLmpzPzRhM2QiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L3V0aWwvZXNtL2lkZW50aXR5LmpzPzI5ZDciLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L3V0aWwvZXNtL3NpemUuanM/ODFkZiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvdXRpbC9lc20vbWVhc3VyZS10ZXh0LXdpZHRoLmpzPzk0Y2EiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L3V0aWwvZXNtL2dldC1lbGxpcHNpcy10ZXh0LmpzP2M2NjciLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L3V0aWwvZXNtL2NhY2hlLmpzP2YwNDEiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L3V0aWwvZXNtL2luZGV4LmpzPzg5MzciXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNlLDZEQUFXLEVBQUM7QUFDM0IseUM7O0FDVjBDO0FBQzFDO0FBQ0EsU0FBUyxhQUFXO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ2UseURBQVEsRUFBQztBQUN4QixvQzs7QUNSMEM7QUFDMUM7QUFDQSxTQUFTLGFBQVc7QUFDcEI7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLG9CQUFvQjtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNlLHFEQUFNLEVBQUM7QUFDdEIsa0M7O0FDZjhCO0FBQ0k7QUFDbEM7QUFDQTtBQUNBO0FBQ0EsV0FBVyxNQUFNO0FBQ2pCLFdBQVcsTUFBTTtBQUNq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Q0Q7QUFDeEQ7QUFDMkM7QUFDUztBQUNBO0FBQ047QUFDTTtBQUNFO0FBQ087QUFDakI7QUFDVTtBQUNmO0FBQ0s7QUFDTDtBQUNLO0FBQ0w7QUFDVztBQUNFO0FBQ0Y7QUFDbEQ7QUFDNEM7QUFDTDtBQUNPO0FBQ0k7QUFDVDtBQUNPO0FBQ0g7QUFDN0M7QUFDb0Q7QUFDRTtBQUNEO0FBQ0Q7QUFDRTtBQUN0RDtBQUNnRDtBQUNRO0FBQ1I7QUFDUztBQUNMO0FBQ047QUFDRTtBQUNNO0FBQ0o7QUFDTjtBQUNFO0FBQ0k7QUFDQTtBQUNTO0FBQ0U7QUFDTDtBQUNMO0FBQ0Q7QUFDSjtBQUNVO0FBQ0o7QUFDeUI7QUFDSjtBQUN6RTtBQUMrQztBQUNKO0FBQ007QUFDRjtBQUNDO0FBQ1A7QUFDSTtBQUNHO0FBQ0E7QUFDQTtBQUNTO0FBQ2xCO0FBQ2E7QUFDTTtBQUNuQjtBQUNBO0FBQ0U7QUFDQTtBQUNRO0FBQ0Q7QUFDRTtBQUNBO0FBQ1Q7QUFDUTtBQUNSO0FBQ3pDO0FBQ21FO0FBQ0Y7QUFDakU7QUFDMkM7QUFDM0MiLCJmaWxlIjoiMC5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBpc0FycmF5TGlrZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIC8qKlxuICAgICAqIGlzQXJyYXlMaWtlKFsxLCAyLCAzXSkgPT4gdHJ1ZVxuICAgICAqIGlzQXJyYXlMaWtlKGRvY3VtZW50LmJvZHkuY2hpbGRyZW4pID0+IHRydWVcbiAgICAgKiBpc0FycmF5TGlrZSgnYWJjJykgPT4gdHJ1ZVxuICAgICAqIGlzQXJyYXlMaWtlKEZ1bmN0aW9uKSA9PiBmYWxzZVxuICAgICAqL1xuICAgIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgIT09ICdmdW5jdGlvbicgJiYgaXNGaW5pdGUodmFsdWUubGVuZ3RoKTtcbn07XG5leHBvcnQgZGVmYXVsdCBpc0FycmF5TGlrZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWlzLWFycmF5LWxpa2UuanMubWFwIiwiaW1wb3J0IGlzQXJyYXlMaWtlIGZyb20gJy4vaXMtYXJyYXktbGlrZSc7XG52YXIgY29udGFpbnMgPSBmdW5jdGlvbiAoYXJyLCB2YWx1ZSkge1xuICAgIGlmICghaXNBcnJheUxpa2UoYXJyKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBhcnIuaW5kZXhPZih2YWx1ZSkgPiAtMTtcbn07XG5leHBvcnQgZGVmYXVsdCBjb250YWlucztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbnRhaW5zLmpzLm1hcCIsImltcG9ydCBpc0FycmF5TGlrZSBmcm9tICcuL2lzLWFycmF5LWxpa2UnO1xudmFyIGZpbHRlciA9IGZ1bmN0aW9uIChhcnIsIGZ1bmMpIHtcbiAgICBpZiAoIWlzQXJyYXlMaWtlKGFycikpIHtcbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICB9XG4gICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgIGZvciAodmFyIGluZGV4ID0gMDsgaW5kZXggPCBhcnIubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGFycltpbmRleF07XG4gICAgICAgIGlmIChmdW5jKHZhbHVlLCBpbmRleCkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbmV4cG9ydCBkZWZhdWx0IGZpbHRlcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWZpbHRlci5qcy5tYXAiLCJpbXBvcnQgZmlsdGVyIGZyb20gJy4vZmlsdGVyJztcbmltcG9ydCBjb250YWlucyBmcm9tICcuL2NvbnRhaW5zJztcbi8qKlxuICogRmxhdHRlbnMgYGFycmF5YCBhIHNpbmdsZSBsZXZlbCBkZWVwLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IGFyciBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlcyBUaGUgdmFsdWVzIHRvIGV4Y2x1ZGUuXG4gKiBAcmV0dXJuIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGZpbHRlcmVkIHZhbHVlcy5cbiAqIEBleGFtcGxlXG4gKiBkaWZmZXJlbmNlKFsyLCAxXSwgWzIsIDNdKTsgIC8vID0+IFsxXVxuICovXG52YXIgZGlmZmVyZW5jZSA9IGZ1bmN0aW9uIChhcnIsIHZhbHVlcykge1xuICAgIGlmICh2YWx1ZXMgPT09IHZvaWQgMCkgeyB2YWx1ZXMgPSBbXTsgfVxuICAgIHJldHVybiBmaWx0ZXIoYXJyLCBmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuICFjb250YWlucyh2YWx1ZXMsIHZhbHVlKTsgfSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgZGlmZmVyZW5jZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRpZmZlcmVuY2UuanMubWFwIiwidmFyIHRvU3RyaW5nID0ge30udG9TdHJpbmc7XG52YXIgaXNUeXBlID0gZnVuY3Rpb24gKHZhbHVlLCB0eXBlKSB7IHJldHVybiB0b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgJyArIHR5cGUgKyAnXSc7IH07XG5leHBvcnQgZGVmYXVsdCBpc1R5cGU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pcy10eXBlLmpzLm1hcCIsIi8qKlxuICog5piv5ZCm5Li65Ye95pWwXG4gKiBAcGFyYW0gIHsqfSBmbiDlr7nosaFcbiAqIEByZXR1cm4ge0Jvb2xlYW59ICDmmK/lkKblh73mlbBcbiAqL1xuaW1wb3J0IGlzVHlwZSBmcm9tICcuL2lzLXR5cGUnO1xuZXhwb3J0IGRlZmF1bHQgKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIHJldHVybiBpc1R5cGUodmFsdWUsICdGdW5jdGlvbicpO1xufSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pcy1mdW5jdGlvbi5qcy5tYXAiLCIvLyBpc0Zpbml0ZSxcbnZhciBpc05pbCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIC8qKlxuICAgICAqIGlzTmlsKG51bGwpID0+IHRydWVcbiAgICAgKiBpc05pbCgpID0+IHRydWVcbiAgICAgKi9cbiAgICByZXR1cm4gdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZDtcbn07XG5leHBvcnQgZGVmYXVsdCBpc05pbDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWlzLW5pbC5qcy5tYXAiLCJpbXBvcnQgaXNUeXBlIGZyb20gJy4vaXMtdHlwZSc7XG5leHBvcnQgZGVmYXVsdCAoZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkgP1xuICAgICAgICBBcnJheS5pc0FycmF5KHZhbHVlKSA6XG4gICAgICAgIGlzVHlwZSh2YWx1ZSwgJ0FycmF5Jyk7XG59KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWlzLWFycmF5LmpzLm1hcCIsImV4cG9ydCBkZWZhdWx0IChmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAvKipcbiAgICAgKiBpc09iamVjdCh7fSkgPT4gdHJ1ZVxuICAgICAqIGlzT2JqZWN0KFsxLCAyLCAzXSkgPT4gdHJ1ZVxuICAgICAqIGlzT2JqZWN0KEZ1bmN0aW9uKSA9PiB0cnVlXG4gICAgICogaXNPYmplY3QobnVsbCkgPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdHlwZSA9PT0gJ29iamVjdCcgfHwgdHlwZSA9PT0gJ2Z1bmN0aW9uJztcbn0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aXMtb2JqZWN0LmpzLm1hcCIsImltcG9ydCBpc0FycmF5IGZyb20gJy4vaXMtYXJyYXknO1xuaW1wb3J0IGlzT2JqZWN0IGZyb20gJy4vaXMtb2JqZWN0JztcbmZ1bmN0aW9uIGVhY2goZWxlbWVudHMsIGZ1bmMpIHtcbiAgICBpZiAoIWVsZW1lbnRzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHJzdDtcbiAgICBpZiAoaXNBcnJheShlbGVtZW50cykpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGVsZW1lbnRzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICByc3QgPSBmdW5jKGVsZW1lbnRzW2ldLCBpKTtcbiAgICAgICAgICAgIGlmIChyc3QgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoaXNPYmplY3QoZWxlbWVudHMpKSB7XG4gICAgICAgIGZvciAodmFyIGsgaW4gZWxlbWVudHMpIHtcbiAgICAgICAgICAgIGlmIChlbGVtZW50cy5oYXNPd25Qcm9wZXJ0eShrKSkge1xuICAgICAgICAgICAgICAgIHJzdCA9IGZ1bmMoZWxlbWVudHNba10sIGspO1xuICAgICAgICAgICAgICAgIGlmIChyc3QgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydCBkZWZhdWx0IGVhY2g7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1lYWNoLmpzLm1hcCIsImltcG9ydCBlYWNoIGZyb20gJy4vZWFjaCc7XG5pbXBvcnQgaXNGdW5jdGlvbiBmcm9tICcuL2lzLWZ1bmN0aW9uJztcbnZhciBrZXlzID0gT2JqZWN0LmtleXMgPyBmdW5jdGlvbiAob2JqKSB7IHJldHVybiBPYmplY3Qua2V5cyhvYmopOyB9IDogZnVuY3Rpb24gKG9iaikge1xuICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICBlYWNoKG9iaiwgZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHtcbiAgICAgICAgaWYgKCEoaXNGdW5jdGlvbihvYmopICYmIGtleSA9PT0gJ3Byb3RvdHlwZScpKSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaChrZXkpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5leHBvcnQgZGVmYXVsdCBrZXlzO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9a2V5cy5qcy5tYXAiLCJpbXBvcnQgaXNOaWwgZnJvbSAnLi9pcy1uaWwnO1xuaW1wb3J0IGtleXMgZnJvbSAnLi9rZXlzJztcbmZ1bmN0aW9uIGlzTWF0Y2gob2JqLCBhdHRycykge1xuICAgIHZhciBfa2V5cyA9IGtleXMoYXR0cnMpO1xuICAgIHZhciBsZW5ndGggPSBfa2V5cy5sZW5ndGg7XG4gICAgaWYgKGlzTmlsKG9iaikpXG4gICAgICAgIHJldHVybiAhbGVuZ3RoO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgdmFyIGtleSA9IF9rZXlzW2ldO1xuICAgICAgICBpZiAoYXR0cnNba2V5XSAhPT0gb2JqW2tleV0gfHwgIShrZXkgaW4gb2JqKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuZXhwb3J0IGRlZmF1bHQgaXNNYXRjaDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWlzLW1hdGNoLmpzLm1hcCIsInZhciBpc09iamVjdExpa2UgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAvKipcbiAgICAgKiBpc09iamVjdExpa2Uoe30pID0+IHRydWVcbiAgICAgKiBpc09iamVjdExpa2UoWzEsIDIsIDNdKSA9PiB0cnVlXG4gICAgICogaXNPYmplY3RMaWtlKEZ1bmN0aW9uKSA9PiBmYWxzZVxuICAgICAqIGlzT2JqZWN0TGlrZShudWxsKSA9PiBmYWxzZVxuICAgICAqL1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsO1xufTtcbmV4cG9ydCBkZWZhdWx0IGlzT2JqZWN0TGlrZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWlzLW9iamVjdC1saWtlLmpzLm1hcCIsImltcG9ydCBpc09iamVjdExpa2UgZnJvbSAnLi9pcy1vYmplY3QtbGlrZSc7XG5pbXBvcnQgaXNUeXBlIGZyb20gJy4vaXMtdHlwZSc7XG52YXIgaXNQbGFpbk9iamVjdCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIC8qKlxuICAgICAqIGlzT2JqZWN0TGlrZShuZXcgRm9vKSA9PiBmYWxzZVxuICAgICAqIGlzT2JqZWN0TGlrZShbMSwgMiwgM10pID0+IGZhbHNlXG4gICAgICogaXNPYmplY3RMaWtlKHsgeDogMCwgeTogMCB9KSA9PiB0cnVlXG4gICAgICogaXNPYmplY3RMaWtlKE9iamVjdC5jcmVhdGUobnVsbCkpID0+IHRydWVcbiAgICAgKi9cbiAgICBpZiAoIWlzT2JqZWN0TGlrZSh2YWx1ZSkgfHwgIWlzVHlwZSh2YWx1ZSwgJ09iamVjdCcpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSkgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHZhciBwcm90byA9IHZhbHVlO1xuICAgIHdoaWxlIChPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pICE9PSBudWxsKSB7XG4gICAgICAgIHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvKTtcbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSkgPT09IHByb3RvO1xufTtcbmV4cG9ydCBkZWZhdWx0IGlzUGxhaW5PYmplY3Q7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pcy1wbGFpbi1vYmplY3QuanMubWFwIiwiaW1wb3J0IGlzRnVuY3Rpb24gZnJvbSAnLi9pcy1mdW5jdGlvbic7XG5pbXBvcnQgaXNNYXRjaCBmcm9tICcuL2lzLW1hdGNoJztcbmltcG9ydCBpc0FycmF5IGZyb20gJy4vaXMtYXJyYXknO1xuaW1wb3J0IGlzUGxhaW5PYmplY3QgZnJvbSAnLi9pcy1wbGFpbi1vYmplY3QnO1xuZnVuY3Rpb24gZmluZChhcnIsIHByZWRpY2F0ZSkge1xuICAgIGlmICghaXNBcnJheShhcnIpKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB2YXIgX3ByZWRpY2F0ZTtcbiAgICBpZiAoaXNGdW5jdGlvbihwcmVkaWNhdGUpKSB7XG4gICAgICAgIF9wcmVkaWNhdGUgPSBwcmVkaWNhdGU7XG4gICAgfVxuICAgIGlmIChpc1BsYWluT2JqZWN0KHByZWRpY2F0ZSkpIHtcbiAgICAgICAgX3ByZWRpY2F0ZSA9IGZ1bmN0aW9uIChhKSB7IHJldHVybiBpc01hdGNoKGEsIHByZWRpY2F0ZSk7IH07XG4gICAgfVxuICAgIGlmIChfcHJlZGljYXRlKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICBpZiAoX3ByZWRpY2F0ZShhcnJbaV0pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFycltpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbmV4cG9ydCBkZWZhdWx0IGZpbmQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1maW5kLmpzLm1hcCIsImZ1bmN0aW9uIGZpbmRJbmRleChhcnIsIHByZWRpY2F0ZSwgZnJvbUluZGV4KSB7XG4gICAgaWYgKGZyb21JbmRleCA9PT0gdm9pZCAwKSB7IGZyb21JbmRleCA9IDA7IH1cbiAgICBmb3IgKHZhciBpID0gZnJvbUluZGV4OyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChwcmVkaWNhdGUoYXJyW2ldLCBpKSkge1xuICAgICAgICAgICAgLy8g5om+5Yiw57uI5q2i5b6q546vXG4gICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gLTE7XG59XG5leHBvcnQgZGVmYXVsdCBmaW5kSW5kZXg7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1maW5kLWluZGV4LmpzLm1hcCIsImltcG9ydCBpc05pbCBmcm9tICcuL2lzLW5pbCc7XG5pbXBvcnQgaXNBcnJheSBmcm9tICcuL2lzLWFycmF5JztcbnZhciBmaXJzdFZhbHVlID0gZnVuY3Rpb24gKGRhdGEsIG5hbWUpIHtcbiAgICB2YXIgcnN0ID0gbnVsbDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIG9iaiA9IGRhdGFbaV07XG4gICAgICAgIHZhciB2YWx1ZSA9IG9ialtuYW1lXTtcbiAgICAgICAgaWYgKCFpc05pbCh2YWx1ZSkpIHtcbiAgICAgICAgICAgIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHJzdCA9IHZhbHVlWzBdOyAvLyB0b2RvIOi/memHjOaYr+WQpuW6lOivpeS9v+eUqOmAkuW9ku+8jOiwg+eUqCBmaXJzdFZhbHVlIEDnu53kupFcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJzdCA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJzdDtcbn07XG5leHBvcnQgZGVmYXVsdCBmaXJzdFZhbHVlO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Zmlyc3QtdmFsdWUuanMubWFwIiwiaW1wb3J0IGlzQXJyYXkgZnJvbSAnLi9pcy1hcnJheSc7XG4vKipcbiAqIEZsYXR0ZW5zIGBhcnJheWAgYSBzaW5nbGUgbGV2ZWwgZGVlcC5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBhcnIgVGhlIGFycmF5IHRvIGZsYXR0ZW4uXG4gKiBAcmV0dXJuIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZsYXR0ZW5lZCBhcnJheS5cbiAqIEBleGFtcGxlXG4gKlxuICogZmxhdHRlbihbMSwgWzIsIFszLCBbNF1dLCA1XV0pOyAgLy8gPT4gWzEsIDIsIFszLCBbNF1dLCA1XVxuICovXG52YXIgZmxhdHRlbiA9IGZ1bmN0aW9uIChhcnIpIHtcbiAgICBpZiAoIWlzQXJyYXkoYXJyKSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIHZhciByc3QgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgICByc3QgPSByc3QuY29uY2F0KGFycltpXSk7XG4gICAgfVxuICAgIHJldHVybiByc3Q7XG59O1xuZXhwb3J0IGRlZmF1bHQgZmxhdHRlbjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWZsYXR0ZW4uanMubWFwIiwiaW1wb3J0IGlzQXJyYXkgZnJvbSAnLi9pcy1hcnJheSc7XG4vKipcbiAqIEZsYXR0ZW5zIGBhcnJheWAgYSBzaW5nbGUgbGV2ZWwgZGVlcC5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBhcnIgVGhlIGFycmF5IHRvIGZsYXR0ZW4uXG4gKiBAcGFyYW0ge0FycmF5fSByZXN1bHQgVGhlIGFycmF5IHRvIHJldHVybi5cbiAqIEByZXR1cm4ge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmxhdHRlbmVkIGFycmF5LlxuICogQGV4YW1wbGVcbiAqXG4gKiBmbGF0dGVuRGVlcChbMSwgWzIsIFszLCBbNF1dLCA1XV0pOyAgLy8gPT4gWzEsIDIsIDMsIDQsIDVdXG4gKi9cbnZhciBmbGF0dGVuRGVlcCA9IGZ1bmN0aW9uIChhcnIsIHJlc3VsdCkge1xuICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgeyByZXN1bHQgPSBbXTsgfVxuICAgIGlmICghaXNBcnJheShhcnIpKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKGFycik7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgZmxhdHRlbkRlZXAoYXJyW2ldLCByZXN1bHQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59O1xuZXhwb3J0IGRlZmF1bHQgZmxhdHRlbkRlZXA7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1mbGF0dGVuLWRlZXAuanMubWFwIiwiaW1wb3J0IGlzQXJyYXkgZnJvbSAnLi9pcy1hcnJheSc7XG4vKipcbiAqIEBwYXJhbSB7QXJyYXl9IGFyciBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHJldHVybiB7Kn0gUmV0dXJucyB0aGUgbWF4aW11bSB2YWx1ZS5cbiAqIEBleGFtcGxlXG4gKlxuICogbWF4KFsxLCAyXSk7XG4gKiAvLyA9PiAyXG4gKlxuICogbWF4KFtdKTtcbiAqIC8vID0+IHVuZGVmaW5lZFxuICpcbiAqIGNvbnN0IGRhdGEgPSBuZXcgQXJyYXkoMTI1MDAxMCkuZmlsbCgxKS5tYXAoKGQsaWR4KSA9PiBpZHgpO1xuICpcbiAqIG1heChkYXRhKTtcbiAqIC8vID0+IDEyNTAwMTBcbiAqIC8vIE1hdGgubWF4KC4uLmRhdGEpIHdpbGwgZW5jb3VudGVyIFwiTWF4aW11bSBjYWxsIHN0YWNrIHNpemUgZXhjZWVkZWRcIiBlcnJvclxuICovXG5leHBvcnQgZGVmYXVsdCAoZnVuY3Rpb24gKGFycikge1xuICAgIGlmICghaXNBcnJheShhcnIpKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiBhcnIucmVkdWNlKGZ1bmN0aW9uIChwcmV2LCBjdXJyKSB7XG4gICAgICAgIHJldHVybiBNYXRoLm1heChwcmV2LCBjdXJyKTtcbiAgICB9LCBhcnJbMF0pO1xufSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tYXguanMubWFwIiwiaW1wb3J0IGlzQXJyYXkgZnJvbSAnLi9pcy1hcnJheSc7XG4vKipcbiAqIEBwYXJhbSB7QXJyYXl9IGFyciBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHJldHVybiB7Kn0gUmV0dXJucyB0aGUgbWluaW11bSB2YWx1ZS5cbiAqIEBleGFtcGxlXG4gKlxuICogbWluKFsxLCAyXSk7XG4gKiAvLyA9PiAxXG4gKlxuICogbWluKFtdKTtcbiAqIC8vID0+IHVuZGVmaW5lZFxuICpcbiAqIGNvbnN0IGRhdGEgPSBuZXcgQXJyYXkoMTI1MDAxMCkuZmlsbCgxKS5tYXAoKGQsaWR4KSA9PiBpZHgpO1xuICpcbiAqIG1pbihkYXRhKTtcbiAqIC8vID0+IDEyNTAwMTBcbiAqIC8vIE1hdGgubWluKC4uLmRhdGEpIHdpbGwgZW5jb3VudGVyIFwiTWF4aW11bSBjYWxsIHN0YWNrIHNpemUgZXhjZWVkZWRcIiBlcnJvclxuICovXG5leHBvcnQgZGVmYXVsdCAoZnVuY3Rpb24gKGFycikge1xuICAgIGlmICghaXNBcnJheShhcnIpKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiBhcnIucmVkdWNlKGZ1bmN0aW9uIChwcmV2LCBjdXJyKSB7XG4gICAgICAgIHJldHVybiBNYXRoLm1pbihwcmV2LCBjdXJyKTtcbiAgICB9LCBhcnJbMF0pO1xufSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1taW4uanMubWFwIiwiaW1wb3J0IGlzQXJyYXkgZnJvbSAnLi9pcy1hcnJheSc7XG5pbXBvcnQgeyBkZWZhdWx0IGFzIGdldE1heCB9IGZyb20gJy4vbWF4JztcbmltcG9ydCB7IGRlZmF1bHQgYXMgZ2V0TWluIH0gZnJvbSAnLi9taW4nO1xudmFyIGdldFJhbmdlID0gZnVuY3Rpb24gKHZhbHVlcykge1xuICAgIC8vIOWtmOWcqCBOYU4g5pe277yMbWluLG1heCDliKTlrprkvJrlh7rpl67pophcbiAgICB2YXIgZmlsdGVyVmFsdWVzID0gdmFsdWVzLmZpbHRlcihmdW5jdGlvbiAodikgeyByZXR1cm4gIWlzTmFOKHYpOyB9KTtcbiAgICBpZiAoIWZpbHRlclZhbHVlcy5sZW5ndGgpIHtcbiAgICAgICAgLy8g5aaC5p6c5rKh5pyJ5pWw5YC85YiZ55u05o6l6L+U5ZueMFxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbWluOiAwLFxuICAgICAgICAgICAgbWF4OiAwLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBpZiAoaXNBcnJheSh2YWx1ZXNbMF0pKSB7XG4gICAgICAgIHZhciB0bXAgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRtcCA9IHRtcC5jb25jYXQodmFsdWVzW2ldKTtcbiAgICAgICAgfVxuICAgICAgICBmaWx0ZXJWYWx1ZXMgPSB0bXA7XG4gICAgfVxuICAgIHZhciBtYXggPSBnZXRNYXgoZmlsdGVyVmFsdWVzKTtcbiAgICB2YXIgbWluID0gZ2V0TWluKGZpbHRlclZhbHVlcyk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbWluOiBtaW4sXG4gICAgICAgIG1heDogbWF4LFxuICAgIH07XG59O1xuZXhwb3J0IGRlZmF1bHQgZ2V0UmFuZ2U7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1nZXQtcmFuZ2UuanMubWFwIiwidmFyIGFyclByb3RvdHlwZSA9IEFycmF5LnByb3RvdHlwZTtcbnZhciBzcGxpY2UgPSBhcnJQcm90b3R5cGUuc3BsaWNlO1xudmFyIGluZGV4T2YgPSBhcnJQcm90b3R5cGUuaW5kZXhPZjtcbnZhciBwdWxsID0gZnVuY3Rpb24gKGFycikge1xuICAgIHZhciB2YWx1ZXMgPSBbXTtcbiAgICBmb3IgKHZhciBfaSA9IDE7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICB2YWx1ZXNbX2kgLSAxXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgfVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IHZhbHVlc1tpXTtcbiAgICAgICAgdmFyIGZyb21JbmRleCA9IC0xO1xuICAgICAgICB3aGlsZSAoKGZyb21JbmRleCA9IGluZGV4T2YuY2FsbChhcnIsIHZhbHVlKSkgPiAtMSkge1xuICAgICAgICAgICAgc3BsaWNlLmNhbGwoYXJyLCBmcm9tSW5kZXgsIDEpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhcnI7XG59O1xuZXhwb3J0IGRlZmF1bHQgcHVsbDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXB1bGwuanMubWFwIiwiaW1wb3J0IGlzQXJyYXlMaWtlIGZyb20gJy4vaXMtYXJyYXktbGlrZSc7XG52YXIgc3BsaWNlID0gQXJyYXkucHJvdG90eXBlLnNwbGljZTtcbnZhciBwdWxsQXQgPSBmdW5jdGlvbiBwdWxsQXQoYXJyLCBpbmRleGVzKSB7XG4gICAgaWYgKCFpc0FycmF5TGlrZShhcnIpKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgdmFyIGxlbmd0aCA9IGFyciA/IGluZGV4ZXMubGVuZ3RoIDogMDtcbiAgICB2YXIgbGFzdCA9IGxlbmd0aCAtIDE7XG4gICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgIHZhciBwcmV2aW91cyA9IHZvaWQgMDtcbiAgICAgICAgdmFyIGluZGV4ID0gaW5kZXhlc1tsZW5ndGhdO1xuICAgICAgICBpZiAobGVuZ3RoID09PSBsYXN0IHx8IGluZGV4ICE9PSBwcmV2aW91cykge1xuICAgICAgICAgICAgcHJldmlvdXMgPSBpbmRleDtcbiAgICAgICAgICAgIHNwbGljZS5jYWxsKGFyciwgaW5kZXgsIDEpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhcnI7XG59O1xuZXhwb3J0IGRlZmF1bHQgcHVsbEF0O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cHVsbC1hdC5qcy5tYXAiLCJpbXBvcnQgZWFjaCBmcm9tICcuL2VhY2gnO1xuaW1wb3J0IGlzQXJyYXkgZnJvbSAnLi9pcy1hcnJheSc7XG5pbXBvcnQgaXNQbGFpbk9iamVjdCBmcm9tICcuL2lzLXBsYWluLW9iamVjdCc7XG52YXIgcmVkdWNlID0gZnVuY3Rpb24gKGFyciwgZm4sIGluaXQpIHtcbiAgICBpZiAoIWlzQXJyYXkoYXJyKSAmJiAhaXNQbGFpbk9iamVjdChhcnIpKSB7XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfVxuICAgIHZhciByZXN1bHQgPSBpbml0O1xuICAgIGVhY2goYXJyLCBmdW5jdGlvbiAoZGF0YSwgaSkge1xuICAgICAgICByZXN1bHQgPSBmbihyZXN1bHQsIGRhdGEsIGkpO1xuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xuZXhwb3J0IGRlZmF1bHQgcmVkdWNlO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmVkdWNlLmpzLm1hcCIsImltcG9ydCBpc0FycmF5TGlrZSBmcm9tICcuL2lzLWFycmF5LWxpa2UnO1xuaW1wb3J0IHB1bGxBdCBmcm9tICcuL3B1bGwtYXQnO1xudmFyIHJlbW92ZSA9IGZ1bmN0aW9uIChhcnIsIHByZWRpY2F0ZSkge1xuICAgIC8qKlxuICAgICAqIGNvbnN0IGFyciA9IFsxLCAyLCAzLCA0XVxuICAgICAqIGNvbnN0IGV2ZW5zID0gcmVtb3ZlKGFyciwgbiA9PiBuICUgMiA9PSAwKVxuICAgICAqIGNvbnNvbGUubG9nKGFycikgLy8gPT4gWzEsIDNdXG4gICAgICogY29uc29sZS5sb2coZXZlbnMpIC8vID0+IFsyLCA0XVxuICAgICAqL1xuICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICBpZiAoIWlzQXJyYXlMaWtlKGFycikpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgdmFyIGkgPSAtMTtcbiAgICB2YXIgaW5kZXhlcyA9IFtdO1xuICAgIHZhciBsZW5ndGggPSBhcnIubGVuZ3RoO1xuICAgIHdoaWxlICgrK2kgPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gYXJyW2ldO1xuICAgICAgICBpZiAocHJlZGljYXRlKHZhbHVlLCBpLCBhcnIpKSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgICBpbmRleGVzLnB1c2goaSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHVsbEF0KGFyciwgaW5kZXhlcyk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5leHBvcnQgZGVmYXVsdCByZW1vdmU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZW1vdmUuanMubWFwIiwiaW1wb3J0IGlzVHlwZSBmcm9tICcuL2lzLXR5cGUnO1xuZXhwb3J0IGRlZmF1bHQgKGZ1bmN0aW9uIChzdHIpIHtcbiAgICByZXR1cm4gaXNUeXBlKHN0ciwgJ1N0cmluZycpO1xufSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pcy1zdHJpbmcuanMubWFwIiwiaW1wb3J0IGlzQXJyYXkgZnJvbSAnLi9pcy1hcnJheSc7XG5pbXBvcnQgaXNTdHJpbmcgZnJvbSAnLi9pcy1zdHJpbmcnO1xuaW1wb3J0IGlzRnVuY3Rpb24gZnJvbSAnLi9pcy1mdW5jdGlvbic7XG5mdW5jdGlvbiBzb3J0QnkoYXJyLCBrZXkpIHtcbiAgICB2YXIgY29tcGFyZXI7XG4gICAgaWYgKGlzRnVuY3Rpb24oa2V5KSkge1xuICAgICAgICBjb21wYXJlciA9IGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBrZXkoYSkgLSBrZXkoYik7IH07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB2YXIga2V5c18xID0gW107XG4gICAgICAgIGlmIChpc1N0cmluZyhrZXkpKSB7XG4gICAgICAgICAgICBrZXlzXzEucHVzaChrZXkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzQXJyYXkoa2V5KSkge1xuICAgICAgICAgICAga2V5c18xID0ga2V5O1xuICAgICAgICB9XG4gICAgICAgIGNvbXBhcmVyID0gZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5c18xLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICAgICAgdmFyIHByb3AgPSBrZXlzXzFbaV07XG4gICAgICAgICAgICAgICAgaWYgKGFbcHJvcF0gPiBiW3Byb3BdKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoYVtwcm9wXSA8IGJbcHJvcF0pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9O1xuICAgIH1cbiAgICBhcnIuc29ydChjb21wYXJlcik7XG4gICAgcmV0dXJuIGFycjtcbn1cbmV4cG9ydCBkZWZhdWx0IHNvcnRCeTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNvcnQtYnkuanMubWFwIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdW5pcShhcnIsIGNhY2hlKSB7XG4gICAgaWYgKGNhY2hlID09PSB2b2lkIDApIHsgY2FjaGUgPSBuZXcgTWFwKCk7IH1cbiAgICB2YXIgciA9IFtdO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGFycikpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGFyci5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgdmFyIGl0ZW0gPSBhcnJbaV07XG4gICAgICAgICAgICAvLyDliqDkuIDkuKogY2FjaGXvvIzmj5DljYfmgKfog71cbiAgICAgICAgICAgIGlmICghY2FjaGUuaGFzKGl0ZW0pKSB7XG4gICAgICAgICAgICAgICAgci5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgICAgIGNhY2hlLnNldChpdGVtLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcjtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXVuaXEuanMubWFwIiwiaW1wb3J0IHVuaXEgZnJvbSAnLi91bmlxJztcbnZhciB1bmlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc291cmNlcyA9IFtdO1xuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgIHNvdXJjZXNbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICB9XG4gICAgcmV0dXJuIHVuaXEoW10uY29uY2F0LmFwcGx5KFtdLCBzb3VyY2VzKSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgdW5pb247XG4vLyMgc291cmNlTWFwcGluZ1VSTD11bmlvbi5qcy5tYXAiLCJpbXBvcnQgaXNBcnJheSBmcm9tICcuL2lzLWFycmF5JztcbmltcG9ydCBpc05pbCBmcm9tICcuL2lzLW5pbCc7XG5leHBvcnQgZGVmYXVsdCAoZnVuY3Rpb24gKGRhdGEsIG5hbWUpIHtcbiAgICB2YXIgcnN0ID0gW107XG4gICAgdmFyIHRtcE1hcCA9IHt9O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgb2JqID0gZGF0YVtpXTtcbiAgICAgICAgdmFyIHZhbHVlID0gb2JqW25hbWVdO1xuICAgICAgICBpZiAoIWlzTmlsKHZhbHVlKSkge1xuICAgICAgICAgICAgLy8gZmxhdHRlblxuICAgICAgICAgICAgaWYgKCFpc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gW3ZhbHVlXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdmFsdWUubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgdmFsID0gdmFsdWVbal07XG4gICAgICAgICAgICAgICAgLy8gdW5pcXVlXG4gICAgICAgICAgICAgICAgaWYgKCF0bXBNYXBbdmFsXSkge1xuICAgICAgICAgICAgICAgICAgICByc3QucHVzaCh2YWwpO1xuICAgICAgICAgICAgICAgICAgICB0bXBNYXBbdmFsXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByc3Q7XG59KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXZhbHVlcy1vZi1rZXkuanMubWFwIiwiaW1wb3J0IGlzQXJyYXlMaWtlIGZyb20gJy4vaXMtYXJyYXktbGlrZSc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBoZWFkKG8pIHtcbiAgICBpZiAoaXNBcnJheUxpa2UobykpIHtcbiAgICAgICAgcmV0dXJuIG9bMF07XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1oZWFkLmpzLm1hcCIsImltcG9ydCBpc0FycmF5TGlrZSBmcm9tICcuL2lzLWFycmF5LWxpa2UnO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbGFzdChvKSB7XG4gICAgaWYgKGlzQXJyYXlMaWtlKG8pKSB7XG4gICAgICAgIHZhciBhcnIgPSBvO1xuICAgICAgICByZXR1cm4gYXJyW2Fyci5sZW5ndGggLSAxXTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWxhc3QuanMubWFwIiwiaW1wb3J0IGlzQXJyYXkgZnJvbSAnLi9pcy1hcnJheSc7XG5pbXBvcnQgaXNTdHJpbmcgZnJvbSAnLi9pcy1zdHJpbmcnO1xuZnVuY3Rpb24gc3RhcnRzV2l0aChhcnIsIGUpIHtcbiAgICByZXR1cm4gKGlzQXJyYXkoYXJyKSB8fCBpc1N0cmluZyhhcnIpKSA/IGFyclswXSA9PT0gZSA6IGZhbHNlO1xufVxuZXhwb3J0IGRlZmF1bHQgc3RhcnRzV2l0aDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXN0YXJ0cy13aXRoLmpzLm1hcCIsImltcG9ydCBpc0FycmF5IGZyb20gJy4vaXMtYXJyYXknO1xuaW1wb3J0IGlzU3RyaW5nIGZyb20gJy4vaXMtc3RyaW5nJztcbmZ1bmN0aW9uIGVuZHNXaXRoKGFyciwgZSkge1xuICAgIHJldHVybiAoaXNBcnJheShhcnIpIHx8IGlzU3RyaW5nKGFycikpID8gYXJyW2Fyci5sZW5ndGggLSAxXSA9PT0gZSA6IGZhbHNlO1xufVxuZXhwb3J0IGRlZmF1bHQgZW5kc1dpdGg7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1lbmRzLXdpdGguanMubWFwIiwiLyoqXG4gKiDlj6ropoHmnInkuIDkuKrkuI3mu6HotrPmnaHku7blsLHov5Tlm54gZmFsc2VcbiAqIEBwYXJhbSBhcnJcbiAqIEBwYXJhbSBmdW5jXG4gKi9cbnZhciBldmVyeSA9IGZ1bmN0aW9uIChhcnIsIGZ1bmMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoIWZ1bmMoYXJyW2ldLCBpKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59O1xuZXhwb3J0IGRlZmF1bHQgZXZlcnk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1ldmVyeS5qcy5tYXAiLCIvKipcbiAqIOWPquimgeacieS4gOS4qua7oei2s+adoeS7tuWwsei/lOWbniB0cnVlXG4gKiBAcGFyYW0gYXJyXG4gKiBAcGFyYW0gZnVuY1xuICovXG52YXIgc29tZSA9IGZ1bmN0aW9uIChhcnIsIGZ1bmMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoZnVuYyhhcnJbaV0sIGkpKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn07XG5leHBvcnQgZGVmYXVsdCBzb21lO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c29tZS5qcy5tYXAiLCJpbXBvcnQgaXNBcnJheSBmcm9tICcuL2lzLWFycmF5JztcbmltcG9ydCBpc0Z1bmN0aW9uIGZyb20gJy4vaXMtZnVuY3Rpb24nO1xudmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbmZ1bmN0aW9uIGdyb3VwQnkoZGF0YSwgY29uZGl0aW9uKSB7XG4gICAgaWYgKCFjb25kaXRpb24gfHwgIWlzQXJyYXkoZGF0YSkpIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgLy8g5YW85a655pa55rOV5ZKMIOWtl+espuS4sueahOWGmeazlVxuICAgIHZhciBwcmVkaWNhdGUgPSBpc0Z1bmN0aW9uKGNvbmRpdGlvbikgPyBjb25kaXRpb24gOiBmdW5jdGlvbiAoaXRlbSkgeyByZXR1cm4gaXRlbVtjb25kaXRpb25dOyB9O1xuICAgIHZhciBrZXk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBpdGVtID0gZGF0YVtpXTtcbiAgICAgICAga2V5ID0gcHJlZGljYXRlKGl0ZW0pO1xuICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChyZXN1bHQsIGtleSkpIHtcbiAgICAgICAgICAgIHJlc3VsdFtrZXldLnB1c2goaXRlbSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXN1bHRba2V5XSA9IFtpdGVtXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZXhwb3J0IGRlZmF1bHQgZ3JvdXBCeTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdyb3VwLWJ5LmpzLm1hcCIsImltcG9ydCBpc0FycmF5IGZyb20gJy4vaXMtYXJyYXknO1xuaW1wb3J0IGlzRnVuY3Rpb24gZnJvbSAnLi9pcy1mdW5jdGlvbic7XG5pbXBvcnQgZ3JvdXBCeSBmcm9tICcuL2dyb3VwLWJ5Jztcbi8qKlxuICog5bCG5pWw5o2u5YiG57uE5oiQIG1hcFxuICogQHBhcmFtIGRhdGFcbiAqIEBwYXJhbSBjb25kaXRpb25cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ3JvdXBUb01hcChkYXRhLCBjb25kaXRpb24pIHtcbiAgICBpZiAoIWNvbmRpdGlvbikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgMDogZGF0YSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgaWYgKCFpc0Z1bmN0aW9uKGNvbmRpdGlvbikpIHtcbiAgICAgICAgLy8g5aaC5p6c5piv5a2X56ym5Liy77yM5YiZ5oyJ54WnIGEqYiDpo47moLzmiJDmlbDnu4RcbiAgICAgICAgdmFyIHBhcmFtc2NvbmRpdGlvbl8xID0gaXNBcnJheShjb25kaXRpb24pID8gY29uZGl0aW9uIDogY29uZGl0aW9uLnJlcGxhY2UoL1xccysvZywgJycpLnNwbGl0KCcqJyk7XG4gICAgICAgIGNvbmRpdGlvbiA9IGZ1bmN0aW9uIChyb3cpIHtcbiAgICAgICAgICAgIHZhciB1bmlxdWUgPSAnXyc7IC8vIOmBv+WFjeWHuueOsOaVsOWtl+S9nOS4uktleeeahOaDheWGte+8jOS8mui/m+ihjOaMieeFp+aVsOWtl+eahOaOkuW6j1xuICAgICAgICAgICAgLy8g5qC55o2u5a2X5q615YiX6KGo55qE5YC877yM5ou85o6l5oiQIGtleVxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBwYXJhbXNjb25kaXRpb25fMS5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgICAgICAgICB1bmlxdWUgKz0gcm93W3BhcmFtc2NvbmRpdGlvbl8xW2ldXSAmJiByb3dbcGFyYW1zY29uZGl0aW9uXzFbaV1dLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdW5pcXVlO1xuICAgICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gZ3JvdXBCeShkYXRhLCBjb25kaXRpb24pO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z3JvdXAtdG8tbWFwLmpzLm1hcCIsImltcG9ydCBncm91cFRvTWFwIGZyb20gJy4vZ3JvdXAtdG8tbWFwJztcbmV4cG9ydCBkZWZhdWx0IChmdW5jdGlvbiAoZGF0YSwgY29uZGl0aW9uKSB7XG4gICAgaWYgKCFjb25kaXRpb24pIHtcbiAgICAgICAgLy8g5rKh5pyJ5p2h5Lu277yM5YiZ6Ieq6Lqr5pS55oiQ5pWw57uEXG4gICAgICAgIHJldHVybiBbZGF0YV07XG4gICAgfVxuICAgIHZhciBncm91cHMgPSBncm91cFRvTWFwKGRhdGEsIGNvbmRpdGlvbik7XG4gICAgdmFyIGFycmF5ID0gW107XG4gICAgZm9yICh2YXIgaSBpbiBncm91cHMpIHtcbiAgICAgICAgYXJyYXkucHVzaChncm91cHNbaV0pO1xuICAgIH1cbiAgICByZXR1cm4gYXJyYXk7XG59KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdyb3VwLmpzLm1hcCIsIi8qKlxuICog6I635Y+W5bCB6KOF55qE5LqL5Lu2XG4gKiBAcHJvdGVjdGVkXG4gKiBAcGFyYW0gIHtPYmplY3R9IG9iaiAgIOWvueixoVxuICogQHBhcmFtICB7U3RyaW5nfSBhY3Rpb24g5LqL5Lu25ZCN56ewXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gICAgICAgIOi/lOWbnuS6i+S7tuWkhOeQhuWHveaVsFxuICovXG5mdW5jdGlvbiBnZXRXcmFwQmVoYXZpb3Iob2JqLCBhY3Rpb24pIHtcbiAgICByZXR1cm4gb2JqWydfd3JhcF8nICsgYWN0aW9uXTtcbn1cbmV4cG9ydCBkZWZhdWx0IGdldFdyYXBCZWhhdmlvcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdldC13cmFwLWJlaGF2aW9yLmpzLm1hcCIsIi8qKlxuICog5bCB6KOF5LqL5Lu277yM5L6/5LqO5L2/55So5LiK5LiL5paHdGhpcyzlkozkvr/kuo7op6PpmaTkuovku7bml7bkvb/nlKhcbiAqIEBwcm90ZWN0ZWRcbiAqIEBwYXJhbSAge09iamVjdH0gb2JqICAg5a+56LGhXG4gKiBAcGFyYW0gIHtTdHJpbmd9IGFjdGlvbiDkuovku7blkI3np7BcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSAgICAgICAg6L+U5Zue5LqL5Lu25aSE55CG5Ye95pWwXG4gKi9cbmZ1bmN0aW9uIHdyYXBCZWhhdmlvcihvYmosIGFjdGlvbikge1xuICAgIGlmIChvYmpbJ193cmFwXycgKyBhY3Rpb25dKSB7XG4gICAgICAgIHJldHVybiBvYmpbJ193cmFwXycgKyBhY3Rpb25dO1xuICAgIH1cbiAgICB2YXIgbWV0aG9kID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgb2JqW2FjdGlvbl0oZSk7XG4gICAgfTtcbiAgICBvYmpbJ193cmFwXycgKyBhY3Rpb25dID0gbWV0aG9kO1xuICAgIHJldHVybiBtZXRob2Q7XG59XG5leHBvcnQgZGVmYXVsdCB3cmFwQmVoYXZpb3I7XG4vLyMgc291cmNlTWFwcGluZ1VSTD13cmFwLWJlaGF2aW9yLmpzLm1hcCIsInZhciBudW1Db2xvckNhY2hlID0ge307XG5mdW5jdGlvbiBudW1iZXJUb0NvbG9yKG51bSkge1xuICAgIC8vIOWinuWKoOe8k+WtmFxuICAgIHZhciBjb2xvciA9IG51bUNvbG9yQ2FjaGVbbnVtXTtcbiAgICBpZiAoIWNvbG9yKSB7XG4gICAgICAgIHZhciBzdHIgPSBudW0udG9TdHJpbmcoMTYpO1xuICAgICAgICBmb3IgKHZhciBpID0gc3RyLmxlbmd0aDsgaSA8IDY7IGkrKykge1xuICAgICAgICAgICAgc3RyID0gJzAnICsgc3RyO1xuICAgICAgICB9XG4gICAgICAgIGNvbG9yID0gJyMnICsgc3RyO1xuICAgICAgICBudW1Db2xvckNhY2hlW251bV0gPSBjb2xvcjtcbiAgICB9XG4gICAgcmV0dXJuIGNvbG9yO1xufVxuZXhwb3J0IGRlZmF1bHQgbnVtYmVyVG9Db2xvcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW51bWJlcjJjb2xvci5qcy5tYXAiLCJpbXBvcnQgaXNBcnJheSBmcm9tICcuL2lzLWFycmF5JztcbmZ1bmN0aW9uIHBhcnNlUmFkaXVzKHJhZGl1cykge1xuICAgIHZhciByMSA9IDAsIHIyID0gMCwgcjMgPSAwLCByNCA9IDA7XG4gICAgaWYgKGlzQXJyYXkocmFkaXVzKSkge1xuICAgICAgICBpZiAocmFkaXVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgcjEgPSByMiA9IHIzID0gcjQgPSByYWRpdXNbMF07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocmFkaXVzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgICAgcjEgPSByMyA9IHJhZGl1c1swXTtcbiAgICAgICAgICAgIHIyID0gcjQgPSByYWRpdXNbMV07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocmFkaXVzLmxlbmd0aCA9PT0gMykge1xuICAgICAgICAgICAgcjEgPSByYWRpdXNbMF07XG4gICAgICAgICAgICByMiA9IHI0ID0gcmFkaXVzWzFdO1xuICAgICAgICAgICAgcjMgPSByYWRpdXNbMl07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByMSA9IHJhZGl1c1swXTtcbiAgICAgICAgICAgIHIyID0gcmFkaXVzWzFdO1xuICAgICAgICAgICAgcjMgPSByYWRpdXNbMl07XG4gICAgICAgICAgICByNCA9IHJhZGl1c1szXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcjEgPSByMiA9IHIzID0gcjQgPSByYWRpdXM7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIHIxOiByMSxcbiAgICAgICAgcjI6IHIyLFxuICAgICAgICByMzogcjMsXG4gICAgICAgIHI0OiByNFxuICAgIH07XG59XG5leHBvcnQgZGVmYXVsdCBwYXJzZVJhZGl1cztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBhcnNlLXJhZGl1cy5qcy5tYXAiLCJ2YXIgY2xhbXAgPSBmdW5jdGlvbiAoYSwgbWluLCBtYXgpIHtcbiAgICBpZiAoYSA8IG1pbikge1xuICAgICAgICByZXR1cm4gbWluO1xuICAgIH1cbiAgICBlbHNlIGlmIChhID4gbWF4KSB7XG4gICAgICAgIHJldHVybiBtYXg7XG4gICAgfVxuICAgIHJldHVybiBhO1xufTtcbmV4cG9ydCBkZWZhdWx0IGNsYW1wO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y2xhbXAuanMubWFwIiwidmFyIGZpeGVkQmFzZSA9IGZ1bmN0aW9uICh2LCBiYXNlKSB7XG4gICAgdmFyIHN0ciA9IGJhc2UudG9TdHJpbmcoKTtcbiAgICB2YXIgaW5kZXggPSBzdHIuaW5kZXhPZignLicpO1xuICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgICAgcmV0dXJuIE1hdGgucm91bmQodik7XG4gICAgfVxuICAgIHZhciBsZW5ndGggPSBzdHIuc3Vic3RyKGluZGV4ICsgMSkubGVuZ3RoO1xuICAgIGlmIChsZW5ndGggPiAyMCkge1xuICAgICAgICBsZW5ndGggPSAyMDtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnNlRmxvYXQodi50b0ZpeGVkKGxlbmd0aCkpO1xufTtcbmV4cG9ydCBkZWZhdWx0IGZpeGVkQmFzZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWZpeGVkLWJhc2UuanMubWFwIiwiLyoqXG4gKiDliKTmlq3mmK/lkKbmlbDlrZdcbiAqIEByZXR1cm4ge0Jvb2xlYW59IOaYr+WQpuaVsOWtl1xuICovXG5pbXBvcnQgaXNUeXBlIGZyb20gJy4vaXMtdHlwZSc7XG52YXIgaXNOdW1iZXIgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICByZXR1cm4gaXNUeXBlKHZhbHVlLCAnTnVtYmVyJyk7XG59O1xuZXhwb3J0IGRlZmF1bHQgaXNOdW1iZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pcy1udW1iZXIuanMubWFwIiwiaW1wb3J0IGlzTnVtYmVyIGZyb20gJy4vaXMtbnVtYmVyJztcbnZhciBpc0RlY2ltYWwgPSBmdW5jdGlvbiAobnVtKSB7XG4gICAgcmV0dXJuIGlzTnVtYmVyKG51bSkgJiYgbnVtICUgMSAhPT0gMDtcbn07XG5leHBvcnQgZGVmYXVsdCBpc0RlY2ltYWw7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pcy1kZWNpbWFsLmpzLm1hcCIsImltcG9ydCBpc051bWJlciBmcm9tICcuL2lzLW51bWJlcic7XG52YXIgaXNFdmVuID0gZnVuY3Rpb24gKG51bSkge1xuICAgIHJldHVybiBpc051bWJlcihudW0pICYmIG51bSAlIDIgPT09IDA7XG59O1xuZXhwb3J0IGRlZmF1bHQgaXNFdmVuO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aXMtZXZlbi5qcy5tYXAiLCJpbXBvcnQgaXNOdW1iZXIgZnJvbSAnLi9pcy1udW1iZXInO1xudmFyIGlzSW50ZWdlciA9IE51bWJlci5pc0ludGVnZXIgPyBOdW1iZXIuaXNJbnRlZ2VyIDogZnVuY3Rpb24gKG51bSkge1xuICAgIHJldHVybiBpc051bWJlcihudW0pICYmIG51bSAlIDEgPT09IDA7XG59O1xuZXhwb3J0IGRlZmF1bHQgaXNJbnRlZ2VyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aXMtaW50ZWdlci5qcy5tYXAiLCJpbXBvcnQgaXNOdW1iZXIgZnJvbSAnLi9pcy1udW1iZXInO1xudmFyIGlzTmVnYXRpdmUgPSBmdW5jdGlvbiAobnVtKSB7XG4gICAgcmV0dXJuIGlzTnVtYmVyKG51bSkgJiYgbnVtIDwgMDtcbn07XG5leHBvcnQgZGVmYXVsdCBpc05lZ2F0aXZlO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aXMtbmVnYXRpdmUuanMubWFwIiwidmFyIFBSRUNJU0lPTiA9IDAuMDAwMDE7IC8vIG51bWJlcnMgbGVzcyB0aGFuIHRoaXMgaXMgY29uc2lkZXJlZCBhcyAwXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc051bWJlckVxdWFsKGEsIGIsIHByZWNpc2lvbikge1xuICAgIGlmIChwcmVjaXNpb24gPT09IHZvaWQgMCkgeyBwcmVjaXNpb24gPSBQUkVDSVNJT047IH1cbiAgICByZXR1cm4gTWF0aC5hYnMoKGEgLSBiKSkgPCBwcmVjaXNpb247XG59XG47XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pcy1udW1iZXItZXF1YWwuanMubWFwIiwiaW1wb3J0IGlzTnVtYmVyIGZyb20gJy4vaXMtbnVtYmVyJztcbnZhciBpc09kZCA9IGZ1bmN0aW9uIChudW0pIHtcbiAgICByZXR1cm4gaXNOdW1iZXIobnVtKSAmJiBudW0gJSAyICE9PSAwO1xufTtcbmV4cG9ydCBkZWZhdWx0IGlzT2RkO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aXMtb2RkLmpzLm1hcCIsImltcG9ydCBpc051bWJlciBmcm9tICcuL2lzLW51bWJlcic7XG52YXIgaXNQb3NpdGl2ZSA9IGZ1bmN0aW9uIChudW0pIHtcbiAgICByZXR1cm4gaXNOdW1iZXIobnVtKSAmJiBudW0gPiAwO1xufTtcbmV4cG9ydCBkZWZhdWx0IGlzUG9zaXRpdmU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pcy1wb3NpdGl2ZS5qcy5tYXAiLCJpbXBvcnQgaXNBcnJheSBmcm9tICcuL2lzLWFycmF5JztcbmltcG9ydCBpc0Z1bmN0aW9uIGZyb20gJy4vaXMtZnVuY3Rpb24nO1xuLyoqXG4gKiBAcGFyYW0ge0FycmF5fSBhcnIgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtmbl0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gKiBAcmV0dXJuIHsqfSBSZXR1cm5zIHRoZSBtYXhpbXVtIHZhbHVlLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0cyA9IFt7ICduJzogMSB9LCB7ICduJzogMiB9XTtcbiAqXG4gKiBtYXhCeShvYmplY3RzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLm47IH0pO1xuICogLy8gPT4geyAnbic6IDIgfVxuICpcbiAqIG1heEJ5KG9iamVjdHMsICduJyk7XG4gKiAvLyA9PiB7ICduJzogMiB9XG4gKi9cbmV4cG9ydCBkZWZhdWx0IChmdW5jdGlvbiAoYXJyLCBmbikge1xuICAgIGlmICghaXNBcnJheShhcnIpKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHZhciBtYXhJdGVtO1xuICAgIHZhciBtYXggPSAtSW5maW5pdHk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGl0ZW0gPSBhcnJbaV07XG4gICAgICAgIHZhciB2ID0gaXNGdW5jdGlvbihmbikgPyBmbihpdGVtKSA6IGl0ZW1bZm5dO1xuICAgICAgICBpZiAodiA+IG1heCkge1xuICAgICAgICAgICAgbWF4SXRlbSA9IGl0ZW07XG4gICAgICAgICAgICBtYXggPSB2O1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtYXhJdGVtO1xufSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tYXgtYnkuanMubWFwIiwiaW1wb3J0IGlzQXJyYXkgZnJvbSAnLi9pcy1hcnJheSc7XG5pbXBvcnQgaXNGdW5jdGlvbiBmcm9tICcuL2lzLWZ1bmN0aW9uJztcbi8qKlxuICogQHBhcmFtIHtBcnJheX0gYXJyIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbZm5dIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICogQHJldHVybiB7Kn0gUmV0dXJucyB0aGUgbWluaW11bSB2YWx1ZS5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdHMgPSBbeyAnbic6IDEgfSwgeyAnbic6IDIgfV07XG4gKlxuICogbWluQnkob2JqZWN0cywgZnVuY3Rpb24obykgeyByZXR1cm4gby5uOyB9KTtcbiAqIC8vID0+IHsgJ24nOiAxIH1cbiAqXG4gKiBtaW5CeShvYmplY3RzLCAnbicpO1xuICogLy8gPT4geyAnbic6IDEgfVxuICovXG5leHBvcnQgZGVmYXVsdCAoZnVuY3Rpb24gKGFyciwgZm4pIHtcbiAgICBpZiAoIWlzQXJyYXkoYXJyKSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICB2YXIgbWluSXRlbTtcbiAgICB2YXIgbWluID0gSW5maW5pdHk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGl0ZW0gPSBhcnJbaV07XG4gICAgICAgIHZhciB2ID0gaXNGdW5jdGlvbihmbikgPyBmbihpdGVtKSA6IGl0ZW1bZm5dO1xuICAgICAgICBpZiAodiA8IG1pbikge1xuICAgICAgICAgICAgbWluSXRlbSA9IGl0ZW07XG4gICAgICAgICAgICBtaW4gPSB2O1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtaW5JdGVtO1xufSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1taW4tYnkuanMubWFwIiwidmFyIG1vZCA9IGZ1bmN0aW9uIChuLCBtKSB7XG4gICAgcmV0dXJuICgobiAlIG0pICsgbSkgJSBtO1xufTtcbmV4cG9ydCBkZWZhdWx0IG1vZDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1vZC5qcy5tYXAiLCJ2YXIgREVHUkVFID0gMTgwIC8gTWF0aC5QSTtcbnZhciB0b0RlZ3JlZSA9IGZ1bmN0aW9uIChyYWRpYW4pIHtcbiAgICByZXR1cm4gREVHUkVFICogcmFkaWFuO1xufTtcbmV4cG9ydCBkZWZhdWx0IHRvRGVncmVlO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dG8tZGVncmVlLmpzLm1hcCIsImV4cG9ydCBkZWZhdWx0IHBhcnNlSW50O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dG8taW50ZWdlci5qcy5tYXAiLCJ2YXIgUkFESUFOID0gTWF0aC5QSSAvIDE4MDtcbnZhciB0b1JhZGlhbiA9IGZ1bmN0aW9uIChkZWdyZWUpIHtcbiAgICByZXR1cm4gUkFESUFOICogZGVncmVlO1xufTtcbmV4cG9ydCBkZWZhdWx0IHRvUmFkaWFuO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dG8tcmFkaWFuLmpzLm1hcCIsImltcG9ydCBlYWNoIGZyb20gJy4vZWFjaCc7XG5leHBvcnQgZGVmYXVsdCBlYWNoO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Zm9yLWluLmpzLm1hcCIsImV4cG9ydCBkZWZhdWx0IChmdW5jdGlvbiAob2JqLCBrZXkpIHsgcmV0dXJuIG9iai5oYXNPd25Qcm9wZXJ0eShrZXkpOyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWhhcy5qcy5tYXAiLCJpbXBvcnQgaGFzIGZyb20gJy4vaGFzJztcbmV4cG9ydCBkZWZhdWx0IGhhcztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWhhcy1rZXkuanMubWFwIiwiaW1wb3J0IGVhY2ggZnJvbSAnLi9lYWNoJztcbmltcG9ydCBpc0Z1bmN0aW9uIGZyb20gJy4vaXMtZnVuY3Rpb24nO1xuLy8gQHRzLWlnbm9yZVxudmFyIHZhbHVlcyA9IE9iamVjdC52YWx1ZXMgPyBmdW5jdGlvbiAob2JqKSB7IHJldHVybiBPYmplY3QudmFsdWVzKG9iaik7IH0gOiBmdW5jdGlvbiAob2JqKSB7XG4gICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgIGVhY2gob2JqLCBmdW5jdGlvbiAodmFsdWUsIGtleSkge1xuICAgICAgICBpZiAoIShpc0Z1bmN0aW9uKG9iaikgJiYga2V5ID09PSAncHJvdG90eXBlJykpIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xuZXhwb3J0IGRlZmF1bHQgdmFsdWVzO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dmFsdWVzLmpzLm1hcCIsImltcG9ydCBjb250YWlucyBmcm9tICcuL2NvbnRhaW5zJztcbmltcG9ydCB2YWx1ZXMgZnJvbSAnLi92YWx1ZXMnO1xuZXhwb3J0IGRlZmF1bHQgKGZ1bmN0aW9uIChvYmosIHZhbHVlKSB7IHJldHVybiBjb250YWlucyh2YWx1ZXMob2JqKSwgdmFsdWUpOyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWhhcy12YWx1ZS5qcy5tYXAiLCJpbXBvcnQgaXNOaWwgZnJvbSAnLi9pcy1uaWwnO1xuZXhwb3J0IGRlZmF1bHQgKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIGlmIChpc05pbCh2YWx1ZSkpXG4gICAgICAgIHJldHVybiAnJztcbiAgICByZXR1cm4gdmFsdWUudG9TdHJpbmcoKTtcbn0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dG8tc3RyaW5nLmpzLm1hcCIsImltcG9ydCB0b1N0cmluZyBmcm9tICcuL3RvLXN0cmluZyc7XG52YXIgbG93ZXJDYXNlID0gZnVuY3Rpb24gKHN0cikge1xuICAgIHJldHVybiB0b1N0cmluZyhzdHIpLnRvTG93ZXJDYXNlKCk7XG59O1xuZXhwb3J0IGRlZmF1bHQgbG93ZXJDYXNlO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bG93ZXItY2FzZS5qcy5tYXAiLCJpbXBvcnQgdG9TdHJpbmcgZnJvbSAnLi90by1zdHJpbmcnO1xudmFyIGxvd2VyRmlyc3QgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICB2YXIgc3RyID0gdG9TdHJpbmcodmFsdWUpO1xuICAgIHJldHVybiBzdHIuY2hhckF0KDApLnRvTG93ZXJDYXNlKCkgKyBzdHIuc3Vic3RyaW5nKDEpO1xufTtcbmV4cG9ydCBkZWZhdWx0IGxvd2VyRmlyc3Q7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1sb3dlci1maXJzdC5qcy5tYXAiLCJmdW5jdGlvbiBzdWJzdGl0dXRlKHN0ciwgbykge1xuICAgIGlmICghc3RyIHx8ICFvKSB7XG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuICAgIHJldHVybiBzdHIucmVwbGFjZSgvXFxcXD9cXHsoW157fV0rKVxcfS9nLCBmdW5jdGlvbiAobWF0Y2gsIG5hbWUpIHtcbiAgICAgICAgaWYgKG1hdGNoLmNoYXJBdCgwKSA9PT0gJ1xcXFwnKSB7XG4gICAgICAgICAgICByZXR1cm4gbWF0Y2guc2xpY2UoMSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChvW25hbWVdID09PSB1bmRlZmluZWQpID8gJycgOiBvW25hbWVdO1xuICAgIH0pO1xufVxuZXhwb3J0IGRlZmF1bHQgc3Vic3RpdHV0ZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXN1YnN0aXR1dGUuanMubWFwIiwiaW1wb3J0IHRvU3RyaW5nIGZyb20gJy4vdG8tc3RyaW5nJztcbnZhciB1cHBlckNhc2UgPSBmdW5jdGlvbiAoc3RyKSB7XG4gICAgcmV0dXJuIHRvU3RyaW5nKHN0cikudG9VcHBlckNhc2UoKTtcbn07XG5leHBvcnQgZGVmYXVsdCB1cHBlckNhc2U7XG4vLyMgc291cmNlTWFwcGluZ1VSTD11cHBlci1jYXNlLmpzLm1hcCIsImltcG9ydCB0b1N0cmluZyBmcm9tICcuL3RvLXN0cmluZyc7XG52YXIgdXBwZXJGaXJzdCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIHZhciBzdHIgPSB0b1N0cmluZyh2YWx1ZSk7XG4gICAgcmV0dXJuIHN0ci5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHN0ci5zdWJzdHJpbmcoMSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgdXBwZXJGaXJzdDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXVwcGVyLWZpcnN0LmpzLm1hcCIsInZhciB0b1N0cmluZyA9IHt9LnRvU3RyaW5nO1xudmFyIGdldFR5cGUgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICByZXR1cm4gdG9TdHJpbmcuY2FsbCh2YWx1ZSkucmVwbGFjZSgvXlxcW29iamVjdCAvLCAnJykucmVwbGFjZSgvXSQvLCAnJyk7XG59O1xuZXhwb3J0IGRlZmF1bHQgZ2V0VHlwZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdldC10eXBlLmpzLm1hcCIsIi8qKlxuICog5piv5ZCm5piv5Y+C5pWw57G75Z6LXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbHVlIOa1i+ivleeahOWAvFxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuaW1wb3J0IGlzVHlwZSBmcm9tICcuL2lzLXR5cGUnO1xudmFyIGlzQXJndW1lbnRzID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgcmV0dXJuIGlzVHlwZSh2YWx1ZSwgJ0FyZ3VtZW50cycpO1xufTtcbmV4cG9ydCBkZWZhdWx0IGlzQXJndW1lbnRzO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aXMtYXJndW1lbnRzLmpzLm1hcCIsIi8qKlxuICog5piv5ZCm5piv5biD5bCU57G75Z6LXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbHVlIOa1i+ivleeahOWAvFxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuaW1wb3J0IGlzVHlwZSBmcm9tICcuL2lzLXR5cGUnO1xudmFyIGlzQm9vbGVhbiA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIHJldHVybiBpc1R5cGUodmFsdWUsICdCb29sZWFuJyk7XG59O1xuZXhwb3J0IGRlZmF1bHQgaXNCb29sZWFuO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aXMtYm9vbGVhbi5qcy5tYXAiLCJpbXBvcnQgaXNUeXBlIGZyb20gJy4vaXMtdHlwZSc7XG52YXIgaXNEYXRlID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgcmV0dXJuIGlzVHlwZSh2YWx1ZSwgJ0RhdGUnKTtcbn07XG5leHBvcnQgZGVmYXVsdCBpc0RhdGU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pcy1kYXRlLmpzLm1hcCIsIi8qKlxuICog5piv5ZCm5piv5Y+C5pWw57G75Z6LXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbHVlIOa1i+ivleeahOWAvFxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuaW1wb3J0IGlzVHlwZSBmcm9tICcuL2lzLXR5cGUnO1xudmFyIGlzRXJyb3IgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICByZXR1cm4gaXNUeXBlKHZhbHVlLCAnRXJyb3InKTtcbn07XG5leHBvcnQgZGVmYXVsdCBpc0Vycm9yO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aXMtZXJyb3IuanMubWFwIiwiLyoqXG4gKiDliKTmlq3mmK/lkKbkuLrmnInpmZDmlbBcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmltcG9ydCBpc051bWJlciBmcm9tICcuL2lzLW51bWJlcic7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICByZXR1cm4gaXNOdW1iZXIodmFsdWUpICYmIGlzRmluaXRlKHZhbHVlKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWlzLWZpbml0ZS5qcy5tYXAiLCJ2YXIgaXNOdWxsID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSBudWxsO1xufTtcbmV4cG9ydCBkZWZhdWx0IGlzTnVsbDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWlzLW51bGwuanMubWFwIiwidmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcbnZhciBpc1Byb3RvdHlwZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIHZhciBDdG9yID0gdmFsdWUgJiYgdmFsdWUuY29uc3RydWN0b3I7XG4gICAgdmFyIHByb3RvID0gKHR5cGVvZiBDdG9yID09PSAnZnVuY3Rpb24nICYmIEN0b3IucHJvdG90eXBlKSB8fCBvYmplY3RQcm90bztcbiAgICByZXR1cm4gdmFsdWUgPT09IHByb3RvO1xufTtcbmV4cG9ydCBkZWZhdWx0IGlzUHJvdG90eXBlO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aXMtcHJvdG90eXBlLmpzLm1hcCIsImltcG9ydCBpc1R5cGUgZnJvbSAnLi9pcy10eXBlJztcbnZhciBpc1JlZ0V4cCA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgICByZXR1cm4gaXNUeXBlKHN0ciwgJ1JlZ0V4cCcpO1xufTtcbmV4cG9ydCBkZWZhdWx0IGlzUmVnRXhwO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aXMtcmVnLWV4cC5qcy5tYXAiLCJ2YXIgaXNVbmRlZmluZWQgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZDtcbn07XG5leHBvcnQgZGVmYXVsdCBpc1VuZGVmaW5lZDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWlzLXVuZGVmaW5lZC5qcy5tYXAiLCIvKipcbiAqIOWIpOaWreaYr+WQpkhUTUzlhYPntKBcbiAqIEByZXR1cm4ge0Jvb2xlYW59IOaYr+WQpkhUTUzlhYPntKBcbiAqL1xudmFyIGlzRWxlbWVudCA9IGZ1bmN0aW9uIChvKSB7XG4gICAgcmV0dXJuIG8gaW5zdGFuY2VvZiBFbGVtZW50IHx8IG8gaW5zdGFuY2VvZiBIVE1MRG9jdW1lbnQ7XG59O1xuZXhwb3J0IGRlZmF1bHQgaXNFbGVtZW50O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aXMtZWxlbWVudC5qcy5tYXAiLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZm4pIHtcbiAgICB2YXIgbWV0aG9kID0gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSB8fFxuICAgICAgICB3aW5kb3cud2Via2l0UmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgd2luZG93Lm1velJlcXVlc3RBbmltYXRpb25GcmFtZSB8fFxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHdpbmRvdy5tc1JlcXVlc3RBbmltYXRpb25GcmFtZSB8fFxuICAgICAgICBmdW5jdGlvbiAoZikge1xuICAgICAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZiwgMTYpO1xuICAgICAgICB9O1xuICAgIHJldHVybiBtZXRob2QoZm4pO1xufVxuO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmVxdWVzdC1hbmltYXRpb24tZnJhbWUuanMubWFwIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY2FuY2VsQW5pbWF0aW9uRnJhbWUoaGFuZGxlcikge1xuICAgIHZhciBtZXRob2QgPSB3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUgfHxcbiAgICAgICAgd2luZG93LndlYmtpdENhbmNlbEFuaW1hdGlvbkZyYW1lIHx8XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgd2luZG93Lm1vekNhbmNlbEFuaW1hdGlvbkZyYW1lIHx8XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgd2luZG93Lm1zQ2FuY2VsQW5pbWF0aW9uRnJhbWUgfHxcbiAgICAgICAgY2xlYXJUaW1lb3V0O1xuICAgIG1ldGhvZChoYW5kbGVyKTtcbn1cbjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNsZWFyLWFuaW1hdGlvbi1mcmFtZS5qcy5tYXAiLCIvLyBGSVhNRTogTXV0YWJsZSBwYXJhbSBzaG91bGQgYmUgZm9yYmlkZGVuIGluIHN0YXRpYyBsYW5nLlxuZnVuY3Rpb24gX21peChkaXN0LCBvYmopIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG4gICAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSAmJiBrZXkgIT09ICdjb25zdHJ1Y3RvcicgJiYgb2JqW2tleV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZGlzdFtrZXldID0gb2JqW2tleV07XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtaXgoZGlzdCwgc3JjMSwgc3JjMiwgc3JjMykge1xuICAgIGlmIChzcmMxKVxuICAgICAgICBfbWl4KGRpc3QsIHNyYzEpO1xuICAgIGlmIChzcmMyKVxuICAgICAgICBfbWl4KGRpc3QsIHNyYzIpO1xuICAgIGlmIChzcmMzKVxuICAgICAgICBfbWl4KGRpc3QsIHNyYzMpO1xuICAgIHJldHVybiBkaXN0O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWl4LmpzLm1hcCIsImltcG9ydCBtaXggZnJvbSAnLi9taXgnO1xuaW1wb3J0IGlzRnVuY3Rpb24gZnJvbSAnLi9pcy1mdW5jdGlvbic7XG52YXIgYXVnbWVudCA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgYXJncyA9IFtdO1xuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICB9XG4gICAgdmFyIGMgPSBhcmdzWzBdO1xuICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJncy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgb2JqID0gYXJnc1tpXTtcbiAgICAgICAgaWYgKGlzRnVuY3Rpb24ob2JqKSkge1xuICAgICAgICAgICAgb2JqID0gb2JqLnByb3RvdHlwZTtcbiAgICAgICAgfVxuICAgICAgICBtaXgoYy5wcm90b3R5cGUsIG9iaik7XG4gICAgfVxufTtcbmV4cG9ydCBkZWZhdWx0IGF1Z21lbnQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hdWdtZW50LmpzLm1hcCIsImltcG9ydCBpc0FycmF5IGZyb20gJy4vaXMtYXJyYXknO1xudmFyIGNsb25lID0gZnVuY3Rpb24gKG9iaikge1xuICAgIGlmICh0eXBlb2Ygb2JqICE9PSAnb2JqZWN0JyB8fCBvYmogPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG9iajtcbiAgICB9XG4gICAgdmFyIHJzdDtcbiAgICBpZiAoaXNBcnJheShvYmopKSB7XG4gICAgICAgIHJzdCA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IG9iai5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb2JqW2ldID09PSAnb2JqZWN0JyAmJiBvYmpbaV0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJzdFtpXSA9IGNsb25lKG9ialtpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByc3RbaV0gPSBvYmpbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJzdCA9IHt9O1xuICAgICAgICBmb3IgKHZhciBrIGluIG9iaikge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBvYmpba10gPT09ICdvYmplY3QnICYmIG9ialtrXSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcnN0W2tdID0gY2xvbmUob2JqW2tdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJzdFtrXSA9IG9ialtrXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcnN0O1xufTtcbmV4cG9ydCBkZWZhdWx0IGNsb25lO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y2xvbmUuanMubWFwIiwiZnVuY3Rpb24gZGVib3VuY2UoZnVuYywgd2FpdCwgaW1tZWRpYXRlKSB7XG4gICAgdmFyIHRpbWVvdXQ7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGNvbnRleHQgPSB0aGlzLCBhcmdzID0gYXJndW1lbnRzO1xuICAgICAgICB2YXIgbGF0ZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0aW1lb3V0ID0gbnVsbDtcbiAgICAgICAgICAgIGlmICghaW1tZWRpYXRlKSB7XG4gICAgICAgICAgICAgICAgZnVuYy5hcHBseShjb250ZXh0LCBhcmdzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdmFyIGNhbGxOb3cgPSBpbW1lZGlhdGUgJiYgIXRpbWVvdXQ7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgdGltZW91dCA9IHNldFRpbWVvdXQobGF0ZXIsIHdhaXQpO1xuICAgICAgICBpZiAoY2FsbE5vdykge1xuICAgICAgICAgICAgZnVuYy5hcHBseShjb250ZXh0LCBhcmdzKTtcbiAgICAgICAgfVxuICAgIH07XG59XG5leHBvcnQgZGVmYXVsdCBkZWJvdW5jZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRlYm91bmNlLmpzLm1hcCIsImltcG9ydCBpc0Z1bmN0aW9uIGZyb20gJy4vaXMtZnVuY3Rpb24nO1xuLyoqXG4gKiBfLm1lbW9pemUoY2FsQ29sb3IpO1xuICogXy5tZW1vaXplKGNhbENvbG9yLCAoLi4uYXJncykgPT4gYXJnc1swXSk7XG4gKiBAcGFyYW0gZlxuICogQHBhcmFtIHJlc29sdmVyXG4gKi9cbmV4cG9ydCBkZWZhdWx0IChmdW5jdGlvbiAoZiwgcmVzb2x2ZXIpIHtcbiAgICBpZiAoIWlzRnVuY3Rpb24oZikpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgYSBmdW5jdGlvbicpO1xuICAgIH1cbiAgICB2YXIgbWVtb2l6ZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBhcmdzID0gW107XG4gICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgIH1cbiAgICAgICAgLy8g5L2/55So5pa55rOV5p6E6YCgIGtlee+8jOWmguaenOS4jeWtmOWcqCByZXNvbHZlcu+8jOWImeebtOaOpeWPluesrOS4gOS4quWPguaVsOS9nOS4uiBrZXlcbiAgICAgICAgdmFyIGtleSA9IHJlc29sdmVyID8gcmVzb2x2ZXIuYXBwbHkodGhpcywgYXJncykgOiBhcmdzWzBdO1xuICAgICAgICB2YXIgY2FjaGUgPSBtZW1vaXplZC5jYWNoZTtcbiAgICAgICAgaWYgKGNhY2hlLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FjaGUuZ2V0KGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHJlc3VsdCA9IGYuYXBwbHkodGhpcywgYXJncyk7XG4gICAgICAgIC8vIOe8k+WtmOi1t+adpVxuICAgICAgICBjYWNoZS5zZXQoa2V5LCByZXN1bHQpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gICAgbWVtb2l6ZWQuY2FjaGUgPSBuZXcgTWFwKCk7XG4gICAgcmV0dXJuIG1lbW9pemVkO1xufSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tZW1vaXplLmpzLm1hcCIsImltcG9ydCBpc0FycmF5IGZyb20gJy4vaXMtYXJyYXknO1xuaW1wb3J0IGlzUGxhaW5PYmplY3QgZnJvbSAnLi9pcy1wbGFpbi1vYmplY3QnO1xudmFyIE1BWF9NSVhfTEVWRUwgPSA1O1xuZnVuY3Rpb24gX2RlZXBNaXgoZGlzdCwgc3JjLCBsZXZlbCwgbWF4TGV2ZWwpIHtcbiAgICBsZXZlbCA9IGxldmVsIHx8IDA7XG4gICAgbWF4TGV2ZWwgPSBtYXhMZXZlbCB8fCBNQVhfTUlYX0xFVkVMO1xuICAgIGZvciAodmFyIGtleSBpbiBzcmMpIHtcbiAgICAgICAgaWYgKHNyYy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgICB2YXIgdmFsdWUgPSBzcmNba2V5XTtcbiAgICAgICAgICAgIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiBpc1BsYWluT2JqZWN0KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGlmICghaXNQbGFpbk9iamVjdChkaXN0W2tleV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGRpc3Rba2V5XSA9IHt9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobGV2ZWwgPCBtYXhMZXZlbCkge1xuICAgICAgICAgICAgICAgICAgICBfZGVlcE1peChkaXN0W2tleV0sIHZhbHVlLCBsZXZlbCArIDEsIG1heExldmVsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRpc3Rba2V5XSA9IHNyY1trZXldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgZGlzdFtrZXldID0gW107XG4gICAgICAgICAgICAgICAgZGlzdFtrZXldID0gZGlzdFtrZXldLmNvbmNhdCh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgZGlzdFtrZXldID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4vLyB0b2RvIOmHjeWGmVxudmFyIGRlZXBNaXggPSBmdW5jdGlvbiAocnN0KSB7XG4gICAgdmFyIGFyZ3MgPSBbXTtcbiAgICBmb3IgKHZhciBfaSA9IDE7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICBhcmdzW19pIC0gMV0gPSBhcmd1bWVudHNbX2ldO1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgX2RlZXBNaXgocnN0LCBhcmdzW2ldKTtcbiAgICB9XG4gICAgcmV0dXJuIHJzdDtcbn07XG5leHBvcnQgZGVmYXVsdCBkZWVwTWl4O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGVlcC1taXguanMubWFwIiwiaW1wb3J0IG1peCBmcm9tICcuL21peCc7XG5pbXBvcnQgaXNGdW5jdGlvbiBmcm9tICcuL2lzLWZ1bmN0aW9uJztcbnZhciBleHRlbmQgPSBmdW5jdGlvbiAoc3ViY2xhc3MsIHN1cGVyY2xhc3MsIG92ZXJyaWRlcywgc3RhdGljT3ZlcnJpZGVzKSB7XG4gICAgLy8g5aaC5p6c5Y+q5o+Q5L6b54i257G75p6E6YCg5Ye95pWw77yM5YiZ6Ieq5Yqo55Sf5oiQ5a2Q57G75p6E6YCg5Ye95pWwXG4gICAgaWYgKCFpc0Z1bmN0aW9uKHN1cGVyY2xhc3MpKSB7XG4gICAgICAgIG92ZXJyaWRlcyA9IHN1cGVyY2xhc3M7XG4gICAgICAgIHN1cGVyY2xhc3MgPSBzdWJjbGFzcztcbiAgICAgICAgc3ViY2xhc3MgPSBmdW5jdGlvbiAoKSB7IH07XG4gICAgfVxuICAgIHZhciBjcmVhdGUgPSBPYmplY3QuY3JlYXRlID9cbiAgICAgICAgZnVuY3Rpb24gKHByb3RvLCBjKSB7XG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LmNyZWF0ZShwcm90bywge1xuICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBjXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gOlxuICAgICAgICBmdW5jdGlvbiAocHJvdG8sIGMpIHtcbiAgICAgICAgICAgIGZ1bmN0aW9uIFRtcCgpIHsgfVxuICAgICAgICAgICAgVG1wLnByb3RvdHlwZSA9IHByb3RvO1xuICAgICAgICAgICAgdmFyIG8gPSBuZXcgVG1wKCk7XG4gICAgICAgICAgICBvLmNvbnN0cnVjdG9yID0gYztcbiAgICAgICAgICAgIHJldHVybiBvO1xuICAgICAgICB9O1xuICAgIHZhciBzdXBlck9iaiA9IGNyZWF0ZShzdXBlcmNsYXNzLnByb3RvdHlwZSwgc3ViY2xhc3MpOyAvLyBuZXcgc3VwZXJjbGFzcygpLC8v5a6e5L6L5YyW54i257G75L2c5Li65a2Q57G755qEcHJvdG90eXBlXG4gICAgc3ViY2xhc3MucHJvdG90eXBlID0gbWl4KHN1cGVyT2JqLCBzdWJjbGFzcy5wcm90b3R5cGUpOyAvLyDmjIflrprlrZDnsbvnmoRwcm90b3R5cGVcbiAgICBzdWJjbGFzcy5zdXBlcmNsYXNzID0gY3JlYXRlKHN1cGVyY2xhc3MucHJvdG90eXBlLCBzdXBlcmNsYXNzKTtcbiAgICBtaXgoc3VwZXJPYmosIG92ZXJyaWRlcyk7XG4gICAgbWl4KHN1YmNsYXNzLCBzdGF0aWNPdmVycmlkZXMpO1xuICAgIHJldHVybiBzdWJjbGFzcztcbn07XG5leHBvcnQgZGVmYXVsdCBleHRlbmQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1leHRlbmQuanMubWFwIiwiaW1wb3J0IGlzQXJyYXlMaWtlIGZyb20gJy4vaXMtYXJyYXktbGlrZSc7XG52YXIgaW5kZXhPZiA9IGZ1bmN0aW9uIChhcnIsIG9iaikge1xuICAgIGlmICghaXNBcnJheUxpa2UoYXJyKSkge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgfVxuICAgIHZhciBtID0gQXJyYXkucHJvdG90eXBlLmluZGV4T2Y7XG4gICAgaWYgKG0pIHtcbiAgICAgICAgcmV0dXJuIG0uY2FsbChhcnIsIG9iaik7XG4gICAgfVxuICAgIHZhciBpbmRleCA9IC0xO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChhcnJbaV0gPT09IG9iaikge1xuICAgICAgICAgICAgaW5kZXggPSBpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGluZGV4O1xufTtcbmV4cG9ydCBkZWZhdWx0IGluZGV4T2Y7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC1vZi5qcy5tYXAiLCJpbXBvcnQgaXNOaWwgZnJvbSAnLi9pcy1uaWwnO1xuaW1wb3J0IGlzQXJyYXlMaWtlIGZyb20gJy4vaXMtYXJyYXktbGlrZSc7XG5pbXBvcnQgZ2V0VHlwZSBmcm9tICcuL2dldC10eXBlJztcbmltcG9ydCBpc1Byb3RvdHlwZSBmcm9tICcuL2lzLXByb3RvdHlwZSc7XG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuZnVuY3Rpb24gaXNFbXB0eSh2YWx1ZSkge1xuICAgIC8qKlxuICAgICAqIGlzRW1wdHkobnVsbCkgPT4gdHJ1ZVxuICAgICAqIGlzRW1wdHkoKSA9PiB0cnVlXG4gICAgICogaXNFbXB0eSh0cnVlKSA9PiB0cnVlXG4gICAgICogaXNFbXB0eSgxKSA9PiB0cnVlXG4gICAgICogaXNFbXB0eShbMSwgMiwgM10pID0+IGZhbHNlXG4gICAgICogaXNFbXB0eSgnYWJjJykgPT4gZmFsc2VcbiAgICAgKiBpc0VtcHR5KHsgYTogMSB9KSA9PiBmYWxzZVxuICAgICAqL1xuICAgIGlmIChpc05pbCh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChpc0FycmF5TGlrZSh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuICF2YWx1ZS5sZW5ndGg7XG4gICAgfVxuICAgIHZhciB0eXBlID0gZ2V0VHlwZSh2YWx1ZSk7XG4gICAgaWYgKHR5cGUgPT09ICdNYXAnIHx8IHR5cGUgPT09ICdTZXQnKSB7XG4gICAgICAgIHJldHVybiAhdmFsdWUuc2l6ZTtcbiAgICB9XG4gICAgaWYgKGlzUHJvdG90eXBlKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gIU9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGg7XG4gICAgfVxuICAgIGZvciAodmFyIGtleSBpbiB2YWx1ZSkge1xuICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwga2V5KSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuZXhwb3J0IGRlZmF1bHQgaXNFbXB0eTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWlzLWVtcHR5LmpzLm1hcCIsImltcG9ydCBpc09iamVjdExpa2UgZnJvbSAnLi9pcy1vYmplY3QtbGlrZSc7XG5pbXBvcnQgaXNBcnJheUxpa2UgZnJvbSAnLi9pcy1hcnJheS1saWtlJztcbmltcG9ydCBpc1N0cmluZyBmcm9tICcuL2lzLXN0cmluZyc7XG52YXIgaXNFcXVhbCA9IGZ1bmN0aW9uICh2YWx1ZSwgb3RoZXIpIHtcbiAgICBpZiAodmFsdWUgPT09IG90aGVyKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoIXZhbHVlIHx8ICFvdGhlcikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChpc1N0cmluZyh2YWx1ZSkgfHwgaXNTdHJpbmcob3RoZXIpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGlzQXJyYXlMaWtlKHZhbHVlKSB8fCBpc0FycmF5TGlrZShvdGhlcikpIHtcbiAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCAhPT0gb3RoZXIubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHJzdCA9IHRydWU7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHJzdCA9IGlzRXF1YWwodmFsdWVbaV0sIG90aGVyW2ldKTtcbiAgICAgICAgICAgIGlmICghcnN0KSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJzdDtcbiAgICB9XG4gICAgaWYgKGlzT2JqZWN0TGlrZSh2YWx1ZSkgfHwgaXNPYmplY3RMaWtlKG90aGVyKSkge1xuICAgICAgICB2YXIgdmFsdWVLZXlzID0gT2JqZWN0LmtleXModmFsdWUpO1xuICAgICAgICB2YXIgb3RoZXJLZXlzID0gT2JqZWN0LmtleXMob3RoZXIpO1xuICAgICAgICBpZiAodmFsdWVLZXlzLmxlbmd0aCAhPT0gb3RoZXJLZXlzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHZhciByc3QgPSB0cnVlO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlS2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgcnN0ID0gaXNFcXVhbCh2YWx1ZVt2YWx1ZUtleXNbaV1dLCBvdGhlclt2YWx1ZUtleXNbaV1dKTtcbiAgICAgICAgICAgIGlmICghcnN0KSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJzdDtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufTtcbmV4cG9ydCBkZWZhdWx0IGlzRXF1YWw7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pcy1lcXVhbC5qcy5tYXAiLCJpbXBvcnQgaXNGdW5jdGlvbiBmcm9tICcuL2lzLWZ1bmN0aW9uJztcbmltcG9ydCBpc0VxdWFsIGZyb20gJy4vaXMtZXF1YWwnO1xuLyoqXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtmbl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpc29ucy5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFsdWVzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIGZ1bmN0aW9uIGlzR3JlZXRpbmcodmFsdWUpIHtcbiAqICAgcmV0dXJuIC9eaCg/Oml8ZWxsbykkLy50ZXN0KHZhbHVlKTtcbiAqIH1cbiAqXG4gKiBmdW5jdGlvbiBjdXN0b21pemVyKG9ialZhbHVlLCBvdGhWYWx1ZSkge1xuICogICBpZiAoaXNHcmVldGluZyhvYmpWYWx1ZSkgJiYgaXNHcmVldGluZyhvdGhWYWx1ZSkpIHtcbiAqICAgICByZXR1cm4gdHJ1ZTtcbiAqICAgfVxuICogfVxuICpcbiAqIHZhciBhcnJheSA9IFsnaGVsbG8nLCAnZ29vZGJ5ZSddO1xuICogdmFyIG90aGVyID0gWydoaScsICdnb29kYnllJ107XG4gKlxuICogaXNFcXVhbFdpdGgoYXJyYXksIG90aGVyLCBjdXN0b21pemVyKTsgIC8vID0+IHRydWVcbiAqL1xuZXhwb3J0IGRlZmF1bHQgKGZ1bmN0aW9uICh2YWx1ZSwgb3RoZXIsIGZuKSB7XG4gICAgaWYgKCFpc0Z1bmN0aW9uKGZuKSkge1xuICAgICAgICByZXR1cm4gaXNFcXVhbCh2YWx1ZSwgb3RoZXIpO1xuICAgIH1cbiAgICByZXR1cm4gISFmbih2YWx1ZSwgb3RoZXIpO1xufSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pcy1lcXVhbC13aXRoLmpzLm1hcCIsImltcG9ydCBpc0FycmF5TGlrZSBmcm9tICcuL2lzLWFycmF5LWxpa2UnO1xudmFyIG1hcCA9IGZ1bmN0aW9uIChhcnIsIGZ1bmMpIHtcbiAgICBpZiAoIWlzQXJyYXlMaWtlKGFycikpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICByZXR1cm4gYXJyO1xuICAgIH1cbiAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IGFyci5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgdmFyIHZhbHVlID0gYXJyW2luZGV4XTtcbiAgICAgICAgcmVzdWx0LnB1c2goZnVuYyh2YWx1ZSwgaW5kZXgpKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5leHBvcnQgZGVmYXVsdCBtYXA7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tYXAuanMubWFwIiwiaW1wb3J0IGlzTmlsIGZyb20gJy4vaXMtbmlsJztcbmltcG9ydCBpc09iamVjdCBmcm9tICcuL2lzLW9iamVjdCc7XG52YXIgaWRlbnRpdHkgPSBmdW5jdGlvbiAodikgeyByZXR1cm4gdjsgfTtcbmV4cG9ydCBkZWZhdWx0IChmdW5jdGlvbiAob2JqZWN0LCBmdW5jKSB7XG4gICAgaWYgKGZ1bmMgPT09IHZvaWQgMCkgeyBmdW5jID0gaWRlbnRpdHk7IH1cbiAgICB2YXIgciA9IHt9O1xuICAgIGlmIChpc09iamVjdChvYmplY3QpICYmICFpc05pbChvYmplY3QpKSB7XG4gICAgICAgIE9iamVjdC5rZXlzKG9iamVjdCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICByW2tleV0gPSBmdW5jKG9iamVjdFtrZXldLCBrZXkpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHI7XG59KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1hcC12YWx1ZXMuanMubWFwIiwiaW1wb3J0IGlzU3RyaW5nIGZyb20gJy4vaXMtc3RyaW5nJztcbi8qKlxuICogaHR0cHM6Ly9naXRodWIuY29tL2RldmVsb3BpdC9kbHYvYmxvYi9tYXN0ZXIvaW5kZXguanNcbiAqIEBwYXJhbSBvYmpcbiAqIEBwYXJhbSBrZXlcbiAqIEBwYXJhbSBkZWZhdWx0VmFsdWVcbiAqL1xuZXhwb3J0IGRlZmF1bHQgKGZ1bmN0aW9uIChvYmosIGtleSwgZGVmYXVsdFZhbHVlKSB7XG4gICAgdmFyIHAgPSAwO1xuICAgIHZhciBrZXlBcnIgPSBpc1N0cmluZyhrZXkpID8ga2V5LnNwbGl0KCcuJykgOiBrZXk7XG4gICAgd2hpbGUgKG9iaiAmJiBwIDwga2V5QXJyLmxlbmd0aCkge1xuICAgICAgICBvYmogPSBvYmpba2V5QXJyW3ArK11dO1xuICAgIH1cbiAgICByZXR1cm4gKG9iaiA9PT0gdW5kZWZpbmVkIHx8IHAgPCBrZXlBcnIubGVuZ3RoKSA/IGRlZmF1bHRWYWx1ZSA6IG9iajtcbn0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z2V0LmpzLm1hcCIsImltcG9ydCBpc09iamVjdCBmcm9tICcuL2lzLW9iamVjdCc7XG5pbXBvcnQgaXNTdHJpbmcgZnJvbSAnLi9pcy1zdHJpbmcnO1xuaW1wb3J0IGlzTnVtYmVyIGZyb20gJy4vaXMtbnVtYmVyJztcbi8qKlxuICogaHR0cHM6Ly9naXRodWIuY29tL2RldmVsb3BpdC9kbHYvYmxvYi9tYXN0ZXIvaW5kZXguanNcbiAqIEBwYXJhbSBvYmpcbiAqIEBwYXJhbSBwYXRoXG4gKiBAcGFyYW0gdmFsdWVcbiAqL1xuZXhwb3J0IGRlZmF1bHQgKGZ1bmN0aW9uIChvYmosIHBhdGgsIHZhbHVlKSB7XG4gICAgdmFyIG8gPSBvYmo7XG4gICAgdmFyIGtleUFyciA9IGlzU3RyaW5nKHBhdGgpID8gcGF0aC5zcGxpdCgnLicpIDogcGF0aDtcbiAgICBrZXlBcnIuZm9yRWFjaChmdW5jdGlvbiAoa2V5LCBpZHgpIHtcbiAgICAgICAgLy8g5LiN5piv5pyA5ZCO5LiA5LiqXG4gICAgICAgIGlmIChpZHggPCBrZXlBcnIubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgaWYgKCFpc09iamVjdChvW2tleV0pKSB7XG4gICAgICAgICAgICAgICAgb1trZXldID0gaXNOdW1iZXIoa2V5QXJyW2lkeCArIDFdKSA/IFtdIDoge307XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvID0gb1trZXldO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgb1trZXldID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gb2JqO1xufSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zZXQuanMubWFwIiwiaW1wb3J0IGVhY2ggZnJvbSAnLi9lYWNoJztcbmltcG9ydCBpc1BsYWluT2JqZWN0IGZyb20gJy4vaXMtcGxhaW4tb2JqZWN0JztcbnZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5leHBvcnQgZGVmYXVsdCAoZnVuY3Rpb24gKG9iamVjdCwga2V5cykge1xuICAgIGlmIChvYmplY3QgPT09IG51bGwgfHwgIWlzUGxhaW5PYmplY3Qob2JqZWN0KSkge1xuICAgICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBlYWNoKGtleXMsIGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpKSB7XG4gICAgICAgICAgICByZXN1bHRba2V5XSA9IG9iamVjdFtrZXldO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cGljay5qcy5tYXAiLCJpbXBvcnQgcmVkdWNlIGZyb20gJy4vcmVkdWNlJztcbmV4cG9ydCBkZWZhdWx0IChmdW5jdGlvbiAob2JqLCBrZXlzKSB7XG4gICAgcmV0dXJuIHJlZHVjZShvYmosIGZ1bmN0aW9uIChyLCBjdXJyLCBrZXkpIHtcbiAgICAgICAgaWYgKCFrZXlzLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgICAgIHJba2V5XSA9IGN1cnI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHI7XG4gICAgfSwge30pO1xufSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1vbWl0LmpzLm1hcCIsImV4cG9ydCBkZWZhdWx0IChmdW5jdGlvbiAoZnVuYywgd2FpdCwgb3B0aW9ucykge1xuICAgIHZhciB0aW1lb3V0LCBjb250ZXh0LCBhcmdzLCByZXN1bHQ7XG4gICAgdmFyIHByZXZpb3VzID0gMDtcbiAgICBpZiAoIW9wdGlvbnMpXG4gICAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICB2YXIgbGF0ZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHByZXZpb3VzID0gb3B0aW9ucy5sZWFkaW5nID09PSBmYWxzZSA/IDAgOiBEYXRlLm5vdygpO1xuICAgICAgICB0aW1lb3V0ID0gbnVsbDtcbiAgICAgICAgcmVzdWx0ID0gZnVuYy5hcHBseShjb250ZXh0LCBhcmdzKTtcbiAgICAgICAgaWYgKCF0aW1lb3V0KVxuICAgICAgICAgICAgY29udGV4dCA9IGFyZ3MgPSBudWxsO1xuICAgIH07XG4gICAgdmFyIHRocm90dGxlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgIGlmICghcHJldmlvdXMgJiYgb3B0aW9ucy5sZWFkaW5nID09PSBmYWxzZSlcbiAgICAgICAgICAgIHByZXZpb3VzID0gbm93O1xuICAgICAgICB2YXIgcmVtYWluaW5nID0gd2FpdCAtIChub3cgLSBwcmV2aW91cyk7XG4gICAgICAgIGNvbnRleHQgPSB0aGlzO1xuICAgICAgICBhcmdzID0gYXJndW1lbnRzO1xuICAgICAgICBpZiAocmVtYWluaW5nIDw9IDAgfHwgcmVtYWluaW5nID4gd2FpdCkge1xuICAgICAgICAgICAgaWYgKHRpbWVvdXQpIHtcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICAgICAgICAgICAgdGltZW91dCA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwcmV2aW91cyA9IG5vdztcbiAgICAgICAgICAgIHJlc3VsdCA9IGZ1bmMuYXBwbHkoY29udGV4dCwgYXJncyk7XG4gICAgICAgICAgICBpZiAoIXRpbWVvdXQpXG4gICAgICAgICAgICAgICAgY29udGV4dCA9IGFyZ3MgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCF0aW1lb3V0ICYmIG9wdGlvbnMudHJhaWxpbmcgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICB0aW1lb3V0ID0gc2V0VGltZW91dChsYXRlciwgcmVtYWluaW5nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gICAgdGhyb3R0bGVkLmNhbmNlbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICBwcmV2aW91cyA9IDA7XG4gICAgICAgIHRpbWVvdXQgPSBjb250ZXh0ID0gYXJncyA9IG51bGw7XG4gICAgfTtcbiAgICByZXR1cm4gdGhyb3R0bGVkO1xufSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD10aHJvdHRsZS5qcy5tYXAiLCJpbXBvcnQgaXNBcnJheUxpa2UgZnJvbSAnLi9pcy1hcnJheS1saWtlJztcbmV4cG9ydCBkZWZhdWx0IChmdW5jdGlvbiAodmFsdWUpIHtcbiAgICByZXR1cm4gaXNBcnJheUxpa2UodmFsdWUpID8gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodmFsdWUpIDogW107XG59KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRvLWFycmF5LmpzLm1hcCIsInZhciBtYXAgPSB7fTtcbmV4cG9ydCBkZWZhdWx0IChmdW5jdGlvbiAocHJlZml4KSB7XG4gICAgcHJlZml4ID0gcHJlZml4IHx8ICdnJztcbiAgICBpZiAoIW1hcFtwcmVmaXhdKSB7XG4gICAgICAgIG1hcFtwcmVmaXhdID0gMTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIG1hcFtwcmVmaXhdICs9IDE7XG4gICAgfVxuICAgIHJldHVybiBwcmVmaXggKyBtYXBbcHJlZml4XTtcbn0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dW5pcXVlLWlkLmpzLm1hcCIsImV4cG9ydCBkZWZhdWx0IChmdW5jdGlvbiAoKSB7IH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bm9vcC5qcy5tYXAiLCJleHBvcnQgZGVmYXVsdCAoZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHY7IH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aWRlbnRpdHkuanMubWFwIiwiaW1wb3J0IGlzTmlsIGZyb20gJy4vaXMtbmlsJztcbmltcG9ydCBpc0FycmF5bGlrZSBmcm9tICcuL2lzLWFycmF5LWxpa2UnO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc2l6ZShvKSB7XG4gICAgaWYgKGlzTmlsKG8pKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICBpZiAoaXNBcnJheWxpa2UobykpIHtcbiAgICAgICAgcmV0dXJuIG8ubGVuZ3RoO1xuICAgIH1cbiAgICByZXR1cm4gT2JqZWN0LmtleXMobykubGVuZ3RoO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2l6ZS5qcy5tYXAiLCJpbXBvcnQgeyBfX3NwcmVhZEFycmF5cyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHZhbHVlcyBmcm9tICcuL3ZhbHVlcyc7XG5pbXBvcnQgbWVtb2l6ZSBmcm9tICcuL21lbW9pemUnO1xuaW1wb3J0IGlzU3RyaW5nIGZyb20gJy4vaXMtc3RyaW5nJztcbnZhciBjdHg7XG4vKipcbiAqIOiuoeeul+aWh+acrOeahOWuveW6plxuICovXG5leHBvcnQgZGVmYXVsdCBtZW1vaXplKGZ1bmN0aW9uICh0ZXh0LCBmb250KSB7XG4gICAgaWYgKGZvbnQgPT09IHZvaWQgMCkgeyBmb250ID0ge307IH1cbiAgICB2YXIgZm9udFNpemUgPSBmb250LmZvbnRTaXplLCBmb250RmFtaWx5ID0gZm9udC5mb250RmFtaWx5LCBmb250V2VpZ2h0ID0gZm9udC5mb250V2VpZ2h0LCBmb250U3R5bGUgPSBmb250LmZvbnRTdHlsZSwgZm9udFZhcmlhbnQgPSBmb250LmZvbnRWYXJpYW50O1xuICAgIGlmICghY3R4KSB7XG4gICAgICAgIGN0eCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpLmdldENvbnRleHQoJzJkJyk7XG4gICAgfVxuICAgIGN0eC5mb250ID0gW2ZvbnRTdHlsZSwgZm9udFZhcmlhbnQsIGZvbnRXZWlnaHQsIGZvbnRTaXplICsgXCJweFwiLCBmb250RmFtaWx5XS5qb2luKCcgJyk7XG4gICAgcmV0dXJuIGN0eC5tZWFzdXJlVGV4dChpc1N0cmluZyh0ZXh0KSA/IHRleHQgOiAnJykud2lkdGg7XG59LCBmdW5jdGlvbiAodGV4dCwgZm9udCkge1xuICAgIGlmIChmb250ID09PSB2b2lkIDApIHsgZm9udCA9IHt9OyB9XG4gICAgcmV0dXJuIF9fc3ByZWFkQXJyYXlzKFt0ZXh0XSwgdmFsdWVzKGZvbnQpKS5qb2luKCcnKTtcbn0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWVhc3VyZS10ZXh0LXdpZHRoLmpzLm1hcCIsImltcG9ydCBpc1N0cmluZyBmcm9tICcuL2lzLXN0cmluZyc7XG5pbXBvcnQgdG9TdHJpbmcgZnJvbSAnLi90by1zdHJpbmcnO1xuaW1wb3J0IHsgZGVmYXVsdCBhcyBtZWFzdXJlVGV4dFdpZHRoIH0gZnJvbSAnLi9tZWFzdXJlLXRleHQtd2lkdGgnO1xuLyoqXG4gKiDojrflj5bmlofmnKznmoQgLi4uIOaWh+acrOOAglxuICog566X5rOV77yI5YeP5bCR5q+P5qyhIG1lYXN1cmVUZXh0IOeahOmVv+W6pu+8jG1lYXN1cmVUZXh0IOeahOaAp+iDvei3n+Wtl+espuS4suaXtumXtOebuOWFs++8ie+8mlxuICogMS4g5YWI6YCa6L+HIFNURVAg6YCQ5q2l6K6h566X77yM5om+5Yiw5pyA5ZCO5LiA5Liq5bCP5LqOIG1heFdpZHRoIOeahOWtl+espuS4slxuICogMi4g54S25ZCO5a+55pyA5ZCO6L+Z5Liq5a2X56ym5Liy5LqM5YiG6K6h566XXG4gKiBAcGFyYW0gdGV4dCDpnIDopoHorqHnrpfnmoTmlofmnKwsIOeUseS6juWOhuWPsuWOn+WboCDpmaTkuobmlK/mjIFzdHJpbmfvvIzov5jmlK/mjIHnqbrlgLwsbnVtYmVy5ZKM5pWw57uE562JXG4gKiBAcGFyYW0gbWF4V2lkdGgg5pyA5aSn5a695bqmXG4gKiBAcGFyYW0gZm9udCDlrZfkvZNcbiAqIEBwYXJhbSBzdHIg6KaB5pu/5o2i55qE5paH5pysXG4gKi9cbmV4cG9ydCBkZWZhdWx0IChmdW5jdGlvbiAodGV4dCwgbWF4V2lkdGgsIGZvbnQsIHN0cikge1xuICAgIGlmIChzdHIgPT09IHZvaWQgMCkgeyBzdHIgPSAnLi4uJzsgfVxuICAgIHZhciBTVEVQID0gMTY7IC8vIOavj+asoSAxNu+8jOiwg+WPguW3peeoi+W4iFxuICAgIHZhciBQTEFDRUhPTERFUl9XSURUSCA9IG1lYXN1cmVUZXh0V2lkdGgoc3RyLCBmb250KTtcbiAgICB2YXIgbGVmdFRleHQgPSAhaXNTdHJpbmcodGV4dCkgPyB0b1N0cmluZyh0ZXh0KSA6IHRleHQ7XG4gICAgdmFyIGxlZnRXaWR0aCA9IG1heFdpZHRoO1xuICAgIHZhciByID0gW107IC8vIOacgOe7iOeahOWIhuauteWtl+espuS4slxuICAgIHZhciBjdXJyZW50VGV4dDtcbiAgICB2YXIgY3VycmVudFdpZHRoO1xuICAgIGlmIChtZWFzdXJlVGV4dFdpZHRoKHRleHQsIGZvbnQpIDw9IG1heFdpZHRoKSB7XG4gICAgICAgIHJldHVybiB0ZXh0O1xuICAgIH1cbiAgICAvLyDpppblhYjpgJrov4cgc3RlcCDorqHnrpfvvIzmib7lh7rmnIDlpKfnmoTmnKrotoXlh7rplb/luqbnmoRcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc3RhbnQtY29uZGl0aW9uXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgLy8g5pu05paw5a2X56ym5LiyXG4gICAgICAgIGN1cnJlbnRUZXh0ID0gbGVmdFRleHQuc3Vic3RyKDAsIFNURVApO1xuICAgICAgICAvLyDorqHnrpflrr3luqZcbiAgICAgICAgY3VycmVudFdpZHRoID0gbWVhc3VyZVRleHRXaWR0aChjdXJyZW50VGV4dCwgZm9udCk7XG4gICAgICAgIC8vIOi2heWHuuWJqeS9meWuveW6pu+8jOWImeWBnOatolxuICAgICAgICBpZiAoY3VycmVudFdpZHRoICsgUExBQ0VIT0xERVJfV0lEVEggPiBsZWZ0V2lkdGgpIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50V2lkdGggPiBsZWZ0V2lkdGgpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByLnB1c2goY3VycmVudFRleHQpO1xuICAgICAgICAvLyDmsqHmnInotoXlh7rvvIzliJnorqHnrpfliankvZnlrr3luqZcbiAgICAgICAgbGVmdFdpZHRoIC09IGN1cnJlbnRXaWR0aDtcbiAgICAgICAgbGVmdFRleHQgPSBsZWZ0VGV4dC5zdWJzdHIoU1RFUCk7XG4gICAgICAgIC8vIOWtl+espuS4suaVtOS9k+ayoeaciei2heWHulxuICAgICAgICBpZiAoIWxlZnRUZXh0KSB7XG4gICAgICAgICAgICByZXR1cm4gci5qb2luKCcnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyDmnIDkuIvnmoTmnIDlkI7kuIDkuKogU1RFUO+8jOS9v+eUqCAxIOmAkuWinu+8iOeUqOS6jOWIhuaViOaenOabtOmrmO+8iVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zdGFudC1jb25kaXRpb25cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAvLyDmm7TmlrDlrZfnrKbkuLJcbiAgICAgICAgY3VycmVudFRleHQgPSBsZWZ0VGV4dC5zdWJzdHIoMCwgMSk7XG4gICAgICAgIC8vIOiuoeeul+WuveW6plxuICAgICAgICBjdXJyZW50V2lkdGggPSBtZWFzdXJlVGV4dFdpZHRoKGN1cnJlbnRUZXh0LCBmb250KTtcbiAgICAgICAgLy8g6LaF5Ye65Ymp5L2Z5a695bqm77yM5YiZ5YGc5q2iXG4gICAgICAgIGlmIChjdXJyZW50V2lkdGggKyBQTEFDRUhPTERFUl9XSURUSCA+IGxlZnRXaWR0aCkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgci5wdXNoKGN1cnJlbnRUZXh0KTtcbiAgICAgICAgLy8g5rKh5pyJ6LaF5Ye677yM5YiZ6K6h566X5Ymp5L2Z5a695bqmXG4gICAgICAgIGxlZnRXaWR0aCAtPSBjdXJyZW50V2lkdGg7XG4gICAgICAgIGxlZnRUZXh0ID0gbGVmdFRleHQuc3Vic3RyKDEpO1xuICAgICAgICBpZiAoIWxlZnRUZXh0KSB7XG4gICAgICAgICAgICByZXR1cm4gci5qb2luKCcnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gXCJcIiArIHIuam9pbignJykgKyBzdHI7XG59KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdldC1lbGxpcHNpcy10ZXh0LmpzLm1hcCIsIi8qKlxuICogay12IOWtmOWCqFxuICovXG52YXIgZGVmYXVsdF8xID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIGRlZmF1bHRfMSgpIHtcbiAgICAgICAgdGhpcy5tYXAgPSB7fTtcbiAgICB9XG4gICAgZGVmYXVsdF8xLnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hcFtrZXldICE9PSB1bmRlZmluZWQ7XG4gICAgfTtcbiAgICBkZWZhdWx0XzEucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChrZXksIGRlZikge1xuICAgICAgICB2YXIgdiA9IHRoaXMubWFwW2tleV07XG4gICAgICAgIHJldHVybiB2ID09PSB1bmRlZmluZWQgPyBkZWYgOiB2O1xuICAgIH07XG4gICAgZGVmYXVsdF8xLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgICAgICB0aGlzLm1hcFtrZXldID0gdmFsdWU7XG4gICAgfTtcbiAgICBkZWZhdWx0XzEucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLm1hcCA9IHt9O1xuICAgIH07XG4gICAgZGVmYXVsdF8xLnByb3RvdHlwZS5kZWxldGUgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLm1hcFtrZXldO1xuICAgIH07XG4gICAgZGVmYXVsdF8xLnByb3RvdHlwZS5zaXplID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5tYXApLmxlbmd0aDtcbiAgICB9O1xuICAgIHJldHVybiBkZWZhdWx0XzE7XG59KCkpO1xuZXhwb3J0IGRlZmF1bHQgZGVmYXVsdF8xO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y2FjaGUuanMubWFwIiwiLy8gYXJyYXlcbmV4cG9ydCB7IGRlZmF1bHQgYXMgY29udGFpbnMsIGRlZmF1bHQgYXMgaW5jbHVkZXMgfSBmcm9tICcuL2NvbnRhaW5zJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgZGlmZmVyZW5jZSB9IGZyb20gJy4vZGlmZmVyZW5jZSc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGZpbmQgfSBmcm9tICcuL2ZpbmQnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBmaW5kSW5kZXggfSBmcm9tICcuL2ZpbmQtaW5kZXgnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBmaXJzdFZhbHVlIH0gZnJvbSAnLi9maXJzdC12YWx1ZSc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGZsYXR0ZW4gfSBmcm9tICcuL2ZsYXR0ZW4nO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBmbGF0dGVuRGVlcCB9IGZyb20gJy4vZmxhdHRlbi1kZWVwJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgZ2V0UmFuZ2UgfSBmcm9tICcuL2dldC1yYW5nZSc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHB1bGwgfSBmcm9tICcuL3B1bGwnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBwdWxsQXQgfSBmcm9tICcuL3B1bGwtYXQnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyByZWR1Y2UgfSBmcm9tICcuL3JlZHVjZSc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHJlbW92ZSB9IGZyb20gJy4vcmVtb3ZlJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgc29ydEJ5IH0gZnJvbSAnLi9zb3J0LWJ5JztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdW5pb24gfSBmcm9tICcuL3VuaW9uJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdW5pcSB9IGZyb20gJy4vdW5pcSc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHZhbHVlc09mS2V5IH0gZnJvbSAnLi92YWx1ZXMtb2Yta2V5JztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaGVhZCB9IGZyb20gJy4vaGVhZCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGxhc3QgfSBmcm9tICcuL2xhc3QnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBzdGFydHNXaXRoIH0gZnJvbSAnLi9zdGFydHMtd2l0aCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGVuZHNXaXRoIH0gZnJvbSAnLi9lbmRzLXdpdGgnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBmaWx0ZXIgfSBmcm9tICcuL2ZpbHRlcic7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGV2ZXJ5IH0gZnJvbSAnLi9ldmVyeSc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHNvbWUgfSBmcm9tICcuL3NvbWUnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBncm91cCB9IGZyb20gJy4vZ3JvdXAnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBncm91cEJ5IH0gZnJvbSAnLi9ncm91cC1ieSc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGdyb3VwVG9NYXAgfSBmcm9tICcuL2dyb3VwLXRvLW1hcCc7XG4vLyBldmVudFxuZXhwb3J0IHsgZGVmYXVsdCBhcyBnZXRXcmFwQmVoYXZpb3IgfSBmcm9tICcuL2dldC13cmFwLWJlaGF2aW9yJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgd3JhcEJlaGF2aW9yIH0gZnJvbSAnLi93cmFwLWJlaGF2aW9yJztcbi8vIGZvcm1hdFxuZXhwb3J0IHsgZGVmYXVsdCBhcyBudW1iZXIyY29sb3IgfSBmcm9tICcuL251bWJlcjJjb2xvcic7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHBhcnNlUmFkaXVzIH0gZnJvbSAnLi9wYXJzZS1yYWRpdXMnO1xuLy8gbWF0aFxuZXhwb3J0IHsgZGVmYXVsdCBhcyBjbGFtcCB9IGZyb20gJy4vY2xhbXAnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBmaXhlZEJhc2UgfSBmcm9tICcuL2ZpeGVkLWJhc2UnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpc0RlY2ltYWwgfSBmcm9tICcuL2lzLWRlY2ltYWwnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpc0V2ZW4gfSBmcm9tICcuL2lzLWV2ZW4nO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpc0ludGVnZXIgfSBmcm9tICcuL2lzLWludGVnZXInO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpc05lZ2F0aXZlIH0gZnJvbSAnLi9pcy1uZWdhdGl2ZSc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGlzTnVtYmVyRXF1YWwgfSBmcm9tICcuL2lzLW51bWJlci1lcXVhbCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGlzT2RkIH0gZnJvbSAnLi9pcy1vZGQnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpc1Bvc2l0aXZlIH0gZnJvbSAnLi9pcy1wb3NpdGl2ZSc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIG1heCB9IGZyb20gJy4vbWF4JztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgbWF4QnkgfSBmcm9tICcuL21heC1ieSc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIG1pbiB9IGZyb20gJy4vbWluJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgbWluQnkgfSBmcm9tICcuL21pbi1ieSc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIG1vZCB9IGZyb20gJy4vbW9kJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdG9EZWdyZWUgfSBmcm9tICcuL3RvLWRlZ3JlZSc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHRvSW50ZWdlciB9IGZyb20gJy4vdG8taW50ZWdlcic7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHRvUmFkaWFuIH0gZnJvbSAnLi90by1yYWRpYW4nO1xuLy8gb2JqZWN0XG5leHBvcnQgeyBkZWZhdWx0IGFzIGZvckluIH0gZnJvbSAnLi9mb3ItaW4nO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBoYXMgfSBmcm9tICcuL2hhcyc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGhhc0tleSB9IGZyb20gJy4vaGFzLWtleSc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGhhc1ZhbHVlIH0gZnJvbSAnLi9oYXMtdmFsdWUnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBrZXlzIH0gZnJvbSAnLi9rZXlzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaXNNYXRjaCB9IGZyb20gJy4vaXMtbWF0Y2gnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB2YWx1ZXMgfSBmcm9tICcuL3ZhbHVlcyc7XG4vLyBzdHJpbmdcbmV4cG9ydCB7IGRlZmF1bHQgYXMgbG93ZXJDYXNlIH0gZnJvbSAnLi9sb3dlci1jYXNlJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgbG93ZXJGaXJzdCB9IGZyb20gJy4vbG93ZXItZmlyc3QnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBzdWJzdGl0dXRlIH0gZnJvbSAnLi9zdWJzdGl0dXRlJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdXBwZXJDYXNlIH0gZnJvbSAnLi91cHBlci1jYXNlJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdXBwZXJGaXJzdCB9IGZyb20gJy4vdXBwZXItZmlyc3QnO1xuLy8gdHlwZVxuZXhwb3J0IHsgZGVmYXVsdCBhcyBnZXRUeXBlIH0gZnJvbSAnLi9nZXQtdHlwZSc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGlzQXJndW1lbnRzIH0gZnJvbSAnLi9pcy1hcmd1bWVudHMnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpc0FycmF5IH0gZnJvbSAnLi9pcy1hcnJheSc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGlzQXJyYXlMaWtlIH0gZnJvbSAnLi9pcy1hcnJheS1saWtlJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaXNCb29sZWFuIH0gZnJvbSAnLi9pcy1ib29sZWFuJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaXNEYXRlIH0gZnJvbSAnLi9pcy1kYXRlJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaXNFcnJvciB9IGZyb20gJy4vaXMtZXJyb3InO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpc0Z1bmN0aW9uIH0gZnJvbSAnLi9pcy1mdW5jdGlvbic7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGlzRmluaXRlIH0gZnJvbSAnLi9pcy1maW5pdGUnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpc05pbCB9IGZyb20gJy4vaXMtbmlsJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaXNOdWxsIH0gZnJvbSAnLi9pcy1udWxsJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaXNOdW1iZXIgfSBmcm9tICcuL2lzLW51bWJlcic7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGlzT2JqZWN0IH0gZnJvbSAnLi9pcy1vYmplY3QnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpc09iamVjdExpa2UgfSBmcm9tICcuL2lzLW9iamVjdC1saWtlJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaXNQbGFpbk9iamVjdCB9IGZyb20gJy4vaXMtcGxhaW4tb2JqZWN0JztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaXNQcm90b3R5cGUgfSBmcm9tICcuL2lzLXByb3RvdHlwZSc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGlzUmVnRXhwIH0gZnJvbSAnLi9pcy1yZWctZXhwJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaXNTdHJpbmcgfSBmcm9tICcuL2lzLXN0cmluZyc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGlzVHlwZSB9IGZyb20gJy4vaXMtdHlwZSc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGlzVW5kZWZpbmVkIH0gZnJvbSAnLi9pcy11bmRlZmluZWQnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpc0VsZW1lbnQgfSBmcm9tICcuL2lzLWVsZW1lbnQnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfSBmcm9tICcuL3JlcXVlc3QtYW5pbWF0aW9uLWZyYW1lJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgY2xlYXJBbmltYXRpb25GcmFtZSB9IGZyb20gJy4vY2xlYXItYW5pbWF0aW9uLWZyYW1lJztcbi8vIG90aGVyXG5leHBvcnQgeyBkZWZhdWx0IGFzIGF1Z21lbnQgfSBmcm9tICcuL2F1Z21lbnQnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBjbG9uZSB9IGZyb20gJy4vY2xvbmUnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBkZWJvdW5jZSB9IGZyb20gJy4vZGVib3VuY2UnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBtZW1vaXplIH0gZnJvbSAnLi9tZW1vaXplJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgZGVlcE1peCB9IGZyb20gJy4vZGVlcC1taXgnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBlYWNoIH0gZnJvbSAnLi9lYWNoJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgZXh0ZW5kIH0gZnJvbSAnLi9leHRlbmQnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpbmRleE9mIH0gZnJvbSAnLi9pbmRleC1vZic7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGlzRW1wdHkgfSBmcm9tICcuL2lzLWVtcHR5JztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaXNFcXVhbCB9IGZyb20gJy4vaXMtZXF1YWwnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpc0VxdWFsV2l0aCB9IGZyb20gJy4vaXMtZXF1YWwtd2l0aCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIG1hcCB9IGZyb20gJy4vbWFwJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgbWFwVmFsdWVzIH0gZnJvbSAnLi9tYXAtdmFsdWVzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgbWl4LCBkZWZhdWx0IGFzIGFzc2lnbiB9IGZyb20gJy4vbWl4JztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgZ2V0IH0gZnJvbSAnLi9nZXQnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBzZXQgfSBmcm9tICcuL3NldCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHBpY2sgfSBmcm9tICcuL3BpY2snO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBvbWl0IH0gZnJvbSAnLi9vbWl0JztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdGhyb3R0bGUgfSBmcm9tICcuL3Rocm90dGxlJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdG9BcnJheSB9IGZyb20gJy4vdG8tYXJyYXknO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB0b1N0cmluZyB9IGZyb20gJy4vdG8tc3RyaW5nJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdW5pcXVlSWQgfSBmcm9tICcuL3VuaXF1ZS1pZCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIG5vb3AgfSBmcm9tICcuL25vb3AnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpZGVudGl0eSB9IGZyb20gJy4vaWRlbnRpdHknO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBzaXplIH0gZnJvbSAnLi9zaXplJztcbi8vIHRleHRcbmV4cG9ydCB7IGRlZmF1bHQgYXMgbWVhc3VyZVRleHRXaWR0aCB9IGZyb20gJy4vbWVhc3VyZS10ZXh0LXdpZHRoJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgZ2V0RWxsaXBzaXNUZXh0IH0gZnJvbSAnLi9nZXQtZWxsaXBzaXMtdGV4dCc7XG4vLyDkuI3nn6XpgZPkuLrku4DkuYjvvIzpnIDopoHmiorov5nkuKogZXhwb3J077yM5LiN54S2IHRzIOS8muaKpeexu+Wei+mUmeivr1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBDYWNoZSB9IGZyb20gJy4vY2FjaGUnO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///0\n')},function(module,__webpack_exports__,__webpack_require__){"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__extends", function() { return __extends; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__assign", function() { return __assign; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__rest", function() { return __rest; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__decorate", function() { return __decorate; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__param", function() { return __param; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__metadata", function() { return __metadata; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__awaiter", function() { return __awaiter; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__generator", function() { return __generator; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__createBinding", function() { return __createBinding; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__exportStar", function() { return __exportStar; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__values", function() { return __values; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__read", function() { return __read; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__spread", function() { return __spread; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__spreadArrays", function() { return __spreadArrays; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__spreadArray", function() { return __spreadArray; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__await", function() { return __await; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__asyncGenerator", function() { return __asyncGenerator; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__asyncDelegator", function() { return __asyncDelegator; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__asyncValues", function() { return __asyncValues; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__makeTemplateObject", function() { return __makeTemplateObject; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__importStar", function() { return __importStar; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__importDefault", function() { return __importDefault; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__classPrivateFieldGet", function() { return __classPrivateFieldGet; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__classPrivateFieldSet", function() { return __classPrivateFieldSet; });\n/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nfunction __extends(d, b) {\r\n if (typeof b !== "function" && b !== null)\r\n throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nvar __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nfunction __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === "function")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nfunction __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nfunction __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nfunction __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nfunction __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nfunction __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError("Generator is already executing.");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nvar __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nfunction __exportStar(m, o) {\r\n for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nfunction __values(o) {\r\n var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === "number") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");\r\n}\r\n\r\nfunction __read(o, n) {\r\n var m = typeof Symbol === "function" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i["return"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nfunction __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nfunction __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nfunction __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nfunction __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nfunction __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume("next", value); }\r\n function reject(value) { resume("throw", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nfunction __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === "return" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nfunction __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nfunction __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, "default", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o["default"] = v;\r\n};\r\n\r\nfunction __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nfunction __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nfunction __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");\r\n if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");\r\n return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nfunction __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === "m") throw new TypeError("Private method is not writable");\r\n if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");\r\n if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");\r\n return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHNsaWIvdHNsaWIuZXM2LmpzPzlhYjQiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxVQUFVLGdCQUFnQixzQ0FBc0MsaUJBQWlCLEVBQUU7QUFDbkYseUJBQXlCLDhFQUE4RTtBQUN2RztBQUNBOztBQUVPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLHNCQUFzQjtBQUN6QztBQUNBOztBQUVPO0FBQ1A7QUFDQSxnREFBZ0QsT0FBTztBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNERBQTRELGNBQWM7QUFDMUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFTztBQUNQO0FBQ0E7QUFDQSw0Q0FBNEMsUUFBUTtBQUNwRDtBQUNBOztBQUVPO0FBQ1AsbUNBQW1DLG9DQUFvQztBQUN2RTs7QUFFTztBQUNQO0FBQ0E7O0FBRU87QUFDUCwyQkFBMkIsK0RBQStELGdCQUFnQixFQUFFLEVBQUU7QUFDOUc7QUFDQSxtQ0FBbUMsTUFBTSw2QkFBNkIsRUFBRSxZQUFZLFdBQVcsRUFBRTtBQUNqRyxrQ0FBa0MsTUFBTSxpQ0FBaUMsRUFBRSxZQUFZLFdBQVcsRUFBRTtBQUNwRywrQkFBK0IscUZBQXFGO0FBQ3BIO0FBQ0EsS0FBSztBQUNMOztBQUVPO0FBQ1AsYUFBYSw2QkFBNkIsMEJBQTBCLGFBQWEsRUFBRSxxQkFBcUI7QUFDeEcsZ0JBQWdCLHFEQUFxRCxvRUFBb0UsYUFBYSxFQUFFO0FBQ3hKLHNCQUFzQixzQkFBc0IscUJBQXFCLEdBQUc7QUFDcEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDO0FBQ3ZDLGtDQUFrQyxTQUFTO0FBQzNDLGtDQUFrQyxXQUFXLFVBQVU7QUFDdkQseUNBQXlDLGNBQWM7QUFDdkQ7QUFDQSw2R0FBNkcsT0FBTyxVQUFVO0FBQzlILGdGQUFnRixpQkFBaUIsT0FBTztBQUN4Ryx3REFBd0QsZ0JBQWdCLFFBQVEsT0FBTztBQUN2Riw4Q0FBOEMsZ0JBQWdCLGdCQUFnQixPQUFPO0FBQ3JGO0FBQ0EsaUNBQWlDO0FBQ2pDO0FBQ0E7QUFDQSxTQUFTLFlBQVksYUFBYSxPQUFPLEVBQUUsVUFBVSxXQUFXO0FBQ2hFLG1DQUFtQyxTQUFTO0FBQzVDO0FBQ0E7O0FBRU87QUFDUDtBQUNBLGtDQUFrQyxvQ0FBb0MsYUFBYSxFQUFFLEVBQUU7QUFDdkYsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDOztBQUVNO0FBQ1A7QUFDQTs7QUFFTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7O0FBRU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsTUFBTSxnQkFBZ0I7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsc0JBQXNCO0FBQ3ZDO0FBQ0E7QUFDQTs7QUFFQTtBQUNPO0FBQ1AsNEJBQTRCLHNCQUFzQjtBQUNsRDtBQUNBO0FBQ0E7O0FBRUE7QUFDTztBQUNQLGlEQUFpRCxRQUFRO0FBQ3pELHdDQUF3QyxRQUFRO0FBQ2hELHdEQUF3RCxRQUFRO0FBQ2hFO0FBQ0E7QUFDQTs7QUFFTztBQUNQLDRFQUE0RSxPQUFPO0FBQ25GO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVPO0FBQ1A7QUFDQTs7QUFFTztBQUNQO0FBQ0E7QUFDQSxpQkFBaUIsc0ZBQXNGLGFBQWEsRUFBRTtBQUN0SCxzQkFBc0IsZ0NBQWdDLHFDQUFxQywwQ0FBMEMsRUFBRSxFQUFFLEdBQUc7QUFDNUksMkJBQTJCLE1BQU0sZUFBZSxFQUFFLFlBQVksb0JBQW9CLEVBQUU7QUFDcEYsc0JBQXNCLG9HQUFvRztBQUMxSCw2QkFBNkIsdUJBQXVCO0FBQ3BELDRCQUE0Qix3QkFBd0I7QUFDcEQsMkJBQTJCLHlEQUF5RDtBQUNwRjs7QUFFTztBQUNQO0FBQ0EsaUJBQWlCLDRDQUE0QyxTQUFTLEVBQUUscURBQXFELGFBQWEsRUFBRTtBQUM1SSx5QkFBeUIsNkJBQTZCLG9CQUFvQixnREFBZ0QsZ0JBQWdCLEVBQUUsS0FBSztBQUNqSjs7QUFFTztBQUNQO0FBQ0E7QUFDQSwyR0FBMkcsc0ZBQXNGLGFBQWEsRUFBRTtBQUNoTixzQkFBc0IsOEJBQThCLGdEQUFnRCx1REFBdUQsRUFBRSxFQUFFLEdBQUc7QUFDbEssNENBQTRDLHNDQUFzQyxVQUFVLG9CQUFvQixFQUFFLEVBQUUsVUFBVTtBQUM5SDs7QUFFTztBQUNQLGdDQUFnQyx1Q0FBdUMsYUFBYSxFQUFFLEVBQUUsT0FBTyxrQkFBa0I7QUFDakg7QUFDQTs7QUFFQTtBQUNBLHlDQUF5Qyw2QkFBNkI7QUFDdEUsQ0FBQztBQUNEO0FBQ0E7O0FBRU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRU87QUFDUCw0Q0FBNEM7QUFDNUM7O0FBRU87QUFDUDtBQUNBO0FBQ0E7QUFDQTs7QUFFTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiMS5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cclxuXHJcblBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueVxyXG5wdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuXHJcblxyXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIXHJcblJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWVxyXG5BTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsXHJcbklORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTVxyXG5MT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUlxyXG5PVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SXHJcblBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuXHJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbi8qIGdsb2JhbCBSZWZsZWN0LCBQcm9taXNlICovXHJcblxyXG52YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uKGQsIGIpIHtcclxuICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcclxuICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XHJcbiAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcclxuICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXh0ZW5kcyhkLCBiKSB7XHJcbiAgICBpZiAodHlwZW9mIGIgIT09IFwiZnVuY3Rpb25cIiAmJiBiICE9PSBudWxsKVxyXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcclxuICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cclxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcclxufVxyXG5cclxuZXhwb3J0IHZhciBfX2Fzc2lnbiA9IGZ1bmN0aW9uKCkge1xyXG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIF9fYXNzaWduKHQpIHtcclxuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcclxuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcclxuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0W3BdID0gc1twXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVzdChzLCBlKSB7XHJcbiAgICB2YXIgdCA9IHt9O1xyXG4gICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXHJcbiAgICAgICAgdFtwXSA9IHNbcF07XHJcbiAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXHJcbiAgICAgICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcclxuICAgICAgICB9XHJcbiAgICByZXR1cm4gdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcclxuICAgIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCwgciA9IGMgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSA6IGRlc2MsIGQ7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xyXG4gICAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcclxuICAgIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3BhcmFtKHBhcmFtSW5kZXgsIGRlY29yYXRvcikge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIGtleSkgeyBkZWNvcmF0b3IodGFyZ2V0LCBrZXksIHBhcmFtSW5kZXgpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKSB7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QubWV0YWRhdGEgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIFJlZmxlY3QubWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xyXG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XHJcbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cclxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZ2VuZXJhdG9yKHRoaXNBcmcsIGJvZHkpIHtcclxuICAgIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGc7XHJcbiAgICByZXR1cm4gZyA9IHsgbmV4dDogdmVyYigwKSwgXCJ0aHJvd1wiOiB2ZXJiKDEpLCBcInJldHVyblwiOiB2ZXJiKDIpIH0sIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc3RlcChvcCkge1xyXG4gICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcclxuICAgICAgICB3aGlsZSAoXykgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xyXG4gICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XHJcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxyXG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgdmFyIF9fY3JlYXRlQmluZGluZyA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcclxuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfSk7XHJcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XHJcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xyXG4gICAgb1trMl0gPSBtW2tdO1xyXG59KTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2V4cG9ydFN0YXIobSwgbykge1xyXG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvLCBwKSkgX19jcmVhdGVCaW5kaW5nKG8sIG0sIHApO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX192YWx1ZXMobykge1xyXG4gICAgdmFyIHMgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLml0ZXJhdG9yLCBtID0gcyAmJiBvW3NdLCBpID0gMDtcclxuICAgIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pO1xyXG4gICAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSByZXR1cm4ge1xyXG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcclxuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9O1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHMgPyBcIk9iamVjdCBpcyBub3QgaXRlcmFibGUuXCIgOiBcIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3JlYWQobywgbikge1xyXG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xyXG4gICAgaWYgKCFtKSByZXR1cm4gbztcclxuICAgIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlO1xyXG4gICAgdHJ5IHtcclxuICAgICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxyXG4gICAgZmluYWxseSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZpbmFsbHkgeyBpZiAoZSkgdGhyb3cgZS5lcnJvcjsgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG4vKiogQGRlcHJlY2F0ZWQgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkKCkge1xyXG4gICAgZm9yICh2YXIgYXIgPSBbXSwgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgYXIgPSBhci5jb25jYXQoX19yZWFkKGFyZ3VtZW50c1tpXSkpO1xyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG4vKiogQGRlcHJlY2F0ZWQgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXlzKCkge1xyXG4gICAgZm9yICh2YXIgcyA9IDAsIGkgPSAwLCBpbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBpbDsgaSsrKSBzICs9IGFyZ3VtZW50c1tpXS5sZW5ndGg7XHJcbiAgICBmb3IgKHZhciByID0gQXJyYXkocyksIGsgPSAwLCBpID0gMDsgaSA8IGlsOyBpKyspXHJcbiAgICAgICAgZm9yICh2YXIgYSA9IGFyZ3VtZW50c1tpXSwgaiA9IDAsIGpsID0gYS5sZW5ndGg7IGogPCBqbDsgaisrLCBrKyspXHJcbiAgICAgICAgICAgIHJba10gPSBhW2pdO1xyXG4gICAgcmV0dXJuIHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5KHRvLCBmcm9tLCBwYWNrKSB7XHJcbiAgICBpZiAocGFjayB8fCBhcmd1bWVudHMubGVuZ3RoID09PSAyKSBmb3IgKHZhciBpID0gMCwgbCA9IGZyb20ubGVuZ3RoLCBhcjsgaSA8IGw7IGkrKykge1xyXG4gICAgICAgIGlmIChhciB8fCAhKGkgaW4gZnJvbSkpIHtcclxuICAgICAgICAgICAgaWYgKCFhcikgYXIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tLCAwLCBpKTtcclxuICAgICAgICAgICAgYXJbaV0gPSBmcm9tW2ldO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0by5jb25jYXQoYXIgfHwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSkpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdCh2KSB7XHJcbiAgICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIF9fYXdhaXQgPyAodGhpcy52ID0gdiwgdGhpcykgOiBuZXcgX19hd2FpdCh2KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNHZW5lcmF0b3IodGhpc0FyZywgX2FyZ3VtZW50cywgZ2VuZXJhdG9yKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIGcgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSksIGksIHEgPSBbXTtcclxuICAgIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyBpZiAoZ1tuXSkgaVtuXSA9IGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAoYSwgYikgeyBxLnB1c2goW24sIHYsIGEsIGJdKSA+IDEgfHwgcmVzdW1lKG4sIHYpOyB9KTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gcmVzdW1lKG4sIHYpIHsgdHJ5IHsgc3RlcChnW25dKHYpKTsgfSBjYXRjaCAoZSkgeyBzZXR0bGUocVswXVszXSwgZSk7IH0gfVxyXG4gICAgZnVuY3Rpb24gc3RlcChyKSB7IHIudmFsdWUgaW5zdGFuY2VvZiBfX2F3YWl0ID8gUHJvbWlzZS5yZXNvbHZlKHIudmFsdWUudikudGhlbihmdWxmaWxsLCByZWplY3QpIDogc2V0dGxlKHFbMF1bMl0sIHIpOyB9XHJcbiAgICBmdW5jdGlvbiBmdWxmaWxsKHZhbHVlKSB7IHJlc3VtZShcIm5leHRcIiwgdmFsdWUpOyB9XHJcbiAgICBmdW5jdGlvbiByZWplY3QodmFsdWUpIHsgcmVzdW1lKFwidGhyb3dcIiwgdmFsdWUpOyB9XHJcbiAgICBmdW5jdGlvbiBzZXR0bGUoZiwgdikgeyBpZiAoZih2KSwgcS5zaGlmdCgpLCBxLmxlbmd0aCkgcmVzdW1lKHFbMF1bMF0sIHFbMF1bMV0pOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jRGVsZWdhdG9yKG8pIHtcclxuICAgIHZhciBpLCBwO1xyXG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiLCBmdW5jdGlvbiAoZSkgeyB0aHJvdyBlOyB9KSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobiwgZikgeyBpW25dID0gb1tuXSA/IGZ1bmN0aW9uICh2KSB7IHJldHVybiAocCA9ICFwKSA/IHsgdmFsdWU6IF9fYXdhaXQob1tuXSh2KSksIGRvbmU6IG4gPT09IFwicmV0dXJuXCIgfSA6IGYgPyBmKHYpIDogdjsgfSA6IGY7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNWYWx1ZXMobykge1xyXG4gICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgIHZhciBtID0gb1tTeW1ib2wuYXN5bmNJdGVyYXRvcl0sIGk7XHJcbiAgICByZXR1cm4gbSA/IG0uY2FsbChvKSA6IChvID0gdHlwZW9mIF9fdmFsdWVzID09PSBcImZ1bmN0aW9uXCIgPyBfX3ZhbHVlcyhvKSA6IG9bU3ltYm9sLml0ZXJhdG9yXSgpLCBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaSk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgaVtuXSA9IG9bbl0gJiYgZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsgdiA9IG9bbl0odiksIHNldHRsZShyZXNvbHZlLCByZWplY3QsIHYuZG9uZSwgdi52YWx1ZSk7IH0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCBkLCB2KSB7IFByb21pc2UucmVzb2x2ZSh2KS50aGVuKGZ1bmN0aW9uKHYpIHsgcmVzb2x2ZSh7IHZhbHVlOiB2LCBkb25lOiBkIH0pOyB9LCByZWplY3QpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ha2VUZW1wbGF0ZU9iamVjdChjb29rZWQsIHJhdykge1xyXG4gICAgaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29va2VkLCBcInJhd1wiLCB7IHZhbHVlOiByYXcgfSk7IH0gZWxzZSB7IGNvb2tlZC5yYXcgPSByYXc7IH1cclxuICAgIHJldHVybiBjb29rZWQ7XHJcbn07XHJcblxyXG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XHJcbn0pIDogZnVuY3Rpb24obywgdikge1xyXG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0U3Rhcihtb2QpIHtcclxuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XHJcbiAgICB2YXIgcmVzdWx0ID0ge307XHJcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XHJcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0RGVmYXVsdChtb2QpIHtcclxuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgZGVmYXVsdDogbW9kIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHJlY2VpdmVyLCBzdGF0ZSwga2luZCwgZikge1xyXG4gICAgaWYgKGtpbmQgPT09IFwiYVwiICYmICFmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgZ2V0dGVyXCIpO1xyXG4gICAgaWYgKHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgIT09IHN0YXRlIHx8ICFmIDogIXN0YXRlLmhhcyhyZWNlaXZlcikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgcmVhZCBwcml2YXRlIG1lbWJlciBmcm9tIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7XHJcbiAgICByZXR1cm4ga2luZCA9PT0gXCJtXCIgPyBmIDoga2luZCA9PT0gXCJhXCIgPyBmLmNhbGwocmVjZWl2ZXIpIDogZiA/IGYudmFsdWUgOiBzdGF0ZS5nZXQocmVjZWl2ZXIpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZFNldChyZWNlaXZlciwgc3RhdGUsIHZhbHVlLCBraW5kLCBmKSB7XHJcbiAgICBpZiAoa2luZCA9PT0gXCJtXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIG1ldGhvZCBpcyBub3Qgd3JpdGFibGVcIik7XHJcbiAgICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBzZXR0ZXJcIik7XHJcbiAgICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCB3cml0ZSBwcml2YXRlIG1lbWJlciB0byBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xyXG4gICAgcmV0dXJuIChraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlciwgdmFsdWUpIDogZiA/IGYudmFsdWUgPSB2YWx1ZSA6IHN0YXRlLnNldChyZWNlaXZlciwgdmFsdWUpKSwgdmFsdWU7XHJcbn1cclxuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///1\n')},function(module,__webpack_exports__,__webpack_require__){"use strict";eval('\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, "a", function() { return /* reexport */ mat3_namespaceObject; });\n__webpack_require__.d(__webpack_exports__, "b", function() { return /* reexport */ mat4_namespaceObject; });\n__webpack_require__.d(__webpack_exports__, "c", function() { return /* reexport */ quat_namespaceObject; });\n__webpack_require__.d(__webpack_exports__, "d", function() { return /* reexport */ vec2; });\n__webpack_require__.d(__webpack_exports__, "e", function() { return /* reexport */ vec3; });\n__webpack_require__.d(__webpack_exports__, "f", function() { return /* reexport */ vec4_namespaceObject; });\n\n// UNUSED EXPORTS: glMatrix, mat2, mat2d, quat2\n\n// NAMESPACE OBJECT: ./node_modules/gl-matrix/esm/mat3.js\nvar mat3_namespaceObject = {};\n__webpack_require__.r(mat3_namespaceObject);\n__webpack_require__.d(mat3_namespaceObject, "create", function() { return create; });\n__webpack_require__.d(mat3_namespaceObject, "fromMat4", function() { return fromMat4; });\n__webpack_require__.d(mat3_namespaceObject, "clone", function() { return clone; });\n__webpack_require__.d(mat3_namespaceObject, "copy", function() { return copy; });\n__webpack_require__.d(mat3_namespaceObject, "fromValues", function() { return fromValues; });\n__webpack_require__.d(mat3_namespaceObject, "set", function() { return set; });\n__webpack_require__.d(mat3_namespaceObject, "identity", function() { return identity; });\n__webpack_require__.d(mat3_namespaceObject, "transpose", function() { return transpose; });\n__webpack_require__.d(mat3_namespaceObject, "invert", function() { return invert; });\n__webpack_require__.d(mat3_namespaceObject, "adjoint", function() { return adjoint; });\n__webpack_require__.d(mat3_namespaceObject, "determinant", function() { return determinant; });\n__webpack_require__.d(mat3_namespaceObject, "multiply", function() { return multiply; });\n__webpack_require__.d(mat3_namespaceObject, "translate", function() { return translate; });\n__webpack_require__.d(mat3_namespaceObject, "rotate", function() { return rotate; });\n__webpack_require__.d(mat3_namespaceObject, "scale", function() { return mat3_scale; });\n__webpack_require__.d(mat3_namespaceObject, "fromTranslation", function() { return fromTranslation; });\n__webpack_require__.d(mat3_namespaceObject, "fromRotation", function() { return fromRotation; });\n__webpack_require__.d(mat3_namespaceObject, "fromScaling", function() { return fromScaling; });\n__webpack_require__.d(mat3_namespaceObject, "fromMat2d", function() { return fromMat2d; });\n__webpack_require__.d(mat3_namespaceObject, "fromQuat", function() { return fromQuat; });\n__webpack_require__.d(mat3_namespaceObject, "normalFromMat4", function() { return normalFromMat4; });\n__webpack_require__.d(mat3_namespaceObject, "projection", function() { return projection; });\n__webpack_require__.d(mat3_namespaceObject, "str", function() { return str; });\n__webpack_require__.d(mat3_namespaceObject, "frob", function() { return frob; });\n__webpack_require__.d(mat3_namespaceObject, "add", function() { return add; });\n__webpack_require__.d(mat3_namespaceObject, "subtract", function() { return subtract; });\n__webpack_require__.d(mat3_namespaceObject, "multiplyScalar", function() { return multiplyScalar; });\n__webpack_require__.d(mat3_namespaceObject, "multiplyScalarAndAdd", function() { return multiplyScalarAndAdd; });\n__webpack_require__.d(mat3_namespaceObject, "exactEquals", function() { return exactEquals; });\n__webpack_require__.d(mat3_namespaceObject, "equals", function() { return equals; });\n__webpack_require__.d(mat3_namespaceObject, "mul", function() { return mul; });\n__webpack_require__.d(mat3_namespaceObject, "sub", function() { return sub; });\n\n// NAMESPACE OBJECT: ./node_modules/gl-matrix/esm/mat4.js\nvar mat4_namespaceObject = {};\n__webpack_require__.r(mat4_namespaceObject);\n__webpack_require__.d(mat4_namespaceObject, "create", function() { return mat4_create; });\n__webpack_require__.d(mat4_namespaceObject, "clone", function() { return mat4_clone; });\n__webpack_require__.d(mat4_namespaceObject, "copy", function() { return mat4_copy; });\n__webpack_require__.d(mat4_namespaceObject, "fromValues", function() { return mat4_fromValues; });\n__webpack_require__.d(mat4_namespaceObject, "set", function() { return mat4_set; });\n__webpack_require__.d(mat4_namespaceObject, "identity", function() { return mat4_identity; });\n__webpack_require__.d(mat4_namespaceObject, "transpose", function() { return mat4_transpose; });\n__webpack_require__.d(mat4_namespaceObject, "invert", function() { return mat4_invert; });\n__webpack_require__.d(mat4_namespaceObject, "adjoint", function() { return mat4_adjoint; });\n__webpack_require__.d(mat4_namespaceObject, "determinant", function() { return mat4_determinant; });\n__webpack_require__.d(mat4_namespaceObject, "multiply", function() { return mat4_multiply; });\n__webpack_require__.d(mat4_namespaceObject, "translate", function() { return mat4_translate; });\n__webpack_require__.d(mat4_namespaceObject, "scale", function() { return mat4_scale; });\n__webpack_require__.d(mat4_namespaceObject, "rotate", function() { return mat4_rotate; });\n__webpack_require__.d(mat4_namespaceObject, "rotateX", function() { return rotateX; });\n__webpack_require__.d(mat4_namespaceObject, "rotateY", function() { return rotateY; });\n__webpack_require__.d(mat4_namespaceObject, "rotateZ", function() { return rotateZ; });\n__webpack_require__.d(mat4_namespaceObject, "fromTranslation", function() { return mat4_fromTranslation; });\n__webpack_require__.d(mat4_namespaceObject, "fromScaling", function() { return mat4_fromScaling; });\n__webpack_require__.d(mat4_namespaceObject, "fromRotation", function() { return mat4_fromRotation; });\n__webpack_require__.d(mat4_namespaceObject, "fromXRotation", function() { return fromXRotation; });\n__webpack_require__.d(mat4_namespaceObject, "fromYRotation", function() { return fromYRotation; });\n__webpack_require__.d(mat4_namespaceObject, "fromZRotation", function() { return fromZRotation; });\n__webpack_require__.d(mat4_namespaceObject, "fromRotationTranslation", function() { return fromRotationTranslation; });\n__webpack_require__.d(mat4_namespaceObject, "fromQuat2", function() { return fromQuat2; });\n__webpack_require__.d(mat4_namespaceObject, "getTranslation", function() { return getTranslation; });\n__webpack_require__.d(mat4_namespaceObject, "getScaling", function() { return getScaling; });\n__webpack_require__.d(mat4_namespaceObject, "getRotation", function() { return getRotation; });\n__webpack_require__.d(mat4_namespaceObject, "fromRotationTranslationScale", function() { return fromRotationTranslationScale; });\n__webpack_require__.d(mat4_namespaceObject, "fromRotationTranslationScaleOrigin", function() { return fromRotationTranslationScaleOrigin; });\n__webpack_require__.d(mat4_namespaceObject, "fromQuat", function() { return mat4_fromQuat; });\n__webpack_require__.d(mat4_namespaceObject, "frustum", function() { return frustum; });\n__webpack_require__.d(mat4_namespaceObject, "perspectiveNO", function() { return perspectiveNO; });\n__webpack_require__.d(mat4_namespaceObject, "perspective", function() { return perspective; });\n__webpack_require__.d(mat4_namespaceObject, "perspectiveZO", function() { return perspectiveZO; });\n__webpack_require__.d(mat4_namespaceObject, "perspectiveFromFieldOfView", function() { return perspectiveFromFieldOfView; });\n__webpack_require__.d(mat4_namespaceObject, "orthoNO", function() { return orthoNO; });\n__webpack_require__.d(mat4_namespaceObject, "ortho", function() { return ortho; });\n__webpack_require__.d(mat4_namespaceObject, "orthoZO", function() { return orthoZO; });\n__webpack_require__.d(mat4_namespaceObject, "lookAt", function() { return lookAt; });\n__webpack_require__.d(mat4_namespaceObject, "targetTo", function() { return targetTo; });\n__webpack_require__.d(mat4_namespaceObject, "str", function() { return mat4_str; });\n__webpack_require__.d(mat4_namespaceObject, "frob", function() { return mat4_frob; });\n__webpack_require__.d(mat4_namespaceObject, "add", function() { return mat4_add; });\n__webpack_require__.d(mat4_namespaceObject, "subtract", function() { return mat4_subtract; });\n__webpack_require__.d(mat4_namespaceObject, "multiplyScalar", function() { return mat4_multiplyScalar; });\n__webpack_require__.d(mat4_namespaceObject, "multiplyScalarAndAdd", function() { return mat4_multiplyScalarAndAdd; });\n__webpack_require__.d(mat4_namespaceObject, "exactEquals", function() { return mat4_exactEquals; });\n__webpack_require__.d(mat4_namespaceObject, "equals", function() { return mat4_equals; });\n__webpack_require__.d(mat4_namespaceObject, "mul", function() { return mat4_mul; });\n__webpack_require__.d(mat4_namespaceObject, "sub", function() { return mat4_sub; });\n\n// NAMESPACE OBJECT: ./node_modules/gl-matrix/esm/vec4.js\nvar vec4_namespaceObject = {};\n__webpack_require__.r(vec4_namespaceObject);\n__webpack_require__.d(vec4_namespaceObject, "create", function() { return vec4_create; });\n__webpack_require__.d(vec4_namespaceObject, "clone", function() { return vec4_clone; });\n__webpack_require__.d(vec4_namespaceObject, "fromValues", function() { return vec4_fromValues; });\n__webpack_require__.d(vec4_namespaceObject, "copy", function() { return vec4_copy; });\n__webpack_require__.d(vec4_namespaceObject, "set", function() { return vec4_set; });\n__webpack_require__.d(vec4_namespaceObject, "add", function() { return vec4_add; });\n__webpack_require__.d(vec4_namespaceObject, "subtract", function() { return vec4_subtract; });\n__webpack_require__.d(vec4_namespaceObject, "multiply", function() { return vec4_multiply; });\n__webpack_require__.d(vec4_namespaceObject, "divide", function() { return divide; });\n__webpack_require__.d(vec4_namespaceObject, "ceil", function() { return ceil; });\n__webpack_require__.d(vec4_namespaceObject, "floor", function() { return floor; });\n__webpack_require__.d(vec4_namespaceObject, "min", function() { return min; });\n__webpack_require__.d(vec4_namespaceObject, "max", function() { return max; });\n__webpack_require__.d(vec4_namespaceObject, "round", function() { return round; });\n__webpack_require__.d(vec4_namespaceObject, "scale", function() { return vec4_scale; });\n__webpack_require__.d(vec4_namespaceObject, "scaleAndAdd", function() { return scaleAndAdd; });\n__webpack_require__.d(vec4_namespaceObject, "distance", function() { return distance; });\n__webpack_require__.d(vec4_namespaceObject, "squaredDistance", function() { return squaredDistance; });\n__webpack_require__.d(vec4_namespaceObject, "length", function() { return vec4_length; });\n__webpack_require__.d(vec4_namespaceObject, "squaredLength", function() { return squaredLength; });\n__webpack_require__.d(vec4_namespaceObject, "negate", function() { return negate; });\n__webpack_require__.d(vec4_namespaceObject, "inverse", function() { return inverse; });\n__webpack_require__.d(vec4_namespaceObject, "normalize", function() { return normalize; });\n__webpack_require__.d(vec4_namespaceObject, "dot", function() { return vec4_dot; });\n__webpack_require__.d(vec4_namespaceObject, "cross", function() { return cross; });\n__webpack_require__.d(vec4_namespaceObject, "lerp", function() { return lerp; });\n__webpack_require__.d(vec4_namespaceObject, "random", function() { return random; });\n__webpack_require__.d(vec4_namespaceObject, "transformMat4", function() { return transformMat4; });\n__webpack_require__.d(vec4_namespaceObject, "transformQuat", function() { return transformQuat; });\n__webpack_require__.d(vec4_namespaceObject, "zero", function() { return zero; });\n__webpack_require__.d(vec4_namespaceObject, "str", function() { return vec4_str; });\n__webpack_require__.d(vec4_namespaceObject, "exactEquals", function() { return vec4_exactEquals; });\n__webpack_require__.d(vec4_namespaceObject, "equals", function() { return vec4_equals; });\n__webpack_require__.d(vec4_namespaceObject, "sub", function() { return vec4_sub; });\n__webpack_require__.d(vec4_namespaceObject, "mul", function() { return vec4_mul; });\n__webpack_require__.d(vec4_namespaceObject, "div", function() { return div; });\n__webpack_require__.d(vec4_namespaceObject, "dist", function() { return dist; });\n__webpack_require__.d(vec4_namespaceObject, "sqrDist", function() { return sqrDist; });\n__webpack_require__.d(vec4_namespaceObject, "len", function() { return vec4_len; });\n__webpack_require__.d(vec4_namespaceObject, "sqrLen", function() { return sqrLen; });\n__webpack_require__.d(vec4_namespaceObject, "forEach", function() { return forEach; });\n\n// NAMESPACE OBJECT: ./node_modules/gl-matrix/esm/quat.js\nvar quat_namespaceObject = {};\n__webpack_require__.r(quat_namespaceObject);\n__webpack_require__.d(quat_namespaceObject, "create", function() { return quat_create; });\n__webpack_require__.d(quat_namespaceObject, "identity", function() { return quat_identity; });\n__webpack_require__.d(quat_namespaceObject, "setAxisAngle", function() { return setAxisAngle; });\n__webpack_require__.d(quat_namespaceObject, "getAxisAngle", function() { return getAxisAngle; });\n__webpack_require__.d(quat_namespaceObject, "getAngle", function() { return getAngle; });\n__webpack_require__.d(quat_namespaceObject, "multiply", function() { return quat_multiply; });\n__webpack_require__.d(quat_namespaceObject, "rotateX", function() { return quat_rotateX; });\n__webpack_require__.d(quat_namespaceObject, "rotateY", function() { return quat_rotateY; });\n__webpack_require__.d(quat_namespaceObject, "rotateZ", function() { return quat_rotateZ; });\n__webpack_require__.d(quat_namespaceObject, "calculateW", function() { return calculateW; });\n__webpack_require__.d(quat_namespaceObject, "exp", function() { return exp; });\n__webpack_require__.d(quat_namespaceObject, "ln", function() { return ln; });\n__webpack_require__.d(quat_namespaceObject, "pow", function() { return pow; });\n__webpack_require__.d(quat_namespaceObject, "slerp", function() { return slerp; });\n__webpack_require__.d(quat_namespaceObject, "random", function() { return quat_random; });\n__webpack_require__.d(quat_namespaceObject, "invert", function() { return quat_invert; });\n__webpack_require__.d(quat_namespaceObject, "conjugate", function() { return conjugate; });\n__webpack_require__.d(quat_namespaceObject, "fromMat3", function() { return fromMat3; });\n__webpack_require__.d(quat_namespaceObject, "fromEuler", function() { return fromEuler; });\n__webpack_require__.d(quat_namespaceObject, "str", function() { return quat_str; });\n__webpack_require__.d(quat_namespaceObject, "clone", function() { return quat_clone; });\n__webpack_require__.d(quat_namespaceObject, "fromValues", function() { return quat_fromValues; });\n__webpack_require__.d(quat_namespaceObject, "copy", function() { return quat_copy; });\n__webpack_require__.d(quat_namespaceObject, "set", function() { return quat_set; });\n__webpack_require__.d(quat_namespaceObject, "add", function() { return quat_add; });\n__webpack_require__.d(quat_namespaceObject, "mul", function() { return quat_mul; });\n__webpack_require__.d(quat_namespaceObject, "scale", function() { return quat_scale; });\n__webpack_require__.d(quat_namespaceObject, "dot", function() { return quat_dot; });\n__webpack_require__.d(quat_namespaceObject, "lerp", function() { return quat_lerp; });\n__webpack_require__.d(quat_namespaceObject, "length", function() { return quat_length; });\n__webpack_require__.d(quat_namespaceObject, "len", function() { return quat_len; });\n__webpack_require__.d(quat_namespaceObject, "squaredLength", function() { return quat_squaredLength; });\n__webpack_require__.d(quat_namespaceObject, "sqrLen", function() { return quat_sqrLen; });\n__webpack_require__.d(quat_namespaceObject, "normalize", function() { return quat_normalize; });\n__webpack_require__.d(quat_namespaceObject, "exactEquals", function() { return quat_exactEquals; });\n__webpack_require__.d(quat_namespaceObject, "equals", function() { return quat_equals; });\n__webpack_require__.d(quat_namespaceObject, "rotationTo", function() { return rotationTo; });\n__webpack_require__.d(quat_namespaceObject, "sqlerp", function() { return sqlerp; });\n__webpack_require__.d(quat_namespaceObject, "setAxes", function() { return setAxes; });\n\n// EXTERNAL MODULE: ./node_modules/gl-matrix/esm/common.js\nvar common = __webpack_require__(12);\n\n// CONCATENATED MODULE: ./node_modules/gl-matrix/esm/mat3.js\n\n/**\n * 3x3 Matrix\n * @module mat3\n */\n\n/**\n * Creates a new identity mat3\n *\n * @returns {mat3} a new 3x3 matrix\n */\n\nfunction create() {\n var out = new common["a" /* ARRAY_TYPE */](9);\n\n if (common["a" /* ARRAY_TYPE */] != Float32Array) {\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[5] = 0;\n out[6] = 0;\n out[7] = 0;\n }\n\n out[0] = 1;\n out[4] = 1;\n out[8] = 1;\n return out;\n}\n/**\n * Copies the upper-left 3x3 values into the given mat3.\n *\n * @param {mat3} out the receiving 3x3 matrix\n * @param {ReadonlyMat4} a the source 4x4 matrix\n * @returns {mat3} out\n */\n\nfunction fromMat4(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[4];\n out[4] = a[5];\n out[5] = a[6];\n out[6] = a[8];\n out[7] = a[9];\n out[8] = a[10];\n return out;\n}\n/**\n * Creates a new mat3 initialized with values from an existing matrix\n *\n * @param {ReadonlyMat3} a matrix to clone\n * @returns {mat3} a new 3x3 matrix\n */\n\nfunction clone(a) {\n var out = new common["a" /* ARRAY_TYPE */](9);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[8] = a[8];\n return out;\n}\n/**\n * Copy the values from one mat3 to another\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the source matrix\n * @returns {mat3} out\n */\n\nfunction copy(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[8] = a[8];\n return out;\n}\n/**\n * Create a new mat3 with the given values\n *\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\n * @param {Number} m10 Component in column 1, row 0 position (index 3)\n * @param {Number} m11 Component in column 1, row 1 position (index 4)\n * @param {Number} m12 Component in column 1, row 2 position (index 5)\n * @param {Number} m20 Component in column 2, row 0 position (index 6)\n * @param {Number} m21 Component in column 2, row 1 position (index 7)\n * @param {Number} m22 Component in column 2, row 2 position (index 8)\n * @returns {mat3} A new mat3\n */\n\nfunction fromValues(m00, m01, m02, m10, m11, m12, m20, m21, m22) {\n var out = new common["a" /* ARRAY_TYPE */](9);\n out[0] = m00;\n out[1] = m01;\n out[2] = m02;\n out[3] = m10;\n out[4] = m11;\n out[5] = m12;\n out[6] = m20;\n out[7] = m21;\n out[8] = m22;\n return out;\n}\n/**\n * Set the components of a mat3 to the given values\n *\n * @param {mat3} out the receiving matrix\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\n * @param {Number} m10 Component in column 1, row 0 position (index 3)\n * @param {Number} m11 Component in column 1, row 1 position (index 4)\n * @param {Number} m12 Component in column 1, row 2 position (index 5)\n * @param {Number} m20 Component in column 2, row 0 position (index 6)\n * @param {Number} m21 Component in column 2, row 1 position (index 7)\n * @param {Number} m22 Component in column 2, row 2 position (index 8)\n * @returns {mat3} out\n */\n\nfunction set(out, m00, m01, m02, m10, m11, m12, m20, m21, m22) {\n out[0] = m00;\n out[1] = m01;\n out[2] = m02;\n out[3] = m10;\n out[4] = m11;\n out[5] = m12;\n out[6] = m20;\n out[7] = m21;\n out[8] = m22;\n return out;\n}\n/**\n * Set a mat3 to the identity matrix\n *\n * @param {mat3} out the receiving matrix\n * @returns {mat3} out\n */\n\nfunction identity(out) {\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 1;\n out[5] = 0;\n out[6] = 0;\n out[7] = 0;\n out[8] = 1;\n return out;\n}\n/**\n * Transpose the values of a mat3\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the source matrix\n * @returns {mat3} out\n */\n\nfunction transpose(out, a) {\n // If we are transposing ourselves we can skip a few steps but have to cache some values\n if (out === a) {\n var a01 = a[1],\n a02 = a[2],\n a12 = a[5];\n out[1] = a[3];\n out[2] = a[6];\n out[3] = a01;\n out[5] = a[7];\n out[6] = a02;\n out[7] = a12;\n } else {\n out[0] = a[0];\n out[1] = a[3];\n out[2] = a[6];\n out[3] = a[1];\n out[4] = a[4];\n out[5] = a[7];\n out[6] = a[2];\n out[7] = a[5];\n out[8] = a[8];\n }\n\n return out;\n}\n/**\n * Inverts a mat3\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the source matrix\n * @returns {mat3} out\n */\n\nfunction invert(out, a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2];\n var a10 = a[3],\n a11 = a[4],\n a12 = a[5];\n var a20 = a[6],\n a21 = a[7],\n a22 = a[8];\n var b01 = a22 * a11 - a12 * a21;\n var b11 = -a22 * a10 + a12 * a20;\n var b21 = a21 * a10 - a11 * a20; // Calculate the determinant\n\n var det = a00 * b01 + a01 * b11 + a02 * b21;\n\n if (!det) {\n return null;\n }\n\n det = 1.0 / det;\n out[0] = b01 * det;\n out[1] = (-a22 * a01 + a02 * a21) * det;\n out[2] = (a12 * a01 - a02 * a11) * det;\n out[3] = b11 * det;\n out[4] = (a22 * a00 - a02 * a20) * det;\n out[5] = (-a12 * a00 + a02 * a10) * det;\n out[6] = b21 * det;\n out[7] = (-a21 * a00 + a01 * a20) * det;\n out[8] = (a11 * a00 - a01 * a10) * det;\n return out;\n}\n/**\n * Calculates the adjugate of a mat3\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the source matrix\n * @returns {mat3} out\n */\n\nfunction adjoint(out, a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2];\n var a10 = a[3],\n a11 = a[4],\n a12 = a[5];\n var a20 = a[6],\n a21 = a[7],\n a22 = a[8];\n out[0] = a11 * a22 - a12 * a21;\n out[1] = a02 * a21 - a01 * a22;\n out[2] = a01 * a12 - a02 * a11;\n out[3] = a12 * a20 - a10 * a22;\n out[4] = a00 * a22 - a02 * a20;\n out[5] = a02 * a10 - a00 * a12;\n out[6] = a10 * a21 - a11 * a20;\n out[7] = a01 * a20 - a00 * a21;\n out[8] = a00 * a11 - a01 * a10;\n return out;\n}\n/**\n * Calculates the determinant of a mat3\n *\n * @param {ReadonlyMat3} a the source matrix\n * @returns {Number} determinant of a\n */\n\nfunction determinant(a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2];\n var a10 = a[3],\n a11 = a[4],\n a12 = a[5];\n var a20 = a[6],\n a21 = a[7],\n a22 = a[8];\n return a00 * (a22 * a11 - a12 * a21) + a01 * (-a22 * a10 + a12 * a20) + a02 * (a21 * a10 - a11 * a20);\n}\n/**\n * Multiplies two mat3\'s\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the first operand\n * @param {ReadonlyMat3} b the second operand\n * @returns {mat3} out\n */\n\nfunction multiply(out, a, b) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2];\n var a10 = a[3],\n a11 = a[4],\n a12 = a[5];\n var a20 = a[6],\n a21 = a[7],\n a22 = a[8];\n var b00 = b[0],\n b01 = b[1],\n b02 = b[2];\n var b10 = b[3],\n b11 = b[4],\n b12 = b[5];\n var b20 = b[6],\n b21 = b[7],\n b22 = b[8];\n out[0] = b00 * a00 + b01 * a10 + b02 * a20;\n out[1] = b00 * a01 + b01 * a11 + b02 * a21;\n out[2] = b00 * a02 + b01 * a12 + b02 * a22;\n out[3] = b10 * a00 + b11 * a10 + b12 * a20;\n out[4] = b10 * a01 + b11 * a11 + b12 * a21;\n out[5] = b10 * a02 + b11 * a12 + b12 * a22;\n out[6] = b20 * a00 + b21 * a10 + b22 * a20;\n out[7] = b20 * a01 + b21 * a11 + b22 * a21;\n out[8] = b20 * a02 + b21 * a12 + b22 * a22;\n return out;\n}\n/**\n * Translate a mat3 by the given vector\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the matrix to translate\n * @param {ReadonlyVec2} v vector to translate by\n * @returns {mat3} out\n */\n\nfunction translate(out, a, v) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a10 = a[3],\n a11 = a[4],\n a12 = a[5],\n a20 = a[6],\n a21 = a[7],\n a22 = a[8],\n x = v[0],\n y = v[1];\n out[0] = a00;\n out[1] = a01;\n out[2] = a02;\n out[3] = a10;\n out[4] = a11;\n out[5] = a12;\n out[6] = x * a00 + y * a10 + a20;\n out[7] = x * a01 + y * a11 + a21;\n out[8] = x * a02 + y * a12 + a22;\n return out;\n}\n/**\n * Rotates a mat3 by the given angle\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat3} out\n */\n\nfunction rotate(out, a, rad) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a10 = a[3],\n a11 = a[4],\n a12 = a[5],\n a20 = a[6],\n a21 = a[7],\n a22 = a[8],\n s = Math.sin(rad),\n c = Math.cos(rad);\n out[0] = c * a00 + s * a10;\n out[1] = c * a01 + s * a11;\n out[2] = c * a02 + s * a12;\n out[3] = c * a10 - s * a00;\n out[4] = c * a11 - s * a01;\n out[5] = c * a12 - s * a02;\n out[6] = a20;\n out[7] = a21;\n out[8] = a22;\n return out;\n}\n/**\n * Scales the mat3 by the dimensions in the given vec2\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the matrix to rotate\n * @param {ReadonlyVec2} v the vec2 to scale the matrix by\n * @returns {mat3} out\n **/\n\nfunction mat3_scale(out, a, v) {\n var x = v[0],\n y = v[1];\n out[0] = x * a[0];\n out[1] = x * a[1];\n out[2] = x * a[2];\n out[3] = y * a[3];\n out[4] = y * a[4];\n out[5] = y * a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[8] = a[8];\n return out;\n}\n/**\n * Creates a matrix from a vector translation\n * This is equivalent to (but much faster than):\n *\n * mat3.identity(dest);\n * mat3.translate(dest, dest, vec);\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {ReadonlyVec2} v Translation vector\n * @returns {mat3} out\n */\n\nfunction fromTranslation(out, v) {\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 1;\n out[5] = 0;\n out[6] = v[0];\n out[7] = v[1];\n out[8] = 1;\n return out;\n}\n/**\n * Creates a matrix from a given angle\n * This is equivalent to (but much faster than):\n *\n * mat3.identity(dest);\n * mat3.rotate(dest, dest, rad);\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat3} out\n */\n\nfunction fromRotation(out, rad) {\n var s = Math.sin(rad),\n c = Math.cos(rad);\n out[0] = c;\n out[1] = s;\n out[2] = 0;\n out[3] = -s;\n out[4] = c;\n out[5] = 0;\n out[6] = 0;\n out[7] = 0;\n out[8] = 1;\n return out;\n}\n/**\n * Creates a matrix from a vector scaling\n * This is equivalent to (but much faster than):\n *\n * mat3.identity(dest);\n * mat3.scale(dest, dest, vec);\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {ReadonlyVec2} v Scaling vector\n * @returns {mat3} out\n */\n\nfunction fromScaling(out, v) {\n out[0] = v[0];\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = v[1];\n out[5] = 0;\n out[6] = 0;\n out[7] = 0;\n out[8] = 1;\n return out;\n}\n/**\n * Copies the values from a mat2d into a mat3\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat2d} a the matrix to copy\n * @returns {mat3} out\n **/\n\nfunction fromMat2d(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = 0;\n out[3] = a[2];\n out[4] = a[3];\n out[5] = 0;\n out[6] = a[4];\n out[7] = a[5];\n out[8] = 1;\n return out;\n}\n/**\n * Calculates a 3x3 matrix from the given quaternion\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {ReadonlyQuat} q Quaternion to create matrix from\n *\n * @returns {mat3} out\n */\n\nfunction fromQuat(out, q) {\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var yx = y * x2;\n var yy = y * y2;\n var zx = z * x2;\n var zy = z * y2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n out[0] = 1 - yy - zz;\n out[3] = yx - wz;\n out[6] = zx + wy;\n out[1] = yx + wz;\n out[4] = 1 - xx - zz;\n out[7] = zy - wx;\n out[2] = zx - wy;\n out[5] = zy + wx;\n out[8] = 1 - xx - yy;\n return out;\n}\n/**\n * Calculates a 3x3 normal matrix (transpose inverse) from the 4x4 matrix\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {ReadonlyMat4} a Mat4 to derive the normal matrix from\n *\n * @returns {mat3} out\n */\n\nfunction normalFromMat4(out, a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15];\n var b00 = a00 * a11 - a01 * a10;\n var b01 = a00 * a12 - a02 * a10;\n var b02 = a00 * a13 - a03 * a10;\n var b03 = a01 * a12 - a02 * a11;\n var b04 = a01 * a13 - a03 * a11;\n var b05 = a02 * a13 - a03 * a12;\n var b06 = a20 * a31 - a21 * a30;\n var b07 = a20 * a32 - a22 * a30;\n var b08 = a20 * a33 - a23 * a30;\n var b09 = a21 * a32 - a22 * a31;\n var b10 = a21 * a33 - a23 * a31;\n var b11 = a22 * a33 - a23 * a32; // Calculate the determinant\n\n var det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n\n if (!det) {\n return null;\n }\n\n det = 1.0 / det;\n out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;\n out[1] = (a12 * b08 - a10 * b11 - a13 * b07) * det;\n out[2] = (a10 * b10 - a11 * b08 + a13 * b06) * det;\n out[3] = (a02 * b10 - a01 * b11 - a03 * b09) * det;\n out[4] = (a00 * b11 - a02 * b08 + a03 * b07) * det;\n out[5] = (a01 * b08 - a00 * b10 - a03 * b06) * det;\n out[6] = (a31 * b05 - a32 * b04 + a33 * b03) * det;\n out[7] = (a32 * b02 - a30 * b05 - a33 * b01) * det;\n out[8] = (a30 * b04 - a31 * b02 + a33 * b00) * det;\n return out;\n}\n/**\n * Generates a 2D projection matrix with the given bounds\n *\n * @param {mat3} out mat3 frustum matrix will be written into\n * @param {number} width Width of your gl context\n * @param {number} height Height of gl context\n * @returns {mat3} out\n */\n\nfunction projection(out, width, height) {\n out[0] = 2 / width;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = -2 / height;\n out[5] = 0;\n out[6] = -1;\n out[7] = 1;\n out[8] = 1;\n return out;\n}\n/**\n * Returns a string representation of a mat3\n *\n * @param {ReadonlyMat3} a matrix to represent as a string\n * @returns {String} string representation of the matrix\n */\n\nfunction str(a) {\n return "mat3(" + a[0] + ", " + a[1] + ", " + a[2] + ", " + a[3] + ", " + a[4] + ", " + a[5] + ", " + a[6] + ", " + a[7] + ", " + a[8] + ")";\n}\n/**\n * Returns Frobenius norm of a mat3\n *\n * @param {ReadonlyMat3} a the matrix to calculate Frobenius norm of\n * @returns {Number} Frobenius norm\n */\n\nfunction frob(a) {\n return Math.hypot(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8]);\n}\n/**\n * Adds two mat3\'s\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the first operand\n * @param {ReadonlyMat3} b the second operand\n * @returns {mat3} out\n */\n\nfunction add(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n out[3] = a[3] + b[3];\n out[4] = a[4] + b[4];\n out[5] = a[5] + b[5];\n out[6] = a[6] + b[6];\n out[7] = a[7] + b[7];\n out[8] = a[8] + b[8];\n return out;\n}\n/**\n * Subtracts matrix b from matrix a\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the first operand\n * @param {ReadonlyMat3} b the second operand\n * @returns {mat3} out\n */\n\nfunction subtract(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n out[3] = a[3] - b[3];\n out[4] = a[4] - b[4];\n out[5] = a[5] - b[5];\n out[6] = a[6] - b[6];\n out[7] = a[7] - b[7];\n out[8] = a[8] - b[8];\n return out;\n}\n/**\n * Multiply each element of the matrix by a scalar.\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the matrix to scale\n * @param {Number} b amount to scale the matrix\'s elements by\n * @returns {mat3} out\n */\n\nfunction multiplyScalar(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n out[3] = a[3] * b;\n out[4] = a[4] * b;\n out[5] = a[5] * b;\n out[6] = a[6] * b;\n out[7] = a[7] * b;\n out[8] = a[8] * b;\n return out;\n}\n/**\n * Adds two mat3\'s after multiplying each element of the second operand by a scalar value.\n *\n * @param {mat3} out the receiving vector\n * @param {ReadonlyMat3} a the first operand\n * @param {ReadonlyMat3} b the second operand\n * @param {Number} scale the amount to scale b\'s elements by before adding\n * @returns {mat3} out\n */\n\nfunction multiplyScalarAndAdd(out, a, b, scale) {\n out[0] = a[0] + b[0] * scale;\n out[1] = a[1] + b[1] * scale;\n out[2] = a[2] + b[2] * scale;\n out[3] = a[3] + b[3] * scale;\n out[4] = a[4] + b[4] * scale;\n out[5] = a[5] + b[5] * scale;\n out[6] = a[6] + b[6] * scale;\n out[7] = a[7] + b[7] * scale;\n out[8] = a[8] + b[8] * scale;\n return out;\n}\n/**\n * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyMat3} a The first matrix.\n * @param {ReadonlyMat3} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\n\nfunction exactEquals(a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7] && a[8] === b[8];\n}\n/**\n * Returns whether or not the matrices have approximately the same elements in the same position.\n *\n * @param {ReadonlyMat3} a The first matrix.\n * @param {ReadonlyMat3} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\n\nfunction equals(a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2],\n a3 = a[3],\n a4 = a[4],\n a5 = a[5],\n a6 = a[6],\n a7 = a[7],\n a8 = a[8];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3],\n b4 = b[4],\n b5 = b[5],\n b6 = b[6],\n b7 = b[7],\n b8 = b[8];\n return Math.abs(a0 - b0) <= common["b" /* EPSILON */] * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= common["b" /* EPSILON */] * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= common["b" /* EPSILON */] * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= common["b" /* EPSILON */] * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= common["b" /* EPSILON */] * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= common["b" /* EPSILON */] * Math.max(1.0, Math.abs(a5), Math.abs(b5)) && Math.abs(a6 - b6) <= common["b" /* EPSILON */] * Math.max(1.0, Math.abs(a6), Math.abs(b6)) && Math.abs(a7 - b7) <= common["b" /* EPSILON */] * Math.max(1.0, Math.abs(a7), Math.abs(b7)) && Math.abs(a8 - b8) <= common["b" /* EPSILON */] * Math.max(1.0, Math.abs(a8), Math.abs(b8));\n}\n/**\n * Alias for {@link mat3.multiply}\n * @function\n */\n\nvar mul = multiply;\n/**\n * Alias for {@link mat3.subtract}\n * @function\n */\n\nvar sub = subtract;\n// CONCATENATED MODULE: ./node_modules/gl-matrix/esm/mat4.js\n\n/**\n * 4x4 Matrix
Format: column-major, when typed out it looks like row-major
The matrices are being post multiplied.\n * @module mat4\n */\n\n/**\n * Creates a new identity mat4\n *\n * @returns {mat4} a new 4x4 matrix\n */\n\nfunction mat4_create() {\n var out = new common["a" /* ARRAY_TYPE */](16);\n\n if (common["a" /* ARRAY_TYPE */] != Float32Array) {\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n }\n\n out[0] = 1;\n out[5] = 1;\n out[10] = 1;\n out[15] = 1;\n return out;\n}\n/**\n * Creates a new mat4 initialized with values from an existing matrix\n *\n * @param {ReadonlyMat4} a matrix to clone\n * @returns {mat4} a new 4x4 matrix\n */\n\nfunction mat4_clone(a) {\n var out = new common["a" /* ARRAY_TYPE */](16);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[8] = a[8];\n out[9] = a[9];\n out[10] = a[10];\n out[11] = a[11];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n return out;\n}\n/**\n * Copy the values from one mat4 to another\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the source matrix\n * @returns {mat4} out\n */\n\nfunction mat4_copy(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[8] = a[8];\n out[9] = a[9];\n out[10] = a[10];\n out[11] = a[11];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n return out;\n}\n/**\n * Create a new mat4 with the given values\n *\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\n * @param {Number} m03 Component in column 0, row 3 position (index 3)\n * @param {Number} m10 Component in column 1, row 0 position (index 4)\n * @param {Number} m11 Component in column 1, row 1 position (index 5)\n * @param {Number} m12 Component in column 1, row 2 position (index 6)\n * @param {Number} m13 Component in column 1, row 3 position (index 7)\n * @param {Number} m20 Component in column 2, row 0 position (index 8)\n * @param {Number} m21 Component in column 2, row 1 position (index 9)\n * @param {Number} m22 Component in column 2, row 2 position (index 10)\n * @param {Number} m23 Component in column 2, row 3 position (index 11)\n * @param {Number} m30 Component in column 3, row 0 position (index 12)\n * @param {Number} m31 Component in column 3, row 1 position (index 13)\n * @param {Number} m32 Component in column 3, row 2 position (index 14)\n * @param {Number} m33 Component in column 3, row 3 position (index 15)\n * @returns {mat4} A new mat4\n */\n\nfunction mat4_fromValues(m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) {\n var out = new common["a" /* ARRAY_TYPE */](16);\n out[0] = m00;\n out[1] = m01;\n out[2] = m02;\n out[3] = m03;\n out[4] = m10;\n out[5] = m11;\n out[6] = m12;\n out[7] = m13;\n out[8] = m20;\n out[9] = m21;\n out[10] = m22;\n out[11] = m23;\n out[12] = m30;\n out[13] = m31;\n out[14] = m32;\n out[15] = m33;\n return out;\n}\n/**\n * Set the components of a mat4 to the given values\n *\n * @param {mat4} out the receiving matrix\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\n * @param {Number} m03 Component in column 0, row 3 position (index 3)\n * @param {Number} m10 Component in column 1, row 0 position (index 4)\n * @param {Number} m11 Component in column 1, row 1 position (index 5)\n * @param {Number} m12 Component in column 1, row 2 position (index 6)\n * @param {Number} m13 Component in column 1, row 3 position (index 7)\n * @param {Number} m20 Component in column 2, row 0 position (index 8)\n * @param {Number} m21 Component in column 2, row 1 position (index 9)\n * @param {Number} m22 Component in column 2, row 2 position (index 10)\n * @param {Number} m23 Component in column 2, row 3 position (index 11)\n * @param {Number} m30 Component in column 3, row 0 position (index 12)\n * @param {Number} m31 Component in column 3, row 1 position (index 13)\n * @param {Number} m32 Component in column 3, row 2 position (index 14)\n * @param {Number} m33 Component in column 3, row 3 position (index 15)\n * @returns {mat4} out\n */\n\nfunction mat4_set(out, m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) {\n out[0] = m00;\n out[1] = m01;\n out[2] = m02;\n out[3] = m03;\n out[4] = m10;\n out[5] = m11;\n out[6] = m12;\n out[7] = m13;\n out[8] = m20;\n out[9] = m21;\n out[10] = m22;\n out[11] = m23;\n out[12] = m30;\n out[13] = m31;\n out[14] = m32;\n out[15] = m33;\n return out;\n}\n/**\n * Set a mat4 to the identity matrix\n *\n * @param {mat4} out the receiving matrix\n * @returns {mat4} out\n */\n\nfunction mat4_identity(out) {\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = 1;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 1;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\n * Transpose the values of a mat4\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the source matrix\n * @returns {mat4} out\n */\n\nfunction mat4_transpose(out, a) {\n // If we are transposing ourselves we can skip a few steps but have to cache some values\n if (out === a) {\n var a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a12 = a[6],\n a13 = a[7];\n var a23 = a[11];\n out[1] = a[4];\n out[2] = a[8];\n out[3] = a[12];\n out[4] = a01;\n out[6] = a[9];\n out[7] = a[13];\n out[8] = a02;\n out[9] = a12;\n out[11] = a[14];\n out[12] = a03;\n out[13] = a13;\n out[14] = a23;\n } else {\n out[0] = a[0];\n out[1] = a[4];\n out[2] = a[8];\n out[3] = a[12];\n out[4] = a[1];\n out[5] = a[5];\n out[6] = a[9];\n out[7] = a[13];\n out[8] = a[2];\n out[9] = a[6];\n out[10] = a[10];\n out[11] = a[14];\n out[12] = a[3];\n out[13] = a[7];\n out[14] = a[11];\n out[15] = a[15];\n }\n\n return out;\n}\n/**\n * Inverts a mat4\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the source matrix\n * @returns {mat4} out\n */\n\nfunction mat4_invert(out, a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15];\n var b00 = a00 * a11 - a01 * a10;\n var b01 = a00 * a12 - a02 * a10;\n var b02 = a00 * a13 - a03 * a10;\n var b03 = a01 * a12 - a02 * a11;\n var b04 = a01 * a13 - a03 * a11;\n var b05 = a02 * a13 - a03 * a12;\n var b06 = a20 * a31 - a21 * a30;\n var b07 = a20 * a32 - a22 * a30;\n var b08 = a20 * a33 - a23 * a30;\n var b09 = a21 * a32 - a22 * a31;\n var b10 = a21 * a33 - a23 * a31;\n var b11 = a22 * a33 - a23 * a32; // Calculate the determinant\n\n var det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n\n if (!det) {\n return null;\n }\n\n det = 1.0 / det;\n out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;\n out[1] = (a02 * b10 - a01 * b11 - a03 * b09) * det;\n out[2] = (a31 * b05 - a32 * b04 + a33 * b03) * det;\n out[3] = (a22 * b04 - a21 * b05 - a23 * b03) * det;\n out[4] = (a12 * b08 - a10 * b11 - a13 * b07) * det;\n out[5] = (a00 * b11 - a02 * b08 + a03 * b07) * det;\n out[6] = (a32 * b02 - a30 * b05 - a33 * b01) * det;\n out[7] = (a20 * b05 - a22 * b02 + a23 * b01) * det;\n out[8] = (a10 * b10 - a11 * b08 + a13 * b06) * det;\n out[9] = (a01 * b08 - a00 * b10 - a03 * b06) * det;\n out[10] = (a30 * b04 - a31 * b02 + a33 * b00) * det;\n out[11] = (a21 * b02 - a20 * b04 - a23 * b00) * det;\n out[12] = (a11 * b07 - a10 * b09 - a12 * b06) * det;\n out[13] = (a00 * b09 - a01 * b07 + a02 * b06) * det;\n out[14] = (a31 * b01 - a30 * b03 - a32 * b00) * det;\n out[15] = (a20 * b03 - a21 * b01 + a22 * b00) * det;\n return out;\n}\n/**\n * Calculates the adjugate of a mat4\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the source matrix\n * @returns {mat4} out\n */\n\nfunction mat4_adjoint(out, a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15];\n out[0] = a11 * (a22 * a33 - a23 * a32) - a21 * (a12 * a33 - a13 * a32) + a31 * (a12 * a23 - a13 * a22);\n out[1] = -(a01 * (a22 * a33 - a23 * a32) - a21 * (a02 * a33 - a03 * a32) + a31 * (a02 * a23 - a03 * a22));\n out[2] = a01 * (a12 * a33 - a13 * a32) - a11 * (a02 * a33 - a03 * a32) + a31 * (a02 * a13 - a03 * a12);\n out[3] = -(a01 * (a12 * a23 - a13 * a22) - a11 * (a02 * a23 - a03 * a22) + a21 * (a02 * a13 - a03 * a12));\n out[4] = -(a10 * (a22 * a33 - a23 * a32) - a20 * (a12 * a33 - a13 * a32) + a30 * (a12 * a23 - a13 * a22));\n out[5] = a00 * (a22 * a33 - a23 * a32) - a20 * (a02 * a33 - a03 * a32) + a30 * (a02 * a23 - a03 * a22);\n out[6] = -(a00 * (a12 * a33 - a13 * a32) - a10 * (a02 * a33 - a03 * a32) + a30 * (a02 * a13 - a03 * a12));\n out[7] = a00 * (a12 * a23 - a13 * a22) - a10 * (a02 * a23 - a03 * a22) + a20 * (a02 * a13 - a03 * a12);\n out[8] = a10 * (a21 * a33 - a23 * a31) - a20 * (a11 * a33 - a13 * a31) + a30 * (a11 * a23 - a13 * a21);\n out[9] = -(a00 * (a21 * a33 - a23 * a31) - a20 * (a01 * a33 - a03 * a31) + a30 * (a01 * a23 - a03 * a21));\n out[10] = a00 * (a11 * a33 - a13 * a31) - a10 * (a01 * a33 - a03 * a31) + a30 * (a01 * a13 - a03 * a11);\n out[11] = -(a00 * (a11 * a23 - a13 * a21) - a10 * (a01 * a23 - a03 * a21) + a20 * (a01 * a13 - a03 * a11));\n out[12] = -(a10 * (a21 * a32 - a22 * a31) - a20 * (a11 * a32 - a12 * a31) + a30 * (a11 * a22 - a12 * a21));\n out[13] = a00 * (a21 * a32 - a22 * a31) - a20 * (a01 * a32 - a02 * a31) + a30 * (a01 * a22 - a02 * a21);\n out[14] = -(a00 * (a11 * a32 - a12 * a31) - a10 * (a01 * a32 - a02 * a31) + a30 * (a01 * a12 - a02 * a11));\n out[15] = a00 * (a11 * a22 - a12 * a21) - a10 * (a01 * a22 - a02 * a21) + a20 * (a01 * a12 - a02 * a11);\n return out;\n}\n/**\n * Calculates the determinant of a mat4\n *\n * @param {ReadonlyMat4} a the source matrix\n * @returns {Number} determinant of a\n */\n\nfunction mat4_determinant(a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15];\n var b00 = a00 * a11 - a01 * a10;\n var b01 = a00 * a12 - a02 * a10;\n var b02 = a00 * a13 - a03 * a10;\n var b03 = a01 * a12 - a02 * a11;\n var b04 = a01 * a13 - a03 * a11;\n var b05 = a02 * a13 - a03 * a12;\n var b06 = a20 * a31 - a21 * a30;\n var b07 = a20 * a32 - a22 * a30;\n var b08 = a20 * a33 - a23 * a30;\n var b09 = a21 * a32 - a22 * a31;\n var b10 = a21 * a33 - a23 * a31;\n var b11 = a22 * a33 - a23 * a32; // Calculate the determinant\n\n return b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n}\n/**\n * Multiplies two mat4s\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the first operand\n * @param {ReadonlyMat4} b the second operand\n * @returns {mat4} out\n */\n\nfunction mat4_multiply(out, a, b) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15]; // Cache only the current line of the second matrix\n\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3];\n out[0] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[1] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[2] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[3] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n b0 = b[4];\n b1 = b[5];\n b2 = b[6];\n b3 = b[7];\n out[4] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[5] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[6] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[7] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n b0 = b[8];\n b1 = b[9];\n b2 = b[10];\n b3 = b[11];\n out[8] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[9] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[10] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[11] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n b0 = b[12];\n b1 = b[13];\n b2 = b[14];\n b3 = b[15];\n out[12] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[13] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[14] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[15] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n return out;\n}\n/**\n * Translate a mat4 by the given vector\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to translate\n * @param {ReadonlyVec3} v vector to translate by\n * @returns {mat4} out\n */\n\nfunction mat4_translate(out, a, v) {\n var x = v[0],\n y = v[1],\n z = v[2];\n var a00, a01, a02, a03;\n var a10, a11, a12, a13;\n var a20, a21, a22, a23;\n\n if (a === out) {\n out[12] = a[0] * x + a[4] * y + a[8] * z + a[12];\n out[13] = a[1] * x + a[5] * y + a[9] * z + a[13];\n out[14] = a[2] * x + a[6] * y + a[10] * z + a[14];\n out[15] = a[3] * x + a[7] * y + a[11] * z + a[15];\n } else {\n a00 = a[0];\n a01 = a[1];\n a02 = a[2];\n a03 = a[3];\n a10 = a[4];\n a11 = a[5];\n a12 = a[6];\n a13 = a[7];\n a20 = a[8];\n a21 = a[9];\n a22 = a[10];\n a23 = a[11];\n out[0] = a00;\n out[1] = a01;\n out[2] = a02;\n out[3] = a03;\n out[4] = a10;\n out[5] = a11;\n out[6] = a12;\n out[7] = a13;\n out[8] = a20;\n out[9] = a21;\n out[10] = a22;\n out[11] = a23;\n out[12] = a00 * x + a10 * y + a20 * z + a[12];\n out[13] = a01 * x + a11 * y + a21 * z + a[13];\n out[14] = a02 * x + a12 * y + a22 * z + a[14];\n out[15] = a03 * x + a13 * y + a23 * z + a[15];\n }\n\n return out;\n}\n/**\n * Scales the mat4 by the dimensions in the given vec3 not using vectorization\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to scale\n * @param {ReadonlyVec3} v the vec3 to scale the matrix by\n * @returns {mat4} out\n **/\n\nfunction mat4_scale(out, a, v) {\n var x = v[0],\n y = v[1],\n z = v[2];\n out[0] = a[0] * x;\n out[1] = a[1] * x;\n out[2] = a[2] * x;\n out[3] = a[3] * x;\n out[4] = a[4] * y;\n out[5] = a[5] * y;\n out[6] = a[6] * y;\n out[7] = a[7] * y;\n out[8] = a[8] * z;\n out[9] = a[9] * z;\n out[10] = a[10] * z;\n out[11] = a[11] * z;\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n return out;\n}\n/**\n * Rotates a mat4 by the given angle around the given axis\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @param {ReadonlyVec3} axis the axis to rotate around\n * @returns {mat4} out\n */\n\nfunction mat4_rotate(out, a, rad, axis) {\n var x = axis[0],\n y = axis[1],\n z = axis[2];\n var len = Math.hypot(x, y, z);\n var s, c, t;\n var a00, a01, a02, a03;\n var a10, a11, a12, a13;\n var a20, a21, a22, a23;\n var b00, b01, b02;\n var b10, b11, b12;\n var b20, b21, b22;\n\n if (len < common["b" /* EPSILON */]) {\n return null;\n }\n\n len = 1 / len;\n x *= len;\n y *= len;\n z *= len;\n s = Math.sin(rad);\n c = Math.cos(rad);\n t = 1 - c;\n a00 = a[0];\n a01 = a[1];\n a02 = a[2];\n a03 = a[3];\n a10 = a[4];\n a11 = a[5];\n a12 = a[6];\n a13 = a[7];\n a20 = a[8];\n a21 = a[9];\n a22 = a[10];\n a23 = a[11]; // Construct the elements of the rotation matrix\n\n b00 = x * x * t + c;\n b01 = y * x * t + z * s;\n b02 = z * x * t - y * s;\n b10 = x * y * t - z * s;\n b11 = y * y * t + c;\n b12 = z * y * t + x * s;\n b20 = x * z * t + y * s;\n b21 = y * z * t - x * s;\n b22 = z * z * t + c; // Perform rotation-specific matrix multiplication\n\n out[0] = a00 * b00 + a10 * b01 + a20 * b02;\n out[1] = a01 * b00 + a11 * b01 + a21 * b02;\n out[2] = a02 * b00 + a12 * b01 + a22 * b02;\n out[3] = a03 * b00 + a13 * b01 + a23 * b02;\n out[4] = a00 * b10 + a10 * b11 + a20 * b12;\n out[5] = a01 * b10 + a11 * b11 + a21 * b12;\n out[6] = a02 * b10 + a12 * b11 + a22 * b12;\n out[7] = a03 * b10 + a13 * b11 + a23 * b12;\n out[8] = a00 * b20 + a10 * b21 + a20 * b22;\n out[9] = a01 * b20 + a11 * b21 + a21 * b22;\n out[10] = a02 * b20 + a12 * b21 + a22 * b22;\n out[11] = a03 * b20 + a13 * b21 + a23 * b22;\n\n if (a !== out) {\n // If the source and destination differ, copy the unchanged last row\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n }\n\n return out;\n}\n/**\n * Rotates a matrix by the given angle around the X axis\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\n\nfunction rotateX(out, a, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad);\n var a10 = a[4];\n var a11 = a[5];\n var a12 = a[6];\n var a13 = a[7];\n var a20 = a[8];\n var a21 = a[9];\n var a22 = a[10];\n var a23 = a[11];\n\n if (a !== out) {\n // If the source and destination differ, copy the unchanged rows\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n } // Perform axis-specific matrix multiplication\n\n\n out[4] = a10 * c + a20 * s;\n out[5] = a11 * c + a21 * s;\n out[6] = a12 * c + a22 * s;\n out[7] = a13 * c + a23 * s;\n out[8] = a20 * c - a10 * s;\n out[9] = a21 * c - a11 * s;\n out[10] = a22 * c - a12 * s;\n out[11] = a23 * c - a13 * s;\n return out;\n}\n/**\n * Rotates a matrix by the given angle around the Y axis\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\n\nfunction rotateY(out, a, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad);\n var a00 = a[0];\n var a01 = a[1];\n var a02 = a[2];\n var a03 = a[3];\n var a20 = a[8];\n var a21 = a[9];\n var a22 = a[10];\n var a23 = a[11];\n\n if (a !== out) {\n // If the source and destination differ, copy the unchanged rows\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n } // Perform axis-specific matrix multiplication\n\n\n out[0] = a00 * c - a20 * s;\n out[1] = a01 * c - a21 * s;\n out[2] = a02 * c - a22 * s;\n out[3] = a03 * c - a23 * s;\n out[8] = a00 * s + a20 * c;\n out[9] = a01 * s + a21 * c;\n out[10] = a02 * s + a22 * c;\n out[11] = a03 * s + a23 * c;\n return out;\n}\n/**\n * Rotates a matrix by the given angle around the Z axis\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\n\nfunction rotateZ(out, a, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad);\n var a00 = a[0];\n var a01 = a[1];\n var a02 = a[2];\n var a03 = a[3];\n var a10 = a[4];\n var a11 = a[5];\n var a12 = a[6];\n var a13 = a[7];\n\n if (a !== out) {\n // If the source and destination differ, copy the unchanged last row\n out[8] = a[8];\n out[9] = a[9];\n out[10] = a[10];\n out[11] = a[11];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n } // Perform axis-specific matrix multiplication\n\n\n out[0] = a00 * c + a10 * s;\n out[1] = a01 * c + a11 * s;\n out[2] = a02 * c + a12 * s;\n out[3] = a03 * c + a13 * s;\n out[4] = a10 * c - a00 * s;\n out[5] = a11 * c - a01 * s;\n out[6] = a12 * c - a02 * s;\n out[7] = a13 * c - a03 * s;\n return out;\n}\n/**\n * Creates a matrix from a vector translation\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.translate(dest, dest, vec);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {ReadonlyVec3} v Translation vector\n * @returns {mat4} out\n */\n\nfunction mat4_fromTranslation(out, v) {\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = 1;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 1;\n out[11] = 0;\n out[12] = v[0];\n out[13] = v[1];\n out[14] = v[2];\n out[15] = 1;\n return out;\n}\n/**\n * Creates a matrix from a vector scaling\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.scale(dest, dest, vec);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {ReadonlyVec3} v Scaling vector\n * @returns {mat4} out\n */\n\nfunction mat4_fromScaling(out, v) {\n out[0] = v[0];\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = v[1];\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = v[2];\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\n * Creates a matrix from a given angle around a given axis\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.rotate(dest, dest, rad, axis);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @param {ReadonlyVec3} axis the axis to rotate around\n * @returns {mat4} out\n */\n\nfunction mat4_fromRotation(out, rad, axis) {\n var x = axis[0],\n y = axis[1],\n z = axis[2];\n var len = Math.hypot(x, y, z);\n var s, c, t;\n\n if (len < common["b" /* EPSILON */]) {\n return null;\n }\n\n len = 1 / len;\n x *= len;\n y *= len;\n z *= len;\n s = Math.sin(rad);\n c = Math.cos(rad);\n t = 1 - c; // Perform rotation-specific matrix multiplication\n\n out[0] = x * x * t + c;\n out[1] = y * x * t + z * s;\n out[2] = z * x * t - y * s;\n out[3] = 0;\n out[4] = x * y * t - z * s;\n out[5] = y * y * t + c;\n out[6] = z * y * t + x * s;\n out[7] = 0;\n out[8] = x * z * t + y * s;\n out[9] = y * z * t - x * s;\n out[10] = z * z * t + c;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\n * Creates a matrix from the given angle around the X axis\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.rotateX(dest, dest, rad);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\n\nfunction fromXRotation(out, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad); // Perform axis-specific matrix multiplication\n\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = c;\n out[6] = s;\n out[7] = 0;\n out[8] = 0;\n out[9] = -s;\n out[10] = c;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\n * Creates a matrix from the given angle around the Y axis\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.rotateY(dest, dest, rad);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\n\nfunction fromYRotation(out, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad); // Perform axis-specific matrix multiplication\n\n out[0] = c;\n out[1] = 0;\n out[2] = -s;\n out[3] = 0;\n out[4] = 0;\n out[5] = 1;\n out[6] = 0;\n out[7] = 0;\n out[8] = s;\n out[9] = 0;\n out[10] = c;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\n * Creates a matrix from the given angle around the Z axis\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.rotateZ(dest, dest, rad);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\n\nfunction fromZRotation(out, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad); // Perform axis-specific matrix multiplication\n\n out[0] = c;\n out[1] = s;\n out[2] = 0;\n out[3] = 0;\n out[4] = -s;\n out[5] = c;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 1;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\n * Creates a matrix from a quaternion rotation and vector translation\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.translate(dest, vec);\n * let quatMat = mat4.create();\n * quat4.toMat4(quat, quatMat);\n * mat4.multiply(dest, quatMat);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {quat4} q Rotation quaternion\n * @param {ReadonlyVec3} v Translation vector\n * @returns {mat4} out\n */\n\nfunction fromRotationTranslation(out, q, v) {\n // Quaternion math\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var xy = x * y2;\n var xz = x * z2;\n var yy = y * y2;\n var yz = y * z2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n out[0] = 1 - (yy + zz);\n out[1] = xy + wz;\n out[2] = xz - wy;\n out[3] = 0;\n out[4] = xy - wz;\n out[5] = 1 - (xx + zz);\n out[6] = yz + wx;\n out[7] = 0;\n out[8] = xz + wy;\n out[9] = yz - wx;\n out[10] = 1 - (xx + yy);\n out[11] = 0;\n out[12] = v[0];\n out[13] = v[1];\n out[14] = v[2];\n out[15] = 1;\n return out;\n}\n/**\n * Creates a new mat4 from a dual quat.\n *\n * @param {mat4} out Matrix\n * @param {ReadonlyQuat2} a Dual Quaternion\n * @returns {mat4} mat4 receiving operation result\n */\n\nfunction fromQuat2(out, a) {\n var translation = new common["a" /* ARRAY_TYPE */](3);\n var bx = -a[0],\n by = -a[1],\n bz = -a[2],\n bw = a[3],\n ax = a[4],\n ay = a[5],\n az = a[6],\n aw = a[7];\n var magnitude = bx * bx + by * by + bz * bz + bw * bw; //Only scale if it makes sense\n\n if (magnitude > 0) {\n translation[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2 / magnitude;\n translation[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2 / magnitude;\n translation[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2 / magnitude;\n } else {\n translation[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2;\n translation[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2;\n translation[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2;\n }\n\n fromRotationTranslation(out, a, translation);\n return out;\n}\n/**\n * Returns the translation vector component of a transformation\n * matrix. If a matrix is built with fromRotationTranslation,\n * the returned vector will be the same as the translation vector\n * originally supplied.\n * @param {vec3} out Vector to receive translation component\n * @param {ReadonlyMat4} mat Matrix to be decomposed (input)\n * @return {vec3} out\n */\n\nfunction getTranslation(out, mat) {\n out[0] = mat[12];\n out[1] = mat[13];\n out[2] = mat[14];\n return out;\n}\n/**\n * Returns the scaling factor component of a transformation\n * matrix. If a matrix is built with fromRotationTranslationScale\n * with a normalized Quaternion paramter, the returned vector will be\n * the same as the scaling vector\n * originally supplied.\n * @param {vec3} out Vector to receive scaling factor component\n * @param {ReadonlyMat4} mat Matrix to be decomposed (input)\n * @return {vec3} out\n */\n\nfunction getScaling(out, mat) {\n var m11 = mat[0];\n var m12 = mat[1];\n var m13 = mat[2];\n var m21 = mat[4];\n var m22 = mat[5];\n var m23 = mat[6];\n var m31 = mat[8];\n var m32 = mat[9];\n var m33 = mat[10];\n out[0] = Math.hypot(m11, m12, m13);\n out[1] = Math.hypot(m21, m22, m23);\n out[2] = Math.hypot(m31, m32, m33);\n return out;\n}\n/**\n * Returns a quaternion representing the rotational component\n * of a transformation matrix. If a matrix is built with\n * fromRotationTranslation, the returned quaternion will be the\n * same as the quaternion originally supplied.\n * @param {quat} out Quaternion to receive the rotation component\n * @param {ReadonlyMat4} mat Matrix to be decomposed (input)\n * @return {quat} out\n */\n\nfunction getRotation(out, mat) {\n var scaling = new common["a" /* ARRAY_TYPE */](3);\n getScaling(scaling, mat);\n var is1 = 1 / scaling[0];\n var is2 = 1 / scaling[1];\n var is3 = 1 / scaling[2];\n var sm11 = mat[0] * is1;\n var sm12 = mat[1] * is2;\n var sm13 = mat[2] * is3;\n var sm21 = mat[4] * is1;\n var sm22 = mat[5] * is2;\n var sm23 = mat[6] * is3;\n var sm31 = mat[8] * is1;\n var sm32 = mat[9] * is2;\n var sm33 = mat[10] * is3;\n var trace = sm11 + sm22 + sm33;\n var S = 0;\n\n if (trace > 0) {\n S = Math.sqrt(trace + 1.0) * 2;\n out[3] = 0.25 * S;\n out[0] = (sm23 - sm32) / S;\n out[1] = (sm31 - sm13) / S;\n out[2] = (sm12 - sm21) / S;\n } else if (sm11 > sm22 && sm11 > sm33) {\n S = Math.sqrt(1.0 + sm11 - sm22 - sm33) * 2;\n out[3] = (sm23 - sm32) / S;\n out[0] = 0.25 * S;\n out[1] = (sm12 + sm21) / S;\n out[2] = (sm31 + sm13) / S;\n } else if (sm22 > sm33) {\n S = Math.sqrt(1.0 + sm22 - sm11 - sm33) * 2;\n out[3] = (sm31 - sm13) / S;\n out[0] = (sm12 + sm21) / S;\n out[1] = 0.25 * S;\n out[2] = (sm23 + sm32) / S;\n } else {\n S = Math.sqrt(1.0 + sm33 - sm11 - sm22) * 2;\n out[3] = (sm12 - sm21) / S;\n out[0] = (sm31 + sm13) / S;\n out[1] = (sm23 + sm32) / S;\n out[2] = 0.25 * S;\n }\n\n return out;\n}\n/**\n * Creates a matrix from a quaternion rotation, vector translation and vector scale\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.translate(dest, vec);\n * let quatMat = mat4.create();\n * quat4.toMat4(quat, quatMat);\n * mat4.multiply(dest, quatMat);\n * mat4.scale(dest, scale)\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {quat4} q Rotation quaternion\n * @param {ReadonlyVec3} v Translation vector\n * @param {ReadonlyVec3} s Scaling vector\n * @returns {mat4} out\n */\n\nfunction fromRotationTranslationScale(out, q, v, s) {\n // Quaternion math\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var xy = x * y2;\n var xz = x * z2;\n var yy = y * y2;\n var yz = y * z2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n var sx = s[0];\n var sy = s[1];\n var sz = s[2];\n out[0] = (1 - (yy + zz)) * sx;\n out[1] = (xy + wz) * sx;\n out[2] = (xz - wy) * sx;\n out[3] = 0;\n out[4] = (xy - wz) * sy;\n out[5] = (1 - (xx + zz)) * sy;\n out[6] = (yz + wx) * sy;\n out[7] = 0;\n out[8] = (xz + wy) * sz;\n out[9] = (yz - wx) * sz;\n out[10] = (1 - (xx + yy)) * sz;\n out[11] = 0;\n out[12] = v[0];\n out[13] = v[1];\n out[14] = v[2];\n out[15] = 1;\n return out;\n}\n/**\n * Creates a matrix from a quaternion rotation, vector translation and vector scale, rotating and scaling around the given origin\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.translate(dest, vec);\n * mat4.translate(dest, origin);\n * let quatMat = mat4.create();\n * quat4.toMat4(quat, quatMat);\n * mat4.multiply(dest, quatMat);\n * mat4.scale(dest, scale)\n * mat4.translate(dest, negativeOrigin);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {quat4} q Rotation quaternion\n * @param {ReadonlyVec3} v Translation vector\n * @param {ReadonlyVec3} s Scaling vector\n * @param {ReadonlyVec3} o The origin vector around which to scale and rotate\n * @returns {mat4} out\n */\n\nfunction fromRotationTranslationScaleOrigin(out, q, v, s, o) {\n // Quaternion math\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var xy = x * y2;\n var xz = x * z2;\n var yy = y * y2;\n var yz = y * z2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n var sx = s[0];\n var sy = s[1];\n var sz = s[2];\n var ox = o[0];\n var oy = o[1];\n var oz = o[2];\n var out0 = (1 - (yy + zz)) * sx;\n var out1 = (xy + wz) * sx;\n var out2 = (xz - wy) * sx;\n var out4 = (xy - wz) * sy;\n var out5 = (1 - (xx + zz)) * sy;\n var out6 = (yz + wx) * sy;\n var out8 = (xz + wy) * sz;\n var out9 = (yz - wx) * sz;\n var out10 = (1 - (xx + yy)) * sz;\n out[0] = out0;\n out[1] = out1;\n out[2] = out2;\n out[3] = 0;\n out[4] = out4;\n out[5] = out5;\n out[6] = out6;\n out[7] = 0;\n out[8] = out8;\n out[9] = out9;\n out[10] = out10;\n out[11] = 0;\n out[12] = v[0] + ox - (out0 * ox + out4 * oy + out8 * oz);\n out[13] = v[1] + oy - (out1 * ox + out5 * oy + out9 * oz);\n out[14] = v[2] + oz - (out2 * ox + out6 * oy + out10 * oz);\n out[15] = 1;\n return out;\n}\n/**\n * Calculates a 4x4 matrix from the given quaternion\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {ReadonlyQuat} q Quaternion to create matrix from\n *\n * @returns {mat4} out\n */\n\nfunction mat4_fromQuat(out, q) {\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var yx = y * x2;\n var yy = y * y2;\n var zx = z * x2;\n var zy = z * y2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n out[0] = 1 - yy - zz;\n out[1] = yx + wz;\n out[2] = zx - wy;\n out[3] = 0;\n out[4] = yx - wz;\n out[5] = 1 - xx - zz;\n out[6] = zy + wx;\n out[7] = 0;\n out[8] = zx + wy;\n out[9] = zy - wx;\n out[10] = 1 - xx - yy;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\n * Generates a frustum matrix with the given bounds\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {Number} left Left bound of the frustum\n * @param {Number} right Right bound of the frustum\n * @param {Number} bottom Bottom bound of the frustum\n * @param {Number} top Top bound of the frustum\n * @param {Number} near Near bound of the frustum\n * @param {Number} far Far bound of the frustum\n * @returns {mat4} out\n */\n\nfunction frustum(out, left, right, bottom, top, near, far) {\n var rl = 1 / (right - left);\n var tb = 1 / (top - bottom);\n var nf = 1 / (near - far);\n out[0] = near * 2 * rl;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = near * 2 * tb;\n out[6] = 0;\n out[7] = 0;\n out[8] = (right + left) * rl;\n out[9] = (top + bottom) * tb;\n out[10] = (far + near) * nf;\n out[11] = -1;\n out[12] = 0;\n out[13] = 0;\n out[14] = far * near * 2 * nf;\n out[15] = 0;\n return out;\n}\n/**\n * Generates a perspective projection matrix with the given bounds.\n * The near/far clip planes correspond to a normalized device coordinate Z range of [-1, 1],\n * which matches WebGL/OpenGL\'s clip volume.\n * Passing null/undefined/no value for far will generate infinite projection matrix.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {number} fovy Vertical field of view in radians\n * @param {number} aspect Aspect ratio. typically viewport width/height\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum, can be null or Infinity\n * @returns {mat4} out\n */\n\nfunction perspectiveNO(out, fovy, aspect, near, far) {\n var f = 1.0 / Math.tan(fovy / 2),\n nf;\n out[0] = f / aspect;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = f;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[11] = -1;\n out[12] = 0;\n out[13] = 0;\n out[15] = 0;\n\n if (far != null && far !== Infinity) {\n nf = 1 / (near - far);\n out[10] = (far + near) * nf;\n out[14] = 2 * far * near * nf;\n } else {\n out[10] = -1;\n out[14] = -2 * near;\n }\n\n return out;\n}\n/**\n * Alias for {@link mat4.perspectiveNO}\n * @function\n */\n\nvar perspective = perspectiveNO;\n/**\n * Generates a perspective projection matrix suitable for WebGPU with the given bounds.\n * The near/far clip planes correspond to a normalized device coordinate Z range of [0, 1],\n * which matches WebGPU/Vulkan/DirectX/Metal\'s clip volume.\n * Passing null/undefined/no value for far will generate infinite projection matrix.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {number} fovy Vertical field of view in radians\n * @param {number} aspect Aspect ratio. typically viewport width/height\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum, can be null or Infinity\n * @returns {mat4} out\n */\n\nfunction perspectiveZO(out, fovy, aspect, near, far) {\n var f = 1.0 / Math.tan(fovy / 2),\n nf;\n out[0] = f / aspect;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = f;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[11] = -1;\n out[12] = 0;\n out[13] = 0;\n out[15] = 0;\n\n if (far != null && far !== Infinity) {\n nf = 1 / (near - far);\n out[10] = far * nf;\n out[14] = far * near * nf;\n } else {\n out[10] = -1;\n out[14] = -near;\n }\n\n return out;\n}\n/**\n * Generates a perspective projection matrix with the given field of view.\n * This is primarily useful for generating projection matrices to be used\n * with the still experiemental WebVR API.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {Object} fov Object containing the following values: upDegrees, downDegrees, leftDegrees, rightDegrees\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum\n * @returns {mat4} out\n */\n\nfunction perspectiveFromFieldOfView(out, fov, near, far) {\n var upTan = Math.tan(fov.upDegrees * Math.PI / 180.0);\n var downTan = Math.tan(fov.downDegrees * Math.PI / 180.0);\n var leftTan = Math.tan(fov.leftDegrees * Math.PI / 180.0);\n var rightTan = Math.tan(fov.rightDegrees * Math.PI / 180.0);\n var xScale = 2.0 / (leftTan + rightTan);\n var yScale = 2.0 / (upTan + downTan);\n out[0] = xScale;\n out[1] = 0.0;\n out[2] = 0.0;\n out[3] = 0.0;\n out[4] = 0.0;\n out[5] = yScale;\n out[6] = 0.0;\n out[7] = 0.0;\n out[8] = -((leftTan - rightTan) * xScale * 0.5);\n out[9] = (upTan - downTan) * yScale * 0.5;\n out[10] = far / (near - far);\n out[11] = -1.0;\n out[12] = 0.0;\n out[13] = 0.0;\n out[14] = far * near / (near - far);\n out[15] = 0.0;\n return out;\n}\n/**\n * Generates a orthogonal projection matrix with the given bounds.\n * The near/far clip planes correspond to a normalized device coordinate Z range of [-1, 1],\n * which matches WebGL/OpenGL\'s clip volume.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {number} left Left bound of the frustum\n * @param {number} right Right bound of the frustum\n * @param {number} bottom Bottom bound of the frustum\n * @param {number} top Top bound of the frustum\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum\n * @returns {mat4} out\n */\n\nfunction orthoNO(out, left, right, bottom, top, near, far) {\n var lr = 1 / (left - right);\n var bt = 1 / (bottom - top);\n var nf = 1 / (near - far);\n out[0] = -2 * lr;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = -2 * bt;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 2 * nf;\n out[11] = 0;\n out[12] = (left + right) * lr;\n out[13] = (top + bottom) * bt;\n out[14] = (far + near) * nf;\n out[15] = 1;\n return out;\n}\n/**\n * Alias for {@link mat4.orthoNO}\n * @function\n */\n\nvar ortho = orthoNO;\n/**\n * Generates a orthogonal projection matrix with the given bounds.\n * The near/far clip planes correspond to a normalized device coordinate Z range of [0, 1],\n * which matches WebGPU/Vulkan/DirectX/Metal\'s clip volume.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {number} left Left bound of the frustum\n * @param {number} right Right bound of the frustum\n * @param {number} bottom Bottom bound of the frustum\n * @param {number} top Top bound of the frustum\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum\n * @returns {mat4} out\n */\n\nfunction orthoZO(out, left, right, bottom, top, near, far) {\n var lr = 1 / (left - right);\n var bt = 1 / (bottom - top);\n var nf = 1 / (near - far);\n out[0] = -2 * lr;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = -2 * bt;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = nf;\n out[11] = 0;\n out[12] = (left + right) * lr;\n out[13] = (top + bottom) * bt;\n out[14] = near * nf;\n out[15] = 1;\n return out;\n}\n/**\n * Generates a look-at matrix with the given eye position, focal point, and up axis.\n * If you want a matrix that actually makes an object look at another object, you should use targetTo instead.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {ReadonlyVec3} eye Position of the viewer\n * @param {ReadonlyVec3} center Point the viewer is looking at\n * @param {ReadonlyVec3} up vec3 pointing up\n * @returns {mat4} out\n */\n\nfunction lookAt(out, eye, center, up) {\n var x0, x1, x2, y0, y1, y2, z0, z1, z2, len;\n var eyex = eye[0];\n var eyey = eye[1];\n var eyez = eye[2];\n var upx = up[0];\n var upy = up[1];\n var upz = up[2];\n var centerx = center[0];\n var centery = center[1];\n var centerz = center[2];\n\n if (Math.abs(eyex - centerx) < common["b" /* EPSILON */] && Math.abs(eyey - centery) < common["b" /* EPSILON */] && Math.abs(eyez - centerz) < common["b" /* EPSILON */]) {\n return mat4_identity(out);\n }\n\n z0 = eyex - centerx;\n z1 = eyey - centery;\n z2 = eyez - centerz;\n len = 1 / Math.hypot(z0, z1, z2);\n z0 *= len;\n z1 *= len;\n z2 *= len;\n x0 = upy * z2 - upz * z1;\n x1 = upz * z0 - upx * z2;\n x2 = upx * z1 - upy * z0;\n len = Math.hypot(x0, x1, x2);\n\n if (!len) {\n x0 = 0;\n x1 = 0;\n x2 = 0;\n } else {\n len = 1 / len;\n x0 *= len;\n x1 *= len;\n x2 *= len;\n }\n\n y0 = z1 * x2 - z2 * x1;\n y1 = z2 * x0 - z0 * x2;\n y2 = z0 * x1 - z1 * x0;\n len = Math.hypot(y0, y1, y2);\n\n if (!len) {\n y0 = 0;\n y1 = 0;\n y2 = 0;\n } else {\n len = 1 / len;\n y0 *= len;\n y1 *= len;\n y2 *= len;\n }\n\n out[0] = x0;\n out[1] = y0;\n out[2] = z0;\n out[3] = 0;\n out[4] = x1;\n out[5] = y1;\n out[6] = z1;\n out[7] = 0;\n out[8] = x2;\n out[9] = y2;\n out[10] = z2;\n out[11] = 0;\n out[12] = -(x0 * eyex + x1 * eyey + x2 * eyez);\n out[13] = -(y0 * eyex + y1 * eyey + y2 * eyez);\n out[14] = -(z0 * eyex + z1 * eyey + z2 * eyez);\n out[15] = 1;\n return out;\n}\n/**\n * Generates a matrix that makes something look at something else.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {ReadonlyVec3} eye Position of the viewer\n * @param {ReadonlyVec3} center Point the viewer is looking at\n * @param {ReadonlyVec3} up vec3 pointing up\n * @returns {mat4} out\n */\n\nfunction targetTo(out, eye, target, up) {\n var eyex = eye[0],\n eyey = eye[1],\n eyez = eye[2],\n upx = up[0],\n upy = up[1],\n upz = up[2];\n var z0 = eyex - target[0],\n z1 = eyey - target[1],\n z2 = eyez - target[2];\n var len = z0 * z0 + z1 * z1 + z2 * z2;\n\n if (len > 0) {\n len = 1 / Math.sqrt(len);\n z0 *= len;\n z1 *= len;\n z2 *= len;\n }\n\n var x0 = upy * z2 - upz * z1,\n x1 = upz * z0 - upx * z2,\n x2 = upx * z1 - upy * z0;\n len = x0 * x0 + x1 * x1 + x2 * x2;\n\n if (len > 0) {\n len = 1 / Math.sqrt(len);\n x0 *= len;\n x1 *= len;\n x2 *= len;\n }\n\n out[0] = x0;\n out[1] = x1;\n out[2] = x2;\n out[3] = 0;\n out[4] = z1 * x2 - z2 * x1;\n out[5] = z2 * x0 - z0 * x2;\n out[6] = z0 * x1 - z1 * x0;\n out[7] = 0;\n out[8] = z0;\n out[9] = z1;\n out[10] = z2;\n out[11] = 0;\n out[12] = eyex;\n out[13] = eyey;\n out[14] = eyez;\n out[15] = 1;\n return out;\n}\n/**\n * Returns a string representation of a mat4\n *\n * @param {ReadonlyMat4} a matrix to represent as a string\n * @returns {String} string representation of the matrix\n */\n\nfunction mat4_str(a) {\n return "mat4(" + a[0] + ", " + a[1] + ", " + a[2] + ", " + a[3] + ", " + a[4] + ", " + a[5] + ", " + a[6] + ", " + a[7] + ", " + a[8] + ", " + a[9] + ", " + a[10] + ", " + a[11] + ", " + a[12] + ", " + a[13] + ", " + a[14] + ", " + a[15] + ")";\n}\n/**\n * Returns Frobenius norm of a mat4\n *\n * @param {ReadonlyMat4} a the matrix to calculate Frobenius norm of\n * @returns {Number} Frobenius norm\n */\n\nfunction mat4_frob(a) {\n return Math.hypot(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], a[14], a[15]);\n}\n/**\n * Adds two mat4\'s\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the first operand\n * @param {ReadonlyMat4} b the second operand\n * @returns {mat4} out\n */\n\nfunction mat4_add(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n out[3] = a[3] + b[3];\n out[4] = a[4] + b[4];\n out[5] = a[5] + b[5];\n out[6] = a[6] + b[6];\n out[7] = a[7] + b[7];\n out[8] = a[8] + b[8];\n out[9] = a[9] + b[9];\n out[10] = a[10] + b[10];\n out[11] = a[11] + b[11];\n out[12] = a[12] + b[12];\n out[13] = a[13] + b[13];\n out[14] = a[14] + b[14];\n out[15] = a[15] + b[15];\n return out;\n}\n/**\n * Subtracts matrix b from matrix a\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the first operand\n * @param {ReadonlyMat4} b the second operand\n * @returns {mat4} out\n */\n\nfunction mat4_subtract(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n out[3] = a[3] - b[3];\n out[4] = a[4] - b[4];\n out[5] = a[5] - b[5];\n out[6] = a[6] - b[6];\n out[7] = a[7] - b[7];\n out[8] = a[8] - b[8];\n out[9] = a[9] - b[9];\n out[10] = a[10] - b[10];\n out[11] = a[11] - b[11];\n out[12] = a[12] - b[12];\n out[13] = a[13] - b[13];\n out[14] = a[14] - b[14];\n out[15] = a[15] - b[15];\n return out;\n}\n/**\n * Multiply each element of the matrix by a scalar.\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to scale\n * @param {Number} b amount to scale the matrix\'s elements by\n * @returns {mat4} out\n */\n\nfunction mat4_multiplyScalar(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n out[3] = a[3] * b;\n out[4] = a[4] * b;\n out[5] = a[5] * b;\n out[6] = a[6] * b;\n out[7] = a[7] * b;\n out[8] = a[8] * b;\n out[9] = a[9] * b;\n out[10] = a[10] * b;\n out[11] = a[11] * b;\n out[12] = a[12] * b;\n out[13] = a[13] * b;\n out[14] = a[14] * b;\n out[15] = a[15] * b;\n return out;\n}\n/**\n * Adds two mat4\'s after multiplying each element of the second operand by a scalar value.\n *\n * @param {mat4} out the receiving vector\n * @param {ReadonlyMat4} a the first operand\n * @param {ReadonlyMat4} b the second operand\n * @param {Number} scale the amount to scale b\'s elements by before adding\n * @returns {mat4} out\n */\n\nfunction mat4_multiplyScalarAndAdd(out, a, b, scale) {\n out[0] = a[0] + b[0] * scale;\n out[1] = a[1] + b[1] * scale;\n out[2] = a[2] + b[2] * scale;\n out[3] = a[3] + b[3] * scale;\n out[4] = a[4] + b[4] * scale;\n out[5] = a[5] + b[5] * scale;\n out[6] = a[6] + b[6] * scale;\n out[7] = a[7] + b[7] * scale;\n out[8] = a[8] + b[8] * scale;\n out[9] = a[9] + b[9] * scale;\n out[10] = a[10] + b[10] * scale;\n out[11] = a[11] + b[11] * scale;\n out[12] = a[12] + b[12] * scale;\n out[13] = a[13] + b[13] * scale;\n out[14] = a[14] + b[14] * scale;\n out[15] = a[15] + b[15] * scale;\n return out;\n}\n/**\n * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyMat4} a The first matrix.\n * @param {ReadonlyMat4} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\n\nfunction mat4_exactEquals(a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7] && a[8] === b[8] && a[9] === b[9] && a[10] === b[10] && a[11] === b[11] && a[12] === b[12] && a[13] === b[13] && a[14] === b[14] && a[15] === b[15];\n}\n/**\n * Returns whether or not the matrices have approximately the same elements in the same position.\n *\n * @param {ReadonlyMat4} a The first matrix.\n * @param {ReadonlyMat4} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\n\nfunction mat4_equals(a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2],\n a3 = a[3];\n var a4 = a[4],\n a5 = a[5],\n a6 = a[6],\n a7 = a[7];\n var a8 = a[8],\n a9 = a[9],\n a10 = a[10],\n a11 = a[11];\n var a12 = a[12],\n a13 = a[13],\n a14 = a[14],\n a15 = a[15];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3];\n var b4 = b[4],\n b5 = b[5],\n b6 = b[6],\n b7 = b[7];\n var b8 = b[8],\n b9 = b[9],\n b10 = b[10],\n b11 = b[11];\n var b12 = b[12],\n b13 = b[13],\n b14 = b[14],\n b15 = b[15];\n return Math.abs(a0 - b0) <= common["b" /* EPSILON */] * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= common["b" /* EPSILON */] * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= common["b" /* EPSILON */] * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= common["b" /* EPSILON */] * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= common["b" /* EPSILON */] * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= common["b" /* EPSILON */] * Math.max(1.0, Math.abs(a5), Math.abs(b5)) && Math.abs(a6 - b6) <= common["b" /* EPSILON */] * Math.max(1.0, Math.abs(a6), Math.abs(b6)) && Math.abs(a7 - b7) <= common["b" /* EPSILON */] * Math.max(1.0, Math.abs(a7), Math.abs(b7)) && Math.abs(a8 - b8) <= common["b" /* EPSILON */] * Math.max(1.0, Math.abs(a8), Math.abs(b8)) && Math.abs(a9 - b9) <= common["b" /* EPSILON */] * Math.max(1.0, Math.abs(a9), Math.abs(b9)) && Math.abs(a10 - b10) <= common["b" /* EPSILON */] * Math.max(1.0, Math.abs(a10), Math.abs(b10)) && Math.abs(a11 - b11) <= common["b" /* EPSILON */] * Math.max(1.0, Math.abs(a11), Math.abs(b11)) && Math.abs(a12 - b12) <= common["b" /* EPSILON */] * Math.max(1.0, Math.abs(a12), Math.abs(b12)) && Math.abs(a13 - b13) <= common["b" /* EPSILON */] * Math.max(1.0, Math.abs(a13), Math.abs(b13)) && Math.abs(a14 - b14) <= common["b" /* EPSILON */] * Math.max(1.0, Math.abs(a14), Math.abs(b14)) && Math.abs(a15 - b15) <= common["b" /* EPSILON */] * Math.max(1.0, Math.abs(a15), Math.abs(b15));\n}\n/**\n * Alias for {@link mat4.multiply}\n * @function\n */\n\nvar mat4_mul = mat4_multiply;\n/**\n * Alias for {@link mat4.subtract}\n * @function\n */\n\nvar mat4_sub = mat4_subtract;\n// EXTERNAL MODULE: ./node_modules/gl-matrix/esm/vec3.js\nvar vec3 = __webpack_require__(39);\n\n// CONCATENATED MODULE: ./node_modules/gl-matrix/esm/vec4.js\n\n/**\n * 4 Dimensional Vector\n * @module vec4\n */\n\n/**\n * Creates a new, empty vec4\n *\n * @returns {vec4} a new 4D vector\n */\n\nfunction vec4_create() {\n var out = new common["a" /* ARRAY_TYPE */](4);\n\n if (common["a" /* ARRAY_TYPE */] != Float32Array) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n }\n\n return out;\n}\n/**\n * Creates a new vec4 initialized with values from an existing vector\n *\n * @param {ReadonlyVec4} a vector to clone\n * @returns {vec4} a new 4D vector\n */\n\nfunction vec4_clone(a) {\n var out = new common["a" /* ARRAY_TYPE */](4);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n return out;\n}\n/**\n * Creates a new vec4 initialized with the given values\n *\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @param {Number} w W component\n * @returns {vec4} a new 4D vector\n */\n\nfunction vec4_fromValues(x, y, z, w) {\n var out = new common["a" /* ARRAY_TYPE */](4);\n out[0] = x;\n out[1] = y;\n out[2] = z;\n out[3] = w;\n return out;\n}\n/**\n * Copy the values from one vec4 to another\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the source vector\n * @returns {vec4} out\n */\n\nfunction vec4_copy(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n return out;\n}\n/**\n * Set the components of a vec4 to the given values\n *\n * @param {vec4} out the receiving vector\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @param {Number} w W component\n * @returns {vec4} out\n */\n\nfunction vec4_set(out, x, y, z, w) {\n out[0] = x;\n out[1] = y;\n out[2] = z;\n out[3] = w;\n return out;\n}\n/**\n * Adds two vec4\'s\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {vec4} out\n */\n\nfunction vec4_add(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n out[3] = a[3] + b[3];\n return out;\n}\n/**\n * Subtracts vector b from vector a\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {vec4} out\n */\n\nfunction vec4_subtract(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n out[3] = a[3] - b[3];\n return out;\n}\n/**\n * Multiplies two vec4\'s\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {vec4} out\n */\n\nfunction vec4_multiply(out, a, b) {\n out[0] = a[0] * b[0];\n out[1] = a[1] * b[1];\n out[2] = a[2] * b[2];\n out[3] = a[3] * b[3];\n return out;\n}\n/**\n * Divides two vec4\'s\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {vec4} out\n */\n\nfunction divide(out, a, b) {\n out[0] = a[0] / b[0];\n out[1] = a[1] / b[1];\n out[2] = a[2] / b[2];\n out[3] = a[3] / b[3];\n return out;\n}\n/**\n * Math.ceil the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a vector to ceil\n * @returns {vec4} out\n */\n\nfunction ceil(out, a) {\n out[0] = Math.ceil(a[0]);\n out[1] = Math.ceil(a[1]);\n out[2] = Math.ceil(a[2]);\n out[3] = Math.ceil(a[3]);\n return out;\n}\n/**\n * Math.floor the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a vector to floor\n * @returns {vec4} out\n */\n\nfunction floor(out, a) {\n out[0] = Math.floor(a[0]);\n out[1] = Math.floor(a[1]);\n out[2] = Math.floor(a[2]);\n out[3] = Math.floor(a[3]);\n return out;\n}\n/**\n * Returns the minimum of two vec4\'s\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {vec4} out\n */\n\nfunction min(out, a, b) {\n out[0] = Math.min(a[0], b[0]);\n out[1] = Math.min(a[1], b[1]);\n out[2] = Math.min(a[2], b[2]);\n out[3] = Math.min(a[3], b[3]);\n return out;\n}\n/**\n * Returns the maximum of two vec4\'s\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {vec4} out\n */\n\nfunction max(out, a, b) {\n out[0] = Math.max(a[0], b[0]);\n out[1] = Math.max(a[1], b[1]);\n out[2] = Math.max(a[2], b[2]);\n out[3] = Math.max(a[3], b[3]);\n return out;\n}\n/**\n * Math.round the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a vector to round\n * @returns {vec4} out\n */\n\nfunction round(out, a) {\n out[0] = Math.round(a[0]);\n out[1] = Math.round(a[1]);\n out[2] = Math.round(a[2]);\n out[3] = Math.round(a[3]);\n return out;\n}\n/**\n * Scales a vec4 by a scalar number\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {vec4} out\n */\n\nfunction vec4_scale(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n out[3] = a[3] * b;\n return out;\n}\n/**\n * Adds two vec4\'s after scaling the second operand by a scalar value\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @param {Number} scale the amount to scale b by before adding\n * @returns {vec4} out\n */\n\nfunction scaleAndAdd(out, a, b, scale) {\n out[0] = a[0] + b[0] * scale;\n out[1] = a[1] + b[1] * scale;\n out[2] = a[2] + b[2] * scale;\n out[3] = a[3] + b[3] * scale;\n return out;\n}\n/**\n * Calculates the euclidian distance between two vec4\'s\n *\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {Number} distance between a and b\n */\n\nfunction distance(a, b) {\n var x = b[0] - a[0];\n var y = b[1] - a[1];\n var z = b[2] - a[2];\n var w = b[3] - a[3];\n return Math.hypot(x, y, z, w);\n}\n/**\n * Calculates the squared euclidian distance between two vec4\'s\n *\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {Number} squared distance between a and b\n */\n\nfunction squaredDistance(a, b) {\n var x = b[0] - a[0];\n var y = b[1] - a[1];\n var z = b[2] - a[2];\n var w = b[3] - a[3];\n return x * x + y * y + z * z + w * w;\n}\n/**\n * Calculates the length of a vec4\n *\n * @param {ReadonlyVec4} a vector to calculate length of\n * @returns {Number} length of a\n */\n\nfunction vec4_length(a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n var w = a[3];\n return Math.hypot(x, y, z, w);\n}\n/**\n * Calculates the squared length of a vec4\n *\n * @param {ReadonlyVec4} a vector to calculate squared length of\n * @returns {Number} squared length of a\n */\n\nfunction squaredLength(a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n var w = a[3];\n return x * x + y * y + z * z + w * w;\n}\n/**\n * Negates the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a vector to negate\n * @returns {vec4} out\n */\n\nfunction negate(out, a) {\n out[0] = -a[0];\n out[1] = -a[1];\n out[2] = -a[2];\n out[3] = -a[3];\n return out;\n}\n/**\n * Returns the inverse of the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a vector to invert\n * @returns {vec4} out\n */\n\nfunction inverse(out, a) {\n out[0] = 1.0 / a[0];\n out[1] = 1.0 / a[1];\n out[2] = 1.0 / a[2];\n out[3] = 1.0 / a[3];\n return out;\n}\n/**\n * Normalize a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a vector to normalize\n * @returns {vec4} out\n */\n\nfunction normalize(out, a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n var w = a[3];\n var len = x * x + y * y + z * z + w * w;\n\n if (len > 0) {\n len = 1 / Math.sqrt(len);\n }\n\n out[0] = x * len;\n out[1] = y * len;\n out[2] = z * len;\n out[3] = w * len;\n return out;\n}\n/**\n * Calculates the dot product of two vec4\'s\n *\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {Number} dot product of a and b\n */\n\nfunction vec4_dot(a, b) {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3];\n}\n/**\n * Returns the cross-product of three vectors in a 4-dimensional space\n *\n * @param {ReadonlyVec4} result the receiving vector\n * @param {ReadonlyVec4} U the first vector\n * @param {ReadonlyVec4} V the second vector\n * @param {ReadonlyVec4} W the third vector\n * @returns {vec4} result\n */\n\nfunction cross(out, u, v, w) {\n var A = v[0] * w[1] - v[1] * w[0],\n B = v[0] * w[2] - v[2] * w[0],\n C = v[0] * w[3] - v[3] * w[0],\n D = v[1] * w[2] - v[2] * w[1],\n E = v[1] * w[3] - v[3] * w[1],\n F = v[2] * w[3] - v[3] * w[2];\n var G = u[0];\n var H = u[1];\n var I = u[2];\n var J = u[3];\n out[0] = H * F - I * E + J * D;\n out[1] = -(G * F) + I * C - J * B;\n out[2] = G * E - H * C + J * A;\n out[3] = -(G * D) + H * B - I * A;\n return out;\n}\n/**\n * Performs a linear interpolation between two vec4\'s\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec4} out\n */\n\nfunction lerp(out, a, b, t) {\n var ax = a[0];\n var ay = a[1];\n var az = a[2];\n var aw = a[3];\n out[0] = ax + t * (b[0] - ax);\n out[1] = ay + t * (b[1] - ay);\n out[2] = az + t * (b[2] - az);\n out[3] = aw + t * (b[3] - aw);\n return out;\n}\n/**\n * Generates a random vector with the given scale\n *\n * @param {vec4} out the receiving vector\n * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned\n * @returns {vec4} out\n */\n\nfunction random(out, scale) {\n scale = scale || 1.0; // Marsaglia, George. Choosing a Point from the Surface of a\n // Sphere. Ann. Math. Statist. 43 (1972), no. 2, 645--646.\n // http://projecteuclid.org/euclid.aoms/1177692644;\n\n var v1, v2, v3, v4;\n var s1, s2;\n\n do {\n v1 = common["c" /* RANDOM */]() * 2 - 1;\n v2 = common["c" /* RANDOM */]() * 2 - 1;\n s1 = v1 * v1 + v2 * v2;\n } while (s1 >= 1);\n\n do {\n v3 = common["c" /* RANDOM */]() * 2 - 1;\n v4 = common["c" /* RANDOM */]() * 2 - 1;\n s2 = v3 * v3 + v4 * v4;\n } while (s2 >= 1);\n\n var d = Math.sqrt((1 - s1) / s2);\n out[0] = scale * v1;\n out[1] = scale * v2;\n out[2] = scale * v3 * d;\n out[3] = scale * v4 * d;\n return out;\n}\n/**\n * Transforms the vec4 with a mat4.\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the vector to transform\n * @param {ReadonlyMat4} m matrix to transform with\n * @returns {vec4} out\n */\n\nfunction transformMat4(out, a, m) {\n var x = a[0],\n y = a[1],\n z = a[2],\n w = a[3];\n out[0] = m[0] * x + m[4] * y + m[8] * z + m[12] * w;\n out[1] = m[1] * x + m[5] * y + m[9] * z + m[13] * w;\n out[2] = m[2] * x + m[6] * y + m[10] * z + m[14] * w;\n out[3] = m[3] * x + m[7] * y + m[11] * z + m[15] * w;\n return out;\n}\n/**\n * Transforms the vec4 with a quat\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the vector to transform\n * @param {ReadonlyQuat} q quaternion to transform with\n * @returns {vec4} out\n */\n\nfunction transformQuat(out, a, q) {\n var x = a[0],\n y = a[1],\n z = a[2];\n var qx = q[0],\n qy = q[1],\n qz = q[2],\n qw = q[3]; // calculate quat * vec\n\n var ix = qw * x + qy * z - qz * y;\n var iy = qw * y + qz * x - qx * z;\n var iz = qw * z + qx * y - qy * x;\n var iw = -qx * x - qy * y - qz * z; // calculate result * inverse quat\n\n out[0] = ix * qw + iw * -qx + iy * -qz - iz * -qy;\n out[1] = iy * qw + iw * -qy + iz * -qx - ix * -qz;\n out[2] = iz * qw + iw * -qz + ix * -qy - iy * -qx;\n out[3] = a[3];\n return out;\n}\n/**\n * Set the components of a vec4 to zero\n *\n * @param {vec4} out the receiving vector\n * @returns {vec4} out\n */\n\nfunction zero(out) {\n out[0] = 0.0;\n out[1] = 0.0;\n out[2] = 0.0;\n out[3] = 0.0;\n return out;\n}\n/**\n * Returns a string representation of a vector\n *\n * @param {ReadonlyVec4} a vector to represent as a string\n * @returns {String} string representation of the vector\n */\n\nfunction vec4_str(a) {\n return "vec4(" + a[0] + ", " + a[1] + ", " + a[2] + ", " + a[3] + ")";\n}\n/**\n * Returns whether or not the vectors have exactly the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyVec4} a The first vector.\n * @param {ReadonlyVec4} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\nfunction vec4_exactEquals(a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3];\n}\n/**\n * Returns whether or not the vectors have approximately the same elements in the same position.\n *\n * @param {ReadonlyVec4} a The first vector.\n * @param {ReadonlyVec4} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\nfunction vec4_equals(a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2],\n a3 = a[3];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3];\n return Math.abs(a0 - b0) <= common["b" /* EPSILON */] * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= common["b" /* EPSILON */] * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= common["b" /* EPSILON */] * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= common["b" /* EPSILON */] * Math.max(1.0, Math.abs(a3), Math.abs(b3));\n}\n/**\n * Alias for {@link vec4.subtract}\n * @function\n */\n\nvar vec4_sub = vec4_subtract;\n/**\n * Alias for {@link vec4.multiply}\n * @function\n */\n\nvar vec4_mul = vec4_multiply;\n/**\n * Alias for {@link vec4.divide}\n * @function\n */\n\nvar div = divide;\n/**\n * Alias for {@link vec4.distance}\n * @function\n */\n\nvar dist = distance;\n/**\n * Alias for {@link vec4.squaredDistance}\n * @function\n */\n\nvar sqrDist = squaredDistance;\n/**\n * Alias for {@link vec4.length}\n * @function\n */\n\nvar vec4_len = vec4_length;\n/**\n * Alias for {@link vec4.squaredLength}\n * @function\n */\n\nvar sqrLen = squaredLength;\n/**\n * Perform some operation over an array of vec4s.\n *\n * @param {Array} a the array of vectors to iterate over\n * @param {Number} stride Number of elements between the start of each vec4. If 0 assumes tightly packed\n * @param {Number} offset Number of elements to skip at the beginning of the array\n * @param {Number} count Number of vec4s to iterate over. If 0 iterates over entire array\n * @param {Function} fn Function to call for each vector in the array\n * @param {Object} [arg] additional argument to pass to fn\n * @returns {Array} a\n * @function\n */\n\nvar forEach = function () {\n var vec = vec4_create();\n return function (a, stride, offset, count, fn, arg) {\n var i, l;\n\n if (!stride) {\n stride = 4;\n }\n\n if (!offset) {\n offset = 0;\n }\n\n if (count) {\n l = Math.min(count * stride + offset, a.length);\n } else {\n l = a.length;\n }\n\n for (i = offset; i < l; i += stride) {\n vec[0] = a[i];\n vec[1] = a[i + 1];\n vec[2] = a[i + 2];\n vec[3] = a[i + 3];\n fn(vec, vec, arg);\n a[i] = vec[0];\n a[i + 1] = vec[1];\n a[i + 2] = vec[2];\n a[i + 3] = vec[3];\n }\n\n return a;\n };\n}();\n// CONCATENATED MODULE: ./node_modules/gl-matrix/esm/quat.js\n\n\n\n\n/**\n * Quaternion\n * @module quat\n */\n\n/**\n * Creates a new identity quat\n *\n * @returns {quat} a new quaternion\n */\n\nfunction quat_create() {\n var out = new common["a" /* ARRAY_TYPE */](4);\n\n if (common["a" /* ARRAY_TYPE */] != Float32Array) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n }\n\n out[3] = 1;\n return out;\n}\n/**\n * Set a quat to the identity quaternion\n *\n * @param {quat} out the receiving quaternion\n * @returns {quat} out\n */\n\nfunction quat_identity(out) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n out[3] = 1;\n return out;\n}\n/**\n * Sets a quat from the given angle and rotation axis,\n * then returns it.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyVec3} axis the axis around which to rotate\n * @param {Number} rad the angle in radians\n * @returns {quat} out\n **/\n\nfunction setAxisAngle(out, axis, rad) {\n rad = rad * 0.5;\n var s = Math.sin(rad);\n out[0] = s * axis[0];\n out[1] = s * axis[1];\n out[2] = s * axis[2];\n out[3] = Math.cos(rad);\n return out;\n}\n/**\n * Gets the rotation axis and angle for a given\n * quaternion. If a quaternion is created with\n * setAxisAngle, this method will return the same\n * values as providied in the original parameter list\n * OR functionally equivalent values.\n * Example: The quaternion formed by axis [0, 0, 1] and\n * angle -90 is the same as the quaternion formed by\n * [0, 0, 1] and 270. This method favors the latter.\n * @param {vec3} out_axis Vector receiving the axis of rotation\n * @param {ReadonlyQuat} q Quaternion to be decomposed\n * @return {Number} Angle, in radians, of the rotation\n */\n\nfunction getAxisAngle(out_axis, q) {\n var rad = Math.acos(q[3]) * 2.0;\n var s = Math.sin(rad / 2.0);\n\n if (s > common["b" /* EPSILON */]) {\n out_axis[0] = q[0] / s;\n out_axis[1] = q[1] / s;\n out_axis[2] = q[2] / s;\n } else {\n // If s is zero, return any axis (no rotation - axis does not matter)\n out_axis[0] = 1;\n out_axis[1] = 0;\n out_axis[2] = 0;\n }\n\n return rad;\n}\n/**\n * Gets the angular distance between two unit quaternions\n *\n * @param {ReadonlyQuat} a Origin unit quaternion\n * @param {ReadonlyQuat} b Destination unit quaternion\n * @return {Number} Angle, in radians, between the two quaternions\n */\n\nfunction getAngle(a, b) {\n var dotproduct = quat_dot(a, b);\n return Math.acos(2 * dotproduct * dotproduct - 1);\n}\n/**\n * Multiplies two quat\'s\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a the first operand\n * @param {ReadonlyQuat} b the second operand\n * @returns {quat} out\n */\n\nfunction quat_multiply(out, a, b) {\n var ax = a[0],\n ay = a[1],\n az = a[2],\n aw = a[3];\n var bx = b[0],\n by = b[1],\n bz = b[2],\n bw = b[3];\n out[0] = ax * bw + aw * bx + ay * bz - az * by;\n out[1] = ay * bw + aw * by + az * bx - ax * bz;\n out[2] = az * bw + aw * bz + ax * by - ay * bx;\n out[3] = aw * bw - ax * bx - ay * by - az * bz;\n return out;\n}\n/**\n * Rotates a quaternion by the given angle about the X axis\n *\n * @param {quat} out quat receiving operation result\n * @param {ReadonlyQuat} a quat to rotate\n * @param {number} rad angle (in radians) to rotate\n * @returns {quat} out\n */\n\nfunction quat_rotateX(out, a, rad) {\n rad *= 0.5;\n var ax = a[0],\n ay = a[1],\n az = a[2],\n aw = a[3];\n var bx = Math.sin(rad),\n bw = Math.cos(rad);\n out[0] = ax * bw + aw * bx;\n out[1] = ay * bw + az * bx;\n out[2] = az * bw - ay * bx;\n out[3] = aw * bw - ax * bx;\n return out;\n}\n/**\n * Rotates a quaternion by the given angle about the Y axis\n *\n * @param {quat} out quat receiving operation result\n * @param {ReadonlyQuat} a quat to rotate\n * @param {number} rad angle (in radians) to rotate\n * @returns {quat} out\n */\n\nfunction quat_rotateY(out, a, rad) {\n rad *= 0.5;\n var ax = a[0],\n ay = a[1],\n az = a[2],\n aw = a[3];\n var by = Math.sin(rad),\n bw = Math.cos(rad);\n out[0] = ax * bw - az * by;\n out[1] = ay * bw + aw * by;\n out[2] = az * bw + ax * by;\n out[3] = aw * bw - ay * by;\n return out;\n}\n/**\n * Rotates a quaternion by the given angle about the Z axis\n *\n * @param {quat} out quat receiving operation result\n * @param {ReadonlyQuat} a quat to rotate\n * @param {number} rad angle (in radians) to rotate\n * @returns {quat} out\n */\n\nfunction quat_rotateZ(out, a, rad) {\n rad *= 0.5;\n var ax = a[0],\n ay = a[1],\n az = a[2],\n aw = a[3];\n var bz = Math.sin(rad),\n bw = Math.cos(rad);\n out[0] = ax * bw + ay * bz;\n out[1] = ay * bw - ax * bz;\n out[2] = az * bw + aw * bz;\n out[3] = aw * bw - az * bz;\n return out;\n}\n/**\n * Calculates the W component of a quat from the X, Y, and Z components.\n * Assumes that quaternion is 1 unit in length.\n * Any existing W component will be ignored.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate W component of\n * @returns {quat} out\n */\n\nfunction calculateW(out, a) {\n var x = a[0],\n y = a[1],\n z = a[2];\n out[0] = x;\n out[1] = y;\n out[2] = z;\n out[3] = Math.sqrt(Math.abs(1.0 - x * x - y * y - z * z));\n return out;\n}\n/**\n * Calculate the exponential of a unit quaternion.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate the exponential of\n * @returns {quat} out\n */\n\nfunction exp(out, a) {\n var x = a[0],\n y = a[1],\n z = a[2],\n w = a[3];\n var r = Math.sqrt(x * x + y * y + z * z);\n var et = Math.exp(w);\n var s = r > 0 ? et * Math.sin(r) / r : 0;\n out[0] = x * s;\n out[1] = y * s;\n out[2] = z * s;\n out[3] = et * Math.cos(r);\n return out;\n}\n/**\n * Calculate the natural logarithm of a unit quaternion.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate the exponential of\n * @returns {quat} out\n */\n\nfunction ln(out, a) {\n var x = a[0],\n y = a[1],\n z = a[2],\n w = a[3];\n var r = Math.sqrt(x * x + y * y + z * z);\n var t = r > 0 ? Math.atan2(r, w) / r : 0;\n out[0] = x * t;\n out[1] = y * t;\n out[2] = z * t;\n out[3] = 0.5 * Math.log(x * x + y * y + z * z + w * w);\n return out;\n}\n/**\n * Calculate the scalar power of a unit quaternion.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate the exponential of\n * @param {Number} b amount to scale the quaternion by\n * @returns {quat} out\n */\n\nfunction pow(out, a, b) {\n ln(out, a);\n quat_scale(out, out, b);\n exp(out, out);\n return out;\n}\n/**\n * Performs a spherical linear interpolation between two quat\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a the first operand\n * @param {ReadonlyQuat} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {quat} out\n */\n\nfunction slerp(out, a, b, t) {\n // benchmarks:\n // http://jsperf.com/quaternion-slerp-implementations\n var ax = a[0],\n ay = a[1],\n az = a[2],\n aw = a[3];\n var bx = b[0],\n by = b[1],\n bz = b[2],\n bw = b[3];\n var omega, cosom, sinom, scale0, scale1; // calc cosine\n\n cosom = ax * bx + ay * by + az * bz + aw * bw; // adjust signs (if necessary)\n\n if (cosom < 0.0) {\n cosom = -cosom;\n bx = -bx;\n by = -by;\n bz = -bz;\n bw = -bw;\n } // calculate coefficients\n\n\n if (1.0 - cosom > common["b" /* EPSILON */]) {\n // standard case (slerp)\n omega = Math.acos(cosom);\n sinom = Math.sin(omega);\n scale0 = Math.sin((1.0 - t) * omega) / sinom;\n scale1 = Math.sin(t * omega) / sinom;\n } else {\n // "from" and "to" quaternions are very close\n // ... so we can do a linear interpolation\n scale0 = 1.0 - t;\n scale1 = t;\n } // calculate final values\n\n\n out[0] = scale0 * ax + scale1 * bx;\n out[1] = scale0 * ay + scale1 * by;\n out[2] = scale0 * az + scale1 * bz;\n out[3] = scale0 * aw + scale1 * bw;\n return out;\n}\n/**\n * Generates a random unit quaternion\n *\n * @param {quat} out the receiving quaternion\n * @returns {quat} out\n */\n\nfunction quat_random(out) {\n // Implementation of http://planning.cs.uiuc.edu/node198.html\n // TODO: Calling random 3 times is probably not the fastest solution\n var u1 = common["c" /* RANDOM */]();\n var u2 = common["c" /* RANDOM */]();\n var u3 = common["c" /* RANDOM */]();\n var sqrt1MinusU1 = Math.sqrt(1 - u1);\n var sqrtU1 = Math.sqrt(u1);\n out[0] = sqrt1MinusU1 * Math.sin(2.0 * Math.PI * u2);\n out[1] = sqrt1MinusU1 * Math.cos(2.0 * Math.PI * u2);\n out[2] = sqrtU1 * Math.sin(2.0 * Math.PI * u3);\n out[3] = sqrtU1 * Math.cos(2.0 * Math.PI * u3);\n return out;\n}\n/**\n * Calculates the inverse of a quat\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate inverse of\n * @returns {quat} out\n */\n\nfunction quat_invert(out, a) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2],\n a3 = a[3];\n var dot = a0 * a0 + a1 * a1 + a2 * a2 + a3 * a3;\n var invDot = dot ? 1.0 / dot : 0; // TODO: Would be faster to return [0,0,0,0] immediately if dot == 0\n\n out[0] = -a0 * invDot;\n out[1] = -a1 * invDot;\n out[2] = -a2 * invDot;\n out[3] = a3 * invDot;\n return out;\n}\n/**\n * Calculates the conjugate of a quat\n * If the quaternion is normalized, this function is faster than quat.inverse and produces the same result.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate conjugate of\n * @returns {quat} out\n */\n\nfunction conjugate(out, a) {\n out[0] = -a[0];\n out[1] = -a[1];\n out[2] = -a[2];\n out[3] = a[3];\n return out;\n}\n/**\n * Creates a quaternion from the given 3x3 rotation matrix.\n *\n * NOTE: The resultant quaternion is not normalized, so you should be sure\n * to renormalize the quaternion yourself where necessary.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyMat3} m rotation matrix\n * @returns {quat} out\n * @function\n */\n\nfunction fromMat3(out, m) {\n // Algorithm in Ken Shoemake\'s article in 1987 SIGGRAPH course notes\n // article "Quaternion Calculus and Fast Animation".\n var fTrace = m[0] + m[4] + m[8];\n var fRoot;\n\n if (fTrace > 0.0) {\n // |w| > 1/2, may as well choose w > 1/2\n fRoot = Math.sqrt(fTrace + 1.0); // 2w\n\n out[3] = 0.5 * fRoot;\n fRoot = 0.5 / fRoot; // 1/(4w)\n\n out[0] = (m[5] - m[7]) * fRoot;\n out[1] = (m[6] - m[2]) * fRoot;\n out[2] = (m[1] - m[3]) * fRoot;\n } else {\n // |w| <= 1/2\n var i = 0;\n if (m[4] > m[0]) i = 1;\n if (m[8] > m[i * 3 + i]) i = 2;\n var j = (i + 1) % 3;\n var k = (i + 2) % 3;\n fRoot = Math.sqrt(m[i * 3 + i] - m[j * 3 + j] - m[k * 3 + k] + 1.0);\n out[i] = 0.5 * fRoot;\n fRoot = 0.5 / fRoot;\n out[3] = (m[j * 3 + k] - m[k * 3 + j]) * fRoot;\n out[j] = (m[j * 3 + i] + m[i * 3 + j]) * fRoot;\n out[k] = (m[k * 3 + i] + m[i * 3 + k]) * fRoot;\n }\n\n return out;\n}\n/**\n * Creates a quaternion from the given euler angle x, y, z.\n *\n * @param {quat} out the receiving quaternion\n * @param {x} Angle to rotate around X axis in degrees.\n * @param {y} Angle to rotate around Y axis in degrees.\n * @param {z} Angle to rotate around Z axis in degrees.\n * @returns {quat} out\n * @function\n */\n\nfunction fromEuler(out, x, y, z) {\n var halfToRad = 0.5 * Math.PI / 180.0;\n x *= halfToRad;\n y *= halfToRad;\n z *= halfToRad;\n var sx = Math.sin(x);\n var cx = Math.cos(x);\n var sy = Math.sin(y);\n var cy = Math.cos(y);\n var sz = Math.sin(z);\n var cz = Math.cos(z);\n out[0] = sx * cy * cz - cx * sy * sz;\n out[1] = cx * sy * cz + sx * cy * sz;\n out[2] = cx * cy * sz - sx * sy * cz;\n out[3] = cx * cy * cz + sx * sy * sz;\n return out;\n}\n/**\n * Returns a string representation of a quatenion\n *\n * @param {ReadonlyQuat} a vector to represent as a string\n * @returns {String} string representation of the vector\n */\n\nfunction quat_str(a) {\n return "quat(" + a[0] + ", " + a[1] + ", " + a[2] + ", " + a[3] + ")";\n}\n/**\n * Creates a new quat initialized with values from an existing quaternion\n *\n * @param {ReadonlyQuat} a quaternion to clone\n * @returns {quat} a new quaternion\n * @function\n */\n\nvar quat_clone = vec4_clone;\n/**\n * Creates a new quat initialized with the given values\n *\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @param {Number} w W component\n * @returns {quat} a new quaternion\n * @function\n */\n\nvar quat_fromValues = vec4_fromValues;\n/**\n * Copy the values from one quat to another\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a the source quaternion\n * @returns {quat} out\n * @function\n */\n\nvar quat_copy = vec4_copy;\n/**\n * Set the components of a quat to the given values\n *\n * @param {quat} out the receiving quaternion\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @param {Number} w W component\n * @returns {quat} out\n * @function\n */\n\nvar quat_set = vec4_set;\n/**\n * Adds two quat\'s\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a the first operand\n * @param {ReadonlyQuat} b the second operand\n * @returns {quat} out\n * @function\n */\n\nvar quat_add = vec4_add;\n/**\n * Alias for {@link quat.multiply}\n * @function\n */\n\nvar quat_mul = quat_multiply;\n/**\n * Scales a quat by a scalar number\n *\n * @param {quat} out the receiving vector\n * @param {ReadonlyQuat} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {quat} out\n * @function\n */\n\nvar quat_scale = vec4_scale;\n/**\n * Calculates the dot product of two quat\'s\n *\n * @param {ReadonlyQuat} a the first operand\n * @param {ReadonlyQuat} b the second operand\n * @returns {Number} dot product of a and b\n * @function\n */\n\nvar quat_dot = vec4_dot;\n/**\n * Performs a linear interpolation between two quat\'s\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a the first operand\n * @param {ReadonlyQuat} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {quat} out\n * @function\n */\n\nvar quat_lerp = lerp;\n/**\n * Calculates the length of a quat\n *\n * @param {ReadonlyQuat} a vector to calculate length of\n * @returns {Number} length of a\n */\n\nvar quat_length = vec4_length;\n/**\n * Alias for {@link quat.length}\n * @function\n */\n\nvar quat_len = quat_length;\n/**\n * Calculates the squared length of a quat\n *\n * @param {ReadonlyQuat} a vector to calculate squared length of\n * @returns {Number} squared length of a\n * @function\n */\n\nvar quat_squaredLength = squaredLength;\n/**\n * Alias for {@link quat.squaredLength}\n * @function\n */\n\nvar quat_sqrLen = quat_squaredLength;\n/**\n * Normalize a quat\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quaternion to normalize\n * @returns {quat} out\n * @function\n */\n\nvar quat_normalize = normalize;\n/**\n * Returns whether or not the quaternions have exactly the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyQuat} a The first quaternion.\n * @param {ReadonlyQuat} b The second quaternion.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\nvar quat_exactEquals = vec4_exactEquals;\n/**\n * Returns whether or not the quaternions have approximately the same elements in the same position.\n *\n * @param {ReadonlyQuat} a The first vector.\n * @param {ReadonlyQuat} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\nvar quat_equals = vec4_equals;\n/**\n * Sets a quaternion to represent the shortest rotation from one\n * vector to another.\n *\n * Both vectors are assumed to be unit length.\n *\n * @param {quat} out the receiving quaternion.\n * @param {ReadonlyVec3} a the initial vector\n * @param {ReadonlyVec3} b the destination vector\n * @returns {quat} out\n */\n\nvar rotationTo = function () {\n var tmpvec3 = vec3["create"]();\n var xUnitVec3 = vec3["fromValues"](1, 0, 0);\n var yUnitVec3 = vec3["fromValues"](0, 1, 0);\n return function (out, a, b) {\n var dot = vec3["dot"](a, b);\n\n if (dot < -0.999999) {\n vec3["cross"](tmpvec3, xUnitVec3, a);\n if (vec3["len"](tmpvec3) < 0.000001) vec3["cross"](tmpvec3, yUnitVec3, a);\n vec3["normalize"](tmpvec3, tmpvec3);\n setAxisAngle(out, tmpvec3, Math.PI);\n return out;\n } else if (dot > 0.999999) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n out[3] = 1;\n return out;\n } else {\n vec3["cross"](tmpvec3, a, b);\n out[0] = tmpvec3[0];\n out[1] = tmpvec3[1];\n out[2] = tmpvec3[2];\n out[3] = 1 + dot;\n return quat_normalize(out, out);\n }\n };\n}();\n/**\n * Performs a spherical linear interpolation with two control points\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a the first operand\n * @param {ReadonlyQuat} b the second operand\n * @param {ReadonlyQuat} c the third operand\n * @param {ReadonlyQuat} d the fourth operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {quat} out\n */\n\nvar sqlerp = function () {\n var temp1 = quat_create();\n var temp2 = quat_create();\n return function (out, a, b, c, d, t) {\n slerp(temp1, a, d, t);\n slerp(temp2, b, c, t);\n slerp(out, temp1, temp2, 2 * t * (1 - t));\n return out;\n };\n}();\n/**\n * Sets the specified quaternion with values corresponding to the given\n * axes. Each axis is a vec3 and is expected to be unit length and\n * perpendicular to all other specified axes.\n *\n * @param {ReadonlyVec3} view the vector representing the viewing direction\n * @param {ReadonlyVec3} right the vector representing the local "right" direction\n * @param {ReadonlyVec3} up the vector representing the local "up" direction\n * @returns {quat} out\n */\n\nvar setAxes = function () {\n var matr = create();\n return function (out, view, right, up) {\n matr[0] = right[0];\n matr[3] = right[1];\n matr[6] = right[2];\n matr[1] = up[0];\n matr[4] = up[1];\n matr[7] = up[2];\n matr[2] = -view[0];\n matr[5] = -view[1];\n matr[8] = -view[2];\n return quat_normalize(out, fromMat3(out, matr));\n };\n}();\n// EXTERNAL MODULE: ./node_modules/gl-matrix/esm/vec2.js\nvar vec2 = __webpack_require__(81);\n\n// CONCATENATED MODULE: ./node_modules/gl-matrix/esm/index.js\n\n\n\n\n\n\n\n\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZ2wtbWF0cml4L2VzbS9tYXQzLmpzPzFmMDUiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2dsLW1hdHJpeC9lc20vbWF0NC5qcz82NWExIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9nbC1tYXRyaXgvZXNtL3ZlYzQuanM/NmU1ZiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZ2wtbWF0cml4L2VzbS9xdWF0LmpzPzkyNTkiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2dsLW1hdHJpeC9lc20vaW5kZXguanM/MjBlNyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUF3QztBQUN4QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLEtBQUs7QUFDbEI7O0FBRU87QUFDUCxnQkFBZ0IsNEJBQW1COztBQUVuQyxNQUFNLDRCQUFtQjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsYUFBYTtBQUN4QixhQUFhLEtBQUs7QUFDbEI7O0FBRU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxhQUFhO0FBQ3hCLGFBQWEsS0FBSztBQUNsQjs7QUFFTztBQUNQLGdCQUFnQiw0QkFBbUI7QUFDbkM7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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxhQUFhO0FBQ3hCLGFBQWEsS0FBSztBQUNsQjs7QUFFTyxTQUFTLGNBQVM7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxhQUFhO0FBQ3hCLGFBQWEsS0FBSztBQUNsQjs7QUFFTyxTQUFTLFdBQU07QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDOztBQUVsQzs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxhQUFhO0FBQ3hCLGFBQWEsS0FBSztBQUNsQjs7QUFFTyxTQUFTLFlBQU87QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7O0FBRU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsS0FBSztBQUNsQjs7QUFFTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixhQUFhLEtBQUs7QUFDbEI7O0FBRU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsS0FBSztBQUNsQjs7QUFFTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7O0FBRU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtB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QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLE1BQU0sYUFBVTtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsY0FBUztBQUN0QjtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLGFBQWE7QUFDeEIsV0FBVyxhQUFhO0FBQ3hCLFdBQVcsYUFBYTtBQUN4QixXQUFXLGFBQWE7QUFDeEIsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsS0FBSztBQUNsQjs7QUFFTztBQUNQLGNBQWMsV0FBTTtBQUNwQixjQUFjLFdBQU07QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLGFBQWE7QUFDeEIsV0FBVyxhQUFhO0FBQ3hCLFdBQVcsYUFBYTtBQUN4QixhQUFhLEtBQUs7QUFDbEI7O0FBRU87QUFDUCxhQUFhLE1BQVc7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLGNBQVM7QUFDcEI7QUFDQSxDQUFDLEc7Ozs7O0FDcnNCdUM7QUFDTjtBQUNFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0U7QUFDRjtBQUNBO0FBQ0EiLCJmaWxlIjoiMi5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGdsTWF0cml4IGZyb20gXCIuL2NvbW1vbi5qc1wiO1xuLyoqXG4gKiAzeDMgTWF0cml4XG4gKiBAbW9kdWxlIG1hdDNcbiAqL1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgaWRlbnRpdHkgbWF0M1xuICpcbiAqIEByZXR1cm5zIHttYXQzfSBhIG5ldyAzeDMgbWF0cml4XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZSgpIHtcbiAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDkpO1xuXG4gIGlmIChnbE1hdHJpeC5BUlJBWV9UWVBFICE9IEZsb2F0MzJBcnJheSkge1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgICBvdXRbM10gPSAwO1xuICAgIG91dFs1XSA9IDA7XG4gICAgb3V0WzZdID0gMDtcbiAgICBvdXRbN10gPSAwO1xuICB9XG5cbiAgb3V0WzBdID0gMTtcbiAgb3V0WzRdID0gMTtcbiAgb3V0WzhdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ29waWVzIHRoZSB1cHBlci1sZWZ0IDN4MyB2YWx1ZXMgaW50byB0aGUgZ2l2ZW4gbWF0My5cbiAqXG4gKiBAcGFyYW0ge21hdDN9IG91dCB0aGUgcmVjZWl2aW5nIDN4MyBtYXRyaXhcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBhICAgdGhlIHNvdXJjZSA0eDQgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21NYXQ0KG91dCwgYSkge1xuICBvdXRbMF0gPSBhWzBdO1xuICBvdXRbMV0gPSBhWzFdO1xuICBvdXRbMl0gPSBhWzJdO1xuICBvdXRbM10gPSBhWzRdO1xuICBvdXRbNF0gPSBhWzVdO1xuICBvdXRbNV0gPSBhWzZdO1xuICBvdXRbNl0gPSBhWzhdO1xuICBvdXRbN10gPSBhWzldO1xuICBvdXRbOF0gPSBhWzEwXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBtYXQzIGluaXRpYWxpemVkIHdpdGggdmFsdWVzIGZyb20gYW4gZXhpc3RpbmcgbWF0cml4XG4gKlxuICogQHBhcmFtIHtSZWFkb25seU1hdDN9IGEgbWF0cml4IHRvIGNsb25lXG4gKiBAcmV0dXJucyB7bWF0M30gYSBuZXcgM3gzIG1hdHJpeFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjbG9uZShhKSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSg5KTtcbiAgb3V0WzBdID0gYVswXTtcbiAgb3V0WzFdID0gYVsxXTtcbiAgb3V0WzJdID0gYVsyXTtcbiAgb3V0WzNdID0gYVszXTtcbiAgb3V0WzRdID0gYVs0XTtcbiAgb3V0WzVdID0gYVs1XTtcbiAgb3V0WzZdID0gYVs2XTtcbiAgb3V0WzddID0gYVs3XTtcbiAgb3V0WzhdID0gYVs4XTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ29weSB0aGUgdmFsdWVzIGZyb20gb25lIG1hdDMgdG8gYW5vdGhlclxuICpcbiAqIEBwYXJhbSB7bWF0M30gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0M30gYSB0aGUgc291cmNlIG1hdHJpeFxuICogQHJldHVybnMge21hdDN9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjb3B5KG91dCwgYSkge1xuICBvdXRbMF0gPSBhWzBdO1xuICBvdXRbMV0gPSBhWzFdO1xuICBvdXRbMl0gPSBhWzJdO1xuICBvdXRbM10gPSBhWzNdO1xuICBvdXRbNF0gPSBhWzRdO1xuICBvdXRbNV0gPSBhWzVdO1xuICBvdXRbNl0gPSBhWzZdO1xuICBvdXRbN10gPSBhWzddO1xuICBvdXRbOF0gPSBhWzhdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDcmVhdGUgYSBuZXcgbWF0MyB3aXRoIHRoZSBnaXZlbiB2YWx1ZXNcbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gbTAwIENvbXBvbmVudCBpbiBjb2x1bW4gMCwgcm93IDAgcG9zaXRpb24gKGluZGV4IDApXG4gKiBAcGFyYW0ge051bWJlcn0gbTAxIENvbXBvbmVudCBpbiBjb2x1bW4gMCwgcm93IDEgcG9zaXRpb24gKGluZGV4IDEpXG4gKiBAcGFyYW0ge051bWJlcn0gbTAyIENvbXBvbmVudCBpbiBjb2x1bW4gMCwgcm93IDIgcG9zaXRpb24gKGluZGV4IDIpXG4gKiBAcGFyYW0ge051bWJlcn0gbTEwIENvbXBvbmVudCBpbiBjb2x1bW4gMSwgcm93IDAgcG9zaXRpb24gKGluZGV4IDMpXG4gKiBAcGFyYW0ge051bWJlcn0gbTExIENvbXBvbmVudCBpbiBjb2x1bW4gMSwgcm93IDEgcG9zaXRpb24gKGluZGV4IDQpXG4gKiBAcGFyYW0ge051bWJlcn0gbTEyIENvbXBvbmVudCBpbiBjb2x1bW4gMSwgcm93IDIgcG9zaXRpb24gKGluZGV4IDUpXG4gKiBAcGFyYW0ge051bWJlcn0gbTIwIENvbXBvbmVudCBpbiBjb2x1bW4gMiwgcm93IDAgcG9zaXRpb24gKGluZGV4IDYpXG4gKiBAcGFyYW0ge051bWJlcn0gbTIxIENvbXBvbmVudCBpbiBjb2x1bW4gMiwgcm93IDEgcG9zaXRpb24gKGluZGV4IDcpXG4gKiBAcGFyYW0ge051bWJlcn0gbTIyIENvbXBvbmVudCBpbiBjb2x1bW4gMiwgcm93IDIgcG9zaXRpb24gKGluZGV4IDgpXG4gKiBAcmV0dXJucyB7bWF0M30gQSBuZXcgbWF0M1xuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tVmFsdWVzKG0wMCwgbTAxLCBtMDIsIG0xMCwgbTExLCBtMTIsIG0yMCwgbTIxLCBtMjIpIHtcbiAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDkpO1xuICBvdXRbMF0gPSBtMDA7XG4gIG91dFsxXSA9IG0wMTtcbiAgb3V0WzJdID0gbTAyO1xuICBvdXRbM10gPSBtMTA7XG4gIG91dFs0XSA9IG0xMTtcbiAgb3V0WzVdID0gbTEyO1xuICBvdXRbNl0gPSBtMjA7XG4gIG91dFs3XSA9IG0yMTtcbiAgb3V0WzhdID0gbTIyO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBTZXQgdGhlIGNvbXBvbmVudHMgb2YgYSBtYXQzIHRvIHRoZSBnaXZlbiB2YWx1ZXNcbiAqXG4gKiBAcGFyYW0ge21hdDN9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHtOdW1iZXJ9IG0wMCBDb21wb25lbnQgaW4gY29sdW1uIDAsIHJvdyAwIHBvc2l0aW9uIChpbmRleCAwKVxuICogQHBhcmFtIHtOdW1iZXJ9IG0wMSBDb21wb25lbnQgaW4gY29sdW1uIDAsIHJvdyAxIHBvc2l0aW9uIChpbmRleCAxKVxuICogQHBhcmFtIHtOdW1iZXJ9IG0wMiBDb21wb25lbnQgaW4gY29sdW1uIDAsIHJvdyAyIHBvc2l0aW9uIChpbmRleCAyKVxuICogQHBhcmFtIHtOdW1iZXJ9IG0xMCBDb21wb25lbnQgaW4gY29sdW1uIDEsIHJvdyAwIHBvc2l0aW9uIChpbmRleCAzKVxuICogQHBhcmFtIHtOdW1iZXJ9IG0xMSBDb21wb25lbnQgaW4gY29sdW1uIDEsIHJvdyAxIHBvc2l0aW9uIChpbmRleCA0KVxuICogQHBhcmFtIHtOdW1iZXJ9IG0xMiBDb21wb25lbnQgaW4gY29sdW1uIDEsIHJvdyAyIHBvc2l0aW9uIChpbmRleCA1KVxuICogQHBhcmFtIHtOdW1iZXJ9IG0yMCBDb21wb25lbnQgaW4gY29sdW1uIDIsIHJvdyAwIHBvc2l0aW9uIChpbmRleCA2KVxuICogQHBhcmFtIHtOdW1iZXJ9IG0yMSBDb21wb25lbnQgaW4gY29sdW1uIDIsIHJvdyAxIHBvc2l0aW9uIChpbmRleCA3KVxuICogQHBhcmFtIHtOdW1iZXJ9IG0yMiBDb21wb25lbnQgaW4gY29sdW1uIDIsIHJvdyAyIHBvc2l0aW9uIChpbmRleCA4KVxuICogQHJldHVybnMge21hdDN9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzZXQob3V0LCBtMDAsIG0wMSwgbTAyLCBtMTAsIG0xMSwgbTEyLCBtMjAsIG0yMSwgbTIyKSB7XG4gIG91dFswXSA9IG0wMDtcbiAgb3V0WzFdID0gbTAxO1xuICBvdXRbMl0gPSBtMDI7XG4gIG91dFszXSA9IG0xMDtcbiAgb3V0WzRdID0gbTExO1xuICBvdXRbNV0gPSBtMTI7XG4gIG91dFs2XSA9IG0yMDtcbiAgb3V0WzddID0gbTIxO1xuICBvdXRbOF0gPSBtMjI7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFNldCBhIG1hdDMgdG8gdGhlIGlkZW50aXR5IG1hdHJpeFxuICpcbiAqIEBwYXJhbSB7bWF0M30gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGlkZW50aXR5KG91dCkge1xuICBvdXRbMF0gPSAxO1xuICBvdXRbMV0gPSAwO1xuICBvdXRbMl0gPSAwO1xuICBvdXRbM10gPSAwO1xuICBvdXRbNF0gPSAxO1xuICBvdXRbNV0gPSAwO1xuICBvdXRbNl0gPSAwO1xuICBvdXRbN10gPSAwO1xuICBvdXRbOF0gPSAxO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBUcmFuc3Bvc2UgdGhlIHZhbHVlcyBvZiBhIG1hdDNcbiAqXG4gKiBAcGFyYW0ge21hdDN9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHtSZWFkb25seU1hdDN9IGEgdGhlIHNvdXJjZSBtYXRyaXhcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNwb3NlKG91dCwgYSkge1xuICAvLyBJZiB3ZSBhcmUgdHJhbnNwb3Npbmcgb3Vyc2VsdmVzIHdlIGNhbiBza2lwIGEgZmV3IHN0ZXBzIGJ1dCBoYXZlIHRvIGNhY2hlIHNvbWUgdmFsdWVzXG4gIGlmIChvdXQgPT09IGEpIHtcbiAgICB2YXIgYTAxID0gYVsxXSxcbiAgICAgICAgYTAyID0gYVsyXSxcbiAgICAgICAgYTEyID0gYVs1XTtcbiAgICBvdXRbMV0gPSBhWzNdO1xuICAgIG91dFsyXSA9IGFbNl07XG4gICAgb3V0WzNdID0gYTAxO1xuICAgIG91dFs1XSA9IGFbN107XG4gICAgb3V0WzZdID0gYTAyO1xuICAgIG91dFs3XSA9IGExMjtcbiAgfSBlbHNlIHtcbiAgICBvdXRbMF0gPSBhWzBdO1xuICAgIG91dFsxXSA9IGFbM107XG4gICAgb3V0WzJdID0gYVs2XTtcbiAgICBvdXRbM10gPSBhWzFdO1xuICAgIG91dFs0XSA9IGFbNF07XG4gICAgb3V0WzVdID0gYVs3XTtcbiAgICBvdXRbNl0gPSBhWzJdO1xuICAgIG91dFs3XSA9IGFbNV07XG4gICAgb3V0WzhdID0gYVs4XTtcbiAgfVxuXG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIEludmVydHMgYSBtYXQzXG4gKlxuICogQHBhcmFtIHttYXQzfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQzfSBhIHRoZSBzb3VyY2UgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGludmVydChvdXQsIGEpIHtcbiAgdmFyIGEwMCA9IGFbMF0sXG4gICAgICBhMDEgPSBhWzFdLFxuICAgICAgYTAyID0gYVsyXTtcbiAgdmFyIGExMCA9IGFbM10sXG4gICAgICBhMTEgPSBhWzRdLFxuICAgICAgYTEyID0gYVs1XTtcbiAgdmFyIGEyMCA9IGFbNl0sXG4gICAgICBhMjEgPSBhWzddLFxuICAgICAgYTIyID0gYVs4XTtcbiAgdmFyIGIwMSA9IGEyMiAqIGExMSAtIGExMiAqIGEyMTtcbiAgdmFyIGIxMSA9IC1hMjIgKiBhMTAgKyBhMTIgKiBhMjA7XG4gIHZhciBiMjEgPSBhMjEgKiBhMTAgLSBhMTEgKiBhMjA7IC8vIENhbGN1bGF0ZSB0aGUgZGV0ZXJtaW5hbnRcblxuICB2YXIgZGV0ID0gYTAwICogYjAxICsgYTAxICogYjExICsgYTAyICogYjIxO1xuXG4gIGlmICghZGV0KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBkZXQgPSAxLjAgLyBkZXQ7XG4gIG91dFswXSA9IGIwMSAqIGRldDtcbiAgb3V0WzFdID0gKC1hMjIgKiBhMDEgKyBhMDIgKiBhMjEpICogZGV0O1xuICBvdXRbMl0gPSAoYTEyICogYTAxIC0gYTAyICogYTExKSAqIGRldDtcbiAgb3V0WzNdID0gYjExICogZGV0O1xuICBvdXRbNF0gPSAoYTIyICogYTAwIC0gYTAyICogYTIwKSAqIGRldDtcbiAgb3V0WzVdID0gKC1hMTIgKiBhMDAgKyBhMDIgKiBhMTApICogZGV0O1xuICBvdXRbNl0gPSBiMjEgKiBkZXQ7XG4gIG91dFs3XSA9ICgtYTIxICogYTAwICsgYTAxICogYTIwKSAqIGRldDtcbiAgb3V0WzhdID0gKGExMSAqIGEwMCAtIGEwMSAqIGExMCkgKiBkZXQ7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGFkanVnYXRlIG9mIGEgbWF0M1xuICpcbiAqIEBwYXJhbSB7bWF0M30gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0M30gYSB0aGUgc291cmNlIG1hdHJpeFxuICogQHJldHVybnMge21hdDN9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBhZGpvaW50KG91dCwgYSkge1xuICB2YXIgYTAwID0gYVswXSxcbiAgICAgIGEwMSA9IGFbMV0sXG4gICAgICBhMDIgPSBhWzJdO1xuICB2YXIgYTEwID0gYVszXSxcbiAgICAgIGExMSA9IGFbNF0sXG4gICAgICBhMTIgPSBhWzVdO1xuICB2YXIgYTIwID0gYVs2XSxcbiAgICAgIGEyMSA9IGFbN10sXG4gICAgICBhMjIgPSBhWzhdO1xuICBvdXRbMF0gPSBhMTEgKiBhMjIgLSBhMTIgKiBhMjE7XG4gIG91dFsxXSA9IGEwMiAqIGEyMSAtIGEwMSAqIGEyMjtcbiAgb3V0WzJdID0gYTAxICogYTEyIC0gYTAyICogYTExO1xuICBvdXRbM10gPSBhMTIgKiBhMjAgLSBhMTAgKiBhMjI7XG4gIG91dFs0XSA9IGEwMCAqIGEyMiAtIGEwMiAqIGEyMDtcbiAgb3V0WzVdID0gYTAyICogYTEwIC0gYTAwICogYTEyO1xuICBvdXRbNl0gPSBhMTAgKiBhMjEgLSBhMTEgKiBhMjA7XG4gIG91dFs3XSA9IGEwMSAqIGEyMCAtIGEwMCAqIGEyMTtcbiAgb3V0WzhdID0gYTAwICogYTExIC0gYTAxICogYTEwO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBkZXRlcm1pbmFudCBvZiBhIG1hdDNcbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0M30gYSB0aGUgc291cmNlIG1hdHJpeFxuICogQHJldHVybnMge051bWJlcn0gZGV0ZXJtaW5hbnQgb2YgYVxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBkZXRlcm1pbmFudChhKSB7XG4gIHZhciBhMDAgPSBhWzBdLFxuICAgICAgYTAxID0gYVsxXSxcbiAgICAgIGEwMiA9IGFbMl07XG4gIHZhciBhMTAgPSBhWzNdLFxuICAgICAgYTExID0gYVs0XSxcbiAgICAgIGExMiA9IGFbNV07XG4gIHZhciBhMjAgPSBhWzZdLFxuICAgICAgYTIxID0gYVs3XSxcbiAgICAgIGEyMiA9IGFbOF07XG4gIHJldHVybiBhMDAgKiAoYTIyICogYTExIC0gYTEyICogYTIxKSArIGEwMSAqICgtYTIyICogYTEwICsgYTEyICogYTIwKSArIGEwMiAqIChhMjEgKiBhMTAgLSBhMTEgKiBhMjApO1xufVxuLyoqXG4gKiBNdWx0aXBsaWVzIHR3byBtYXQzJ3NcbiAqXG4gKiBAcGFyYW0ge21hdDN9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHtSZWFkb25seU1hdDN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge21hdDN9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBtdWx0aXBseShvdXQsIGEsIGIpIHtcbiAgdmFyIGEwMCA9IGFbMF0sXG4gICAgICBhMDEgPSBhWzFdLFxuICAgICAgYTAyID0gYVsyXTtcbiAgdmFyIGExMCA9IGFbM10sXG4gICAgICBhMTEgPSBhWzRdLFxuICAgICAgYTEyID0gYVs1XTtcbiAgdmFyIGEyMCA9IGFbNl0sXG4gICAgICBhMjEgPSBhWzddLFxuICAgICAgYTIyID0gYVs4XTtcbiAgdmFyIGIwMCA9IGJbMF0sXG4gICAgICBiMDEgPSBiWzFdLFxuICAgICAgYjAyID0gYlsyXTtcbiAgdmFyIGIxMCA9IGJbM10sXG4gICAgICBiMTEgPSBiWzRdLFxuICAgICAgYjEyID0gYls1XTtcbiAgdmFyIGIyMCA9IGJbNl0sXG4gICAgICBiMjEgPSBiWzddLFxuICAgICAgYjIyID0gYls4XTtcbiAgb3V0WzBdID0gYjAwICogYTAwICsgYjAxICogYTEwICsgYjAyICogYTIwO1xuICBvdXRbMV0gPSBiMDAgKiBhMDEgKyBiMDEgKiBhMTEgKyBiMDIgKiBhMjE7XG4gIG91dFsyXSA9IGIwMCAqIGEwMiArIGIwMSAqIGExMiArIGIwMiAqIGEyMjtcbiAgb3V0WzNdID0gYjEwICogYTAwICsgYjExICogYTEwICsgYjEyICogYTIwO1xuICBvdXRbNF0gPSBiMTAgKiBhMDEgKyBiMTEgKiBhMTEgKyBiMTIgKiBhMjE7XG4gIG91dFs1XSA9IGIxMCAqIGEwMiArIGIxMSAqIGExMiArIGIxMiAqIGEyMjtcbiAgb3V0WzZdID0gYjIwICogYTAwICsgYjIxICogYTEwICsgYjIyICogYTIwO1xuICBvdXRbN10gPSBiMjAgKiBhMDEgKyBiMjEgKiBhMTEgKyBiMjIgKiBhMjE7XG4gIG91dFs4XSA9IGIyMCAqIGEwMiArIGIyMSAqIGExMiArIGIyMiAqIGEyMjtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogVHJhbnNsYXRlIGEgbWF0MyBieSB0aGUgZ2l2ZW4gdmVjdG9yXG4gKlxuICogQHBhcmFtIHttYXQzfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQzfSBhIHRoZSBtYXRyaXggdG8gdHJhbnNsYXRlXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gdiB2ZWN0b3IgdG8gdHJhbnNsYXRlIGJ5XG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zbGF0ZShvdXQsIGEsIHYpIHtcbiAgdmFyIGEwMCA9IGFbMF0sXG4gICAgICBhMDEgPSBhWzFdLFxuICAgICAgYTAyID0gYVsyXSxcbiAgICAgIGExMCA9IGFbM10sXG4gICAgICBhMTEgPSBhWzRdLFxuICAgICAgYTEyID0gYVs1XSxcbiAgICAgIGEyMCA9IGFbNl0sXG4gICAgICBhMjEgPSBhWzddLFxuICAgICAgYTIyID0gYVs4XSxcbiAgICAgIHggPSB2WzBdLFxuICAgICAgeSA9IHZbMV07XG4gIG91dFswXSA9IGEwMDtcbiAgb3V0WzFdID0gYTAxO1xuICBvdXRbMl0gPSBhMDI7XG4gIG91dFszXSA9IGExMDtcbiAgb3V0WzRdID0gYTExO1xuICBvdXRbNV0gPSBhMTI7XG4gIG91dFs2XSA9IHggKiBhMDAgKyB5ICogYTEwICsgYTIwO1xuICBvdXRbN10gPSB4ICogYTAxICsgeSAqIGExMSArIGEyMTtcbiAgb3V0WzhdID0geCAqIGEwMiArIHkgKiBhMTIgKyBhMjI7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFJvdGF0ZXMgYSBtYXQzIGJ5IHRoZSBnaXZlbiBhbmdsZVxuICpcbiAqIEBwYXJhbSB7bWF0M30gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0M30gYSB0aGUgbWF0cml4IHRvIHJvdGF0ZVxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCB0aGUgYW5nbGUgdG8gcm90YXRlIHRoZSBtYXRyaXggYnlcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcm90YXRlKG91dCwgYSwgcmFkKSB7XG4gIHZhciBhMDAgPSBhWzBdLFxuICAgICAgYTAxID0gYVsxXSxcbiAgICAgIGEwMiA9IGFbMl0sXG4gICAgICBhMTAgPSBhWzNdLFxuICAgICAgYTExID0gYVs0XSxcbiAgICAgIGExMiA9IGFbNV0sXG4gICAgICBhMjAgPSBhWzZdLFxuICAgICAgYTIxID0gYVs3XSxcbiAgICAgIGEyMiA9IGFbOF0sXG4gICAgICBzID0gTWF0aC5zaW4ocmFkKSxcbiAgICAgIGMgPSBNYXRoLmNvcyhyYWQpO1xuICBvdXRbMF0gPSBjICogYTAwICsgcyAqIGExMDtcbiAgb3V0WzFdID0gYyAqIGEwMSArIHMgKiBhMTE7XG4gIG91dFsyXSA9IGMgKiBhMDIgKyBzICogYTEyO1xuICBvdXRbM10gPSBjICogYTEwIC0gcyAqIGEwMDtcbiAgb3V0WzRdID0gYyAqIGExMSAtIHMgKiBhMDE7XG4gIG91dFs1XSA9IGMgKiBhMTIgLSBzICogYTAyO1xuICBvdXRbNl0gPSBhMjA7XG4gIG91dFs3XSA9IGEyMTtcbiAgb3V0WzhdID0gYTIyO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBTY2FsZXMgdGhlIG1hdDMgYnkgdGhlIGRpbWVuc2lvbnMgaW4gdGhlIGdpdmVuIHZlYzJcbiAqXG4gKiBAcGFyYW0ge21hdDN9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHtSZWFkb25seU1hdDN9IGEgdGhlIG1hdHJpeCB0byByb3RhdGVcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSB2IHRoZSB2ZWMyIHRvIHNjYWxlIHRoZSBtYXRyaXggYnlcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcbiAqKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNjYWxlKG91dCwgYSwgdikge1xuICB2YXIgeCA9IHZbMF0sXG4gICAgICB5ID0gdlsxXTtcbiAgb3V0WzBdID0geCAqIGFbMF07XG4gIG91dFsxXSA9IHggKiBhWzFdO1xuICBvdXRbMl0gPSB4ICogYVsyXTtcbiAgb3V0WzNdID0geSAqIGFbM107XG4gIG91dFs0XSA9IHkgKiBhWzRdO1xuICBvdXRbNV0gPSB5ICogYVs1XTtcbiAgb3V0WzZdID0gYVs2XTtcbiAgb3V0WzddID0gYVs3XTtcbiAgb3V0WzhdID0gYVs4XTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIG1hdHJpeCBmcm9tIGEgdmVjdG9yIHRyYW5zbGF0aW9uXG4gKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKGJ1dCBtdWNoIGZhc3RlciB0aGFuKTpcbiAqXG4gKiAgICAgbWF0My5pZGVudGl0eShkZXN0KTtcbiAqICAgICBtYXQzLnRyYW5zbGF0ZShkZXN0LCBkZXN0LCB2ZWMpO1xuICpcbiAqIEBwYXJhbSB7bWF0M30gb3V0IG1hdDMgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSB2IFRyYW5zbGF0aW9uIHZlY3RvclxuICogQHJldHVybnMge21hdDN9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tVHJhbnNsYXRpb24ob3V0LCB2KSB7XG4gIG91dFswXSA9IDE7XG4gIG91dFsxXSA9IDA7XG4gIG91dFsyXSA9IDA7XG4gIG91dFszXSA9IDA7XG4gIG91dFs0XSA9IDE7XG4gIG91dFs1XSA9IDA7XG4gIG91dFs2XSA9IHZbMF07XG4gIG91dFs3XSA9IHZbMV07XG4gIG91dFs4XSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBtYXRyaXggZnJvbSBhIGdpdmVuIGFuZ2xlXG4gKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKGJ1dCBtdWNoIGZhc3RlciB0aGFuKTpcbiAqXG4gKiAgICAgbWF0My5pZGVudGl0eShkZXN0KTtcbiAqICAgICBtYXQzLnJvdGF0ZShkZXN0LCBkZXN0LCByYWQpO1xuICpcbiAqIEBwYXJhbSB7bWF0M30gb3V0IG1hdDMgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgdGhlIGFuZ2xlIHRvIHJvdGF0ZSB0aGUgbWF0cml4IGJ5XG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21Sb3RhdGlvbihvdXQsIHJhZCkge1xuICB2YXIgcyA9IE1hdGguc2luKHJhZCksXG4gICAgICBjID0gTWF0aC5jb3MocmFkKTtcbiAgb3V0WzBdID0gYztcbiAgb3V0WzFdID0gcztcbiAgb3V0WzJdID0gMDtcbiAgb3V0WzNdID0gLXM7XG4gIG91dFs0XSA9IGM7XG4gIG91dFs1XSA9IDA7XG4gIG91dFs2XSA9IDA7XG4gIG91dFs3XSA9IDA7XG4gIG91dFs4XSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBtYXRyaXggZnJvbSBhIHZlY3RvciBzY2FsaW5nXG4gKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKGJ1dCBtdWNoIGZhc3RlciB0aGFuKTpcbiAqXG4gKiAgICAgbWF0My5pZGVudGl0eShkZXN0KTtcbiAqICAgICBtYXQzLnNjYWxlKGRlc3QsIGRlc3QsIHZlYyk7XG4gKlxuICogQHBhcmFtIHttYXQzfSBvdXQgbWF0MyByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IHYgU2NhbGluZyB2ZWN0b3JcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVNjYWxpbmcob3V0LCB2KSB7XG4gIG91dFswXSA9IHZbMF07XG4gIG91dFsxXSA9IDA7XG4gIG91dFsyXSA9IDA7XG4gIG91dFszXSA9IDA7XG4gIG91dFs0XSA9IHZbMV07XG4gIG91dFs1XSA9IDA7XG4gIG91dFs2XSA9IDA7XG4gIG91dFs3XSA9IDA7XG4gIG91dFs4XSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENvcGllcyB0aGUgdmFsdWVzIGZyb20gYSBtYXQyZCBpbnRvIGEgbWF0M1xuICpcbiAqIEBwYXJhbSB7bWF0M30gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0MmR9IGEgdGhlIG1hdHJpeCB0byBjb3B5XG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XG4gKiovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tTWF0MmQob3V0LCBhKSB7XG4gIG91dFswXSA9IGFbMF07XG4gIG91dFsxXSA9IGFbMV07XG4gIG91dFsyXSA9IDA7XG4gIG91dFszXSA9IGFbMl07XG4gIG91dFs0XSA9IGFbM107XG4gIG91dFs1XSA9IDA7XG4gIG91dFs2XSA9IGFbNF07XG4gIG91dFs3XSA9IGFbNV07XG4gIG91dFs4XSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENhbGN1bGF0ZXMgYSAzeDMgbWF0cml4IGZyb20gdGhlIGdpdmVuIHF1YXRlcm5pb25cbiAqXG4gKiBAcGFyYW0ge21hdDN9IG91dCBtYXQzIHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdH0gcSBRdWF0ZXJuaW9uIHRvIGNyZWF0ZSBtYXRyaXggZnJvbVxuICpcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVF1YXQob3V0LCBxKSB7XG4gIHZhciB4ID0gcVswXSxcbiAgICAgIHkgPSBxWzFdLFxuICAgICAgeiA9IHFbMl0sXG4gICAgICB3ID0gcVszXTtcbiAgdmFyIHgyID0geCArIHg7XG4gIHZhciB5MiA9IHkgKyB5O1xuICB2YXIgejIgPSB6ICsgejtcbiAgdmFyIHh4ID0geCAqIHgyO1xuICB2YXIgeXggPSB5ICogeDI7XG4gIHZhciB5eSA9IHkgKiB5MjtcbiAgdmFyIHp4ID0geiAqIHgyO1xuICB2YXIgenkgPSB6ICogeTI7XG4gIHZhciB6eiA9IHogKiB6MjtcbiAgdmFyIHd4ID0gdyAqIHgyO1xuICB2YXIgd3kgPSB3ICogeTI7XG4gIHZhciB3eiA9IHcgKiB6MjtcbiAgb3V0WzBdID0gMSAtIHl5IC0geno7XG4gIG91dFszXSA9IHl4IC0gd3o7XG4gIG91dFs2XSA9IHp4ICsgd3k7XG4gIG91dFsxXSA9IHl4ICsgd3o7XG4gIG91dFs0XSA9IDEgLSB4eCAtIHp6O1xuICBvdXRbN10gPSB6eSAtIHd4O1xuICBvdXRbMl0gPSB6eCAtIHd5O1xuICBvdXRbNV0gPSB6eSArIHd4O1xuICBvdXRbOF0gPSAxIC0geHggLSB5eTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ2FsY3VsYXRlcyBhIDN4MyBub3JtYWwgbWF0cml4ICh0cmFuc3Bvc2UgaW52ZXJzZSkgZnJvbSB0aGUgNHg0IG1hdHJpeFxuICpcbiAqIEBwYXJhbSB7bWF0M30gb3V0IG1hdDMgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBhIE1hdDQgdG8gZGVyaXZlIHRoZSBub3JtYWwgbWF0cml4IGZyb21cbiAqXG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbEZyb21NYXQ0KG91dCwgYSkge1xuICB2YXIgYTAwID0gYVswXSxcbiAgICAgIGEwMSA9IGFbMV0sXG4gICAgICBhMDIgPSBhWzJdLFxuICAgICAgYTAzID0gYVszXTtcbiAgdmFyIGExMCA9IGFbNF0sXG4gICAgICBhMTEgPSBhWzVdLFxuICAgICAgYTEyID0gYVs2XSxcbiAgICAgIGExMyA9IGFbN107XG4gIHZhciBhMjAgPSBhWzhdLFxuICAgICAgYTIxID0gYVs5XSxcbiAgICAgIGEyMiA9IGFbMTBdLFxuICAgICAgYTIzID0gYVsxMV07XG4gIHZhciBhMzAgPSBhWzEyXSxcbiAgICAgIGEzMSA9IGFbMTNdLFxuICAgICAgYTMyID0gYVsxNF0sXG4gICAgICBhMzMgPSBhWzE1XTtcbiAgdmFyIGIwMCA9IGEwMCAqIGExMSAtIGEwMSAqIGExMDtcbiAgdmFyIGIwMSA9IGEwMCAqIGExMiAtIGEwMiAqIGExMDtcbiAgdmFyIGIwMiA9IGEwMCAqIGExMyAtIGEwMyAqIGExMDtcbiAgdmFyIGIwMyA9IGEwMSAqIGExMiAtIGEwMiAqIGExMTtcbiAgdmFyIGIwNCA9IGEwMSAqIGExMyAtIGEwMyAqIGExMTtcbiAgdmFyIGIwNSA9IGEwMiAqIGExMyAtIGEwMyAqIGExMjtcbiAgdmFyIGIwNiA9IGEyMCAqIGEzMSAtIGEyMSAqIGEzMDtcbiAgdmFyIGIwNyA9IGEyMCAqIGEzMiAtIGEyMiAqIGEzMDtcbiAgdmFyIGIwOCA9IGEyMCAqIGEzMyAtIGEyMyAqIGEzMDtcbiAgdmFyIGIwOSA9IGEyMSAqIGEzMiAtIGEyMiAqIGEzMTtcbiAgdmFyIGIxMCA9IGEyMSAqIGEzMyAtIGEyMyAqIGEzMTtcbiAgdmFyIGIxMSA9IGEyMiAqIGEzMyAtIGEyMyAqIGEzMjsgLy8gQ2FsY3VsYXRlIHRoZSBkZXRlcm1pbmFudFxuXG4gIHZhciBkZXQgPSBiMDAgKiBiMTEgLSBiMDEgKiBiMTAgKyBiMDIgKiBiMDkgKyBiMDMgKiBiMDggLSBiMDQgKiBiMDcgKyBiMDUgKiBiMDY7XG5cbiAgaWYgKCFkZXQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGRldCA9IDEuMCAvIGRldDtcbiAgb3V0WzBdID0gKGExMSAqIGIxMSAtIGExMiAqIGIxMCArIGExMyAqIGIwOSkgKiBkZXQ7XG4gIG91dFsxXSA9IChhMTIgKiBiMDggLSBhMTAgKiBiMTEgLSBhMTMgKiBiMDcpICogZGV0O1xuICBvdXRbMl0gPSAoYTEwICogYjEwIC0gYTExICogYjA4ICsgYTEzICogYjA2KSAqIGRldDtcbiAgb3V0WzNdID0gKGEwMiAqIGIxMCAtIGEwMSAqIGIxMSAtIGEwMyAqIGIwOSkgKiBkZXQ7XG4gIG91dFs0XSA9IChhMDAgKiBiMTEgLSBhMDIgKiBiMDggKyBhMDMgKiBiMDcpICogZGV0O1xuICBvdXRbNV0gPSAoYTAxICogYjA4IC0gYTAwICogYjEwIC0gYTAzICogYjA2KSAqIGRldDtcbiAgb3V0WzZdID0gKGEzMSAqIGIwNSAtIGEzMiAqIGIwNCArIGEzMyAqIGIwMykgKiBkZXQ7XG4gIG91dFs3XSA9IChhMzIgKiBiMDIgLSBhMzAgKiBiMDUgLSBhMzMgKiBiMDEpICogZGV0O1xuICBvdXRbOF0gPSAoYTMwICogYjA0IC0gYTMxICogYjAyICsgYTMzICogYjAwKSAqIGRldDtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogR2VuZXJhdGVzIGEgMkQgcHJvamVjdGlvbiBtYXRyaXggd2l0aCB0aGUgZ2l2ZW4gYm91bmRzXG4gKlxuICogQHBhcmFtIHttYXQzfSBvdXQgbWF0MyBmcnVzdHVtIG1hdHJpeCB3aWxsIGJlIHdyaXR0ZW4gaW50b1xuICogQHBhcmFtIHtudW1iZXJ9IHdpZHRoIFdpZHRoIG9mIHlvdXIgZ2wgY29udGV4dFxuICogQHBhcmFtIHtudW1iZXJ9IGhlaWdodCBIZWlnaHQgb2YgZ2wgY29udGV4dFxuICogQHJldHVybnMge21hdDN9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBwcm9qZWN0aW9uKG91dCwgd2lkdGgsIGhlaWdodCkge1xuICBvdXRbMF0gPSAyIC8gd2lkdGg7XG4gIG91dFsxXSA9IDA7XG4gIG91dFsyXSA9IDA7XG4gIG91dFszXSA9IDA7XG4gIG91dFs0XSA9IC0yIC8gaGVpZ2h0O1xuICBvdXRbNV0gPSAwO1xuICBvdXRbNl0gPSAtMTtcbiAgb3V0WzddID0gMTtcbiAgb3V0WzhdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIG1hdDNcbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0M30gYSBtYXRyaXggdG8gcmVwcmVzZW50IGFzIGEgc3RyaW5nXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1hdHJpeFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzdHIoYSkge1xuICByZXR1cm4gXCJtYXQzKFwiICsgYVswXSArIFwiLCBcIiArIGFbMV0gKyBcIiwgXCIgKyBhWzJdICsgXCIsIFwiICsgYVszXSArIFwiLCBcIiArIGFbNF0gKyBcIiwgXCIgKyBhWzVdICsgXCIsIFwiICsgYVs2XSArIFwiLCBcIiArIGFbN10gKyBcIiwgXCIgKyBhWzhdICsgXCIpXCI7XG59XG4vKipcbiAqIFJldHVybnMgRnJvYmVuaXVzIG5vcm0gb2YgYSBtYXQzXG4gKlxuICogQHBhcmFtIHtSZWFkb25seU1hdDN9IGEgdGhlIG1hdHJpeCB0byBjYWxjdWxhdGUgRnJvYmVuaXVzIG5vcm0gb2ZcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IEZyb2Jlbml1cyBub3JtXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb2IoYSkge1xuICByZXR1cm4gTWF0aC5oeXBvdChhWzBdLCBhWzFdLCBhWzJdLCBhWzNdLCBhWzRdLCBhWzVdLCBhWzZdLCBhWzddLCBhWzhdKTtcbn1cbi8qKlxuICogQWRkcyB0d28gbWF0MydzXG4gKlxuICogQHBhcmFtIHttYXQzfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0M30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gYWRkKG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdICsgYlswXTtcbiAgb3V0WzFdID0gYVsxXSArIGJbMV07XG4gIG91dFsyXSA9IGFbMl0gKyBiWzJdO1xuICBvdXRbM10gPSBhWzNdICsgYlszXTtcbiAgb3V0WzRdID0gYVs0XSArIGJbNF07XG4gIG91dFs1XSA9IGFbNV0gKyBiWzVdO1xuICBvdXRbNl0gPSBhWzZdICsgYls2XTtcbiAgb3V0WzddID0gYVs3XSArIGJbN107XG4gIG91dFs4XSA9IGFbOF0gKyBiWzhdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBTdWJ0cmFjdHMgbWF0cml4IGIgZnJvbSBtYXRyaXggYVxuICpcbiAqIEBwYXJhbSB7bWF0M30gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0M30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seU1hdDN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHN1YnRyYWN0KG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdIC0gYlswXTtcbiAgb3V0WzFdID0gYVsxXSAtIGJbMV07XG4gIG91dFsyXSA9IGFbMl0gLSBiWzJdO1xuICBvdXRbM10gPSBhWzNdIC0gYlszXTtcbiAgb3V0WzRdID0gYVs0XSAtIGJbNF07XG4gIG91dFs1XSA9IGFbNV0gLSBiWzVdO1xuICBvdXRbNl0gPSBhWzZdIC0gYls2XTtcbiAgb3V0WzddID0gYVs3XSAtIGJbN107XG4gIG91dFs4XSA9IGFbOF0gLSBiWzhdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBNdWx0aXBseSBlYWNoIGVsZW1lbnQgb2YgdGhlIG1hdHJpeCBieSBhIHNjYWxhci5cbiAqXG4gKiBAcGFyYW0ge21hdDN9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHtSZWFkb25seU1hdDN9IGEgdGhlIG1hdHJpeCB0byBzY2FsZVxuICogQHBhcmFtIHtOdW1iZXJ9IGIgYW1vdW50IHRvIHNjYWxlIHRoZSBtYXRyaXgncyBlbGVtZW50cyBieVxuICogQHJldHVybnMge21hdDN9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBtdWx0aXBseVNjYWxhcihvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAqIGI7XG4gIG91dFsxXSA9IGFbMV0gKiBiO1xuICBvdXRbMl0gPSBhWzJdICogYjtcbiAgb3V0WzNdID0gYVszXSAqIGI7XG4gIG91dFs0XSA9IGFbNF0gKiBiO1xuICBvdXRbNV0gPSBhWzVdICogYjtcbiAgb3V0WzZdID0gYVs2XSAqIGI7XG4gIG91dFs3XSA9IGFbN10gKiBiO1xuICBvdXRbOF0gPSBhWzhdICogYjtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQWRkcyB0d28gbWF0MydzIGFmdGVyIG11bHRpcGx5aW5nIGVhY2ggZWxlbWVudCBvZiB0aGUgc2Vjb25kIG9wZXJhbmQgYnkgYSBzY2FsYXIgdmFsdWUuXG4gKlxuICogQHBhcmFtIHttYXQzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0M30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEBwYXJhbSB7TnVtYmVyfSBzY2FsZSB0aGUgYW1vdW50IHRvIHNjYWxlIGIncyBlbGVtZW50cyBieSBiZWZvcmUgYWRkaW5nXG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG11bHRpcGx5U2NhbGFyQW5kQWRkKG91dCwgYSwgYiwgc2NhbGUpIHtcbiAgb3V0WzBdID0gYVswXSArIGJbMF0gKiBzY2FsZTtcbiAgb3V0WzFdID0gYVsxXSArIGJbMV0gKiBzY2FsZTtcbiAgb3V0WzJdID0gYVsyXSArIGJbMl0gKiBzY2FsZTtcbiAgb3V0WzNdID0gYVszXSArIGJbM10gKiBzY2FsZTtcbiAgb3V0WzRdID0gYVs0XSArIGJbNF0gKiBzY2FsZTtcbiAgb3V0WzVdID0gYVs1XSArIGJbNV0gKiBzY2FsZTtcbiAgb3V0WzZdID0gYVs2XSArIGJbNl0gKiBzY2FsZTtcbiAgb3V0WzddID0gYVs3XSArIGJbN10gKiBzY2FsZTtcbiAgb3V0WzhdID0gYVs4XSArIGJbOF0gKiBzY2FsZTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgbWF0cmljZXMgaGF2ZSBleGFjdGx5IHRoZSBzYW1lIGVsZW1lbnRzIGluIHRoZSBzYW1lIHBvc2l0aW9uICh3aGVuIGNvbXBhcmVkIHdpdGggPT09KVxuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQzfSBhIFRoZSBmaXJzdCBtYXRyaXguXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0M30gYiBUaGUgc2Vjb25kIG1hdHJpeC5cbiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSBtYXRyaWNlcyBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZXhhY3RFcXVhbHMoYSwgYikge1xuICByZXR1cm4gYVswXSA9PT0gYlswXSAmJiBhWzFdID09PSBiWzFdICYmIGFbMl0gPT09IGJbMl0gJiYgYVszXSA9PT0gYlszXSAmJiBhWzRdID09PSBiWzRdICYmIGFbNV0gPT09IGJbNV0gJiYgYVs2XSA9PT0gYls2XSAmJiBhWzddID09PSBiWzddICYmIGFbOF0gPT09IGJbOF07XG59XG4vKipcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIG1hdHJpY2VzIGhhdmUgYXBwcm94aW1hdGVseSB0aGUgc2FtZSBlbGVtZW50cyBpbiB0aGUgc2FtZSBwb3NpdGlvbi5cbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0M30gYSBUaGUgZmlyc3QgbWF0cml4LlxuICogQHBhcmFtIHtSZWFkb25seU1hdDN9IGIgVGhlIHNlY29uZCBtYXRyaXguXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgbWF0cmljZXMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGVxdWFscyhhLCBiKSB7XG4gIHZhciBhMCA9IGFbMF0sXG4gICAgICBhMSA9IGFbMV0sXG4gICAgICBhMiA9IGFbMl0sXG4gICAgICBhMyA9IGFbM10sXG4gICAgICBhNCA9IGFbNF0sXG4gICAgICBhNSA9IGFbNV0sXG4gICAgICBhNiA9IGFbNl0sXG4gICAgICBhNyA9IGFbN10sXG4gICAgICBhOCA9IGFbOF07XG4gIHZhciBiMCA9IGJbMF0sXG4gICAgICBiMSA9IGJbMV0sXG4gICAgICBiMiA9IGJbMl0sXG4gICAgICBiMyA9IGJbM10sXG4gICAgICBiNCA9IGJbNF0sXG4gICAgICBiNSA9IGJbNV0sXG4gICAgICBiNiA9IGJbNl0sXG4gICAgICBiNyA9IGJbN10sXG4gICAgICBiOCA9IGJbOF07XG4gIHJldHVybiBNYXRoLmFicyhhMCAtIGIwKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMCksIE1hdGguYWJzKGIwKSkgJiYgTWF0aC5hYnMoYTEgLSBiMSkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTEpLCBNYXRoLmFicyhiMSkpICYmIE1hdGguYWJzKGEyIC0gYjIpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEyKSwgTWF0aC5hYnMoYjIpKSAmJiBNYXRoLmFicyhhMyAtIGIzKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMyksIE1hdGguYWJzKGIzKSkgJiYgTWF0aC5hYnMoYTQgLSBiNCkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTQpLCBNYXRoLmFicyhiNCkpICYmIE1hdGguYWJzKGE1IC0gYjUpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGE1KSwgTWF0aC5hYnMoYjUpKSAmJiBNYXRoLmFicyhhNiAtIGI2KSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhNiksIE1hdGguYWJzKGI2KSkgJiYgTWF0aC5hYnMoYTcgLSBiNykgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTcpLCBNYXRoLmFicyhiNykpICYmIE1hdGguYWJzKGE4IC0gYjgpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGE4KSwgTWF0aC5hYnMoYjgpKTtcbn1cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayBtYXQzLm11bHRpcGx5fVxuICogQGZ1bmN0aW9uXG4gKi9cblxuZXhwb3J0IHZhciBtdWwgPSBtdWx0aXBseTtcbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayBtYXQzLnN1YnRyYWN0fVxuICogQGZ1bmN0aW9uXG4gKi9cblxuZXhwb3J0IHZhciBzdWIgPSBzdWJ0cmFjdDsiLCJpbXBvcnQgKiBhcyBnbE1hdHJpeCBmcm9tIFwiLi9jb21tb24uanNcIjtcbi8qKlxuICogNHg0IE1hdHJpeDxicj5Gb3JtYXQ6IGNvbHVtbi1tYWpvciwgd2hlbiB0eXBlZCBvdXQgaXQgbG9va3MgbGlrZSByb3ctbWFqb3I8YnI+VGhlIG1hdHJpY2VzIGFyZSBiZWluZyBwb3N0IG11bHRpcGxpZWQuXG4gKiBAbW9kdWxlIG1hdDRcbiAqL1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgaWRlbnRpdHkgbWF0NFxuICpcbiAqIEByZXR1cm5zIHttYXQ0fSBhIG5ldyA0eDQgbWF0cml4XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZSgpIHtcbiAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDE2KTtcblxuICBpZiAoZ2xNYXRyaXguQVJSQVlfVFlQRSAhPSBGbG9hdDMyQXJyYXkpIHtcbiAgICBvdXRbMV0gPSAwO1xuICAgIG91dFsyXSA9IDA7XG4gICAgb3V0WzNdID0gMDtcbiAgICBvdXRbNF0gPSAwO1xuICAgIG91dFs2XSA9IDA7XG4gICAgb3V0WzddID0gMDtcbiAgICBvdXRbOF0gPSAwO1xuICAgIG91dFs5XSA9IDA7XG4gICAgb3V0WzExXSA9IDA7XG4gICAgb3V0WzEyXSA9IDA7XG4gICAgb3V0WzEzXSA9IDA7XG4gICAgb3V0WzE0XSA9IDA7XG4gIH1cblxuICBvdXRbMF0gPSAxO1xuICBvdXRbNV0gPSAxO1xuICBvdXRbMTBdID0gMTtcbiAgb3V0WzE1XSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgbWF0NCBpbml0aWFsaXplZCB3aXRoIHZhbHVlcyBmcm9tIGFuIGV4aXN0aW5nIG1hdHJpeFxuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBhIG1hdHJpeCB0byBjbG9uZVxuICogQHJldHVybnMge21hdDR9IGEgbmV3IDR4NCBtYXRyaXhcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY2xvbmUoYSkge1xuICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoMTYpO1xuICBvdXRbMF0gPSBhWzBdO1xuICBvdXRbMV0gPSBhWzFdO1xuICBvdXRbMl0gPSBhWzJdO1xuICBvdXRbM10gPSBhWzNdO1xuICBvdXRbNF0gPSBhWzRdO1xuICBvdXRbNV0gPSBhWzVdO1xuICBvdXRbNl0gPSBhWzZdO1xuICBvdXRbN10gPSBhWzddO1xuICBvdXRbOF0gPSBhWzhdO1xuICBvdXRbOV0gPSBhWzldO1xuICBvdXRbMTBdID0gYVsxMF07XG4gIG91dFsxMV0gPSBhWzExXTtcbiAgb3V0WzEyXSA9IGFbMTJdO1xuICBvdXRbMTNdID0gYVsxM107XG4gIG91dFsxNF0gPSBhWzE0XTtcbiAgb3V0WzE1XSA9IGFbMTVdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDb3B5IHRoZSB2YWx1ZXMgZnJvbSBvbmUgbWF0NCB0byBhbm90aGVyXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBhIHRoZSBzb3VyY2UgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNvcHkob3V0LCBhKSB7XG4gIG91dFswXSA9IGFbMF07XG4gIG91dFsxXSA9IGFbMV07XG4gIG91dFsyXSA9IGFbMl07XG4gIG91dFszXSA9IGFbM107XG4gIG91dFs0XSA9IGFbNF07XG4gIG91dFs1XSA9IGFbNV07XG4gIG91dFs2XSA9IGFbNl07XG4gIG91dFs3XSA9IGFbN107XG4gIG91dFs4XSA9IGFbOF07XG4gIG91dFs5XSA9IGFbOV07XG4gIG91dFsxMF0gPSBhWzEwXTtcbiAgb3V0WzExXSA9IGFbMTFdO1xuICBvdXRbMTJdID0gYVsxMl07XG4gIG91dFsxM10gPSBhWzEzXTtcbiAgb3V0WzE0XSA9IGFbMTRdO1xuICBvdXRbMTVdID0gYVsxNV07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENyZWF0ZSBhIG5ldyBtYXQ0IHdpdGggdGhlIGdpdmVuIHZhbHVlc1xuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMDAgQ29tcG9uZW50IGluIGNvbHVtbiAwLCByb3cgMCBwb3NpdGlvbiAoaW5kZXggMClcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMDEgQ29tcG9uZW50IGluIGNvbHVtbiAwLCByb3cgMSBwb3NpdGlvbiAoaW5kZXggMSlcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMDIgQ29tcG9uZW50IGluIGNvbHVtbiAwLCByb3cgMiBwb3NpdGlvbiAoaW5kZXggMilcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMDMgQ29tcG9uZW50IGluIGNvbHVtbiAwLCByb3cgMyBwb3NpdGlvbiAoaW5kZXggMylcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMTAgQ29tcG9uZW50IGluIGNvbHVtbiAxLCByb3cgMCBwb3NpdGlvbiAoaW5kZXggNClcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMTEgQ29tcG9uZW50IGluIGNvbHVtbiAxLCByb3cgMSBwb3NpdGlvbiAoaW5kZXggNSlcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMTIgQ29tcG9uZW50IGluIGNvbHVtbiAxLCByb3cgMiBwb3NpdGlvbiAoaW5kZXggNilcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMTMgQ29tcG9uZW50IGluIGNvbHVtbiAxLCByb3cgMyBwb3NpdGlvbiAoaW5kZXggNylcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMjAgQ29tcG9uZW50IGluIGNvbHVtbiAyLCByb3cgMCBwb3NpdGlvbiAoaW5kZXggOClcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMjEgQ29tcG9uZW50IGluIGNvbHVtbiAyLCByb3cgMSBwb3NpdGlvbiAoaW5kZXggOSlcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMjIgQ29tcG9uZW50IGluIGNvbHVtbiAyLCByb3cgMiBwb3NpdGlvbiAoaW5kZXggMTApXG4gKiBAcGFyYW0ge051bWJlcn0gbTIzIENvbXBvbmVudCBpbiBjb2x1bW4gMiwgcm93IDMgcG9zaXRpb24gKGluZGV4IDExKVxuICogQHBhcmFtIHtOdW1iZXJ9IG0zMCBDb21wb25lbnQgaW4gY29sdW1uIDMsIHJvdyAwIHBvc2l0aW9uIChpbmRleCAxMilcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMzEgQ29tcG9uZW50IGluIGNvbHVtbiAzLCByb3cgMSBwb3NpdGlvbiAoaW5kZXggMTMpXG4gKiBAcGFyYW0ge051bWJlcn0gbTMyIENvbXBvbmVudCBpbiBjb2x1bW4gMywgcm93IDIgcG9zaXRpb24gKGluZGV4IDE0KVxuICogQHBhcmFtIHtOdW1iZXJ9IG0zMyBDb21wb25lbnQgaW4gY29sdW1uIDMsIHJvdyAzIHBvc2l0aW9uIChpbmRleCAxNSlcbiAqIEByZXR1cm5zIHttYXQ0fSBBIG5ldyBtYXQ0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21WYWx1ZXMobTAwLCBtMDEsIG0wMiwgbTAzLCBtMTAsIG0xMSwgbTEyLCBtMTMsIG0yMCwgbTIxLCBtMjIsIG0yMywgbTMwLCBtMzEsIG0zMiwgbTMzKSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSgxNik7XG4gIG91dFswXSA9IG0wMDtcbiAgb3V0WzFdID0gbTAxO1xuICBvdXRbMl0gPSBtMDI7XG4gIG91dFszXSA9IG0wMztcbiAgb3V0WzRdID0gbTEwO1xuICBvdXRbNV0gPSBtMTE7XG4gIG91dFs2XSA9IG0xMjtcbiAgb3V0WzddID0gbTEzO1xuICBvdXRbOF0gPSBtMjA7XG4gIG91dFs5XSA9IG0yMTtcbiAgb3V0WzEwXSA9IG0yMjtcbiAgb3V0WzExXSA9IG0yMztcbiAgb3V0WzEyXSA9IG0zMDtcbiAgb3V0WzEzXSA9IG0zMTtcbiAgb3V0WzE0XSA9IG0zMjtcbiAgb3V0WzE1XSA9IG0zMztcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogU2V0IHRoZSBjb21wb25lbnRzIG9mIGEgbWF0NCB0byB0aGUgZ2l2ZW4gdmFsdWVzXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMDAgQ29tcG9uZW50IGluIGNvbHVtbiAwLCByb3cgMCBwb3NpdGlvbiAoaW5kZXggMClcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMDEgQ29tcG9uZW50IGluIGNvbHVtbiAwLCByb3cgMSBwb3NpdGlvbiAoaW5kZXggMSlcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMDIgQ29tcG9uZW50IGluIGNvbHVtbiAwLCByb3cgMiBwb3NpdGlvbiAoaW5kZXggMilcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMDMgQ29tcG9uZW50IGluIGNvbHVtbiAwLCByb3cgMyBwb3NpdGlvbiAoaW5kZXggMylcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMTAgQ29tcG9uZW50IGluIGNvbHVtbiAxLCByb3cgMCBwb3NpdGlvbiAoaW5kZXggNClcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMTEgQ29tcG9uZW50IGluIGNvbHVtbiAxLCByb3cgMSBwb3NpdGlvbiAoaW5kZXggNSlcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMTIgQ29tcG9uZW50IGluIGNvbHVtbiAxLCByb3cgMiBwb3NpdGlvbiAoaW5kZXggNilcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMTMgQ29tcG9uZW50IGluIGNvbHVtbiAxLCByb3cgMyBwb3NpdGlvbiAoaW5kZXggNylcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMjAgQ29tcG9uZW50IGluIGNvbHVtbiAyLCByb3cgMCBwb3NpdGlvbiAoaW5kZXggOClcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMjEgQ29tcG9uZW50IGluIGNvbHVtbiAyLCByb3cgMSBwb3NpdGlvbiAoaW5kZXggOSlcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMjIgQ29tcG9uZW50IGluIGNvbHVtbiAyLCByb3cgMiBwb3NpdGlvbiAoaW5kZXggMTApXG4gKiBAcGFyYW0ge051bWJlcn0gbTIzIENvbXBvbmVudCBpbiBjb2x1bW4gMiwgcm93IDMgcG9zaXRpb24gKGluZGV4IDExKVxuICogQHBhcmFtIHtOdW1iZXJ9IG0zMCBDb21wb25lbnQgaW4gY29sdW1uIDMsIHJvdyAwIHBvc2l0aW9uIChpbmRleCAxMilcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMzEgQ29tcG9uZW50IGluIGNvbHVtbiAzLCByb3cgMSBwb3NpdGlvbiAoaW5kZXggMTMpXG4gKiBAcGFyYW0ge051bWJlcn0gbTMyIENvbXBvbmVudCBpbiBjb2x1bW4gMywgcm93IDIgcG9zaXRpb24gKGluZGV4IDE0KVxuICogQHBhcmFtIHtOdW1iZXJ9IG0zMyBDb21wb25lbnQgaW4gY29sdW1uIDMsIHJvdyAzIHBvc2l0aW9uIChpbmRleCAxNSlcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc2V0KG91dCwgbTAwLCBtMDEsIG0wMiwgbTAzLCBtMTAsIG0xMSwgbTEyLCBtMTMsIG0yMCwgbTIxLCBtMjIsIG0yMywgbTMwLCBtMzEsIG0zMiwgbTMzKSB7XG4gIG91dFswXSA9IG0wMDtcbiAgb3V0WzFdID0gbTAxO1xuICBvdXRbMl0gPSBtMDI7XG4gIG91dFszXSA9IG0wMztcbiAgb3V0WzRdID0gbTEwO1xuICBvdXRbNV0gPSBtMTE7XG4gIG91dFs2XSA9IG0xMjtcbiAgb3V0WzddID0gbTEzO1xuICBvdXRbOF0gPSBtMjA7XG4gIG91dFs5XSA9IG0yMTtcbiAgb3V0WzEwXSA9IG0yMjtcbiAgb3V0WzExXSA9IG0yMztcbiAgb3V0WzEyXSA9IG0zMDtcbiAgb3V0WzEzXSA9IG0zMTtcbiAgb3V0WzE0XSA9IG0zMjtcbiAgb3V0WzE1XSA9IG0zMztcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogU2V0IGEgbWF0NCB0byB0aGUgaWRlbnRpdHkgbWF0cml4XG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gaWRlbnRpdHkob3V0KSB7XG4gIG91dFswXSA9IDE7XG4gIG91dFsxXSA9IDA7XG4gIG91dFsyXSA9IDA7XG4gIG91dFszXSA9IDA7XG4gIG91dFs0XSA9IDA7XG4gIG91dFs1XSA9IDE7XG4gIG91dFs2XSA9IDA7XG4gIG91dFs3XSA9IDA7XG4gIG91dFs4XSA9IDA7XG4gIG91dFs5XSA9IDA7XG4gIG91dFsxMF0gPSAxO1xuICBvdXRbMTFdID0gMDtcbiAgb3V0WzEyXSA9IDA7XG4gIG91dFsxM10gPSAwO1xuICBvdXRbMTRdID0gMDtcbiAgb3V0WzE1XSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFRyYW5zcG9zZSB0aGUgdmFsdWVzIG9mIGEgbWF0NFxuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gYSB0aGUgc291cmNlIG1hdHJpeFxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc3Bvc2Uob3V0LCBhKSB7XG4gIC8vIElmIHdlIGFyZSB0cmFuc3Bvc2luZyBvdXJzZWx2ZXMgd2UgY2FuIHNraXAgYSBmZXcgc3RlcHMgYnV0IGhhdmUgdG8gY2FjaGUgc29tZSB2YWx1ZXNcbiAgaWYgKG91dCA9PT0gYSkge1xuICAgIHZhciBhMDEgPSBhWzFdLFxuICAgICAgICBhMDIgPSBhWzJdLFxuICAgICAgICBhMDMgPSBhWzNdO1xuICAgIHZhciBhMTIgPSBhWzZdLFxuICAgICAgICBhMTMgPSBhWzddO1xuICAgIHZhciBhMjMgPSBhWzExXTtcbiAgICBvdXRbMV0gPSBhWzRdO1xuICAgIG91dFsyXSA9IGFbOF07XG4gICAgb3V0WzNdID0gYVsxMl07XG4gICAgb3V0WzRdID0gYTAxO1xuICAgIG91dFs2XSA9IGFbOV07XG4gICAgb3V0WzddID0gYVsxM107XG4gICAgb3V0WzhdID0gYTAyO1xuICAgIG91dFs5XSA9IGExMjtcbiAgICBvdXRbMTFdID0gYVsxNF07XG4gICAgb3V0WzEyXSA9IGEwMztcbiAgICBvdXRbMTNdID0gYTEzO1xuICAgIG91dFsxNF0gPSBhMjM7XG4gIH0gZWxzZSB7XG4gICAgb3V0WzBdID0gYVswXTtcbiAgICBvdXRbMV0gPSBhWzRdO1xuICAgIG91dFsyXSA9IGFbOF07XG4gICAgb3V0WzNdID0gYVsxMl07XG4gICAgb3V0WzRdID0gYVsxXTtcbiAgICBvdXRbNV0gPSBhWzVdO1xuICAgIG91dFs2XSA9IGFbOV07XG4gICAgb3V0WzddID0gYVsxM107XG4gICAgb3V0WzhdID0gYVsyXTtcbiAgICBvdXRbOV0gPSBhWzZdO1xuICAgIG91dFsxMF0gPSBhWzEwXTtcbiAgICBvdXRbMTFdID0gYVsxNF07XG4gICAgb3V0WzEyXSA9IGFbM107XG4gICAgb3V0WzEzXSA9IGFbN107XG4gICAgb3V0WzE0XSA9IGFbMTFdO1xuICAgIG91dFsxNV0gPSBhWzE1XTtcbiAgfVxuXG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIEludmVydHMgYSBtYXQ0XG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBhIHRoZSBzb3VyY2UgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGludmVydChvdXQsIGEpIHtcbiAgdmFyIGEwMCA9IGFbMF0sXG4gICAgICBhMDEgPSBhWzFdLFxuICAgICAgYTAyID0gYVsyXSxcbiAgICAgIGEwMyA9IGFbM107XG4gIHZhciBhMTAgPSBhWzRdLFxuICAgICAgYTExID0gYVs1XSxcbiAgICAgIGExMiA9IGFbNl0sXG4gICAgICBhMTMgPSBhWzddO1xuICB2YXIgYTIwID0gYVs4XSxcbiAgICAgIGEyMSA9IGFbOV0sXG4gICAgICBhMjIgPSBhWzEwXSxcbiAgICAgIGEyMyA9IGFbMTFdO1xuICB2YXIgYTMwID0gYVsxMl0sXG4gICAgICBhMzEgPSBhWzEzXSxcbiAgICAgIGEzMiA9IGFbMTRdLFxuICAgICAgYTMzID0gYVsxNV07XG4gIHZhciBiMDAgPSBhMDAgKiBhMTEgLSBhMDEgKiBhMTA7XG4gIHZhciBiMDEgPSBhMDAgKiBhMTIgLSBhMDIgKiBhMTA7XG4gIHZhciBiMDIgPSBhMDAgKiBhMTMgLSBhMDMgKiBhMTA7XG4gIHZhciBiMDMgPSBhMDEgKiBhMTIgLSBhMDIgKiBhMTE7XG4gIHZhciBiMDQgPSBhMDEgKiBhMTMgLSBhMDMgKiBhMTE7XG4gIHZhciBiMDUgPSBhMDIgKiBhMTMgLSBhMDMgKiBhMTI7XG4gIHZhciBiMDYgPSBhMjAgKiBhMzEgLSBhMjEgKiBhMzA7XG4gIHZhciBiMDcgPSBhMjAgKiBhMzIgLSBhMjIgKiBhMzA7XG4gIHZhciBiMDggPSBhMjAgKiBhMzMgLSBhMjMgKiBhMzA7XG4gIHZhciBiMDkgPSBhMjEgKiBhMzIgLSBhMjIgKiBhMzE7XG4gIHZhciBiMTAgPSBhMjEgKiBhMzMgLSBhMjMgKiBhMzE7XG4gIHZhciBiMTEgPSBhMjIgKiBhMzMgLSBhMjMgKiBhMzI7IC8vIENhbGN1bGF0ZSB0aGUgZGV0ZXJtaW5hbnRcblxuICB2YXIgZGV0ID0gYjAwICogYjExIC0gYjAxICogYjEwICsgYjAyICogYjA5ICsgYjAzICogYjA4IC0gYjA0ICogYjA3ICsgYjA1ICogYjA2O1xuXG4gIGlmICghZGV0KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBkZXQgPSAxLjAgLyBkZXQ7XG4gIG91dFswXSA9IChhMTEgKiBiMTEgLSBhMTIgKiBiMTAgKyBhMTMgKiBiMDkpICogZGV0O1xuICBvdXRbMV0gPSAoYTAyICogYjEwIC0gYTAxICogYjExIC0gYTAzICogYjA5KSAqIGRldDtcbiAgb3V0WzJdID0gKGEzMSAqIGIwNSAtIGEzMiAqIGIwNCArIGEzMyAqIGIwMykgKiBkZXQ7XG4gIG91dFszXSA9IChhMjIgKiBiMDQgLSBhMjEgKiBiMDUgLSBhMjMgKiBiMDMpICogZGV0O1xuICBvdXRbNF0gPSAoYTEyICogYjA4IC0gYTEwICogYjExIC0gYTEzICogYjA3KSAqIGRldDtcbiAgb3V0WzVdID0gKGEwMCAqIGIxMSAtIGEwMiAqIGIwOCArIGEwMyAqIGIwNykgKiBkZXQ7XG4gIG91dFs2XSA9IChhMzIgKiBiMDIgLSBhMzAgKiBiMDUgLSBhMzMgKiBiMDEpICogZGV0O1xuICBvdXRbN10gPSAoYTIwICogYjA1IC0gYTIyICogYjAyICsgYTIzICogYjAxKSAqIGRldDtcbiAgb3V0WzhdID0gKGExMCAqIGIxMCAtIGExMSAqIGIwOCArIGExMyAqIGIwNikgKiBkZXQ7XG4gIG91dFs5XSA9IChhMDEgKiBiMDggLSBhMDAgKiBiMTAgLSBhMDMgKiBiMDYpICogZGV0O1xuICBvdXRbMTBdID0gKGEzMCAqIGIwNCAtIGEzMSAqIGIwMiArIGEzMyAqIGIwMCkgKiBkZXQ7XG4gIG91dFsxMV0gPSAoYTIxICogYjAyIC0gYTIwICogYjA0IC0gYTIzICogYjAwKSAqIGRldDtcbiAgb3V0WzEyXSA9IChhMTEgKiBiMDcgLSBhMTAgKiBiMDkgLSBhMTIgKiBiMDYpICogZGV0O1xuICBvdXRbMTNdID0gKGEwMCAqIGIwOSAtIGEwMSAqIGIwNyArIGEwMiAqIGIwNikgKiBkZXQ7XG4gIG91dFsxNF0gPSAoYTMxICogYjAxIC0gYTMwICogYjAzIC0gYTMyICogYjAwKSAqIGRldDtcbiAgb3V0WzE1XSA9IChhMjAgKiBiMDMgLSBhMjEgKiBiMDEgKyBhMjIgKiBiMDApICogZGV0O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBhZGp1Z2F0ZSBvZiBhIG1hdDRcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IGEgdGhlIHNvdXJjZSBtYXRyaXhcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gYWRqb2ludChvdXQsIGEpIHtcbiAgdmFyIGEwMCA9IGFbMF0sXG4gICAgICBhMDEgPSBhWzFdLFxuICAgICAgYTAyID0gYVsyXSxcbiAgICAgIGEwMyA9IGFbM107XG4gIHZhciBhMTAgPSBhWzRdLFxuICAgICAgYTExID0gYVs1XSxcbiAgICAgIGExMiA9IGFbNl0sXG4gICAgICBhMTMgPSBhWzddO1xuICB2YXIgYTIwID0gYVs4XSxcbiAgICAgIGEyMSA9IGFbOV0sXG4gICAgICBhMjIgPSBhWzEwXSxcbiAgICAgIGEyMyA9IGFbMTFdO1xuICB2YXIgYTMwID0gYVsxMl0sXG4gICAgICBhMzEgPSBhWzEzXSxcbiAgICAgIGEzMiA9IGFbMTRdLFxuICAgICAgYTMzID0gYVsxNV07XG4gIG91dFswXSA9IGExMSAqIChhMjIgKiBhMzMgLSBhMjMgKiBhMzIpIC0gYTIxICogKGExMiAqIGEzMyAtIGExMyAqIGEzMikgKyBhMzEgKiAoYTEyICogYTIzIC0gYTEzICogYTIyKTtcbiAgb3V0WzFdID0gLShhMDEgKiAoYTIyICogYTMzIC0gYTIzICogYTMyKSAtIGEyMSAqIChhMDIgKiBhMzMgLSBhMDMgKiBhMzIpICsgYTMxICogKGEwMiAqIGEyMyAtIGEwMyAqIGEyMikpO1xuICBvdXRbMl0gPSBhMDEgKiAoYTEyICogYTMzIC0gYTEzICogYTMyKSAtIGExMSAqIChhMDIgKiBhMzMgLSBhMDMgKiBhMzIpICsgYTMxICogKGEwMiAqIGExMyAtIGEwMyAqIGExMik7XG4gIG91dFszXSA9IC0oYTAxICogKGExMiAqIGEyMyAtIGExMyAqIGEyMikgLSBhMTEgKiAoYTAyICogYTIzIC0gYTAzICogYTIyKSArIGEyMSAqIChhMDIgKiBhMTMgLSBhMDMgKiBhMTIpKTtcbiAgb3V0WzRdID0gLShhMTAgKiAoYTIyICogYTMzIC0gYTIzICogYTMyKSAtIGEyMCAqIChhMTIgKiBhMzMgLSBhMTMgKiBhMzIpICsgYTMwICogKGExMiAqIGEyMyAtIGExMyAqIGEyMikpO1xuICBvdXRbNV0gPSBhMDAgKiAoYTIyICogYTMzIC0gYTIzICogYTMyKSAtIGEyMCAqIChhMDIgKiBhMzMgLSBhMDMgKiBhMzIpICsgYTMwICogKGEwMiAqIGEyMyAtIGEwMyAqIGEyMik7XG4gIG91dFs2XSA9IC0oYTAwICogKGExMiAqIGEzMyAtIGExMyAqIGEzMikgLSBhMTAgKiAoYTAyICogYTMzIC0gYTAzICogYTMyKSArIGEzMCAqIChhMDIgKiBhMTMgLSBhMDMgKiBhMTIpKTtcbiAgb3V0WzddID0gYTAwICogKGExMiAqIGEyMyAtIGExMyAqIGEyMikgLSBhMTAgKiAoYTAyICogYTIzIC0gYTAzICogYTIyKSArIGEyMCAqIChhMDIgKiBhMTMgLSBhMDMgKiBhMTIpO1xuICBvdXRbOF0gPSBhMTAgKiAoYTIxICogYTMzIC0gYTIzICogYTMxKSAtIGEyMCAqIChhMTEgKiBhMzMgLSBhMTMgKiBhMzEpICsgYTMwICogKGExMSAqIGEyMyAtIGExMyAqIGEyMSk7XG4gIG91dFs5XSA9IC0oYTAwICogKGEyMSAqIGEzMyAtIGEyMyAqIGEzMSkgLSBhMjAgKiAoYTAxICogYTMzIC0gYTAzICogYTMxKSArIGEzMCAqIChhMDEgKiBhMjMgLSBhMDMgKiBhMjEpKTtcbiAgb3V0WzEwXSA9IGEwMCAqIChhMTEgKiBhMzMgLSBhMTMgKiBhMzEpIC0gYTEwICogKGEwMSAqIGEzMyAtIGEwMyAqIGEzMSkgKyBhMzAgKiAoYTAxICogYTEzIC0gYTAzICogYTExKTtcbiAgb3V0WzExXSA9IC0oYTAwICogKGExMSAqIGEyMyAtIGExMyAqIGEyMSkgLSBhMTAgKiAoYTAxICogYTIzIC0gYTAzICogYTIxKSArIGEyMCAqIChhMDEgKiBhMTMgLSBhMDMgKiBhMTEpKTtcbiAgb3V0WzEyXSA9IC0oYTEwICogKGEyMSAqIGEzMiAtIGEyMiAqIGEzMSkgLSBhMjAgKiAoYTExICogYTMyIC0gYTEyICogYTMxKSArIGEzMCAqIChhMTEgKiBhMjIgLSBhMTIgKiBhMjEpKTtcbiAgb3V0WzEzXSA9IGEwMCAqIChhMjEgKiBhMzIgLSBhMjIgKiBhMzEpIC0gYTIwICogKGEwMSAqIGEzMiAtIGEwMiAqIGEzMSkgKyBhMzAgKiAoYTAxICogYTIyIC0gYTAyICogYTIxKTtcbiAgb3V0WzE0XSA9IC0oYTAwICogKGExMSAqIGEzMiAtIGExMiAqIGEzMSkgLSBhMTAgKiAoYTAxICogYTMyIC0gYTAyICogYTMxKSArIGEzMCAqIChhMDEgKiBhMTIgLSBhMDIgKiBhMTEpKTtcbiAgb3V0WzE1XSA9IGEwMCAqIChhMTEgKiBhMjIgLSBhMTIgKiBhMjEpIC0gYTEwICogKGEwMSAqIGEyMiAtIGEwMiAqIGEyMSkgKyBhMjAgKiAoYTAxICogYTEyIC0gYTAyICogYTExKTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgZGV0ZXJtaW5hbnQgb2YgYSBtYXQ0XG4gKlxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IGEgdGhlIHNvdXJjZSBtYXRyaXhcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGRldGVybWluYW50IG9mIGFcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZGV0ZXJtaW5hbnQoYSkge1xuICB2YXIgYTAwID0gYVswXSxcbiAgICAgIGEwMSA9IGFbMV0sXG4gICAgICBhMDIgPSBhWzJdLFxuICAgICAgYTAzID0gYVszXTtcbiAgdmFyIGExMCA9IGFbNF0sXG4gICAgICBhMTEgPSBhWzVdLFxuICAgICAgYTEyID0gYVs2XSxcbiAgICAgIGExMyA9IGFbN107XG4gIHZhciBhMjAgPSBhWzhdLFxuICAgICAgYTIxID0gYVs5XSxcbiAgICAgIGEyMiA9IGFbMTBdLFxuICAgICAgYTIzID0gYVsxMV07XG4gIHZhciBhMzAgPSBhWzEyXSxcbiAgICAgIGEzMSA9IGFbMTNdLFxuICAgICAgYTMyID0gYVsxNF0sXG4gICAgICBhMzMgPSBhWzE1XTtcbiAgdmFyIGIwMCA9IGEwMCAqIGExMSAtIGEwMSAqIGExMDtcbiAgdmFyIGIwMSA9IGEwMCAqIGExMiAtIGEwMiAqIGExMDtcbiAgdmFyIGIwMiA9IGEwMCAqIGExMyAtIGEwMyAqIGExMDtcbiAgdmFyIGIwMyA9IGEwMSAqIGExMiAtIGEwMiAqIGExMTtcbiAgdmFyIGIwNCA9IGEwMSAqIGExMyAtIGEwMyAqIGExMTtcbiAgdmFyIGIwNSA9IGEwMiAqIGExMyAtIGEwMyAqIGExMjtcbiAgdmFyIGIwNiA9IGEyMCAqIGEzMSAtIGEyMSAqIGEzMDtcbiAgdmFyIGIwNyA9IGEyMCAqIGEzMiAtIGEyMiAqIGEzMDtcbiAgdmFyIGIwOCA9IGEyMCAqIGEzMyAtIGEyMyAqIGEzMDtcbiAgdmFyIGIwOSA9IGEyMSAqIGEzMiAtIGEyMiAqIGEzMTtcbiAgdmFyIGIxMCA9IGEyMSAqIGEzMyAtIGEyMyAqIGEzMTtcbiAgdmFyIGIxMSA9IGEyMiAqIGEzMyAtIGEyMyAqIGEzMjsgLy8gQ2FsY3VsYXRlIHRoZSBkZXRlcm1pbmFudFxuXG4gIHJldHVybiBiMDAgKiBiMTEgLSBiMDEgKiBiMTAgKyBiMDIgKiBiMDkgKyBiMDMgKiBiMDggLSBiMDQgKiBiMDcgKyBiMDUgKiBiMDY7XG59XG4vKipcbiAqIE11bHRpcGxpZXMgdHdvIG1hdDRzXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbXVsdGlwbHkob3V0LCBhLCBiKSB7XG4gIHZhciBhMDAgPSBhWzBdLFxuICAgICAgYTAxID0gYVsxXSxcbiAgICAgIGEwMiA9IGFbMl0sXG4gICAgICBhMDMgPSBhWzNdO1xuICB2YXIgYTEwID0gYVs0XSxcbiAgICAgIGExMSA9IGFbNV0sXG4gICAgICBhMTIgPSBhWzZdLFxuICAgICAgYTEzID0gYVs3XTtcbiAgdmFyIGEyMCA9IGFbOF0sXG4gICAgICBhMjEgPSBhWzldLFxuICAgICAgYTIyID0gYVsxMF0sXG4gICAgICBhMjMgPSBhWzExXTtcbiAgdmFyIGEzMCA9IGFbMTJdLFxuICAgICAgYTMxID0gYVsxM10sXG4gICAgICBhMzIgPSBhWzE0XSxcbiAgICAgIGEzMyA9IGFbMTVdOyAvLyBDYWNoZSBvbmx5IHRoZSBjdXJyZW50IGxpbmUgb2YgdGhlIHNlY29uZCBtYXRyaXhcblxuICB2YXIgYjAgPSBiWzBdLFxuICAgICAgYjEgPSBiWzFdLFxuICAgICAgYjIgPSBiWzJdLFxuICAgICAgYjMgPSBiWzNdO1xuICBvdXRbMF0gPSBiMCAqIGEwMCArIGIxICogYTEwICsgYjIgKiBhMjAgKyBiMyAqIGEzMDtcbiAgb3V0WzFdID0gYjAgKiBhMDEgKyBiMSAqIGExMSArIGIyICogYTIxICsgYjMgKiBhMzE7XG4gIG91dFsyXSA9IGIwICogYTAyICsgYjEgKiBhMTIgKyBiMiAqIGEyMiArIGIzICogYTMyO1xuICBvdXRbM10gPSBiMCAqIGEwMyArIGIxICogYTEzICsgYjIgKiBhMjMgKyBiMyAqIGEzMztcbiAgYjAgPSBiWzRdO1xuICBiMSA9IGJbNV07XG4gIGIyID0gYls2XTtcbiAgYjMgPSBiWzddO1xuICBvdXRbNF0gPSBiMCAqIGEwMCArIGIxICogYTEwICsgYjIgKiBhMjAgKyBiMyAqIGEzMDtcbiAgb3V0WzVdID0gYjAgKiBhMDEgKyBiMSAqIGExMSArIGIyICogYTIxICsgYjMgKiBhMzE7XG4gIG91dFs2XSA9IGIwICogYTAyICsgYjEgKiBhMTIgKyBiMiAqIGEyMiArIGIzICogYTMyO1xuICBvdXRbN10gPSBiMCAqIGEwMyArIGIxICogYTEzICsgYjIgKiBhMjMgKyBiMyAqIGEzMztcbiAgYjAgPSBiWzhdO1xuICBiMSA9IGJbOV07XG4gIGIyID0gYlsxMF07XG4gIGIzID0gYlsxMV07XG4gIG91dFs4XSA9IGIwICogYTAwICsgYjEgKiBhMTAgKyBiMiAqIGEyMCArIGIzICogYTMwO1xuICBvdXRbOV0gPSBiMCAqIGEwMSArIGIxICogYTExICsgYjIgKiBhMjEgKyBiMyAqIGEzMTtcbiAgb3V0WzEwXSA9IGIwICogYTAyICsgYjEgKiBhMTIgKyBiMiAqIGEyMiArIGIzICogYTMyO1xuICBvdXRbMTFdID0gYjAgKiBhMDMgKyBiMSAqIGExMyArIGIyICogYTIzICsgYjMgKiBhMzM7XG4gIGIwID0gYlsxMl07XG4gIGIxID0gYlsxM107XG4gIGIyID0gYlsxNF07XG4gIGIzID0gYlsxNV07XG4gIG91dFsxMl0gPSBiMCAqIGEwMCArIGIxICogYTEwICsgYjIgKiBhMjAgKyBiMyAqIGEzMDtcbiAgb3V0WzEzXSA9IGIwICogYTAxICsgYjEgKiBhMTEgKyBiMiAqIGEyMSArIGIzICogYTMxO1xuICBvdXRbMTRdID0gYjAgKiBhMDIgKyBiMSAqIGExMiArIGIyICogYTIyICsgYjMgKiBhMzI7XG4gIG91dFsxNV0gPSBiMCAqIGEwMyArIGIxICogYTEzICsgYjIgKiBhMjMgKyBiMyAqIGEzMztcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogVHJhbnNsYXRlIGEgbWF0NCBieSB0aGUgZ2l2ZW4gdmVjdG9yXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBhIHRoZSBtYXRyaXggdG8gdHJhbnNsYXRlXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gdiB2ZWN0b3IgdG8gdHJhbnNsYXRlIGJ5XG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zbGF0ZShvdXQsIGEsIHYpIHtcbiAgdmFyIHggPSB2WzBdLFxuICAgICAgeSA9IHZbMV0sXG4gICAgICB6ID0gdlsyXTtcbiAgdmFyIGEwMCwgYTAxLCBhMDIsIGEwMztcbiAgdmFyIGExMCwgYTExLCBhMTIsIGExMztcbiAgdmFyIGEyMCwgYTIxLCBhMjIsIGEyMztcblxuICBpZiAoYSA9PT0gb3V0KSB7XG4gICAgb3V0WzEyXSA9IGFbMF0gKiB4ICsgYVs0XSAqIHkgKyBhWzhdICogeiArIGFbMTJdO1xuICAgIG91dFsxM10gPSBhWzFdICogeCArIGFbNV0gKiB5ICsgYVs5XSAqIHogKyBhWzEzXTtcbiAgICBvdXRbMTRdID0gYVsyXSAqIHggKyBhWzZdICogeSArIGFbMTBdICogeiArIGFbMTRdO1xuICAgIG91dFsxNV0gPSBhWzNdICogeCArIGFbN10gKiB5ICsgYVsxMV0gKiB6ICsgYVsxNV07XG4gIH0gZWxzZSB7XG4gICAgYTAwID0gYVswXTtcbiAgICBhMDEgPSBhWzFdO1xuICAgIGEwMiA9IGFbMl07XG4gICAgYTAzID0gYVszXTtcbiAgICBhMTAgPSBhWzRdO1xuICAgIGExMSA9IGFbNV07XG4gICAgYTEyID0gYVs2XTtcbiAgICBhMTMgPSBhWzddO1xuICAgIGEyMCA9IGFbOF07XG4gICAgYTIxID0gYVs5XTtcbiAgICBhMjIgPSBhWzEwXTtcbiAgICBhMjMgPSBhWzExXTtcbiAgICBvdXRbMF0gPSBhMDA7XG4gICAgb3V0WzFdID0gYTAxO1xuICAgIG91dFsyXSA9IGEwMjtcbiAgICBvdXRbM10gPSBhMDM7XG4gICAgb3V0WzRdID0gYTEwO1xuICAgIG91dFs1XSA9IGExMTtcbiAgICBvdXRbNl0gPSBhMTI7XG4gICAgb3V0WzddID0gYTEzO1xuICAgIG91dFs4XSA9IGEyMDtcbiAgICBvdXRbOV0gPSBhMjE7XG4gICAgb3V0WzEwXSA9IGEyMjtcbiAgICBvdXRbMTFdID0gYTIzO1xuICAgIG91dFsxMl0gPSBhMDAgKiB4ICsgYTEwICogeSArIGEyMCAqIHogKyBhWzEyXTtcbiAgICBvdXRbMTNdID0gYTAxICogeCArIGExMSAqIHkgKyBhMjEgKiB6ICsgYVsxM107XG4gICAgb3V0WzE0XSA9IGEwMiAqIHggKyBhMTIgKiB5ICsgYTIyICogeiArIGFbMTRdO1xuICAgIG91dFsxNV0gPSBhMDMgKiB4ICsgYTEzICogeSArIGEyMyAqIHogKyBhWzE1XTtcbiAgfVxuXG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFNjYWxlcyB0aGUgbWF0NCBieSB0aGUgZGltZW5zaW9ucyBpbiB0aGUgZ2l2ZW4gdmVjMyBub3QgdXNpbmcgdmVjdG9yaXphdGlvblxuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gYSB0aGUgbWF0cml4IHRvIHNjYWxlXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gdiB0aGUgdmVjMyB0byBzY2FsZSB0aGUgbWF0cml4IGJ5XG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKiovXG5cbmV4cG9ydCBmdW5jdGlvbiBzY2FsZShvdXQsIGEsIHYpIHtcbiAgdmFyIHggPSB2WzBdLFxuICAgICAgeSA9IHZbMV0sXG4gICAgICB6ID0gdlsyXTtcbiAgb3V0WzBdID0gYVswXSAqIHg7XG4gIG91dFsxXSA9IGFbMV0gKiB4O1xuICBvdXRbMl0gPSBhWzJdICogeDtcbiAgb3V0WzNdID0gYVszXSAqIHg7XG4gIG91dFs0XSA9IGFbNF0gKiB5O1xuICBvdXRbNV0gPSBhWzVdICogeTtcbiAgb3V0WzZdID0gYVs2XSAqIHk7XG4gIG91dFs3XSA9IGFbN10gKiB5O1xuICBvdXRbOF0gPSBhWzhdICogejtcbiAgb3V0WzldID0gYVs5XSAqIHo7XG4gIG91dFsxMF0gPSBhWzEwXSAqIHo7XG4gIG91dFsxMV0gPSBhWzExXSAqIHo7XG4gIG91dFsxMl0gPSBhWzEyXTtcbiAgb3V0WzEzXSA9IGFbMTNdO1xuICBvdXRbMTRdID0gYVsxNF07XG4gIG91dFsxNV0gPSBhWzE1XTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogUm90YXRlcyBhIG1hdDQgYnkgdGhlIGdpdmVuIGFuZ2xlIGFyb3VuZCB0aGUgZ2l2ZW4gYXhpc1xuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gYSB0aGUgbWF0cml4IHRvIHJvdGF0ZVxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCB0aGUgYW5nbGUgdG8gcm90YXRlIHRoZSBtYXRyaXggYnlcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBheGlzIHRoZSBheGlzIHRvIHJvdGF0ZSBhcm91bmRcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcm90YXRlKG91dCwgYSwgcmFkLCBheGlzKSB7XG4gIHZhciB4ID0gYXhpc1swXSxcbiAgICAgIHkgPSBheGlzWzFdLFxuICAgICAgeiA9IGF4aXNbMl07XG4gIHZhciBsZW4gPSBNYXRoLmh5cG90KHgsIHksIHopO1xuICB2YXIgcywgYywgdDtcbiAgdmFyIGEwMCwgYTAxLCBhMDIsIGEwMztcbiAgdmFyIGExMCwgYTExLCBhMTIsIGExMztcbiAgdmFyIGEyMCwgYTIxLCBhMjIsIGEyMztcbiAgdmFyIGIwMCwgYjAxLCBiMDI7XG4gIHZhciBiMTAsIGIxMSwgYjEyO1xuICB2YXIgYjIwLCBiMjEsIGIyMjtcblxuICBpZiAobGVuIDwgZ2xNYXRyaXguRVBTSUxPTikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgbGVuID0gMSAvIGxlbjtcbiAgeCAqPSBsZW47XG4gIHkgKj0gbGVuO1xuICB6ICo9IGxlbjtcbiAgcyA9IE1hdGguc2luKHJhZCk7XG4gIGMgPSBNYXRoLmNvcyhyYWQpO1xuICB0ID0gMSAtIGM7XG4gIGEwMCA9IGFbMF07XG4gIGEwMSA9IGFbMV07XG4gIGEwMiA9IGFbMl07XG4gIGEwMyA9IGFbM107XG4gIGExMCA9IGFbNF07XG4gIGExMSA9IGFbNV07XG4gIGExMiA9IGFbNl07XG4gIGExMyA9IGFbN107XG4gIGEyMCA9IGFbOF07XG4gIGEyMSA9IGFbOV07XG4gIGEyMiA9IGFbMTBdO1xuICBhMjMgPSBhWzExXTsgLy8gQ29uc3RydWN0IHRoZSBlbGVtZW50cyBvZiB0aGUgcm90YXRpb24gbWF0cml4XG5cbiAgYjAwID0geCAqIHggKiB0ICsgYztcbiAgYjAxID0geSAqIHggKiB0ICsgeiAqIHM7XG4gIGIwMiA9IHogKiB4ICogdCAtIHkgKiBzO1xuICBiMTAgPSB4ICogeSAqIHQgLSB6ICogcztcbiAgYjExID0geSAqIHkgKiB0ICsgYztcbiAgYjEyID0geiAqIHkgKiB0ICsgeCAqIHM7XG4gIGIyMCA9IHggKiB6ICogdCArIHkgKiBzO1xuICBiMjEgPSB5ICogeiAqIHQgLSB4ICogcztcbiAgYjIyID0geiAqIHogKiB0ICsgYzsgLy8gUGVyZm9ybSByb3RhdGlvbi1zcGVjaWZpYyBtYXRyaXggbXVsdGlwbGljYXRpb25cblxuICBvdXRbMF0gPSBhMDAgKiBiMDAgKyBhMTAgKiBiMDEgKyBhMjAgKiBiMDI7XG4gIG91dFsxXSA9IGEwMSAqIGIwMCArIGExMSAqIGIwMSArIGEyMSAqIGIwMjtcbiAgb3V0WzJdID0gYTAyICogYjAwICsgYTEyICogYjAxICsgYTIyICogYjAyO1xuICBvdXRbM10gPSBhMDMgKiBiMDAgKyBhMTMgKiBiMDEgKyBhMjMgKiBiMDI7XG4gIG91dFs0XSA9IGEwMCAqIGIxMCArIGExMCAqIGIxMSArIGEyMCAqIGIxMjtcbiAgb3V0WzVdID0gYTAxICogYjEwICsgYTExICogYjExICsgYTIxICogYjEyO1xuICBvdXRbNl0gPSBhMDIgKiBiMTAgKyBhMTIgKiBiMTEgKyBhMjIgKiBiMTI7XG4gIG91dFs3XSA9IGEwMyAqIGIxMCArIGExMyAqIGIxMSArIGEyMyAqIGIxMjtcbiAgb3V0WzhdID0gYTAwICogYjIwICsgYTEwICogYjIxICsgYTIwICogYjIyO1xuICBvdXRbOV0gPSBhMDEgKiBiMjAgKyBhMTEgKiBiMjEgKyBhMjEgKiBiMjI7XG4gIG91dFsxMF0gPSBhMDIgKiBiMjAgKyBhMTIgKiBiMjEgKyBhMjIgKiBiMjI7XG4gIG91dFsxMV0gPSBhMDMgKiBiMjAgKyBhMTMgKiBiMjEgKyBhMjMgKiBiMjI7XG5cbiAgaWYgKGEgIT09IG91dCkge1xuICAgIC8vIElmIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGRpZmZlciwgY29weSB0aGUgdW5jaGFuZ2VkIGxhc3Qgcm93XG4gICAgb3V0WzEyXSA9IGFbMTJdO1xuICAgIG91dFsxM10gPSBhWzEzXTtcbiAgICBvdXRbMTRdID0gYVsxNF07XG4gICAgb3V0WzE1XSA9IGFbMTVdO1xuICB9XG5cbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogUm90YXRlcyBhIG1hdHJpeCBieSB0aGUgZ2l2ZW4gYW5nbGUgYXJvdW5kIHRoZSBYIGF4aXNcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IGEgdGhlIG1hdHJpeCB0byByb3RhdGVcbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgdGhlIGFuZ2xlIHRvIHJvdGF0ZSB0aGUgbWF0cml4IGJ5XG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJvdGF0ZVgob3V0LCBhLCByYWQpIHtcbiAgdmFyIHMgPSBNYXRoLnNpbihyYWQpO1xuICB2YXIgYyA9IE1hdGguY29zKHJhZCk7XG4gIHZhciBhMTAgPSBhWzRdO1xuICB2YXIgYTExID0gYVs1XTtcbiAgdmFyIGExMiA9IGFbNl07XG4gIHZhciBhMTMgPSBhWzddO1xuICB2YXIgYTIwID0gYVs4XTtcbiAgdmFyIGEyMSA9IGFbOV07XG4gIHZhciBhMjIgPSBhWzEwXTtcbiAgdmFyIGEyMyA9IGFbMTFdO1xuXG4gIGlmIChhICE9PSBvdXQpIHtcbiAgICAvLyBJZiB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBkaWZmZXIsIGNvcHkgdGhlIHVuY2hhbmdlZCByb3dzXG4gICAgb3V0WzBdID0gYVswXTtcbiAgICBvdXRbMV0gPSBhWzFdO1xuICAgIG91dFsyXSA9IGFbMl07XG4gICAgb3V0WzNdID0gYVszXTtcbiAgICBvdXRbMTJdID0gYVsxMl07XG4gICAgb3V0WzEzXSA9IGFbMTNdO1xuICAgIG91dFsxNF0gPSBhWzE0XTtcbiAgICBvdXRbMTVdID0gYVsxNV07XG4gIH0gLy8gUGVyZm9ybSBheGlzLXNwZWNpZmljIG1hdHJpeCBtdWx0aXBsaWNhdGlvblxuXG5cbiAgb3V0WzRdID0gYTEwICogYyArIGEyMCAqIHM7XG4gIG91dFs1XSA9IGExMSAqIGMgKyBhMjEgKiBzO1xuICBvdXRbNl0gPSBhMTIgKiBjICsgYTIyICogcztcbiAgb3V0WzddID0gYTEzICogYyArIGEyMyAqIHM7XG4gIG91dFs4XSA9IGEyMCAqIGMgLSBhMTAgKiBzO1xuICBvdXRbOV0gPSBhMjEgKiBjIC0gYTExICogcztcbiAgb3V0WzEwXSA9IGEyMiAqIGMgLSBhMTIgKiBzO1xuICBvdXRbMTFdID0gYTIzICogYyAtIGExMyAqIHM7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFJvdGF0ZXMgYSBtYXRyaXggYnkgdGhlIGdpdmVuIGFuZ2xlIGFyb3VuZCB0aGUgWSBheGlzXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBhIHRoZSBtYXRyaXggdG8gcm90YXRlXG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIHRoZSBhbmdsZSB0byByb3RhdGUgdGhlIG1hdHJpeCBieVxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByb3RhdGVZKG91dCwgYSwgcmFkKSB7XG4gIHZhciBzID0gTWF0aC5zaW4ocmFkKTtcbiAgdmFyIGMgPSBNYXRoLmNvcyhyYWQpO1xuICB2YXIgYTAwID0gYVswXTtcbiAgdmFyIGEwMSA9IGFbMV07XG4gIHZhciBhMDIgPSBhWzJdO1xuICB2YXIgYTAzID0gYVszXTtcbiAgdmFyIGEyMCA9IGFbOF07XG4gIHZhciBhMjEgPSBhWzldO1xuICB2YXIgYTIyID0gYVsxMF07XG4gIHZhciBhMjMgPSBhWzExXTtcblxuICBpZiAoYSAhPT0gb3V0KSB7XG4gICAgLy8gSWYgdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gZGlmZmVyLCBjb3B5IHRoZSB1bmNoYW5nZWQgcm93c1xuICAgIG91dFs0XSA9IGFbNF07XG4gICAgb3V0WzVdID0gYVs1XTtcbiAgICBvdXRbNl0gPSBhWzZdO1xuICAgIG91dFs3XSA9IGFbN107XG4gICAgb3V0WzEyXSA9IGFbMTJdO1xuICAgIG91dFsxM10gPSBhWzEzXTtcbiAgICBvdXRbMTRdID0gYVsxNF07XG4gICAgb3V0WzE1XSA9IGFbMTVdO1xuICB9IC8vIFBlcmZvcm0gYXhpcy1zcGVjaWZpYyBtYXRyaXggbXVsdGlwbGljYXRpb25cblxuXG4gIG91dFswXSA9IGEwMCAqIGMgLSBhMjAgKiBzO1xuICBvdXRbMV0gPSBhMDEgKiBjIC0gYTIxICogcztcbiAgb3V0WzJdID0gYTAyICogYyAtIGEyMiAqIHM7XG4gIG91dFszXSA9IGEwMyAqIGMgLSBhMjMgKiBzO1xuICBvdXRbOF0gPSBhMDAgKiBzICsgYTIwICogYztcbiAgb3V0WzldID0gYTAxICogcyArIGEyMSAqIGM7XG4gIG91dFsxMF0gPSBhMDIgKiBzICsgYTIyICogYztcbiAgb3V0WzExXSA9IGEwMyAqIHMgKyBhMjMgKiBjO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBSb3RhdGVzIGEgbWF0cml4IGJ5IHRoZSBnaXZlbiBhbmdsZSBhcm91bmQgdGhlIFogYXhpc1xuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gYSB0aGUgbWF0cml4IHRvIHJvdGF0ZVxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCB0aGUgYW5nbGUgdG8gcm90YXRlIHRoZSBtYXRyaXggYnlcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcm90YXRlWihvdXQsIGEsIHJhZCkge1xuICB2YXIgcyA9IE1hdGguc2luKHJhZCk7XG4gIHZhciBjID0gTWF0aC5jb3MocmFkKTtcbiAgdmFyIGEwMCA9IGFbMF07XG4gIHZhciBhMDEgPSBhWzFdO1xuICB2YXIgYTAyID0gYVsyXTtcbiAgdmFyIGEwMyA9IGFbM107XG4gIHZhciBhMTAgPSBhWzRdO1xuICB2YXIgYTExID0gYVs1XTtcbiAgdmFyIGExMiA9IGFbNl07XG4gIHZhciBhMTMgPSBhWzddO1xuXG4gIGlmIChhICE9PSBvdXQpIHtcbiAgICAvLyBJZiB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBkaWZmZXIsIGNvcHkgdGhlIHVuY2hhbmdlZCBsYXN0IHJvd1xuICAgIG91dFs4XSA9IGFbOF07XG4gICAgb3V0WzldID0gYVs5XTtcbiAgICBvdXRbMTBdID0gYVsxMF07XG4gICAgb3V0WzExXSA9IGFbMTFdO1xuICAgIG91dFsxMl0gPSBhWzEyXTtcbiAgICBvdXRbMTNdID0gYVsxM107XG4gICAgb3V0WzE0XSA9IGFbMTRdO1xuICAgIG91dFsxNV0gPSBhWzE1XTtcbiAgfSAvLyBQZXJmb3JtIGF4aXMtc3BlY2lmaWMgbWF0cml4IG11bHRpcGxpY2F0aW9uXG5cblxuICBvdXRbMF0gPSBhMDAgKiBjICsgYTEwICogcztcbiAgb3V0WzFdID0gYTAxICogYyArIGExMSAqIHM7XG4gIG91dFsyXSA9IGEwMiAqIGMgKyBhMTIgKiBzO1xuICBvdXRbM10gPSBhMDMgKiBjICsgYTEzICogcztcbiAgb3V0WzRdID0gYTEwICogYyAtIGEwMCAqIHM7XG4gIG91dFs1XSA9IGExMSAqIGMgLSBhMDEgKiBzO1xuICBvdXRbNl0gPSBhMTIgKiBjIC0gYTAyICogcztcbiAgb3V0WzddID0gYTEzICogYyAtIGEwMyAqIHM7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBtYXRyaXggZnJvbSBhIHZlY3RvciB0cmFuc2xhdGlvblxuICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIChidXQgbXVjaCBmYXN0ZXIgdGhhbik6XG4gKlxuICogICAgIG1hdDQuaWRlbnRpdHkoZGVzdCk7XG4gKiAgICAgbWF0NC50cmFuc2xhdGUoZGVzdCwgZGVzdCwgdmVjKTtcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gdiBUcmFuc2xhdGlvbiB2ZWN0b3JcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVRyYW5zbGF0aW9uKG91dCwgdikge1xuICBvdXRbMF0gPSAxO1xuICBvdXRbMV0gPSAwO1xuICBvdXRbMl0gPSAwO1xuICBvdXRbM10gPSAwO1xuICBvdXRbNF0gPSAwO1xuICBvdXRbNV0gPSAxO1xuICBvdXRbNl0gPSAwO1xuICBvdXRbN10gPSAwO1xuICBvdXRbOF0gPSAwO1xuICBvdXRbOV0gPSAwO1xuICBvdXRbMTBdID0gMTtcbiAgb3V0WzExXSA9IDA7XG4gIG91dFsxMl0gPSB2WzBdO1xuICBvdXRbMTNdID0gdlsxXTtcbiAgb3V0WzE0XSA9IHZbMl07XG4gIG91dFsxNV0gPSAxO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgbWF0cml4IGZyb20gYSB2ZWN0b3Igc2NhbGluZ1xuICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIChidXQgbXVjaCBmYXN0ZXIgdGhhbik6XG4gKlxuICogICAgIG1hdDQuaWRlbnRpdHkoZGVzdCk7XG4gKiAgICAgbWF0NC5zY2FsZShkZXN0LCBkZXN0LCB2ZWMpO1xuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSB2IFNjYWxpbmcgdmVjdG9yXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21TY2FsaW5nKG91dCwgdikge1xuICBvdXRbMF0gPSB2WzBdO1xuICBvdXRbMV0gPSAwO1xuICBvdXRbMl0gPSAwO1xuICBvdXRbM10gPSAwO1xuICBvdXRbNF0gPSAwO1xuICBvdXRbNV0gPSB2WzFdO1xuICBvdXRbNl0gPSAwO1xuICBvdXRbN10gPSAwO1xuICBvdXRbOF0gPSAwO1xuICBvdXRbOV0gPSAwO1xuICBvdXRbMTBdID0gdlsyXTtcbiAgb3V0WzExXSA9IDA7XG4gIG91dFsxMl0gPSAwO1xuICBvdXRbMTNdID0gMDtcbiAgb3V0WzE0XSA9IDA7XG4gIG91dFsxNV0gPSAxO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgbWF0cml4IGZyb20gYSBnaXZlbiBhbmdsZSBhcm91bmQgYSBnaXZlbiBheGlzXG4gKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKGJ1dCBtdWNoIGZhc3RlciB0aGFuKTpcbiAqXG4gKiAgICAgbWF0NC5pZGVudGl0eShkZXN0KTtcbiAqICAgICBtYXQ0LnJvdGF0ZShkZXN0LCBkZXN0LCByYWQsIGF4aXMpO1xuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgdGhlIGFuZ2xlIHRvIHJvdGF0ZSB0aGUgbWF0cml4IGJ5XG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYXhpcyB0aGUgYXhpcyB0byByb3RhdGUgYXJvdW5kXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21Sb3RhdGlvbihvdXQsIHJhZCwgYXhpcykge1xuICB2YXIgeCA9IGF4aXNbMF0sXG4gICAgICB5ID0gYXhpc1sxXSxcbiAgICAgIHogPSBheGlzWzJdO1xuICB2YXIgbGVuID0gTWF0aC5oeXBvdCh4LCB5LCB6KTtcbiAgdmFyIHMsIGMsIHQ7XG5cbiAgaWYgKGxlbiA8IGdsTWF0cml4LkVQU0lMT04pIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGxlbiA9IDEgLyBsZW47XG4gIHggKj0gbGVuO1xuICB5ICo9IGxlbjtcbiAgeiAqPSBsZW47XG4gIHMgPSBNYXRoLnNpbihyYWQpO1xuICBjID0gTWF0aC5jb3MocmFkKTtcbiAgdCA9IDEgLSBjOyAvLyBQZXJmb3JtIHJvdGF0aW9uLXNwZWNpZmljIG1hdHJpeCBtdWx0aXBsaWNhdGlvblxuXG4gIG91dFswXSA9IHggKiB4ICogdCArIGM7XG4gIG91dFsxXSA9IHkgKiB4ICogdCArIHogKiBzO1xuICBvdXRbMl0gPSB6ICogeCAqIHQgLSB5ICogcztcbiAgb3V0WzNdID0gMDtcbiAgb3V0WzRdID0geCAqIHkgKiB0IC0geiAqIHM7XG4gIG91dFs1XSA9IHkgKiB5ICogdCArIGM7XG4gIG91dFs2XSA9IHogKiB5ICogdCArIHggKiBzO1xuICBvdXRbN10gPSAwO1xuICBvdXRbOF0gPSB4ICogeiAqIHQgKyB5ICogcztcbiAgb3V0WzldID0geSAqIHogKiB0IC0geCAqIHM7XG4gIG91dFsxMF0gPSB6ICogeiAqIHQgKyBjO1xuICBvdXRbMTFdID0gMDtcbiAgb3V0WzEyXSA9IDA7XG4gIG91dFsxM10gPSAwO1xuICBvdXRbMTRdID0gMDtcbiAgb3V0WzE1XSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBtYXRyaXggZnJvbSB0aGUgZ2l2ZW4gYW5nbGUgYXJvdW5kIHRoZSBYIGF4aXNcbiAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byAoYnV0IG11Y2ggZmFzdGVyIHRoYW4pOlxuICpcbiAqICAgICBtYXQ0LmlkZW50aXR5KGRlc3QpO1xuICogICAgIG1hdDQucm90YXRlWChkZXN0LCBkZXN0LCByYWQpO1xuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgdGhlIGFuZ2xlIHRvIHJvdGF0ZSB0aGUgbWF0cml4IGJ5XG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21YUm90YXRpb24ob3V0LCByYWQpIHtcbiAgdmFyIHMgPSBNYXRoLnNpbihyYWQpO1xuICB2YXIgYyA9IE1hdGguY29zKHJhZCk7IC8vIFBlcmZvcm0gYXhpcy1zcGVjaWZpYyBtYXRyaXggbXVsdGlwbGljYXRpb25cblxuICBvdXRbMF0gPSAxO1xuICBvdXRbMV0gPSAwO1xuICBvdXRbMl0gPSAwO1xuICBvdXRbM10gPSAwO1xuICBvdXRbNF0gPSAwO1xuICBvdXRbNV0gPSBjO1xuICBvdXRbNl0gPSBzO1xuICBvdXRbN10gPSAwO1xuICBvdXRbOF0gPSAwO1xuICBvdXRbOV0gPSAtcztcbiAgb3V0WzEwXSA9IGM7XG4gIG91dFsxMV0gPSAwO1xuICBvdXRbMTJdID0gMDtcbiAgb3V0WzEzXSA9IDA7XG4gIG91dFsxNF0gPSAwO1xuICBvdXRbMTVdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIG1hdHJpeCBmcm9tIHRoZSBnaXZlbiBhbmdsZSBhcm91bmQgdGhlIFkgYXhpc1xuICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIChidXQgbXVjaCBmYXN0ZXIgdGhhbik6XG4gKlxuICogICAgIG1hdDQuaWRlbnRpdHkoZGVzdCk7XG4gKiAgICAgbWF0NC5yb3RhdGVZKGRlc3QsIGRlc3QsIHJhZCk7XG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgbWF0NCByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCB0aGUgYW5nbGUgdG8gcm90YXRlIHRoZSBtYXRyaXggYnlcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVlSb3RhdGlvbihvdXQsIHJhZCkge1xuICB2YXIgcyA9IE1hdGguc2luKHJhZCk7XG4gIHZhciBjID0gTWF0aC5jb3MocmFkKTsgLy8gUGVyZm9ybSBheGlzLXNwZWNpZmljIG1hdHJpeCBtdWx0aXBsaWNhdGlvblxuXG4gIG91dFswXSA9IGM7XG4gIG91dFsxXSA9IDA7XG4gIG91dFsyXSA9IC1zO1xuICBvdXRbM10gPSAwO1xuICBvdXRbNF0gPSAwO1xuICBvdXRbNV0gPSAxO1xuICBvdXRbNl0gPSAwO1xuICBvdXRbN10gPSAwO1xuICBvdXRbOF0gPSBzO1xuICBvdXRbOV0gPSAwO1xuICBvdXRbMTBdID0gYztcbiAgb3V0WzExXSA9IDA7XG4gIG91dFsxMl0gPSAwO1xuICBvdXRbMTNdID0gMDtcbiAgb3V0WzE0XSA9IDA7XG4gIG91dFsxNV0gPSAxO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgbWF0cml4IGZyb20gdGhlIGdpdmVuIGFuZ2xlIGFyb3VuZCB0aGUgWiBheGlzXG4gKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKGJ1dCBtdWNoIGZhc3RlciB0aGFuKTpcbiAqXG4gKiAgICAgbWF0NC5pZGVudGl0eShkZXN0KTtcbiAqICAgICBtYXQ0LnJvdGF0ZVooZGVzdCwgZGVzdCwgcmFkKTtcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIHRoZSBhbmdsZSB0byByb3RhdGUgdGhlIG1hdHJpeCBieVxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tWlJvdGF0aW9uKG91dCwgcmFkKSB7XG4gIHZhciBzID0gTWF0aC5zaW4ocmFkKTtcbiAgdmFyIGMgPSBNYXRoLmNvcyhyYWQpOyAvLyBQZXJmb3JtIGF4aXMtc3BlY2lmaWMgbWF0cml4IG11bHRpcGxpY2F0aW9uXG5cbiAgb3V0WzBdID0gYztcbiAgb3V0WzFdID0gcztcbiAgb3V0WzJdID0gMDtcbiAgb3V0WzNdID0gMDtcbiAgb3V0WzRdID0gLXM7XG4gIG91dFs1XSA9IGM7XG4gIG91dFs2XSA9IDA7XG4gIG91dFs3XSA9IDA7XG4gIG91dFs4XSA9IDA7XG4gIG91dFs5XSA9IDA7XG4gIG91dFsxMF0gPSAxO1xuICBvdXRbMTFdID0gMDtcbiAgb3V0WzEyXSA9IDA7XG4gIG91dFsxM10gPSAwO1xuICBvdXRbMTRdID0gMDtcbiAgb3V0WzE1XSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBtYXRyaXggZnJvbSBhIHF1YXRlcm5pb24gcm90YXRpb24gYW5kIHZlY3RvciB0cmFuc2xhdGlvblxuICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIChidXQgbXVjaCBmYXN0ZXIgdGhhbik6XG4gKlxuICogICAgIG1hdDQuaWRlbnRpdHkoZGVzdCk7XG4gKiAgICAgbWF0NC50cmFuc2xhdGUoZGVzdCwgdmVjKTtcbiAqICAgICBsZXQgcXVhdE1hdCA9IG1hdDQuY3JlYXRlKCk7XG4gKiAgICAgcXVhdDQudG9NYXQ0KHF1YXQsIHF1YXRNYXQpO1xuICogICAgIG1hdDQubXVsdGlwbHkoZGVzdCwgcXVhdE1hdCk7XG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgbWF0NCByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxuICogQHBhcmFtIHtxdWF0NH0gcSBSb3RhdGlvbiBxdWF0ZXJuaW9uXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gdiBUcmFuc2xhdGlvbiB2ZWN0b3JcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVJvdGF0aW9uVHJhbnNsYXRpb24ob3V0LCBxLCB2KSB7XG4gIC8vIFF1YXRlcm5pb24gbWF0aFxuICB2YXIgeCA9IHFbMF0sXG4gICAgICB5ID0gcVsxXSxcbiAgICAgIHogPSBxWzJdLFxuICAgICAgdyA9IHFbM107XG4gIHZhciB4MiA9IHggKyB4O1xuICB2YXIgeTIgPSB5ICsgeTtcbiAgdmFyIHoyID0geiArIHo7XG4gIHZhciB4eCA9IHggKiB4MjtcbiAgdmFyIHh5ID0geCAqIHkyO1xuICB2YXIgeHogPSB4ICogejI7XG4gIHZhciB5eSA9IHkgKiB5MjtcbiAgdmFyIHl6ID0geSAqIHoyO1xuICB2YXIgenogPSB6ICogejI7XG4gIHZhciB3eCA9IHcgKiB4MjtcbiAgdmFyIHd5ID0gdyAqIHkyO1xuICB2YXIgd3ogPSB3ICogejI7XG4gIG91dFswXSA9IDEgLSAoeXkgKyB6eik7XG4gIG91dFsxXSA9IHh5ICsgd3o7XG4gIG91dFsyXSA9IHh6IC0gd3k7XG4gIG91dFszXSA9IDA7XG4gIG91dFs0XSA9IHh5IC0gd3o7XG4gIG91dFs1XSA9IDEgLSAoeHggKyB6eik7XG4gIG91dFs2XSA9IHl6ICsgd3g7XG4gIG91dFs3XSA9IDA7XG4gIG91dFs4XSA9IHh6ICsgd3k7XG4gIG91dFs5XSA9IHl6IC0gd3g7XG4gIG91dFsxMF0gPSAxIC0gKHh4ICsgeXkpO1xuICBvdXRbMTFdID0gMDtcbiAgb3V0WzEyXSA9IHZbMF07XG4gIG91dFsxM10gPSB2WzFdO1xuICBvdXRbMTRdID0gdlsyXTtcbiAgb3V0WzE1XSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgbWF0NCBmcm9tIGEgZHVhbCBxdWF0LlxuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IE1hdHJpeFxuICogQHBhcmFtIHtSZWFkb25seVF1YXQyfSBhIER1YWwgUXVhdGVybmlvblxuICogQHJldHVybnMge21hdDR9IG1hdDQgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVF1YXQyKG91dCwgYSkge1xuICB2YXIgdHJhbnNsYXRpb24gPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSgzKTtcbiAgdmFyIGJ4ID0gLWFbMF0sXG4gICAgICBieSA9IC1hWzFdLFxuICAgICAgYnogPSAtYVsyXSxcbiAgICAgIGJ3ID0gYVszXSxcbiAgICAgIGF4ID0gYVs0XSxcbiAgICAgIGF5ID0gYVs1XSxcbiAgICAgIGF6ID0gYVs2XSxcbiAgICAgIGF3ID0gYVs3XTtcbiAgdmFyIG1hZ25pdHVkZSA9IGJ4ICogYnggKyBieSAqIGJ5ICsgYnogKiBieiArIGJ3ICogYnc7IC8vT25seSBzY2FsZSBpZiBpdCBtYWtlcyBzZW5zZVxuXG4gIGlmIChtYWduaXR1ZGUgPiAwKSB7XG4gICAgdHJhbnNsYXRpb25bMF0gPSAoYXggKiBidyArIGF3ICogYnggKyBheSAqIGJ6IC0gYXogKiBieSkgKiAyIC8gbWFnbml0dWRlO1xuICAgIHRyYW5zbGF0aW9uWzFdID0gKGF5ICogYncgKyBhdyAqIGJ5ICsgYXogKiBieCAtIGF4ICogYnopICogMiAvIG1hZ25pdHVkZTtcbiAgICB0cmFuc2xhdGlvblsyXSA9IChheiAqIGJ3ICsgYXcgKiBieiArIGF4ICogYnkgLSBheSAqIGJ4KSAqIDIgLyBtYWduaXR1ZGU7XG4gIH0gZWxzZSB7XG4gICAgdHJhbnNsYXRpb25bMF0gPSAoYXggKiBidyArIGF3ICogYnggKyBheSAqIGJ6IC0gYXogKiBieSkgKiAyO1xuICAgIHRyYW5zbGF0aW9uWzFdID0gKGF5ICogYncgKyBhdyAqIGJ5ICsgYXogKiBieCAtIGF4ICogYnopICogMjtcbiAgICB0cmFuc2xhdGlvblsyXSA9IChheiAqIGJ3ICsgYXcgKiBieiArIGF4ICogYnkgLSBheSAqIGJ4KSAqIDI7XG4gIH1cblxuICBmcm9tUm90YXRpb25UcmFuc2xhdGlvbihvdXQsIGEsIHRyYW5zbGF0aW9uKTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogUmV0dXJucyB0aGUgdHJhbnNsYXRpb24gdmVjdG9yIGNvbXBvbmVudCBvZiBhIHRyYW5zZm9ybWF0aW9uXG4gKiAgbWF0cml4LiBJZiBhIG1hdHJpeCBpcyBidWlsdCB3aXRoIGZyb21Sb3RhdGlvblRyYW5zbGF0aW9uLFxuICogIHRoZSByZXR1cm5lZCB2ZWN0b3Igd2lsbCBiZSB0aGUgc2FtZSBhcyB0aGUgdHJhbnNsYXRpb24gdmVjdG9yXG4gKiAgb3JpZ2luYWxseSBzdXBwbGllZC5cbiAqIEBwYXJhbSAge3ZlYzN9IG91dCBWZWN0b3IgdG8gcmVjZWl2ZSB0cmFuc2xhdGlvbiBjb21wb25lbnRcbiAqIEBwYXJhbSAge1JlYWRvbmx5TWF0NH0gbWF0IE1hdHJpeCB0byBiZSBkZWNvbXBvc2VkIChpbnB1dClcbiAqIEByZXR1cm4ge3ZlYzN9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUcmFuc2xhdGlvbihvdXQsIG1hdCkge1xuICBvdXRbMF0gPSBtYXRbMTJdO1xuICBvdXRbMV0gPSBtYXRbMTNdO1xuICBvdXRbMl0gPSBtYXRbMTRdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBSZXR1cm5zIHRoZSBzY2FsaW5nIGZhY3RvciBjb21wb25lbnQgb2YgYSB0cmFuc2Zvcm1hdGlvblxuICogIG1hdHJpeC4gSWYgYSBtYXRyaXggaXMgYnVpbHQgd2l0aCBmcm9tUm90YXRpb25UcmFuc2xhdGlvblNjYWxlXG4gKiAgd2l0aCBhIG5vcm1hbGl6ZWQgUXVhdGVybmlvbiBwYXJhbXRlciwgdGhlIHJldHVybmVkIHZlY3RvciB3aWxsIGJlXG4gKiAgdGhlIHNhbWUgYXMgdGhlIHNjYWxpbmcgdmVjdG9yXG4gKiAgb3JpZ2luYWxseSBzdXBwbGllZC5cbiAqIEBwYXJhbSAge3ZlYzN9IG91dCBWZWN0b3IgdG8gcmVjZWl2ZSBzY2FsaW5nIGZhY3RvciBjb21wb25lbnRcbiAqIEBwYXJhbSAge1JlYWRvbmx5TWF0NH0gbWF0IE1hdHJpeCB0byBiZSBkZWNvbXBvc2VkIChpbnB1dClcbiAqIEByZXR1cm4ge3ZlYzN9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTY2FsaW5nKG91dCwgbWF0KSB7XG4gIHZhciBtMTEgPSBtYXRbMF07XG4gIHZhciBtMTIgPSBtYXRbMV07XG4gIHZhciBtMTMgPSBtYXRbMl07XG4gIHZhciBtMjEgPSBtYXRbNF07XG4gIHZhciBtMjIgPSBtYXRbNV07XG4gIHZhciBtMjMgPSBtYXRbNl07XG4gIHZhciBtMzEgPSBtYXRbOF07XG4gIHZhciBtMzIgPSBtYXRbOV07XG4gIHZhciBtMzMgPSBtYXRbMTBdO1xuICBvdXRbMF0gPSBNYXRoLmh5cG90KG0xMSwgbTEyLCBtMTMpO1xuICBvdXRbMV0gPSBNYXRoLmh5cG90KG0yMSwgbTIyLCBtMjMpO1xuICBvdXRbMl0gPSBNYXRoLmh5cG90KG0zMSwgbTMyLCBtMzMpO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBSZXR1cm5zIGEgcXVhdGVybmlvbiByZXByZXNlbnRpbmcgdGhlIHJvdGF0aW9uYWwgY29tcG9uZW50XG4gKiAgb2YgYSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXguIElmIGEgbWF0cml4IGlzIGJ1aWx0IHdpdGhcbiAqICBmcm9tUm90YXRpb25UcmFuc2xhdGlvbiwgdGhlIHJldHVybmVkIHF1YXRlcm5pb24gd2lsbCBiZSB0aGVcbiAqICBzYW1lIGFzIHRoZSBxdWF0ZXJuaW9uIG9yaWdpbmFsbHkgc3VwcGxpZWQuXG4gKiBAcGFyYW0ge3F1YXR9IG91dCBRdWF0ZXJuaW9uIHRvIHJlY2VpdmUgdGhlIHJvdGF0aW9uIGNvbXBvbmVudFxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IG1hdCBNYXRyaXggdG8gYmUgZGVjb21wb3NlZCAoaW5wdXQpXG4gKiBAcmV0dXJuIHtxdWF0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Um90YXRpb24ob3V0LCBtYXQpIHtcbiAgdmFyIHNjYWxpbmcgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSgzKTtcbiAgZ2V0U2NhbGluZyhzY2FsaW5nLCBtYXQpO1xuICB2YXIgaXMxID0gMSAvIHNjYWxpbmdbMF07XG4gIHZhciBpczIgPSAxIC8gc2NhbGluZ1sxXTtcbiAgdmFyIGlzMyA9IDEgLyBzY2FsaW5nWzJdO1xuICB2YXIgc20xMSA9IG1hdFswXSAqIGlzMTtcbiAgdmFyIHNtMTIgPSBtYXRbMV0gKiBpczI7XG4gIHZhciBzbTEzID0gbWF0WzJdICogaXMzO1xuICB2YXIgc20yMSA9IG1hdFs0XSAqIGlzMTtcbiAgdmFyIHNtMjIgPSBtYXRbNV0gKiBpczI7XG4gIHZhciBzbTIzID0gbWF0WzZdICogaXMzO1xuICB2YXIgc20zMSA9IG1hdFs4XSAqIGlzMTtcbiAgdmFyIHNtMzIgPSBtYXRbOV0gKiBpczI7XG4gIHZhciBzbTMzID0gbWF0WzEwXSAqIGlzMztcbiAgdmFyIHRyYWNlID0gc20xMSArIHNtMjIgKyBzbTMzO1xuICB2YXIgUyA9IDA7XG5cbiAgaWYgKHRyYWNlID4gMCkge1xuICAgIFMgPSBNYXRoLnNxcnQodHJhY2UgKyAxLjApICogMjtcbiAgICBvdXRbM10gPSAwLjI1ICogUztcbiAgICBvdXRbMF0gPSAoc20yMyAtIHNtMzIpIC8gUztcbiAgICBvdXRbMV0gPSAoc20zMSAtIHNtMTMpIC8gUztcbiAgICBvdXRbMl0gPSAoc20xMiAtIHNtMjEpIC8gUztcbiAgfSBlbHNlIGlmIChzbTExID4gc20yMiAmJiBzbTExID4gc20zMykge1xuICAgIFMgPSBNYXRoLnNxcnQoMS4wICsgc20xMSAtIHNtMjIgLSBzbTMzKSAqIDI7XG4gICAgb3V0WzNdID0gKHNtMjMgLSBzbTMyKSAvIFM7XG4gICAgb3V0WzBdID0gMC4yNSAqIFM7XG4gICAgb3V0WzFdID0gKHNtMTIgKyBzbTIxKSAvIFM7XG4gICAgb3V0WzJdID0gKHNtMzEgKyBzbTEzKSAvIFM7XG4gIH0gZWxzZSBpZiAoc20yMiA+IHNtMzMpIHtcbiAgICBTID0gTWF0aC5zcXJ0KDEuMCArIHNtMjIgLSBzbTExIC0gc20zMykgKiAyO1xuICAgIG91dFszXSA9IChzbTMxIC0gc20xMykgLyBTO1xuICAgIG91dFswXSA9IChzbTEyICsgc20yMSkgLyBTO1xuICAgIG91dFsxXSA9IDAuMjUgKiBTO1xuICAgIG91dFsyXSA9IChzbTIzICsgc20zMikgLyBTO1xuICB9IGVsc2Uge1xuICAgIFMgPSBNYXRoLnNxcnQoMS4wICsgc20zMyAtIHNtMTEgLSBzbTIyKSAqIDI7XG4gICAgb3V0WzNdID0gKHNtMTIgLSBzbTIxKSAvIFM7XG4gICAgb3V0WzBdID0gKHNtMzEgKyBzbTEzKSAvIFM7XG4gICAgb3V0WzFdID0gKHNtMjMgKyBzbTMyKSAvIFM7XG4gICAgb3V0WzJdID0gMC4yNSAqIFM7XG4gIH1cblxuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgbWF0cml4IGZyb20gYSBxdWF0ZXJuaW9uIHJvdGF0aW9uLCB2ZWN0b3IgdHJhbnNsYXRpb24gYW5kIHZlY3RvciBzY2FsZVxuICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIChidXQgbXVjaCBmYXN0ZXIgdGhhbik6XG4gKlxuICogICAgIG1hdDQuaWRlbnRpdHkoZGVzdCk7XG4gKiAgICAgbWF0NC50cmFuc2xhdGUoZGVzdCwgdmVjKTtcbiAqICAgICBsZXQgcXVhdE1hdCA9IG1hdDQuY3JlYXRlKCk7XG4gKiAgICAgcXVhdDQudG9NYXQ0KHF1YXQsIHF1YXRNYXQpO1xuICogICAgIG1hdDQubXVsdGlwbHkoZGVzdCwgcXVhdE1hdCk7XG4gKiAgICAgbWF0NC5zY2FsZShkZXN0LCBzY2FsZSlcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XG4gKiBAcGFyYW0ge3F1YXQ0fSBxIFJvdGF0aW9uIHF1YXRlcm5pb25cbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSB2IFRyYW5zbGF0aW9uIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IHMgU2NhbGluZyB2ZWN0b3JcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVJvdGF0aW9uVHJhbnNsYXRpb25TY2FsZShvdXQsIHEsIHYsIHMpIHtcbiAgLy8gUXVhdGVybmlvbiBtYXRoXG4gIHZhciB4ID0gcVswXSxcbiAgICAgIHkgPSBxWzFdLFxuICAgICAgeiA9IHFbMl0sXG4gICAgICB3ID0gcVszXTtcbiAgdmFyIHgyID0geCArIHg7XG4gIHZhciB5MiA9IHkgKyB5O1xuICB2YXIgejIgPSB6ICsgejtcbiAgdmFyIHh4ID0geCAqIHgyO1xuICB2YXIgeHkgPSB4ICogeTI7XG4gIHZhciB4eiA9IHggKiB6MjtcbiAgdmFyIHl5ID0geSAqIHkyO1xuICB2YXIgeXogPSB5ICogejI7XG4gIHZhciB6eiA9IHogKiB6MjtcbiAgdmFyIHd4ID0gdyAqIHgyO1xuICB2YXIgd3kgPSB3ICogeTI7XG4gIHZhciB3eiA9IHcgKiB6MjtcbiAgdmFyIHN4ID0gc1swXTtcbiAgdmFyIHN5ID0gc1sxXTtcbiAgdmFyIHN6ID0gc1syXTtcbiAgb3V0WzBdID0gKDEgLSAoeXkgKyB6eikpICogc3g7XG4gIG91dFsxXSA9ICh4eSArIHd6KSAqIHN4O1xuICBvdXRbMl0gPSAoeHogLSB3eSkgKiBzeDtcbiAgb3V0WzNdID0gMDtcbiAgb3V0WzRdID0gKHh5IC0gd3opICogc3k7XG4gIG91dFs1XSA9ICgxIC0gKHh4ICsgenopKSAqIHN5O1xuICBvdXRbNl0gPSAoeXogKyB3eCkgKiBzeTtcbiAgb3V0WzddID0gMDtcbiAgb3V0WzhdID0gKHh6ICsgd3kpICogc3o7XG4gIG91dFs5XSA9ICh5eiAtIHd4KSAqIHN6O1xuICBvdXRbMTBdID0gKDEgLSAoeHggKyB5eSkpICogc3o7XG4gIG91dFsxMV0gPSAwO1xuICBvdXRbMTJdID0gdlswXTtcbiAgb3V0WzEzXSA9IHZbMV07XG4gIG91dFsxNF0gPSB2WzJdO1xuICBvdXRbMTVdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIG1hdHJpeCBmcm9tIGEgcXVhdGVybmlvbiByb3RhdGlvbiwgdmVjdG9yIHRyYW5zbGF0aW9uIGFuZCB2ZWN0b3Igc2NhbGUsIHJvdGF0aW5nIGFuZCBzY2FsaW5nIGFyb3VuZCB0aGUgZ2l2ZW4gb3JpZ2luXG4gKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKGJ1dCBtdWNoIGZhc3RlciB0aGFuKTpcbiAqXG4gKiAgICAgbWF0NC5pZGVudGl0eShkZXN0KTtcbiAqICAgICBtYXQ0LnRyYW5zbGF0ZShkZXN0LCB2ZWMpO1xuICogICAgIG1hdDQudHJhbnNsYXRlKGRlc3QsIG9yaWdpbik7XG4gKiAgICAgbGV0IHF1YXRNYXQgPSBtYXQ0LmNyZWF0ZSgpO1xuICogICAgIHF1YXQ0LnRvTWF0NChxdWF0LCBxdWF0TWF0KTtcbiAqICAgICBtYXQ0Lm11bHRpcGx5KGRlc3QsIHF1YXRNYXQpO1xuICogICAgIG1hdDQuc2NhbGUoZGVzdCwgc2NhbGUpXG4gKiAgICAgbWF0NC50cmFuc2xhdGUoZGVzdCwgbmVnYXRpdmVPcmlnaW4pO1xuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcbiAqIEBwYXJhbSB7cXVhdDR9IHEgUm90YXRpb24gcXVhdGVybmlvblxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IHYgVHJhbnNsYXRpb24gdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gcyBTY2FsaW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IG8gVGhlIG9yaWdpbiB2ZWN0b3IgYXJvdW5kIHdoaWNoIHRvIHNjYWxlIGFuZCByb3RhdGVcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVJvdGF0aW9uVHJhbnNsYXRpb25TY2FsZU9yaWdpbihvdXQsIHEsIHYsIHMsIG8pIHtcbiAgLy8gUXVhdGVybmlvbiBtYXRoXG4gIHZhciB4ID0gcVswXSxcbiAgICAgIHkgPSBxWzFdLFxuICAgICAgeiA9IHFbMl0sXG4gICAgICB3ID0gcVszXTtcbiAgdmFyIHgyID0geCArIHg7XG4gIHZhciB5MiA9IHkgKyB5O1xuICB2YXIgejIgPSB6ICsgejtcbiAgdmFyIHh4ID0geCAqIHgyO1xuICB2YXIgeHkgPSB4ICogeTI7XG4gIHZhciB4eiA9IHggKiB6MjtcbiAgdmFyIHl5ID0geSAqIHkyO1xuICB2YXIgeXogPSB5ICogejI7XG4gIHZhciB6eiA9IHogKiB6MjtcbiAgdmFyIHd4ID0gdyAqIHgyO1xuICB2YXIgd3kgPSB3ICogeTI7XG4gIHZhciB3eiA9IHcgKiB6MjtcbiAgdmFyIHN4ID0gc1swXTtcbiAgdmFyIHN5ID0gc1sxXTtcbiAgdmFyIHN6ID0gc1syXTtcbiAgdmFyIG94ID0gb1swXTtcbiAgdmFyIG95ID0gb1sxXTtcbiAgdmFyIG96ID0gb1syXTtcbiAgdmFyIG91dDAgPSAoMSAtICh5eSArIHp6KSkgKiBzeDtcbiAgdmFyIG91dDEgPSAoeHkgKyB3eikgKiBzeDtcbiAgdmFyIG91dDIgPSAoeHogLSB3eSkgKiBzeDtcbiAgdmFyIG91dDQgPSAoeHkgLSB3eikgKiBzeTtcbiAgdmFyIG91dDUgPSAoMSAtICh4eCArIHp6KSkgKiBzeTtcbiAgdmFyIG91dDYgPSAoeXogKyB3eCkgKiBzeTtcbiAgdmFyIG91dDggPSAoeHogKyB3eSkgKiBzejtcbiAgdmFyIG91dDkgPSAoeXogLSB3eCkgKiBzejtcbiAgdmFyIG91dDEwID0gKDEgLSAoeHggKyB5eSkpICogc3o7XG4gIG91dFswXSA9IG91dDA7XG4gIG91dFsxXSA9IG91dDE7XG4gIG91dFsyXSA9IG91dDI7XG4gIG91dFszXSA9IDA7XG4gIG91dFs0XSA9IG91dDQ7XG4gIG91dFs1XSA9IG91dDU7XG4gIG91dFs2XSA9IG91dDY7XG4gIG91dFs3XSA9IDA7XG4gIG91dFs4XSA9IG91dDg7XG4gIG91dFs5XSA9IG91dDk7XG4gIG91dFsxMF0gPSBvdXQxMDtcbiAgb3V0WzExXSA9IDA7XG4gIG91dFsxMl0gPSB2WzBdICsgb3ggLSAob3V0MCAqIG94ICsgb3V0NCAqIG95ICsgb3V0OCAqIG96KTtcbiAgb3V0WzEzXSA9IHZbMV0gKyBveSAtIChvdXQxICogb3ggKyBvdXQ1ICogb3kgKyBvdXQ5ICogb3opO1xuICBvdXRbMTRdID0gdlsyXSArIG96IC0gKG91dDIgKiBveCArIG91dDYgKiBveSArIG91dDEwICogb3opO1xuICBvdXRbMTVdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ2FsY3VsYXRlcyBhIDR4NCBtYXRyaXggZnJvbSB0aGUgZ2l2ZW4gcXVhdGVybmlvblxuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBxIFF1YXRlcm5pb24gdG8gY3JlYXRlIG1hdHJpeCBmcm9tXG4gKlxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tUXVhdChvdXQsIHEpIHtcbiAgdmFyIHggPSBxWzBdLFxuICAgICAgeSA9IHFbMV0sXG4gICAgICB6ID0gcVsyXSxcbiAgICAgIHcgPSBxWzNdO1xuICB2YXIgeDIgPSB4ICsgeDtcbiAgdmFyIHkyID0geSArIHk7XG4gIHZhciB6MiA9IHogKyB6O1xuICB2YXIgeHggPSB4ICogeDI7XG4gIHZhciB5eCA9IHkgKiB4MjtcbiAgdmFyIHl5ID0geSAqIHkyO1xuICB2YXIgenggPSB6ICogeDI7XG4gIHZhciB6eSA9IHogKiB5MjtcbiAgdmFyIHp6ID0geiAqIHoyO1xuICB2YXIgd3ggPSB3ICogeDI7XG4gIHZhciB3eSA9IHcgKiB5MjtcbiAgdmFyIHd6ID0gdyAqIHoyO1xuICBvdXRbMF0gPSAxIC0geXkgLSB6ejtcbiAgb3V0WzFdID0geXggKyB3ejtcbiAgb3V0WzJdID0genggLSB3eTtcbiAgb3V0WzNdID0gMDtcbiAgb3V0WzRdID0geXggLSB3ejtcbiAgb3V0WzVdID0gMSAtIHh4IC0geno7XG4gIG91dFs2XSA9IHp5ICsgd3g7XG4gIG91dFs3XSA9IDA7XG4gIG91dFs4XSA9IHp4ICsgd3k7XG4gIG91dFs5XSA9IHp5IC0gd3g7XG4gIG91dFsxMF0gPSAxIC0geHggLSB5eTtcbiAgb3V0WzExXSA9IDA7XG4gIG91dFsxMl0gPSAwO1xuICBvdXRbMTNdID0gMDtcbiAgb3V0WzE0XSA9IDA7XG4gIG91dFsxNV0gPSAxO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBHZW5lcmF0ZXMgYSBmcnVzdHVtIG1hdHJpeCB3aXRoIHRoZSBnaXZlbiBib3VuZHNcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IGZydXN0dW0gbWF0cml4IHdpbGwgYmUgd3JpdHRlbiBpbnRvXG4gKiBAcGFyYW0ge051bWJlcn0gbGVmdCBMZWZ0IGJvdW5kIG9mIHRoZSBmcnVzdHVtXG4gKiBAcGFyYW0ge051bWJlcn0gcmlnaHQgUmlnaHQgYm91bmQgb2YgdGhlIGZydXN0dW1cbiAqIEBwYXJhbSB7TnVtYmVyfSBib3R0b20gQm90dG9tIGJvdW5kIG9mIHRoZSBmcnVzdHVtXG4gKiBAcGFyYW0ge051bWJlcn0gdG9wIFRvcCBib3VuZCBvZiB0aGUgZnJ1c3R1bVxuICogQHBhcmFtIHtOdW1iZXJ9IG5lYXIgTmVhciBib3VuZCBvZiB0aGUgZnJ1c3R1bVxuICogQHBhcmFtIHtOdW1iZXJ9IGZhciBGYXIgYm91bmQgb2YgdGhlIGZydXN0dW1cbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJ1c3R1bShvdXQsIGxlZnQsIHJpZ2h0LCBib3R0b20sIHRvcCwgbmVhciwgZmFyKSB7XG4gIHZhciBybCA9IDEgLyAocmlnaHQgLSBsZWZ0KTtcbiAgdmFyIHRiID0gMSAvICh0b3AgLSBib3R0b20pO1xuICB2YXIgbmYgPSAxIC8gKG5lYXIgLSBmYXIpO1xuICBvdXRbMF0gPSBuZWFyICogMiAqIHJsO1xuICBvdXRbMV0gPSAwO1xuICBvdXRbMl0gPSAwO1xuICBvdXRbM10gPSAwO1xuICBvdXRbNF0gPSAwO1xuICBvdXRbNV0gPSBuZWFyICogMiAqIHRiO1xuICBvdXRbNl0gPSAwO1xuICBvdXRbN10gPSAwO1xuICBvdXRbOF0gPSAocmlnaHQgKyBsZWZ0KSAqIHJsO1xuICBvdXRbOV0gPSAodG9wICsgYm90dG9tKSAqIHRiO1xuICBvdXRbMTBdID0gKGZhciArIG5lYXIpICogbmY7XG4gIG91dFsxMV0gPSAtMTtcbiAgb3V0WzEyXSA9IDA7XG4gIG91dFsxM10gPSAwO1xuICBvdXRbMTRdID0gZmFyICogbmVhciAqIDIgKiBuZjtcbiAgb3V0WzE1XSA9IDA7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIEdlbmVyYXRlcyBhIHBlcnNwZWN0aXZlIHByb2plY3Rpb24gbWF0cml4IHdpdGggdGhlIGdpdmVuIGJvdW5kcy5cbiAqIFRoZSBuZWFyL2ZhciBjbGlwIHBsYW5lcyBjb3JyZXNwb25kIHRvIGEgbm9ybWFsaXplZCBkZXZpY2UgY29vcmRpbmF0ZSBaIHJhbmdlIG9mIFstMSwgMV0sXG4gKiB3aGljaCBtYXRjaGVzIFdlYkdML09wZW5HTCdzIGNsaXAgdm9sdW1lLlxuICogUGFzc2luZyBudWxsL3VuZGVmaW5lZC9ubyB2YWx1ZSBmb3IgZmFyIHdpbGwgZ2VuZXJhdGUgaW5maW5pdGUgcHJvamVjdGlvbiBtYXRyaXguXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgbWF0NCBmcnVzdHVtIG1hdHJpeCB3aWxsIGJlIHdyaXR0ZW4gaW50b1xuICogQHBhcmFtIHtudW1iZXJ9IGZvdnkgVmVydGljYWwgZmllbGQgb2YgdmlldyBpbiByYWRpYW5zXG4gKiBAcGFyYW0ge251bWJlcn0gYXNwZWN0IEFzcGVjdCByYXRpby4gdHlwaWNhbGx5IHZpZXdwb3J0IHdpZHRoL2hlaWdodFxuICogQHBhcmFtIHtudW1iZXJ9IG5lYXIgTmVhciBib3VuZCBvZiB0aGUgZnJ1c3R1bVxuICogQHBhcmFtIHtudW1iZXJ9IGZhciBGYXIgYm91bmQgb2YgdGhlIGZydXN0dW0sIGNhbiBiZSBudWxsIG9yIEluZmluaXR5XG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHBlcnNwZWN0aXZlTk8ob3V0LCBmb3Z5LCBhc3BlY3QsIG5lYXIsIGZhcikge1xuICB2YXIgZiA9IDEuMCAvIE1hdGgudGFuKGZvdnkgLyAyKSxcbiAgICAgIG5mO1xuICBvdXRbMF0gPSBmIC8gYXNwZWN0O1xuICBvdXRbMV0gPSAwO1xuICBvdXRbMl0gPSAwO1xuICBvdXRbM10gPSAwO1xuICBvdXRbNF0gPSAwO1xuICBvdXRbNV0gPSBmO1xuICBvdXRbNl0gPSAwO1xuICBvdXRbN10gPSAwO1xuICBvdXRbOF0gPSAwO1xuICBvdXRbOV0gPSAwO1xuICBvdXRbMTFdID0gLTE7XG4gIG91dFsxMl0gPSAwO1xuICBvdXRbMTNdID0gMDtcbiAgb3V0WzE1XSA9IDA7XG5cbiAgaWYgKGZhciAhPSBudWxsICYmIGZhciAhPT0gSW5maW5pdHkpIHtcbiAgICBuZiA9IDEgLyAobmVhciAtIGZhcik7XG4gICAgb3V0WzEwXSA9IChmYXIgKyBuZWFyKSAqIG5mO1xuICAgIG91dFsxNF0gPSAyICogZmFyICogbmVhciAqIG5mO1xuICB9IGVsc2Uge1xuICAgIG91dFsxMF0gPSAtMTtcbiAgICBvdXRbMTRdID0gLTIgKiBuZWFyO1xuICB9XG5cbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayBtYXQ0LnBlcnNwZWN0aXZlTk99XG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgdmFyIHBlcnNwZWN0aXZlID0gcGVyc3BlY3RpdmVOTztcbi8qKlxuICogR2VuZXJhdGVzIGEgcGVyc3BlY3RpdmUgcHJvamVjdGlvbiBtYXRyaXggc3VpdGFibGUgZm9yIFdlYkdQVSB3aXRoIHRoZSBnaXZlbiBib3VuZHMuXG4gKiBUaGUgbmVhci9mYXIgY2xpcCBwbGFuZXMgY29ycmVzcG9uZCB0byBhIG5vcm1hbGl6ZWQgZGV2aWNlIGNvb3JkaW5hdGUgWiByYW5nZSBvZiBbMCwgMV0sXG4gKiB3aGljaCBtYXRjaGVzIFdlYkdQVS9WdWxrYW4vRGlyZWN0WC9NZXRhbCdzIGNsaXAgdm9sdW1lLlxuICogUGFzc2luZyBudWxsL3VuZGVmaW5lZC9ubyB2YWx1ZSBmb3IgZmFyIHdpbGwgZ2VuZXJhdGUgaW5maW5pdGUgcHJvamVjdGlvbiBtYXRyaXguXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgbWF0NCBmcnVzdHVtIG1hdHJpeCB3aWxsIGJlIHdyaXR0ZW4gaW50b1xuICogQHBhcmFtIHtudW1iZXJ9IGZvdnkgVmVydGljYWwgZmllbGQgb2YgdmlldyBpbiByYWRpYW5zXG4gKiBAcGFyYW0ge251bWJlcn0gYXNwZWN0IEFzcGVjdCByYXRpby4gdHlwaWNhbGx5IHZpZXdwb3J0IHdpZHRoL2hlaWdodFxuICogQHBhcmFtIHtudW1iZXJ9IG5lYXIgTmVhciBib3VuZCBvZiB0aGUgZnJ1c3R1bVxuICogQHBhcmFtIHtudW1iZXJ9IGZhciBGYXIgYm91bmQgb2YgdGhlIGZydXN0dW0sIGNhbiBiZSBudWxsIG9yIEluZmluaXR5XG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHBlcnNwZWN0aXZlWk8ob3V0LCBmb3Z5LCBhc3BlY3QsIG5lYXIsIGZhcikge1xuICB2YXIgZiA9IDEuMCAvIE1hdGgudGFuKGZvdnkgLyAyKSxcbiAgICAgIG5mO1xuICBvdXRbMF0gPSBmIC8gYXNwZWN0O1xuICBvdXRbMV0gPSAwO1xuICBvdXRbMl0gPSAwO1xuICBvdXRbM10gPSAwO1xuICBvdXRbNF0gPSAwO1xuICBvdXRbNV0gPSBmO1xuICBvdXRbNl0gPSAwO1xuICBvdXRbN10gPSAwO1xuICBvdXRbOF0gPSAwO1xuICBvdXRbOV0gPSAwO1xuICBvdXRbMTFdID0gLTE7XG4gIG91dFsxMl0gPSAwO1xuICBvdXRbMTNdID0gMDtcbiAgb3V0WzE1XSA9IDA7XG5cbiAgaWYgKGZhciAhPSBudWxsICYmIGZhciAhPT0gSW5maW5pdHkpIHtcbiAgICBuZiA9IDEgLyAobmVhciAtIGZhcik7XG4gICAgb3V0WzEwXSA9IGZhciAqIG5mO1xuICAgIG91dFsxNF0gPSBmYXIgKiBuZWFyICogbmY7XG4gIH0gZWxzZSB7XG4gICAgb3V0WzEwXSA9IC0xO1xuICAgIG91dFsxNF0gPSAtbmVhcjtcbiAgfVxuXG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIEdlbmVyYXRlcyBhIHBlcnNwZWN0aXZlIHByb2plY3Rpb24gbWF0cml4IHdpdGggdGhlIGdpdmVuIGZpZWxkIG9mIHZpZXcuXG4gKiBUaGlzIGlzIHByaW1hcmlseSB1c2VmdWwgZm9yIGdlbmVyYXRpbmcgcHJvamVjdGlvbiBtYXRyaWNlcyB0byBiZSB1c2VkXG4gKiB3aXRoIHRoZSBzdGlsbCBleHBlcmllbWVudGFsIFdlYlZSIEFQSS5cbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IGZydXN0dW0gbWF0cml4IHdpbGwgYmUgd3JpdHRlbiBpbnRvXG4gKiBAcGFyYW0ge09iamVjdH0gZm92IE9iamVjdCBjb250YWluaW5nIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiB1cERlZ3JlZXMsIGRvd25EZWdyZWVzLCBsZWZ0RGVncmVlcywgcmlnaHREZWdyZWVzXG4gKiBAcGFyYW0ge251bWJlcn0gbmVhciBOZWFyIGJvdW5kIG9mIHRoZSBmcnVzdHVtXG4gKiBAcGFyYW0ge251bWJlcn0gZmFyIEZhciBib3VuZCBvZiB0aGUgZnJ1c3R1bVxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBwZXJzcGVjdGl2ZUZyb21GaWVsZE9mVmlldyhvdXQsIGZvdiwgbmVhciwgZmFyKSB7XG4gIHZhciB1cFRhbiA9IE1hdGgudGFuKGZvdi51cERlZ3JlZXMgKiBNYXRoLlBJIC8gMTgwLjApO1xuICB2YXIgZG93blRhbiA9IE1hdGgudGFuKGZvdi5kb3duRGVncmVlcyAqIE1hdGguUEkgLyAxODAuMCk7XG4gIHZhciBsZWZ0VGFuID0gTWF0aC50YW4oZm92LmxlZnREZWdyZWVzICogTWF0aC5QSSAvIDE4MC4wKTtcbiAgdmFyIHJpZ2h0VGFuID0gTWF0aC50YW4oZm92LnJpZ2h0RGVncmVlcyAqIE1hdGguUEkgLyAxODAuMCk7XG4gIHZhciB4U2NhbGUgPSAyLjAgLyAobGVmdFRhbiArIHJpZ2h0VGFuKTtcbiAgdmFyIHlTY2FsZSA9IDIuMCAvICh1cFRhbiArIGRvd25UYW4pO1xuICBvdXRbMF0gPSB4U2NhbGU7XG4gIG91dFsxXSA9IDAuMDtcbiAgb3V0WzJdID0gMC4wO1xuICBvdXRbM10gPSAwLjA7XG4gIG91dFs0XSA9IDAuMDtcbiAgb3V0WzVdID0geVNjYWxlO1xuICBvdXRbNl0gPSAwLjA7XG4gIG91dFs3XSA9IDAuMDtcbiAgb3V0WzhdID0gLSgobGVmdFRhbiAtIHJpZ2h0VGFuKSAqIHhTY2FsZSAqIDAuNSk7XG4gIG91dFs5XSA9ICh1cFRhbiAtIGRvd25UYW4pICogeVNjYWxlICogMC41O1xuICBvdXRbMTBdID0gZmFyIC8gKG5lYXIgLSBmYXIpO1xuICBvdXRbMTFdID0gLTEuMDtcbiAgb3V0WzEyXSA9IDAuMDtcbiAgb3V0WzEzXSA9IDAuMDtcbiAgb3V0WzE0XSA9IGZhciAqIG5lYXIgLyAobmVhciAtIGZhcik7XG4gIG91dFsxNV0gPSAwLjA7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIEdlbmVyYXRlcyBhIG9ydGhvZ29uYWwgcHJvamVjdGlvbiBtYXRyaXggd2l0aCB0aGUgZ2l2ZW4gYm91bmRzLlxuICogVGhlIG5lYXIvZmFyIGNsaXAgcGxhbmVzIGNvcnJlc3BvbmQgdG8gYSBub3JtYWxpemVkIGRldmljZSBjb29yZGluYXRlIFogcmFuZ2Ugb2YgWy0xLCAxXSxcbiAqIHdoaWNoIG1hdGNoZXMgV2ViR0wvT3BlbkdMJ3MgY2xpcCB2b2x1bWUuXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgbWF0NCBmcnVzdHVtIG1hdHJpeCB3aWxsIGJlIHdyaXR0ZW4gaW50b1xuICogQHBhcmFtIHtudW1iZXJ9IGxlZnQgTGVmdCBib3VuZCBvZiB0aGUgZnJ1c3R1bVxuICogQHBhcmFtIHtudW1iZXJ9IHJpZ2h0IFJpZ2h0IGJvdW5kIG9mIHRoZSBmcnVzdHVtXG4gKiBAcGFyYW0ge251bWJlcn0gYm90dG9tIEJvdHRvbSBib3VuZCBvZiB0aGUgZnJ1c3R1bVxuICogQHBhcmFtIHtudW1iZXJ9IHRvcCBUb3AgYm91bmQgb2YgdGhlIGZydXN0dW1cbiAqIEBwYXJhbSB7bnVtYmVyfSBuZWFyIE5lYXIgYm91bmQgb2YgdGhlIGZydXN0dW1cbiAqIEBwYXJhbSB7bnVtYmVyfSBmYXIgRmFyIGJvdW5kIG9mIHRoZSBmcnVzdHVtXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG9ydGhvTk8ob3V0LCBsZWZ0LCByaWdodCwgYm90dG9tLCB0b3AsIG5lYXIsIGZhcikge1xuICB2YXIgbHIgPSAxIC8gKGxlZnQgLSByaWdodCk7XG4gIHZhciBidCA9IDEgLyAoYm90dG9tIC0gdG9wKTtcbiAgdmFyIG5mID0gMSAvIChuZWFyIC0gZmFyKTtcbiAgb3V0WzBdID0gLTIgKiBscjtcbiAgb3V0WzFdID0gMDtcbiAgb3V0WzJdID0gMDtcbiAgb3V0WzNdID0gMDtcbiAgb3V0WzRdID0gMDtcbiAgb3V0WzVdID0gLTIgKiBidDtcbiAgb3V0WzZdID0gMDtcbiAgb3V0WzddID0gMDtcbiAgb3V0WzhdID0gMDtcbiAgb3V0WzldID0gMDtcbiAgb3V0WzEwXSA9IDIgKiBuZjtcbiAgb3V0WzExXSA9IDA7XG4gIG91dFsxMl0gPSAobGVmdCArIHJpZ2h0KSAqIGxyO1xuICBvdXRbMTNdID0gKHRvcCArIGJvdHRvbSkgKiBidDtcbiAgb3V0WzE0XSA9IChmYXIgKyBuZWFyKSAqIG5mO1xuICBvdXRbMTVdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayBtYXQ0Lm9ydGhvTk99XG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgdmFyIG9ydGhvID0gb3J0aG9OTztcbi8qKlxuICogR2VuZXJhdGVzIGEgb3J0aG9nb25hbCBwcm9qZWN0aW9uIG1hdHJpeCB3aXRoIHRoZSBnaXZlbiBib3VuZHMuXG4gKiBUaGUgbmVhci9mYXIgY2xpcCBwbGFuZXMgY29ycmVzcG9uZCB0byBhIG5vcm1hbGl6ZWQgZGV2aWNlIGNvb3JkaW5hdGUgWiByYW5nZSBvZiBbMCwgMV0sXG4gKiB3aGljaCBtYXRjaGVzIFdlYkdQVS9WdWxrYW4vRGlyZWN0WC9NZXRhbCdzIGNsaXAgdm9sdW1lLlxuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgZnJ1c3R1bSBtYXRyaXggd2lsbCBiZSB3cml0dGVuIGludG9cbiAqIEBwYXJhbSB7bnVtYmVyfSBsZWZ0IExlZnQgYm91bmQgb2YgdGhlIGZydXN0dW1cbiAqIEBwYXJhbSB7bnVtYmVyfSByaWdodCBSaWdodCBib3VuZCBvZiB0aGUgZnJ1c3R1bVxuICogQHBhcmFtIHtudW1iZXJ9IGJvdHRvbSBCb3R0b20gYm91bmQgb2YgdGhlIGZydXN0dW1cbiAqIEBwYXJhbSB7bnVtYmVyfSB0b3AgVG9wIGJvdW5kIG9mIHRoZSBmcnVzdHVtXG4gKiBAcGFyYW0ge251bWJlcn0gbmVhciBOZWFyIGJvdW5kIG9mIHRoZSBmcnVzdHVtXG4gKiBAcGFyYW0ge251bWJlcn0gZmFyIEZhciBib3VuZCBvZiB0aGUgZnJ1c3R1bVxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBvcnRob1pPKG91dCwgbGVmdCwgcmlnaHQsIGJvdHRvbSwgdG9wLCBuZWFyLCBmYXIpIHtcbiAgdmFyIGxyID0gMSAvIChsZWZ0IC0gcmlnaHQpO1xuICB2YXIgYnQgPSAxIC8gKGJvdHRvbSAtIHRvcCk7XG4gIHZhciBuZiA9IDEgLyAobmVhciAtIGZhcik7XG4gIG91dFswXSA9IC0yICogbHI7XG4gIG91dFsxXSA9IDA7XG4gIG91dFsyXSA9IDA7XG4gIG91dFszXSA9IDA7XG4gIG91dFs0XSA9IDA7XG4gIG91dFs1XSA9IC0yICogYnQ7XG4gIG91dFs2XSA9IDA7XG4gIG91dFs3XSA9IDA7XG4gIG91dFs4XSA9IDA7XG4gIG91dFs5XSA9IDA7XG4gIG91dFsxMF0gPSBuZjtcbiAgb3V0WzExXSA9IDA7XG4gIG91dFsxMl0gPSAobGVmdCArIHJpZ2h0KSAqIGxyO1xuICBvdXRbMTNdID0gKHRvcCArIGJvdHRvbSkgKiBidDtcbiAgb3V0WzE0XSA9IG5lYXIgKiBuZjtcbiAgb3V0WzE1XSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIEdlbmVyYXRlcyBhIGxvb2stYXQgbWF0cml4IHdpdGggdGhlIGdpdmVuIGV5ZSBwb3NpdGlvbiwgZm9jYWwgcG9pbnQsIGFuZCB1cCBheGlzLlxuICogSWYgeW91IHdhbnQgYSBtYXRyaXggdGhhdCBhY3R1YWxseSBtYWtlcyBhbiBvYmplY3QgbG9vayBhdCBhbm90aGVyIG9iamVjdCwgeW91IHNob3VsZCB1c2UgdGFyZ2V0VG8gaW5zdGVhZC5cbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IGZydXN0dW0gbWF0cml4IHdpbGwgYmUgd3JpdHRlbiBpbnRvXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gZXllIFBvc2l0aW9uIG9mIHRoZSB2aWV3ZXJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBjZW50ZXIgUG9pbnQgdGhlIHZpZXdlciBpcyBsb29raW5nIGF0XG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gdXAgdmVjMyBwb2ludGluZyB1cFxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBsb29rQXQob3V0LCBleWUsIGNlbnRlciwgdXApIHtcbiAgdmFyIHgwLCB4MSwgeDIsIHkwLCB5MSwgeTIsIHowLCB6MSwgejIsIGxlbjtcbiAgdmFyIGV5ZXggPSBleWVbMF07XG4gIHZhciBleWV5ID0gZXllWzFdO1xuICB2YXIgZXlleiA9IGV5ZVsyXTtcbiAgdmFyIHVweCA9IHVwWzBdO1xuICB2YXIgdXB5ID0gdXBbMV07XG4gIHZhciB1cHogPSB1cFsyXTtcbiAgdmFyIGNlbnRlcnggPSBjZW50ZXJbMF07XG4gIHZhciBjZW50ZXJ5ID0gY2VudGVyWzFdO1xuICB2YXIgY2VudGVyeiA9IGNlbnRlclsyXTtcblxuICBpZiAoTWF0aC5hYnMoZXlleCAtIGNlbnRlcngpIDwgZ2xNYXRyaXguRVBTSUxPTiAmJiBNYXRoLmFicyhleWV5IC0gY2VudGVyeSkgPCBnbE1hdHJpeC5FUFNJTE9OICYmIE1hdGguYWJzKGV5ZXogLSBjZW50ZXJ6KSA8IGdsTWF0cml4LkVQU0lMT04pIHtcbiAgICByZXR1cm4gaWRlbnRpdHkob3V0KTtcbiAgfVxuXG4gIHowID0gZXlleCAtIGNlbnRlcng7XG4gIHoxID0gZXlleSAtIGNlbnRlcnk7XG4gIHoyID0gZXlleiAtIGNlbnRlcno7XG4gIGxlbiA9IDEgLyBNYXRoLmh5cG90KHowLCB6MSwgejIpO1xuICB6MCAqPSBsZW47XG4gIHoxICo9IGxlbjtcbiAgejIgKj0gbGVuO1xuICB4MCA9IHVweSAqIHoyIC0gdXB6ICogejE7XG4gIHgxID0gdXB6ICogejAgLSB1cHggKiB6MjtcbiAgeDIgPSB1cHggKiB6MSAtIHVweSAqIHowO1xuICBsZW4gPSBNYXRoLmh5cG90KHgwLCB4MSwgeDIpO1xuXG4gIGlmICghbGVuKSB7XG4gICAgeDAgPSAwO1xuICAgIHgxID0gMDtcbiAgICB4MiA9IDA7XG4gIH0gZWxzZSB7XG4gICAgbGVuID0gMSAvIGxlbjtcbiAgICB4MCAqPSBsZW47XG4gICAgeDEgKj0gbGVuO1xuICAgIHgyICo9IGxlbjtcbiAgfVxuXG4gIHkwID0gejEgKiB4MiAtIHoyICogeDE7XG4gIHkxID0gejIgKiB4MCAtIHowICogeDI7XG4gIHkyID0gejAgKiB4MSAtIHoxICogeDA7XG4gIGxlbiA9IE1hdGguaHlwb3QoeTAsIHkxLCB5Mik7XG5cbiAgaWYgKCFsZW4pIHtcbiAgICB5MCA9IDA7XG4gICAgeTEgPSAwO1xuICAgIHkyID0gMDtcbiAgfSBlbHNlIHtcbiAgICBsZW4gPSAxIC8gbGVuO1xuICAgIHkwICo9IGxlbjtcbiAgICB5MSAqPSBsZW47XG4gICAgeTIgKj0gbGVuO1xuICB9XG5cbiAgb3V0WzBdID0geDA7XG4gIG91dFsxXSA9IHkwO1xuICBvdXRbMl0gPSB6MDtcbiAgb3V0WzNdID0gMDtcbiAgb3V0WzRdID0geDE7XG4gIG91dFs1XSA9IHkxO1xuICBvdXRbNl0gPSB6MTtcbiAgb3V0WzddID0gMDtcbiAgb3V0WzhdID0geDI7XG4gIG91dFs5XSA9IHkyO1xuICBvdXRbMTBdID0gejI7XG4gIG91dFsxMV0gPSAwO1xuICBvdXRbMTJdID0gLSh4MCAqIGV5ZXggKyB4MSAqIGV5ZXkgKyB4MiAqIGV5ZXopO1xuICBvdXRbMTNdID0gLSh5MCAqIGV5ZXggKyB5MSAqIGV5ZXkgKyB5MiAqIGV5ZXopO1xuICBvdXRbMTRdID0gLSh6MCAqIGV5ZXggKyB6MSAqIGV5ZXkgKyB6MiAqIGV5ZXopO1xuICBvdXRbMTVdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogR2VuZXJhdGVzIGEgbWF0cml4IHRoYXQgbWFrZXMgc29tZXRoaW5nIGxvb2sgYXQgc29tZXRoaW5nIGVsc2UuXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgbWF0NCBmcnVzdHVtIG1hdHJpeCB3aWxsIGJlIHdyaXR0ZW4gaW50b1xuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGV5ZSBQb3NpdGlvbiBvZiB0aGUgdmlld2VyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gY2VudGVyIFBvaW50IHRoZSB2aWV3ZXIgaXMgbG9va2luZyBhdFxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IHVwIHZlYzMgcG9pbnRpbmcgdXBcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gdGFyZ2V0VG8ob3V0LCBleWUsIHRhcmdldCwgdXApIHtcbiAgdmFyIGV5ZXggPSBleWVbMF0sXG4gICAgICBleWV5ID0gZXllWzFdLFxuICAgICAgZXlleiA9IGV5ZVsyXSxcbiAgICAgIHVweCA9IHVwWzBdLFxuICAgICAgdXB5ID0gdXBbMV0sXG4gICAgICB1cHogPSB1cFsyXTtcbiAgdmFyIHowID0gZXlleCAtIHRhcmdldFswXSxcbiAgICAgIHoxID0gZXlleSAtIHRhcmdldFsxXSxcbiAgICAgIHoyID0gZXlleiAtIHRhcmdldFsyXTtcbiAgdmFyIGxlbiA9IHowICogejAgKyB6MSAqIHoxICsgejIgKiB6MjtcblxuICBpZiAobGVuID4gMCkge1xuICAgIGxlbiA9IDEgLyBNYXRoLnNxcnQobGVuKTtcbiAgICB6MCAqPSBsZW47XG4gICAgejEgKj0gbGVuO1xuICAgIHoyICo9IGxlbjtcbiAgfVxuXG4gIHZhciB4MCA9IHVweSAqIHoyIC0gdXB6ICogejEsXG4gICAgICB4MSA9IHVweiAqIHowIC0gdXB4ICogejIsXG4gICAgICB4MiA9IHVweCAqIHoxIC0gdXB5ICogejA7XG4gIGxlbiA9IHgwICogeDAgKyB4MSAqIHgxICsgeDIgKiB4MjtcblxuICBpZiAobGVuID4gMCkge1xuICAgIGxlbiA9IDEgLyBNYXRoLnNxcnQobGVuKTtcbiAgICB4MCAqPSBsZW47XG4gICAgeDEgKj0gbGVuO1xuICAgIHgyICo9IGxlbjtcbiAgfVxuXG4gIG91dFswXSA9IHgwO1xuICBvdXRbMV0gPSB4MTtcbiAgb3V0WzJdID0geDI7XG4gIG91dFszXSA9IDA7XG4gIG91dFs0XSA9IHoxICogeDIgLSB6MiAqIHgxO1xuICBvdXRbNV0gPSB6MiAqIHgwIC0gejAgKiB4MjtcbiAgb3V0WzZdID0gejAgKiB4MSAtIHoxICogeDA7XG4gIG91dFs3XSA9IDA7XG4gIG91dFs4XSA9IHowO1xuICBvdXRbOV0gPSB6MTtcbiAgb3V0WzEwXSA9IHoyO1xuICBvdXRbMTFdID0gMDtcbiAgb3V0WzEyXSA9IGV5ZXg7XG4gIG91dFsxM10gPSBleWV5O1xuICBvdXRbMTRdID0gZXllejtcbiAgb3V0WzE1XSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBtYXQ0XG4gKlxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IGEgbWF0cml4IHRvIHJlcHJlc2VudCBhcyBhIHN0cmluZ1xuICogQHJldHVybnMge1N0cmluZ30gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtYXRyaXhcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc3RyKGEpIHtcbiAgcmV0dXJuIFwibWF0NChcIiArIGFbMF0gKyBcIiwgXCIgKyBhWzFdICsgXCIsIFwiICsgYVsyXSArIFwiLCBcIiArIGFbM10gKyBcIiwgXCIgKyBhWzRdICsgXCIsIFwiICsgYVs1XSArIFwiLCBcIiArIGFbNl0gKyBcIiwgXCIgKyBhWzddICsgXCIsIFwiICsgYVs4XSArIFwiLCBcIiArIGFbOV0gKyBcIiwgXCIgKyBhWzEwXSArIFwiLCBcIiArIGFbMTFdICsgXCIsIFwiICsgYVsxMl0gKyBcIiwgXCIgKyBhWzEzXSArIFwiLCBcIiArIGFbMTRdICsgXCIsIFwiICsgYVsxNV0gKyBcIilcIjtcbn1cbi8qKlxuICogUmV0dXJucyBGcm9iZW5pdXMgbm9ybSBvZiBhIG1hdDRcbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gYSB0aGUgbWF0cml4IHRvIGNhbGN1bGF0ZSBGcm9iZW5pdXMgbm9ybSBvZlxuICogQHJldHVybnMge051bWJlcn0gRnJvYmVuaXVzIG5vcm1cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvYihhKSB7XG4gIHJldHVybiBNYXRoLmh5cG90KGFbMF0sIGFbMV0sIGFbMl0sIGFbM10sIGFbNF0sIGFbNV0sIGFbNl0sIGFbN10sIGFbOF0sIGFbOV0sIGFbMTBdLCBhWzExXSwgYVsxMl0sIGFbMTNdLCBhWzE0XSwgYVsxNV0pO1xufVxuLyoqXG4gKiBBZGRzIHR3byBtYXQ0J3NcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBhZGQob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gKyBiWzBdO1xuICBvdXRbMV0gPSBhWzFdICsgYlsxXTtcbiAgb3V0WzJdID0gYVsyXSArIGJbMl07XG4gIG91dFszXSA9IGFbM10gKyBiWzNdO1xuICBvdXRbNF0gPSBhWzRdICsgYls0XTtcbiAgb3V0WzVdID0gYVs1XSArIGJbNV07XG4gIG91dFs2XSA9IGFbNl0gKyBiWzZdO1xuICBvdXRbN10gPSBhWzddICsgYls3XTtcbiAgb3V0WzhdID0gYVs4XSArIGJbOF07XG4gIG91dFs5XSA9IGFbOV0gKyBiWzldO1xuICBvdXRbMTBdID0gYVsxMF0gKyBiWzEwXTtcbiAgb3V0WzExXSA9IGFbMTFdICsgYlsxMV07XG4gIG91dFsxMl0gPSBhWzEyXSArIGJbMTJdO1xuICBvdXRbMTNdID0gYVsxM10gKyBiWzEzXTtcbiAgb3V0WzE0XSA9IGFbMTRdICsgYlsxNF07XG4gIG91dFsxNV0gPSBhWzE1XSArIGJbMTVdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBTdWJ0cmFjdHMgbWF0cml4IGIgZnJvbSBtYXRyaXggYVxuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHN1YnRyYWN0KG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdIC0gYlswXTtcbiAgb3V0WzFdID0gYVsxXSAtIGJbMV07XG4gIG91dFsyXSA9IGFbMl0gLSBiWzJdO1xuICBvdXRbM10gPSBhWzNdIC0gYlszXTtcbiAgb3V0WzRdID0gYVs0XSAtIGJbNF07XG4gIG91dFs1XSA9IGFbNV0gLSBiWzVdO1xuICBvdXRbNl0gPSBhWzZdIC0gYls2XTtcbiAgb3V0WzddID0gYVs3XSAtIGJbN107XG4gIG91dFs4XSA9IGFbOF0gLSBiWzhdO1xuICBvdXRbOV0gPSBhWzldIC0gYls5XTtcbiAgb3V0WzEwXSA9IGFbMTBdIC0gYlsxMF07XG4gIG91dFsxMV0gPSBhWzExXSAtIGJbMTFdO1xuICBvdXRbMTJdID0gYVsxMl0gLSBiWzEyXTtcbiAgb3V0WzEzXSA9IGFbMTNdIC0gYlsxM107XG4gIG91dFsxNF0gPSBhWzE0XSAtIGJbMTRdO1xuICBvdXRbMTVdID0gYVsxNV0gLSBiWzE1XTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogTXVsdGlwbHkgZWFjaCBlbGVtZW50IG9mIHRoZSBtYXRyaXggYnkgYSBzY2FsYXIuXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBhIHRoZSBtYXRyaXggdG8gc2NhbGVcbiAqIEBwYXJhbSB7TnVtYmVyfSBiIGFtb3VudCB0byBzY2FsZSB0aGUgbWF0cml4J3MgZWxlbWVudHMgYnlcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbXVsdGlwbHlTY2FsYXIob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gKiBiO1xuICBvdXRbMV0gPSBhWzFdICogYjtcbiAgb3V0WzJdID0gYVsyXSAqIGI7XG4gIG91dFszXSA9IGFbM10gKiBiO1xuICBvdXRbNF0gPSBhWzRdICogYjtcbiAgb3V0WzVdID0gYVs1XSAqIGI7XG4gIG91dFs2XSA9IGFbNl0gKiBiO1xuICBvdXRbN10gPSBhWzddICogYjtcbiAgb3V0WzhdID0gYVs4XSAqIGI7XG4gIG91dFs5XSA9IGFbOV0gKiBiO1xuICBvdXRbMTBdID0gYVsxMF0gKiBiO1xuICBvdXRbMTFdID0gYVsxMV0gKiBiO1xuICBvdXRbMTJdID0gYVsxMl0gKiBiO1xuICBvdXRbMTNdID0gYVsxM10gKiBiO1xuICBvdXRbMTRdID0gYVsxNF0gKiBiO1xuICBvdXRbMTVdID0gYVsxNV0gKiBiO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBBZGRzIHR3byBtYXQ0J3MgYWZ0ZXIgbXVsdGlwbHlpbmcgZWFjaCBlbGVtZW50IG9mIHRoZSBzZWNvbmQgb3BlcmFuZCBieSBhIHNjYWxhciB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHBhcmFtIHtOdW1iZXJ9IHNjYWxlIHRoZSBhbW91bnQgdG8gc2NhbGUgYidzIGVsZW1lbnRzIGJ5IGJlZm9yZSBhZGRpbmdcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbXVsdGlwbHlTY2FsYXJBbmRBZGQob3V0LCBhLCBiLCBzY2FsZSkge1xuICBvdXRbMF0gPSBhWzBdICsgYlswXSAqIHNjYWxlO1xuICBvdXRbMV0gPSBhWzFdICsgYlsxXSAqIHNjYWxlO1xuICBvdXRbMl0gPSBhWzJdICsgYlsyXSAqIHNjYWxlO1xuICBvdXRbM10gPSBhWzNdICsgYlszXSAqIHNjYWxlO1xuICBvdXRbNF0gPSBhWzRdICsgYls0XSAqIHNjYWxlO1xuICBvdXRbNV0gPSBhWzVdICsgYls1XSAqIHNjYWxlO1xuICBvdXRbNl0gPSBhWzZdICsgYls2XSAqIHNjYWxlO1xuICBvdXRbN10gPSBhWzddICsgYls3XSAqIHNjYWxlO1xuICBvdXRbOF0gPSBhWzhdICsgYls4XSAqIHNjYWxlO1xuICBvdXRbOV0gPSBhWzldICsgYls5XSAqIHNjYWxlO1xuICBvdXRbMTBdID0gYVsxMF0gKyBiWzEwXSAqIHNjYWxlO1xuICBvdXRbMTFdID0gYVsxMV0gKyBiWzExXSAqIHNjYWxlO1xuICBvdXRbMTJdID0gYVsxMl0gKyBiWzEyXSAqIHNjYWxlO1xuICBvdXRbMTNdID0gYVsxM10gKyBiWzEzXSAqIHNjYWxlO1xuICBvdXRbMTRdID0gYVsxNF0gKyBiWzE0XSAqIHNjYWxlO1xuICBvdXRbMTVdID0gYVsxNV0gKyBiWzE1XSAqIHNjYWxlO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBtYXRyaWNlcyBoYXZlIGV4YWN0bHkgdGhlIHNhbWUgZWxlbWVudHMgaW4gdGhlIHNhbWUgcG9zaXRpb24gKHdoZW4gY29tcGFyZWQgd2l0aCA9PT0pXG4gKlxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IGEgVGhlIGZpcnN0IG1hdHJpeC5cbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBiIFRoZSBzZWNvbmQgbWF0cml4LlxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIG1hdHJpY2VzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBleGFjdEVxdWFscyhhLCBiKSB7XG4gIHJldHVybiBhWzBdID09PSBiWzBdICYmIGFbMV0gPT09IGJbMV0gJiYgYVsyXSA9PT0gYlsyXSAmJiBhWzNdID09PSBiWzNdICYmIGFbNF0gPT09IGJbNF0gJiYgYVs1XSA9PT0gYls1XSAmJiBhWzZdID09PSBiWzZdICYmIGFbN10gPT09IGJbN10gJiYgYVs4XSA9PT0gYls4XSAmJiBhWzldID09PSBiWzldICYmIGFbMTBdID09PSBiWzEwXSAmJiBhWzExXSA9PT0gYlsxMV0gJiYgYVsxMl0gPT09IGJbMTJdICYmIGFbMTNdID09PSBiWzEzXSAmJiBhWzE0XSA9PT0gYlsxNF0gJiYgYVsxNV0gPT09IGJbMTVdO1xufVxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBtYXRyaWNlcyBoYXZlIGFwcHJveGltYXRlbHkgdGhlIHNhbWUgZWxlbWVudHMgaW4gdGhlIHNhbWUgcG9zaXRpb24uXG4gKlxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IGEgVGhlIGZpcnN0IG1hdHJpeC5cbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBiIFRoZSBzZWNvbmQgbWF0cml4LlxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIG1hdHJpY2VzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBlcXVhbHMoYSwgYikge1xuICB2YXIgYTAgPSBhWzBdLFxuICAgICAgYTEgPSBhWzFdLFxuICAgICAgYTIgPSBhWzJdLFxuICAgICAgYTMgPSBhWzNdO1xuICB2YXIgYTQgPSBhWzRdLFxuICAgICAgYTUgPSBhWzVdLFxuICAgICAgYTYgPSBhWzZdLFxuICAgICAgYTcgPSBhWzddO1xuICB2YXIgYTggPSBhWzhdLFxuICAgICAgYTkgPSBhWzldLFxuICAgICAgYTEwID0gYVsxMF0sXG4gICAgICBhMTEgPSBhWzExXTtcbiAgdmFyIGExMiA9IGFbMTJdLFxuICAgICAgYTEzID0gYVsxM10sXG4gICAgICBhMTQgPSBhWzE0XSxcbiAgICAgIGExNSA9IGFbMTVdO1xuICB2YXIgYjAgPSBiWzBdLFxuICAgICAgYjEgPSBiWzFdLFxuICAgICAgYjIgPSBiWzJdLFxuICAgICAgYjMgPSBiWzNdO1xuICB2YXIgYjQgPSBiWzRdLFxuICAgICAgYjUgPSBiWzVdLFxuICAgICAgYjYgPSBiWzZdLFxuICAgICAgYjcgPSBiWzddO1xuICB2YXIgYjggPSBiWzhdLFxuICAgICAgYjkgPSBiWzldLFxuICAgICAgYjEwID0gYlsxMF0sXG4gICAgICBiMTEgPSBiWzExXTtcbiAgdmFyIGIxMiA9IGJbMTJdLFxuICAgICAgYjEzID0gYlsxM10sXG4gICAgICBiMTQgPSBiWzE0XSxcbiAgICAgIGIxNSA9IGJbMTVdO1xuICByZXR1cm4gTWF0aC5hYnMoYTAgLSBiMCkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTApLCBNYXRoLmFicyhiMCkpICYmIE1hdGguYWJzKGExIC0gYjEpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGExKSwgTWF0aC5hYnMoYjEpKSAmJiBNYXRoLmFicyhhMiAtIGIyKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMiksIE1hdGguYWJzKGIyKSkgJiYgTWF0aC5hYnMoYTMgLSBiMykgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTMpLCBNYXRoLmFicyhiMykpICYmIE1hdGguYWJzKGE0IC0gYjQpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGE0KSwgTWF0aC5hYnMoYjQpKSAmJiBNYXRoLmFicyhhNSAtIGI1KSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhNSksIE1hdGguYWJzKGI1KSkgJiYgTWF0aC5hYnMoYTYgLSBiNikgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTYpLCBNYXRoLmFicyhiNikpICYmIE1hdGguYWJzKGE3IC0gYjcpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGE3KSwgTWF0aC5hYnMoYjcpKSAmJiBNYXRoLmFicyhhOCAtIGI4KSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhOCksIE1hdGguYWJzKGI4KSkgJiYgTWF0aC5hYnMoYTkgLSBiOSkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTkpLCBNYXRoLmFicyhiOSkpICYmIE1hdGguYWJzKGExMCAtIGIxMCkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTEwKSwgTWF0aC5hYnMoYjEwKSkgJiYgTWF0aC5hYnMoYTExIC0gYjExKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMTEpLCBNYXRoLmFicyhiMTEpKSAmJiBNYXRoLmFicyhhMTIgLSBiMTIpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGExMiksIE1hdGguYWJzKGIxMikpICYmIE1hdGguYWJzKGExMyAtIGIxMykgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTEzKSwgTWF0aC5hYnMoYjEzKSkgJiYgTWF0aC5hYnMoYTE0IC0gYjE0KSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMTQpLCBNYXRoLmFicyhiMTQpKSAmJiBNYXRoLmFicyhhMTUgLSBiMTUpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGExNSksIE1hdGguYWJzKGIxNSkpO1xufVxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIG1hdDQubXVsdGlwbHl9XG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgdmFyIG11bCA9IG11bHRpcGx5O1xuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIG1hdDQuc3VidHJhY3R9XG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgdmFyIHN1YiA9IHN1YnRyYWN0OyIsImltcG9ydCAqIGFzIGdsTWF0cml4IGZyb20gXCIuL2NvbW1vbi5qc1wiO1xuLyoqXG4gKiA0IERpbWVuc2lvbmFsIFZlY3RvclxuICogQG1vZHVsZSB2ZWM0XG4gKi9cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3LCBlbXB0eSB2ZWM0XG4gKlxuICogQHJldHVybnMge3ZlYzR9IGEgbmV3IDREIHZlY3RvclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGUoKSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSg0KTtcblxuICBpZiAoZ2xNYXRyaXguQVJSQVlfVFlQRSAhPSBGbG9hdDMyQXJyYXkpIHtcbiAgICBvdXRbMF0gPSAwO1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgICBvdXRbM10gPSAwO1xuICB9XG5cbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyB2ZWM0IGluaXRpYWxpemVkIHdpdGggdmFsdWVzIGZyb20gYW4gZXhpc3RpbmcgdmVjdG9yXG4gKlxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGEgdmVjdG9yIHRvIGNsb25lXG4gKiBAcmV0dXJucyB7dmVjNH0gYSBuZXcgNEQgdmVjdG9yXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNsb25lKGEpIHtcbiAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDQpO1xuICBvdXRbMF0gPSBhWzBdO1xuICBvdXRbMV0gPSBhWzFdO1xuICBvdXRbMl0gPSBhWzJdO1xuICBvdXRbM10gPSBhWzNdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IHZlYzQgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgZ2l2ZW4gdmFsdWVzXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IHggWCBjb21wb25lbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB5IFkgY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0geiBaIGNvbXBvbmVudFxuICogQHBhcmFtIHtOdW1iZXJ9IHcgVyBjb21wb25lbnRcbiAqIEByZXR1cm5zIHt2ZWM0fSBhIG5ldyA0RCB2ZWN0b3JcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVZhbHVlcyh4LCB5LCB6LCB3KSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSg0KTtcbiAgb3V0WzBdID0geDtcbiAgb3V0WzFdID0geTtcbiAgb3V0WzJdID0gejtcbiAgb3V0WzNdID0gdztcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ29weSB0aGUgdmFsdWVzIGZyb20gb25lIHZlYzQgdG8gYW5vdGhlclxuICpcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYSB0aGUgc291cmNlIHZlY3RvclxuICogQHJldHVybnMge3ZlYzR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjb3B5KG91dCwgYSkge1xuICBvdXRbMF0gPSBhWzBdO1xuICBvdXRbMV0gPSBhWzFdO1xuICBvdXRbMl0gPSBhWzJdO1xuICBvdXRbM10gPSBhWzNdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBTZXQgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWM0IHRvIHRoZSBnaXZlbiB2YWx1ZXNcbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtOdW1iZXJ9IHggWCBjb21wb25lbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB5IFkgY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0geiBaIGNvbXBvbmVudFxuICogQHBhcmFtIHtOdW1iZXJ9IHcgVyBjb21wb25lbnRcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc2V0KG91dCwgeCwgeSwgeiwgdykge1xuICBvdXRbMF0gPSB4O1xuICBvdXRbMV0gPSB5O1xuICBvdXRbMl0gPSB6O1xuICBvdXRbM10gPSB3O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBBZGRzIHR3byB2ZWM0J3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBhZGQob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gKyBiWzBdO1xuICBvdXRbMV0gPSBhWzFdICsgYlsxXTtcbiAgb3V0WzJdID0gYVsyXSArIGJbMl07XG4gIG91dFszXSA9IGFbM10gKyBiWzNdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBTdWJ0cmFjdHMgdmVjdG9yIGIgZnJvbSB2ZWN0b3IgYVxuICpcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHN1YnRyYWN0KG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdIC0gYlswXTtcbiAgb3V0WzFdID0gYVsxXSAtIGJbMV07XG4gIG91dFsyXSA9IGFbMl0gLSBiWzJdO1xuICBvdXRbM10gPSBhWzNdIC0gYlszXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogTXVsdGlwbGllcyB0d28gdmVjNCdzXG4gKlxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbXVsdGlwbHkob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gKiBiWzBdO1xuICBvdXRbMV0gPSBhWzFdICogYlsxXTtcbiAgb3V0WzJdID0gYVsyXSAqIGJbMl07XG4gIG91dFszXSA9IGFbM10gKiBiWzNdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBEaXZpZGVzIHR3byB2ZWM0J3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBkaXZpZGUob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gLyBiWzBdO1xuICBvdXRbMV0gPSBhWzFdIC8gYlsxXTtcbiAgb3V0WzJdID0gYVsyXSAvIGJbMl07XG4gIG91dFszXSA9IGFbM10gLyBiWzNdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBNYXRoLmNlaWwgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWM0XG4gKlxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBhIHZlY3RvciB0byBjZWlsXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNlaWwob3V0LCBhKSB7XG4gIG91dFswXSA9IE1hdGguY2VpbChhWzBdKTtcbiAgb3V0WzFdID0gTWF0aC5jZWlsKGFbMV0pO1xuICBvdXRbMl0gPSBNYXRoLmNlaWwoYVsyXSk7XG4gIG91dFszXSA9IE1hdGguY2VpbChhWzNdKTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogTWF0aC5mbG9vciB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzRcbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGEgdmVjdG9yIHRvIGZsb29yXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZsb29yKG91dCwgYSkge1xuICBvdXRbMF0gPSBNYXRoLmZsb29yKGFbMF0pO1xuICBvdXRbMV0gPSBNYXRoLmZsb29yKGFbMV0pO1xuICBvdXRbMl0gPSBNYXRoLmZsb29yKGFbMl0pO1xuICBvdXRbM10gPSBNYXRoLmZsb29yKGFbM10pO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBSZXR1cm5zIHRoZSBtaW5pbXVtIG9mIHR3byB2ZWM0J3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBtaW4ob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IE1hdGgubWluKGFbMF0sIGJbMF0pO1xuICBvdXRbMV0gPSBNYXRoLm1pbihhWzFdLCBiWzFdKTtcbiAgb3V0WzJdID0gTWF0aC5taW4oYVsyXSwgYlsyXSk7XG4gIG91dFszXSA9IE1hdGgubWluKGFbM10sIGJbM10pO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBSZXR1cm5zIHRoZSBtYXhpbXVtIG9mIHR3byB2ZWM0J3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBtYXgob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IE1hdGgubWF4KGFbMF0sIGJbMF0pO1xuICBvdXRbMV0gPSBNYXRoLm1heChhWzFdLCBiWzFdKTtcbiAgb3V0WzJdID0gTWF0aC5tYXgoYVsyXSwgYlsyXSk7XG4gIG91dFszXSA9IE1hdGgubWF4KGFbM10sIGJbM10pO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBNYXRoLnJvdW5kIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjNFxuICpcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYSB2ZWN0b3IgdG8gcm91bmRcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcm91bmQob3V0LCBhKSB7XG4gIG91dFswXSA9IE1hdGgucm91bmQoYVswXSk7XG4gIG91dFsxXSA9IE1hdGgucm91bmQoYVsxXSk7XG4gIG91dFsyXSA9IE1hdGgucm91bmQoYVsyXSk7XG4gIG91dFszXSA9IE1hdGgucm91bmQoYVszXSk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFNjYWxlcyBhIHZlYzQgYnkgYSBzY2FsYXIgbnVtYmVyXG4gKlxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBhIHRoZSB2ZWN0b3IgdG8gc2NhbGVcbiAqIEBwYXJhbSB7TnVtYmVyfSBiIGFtb3VudCB0byBzY2FsZSB0aGUgdmVjdG9yIGJ5XG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNjYWxlKG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdICogYjtcbiAgb3V0WzFdID0gYVsxXSAqIGI7XG4gIG91dFsyXSA9IGFbMl0gKiBiO1xuICBvdXRbM10gPSBhWzNdICogYjtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQWRkcyB0d28gdmVjNCdzIGFmdGVyIHNjYWxpbmcgdGhlIHNlY29uZCBvcGVyYW5kIGJ5IGEgc2NhbGFyIHZhbHVlXG4gKlxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEBwYXJhbSB7TnVtYmVyfSBzY2FsZSB0aGUgYW1vdW50IHRvIHNjYWxlIGIgYnkgYmVmb3JlIGFkZGluZ1xuICogQHJldHVybnMge3ZlYzR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzY2FsZUFuZEFkZChvdXQsIGEsIGIsIHNjYWxlKSB7XG4gIG91dFswXSA9IGFbMF0gKyBiWzBdICogc2NhbGU7XG4gIG91dFsxXSA9IGFbMV0gKyBiWzFdICogc2NhbGU7XG4gIG91dFsyXSA9IGFbMl0gKyBiWzJdICogc2NhbGU7XG4gIG91dFszXSA9IGFbM10gKyBiWzNdICogc2NhbGU7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGV1Y2xpZGlhbiBkaXN0YW5jZSBiZXR3ZWVuIHR3byB2ZWM0J3NcbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBkaXN0YW5jZSBiZXR3ZWVuIGEgYW5kIGJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZGlzdGFuY2UoYSwgYikge1xuICB2YXIgeCA9IGJbMF0gLSBhWzBdO1xuICB2YXIgeSA9IGJbMV0gLSBhWzFdO1xuICB2YXIgeiA9IGJbMl0gLSBhWzJdO1xuICB2YXIgdyA9IGJbM10gLSBhWzNdO1xuICByZXR1cm4gTWF0aC5oeXBvdCh4LCB5LCB6LCB3KTtcbn1cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgc3F1YXJlZCBldWNsaWRpYW4gZGlzdGFuY2UgYmV0d2VlbiB0d28gdmVjNCdzXG4gKlxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge051bWJlcn0gc3F1YXJlZCBkaXN0YW5jZSBiZXR3ZWVuIGEgYW5kIGJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc3F1YXJlZERpc3RhbmNlKGEsIGIpIHtcbiAgdmFyIHggPSBiWzBdIC0gYVswXTtcbiAgdmFyIHkgPSBiWzFdIC0gYVsxXTtcbiAgdmFyIHogPSBiWzJdIC0gYVsyXTtcbiAgdmFyIHcgPSBiWzNdIC0gYVszXTtcbiAgcmV0dXJuIHggKiB4ICsgeSAqIHkgKyB6ICogeiArIHcgKiB3O1xufVxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBsZW5ndGggb2YgYSB2ZWM0XG4gKlxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGEgdmVjdG9yIHRvIGNhbGN1bGF0ZSBsZW5ndGggb2ZcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGxlbmd0aCBvZiBhXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGxlbmd0aChhKSB7XG4gIHZhciB4ID0gYVswXTtcbiAgdmFyIHkgPSBhWzFdO1xuICB2YXIgeiA9IGFbMl07XG4gIHZhciB3ID0gYVszXTtcbiAgcmV0dXJuIE1hdGguaHlwb3QoeCwgeSwgeiwgdyk7XG59XG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIHNxdWFyZWQgbGVuZ3RoIG9mIGEgdmVjNFxuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBhIHZlY3RvciB0byBjYWxjdWxhdGUgc3F1YXJlZCBsZW5ndGggb2ZcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IHNxdWFyZWQgbGVuZ3RoIG9mIGFcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc3F1YXJlZExlbmd0aChhKSB7XG4gIHZhciB4ID0gYVswXTtcbiAgdmFyIHkgPSBhWzFdO1xuICB2YXIgeiA9IGFbMl07XG4gIHZhciB3ID0gYVszXTtcbiAgcmV0dXJuIHggKiB4ICsgeSAqIHkgKyB6ICogeiArIHcgKiB3O1xufVxuLyoqXG4gKiBOZWdhdGVzIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjNFxuICpcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYSB2ZWN0b3IgdG8gbmVnYXRlXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG5lZ2F0ZShvdXQsIGEpIHtcbiAgb3V0WzBdID0gLWFbMF07XG4gIG91dFsxXSA9IC1hWzFdO1xuICBvdXRbMl0gPSAtYVsyXTtcbiAgb3V0WzNdID0gLWFbM107XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFJldHVybnMgdGhlIGludmVyc2Ugb2YgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWM0XG4gKlxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBhIHZlY3RvciB0byBpbnZlcnRcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gaW52ZXJzZShvdXQsIGEpIHtcbiAgb3V0WzBdID0gMS4wIC8gYVswXTtcbiAgb3V0WzFdID0gMS4wIC8gYVsxXTtcbiAgb3V0WzJdID0gMS4wIC8gYVsyXTtcbiAgb3V0WzNdID0gMS4wIC8gYVszXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogTm9ybWFsaXplIGEgdmVjNFxuICpcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYSB2ZWN0b3IgdG8gbm9ybWFsaXplXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZShvdXQsIGEpIHtcbiAgdmFyIHggPSBhWzBdO1xuICB2YXIgeSA9IGFbMV07XG4gIHZhciB6ID0gYVsyXTtcbiAgdmFyIHcgPSBhWzNdO1xuICB2YXIgbGVuID0geCAqIHggKyB5ICogeSArIHogKiB6ICsgdyAqIHc7XG5cbiAgaWYgKGxlbiA+IDApIHtcbiAgICBsZW4gPSAxIC8gTWF0aC5zcXJ0KGxlbik7XG4gIH1cblxuICBvdXRbMF0gPSB4ICogbGVuO1xuICBvdXRbMV0gPSB5ICogbGVuO1xuICBvdXRbMl0gPSB6ICogbGVuO1xuICBvdXRbM10gPSB3ICogbGVuO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBkb3QgcHJvZHVjdCBvZiB0d28gdmVjNCdzXG4gKlxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge051bWJlcn0gZG90IHByb2R1Y3Qgb2YgYSBhbmQgYlxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBkb3QoYSwgYikge1xuICByZXR1cm4gYVswXSAqIGJbMF0gKyBhWzFdICogYlsxXSArIGFbMl0gKiBiWzJdICsgYVszXSAqIGJbM107XG59XG4vKipcbiAqIFJldHVybnMgdGhlIGNyb3NzLXByb2R1Y3Qgb2YgdGhyZWUgdmVjdG9ycyBpbiBhIDQtZGltZW5zaW9uYWwgc3BhY2VcbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gcmVzdWx0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gVSB0aGUgZmlyc3QgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gViB0aGUgc2Vjb25kIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IFcgdGhlIHRoaXJkIHZlY3RvclxuICogQHJldHVybnMge3ZlYzR9IHJlc3VsdFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjcm9zcyhvdXQsIHUsIHYsIHcpIHtcbiAgdmFyIEEgPSB2WzBdICogd1sxXSAtIHZbMV0gKiB3WzBdLFxuICAgICAgQiA9IHZbMF0gKiB3WzJdIC0gdlsyXSAqIHdbMF0sXG4gICAgICBDID0gdlswXSAqIHdbM10gLSB2WzNdICogd1swXSxcbiAgICAgIEQgPSB2WzFdICogd1syXSAtIHZbMl0gKiB3WzFdLFxuICAgICAgRSA9IHZbMV0gKiB3WzNdIC0gdlszXSAqIHdbMV0sXG4gICAgICBGID0gdlsyXSAqIHdbM10gLSB2WzNdICogd1syXTtcbiAgdmFyIEcgPSB1WzBdO1xuICB2YXIgSCA9IHVbMV07XG4gIHZhciBJID0gdVsyXTtcbiAgdmFyIEogPSB1WzNdO1xuICBvdXRbMF0gPSBIICogRiAtIEkgKiBFICsgSiAqIEQ7XG4gIG91dFsxXSA9IC0oRyAqIEYpICsgSSAqIEMgLSBKICogQjtcbiAgb3V0WzJdID0gRyAqIEUgLSBIICogQyArIEogKiBBO1xuICBvdXRbM10gPSAtKEcgKiBEKSArIEggKiBCIC0gSSAqIEE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFBlcmZvcm1zIGEgbGluZWFyIGludGVycG9sYXRpb24gYmV0d2VlbiB0d28gdmVjNCdzXG4gKlxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEBwYXJhbSB7TnVtYmVyfSB0IGludGVycG9sYXRpb24gYW1vdW50LCBpbiB0aGUgcmFuZ2UgWzAtMV0sIGJldHdlZW4gdGhlIHR3byBpbnB1dHNcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbGVycChvdXQsIGEsIGIsIHQpIHtcbiAgdmFyIGF4ID0gYVswXTtcbiAgdmFyIGF5ID0gYVsxXTtcbiAgdmFyIGF6ID0gYVsyXTtcbiAgdmFyIGF3ID0gYVszXTtcbiAgb3V0WzBdID0gYXggKyB0ICogKGJbMF0gLSBheCk7XG4gIG91dFsxXSA9IGF5ICsgdCAqIChiWzFdIC0gYXkpO1xuICBvdXRbMl0gPSBheiArIHQgKiAoYlsyXSAtIGF6KTtcbiAgb3V0WzNdID0gYXcgKyB0ICogKGJbM10gLSBhdyk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIEdlbmVyYXRlcyBhIHJhbmRvbSB2ZWN0b3Igd2l0aCB0aGUgZ2l2ZW4gc2NhbGVcbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtOdW1iZXJ9IFtzY2FsZV0gTGVuZ3RoIG9mIHRoZSByZXN1bHRpbmcgdmVjdG9yLiBJZiBvbW1pdHRlZCwgYSB1bml0IHZlY3RvciB3aWxsIGJlIHJldHVybmVkXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJhbmRvbShvdXQsIHNjYWxlKSB7XG4gIHNjYWxlID0gc2NhbGUgfHwgMS4wOyAvLyBNYXJzYWdsaWEsIEdlb3JnZS4gQ2hvb3NpbmcgYSBQb2ludCBmcm9tIHRoZSBTdXJmYWNlIG9mIGFcbiAgLy8gU3BoZXJlLiBBbm4uIE1hdGguIFN0YXRpc3QuIDQzICgxOTcyKSwgbm8uIDIsIDY0NS0tNjQ2LlxuICAvLyBodHRwOi8vcHJvamVjdGV1Y2xpZC5vcmcvZXVjbGlkLmFvbXMvMTE3NzY5MjY0NDtcblxuICB2YXIgdjEsIHYyLCB2MywgdjQ7XG4gIHZhciBzMSwgczI7XG5cbiAgZG8ge1xuICAgIHYxID0gZ2xNYXRyaXguUkFORE9NKCkgKiAyIC0gMTtcbiAgICB2MiA9IGdsTWF0cml4LlJBTkRPTSgpICogMiAtIDE7XG4gICAgczEgPSB2MSAqIHYxICsgdjIgKiB2MjtcbiAgfSB3aGlsZSAoczEgPj0gMSk7XG5cbiAgZG8ge1xuICAgIHYzID0gZ2xNYXRyaXguUkFORE9NKCkgKiAyIC0gMTtcbiAgICB2NCA9IGdsTWF0cml4LlJBTkRPTSgpICogMiAtIDE7XG4gICAgczIgPSB2MyAqIHYzICsgdjQgKiB2NDtcbiAgfSB3aGlsZSAoczIgPj0gMSk7XG5cbiAgdmFyIGQgPSBNYXRoLnNxcnQoKDEgLSBzMSkgLyBzMik7XG4gIG91dFswXSA9IHNjYWxlICogdjE7XG4gIG91dFsxXSA9IHNjYWxlICogdjI7XG4gIG91dFsyXSA9IHNjYWxlICogdjMgKiBkO1xuICBvdXRbM10gPSBzY2FsZSAqIHY0ICogZDtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogVHJhbnNmb3JtcyB0aGUgdmVjNCB3aXRoIGEgbWF0NC5cbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGEgdGhlIHZlY3RvciB0byB0cmFuc2Zvcm1cbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBtIG1hdHJpeCB0byB0cmFuc2Zvcm0gd2l0aFxuICogQHJldHVybnMge3ZlYzR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1NYXQ0KG91dCwgYSwgbSkge1xuICB2YXIgeCA9IGFbMF0sXG4gICAgICB5ID0gYVsxXSxcbiAgICAgIHogPSBhWzJdLFxuICAgICAgdyA9IGFbM107XG4gIG91dFswXSA9IG1bMF0gKiB4ICsgbVs0XSAqIHkgKyBtWzhdICogeiArIG1bMTJdICogdztcbiAgb3V0WzFdID0gbVsxXSAqIHggKyBtWzVdICogeSArIG1bOV0gKiB6ICsgbVsxM10gKiB3O1xuICBvdXRbMl0gPSBtWzJdICogeCArIG1bNl0gKiB5ICsgbVsxMF0gKiB6ICsgbVsxNF0gKiB3O1xuICBvdXRbM10gPSBtWzNdICogeCArIG1bN10gKiB5ICsgbVsxMV0gKiB6ICsgbVsxNV0gKiB3O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBUcmFuc2Zvcm1zIHRoZSB2ZWM0IHdpdGggYSBxdWF0XG4gKlxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBhIHRoZSB2ZWN0b3IgdG8gdHJhbnNmb3JtXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdH0gcSBxdWF0ZXJuaW9uIHRvIHRyYW5zZm9ybSB3aXRoXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zZm9ybVF1YXQob3V0LCBhLCBxKSB7XG4gIHZhciB4ID0gYVswXSxcbiAgICAgIHkgPSBhWzFdLFxuICAgICAgeiA9IGFbMl07XG4gIHZhciBxeCA9IHFbMF0sXG4gICAgICBxeSA9IHFbMV0sXG4gICAgICBxeiA9IHFbMl0sXG4gICAgICBxdyA9IHFbM107IC8vIGNhbGN1bGF0ZSBxdWF0ICogdmVjXG5cbiAgdmFyIGl4ID0gcXcgKiB4ICsgcXkgKiB6IC0gcXogKiB5O1xuICB2YXIgaXkgPSBxdyAqIHkgKyBxeiAqIHggLSBxeCAqIHo7XG4gIHZhciBpeiA9IHF3ICogeiArIHF4ICogeSAtIHF5ICogeDtcbiAgdmFyIGl3ID0gLXF4ICogeCAtIHF5ICogeSAtIHF6ICogejsgLy8gY2FsY3VsYXRlIHJlc3VsdCAqIGludmVyc2UgcXVhdFxuXG4gIG91dFswXSA9IGl4ICogcXcgKyBpdyAqIC1xeCArIGl5ICogLXF6IC0gaXogKiAtcXk7XG4gIG91dFsxXSA9IGl5ICogcXcgKyBpdyAqIC1xeSArIGl6ICogLXF4IC0gaXggKiAtcXo7XG4gIG91dFsyXSA9IGl6ICogcXcgKyBpdyAqIC1xeiArIGl4ICogLXF5IC0gaXkgKiAtcXg7XG4gIG91dFszXSA9IGFbM107XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFNldCB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzQgdG8gemVyb1xuICpcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHplcm8ob3V0KSB7XG4gIG91dFswXSA9IDAuMDtcbiAgb3V0WzFdID0gMC4wO1xuICBvdXRbMl0gPSAwLjA7XG4gIG91dFszXSA9IDAuMDtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIHZlY3RvclxuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBhIHZlY3RvciB0byByZXByZXNlbnQgYXMgYSBzdHJpbmdcbiAqIEByZXR1cm5zIHtTdHJpbmd9IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgdmVjdG9yXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHN0cihhKSB7XG4gIHJldHVybiBcInZlYzQoXCIgKyBhWzBdICsgXCIsIFwiICsgYVsxXSArIFwiLCBcIiArIGFbMl0gKyBcIiwgXCIgKyBhWzNdICsgXCIpXCI7XG59XG4vKipcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHZlY3RvcnMgaGF2ZSBleGFjdGx5IHRoZSBzYW1lIGVsZW1lbnRzIGluIHRoZSBzYW1lIHBvc2l0aW9uICh3aGVuIGNvbXBhcmVkIHdpdGggPT09KVxuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBhIFRoZSBmaXJzdCB2ZWN0b3IuXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYiBUaGUgc2Vjb25kIHZlY3Rvci5cbiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSB2ZWN0b3JzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBleGFjdEVxdWFscyhhLCBiKSB7XG4gIHJldHVybiBhWzBdID09PSBiWzBdICYmIGFbMV0gPT09IGJbMV0gJiYgYVsyXSA9PT0gYlsyXSAmJiBhWzNdID09PSBiWzNdO1xufVxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSB2ZWN0b3JzIGhhdmUgYXBwcm94aW1hdGVseSB0aGUgc2FtZSBlbGVtZW50cyBpbiB0aGUgc2FtZSBwb3NpdGlvbi5cbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYSBUaGUgZmlyc3QgdmVjdG9yLlxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGIgVGhlIHNlY29uZCB2ZWN0b3IuXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmVjdG9ycyBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZXF1YWxzKGEsIGIpIHtcbiAgdmFyIGEwID0gYVswXSxcbiAgICAgIGExID0gYVsxXSxcbiAgICAgIGEyID0gYVsyXSxcbiAgICAgIGEzID0gYVszXTtcbiAgdmFyIGIwID0gYlswXSxcbiAgICAgIGIxID0gYlsxXSxcbiAgICAgIGIyID0gYlsyXSxcbiAgICAgIGIzID0gYlszXTtcbiAgcmV0dXJuIE1hdGguYWJzKGEwIC0gYjApIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEwKSwgTWF0aC5hYnMoYjApKSAmJiBNYXRoLmFicyhhMSAtIGIxKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMSksIE1hdGguYWJzKGIxKSkgJiYgTWF0aC5hYnMoYTIgLSBiMikgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTIpLCBNYXRoLmFicyhiMikpICYmIE1hdGguYWJzKGEzIC0gYjMpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEzKSwgTWF0aC5hYnMoYjMpKTtcbn1cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWM0LnN1YnRyYWN0fVxuICogQGZ1bmN0aW9uXG4gKi9cblxuZXhwb3J0IHZhciBzdWIgPSBzdWJ0cmFjdDtcbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWM0Lm11bHRpcGx5fVxuICogQGZ1bmN0aW9uXG4gKi9cblxuZXhwb3J0IHZhciBtdWwgPSBtdWx0aXBseTtcbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWM0LmRpdmlkZX1cbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCB2YXIgZGl2ID0gZGl2aWRlO1xuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzQuZGlzdGFuY2V9XG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgdmFyIGRpc3QgPSBkaXN0YW5jZTtcbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWM0LnNxdWFyZWREaXN0YW5jZX1cbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCB2YXIgc3FyRGlzdCA9IHNxdWFyZWREaXN0YW5jZTtcbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWM0Lmxlbmd0aH1cbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCB2YXIgbGVuID0gbGVuZ3RoO1xuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzQuc3F1YXJlZExlbmd0aH1cbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCB2YXIgc3FyTGVuID0gc3F1YXJlZExlbmd0aDtcbi8qKlxuICogUGVyZm9ybSBzb21lIG9wZXJhdGlvbiBvdmVyIGFuIGFycmF5IG9mIHZlYzRzLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IGEgdGhlIGFycmF5IG9mIHZlY3RvcnMgdG8gaXRlcmF0ZSBvdmVyXG4gKiBAcGFyYW0ge051bWJlcn0gc3RyaWRlIE51bWJlciBvZiBlbGVtZW50cyBiZXR3ZWVuIHRoZSBzdGFydCBvZiBlYWNoIHZlYzQuIElmIDAgYXNzdW1lcyB0aWdodGx5IHBhY2tlZFxuICogQHBhcmFtIHtOdW1iZXJ9IG9mZnNldCBOdW1iZXIgb2YgZWxlbWVudHMgdG8gc2tpcCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhcnJheVxuICogQHBhcmFtIHtOdW1iZXJ9IGNvdW50IE51bWJlciBvZiB2ZWM0cyB0byBpdGVyYXRlIG92ZXIuIElmIDAgaXRlcmF0ZXMgb3ZlciBlbnRpcmUgYXJyYXlcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIEZ1bmN0aW9uIHRvIGNhbGwgZm9yIGVhY2ggdmVjdG9yIGluIHRoZSBhcnJheVxuICogQHBhcmFtIHtPYmplY3R9IFthcmddIGFkZGl0aW9uYWwgYXJndW1lbnQgdG8gcGFzcyB0byBmblxuICogQHJldHVybnMge0FycmF5fSBhXG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgdmFyIGZvckVhY2ggPSBmdW5jdGlvbiAoKSB7XG4gIHZhciB2ZWMgPSBjcmVhdGUoKTtcbiAgcmV0dXJuIGZ1bmN0aW9uIChhLCBzdHJpZGUsIG9mZnNldCwgY291bnQsIGZuLCBhcmcpIHtcbiAgICB2YXIgaSwgbDtcblxuICAgIGlmICghc3RyaWRlKSB7XG4gICAgICBzdHJpZGUgPSA0O1xuICAgIH1cblxuICAgIGlmICghb2Zmc2V0KSB7XG4gICAgICBvZmZzZXQgPSAwO1xuICAgIH1cblxuICAgIGlmIChjb3VudCkge1xuICAgICAgbCA9IE1hdGgubWluKGNvdW50ICogc3RyaWRlICsgb2Zmc2V0LCBhLmxlbmd0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGwgPSBhLmxlbmd0aDtcbiAgICB9XG5cbiAgICBmb3IgKGkgPSBvZmZzZXQ7IGkgPCBsOyBpICs9IHN0cmlkZSkge1xuICAgICAgdmVjWzBdID0gYVtpXTtcbiAgICAgIHZlY1sxXSA9IGFbaSArIDFdO1xuICAgICAgdmVjWzJdID0gYVtpICsgMl07XG4gICAgICB2ZWNbM10gPSBhW2kgKyAzXTtcbiAgICAgIGZuKHZlYywgdmVjLCBhcmcpO1xuICAgICAgYVtpXSA9IHZlY1swXTtcbiAgICAgIGFbaSArIDFdID0gdmVjWzFdO1xuICAgICAgYVtpICsgMl0gPSB2ZWNbMl07XG4gICAgICBhW2kgKyAzXSA9IHZlY1szXTtcbiAgICB9XG5cbiAgICByZXR1cm4gYTtcbiAgfTtcbn0oKTsiLCJpbXBvcnQgKiBhcyBnbE1hdHJpeCBmcm9tIFwiLi9jb21tb24uanNcIjtcbmltcG9ydCAqIGFzIG1hdDMgZnJvbSBcIi4vbWF0My5qc1wiO1xuaW1wb3J0ICogYXMgdmVjMyBmcm9tIFwiLi92ZWMzLmpzXCI7XG5pbXBvcnQgKiBhcyB2ZWM0IGZyb20gXCIuL3ZlYzQuanNcIjtcbi8qKlxuICogUXVhdGVybmlvblxuICogQG1vZHVsZSBxdWF0XG4gKi9cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGlkZW50aXR5IHF1YXRcbiAqXG4gKiBAcmV0dXJucyB7cXVhdH0gYSBuZXcgcXVhdGVybmlvblxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGUoKSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSg0KTtcblxuICBpZiAoZ2xNYXRyaXguQVJSQVlfVFlQRSAhPSBGbG9hdDMyQXJyYXkpIHtcbiAgICBvdXRbMF0gPSAwO1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgfVxuXG4gIG91dFszXSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFNldCBhIHF1YXQgdG8gdGhlIGlkZW50aXR5IHF1YXRlcm5pb25cbiAqXG4gKiBAcGFyYW0ge3F1YXR9IG91dCB0aGUgcmVjZWl2aW5nIHF1YXRlcm5pb25cbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gaWRlbnRpdHkob3V0KSB7XG4gIG91dFswXSA9IDA7XG4gIG91dFsxXSA9IDA7XG4gIG91dFsyXSA9IDA7XG4gIG91dFszXSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFNldHMgYSBxdWF0IGZyb20gdGhlIGdpdmVuIGFuZ2xlIGFuZCByb3RhdGlvbiBheGlzLFxuICogdGhlbiByZXR1cm5zIGl0LlxuICpcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGF4aXMgdGhlIGF4aXMgYXJvdW5kIHdoaWNoIHRvIHJvdGF0ZVxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCB0aGUgYW5nbGUgaW4gcmFkaWFuc1xuICogQHJldHVybnMge3F1YXR9IG91dFxuICoqL1xuXG5leHBvcnQgZnVuY3Rpb24gc2V0QXhpc0FuZ2xlKG91dCwgYXhpcywgcmFkKSB7XG4gIHJhZCA9IHJhZCAqIDAuNTtcbiAgdmFyIHMgPSBNYXRoLnNpbihyYWQpO1xuICBvdXRbMF0gPSBzICogYXhpc1swXTtcbiAgb3V0WzFdID0gcyAqIGF4aXNbMV07XG4gIG91dFsyXSA9IHMgKiBheGlzWzJdO1xuICBvdXRbM10gPSBNYXRoLmNvcyhyYWQpO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBHZXRzIHRoZSByb3RhdGlvbiBheGlzIGFuZCBhbmdsZSBmb3IgYSBnaXZlblxuICogIHF1YXRlcm5pb24uIElmIGEgcXVhdGVybmlvbiBpcyBjcmVhdGVkIHdpdGhcbiAqICBzZXRBeGlzQW5nbGUsIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIHRoZSBzYW1lXG4gKiAgdmFsdWVzIGFzIHByb3ZpZGllZCBpbiB0aGUgb3JpZ2luYWwgcGFyYW1ldGVyIGxpc3RcbiAqICBPUiBmdW5jdGlvbmFsbHkgZXF1aXZhbGVudCB2YWx1ZXMuXG4gKiBFeGFtcGxlOiBUaGUgcXVhdGVybmlvbiBmb3JtZWQgYnkgYXhpcyBbMCwgMCwgMV0gYW5kXG4gKiAgYW5nbGUgLTkwIGlzIHRoZSBzYW1lIGFzIHRoZSBxdWF0ZXJuaW9uIGZvcm1lZCBieVxuICogIFswLCAwLCAxXSBhbmQgMjcwLiBUaGlzIG1ldGhvZCBmYXZvcnMgdGhlIGxhdHRlci5cbiAqIEBwYXJhbSAge3ZlYzN9IG91dF9heGlzICBWZWN0b3IgcmVjZWl2aW5nIHRoZSBheGlzIG9mIHJvdGF0aW9uXG4gKiBAcGFyYW0gIHtSZWFkb25seVF1YXR9IHEgICAgIFF1YXRlcm5pb24gdG8gYmUgZGVjb21wb3NlZFxuICogQHJldHVybiB7TnVtYmVyfSAgICAgQW5nbGUsIGluIHJhZGlhbnMsIG9mIHRoZSByb3RhdGlvblxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBeGlzQW5nbGUob3V0X2F4aXMsIHEpIHtcbiAgdmFyIHJhZCA9IE1hdGguYWNvcyhxWzNdKSAqIDIuMDtcbiAgdmFyIHMgPSBNYXRoLnNpbihyYWQgLyAyLjApO1xuXG4gIGlmIChzID4gZ2xNYXRyaXguRVBTSUxPTikge1xuICAgIG91dF9heGlzWzBdID0gcVswXSAvIHM7XG4gICAgb3V0X2F4aXNbMV0gPSBxWzFdIC8gcztcbiAgICBvdXRfYXhpc1syXSA9IHFbMl0gLyBzO1xuICB9IGVsc2Uge1xuICAgIC8vIElmIHMgaXMgemVybywgcmV0dXJuIGFueSBheGlzIChubyByb3RhdGlvbiAtIGF4aXMgZG9lcyBub3QgbWF0dGVyKVxuICAgIG91dF9heGlzWzBdID0gMTtcbiAgICBvdXRfYXhpc1sxXSA9IDA7XG4gICAgb3V0X2F4aXNbMl0gPSAwO1xuICB9XG5cbiAgcmV0dXJuIHJhZDtcbn1cbi8qKlxuICogR2V0cyB0aGUgYW5ndWxhciBkaXN0YW5jZSBiZXR3ZWVuIHR3byB1bml0IHF1YXRlcm5pb25zXG4gKlxuICogQHBhcmFtICB7UmVhZG9ubHlRdWF0fSBhICAgICBPcmlnaW4gdW5pdCBxdWF0ZXJuaW9uXG4gKiBAcGFyYW0gIHtSZWFkb25seVF1YXR9IGIgICAgIERlc3RpbmF0aW9uIHVuaXQgcXVhdGVybmlvblxuICogQHJldHVybiB7TnVtYmVyfSAgICAgQW5nbGUsIGluIHJhZGlhbnMsIGJldHdlZW4gdGhlIHR3byBxdWF0ZXJuaW9uc1xuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBbmdsZShhLCBiKSB7XG4gIHZhciBkb3Rwcm9kdWN0ID0gZG90KGEsIGIpO1xuICByZXR1cm4gTWF0aC5hY29zKDIgKiBkb3Rwcm9kdWN0ICogZG90cHJvZHVjdCAtIDEpO1xufVxuLyoqXG4gKiBNdWx0aXBsaWVzIHR3byBxdWF0J3NcbiAqXG4gKiBAcGFyYW0ge3F1YXR9IG91dCB0aGUgcmVjZWl2aW5nIHF1YXRlcm5pb25cbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbXVsdGlwbHkob3V0LCBhLCBiKSB7XG4gIHZhciBheCA9IGFbMF0sXG4gICAgICBheSA9IGFbMV0sXG4gICAgICBheiA9IGFbMl0sXG4gICAgICBhdyA9IGFbM107XG4gIHZhciBieCA9IGJbMF0sXG4gICAgICBieSA9IGJbMV0sXG4gICAgICBieiA9IGJbMl0sXG4gICAgICBidyA9IGJbM107XG4gIG91dFswXSA9IGF4ICogYncgKyBhdyAqIGJ4ICsgYXkgKiBieiAtIGF6ICogYnk7XG4gIG91dFsxXSA9IGF5ICogYncgKyBhdyAqIGJ5ICsgYXogKiBieCAtIGF4ICogYno7XG4gIG91dFsyXSA9IGF6ICogYncgKyBhdyAqIGJ6ICsgYXggKiBieSAtIGF5ICogYng7XG4gIG91dFszXSA9IGF3ICogYncgLSBheCAqIGJ4IC0gYXkgKiBieSAtIGF6ICogYno7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFJvdGF0ZXMgYSBxdWF0ZXJuaW9uIGJ5IHRoZSBnaXZlbiBhbmdsZSBhYm91dCB0aGUgWCBheGlzXG4gKlxuICogQHBhcmFtIHtxdWF0fSBvdXQgcXVhdCByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxuICogQHBhcmFtIHtSZWFkb25seVF1YXR9IGEgcXVhdCB0byByb3RhdGVcbiAqIEBwYXJhbSB7bnVtYmVyfSByYWQgYW5nbGUgKGluIHJhZGlhbnMpIHRvIHJvdGF0ZVxuICogQHJldHVybnMge3F1YXR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByb3RhdGVYKG91dCwgYSwgcmFkKSB7XG4gIHJhZCAqPSAwLjU7XG4gIHZhciBheCA9IGFbMF0sXG4gICAgICBheSA9IGFbMV0sXG4gICAgICBheiA9IGFbMl0sXG4gICAgICBhdyA9IGFbM107XG4gIHZhciBieCA9IE1hdGguc2luKHJhZCksXG4gICAgICBidyA9IE1hdGguY29zKHJhZCk7XG4gIG91dFswXSA9IGF4ICogYncgKyBhdyAqIGJ4O1xuICBvdXRbMV0gPSBheSAqIGJ3ICsgYXogKiBieDtcbiAgb3V0WzJdID0gYXogKiBidyAtIGF5ICogYng7XG4gIG91dFszXSA9IGF3ICogYncgLSBheCAqIGJ4O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBSb3RhdGVzIGEgcXVhdGVybmlvbiBieSB0aGUgZ2l2ZW4gYW5nbGUgYWJvdXQgdGhlIFkgYXhpc1xuICpcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHF1YXQgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBhIHF1YXQgdG8gcm90YXRlXG4gKiBAcGFyYW0ge251bWJlcn0gcmFkIGFuZ2xlIChpbiByYWRpYW5zKSB0byByb3RhdGVcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcm90YXRlWShvdXQsIGEsIHJhZCkge1xuICByYWQgKj0gMC41O1xuICB2YXIgYXggPSBhWzBdLFxuICAgICAgYXkgPSBhWzFdLFxuICAgICAgYXogPSBhWzJdLFxuICAgICAgYXcgPSBhWzNdO1xuICB2YXIgYnkgPSBNYXRoLnNpbihyYWQpLFxuICAgICAgYncgPSBNYXRoLmNvcyhyYWQpO1xuICBvdXRbMF0gPSBheCAqIGJ3IC0gYXogKiBieTtcbiAgb3V0WzFdID0gYXkgKiBidyArIGF3ICogYnk7XG4gIG91dFsyXSA9IGF6ICogYncgKyBheCAqIGJ5O1xuICBvdXRbM10gPSBhdyAqIGJ3IC0gYXkgKiBieTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogUm90YXRlcyBhIHF1YXRlcm5pb24gYnkgdGhlIGdpdmVuIGFuZ2xlIGFib3V0IHRoZSBaIGF4aXNcbiAqXG4gKiBAcGFyYW0ge3F1YXR9IG91dCBxdWF0IHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdH0gYSBxdWF0IHRvIHJvdGF0ZVxuICogQHBhcmFtIHtudW1iZXJ9IHJhZCBhbmdsZSAoaW4gcmFkaWFucykgdG8gcm90YXRlXG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJvdGF0ZVoob3V0LCBhLCByYWQpIHtcbiAgcmFkICo9IDAuNTtcbiAgdmFyIGF4ID0gYVswXSxcbiAgICAgIGF5ID0gYVsxXSxcbiAgICAgIGF6ID0gYVsyXSxcbiAgICAgIGF3ID0gYVszXTtcbiAgdmFyIGJ6ID0gTWF0aC5zaW4ocmFkKSxcbiAgICAgIGJ3ID0gTWF0aC5jb3MocmFkKTtcbiAgb3V0WzBdID0gYXggKiBidyArIGF5ICogYno7XG4gIG91dFsxXSA9IGF5ICogYncgLSBheCAqIGJ6O1xuICBvdXRbMl0gPSBheiAqIGJ3ICsgYXcgKiBiejtcbiAgb3V0WzNdID0gYXcgKiBidyAtIGF6ICogYno7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIFcgY29tcG9uZW50IG9mIGEgcXVhdCBmcm9tIHRoZSBYLCBZLCBhbmQgWiBjb21wb25lbnRzLlxuICogQXNzdW1lcyB0aGF0IHF1YXRlcm5pb24gaXMgMSB1bml0IGluIGxlbmd0aC5cbiAqIEFueSBleGlzdGluZyBXIGNvbXBvbmVudCB3aWxsIGJlIGlnbm9yZWQuXG4gKlxuICogQHBhcmFtIHtxdWF0fSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdH0gYSBxdWF0IHRvIGNhbGN1bGF0ZSBXIGNvbXBvbmVudCBvZlxuICogQHJldHVybnMge3F1YXR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhdGVXKG91dCwgYSkge1xuICB2YXIgeCA9IGFbMF0sXG4gICAgICB5ID0gYVsxXSxcbiAgICAgIHogPSBhWzJdO1xuICBvdXRbMF0gPSB4O1xuICBvdXRbMV0gPSB5O1xuICBvdXRbMl0gPSB6O1xuICBvdXRbM10gPSBNYXRoLnNxcnQoTWF0aC5hYnMoMS4wIC0geCAqIHggLSB5ICogeSAtIHogKiB6KSk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENhbGN1bGF0ZSB0aGUgZXhwb25lbnRpYWwgb2YgYSB1bml0IHF1YXRlcm5pb24uXG4gKlxuICogQHBhcmFtIHtxdWF0fSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdH0gYSBxdWF0IHRvIGNhbGN1bGF0ZSB0aGUgZXhwb25lbnRpYWwgb2ZcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZXhwKG91dCwgYSkge1xuICB2YXIgeCA9IGFbMF0sXG4gICAgICB5ID0gYVsxXSxcbiAgICAgIHogPSBhWzJdLFxuICAgICAgdyA9IGFbM107XG4gIHZhciByID0gTWF0aC5zcXJ0KHggKiB4ICsgeSAqIHkgKyB6ICogeik7XG4gIHZhciBldCA9IE1hdGguZXhwKHcpO1xuICB2YXIgcyA9IHIgPiAwID8gZXQgKiBNYXRoLnNpbihyKSAvIHIgOiAwO1xuICBvdXRbMF0gPSB4ICogcztcbiAgb3V0WzFdID0geSAqIHM7XG4gIG91dFsyXSA9IHogKiBzO1xuICBvdXRbM10gPSBldCAqIE1hdGguY29zKHIpO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDYWxjdWxhdGUgdGhlIG5hdHVyYWwgbG9nYXJpdGhtIG9mIGEgdW5pdCBxdWF0ZXJuaW9uLlxuICpcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxuICogQHBhcmFtIHtSZWFkb25seVF1YXR9IGEgcXVhdCB0byBjYWxjdWxhdGUgdGhlIGV4cG9uZW50aWFsIG9mXG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGxuKG91dCwgYSkge1xuICB2YXIgeCA9IGFbMF0sXG4gICAgICB5ID0gYVsxXSxcbiAgICAgIHogPSBhWzJdLFxuICAgICAgdyA9IGFbM107XG4gIHZhciByID0gTWF0aC5zcXJ0KHggKiB4ICsgeSAqIHkgKyB6ICogeik7XG4gIHZhciB0ID0gciA+IDAgPyBNYXRoLmF0YW4yKHIsIHcpIC8gciA6IDA7XG4gIG91dFswXSA9IHggKiB0O1xuICBvdXRbMV0gPSB5ICogdDtcbiAgb3V0WzJdID0geiAqIHQ7XG4gIG91dFszXSA9IDAuNSAqIE1hdGgubG9nKHggKiB4ICsgeSAqIHkgKyB6ICogeiArIHcgKiB3KTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ2FsY3VsYXRlIHRoZSBzY2FsYXIgcG93ZXIgb2YgYSB1bml0IHF1YXRlcm5pb24uXG4gKlxuICogQHBhcmFtIHtxdWF0fSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdH0gYSBxdWF0IHRvIGNhbGN1bGF0ZSB0aGUgZXhwb25lbnRpYWwgb2ZcbiAqIEBwYXJhbSB7TnVtYmVyfSBiIGFtb3VudCB0byBzY2FsZSB0aGUgcXVhdGVybmlvbiBieVxuICogQHJldHVybnMge3F1YXR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBwb3cob3V0LCBhLCBiKSB7XG4gIGxuKG91dCwgYSk7XG4gIHNjYWxlKG91dCwgb3V0LCBiKTtcbiAgZXhwKG91dCwgb3V0KTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogUGVyZm9ybXMgYSBzcGhlcmljYWwgbGluZWFyIGludGVycG9sYXRpb24gYmV0d2VlbiB0d28gcXVhdFxuICpcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxuICogQHBhcmFtIHtSZWFkb25seVF1YXR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHBhcmFtIHtOdW1iZXJ9IHQgaW50ZXJwb2xhdGlvbiBhbW91bnQsIGluIHRoZSByYW5nZSBbMC0xXSwgYmV0d2VlbiB0aGUgdHdvIGlucHV0c1xuICogQHJldHVybnMge3F1YXR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzbGVycChvdXQsIGEsIGIsIHQpIHtcbiAgLy8gYmVuY2htYXJrczpcbiAgLy8gICAgaHR0cDovL2pzcGVyZi5jb20vcXVhdGVybmlvbi1zbGVycC1pbXBsZW1lbnRhdGlvbnNcbiAgdmFyIGF4ID0gYVswXSxcbiAgICAgIGF5ID0gYVsxXSxcbiAgICAgIGF6ID0gYVsyXSxcbiAgICAgIGF3ID0gYVszXTtcbiAgdmFyIGJ4ID0gYlswXSxcbiAgICAgIGJ5ID0gYlsxXSxcbiAgICAgIGJ6ID0gYlsyXSxcbiAgICAgIGJ3ID0gYlszXTtcbiAgdmFyIG9tZWdhLCBjb3NvbSwgc2lub20sIHNjYWxlMCwgc2NhbGUxOyAvLyBjYWxjIGNvc2luZVxuXG4gIGNvc29tID0gYXggKiBieCArIGF5ICogYnkgKyBheiAqIGJ6ICsgYXcgKiBidzsgLy8gYWRqdXN0IHNpZ25zIChpZiBuZWNlc3NhcnkpXG5cbiAgaWYgKGNvc29tIDwgMC4wKSB7XG4gICAgY29zb20gPSAtY29zb207XG4gICAgYnggPSAtYng7XG4gICAgYnkgPSAtYnk7XG4gICAgYnogPSAtYno7XG4gICAgYncgPSAtYnc7XG4gIH0gLy8gY2FsY3VsYXRlIGNvZWZmaWNpZW50c1xuXG5cbiAgaWYgKDEuMCAtIGNvc29tID4gZ2xNYXRyaXguRVBTSUxPTikge1xuICAgIC8vIHN0YW5kYXJkIGNhc2UgKHNsZXJwKVxuICAgIG9tZWdhID0gTWF0aC5hY29zKGNvc29tKTtcbiAgICBzaW5vbSA9IE1hdGguc2luKG9tZWdhKTtcbiAgICBzY2FsZTAgPSBNYXRoLnNpbigoMS4wIC0gdCkgKiBvbWVnYSkgLyBzaW5vbTtcbiAgICBzY2FsZTEgPSBNYXRoLnNpbih0ICogb21lZ2EpIC8gc2lub207XG4gIH0gZWxzZSB7XG4gICAgLy8gXCJmcm9tXCIgYW5kIFwidG9cIiBxdWF0ZXJuaW9ucyBhcmUgdmVyeSBjbG9zZVxuICAgIC8vICAuLi4gc28gd2UgY2FuIGRvIGEgbGluZWFyIGludGVycG9sYXRpb25cbiAgICBzY2FsZTAgPSAxLjAgLSB0O1xuICAgIHNjYWxlMSA9IHQ7XG4gIH0gLy8gY2FsY3VsYXRlIGZpbmFsIHZhbHVlc1xuXG5cbiAgb3V0WzBdID0gc2NhbGUwICogYXggKyBzY2FsZTEgKiBieDtcbiAgb3V0WzFdID0gc2NhbGUwICogYXkgKyBzY2FsZTEgKiBieTtcbiAgb3V0WzJdID0gc2NhbGUwICogYXogKyBzY2FsZTEgKiBiejtcbiAgb3V0WzNdID0gc2NhbGUwICogYXcgKyBzY2FsZTEgKiBidztcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogR2VuZXJhdGVzIGEgcmFuZG9tIHVuaXQgcXVhdGVybmlvblxuICpcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxuICogQHJldHVybnMge3F1YXR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByYW5kb20ob3V0KSB7XG4gIC8vIEltcGxlbWVudGF0aW9uIG9mIGh0dHA6Ly9wbGFubmluZy5jcy51aXVjLmVkdS9ub2RlMTk4Lmh0bWxcbiAgLy8gVE9ETzogQ2FsbGluZyByYW5kb20gMyB0aW1lcyBpcyBwcm9iYWJseSBub3QgdGhlIGZhc3Rlc3Qgc29sdXRpb25cbiAgdmFyIHUxID0gZ2xNYXRyaXguUkFORE9NKCk7XG4gIHZhciB1MiA9IGdsTWF0cml4LlJBTkRPTSgpO1xuICB2YXIgdTMgPSBnbE1hdHJpeC5SQU5ET00oKTtcbiAgdmFyIHNxcnQxTWludXNVMSA9IE1hdGguc3FydCgxIC0gdTEpO1xuICB2YXIgc3FydFUxID0gTWF0aC5zcXJ0KHUxKTtcbiAgb3V0WzBdID0gc3FydDFNaW51c1UxICogTWF0aC5zaW4oMi4wICogTWF0aC5QSSAqIHUyKTtcbiAgb3V0WzFdID0gc3FydDFNaW51c1UxICogTWF0aC5jb3MoMi4wICogTWF0aC5QSSAqIHUyKTtcbiAgb3V0WzJdID0gc3FydFUxICogTWF0aC5zaW4oMi4wICogTWF0aC5QSSAqIHUzKTtcbiAgb3V0WzNdID0gc3FydFUxICogTWF0aC5jb3MoMi4wICogTWF0aC5QSSAqIHUzKTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgaW52ZXJzZSBvZiBhIHF1YXRcbiAqXG4gKiBAcGFyYW0ge3F1YXR9IG91dCB0aGUgcmVjZWl2aW5nIHF1YXRlcm5pb25cbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBhIHF1YXQgdG8gY2FsY3VsYXRlIGludmVyc2Ugb2ZcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gaW52ZXJ0KG91dCwgYSkge1xuICB2YXIgYTAgPSBhWzBdLFxuICAgICAgYTEgPSBhWzFdLFxuICAgICAgYTIgPSBhWzJdLFxuICAgICAgYTMgPSBhWzNdO1xuICB2YXIgZG90ID0gYTAgKiBhMCArIGExICogYTEgKyBhMiAqIGEyICsgYTMgKiBhMztcbiAgdmFyIGludkRvdCA9IGRvdCA/IDEuMCAvIGRvdCA6IDA7IC8vIFRPRE86IFdvdWxkIGJlIGZhc3RlciB0byByZXR1cm4gWzAsMCwwLDBdIGltbWVkaWF0ZWx5IGlmIGRvdCA9PSAwXG5cbiAgb3V0WzBdID0gLWEwICogaW52RG90O1xuICBvdXRbMV0gPSAtYTEgKiBpbnZEb3Q7XG4gIG91dFsyXSA9IC1hMiAqIGludkRvdDtcbiAgb3V0WzNdID0gYTMgKiBpbnZEb3Q7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGNvbmp1Z2F0ZSBvZiBhIHF1YXRcbiAqIElmIHRoZSBxdWF0ZXJuaW9uIGlzIG5vcm1hbGl6ZWQsIHRoaXMgZnVuY3Rpb24gaXMgZmFzdGVyIHRoYW4gcXVhdC5pbnZlcnNlIGFuZCBwcm9kdWNlcyB0aGUgc2FtZSByZXN1bHQuXG4gKlxuICogQHBhcmFtIHtxdWF0fSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdH0gYSBxdWF0IHRvIGNhbGN1bGF0ZSBjb25qdWdhdGUgb2ZcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY29uanVnYXRlKG91dCwgYSkge1xuICBvdXRbMF0gPSAtYVswXTtcbiAgb3V0WzFdID0gLWFbMV07XG4gIG91dFsyXSA9IC1hWzJdO1xuICBvdXRbM10gPSBhWzNdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgcXVhdGVybmlvbiBmcm9tIHRoZSBnaXZlbiAzeDMgcm90YXRpb24gbWF0cml4LlxuICpcbiAqIE5PVEU6IFRoZSByZXN1bHRhbnQgcXVhdGVybmlvbiBpcyBub3Qgbm9ybWFsaXplZCwgc28geW91IHNob3VsZCBiZSBzdXJlXG4gKiB0byByZW5vcm1hbGl6ZSB0aGUgcXVhdGVybmlvbiB5b3Vyc2VsZiB3aGVyZSBuZWNlc3NhcnkuXG4gKlxuICogQHBhcmFtIHtxdWF0fSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0M30gbSByb3RhdGlvbiBtYXRyaXhcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tTWF0MyhvdXQsIG0pIHtcbiAgLy8gQWxnb3JpdGhtIGluIEtlbiBTaG9lbWFrZSdzIGFydGljbGUgaW4gMTk4NyBTSUdHUkFQSCBjb3Vyc2Ugbm90ZXNcbiAgLy8gYXJ0aWNsZSBcIlF1YXRlcm5pb24gQ2FsY3VsdXMgYW5kIEZhc3QgQW5pbWF0aW9uXCIuXG4gIHZhciBmVHJhY2UgPSBtWzBdICsgbVs0XSArIG1bOF07XG4gIHZhciBmUm9vdDtcblxuICBpZiAoZlRyYWNlID4gMC4wKSB7XG4gICAgLy8gfHd8ID4gMS8yLCBtYXkgYXMgd2VsbCBjaG9vc2UgdyA+IDEvMlxuICAgIGZSb290ID0gTWF0aC5zcXJ0KGZUcmFjZSArIDEuMCk7IC8vIDJ3XG5cbiAgICBvdXRbM10gPSAwLjUgKiBmUm9vdDtcbiAgICBmUm9vdCA9IDAuNSAvIGZSb290OyAvLyAxLyg0dylcblxuICAgIG91dFswXSA9IChtWzVdIC0gbVs3XSkgKiBmUm9vdDtcbiAgICBvdXRbMV0gPSAobVs2XSAtIG1bMl0pICogZlJvb3Q7XG4gICAgb3V0WzJdID0gKG1bMV0gLSBtWzNdKSAqIGZSb290O1xuICB9IGVsc2Uge1xuICAgIC8vIHx3fCA8PSAxLzJcbiAgICB2YXIgaSA9IDA7XG4gICAgaWYgKG1bNF0gPiBtWzBdKSBpID0gMTtcbiAgICBpZiAobVs4XSA+IG1baSAqIDMgKyBpXSkgaSA9IDI7XG4gICAgdmFyIGogPSAoaSArIDEpICUgMztcbiAgICB2YXIgayA9IChpICsgMikgJSAzO1xuICAgIGZSb290ID0gTWF0aC5zcXJ0KG1baSAqIDMgKyBpXSAtIG1baiAqIDMgKyBqXSAtIG1bayAqIDMgKyBrXSArIDEuMCk7XG4gICAgb3V0W2ldID0gMC41ICogZlJvb3Q7XG4gICAgZlJvb3QgPSAwLjUgLyBmUm9vdDtcbiAgICBvdXRbM10gPSAobVtqICogMyArIGtdIC0gbVtrICogMyArIGpdKSAqIGZSb290O1xuICAgIG91dFtqXSA9IChtW2ogKiAzICsgaV0gKyBtW2kgKiAzICsgal0pICogZlJvb3Q7XG4gICAgb3V0W2tdID0gKG1bayAqIDMgKyBpXSArIG1baSAqIDMgKyBrXSkgKiBmUm9vdDtcbiAgfVxuXG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBxdWF0ZXJuaW9uIGZyb20gdGhlIGdpdmVuIGV1bGVyIGFuZ2xlIHgsIHksIHouXG4gKlxuICogQHBhcmFtIHtxdWF0fSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXG4gKiBAcGFyYW0ge3h9IEFuZ2xlIHRvIHJvdGF0ZSBhcm91bmQgWCBheGlzIGluIGRlZ3JlZXMuXG4gKiBAcGFyYW0ge3l9IEFuZ2xlIHRvIHJvdGF0ZSBhcm91bmQgWSBheGlzIGluIGRlZ3JlZXMuXG4gKiBAcGFyYW0ge3p9IEFuZ2xlIHRvIHJvdGF0ZSBhcm91bmQgWiBheGlzIGluIGRlZ3JlZXMuXG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbUV1bGVyKG91dCwgeCwgeSwgeikge1xuICB2YXIgaGFsZlRvUmFkID0gMC41ICogTWF0aC5QSSAvIDE4MC4wO1xuICB4ICo9IGhhbGZUb1JhZDtcbiAgeSAqPSBoYWxmVG9SYWQ7XG4gIHogKj0gaGFsZlRvUmFkO1xuICB2YXIgc3ggPSBNYXRoLnNpbih4KTtcbiAgdmFyIGN4ID0gTWF0aC5jb3MoeCk7XG4gIHZhciBzeSA9IE1hdGguc2luKHkpO1xuICB2YXIgY3kgPSBNYXRoLmNvcyh5KTtcbiAgdmFyIHN6ID0gTWF0aC5zaW4oeik7XG4gIHZhciBjeiA9IE1hdGguY29zKHopO1xuICBvdXRbMF0gPSBzeCAqIGN5ICogY3ogLSBjeCAqIHN5ICogc3o7XG4gIG91dFsxXSA9IGN4ICogc3kgKiBjeiArIHN4ICogY3kgKiBzejtcbiAgb3V0WzJdID0gY3ggKiBjeSAqIHN6IC0gc3ggKiBzeSAqIGN6O1xuICBvdXRbM10gPSBjeCAqIGN5ICogY3ogKyBzeCAqIHN5ICogc3o7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBxdWF0ZW5pb25cbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdH0gYSB2ZWN0b3IgdG8gcmVwcmVzZW50IGFzIGEgc3RyaW5nXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHZlY3RvclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzdHIoYSkge1xuICByZXR1cm4gXCJxdWF0KFwiICsgYVswXSArIFwiLCBcIiArIGFbMV0gKyBcIiwgXCIgKyBhWzJdICsgXCIsIFwiICsgYVszXSArIFwiKVwiO1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IHF1YXQgaW5pdGlhbGl6ZWQgd2l0aCB2YWx1ZXMgZnJvbSBhbiBleGlzdGluZyBxdWF0ZXJuaW9uXG4gKlxuICogQHBhcmFtIHtSZWFkb25seVF1YXR9IGEgcXVhdGVybmlvbiB0byBjbG9uZVxuICogQHJldHVybnMge3F1YXR9IGEgbmV3IHF1YXRlcm5pb25cbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCB2YXIgY2xvbmUgPSB2ZWM0LmNsb25lO1xuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IHF1YXQgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgZ2l2ZW4gdmFsdWVzXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IHggWCBjb21wb25lbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB5IFkgY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0geiBaIGNvbXBvbmVudFxuICogQHBhcmFtIHtOdW1iZXJ9IHcgVyBjb21wb25lbnRcbiAqIEByZXR1cm5zIHtxdWF0fSBhIG5ldyBxdWF0ZXJuaW9uXG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgdmFyIGZyb21WYWx1ZXMgPSB2ZWM0LmZyb21WYWx1ZXM7XG4vKipcbiAqIENvcHkgdGhlIHZhbHVlcyBmcm9tIG9uZSBxdWF0IHRvIGFub3RoZXJcbiAqXG4gKiBAcGFyYW0ge3F1YXR9IG91dCB0aGUgcmVjZWl2aW5nIHF1YXRlcm5pb25cbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBhIHRoZSBzb3VyY2UgcXVhdGVybmlvblxuICogQHJldHVybnMge3F1YXR9IG91dFxuICogQGZ1bmN0aW9uXG4gKi9cblxuZXhwb3J0IHZhciBjb3B5ID0gdmVjNC5jb3B5O1xuLyoqXG4gKiBTZXQgdGhlIGNvbXBvbmVudHMgb2YgYSBxdWF0IHRvIHRoZSBnaXZlbiB2YWx1ZXNcbiAqXG4gKiBAcGFyYW0ge3F1YXR9IG91dCB0aGUgcmVjZWl2aW5nIHF1YXRlcm5pb25cbiAqIEBwYXJhbSB7TnVtYmVyfSB4IFggY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0geSBZIGNvbXBvbmVudFxuICogQHBhcmFtIHtOdW1iZXJ9IHogWiBjb21wb25lbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB3IFcgY29tcG9uZW50XG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgdmFyIHNldCA9IHZlYzQuc2V0O1xuLyoqXG4gKiBBZGRzIHR3byBxdWF0J3NcbiAqXG4gKiBAcGFyYW0ge3F1YXR9IG91dCB0aGUgcmVjZWl2aW5nIHF1YXRlcm5pb25cbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCB2YXIgYWRkID0gdmVjNC5hZGQ7XG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgcXVhdC5tdWx0aXBseX1cbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCB2YXIgbXVsID0gbXVsdGlwbHk7XG4vKipcbiAqIFNjYWxlcyBhIHF1YXQgYnkgYSBzY2FsYXIgbnVtYmVyXG4gKlxuICogQHBhcmFtIHtxdWF0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBhIHRoZSB2ZWN0b3IgdG8gc2NhbGVcbiAqIEBwYXJhbSB7TnVtYmVyfSBiIGFtb3VudCB0byBzY2FsZSB0aGUgdmVjdG9yIGJ5XG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgdmFyIHNjYWxlID0gdmVjNC5zY2FsZTtcbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgZG90IHByb2R1Y3Qgb2YgdHdvIHF1YXQnc1xuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGRvdCBwcm9kdWN0IG9mIGEgYW5kIGJcbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCB2YXIgZG90ID0gdmVjNC5kb3Q7XG4vKipcbiAqIFBlcmZvcm1zIGEgbGluZWFyIGludGVycG9sYXRpb24gYmV0d2VlbiB0d28gcXVhdCdzXG4gKlxuICogQHBhcmFtIHtxdWF0fSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVF1YXR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcGFyYW0ge051bWJlcn0gdCBpbnRlcnBvbGF0aW9uIGFtb3VudCwgaW4gdGhlIHJhbmdlIFswLTFdLCBiZXR3ZWVuIHRoZSB0d28gaW5wdXRzXG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgdmFyIGxlcnAgPSB2ZWM0LmxlcnA7XG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGxlbmd0aCBvZiBhIHF1YXRcbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdH0gYSB2ZWN0b3IgdG8gY2FsY3VsYXRlIGxlbmd0aCBvZlxuICogQHJldHVybnMge051bWJlcn0gbGVuZ3RoIG9mIGFcbiAqL1xuXG5leHBvcnQgdmFyIGxlbmd0aCA9IHZlYzQubGVuZ3RoO1xuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHF1YXQubGVuZ3RofVxuICogQGZ1bmN0aW9uXG4gKi9cblxuZXhwb3J0IHZhciBsZW4gPSBsZW5ndGg7XG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIHNxdWFyZWQgbGVuZ3RoIG9mIGEgcXVhdFxuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBhIHZlY3RvciB0byBjYWxjdWxhdGUgc3F1YXJlZCBsZW5ndGggb2ZcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IHNxdWFyZWQgbGVuZ3RoIG9mIGFcbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCB2YXIgc3F1YXJlZExlbmd0aCA9IHZlYzQuc3F1YXJlZExlbmd0aDtcbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayBxdWF0LnNxdWFyZWRMZW5ndGh9XG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgdmFyIHNxckxlbiA9IHNxdWFyZWRMZW5ndGg7XG4vKipcbiAqIE5vcm1hbGl6ZSBhIHF1YXRcbiAqXG4gKiBAcGFyYW0ge3F1YXR9IG91dCB0aGUgcmVjZWl2aW5nIHF1YXRlcm5pb25cbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBhIHF1YXRlcm5pb24gdG8gbm9ybWFsaXplXG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgdmFyIG5vcm1hbGl6ZSA9IHZlYzQubm9ybWFsaXplO1xuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBxdWF0ZXJuaW9ucyBoYXZlIGV4YWN0bHkgdGhlIHNhbWUgZWxlbWVudHMgaW4gdGhlIHNhbWUgcG9zaXRpb24gKHdoZW4gY29tcGFyZWQgd2l0aCA9PT0pXG4gKlxuICogQHBhcmFtIHtSZWFkb25seVF1YXR9IGEgVGhlIGZpcnN0IHF1YXRlcm5pb24uXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdH0gYiBUaGUgc2Vjb25kIHF1YXRlcm5pb24uXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmVjdG9ycyBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuXG5leHBvcnQgdmFyIGV4YWN0RXF1YWxzID0gdmVjNC5leGFjdEVxdWFscztcbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgcXVhdGVybmlvbnMgaGF2ZSBhcHByb3hpbWF0ZWx5IHRoZSBzYW1lIGVsZW1lbnRzIGluIHRoZSBzYW1lIHBvc2l0aW9uLlxuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBhIFRoZSBmaXJzdCB2ZWN0b3IuXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdH0gYiBUaGUgc2Vjb25kIHZlY3Rvci5cbiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSB2ZWN0b3JzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5cbmV4cG9ydCB2YXIgZXF1YWxzID0gdmVjNC5lcXVhbHM7XG4vKipcbiAqIFNldHMgYSBxdWF0ZXJuaW9uIHRvIHJlcHJlc2VudCB0aGUgc2hvcnRlc3Qgcm90YXRpb24gZnJvbSBvbmVcbiAqIHZlY3RvciB0byBhbm90aGVyLlxuICpcbiAqIEJvdGggdmVjdG9ycyBhcmUgYXNzdW1lZCB0byBiZSB1bml0IGxlbmd0aC5cbiAqXG4gKiBAcGFyYW0ge3F1YXR9IG91dCB0aGUgcmVjZWl2aW5nIHF1YXRlcm5pb24uXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB0aGUgaW5pdGlhbCB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBiIHRoZSBkZXN0aW5hdGlvbiB2ZWN0b3JcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcbiAqL1xuXG5leHBvcnQgdmFyIHJvdGF0aW9uVG8gPSBmdW5jdGlvbiAoKSB7XG4gIHZhciB0bXB2ZWMzID0gdmVjMy5jcmVhdGUoKTtcbiAgdmFyIHhVbml0VmVjMyA9IHZlYzMuZnJvbVZhbHVlcygxLCAwLCAwKTtcbiAgdmFyIHlVbml0VmVjMyA9IHZlYzMuZnJvbVZhbHVlcygwLCAxLCAwKTtcbiAgcmV0dXJuIGZ1bmN0aW9uIChvdXQsIGEsIGIpIHtcbiAgICB2YXIgZG90ID0gdmVjMy5kb3QoYSwgYik7XG5cbiAgICBpZiAoZG90IDwgLTAuOTk5OTk5KSB7XG4gICAgICB2ZWMzLmNyb3NzKHRtcHZlYzMsIHhVbml0VmVjMywgYSk7XG4gICAgICBpZiAodmVjMy5sZW4odG1wdmVjMykgPCAwLjAwMDAwMSkgdmVjMy5jcm9zcyh0bXB2ZWMzLCB5VW5pdFZlYzMsIGEpO1xuICAgICAgdmVjMy5ub3JtYWxpemUodG1wdmVjMywgdG1wdmVjMyk7XG4gICAgICBzZXRBeGlzQW5nbGUob3V0LCB0bXB2ZWMzLCBNYXRoLlBJKTtcbiAgICAgIHJldHVybiBvdXQ7XG4gICAgfSBlbHNlIGlmIChkb3QgPiAwLjk5OTk5OSkge1xuICAgICAgb3V0WzBdID0gMDtcbiAgICAgIG91dFsxXSA9IDA7XG4gICAgICBvdXRbMl0gPSAwO1xuICAgICAgb3V0WzNdID0gMTtcbiAgICAgIHJldHVybiBvdXQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZlYzMuY3Jvc3ModG1wdmVjMywgYSwgYik7XG4gICAgICBvdXRbMF0gPSB0bXB2ZWMzWzBdO1xuICAgICAgb3V0WzFdID0gdG1wdmVjM1sxXTtcbiAgICAgIG91dFsyXSA9IHRtcHZlYzNbMl07XG4gICAgICBvdXRbM10gPSAxICsgZG90O1xuICAgICAgcmV0dXJuIG5vcm1hbGl6ZShvdXQsIG91dCk7XG4gICAgfVxuICB9O1xufSgpO1xuLyoqXG4gKiBQZXJmb3JtcyBhIHNwaGVyaWNhbCBsaW5lYXIgaW50ZXJwb2xhdGlvbiB3aXRoIHR3byBjb250cm9sIHBvaW50c1xuICpcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxuICogQHBhcmFtIHtSZWFkb25seVF1YXR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVF1YXR9IGMgdGhlIHRoaXJkIG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBkIHRoZSBmb3VydGggb3BlcmFuZFxuICogQHBhcmFtIHtOdW1iZXJ9IHQgaW50ZXJwb2xhdGlvbiBhbW91bnQsIGluIHRoZSByYW5nZSBbMC0xXSwgYmV0d2VlbiB0aGUgdHdvIGlucHV0c1xuICogQHJldHVybnMge3F1YXR9IG91dFxuICovXG5cbmV4cG9ydCB2YXIgc3FsZXJwID0gZnVuY3Rpb24gKCkge1xuICB2YXIgdGVtcDEgPSBjcmVhdGUoKTtcbiAgdmFyIHRlbXAyID0gY3JlYXRlKCk7XG4gIHJldHVybiBmdW5jdGlvbiAob3V0LCBhLCBiLCBjLCBkLCB0KSB7XG4gICAgc2xlcnAodGVtcDEsIGEsIGQsIHQpO1xuICAgIHNsZXJwKHRlbXAyLCBiLCBjLCB0KTtcbiAgICBzbGVycChvdXQsIHRlbXAxLCB0ZW1wMiwgMiAqIHQgKiAoMSAtIHQpKTtcbiAgICByZXR1cm4gb3V0O1xuICB9O1xufSgpO1xuLyoqXG4gKiBTZXRzIHRoZSBzcGVjaWZpZWQgcXVhdGVybmlvbiB3aXRoIHZhbHVlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlblxuICogYXhlcy4gRWFjaCBheGlzIGlzIGEgdmVjMyBhbmQgaXMgZXhwZWN0ZWQgdG8gYmUgdW5pdCBsZW5ndGggYW5kXG4gKiBwZXJwZW5kaWN1bGFyIHRvIGFsbCBvdGhlciBzcGVjaWZpZWQgYXhlcy5cbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gdmlldyAgdGhlIHZlY3RvciByZXByZXNlbnRpbmcgdGhlIHZpZXdpbmcgZGlyZWN0aW9uXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gcmlnaHQgdGhlIHZlY3RvciByZXByZXNlbnRpbmcgdGhlIGxvY2FsIFwicmlnaHRcIiBkaXJlY3Rpb25cbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSB1cCAgICB0aGUgdmVjdG9yIHJlcHJlc2VudGluZyB0aGUgbG9jYWwgXCJ1cFwiIGRpcmVjdGlvblxuICogQHJldHVybnMge3F1YXR9IG91dFxuICovXG5cbmV4cG9ydCB2YXIgc2V0QXhlcyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIG1hdHIgPSBtYXQzLmNyZWF0ZSgpO1xuICByZXR1cm4gZnVuY3Rpb24gKG91dCwgdmlldywgcmlnaHQsIHVwKSB7XG4gICAgbWF0clswXSA9IHJpZ2h0WzBdO1xuICAgIG1hdHJbM10gPSByaWdodFsxXTtcbiAgICBtYXRyWzZdID0gcmlnaHRbMl07XG4gICAgbWF0clsxXSA9IHVwWzBdO1xuICAgIG1hdHJbNF0gPSB1cFsxXTtcbiAgICBtYXRyWzddID0gdXBbMl07XG4gICAgbWF0clsyXSA9IC12aWV3WzBdO1xuICAgIG1hdHJbNV0gPSAtdmlld1sxXTtcbiAgICBtYXRyWzhdID0gLXZpZXdbMl07XG4gICAgcmV0dXJuIG5vcm1hbGl6ZShvdXQsIGZyb21NYXQzKG91dCwgbWF0cikpO1xuICB9O1xufSgpOyIsImltcG9ydCAqIGFzIGdsTWF0cml4IGZyb20gXCIuL2NvbW1vbi5qc1wiO1xuaW1wb3J0ICogYXMgbWF0MiBmcm9tIFwiLi9tYXQyLmpzXCI7XG5pbXBvcnQgKiBhcyBtYXQyZCBmcm9tIFwiLi9tYXQyZC5qc1wiO1xuaW1wb3J0ICogYXMgbWF0MyBmcm9tIFwiLi9tYXQzLmpzXCI7XG5pbXBvcnQgKiBhcyBtYXQ0IGZyb20gXCIuL21hdDQuanNcIjtcbmltcG9ydCAqIGFzIHF1YXQgZnJvbSBcIi4vcXVhdC5qc1wiO1xuaW1wb3J0ICogYXMgcXVhdDIgZnJvbSBcIi4vcXVhdDIuanNcIjtcbmltcG9ydCAqIGFzIHZlYzIgZnJvbSBcIi4vdmVjMi5qc1wiO1xuaW1wb3J0ICogYXMgdmVjMyBmcm9tIFwiLi92ZWMzLmpzXCI7XG5pbXBvcnQgKiBhcyB2ZWM0IGZyb20gXCIuL3ZlYzQuanNcIjtcbmV4cG9ydCB7IGdsTWF0cml4LCBtYXQyLCBtYXQyZCwgbWF0MywgbWF0NCwgcXVhdCwgcXVhdDIsIHZlYzIsIHZlYzMsIHZlYzQgfTsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///2\n')},function(module,__webpack_exports__,__webpack_require__){"use strict";eval('/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AST_TOKEN_TYPES", function() { return AST_TOKEN_TYPES; });\n/* unused harmony export AST_NODE_TYPES */\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "STORAGE_CLASS", function() { return STORAGE_CLASS; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Target", function() { return Target; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DefineValuePlaceholder", function() { return DefineValuePlaceholder; });\n/* harmony import */ var reflect_metadata__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(239);\n/* harmony import */ var reflect_metadata__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(reflect_metadata__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _ComponentManager__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(25);\n/* harmony import */ var _components_framegraph_System__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(135);\n/* harmony import */ var _components_geometry_GeometryComponent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(137);\n/* harmony import */ var _components_geometry_System__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(122);\n/* harmony import */ var _components_material_MaterialComponent__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(123);\n/* harmony import */ var _components_material_System__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(124);\n/* harmony import */ var _components_mesh_CullableComponent__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(125);\n/* harmony import */ var _components_mesh_MeshComponent__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(126);\n/* harmony import */ var _components_mesh_System__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(127);\n/* harmony import */ var _components_renderer_passes_PixelPickingPass__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(70);\n/* harmony import */ var _components_renderer_System__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(129);\n/* harmony import */ var _components_scenegraph_HierarchyComponent__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(130);\n/* harmony import */ var _components_scenegraph_System__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(131);\n/* harmony import */ var _components_scenegraph_TransformComponent__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(132);\n/* harmony import */ var _Entity__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(121);\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "createEntity", function() { return _Entity__WEBPACK_IMPORTED_MODULE_15__["b"]; });\n\n/* harmony import */ var _identifier__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(13);\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "IDENTIFIER", function() { return _identifier__WEBPACK_IMPORTED_MODULE_16__["a"]; });\n\n/* harmony import */ var _inversify_config__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(92);\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "createWorldContainer", function() { return _inversify_config__WEBPACK_IMPORTED_MODULE_17__["a"]; });\n\n/* harmony import */ var _utils_aabb__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(248);\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "generateAABBFromVertices", function() { return _utils_aabb__WEBPACK_IMPORTED_MODULE_18__["a"]; });\n\n/* harmony import */ var _utils_isSafari__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(249);\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isSafari", function() { return _utils_isSafari__WEBPACK_IMPORTED_MODULE_19__["a"]; });\n\n/* harmony import */ var _services__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(278);\n/* harmony import */ var _shape__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(279);\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "AABB", function() { return _shape__WEBPACK_IMPORTED_MODULE_21__["a"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Frustum", function() { return _shape__WEBPACK_IMPORTED_MODULE_21__["b"]; });\n\n/* harmony import */ var _components_renderer__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(117);\n/* harmony reexport (checked) */ if(__webpack_require__.o(_components_renderer__WEBPACK_IMPORTED_MODULE_22__, "gl")) __webpack_require__.d(__webpack_exports__, "gl", function() { return _components_renderer__WEBPACK_IMPORTED_MODULE_22__["gl"]; });\n\n/* harmony import */ var _components_material_interface__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(261);\n/* harmony import */ var _components_material_interface__WEBPACK_IMPORTED_MODULE_23___default = /*#__PURE__*/__webpack_require__.n(_components_material_interface__WEBPACK_IMPORTED_MODULE_23__);\n/* harmony reexport (checked) */ if(__webpack_require__.o(_components_material_interface__WEBPACK_IMPORTED_MODULE_23__, "gl")) __webpack_require__.d(__webpack_exports__, "gl", function() { return _components_material_interface__WEBPACK_IMPORTED_MODULE_23__["gl"]; });\n\n/* harmony import */ var _components_mesh_interface__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(262);\n/* harmony import */ var _components_mesh_interface__WEBPACK_IMPORTED_MODULE_24___default = /*#__PURE__*/__webpack_require__.n(_components_mesh_interface__WEBPACK_IMPORTED_MODULE_24__);\n/* harmony reexport (checked) */ if(__webpack_require__.o(_components_mesh_interface__WEBPACK_IMPORTED_MODULE_24__, "gl")) __webpack_require__.d(__webpack_exports__, "gl", function() { return _components_mesh_interface__WEBPACK_IMPORTED_MODULE_24__["gl"]; });\n\n/* harmony reexport (checked) */ if(__webpack_require__.o(_components_renderer__WEBPACK_IMPORTED_MODULE_22__, "gl")) __webpack_require__.d(__webpack_exports__, "gl", function() { return _components_renderer__WEBPACK_IMPORTED_MODULE_22__["gl"]; });\n\n// tslint:disable-next-line:no-reference\n/// \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/**\n * inspired by Entitas\' Systems\n * @see https://github.com/sschmid/Entitas-CSharp/wiki/Systems\n */\n\nvar AST_TOKEN_TYPES;\n\n(function (AST_TOKEN_TYPES) {\n AST_TOKEN_TYPES["Void"] = "Void";\n AST_TOKEN_TYPES["Boolean"] = "Boolean";\n AST_TOKEN_TYPES["Float"] = "Float";\n AST_TOKEN_TYPES["Uint32"] = "Uint32";\n AST_TOKEN_TYPES["Int32"] = "Int32";\n AST_TOKEN_TYPES["Vector"] = "Vector";\n AST_TOKEN_TYPES["Vector2Float"] = "vec2";\n AST_TOKEN_TYPES["Vector3Float"] = "vec3";\n AST_TOKEN_TYPES["Vector4Float"] = "vec4";\n AST_TOKEN_TYPES["Vector2Boolean"] = "vec2";\n AST_TOKEN_TYPES["Vector3Boolean"] = "vec3";\n AST_TOKEN_TYPES["Vector4Boolean"] = "vec4";\n AST_TOKEN_TYPES["Vector2Uint"] = "vec2";\n AST_TOKEN_TYPES["Vector3Uint"] = "vec3";\n AST_TOKEN_TYPES["Vector4Uint"] = "vec4";\n AST_TOKEN_TYPES["Vector2Int"] = "vec2";\n AST_TOKEN_TYPES["Vector3Int"] = "vec3";\n AST_TOKEN_TYPES["Vector4Int"] = "vec4";\n AST_TOKEN_TYPES["Matrix"] = "Matrix";\n AST_TOKEN_TYPES["Matrix3x3Float"] = "mat3x3";\n AST_TOKEN_TYPES["Matrix4x4Float"] = "mat4x4";\n AST_TOKEN_TYPES["Struct"] = "Struct";\n AST_TOKEN_TYPES["FloatArray"] = "Float[]";\n AST_TOKEN_TYPES["Vector4FloatArray"] = "vec4[]";\n})(AST_TOKEN_TYPES || (AST_TOKEN_TYPES = {}));\n\nvar AST_NODE_TYPES;\n\n(function (AST_NODE_TYPES) {\n AST_NODE_TYPES["Program"] = "Program";\n AST_NODE_TYPES["Identifier"] = "Identifier";\n AST_NODE_TYPES["VariableDeclaration"] = "VariableDeclaration";\n AST_NODE_TYPES["BlockStatement"] = "BlockStatement";\n AST_NODE_TYPES["ReturnStatement"] = "ReturnStatement";\n AST_NODE_TYPES["FunctionDeclaration"] = "FunctionDeclaration";\n AST_NODE_TYPES["VariableDeclarator"] = "VariableDeclarator";\n AST_NODE_TYPES["AssignmentExpression"] = "AssignmentExpression";\n AST_NODE_TYPES["LogicalExpression"] = "LogicalExpression";\n AST_NODE_TYPES["BinaryExpression"] = "BinaryExpression";\n AST_NODE_TYPES["ArrayExpression"] = "ArrayExpression";\n AST_NODE_TYPES["UnaryExpression"] = "UnaryExpression";\n AST_NODE_TYPES["UpdateExpression"] = "UpdateExpression";\n AST_NODE_TYPES["FunctionExpression"] = "FunctionExpression";\n AST_NODE_TYPES["MemberExpression"] = "MemberExpression";\n AST_NODE_TYPES["ConditionalExpression"] = "ConditionalExpression";\n AST_NODE_TYPES["ExpressionStatement"] = "ExpressionStatement";\n AST_NODE_TYPES["CallExpression"] = "CallExpression";\n AST_NODE_TYPES["NumThreadStatement"] = "NumThreadStatement";\n AST_NODE_TYPES["StorageStatement"] = "StorageStatement";\n AST_NODE_TYPES["DoWhileStatement"] = "DoWhileStatement";\n AST_NODE_TYPES["WhileStatement"] = "WhileStatement";\n AST_NODE_TYPES["ForStatement"] = "ForStatement";\n AST_NODE_TYPES["BreakStatement"] = "BreakStatement";\n AST_NODE_TYPES["ContinueStatement"] = "ContinueStatement";\n AST_NODE_TYPES["IfStatement"] = "IfStatement";\n AST_NODE_TYPES["ImportedFunctionStatement"] = "ImportedFunctionStatement";\n})(AST_NODE_TYPES || (AST_NODE_TYPES = {}));\n\nvar STORAGE_CLASS;\n\n(function (STORAGE_CLASS) {\n STORAGE_CLASS["Input"] = "Input";\n STORAGE_CLASS["Output"] = "Output";\n STORAGE_CLASS["Uniform"] = "Uniform";\n STORAGE_CLASS["Workgroup"] = "Workgroup";\n STORAGE_CLASS["UniformConstant"] = "UniformConstant";\n STORAGE_CLASS["Image"] = "Image";\n STORAGE_CLASS["StorageBuffer"] = "StorageBuffer";\n STORAGE_CLASS["Private"] = "Private";\n STORAGE_CLASS["Function"] = "Function";\n})(STORAGE_CLASS || (STORAGE_CLASS = {}));\n\n/**\n * 根据目标平台生成 Shader 代码\n * * WebGL GLSL 1.0\n * * WebGPU Chrome/Edge GLSL 4.5 & WGSL @see https://gpuweb.github.io/gpuweb/wgsl.html\n * * Safari WHLSL (maybe deprecated)\n */\nvar Target;\n\n(function (Target) {\n Target["GLSL100"] = "GLSL100";\n Target["GLSL450"] = "GLSL450";\n Target["WGSL"] = "WGSL";\n})(Target || (Target = {}));\n\nvar DefineValuePlaceholder = \'__DefineValuePlaceholder__\';\n\n\n\n\n\n\n\n\n//# sourceMappingURL=index.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy13ZWJncHUtY29yZS9lcy9pbmRleC5qcz8xYTNkIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUMwQjtBQUN1QztBQUNDO0FBQ1U7QUFDZDtBQUNjO0FBQ2Q7QUFDVTtBQUNSO0FBQ1Y7QUFDMkI7QUFDbkI7QUFDa0I7QUFDZDtBQUNjO0FBQ3hDO0FBQ0U7QUFDd0Q7QUFDMUM7QUFDWjtBQUM1QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsMENBQTBDOztBQUUzQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsd0NBQXdDOztBQUV6Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsc0NBQXNDOztBQUV2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsd0JBQXdCOztBQUV6QjtBQUNtQztBQUNSO0FBQ0g7QUFDYztBQUNVO0FBQ0o7QUFDTjtBQUVpUTtBQUN2UyIsImZpbGUiOiIzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLXJlZmVyZW5jZVxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9Ad2ViZ3B1L3R5cGVzL2Rpc3QvaW5kZXguZC50c1wiIC8+XG5pbXBvcnQgJ3JlZmxlY3QtbWV0YWRhdGEnO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBDb21wb25lbnRNYW5hZ2VyIH0gZnJvbSAnLi9Db21wb25lbnRNYW5hZ2VyJztcbmltcG9ydCB7IEZyYW1lR3JhcGhTeXN0ZW0gfSBmcm9tICcuL2NvbXBvbmVudHMvZnJhbWVncmFwaC9TeXN0ZW0nO1xuaW1wb3J0IHsgR2VvbWV0cnlDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvZ2VvbWV0cnkvR2VvbWV0cnlDb21wb25lbnQnO1xuaW1wb3J0IHsgR2VvbWV0cnlTeXN0ZW0gfSBmcm9tICcuL2NvbXBvbmVudHMvZ2VvbWV0cnkvU3lzdGVtJztcbmltcG9ydCB7IE1hdGVyaWFsQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL21hdGVyaWFsL01hdGVyaWFsQ29tcG9uZW50JztcbmltcG9ydCB7IE1hdGVyaWFsU3lzdGVtIH0gZnJvbSAnLi9jb21wb25lbnRzL21hdGVyaWFsL1N5c3RlbSc7XG5pbXBvcnQgeyBDdWxsYWJsZUNvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9tZXNoL0N1bGxhYmxlQ29tcG9uZW50JztcbmltcG9ydCB7IE1lc2hDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvbWVzaC9NZXNoQ29tcG9uZW50JztcbmltcG9ydCB7IE1lc2hTeXN0ZW0gfSBmcm9tICcuL2NvbXBvbmVudHMvbWVzaC9TeXN0ZW0nO1xuaW1wb3J0IHsgUGl4ZWxQaWNraW5nUGFzcyB9IGZyb20gJy4vY29tcG9uZW50cy9yZW5kZXJlci9wYXNzZXMvUGl4ZWxQaWNraW5nUGFzcyc7XG5pbXBvcnQgeyBSZW5kZXJlclN5c3RlbSB9IGZyb20gJy4vY29tcG9uZW50cy9yZW5kZXJlci9TeXN0ZW0nO1xuaW1wb3J0IHsgSGllcmFyY2h5Q29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL3NjZW5lZ3JhcGgvSGllcmFyY2h5Q29tcG9uZW50JztcbmltcG9ydCB7IFNjZW5lR3JhcGhTeXN0ZW0gfSBmcm9tICcuL2NvbXBvbmVudHMvc2NlbmVncmFwaC9TeXN0ZW0nO1xuaW1wb3J0IHsgVHJhbnNmb3JtQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL3NjZW5lZ3JhcGgvVHJhbnNmb3JtQ29tcG9uZW50JztcbmltcG9ydCB7IGNyZWF0ZUVudGl0eSB9IGZyb20gJy4vRW50aXR5JztcbmltcG9ydCB7IElERU5USUZJRVIgfSBmcm9tICcuL2lkZW50aWZpZXInO1xuaW1wb3J0IHsgY29udGFpbmVyLCBjcmVhdGVXb3JsZENvbnRhaW5lciwgbGF6eUluamVjdCwgbGF6eU11bHRpSW5qZWN0IH0gZnJvbSAnLi9pbnZlcnNpZnkuY29uZmlnJztcbmltcG9ydCB7IGdlbmVyYXRlQUFCQkZyb21WZXJ0aWNlcyB9IGZyb20gJy4vdXRpbHMvYWFiYic7XG5pbXBvcnQgeyBpc1NhZmFyaSB9IGZyb20gJy4vdXRpbHMvaXNTYWZhcmknO1xuLyoqXG4gKiBpbnNwaXJlZCBieSBFbnRpdGFzJyBTeXN0ZW1zXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9zc2NobWlkL0VudGl0YXMtQ1NoYXJwL3dpa2kvU3lzdGVtc1xuICovXG5cbnZhciBBU1RfVE9LRU5fVFlQRVM7XG5cbihmdW5jdGlvbiAoQVNUX1RPS0VOX1RZUEVTKSB7XG4gIEFTVF9UT0tFTl9UWVBFU1tcIlZvaWRcIl0gPSBcIlZvaWRcIjtcbiAgQVNUX1RPS0VOX1RZUEVTW1wiQm9vbGVhblwiXSA9IFwiQm9vbGVhblwiO1xuICBBU1RfVE9LRU5fVFlQRVNbXCJGbG9hdFwiXSA9IFwiRmxvYXRcIjtcbiAgQVNUX1RPS0VOX1RZUEVTW1wiVWludDMyXCJdID0gXCJVaW50MzJcIjtcbiAgQVNUX1RPS0VOX1RZUEVTW1wiSW50MzJcIl0gPSBcIkludDMyXCI7XG4gIEFTVF9UT0tFTl9UWVBFU1tcIlZlY3RvclwiXSA9IFwiVmVjdG9yXCI7XG4gIEFTVF9UT0tFTl9UWVBFU1tcIlZlY3RvcjJGbG9hdFwiXSA9IFwidmVjMjxmMzI+XCI7XG4gIEFTVF9UT0tFTl9UWVBFU1tcIlZlY3RvcjNGbG9hdFwiXSA9IFwidmVjMzxmMzI+XCI7XG4gIEFTVF9UT0tFTl9UWVBFU1tcIlZlY3RvcjRGbG9hdFwiXSA9IFwidmVjNDxmMzI+XCI7XG4gIEFTVF9UT0tFTl9UWVBFU1tcIlZlY3RvcjJCb29sZWFuXCJdID0gXCJ2ZWMyPGJvb2w+XCI7XG4gIEFTVF9UT0tFTl9UWVBFU1tcIlZlY3RvcjNCb29sZWFuXCJdID0gXCJ2ZWMzPGJvb2w+XCI7XG4gIEFTVF9UT0tFTl9UWVBFU1tcIlZlY3RvcjRCb29sZWFuXCJdID0gXCJ2ZWM0PGJvb2w+XCI7XG4gIEFTVF9UT0tFTl9UWVBFU1tcIlZlY3RvcjJVaW50XCJdID0gXCJ2ZWMyPHUzMj5cIjtcbiAgQVNUX1RPS0VOX1RZUEVTW1wiVmVjdG9yM1VpbnRcIl0gPSBcInZlYzM8dTMyPlwiO1xuICBBU1RfVE9LRU5fVFlQRVNbXCJWZWN0b3I0VWludFwiXSA9IFwidmVjNDx1MzI+XCI7XG4gIEFTVF9UT0tFTl9UWVBFU1tcIlZlY3RvcjJJbnRcIl0gPSBcInZlYzI8aTMyPlwiO1xuICBBU1RfVE9LRU5fVFlQRVNbXCJWZWN0b3IzSW50XCJdID0gXCJ2ZWMzPGkzMj5cIjtcbiAgQVNUX1RPS0VOX1RZUEVTW1wiVmVjdG9yNEludFwiXSA9IFwidmVjNDxpMzI+XCI7XG4gIEFTVF9UT0tFTl9UWVBFU1tcIk1hdHJpeFwiXSA9IFwiTWF0cml4XCI7XG4gIEFTVF9UT0tFTl9UWVBFU1tcIk1hdHJpeDN4M0Zsb2F0XCJdID0gXCJtYXQzeDM8ZjMyPlwiO1xuICBBU1RfVE9LRU5fVFlQRVNbXCJNYXRyaXg0eDRGbG9hdFwiXSA9IFwibWF0NHg0PGkzMj5cIjtcbiAgQVNUX1RPS0VOX1RZUEVTW1wiU3RydWN0XCJdID0gXCJTdHJ1Y3RcIjtcbiAgQVNUX1RPS0VOX1RZUEVTW1wiRmxvYXRBcnJheVwiXSA9IFwiRmxvYXRbXVwiO1xuICBBU1RfVE9LRU5fVFlQRVNbXCJWZWN0b3I0RmxvYXRBcnJheVwiXSA9IFwidmVjNDxmMzI+W11cIjtcbn0pKEFTVF9UT0tFTl9UWVBFUyB8fCAoQVNUX1RPS0VOX1RZUEVTID0ge30pKTtcblxudmFyIEFTVF9OT0RFX1RZUEVTO1xuXG4oZnVuY3Rpb24gKEFTVF9OT0RFX1RZUEVTKSB7XG4gIEFTVF9OT0RFX1RZUEVTW1wiUHJvZ3JhbVwiXSA9IFwiUHJvZ3JhbVwiO1xuICBBU1RfTk9ERV9UWVBFU1tcIklkZW50aWZpZXJcIl0gPSBcIklkZW50aWZpZXJcIjtcbiAgQVNUX05PREVfVFlQRVNbXCJWYXJpYWJsZURlY2xhcmF0aW9uXCJdID0gXCJWYXJpYWJsZURlY2xhcmF0aW9uXCI7XG4gIEFTVF9OT0RFX1RZUEVTW1wiQmxvY2tTdGF0ZW1lbnRcIl0gPSBcIkJsb2NrU3RhdGVtZW50XCI7XG4gIEFTVF9OT0RFX1RZUEVTW1wiUmV0dXJuU3RhdGVtZW50XCJdID0gXCJSZXR1cm5TdGF0ZW1lbnRcIjtcbiAgQVNUX05PREVfVFlQRVNbXCJGdW5jdGlvbkRlY2xhcmF0aW9uXCJdID0gXCJGdW5jdGlvbkRlY2xhcmF0aW9uXCI7XG4gIEFTVF9OT0RFX1RZUEVTW1wiVmFyaWFibGVEZWNsYXJhdG9yXCJdID0gXCJWYXJpYWJsZURlY2xhcmF0b3JcIjtcbiAgQVNUX05PREVfVFlQRVNbXCJBc3NpZ25tZW50RXhwcmVzc2lvblwiXSA9IFwiQXNzaWdubWVudEV4cHJlc3Npb25cIjtcbiAgQVNUX05PREVfVFlQRVNbXCJMb2dpY2FsRXhwcmVzc2lvblwiXSA9IFwiTG9naWNhbEV4cHJlc3Npb25cIjtcbiAgQVNUX05PREVfVFlQRVNbXCJCaW5hcnlFeHByZXNzaW9uXCJdID0gXCJCaW5hcnlFeHByZXNzaW9uXCI7XG4gIEFTVF9OT0RFX1RZUEVTW1wiQXJyYXlFeHByZXNzaW9uXCJdID0gXCJBcnJheUV4cHJlc3Npb25cIjtcbiAgQVNUX05PREVfVFlQRVNbXCJVbmFyeUV4cHJlc3Npb25cIl0gPSBcIlVuYXJ5RXhwcmVzc2lvblwiO1xuICBBU1RfTk9ERV9UWVBFU1tcIlVwZGF0ZUV4cHJlc3Npb25cIl0gPSBcIlVwZGF0ZUV4cHJlc3Npb25cIjtcbiAgQVNUX05PREVfVFlQRVNbXCJGdW5jdGlvbkV4cHJlc3Npb25cIl0gPSBcIkZ1bmN0aW9uRXhwcmVzc2lvblwiO1xuICBBU1RfTk9ERV9UWVBFU1tcIk1lbWJlckV4cHJlc3Npb25cIl0gPSBcIk1lbWJlckV4cHJlc3Npb25cIjtcbiAgQVNUX05PREVfVFlQRVNbXCJDb25kaXRpb25hbEV4cHJlc3Npb25cIl0gPSBcIkNvbmRpdGlvbmFsRXhwcmVzc2lvblwiO1xuICBBU1RfTk9ERV9UWVBFU1tcIkV4cHJlc3Npb25TdGF0ZW1lbnRcIl0gPSBcIkV4cHJlc3Npb25TdGF0ZW1lbnRcIjtcbiAgQVNUX05PREVfVFlQRVNbXCJDYWxsRXhwcmVzc2lvblwiXSA9IFwiQ2FsbEV4cHJlc3Npb25cIjtcbiAgQVNUX05PREVfVFlQRVNbXCJOdW1UaHJlYWRTdGF0ZW1lbnRcIl0gPSBcIk51bVRocmVhZFN0YXRlbWVudFwiO1xuICBBU1RfTk9ERV9UWVBFU1tcIlN0b3JhZ2VTdGF0ZW1lbnRcIl0gPSBcIlN0b3JhZ2VTdGF0ZW1lbnRcIjtcbiAgQVNUX05PREVfVFlQRVNbXCJEb1doaWxlU3RhdGVtZW50XCJdID0gXCJEb1doaWxlU3RhdGVtZW50XCI7XG4gIEFTVF9OT0RFX1RZUEVTW1wiV2hpbGVTdGF0ZW1lbnRcIl0gPSBcIldoaWxlU3RhdGVtZW50XCI7XG4gIEFTVF9OT0RFX1RZUEVTW1wiRm9yU3RhdGVtZW50XCJdID0gXCJGb3JTdGF0ZW1lbnRcIjtcbiAgQVNUX05PREVfVFlQRVNbXCJCcmVha1N0YXRlbWVudFwiXSA9IFwiQnJlYWtTdGF0ZW1lbnRcIjtcbiAgQVNUX05PREVfVFlQRVNbXCJDb250aW51ZVN0YXRlbWVudFwiXSA9IFwiQ29udGludWVTdGF0ZW1lbnRcIjtcbiAgQVNUX05PREVfVFlQRVNbXCJJZlN0YXRlbWVudFwiXSA9IFwiSWZTdGF0ZW1lbnRcIjtcbiAgQVNUX05PREVfVFlQRVNbXCJJbXBvcnRlZEZ1bmN0aW9uU3RhdGVtZW50XCJdID0gXCJJbXBvcnRlZEZ1bmN0aW9uU3RhdGVtZW50XCI7XG59KShBU1RfTk9ERV9UWVBFUyB8fCAoQVNUX05PREVfVFlQRVMgPSB7fSkpO1xuXG52YXIgU1RPUkFHRV9DTEFTUztcblxuKGZ1bmN0aW9uIChTVE9SQUdFX0NMQVNTKSB7XG4gIFNUT1JBR0VfQ0xBU1NbXCJJbnB1dFwiXSA9IFwiSW5wdXRcIjtcbiAgU1RPUkFHRV9DTEFTU1tcIk91dHB1dFwiXSA9IFwiT3V0cHV0XCI7XG4gIFNUT1JBR0VfQ0xBU1NbXCJVbmlmb3JtXCJdID0gXCJVbmlmb3JtXCI7XG4gIFNUT1JBR0VfQ0xBU1NbXCJXb3JrZ3JvdXBcIl0gPSBcIldvcmtncm91cFwiO1xuICBTVE9SQUdFX0NMQVNTW1wiVW5pZm9ybUNvbnN0YW50XCJdID0gXCJVbmlmb3JtQ29uc3RhbnRcIjtcbiAgU1RPUkFHRV9DTEFTU1tcIkltYWdlXCJdID0gXCJJbWFnZVwiO1xuICBTVE9SQUdFX0NMQVNTW1wiU3RvcmFnZUJ1ZmZlclwiXSA9IFwiU3RvcmFnZUJ1ZmZlclwiO1xuICBTVE9SQUdFX0NMQVNTW1wiUHJpdmF0ZVwiXSA9IFwiUHJpdmF0ZVwiO1xuICBTVE9SQUdFX0NMQVNTW1wiRnVuY3Rpb25cIl0gPSBcIkZ1bmN0aW9uXCI7XG59KShTVE9SQUdFX0NMQVNTIHx8IChTVE9SQUdFX0NMQVNTID0ge30pKTtcblxuLyoqXG4gKiDmoLnmja7nm67moIflubPlj7DnlJ/miJAgU2hhZGVyIOS7o+eggVxuICogKiBXZWJHTCBHTFNMIDEuMFxuICogKiBXZWJHUFUgQ2hyb21lL0VkZ2UgR0xTTCA0LjUgJiBXR1NMIEBzZWUgaHR0cHM6Ly9ncHV3ZWIuZ2l0aHViLmlvL2dwdXdlYi93Z3NsLmh0bWxcbiAqICogU2FmYXJpIFdITFNMIChtYXliZSBkZXByZWNhdGVkKVxuICovXG52YXIgVGFyZ2V0O1xuXG4oZnVuY3Rpb24gKFRhcmdldCkge1xuICBUYXJnZXRbXCJHTFNMMTAwXCJdID0gXCJHTFNMMTAwXCI7XG4gIFRhcmdldFtcIkdMU0w0NTBcIl0gPSBcIkdMU0w0NTBcIjtcbiAgVGFyZ2V0W1wiV0dTTFwiXSA9IFwiV0dTTFwiO1xufSkoVGFyZ2V0IHx8IChUYXJnZXQgPSB7fSkpO1xuXG52YXIgRGVmaW5lVmFsdWVQbGFjZWhvbGRlciA9ICdfX0RlZmluZVZhbHVlUGxhY2Vob2xkZXJfXyc7XG5leHBvcnQgKiBmcm9tICcuL0NvbXBvbmVudE1hbmFnZXInO1xuZXhwb3J0ICogZnJvbSAnLi9zZXJ2aWNlcyc7XG5leHBvcnQgKiBmcm9tICcuL3NoYXBlJztcbmV4cG9ydCAqIGZyb20gJy4vY29tcG9uZW50cy9yZW5kZXJlcic7XG5leHBvcnQgKiBmcm9tICcuL2NvbXBvbmVudHMvbWF0ZXJpYWwvaW50ZXJmYWNlJztcbmV4cG9ydCAqIGZyb20gJy4vY29tcG9uZW50cy9tZXNoL2ludGVyZmFjZSc7XG5leHBvcnQgKiBmcm9tICcuL2NvbXBvbmVudHMvcmVuZGVyZXInO1xuZXhwb3J0IHsgY29udGFpbmVyLCBjcmVhdGVXb3JsZENvbnRhaW5lciwgbGF6eUluamVjdCwgbGF6eU11bHRpSW5qZWN0LCBjcmVhdGVFbnRpdHksIENvbXBvbmVudCwgQ29tcG9uZW50TWFuYWdlciwgSURFTlRJRklFUiwgRnJhbWVHcmFwaFN5c3RlbSwgR2VvbWV0cnlTeXN0ZW0sIFJlbmRlcmVyU3lzdGVtIC8vIEludGVyYWN0aW9uU3lzdGVtLFxuLCBNYXRlcmlhbFN5c3RlbSwgTWVzaFN5c3RlbSwgU2NlbmVHcmFwaFN5c3RlbSwgQ3VsbGFibGVDb21wb25lbnQsIE1lc2hDb21wb25lbnQsIFRyYW5zZm9ybUNvbXBvbmVudCwgTWF0ZXJpYWxDb21wb25lbnQsIEdlb21ldHJ5Q29tcG9uZW50LCBIaWVyYXJjaHlDb21wb25lbnQsIGlzU2FmYXJpLCBnZW5lcmF0ZUFBQkJGcm9tVmVydGljZXMsIFBpeGVsUGlja2luZ1Bhc3MsIEFTVF9UT0tFTl9UWVBFUywgQVNUX05PREVfVFlQRVMsIFNUT1JBR0VfQ0xBU1MsIFRhcmdldCwgRGVmaW5lVmFsdWVQbGFjZWhvbGRlciB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///3\n')},function(module,exports){eval('function _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n}\n\nmodule.exports = _defineProperty;\nmodule.exports["default"] = module.exports, module.exports.__esModule = true;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eS5qcz85NTIzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSIsImZpbGUiOiI0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkge1xuICBpZiAoa2V5IGluIG9iaikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwge1xuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgb2JqW2tleV0gPSB2YWx1ZTtcbiAgfVxuXG4gIHJldHVybiBvYmo7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2RlZmluZVByb3BlcnR5O1xubW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHMsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///4\n')},function(module,exports,__webpack_require__){"use strict";eval('\nObject.defineProperty(exports, "__esModule", { value: true });\nexports.multiBindToService = exports.getServiceIdentifierAsString = exports.typeConstraint = exports.namedConstraint = exports.taggedConstraint = exports.traverseAncerstors = exports.decorate = exports.id = exports.MetadataReader = exports.postConstruct = exports.targetName = exports.multiInject = exports.unmanaged = exports.optional = exports.LazyServiceIdentifer = exports.inject = exports.named = exports.tagged = exports.injectable = exports.ContainerModule = exports.AsyncContainerModule = exports.TargetTypeEnum = exports.BindingTypeEnum = exports.BindingScopeEnum = exports.Container = exports.METADATA_KEY = void 0;\nvar keys = __webpack_require__(32);\nexports.METADATA_KEY = keys;\nvar container_1 = __webpack_require__(502);\nObject.defineProperty(exports, "Container", { enumerable: true, get: function () { return container_1.Container; } });\nvar literal_types_1 = __webpack_require__(56);\nObject.defineProperty(exports, "BindingScopeEnum", { enumerable: true, get: function () { return literal_types_1.BindingScopeEnum; } });\nObject.defineProperty(exports, "BindingTypeEnum", { enumerable: true, get: function () { return literal_types_1.BindingTypeEnum; } });\nObject.defineProperty(exports, "TargetTypeEnum", { enumerable: true, get: function () { return literal_types_1.TargetTypeEnum; } });\nvar container_module_1 = __webpack_require__(518);\nObject.defineProperty(exports, "AsyncContainerModule", { enumerable: true, get: function () { return container_module_1.AsyncContainerModule; } });\nObject.defineProperty(exports, "ContainerModule", { enumerable: true, get: function () { return container_module_1.ContainerModule; } });\nvar injectable_1 = __webpack_require__(519);\nObject.defineProperty(exports, "injectable", { enumerable: true, get: function () { return injectable_1.injectable; } });\nvar tagged_1 = __webpack_require__(520);\nObject.defineProperty(exports, "tagged", { enumerable: true, get: function () { return tagged_1.tagged; } });\nvar named_1 = __webpack_require__(521);\nObject.defineProperty(exports, "named", { enumerable: true, get: function () { return named_1.named; } });\nvar inject_1 = __webpack_require__(244);\nObject.defineProperty(exports, "inject", { enumerable: true, get: function () { return inject_1.inject; } });\nObject.defineProperty(exports, "LazyServiceIdentifer", { enumerable: true, get: function () { return inject_1.LazyServiceIdentifer; } });\nvar optional_1 = __webpack_require__(522);\nObject.defineProperty(exports, "optional", { enumerable: true, get: function () { return optional_1.optional; } });\nvar unmanaged_1 = __webpack_require__(523);\nObject.defineProperty(exports, "unmanaged", { enumerable: true, get: function () { return unmanaged_1.unmanaged; } });\nvar multi_inject_1 = __webpack_require__(524);\nObject.defineProperty(exports, "multiInject", { enumerable: true, get: function () { return multi_inject_1.multiInject; } });\nvar target_name_1 = __webpack_require__(525);\nObject.defineProperty(exports, "targetName", { enumerable: true, get: function () { return target_name_1.targetName; } });\nvar post_construct_1 = __webpack_require__(526);\nObject.defineProperty(exports, "postConstruct", { enumerable: true, get: function () { return post_construct_1.postConstruct; } });\nvar metadata_reader_1 = __webpack_require__(242);\nObject.defineProperty(exports, "MetadataReader", { enumerable: true, get: function () { return metadata_reader_1.MetadataReader; } });\nvar id_1 = __webpack_require__(68);\nObject.defineProperty(exports, "id", { enumerable: true, get: function () { return id_1.id; } });\nvar decorator_utils_1 = __webpack_require__(60);\nObject.defineProperty(exports, "decorate", { enumerable: true, get: function () { return decorator_utils_1.decorate; } });\nvar constraint_helpers_1 = __webpack_require__(247);\nObject.defineProperty(exports, "traverseAncerstors", { enumerable: true, get: function () { return constraint_helpers_1.traverseAncerstors; } });\nObject.defineProperty(exports, "taggedConstraint", { enumerable: true, get: function () { return constraint_helpers_1.taggedConstraint; } });\nObject.defineProperty(exports, "namedConstraint", { enumerable: true, get: function () { return constraint_helpers_1.namedConstraint; } });\nObject.defineProperty(exports, "typeConstraint", { enumerable: true, get: function () { return constraint_helpers_1.typeConstraint; } });\nvar serialization_1 = __webpack_require__(91);\nObject.defineProperty(exports, "getServiceIdentifierAsString", { enumerable: true, get: function () { return serialization_1.getServiceIdentifierAsString; } });\nvar binding_utils_1 = __webpack_require__(527);\nObject.defineProperty(exports, "multiBindToService", { enumerable: true, get: function () { return binding_utils_1.multiBindToService; } });\n//# sourceMappingURL=inversify.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaW52ZXJzaWZ5L2xpYi9pbnZlcnNpZnkuanM/ZTFjNiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBYTtBQUNiLDhDQUE4QyxjQUFjO0FBQzVEO0FBQ0EsV0FBVyxtQkFBTyxDQUFDLEVBQTJCO0FBQzlDO0FBQ0Esa0JBQWtCLG1CQUFPLENBQUMsR0FBdUI7QUFDakQsNkNBQTZDLHFDQUFxQyw4QkFBOEIsRUFBRSxFQUFFO0FBQ3BILHNCQUFzQixtQkFBTyxDQUFDLEVBQTJCO0FBQ3pELG9EQUFvRCxxQ0FBcUMseUNBQXlDLEVBQUUsRUFBRTtBQUN0SSxtREFBbUQscUNBQXFDLHdDQUF3QyxFQUFFLEVBQUU7QUFDcEksa0RBQWtELHFDQUFxQyx1Q0FBdUMsRUFBRSxFQUFFO0FBQ2xJLHlCQUF5QixtQkFBTyxDQUFDLEdBQThCO0FBQy9ELHdEQUF3RCxxQ0FBcUMsZ0RBQWdELEVBQUUsRUFBRTtBQUNqSixtREFBbUQscUNBQXFDLDJDQUEyQyxFQUFFLEVBQUU7QUFDdkksbUJBQW1CLG1CQUFPLENBQUMsR0FBeUI7QUFDcEQsOENBQThDLHFDQUFxQyxnQ0FBZ0MsRUFBRSxFQUFFO0FBQ3ZILGVBQWUsbUJBQU8sQ0FBQyxHQUFxQjtBQUM1QywwQ0FBMEMscUNBQXFDLHdCQUF3QixFQUFFLEVBQUU7QUFDM0csY0FBYyxtQkFBTyxDQUFDLEdBQW9CO0FBQzFDLHlDQUF5QyxxQ0FBcUMsc0JBQXNCLEVBQUUsRUFBRTtBQUN4RyxlQUFlLG1CQUFPLENBQUMsR0FBcUI7QUFDNUMsMENBQTBDLHFDQUFxQyx3QkFBd0IsRUFBRSxFQUFFO0FBQzNHLHdEQUF3RCxxQ0FBcUMsc0NBQXNDLEVBQUUsRUFBRTtBQUN2SSxpQkFBaUIsbUJBQU8sQ0FBQyxHQUF1QjtBQUNoRCw0Q0FBNEMscUNBQXFDLDRCQUE0QixFQUFFLEVBQUU7QUFDakgsa0JBQWtCLG1CQUFPLENBQUMsR0FBd0I7QUFDbEQsNkNBQTZDLHFDQUFxQyw4QkFBOEIsRUFBRSxFQUFFO0FBQ3BILHFCQUFxQixtQkFBTyxDQUFDLEdBQTJCO0FBQ3hELCtDQUErQyxxQ0FBcUMsbUNBQW1DLEVBQUUsRUFBRTtBQUMzSCxvQkFBb0IsbUJBQU8sQ0FBQyxHQUEwQjtBQUN0RCw4Q0FBOEMscUNBQXFDLGlDQUFpQyxFQUFFLEVBQUU7QUFDeEgsdUJBQXVCLG1CQUFPLENBQUMsR0FBNkI7QUFDNUQsaURBQWlELHFDQUFxQyx1Q0FBdUMsRUFBRSxFQUFFO0FBQ2pJLHdCQUF3QixtQkFBTyxDQUFDLEdBQTRCO0FBQzVELGtEQUFrRCxxQ0FBcUMseUNBQXlDLEVBQUUsRUFBRTtBQUNwSSxXQUFXLG1CQUFPLENBQUMsRUFBWTtBQUMvQixzQ0FBc0MscUNBQXFDLGdCQUFnQixFQUFFLEVBQUU7QUFDL0Ysd0JBQXdCLG1CQUFPLENBQUMsRUFBOEI7QUFDOUQsNENBQTRDLHFDQUFxQyxtQ0FBbUMsRUFBRSxFQUFFO0FBQ3hILDJCQUEyQixtQkFBTyxDQUFDLEdBQTZCO0FBQ2hFLHNEQUFzRCxxQ0FBcUMsZ0RBQWdELEVBQUUsRUFBRTtBQUMvSSxvREFBb0QscUNBQXFDLDhDQUE4QyxFQUFFLEVBQUU7QUFDM0ksbURBQW1ELHFDQUFxQyw2Q0FBNkMsRUFBRSxFQUFFO0FBQ3pJLGtEQUFrRCxxQ0FBcUMsNENBQTRDLEVBQUUsRUFBRTtBQUN2SSxzQkFBc0IsbUJBQU8sQ0FBQyxFQUF1QjtBQUNyRCxnRUFBZ0UscUNBQXFDLHFEQUFxRCxFQUFFLEVBQUU7QUFDOUosc0JBQXNCLG1CQUFPLENBQUMsR0FBdUI7QUFDckQsc0RBQXNELHFDQUFxQywyQ0FBMkMsRUFBRSxFQUFFO0FBQzFJIiwiZmlsZSI6IjUuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMubXVsdGlCaW5kVG9TZXJ2aWNlID0gZXhwb3J0cy5nZXRTZXJ2aWNlSWRlbnRpZmllckFzU3RyaW5nID0gZXhwb3J0cy50eXBlQ29uc3RyYWludCA9IGV4cG9ydHMubmFtZWRDb25zdHJhaW50ID0gZXhwb3J0cy50YWdnZWRDb25zdHJhaW50ID0gZXhwb3J0cy50cmF2ZXJzZUFuY2Vyc3RvcnMgPSBleHBvcnRzLmRlY29yYXRlID0gZXhwb3J0cy5pZCA9IGV4cG9ydHMuTWV0YWRhdGFSZWFkZXIgPSBleHBvcnRzLnBvc3RDb25zdHJ1Y3QgPSBleHBvcnRzLnRhcmdldE5hbWUgPSBleHBvcnRzLm11bHRpSW5qZWN0ID0gZXhwb3J0cy51bm1hbmFnZWQgPSBleHBvcnRzLm9wdGlvbmFsID0gZXhwb3J0cy5MYXp5U2VydmljZUlkZW50aWZlciA9IGV4cG9ydHMuaW5qZWN0ID0gZXhwb3J0cy5uYW1lZCA9IGV4cG9ydHMudGFnZ2VkID0gZXhwb3J0cy5pbmplY3RhYmxlID0gZXhwb3J0cy5Db250YWluZXJNb2R1bGUgPSBleHBvcnRzLkFzeW5jQ29udGFpbmVyTW9kdWxlID0gZXhwb3J0cy5UYXJnZXRUeXBlRW51bSA9IGV4cG9ydHMuQmluZGluZ1R5cGVFbnVtID0gZXhwb3J0cy5CaW5kaW5nU2NvcGVFbnVtID0gZXhwb3J0cy5Db250YWluZXIgPSBleHBvcnRzLk1FVEFEQVRBX0tFWSA9IHZvaWQgMDtcbnZhciBrZXlzID0gcmVxdWlyZShcIi4vY29uc3RhbnRzL21ldGFkYXRhX2tleXNcIik7XG5leHBvcnRzLk1FVEFEQVRBX0tFWSA9IGtleXM7XG52YXIgY29udGFpbmVyXzEgPSByZXF1aXJlKFwiLi9jb250YWluZXIvY29udGFpbmVyXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQ29udGFpbmVyXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb250YWluZXJfMS5Db250YWluZXI7IH0gfSk7XG52YXIgbGl0ZXJhbF90eXBlc18xID0gcmVxdWlyZShcIi4vY29uc3RhbnRzL2xpdGVyYWxfdHlwZXNcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJCaW5kaW5nU2NvcGVFbnVtXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBsaXRlcmFsX3R5cGVzXzEuQmluZGluZ1Njb3BlRW51bTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkJpbmRpbmdUeXBlRW51bVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbGl0ZXJhbF90eXBlc18xLkJpbmRpbmdUeXBlRW51bTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlRhcmdldFR5cGVFbnVtXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBsaXRlcmFsX3R5cGVzXzEuVGFyZ2V0VHlwZUVudW07IH0gfSk7XG52YXIgY29udGFpbmVyX21vZHVsZV8xID0gcmVxdWlyZShcIi4vY29udGFpbmVyL2NvbnRhaW5lcl9tb2R1bGVcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJBc3luY0NvbnRhaW5lck1vZHVsZVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gY29udGFpbmVyX21vZHVsZV8xLkFzeW5jQ29udGFpbmVyTW9kdWxlOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQ29udGFpbmVyTW9kdWxlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb250YWluZXJfbW9kdWxlXzEuQ29udGFpbmVyTW9kdWxlOyB9IH0pO1xudmFyIGluamVjdGFibGVfMSA9IHJlcXVpcmUoXCIuL2Fubm90YXRpb24vaW5qZWN0YWJsZVwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImluamVjdGFibGVcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGluamVjdGFibGVfMS5pbmplY3RhYmxlOyB9IH0pO1xudmFyIHRhZ2dlZF8xID0gcmVxdWlyZShcIi4vYW5ub3RhdGlvbi90YWdnZWRcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJ0YWdnZWRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRhZ2dlZF8xLnRhZ2dlZDsgfSB9KTtcbnZhciBuYW1lZF8xID0gcmVxdWlyZShcIi4vYW5ub3RhdGlvbi9uYW1lZFwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIm5hbWVkXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBuYW1lZF8xLm5hbWVkOyB9IH0pO1xudmFyIGluamVjdF8xID0gcmVxdWlyZShcIi4vYW5ub3RhdGlvbi9pbmplY3RcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJpbmplY3RcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGluamVjdF8xLmluamVjdDsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkxhenlTZXJ2aWNlSWRlbnRpZmVyXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBpbmplY3RfMS5MYXp5U2VydmljZUlkZW50aWZlcjsgfSB9KTtcbnZhciBvcHRpb25hbF8xID0gcmVxdWlyZShcIi4vYW5ub3RhdGlvbi9vcHRpb25hbFwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIm9wdGlvbmFsXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBvcHRpb25hbF8xLm9wdGlvbmFsOyB9IH0pO1xudmFyIHVubWFuYWdlZF8xID0gcmVxdWlyZShcIi4vYW5ub3RhdGlvbi91bm1hbmFnZWRcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJ1bm1hbmFnZWRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHVubWFuYWdlZF8xLnVubWFuYWdlZDsgfSB9KTtcbnZhciBtdWx0aV9pbmplY3RfMSA9IHJlcXVpcmUoXCIuL2Fubm90YXRpb24vbXVsdGlfaW5qZWN0XCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwibXVsdGlJbmplY3RcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG11bHRpX2luamVjdF8xLm11bHRpSW5qZWN0OyB9IH0pO1xudmFyIHRhcmdldF9uYW1lXzEgPSByZXF1aXJlKFwiLi9hbm5vdGF0aW9uL3RhcmdldF9uYW1lXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwidGFyZ2V0TmFtZVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGFyZ2V0X25hbWVfMS50YXJnZXROYW1lOyB9IH0pO1xudmFyIHBvc3RfY29uc3RydWN0XzEgPSByZXF1aXJlKFwiLi9hbm5vdGF0aW9uL3Bvc3RfY29uc3RydWN0XCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwicG9zdENvbnN0cnVjdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gcG9zdF9jb25zdHJ1Y3RfMS5wb3N0Q29uc3RydWN0OyB9IH0pO1xudmFyIG1ldGFkYXRhX3JlYWRlcl8xID0gcmVxdWlyZShcIi4vcGxhbm5pbmcvbWV0YWRhdGFfcmVhZGVyXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTWV0YWRhdGFSZWFkZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1ldGFkYXRhX3JlYWRlcl8xLk1ldGFkYXRhUmVhZGVyOyB9IH0pO1xudmFyIGlkXzEgPSByZXF1aXJlKFwiLi91dGlscy9pZFwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImlkXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBpZF8xLmlkOyB9IH0pO1xudmFyIGRlY29yYXRvcl91dGlsc18xID0gcmVxdWlyZShcIi4vYW5ub3RhdGlvbi9kZWNvcmF0b3JfdXRpbHNcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJkZWNvcmF0ZVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gZGVjb3JhdG9yX3V0aWxzXzEuZGVjb3JhdGU7IH0gfSk7XG52YXIgY29uc3RyYWludF9oZWxwZXJzXzEgPSByZXF1aXJlKFwiLi9zeW50YXgvY29uc3RyYWludF9oZWxwZXJzXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwidHJhdmVyc2VBbmNlcnN0b3JzXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25zdHJhaW50X2hlbHBlcnNfMS50cmF2ZXJzZUFuY2Vyc3RvcnM7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJ0YWdnZWRDb25zdHJhaW50XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25zdHJhaW50X2hlbHBlcnNfMS50YWdnZWRDb25zdHJhaW50OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwibmFtZWRDb25zdHJhaW50XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25zdHJhaW50X2hlbHBlcnNfMS5uYW1lZENvbnN0cmFpbnQ7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJ0eXBlQ29uc3RyYWludFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gY29uc3RyYWludF9oZWxwZXJzXzEudHlwZUNvbnN0cmFpbnQ7IH0gfSk7XG52YXIgc2VyaWFsaXphdGlvbl8xID0gcmVxdWlyZShcIi4vdXRpbHMvc2VyaWFsaXphdGlvblwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImdldFNlcnZpY2VJZGVudGlmaWVyQXNTdHJpbmdcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHNlcmlhbGl6YXRpb25fMS5nZXRTZXJ2aWNlSWRlbnRpZmllckFzU3RyaW5nOyB9IH0pO1xudmFyIGJpbmRpbmdfdXRpbHNfMSA9IHJlcXVpcmUoXCIuL3V0aWxzL2JpbmRpbmdfdXRpbHNcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJtdWx0aUJpbmRUb1NlcnZpY2VcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGJpbmRpbmdfdXRpbHNfMS5tdWx0aUJpbmRUb1NlcnZpY2U7IH0gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbnZlcnNpZnkuanMubWFwIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///5\n')},function(module,exports){eval('function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError("Cannot call a class as a function");\n }\n}\n\nmodule.exports = _classCallCheck;\nmodule.exports["default"] = module.exports, module.exports.__esModule = true;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjay5qcz85NzBiIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSIsImZpbGUiOiI2LmpzIiwic291cmNlc0NvbnRlbnQiOlsiZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3Rvcikge1xuICBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfY2xhc3NDYWxsQ2hlY2s7XG5tb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0cywgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///6\n')},function(module,exports){eval('function _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if ("value" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\n\nmodule.exports = _createClass;\nmodule.exports["default"] = module.exports, module.exports.__esModule = true;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzcy5qcz81YmMzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0EsaUJBQWlCLGtCQUFrQjtBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EiLCJmaWxlIjoiNy5qcyIsInNvdXJjZXNDb250ZW50IjpbImZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07XG4gICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlO1xuICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTtcbiAgICBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7XG4gIGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpO1xuICBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7XG4gIHJldHVybiBDb25zdHJ1Y3Rvcjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfY3JlYXRlQ2xhc3M7XG5tb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0cywgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///7\n')},function(module,exports,__webpack_require__){"use strict";eval('\n// https://github.com/gpuweb/gpuweb/blob/01b20b4ad93fabae1e8e0d7752515f69708d33e0/spec/index.bs\nObject.defineProperty(exports, "__esModule", { value: true });\n// tslint:disable:variable-name\n// String enums\nvar ExtensionName;\n(function (ExtensionName) {\n ExtensionName["TextureCompressionBC"] = "texture-compression-bc";\n})(ExtensionName = exports.ExtensionName || (exports.ExtensionName = {}));\nvar AddressMode;\n(function (AddressMode) {\n AddressMode["ClampToEdge"] = "clamp-to-edge";\n AddressMode["Repeat"] = "repeat";\n AddressMode["MirrorRepeat"] = "mirror-repeat";\n})(AddressMode = exports.AddressMode || (exports.AddressMode = {}));\nvar BindingType;\n(function (BindingType) {\n BindingType["UniformBuffer"] = "uniform-buffer";\n BindingType["StorageBuffer"] = "storage-buffer";\n BindingType["ReadonlyStorageBuffer"] = "readonly-storage-buffer";\n BindingType["Sampler"] = "sampler";\n BindingType["ComparisonSampler"] = "comparison-sampler";\n BindingType["SampledTexture"] = "sampled-texture";\n BindingType["ReadonlyStorageTexture"] = "readonly-storage-texture";\n BindingType["WriteonlyStorageTexture"] = "writeonly-storage-texture";\n})(BindingType = exports.BindingType || (exports.BindingType = {}));\nvar BlendFactor;\n(function (BlendFactor) {\n BlendFactor["Zero"] = "zero";\n BlendFactor["One"] = "one";\n BlendFactor["SrcColor"] = "src-color";\n BlendFactor["OneMinusSrcColor"] = "one-minus-src-color";\n BlendFactor["SrcAlpha"] = "src-alpha";\n BlendFactor["OneMinusSrcAlpha"] = "one-minus-src-alpha";\n BlendFactor["DstColor"] = "dst-color";\n BlendFactor["OneMinusDstColor"] = "one-minus-dst-color";\n BlendFactor["DstAlpha"] = "dst-alpha";\n BlendFactor["OneMinusDstAlpha"] = "one-minus-dst-alpha";\n BlendFactor["SrcAlphaSaturated"] = "src-alpha-saturated";\n BlendFactor["BlendColor"] = "blend-color";\n BlendFactor["OneMinusBlendColor"] = "one-minus-blend-color";\n})(BlendFactor = exports.BlendFactor || (exports.BlendFactor = {}));\nvar BlendOperation;\n(function (BlendOperation) {\n BlendOperation["Add"] = "add";\n BlendOperation["Subtract"] = "subtract";\n BlendOperation["ReverseSubtract"] = "reverse-subtract";\n BlendOperation["Min"] = "min";\n BlendOperation["Max"] = "max";\n})(BlendOperation = exports.BlendOperation || (exports.BlendOperation = {}));\nvar CompareFunction;\n(function (CompareFunction) {\n CompareFunction["Never"] = "never";\n CompareFunction["Less"] = "less";\n CompareFunction["Equal"] = "equal";\n CompareFunction["LessEqual"] = "less-equal";\n CompareFunction["Greater"] = "greater";\n CompareFunction["NotEqual"] = "not-equal";\n CompareFunction["GreaterEqual"] = "greater-equal";\n CompareFunction["Always"] = "always";\n})(CompareFunction = exports.CompareFunction || (exports.CompareFunction = {}));\nvar CullMode;\n(function (CullMode) {\n CullMode["None"] = "none";\n CullMode["Front"] = "front";\n CullMode["Back"] = "back";\n})(CullMode = exports.CullMode || (exports.CullMode = {}));\nvar FilterMode;\n(function (FilterMode) {\n FilterMode["Nearest"] = "nearest";\n FilterMode["Linear"] = "linear";\n})(FilterMode = exports.FilterMode || (exports.FilterMode = {}));\nvar FrontFace;\n(function (FrontFace) {\n FrontFace["CCW"] = "ccw";\n FrontFace["CW"] = "cw";\n})(FrontFace = exports.FrontFace || (exports.FrontFace = {}));\nvar IndexFormat;\n(function (IndexFormat) {\n IndexFormat["Uint16"] = "uint16";\n IndexFormat["Uint32"] = "uint32";\n})(IndexFormat = exports.IndexFormat || (exports.IndexFormat = {}));\nvar InputStepMode;\n(function (InputStepMode) {\n InputStepMode["Vertex"] = "vertex";\n InputStepMode["Instance"] = "instance";\n})(InputStepMode = exports.InputStepMode || (exports.InputStepMode = {}));\nvar LoadOp;\n(function (LoadOp) {\n LoadOp["Load"] = "load";\n})(LoadOp = exports.LoadOp || (exports.LoadOp = {}));\nvar PrimitiveTopology;\n(function (PrimitiveTopology) {\n PrimitiveTopology["PointList"] = "point-list";\n PrimitiveTopology["LineList"] = "line-list";\n PrimitiveTopology["LineStrip"] = "line-strip";\n PrimitiveTopology["TriangleList"] = "triangle-list";\n PrimitiveTopology["TriangleStrip"] = "triangle-strip";\n})(PrimitiveTopology = exports.PrimitiveTopology || (exports.PrimitiveTopology = {}));\nvar StencilOperation;\n(function (StencilOperation) {\n StencilOperation["Keep"] = "keep";\n StencilOperation["Zero"] = "zero";\n StencilOperation["Replace"] = "replace";\n StencilOperation["Invert"] = "invert";\n StencilOperation["IncrementClamp"] = "increment-clamp";\n StencilOperation["DecrementClamp"] = "decrement-clamp";\n StencilOperation["IncrementWrap"] = "increment-wrap";\n StencilOperation["DecrementWrap"] = "decrement-wrap";\n})(StencilOperation = exports.StencilOperation || (exports.StencilOperation = {}));\nvar StoreOp;\n(function (StoreOp) {\n StoreOp["Store"] = "store";\n StoreOp["Clear"] = "clear";\n})(StoreOp = exports.StoreOp || (exports.StoreOp = {}));\nvar TextureDimension;\n(function (TextureDimension) {\n TextureDimension["E1d"] = "1d";\n TextureDimension["E2d"] = "2d";\n TextureDimension["E3d"] = "3d";\n})(TextureDimension = exports.TextureDimension || (exports.TextureDimension = {}));\nvar TextureFormat;\n(function (TextureFormat) {\n TextureFormat["R8Unorm"] = "r8unorm";\n TextureFormat["R8Snorm"] = "r8snorm";\n TextureFormat["R8Uint"] = "r8uint";\n TextureFormat["R8Sint"] = "r8sint";\n TextureFormat["R16Uint"] = "r16uint";\n TextureFormat["R16Sint"] = "r16sint";\n TextureFormat["R16Float"] = "r16float";\n TextureFormat["RG8Unorm"] = "rg8unorm";\n TextureFormat["RG8Snorm"] = "rg8snorm";\n TextureFormat["RG8Uint"] = "rg8uint";\n TextureFormat["RG8Sint"] = "rg8sint";\n TextureFormat["R32Uint"] = "r32uint";\n TextureFormat["R32Sint"] = "r32sint";\n TextureFormat["R32Float"] = "r32float";\n TextureFormat["RG16Uint"] = "rg16uint";\n TextureFormat["RG16Sint"] = "rg16sint";\n TextureFormat["RG16Float"] = "rg16float";\n TextureFormat["RGBA8Unorm"] = "rgba8unorm";\n TextureFormat["RGBA8UnormSRGB"] = "rgba8unorm-srgb";\n TextureFormat["RGBA8Snorm"] = "rgba8snorm";\n TextureFormat["RGBA8Uint"] = "rgba8uint";\n TextureFormat["RGBA8Sint"] = "rgba8sint";\n TextureFormat["BGRA8Unorm"] = "bgra8unorm";\n TextureFormat["BGRA8UnormSRGB"] = "bgra8unorm-srgb";\n TextureFormat["RGB10A2Unorm"] = "rgb10a2unorm";\n TextureFormat["RG11B10Float"] = "rg11b10float";\n TextureFormat["RG32Uint"] = "rg32uint";\n TextureFormat["RG32Sint"] = "rg32sint";\n TextureFormat["RG32Float"] = "rg32float";\n TextureFormat["RGBA16Uint"] = "rgba16uint";\n TextureFormat["RGBA16Sint"] = "rgba16sint";\n TextureFormat["RGBA16Float"] = "rgba16float";\n TextureFormat["RGBA32Uint"] = "rgba32uint";\n TextureFormat["RGBA32Sint"] = "rgba32sint";\n TextureFormat["RGBA32Float"] = "rgba32float";\n TextureFormat["Depth32Float"] = "depth32float";\n TextureFormat["Depth24Plus"] = "depth24plus";\n TextureFormat["Depth24PlusStencil8"] = "depth24plus-stencil8";\n})(TextureFormat = exports.TextureFormat || (exports.TextureFormat = {}));\nvar TextureComponentType;\n(function (TextureComponentType) {\n TextureComponentType["Float"] = "float";\n TextureComponentType["Sint"] = "sint";\n TextureComponentType["Uint"] = "uint";\n})(TextureComponentType = exports.TextureComponentType || (exports.TextureComponentType = {}));\nvar TextureViewDimension;\n(function (TextureViewDimension) {\n TextureViewDimension["E1d"] = "1d";\n TextureViewDimension["E2d"] = "2d";\n TextureViewDimension["E2dArray"] = "2d-array";\n TextureViewDimension["Cube"] = "cube";\n TextureViewDimension["CubeArray"] = "cube-array";\n TextureViewDimension["E3d"] = "3d";\n})(TextureViewDimension = exports.TextureViewDimension || (exports.TextureViewDimension = {}));\nvar VertexFormat;\n(function (VertexFormat) {\n VertexFormat["Uchar2"] = "uchar2";\n VertexFormat["Uchar4"] = "uchar4";\n VertexFormat["Char2"] = "char2";\n VertexFormat["Char4"] = "char4";\n VertexFormat["Uchar2Norm"] = "uchar2norm";\n VertexFormat["Uchar4Norm"] = "uchar4norm";\n VertexFormat["Char2Norm"] = "char2norm";\n VertexFormat["Char4Norm"] = "char4norm";\n VertexFormat["Ushort2"] = "ushort2";\n VertexFormat["Ushort4"] = "ushort4";\n VertexFormat["Short2"] = "short2";\n VertexFormat["Short4"] = "short4";\n VertexFormat["Ushort2Norm"] = "ushort2norm";\n VertexFormat["Ushort4Norm"] = "ushort4norm";\n VertexFormat["Short2Norm"] = "short2norm";\n VertexFormat["Short4Norm"] = "short4norm";\n VertexFormat["Half2"] = "half2";\n VertexFormat["Half4"] = "half4";\n VertexFormat["Float"] = "float";\n VertexFormat["Float2"] = "float2";\n VertexFormat["Float3"] = "float3";\n VertexFormat["Float4"] = "float4";\n VertexFormat["Uint"] = "uint";\n VertexFormat["Uint2"] = "uint2";\n VertexFormat["Uint3"] = "uint3";\n VertexFormat["Uint4"] = "uint4";\n VertexFormat["Int"] = "int";\n VertexFormat["Int2"] = "int2";\n VertexFormat["Int3"] = "int3";\n VertexFormat["Int4"] = "int4";\n})(VertexFormat = exports.VertexFormat || (exports.VertexFormat = {}));\nvar TextureAspect;\n(function (TextureAspect) {\n TextureAspect["All"] = "all";\n TextureAspect["StencilOnly"] = "stencil-only";\n TextureAspect["DepthOnly"] = "depth-only";\n})(TextureAspect = exports.TextureAspect || (exports.TextureAspect = {}));\nvar CompilationMessageType;\n(function (CompilationMessageType) {\n CompilationMessageType["Error"] = "error";\n CompilationMessageType["Warning"] = "warning";\n CompilationMessageType["Info"] = "info";\n})(CompilationMessageType = exports.CompilationMessageType || (exports.CompilationMessageType = {}));\nvar QueryType;\n(function (QueryType) {\n QueryType["Occlusion"] = "occlusion";\n})(QueryType = exports.QueryType || (exports.QueryType = {}));\n// Bit fields\nvar BufferUsage;\n(function (BufferUsage) {\n BufferUsage[BufferUsage["MapRead"] = 1] = "MapRead";\n BufferUsage[BufferUsage["MapWrite"] = 2] = "MapWrite";\n BufferUsage[BufferUsage["CopySrc"] = 4] = "CopySrc";\n BufferUsage[BufferUsage["CopyDst"] = 8] = "CopyDst";\n BufferUsage[BufferUsage["Index"] = 16] = "Index";\n BufferUsage[BufferUsage["Vertex"] = 32] = "Vertex";\n BufferUsage[BufferUsage["Uniform"] = 64] = "Uniform";\n BufferUsage[BufferUsage["Storage"] = 128] = "Storage";\n BufferUsage[BufferUsage["Indirect"] = 256] = "Indirect";\n BufferUsage[BufferUsage["QueryResolve"] = 512] = "QueryResolve";\n})(BufferUsage = exports.BufferUsage || (exports.BufferUsage = {}));\nvar ColorWrite;\n(function (ColorWrite) {\n ColorWrite[ColorWrite["Red"] = 1] = "Red";\n ColorWrite[ColorWrite["Green"] = 2] = "Green";\n ColorWrite[ColorWrite["Blue"] = 4] = "Blue";\n ColorWrite[ColorWrite["Alpha"] = 8] = "Alpha";\n ColorWrite[ColorWrite["All"] = 15] = "All";\n})(ColorWrite = exports.ColorWrite || (exports.ColorWrite = {}));\nvar ShaderStage;\n(function (ShaderStage) {\n ShaderStage[ShaderStage["Vertex"] = 1] = "Vertex";\n ShaderStage[ShaderStage["Fragment"] = 2] = "Fragment";\n ShaderStage[ShaderStage["Compute"] = 4] = "Compute";\n})(ShaderStage = exports.ShaderStage || (exports.ShaderStage = {}));\nvar TextureUsage;\n(function (TextureUsage) {\n TextureUsage[TextureUsage["CopySrc"] = 1] = "CopySrc";\n TextureUsage[TextureUsage["CopyDst"] = 2] = "CopyDst";\n TextureUsage[TextureUsage["Sampled"] = 4] = "Sampled";\n TextureUsage[TextureUsage["Storage"] = 8] = "Storage";\n TextureUsage[TextureUsage["OutputAttachment"] = 16] = "OutputAttachment";\n})(TextureUsage = exports.TextureUsage || (exports.TextureUsage = {}));\nvar MapMode;\n(function (MapMode) {\n MapMode[MapMode["Read"] = 1] = "Read";\n MapMode[MapMode["Write"] = 2] = "Write";\n})(MapMode = exports.MapMode || (exports.MapMode = {}));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHdlYmdwdS90eXBlcy9kaXN0L2NvbnN0YW50cy5qcz81ZTQ1Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFhO0FBQ2I7QUFDQSw4Q0FBOEMsY0FBYztBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxzRUFBc0U7QUFDdkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsZ0VBQWdFO0FBQ2pFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxnRUFBZ0U7QUFDakU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxnRUFBZ0U7QUFDakU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLHlFQUF5RTtBQUMxRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsNEVBQTRFO0FBQzdFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLHVEQUF1RDtBQUN4RDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsNkRBQTZEO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQywwREFBMEQ7QUFDM0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLGdFQUFnRTtBQUNqRTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsc0VBQXNFO0FBQ3ZFO0FBQ0E7QUFDQTtBQUNBLENBQUMsaURBQWlEO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxrRkFBa0Y7QUFDbkY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLCtFQUErRTtBQUNoRjtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsb0RBQW9EO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLCtFQUErRTtBQUNoRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsc0VBQXNFO0FBQ3ZFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLDJGQUEyRjtBQUM1RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQywyRkFBMkY7QUFDNUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsbUVBQW1FO0FBQ3BFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLHNFQUFzRTtBQUN2RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxpR0FBaUc7QUFDbEc7QUFDQTtBQUNBO0FBQ0EsQ0FBQywwREFBMEQ7QUFDM0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLGdFQUFnRTtBQUNqRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsNkRBQTZEO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLGdFQUFnRTtBQUNqRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsbUVBQW1FO0FBQ3BFO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxvREFBb0QiLCJmaWxlIjoiOC5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL2dwdXdlYi9ncHV3ZWIvYmxvYi8wMWIyMGI0YWQ5M2ZhYmFlMWU4ZTBkNzc1MjUxNWY2OTcwOGQzM2UwL3NwZWMvaW5kZXguYnNcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbi8vIHRzbGludDpkaXNhYmxlOnZhcmlhYmxlLW5hbWVcbi8vIFN0cmluZyBlbnVtc1xudmFyIEV4dGVuc2lvbk5hbWU7XG4oZnVuY3Rpb24gKEV4dGVuc2lvbk5hbWUpIHtcbiAgICBFeHRlbnNpb25OYW1lW1wiVGV4dHVyZUNvbXByZXNzaW9uQkNcIl0gPSBcInRleHR1cmUtY29tcHJlc3Npb24tYmNcIjtcbn0pKEV4dGVuc2lvbk5hbWUgPSBleHBvcnRzLkV4dGVuc2lvbk5hbWUgfHwgKGV4cG9ydHMuRXh0ZW5zaW9uTmFtZSA9IHt9KSk7XG52YXIgQWRkcmVzc01vZGU7XG4oZnVuY3Rpb24gKEFkZHJlc3NNb2RlKSB7XG4gICAgQWRkcmVzc01vZGVbXCJDbGFtcFRvRWRnZVwiXSA9IFwiY2xhbXAtdG8tZWRnZVwiO1xuICAgIEFkZHJlc3NNb2RlW1wiUmVwZWF0XCJdID0gXCJyZXBlYXRcIjtcbiAgICBBZGRyZXNzTW9kZVtcIk1pcnJvclJlcGVhdFwiXSA9IFwibWlycm9yLXJlcGVhdFwiO1xufSkoQWRkcmVzc01vZGUgPSBleHBvcnRzLkFkZHJlc3NNb2RlIHx8IChleHBvcnRzLkFkZHJlc3NNb2RlID0ge30pKTtcbnZhciBCaW5kaW5nVHlwZTtcbihmdW5jdGlvbiAoQmluZGluZ1R5cGUpIHtcbiAgICBCaW5kaW5nVHlwZVtcIlVuaWZvcm1CdWZmZXJcIl0gPSBcInVuaWZvcm0tYnVmZmVyXCI7XG4gICAgQmluZGluZ1R5cGVbXCJTdG9yYWdlQnVmZmVyXCJdID0gXCJzdG9yYWdlLWJ1ZmZlclwiO1xuICAgIEJpbmRpbmdUeXBlW1wiUmVhZG9ubHlTdG9yYWdlQnVmZmVyXCJdID0gXCJyZWFkb25seS1zdG9yYWdlLWJ1ZmZlclwiO1xuICAgIEJpbmRpbmdUeXBlW1wiU2FtcGxlclwiXSA9IFwic2FtcGxlclwiO1xuICAgIEJpbmRpbmdUeXBlW1wiQ29tcGFyaXNvblNhbXBsZXJcIl0gPSBcImNvbXBhcmlzb24tc2FtcGxlclwiO1xuICAgIEJpbmRpbmdUeXBlW1wiU2FtcGxlZFRleHR1cmVcIl0gPSBcInNhbXBsZWQtdGV4dHVyZVwiO1xuICAgIEJpbmRpbmdUeXBlW1wiUmVhZG9ubHlTdG9yYWdlVGV4dHVyZVwiXSA9IFwicmVhZG9ubHktc3RvcmFnZS10ZXh0dXJlXCI7XG4gICAgQmluZGluZ1R5cGVbXCJXcml0ZW9ubHlTdG9yYWdlVGV4dHVyZVwiXSA9IFwid3JpdGVvbmx5LXN0b3JhZ2UtdGV4dHVyZVwiO1xufSkoQmluZGluZ1R5cGUgPSBleHBvcnRzLkJpbmRpbmdUeXBlIHx8IChleHBvcnRzLkJpbmRpbmdUeXBlID0ge30pKTtcbnZhciBCbGVuZEZhY3RvcjtcbihmdW5jdGlvbiAoQmxlbmRGYWN0b3IpIHtcbiAgICBCbGVuZEZhY3RvcltcIlplcm9cIl0gPSBcInplcm9cIjtcbiAgICBCbGVuZEZhY3RvcltcIk9uZVwiXSA9IFwib25lXCI7XG4gICAgQmxlbmRGYWN0b3JbXCJTcmNDb2xvclwiXSA9IFwic3JjLWNvbG9yXCI7XG4gICAgQmxlbmRGYWN0b3JbXCJPbmVNaW51c1NyY0NvbG9yXCJdID0gXCJvbmUtbWludXMtc3JjLWNvbG9yXCI7XG4gICAgQmxlbmRGYWN0b3JbXCJTcmNBbHBoYVwiXSA9IFwic3JjLWFscGhhXCI7XG4gICAgQmxlbmRGYWN0b3JbXCJPbmVNaW51c1NyY0FscGhhXCJdID0gXCJvbmUtbWludXMtc3JjLWFscGhhXCI7XG4gICAgQmxlbmRGYWN0b3JbXCJEc3RDb2xvclwiXSA9IFwiZHN0LWNvbG9yXCI7XG4gICAgQmxlbmRGYWN0b3JbXCJPbmVNaW51c0RzdENvbG9yXCJdID0gXCJvbmUtbWludXMtZHN0LWNvbG9yXCI7XG4gICAgQmxlbmRGYWN0b3JbXCJEc3RBbHBoYVwiXSA9IFwiZHN0LWFscGhhXCI7XG4gICAgQmxlbmRGYWN0b3JbXCJPbmVNaW51c0RzdEFscGhhXCJdID0gXCJvbmUtbWludXMtZHN0LWFscGhhXCI7XG4gICAgQmxlbmRGYWN0b3JbXCJTcmNBbHBoYVNhdHVyYXRlZFwiXSA9IFwic3JjLWFscGhhLXNhdHVyYXRlZFwiO1xuICAgIEJsZW5kRmFjdG9yW1wiQmxlbmRDb2xvclwiXSA9IFwiYmxlbmQtY29sb3JcIjtcbiAgICBCbGVuZEZhY3RvcltcIk9uZU1pbnVzQmxlbmRDb2xvclwiXSA9IFwib25lLW1pbnVzLWJsZW5kLWNvbG9yXCI7XG59KShCbGVuZEZhY3RvciA9IGV4cG9ydHMuQmxlbmRGYWN0b3IgfHwgKGV4cG9ydHMuQmxlbmRGYWN0b3IgPSB7fSkpO1xudmFyIEJsZW5kT3BlcmF0aW9uO1xuKGZ1bmN0aW9uIChCbGVuZE9wZXJhdGlvbikge1xuICAgIEJsZW5kT3BlcmF0aW9uW1wiQWRkXCJdID0gXCJhZGRcIjtcbiAgICBCbGVuZE9wZXJhdGlvbltcIlN1YnRyYWN0XCJdID0gXCJzdWJ0cmFjdFwiO1xuICAgIEJsZW5kT3BlcmF0aW9uW1wiUmV2ZXJzZVN1YnRyYWN0XCJdID0gXCJyZXZlcnNlLXN1YnRyYWN0XCI7XG4gICAgQmxlbmRPcGVyYXRpb25bXCJNaW5cIl0gPSBcIm1pblwiO1xuICAgIEJsZW5kT3BlcmF0aW9uW1wiTWF4XCJdID0gXCJtYXhcIjtcbn0pKEJsZW5kT3BlcmF0aW9uID0gZXhwb3J0cy5CbGVuZE9wZXJhdGlvbiB8fCAoZXhwb3J0cy5CbGVuZE9wZXJhdGlvbiA9IHt9KSk7XG52YXIgQ29tcGFyZUZ1bmN0aW9uO1xuKGZ1bmN0aW9uIChDb21wYXJlRnVuY3Rpb24pIHtcbiAgICBDb21wYXJlRnVuY3Rpb25bXCJOZXZlclwiXSA9IFwibmV2ZXJcIjtcbiAgICBDb21wYXJlRnVuY3Rpb25bXCJMZXNzXCJdID0gXCJsZXNzXCI7XG4gICAgQ29tcGFyZUZ1bmN0aW9uW1wiRXF1YWxcIl0gPSBcImVxdWFsXCI7XG4gICAgQ29tcGFyZUZ1bmN0aW9uW1wiTGVzc0VxdWFsXCJdID0gXCJsZXNzLWVxdWFsXCI7XG4gICAgQ29tcGFyZUZ1bmN0aW9uW1wiR3JlYXRlclwiXSA9IFwiZ3JlYXRlclwiO1xuICAgIENvbXBhcmVGdW5jdGlvbltcIk5vdEVxdWFsXCJdID0gXCJub3QtZXF1YWxcIjtcbiAgICBDb21wYXJlRnVuY3Rpb25bXCJHcmVhdGVyRXF1YWxcIl0gPSBcImdyZWF0ZXItZXF1YWxcIjtcbiAgICBDb21wYXJlRnVuY3Rpb25bXCJBbHdheXNcIl0gPSBcImFsd2F5c1wiO1xufSkoQ29tcGFyZUZ1bmN0aW9uID0gZXhwb3J0cy5Db21wYXJlRnVuY3Rpb24gfHwgKGV4cG9ydHMuQ29tcGFyZUZ1bmN0aW9uID0ge30pKTtcbnZhciBDdWxsTW9kZTtcbihmdW5jdGlvbiAoQ3VsbE1vZGUpIHtcbiAgICBDdWxsTW9kZVtcIk5vbmVcIl0gPSBcIm5vbmVcIjtcbiAgICBDdWxsTW9kZVtcIkZyb250XCJdID0gXCJmcm9udFwiO1xuICAgIEN1bGxNb2RlW1wiQmFja1wiXSA9IFwiYmFja1wiO1xufSkoQ3VsbE1vZGUgPSBleHBvcnRzLkN1bGxNb2RlIHx8IChleHBvcnRzLkN1bGxNb2RlID0ge30pKTtcbnZhciBGaWx0ZXJNb2RlO1xuKGZ1bmN0aW9uIChGaWx0ZXJNb2RlKSB7XG4gICAgRmlsdGVyTW9kZVtcIk5lYXJlc3RcIl0gPSBcIm5lYXJlc3RcIjtcbiAgICBGaWx0ZXJNb2RlW1wiTGluZWFyXCJdID0gXCJsaW5lYXJcIjtcbn0pKEZpbHRlck1vZGUgPSBleHBvcnRzLkZpbHRlck1vZGUgfHwgKGV4cG9ydHMuRmlsdGVyTW9kZSA9IHt9KSk7XG52YXIgRnJvbnRGYWNlO1xuKGZ1bmN0aW9uIChGcm9udEZhY2UpIHtcbiAgICBGcm9udEZhY2VbXCJDQ1dcIl0gPSBcImNjd1wiO1xuICAgIEZyb250RmFjZVtcIkNXXCJdID0gXCJjd1wiO1xufSkoRnJvbnRGYWNlID0gZXhwb3J0cy5Gcm9udEZhY2UgfHwgKGV4cG9ydHMuRnJvbnRGYWNlID0ge30pKTtcbnZhciBJbmRleEZvcm1hdDtcbihmdW5jdGlvbiAoSW5kZXhGb3JtYXQpIHtcbiAgICBJbmRleEZvcm1hdFtcIlVpbnQxNlwiXSA9IFwidWludDE2XCI7XG4gICAgSW5kZXhGb3JtYXRbXCJVaW50MzJcIl0gPSBcInVpbnQzMlwiO1xufSkoSW5kZXhGb3JtYXQgPSBleHBvcnRzLkluZGV4Rm9ybWF0IHx8IChleHBvcnRzLkluZGV4Rm9ybWF0ID0ge30pKTtcbnZhciBJbnB1dFN0ZXBNb2RlO1xuKGZ1bmN0aW9uIChJbnB1dFN0ZXBNb2RlKSB7XG4gICAgSW5wdXRTdGVwTW9kZVtcIlZlcnRleFwiXSA9IFwidmVydGV4XCI7XG4gICAgSW5wdXRTdGVwTW9kZVtcIkluc3RhbmNlXCJdID0gXCJpbnN0YW5jZVwiO1xufSkoSW5wdXRTdGVwTW9kZSA9IGV4cG9ydHMuSW5wdXRTdGVwTW9kZSB8fCAoZXhwb3J0cy5JbnB1dFN0ZXBNb2RlID0ge30pKTtcbnZhciBMb2FkT3A7XG4oZnVuY3Rpb24gKExvYWRPcCkge1xuICAgIExvYWRPcFtcIkxvYWRcIl0gPSBcImxvYWRcIjtcbn0pKExvYWRPcCA9IGV4cG9ydHMuTG9hZE9wIHx8IChleHBvcnRzLkxvYWRPcCA9IHt9KSk7XG52YXIgUHJpbWl0aXZlVG9wb2xvZ3k7XG4oZnVuY3Rpb24gKFByaW1pdGl2ZVRvcG9sb2d5KSB7XG4gICAgUHJpbWl0aXZlVG9wb2xvZ3lbXCJQb2ludExpc3RcIl0gPSBcInBvaW50LWxpc3RcIjtcbiAgICBQcmltaXRpdmVUb3BvbG9neVtcIkxpbmVMaXN0XCJdID0gXCJsaW5lLWxpc3RcIjtcbiAgICBQcmltaXRpdmVUb3BvbG9neVtcIkxpbmVTdHJpcFwiXSA9IFwibGluZS1zdHJpcFwiO1xuICAgIFByaW1pdGl2ZVRvcG9sb2d5W1wiVHJpYW5nbGVMaXN0XCJdID0gXCJ0cmlhbmdsZS1saXN0XCI7XG4gICAgUHJpbWl0aXZlVG9wb2xvZ3lbXCJUcmlhbmdsZVN0cmlwXCJdID0gXCJ0cmlhbmdsZS1zdHJpcFwiO1xufSkoUHJpbWl0aXZlVG9wb2xvZ3kgPSBleHBvcnRzLlByaW1pdGl2ZVRvcG9sb2d5IHx8IChleHBvcnRzLlByaW1pdGl2ZVRvcG9sb2d5ID0ge30pKTtcbnZhciBTdGVuY2lsT3BlcmF0aW9uO1xuKGZ1bmN0aW9uIChTdGVuY2lsT3BlcmF0aW9uKSB7XG4gICAgU3RlbmNpbE9wZXJhdGlvbltcIktlZXBcIl0gPSBcImtlZXBcIjtcbiAgICBTdGVuY2lsT3BlcmF0aW9uW1wiWmVyb1wiXSA9IFwiemVyb1wiO1xuICAgIFN0ZW5jaWxPcGVyYXRpb25bXCJSZXBsYWNlXCJdID0gXCJyZXBsYWNlXCI7XG4gICAgU3RlbmNpbE9wZXJhdGlvbltcIkludmVydFwiXSA9IFwiaW52ZXJ0XCI7XG4gICAgU3RlbmNpbE9wZXJhdGlvbltcIkluY3JlbWVudENsYW1wXCJdID0gXCJpbmNyZW1lbnQtY2xhbXBcIjtcbiAgICBTdGVuY2lsT3BlcmF0aW9uW1wiRGVjcmVtZW50Q2xhbXBcIl0gPSBcImRlY3JlbWVudC1jbGFtcFwiO1xuICAgIFN0ZW5jaWxPcGVyYXRpb25bXCJJbmNyZW1lbnRXcmFwXCJdID0gXCJpbmNyZW1lbnQtd3JhcFwiO1xuICAgIFN0ZW5jaWxPcGVyYXRpb25bXCJEZWNyZW1lbnRXcmFwXCJdID0gXCJkZWNyZW1lbnQtd3JhcFwiO1xufSkoU3RlbmNpbE9wZXJhdGlvbiA9IGV4cG9ydHMuU3RlbmNpbE9wZXJhdGlvbiB8fCAoZXhwb3J0cy5TdGVuY2lsT3BlcmF0aW9uID0ge30pKTtcbnZhciBTdG9yZU9wO1xuKGZ1bmN0aW9uIChTdG9yZU9wKSB7XG4gICAgU3RvcmVPcFtcIlN0b3JlXCJdID0gXCJzdG9yZVwiO1xuICAgIFN0b3JlT3BbXCJDbGVhclwiXSA9IFwiY2xlYXJcIjtcbn0pKFN0b3JlT3AgPSBleHBvcnRzLlN0b3JlT3AgfHwgKGV4cG9ydHMuU3RvcmVPcCA9IHt9KSk7XG52YXIgVGV4dHVyZURpbWVuc2lvbjtcbihmdW5jdGlvbiAoVGV4dHVyZURpbWVuc2lvbikge1xuICAgIFRleHR1cmVEaW1lbnNpb25bXCJFMWRcIl0gPSBcIjFkXCI7XG4gICAgVGV4dHVyZURpbWVuc2lvbltcIkUyZFwiXSA9IFwiMmRcIjtcbiAgICBUZXh0dXJlRGltZW5zaW9uW1wiRTNkXCJdID0gXCIzZFwiO1xufSkoVGV4dHVyZURpbWVuc2lvbiA9IGV4cG9ydHMuVGV4dHVyZURpbWVuc2lvbiB8fCAoZXhwb3J0cy5UZXh0dXJlRGltZW5zaW9uID0ge30pKTtcbnZhciBUZXh0dXJlRm9ybWF0O1xuKGZ1bmN0aW9uIChUZXh0dXJlRm9ybWF0KSB7XG4gICAgVGV4dHVyZUZvcm1hdFtcIlI4VW5vcm1cIl0gPSBcInI4dW5vcm1cIjtcbiAgICBUZXh0dXJlRm9ybWF0W1wiUjhTbm9ybVwiXSA9IFwicjhzbm9ybVwiO1xuICAgIFRleHR1cmVGb3JtYXRbXCJSOFVpbnRcIl0gPSBcInI4dWludFwiO1xuICAgIFRleHR1cmVGb3JtYXRbXCJSOFNpbnRcIl0gPSBcInI4c2ludFwiO1xuICAgIFRleHR1cmVGb3JtYXRbXCJSMTZVaW50XCJdID0gXCJyMTZ1aW50XCI7XG4gICAgVGV4dHVyZUZvcm1hdFtcIlIxNlNpbnRcIl0gPSBcInIxNnNpbnRcIjtcbiAgICBUZXh0dXJlRm9ybWF0W1wiUjE2RmxvYXRcIl0gPSBcInIxNmZsb2F0XCI7XG4gICAgVGV4dHVyZUZvcm1hdFtcIlJHOFVub3JtXCJdID0gXCJyZzh1bm9ybVwiO1xuICAgIFRleHR1cmVGb3JtYXRbXCJSRzhTbm9ybVwiXSA9IFwicmc4c25vcm1cIjtcbiAgICBUZXh0dXJlRm9ybWF0W1wiUkc4VWludFwiXSA9IFwicmc4dWludFwiO1xuICAgIFRleHR1cmVGb3JtYXRbXCJSRzhTaW50XCJdID0gXCJyZzhzaW50XCI7XG4gICAgVGV4dHVyZUZvcm1hdFtcIlIzMlVpbnRcIl0gPSBcInIzMnVpbnRcIjtcbiAgICBUZXh0dXJlRm9ybWF0W1wiUjMyU2ludFwiXSA9IFwicjMyc2ludFwiO1xuICAgIFRleHR1cmVGb3JtYXRbXCJSMzJGbG9hdFwiXSA9IFwicjMyZmxvYXRcIjtcbiAgICBUZXh0dXJlRm9ybWF0W1wiUkcxNlVpbnRcIl0gPSBcInJnMTZ1aW50XCI7XG4gICAgVGV4dHVyZUZvcm1hdFtcIlJHMTZTaW50XCJdID0gXCJyZzE2c2ludFwiO1xuICAgIFRleHR1cmVGb3JtYXRbXCJSRzE2RmxvYXRcIl0gPSBcInJnMTZmbG9hdFwiO1xuICAgIFRleHR1cmVGb3JtYXRbXCJSR0JBOFVub3JtXCJdID0gXCJyZ2JhOHVub3JtXCI7XG4gICAgVGV4dHVyZUZvcm1hdFtcIlJHQkE4VW5vcm1TUkdCXCJdID0gXCJyZ2JhOHVub3JtLXNyZ2JcIjtcbiAgICBUZXh0dXJlRm9ybWF0W1wiUkdCQThTbm9ybVwiXSA9IFwicmdiYThzbm9ybVwiO1xuICAgIFRleHR1cmVGb3JtYXRbXCJSR0JBOFVpbnRcIl0gPSBcInJnYmE4dWludFwiO1xuICAgIFRleHR1cmVGb3JtYXRbXCJSR0JBOFNpbnRcIl0gPSBcInJnYmE4c2ludFwiO1xuICAgIFRleHR1cmVGb3JtYXRbXCJCR1JBOFVub3JtXCJdID0gXCJiZ3JhOHVub3JtXCI7XG4gICAgVGV4dHVyZUZvcm1hdFtcIkJHUkE4VW5vcm1TUkdCXCJdID0gXCJiZ3JhOHVub3JtLXNyZ2JcIjtcbiAgICBUZXh0dXJlRm9ybWF0W1wiUkdCMTBBMlVub3JtXCJdID0gXCJyZ2IxMGEydW5vcm1cIjtcbiAgICBUZXh0dXJlRm9ybWF0W1wiUkcxMUIxMEZsb2F0XCJdID0gXCJyZzExYjEwZmxvYXRcIjtcbiAgICBUZXh0dXJlRm9ybWF0W1wiUkczMlVpbnRcIl0gPSBcInJnMzJ1aW50XCI7XG4gICAgVGV4dHVyZUZvcm1hdFtcIlJHMzJTaW50XCJdID0gXCJyZzMyc2ludFwiO1xuICAgIFRleHR1cmVGb3JtYXRbXCJSRzMyRmxvYXRcIl0gPSBcInJnMzJmbG9hdFwiO1xuICAgIFRleHR1cmVGb3JtYXRbXCJSR0JBMTZVaW50XCJdID0gXCJyZ2JhMTZ1aW50XCI7XG4gICAgVGV4dHVyZUZvcm1hdFtcIlJHQkExNlNpbnRcIl0gPSBcInJnYmExNnNpbnRcIjtcbiAgICBUZXh0dXJlRm9ybWF0W1wiUkdCQTE2RmxvYXRcIl0gPSBcInJnYmExNmZsb2F0XCI7XG4gICAgVGV4dHVyZUZvcm1hdFtcIlJHQkEzMlVpbnRcIl0gPSBcInJnYmEzMnVpbnRcIjtcbiAgICBUZXh0dXJlRm9ybWF0W1wiUkdCQTMyU2ludFwiXSA9IFwicmdiYTMyc2ludFwiO1xuICAgIFRleHR1cmVGb3JtYXRbXCJSR0JBMzJGbG9hdFwiXSA9IFwicmdiYTMyZmxvYXRcIjtcbiAgICBUZXh0dXJlRm9ybWF0W1wiRGVwdGgzMkZsb2F0XCJdID0gXCJkZXB0aDMyZmxvYXRcIjtcbiAgICBUZXh0dXJlRm9ybWF0W1wiRGVwdGgyNFBsdXNcIl0gPSBcImRlcHRoMjRwbHVzXCI7XG4gICAgVGV4dHVyZUZvcm1hdFtcIkRlcHRoMjRQbHVzU3RlbmNpbDhcIl0gPSBcImRlcHRoMjRwbHVzLXN0ZW5jaWw4XCI7XG59KShUZXh0dXJlRm9ybWF0ID0gZXhwb3J0cy5UZXh0dXJlRm9ybWF0IHx8IChleHBvcnRzLlRleHR1cmVGb3JtYXQgPSB7fSkpO1xudmFyIFRleHR1cmVDb21wb25lbnRUeXBlO1xuKGZ1bmN0aW9uIChUZXh0dXJlQ29tcG9uZW50VHlwZSkge1xuICAgIFRleHR1cmVDb21wb25lbnRUeXBlW1wiRmxvYXRcIl0gPSBcImZsb2F0XCI7XG4gICAgVGV4dHVyZUNvbXBvbmVudFR5cGVbXCJTaW50XCJdID0gXCJzaW50XCI7XG4gICAgVGV4dHVyZUNvbXBvbmVudFR5cGVbXCJVaW50XCJdID0gXCJ1aW50XCI7XG59KShUZXh0dXJlQ29tcG9uZW50VHlwZSA9IGV4cG9ydHMuVGV4dHVyZUNvbXBvbmVudFR5cGUgfHwgKGV4cG9ydHMuVGV4dHVyZUNvbXBvbmVudFR5cGUgPSB7fSkpO1xudmFyIFRleHR1cmVWaWV3RGltZW5zaW9uO1xuKGZ1bmN0aW9uIChUZXh0dXJlVmlld0RpbWVuc2lvbikge1xuICAgIFRleHR1cmVWaWV3RGltZW5zaW9uW1wiRTFkXCJdID0gXCIxZFwiO1xuICAgIFRleHR1cmVWaWV3RGltZW5zaW9uW1wiRTJkXCJdID0gXCIyZFwiO1xuICAgIFRleHR1cmVWaWV3RGltZW5zaW9uW1wiRTJkQXJyYXlcIl0gPSBcIjJkLWFycmF5XCI7XG4gICAgVGV4dHVyZVZpZXdEaW1lbnNpb25bXCJDdWJlXCJdID0gXCJjdWJlXCI7XG4gICAgVGV4dHVyZVZpZXdEaW1lbnNpb25bXCJDdWJlQXJyYXlcIl0gPSBcImN1YmUtYXJyYXlcIjtcbiAgICBUZXh0dXJlVmlld0RpbWVuc2lvbltcIkUzZFwiXSA9IFwiM2RcIjtcbn0pKFRleHR1cmVWaWV3RGltZW5zaW9uID0gZXhwb3J0cy5UZXh0dXJlVmlld0RpbWVuc2lvbiB8fCAoZXhwb3J0cy5UZXh0dXJlVmlld0RpbWVuc2lvbiA9IHt9KSk7XG52YXIgVmVydGV4Rm9ybWF0O1xuKGZ1bmN0aW9uIChWZXJ0ZXhGb3JtYXQpIHtcbiAgICBWZXJ0ZXhGb3JtYXRbXCJVY2hhcjJcIl0gPSBcInVjaGFyMlwiO1xuICAgIFZlcnRleEZvcm1hdFtcIlVjaGFyNFwiXSA9IFwidWNoYXI0XCI7XG4gICAgVmVydGV4Rm9ybWF0W1wiQ2hhcjJcIl0gPSBcImNoYXIyXCI7XG4gICAgVmVydGV4Rm9ybWF0W1wiQ2hhcjRcIl0gPSBcImNoYXI0XCI7XG4gICAgVmVydGV4Rm9ybWF0W1wiVWNoYXIyTm9ybVwiXSA9IFwidWNoYXIybm9ybVwiO1xuICAgIFZlcnRleEZvcm1hdFtcIlVjaGFyNE5vcm1cIl0gPSBcInVjaGFyNG5vcm1cIjtcbiAgICBWZXJ0ZXhGb3JtYXRbXCJDaGFyMk5vcm1cIl0gPSBcImNoYXIybm9ybVwiO1xuICAgIFZlcnRleEZvcm1hdFtcIkNoYXI0Tm9ybVwiXSA9IFwiY2hhcjRub3JtXCI7XG4gICAgVmVydGV4Rm9ybWF0W1wiVXNob3J0MlwiXSA9IFwidXNob3J0MlwiO1xuICAgIFZlcnRleEZvcm1hdFtcIlVzaG9ydDRcIl0gPSBcInVzaG9ydDRcIjtcbiAgICBWZXJ0ZXhGb3JtYXRbXCJTaG9ydDJcIl0gPSBcInNob3J0MlwiO1xuICAgIFZlcnRleEZvcm1hdFtcIlNob3J0NFwiXSA9IFwic2hvcnQ0XCI7XG4gICAgVmVydGV4Rm9ybWF0W1wiVXNob3J0Mk5vcm1cIl0gPSBcInVzaG9ydDJub3JtXCI7XG4gICAgVmVydGV4Rm9ybWF0W1wiVXNob3J0NE5vcm1cIl0gPSBcInVzaG9ydDRub3JtXCI7XG4gICAgVmVydGV4Rm9ybWF0W1wiU2hvcnQyTm9ybVwiXSA9IFwic2hvcnQybm9ybVwiO1xuICAgIFZlcnRleEZvcm1hdFtcIlNob3J0NE5vcm1cIl0gPSBcInNob3J0NG5vcm1cIjtcbiAgICBWZXJ0ZXhGb3JtYXRbXCJIYWxmMlwiXSA9IFwiaGFsZjJcIjtcbiAgICBWZXJ0ZXhGb3JtYXRbXCJIYWxmNFwiXSA9IFwiaGFsZjRcIjtcbiAgICBWZXJ0ZXhGb3JtYXRbXCJGbG9hdFwiXSA9IFwiZmxvYXRcIjtcbiAgICBWZXJ0ZXhGb3JtYXRbXCJGbG9hdDJcIl0gPSBcImZsb2F0MlwiO1xuICAgIFZlcnRleEZvcm1hdFtcIkZsb2F0M1wiXSA9IFwiZmxvYXQzXCI7XG4gICAgVmVydGV4Rm9ybWF0W1wiRmxvYXQ0XCJdID0gXCJmbG9hdDRcIjtcbiAgICBWZXJ0ZXhGb3JtYXRbXCJVaW50XCJdID0gXCJ1aW50XCI7XG4gICAgVmVydGV4Rm9ybWF0W1wiVWludDJcIl0gPSBcInVpbnQyXCI7XG4gICAgVmVydGV4Rm9ybWF0W1wiVWludDNcIl0gPSBcInVpbnQzXCI7XG4gICAgVmVydGV4Rm9ybWF0W1wiVWludDRcIl0gPSBcInVpbnQ0XCI7XG4gICAgVmVydGV4Rm9ybWF0W1wiSW50XCJdID0gXCJpbnRcIjtcbiAgICBWZXJ0ZXhGb3JtYXRbXCJJbnQyXCJdID0gXCJpbnQyXCI7XG4gICAgVmVydGV4Rm9ybWF0W1wiSW50M1wiXSA9IFwiaW50M1wiO1xuICAgIFZlcnRleEZvcm1hdFtcIkludDRcIl0gPSBcImludDRcIjtcbn0pKFZlcnRleEZvcm1hdCA9IGV4cG9ydHMuVmVydGV4Rm9ybWF0IHx8IChleHBvcnRzLlZlcnRleEZvcm1hdCA9IHt9KSk7XG52YXIgVGV4dHVyZUFzcGVjdDtcbihmdW5jdGlvbiAoVGV4dHVyZUFzcGVjdCkge1xuICAgIFRleHR1cmVBc3BlY3RbXCJBbGxcIl0gPSBcImFsbFwiO1xuICAgIFRleHR1cmVBc3BlY3RbXCJTdGVuY2lsT25seVwiXSA9IFwic3RlbmNpbC1vbmx5XCI7XG4gICAgVGV4dHVyZUFzcGVjdFtcIkRlcHRoT25seVwiXSA9IFwiZGVwdGgtb25seVwiO1xufSkoVGV4dHVyZUFzcGVjdCA9IGV4cG9ydHMuVGV4dHVyZUFzcGVjdCB8fCAoZXhwb3J0cy5UZXh0dXJlQXNwZWN0ID0ge30pKTtcbnZhciBDb21waWxhdGlvbk1lc3NhZ2VUeXBlO1xuKGZ1bmN0aW9uIChDb21waWxhdGlvbk1lc3NhZ2VUeXBlKSB7XG4gICAgQ29tcGlsYXRpb25NZXNzYWdlVHlwZVtcIkVycm9yXCJdID0gXCJlcnJvclwiO1xuICAgIENvbXBpbGF0aW9uTWVzc2FnZVR5cGVbXCJXYXJuaW5nXCJdID0gXCJ3YXJuaW5nXCI7XG4gICAgQ29tcGlsYXRpb25NZXNzYWdlVHlwZVtcIkluZm9cIl0gPSBcImluZm9cIjtcbn0pKENvbXBpbGF0aW9uTWVzc2FnZVR5cGUgPSBleHBvcnRzLkNvbXBpbGF0aW9uTWVzc2FnZVR5cGUgfHwgKGV4cG9ydHMuQ29tcGlsYXRpb25NZXNzYWdlVHlwZSA9IHt9KSk7XG52YXIgUXVlcnlUeXBlO1xuKGZ1bmN0aW9uIChRdWVyeVR5cGUpIHtcbiAgICBRdWVyeVR5cGVbXCJPY2NsdXNpb25cIl0gPSBcIm9jY2x1c2lvblwiO1xufSkoUXVlcnlUeXBlID0gZXhwb3J0cy5RdWVyeVR5cGUgfHwgKGV4cG9ydHMuUXVlcnlUeXBlID0ge30pKTtcbi8vIEJpdCBmaWVsZHNcbnZhciBCdWZmZXJVc2FnZTtcbihmdW5jdGlvbiAoQnVmZmVyVXNhZ2UpIHtcbiAgICBCdWZmZXJVc2FnZVtCdWZmZXJVc2FnZVtcIk1hcFJlYWRcIl0gPSAxXSA9IFwiTWFwUmVhZFwiO1xuICAgIEJ1ZmZlclVzYWdlW0J1ZmZlclVzYWdlW1wiTWFwV3JpdGVcIl0gPSAyXSA9IFwiTWFwV3JpdGVcIjtcbiAgICBCdWZmZXJVc2FnZVtCdWZmZXJVc2FnZVtcIkNvcHlTcmNcIl0gPSA0XSA9IFwiQ29weVNyY1wiO1xuICAgIEJ1ZmZlclVzYWdlW0J1ZmZlclVzYWdlW1wiQ29weURzdFwiXSA9IDhdID0gXCJDb3B5RHN0XCI7XG4gICAgQnVmZmVyVXNhZ2VbQnVmZmVyVXNhZ2VbXCJJbmRleFwiXSA9IDE2XSA9IFwiSW5kZXhcIjtcbiAgICBCdWZmZXJVc2FnZVtCdWZmZXJVc2FnZVtcIlZlcnRleFwiXSA9IDMyXSA9IFwiVmVydGV4XCI7XG4gICAgQnVmZmVyVXNhZ2VbQnVmZmVyVXNhZ2VbXCJVbmlmb3JtXCJdID0gNjRdID0gXCJVbmlmb3JtXCI7XG4gICAgQnVmZmVyVXNhZ2VbQnVmZmVyVXNhZ2VbXCJTdG9yYWdlXCJdID0gMTI4XSA9IFwiU3RvcmFnZVwiO1xuICAgIEJ1ZmZlclVzYWdlW0J1ZmZlclVzYWdlW1wiSW5kaXJlY3RcIl0gPSAyNTZdID0gXCJJbmRpcmVjdFwiO1xuICAgIEJ1ZmZlclVzYWdlW0J1ZmZlclVzYWdlW1wiUXVlcnlSZXNvbHZlXCJdID0gNTEyXSA9IFwiUXVlcnlSZXNvbHZlXCI7XG59KShCdWZmZXJVc2FnZSA9IGV4cG9ydHMuQnVmZmVyVXNhZ2UgfHwgKGV4cG9ydHMuQnVmZmVyVXNhZ2UgPSB7fSkpO1xudmFyIENvbG9yV3JpdGU7XG4oZnVuY3Rpb24gKENvbG9yV3JpdGUpIHtcbiAgICBDb2xvcldyaXRlW0NvbG9yV3JpdGVbXCJSZWRcIl0gPSAxXSA9IFwiUmVkXCI7XG4gICAgQ29sb3JXcml0ZVtDb2xvcldyaXRlW1wiR3JlZW5cIl0gPSAyXSA9IFwiR3JlZW5cIjtcbiAgICBDb2xvcldyaXRlW0NvbG9yV3JpdGVbXCJCbHVlXCJdID0gNF0gPSBcIkJsdWVcIjtcbiAgICBDb2xvcldyaXRlW0NvbG9yV3JpdGVbXCJBbHBoYVwiXSA9IDhdID0gXCJBbHBoYVwiO1xuICAgIENvbG9yV3JpdGVbQ29sb3JXcml0ZVtcIkFsbFwiXSA9IDE1XSA9IFwiQWxsXCI7XG59KShDb2xvcldyaXRlID0gZXhwb3J0cy5Db2xvcldyaXRlIHx8IChleHBvcnRzLkNvbG9yV3JpdGUgPSB7fSkpO1xudmFyIFNoYWRlclN0YWdlO1xuKGZ1bmN0aW9uIChTaGFkZXJTdGFnZSkge1xuICAgIFNoYWRlclN0YWdlW1NoYWRlclN0YWdlW1wiVmVydGV4XCJdID0gMV0gPSBcIlZlcnRleFwiO1xuICAgIFNoYWRlclN0YWdlW1NoYWRlclN0YWdlW1wiRnJhZ21lbnRcIl0gPSAyXSA9IFwiRnJhZ21lbnRcIjtcbiAgICBTaGFkZXJTdGFnZVtTaGFkZXJTdGFnZVtcIkNvbXB1dGVcIl0gPSA0XSA9IFwiQ29tcHV0ZVwiO1xufSkoU2hhZGVyU3RhZ2UgPSBleHBvcnRzLlNoYWRlclN0YWdlIHx8IChleHBvcnRzLlNoYWRlclN0YWdlID0ge30pKTtcbnZhciBUZXh0dXJlVXNhZ2U7XG4oZnVuY3Rpb24gKFRleHR1cmVVc2FnZSkge1xuICAgIFRleHR1cmVVc2FnZVtUZXh0dXJlVXNhZ2VbXCJDb3B5U3JjXCJdID0gMV0gPSBcIkNvcHlTcmNcIjtcbiAgICBUZXh0dXJlVXNhZ2VbVGV4dHVyZVVzYWdlW1wiQ29weURzdFwiXSA9IDJdID0gXCJDb3B5RHN0XCI7XG4gICAgVGV4dHVyZVVzYWdlW1RleHR1cmVVc2FnZVtcIlNhbXBsZWRcIl0gPSA0XSA9IFwiU2FtcGxlZFwiO1xuICAgIFRleHR1cmVVc2FnZVtUZXh0dXJlVXNhZ2VbXCJTdG9yYWdlXCJdID0gOF0gPSBcIlN0b3JhZ2VcIjtcbiAgICBUZXh0dXJlVXNhZ2VbVGV4dHVyZVVzYWdlW1wiT3V0cHV0QXR0YWNobWVudFwiXSA9IDE2XSA9IFwiT3V0cHV0QXR0YWNobWVudFwiO1xufSkoVGV4dHVyZVVzYWdlID0gZXhwb3J0cy5UZXh0dXJlVXNhZ2UgfHwgKGV4cG9ydHMuVGV4dHVyZVVzYWdlID0ge30pKTtcbnZhciBNYXBNb2RlO1xuKGZ1bmN0aW9uIChNYXBNb2RlKSB7XG4gICAgTWFwTW9kZVtNYXBNb2RlW1wiUmVhZFwiXSA9IDFdID0gXCJSZWFkXCI7XG4gICAgTWFwTW9kZVtNYXBNb2RlW1wiV3JpdGVcIl0gPSAyXSA9IFwiV3JpdGVcIjtcbn0pKE1hcE1vZGUgPSBleHBvcnRzLk1hcE1vZGUgfHwgKGV4cG9ydHMuTWFwTW9kZSA9IHt9KSk7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///8\n')},function(module,exports,__webpack_require__){eval("module.exports = __webpack_require__(498);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvcmVnZW5lcmF0b3IvaW5kZXguanM/YTM0YSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxpQkFBaUIsbUJBQU8sQ0FBQyxHQUFxQiIsImZpbGUiOiI5LmpzIiwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicmVnZW5lcmF0b3ItcnVudGltZVwiKTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///9\n")},function(module,exports){eval('function _initializerDefineProperty(target, property, descriptor, context) {\n if (!descriptor) return;\n Object.defineProperty(target, property, {\n enumerable: descriptor.enumerable,\n configurable: descriptor.configurable,\n writable: descriptor.writable,\n value: descriptor.initializer ? descriptor.initializer.call(context) : void 0\n });\n}\n\nmodule.exports = _initializerDefineProperty;\nmodule.exports["default"] = module.exports, module.exports.__esModule = true;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbml0aWFsaXplckRlZmluZVByb3BlcnR5LmpzP2M4NmYiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQSIsImZpbGUiOiIxMC5qcyIsInNvdXJjZXNDb250ZW50IjpbImZ1bmN0aW9uIF9pbml0aWFsaXplckRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHksIGRlc2NyaXB0b3IsIGNvbnRleHQpIHtcbiAgaWYgKCFkZXNjcmlwdG9yKSByZXR1cm47XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5LCB7XG4gICAgZW51bWVyYWJsZTogZGVzY3JpcHRvci5lbnVtZXJhYmxlLFxuICAgIGNvbmZpZ3VyYWJsZTogZGVzY3JpcHRvci5jb25maWd1cmFibGUsXG4gICAgd3JpdGFibGU6IGRlc2NyaXB0b3Iud3JpdGFibGUsXG4gICAgdmFsdWU6IGRlc2NyaXB0b3IuaW5pdGlhbGl6ZXIgPyBkZXNjcmlwdG9yLmluaXRpYWxpemVyLmNhbGwoY29udGV4dCkgOiB2b2lkIDBcbiAgfSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2luaXRpYWxpemVyRGVmaW5lUHJvcGVydHk7XG5tb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0cywgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///10\n')},function(module,exports){eval("function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) {\n var desc = {};\n Object.keys(descriptor).forEach(function (key) {\n desc[key] = descriptor[key];\n });\n desc.enumerable = !!desc.enumerable;\n desc.configurable = !!desc.configurable;\n\n if ('value' in desc || desc.initializer) {\n desc.writable = true;\n }\n\n desc = decorators.slice().reverse().reduce(function (desc, decorator) {\n return decorator(target, property, desc) || desc;\n }, desc);\n\n if (context && desc.initializer !== void 0) {\n desc.value = desc.initializer ? desc.initializer.call(context) : void 0;\n desc.initializer = undefined;\n }\n\n if (desc.initializer === void 0) {\n Object.defineProperty(target, property, desc);\n desc = null;\n }\n\n return desc;\n}\n\nmodule.exports = _applyDecoratedDescriptor;\nmodule.exports[\"default\"] = module.exports, module.exports.__esModule = true;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hcHBseURlY29yYXRlZERlc2NyaXB0b3IuanM/NTNlYyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EiLCJmaWxlIjoiMTEuanMiLCJzb3VyY2VzQ29udGVudCI6WyJmdW5jdGlvbiBfYXBwbHlEZWNvcmF0ZWREZXNjcmlwdG9yKHRhcmdldCwgcHJvcGVydHksIGRlY29yYXRvcnMsIGRlc2NyaXB0b3IsIGNvbnRleHQpIHtcbiAgdmFyIGRlc2MgPSB7fTtcbiAgT2JqZWN0LmtleXMoZGVzY3JpcHRvcikuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgZGVzY1trZXldID0gZGVzY3JpcHRvcltrZXldO1xuICB9KTtcbiAgZGVzYy5lbnVtZXJhYmxlID0gISFkZXNjLmVudW1lcmFibGU7XG4gIGRlc2MuY29uZmlndXJhYmxlID0gISFkZXNjLmNvbmZpZ3VyYWJsZTtcblxuICBpZiAoJ3ZhbHVlJyBpbiBkZXNjIHx8IGRlc2MuaW5pdGlhbGl6ZXIpIHtcbiAgICBkZXNjLndyaXRhYmxlID0gdHJ1ZTtcbiAgfVxuXG4gIGRlc2MgPSBkZWNvcmF0b3JzLnNsaWNlKCkucmV2ZXJzZSgpLnJlZHVjZShmdW5jdGlvbiAoZGVzYywgZGVjb3JhdG9yKSB7XG4gICAgcmV0dXJuIGRlY29yYXRvcih0YXJnZXQsIHByb3BlcnR5LCBkZXNjKSB8fCBkZXNjO1xuICB9LCBkZXNjKTtcblxuICBpZiAoY29udGV4dCAmJiBkZXNjLmluaXRpYWxpemVyICE9PSB2b2lkIDApIHtcbiAgICBkZXNjLnZhbHVlID0gZGVzYy5pbml0aWFsaXplciA/IGRlc2MuaW5pdGlhbGl6ZXIuY2FsbChjb250ZXh0KSA6IHZvaWQgMDtcbiAgICBkZXNjLmluaXRpYWxpemVyID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKGRlc2MuaW5pdGlhbGl6ZXIgPT09IHZvaWQgMCkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5LCBkZXNjKTtcbiAgICBkZXNjID0gbnVsbDtcbiAgfVxuXG4gIHJldHVybiBkZXNjO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9hcHBseURlY29yYXRlZERlc2NyaXB0b3I7XG5tb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0cywgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///11\n")},function(module,__webpack_exports__,__webpack_require__){"use strict";eval('/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return EPSILON; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return ARRAY_TYPE; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return RANDOM; });\n/* unused harmony export setMatrixArrayType */\n/* unused harmony export toRadian */\n/* unused harmony export equals */\n/**\n * Common utilities\n * @module glMatrix\n */\n// Configuration Constants\nvar EPSILON = 0.000001;\nvar ARRAY_TYPE = typeof Float32Array !== \'undefined\' ? Float32Array : Array;\nvar RANDOM = Math.random;\n/**\n * Sets the type of array used when creating new vectors and matrices\n *\n * @param {Float32ArrayConstructor | ArrayConstructor} type Array type, such as Float32Array or Array\n */\n\nfunction setMatrixArrayType(type) {\n ARRAY_TYPE = type;\n}\nvar degree = Math.PI / 180;\n/**\n * Convert Degree To Radian\n *\n * @param {Number} a Angle in Degrees\n */\n\nfunction toRadian(a) {\n return a * degree;\n}\n/**\n * Tests whether or not the arguments have approximately the same value, within an absolute\n * or relative tolerance of glMatrix.EPSILON (an absolute tolerance is used for values less\n * than or equal to 1.0, and a relative tolerance is used for larger values)\n *\n * @param {Number} a The first number to test.\n * @param {Number} b The second number to test.\n * @returns {Boolean} True if the numbers are approximately equal, false otherwise.\n */\n\nfunction equals(a, b) {\n return Math.abs(a - b) <= EPSILON * Math.max(1.0, Math.abs(a), Math.abs(b));\n}\nif (!Math.hypot) Math.hypot = function () {\n var y = 0,\n i = arguments.length;\n\n while (i--) {\n y += arguments[i] * arguments[i];\n }\n\n return Math.sqrt(y);\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZ2wtbWF0cml4L2VzbS9jb21tb24uanM/Yzk0ZCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDQTtBQUNBO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsV0FBVywyQ0FBMkM7QUFDdEQ7O0FBRU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEI7O0FBRU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsYUFBYSxRQUFRO0FBQ3JCOztBQUVPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSIsImZpbGUiOiIxMi5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29tbW9uIHV0aWxpdGllc1xuICogQG1vZHVsZSBnbE1hdHJpeFxuICovXG4vLyBDb25maWd1cmF0aW9uIENvbnN0YW50c1xuZXhwb3J0IHZhciBFUFNJTE9OID0gMC4wMDAwMDE7XG5leHBvcnQgdmFyIEFSUkFZX1RZUEUgPSB0eXBlb2YgRmxvYXQzMkFycmF5ICE9PSAndW5kZWZpbmVkJyA/IEZsb2F0MzJBcnJheSA6IEFycmF5O1xuZXhwb3J0IHZhciBSQU5ET00gPSBNYXRoLnJhbmRvbTtcbi8qKlxuICogU2V0cyB0aGUgdHlwZSBvZiBhcnJheSB1c2VkIHdoZW4gY3JlYXRpbmcgbmV3IHZlY3RvcnMgYW5kIG1hdHJpY2VzXG4gKlxuICogQHBhcmFtIHtGbG9hdDMyQXJyYXlDb25zdHJ1Y3RvciB8IEFycmF5Q29uc3RydWN0b3J9IHR5cGUgQXJyYXkgdHlwZSwgc3VjaCBhcyBGbG9hdDMyQXJyYXkgb3IgQXJyYXlcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc2V0TWF0cml4QXJyYXlUeXBlKHR5cGUpIHtcbiAgQVJSQVlfVFlQRSA9IHR5cGU7XG59XG52YXIgZGVncmVlID0gTWF0aC5QSSAvIDE4MDtcbi8qKlxuICogQ29udmVydCBEZWdyZWUgVG8gUmFkaWFuXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IGEgQW5nbGUgaW4gRGVncmVlc1xuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB0b1JhZGlhbihhKSB7XG4gIHJldHVybiBhICogZGVncmVlO1xufVxuLyoqXG4gKiBUZXN0cyB3aGV0aGVyIG9yIG5vdCB0aGUgYXJndW1lbnRzIGhhdmUgYXBwcm94aW1hdGVseSB0aGUgc2FtZSB2YWx1ZSwgd2l0aGluIGFuIGFic29sdXRlXG4gKiBvciByZWxhdGl2ZSB0b2xlcmFuY2Ugb2YgZ2xNYXRyaXguRVBTSUxPTiAoYW4gYWJzb2x1dGUgdG9sZXJhbmNlIGlzIHVzZWQgZm9yIHZhbHVlcyBsZXNzXG4gKiB0aGFuIG9yIGVxdWFsIHRvIDEuMCwgYW5kIGEgcmVsYXRpdmUgdG9sZXJhbmNlIGlzIHVzZWQgZm9yIGxhcmdlciB2YWx1ZXMpXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IGEgVGhlIGZpcnN0IG51bWJlciB0byB0ZXN0LlxuICogQHBhcmFtIHtOdW1iZXJ9IGIgVGhlIHNlY29uZCBudW1iZXIgdG8gdGVzdC5cbiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSBudW1iZXJzIGFyZSBhcHByb3hpbWF0ZWx5IGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGVxdWFscyhhLCBiKSB7XG4gIHJldHVybiBNYXRoLmFicyhhIC0gYikgPD0gRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYSksIE1hdGguYWJzKGIpKTtcbn1cbmlmICghTWF0aC5oeXBvdCkgTWF0aC5oeXBvdCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHkgPSAwLFxuICAgICAgaSA9IGFyZ3VtZW50cy5sZW5ndGg7XG5cbiAgd2hpbGUgKGktLSkge1xuICAgIHkgKz0gYXJndW1lbnRzW2ldICogYXJndW1lbnRzW2ldO1xuICB9XG5cbiAgcmV0dXJuIE1hdGguc3FydCh5KTtcbn07Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///12\n')},function(module,__webpack_exports__,__webpack_require__){"use strict";eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return IDENTIFIER; });\nvar IDENTIFIER = {\n // SceneGraph\n HierarchyComponentManager: Symbol('HierarchyComponentManager'),\n TransformComponentManager: Symbol('TransformComponentManager'),\n NameComponentManager: Symbol('NameComponentManager'),\n SceneGraphSystem: Symbol('SceneGraphSystem'),\n // FrameGraph\n FrameGraphSystem: Symbol('FrameGraphSystem'),\n ResourcePool: Symbol('ResourcePool'),\n ResourceHandleComponentManager: Symbol('ResourceHandleComponentManager'),\n PassNodeComponentManager: Symbol('PassNodeComponentManager'),\n // Renderer\n RendererSystem: Symbol('RendererSystem'),\n RenderPass: Symbol('RenderPass'),\n RenderPassFactory: Symbol('Factory'),\n Renderable: Symbol('Factory'),\n // Mesh\n MeshSystem: Symbol('MeshSystem'),\n MeshComponentManager: Symbol('MeshComponentManager'),\n CullableComponentManager: Symbol('CullableComponentManager'),\n // Geometry\n Geometry: Symbol('Geometry'),\n GeometrySystem: Symbol('GeometrySystem'),\n GeometryComponentManager: Symbol('GeometryComponentManager'),\n // Material\n Material: Symbol('Material'),\n MaterialSystem: Symbol('MaterialSystem'),\n MaterialComponentManager: Symbol('MaterialComponentManager'),\n // RenderPath\n ForwardRenderPath: Symbol('ForwardRenderPath'),\n // ComputeSystem\n ComputeSystem: Symbol('ComputeSystem'),\n ComputeComponentManager: Symbol('ComputeComponentManager'),\n ComputeStrategy: Symbol('ComputeStrategy'),\n Systems: Symbol('Systems'),\n World: Symbol('World'),\n // RenderEngine\n RenderEngine: Symbol('RenderEngine'),\n WebGPUEngine: Symbol('WebGPUEngine'),\n WebGLEngine: Symbol('WebGLEngine'),\n // Shader Module\n ShaderModuleService: Symbol('ShaderModuleService'),\n ConfigService: Symbol('ConfigService'),\n InteractorService: Symbol('InteractorService'),\n IEventEmitter: Symbol('IEventEmitter'),\n // Light\n Light: Symbol('Light')\n};\n//# sourceMappingURL=identifier.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy13ZWJncHUtY29yZS9lcy9pZGVudGlmaWVyLmpzP2ZhZTEiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiIxMy5qcyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB2YXIgSURFTlRJRklFUiA9IHtcbiAgLy8gU2NlbmVHcmFwaFxuICBIaWVyYXJjaHlDb21wb25lbnRNYW5hZ2VyOiBTeW1ib2woJ0hpZXJhcmNoeUNvbXBvbmVudE1hbmFnZXInKSxcbiAgVHJhbnNmb3JtQ29tcG9uZW50TWFuYWdlcjogU3ltYm9sKCdUcmFuc2Zvcm1Db21wb25lbnRNYW5hZ2VyJyksXG4gIE5hbWVDb21wb25lbnRNYW5hZ2VyOiBTeW1ib2woJ05hbWVDb21wb25lbnRNYW5hZ2VyJyksXG4gIFNjZW5lR3JhcGhTeXN0ZW06IFN5bWJvbCgnU2NlbmVHcmFwaFN5c3RlbScpLFxuICAvLyBGcmFtZUdyYXBoXG4gIEZyYW1lR3JhcGhTeXN0ZW06IFN5bWJvbCgnRnJhbWVHcmFwaFN5c3RlbScpLFxuICBSZXNvdXJjZVBvb2w6IFN5bWJvbCgnUmVzb3VyY2VQb29sJyksXG4gIFJlc291cmNlSGFuZGxlQ29tcG9uZW50TWFuYWdlcjogU3ltYm9sKCdSZXNvdXJjZUhhbmRsZUNvbXBvbmVudE1hbmFnZXInKSxcbiAgUGFzc05vZGVDb21wb25lbnRNYW5hZ2VyOiBTeW1ib2woJ1Bhc3NOb2RlQ29tcG9uZW50TWFuYWdlcicpLFxuICAvLyBSZW5kZXJlclxuICBSZW5kZXJlclN5c3RlbTogU3ltYm9sKCdSZW5kZXJlclN5c3RlbScpLFxuICBSZW5kZXJQYXNzOiBTeW1ib2woJ1JlbmRlclBhc3MnKSxcbiAgUmVuZGVyUGFzc0ZhY3Rvcnk6IFN5bWJvbCgnRmFjdG9yeTxJUmVuZGVyUGFzcz4nKSxcbiAgUmVuZGVyYWJsZTogU3ltYm9sKCdGYWN0b3J5PElSZW5kZXJQYXNzPicpLFxuICAvLyBNZXNoXG4gIE1lc2hTeXN0ZW06IFN5bWJvbCgnTWVzaFN5c3RlbScpLFxuICBNZXNoQ29tcG9uZW50TWFuYWdlcjogU3ltYm9sKCdNZXNoQ29tcG9uZW50TWFuYWdlcicpLFxuICBDdWxsYWJsZUNvbXBvbmVudE1hbmFnZXI6IFN5bWJvbCgnQ3VsbGFibGVDb21wb25lbnRNYW5hZ2VyJyksXG4gIC8vIEdlb21ldHJ5XG4gIEdlb21ldHJ5OiBTeW1ib2woJ0dlb21ldHJ5JyksXG4gIEdlb21ldHJ5U3lzdGVtOiBTeW1ib2woJ0dlb21ldHJ5U3lzdGVtJyksXG4gIEdlb21ldHJ5Q29tcG9uZW50TWFuYWdlcjogU3ltYm9sKCdHZW9tZXRyeUNvbXBvbmVudE1hbmFnZXInKSxcbiAgLy8gTWF0ZXJpYWxcbiAgTWF0ZXJpYWw6IFN5bWJvbCgnTWF0ZXJpYWwnKSxcbiAgTWF0ZXJpYWxTeXN0ZW06IFN5bWJvbCgnTWF0ZXJpYWxTeXN0ZW0nKSxcbiAgTWF0ZXJpYWxDb21wb25lbnRNYW5hZ2VyOiBTeW1ib2woJ01hdGVyaWFsQ29tcG9uZW50TWFuYWdlcicpLFxuICAvLyBSZW5kZXJQYXRoXG4gIEZvcndhcmRSZW5kZXJQYXRoOiBTeW1ib2woJ0ZvcndhcmRSZW5kZXJQYXRoJyksXG4gIC8vIENvbXB1dGVTeXN0ZW1cbiAgQ29tcHV0ZVN5c3RlbTogU3ltYm9sKCdDb21wdXRlU3lzdGVtJyksXG4gIENvbXB1dGVDb21wb25lbnRNYW5hZ2VyOiBTeW1ib2woJ0NvbXB1dGVDb21wb25lbnRNYW5hZ2VyJyksXG4gIENvbXB1dGVTdHJhdGVneTogU3ltYm9sKCdDb21wdXRlU3RyYXRlZ3knKSxcbiAgU3lzdGVtczogU3ltYm9sKCdTeXN0ZW1zJyksXG4gIFdvcmxkOiBTeW1ib2woJ1dvcmxkJyksXG4gIC8vIFJlbmRlckVuZ2luZVxuICBSZW5kZXJFbmdpbmU6IFN5bWJvbCgnUmVuZGVyRW5naW5lJyksXG4gIFdlYkdQVUVuZ2luZTogU3ltYm9sKCdXZWJHUFVFbmdpbmUnKSxcbiAgV2ViR0xFbmdpbmU6IFN5bWJvbCgnV2ViR0xFbmdpbmUnKSxcbiAgLy8gU2hhZGVyIE1vZHVsZVxuICBTaGFkZXJNb2R1bGVTZXJ2aWNlOiBTeW1ib2woJ1NoYWRlck1vZHVsZVNlcnZpY2UnKSxcbiAgQ29uZmlnU2VydmljZTogU3ltYm9sKCdDb25maWdTZXJ2aWNlJyksXG4gIEludGVyYWN0b3JTZXJ2aWNlOiBTeW1ib2woJ0ludGVyYWN0b3JTZXJ2aWNlJyksXG4gIElFdmVudEVtaXR0ZXI6IFN5bWJvbCgnSUV2ZW50RW1pdHRlcicpLFxuICAvLyBMaWdodFxuICBMaWdodDogU3ltYm9sKCdMaWdodCcpXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aWRlbnRpZmllci5qcy5tYXAiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///13\n")},function(module,__webpack_exports__,__webpack_require__){"use strict";eval('// ESM COMPAT FLAG\n__webpack_require__.r(__webpack_exports__);\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, "mat3", function() { return /* reexport */ esm["a" /* mat3 */]; });\n__webpack_require__.d(__webpack_exports__, "vec2", function() { return /* reexport */ esm["d" /* vec2 */]; });\n__webpack_require__.d(__webpack_exports__, "vec3", function() { return /* reexport */ esm["e" /* vec3 */]; });\n__webpack_require__.d(__webpack_exports__, "ext", function() { return /* reexport */ ext_namespaceObject; });\n\n// NAMESPACE OBJECT: ./node_modules/@antv/matrix-util/esm/ext.js\nvar ext_namespaceObject = {};\n__webpack_require__.r(ext_namespaceObject);\n__webpack_require__.d(ext_namespaceObject, "leftTranslate", function() { return leftTranslate; });\n__webpack_require__.d(ext_namespaceObject, "leftRotate", function() { return leftRotate; });\n__webpack_require__.d(ext_namespaceObject, "leftScale", function() { return leftScale; });\n__webpack_require__.d(ext_namespaceObject, "transform", function() { return transform; });\n__webpack_require__.d(ext_namespaceObject, "direction", function() { return direction; });\n__webpack_require__.d(ext_namespaceObject, "angleTo", function() { return angleTo; });\n__webpack_require__.d(ext_namespaceObject, "vertical", function() { return vertical; });\n\n// EXTERNAL MODULE: ./node_modules/gl-matrix/esm/index.js + 4 modules\nvar esm = __webpack_require__(2);\n\n// CONCATENATED MODULE: ./node_modules/@antv/matrix-util/esm/ext.js\n/**\n * @description 扩展方法,提供 gl-matrix 为提供的方法\n * */\n\nfunction leftTranslate(out, a, v) {\n var transMat = [0, 0, 0, 0, 0, 0, 0, 0, 0];\n esm["a" /* mat3 */].fromTranslation(transMat, v);\n return esm["a" /* mat3 */].multiply(out, transMat, a);\n}\nfunction leftRotate(out, a, rad) {\n var rotateMat = [0, 0, 0, 0, 0, 0, 0, 0, 0];\n esm["a" /* mat3 */].fromRotation(rotateMat, rad);\n return esm["a" /* mat3 */].multiply(out, rotateMat, a);\n}\nfunction leftScale(out, a, v) {\n var scaleMat = [0, 0, 0, 0, 0, 0, 0, 0, 0];\n esm["a" /* mat3 */].fromScaling(scaleMat, v);\n return esm["a" /* mat3 */].multiply(out, scaleMat, a);\n}\nfunction leftMultiply(out, a, a1) {\n return esm["a" /* mat3 */].multiply(out, a1, a);\n}\n/**\n * 根据 actions 来做 transform\n * @param m\n * @param actions\n */\nfunction transform(m, actions) {\n var matrix = m ? [].concat(m) : [1, 0, 0, 0, 1, 0, 0, 0, 1];\n for (var i = 0, len = actions.length; i < len; i++) {\n var action = actions[i];\n switch (action[0]) {\n case \'t\':\n leftTranslate(matrix, matrix, [action[1], action[2]]);\n break;\n case \'s\':\n leftScale(matrix, matrix, [action[1], action[2]]);\n break;\n case \'r\':\n leftRotate(matrix, matrix, action[1]);\n break;\n case \'m\':\n leftMultiply(matrix, matrix, action[1]);\n break;\n default:\n break;\n }\n }\n return matrix;\n}\n/**\n * 向量 v1 到 向量 v2 夹角的方向\n * @param {Array} v1 向量\n * @param {Array} v2 向量\n * @return {Boolean} >= 0 顺时针 < 0 逆时针\n */\nfunction direction(v1, v2) {\n return v1[0] * v2[1] - v2[0] * v1[1];\n}\n/**\n * 二维向量 v1 到 v2 的夹角\n * @param v1\n * @param v2\n * @param direct\n */\nfunction angleTo(v1, v2, direct) {\n var ang = esm["d" /* vec2 */].angle(v1, v2);\n var angleLargeThanPI = direction(v1, v2) >= 0;\n if (direct) {\n if (angleLargeThanPI) {\n return Math.PI * 2 - ang;\n }\n return ang;\n }\n if (angleLargeThanPI) {\n return ang;\n }\n return Math.PI * 2 - ang;\n}\n/**\n * 计算二维向量的垂直向量\n * @param out\n * @param v\n * @param flag\n */\nfunction vertical(out, v, flag) {\n if (flag) {\n out[0] = v[1];\n out[1] = -1 * v[0];\n }\n else {\n out[0] = -1 * v[1];\n out[1] = v[0];\n }\n return out;\n}\n//# sourceMappingURL=ext.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/matrix-util/esm/index.js\n\n\n\n//# sourceMappingURL=index.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvbWF0cml4LXV0aWwvZXNtL2V4dC5qcz9iZmU2Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9tYXRyaXgtdXRpbC9lc20vaW5kZXguanM/ZTg5NyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDdUM7QUFDaEM7QUFDUDtBQUNBLElBQUksbUJBQUk7QUFDUixXQUFXLG1CQUFJO0FBQ2Y7QUFDTztBQUNQO0FBQ0EsSUFBSSxtQkFBSTtBQUNSLFdBQVcsbUJBQUk7QUFDZjtBQUNPO0FBQ1A7QUFDQSxJQUFJLG1CQUFJO0FBQ1IsV0FBVyxtQkFBSTtBQUNmO0FBQ0E7QUFDQSxXQUFXLG1CQUFJO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBLHlDQUF5QyxTQUFTO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxNQUFNO0FBQ2xCLFlBQVksTUFBTTtBQUNsQixZQUFZLFFBQVE7QUFDcEI7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQLGNBQWMsbUJBQUk7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCOztBQ2hHNkM7QUFDaEI7QUFDSTtBQUNqQyIsImZpbGUiOiIxNC5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGRlc2NyaXB0aW9uIOaJqeWxleaWueazle+8jOaPkOS+myBnbC1tYXRyaXgg5Li65o+Q5L6b55qE5pa55rOVXG4gKiAqL1xuaW1wb3J0IHsgbWF0MywgdmVjMiB9IGZyb20gJ2dsLW1hdHJpeCc7XG5leHBvcnQgZnVuY3Rpb24gbGVmdFRyYW5zbGF0ZShvdXQsIGEsIHYpIHtcbiAgICB2YXIgdHJhbnNNYXQgPSBbMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMF07XG4gICAgbWF0My5mcm9tVHJhbnNsYXRpb24odHJhbnNNYXQsIHYpO1xuICAgIHJldHVybiBtYXQzLm11bHRpcGx5KG91dCwgdHJhbnNNYXQsIGEpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGxlZnRSb3RhdGUob3V0LCBhLCByYWQpIHtcbiAgICB2YXIgcm90YXRlTWF0ID0gWzAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDBdO1xuICAgIG1hdDMuZnJvbVJvdGF0aW9uKHJvdGF0ZU1hdCwgcmFkKTtcbiAgICByZXR1cm4gbWF0My5tdWx0aXBseShvdXQsIHJvdGF0ZU1hdCwgYSk7XG59XG5leHBvcnQgZnVuY3Rpb24gbGVmdFNjYWxlKG91dCwgYSwgdikge1xuICAgIHZhciBzY2FsZU1hdCA9IFswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwXTtcbiAgICBtYXQzLmZyb21TY2FsaW5nKHNjYWxlTWF0LCB2KTtcbiAgICByZXR1cm4gbWF0My5tdWx0aXBseShvdXQsIHNjYWxlTWF0LCBhKTtcbn1cbmZ1bmN0aW9uIGxlZnRNdWx0aXBseShvdXQsIGEsIGExKSB7XG4gICAgcmV0dXJuIG1hdDMubXVsdGlwbHkob3V0LCBhMSwgYSk7XG59XG4vKipcbiAqIOagueaNriBhY3Rpb25zIOadpeWBmiB0cmFuc2Zvcm1cbiAqIEBwYXJhbSBtXG4gKiBAcGFyYW0gYWN0aW9uc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNmb3JtKG0sIGFjdGlvbnMpIHtcbiAgICB2YXIgbWF0cml4ID0gbSA/IFtdLmNvbmNhdChtKSA6IFsxLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAxXTtcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gYWN0aW9ucy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICB2YXIgYWN0aW9uID0gYWN0aW9uc1tpXTtcbiAgICAgICAgc3dpdGNoIChhY3Rpb25bMF0pIHtcbiAgICAgICAgICAgIGNhc2UgJ3QnOlxuICAgICAgICAgICAgICAgIGxlZnRUcmFuc2xhdGUobWF0cml4LCBtYXRyaXgsIFthY3Rpb25bMV0sIGFjdGlvblsyXV0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAncyc6XG4gICAgICAgICAgICAgICAgbGVmdFNjYWxlKG1hdHJpeCwgbWF0cml4LCBbYWN0aW9uWzFdLCBhY3Rpb25bMl1dKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3InOlxuICAgICAgICAgICAgICAgIGxlZnRSb3RhdGUobWF0cml4LCBtYXRyaXgsIGFjdGlvblsxXSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdtJzpcbiAgICAgICAgICAgICAgICBsZWZ0TXVsdGlwbHkobWF0cml4LCBtYXRyaXgsIGFjdGlvblsxXSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtYXRyaXg7XG59XG4vKipcbiAqIOWQkemHjyB2MSDliLAg5ZCR6YePIHYyIOWkueinkueahOaWueWQkVxuICogQHBhcmFtICB7QXJyYXl9IHYxIOWQkemHj1xuICogQHBhcmFtICB7QXJyYXl9IHYyIOWQkemHj1xuICogQHJldHVybiB7Qm9vbGVhbn0gPj0gMCDpobrml7bpkoggPCAwIOmAhuaXtumSiFxuICovXG5leHBvcnQgZnVuY3Rpb24gZGlyZWN0aW9uKHYxLCB2Mikge1xuICAgIHJldHVybiB2MVswXSAqIHYyWzFdIC0gdjJbMF0gKiB2MVsxXTtcbn1cbi8qKlxuICog5LqM57u05ZCR6YePIHYxIOWIsCB2MiDnmoTlpLnop5JcbiAqIEBwYXJhbSB2MVxuICogQHBhcmFtIHYyXG4gKiBAcGFyYW0gZGlyZWN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhbmdsZVRvKHYxLCB2MiwgZGlyZWN0KSB7XG4gICAgdmFyIGFuZyA9IHZlYzIuYW5nbGUodjEsIHYyKTtcbiAgICB2YXIgYW5nbGVMYXJnZVRoYW5QSSA9IGRpcmVjdGlvbih2MSwgdjIpID49IDA7XG4gICAgaWYgKGRpcmVjdCkge1xuICAgICAgICBpZiAoYW5nbGVMYXJnZVRoYW5QSSkge1xuICAgICAgICAgICAgcmV0dXJuIE1hdGguUEkgKiAyIC0gYW5nO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhbmc7XG4gICAgfVxuICAgIGlmIChhbmdsZUxhcmdlVGhhblBJKSB7XG4gICAgICAgIHJldHVybiBhbmc7XG4gICAgfVxuICAgIHJldHVybiBNYXRoLlBJICogMiAtIGFuZztcbn1cbi8qKlxuICog6K6h566X5LqM57u05ZCR6YeP55qE5Z6C55u05ZCR6YePXG4gKiBAcGFyYW0gb3V0XG4gKiBAcGFyYW0gdlxuICogQHBhcmFtIGZsYWdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZlcnRpY2FsKG91dCwgdiwgZmxhZykge1xuICAgIGlmIChmbGFnKSB7XG4gICAgICAgIG91dFswXSA9IHZbMV07XG4gICAgICAgIG91dFsxXSA9IC0xICogdlswXTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIG91dFswXSA9IC0xICogdlsxXTtcbiAgICAgICAgb3V0WzFdID0gdlswXTtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWV4dC5qcy5tYXAiLCJpbXBvcnQgeyBtYXQzLCB2ZWMyLCB2ZWMzIH0gZnJvbSAnZ2wtbWF0cml4JztcbmltcG9ydCAqIGFzIGV4dCBmcm9tICcuL2V4dCc7XG5leHBvcnQgeyBtYXQzLCB2ZWMyLCB2ZWMzLCBleHQgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///14\n')},function(module,exports){eval('function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {\n try {\n var info = gen[key](arg);\n var value = info.value;\n } catch (error) {\n reject(error);\n return;\n }\n\n if (info.done) {\n resolve(value);\n } else {\n Promise.resolve(value).then(_next, _throw);\n }\n}\n\nfunction _asyncToGenerator(fn) {\n return function () {\n var self = this,\n args = arguments;\n return new Promise(function (resolve, reject) {\n var gen = fn.apply(self, args);\n\n function _next(value) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);\n }\n\n function _throw(err) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);\n }\n\n _next(undefined);\n });\n };\n}\n\nmodule.exports = _asyncToGenerator;\nmodule.exports["default"] = module.exports, module.exports.__esModule = true;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hc3luY1RvR2VuZXJhdG9yLmpzP2M5NzMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQSIsImZpbGUiOiIxNS5qcyIsInNvdXJjZXNDb250ZW50IjpbImZ1bmN0aW9uIGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywga2V5LCBhcmcpIHtcbiAgdHJ5IHtcbiAgICB2YXIgaW5mbyA9IGdlbltrZXldKGFyZyk7XG4gICAgdmFyIHZhbHVlID0gaW5mby52YWx1ZTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZWplY3QoZXJyb3IpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChpbmZvLmRvbmUpIHtcbiAgICByZXNvbHZlKHZhbHVlKTtcbiAgfSBlbHNlIHtcbiAgICBQcm9taXNlLnJlc29sdmUodmFsdWUpLnRoZW4oX25leHQsIF90aHJvdyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2FzeW5jVG9HZW5lcmF0b3IoZm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXMsXG4gICAgICAgIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIHZhciBnZW4gPSBmbi5hcHBseShzZWxmLCBhcmdzKTtcblxuICAgICAgZnVuY3Rpb24gX25leHQodmFsdWUpIHtcbiAgICAgICAgYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCBcIm5leHRcIiwgdmFsdWUpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBfdGhyb3coZXJyKSB7XG4gICAgICAgIGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywgXCJ0aHJvd1wiLCBlcnIpO1xuICAgICAgfVxuXG4gICAgICBfbmV4dCh1bmRlZmluZWQpO1xuICAgIH0pO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9hc3luY1RvR2VuZXJhdG9yO1xubW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHMsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///15\n')},function(module,__webpack_exports__,__webpack_require__){"use strict";eval('/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "d", function() { return getPixelRatio; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return distance; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "e", function() { return inBox; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "f", function() { return intersectRect; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "l", function() { return mergeRegion; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "j", function() { return isSamePoint; });\n/* harmony import */ var _antv_util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(0);\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "i", function() { return _antv_util__WEBPACK_IMPORTED_MODULE_0__["isNil"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "k", function() { return _antv_util__WEBPACK_IMPORTED_MODULE_0__["isString"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "h", function() { return _antv_util__WEBPACK_IMPORTED_MODULE_0__["isFunction"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "g", function() { return _antv_util__WEBPACK_IMPORTED_MODULE_0__["isArray"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "c", function() { return _antv_util__WEBPACK_IMPORTED_MODULE_0__["each"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "o", function() { return _antv_util__WEBPACK_IMPORTED_MODULE_0__["toRadian"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "m", function() { return _antv_util__WEBPACK_IMPORTED_MODULE_0__["mod"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "n", function() { return _antv_util__WEBPACK_IMPORTED_MODULE_0__["requestAnimationFrame"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "a", function() { return _antv_util__WEBPACK_IMPORTED_MODULE_0__["clearAnimationFrame"]; });\n\nfunction getPixelRatio() {\n return window ? window.devicePixelRatio : 1;\n}\n/**\n * 两点之间的距离\n * @param {number} x1 起始点 x\n * @param {number} y1 起始点 y\n * @param {number} x2 结束点 x\n * @param {number} y2 结束点 y\n */\nfunction distance(x1, y1, x2, y2) {\n var dx = x1 - x2;\n var dy = y1 - y2;\n return Math.sqrt(dx * dx + dy * dy);\n}\n/**\n * 是否在包围盒内\n * @param {number} minX 包围盒开始的点 x\n * @param {number} minY 包围盒开始的点 y\n * @param {number} width 宽度\n * @param {number} height 高度\n * @param {[type]} x 检测点的 x\n * @param {[type]} y 监测点的 y\n */\nfunction inBox(minX, minY, width, height, x, y) {\n return x >= minX && x <= minX + width && y >= minY && y <= minY + height;\n}\nfunction intersectRect(box1, box2) {\n return !(box2.minX > box1.maxX || box2.maxX < box1.minX || box2.minY > box1.maxY || box2.maxY < box1.minY);\n}\n// 合并两个区域\nfunction mergeRegion(region1, region2) {\n if (!region1 || !region2) {\n return region1 || region2;\n }\n return {\n minX: Math.min(region1.minX, region2.minX),\n minY: Math.min(region1.minY, region2.minY),\n maxX: Math.max(region1.maxX, region2.maxX),\n maxY: Math.max(region1.maxY, region2.maxY),\n };\n}\n/**\n * 判断两个点是否重合,点坐标的格式为 [x, y]\n * @param {Array} point1 第一个点\n * @param {Array} point2 第二个点\n */\nfunction isSamePoint(point1, point2) {\n return point1[0] === point2[0] && point1[1] === point2[1];\n}\n\n//# sourceMappingURL=util.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy1jYW52YXMvZXNtL3V0aWwvdXRpbC5qcz83MzI2Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQjtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEI7QUFDTztBQUNQO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxNQUFNO0FBQ2pCLFdBQVcsTUFBTTtBQUNqQjtBQUNPO0FBQ1A7QUFDQTtBQUNtSjtBQUNuSiIsImZpbGUiOiIxNi5qcyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBmdW5jdGlvbiBnZXRQaXhlbFJhdGlvKCkge1xuICAgIHJldHVybiB3aW5kb3cgPyB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyA6IDE7XG59XG4vKipcbiAqIOS4pOeCueS5i+mXtOeahOi3neemu1xuICogQHBhcmFtIHtudW1iZXJ9IHgxIOi1t+Wni+eCuSB4XG4gKiBAcGFyYW0ge251bWJlcn0geTEg6LW35aeL54K5IHlcbiAqIEBwYXJhbSB7bnVtYmVyfSB4MiDnu5PmnZ/ngrkgeFxuICogQHBhcmFtIHtudW1iZXJ9IHkyIOe7k+adn+eCuSB5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaXN0YW5jZSh4MSwgeTEsIHgyLCB5Mikge1xuICAgIHZhciBkeCA9IHgxIC0geDI7XG4gICAgdmFyIGR5ID0geTEgLSB5MjtcbiAgICByZXR1cm4gTWF0aC5zcXJ0KGR4ICogZHggKyBkeSAqIGR5KTtcbn1cbi8qKlxuICog5piv5ZCm5Zyo5YyF5Zu055uS5YaFXG4gKiBAcGFyYW0ge251bWJlcn0gbWluWCAgIOWMheWbtOebkuW8gOWni+eahOeCuSB4XG4gKiBAcGFyYW0ge251bWJlcn0gbWluWSAgIOWMheWbtOebkuW8gOWni+eahOeCuSB5XG4gKiBAcGFyYW0ge251bWJlcn0gd2lkdGggIOWuveW6plxuICogQHBhcmFtIHtudW1iZXJ9IGhlaWdodCDpq5jluqZcbiAqIEBwYXJhbSB7W3R5cGVdfSB4ICAgICAg5qOA5rWL54K555qEIHhcbiAqIEBwYXJhbSB7W3R5cGVdfSB5ICAgICAg55uR5rWL54K555qEIHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluQm94KG1pblgsIG1pblksIHdpZHRoLCBoZWlnaHQsIHgsIHkpIHtcbiAgICByZXR1cm4geCA+PSBtaW5YICYmIHggPD0gbWluWCArIHdpZHRoICYmIHkgPj0gbWluWSAmJiB5IDw9IG1pblkgKyBoZWlnaHQ7XG59XG5leHBvcnQgZnVuY3Rpb24gaW50ZXJzZWN0UmVjdChib3gxLCBib3gyKSB7XG4gICAgcmV0dXJuICEoYm94Mi5taW5YID4gYm94MS5tYXhYIHx8IGJveDIubWF4WCA8IGJveDEubWluWCB8fCBib3gyLm1pblkgPiBib3gxLm1heFkgfHwgYm94Mi5tYXhZIDwgYm94MS5taW5ZKTtcbn1cbi8vIOWQiOW5tuS4pOS4quWMuuWfn1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlUmVnaW9uKHJlZ2lvbjEsIHJlZ2lvbjIpIHtcbiAgICBpZiAoIXJlZ2lvbjEgfHwgIXJlZ2lvbjIpIHtcbiAgICAgICAgcmV0dXJuIHJlZ2lvbjEgfHwgcmVnaW9uMjtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbWluWDogTWF0aC5taW4ocmVnaW9uMS5taW5YLCByZWdpb24yLm1pblgpLFxuICAgICAgICBtaW5ZOiBNYXRoLm1pbihyZWdpb24xLm1pblksIHJlZ2lvbjIubWluWSksXG4gICAgICAgIG1heFg6IE1hdGgubWF4KHJlZ2lvbjEubWF4WCwgcmVnaW9uMi5tYXhYKSxcbiAgICAgICAgbWF4WTogTWF0aC5tYXgocmVnaW9uMS5tYXhZLCByZWdpb24yLm1heFkpLFxuICAgIH07XG59XG4vKipcbiAqIOWIpOaWreS4pOS4queCueaYr+WQpumHjeWQiO+8jOeCueWdkOagh+eahOagvOW8j+S4uiBbeCwgeV1cbiAqIEBwYXJhbSB7QXJyYXl9IHBvaW50MSDnrKzkuIDkuKrngrlcbiAqIEBwYXJhbSB7QXJyYXl9IHBvaW50MiDnrKzkuozkuKrngrlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU2FtZVBvaW50KHBvaW50MSwgcG9pbnQyKSB7XG4gICAgcmV0dXJuIHBvaW50MVswXSA9PT0gcG9pbnQyWzBdICYmIHBvaW50MVsxXSA9PT0gcG9pbnQyWzFdO1xufVxuZXhwb3J0IHsgaXNOaWwsIGlzU3RyaW5nLCBpc0Z1bmN0aW9uLCBpc0FycmF5LCBlYWNoLCB0b1JhZGlhbiwgbW9kLCBpc051bWJlckVxdWFsLCByZXF1ZXN0QW5pbWF0aW9uRnJhbWUsIGNsZWFyQW5pbWF0aW9uRnJhbWUsIH0gZnJvbSAnQGFudHYvdXRpbCc7XG4vLyMgc291cmNlTWFwcGluZ1VSTD11dGlsLmpzLm1hcCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///16\n')},function(module,__webpack_exports__,__webpack_require__){"use strict";eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return SHAPE_TO_TAGS; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return SVG_ATTR_MAP; });\n/* unused harmony export EVENTS */\nvar SHAPE_TO_TAGS = {\n rect: 'path',\n circle: 'circle',\n line: 'line',\n path: 'path',\n marker: 'path',\n text: 'text',\n polyline: 'polyline',\n polygon: 'polygon',\n image: 'image',\n ellipse: 'ellipse',\n dom: 'foreignObject',\n};\nvar SVG_ATTR_MAP = {\n opacity: 'opacity',\n fillStyle: 'fill',\n fill: 'fill',\n fillOpacity: 'fill-opacity',\n strokeStyle: 'stroke',\n strokeOpacity: 'stroke-opacity',\n stroke: 'stroke',\n x: 'x',\n y: 'y',\n r: 'r',\n rx: 'rx',\n ry: 'ry',\n width: 'width',\n height: 'height',\n x1: 'x1',\n x2: 'x2',\n y1: 'y1',\n y2: 'y2',\n lineCap: 'stroke-linecap',\n lineJoin: 'stroke-linejoin',\n lineWidth: 'stroke-width',\n lineDash: 'stroke-dasharray',\n lineDashOffset: 'stroke-dashoffset',\n miterLimit: 'stroke-miterlimit',\n font: 'font',\n fontSize: 'font-size',\n fontStyle: 'font-style',\n fontVariant: 'font-variant',\n fontWeight: 'font-weight',\n fontFamily: 'font-family',\n startArrow: 'marker-start',\n endArrow: 'marker-end',\n path: 'd',\n class: 'class',\n id: 'id',\n style: 'style',\n preserveAspectRatio: 'preserveAspectRatio',\n};\nvar EVENTS = [\n 'click',\n 'mousedown',\n 'mouseup',\n 'dblclick',\n 'contextmenu',\n 'mouseenter',\n 'mouseleave',\n 'mouseover',\n 'mouseout',\n 'mousemove',\n 'wheel',\n];\n//# sourceMappingURL=constant.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy1zdmcvZXNtL2NvbnN0YW50LmpzPzIyZjkiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6IjE3LmpzIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHZhciBTSEFQRV9UT19UQUdTID0ge1xuICAgIHJlY3Q6ICdwYXRoJyxcbiAgICBjaXJjbGU6ICdjaXJjbGUnLFxuICAgIGxpbmU6ICdsaW5lJyxcbiAgICBwYXRoOiAncGF0aCcsXG4gICAgbWFya2VyOiAncGF0aCcsXG4gICAgdGV4dDogJ3RleHQnLFxuICAgIHBvbHlsaW5lOiAncG9seWxpbmUnLFxuICAgIHBvbHlnb246ICdwb2x5Z29uJyxcbiAgICBpbWFnZTogJ2ltYWdlJyxcbiAgICBlbGxpcHNlOiAnZWxsaXBzZScsXG4gICAgZG9tOiAnZm9yZWlnbk9iamVjdCcsXG59O1xuZXhwb3J0IHZhciBTVkdfQVRUUl9NQVAgPSB7XG4gICAgb3BhY2l0eTogJ29wYWNpdHknLFxuICAgIGZpbGxTdHlsZTogJ2ZpbGwnLFxuICAgIGZpbGw6ICdmaWxsJyxcbiAgICBmaWxsT3BhY2l0eTogJ2ZpbGwtb3BhY2l0eScsXG4gICAgc3Ryb2tlU3R5bGU6ICdzdHJva2UnLFxuICAgIHN0cm9rZU9wYWNpdHk6ICdzdHJva2Utb3BhY2l0eScsXG4gICAgc3Ryb2tlOiAnc3Ryb2tlJyxcbiAgICB4OiAneCcsXG4gICAgeTogJ3knLFxuICAgIHI6ICdyJyxcbiAgICByeDogJ3J4JyxcbiAgICByeTogJ3J5JyxcbiAgICB3aWR0aDogJ3dpZHRoJyxcbiAgICBoZWlnaHQ6ICdoZWlnaHQnLFxuICAgIHgxOiAneDEnLFxuICAgIHgyOiAneDInLFxuICAgIHkxOiAneTEnLFxuICAgIHkyOiAneTInLFxuICAgIGxpbmVDYXA6ICdzdHJva2UtbGluZWNhcCcsXG4gICAgbGluZUpvaW46ICdzdHJva2UtbGluZWpvaW4nLFxuICAgIGxpbmVXaWR0aDogJ3N0cm9rZS13aWR0aCcsXG4gICAgbGluZURhc2g6ICdzdHJva2UtZGFzaGFycmF5JyxcbiAgICBsaW5lRGFzaE9mZnNldDogJ3N0cm9rZS1kYXNob2Zmc2V0JyxcbiAgICBtaXRlckxpbWl0OiAnc3Ryb2tlLW1pdGVybGltaXQnLFxuICAgIGZvbnQ6ICdmb250JyxcbiAgICBmb250U2l6ZTogJ2ZvbnQtc2l6ZScsXG4gICAgZm9udFN0eWxlOiAnZm9udC1zdHlsZScsXG4gICAgZm9udFZhcmlhbnQ6ICdmb250LXZhcmlhbnQnLFxuICAgIGZvbnRXZWlnaHQ6ICdmb250LXdlaWdodCcsXG4gICAgZm9udEZhbWlseTogJ2ZvbnQtZmFtaWx5JyxcbiAgICBzdGFydEFycm93OiAnbWFya2VyLXN0YXJ0JyxcbiAgICBlbmRBcnJvdzogJ21hcmtlci1lbmQnLFxuICAgIHBhdGg6ICdkJyxcbiAgICBjbGFzczogJ2NsYXNzJyxcbiAgICBpZDogJ2lkJyxcbiAgICBzdHlsZTogJ3N0eWxlJyxcbiAgICBwcmVzZXJ2ZUFzcGVjdFJhdGlvOiAncHJlc2VydmVBc3BlY3RSYXRpbycsXG59O1xuZXhwb3J0IHZhciBFVkVOVFMgPSBbXG4gICAgJ2NsaWNrJyxcbiAgICAnbW91c2Vkb3duJyxcbiAgICAnbW91c2V1cCcsXG4gICAgJ2RibGNsaWNrJyxcbiAgICAnY29udGV4dG1lbnUnLFxuICAgICdtb3VzZWVudGVyJyxcbiAgICAnbW91c2VsZWF2ZScsXG4gICAgJ21vdXNlb3ZlcicsXG4gICAgJ21vdXNlb3V0JyxcbiAgICAnbW91c2Vtb3ZlJyxcbiAgICAnd2hlZWwnLFxuXTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbnN0YW50LmpzLm1hcCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///17\n")},function(module,exports){eval('function _getPrototypeOf(o) {\n module.exports = _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n return o.__proto__ || Object.getPrototypeOf(o);\n };\n module.exports["default"] = module.exports, module.exports.__esModule = true;\n return _getPrototypeOf(o);\n}\n\nmodule.exports = _getPrototypeOf;\nmodule.exports["default"] = module.exports, module.exports.__esModule = true;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9nZXRQcm90b3R5cGVPZi5qcz8zNmM2Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EiLCJmaWxlIjoiMTguanMiLCJzb3VyY2VzQ29udGVudCI6WyJmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2Yobykge1xuICBtb2R1bGUuZXhwb3J0cyA9IF9nZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5nZXRQcm90b3R5cGVPZiA6IGZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7XG4gICAgcmV0dXJuIG8uX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihvKTtcbiAgfTtcbiAgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHMsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuICByZXR1cm4gX2dldFByb3RvdHlwZU9mKG8pO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9nZXRQcm90b3R5cGVPZjtcbm1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///18\n')},function(module,__webpack_exports__,__webpack_require__){"use strict";eval('/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "j", function() { return removeFromArray; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return isBrowser; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "g", function() { return isParent; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return isAllowCapture; });\n/* harmony import */ var _antv_util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(0);\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "e", function() { return _antv_util__WEBPACK_IMPORTED_MODULE_0__["isNil"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "d", function() { return _antv_util__WEBPACK_IMPORTED_MODULE_0__["isFunction"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "h", function() { return _antv_util__WEBPACK_IMPORTED_MODULE_0__["isString"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "f", function() { return _antv_util__WEBPACK_IMPORTED_MODULE_0__["isObject"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "i", function() { return _antv_util__WEBPACK_IMPORTED_MODULE_0__["mix"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "a", function() { return _antv_util__WEBPACK_IMPORTED_MODULE_0__["each"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "k", function() { return _antv_util__WEBPACK_IMPORTED_MODULE_0__["upperFirst"]; });\n\nfunction removeFromArray(arr, obj) {\n var index = arr.indexOf(obj);\n if (index !== -1) {\n arr.splice(index, 1);\n }\n}\nvar isBrowser = typeof window !== \'undefined\' && typeof window.document !== \'undefined\';\n\n// 是否元素的父容器\nfunction isParent(container, shape) {\n // 所有 shape 都是 canvas 的子元素\n if (container.isCanvas()) {\n return true;\n }\n var parent = shape.getParent();\n var isParent = false;\n while (parent) {\n if (parent === container) {\n isParent = true;\n break;\n }\n parent = parent.getParent();\n }\n return isParent;\n}\nfunction isAllowCapture(element) {\n // @ts-ignore\n return element.cfg.visible && element.cfg.capture;\n}\n//# sourceMappingURL=util.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy1iYXNlL2VzbS91dGlsL3V0aWwuanM/YjJjYiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQzRGO0FBQ25HO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6IjE5LmpzIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUZyb21BcnJheShhcnIsIG9iaikge1xuICAgIHZhciBpbmRleCA9IGFyci5pbmRleE9mKG9iaik7XG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICBhcnIuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG59XG5leHBvcnQgdmFyIGlzQnJvd3NlciA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiB3aW5kb3cuZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnO1xuZXhwb3J0IHsgaXNOaWwsIGlzRnVuY3Rpb24sIGlzU3RyaW5nLCBpc09iamVjdCwgaXNBcnJheSwgbWl4LCBlYWNoLCB1cHBlckZpcnN0IH0gZnJvbSAnQGFudHYvdXRpbCc7XG4vLyDmmK/lkKblhYPntKDnmoTniLblrrnlmahcbmV4cG9ydCBmdW5jdGlvbiBpc1BhcmVudChjb250YWluZXIsIHNoYXBlKSB7XG4gICAgLy8g5omA5pyJIHNoYXBlIOmDveaYryBjYW52YXMg55qE5a2Q5YWD57SgXG4gICAgaWYgKGNvbnRhaW5lci5pc0NhbnZhcygpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICB2YXIgcGFyZW50ID0gc2hhcGUuZ2V0UGFyZW50KCk7XG4gICAgdmFyIGlzUGFyZW50ID0gZmFsc2U7XG4gICAgd2hpbGUgKHBhcmVudCkge1xuICAgICAgICBpZiAocGFyZW50ID09PSBjb250YWluZXIpIHtcbiAgICAgICAgICAgIGlzUGFyZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnQoKTtcbiAgICB9XG4gICAgcmV0dXJuIGlzUGFyZW50O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzQWxsb3dDYXB0dXJlKGVsZW1lbnQpIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgcmV0dXJuIGVsZW1lbnQuY2ZnLnZpc2libGUgJiYgZWxlbWVudC5jZmcuY2FwdHVyZTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXV0aWwuanMubWFwIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///19\n')},function(module,__webpack_exports__,__webpack_require__){"use strict";eval('\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, "e", function() { return /* reexport */ quadratic; });\n__webpack_require__.d(__webpack_exports__, "b", function() { return /* reexport */ cubic; });\n__webpack_require__.d(__webpack_exports__, "a", function() { return /* reexport */ arc; });\n__webpack_require__.d(__webpack_exports__, "c", function() { return /* reexport */ line; });\n__webpack_require__.d(__webpack_exports__, "d", function() { return /* reexport */ polyline; });\n__webpack_require__.d(__webpack_exports__, "f", function() { return /* reexport */ util_namespaceObject; });\n\n// UNUSED EXPORTS: Polygon\n\n// NAMESPACE OBJECT: ./node_modules/@antv/g-math/esm/util.js\nvar util_namespaceObject = {};\n__webpack_require__.r(util_namespaceObject);\n__webpack_require__.d(util_namespaceObject, "distance", function() { return distance; });\n__webpack_require__.d(util_namespaceObject, "isNumberEqual", function() { return isNumberEqual; });\n__webpack_require__.d(util_namespaceObject, "getBBoxByArray", function() { return getBBoxByArray; });\n__webpack_require__.d(util_namespaceObject, "getBBoxRange", function() { return getBBoxRange; });\n__webpack_require__.d(util_namespaceObject, "piMod", function() { return piMod; });\n\n// CONCATENATED MODULE: ./node_modules/@antv/g-math/esm/util.js\nfunction minNum(array) {\n return Math.min.apply(null, array);\n}\nfunction maxNum(array) {\n return Math.max.apply(null, array);\n}\n/**\n * 两点之间的距离\n * @param {number} x1 起始点 x\n * @param {number} y1 起始点 y\n * @param {number} x2 结束点 x\n * @param {number} y2 结束点 y\n * @return {number} 距离\n */\nfunction distance(x1, y1, x2, y2) {\n var dx = x1 - x2;\n var dy = y1 - y2;\n return Math.sqrt(dx * dx + dy * dy);\n}\nfunction isNumberEqual(v1, v2) {\n return Math.abs(v1 - v2) < 0.001;\n}\nfunction getBBoxByArray(xArr, yArr) {\n var minX = minNum(xArr);\n var minY = minNum(yArr);\n var maxX = maxNum(xArr);\n var maxY = maxNum(yArr);\n return {\n x: minX,\n y: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n}\nfunction getBBoxRange(x1, y1, x2, y2) {\n return {\n minX: minNum([x1, x2]),\n maxX: maxNum([x1, x2]),\n minY: minNum([y1, y2]),\n maxY: maxNum([y1, y2]),\n };\n}\nfunction piMod(angle) {\n return (angle + Math.PI * 2) % (Math.PI * 2);\n}\n//# sourceMappingURL=util.js.map\n// EXTERNAL MODULE: ./node_modules/gl-matrix/esm/vec2.js\nvar vec2 = __webpack_require__(81);\n\n// CONCATENATED MODULE: ./node_modules/@antv/g-math/esm/line.js\n\n\n/* harmony default export */ var line = ({\n /**\n * 计算线段的包围盒\n * @param {number} x1 起始点 x\n * @param {number} y1 起始点 y\n * @param {number} x2 结束点 x\n * @param {number} y2 结束点 y\n * @return {object} 包围盒对象\n */\n box: function (x1, y1, x2, y2) {\n return getBBoxByArray([x1, x2], [y1, y2]);\n },\n /**\n * 线段的长度\n * @param {number} x1 起始点 x\n * @param {number} y1 起始点 y\n * @param {number} x2 结束点 x\n * @param {number} y2 结束点 y\n * @return {number} 距离\n */\n length: function (x1, y1, x2, y2) {\n return distance(x1, y1, x2, y2);\n },\n /**\n * 根据比例获取点\n * @param {number} x1 起始点 x\n * @param {number} y1 起始点 y\n * @param {number} x2 结束点 x\n * @param {number} y2 结束点 y\n * @param {number} t 指定比例\n * @return {object} 包含 x, y 的点\n */\n pointAt: function (x1, y1, x2, y2, t) {\n return {\n x: (1 - t) * x1 + t * x2,\n y: (1 - t) * y1 + t * y2,\n };\n },\n /**\n * 点到线段的距离\n * @param {number} x1 起始点 x\n * @param {number} y1 起始点 y\n * @param {number} x2 结束点 x\n * @param {number} y2 结束点 y\n * @param {number} x 测试点 x\n * @param {number} y 测试点 y\n * @return {number} 距离\n */\n pointDistance: function (x1, y1, x2, y2, x, y) {\n // 投影距离 x1, y1 的向量,假设 p, p1, p2 三个点,投影点为 a\n // p1a = p1p.p1p2/|p1p2| * (p1p 的单位向量)\n var cross = (x2 - x1) * (x - x1) + (y2 - y1) * (y - y1);\n if (cross < 0) {\n return distance(x1, y1, x, y);\n }\n var lengthSquare = (x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1);\n if (cross > lengthSquare) {\n return distance(x2, y2, x, y);\n }\n return this.pointToLine(x1, y1, x2, y2, x, y);\n },\n /**\n * 点到直线的距离,而不是点到线段的距离\n * @param {number} x1 起始点 x\n * @param {number} y1 起始点 y\n * @param {number} x2 结束点 x\n * @param {number} y2 结束点 y\n * @param {number} x 测试点 x\n * @param {number} y 测试点 y\n * @return {number} 距离\n */\n pointToLine: function (x1, y1, x2, y2, x, y) {\n var d = [x2 - x1, y2 - y1];\n // 如果端点相等,则判定点到点的距离\n if (vec2["exactEquals"](d, [0, 0])) {\n return Math.sqrt((x - x1) * (x - x1) + (y - y1) * (y - y1));\n }\n var u = [-d[1], d[0]];\n vec2["normalize"](u, u);\n var a = [x - x1, y - y1];\n return Math.abs(vec2["dot"](a, u));\n },\n /**\n * 线段的角度\n * @param {number} x1 起始点 x\n * @param {number} y1 起始点 y\n * @param {number} x2 结束点 x\n * @param {number} y2 结束点 y\n * @return {number} 导数\n */\n tangentAngle: function (x1, y1, x2, y2) {\n return Math.atan2(y2 - y1, x2 - x1);\n },\n});\n//# sourceMappingURL=line.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-math/esm/bezier.js\n\nvar EPSILON = 0.0001;\n/**\n * 使用牛顿切割法求最近的点\n * @param {number[]} xArr 点的 x 数组\n * @param {number[]} yArr 点的 y 数组\n * @param {number} x 指定的点 x\n * @param {number} y 指定的点 y\n * @param {Function} tCallback 差值函数\n */\nfunction bezier_nearestPoint(xArr, yArr, x, y, tCallback, length) {\n var t;\n var d = Infinity;\n var v0 = [x, y];\n var segNum = 20;\n if (length && length > 200) {\n segNum = length / 10;\n }\n var increaseRate = 1 / segNum;\n var interval = increaseRate / 10;\n for (var i = 0; i <= segNum; i++) {\n var _t = i * increaseRate;\n var v1 = [tCallback.apply(null, xArr.concat([_t])), tCallback.apply(null, yArr.concat([_t]))];\n var d1 = distance(v0[0], v0[1], v1[0], v1[1]);\n if (d1 < d) {\n t = _t;\n d = d1;\n }\n }\n // 提前终止\n if (t === 0) {\n return {\n x: xArr[0],\n y: yArr[0],\n };\n }\n if (t === 1) {\n var count = xArr.length;\n return {\n x: xArr[count - 1],\n y: yArr[count - 1],\n };\n }\n d = Infinity;\n for (var i = 0; i < 32; i++) {\n if (interval < EPSILON) {\n break;\n }\n var prev = t - interval;\n var next = t + interval;\n var v1 = [tCallback.apply(null, xArr.concat([prev])), tCallback.apply(null, yArr.concat([prev]))];\n var d1 = distance(v0[0], v0[1], v1[0], v1[1]);\n if (prev >= 0 && d1 < d) {\n t = prev;\n d = d1;\n }\n else {\n var v2 = [tCallback.apply(null, xArr.concat([next])), tCallback.apply(null, yArr.concat([next]))];\n var d2 = distance(v0[0], v0[1], v2[0], v2[1]);\n if (next <= 1 && d2 < d) {\n t = next;\n d = d2;\n }\n else {\n interval *= 0.5;\n }\n }\n }\n return {\n x: tCallback.apply(null, xArr.concat([t])),\n y: tCallback.apply(null, yArr.concat([t])),\n };\n}\n// 近似求解 https://community.khronos.org/t/3d-cubic-bezier-segment-length/62363/2\nfunction snapLength(xArr, yArr) {\n var totalLength = 0;\n var count = xArr.length;\n for (var i = 0; i < count; i++) {\n var x = xArr[i];\n var y = yArr[i];\n var nextX = xArr[(i + 1) % count];\n var nextY = yArr[(i + 1) % count];\n totalLength += distance(x, y, nextX, nextY);\n }\n return totalLength / 2;\n}\n//# sourceMappingURL=bezier.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-math/esm/quadratic.js\n\n\n\n// 差值公式\nfunction quadraticAt(p0, p1, p2, t) {\n var onet = 1 - t;\n return onet * onet * p0 + 2 * t * onet * p1 + t * t * p2;\n}\n// 求极值\nfunction extrema(p0, p1, p2) {\n var a = p0 + p2 - 2 * p1;\n if (isNumberEqual(a, 0)) {\n return [0.5];\n }\n var rst = (p0 - p1) / a;\n if (rst <= 1 && rst >= 0) {\n return [rst];\n }\n return [];\n}\nfunction derivativeAt(p0, p1, p2, t) {\n return 2 * (1 - t) * (p1 - p0) + 2 * t * (p2 - p1);\n}\n// 分割贝塞尔曲线\nfunction divideQuadratic(x1, y1, x2, y2, x3, y3, t) {\n // 划分点\n var xt = quadraticAt(x1, x2, x3, t);\n var yt = quadraticAt(y1, y2, y3, t);\n // 分割的第一条曲线的控制点\n var controlPoint1 = line.pointAt(x1, y1, x2, y2, t);\n // 分割的第二条曲线的控制点\n var controlPoint2 = line.pointAt(x2, y2, x3, y3, t);\n return [\n [x1, y1, controlPoint1.x, controlPoint1.y, xt, yt],\n [xt, yt, controlPoint2.x, controlPoint2.y, x3, y3],\n ];\n}\n// 使用迭代法取贝塞尔曲线的长度\nfunction quadraticLength(x1, y1, x2, y2, x3, y3, iterationCount) {\n if (iterationCount === 0) {\n return (distance(x1, y1, x2, y2) + distance(x2, y2, x3, y3) + distance(x1, y1, x3, y3)) / 2;\n }\n var quadratics = divideQuadratic(x1, y1, x2, y2, x3, y3, 0.5);\n var left = quadratics[0];\n var right = quadratics[1];\n left.push(iterationCount - 1);\n right.push(iterationCount - 1);\n return quadraticLength.apply(null, left) + quadraticLength.apply(null, right);\n}\n/* harmony default export */ var quadratic = ({\n box: function (x1, y1, x2, y2, x3, y3) {\n var xExtrema = extrema(x1, x2, x3)[0];\n var yExtrema = extrema(y1, y2, y3)[0];\n // 控制点不加入 box 的计算\n var xArr = [x1, x3];\n var yArr = [y1, y3];\n if (xExtrema !== undefined) {\n xArr.push(quadraticAt(x1, x2, x3, xExtrema));\n }\n if (yExtrema !== undefined) {\n yArr.push(quadraticAt(y1, y2, y3, yExtrema));\n }\n return getBBoxByArray(xArr, yArr);\n },\n length: function (x1, y1, x2, y2, x3, y3) {\n return quadraticLength(x1, y1, x2, y2, x3, y3, 3);\n },\n nearestPoint: function (x1, y1, x2, y2, x3, y3, x0, y0) {\n return bezier_nearestPoint([x1, x2, x3], [y1, y2, y3], x0, y0, quadraticAt);\n },\n pointDistance: function (x1, y1, x2, y2, x3, y3, x0, y0) {\n var point = this.nearestPoint(x1, y1, x2, y2, x3, y3, x0, y0);\n return distance(point.x, point.y, x0, y0);\n },\n interpolationAt: quadraticAt,\n pointAt: function (x1, y1, x2, y2, x3, y3, t) {\n return {\n x: quadraticAt(x1, x2, x3, t),\n y: quadraticAt(y1, y2, y3, t),\n };\n },\n divide: function (x1, y1, x2, y2, x3, y3, t) {\n return divideQuadratic(x1, y1, x2, y2, x3, y3, t);\n },\n tangentAngle: function (x1, y1, x2, y2, x3, y3, t) {\n var dx = derivativeAt(x1, x2, x3, t);\n var dy = derivativeAt(y1, y2, y3, t);\n var angle = Math.atan2(dy, dx);\n return piMod(angle);\n },\n});\n//# sourceMappingURL=quadratic.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-math/esm/cubic.js\n\n\n\nfunction cubicAt(p0, p1, p2, p3, t) {\n var onet = 1 - t; // t * t * t 的性能大概是 Math.pow(t, 3) 的三倍\n return onet * onet * onet * p0 + 3 * p1 * t * onet * onet + 3 * p2 * t * t * onet + p3 * t * t * t;\n}\nfunction cubic_derivativeAt(p0, p1, p2, p3, t) {\n var onet = 1 - t;\n return 3 * (onet * onet * (p1 - p0) + 2 * onet * t * (p2 - p1) + t * t * (p3 - p2));\n}\nfunction cubic_extrema(p0, p1, p2, p3) {\n var a = -3 * p0 + 9 * p1 - 9 * p2 + 3 * p3;\n var b = 6 * p0 - 12 * p1 + 6 * p2;\n var c = 3 * p1 - 3 * p0;\n var extremas = [];\n var t1;\n var t2;\n var discSqrt;\n if (isNumberEqual(a, 0)) {\n if (!isNumberEqual(b, 0)) {\n t1 = -c / b;\n if (t1 >= 0 && t1 <= 1) {\n extremas.push(t1);\n }\n }\n }\n else {\n var disc = b * b - 4 * a * c;\n if (isNumberEqual(disc, 0)) {\n extremas.push(-b / (2 * a));\n }\n else if (disc > 0) {\n discSqrt = Math.sqrt(disc);\n t1 = (-b + discSqrt) / (2 * a);\n t2 = (-b - discSqrt) / (2 * a);\n if (t1 >= 0 && t1 <= 1) {\n extremas.push(t1);\n }\n if (t2 >= 0 && t2 <= 1) {\n extremas.push(t2);\n }\n }\n }\n return extremas;\n}\n// 分割贝塞尔曲线\nfunction divideCubic(x1, y1, x2, y2, x3, y3, x4, y4, t) {\n // 划分点\n var xt = cubicAt(x1, x2, x3, x4, t);\n var yt = cubicAt(y1, y2, y3, y4, t);\n // 计算两点之间的差值点\n var c1 = line.pointAt(x1, y1, x2, y2, t);\n var c2 = line.pointAt(x2, y2, x3, y3, t);\n var c3 = line.pointAt(x3, y3, x4, y4, t);\n var c12 = line.pointAt(c1.x, c1.y, c2.x, c2.y, t);\n var c23 = line.pointAt(c2.x, c2.y, c3.x, c3.y, t);\n return [\n [x1, y1, c1.x, c1.y, c12.x, c12.y, xt, yt],\n [xt, yt, c23.x, c23.y, c3.x, c3.y, x4, y4],\n ];\n}\n// 使用迭代法取贝塞尔曲线的长度,二阶和三阶分开写,更清晰和便于调试\nfunction cubicLength(x1, y1, x2, y2, x3, y3, x4, y4, iterationCount) {\n if (iterationCount === 0) {\n return snapLength([x1, x2, x3, x4], [y1, y2, y3, y4]);\n }\n var cubics = divideCubic(x1, y1, x2, y2, x3, y3, x4, y4, 0.5);\n var left = cubics[0];\n var right = cubics[1];\n left.push(iterationCount - 1);\n right.push(iterationCount - 1);\n return cubicLength.apply(null, left) + cubicLength.apply(null, right);\n}\n/* harmony default export */ var cubic = ({\n extrema: cubic_extrema,\n box: function (x1, y1, x2, y2, x3, y3, x4, y4) {\n var xArr = [x1, x4];\n var yArr = [y1, y4];\n var xExtrema = cubic_extrema(x1, x2, x3, x4);\n var yExtrema = cubic_extrema(y1, y2, y3, y4);\n for (var i = 0; i < xExtrema.length; i++) {\n xArr.push(cubicAt(x1, x2, x3, x4, xExtrema[i]));\n }\n for (var i = 0; i < yExtrema.length; i++) {\n yArr.push(cubicAt(y1, y2, y3, y4, yExtrema[i]));\n }\n return getBBoxByArray(xArr, yArr);\n },\n length: function (x1, y1, x2, y2, x3, y3, x4, y4) {\n // 迭代三次,划分成 8 段求长度\n return cubicLength(x1, y1, x2, y2, x3, y3, x4, y4, 3);\n },\n nearestPoint: function (x1, y1, x2, y2, x3, y3, x4, y4, x0, y0, length) {\n return bezier_nearestPoint([x1, x2, x3, x4], [y1, y2, y3, y4], x0, y0, cubicAt, length);\n },\n pointDistance: function (x1, y1, x2, y2, x3, y3, x4, y4, x0, y0, length) {\n var point = this.nearestPoint(x1, y1, x2, y2, x3, y3, x4, y4, x0, y0, length);\n return distance(point.x, point.y, x0, y0);\n },\n interpolationAt: cubicAt,\n pointAt: function (x1, y1, x2, y2, x3, y3, x4, y4, t) {\n return {\n x: cubicAt(x1, x2, x3, x4, t),\n y: cubicAt(y1, y2, y3, y4, t),\n };\n },\n divide: function (x1, y1, x2, y2, x3, y3, x4, y4, t) {\n return divideCubic(x1, y1, x2, y2, x3, y3, x4, y4, t);\n },\n tangentAngle: function (x1, y1, x2, y2, x3, y3, x4, y4, t) {\n var dx = cubic_derivativeAt(x1, x2, x3, x4, t);\n var dy = cubic_derivativeAt(y1, y2, y3, y4, t);\n return piMod(Math.atan2(dy, dx));\n },\n});\n//# sourceMappingURL=cubic.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-math/esm/ellipse.js\n/**\n * @fileoverview 椭圆的一些计算,\n * - 周长计算参考:https://www.mathsisfun.com/geometry/ellipse-perimeter.html\n * - 距离计算参考:https://wet-robots.ghost.io/simple-method-for-distance-to-ellipse/\n * @author dxq613@gmail.com\n */\n\nfunction copysign(v1, v2) {\n var absv = Math.abs(v1);\n return v2 > 0 ? absv : absv * -1;\n}\n/* harmony default export */ var ellipse = ({\n /**\n * 包围盒计算\n * @param {number} x 椭圆中心 x\n * @param {number} y 椭圆中心 y\n * @param {number} rx 椭圆 x 方向半径\n * @param {number} ry 椭圆 y 方向半径\n * @return {object} 包围盒\n */\n box: function (x, y, rx, ry) {\n return {\n x: x - rx,\n y: y - ry,\n width: rx * 2,\n height: ry * 2,\n };\n },\n /**\n * 计算周长,使用近似法\n * @param {number} x 椭圆中心 x\n * @param {number} y 椭圆中心 y\n * @param {number} rx 椭圆 x 方向半径\n * @param {number} ry 椭圆 y 方向半径\n * @return {number} 椭圆周长\n */\n length: function (x, y, rx, ry) {\n return Math.PI * (3 * (rx + ry) - Math.sqrt((3 * rx + ry) * (rx + 3 * ry)));\n },\n /**\n * 距离椭圆最近的点\n * @param {number} x 椭圆中心 x\n * @param {number} y 椭圆中心 y\n * @param {number} rx 椭圆 x 方向半径\n * @param {number} ry 椭圆 y 方向半径\n * @param {number} x0 指定的点 x\n * @param {number} y0 指定的点 y\n * @return {object} 椭圆上距离指定点最近的点\n */\n nearestPoint: function (x, y, rx, ry, x0, y0) {\n var a = rx;\n var b = ry;\n // 假如椭圆半径为0则返回圆心\n if (a === 0 || b === 0) {\n return {\n x: x,\n y: y,\n };\n }\n // 转换成 0, 0 为中心的椭圆计算\n var relativeX = x0 - x;\n var relativeY = y0 - y;\n var px = Math.abs(relativeX);\n var py = Math.abs(relativeY);\n var squareA = a * a;\n var squareB = b * b;\n // const angle0 = Math.atan2(relativeY, relativeX);\n var t = Math.PI / 4;\n var nearestX; // 椭圆上的任一点\n var nearestY;\n // 迭代 4 次\n for (var i = 0; i < 4; i++) {\n nearestX = a * Math.cos(t);\n nearestY = b * Math.sin(t);\n var ex = ((squareA - squareB) * Math.pow(Math.cos(t), 3)) / a;\n var ey = ((squareB - squareA) * Math.pow(Math.sin(t), 3)) / b;\n var rx1 = nearestX - ex;\n var ry1 = nearestY - ey;\n var qx = px - ex;\n var qy = py - ey;\n var r = Math.hypot(ry1, rx1);\n var q = Math.hypot(qy, qx);\n var delta_c = r * Math.asin((rx1 * qy - ry1 * qx) / (r * q));\n var delta_t = delta_c / Math.sqrt(squareA + squareB - nearestX * nearestX - nearestY * nearestY);\n t += delta_t;\n t = Math.min(Math.PI / 2, Math.max(0, t));\n }\n return {\n x: x + copysign(nearestX, relativeX),\n y: y + copysign(nearestY, relativeY),\n };\n },\n /**\n * 点到椭圆最近的距离\n * @param {number} x 椭圆中心 x\n * @param {number} y 椭圆中心 y\n * @param {number} rx 椭圆 x 方向半径\n * @param {number} ry 椭圆 y 方向半径\n * @param {number} x0 指定的点 x\n * @param {number} y0 指定的点 y\n * @return {number} 点到椭圆的距离\n */\n pointDistance: function (x, y, rx, ry, x0, y0) {\n var nearestPoint = this.nearestPoint(x, y, rx, ry, x0, y0);\n return distance(nearestPoint.x, nearestPoint.y, x0, y0);\n },\n /**\n * 根据比例获取点\n * @param {number} x 椭圆中心 x\n * @param {number} y 椭圆中心 y\n * @param {number} rx 椭圆 x 方向半径\n * @param {number} ry 椭圆 y 方向半径\n * @param {number} t 指定比例,x轴方向为 0\n * @return {object} 点\n */\n pointAt: function (x, y, rx, ry, t) {\n var angle = 2 * Math.PI * t; // 按照角度进行计算,而不按照周长计算\n return {\n x: x + rx * Math.cos(angle),\n y: y + ry * Math.sin(angle),\n };\n },\n /**\n * 根据比例计算切线角度\n * @param {number} x 椭圆中心 x\n * @param {number} y 椭圆中心 y\n * @param {number} rx 椭圆 x 方向半径\n * @param {number} ry 椭圆 y 方向半径\n * @param {number} t 指定比例 0 - 1 之间,x轴方向为 0。在 0-1 范围之外是循环还是返回 null,还需要调整\n * @return {number} 角度,在 0 - 2PI 之间\n */\n tangentAngle: function (x, y, rx, ry, t) {\n var angle = 2 * Math.PI * t; // 按照角度进行计算,而不按照周长计算\n // 直接使用 x,y 的导数计算, x\' = -rx * sin(t); y\' = ry * cos(t);\n var tangentAngle = Math.atan2(ry * Math.cos(angle), -rx * Math.sin(angle));\n // 也可以使用指定点的切线方程计算,成本有些高\n // const point = this.pointAt(0, 0, rx, ry, t); // 椭圆的切线同椭圆的中心不相关\n // let tangentAngle = -1 * Math.atan((ry * ry * point.x) / (rx * rx * point.y));\n // if (angle >= 0 && angle <= Math.PI) {\n // tangentAngle += Math.PI;\n // }\n return piMod(tangentAngle);\n },\n});\n//# sourceMappingURL=ellipse.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-math/esm/arc.js\n\n\n// 偏导数 x\nfunction derivativeXAt(cx, cy, rx, ry, xRotation, startAngle, endAngle, angle) {\n return -1 * rx * Math.cos(xRotation) * Math.sin(angle) - ry * Math.sin(xRotation) * Math.cos(angle);\n}\n// 偏导数 y\nfunction derivativeYAt(cx, cy, rx, ry, xRotation, startAngle, endAngle, angle) {\n return -1 * rx * Math.sin(xRotation) * Math.sin(angle) + ry * Math.cos(xRotation) * Math.cos(angle);\n}\n// x 的极值\nfunction arc_xExtrema(rx, ry, xRotation) {\n return Math.atan((-ry / rx) * Math.tan(xRotation));\n}\n// y 的极值\nfunction arc_yExtrema(rx, ry, xRotation) {\n return Math.atan(ry / (rx * Math.tan(xRotation)));\n}\n// 根据角度求 x 坐标\nfunction xAt(cx, cy, rx, ry, xRotation, angle) {\n return rx * Math.cos(xRotation) * Math.cos(angle) - ry * Math.sin(xRotation) * Math.sin(angle) + cx;\n}\n// 根据角度求 y 坐标\nfunction yAt(cx, cy, rx, ry, xRotation, angle) {\n return rx * Math.sin(xRotation) * Math.cos(angle) + ry * Math.cos(xRotation) * Math.sin(angle) + cy;\n}\n// 获取点在椭圆上的角度\nfunction getAngle(rx, ry, x0, y0) {\n var angle = Math.atan2(y0 * rx, x0 * ry);\n // 转换到 0 - 2PI 内\n return (angle + Math.PI * 2) % (Math.PI * 2);\n}\n// 根据角度获取,x,y\nfunction getPoint(rx, ry, angle) {\n return {\n x: rx * Math.cos(angle),\n y: ry * Math.sin(angle),\n };\n}\n// 旋转\nfunction rotate(x, y, angle) {\n var cos = Math.cos(angle);\n var sin = Math.sin(angle);\n return [x * cos - y * sin, x * sin + y * cos];\n}\n/* harmony default export */ var arc = ({\n /**\n * 计算包围盒\n * @param {number} cx 圆心 x\n * @param {number} cy 圆心 y\n * @param {number} rx x 轴方向的半径\n * @param {number} ry y 轴方向的半径\n * @param {number} xRotation 旋转角度\n * @param {number} startAngle 起始角度\n * @param {number} endAngle 结束角度\n * @return {object} 包围盒对象\n */\n box: function (cx, cy, rx, ry, xRotation, startAngle, endAngle) {\n var xDim = arc_xExtrema(rx, ry, xRotation);\n var minX = Infinity;\n var maxX = -Infinity;\n var xs = [startAngle, endAngle];\n for (var i = -Math.PI * 2; i <= Math.PI * 2; i += Math.PI) {\n var xAngle = xDim + i;\n if (startAngle < endAngle) {\n if (startAngle < xAngle && xAngle < endAngle) {\n xs.push(xAngle);\n }\n }\n else {\n if (endAngle < xAngle && xAngle < startAngle) {\n xs.push(xAngle);\n }\n }\n }\n for (var i = 0; i < xs.length; i++) {\n var x = xAt(cx, cy, rx, ry, xRotation, xs[i]);\n if (x < minX) {\n minX = x;\n }\n if (x > maxX) {\n maxX = x;\n }\n }\n var yDim = arc_yExtrema(rx, ry, xRotation);\n var minY = Infinity;\n var maxY = -Infinity;\n var ys = [startAngle, endAngle];\n for (var i = -Math.PI * 2; i <= Math.PI * 2; i += Math.PI) {\n var yAngle = yDim + i;\n if (startAngle < endAngle) {\n if (startAngle < yAngle && yAngle < endAngle) {\n ys.push(yAngle);\n }\n }\n else {\n if (endAngle < yAngle && yAngle < startAngle) {\n ys.push(yAngle);\n }\n }\n }\n for (var i = 0; i < ys.length; i++) {\n var y = yAt(cx, cy, rx, ry, xRotation, ys[i]);\n if (y < minY) {\n minY = y;\n }\n if (y > maxY) {\n maxY = y;\n }\n }\n return {\n x: minX,\n y: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n },\n /**\n * 获取圆弧的长度,计算圆弧长度时不考虑旋转角度,\n * 仅跟 rx, ry, startAngle, endAngle 相关\n * @param {number} cx 圆心 x\n * @param {number} cy 圆心 y\n * @param {number} rx x 轴方向的半径\n * @param {number} ry y 轴方向的半径\n * @param {number} xRotation 旋转角度\n * @param {number} startAngle 起始角度\n * @param {number} endAngle 结束角度\n */\n length: function (cx, cy, rx, ry, xRotation, startAngle, endAngle) { },\n /**\n * 获取指定点到圆弧的最近距离的点\n * @param {number} cx 圆心 x\n * @param {number} cy 圆心 y\n * @param {number} rx x 轴方向的半径\n * @param {number} ry y 轴方向的半径\n * @param {number} xRotation 旋转角度\n * @param {number} startAngle 起始角度\n * @param {number} endAngle 结束角度\n * @param {number} x0 指定点的 x\n * @param {number} y0 指定点的 y\n * @return {object} 到指定点最近距离的点\n */\n nearestPoint: function (cx, cy, rx, ry, xRotation, startAngle, endAngle, x0, y0) {\n // 将最近距离问题转换成到椭圆中心 0,0 没有旋转的椭圆问题\n var relativeVector = rotate(x0 - cx, y0 - cy, -xRotation);\n var x1 = relativeVector[0], y1 = relativeVector[1];\n // 计算点到椭圆的最近的点\n var relativePoint = ellipse.nearestPoint(0, 0, rx, ry, x1, y1);\n // 获取点在椭圆上的角度\n var angle = getAngle(rx, ry, relativePoint.x, relativePoint.y);\n // 点没有在圆弧上\n if (angle < startAngle) {\n // 小于起始圆弧\n relativePoint = getPoint(rx, ry, startAngle);\n }\n else if (angle > endAngle) {\n // 大于结束圆弧\n relativePoint = getPoint(rx, ry, endAngle);\n }\n // 旋转到 xRotation 的角度\n var vector = rotate(relativePoint.x, relativePoint.y, xRotation);\n return {\n x: vector[0] + cx,\n y: vector[1] + cy,\n };\n },\n pointDistance: function (cx, cy, rx, ry, xRotation, startAngle, endAngle, x0, y0) {\n var nearestPoint = this.nearestPoint(cx, cy, rx, ry, x0, y0);\n return distance(nearestPoint.x, nearestPoint.y, x0, y0);\n },\n pointAt: function (cx, cy, rx, ry, xRotation, startAngle, endAngle, t) {\n var angle = (endAngle - startAngle) * t + startAngle;\n return {\n x: xAt(cx, cy, rx, ry, xRotation, angle),\n y: yAt(cx, cy, rx, ry, xRotation, angle),\n };\n },\n tangentAngle: function (cx, cy, rx, ry, xRotation, startAngle, endAngle, t) {\n var angle = (endAngle - startAngle) * t + startAngle;\n var dx = derivativeXAt(cx, cy, rx, ry, xRotation, startAngle, endAngle, angle);\n var dy = derivativeYAt(cx, cy, rx, ry, xRotation, startAngle, endAngle, angle);\n return piMod(Math.atan2(dy, dx));\n },\n});\n//# sourceMappingURL=arc.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-math/esm/segments.js\n\n\nfunction analyzePoints(points) {\n // 计算每段的长度和总的长度\n var totalLength = 0;\n var segments = [];\n for (var i = 0; i < points.length - 1; i++) {\n var from = points[i];\n var to = points[i + 1];\n var length_1 = distance(from[0], from[1], to[0], to[1]);\n var seg = {\n from: from,\n to: to,\n length: length_1,\n };\n segments.push(seg);\n totalLength += length_1;\n }\n return { segments: segments, totalLength: totalLength };\n}\nfunction lengthOfSegment(points) {\n if (points.length < 2) {\n return 0;\n }\n var totalLength = 0;\n for (var i = 0; i < points.length - 1; i++) {\n var from = points[i];\n var to = points[i + 1];\n totalLength += distance(from[0], from[1], to[0], to[1]);\n }\n return totalLength;\n}\n/**\n * 按照比例在数据片段中获取点\n * @param {array} points 点的集合\n * @param {number} t 百分比 0-1\n * @return {object} 点的坐标\n */\nfunction pointAtSegments(points, t) {\n // 边界判断\n if (t > 1 || t < 0 || points.length < 2) {\n return null;\n }\n var _a = analyzePoints(points), segments = _a.segments, totalLength = _a.totalLength;\n // 多个点有可能重合\n if (totalLength === 0) {\n return {\n x: points[0][0],\n y: points[0][1],\n };\n }\n // 计算比例\n var startRatio = 0;\n var point = null;\n for (var i = 0; i < segments.length; i++) {\n var seg = segments[i];\n var from = seg.from, to = seg.to;\n var currentRatio = seg.length / totalLength;\n if (t >= startRatio && t <= startRatio + currentRatio) {\n var localRatio = (t - startRatio) / currentRatio;\n point = line.pointAt(from[0], from[1], to[0], to[1], localRatio);\n break;\n }\n startRatio += currentRatio;\n }\n return point;\n}\n/**\n * 按照比例在数据片段中获取切线的角度\n * @param {array} points 点的集合\n * @param {number} t 百分比 0-1\n */\nfunction angleAtSegments(points, t) {\n // 边界判断\n if (t > 1 || t < 0 || points.length < 2) {\n return 0;\n }\n var _a = analyzePoints(points), segments = _a.segments, totalLength = _a.totalLength;\n // 计算比例\n var startRatio = 0;\n var angle = 0;\n for (var i = 0; i < segments.length; i++) {\n var seg = segments[i];\n var from = seg.from, to = seg.to;\n var currentRatio = seg.length / totalLength;\n if (t >= startRatio && t <= startRatio + currentRatio) {\n angle = Math.atan2(to[1] - from[1], to[0] - from[0]);\n break;\n }\n startRatio += currentRatio;\n }\n return angle;\n}\nfunction distanceAtSegment(points, x, y) {\n var minDistance = Infinity;\n for (var i = 0; i < points.length - 1; i++) {\n var point = points[i];\n var nextPoint = points[i + 1];\n var distance_1 = line.pointDistance(point[0], point[1], nextPoint[0], nextPoint[1], x, y);\n if (distance_1 < minDistance) {\n minDistance = distance_1;\n }\n }\n return minDistance;\n}\n//# sourceMappingURL=segments.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-math/esm/polyline.js\n\n\n/* harmony default export */ var polyline = ({\n /**\n * 计算多折线的包围盒\n * @param {array} points 点的集合 [x,y] 的形式\n * @return {object} 包围盒\n */\n box: function (points) {\n var xArr = [];\n var yArr = [];\n for (var i = 0; i < points.length; i++) {\n var point = points[i];\n xArr.push(point[0]);\n yArr.push(point[1]);\n }\n return getBBoxByArray(xArr, yArr);\n },\n /**\n * 计算多折线的长度\n * @param {array} points 点的集合 [x,y] 的形式\n * @return {object} 多条边的长度\n */\n length: function (points) {\n return lengthOfSegment(points);\n },\n /**\n * 根据比例获取多折线的点\n * @param {array} points 点的集合 [x,y] 的形式\n * @param {number} t 在多折线的长度上的比例\n * @return {object} 根据比例值计算出来的点\n */\n pointAt: function (points, t) {\n return pointAtSegments(points, t);\n },\n /**\n * 指定点到多折线的距离\n * @param {array} points 点的集合 [x,y] 的形式\n * @param {number} x 指定点的 x\n * @param {number} y 指定点的 y\n * @return {number} 点到多折线的距离\n */\n pointDistance: function (points, x, y) {\n return distanceAtSegment(points, x, y);\n },\n /**\n * 根据比例获取多折线的切线角度\n * @param {array} points 点的集合 [x,y] 的形式\n * @param {number} t 在多折线的长度上的比例\n * @return {object} 根据比例值计算出来的角度\n */\n tangentAngle: function (points, t) {\n return angleAtSegments(points, t);\n },\n});\n//# sourceMappingURL=polyline.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-math/esm/polygon.js\n\n\nfunction getAllPoints(points) {\n var tmp = points.slice(0);\n if (points.length) {\n tmp.push(points[0]);\n }\n return tmp;\n}\n/* harmony default export */ var polygon = ({\n /**\n * 计算多边形的包围盒\n * @param {array} points 点的集合 [x,y] 的形式\n * @return {object} 包围盒\n */\n box: function (points) {\n return polyline.box(points);\n },\n /**\n * 计算多边形的长度\n * @param {array} points 点的集合 [x,y] 的形式\n * @return {object} 多边形边的长度\n */\n length: function (points) {\n return lengthOfSegment(getAllPoints(points));\n },\n /**\n * 根据比例获取多边形的点\n * @param {array} points 点的集合 [x,y] 的形式\n * @param {number} t 在多边形的长度上的比例\n * @return {object} 根据比例值计算出来的点\n */\n pointAt: function (points, t) {\n return pointAtSegments(getAllPoints(points), t);\n },\n /**\n * 指定点到多边形的距离\n * @param {array} points 点的集合 [x,y] 的形式\n * @param {number} x 指定点的 x\n * @param {number} y 指定点的 y\n * @return {number} 点到多边形的距离\n */\n pointDistance: function (points, x, y) {\n return distanceAtSegment(getAllPoints(points), x, y);\n },\n /**\n * 根据比例获取多边形的切线角度\n * @param {array} points 点的集合 [x,y] 的形式\n * @param {number} t 在多边形的长度上的比例\n * @return {object} 根据比例值计算出来的角度\n */\n tangentAngle: function (points, t) {\n return angleAtSegments(getAllPoints(points), t);\n },\n});\n//# sourceMappingURL=polygon.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-math/esm/index.js\n\n\n\n\n\n\n\n\n//# sourceMappingURL=index.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy1tYXRoL2VzbS91dGlsLmpzPzRmNTMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2ctbWF0aC9lc20vbGluZS5qcz9mNzViIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9nLW1hdGgvZXNtL2Jlemllci5qcz9lYjQxIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9nLW1hdGgvZXNtL3F1YWRyYXRpYy5qcz82MWZlIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9nLW1hdGgvZXNtL2N1YmljLmpzPzY1ZDEiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2ctbWF0aC9lc20vZWxsaXBzZS5qcz9mMzc1Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9nLW1hdGgvZXNtL2FyYy5qcz9iZDAxIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9nLW1hdGgvZXNtL3NlZ21lbnRzLmpzPzIwZmUiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2ctbWF0aC9lc20vcG9seWxpbmUuanM/NDMyMCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy1tYXRoL2VzbS9wb2x5Z29uLmpzPzE5NTgiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2ctbWF0aC9lc20vaW5kZXguanM/MTE4MyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFlBQVksT0FBTztBQUNuQjtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDTztB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RUFBQztBQUNGLG9DOztBQ3ZEa0c7QUFDaEU7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDZTtBQUNmO0FBQ0E7QUFDQSxlQUFlLE1BQU07QUFDckIsZ0JBQWdCLE9BQU87QUFDdkI7QUFDQTtBQUNBLGVBQWUsUUFBUTtBQUN2QixLQUFLO0FBQ0w7QUFDQTtBQUNBLGVBQWUsTUFBTTtBQUNyQixnQkFBZ0IsT0FBTztBQUN2QjtBQUNBO0FBQ0EsZUFBZSxlQUFlO0FBQzlCLEtBQUs7QUFDTDtBQUNBO0FBQ0EsZUFBZSxNQUFNO0FBQ3JCLGVBQWUsT0FBTztBQUN0QixnQkFBZ0IsT0FBTztBQUN2QjtBQUNBO0FBQ0EsZUFBZSxlQUFlO0FBQzlCLEtBQUs7QUFDTDtBQUNBO0FBQ0EsZUFBZSxNQUFNO0FBQ3JCLGVBQWUsT0FBTztBQUN0QixlQUFlLE9BQU87QUFDdEIsZ0JBQWdCLE9BQU87QUFDdkI7QUFDQTtBQUNBLGVBQWUsaUJBQWlCO0FBQ2hDLEtBQUs7QUFDTDtBQUNBO0FBQ0EsZUFBZSxNQUFNO0FBQ3JCLGVBQWUsT0FBTztBQUN0QixnQkFBZ0IsT0FBTztBQUN2QjtBQUNBO0FBQ0EsZUFBZSxlQUFlO0FBQzlCLEtBQUs7QUFDTCxDQUFDLEVBQUM7QUFDRixtQzs7QUN2RCtCO0FBQ0g7QUFDSjtBQUNFO0FBQ007QUFDRTtBQUNIO0FBQzRCO0FBQzNEIiwiZmlsZSI6IjIwLmpzIiwic291cmNlc0NvbnRlbnQiOlsiZnVuY3Rpb24gbWluTnVtKGFycmF5KSB7XG4gICAgcmV0dXJuIE1hdGgubWluLmFwcGx5KG51bGwsIGFycmF5KTtcbn1cbmZ1bmN0aW9uIG1heE51bShhcnJheSkge1xuICAgIHJldHVybiBNYXRoLm1heC5hcHBseShudWxsLCBhcnJheSk7XG59XG4vKipcbiAqIOS4pOeCueS5i+mXtOeahOi3neemu1xuICogQHBhcmFtIHtudW1iZXJ9IHgxIOi1t+Wni+eCuSB4XG4gKiBAcGFyYW0ge251bWJlcn0geTEg6LW35aeL54K5IHlcbiAqIEBwYXJhbSB7bnVtYmVyfSB4MiDnu5PmnZ/ngrkgeFxuICogQHBhcmFtIHtudW1iZXJ9IHkyIOe7k+adn+eCuSB5XG4gKiBAcmV0dXJuIHtudW1iZXJ9IOi3neemu1xuICovXG5leHBvcnQgZnVuY3Rpb24gZGlzdGFuY2UoeDEsIHkxLCB4MiwgeTIpIHtcbiAgICB2YXIgZHggPSB4MSAtIHgyO1xuICAgIHZhciBkeSA9IHkxIC0geTI7XG4gICAgcmV0dXJuIE1hdGguc3FydChkeCAqIGR4ICsgZHkgKiBkeSk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNOdW1iZXJFcXVhbCh2MSwgdjIpIHtcbiAgICByZXR1cm4gTWF0aC5hYnModjEgLSB2MikgPCAwLjAwMTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRCQm94QnlBcnJheSh4QXJyLCB5QXJyKSB7XG4gICAgdmFyIG1pblggPSBtaW5OdW0oeEFycik7XG4gICAgdmFyIG1pblkgPSBtaW5OdW0oeUFycik7XG4gICAgdmFyIG1heFggPSBtYXhOdW0oeEFycik7XG4gICAgdmFyIG1heFkgPSBtYXhOdW0oeUFycik7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgeDogbWluWCxcbiAgICAgICAgeTogbWluWSxcbiAgICAgICAgd2lkdGg6IG1heFggLSBtaW5YLFxuICAgICAgICBoZWlnaHQ6IG1heFkgLSBtaW5ZLFxuICAgIH07XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0QkJveFJhbmdlKHgxLCB5MSwgeDIsIHkyKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbWluWDogbWluTnVtKFt4MSwgeDJdKSxcbiAgICAgICAgbWF4WDogbWF4TnVtKFt4MSwgeDJdKSxcbiAgICAgICAgbWluWTogbWluTnVtKFt5MSwgeTJdKSxcbiAgICAgICAgbWF4WTogbWF4TnVtKFt5MSwgeTJdKSxcbiAgICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIHBpTW9kKGFuZ2xlKSB7XG4gICAgcmV0dXJuIChhbmdsZSArIE1hdGguUEkgKiAyKSAlIChNYXRoLlBJICogMik7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD11dGlsLmpzLm1hcCIsImltcG9ydCB7IGRpc3RhbmNlLCBnZXRCQm94QnlBcnJheSB9IGZyb20gJy4vdXRpbCc7XG5pbXBvcnQgKiBhcyB2ZWMyIGZyb20gJ2dsLW1hdHJpeC92ZWMyJztcbmV4cG9ydCBkZWZhdWx0IHtcbiAgICAvKipcbiAgICAgKiDorqHnrpfnur/mrrXnmoTljIXlm7Tnm5JcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geDEg6LW35aeL54K5IHhcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geTEg6LW35aeL54K5IHlcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geDIg57uT5p2f54K5IHhcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geTIg57uT5p2f54K5IHlcbiAgICAgKiBAcmV0dXJuIHtvYmplY3R9IOWMheWbtOebkuWvueixoVxuICAgICAqL1xuICAgIGJveDogZnVuY3Rpb24gKHgxLCB5MSwgeDIsIHkyKSB7XG4gICAgICAgIHJldHVybiBnZXRCQm94QnlBcnJheShbeDEsIHgyXSwgW3kxLCB5Ml0pO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICog57q/5q6155qE6ZW/5bqmXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHgxIOi1t+Wni+eCuSB4XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHkxIOi1t+Wni+eCuSB5XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHgyIOe7k+adn+eCuSB4XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHkyIOe7k+adn+eCuSB5XG4gICAgICogQHJldHVybiB7bnVtYmVyfSDot53nprtcbiAgICAgKi9cbiAgICBsZW5ndGg6IGZ1bmN0aW9uICh4MSwgeTEsIHgyLCB5Mikge1xuICAgICAgICByZXR1cm4gZGlzdGFuY2UoeDEsIHkxLCB4MiwgeTIpO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICog5qC55o2u5q+U5L6L6I635Y+W54K5XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHgxIOi1t+Wni+eCuSB4XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHkxIOi1t+Wni+eCuSB5XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHgyIOe7k+adn+eCuSB4XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHkyIOe7k+adn+eCuSB5XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHQg5oyH5a6a5q+U5L6LXG4gICAgICogQHJldHVybiB7b2JqZWN0fSDljIXlkKsgeCwgeSDnmoTngrlcbiAgICAgKi9cbiAgICBwb2ludEF0OiBmdW5jdGlvbiAoeDEsIHkxLCB4MiwgeTIsIHQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHg6ICgxIC0gdCkgKiB4MSArIHQgKiB4MixcbiAgICAgICAgICAgIHk6ICgxIC0gdCkgKiB5MSArIHQgKiB5MixcbiAgICAgICAgfTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOeCueWIsOe6v+auteeahOi3neemu1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4MSDotbflp4vngrkgeFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5MSDotbflp4vngrkgeVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4MiDnu5PmnZ/ngrkgeFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5MiDnu5PmnZ/ngrkgeVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4ICDmtYvor5XngrkgeFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5ICDmtYvor5XngrkgeVxuICAgICAqIEByZXR1cm4ge251bWJlcn0g6Led56a7XG4gICAgICovXG4gICAgcG9pbnREaXN0YW5jZTogZnVuY3Rpb24gKHgxLCB5MSwgeDIsIHkyLCB4LCB5KSB7XG4gICAgICAgIC8vIOaKleW9sei3neemuyB4MSwgeTEg55qE5ZCR6YeP77yM5YGH6K6+IHAsIHAxLCBwMiDkuInkuKrngrnvvIzmipXlvbHngrnkuLogYVxuICAgICAgICAvLyBwMWEgPSBwMXAucDFwMi98cDFwMnwgKiAocDFwIOeahOWNleS9jeWQkemHjylcbiAgICAgICAgdmFyIGNyb3NzID0gKHgyIC0geDEpICogKHggLSB4MSkgKyAoeTIgLSB5MSkgKiAoeSAtIHkxKTtcbiAgICAgICAgaWYgKGNyb3NzIDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuIGRpc3RhbmNlKHgxLCB5MSwgeCwgeSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGxlbmd0aFNxdWFyZSA9ICh4MiAtIHgxKSAqICh4MiAtIHgxKSArICh5MiAtIHkxKSAqICh5MiAtIHkxKTtcbiAgICAgICAgaWYgKGNyb3NzID4gbGVuZ3RoU3F1YXJlKSB7XG4gICAgICAgICAgICByZXR1cm4gZGlzdGFuY2UoeDIsIHkyLCB4LCB5KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5wb2ludFRvTGluZSh4MSwgeTEsIHgyLCB5MiwgeCwgeSk7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDngrnliLDnm7Tnur/nmoTot53nprvvvIzogIzkuI3mmK/ngrnliLDnur/mrrXnmoTot53nprtcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geDEg6LW35aeL54K5IHhcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geTEg6LW35aeL54K5IHlcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geDIg57uT5p2f54K5IHhcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geTIg57uT5p2f54K5IHlcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geCAg5rWL6K+V54K5IHhcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geSAg5rWL6K+V54K5IHlcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IOi3neemu1xuICAgICAqL1xuICAgIHBvaW50VG9MaW5lOiBmdW5jdGlvbiAoeDEsIHkxLCB4MiwgeTIsIHgsIHkpIHtcbiAgICAgICAgdmFyIGQgPSBbeDIgLSB4MSwgeTIgLSB5MV07XG4gICAgICAgIC8vIOWmguaenOerr+eCueebuOetie+8jOWImeWIpOWumueCueWIsOeCueeahOi3neemu1xuICAgICAgICBpZiAodmVjMi5leGFjdEVxdWFscyhkLCBbMCwgMF0pKSB7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5zcXJ0KCh4IC0geDEpICogKHggLSB4MSkgKyAoeSAtIHkxKSAqICh5IC0geTEpKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdSA9IFstZFsxXSwgZFswXV07XG4gICAgICAgIHZlYzIubm9ybWFsaXplKHUsIHUpO1xuICAgICAgICB2YXIgYSA9IFt4IC0geDEsIHkgLSB5MV07XG4gICAgICAgIHJldHVybiBNYXRoLmFicyh2ZWMyLmRvdChhLCB1KSk7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDnur/mrrXnmoTop5LluqZcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geDEg6LW35aeL54K5IHhcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geTEg6LW35aeL54K5IHlcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geDIg57uT5p2f54K5IHhcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geTIg57uT5p2f54K5IHlcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IOWvvOaVsFxuICAgICAqL1xuICAgIHRhbmdlbnRBbmdsZTogZnVuY3Rpb24gKHgxLCB5MSwgeDIsIHkyKSB7XG4gICAgICAgIHJldHVybiBNYXRoLmF0YW4yKHkyIC0geTEsIHgyIC0geDEpO1xuICAgIH0sXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bGluZS5qcy5tYXAiLCJpbXBvcnQgeyBkaXN0YW5jZSB9IGZyb20gJy4vdXRpbCc7XG52YXIgRVBTSUxPTiA9IDAuMDAwMTtcbi8qKlxuICog5L2/55So54mb6aG/5YiH5Ymy5rOV5rGC5pyA6L+R55qE54K5XG4gKiBAcGFyYW0ge251bWJlcltdfSB4QXJyICAgICAg54K555qEIHgg5pWw57uEXG4gKiBAcGFyYW0ge251bWJlcltdfSB5QXJyICAgICAg54K555qEIHkg5pWw57uEXG4gKiBAcGFyYW0ge251bWJlcn0gICB4ICAgICAgICAg5oyH5a6a55qE54K5IHhcbiAqIEBwYXJhbSB7bnVtYmVyfSAgIHkgICAgICAgICDmjIflrprnmoTngrkgeVxuICogQHBhcmFtIHtGdW5jdGlvbn0gdENhbGxiYWNrIOW3ruWAvOWHveaVsFxuICovXG5leHBvcnQgZnVuY3Rpb24gbmVhcmVzdFBvaW50KHhBcnIsIHlBcnIsIHgsIHksIHRDYWxsYmFjaywgbGVuZ3RoKSB7XG4gICAgdmFyIHQ7XG4gICAgdmFyIGQgPSBJbmZpbml0eTtcbiAgICB2YXIgdjAgPSBbeCwgeV07XG4gICAgdmFyIHNlZ051bSA9IDIwO1xuICAgIGlmIChsZW5ndGggJiYgbGVuZ3RoID4gMjAwKSB7XG4gICAgICAgIHNlZ051bSA9IGxlbmd0aCAvIDEwO1xuICAgIH1cbiAgICB2YXIgaW5jcmVhc2VSYXRlID0gMSAvIHNlZ051bTtcbiAgICB2YXIgaW50ZXJ2YWwgPSBpbmNyZWFzZVJhdGUgLyAxMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8PSBzZWdOdW07IGkrKykge1xuICAgICAgICB2YXIgX3QgPSBpICogaW5jcmVhc2VSYXRlO1xuICAgICAgICB2YXIgdjEgPSBbdENhbGxiYWNrLmFwcGx5KG51bGwsIHhBcnIuY29uY2F0KFtfdF0pKSwgdENhbGxiYWNrLmFwcGx5KG51bGwsIHlBcnIuY29uY2F0KFtfdF0pKV07XG4gICAgICAgIHZhciBkMSA9IGRpc3RhbmNlKHYwWzBdLCB2MFsxXSwgdjFbMF0sIHYxWzFdKTtcbiAgICAgICAgaWYgKGQxIDwgZCkge1xuICAgICAgICAgICAgdCA9IF90O1xuICAgICAgICAgICAgZCA9IGQxO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIOaPkOWJjee7iOatolxuICAgIGlmICh0ID09PSAwKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB4OiB4QXJyWzBdLFxuICAgICAgICAgICAgeTogeUFyclswXSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgaWYgKHQgPT09IDEpIHtcbiAgICAgICAgdmFyIGNvdW50ID0geEFyci5sZW5ndGg7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB4OiB4QXJyW2NvdW50IC0gMV0sXG4gICAgICAgICAgICB5OiB5QXJyW2NvdW50IC0gMV0sXG4gICAgICAgIH07XG4gICAgfVxuICAgIGQgPSBJbmZpbml0eTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IDMyOyBpKyspIHtcbiAgICAgICAgaWYgKGludGVydmFsIDwgRVBTSUxPTikge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHByZXYgPSB0IC0gaW50ZXJ2YWw7XG4gICAgICAgIHZhciBuZXh0ID0gdCArIGludGVydmFsO1xuICAgICAgICB2YXIgdjEgPSBbdENhbGxiYWNrLmFwcGx5KG51bGwsIHhBcnIuY29uY2F0KFtwcmV2XSkpLCB0Q2FsbGJhY2suYXBwbHkobnVsbCwgeUFyci5jb25jYXQoW3ByZXZdKSldO1xuICAgICAgICB2YXIgZDEgPSBkaXN0YW5jZSh2MFswXSwgdjBbMV0sIHYxWzBdLCB2MVsxXSk7XG4gICAgICAgIGlmIChwcmV2ID49IDAgJiYgZDEgPCBkKSB7XG4gICAgICAgICAgICB0ID0gcHJldjtcbiAgICAgICAgICAgIGQgPSBkMTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHZhciB2MiA9IFt0Q2FsbGJhY2suYXBwbHkobnVsbCwgeEFyci5jb25jYXQoW25leHRdKSksIHRDYWxsYmFjay5hcHBseShudWxsLCB5QXJyLmNvbmNhdChbbmV4dF0pKV07XG4gICAgICAgICAgICB2YXIgZDIgPSBkaXN0YW5jZSh2MFswXSwgdjBbMV0sIHYyWzBdLCB2MlsxXSk7XG4gICAgICAgICAgICBpZiAobmV4dCA8PSAxICYmIGQyIDwgZCkge1xuICAgICAgICAgICAgICAgIHQgPSBuZXh0O1xuICAgICAgICAgICAgICAgIGQgPSBkMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGludGVydmFsICo9IDAuNTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICB4OiB0Q2FsbGJhY2suYXBwbHkobnVsbCwgeEFyci5jb25jYXQoW3RdKSksXG4gICAgICAgIHk6IHRDYWxsYmFjay5hcHBseShudWxsLCB5QXJyLmNvbmNhdChbdF0pKSxcbiAgICB9O1xufVxuLy8g6L+R5Ly85rGC6KejIGh0dHBzOi8vY29tbXVuaXR5Lmtocm9ub3Mub3JnL3QvM2QtY3ViaWMtYmV6aWVyLXNlZ21lbnQtbGVuZ3RoLzYyMzYzLzJcbmV4cG9ydCBmdW5jdGlvbiBzbmFwTGVuZ3RoKHhBcnIsIHlBcnIpIHtcbiAgICB2YXIgdG90YWxMZW5ndGggPSAwO1xuICAgIHZhciBjb3VudCA9IHhBcnIubGVuZ3RoO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xuICAgICAgICB2YXIgeCA9IHhBcnJbaV07XG4gICAgICAgIHZhciB5ID0geUFycltpXTtcbiAgICAgICAgdmFyIG5leHRYID0geEFyclsoaSArIDEpICUgY291bnRdO1xuICAgICAgICB2YXIgbmV4dFkgPSB5QXJyWyhpICsgMSkgJSBjb3VudF07XG4gICAgICAgIHRvdGFsTGVuZ3RoICs9IGRpc3RhbmNlKHgsIHksIG5leHRYLCBuZXh0WSk7XG4gICAgfVxuICAgIHJldHVybiB0b3RhbExlbmd0aCAvIDI7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1iZXppZXIuanMubWFwIiwiaW1wb3J0IGxpbmUgZnJvbSAnLi9saW5lJztcbmltcG9ydCB7IGRpc3RhbmNlLCBpc051bWJlckVxdWFsLCBnZXRCQm94QnlBcnJheSwgcGlNb2QgfSBmcm9tICcuL3V0aWwnO1xuaW1wb3J0IHsgbmVhcmVzdFBvaW50IH0gZnJvbSAnLi9iZXppZXInO1xuLy8g5beu5YC85YWs5byPXG5mdW5jdGlvbiBxdWFkcmF0aWNBdChwMCwgcDEsIHAyLCB0KSB7XG4gICAgdmFyIG9uZXQgPSAxIC0gdDtcbiAgICByZXR1cm4gb25ldCAqIG9uZXQgKiBwMCArIDIgKiB0ICogb25ldCAqIHAxICsgdCAqIHQgKiBwMjtcbn1cbi8vIOaxguaegeWAvFxuZnVuY3Rpb24gZXh0cmVtYShwMCwgcDEsIHAyKSB7XG4gICAgdmFyIGEgPSBwMCArIHAyIC0gMiAqIHAxO1xuICAgIGlmIChpc051bWJlckVxdWFsKGEsIDApKSB7XG4gICAgICAgIHJldHVybiBbMC41XTtcbiAgICB9XG4gICAgdmFyIHJzdCA9IChwMCAtIHAxKSAvIGE7XG4gICAgaWYgKHJzdCA8PSAxICYmIHJzdCA+PSAwKSB7XG4gICAgICAgIHJldHVybiBbcnN0XTtcbiAgICB9XG4gICAgcmV0dXJuIFtdO1xufVxuZnVuY3Rpb24gZGVyaXZhdGl2ZUF0KHAwLCBwMSwgcDIsIHQpIHtcbiAgICByZXR1cm4gMiAqICgxIC0gdCkgKiAocDEgLSBwMCkgKyAyICogdCAqIChwMiAtIHAxKTtcbn1cbi8vIOWIhuWJsui0neWhnuWwlOabsue6v1xuZnVuY3Rpb24gZGl2aWRlUXVhZHJhdGljKHgxLCB5MSwgeDIsIHkyLCB4MywgeTMsIHQpIHtcbiAgICAvLyDliJLliIbngrlcbiAgICB2YXIgeHQgPSBxdWFkcmF0aWNBdCh4MSwgeDIsIHgzLCB0KTtcbiAgICB2YXIgeXQgPSBxdWFkcmF0aWNBdCh5MSwgeTIsIHkzLCB0KTtcbiAgICAvLyDliIblibLnmoTnrKzkuIDmnaHmm7Lnur/nmoTmjqfliLbngrlcbiAgICB2YXIgY29udHJvbFBvaW50MSA9IGxpbmUucG9pbnRBdCh4MSwgeTEsIHgyLCB5MiwgdCk7XG4gICAgLy8g5YiG5Ymy55qE56ys5LqM5p2h5puy57q/55qE5o6n5Yi254K5XG4gICAgdmFyIGNvbnRyb2xQb2ludDIgPSBsaW5lLnBvaW50QXQoeDIsIHkyLCB4MywgeTMsIHQpO1xuICAgIHJldHVybiBbXG4gICAgICAgIFt4MSwgeTEsIGNvbnRyb2xQb2ludDEueCwgY29udHJvbFBvaW50MS55LCB4dCwgeXRdLFxuICAgICAgICBbeHQsIHl0LCBjb250cm9sUG9pbnQyLngsIGNvbnRyb2xQb2ludDIueSwgeDMsIHkzXSxcbiAgICBdO1xufVxuLy8g5L2/55So6L+t5Luj5rOV5Y+W6LSd5aGe5bCU5puy57q/55qE6ZW/5bqmXG5mdW5jdGlvbiBxdWFkcmF0aWNMZW5ndGgoeDEsIHkxLCB4MiwgeTIsIHgzLCB5MywgaXRlcmF0aW9uQ291bnQpIHtcbiAgICBpZiAoaXRlcmF0aW9uQ291bnQgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIChkaXN0YW5jZSh4MSwgeTEsIHgyLCB5MikgKyBkaXN0YW5jZSh4MiwgeTIsIHgzLCB5MykgKyBkaXN0YW5jZSh4MSwgeTEsIHgzLCB5MykpIC8gMjtcbiAgICB9XG4gICAgdmFyIHF1YWRyYXRpY3MgPSBkaXZpZGVRdWFkcmF0aWMoeDEsIHkxLCB4MiwgeTIsIHgzLCB5MywgMC41KTtcbiAgICB2YXIgbGVmdCA9IHF1YWRyYXRpY3NbMF07XG4gICAgdmFyIHJpZ2h0ID0gcXVhZHJhdGljc1sxXTtcbiAgICBsZWZ0LnB1c2goaXRlcmF0aW9uQ291bnQgLSAxKTtcbiAgICByaWdodC5wdXNoKGl0ZXJhdGlvbkNvdW50IC0gMSk7XG4gICAgcmV0dXJuIHF1YWRyYXRpY0xlbmd0aC5hcHBseShudWxsLCBsZWZ0KSArIHF1YWRyYXRpY0xlbmd0aC5hcHBseShudWxsLCByaWdodCk7XG59XG5leHBvcnQgZGVmYXVsdCB7XG4gICAgYm94OiBmdW5jdGlvbiAoeDEsIHkxLCB4MiwgeTIsIHgzLCB5Mykge1xuICAgICAgICB2YXIgeEV4dHJlbWEgPSBleHRyZW1hKHgxLCB4MiwgeDMpWzBdO1xuICAgICAgICB2YXIgeUV4dHJlbWEgPSBleHRyZW1hKHkxLCB5MiwgeTMpWzBdO1xuICAgICAgICAvLyDmjqfliLbngrnkuI3liqDlhaUgYm94IOeahOiuoeeul1xuICAgICAgICB2YXIgeEFyciA9IFt4MSwgeDNdO1xuICAgICAgICB2YXIgeUFyciA9IFt5MSwgeTNdO1xuICAgICAgICBpZiAoeEV4dHJlbWEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgeEFyci5wdXNoKHF1YWRyYXRpY0F0KHgxLCB4MiwgeDMsIHhFeHRyZW1hKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHlFeHRyZW1hICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHlBcnIucHVzaChxdWFkcmF0aWNBdCh5MSwgeTIsIHkzLCB5RXh0cmVtYSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBnZXRCQm94QnlBcnJheSh4QXJyLCB5QXJyKTtcbiAgICB9LFxuICAgIGxlbmd0aDogZnVuY3Rpb24gKHgxLCB5MSwgeDIsIHkyLCB4MywgeTMpIHtcbiAgICAgICAgcmV0dXJuIHF1YWRyYXRpY0xlbmd0aCh4MSwgeTEsIHgyLCB5MiwgeDMsIHkzLCAzKTtcbiAgICB9LFxuICAgIG5lYXJlc3RQb2ludDogZnVuY3Rpb24gKHgxLCB5MSwgeDIsIHkyLCB4MywgeTMsIHgwLCB5MCkge1xuICAgICAgICByZXR1cm4gbmVhcmVzdFBvaW50KFt4MSwgeDIsIHgzXSwgW3kxLCB5MiwgeTNdLCB4MCwgeTAsIHF1YWRyYXRpY0F0KTtcbiAgICB9LFxuICAgIHBvaW50RGlzdGFuY2U6IGZ1bmN0aW9uICh4MSwgeTEsIHgyLCB5MiwgeDMsIHkzLCB4MCwgeTApIHtcbiAgICAgICAgdmFyIHBvaW50ID0gdGhpcy5uZWFyZXN0UG9pbnQoeDEsIHkxLCB4MiwgeTIsIHgzLCB5MywgeDAsIHkwKTtcbiAgICAgICAgcmV0dXJuIGRpc3RhbmNlKHBvaW50LngsIHBvaW50LnksIHgwLCB5MCk7XG4gICAgfSxcbiAgICBpbnRlcnBvbGF0aW9uQXQ6IHF1YWRyYXRpY0F0LFxuICAgIHBvaW50QXQ6IGZ1bmN0aW9uICh4MSwgeTEsIHgyLCB5MiwgeDMsIHkzLCB0KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB4OiBxdWFkcmF0aWNBdCh4MSwgeDIsIHgzLCB0KSxcbiAgICAgICAgICAgIHk6IHF1YWRyYXRpY0F0KHkxLCB5MiwgeTMsIHQpLFxuICAgICAgICB9O1xuICAgIH0sXG4gICAgZGl2aWRlOiBmdW5jdGlvbiAoeDEsIHkxLCB4MiwgeTIsIHgzLCB5MywgdCkge1xuICAgICAgICByZXR1cm4gZGl2aWRlUXVhZHJhdGljKHgxLCB5MSwgeDIsIHkyLCB4MywgeTMsIHQpO1xuICAgIH0sXG4gICAgdGFuZ2VudEFuZ2xlOiBmdW5jdGlvbiAoeDEsIHkxLCB4MiwgeTIsIHgzLCB5MywgdCkge1xuICAgICAgICB2YXIgZHggPSBkZXJpdmF0aXZlQXQoeDEsIHgyLCB4MywgdCk7XG4gICAgICAgIHZhciBkeSA9IGRlcml2YXRpdmVBdCh5MSwgeTIsIHkzLCB0KTtcbiAgICAgICAgdmFyIGFuZ2xlID0gTWF0aC5hdGFuMihkeSwgZHgpO1xuICAgICAgICByZXR1cm4gcGlNb2QoYW5nbGUpO1xuICAgIH0sXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cXVhZHJhdGljLmpzLm1hcCIsImltcG9ydCB7IGRpc3RhbmNlLCBpc051bWJlckVxdWFsLCBnZXRCQm94QnlBcnJheSwgcGlNb2QgfSBmcm9tICcuL3V0aWwnO1xuaW1wb3J0IGxpbmUgZnJvbSAnLi9saW5lJztcbmltcG9ydCB7IHNuYXBMZW5ndGgsIG5lYXJlc3RQb2ludCB9IGZyb20gJy4vYmV6aWVyJztcbmZ1bmN0aW9uIGN1YmljQXQocDAsIHAxLCBwMiwgcDMsIHQpIHtcbiAgICB2YXIgb25ldCA9IDEgLSB0OyAvLyB0ICogdCAqIHQg55qE5oCn6IO95aSn5qaC5pivIE1hdGgucG93KHQsIDMpIOeahOS4ieWAjVxuICAgIHJldHVybiBvbmV0ICogb25ldCAqIG9uZXQgKiBwMCArIDMgKiBwMSAqIHQgKiBvbmV0ICogb25ldCArIDMgKiBwMiAqIHQgKiB0ICogb25ldCArIHAzICogdCAqIHQgKiB0O1xufVxuZnVuY3Rpb24gZGVyaXZhdGl2ZUF0KHAwLCBwMSwgcDIsIHAzLCB0KSB7XG4gICAgdmFyIG9uZXQgPSAxIC0gdDtcbiAgICByZXR1cm4gMyAqIChvbmV0ICogb25ldCAqIChwMSAtIHAwKSArIDIgKiBvbmV0ICogdCAqIChwMiAtIHAxKSArIHQgKiB0ICogKHAzIC0gcDIpKTtcbn1cbmZ1bmN0aW9uIGV4dHJlbWEocDAsIHAxLCBwMiwgcDMpIHtcbiAgICB2YXIgYSA9IC0zICogcDAgKyA5ICogcDEgLSA5ICogcDIgKyAzICogcDM7XG4gICAgdmFyIGIgPSA2ICogcDAgLSAxMiAqIHAxICsgNiAqIHAyO1xuICAgIHZhciBjID0gMyAqIHAxIC0gMyAqIHAwO1xuICAgIHZhciBleHRyZW1hcyA9IFtdO1xuICAgIHZhciB0MTtcbiAgICB2YXIgdDI7XG4gICAgdmFyIGRpc2NTcXJ0O1xuICAgIGlmIChpc051bWJlckVxdWFsKGEsIDApKSB7XG4gICAgICAgIGlmICghaXNOdW1iZXJFcXVhbChiLCAwKSkge1xuICAgICAgICAgICAgdDEgPSAtYyAvIGI7XG4gICAgICAgICAgICBpZiAodDEgPj0gMCAmJiB0MSA8PSAxKSB7XG4gICAgICAgICAgICAgICAgZXh0cmVtYXMucHVzaCh0MSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHZhciBkaXNjID0gYiAqIGIgLSA0ICogYSAqIGM7XG4gICAgICAgIGlmIChpc051bWJlckVxdWFsKGRpc2MsIDApKSB7XG4gICAgICAgICAgICBleHRyZW1hcy5wdXNoKC1iIC8gKDIgKiBhKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZGlzYyA+IDApIHtcbiAgICAgICAgICAgIGRpc2NTcXJ0ID0gTWF0aC5zcXJ0KGRpc2MpO1xuICAgICAgICAgICAgdDEgPSAoLWIgKyBkaXNjU3FydCkgLyAoMiAqIGEpO1xuICAgICAgICAgICAgdDIgPSAoLWIgLSBkaXNjU3FydCkgLyAoMiAqIGEpO1xuICAgICAgICAgICAgaWYgKHQxID49IDAgJiYgdDEgPD0gMSkge1xuICAgICAgICAgICAgICAgIGV4dHJlbWFzLnB1c2godDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHQyID49IDAgJiYgdDIgPD0gMSkge1xuICAgICAgICAgICAgICAgIGV4dHJlbWFzLnB1c2godDIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBleHRyZW1hcztcbn1cbi8vIOWIhuWJsui0neWhnuWwlOabsue6v1xuZnVuY3Rpb24gZGl2aWRlQ3ViaWMoeDEsIHkxLCB4MiwgeTIsIHgzLCB5MywgeDQsIHk0LCB0KSB7XG4gICAgLy8g5YiS5YiG54K5XG4gICAgdmFyIHh0ID0gY3ViaWNBdCh4MSwgeDIsIHgzLCB4NCwgdCk7XG4gICAgdmFyIHl0ID0gY3ViaWNBdCh5MSwgeTIsIHkzLCB5NCwgdCk7XG4gICAgLy8g6K6h566X5Lik54K55LmL6Ze055qE5beu5YC854K5XG4gICAgdmFyIGMxID0gbGluZS5wb2ludEF0KHgxLCB5MSwgeDIsIHkyLCB0KTtcbiAgICB2YXIgYzIgPSBsaW5lLnBvaW50QXQoeDIsIHkyLCB4MywgeTMsIHQpO1xuICAgIHZhciBjMyA9IGxpbmUucG9pbnRBdCh4MywgeTMsIHg0LCB5NCwgdCk7XG4gICAgdmFyIGMxMiA9IGxpbmUucG9pbnRBdChjMS54LCBjMS55LCBjMi54LCBjMi55LCB0KTtcbiAgICB2YXIgYzIzID0gbGluZS5wb2ludEF0KGMyLngsIGMyLnksIGMzLngsIGMzLnksIHQpO1xuICAgIHJldHVybiBbXG4gICAgICAgIFt4MSwgeTEsIGMxLngsIGMxLnksIGMxMi54LCBjMTIueSwgeHQsIHl0XSxcbiAgICAgICAgW3h0LCB5dCwgYzIzLngsIGMyMy55LCBjMy54LCBjMy55LCB4NCwgeTRdLFxuICAgIF07XG59XG4vLyDkvb/nlKjov63ku6Pms5Xlj5botJ3loZ7lsJTmm7Lnur/nmoTplb/luqbvvIzkuozpmLblkozkuInpmLbliIblvIDlhpnvvIzmm7TmuIXmmbDlkozkvr/kuo7osIPor5VcbmZ1bmN0aW9uIGN1YmljTGVuZ3RoKHgxLCB5MSwgeDIsIHkyLCB4MywgeTMsIHg0LCB5NCwgaXRlcmF0aW9uQ291bnQpIHtcbiAgICBpZiAoaXRlcmF0aW9uQ291bnQgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHNuYXBMZW5ndGgoW3gxLCB4MiwgeDMsIHg0XSwgW3kxLCB5MiwgeTMsIHk0XSk7XG4gICAgfVxuICAgIHZhciBjdWJpY3MgPSBkaXZpZGVDdWJpYyh4MSwgeTEsIHgyLCB5MiwgeDMsIHkzLCB4NCwgeTQsIDAuNSk7XG4gICAgdmFyIGxlZnQgPSBjdWJpY3NbMF07XG4gICAgdmFyIHJpZ2h0ID0gY3ViaWNzWzFdO1xuICAgIGxlZnQucHVzaChpdGVyYXRpb25Db3VudCAtIDEpO1xuICAgIHJpZ2h0LnB1c2goaXRlcmF0aW9uQ291bnQgLSAxKTtcbiAgICByZXR1cm4gY3ViaWNMZW5ndGguYXBwbHkobnVsbCwgbGVmdCkgKyBjdWJpY0xlbmd0aC5hcHBseShudWxsLCByaWdodCk7XG59XG5leHBvcnQgZGVmYXVsdCB7XG4gICAgZXh0cmVtYTogZXh0cmVtYSxcbiAgICBib3g6IGZ1bmN0aW9uICh4MSwgeTEsIHgyLCB5MiwgeDMsIHkzLCB4NCwgeTQpIHtcbiAgICAgICAgdmFyIHhBcnIgPSBbeDEsIHg0XTtcbiAgICAgICAgdmFyIHlBcnIgPSBbeTEsIHk0XTtcbiAgICAgICAgdmFyIHhFeHRyZW1hID0gZXh0cmVtYSh4MSwgeDIsIHgzLCB4NCk7XG4gICAgICAgIHZhciB5RXh0cmVtYSA9IGV4dHJlbWEoeTEsIHkyLCB5MywgeTQpO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHhFeHRyZW1hLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB4QXJyLnB1c2goY3ViaWNBdCh4MSwgeDIsIHgzLCB4NCwgeEV4dHJlbWFbaV0pKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHlFeHRyZW1hLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB5QXJyLnB1c2goY3ViaWNBdCh5MSwgeTIsIHkzLCB5NCwgeUV4dHJlbWFbaV0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZ2V0QkJveEJ5QXJyYXkoeEFyciwgeUFycik7XG4gICAgfSxcbiAgICBsZW5ndGg6IGZ1bmN0aW9uICh4MSwgeTEsIHgyLCB5MiwgeDMsIHkzLCB4NCwgeTQpIHtcbiAgICAgICAgLy8g6L+t5Luj5LiJ5qyh77yM5YiS5YiG5oiQIDgg5q615rGC6ZW/5bqmXG4gICAgICAgIHJldHVybiBjdWJpY0xlbmd0aCh4MSwgeTEsIHgyLCB5MiwgeDMsIHkzLCB4NCwgeTQsIDMpO1xuICAgIH0sXG4gICAgbmVhcmVzdFBvaW50OiBmdW5jdGlvbiAoeDEsIHkxLCB4MiwgeTIsIHgzLCB5MywgeDQsIHk0LCB4MCwgeTAsIGxlbmd0aCkge1xuICAgICAgICByZXR1cm4gbmVhcmVzdFBvaW50KFt4MSwgeDIsIHgzLCB4NF0sIFt5MSwgeTIsIHkzLCB5NF0sIHgwLCB5MCwgY3ViaWNBdCwgbGVuZ3RoKTtcbiAgICB9LFxuICAgIHBvaW50RGlzdGFuY2U6IGZ1bmN0aW9uICh4MSwgeTEsIHgyLCB5MiwgeDMsIHkzLCB4NCwgeTQsIHgwLCB5MCwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciBwb2ludCA9IHRoaXMubmVhcmVzdFBvaW50KHgxLCB5MSwgeDIsIHkyLCB4MywgeTMsIHg0LCB5NCwgeDAsIHkwLCBsZW5ndGgpO1xuICAgICAgICByZXR1cm4gZGlzdGFuY2UocG9pbnQueCwgcG9pbnQueSwgeDAsIHkwKTtcbiAgICB9LFxuICAgIGludGVycG9sYXRpb25BdDogY3ViaWNBdCxcbiAgICBwb2ludEF0OiBmdW5jdGlvbiAoeDEsIHkxLCB4MiwgeTIsIHgzLCB5MywgeDQsIHk0LCB0KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB4OiBjdWJpY0F0KHgxLCB4MiwgeDMsIHg0LCB0KSxcbiAgICAgICAgICAgIHk6IGN1YmljQXQoeTEsIHkyLCB5MywgeTQsIHQpLFxuICAgICAgICB9O1xuICAgIH0sXG4gICAgZGl2aWRlOiBmdW5jdGlvbiAoeDEsIHkxLCB4MiwgeTIsIHgzLCB5MywgeDQsIHk0LCB0KSB7XG4gICAgICAgIHJldHVybiBkaXZpZGVDdWJpYyh4MSwgeTEsIHgyLCB5MiwgeDMsIHkzLCB4NCwgeTQsIHQpO1xuICAgIH0sXG4gICAgdGFuZ2VudEFuZ2xlOiBmdW5jdGlvbiAoeDEsIHkxLCB4MiwgeTIsIHgzLCB5MywgeDQsIHk0LCB0KSB7XG4gICAgICAgIHZhciBkeCA9IGRlcml2YXRpdmVBdCh4MSwgeDIsIHgzLCB4NCwgdCk7XG4gICAgICAgIHZhciBkeSA9IGRlcml2YXRpdmVBdCh5MSwgeTIsIHkzLCB5NCwgdCk7XG4gICAgICAgIHJldHVybiBwaU1vZChNYXRoLmF0YW4yKGR5LCBkeCkpO1xuICAgIH0sXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y3ViaWMuanMubWFwIiwiLyoqXG4gKiBAZmlsZW92ZXJ2aWV3IOakreWchueahOS4gOS6m+iuoeeul++8jFxuICogIC0g5ZGo6ZW/6K6h566X5Y+C6ICD77yaaHR0cHM6Ly93d3cubWF0aHNpc2Z1bi5jb20vZ2VvbWV0cnkvZWxsaXBzZS1wZXJpbWV0ZXIuaHRtbFxuICogIC0g6Led56a76K6h566X5Y+C6ICD77yaaHR0cHM6Ly93ZXQtcm9ib3RzLmdob3N0LmlvL3NpbXBsZS1tZXRob2QtZm9yLWRpc3RhbmNlLXRvLWVsbGlwc2UvXG4gKiBAYXV0aG9yIGR4cTYxM0BnbWFpbC5jb21cbiAqL1xuaW1wb3J0IHsgZGlzdGFuY2UsIHBpTW9kIH0gZnJvbSAnLi91dGlsJztcbmZ1bmN0aW9uIGNvcHlzaWduKHYxLCB2Mikge1xuICAgIHZhciBhYnN2ID0gTWF0aC5hYnModjEpO1xuICAgIHJldHVybiB2MiA+IDAgPyBhYnN2IDogYWJzdiAqIC0xO1xufVxuZXhwb3J0IGRlZmF1bHQge1xuICAgIC8qKlxuICAgICAqIOWMheWbtOebkuiuoeeul1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4ICDmpK3lnIbkuK3lv4MgeFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5ICDmpK3lnIbkuK3lv4MgeVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByeCDmpK3lnIYgeCDmlrnlkJHljYrlvoRcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcnkg5qSt5ZyGIHkg5pa55ZCR5Y2K5b6EXG4gICAgICogQHJldHVybiB7b2JqZWN0fSDljIXlm7Tnm5JcbiAgICAgKi9cbiAgICBib3g6IGZ1bmN0aW9uICh4LCB5LCByeCwgcnkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHg6IHggLSByeCxcbiAgICAgICAgICAgIHk6IHkgLSByeSxcbiAgICAgICAgICAgIHdpZHRoOiByeCAqIDIsXG4gICAgICAgICAgICBoZWlnaHQ6IHJ5ICogMixcbiAgICAgICAgfTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOiuoeeul+WRqOmVv++8jOS9v+eUqOi/keS8vOazlVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4ICDmpK3lnIbkuK3lv4MgeFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5ICDmpK3lnIbkuK3lv4MgeVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByeCDmpK3lnIYgeCDmlrnlkJHljYrlvoRcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcnkg5qSt5ZyGIHkg5pa55ZCR5Y2K5b6EXG4gICAgICogQHJldHVybiB7bnVtYmVyfSDmpK3lnIblkajplb9cbiAgICAgKi9cbiAgICBsZW5ndGg6IGZ1bmN0aW9uICh4LCB5LCByeCwgcnkpIHtcbiAgICAgICAgcmV0dXJuIE1hdGguUEkgKiAoMyAqIChyeCArIHJ5KSAtIE1hdGguc3FydCgoMyAqIHJ4ICsgcnkpICogKHJ4ICsgMyAqIHJ5KSkpO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICog6Led56a75qSt5ZyG5pyA6L+R55qE54K5XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHggIOakreWchuS4reW/gyB4XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHkgIOakreWchuS4reW/gyB5XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJ4IOakreWchiB4IOaWueWQkeWNiuW+hFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByeSDmpK3lnIYgeSDmlrnlkJHljYrlvoRcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geDAgIOaMh+WumueahOeCuSB4XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHkwICDmjIflrprnmoTngrkgeVxuICAgICAqIEByZXR1cm4ge29iamVjdH0g5qSt5ZyG5LiK6Led56a75oyH5a6a54K55pyA6L+R55qE54K5XG4gICAgICovXG4gICAgbmVhcmVzdFBvaW50OiBmdW5jdGlvbiAoeCwgeSwgcngsIHJ5LCB4MCwgeTApIHtcbiAgICAgICAgdmFyIGEgPSByeDtcbiAgICAgICAgdmFyIGIgPSByeTtcbiAgICAgICAgLy8g5YGH5aaC5qSt5ZyG5Y2K5b6E5Li6MOWImei/lOWbnuWchuW/g1xuICAgICAgICBpZiAoYSA9PT0gMCB8fCBiID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHg6IHgsXG4gICAgICAgICAgICAgICAgeTogeSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgLy8g6L2s5o2i5oiQIDDvvIwgMCDkuLrkuK3lv4PnmoTmpK3lnIborqHnrpdcbiAgICAgICAgdmFyIHJlbGF0aXZlWCA9IHgwIC0geDtcbiAgICAgICAgdmFyIHJlbGF0aXZlWSA9IHkwIC0geTtcbiAgICAgICAgdmFyIHB4ID0gTWF0aC5hYnMocmVsYXRpdmVYKTtcbiAgICAgICAgdmFyIHB5ID0gTWF0aC5hYnMocmVsYXRpdmVZKTtcbiAgICAgICAgdmFyIHNxdWFyZUEgPSBhICogYTtcbiAgICAgICAgdmFyIHNxdWFyZUIgPSBiICogYjtcbiAgICAgICAgLy8gY29uc3QgYW5nbGUwID0gTWF0aC5hdGFuMihyZWxhdGl2ZVksIHJlbGF0aXZlWCk7XG4gICAgICAgIHZhciB0ID0gTWF0aC5QSSAvIDQ7XG4gICAgICAgIHZhciBuZWFyZXN0WDsgLy8g5qSt5ZyG5LiK55qE5Lu75LiA54K5XG4gICAgICAgIHZhciBuZWFyZXN0WTtcbiAgICAgICAgLy8g6L+t5LujIDQg5qyhXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgNDsgaSsrKSB7XG4gICAgICAgICAgICBuZWFyZXN0WCA9IGEgKiBNYXRoLmNvcyh0KTtcbiAgICAgICAgICAgIG5lYXJlc3RZID0gYiAqIE1hdGguc2luKHQpO1xuICAgICAgICAgICAgdmFyIGV4ID0gKChzcXVhcmVBIC0gc3F1YXJlQikgKiBNYXRoLnBvdyhNYXRoLmNvcyh0KSwgMykpIC8gYTtcbiAgICAgICAgICAgIHZhciBleSA9ICgoc3F1YXJlQiAtIHNxdWFyZUEpICogTWF0aC5wb3coTWF0aC5zaW4odCksIDMpKSAvIGI7XG4gICAgICAgICAgICB2YXIgcngxID0gbmVhcmVzdFggLSBleDtcbiAgICAgICAgICAgIHZhciByeTEgPSBuZWFyZXN0WSAtIGV5O1xuICAgICAgICAgICAgdmFyIHF4ID0gcHggLSBleDtcbiAgICAgICAgICAgIHZhciBxeSA9IHB5IC0gZXk7XG4gICAgICAgICAgICB2YXIgciA9IE1hdGguaHlwb3QocnkxLCByeDEpO1xuICAgICAgICAgICAgdmFyIHEgPSBNYXRoLmh5cG90KHF5LCBxeCk7XG4gICAgICAgICAgICB2YXIgZGVsdGFfYyA9IHIgKiBNYXRoLmFzaW4oKHJ4MSAqIHF5IC0gcnkxICogcXgpIC8gKHIgKiBxKSk7XG4gICAgICAgICAgICB2YXIgZGVsdGFfdCA9IGRlbHRhX2MgLyBNYXRoLnNxcnQoc3F1YXJlQSArIHNxdWFyZUIgLSBuZWFyZXN0WCAqIG5lYXJlc3RYIC0gbmVhcmVzdFkgKiBuZWFyZXN0WSk7XG4gICAgICAgICAgICB0ICs9IGRlbHRhX3Q7XG4gICAgICAgICAgICB0ID0gTWF0aC5taW4oTWF0aC5QSSAvIDIsIE1hdGgubWF4KDAsIHQpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeDogeCArIGNvcHlzaWduKG5lYXJlc3RYLCByZWxhdGl2ZVgpLFxuICAgICAgICAgICAgeTogeSArIGNvcHlzaWduKG5lYXJlc3RZLCByZWxhdGl2ZVkpLFxuICAgICAgICB9O1xuICAgIH0sXG4gICAgLyoqXG4gICAgICog54K55Yiw5qSt5ZyG5pyA6L+R55qE6Led56a7XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHggIOakreWchuS4reW/gyB4XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHkgIOakreWchuS4reW/gyB5XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJ4IOakreWchiB4IOaWueWQkeWNiuW+hFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByeSDmpK3lnIYgeSDmlrnlkJHljYrlvoRcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geDAgIOaMh+WumueahOeCuSB4XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHkwICDmjIflrprnmoTngrkgeVxuICAgICAqIEByZXR1cm4ge251bWJlcn0g54K55Yiw5qSt5ZyG55qE6Led56a7XG4gICAgICovXG4gICAgcG9pbnREaXN0YW5jZTogZnVuY3Rpb24gKHgsIHksIHJ4LCByeSwgeDAsIHkwKSB7XG4gICAgICAgIHZhciBuZWFyZXN0UG9pbnQgPSB0aGlzLm5lYXJlc3RQb2ludCh4LCB5LCByeCwgcnksIHgwLCB5MCk7XG4gICAgICAgIHJldHVybiBkaXN0YW5jZShuZWFyZXN0UG9pbnQueCwgbmVhcmVzdFBvaW50LnksIHgwLCB5MCk7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDmoLnmja7mr5Tkvovojrflj5bngrlcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geCDmpK3lnIbkuK3lv4MgeFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5IOakreWchuS4reW/gyB5XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJ4IOakreWchiB4IOaWueWQkeWNiuW+hFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByeSDmpK3lnIYgeSDmlrnlkJHljYrlvoRcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdCDmjIflrprmr5TkvovvvIx46L205pa55ZCR5Li6IDBcbiAgICAgKiBAcmV0dXJuIHtvYmplY3R9IOeCuVxuICAgICAqL1xuICAgIHBvaW50QXQ6IGZ1bmN0aW9uICh4LCB5LCByeCwgcnksIHQpIHtcbiAgICAgICAgdmFyIGFuZ2xlID0gMiAqIE1hdGguUEkgKiB0OyAvLyDmjInnhafop5Lluqbov5vooYzorqHnrpfvvIzogIzkuI3mjInnhaflkajplb/orqHnrpdcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHg6IHggKyByeCAqIE1hdGguY29zKGFuZ2xlKSxcbiAgICAgICAgICAgIHk6IHkgKyByeSAqIE1hdGguc2luKGFuZ2xlKSxcbiAgICAgICAgfTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOagueaNruavlOS+i+iuoeeul+WIh+e6v+inkuW6plxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4IOakreWchuS4reW/gyB4XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHkg5qSt5ZyG5Lit5b+DIHlcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcngg5qSt5ZyGIHgg5pa55ZCR5Y2K5b6EXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJ5IOakreWchiB5IOaWueWQkeWNiuW+hFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB0IOaMh+WumuavlOS+iyAwIC0gMSDkuYvpl7TvvIx46L205pa55ZCR5Li6IDDjgILlnKggMC0xIOiMg+WbtOS5i+WkluaYr+W+queOr+i/mOaYr+i/lOWbniBudWxs77yM6L+Y6ZyA6KaB6LCD5pW0XG4gICAgICogQHJldHVybiB7bnVtYmVyfSDop5LluqbvvIzlnKggMCAtIDJQSSDkuYvpl7RcbiAgICAgKi9cbiAgICB0YW5nZW50QW5nbGU6IGZ1bmN0aW9uICh4LCB5LCByeCwgcnksIHQpIHtcbiAgICAgICAgdmFyIGFuZ2xlID0gMiAqIE1hdGguUEkgKiB0OyAvLyDmjInnhafop5Lluqbov5vooYzorqHnrpfvvIzogIzkuI3mjInnhaflkajplb/orqHnrpdcbiAgICAgICAgLy8g55u05o6l5L2/55SoIHgseSDnmoTlr7zmlbDorqHnrpfvvIwgeCcgPSAtcnggKiBzaW4odCk7IHknID0gcnkgKiBjb3ModCk7XG4gICAgICAgIHZhciB0YW5nZW50QW5nbGUgPSBNYXRoLmF0YW4yKHJ5ICogTWF0aC5jb3MoYW5nbGUpLCAtcnggKiBNYXRoLnNpbihhbmdsZSkpO1xuICAgICAgICAvLyDkuZ/lj6/ku6Xkvb/nlKjmjIflrprngrnnmoTliIfnur/mlrnnqIvorqHnrpfvvIzmiJDmnKzmnInkupvpq5hcbiAgICAgICAgLy8gY29uc3QgcG9pbnQgPSB0aGlzLnBvaW50QXQoMCwgMCwgcngsIHJ5LCB0KTsgLy8g5qSt5ZyG55qE5YiH57q/5ZCM5qSt5ZyG55qE5Lit5b+D5LiN55u45YWzXG4gICAgICAgIC8vIGxldCB0YW5nZW50QW5nbGUgPSAtMSAqIE1hdGguYXRhbigocnkgKiByeSAqIHBvaW50LngpIC8gKHJ4ICogcnggKiBwb2ludC55KSk7XG4gICAgICAgIC8vIGlmIChhbmdsZSA+PSAwICYmIGFuZ2xlIDw9IE1hdGguUEkpIHtcbiAgICAgICAgLy8gICB0YW5nZW50QW5nbGUgKz0gTWF0aC5QSTtcbiAgICAgICAgLy8gfVxuICAgICAgICByZXR1cm4gcGlNb2QodGFuZ2VudEFuZ2xlKTtcbiAgICB9LFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWVsbGlwc2UuanMubWFwIiwiaW1wb3J0IHsgZGlzdGFuY2UsIHBpTW9kIH0gZnJvbSAnLi91dGlsJztcbmltcG9ydCBlbGxpcHNlIGZyb20gJy4vZWxsaXBzZSc7XG4vLyDlgY/lr7zmlbAgeFxuZnVuY3Rpb24gZGVyaXZhdGl2ZVhBdChjeCwgY3ksIHJ4LCByeSwgeFJvdGF0aW9uLCBzdGFydEFuZ2xlLCBlbmRBbmdsZSwgYW5nbGUpIHtcbiAgICByZXR1cm4gLTEgKiByeCAqIE1hdGguY29zKHhSb3RhdGlvbikgKiBNYXRoLnNpbihhbmdsZSkgLSByeSAqIE1hdGguc2luKHhSb3RhdGlvbikgKiBNYXRoLmNvcyhhbmdsZSk7XG59XG4vLyDlgY/lr7zmlbAgeVxuZnVuY3Rpb24gZGVyaXZhdGl2ZVlBdChjeCwgY3ksIHJ4LCByeSwgeFJvdGF0aW9uLCBzdGFydEFuZ2xlLCBlbmRBbmdsZSwgYW5nbGUpIHtcbiAgICByZXR1cm4gLTEgKiByeCAqIE1hdGguc2luKHhSb3RhdGlvbikgKiBNYXRoLnNpbihhbmdsZSkgKyByeSAqIE1hdGguY29zKHhSb3RhdGlvbikgKiBNYXRoLmNvcyhhbmdsZSk7XG59XG4vLyB4IOeahOaegeWAvFxuZnVuY3Rpb24geEV4dHJlbWEocngsIHJ5LCB4Um90YXRpb24pIHtcbiAgICByZXR1cm4gTWF0aC5hdGFuKCgtcnkgLyByeCkgKiBNYXRoLnRhbih4Um90YXRpb24pKTtcbn1cbi8vIHkg55qE5p6B5YC8XG5mdW5jdGlvbiB5RXh0cmVtYShyeCwgcnksIHhSb3RhdGlvbikge1xuICAgIHJldHVybiBNYXRoLmF0YW4ocnkgLyAocnggKiBNYXRoLnRhbih4Um90YXRpb24pKSk7XG59XG4vLyDmoLnmja7op5LluqbmsYIgeCDlnZDmoIdcbmZ1bmN0aW9uIHhBdChjeCwgY3ksIHJ4LCByeSwgeFJvdGF0aW9uLCBhbmdsZSkge1xuICAgIHJldHVybiByeCAqIE1hdGguY29zKHhSb3RhdGlvbikgKiBNYXRoLmNvcyhhbmdsZSkgLSByeSAqIE1hdGguc2luKHhSb3RhdGlvbikgKiBNYXRoLnNpbihhbmdsZSkgKyBjeDtcbn1cbi8vIOagueaNruinkuW6puaxgiB5IOWdkOagh1xuZnVuY3Rpb24geUF0KGN4LCBjeSwgcngsIHJ5LCB4Um90YXRpb24sIGFuZ2xlKSB7XG4gICAgcmV0dXJuIHJ4ICogTWF0aC5zaW4oeFJvdGF0aW9uKSAqIE1hdGguY29zKGFuZ2xlKSArIHJ5ICogTWF0aC5jb3MoeFJvdGF0aW9uKSAqIE1hdGguc2luKGFuZ2xlKSArIGN5O1xufVxuLy8g6I635Y+W54K55Zyo5qSt5ZyG5LiK55qE6KeS5bqmXG5mdW5jdGlvbiBnZXRBbmdsZShyeCwgcnksIHgwLCB5MCkge1xuICAgIHZhciBhbmdsZSA9IE1hdGguYXRhbjIoeTAgKiByeCwgeDAgKiByeSk7XG4gICAgLy8g6L2s5o2i5YiwIDAgLSAyUEkg5YaFXG4gICAgcmV0dXJuIChhbmdsZSArIE1hdGguUEkgKiAyKSAlIChNYXRoLlBJICogMik7XG59XG4vLyDmoLnmja7op5Lluqbojrflj5bvvIx4LHlcbmZ1bmN0aW9uIGdldFBvaW50KHJ4LCByeSwgYW5nbGUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICB4OiByeCAqIE1hdGguY29zKGFuZ2xlKSxcbiAgICAgICAgeTogcnkgKiBNYXRoLnNpbihhbmdsZSksXG4gICAgfTtcbn1cbi8vIOaXi+i9rFxuZnVuY3Rpb24gcm90YXRlKHgsIHksIGFuZ2xlKSB7XG4gICAgdmFyIGNvcyA9IE1hdGguY29zKGFuZ2xlKTtcbiAgICB2YXIgc2luID0gTWF0aC5zaW4oYW5nbGUpO1xuICAgIHJldHVybiBbeCAqIGNvcyAtIHkgKiBzaW4sIHggKiBzaW4gKyB5ICogY29zXTtcbn1cbmV4cG9ydCBkZWZhdWx0IHtcbiAgICAvKipcbiAgICAgKiDorqHnrpfljIXlm7Tnm5JcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gY3ggICAgICAgICDlnIblv4MgeFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBjeSAgICAgICAgIOWchuW/gyB5XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJ4ICAgICAgICAgeCDovbTmlrnlkJHnmoTljYrlvoRcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcnkgICAgICAgICB5IOi9tOaWueWQkeeahOWNiuW+hFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4Um90YXRpb24gIOaXi+i9rOinkuW6plxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydEFuZ2xlIOi1t+Wni+inkuW6plxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBlbmRBbmdsZSAgIOe7k+adn+inkuW6plxuICAgICAqIEByZXR1cm4ge29iamVjdH0g5YyF5Zu055uS5a+56LGhXG4gICAgICovXG4gICAgYm94OiBmdW5jdGlvbiAoY3gsIGN5LCByeCwgcnksIHhSb3RhdGlvbiwgc3RhcnRBbmdsZSwgZW5kQW5nbGUpIHtcbiAgICAgICAgdmFyIHhEaW0gPSB4RXh0cmVtYShyeCwgcnksIHhSb3RhdGlvbik7XG4gICAgICAgIHZhciBtaW5YID0gSW5maW5pdHk7XG4gICAgICAgIHZhciBtYXhYID0gLUluZmluaXR5O1xuICAgICAgICB2YXIgeHMgPSBbc3RhcnRBbmdsZSwgZW5kQW5nbGVdO1xuICAgICAgICBmb3IgKHZhciBpID0gLU1hdGguUEkgKiAyOyBpIDw9IE1hdGguUEkgKiAyOyBpICs9IE1hdGguUEkpIHtcbiAgICAgICAgICAgIHZhciB4QW5nbGUgPSB4RGltICsgaTtcbiAgICAgICAgICAgIGlmIChzdGFydEFuZ2xlIDwgZW5kQW5nbGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoc3RhcnRBbmdsZSA8IHhBbmdsZSAmJiB4QW5nbGUgPCBlbmRBbmdsZSkge1xuICAgICAgICAgICAgICAgICAgICB4cy5wdXNoKHhBbmdsZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGVuZEFuZ2xlIDwgeEFuZ2xlICYmIHhBbmdsZSA8IHN0YXJ0QW5nbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgeHMucHVzaCh4QW5nbGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHhzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgeCA9IHhBdChjeCwgY3ksIHJ4LCByeSwgeFJvdGF0aW9uLCB4c1tpXSk7XG4gICAgICAgICAgICBpZiAoeCA8IG1pblgpIHtcbiAgICAgICAgICAgICAgICBtaW5YID0geDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh4ID4gbWF4WCkge1xuICAgICAgICAgICAgICAgIG1heFggPSB4O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciB5RGltID0geUV4dHJlbWEocngsIHJ5LCB4Um90YXRpb24pO1xuICAgICAgICB2YXIgbWluWSA9IEluZmluaXR5O1xuICAgICAgICB2YXIgbWF4WSA9IC1JbmZpbml0eTtcbiAgICAgICAgdmFyIHlzID0gW3N0YXJ0QW5nbGUsIGVuZEFuZ2xlXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IC1NYXRoLlBJICogMjsgaSA8PSBNYXRoLlBJICogMjsgaSArPSBNYXRoLlBJKSB7XG4gICAgICAgICAgICB2YXIgeUFuZ2xlID0geURpbSArIGk7XG4gICAgICAgICAgICBpZiAoc3RhcnRBbmdsZSA8IGVuZEFuZ2xlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXJ0QW5nbGUgPCB5QW5nbGUgJiYgeUFuZ2xlIDwgZW5kQW5nbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgeXMucHVzaCh5QW5nbGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChlbmRBbmdsZSA8IHlBbmdsZSAmJiB5QW5nbGUgPCBzdGFydEFuZ2xlKSB7XG4gICAgICAgICAgICAgICAgICAgIHlzLnB1c2goeUFuZ2xlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIHkgPSB5QXQoY3gsIGN5LCByeCwgcnksIHhSb3RhdGlvbiwgeXNbaV0pO1xuICAgICAgICAgICAgaWYgKHkgPCBtaW5ZKSB7XG4gICAgICAgICAgICAgICAgbWluWSA9IHk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoeSA+IG1heFkpIHtcbiAgICAgICAgICAgICAgICBtYXhZID0geTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeDogbWluWCxcbiAgICAgICAgICAgIHk6IG1pblksXG4gICAgICAgICAgICB3aWR0aDogbWF4WCAtIG1pblgsXG4gICAgICAgICAgICBoZWlnaHQ6IG1heFkgLSBtaW5ZLFxuICAgICAgICB9O1xuICAgIH0sXG4gICAgLyoqXG4gICAgICog6I635Y+W5ZyG5byn55qE6ZW/5bqm77yM6K6h566X5ZyG5byn6ZW/5bqm5pe25LiN6ICD6JmR5peL6L2s6KeS5bqm77yMXG4gICAgICog5LuF6LefIHJ4LCByeSwgc3RhcnRBbmdsZSwgZW5kQW5nbGUg55u45YWzXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGN4ICAgICAgICAg5ZyG5b+DIHhcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gY3kgICAgICAgICDlnIblv4MgeVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByeCAgICAgICAgIHgg6L205pa55ZCR55qE5Y2K5b6EXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJ5ICAgICAgICAgeSDovbTmlrnlkJHnmoTljYrlvoRcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geFJvdGF0aW9uICDml4vovazop5LluqZcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc3RhcnRBbmdsZSDotbflp4vop5LluqZcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZW5kQW5nbGUgICDnu5PmnZ/op5LluqZcbiAgICAgKi9cbiAgICBsZW5ndGg6IGZ1bmN0aW9uIChjeCwgY3ksIHJ4LCByeSwgeFJvdGF0aW9uLCBzdGFydEFuZ2xlLCBlbmRBbmdsZSkgeyB9LFxuICAgIC8qKlxuICAgICAqIOiOt+WPluaMh+WumueCueWIsOWchuW8p+eahOacgOi/kei3neemu+eahOeCuVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBjeCAgICAgICAgIOWchuW/gyB4XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGN5ICAgICAgICAg5ZyG5b+DIHlcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcnggICAgICAgICB4IOi9tOaWueWQkeeahOWNiuW+hFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByeSAgICAgICAgIHkg6L205pa55ZCR55qE5Y2K5b6EXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHhSb3RhdGlvbiAg5peL6L2s6KeS5bqmXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0QW5nbGUg6LW35aeL6KeS5bqmXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGVuZEFuZ2xlICAg57uT5p2f6KeS5bqmXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHgwICAgICAgICAg5oyH5a6a54K555qEIHhcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geTAgICAgICAgICDmjIflrprngrnnmoQgeVxuICAgICAqIEByZXR1cm4ge29iamVjdH0g5Yiw5oyH5a6a54K55pyA6L+R6Led56a755qE54K5XG4gICAgICovXG4gICAgbmVhcmVzdFBvaW50OiBmdW5jdGlvbiAoY3gsIGN5LCByeCwgcnksIHhSb3RhdGlvbiwgc3RhcnRBbmdsZSwgZW5kQW5nbGUsIHgwLCB5MCkge1xuICAgICAgICAvLyDlsIbmnIDov5Hot53nprvpl67popjovazmjaLmiJDliLDmpK3lnIbkuK3lv4MgMCwwIOayoeacieaXi+i9rOeahOakreWchumXrumimFxuICAgICAgICB2YXIgcmVsYXRpdmVWZWN0b3IgPSByb3RhdGUoeDAgLSBjeCwgeTAgLSBjeSwgLXhSb3RhdGlvbik7XG4gICAgICAgIHZhciB4MSA9IHJlbGF0aXZlVmVjdG9yWzBdLCB5MSA9IHJlbGF0aXZlVmVjdG9yWzFdO1xuICAgICAgICAvLyDorqHnrpfngrnliLDmpK3lnIbnmoTmnIDov5HnmoTngrlcbiAgICAgICAgdmFyIHJlbGF0aXZlUG9pbnQgPSBlbGxpcHNlLm5lYXJlc3RQb2ludCgwLCAwLCByeCwgcnksIHgxLCB5MSk7XG4gICAgICAgIC8vIOiOt+WPlueCueWcqOakreWchuS4iueahOinkuW6plxuICAgICAgICB2YXIgYW5nbGUgPSBnZXRBbmdsZShyeCwgcnksIHJlbGF0aXZlUG9pbnQueCwgcmVsYXRpdmVQb2ludC55KTtcbiAgICAgICAgLy8g54K55rKh5pyJ5Zyo5ZyG5byn5LiKXG4gICAgICAgIGlmIChhbmdsZSA8IHN0YXJ0QW5nbGUpIHtcbiAgICAgICAgICAgIC8vIOWwj+S6jui1t+Wni+WchuW8p1xuICAgICAgICAgICAgcmVsYXRpdmVQb2ludCA9IGdldFBvaW50KHJ4LCByeSwgc3RhcnRBbmdsZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYW5nbGUgPiBlbmRBbmdsZSkge1xuICAgICAgICAgICAgLy8g5aSn5LqO57uT5p2f5ZyG5bynXG4gICAgICAgICAgICByZWxhdGl2ZVBvaW50ID0gZ2V0UG9pbnQocngsIHJ5LCBlbmRBbmdsZSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8g5peL6L2s5YiwIHhSb3RhdGlvbiDnmoTop5LluqZcbiAgICAgICAgdmFyIHZlY3RvciA9IHJvdGF0ZShyZWxhdGl2ZVBvaW50LngsIHJlbGF0aXZlUG9pbnQueSwgeFJvdGF0aW9uKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHg6IHZlY3RvclswXSArIGN4LFxuICAgICAgICAgICAgeTogdmVjdG9yWzFdICsgY3ksXG4gICAgICAgIH07XG4gICAgfSxcbiAgICBwb2ludERpc3RhbmNlOiBmdW5jdGlvbiAoY3gsIGN5LCByeCwgcnksIHhSb3RhdGlvbiwgc3RhcnRBbmdsZSwgZW5kQW5nbGUsIHgwLCB5MCkge1xuICAgICAgICB2YXIgbmVhcmVzdFBvaW50ID0gdGhpcy5uZWFyZXN0UG9pbnQoY3gsIGN5LCByeCwgcnksIHgwLCB5MCk7XG4gICAgICAgIHJldHVybiBkaXN0YW5jZShuZWFyZXN0UG9pbnQueCwgbmVhcmVzdFBvaW50LnksIHgwLCB5MCk7XG4gICAgfSxcbiAgICBwb2ludEF0OiBmdW5jdGlvbiAoY3gsIGN5LCByeCwgcnksIHhSb3RhdGlvbiwgc3RhcnRBbmdsZSwgZW5kQW5nbGUsIHQpIHtcbiAgICAgICAgdmFyIGFuZ2xlID0gKGVuZEFuZ2xlIC0gc3RhcnRBbmdsZSkgKiB0ICsgc3RhcnRBbmdsZTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHg6IHhBdChjeCwgY3ksIHJ4LCByeSwgeFJvdGF0aW9uLCBhbmdsZSksXG4gICAgICAgICAgICB5OiB5QXQoY3gsIGN5LCByeCwgcnksIHhSb3RhdGlvbiwgYW5nbGUpLFxuICAgICAgICB9O1xuICAgIH0sXG4gICAgdGFuZ2VudEFuZ2xlOiBmdW5jdGlvbiAoY3gsIGN5LCByeCwgcnksIHhSb3RhdGlvbiwgc3RhcnRBbmdsZSwgZW5kQW5nbGUsIHQpIHtcbiAgICAgICAgdmFyIGFuZ2xlID0gKGVuZEFuZ2xlIC0gc3RhcnRBbmdsZSkgKiB0ICsgc3RhcnRBbmdsZTtcbiAgICAgICAgdmFyIGR4ID0gZGVyaXZhdGl2ZVhBdChjeCwgY3ksIHJ4LCByeSwgeFJvdGF0aW9uLCBzdGFydEFuZ2xlLCBlbmRBbmdsZSwgYW5nbGUpO1xuICAgICAgICB2YXIgZHkgPSBkZXJpdmF0aXZlWUF0KGN4LCBjeSwgcngsIHJ5LCB4Um90YXRpb24sIHN0YXJ0QW5nbGUsIGVuZEFuZ2xlLCBhbmdsZSk7XG4gICAgICAgIHJldHVybiBwaU1vZChNYXRoLmF0YW4yKGR5LCBkeCkpO1xuICAgIH0sXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YXJjLmpzLm1hcCIsImltcG9ydCBsaW5lIGZyb20gJy4vbGluZSc7XG5pbXBvcnQgeyBkaXN0YW5jZSB9IGZyb20gJy4vdXRpbCc7XG5mdW5jdGlvbiBhbmFseXplUG9pbnRzKHBvaW50cykge1xuICAgIC8vIOiuoeeul+avj+auteeahOmVv+W6puWSjOaAu+eahOmVv+W6plxuICAgIHZhciB0b3RhbExlbmd0aCA9IDA7XG4gICAgdmFyIHNlZ21lbnRzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb2ludHMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgIHZhciBmcm9tID0gcG9pbnRzW2ldO1xuICAgICAgICB2YXIgdG8gPSBwb2ludHNbaSArIDFdO1xuICAgICAgICB2YXIgbGVuZ3RoXzEgPSBkaXN0YW5jZShmcm9tWzBdLCBmcm9tWzFdLCB0b1swXSwgdG9bMV0pO1xuICAgICAgICB2YXIgc2VnID0ge1xuICAgICAgICAgICAgZnJvbTogZnJvbSxcbiAgICAgICAgICAgIHRvOiB0byxcbiAgICAgICAgICAgIGxlbmd0aDogbGVuZ3RoXzEsXG4gICAgICAgIH07XG4gICAgICAgIHNlZ21lbnRzLnB1c2goc2VnKTtcbiAgICAgICAgdG90YWxMZW5ndGggKz0gbGVuZ3RoXzE7XG4gICAgfVxuICAgIHJldHVybiB7IHNlZ21lbnRzOiBzZWdtZW50cywgdG90YWxMZW5ndGg6IHRvdGFsTGVuZ3RoIH07XG59XG5leHBvcnQgZnVuY3Rpb24gbGVuZ3RoT2ZTZWdtZW50KHBvaW50cykge1xuICAgIGlmIChwb2ludHMubGVuZ3RoIDwgMikge1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgdmFyIHRvdGFsTGVuZ3RoID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgdmFyIGZyb20gPSBwb2ludHNbaV07XG4gICAgICAgIHZhciB0byA9IHBvaW50c1tpICsgMV07XG4gICAgICAgIHRvdGFsTGVuZ3RoICs9IGRpc3RhbmNlKGZyb21bMF0sIGZyb21bMV0sIHRvWzBdLCB0b1sxXSk7XG4gICAgfVxuICAgIHJldHVybiB0b3RhbExlbmd0aDtcbn1cbi8qKlxuICog5oyJ54Wn5q+U5L6L5Zyo5pWw5o2u54mH5q615Lit6I635Y+W54K5XG4gKiBAcGFyYW0ge2FycmF5fSBwb2ludHMg54K555qE6ZuG5ZCIXG4gKiBAcGFyYW0ge251bWJlcn0gdCDnmb7liIbmr5QgMC0xXG4gKiBAcmV0dXJuIHtvYmplY3R9IOeCueeahOWdkOagh1xuICovXG5leHBvcnQgZnVuY3Rpb24gcG9pbnRBdFNlZ21lbnRzKHBvaW50cywgdCkge1xuICAgIC8vIOi+ueeVjOWIpOaWrVxuICAgIGlmICh0ID4gMSB8fCB0IDwgMCB8fCBwb2ludHMubGVuZ3RoIDwgMikge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgdmFyIF9hID0gYW5hbHl6ZVBvaW50cyhwb2ludHMpLCBzZWdtZW50cyA9IF9hLnNlZ21lbnRzLCB0b3RhbExlbmd0aCA9IF9hLnRvdGFsTGVuZ3RoO1xuICAgIC8vIOWkmuS4queCueacieWPr+iDvemHjeWQiFxuICAgIGlmICh0b3RhbExlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeDogcG9pbnRzWzBdWzBdLFxuICAgICAgICAgICAgeTogcG9pbnRzWzBdWzFdLFxuICAgICAgICB9O1xuICAgIH1cbiAgICAvLyDorqHnrpfmr5TkvotcbiAgICB2YXIgc3RhcnRSYXRpbyA9IDA7XG4gICAgdmFyIHBvaW50ID0gbnVsbDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlZ21lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBzZWcgPSBzZWdtZW50c1tpXTtcbiAgICAgICAgdmFyIGZyb20gPSBzZWcuZnJvbSwgdG8gPSBzZWcudG87XG4gICAgICAgIHZhciBjdXJyZW50UmF0aW8gPSBzZWcubGVuZ3RoIC8gdG90YWxMZW5ndGg7XG4gICAgICAgIGlmICh0ID49IHN0YXJ0UmF0aW8gJiYgdCA8PSBzdGFydFJhdGlvICsgY3VycmVudFJhdGlvKSB7XG4gICAgICAgICAgICB2YXIgbG9jYWxSYXRpbyA9ICh0IC0gc3RhcnRSYXRpbykgLyBjdXJyZW50UmF0aW87XG4gICAgICAgICAgICBwb2ludCA9IGxpbmUucG9pbnRBdChmcm9tWzBdLCBmcm9tWzFdLCB0b1swXSwgdG9bMV0sIGxvY2FsUmF0aW8pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgc3RhcnRSYXRpbyArPSBjdXJyZW50UmF0aW87XG4gICAgfVxuICAgIHJldHVybiBwb2ludDtcbn1cbi8qKlxuICog5oyJ54Wn5q+U5L6L5Zyo5pWw5o2u54mH5q615Lit6I635Y+W5YiH57q/55qE6KeS5bqmXG4gKiBAcGFyYW0ge2FycmF5fSBwb2ludHMg54K555qE6ZuG5ZCIXG4gKiBAcGFyYW0ge251bWJlcn0gdCDnmb7liIbmr5QgMC0xXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhbmdsZUF0U2VnbWVudHMocG9pbnRzLCB0KSB7XG4gICAgLy8g6L6555WM5Yik5patXG4gICAgaWYgKHQgPiAxIHx8IHQgPCAwIHx8IHBvaW50cy5sZW5ndGggPCAyKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICB2YXIgX2EgPSBhbmFseXplUG9pbnRzKHBvaW50cyksIHNlZ21lbnRzID0gX2Euc2VnbWVudHMsIHRvdGFsTGVuZ3RoID0gX2EudG90YWxMZW5ndGg7XG4gICAgLy8g6K6h566X5q+U5L6LXG4gICAgdmFyIHN0YXJ0UmF0aW8gPSAwO1xuICAgIHZhciBhbmdsZSA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWdtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgc2VnID0gc2VnbWVudHNbaV07XG4gICAgICAgIHZhciBmcm9tID0gc2VnLmZyb20sIHRvID0gc2VnLnRvO1xuICAgICAgICB2YXIgY3VycmVudFJhdGlvID0gc2VnLmxlbmd0aCAvIHRvdGFsTGVuZ3RoO1xuICAgICAgICBpZiAodCA+PSBzdGFydFJhdGlvICYmIHQgPD0gc3RhcnRSYXRpbyArIGN1cnJlbnRSYXRpbykge1xuICAgICAgICAgICAgYW5nbGUgPSBNYXRoLmF0YW4yKHRvWzFdIC0gZnJvbVsxXSwgdG9bMF0gLSBmcm9tWzBdKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHN0YXJ0UmF0aW8gKz0gY3VycmVudFJhdGlvO1xuICAgIH1cbiAgICByZXR1cm4gYW5nbGU7XG59XG5leHBvcnQgZnVuY3Rpb24gZGlzdGFuY2VBdFNlZ21lbnQocG9pbnRzLCB4LCB5KSB7XG4gICAgdmFyIG1pbkRpc3RhbmNlID0gSW5maW5pdHk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb2ludHMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgIHZhciBwb2ludCA9IHBvaW50c1tpXTtcbiAgICAgICAgdmFyIG5leHRQb2ludCA9IHBvaW50c1tpICsgMV07XG4gICAgICAgIHZhciBkaXN0YW5jZV8xID0gbGluZS5wb2ludERpc3RhbmNlKHBvaW50WzBdLCBwb2ludFsxXSwgbmV4dFBvaW50WzBdLCBuZXh0UG9pbnRbMV0sIHgsIHkpO1xuICAgICAgICBpZiAoZGlzdGFuY2VfMSA8IG1pbkRpc3RhbmNlKSB7XG4gICAgICAgICAgICBtaW5EaXN0YW5jZSA9IGRpc3RhbmNlXzE7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1pbkRpc3RhbmNlO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2VnbWVudHMuanMubWFwIiwiaW1wb3J0IHsgcG9pbnRBdFNlZ21lbnRzLCBhbmdsZUF0U2VnbWVudHMsIGRpc3RhbmNlQXRTZWdtZW50LCBsZW5ndGhPZlNlZ21lbnQgfSBmcm9tICcuL3NlZ21lbnRzJztcbmltcG9ydCB7IGdldEJCb3hCeUFycmF5IH0gZnJvbSAnLi91dGlsJztcbmV4cG9ydCBkZWZhdWx0IHtcbiAgICAvKipcbiAgICAgKiDorqHnrpflpJrmipjnur/nmoTljIXlm7Tnm5JcbiAgICAgKiBAcGFyYW0ge2FycmF5fSBwb2ludHMg54K555qE6ZuG5ZCIIFt4LHldIOeahOW9ouW8j1xuICAgICAqIEByZXR1cm4ge29iamVjdH0g5YyF5Zu055uSXG4gICAgICovXG4gICAgYm94OiBmdW5jdGlvbiAocG9pbnRzKSB7XG4gICAgICAgIHZhciB4QXJyID0gW107XG4gICAgICAgIHZhciB5QXJyID0gW107XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcG9pbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgcG9pbnQgPSBwb2ludHNbaV07XG4gICAgICAgICAgICB4QXJyLnB1c2gocG9pbnRbMF0pO1xuICAgICAgICAgICAgeUFyci5wdXNoKHBvaW50WzFdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZ2V0QkJveEJ5QXJyYXkoeEFyciwgeUFycik7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDorqHnrpflpJrmipjnur/nmoTplb/luqZcbiAgICAgKiBAcGFyYW0ge2FycmF5fSBwb2ludHMg54K555qE6ZuG5ZCIIFt4LHldIOeahOW9ouW8j1xuICAgICAqIEByZXR1cm4ge29iamVjdH0g5aSa5p2h6L6555qE6ZW/5bqmXG4gICAgICovXG4gICAgbGVuZ3RoOiBmdW5jdGlvbiAocG9pbnRzKSB7XG4gICAgICAgIHJldHVybiBsZW5ndGhPZlNlZ21lbnQocG9pbnRzKTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOagueaNruavlOS+i+iOt+WPluWkmuaKmOe6v+eahOeCuVxuICAgICAqIEBwYXJhbSB7YXJyYXl9IHBvaW50cyDngrnnmoTpm4blkIggW3gseV0g55qE5b2i5byPXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHQg5Zyo5aSa5oqY57q/55qE6ZW/5bqm5LiK55qE5q+U5L6LXG4gICAgICogQHJldHVybiB7b2JqZWN0fSDmoLnmja7mr5TkvovlgLzorqHnrpflh7rmnaXnmoTngrlcbiAgICAgKi9cbiAgICBwb2ludEF0OiBmdW5jdGlvbiAocG9pbnRzLCB0KSB7XG4gICAgICAgIHJldHVybiBwb2ludEF0U2VnbWVudHMocG9pbnRzLCB0KTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOaMh+WumueCueWIsOWkmuaKmOe6v+eahOi3neemu1xuICAgICAqIEBwYXJhbSB7YXJyYXl9IHBvaW50cyDngrnnmoTpm4blkIggW3gseV0g55qE5b2i5byPXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHgg5oyH5a6a54K555qEIHhcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geSDmjIflrprngrnnmoQgeVxuICAgICAqIEByZXR1cm4ge251bWJlcn0g54K55Yiw5aSa5oqY57q/55qE6Led56a7XG4gICAgICovXG4gICAgcG9pbnREaXN0YW5jZTogZnVuY3Rpb24gKHBvaW50cywgeCwgeSkge1xuICAgICAgICByZXR1cm4gZGlzdGFuY2VBdFNlZ21lbnQocG9pbnRzLCB4LCB5KTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOagueaNruavlOS+i+iOt+WPluWkmuaKmOe6v+eahOWIh+e6v+inkuW6plxuICAgICAqIEBwYXJhbSB7YXJyYXl9IHBvaW50cyDngrnnmoTpm4blkIggW3gseV0g55qE5b2i5byPXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHQg5Zyo5aSa5oqY57q/55qE6ZW/5bqm5LiK55qE5q+U5L6LXG4gICAgICogQHJldHVybiB7b2JqZWN0fSDmoLnmja7mr5TkvovlgLzorqHnrpflh7rmnaXnmoTop5LluqZcbiAgICAgKi9cbiAgICB0YW5nZW50QW5nbGU6IGZ1bmN0aW9uIChwb2ludHMsIHQpIHtcbiAgICAgICAgcmV0dXJuIGFuZ2xlQXRTZWdtZW50cyhwb2ludHMsIHQpO1xuICAgIH0sXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cG9seWxpbmUuanMubWFwIiwiaW1wb3J0IHsgcG9pbnRBdFNlZ21lbnRzLCBhbmdsZUF0U2VnbWVudHMsIGRpc3RhbmNlQXRTZWdtZW50LCBsZW5ndGhPZlNlZ21lbnQgfSBmcm9tICcuL3NlZ21lbnRzJztcbmltcG9ydCBwb2x5bGluZSBmcm9tICcuL3BvbHlsaW5lJztcbmZ1bmN0aW9uIGdldEFsbFBvaW50cyhwb2ludHMpIHtcbiAgICB2YXIgdG1wID0gcG9pbnRzLnNsaWNlKDApO1xuICAgIGlmIChwb2ludHMubGVuZ3RoKSB7XG4gICAgICAgIHRtcC5wdXNoKHBvaW50c1swXSk7XG4gICAgfVxuICAgIHJldHVybiB0bXA7XG59XG5leHBvcnQgZGVmYXVsdCB7XG4gICAgLyoqXG4gICAgICog6K6h566X5aSa6L655b2i55qE5YyF5Zu055uSXG4gICAgICogQHBhcmFtIHthcnJheX0gcG9pbnRzIOeCueeahOmbhuWQiCBbeCx5XSDnmoTlvaLlvI9cbiAgICAgKiBAcmV0dXJuIHtvYmplY3R9IOWMheWbtOebklxuICAgICAqL1xuICAgIGJveDogZnVuY3Rpb24gKHBvaW50cykge1xuICAgICAgICByZXR1cm4gcG9seWxpbmUuYm94KHBvaW50cyk7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDorqHnrpflpJrovrnlvaLnmoTplb/luqZcbiAgICAgKiBAcGFyYW0ge2FycmF5fSBwb2ludHMg54K555qE6ZuG5ZCIIFt4LHldIOeahOW9ouW8j1xuICAgICAqIEByZXR1cm4ge29iamVjdH0g5aSa6L655b2i6L6555qE6ZW/5bqmXG4gICAgICovXG4gICAgbGVuZ3RoOiBmdW5jdGlvbiAocG9pbnRzKSB7XG4gICAgICAgIHJldHVybiBsZW5ndGhPZlNlZ21lbnQoZ2V0QWxsUG9pbnRzKHBvaW50cykpO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICog5qC55o2u5q+U5L6L6I635Y+W5aSa6L655b2i55qE54K5XG4gICAgICogQHBhcmFtIHthcnJheX0gcG9pbnRzIOeCueeahOmbhuWQiCBbeCx5XSDnmoTlvaLlvI9cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdCDlnKjlpJrovrnlvaLnmoTplb/luqbkuIrnmoTmr5TkvotcbiAgICAgKiBAcmV0dXJuIHtvYmplY3R9IOagueaNruavlOS+i+WAvOiuoeeul+WHuuadpeeahOeCuVxuICAgICAqL1xuICAgIHBvaW50QXQ6IGZ1bmN0aW9uIChwb2ludHMsIHQpIHtcbiAgICAgICAgcmV0dXJuIHBvaW50QXRTZWdtZW50cyhnZXRBbGxQb2ludHMocG9pbnRzKSwgdCk7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDmjIflrprngrnliLDlpJrovrnlvaLnmoTot53nprtcbiAgICAgKiBAcGFyYW0ge2FycmF5fSBwb2ludHMg54K555qE6ZuG5ZCIIFt4LHldIOeahOW9ouW8j1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4IOaMh+WumueCueeahCB4XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHkg5oyH5a6a54K555qEIHlcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IOeCueWIsOWkmui+ueW9oueahOi3neemu1xuICAgICAqL1xuICAgIHBvaW50RGlzdGFuY2U6IGZ1bmN0aW9uIChwb2ludHMsIHgsIHkpIHtcbiAgICAgICAgcmV0dXJuIGRpc3RhbmNlQXRTZWdtZW50KGdldEFsbFBvaW50cyhwb2ludHMpLCB4LCB5KTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOagueaNruavlOS+i+iOt+WPluWkmui+ueW9oueahOWIh+e6v+inkuW6plxuICAgICAqIEBwYXJhbSB7YXJyYXl9IHBvaW50cyDngrnnmoTpm4blkIggW3gseV0g55qE5b2i5byPXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHQg5Zyo5aSa6L655b2i55qE6ZW/5bqm5LiK55qE5q+U5L6LXG4gICAgICogQHJldHVybiB7b2JqZWN0fSDmoLnmja7mr5TkvovlgLzorqHnrpflh7rmnaXnmoTop5LluqZcbiAgICAgKi9cbiAgICB0YW5nZW50QW5nbGU6IGZ1bmN0aW9uIChwb2ludHMsIHQpIHtcbiAgICAgICAgcmV0dXJuIGFuZ2xlQXRTZWdtZW50cyhnZXRBbGxQb2ludHMocG9pbnRzKSwgdCk7XG4gICAgfSxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wb2x5Z29uLmpzLm1hcCIsImltcG9ydCBRdWFkIGZyb20gJy4vcXVhZHJhdGljJztcbmltcG9ydCBDdWJpYyBmcm9tICcuL2N1YmljJztcbmltcG9ydCBBcmMgZnJvbSAnLi9hcmMnO1xuaW1wb3J0IExpbmUgZnJvbSAnLi9saW5lJztcbmltcG9ydCBQb2x5Z29uIGZyb20gJy4vcG9seWdvbic7XG5pbXBvcnQgUG9seWxpbmUgZnJvbSAnLi9wb2x5bGluZSc7XG5pbXBvcnQgKiBhcyBVdGlsIGZyb20gJy4vdXRpbCc7XG5leHBvcnQgeyBRdWFkLCBDdWJpYywgQXJjLCBMaW5lLCBQb2x5Z29uLCBQb2x5bGluZSwgVXRpbCB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///20\n')},function(module,__webpack_exports__,__webpack_require__){"use strict";eval('/* unused harmony export version */\n/* harmony import */ var _util_path__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(52);\n/* harmony reexport (module object) */ __webpack_require__.d(__webpack_exports__, "PathUtil", function() { return _util_path__WEBPACK_IMPORTED_MODULE_0__; });\n/* harmony import */ var _types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(175);\n/* harmony import */ var _types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_types__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _interfaces__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(176);\n/* harmony import */ var _interfaces__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_interfaces__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _event_graph_event__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(118);\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Event", function() { return _event_graph_event__WEBPACK_IMPORTED_MODULE_3__["a"]; });\n\n/* harmony import */ var _abstract_base__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(119);\n/* harmony import */ var _abstract_canvas__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(275);\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "AbstractCanvas", function() { return _abstract_canvas__WEBPACK_IMPORTED_MODULE_5__["a"]; });\n\n/* harmony import */ var _abstract_group__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(178);\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "AbstractGroup", function() { return _abstract_group__WEBPACK_IMPORTED_MODULE_6__["a"]; });\n\n/* harmony import */ var _abstract_shape__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(179);\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "AbstractShape", function() { return _abstract_shape__WEBPACK_IMPORTED_MODULE_7__["a"]; });\n\n/* harmony import */ var _bbox__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(276);\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getBBoxMethod", function() { return _bbox__WEBPACK_IMPORTED_MODULE_8__["a"]; });\n\n/* harmony import */ var _util_text__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(69);\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getTextHeight", function() { return _util_text__WEBPACK_IMPORTED_MODULE_9__["b"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "assembleFont", function() { return _util_text__WEBPACK_IMPORTED_MODULE_9__["a"]; });\n\n/* harmony import */ var _util_util__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(19);\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isAllowCapture", function() { return _util_util__WEBPACK_IMPORTED_MODULE_10__["b"]; });\n\n/* harmony import */ var _util_matrix__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(38);\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "multiplyVec2", function() { return _util_matrix__WEBPACK_IMPORTED_MODULE_11__["c"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "invert", function() { return _util_matrix__WEBPACK_IMPORTED_MODULE_11__["a"]; });\n\n/* harmony import */ var _util_offscreen__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(120);\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getOffScreenContext", function() { return _util_offscreen__WEBPACK_IMPORTED_MODULE_12__["a"]; });\n\n/**\n * @fileoverview G 的基础接口定义和所有的抽象类\n * @author dxq613@gmail.com\n */\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nvar version = \'0.5.6\';\n//# sourceMappingURL=index.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy1iYXNlL2VzbS9pbmRleC5qcz82ODU1Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ3dDO0FBQ2hCO0FBQ0s7QUFDMEI7QUFDTDtBQUNZO0FBQ0Y7QUFDQTtBQUN4QztBQUNtQjtBQUNtQjtBQUNiO0FBQ1E7QUFDRTtBQUNoRDtBQUNQIiwiZmlsZSI6IjIxLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZW92ZXJ2aWV3IEcg55qE5Z+656GA5o6l5Y+j5a6a5LmJ5ZKM5omA5pyJ55qE5oq96LGh57G7XG4gKiBAYXV0aG9yIGR4cTYxM0BnbWFpbC5jb21cbiAqL1xuaW1wb3J0ICogYXMgUGF0aFV0aWwgZnJvbSAnLi91dGlsL3BhdGgnO1xuZXhwb3J0ICogZnJvbSAnLi90eXBlcyc7XG5leHBvcnQgKiBmcm9tICcuL2ludGVyZmFjZXMnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBFdmVudCB9IGZyb20gJy4vZXZlbnQvZ3JhcGgtZXZlbnQnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBCYXNlIH0gZnJvbSAnLi9hYnN0cmFjdC9iYXNlJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgQWJzdHJhY3RDYW52YXMgfSBmcm9tICcuL2Fic3RyYWN0L2NhbnZhcyc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIEFic3RyYWN0R3JvdXAgfSBmcm9tICcuL2Fic3RyYWN0L2dyb3VwJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgQWJzdHJhY3RTaGFwZSB9IGZyb20gJy4vYWJzdHJhY3Qvc2hhcGUnO1xuZXhwb3J0IHsgUGF0aFV0aWwgfTtcbmV4cG9ydCB7IGdldEJCb3hNZXRob2QgfSBmcm9tICcuL2Jib3gnO1xuZXhwb3J0IHsgZ2V0VGV4dEhlaWdodCwgYXNzZW1ibGVGb250IH0gZnJvbSAnLi91dGlsL3RleHQnO1xuZXhwb3J0IHsgaXNBbGxvd0NhcHR1cmUgfSBmcm9tICcuL3V0aWwvdXRpbCc7XG5leHBvcnQgeyBtdWx0aXBseVZlYzIsIGludmVydCB9IGZyb20gJy4vdXRpbC9tYXRyaXgnO1xuZXhwb3J0IHsgZ2V0T2ZmU2NyZWVuQ29udGV4dCB9IGZyb20gJy4vdXRpbC9vZmZzY3JlZW4nO1xuZXhwb3J0IHZhciB2ZXJzaW9uID0gJzAuNS42Jztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///21\n')},function(module,exports){eval('function _assertThisInitialized(self) {\n if (self === void 0) {\n throw new ReferenceError("this hasn\'t been initialised - super() hasn\'t been called");\n }\n\n return self;\n}\n\nmodule.exports = _assertThisInitialized;\nmodule.exports["default"] = module.exports, module.exports.__esModule = true;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQuanM/M2M5NiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EiLCJmaWxlIjoiMjIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJmdW5jdGlvbiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpIHtcbiAgaWYgKHNlbGYgPT09IHZvaWQgMCkge1xuICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTtcbiAgfVxuXG4gIHJldHVybiBzZWxmO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQ7XG5tb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0cywgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///22\n')},function(module,exports,__webpack_require__){eval('var setPrototypeOf = __webpack_require__(528);\n\nfunction _inherits(subClass, superClass) {\n if (typeof superClass !== "function" && superClass !== null) {\n throw new TypeError("Super expression must either be null or a function");\n }\n\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n writable: true,\n configurable: true\n }\n });\n if (superClass) setPrototypeOf(subClass, superClass);\n}\n\nmodule.exports = _inherits;\nmodule.exports["default"] = module.exports, module.exports.__esModule = true;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbmhlcml0cy5qcz9lZDZkIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHFCQUFxQixtQkFBTyxDQUFDLEdBQXFCOztBQUVsRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBIiwiZmlsZSI6IjIzLmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIHNldFByb3RvdHlwZU9mID0gcmVxdWlyZShcIi4vc2V0UHJvdG90eXBlT2YuanNcIik7XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykge1xuICBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uXCIpO1xuICB9XG5cbiAgc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7XG4gICAgY29uc3RydWN0b3I6IHtcbiAgICAgIHZhbHVlOiBzdWJDbGFzcyxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfVxuICB9KTtcbiAgaWYgKHN1cGVyQ2xhc3MpIHNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfaW5oZXJpdHM7XG5tb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0cywgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///23\n')},function(module,exports,__webpack_require__){eval('var _typeof = __webpack_require__(41)["default"];\n\nvar assertThisInitialized = __webpack_require__(22);\n\nfunction _possibleConstructorReturn(self, call) {\n if (call && (_typeof(call) === "object" || typeof call === "function")) {\n return call;\n } else if (call !== void 0) {\n throw new TypeError("Derived constructors may only return object or undefined");\n }\n\n return assertThisInitialized(self);\n}\n\nmodule.exports = _possibleConstructorReturn;\nmodule.exports["default"] = module.exports, module.exports.__esModule = true;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuLmpzPzZiNTgiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxtQkFBTyxDQUFDLEVBQStCOztBQUVyRCw0QkFBNEIsbUJBQU8sQ0FBQyxFQUE0Qjs7QUFFaEU7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBIiwiZmlsZSI6IjI0LmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIF90eXBlb2YgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy90eXBlb2ZcIilbXCJkZWZhdWx0XCJdO1xuXG52YXIgYXNzZXJ0VGhpc0luaXRpYWxpemVkID0gcmVxdWlyZShcIi4vYXNzZXJ0VGhpc0luaXRpYWxpemVkLmpzXCIpO1xuXG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7XG4gIGlmIChjYWxsICYmIChfdHlwZW9mKGNhbGwpID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpKSB7XG4gICAgcmV0dXJuIGNhbGw7XG4gIH0gZWxzZSBpZiAoY2FsbCAhPT0gdm9pZCAwKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkRlcml2ZWQgY29uc3RydWN0b3JzIG1heSBvbmx5IHJldHVybiBvYmplY3Qgb3IgdW5kZWZpbmVkXCIpO1xuICB9XG5cbiAgcmV0dXJuIGFzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjtcbm1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///24\n')},function(module,__webpack_exports__,__webpack_require__){"use strict";eval('/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Component; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return ComponentManager; });\n/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(9);\n/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(15);\n/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(7);\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(6);\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _Entity__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(121);\n\n\n\n\n\nvar Component = function Component(data) {//\n\n _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3___default()(this, Component);\n};\n/**\n * 管理某一类 Component,尽可能做到 AoS 而非 SoA\n * @see https://wickedengine.net/2019/09/29/entity-component-system/\n * @see https://github.com/turanszkij/WickedEngine/blob/master/WickedEngine/wiECS.h\n */\n// tslint:disable-next-line:max-classes-per-file\n\nvar ComponentManager = /*#__PURE__*/function () {\n /**\n * 不在 Entity 中维护拥有的 Component 列表,反之亦然\n */\n function ComponentManager(clazz) {\n _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3___default()(this, ComponentManager);\n\n this.clazz = void 0;\n this.components = [];\n this.entities = [];\n this.lookup = {};\n this.clazz = clazz;\n }\n\n _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2___default()(ComponentManager, [{\n key: "clear",\n value: function clear() {\n this.components = [];\n this.entities = [];\n this.lookup = {};\n }\n }, {\n key: "contains",\n value: function contains(entity) {\n return this.lookup[entity] > -1;\n }\n }, {\n key: "create",\n value: function create(entity, data) {\n this.lookup[entity] = this.components.length;\n var component = new this.clazz(data || {});\n this.components.push(component);\n this.entities.push(entity);\n return component;\n }\n }, {\n key: "remove",\n value: function remove(entity) {\n var componentIndex = this.lookup[entity];\n\n if (componentIndex > -1) {\n if (componentIndex < this.components.length - 1) {\n // 将待删除元素和最后一个元素交换\n // C++ 中有 std::move 这样的操作,避免数据的拷贝\n // @see https://github.com/turanszkij/WickedEngine/blob/master/WickedEngine/wiECS.h#L169\n this.components[componentIndex] = this.components[this.components.length - 1];\n this.entities[componentIndex] = this.entities[this.entities.length - 1];\n this.lookup[this.entities[componentIndex]] = componentIndex;\n }\n } // 待删除元素已经移动到了最后一个\n\n\n this.components.pop();\n this.entities.pop();\n delete this.lookup[entity];\n }\n }, {\n key: "removeKeepSorted",\n value: function removeKeepSorted(entity) {\n var componentIndex = this.lookup[entity];\n\n if (componentIndex > -1) {\n var entity2 = this.entities[componentIndex];\n\n if (componentIndex < this.components.length - 1) {\n // Move every component left by one that is after this element:\n for (var _i = componentIndex + 1; _i < this.components.length; ++_i) {\n this.components[_i - 1] = this.components[_i];\n } // Move every entity left by one that is after this element and update lut:\n\n\n for (var _i2 = componentIndex + 1; _i2 < this.entities.length; ++_i2) {\n this.entities[_i2 - 1] = this.entities[_i2];\n this.lookup[this.entities[_i2 - 1]] = _i2 - 1;\n }\n }\n\n this.components.pop();\n this.entities.pop();\n delete this.lookup[entity2];\n }\n }\n }, {\n key: "moveItem",\n value: function moveItem(srcIndex, destIndex) {\n if (srcIndex === destIndex) {\n return;\n } // Save the moved component and entity:\n\n\n var srcComponent = this.components[srcIndex];\n var srcEntity = this.entities[srcIndex]; // Every other entity-component that\'s in the way gets moved by one and lut is kept updated:\n\n var direction = srcIndex < destIndex ? 1 : -1;\n\n for (var _i3 = srcIndex; _i3 !== destIndex; _i3 += direction) {\n var next = _i3 + direction;\n this.components[_i3] = this.components[next];\n this.entities[_i3] = this.entities[next];\n this.lookup[this.entities[_i3]] = _i3;\n } // Saved entity-component moved to the required position:\n\n\n this.components[destIndex] = srcComponent;\n this.entities[destIndex] = srcEntity;\n this.lookup[srcEntity] = destIndex;\n }\n }, {\n key: "getEntity",\n value: function getEntity(index) {\n return this.entities[index];\n }\n /**\n * 由于缺少类似 C++ 的重载操作符,没法通过 [下标] 直接访问。因此只能增加该方法用于遍历。\n */\n\n }, {\n key: "getComponent",\n value: function getComponent(index) {\n return this.components[index];\n }\n }, {\n key: "getComponentByEntity",\n value: function getComponentByEntity(entity) {\n var componentIndex = this.lookup[entity];\n\n if (componentIndex > -1) {\n return this.components[componentIndex];\n }\n\n return null;\n }\n }, {\n key: "getCount",\n value: function getCount() {\n return this.components.length;\n }\n }, {\n key: "getEntityByComponentIndex",\n value: function getEntityByComponentIndex(componentIdx) {\n for (var _i4 = 0, _Object$keys = Object.keys(this.lookup); _i4 < _Object$keys.length; _i4++) {\n var _entity = _Object$keys[_i4];\n var entityInNum = Number(_entity);\n\n if (this.lookup[entityInNum] === componentIdx) {\n return entityInNum;\n }\n }\n\n return _Entity__WEBPACK_IMPORTED_MODULE_4__[/* EMPTY */ "a"];\n }\n }, {\n key: "find",\n value: function find(callback) {\n for (var _i5 = 0; _i5 < this.getCount(); _i5++) {\n var _component = this.getComponent(_i5);\n\n if (callback(_component, _i5)) {\n return _component;\n }\n }\n\n return null;\n }\n }, {\n key: "findIndex",\n value: function findIndex(callback) {\n for (var _i6 = 0; _i6 < this.getCount(); _i6++) {\n var _component2 = this.getComponent(_i6);\n\n if (callback(_component2, _i6)) {\n return _i6;\n }\n }\n\n return -1;\n }\n }, {\n key: "forEach",\n value: function forEach(callback) {\n for (var _i7 = 0, _Object$keys2 = Object.keys(this.lookup); _i7 < _Object$keys2.length; _i7++) {\n var _entity2 = _Object$keys2[_i7];\n var entityInNum = Number(_entity2);\n var componentIndex = this.lookup[entityInNum];\n callback(entityInNum, this.getComponent(componentIndex));\n }\n }\n }, {\n key: "forEachAsync",\n value: function () {\n var _forEachAsync = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee(callback) {\n var _i8, _Object$keys3, _entity3, entityInNum, componentIndex;\n\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n _i8 = 0, _Object$keys3 = Object.keys(this.lookup);\n\n case 1:\n if (!(_i8 < _Object$keys3.length)) {\n _context.next = 10;\n break;\n }\n\n _entity3 = _Object$keys3[_i8];\n entityInNum = Number(_entity3);\n componentIndex = this.lookup[entityInNum];\n _context.next = 7;\n return callback(entityInNum, this.getComponent(componentIndex));\n\n case 7:\n _i8++;\n _context.next = 1;\n break;\n\n case 10:\n case "end":\n return _context.stop();\n }\n }\n }, _callee, this);\n }));\n\n function forEachAsync(_x) {\n return _forEachAsync.apply(this, arguments);\n }\n\n return forEachAsync;\n }()\n }, {\n key: "map",\n value: function map(callback) {\n var result = [];\n\n for (var _i9 = 0, _Object$keys4 = Object.keys(this.lookup); _i9 < _Object$keys4.length; _i9++) {\n var _entity4 = _Object$keys4[_i9];\n var entityInNum = Number(_entity4);\n var componentIndex = this.lookup[entityInNum];\n result.push(callback(entityInNum, this.getComponent(componentIndex)));\n }\n\n return result;\n }\n }]);\n\n return ComponentManager;\n}();\n//# sourceMappingURL=ComponentManager.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy13ZWJncHUtY29yZS9lcy9Db21wb25lbnRNYW5hZ2VyLmpzP2EwM2IiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUE2RDtBQUNXO0FBQ1Y7QUFDTTtBQUNuQztBQUMxQiwwQ0FBMEM7O0FBRWpELEVBQUUsNEVBQWU7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksNEVBQWU7O0FBRW5CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxFQUFFLHlFQUFZO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLCtDQUErQztBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7O0FBR1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDJDQUEyQyw2QkFBNkI7QUFDeEU7QUFDQSxXQUFXOzs7QUFHWCw0Q0FBNEMsNEJBQTRCO0FBQ3hFO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPOzs7QUFHUDtBQUNBLDhDQUE4Qzs7QUFFOUM7O0FBRUEsOEJBQThCLG1CQUFtQjtBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87OztBQUdQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLGdFQUFnRSwyQkFBMkI7QUFDM0Y7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxhQUFhLHFEQUFLO0FBQ2xCO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSx1QkFBdUIsdUJBQXVCO0FBQzlDOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLHVCQUF1Qix1QkFBdUI7QUFDOUM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsaUVBQWlFLDRCQUE0QjtBQUM3RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLDBCQUEwQiw4RUFBaUIsZUFBZSxpRUFBbUI7QUFDN0U7O0FBRUEsZUFBZSxpRUFBbUI7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTzs7QUFFUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQSxpRUFBaUUsNEJBQTRCO0FBQzdGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQSxDQUFDO0FBQ0QiLCJmaWxlIjoiMjUuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgX3JlZ2VuZXJhdG9yUnVudGltZSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvcmVnZW5lcmF0b3JcIjtcbmltcG9ydCBfYXN5bmNUb0dlbmVyYXRvciBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hc3luY1RvR2VuZXJhdG9yXCI7XG5pbXBvcnQgX2NyZWF0ZUNsYXNzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzXCI7XG5pbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrXCI7XG5pbXBvcnQgeyBFTVBUWSB9IGZyb20gJy4vRW50aXR5JztcbmV4cG9ydCB2YXIgQ29tcG9uZW50ID0gZnVuY3Rpb24gQ29tcG9uZW50KGRhdGEpIHsvL1xuXG4gIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBDb21wb25lbnQpO1xufTtcbi8qKlxuICog566h55CG5p+Q5LiA57G7IENvbXBvbmVudO+8jOWwveWPr+iDveWBmuWIsCBBb1Mg6ICM6Z2eIFNvQVxuICogQHNlZSBodHRwczovL3dpY2tlZGVuZ2luZS5uZXQvMjAxOS8wOS8yOS9lbnRpdHktY29tcG9uZW50LXN5c3RlbS9cbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3R1cmFuc3praWovV2lja2VkRW5naW5lL2Jsb2IvbWFzdGVyL1dpY2tlZEVuZ2luZS93aUVDUy5oXG4gKi9cbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtY2xhc3Nlcy1wZXItZmlsZVxuXG5leHBvcnQgdmFyIENvbXBvbmVudE1hbmFnZXIgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICAvKipcbiAgICog5LiN5ZyoIEVudGl0eSDkuK3nu7TmiqTmi6XmnInnmoQgQ29tcG9uZW50IOWIl+ihqO+8jOWPjeS5i+S6pueEtlxuICAgKi9cbiAgZnVuY3Rpb24gQ29tcG9uZW50TWFuYWdlcihjbGF6eikge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBDb21wb25lbnRNYW5hZ2VyKTtcblxuICAgIHRoaXMuY2xhenogPSB2b2lkIDA7XG4gICAgdGhpcy5jb21wb25lbnRzID0gW107XG4gICAgdGhpcy5lbnRpdGllcyA9IFtdO1xuICAgIHRoaXMubG9va3VwID0ge307XG4gICAgdGhpcy5jbGF6eiA9IGNsYXp6O1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKENvbXBvbmVudE1hbmFnZXIsIFt7XG4gICAga2V5OiBcImNsZWFyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNsZWFyKCkge1xuICAgICAgdGhpcy5jb21wb25lbnRzID0gW107XG4gICAgICB0aGlzLmVudGl0aWVzID0gW107XG4gICAgICB0aGlzLmxvb2t1cCA9IHt9O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjb250YWluc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb250YWlucyhlbnRpdHkpIHtcbiAgICAgIHJldHVybiB0aGlzLmxvb2t1cFtlbnRpdHldID4gLTE7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNyZWF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjcmVhdGUoZW50aXR5LCBkYXRhKSB7XG4gICAgICB0aGlzLmxvb2t1cFtlbnRpdHldID0gdGhpcy5jb21wb25lbnRzLmxlbmd0aDtcbiAgICAgIHZhciBjb21wb25lbnQgPSBuZXcgdGhpcy5jbGF6eihkYXRhIHx8IHt9KTtcbiAgICAgIHRoaXMuY29tcG9uZW50cy5wdXNoKGNvbXBvbmVudCk7XG4gICAgICB0aGlzLmVudGl0aWVzLnB1c2goZW50aXR5KTtcbiAgICAgIHJldHVybiBjb21wb25lbnQ7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbW92ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW1vdmUoZW50aXR5KSB7XG4gICAgICB2YXIgY29tcG9uZW50SW5kZXggPSB0aGlzLmxvb2t1cFtlbnRpdHldO1xuXG4gICAgICBpZiAoY29tcG9uZW50SW5kZXggPiAtMSkge1xuICAgICAgICBpZiAoY29tcG9uZW50SW5kZXggPCB0aGlzLmNvbXBvbmVudHMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgIC8vIOWwhuW+heWIoOmZpOWFg+e0oOWSjOacgOWQjuS4gOS4quWFg+e0oOS6pOaNolxuICAgICAgICAgIC8vIEMrKyDkuK3mnIkgc3RkOjptb3ZlIOi/meagt+eahOaTjeS9nO+8jOmBv+WFjeaVsOaNrueahOaLt+i0nVxuICAgICAgICAgIC8vIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3R1cmFuc3praWovV2lja2VkRW5naW5lL2Jsb2IvbWFzdGVyL1dpY2tlZEVuZ2luZS93aUVDUy5oI0wxNjlcbiAgICAgICAgICB0aGlzLmNvbXBvbmVudHNbY29tcG9uZW50SW5kZXhdID0gdGhpcy5jb21wb25lbnRzW3RoaXMuY29tcG9uZW50cy5sZW5ndGggLSAxXTtcbiAgICAgICAgICB0aGlzLmVudGl0aWVzW2NvbXBvbmVudEluZGV4XSA9IHRoaXMuZW50aXRpZXNbdGhpcy5lbnRpdGllcy5sZW5ndGggLSAxXTtcbiAgICAgICAgICB0aGlzLmxvb2t1cFt0aGlzLmVudGl0aWVzW2NvbXBvbmVudEluZGV4XV0gPSBjb21wb25lbnRJbmRleDtcbiAgICAgICAgfVxuICAgICAgfSAvLyDlvoXliKDpmaTlhYPntKDlt7Lnu4/np7vliqjliLDkuobmnIDlkI7kuIDkuKpcblxuXG4gICAgICB0aGlzLmNvbXBvbmVudHMucG9wKCk7XG4gICAgICB0aGlzLmVudGl0aWVzLnBvcCgpO1xuICAgICAgZGVsZXRlIHRoaXMubG9va3VwW2VudGl0eV07XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbW92ZUtlZXBTb3J0ZWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVtb3ZlS2VlcFNvcnRlZChlbnRpdHkpIHtcbiAgICAgIHZhciBjb21wb25lbnRJbmRleCA9IHRoaXMubG9va3VwW2VudGl0eV07XG5cbiAgICAgIGlmIChjb21wb25lbnRJbmRleCA+IC0xKSB7XG4gICAgICAgIHZhciBlbnRpdHkyID0gdGhpcy5lbnRpdGllc1tjb21wb25lbnRJbmRleF07XG5cbiAgICAgICAgaWYgKGNvbXBvbmVudEluZGV4IDwgdGhpcy5jb21wb25lbnRzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAvLyBNb3ZlIGV2ZXJ5IGNvbXBvbmVudCBsZWZ0IGJ5IG9uZSB0aGF0IGlzIGFmdGVyIHRoaXMgZWxlbWVudDpcbiAgICAgICAgICBmb3IgKHZhciBfaSA9IGNvbXBvbmVudEluZGV4ICsgMTsgX2kgPCB0aGlzLmNvbXBvbmVudHMubGVuZ3RoOyArK19pKSB7XG4gICAgICAgICAgICB0aGlzLmNvbXBvbmVudHNbX2kgLSAxXSA9IHRoaXMuY29tcG9uZW50c1tfaV07XG4gICAgICAgICAgfSAvLyBNb3ZlIGV2ZXJ5IGVudGl0eSBsZWZ0IGJ5IG9uZSB0aGF0IGlzIGFmdGVyIHRoaXMgZWxlbWVudCBhbmQgdXBkYXRlIGx1dDpcblxuXG4gICAgICAgICAgZm9yICh2YXIgX2kyID0gY29tcG9uZW50SW5kZXggKyAxOyBfaTIgPCB0aGlzLmVudGl0aWVzLmxlbmd0aDsgKytfaTIpIHtcbiAgICAgICAgICAgIHRoaXMuZW50aXRpZXNbX2kyIC0gMV0gPSB0aGlzLmVudGl0aWVzW19pMl07XG4gICAgICAgICAgICB0aGlzLmxvb2t1cFt0aGlzLmVudGl0aWVzW19pMiAtIDFdXSA9IF9pMiAtIDE7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb21wb25lbnRzLnBvcCgpO1xuICAgICAgICB0aGlzLmVudGl0aWVzLnBvcCgpO1xuICAgICAgICBkZWxldGUgdGhpcy5sb29rdXBbZW50aXR5Ml07XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIm1vdmVJdGVtXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG1vdmVJdGVtKHNyY0luZGV4LCBkZXN0SW5kZXgpIHtcbiAgICAgIGlmIChzcmNJbmRleCA9PT0gZGVzdEluZGV4KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gLy8gU2F2ZSB0aGUgbW92ZWQgY29tcG9uZW50IGFuZCBlbnRpdHk6XG5cblxuICAgICAgdmFyIHNyY0NvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50c1tzcmNJbmRleF07XG4gICAgICB2YXIgc3JjRW50aXR5ID0gdGhpcy5lbnRpdGllc1tzcmNJbmRleF07IC8vIEV2ZXJ5IG90aGVyIGVudGl0eS1jb21wb25lbnQgdGhhdCdzIGluIHRoZSB3YXkgZ2V0cyBtb3ZlZCBieSBvbmUgYW5kIGx1dCBpcyBrZXB0IHVwZGF0ZWQ6XG5cbiAgICAgIHZhciBkaXJlY3Rpb24gPSBzcmNJbmRleCA8IGRlc3RJbmRleCA/IDEgOiAtMTtcblxuICAgICAgZm9yICh2YXIgX2kzID0gc3JjSW5kZXg7IF9pMyAhPT0gZGVzdEluZGV4OyBfaTMgKz0gZGlyZWN0aW9uKSB7XG4gICAgICAgIHZhciBuZXh0ID0gX2kzICsgZGlyZWN0aW9uO1xuICAgICAgICB0aGlzLmNvbXBvbmVudHNbX2kzXSA9IHRoaXMuY29tcG9uZW50c1tuZXh0XTtcbiAgICAgICAgdGhpcy5lbnRpdGllc1tfaTNdID0gdGhpcy5lbnRpdGllc1tuZXh0XTtcbiAgICAgICAgdGhpcy5sb29rdXBbdGhpcy5lbnRpdGllc1tfaTNdXSA9IF9pMztcbiAgICAgIH0gLy8gU2F2ZWQgZW50aXR5LWNvbXBvbmVudCBtb3ZlZCB0byB0aGUgcmVxdWlyZWQgcG9zaXRpb246XG5cblxuICAgICAgdGhpcy5jb21wb25lbnRzW2Rlc3RJbmRleF0gPSBzcmNDb21wb25lbnQ7XG4gICAgICB0aGlzLmVudGl0aWVzW2Rlc3RJbmRleF0gPSBzcmNFbnRpdHk7XG4gICAgICB0aGlzLmxvb2t1cFtzcmNFbnRpdHldID0gZGVzdEluZGV4O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRFbnRpdHlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0RW50aXR5KGluZGV4KSB7XG4gICAgICByZXR1cm4gdGhpcy5lbnRpdGllc1tpbmRleF07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIOeUseS6jue8uuWwkeexu+S8vCBDKysg55qE6YeN6L295pON5L2c56ym77yM5rKh5rOV6YCa6L+HIFvkuIvmoIddIOebtOaOpeiuv+mXruOAguWboOatpOWPquiDveWinuWKoOivpeaWueazleeUqOS6jumBjeWOhuOAglxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0Q29tcG9uZW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldENvbXBvbmVudChpbmRleCkge1xuICAgICAgcmV0dXJuIHRoaXMuY29tcG9uZW50c1tpbmRleF07XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldENvbXBvbmVudEJ5RW50aXR5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldENvbXBvbmVudEJ5RW50aXR5KGVudGl0eSkge1xuICAgICAgdmFyIGNvbXBvbmVudEluZGV4ID0gdGhpcy5sb29rdXBbZW50aXR5XTtcblxuICAgICAgaWYgKGNvbXBvbmVudEluZGV4ID4gLTEpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29tcG9uZW50c1tjb21wb25lbnRJbmRleF07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRDb3VudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRDb3VudCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbXBvbmVudHMubGVuZ3RoO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRFbnRpdHlCeUNvbXBvbmVudEluZGV4XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldEVudGl0eUJ5Q29tcG9uZW50SW5kZXgoY29tcG9uZW50SWR4KSB7XG4gICAgICBmb3IgKHZhciBfaTQgPSAwLCBfT2JqZWN0JGtleXMgPSBPYmplY3Qua2V5cyh0aGlzLmxvb2t1cCk7IF9pNCA8IF9PYmplY3Qka2V5cy5sZW5ndGg7IF9pNCsrKSB7XG4gICAgICAgIHZhciBfZW50aXR5ID0gX09iamVjdCRrZXlzW19pNF07XG4gICAgICAgIHZhciBlbnRpdHlJbk51bSA9IE51bWJlcihfZW50aXR5KTtcblxuICAgICAgICBpZiAodGhpcy5sb29rdXBbZW50aXR5SW5OdW1dID09PSBjb21wb25lbnRJZHgpIHtcbiAgICAgICAgICByZXR1cm4gZW50aXR5SW5OdW07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIEVNUFRZO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJmaW5kXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGZpbmQoY2FsbGJhY2spIHtcbiAgICAgIGZvciAodmFyIF9pNSA9IDA7IF9pNSA8IHRoaXMuZ2V0Q291bnQoKTsgX2k1KyspIHtcbiAgICAgICAgdmFyIF9jb21wb25lbnQgPSB0aGlzLmdldENvbXBvbmVudChfaTUpO1xuXG4gICAgICAgIGlmIChjYWxsYmFjayhfY29tcG9uZW50LCBfaTUpKSB7XG4gICAgICAgICAgcmV0dXJuIF9jb21wb25lbnQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImZpbmRJbmRleFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBmaW5kSW5kZXgoY2FsbGJhY2spIHtcbiAgICAgIGZvciAodmFyIF9pNiA9IDA7IF9pNiA8IHRoaXMuZ2V0Q291bnQoKTsgX2k2KyspIHtcbiAgICAgICAgdmFyIF9jb21wb25lbnQyID0gdGhpcy5nZXRDb21wb25lbnQoX2k2KTtcblxuICAgICAgICBpZiAoY2FsbGJhY2soX2NvbXBvbmVudDIsIF9pNikpIHtcbiAgICAgICAgICByZXR1cm4gX2k2O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAtMTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZm9yRWFjaFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBmb3JFYWNoKGNhbGxiYWNrKSB7XG4gICAgICBmb3IgKHZhciBfaTcgPSAwLCBfT2JqZWN0JGtleXMyID0gT2JqZWN0LmtleXModGhpcy5sb29rdXApOyBfaTcgPCBfT2JqZWN0JGtleXMyLmxlbmd0aDsgX2k3KyspIHtcbiAgICAgICAgdmFyIF9lbnRpdHkyID0gX09iamVjdCRrZXlzMltfaTddO1xuICAgICAgICB2YXIgZW50aXR5SW5OdW0gPSBOdW1iZXIoX2VudGl0eTIpO1xuICAgICAgICB2YXIgY29tcG9uZW50SW5kZXggPSB0aGlzLmxvb2t1cFtlbnRpdHlJbk51bV07XG4gICAgICAgIGNhbGxiYWNrKGVudGl0eUluTnVtLCB0aGlzLmdldENvbXBvbmVudChjb21wb25lbnRJbmRleCkpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJmb3JFYWNoQXN5bmNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF9mb3JFYWNoQXN5bmMgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUubWFyayhmdW5jdGlvbiBfY2FsbGVlKGNhbGxiYWNrKSB7XG4gICAgICAgIHZhciBfaTgsIF9PYmplY3Qka2V5czMsIF9lbnRpdHkzLCBlbnRpdHlJbk51bSwgY29tcG9uZW50SW5kZXg7XG5cbiAgICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUud3JhcChmdW5jdGlvbiBfY2FsbGVlJChfY29udGV4dCkge1xuICAgICAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7XG4gICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICBfaTggPSAwLCBfT2JqZWN0JGtleXMzID0gT2JqZWN0LmtleXModGhpcy5sb29rdXApO1xuXG4gICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICBpZiAoIShfaTggPCBfT2JqZWN0JGtleXMzLmxlbmd0aCkpIHtcbiAgICAgICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxMDtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIF9lbnRpdHkzID0gX09iamVjdCRrZXlzM1tfaThdO1xuICAgICAgICAgICAgICAgIGVudGl0eUluTnVtID0gTnVtYmVyKF9lbnRpdHkzKTtcbiAgICAgICAgICAgICAgICBjb21wb25lbnRJbmRleCA9IHRoaXMubG9va3VwW2VudGl0eUluTnVtXTtcbiAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gNztcbiAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZW50aXR5SW5OdW0sIHRoaXMuZ2V0Q29tcG9uZW50KGNvbXBvbmVudEluZGV4KSk7XG5cbiAgICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICAgIF9pOCsrO1xuICAgICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSwgX2NhbGxlZSwgdGhpcyk7XG4gICAgICB9KSk7XG5cbiAgICAgIGZ1bmN0aW9uIGZvckVhY2hBc3luYyhfeCkge1xuICAgICAgICByZXR1cm4gX2ZvckVhY2hBc3luYy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZm9yRWFjaEFzeW5jO1xuICAgIH0oKVxuICB9LCB7XG4gICAga2V5OiBcIm1hcFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBtYXAoY2FsbGJhY2spIHtcbiAgICAgIHZhciByZXN1bHQgPSBbXTtcblxuICAgICAgZm9yICh2YXIgX2k5ID0gMCwgX09iamVjdCRrZXlzNCA9IE9iamVjdC5rZXlzKHRoaXMubG9va3VwKTsgX2k5IDwgX09iamVjdCRrZXlzNC5sZW5ndGg7IF9pOSsrKSB7XG4gICAgICAgIHZhciBfZW50aXR5NCA9IF9PYmplY3Qka2V5czRbX2k5XTtcbiAgICAgICAgdmFyIGVudGl0eUluTnVtID0gTnVtYmVyKF9lbnRpdHk0KTtcbiAgICAgICAgdmFyIGNvbXBvbmVudEluZGV4ID0gdGhpcy5sb29rdXBbZW50aXR5SW5OdW1dO1xuICAgICAgICByZXN1bHQucHVzaChjYWxsYmFjayhlbnRpdHlJbk51bSwgdGhpcy5nZXRDb21wb25lbnQoY29tcG9uZW50SW5kZXgpKSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIENvbXBvbmVudE1hbmFnZXI7XG59KCk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Db21wb25lbnRNYW5hZ2VyLmpzLm1hcCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///25\n')},function(module,__webpack_exports__,__webpack_require__){"use strict";eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return createSVGElement; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return createDom; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"d\", function() { return sortDom; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return moveTo; });\n/* harmony import */ var _antv_util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(0);\n/* harmony import */ var _constant__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(17);\n\n\n/**\n * 创建并返回图形的 svg 元素\n * @param type svg类型\n */\nfunction createSVGElement(type) {\n return document.createElementNS('http://www.w3.org/2000/svg', type);\n}\n/**\n * 创建并返回图形的 dom 元素\n * @param {IShape} shape 图形\n * @return {SVGElement}\n */\nfunction createDom(shape) {\n var type = _constant__WEBPACK_IMPORTED_MODULE_1__[/* SHAPE_TO_TAGS */ \"a\"][shape.type];\n var parent = shape.getParent();\n if (!type) {\n throw new Error(\"the type \" + shape.type + \" is not supported by svg\");\n }\n var element = createSVGElement(type);\n if (shape.get('id')) {\n element.id = shape.get('id');\n }\n shape.set('el', element);\n shape.set('attrs', {});\n // 对于 defs 下的 dom 节点,parent 为空,通过 context 统一挂载到 defs 节点下\n if (parent) {\n var parentNode = parent.get('el');\n if (parentNode) {\n parentNode.appendChild(element);\n }\n else {\n // parentNode maybe null for group\n parentNode = parent.createDom();\n parent.set('el', parentNode);\n parentNode.appendChild(element);\n }\n }\n return element;\n}\n/**\n * 对 dom 元素进行排序\n * @param {IElement} element 元素\n * @param {sorter} function 排序函数\n */\nfunction sortDom(element, sorter) {\n var el = element.get('el');\n var childList = Object(_antv_util__WEBPACK_IMPORTED_MODULE_0__[\"toArray\"])(el.children).sort(sorter);\n // create empty fragment\n var fragment = document.createDocumentFragment();\n childList.forEach(function (child) {\n fragment.appendChild(child);\n });\n el.appendChild(fragment);\n}\n/**\n * 将 dom 元素移动到父元素下的指定位置\n * @param {SVGElement} element dom 元素\n * @param {number} targetIndex 目标位置(从 0 开始)\n */\nfunction moveTo(element, targetIndex) {\n var parentNode = element.parentNode;\n var siblings = Array.from(parentNode.childNodes).filter(\n // 要求为元素节点,且不能为 defs 节点\n function (node) { return node.nodeType === 1 && node.nodeName.toLowerCase() !== 'defs'; });\n // 获取目标节点\n var target = siblings[targetIndex];\n var currentIndex = siblings.indexOf(element);\n // 如果目标节点存在\n if (target) {\n // 当前索引 > 目标索引,直接插入到目标节点之前即可\n if (currentIndex > targetIndex) {\n parentNode.insertBefore(element, target);\n }\n else if (currentIndex < targetIndex) {\n // 当前索引 < 目标索引\n // 获取目标节点的下一个节点\n var targetNext = siblings[targetIndex + 1];\n // 如果目标节点的下一个节点存在,插入到该节点之前\n if (targetNext) {\n parentNode.insertBefore(element, targetNext);\n }\n else {\n // 如果该节点不存在,则追加到末尾\n parentNode.appendChild(element);\n }\n }\n }\n else {\n parentNode.appendChild(element);\n }\n}\n//# sourceMappingURL=dom.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy1zdmcvZXNtL3V0aWwvZG9tLmpzPzczZWMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQXFDO0FBQ087QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxPQUFPO0FBQ25CLFlBQVk7QUFDWjtBQUNPO0FBQ1AsZUFBZSwrREFBYTtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsU0FBUztBQUNwQixXQUFXLE9BQU87QUFDbEI7QUFDTztBQUNQO0FBQ0Esb0JBQW9CLDBEQUFPO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxXQUFXO0FBQ3RCLFdBQVcsT0FBTztBQUNsQjtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLHNFQUFzRSxFQUFFO0FBQzdGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6IjI2LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdG9BcnJheSB9IGZyb20gJ0BhbnR2L3V0aWwnO1xuaW1wb3J0IHsgU0hBUEVfVE9fVEFHUyB9IGZyb20gJy4uL2NvbnN0YW50Jztcbi8qKlxuICog5Yib5bu65bm26L+U5Zue5Zu+5b2i55qEIHN2ZyDlhYPntKBcbiAqIEBwYXJhbSB0eXBlIHN2Z+exu+Wei1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU1ZHRWxlbWVudCh0eXBlKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCB0eXBlKTtcbn1cbi8qKlxuICog5Yib5bu65bm26L+U5Zue5Zu+5b2i55qEIGRvbSDlhYPntKBcbiAqIEBwYXJhbSAge0lTaGFwZX0gc2hhcGUg5Zu+5b2iXG4gKiBAcmV0dXJuIHtTVkdFbGVtZW50fVxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRG9tKHNoYXBlKSB7XG4gICAgdmFyIHR5cGUgPSBTSEFQRV9UT19UQUdTW3NoYXBlLnR5cGVdO1xuICAgIHZhciBwYXJlbnQgPSBzaGFwZS5nZXRQYXJlbnQoKTtcbiAgICBpZiAoIXR5cGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwidGhlIHR5cGUgXCIgKyBzaGFwZS50eXBlICsgXCIgaXMgbm90IHN1cHBvcnRlZCBieSBzdmdcIik7XG4gICAgfVxuICAgIHZhciBlbGVtZW50ID0gY3JlYXRlU1ZHRWxlbWVudCh0eXBlKTtcbiAgICBpZiAoc2hhcGUuZ2V0KCdpZCcpKSB7XG4gICAgICAgIGVsZW1lbnQuaWQgPSBzaGFwZS5nZXQoJ2lkJyk7XG4gICAgfVxuICAgIHNoYXBlLnNldCgnZWwnLCBlbGVtZW50KTtcbiAgICBzaGFwZS5zZXQoJ2F0dHJzJywge30pO1xuICAgIC8vIOWvueS6jiBkZWZzIOS4i+eahCBkb20g6IqC54K577yMcGFyZW50IOS4uuepuu+8jOmAmui/hyBjb250ZXh0IOe7n+S4gOaMgui9veWIsCBkZWZzIOiKgueCueS4i1xuICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgdmFyIHBhcmVudE5vZGUgPSBwYXJlbnQuZ2V0KCdlbCcpO1xuICAgICAgICBpZiAocGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgcGFyZW50Tm9kZS5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIHBhcmVudE5vZGUgbWF5YmUgbnVsbCBmb3IgZ3JvdXBcbiAgICAgICAgICAgIHBhcmVudE5vZGUgPSBwYXJlbnQuY3JlYXRlRG9tKCk7XG4gICAgICAgICAgICBwYXJlbnQuc2V0KCdlbCcsIHBhcmVudE5vZGUpO1xuICAgICAgICAgICAgcGFyZW50Tm9kZS5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZWxlbWVudDtcbn1cbi8qKlxuICog5a+5IGRvbSDlhYPntKDov5vooYzmjpLluo9cbiAqIEBwYXJhbSB7SUVsZW1lbnR9IGVsZW1lbnQgIOWFg+e0oFxuICogQHBhcmFtIHtzb3J0ZXJ9ICAgZnVuY3Rpb24g5o6S5bqP5Ye95pWwXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzb3J0RG9tKGVsZW1lbnQsIHNvcnRlcikge1xuICAgIHZhciBlbCA9IGVsZW1lbnQuZ2V0KCdlbCcpO1xuICAgIHZhciBjaGlsZExpc3QgPSB0b0FycmF5KGVsLmNoaWxkcmVuKS5zb3J0KHNvcnRlcik7XG4gICAgLy8gY3JlYXRlIGVtcHR5IGZyYWdtZW50XG4gICAgdmFyIGZyYWdtZW50ID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO1xuICAgIGNoaWxkTGlzdC5mb3JFYWNoKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICBmcmFnbWVudC5hcHBlbmRDaGlsZChjaGlsZCk7XG4gICAgfSk7XG4gICAgZWwuYXBwZW5kQ2hpbGQoZnJhZ21lbnQpO1xufVxuLyoqXG4gKiDlsIYgZG9tIOWFg+e0oOenu+WKqOWIsOeItuWFg+e0oOS4i+eahOaMh+WumuS9jee9rlxuICogQHBhcmFtIHtTVkdFbGVtZW50fSBlbGVtZW50ICAgICBkb20g5YWD57SgXG4gKiBAcGFyYW0ge251bWJlcn0gICAgIHRhcmdldEluZGV4IOebruagh+S9jee9rijku44gMCDlvIDlp4spXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtb3ZlVG8oZWxlbWVudCwgdGFyZ2V0SW5kZXgpIHtcbiAgICB2YXIgcGFyZW50Tm9kZSA9IGVsZW1lbnQucGFyZW50Tm9kZTtcbiAgICB2YXIgc2libGluZ3MgPSBBcnJheS5mcm9tKHBhcmVudE5vZGUuY2hpbGROb2RlcykuZmlsdGVyKFxuICAgIC8vIOimgeaxguS4uuWFg+e0oOiKgueCue+8jOS4lOS4jeiDveS4uiBkZWZzIOiKgueCuVxuICAgIGZ1bmN0aW9uIChub2RlKSB7IHJldHVybiBub2RlLm5vZGVUeXBlID09PSAxICYmIG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPT0gJ2RlZnMnOyB9KTtcbiAgICAvLyDojrflj5bnm67moIfoioLngrlcbiAgICB2YXIgdGFyZ2V0ID0gc2libGluZ3NbdGFyZ2V0SW5kZXhdO1xuICAgIHZhciBjdXJyZW50SW5kZXggPSBzaWJsaW5ncy5pbmRleE9mKGVsZW1lbnQpO1xuICAgIC8vIOWmguaenOebruagh+iKgueCueWtmOWcqFxuICAgIGlmICh0YXJnZXQpIHtcbiAgICAgICAgLy8g5b2T5YmN57Si5byVID4g55uu5qCH57Si5byV77yM55u05o6l5o+S5YWl5Yiw55uu5qCH6IqC54K55LmL5YmN5Y2z5Y+vXG4gICAgICAgIGlmIChjdXJyZW50SW5kZXggPiB0YXJnZXRJbmRleCkge1xuICAgICAgICAgICAgcGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZWxlbWVudCwgdGFyZ2V0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjdXJyZW50SW5kZXggPCB0YXJnZXRJbmRleCkge1xuICAgICAgICAgICAgLy8g5b2T5YmN57Si5byVIDwg55uu5qCH57Si5byVXG4gICAgICAgICAgICAvLyDojrflj5bnm67moIfoioLngrnnmoTkuIvkuIDkuKroioLngrlcbiAgICAgICAgICAgIHZhciB0YXJnZXROZXh0ID0gc2libGluZ3NbdGFyZ2V0SW5kZXggKyAxXTtcbiAgICAgICAgICAgIC8vIOWmguaenOebruagh+iKgueCueeahOS4i+S4gOS4quiKgueCueWtmOWcqO+8jOaPkuWFpeWIsOivpeiKgueCueS5i+WJjVxuICAgICAgICAgICAgaWYgKHRhcmdldE5leHQpIHtcbiAgICAgICAgICAgICAgICBwYXJlbnROb2RlLmluc2VydEJlZm9yZShlbGVtZW50LCB0YXJnZXROZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIOWmguaenOivpeiKgueCueS4jeWtmOWcqO+8jOWImei/veWKoOWIsOacq+WwvlxuICAgICAgICAgICAgICAgIHBhcmVudE5vZGUuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHBhcmVudE5vZGUuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZG9tLmpzLm1hcCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///26\n")},function(module,exports,__webpack_require__){eval('var arrayWithoutHoles = __webpack_require__(530);\n\nvar iterableToArray = __webpack_require__(531);\n\nvar unsupportedIterableToArray = __webpack_require__(240);\n\nvar nonIterableSpread = __webpack_require__(532);\n\nfunction _toConsumableArray(arr) {\n return arrayWithoutHoles(arr) || iterableToArray(arr) || unsupportedIterableToArray(arr) || nonIterableSpread();\n}\n\nmodule.exports = _toConsumableArray;\nmodule.exports["default"] = module.exports, module.exports.__esModule = true;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy90b0NvbnN1bWFibGVBcnJheS5qcz80NDhhIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHdCQUF3QixtQkFBTyxDQUFDLEdBQXdCOztBQUV4RCxzQkFBc0IsbUJBQU8sQ0FBQyxHQUFzQjs7QUFFcEQsaUNBQWlDLG1CQUFPLENBQUMsR0FBaUM7O0FBRTFFLHdCQUF3QixtQkFBTyxDQUFDLEdBQXdCOztBQUV4RDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSIsImZpbGUiOiIyNy5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBhcnJheVdpdGhvdXRIb2xlcyA9IHJlcXVpcmUoXCIuL2FycmF5V2l0aG91dEhvbGVzLmpzXCIpO1xuXG52YXIgaXRlcmFibGVUb0FycmF5ID0gcmVxdWlyZShcIi4vaXRlcmFibGVUb0FycmF5LmpzXCIpO1xuXG52YXIgdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkgPSByZXF1aXJlKFwiLi91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheS5qc1wiKTtcblxudmFyIG5vbkl0ZXJhYmxlU3ByZWFkID0gcmVxdWlyZShcIi4vbm9uSXRlcmFibGVTcHJlYWQuanNcIik7XG5cbmZ1bmN0aW9uIF90b0NvbnN1bWFibGVBcnJheShhcnIpIHtcbiAgcmV0dXJuIGFycmF5V2l0aG91dEhvbGVzKGFycikgfHwgaXRlcmFibGVUb0FycmF5KGFycikgfHwgdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkoYXJyKSB8fCBub25JdGVyYWJsZVNwcmVhZCgpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF90b0NvbnN1bWFibGVBcnJheTtcbm1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///27\n')},function(module,exports,__webpack_require__){eval("// eslint-disable-next-line no-redeclare\n/* global window */\n\nvar lodash;\n\nif (true) {\n try {\n lodash = {\n cloneDeep: __webpack_require__(435),\n constant: __webpack_require__(163),\n defaults: __webpack_require__(436),\n each: __webpack_require__(204),\n filter: __webpack_require__(207),\n find: __webpack_require__(437),\n flatten: __webpack_require__(234),\n forEach: __webpack_require__(205),\n forIn: __webpack_require__(444),\n has: __webpack_require__(218),\n isUndefined: __webpack_require__(219),\n last: __webpack_require__(445),\n map: __webpack_require__(220),\n mapValues: __webpack_require__(446),\n max: __webpack_require__(447),\n merge: __webpack_require__(449),\n min: __webpack_require__(455),\n minBy: __webpack_require__(456),\n now: __webpack_require__(457),\n pick: __webpack_require__(458),\n range: __webpack_require__(463),\n reduce: __webpack_require__(222),\n sortBy: __webpack_require__(466),\n uniqueId: __webpack_require__(471),\n values: __webpack_require__(227),\n zipObject: __webpack_require__(472),\n };\n } catch (e) {\n // continue regardless of error\n }\n}\n\nif (!lodash) {\n lodash = window._;\n}\n\nmodule.exports = lodash;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZGFncmVqcy9saWIvbG9kYXNoLmpzPzYzYmUiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTs7QUFFQTs7QUFFQSxJQUFJLElBQTZCO0FBQ2pDO0FBQ0E7QUFDQSxpQkFBaUIsbUJBQU8sQ0FBQyxHQUFrQjtBQUMzQyxnQkFBZ0IsbUJBQU8sQ0FBQyxHQUFpQjtBQUN6QyxnQkFBZ0IsbUJBQU8sQ0FBQyxHQUFpQjtBQUN6QyxZQUFZLG1CQUFPLENBQUMsR0FBYTtBQUNqQyxjQUFjLG1CQUFPLENBQUMsR0FBZTtBQUNyQyxZQUFZLG1CQUFPLENBQUMsR0FBYTtBQUNqQyxlQUFlLG1CQUFPLENBQUMsR0FBZ0I7QUFDdkMsZUFBZSxtQkFBTyxDQUFDLEdBQWdCO0FBQ3ZDLGFBQWEsbUJBQU8sQ0FBQyxHQUFjO0FBQ25DLFlBQVksbUJBQU8sQ0FBQyxHQUFZO0FBQ2hDLG1CQUFtQixtQkFBTyxDQUFDLEdBQW9CO0FBQy9DLFlBQVksbUJBQU8sQ0FBQyxHQUFhO0FBQ2pDLFdBQVcsbUJBQU8sQ0FBQyxHQUFZO0FBQy9CLGlCQUFpQixtQkFBTyxDQUFDLEdBQWtCO0FBQzNDLFdBQVcsbUJBQU8sQ0FBQyxHQUFZO0FBQy9CLGFBQWEsbUJBQU8sQ0FBQyxHQUFjO0FBQ25DLFdBQVcsbUJBQU8sQ0FBQyxHQUFZO0FBQy9CLGFBQWEsbUJBQU8sQ0FBQyxHQUFjO0FBQ25DLFdBQVcsbUJBQU8sQ0FBQyxHQUFZO0FBQy9CLFlBQVksbUJBQU8sQ0FBQyxHQUFhO0FBQ2pDLGFBQWEsbUJBQU8sQ0FBQyxHQUFjO0FBQ25DLGNBQWMsbUJBQU8sQ0FBQyxHQUFlO0FBQ3JDLGNBQWMsbUJBQU8sQ0FBQyxHQUFlO0FBQ3JDLGdCQUFnQixtQkFBTyxDQUFDLEdBQWlCO0FBQ3pDLGNBQWMsbUJBQU8sQ0FBQyxHQUFlO0FBQ3JDLGlCQUFpQixtQkFBTyxDQUFDLEdBQWtCO0FBQzNDO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEiLCJmaWxlIjoiMjguanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVkZWNsYXJlXG4vKiBnbG9iYWwgd2luZG93ICovXG5cbnZhciBsb2Rhc2g7XG5cbmlmICh0eXBlb2YgcmVxdWlyZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gIHRyeSB7XG4gICAgbG9kYXNoID0ge1xuICAgICAgY2xvbmVEZWVwOiByZXF1aXJlKFwibG9kYXNoL2Nsb25lRGVlcFwiKSxcbiAgICAgIGNvbnN0YW50OiByZXF1aXJlKFwibG9kYXNoL2NvbnN0YW50XCIpLFxuICAgICAgZGVmYXVsdHM6IHJlcXVpcmUoXCJsb2Rhc2gvZGVmYXVsdHNcIiksXG4gICAgICBlYWNoOiByZXF1aXJlKFwibG9kYXNoL2VhY2hcIiksXG4gICAgICBmaWx0ZXI6IHJlcXVpcmUoXCJsb2Rhc2gvZmlsdGVyXCIpLFxuICAgICAgZmluZDogcmVxdWlyZShcImxvZGFzaC9maW5kXCIpLFxuICAgICAgZmxhdHRlbjogcmVxdWlyZShcImxvZGFzaC9mbGF0dGVuXCIpLFxuICAgICAgZm9yRWFjaDogcmVxdWlyZShcImxvZGFzaC9mb3JFYWNoXCIpLFxuICAgICAgZm9ySW46IHJlcXVpcmUoXCJsb2Rhc2gvZm9ySW5cIiksXG4gICAgICBoYXM6ICByZXF1aXJlKFwibG9kYXNoL2hhc1wiKSxcbiAgICAgIGlzVW5kZWZpbmVkOiByZXF1aXJlKFwibG9kYXNoL2lzVW5kZWZpbmVkXCIpLFxuICAgICAgbGFzdDogcmVxdWlyZShcImxvZGFzaC9sYXN0XCIpLFxuICAgICAgbWFwOiByZXF1aXJlKFwibG9kYXNoL21hcFwiKSxcbiAgICAgIG1hcFZhbHVlczogcmVxdWlyZShcImxvZGFzaC9tYXBWYWx1ZXNcIiksXG4gICAgICBtYXg6IHJlcXVpcmUoXCJsb2Rhc2gvbWF4XCIpLFxuICAgICAgbWVyZ2U6IHJlcXVpcmUoXCJsb2Rhc2gvbWVyZ2VcIiksXG4gICAgICBtaW46IHJlcXVpcmUoXCJsb2Rhc2gvbWluXCIpLFxuICAgICAgbWluQnk6IHJlcXVpcmUoXCJsb2Rhc2gvbWluQnlcIiksXG4gICAgICBub3c6IHJlcXVpcmUoXCJsb2Rhc2gvbm93XCIpLFxuICAgICAgcGljazogcmVxdWlyZShcImxvZGFzaC9waWNrXCIpLFxuICAgICAgcmFuZ2U6IHJlcXVpcmUoXCJsb2Rhc2gvcmFuZ2VcIiksXG4gICAgICByZWR1Y2U6IHJlcXVpcmUoXCJsb2Rhc2gvcmVkdWNlXCIpLFxuICAgICAgc29ydEJ5OiByZXF1aXJlKFwibG9kYXNoL3NvcnRCeVwiKSxcbiAgICAgIHVuaXF1ZUlkOiByZXF1aXJlKFwibG9kYXNoL3VuaXF1ZUlkXCIpLFxuICAgICAgdmFsdWVzOiByZXF1aXJlKFwibG9kYXNoL3ZhbHVlc1wiKSxcbiAgICAgIHppcE9iamVjdDogcmVxdWlyZShcImxvZGFzaC96aXBPYmplY3RcIiksXG4gICAgfTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIGNvbnRpbnVlIHJlZ2FyZGxlc3Mgb2YgZXJyb3JcbiAgfVxufVxuXG5pZiAoIWxvZGFzaCkge1xuICBsb2Rhc2ggPSB3aW5kb3cuXztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBsb2Rhc2g7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///28\n")},function(module,exports){eval("function _initializerWarningHelper(descriptor, context) {\n throw new Error('Decorating class property failed. Please ensure that ' + 'proposal-class-properties is enabled and runs after the decorators transform.');\n}\n\nmodule.exports = _initializerWarningHelper;\nmodule.exports[\"default\"] = module.exports, module.exports.__esModule = true;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbml0aWFsaXplcldhcm5pbmdIZWxwZXIuanM/ZDQwMCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSIsImZpbGUiOiIyOS5qcyIsInNvdXJjZXNDb250ZW50IjpbImZ1bmN0aW9uIF9pbml0aWFsaXplcldhcm5pbmdIZWxwZXIoZGVzY3JpcHRvciwgY29udGV4dCkge1xuICB0aHJvdyBuZXcgRXJyb3IoJ0RlY29yYXRpbmcgY2xhc3MgcHJvcGVydHkgZmFpbGVkLiBQbGVhc2UgZW5zdXJlIHRoYXQgJyArICdwcm9wb3NhbC1jbGFzcy1wcm9wZXJ0aWVzIGlzIGVuYWJsZWQgYW5kIHJ1bnMgYWZ0ZXIgdGhlIGRlY29yYXRvcnMgdHJhbnNmb3JtLicpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9pbml0aWFsaXplcldhcm5pbmdIZWxwZXI7XG5tb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0cywgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///29\n")},function(module,__webpack_exports__,__webpack_require__){"use strict";eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return applyAttrsToContext; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"d\", function() { return drawChildren; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return checkRefresh; });\n/* unused harmony export checkChildrenRefresh */\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return clearChanged; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"e\", function() { return drawPath; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"h\", function() { return refreshElement; });\n/* unused harmony export getRefreshRegion */\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"f\", function() { return getMergedRegion; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"g\", function() { return mergeView; });\n/* harmony import */ var _antv_util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(0);\n/* harmony import */ var _parse__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(142);\n/* harmony import */ var _arc_params__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(93);\n/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(16);\n/* harmony import */ var _util_arrow__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(33);\n\n\n\n\n\nvar SHAPE_ATTRS_MAP = {\n fill: 'fillStyle',\n stroke: 'strokeStyle',\n opacity: 'globalAlpha',\n};\nfunction applyAttrsToContext(context, element) {\n var attrs = element.attr();\n for (var k in attrs) {\n var v = attrs[k];\n // 转换一下不与 canvas 兼容的属性名\n var name_1 = SHAPE_ATTRS_MAP[k] ? SHAPE_ATTRS_MAP[k] : k;\n if (name_1 === 'matrix' && v) {\n // 设置矩阵\n context.transform(v[0], v[1], v[3], v[4], v[6], v[7]);\n }\n else if (name_1 === 'lineDash' && context.setLineDash) {\n // 设置虚线,只支持数组形式,非数组形式不做任何操作\n Object(_antv_util__WEBPACK_IMPORTED_MODULE_0__[\"isArray\"])(v) && context.setLineDash(v);\n }\n else {\n if (name_1 === 'strokeStyle' || name_1 === 'fillStyle') {\n // 如果存在渐变、pattern 这个开销有些大\n // 可以考虑缓存机制,通过 hasUpdate 来避免一些运算\n v = Object(_parse__WEBPACK_IMPORTED_MODULE_1__[/* parseStyle */ \"b\"])(context, element, v);\n }\n else if (name_1 === 'globalAlpha') {\n // opacity 效果可以叠加,子元素的 opacity 需要与父元素 opacity 相乘\n v = v * context.globalAlpha;\n }\n context[name_1] = v;\n }\n }\n}\nfunction drawChildren(context, children, region) {\n for (var i = 0; i < children.length; i++) {\n var child = children[i];\n if (child.cfg.visible) {\n child.draw(context, region);\n }\n else {\n child.skipDraw();\n }\n }\n}\n// 这个地方的逻辑比较复杂,简单画了一张图:https://www.yuque.com/antv/ou292n/pcgt5g#OW1QE\nfunction checkRefresh(canvas, children, region) {\n var refreshElements = canvas.get('refreshElements');\n // 先遍历需要刷新的元素,将这些元素的父元素也设置 refresh\n Object(_antv_util__WEBPACK_IMPORTED_MODULE_0__[\"each\"])(refreshElements, function (el) {\n if (el !== canvas) {\n var parent_1 = el.cfg.parent;\n while (parent_1 && parent_1 !== canvas && !parent_1.cfg.refresh) {\n parent_1.cfg.refresh = true;\n parent_1 = parent_1.cfg.parent;\n }\n }\n });\n if (refreshElements[0] === canvas) {\n setChildrenRefresh(children, region);\n }\n else {\n // 检查所有子元素是否可以刷新\n checkChildrenRefresh(children, region);\n }\n}\n// 检查所有的子元素是否应该更新\nfunction checkChildrenRefresh(children, region) {\n for (var i = 0; i < children.length; i++) {\n var child = children[i];\n if (child.cfg.visible) {\n // 先判断 hasChanged,因为它的优先级判断应该高于 refresh\n if (child.cfg.hasChanged) {\n // 如果节点发生了 change,则需要级联设置子元素的 refresh\n child.cfg.refresh = true;\n if (child.isGroup()) {\n setChildrenRefresh(child.cfg.children, region);\n }\n }\n else if (child.cfg.refresh) {\n // 如果当前图形/分组 refresh = true,说明其子节点存在 changed\n if (child.isGroup()) {\n checkChildrenRefresh(child.cfg.children, region);\n }\n }\n else {\n // 这个分支说明此次局部刷新,所有的节点和父元素没有发生变化,仅需要检查包围盒(缓存)是否相交即可\n var refresh = checkElementRefresh(child, region);\n child.cfg.refresh = refresh;\n if (refresh && child.isGroup()) {\n // 如果需要刷新,说明子元素也需要刷新,继续进行判定\n checkChildrenRefresh(child.cfg.children, region);\n }\n }\n }\n }\n}\n// 由于对改变的图形放入 refreshElements 时做了优化,判定父元素 changed 时不加入\n// 那么有可能会出现 elements 都为空,所以最终 group\nfunction clearChanged(elements) {\n for (var i = 0; i < elements.length; i++) {\n var el = elements[i];\n el.cfg.hasChanged = false;\n // 级联清理\n if (el.isGroup() && !el.destroyed) {\n clearChanged(el.cfg.children);\n }\n }\n}\n// 当某个父元素发生改变时,调用这个方法级联设置 refresh\nfunction setChildrenRefresh(children, region) {\n for (var i = 0; i < children.length; i++) {\n var child = children[i];\n // let refresh = true;\n // 获取缓存的 bbox,如果这个 bbox 还存在则说明父元素不是矩阵发生了改变\n // const bbox = child.cfg.canvasBBox;\n // if (bbox) {\n // // 如果这时候\n // refresh = intersectRect(bbox, region);\n // }\n child.cfg.refresh = true;\n // 如果需要刷新当前节点,所有的子元素设置 refresh\n if (child.isGroup()) {\n setChildrenRefresh(child.get('children'), region);\n }\n }\n}\nfunction checkElementRefresh(shape, region) {\n var bbox = shape.cfg.cacheCanvasBBox;\n var isAllow = shape.cfg.isInView && bbox && Object(_util__WEBPACK_IMPORTED_MODULE_3__[/* intersectRect */ \"f\"])(bbox, region);\n return isAllow;\n}\n// 绘制 path\nfunction drawPath(shape, context, attrs, arcParamsCache) {\n var path = attrs.path, startArrow = attrs.startArrow, endArrow = attrs.endArrow;\n if (!path) {\n return;\n }\n var currentPoint = [0, 0]; // 当前图形\n var startMovePoint = [0, 0]; // 开始 M 的点,可能会有多个\n var distance = {\n dx: 0,\n dy: 0,\n };\n context.beginPath();\n for (var i = 0; i < path.length; i++) {\n var params = path[i];\n var command = params[0];\n if (i === 0 && startArrow && startArrow.d) {\n var tangent = shape.getStartTangent();\n distance = _util_arrow__WEBPACK_IMPORTED_MODULE_4__[/* getShortenOffset */ \"c\"](tangent[0][0], tangent[0][1], tangent[1][0], tangent[1][1], startArrow.d);\n }\n else if (i === path.length - 2 && path[i + 1][0] === 'Z' && endArrow && endArrow.d) {\n // 为了防止结尾为 Z 的 segment 缩短不起效,需要取最后两个 segment 特殊处理\n var lastPath = path[i + 1];\n if (lastPath[0] === 'Z') {\n var tangent = shape.getEndTangent();\n distance = _util_arrow__WEBPACK_IMPORTED_MODULE_4__[/* getShortenOffset */ \"c\"](tangent[0][0], tangent[0][1], tangent[1][0], tangent[1][1], endArrow.d);\n }\n }\n else if (i === path.length - 1 && endArrow && endArrow.d) {\n if (path[0] !== 'Z') {\n var tangent = shape.getEndTangent();\n distance = _util_arrow__WEBPACK_IMPORTED_MODULE_4__[/* getShortenOffset */ \"c\"](tangent[0][0], tangent[0][1], tangent[1][0], tangent[1][1], endArrow.d);\n }\n }\n var dx = distance.dx, dy = distance.dy;\n // V,H,S,T 都在前面被转换成标准形式\n switch (command) {\n case 'M':\n context.moveTo(params[1] - dx, params[2] - dy);\n startMovePoint = [params[1], params[2]];\n break;\n case 'L':\n context.lineTo(params[1] - dx, params[2] - dy);\n break;\n case 'Q':\n context.quadraticCurveTo(params[1], params[2], params[3] - dx, params[4] - dy);\n break;\n case 'C':\n context.bezierCurveTo(params[1], params[2], params[3], params[4], params[5] - dx, params[6] - dy);\n break;\n case 'A': {\n var arcParams = void 0;\n // 为了加速绘制,可以提供参数的缓存,各个图形自己缓存\n if (arcParamsCache) {\n arcParams = arcParamsCache[i];\n if (!arcParams) {\n arcParams = Object(_arc_params__WEBPACK_IMPORTED_MODULE_2__[/* default */ \"a\"])(currentPoint, params);\n arcParamsCache[i] = arcParams;\n }\n }\n else {\n arcParams = Object(_arc_params__WEBPACK_IMPORTED_MODULE_2__[/* default */ \"a\"])(currentPoint, params);\n }\n var cx = arcParams.cx, cy = arcParams.cy, rx = arcParams.rx, ry = arcParams.ry, startAngle = arcParams.startAngle, endAngle = arcParams.endAngle, xRotation = arcParams.xRotation, sweepFlag = arcParams.sweepFlag;\n // 直接使用椭圆的 api\n if (context.ellipse) {\n context.ellipse(cx, cy, rx, ry, xRotation, startAngle, endAngle, 1 - sweepFlag);\n }\n else {\n var r = rx > ry ? rx : ry;\n var scaleX = rx > ry ? 1 : rx / ry;\n var scaleY = rx > ry ? ry / rx : 1;\n context.translate(cx, cy);\n context.rotate(xRotation);\n context.scale(scaleX, scaleY);\n context.arc(0, 0, r, startAngle, endAngle, 1 - sweepFlag);\n context.scale(1 / scaleX, 1 / scaleY);\n context.rotate(-xRotation);\n context.translate(-cx, -cy);\n }\n break;\n }\n case 'Z':\n context.closePath();\n break;\n default:\n break;\n }\n // 有了 Z 后,当前节点从开始 M 的点开始\n if (command === 'Z') {\n currentPoint = startMovePoint;\n }\n else {\n var len = params.length;\n currentPoint = [params[len - 2], params[len - 1]];\n }\n }\n}\n// 刷新图形元素(Shape 或者 Group)\nfunction refreshElement(element, changeType) {\n var canvas = element.get('canvas');\n // 只有存在于 canvas 上时生效\n if (canvas) {\n if (changeType === 'remove') {\n // 一旦 remove,则无法在 element 上拿到包围盒\n // destroy 后所有属性都拿不到,所以需要暂存一下\n // 这是一段 hack 的代码\n element._cacheCanvasBBox = element.get('cacheCanvasBBox');\n }\n // 防止反复刷新\n if (!element.get('hasChanged')) {\n // 但是始终要标记为 hasChanged,便于后面进行局部渲染\n element.set('hasChanged', true);\n // 本来只有局部渲染模式下,才需要记录更新的元素队列\n // if (canvas.get('localRefresh')) {\n // canvas.refreshElement(element, changeType, canvas);\n // }\n // 但对于 https://github.com/antvis/g/issues/422 的场景,全局渲染的模式下也需要记录更新的元素队列\n // 如果当前元素的父元素发生了改变,可以不放入队列,这句话大概能够提升 15% 的初次渲染性能\n if (!(element.cfg.parent && element.cfg.parent.get('hasChanged'))) {\n canvas.refreshElement(element, changeType, canvas);\n if (canvas.get('autoDraw')) {\n canvas.draw();\n }\n }\n }\n }\n}\nfunction getRefreshRegion(element) {\n var region;\n if (!element.destroyed) {\n var cacheBox = element.get('cacheCanvasBBox');\n var validCache = cacheBox && !!(cacheBox.width && cacheBox.height);\n var bbox = element.getCanvasBBox();\n var validBBox = bbox && !!(bbox.width && bbox.height);\n // 是否是有效 bbox 判定,一些 NaN 或者 宽高为 0 的情况过滤掉\n if (validCache && validBBox) {\n region = Object(_util__WEBPACK_IMPORTED_MODULE_3__[/* mergeRegion */ \"l\"])(cacheBox, bbox);\n }\n else if (validCache) {\n region = cacheBox;\n }\n else if (validBBox) {\n region = bbox;\n }\n }\n else {\n // 因为元素已经销毁所以无法获取到缓存的包围盒\n region = element['_cacheCanvasBBox'];\n }\n return region;\n}\nfunction getMergedRegion(elements) {\n if (!elements.length) {\n return null;\n }\n var minXArr = [];\n var minYArr = [];\n var maxXArr = [];\n var maxYArr = [];\n Object(_antv_util__WEBPACK_IMPORTED_MODULE_0__[\"each\"])(elements, function (el) {\n var region = getRefreshRegion(el);\n if (region) {\n minXArr.push(region.minX);\n minYArr.push(region.minY);\n maxXArr.push(region.maxX);\n maxYArr.push(region.maxY);\n }\n });\n return {\n minX: Object(_antv_util__WEBPACK_IMPORTED_MODULE_0__[\"min\"])(minXArr),\n minY: Object(_antv_util__WEBPACK_IMPORTED_MODULE_0__[\"min\"])(minYArr),\n maxX: Object(_antv_util__WEBPACK_IMPORTED_MODULE_0__[\"max\"])(maxXArr),\n maxY: Object(_antv_util__WEBPACK_IMPORTED_MODULE_0__[\"max\"])(maxYArr),\n };\n}\nfunction mergeView(region, viewRegion) {\n if (!region || !viewRegion) {\n return null;\n }\n // 不相交,则直接返回 null\n if (!Object(_util__WEBPACK_IMPORTED_MODULE_3__[/* intersectRect */ \"f\"])(region, viewRegion)) {\n return null;\n }\n return {\n minX: Math.max(region.minX, viewRegion.minX),\n minY: Math.max(region.minY, viewRegion.minY),\n maxX: Math.min(region.maxX, viewRegion.maxX),\n maxY: Math.min(region.maxY, viewRegion.maxY),\n };\n}\n//# sourceMappingURL=draw.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy1jYW52YXMvZXNtL3V0aWwvZHJhdy5qcz9mNWU1Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFxRDtBQUNoQjtBQUNHO0FBQ1k7QUFDVDtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSwwREFBTztBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLGlFQUFVO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1AsbUJBQW1CLHFCQUFxQjtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBLElBQUksdURBQUk7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQLG1CQUFtQixxQkFBcUI7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUCxtQkFBbUIscUJBQXFCO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLHFCQUFxQjtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0RBQWdELG1FQUFhO0FBQzdEO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEI7QUFDOUIsZ0NBQWdDO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsaUJBQWlCO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLG9FQUEwQjtBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsb0VBQTBCO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsb0VBQTBCO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQyxtRUFBWTtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyxtRUFBWTtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsaUVBQVc7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLHVEQUFJO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxjQUFjLHNEQUFHO0FBQ2pCLGNBQWMsc0RBQUc7QUFDakIsY0FBYyxzREFBRztBQUNqQixjQUFjLHNEQUFHO0FBQ2pCO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyxtRUFBYTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiIzMC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGVhY2gsIGlzQXJyYXksIG1heCwgbWluIH0gZnJvbSAnQGFudHYvdXRpbCc7XG5pbXBvcnQgeyBwYXJzZVN0eWxlIH0gZnJvbSAnLi9wYXJzZSc7XG5pbXBvcnQgZ2V0QXJjUGFyYW1zIGZyb20gJy4vYXJjLXBhcmFtcyc7XG5pbXBvcnQgeyBtZXJnZVJlZ2lvbiwgaW50ZXJzZWN0UmVjdCB9IGZyb20gJy4vdXRpbCc7XG5pbXBvcnQgKiBhcyBBcnJvd1V0aWwgZnJvbSAnLi4vdXRpbC9hcnJvdyc7XG52YXIgU0hBUEVfQVRUUlNfTUFQID0ge1xuICAgIGZpbGw6ICdmaWxsU3R5bGUnLFxuICAgIHN0cm9rZTogJ3N0cm9rZVN0eWxlJyxcbiAgICBvcGFjaXR5OiAnZ2xvYmFsQWxwaGEnLFxufTtcbmV4cG9ydCBmdW5jdGlvbiBhcHBseUF0dHJzVG9Db250ZXh0KGNvbnRleHQsIGVsZW1lbnQpIHtcbiAgICB2YXIgYXR0cnMgPSBlbGVtZW50LmF0dHIoKTtcbiAgICBmb3IgKHZhciBrIGluIGF0dHJzKSB7XG4gICAgICAgIHZhciB2ID0gYXR0cnNba107XG4gICAgICAgIC8vIOi9rOaNouS4gOS4i+S4jeS4jiBjYW52YXMg5YW85a6555qE5bGe5oCn5ZCNXG4gICAgICAgIHZhciBuYW1lXzEgPSBTSEFQRV9BVFRSU19NQVBba10gPyBTSEFQRV9BVFRSU19NQVBba10gOiBrO1xuICAgICAgICBpZiAobmFtZV8xID09PSAnbWF0cml4JyAmJiB2KSB7XG4gICAgICAgICAgICAvLyDorr7nva7nn6npmLVcbiAgICAgICAgICAgIGNvbnRleHQudHJhbnNmb3JtKHZbMF0sIHZbMV0sIHZbM10sIHZbNF0sIHZbNl0sIHZbN10pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5hbWVfMSA9PT0gJ2xpbmVEYXNoJyAmJiBjb250ZXh0LnNldExpbmVEYXNoKSB7XG4gICAgICAgICAgICAvLyDorr7nva7omZrnur/vvIzlj6rmlK/mjIHmlbDnu4TlvaLlvI/vvIzpnZ7mlbDnu4TlvaLlvI/kuI3lgZrku7vkvZXmk43kvZxcbiAgICAgICAgICAgIGlzQXJyYXkodikgJiYgY29udGV4dC5zZXRMaW5lRGFzaCh2KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChuYW1lXzEgPT09ICdzdHJva2VTdHlsZScgfHwgbmFtZV8xID09PSAnZmlsbFN0eWxlJykge1xuICAgICAgICAgICAgICAgIC8vIOWmguaenOWtmOWcqOa4kOWPmOOAgXBhdHRlcm4g6L+Z5Liq5byA6ZSA5pyJ5Lqb5aSnXG4gICAgICAgICAgICAgICAgLy8g5Y+v5Lul6ICD6JmR57yT5a2Y5py65Yi277yM6YCa6L+HIGhhc1VwZGF0ZSDmnaXpgb/lhY3kuIDkupvov5DnrpdcbiAgICAgICAgICAgICAgICB2ID0gcGFyc2VTdHlsZShjb250ZXh0LCBlbGVtZW50LCB2KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG5hbWVfMSA9PT0gJ2dsb2JhbEFscGhhJykge1xuICAgICAgICAgICAgICAgIC8vIG9wYWNpdHkg5pWI5p6c5Y+v5Lul5Y+g5Yqg77yM5a2Q5YWD57Sg55qEIG9wYWNpdHkg6ZyA6KaB5LiO54i25YWD57SgIG9wYWNpdHkg55u45LmYXG4gICAgICAgICAgICAgICAgdiA9IHYgKiBjb250ZXh0Lmdsb2JhbEFscGhhO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29udGV4dFtuYW1lXzFdID0gdjtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBkcmF3Q2hpbGRyZW4oY29udGV4dCwgY2hpbGRyZW4sIHJlZ2lvbikge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGNoaWxkID0gY2hpbGRyZW5baV07XG4gICAgICAgIGlmIChjaGlsZC5jZmcudmlzaWJsZSkge1xuICAgICAgICAgICAgY2hpbGQuZHJhdyhjb250ZXh0LCByZWdpb24pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY2hpbGQuc2tpcERyYXcoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8vIOi/meS4quWcsOaWueeahOmAu+i+keavlOi+g+Wkjeadgu+8jOeugOWNleeUu+S6huS4gOW8oOWbvu+8mmh0dHBzOi8vd3d3Lnl1cXVlLmNvbS9hbnR2L291Mjkybi9wY2d0NWcjT1cxUUVcbmV4cG9ydCBmdW5jdGlvbiBjaGVja1JlZnJlc2goY2FudmFzLCBjaGlsZHJlbiwgcmVnaW9uKSB7XG4gICAgdmFyIHJlZnJlc2hFbGVtZW50cyA9IGNhbnZhcy5nZXQoJ3JlZnJlc2hFbGVtZW50cycpO1xuICAgIC8vIOWFiOmBjeWOhumcgOimgeWIt+aWsOeahOWFg+e0oO+8jOWwhui/meS6m+WFg+e0oOeahOeItuWFg+e0oOS5n+iuvue9riByZWZyZXNoXG4gICAgZWFjaChyZWZyZXNoRWxlbWVudHMsIGZ1bmN0aW9uIChlbCkge1xuICAgICAgICBpZiAoZWwgIT09IGNhbnZhcykge1xuICAgICAgICAgICAgdmFyIHBhcmVudF8xID0gZWwuY2ZnLnBhcmVudDtcbiAgICAgICAgICAgIHdoaWxlIChwYXJlbnRfMSAmJiBwYXJlbnRfMSAhPT0gY2FudmFzICYmICFwYXJlbnRfMS5jZmcucmVmcmVzaCkge1xuICAgICAgICAgICAgICAgIHBhcmVudF8xLmNmZy5yZWZyZXNoID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBwYXJlbnRfMSA9IHBhcmVudF8xLmNmZy5wYXJlbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAocmVmcmVzaEVsZW1lbnRzWzBdID09PSBjYW52YXMpIHtcbiAgICAgICAgc2V0Q2hpbGRyZW5SZWZyZXNoKGNoaWxkcmVuLCByZWdpb24pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgLy8g5qOA5p+l5omA5pyJ5a2Q5YWD57Sg5piv5ZCm5Y+v5Lul5Yi35pawXG4gICAgICAgIGNoZWNrQ2hpbGRyZW5SZWZyZXNoKGNoaWxkcmVuLCByZWdpb24pO1xuICAgIH1cbn1cbi8vIOajgOafpeaJgOacieeahOWtkOWFg+e0oOaYr+WQpuW6lOivpeabtOaWsFxuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrQ2hpbGRyZW5SZWZyZXNoKGNoaWxkcmVuLCByZWdpb24pIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBjaGlsZCA9IGNoaWxkcmVuW2ldO1xuICAgICAgICBpZiAoY2hpbGQuY2ZnLnZpc2libGUpIHtcbiAgICAgICAgICAgIC8vIOWFiOWIpOaWrSBoYXNDaGFuZ2Vk77yM5Zug5Li65a6D55qE5LyY5YWI57qn5Yik5pat5bqU6K+l6auY5LqOIHJlZnJlc2hcbiAgICAgICAgICAgIGlmIChjaGlsZC5jZmcuaGFzQ2hhbmdlZCkge1xuICAgICAgICAgICAgICAgIC8vIOWmguaenOiKgueCueWPkeeUn+S6hiBjaGFuZ2XvvIzliJnpnIDopoHnuqfogZTorr7nva7lrZDlhYPntKDnmoQgcmVmcmVzaFxuICAgICAgICAgICAgICAgIGNoaWxkLmNmZy5yZWZyZXNoID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGQuaXNHcm91cCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHNldENoaWxkcmVuUmVmcmVzaChjaGlsZC5jZmcuY2hpbGRyZW4sIHJlZ2lvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hpbGQuY2ZnLnJlZnJlc2gpIHtcbiAgICAgICAgICAgICAgICAvLyDlpoLmnpzlvZPliY3lm77lvaIv5YiG57uEIHJlZnJlc2ggPSB0cnVl77yM6K+05piO5YW25a2Q6IqC54K55a2Y5ZyoIGNoYW5nZWRcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGQuaXNHcm91cCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoZWNrQ2hpbGRyZW5SZWZyZXNoKGNoaWxkLmNmZy5jaGlsZHJlbiwgcmVnaW9uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyDov5nkuKrliIbmlK/or7TmmI7mraTmrKHlsYDpg6jliLfmlrDvvIzmiYDmnInnmoToioLngrnlkozniLblhYPntKDmsqHmnInlj5HnlJ/lj5jljJbvvIzku4XpnIDopoHmo4Dmn6XljIXlm7Tnm5LvvIjnvJPlrZjvvInmmK/lkKbnm7jkuqTljbPlj69cbiAgICAgICAgICAgICAgICB2YXIgcmVmcmVzaCA9IGNoZWNrRWxlbWVudFJlZnJlc2goY2hpbGQsIHJlZ2lvbik7XG4gICAgICAgICAgICAgICAgY2hpbGQuY2ZnLnJlZnJlc2ggPSByZWZyZXNoO1xuICAgICAgICAgICAgICAgIGlmIChyZWZyZXNoICYmIGNoaWxkLmlzR3JvdXAoKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyDlpoLmnpzpnIDopoHliLfmlrDvvIzor7TmmI7lrZDlhYPntKDkuZ/pnIDopoHliLfmlrDvvIznu6fnu63ov5vooYzliKTlrppcbiAgICAgICAgICAgICAgICAgICAgY2hlY2tDaGlsZHJlblJlZnJlc2goY2hpbGQuY2ZnLmNoaWxkcmVuLCByZWdpb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbi8vIOeUseS6juWvueaUueWPmOeahOWbvuW9ouaUvuWFpSByZWZyZXNoRWxlbWVudHMg5pe25YGa5LqG5LyY5YyW77yM5Yik5a6a54i25YWD57SgIGNoYW5nZWQg5pe25LiN5Yqg5YWlXG4vLyDpgqPkuYjmnInlj6/og73kvJrlh7rnjrAgZWxlbWVudHMg6YO95Li656m677yM5omA5Lul5pyA57uIIGdyb3VwXG5leHBvcnQgZnVuY3Rpb24gY2xlYXJDaGFuZ2VkKGVsZW1lbnRzKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZWwgPSBlbGVtZW50c1tpXTtcbiAgICAgICAgZWwuY2ZnLmhhc0NoYW5nZWQgPSBmYWxzZTtcbiAgICAgICAgLy8g57qn6IGU5riF55CGXG4gICAgICAgIGlmIChlbC5pc0dyb3VwKCkgJiYgIWVsLmRlc3Ryb3llZCkge1xuICAgICAgICAgICAgY2xlYXJDaGFuZ2VkKGVsLmNmZy5jaGlsZHJlbik7XG4gICAgICAgIH1cbiAgICB9XG59XG4vLyDlvZPmn5DkuKrniLblhYPntKDlj5HnlJ/mlLnlj5jml7bvvIzosIPnlKjov5nkuKrmlrnms5XnuqfogZTorr7nva4gcmVmcmVzaFxuZnVuY3Rpb24gc2V0Q2hpbGRyZW5SZWZyZXNoKGNoaWxkcmVuLCByZWdpb24pIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBjaGlsZCA9IGNoaWxkcmVuW2ldO1xuICAgICAgICAvLyBsZXQgcmVmcmVzaCA9IHRydWU7XG4gICAgICAgIC8vIOiOt+WPlue8k+WtmOeahCBiYm9477yM5aaC5p6c6L+Z5LiqIGJib3gg6L+Y5a2Y5Zyo5YiZ6K+05piO54i25YWD57Sg5LiN5piv55+p6Zi15Y+R55Sf5LqG5pS55Y+YXG4gICAgICAgIC8vIGNvbnN0IGJib3ggPSBjaGlsZC5jZmcuY2FudmFzQkJveDtcbiAgICAgICAgLy8gaWYgKGJib3gpIHtcbiAgICAgICAgLy8gICAvLyDlpoLmnpzov5nml7blgJlcbiAgICAgICAgLy8gICByZWZyZXNoID0gaW50ZXJzZWN0UmVjdChiYm94LCByZWdpb24pO1xuICAgICAgICAvLyB9XG4gICAgICAgIGNoaWxkLmNmZy5yZWZyZXNoID0gdHJ1ZTtcbiAgICAgICAgLy8g5aaC5p6c6ZyA6KaB5Yi35paw5b2T5YmN6IqC54K577yM5omA5pyJ55qE5a2Q5YWD57Sg6K6+572uIHJlZnJlc2hcbiAgICAgICAgaWYgKGNoaWxkLmlzR3JvdXAoKSkge1xuICAgICAgICAgICAgc2V0Q2hpbGRyZW5SZWZyZXNoKGNoaWxkLmdldCgnY2hpbGRyZW4nKSwgcmVnaW9uKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIGNoZWNrRWxlbWVudFJlZnJlc2goc2hhcGUsIHJlZ2lvbikge1xuICAgIHZhciBiYm94ID0gc2hhcGUuY2ZnLmNhY2hlQ2FudmFzQkJveDtcbiAgICB2YXIgaXNBbGxvdyA9IHNoYXBlLmNmZy5pc0luVmlldyAmJiBiYm94ICYmIGludGVyc2VjdFJlY3QoYmJveCwgcmVnaW9uKTtcbiAgICByZXR1cm4gaXNBbGxvdztcbn1cbi8vIOe7mOWItiBwYXRoXG5leHBvcnQgZnVuY3Rpb24gZHJhd1BhdGgoc2hhcGUsIGNvbnRleHQsIGF0dHJzLCBhcmNQYXJhbXNDYWNoZSkge1xuICAgIHZhciBwYXRoID0gYXR0cnMucGF0aCwgc3RhcnRBcnJvdyA9IGF0dHJzLnN0YXJ0QXJyb3csIGVuZEFycm93ID0gYXR0cnMuZW5kQXJyb3c7XG4gICAgaWYgKCFwYXRoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIGN1cnJlbnRQb2ludCA9IFswLCAwXTsgLy8g5b2T5YmN5Zu+5b2iXG4gICAgdmFyIHN0YXJ0TW92ZVBvaW50ID0gWzAsIDBdOyAvLyDlvIDlp4sgTSDnmoTngrnvvIzlj6/og73kvJrmnInlpJrkuKpcbiAgICB2YXIgZGlzdGFuY2UgPSB7XG4gICAgICAgIGR4OiAwLFxuICAgICAgICBkeTogMCxcbiAgICB9O1xuICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXRoLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBwYXJhbXMgPSBwYXRoW2ldO1xuICAgICAgICB2YXIgY29tbWFuZCA9IHBhcmFtc1swXTtcbiAgICAgICAgaWYgKGkgPT09IDAgJiYgc3RhcnRBcnJvdyAmJiBzdGFydEFycm93LmQpIHtcbiAgICAgICAgICAgIHZhciB0YW5nZW50ID0gc2hhcGUuZ2V0U3RhcnRUYW5nZW50KCk7XG4gICAgICAgICAgICBkaXN0YW5jZSA9IEFycm93VXRpbC5nZXRTaG9ydGVuT2Zmc2V0KHRhbmdlbnRbMF1bMF0sIHRhbmdlbnRbMF1bMV0sIHRhbmdlbnRbMV1bMF0sIHRhbmdlbnRbMV1bMV0sIHN0YXJ0QXJyb3cuZCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaSA9PT0gcGF0aC5sZW5ndGggLSAyICYmIHBhdGhbaSArIDFdWzBdID09PSAnWicgJiYgZW5kQXJyb3cgJiYgZW5kQXJyb3cuZCkge1xuICAgICAgICAgICAgLy8g5Li65LqG6Ziy5q2i57uT5bC+5Li6IFog55qEIHNlZ21lbnQg57yp55+t5LiN6LW35pWI77yM6ZyA6KaB5Y+W5pyA5ZCO5Lik5LiqIHNlZ21lbnQg54m55q6K5aSE55CGXG4gICAgICAgICAgICB2YXIgbGFzdFBhdGggPSBwYXRoW2kgKyAxXTtcbiAgICAgICAgICAgIGlmIChsYXN0UGF0aFswXSA9PT0gJ1onKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRhbmdlbnQgPSBzaGFwZS5nZXRFbmRUYW5nZW50KCk7XG4gICAgICAgICAgICAgICAgZGlzdGFuY2UgPSBBcnJvd1V0aWwuZ2V0U2hvcnRlbk9mZnNldCh0YW5nZW50WzBdWzBdLCB0YW5nZW50WzBdWzFdLCB0YW5nZW50WzFdWzBdLCB0YW5nZW50WzFdWzFdLCBlbmRBcnJvdy5kKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpID09PSBwYXRoLmxlbmd0aCAtIDEgJiYgZW5kQXJyb3cgJiYgZW5kQXJyb3cuZCkge1xuICAgICAgICAgICAgaWYgKHBhdGhbMF0gIT09ICdaJykge1xuICAgICAgICAgICAgICAgIHZhciB0YW5nZW50ID0gc2hhcGUuZ2V0RW5kVGFuZ2VudCgpO1xuICAgICAgICAgICAgICAgIGRpc3RhbmNlID0gQXJyb3dVdGlsLmdldFNob3J0ZW5PZmZzZXQodGFuZ2VudFswXVswXSwgdGFuZ2VudFswXVsxXSwgdGFuZ2VudFsxXVswXSwgdGFuZ2VudFsxXVsxXSwgZW5kQXJyb3cuZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGR4ID0gZGlzdGFuY2UuZHgsIGR5ID0gZGlzdGFuY2UuZHk7XG4gICAgICAgIC8vIFYsSCxTLFQg6YO95Zyo5YmN6Z2i6KKr6L2s5o2i5oiQ5qCH5YeG5b2i5byPXG4gICAgICAgIHN3aXRjaCAoY29tbWFuZCkge1xuICAgICAgICAgICAgY2FzZSAnTSc6XG4gICAgICAgICAgICAgICAgY29udGV4dC5tb3ZlVG8ocGFyYW1zWzFdIC0gZHgsIHBhcmFtc1syXSAtIGR5KTtcbiAgICAgICAgICAgICAgICBzdGFydE1vdmVQb2ludCA9IFtwYXJhbXNbMV0sIHBhcmFtc1syXV07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdMJzpcbiAgICAgICAgICAgICAgICBjb250ZXh0LmxpbmVUbyhwYXJhbXNbMV0gLSBkeCwgcGFyYW1zWzJdIC0gZHkpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnUSc6XG4gICAgICAgICAgICAgICAgY29udGV4dC5xdWFkcmF0aWNDdXJ2ZVRvKHBhcmFtc1sxXSwgcGFyYW1zWzJdLCBwYXJhbXNbM10gLSBkeCwgcGFyYW1zWzRdIC0gZHkpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnQyc6XG4gICAgICAgICAgICAgICAgY29udGV4dC5iZXppZXJDdXJ2ZVRvKHBhcmFtc1sxXSwgcGFyYW1zWzJdLCBwYXJhbXNbM10sIHBhcmFtc1s0XSwgcGFyYW1zWzVdIC0gZHgsIHBhcmFtc1s2XSAtIGR5KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0EnOiB7XG4gICAgICAgICAgICAgICAgdmFyIGFyY1BhcmFtcyA9IHZvaWQgMDtcbiAgICAgICAgICAgICAgICAvLyDkuLrkuobliqDpgJ/nu5jliLbvvIzlj6/ku6Xmj5Dkvpvlj4LmlbDnmoTnvJPlrZjvvIzlkITkuKrlm77lvaLoh6rlt7HnvJPlrZhcbiAgICAgICAgICAgICAgICBpZiAoYXJjUGFyYW1zQ2FjaGUpIHtcbiAgICAgICAgICAgICAgICAgICAgYXJjUGFyYW1zID0gYXJjUGFyYW1zQ2FjaGVbaV07XG4gICAgICAgICAgICAgICAgICAgIGlmICghYXJjUGFyYW1zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmNQYXJhbXMgPSBnZXRBcmNQYXJhbXMoY3VycmVudFBvaW50LCBwYXJhbXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXJjUGFyYW1zQ2FjaGVbaV0gPSBhcmNQYXJhbXM7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGFyY1BhcmFtcyA9IGdldEFyY1BhcmFtcyhjdXJyZW50UG9pbnQsIHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBjeCA9IGFyY1BhcmFtcy5jeCwgY3kgPSBhcmNQYXJhbXMuY3ksIHJ4ID0gYXJjUGFyYW1zLnJ4LCByeSA9IGFyY1BhcmFtcy5yeSwgc3RhcnRBbmdsZSA9IGFyY1BhcmFtcy5zdGFydEFuZ2xlLCBlbmRBbmdsZSA9IGFyY1BhcmFtcy5lbmRBbmdsZSwgeFJvdGF0aW9uID0gYXJjUGFyYW1zLnhSb3RhdGlvbiwgc3dlZXBGbGFnID0gYXJjUGFyYW1zLnN3ZWVwRmxhZztcbiAgICAgICAgICAgICAgICAvLyDnm7TmjqXkvb/nlKjmpK3lnIbnmoQgYXBpXG4gICAgICAgICAgICAgICAgaWYgKGNvbnRleHQuZWxsaXBzZSkge1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmVsbGlwc2UoY3gsIGN5LCByeCwgcnksIHhSb3RhdGlvbiwgc3RhcnRBbmdsZSwgZW5kQW5nbGUsIDEgLSBzd2VlcEZsYWcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSByeCA+IHJ5ID8gcnggOiByeTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHNjYWxlWCA9IHJ4ID4gcnkgPyAxIDogcnggLyByeTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHNjYWxlWSA9IHJ4ID4gcnkgPyByeSAvIHJ4IDogMTtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC50cmFuc2xhdGUoY3gsIGN5KTtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5yb3RhdGUoeFJvdGF0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5zY2FsZShzY2FsZVgsIHNjYWxlWSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuYXJjKDAsIDAsIHIsIHN0YXJ0QW5nbGUsIGVuZEFuZ2xlLCAxIC0gc3dlZXBGbGFnKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5zY2FsZSgxIC8gc2NhbGVYLCAxIC8gc2NhbGVZKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5yb3RhdGUoLXhSb3RhdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQudHJhbnNsYXRlKC1jeCwgLWN5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICdaJzpcbiAgICAgICAgICAgICAgICBjb250ZXh0LmNsb3NlUGF0aCgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICAvLyDmnInkuoYgWiDlkI7vvIzlvZPliY3oioLngrnku47lvIDlp4sgTSDnmoTngrnlvIDlp4tcbiAgICAgICAgaWYgKGNvbW1hbmQgPT09ICdaJykge1xuICAgICAgICAgICAgY3VycmVudFBvaW50ID0gc3RhcnRNb3ZlUG9pbnQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2YXIgbGVuID0gcGFyYW1zLmxlbmd0aDtcbiAgICAgICAgICAgIGN1cnJlbnRQb2ludCA9IFtwYXJhbXNbbGVuIC0gMl0sIHBhcmFtc1tsZW4gLSAxXV07XG4gICAgICAgIH1cbiAgICB9XG59XG4vLyDliLfmlrDlm77lvaLlhYPntKAoU2hhcGUg5oiW6ICFIEdyb3VwKVxuZXhwb3J0IGZ1bmN0aW9uIHJlZnJlc2hFbGVtZW50KGVsZW1lbnQsIGNoYW5nZVR5cGUpIHtcbiAgICB2YXIgY2FudmFzID0gZWxlbWVudC5nZXQoJ2NhbnZhcycpO1xuICAgIC8vIOWPquacieWtmOWcqOS6jiBjYW52YXMg5LiK5pe255Sf5pWIXG4gICAgaWYgKGNhbnZhcykge1xuICAgICAgICBpZiAoY2hhbmdlVHlwZSA9PT0gJ3JlbW92ZScpIHtcbiAgICAgICAgICAgIC8vIOS4gOaXpiByZW1vdmXvvIzliJnml6Dms5XlnKggZWxlbWVudCDkuIrmi7/liLDljIXlm7Tnm5JcbiAgICAgICAgICAgIC8vIGRlc3Ryb3kg5ZCO5omA5pyJ5bGe5oCn6YO95ou/5LiN5Yiw77yM5omA5Lul6ZyA6KaB5pqC5a2Y5LiA5LiLXG4gICAgICAgICAgICAvLyDov5nmmK/kuIDmrrUgaGFjayDnmoTku6PnoIFcbiAgICAgICAgICAgIGVsZW1lbnQuX2NhY2hlQ2FudmFzQkJveCA9IGVsZW1lbnQuZ2V0KCdjYWNoZUNhbnZhc0JCb3gnKTtcbiAgICAgICAgfVxuICAgICAgICAvLyDpmLLmraLlj43lpI3liLfmlrBcbiAgICAgICAgaWYgKCFlbGVtZW50LmdldCgnaGFzQ2hhbmdlZCcpKSB7XG4gICAgICAgICAgICAvLyDkvYbmmK/lp4vnu4jopoHmoIforrDkuLogaGFzQ2hhbmdlZO+8jOS+v+S6juWQjumdoui/m+ihjOWxgOmDqOa4suafk1xuICAgICAgICAgICAgZWxlbWVudC5zZXQoJ2hhc0NoYW5nZWQnLCB0cnVlKTtcbiAgICAgICAgICAgIC8vIOacrOadpeWPquacieWxgOmDqOa4suafk+aooeW8j+S4i++8jOaJjemcgOimgeiusOW9leabtOaWsOeahOWFg+e0oOmYn+WIl1xuICAgICAgICAgICAgLy8gaWYgKGNhbnZhcy5nZXQoJ2xvY2FsUmVmcmVzaCcpKSB7XG4gICAgICAgICAgICAvLyAgIGNhbnZhcy5yZWZyZXNoRWxlbWVudChlbGVtZW50LCBjaGFuZ2VUeXBlLCBjYW52YXMpO1xuICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgLy8g5L2G5a+55LqOIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnR2aXMvZy9pc3N1ZXMvNDIyIOeahOWcuuaZr++8jOWFqOWxgOa4suafk+eahOaooeW8j+S4i+S5n+mcgOimgeiusOW9leabtOaWsOeahOWFg+e0oOmYn+WIl1xuICAgICAgICAgICAgLy8g5aaC5p6c5b2T5YmN5YWD57Sg55qE54i25YWD57Sg5Y+R55Sf5LqG5pS55Y+Y77yM5Y+v5Lul5LiN5pS+5YWl6Zif5YiX77yM6L+Z5Y+l6K+d5aSn5qaC6IO95aSf5o+Q5Y2HIDE1JSDnmoTliJ3mrKHmuLLmn5PmgKfog71cbiAgICAgICAgICAgIGlmICghKGVsZW1lbnQuY2ZnLnBhcmVudCAmJiBlbGVtZW50LmNmZy5wYXJlbnQuZ2V0KCdoYXNDaGFuZ2VkJykpKSB7XG4gICAgICAgICAgICAgICAgY2FudmFzLnJlZnJlc2hFbGVtZW50KGVsZW1lbnQsIGNoYW5nZVR5cGUsIGNhbnZhcyk7XG4gICAgICAgICAgICAgICAgaWYgKGNhbnZhcy5nZXQoJ2F1dG9EcmF3JykpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FudmFzLmRyYXcoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0UmVmcmVzaFJlZ2lvbihlbGVtZW50KSB7XG4gICAgdmFyIHJlZ2lvbjtcbiAgICBpZiAoIWVsZW1lbnQuZGVzdHJveWVkKSB7XG4gICAgICAgIHZhciBjYWNoZUJveCA9IGVsZW1lbnQuZ2V0KCdjYWNoZUNhbnZhc0JCb3gnKTtcbiAgICAgICAgdmFyIHZhbGlkQ2FjaGUgPSBjYWNoZUJveCAmJiAhIShjYWNoZUJveC53aWR0aCAmJiBjYWNoZUJveC5oZWlnaHQpO1xuICAgICAgICB2YXIgYmJveCA9IGVsZW1lbnQuZ2V0Q2FudmFzQkJveCgpO1xuICAgICAgICB2YXIgdmFsaWRCQm94ID0gYmJveCAmJiAhIShiYm94LndpZHRoICYmIGJib3guaGVpZ2h0KTtcbiAgICAgICAgLy8g5piv5ZCm5piv5pyJ5pWIIGJib3gg5Yik5a6a77yM5LiA5LqbIE5hTiDmiJbogIUg5a696auY5Li6IDAg55qE5oOF5Ya16L+H5ruk5o6JXG4gICAgICAgIGlmICh2YWxpZENhY2hlICYmIHZhbGlkQkJveCkge1xuICAgICAgICAgICAgcmVnaW9uID0gbWVyZ2VSZWdpb24oY2FjaGVCb3gsIGJib3gpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHZhbGlkQ2FjaGUpIHtcbiAgICAgICAgICAgIHJlZ2lvbiA9IGNhY2hlQm94O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHZhbGlkQkJveCkge1xuICAgICAgICAgICAgcmVnaW9uID0gYmJveDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgLy8g5Zug5Li65YWD57Sg5bey57uP6ZSA5q+B5omA5Lul5peg5rOV6I635Y+W5Yiw57yT5a2Y55qE5YyF5Zu055uSXG4gICAgICAgIHJlZ2lvbiA9IGVsZW1lbnRbJ19jYWNoZUNhbnZhc0JCb3gnXTtcbiAgICB9XG4gICAgcmV0dXJuIHJlZ2lvbjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRNZXJnZWRSZWdpb24oZWxlbWVudHMpIHtcbiAgICBpZiAoIWVsZW1lbnRzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgdmFyIG1pblhBcnIgPSBbXTtcbiAgICB2YXIgbWluWUFyciA9IFtdO1xuICAgIHZhciBtYXhYQXJyID0gW107XG4gICAgdmFyIG1heFlBcnIgPSBbXTtcbiAgICBlYWNoKGVsZW1lbnRzLCBmdW5jdGlvbiAoZWwpIHtcbiAgICAgICAgdmFyIHJlZ2lvbiA9IGdldFJlZnJlc2hSZWdpb24oZWwpO1xuICAgICAgICBpZiAocmVnaW9uKSB7XG4gICAgICAgICAgICBtaW5YQXJyLnB1c2gocmVnaW9uLm1pblgpO1xuICAgICAgICAgICAgbWluWUFyci5wdXNoKHJlZ2lvbi5taW5ZKTtcbiAgICAgICAgICAgIG1heFhBcnIucHVzaChyZWdpb24ubWF4WCk7XG4gICAgICAgICAgICBtYXhZQXJyLnB1c2gocmVnaW9uLm1heFkpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbWluWDogbWluKG1pblhBcnIpLFxuICAgICAgICBtaW5ZOiBtaW4obWluWUFyciksXG4gICAgICAgIG1heFg6IG1heChtYXhYQXJyKSxcbiAgICAgICAgbWF4WTogbWF4KG1heFlBcnIpLFxuICAgIH07XG59XG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VWaWV3KHJlZ2lvbiwgdmlld1JlZ2lvbikge1xuICAgIGlmICghcmVnaW9uIHx8ICF2aWV3UmVnaW9uKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICAvLyDkuI3nm7jkuqTvvIzliJnnm7TmjqXov5Tlm54gbnVsbFxuICAgIGlmICghaW50ZXJzZWN0UmVjdChyZWdpb24sIHZpZXdSZWdpb24pKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBtaW5YOiBNYXRoLm1heChyZWdpb24ubWluWCwgdmlld1JlZ2lvbi5taW5YKSxcbiAgICAgICAgbWluWTogTWF0aC5tYXgocmVnaW9uLm1pblksIHZpZXdSZWdpb24ubWluWSksXG4gICAgICAgIG1heFg6IE1hdGgubWluKHJlZ2lvbi5tYXhYLCB2aWV3UmVnaW9uLm1heFgpLFxuICAgICAgICBtYXhZOiBNYXRoLm1pbihyZWdpb24ubWF4WSwgdmlld1JlZ2lvbi5tYXhZKSxcbiAgICB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZHJhdy5qcy5tYXAiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///30\n")},function(module,exports){eval("/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\nmodule.exports = isArray;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzQXJyYXkuanM/Njc0NyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsRUFBRTtBQUNiLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJmaWxlIjoiMzEuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYW4gYEFycmF5YCBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYXJyYXksIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0FycmF5KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5KGRvY3VtZW50LmJvZHkuY2hpbGRyZW4pO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzQXJyYXkoJ2FiYycpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzQXJyYXkoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbnZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheTtcblxubW9kdWxlLmV4cG9ydHMgPSBpc0FycmF5O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///31\n")},function(module,exports,__webpack_require__){"use strict";eval('\nObject.defineProperty(exports, "__esModule", { value: true });\nexports.NON_CUSTOM_TAG_KEYS = exports.POST_CONSTRUCT = exports.DESIGN_PARAM_TYPES = exports.PARAM_TYPES = exports.TAGGED_PROP = exports.TAGGED = exports.MULTI_INJECT_TAG = exports.INJECT_TAG = exports.OPTIONAL_TAG = exports.UNMANAGED_TAG = exports.NAME_TAG = exports.NAMED_TAG = void 0;\nexports.NAMED_TAG = "named";\nexports.NAME_TAG = "name";\nexports.UNMANAGED_TAG = "unmanaged";\nexports.OPTIONAL_TAG = "optional";\nexports.INJECT_TAG = "inject";\nexports.MULTI_INJECT_TAG = "multi_inject";\nexports.TAGGED = "inversify:tagged";\nexports.TAGGED_PROP = "inversify:tagged_props";\nexports.PARAM_TYPES = "inversify:paramtypes";\nexports.DESIGN_PARAM_TYPES = "design:paramtypes";\nexports.POST_CONSTRUCT = "post_construct";\nfunction getNonCustomTagKeys() {\n return [\n exports.INJECT_TAG,\n exports.MULTI_INJECT_TAG,\n exports.NAME_TAG,\n exports.UNMANAGED_TAG,\n exports.NAMED_TAG,\n exports.OPTIONAL_TAG,\n ];\n}\nexports.NON_CUSTOM_TAG_KEYS = getNonCustomTagKeys();\n//# sourceMappingURL=metadata_keys.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaW52ZXJzaWZ5L2xpYi9jb25zdGFudHMvbWV0YWRhdGFfa2V5cy5qcz9jNWY0Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFhO0FBQ2IsOENBQThDLGNBQWM7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6IjMyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLk5PTl9DVVNUT01fVEFHX0tFWVMgPSBleHBvcnRzLlBPU1RfQ09OU1RSVUNUID0gZXhwb3J0cy5ERVNJR05fUEFSQU1fVFlQRVMgPSBleHBvcnRzLlBBUkFNX1RZUEVTID0gZXhwb3J0cy5UQUdHRURfUFJPUCA9IGV4cG9ydHMuVEFHR0VEID0gZXhwb3J0cy5NVUxUSV9JTkpFQ1RfVEFHID0gZXhwb3J0cy5JTkpFQ1RfVEFHID0gZXhwb3J0cy5PUFRJT05BTF9UQUcgPSBleHBvcnRzLlVOTUFOQUdFRF9UQUcgPSBleHBvcnRzLk5BTUVfVEFHID0gZXhwb3J0cy5OQU1FRF9UQUcgPSB2b2lkIDA7XG5leHBvcnRzLk5BTUVEX1RBRyA9IFwibmFtZWRcIjtcbmV4cG9ydHMuTkFNRV9UQUcgPSBcIm5hbWVcIjtcbmV4cG9ydHMuVU5NQU5BR0VEX1RBRyA9IFwidW5tYW5hZ2VkXCI7XG5leHBvcnRzLk9QVElPTkFMX1RBRyA9IFwib3B0aW9uYWxcIjtcbmV4cG9ydHMuSU5KRUNUX1RBRyA9IFwiaW5qZWN0XCI7XG5leHBvcnRzLk1VTFRJX0lOSkVDVF9UQUcgPSBcIm11bHRpX2luamVjdFwiO1xuZXhwb3J0cy5UQUdHRUQgPSBcImludmVyc2lmeTp0YWdnZWRcIjtcbmV4cG9ydHMuVEFHR0VEX1BST1AgPSBcImludmVyc2lmeTp0YWdnZWRfcHJvcHNcIjtcbmV4cG9ydHMuUEFSQU1fVFlQRVMgPSBcImludmVyc2lmeTpwYXJhbXR5cGVzXCI7XG5leHBvcnRzLkRFU0lHTl9QQVJBTV9UWVBFUyA9IFwiZGVzaWduOnBhcmFtdHlwZXNcIjtcbmV4cG9ydHMuUE9TVF9DT05TVFJVQ1QgPSBcInBvc3RfY29uc3RydWN0XCI7XG5mdW5jdGlvbiBnZXROb25DdXN0b21UYWdLZXlzKCkge1xuICAgIHJldHVybiBbXG4gICAgICAgIGV4cG9ydHMuSU5KRUNUX1RBRyxcbiAgICAgICAgZXhwb3J0cy5NVUxUSV9JTkpFQ1RfVEFHLFxuICAgICAgICBleHBvcnRzLk5BTUVfVEFHLFxuICAgICAgICBleHBvcnRzLlVOTUFOQUdFRF9UQUcsXG4gICAgICAgIGV4cG9ydHMuTkFNRURfVEFHLFxuICAgICAgICBleHBvcnRzLk9QVElPTkFMX1RBRyxcbiAgICBdO1xufVxuZXhwb3J0cy5OT05fQ1VTVE9NX1RBR19LRVlTID0gZ2V0Tm9uQ3VzdG9tVGFnS2V5cygpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWV0YWRhdGFfa2V5cy5qcy5tYXAiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///32\n')},function(module,__webpack_exports__,__webpack_require__){"use strict";eval('/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return getShortenOffset; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return addStartArrow; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return addEndArrow; });\n/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1);\n/* harmony import */ var _shape__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(57);\n\n\nvar sin = Math.sin, cos = Math.cos, atan2 = Math.atan2, PI = Math.PI;\nfunction _addDefaultArrow(shape, attrs, x1, y1, x2, y2, isStart) {\n var stroke = attrs.stroke, lineWidth = attrs.lineWidth;\n var x = x1 - x2;\n var y = y1 - y2;\n var rad = atan2(y, x);\n var arrowShape = new _shape__WEBPACK_IMPORTED_MODULE_1__["Path"]({\n type: \'path\',\n canvas: shape.get(\'canvas\'),\n isArrowShape: true,\n attrs: {\n // 默认箭头的边长为 10,夹角为 60 度\n path: "M" + 10 * cos(PI / 6) + "," + 10 * sin(PI / 6) + " L0,0 L" + 10 * cos(PI / 6) + ",-" + 10 * sin(PI / 6),\n // 使用 shape stroke 值\n stroke: stroke,\n lineWidth: lineWidth,\n },\n });\n arrowShape.translate(x2, y2);\n arrowShape.rotateAtPoint(x2, y2, rad);\n shape.set(isStart ? \'startArrowShape\' : \'endArrowShape\', arrowShape);\n}\n/**\n * 箭头 path 的设置要求\n * 1. 箭头顶点坐标需要为 (0, 0)\n * 2. 箭头夹角的中心分割线需要与 X 轴正方向对齐\n */\nfunction _addCustomizedArrow(shape, attrs, x1, y1, x2, y2, isStart) {\n var startArrow = attrs.startArrow, endArrow = attrs.endArrow, stroke = attrs.stroke, lineWidth = attrs.lineWidth;\n var arrowAttrs = isStart ? startArrow : endArrow;\n var d = arrowAttrs.d, arrowFill = arrowAttrs.fill, arrowStroke = arrowAttrs.stroke, arrowLineWidth = arrowAttrs.lineWidth, restAttrs = Object(tslib__WEBPACK_IMPORTED_MODULE_0__["__rest"])(arrowAttrs, ["d", "fill", "stroke", "lineWidth"]);\n var x = x1 - x2;\n var y = y1 - y2;\n var rad = atan2(y, x);\n if (d) {\n x2 = x2 - cos(rad) * d;\n y2 = y2 - sin(rad) * d;\n }\n var arrowShape = new _shape__WEBPACK_IMPORTED_MODULE_1__["Path"]({\n type: \'path\',\n canvas: shape.get(\'canvas\'),\n isArrowShape: true,\n attrs: Object(tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"])(Object(tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"])({}, restAttrs), { \n // 支持单独设置箭头的 stroke 和 lineWidth,若为空则使用 shape 的值\n stroke: arrowStroke || stroke, lineWidth: arrowLineWidth || lineWidth, \n // 箭头是否填充需要手动设置,不会继承自 shape 的值\n fill: arrowFill }),\n });\n arrowShape.translate(x2, y2);\n arrowShape.rotateAtPoint(x2, y2, rad);\n shape.set(isStart ? \'startArrowShape\' : \'endArrowShape\', arrowShape);\n}\n/**\n * 如果自定义箭头并且有 d 需要做偏移,如果直接画,线条会超出箭头尖端,因此需要根据箭头偏移 d, 返回线需要缩短的距离\n * |----------------\n * |<|--------------\n * |\n * @param {number} x1 起始点 x\n * @param {number} y1 起始点 y\n * @param {number} x2 箭头作用点 x\n * @param {number} y2 箭头作用点 y\n * @param {number} d 箭头沿线条方向的偏移距离\n * @return {{dx: number, dy: number}} 返回线条偏移距离\n */\nfunction getShortenOffset(x1, y1, x2, y2, d) {\n var rad = atan2(y2 - y1, x2 - x1);\n return {\n dx: cos(rad) * d,\n dy: sin(rad) * d,\n };\n}\n/**\n * 绘制起始箭头\n * @param {IShape} shape 图形\n * @param {ShapeAttrs} attrs shape 的绘图属性\n * @param {number} x1 起始点 x\n * @param {number} y1 起始点 y\n * @param {number} x2 箭头作用点 x\n * @param {number} y2 箭头作用点 y\n */\nfunction addStartArrow(shape, attrs, x1, y1, x2, y2) {\n if (typeof attrs.startArrow === \'object\') {\n _addCustomizedArrow(shape, attrs, x1, y1, x2, y2, true);\n }\n else if (attrs.startArrow) {\n _addDefaultArrow(shape, attrs, x1, y1, x2, y2, true);\n }\n else {\n shape.set(\'startArrowShape\', null);\n }\n}\n/**\n * 绘制结束箭头\n * @param {IShape} shape 图形\n * @param {ShapeAttrs} attrs shape 的绘图属性\n * @param {number} x1 起始点 x\n * @param {number} y1 起始点 y\n * @param {number} x2 箭头作用点 x\n * @param {number} y2 箭头作用点 y\n */\nfunction addEndArrow(shape, attrs, x1, y1, x2, y2) {\n if (typeof attrs.endArrow === \'object\') {\n _addCustomizedArrow(shape, attrs, x1, y1, x2, y2, false);\n }\n else if (attrs.endArrow) {\n _addDefaultArrow(shape, attrs, x1, y1, x2, y2, false);\n }\n else {\n shape.set(\'startArrowShape\', null);\n }\n}\n//# sourceMappingURL=arrow.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy1jYW52YXMvZXNtL3V0aWwvYXJyb3cuanM/OWYyNyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQXlDO0FBQ1Q7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLDJDQUFJO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMklBQTJJLG9EQUFNO0FBQ2pKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLDJDQUFJO0FBQzdCO0FBQ0E7QUFDQTtBQUNBLGVBQWUsc0RBQVEsQ0FBQyxzREFBUSxHQUFHLGU7QUFDbkM7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsd0JBQXdCO0FBQ3JDO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsV0FBVztBQUN0QixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEI7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixXQUFXLFdBQVc7QUFDdEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6IjMzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgX19hc3NpZ24sIF9fcmVzdCB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgUGF0aCB9IGZyb20gJy4uL3NoYXBlJztcbnZhciBzaW4gPSBNYXRoLnNpbiwgY29zID0gTWF0aC5jb3MsIGF0YW4yID0gTWF0aC5hdGFuMiwgUEkgPSBNYXRoLlBJO1xuZnVuY3Rpb24gX2FkZERlZmF1bHRBcnJvdyhzaGFwZSwgYXR0cnMsIHgxLCB5MSwgeDIsIHkyLCBpc1N0YXJ0KSB7XG4gICAgdmFyIHN0cm9rZSA9IGF0dHJzLnN0cm9rZSwgbGluZVdpZHRoID0gYXR0cnMubGluZVdpZHRoO1xuICAgIHZhciB4ID0geDEgLSB4MjtcbiAgICB2YXIgeSA9IHkxIC0geTI7XG4gICAgdmFyIHJhZCA9IGF0YW4yKHksIHgpO1xuICAgIHZhciBhcnJvd1NoYXBlID0gbmV3IFBhdGgoe1xuICAgICAgICB0eXBlOiAncGF0aCcsXG4gICAgICAgIGNhbnZhczogc2hhcGUuZ2V0KCdjYW52YXMnKSxcbiAgICAgICAgaXNBcnJvd1NoYXBlOiB0cnVlLFxuICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgLy8g6buY6K6k566t5aS055qE6L656ZW/5Li6IDEw77yM5aS56KeS5Li6IDYwIOW6plxuICAgICAgICAgICAgcGF0aDogXCJNXCIgKyAxMCAqIGNvcyhQSSAvIDYpICsgXCIsXCIgKyAxMCAqIHNpbihQSSAvIDYpICsgXCIgTDAsMCBMXCIgKyAxMCAqIGNvcyhQSSAvIDYpICsgXCIsLVwiICsgMTAgKiBzaW4oUEkgLyA2KSxcbiAgICAgICAgICAgIC8vIOS9v+eUqCBzaGFwZSBzdHJva2Ug5YC8XG4gICAgICAgICAgICBzdHJva2U6IHN0cm9rZSxcbiAgICAgICAgICAgIGxpbmVXaWR0aDogbGluZVdpZHRoLFxuICAgICAgICB9LFxuICAgIH0pO1xuICAgIGFycm93U2hhcGUudHJhbnNsYXRlKHgyLCB5Mik7XG4gICAgYXJyb3dTaGFwZS5yb3RhdGVBdFBvaW50KHgyLCB5MiwgcmFkKTtcbiAgICBzaGFwZS5zZXQoaXNTdGFydCA/ICdzdGFydEFycm93U2hhcGUnIDogJ2VuZEFycm93U2hhcGUnLCBhcnJvd1NoYXBlKTtcbn1cbi8qKlxuICog566t5aS0IHBhdGgg55qE6K6+572u6KaB5rGCXG4gKiAxLiDnrq3lpLTpobbngrnlnZDmoIfpnIDopoHkuLogKDAsIDApXG4gKiAyLiDnrq3lpLTlpLnop5LnmoTkuK3lv4PliIblibLnur/pnIDopoHkuI4gWCDovbTmraPmlrnlkJHlr7npvZBcbiAqL1xuZnVuY3Rpb24gX2FkZEN1c3RvbWl6ZWRBcnJvdyhzaGFwZSwgYXR0cnMsIHgxLCB5MSwgeDIsIHkyLCBpc1N0YXJ0KSB7XG4gICAgdmFyIHN0YXJ0QXJyb3cgPSBhdHRycy5zdGFydEFycm93LCBlbmRBcnJvdyA9IGF0dHJzLmVuZEFycm93LCBzdHJva2UgPSBhdHRycy5zdHJva2UsIGxpbmVXaWR0aCA9IGF0dHJzLmxpbmVXaWR0aDtcbiAgICB2YXIgYXJyb3dBdHRycyA9IGlzU3RhcnQgPyBzdGFydEFycm93IDogZW5kQXJyb3c7XG4gICAgdmFyIGQgPSBhcnJvd0F0dHJzLmQsIGFycm93RmlsbCA9IGFycm93QXR0cnMuZmlsbCwgYXJyb3dTdHJva2UgPSBhcnJvd0F0dHJzLnN0cm9rZSwgYXJyb3dMaW5lV2lkdGggPSBhcnJvd0F0dHJzLmxpbmVXaWR0aCwgcmVzdEF0dHJzID0gX19yZXN0KGFycm93QXR0cnMsIFtcImRcIiwgXCJmaWxsXCIsIFwic3Ryb2tlXCIsIFwibGluZVdpZHRoXCJdKTtcbiAgICB2YXIgeCA9IHgxIC0geDI7XG4gICAgdmFyIHkgPSB5MSAtIHkyO1xuICAgIHZhciByYWQgPSBhdGFuMih5LCB4KTtcbiAgICBpZiAoZCkge1xuICAgICAgICB4MiA9IHgyIC0gY29zKHJhZCkgKiBkO1xuICAgICAgICB5MiA9IHkyIC0gc2luKHJhZCkgKiBkO1xuICAgIH1cbiAgICB2YXIgYXJyb3dTaGFwZSA9IG5ldyBQYXRoKHtcbiAgICAgICAgdHlwZTogJ3BhdGgnLFxuICAgICAgICBjYW52YXM6IHNoYXBlLmdldCgnY2FudmFzJyksXG4gICAgICAgIGlzQXJyb3dTaGFwZTogdHJ1ZSxcbiAgICAgICAgYXR0cnM6IF9fYXNzaWduKF9fYXNzaWduKHt9LCByZXN0QXR0cnMpLCB7IFxuICAgICAgICAgICAgLy8g5pSv5oyB5Y2V54us6K6+572u566t5aS055qEIHN0cm9rZSDlkowgbGluZVdpZHRo77yM6Iul5Li656m65YiZ5L2/55SoIHNoYXBlIOeahOWAvFxuICAgICAgICAgICAgc3Ryb2tlOiBhcnJvd1N0cm9rZSB8fCBzdHJva2UsIGxpbmVXaWR0aDogYXJyb3dMaW5lV2lkdGggfHwgbGluZVdpZHRoLCBcbiAgICAgICAgICAgIC8vIOeureWktOaYr+WQpuWhq+WFhemcgOimgeaJi+WKqOiuvue9ru+8jOS4jeS8mue7p+aJv+iHqiBzaGFwZSDnmoTlgLxcbiAgICAgICAgICAgIGZpbGw6IGFycm93RmlsbCB9KSxcbiAgICB9KTtcbiAgICBhcnJvd1NoYXBlLnRyYW5zbGF0ZSh4MiwgeTIpO1xuICAgIGFycm93U2hhcGUucm90YXRlQXRQb2ludCh4MiwgeTIsIHJhZCk7XG4gICAgc2hhcGUuc2V0KGlzU3RhcnQgPyAnc3RhcnRBcnJvd1NoYXBlJyA6ICdlbmRBcnJvd1NoYXBlJywgYXJyb3dTaGFwZSk7XG59XG4vKipcbiAqIOWmguaenOiHquWumuS5ieeureWktOW5tuS4lOaciSBkIOmcgOimgeWBmuWBj+enu++8jOWmguaenOebtOaOpeeUu++8jOe6v+adoeS8mui2heWHuueureWktOWwluerr++8jOWboOatpOmcgOimgeagueaNrueureWktOWBj+enuyBkLCDov5Tlm57nur/pnIDopoHnvKnnn63nmoTot53nprtcbiAqIHwtLS0tLS0tLS0tLS0tLS0tXG4gKiB8PHwtLS0tLS0tLS0tLS0tLVxuICogfFxuICogQHBhcmFtIHtudW1iZXJ9IHgxIOi1t+Wni+eCuSB4XG4gKiBAcGFyYW0ge251bWJlcn0geTEg6LW35aeL54K5IHlcbiAqIEBwYXJhbSB7bnVtYmVyfSB4MiDnrq3lpLTkvZznlKjngrkgeFxuICogQHBhcmFtIHtudW1iZXJ9IHkyIOeureWktOS9nOeUqOeCuSB5XG4gKiBAcGFyYW0ge251bWJlcn0gZCAg566t5aS05rK/57q/5p2h5pa55ZCR55qE5YGP56e76Led56a7XG4gKiBAcmV0dXJuIHt7ZHg6IG51bWJlciwgZHk6IG51bWJlcn19IOi/lOWbnue6v+adoeWBj+enu+i3neemu1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2hvcnRlbk9mZnNldCh4MSwgeTEsIHgyLCB5MiwgZCkge1xuICAgIHZhciByYWQgPSBhdGFuMih5MiAtIHkxLCB4MiAtIHgxKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBkeDogY29zKHJhZCkgKiBkLFxuICAgICAgICBkeTogc2luKHJhZCkgKiBkLFxuICAgIH07XG59XG4vKipcbiAqIOe7mOWItui1t+Wni+eureWktFxuICogQHBhcmFtIHtJU2hhcGV9IHNoYXBlIOWbvuW9olxuICogQHBhcmFtIHtTaGFwZUF0dHJzfSBhdHRycyBzaGFwZSDnmoTnu5jlm77lsZ7mgKdcbiAqIEBwYXJhbSB7bnVtYmVyfSB4MSDotbflp4vngrkgeFxuICogQHBhcmFtIHtudW1iZXJ9IHkxIOi1t+Wni+eCuSB5XG4gKiBAcGFyYW0ge251bWJlcn0geDIg566t5aS05L2c55So54K5IHhcbiAqIEBwYXJhbSB7bnVtYmVyfSB5MiDnrq3lpLTkvZznlKjngrkgeVxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkU3RhcnRBcnJvdyhzaGFwZSwgYXR0cnMsIHgxLCB5MSwgeDIsIHkyKSB7XG4gICAgaWYgKHR5cGVvZiBhdHRycy5zdGFydEFycm93ID09PSAnb2JqZWN0Jykge1xuICAgICAgICBfYWRkQ3VzdG9taXplZEFycm93KHNoYXBlLCBhdHRycywgeDEsIHkxLCB4MiwgeTIsIHRydWUpO1xuICAgIH1cbiAgICBlbHNlIGlmIChhdHRycy5zdGFydEFycm93KSB7XG4gICAgICAgIF9hZGREZWZhdWx0QXJyb3coc2hhcGUsIGF0dHJzLCB4MSwgeTEsIHgyLCB5MiwgdHJ1ZSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBzaGFwZS5zZXQoJ3N0YXJ0QXJyb3dTaGFwZScsIG51bGwpO1xuICAgIH1cbn1cbi8qKlxuICog57uY5Yi257uT5p2f566t5aS0XG4gKiBAcGFyYW0ge0lTaGFwZX0gc2hhcGUg5Zu+5b2iXG4gKiBAcGFyYW0ge1NoYXBlQXR0cnN9IGF0dHJzIHNoYXBlIOeahOe7mOWbvuWxnuaAp1xuICogQHBhcmFtIHtudW1iZXJ9IHgxIOi1t+Wni+eCuSB4XG4gKiBAcGFyYW0ge251bWJlcn0geTEg6LW35aeL54K5IHlcbiAqIEBwYXJhbSB7bnVtYmVyfSB4MiDnrq3lpLTkvZznlKjngrkgeFxuICogQHBhcmFtIHtudW1iZXJ9IHkyIOeureWktOS9nOeUqOeCuSB5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGRFbmRBcnJvdyhzaGFwZSwgYXR0cnMsIHgxLCB5MSwgeDIsIHkyKSB7XG4gICAgaWYgKHR5cGVvZiBhdHRycy5lbmRBcnJvdyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgX2FkZEN1c3RvbWl6ZWRBcnJvdyhzaGFwZSwgYXR0cnMsIHgxLCB5MSwgeDIsIHkyLCBmYWxzZSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGF0dHJzLmVuZEFycm93KSB7XG4gICAgICAgIF9hZGREZWZhdWx0QXJyb3coc2hhcGUsIGF0dHJzLCB4MSwgeTEsIHgyLCB5MiwgZmFsc2UpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgc2hhcGUuc2V0KCdzdGFydEFycm93U2hhcGUnLCBudWxsKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hcnJvdy5qcy5tYXAiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///33\n')},function(module,__webpack_exports__,__webpack_require__){"use strict";eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return setShadow; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return setTransform; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return setClip; });\n/* harmony import */ var _dom__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(26);\n\nfunction setShadow(model, context) {\n var el = model.cfg.el;\n var attrs = model.attr();\n var cfg = {\n dx: attrs.shadowOffsetX,\n dy: attrs.shadowOffsetY,\n blur: attrs.shadowBlur,\n color: attrs.shadowColor,\n };\n if (!cfg.dx && !cfg.dy && !cfg.blur && !cfg.color) {\n el.removeAttribute('filter');\n }\n else {\n var id = context.find('filter', cfg);\n if (!id) {\n id = context.addShadow(cfg);\n }\n el.setAttribute('filter', \"url(#\" + id + \")\");\n }\n}\nfunction setTransform(model) {\n var matrix = model.attr().matrix;\n if (matrix) {\n var el = model.cfg.el;\n var transform = [];\n for (var i = 0; i < 9; i += 3) {\n transform.push(matrix[i] + \",\" + matrix[i + 1]);\n }\n transform = transform.join(',');\n if (transform.indexOf('NaN') === -1) {\n el.setAttribute('transform', \"matrix(\" + transform + \")\");\n }\n else {\n console.warn('invalid matrix:', matrix);\n }\n }\n}\nfunction setClip(model, context) {\n var clip = model.getClip();\n var el = model.get('el');\n if (!clip) {\n el.removeAttribute('clip-path');\n }\n else if (clip && !el.hasAttribute('clip-path')) {\n Object(_dom__WEBPACK_IMPORTED_MODULE_0__[/* createDom */ \"a\"])(clip);\n clip.createPath(context);\n var id = context.addClip(clip);\n el.setAttribute('clip-path', \"url(#\" + id + \")\");\n }\n}\n//# sourceMappingURL=svg.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy1zdmcvZXNtL3V0aWwvc3ZnLmpzPzAwZjkiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFBa0M7QUFDM0I7QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsT0FBTztBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLDhEQUFTO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiIzNC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNyZWF0ZURvbSB9IGZyb20gJy4vZG9tJztcbmV4cG9ydCBmdW5jdGlvbiBzZXRTaGFkb3cobW9kZWwsIGNvbnRleHQpIHtcbiAgICB2YXIgZWwgPSBtb2RlbC5jZmcuZWw7XG4gICAgdmFyIGF0dHJzID0gbW9kZWwuYXR0cigpO1xuICAgIHZhciBjZmcgPSB7XG4gICAgICAgIGR4OiBhdHRycy5zaGFkb3dPZmZzZXRYLFxuICAgICAgICBkeTogYXR0cnMuc2hhZG93T2Zmc2V0WSxcbiAgICAgICAgYmx1cjogYXR0cnMuc2hhZG93Qmx1cixcbiAgICAgICAgY29sb3I6IGF0dHJzLnNoYWRvd0NvbG9yLFxuICAgIH07XG4gICAgaWYgKCFjZmcuZHggJiYgIWNmZy5keSAmJiAhY2ZnLmJsdXIgJiYgIWNmZy5jb2xvcikge1xuICAgICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoJ2ZpbHRlcicpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdmFyIGlkID0gY29udGV4dC5maW5kKCdmaWx0ZXInLCBjZmcpO1xuICAgICAgICBpZiAoIWlkKSB7XG4gICAgICAgICAgICBpZCA9IGNvbnRleHQuYWRkU2hhZG93KGNmZyk7XG4gICAgICAgIH1cbiAgICAgICAgZWwuc2V0QXR0cmlidXRlKCdmaWx0ZXInLCBcInVybCgjXCIgKyBpZCArIFwiKVwiKTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gc2V0VHJhbnNmb3JtKG1vZGVsKSB7XG4gICAgdmFyIG1hdHJpeCA9IG1vZGVsLmF0dHIoKS5tYXRyaXg7XG4gICAgaWYgKG1hdHJpeCkge1xuICAgICAgICB2YXIgZWwgPSBtb2RlbC5jZmcuZWw7XG4gICAgICAgIHZhciB0cmFuc2Zvcm0gPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCA5OyBpICs9IDMpIHtcbiAgICAgICAgICAgIHRyYW5zZm9ybS5wdXNoKG1hdHJpeFtpXSArIFwiLFwiICsgbWF0cml4W2kgKyAxXSk7XG4gICAgICAgIH1cbiAgICAgICAgdHJhbnNmb3JtID0gdHJhbnNmb3JtLmpvaW4oJywnKTtcbiAgICAgICAgaWYgKHRyYW5zZm9ybS5pbmRleE9mKCdOYU4nKSA9PT0gLTEpIHtcbiAgICAgICAgICAgIGVsLnNldEF0dHJpYnV0ZSgndHJhbnNmb3JtJywgXCJtYXRyaXgoXCIgKyB0cmFuc2Zvcm0gKyBcIilcIik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ2ludmFsaWQgbWF0cml4OicsIG1hdHJpeCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gc2V0Q2xpcChtb2RlbCwgY29udGV4dCkge1xuICAgIHZhciBjbGlwID0gbW9kZWwuZ2V0Q2xpcCgpO1xuICAgIHZhciBlbCA9IG1vZGVsLmdldCgnZWwnKTtcbiAgICBpZiAoIWNsaXApIHtcbiAgICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKCdjbGlwLXBhdGgnKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoY2xpcCAmJiAhZWwuaGFzQXR0cmlidXRlKCdjbGlwLXBhdGgnKSkge1xuICAgICAgICBjcmVhdGVEb20oY2xpcCk7XG4gICAgICAgIGNsaXAuY3JlYXRlUGF0aChjb250ZXh0KTtcbiAgICAgICAgdmFyIGlkID0gY29udGV4dC5hZGRDbGlwKGNsaXApO1xuICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoJ2NsaXAtcGF0aCcsIFwidXJsKCNcIiArIGlkICsgXCIpXCIpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXN2Zy5qcy5tYXAiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///34\n")},function(module,__webpack_exports__,__webpack_require__){"use strict";eval('/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return gl; });\n/**\n * WebGL 枚举值\n * @see http://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14\n * 使用 babel 插件对常量进行内联,以减少最终打包产物大小\n * @see https://github.com/uber/deck.gl/blob/7.1-release/dev-docs/roadmaps/dist-size-roadmap.md#inline-gl-constants\n * 为了支持 WebGPU,新增 TextureUsage\n * @see https://gpuweb.github.io/gpuweb/#gputextureusage\n */\nvar gl;\n\n(function (gl) {\n gl[gl["DEPTH_BUFFER_BIT"] = 256] = "DEPTH_BUFFER_BIT";\n gl[gl["STENCIL_BUFFER_BIT"] = 1024] = "STENCIL_BUFFER_BIT";\n gl[gl["COLOR_BUFFER_BIT"] = 16384] = "COLOR_BUFFER_BIT";\n gl[gl["POINTS"] = 0] = "POINTS";\n gl[gl["LINES"] = 1] = "LINES";\n gl[gl["LINE_LOOP"] = 2] = "LINE_LOOP";\n gl[gl["LINE_STRIP"] = 3] = "LINE_STRIP";\n gl[gl["TRIANGLES"] = 4] = "TRIANGLES";\n gl[gl["TRIANGLE_STRIP"] = 5] = "TRIANGLE_STRIP";\n gl[gl["TRIANGLE_FAN"] = 6] = "TRIANGLE_FAN";\n gl[gl["ZERO"] = 0] = "ZERO";\n gl[gl["ONE"] = 1] = "ONE";\n gl[gl["SRC_COLOR"] = 768] = "SRC_COLOR";\n gl[gl["ONE_MINUS_SRC_COLOR"] = 769] = "ONE_MINUS_SRC_COLOR";\n gl[gl["SRC_ALPHA"] = 770] = "SRC_ALPHA";\n gl[gl["ONE_MINUS_SRC_ALPHA"] = 771] = "ONE_MINUS_SRC_ALPHA";\n gl[gl["DST_ALPHA"] = 772] = "DST_ALPHA";\n gl[gl["ONE_MINUS_DST_ALPHA"] = 773] = "ONE_MINUS_DST_ALPHA";\n gl[gl["DST_COLOR"] = 774] = "DST_COLOR";\n gl[gl["ONE_MINUS_DST_COLOR"] = 775] = "ONE_MINUS_DST_COLOR";\n gl[gl["SRC_ALPHA_SATURATE"] = 776] = "SRC_ALPHA_SATURATE";\n gl[gl["FUNC_ADD"] = 32774] = "FUNC_ADD";\n gl[gl["BLEND_EQUATION"] = 32777] = "BLEND_EQUATION";\n gl[gl["BLEND_EQUATION_RGB"] = 32777] = "BLEND_EQUATION_RGB";\n gl[gl["BLEND_EQUATION_ALPHA"] = 34877] = "BLEND_EQUATION_ALPHA";\n gl[gl["FUNC_SUBTRACT"] = 32778] = "FUNC_SUBTRACT";\n gl[gl["FUNC_REVERSE_SUBTRACT"] = 32779] = "FUNC_REVERSE_SUBTRACT";\n gl[gl["MAX_EXT"] = 32776] = "MAX_EXT";\n gl[gl["MIN_EXT"] = 32775] = "MIN_EXT";\n gl[gl["BLEND_DST_RGB"] = 32968] = "BLEND_DST_RGB";\n gl[gl["BLEND_SRC_RGB"] = 32969] = "BLEND_SRC_RGB";\n gl[gl["BLEND_DST_ALPHA"] = 32970] = "BLEND_DST_ALPHA";\n gl[gl["BLEND_SRC_ALPHA"] = 32971] = "BLEND_SRC_ALPHA";\n gl[gl["CONSTANT_COLOR"] = 32769] = "CONSTANT_COLOR";\n gl[gl["ONE_MINUS_CONSTANT_COLOR"] = 32770] = "ONE_MINUS_CONSTANT_COLOR";\n gl[gl["CONSTANT_ALPHA"] = 32771] = "CONSTANT_ALPHA";\n gl[gl["ONE_MINUS_CONSTANT_ALPHA"] = 32772] = "ONE_MINUS_CONSTANT_ALPHA";\n gl[gl["BLEND_COLOR"] = 32773] = "BLEND_COLOR";\n gl[gl["ARRAY_BUFFER"] = 34962] = "ARRAY_BUFFER";\n gl[gl["ELEMENT_ARRAY_BUFFER"] = 34963] = "ELEMENT_ARRAY_BUFFER";\n gl[gl["ARRAY_BUFFER_BINDING"] = 34964] = "ARRAY_BUFFER_BINDING";\n gl[gl["ELEMENT_ARRAY_BUFFER_BINDING"] = 34965] = "ELEMENT_ARRAY_BUFFER_BINDING";\n gl[gl["STREAM_DRAW"] = 35040] = "STREAM_DRAW";\n gl[gl["STATIC_DRAW"] = 35044] = "STATIC_DRAW";\n gl[gl["DYNAMIC_DRAW"] = 35048] = "DYNAMIC_DRAW";\n gl[gl["BUFFER_SIZE"] = 34660] = "BUFFER_SIZE";\n gl[gl["BUFFER_USAGE"] = 34661] = "BUFFER_USAGE";\n gl[gl["CURRENT_VERTEX_ATTRIB"] = 34342] = "CURRENT_VERTEX_ATTRIB";\n gl[gl["FRONT"] = 1028] = "FRONT";\n gl[gl["BACK"] = 1029] = "BACK";\n gl[gl["FRONT_AND_BACK"] = 1032] = "FRONT_AND_BACK";\n gl[gl["CULL_FACE"] = 2884] = "CULL_FACE";\n gl[gl["BLEND"] = 3042] = "BLEND";\n gl[gl["DITHER"] = 3024] = "DITHER";\n gl[gl["STENCIL_TEST"] = 2960] = "STENCIL_TEST";\n gl[gl["DEPTH_TEST"] = 2929] = "DEPTH_TEST";\n gl[gl["SCISSOR_TEST"] = 3089] = "SCISSOR_TEST";\n gl[gl["POLYGON_OFFSET_FILL"] = 32823] = "POLYGON_OFFSET_FILL";\n gl[gl["SAMPLE_ALPHA_TO_COVERAGE"] = 32926] = "SAMPLE_ALPHA_TO_COVERAGE";\n gl[gl["SAMPLE_COVERAGE"] = 32928] = "SAMPLE_COVERAGE";\n gl[gl["NO_ERROR"] = 0] = "NO_ERROR";\n gl[gl["INVALID_ENUM"] = 1280] = "INVALID_ENUM";\n gl[gl["INVALID_VALUE"] = 1281] = "INVALID_VALUE";\n gl[gl["INVALID_OPERATION"] = 1282] = "INVALID_OPERATION";\n gl[gl["OUT_OF_MEMORY"] = 1285] = "OUT_OF_MEMORY";\n gl[gl["CW"] = 2304] = "CW";\n gl[gl["CCW"] = 2305] = "CCW";\n gl[gl["LINE_WIDTH"] = 2849] = "LINE_WIDTH";\n gl[gl["ALIASED_POINT_SIZE_RANGE"] = 33901] = "ALIASED_POINT_SIZE_RANGE";\n gl[gl["ALIASED_LINE_WIDTH_RANGE"] = 33902] = "ALIASED_LINE_WIDTH_RANGE";\n gl[gl["CULL_FACE_MODE"] = 2885] = "CULL_FACE_MODE";\n gl[gl["FRONT_FACE"] = 2886] = "FRONT_FACE";\n gl[gl["DEPTH_RANGE"] = 2928] = "DEPTH_RANGE";\n gl[gl["DEPTH_WRITEMASK"] = 2930] = "DEPTH_WRITEMASK";\n gl[gl["DEPTH_CLEAR_VALUE"] = 2931] = "DEPTH_CLEAR_VALUE";\n gl[gl["DEPTH_FUNC"] = 2932] = "DEPTH_FUNC";\n gl[gl["STENCIL_CLEAR_VALUE"] = 2961] = "STENCIL_CLEAR_VALUE";\n gl[gl["STENCIL_FUNC"] = 2962] = "STENCIL_FUNC";\n gl[gl["STENCIL_FAIL"] = 2964] = "STENCIL_FAIL";\n gl[gl["STENCIL_PASS_DEPTH_FAIL"] = 2965] = "STENCIL_PASS_DEPTH_FAIL";\n gl[gl["STENCIL_PASS_DEPTH_PASS"] = 2966] = "STENCIL_PASS_DEPTH_PASS";\n gl[gl["STENCIL_REF"] = 2967] = "STENCIL_REF";\n gl[gl["STENCIL_VALUE_MASK"] = 2963] = "STENCIL_VALUE_MASK";\n gl[gl["STENCIL_WRITEMASK"] = 2968] = "STENCIL_WRITEMASK";\n gl[gl["STENCIL_BACK_FUNC"] = 34816] = "STENCIL_BACK_FUNC";\n gl[gl["STENCIL_BACK_FAIL"] = 34817] = "STENCIL_BACK_FAIL";\n gl[gl["STENCIL_BACK_PASS_DEPTH_FAIL"] = 34818] = "STENCIL_BACK_PASS_DEPTH_FAIL";\n gl[gl["STENCIL_BACK_PASS_DEPTH_PASS"] = 34819] = "STENCIL_BACK_PASS_DEPTH_PASS";\n gl[gl["STENCIL_BACK_REF"] = 36003] = "STENCIL_BACK_REF";\n gl[gl["STENCIL_BACK_VALUE_MASK"] = 36004] = "STENCIL_BACK_VALUE_MASK";\n gl[gl["STENCIL_BACK_WRITEMASK"] = 36005] = "STENCIL_BACK_WRITEMASK";\n gl[gl["VIEWPORT"] = 2978] = "VIEWPORT";\n gl[gl["SCISSOR_BOX"] = 3088] = "SCISSOR_BOX";\n gl[gl["COLOR_CLEAR_VALUE"] = 3106] = "COLOR_CLEAR_VALUE";\n gl[gl["COLOR_WRITEMASK"] = 3107] = "COLOR_WRITEMASK";\n gl[gl["UNPACK_ALIGNMENT"] = 3317] = "UNPACK_ALIGNMENT";\n gl[gl["PACK_ALIGNMENT"] = 3333] = "PACK_ALIGNMENT";\n gl[gl["MAX_TEXTURE_SIZE"] = 3379] = "MAX_TEXTURE_SIZE";\n gl[gl["MAX_VIEWPORT_DIMS"] = 3386] = "MAX_VIEWPORT_DIMS";\n gl[gl["SUBPIXEL_BITS"] = 3408] = "SUBPIXEL_BITS";\n gl[gl["RED_BITS"] = 3410] = "RED_BITS";\n gl[gl["GREEN_BITS"] = 3411] = "GREEN_BITS";\n gl[gl["BLUE_BITS"] = 3412] = "BLUE_BITS";\n gl[gl["ALPHA_BITS"] = 3413] = "ALPHA_BITS";\n gl[gl["DEPTH_BITS"] = 3414] = "DEPTH_BITS";\n gl[gl["STENCIL_BITS"] = 3415] = "STENCIL_BITS";\n gl[gl["POLYGON_OFFSET_UNITS"] = 10752] = "POLYGON_OFFSET_UNITS";\n gl[gl["POLYGON_OFFSET_FACTOR"] = 32824] = "POLYGON_OFFSET_FACTOR";\n gl[gl["TEXTURE_BINDING_2D"] = 32873] = "TEXTURE_BINDING_2D";\n gl[gl["SAMPLE_BUFFERS"] = 32936] = "SAMPLE_BUFFERS";\n gl[gl["SAMPLES"] = 32937] = "SAMPLES";\n gl[gl["SAMPLE_COVERAGE_VALUE"] = 32938] = "SAMPLE_COVERAGE_VALUE";\n gl[gl["SAMPLE_COVERAGE_INVERT"] = 32939] = "SAMPLE_COVERAGE_INVERT";\n gl[gl["COMPRESSED_TEXTURE_FORMATS"] = 34467] = "COMPRESSED_TEXTURE_FORMATS";\n gl[gl["DONT_CARE"] = 4352] = "DONT_CARE";\n gl[gl["FASTEST"] = 4353] = "FASTEST";\n gl[gl["NICEST"] = 4354] = "NICEST";\n gl[gl["GENERATE_MIPMAP_HINT"] = 33170] = "GENERATE_MIPMAP_HINT";\n gl[gl["BYTE"] = 5120] = "BYTE";\n gl[gl["UNSIGNED_BYTE"] = 5121] = "UNSIGNED_BYTE";\n gl[gl["SHORT"] = 5122] = "SHORT";\n gl[gl["UNSIGNED_SHORT"] = 5123] = "UNSIGNED_SHORT";\n gl[gl["INT"] = 5124] = "INT";\n gl[gl["UNSIGNED_INT"] = 5125] = "UNSIGNED_INT";\n gl[gl["FLOAT"] = 5126] = "FLOAT";\n gl[gl["DEPTH_COMPONENT"] = 6402] = "DEPTH_COMPONENT";\n gl[gl["ALPHA"] = 6406] = "ALPHA";\n gl[gl["RGB"] = 6407] = "RGB";\n gl[gl["RGBA"] = 6408] = "RGBA";\n gl[gl["LUMINANCE"] = 6409] = "LUMINANCE";\n gl[gl["LUMINANCE_ALPHA"] = 6410] = "LUMINANCE_ALPHA";\n gl[gl["UNSIGNED_SHORT_4_4_4_4"] = 32819] = "UNSIGNED_SHORT_4_4_4_4";\n gl[gl["UNSIGNED_SHORT_5_5_5_1"] = 32820] = "UNSIGNED_SHORT_5_5_5_1";\n gl[gl["UNSIGNED_SHORT_5_6_5"] = 33635] = "UNSIGNED_SHORT_5_6_5";\n gl[gl["FRAGMENT_SHADER"] = 35632] = "FRAGMENT_SHADER";\n gl[gl["VERTEX_SHADER"] = 35633] = "VERTEX_SHADER";\n gl[gl["MAX_VERTEX_ATTRIBS"] = 34921] = "MAX_VERTEX_ATTRIBS";\n gl[gl["MAX_VERTEX_UNIFORM_VECTORS"] = 36347] = "MAX_VERTEX_UNIFORM_VECTORS";\n gl[gl["MAX_VARYING_VECTORS"] = 36348] = "MAX_VARYING_VECTORS";\n gl[gl["MAX_COMBINED_TEXTURE_IMAGE_UNITS"] = 35661] = "MAX_COMBINED_TEXTURE_IMAGE_UNITS";\n gl[gl["MAX_VERTEX_TEXTURE_IMAGE_UNITS"] = 35660] = "MAX_VERTEX_TEXTURE_IMAGE_UNITS";\n gl[gl["MAX_TEXTURE_IMAGE_UNITS"] = 34930] = "MAX_TEXTURE_IMAGE_UNITS";\n gl[gl["MAX_FRAGMENT_UNIFORM_VECTORS"] = 36349] = "MAX_FRAGMENT_UNIFORM_VECTORS";\n gl[gl["SHADER_TYPE"] = 35663] = "SHADER_TYPE";\n gl[gl["DELETE_STATUS"] = 35712] = "DELETE_STATUS";\n gl[gl["LINK_STATUS"] = 35714] = "LINK_STATUS";\n gl[gl["VALIDATE_STATUS"] = 35715] = "VALIDATE_STATUS";\n gl[gl["ATTACHED_SHADERS"] = 35717] = "ATTACHED_SHADERS";\n gl[gl["ACTIVE_UNIFORMS"] = 35718] = "ACTIVE_UNIFORMS";\n gl[gl["ACTIVE_ATTRIBUTES"] = 35721] = "ACTIVE_ATTRIBUTES";\n gl[gl["SHADING_LANGUAGE_VERSION"] = 35724] = "SHADING_LANGUAGE_VERSION";\n gl[gl["CURRENT_PROGRAM"] = 35725] = "CURRENT_PROGRAM";\n gl[gl["NEVER"] = 512] = "NEVER";\n gl[gl["LESS"] = 513] = "LESS";\n gl[gl["EQUAL"] = 514] = "EQUAL";\n gl[gl["LEQUAL"] = 515] = "LEQUAL";\n gl[gl["GREATER"] = 516] = "GREATER";\n gl[gl["NOTEQUAL"] = 517] = "NOTEQUAL";\n gl[gl["GEQUAL"] = 518] = "GEQUAL";\n gl[gl["ALWAYS"] = 519] = "ALWAYS";\n gl[gl["KEEP"] = 7680] = "KEEP";\n gl[gl["REPLACE"] = 7681] = "REPLACE";\n gl[gl["INCR"] = 7682] = "INCR";\n gl[gl["DECR"] = 7683] = "DECR";\n gl[gl["INVERT"] = 5386] = "INVERT";\n gl[gl["INCR_WRAP"] = 34055] = "INCR_WRAP";\n gl[gl["DECR_WRAP"] = 34056] = "DECR_WRAP";\n gl[gl["VENDOR"] = 7936] = "VENDOR";\n gl[gl["RENDERER"] = 7937] = "RENDERER";\n gl[gl["VERSION"] = 7938] = "VERSION";\n gl[gl["NEAREST"] = 9728] = "NEAREST";\n gl[gl["LINEAR"] = 9729] = "LINEAR";\n gl[gl["NEAREST_MIPMAP_NEAREST"] = 9984] = "NEAREST_MIPMAP_NEAREST";\n gl[gl["LINEAR_MIPMAP_NEAREST"] = 9985] = "LINEAR_MIPMAP_NEAREST";\n gl[gl["NEAREST_MIPMAP_LINEAR"] = 9986] = "NEAREST_MIPMAP_LINEAR";\n gl[gl["LINEAR_MIPMAP_LINEAR"] = 9987] = "LINEAR_MIPMAP_LINEAR";\n gl[gl["TEXTURE_MAG_FILTER"] = 10240] = "TEXTURE_MAG_FILTER";\n gl[gl["TEXTURE_MIN_FILTER"] = 10241] = "TEXTURE_MIN_FILTER";\n gl[gl["TEXTURE_WRAP_S"] = 10242] = "TEXTURE_WRAP_S";\n gl[gl["TEXTURE_WRAP_T"] = 10243] = "TEXTURE_WRAP_T";\n gl[gl["TEXTURE_2D"] = 3553] = "TEXTURE_2D";\n gl[gl["TEXTURE"] = 5890] = "TEXTURE";\n gl[gl["TEXTURE_CUBE_MAP"] = 34067] = "TEXTURE_CUBE_MAP";\n gl[gl["TEXTURE_BINDING_CUBE_MAP"] = 34068] = "TEXTURE_BINDING_CUBE_MAP";\n gl[gl["TEXTURE_CUBE_MAP_POSITIVE_X"] = 34069] = "TEXTURE_CUBE_MAP_POSITIVE_X";\n gl[gl["TEXTURE_CUBE_MAP_NEGATIVE_X"] = 34070] = "TEXTURE_CUBE_MAP_NEGATIVE_X";\n gl[gl["TEXTURE_CUBE_MAP_POSITIVE_Y"] = 34071] = "TEXTURE_CUBE_MAP_POSITIVE_Y";\n gl[gl["TEXTURE_CUBE_MAP_NEGATIVE_Y"] = 34072] = "TEXTURE_CUBE_MAP_NEGATIVE_Y";\n gl[gl["TEXTURE_CUBE_MAP_POSITIVE_Z"] = 34073] = "TEXTURE_CUBE_MAP_POSITIVE_Z";\n gl[gl["TEXTURE_CUBE_MAP_NEGATIVE_Z"] = 34074] = "TEXTURE_CUBE_MAP_NEGATIVE_Z";\n gl[gl["MAX_CUBE_MAP_TEXTURE_SIZE"] = 34076] = "MAX_CUBE_MAP_TEXTURE_SIZE";\n gl[gl["TEXTURE0"] = 33984] = "TEXTURE0";\n gl[gl["TEXTURE1"] = 33985] = "TEXTURE1";\n gl[gl["TEXTURE2"] = 33986] = "TEXTURE2";\n gl[gl["TEXTURE3"] = 33987] = "TEXTURE3";\n gl[gl["TEXTURE4"] = 33988] = "TEXTURE4";\n gl[gl["TEXTURE5"] = 33989] = "TEXTURE5";\n gl[gl["TEXTURE6"] = 33990] = "TEXTURE6";\n gl[gl["TEXTURE7"] = 33991] = "TEXTURE7";\n gl[gl["TEXTURE8"] = 33992] = "TEXTURE8";\n gl[gl["TEXTURE9"] = 33993] = "TEXTURE9";\n gl[gl["TEXTURE10"] = 33994] = "TEXTURE10";\n gl[gl["TEXTURE11"] = 33995] = "TEXTURE11";\n gl[gl["TEXTURE12"] = 33996] = "TEXTURE12";\n gl[gl["TEXTURE13"] = 33997] = "TEXTURE13";\n gl[gl["TEXTURE14"] = 33998] = "TEXTURE14";\n gl[gl["TEXTURE15"] = 33999] = "TEXTURE15";\n gl[gl["TEXTURE16"] = 34000] = "TEXTURE16";\n gl[gl["TEXTURE17"] = 34001] = "TEXTURE17";\n gl[gl["TEXTURE18"] = 34002] = "TEXTURE18";\n gl[gl["TEXTURE19"] = 34003] = "TEXTURE19";\n gl[gl["TEXTURE20"] = 34004] = "TEXTURE20";\n gl[gl["TEXTURE21"] = 34005] = "TEXTURE21";\n gl[gl["TEXTURE22"] = 34006] = "TEXTURE22";\n gl[gl["TEXTURE23"] = 34007] = "TEXTURE23";\n gl[gl["TEXTURE24"] = 34008] = "TEXTURE24";\n gl[gl["TEXTURE25"] = 34009] = "TEXTURE25";\n gl[gl["TEXTURE26"] = 34010] = "TEXTURE26";\n gl[gl["TEXTURE27"] = 34011] = "TEXTURE27";\n gl[gl["TEXTURE28"] = 34012] = "TEXTURE28";\n gl[gl["TEXTURE29"] = 34013] = "TEXTURE29";\n gl[gl["TEXTURE30"] = 34014] = "TEXTURE30";\n gl[gl["TEXTURE31"] = 34015] = "TEXTURE31";\n gl[gl["ACTIVE_TEXTURE"] = 34016] = "ACTIVE_TEXTURE";\n gl[gl["REPEAT"] = 10497] = "REPEAT";\n gl[gl["CLAMP_TO_EDGE"] = 33071] = "CLAMP_TO_EDGE";\n gl[gl["MIRRORED_REPEAT"] = 33648] = "MIRRORED_REPEAT";\n gl[gl["FLOAT_VEC2"] = 35664] = "FLOAT_VEC2";\n gl[gl["FLOAT_VEC3"] = 35665] = "FLOAT_VEC3";\n gl[gl["FLOAT_VEC4"] = 35666] = "FLOAT_VEC4";\n gl[gl["INT_VEC2"] = 35667] = "INT_VEC2";\n gl[gl["INT_VEC3"] = 35668] = "INT_VEC3";\n gl[gl["INT_VEC4"] = 35669] = "INT_VEC4";\n gl[gl["BOOL"] = 35670] = "BOOL";\n gl[gl["BOOL_VEC2"] = 35671] = "BOOL_VEC2";\n gl[gl["BOOL_VEC3"] = 35672] = "BOOL_VEC3";\n gl[gl["BOOL_VEC4"] = 35673] = "BOOL_VEC4";\n gl[gl["FLOAT_MAT2"] = 35674] = "FLOAT_MAT2";\n gl[gl["FLOAT_MAT3"] = 35675] = "FLOAT_MAT3";\n gl[gl["FLOAT_MAT4"] = 35676] = "FLOAT_MAT4";\n gl[gl["SAMPLER_2D"] = 35678] = "SAMPLER_2D";\n gl[gl["SAMPLER_CUBE"] = 35680] = "SAMPLER_CUBE";\n gl[gl["VERTEX_ATTRIB_ARRAY_ENABLED"] = 34338] = "VERTEX_ATTRIB_ARRAY_ENABLED";\n gl[gl["VERTEX_ATTRIB_ARRAY_SIZE"] = 34339] = "VERTEX_ATTRIB_ARRAY_SIZE";\n gl[gl["VERTEX_ATTRIB_ARRAY_STRIDE"] = 34340] = "VERTEX_ATTRIB_ARRAY_STRIDE";\n gl[gl["VERTEX_ATTRIB_ARRAY_TYPE"] = 34341] = "VERTEX_ATTRIB_ARRAY_TYPE";\n gl[gl["VERTEX_ATTRIB_ARRAY_NORMALIZED"] = 34922] = "VERTEX_ATTRIB_ARRAY_NORMALIZED";\n gl[gl["VERTEX_ATTRIB_ARRAY_POINTER"] = 34373] = "VERTEX_ATTRIB_ARRAY_POINTER";\n gl[gl["VERTEX_ATTRIB_ARRAY_BUFFER_BINDING"] = 34975] = "VERTEX_ATTRIB_ARRAY_BUFFER_BINDING";\n gl[gl["COMPILE_STATUS"] = 35713] = "COMPILE_STATUS";\n gl[gl["LOW_FLOAT"] = 36336] = "LOW_FLOAT";\n gl[gl["MEDIUM_FLOAT"] = 36337] = "MEDIUM_FLOAT";\n gl[gl["HIGH_FLOAT"] = 36338] = "HIGH_FLOAT";\n gl[gl["LOW_INT"] = 36339] = "LOW_INT";\n gl[gl["MEDIUM_INT"] = 36340] = "MEDIUM_INT";\n gl[gl["HIGH_INT"] = 36341] = "HIGH_INT";\n gl[gl["FRAMEBUFFER"] = 36160] = "FRAMEBUFFER";\n gl[gl["RENDERBUFFER"] = 36161] = "RENDERBUFFER";\n gl[gl["RGBA4"] = 32854] = "RGBA4";\n gl[gl["RGB5_A1"] = 32855] = "RGB5_A1";\n gl[gl["RGB565"] = 36194] = "RGB565";\n gl[gl["DEPTH_COMPONENT16"] = 33189] = "DEPTH_COMPONENT16";\n gl[gl["STENCIL_INDEX"] = 6401] = "STENCIL_INDEX";\n gl[gl["STENCIL_INDEX8"] = 36168] = "STENCIL_INDEX8";\n gl[gl["DEPTH_STENCIL"] = 34041] = "DEPTH_STENCIL";\n gl[gl["RENDERBUFFER_WIDTH"] = 36162] = "RENDERBUFFER_WIDTH";\n gl[gl["RENDERBUFFER_HEIGHT"] = 36163] = "RENDERBUFFER_HEIGHT";\n gl[gl["RENDERBUFFER_INTERNAL_FORMAT"] = 36164] = "RENDERBUFFER_INTERNAL_FORMAT";\n gl[gl["RENDERBUFFER_RED_SIZE"] = 36176] = "RENDERBUFFER_RED_SIZE";\n gl[gl["RENDERBUFFER_GREEN_SIZE"] = 36177] = "RENDERBUFFER_GREEN_SIZE";\n gl[gl["RENDERBUFFER_BLUE_SIZE"] = 36178] = "RENDERBUFFER_BLUE_SIZE";\n gl[gl["RENDERBUFFER_ALPHA_SIZE"] = 36179] = "RENDERBUFFER_ALPHA_SIZE";\n gl[gl["RENDERBUFFER_DEPTH_SIZE"] = 36180] = "RENDERBUFFER_DEPTH_SIZE";\n gl[gl["RENDERBUFFER_STENCIL_SIZE"] = 36181] = "RENDERBUFFER_STENCIL_SIZE";\n gl[gl["FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE"] = 36048] = "FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE";\n gl[gl["FRAMEBUFFER_ATTACHMENT_OBJECT_NAME"] = 36049] = "FRAMEBUFFER_ATTACHMENT_OBJECT_NAME";\n gl[gl["FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL"] = 36050] = "FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL";\n gl[gl["FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE"] = 36051] = "FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE";\n gl[gl["COLOR_ATTACHMENT0"] = 36064] = "COLOR_ATTACHMENT0";\n gl[gl["DEPTH_ATTACHMENT"] = 36096] = "DEPTH_ATTACHMENT";\n gl[gl["STENCIL_ATTACHMENT"] = 36128] = "STENCIL_ATTACHMENT";\n gl[gl["DEPTH_STENCIL_ATTACHMENT"] = 33306] = "DEPTH_STENCIL_ATTACHMENT";\n gl[gl["NONE"] = 0] = "NONE";\n gl[gl["FRAMEBUFFER_COMPLETE"] = 36053] = "FRAMEBUFFER_COMPLETE";\n gl[gl["FRAMEBUFFER_INCOMPLETE_ATTACHMENT"] = 36054] = "FRAMEBUFFER_INCOMPLETE_ATTACHMENT";\n gl[gl["FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT"] = 36055] = "FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT";\n gl[gl["FRAMEBUFFER_INCOMPLETE_DIMENSIONS"] = 36057] = "FRAMEBUFFER_INCOMPLETE_DIMENSIONS";\n gl[gl["FRAMEBUFFER_UNSUPPORTED"] = 36061] = "FRAMEBUFFER_UNSUPPORTED";\n gl[gl["FRAMEBUFFER_BINDING"] = 36006] = "FRAMEBUFFER_BINDING";\n gl[gl["RENDERBUFFER_BINDING"] = 36007] = "RENDERBUFFER_BINDING";\n gl[gl["MAX_RENDERBUFFER_SIZE"] = 34024] = "MAX_RENDERBUFFER_SIZE";\n gl[gl["INVALID_FRAMEBUFFER_OPERATION"] = 1286] = "INVALID_FRAMEBUFFER_OPERATION";\n gl[gl["UNPACK_FLIP_Y_WEBGL"] = 37440] = "UNPACK_FLIP_Y_WEBGL";\n gl[gl["UNPACK_PREMULTIPLY_ALPHA_WEBGL"] = 37441] = "UNPACK_PREMULTIPLY_ALPHA_WEBGL";\n gl[gl["CONTEXT_LOST_WEBGL"] = 37442] = "CONTEXT_LOST_WEBGL";\n gl[gl["UNPACK_COLORSPACE_CONVERSION_WEBGL"] = 37443] = "UNPACK_COLORSPACE_CONVERSION_WEBGL";\n gl[gl["BROWSER_DEFAULT_WEBGL"] = 37444] = "BROWSER_DEFAULT_WEBGL";\n gl[gl["COPY_SRC"] = 1] = "COPY_SRC";\n gl[gl["COPY_DST"] = 2] = "COPY_DST";\n gl[gl["SAMPLED"] = 4] = "SAMPLED";\n gl[gl["STORAGE"] = 8] = "STORAGE";\n gl[gl["RENDER_ATTACHMENT"] = 16] = "RENDER_ATTACHMENT";\n})(gl || (gl = {}));\n//# sourceMappingURL=gl.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy13ZWJncHUtY29yZS9lcy9jb21wb25lbnRzL3JlbmRlcmVyL2dsLmpzPzkzYWMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087O0FBRVA7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxnQkFBZ0I7QUFDakIiLCJmaWxlIjoiMzUuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFdlYkdMIOaemuS4vuWAvFxuICogQHNlZSBodHRwOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3dlYmdsL3NwZWNzL2xhdGVzdC8xLjAvIzUuMTRcbiAqIOS9v+eUqCBiYWJlbCDmj5Lku7blr7nluLjph4/ov5vooYzlhoXogZTvvIzku6Xlh4/lsJHmnIDnu4jmiZPljIXkuqfnianlpKflsI9cbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3ViZXIvZGVjay5nbC9ibG9iLzcuMS1yZWxlYXNlL2Rldi1kb2NzL3JvYWRtYXBzL2Rpc3Qtc2l6ZS1yb2FkbWFwLm1kI2lubGluZS1nbC1jb25zdGFudHNcbiAqIOS4uuS6huaUr+aMgSBXZWJHUFXvvIzmlrDlop4gVGV4dHVyZVVzYWdlXG4gKiBAc2VlIGh0dHBzOi8vZ3B1d2ViLmdpdGh1Yi5pby9ncHV3ZWIvI2dwdXRleHR1cmV1c2FnZVxuICovXG5leHBvcnQgdmFyIGdsO1xuXG4oZnVuY3Rpb24gKGdsKSB7XG4gIGdsW2dsW1wiREVQVEhfQlVGRkVSX0JJVFwiXSA9IDI1Nl0gPSBcIkRFUFRIX0JVRkZFUl9CSVRcIjtcbiAgZ2xbZ2xbXCJTVEVOQ0lMX0JVRkZFUl9CSVRcIl0gPSAxMDI0XSA9IFwiU1RFTkNJTF9CVUZGRVJfQklUXCI7XG4gIGdsW2dsW1wiQ09MT1JfQlVGRkVSX0JJVFwiXSA9IDE2Mzg0XSA9IFwiQ09MT1JfQlVGRkVSX0JJVFwiO1xuICBnbFtnbFtcIlBPSU5UU1wiXSA9IDBdID0gXCJQT0lOVFNcIjtcbiAgZ2xbZ2xbXCJMSU5FU1wiXSA9IDFdID0gXCJMSU5FU1wiO1xuICBnbFtnbFtcIkxJTkVfTE9PUFwiXSA9IDJdID0gXCJMSU5FX0xPT1BcIjtcbiAgZ2xbZ2xbXCJMSU5FX1NUUklQXCJdID0gM10gPSBcIkxJTkVfU1RSSVBcIjtcbiAgZ2xbZ2xbXCJUUklBTkdMRVNcIl0gPSA0XSA9IFwiVFJJQU5HTEVTXCI7XG4gIGdsW2dsW1wiVFJJQU5HTEVfU1RSSVBcIl0gPSA1XSA9IFwiVFJJQU5HTEVfU1RSSVBcIjtcbiAgZ2xbZ2xbXCJUUklBTkdMRV9GQU5cIl0gPSA2XSA9IFwiVFJJQU5HTEVfRkFOXCI7XG4gIGdsW2dsW1wiWkVST1wiXSA9IDBdID0gXCJaRVJPXCI7XG4gIGdsW2dsW1wiT05FXCJdID0gMV0gPSBcIk9ORVwiO1xuICBnbFtnbFtcIlNSQ19DT0xPUlwiXSA9IDc2OF0gPSBcIlNSQ19DT0xPUlwiO1xuICBnbFtnbFtcIk9ORV9NSU5VU19TUkNfQ09MT1JcIl0gPSA3NjldID0gXCJPTkVfTUlOVVNfU1JDX0NPTE9SXCI7XG4gIGdsW2dsW1wiU1JDX0FMUEhBXCJdID0gNzcwXSA9IFwiU1JDX0FMUEhBXCI7XG4gIGdsW2dsW1wiT05FX01JTlVTX1NSQ19BTFBIQVwiXSA9IDc3MV0gPSBcIk9ORV9NSU5VU19TUkNfQUxQSEFcIjtcbiAgZ2xbZ2xbXCJEU1RfQUxQSEFcIl0gPSA3NzJdID0gXCJEU1RfQUxQSEFcIjtcbiAgZ2xbZ2xbXCJPTkVfTUlOVVNfRFNUX0FMUEhBXCJdID0gNzczXSA9IFwiT05FX01JTlVTX0RTVF9BTFBIQVwiO1xuICBnbFtnbFtcIkRTVF9DT0xPUlwiXSA9IDc3NF0gPSBcIkRTVF9DT0xPUlwiO1xuICBnbFtnbFtcIk9ORV9NSU5VU19EU1RfQ09MT1JcIl0gPSA3NzVdID0gXCJPTkVfTUlOVVNfRFNUX0NPTE9SXCI7XG4gIGdsW2dsW1wiU1JDX0FMUEhBX1NBVFVSQVRFXCJdID0gNzc2XSA9IFwiU1JDX0FMUEhBX1NBVFVSQVRFXCI7XG4gIGdsW2dsW1wiRlVOQ19BRERcIl0gPSAzMjc3NF0gPSBcIkZVTkNfQUREXCI7XG4gIGdsW2dsW1wiQkxFTkRfRVFVQVRJT05cIl0gPSAzMjc3N10gPSBcIkJMRU5EX0VRVUFUSU9OXCI7XG4gIGdsW2dsW1wiQkxFTkRfRVFVQVRJT05fUkdCXCJdID0gMzI3NzddID0gXCJCTEVORF9FUVVBVElPTl9SR0JcIjtcbiAgZ2xbZ2xbXCJCTEVORF9FUVVBVElPTl9BTFBIQVwiXSA9IDM0ODc3XSA9IFwiQkxFTkRfRVFVQVRJT05fQUxQSEFcIjtcbiAgZ2xbZ2xbXCJGVU5DX1NVQlRSQUNUXCJdID0gMzI3NzhdID0gXCJGVU5DX1NVQlRSQUNUXCI7XG4gIGdsW2dsW1wiRlVOQ19SRVZFUlNFX1NVQlRSQUNUXCJdID0gMzI3NzldID0gXCJGVU5DX1JFVkVSU0VfU1VCVFJBQ1RcIjtcbiAgZ2xbZ2xbXCJNQVhfRVhUXCJdID0gMzI3NzZdID0gXCJNQVhfRVhUXCI7XG4gIGdsW2dsW1wiTUlOX0VYVFwiXSA9IDMyNzc1XSA9IFwiTUlOX0VYVFwiO1xuICBnbFtnbFtcIkJMRU5EX0RTVF9SR0JcIl0gPSAzMjk2OF0gPSBcIkJMRU5EX0RTVF9SR0JcIjtcbiAgZ2xbZ2xbXCJCTEVORF9TUkNfUkdCXCJdID0gMzI5NjldID0gXCJCTEVORF9TUkNfUkdCXCI7XG4gIGdsW2dsW1wiQkxFTkRfRFNUX0FMUEhBXCJdID0gMzI5NzBdID0gXCJCTEVORF9EU1RfQUxQSEFcIjtcbiAgZ2xbZ2xbXCJCTEVORF9TUkNfQUxQSEFcIl0gPSAzMjk3MV0gPSBcIkJMRU5EX1NSQ19BTFBIQVwiO1xuICBnbFtnbFtcIkNPTlNUQU5UX0NPTE9SXCJdID0gMzI3NjldID0gXCJDT05TVEFOVF9DT0xPUlwiO1xuICBnbFtnbFtcIk9ORV9NSU5VU19DT05TVEFOVF9DT0xPUlwiXSA9IDMyNzcwXSA9IFwiT05FX01JTlVTX0NPTlNUQU5UX0NPTE9SXCI7XG4gIGdsW2dsW1wiQ09OU1RBTlRfQUxQSEFcIl0gPSAzMjc3MV0gPSBcIkNPTlNUQU5UX0FMUEhBXCI7XG4gIGdsW2dsW1wiT05FX01JTlVTX0NPTlNUQU5UX0FMUEhBXCJdID0gMzI3NzJdID0gXCJPTkVfTUlOVVNfQ09OU1RBTlRfQUxQSEFcIjtcbiAgZ2xbZ2xbXCJCTEVORF9DT0xPUlwiXSA9IDMyNzczXSA9IFwiQkxFTkRfQ09MT1JcIjtcbiAgZ2xbZ2xbXCJBUlJBWV9CVUZGRVJcIl0gPSAzNDk2Ml0gPSBcIkFSUkFZX0JVRkZFUlwiO1xuICBnbFtnbFtcIkVMRU1FTlRfQVJSQVlfQlVGRkVSXCJdID0gMzQ5NjNdID0gXCJFTEVNRU5UX0FSUkFZX0JVRkZFUlwiO1xuICBnbFtnbFtcIkFSUkFZX0JVRkZFUl9CSU5ESU5HXCJdID0gMzQ5NjRdID0gXCJBUlJBWV9CVUZGRVJfQklORElOR1wiO1xuICBnbFtnbFtcIkVMRU1FTlRfQVJSQVlfQlVGRkVSX0JJTkRJTkdcIl0gPSAzNDk2NV0gPSBcIkVMRU1FTlRfQVJSQVlfQlVGRkVSX0JJTkRJTkdcIjtcbiAgZ2xbZ2xbXCJTVFJFQU1fRFJBV1wiXSA9IDM1MDQwXSA9IFwiU1RSRUFNX0RSQVdcIjtcbiAgZ2xbZ2xbXCJTVEFUSUNfRFJBV1wiXSA9IDM1MDQ0XSA9IFwiU1RBVElDX0RSQVdcIjtcbiAgZ2xbZ2xbXCJEWU5BTUlDX0RSQVdcIl0gPSAzNTA0OF0gPSBcIkRZTkFNSUNfRFJBV1wiO1xuICBnbFtnbFtcIkJVRkZFUl9TSVpFXCJdID0gMzQ2NjBdID0gXCJCVUZGRVJfU0laRVwiO1xuICBnbFtnbFtcIkJVRkZFUl9VU0FHRVwiXSA9IDM0NjYxXSA9IFwiQlVGRkVSX1VTQUdFXCI7XG4gIGdsW2dsW1wiQ1VSUkVOVF9WRVJURVhfQVRUUklCXCJdID0gMzQzNDJdID0gXCJDVVJSRU5UX1ZFUlRFWF9BVFRSSUJcIjtcbiAgZ2xbZ2xbXCJGUk9OVFwiXSA9IDEwMjhdID0gXCJGUk9OVFwiO1xuICBnbFtnbFtcIkJBQ0tcIl0gPSAxMDI5XSA9IFwiQkFDS1wiO1xuICBnbFtnbFtcIkZST05UX0FORF9CQUNLXCJdID0gMTAzMl0gPSBcIkZST05UX0FORF9CQUNLXCI7XG4gIGdsW2dsW1wiQ1VMTF9GQUNFXCJdID0gMjg4NF0gPSBcIkNVTExfRkFDRVwiO1xuICBnbFtnbFtcIkJMRU5EXCJdID0gMzA0Ml0gPSBcIkJMRU5EXCI7XG4gIGdsW2dsW1wiRElUSEVSXCJdID0gMzAyNF0gPSBcIkRJVEhFUlwiO1xuICBnbFtnbFtcIlNURU5DSUxfVEVTVFwiXSA9IDI5NjBdID0gXCJTVEVOQ0lMX1RFU1RcIjtcbiAgZ2xbZ2xbXCJERVBUSF9URVNUXCJdID0gMjkyOV0gPSBcIkRFUFRIX1RFU1RcIjtcbiAgZ2xbZ2xbXCJTQ0lTU09SX1RFU1RcIl0gPSAzMDg5XSA9IFwiU0NJU1NPUl9URVNUXCI7XG4gIGdsW2dsW1wiUE9MWUdPTl9PRkZTRVRfRklMTFwiXSA9IDMyODIzXSA9IFwiUE9MWUdPTl9PRkZTRVRfRklMTFwiO1xuICBnbFtnbFtcIlNBTVBMRV9BTFBIQV9UT19DT1ZFUkFHRVwiXSA9IDMyOTI2XSA9IFwiU0FNUExFX0FMUEhBX1RPX0NPVkVSQUdFXCI7XG4gIGdsW2dsW1wiU0FNUExFX0NPVkVSQUdFXCJdID0gMzI5MjhdID0gXCJTQU1QTEVfQ09WRVJBR0VcIjtcbiAgZ2xbZ2xbXCJOT19FUlJPUlwiXSA9IDBdID0gXCJOT19FUlJPUlwiO1xuICBnbFtnbFtcIklOVkFMSURfRU5VTVwiXSA9IDEyODBdID0gXCJJTlZBTElEX0VOVU1cIjtcbiAgZ2xbZ2xbXCJJTlZBTElEX1ZBTFVFXCJdID0gMTI4MV0gPSBcIklOVkFMSURfVkFMVUVcIjtcbiAgZ2xbZ2xbXCJJTlZBTElEX09QRVJBVElPTlwiXSA9IDEyODJdID0gXCJJTlZBTElEX09QRVJBVElPTlwiO1xuICBnbFtnbFtcIk9VVF9PRl9NRU1PUllcIl0gPSAxMjg1XSA9IFwiT1VUX09GX01FTU9SWVwiO1xuICBnbFtnbFtcIkNXXCJdID0gMjMwNF0gPSBcIkNXXCI7XG4gIGdsW2dsW1wiQ0NXXCJdID0gMjMwNV0gPSBcIkNDV1wiO1xuICBnbFtnbFtcIkxJTkVfV0lEVEhcIl0gPSAyODQ5XSA9IFwiTElORV9XSURUSFwiO1xuICBnbFtnbFtcIkFMSUFTRURfUE9JTlRfU0laRV9SQU5HRVwiXSA9IDMzOTAxXSA9IFwiQUxJQVNFRF9QT0lOVF9TSVpFX1JBTkdFXCI7XG4gIGdsW2dsW1wiQUxJQVNFRF9MSU5FX1dJRFRIX1JBTkdFXCJdID0gMzM5MDJdID0gXCJBTElBU0VEX0xJTkVfV0lEVEhfUkFOR0VcIjtcbiAgZ2xbZ2xbXCJDVUxMX0ZBQ0VfTU9ERVwiXSA9IDI4ODVdID0gXCJDVUxMX0ZBQ0VfTU9ERVwiO1xuICBnbFtnbFtcIkZST05UX0ZBQ0VcIl0gPSAyODg2XSA9IFwiRlJPTlRfRkFDRVwiO1xuICBnbFtnbFtcIkRFUFRIX1JBTkdFXCJdID0gMjkyOF0gPSBcIkRFUFRIX1JBTkdFXCI7XG4gIGdsW2dsW1wiREVQVEhfV1JJVEVNQVNLXCJdID0gMjkzMF0gPSBcIkRFUFRIX1dSSVRFTUFTS1wiO1xuICBnbFtnbFtcIkRFUFRIX0NMRUFSX1ZBTFVFXCJdID0gMjkzMV0gPSBcIkRFUFRIX0NMRUFSX1ZBTFVFXCI7XG4gIGdsW2dsW1wiREVQVEhfRlVOQ1wiXSA9IDI5MzJdID0gXCJERVBUSF9GVU5DXCI7XG4gIGdsW2dsW1wiU1RFTkNJTF9DTEVBUl9WQUxVRVwiXSA9IDI5NjFdID0gXCJTVEVOQ0lMX0NMRUFSX1ZBTFVFXCI7XG4gIGdsW2dsW1wiU1RFTkNJTF9GVU5DXCJdID0gMjk2Ml0gPSBcIlNURU5DSUxfRlVOQ1wiO1xuICBnbFtnbFtcIlNURU5DSUxfRkFJTFwiXSA9IDI5NjRdID0gXCJTVEVOQ0lMX0ZBSUxcIjtcbiAgZ2xbZ2xbXCJTVEVOQ0lMX1BBU1NfREVQVEhfRkFJTFwiXSA9IDI5NjVdID0gXCJTVEVOQ0lMX1BBU1NfREVQVEhfRkFJTFwiO1xuICBnbFtnbFtcIlNURU5DSUxfUEFTU19ERVBUSF9QQVNTXCJdID0gMjk2Nl0gPSBcIlNURU5DSUxfUEFTU19ERVBUSF9QQVNTXCI7XG4gIGdsW2dsW1wiU1RFTkNJTF9SRUZcIl0gPSAyOTY3XSA9IFwiU1RFTkNJTF9SRUZcIjtcbiAgZ2xbZ2xbXCJTVEVOQ0lMX1ZBTFVFX01BU0tcIl0gPSAyOTYzXSA9IFwiU1RFTkNJTF9WQUxVRV9NQVNLXCI7XG4gIGdsW2dsW1wiU1RFTkNJTF9XUklURU1BU0tcIl0gPSAyOTY4XSA9IFwiU1RFTkNJTF9XUklURU1BU0tcIjtcbiAgZ2xbZ2xbXCJTVEVOQ0lMX0JBQ0tfRlVOQ1wiXSA9IDM0ODE2XSA9IFwiU1RFTkNJTF9CQUNLX0ZVTkNcIjtcbiAgZ2xbZ2xbXCJTVEVOQ0lMX0JBQ0tfRkFJTFwiXSA9IDM0ODE3XSA9IFwiU1RFTkNJTF9CQUNLX0ZBSUxcIjtcbiAgZ2xbZ2xbXCJTVEVOQ0lMX0JBQ0tfUEFTU19ERVBUSF9GQUlMXCJdID0gMzQ4MThdID0gXCJTVEVOQ0lMX0JBQ0tfUEFTU19ERVBUSF9GQUlMXCI7XG4gIGdsW2dsW1wiU1RFTkNJTF9CQUNLX1BBU1NfREVQVEhfUEFTU1wiXSA9IDM0ODE5XSA9IFwiU1RFTkNJTF9CQUNLX1BBU1NfREVQVEhfUEFTU1wiO1xuICBnbFtnbFtcIlNURU5DSUxfQkFDS19SRUZcIl0gPSAzNjAwM10gPSBcIlNURU5DSUxfQkFDS19SRUZcIjtcbiAgZ2xbZ2xbXCJTVEVOQ0lMX0JBQ0tfVkFMVUVfTUFTS1wiXSA9IDM2MDA0XSA9IFwiU1RFTkNJTF9CQUNLX1ZBTFVFX01BU0tcIjtcbiAgZ2xbZ2xbXCJTVEVOQ0lMX0JBQ0tfV1JJVEVNQVNLXCJdID0gMzYwMDVdID0gXCJTVEVOQ0lMX0JBQ0tfV1JJVEVNQVNLXCI7XG4gIGdsW2dsW1wiVklFV1BPUlRcIl0gPSAyOTc4XSA9IFwiVklFV1BPUlRcIjtcbiAgZ2xbZ2xbXCJTQ0lTU09SX0JPWFwiXSA9IDMwODhdID0gXCJTQ0lTU09SX0JPWFwiO1xuICBnbFtnbFtcIkNPTE9SX0NMRUFSX1ZBTFVFXCJdID0gMzEwNl0gPSBcIkNPTE9SX0NMRUFSX1ZBTFVFXCI7XG4gIGdsW2dsW1wiQ09MT1JfV1JJVEVNQVNLXCJdID0gMzEwN10gPSBcIkNPTE9SX1dSSVRFTUFTS1wiO1xuICBnbFtnbFtcIlVOUEFDS19BTElHTk1FTlRcIl0gPSAzMzE3XSA9IFwiVU5QQUNLX0FMSUdOTUVOVFwiO1xuICBnbFtnbFtcIlBBQ0tfQUxJR05NRU5UXCJdID0gMzMzM10gPSBcIlBBQ0tfQUxJR05NRU5UXCI7XG4gIGdsW2dsW1wiTUFYX1RFWFRVUkVfU0laRVwiXSA9IDMzNzldID0gXCJNQVhfVEVYVFVSRV9TSVpFXCI7XG4gIGdsW2dsW1wiTUFYX1ZJRVdQT1JUX0RJTVNcIl0gPSAzMzg2XSA9IFwiTUFYX1ZJRVdQT1JUX0RJTVNcIjtcbiAgZ2xbZ2xbXCJTVUJQSVhFTF9CSVRTXCJdID0gMzQwOF0gPSBcIlNVQlBJWEVMX0JJVFNcIjtcbiAgZ2xbZ2xbXCJSRURfQklUU1wiXSA9IDM0MTBdID0gXCJSRURfQklUU1wiO1xuICBnbFtnbFtcIkdSRUVOX0JJVFNcIl0gPSAzNDExXSA9IFwiR1JFRU5fQklUU1wiO1xuICBnbFtnbFtcIkJMVUVfQklUU1wiXSA9IDM0MTJdID0gXCJCTFVFX0JJVFNcIjtcbiAgZ2xbZ2xbXCJBTFBIQV9CSVRTXCJdID0gMzQxM10gPSBcIkFMUEhBX0JJVFNcIjtcbiAgZ2xbZ2xbXCJERVBUSF9CSVRTXCJdID0gMzQxNF0gPSBcIkRFUFRIX0JJVFNcIjtcbiAgZ2xbZ2xbXCJTVEVOQ0lMX0JJVFNcIl0gPSAzNDE1XSA9IFwiU1RFTkNJTF9CSVRTXCI7XG4gIGdsW2dsW1wiUE9MWUdPTl9PRkZTRVRfVU5JVFNcIl0gPSAxMDc1Ml0gPSBcIlBPTFlHT05fT0ZGU0VUX1VOSVRTXCI7XG4gIGdsW2dsW1wiUE9MWUdPTl9PRkZTRVRfRkFDVE9SXCJdID0gMzI4MjRdID0gXCJQT0xZR09OX09GRlNFVF9GQUNUT1JcIjtcbiAgZ2xbZ2xbXCJURVhUVVJFX0JJTkRJTkdfMkRcIl0gPSAzMjg3M10gPSBcIlRFWFRVUkVfQklORElOR18yRFwiO1xuICBnbFtnbFtcIlNBTVBMRV9CVUZGRVJTXCJdID0gMzI5MzZdID0gXCJTQU1QTEVfQlVGRkVSU1wiO1xuICBnbFtnbFtcIlNBTVBMRVNcIl0gPSAzMjkzN10gPSBcIlNBTVBMRVNcIjtcbiAgZ2xbZ2xbXCJTQU1QTEVfQ09WRVJBR0VfVkFMVUVcIl0gPSAzMjkzOF0gPSBcIlNBTVBMRV9DT1ZFUkFHRV9WQUxVRVwiO1xuICBnbFtnbFtcIlNBTVBMRV9DT1ZFUkFHRV9JTlZFUlRcIl0gPSAzMjkzOV0gPSBcIlNBTVBMRV9DT1ZFUkFHRV9JTlZFUlRcIjtcbiAgZ2xbZ2xbXCJDT01QUkVTU0VEX1RFWFRVUkVfRk9STUFUU1wiXSA9IDM0NDY3XSA9IFwiQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFNcIjtcbiAgZ2xbZ2xbXCJET05UX0NBUkVcIl0gPSA0MzUyXSA9IFwiRE9OVF9DQVJFXCI7XG4gIGdsW2dsW1wiRkFTVEVTVFwiXSA9IDQzNTNdID0gXCJGQVNURVNUXCI7XG4gIGdsW2dsW1wiTklDRVNUXCJdID0gNDM1NF0gPSBcIk5JQ0VTVFwiO1xuICBnbFtnbFtcIkdFTkVSQVRFX01JUE1BUF9ISU5UXCJdID0gMzMxNzBdID0gXCJHRU5FUkFURV9NSVBNQVBfSElOVFwiO1xuICBnbFtnbFtcIkJZVEVcIl0gPSA1MTIwXSA9IFwiQllURVwiO1xuICBnbFtnbFtcIlVOU0lHTkVEX0JZVEVcIl0gPSA1MTIxXSA9IFwiVU5TSUdORURfQllURVwiO1xuICBnbFtnbFtcIlNIT1JUXCJdID0gNTEyMl0gPSBcIlNIT1JUXCI7XG4gIGdsW2dsW1wiVU5TSUdORURfU0hPUlRcIl0gPSA1MTIzXSA9IFwiVU5TSUdORURfU0hPUlRcIjtcbiAgZ2xbZ2xbXCJJTlRcIl0gPSA1MTI0XSA9IFwiSU5UXCI7XG4gIGdsW2dsW1wiVU5TSUdORURfSU5UXCJdID0gNTEyNV0gPSBcIlVOU0lHTkVEX0lOVFwiO1xuICBnbFtnbFtcIkZMT0FUXCJdID0gNTEyNl0gPSBcIkZMT0FUXCI7XG4gIGdsW2dsW1wiREVQVEhfQ09NUE9ORU5UXCJdID0gNjQwMl0gPSBcIkRFUFRIX0NPTVBPTkVOVFwiO1xuICBnbFtnbFtcIkFMUEhBXCJdID0gNjQwNl0gPSBcIkFMUEhBXCI7XG4gIGdsW2dsW1wiUkdCXCJdID0gNjQwN10gPSBcIlJHQlwiO1xuICBnbFtnbFtcIlJHQkFcIl0gPSA2NDA4XSA9IFwiUkdCQVwiO1xuICBnbFtnbFtcIkxVTUlOQU5DRVwiXSA9IDY0MDldID0gXCJMVU1JTkFOQ0VcIjtcbiAgZ2xbZ2xbXCJMVU1JTkFOQ0VfQUxQSEFcIl0gPSA2NDEwXSA9IFwiTFVNSU5BTkNFX0FMUEhBXCI7XG4gIGdsW2dsW1wiVU5TSUdORURfU0hPUlRfNF80XzRfNFwiXSA9IDMyODE5XSA9IFwiVU5TSUdORURfU0hPUlRfNF80XzRfNFwiO1xuICBnbFtnbFtcIlVOU0lHTkVEX1NIT1JUXzVfNV81XzFcIl0gPSAzMjgyMF0gPSBcIlVOU0lHTkVEX1NIT1JUXzVfNV81XzFcIjtcbiAgZ2xbZ2xbXCJVTlNJR05FRF9TSE9SVF81XzZfNVwiXSA9IDMzNjM1XSA9IFwiVU5TSUdORURfU0hPUlRfNV82XzVcIjtcbiAgZ2xbZ2xbXCJGUkFHTUVOVF9TSEFERVJcIl0gPSAzNTYzMl0gPSBcIkZSQUdNRU5UX1NIQURFUlwiO1xuICBnbFtnbFtcIlZFUlRFWF9TSEFERVJcIl0gPSAzNTYzM10gPSBcIlZFUlRFWF9TSEFERVJcIjtcbiAgZ2xbZ2xbXCJNQVhfVkVSVEVYX0FUVFJJQlNcIl0gPSAzNDkyMV0gPSBcIk1BWF9WRVJURVhfQVRUUklCU1wiO1xuICBnbFtnbFtcIk1BWF9WRVJURVhfVU5JRk9STV9WRUNUT1JTXCJdID0gMzYzNDddID0gXCJNQVhfVkVSVEVYX1VOSUZPUk1fVkVDVE9SU1wiO1xuICBnbFtnbFtcIk1BWF9WQVJZSU5HX1ZFQ1RPUlNcIl0gPSAzNjM0OF0gPSBcIk1BWF9WQVJZSU5HX1ZFQ1RPUlNcIjtcbiAgZ2xbZ2xbXCJNQVhfQ09NQklORURfVEVYVFVSRV9JTUFHRV9VTklUU1wiXSA9IDM1NjYxXSA9IFwiTUFYX0NPTUJJTkVEX1RFWFRVUkVfSU1BR0VfVU5JVFNcIjtcbiAgZ2xbZ2xbXCJNQVhfVkVSVEVYX1RFWFRVUkVfSU1BR0VfVU5JVFNcIl0gPSAzNTY2MF0gPSBcIk1BWF9WRVJURVhfVEVYVFVSRV9JTUFHRV9VTklUU1wiO1xuICBnbFtnbFtcIk1BWF9URVhUVVJFX0lNQUdFX1VOSVRTXCJdID0gMzQ5MzBdID0gXCJNQVhfVEVYVFVSRV9JTUFHRV9VTklUU1wiO1xuICBnbFtnbFtcIk1BWF9GUkFHTUVOVF9VTklGT1JNX1ZFQ1RPUlNcIl0gPSAzNjM0OV0gPSBcIk1BWF9GUkFHTUVOVF9VTklGT1JNX1ZFQ1RPUlNcIjtcbiAgZ2xbZ2xbXCJTSEFERVJfVFlQRVwiXSA9IDM1NjYzXSA9IFwiU0hBREVSX1RZUEVcIjtcbiAgZ2xbZ2xbXCJERUxFVEVfU1RBVFVTXCJdID0gMzU3MTJdID0gXCJERUxFVEVfU1RBVFVTXCI7XG4gIGdsW2dsW1wiTElOS19TVEFUVVNcIl0gPSAzNTcxNF0gPSBcIkxJTktfU1RBVFVTXCI7XG4gIGdsW2dsW1wiVkFMSURBVEVfU1RBVFVTXCJdID0gMzU3MTVdID0gXCJWQUxJREFURV9TVEFUVVNcIjtcbiAgZ2xbZ2xbXCJBVFRBQ0hFRF9TSEFERVJTXCJdID0gMzU3MTddID0gXCJBVFRBQ0hFRF9TSEFERVJTXCI7XG4gIGdsW2dsW1wiQUNUSVZFX1VOSUZPUk1TXCJdID0gMzU3MThdID0gXCJBQ1RJVkVfVU5JRk9STVNcIjtcbiAgZ2xbZ2xbXCJBQ1RJVkVfQVRUUklCVVRFU1wiXSA9IDM1NzIxXSA9IFwiQUNUSVZFX0FUVFJJQlVURVNcIjtcbiAgZ2xbZ2xbXCJTSEFESU5HX0xBTkdVQUdFX1ZFUlNJT05cIl0gPSAzNTcyNF0gPSBcIlNIQURJTkdfTEFOR1VBR0VfVkVSU0lPTlwiO1xuICBnbFtnbFtcIkNVUlJFTlRfUFJPR1JBTVwiXSA9IDM1NzI1XSA9IFwiQ1VSUkVOVF9QUk9HUkFNXCI7XG4gIGdsW2dsW1wiTkVWRVJcIl0gPSA1MTJdID0gXCJORVZFUlwiO1xuICBnbFtnbFtcIkxFU1NcIl0gPSA1MTNdID0gXCJMRVNTXCI7XG4gIGdsW2dsW1wiRVFVQUxcIl0gPSA1MTRdID0gXCJFUVVBTFwiO1xuICBnbFtnbFtcIkxFUVVBTFwiXSA9IDUxNV0gPSBcIkxFUVVBTFwiO1xuICBnbFtnbFtcIkdSRUFURVJcIl0gPSA1MTZdID0gXCJHUkVBVEVSXCI7XG4gIGdsW2dsW1wiTk9URVFVQUxcIl0gPSA1MTddID0gXCJOT1RFUVVBTFwiO1xuICBnbFtnbFtcIkdFUVVBTFwiXSA9IDUxOF0gPSBcIkdFUVVBTFwiO1xuICBnbFtnbFtcIkFMV0FZU1wiXSA9IDUxOV0gPSBcIkFMV0FZU1wiO1xuICBnbFtnbFtcIktFRVBcIl0gPSA3NjgwXSA9IFwiS0VFUFwiO1xuICBnbFtnbFtcIlJFUExBQ0VcIl0gPSA3NjgxXSA9IFwiUkVQTEFDRVwiO1xuICBnbFtnbFtcIklOQ1JcIl0gPSA3NjgyXSA9IFwiSU5DUlwiO1xuICBnbFtnbFtcIkRFQ1JcIl0gPSA3NjgzXSA9IFwiREVDUlwiO1xuICBnbFtnbFtcIklOVkVSVFwiXSA9IDUzODZdID0gXCJJTlZFUlRcIjtcbiAgZ2xbZ2xbXCJJTkNSX1dSQVBcIl0gPSAzNDA1NV0gPSBcIklOQ1JfV1JBUFwiO1xuICBnbFtnbFtcIkRFQ1JfV1JBUFwiXSA9IDM0MDU2XSA9IFwiREVDUl9XUkFQXCI7XG4gIGdsW2dsW1wiVkVORE9SXCJdID0gNzkzNl0gPSBcIlZFTkRPUlwiO1xuICBnbFtnbFtcIlJFTkRFUkVSXCJdID0gNzkzN10gPSBcIlJFTkRFUkVSXCI7XG4gIGdsW2dsW1wiVkVSU0lPTlwiXSA9IDc5MzhdID0gXCJWRVJTSU9OXCI7XG4gIGdsW2dsW1wiTkVBUkVTVFwiXSA9IDk3MjhdID0gXCJORUFSRVNUXCI7XG4gIGdsW2dsW1wiTElORUFSXCJdID0gOTcyOV0gPSBcIkxJTkVBUlwiO1xuICBnbFtnbFtcIk5FQVJFU1RfTUlQTUFQX05FQVJFU1RcIl0gPSA5OTg0XSA9IFwiTkVBUkVTVF9NSVBNQVBfTkVBUkVTVFwiO1xuICBnbFtnbFtcIkxJTkVBUl9NSVBNQVBfTkVBUkVTVFwiXSA9IDk5ODVdID0gXCJMSU5FQVJfTUlQTUFQX05FQVJFU1RcIjtcbiAgZ2xbZ2xbXCJORUFSRVNUX01JUE1BUF9MSU5FQVJcIl0gPSA5OTg2XSA9IFwiTkVBUkVTVF9NSVBNQVBfTElORUFSXCI7XG4gIGdsW2dsW1wiTElORUFSX01JUE1BUF9MSU5FQVJcIl0gPSA5OTg3XSA9IFwiTElORUFSX01JUE1BUF9MSU5FQVJcIjtcbiAgZ2xbZ2xbXCJURVhUVVJFX01BR19GSUxURVJcIl0gPSAxMDI0MF0gPSBcIlRFWFRVUkVfTUFHX0ZJTFRFUlwiO1xuICBnbFtnbFtcIlRFWFRVUkVfTUlOX0ZJTFRFUlwiXSA9IDEwMjQxXSA9IFwiVEVYVFVSRV9NSU5fRklMVEVSXCI7XG4gIGdsW2dsW1wiVEVYVFVSRV9XUkFQX1NcIl0gPSAxMDI0Ml0gPSBcIlRFWFRVUkVfV1JBUF9TXCI7XG4gIGdsW2dsW1wiVEVYVFVSRV9XUkFQX1RcIl0gPSAxMDI0M10gPSBcIlRFWFRVUkVfV1JBUF9UXCI7XG4gIGdsW2dsW1wiVEVYVFVSRV8yRFwiXSA9IDM1NTNdID0gXCJURVhUVVJFXzJEXCI7XG4gIGdsW2dsW1wiVEVYVFVSRVwiXSA9IDU4OTBdID0gXCJURVhUVVJFXCI7XG4gIGdsW2dsW1wiVEVYVFVSRV9DVUJFX01BUFwiXSA9IDM0MDY3XSA9IFwiVEVYVFVSRV9DVUJFX01BUFwiO1xuICBnbFtnbFtcIlRFWFRVUkVfQklORElOR19DVUJFX01BUFwiXSA9IDM0MDY4XSA9IFwiVEVYVFVSRV9CSU5ESU5HX0NVQkVfTUFQXCI7XG4gIGdsW2dsW1wiVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YXCJdID0gMzQwNjldID0gXCJURVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1hcIjtcbiAgZ2xbZ2xbXCJURVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1hcIl0gPSAzNDA3MF0gPSBcIlRFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWFwiO1xuICBnbFtnbFtcIlRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWVwiXSA9IDM0MDcxXSA9IFwiVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9ZXCI7XG4gIGdsW2dsW1wiVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9ZXCJdID0gMzQwNzJdID0gXCJURVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1lcIjtcbiAgZ2xbZ2xbXCJURVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1pcIl0gPSAzNDA3M10gPSBcIlRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWlwiO1xuICBnbFtnbFtcIlRFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWlwiXSA9IDM0MDc0XSA9IFwiVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9aXCI7XG4gIGdsW2dsW1wiTUFYX0NVQkVfTUFQX1RFWFRVUkVfU0laRVwiXSA9IDM0MDc2XSA9IFwiTUFYX0NVQkVfTUFQX1RFWFRVUkVfU0laRVwiO1xuICBnbFtnbFtcIlRFWFRVUkUwXCJdID0gMzM5ODRdID0gXCJURVhUVVJFMFwiO1xuICBnbFtnbFtcIlRFWFRVUkUxXCJdID0gMzM5ODVdID0gXCJURVhUVVJFMVwiO1xuICBnbFtnbFtcIlRFWFRVUkUyXCJdID0gMzM5ODZdID0gXCJURVhUVVJFMlwiO1xuICBnbFtnbFtcIlRFWFRVUkUzXCJdID0gMzM5ODddID0gXCJURVhUVVJFM1wiO1xuICBnbFtnbFtcIlRFWFRVUkU0XCJdID0gMzM5ODhdID0gXCJURVhUVVJFNFwiO1xuICBnbFtnbFtcIlRFWFRVUkU1XCJdID0gMzM5ODldID0gXCJURVhUVVJFNVwiO1xuICBnbFtnbFtcIlRFWFRVUkU2XCJdID0gMzM5OTBdID0gXCJURVhUVVJFNlwiO1xuICBnbFtnbFtcIlRFWFRVUkU3XCJdID0gMzM5OTFdID0gXCJURVhUVVJFN1wiO1xuICBnbFtnbFtcIlRFWFRVUkU4XCJdID0gMzM5OTJdID0gXCJURVhUVVJFOFwiO1xuICBnbFtnbFtcIlRFWFRVUkU5XCJdID0gMzM5OTNdID0gXCJURVhUVVJFOVwiO1xuICBnbFtnbFtcIlRFWFRVUkUxMFwiXSA9IDMzOTk0XSA9IFwiVEVYVFVSRTEwXCI7XG4gIGdsW2dsW1wiVEVYVFVSRTExXCJdID0gMzM5OTVdID0gXCJURVhUVVJFMTFcIjtcbiAgZ2xbZ2xbXCJURVhUVVJFMTJcIl0gPSAzMzk5Nl0gPSBcIlRFWFRVUkUxMlwiO1xuICBnbFtnbFtcIlRFWFRVUkUxM1wiXSA9IDMzOTk3XSA9IFwiVEVYVFVSRTEzXCI7XG4gIGdsW2dsW1wiVEVYVFVSRTE0XCJdID0gMzM5OThdID0gXCJURVhUVVJFMTRcIjtcbiAgZ2xbZ2xbXCJURVhUVVJFMTVcIl0gPSAzMzk5OV0gPSBcIlRFWFRVUkUxNVwiO1xuICBnbFtnbFtcIlRFWFRVUkUxNlwiXSA9IDM0MDAwXSA9IFwiVEVYVFVSRTE2XCI7XG4gIGdsW2dsW1wiVEVYVFVSRTE3XCJdID0gMzQwMDFdID0gXCJURVhUVVJFMTdcIjtcbiAgZ2xbZ2xbXCJURVhUVVJFMThcIl0gPSAzNDAwMl0gPSBcIlRFWFRVUkUxOFwiO1xuICBnbFtnbFtcIlRFWFRVUkUxOVwiXSA9IDM0MDAzXSA9IFwiVEVYVFVSRTE5XCI7XG4gIGdsW2dsW1wiVEVYVFVSRTIwXCJdID0gMzQwMDRdID0gXCJURVhUVVJFMjBcIjtcbiAgZ2xbZ2xbXCJURVhUVVJFMjFcIl0gPSAzNDAwNV0gPSBcIlRFWFRVUkUyMVwiO1xuICBnbFtnbFtcIlRFWFRVUkUyMlwiXSA9IDM0MDA2XSA9IFwiVEVYVFVSRTIyXCI7XG4gIGdsW2dsW1wiVEVYVFVSRTIzXCJdID0gMzQwMDddID0gXCJURVhUVVJFMjNcIjtcbiAgZ2xbZ2xbXCJURVhUVVJFMjRcIl0gPSAzNDAwOF0gPSBcIlRFWFRVUkUyNFwiO1xuICBnbFtnbFtcIlRFWFRVUkUyNVwiXSA9IDM0MDA5XSA9IFwiVEVYVFVSRTI1XCI7XG4gIGdsW2dsW1wiVEVYVFVSRTI2XCJdID0gMzQwMTBdID0gXCJURVhUVVJFMjZcIjtcbiAgZ2xbZ2xbXCJURVhUVVJFMjdcIl0gPSAzNDAxMV0gPSBcIlRFWFRVUkUyN1wiO1xuICBnbFtnbFtcIlRFWFRVUkUyOFwiXSA9IDM0MDEyXSA9IFwiVEVYVFVSRTI4XCI7XG4gIGdsW2dsW1wiVEVYVFVSRTI5XCJdID0gMzQwMTNdID0gXCJURVhUVVJFMjlcIjtcbiAgZ2xbZ2xbXCJURVhUVVJFMzBcIl0gPSAzNDAxNF0gPSBcIlRFWFRVUkUzMFwiO1xuICBnbFtnbFtcIlRFWFRVUkUzMVwiXSA9IDM0MDE1XSA9IFwiVEVYVFVSRTMxXCI7XG4gIGdsW2dsW1wiQUNUSVZFX1RFWFRVUkVcIl0gPSAzNDAxNl0gPSBcIkFDVElWRV9URVhUVVJFXCI7XG4gIGdsW2dsW1wiUkVQRUFUXCJdID0gMTA0OTddID0gXCJSRVBFQVRcIjtcbiAgZ2xbZ2xbXCJDTEFNUF9UT19FREdFXCJdID0gMzMwNzFdID0gXCJDTEFNUF9UT19FREdFXCI7XG4gIGdsW2dsW1wiTUlSUk9SRURfUkVQRUFUXCJdID0gMzM2NDhdID0gXCJNSVJST1JFRF9SRVBFQVRcIjtcbiAgZ2xbZ2xbXCJGTE9BVF9WRUMyXCJdID0gMzU2NjRdID0gXCJGTE9BVF9WRUMyXCI7XG4gIGdsW2dsW1wiRkxPQVRfVkVDM1wiXSA9IDM1NjY1XSA9IFwiRkxPQVRfVkVDM1wiO1xuICBnbFtnbFtcIkZMT0FUX1ZFQzRcIl0gPSAzNTY2Nl0gPSBcIkZMT0FUX1ZFQzRcIjtcbiAgZ2xbZ2xbXCJJTlRfVkVDMlwiXSA9IDM1NjY3XSA9IFwiSU5UX1ZFQzJcIjtcbiAgZ2xbZ2xbXCJJTlRfVkVDM1wiXSA9IDM1NjY4XSA9IFwiSU5UX1ZFQzNcIjtcbiAgZ2xbZ2xbXCJJTlRfVkVDNFwiXSA9IDM1NjY5XSA9IFwiSU5UX1ZFQzRcIjtcbiAgZ2xbZ2xbXCJCT09MXCJdID0gMzU2NzBdID0gXCJCT09MXCI7XG4gIGdsW2dsW1wiQk9PTF9WRUMyXCJdID0gMzU2NzFdID0gXCJCT09MX1ZFQzJcIjtcbiAgZ2xbZ2xbXCJCT09MX1ZFQzNcIl0gPSAzNTY3Ml0gPSBcIkJPT0xfVkVDM1wiO1xuICBnbFtnbFtcIkJPT0xfVkVDNFwiXSA9IDM1NjczXSA9IFwiQk9PTF9WRUM0XCI7XG4gIGdsW2dsW1wiRkxPQVRfTUFUMlwiXSA9IDM1Njc0XSA9IFwiRkxPQVRfTUFUMlwiO1xuICBnbFtnbFtcIkZMT0FUX01BVDNcIl0gPSAzNTY3NV0gPSBcIkZMT0FUX01BVDNcIjtcbiAgZ2xbZ2xbXCJGTE9BVF9NQVQ0XCJdID0gMzU2NzZdID0gXCJGTE9BVF9NQVQ0XCI7XG4gIGdsW2dsW1wiU0FNUExFUl8yRFwiXSA9IDM1Njc4XSA9IFwiU0FNUExFUl8yRFwiO1xuICBnbFtnbFtcIlNBTVBMRVJfQ1VCRVwiXSA9IDM1NjgwXSA9IFwiU0FNUExFUl9DVUJFXCI7XG4gIGdsW2dsW1wiVkVSVEVYX0FUVFJJQl9BUlJBWV9FTkFCTEVEXCJdID0gMzQzMzhdID0gXCJWRVJURVhfQVRUUklCX0FSUkFZX0VOQUJMRURcIjtcbiAgZ2xbZ2xbXCJWRVJURVhfQVRUUklCX0FSUkFZX1NJWkVcIl0gPSAzNDMzOV0gPSBcIlZFUlRFWF9BVFRSSUJfQVJSQVlfU0laRVwiO1xuICBnbFtnbFtcIlZFUlRFWF9BVFRSSUJfQVJSQVlfU1RSSURFXCJdID0gMzQzNDBdID0gXCJWRVJURVhfQVRUUklCX0FSUkFZX1NUUklERVwiO1xuICBnbFtnbFtcIlZFUlRFWF9BVFRSSUJfQVJSQVlfVFlQRVwiXSA9IDM0MzQxXSA9IFwiVkVSVEVYX0FUVFJJQl9BUlJBWV9UWVBFXCI7XG4gIGdsW2dsW1wiVkVSVEVYX0FUVFJJQl9BUlJBWV9OT1JNQUxJWkVEXCJdID0gMzQ5MjJdID0gXCJWRVJURVhfQVRUUklCX0FSUkFZX05PUk1BTElaRURcIjtcbiAgZ2xbZ2xbXCJWRVJURVhfQVRUUklCX0FSUkFZX1BPSU5URVJcIl0gPSAzNDM3M10gPSBcIlZFUlRFWF9BVFRSSUJfQVJSQVlfUE9JTlRFUlwiO1xuICBnbFtnbFtcIlZFUlRFWF9BVFRSSUJfQVJSQVlfQlVGRkVSX0JJTkRJTkdcIl0gPSAzNDk3NV0gPSBcIlZFUlRFWF9BVFRSSUJfQVJSQVlfQlVGRkVSX0JJTkRJTkdcIjtcbiAgZ2xbZ2xbXCJDT01QSUxFX1NUQVRVU1wiXSA9IDM1NzEzXSA9IFwiQ09NUElMRV9TVEFUVVNcIjtcbiAgZ2xbZ2xbXCJMT1dfRkxPQVRcIl0gPSAzNjMzNl0gPSBcIkxPV19GTE9BVFwiO1xuICBnbFtnbFtcIk1FRElVTV9GTE9BVFwiXSA9IDM2MzM3XSA9IFwiTUVESVVNX0ZMT0FUXCI7XG4gIGdsW2dsW1wiSElHSF9GTE9BVFwiXSA9IDM2MzM4XSA9IFwiSElHSF9GTE9BVFwiO1xuICBnbFtnbFtcIkxPV19JTlRcIl0gPSAzNjMzOV0gPSBcIkxPV19JTlRcIjtcbiAgZ2xbZ2xbXCJNRURJVU1fSU5UXCJdID0gMzYzNDBdID0gXCJNRURJVU1fSU5UXCI7XG4gIGdsW2dsW1wiSElHSF9JTlRcIl0gPSAzNjM0MV0gPSBcIkhJR0hfSU5UXCI7XG4gIGdsW2dsW1wiRlJBTUVCVUZGRVJcIl0gPSAzNjE2MF0gPSBcIkZSQU1FQlVGRkVSXCI7XG4gIGdsW2dsW1wiUkVOREVSQlVGRkVSXCJdID0gMzYxNjFdID0gXCJSRU5ERVJCVUZGRVJcIjtcbiAgZ2xbZ2xbXCJSR0JBNFwiXSA9IDMyODU0XSA9IFwiUkdCQTRcIjtcbiAgZ2xbZ2xbXCJSR0I1X0ExXCJdID0gMzI4NTVdID0gXCJSR0I1X0ExXCI7XG4gIGdsW2dsW1wiUkdCNTY1XCJdID0gMzYxOTRdID0gXCJSR0I1NjVcIjtcbiAgZ2xbZ2xbXCJERVBUSF9DT01QT05FTlQxNlwiXSA9IDMzMTg5XSA9IFwiREVQVEhfQ09NUE9ORU5UMTZcIjtcbiAgZ2xbZ2xbXCJTVEVOQ0lMX0lOREVYXCJdID0gNjQwMV0gPSBcIlNURU5DSUxfSU5ERVhcIjtcbiAgZ2xbZ2xbXCJTVEVOQ0lMX0lOREVYOFwiXSA9IDM2MTY4XSA9IFwiU1RFTkNJTF9JTkRFWDhcIjtcbiAgZ2xbZ2xbXCJERVBUSF9TVEVOQ0lMXCJdID0gMzQwNDFdID0gXCJERVBUSF9TVEVOQ0lMXCI7XG4gIGdsW2dsW1wiUkVOREVSQlVGRkVSX1dJRFRIXCJdID0gMzYxNjJdID0gXCJSRU5ERVJCVUZGRVJfV0lEVEhcIjtcbiAgZ2xbZ2xbXCJSRU5ERVJCVUZGRVJfSEVJR0hUXCJdID0gMzYxNjNdID0gXCJSRU5ERVJCVUZGRVJfSEVJR0hUXCI7XG4gIGdsW2dsW1wiUkVOREVSQlVGRkVSX0lOVEVSTkFMX0ZPUk1BVFwiXSA9IDM2MTY0XSA9IFwiUkVOREVSQlVGRkVSX0lOVEVSTkFMX0ZPUk1BVFwiO1xuICBnbFtnbFtcIlJFTkRFUkJVRkZFUl9SRURfU0laRVwiXSA9IDM2MTc2XSA9IFwiUkVOREVSQlVGRkVSX1JFRF9TSVpFXCI7XG4gIGdsW2dsW1wiUkVOREVSQlVGRkVSX0dSRUVOX1NJWkVcIl0gPSAzNjE3N10gPSBcIlJFTkRFUkJVRkZFUl9HUkVFTl9TSVpFXCI7XG4gIGdsW2dsW1wiUkVOREVSQlVGRkVSX0JMVUVfU0laRVwiXSA9IDM2MTc4XSA9IFwiUkVOREVSQlVGRkVSX0JMVUVfU0laRVwiO1xuICBnbFtnbFtcIlJFTkRFUkJVRkZFUl9BTFBIQV9TSVpFXCJdID0gMzYxNzldID0gXCJSRU5ERVJCVUZGRVJfQUxQSEFfU0laRVwiO1xuICBnbFtnbFtcIlJFTkRFUkJVRkZFUl9ERVBUSF9TSVpFXCJdID0gMzYxODBdID0gXCJSRU5ERVJCVUZGRVJfREVQVEhfU0laRVwiO1xuICBnbFtnbFtcIlJFTkRFUkJVRkZFUl9TVEVOQ0lMX1NJWkVcIl0gPSAzNjE4MV0gPSBcIlJFTkRFUkJVRkZFUl9TVEVOQ0lMX1NJWkVcIjtcbiAgZ2xbZ2xbXCJGUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX09CSkVDVF9UWVBFXCJdID0gMzYwNDhdID0gXCJGUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX09CSkVDVF9UWVBFXCI7XG4gIGdsW2dsW1wiRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9PQkpFQ1RfTkFNRVwiXSA9IDM2MDQ5XSA9IFwiRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9PQkpFQ1RfTkFNRVwiO1xuICBnbFtnbFtcIkZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfVEVYVFVSRV9MRVZFTFwiXSA9IDM2MDUwXSA9IFwiRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9URVhUVVJFX0xFVkVMXCI7XG4gIGdsW2dsW1wiRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9URVhUVVJFX0NVQkVfTUFQX0ZBQ0VcIl0gPSAzNjA1MV0gPSBcIkZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfVEVYVFVSRV9DVUJFX01BUF9GQUNFXCI7XG4gIGdsW2dsW1wiQ09MT1JfQVRUQUNITUVOVDBcIl0gPSAzNjA2NF0gPSBcIkNPTE9SX0FUVEFDSE1FTlQwXCI7XG4gIGdsW2dsW1wiREVQVEhfQVRUQUNITUVOVFwiXSA9IDM2MDk2XSA9IFwiREVQVEhfQVRUQUNITUVOVFwiO1xuICBnbFtnbFtcIlNURU5DSUxfQVRUQUNITUVOVFwiXSA9IDM2MTI4XSA9IFwiU1RFTkNJTF9BVFRBQ0hNRU5UXCI7XG4gIGdsW2dsW1wiREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UXCJdID0gMzMzMDZdID0gXCJERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRcIjtcbiAgZ2xbZ2xbXCJOT05FXCJdID0gMF0gPSBcIk5PTkVcIjtcbiAgZ2xbZ2xbXCJGUkFNRUJVRkZFUl9DT01QTEVURVwiXSA9IDM2MDUzXSA9IFwiRlJBTUVCVUZGRVJfQ09NUExFVEVcIjtcbiAgZ2xbZ2xbXCJGUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0FUVEFDSE1FTlRcIl0gPSAzNjA1NF0gPSBcIkZSQU1FQlVGRkVSX0lOQ09NUExFVEVfQVRUQUNITUVOVFwiO1xuICBnbFtnbFtcIkZSQU1FQlVGRkVSX0lOQ09NUExFVEVfTUlTU0lOR19BVFRBQ0hNRU5UXCJdID0gMzYwNTVdID0gXCJGUkFNRUJVRkZFUl9JTkNPTVBMRVRFX01JU1NJTkdfQVRUQUNITUVOVFwiO1xuICBnbFtnbFtcIkZSQU1FQlVGRkVSX0lOQ09NUExFVEVfRElNRU5TSU9OU1wiXSA9IDM2MDU3XSA9IFwiRlJBTUVCVUZGRVJfSU5DT01QTEVURV9ESU1FTlNJT05TXCI7XG4gIGdsW2dsW1wiRlJBTUVCVUZGRVJfVU5TVVBQT1JURURcIl0gPSAzNjA2MV0gPSBcIkZSQU1FQlVGRkVSX1VOU1VQUE9SVEVEXCI7XG4gIGdsW2dsW1wiRlJBTUVCVUZGRVJfQklORElOR1wiXSA9IDM2MDA2XSA9IFwiRlJBTUVCVUZGRVJfQklORElOR1wiO1xuICBnbFtnbFtcIlJFTkRFUkJVRkZFUl9CSU5ESU5HXCJdID0gMzYwMDddID0gXCJSRU5ERVJCVUZGRVJfQklORElOR1wiO1xuICBnbFtnbFtcIk1BWF9SRU5ERVJCVUZGRVJfU0laRVwiXSA9IDM0MDI0XSA9IFwiTUFYX1JFTkRFUkJVRkZFUl9TSVpFXCI7XG4gIGdsW2dsW1wiSU5WQUxJRF9GUkFNRUJVRkZFUl9PUEVSQVRJT05cIl0gPSAxMjg2XSA9IFwiSU5WQUxJRF9GUkFNRUJVRkZFUl9PUEVSQVRJT05cIjtcbiAgZ2xbZ2xbXCJVTlBBQ0tfRkxJUF9ZX1dFQkdMXCJdID0gMzc0NDBdID0gXCJVTlBBQ0tfRkxJUF9ZX1dFQkdMXCI7XG4gIGdsW2dsW1wiVU5QQUNLX1BSRU1VTFRJUExZX0FMUEhBX1dFQkdMXCJdID0gMzc0NDFdID0gXCJVTlBBQ0tfUFJFTVVMVElQTFlfQUxQSEFfV0VCR0xcIjtcbiAgZ2xbZ2xbXCJDT05URVhUX0xPU1RfV0VCR0xcIl0gPSAzNzQ0Ml0gPSBcIkNPTlRFWFRfTE9TVF9XRUJHTFwiO1xuICBnbFtnbFtcIlVOUEFDS19DT0xPUlNQQUNFX0NPTlZFUlNJT05fV0VCR0xcIl0gPSAzNzQ0M10gPSBcIlVOUEFDS19DT0xPUlNQQUNFX0NPTlZFUlNJT05fV0VCR0xcIjtcbiAgZ2xbZ2xbXCJCUk9XU0VSX0RFRkFVTFRfV0VCR0xcIl0gPSAzNzQ0NF0gPSBcIkJST1dTRVJfREVGQVVMVF9XRUJHTFwiO1xuICBnbFtnbFtcIkNPUFlfU1JDXCJdID0gMV0gPSBcIkNPUFlfU1JDXCI7XG4gIGdsW2dsW1wiQ09QWV9EU1RcIl0gPSAyXSA9IFwiQ09QWV9EU1RcIjtcbiAgZ2xbZ2xbXCJTQU1QTEVEXCJdID0gNF0gPSBcIlNBTVBMRURcIjtcbiAgZ2xbZ2xbXCJTVE9SQUdFXCJdID0gOF0gPSBcIlNUT1JBR0VcIjtcbiAgZ2xbZ2xbXCJSRU5ERVJfQVRUQUNITUVOVFwiXSA9IDE2XSA9IFwiUkVOREVSX0FUVEFDSE1FTlRcIjtcbn0pKGdsIHx8IChnbCA9IHt9KSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1nbC5qcy5tYXAiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///35\n')},function(module,exports,__webpack_require__){"use strict";eval('/* eslint "no-console": off */\n\n\n\nvar _ = __webpack_require__(28);\nvar Graph = __webpack_require__(46).Graph;\n\nmodule.exports = {\n addDummyNode: addDummyNode,\n simplify: simplify,\n asNonCompoundGraph: asNonCompoundGraph,\n successorWeights: successorWeights,\n predecessorWeights: predecessorWeights,\n intersectRect: intersectRect,\n buildLayerMatrix: buildLayerMatrix,\n normalizeRanks: normalizeRanks,\n removeEmptyRanks: removeEmptyRanks,\n addBorderNode: addBorderNode,\n maxRank: maxRank,\n partition: partition,\n time: time,\n notime: notime\n};\n\n/*\n * Adds a dummy node to the graph and return v.\n */\nfunction addDummyNode(g, type, attrs, name) {\n var v;\n do {\n v = _.uniqueId(name);\n } while (g.hasNode(v));\n\n attrs.dummy = type;\n g.setNode(v, attrs);\n return v;\n}\n\n/*\n * Returns a new graph with only simple edges. Handles aggregation of data\n * associated with multi-edges.\n */\nfunction simplify(g) {\n var simplified = new Graph().setGraph(g.graph());\n _.forEach(g.nodes(), function(v) { simplified.setNode(v, g.node(v)); });\n _.forEach(g.edges(), function(e) {\n var simpleLabel = simplified.edge(e.v, e.w) || { weight: 0, minlen: 1 };\n var label = g.edge(e);\n simplified.setEdge(e.v, e.w, {\n weight: simpleLabel.weight + label.weight,\n minlen: Math.max(simpleLabel.minlen, label.minlen)\n });\n });\n return simplified;\n}\n\nfunction asNonCompoundGraph(g) {\n var simplified = new Graph({ multigraph: g.isMultigraph() }).setGraph(g.graph());\n _.forEach(g.nodes(), function(v) {\n if (!g.children(v).length) {\n simplified.setNode(v, g.node(v));\n }\n });\n _.forEach(g.edges(), function(e) {\n simplified.setEdge(e, g.edge(e));\n });\n return simplified;\n}\n\nfunction successorWeights(g) {\n var weightMap = _.map(g.nodes(), function(v) {\n var sucs = {};\n _.forEach(g.outEdges(v), function(e) {\n sucs[e.w] = (sucs[e.w] || 0) + g.edge(e).weight;\n });\n return sucs;\n });\n return _.zipObject(g.nodes(), weightMap);\n}\n\nfunction predecessorWeights(g) {\n var weightMap = _.map(g.nodes(), function(v) {\n var preds = {};\n _.forEach(g.inEdges(v), function(e) {\n preds[e.v] = (preds[e.v] || 0) + g.edge(e).weight;\n });\n return preds;\n });\n return _.zipObject(g.nodes(), weightMap);\n}\n\n/*\n * Finds where a line starting at point ({x, y}) would intersect a rectangle\n * ({x, y, width, height}) if it were pointing at the rectangle\'s center.\n */\nfunction intersectRect(rect, point) {\n var x = rect.x;\n var y = rect.y;\n\n // Rectangle intersection algorithm from:\n // http://math.stackexchange.com/questions/108113/find-edge-between-two-boxes\n var dx = point.x - x;\n var dy = point.y - y;\n var w = rect.width / 2;\n var h = rect.height / 2;\n\n if (!dx && !dy) {\n throw new Error("Not possible to find intersection inside of the rectangle");\n }\n\n var sx, sy;\n if (Math.abs(dy) * w > Math.abs(dx) * h) {\n // Intersection is top or bottom of rect.\n if (dy < 0) {\n h = -h;\n }\n sx = h * dx / dy;\n sy = h;\n } else {\n // Intersection is left or right of rect.\n if (dx < 0) {\n w = -w;\n }\n sx = w;\n sy = w * dy / dx;\n }\n\n return { x: x + sx, y: y + sy };\n}\n\n/*\n * Given a DAG with each node assigned "rank" and "order" properties, this\n * function will produce a matrix with the ids of each node.\n */\nfunction buildLayerMatrix(g) {\n var layering = _.map(_.range(maxRank(g) + 1), function() { return []; });\n _.forEach(g.nodes(), function(v) {\n var node = g.node(v);\n var rank = node.rank;\n if (!_.isUndefined(rank)) {\n layering[rank][node.order] = v;\n }\n });\n return layering;\n}\n\n/*\n * Adjusts the ranks for all nodes in the graph such that all nodes v have\n * rank(v) >= 0 and at least one node w has rank(w) = 0.\n */\nfunction normalizeRanks(g) {\n var min = _.min(_.map(g.nodes(), function(v) { return g.node(v).rank; }));\n _.forEach(g.nodes(), function(v) {\n var node = g.node(v);\n if (_.has(node, "rank")) {\n node.rank -= min;\n }\n });\n}\n\nfunction removeEmptyRanks(g) {\n // Ranks may not start at 0, so we need to offset them\n var offset = _.min(_.map(g.nodes(), function(v) { return g.node(v).rank; }));\n\n var layers = [];\n _.forEach(g.nodes(), function(v) {\n var rank = g.node(v).rank - offset;\n if (!layers[rank]) {\n layers[rank] = [];\n }\n layers[rank].push(v);\n });\n\n var delta = 0;\n var nodeRankFactor = g.graph().nodeRankFactor;\n _.forEach(layers, function(vs, i) {\n if (_.isUndefined(vs) && i % nodeRankFactor !== 0) {\n --delta;\n } else if (delta) {\n _.forEach(vs, function(v) { g.node(v).rank += delta; });\n }\n });\n}\n\nfunction addBorderNode(g, prefix, rank, order) {\n var node = {\n width: 0,\n height: 0\n };\n if (arguments.length >= 4) {\n node.rank = rank;\n node.order = order;\n }\n return addDummyNode(g, "border", node, prefix);\n}\n\nfunction maxRank(g) {\n return _.max(_.map(g.nodes(), function(v) {\n var rank = g.node(v).rank;\n if (!_.isUndefined(rank)) {\n return rank;\n }\n }));\n}\n\n/*\n * Partition a collection into two groups: `lhs` and `rhs`. If the supplied\n * function returns true for an entry it goes into `lhs`. Otherwise it goes\n * into `rhs.\n */\nfunction partition(collection, fn) {\n var result = { lhs: [], rhs: [] };\n _.forEach(collection, function(value) {\n if (fn(value)) {\n result.lhs.push(value);\n } else {\n result.rhs.push(value);\n }\n });\n return result;\n}\n\n/*\n * Returns a new function that wraps `fn` with a timer. The wrapper logs the\n * time it takes to execute the function.\n */\nfunction time(name, fn) {\n var start = _.now();\n try {\n return fn();\n } finally {\n console.log(name + " time: " + (_.now() - start) + "ms");\n }\n}\n\nfunction notime(name, fn) {\n return fn();\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZGFncmVqcy9saWIvdXRpbC5qcz82NjNjIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztBQUVhOztBQUViLFFBQVEsbUJBQU8sQ0FBQyxFQUFVO0FBQzFCLFlBQVksbUJBQU8sQ0FBQyxFQUFZOztBQUVoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DLGtDQUFrQyxFQUFFO0FBQ3hFO0FBQ0Esb0RBQW9EO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0EsOEJBQThCLCtCQUErQjtBQUM3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBLDBDQUEwQyxLQUFLO0FBQy9DLEtBQUssb0JBQW9CO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxVQUFVO0FBQ1Y7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDREQUE0RCxXQUFXLEVBQUU7QUFDekU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdEQUFnRCx1QkFBdUIsRUFBRTtBQUN6RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQSxtREFBbUQsdUJBQXVCLEVBQUU7O0FBRTVFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLGlDQUFpQyx5QkFBeUIsRUFBRTtBQUM1RDtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EiLCJmaWxlIjoiMzYuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQgXCJuby1jb25zb2xlXCI6IG9mZiAqL1xuXG5cInVzZSBzdHJpY3RcIjtcblxudmFyIF8gPSByZXF1aXJlKFwiLi9sb2Rhc2hcIik7XG52YXIgR3JhcGggPSByZXF1aXJlKFwiLi9ncmFwaGxpYlwiKS5HcmFwaDtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGFkZER1bW15Tm9kZTogYWRkRHVtbXlOb2RlLFxuICBzaW1wbGlmeTogc2ltcGxpZnksXG4gIGFzTm9uQ29tcG91bmRHcmFwaDogYXNOb25Db21wb3VuZEdyYXBoLFxuICBzdWNjZXNzb3JXZWlnaHRzOiBzdWNjZXNzb3JXZWlnaHRzLFxuICBwcmVkZWNlc3NvcldlaWdodHM6IHByZWRlY2Vzc29yV2VpZ2h0cyxcbiAgaW50ZXJzZWN0UmVjdDogaW50ZXJzZWN0UmVjdCxcbiAgYnVpbGRMYXllck1hdHJpeDogYnVpbGRMYXllck1hdHJpeCxcbiAgbm9ybWFsaXplUmFua3M6IG5vcm1hbGl6ZVJhbmtzLFxuICByZW1vdmVFbXB0eVJhbmtzOiByZW1vdmVFbXB0eVJhbmtzLFxuICBhZGRCb3JkZXJOb2RlOiBhZGRCb3JkZXJOb2RlLFxuICBtYXhSYW5rOiBtYXhSYW5rLFxuICBwYXJ0aXRpb246IHBhcnRpdGlvbixcbiAgdGltZTogdGltZSxcbiAgbm90aW1lOiBub3RpbWVcbn07XG5cbi8qXG4gKiBBZGRzIGEgZHVtbXkgbm9kZSB0byB0aGUgZ3JhcGggYW5kIHJldHVybiB2LlxuICovXG5mdW5jdGlvbiBhZGREdW1teU5vZGUoZywgdHlwZSwgYXR0cnMsIG5hbWUpIHtcbiAgdmFyIHY7XG4gIGRvIHtcbiAgICB2ID0gXy51bmlxdWVJZChuYW1lKTtcbiAgfSB3aGlsZSAoZy5oYXNOb2RlKHYpKTtcblxuICBhdHRycy5kdW1teSA9IHR5cGU7XG4gIGcuc2V0Tm9kZSh2LCBhdHRycyk7XG4gIHJldHVybiB2O1xufVxuXG4vKlxuICogUmV0dXJucyBhIG5ldyBncmFwaCB3aXRoIG9ubHkgc2ltcGxlIGVkZ2VzLiBIYW5kbGVzIGFnZ3JlZ2F0aW9uIG9mIGRhdGFcbiAqIGFzc29jaWF0ZWQgd2l0aCBtdWx0aS1lZGdlcy5cbiAqL1xuZnVuY3Rpb24gc2ltcGxpZnkoZykge1xuICB2YXIgc2ltcGxpZmllZCA9IG5ldyBHcmFwaCgpLnNldEdyYXBoKGcuZ3JhcGgoKSk7XG4gIF8uZm9yRWFjaChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHsgc2ltcGxpZmllZC5zZXROb2RlKHYsIGcubm9kZSh2KSk7IH0pO1xuICBfLmZvckVhY2goZy5lZGdlcygpLCBmdW5jdGlvbihlKSB7XG4gICAgdmFyIHNpbXBsZUxhYmVsID0gc2ltcGxpZmllZC5lZGdlKGUudiwgZS53KSB8fCB7IHdlaWdodDogMCwgbWlubGVuOiAxIH07XG4gICAgdmFyIGxhYmVsID0gZy5lZGdlKGUpO1xuICAgIHNpbXBsaWZpZWQuc2V0RWRnZShlLnYsIGUudywge1xuICAgICAgd2VpZ2h0OiBzaW1wbGVMYWJlbC53ZWlnaHQgKyBsYWJlbC53ZWlnaHQsXG4gICAgICBtaW5sZW46IE1hdGgubWF4KHNpbXBsZUxhYmVsLm1pbmxlbiwgbGFiZWwubWlubGVuKVxuICAgIH0pO1xuICB9KTtcbiAgcmV0dXJuIHNpbXBsaWZpZWQ7XG59XG5cbmZ1bmN0aW9uIGFzTm9uQ29tcG91bmRHcmFwaChnKSB7XG4gIHZhciBzaW1wbGlmaWVkID0gbmV3IEdyYXBoKHsgbXVsdGlncmFwaDogZy5pc011bHRpZ3JhcGgoKSB9KS5zZXRHcmFwaChnLmdyYXBoKCkpO1xuICBfLmZvckVhY2goZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgaWYgKCFnLmNoaWxkcmVuKHYpLmxlbmd0aCkge1xuICAgICAgc2ltcGxpZmllZC5zZXROb2RlKHYsIGcubm9kZSh2KSk7XG4gICAgfVxuICB9KTtcbiAgXy5mb3JFYWNoKGcuZWRnZXMoKSwgZnVuY3Rpb24oZSkge1xuICAgIHNpbXBsaWZpZWQuc2V0RWRnZShlLCBnLmVkZ2UoZSkpO1xuICB9KTtcbiAgcmV0dXJuIHNpbXBsaWZpZWQ7XG59XG5cbmZ1bmN0aW9uIHN1Y2Nlc3NvcldlaWdodHMoZykge1xuICB2YXIgd2VpZ2h0TWFwID0gXy5tYXAoZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgdmFyIHN1Y3MgPSB7fTtcbiAgICBfLmZvckVhY2goZy5vdXRFZGdlcyh2KSwgZnVuY3Rpb24oZSkge1xuICAgICAgc3Vjc1tlLnddID0gKHN1Y3NbZS53XSB8fCAwKSArIGcuZWRnZShlKS53ZWlnaHQ7XG4gICAgfSk7XG4gICAgcmV0dXJuIHN1Y3M7XG4gIH0pO1xuICByZXR1cm4gXy56aXBPYmplY3QoZy5ub2RlcygpLCB3ZWlnaHRNYXApO1xufVxuXG5mdW5jdGlvbiBwcmVkZWNlc3NvcldlaWdodHMoZykge1xuICB2YXIgd2VpZ2h0TWFwID0gXy5tYXAoZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgdmFyIHByZWRzID0ge307XG4gICAgXy5mb3JFYWNoKGcuaW5FZGdlcyh2KSwgZnVuY3Rpb24oZSkge1xuICAgICAgcHJlZHNbZS52XSA9IChwcmVkc1tlLnZdIHx8IDApICsgZy5lZGdlKGUpLndlaWdodDtcbiAgICB9KTtcbiAgICByZXR1cm4gcHJlZHM7XG4gIH0pO1xuICByZXR1cm4gXy56aXBPYmplY3QoZy5ub2RlcygpLCB3ZWlnaHRNYXApO1xufVxuXG4vKlxuICogRmluZHMgd2hlcmUgYSBsaW5lIHN0YXJ0aW5nIGF0IHBvaW50ICh7eCwgeX0pIHdvdWxkIGludGVyc2VjdCBhIHJlY3RhbmdsZVxuICogKHt4LCB5LCB3aWR0aCwgaGVpZ2h0fSkgaWYgaXQgd2VyZSBwb2ludGluZyBhdCB0aGUgcmVjdGFuZ2xlJ3MgY2VudGVyLlxuICovXG5mdW5jdGlvbiBpbnRlcnNlY3RSZWN0KHJlY3QsIHBvaW50KSB7XG4gIHZhciB4ID0gcmVjdC54O1xuICB2YXIgeSA9IHJlY3QueTtcblxuICAvLyBSZWN0YW5nbGUgaW50ZXJzZWN0aW9uIGFsZ29yaXRobSBmcm9tOlxuICAvLyBodHRwOi8vbWF0aC5zdGFja2V4Y2hhbmdlLmNvbS9xdWVzdGlvbnMvMTA4MTEzL2ZpbmQtZWRnZS1iZXR3ZWVuLXR3by1ib3hlc1xuICB2YXIgZHggPSBwb2ludC54IC0geDtcbiAgdmFyIGR5ID0gcG9pbnQueSAtIHk7XG4gIHZhciB3ID0gcmVjdC53aWR0aCAvIDI7XG4gIHZhciBoID0gcmVjdC5oZWlnaHQgLyAyO1xuXG4gIGlmICghZHggJiYgIWR5KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTm90IHBvc3NpYmxlIHRvIGZpbmQgaW50ZXJzZWN0aW9uIGluc2lkZSBvZiB0aGUgcmVjdGFuZ2xlXCIpO1xuICB9XG5cbiAgdmFyIHN4LCBzeTtcbiAgaWYgKE1hdGguYWJzKGR5KSAqIHcgPiBNYXRoLmFicyhkeCkgKiBoKSB7XG4gICAgLy8gSW50ZXJzZWN0aW9uIGlzIHRvcCBvciBib3R0b20gb2YgcmVjdC5cbiAgICBpZiAoZHkgPCAwKSB7XG4gICAgICBoID0gLWg7XG4gICAgfVxuICAgIHN4ID0gaCAqIGR4IC8gZHk7XG4gICAgc3kgPSBoO1xuICB9IGVsc2Uge1xuICAgIC8vIEludGVyc2VjdGlvbiBpcyBsZWZ0IG9yIHJpZ2h0IG9mIHJlY3QuXG4gICAgaWYgKGR4IDwgMCkge1xuICAgICAgdyA9IC13O1xuICAgIH1cbiAgICBzeCA9IHc7XG4gICAgc3kgPSB3ICogZHkgLyBkeDtcbiAgfVxuXG4gIHJldHVybiB7IHg6IHggKyBzeCwgeTogeSArIHN5IH07XG59XG5cbi8qXG4gKiBHaXZlbiBhIERBRyB3aXRoIGVhY2ggbm9kZSBhc3NpZ25lZCBcInJhbmtcIiBhbmQgXCJvcmRlclwiIHByb3BlcnRpZXMsIHRoaXNcbiAqIGZ1bmN0aW9uIHdpbGwgcHJvZHVjZSBhIG1hdHJpeCB3aXRoIHRoZSBpZHMgb2YgZWFjaCBub2RlLlxuICovXG5mdW5jdGlvbiBidWlsZExheWVyTWF0cml4KGcpIHtcbiAgdmFyIGxheWVyaW5nID0gXy5tYXAoXy5yYW5nZShtYXhSYW5rKGcpICsgMSksIGZ1bmN0aW9uKCkgeyByZXR1cm4gW107IH0pO1xuICBfLmZvckVhY2goZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgdmFyIG5vZGUgPSBnLm5vZGUodik7XG4gICAgdmFyIHJhbmsgPSBub2RlLnJhbms7XG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHJhbmspKSB7XG4gICAgICBsYXllcmluZ1tyYW5rXVtub2RlLm9yZGVyXSA9IHY7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGxheWVyaW5nO1xufVxuXG4vKlxuICogQWRqdXN0cyB0aGUgcmFua3MgZm9yIGFsbCBub2RlcyBpbiB0aGUgZ3JhcGggc3VjaCB0aGF0IGFsbCBub2RlcyB2IGhhdmVcbiAqIHJhbmsodikgPj0gMCBhbmQgYXQgbGVhc3Qgb25lIG5vZGUgdyBoYXMgcmFuayh3KSA9IDAuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVJhbmtzKGcpIHtcbiAgdmFyIG1pbiA9IF8ubWluKF8ubWFwKGcubm9kZXMoKSwgZnVuY3Rpb24odikgeyByZXR1cm4gZy5ub2RlKHYpLnJhbms7IH0pKTtcbiAgXy5mb3JFYWNoKGcubm9kZXMoKSwgZnVuY3Rpb24odikge1xuICAgIHZhciBub2RlID0gZy5ub2RlKHYpO1xuICAgIGlmIChfLmhhcyhub2RlLCBcInJhbmtcIikpIHtcbiAgICAgIG5vZGUucmFuayAtPSBtaW47XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlRW1wdHlSYW5rcyhnKSB7XG4gIC8vIFJhbmtzIG1heSBub3Qgc3RhcnQgYXQgMCwgc28gd2UgbmVlZCB0byBvZmZzZXQgdGhlbVxuICB2YXIgb2Zmc2V0ID0gXy5taW4oXy5tYXAoZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7IHJldHVybiBnLm5vZGUodikucmFuazsgfSkpO1xuXG4gIHZhciBsYXllcnMgPSBbXTtcbiAgXy5mb3JFYWNoKGcubm9kZXMoKSwgZnVuY3Rpb24odikge1xuICAgIHZhciByYW5rID0gZy5ub2RlKHYpLnJhbmsgLSBvZmZzZXQ7XG4gICAgaWYgKCFsYXllcnNbcmFua10pIHtcbiAgICAgIGxheWVyc1tyYW5rXSA9IFtdO1xuICAgIH1cbiAgICBsYXllcnNbcmFua10ucHVzaCh2KTtcbiAgfSk7XG5cbiAgdmFyIGRlbHRhID0gMDtcbiAgdmFyIG5vZGVSYW5rRmFjdG9yID0gZy5ncmFwaCgpLm5vZGVSYW5rRmFjdG9yO1xuICBfLmZvckVhY2gobGF5ZXJzLCBmdW5jdGlvbih2cywgaSkge1xuICAgIGlmIChfLmlzVW5kZWZpbmVkKHZzKSAmJiBpICUgbm9kZVJhbmtGYWN0b3IgIT09IDApIHtcbiAgICAgIC0tZGVsdGE7XG4gICAgfSBlbHNlIGlmIChkZWx0YSkge1xuICAgICAgXy5mb3JFYWNoKHZzLCBmdW5jdGlvbih2KSB7IGcubm9kZSh2KS5yYW5rICs9IGRlbHRhOyB9KTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBhZGRCb3JkZXJOb2RlKGcsIHByZWZpeCwgcmFuaywgb3JkZXIpIHtcbiAgdmFyIG5vZGUgPSB7XG4gICAgd2lkdGg6IDAsXG4gICAgaGVpZ2h0OiAwXG4gIH07XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID49IDQpIHtcbiAgICBub2RlLnJhbmsgPSByYW5rO1xuICAgIG5vZGUub3JkZXIgPSBvcmRlcjtcbiAgfVxuICByZXR1cm4gYWRkRHVtbXlOb2RlKGcsIFwiYm9yZGVyXCIsIG5vZGUsIHByZWZpeCk7XG59XG5cbmZ1bmN0aW9uIG1heFJhbmsoZykge1xuICByZXR1cm4gXy5tYXgoXy5tYXAoZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgdmFyIHJhbmsgPSBnLm5vZGUodikucmFuaztcbiAgICBpZiAoIV8uaXNVbmRlZmluZWQocmFuaykpIHtcbiAgICAgIHJldHVybiByYW5rO1xuICAgIH1cbiAgfSkpO1xufVxuXG4vKlxuICogUGFydGl0aW9uIGEgY29sbGVjdGlvbiBpbnRvIHR3byBncm91cHM6IGBsaHNgIGFuZCBgcmhzYC4gSWYgdGhlIHN1cHBsaWVkXG4gKiBmdW5jdGlvbiByZXR1cm5zIHRydWUgZm9yIGFuIGVudHJ5IGl0IGdvZXMgaW50byBgbGhzYC4gT3RoZXJ3aXNlIGl0IGdvZXNcbiAqIGludG8gYHJocy5cbiAqL1xuZnVuY3Rpb24gcGFydGl0aW9uKGNvbGxlY3Rpb24sIGZuKSB7XG4gIHZhciByZXN1bHQgPSB7IGxoczogW10sIHJoczogW10gfTtcbiAgXy5mb3JFYWNoKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgaWYgKGZuKHZhbHVlKSkge1xuICAgICAgcmVzdWx0Lmxocy5wdXNoKHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0LnJocy5wdXNoKHZhbHVlKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKlxuICogUmV0dXJucyBhIG5ldyBmdW5jdGlvbiB0aGF0IHdyYXBzIGBmbmAgd2l0aCBhIHRpbWVyLiBUaGUgd3JhcHBlciBsb2dzIHRoZVxuICogdGltZSBpdCB0YWtlcyB0byBleGVjdXRlIHRoZSBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gdGltZShuYW1lLCBmbikge1xuICB2YXIgc3RhcnQgPSBfLm5vdygpO1xuICB0cnkge1xuICAgIHJldHVybiBmbigpO1xuICB9IGZpbmFsbHkge1xuICAgIGNvbnNvbGUubG9nKG5hbWUgKyBcIiB0aW1lOiBcIiArIChfLm5vdygpIC0gc3RhcnQpICsgXCJtc1wiKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBub3RpbWUobmFtZSwgZm4pIHtcbiAgcmV0dXJuIGZuKCk7XG59XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///36\n')},function(module,__webpack_exports__,__webpack_require__){"use strict";eval("\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, \"a\", function() { return /* reexport */ catmull_rom_2_bezier; });\n__webpack_require__.d(__webpack_exports__, \"b\", function() { return /* reexport */ parsePathString; });\n__webpack_require__.d(__webpack_exports__, \"c\", function() { return /* reexport */ pathToAbsolute; });\n__webpack_require__.d(__webpack_exports__, \"d\", function() { return /* reexport */ getSegments; });\n\n// UNUSED EXPORTS: parsePath, fillPath, fillPathByDiff, formatPath, pathIntersection, parsePathArray, path2Curve, reactPath, getArcParams, getLineIntersect, isPolygonsIntersect, isPointInPolygon\n\n// EXTERNAL MODULE: ./node_modules/@antv/util/esm/index.js + 110 modules\nvar esm = __webpack_require__(0);\n\n// CONCATENATED MODULE: ./node_modules/@antv/path-util/esm/parse-path.js\n\nvar regexTags = /[MLHVQTCSAZ]([^MLHVQTCSAZ]*)/ig;\nvar regexDot = /[^\\s\\,]+/ig;\nfunction parsePath(p) {\n var path = p || [];\n if (Object(esm[\"isArray\"])(path)) {\n return path;\n }\n if (Object(esm[\"isString\"])(path)) {\n path = path.match(regexTags);\n Object(esm[\"each\"])(path, function (item, index) {\n // @ts-ignore\n item = item.match(regexDot);\n if (item[0].length > 1) {\n var tag = item[0].charAt(0);\n // @ts-ignore\n item.splice(1, 0, item[0].substr(1));\n // @ts-ignore\n item[0] = tag;\n }\n // @ts-ignore\n Object(esm[\"each\"])(item, function (sub, i) {\n if (!isNaN(sub)) {\n // @ts-ignore\n item[i] = +sub;\n }\n });\n // @ts-ignore\n path[index] = item;\n });\n return path;\n }\n}\n/* harmony default export */ var parse_path = (parsePath);\n//# sourceMappingURL=parse-path.js.map\n// EXTERNAL MODULE: ./node_modules/gl-matrix/esm/index.js + 4 modules\nvar gl_matrix_esm = __webpack_require__(2);\n\n// CONCATENATED MODULE: ./node_modules/@antv/path-util/node_modules/@antv/matrix-util/esm/ext.js\n/**\n * @description 扩展方法,提供 gl-matrix 为提供的方法\n * */\n\nfunction leftTranslate(out, a, v) {\n var transMat = [0, 0, 0, 0, 0, 0, 0, 0, 0];\n gl_matrix_esm[\"a\" /* mat3 */].fromTranslation(transMat, v);\n return gl_matrix_esm[\"a\" /* mat3 */].multiply(out, transMat, a);\n}\nfunction leftRotate(out, a, rad) {\n var rotateMat = [0, 0, 0, 0, 0, 0, 0, 0, 0];\n gl_matrix_esm[\"a\" /* mat3 */].fromRotation(rotateMat, rad);\n return gl_matrix_esm[\"a\" /* mat3 */].multiply(out, rotateMat, a);\n}\nfunction leftScale(out, a, v) {\n var scaleMat = [0, 0, 0, 0, 0, 0, 0, 0, 0];\n gl_matrix_esm[\"a\" /* mat3 */].fromScaling(scaleMat, v);\n return gl_matrix_esm[\"a\" /* mat3 */].multiply(out, scaleMat, a);\n}\nfunction leftMultiply(out, a, a1) {\n return gl_matrix_esm[\"a\" /* mat3 */].multiply(out, a1, a);\n}\n/**\n * 根据 actions 来做 transform\n * @param m\n * @param actions\n */\nfunction transform(m, actions) {\n var matrix = m ? [].concat(m) : [1, 0, 0, 0, 1, 0, 0, 0, 1];\n for (var i = 0, len = actions.length; i < len; i++) {\n var action = actions[i];\n switch (action[0]) {\n case 't':\n leftTranslate(matrix, matrix, [action[1], action[2]]);\n break;\n case 's':\n leftScale(matrix, matrix, [action[1], action[2]]);\n break;\n case 'r':\n leftRotate(matrix, matrix, action[1]);\n break;\n case 'm':\n leftMultiply(matrix, matrix, action[1]);\n break;\n default:\n break;\n }\n }\n return matrix;\n}\n/**\n * 向量 v1 到 向量 v2 夹角的方向\n * @param {Array} v1 向量\n * @param {Array} v2 向量\n * @return {Boolean} >= 0 顺时针 < 0 逆时针\n */\nfunction direction(v1, v2) {\n return v1[0] * v2[1] - v2[0] * v1[1];\n}\n/**\n * 二维向量 v1 到 v2 的夹角\n * @param v1\n * @param v2\n * @param direct\n */\nfunction angleTo(v1, v2, direct) {\n var ang = gl_matrix_esm[\"d\" /* vec2 */].angle(v1, v2);\n var angleLargeThanPI = direction(v1, v2) >= 0;\n if (direct) {\n if (angleLargeThanPI) {\n return Math.PI * 2 - ang;\n }\n return ang;\n }\n if (angleLargeThanPI) {\n return ang;\n }\n return Math.PI * 2 - ang;\n}\n/**\n * 计算二维向量的垂直向量\n * @param out\n * @param v\n * @param flag\n */\nfunction vertical(out, v, flag) {\n if (flag) {\n out[0] = v[1];\n out[1] = -1 * v[0];\n }\n else {\n out[0] = -1 * v[1];\n out[1] = v[0];\n }\n return out;\n}\n//# sourceMappingURL=ext.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/path-util/node_modules/@antv/matrix-util/esm/index.js\n\n\n\n//# sourceMappingURL=index.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/path-util/esm/catmull-rom-2-bezier.js\n\nfunction smoothBezier(points, smooth, isLoop, constraint) {\n var cps = [];\n var hasConstraint = !!constraint;\n var prevPoint;\n var nextPoint;\n var min;\n var max;\n var nextCp0;\n var cp1;\n var cp0;\n if (hasConstraint) {\n min = constraint[0], max = constraint[1];\n for (var i = 0, l = points.length; i < l; i += 1) {\n var point = points[i];\n min = gl_matrix_esm[\"d\" /* vec2 */].min([0, 0], min, point);\n max = gl_matrix_esm[\"d\" /* vec2 */].max([0, 0], max, point);\n }\n }\n for (var i = 0, len = points.length; i < len; i += 1) {\n var point = points[i];\n if (i === 0 && !isLoop) {\n cp0 = point;\n }\n else if (i === len - 1 && !isLoop) {\n cp1 = point;\n cps.push(cp0);\n cps.push(cp1);\n }\n else {\n var prevIdx = [i ? i - 1 : len - 1, i - 1][isLoop ? 0 : 1];\n prevPoint = points[prevIdx];\n nextPoint = points[isLoop ? (i + 1) % len : i + 1];\n var v = [0, 0];\n v = gl_matrix_esm[\"d\" /* vec2 */].sub(v, nextPoint, prevPoint);\n v = gl_matrix_esm[\"d\" /* vec2 */].scale(v, v, smooth);\n var d0 = gl_matrix_esm[\"d\" /* vec2 */].distance(point, prevPoint);\n var d1 = gl_matrix_esm[\"d\" /* vec2 */].distance(point, nextPoint);\n var sum = d0 + d1;\n if (sum !== 0) {\n d0 /= sum;\n d1 /= sum;\n }\n var v1 = gl_matrix_esm[\"d\" /* vec2 */].scale([0, 0], v, -d0);\n var v2 = gl_matrix_esm[\"d\" /* vec2 */].scale([0, 0], v, d1);\n cp1 = gl_matrix_esm[\"d\" /* vec2 */].add([0, 0], point, v1);\n nextCp0 = gl_matrix_esm[\"d\" /* vec2 */].add([0, 0], point, v2);\n // 下一个控制点必须在这个点和下一个点之间\n nextCp0 = gl_matrix_esm[\"d\" /* vec2 */].min([0, 0], nextCp0, gl_matrix_esm[\"d\" /* vec2 */].max([0, 0], nextPoint, point));\n nextCp0 = gl_matrix_esm[\"d\" /* vec2 */].max([0, 0], nextCp0, gl_matrix_esm[\"d\" /* vec2 */].min([0, 0], nextPoint, point));\n // 重新计算 cp1 的值\n v1 = gl_matrix_esm[\"d\" /* vec2 */].sub([0, 0], nextCp0, point);\n v1 = gl_matrix_esm[\"d\" /* vec2 */].scale([0, 0], v1, -d0 / d1);\n cp1 = gl_matrix_esm[\"d\" /* vec2 */].add([0, 0], point, v1);\n // 上一个控制点必须要在上一个点和这一个点之间\n cp1 = gl_matrix_esm[\"d\" /* vec2 */].min([0, 0], cp1, gl_matrix_esm[\"d\" /* vec2 */].max([0, 0], prevPoint, point));\n cp1 = gl_matrix_esm[\"d\" /* vec2 */].max([0, 0], cp1, gl_matrix_esm[\"d\" /* vec2 */].min([0, 0], prevPoint, point));\n // 重新计算 nextCp0 的值\n v2 = gl_matrix_esm[\"d\" /* vec2 */].sub([0, 0], point, cp1);\n v2 = gl_matrix_esm[\"d\" /* vec2 */].scale([0, 0], v2, d1 / d0);\n nextCp0 = gl_matrix_esm[\"d\" /* vec2 */].add([0, 0], point, v2);\n if (hasConstraint) {\n cp1 = gl_matrix_esm[\"d\" /* vec2 */].max([0, 0], cp1, min);\n cp1 = gl_matrix_esm[\"d\" /* vec2 */].min([0, 0], cp1, max);\n nextCp0 = gl_matrix_esm[\"d\" /* vec2 */].max([0, 0], nextCp0, min);\n nextCp0 = gl_matrix_esm[\"d\" /* vec2 */].min([0, 0], nextCp0, max);\n }\n cps.push(cp0);\n cps.push(cp1);\n cp0 = nextCp0;\n }\n }\n if (isLoop) {\n cps.push(cps.shift());\n }\n return cps;\n}\n/**\n * create bezier spline from catmull rom spline\n * @param {Array} crp Catmull Rom Points\n * @param {boolean} z Spline is loop\n * @param {Array} constraint Constraint\n */\nfunction catmullRom2Bezier(crp, z, constraint) {\n if (z === void 0) { z = false; }\n if (constraint === void 0) { constraint = [\n [0, 0],\n [1, 1],\n ]; }\n var isLoop = !!z;\n var pointList = [];\n for (var i = 0, l = crp.length; i < l; i += 2) {\n pointList.push([crp[i], crp[i + 1]]);\n }\n var controlPointList = smoothBezier(pointList, 0.4, isLoop, constraint);\n var len = pointList.length;\n var d1 = [];\n var cp1;\n var cp2;\n var p;\n for (var i = 0; i < len - 1; i += 1) {\n cp1 = controlPointList[i * 2];\n cp2 = controlPointList[i * 2 + 1];\n p = pointList[i + 1];\n d1.push(['C', cp1[0], cp1[1], cp2[0], cp2[1], p[0], p[1]]);\n }\n if (isLoop) {\n cp1 = controlPointList[len];\n cp2 = controlPointList[len + 1];\n p = pointList[0];\n d1.push(['C', cp1[0], cp1[1], cp2[0], cp2[1], p[0], p[1]]);\n }\n return d1;\n}\n/* harmony default export */ var catmull_rom_2_bezier = (catmullRom2Bezier);\n//# sourceMappingURL=catmull-rom-2-bezier.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/path-util/esm/fill-path.js\nfunction decasteljau(points, t) {\n var left = [];\n var right = [];\n function recurse(points, t) {\n if (points.length === 1) {\n left.push(points[0]);\n right.push(points[0]);\n }\n else {\n var middlePoints = [];\n for (var i = 0; i < points.length - 1; i++) {\n if (i === 0) {\n left.push(points[0]);\n }\n if (i === points.length - 2) {\n right.push(points[i + 1]);\n }\n middlePoints[i] = [(1 - t) * points[i][0] + t * points[i + 1][0], (1 - t) * points[i][1] + t * points[i + 1][1]];\n }\n recurse(middlePoints, t);\n }\n }\n if (points.length) {\n recurse(points, t);\n }\n return { left: left, right: right.reverse() };\n}\nfunction splitCurve(start, end, count) {\n var points = [[start[1], start[2]]];\n count = count || 2;\n var segments = [];\n if (end[0] === 'A') {\n points.push(end[6]);\n points.push(end[7]);\n }\n else if (end[0] === 'C') {\n points.push([end[1], end[2]]);\n points.push([end[3], end[4]]);\n points.push([end[5], end[6]]);\n }\n else if (end[0] === 'S' || end[0] === 'Q') {\n points.push([end[1], end[2]]);\n points.push([end[3], end[4]]);\n }\n else {\n points.push([end[1], end[2]]);\n }\n var leftSegments = points;\n var t = 1 / count;\n for (var i = 0; i < count - 1; i++) {\n var rt = t / (1 - t * i);\n var split = decasteljau(leftSegments, rt);\n segments.push(split.left);\n leftSegments = split.right;\n }\n segments.push(leftSegments);\n var result = segments.map(function (segment) {\n var cmd = [];\n if (segment.length === 4) {\n cmd.push('C');\n cmd = cmd.concat(segment[2]);\n }\n if (segment.length >= 3) {\n if (segment.length === 3) {\n cmd.push('Q');\n }\n cmd = cmd.concat(segment[1]);\n }\n if (segment.length === 2) {\n cmd.push('L');\n }\n cmd = cmd.concat(segment[segment.length - 1]);\n return cmd;\n });\n return result;\n}\nfunction splitSegment(start, end, count) {\n if (count === 1) {\n return [[].concat(start)];\n }\n var segments = [];\n if (end[0] === 'L' || end[0] === 'C' || end[0] === 'Q') {\n segments = segments.concat(splitCurve(start, end, count));\n }\n else {\n var temp = [].concat(start);\n if (temp[0] === 'M') {\n temp[0] = 'L';\n }\n for (var i = 0; i <= count - 1; i++) {\n segments.push(temp);\n }\n }\n return segments;\n}\nfunction fillPath(source, target) {\n if (source.length === 1) {\n return source;\n }\n var sourceLen = source.length - 1;\n var targetLen = target.length - 1;\n var ratio = sourceLen / targetLen;\n var segmentsToFill = [];\n if (source.length === 1 && source[0][0] === 'M') {\n for (var i = 0; i < targetLen - sourceLen; i++) {\n source.push(source[0]);\n }\n return source;\n }\n for (var i = 0; i < targetLen; i++) {\n var index = Math.floor(ratio * i);\n segmentsToFill[index] = (segmentsToFill[index] || 0) + 1;\n }\n var filled = segmentsToFill.reduce(function (filled, count, i) {\n if (i === sourceLen) {\n return filled.concat(source[sourceLen]);\n }\n return filled.concat(splitSegment(source[i], source[i + 1], count));\n }, []);\n filled.unshift(source[0]);\n if (target[targetLen] === 'Z' || target[targetLen] === 'z') {\n filled.push('Z');\n }\n return filled;\n}\n//# sourceMappingURL=fill-path.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/path-util/esm/fill-path-by-diff.js\n\nfunction getMinDiff(del, add, modify) {\n var type = null;\n var min = modify;\n if (add < min) {\n min = add;\n type = 'add';\n }\n if (del < min) {\n min = del;\n type = 'del';\n }\n return {\n type: type,\n min: min,\n };\n}\n/*\n * https://en.wikipedia.org/wiki/Levenshtein_distance\n * 计算两条path的编辑距离\n */\nvar levenshteinDistance = function (source, target) {\n var sourceLen = source.length;\n var targetLen = target.length;\n var sourceSegment, targetSegment;\n var temp = 0;\n if (sourceLen === 0 || targetLen === 0) {\n return null;\n }\n var dist = [];\n for (var i = 0; i <= sourceLen; i++) {\n dist[i] = [];\n dist[i][0] = { min: i };\n }\n for (var j = 0; j <= targetLen; j++) {\n dist[0][j] = { min: j };\n }\n for (var i = 1; i <= sourceLen; i++) {\n sourceSegment = source[i - 1];\n for (var j = 1; j <= targetLen; j++) {\n targetSegment = target[j - 1];\n if (Object(esm[\"isEqual\"])(sourceSegment, targetSegment)) {\n temp = 0;\n }\n else {\n temp = 1;\n }\n var del = dist[i - 1][j].min + 1;\n var add = dist[i][j - 1].min + 1;\n var modify = dist[i - 1][j - 1].min + temp;\n dist[i][j] = getMinDiff(del, add, modify);\n }\n }\n return dist;\n};\nfunction fillPathByDiff(source, target) {\n var diffMatrix = levenshteinDistance(source, target);\n var sourceLen = source.length;\n var targetLen = target.length;\n var changes = [];\n var index = 1;\n var minPos = 1;\n // 如果source和target不是完全不相等\n // @ts-ignore\n if (diffMatrix[sourceLen][targetLen] !== sourceLen) {\n // 获取从source到target所需改动\n for (var i = 1; i <= sourceLen; i++) {\n var min = diffMatrix[i][i].min;\n minPos = i;\n for (var j = index; j <= targetLen; j++) {\n if (diffMatrix[i][j].min < min) {\n min = diffMatrix[i][j].min;\n minPos = j;\n }\n }\n index = minPos;\n if (diffMatrix[i][index].type) {\n changes.push({ index: i - 1, type: diffMatrix[i][index].type });\n }\n }\n // 对source进行增删path\n for (var i = changes.length - 1; i >= 0; i--) {\n index = changes[i].index;\n if (changes[i].type === 'add') {\n // @ts-ignore\n source.splice(index, 0, [].concat(source[index]));\n }\n else {\n // @ts-ignore\n source.splice(index, 1);\n }\n }\n }\n // source尾部补齐\n sourceLen = source.length;\n if (sourceLen < targetLen) {\n for (var i = 0; i < (targetLen - sourceLen); i++) {\n if (source[sourceLen - 1][0] === 'z' || source[sourceLen - 1][0] === 'Z') {\n // @ts-ignore\n source.splice(sourceLen - 2, 0, source[sourceLen - 2]);\n }\n else {\n // @ts-ignore\n source.push(source[sourceLen - 1]);\n }\n }\n }\n return source;\n}\n//# sourceMappingURL=fill-path-by-diff.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/path-util/esm/format-path.js\n/*\n * 抽取pathSegment中的关键点\n * M,L,A,Q,H,V一个端点\n * Q, S抽取一个端点,一个控制点\n * C抽取一个端点,两个控制点\n */\nfunction _getSegmentPoints(segment) {\n var points = [];\n switch (segment[0]) {\n case 'M':\n points.push([segment[1], segment[2]]);\n break;\n case 'L':\n points.push([segment[1], segment[2]]);\n break;\n case 'A':\n points.push([segment[6], segment[7]]);\n break;\n case 'Q':\n points.push([segment[3], segment[4]]);\n points.push([segment[1], segment[2]]);\n break;\n case 'T':\n points.push([segment[1], segment[2]]);\n break;\n case 'C':\n points.push([segment[5], segment[6]]);\n points.push([segment[1], segment[2]]);\n points.push([segment[3], segment[4]]);\n break;\n case 'S':\n points.push([segment[3], segment[4]]);\n points.push([segment[1], segment[2]]);\n break;\n case 'H':\n points.push([segment[1], segment[1]]);\n break;\n case 'V':\n points.push([segment[1], segment[1]]);\n break;\n default:\n }\n return points;\n}\n// 将两个点均分成count个点\nfunction _splitPoints(points, former, count) {\n var result = [].concat(points);\n var index;\n var t = 1 / (count + 1);\n var formerEnd = _getSegmentPoints(former)[0];\n for (var i = 1; i <= count; i++) {\n t *= i;\n index = Math.floor(points.length * t);\n if (index === 0) {\n result.unshift([formerEnd[0] * t + points[index][0] * (1 - t), formerEnd[1] * t + points[index][1] * (1 - t)]);\n }\n else {\n result.splice(index, 0, [formerEnd[0] * t + points[index][0] * (1 - t), formerEnd[1] * t + points[index][1] * (1 - t)]);\n }\n }\n return result;\n}\nfunction formatPath(fromPath, toPath) {\n if (fromPath.length <= 1) {\n return fromPath;\n }\n var points;\n for (var i = 0; i < toPath.length; i++) {\n if (fromPath[i][0] !== toPath[i][0]) {\n // 获取fromPath的pathSegment的端点,根据toPath的指令对其改造\n points = _getSegmentPoints(fromPath[i]);\n switch (toPath[i][0]) {\n case 'M':\n fromPath[i] = ['M'].concat(points[0]);\n break;\n case 'L':\n fromPath[i] = ['L'].concat(points[0]);\n break;\n case 'A':\n fromPath[i] = [].concat(toPath[i]);\n fromPath[i][6] = points[0][0];\n fromPath[i][7] = points[0][1];\n break;\n case 'Q':\n if (points.length < 2) {\n if (i > 0) {\n points = _splitPoints(points, fromPath[i - 1], 1);\n }\n else {\n fromPath[i] = toPath[i];\n break;\n }\n }\n fromPath[i] = ['Q'].concat(points.reduce(function (arr, i) { return arr.concat(i); }, []));\n break;\n case 'T':\n fromPath[i] = ['T'].concat(points[0]);\n break;\n case 'C':\n if (points.length < 3) {\n if (i > 0) {\n points = _splitPoints(points, fromPath[i - 1], 2);\n }\n else {\n fromPath[i] = toPath[i];\n break;\n }\n }\n fromPath[i] = ['C'].concat(points.reduce(function (arr, i) { return arr.concat(i); }, []));\n break;\n case 'S':\n if (points.length < 2) {\n if (i > 0) {\n points = _splitPoints(points, fromPath[i - 1], 1);\n }\n else {\n fromPath[i] = toPath[i];\n break;\n }\n }\n fromPath[i] = ['S'].concat(points.reduce(function (arr, i) { return arr.concat(i); }, []));\n break;\n default:\n fromPath[i] = toPath[i];\n }\n }\n }\n return fromPath;\n}\n//# sourceMappingURL=format-path.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/path-util/esm/rect-path.js\nfunction rectPath(x, y, w, h, r) {\n if (r) {\n return [\n ['M', +x + (+r), y],\n ['l', w - r * 2, 0],\n ['a', r, r, 0, 0, 1, r, r],\n ['l', 0, h - r * 2],\n ['a', r, r, 0, 0, 1, -r, r],\n ['l', r * 2 - w, 0],\n ['a', r, r, 0, 0, 1, -r, -r],\n ['l', 0, r * 2 - h],\n ['a', r, r, 0, 0, 1, r, -r],\n ['z'],\n ];\n }\n return [\n ['M', x, y],\n ['l', w, 0],\n ['l', 0, h],\n ['l', -w, 0],\n ['z'],\n ];\n // res.parsePathArray = parsePathArray;\n}\n//# sourceMappingURL=rect-path.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/path-util/esm/parse-path-string.js\n\nvar SPACES = '\\x09\\x0a\\x0b\\x0c\\x0d\\x20\\xa0\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\u2028\\u2029';\nvar PATH_COMMAND = new RegExp('([a-z])[' + SPACES + ',]*((-?\\\\d*\\\\.?\\\\d*(?:e[\\\\-+]?\\\\d+)?[' + SPACES + ']*,?[' + SPACES + ']*)+)', 'ig');\nvar PATH_VALUES = new RegExp('(-?\\\\d*\\\\.?\\\\d*(?:e[\\\\-+]?\\\\d+)?)[' + SPACES + ']*,?[' + SPACES + ']*', 'ig');\n// Parses given path string into an array of arrays of path segments\nfunction parsePathString(pathString) {\n if (!pathString) {\n return null;\n }\n if (Object(esm[\"isArray\"])(pathString)) {\n return pathString;\n }\n var paramCounts = {\n a: 7,\n c: 6,\n o: 2,\n h: 1,\n l: 2,\n m: 2,\n r: 4,\n q: 4,\n s: 4,\n t: 2,\n v: 1,\n u: 3,\n z: 0,\n };\n var data = [];\n String(pathString).replace(PATH_COMMAND, function (a, b, c) {\n var params = [];\n var name = b.toLowerCase();\n c.replace(PATH_VALUES, function (a, b) {\n b && params.push(+b);\n });\n if (name === 'm' && params.length > 2) {\n data.push([b].concat(params.splice(0, 2)));\n name = 'l';\n b = b === 'm' ? 'l' : 'L';\n }\n if (name === 'o' && params.length === 1) {\n data.push([b, params[0]]);\n }\n if (name === 'r') {\n data.push([b].concat(params));\n }\n else {\n while (params.length >= paramCounts[name]) {\n data.push([b].concat(params.splice(0, paramCounts[name])));\n if (!paramCounts[name]) {\n break;\n }\n }\n }\n return '';\n });\n return data;\n}\n//# sourceMappingURL=parse-path-string.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/path-util/esm/path-2-absolute.js\n\nvar REGEX_MD = /[a-z]/;\nfunction toSymmetry(p, c) {\n return [\n c[0] + (c[0] - p[0]),\n c[1] + (c[1] - p[1]),\n ];\n}\nfunction pathToAbsolute(pathString) {\n var pathArray = parsePathString(pathString);\n if (!pathArray || !pathArray.length) {\n return [\n ['M', 0, 0],\n ];\n }\n var needProcess = false; // 如果存在小写的命令或者 V,H,T,S 则需要处理\n for (var i = 0; i < pathArray.length; i++) {\n var cmd = pathArray[i][0];\n // 如果存在相对位置的命令,则中断返回\n if (REGEX_MD.test(cmd) || ['V', 'H', 'T', 'S'].indexOf(cmd) >= 0) {\n needProcess = true;\n break;\n }\n }\n // 如果不存在相对命令,则直接返回\n // 如果在业务上都写绝对路径,这种方式最快,仅做了一次检测\n if (!needProcess) {\n return pathArray;\n }\n var res = [];\n var x = 0;\n var y = 0;\n var mx = 0;\n var my = 0;\n var start = 0;\n var pa0;\n var dots;\n var first = pathArray[0];\n if (first[0] === 'M' || first[0] === 'm') {\n x = +first[1];\n y = +first[2];\n mx = x;\n my = y;\n start++;\n res[0] = ['M', x, y];\n }\n for (var i = start, ii = pathArray.length; i < ii; i++) {\n var pa = pathArray[i];\n var preParams = res[i - 1]; // 取前一个已经处理后的节点,否则会出现问题\n var r = [];\n var cmd = pa[0];\n var upCmd = cmd.toUpperCase();\n if (cmd !== upCmd) {\n r[0] = upCmd;\n switch (upCmd) {\n case 'A':\n r[1] = pa[1];\n r[2] = pa[2];\n r[3] = pa[3];\n r[4] = pa[4];\n r[5] = pa[5];\n r[6] = +pa[6] + x;\n r[7] = +pa[7] + y;\n break;\n case 'V':\n r[1] = +pa[1] + y;\n break;\n case 'H':\n r[1] = +pa[1] + x;\n break;\n case 'M':\n mx = +pa[1] + x;\n my = +pa[2] + y;\n r[1] = mx;\n r[2] = my;\n break; // for lint\n default:\n for (var j = 1, jj = pa.length; j < jj; j++) {\n r[j] = +pa[j] + ((j % 2) ? x : y);\n }\n }\n }\n else { // 如果本来已经大写,则不处理\n r = pathArray[i];\n }\n // 需要在外面统一做,同时处理 V,H,S,T 等特殊指令\n switch (upCmd) {\n case 'Z':\n x = +mx;\n y = +my;\n break;\n case 'H':\n x = r[1];\n r = ['L', x, y];\n break;\n case 'V':\n y = r[1];\n r = ['L', x, y];\n break;\n case 'T':\n x = r[1];\n y = r[2];\n // 以 x, y 为中心的,上一个控制点的对称点\n // 需要假设上一个节点的命令为 Q\n var symetricT = toSymmetry([preParams[1], preParams[2]], [preParams[3], preParams[4]]);\n r = ['Q', symetricT[0], symetricT[1], x, y];\n break;\n case 'S':\n x = r[r.length - 2];\n y = r[r.length - 1];\n // 以 x,y 为中心,取上一个控制点,\n // 需要假设上一个线段为 C 或者 S\n var length_1 = preParams.length;\n var symetricS = toSymmetry([preParams[length_1 - 4], preParams[length_1 - 3]], [preParams[length_1 - 2], preParams[length_1 - 1]]);\n r = ['C', symetricS[0], symetricS[1], r[1], r[2], x, y];\n break;\n case 'M':\n mx = r[r.length - 2];\n my = r[r.length - 1];\n break; // for lint\n default:\n x = r[r.length - 2];\n y = r[r.length - 1];\n }\n res.push(r);\n }\n return res;\n}\n//# sourceMappingURL=path-2-absolute.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/path-util/esm/process/arc-2-cubic.js\nvar TAU = Math.PI * 2;\nvar mapToEllipse = function (_a, rx, ry, cosphi, sinphi, centerx, centery) {\n var x = _a.x, y = _a.y;\n x *= rx;\n y *= ry;\n var xp = cosphi * x - sinphi * y;\n var yp = sinphi * x + cosphi * y;\n return {\n x: xp + centerx,\n y: yp + centery\n };\n};\nvar approxUnitArc = function (ang1, ang2) {\n // If 90 degree circular arc, use a constant\n // as derived from http://spencermortensen.com/articles/bezier-circle\n var a = ang2 === 1.5707963267948966\n ? 0.551915024494\n : ang2 === -1.5707963267948966\n ? -0.551915024494\n : 4 / 3 * Math.tan(ang2 / 4);\n var x1 = Math.cos(ang1);\n var y1 = Math.sin(ang1);\n var x2 = Math.cos(ang1 + ang2);\n var y2 = Math.sin(ang1 + ang2);\n return [\n {\n x: x1 - y1 * a,\n y: y1 + x1 * a\n },\n {\n x: x2 + y2 * a,\n y: y2 - x2 * a\n },\n {\n x: x2,\n y: y2\n }\n ];\n};\nvar vectorAngle = function (ux, uy, vx, vy) {\n var sign = (ux * vy - uy * vx < 0) ? -1 : 1;\n var dot = ux * vx + uy * vy;\n if (dot > 1) {\n dot = 1;\n }\n if (dot < -1) {\n dot = -1;\n }\n return sign * Math.acos(dot);\n};\nvar getArcCenter = function (px, py, cx, cy, rx, ry, largeArcFlag, sweepFlag, sinphi, cosphi, pxp, pyp) {\n var rxsq = Math.pow(rx, 2);\n var rysq = Math.pow(ry, 2);\n var pxpsq = Math.pow(pxp, 2);\n var pypsq = Math.pow(pyp, 2);\n var radicant = (rxsq * rysq) - (rxsq * pypsq) - (rysq * pxpsq);\n if (radicant < 0) {\n radicant = 0;\n }\n radicant /= (rxsq * pypsq) + (rysq * pxpsq);\n radicant = Math.sqrt(radicant) * (largeArcFlag === sweepFlag ? -1 : 1);\n var centerxp = radicant * rx / ry * pyp;\n var centeryp = radicant * -ry / rx * pxp;\n var centerx = cosphi * centerxp - sinphi * centeryp + (px + cx) / 2;\n var centery = sinphi * centerxp + cosphi * centeryp + (py + cy) / 2;\n var vx1 = (pxp - centerxp) / rx;\n var vy1 = (pyp - centeryp) / ry;\n var vx2 = (-pxp - centerxp) / rx;\n var vy2 = (-pyp - centeryp) / ry;\n var ang1 = vectorAngle(1, 0, vx1, vy1);\n var ang2 = vectorAngle(vx1, vy1, vx2, vy2);\n if (sweepFlag === 0 && ang2 > 0) {\n ang2 -= TAU;\n }\n if (sweepFlag === 1 && ang2 < 0) {\n ang2 += TAU;\n }\n return [centerx, centery, ang1, ang2];\n};\nvar arcToBezier = function (_a) {\n var px = _a.px, py = _a.py, cx = _a.cx, cy = _a.cy, rx = _a.rx, ry = _a.ry, _b = _a.xAxisRotation, xAxisRotation = _b === void 0 ? 0 : _b, _c = _a.largeArcFlag, largeArcFlag = _c === void 0 ? 0 : _c, _d = _a.sweepFlag, sweepFlag = _d === void 0 ? 0 : _d;\n var curves = [];\n if (rx === 0 || ry === 0) {\n return [{ x1: 0, y1: 0, x2: 0, y2: 0, x: cx, y: cy }];\n }\n var sinphi = Math.sin(xAxisRotation * TAU / 360);\n var cosphi = Math.cos(xAxisRotation * TAU / 360);\n var pxp = cosphi * (px - cx) / 2 + sinphi * (py - cy) / 2;\n var pyp = -sinphi * (px - cx) / 2 + cosphi * (py - cy) / 2;\n if (pxp === 0 && pyp === 0) {\n return [{ x1: 0, y1: 0, x2: 0, y2: 0, x: cx, y: cy }];\n }\n rx = Math.abs(rx);\n ry = Math.abs(ry);\n var lambda = Math.pow(pxp, 2) / Math.pow(rx, 2) +\n Math.pow(pyp, 2) / Math.pow(ry, 2);\n if (lambda > 1) {\n rx *= Math.sqrt(lambda);\n ry *= Math.sqrt(lambda);\n }\n var _e = getArcCenter(px, py, cx, cy, rx, ry, largeArcFlag, sweepFlag, sinphi, cosphi, pxp, pyp), centerx = _e[0], centery = _e[1], ang1 = _e[2], ang2 = _e[3];\n // If 'ang2' == 90.0000000001, then `ratio` will evaluate to\n // 1.0000000001. This causes `segments` to be greater than one, which is an\n // unecessary split, and adds extra points to the bezier curve. To alleviate\n // this issue, we round to 1.0 when the ratio is close to 1.0.\n var ratio = Math.abs(ang2) / (TAU / 4);\n if (Math.abs(1.0 - ratio) < 0.0000001) {\n ratio = 1.0;\n }\n var segments = Math.max(Math.ceil(ratio), 1);\n ang2 /= segments;\n for (var i = 0; i < segments; i++) {\n curves.push(approxUnitArc(ang1, ang2));\n ang1 += ang2;\n }\n return curves.map(function (curve) {\n var _a = mapToEllipse(curve[0], rx, ry, cosphi, sinphi, centerx, centery), x1 = _a.x, y1 = _a.y;\n var _b = mapToEllipse(curve[1], rx, ry, cosphi, sinphi, centerx, centery), x2 = _b.x, y2 = _b.y;\n var _c = mapToEllipse(curve[2], rx, ry, cosphi, sinphi, centerx, centery), x = _c.x, y = _c.y;\n return { x1: x1, y1: y1, x2: x2, y2: y2, x: x, y: y };\n });\n};\nfunction arcToCubic(x1, y1, rx, ry, angle, LAF, SF, x2, y2) {\n var curves = arcToBezier({\n px: x1,\n py: y1,\n cx: x2,\n cy: y2,\n rx: rx,\n ry: ry,\n xAxisRotation: angle,\n largeArcFlag: LAF,\n sweepFlag: SF,\n });\n return curves.reduce(function (prev, cur) {\n var x1 = cur.x1, y1 = cur.y1, x2 = cur.x2, y2 = cur.y2, x = cur.x, y = cur.y;\n prev.push(x1, y1, x2, y2, x, y);\n return prev;\n }, []);\n}\n//# sourceMappingURL=arc-2-cubic.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/path-util/esm/process/quad-2-cubic.js\nfunction quadToCubic(x1, y1, qx, qy, x2, y2) {\n var r13 = 1 / 3;\n var r23 = 2 / 3;\n return [\n r13 * x1 + r23 * qx,\n r13 * y1 + r23 * qy,\n r13 * x2 + r23 * qx,\n r13 * y2 + r23 * qy,\n x2, y2, // x,y\n ];\n}\n//# sourceMappingURL=quad-2-cubic.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/path-util/esm/process/line-2-cubic.js\n// export function getPointAtSegLength(p1x: number, p1y: number, c1x: number, c1y: number, c2x: number, c2y: number, p2x: number, p2y: number, t: number) {\n// const t1 = 1 - t;\n// return {\n// x: (t1 ** 3) * p1x\n// + t1 * t1 * 3 * t * c1x\n// + t1 * 3 * t * t * c2x\n// + (t ** 3) * p2x,\n// y: (t1 ** 3) * p1y\n// + t1 * t1 * 3 * t * c1y\n// + t1 * 3 * t * t * c2y\n// + (t ** 3) * p2y,\n// };\n// }\n// export function midPoint(a: number[], b: number[], t: number) {\n// const ax = a[0];\n// const ay = a[1];\n// const bx = b[0];\n// const by = b[1];\n// return [ax + (bx - ax) * t, ay + (by - ay) * t];\n// }\nfunction lineToCubic(x1, y1, x2, y2) {\n return [x1, y1, x2, y2, x2, y2];\n // const t = 0.5;\n // const p0 = [x1, y1];\n // const p1 = [x2, y2];\n // const p2 = midPoint(p0, p1, t);\n // const p3 = midPoint(p1, p2, t);\n // const p4 = midPoint(p2, p3, t);\n // const p5 = midPoint(p3, p4, t);\n // const p6 = midPoint(p4, p5, t);\n // const cp1 = getPointAtSegLength.apply(0, p0.concat(p2, p4, p6, t));\n // const cp2 = getPointAtSegLength.apply(0, p6.concat(p5, p3, p1, 0));\n // return [cp1.x, cp1.y, cp2.x, cp2.y, x2, y2];\n}\n//# sourceMappingURL=line-2-cubic.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/path-util/esm/process/segment-2-cubic.js\n\n\n\nfunction segmentToCubic(segment, params) {\n if ('TQ'.indexOf(segment[0]) < 0) {\n params.qx = null;\n params.qy = null;\n }\n var _a = segment.slice(1), s1 = _a[0], s2 = _a[1];\n switch (segment[0]) {\n case 'M':\n params.x = s1;\n params.y = s2;\n return segment;\n case 'A':\n return ['C'].concat(arcToCubic.apply(0, [params.x1, params.y1].concat(segment.slice(1))));\n case 'Q':\n params.qx = s1;\n params.qy = s2;\n return ['C'].concat(quadToCubic.apply(0, [params.x1, params.y1].concat(segment.slice(1))));\n case 'L':\n // @ts-ignore\n return ['C'].concat(lineToCubic(params.x1, params.y1, segment[1], segment[2]));\n case 'H':\n // @ts-ignore\n return ['C'].concat(lineToCubic(params.x1, params.y1, segment[1], params.y1));\n case 'V':\n // @ts-ignore\n return ['C'].concat(lineToCubic(params.x1, params.y1, params.x1, segment[1]));\n case 'Z':\n // @ts-ignore\n return ['C'].concat(lineToCubic(params.x1, params.y1, params.x, params.y));\n default:\n }\n return segment;\n}\n//# sourceMappingURL=segment-2-cubic.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/path-util/esm/path-2-curve.js\n\n\nfunction pathToCurve(path, needZCommandIndexes) {\n if (needZCommandIndexes === void 0) { needZCommandIndexes = false; }\n var pathArray = pathToAbsolute(path);\n var params = {\n x1: 0, y1: 0, x2: 0, y2: 0, x: 0, y: 0, qx: null, qy: null,\n };\n var allPathCommands = [];\n var pathCommand = '';\n var ii = pathArray.length;\n var segment;\n var seglen;\n var zCommandIndexes = [];\n for (var i = 0; i < ii; i += 1) {\n if (pathArray[i])\n pathCommand = pathArray[i][0];\n allPathCommands[i] = pathCommand;\n pathArray[i] = segmentToCubic(pathArray[i], params);\n fixArc(pathArray, allPathCommands, i);\n ii = pathArray.length; // solves curveArrays ending in Z\n // keep Z command account for lineJoin\n // @see https://github.com/antvis/util/issues/68\n if (pathCommand === 'Z') {\n zCommandIndexes.push(i);\n }\n segment = pathArray[i];\n seglen = segment.length;\n params.x1 = +segment[seglen - 2];\n params.y1 = +segment[seglen - 1];\n params.x2 = +(segment[seglen - 4]) || params.x1;\n params.y2 = +(segment[seglen - 3]) || params.y1;\n }\n if (needZCommandIndexes) {\n return [pathArray, zCommandIndexes];\n }\n else {\n return pathArray;\n }\n}\nfunction fixArc(pathArray, allPathCommands, i) {\n if (pathArray[i].length > 7) {\n pathArray[i].shift();\n var pi = pathArray[i];\n // const ni = i + 1;\n var ni = i;\n while (pi.length) {\n // if created multiple C:s, their original seg is saved\n allPathCommands[i] = 'A';\n // @ts-ignore\n pathArray.splice(ni += 1, 0, ['C'].concat(pi.splice(0, 6)));\n }\n pathArray.splice(i, 1);\n }\n}\n//# sourceMappingURL=path-2-curve.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/path-util/esm/path-intersection.js\n\n\n\nvar base3 = function (t, p1, p2, p3, p4) {\n var t1 = -3 * p1 + 9 * p2 - 9 * p3 + 3 * p4;\n var t2 = t * t1 + 6 * p1 - 12 * p2 + 6 * p3;\n return t * t2 - 3 * p1 + 3 * p2;\n};\nvar bezlen = function (x1, y1, x2, y2, x3, y3, x4, y4, z) {\n if (z === null) {\n z = 1;\n }\n z = z > 1 ? 1 : z < 0 ? 0 : z;\n var z2 = z / 2;\n var n = 12;\n var Tvalues = [-0.1252, 0.1252, -0.3678, 0.3678, -0.5873, 0.5873, -0.7699, 0.7699, -0.9041, 0.9041, -0.9816, 0.9816];\n var Cvalues = [0.2491, 0.2491, 0.2335, 0.2335, 0.2032, 0.2032, 0.1601, 0.1601, 0.1069, 0.1069, 0.0472, 0.0472];\n var sum = 0;\n for (var i = 0; i < n; i++) {\n var ct = z2 * Tvalues[i] + z2;\n var xbase = base3(ct, x1, x2, x3, x4);\n var ybase = base3(ct, y1, y2, y3, y4);\n var comb = xbase * xbase + ybase * ybase;\n sum += Cvalues[i] * Math.sqrt(comb);\n }\n return z2 * sum;\n};\nvar curveDim = function (x0, y0, x1, y1, x2, y2, x3, y3) {\n var tvalues = [];\n var bounds = [\n [],\n [],\n ];\n var a;\n var b;\n var c;\n var t;\n for (var i = 0; i < 2; ++i) {\n if (i === 0) {\n b = 6 * x0 - 12 * x1 + 6 * x2;\n a = -3 * x0 + 9 * x1 - 9 * x2 + 3 * x3;\n c = 3 * x1 - 3 * x0;\n }\n else {\n b = 6 * y0 - 12 * y1 + 6 * y2;\n a = -3 * y0 + 9 * y1 - 9 * y2 + 3 * y3;\n c = 3 * y1 - 3 * y0;\n }\n if (Math.abs(a) < 1e-12) {\n if (Math.abs(b) < 1e-12) {\n continue;\n }\n t = -c / b;\n if (t > 0 && t < 1) {\n tvalues.push(t);\n }\n continue;\n }\n var b2ac = b * b - 4 * c * a;\n var sqrtb2ac = Math.sqrt(b2ac);\n if (b2ac < 0) {\n continue;\n }\n var t1 = (-b + sqrtb2ac) / (2 * a);\n if (t1 > 0 && t1 < 1) {\n tvalues.push(t1);\n }\n var t2 = (-b - sqrtb2ac) / (2 * a);\n if (t2 > 0 && t2 < 1) {\n tvalues.push(t2);\n }\n }\n var j = tvalues.length;\n var jlen = j;\n var mt;\n while (j--) {\n t = tvalues[j];\n mt = 1 - t;\n bounds[0][j] = (mt * mt * mt * x0) + (3 * mt * mt * t * x1) + (3 * mt * t * t * x2) + (t * t * t * x3);\n bounds[1][j] = (mt * mt * mt * y0) + (3 * mt * mt * t * y1) + (3 * mt * t * t * y2) + (t * t * t * y3);\n }\n bounds[0][jlen] = x0;\n bounds[1][jlen] = y0;\n bounds[0][jlen + 1] = x3;\n bounds[1][jlen + 1] = y3;\n bounds[0].length = bounds[1].length = jlen + 2;\n return {\n min: {\n x: Math.min.apply(0, bounds[0]),\n y: Math.min.apply(0, bounds[1]),\n },\n max: {\n x: Math.max.apply(0, bounds[0]),\n y: Math.max.apply(0, bounds[1]),\n },\n };\n};\nvar intersect = function (x1, y1, x2, y2, x3, y3, x4, y4) {\n if (Math.max(x1, x2) < Math.min(x3, x4) ||\n Math.min(x1, x2) > Math.max(x3, x4) ||\n Math.max(y1, y2) < Math.min(y3, y4) ||\n Math.min(y1, y2) > Math.max(y3, y4)) {\n return;\n }\n var nx = (x1 * y2 - y1 * x2) * (x3 - x4) - (x1 - x2) * (x3 * y4 - y3 * x4);\n var ny = (x1 * y2 - y1 * x2) * (y3 - y4) - (y1 - y2) * (x3 * y4 - y3 * x4);\n var denominator = (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4);\n if (!denominator) {\n return;\n }\n var px = nx / denominator;\n var py = ny / denominator;\n var px2 = +px.toFixed(2);\n var py2 = +py.toFixed(2);\n if (px2 < +Math.min(x1, x2).toFixed(2) ||\n px2 > +Math.max(x1, x2).toFixed(2) ||\n px2 < +Math.min(x3, x4).toFixed(2) ||\n px2 > +Math.max(x3, x4).toFixed(2) ||\n py2 < +Math.min(y1, y2).toFixed(2) ||\n py2 > +Math.max(y1, y2).toFixed(2) ||\n py2 < +Math.min(y3, y4).toFixed(2) ||\n py2 > +Math.max(y3, y4).toFixed(2)) {\n return;\n }\n return {\n x: px,\n y: py,\n };\n};\nvar isPointInsideBBox = function (bbox, x, y) {\n return x >= bbox.x &&\n x <= bbox.x + bbox.width &&\n y >= bbox.y &&\n y <= bbox.y + bbox.height;\n};\nvar box = function (x, y, width, height) {\n if (x === null) {\n x = y = width = height = 0;\n }\n if (y === null) {\n y = x.y;\n width = x.width;\n height = x.height;\n x = x.x;\n }\n return {\n x: x,\n y: y,\n width: width,\n w: width,\n height: height,\n h: height,\n x2: x + width,\n y2: y + height,\n cx: x + width / 2,\n cy: y + height / 2,\n r1: Math.min(width, height) / 2,\n r2: Math.max(width, height) / 2,\n r0: Math.sqrt(width * width + height * height) / 2,\n path: rectPath(x, y, width, height),\n vb: [x, y, width, height].join(' '),\n };\n};\nvar isBBoxIntersect = function (bbox1, bbox2) {\n // @ts-ignore\n bbox1 = box(bbox1);\n // @ts-ignore\n bbox2 = box(bbox2);\n return isPointInsideBBox(bbox2, bbox1.x, bbox1.y) || isPointInsideBBox(bbox2, bbox1.x2, bbox1.y) || isPointInsideBBox(bbox2, bbox1.x, bbox1.y2) || isPointInsideBBox(bbox2, bbox1.x2, bbox1.y2) || isPointInsideBBox(bbox1, bbox2.x, bbox2.y) || isPointInsideBBox(bbox1, bbox2.x2, bbox2.y) || isPointInsideBBox(bbox1, bbox2.x, bbox2.y2) || isPointInsideBBox(bbox1, bbox2.x2, bbox2.y2) || (bbox1.x < bbox2.x2 && bbox1.x > bbox2.x || bbox2.x < bbox1.x2 && bbox2.x > bbox1.x) && (bbox1.y < bbox2.y2 && bbox1.y > bbox2.y || bbox2.y < bbox1.y2 && bbox2.y > bbox1.y);\n};\nvar bezierBBox = function (p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y) {\n if (!Object(esm[\"isArray\"])(p1x)) {\n p1x = [p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y];\n }\n var bbox = curveDim.apply(null, p1x);\n return box(bbox.min.x, bbox.min.y, bbox.max.x - bbox.min.x, bbox.max.y - bbox.min.y);\n};\nvar findDotsAtSegment = function (p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t) {\n var t1 = 1 - t;\n var t13 = Math.pow(t1, 3);\n var t12 = Math.pow(t1, 2);\n var t2 = t * t;\n var t3 = t2 * t;\n var x = t13 * p1x + t12 * 3 * t * c1x + t1 * 3 * t * t * c2x + t3 * p2x;\n var y = t13 * p1y + t12 * 3 * t * c1y + t1 * 3 * t * t * c2y + t3 * p2y;\n var mx = p1x + 2 * t * (c1x - p1x) + t2 * (c2x - 2 * c1x + p1x);\n var my = p1y + 2 * t * (c1y - p1y) + t2 * (c2y - 2 * c1y + p1y);\n var nx = c1x + 2 * t * (c2x - c1x) + t2 * (p2x - 2 * c2x + c1x);\n var ny = c1y + 2 * t * (c2y - c1y) + t2 * (p2y - 2 * c2y + c1y);\n var ax = t1 * p1x + t * c1x;\n var ay = t1 * p1y + t * c1y;\n var cx = t1 * c2x + t * p2x;\n var cy = t1 * c2y + t * p2y;\n var alpha = (90 - Math.atan2(mx - nx, my - ny) * 180 / Math.PI);\n // (mx > nx || my < ny) && (alpha += 180);\n return {\n x: x,\n y: y,\n m: {\n x: mx,\n y: my,\n },\n n: {\n x: nx,\n y: ny,\n },\n start: {\n x: ax,\n y: ay,\n },\n end: {\n x: cx,\n y: cy,\n },\n alpha: alpha,\n };\n};\nvar interHelper = function (bez1, bez2, justCount) {\n // @ts-ignore\n var bbox1 = bezierBBox(bez1);\n // @ts-ignore\n var bbox2 = bezierBBox(bez2);\n if (!isBBoxIntersect(bbox1, bbox2)) {\n return justCount ? 0 : [];\n }\n var l1 = bezlen.apply(0, bez1);\n var l2 = bezlen.apply(0, bez2);\n var n1 = ~~(l1 / 8);\n var n2 = ~~(l2 / 8);\n var dots1 = [];\n var dots2 = [];\n var xy = {};\n var res = justCount ? 0 : [];\n for (var i = 0; i < n1 + 1; i++) {\n var d = findDotsAtSegment.apply(0, bez1.concat(i / n1));\n dots1.push({\n x: d.x,\n y: d.y,\n t: i / n1,\n });\n }\n for (var i = 0; i < n2 + 1; i++) {\n var d = findDotsAtSegment.apply(0, bez2.concat(i / n2));\n dots2.push({\n x: d.x,\n y: d.y,\n t: i / n2,\n });\n }\n for (var i = 0; i < n1; i++) {\n for (var j = 0; j < n2; j++) {\n var di = dots1[i];\n var di1 = dots1[i + 1];\n var dj = dots2[j];\n var dj1 = dots2[j + 1];\n var ci = Math.abs(di1.x - di.x) < 0.001 ? 'y' : 'x';\n var cj = Math.abs(dj1.x - dj.x) < 0.001 ? 'y' : 'x';\n var is = intersect(di.x, di.y, di1.x, di1.y, dj.x, dj.y, dj1.x, dj1.y);\n if (is) {\n if (xy[is.x.toFixed(4)] === is.y.toFixed(4)) {\n continue;\n }\n xy[is.x.toFixed(4)] = is.y.toFixed(4);\n var t1 = di.t + Math.abs((is[ci] - di[ci]) / (di1[ci] - di[ci])) * (di1.t - di.t);\n var t2 = dj.t + Math.abs((is[cj] - dj[cj]) / (dj1[cj] - dj[cj])) * (dj1.t - dj.t);\n if (t1 >= 0 && t1 <= 1 && t2 >= 0 && t2 <= 1) {\n if (justCount) {\n // @ts-ignore\n res++;\n }\n else {\n // @ts-ignore\n res.push({\n x: is.x,\n y: is.y,\n t1: t1,\n t2: t2,\n });\n }\n }\n }\n }\n }\n return res;\n};\nvar interPathHelper = function (path1, path2, justCount) {\n // @ts-ignore\n path1 = pathToCurve(path1);\n // @ts-ignore\n path2 = pathToCurve(path2);\n var x1;\n var y1;\n var x2;\n var y2;\n var x1m;\n var y1m;\n var x2m;\n var y2m;\n var bez1;\n var bez2;\n var res = justCount ? 0 : [];\n for (var i = 0, ii = path1.length; i < ii; i++) {\n var pi = path1[i];\n if (pi[0] === 'M') {\n x1 = x1m = pi[1];\n y1 = y1m = pi[2];\n }\n else {\n if (pi[0] === 'C') {\n bez1 = [x1, y1].concat(pi.slice(1));\n x1 = bez1[6];\n y1 = bez1[7];\n }\n else {\n bez1 = [x1, y1, x1, y1, x1m, y1m, x1m, y1m];\n x1 = x1m;\n y1 = y1m;\n }\n for (var j = 0, jj = path2.length; j < jj; j++) {\n var pj = path2[j];\n if (pj[0] === 'M') {\n x2 = x2m = pj[1];\n y2 = y2m = pj[2];\n }\n else {\n if (pj[0] === 'C') {\n bez2 = [x2, y2].concat(pj.slice(1));\n x2 = bez2[6];\n y2 = bez2[7];\n }\n else {\n bez2 = [x2, y2, x2, y2, x2m, y2m, x2m, y2m];\n x2 = x2m;\n y2 = y2m;\n }\n var intr = interHelper(bez1, bez2, justCount);\n if (justCount) {\n // @ts-ignore\n res += intr;\n }\n else {\n // @ts-ignore\n for (var k = 0, kk = intr.length; k < kk; k++) {\n intr[k].segment1 = i;\n intr[k].segment2 = j;\n intr[k].bez1 = bez1;\n intr[k].bez2 = bez2;\n }\n // @ts-ignore\n res = res.concat(intr);\n }\n }\n }\n }\n }\n return res;\n};\nfunction pathIntersection(path1, path2) {\n // @ts-ignore\n return interPathHelper(path1, path2);\n}\n//# sourceMappingURL=path-intersection.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/path-util/esm/parse-path-array.js\nvar p2s = /,?([a-z]),?/gi;\nfunction parsePathArray(path) {\n return path.join(',').replace(p2s, '$1');\n}\n//# sourceMappingURL=parse-path-array.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/path-util/esm/get-arc-params.js\n\n// 向量长度\nfunction vMag(v) {\n return Math.sqrt(v[0] * v[0] + v[1] * v[1]);\n}\n// u.v/|u||v|,计算夹角的余弦值\nfunction vRatio(u, v) {\n // 当存在一个向量的长度为 0 时,夹角也为 0,即夹角的余弦值为 1\n return vMag(u) * vMag(v) ? (u[0] * v[0] + u[1] * v[1]) / (vMag(u) * vMag(v)) : 1;\n}\n// 向量角度\nfunction vAngle(u, v) {\n return (u[0] * v[1] < u[1] * v[0] ? -1 : 1) * Math.acos(vRatio(u, v));\n}\n/**\n * 判断两个点是否重合,点坐标的格式为 [x, y]\n * @param {Array} point1 第一个点\n * @param {Array} point2 第二个点\n */\nfunction isSamePoint(point1, point2) {\n return point1[0] === point2[0] && point1[1] === point2[1];\n}\n// A 0:rx 1:ry 2:x-axis-rotation 3:large-arc-flag 4:sweep-flag 5: x 6: y\nfunction getArcParams(startPoint, params) {\n var rx = params[1];\n var ry = params[2];\n var xRotation = Object(esm[\"mod\"])(Object(esm[\"toRadian\"])(params[3]), Math.PI * 2);\n var arcFlag = params[4];\n var sweepFlag = params[5];\n // 弧形起点坐标\n var x1 = startPoint[0];\n var y1 = startPoint[1];\n // 弧形终点坐标\n var x2 = params[6];\n var y2 = params[7];\n var xp = (Math.cos(xRotation) * (x1 - x2)) / 2.0 + (Math.sin(xRotation) * (y1 - y2)) / 2.0;\n var yp = (-1 * Math.sin(xRotation) * (x1 - x2)) / 2.0 + (Math.cos(xRotation) * (y1 - y2)) / 2.0;\n var lambda = (xp * xp) / (rx * rx) + (yp * yp) / (ry * ry);\n if (lambda > 1) {\n rx *= Math.sqrt(lambda);\n ry *= Math.sqrt(lambda);\n }\n var diff = rx * rx * (yp * yp) + ry * ry * (xp * xp);\n var f = diff ? Math.sqrt((rx * rx * (ry * ry) - diff) / diff) : 1;\n if (arcFlag === sweepFlag) {\n f *= -1;\n }\n if (isNaN(f)) {\n f = 0;\n }\n // 旋转前的起点坐标,且当长半轴和短半轴的长度为 0 时,坐标按 (0, 0) 处理\n var cxp = ry ? (f * rx * yp) / ry : 0;\n var cyp = rx ? (f * -ry * xp) / rx : 0;\n // 椭圆圆心坐标\n var cx = (x1 + x2) / 2.0 + Math.cos(xRotation) * cxp - Math.sin(xRotation) * cyp;\n var cy = (y1 + y2) / 2.0 + Math.sin(xRotation) * cxp + Math.cos(xRotation) * cyp;\n // 起始点的单位向量\n var u = [(xp - cxp) / rx, (yp - cyp) / ry];\n // 终止点的单位向量\n var v = [(-1 * xp - cxp) / rx, (-1 * yp - cyp) / ry];\n // 计算起始点和圆心的连线,与 x 轴正方向的夹角\n var theta = vAngle([1, 0], u);\n // 计算圆弧起始点和终止点与椭圆圆心连线的夹角\n var dTheta = vAngle(u, v);\n if (vRatio(u, v) <= -1) {\n dTheta = Math.PI;\n }\n if (vRatio(u, v) >= 1) {\n dTheta = 0;\n }\n if (sweepFlag === 0 && dTheta > 0) {\n dTheta = dTheta - 2 * Math.PI;\n }\n if (sweepFlag === 1 && dTheta < 0) {\n dTheta = dTheta + 2 * Math.PI;\n }\n return {\n cx: cx,\n cy: cy,\n // 弧形的起点和终点相同时,长轴和短轴的长度按 0 处理\n rx: isSamePoint(startPoint, [x2, y2]) ? 0 : rx,\n ry: isSamePoint(startPoint, [x2, y2]) ? 0 : ry,\n startAngle: theta,\n endAngle: theta + dTheta,\n xRotation: xRotation,\n arcFlag: arcFlag,\n sweepFlag: sweepFlag,\n };\n}\n//# sourceMappingURL=get-arc-params.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/path-util/esm/path-2-segments.js\n\n\n\n// 点对称\nfunction path_2_segments_toSymmetry(point, center) {\n return [center[0] + (center[0] - point[0]), center[1] + (center[1] - point[1])];\n}\nfunction getSegments(path) {\n path = parse_path(path);\n var segments = [];\n var currentPoint = null; // 当前图形\n var nextParams = null; // 下一节点的 path 参数\n var startMovePoint = null; // 开始 M 的点,可能会有多个\n var lastStartMovePointIndex = 0; // 最近一个开始点 M 的索引\n var count = path.length;\n for (var i = 0; i < count; i++) {\n var params = path[i];\n nextParams = path[i + 1];\n var command = params[0];\n // 数学定义上的参数,便于后面的计算\n var segment = {\n command: command,\n prePoint: currentPoint,\n params: params,\n startTangent: null,\n endTangent: null,\n };\n switch (command) {\n case 'M':\n startMovePoint = [params[1], params[2]];\n lastStartMovePointIndex = i;\n break;\n case 'A':\n var arcParams = getArcParams(currentPoint, params);\n segment['arcParams'] = arcParams;\n break;\n default:\n break;\n }\n if (command === 'Z') {\n // 有了 Z 后,当前节点从开始 M 的点开始\n currentPoint = startMovePoint;\n // 如果当前点的命令为 Z,相当于当前点为最近一个 M 点,则下一个点直接指向最近一个 M 点的下一个点\n nextParams = path[lastStartMovePointIndex + 1];\n }\n else {\n var len = params.length;\n currentPoint = [params[len - 2], params[len - 1]];\n }\n if (nextParams && nextParams[0] === 'Z') {\n // 如果下一个点的命令为 Z,则下一个点直接指向最近一个 M 点\n nextParams = path[lastStartMovePointIndex];\n if (segments[lastStartMovePointIndex]) {\n // 如果下一个点的命令为 Z,则最近一个 M 点的前一个点为当前点\n segments[lastStartMovePointIndex].prePoint = currentPoint;\n }\n }\n segment['currentPoint'] = currentPoint;\n // 如果当前点与最近一个 M 点相同,则最近一个 M 点的前一个点为当前点的前一个点\n if (segments[lastStartMovePointIndex] &&\n isSamePoint(currentPoint, segments[lastStartMovePointIndex].currentPoint)) {\n segments[lastStartMovePointIndex].prePoint = segment.prePoint;\n }\n var nextPoint = nextParams ? [nextParams[nextParams.length - 2], nextParams[nextParams.length - 1]] : null;\n segment['nextPoint'] = nextPoint;\n // Add startTangent and endTangent\n var prePoint = segment.prePoint;\n if (['L', 'H', 'V'].includes(command)) {\n segment.startTangent = [prePoint[0] - currentPoint[0], prePoint[1] - currentPoint[1]];\n segment.endTangent = [currentPoint[0] - prePoint[0], currentPoint[1] - prePoint[1]];\n }\n else if (command === 'Q') {\n // 二次贝塞尔曲线只有一个控制点\n var cp = [params[1], params[2]];\n // 二次贝塞尔曲线的终点为 currentPoint\n segment.startTangent = [prePoint[0] - cp[0], prePoint[1] - cp[1]];\n segment.endTangent = [currentPoint[0] - cp[0], currentPoint[1] - cp[1]];\n }\n else if (command === 'T') {\n var preSegment = segments[i - 1];\n var cp = path_2_segments_toSymmetry(preSegment.currentPoint, prePoint);\n if (preSegment.command === 'Q') {\n segment.command = 'Q';\n segment.startTangent = [prePoint[0] - cp[0], prePoint[1] - cp[1]];\n segment.endTangent = [currentPoint[0] - cp[0], currentPoint[1] - cp[1]];\n }\n else {\n segment.command = 'TL';\n segment.startTangent = [prePoint[0] - currentPoint[0], prePoint[1] - currentPoint[1]];\n segment.endTangent = [currentPoint[0] - prePoint[0], currentPoint[1] - prePoint[1]];\n }\n }\n else if (command === 'C') {\n // 三次贝塞尔曲线有两个控制点\n var cp1 = [params[1], params[2]];\n var cp2 = [params[3], params[4]];\n segment.startTangent = [prePoint[0] - cp1[0], prePoint[1] - cp1[1]];\n segment.endTangent = [currentPoint[0] - cp2[0], currentPoint[1] - cp2[1]];\n // horizontal line, eg. ['C', 100, 100, 100, 100, 200, 200]\n if (segment.startTangent[0] === 0 && segment.startTangent[1] === 0) {\n segment.startTangent = [cp1[0] - cp2[0], cp1[1] - cp2[1]];\n }\n if (segment.endTangent[0] === 0 && segment.endTangent[1] === 0) {\n segment.endTangent = [cp2[0] - cp1[0], cp2[1] - cp1[1]];\n }\n }\n else if (command === 'S') {\n var preSegment = segments[i - 1];\n var cp1 = path_2_segments_toSymmetry(preSegment.currentPoint, prePoint);\n var cp2 = [params[1], params[2]];\n if (preSegment.command === 'C') {\n segment.command = 'C'; // 将 S 命令变换为 C 命令\n segment.startTangent = [prePoint[0] - cp1[0], prePoint[1] - cp1[1]];\n segment.endTangent = [currentPoint[0] - cp2[0], currentPoint[1] - cp2[1]];\n }\n else {\n segment.command = 'SQ'; // 将 S 命令变换为 SQ 命令\n segment.startTangent = [prePoint[0] - cp2[0], prePoint[1] - cp2[1]];\n segment.endTangent = [currentPoint[0] - cp2[0], currentPoint[1] - cp2[1]];\n }\n }\n else if (command === 'A') {\n var d = 0.001;\n var _a = segment['arcParams'] || {}, _b = _a.cx, cx = _b === void 0 ? 0 : _b, _c = _a.cy, cy = _c === void 0 ? 0 : _c, _d = _a.rx, rx = _d === void 0 ? 0 : _d, _e = _a.ry, ry = _e === void 0 ? 0 : _e, _f = _a.sweepFlag, sweepFlag = _f === void 0 ? 0 : _f, _g = _a.startAngle, startAngle = _g === void 0 ? 0 : _g, _h = _a.endAngle, endAngle = _h === void 0 ? 0 : _h;\n if (sweepFlag === 0) {\n d *= -1;\n }\n var dx1 = rx * Math.cos(startAngle - d) + cx;\n var dy1 = ry * Math.sin(startAngle - d) + cy;\n segment.startTangent = [dx1 - startMovePoint[0], dy1 - startMovePoint[1]];\n var dx2 = rx * Math.cos(startAngle + endAngle + d) + cx;\n var dy2 = ry * Math.sin(startAngle + endAngle - d) + cy;\n segment.endTangent = [prePoint[0] - dx2, prePoint[1] - dy2];\n }\n segments.push(segment);\n }\n return segments;\n}\n//# sourceMappingURL=path-2-segments.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/path-util/esm/get-line-intersect.js\nvar isBetween = function (value, min, max) { return value >= min && value <= max; };\nfunction getLineIntersect(p0, p1, p2, p3) {\n var tolerance = 0.001;\n var E = {\n x: p2.x - p0.x,\n y: p2.y - p0.y,\n };\n var D0 = {\n x: p1.x - p0.x,\n y: p1.y - p0.y,\n };\n var D1 = {\n x: p3.x - p2.x,\n y: p3.y - p2.y,\n };\n var kross = D0.x * D1.y - D0.y * D1.x;\n var sqrKross = kross * kross;\n var sqrLen0 = D0.x * D0.x + D0.y * D0.y;\n var sqrLen1 = D1.x * D1.x + D1.y * D1.y;\n var point = null;\n if (sqrKross > tolerance * sqrLen0 * sqrLen1) {\n var s = (E.x * D1.y - E.y * D1.x) / kross;\n var t = (E.x * D0.y - E.y * D0.x) / kross;\n if (isBetween(s, 0, 1) && isBetween(t, 0, 1)) {\n point = {\n x: p0.x + s * D0.x,\n y: p0.y + s * D0.y,\n };\n }\n }\n return point;\n}\n;\n//# sourceMappingURL=get-line-intersect.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/path-util/esm/point-in-polygon.js\n/**\n * @fileoverview 判断点是否在多边形内\n * @author dxq613@gmail.com\n */\n// 多边形的射线检测,参考:https://blog.csdn.net/WilliamSun0122/article/details/77994526\nvar tolerance = 1e-6;\n// 三态函数,判断两个double在eps精度下的大小关系\nfunction dcmp(x) {\n if (Math.abs(x) < tolerance) {\n return 0;\n }\n return x < 0 ? -1 : 1;\n}\n// 判断点Q是否在p1和p2的线段上\nfunction onSegment(p1, p2, q) {\n if ((q[0] - p1[0]) * (p2[1] - p1[1]) === (p2[0] - p1[0]) * (q[1] - p1[1]) &&\n Math.min(p1[0], p2[0]) <= q[0] &&\n q[0] <= Math.max(p1[0], p2[0]) &&\n Math.min(p1[1], p2[1]) <= q[1] &&\n q[1] <= Math.max(p1[1], p2[1])) {\n return true;\n }\n return false;\n}\n// 判断点P在多边形内-射线法\nfunction isInPolygon(points, x, y) {\n var isHit = false;\n var n = points.length;\n if (n <= 2) {\n // svg 中点小于 3 个时,不显示,也无法被拾取\n return false;\n }\n for (var i = 0; i < n; i++) {\n var p1 = points[i];\n var p2 = points[(i + 1) % n];\n if (onSegment(p1, p2, [x, y])) {\n // 点在多边形一条边上\n return true;\n }\n // 前一个判断min(p1[1],p2[1]) 0 !== dcmp(p2[1] - y) > 0 &&\n dcmp(x - ((y - p1[1]) * (p1[0] - p2[0])) / (p1[1] - p2[1]) - p1[0]) < 0) {\n isHit = !isHit;\n }\n }\n return isHit;\n}\n//# sourceMappingURL=point-in-polygon.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/path-util/esm/is-polygons-intersect.js\n\n\n\nfunction parseToLines(points) {\n var lines = [];\n var count = points.length;\n for (var i = 0; i < count - 1; i++) {\n var point = points[i];\n var next = points[i + 1];\n lines.push({\n from: {\n x: point[0],\n y: point[1]\n },\n to: {\n x: next[0],\n y: next[1]\n }\n });\n }\n if (lines.length > 1) {\n var first = points[0];\n var last = points[count - 1];\n lines.push({\n from: {\n x: last[0],\n y: last[1]\n },\n to: {\n x: first[0],\n y: first[1]\n }\n });\n }\n return lines;\n}\nfunction lineIntersectPolygon(lines, line) {\n var isIntersect = false;\n Object(esm[\"each\"])(lines, function (l) {\n if (getLineIntersect(l.from, l.to, line.from, line.to)) {\n isIntersect = true;\n return false;\n }\n });\n return isIntersect;\n}\nfunction getBBox(points) {\n var xArr = points.map(function (p) { return p[0]; });\n var yArr = points.map(function (p) { return p[1]; });\n return {\n minX: Math.min.apply(null, xArr),\n maxX: Math.max.apply(null, xArr),\n minY: Math.min.apply(null, yArr),\n maxY: Math.max.apply(null, yArr)\n };\n}\nfunction intersectBBox(box1, box2) {\n return !(box2.minX > box1.maxX || box2.maxX < box1.minX || box2.minY > box1.maxY || box2.maxY < box1.minY);\n}\nfunction isPolygonsIntersect(points1, points2) {\n // 空数组,或者一个点返回 false\n if (points1.length < 2 || points2.length < 2) {\n return false;\n }\n var bbox1 = getBBox(points1);\n var bbox2 = getBBox(points2);\n // 判定包围盒是否相交,比判定点是否在多边形内要快的多,可以筛选掉大多数情况\n if (!intersectBBox(bbox1, bbox2)) {\n return false;\n }\n var isIn = false;\n // 判定点是否在多边形内部,一旦有一个点在另一个多边形内,则返回\n Object(esm[\"each\"])(points2, function (point) {\n if (isInPolygon(points1, point[0], point[1])) {\n isIn = true;\n return false;\n }\n });\n if (isIn) {\n return true;\n }\n // 两个多边形都需要判定\n Object(esm[\"each\"])(points1, function (point) {\n if (isInPolygon(points2, point[0], point[1])) {\n isIn = true;\n return false;\n }\n });\n if (isIn) {\n return true;\n }\n var lines1 = parseToLines(points1);\n var lines2 = parseToLines(points2);\n var isIntersect = false;\n Object(esm[\"each\"])(lines2, function (line) {\n if (lineIntersectPolygon(lines1, line)) {\n isIntersect = true;\n return false;\n }\n });\n return isIntersect;\n}\n//# sourceMappingURL=is-polygons-intersect.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/path-util/esm/index.js\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n//# sourceMappingURL=index.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvcGF0aC11dGlsL2VzbS9wYXJzZS1wYXRoLmpzP2ViMjEiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L3BhdGgtdXRpbC9ub2RlX21vZHVsZXMvQGFudHYvbWF0cml4LXV0aWwvZXNtL2V4dC5qcz8yZDUwIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9wYXRoLXV0aWwvbm9kZV9tb2R1bGVzL0BhbnR2L21hdHJpeC11dGlsL2VzbS9pbmRleC5qcz9kNTQzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9wYXRoLXV0aWwvZXNtL2NhdG11bGwtcm9tLTItYmV6aWVyLmpzPzdhMTciLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L3BhdGgtdXRpbC9lc20vZmlsbC1wYXRoLmpzP2MzYjYiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L3BhdGgtdXRpbC9lc20vZmlsbC1wYXRoLWJ5LWRpZmYuanM/ZTMxMyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvcGF0aC11dGlsL2VzbS9mb3JtYXQtcGF0aC5qcz82ODExIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9wYXRoLXV0aWwvZXNtL3JlY3QtcGF0aC5qcz8yMjBkIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9wYXRoLXV0aWwvZXNtL3BhcnNlLXBhdGgtc3RyaW5nLmpzPzBiYzEiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L3BhdGgtdXRpbC9lc20vcGF0aC0yLWFic29sdXRlLmpzP2E0YTMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L3BhdGgtdXRpbC9lc20vcHJvY2Vzcy9hcmMtMi1jdWJpYy5qcz9hZjIwIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9wYXRoLXV0aWwvZXNtL3Byb2Nlc3MvcXVhZC0yLWN1YmljLmpzPzEwNGMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L3BhdGgtdXRpbC9lc20vcHJvY2Vzcy9saW5lLTItY3ViaWMuanM/NjViNCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvcGF0aC11dGlsL2VzbS9wcm9jZXNzL3NlZ21lbnQtMi1jdWJpYy5qcz80OWZlIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9wYXRoLXV0aWwvZXNtL3BhdGgtMi1jdXJ2ZS5qcz81NmVlIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9wYXRoLXV0aWwvZXNtL3BhdGgtaW50ZXJzZWN0aW9uLmpzPzFlYjYiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L3BhdGgtdXRpbC9lc20vcGFyc2UtcGF0aC1hcnJheS5qcz9iYzY2Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9wYXRoLXV0aWwvZXNtL2dldC1hcmMtcGFyYW1zLmpzP2E1OGYiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L3BhdGgtdXRpbC9lc20vcGF0aC0yLXNlZ21lbnRzLmpzP2NmMmUiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L3BhdGgtdXRpbC9lc20vZ2V0LWxpbmUtaW50ZXJzZWN0LmpzPzk1NWIiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L3BhdGgtdXRpbC9lc20vcG9pbnQtaW4tcG9seWdvbi5qcz8yMjJmIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9wYXRoLXV0aWwvZXNtL2lzLXBvbHlnb25zLWludGVyc2VjdC5qcz9hYmRkIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9wYXRoLXV0aWwvZXNtL2luZGV4LmpzPzJlZjEiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUFxRDtBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsc0JBQU87QUFDZjtBQUNBO0FBQ0EsUUFBUSx1QkFBUTtBQUNoQjtBQUNBLFFBQVEsbUJBQUk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksbUJBQUk7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDZSx3REFBUyxFQUFDO0FBQ3pCLHNDOzs7OztBQ2xDQTtBQUNBO0FBQ0E7QUFDdUM7QUFDaEM7QUFDUDtBQUNBLElBQUksNkJBQUk7QUFDUixXQUFXLDZCQUFJO0FBQ2Y7QUFDTztBQUNQO0FBQ0EsSUFBSSw2QkFBSTtBQUNSLFdBQVcsNkJBQUk7QUFDZjtBQUNPO0FBQ1A7QUFDQSxJQUFJLDZCQUFJO0FBQ1IsV0FBVyw2QkFBSTtBQUNmO0FBQ0E7QUFDQSxXQUFXLDZCQUFJO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBLHlDQUF5QyxTQUFTO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxNQUFNO0FBQ2xCLFlBQVksTUFBTTtBQUNsQixZQUFZLFFBQVE7QUFDcEI7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQLGNBQWMsNkJBQUk7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCOztBQ2hHNkM7QUFDaEI7QUFDSTtBQUNqQyxpQzs7QUNIeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMENBQTBDLE9BQU87QUFDakQ7QUFDQSxrQkFBa0IsNkJBQUk7QUFDdEIsa0JBQWtCLDZCQUFJO0FBQ3RCO0FBQ0E7QUFDQSx3Q0FBd0MsU0FBUztBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLDZCQUFJO0FBQ3BCLGdCQUFnQiw2QkFBSTtBQUNwQixxQkFBcUIsNkJBQUk7QUFDekIscUJBQXFCLDZCQUFJO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsNkJBQUk7QUFDekIscUJBQXFCLDZCQUFJO0FBQ3pCLGtCQUFrQiw2QkFBSTtBQUN0QixzQkFBc0IsNkJBQUk7QUFDMUI7QUFDQSxzQkFBc0IsNkJBQUksc0JBQXNCLDZCQUFJO0FBQ3BELHNCQUFzQiw2QkFBSSxzQkFBc0IsNkJBQUk7QUFDcEQ7QUFDQSxpQkFBaUIsNkJBQUk7QUFDckIsaUJBQWlCLDZCQUFJO0FBQ3JCLGtCQUFrQiw2QkFBSTtBQUN0QjtBQUNBLGtCQUFrQiw2QkFBSSxrQkFBa0IsNkJBQUk7QUFDNUMsa0JBQWtCLDZCQUFJLGtCQUFrQiw2QkFBSTtBQUM1QztBQUNBLGlCQUFpQiw2QkFBSTtBQUNyQixpQkFBaUIsNkJBQUk7QUFDckIsc0JBQXNCLDZCQUFJO0FBQzFCO0FBQ0Esc0JBQXNCLDZCQUFJO0FBQzFCLHNCQUFzQiw2QkFBSTtBQUMxQiwwQkFBMEIsNkJBQUk7QUFDOUIsMEJBQTBCLDZCQUFJO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxNQUFNO0FBQ2pCLFdBQVcsUUFBUTtBQUNuQixXQUFXLE1BQU07QUFDakI7QUFDQTtBQUNBLHVCQUF1QixXQUFXO0FBQ2xDLGdDQUFnQztBQUNoQztBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxtQ0FBbUMsT0FBTztBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLGFBQWE7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDZSwwRUFBaUIsRUFBQztBQUNqQyxnRDs7QUNuSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsdUJBQXVCO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixlQUFlO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLGdCQUFnQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ2U7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLDJCQUEyQjtBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixlQUFlO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUM7O0FDN0hxQztBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLGdCQUFnQjtBQUNuQztBQUNBLHNCQUFzQjtBQUN0QjtBQUNBLG1CQUFtQixnQkFBZ0I7QUFDbkMsc0JBQXNCO0FBQ3RCO0FBQ0EsbUJBQW1CLGdCQUFnQjtBQUNuQztBQUNBLHVCQUF1QixnQkFBZ0I7QUFDdkM7QUFDQSxnQkFBZ0Isc0JBQU87QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLGdCQUFnQjtBQUN2QztBQUNBO0FBQ0EsK0JBQStCLGdCQUFnQjtBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QixnREFBZ0Q7QUFDOUU7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDLFFBQVE7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1Qiw2QkFBNkI7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkM7O0FDN0dBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsWUFBWTtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ2U7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixtQkFBbUI7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnRkFBZ0Ysc0JBQXNCLEVBQUU7QUFDeEc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdGQUFnRixzQkFBc0IsRUFBRTtBQUN4RztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0ZBQWdGLHNCQUFzQixFQUFFO0FBQ3hHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Qzs7QUNqSWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUM7O0FDeEJxQztBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0EsUUFBUSxzQkFBTztBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsNkM7O0FDekRrRDtBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNlO0FBQ2Ysb0JBQW9CLGVBQWU7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QjtBQUM1QixtQkFBbUIsc0JBQXNCO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEMsUUFBUTtBQUN0RDtBQUNBLG1DQUFtQztBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0EsbURBQW1ELFFBQVE7QUFDM0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQzs7QUNoSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsMkNBQTJDO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQiwyQ0FBMkM7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixjQUFjO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCLEtBQUs7QUFDTDtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSx1Qzs7QUM1SU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdDOztBQ1hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0M7O0FDbEMyQztBQUNFO0FBQ0E7QUFDdEM7QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDLFVBQVU7QUFDMUM7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDLFdBQVc7QUFDM0M7QUFDQTtBQUNBLGdDQUFnQyxXQUFXO0FBQzNDO0FBQ0E7QUFDQSxnQ0FBZ0MsV0FBVztBQUMzQztBQUNBO0FBQ0EsZ0NBQWdDLFdBQVc7QUFDM0M7QUFDQTtBQUNBLGdDQUFnQyxXQUFXO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkM7O0FDcEM4QztBQUNhO0FBQzVDO0FBQ2YseUNBQXlDLDZCQUE2QjtBQUN0RSxvQkFBb0IsY0FBYTtBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsUUFBUTtBQUMzQjtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsY0FBYztBQUNyQztBQUNBLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdDOztBQ3ZEcUM7QUFDRjtBQUNLO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixPQUFPO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixPQUFPO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyxzQkFBTztBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLFlBQVk7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLG1CQUFtQixZQUFZO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxtQkFBbUIsUUFBUTtBQUMzQix1QkFBdUIsUUFBUTtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksV0FBVTtBQUN0QjtBQUNBLFlBQVksV0FBVTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDLFFBQVE7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEMsUUFBUTtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseURBQXlELFFBQVE7QUFDakU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0EsNkM7O0FDeldBO0FBQ2U7QUFDZjtBQUNBO0FBQ0EsNEM7O0FDSjJDO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsTUFBTTtBQUNqQixXQUFXLE1BQU07QUFDakI7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNlO0FBQ2Y7QUFDQTtBQUNBLG9CQUFvQixrQkFBRyxDQUFDLHVCQUFRO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQzs7QUN6RjRDO0FBQ0c7QUFDVjtBQUNyQztBQUNBLFNBQVMsMEJBQVU7QUFDbkI7QUFDQTtBQUNlO0FBQ2YsV0FBVyxVQUFTO0FBQ3BCO0FBQ0EsNEJBQTRCO0FBQzVCLDBCQUEwQjtBQUMxQiw4QkFBOEI7QUFDOUIsb0NBQW9DO0FBQ3BDO0FBQ0EsbUJBQW1CLFdBQVc7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyxZQUFZO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLFdBQVc7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsMEJBQVU7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLDBCQUFVO0FBQ2hDO0FBQ0E7QUFDQSxzQ0FBc0M7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0NBQStDO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQzs7QUMxSUEsNENBQTRDLHFDQUFxQztBQUNsRTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEM7O0FDakNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ2U7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsT0FBTztBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Qzs7QUNoRGtEO0FBQ0U7QUFDbEI7QUFDbEM7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLGVBQWU7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksbUJBQUk7QUFDUixZQUFZLGdCQUFnQjtBQUM1QjtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDLGFBQWEsRUFBRTtBQUN2RCx3Q0FBd0MsYUFBYSxFQUFFO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ2U7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLG1CQUFJO0FBQ1IsWUFBWSxXQUFnQjtBQUM1QjtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLG1CQUFJO0FBQ1IsWUFBWSxXQUFnQjtBQUM1QjtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxtQkFBSTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxpRDs7QUN0R29EO0FBQ2tCO0FBQ3BCO0FBQ2M7QUFDVjtBQUNZO0FBQ0g7QUFDRTtBQUNWO0FBQ007QUFDVjtBQUNRO0FBQ0U7QUFDTTtBQUNNO0FBQ1I7QUFDakUiLCJmaWxlIjoiMzcuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBlYWNoLCBpc0FycmF5LCBpc1N0cmluZyB9IGZyb20gJ0BhbnR2L3V0aWwnO1xudmFyIHJlZ2V4VGFncyA9IC9bTUxIVlFUQ1NBWl0oW15NTEhWUVRDU0FaXSopL2lnO1xudmFyIHJlZ2V4RG90ID0gL1teXFxzXFwsXSsvaWc7XG5mdW5jdGlvbiBwYXJzZVBhdGgocCkge1xuICAgIHZhciBwYXRoID0gcCB8fCBbXTtcbiAgICBpZiAoaXNBcnJheShwYXRoKSkge1xuICAgICAgICByZXR1cm4gcGF0aDtcbiAgICB9XG4gICAgaWYgKGlzU3RyaW5nKHBhdGgpKSB7XG4gICAgICAgIHBhdGggPSBwYXRoLm1hdGNoKHJlZ2V4VGFncyk7XG4gICAgICAgIGVhY2gocGF0aCwgZnVuY3Rpb24gKGl0ZW0sIGluZGV4KSB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBpdGVtID0gaXRlbS5tYXRjaChyZWdleERvdCk7XG4gICAgICAgICAgICBpZiAoaXRlbVswXS5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRhZyA9IGl0ZW1bMF0uY2hhckF0KDApO1xuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICBpdGVtLnNwbGljZSgxLCAwLCBpdGVtWzBdLnN1YnN0cigxKSk7XG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIGl0ZW1bMF0gPSB0YWc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBlYWNoKGl0ZW0sIGZ1bmN0aW9uIChzdWIsIGkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWlzTmFOKHN1YikpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICBpdGVtW2ldID0gK3N1YjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIHBhdGhbaW5kZXhdID0gaXRlbTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBwYXRoO1xuICAgIH1cbn1cbmV4cG9ydCBkZWZhdWx0IHBhcnNlUGF0aDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBhcnNlLXBhdGguanMubWFwIiwiLyoqXG4gKiBAZGVzY3JpcHRpb24g5omp5bGV5pa55rOV77yM5o+Q5L6bIGdsLW1hdHJpeCDkuLrmj5DkvpvnmoTmlrnms5VcbiAqICovXG5pbXBvcnQgeyBtYXQzLCB2ZWMyIH0gZnJvbSAnZ2wtbWF0cml4JztcbmV4cG9ydCBmdW5jdGlvbiBsZWZ0VHJhbnNsYXRlKG91dCwgYSwgdikge1xuICAgIHZhciB0cmFuc01hdCA9IFswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwXTtcbiAgICBtYXQzLmZyb21UcmFuc2xhdGlvbih0cmFuc01hdCwgdik7XG4gICAgcmV0dXJuIG1hdDMubXVsdGlwbHkob3V0LCB0cmFuc01hdCwgYSk7XG59XG5leHBvcnQgZnVuY3Rpb24gbGVmdFJvdGF0ZShvdXQsIGEsIHJhZCkge1xuICAgIHZhciByb3RhdGVNYXQgPSBbMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMF07XG4gICAgbWF0My5mcm9tUm90YXRpb24ocm90YXRlTWF0LCByYWQpO1xuICAgIHJldHVybiBtYXQzLm11bHRpcGx5KG91dCwgcm90YXRlTWF0LCBhKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBsZWZ0U2NhbGUob3V0LCBhLCB2KSB7XG4gICAgdmFyIHNjYWxlTWF0ID0gWzAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDBdO1xuICAgIG1hdDMuZnJvbVNjYWxpbmcoc2NhbGVNYXQsIHYpO1xuICAgIHJldHVybiBtYXQzLm11bHRpcGx5KG91dCwgc2NhbGVNYXQsIGEpO1xufVxuZnVuY3Rpb24gbGVmdE11bHRpcGx5KG91dCwgYSwgYTEpIHtcbiAgICByZXR1cm4gbWF0My5tdWx0aXBseShvdXQsIGExLCBhKTtcbn1cbi8qKlxuICog5qC55o2uIGFjdGlvbnMg5p2l5YGaIHRyYW5zZm9ybVxuICogQHBhcmFtIG1cbiAqIEBwYXJhbSBhY3Rpb25zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm0obSwgYWN0aW9ucykge1xuICAgIHZhciBtYXRyaXggPSBtID8gW10uY29uY2F0KG0pIDogWzEsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDFdO1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBhY3Rpb25zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIHZhciBhY3Rpb24gPSBhY3Rpb25zW2ldO1xuICAgICAgICBzd2l0Y2ggKGFjdGlvblswXSkge1xuICAgICAgICAgICAgY2FzZSAndCc6XG4gICAgICAgICAgICAgICAgbGVmdFRyYW5zbGF0ZShtYXRyaXgsIG1hdHJpeCwgW2FjdGlvblsxXSwgYWN0aW9uWzJdXSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdzJzpcbiAgICAgICAgICAgICAgICBsZWZ0U2NhbGUobWF0cml4LCBtYXRyaXgsIFthY3Rpb25bMV0sIGFjdGlvblsyXV0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAncic6XG4gICAgICAgICAgICAgICAgbGVmdFJvdGF0ZShtYXRyaXgsIG1hdHJpeCwgYWN0aW9uWzFdKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ20nOlxuICAgICAgICAgICAgICAgIGxlZnRNdWx0aXBseShtYXRyaXgsIG1hdHJpeCwgYWN0aW9uWzFdKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1hdHJpeDtcbn1cbi8qKlxuICog5ZCR6YePIHYxIOWIsCDlkJHph48gdjIg5aS56KeS55qE5pa55ZCRXG4gKiBAcGFyYW0gIHtBcnJheX0gdjEg5ZCR6YePXG4gKiBAcGFyYW0gIHtBcnJheX0gdjIg5ZCR6YePXG4gKiBAcmV0dXJuIHtCb29sZWFufSA+PSAwIOmhuuaXtumSiCA8IDAg6YCG5pe26ZKIXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaXJlY3Rpb24odjEsIHYyKSB7XG4gICAgcmV0dXJuIHYxWzBdICogdjJbMV0gLSB2MlswXSAqIHYxWzFdO1xufVxuLyoqXG4gKiDkuoznu7TlkJHph48gdjEg5YiwIHYyIOeahOWkueinklxuICogQHBhcmFtIHYxXG4gKiBAcGFyYW0gdjJcbiAqIEBwYXJhbSBkaXJlY3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFuZ2xlVG8odjEsIHYyLCBkaXJlY3QpIHtcbiAgICB2YXIgYW5nID0gdmVjMi5hbmdsZSh2MSwgdjIpO1xuICAgIHZhciBhbmdsZUxhcmdlVGhhblBJID0gZGlyZWN0aW9uKHYxLCB2MikgPj0gMDtcbiAgICBpZiAoZGlyZWN0KSB7XG4gICAgICAgIGlmIChhbmdsZUxhcmdlVGhhblBJKSB7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5QSSAqIDIgLSBhbmc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFuZztcbiAgICB9XG4gICAgaWYgKGFuZ2xlTGFyZ2VUaGFuUEkpIHtcbiAgICAgICAgcmV0dXJuIGFuZztcbiAgICB9XG4gICAgcmV0dXJuIE1hdGguUEkgKiAyIC0gYW5nO1xufVxuLyoqXG4gKiDorqHnrpfkuoznu7TlkJHph4/nmoTlnoLnm7TlkJHph49cbiAqIEBwYXJhbSBvdXRcbiAqIEBwYXJhbSB2XG4gKiBAcGFyYW0gZmxhZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gdmVydGljYWwob3V0LCB2LCBmbGFnKSB7XG4gICAgaWYgKGZsYWcpIHtcbiAgICAgICAgb3V0WzBdID0gdlsxXTtcbiAgICAgICAgb3V0WzFdID0gLTEgKiB2WzBdO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgb3V0WzBdID0gLTEgKiB2WzFdO1xuICAgICAgICBvdXRbMV0gPSB2WzBdO1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZXh0LmpzLm1hcCIsImltcG9ydCB7IG1hdDMsIHZlYzIsIHZlYzMgfSBmcm9tICdnbC1tYXRyaXgnO1xuaW1wb3J0ICogYXMgZXh0IGZyb20gJy4vZXh0JztcbmV4cG9ydCB7IG1hdDMsIHZlYzIsIHZlYzMsIGV4dCB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiaW1wb3J0IHsgdmVjMiB9IGZyb20gJ0BhbnR2L21hdHJpeC11dGlsJztcbmZ1bmN0aW9uIHNtb290aEJlemllcihwb2ludHMsIHNtb290aCwgaXNMb29wLCBjb25zdHJhaW50KSB7XG4gICAgdmFyIGNwcyA9IFtdO1xuICAgIHZhciBoYXNDb25zdHJhaW50ID0gISFjb25zdHJhaW50O1xuICAgIHZhciBwcmV2UG9pbnQ7XG4gICAgdmFyIG5leHRQb2ludDtcbiAgICB2YXIgbWluO1xuICAgIHZhciBtYXg7XG4gICAgdmFyIG5leHRDcDA7XG4gICAgdmFyIGNwMTtcbiAgICB2YXIgY3AwO1xuICAgIGlmIChoYXNDb25zdHJhaW50KSB7XG4gICAgICAgIG1pbiA9IGNvbnN0cmFpbnRbMF0sIG1heCA9IGNvbnN0cmFpbnRbMV07XG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gcG9pbnRzLmxlbmd0aDsgaSA8IGw7IGkgKz0gMSkge1xuICAgICAgICAgICAgdmFyIHBvaW50ID0gcG9pbnRzW2ldO1xuICAgICAgICAgICAgbWluID0gdmVjMi5taW4oWzAsIDBdLCBtaW4sIHBvaW50KTtcbiAgICAgICAgICAgIG1heCA9IHZlYzIubWF4KFswLCAwXSwgbWF4LCBwb2ludCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHBvaW50cy5sZW5ndGg7IGkgPCBsZW47IGkgKz0gMSkge1xuICAgICAgICB2YXIgcG9pbnQgPSBwb2ludHNbaV07XG4gICAgICAgIGlmIChpID09PSAwICYmICFpc0xvb3ApIHtcbiAgICAgICAgICAgIGNwMCA9IHBvaW50O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGkgPT09IGxlbiAtIDEgJiYgIWlzTG9vcCkge1xuICAgICAgICAgICAgY3AxID0gcG9pbnQ7XG4gICAgICAgICAgICBjcHMucHVzaChjcDApO1xuICAgICAgICAgICAgY3BzLnB1c2goY3AxKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHZhciBwcmV2SWR4ID0gW2kgPyBpIC0gMSA6IGxlbiAtIDEsIGkgLSAxXVtpc0xvb3AgPyAwIDogMV07XG4gICAgICAgICAgICBwcmV2UG9pbnQgPSBwb2ludHNbcHJldklkeF07XG4gICAgICAgICAgICBuZXh0UG9pbnQgPSBwb2ludHNbaXNMb29wID8gKGkgKyAxKSAlIGxlbiA6IGkgKyAxXTtcbiAgICAgICAgICAgIHZhciB2ID0gWzAsIDBdO1xuICAgICAgICAgICAgdiA9IHZlYzIuc3ViKHYsIG5leHRQb2ludCwgcHJldlBvaW50KTtcbiAgICAgICAgICAgIHYgPSB2ZWMyLnNjYWxlKHYsIHYsIHNtb290aCk7XG4gICAgICAgICAgICB2YXIgZDAgPSB2ZWMyLmRpc3RhbmNlKHBvaW50LCBwcmV2UG9pbnQpO1xuICAgICAgICAgICAgdmFyIGQxID0gdmVjMi5kaXN0YW5jZShwb2ludCwgbmV4dFBvaW50KTtcbiAgICAgICAgICAgIHZhciBzdW0gPSBkMCArIGQxO1xuICAgICAgICAgICAgaWYgKHN1bSAhPT0gMCkge1xuICAgICAgICAgICAgICAgIGQwIC89IHN1bTtcbiAgICAgICAgICAgICAgICBkMSAvPSBzdW07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgdjEgPSB2ZWMyLnNjYWxlKFswLCAwXSwgdiwgLWQwKTtcbiAgICAgICAgICAgIHZhciB2MiA9IHZlYzIuc2NhbGUoWzAsIDBdLCB2LCBkMSk7XG4gICAgICAgICAgICBjcDEgPSB2ZWMyLmFkZChbMCwgMF0sIHBvaW50LCB2MSk7XG4gICAgICAgICAgICBuZXh0Q3AwID0gdmVjMi5hZGQoWzAsIDBdLCBwb2ludCwgdjIpO1xuICAgICAgICAgICAgLy8g5LiL5LiA5Liq5o6n5Yi254K55b+F6aG75Zyo6L+Z5Liq54K55ZKM5LiL5LiA5Liq54K55LmL6Ze0XG4gICAgICAgICAgICBuZXh0Q3AwID0gdmVjMi5taW4oWzAsIDBdLCBuZXh0Q3AwLCB2ZWMyLm1heChbMCwgMF0sIG5leHRQb2ludCwgcG9pbnQpKTtcbiAgICAgICAgICAgIG5leHRDcDAgPSB2ZWMyLm1heChbMCwgMF0sIG5leHRDcDAsIHZlYzIubWluKFswLCAwXSwgbmV4dFBvaW50LCBwb2ludCkpO1xuICAgICAgICAgICAgLy8g6YeN5paw6K6h566XIGNwMSDnmoTlgLxcbiAgICAgICAgICAgIHYxID0gdmVjMi5zdWIoWzAsIDBdLCBuZXh0Q3AwLCBwb2ludCk7XG4gICAgICAgICAgICB2MSA9IHZlYzIuc2NhbGUoWzAsIDBdLCB2MSwgLWQwIC8gZDEpO1xuICAgICAgICAgICAgY3AxID0gdmVjMi5hZGQoWzAsIDBdLCBwb2ludCwgdjEpO1xuICAgICAgICAgICAgLy8g5LiK5LiA5Liq5o6n5Yi254K55b+F6aG76KaB5Zyo5LiK5LiA5Liq54K55ZKM6L+Z5LiA5Liq54K55LmL6Ze0XG4gICAgICAgICAgICBjcDEgPSB2ZWMyLm1pbihbMCwgMF0sIGNwMSwgdmVjMi5tYXgoWzAsIDBdLCBwcmV2UG9pbnQsIHBvaW50KSk7XG4gICAgICAgICAgICBjcDEgPSB2ZWMyLm1heChbMCwgMF0sIGNwMSwgdmVjMi5taW4oWzAsIDBdLCBwcmV2UG9pbnQsIHBvaW50KSk7XG4gICAgICAgICAgICAvLyDph43mlrDorqHnrpcgbmV4dENwMCDnmoTlgLxcbiAgICAgICAgICAgIHYyID0gdmVjMi5zdWIoWzAsIDBdLCBwb2ludCwgY3AxKTtcbiAgICAgICAgICAgIHYyID0gdmVjMi5zY2FsZShbMCwgMF0sIHYyLCBkMSAvIGQwKTtcbiAgICAgICAgICAgIG5leHRDcDAgPSB2ZWMyLmFkZChbMCwgMF0sIHBvaW50LCB2Mik7XG4gICAgICAgICAgICBpZiAoaGFzQ29uc3RyYWludCkge1xuICAgICAgICAgICAgICAgIGNwMSA9IHZlYzIubWF4KFswLCAwXSwgY3AxLCBtaW4pO1xuICAgICAgICAgICAgICAgIGNwMSA9IHZlYzIubWluKFswLCAwXSwgY3AxLCBtYXgpO1xuICAgICAgICAgICAgICAgIG5leHRDcDAgPSB2ZWMyLm1heChbMCwgMF0sIG5leHRDcDAsIG1pbik7XG4gICAgICAgICAgICAgICAgbmV4dENwMCA9IHZlYzIubWluKFswLCAwXSwgbmV4dENwMCwgbWF4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNwcy5wdXNoKGNwMCk7XG4gICAgICAgICAgICBjcHMucHVzaChjcDEpO1xuICAgICAgICAgICAgY3AwID0gbmV4dENwMDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNMb29wKSB7XG4gICAgICAgIGNwcy5wdXNoKGNwcy5zaGlmdCgpKTtcbiAgICB9XG4gICAgcmV0dXJuIGNwcztcbn1cbi8qKlxuICogY3JlYXRlIGJlemllciBzcGxpbmUgZnJvbSBjYXRtdWxsIHJvbSBzcGxpbmVcbiAqIEBwYXJhbSB7QXJyYXl9IGNycCBDYXRtdWxsIFJvbSBQb2ludHNcbiAqIEBwYXJhbSB7Ym9vbGVhbn0geiBTcGxpbmUgaXMgbG9vcFxuICogQHBhcmFtIHtBcnJheX0gY29uc3RyYWludCBDb25zdHJhaW50XG4gKi9cbmZ1bmN0aW9uIGNhdG11bGxSb20yQmV6aWVyKGNycCwgeiwgY29uc3RyYWludCkge1xuICAgIGlmICh6ID09PSB2b2lkIDApIHsgeiA9IGZhbHNlOyB9XG4gICAgaWYgKGNvbnN0cmFpbnQgPT09IHZvaWQgMCkgeyBjb25zdHJhaW50ID0gW1xuICAgICAgICBbMCwgMF0sXG4gICAgICAgIFsxLCAxXSxcbiAgICBdOyB9XG4gICAgdmFyIGlzTG9vcCA9ICEhejtcbiAgICB2YXIgcG9pbnRMaXN0ID0gW107XG4gICAgZm9yICh2YXIgaSA9IDAsIGwgPSBjcnAubGVuZ3RoOyBpIDwgbDsgaSArPSAyKSB7XG4gICAgICAgIHBvaW50TGlzdC5wdXNoKFtjcnBbaV0sIGNycFtpICsgMV1dKTtcbiAgICB9XG4gICAgdmFyIGNvbnRyb2xQb2ludExpc3QgPSBzbW9vdGhCZXppZXIocG9pbnRMaXN0LCAwLjQsIGlzTG9vcCwgY29uc3RyYWludCk7XG4gICAgdmFyIGxlbiA9IHBvaW50TGlzdC5sZW5ndGg7XG4gICAgdmFyIGQxID0gW107XG4gICAgdmFyIGNwMTtcbiAgICB2YXIgY3AyO1xuICAgIHZhciBwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuIC0gMTsgaSArPSAxKSB7XG4gICAgICAgIGNwMSA9IGNvbnRyb2xQb2ludExpc3RbaSAqIDJdO1xuICAgICAgICBjcDIgPSBjb250cm9sUG9pbnRMaXN0W2kgKiAyICsgMV07XG4gICAgICAgIHAgPSBwb2ludExpc3RbaSArIDFdO1xuICAgICAgICBkMS5wdXNoKFsnQycsIGNwMVswXSwgY3AxWzFdLCBjcDJbMF0sIGNwMlsxXSwgcFswXSwgcFsxXV0pO1xuICAgIH1cbiAgICBpZiAoaXNMb29wKSB7XG4gICAgICAgIGNwMSA9IGNvbnRyb2xQb2ludExpc3RbbGVuXTtcbiAgICAgICAgY3AyID0gY29udHJvbFBvaW50TGlzdFtsZW4gKyAxXTtcbiAgICAgICAgcCA9IHBvaW50TGlzdFswXTtcbiAgICAgICAgZDEucHVzaChbJ0MnLCBjcDFbMF0sIGNwMVsxXSwgY3AyWzBdLCBjcDJbMV0sIHBbMF0sIHBbMV1dKTtcbiAgICB9XG4gICAgcmV0dXJuIGQxO1xufVxuZXhwb3J0IGRlZmF1bHQgY2F0bXVsbFJvbTJCZXppZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jYXRtdWxsLXJvbS0yLWJlemllci5qcy5tYXAiLCJmdW5jdGlvbiBkZWNhc3RlbGphdShwb2ludHMsIHQpIHtcbiAgICB2YXIgbGVmdCA9IFtdO1xuICAgIHZhciByaWdodCA9IFtdO1xuICAgIGZ1bmN0aW9uIHJlY3Vyc2UocG9pbnRzLCB0KSB7XG4gICAgICAgIGlmIChwb2ludHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICBsZWZ0LnB1c2gocG9pbnRzWzBdKTtcbiAgICAgICAgICAgIHJpZ2h0LnB1c2gocG9pbnRzWzBdKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHZhciBtaWRkbGVQb2ludHMgPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcG9pbnRzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGxlZnQucHVzaChwb2ludHNbMF0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaSA9PT0gcG9pbnRzLmxlbmd0aCAtIDIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmlnaHQucHVzaChwb2ludHNbaSArIDFdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbWlkZGxlUG9pbnRzW2ldID0gWygxIC0gdCkgKiBwb2ludHNbaV1bMF0gKyB0ICogcG9pbnRzW2kgKyAxXVswXSwgKDEgLSB0KSAqIHBvaW50c1tpXVsxXSArIHQgKiBwb2ludHNbaSArIDFdWzFdXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlY3Vyc2UobWlkZGxlUG9pbnRzLCB0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAocG9pbnRzLmxlbmd0aCkge1xuICAgICAgICByZWN1cnNlKHBvaW50cywgdCk7XG4gICAgfVxuICAgIHJldHVybiB7IGxlZnQ6IGxlZnQsIHJpZ2h0OiByaWdodC5yZXZlcnNlKCkgfTtcbn1cbmZ1bmN0aW9uIHNwbGl0Q3VydmUoc3RhcnQsIGVuZCwgY291bnQpIHtcbiAgICB2YXIgcG9pbnRzID0gW1tzdGFydFsxXSwgc3RhcnRbMl1dXTtcbiAgICBjb3VudCA9IGNvdW50IHx8IDI7XG4gICAgdmFyIHNlZ21lbnRzID0gW107XG4gICAgaWYgKGVuZFswXSA9PT0gJ0EnKSB7XG4gICAgICAgIHBvaW50cy5wdXNoKGVuZFs2XSk7XG4gICAgICAgIHBvaW50cy5wdXNoKGVuZFs3XSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGVuZFswXSA9PT0gJ0MnKSB7XG4gICAgICAgIHBvaW50cy5wdXNoKFtlbmRbMV0sIGVuZFsyXV0pO1xuICAgICAgICBwb2ludHMucHVzaChbZW5kWzNdLCBlbmRbNF1dKTtcbiAgICAgICAgcG9pbnRzLnB1c2goW2VuZFs1XSwgZW5kWzZdXSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGVuZFswXSA9PT0gJ1MnIHx8IGVuZFswXSA9PT0gJ1EnKSB7XG4gICAgICAgIHBvaW50cy5wdXNoKFtlbmRbMV0sIGVuZFsyXV0pO1xuICAgICAgICBwb2ludHMucHVzaChbZW5kWzNdLCBlbmRbNF1dKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHBvaW50cy5wdXNoKFtlbmRbMV0sIGVuZFsyXV0pO1xuICAgIH1cbiAgICB2YXIgbGVmdFNlZ21lbnRzID0gcG9pbnRzO1xuICAgIHZhciB0ID0gMSAvIGNvdW50O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY291bnQgLSAxOyBpKyspIHtcbiAgICAgICAgdmFyIHJ0ID0gdCAvICgxIC0gdCAqIGkpO1xuICAgICAgICB2YXIgc3BsaXQgPSBkZWNhc3RlbGphdShsZWZ0U2VnbWVudHMsIHJ0KTtcbiAgICAgICAgc2VnbWVudHMucHVzaChzcGxpdC5sZWZ0KTtcbiAgICAgICAgbGVmdFNlZ21lbnRzID0gc3BsaXQucmlnaHQ7XG4gICAgfVxuICAgIHNlZ21lbnRzLnB1c2gobGVmdFNlZ21lbnRzKTtcbiAgICB2YXIgcmVzdWx0ID0gc2VnbWVudHMubWFwKGZ1bmN0aW9uIChzZWdtZW50KSB7XG4gICAgICAgIHZhciBjbWQgPSBbXTtcbiAgICAgICAgaWYgKHNlZ21lbnQubGVuZ3RoID09PSA0KSB7XG4gICAgICAgICAgICBjbWQucHVzaCgnQycpO1xuICAgICAgICAgICAgY21kID0gY21kLmNvbmNhdChzZWdtZW50WzJdKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2VnbWVudC5sZW5ndGggPj0gMykge1xuICAgICAgICAgICAgaWYgKHNlZ21lbnQubGVuZ3RoID09PSAzKSB7XG4gICAgICAgICAgICAgICAgY21kLnB1c2goJ1EnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNtZCA9IGNtZC5jb25jYXQoc2VnbWVudFsxXSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNlZ21lbnQubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgICBjbWQucHVzaCgnTCcpO1xuICAgICAgICB9XG4gICAgICAgIGNtZCA9IGNtZC5jb25jYXQoc2VnbWVudFtzZWdtZW50Lmxlbmd0aCAtIDFdKTtcbiAgICAgICAgcmV0dXJuIGNtZDtcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gc3BsaXRTZWdtZW50KHN0YXJ0LCBlbmQsIGNvdW50KSB7XG4gICAgaWYgKGNvdW50ID09PSAxKSB7XG4gICAgICAgIHJldHVybiBbW10uY29uY2F0KHN0YXJ0KV07XG4gICAgfVxuICAgIHZhciBzZWdtZW50cyA9IFtdO1xuICAgIGlmIChlbmRbMF0gPT09ICdMJyB8fCBlbmRbMF0gPT09ICdDJyB8fCBlbmRbMF0gPT09ICdRJykge1xuICAgICAgICBzZWdtZW50cyA9IHNlZ21lbnRzLmNvbmNhdChzcGxpdEN1cnZlKHN0YXJ0LCBlbmQsIGNvdW50KSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB2YXIgdGVtcCA9IFtdLmNvbmNhdChzdGFydCk7XG4gICAgICAgIGlmICh0ZW1wWzBdID09PSAnTScpIHtcbiAgICAgICAgICAgIHRlbXBbMF0gPSAnTCc7XG4gICAgICAgIH1cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPD0gY291bnQgLSAxOyBpKyspIHtcbiAgICAgICAgICAgIHNlZ21lbnRzLnB1c2godGVtcCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNlZ21lbnRzO1xufVxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZmlsbFBhdGgoc291cmNlLCB0YXJnZXQpIHtcbiAgICBpZiAoc291cmNlLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICByZXR1cm4gc291cmNlO1xuICAgIH1cbiAgICB2YXIgc291cmNlTGVuID0gc291cmNlLmxlbmd0aCAtIDE7XG4gICAgdmFyIHRhcmdldExlbiA9IHRhcmdldC5sZW5ndGggLSAxO1xuICAgIHZhciByYXRpbyA9IHNvdXJjZUxlbiAvIHRhcmdldExlbjtcbiAgICB2YXIgc2VnbWVudHNUb0ZpbGwgPSBbXTtcbiAgICBpZiAoc291cmNlLmxlbmd0aCA9PT0gMSAmJiBzb3VyY2VbMF1bMF0gPT09ICdNJykge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRhcmdldExlbiAtIHNvdXJjZUxlbjsgaSsrKSB7XG4gICAgICAgICAgICBzb3VyY2UucHVzaChzb3VyY2VbMF0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzb3VyY2U7XG4gICAgfVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGFyZ2V0TGVuOyBpKyspIHtcbiAgICAgICAgdmFyIGluZGV4ID0gTWF0aC5mbG9vcihyYXRpbyAqIGkpO1xuICAgICAgICBzZWdtZW50c1RvRmlsbFtpbmRleF0gPSAoc2VnbWVudHNUb0ZpbGxbaW5kZXhdIHx8IDApICsgMTtcbiAgICB9XG4gICAgdmFyIGZpbGxlZCA9IHNlZ21lbnRzVG9GaWxsLnJlZHVjZShmdW5jdGlvbiAoZmlsbGVkLCBjb3VudCwgaSkge1xuICAgICAgICBpZiAoaSA9PT0gc291cmNlTGVuKSB7XG4gICAgICAgICAgICByZXR1cm4gZmlsbGVkLmNvbmNhdChzb3VyY2Vbc291cmNlTGVuXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZpbGxlZC5jb25jYXQoc3BsaXRTZWdtZW50KHNvdXJjZVtpXSwgc291cmNlW2kgKyAxXSwgY291bnQpKTtcbiAgICB9LCBbXSk7XG4gICAgZmlsbGVkLnVuc2hpZnQoc291cmNlWzBdKTtcbiAgICBpZiAodGFyZ2V0W3RhcmdldExlbl0gPT09ICdaJyB8fCB0YXJnZXRbdGFyZ2V0TGVuXSA9PT0gJ3onKSB7XG4gICAgICAgIGZpbGxlZC5wdXNoKCdaJyk7XG4gICAgfVxuICAgIHJldHVybiBmaWxsZWQ7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1maWxsLXBhdGguanMubWFwIiwiaW1wb3J0IHsgaXNFcXVhbCB9IGZyb20gJ0BhbnR2L3V0aWwnO1xuZnVuY3Rpb24gZ2V0TWluRGlmZihkZWwsIGFkZCwgbW9kaWZ5KSB7XG4gICAgdmFyIHR5cGUgPSBudWxsO1xuICAgIHZhciBtaW4gPSBtb2RpZnk7XG4gICAgaWYgKGFkZCA8IG1pbikge1xuICAgICAgICBtaW4gPSBhZGQ7XG4gICAgICAgIHR5cGUgPSAnYWRkJztcbiAgICB9XG4gICAgaWYgKGRlbCA8IG1pbikge1xuICAgICAgICBtaW4gPSBkZWw7XG4gICAgICAgIHR5cGUgPSAnZGVsJztcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgbWluOiBtaW4sXG4gICAgfTtcbn1cbi8qXG4gKiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MZXZlbnNodGVpbl9kaXN0YW5jZVxuICog6K6h566X5Lik5p2hcGF0aOeahOe8lui+kei3neemu1xuICovXG52YXIgbGV2ZW5zaHRlaW5EaXN0YW5jZSA9IGZ1bmN0aW9uIChzb3VyY2UsIHRhcmdldCkge1xuICAgIHZhciBzb3VyY2VMZW4gPSBzb3VyY2UubGVuZ3RoO1xuICAgIHZhciB0YXJnZXRMZW4gPSB0YXJnZXQubGVuZ3RoO1xuICAgIHZhciBzb3VyY2VTZWdtZW50LCB0YXJnZXRTZWdtZW50O1xuICAgIHZhciB0ZW1wID0gMDtcbiAgICBpZiAoc291cmNlTGVuID09PSAwIHx8IHRhcmdldExlbiA9PT0gMCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgdmFyIGRpc3QgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8PSBzb3VyY2VMZW47IGkrKykge1xuICAgICAgICBkaXN0W2ldID0gW107XG4gICAgICAgIGRpc3RbaV1bMF0gPSB7IG1pbjogaSB9O1xuICAgIH1cbiAgICBmb3IgKHZhciBqID0gMDsgaiA8PSB0YXJnZXRMZW47IGorKykge1xuICAgICAgICBkaXN0WzBdW2pdID0geyBtaW46IGogfTtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPD0gc291cmNlTGVuOyBpKyspIHtcbiAgICAgICAgc291cmNlU2VnbWVudCA9IHNvdXJjZVtpIC0gMV07XG4gICAgICAgIGZvciAodmFyIGogPSAxOyBqIDw9IHRhcmdldExlbjsgaisrKSB7XG4gICAgICAgICAgICB0YXJnZXRTZWdtZW50ID0gdGFyZ2V0W2ogLSAxXTtcbiAgICAgICAgICAgIGlmIChpc0VxdWFsKHNvdXJjZVNlZ21lbnQsIHRhcmdldFNlZ21lbnQpKSB7XG4gICAgICAgICAgICAgICAgdGVtcCA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0ZW1wID0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBkZWwgPSBkaXN0W2kgLSAxXVtqXS5taW4gKyAxO1xuICAgICAgICAgICAgdmFyIGFkZCA9IGRpc3RbaV1baiAtIDFdLm1pbiArIDE7XG4gICAgICAgICAgICB2YXIgbW9kaWZ5ID0gZGlzdFtpIC0gMV1baiAtIDFdLm1pbiArIHRlbXA7XG4gICAgICAgICAgICBkaXN0W2ldW2pdID0gZ2V0TWluRGlmZihkZWwsIGFkZCwgbW9kaWZ5KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGlzdDtcbn07XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBmaWxsUGF0aEJ5RGlmZihzb3VyY2UsIHRhcmdldCkge1xuICAgIHZhciBkaWZmTWF0cml4ID0gbGV2ZW5zaHRlaW5EaXN0YW5jZShzb3VyY2UsIHRhcmdldCk7XG4gICAgdmFyIHNvdXJjZUxlbiA9IHNvdXJjZS5sZW5ndGg7XG4gICAgdmFyIHRhcmdldExlbiA9IHRhcmdldC5sZW5ndGg7XG4gICAgdmFyIGNoYW5nZXMgPSBbXTtcbiAgICB2YXIgaW5kZXggPSAxO1xuICAgIHZhciBtaW5Qb3MgPSAxO1xuICAgIC8vIOWmguaenHNvdXJjZeWSjHRhcmdldOS4jeaYr+WujOWFqOS4jeebuOetiVxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBpZiAoZGlmZk1hdHJpeFtzb3VyY2VMZW5dW3RhcmdldExlbl0gIT09IHNvdXJjZUxlbikge1xuICAgICAgICAvLyDojrflj5bku45zb3VyY2XliLB0YXJnZXTmiYDpnIDmlLnliqhcbiAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPD0gc291cmNlTGVuOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBtaW4gPSBkaWZmTWF0cml4W2ldW2ldLm1pbjtcbiAgICAgICAgICAgIG1pblBvcyA9IGk7XG4gICAgICAgICAgICBmb3IgKHZhciBqID0gaW5kZXg7IGogPD0gdGFyZ2V0TGVuOyBqKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoZGlmZk1hdHJpeFtpXVtqXS5taW4gPCBtaW4pIHtcbiAgICAgICAgICAgICAgICAgICAgbWluID0gZGlmZk1hdHJpeFtpXVtqXS5taW47XG4gICAgICAgICAgICAgICAgICAgIG1pblBvcyA9IGo7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaW5kZXggPSBtaW5Qb3M7XG4gICAgICAgICAgICBpZiAoZGlmZk1hdHJpeFtpXVtpbmRleF0udHlwZSkge1xuICAgICAgICAgICAgICAgIGNoYW5nZXMucHVzaCh7IGluZGV4OiBpIC0gMSwgdHlwZTogZGlmZk1hdHJpeFtpXVtpbmRleF0udHlwZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyDlr7lzb3VyY2Xov5vooYzlop7liKBwYXRoXG4gICAgICAgIGZvciAodmFyIGkgPSBjaGFuZ2VzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBpbmRleCA9IGNoYW5nZXNbaV0uaW5kZXg7XG4gICAgICAgICAgICBpZiAoY2hhbmdlc1tpXS50eXBlID09PSAnYWRkJykge1xuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICBzb3VyY2Uuc3BsaWNlKGluZGV4LCAwLCBbXS5jb25jYXQoc291cmNlW2luZGV4XSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIHNvdXJjZS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIHNvdXJjZeWwvumDqOihpem9kFxuICAgIHNvdXJjZUxlbiA9IHNvdXJjZS5sZW5ndGg7XG4gICAgaWYgKHNvdXJjZUxlbiA8IHRhcmdldExlbikge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8ICh0YXJnZXRMZW4gLSBzb3VyY2VMZW4pOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChzb3VyY2Vbc291cmNlTGVuIC0gMV1bMF0gPT09ICd6JyB8fCBzb3VyY2Vbc291cmNlTGVuIC0gMV1bMF0gPT09ICdaJykge1xuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICBzb3VyY2Uuc3BsaWNlKHNvdXJjZUxlbiAtIDIsIDAsIHNvdXJjZVtzb3VyY2VMZW4gLSAyXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgc291cmNlLnB1c2goc291cmNlW3NvdXJjZUxlbiAtIDFdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc291cmNlO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZmlsbC1wYXRoLWJ5LWRpZmYuanMubWFwIiwiLypcbiAqIOaKveWPlnBhdGhTZWdtZW505Lit55qE5YWz6ZSu54K5XG4gKiBNLEwsQSxRLEgsVuS4gOS4querr+eCuVxuICogUSwgU+aKveWPluS4gOS4querr+eCue+8jOS4gOS4quaOp+WItueCuVxuICogQ+aKveWPluS4gOS4querr+eCue+8jOS4pOS4quaOp+WItueCuVxuICovXG5mdW5jdGlvbiBfZ2V0U2VnbWVudFBvaW50cyhzZWdtZW50KSB7XG4gICAgdmFyIHBvaW50cyA9IFtdO1xuICAgIHN3aXRjaCAoc2VnbWVudFswXSkge1xuICAgICAgICBjYXNlICdNJzpcbiAgICAgICAgICAgIHBvaW50cy5wdXNoKFtzZWdtZW50WzFdLCBzZWdtZW50WzJdXSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnTCc6XG4gICAgICAgICAgICBwb2ludHMucHVzaChbc2VnbWVudFsxXSwgc2VnbWVudFsyXV0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ0EnOlxuICAgICAgICAgICAgcG9pbnRzLnB1c2goW3NlZ21lbnRbNl0sIHNlZ21lbnRbN11dKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdRJzpcbiAgICAgICAgICAgIHBvaW50cy5wdXNoKFtzZWdtZW50WzNdLCBzZWdtZW50WzRdXSk7XG4gICAgICAgICAgICBwb2ludHMucHVzaChbc2VnbWVudFsxXSwgc2VnbWVudFsyXV0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ1QnOlxuICAgICAgICAgICAgcG9pbnRzLnB1c2goW3NlZ21lbnRbMV0sIHNlZ21lbnRbMl1dKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdDJzpcbiAgICAgICAgICAgIHBvaW50cy5wdXNoKFtzZWdtZW50WzVdLCBzZWdtZW50WzZdXSk7XG4gICAgICAgICAgICBwb2ludHMucHVzaChbc2VnbWVudFsxXSwgc2VnbWVudFsyXV0pO1xuICAgICAgICAgICAgcG9pbnRzLnB1c2goW3NlZ21lbnRbM10sIHNlZ21lbnRbNF1dKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdTJzpcbiAgICAgICAgICAgIHBvaW50cy5wdXNoKFtzZWdtZW50WzNdLCBzZWdtZW50WzRdXSk7XG4gICAgICAgICAgICBwb2ludHMucHVzaChbc2VnbWVudFsxXSwgc2VnbWVudFsyXV0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ0gnOlxuICAgICAgICAgICAgcG9pbnRzLnB1c2goW3NlZ21lbnRbMV0sIHNlZ21lbnRbMV1dKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdWJzpcbiAgICAgICAgICAgIHBvaW50cy5wdXNoKFtzZWdtZW50WzFdLCBzZWdtZW50WzFdXSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICB9XG4gICAgcmV0dXJuIHBvaW50cztcbn1cbi8vIOWwhuS4pOS4queCueWdh+WIhuaIkGNvdW505Liq54K5XG5mdW5jdGlvbiBfc3BsaXRQb2ludHMocG9pbnRzLCBmb3JtZXIsIGNvdW50KSB7XG4gICAgdmFyIHJlc3VsdCA9IFtdLmNvbmNhdChwb2ludHMpO1xuICAgIHZhciBpbmRleDtcbiAgICB2YXIgdCA9IDEgLyAoY291bnQgKyAxKTtcbiAgICB2YXIgZm9ybWVyRW5kID0gX2dldFNlZ21lbnRQb2ludHMoZm9ybWVyKVswXTtcbiAgICBmb3IgKHZhciBpID0gMTsgaSA8PSBjb3VudDsgaSsrKSB7XG4gICAgICAgIHQgKj0gaTtcbiAgICAgICAgaW5kZXggPSBNYXRoLmZsb29yKHBvaW50cy5sZW5ndGggKiB0KTtcbiAgICAgICAgaWYgKGluZGV4ID09PSAwKSB7XG4gICAgICAgICAgICByZXN1bHQudW5zaGlmdChbZm9ybWVyRW5kWzBdICogdCArIHBvaW50c1tpbmRleF1bMF0gKiAoMSAtIHQpLCBmb3JtZXJFbmRbMV0gKiB0ICsgcG9pbnRzW2luZGV4XVsxXSAqICgxIC0gdCldKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdC5zcGxpY2UoaW5kZXgsIDAsIFtmb3JtZXJFbmRbMF0gKiB0ICsgcG9pbnRzW2luZGV4XVswXSAqICgxIC0gdCksIGZvcm1lckVuZFsxXSAqIHQgKyBwb2ludHNbaW5kZXhdWzFdICogKDEgLSB0KV0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBmb3JtYXRQYXRoKGZyb21QYXRoLCB0b1BhdGgpIHtcbiAgICBpZiAoZnJvbVBhdGgubGVuZ3RoIDw9IDEpIHtcbiAgICAgICAgcmV0dXJuIGZyb21QYXRoO1xuICAgIH1cbiAgICB2YXIgcG9pbnRzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdG9QYXRoLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChmcm9tUGF0aFtpXVswXSAhPT0gdG9QYXRoW2ldWzBdKSB7XG4gICAgICAgICAgICAvLyDojrflj5Zmcm9tUGF0aOeahHBhdGhTZWdtZW5055qE56uv54K577yM5qC55o2udG9QYXRo55qE5oyH5Luk5a+55YW25pS56YCgXG4gICAgICAgICAgICBwb2ludHMgPSBfZ2V0U2VnbWVudFBvaW50cyhmcm9tUGF0aFtpXSk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRvUGF0aFtpXVswXSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ00nOlxuICAgICAgICAgICAgICAgICAgICBmcm9tUGF0aFtpXSA9IFsnTSddLmNvbmNhdChwb2ludHNbMF0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdMJzpcbiAgICAgICAgICAgICAgICAgICAgZnJvbVBhdGhbaV0gPSBbJ0wnXS5jb25jYXQocG9pbnRzWzBdKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnQSc6XG4gICAgICAgICAgICAgICAgICAgIGZyb21QYXRoW2ldID0gW10uY29uY2F0KHRvUGF0aFtpXSk7XG4gICAgICAgICAgICAgICAgICAgIGZyb21QYXRoW2ldWzZdID0gcG9pbnRzWzBdWzBdO1xuICAgICAgICAgICAgICAgICAgICBmcm9tUGF0aFtpXVs3XSA9IHBvaW50c1swXVsxXTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnUSc6XG4gICAgICAgICAgICAgICAgICAgIGlmIChwb2ludHMubGVuZ3RoIDwgMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRzID0gX3NwbGl0UG9pbnRzKHBvaW50cywgZnJvbVBhdGhbaSAtIDFdLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21QYXRoW2ldID0gdG9QYXRoW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGZyb21QYXRoW2ldID0gWydRJ10uY29uY2F0KHBvaW50cy5yZWR1Y2UoZnVuY3Rpb24gKGFyciwgaSkgeyByZXR1cm4gYXJyLmNvbmNhdChpKTsgfSwgW10pKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnVCc6XG4gICAgICAgICAgICAgICAgICAgIGZyb21QYXRoW2ldID0gWydUJ10uY29uY2F0KHBvaW50c1swXSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ0MnOlxuICAgICAgICAgICAgICAgICAgICBpZiAocG9pbnRzLmxlbmd0aCA8IDMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50cyA9IF9zcGxpdFBvaW50cyhwb2ludHMsIGZyb21QYXRoW2kgLSAxXSwgMik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tUGF0aFtpXSA9IHRvUGF0aFtpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBmcm9tUGF0aFtpXSA9IFsnQyddLmNvbmNhdChwb2ludHMucmVkdWNlKGZ1bmN0aW9uIChhcnIsIGkpIHsgcmV0dXJuIGFyci5jb25jYXQoaSk7IH0sIFtdKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ1MnOlxuICAgICAgICAgICAgICAgICAgICBpZiAocG9pbnRzLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50cyA9IF9zcGxpdFBvaW50cyhwb2ludHMsIGZyb21QYXRoW2kgLSAxXSwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tUGF0aFtpXSA9IHRvUGF0aFtpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBmcm9tUGF0aFtpXSA9IFsnUyddLmNvbmNhdChwb2ludHMucmVkdWNlKGZ1bmN0aW9uIChhcnIsIGkpIHsgcmV0dXJuIGFyci5jb25jYXQoaSk7IH0sIFtdKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGZyb21QYXRoW2ldID0gdG9QYXRoW2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmcm9tUGF0aDtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWZvcm1hdC1wYXRoLmpzLm1hcCIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJlY3RQYXRoKHgsIHksIHcsIGgsIHIpIHtcbiAgICBpZiAocikge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgWydNJywgK3ggKyAoK3IpLCB5XSxcbiAgICAgICAgICAgIFsnbCcsIHcgLSByICogMiwgMF0sXG4gICAgICAgICAgICBbJ2EnLCByLCByLCAwLCAwLCAxLCByLCByXSxcbiAgICAgICAgICAgIFsnbCcsIDAsIGggLSByICogMl0sXG4gICAgICAgICAgICBbJ2EnLCByLCByLCAwLCAwLCAxLCAtciwgcl0sXG4gICAgICAgICAgICBbJ2wnLCByICogMiAtIHcsIDBdLFxuICAgICAgICAgICAgWydhJywgciwgciwgMCwgMCwgMSwgLXIsIC1yXSxcbiAgICAgICAgICAgIFsnbCcsIDAsIHIgKiAyIC0gaF0sXG4gICAgICAgICAgICBbJ2EnLCByLCByLCAwLCAwLCAxLCByLCAtcl0sXG4gICAgICAgICAgICBbJ3onXSxcbiAgICAgICAgXTtcbiAgICB9XG4gICAgcmV0dXJuIFtcbiAgICAgICAgWydNJywgeCwgeV0sXG4gICAgICAgIFsnbCcsIHcsIDBdLFxuICAgICAgICBbJ2wnLCAwLCBoXSxcbiAgICAgICAgWydsJywgLXcsIDBdLFxuICAgICAgICBbJ3onXSxcbiAgICBdO1xuICAgIC8vIHJlcy5wYXJzZVBhdGhBcnJheSA9IHBhcnNlUGF0aEFycmF5O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmVjdC1wYXRoLmpzLm1hcCIsImltcG9ydCB7IGlzQXJyYXkgfSBmcm9tICdAYW50di91dGlsJztcbnZhciBTUEFDRVMgPSAnXFx4MDlcXHgwYVxceDBiXFx4MGNcXHgwZFxceDIwXFx4YTBcXHUxNjgwXFx1MTgwZVxcdTIwMDBcXHUyMDAxXFx1MjAwMlxcdTIwMDNcXHUyMDA0XFx1MjAwNVxcdTIwMDZcXHUyMDA3XFx1MjAwOFxcdTIwMDlcXHUyMDBhXFx1MjAyZlxcdTIwNWZcXHUzMDAwXFx1MjAyOFxcdTIwMjknO1xudmFyIFBBVEhfQ09NTUFORCA9IG5ldyBSZWdFeHAoJyhbYS16XSlbJyArIFNQQUNFUyArICcsXSooKC0/XFxcXGQqXFxcXC4/XFxcXGQqKD86ZVtcXFxcLStdP1xcXFxkKyk/WycgKyBTUEFDRVMgKyAnXSosP1snICsgU1BBQ0VTICsgJ10qKSspJywgJ2lnJyk7XG52YXIgUEFUSF9WQUxVRVMgPSBuZXcgUmVnRXhwKCcoLT9cXFxcZCpcXFxcLj9cXFxcZCooPzplW1xcXFwtK10/XFxcXGQrKT8pWycgKyBTUEFDRVMgKyAnXSosP1snICsgU1BBQ0VTICsgJ10qJywgJ2lnJyk7XG4vLyBQYXJzZXMgZ2l2ZW4gcGF0aCBzdHJpbmcgaW50byBhbiBhcnJheSBvZiBhcnJheXMgb2YgcGF0aCBzZWdtZW50c1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcGFyc2VQYXRoU3RyaW5nKHBhdGhTdHJpbmcpIHtcbiAgICBpZiAoIXBhdGhTdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmIChpc0FycmF5KHBhdGhTdHJpbmcpKSB7XG4gICAgICAgIHJldHVybiBwYXRoU3RyaW5nO1xuICAgIH1cbiAgICB2YXIgcGFyYW1Db3VudHMgPSB7XG4gICAgICAgIGE6IDcsXG4gICAgICAgIGM6IDYsXG4gICAgICAgIG86IDIsXG4gICAgICAgIGg6IDEsXG4gICAgICAgIGw6IDIsXG4gICAgICAgIG06IDIsXG4gICAgICAgIHI6IDQsXG4gICAgICAgIHE6IDQsXG4gICAgICAgIHM6IDQsXG4gICAgICAgIHQ6IDIsXG4gICAgICAgIHY6IDEsXG4gICAgICAgIHU6IDMsXG4gICAgICAgIHo6IDAsXG4gICAgfTtcbiAgICB2YXIgZGF0YSA9IFtdO1xuICAgIFN0cmluZyhwYXRoU3RyaW5nKS5yZXBsYWNlKFBBVEhfQ09NTUFORCwgZnVuY3Rpb24gKGEsIGIsIGMpIHtcbiAgICAgICAgdmFyIHBhcmFtcyA9IFtdO1xuICAgICAgICB2YXIgbmFtZSA9IGIudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgYy5yZXBsYWNlKFBBVEhfVkFMVUVTLCBmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICAgICAgYiAmJiBwYXJhbXMucHVzaCgrYik7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAobmFtZSA9PT0gJ20nICYmIHBhcmFtcy5sZW5ndGggPiAyKSB7XG4gICAgICAgICAgICBkYXRhLnB1c2goW2JdLmNvbmNhdChwYXJhbXMuc3BsaWNlKDAsIDIpKSk7XG4gICAgICAgICAgICBuYW1lID0gJ2wnO1xuICAgICAgICAgICAgYiA9IGIgPT09ICdtJyA/ICdsJyA6ICdMJztcbiAgICAgICAgfVxuICAgICAgICBpZiAobmFtZSA9PT0gJ28nICYmIHBhcmFtcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIGRhdGEucHVzaChbYiwgcGFyYW1zWzBdXSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5hbWUgPT09ICdyJykge1xuICAgICAgICAgICAgZGF0YS5wdXNoKFtiXS5jb25jYXQocGFyYW1zKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB3aGlsZSAocGFyYW1zLmxlbmd0aCA+PSBwYXJhbUNvdW50c1tuYW1lXSkge1xuICAgICAgICAgICAgICAgIGRhdGEucHVzaChbYl0uY29uY2F0KHBhcmFtcy5zcGxpY2UoMCwgcGFyYW1Db3VudHNbbmFtZV0pKSk7XG4gICAgICAgICAgICAgICAgaWYgKCFwYXJhbUNvdW50c1tuYW1lXSkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH0pO1xuICAgIHJldHVybiBkYXRhO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cGFyc2UtcGF0aC1zdHJpbmcuanMubWFwIiwiaW1wb3J0IHBhcnNlUGF0aFN0cmluZyBmcm9tICcuL3BhcnNlLXBhdGgtc3RyaW5nJztcbnZhciBSRUdFWF9NRCA9IC9bYS16XS87XG5mdW5jdGlvbiB0b1N5bW1ldHJ5KHAsIGMpIHtcbiAgICByZXR1cm4gW1xuICAgICAgICBjWzBdICsgKGNbMF0gLSBwWzBdKSxcbiAgICAgICAgY1sxXSArIChjWzFdIC0gcFsxXSksXG4gICAgXTtcbn1cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHBhdGhUb0Fic29sdXRlKHBhdGhTdHJpbmcpIHtcbiAgICB2YXIgcGF0aEFycmF5ID0gcGFyc2VQYXRoU3RyaW5nKHBhdGhTdHJpbmcpO1xuICAgIGlmICghcGF0aEFycmF5IHx8ICFwYXRoQXJyYXkubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBbJ00nLCAwLCAwXSxcbiAgICAgICAgXTtcbiAgICB9XG4gICAgdmFyIG5lZWRQcm9jZXNzID0gZmFsc2U7IC8vIOWmguaenOWtmOWcqOWwj+WGmeeahOWRveS7pOaIluiAhSBWLEgsVCxTIOWImemcgOimgeWkhOeQhlxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGF0aEFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBjbWQgPSBwYXRoQXJyYXlbaV1bMF07XG4gICAgICAgIC8vIOWmguaenOWtmOWcqOebuOWvueS9jee9rueahOWRveS7pO+8jOWImeS4reaWrei/lOWbnlxuICAgICAgICBpZiAoUkVHRVhfTUQudGVzdChjbWQpIHx8IFsnVicsICdIJywgJ1QnLCAnUyddLmluZGV4T2YoY21kKSA+PSAwKSB7XG4gICAgICAgICAgICBuZWVkUHJvY2VzcyA9IHRydWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyDlpoLmnpzkuI3lrZjlnKjnm7jlr7nlkb3ku6TvvIzliJnnm7TmjqXov5Tlm55cbiAgICAvLyDlpoLmnpzlnKjkuJrliqHkuIrpg73lhpnnu53lr7not6/lvoTvvIzov5nnp43mlrnlvI/mnIDlv6vvvIzku4XlgZrkuobkuIDmrKHmo4DmtYtcbiAgICBpZiAoIW5lZWRQcm9jZXNzKSB7XG4gICAgICAgIHJldHVybiBwYXRoQXJyYXk7XG4gICAgfVxuICAgIHZhciByZXMgPSBbXTtcbiAgICB2YXIgeCA9IDA7XG4gICAgdmFyIHkgPSAwO1xuICAgIHZhciBteCA9IDA7XG4gICAgdmFyIG15ID0gMDtcbiAgICB2YXIgc3RhcnQgPSAwO1xuICAgIHZhciBwYTA7XG4gICAgdmFyIGRvdHM7XG4gICAgdmFyIGZpcnN0ID0gcGF0aEFycmF5WzBdO1xuICAgIGlmIChmaXJzdFswXSA9PT0gJ00nIHx8IGZpcnN0WzBdID09PSAnbScpIHtcbiAgICAgICAgeCA9ICtmaXJzdFsxXTtcbiAgICAgICAgeSA9ICtmaXJzdFsyXTtcbiAgICAgICAgbXggPSB4O1xuICAgICAgICBteSA9IHk7XG4gICAgICAgIHN0YXJ0Kys7XG4gICAgICAgIHJlc1swXSA9IFsnTScsIHgsIHldO1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gc3RhcnQsIGlpID0gcGF0aEFycmF5Lmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgICAgdmFyIHBhID0gcGF0aEFycmF5W2ldO1xuICAgICAgICB2YXIgcHJlUGFyYW1zID0gcmVzW2kgLSAxXTsgLy8g5Y+W5YmN5LiA5Liq5bey57uP5aSE55CG5ZCO55qE6IqC54K577yM5ZCm5YiZ5Lya5Ye6546w6Zeu6aKYXG4gICAgICAgIHZhciByID0gW107XG4gICAgICAgIHZhciBjbWQgPSBwYVswXTtcbiAgICAgICAgdmFyIHVwQ21kID0gY21kLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgIGlmIChjbWQgIT09IHVwQ21kKSB7XG4gICAgICAgICAgICByWzBdID0gdXBDbWQ7XG4gICAgICAgICAgICBzd2l0Y2ggKHVwQ21kKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnQSc6XG4gICAgICAgICAgICAgICAgICAgIHJbMV0gPSBwYVsxXTtcbiAgICAgICAgICAgICAgICAgICAgclsyXSA9IHBhWzJdO1xuICAgICAgICAgICAgICAgICAgICByWzNdID0gcGFbM107XG4gICAgICAgICAgICAgICAgICAgIHJbNF0gPSBwYVs0XTtcbiAgICAgICAgICAgICAgICAgICAgcls1XSA9IHBhWzVdO1xuICAgICAgICAgICAgICAgICAgICByWzZdID0gK3BhWzZdICsgeDtcbiAgICAgICAgICAgICAgICAgICAgcls3XSA9ICtwYVs3XSArIHk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ1YnOlxuICAgICAgICAgICAgICAgICAgICByWzFdID0gK3BhWzFdICsgeTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnSCc6XG4gICAgICAgICAgICAgICAgICAgIHJbMV0gPSArcGFbMV0gKyB4O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdNJzpcbiAgICAgICAgICAgICAgICAgICAgbXggPSArcGFbMV0gKyB4O1xuICAgICAgICAgICAgICAgICAgICBteSA9ICtwYVsyXSArIHk7XG4gICAgICAgICAgICAgICAgICAgIHJbMV0gPSBteDtcbiAgICAgICAgICAgICAgICAgICAgclsyXSA9IG15O1xuICAgICAgICAgICAgICAgICAgICBicmVhazsgLy8gZm9yIGxpbnRcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMSwgamogPSBwYS5sZW5ndGg7IGogPCBqajsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByW2pdID0gK3BhW2pdICsgKChqICUgMikgPyB4IDogeSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHsgLy8g5aaC5p6c5pys5p2l5bey57uP5aSn5YaZ77yM5YiZ5LiN5aSE55CGXG4gICAgICAgICAgICByID0gcGF0aEFycmF5W2ldO1xuICAgICAgICB9XG4gICAgICAgIC8vIOmcgOimgeWcqOWklumdoue7n+S4gOWBmu+8jOWQjOaXtuWkhOeQhiBWLEgsUyxUIOetieeJueauiuaMh+S7pFxuICAgICAgICBzd2l0Y2ggKHVwQ21kKSB7XG4gICAgICAgICAgICBjYXNlICdaJzpcbiAgICAgICAgICAgICAgICB4ID0gK214O1xuICAgICAgICAgICAgICAgIHkgPSArbXk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdIJzpcbiAgICAgICAgICAgICAgICB4ID0gclsxXTtcbiAgICAgICAgICAgICAgICByID0gWydMJywgeCwgeV07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdWJzpcbiAgICAgICAgICAgICAgICB5ID0gclsxXTtcbiAgICAgICAgICAgICAgICByID0gWydMJywgeCwgeV07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdUJzpcbiAgICAgICAgICAgICAgICB4ID0gclsxXTtcbiAgICAgICAgICAgICAgICB5ID0gclsyXTtcbiAgICAgICAgICAgICAgICAvLyDku6UgeCwgeSDkuLrkuK3lv4PnmoTvvIzkuIrkuIDkuKrmjqfliLbngrnnmoTlr7nnp7DngrlcbiAgICAgICAgICAgICAgICAvLyDpnIDopoHlgYforr7kuIrkuIDkuKroioLngrnnmoTlkb3ku6TkuLogUVxuICAgICAgICAgICAgICAgIHZhciBzeW1ldHJpY1QgPSB0b1N5bW1ldHJ5KFtwcmVQYXJhbXNbMV0sIHByZVBhcmFtc1syXV0sIFtwcmVQYXJhbXNbM10sIHByZVBhcmFtc1s0XV0pO1xuICAgICAgICAgICAgICAgIHIgPSBbJ1EnLCBzeW1ldHJpY1RbMF0sIHN5bWV0cmljVFsxXSwgeCwgeV07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdTJzpcbiAgICAgICAgICAgICAgICB4ID0gcltyLmxlbmd0aCAtIDJdO1xuICAgICAgICAgICAgICAgIHkgPSByW3IubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgLy8g5LulIHgseSDkuLrkuK3lv4PvvIzlj5bkuIrkuIDkuKrmjqfliLbngrnvvIxcbiAgICAgICAgICAgICAgICAvLyDpnIDopoHlgYforr7kuIrkuIDkuKrnur/mrrXkuLogQyDmiJbogIUgU1xuICAgICAgICAgICAgICAgIHZhciBsZW5ndGhfMSA9IHByZVBhcmFtcy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgdmFyIHN5bWV0cmljUyA9IHRvU3ltbWV0cnkoW3ByZVBhcmFtc1tsZW5ndGhfMSAtIDRdLCBwcmVQYXJhbXNbbGVuZ3RoXzEgLSAzXV0sIFtwcmVQYXJhbXNbbGVuZ3RoXzEgLSAyXSwgcHJlUGFyYW1zW2xlbmd0aF8xIC0gMV1dKTtcbiAgICAgICAgICAgICAgICByID0gWydDJywgc3ltZXRyaWNTWzBdLCBzeW1ldHJpY1NbMV0sIHJbMV0sIHJbMl0sIHgsIHldO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnTSc6XG4gICAgICAgICAgICAgICAgbXggPSByW3IubGVuZ3RoIC0gMl07XG4gICAgICAgICAgICAgICAgbXkgPSByW3IubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgYnJlYWs7IC8vIGZvciBsaW50XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHggPSByW3IubGVuZ3RoIC0gMl07XG4gICAgICAgICAgICAgICAgeSA9IHJbci5sZW5ndGggLSAxXTtcbiAgICAgICAgfVxuICAgICAgICByZXMucHVzaChyKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBhdGgtMi1hYnNvbHV0ZS5qcy5tYXAiLCJ2YXIgVEFVID0gTWF0aC5QSSAqIDI7XG52YXIgbWFwVG9FbGxpcHNlID0gZnVuY3Rpb24gKF9hLCByeCwgcnksIGNvc3BoaSwgc2lucGhpLCBjZW50ZXJ4LCBjZW50ZXJ5KSB7XG4gICAgdmFyIHggPSBfYS54LCB5ID0gX2EueTtcbiAgICB4ICo9IHJ4O1xuICAgIHkgKj0gcnk7XG4gICAgdmFyIHhwID0gY29zcGhpICogeCAtIHNpbnBoaSAqIHk7XG4gICAgdmFyIHlwID0gc2lucGhpICogeCArIGNvc3BoaSAqIHk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgeDogeHAgKyBjZW50ZXJ4LFxuICAgICAgICB5OiB5cCArIGNlbnRlcnlcbiAgICB9O1xufTtcbnZhciBhcHByb3hVbml0QXJjID0gZnVuY3Rpb24gKGFuZzEsIGFuZzIpIHtcbiAgICAvLyBJZiA5MCBkZWdyZWUgY2lyY3VsYXIgYXJjLCB1c2UgYSBjb25zdGFudFxuICAgIC8vIGFzIGRlcml2ZWQgZnJvbSBodHRwOi8vc3BlbmNlcm1vcnRlbnNlbi5jb20vYXJ0aWNsZXMvYmV6aWVyLWNpcmNsZVxuICAgIHZhciBhID0gYW5nMiA9PT0gMS41NzA3OTYzMjY3OTQ4OTY2XG4gICAgICAgID8gMC41NTE5MTUwMjQ0OTRcbiAgICAgICAgOiBhbmcyID09PSAtMS41NzA3OTYzMjY3OTQ4OTY2XG4gICAgICAgICAgICA/IC0wLjU1MTkxNTAyNDQ5NFxuICAgICAgICAgICAgOiA0IC8gMyAqIE1hdGgudGFuKGFuZzIgLyA0KTtcbiAgICB2YXIgeDEgPSBNYXRoLmNvcyhhbmcxKTtcbiAgICB2YXIgeTEgPSBNYXRoLnNpbihhbmcxKTtcbiAgICB2YXIgeDIgPSBNYXRoLmNvcyhhbmcxICsgYW5nMik7XG4gICAgdmFyIHkyID0gTWF0aC5zaW4oYW5nMSArIGFuZzIpO1xuICAgIHJldHVybiBbXG4gICAgICAgIHtcbiAgICAgICAgICAgIHg6IHgxIC0geTEgKiBhLFxuICAgICAgICAgICAgeTogeTEgKyB4MSAqIGFcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgeDogeDIgKyB5MiAqIGEsXG4gICAgICAgICAgICB5OiB5MiAtIHgyICogYVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICB4OiB4MixcbiAgICAgICAgICAgIHk6IHkyXG4gICAgICAgIH1cbiAgICBdO1xufTtcbnZhciB2ZWN0b3JBbmdsZSA9IGZ1bmN0aW9uICh1eCwgdXksIHZ4LCB2eSkge1xuICAgIHZhciBzaWduID0gKHV4ICogdnkgLSB1eSAqIHZ4IDwgMCkgPyAtMSA6IDE7XG4gICAgdmFyIGRvdCA9IHV4ICogdnggKyB1eSAqIHZ5O1xuICAgIGlmIChkb3QgPiAxKSB7XG4gICAgICAgIGRvdCA9IDE7XG4gICAgfVxuICAgIGlmIChkb3QgPCAtMSkge1xuICAgICAgICBkb3QgPSAtMTtcbiAgICB9XG4gICAgcmV0dXJuIHNpZ24gKiBNYXRoLmFjb3MoZG90KTtcbn07XG52YXIgZ2V0QXJjQ2VudGVyID0gZnVuY3Rpb24gKHB4LCBweSwgY3gsIGN5LCByeCwgcnksIGxhcmdlQXJjRmxhZywgc3dlZXBGbGFnLCBzaW5waGksIGNvc3BoaSwgcHhwLCBweXApIHtcbiAgICB2YXIgcnhzcSA9IE1hdGgucG93KHJ4LCAyKTtcbiAgICB2YXIgcnlzcSA9IE1hdGgucG93KHJ5LCAyKTtcbiAgICB2YXIgcHhwc3EgPSBNYXRoLnBvdyhweHAsIDIpO1xuICAgIHZhciBweXBzcSA9IE1hdGgucG93KHB5cCwgMik7XG4gICAgdmFyIHJhZGljYW50ID0gKHJ4c3EgKiByeXNxKSAtIChyeHNxICogcHlwc3EpIC0gKHJ5c3EgKiBweHBzcSk7XG4gICAgaWYgKHJhZGljYW50IDwgMCkge1xuICAgICAgICByYWRpY2FudCA9IDA7XG4gICAgfVxuICAgIHJhZGljYW50IC89IChyeHNxICogcHlwc3EpICsgKHJ5c3EgKiBweHBzcSk7XG4gICAgcmFkaWNhbnQgPSBNYXRoLnNxcnQocmFkaWNhbnQpICogKGxhcmdlQXJjRmxhZyA9PT0gc3dlZXBGbGFnID8gLTEgOiAxKTtcbiAgICB2YXIgY2VudGVyeHAgPSByYWRpY2FudCAqIHJ4IC8gcnkgKiBweXA7XG4gICAgdmFyIGNlbnRlcnlwID0gcmFkaWNhbnQgKiAtcnkgLyByeCAqIHB4cDtcbiAgICB2YXIgY2VudGVyeCA9IGNvc3BoaSAqIGNlbnRlcnhwIC0gc2lucGhpICogY2VudGVyeXAgKyAocHggKyBjeCkgLyAyO1xuICAgIHZhciBjZW50ZXJ5ID0gc2lucGhpICogY2VudGVyeHAgKyBjb3NwaGkgKiBjZW50ZXJ5cCArIChweSArIGN5KSAvIDI7XG4gICAgdmFyIHZ4MSA9IChweHAgLSBjZW50ZXJ4cCkgLyByeDtcbiAgICB2YXIgdnkxID0gKHB5cCAtIGNlbnRlcnlwKSAvIHJ5O1xuICAgIHZhciB2eDIgPSAoLXB4cCAtIGNlbnRlcnhwKSAvIHJ4O1xuICAgIHZhciB2eTIgPSAoLXB5cCAtIGNlbnRlcnlwKSAvIHJ5O1xuICAgIHZhciBhbmcxID0gdmVjdG9yQW5nbGUoMSwgMCwgdngxLCB2eTEpO1xuICAgIHZhciBhbmcyID0gdmVjdG9yQW5nbGUodngxLCB2eTEsIHZ4MiwgdnkyKTtcbiAgICBpZiAoc3dlZXBGbGFnID09PSAwICYmIGFuZzIgPiAwKSB7XG4gICAgICAgIGFuZzIgLT0gVEFVO1xuICAgIH1cbiAgICBpZiAoc3dlZXBGbGFnID09PSAxICYmIGFuZzIgPCAwKSB7XG4gICAgICAgIGFuZzIgKz0gVEFVO1xuICAgIH1cbiAgICByZXR1cm4gW2NlbnRlcngsIGNlbnRlcnksIGFuZzEsIGFuZzJdO1xufTtcbnZhciBhcmNUb0JlemllciA9IGZ1bmN0aW9uIChfYSkge1xuICAgIHZhciBweCA9IF9hLnB4LCBweSA9IF9hLnB5LCBjeCA9IF9hLmN4LCBjeSA9IF9hLmN5LCByeCA9IF9hLnJ4LCByeSA9IF9hLnJ5LCBfYiA9IF9hLnhBeGlzUm90YXRpb24sIHhBeGlzUm90YXRpb24gPSBfYiA9PT0gdm9pZCAwID8gMCA6IF9iLCBfYyA9IF9hLmxhcmdlQXJjRmxhZywgbGFyZ2VBcmNGbGFnID0gX2MgPT09IHZvaWQgMCA/IDAgOiBfYywgX2QgPSBfYS5zd2VlcEZsYWcsIHN3ZWVwRmxhZyA9IF9kID09PSB2b2lkIDAgPyAwIDogX2Q7XG4gICAgdmFyIGN1cnZlcyA9IFtdO1xuICAgIGlmIChyeCA9PT0gMCB8fCByeSA9PT0gMCkge1xuICAgICAgICByZXR1cm4gW3sgeDE6IDAsIHkxOiAwLCB4MjogMCwgeTI6IDAsIHg6IGN4LCB5OiBjeSB9XTtcbiAgICB9XG4gICAgdmFyIHNpbnBoaSA9IE1hdGguc2luKHhBeGlzUm90YXRpb24gKiBUQVUgLyAzNjApO1xuICAgIHZhciBjb3NwaGkgPSBNYXRoLmNvcyh4QXhpc1JvdGF0aW9uICogVEFVIC8gMzYwKTtcbiAgICB2YXIgcHhwID0gY29zcGhpICogKHB4IC0gY3gpIC8gMiArIHNpbnBoaSAqIChweSAtIGN5KSAvIDI7XG4gICAgdmFyIHB5cCA9IC1zaW5waGkgKiAocHggLSBjeCkgLyAyICsgY29zcGhpICogKHB5IC0gY3kpIC8gMjtcbiAgICBpZiAocHhwID09PSAwICYmIHB5cCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gW3sgeDE6IDAsIHkxOiAwLCB4MjogMCwgeTI6IDAsIHg6IGN4LCB5OiBjeSB9XTtcbiAgICB9XG4gICAgcnggPSBNYXRoLmFicyhyeCk7XG4gICAgcnkgPSBNYXRoLmFicyhyeSk7XG4gICAgdmFyIGxhbWJkYSA9IE1hdGgucG93KHB4cCwgMikgLyBNYXRoLnBvdyhyeCwgMikgK1xuICAgICAgICBNYXRoLnBvdyhweXAsIDIpIC8gTWF0aC5wb3cocnksIDIpO1xuICAgIGlmIChsYW1iZGEgPiAxKSB7XG4gICAgICAgIHJ4ICo9IE1hdGguc3FydChsYW1iZGEpO1xuICAgICAgICByeSAqPSBNYXRoLnNxcnQobGFtYmRhKTtcbiAgICB9XG4gICAgdmFyIF9lID0gZ2V0QXJjQ2VudGVyKHB4LCBweSwgY3gsIGN5LCByeCwgcnksIGxhcmdlQXJjRmxhZywgc3dlZXBGbGFnLCBzaW5waGksIGNvc3BoaSwgcHhwLCBweXApLCBjZW50ZXJ4ID0gX2VbMF0sIGNlbnRlcnkgPSBfZVsxXSwgYW5nMSA9IF9lWzJdLCBhbmcyID0gX2VbM107XG4gICAgLy8gSWYgJ2FuZzInID09IDkwLjAwMDAwMDAwMDEsIHRoZW4gYHJhdGlvYCB3aWxsIGV2YWx1YXRlIHRvXG4gICAgLy8gMS4wMDAwMDAwMDAxLiBUaGlzIGNhdXNlcyBgc2VnbWVudHNgIHRvIGJlIGdyZWF0ZXIgdGhhbiBvbmUsIHdoaWNoIGlzIGFuXG4gICAgLy8gdW5lY2Vzc2FyeSBzcGxpdCwgYW5kIGFkZHMgZXh0cmEgcG9pbnRzIHRvIHRoZSBiZXppZXIgY3VydmUuIFRvIGFsbGV2aWF0ZVxuICAgIC8vIHRoaXMgaXNzdWUsIHdlIHJvdW5kIHRvIDEuMCB3aGVuIHRoZSByYXRpbyBpcyBjbG9zZSB0byAxLjAuXG4gICAgdmFyIHJhdGlvID0gTWF0aC5hYnMoYW5nMikgLyAoVEFVIC8gNCk7XG4gICAgaWYgKE1hdGguYWJzKDEuMCAtIHJhdGlvKSA8IDAuMDAwMDAwMSkge1xuICAgICAgICByYXRpbyA9IDEuMDtcbiAgICB9XG4gICAgdmFyIHNlZ21lbnRzID0gTWF0aC5tYXgoTWF0aC5jZWlsKHJhdGlvKSwgMSk7XG4gICAgYW5nMiAvPSBzZWdtZW50cztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlZ21lbnRzOyBpKyspIHtcbiAgICAgICAgY3VydmVzLnB1c2goYXBwcm94VW5pdEFyYyhhbmcxLCBhbmcyKSk7XG4gICAgICAgIGFuZzEgKz0gYW5nMjtcbiAgICB9XG4gICAgcmV0dXJuIGN1cnZlcy5tYXAoZnVuY3Rpb24gKGN1cnZlKSB7XG4gICAgICAgIHZhciBfYSA9IG1hcFRvRWxsaXBzZShjdXJ2ZVswXSwgcngsIHJ5LCBjb3NwaGksIHNpbnBoaSwgY2VudGVyeCwgY2VudGVyeSksIHgxID0gX2EueCwgeTEgPSBfYS55O1xuICAgICAgICB2YXIgX2IgPSBtYXBUb0VsbGlwc2UoY3VydmVbMV0sIHJ4LCByeSwgY29zcGhpLCBzaW5waGksIGNlbnRlcngsIGNlbnRlcnkpLCB4MiA9IF9iLngsIHkyID0gX2IueTtcbiAgICAgICAgdmFyIF9jID0gbWFwVG9FbGxpcHNlKGN1cnZlWzJdLCByeCwgcnksIGNvc3BoaSwgc2lucGhpLCBjZW50ZXJ4LCBjZW50ZXJ5KSwgeCA9IF9jLngsIHkgPSBfYy55O1xuICAgICAgICByZXR1cm4geyB4MTogeDEsIHkxOiB5MSwgeDI6IHgyLCB5MjogeTIsIHg6IHgsIHk6IHkgfTtcbiAgICB9KTtcbn07XG5leHBvcnQgZnVuY3Rpb24gYXJjVG9DdWJpYyh4MSwgeTEsIHJ4LCByeSwgYW5nbGUsIExBRiwgU0YsIHgyLCB5Mikge1xuICAgIHZhciBjdXJ2ZXMgPSBhcmNUb0Jlemllcih7XG4gICAgICAgIHB4OiB4MSxcbiAgICAgICAgcHk6IHkxLFxuICAgICAgICBjeDogeDIsXG4gICAgICAgIGN5OiB5MixcbiAgICAgICAgcng6IHJ4LFxuICAgICAgICByeTogcnksXG4gICAgICAgIHhBeGlzUm90YXRpb246IGFuZ2xlLFxuICAgICAgICBsYXJnZUFyY0ZsYWc6IExBRixcbiAgICAgICAgc3dlZXBGbGFnOiBTRixcbiAgICB9KTtcbiAgICByZXR1cm4gY3VydmVzLnJlZHVjZShmdW5jdGlvbiAocHJldiwgY3VyKSB7XG4gICAgICAgIHZhciB4MSA9IGN1ci54MSwgeTEgPSBjdXIueTEsIHgyID0gY3VyLngyLCB5MiA9IGN1ci55MiwgeCA9IGN1ci54LCB5ID0gY3VyLnk7XG4gICAgICAgIHByZXYucHVzaCh4MSwgeTEsIHgyLCB5MiwgeCwgeSk7XG4gICAgICAgIHJldHVybiBwcmV2O1xuICAgIH0sIFtdKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFyYy0yLWN1YmljLmpzLm1hcCIsImV4cG9ydCBmdW5jdGlvbiBxdWFkVG9DdWJpYyh4MSwgeTEsIHF4LCBxeSwgeDIsIHkyKSB7XG4gICAgdmFyIHIxMyA9IDEgLyAzO1xuICAgIHZhciByMjMgPSAyIC8gMztcbiAgICByZXR1cm4gW1xuICAgICAgICByMTMgKiB4MSArIHIyMyAqIHF4LFxuICAgICAgICByMTMgKiB5MSArIHIyMyAqIHF5LFxuICAgICAgICByMTMgKiB4MiArIHIyMyAqIHF4LFxuICAgICAgICByMTMgKiB5MiArIHIyMyAqIHF5LFxuICAgICAgICB4MiwgeTIsIC8vIHgseVxuICAgIF07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1xdWFkLTItY3ViaWMuanMubWFwIiwiLy8gZXhwb3J0IGZ1bmN0aW9uIGdldFBvaW50QXRTZWdMZW5ndGgocDF4OiBudW1iZXIsIHAxeTogbnVtYmVyLCBjMXg6IG51bWJlciwgYzF5OiBudW1iZXIsIGMyeDogbnVtYmVyLCBjMnk6IG51bWJlciwgcDJ4OiBudW1iZXIsIHAyeTogbnVtYmVyLCB0OiBudW1iZXIpIHtcbi8vICAgY29uc3QgdDEgPSAxIC0gdDtcbi8vICAgcmV0dXJuIHtcbi8vICAgICB4OiAodDEgKiogMykgKiBwMXhcbi8vICAgICAgICsgdDEgKiB0MSAqIDMgKiB0ICogYzF4XG4vLyAgICAgICArIHQxICogMyAqIHQgKiB0ICogYzJ4XG4vLyAgICAgICArICh0ICoqIDMpICogcDJ4LFxuLy8gICAgIHk6ICh0MSAqKiAzKSAqIHAxeVxuLy8gICAgICAgKyB0MSAqIHQxICogMyAqIHQgKiBjMXlcbi8vICAgICAgICsgdDEgKiAzICogdCAqIHQgKiBjMnlcbi8vICAgICAgICsgKHQgKiogMykgKiBwMnksXG4vLyAgIH07XG4vLyB9XG4vLyBleHBvcnQgZnVuY3Rpb24gbWlkUG9pbnQoYTogbnVtYmVyW10sIGI6IG51bWJlcltdLCB0OiBudW1iZXIpIHtcbi8vICAgY29uc3QgYXggPSBhWzBdO1xuLy8gICBjb25zdCBheSA9IGFbMV07XG4vLyAgIGNvbnN0IGJ4ID0gYlswXTtcbi8vICAgY29uc3QgYnkgPSBiWzFdO1xuLy8gICByZXR1cm4gW2F4ICsgKGJ4IC0gYXgpICogdCwgYXkgKyAoYnkgLSBheSkgKiB0XTtcbi8vIH1cbmV4cG9ydCBmdW5jdGlvbiBsaW5lVG9DdWJpYyh4MSwgeTEsIHgyLCB5Mikge1xuICAgIHJldHVybiBbeDEsIHkxLCB4MiwgeTIsIHgyLCB5Ml07XG4gICAgLy8gY29uc3QgdCA9IDAuNTtcbiAgICAvLyBjb25zdCBwMCA9IFt4MSwgeTFdO1xuICAgIC8vIGNvbnN0IHAxID0gW3gyLCB5Ml07XG4gICAgLy8gY29uc3QgcDIgPSBtaWRQb2ludChwMCwgcDEsIHQpO1xuICAgIC8vIGNvbnN0IHAzID0gbWlkUG9pbnQocDEsIHAyLCB0KTtcbiAgICAvLyBjb25zdCBwNCA9IG1pZFBvaW50KHAyLCBwMywgdCk7XG4gICAgLy8gY29uc3QgcDUgPSBtaWRQb2ludChwMywgcDQsIHQpO1xuICAgIC8vIGNvbnN0IHA2ID0gbWlkUG9pbnQocDQsIHA1LCB0KTtcbiAgICAvLyBjb25zdCBjcDEgPSBnZXRQb2ludEF0U2VnTGVuZ3RoLmFwcGx5KDAsIHAwLmNvbmNhdChwMiwgcDQsIHA2LCB0KSk7XG4gICAgLy8gY29uc3QgY3AyID0gZ2V0UG9pbnRBdFNlZ0xlbmd0aC5hcHBseSgwLCBwNi5jb25jYXQocDUsIHAzLCBwMSwgMCkpO1xuICAgIC8vIHJldHVybiBbY3AxLngsIGNwMS55LCBjcDIueCwgY3AyLnksIHgyLCB5Ml07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1saW5lLTItY3ViaWMuanMubWFwIiwiaW1wb3J0IHsgYXJjVG9DdWJpYyB9IGZyb20gJy4vYXJjLTItY3ViaWMnO1xuaW1wb3J0IHsgcXVhZFRvQ3ViaWMgfSBmcm9tICcuL3F1YWQtMi1jdWJpYyc7XG5pbXBvcnQgeyBsaW5lVG9DdWJpYyB9IGZyb20gJy4vbGluZS0yLWN1YmljJztcbmV4cG9ydCBmdW5jdGlvbiBzZWdtZW50VG9DdWJpYyhzZWdtZW50LCBwYXJhbXMpIHtcbiAgICBpZiAoJ1RRJy5pbmRleE9mKHNlZ21lbnRbMF0pIDwgMCkge1xuICAgICAgICBwYXJhbXMucXggPSBudWxsO1xuICAgICAgICBwYXJhbXMucXkgPSBudWxsO1xuICAgIH1cbiAgICB2YXIgX2EgPSBzZWdtZW50LnNsaWNlKDEpLCBzMSA9IF9hWzBdLCBzMiA9IF9hWzFdO1xuICAgIHN3aXRjaCAoc2VnbWVudFswXSkge1xuICAgICAgICBjYXNlICdNJzpcbiAgICAgICAgICAgIHBhcmFtcy54ID0gczE7XG4gICAgICAgICAgICBwYXJhbXMueSA9IHMyO1xuICAgICAgICAgICAgcmV0dXJuIHNlZ21lbnQ7XG4gICAgICAgIGNhc2UgJ0EnOlxuICAgICAgICAgICAgcmV0dXJuIFsnQyddLmNvbmNhdChhcmNUb0N1YmljLmFwcGx5KDAsIFtwYXJhbXMueDEsIHBhcmFtcy55MV0uY29uY2F0KHNlZ21lbnQuc2xpY2UoMSkpKSk7XG4gICAgICAgIGNhc2UgJ1EnOlxuICAgICAgICAgICAgcGFyYW1zLnF4ID0gczE7XG4gICAgICAgICAgICBwYXJhbXMucXkgPSBzMjtcbiAgICAgICAgICAgIHJldHVybiBbJ0MnXS5jb25jYXQocXVhZFRvQ3ViaWMuYXBwbHkoMCwgW3BhcmFtcy54MSwgcGFyYW1zLnkxXS5jb25jYXQoc2VnbWVudC5zbGljZSgxKSkpKTtcbiAgICAgICAgY2FzZSAnTCc6XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICByZXR1cm4gWydDJ10uY29uY2F0KGxpbmVUb0N1YmljKHBhcmFtcy54MSwgcGFyYW1zLnkxLCBzZWdtZW50WzFdLCBzZWdtZW50WzJdKSk7XG4gICAgICAgIGNhc2UgJ0gnOlxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgcmV0dXJuIFsnQyddLmNvbmNhdChsaW5lVG9DdWJpYyhwYXJhbXMueDEsIHBhcmFtcy55MSwgc2VnbWVudFsxXSwgcGFyYW1zLnkxKSk7XG4gICAgICAgIGNhc2UgJ1YnOlxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgcmV0dXJuIFsnQyddLmNvbmNhdChsaW5lVG9DdWJpYyhwYXJhbXMueDEsIHBhcmFtcy55MSwgcGFyYW1zLngxLCBzZWdtZW50WzFdKSk7XG4gICAgICAgIGNhc2UgJ1onOlxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgcmV0dXJuIFsnQyddLmNvbmNhdChsaW5lVG9DdWJpYyhwYXJhbXMueDEsIHBhcmFtcy55MSwgcGFyYW1zLngsIHBhcmFtcy55KSk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgfVxuICAgIHJldHVybiBzZWdtZW50O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2VnbWVudC0yLWN1YmljLmpzLm1hcCIsImltcG9ydCBwYXRoMkFic29sdXRlIGZyb20gJy4vcGF0aC0yLWFic29sdXRlJztcbmltcG9ydCB7IHNlZ21lbnRUb0N1YmljIH0gZnJvbSAnLi9wcm9jZXNzL3NlZ21lbnQtMi1jdWJpYyc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBwYXRoVG9DdXJ2ZShwYXRoLCBuZWVkWkNvbW1hbmRJbmRleGVzKSB7XG4gICAgaWYgKG5lZWRaQ29tbWFuZEluZGV4ZXMgPT09IHZvaWQgMCkgeyBuZWVkWkNvbW1hbmRJbmRleGVzID0gZmFsc2U7IH1cbiAgICB2YXIgcGF0aEFycmF5ID0gcGF0aDJBYnNvbHV0ZShwYXRoKTtcbiAgICB2YXIgcGFyYW1zID0ge1xuICAgICAgICB4MTogMCwgeTE6IDAsIHgyOiAwLCB5MjogMCwgeDogMCwgeTogMCwgcXg6IG51bGwsIHF5OiBudWxsLFxuICAgIH07XG4gICAgdmFyIGFsbFBhdGhDb21tYW5kcyA9IFtdO1xuICAgIHZhciBwYXRoQ29tbWFuZCA9ICcnO1xuICAgIHZhciBpaSA9IHBhdGhBcnJheS5sZW5ndGg7XG4gICAgdmFyIHNlZ21lbnQ7XG4gICAgdmFyIHNlZ2xlbjtcbiAgICB2YXIgekNvbW1hbmRJbmRleGVzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpaTsgaSArPSAxKSB7XG4gICAgICAgIGlmIChwYXRoQXJyYXlbaV0pXG4gICAgICAgICAgICBwYXRoQ29tbWFuZCA9IHBhdGhBcnJheVtpXVswXTtcbiAgICAgICAgYWxsUGF0aENvbW1hbmRzW2ldID0gcGF0aENvbW1hbmQ7XG4gICAgICAgIHBhdGhBcnJheVtpXSA9IHNlZ21lbnRUb0N1YmljKHBhdGhBcnJheVtpXSwgcGFyYW1zKTtcbiAgICAgICAgZml4QXJjKHBhdGhBcnJheSwgYWxsUGF0aENvbW1hbmRzLCBpKTtcbiAgICAgICAgaWkgPSBwYXRoQXJyYXkubGVuZ3RoOyAvLyBzb2x2ZXMgY3VydmVBcnJheXMgZW5kaW5nIGluIFpcbiAgICAgICAgLy8ga2VlcCBaIGNvbW1hbmQgYWNjb3VudCBmb3IgbGluZUpvaW5cbiAgICAgICAgLy8gQHNlZSBodHRwczovL2dpdGh1Yi5jb20vYW50dmlzL3V0aWwvaXNzdWVzLzY4XG4gICAgICAgIGlmIChwYXRoQ29tbWFuZCA9PT0gJ1onKSB7XG4gICAgICAgICAgICB6Q29tbWFuZEluZGV4ZXMucHVzaChpKTtcbiAgICAgICAgfVxuICAgICAgICBzZWdtZW50ID0gcGF0aEFycmF5W2ldO1xuICAgICAgICBzZWdsZW4gPSBzZWdtZW50Lmxlbmd0aDtcbiAgICAgICAgcGFyYW1zLngxID0gK3NlZ21lbnRbc2VnbGVuIC0gMl07XG4gICAgICAgIHBhcmFtcy55MSA9ICtzZWdtZW50W3NlZ2xlbiAtIDFdO1xuICAgICAgICBwYXJhbXMueDIgPSArKHNlZ21lbnRbc2VnbGVuIC0gNF0pIHx8IHBhcmFtcy54MTtcbiAgICAgICAgcGFyYW1zLnkyID0gKyhzZWdtZW50W3NlZ2xlbiAtIDNdKSB8fCBwYXJhbXMueTE7XG4gICAgfVxuICAgIGlmIChuZWVkWkNvbW1hbmRJbmRleGVzKSB7XG4gICAgICAgIHJldHVybiBbcGF0aEFycmF5LCB6Q29tbWFuZEluZGV4ZXNdO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHBhdGhBcnJheTtcbiAgICB9XG59XG5mdW5jdGlvbiBmaXhBcmMocGF0aEFycmF5LCBhbGxQYXRoQ29tbWFuZHMsIGkpIHtcbiAgICBpZiAocGF0aEFycmF5W2ldLmxlbmd0aCA+IDcpIHtcbiAgICAgICAgcGF0aEFycmF5W2ldLnNoaWZ0KCk7XG4gICAgICAgIHZhciBwaSA9IHBhdGhBcnJheVtpXTtcbiAgICAgICAgLy8gY29uc3QgbmkgPSBpICsgMTtcbiAgICAgICAgdmFyIG5pID0gaTtcbiAgICAgICAgd2hpbGUgKHBpLmxlbmd0aCkge1xuICAgICAgICAgICAgLy8gaWYgY3JlYXRlZCBtdWx0aXBsZSBDOnMsIHRoZWlyIG9yaWdpbmFsIHNlZyBpcyBzYXZlZFxuICAgICAgICAgICAgYWxsUGF0aENvbW1hbmRzW2ldID0gJ0EnO1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgcGF0aEFycmF5LnNwbGljZShuaSArPSAxLCAwLCBbJ0MnXS5jb25jYXQocGkuc3BsaWNlKDAsIDYpKSk7XG4gICAgICAgIH1cbiAgICAgICAgcGF0aEFycmF5LnNwbGljZShpLCAxKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wYXRoLTItY3VydmUuanMubWFwIiwiaW1wb3J0IHsgaXNBcnJheSB9IGZyb20gJ0BhbnR2L3V0aWwnO1xuaW1wb3J0IHJlY3RQYXRoIGZyb20gJy4vcmVjdC1wYXRoJztcbmltcG9ydCBwYXRoMkN1cnZlIGZyb20gJy4vcGF0aC0yLWN1cnZlJztcbnZhciBiYXNlMyA9IGZ1bmN0aW9uICh0LCBwMSwgcDIsIHAzLCBwNCkge1xuICAgIHZhciB0MSA9IC0zICogcDEgKyA5ICogcDIgLSA5ICogcDMgKyAzICogcDQ7XG4gICAgdmFyIHQyID0gdCAqIHQxICsgNiAqIHAxIC0gMTIgKiBwMiArIDYgKiBwMztcbiAgICByZXR1cm4gdCAqIHQyIC0gMyAqIHAxICsgMyAqIHAyO1xufTtcbnZhciBiZXpsZW4gPSBmdW5jdGlvbiAoeDEsIHkxLCB4MiwgeTIsIHgzLCB5MywgeDQsIHk0LCB6KSB7XG4gICAgaWYgKHogPT09IG51bGwpIHtcbiAgICAgICAgeiA9IDE7XG4gICAgfVxuICAgIHogPSB6ID4gMSA/IDEgOiB6IDwgMCA/IDAgOiB6O1xuICAgIHZhciB6MiA9IHogLyAyO1xuICAgIHZhciBuID0gMTI7XG4gICAgdmFyIFR2YWx1ZXMgPSBbLTAuMTI1MiwgMC4xMjUyLCAtMC4zNjc4LCAwLjM2NzgsIC0wLjU4NzMsIDAuNTg3MywgLTAuNzY5OSwgMC43Njk5LCAtMC45MDQxLCAwLjkwNDEsIC0wLjk4MTYsIDAuOTgxNl07XG4gICAgdmFyIEN2YWx1ZXMgPSBbMC4yNDkxLCAwLjI0OTEsIDAuMjMzNSwgMC4yMzM1LCAwLjIwMzIsIDAuMjAzMiwgMC4xNjAxLCAwLjE2MDEsIDAuMTA2OSwgMC4xMDY5LCAwLjA0NzIsIDAuMDQ3Ml07XG4gICAgdmFyIHN1bSA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgdmFyIGN0ID0gejIgKiBUdmFsdWVzW2ldICsgejI7XG4gICAgICAgIHZhciB4YmFzZSA9IGJhc2UzKGN0LCB4MSwgeDIsIHgzLCB4NCk7XG4gICAgICAgIHZhciB5YmFzZSA9IGJhc2UzKGN0LCB5MSwgeTIsIHkzLCB5NCk7XG4gICAgICAgIHZhciBjb21iID0geGJhc2UgKiB4YmFzZSArIHliYXNlICogeWJhc2U7XG4gICAgICAgIHN1bSArPSBDdmFsdWVzW2ldICogTWF0aC5zcXJ0KGNvbWIpO1xuICAgIH1cbiAgICByZXR1cm4gejIgKiBzdW07XG59O1xudmFyIGN1cnZlRGltID0gZnVuY3Rpb24gKHgwLCB5MCwgeDEsIHkxLCB4MiwgeTIsIHgzLCB5Mykge1xuICAgIHZhciB0dmFsdWVzID0gW107XG4gICAgdmFyIGJvdW5kcyA9IFtcbiAgICAgICAgW10sXG4gICAgICAgIFtdLFxuICAgIF07XG4gICAgdmFyIGE7XG4gICAgdmFyIGI7XG4gICAgdmFyIGM7XG4gICAgdmFyIHQ7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCAyOyArK2kpIHtcbiAgICAgICAgaWYgKGkgPT09IDApIHtcbiAgICAgICAgICAgIGIgPSA2ICogeDAgLSAxMiAqIHgxICsgNiAqIHgyO1xuICAgICAgICAgICAgYSA9IC0zICogeDAgKyA5ICogeDEgLSA5ICogeDIgKyAzICogeDM7XG4gICAgICAgICAgICBjID0gMyAqIHgxIC0gMyAqIHgwO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgYiA9IDYgKiB5MCAtIDEyICogeTEgKyA2ICogeTI7XG4gICAgICAgICAgICBhID0gLTMgKiB5MCArIDkgKiB5MSAtIDkgKiB5MiArIDMgKiB5MztcbiAgICAgICAgICAgIGMgPSAzICogeTEgLSAzICogeTA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKE1hdGguYWJzKGEpIDwgMWUtMTIpIHtcbiAgICAgICAgICAgIGlmIChNYXRoLmFicyhiKSA8IDFlLTEyKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0ID0gLWMgLyBiO1xuICAgICAgICAgICAgaWYgKHQgPiAwICYmIHQgPCAxKSB7XG4gICAgICAgICAgICAgICAgdHZhbHVlcy5wdXNoKHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGIyYWMgPSBiICogYiAtIDQgKiBjICogYTtcbiAgICAgICAgdmFyIHNxcnRiMmFjID0gTWF0aC5zcXJ0KGIyYWMpO1xuICAgICAgICBpZiAoYjJhYyA8IDApIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHZhciB0MSA9ICgtYiArIHNxcnRiMmFjKSAvICgyICogYSk7XG4gICAgICAgIGlmICh0MSA+IDAgJiYgdDEgPCAxKSB7XG4gICAgICAgICAgICB0dmFsdWVzLnB1c2godDEpO1xuICAgICAgICB9XG4gICAgICAgIHZhciB0MiA9ICgtYiAtIHNxcnRiMmFjKSAvICgyICogYSk7XG4gICAgICAgIGlmICh0MiA+IDAgJiYgdDIgPCAxKSB7XG4gICAgICAgICAgICB0dmFsdWVzLnB1c2godDIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHZhciBqID0gdHZhbHVlcy5sZW5ndGg7XG4gICAgdmFyIGpsZW4gPSBqO1xuICAgIHZhciBtdDtcbiAgICB3aGlsZSAoai0tKSB7XG4gICAgICAgIHQgPSB0dmFsdWVzW2pdO1xuICAgICAgICBtdCA9IDEgLSB0O1xuICAgICAgICBib3VuZHNbMF1bal0gPSAobXQgKiBtdCAqIG10ICogeDApICsgKDMgKiBtdCAqIG10ICogdCAqIHgxKSArICgzICogbXQgKiB0ICogdCAqIHgyKSArICh0ICogdCAqIHQgKiB4Myk7XG4gICAgICAgIGJvdW5kc1sxXVtqXSA9IChtdCAqIG10ICogbXQgKiB5MCkgKyAoMyAqIG10ICogbXQgKiB0ICogeTEpICsgKDMgKiBtdCAqIHQgKiB0ICogeTIpICsgKHQgKiB0ICogdCAqIHkzKTtcbiAgICB9XG4gICAgYm91bmRzWzBdW2psZW5dID0geDA7XG4gICAgYm91bmRzWzFdW2psZW5dID0geTA7XG4gICAgYm91bmRzWzBdW2psZW4gKyAxXSA9IHgzO1xuICAgIGJvdW5kc1sxXVtqbGVuICsgMV0gPSB5MztcbiAgICBib3VuZHNbMF0ubGVuZ3RoID0gYm91bmRzWzFdLmxlbmd0aCA9IGpsZW4gKyAyO1xuICAgIHJldHVybiB7XG4gICAgICAgIG1pbjoge1xuICAgICAgICAgICAgeDogTWF0aC5taW4uYXBwbHkoMCwgYm91bmRzWzBdKSxcbiAgICAgICAgICAgIHk6IE1hdGgubWluLmFwcGx5KDAsIGJvdW5kc1sxXSksXG4gICAgICAgIH0sXG4gICAgICAgIG1heDoge1xuICAgICAgICAgICAgeDogTWF0aC5tYXguYXBwbHkoMCwgYm91bmRzWzBdKSxcbiAgICAgICAgICAgIHk6IE1hdGgubWF4LmFwcGx5KDAsIGJvdW5kc1sxXSksXG4gICAgICAgIH0sXG4gICAgfTtcbn07XG52YXIgaW50ZXJzZWN0ID0gZnVuY3Rpb24gKHgxLCB5MSwgeDIsIHkyLCB4MywgeTMsIHg0LCB5NCkge1xuICAgIGlmIChNYXRoLm1heCh4MSwgeDIpIDwgTWF0aC5taW4oeDMsIHg0KSB8fFxuICAgICAgICBNYXRoLm1pbih4MSwgeDIpID4gTWF0aC5tYXgoeDMsIHg0KSB8fFxuICAgICAgICBNYXRoLm1heCh5MSwgeTIpIDwgTWF0aC5taW4oeTMsIHk0KSB8fFxuICAgICAgICBNYXRoLm1pbih5MSwgeTIpID4gTWF0aC5tYXgoeTMsIHk0KSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBueCA9ICh4MSAqIHkyIC0geTEgKiB4MikgKiAoeDMgLSB4NCkgLSAoeDEgLSB4MikgKiAoeDMgKiB5NCAtIHkzICogeDQpO1xuICAgIHZhciBueSA9ICh4MSAqIHkyIC0geTEgKiB4MikgKiAoeTMgLSB5NCkgLSAoeTEgLSB5MikgKiAoeDMgKiB5NCAtIHkzICogeDQpO1xuICAgIHZhciBkZW5vbWluYXRvciA9ICh4MSAtIHgyKSAqICh5MyAtIHk0KSAtICh5MSAtIHkyKSAqICh4MyAtIHg0KTtcbiAgICBpZiAoIWRlbm9taW5hdG9yKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHB4ID0gbnggLyBkZW5vbWluYXRvcjtcbiAgICB2YXIgcHkgPSBueSAvIGRlbm9taW5hdG9yO1xuICAgIHZhciBweDIgPSArcHgudG9GaXhlZCgyKTtcbiAgICB2YXIgcHkyID0gK3B5LnRvRml4ZWQoMik7XG4gICAgaWYgKHB4MiA8ICtNYXRoLm1pbih4MSwgeDIpLnRvRml4ZWQoMikgfHxcbiAgICAgICAgcHgyID4gK01hdGgubWF4KHgxLCB4MikudG9GaXhlZCgyKSB8fFxuICAgICAgICBweDIgPCArTWF0aC5taW4oeDMsIHg0KS50b0ZpeGVkKDIpIHx8XG4gICAgICAgIHB4MiA+ICtNYXRoLm1heCh4MywgeDQpLnRvRml4ZWQoMikgfHxcbiAgICAgICAgcHkyIDwgK01hdGgubWluKHkxLCB5MikudG9GaXhlZCgyKSB8fFxuICAgICAgICBweTIgPiArTWF0aC5tYXgoeTEsIHkyKS50b0ZpeGVkKDIpIHx8XG4gICAgICAgIHB5MiA8ICtNYXRoLm1pbih5MywgeTQpLnRvRml4ZWQoMikgfHxcbiAgICAgICAgcHkyID4gK01hdGgubWF4KHkzLCB5NCkudG9GaXhlZCgyKSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIHg6IHB4LFxuICAgICAgICB5OiBweSxcbiAgICB9O1xufTtcbnZhciBpc1BvaW50SW5zaWRlQkJveCA9IGZ1bmN0aW9uIChiYm94LCB4LCB5KSB7XG4gICAgcmV0dXJuIHggPj0gYmJveC54ICYmXG4gICAgICAgIHggPD0gYmJveC54ICsgYmJveC53aWR0aCAmJlxuICAgICAgICB5ID49IGJib3gueSAmJlxuICAgICAgICB5IDw9IGJib3gueSArIGJib3guaGVpZ2h0O1xufTtcbnZhciBib3ggPSBmdW5jdGlvbiAoeCwgeSwgd2lkdGgsIGhlaWdodCkge1xuICAgIGlmICh4ID09PSBudWxsKSB7XG4gICAgICAgIHggPSB5ID0gd2lkdGggPSBoZWlnaHQgPSAwO1xuICAgIH1cbiAgICBpZiAoeSA9PT0gbnVsbCkge1xuICAgICAgICB5ID0geC55O1xuICAgICAgICB3aWR0aCA9IHgud2lkdGg7XG4gICAgICAgIGhlaWdodCA9IHguaGVpZ2h0O1xuICAgICAgICB4ID0geC54O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICB4OiB4LFxuICAgICAgICB5OiB5LFxuICAgICAgICB3aWR0aDogd2lkdGgsXG4gICAgICAgIHc6IHdpZHRoLFxuICAgICAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICAgICAgaDogaGVpZ2h0LFxuICAgICAgICB4MjogeCArIHdpZHRoLFxuICAgICAgICB5MjogeSArIGhlaWdodCxcbiAgICAgICAgY3g6IHggKyB3aWR0aCAvIDIsXG4gICAgICAgIGN5OiB5ICsgaGVpZ2h0IC8gMixcbiAgICAgICAgcjE6IE1hdGgubWluKHdpZHRoLCBoZWlnaHQpIC8gMixcbiAgICAgICAgcjI6IE1hdGgubWF4KHdpZHRoLCBoZWlnaHQpIC8gMixcbiAgICAgICAgcjA6IE1hdGguc3FydCh3aWR0aCAqIHdpZHRoICsgaGVpZ2h0ICogaGVpZ2h0KSAvIDIsXG4gICAgICAgIHBhdGg6IHJlY3RQYXRoKHgsIHksIHdpZHRoLCBoZWlnaHQpLFxuICAgICAgICB2YjogW3gsIHksIHdpZHRoLCBoZWlnaHRdLmpvaW4oJyAnKSxcbiAgICB9O1xufTtcbnZhciBpc0JCb3hJbnRlcnNlY3QgPSBmdW5jdGlvbiAoYmJveDEsIGJib3gyKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGJib3gxID0gYm94KGJib3gxKTtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgYmJveDIgPSBib3goYmJveDIpO1xuICAgIHJldHVybiBpc1BvaW50SW5zaWRlQkJveChiYm94MiwgYmJveDEueCwgYmJveDEueSkgfHwgaXNQb2ludEluc2lkZUJCb3goYmJveDIsIGJib3gxLngyLCBiYm94MS55KSB8fCBpc1BvaW50SW5zaWRlQkJveChiYm94MiwgYmJveDEueCwgYmJveDEueTIpIHx8IGlzUG9pbnRJbnNpZGVCQm94KGJib3gyLCBiYm94MS54MiwgYmJveDEueTIpIHx8IGlzUG9pbnRJbnNpZGVCQm94KGJib3gxLCBiYm94Mi54LCBiYm94Mi55KSB8fCBpc1BvaW50SW5zaWRlQkJveChiYm94MSwgYmJveDIueDIsIGJib3gyLnkpIHx8IGlzUG9pbnRJbnNpZGVCQm94KGJib3gxLCBiYm94Mi54LCBiYm94Mi55MikgfHwgaXNQb2ludEluc2lkZUJCb3goYmJveDEsIGJib3gyLngyLCBiYm94Mi55MikgfHwgKGJib3gxLnggPCBiYm94Mi54MiAmJiBiYm94MS54ID4gYmJveDIueCB8fCBiYm94Mi54IDwgYmJveDEueDIgJiYgYmJveDIueCA+IGJib3gxLngpICYmIChiYm94MS55IDwgYmJveDIueTIgJiYgYmJveDEueSA+IGJib3gyLnkgfHwgYmJveDIueSA8IGJib3gxLnkyICYmIGJib3gyLnkgPiBiYm94MS55KTtcbn07XG52YXIgYmV6aWVyQkJveCA9IGZ1bmN0aW9uIChwMXgsIHAxeSwgYzF4LCBjMXksIGMyeCwgYzJ5LCBwMngsIHAyeSkge1xuICAgIGlmICghaXNBcnJheShwMXgpKSB7XG4gICAgICAgIHAxeCA9IFtwMXgsIHAxeSwgYzF4LCBjMXksIGMyeCwgYzJ5LCBwMngsIHAyeV07XG4gICAgfVxuICAgIHZhciBiYm94ID0gY3VydmVEaW0uYXBwbHkobnVsbCwgcDF4KTtcbiAgICByZXR1cm4gYm94KGJib3gubWluLngsIGJib3gubWluLnksIGJib3gubWF4LnggLSBiYm94Lm1pbi54LCBiYm94Lm1heC55IC0gYmJveC5taW4ueSk7XG59O1xudmFyIGZpbmREb3RzQXRTZWdtZW50ID0gZnVuY3Rpb24gKHAxeCwgcDF5LCBjMXgsIGMxeSwgYzJ4LCBjMnksIHAyeCwgcDJ5LCB0KSB7XG4gICAgdmFyIHQxID0gMSAtIHQ7XG4gICAgdmFyIHQxMyA9IE1hdGgucG93KHQxLCAzKTtcbiAgICB2YXIgdDEyID0gTWF0aC5wb3codDEsIDIpO1xuICAgIHZhciB0MiA9IHQgKiB0O1xuICAgIHZhciB0MyA9IHQyICogdDtcbiAgICB2YXIgeCA9IHQxMyAqIHAxeCArIHQxMiAqIDMgKiB0ICogYzF4ICsgdDEgKiAzICogdCAqIHQgKiBjMnggKyB0MyAqIHAyeDtcbiAgICB2YXIgeSA9IHQxMyAqIHAxeSArIHQxMiAqIDMgKiB0ICogYzF5ICsgdDEgKiAzICogdCAqIHQgKiBjMnkgKyB0MyAqIHAyeTtcbiAgICB2YXIgbXggPSBwMXggKyAyICogdCAqIChjMXggLSBwMXgpICsgdDIgKiAoYzJ4IC0gMiAqIGMxeCArIHAxeCk7XG4gICAgdmFyIG15ID0gcDF5ICsgMiAqIHQgKiAoYzF5IC0gcDF5KSArIHQyICogKGMyeSAtIDIgKiBjMXkgKyBwMXkpO1xuICAgIHZhciBueCA9IGMxeCArIDIgKiB0ICogKGMyeCAtIGMxeCkgKyB0MiAqIChwMnggLSAyICogYzJ4ICsgYzF4KTtcbiAgICB2YXIgbnkgPSBjMXkgKyAyICogdCAqIChjMnkgLSBjMXkpICsgdDIgKiAocDJ5IC0gMiAqIGMyeSArIGMxeSk7XG4gICAgdmFyIGF4ID0gdDEgKiBwMXggKyB0ICogYzF4O1xuICAgIHZhciBheSA9IHQxICogcDF5ICsgdCAqIGMxeTtcbiAgICB2YXIgY3ggPSB0MSAqIGMyeCArIHQgKiBwMng7XG4gICAgdmFyIGN5ID0gdDEgKiBjMnkgKyB0ICogcDJ5O1xuICAgIHZhciBhbHBoYSA9ICg5MCAtIE1hdGguYXRhbjIobXggLSBueCwgbXkgLSBueSkgKiAxODAgLyBNYXRoLlBJKTtcbiAgICAvLyAobXggPiBueCB8fCBteSA8IG55KSAmJiAoYWxwaGEgKz0gMTgwKTtcbiAgICByZXR1cm4ge1xuICAgICAgICB4OiB4LFxuICAgICAgICB5OiB5LFxuICAgICAgICBtOiB7XG4gICAgICAgICAgICB4OiBteCxcbiAgICAgICAgICAgIHk6IG15LFxuICAgICAgICB9LFxuICAgICAgICBuOiB7XG4gICAgICAgICAgICB4OiBueCxcbiAgICAgICAgICAgIHk6IG55LFxuICAgICAgICB9LFxuICAgICAgICBzdGFydDoge1xuICAgICAgICAgICAgeDogYXgsXG4gICAgICAgICAgICB5OiBheSxcbiAgICAgICAgfSxcbiAgICAgICAgZW5kOiB7XG4gICAgICAgICAgICB4OiBjeCxcbiAgICAgICAgICAgIHk6IGN5LFxuICAgICAgICB9LFxuICAgICAgICBhbHBoYTogYWxwaGEsXG4gICAgfTtcbn07XG52YXIgaW50ZXJIZWxwZXIgPSBmdW5jdGlvbiAoYmV6MSwgYmV6MiwganVzdENvdW50KSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHZhciBiYm94MSA9IGJlemllckJCb3goYmV6MSk7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHZhciBiYm94MiA9IGJlemllckJCb3goYmV6Mik7XG4gICAgaWYgKCFpc0JCb3hJbnRlcnNlY3QoYmJveDEsIGJib3gyKSkge1xuICAgICAgICByZXR1cm4ganVzdENvdW50ID8gMCA6IFtdO1xuICAgIH1cbiAgICB2YXIgbDEgPSBiZXpsZW4uYXBwbHkoMCwgYmV6MSk7XG4gICAgdmFyIGwyID0gYmV6bGVuLmFwcGx5KDAsIGJlejIpO1xuICAgIHZhciBuMSA9IH5+KGwxIC8gOCk7XG4gICAgdmFyIG4yID0gfn4obDIgLyA4KTtcbiAgICB2YXIgZG90czEgPSBbXTtcbiAgICB2YXIgZG90czIgPSBbXTtcbiAgICB2YXIgeHkgPSB7fTtcbiAgICB2YXIgcmVzID0ganVzdENvdW50ID8gMCA6IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbjEgKyAxOyBpKyspIHtcbiAgICAgICAgdmFyIGQgPSBmaW5kRG90c0F0U2VnbWVudC5hcHBseSgwLCBiZXoxLmNvbmNhdChpIC8gbjEpKTtcbiAgICAgICAgZG90czEucHVzaCh7XG4gICAgICAgICAgICB4OiBkLngsXG4gICAgICAgICAgICB5OiBkLnksXG4gICAgICAgICAgICB0OiBpIC8gbjEsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG4yICsgMTsgaSsrKSB7XG4gICAgICAgIHZhciBkID0gZmluZERvdHNBdFNlZ21lbnQuYXBwbHkoMCwgYmV6Mi5jb25jYXQoaSAvIG4yKSk7XG4gICAgICAgIGRvdHMyLnB1c2goe1xuICAgICAgICAgICAgeDogZC54LFxuICAgICAgICAgICAgeTogZC55LFxuICAgICAgICAgICAgdDogaSAvIG4yLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuMTsgaSsrKSB7XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgbjI7IGorKykge1xuICAgICAgICAgICAgdmFyIGRpID0gZG90czFbaV07XG4gICAgICAgICAgICB2YXIgZGkxID0gZG90czFbaSArIDFdO1xuICAgICAgICAgICAgdmFyIGRqID0gZG90czJbal07XG4gICAgICAgICAgICB2YXIgZGoxID0gZG90czJbaiArIDFdO1xuICAgICAgICAgICAgdmFyIGNpID0gTWF0aC5hYnMoZGkxLnggLSBkaS54KSA8IDAuMDAxID8gJ3knIDogJ3gnO1xuICAgICAgICAgICAgdmFyIGNqID0gTWF0aC5hYnMoZGoxLnggLSBkai54KSA8IDAuMDAxID8gJ3knIDogJ3gnO1xuICAgICAgICAgICAgdmFyIGlzID0gaW50ZXJzZWN0KGRpLngsIGRpLnksIGRpMS54LCBkaTEueSwgZGoueCwgZGoueSwgZGoxLngsIGRqMS55KTtcbiAgICAgICAgICAgIGlmIChpcykge1xuICAgICAgICAgICAgICAgIGlmICh4eVtpcy54LnRvRml4ZWQoNCldID09PSBpcy55LnRvRml4ZWQoNCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHh5W2lzLngudG9GaXhlZCg0KV0gPSBpcy55LnRvRml4ZWQoNCk7XG4gICAgICAgICAgICAgICAgdmFyIHQxID0gZGkudCArIE1hdGguYWJzKChpc1tjaV0gLSBkaVtjaV0pIC8gKGRpMVtjaV0gLSBkaVtjaV0pKSAqIChkaTEudCAtIGRpLnQpO1xuICAgICAgICAgICAgICAgIHZhciB0MiA9IGRqLnQgKyBNYXRoLmFicygoaXNbY2pdIC0gZGpbY2pdKSAvIChkajFbY2pdIC0gZGpbY2pdKSkgKiAoZGoxLnQgLSBkai50KTtcbiAgICAgICAgICAgICAgICBpZiAodDEgPj0gMCAmJiB0MSA8PSAxICYmIHQyID49IDAgJiYgdDIgPD0gMSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoanVzdENvdW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICByZXMrKztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4OiBpcy54LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHk6IGlzLnksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdDE6IHQxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQyOiB0MixcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXM7XG59O1xudmFyIGludGVyUGF0aEhlbHBlciA9IGZ1bmN0aW9uIChwYXRoMSwgcGF0aDIsIGp1c3RDb3VudCkge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBwYXRoMSA9IHBhdGgyQ3VydmUocGF0aDEpO1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBwYXRoMiA9IHBhdGgyQ3VydmUocGF0aDIpO1xuICAgIHZhciB4MTtcbiAgICB2YXIgeTE7XG4gICAgdmFyIHgyO1xuICAgIHZhciB5MjtcbiAgICB2YXIgeDFtO1xuICAgIHZhciB5MW07XG4gICAgdmFyIHgybTtcbiAgICB2YXIgeTJtO1xuICAgIHZhciBiZXoxO1xuICAgIHZhciBiZXoyO1xuICAgIHZhciByZXMgPSBqdXN0Q291bnQgPyAwIDogW107XG4gICAgZm9yICh2YXIgaSA9IDAsIGlpID0gcGF0aDEubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgICB2YXIgcGkgPSBwYXRoMVtpXTtcbiAgICAgICAgaWYgKHBpWzBdID09PSAnTScpIHtcbiAgICAgICAgICAgIHgxID0geDFtID0gcGlbMV07XG4gICAgICAgICAgICB5MSA9IHkxbSA9IHBpWzJdO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKHBpWzBdID09PSAnQycpIHtcbiAgICAgICAgICAgICAgICBiZXoxID0gW3gxLCB5MV0uY29uY2F0KHBpLnNsaWNlKDEpKTtcbiAgICAgICAgICAgICAgICB4MSA9IGJlejFbNl07XG4gICAgICAgICAgICAgICAgeTEgPSBiZXoxWzddO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgYmV6MSA9IFt4MSwgeTEsIHgxLCB5MSwgeDFtLCB5MW0sIHgxbSwgeTFtXTtcbiAgICAgICAgICAgICAgICB4MSA9IHgxbTtcbiAgICAgICAgICAgICAgICB5MSA9IHkxbTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAodmFyIGogPSAwLCBqaiA9IHBhdGgyLmxlbmd0aDsgaiA8IGpqOyBqKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgcGogPSBwYXRoMltqXTtcbiAgICAgICAgICAgICAgICBpZiAocGpbMF0gPT09ICdNJykge1xuICAgICAgICAgICAgICAgICAgICB4MiA9IHgybSA9IHBqWzFdO1xuICAgICAgICAgICAgICAgICAgICB5MiA9IHkybSA9IHBqWzJdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBqWzBdID09PSAnQycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJlejIgPSBbeDIsIHkyXS5jb25jYXQocGouc2xpY2UoMSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgeDIgPSBiZXoyWzZdO1xuICAgICAgICAgICAgICAgICAgICAgICAgeTIgPSBiZXoyWzddO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgYmV6MiA9IFt4MiwgeTIsIHgyLCB5MiwgeDJtLCB5Mm0sIHgybSwgeTJtXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHgyID0geDJtO1xuICAgICAgICAgICAgICAgICAgICAgICAgeTIgPSB5Mm07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdmFyIGludHIgPSBpbnRlckhlbHBlcihiZXoxLCBiZXoyLCBqdXN0Q291bnQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoanVzdENvdW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICByZXMgKz0gaW50cjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsgPSAwLCBrayA9IGludHIubGVuZ3RoOyBrIDwga2s7IGsrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHJba10uc2VnbWVudDEgPSBpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHJba10uc2VnbWVudDIgPSBqO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHJba10uYmV6MSA9IGJlejE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cltrXS5iZXoyID0gYmV6MjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IHJlcy5jb25jYXQoaW50cik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn07XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBwYXRoSW50ZXJzZWN0aW9uKHBhdGgxLCBwYXRoMikge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICByZXR1cm4gaW50ZXJQYXRoSGVscGVyKHBhdGgxLCBwYXRoMik7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wYXRoLWludGVyc2VjdGlvbi5qcy5tYXAiLCJ2YXIgcDJzID0gLyw/KFthLXpdKSw/L2dpO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcGFyc2VQYXRoQXJyYXkocGF0aCkge1xuICAgIHJldHVybiBwYXRoLmpvaW4oJywnKS5yZXBsYWNlKHAycywgJyQxJyk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wYXJzZS1wYXRoLWFycmF5LmpzLm1hcCIsImltcG9ydCB7IG1vZCwgdG9SYWRpYW4gfSBmcm9tICdAYW50di91dGlsJztcbi8vIOWQkemHj+mVv+W6plxuZnVuY3Rpb24gdk1hZyh2KSB7XG4gICAgcmV0dXJuIE1hdGguc3FydCh2WzBdICogdlswXSArIHZbMV0gKiB2WzFdKTtcbn1cbi8vIHUudi98dXx8dnzvvIzorqHnrpflpLnop5LnmoTkvZnlvKblgLxcbmZ1bmN0aW9uIHZSYXRpbyh1LCB2KSB7XG4gICAgLy8g5b2T5a2Y5Zyo5LiA5Liq5ZCR6YeP55qE6ZW/5bqm5Li6IDAg5pe277yM5aS56KeS5Lmf5Li6IDDvvIzljbPlpLnop5LnmoTkvZnlvKblgLzkuLogMVxuICAgIHJldHVybiB2TWFnKHUpICogdk1hZyh2KSA/ICh1WzBdICogdlswXSArIHVbMV0gKiB2WzFdKSAvICh2TWFnKHUpICogdk1hZyh2KSkgOiAxO1xufVxuLy8g5ZCR6YeP6KeS5bqmXG5mdW5jdGlvbiB2QW5nbGUodSwgdikge1xuICAgIHJldHVybiAodVswXSAqIHZbMV0gPCB1WzFdICogdlswXSA/IC0xIDogMSkgKiBNYXRoLmFjb3ModlJhdGlvKHUsIHYpKTtcbn1cbi8qKlxuICog5Yik5pat5Lik5Liq54K55piv5ZCm6YeN5ZCI77yM54K55Z2Q5qCH55qE5qC85byP5Li6IFt4LCB5XVxuICogQHBhcmFtIHtBcnJheX0gcG9pbnQxIOesrOS4gOS4queCuVxuICogQHBhcmFtIHtBcnJheX0gcG9pbnQyIOesrOS6jOS4queCuVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNTYW1lUG9pbnQocG9pbnQxLCBwb2ludDIpIHtcbiAgICByZXR1cm4gcG9pbnQxWzBdID09PSBwb2ludDJbMF0gJiYgcG9pbnQxWzFdID09PSBwb2ludDJbMV07XG59XG4vLyBBIDA6cnggMTpyeSAyOngtYXhpcy1yb3RhdGlvbiAzOmxhcmdlLWFyYy1mbGFnIDQ6c3dlZXAtZmxhZyA1OiB4IDY6IHlcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldEFyY1BhcmFtcyhzdGFydFBvaW50LCBwYXJhbXMpIHtcbiAgICB2YXIgcnggPSBwYXJhbXNbMV07XG4gICAgdmFyIHJ5ID0gcGFyYW1zWzJdO1xuICAgIHZhciB4Um90YXRpb24gPSBtb2QodG9SYWRpYW4ocGFyYW1zWzNdKSwgTWF0aC5QSSAqIDIpO1xuICAgIHZhciBhcmNGbGFnID0gcGFyYW1zWzRdO1xuICAgIHZhciBzd2VlcEZsYWcgPSBwYXJhbXNbNV07XG4gICAgLy8g5byn5b2i6LW354K55Z2Q5qCHXG4gICAgdmFyIHgxID0gc3RhcnRQb2ludFswXTtcbiAgICB2YXIgeTEgPSBzdGFydFBvaW50WzFdO1xuICAgIC8vIOW8p+W9oue7iOeCueWdkOagh1xuICAgIHZhciB4MiA9IHBhcmFtc1s2XTtcbiAgICB2YXIgeTIgPSBwYXJhbXNbN107XG4gICAgdmFyIHhwID0gKE1hdGguY29zKHhSb3RhdGlvbikgKiAoeDEgLSB4MikpIC8gMi4wICsgKE1hdGguc2luKHhSb3RhdGlvbikgKiAoeTEgLSB5MikpIC8gMi4wO1xuICAgIHZhciB5cCA9ICgtMSAqIE1hdGguc2luKHhSb3RhdGlvbikgKiAoeDEgLSB4MikpIC8gMi4wICsgKE1hdGguY29zKHhSb3RhdGlvbikgKiAoeTEgLSB5MikpIC8gMi4wO1xuICAgIHZhciBsYW1iZGEgPSAoeHAgKiB4cCkgLyAocnggKiByeCkgKyAoeXAgKiB5cCkgLyAocnkgKiByeSk7XG4gICAgaWYgKGxhbWJkYSA+IDEpIHtcbiAgICAgICAgcnggKj0gTWF0aC5zcXJ0KGxhbWJkYSk7XG4gICAgICAgIHJ5ICo9IE1hdGguc3FydChsYW1iZGEpO1xuICAgIH1cbiAgICB2YXIgZGlmZiA9IHJ4ICogcnggKiAoeXAgKiB5cCkgKyByeSAqIHJ5ICogKHhwICogeHApO1xuICAgIHZhciBmID0gZGlmZiA/IE1hdGguc3FydCgocnggKiByeCAqIChyeSAqIHJ5KSAtIGRpZmYpIC8gZGlmZikgOiAxO1xuICAgIGlmIChhcmNGbGFnID09PSBzd2VlcEZsYWcpIHtcbiAgICAgICAgZiAqPSAtMTtcbiAgICB9XG4gICAgaWYgKGlzTmFOKGYpKSB7XG4gICAgICAgIGYgPSAwO1xuICAgIH1cbiAgICAvLyDml4vovazliY3nmoTotbfngrnlnZDmoIfvvIzkuJTlvZPplb/ljYrovbTlkoznn63ljYrovbTnmoTplb/luqbkuLogMCDml7bvvIzlnZDmoIfmjIkgKDAsIDApIOWkhOeQhlxuICAgIHZhciBjeHAgPSByeSA/IChmICogcnggKiB5cCkgLyByeSA6IDA7XG4gICAgdmFyIGN5cCA9IHJ4ID8gKGYgKiAtcnkgKiB4cCkgLyByeCA6IDA7XG4gICAgLy8g5qSt5ZyG5ZyG5b+D5Z2Q5qCHXG4gICAgdmFyIGN4ID0gKHgxICsgeDIpIC8gMi4wICsgTWF0aC5jb3MoeFJvdGF0aW9uKSAqIGN4cCAtIE1hdGguc2luKHhSb3RhdGlvbikgKiBjeXA7XG4gICAgdmFyIGN5ID0gKHkxICsgeTIpIC8gMi4wICsgTWF0aC5zaW4oeFJvdGF0aW9uKSAqIGN4cCArIE1hdGguY29zKHhSb3RhdGlvbikgKiBjeXA7XG4gICAgLy8g6LW35aeL54K555qE5Y2V5L2N5ZCR6YePXG4gICAgdmFyIHUgPSBbKHhwIC0gY3hwKSAvIHJ4LCAoeXAgLSBjeXApIC8gcnldO1xuICAgIC8vIOe7iOatoueCueeahOWNleS9jeWQkemHj1xuICAgIHZhciB2ID0gWygtMSAqIHhwIC0gY3hwKSAvIHJ4LCAoLTEgKiB5cCAtIGN5cCkgLyByeV07XG4gICAgLy8g6K6h566X6LW35aeL54K55ZKM5ZyG5b+D55qE6L+e57q/77yM5LiOIHgg6L205q2j5pa55ZCR55qE5aS56KeSXG4gICAgdmFyIHRoZXRhID0gdkFuZ2xlKFsxLCAwXSwgdSk7XG4gICAgLy8g6K6h566X5ZyG5byn6LW35aeL54K55ZKM57uI5q2i54K55LiO5qSt5ZyG5ZyG5b+D6L+e57q/55qE5aS56KeSXG4gICAgdmFyIGRUaGV0YSA9IHZBbmdsZSh1LCB2KTtcbiAgICBpZiAodlJhdGlvKHUsIHYpIDw9IC0xKSB7XG4gICAgICAgIGRUaGV0YSA9IE1hdGguUEk7XG4gICAgfVxuICAgIGlmICh2UmF0aW8odSwgdikgPj0gMSkge1xuICAgICAgICBkVGhldGEgPSAwO1xuICAgIH1cbiAgICBpZiAoc3dlZXBGbGFnID09PSAwICYmIGRUaGV0YSA+IDApIHtcbiAgICAgICAgZFRoZXRhID0gZFRoZXRhIC0gMiAqIE1hdGguUEk7XG4gICAgfVxuICAgIGlmIChzd2VlcEZsYWcgPT09IDEgJiYgZFRoZXRhIDwgMCkge1xuICAgICAgICBkVGhldGEgPSBkVGhldGEgKyAyICogTWF0aC5QSTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY3g6IGN4LFxuICAgICAgICBjeTogY3ksXG4gICAgICAgIC8vIOW8p+W9oueahOi1t+eCueWSjOe7iOeCueebuOWQjOaXtu+8jOmVv+i9tOWSjOefrei9tOeahOmVv+W6puaMiSAwIOWkhOeQhlxuICAgICAgICByeDogaXNTYW1lUG9pbnQoc3RhcnRQb2ludCwgW3gyLCB5Ml0pID8gMCA6IHJ4LFxuICAgICAgICByeTogaXNTYW1lUG9pbnQoc3RhcnRQb2ludCwgW3gyLCB5Ml0pID8gMCA6IHJ5LFxuICAgICAgICBzdGFydEFuZ2xlOiB0aGV0YSxcbiAgICAgICAgZW5kQW5nbGU6IHRoZXRhICsgZFRoZXRhLFxuICAgICAgICB4Um90YXRpb246IHhSb3RhdGlvbixcbiAgICAgICAgYXJjRmxhZzogYXJjRmxhZyxcbiAgICAgICAgc3dlZXBGbGFnOiBzd2VlcEZsYWcsXG4gICAgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdldC1hcmMtcGFyYW1zLmpzLm1hcCIsImltcG9ydCBnZXRBcmNQYXJhbXMgZnJvbSAnLi9nZXQtYXJjLXBhcmFtcyc7XG5pbXBvcnQgeyBpc1NhbWVQb2ludCB9IGZyb20gJy4vZ2V0LWFyYy1wYXJhbXMnO1xuaW1wb3J0IHBhcnNlUGF0aCBmcm9tICcuL3BhcnNlLXBhdGgnO1xuLy8g54K55a+556ewXG5mdW5jdGlvbiB0b1N5bW1ldHJ5KHBvaW50LCBjZW50ZXIpIHtcbiAgICByZXR1cm4gW2NlbnRlclswXSArIChjZW50ZXJbMF0gLSBwb2ludFswXSksIGNlbnRlclsxXSArIChjZW50ZXJbMV0gLSBwb2ludFsxXSldO1xufVxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0U2VnbWVudHMocGF0aCkge1xuICAgIHBhdGggPSBwYXJzZVBhdGgocGF0aCk7XG4gICAgdmFyIHNlZ21lbnRzID0gW107XG4gICAgdmFyIGN1cnJlbnRQb2ludCA9IG51bGw7IC8vIOW9k+WJjeWbvuW9olxuICAgIHZhciBuZXh0UGFyYW1zID0gbnVsbDsgLy8g5LiL5LiA6IqC54K555qEIHBhdGgg5Y+C5pWwXG4gICAgdmFyIHN0YXJ0TW92ZVBvaW50ID0gbnVsbDsgLy8g5byA5aeLIE0g55qE54K577yM5Y+v6IO95Lya5pyJ5aSa5LiqXG4gICAgdmFyIGxhc3RTdGFydE1vdmVQb2ludEluZGV4ID0gMDsgLy8g5pyA6L+R5LiA5Liq5byA5aeL54K5IE0g55qE57Si5byVXG4gICAgdmFyIGNvdW50ID0gcGF0aC5sZW5ndGg7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XG4gICAgICAgIHZhciBwYXJhbXMgPSBwYXRoW2ldO1xuICAgICAgICBuZXh0UGFyYW1zID0gcGF0aFtpICsgMV07XG4gICAgICAgIHZhciBjb21tYW5kID0gcGFyYW1zWzBdO1xuICAgICAgICAvLyDmlbDlrablrprkuYnkuIrnmoTlj4LmlbDvvIzkvr/kuo7lkI7pnaLnmoTorqHnrpdcbiAgICAgICAgdmFyIHNlZ21lbnQgPSB7XG4gICAgICAgICAgICBjb21tYW5kOiBjb21tYW5kLFxuICAgICAgICAgICAgcHJlUG9pbnQ6IGN1cnJlbnRQb2ludCxcbiAgICAgICAgICAgIHBhcmFtczogcGFyYW1zLFxuICAgICAgICAgICAgc3RhcnRUYW5nZW50OiBudWxsLFxuICAgICAgICAgICAgZW5kVGFuZ2VudDogbnVsbCxcbiAgICAgICAgfTtcbiAgICAgICAgc3dpdGNoIChjb21tYW5kKSB7XG4gICAgICAgICAgICBjYXNlICdNJzpcbiAgICAgICAgICAgICAgICBzdGFydE1vdmVQb2ludCA9IFtwYXJhbXNbMV0sIHBhcmFtc1syXV07XG4gICAgICAgICAgICAgICAgbGFzdFN0YXJ0TW92ZVBvaW50SW5kZXggPSBpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnQSc6XG4gICAgICAgICAgICAgICAgdmFyIGFyY1BhcmFtcyA9IGdldEFyY1BhcmFtcyhjdXJyZW50UG9pbnQsIHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgc2VnbWVudFsnYXJjUGFyYW1zJ10gPSBhcmNQYXJhbXM7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb21tYW5kID09PSAnWicpIHtcbiAgICAgICAgICAgIC8vIOacieS6hiBaIOWQju+8jOW9k+WJjeiKgueCueS7juW8gOWniyBNIOeahOeCueW8gOWni1xuICAgICAgICAgICAgY3VycmVudFBvaW50ID0gc3RhcnRNb3ZlUG9pbnQ7XG4gICAgICAgICAgICAvLyDlpoLmnpzlvZPliY3ngrnnmoTlkb3ku6TkuLogWu+8jOebuOW9k+S6juW9k+WJjeeCueS4uuacgOi/keS4gOS4qiBNIOeCue+8jOWImeS4i+S4gOS4queCueebtOaOpeaMh+WQkeacgOi/keS4gOS4qiBNIOeCueeahOS4i+S4gOS4queCuVxuICAgICAgICAgICAgbmV4dFBhcmFtcyA9IHBhdGhbbGFzdFN0YXJ0TW92ZVBvaW50SW5kZXggKyAxXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHZhciBsZW4gPSBwYXJhbXMubGVuZ3RoO1xuICAgICAgICAgICAgY3VycmVudFBvaW50ID0gW3BhcmFtc1tsZW4gLSAyXSwgcGFyYW1zW2xlbiAtIDFdXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobmV4dFBhcmFtcyAmJiBuZXh0UGFyYW1zWzBdID09PSAnWicpIHtcbiAgICAgICAgICAgIC8vIOWmguaenOS4i+S4gOS4queCueeahOWRveS7pOS4uiBa77yM5YiZ5LiL5LiA5Liq54K555u05o6l5oyH5ZCR5pyA6L+R5LiA5LiqIE0g54K5XG4gICAgICAgICAgICBuZXh0UGFyYW1zID0gcGF0aFtsYXN0U3RhcnRNb3ZlUG9pbnRJbmRleF07XG4gICAgICAgICAgICBpZiAoc2VnbWVudHNbbGFzdFN0YXJ0TW92ZVBvaW50SW5kZXhdKSB7XG4gICAgICAgICAgICAgICAgLy8g5aaC5p6c5LiL5LiA5Liq54K555qE5ZG95Luk5Li6IFrvvIzliJnmnIDov5HkuIDkuKogTSDngrnnmoTliY3kuIDkuKrngrnkuLrlvZPliY3ngrlcbiAgICAgICAgICAgICAgICBzZWdtZW50c1tsYXN0U3RhcnRNb3ZlUG9pbnRJbmRleF0ucHJlUG9pbnQgPSBjdXJyZW50UG9pbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc2VnbWVudFsnY3VycmVudFBvaW50J10gPSBjdXJyZW50UG9pbnQ7XG4gICAgICAgIC8vIOWmguaenOW9k+WJjeeCueS4juacgOi/keS4gOS4qiBNIOeCueebuOWQjO+8jOWImeacgOi/keS4gOS4qiBNIOeCueeahOWJjeS4gOS4queCueS4uuW9k+WJjeeCueeahOWJjeS4gOS4queCuVxuICAgICAgICBpZiAoc2VnbWVudHNbbGFzdFN0YXJ0TW92ZVBvaW50SW5kZXhdICYmXG4gICAgICAgICAgICBpc1NhbWVQb2ludChjdXJyZW50UG9pbnQsIHNlZ21lbnRzW2xhc3RTdGFydE1vdmVQb2ludEluZGV4XS5jdXJyZW50UG9pbnQpKSB7XG4gICAgICAgICAgICBzZWdtZW50c1tsYXN0U3RhcnRNb3ZlUG9pbnRJbmRleF0ucHJlUG9pbnQgPSBzZWdtZW50LnByZVBvaW50O1xuICAgICAgICB9XG4gICAgICAgIHZhciBuZXh0UG9pbnQgPSBuZXh0UGFyYW1zID8gW25leHRQYXJhbXNbbmV4dFBhcmFtcy5sZW5ndGggLSAyXSwgbmV4dFBhcmFtc1tuZXh0UGFyYW1zLmxlbmd0aCAtIDFdXSA6IG51bGw7XG4gICAgICAgIHNlZ21lbnRbJ25leHRQb2ludCddID0gbmV4dFBvaW50O1xuICAgICAgICAvLyBBZGQgc3RhcnRUYW5nZW50IGFuZCBlbmRUYW5nZW50XG4gICAgICAgIHZhciBwcmVQb2ludCA9IHNlZ21lbnQucHJlUG9pbnQ7XG4gICAgICAgIGlmIChbJ0wnLCAnSCcsICdWJ10uaW5jbHVkZXMoY29tbWFuZCkpIHtcbiAgICAgICAgICAgIHNlZ21lbnQuc3RhcnRUYW5nZW50ID0gW3ByZVBvaW50WzBdIC0gY3VycmVudFBvaW50WzBdLCBwcmVQb2ludFsxXSAtIGN1cnJlbnRQb2ludFsxXV07XG4gICAgICAgICAgICBzZWdtZW50LmVuZFRhbmdlbnQgPSBbY3VycmVudFBvaW50WzBdIC0gcHJlUG9pbnRbMF0sIGN1cnJlbnRQb2ludFsxXSAtIHByZVBvaW50WzFdXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjb21tYW5kID09PSAnUScpIHtcbiAgICAgICAgICAgIC8vIOS6jOasoei0neWhnuWwlOabsue6v+WPquacieS4gOS4quaOp+WItueCuVxuICAgICAgICAgICAgdmFyIGNwID0gW3BhcmFtc1sxXSwgcGFyYW1zWzJdXTtcbiAgICAgICAgICAgIC8vIOS6jOasoei0neWhnuWwlOabsue6v+eahOe7iOeCueS4uiBjdXJyZW50UG9pbnRcbiAgICAgICAgICAgIHNlZ21lbnQuc3RhcnRUYW5nZW50ID0gW3ByZVBvaW50WzBdIC0gY3BbMF0sIHByZVBvaW50WzFdIC0gY3BbMV1dO1xuICAgICAgICAgICAgc2VnbWVudC5lbmRUYW5nZW50ID0gW2N1cnJlbnRQb2ludFswXSAtIGNwWzBdLCBjdXJyZW50UG9pbnRbMV0gLSBjcFsxXV07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY29tbWFuZCA9PT0gJ1QnKSB7XG4gICAgICAgICAgICB2YXIgcHJlU2VnbWVudCA9IHNlZ21lbnRzW2kgLSAxXTtcbiAgICAgICAgICAgIHZhciBjcCA9IHRvU3ltbWV0cnkocHJlU2VnbWVudC5jdXJyZW50UG9pbnQsIHByZVBvaW50KTtcbiAgICAgICAgICAgIGlmIChwcmVTZWdtZW50LmNvbW1hbmQgPT09ICdRJykge1xuICAgICAgICAgICAgICAgIHNlZ21lbnQuY29tbWFuZCA9ICdRJztcbiAgICAgICAgICAgICAgICBzZWdtZW50LnN0YXJ0VGFuZ2VudCA9IFtwcmVQb2ludFswXSAtIGNwWzBdLCBwcmVQb2ludFsxXSAtIGNwWzFdXTtcbiAgICAgICAgICAgICAgICBzZWdtZW50LmVuZFRhbmdlbnQgPSBbY3VycmVudFBvaW50WzBdIC0gY3BbMF0sIGN1cnJlbnRQb2ludFsxXSAtIGNwWzFdXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHNlZ21lbnQuY29tbWFuZCA9ICdUTCc7XG4gICAgICAgICAgICAgICAgc2VnbWVudC5zdGFydFRhbmdlbnQgPSBbcHJlUG9pbnRbMF0gLSBjdXJyZW50UG9pbnRbMF0sIHByZVBvaW50WzFdIC0gY3VycmVudFBvaW50WzFdXTtcbiAgICAgICAgICAgICAgICBzZWdtZW50LmVuZFRhbmdlbnQgPSBbY3VycmVudFBvaW50WzBdIC0gcHJlUG9pbnRbMF0sIGN1cnJlbnRQb2ludFsxXSAtIHByZVBvaW50WzFdXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjb21tYW5kID09PSAnQycpIHtcbiAgICAgICAgICAgIC8vIOS4ieasoei0neWhnuWwlOabsue6v+acieS4pOS4quaOp+WItueCuVxuICAgICAgICAgICAgdmFyIGNwMSA9IFtwYXJhbXNbMV0sIHBhcmFtc1syXV07XG4gICAgICAgICAgICB2YXIgY3AyID0gW3BhcmFtc1szXSwgcGFyYW1zWzRdXTtcbiAgICAgICAgICAgIHNlZ21lbnQuc3RhcnRUYW5nZW50ID0gW3ByZVBvaW50WzBdIC0gY3AxWzBdLCBwcmVQb2ludFsxXSAtIGNwMVsxXV07XG4gICAgICAgICAgICBzZWdtZW50LmVuZFRhbmdlbnQgPSBbY3VycmVudFBvaW50WzBdIC0gY3AyWzBdLCBjdXJyZW50UG9pbnRbMV0gLSBjcDJbMV1dO1xuICAgICAgICAgICAgLy8gaG9yaXpvbnRhbCBsaW5lLCBlZy4gWydDJywgMTAwLCAxMDAsIDEwMCwgMTAwLCAyMDAsIDIwMF1cbiAgICAgICAgICAgIGlmIChzZWdtZW50LnN0YXJ0VGFuZ2VudFswXSA9PT0gMCAmJiBzZWdtZW50LnN0YXJ0VGFuZ2VudFsxXSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHNlZ21lbnQuc3RhcnRUYW5nZW50ID0gW2NwMVswXSAtIGNwMlswXSwgY3AxWzFdIC0gY3AyWzFdXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzZWdtZW50LmVuZFRhbmdlbnRbMF0gPT09IDAgJiYgc2VnbWVudC5lbmRUYW5nZW50WzFdID09PSAwKSB7XG4gICAgICAgICAgICAgICAgc2VnbWVudC5lbmRUYW5nZW50ID0gW2NwMlswXSAtIGNwMVswXSwgY3AyWzFdIC0gY3AxWzFdXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjb21tYW5kID09PSAnUycpIHtcbiAgICAgICAgICAgIHZhciBwcmVTZWdtZW50ID0gc2VnbWVudHNbaSAtIDFdO1xuICAgICAgICAgICAgdmFyIGNwMSA9IHRvU3ltbWV0cnkocHJlU2VnbWVudC5jdXJyZW50UG9pbnQsIHByZVBvaW50KTtcbiAgICAgICAgICAgIHZhciBjcDIgPSBbcGFyYW1zWzFdLCBwYXJhbXNbMl1dO1xuICAgICAgICAgICAgaWYgKHByZVNlZ21lbnQuY29tbWFuZCA9PT0gJ0MnKSB7XG4gICAgICAgICAgICAgICAgc2VnbWVudC5jb21tYW5kID0gJ0MnOyAvLyDlsIYgUyDlkb3ku6Tlj5jmjaLkuLogQyDlkb3ku6RcbiAgICAgICAgICAgICAgICBzZWdtZW50LnN0YXJ0VGFuZ2VudCA9IFtwcmVQb2ludFswXSAtIGNwMVswXSwgcHJlUG9pbnRbMV0gLSBjcDFbMV1dO1xuICAgICAgICAgICAgICAgIHNlZ21lbnQuZW5kVGFuZ2VudCA9IFtjdXJyZW50UG9pbnRbMF0gLSBjcDJbMF0sIGN1cnJlbnRQb2ludFsxXSAtIGNwMlsxXV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBzZWdtZW50LmNvbW1hbmQgPSAnU1EnOyAvLyDlsIYgUyDlkb3ku6Tlj5jmjaLkuLogU1Eg5ZG95LukXG4gICAgICAgICAgICAgICAgc2VnbWVudC5zdGFydFRhbmdlbnQgPSBbcHJlUG9pbnRbMF0gLSBjcDJbMF0sIHByZVBvaW50WzFdIC0gY3AyWzFdXTtcbiAgICAgICAgICAgICAgICBzZWdtZW50LmVuZFRhbmdlbnQgPSBbY3VycmVudFBvaW50WzBdIC0gY3AyWzBdLCBjdXJyZW50UG9pbnRbMV0gLSBjcDJbMV1dO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNvbW1hbmQgPT09ICdBJykge1xuICAgICAgICAgICAgdmFyIGQgPSAwLjAwMTtcbiAgICAgICAgICAgIHZhciBfYSA9IHNlZ21lbnRbJ2FyY1BhcmFtcyddIHx8IHt9LCBfYiA9IF9hLmN4LCBjeCA9IF9iID09PSB2b2lkIDAgPyAwIDogX2IsIF9jID0gX2EuY3ksIGN5ID0gX2MgPT09IHZvaWQgMCA/IDAgOiBfYywgX2QgPSBfYS5yeCwgcnggPSBfZCA9PT0gdm9pZCAwID8gMCA6IF9kLCBfZSA9IF9hLnJ5LCByeSA9IF9lID09PSB2b2lkIDAgPyAwIDogX2UsIF9mID0gX2Euc3dlZXBGbGFnLCBzd2VlcEZsYWcgPSBfZiA9PT0gdm9pZCAwID8gMCA6IF9mLCBfZyA9IF9hLnN0YXJ0QW5nbGUsIHN0YXJ0QW5nbGUgPSBfZyA9PT0gdm9pZCAwID8gMCA6IF9nLCBfaCA9IF9hLmVuZEFuZ2xlLCBlbmRBbmdsZSA9IF9oID09PSB2b2lkIDAgPyAwIDogX2g7XG4gICAgICAgICAgICBpZiAoc3dlZXBGbGFnID09PSAwKSB7XG4gICAgICAgICAgICAgICAgZCAqPSAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBkeDEgPSByeCAqIE1hdGguY29zKHN0YXJ0QW5nbGUgLSBkKSArIGN4O1xuICAgICAgICAgICAgdmFyIGR5MSA9IHJ5ICogTWF0aC5zaW4oc3RhcnRBbmdsZSAtIGQpICsgY3k7XG4gICAgICAgICAgICBzZWdtZW50LnN0YXJ0VGFuZ2VudCA9IFtkeDEgLSBzdGFydE1vdmVQb2ludFswXSwgZHkxIC0gc3RhcnRNb3ZlUG9pbnRbMV1dO1xuICAgICAgICAgICAgdmFyIGR4MiA9IHJ4ICogTWF0aC5jb3Moc3RhcnRBbmdsZSArIGVuZEFuZ2xlICsgZCkgKyBjeDtcbiAgICAgICAgICAgIHZhciBkeTIgPSByeSAqIE1hdGguc2luKHN0YXJ0QW5nbGUgKyBlbmRBbmdsZSAtIGQpICsgY3k7XG4gICAgICAgICAgICBzZWdtZW50LmVuZFRhbmdlbnQgPSBbcHJlUG9pbnRbMF0gLSBkeDIsIHByZVBvaW50WzFdIC0gZHkyXTtcbiAgICAgICAgfVxuICAgICAgICBzZWdtZW50cy5wdXNoKHNlZ21lbnQpO1xuICAgIH1cbiAgICByZXR1cm4gc2VnbWVudHM7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wYXRoLTItc2VnbWVudHMuanMubWFwIiwidmFyIGlzQmV0d2VlbiA9IGZ1bmN0aW9uICh2YWx1ZSwgbWluLCBtYXgpIHsgcmV0dXJuIHZhbHVlID49IG1pbiAmJiB2YWx1ZSA8PSBtYXg7IH07XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRMaW5lSW50ZXJzZWN0KHAwLCBwMSwgcDIsIHAzKSB7XG4gICAgdmFyIHRvbGVyYW5jZSA9IDAuMDAxO1xuICAgIHZhciBFID0ge1xuICAgICAgICB4OiBwMi54IC0gcDAueCxcbiAgICAgICAgeTogcDIueSAtIHAwLnksXG4gICAgfTtcbiAgICB2YXIgRDAgPSB7XG4gICAgICAgIHg6IHAxLnggLSBwMC54LFxuICAgICAgICB5OiBwMS55IC0gcDAueSxcbiAgICB9O1xuICAgIHZhciBEMSA9IHtcbiAgICAgICAgeDogcDMueCAtIHAyLngsXG4gICAgICAgIHk6IHAzLnkgLSBwMi55LFxuICAgIH07XG4gICAgdmFyIGtyb3NzID0gRDAueCAqIEQxLnkgLSBEMC55ICogRDEueDtcbiAgICB2YXIgc3FyS3Jvc3MgPSBrcm9zcyAqIGtyb3NzO1xuICAgIHZhciBzcXJMZW4wID0gRDAueCAqIEQwLnggKyBEMC55ICogRDAueTtcbiAgICB2YXIgc3FyTGVuMSA9IEQxLnggKiBEMS54ICsgRDEueSAqIEQxLnk7XG4gICAgdmFyIHBvaW50ID0gbnVsbDtcbiAgICBpZiAoc3FyS3Jvc3MgPiB0b2xlcmFuY2UgKiBzcXJMZW4wICogc3FyTGVuMSkge1xuICAgICAgICB2YXIgcyA9IChFLnggKiBEMS55IC0gRS55ICogRDEueCkgLyBrcm9zcztcbiAgICAgICAgdmFyIHQgPSAoRS54ICogRDAueSAtIEUueSAqIEQwLngpIC8ga3Jvc3M7XG4gICAgICAgIGlmIChpc0JldHdlZW4ocywgMCwgMSkgJiYgaXNCZXR3ZWVuKHQsIDAsIDEpKSB7XG4gICAgICAgICAgICBwb2ludCA9IHtcbiAgICAgICAgICAgICAgICB4OiBwMC54ICsgcyAqIEQwLngsXG4gICAgICAgICAgICAgICAgeTogcDAueSArIHMgKiBEMC55LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcG9pbnQ7XG59XG47XG4vLyMgc291cmNlTWFwcGluZ1VSTD1nZXQtbGluZS1pbnRlcnNlY3QuanMubWFwIiwiLyoqXG4gKiBAZmlsZW92ZXJ2aWV3IOWIpOaWreeCueaYr+WQpuWcqOWkmui+ueW9ouWGhVxuICogQGF1dGhvciBkeHE2MTNAZ21haWwuY29tXG4gKi9cbi8vIOWkmui+ueW9oueahOWwhOe6v+ajgOa1i++8jOWPguiAg++8mmh0dHBzOi8vYmxvZy5jc2RuLm5ldC9XaWxsaWFtU3VuMDEyMi9hcnRpY2xlL2RldGFpbHMvNzc5OTQ1MjZcbnZhciB0b2xlcmFuY2UgPSAxZS02O1xuLy8g5LiJ5oCB5Ye95pWw77yM5Yik5pat5Lik5LiqZG91Ymxl5ZyoZXBz57K+5bqm5LiL55qE5aSn5bCP5YWz57O7XG5mdW5jdGlvbiBkY21wKHgpIHtcbiAgICBpZiAoTWF0aC5hYnMoeCkgPCB0b2xlcmFuY2UpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIHJldHVybiB4IDwgMCA/IC0xIDogMTtcbn1cbi8vIOWIpOaWreeCuVHmmK/lkKblnKhwMeWSjHAy55qE57q/5q615LiKXG5mdW5jdGlvbiBvblNlZ21lbnQocDEsIHAyLCBxKSB7XG4gICAgaWYgKChxWzBdIC0gcDFbMF0pICogKHAyWzFdIC0gcDFbMV0pID09PSAocDJbMF0gLSBwMVswXSkgKiAocVsxXSAtIHAxWzFdKSAmJlxuICAgICAgICBNYXRoLm1pbihwMVswXSwgcDJbMF0pIDw9IHFbMF0gJiZcbiAgICAgICAgcVswXSA8PSBNYXRoLm1heChwMVswXSwgcDJbMF0pICYmXG4gICAgICAgIE1hdGgubWluKHAxWzFdLCBwMlsxXSkgPD0gcVsxXSAmJlxuICAgICAgICBxWzFdIDw9IE1hdGgubWF4KHAxWzFdLCBwMlsxXSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbi8vIOWIpOaWreeCuVDlnKjlpJrovrnlvaLlhoUt5bCE57q/5rOVXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc0luUG9seWdvbihwb2ludHMsIHgsIHkpIHtcbiAgICB2YXIgaXNIaXQgPSBmYWxzZTtcbiAgICB2YXIgbiA9IHBvaW50cy5sZW5ndGg7XG4gICAgaWYgKG4gPD0gMikge1xuICAgICAgICAvLyBzdmcg5Lit54K55bCP5LqOIDMg5Liq5pe277yM5LiN5pi+56S677yM5Lmf5peg5rOV6KKr5ou+5Y+WXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgdmFyIHAxID0gcG9pbnRzW2ldO1xuICAgICAgICB2YXIgcDIgPSBwb2ludHNbKGkgKyAxKSAlIG5dO1xuICAgICAgICBpZiAob25TZWdtZW50KHAxLCBwMiwgW3gsIHldKSkge1xuICAgICAgICAgICAgLy8g54K55Zyo5aSa6L655b2i5LiA5p2h6L655LiKXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyDliY3kuIDkuKrliKTmlq1taW4ocDFbMV0scDJbMV0pPFAueTw9bWF4KHAxWzFdLHAyWzFdKVxuICAgICAgICAvLyDlkI7kuIDkuKrliKTmlq3ooqvmtYvngrkg5ZyoIOWwhOe6v+S4jui+ueS6pOeCuSDnmoTlt6bovrlcbiAgICAgICAgaWYgKGRjbXAocDFbMV0gLSB5KSA+IDAgIT09IGRjbXAocDJbMV0gLSB5KSA+IDAgJiZcbiAgICAgICAgICAgIGRjbXAoeCAtICgoeSAtIHAxWzFdKSAqIChwMVswXSAtIHAyWzBdKSkgLyAocDFbMV0gLSBwMlsxXSkgLSBwMVswXSkgPCAwKSB7XG4gICAgICAgICAgICBpc0hpdCA9ICFpc0hpdDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaXNIaXQ7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wb2ludC1pbi1wb2x5Z29uLmpzLm1hcCIsImltcG9ydCBpc1BvaW50SW5Qb2x5Z29uIGZyb20gJy4vcG9pbnQtaW4tcG9seWdvbic7XG5pbXBvcnQgZ2V0TGluZUludGVyc2VjdCBmcm9tICcuL2dldC1saW5lLWludGVyc2VjdCc7XG5pbXBvcnQgeyBlYWNoIH0gZnJvbSAnQGFudHYvdXRpbCc7XG5mdW5jdGlvbiBwYXJzZVRvTGluZXMocG9pbnRzKSB7XG4gICAgdmFyIGxpbmVzID0gW107XG4gICAgdmFyIGNvdW50ID0gcG9pbnRzLmxlbmd0aDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50IC0gMTsgaSsrKSB7XG4gICAgICAgIHZhciBwb2ludCA9IHBvaW50c1tpXTtcbiAgICAgICAgdmFyIG5leHQgPSBwb2ludHNbaSArIDFdO1xuICAgICAgICBsaW5lcy5wdXNoKHtcbiAgICAgICAgICAgIGZyb206IHtcbiAgICAgICAgICAgICAgICB4OiBwb2ludFswXSxcbiAgICAgICAgICAgICAgICB5OiBwb2ludFsxXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRvOiB7XG4gICAgICAgICAgICAgICAgeDogbmV4dFswXSxcbiAgICAgICAgICAgICAgICB5OiBuZXh0WzFdXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAobGluZXMubGVuZ3RoID4gMSkge1xuICAgICAgICB2YXIgZmlyc3QgPSBwb2ludHNbMF07XG4gICAgICAgIHZhciBsYXN0ID0gcG9pbnRzW2NvdW50IC0gMV07XG4gICAgICAgIGxpbmVzLnB1c2goe1xuICAgICAgICAgICAgZnJvbToge1xuICAgICAgICAgICAgICAgIHg6IGxhc3RbMF0sXG4gICAgICAgICAgICAgICAgeTogbGFzdFsxXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRvOiB7XG4gICAgICAgICAgICAgICAgeDogZmlyc3RbMF0sXG4gICAgICAgICAgICAgICAgeTogZmlyc3RbMV1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBsaW5lcztcbn1cbmZ1bmN0aW9uIGxpbmVJbnRlcnNlY3RQb2x5Z29uKGxpbmVzLCBsaW5lKSB7XG4gICAgdmFyIGlzSW50ZXJzZWN0ID0gZmFsc2U7XG4gICAgZWFjaChsaW5lcywgZnVuY3Rpb24gKGwpIHtcbiAgICAgICAgaWYgKGdldExpbmVJbnRlcnNlY3QobC5mcm9tLCBsLnRvLCBsaW5lLmZyb20sIGxpbmUudG8pKSB7XG4gICAgICAgICAgICBpc0ludGVyc2VjdCA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gaXNJbnRlcnNlY3Q7XG59XG5mdW5jdGlvbiBnZXRCQm94KHBvaW50cykge1xuICAgIHZhciB4QXJyID0gcG9pbnRzLm1hcChmdW5jdGlvbiAocCkgeyByZXR1cm4gcFswXTsgfSk7XG4gICAgdmFyIHlBcnIgPSBwb2ludHMubWFwKGZ1bmN0aW9uIChwKSB7IHJldHVybiBwWzFdOyB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgICBtaW5YOiBNYXRoLm1pbi5hcHBseShudWxsLCB4QXJyKSxcbiAgICAgICAgbWF4WDogTWF0aC5tYXguYXBwbHkobnVsbCwgeEFyciksXG4gICAgICAgIG1pblk6IE1hdGgubWluLmFwcGx5KG51bGwsIHlBcnIpLFxuICAgICAgICBtYXhZOiBNYXRoLm1heC5hcHBseShudWxsLCB5QXJyKVxuICAgIH07XG59XG5mdW5jdGlvbiBpbnRlcnNlY3RCQm94KGJveDEsIGJveDIpIHtcbiAgICByZXR1cm4gIShib3gyLm1pblggPiBib3gxLm1heFggfHwgYm94Mi5tYXhYIDwgYm94MS5taW5YIHx8IGJveDIubWluWSA+IGJveDEubWF4WSB8fCBib3gyLm1heFkgPCBib3gxLm1pblkpO1xufVxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNQb2x5Z29uc0ludGVyc2VjdChwb2ludHMxLCBwb2ludHMyKSB7XG4gICAgLy8g56m65pWw57uE77yM5oiW6ICF5LiA5Liq54K56L+U5ZueIGZhbHNlXG4gICAgaWYgKHBvaW50czEubGVuZ3RoIDwgMiB8fCBwb2ludHMyLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB2YXIgYmJveDEgPSBnZXRCQm94KHBvaW50czEpO1xuICAgIHZhciBiYm94MiA9IGdldEJCb3gocG9pbnRzMik7XG4gICAgLy8g5Yik5a6a5YyF5Zu055uS5piv5ZCm55u45Lqk77yM5q+U5Yik5a6a54K55piv5ZCm5Zyo5aSa6L655b2i5YaF6KaB5b+r55qE5aSa77yM5Y+v5Lul562b6YCJ5o6J5aSn5aSa5pWw5oOF5Ya1XG4gICAgaWYgKCFpbnRlcnNlY3RCQm94KGJib3gxLCBiYm94MikpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB2YXIgaXNJbiA9IGZhbHNlO1xuICAgIC8vIOWIpOWumueCueaYr+WQpuWcqOWkmui+ueW9ouWGhemDqO+8jOS4gOaXpuacieS4gOS4queCueWcqOWPpuS4gOS4quWkmui+ueW9ouWGhe+8jOWImei/lOWbnlxuICAgIGVhY2gocG9pbnRzMiwgZnVuY3Rpb24gKHBvaW50KSB7XG4gICAgICAgIGlmIChpc1BvaW50SW5Qb2x5Z29uKHBvaW50czEsIHBvaW50WzBdLCBwb2ludFsxXSkpIHtcbiAgICAgICAgICAgIGlzSW4gPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgaWYgKGlzSW4pIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8vIOS4pOS4quWkmui+ueW9oumDvemcgOimgeWIpOWumlxuICAgIGVhY2gocG9pbnRzMSwgZnVuY3Rpb24gKHBvaW50KSB7XG4gICAgICAgIGlmIChpc1BvaW50SW5Qb2x5Z29uKHBvaW50czIsIHBvaW50WzBdLCBwb2ludFsxXSkpIHtcbiAgICAgICAgICAgIGlzSW4gPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgaWYgKGlzSW4pIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHZhciBsaW5lczEgPSBwYXJzZVRvTGluZXMocG9pbnRzMSk7XG4gICAgdmFyIGxpbmVzMiA9IHBhcnNlVG9MaW5lcyhwb2ludHMyKTtcbiAgICB2YXIgaXNJbnRlcnNlY3QgPSBmYWxzZTtcbiAgICBlYWNoKGxpbmVzMiwgZnVuY3Rpb24gKGxpbmUpIHtcbiAgICAgICAgaWYgKGxpbmVJbnRlcnNlY3RQb2x5Z29uKGxpbmVzMSwgbGluZSkpIHtcbiAgICAgICAgICAgIGlzSW50ZXJzZWN0ID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBpc0ludGVyc2VjdDtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWlzLXBvbHlnb25zLWludGVyc2VjdC5qcy5tYXAiLCJleHBvcnQgeyBkZWZhdWx0IGFzIHBhcnNlUGF0aCB9IGZyb20gJy4vcGFyc2UtcGF0aCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGNhdG11bGxSb20yQmV6aWVyIH0gZnJvbSAnLi9jYXRtdWxsLXJvbS0yLWJlemllcic7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGZpbGxQYXRoIH0gZnJvbSAnLi9maWxsLXBhdGgnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBmaWxsUGF0aEJ5RGlmZiB9IGZyb20gJy4vZmlsbC1wYXRoLWJ5LWRpZmYnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBmb3JtYXRQYXRoIH0gZnJvbSAnLi9mb3JtYXQtcGF0aCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHBhdGhJbnRlcnNlY3Rpb24gfSBmcm9tICcuL3BhdGgtaW50ZXJzZWN0aW9uJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgcGFyc2VQYXRoQXJyYXkgfSBmcm9tICcuL3BhcnNlLXBhdGgtYXJyYXknO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBwYXJzZVBhdGhTdHJpbmcgfSBmcm9tICcuL3BhcnNlLXBhdGgtc3RyaW5nJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgcGF0aDJDdXJ2ZSB9IGZyb20gJy4vcGF0aC0yLWN1cnZlJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgcGF0aDJBYnNvbHV0ZSB9IGZyb20gJy4vcGF0aC0yLWFic29sdXRlJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgcmVhY3RQYXRoIH0gZnJvbSAnLi9yZWN0LXBhdGgnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBnZXRBcmNQYXJhbXMgfSBmcm9tICcuL2dldC1hcmMtcGFyYW1zJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgcGF0aDJTZWdtZW50cyB9IGZyb20gJy4vcGF0aC0yLXNlZ21lbnRzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgZ2V0TGluZUludGVyc2VjdCB9IGZyb20gJy4vZ2V0LWxpbmUtaW50ZXJzZWN0JztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaXNQb2x5Z29uc0ludGVyc2VjdCB9IGZyb20gJy4vaXMtcG9seWdvbnMtaW50ZXJzZWN0JztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaXNQb2ludEluUG9seWdvbiB9IGZyb20gJy4vcG9pbnQtaW4tcG9seWdvbic7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///37\n")},function(module,__webpack_exports__,__webpack_require__){"use strict";eval('/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return multiplyMatrix; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return multiplyVec2; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return invert; });\n/**\n * @fileoverview 矩阵运算,本来是要引入 gl-matrix, 但是考虑到 g-mobile 对大小有限制,同时 g-webgl 使用的 matrix 不一致\n * 所以,这里仅实现 2D 几个运算,上层自己引入 gl-matrix\n * @author dxq613@gmail.com\n */\n/**\n * 3阶矩阵相乘\n * @param {number[]} a 矩阵1\n * @param {number[]} b 矩阵2\n */\nfunction multiplyMatrix(a, b) {\n var out = [];\n var a00 = a[0];\n var a01 = a[1];\n var a02 = a[2];\n var a10 = a[3];\n var a11 = a[4];\n var a12 = a[5];\n var a20 = a[6];\n var a21 = a[7];\n var a22 = a[8];\n var b00 = b[0];\n var b01 = b[1];\n var b02 = b[2];\n var b10 = b[3];\n var b11 = b[4];\n var b12 = b[5];\n var b20 = b[6];\n var b21 = b[7];\n var b22 = b[8];\n out[0] = b00 * a00 + b01 * a10 + b02 * a20;\n out[1] = b00 * a01 + b01 * a11 + b02 * a21;\n out[2] = b00 * a02 + b01 * a12 + b02 * a22;\n out[3] = b10 * a00 + b11 * a10 + b12 * a20;\n out[4] = b10 * a01 + b11 * a11 + b12 * a21;\n out[5] = b10 * a02 + b11 * a12 + b12 * a22;\n out[6] = b20 * a00 + b21 * a10 + b22 * a20;\n out[7] = b20 * a01 + b21 * a11 + b22 * a21;\n out[8] = b20 * a02 + b21 * a12 + b22 * a22;\n return out;\n}\n/**\n * 3阶矩阵同2阶向量相乘\n * @param {number[]} m 矩阵\n * @param {number[]} v 二阶向量\n */\nfunction multiplyVec2(m, v) {\n var out = [];\n var x = v[0];\n var y = v[1];\n out[0] = m[0] * x + m[3] * y + m[6];\n out[1] = m[1] * x + m[4] * y + m[7];\n return out;\n}\n/**\n * 矩阵的逆\n * @param {number[]} a 矩阵\n */\nfunction invert(a) {\n var out = [];\n var a00 = a[0];\n var a01 = a[1];\n var a02 = a[2];\n var a10 = a[3];\n var a11 = a[4];\n var a12 = a[5];\n var a20 = a[6];\n var a21 = a[7];\n var a22 = a[8];\n var b01 = a22 * a11 - a12 * a21;\n var b11 = -a22 * a10 + a12 * a20;\n var b21 = a21 * a10 - a11 * a20;\n // Calculate the determinant\n var det = a00 * b01 + a01 * b11 + a02 * b21;\n if (!det) {\n return null;\n }\n det = 1.0 / det;\n out[0] = b01 * det;\n out[1] = (-a22 * a01 + a02 * a21) * det;\n out[2] = (a12 * a01 - a02 * a11) * det;\n out[3] = b11 * det;\n out[4] = (a22 * a00 - a02 * a20) * det;\n out[5] = (-a12 * a00 + a02 * a10) * det;\n out[6] = b21 * det;\n out[7] = (-a21 * a00 + a01 * a20) * det;\n out[8] = (a11 * a00 - a01 * a10) * det;\n return out;\n}\n//# sourceMappingURL=matrix.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy1iYXNlL2VzbS91dGlsL21hdHJpeC5qcz82OTI4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxTQUFTO0FBQ3BCLFdBQVcsU0FBUztBQUNwQjtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsU0FBUztBQUNwQixXQUFXLFNBQVM7QUFDcEI7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsU0FBUztBQUNwQjtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiMzguanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlb3ZlcnZpZXcg55+p6Zi16L+Q566X77yM5pys5p2l5piv6KaB5byV5YWlIGdsLW1hdHJpeCwg5L2G5piv6ICD6JmR5YiwIGctbW9iaWxlIOWvueWkp+Wwj+aciemZkOWItu+8jOWQjOaXtiBnLXdlYmdsIOS9v+eUqOeahCBtYXRyaXgg5LiN5LiA6Ie0XG4gKiDmiYDku6XvvIzov5nph4zku4Xlrp7njrAgMkQg5Yeg5Liq6L+Q566X77yM5LiK5bGC6Ieq5bex5byV5YWlIGdsLW1hdHJpeFxuICogQGF1dGhvciBkeHE2MTNAZ21haWwuY29tXG4gKi9cbi8qKlxuICogM+mYtuefqemYteebuOS5mFxuICogQHBhcmFtIHtudW1iZXJbXX0gYSDnn6npmLUxXG4gKiBAcGFyYW0ge251bWJlcltdfSBiIOefqemYtTJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG11bHRpcGx5TWF0cml4KGEsIGIpIHtcbiAgICB2YXIgb3V0ID0gW107XG4gICAgdmFyIGEwMCA9IGFbMF07XG4gICAgdmFyIGEwMSA9IGFbMV07XG4gICAgdmFyIGEwMiA9IGFbMl07XG4gICAgdmFyIGExMCA9IGFbM107XG4gICAgdmFyIGExMSA9IGFbNF07XG4gICAgdmFyIGExMiA9IGFbNV07XG4gICAgdmFyIGEyMCA9IGFbNl07XG4gICAgdmFyIGEyMSA9IGFbN107XG4gICAgdmFyIGEyMiA9IGFbOF07XG4gICAgdmFyIGIwMCA9IGJbMF07XG4gICAgdmFyIGIwMSA9IGJbMV07XG4gICAgdmFyIGIwMiA9IGJbMl07XG4gICAgdmFyIGIxMCA9IGJbM107XG4gICAgdmFyIGIxMSA9IGJbNF07XG4gICAgdmFyIGIxMiA9IGJbNV07XG4gICAgdmFyIGIyMCA9IGJbNl07XG4gICAgdmFyIGIyMSA9IGJbN107XG4gICAgdmFyIGIyMiA9IGJbOF07XG4gICAgb3V0WzBdID0gYjAwICogYTAwICsgYjAxICogYTEwICsgYjAyICogYTIwO1xuICAgIG91dFsxXSA9IGIwMCAqIGEwMSArIGIwMSAqIGExMSArIGIwMiAqIGEyMTtcbiAgICBvdXRbMl0gPSBiMDAgKiBhMDIgKyBiMDEgKiBhMTIgKyBiMDIgKiBhMjI7XG4gICAgb3V0WzNdID0gYjEwICogYTAwICsgYjExICogYTEwICsgYjEyICogYTIwO1xuICAgIG91dFs0XSA9IGIxMCAqIGEwMSArIGIxMSAqIGExMSArIGIxMiAqIGEyMTtcbiAgICBvdXRbNV0gPSBiMTAgKiBhMDIgKyBiMTEgKiBhMTIgKyBiMTIgKiBhMjI7XG4gICAgb3V0WzZdID0gYjIwICogYTAwICsgYjIxICogYTEwICsgYjIyICogYTIwO1xuICAgIG91dFs3XSA9IGIyMCAqIGEwMSArIGIyMSAqIGExMSArIGIyMiAqIGEyMTtcbiAgICBvdXRbOF0gPSBiMjAgKiBhMDIgKyBiMjEgKiBhMTIgKyBiMjIgKiBhMjI7XG4gICAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogM+mYtuefqemYteWQjDLpmLblkJHph4/nm7jkuZhcbiAqIEBwYXJhbSB7bnVtYmVyW119IG0g55+p6Zi1XG4gKiBAcGFyYW0ge251bWJlcltdfSB2IOS6jOmYtuWQkemHj1xuICovXG5leHBvcnQgZnVuY3Rpb24gbXVsdGlwbHlWZWMyKG0sIHYpIHtcbiAgICB2YXIgb3V0ID0gW107XG4gICAgdmFyIHggPSB2WzBdO1xuICAgIHZhciB5ID0gdlsxXTtcbiAgICBvdXRbMF0gPSBtWzBdICogeCArIG1bM10gKiB5ICsgbVs2XTtcbiAgICBvdXRbMV0gPSBtWzFdICogeCArIG1bNF0gKiB5ICsgbVs3XTtcbiAgICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiDnn6npmLXnmoTpgIZcbiAqIEBwYXJhbSB7bnVtYmVyW119IGEg55+p6Zi1XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnZlcnQoYSkge1xuICAgIHZhciBvdXQgPSBbXTtcbiAgICB2YXIgYTAwID0gYVswXTtcbiAgICB2YXIgYTAxID0gYVsxXTtcbiAgICB2YXIgYTAyID0gYVsyXTtcbiAgICB2YXIgYTEwID0gYVszXTtcbiAgICB2YXIgYTExID0gYVs0XTtcbiAgICB2YXIgYTEyID0gYVs1XTtcbiAgICB2YXIgYTIwID0gYVs2XTtcbiAgICB2YXIgYTIxID0gYVs3XTtcbiAgICB2YXIgYTIyID0gYVs4XTtcbiAgICB2YXIgYjAxID0gYTIyICogYTExIC0gYTEyICogYTIxO1xuICAgIHZhciBiMTEgPSAtYTIyICogYTEwICsgYTEyICogYTIwO1xuICAgIHZhciBiMjEgPSBhMjEgKiBhMTAgLSBhMTEgKiBhMjA7XG4gICAgLy8gQ2FsY3VsYXRlIHRoZSBkZXRlcm1pbmFudFxuICAgIHZhciBkZXQgPSBhMDAgKiBiMDEgKyBhMDEgKiBiMTEgKyBhMDIgKiBiMjE7XG4gICAgaWYgKCFkZXQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGRldCA9IDEuMCAvIGRldDtcbiAgICBvdXRbMF0gPSBiMDEgKiBkZXQ7XG4gICAgb3V0WzFdID0gKC1hMjIgKiBhMDEgKyBhMDIgKiBhMjEpICogZGV0O1xuICAgIG91dFsyXSA9IChhMTIgKiBhMDEgLSBhMDIgKiBhMTEpICogZGV0O1xuICAgIG91dFszXSA9IGIxMSAqIGRldDtcbiAgICBvdXRbNF0gPSAoYTIyICogYTAwIC0gYTAyICogYTIwKSAqIGRldDtcbiAgICBvdXRbNV0gPSAoLWExMiAqIGEwMCArIGEwMiAqIGExMCkgKiBkZXQ7XG4gICAgb3V0WzZdID0gYjIxICogZGV0O1xuICAgIG91dFs3XSA9ICgtYTIxICogYTAwICsgYTAxICogYTIwKSAqIGRldDtcbiAgICBvdXRbOF0gPSAoYTExICogYTAwIC0gYTAxICogYTEwKSAqIGRldDtcbiAgICByZXR1cm4gb3V0O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWF0cml4LmpzLm1hcCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///38\n')},function(module,__webpack_exports__,__webpack_require__){"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "create", function() { return create; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "clone", function() { return clone; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "length", function() { return length; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "fromValues", function() { return fromValues; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "copy", function() { return copy; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "set", function() { return set; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "add", function() { return add; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "subtract", function() { return subtract; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "multiply", function() { return multiply; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "divide", function() { return divide; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ceil", function() { return ceil; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "floor", function() { return floor; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "min", function() { return min; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "max", function() { return max; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "round", function() { return round; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "scale", function() { return scale; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "scaleAndAdd", function() { return scaleAndAdd; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "distance", function() { return distance; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "squaredDistance", function() { return squaredDistance; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "squaredLength", function() { return squaredLength; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "negate", function() { return negate; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "inverse", function() { return inverse; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "normalize", function() { return normalize; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "dot", function() { return dot; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "cross", function() { return cross; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "lerp", function() { return lerp; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "hermite", function() { return hermite; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bezier", function() { return bezier; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "random", function() { return random; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "transformMat4", function() { return transformMat4; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "transformMat3", function() { return transformMat3; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "transformQuat", function() { return transformQuat; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "rotateX", function() { return rotateX; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "rotateY", function() { return rotateY; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "rotateZ", function() { return rotateZ; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "angle", function() { return angle; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "zero", function() { return zero; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "str", function() { return str; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "exactEquals", function() { return exactEquals; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "equals", function() { return equals; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sub", function() { return sub; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mul", function() { return mul; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "div", function() { return div; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "dist", function() { return dist; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sqrDist", function() { return sqrDist; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "len", function() { return len; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sqrLen", function() { return sqrLen; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "forEach", function() { return forEach; });\n/* harmony import */ var _common_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12);\n\n/**\n * 3 Dimensional Vector\n * @module vec3\n */\n\n/**\n * Creates a new, empty vec3\n *\n * @returns {vec3} a new 3D vector\n */\n\nfunction create() {\n var out = new _common_js__WEBPACK_IMPORTED_MODULE_0__[/* ARRAY_TYPE */ "a"](3);\n\n if (_common_js__WEBPACK_IMPORTED_MODULE_0__[/* ARRAY_TYPE */ "a"] != Float32Array) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n }\n\n return out;\n}\n/**\n * Creates a new vec3 initialized with values from an existing vector\n *\n * @param {ReadonlyVec3} a vector to clone\n * @returns {vec3} a new 3D vector\n */\n\nfunction clone(a) {\n var out = new _common_js__WEBPACK_IMPORTED_MODULE_0__[/* ARRAY_TYPE */ "a"](3);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n return out;\n}\n/**\n * Calculates the length of a vec3\n *\n * @param {ReadonlyVec3} a vector to calculate length of\n * @returns {Number} length of a\n */\n\nfunction length(a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n return Math.hypot(x, y, z);\n}\n/**\n * Creates a new vec3 initialized with the given values\n *\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @returns {vec3} a new 3D vector\n */\n\nfunction fromValues(x, y, z) {\n var out = new _common_js__WEBPACK_IMPORTED_MODULE_0__[/* ARRAY_TYPE */ "a"](3);\n out[0] = x;\n out[1] = y;\n out[2] = z;\n return out;\n}\n/**\n * Copy the values from one vec3 to another\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the source vector\n * @returns {vec3} out\n */\n\nfunction copy(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n return out;\n}\n/**\n * Set the components of a vec3 to the given values\n *\n * @param {vec3} out the receiving vector\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @returns {vec3} out\n */\n\nfunction set(out, x, y, z) {\n out[0] = x;\n out[1] = y;\n out[2] = z;\n return out;\n}\n/**\n * Adds two vec3\'s\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\n\nfunction add(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n return out;\n}\n/**\n * Subtracts vector b from vector a\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\n\nfunction subtract(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n return out;\n}\n/**\n * Multiplies two vec3\'s\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\n\nfunction multiply(out, a, b) {\n out[0] = a[0] * b[0];\n out[1] = a[1] * b[1];\n out[2] = a[2] * b[2];\n return out;\n}\n/**\n * Divides two vec3\'s\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\n\nfunction divide(out, a, b) {\n out[0] = a[0] / b[0];\n out[1] = a[1] / b[1];\n out[2] = a[2] / b[2];\n return out;\n}\n/**\n * Math.ceil the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to ceil\n * @returns {vec3} out\n */\n\nfunction ceil(out, a) {\n out[0] = Math.ceil(a[0]);\n out[1] = Math.ceil(a[1]);\n out[2] = Math.ceil(a[2]);\n return out;\n}\n/**\n * Math.floor the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to floor\n * @returns {vec3} out\n */\n\nfunction floor(out, a) {\n out[0] = Math.floor(a[0]);\n out[1] = Math.floor(a[1]);\n out[2] = Math.floor(a[2]);\n return out;\n}\n/**\n * Returns the minimum of two vec3\'s\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\n\nfunction min(out, a, b) {\n out[0] = Math.min(a[0], b[0]);\n out[1] = Math.min(a[1], b[1]);\n out[2] = Math.min(a[2], b[2]);\n return out;\n}\n/**\n * Returns the maximum of two vec3\'s\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\n\nfunction max(out, a, b) {\n out[0] = Math.max(a[0], b[0]);\n out[1] = Math.max(a[1], b[1]);\n out[2] = Math.max(a[2], b[2]);\n return out;\n}\n/**\n * Math.round the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to round\n * @returns {vec3} out\n */\n\nfunction round(out, a) {\n out[0] = Math.round(a[0]);\n out[1] = Math.round(a[1]);\n out[2] = Math.round(a[2]);\n return out;\n}\n/**\n * Scales a vec3 by a scalar number\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {vec3} out\n */\n\nfunction scale(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n return out;\n}\n/**\n * Adds two vec3\'s after scaling the second operand by a scalar value\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @param {Number} scale the amount to scale b by before adding\n * @returns {vec3} out\n */\n\nfunction scaleAndAdd(out, a, b, scale) {\n out[0] = a[0] + b[0] * scale;\n out[1] = a[1] + b[1] * scale;\n out[2] = a[2] + b[2] * scale;\n return out;\n}\n/**\n * Calculates the euclidian distance between two vec3\'s\n *\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {Number} distance between a and b\n */\n\nfunction distance(a, b) {\n var x = b[0] - a[0];\n var y = b[1] - a[1];\n var z = b[2] - a[2];\n return Math.hypot(x, y, z);\n}\n/**\n * Calculates the squared euclidian distance between two vec3\'s\n *\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {Number} squared distance between a and b\n */\n\nfunction squaredDistance(a, b) {\n var x = b[0] - a[0];\n var y = b[1] - a[1];\n var z = b[2] - a[2];\n return x * x + y * y + z * z;\n}\n/**\n * Calculates the squared length of a vec3\n *\n * @param {ReadonlyVec3} a vector to calculate squared length of\n * @returns {Number} squared length of a\n */\n\nfunction squaredLength(a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n return x * x + y * y + z * z;\n}\n/**\n * Negates the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to negate\n * @returns {vec3} out\n */\n\nfunction negate(out, a) {\n out[0] = -a[0];\n out[1] = -a[1];\n out[2] = -a[2];\n return out;\n}\n/**\n * Returns the inverse of the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to invert\n * @returns {vec3} out\n */\n\nfunction inverse(out, a) {\n out[0] = 1.0 / a[0];\n out[1] = 1.0 / a[1];\n out[2] = 1.0 / a[2];\n return out;\n}\n/**\n * Normalize a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to normalize\n * @returns {vec3} out\n */\n\nfunction normalize(out, a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n var len = x * x + y * y + z * z;\n\n if (len > 0) {\n //TODO: evaluate use of glm_invsqrt here?\n len = 1 / Math.sqrt(len);\n }\n\n out[0] = a[0] * len;\n out[1] = a[1] * len;\n out[2] = a[2] * len;\n return out;\n}\n/**\n * Calculates the dot product of two vec3\'s\n *\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {Number} dot product of a and b\n */\n\nfunction dot(a, b) {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n}\n/**\n * Computes the cross product of two vec3\'s\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\n\nfunction cross(out, a, b) {\n var ax = a[0],\n ay = a[1],\n az = a[2];\n var bx = b[0],\n by = b[1],\n bz = b[2];\n out[0] = ay * bz - az * by;\n out[1] = az * bx - ax * bz;\n out[2] = ax * by - ay * bx;\n return out;\n}\n/**\n * Performs a linear interpolation between two vec3\'s\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec3} out\n */\n\nfunction lerp(out, a, b, t) {\n var ax = a[0];\n var ay = a[1];\n var az = a[2];\n out[0] = ax + t * (b[0] - ax);\n out[1] = ay + t * (b[1] - ay);\n out[2] = az + t * (b[2] - az);\n return out;\n}\n/**\n * Performs a hermite interpolation with two control points\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @param {ReadonlyVec3} c the third operand\n * @param {ReadonlyVec3} d the fourth operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec3} out\n */\n\nfunction hermite(out, a, b, c, d, t) {\n var factorTimes2 = t * t;\n var factor1 = factorTimes2 * (2 * t - 3) + 1;\n var factor2 = factorTimes2 * (t - 2) + t;\n var factor3 = factorTimes2 * (t - 1);\n var factor4 = factorTimes2 * (3 - 2 * t);\n out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4;\n out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4;\n out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4;\n return out;\n}\n/**\n * Performs a bezier interpolation with two control points\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @param {ReadonlyVec3} c the third operand\n * @param {ReadonlyVec3} d the fourth operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec3} out\n */\n\nfunction bezier(out, a, b, c, d, t) {\n var inverseFactor = 1 - t;\n var inverseFactorTimesTwo = inverseFactor * inverseFactor;\n var factorTimes2 = t * t;\n var factor1 = inverseFactorTimesTwo * inverseFactor;\n var factor2 = 3 * t * inverseFactorTimesTwo;\n var factor3 = 3 * factorTimes2 * inverseFactor;\n var factor4 = factorTimes2 * t;\n out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4;\n out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4;\n out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4;\n return out;\n}\n/**\n * Generates a random vector with the given scale\n *\n * @param {vec3} out the receiving vector\n * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned\n * @returns {vec3} out\n */\n\nfunction random(out, scale) {\n scale = scale || 1.0;\n var r = _common_js__WEBPACK_IMPORTED_MODULE_0__[/* RANDOM */ "c"]() * 2.0 * Math.PI;\n var z = _common_js__WEBPACK_IMPORTED_MODULE_0__[/* RANDOM */ "c"]() * 2.0 - 1.0;\n var zScale = Math.sqrt(1.0 - z * z) * scale;\n out[0] = Math.cos(r) * zScale;\n out[1] = Math.sin(r) * zScale;\n out[2] = z * scale;\n return out;\n}\n/**\n * Transforms the vec3 with a mat4.\n * 4th vector component is implicitly \'1\'\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the vector to transform\n * @param {ReadonlyMat4} m matrix to transform with\n * @returns {vec3} out\n */\n\nfunction transformMat4(out, a, m) {\n var x = a[0],\n y = a[1],\n z = a[2];\n var w = m[3] * x + m[7] * y + m[11] * z + m[15];\n w = w || 1.0;\n out[0] = (m[0] * x + m[4] * y + m[8] * z + m[12]) / w;\n out[1] = (m[1] * x + m[5] * y + m[9] * z + m[13]) / w;\n out[2] = (m[2] * x + m[6] * y + m[10] * z + m[14]) / w;\n return out;\n}\n/**\n * Transforms the vec3 with a mat3.\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the vector to transform\n * @param {ReadonlyMat3} m the 3x3 matrix to transform with\n * @returns {vec3} out\n */\n\nfunction transformMat3(out, a, m) {\n var x = a[0],\n y = a[1],\n z = a[2];\n out[0] = x * m[0] + y * m[3] + z * m[6];\n out[1] = x * m[1] + y * m[4] + z * m[7];\n out[2] = x * m[2] + y * m[5] + z * m[8];\n return out;\n}\n/**\n * Transforms the vec3 with a quat\n * Can also be used for dual quaternions. (Multiply it with the real part)\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the vector to transform\n * @param {ReadonlyQuat} q quaternion to transform with\n * @returns {vec3} out\n */\n\nfunction transformQuat(out, a, q) {\n // benchmarks: https://jsperf.com/quaternion-transform-vec3-implementations-fixed\n var qx = q[0],\n qy = q[1],\n qz = q[2],\n qw = q[3];\n var x = a[0],\n y = a[1],\n z = a[2]; // var qvec = [qx, qy, qz];\n // var uv = vec3.cross([], qvec, a);\n\n var uvx = qy * z - qz * y,\n uvy = qz * x - qx * z,\n uvz = qx * y - qy * x; // var uuv = vec3.cross([], qvec, uv);\n\n var uuvx = qy * uvz - qz * uvy,\n uuvy = qz * uvx - qx * uvz,\n uuvz = qx * uvy - qy * uvx; // vec3.scale(uv, uv, 2 * w);\n\n var w2 = qw * 2;\n uvx *= w2;\n uvy *= w2;\n uvz *= w2; // vec3.scale(uuv, uuv, 2);\n\n uuvx *= 2;\n uuvy *= 2;\n uuvz *= 2; // return vec3.add(out, a, vec3.add(out, uv, uuv));\n\n out[0] = x + uvx + uuvx;\n out[1] = y + uvy + uuvy;\n out[2] = z + uvz + uuvz;\n return out;\n}\n/**\n * Rotate a 3D vector around the x-axis\n * @param {vec3} out The receiving vec3\n * @param {ReadonlyVec3} a The vec3 point to rotate\n * @param {ReadonlyVec3} b The origin of the rotation\n * @param {Number} rad The angle of rotation in radians\n * @returns {vec3} out\n */\n\nfunction rotateX(out, a, b, rad) {\n var p = [],\n r = []; //Translate point to the origin\n\n p[0] = a[0] - b[0];\n p[1] = a[1] - b[1];\n p[2] = a[2] - b[2]; //perform rotation\n\n r[0] = p[0];\n r[1] = p[1] * Math.cos(rad) - p[2] * Math.sin(rad);\n r[2] = p[1] * Math.sin(rad) + p[2] * Math.cos(rad); //translate to correct position\n\n out[0] = r[0] + b[0];\n out[1] = r[1] + b[1];\n out[2] = r[2] + b[2];\n return out;\n}\n/**\n * Rotate a 3D vector around the y-axis\n * @param {vec3} out The receiving vec3\n * @param {ReadonlyVec3} a The vec3 point to rotate\n * @param {ReadonlyVec3} b The origin of the rotation\n * @param {Number} rad The angle of rotation in radians\n * @returns {vec3} out\n */\n\nfunction rotateY(out, a, b, rad) {\n var p = [],\n r = []; //Translate point to the origin\n\n p[0] = a[0] - b[0];\n p[1] = a[1] - b[1];\n p[2] = a[2] - b[2]; //perform rotation\n\n r[0] = p[2] * Math.sin(rad) + p[0] * Math.cos(rad);\n r[1] = p[1];\n r[2] = p[2] * Math.cos(rad) - p[0] * Math.sin(rad); //translate to correct position\n\n out[0] = r[0] + b[0];\n out[1] = r[1] + b[1];\n out[2] = r[2] + b[2];\n return out;\n}\n/**\n * Rotate a 3D vector around the z-axis\n * @param {vec3} out The receiving vec3\n * @param {ReadonlyVec3} a The vec3 point to rotate\n * @param {ReadonlyVec3} b The origin of the rotation\n * @param {Number} rad The angle of rotation in radians\n * @returns {vec3} out\n */\n\nfunction rotateZ(out, a, b, rad) {\n var p = [],\n r = []; //Translate point to the origin\n\n p[0] = a[0] - b[0];\n p[1] = a[1] - b[1];\n p[2] = a[2] - b[2]; //perform rotation\n\n r[0] = p[0] * Math.cos(rad) - p[1] * Math.sin(rad);\n r[1] = p[0] * Math.sin(rad) + p[1] * Math.cos(rad);\n r[2] = p[2]; //translate to correct position\n\n out[0] = r[0] + b[0];\n out[1] = r[1] + b[1];\n out[2] = r[2] + b[2];\n return out;\n}\n/**\n * Get the angle between two 3D vectors\n * @param {ReadonlyVec3} a The first operand\n * @param {ReadonlyVec3} b The second operand\n * @returns {Number} The angle in radians\n */\n\nfunction angle(a, b) {\n var ax = a[0],\n ay = a[1],\n az = a[2],\n bx = b[0],\n by = b[1],\n bz = b[2],\n mag1 = Math.sqrt(ax * ax + ay * ay + az * az),\n mag2 = Math.sqrt(bx * bx + by * by + bz * bz),\n mag = mag1 * mag2,\n cosine = mag && dot(a, b) / mag;\n return Math.acos(Math.min(Math.max(cosine, -1), 1));\n}\n/**\n * Set the components of a vec3 to zero\n *\n * @param {vec3} out the receiving vector\n * @returns {vec3} out\n */\n\nfunction zero(out) {\n out[0] = 0.0;\n out[1] = 0.0;\n out[2] = 0.0;\n return out;\n}\n/**\n * Returns a string representation of a vector\n *\n * @param {ReadonlyVec3} a vector to represent as a string\n * @returns {String} string representation of the vector\n */\n\nfunction str(a) {\n return "vec3(" + a[0] + ", " + a[1] + ", " + a[2] + ")";\n}\n/**\n * Returns whether or not the vectors have exactly the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyVec3} a The first vector.\n * @param {ReadonlyVec3} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\nfunction exactEquals(a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2];\n}\n/**\n * Returns whether or not the vectors have approximately the same elements in the same position.\n *\n * @param {ReadonlyVec3} a The first vector.\n * @param {ReadonlyVec3} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\nfunction equals(a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2];\n return Math.abs(a0 - b0) <= _common_js__WEBPACK_IMPORTED_MODULE_0__[/* EPSILON */ "b"] * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= _common_js__WEBPACK_IMPORTED_MODULE_0__[/* EPSILON */ "b"] * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= _common_js__WEBPACK_IMPORTED_MODULE_0__[/* EPSILON */ "b"] * Math.max(1.0, Math.abs(a2), Math.abs(b2));\n}\n/**\n * Alias for {@link vec3.subtract}\n * @function\n */\n\nvar sub = subtract;\n/**\n * Alias for {@link vec3.multiply}\n * @function\n */\n\nvar mul = multiply;\n/**\n * Alias for {@link vec3.divide}\n * @function\n */\n\nvar div = divide;\n/**\n * Alias for {@link vec3.distance}\n * @function\n */\n\nvar dist = distance;\n/**\n * Alias for {@link vec3.squaredDistance}\n * @function\n */\n\nvar sqrDist = squaredDistance;\n/**\n * Alias for {@link vec3.length}\n * @function\n */\n\nvar len = length;\n/**\n * Alias for {@link vec3.squaredLength}\n * @function\n */\n\nvar sqrLen = squaredLength;\n/**\n * Perform some operation over an array of vec3s.\n *\n * @param {Array} a the array of vectors to iterate over\n * @param {Number} stride Number of elements between the start of each vec3. If 0 assumes tightly packed\n * @param {Number} offset Number of elements to skip at the beginning of the array\n * @param {Number} count Number of vec3s to iterate over. If 0 iterates over entire array\n * @param {Function} fn Function to call for each vector in the array\n * @param {Object} [arg] additional argument to pass to fn\n * @returns {Array} a\n * @function\n */\n\nvar forEach = function () {\n var vec = create();\n return function (a, stride, offset, count, fn, arg) {\n var i, l;\n\n if (!stride) {\n stride = 3;\n }\n\n if (!offset) {\n offset = 0;\n }\n\n if (count) {\n l = Math.min(count * stride + offset, a.length);\n } else {\n l = a.length;\n }\n\n for (i = offset; i < l; i += stride) {\n vec[0] = a[i];\n vec[1] = a[i + 1];\n vec[2] = a[i + 2];\n fn(vec, vec, arg);\n a[i] = vec[0];\n a[i + 1] = vec[1];\n a[i + 2] = vec[2];\n }\n\n return a;\n };\n}();//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZ2wtbWF0cml4L2VzbS92ZWMzLmpzPzlmZTciXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUF3QztBQUN4QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLEtBQUs7QUFDbEI7O0FBRU87QUFDUCxnQkFBZ0IsNkRBQW1COztBQUVuQyxNQUFNLDZEQUFtQjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxhQUFhO0FBQ3hCLGFBQWEsS0FBSztBQUNsQjs7QUFFTztBQUNQLGdCQUFnQiw2REFBbUI7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsYUFBYTtBQUN4QixhQUFhLE9BQU87QUFDcEI7O0FBRU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsYUFBYSxLQUFLO0FBQ2xCOztBQUVPO0FBQ1AsZ0JBQWdCLDZEQUFtQjtBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsYUFBYTtBQUN4QixhQUFhLEtBQUs7QUFDbEI7O0FBRU87QUFDUDtBQUNBO0FB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cUUsMERBQWdCLHFFQUFxRSwwREFBZ0I7QUFDeE47QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBOztBQUVPO0FBQ1A7QUFDQSxjQUFjO0FBQ2Q7QUFDQTs7QUFFTztBQUNQO0FBQ0EsY0FBYztBQUNkO0FBQ0E7O0FBRU87QUFDUDtBQUNBLGNBQWM7QUFDZDtBQUNBOztBQUVPO0FBQ1A7QUFDQSxjQUFjO0FBQ2Q7QUFDQTs7QUFFTztBQUNQO0FBQ0EsY0FBYztBQUNkO0FBQ0E7O0FBRU87QUFDUDtBQUNBLGNBQWM7QUFDZDtBQUNBOztBQUVPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsV0FBVyxNQUFNO0FBQ2pCLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsU0FBUztBQUNwQixXQUFXLE9BQU87QUFDbEIsYUFBYSxNQUFNO0FBQ25CO0FBQ0E7O0FBRU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUEsb0JBQW9CLE9BQU87QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsQ0FBQyIsImZpbGUiOiIzOS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGdsTWF0cml4IGZyb20gXCIuL2NvbW1vbi5qc1wiO1xuLyoqXG4gKiAzIERpbWVuc2lvbmFsIFZlY3RvclxuICogQG1vZHVsZSB2ZWMzXG4gKi9cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3LCBlbXB0eSB2ZWMzXG4gKlxuICogQHJldHVybnMge3ZlYzN9IGEgbmV3IDNEIHZlY3RvclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGUoKSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSgzKTtcblxuICBpZiAoZ2xNYXRyaXguQVJSQVlfVFlQRSAhPSBGbG9hdDMyQXJyYXkpIHtcbiAgICBvdXRbMF0gPSAwO1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgfVxuXG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgdmVjMyBpbml0aWFsaXplZCB3aXRoIHZhbHVlcyBmcm9tIGFuIGV4aXN0aW5nIHZlY3RvclxuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHZlY3RvciB0byBjbG9uZVxuICogQHJldHVybnMge3ZlYzN9IGEgbmV3IDNEIHZlY3RvclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjbG9uZShhKSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSgzKTtcbiAgb3V0WzBdID0gYVswXTtcbiAgb3V0WzFdID0gYVsxXTtcbiAgb3V0WzJdID0gYVsyXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgbGVuZ3RoIG9mIGEgdmVjM1xuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHZlY3RvciB0byBjYWxjdWxhdGUgbGVuZ3RoIG9mXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBsZW5ndGggb2YgYVxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBsZW5ndGgoYSkge1xuICB2YXIgeCA9IGFbMF07XG4gIHZhciB5ID0gYVsxXTtcbiAgdmFyIHogPSBhWzJdO1xuICByZXR1cm4gTWF0aC5oeXBvdCh4LCB5LCB6KTtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyB2ZWMzIGluaXRpYWxpemVkIHdpdGggdGhlIGdpdmVuIHZhbHVlc1xuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSB4IFggY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0geSBZIGNvbXBvbmVudFxuICogQHBhcmFtIHtOdW1iZXJ9IHogWiBjb21wb25lbnRcbiAqIEByZXR1cm5zIHt2ZWMzfSBhIG5ldyAzRCB2ZWN0b3JcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVZhbHVlcyh4LCB5LCB6KSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSgzKTtcbiAgb3V0WzBdID0geDtcbiAgb3V0WzFdID0geTtcbiAgb3V0WzJdID0gejtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ29weSB0aGUgdmFsdWVzIGZyb20gb25lIHZlYzMgdG8gYW5vdGhlclxuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB0aGUgc291cmNlIHZlY3RvclxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjb3B5KG91dCwgYSkge1xuICBvdXRbMF0gPSBhWzBdO1xuICBvdXRbMV0gPSBhWzFdO1xuICBvdXRbMl0gPSBhWzJdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBTZXQgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWMzIHRvIHRoZSBnaXZlbiB2YWx1ZXNcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtOdW1iZXJ9IHggWCBjb21wb25lbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB5IFkgY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0geiBaIGNvbXBvbmVudFxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzZXQob3V0LCB4LCB5LCB6KSB7XG4gIG91dFswXSA9IHg7XG4gIG91dFsxXSA9IHk7XG4gIG91dFsyXSA9IHo7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIEFkZHMgdHdvIHZlYzMnc1xuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGFkZChvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSArIGJbMF07XG4gIG91dFsxXSA9IGFbMV0gKyBiWzFdO1xuICBvdXRbMl0gPSBhWzJdICsgYlsyXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogU3VidHJhY3RzIHZlY3RvciBiIGZyb20gdmVjdG9yIGFcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzdWJ0cmFjdChvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAtIGJbMF07XG4gIG91dFsxXSA9IGFbMV0gLSBiWzFdO1xuICBvdXRbMl0gPSBhWzJdIC0gYlsyXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogTXVsdGlwbGllcyB0d28gdmVjMydzXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbXVsdGlwbHkob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gKiBiWzBdO1xuICBvdXRbMV0gPSBhWzFdICogYlsxXTtcbiAgb3V0WzJdID0gYVsyXSAqIGJbMl07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIERpdmlkZXMgdHdvIHZlYzMnc1xuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGRpdmlkZShvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAvIGJbMF07XG4gIG91dFsxXSA9IGFbMV0gLyBiWzFdO1xuICBvdXRbMl0gPSBhWzJdIC8gYlsyXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogTWF0aC5jZWlsIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjM1xuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB2ZWN0b3IgdG8gY2VpbFxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjZWlsKG91dCwgYSkge1xuICBvdXRbMF0gPSBNYXRoLmNlaWwoYVswXSk7XG4gIG91dFsxXSA9IE1hdGguY2VpbChhWzFdKTtcbiAgb3V0WzJdID0gTWF0aC5jZWlsKGFbMl0pO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBNYXRoLmZsb29yIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjM1xuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB2ZWN0b3IgdG8gZmxvb3JcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZmxvb3Iob3V0LCBhKSB7XG4gIG91dFswXSA9IE1hdGguZmxvb3IoYVswXSk7XG4gIG91dFsxXSA9IE1hdGguZmxvb3IoYVsxXSk7XG4gIG91dFsyXSA9IE1hdGguZmxvb3IoYVsyXSk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFJldHVybnMgdGhlIG1pbmltdW0gb2YgdHdvIHZlYzMnc1xuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG1pbihvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gTWF0aC5taW4oYVswXSwgYlswXSk7XG4gIG91dFsxXSA9IE1hdGgubWluKGFbMV0sIGJbMV0pO1xuICBvdXRbMl0gPSBNYXRoLm1pbihhWzJdLCBiWzJdKTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogUmV0dXJucyB0aGUgbWF4aW11bSBvZiB0d28gdmVjMydzXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbWF4KG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBNYXRoLm1heChhWzBdLCBiWzBdKTtcbiAgb3V0WzFdID0gTWF0aC5tYXgoYVsxXSwgYlsxXSk7XG4gIG91dFsyXSA9IE1hdGgubWF4KGFbMl0sIGJbMl0pO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBNYXRoLnJvdW5kIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjM1xuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB2ZWN0b3IgdG8gcm91bmRcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcm91bmQob3V0LCBhKSB7XG4gIG91dFswXSA9IE1hdGgucm91bmQoYVswXSk7XG4gIG91dFsxXSA9IE1hdGgucm91bmQoYVsxXSk7XG4gIG91dFsyXSA9IE1hdGgucm91bmQoYVsyXSk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFNjYWxlcyBhIHZlYzMgYnkgYSBzY2FsYXIgbnVtYmVyXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHRoZSB2ZWN0b3IgdG8gc2NhbGVcbiAqIEBwYXJhbSB7TnVtYmVyfSBiIGFtb3VudCB0byBzY2FsZSB0aGUgdmVjdG9yIGJ5XG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNjYWxlKG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdICogYjtcbiAgb3V0WzFdID0gYVsxXSAqIGI7XG4gIG91dFsyXSA9IGFbMl0gKiBiO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBBZGRzIHR3byB2ZWMzJ3MgYWZ0ZXIgc2NhbGluZyB0aGUgc2Vjb25kIG9wZXJhbmQgYnkgYSBzY2FsYXIgdmFsdWVcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHBhcmFtIHtOdW1iZXJ9IHNjYWxlIHRoZSBhbW91bnQgdG8gc2NhbGUgYiBieSBiZWZvcmUgYWRkaW5nXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNjYWxlQW5kQWRkKG91dCwgYSwgYiwgc2NhbGUpIHtcbiAgb3V0WzBdID0gYVswXSArIGJbMF0gKiBzY2FsZTtcbiAgb3V0WzFdID0gYVsxXSArIGJbMV0gKiBzY2FsZTtcbiAgb3V0WzJdID0gYVsyXSArIGJbMl0gKiBzY2FsZTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgZXVjbGlkaWFuIGRpc3RhbmNlIGJldHdlZW4gdHdvIHZlYzMnc1xuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGRpc3RhbmNlIGJldHdlZW4gYSBhbmQgYlxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBkaXN0YW5jZShhLCBiKSB7XG4gIHZhciB4ID0gYlswXSAtIGFbMF07XG4gIHZhciB5ID0gYlsxXSAtIGFbMV07XG4gIHZhciB6ID0gYlsyXSAtIGFbMl07XG4gIHJldHVybiBNYXRoLmh5cG90KHgsIHksIHopO1xufVxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBzcXVhcmVkIGV1Y2xpZGlhbiBkaXN0YW5jZSBiZXR3ZWVuIHR3byB2ZWMzJ3NcbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBzcXVhcmVkIGRpc3RhbmNlIGJldHdlZW4gYSBhbmQgYlxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzcXVhcmVkRGlzdGFuY2UoYSwgYikge1xuICB2YXIgeCA9IGJbMF0gLSBhWzBdO1xuICB2YXIgeSA9IGJbMV0gLSBhWzFdO1xuICB2YXIgeiA9IGJbMl0gLSBhWzJdO1xuICByZXR1cm4geCAqIHggKyB5ICogeSArIHogKiB6O1xufVxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBzcXVhcmVkIGxlbmd0aCBvZiBhIHZlYzNcbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB2ZWN0b3IgdG8gY2FsY3VsYXRlIHNxdWFyZWQgbGVuZ3RoIG9mXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBzcXVhcmVkIGxlbmd0aCBvZiBhXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNxdWFyZWRMZW5ndGgoYSkge1xuICB2YXIgeCA9IGFbMF07XG4gIHZhciB5ID0gYVsxXTtcbiAgdmFyIHogPSBhWzJdO1xuICByZXR1cm4geCAqIHggKyB5ICogeSArIHogKiB6O1xufVxuLyoqXG4gKiBOZWdhdGVzIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjM1xuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB2ZWN0b3IgdG8gbmVnYXRlXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG5lZ2F0ZShvdXQsIGEpIHtcbiAgb3V0WzBdID0gLWFbMF07XG4gIG91dFsxXSA9IC1hWzFdO1xuICBvdXRbMl0gPSAtYVsyXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogUmV0dXJucyB0aGUgaW52ZXJzZSBvZiB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzNcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdmVjdG9yIHRvIGludmVydFxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBpbnZlcnNlKG91dCwgYSkge1xuICBvdXRbMF0gPSAxLjAgLyBhWzBdO1xuICBvdXRbMV0gPSAxLjAgLyBhWzFdO1xuICBvdXRbMl0gPSAxLjAgLyBhWzJdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBOb3JtYWxpemUgYSB2ZWMzXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHZlY3RvciB0byBub3JtYWxpemVcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplKG91dCwgYSkge1xuICB2YXIgeCA9IGFbMF07XG4gIHZhciB5ID0gYVsxXTtcbiAgdmFyIHogPSBhWzJdO1xuICB2YXIgbGVuID0geCAqIHggKyB5ICogeSArIHogKiB6O1xuXG4gIGlmIChsZW4gPiAwKSB7XG4gICAgLy9UT0RPOiBldmFsdWF0ZSB1c2Ugb2YgZ2xtX2ludnNxcnQgaGVyZT9cbiAgICBsZW4gPSAxIC8gTWF0aC5zcXJ0KGxlbik7XG4gIH1cblxuICBvdXRbMF0gPSBhWzBdICogbGVuO1xuICBvdXRbMV0gPSBhWzFdICogbGVuO1xuICBvdXRbMl0gPSBhWzJdICogbGVuO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBkb3QgcHJvZHVjdCBvZiB0d28gdmVjMydzXG4gKlxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge051bWJlcn0gZG90IHByb2R1Y3Qgb2YgYSBhbmQgYlxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBkb3QoYSwgYikge1xuICByZXR1cm4gYVswXSAqIGJbMF0gKyBhWzFdICogYlsxXSArIGFbMl0gKiBiWzJdO1xufVxuLyoqXG4gKiBDb21wdXRlcyB0aGUgY3Jvc3MgcHJvZHVjdCBvZiB0d28gdmVjMydzXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY3Jvc3Mob3V0LCBhLCBiKSB7XG4gIHZhciBheCA9IGFbMF0sXG4gICAgICBheSA9IGFbMV0sXG4gICAgICBheiA9IGFbMl07XG4gIHZhciBieCA9IGJbMF0sXG4gICAgICBieSA9IGJbMV0sXG4gICAgICBieiA9IGJbMl07XG4gIG91dFswXSA9IGF5ICogYnogLSBheiAqIGJ5O1xuICBvdXRbMV0gPSBheiAqIGJ4IC0gYXggKiBiejtcbiAgb3V0WzJdID0gYXggKiBieSAtIGF5ICogYng7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFBlcmZvcm1zIGEgbGluZWFyIGludGVycG9sYXRpb24gYmV0d2VlbiB0d28gdmVjMydzXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEBwYXJhbSB7TnVtYmVyfSB0IGludGVycG9sYXRpb24gYW1vdW50LCBpbiB0aGUgcmFuZ2UgWzAtMV0sIGJldHdlZW4gdGhlIHR3byBpbnB1dHNcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbGVycChvdXQsIGEsIGIsIHQpIHtcbiAgdmFyIGF4ID0gYVswXTtcbiAgdmFyIGF5ID0gYVsxXTtcbiAgdmFyIGF6ID0gYVsyXTtcbiAgb3V0WzBdID0gYXggKyB0ICogKGJbMF0gLSBheCk7XG4gIG91dFsxXSA9IGF5ICsgdCAqIChiWzFdIC0gYXkpO1xuICBvdXRbMl0gPSBheiArIHQgKiAoYlsyXSAtIGF6KTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogUGVyZm9ybXMgYSBoZXJtaXRlIGludGVycG9sYXRpb24gd2l0aCB0d28gY29udHJvbCBwb2ludHNcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGMgdGhlIHRoaXJkIG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBkIHRoZSBmb3VydGggb3BlcmFuZFxuICogQHBhcmFtIHtOdW1iZXJ9IHQgaW50ZXJwb2xhdGlvbiBhbW91bnQsIGluIHRoZSByYW5nZSBbMC0xXSwgYmV0d2VlbiB0aGUgdHdvIGlucHV0c1xuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBoZXJtaXRlKG91dCwgYSwgYiwgYywgZCwgdCkge1xuICB2YXIgZmFjdG9yVGltZXMyID0gdCAqIHQ7XG4gIHZhciBmYWN0b3IxID0gZmFjdG9yVGltZXMyICogKDIgKiB0IC0gMykgKyAxO1xuICB2YXIgZmFjdG9yMiA9IGZhY3RvclRpbWVzMiAqICh0IC0gMikgKyB0O1xuICB2YXIgZmFjdG9yMyA9IGZhY3RvclRpbWVzMiAqICh0IC0gMSk7XG4gIHZhciBmYWN0b3I0ID0gZmFjdG9yVGltZXMyICogKDMgLSAyICogdCk7XG4gIG91dFswXSA9IGFbMF0gKiBmYWN0b3IxICsgYlswXSAqIGZhY3RvcjIgKyBjWzBdICogZmFjdG9yMyArIGRbMF0gKiBmYWN0b3I0O1xuICBvdXRbMV0gPSBhWzFdICogZmFjdG9yMSArIGJbMV0gKiBmYWN0b3IyICsgY1sxXSAqIGZhY3RvcjMgKyBkWzFdICogZmFjdG9yNDtcbiAgb3V0WzJdID0gYVsyXSAqIGZhY3RvcjEgKyBiWzJdICogZmFjdG9yMiArIGNbMl0gKiBmYWN0b3IzICsgZFsyXSAqIGZhY3RvcjQ7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFBlcmZvcm1zIGEgYmV6aWVyIGludGVycG9sYXRpb24gd2l0aCB0d28gY29udHJvbCBwb2ludHNcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGMgdGhlIHRoaXJkIG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBkIHRoZSBmb3VydGggb3BlcmFuZFxuICogQHBhcmFtIHtOdW1iZXJ9IHQgaW50ZXJwb2xhdGlvbiBhbW91bnQsIGluIHRoZSByYW5nZSBbMC0xXSwgYmV0d2VlbiB0aGUgdHdvIGlucHV0c1xuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBiZXppZXIob3V0LCBhLCBiLCBjLCBkLCB0KSB7XG4gIHZhciBpbnZlcnNlRmFjdG9yID0gMSAtIHQ7XG4gIHZhciBpbnZlcnNlRmFjdG9yVGltZXNUd28gPSBpbnZlcnNlRmFjdG9yICogaW52ZXJzZUZhY3RvcjtcbiAgdmFyIGZhY3RvclRpbWVzMiA9IHQgKiB0O1xuICB2YXIgZmFjdG9yMSA9IGludmVyc2VGYWN0b3JUaW1lc1R3byAqIGludmVyc2VGYWN0b3I7XG4gIHZhciBmYWN0b3IyID0gMyAqIHQgKiBpbnZlcnNlRmFjdG9yVGltZXNUd287XG4gIHZhciBmYWN0b3IzID0gMyAqIGZhY3RvclRpbWVzMiAqIGludmVyc2VGYWN0b3I7XG4gIHZhciBmYWN0b3I0ID0gZmFjdG9yVGltZXMyICogdDtcbiAgb3V0WzBdID0gYVswXSAqIGZhY3RvcjEgKyBiWzBdICogZmFjdG9yMiArIGNbMF0gKiBmYWN0b3IzICsgZFswXSAqIGZhY3RvcjQ7XG4gIG91dFsxXSA9IGFbMV0gKiBmYWN0b3IxICsgYlsxXSAqIGZhY3RvcjIgKyBjWzFdICogZmFjdG9yMyArIGRbMV0gKiBmYWN0b3I0O1xuICBvdXRbMl0gPSBhWzJdICogZmFjdG9yMSArIGJbMl0gKiBmYWN0b3IyICsgY1syXSAqIGZhY3RvcjMgKyBkWzJdICogZmFjdG9yNDtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogR2VuZXJhdGVzIGEgcmFuZG9tIHZlY3RvciB3aXRoIHRoZSBnaXZlbiBzY2FsZVxuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge051bWJlcn0gW3NjYWxlXSBMZW5ndGggb2YgdGhlIHJlc3VsdGluZyB2ZWN0b3IuIElmIG9tbWl0dGVkLCBhIHVuaXQgdmVjdG9yIHdpbGwgYmUgcmV0dXJuZWRcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcmFuZG9tKG91dCwgc2NhbGUpIHtcbiAgc2NhbGUgPSBzY2FsZSB8fCAxLjA7XG4gIHZhciByID0gZ2xNYXRyaXguUkFORE9NKCkgKiAyLjAgKiBNYXRoLlBJO1xuICB2YXIgeiA9IGdsTWF0cml4LlJBTkRPTSgpICogMi4wIC0gMS4wO1xuICB2YXIgelNjYWxlID0gTWF0aC5zcXJ0KDEuMCAtIHogKiB6KSAqIHNjYWxlO1xuICBvdXRbMF0gPSBNYXRoLmNvcyhyKSAqIHpTY2FsZTtcbiAgb3V0WzFdID0gTWF0aC5zaW4ocikgKiB6U2NhbGU7XG4gIG91dFsyXSA9IHogKiBzY2FsZTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogVHJhbnNmb3JtcyB0aGUgdmVjMyB3aXRoIGEgbWF0NC5cbiAqIDR0aCB2ZWN0b3IgY29tcG9uZW50IGlzIGltcGxpY2l0bHkgJzEnXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHRoZSB2ZWN0b3IgdG8gdHJhbnNmb3JtXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gbSBtYXRyaXggdG8gdHJhbnNmb3JtIHdpdGhcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNmb3JtTWF0NChvdXQsIGEsIG0pIHtcbiAgdmFyIHggPSBhWzBdLFxuICAgICAgeSA9IGFbMV0sXG4gICAgICB6ID0gYVsyXTtcbiAgdmFyIHcgPSBtWzNdICogeCArIG1bN10gKiB5ICsgbVsxMV0gKiB6ICsgbVsxNV07XG4gIHcgPSB3IHx8IDEuMDtcbiAgb3V0WzBdID0gKG1bMF0gKiB4ICsgbVs0XSAqIHkgKyBtWzhdICogeiArIG1bMTJdKSAvIHc7XG4gIG91dFsxXSA9IChtWzFdICogeCArIG1bNV0gKiB5ICsgbVs5XSAqIHogKyBtWzEzXSkgLyB3O1xuICBvdXRbMl0gPSAobVsyXSAqIHggKyBtWzZdICogeSArIG1bMTBdICogeiArIG1bMTRdKSAvIHc7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFRyYW5zZm9ybXMgdGhlIHZlYzMgd2l0aCBhIG1hdDMuXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHRoZSB2ZWN0b3IgdG8gdHJhbnNmb3JtXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0M30gbSB0aGUgM3gzIG1hdHJpeCB0byB0cmFuc2Zvcm0gd2l0aFxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1NYXQzKG91dCwgYSwgbSkge1xuICB2YXIgeCA9IGFbMF0sXG4gICAgICB5ID0gYVsxXSxcbiAgICAgIHogPSBhWzJdO1xuICBvdXRbMF0gPSB4ICogbVswXSArIHkgKiBtWzNdICsgeiAqIG1bNl07XG4gIG91dFsxXSA9IHggKiBtWzFdICsgeSAqIG1bNF0gKyB6ICogbVs3XTtcbiAgb3V0WzJdID0geCAqIG1bMl0gKyB5ICogbVs1XSArIHogKiBtWzhdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBUcmFuc2Zvcm1zIHRoZSB2ZWMzIHdpdGggYSBxdWF0XG4gKiBDYW4gYWxzbyBiZSB1c2VkIGZvciBkdWFsIHF1YXRlcm5pb25zLiAoTXVsdGlwbHkgaXQgd2l0aCB0aGUgcmVhbCBwYXJ0KVxuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB0aGUgdmVjdG9yIHRvIHRyYW5zZm9ybVxuICogQHBhcmFtIHtSZWFkb25seVF1YXR9IHEgcXVhdGVybmlvbiB0byB0cmFuc2Zvcm0gd2l0aFxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1RdWF0KG91dCwgYSwgcSkge1xuICAvLyBiZW5jaG1hcmtzOiBodHRwczovL2pzcGVyZi5jb20vcXVhdGVybmlvbi10cmFuc2Zvcm0tdmVjMy1pbXBsZW1lbnRhdGlvbnMtZml4ZWRcbiAgdmFyIHF4ID0gcVswXSxcbiAgICAgIHF5ID0gcVsxXSxcbiAgICAgIHF6ID0gcVsyXSxcbiAgICAgIHF3ID0gcVszXTtcbiAgdmFyIHggPSBhWzBdLFxuICAgICAgeSA9IGFbMV0sXG4gICAgICB6ID0gYVsyXTsgLy8gdmFyIHF2ZWMgPSBbcXgsIHF5LCBxel07XG4gIC8vIHZhciB1diA9IHZlYzMuY3Jvc3MoW10sIHF2ZWMsIGEpO1xuXG4gIHZhciB1dnggPSBxeSAqIHogLSBxeiAqIHksXG4gICAgICB1dnkgPSBxeiAqIHggLSBxeCAqIHosXG4gICAgICB1dnogPSBxeCAqIHkgLSBxeSAqIHg7IC8vIHZhciB1dXYgPSB2ZWMzLmNyb3NzKFtdLCBxdmVjLCB1dik7XG5cbiAgdmFyIHV1dnggPSBxeSAqIHV2eiAtIHF6ICogdXZ5LFxuICAgICAgdXV2eSA9IHF6ICogdXZ4IC0gcXggKiB1dnosXG4gICAgICB1dXZ6ID0gcXggKiB1dnkgLSBxeSAqIHV2eDsgLy8gdmVjMy5zY2FsZSh1diwgdXYsIDIgKiB3KTtcblxuICB2YXIgdzIgPSBxdyAqIDI7XG4gIHV2eCAqPSB3MjtcbiAgdXZ5ICo9IHcyO1xuICB1dnogKj0gdzI7IC8vIHZlYzMuc2NhbGUodXV2LCB1dXYsIDIpO1xuXG4gIHV1dnggKj0gMjtcbiAgdXV2eSAqPSAyO1xuICB1dXZ6ICo9IDI7IC8vIHJldHVybiB2ZWMzLmFkZChvdXQsIGEsIHZlYzMuYWRkKG91dCwgdXYsIHV1dikpO1xuXG4gIG91dFswXSA9IHggKyB1dnggKyB1dXZ4O1xuICBvdXRbMV0gPSB5ICsgdXZ5ICsgdXV2eTtcbiAgb3V0WzJdID0geiArIHV2eiArIHV1dno7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFJvdGF0ZSBhIDNEIHZlY3RvciBhcm91bmQgdGhlIHgtYXhpc1xuICogQHBhcmFtIHt2ZWMzfSBvdXQgVGhlIHJlY2VpdmluZyB2ZWMzXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSBUaGUgdmVjMyBwb2ludCB0byByb3RhdGVcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBiIFRoZSBvcmlnaW4gb2YgdGhlIHJvdGF0aW9uXG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIFRoZSBhbmdsZSBvZiByb3RhdGlvbiBpbiByYWRpYW5zXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJvdGF0ZVgob3V0LCBhLCBiLCByYWQpIHtcbiAgdmFyIHAgPSBbXSxcbiAgICAgIHIgPSBbXTsgLy9UcmFuc2xhdGUgcG9pbnQgdG8gdGhlIG9yaWdpblxuXG4gIHBbMF0gPSBhWzBdIC0gYlswXTtcbiAgcFsxXSA9IGFbMV0gLSBiWzFdO1xuICBwWzJdID0gYVsyXSAtIGJbMl07IC8vcGVyZm9ybSByb3RhdGlvblxuXG4gIHJbMF0gPSBwWzBdO1xuICByWzFdID0gcFsxXSAqIE1hdGguY29zKHJhZCkgLSBwWzJdICogTWF0aC5zaW4ocmFkKTtcbiAgclsyXSA9IHBbMV0gKiBNYXRoLnNpbihyYWQpICsgcFsyXSAqIE1hdGguY29zKHJhZCk7IC8vdHJhbnNsYXRlIHRvIGNvcnJlY3QgcG9zaXRpb25cblxuICBvdXRbMF0gPSByWzBdICsgYlswXTtcbiAgb3V0WzFdID0gclsxXSArIGJbMV07XG4gIG91dFsyXSA9IHJbMl0gKyBiWzJdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBSb3RhdGUgYSAzRCB2ZWN0b3IgYXJvdW5kIHRoZSB5LWF4aXNcbiAqIEBwYXJhbSB7dmVjM30gb3V0IFRoZSByZWNlaXZpbmcgdmVjM1xuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgVGhlIHZlYzMgcG9pbnQgdG8gcm90YXRlXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiBUaGUgb3JpZ2luIG9mIHRoZSByb3RhdGlvblxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCBUaGUgYW5nbGUgb2Ygcm90YXRpb24gaW4gcmFkaWFuc1xuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByb3RhdGVZKG91dCwgYSwgYiwgcmFkKSB7XG4gIHZhciBwID0gW10sXG4gICAgICByID0gW107IC8vVHJhbnNsYXRlIHBvaW50IHRvIHRoZSBvcmlnaW5cblxuICBwWzBdID0gYVswXSAtIGJbMF07XG4gIHBbMV0gPSBhWzFdIC0gYlsxXTtcbiAgcFsyXSA9IGFbMl0gLSBiWzJdOyAvL3BlcmZvcm0gcm90YXRpb25cblxuICByWzBdID0gcFsyXSAqIE1hdGguc2luKHJhZCkgKyBwWzBdICogTWF0aC5jb3MocmFkKTtcbiAgclsxXSA9IHBbMV07XG4gIHJbMl0gPSBwWzJdICogTWF0aC5jb3MocmFkKSAtIHBbMF0gKiBNYXRoLnNpbihyYWQpOyAvL3RyYW5zbGF0ZSB0byBjb3JyZWN0IHBvc2l0aW9uXG5cbiAgb3V0WzBdID0gclswXSArIGJbMF07XG4gIG91dFsxXSA9IHJbMV0gKyBiWzFdO1xuICBvdXRbMl0gPSByWzJdICsgYlsyXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogUm90YXRlIGEgM0QgdmVjdG9yIGFyb3VuZCB0aGUgei1heGlzXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCBUaGUgcmVjZWl2aW5nIHZlYzNcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIFRoZSB2ZWMzIHBvaW50IHRvIHJvdGF0ZVxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGIgVGhlIG9yaWdpbiBvZiB0aGUgcm90YXRpb25cbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgVGhlIGFuZ2xlIG9mIHJvdGF0aW9uIGluIHJhZGlhbnNcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcm90YXRlWihvdXQsIGEsIGIsIHJhZCkge1xuICB2YXIgcCA9IFtdLFxuICAgICAgciA9IFtdOyAvL1RyYW5zbGF0ZSBwb2ludCB0byB0aGUgb3JpZ2luXG5cbiAgcFswXSA9IGFbMF0gLSBiWzBdO1xuICBwWzFdID0gYVsxXSAtIGJbMV07XG4gIHBbMl0gPSBhWzJdIC0gYlsyXTsgLy9wZXJmb3JtIHJvdGF0aW9uXG5cbiAgclswXSA9IHBbMF0gKiBNYXRoLmNvcyhyYWQpIC0gcFsxXSAqIE1hdGguc2luKHJhZCk7XG4gIHJbMV0gPSBwWzBdICogTWF0aC5zaW4ocmFkKSArIHBbMV0gKiBNYXRoLmNvcyhyYWQpO1xuICByWzJdID0gcFsyXTsgLy90cmFuc2xhdGUgdG8gY29ycmVjdCBwb3NpdGlvblxuXG4gIG91dFswXSA9IHJbMF0gKyBiWzBdO1xuICBvdXRbMV0gPSByWzFdICsgYlsxXTtcbiAgb3V0WzJdID0gclsyXSArIGJbMl07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIEdldCB0aGUgYW5nbGUgYmV0d2VlbiB0d28gM0QgdmVjdG9yc1xuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgVGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBiIFRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge051bWJlcn0gVGhlIGFuZ2xlIGluIHJhZGlhbnNcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gYW5nbGUoYSwgYikge1xuICB2YXIgYXggPSBhWzBdLFxuICAgICAgYXkgPSBhWzFdLFxuICAgICAgYXogPSBhWzJdLFxuICAgICAgYnggPSBiWzBdLFxuICAgICAgYnkgPSBiWzFdLFxuICAgICAgYnogPSBiWzJdLFxuICAgICAgbWFnMSA9IE1hdGguc3FydChheCAqIGF4ICsgYXkgKiBheSArIGF6ICogYXopLFxuICAgICAgbWFnMiA9IE1hdGguc3FydChieCAqIGJ4ICsgYnkgKiBieSArIGJ6ICogYnopLFxuICAgICAgbWFnID0gbWFnMSAqIG1hZzIsXG4gICAgICBjb3NpbmUgPSBtYWcgJiYgZG90KGEsIGIpIC8gbWFnO1xuICByZXR1cm4gTWF0aC5hY29zKE1hdGgubWluKE1hdGgubWF4KGNvc2luZSwgLTEpLCAxKSk7XG59XG4vKipcbiAqIFNldCB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzMgdG8gemVyb1xuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHplcm8ob3V0KSB7XG4gIG91dFswXSA9IDAuMDtcbiAgb3V0WzFdID0gMC4wO1xuICBvdXRbMl0gPSAwLjA7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSB2ZWN0b3JcbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB2ZWN0b3IgdG8gcmVwcmVzZW50IGFzIGEgc3RyaW5nXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHZlY3RvclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzdHIoYSkge1xuICByZXR1cm4gXCJ2ZWMzKFwiICsgYVswXSArIFwiLCBcIiArIGFbMV0gKyBcIiwgXCIgKyBhWzJdICsgXCIpXCI7XG59XG4vKipcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHZlY3RvcnMgaGF2ZSBleGFjdGx5IHRoZSBzYW1lIGVsZW1lbnRzIGluIHRoZSBzYW1lIHBvc2l0aW9uICh3aGVuIGNvbXBhcmVkIHdpdGggPT09KVxuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIFRoZSBmaXJzdCB2ZWN0b3IuXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiBUaGUgc2Vjb25kIHZlY3Rvci5cbiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSB2ZWN0b3JzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBleGFjdEVxdWFscyhhLCBiKSB7XG4gIHJldHVybiBhWzBdID09PSBiWzBdICYmIGFbMV0gPT09IGJbMV0gJiYgYVsyXSA9PT0gYlsyXTtcbn1cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgdmVjdG9ycyBoYXZlIGFwcHJveGltYXRlbHkgdGhlIHNhbWUgZWxlbWVudHMgaW4gdGhlIHNhbWUgcG9zaXRpb24uXG4gKlxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgVGhlIGZpcnN0IHZlY3Rvci5cbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBiIFRoZSBzZWNvbmQgdmVjdG9yLlxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZlY3RvcnMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGVxdWFscyhhLCBiKSB7XG4gIHZhciBhMCA9IGFbMF0sXG4gICAgICBhMSA9IGFbMV0sXG4gICAgICBhMiA9IGFbMl07XG4gIHZhciBiMCA9IGJbMF0sXG4gICAgICBiMSA9IGJbMV0sXG4gICAgICBiMiA9IGJbMl07XG4gIHJldHVybiBNYXRoLmFicyhhMCAtIGIwKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMCksIE1hdGguYWJzKGIwKSkgJiYgTWF0aC5hYnMoYTEgLSBiMSkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTEpLCBNYXRoLmFicyhiMSkpICYmIE1hdGguYWJzKGEyIC0gYjIpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEyKSwgTWF0aC5hYnMoYjIpKTtcbn1cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMzLnN1YnRyYWN0fVxuICogQGZ1bmN0aW9uXG4gKi9cblxuZXhwb3J0IHZhciBzdWIgPSBzdWJ0cmFjdDtcbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMzLm11bHRpcGx5fVxuICogQGZ1bmN0aW9uXG4gKi9cblxuZXhwb3J0IHZhciBtdWwgPSBtdWx0aXBseTtcbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMzLmRpdmlkZX1cbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCB2YXIgZGl2ID0gZGl2aWRlO1xuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzMuZGlzdGFuY2V9XG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgdmFyIGRpc3QgPSBkaXN0YW5jZTtcbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMzLnNxdWFyZWREaXN0YW5jZX1cbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCB2YXIgc3FyRGlzdCA9IHNxdWFyZWREaXN0YW5jZTtcbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMzLmxlbmd0aH1cbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCB2YXIgbGVuID0gbGVuZ3RoO1xuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzMuc3F1YXJlZExlbmd0aH1cbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCB2YXIgc3FyTGVuID0gc3F1YXJlZExlbmd0aDtcbi8qKlxuICogUGVyZm9ybSBzb21lIG9wZXJhdGlvbiBvdmVyIGFuIGFycmF5IG9mIHZlYzNzLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IGEgdGhlIGFycmF5IG9mIHZlY3RvcnMgdG8gaXRlcmF0ZSBvdmVyXG4gKiBAcGFyYW0ge051bWJlcn0gc3RyaWRlIE51bWJlciBvZiBlbGVtZW50cyBiZXR3ZWVuIHRoZSBzdGFydCBvZiBlYWNoIHZlYzMuIElmIDAgYXNzdW1lcyB0aWdodGx5IHBhY2tlZFxuICogQHBhcmFtIHtOdW1iZXJ9IG9mZnNldCBOdW1iZXIgb2YgZWxlbWVudHMgdG8gc2tpcCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhcnJheVxuICogQHBhcmFtIHtOdW1iZXJ9IGNvdW50IE51bWJlciBvZiB2ZWMzcyB0byBpdGVyYXRlIG92ZXIuIElmIDAgaXRlcmF0ZXMgb3ZlciBlbnRpcmUgYXJyYXlcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIEZ1bmN0aW9uIHRvIGNhbGwgZm9yIGVhY2ggdmVjdG9yIGluIHRoZSBhcnJheVxuICogQHBhcmFtIHtPYmplY3R9IFthcmddIGFkZGl0aW9uYWwgYXJndW1lbnQgdG8gcGFzcyB0byBmblxuICogQHJldHVybnMge0FycmF5fSBhXG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgdmFyIGZvckVhY2ggPSBmdW5jdGlvbiAoKSB7XG4gIHZhciB2ZWMgPSBjcmVhdGUoKTtcbiAgcmV0dXJuIGZ1bmN0aW9uIChhLCBzdHJpZGUsIG9mZnNldCwgY291bnQsIGZuLCBhcmcpIHtcbiAgICB2YXIgaSwgbDtcblxuICAgIGlmICghc3RyaWRlKSB7XG4gICAgICBzdHJpZGUgPSAzO1xuICAgIH1cblxuICAgIGlmICghb2Zmc2V0KSB7XG4gICAgICBvZmZzZXQgPSAwO1xuICAgIH1cblxuICAgIGlmIChjb3VudCkge1xuICAgICAgbCA9IE1hdGgubWluKGNvdW50ICogc3RyaWRlICsgb2Zmc2V0LCBhLmxlbmd0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGwgPSBhLmxlbmd0aDtcbiAgICB9XG5cbiAgICBmb3IgKGkgPSBvZmZzZXQ7IGkgPCBsOyBpICs9IHN0cmlkZSkge1xuICAgICAgdmVjWzBdID0gYVtpXTtcbiAgICAgIHZlY1sxXSA9IGFbaSArIDFdO1xuICAgICAgdmVjWzJdID0gYVtpICsgMl07XG4gICAgICBmbih2ZWMsIHZlYywgYXJnKTtcbiAgICAgIGFbaV0gPSB2ZWNbMF07XG4gICAgICBhW2kgKyAxXSA9IHZlY1sxXTtcbiAgICAgIGFbaSArIDJdID0gdmVjWzJdO1xuICAgIH1cblxuICAgIHJldHVybiBhO1xuICB9O1xufSgpOyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///39\n')},function(module,exports,__webpack_require__){"use strict";eval('\nObject.defineProperty(exports, "__esModule", { value: true });\nexports.STACK_OVERFLOW = exports.CIRCULAR_DEPENDENCY_IN_FACTORY = exports.POST_CONSTRUCT_ERROR = exports.MULTIPLE_POST_CONSTRUCT_METHODS = exports.CONTAINER_OPTIONS_INVALID_SKIP_BASE_CHECK = exports.CONTAINER_OPTIONS_INVALID_AUTO_BIND_INJECTABLE = exports.CONTAINER_OPTIONS_INVALID_DEFAULT_SCOPE = exports.CONTAINER_OPTIONS_MUST_BE_AN_OBJECT = exports.ARGUMENTS_LENGTH_MISMATCH = exports.INVALID_DECORATOR_OPERATION = exports.INVALID_TO_SELF_VALUE = exports.INVALID_FUNCTION_BINDING = exports.INVALID_MIDDLEWARE_RETURN = exports.NO_MORE_SNAPSHOTS_AVAILABLE = exports.INVALID_BINDING_TYPE = exports.NOT_IMPLEMENTED = exports.CIRCULAR_DEPENDENCY = exports.UNDEFINED_INJECT_ANNOTATION = exports.MISSING_INJECT_ANNOTATION = exports.MISSING_INJECTABLE_ANNOTATION = exports.NOT_REGISTERED = exports.CANNOT_UNBIND = exports.AMBIGUOUS_MATCH = exports.KEY_NOT_FOUND = exports.NULL_ARGUMENT = exports.DUPLICATED_METADATA = exports.DUPLICATED_INJECTABLE_DECORATOR = void 0;\nexports.DUPLICATED_INJECTABLE_DECORATOR = "Cannot apply @injectable decorator multiple times.";\nexports.DUPLICATED_METADATA = "Metadata key was used more than once in a parameter:";\nexports.NULL_ARGUMENT = "NULL argument";\nexports.KEY_NOT_FOUND = "Key Not Found";\nexports.AMBIGUOUS_MATCH = "Ambiguous match found for serviceIdentifier:";\nexports.CANNOT_UNBIND = "Could not unbind serviceIdentifier:";\nexports.NOT_REGISTERED = "No matching bindings found for serviceIdentifier:";\nexports.MISSING_INJECTABLE_ANNOTATION = "Missing required @injectable annotation in:";\nexports.MISSING_INJECT_ANNOTATION = "Missing required @inject or @multiInject annotation in:";\nvar UNDEFINED_INJECT_ANNOTATION = function (name) {\n return "@inject called with undefined this could mean that the class " + name + " has " +\n "a circular dependency problem. You can use a LazyServiceIdentifer to " +\n "overcome this limitation.";\n};\nexports.UNDEFINED_INJECT_ANNOTATION = UNDEFINED_INJECT_ANNOTATION;\nexports.CIRCULAR_DEPENDENCY = "Circular dependency found:";\nexports.NOT_IMPLEMENTED = "Sorry, this feature is not fully implemented yet.";\nexports.INVALID_BINDING_TYPE = "Invalid binding type:";\nexports.NO_MORE_SNAPSHOTS_AVAILABLE = "No snapshot available to restore.";\nexports.INVALID_MIDDLEWARE_RETURN = "Invalid return type in middleware. Middleware must return!";\nexports.INVALID_FUNCTION_BINDING = "Value provided to function binding must be a function!";\nexports.INVALID_TO_SELF_VALUE = "The toSelf function can only be applied when a constructor is " +\n "used as service identifier";\nexports.INVALID_DECORATOR_OPERATION = "The @inject @multiInject @tagged and @named decorators " +\n "must be applied to the parameters of a class constructor or a class property.";\nvar ARGUMENTS_LENGTH_MISMATCH = function () {\n var values = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n values[_i] = arguments[_i];\n }\n return "The number of constructor arguments in the derived class " +\n (values[0] + " must be >= than the number of constructor arguments of its base class.");\n};\nexports.ARGUMENTS_LENGTH_MISMATCH = ARGUMENTS_LENGTH_MISMATCH;\nexports.CONTAINER_OPTIONS_MUST_BE_AN_OBJECT = "Invalid Container constructor argument. Container options " +\n "must be an object.";\nexports.CONTAINER_OPTIONS_INVALID_DEFAULT_SCOPE = "Invalid Container option. Default scope must " +\n "be a string (\'singleton\' or \'transient\').";\nexports.CONTAINER_OPTIONS_INVALID_AUTO_BIND_INJECTABLE = "Invalid Container option. Auto bind injectable must " +\n "be a boolean";\nexports.CONTAINER_OPTIONS_INVALID_SKIP_BASE_CHECK = "Invalid Container option. Skip base check must " +\n "be a boolean";\nexports.MULTIPLE_POST_CONSTRUCT_METHODS = "Cannot apply @postConstruct decorator multiple times in the same class";\nvar POST_CONSTRUCT_ERROR = function () {\n var values = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n values[_i] = arguments[_i];\n }\n return "@postConstruct error in class " + values[0] + ": " + values[1];\n};\nexports.POST_CONSTRUCT_ERROR = POST_CONSTRUCT_ERROR;\nvar CIRCULAR_DEPENDENCY_IN_FACTORY = function () {\n var values = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n values[_i] = arguments[_i];\n }\n return "It looks like there is a circular dependency " +\n ("in one of the \'" + values[0] + "\' bindings. Please investigate bindings with") +\n ("service identifier \'" + values[1] + "\'.");\n};\nexports.CIRCULAR_DEPENDENCY_IN_FACTORY = CIRCULAR_DEPENDENCY_IN_FACTORY;\nexports.STACK_OVERFLOW = "Maximum call stack size exceeded";\n//# sourceMappingURL=error_msgs.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaW52ZXJzaWZ5L2xpYi9jb25zdGFudHMvZXJyb3JfbXNncy5qcz8zMGUzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFhO0FBQ2IsOENBQThDLGNBQWM7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsdUJBQXVCO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsdUJBQXVCO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLHVCQUF1QjtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiNDAuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuU1RBQ0tfT1ZFUkZMT1cgPSBleHBvcnRzLkNJUkNVTEFSX0RFUEVOREVOQ1lfSU5fRkFDVE9SWSA9IGV4cG9ydHMuUE9TVF9DT05TVFJVQ1RfRVJST1IgPSBleHBvcnRzLk1VTFRJUExFX1BPU1RfQ09OU1RSVUNUX01FVEhPRFMgPSBleHBvcnRzLkNPTlRBSU5FUl9PUFRJT05TX0lOVkFMSURfU0tJUF9CQVNFX0NIRUNLID0gZXhwb3J0cy5DT05UQUlORVJfT1BUSU9OU19JTlZBTElEX0FVVE9fQklORF9JTkpFQ1RBQkxFID0gZXhwb3J0cy5DT05UQUlORVJfT1BUSU9OU19JTlZBTElEX0RFRkFVTFRfU0NPUEUgPSBleHBvcnRzLkNPTlRBSU5FUl9PUFRJT05TX01VU1RfQkVfQU5fT0JKRUNUID0gZXhwb3J0cy5BUkdVTUVOVFNfTEVOR1RIX01JU01BVENIID0gZXhwb3J0cy5JTlZBTElEX0RFQ09SQVRPUl9PUEVSQVRJT04gPSBleHBvcnRzLklOVkFMSURfVE9fU0VMRl9WQUxVRSA9IGV4cG9ydHMuSU5WQUxJRF9GVU5DVElPTl9CSU5ESU5HID0gZXhwb3J0cy5JTlZBTElEX01JRERMRVdBUkVfUkVUVVJOID0gZXhwb3J0cy5OT19NT1JFX1NOQVBTSE9UU19BVkFJTEFCTEUgPSBleHBvcnRzLklOVkFMSURfQklORElOR19UWVBFID0gZXhwb3J0cy5OT1RfSU1QTEVNRU5URUQgPSBleHBvcnRzLkNJUkNVTEFSX0RFUEVOREVOQ1kgPSBleHBvcnRzLlVOREVGSU5FRF9JTkpFQ1RfQU5OT1RBVElPTiA9IGV4cG9ydHMuTUlTU0lOR19JTkpFQ1RfQU5OT1RBVElPTiA9IGV4cG9ydHMuTUlTU0lOR19JTkpFQ1RBQkxFX0FOTk9UQVRJT04gPSBleHBvcnRzLk5PVF9SRUdJU1RFUkVEID0gZXhwb3J0cy5DQU5OT1RfVU5CSU5EID0gZXhwb3J0cy5BTUJJR1VPVVNfTUFUQ0ggPSBleHBvcnRzLktFWV9OT1RfRk9VTkQgPSBleHBvcnRzLk5VTExfQVJHVU1FTlQgPSBleHBvcnRzLkRVUExJQ0FURURfTUVUQURBVEEgPSBleHBvcnRzLkRVUExJQ0FURURfSU5KRUNUQUJMRV9ERUNPUkFUT1IgPSB2b2lkIDA7XG5leHBvcnRzLkRVUExJQ0FURURfSU5KRUNUQUJMRV9ERUNPUkFUT1IgPSBcIkNhbm5vdCBhcHBseSBAaW5qZWN0YWJsZSBkZWNvcmF0b3IgbXVsdGlwbGUgdGltZXMuXCI7XG5leHBvcnRzLkRVUExJQ0FURURfTUVUQURBVEEgPSBcIk1ldGFkYXRhIGtleSB3YXMgdXNlZCBtb3JlIHRoYW4gb25jZSBpbiBhIHBhcmFtZXRlcjpcIjtcbmV4cG9ydHMuTlVMTF9BUkdVTUVOVCA9IFwiTlVMTCBhcmd1bWVudFwiO1xuZXhwb3J0cy5LRVlfTk9UX0ZPVU5EID0gXCJLZXkgTm90IEZvdW5kXCI7XG5leHBvcnRzLkFNQklHVU9VU19NQVRDSCA9IFwiQW1iaWd1b3VzIG1hdGNoIGZvdW5kIGZvciBzZXJ2aWNlSWRlbnRpZmllcjpcIjtcbmV4cG9ydHMuQ0FOTk9UX1VOQklORCA9IFwiQ291bGQgbm90IHVuYmluZCBzZXJ2aWNlSWRlbnRpZmllcjpcIjtcbmV4cG9ydHMuTk9UX1JFR0lTVEVSRUQgPSBcIk5vIG1hdGNoaW5nIGJpbmRpbmdzIGZvdW5kIGZvciBzZXJ2aWNlSWRlbnRpZmllcjpcIjtcbmV4cG9ydHMuTUlTU0lOR19JTkpFQ1RBQkxFX0FOTk9UQVRJT04gPSBcIk1pc3NpbmcgcmVxdWlyZWQgQGluamVjdGFibGUgYW5ub3RhdGlvbiBpbjpcIjtcbmV4cG9ydHMuTUlTU0lOR19JTkpFQ1RfQU5OT1RBVElPTiA9IFwiTWlzc2luZyByZXF1aXJlZCBAaW5qZWN0IG9yIEBtdWx0aUluamVjdCBhbm5vdGF0aW9uIGluOlwiO1xudmFyIFVOREVGSU5FRF9JTkpFQ1RfQU5OT1RBVElPTiA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgcmV0dXJuIFwiQGluamVjdCBjYWxsZWQgd2l0aCB1bmRlZmluZWQgdGhpcyBjb3VsZCBtZWFuIHRoYXQgdGhlIGNsYXNzIFwiICsgbmFtZSArIFwiIGhhcyBcIiArXG4gICAgICAgIFwiYSBjaXJjdWxhciBkZXBlbmRlbmN5IHByb2JsZW0uIFlvdSBjYW4gdXNlIGEgTGF6eVNlcnZpY2VJZGVudGlmZXIgdG8gIFwiICtcbiAgICAgICAgXCJvdmVyY29tZSB0aGlzIGxpbWl0YXRpb24uXCI7XG59O1xuZXhwb3J0cy5VTkRFRklORURfSU5KRUNUX0FOTk9UQVRJT04gPSBVTkRFRklORURfSU5KRUNUX0FOTk9UQVRJT047XG5leHBvcnRzLkNJUkNVTEFSX0RFUEVOREVOQ1kgPSBcIkNpcmN1bGFyIGRlcGVuZGVuY3kgZm91bmQ6XCI7XG5leHBvcnRzLk5PVF9JTVBMRU1FTlRFRCA9IFwiU29ycnksIHRoaXMgZmVhdHVyZSBpcyBub3QgZnVsbHkgaW1wbGVtZW50ZWQgeWV0LlwiO1xuZXhwb3J0cy5JTlZBTElEX0JJTkRJTkdfVFlQRSA9IFwiSW52YWxpZCBiaW5kaW5nIHR5cGU6XCI7XG5leHBvcnRzLk5PX01PUkVfU05BUFNIT1RTX0FWQUlMQUJMRSA9IFwiTm8gc25hcHNob3QgYXZhaWxhYmxlIHRvIHJlc3RvcmUuXCI7XG5leHBvcnRzLklOVkFMSURfTUlERExFV0FSRV9SRVRVUk4gPSBcIkludmFsaWQgcmV0dXJuIHR5cGUgaW4gbWlkZGxld2FyZS4gTWlkZGxld2FyZSBtdXN0IHJldHVybiFcIjtcbmV4cG9ydHMuSU5WQUxJRF9GVU5DVElPTl9CSU5ESU5HID0gXCJWYWx1ZSBwcm92aWRlZCB0byBmdW5jdGlvbiBiaW5kaW5nIG11c3QgYmUgYSBmdW5jdGlvbiFcIjtcbmV4cG9ydHMuSU5WQUxJRF9UT19TRUxGX1ZBTFVFID0gXCJUaGUgdG9TZWxmIGZ1bmN0aW9uIGNhbiBvbmx5IGJlIGFwcGxpZWQgd2hlbiBhIGNvbnN0cnVjdG9yIGlzIFwiICtcbiAgICBcInVzZWQgYXMgc2VydmljZSBpZGVudGlmaWVyXCI7XG5leHBvcnRzLklOVkFMSURfREVDT1JBVE9SX09QRVJBVElPTiA9IFwiVGhlIEBpbmplY3QgQG11bHRpSW5qZWN0IEB0YWdnZWQgYW5kIEBuYW1lZCBkZWNvcmF0b3JzIFwiICtcbiAgICBcIm11c3QgYmUgYXBwbGllZCB0byB0aGUgcGFyYW1ldGVycyBvZiBhIGNsYXNzIGNvbnN0cnVjdG9yIG9yIGEgY2xhc3MgcHJvcGVydHkuXCI7XG52YXIgQVJHVU1FTlRTX0xFTkdUSF9NSVNNQVRDSCA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdmFsdWVzID0gW107XG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgdmFsdWVzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgfVxuICAgIHJldHVybiBcIlRoZSBudW1iZXIgb2YgY29uc3RydWN0b3IgYXJndW1lbnRzIGluIHRoZSBkZXJpdmVkIGNsYXNzIFwiICtcbiAgICAgICAgKHZhbHVlc1swXSArIFwiIG11c3QgYmUgPj0gdGhhbiB0aGUgbnVtYmVyIG9mIGNvbnN0cnVjdG9yIGFyZ3VtZW50cyBvZiBpdHMgYmFzZSBjbGFzcy5cIik7XG59O1xuZXhwb3J0cy5BUkdVTUVOVFNfTEVOR1RIX01JU01BVENIID0gQVJHVU1FTlRTX0xFTkdUSF9NSVNNQVRDSDtcbmV4cG9ydHMuQ09OVEFJTkVSX09QVElPTlNfTVVTVF9CRV9BTl9PQkpFQ1QgPSBcIkludmFsaWQgQ29udGFpbmVyIGNvbnN0cnVjdG9yIGFyZ3VtZW50LiBDb250YWluZXIgb3B0aW9ucyBcIiArXG4gICAgXCJtdXN0IGJlIGFuIG9iamVjdC5cIjtcbmV4cG9ydHMuQ09OVEFJTkVSX09QVElPTlNfSU5WQUxJRF9ERUZBVUxUX1NDT1BFID0gXCJJbnZhbGlkIENvbnRhaW5lciBvcHRpb24uIERlZmF1bHQgc2NvcGUgbXVzdCBcIiArXG4gICAgXCJiZSBhIHN0cmluZyAoJ3NpbmdsZXRvbicgb3IgJ3RyYW5zaWVudCcpLlwiO1xuZXhwb3J0cy5DT05UQUlORVJfT1BUSU9OU19JTlZBTElEX0FVVE9fQklORF9JTkpFQ1RBQkxFID0gXCJJbnZhbGlkIENvbnRhaW5lciBvcHRpb24uIEF1dG8gYmluZCBpbmplY3RhYmxlIG11c3QgXCIgK1xuICAgIFwiYmUgYSBib29sZWFuXCI7XG5leHBvcnRzLkNPTlRBSU5FUl9PUFRJT05TX0lOVkFMSURfU0tJUF9CQVNFX0NIRUNLID0gXCJJbnZhbGlkIENvbnRhaW5lciBvcHRpb24uIFNraXAgYmFzZSBjaGVjayBtdXN0IFwiICtcbiAgICBcImJlIGEgYm9vbGVhblwiO1xuZXhwb3J0cy5NVUxUSVBMRV9QT1NUX0NPTlNUUlVDVF9NRVRIT0RTID0gXCJDYW5ub3QgYXBwbHkgQHBvc3RDb25zdHJ1Y3QgZGVjb3JhdG9yIG11bHRpcGxlIHRpbWVzIGluIHRoZSBzYW1lIGNsYXNzXCI7XG52YXIgUE9TVF9DT05TVFJVQ1RfRVJST1IgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHZhbHVlcyA9IFtdO1xuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgIHZhbHVlc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICAgIH1cbiAgICByZXR1cm4gXCJAcG9zdENvbnN0cnVjdCBlcnJvciBpbiBjbGFzcyBcIiArIHZhbHVlc1swXSArIFwiOiBcIiArIHZhbHVlc1sxXTtcbn07XG5leHBvcnRzLlBPU1RfQ09OU1RSVUNUX0VSUk9SID0gUE9TVF9DT05TVFJVQ1RfRVJST1I7XG52YXIgQ0lSQ1VMQVJfREVQRU5ERU5DWV9JTl9GQUNUT1JZID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciB2YWx1ZXMgPSBbXTtcbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICB2YWx1ZXNbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICB9XG4gICAgcmV0dXJuIFwiSXQgbG9va3MgbGlrZSB0aGVyZSBpcyBhIGNpcmN1bGFyIGRlcGVuZGVuY3kgXCIgK1xuICAgICAgICAoXCJpbiBvbmUgb2YgdGhlICdcIiArIHZhbHVlc1swXSArIFwiJyBiaW5kaW5ncy4gUGxlYXNlIGludmVzdGlnYXRlIGJpbmRpbmdzIHdpdGhcIikgK1xuICAgICAgICAoXCJzZXJ2aWNlIGlkZW50aWZpZXIgJ1wiICsgdmFsdWVzWzFdICsgXCInLlwiKTtcbn07XG5leHBvcnRzLkNJUkNVTEFSX0RFUEVOREVOQ1lfSU5fRkFDVE9SWSA9IENJUkNVTEFSX0RFUEVOREVOQ1lfSU5fRkFDVE9SWTtcbmV4cG9ydHMuU1RBQ0tfT1ZFUkZMT1cgPSBcIk1heGltdW0gY2FsbCBzdGFjayBzaXplIGV4Y2VlZGVkXCI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1lcnJvcl9tc2dzLmpzLm1hcCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///40\n')},function(module,exports){eval('function _typeof(obj) {\n "@babel/helpers - typeof";\n\n if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") {\n module.exports = _typeof = function _typeof(obj) {\n return typeof obj;\n };\n\n module.exports["default"] = module.exports, module.exports.__esModule = true;\n } else {\n module.exports = _typeof = function _typeof(obj) {\n return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;\n };\n\n module.exports["default"] = module.exports, module.exports.__esModule = true;\n }\n\n return _typeof(obj);\n}\n\nmodule.exports = _typeof;\nmodule.exports["default"] = module.exports, module.exports.__esModule = true;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy90eXBlb2YuanM/NzAzNyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSIsImZpbGUiOiI0MS5qcyIsInNvdXJjZXNDb250ZW50IjpbImZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7XG4gIFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjtcblxuICBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikge1xuICAgICAgcmV0dXJuIHR5cGVvZiBvYmo7XG4gICAgfTtcblxuICAgIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikge1xuICAgICAgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7XG4gICAgfTtcblxuICAgIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBfdHlwZW9mKG9iaik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX3R5cGVvZjtcbm1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///41\n')},function(module,exports,__webpack_require__){eval("/* global window */\n\nvar lodash;\n\nif (true) {\n try {\n lodash = {\n clone: __webpack_require__(323),\n constant: __webpack_require__(163),\n each: __webpack_require__(204),\n filter: __webpack_require__(207),\n has: __webpack_require__(218),\n isArray: __webpack_require__(31),\n isEmpty: __webpack_require__(399),\n isFunction: __webpack_require__(86),\n isUndefined: __webpack_require__(219),\n keys: __webpack_require__(59),\n map: __webpack_require__(220),\n reduce: __webpack_require__(222),\n size: __webpack_require__(402),\n transform: __webpack_require__(408),\n union: __webpack_require__(409),\n values: __webpack_require__(227)\n };\n } catch (e) {\n // continue regardless of error\n }\n}\n\nif (!lodash) {\n lodash = window._;\n}\n\nmodule.exports = lodash;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZ3JhcGhsaWIvbGliL2xvZGFzaC5qcz8zM2RlIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztBQUVBOztBQUVBLElBQUksSUFBNkI7QUFDakM7QUFDQTtBQUNBLGFBQWEsbUJBQU8sQ0FBQyxHQUFjO0FBQ25DLGdCQUFnQixtQkFBTyxDQUFDLEdBQWlCO0FBQ3pDLFlBQVksbUJBQU8sQ0FBQyxHQUFhO0FBQ2pDLGNBQWMsbUJBQU8sQ0FBQyxHQUFlO0FBQ3JDLFlBQVksbUJBQU8sQ0FBQyxHQUFZO0FBQ2hDLGVBQWUsbUJBQU8sQ0FBQyxFQUFnQjtBQUN2QyxlQUFlLG1CQUFPLENBQUMsR0FBZ0I7QUFDdkMsa0JBQWtCLG1CQUFPLENBQUMsRUFBbUI7QUFDN0MsbUJBQW1CLG1CQUFPLENBQUMsR0FBb0I7QUFDL0MsWUFBWSxtQkFBTyxDQUFDLEVBQWE7QUFDakMsV0FBVyxtQkFBTyxDQUFDLEdBQVk7QUFDL0IsY0FBYyxtQkFBTyxDQUFDLEdBQWU7QUFDckMsWUFBWSxtQkFBTyxDQUFDLEdBQWE7QUFDakMsaUJBQWlCLG1CQUFPLENBQUMsR0FBa0I7QUFDM0MsYUFBYSxtQkFBTyxDQUFDLEdBQWM7QUFDbkMsY0FBYyxtQkFBTyxDQUFDLEdBQWU7QUFDckM7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSIsImZpbGUiOiI0Mi5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGdsb2JhbCB3aW5kb3cgKi9cblxudmFyIGxvZGFzaDtcblxuaWYgKHR5cGVvZiByZXF1aXJlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgdHJ5IHtcbiAgICBsb2Rhc2ggPSB7XG4gICAgICBjbG9uZTogcmVxdWlyZShcImxvZGFzaC9jbG9uZVwiKSxcbiAgICAgIGNvbnN0YW50OiByZXF1aXJlKFwibG9kYXNoL2NvbnN0YW50XCIpLFxuICAgICAgZWFjaDogcmVxdWlyZShcImxvZGFzaC9lYWNoXCIpLFxuICAgICAgZmlsdGVyOiByZXF1aXJlKFwibG9kYXNoL2ZpbHRlclwiKSxcbiAgICAgIGhhczogIHJlcXVpcmUoXCJsb2Rhc2gvaGFzXCIpLFxuICAgICAgaXNBcnJheTogcmVxdWlyZShcImxvZGFzaC9pc0FycmF5XCIpLFxuICAgICAgaXNFbXB0eTogcmVxdWlyZShcImxvZGFzaC9pc0VtcHR5XCIpLFxuICAgICAgaXNGdW5jdGlvbjogcmVxdWlyZShcImxvZGFzaC9pc0Z1bmN0aW9uXCIpLFxuICAgICAgaXNVbmRlZmluZWQ6IHJlcXVpcmUoXCJsb2Rhc2gvaXNVbmRlZmluZWRcIiksXG4gICAgICBrZXlzOiByZXF1aXJlKFwibG9kYXNoL2tleXNcIiksXG4gICAgICBtYXA6IHJlcXVpcmUoXCJsb2Rhc2gvbWFwXCIpLFxuICAgICAgcmVkdWNlOiByZXF1aXJlKFwibG9kYXNoL3JlZHVjZVwiKSxcbiAgICAgIHNpemU6IHJlcXVpcmUoXCJsb2Rhc2gvc2l6ZVwiKSxcbiAgICAgIHRyYW5zZm9ybTogcmVxdWlyZShcImxvZGFzaC90cmFuc2Zvcm1cIiksXG4gICAgICB1bmlvbjogcmVxdWlyZShcImxvZGFzaC91bmlvblwiKSxcbiAgICAgIHZhbHVlczogcmVxdWlyZShcImxvZGFzaC92YWx1ZXNcIilcbiAgICB9O1xuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gY29udGludWUgcmVnYXJkbGVzcyBvZiBlcnJvclxuICB9XG59XG5cbmlmICghbG9kYXNoKSB7XG4gIGxvZGFzaCA9IHdpbmRvdy5fO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGxvZGFzaDtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///42\n")},function(module,exports){eval("/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n}\n\nmodule.exports = isObject;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzT2JqZWN0LmpzPzFhOGMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxFQUFFO0FBQ2IsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwiZmlsZSI6IjQzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyB0aGVcbiAqIFtsYW5ndWFnZSB0eXBlXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtZWNtYXNjcmlwdC1sYW5ndWFnZS10eXBlcylcbiAqIG9mIGBPYmplY3RgLiAoZS5nLiBhcnJheXMsIGZ1bmN0aW9ucywgb2JqZWN0cywgcmVnZXhlcywgYG5ldyBOdW1iZXIoMClgLCBhbmQgYG5ldyBTdHJpbmcoJycpYClcbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdCh7fSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QoXy5ub29wKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3QodmFsdWUpIHtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gIHJldHVybiB2YWx1ZSAhPSBudWxsICYmICh0eXBlID09ICdvYmplY3QnIHx8IHR5cGUgPT0gJ2Z1bmN0aW9uJyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNPYmplY3Q7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///43\n")},function(module,__webpack_exports__,__webpack_require__){"use strict";eval('/* unused harmony export version */\n/* harmony import */ var _shape__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(57);\n/* harmony import */ var _antv_g_base__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(21);\n/* harmony import */ var _canvas__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(280);\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Canvas", function() { return _canvas__WEBPACK_IMPORTED_MODULE_2__["a"]; });\n\n/* harmony import */ var _group__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(77);\n/* harmony import */ var _util_arc_params__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(93);\n\n\n\n\n\n\nvar version = \'0.5.12\';\n//# sourceMappingURL=index.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy1jYW52YXMvZXNtL2luZGV4LmpzPzUzYzgiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFpQztBQUNKO0FBQ2dCO0FBQ0Y7QUFDMUI7QUFDMkM7QUFDckQ7QUFDUCIsImZpbGUiOiI0NC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIFNoYXBlIGZyb20gJy4vc2hhcGUnO1xuZXhwb3J0ICogZnJvbSAnQGFudHYvZy1iYXNlJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgQ2FudmFzIH0gZnJvbSAnLi9jYW52YXMnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBHcm91cCB9IGZyb20gJy4vZ3JvdXAnO1xuZXhwb3J0IHsgU2hhcGUgfTtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgZ2V0QXJjUGFyYW1zIH0gZnJvbSAnLi91dGlsL2FyYy1wYXJhbXMnO1xuZXhwb3J0IHZhciB2ZXJzaW9uID0gJzAuNS4xMic7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///44\n')},function(module,exports,__webpack_require__){"use strict";eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.uniqueId = exports.getEdgesByNodeId = exports.getOutEdgesNodeId = exports.getNeighbors = void 0;\n\n/**\n * 获取指定节点的所有邻居\n * @param nodeId 节点 ID\n * @param edges 图中的所有边数据\n * @param type 邻居类型\n */\nvar getNeighbors = function getNeighbors(nodeId, edges, type) {\n if (edges === void 0) {\n edges = [];\n }\n\n var currentEdges = edges.filter(function (edge) {\n return edge.source === nodeId || edge.target === nodeId;\n });\n\n if (type === 'target') {\n // 当前节点为 source,它所指向的目标节点\n var neighhborsConverter_1 = function neighhborsConverter_1(edge) {\n return edge.source === nodeId;\n };\n\n return currentEdges.filter(neighhborsConverter_1).map(function (edge) {\n return edge.target;\n });\n }\n\n if (type === 'source') {\n // 当前节点为 target,它所指向的源节点\n var neighhborsConverter_2 = function neighhborsConverter_2(edge) {\n return edge.target === nodeId;\n };\n\n return currentEdges.filter(neighhborsConverter_2).map(function (edge) {\n return edge.source;\n });\n } // 若未指定 type ,则返回所有邻居\n\n\n var neighhborsConverter = function neighhborsConverter(edge) {\n return edge.source === nodeId ? edge.target : edge.source;\n };\n\n return currentEdges.map(neighhborsConverter);\n};\n/**\n * 获取指定节点的出边\n * @param nodeId 节点 ID\n * @param edges 图中的所有边数据\n */\n\n\nexports.getNeighbors = getNeighbors;\n\nvar getOutEdgesNodeId = function getOutEdgesNodeId(nodeId, edges) {\n return edges.filter(function (edge) {\n return edge.source === nodeId;\n });\n};\n/**\n * 获取指定节点的边,包括出边和入边\n * @param nodeId 节点 ID\n * @param edges 图中的所有边数据\n */\n\n\nexports.getOutEdgesNodeId = getOutEdgesNodeId;\n\nvar getEdgesByNodeId = function getEdgesByNodeId(nodeId, edges) {\n return edges.filter(function (edge) {\n return edge.source === nodeId || edge.target === nodeId;\n });\n};\n/**\n * 生成唯一的 ID,规则是序号 + 时间戳\n * @param index 序号\n */\n\n\nexports.getEdgesByNodeId = getEdgesByNodeId;\n\nvar uniqueId = function uniqueId(index) {\n if (index === void 0) {\n index = 0;\n }\n\n var random1 = (\"\" + Math.random()).split('.')[1].substr(0, 5);\n var random2 = (\"\" + Math.random()).split('.')[1].substr(0, 5);\n return index + \"-\" + random1 + random2;\n};\n\nexports.uniqueId = uniqueId;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvYWxnb3JpdGhtL2xpYi91dGlsLmpzP2RjZmUiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWI7QUFDQTtBQUNBLENBQUM7QUFDRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7OztBQUdIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwiZmlsZSI6IjQ1LmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLnVuaXF1ZUlkID0gZXhwb3J0cy5nZXRFZGdlc0J5Tm9kZUlkID0gZXhwb3J0cy5nZXRPdXRFZGdlc05vZGVJZCA9IGV4cG9ydHMuZ2V0TmVpZ2hib3JzID0gdm9pZCAwO1xuXG4vKipcbiAqIOiOt+WPluaMh+WumuiKgueCueeahOaJgOaciemCu+WxhVxuICogQHBhcmFtIG5vZGVJZCDoioLngrkgSURcbiAqIEBwYXJhbSBlZGdlcyDlm77kuK3nmoTmiYDmnInovrnmlbDmja5cbiAqIEBwYXJhbSB0eXBlIOmCu+Wxheexu+Wei1xuICovXG52YXIgZ2V0TmVpZ2hib3JzID0gZnVuY3Rpb24gZ2V0TmVpZ2hib3JzKG5vZGVJZCwgZWRnZXMsIHR5cGUpIHtcbiAgaWYgKGVkZ2VzID09PSB2b2lkIDApIHtcbiAgICBlZGdlcyA9IFtdO1xuICB9XG5cbiAgdmFyIGN1cnJlbnRFZGdlcyA9IGVkZ2VzLmZpbHRlcihmdW5jdGlvbiAoZWRnZSkge1xuICAgIHJldHVybiBlZGdlLnNvdXJjZSA9PT0gbm9kZUlkIHx8IGVkZ2UudGFyZ2V0ID09PSBub2RlSWQ7XG4gIH0pO1xuXG4gIGlmICh0eXBlID09PSAndGFyZ2V0Jykge1xuICAgIC8vIOW9k+WJjeiKgueCueS4uiBzb3VyY2XvvIzlroPmiYDmjIflkJHnmoTnm67moIfoioLngrlcbiAgICB2YXIgbmVpZ2hoYm9yc0NvbnZlcnRlcl8xID0gZnVuY3Rpb24gbmVpZ2hoYm9yc0NvbnZlcnRlcl8xKGVkZ2UpIHtcbiAgICAgIHJldHVybiBlZGdlLnNvdXJjZSA9PT0gbm9kZUlkO1xuICAgIH07XG5cbiAgICByZXR1cm4gY3VycmVudEVkZ2VzLmZpbHRlcihuZWlnaGhib3JzQ29udmVydGVyXzEpLm1hcChmdW5jdGlvbiAoZWRnZSkge1xuICAgICAgcmV0dXJuIGVkZ2UudGFyZ2V0O1xuICAgIH0pO1xuICB9XG5cbiAgaWYgKHR5cGUgPT09ICdzb3VyY2UnKSB7XG4gICAgLy8g5b2T5YmN6IqC54K55Li6IHRhcmdldO+8jOWug+aJgOaMh+WQkeeahOa6kOiKgueCuVxuICAgIHZhciBuZWlnaGhib3JzQ29udmVydGVyXzIgPSBmdW5jdGlvbiBuZWlnaGhib3JzQ29udmVydGVyXzIoZWRnZSkge1xuICAgICAgcmV0dXJuIGVkZ2UudGFyZ2V0ID09PSBub2RlSWQ7XG4gICAgfTtcblxuICAgIHJldHVybiBjdXJyZW50RWRnZXMuZmlsdGVyKG5laWdoaGJvcnNDb252ZXJ0ZXJfMikubWFwKGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgICByZXR1cm4gZWRnZS5zb3VyY2U7XG4gICAgfSk7XG4gIH0gLy8g6Iul5pyq5oyH5a6aIHR5cGUg77yM5YiZ6L+U5Zue5omA5pyJ6YK75bGFXG5cblxuICB2YXIgbmVpZ2hoYm9yc0NvbnZlcnRlciA9IGZ1bmN0aW9uIG5laWdoaGJvcnNDb252ZXJ0ZXIoZWRnZSkge1xuICAgIHJldHVybiBlZGdlLnNvdXJjZSA9PT0gbm9kZUlkID8gZWRnZS50YXJnZXQgOiBlZGdlLnNvdXJjZTtcbiAgfTtcblxuICByZXR1cm4gY3VycmVudEVkZ2VzLm1hcChuZWlnaGhib3JzQ29udmVydGVyKTtcbn07XG4vKipcbiAqIOiOt+WPluaMh+WumuiKgueCueeahOWHuui+uVxuICogQHBhcmFtIG5vZGVJZCDoioLngrkgSURcbiAqIEBwYXJhbSBlZGdlcyDlm77kuK3nmoTmiYDmnInovrnmlbDmja5cbiAqL1xuXG5cbmV4cG9ydHMuZ2V0TmVpZ2hib3JzID0gZ2V0TmVpZ2hib3JzO1xuXG52YXIgZ2V0T3V0RWRnZXNOb2RlSWQgPSBmdW5jdGlvbiBnZXRPdXRFZGdlc05vZGVJZChub2RlSWQsIGVkZ2VzKSB7XG4gIHJldHVybiBlZGdlcy5maWx0ZXIoZnVuY3Rpb24gKGVkZ2UpIHtcbiAgICByZXR1cm4gZWRnZS5zb3VyY2UgPT09IG5vZGVJZDtcbiAgfSk7XG59O1xuLyoqXG4gKiDojrflj5bmjIflrproioLngrnnmoTovrnvvIzljIXmi6zlh7rovrnlkozlhaXovrlcbiAqIEBwYXJhbSBub2RlSWQg6IqC54K5IElEXG4gKiBAcGFyYW0gZWRnZXMg5Zu+5Lit55qE5omA5pyJ6L655pWw5o2uXG4gKi9cblxuXG5leHBvcnRzLmdldE91dEVkZ2VzTm9kZUlkID0gZ2V0T3V0RWRnZXNOb2RlSWQ7XG5cbnZhciBnZXRFZGdlc0J5Tm9kZUlkID0gZnVuY3Rpb24gZ2V0RWRnZXNCeU5vZGVJZChub2RlSWQsIGVkZ2VzKSB7XG4gIHJldHVybiBlZGdlcy5maWx0ZXIoZnVuY3Rpb24gKGVkZ2UpIHtcbiAgICByZXR1cm4gZWRnZS5zb3VyY2UgPT09IG5vZGVJZCB8fCBlZGdlLnRhcmdldCA9PT0gbm9kZUlkO1xuICB9KTtcbn07XG4vKipcbiAqIOeUn+aIkOWUr+S4gOeahCBJRO+8jOinhOWImeaYr+W6j+WPtyArIOaXtumXtOaIs1xuICogQHBhcmFtIGluZGV4IOW6j+WPt1xuICovXG5cblxuZXhwb3J0cy5nZXRFZGdlc0J5Tm9kZUlkID0gZ2V0RWRnZXNCeU5vZGVJZDtcblxudmFyIHVuaXF1ZUlkID0gZnVuY3Rpb24gdW5pcXVlSWQoaW5kZXgpIHtcbiAgaWYgKGluZGV4ID09PSB2b2lkIDApIHtcbiAgICBpbmRleCA9IDA7XG4gIH1cblxuICB2YXIgcmFuZG9tMSA9IChcIlwiICsgTWF0aC5yYW5kb20oKSkuc3BsaXQoJy4nKVsxXS5zdWJzdHIoMCwgNSk7XG4gIHZhciByYW5kb20yID0gKFwiXCIgKyBNYXRoLnJhbmRvbSgpKS5zcGxpdCgnLicpWzFdLnN1YnN0cigwLCA1KTtcbiAgcmV0dXJuIGluZGV4ICsgXCItXCIgKyByYW5kb20xICsgcmFuZG9tMjtcbn07XG5cbmV4cG9ydHMudW5pcXVlSWQgPSB1bmlxdWVJZDsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///45\n")},function(module,exports,__webpack_require__){eval("// eslint-disable-next-line no-redeclare\n/* global window */\n\nvar graphlib;\n\nif (true) {\n try {\n graphlib = __webpack_require__(321);\n } catch (e) {\n // continue regardless of error\n }\n}\n\nif (!graphlib) {\n graphlib = window.graphlib;\n}\n\nmodule.exports = graphlib;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZGFncmVqcy9saWIvZ3JhcGhsaWIuanM/M2ZkMiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBOztBQUVBOztBQUVBLElBQUksSUFBNkI7QUFDakM7QUFDQSxlQUFlLG1CQUFPLENBQUMsR0FBVTtBQUNqQyxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSIsImZpbGUiOiI0Ni5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZWRlY2xhcmVcbi8qIGdsb2JhbCB3aW5kb3cgKi9cblxudmFyIGdyYXBobGliO1xuXG5pZiAodHlwZW9mIHJlcXVpcmUgPT09IFwiZnVuY3Rpb25cIikge1xuICB0cnkge1xuICAgIGdyYXBobGliID0gcmVxdWlyZShcImdyYXBobGliXCIpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gY29udGludWUgcmVnYXJkbGVzcyBvZiBlcnJvclxuICB9XG59XG5cbmlmICghZ3JhcGhsaWIpIHtcbiAgZ3JhcGhsaWIgPSB3aW5kb3cuZ3JhcGhsaWI7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ3JhcGhsaWI7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///46\n")},function(module,exports,__webpack_require__){eval("var freeGlobal = __webpack_require__(186);\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nmodule.exports = root;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19yb290LmpzPzJiM2UiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsaUJBQWlCLG1CQUFPLENBQUMsR0FBZTs7QUFFeEM7QUFDQTs7QUFFQTtBQUNBOztBQUVBIiwiZmlsZSI6IjQ3LmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIGZyZWVHbG9iYWwgPSByZXF1aXJlKCcuL19mcmVlR2xvYmFsJyk7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgc2VsZmAuICovXG52YXIgZnJlZVNlbGYgPSB0eXBlb2Ygc2VsZiA9PSAnb2JqZWN0JyAmJiBzZWxmICYmIHNlbGYuT2JqZWN0ID09PSBPYmplY3QgJiYgc2VsZjtcblxuLyoqIFVzZWQgYXMgYSByZWZlcmVuY2UgdG8gdGhlIGdsb2JhbCBvYmplY3QuICovXG52YXIgcm9vdCA9IGZyZWVHbG9iYWwgfHwgZnJlZVNlbGYgfHwgRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcblxubW9kdWxlLmV4cG9ydHMgPSByb290O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///47\n")},function(module,exports,__webpack_require__){"use strict";eval('\nObject.defineProperty(exports, "__esModule", { value: true });\nexports.Metadata = void 0;\nvar METADATA_KEY = __webpack_require__(32);\nvar Metadata = (function () {\n function Metadata(key, value) {\n this.key = key;\n this.value = value;\n }\n Metadata.prototype.toString = function () {\n if (this.key === METADATA_KEY.NAMED_TAG) {\n return "named: " + this.value.toString() + " ";\n }\n else {\n return "tagged: { key:" + this.key.toString() + ", value: " + this.value + " }";\n }\n };\n return Metadata;\n}());\nexports.Metadata = Metadata;\n//# sourceMappingURL=metadata.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaW52ZXJzaWZ5L2xpYi9wbGFubmluZy9tZXRhZGF0YS5qcz8xOTc5Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFhO0FBQ2IsOENBQThDLGNBQWM7QUFDNUQ7QUFDQSxtQkFBbUIsbUJBQU8sQ0FBQyxFQUE0QjtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2Qiw2REFBNkQ7QUFDMUY7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0EiLCJmaWxlIjoiNDguanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuTWV0YWRhdGEgPSB2b2lkIDA7XG52YXIgTUVUQURBVEFfS0VZID0gcmVxdWlyZShcIi4uL2NvbnN0YW50cy9tZXRhZGF0YV9rZXlzXCIpO1xudmFyIE1ldGFkYXRhID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBNZXRhZGF0YShrZXksIHZhbHVlKSB7XG4gICAgICAgIHRoaXMua2V5ID0ga2V5O1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuICAgIE1ldGFkYXRhLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMua2V5ID09PSBNRVRBREFUQV9LRVkuTkFNRURfVEFHKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJuYW1lZDogXCIgKyB0aGlzLnZhbHVlLnRvU3RyaW5nKCkgKyBcIiBcIjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBcInRhZ2dlZDogeyBrZXk6XCIgKyB0aGlzLmtleS50b1N0cmluZygpICsgXCIsIHZhbHVlOiBcIiArIHRoaXMudmFsdWUgKyBcIiB9XCI7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBNZXRhZGF0YTtcbn0oKSk7XG5leHBvcnRzLk1ldGFkYXRhID0gTWV0YWRhdGE7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tZXRhZGF0YS5qcy5tYXAiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///48\n')},function(module,exports){eval("/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && typeof value == 'object';\n}\n\nmodule.exports = isObjectLike;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzT2JqZWN0TGlrZS5qcz8xMzEwIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEVBQUU7QUFDYixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwiZmlsZSI6IjQ5LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZS4gQSB2YWx1ZSBpcyBvYmplY3QtbGlrZSBpZiBpdCdzIG5vdCBgbnVsbGBcbiAqIGFuZCBoYXMgYSBgdHlwZW9mYCByZXN1bHQgb2YgXCJvYmplY3RcIi5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZSh7fSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShudWxsKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0TGlrZSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNPYmplY3RMaWtlO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///49\n")},function(module,__webpack_exports__,__webpack_require__){"use strict";eval("// ESM COMPAT FLAG\n__webpack_require__.r(__webpack_exports__);\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, \"G6GraphEvent\", function() { return /* reexport */ behavior_G6GraphEvent; });\n__webpack_require__.d(__webpack_exports__, \"G6Event\", function() { return /* reexport */ G6Event; });\n__webpack_require__.d(__webpack_exports__, \"Node\", function() { return /* reexport */ item_node; });\n__webpack_require__.d(__webpack_exports__, \"Edge\", function() { return /* reexport */ item_edge; });\n__webpack_require__.d(__webpack_exports__, \"Combo\", function() { return /* reexport */ item_combo; });\n__webpack_require__.d(__webpack_exports__, \"Hull\", function() { return /* reexport */ item_hull; });\n__webpack_require__.d(__webpack_exports__, \"registerNode\", function() { return /* reexport */ registerNode; });\n__webpack_require__.d(__webpack_exports__, \"registerCombo\", function() { return /* reexport */ registerCombo; });\n__webpack_require__.d(__webpack_exports__, \"AbstractGraph\", function() { return /* reexport */ graph_graph; });\n__webpack_require__.d(__webpack_exports__, \"registerEdge\", function() { return /* reexport */ registerEdge; });\n__webpack_require__.d(__webpack_exports__, \"registerBehavior\", function() { return /* reexport */ registerBehavior; });\n__webpack_require__.d(__webpack_exports__, \"AbstractLayout\", function() { return /* reexport */ controller_layout; });\n__webpack_require__.d(__webpack_exports__, \"AbstractEvent\", function() { return /* reexport */ controller_event; });\n__webpack_require__.d(__webpack_exports__, \"BaseGlobal\", function() { return /* reexport */ BaseGlobal; });\n__webpack_require__.d(__webpack_exports__, \"Graph\", function() { return /* reexport */ es_graph_graph; });\n__webpack_require__.d(__webpack_exports__, \"TreeGraph\", function() { return /* reexport */ tree_graph; });\n__webpack_require__.d(__webpack_exports__, \"Util\", function() { return /* reexport */ es_util; });\n__webpack_require__.d(__webpack_exports__, \"Layout\", function() { return /* reexport */ Layouts; });\n__webpack_require__.d(__webpack_exports__, \"TreeLayout\", function() { return /* reexport */ tree_layout; });\n__webpack_require__.d(__webpack_exports__, \"registerLayout\", function() { return /* reexport */ layout_registerLayout; });\n__webpack_require__.d(__webpack_exports__, \"Global\", function() { return /* reexport */ es_global; });\n__webpack_require__.d(__webpack_exports__, \"Minimap\", function() { return /* reexport */ Minimap; });\n__webpack_require__.d(__webpack_exports__, \"Grid\", function() { return /* reexport */ es_Grid; });\n__webpack_require__.d(__webpack_exports__, \"Bundling\", function() { return /* reexport */ es_Bundling; });\n__webpack_require__.d(__webpack_exports__, \"Menu\", function() { return /* reexport */ es_Menu; });\n__webpack_require__.d(__webpack_exports__, \"Fisheye\", function() { return /* reexport */ es_Fisheye; });\n__webpack_require__.d(__webpack_exports__, \"Algorithm\", function() { return /* reexport */ Algorithm; });\n__webpack_require__.d(__webpack_exports__, \"ToolBar\", function() { return /* reexport */ es_ToolBar; });\n__webpack_require__.d(__webpack_exports__, \"Tooltip\", function() { return /* reexport */ es_Tooltip; });\n__webpack_require__.d(__webpack_exports__, \"TimeBar\", function() { return /* reexport */ es_TimeBar; });\n__webpack_require__.d(__webpack_exports__, \"ImageMinimap\", function() { return /* reexport */ ImageMinimap; });\n__webpack_require__.d(__webpack_exports__, \"EdgeFilterLens\", function() { return /* reexport */ es_EdgeFilterLens; });\n__webpack_require__.d(__webpack_exports__, \"SnapLine\", function() { return /* reexport */ es_SnapLine; });\n__webpack_require__.d(__webpack_exports__, \"Legend\", function() { return /* reexport */ es_Legend; });\n__webpack_require__.d(__webpack_exports__, \"Arrow\", function() { return /* reexport */ element_arrow; });\n__webpack_require__.d(__webpack_exports__, \"Marker\", function() { return /* reexport */ marker; });\n__webpack_require__.d(__webpack_exports__, \"Shape\", function() { return /* reexport */ es_element; });\n__webpack_require__.d(__webpack_exports__, \"version\", function() { return /* binding */ version; });\n\n// NAMESPACE OBJECT: ./node_modules/@antv/algorithm/es/index.js\nvar es_namespaceObject = {};\n__webpack_require__.r(es_namespaceObject);\n__webpack_require__.d(es_namespaceObject, \"getAdjMatrix\", function() { return adjacent_matrix; });\n__webpack_require__.d(es_namespaceObject, \"breadthFirstSearch\", function() { return bfs; });\n__webpack_require__.d(es_namespaceObject, \"connectedComponent\", function() { return getConnectedComponents; });\n__webpack_require__.d(es_namespaceObject, \"getDegree\", function() { return es_degree; });\n__webpack_require__.d(es_namespaceObject, \"getInDegree\", function() { return getInDegree; });\n__webpack_require__.d(es_namespaceObject, \"getOutDegree\", function() { return getOutDegree; });\n__webpack_require__.d(es_namespaceObject, \"detectCycle\", function() { return detect_cycle; });\n__webpack_require__.d(es_namespaceObject, \"detectDirectedCycle\", function() { return es_detectDirectedCycle; });\n__webpack_require__.d(es_namespaceObject, \"detectAllCycles\", function() { return detectAllCycles; });\n__webpack_require__.d(es_namespaceObject, \"detectAllDirectedCycle\", function() { return detect_cycle_detectAllDirectedCycle; });\n__webpack_require__.d(es_namespaceObject, \"detectAllUndirectedCycle\", function() { return detect_cycle_detectAllUndirectedCycle; });\n__webpack_require__.d(es_namespaceObject, \"depthFirstSearch\", function() { return depthFirstSearch; });\n__webpack_require__.d(es_namespaceObject, \"dijkstra\", function() { return es_dijkstra; });\n__webpack_require__.d(es_namespaceObject, \"findAllPath\", function() { return find_path_findAllPath; });\n__webpack_require__.d(es_namespaceObject, \"findShortestPath\", function() { return find_path_findShortestPath; });\n__webpack_require__.d(es_namespaceObject, \"floydWarshall\", function() { return es_floydWarshall; });\n__webpack_require__.d(es_namespaceObject, \"labelPropagation\", function() { return label_propagation; });\n__webpack_require__.d(es_namespaceObject, \"louvain\", function() { return es_louvain; });\n__webpack_require__.d(es_namespaceObject, \"minimumSpanningTree\", function() { return mts; });\n__webpack_require__.d(es_namespaceObject, \"pageRank\", function() { return es_pageRank; });\n__webpack_require__.d(es_namespaceObject, \"getNeighbors\", function() { return getNeighbors; });\n__webpack_require__.d(es_namespaceObject, \"Stack\", function() { return structs_stack; });\n__webpack_require__.d(es_namespaceObject, \"GADDI\", function() { return gaddi; });\n__webpack_require__.d(es_namespaceObject, \"default\", function() { return es; });\n\n// NAMESPACE OBJECT: ./node_modules/@antv/g6-core/es/util/math.js\nvar math_namespaceObject = {};\n__webpack_require__.r(math_namespaceObject);\n__webpack_require__.d(math_namespaceObject, \"compare\", function() { return compare; });\n__webpack_require__.d(math_namespaceObject, \"getLineIntersect\", function() { return getLineIntersect; });\n__webpack_require__.d(math_namespaceObject, \"getRectIntersectByPoint\", function() { return getRectIntersectByPoint; });\n__webpack_require__.d(math_namespaceObject, \"getCircleIntersectByPoint\", function() { return getCircleIntersectByPoint; });\n__webpack_require__.d(math_namespaceObject, \"getEllipseIntersectByPoint\", function() { return getEllipseIntersectByPoint; });\n__webpack_require__.d(math_namespaceObject, \"applyMatrix\", function() { return math_applyMatrix; });\n__webpack_require__.d(math_namespaceObject, \"invertMatrix\", function() { return math_invertMatrix; });\n__webpack_require__.d(math_namespaceObject, \"getCircleCenterByPoints\", function() { return getCircleCenterByPoints; });\n__webpack_require__.d(math_namespaceObject, \"distance\", function() { return math_distance; });\n__webpack_require__.d(math_namespaceObject, \"scaleMatrix\", function() { return scaleMatrix; });\n__webpack_require__.d(math_namespaceObject, \"floydWarshall\", function() { return math_floydWarshall; });\n__webpack_require__.d(math_namespaceObject, \"getAdjMatrix\", function() { return getAdjMatrix; });\n__webpack_require__.d(math_namespaceObject, \"translate\", function() { return translate; });\n__webpack_require__.d(math_namespaceObject, \"move\", function() { return move; });\n__webpack_require__.d(math_namespaceObject, \"scale\", function() { return math_scale; });\n__webpack_require__.d(math_namespaceObject, \"rotate\", function() { return math_rotate; });\n__webpack_require__.d(math_namespaceObject, \"getDegree\", function() { return getDegree; });\n__webpack_require__.d(math_namespaceObject, \"isPointInPolygon\", function() { return isPointInPolygon; });\n__webpack_require__.d(math_namespaceObject, \"intersectBBox\", function() { return intersectBBox; });\n__webpack_require__.d(math_namespaceObject, \"isPolygonsIntersect\", function() { return math_isPolygonsIntersect; });\n__webpack_require__.d(math_namespaceObject, \"Line\", function() { return math_Line; });\n__webpack_require__.d(math_namespaceObject, \"getBBoxBoundLine\", function() { return getBBoxBoundLine; });\n__webpack_require__.d(math_namespaceObject, \"itemIntersectByLine\", function() { return itemIntersectByLine; });\n__webpack_require__.d(math_namespaceObject, \"fractionToLine\", function() { return fractionToLine; });\n__webpack_require__.d(math_namespaceObject, \"getPointsCenter\", function() { return getPointsCenter; });\n__webpack_require__.d(math_namespaceObject, \"squareDist\", function() { return squareDist; });\n__webpack_require__.d(math_namespaceObject, \"pointLineSquareDist\", function() { return pointLineSquareDist; });\n__webpack_require__.d(math_namespaceObject, \"isPointsOverlap\", function() { return isPointsOverlap; });\n__webpack_require__.d(math_namespaceObject, \"pointRectSquareDist\", function() { return pointRectSquareDist; });\n__webpack_require__.d(math_namespaceObject, \"pointLineDistance\", function() { return math_pointLineDistance; });\n__webpack_require__.d(math_namespaceObject, \"lerp\", function() { return lerp; });\n\n// NAMESPACE OBJECT: ./node_modules/@antv/g6-core/es/util/graphic.js\nvar graphic_namespaceObject = {};\n__webpack_require__.r(graphic_namespaceObject);\n__webpack_require__.d(graphic_namespaceObject, \"getBBox\", function() { return graphic_getBBox; });\n__webpack_require__.d(graphic_namespaceObject, \"getLoopCfgs\", function() { return graphic_getLoopCfgs; });\n__webpack_require__.d(graphic_namespaceObject, \"getLabelPosition\", function() { return graphic_getLabelPosition; });\n__webpack_require__.d(graphic_namespaceObject, \"traverseTree\", function() { return traverseTree; });\n__webpack_require__.d(graphic_namespaceObject, \"traverseTreeUp\", function() { return traverseTreeUp; });\n__webpack_require__.d(graphic_namespaceObject, \"getLetterWidth\", function() { return graphic_getLetterWidth; });\n__webpack_require__.d(graphic_namespaceObject, \"getTextSize\", function() { return getTextSize; });\n__webpack_require__.d(graphic_namespaceObject, \"plainCombosToTrees\", function() { return graphic_plainCombosToTrees; });\n__webpack_require__.d(graphic_namespaceObject, \"reconstructTree\", function() { return reconstructTree; });\n__webpack_require__.d(graphic_namespaceObject, \"getComboBBox\", function() { return getComboBBox; });\n__webpack_require__.d(graphic_namespaceObject, \"shouldRefreshEdge\", function() { return graphic_shouldRefreshEdge; });\n__webpack_require__.d(graphic_namespaceObject, \"cloneBesidesImg\", function() { return graphic_cloneBesidesImg; });\n\n// NAMESPACE OBJECT: ./node_modules/@antv/g6-core/es/util/base.js\nvar base_namespaceObject = {};\n__webpack_require__.r(base_namespaceObject);\n__webpack_require__.d(base_namespaceObject, \"uniqueId\", function() { return base_uniqueId; });\n__webpack_require__.d(base_namespaceObject, \"formatPadding\", function() { return base_formatPadding; });\n__webpack_require__.d(base_namespaceObject, \"cloneEvent\", function() { return base_cloneEvent; });\n__webpack_require__.d(base_namespaceObject, \"isViewportChanged\", function() { return isViewportChanged; });\n__webpack_require__.d(base_namespaceObject, \"isNaN\", function() { return base_isNaN; });\n__webpack_require__.d(base_namespaceObject, \"calculationItemsBBox\", function() { return calculationItemsBBox; });\n__webpack_require__.d(base_namespaceObject, \"processParallelEdges\", function() { return processParallelEdges; });\n\n// NAMESPACE OBJECT: ./node_modules/@antv/g6-core/es/util/path.js\nvar path_namespaceObject = {};\n__webpack_require__.r(path_namespaceObject);\n__webpack_require__.d(path_namespaceObject, \"getSpline\", function() { return path_getSpline; });\n__webpack_require__.d(path_namespaceObject, \"getControlPoint\", function() { return path_getControlPoint; });\n__webpack_require__.d(path_namespaceObject, \"pointsToPolygon\", function() { return pointsToPolygon; });\n__webpack_require__.d(path_namespaceObject, \"pathToPoints\", function() { return pathToPoints; });\n__webpack_require__.d(path_namespaceObject, \"getClosedSpline\", function() { return getClosedSpline; });\n__webpack_require__.d(path_namespaceObject, \"roundedHull\", function() { return roundedHull; });\n__webpack_require__.d(path_namespaceObject, \"paddedHull\", function() { return paddedHull; });\n\n// NAMESPACE OBJECT: ./node_modules/@antv/g6-core/es/util/color.js\nvar color_namespaceObject = {};\n__webpack_require__.r(color_namespaceObject);\n__webpack_require__.d(color_namespaceObject, \"defaultSubjectColors\", function() { return defaultSubjectColors; });\n\n// NAMESPACE OBJECT: ./node_modules/@antv/g6-pc/es/util/color.js\nvar util_color_namespaceObject = {};\n__webpack_require__.r(util_color_namespaceObject);\n__webpack_require__.d(util_color_namespaceObject, \"mixColor\", function() { return color_mixColor; });\n__webpack_require__.d(util_color_namespaceObject, \"getColorsWithSubjectColor\", function() { return getColorsWithSubjectColor; });\n__webpack_require__.d(util_color_namespaceObject, \"getColorSetsBySubjectColors\", function() { return getColorSetsBySubjectColors; });\n\n// NAMESPACE OBJECT: ./node_modules/@antv/g6-pc/es/util/layout.js\nvar util_layout_namespaceObject = {};\n__webpack_require__.r(util_layout_namespaceObject);\n__webpack_require__.d(util_layout_namespaceObject, \"proccessToFunc\", function() { return layout_proccessToFunc; });\n__webpack_require__.d(util_layout_namespaceObject, \"buildTextureData\", function() { return layout_buildTextureData; });\n__webpack_require__.d(util_layout_namespaceObject, \"buildTextureDataWithOneEdgeAttr\", function() { return buildTextureDataWithOneEdgeAttr; });\n__webpack_require__.d(util_layout_namespaceObject, \"buildTextureDataWithTwoEdgeAttr\", function() { return layout_buildTextureDataWithTwoEdgeAttr; });\n__webpack_require__.d(util_layout_namespaceObject, \"attributesToTextureData\", function() { return layout_attributesToTextureData; });\n__webpack_require__.d(util_layout_namespaceObject, \"arrayToTextureData\", function() { return layout_arrayToTextureData; });\n__webpack_require__.d(util_layout_namespaceObject, \"radialLayout\", function() { return radialLayout; });\n\n// NAMESPACE OBJECT: ./node_modules/@antv/g6-pc/es/util/gpu.js\nvar util_gpu_namespaceObject = {};\n__webpack_require__.r(util_gpu_namespaceObject);\n__webpack_require__.d(util_gpu_namespaceObject, \"gpuDetector\", function() { return gpuDetector; });\n\n// NAMESPACE OBJECT: ./node_modules/fecha/lib/fecha.js\nvar fecha_namespaceObject = {};\n__webpack_require__.r(fecha_namespaceObject);\n__webpack_require__.d(fecha_namespaceObject, \"default\", function() { return lib_fecha; });\n__webpack_require__.d(fecha_namespaceObject, \"assign\", function() { return fecha_assign; });\n__webpack_require__.d(fecha_namespaceObject, \"format\", function() { return fecha_format; });\n__webpack_require__.d(fecha_namespaceObject, \"parse\", function() { return parse; });\n__webpack_require__.d(fecha_namespaceObject, \"defaultI18n\", function() { return defaultI18n; });\n__webpack_require__.d(fecha_namespaceObject, \"setGlobalDateI18n\", function() { return setGlobalDateI18n; });\n__webpack_require__.d(fecha_namespaceObject, \"setGlobalDateMasks\", function() { return setGlobalDateMasks; });\n\n// EXTERNAL MODULE: ./node_modules/tslib/tslib.es6.js\nvar tslib_es6 = __webpack_require__(1);\n\n// EXTERNAL MODULE: ./node_modules/@antv/util/esm/index.js + 110 modules\nvar esm = __webpack_require__(0);\n\n// CONCATENATED MODULE: ./node_modules/@antv/g6-core/es/behavior/behaviorOption.js\n // 自定义 Behavior 时候共有的方法\n\n/* harmony default export */ var behaviorOption = ({\n getDefaultCfg: function getDefaultCfg() {\n return {};\n },\n\n /**\n * register event handler, behavior will auto bind events\n * for example:\n * return {\n * click: 'onClick'\n * }\n */\n getEvents: function getEvents() {\n return {};\n },\n updateCfg: function updateCfg(cfg) {\n Object.assign(this, cfg);\n return true;\n },\n shouldBegin: function shouldBegin() {\n return true;\n },\n shouldUpdate: function shouldUpdate() {\n return true;\n },\n shouldEnd: function shouldEnd() {\n return true;\n },\n\n /**\n * auto bind events when register behavior\n * @param graph Graph instance\n */\n bind: function bind(graph) {\n var _this = this;\n\n var events = this.events;\n this.graph = graph;\n\n if (this.type === 'drag-canvas' || this.type === 'brush-select' || this.type === 'lasso-select') {\n graph.get('canvas').set('draggable', true);\n }\n\n Object(esm[\"each\"])(events, function (handler, event) {\n graph.on(event, handler);\n }); // To avoid the tabs switching makes the keydown related behaviors disable\n\n document.addEventListener('visibilitychange', function () {\n _this.keydown = false;\n });\n },\n unbind: function unbind(graph) {\n var events = this.events;\n var draggable = graph.get('canvas').get('draggable');\n\n if (this.type === 'drag-canvas' || this.type === 'brush-select' || this.type === 'lasso-select') {\n graph.get('canvas').set('draggable', false);\n }\n\n Object(esm[\"each\"])(events, function (handler, event) {\n graph.off(event, handler);\n });\n graph.get('canvas').set('draggable', draggable);\n },\n get: function get(val) {\n return this[val];\n },\n set: function set(key, val) {\n this[key] = val;\n return this;\n }\n});\n// CONCATENATED MODULE: ./node_modules/@antv/g6-core/es/behavior/behavior.js\n\n\n\nvar behavior_Behavior =\n/** @class */\nfunction () {\n function Behavior() {}\n /**\n * 自定义 Behavior\n * @param type Behavior 名称\n * @param behavior Behavior 定义的方法集合\n */\n\n\n Behavior.registerBehavior = function (type, behavior) {\n if (!behavior) {\n throw new Error(\"please specify handler for this behavior: \" + type);\n }\n\n var prototype = Object(esm[\"clone\"])(behaviorOption);\n Object.assign(prototype, behavior); // eslint-disable-next-line func-names\n\n var base = function base(cfg) {\n var _this = this;\n\n Object.assign(this, this.getDefaultCfg(), cfg);\n var events = this.getEvents();\n this.events = null;\n var eventsToBind = {};\n\n if (events) {\n Object(esm[\"each\"])(events, function (handle, event) {\n eventsToBind[event] = Object(esm[\"wrapBehavior\"])(_this, handle);\n });\n this.events = eventsToBind;\n }\n };\n\n base.prototype = prototype;\n Behavior.types[type] = base;\n };\n\n Behavior.hasBehavior = function (type) {\n return !!Behavior.types[type];\n };\n\n Behavior.getBehavior = function (type) {\n return Behavior.types[type];\n }; // 所有自定义的 Behavior 的实例\n\n\n Behavior.types = {};\n return Behavior;\n}();\n\n/* harmony default export */ var behavior_behavior = (behavior_Behavior);\n// CONCATENATED MODULE: ./node_modules/@antv/g6-core/es/behavior/index.js\n\n/* harmony default export */ var es_behavior = (behavior_behavior);\n// EXTERNAL MODULE: ./node_modules/@antv/event-emitter/esm/index.js\nvar event_emitter_esm = __webpack_require__(138);\n\n// EXTERNAL MODULE: ./node_modules/@antv/matrix-util/esm/index.js + 1 modules\nvar matrix_util_esm = __webpack_require__(14);\n\n// CONCATENATED MODULE: ./node_modules/@antv/algorithm/es/adjacent-matrix.js\nvar adjacent_matrix_adjMatrix = function adjMatrix(graphData, directed) {\n var nodes = graphData.nodes,\n edges = graphData.edges;\n var matrix = []; // map node with index in data.nodes\n\n var nodeMap = {};\n\n if (!nodes) {\n throw new Error(\"invalid nodes data!\");\n }\n\n if (nodes) {\n nodes.forEach(function (node, i) {\n nodeMap[node.id] = i;\n var row = [];\n matrix.push(row);\n });\n }\n\n if (edges) {\n edges.forEach(function (edge) {\n var source = edge.source,\n target = edge.target;\n var sIndex = nodeMap[source];\n var tIndex = nodeMap[target];\n if (!sIndex && sIndex !== 0 || !tIndex && tIndex !== 0) return;\n matrix[sIndex][tIndex] = 1;\n\n if (!directed) {\n matrix[tIndex][sIndex] = 1;\n }\n });\n }\n\n return matrix;\n};\n\n/* harmony default export */ var adjacent_matrix = (adjacent_matrix_adjMatrix);\n// CONCATENATED MODULE: ./node_modules/@antv/algorithm/es/structs/linked-list.js\nvar defaultComparator = function defaultComparator(a, b) {\n if (a === b) {\n return true;\n }\n\n return false;\n};\n/**\n * 链表中单个元素节点\n */\n\n\nvar LinkedListNode =\n/** @class */\nfunction () {\n function LinkedListNode(value, next) {\n if (next === void 0) {\n next = null;\n }\n\n this.value = value;\n this.next = next;\n }\n\n LinkedListNode.prototype.toString = function (callback) {\n return callback ? callback(this.value) : \"\" + this.value;\n };\n\n return LinkedListNode;\n}();\n\n\n\nvar LinkedList =\n/** @class */\nfunction () {\n function LinkedList(comparator) {\n if (comparator === void 0) {\n comparator = defaultComparator;\n }\n\n this.head = null;\n this.tail = null;\n this.compare = comparator;\n }\n /**\n * 将指定元素添加到链表头部\n * @param value\n */\n\n\n LinkedList.prototype.prepend = function (value) {\n // 在头部添加一个节点\n var newNode = new LinkedListNode(value, this.head);\n this.head = newNode;\n\n if (!this.tail) {\n this.tail = newNode;\n }\n\n return this;\n };\n /**\n * 将指定元素添加到链表中\n * @param value\n */\n\n\n LinkedList.prototype.append = function (value) {\n var newNode = new LinkedListNode(value); // 如果不存在头节点,则将创建的新节点作为头节点\n\n if (!this.head) {\n this.head = newNode;\n this.tail = newNode;\n return this;\n } // 将新节点附加到链表末尾\n\n\n this.tail.next = newNode;\n this.tail = newNode;\n return this;\n };\n /**\n * 删除指定元素\n * @param value 要删除的元素\n */\n\n\n LinkedList.prototype.delete = function (value) {\n if (!this.head) {\n return null;\n }\n\n var deleteNode = null; // 如果删除的是头部元素,则将next作为头元素\n\n while (this.head && this.compare(this.head.value, value)) {\n deleteNode = this.head;\n this.head = this.head.next;\n }\n\n var currentNode = this.head;\n\n if (currentNode !== null) {\n // 如果删除了节点以后,将next节点前移\n while (currentNode.next) {\n if (this.compare(currentNode.next.value, value)) {\n deleteNode = currentNode.next;\n currentNode.next = currentNode.next.next;\n } else {\n currentNode = currentNode.next;\n }\n }\n } // 检查尾部节点是否被删除\n\n\n if (this.compare(this.tail.value, value)) {\n this.tail = currentNode;\n }\n\n return deleteNode;\n };\n /**\n * 查找指定的元素\n * @param param0\n */\n\n\n LinkedList.prototype.find = function (_a) {\n var _b = _a.value,\n value = _b === void 0 ? undefined : _b,\n _c = _a.callback,\n callback = _c === void 0 ? undefined : _c;\n\n if (!this.head) {\n return null;\n }\n\n var currentNode = this.head;\n\n while (currentNode) {\n // 如果指定了 callback,则按指定的 callback 查找\n if (callback && callback(currentNode.value)) {\n return currentNode;\n } // 如果指定了 value,则按 value 查找\n\n\n if (value !== undefined && this.compare(currentNode.value, value)) {\n return currentNode;\n }\n\n currentNode = currentNode.next;\n }\n\n return null;\n };\n /**\n * 删除尾部节点\n */\n\n\n LinkedList.prototype.deleteTail = function () {\n var deletedTail = this.tail;\n\n if (this.head === this.tail) {\n // 链表中只有一个元素\n this.head = null;\n this.tail = null;\n return deletedTail;\n }\n\n var currentNode = this.head;\n\n while (currentNode.next) {\n if (!currentNode.next.next) {\n currentNode.next = null;\n } else {\n currentNode = currentNode.next;\n }\n }\n\n this.tail = currentNode;\n return deletedTail;\n };\n /**\n * 删除头部节点\n */\n\n\n LinkedList.prototype.deleteHead = function () {\n if (!this.head) {\n return null;\n }\n\n var deletedHead = this.head;\n\n if (this.head.next) {\n this.head = this.head.next;\n } else {\n this.head = null;\n this.tail = null;\n }\n\n return deletedHead;\n };\n /**\n * 将一组元素转成链表中的节点\n * @param values 链表中的元素\n */\n\n\n LinkedList.prototype.fromArray = function (values) {\n var _this = this;\n\n values.forEach(function (value) {\n return _this.append(value);\n });\n return this;\n };\n /**\n * 将链表中的节点转成数组元素\n */\n\n\n LinkedList.prototype.toArray = function () {\n var nodes = [];\n var currentNode = this.head;\n\n while (currentNode) {\n nodes.push(currentNode);\n currentNode = currentNode.next;\n }\n\n return nodes;\n };\n /**\n * 反转链表中的元素节点\n */\n\n\n LinkedList.prototype.reverse = function () {\n var currentNode = this.head;\n var prevNode = null;\n var nextNode = null;\n\n while (currentNode) {\n // 存储下一个元素节点\n nextNode = currentNode.next; // 更改当前节点的下一个节点,以便将它连接到上一个节点上\n\n currentNode.next = prevNode; // 将 prevNode 和 currentNode 向前移动一步\n\n prevNode = currentNode;\n currentNode = nextNode;\n }\n\n this.tail = this.head;\n this.head = prevNode;\n };\n\n LinkedList.prototype.toString = function (callback) {\n if (callback === void 0) {\n callback = undefined;\n }\n\n return this.toArray().map(function (node) {\n return node.toString(callback);\n }).toString();\n };\n\n return LinkedList;\n}();\n\n/* harmony default export */ var linked_list = (LinkedList);\n// CONCATENATED MODULE: ./node_modules/@antv/algorithm/es/structs/queue.js\n\n\nvar queue_Queue =\n/** @class */\nfunction () {\n function Queue() {\n this.linkedList = new linked_list();\n }\n /**\n * 队列是否为空\n */\n\n\n Queue.prototype.isEmpty = function () {\n return !this.linkedList.head;\n };\n /**\n * 读取队列头部的元素, 不删除队列中的元素\n */\n\n\n Queue.prototype.peek = function () {\n if (!this.linkedList.head) {\n return null;\n }\n\n return this.linkedList.head.value;\n };\n /**\n * 在队列的尾部新增一个元素\n * @param value\n */\n\n\n Queue.prototype.enqueue = function (value) {\n this.linkedList.append(value);\n };\n /**\n * 删除队列中的头部元素,如果队列为空,则返回 null\n */\n\n\n Queue.prototype.dequeue = function () {\n var removeHead = this.linkedList.deleteHead();\n return removeHead ? removeHead.value : null;\n };\n\n Queue.prototype.toString = function (callback) {\n return this.linkedList.toString(callback);\n };\n\n return Queue;\n}();\n\n/* harmony default export */ var structs_queue = (queue_Queue);\n// CONCATENATED MODULE: ./node_modules/@antv/algorithm/es/util.js\n/**\n * 获取指定节点的所有邻居\n * @param nodeId 节点 ID\n * @param edges 图中的所有边数据\n * @param type 邻居类型\n */\nvar getNeighbors = function getNeighbors(nodeId, edges, type) {\n if (edges === void 0) {\n edges = [];\n }\n\n var currentEdges = edges.filter(function (edge) {\n return edge.source === nodeId || edge.target === nodeId;\n });\n\n if (type === 'target') {\n // 当前节点为 source,它所指向的目标节点\n var neighhborsConverter_1 = function neighhborsConverter_1(edge) {\n return edge.source === nodeId;\n };\n\n return currentEdges.filter(neighhborsConverter_1).map(function (edge) {\n return edge.target;\n });\n }\n\n if (type === 'source') {\n // 当前节点为 target,它所指向的源节点\n var neighhborsConverter_2 = function neighhborsConverter_2(edge) {\n return edge.target === nodeId;\n };\n\n return currentEdges.filter(neighhborsConverter_2).map(function (edge) {\n return edge.source;\n });\n } // 若未指定 type ,则返回所有邻居\n\n\n var neighhborsConverter = function neighhborsConverter(edge) {\n return edge.source === nodeId ? edge.target : edge.source;\n };\n\n return currentEdges.map(neighhborsConverter);\n};\n/**\n * 获取指定节点的出边\n * @param nodeId 节点 ID\n * @param edges 图中的所有边数据\n */\n\nvar getOutEdgesNodeId = function getOutEdgesNodeId(nodeId, edges) {\n return edges.filter(function (edge) {\n return edge.source === nodeId;\n });\n};\n/**\n * 获取指定节点的边,包括出边和入边\n * @param nodeId 节点 ID\n * @param edges 图中的所有边数据\n */\n\nvar getEdgesByNodeId = function getEdgesByNodeId(nodeId, edges) {\n return edges.filter(function (edge) {\n return edge.source === nodeId || edge.target === nodeId;\n });\n};\n/**\n * 生成唯一的 ID,规则是序号 + 时间戳\n * @param index 序号\n */\n\nvar util_uniqueId = function uniqueId(index) {\n if (index === void 0) {\n index = 0;\n }\n\n var random1 = (\"\" + Math.random()).split('.')[1].substr(0, 5);\n var random2 = (\"\" + Math.random()).split('.')[1].substr(0, 5);\n return index + \"-\" + random1 + random2;\n};\n// CONCATENATED MODULE: ./node_modules/@antv/algorithm/es/bfs.js\n\n\n/**\n *\n * @param callbacks\n * allowTraversal: 确定 BFS 是否从顶点沿着边遍历到其邻居,默认情况下,同一个节点只能遍历一次\n * enterNode: 当 BFS 访问某个节点时调用\n * leaveNode: 当 BFS 访问访问结束某个节点时调用\n */\n\nfunction initCallbacks(callbacks) {\n if (callbacks === void 0) {\n callbacks = {};\n }\n\n var initiatedCallback = callbacks;\n\n var stubCallback = function stubCallback() {};\n\n var allowTraversalCallback = function () {\n var seen = {};\n return function (_a) {\n var next = _a.next;\n var id = next;\n\n if (!seen[id]) {\n seen[id] = true;\n return true;\n }\n\n return false;\n };\n }();\n\n initiatedCallback.allowTraversal = callbacks.allowTraversal || allowTraversalCallback;\n initiatedCallback.enter = callbacks.enter || stubCallback;\n initiatedCallback.leave = callbacks.leave || stubCallback;\n return initiatedCallback;\n}\n/**\n * 广度优先遍历图\n * @param graph Graph 图实例\n * @param startNode 开始遍历的节点\n * @param originalCallbacks 回调\n */\n\n\nvar bfs_breadthFirstSearch = function breadthFirstSearch(graphData, startNodeId, originalCallbacks, directed) {\n if (directed === void 0) {\n directed = true;\n }\n\n var callbacks = initCallbacks(originalCallbacks);\n var nodeQueue = new structs_queue();\n var _a = graphData.edges,\n edges = _a === void 0 ? [] : _a; // 初始化队列元素\n\n nodeQueue.enqueue(startNodeId);\n var previousNode = '';\n\n var _loop_1 = function _loop_1() {\n var currentNode = nodeQueue.dequeue();\n callbacks.enter({\n current: currentNode,\n previous: previousNode\n }); // 将所有邻居添加到队列中以便遍历\n\n getNeighbors(currentNode, edges, directed ? 'target' : undefined).forEach(function (nextNode) {\n if (callbacks.allowTraversal({\n previous: previousNode,\n current: currentNode,\n next: nextNode\n })) {\n nodeQueue.enqueue(nextNode);\n }\n });\n callbacks.leave({\n current: currentNode,\n previous: previousNode\n }); // 下一次循环之前存储当前顶点\n\n previousNode = currentNode;\n }; // 遍历队列中的所有顶点\n\n\n while (!nodeQueue.isEmpty()) {\n _loop_1();\n }\n};\n\n/* harmony default export */ var bfs = (bfs_breadthFirstSearch);\n// CONCATENATED MODULE: ./node_modules/@antv/algorithm/es/connected-component.js\n\n/**\n * Generate all connected components for an undirected graph\n * @param graph\n */\n\nvar connected_component_detectConnectedComponents = function detectConnectedComponents(graphData) {\n var _a = graphData.nodes,\n nodes = _a === void 0 ? [] : _a,\n _b = graphData.edges,\n edges = _b === void 0 ? [] : _b;\n var allComponents = [];\n var visited = {};\n var nodeStack = [];\n\n var getComponent = function getComponent(node) {\n nodeStack.push(node);\n visited[node.id] = true;\n var neighbors = getNeighbors(node.id, edges);\n\n var _loop_1 = function _loop_1(i) {\n var neighbor = neighbors[i];\n\n if (!visited[neighbor]) {\n var targetNode = nodes.filter(function (node) {\n return node.id === neighbor;\n });\n\n if (targetNode.length > 0) {\n getComponent(targetNode[0]);\n }\n }\n };\n\n for (var i = 0; i < neighbors.length; ++i) {\n _loop_1(i);\n }\n };\n\n for (var i = 0; i < nodes.length; i++) {\n var node = nodes[i];\n\n if (!visited[node.id]) {\n // 对于无向图进行dfs遍历,每一次调用后都得到一个连通分量\n getComponent(node);\n var component = [];\n\n while (nodeStack.length > 0) {\n component.push(nodeStack.pop());\n }\n\n allComponents.push(component);\n }\n }\n\n return allComponents;\n};\n/**\n * Tarjan's Algorithm 复杂度 O(|V|+|E|)\n * For directed graph only\n * a directed graph is said to be strongly connected if \"every vertex is reachable from every other vertex\".\n * refer: http://en.wikipedia.org/wiki/Tarjan%27s_strongly_connected_components_algorithm\n * @param graph\n * @return a list of strongly connected components\n */\n\nvar connected_component_detectStrongConnectComponents = function detectStrongConnectComponents(graphData) {\n var _a = graphData.nodes,\n nodes = _a === void 0 ? [] : _a,\n _b = graphData.edges,\n edges = _b === void 0 ? [] : _b;\n var nodeStack = [];\n var inStack = {}; // 辅助判断是否已经在stack中,减少查找开销\n\n var indices = {};\n var lowLink = {};\n var allComponents = [];\n var index = 0;\n\n var getComponent = function getComponent(node) {\n // Set the depth index for v to the smallest unused index\n indices[node.id] = index;\n lowLink[node.id] = index;\n index += 1;\n nodeStack.push(node);\n inStack[node.id] = true; // 考虑每个邻接点\n\n var neighbors = getNeighbors(node.id, edges, 'target').filter(function (n) {\n return nodes.map(function (node) {\n return node.id;\n }).indexOf(n) > -1;\n });\n\n var _loop_2 = function _loop_2(i) {\n var targetNodeID = neighbors[i];\n\n if (!indices[targetNodeID] && indices[targetNodeID] !== 0) {\n var targetNode = nodes.filter(function (node) {\n return node.id === targetNodeID;\n });\n\n if (targetNode.length > 0) {\n getComponent(targetNode[0]);\n } // tree edge\n\n\n lowLink[node.id] = Math.min(lowLink[node.id], lowLink[targetNodeID]);\n } else if (inStack[targetNodeID]) {\n // back edge, target node is in the current SCC\n lowLink[node.id] = Math.min(lowLink[node.id], indices[targetNodeID]);\n }\n };\n\n for (var i = 0; i < neighbors.length; i++) {\n _loop_2(i);\n } // If node is a root node, generate an SCC\n\n\n if (lowLink[node.id] === indices[node.id]) {\n var component = [];\n\n while (nodeStack.length > 0) {\n var tmpNode = nodeStack.pop();\n inStack[tmpNode.id] = false;\n component.push(tmpNode);\n if (tmpNode === node) break;\n }\n\n if (component.length > 0) {\n allComponents.push(component);\n }\n }\n };\n\n for (var _i = 0, nodes_1 = nodes; _i < nodes_1.length; _i++) {\n var node = nodes_1[_i];\n\n if (!indices[node.id] && indices[node.id] !== 0) {\n getComponent(node);\n }\n }\n\n return allComponents;\n};\nfunction getConnectedComponents(graphData, directed) {\n if (directed) return connected_component_detectStrongConnectComponents(graphData);\n return connected_component_detectConnectedComponents(graphData);\n}\n// CONCATENATED MODULE: ./node_modules/@antv/algorithm/es/degree.js\nvar degree = function degree(graphData) {\n var degrees = {};\n var _a = graphData.nodes,\n nodes = _a === void 0 ? [] : _a,\n _b = graphData.edges,\n edges = _b === void 0 ? [] : _b;\n nodes.forEach(function (node) {\n degrees[node.id] = {\n degree: 0,\n inDegree: 0,\n outDegree: 0\n };\n });\n edges.forEach(function (edge) {\n degrees[edge.source].degree++;\n degrees[edge.source].outDegree++;\n degrees[edge.target].degree++;\n degrees[edge.target].inDegree++;\n });\n return degrees;\n};\n\n/* harmony default export */ var es_degree = (degree);\n/**\n * 获取指定节点的入度\n * @param graphData 图数据\n * @param nodeId 节点ID\n */\n\nvar getInDegree = function getInDegree(graphData, nodeId) {\n var nodeDegree = degree(graphData);\n\n if (nodeDegree[nodeId]) {\n return degree(graphData)[nodeId].inDegree;\n }\n\n return 0;\n};\n/**\n * 获取指定节点的出度\n * @param graphData 图数据\n * @param nodeId 节点ID\n */\n\nvar getOutDegree = function getOutDegree(graphData, nodeId) {\n var nodeDegree = degree(graphData);\n\n if (nodeDegree[nodeId]) {\n return degree(graphData)[nodeId].outDegree;\n }\n\n return 0;\n};\n// CONCATENATED MODULE: ./node_modules/@antv/algorithm/es/dfs.js\n\n\nfunction dfs_initCallbacks(callbacks) {\n if (callbacks === void 0) {\n callbacks = {};\n }\n\n var initiatedCallback = callbacks;\n\n var stubCallback = function stubCallback() {};\n\n var allowTraversalCallback = function () {\n var seen = {};\n return function (_a) {\n var next = _a.next;\n\n if (!seen[next]) {\n seen[next] = true;\n return true;\n }\n\n return false;\n };\n }();\n\n initiatedCallback.allowTraversal = callbacks.allowTraversal || allowTraversalCallback;\n initiatedCallback.enter = callbacks.enter || stubCallback;\n initiatedCallback.leave = callbacks.leave || stubCallback;\n return initiatedCallback;\n}\n/**\n * @param {Graph} graph\n * @param {GraphNode} currentNode\n * @param {GraphNode} previousNode\n * @param {Callbacks} callbacks\n */\n\n\nfunction depthFirstSearchRecursive(graphData, currentNode, previousNode, callbacks) {\n callbacks.enter({\n current: currentNode,\n previous: previousNode\n });\n var _a = graphData.edges,\n edges = _a === void 0 ? [] : _a;\n getNeighbors(currentNode, edges, 'target').forEach(function (nextNode) {\n if (callbacks.allowTraversal({\n previous: previousNode,\n current: currentNode,\n next: nextNode\n })) {\n depthFirstSearchRecursive(graphData, nextNode, currentNode, callbacks);\n }\n });\n callbacks.leave({\n current: currentNode,\n previous: previousNode\n });\n}\n/**\n * 深度优先遍历图\n * @param data GraphData 图数据\n * @param startNodeId 开始遍历的节点的 ID\n * @param originalCallbacks 回调\n */\n\n\nfunction depthFirstSearch(graphData, startNodeId, callbacks) {\n depthFirstSearchRecursive(graphData, startNodeId, '', dfs_initCallbacks(callbacks));\n}\n// CONCATENATED MODULE: ./node_modules/@antv/algorithm/es/detect-cycle.js\n\n\n\n\nvar detect_cycle_detectDirectedCycle = function detectDirectedCycle(graphData) {\n var cycle = null;\n var _a = graphData.nodes,\n nodes = _a === void 0 ? [] : _a;\n var dfsParentMap = {}; // 所有没有被访问的节点集合\n\n var unvisitedSet = {}; // 正在被访问的节点集合\n\n var visitingSet = {}; // 所有已经被访问过的节点集合\n\n var visitedSet = {}; // 初始化 unvisitedSet\n\n nodes.forEach(function (node) {\n unvisitedSet[node.id] = node;\n });\n var callbacks = {\n enter: function enter(_a) {\n var currentNode = _a.current,\n previousNode = _a.previous;\n\n if (visitingSet[currentNode]) {\n // 如果当前节点正在访问中,则说明检测到环路了\n cycle = {};\n var currentCycleNode = currentNode;\n var previousCycleNode = previousNode;\n\n while (previousCycleNode !== currentNode) {\n cycle[currentCycleNode] = previousCycleNode;\n currentCycleNode = previousCycleNode;\n previousCycleNode = dfsParentMap[previousCycleNode];\n }\n\n cycle[currentCycleNode] = previousCycleNode;\n } else {\n // 如果不存在正在访问集合中,则将其放入正在访问集合,并从未访问集合中删除\n visitingSet[currentNode] = currentNode;\n delete unvisitedSet[currentNode]; // 更新 DSF parents 列表\n\n dfsParentMap[currentNode] = previousNode;\n }\n },\n leave: function leave(_a) {\n var currentNode = _a.current; // 如果所有的节点的子节点都已经访问过了,则从正在访问集合中删除掉,并将其移入到已访问集合中,\n // 同时也意味着当前节点的所有邻居节点都被访问过了\n\n visitedSet[currentNode] = currentNode;\n delete visitingSet[currentNode];\n },\n allowTraversal: function allowTraversal(_a) {\n var nextNode = _a.next; // 如果检测到环路则需要终止所有进一步的遍历,否则会导致无限循环遍历\n\n if (cycle) {\n return false;\n } // 仅允许遍历没有访问的节点,visitedSet 中的都已经访问过了\n\n\n return !visitedSet[nextNode];\n }\n }; // 开始遍历节点\n\n while (Object.keys(unvisitedSet).length) {\n // 从第一个节点开始进行 DFS 遍历\n var firsetUnVisitedKey = Object.keys(unvisitedSet)[0];\n depthFirstSearch(graphData, firsetUnVisitedKey, callbacks);\n }\n\n return cycle;\n};\n/**\n * 检测无向图中的所有Base cycles\n * refer: https://www.codeproject.com/Articles/1158232/Enumerating-All-Cycles-in-an-Undirected-Graph\n * @param graph\n * @param nodeIds 节点 ID 的数组\n * @param include 包含或排除指定的节点\n * @return [{[key: string]: INode}] 返回一组base cycles\n */\n\n\nvar detect_cycle_detectAllUndirectedCycle = function detectAllUndirectedCycle(graphData, nodeIds, include) {\n var _a, _b;\n\n if (include === void 0) {\n include = true;\n }\n\n var allCycles = [];\n var components = getConnectedComponents(graphData, false); // loop through all connected components\n\n for (var _i = 0, components_1 = components; _i < components_1.length; _i++) {\n var component = components_1[_i];\n if (!component.length) continue;\n var root = component[0];\n var rootId = root.id;\n var stack = [root];\n var parent_1 = (_a = {}, _a[rootId] = root, _a);\n var used = (_b = {}, _b[rootId] = new Set(), _b); // walk a spanning tree to find cycles\n\n while (stack.length > 0) {\n var curNode = stack.pop();\n var curNodeId = curNode.id;\n var neighbors = getNeighbors(curNodeId, graphData.edges);\n\n var _loop_1 = function _loop_1(i) {\n var _c;\n\n var neighborId = neighbors[i];\n var neighbor = graphData.nodes.find(function (node) {\n return node.id === neighborId;\n }); // const neighborId = neighbor.get('id');\n\n if (neighborId === curNodeId) {\n // 自环\n allCycles.push((_c = {}, _c[neighborId] = curNode, _c));\n } else if (!(neighborId in used)) {\n // visit a new node\n parent_1[neighborId] = curNode;\n stack.push(neighbor);\n used[neighborId] = new Set([curNode]);\n } else if (!used[curNodeId].has(neighbor)) {\n // a cycle found\n var cycleValid = true;\n var cyclePath = [neighbor, curNode];\n var p = parent_1[curNodeId];\n\n while (used[neighborId].size && !used[neighborId].has(p)) {\n cyclePath.push(p);\n if (p === parent_1[p.id]) break;else p = parent_1[p.id];\n }\n\n cyclePath.push(p);\n\n if (nodeIds && include) {\n // 如果有指定包含的节点\n cycleValid = false;\n\n if (cyclePath.findIndex(function (node) {\n return nodeIds.indexOf(node.id) > -1;\n }) > -1) {\n cycleValid = true;\n }\n } else if (nodeIds && !include) {\n // 如果有指定不包含的节点\n if (cyclePath.findIndex(function (node) {\n return nodeIds.indexOf(node.id) > -1;\n }) > -1) {\n cycleValid = false;\n }\n } // 把 node list 形式转换为 cycle 的格式\n\n\n if (cycleValid) {\n var cycle = {};\n\n for (var index = 1; index < cyclePath.length; index += 1) {\n cycle[cyclePath[index - 1].id] = cyclePath[index];\n }\n\n if (cyclePath.length) {\n cycle[cyclePath[cyclePath.length - 1].id] = cyclePath[0];\n }\n\n allCycles.push(cycle);\n }\n\n used[neighborId].add(curNode);\n }\n };\n\n for (var i = 0; i < neighbors.length; i += 1) {\n _loop_1(i);\n }\n }\n }\n\n return allCycles;\n};\n/**\n * Johnson's algorithm, 时间复杂度 O((V + E)(C + 1))$ and space bounded by O(V + E)\n * refer: https://www.cs.tufts.edu/comp/150GA/homeworks/hw1/Johnson%2075.PDF\n * refer: https://networkx.github.io/documentation/stable/_modules/networkx/algorithms/cycles.html#simple_cycles\n * @param graph\n * @param nodeIds 节点 ID 的数组\n * @param include 包含或排除指定的节点\n * @return [{[key: string]: INode}] 返回所有的 simple cycles\n */\n\nvar detect_cycle_detectAllDirectedCycle = function detectAllDirectedCycle(graphData, nodeIds, include) {\n if (include === void 0) {\n include = true;\n }\n\n var path = []; // stack of nodes in current path\n\n var blocked = new Set();\n var B = []; // remember portions of the graph that yield no elementary circuit\n\n var allCycles = [];\n var idx2Node = {};\n var node2Idx = {}; // 辅助函数: unblock all blocked nodes\n\n var unblock = function unblock(thisNode) {\n var stack = [thisNode];\n\n while (stack.length > 0) {\n var node = stack.pop();\n\n if (blocked.has(node)) {\n blocked.delete(node);\n B[node.id].forEach(function (n) {\n stack.push(n);\n });\n B[node.id].clear();\n }\n }\n };\n\n var circuit = function circuit(node, start, adjList) {\n var closed = false; // whether a path is closed\n\n if (nodeIds && include === false && nodeIds.indexOf(node.id) > -1) return closed;\n path.push(node);\n blocked.add(node);\n var neighbors = adjList[node.id];\n\n for (var i = 0; i < neighbors.length; i += 1) {\n var neighbor = idx2Node[neighbors[i]];\n\n if (neighbor === start) {\n var cycle = {};\n\n for (var index = 1; index < path.length; index += 1) {\n cycle[path[index - 1].id] = path[index];\n }\n\n if (path.length) {\n cycle[path[path.length - 1].id] = path[0];\n }\n\n allCycles.push(cycle);\n closed = true;\n } else if (!blocked.has(neighbor)) {\n if (circuit(neighbor, start, adjList)) {\n closed = true;\n }\n }\n }\n\n if (closed) {\n unblock(node);\n } else {\n for (var i = 0; i < neighbors.length; i += 1) {\n var neighbor = idx2Node[neighbors[i]];\n\n if (!B[neighbor.id].has(node)) {\n B[neighbor.id].add(node);\n }\n }\n }\n\n path.pop();\n return closed;\n };\n\n var _a = graphData.nodes,\n nodes = _a === void 0 ? [] : _a; // Johnson's algorithm 要求给节点赋顺序,先按节点在数组中的顺序\n\n for (var i = 0; i < nodes.length; i += 1) {\n var node = nodes[i];\n var nodeId = node.id;\n node2Idx[nodeId] = i;\n idx2Node[i] = node;\n } // 如果有指定包含的节点,则把指定节点排序在前,以便提早结束搜索\n\n\n if (nodeIds && include) {\n var _loop_2 = function _loop_2(i) {\n var nodeId = nodeIds[i];\n node2Idx[nodes[i].id] = node2Idx[nodeId];\n node2Idx[nodeId] = 0;\n idx2Node[0] = nodes.find(function (node) {\n return node.id === nodeId;\n });\n idx2Node[node2Idx[nodes[i].id]] = nodes[i];\n };\n\n for (var i = 0; i < nodeIds.length; i++) {\n _loop_2(i);\n }\n } // 返回 节点顺序 >= nodeOrder 的强连通分量的adjList\n\n\n var getMinComponentAdj = function getMinComponentAdj(components) {\n var _a;\n\n var minCompIdx;\n var minIdx = Infinity; // Find least component and the lowest node\n\n for (var i = 0; i < components.length; i += 1) {\n var comp = components[i];\n\n for (var j = 0; j < comp.length; j++) {\n var nodeIdx_1 = node2Idx[comp[j].id];\n\n if (nodeIdx_1 < minIdx) {\n minIdx = nodeIdx_1;\n minCompIdx = i;\n }\n }\n }\n\n var component = components[minCompIdx];\n var adjList = [];\n\n for (var i = 0; i < component.length; i += 1) {\n var node = component[i];\n adjList[node.id] = [];\n\n for (var _i = 0, _b = getNeighbors(node.id, graphData.edges, 'target').filter(function (n) {\n return component.map(function (c) {\n return c.id;\n }).indexOf(n) > -1;\n }); _i < _b.length; _i++) {\n var neighbor = _b[_i]; // 对自环情况 (点连向自身) 特殊处理:记录自环,但不加入adjList\n\n if (neighbor === node.id && !(include === false && nodeIds.indexOf(node.id) > -1)) {\n allCycles.push((_a = {}, _a[node.id] = node, _a));\n } else {\n adjList[node.id].push(node2Idx[neighbor]);\n }\n }\n }\n\n return {\n component: component,\n adjList: adjList,\n minIdx: minIdx\n };\n };\n\n var nodeIdx = 0;\n\n while (nodeIdx < nodes.length) {\n var subgraphNodes = nodes.filter(function (n) {\n return node2Idx[n.id] >= nodeIdx;\n });\n var sccs = connected_component_detectStrongConnectComponents({\n nodes: subgraphNodes,\n edges: graphData.edges\n }).filter(function (component) {\n return component.length > 1;\n });\n if (sccs.length === 0) break;\n var scc = getMinComponentAdj(sccs);\n var minIdx = scc.minIdx,\n adjList = scc.adjList,\n component = scc.component;\n\n if (component.length > 1) {\n component.forEach(function (node) {\n B[node.id] = new Set();\n });\n var startNode = idx2Node[minIdx]; // startNode 不在指定要包含的节点中,提前结束搜索\n\n if (nodeIds && include && nodeIds.indexOf(startNode.id) === -1) return allCycles;\n circuit(startNode, startNode, adjList);\n nodeIdx = minIdx + 1;\n } else {\n break;\n }\n }\n\n return allCycles;\n};\n/**\n * 查找图中所有满足要求的圈\n * @param graph\n * @param directed 是否为有向图\n * @param nodeIds 节点 ID 的数组,若不指定,则返回图中所有的圈\n * @param include 包含或排除指定的节点\n * @return [{[key: string]: Node}] 包含所有环的数组,每个环用一个Object表示,其中key为节点id,value为该节点在环中指向的下一个节点\n */\n\nvar detectAllCycles = function detectAllCycles(graphData, directed, nodeIds, include) {\n if (include === void 0) {\n include = true;\n }\n\n if (directed) return detect_cycle_detectAllDirectedCycle(graphData, nodeIds, include);\n return detect_cycle_detectAllUndirectedCycle(graphData, nodeIds, include);\n};\n/* harmony default export */ var detect_cycle = (detect_cycle_detectDirectedCycle);\n// CONCATENATED MODULE: ./node_modules/@antv/algorithm/es/dijkstra.js\n\n\n\n\nvar minVertex = function minVertex(D, nodes, marks) {\n // 找出最小的点\n var minDis = Infinity;\n var minNode;\n\n for (var i = 0; i < nodes.length; i++) {\n var nodeId = nodes[i].id;\n\n if (!marks[nodeId] && D[nodeId] <= minDis) {\n minDis = D[nodeId];\n minNode = nodes[i];\n }\n }\n\n return minNode;\n};\n\nvar dijkstra_dijkstra = function dijkstra(graphData, source, directed, weightPropertyName) {\n var _a = graphData.nodes,\n nodes = _a === void 0 ? [] : _a,\n _b = graphData.edges,\n edges = _b === void 0 ? [] : _b;\n var nodeIds = [];\n var marks = {};\n var D = {};\n var prevs = {}; // key: 顶点, value: 顶点的前驱点数组(可能有多条等长的最短路径)\n\n nodes.forEach(function (node, i) {\n var id = node.id;\n nodeIds.push(id);\n D[id] = Infinity;\n if (id === source) D[id] = 0;\n });\n var nodeNum = nodes.length;\n\n var _loop_1 = function _loop_1(i) {\n // Process the vertices\n var minNode = minVertex(D, nodes, marks);\n var minNodeId = minNode.id;\n marks[minNodeId] = true;\n if (D[minNodeId] === Infinity) return \"continue\"; // Unreachable vertices cannot be the intermediate point\n\n var relatedEdges = [];\n if (directed) relatedEdges = getOutEdgesNodeId(minNodeId, edges);else relatedEdges = getEdgesByNodeId(minNodeId, edges);\n relatedEdges.forEach(function (edge) {\n var edgeTarget = edge.target;\n var edgeSource = edge.source;\n var w = edgeTarget === minNodeId ? edgeSource : edgeTarget;\n var weight = weightPropertyName && edge[weightPropertyName] ? edge[weightPropertyName] : 1;\n\n if (D[w] > D[minNode.id] + weight) {\n D[w] = D[minNode.id] + weight;\n prevs[w] = [minNode.id];\n } else if (D[w] === D[minNode.id] + weight) {\n prevs[w].push(minNode.id);\n }\n });\n };\n\n for (var i = 0; i < nodeNum; i++) {\n _loop_1(i);\n }\n\n prevs[source] = [source]; // 每个节点存可能存在多条最短路径\n\n var paths = {};\n\n for (var target in D) {\n if (D[target] !== Infinity) {\n findAllPaths(source, target, prevs, paths);\n }\n } // 兼容之前单路径\n\n\n var path = {};\n\n for (var target in paths) {\n path[target] = paths[target][0];\n }\n\n return {\n length: D,\n path: path,\n allPath: paths\n };\n};\n\n/* harmony default export */ var es_dijkstra = (dijkstra_dijkstra);\n\nfunction findAllPaths(source, target, prevs, foundPaths) {\n if (source === target) {\n return [source];\n }\n\n if (foundPaths[target]) {\n return foundPaths[target];\n }\n\n var paths = [];\n\n for (var _i = 0, _a = prevs[target]; _i < _a.length; _i++) {\n var prev = _a[_i];\n var prevPaths = findAllPaths(source, prev, prevs, foundPaths);\n if (!prevPaths) return;\n\n for (var _b = 0, prevPaths_1 = prevPaths; _b < prevPaths_1.length; _b++) {\n var prePath = prevPaths_1[_b];\n if (Object(esm[\"isArray\"])(prePath)) paths.push(Object(tslib_es6[\"__spreadArray\"])(Object(tslib_es6[\"__spreadArray\"])([], prePath), [target]));else paths.push([prePath, target]);\n }\n }\n\n foundPaths[target] = paths;\n return foundPaths[target];\n}\n// CONCATENATED MODULE: ./node_modules/@antv/algorithm/es/find-path.js\n\n\nvar find_path_findShortestPath = function findShortestPath(graphData, start, end, directed, weightPropertyName) {\n var _a = es_dijkstra(graphData, start, directed, weightPropertyName),\n length = _a.length,\n path = _a.path,\n allPath = _a.allPath;\n\n return {\n length: length[end],\n path: path[end],\n allPath: allPath[end]\n };\n};\nvar find_path_findAllPath = function findAllPath(graphData, start, end, directed) {\n var _a;\n\n if (start === end) return [[start]];\n var _b = graphData.edges,\n edges = _b === void 0 ? [] : _b;\n var visited = [start];\n var isVisited = (_a = {}, _a[start] = true, _a);\n var stack = []; // 辅助栈,用于存储访问过的节点的邻居节点\n\n var allPath = [];\n var neighbors = directed ? getNeighbors(start, edges, 'target') : getNeighbors(start, edges);\n stack.push(neighbors);\n\n while (visited.length > 0 && stack.length > 0) {\n var children = stack[stack.length - 1];\n\n if (children.length) {\n var child = children.shift();\n\n if (child) {\n visited.push(child);\n isVisited[child] = true;\n neighbors = directed ? getNeighbors(child, edges, 'target') : getNeighbors(child, edges);\n stack.push(neighbors.filter(function (neighbor) {\n return !isVisited[neighbor];\n }));\n }\n } else {\n var node = visited.pop();\n isVisited[node] = false;\n stack.pop();\n continue;\n }\n\n if (visited[visited.length - 1] === end) {\n var path = visited.map(function (node) {\n return node;\n });\n allPath.push(path);\n var node = visited.pop();\n isVisited[node] = false;\n stack.pop();\n }\n }\n\n return allPath;\n};\n// CONCATENATED MODULE: ./node_modules/@antv/algorithm/es/floydWarshall.js\n\n\nvar floydWarshall_floydWarshall = function floydWarshall(graphData, directed) {\n var adjacentMatrix = adjacent_matrix(graphData, directed);\n var dist = [];\n var size = adjacentMatrix.length;\n\n for (var i = 0; i < size; i += 1) {\n dist[i] = [];\n\n for (var j = 0; j < size; j += 1) {\n if (i === j) {\n dist[i][j] = 0;\n } else if (adjacentMatrix[i][j] === 0 || !adjacentMatrix[i][j]) {\n dist[i][j] = Infinity;\n } else {\n dist[i][j] = adjacentMatrix[i][j];\n }\n }\n } // floyd\n\n\n for (var k = 0; k < size; k += 1) {\n for (var i = 0; i < size; i += 1) {\n for (var j = 0; j < size; j += 1) {\n if (dist[i][j] > dist[i][k] + dist[k][j]) {\n dist[i][j] = dist[i][k] + dist[k][j];\n }\n }\n }\n }\n\n return dist;\n};\n\n/* harmony default export */ var es_floydWarshall = (floydWarshall_floydWarshall);\n// CONCATENATED MODULE: ./node_modules/@antv/algorithm/es/label-propagation.js\n\n\n/**\n * 标签传播算法\n * @param graphData 图数据\n * @param directed 是否有向图,默认为 false\n * @param weightPropertyName 权重的属性字段\n * @param maxIteration 最大迭代次数\n */\n\nvar label_propagation_labelPropagation = function labelPropagation(graphData, directed, weightPropertyName, maxIteration) {\n if (directed === void 0) {\n directed = false;\n }\n\n if (weightPropertyName === void 0) {\n weightPropertyName = 'weight';\n }\n\n if (maxIteration === void 0) {\n maxIteration = 1000;\n } // the origin data\n\n\n var _a = graphData.nodes,\n nodes = _a === void 0 ? [] : _a,\n _b = graphData.edges,\n edges = _b === void 0 ? [] : _b;\n var clusters = {};\n var nodeMap = {}; // init the clusters and nodeMap\n\n nodes.forEach(function (node, i) {\n var cid = util_uniqueId();\n node.clusterId = cid;\n clusters[cid] = {\n id: cid,\n nodes: [node]\n };\n nodeMap[node.id] = {\n node: node,\n idx: i\n };\n }); // the adjacent matrix of calNodes inside clusters\n\n var adjMatrix = adjacent_matrix(graphData, directed); // the sum of each row in adjacent matrix\n\n var ks = [];\n /**\n * neighbor nodes (id for key and weight for value) for each node\n * neighbors = {\n * id(node_id): { id(neighbor_1_id): weight(weight of the edge), id(neighbor_2_id): weight(weight of the edge), ... },\n * ...\n * }\n */\n\n var neighbors = {};\n adjMatrix.forEach(function (row, i) {\n var k = 0;\n var iid = nodes[i].id;\n neighbors[iid] = {};\n row.forEach(function (entry, j) {\n if (!entry) return;\n k += entry;\n var jid = nodes[j].id;\n neighbors[iid][jid] = entry;\n });\n ks.push(k);\n });\n var iter = 0;\n\n var _loop_1 = function _loop_1() {\n var changed = false;\n nodes.forEach(function (node) {\n var neighborClusters = {};\n Object.keys(neighbors[node.id]).forEach(function (neighborId) {\n var neighborWeight = neighbors[node.id][neighborId];\n var neighborNode = nodeMap[neighborId].node;\n var neighborClusterId = neighborNode.clusterId;\n if (!neighborClusters[neighborClusterId]) neighborClusters[neighborClusterId] = 0;\n neighborClusters[neighborClusterId] += neighborWeight;\n }); // find the cluster with max weight\n\n var maxWeight = -Infinity;\n var bestClusterIds = [];\n Object.keys(neighborClusters).forEach(function (clusterId) {\n if (maxWeight < neighborClusters[clusterId]) {\n maxWeight = neighborClusters[clusterId];\n bestClusterIds = [clusterId];\n } else if (maxWeight === neighborClusters[clusterId]) {\n bestClusterIds.push(clusterId);\n }\n });\n if (bestClusterIds.length === 1 && bestClusterIds[0] === node.clusterId) return;\n var selfClusterIdx = bestClusterIds.indexOf(node.clusterId);\n if (selfClusterIdx >= 0) bestClusterIds.splice(selfClusterIdx, 1);\n\n if (bestClusterIds && bestClusterIds.length) {\n changed = true; // remove from origin cluster\n\n var selfCluster = clusters[node.clusterId];\n var nodeInSelfClusterIdx = selfCluster.nodes.indexOf(node);\n selfCluster.nodes.splice(nodeInSelfClusterIdx, 1); // move the node to the best cluster\n\n var randomIdx = Math.floor(Math.random() * bestClusterIds.length);\n var bestCluster = clusters[bestClusterIds[randomIdx]];\n bestCluster.nodes.push(node);\n node.clusterId = bestCluster.id;\n }\n });\n if (!changed) return \"break\";\n iter++;\n };\n\n while (iter < maxIteration) {\n var state_1 = _loop_1();\n\n if (state_1 === \"break\") break;\n } // delete the empty clusters\n\n\n Object.keys(clusters).forEach(function (clusterId) {\n var cluster = clusters[clusterId];\n\n if (!cluster.nodes || !cluster.nodes.length) {\n delete clusters[clusterId];\n }\n }); // get the cluster edges\n\n var clusterEdges = [];\n var clusterEdgeMap = {};\n edges.forEach(function (edge) {\n var source = edge.source,\n target = edge.target;\n var weight = edge[weightPropertyName] || 1;\n var sourceClusterId = nodeMap[source].node.clusterId;\n var targetClusterId = nodeMap[target].node.clusterId;\n var newEdgeId = sourceClusterId + \"---\" + targetClusterId;\n\n if (clusterEdgeMap[newEdgeId]) {\n clusterEdgeMap[newEdgeId].weight += weight;\n clusterEdgeMap[newEdgeId].count++;\n } else {\n var newEdge = {\n source: sourceClusterId,\n target: targetClusterId,\n weight: weight,\n count: 1\n };\n clusterEdgeMap[newEdgeId] = newEdge;\n clusterEdges.push(newEdge);\n }\n });\n var clustersArray = [];\n Object.keys(clusters).forEach(function (clusterId) {\n clustersArray.push(clusters[clusterId]);\n });\n return {\n clusters: clustersArray,\n clusterEdges: clusterEdges\n };\n};\n\n/* harmony default export */ var label_propagation = (label_propagation_labelPropagation);\n// CONCATENATED MODULE: ./node_modules/@antv/algorithm/es/louvain.js\n\n\nvar getModularity = function getModularity(nodes, adjMatrix, ks, m) {\n var length = adjMatrix.length;\n var param = 2 * m;\n var modularity = 0;\n\n for (var i = 0; i < length; i++) {\n var clusteri = nodes[i].clusterId;\n\n for (var j = 0; j < length; j++) {\n var clusterj = nodes[j].clusterId;\n if (clusteri !== clusterj) continue;\n var entry = adjMatrix[i][j] || 0;\n var ki = ks[i] || 0;\n var kj = ks[j] || 0;\n modularity += entry - ki * kj / param;\n }\n }\n\n modularity *= 1 / param;\n return modularity;\n};\n/**\n * 社区发现 louvain 算法\n * @param graphData 图数据\n * @param directed 是否有向图,默认为 false\n * @param weightPropertyName 权重的属性字段\n * @param threshold\n */\n\n\nvar louvain_louvain = function louvain(graphData, directed, weightPropertyName, threshold) {\n if (directed === void 0) {\n directed = false;\n }\n\n if (weightPropertyName === void 0) {\n weightPropertyName = 'weight';\n }\n\n if (threshold === void 0) {\n threshold = 0.0001;\n } // the origin data\n\n\n var _a = graphData.nodes,\n nodes = _a === void 0 ? [] : _a,\n _b = graphData.edges,\n edges = _b === void 0 ? [] : _b;\n var uniqueId = 1;\n var clusters = {};\n var nodeMap = {}; // init the clusters and nodeMap\n\n nodes.forEach(function (node, i) {\n var cid = String(uniqueId++);\n node.clusterId = cid;\n clusters[cid] = {\n id: cid,\n nodes: [node]\n };\n nodeMap[node.id] = {\n node: node,\n idx: i\n };\n }); // the adjacent matrix of calNodes inside clusters\n\n var adjMatrix = adjacent_matrix(graphData, directed); // the sum of each row in adjacent matrix\n\n var ks = [];\n /**\n * neighbor nodes (id for key and weight for value) for each node\n * neighbors = {\n * id(node_id): { id(neighbor_1_id): weight(weight of the edge), id(neighbor_2_id): weight(weight of the edge), ... },\n * ...\n * }\n */\n\n var neighbors = {}; // the sum of the weights of all edges in the graph\n\n var m = 0;\n adjMatrix.forEach(function (row, i) {\n var k = 0;\n var iid = nodes[i].id;\n neighbors[iid] = {};\n row.forEach(function (entry, j) {\n if (!entry) return;\n k += entry;\n var jid = nodes[j].id;\n neighbors[iid][jid] = entry;\n m += entry;\n });\n ks.push(k);\n });\n m /= 2;\n var totalModularity = Infinity;\n var previousModularity = Infinity;\n var iter = 0;\n\n while (true) {\n // whether to terminate the iterations\n totalModularity = getModularity(nodes, adjMatrix, ks, m);\n if (Math.abs(totalModularity - previousModularity) < threshold || iter > 100) break;\n previousModularity = totalModularity;\n iter++; // pre compute some values for current clusters\n\n Object.keys(clusters).forEach(function (clusterId) {\n // sum of weights of edges to nodes in cluster\n var sumTot = 0;\n edges.forEach(function (edge) {\n var source = edge.source,\n target = edge.target;\n var sourceClusterId = nodeMap[source].node.clusterId;\n var targetClusterId = nodeMap[target].node.clusterId;\n\n if (sourceClusterId === clusterId && targetClusterId !== clusterId || targetClusterId === clusterId && sourceClusterId !== clusterId) {\n sumTot = sumTot + (edge[weightPropertyName] || 1);\n }\n });\n clusters[clusterId].sumTot = sumTot;\n }); // move the nodes to increase the delta modularity\n\n nodes.forEach(function (node, i) {\n var selfCluster = clusters[node.clusterId];\n var bestIncrease = 0;\n var bestCluster;\n var commonParam = ks[i] / (2 * m); // sum of weights of edges from node to nodes in cluster\n\n var kiin = 0;\n var selfClusterNodes = selfCluster.nodes;\n selfClusterNodes.forEach(function (scNode) {\n var scNodeIdx = nodeMap[scNode.id].idx;\n kiin += adjMatrix[i][scNodeIdx] || 0;\n }); // the modurarity for **removing** the node i from the origin cluster of node i\n\n var removeModurarity = kiin - selfCluster.sumTot * commonParam; // the neightbors of the node\n\n var nodeNeighborIds = neighbors[node.id];\n Object.keys(nodeNeighborIds).forEach(function (neighborNodeId) {\n var neighborNode = nodeMap[neighborNodeId].node;\n var neighborClusterId = neighborNode.clusterId; // if the node and the neighbor of node are in the same cluster, reutrn\n\n if (neighborClusterId === node.clusterId) return;\n var neighborCluster = clusters[neighborClusterId];\n var clusterNodes = neighborCluster.nodes; // if the cluster is empty, remove the cluster and return\n\n if (!clusterNodes || !clusterNodes.length) return; // sum of weights of edges from node to nodes in cluster\n\n var neighborClusterKiin = 0;\n clusterNodes.forEach(function (cNode) {\n var cNodeIdx = nodeMap[cNode.id].idx;\n neighborClusterKiin += adjMatrix[i][cNodeIdx] || 0;\n }); // modurarity for **adding** node i into this neighbor cluster\n\n var addModurarity = neighborClusterKiin - neighborCluster.sumTot * commonParam; // the increase modurarity is the difference between addModurarity and removeModurarity\n\n var increase = addModurarity - removeModurarity; // find the best cluster to move node i into\n\n if (increase > bestIncrease) {\n bestIncrease = increase;\n bestCluster = neighborCluster;\n }\n }); // if found a best cluster to move into\n\n if (bestIncrease > 0) {\n bestCluster.nodes.push(node);\n var previousClusterId_1 = node.clusterId;\n node.clusterId = bestCluster.id; // move the node to the best cluster\n\n var nodeInSelfClusterIdx = selfCluster.nodes.indexOf(node); // remove from origin cluster\n\n selfCluster.nodes.splice(nodeInSelfClusterIdx, 1); // update sumTot for clusters\n // sum of weights of edges to nodes in cluster\n\n var neighborClusterSumTot_1 = 0;\n var selfClusterSumTot_1 = 0;\n edges.forEach(function (edge) {\n var source = edge.source,\n target = edge.target;\n var sourceClusterId = nodeMap[source].node.clusterId;\n var targetClusterId = nodeMap[target].node.clusterId;\n\n if (sourceClusterId === bestCluster.id && targetClusterId !== bestCluster.id || targetClusterId === bestCluster.id && sourceClusterId !== bestCluster.id) {\n neighborClusterSumTot_1 = neighborClusterSumTot_1 + (edge[weightPropertyName] || 1);\n }\n\n if (sourceClusterId === previousClusterId_1 && targetClusterId !== previousClusterId_1 || targetClusterId === previousClusterId_1 && sourceClusterId !== previousClusterId_1) {\n selfClusterSumTot_1 = selfClusterSumTot_1 + (edge[weightPropertyName] || 1);\n }\n }); // the nodes of the clusters to move into and remove are changed, update their sumTot\n\n bestCluster.sumTot = neighborClusterSumTot_1;\n selfCluster.sumTot = selfClusterSumTot_1;\n }\n });\n } // delete the empty clusters, assign increasing clusterId\n\n\n var newClusterIdMap = {};\n var clusterIdx = 0;\n Object.keys(clusters).forEach(function (clusterId) {\n var cluster = clusters[clusterId];\n\n if (!cluster.nodes || !cluster.nodes.length) {\n delete clusters[clusterId];\n return;\n }\n\n var newId = String(clusterIdx + 1);\n\n if (newId === clusterId) {\n return;\n }\n\n cluster.id = newId;\n cluster.nodes = cluster.nodes.map(function (item) {\n return {\n id: item.id,\n clusterId: newId\n };\n });\n clusters[newId] = cluster;\n newClusterIdMap[clusterId] = newId;\n delete clusters[clusterId];\n clusterIdx++;\n });\n nodes.forEach(function (node) {\n if (node.clusterId && newClusterIdMap[node.clusterId]) node.clusterId = newClusterIdMap[node.clusterId];\n }); // get the cluster edges\n\n var clusterEdges = [];\n var clusterEdgeMap = {};\n edges.forEach(function (edge) {\n var source = edge.source,\n target = edge.target;\n var weight = edge[weightPropertyName] || 1;\n var sourceClusterId = nodeMap[source].node.clusterId;\n var targetClusterId = nodeMap[target].node.clusterId;\n var newEdgeId = sourceClusterId + \"---\" + targetClusterId;\n\n if (clusterEdgeMap[newEdgeId]) {\n clusterEdgeMap[newEdgeId].weight += weight;\n clusterEdgeMap[newEdgeId].count++;\n } else {\n var newEdge = {\n source: sourceClusterId,\n target: targetClusterId,\n weight: weight,\n count: 1\n };\n clusterEdgeMap[newEdgeId] = newEdge;\n clusterEdges.push(newEdge);\n }\n });\n var clustersArray = [];\n Object.keys(clusters).forEach(function (clusterId) {\n clustersArray.push(clusters[clusterId]);\n });\n return {\n clusters: clustersArray,\n clusterEdges: clusterEdges\n };\n};\n\n/* harmony default export */ var es_louvain = (louvain_louvain);\n// CONCATENATED MODULE: ./node_modules/@antv/algorithm/es/structs/union-find.js\n/**\n * 并查集 Disjoint set to support quick union\n */\nvar UnionFind =\n/** @class */\nfunction () {\n function UnionFind(items) {\n this.count = items.length;\n this.parent = {};\n\n for (var _i = 0, items_1 = items; _i < items_1.length; _i++) {\n var i = items_1[_i];\n this.parent[i] = i;\n }\n } // find the root of the item\n\n\n UnionFind.prototype.find = function (item) {\n while (this.parent[item] !== item) {\n item = this.parent[item];\n }\n\n return item;\n };\n\n UnionFind.prototype.union = function (a, b) {\n var rootA = this.find(a);\n var rootB = this.find(b);\n if (rootA === rootB) return; // make the element with smaller root the parent\n\n if (rootA < rootB) {\n if (this.parent[b] !== b) this.union(this.parent[b], a);\n this.parent[b] = this.parent[a];\n } else {\n if (this.parent[a] !== a) this.union(this.parent[a], b);\n this.parent[a] = this.parent[b];\n }\n }; // whether a and b are connected, i.e. a and b have the same root\n\n\n UnionFind.prototype.connected = function (a, b) {\n return this.find(a) === this.find(b);\n };\n\n return UnionFind;\n}();\n\n/* harmony default export */ var union_find = (UnionFind);\n// CONCATENATED MODULE: ./node_modules/@antv/algorithm/es/structs/binary-heap.js\nvar defaultCompare = function defaultCompare(a, b) {\n return a - b;\n};\n\nvar MinBinaryHeap =\n/** @class */\nfunction () {\n function MinBinaryHeap(compareFn) {\n if (compareFn === void 0) {\n compareFn = defaultCompare;\n }\n\n this.compareFn = compareFn;\n this.list = [];\n }\n\n MinBinaryHeap.prototype.getLeft = function (index) {\n return 2 * index + 1;\n };\n\n MinBinaryHeap.prototype.getRight = function (index) {\n return 2 * index + 2;\n };\n\n MinBinaryHeap.prototype.getParent = function (index) {\n if (index === 0) {\n return null;\n }\n\n return Math.floor((index - 1) / 2);\n };\n\n MinBinaryHeap.prototype.isEmpty = function () {\n return this.list.length <= 0;\n };\n\n MinBinaryHeap.prototype.top = function () {\n return this.isEmpty() ? undefined : this.list[0];\n };\n\n MinBinaryHeap.prototype.delMin = function () {\n var top = this.top();\n var bottom = this.list.pop();\n\n if (this.list.length > 0) {\n this.list[0] = bottom;\n this.moveDown(0);\n }\n\n return top;\n };\n\n MinBinaryHeap.prototype.insert = function (value) {\n if (value !== null) {\n this.list.push(value);\n var index = this.list.length - 1;\n this.moveUp(index);\n return true;\n }\n\n return false;\n };\n\n MinBinaryHeap.prototype.moveUp = function (index) {\n var parent = this.getParent(index);\n\n while (index && index > 0 && this.compareFn(this.list[parent], this.list[index]) > 0) {\n // swap\n var tmp = this.list[parent];\n this.list[parent] = this.list[index];\n this.list[index] = tmp; // [this.list[index], this.list[parent]] = [this.list[parent], this.list[index]]\n\n index = parent;\n parent = this.getParent(index);\n }\n };\n\n MinBinaryHeap.prototype.moveDown = function (index) {\n var _a;\n\n var element = index;\n var left = this.getLeft(index);\n var right = this.getRight(index);\n var size = this.list.length;\n\n if (left !== null && left < size && this.compareFn(this.list[element], this.list[left]) > 0) {\n element = left;\n } else if (right !== null && right < size && this.compareFn(this.list[element], this.list[right]) > 0) {\n element = right;\n }\n\n if (index !== element) {\n _a = [this.list[element], this.list[index]], this.list[index] = _a[0], this.list[element] = _a[1];\n this.moveDown(element);\n }\n };\n\n return MinBinaryHeap;\n}();\n\n/* harmony default export */ var binary_heap = (MinBinaryHeap);\n// CONCATENATED MODULE: ./node_modules/@antv/algorithm/es/mts.js\n\n\n\n/**\n * Prim algorithm,use priority queue,复杂度 O(E+V*logV), V: 节点数量,E: 边的数量\n * refer: https://en.wikipedia.org/wiki/Prim%27s_algorithm\n * @param graph\n * @param weight 指定用于作为边权重的属性,若不指定,则认为所有边权重一致\n */\n\nvar mts_primMST = function primMST(graphData, weight) {\n var selectedEdges = [];\n var _a = graphData.nodes,\n nodes = _a === void 0 ? [] : _a,\n _b = graphData.edges,\n edges = _b === void 0 ? [] : _b;\n\n if (nodes.length === 0) {\n return selectedEdges;\n } // 从nodes[0]开始\n\n\n var currNode = nodes[0];\n var visited = new Set();\n visited.add(currNode); // 用二叉堆维护距已加入节点的其他节点的边的权值\n\n var compareWeight = function compareWeight(a, b) {\n if (weight) {\n return a.weight - b.weight;\n }\n\n return 0;\n };\n\n var edgeQueue = new binary_heap(compareWeight);\n getEdgesByNodeId(currNode.id, edges).forEach(function (edge) {\n edgeQueue.insert(edge);\n });\n\n while (!edgeQueue.isEmpty()) {\n // 选取与已加入的结点之间边权最小的结点\n var currEdge = edgeQueue.delMin();\n var source = currEdge.source;\n var target = currEdge.target;\n if (visited.has(source) && visited.has(target)) continue;\n selectedEdges.push(currEdge);\n\n if (!visited.has(source)) {\n visited.add(source);\n getEdgesByNodeId(source, edges).forEach(function (edge) {\n edgeQueue.insert(edge);\n });\n }\n\n if (!visited.has(target)) {\n visited.add(target);\n getEdgesByNodeId(target, edges).forEach(function (edge) {\n edgeQueue.insert(edge);\n });\n }\n }\n\n return selectedEdges;\n};\n/**\n * Kruskal algorithm,复杂度 O(E*logE), E: 边的数量\n * refer: https://en.wikipedia.org/wiki/Kruskal%27s_algorithm\n * @param graph\n * @param weight 指定用于作为边权重的属性,若不指定,则认为所有边权重一致\n * @return IEdge[] 返回构成MST的边的数组\n */\n\n\nvar mts_kruskalMST = function kruskalMST(graphData, weight) {\n var selectedEdges = [];\n var _a = graphData.nodes,\n nodes = _a === void 0 ? [] : _a,\n _b = graphData.edges,\n edges = _b === void 0 ? [] : _b;\n\n if (nodes.length === 0) {\n return selectedEdges;\n } // 若指定weight,则将所有的边按权值从小到大排序\n\n\n var weightEdges = edges.map(function (edge) {\n return edge;\n });\n\n if (weight) {\n weightEdges.sort(function (a, b) {\n return a.weight - b.weight;\n });\n }\n\n var disjointSet = new union_find(nodes.map(function (n) {\n return n.id;\n })); // 从权值最小的边开始,如果这条边连接的两个节点于图G中不在同一个连通分量中,则添加这条边\n // 直到遍历完所有点或边\n\n while (weightEdges.length > 0) {\n var curEdge = weightEdges.shift();\n var source = curEdge.source;\n var target = curEdge.target;\n\n if (!disjointSet.connected(source, target)) {\n selectedEdges.push(curEdge);\n disjointSet.union(source, target);\n }\n }\n\n return selectedEdges;\n};\n/**\n * 最小生成树\n * refer: https://en.wikipedia.org/wiki/Kruskal%27s_algorithm\n * @param graph\n * @param weight 指定用于作为边权重的属性,若不指定,则认为所有边权重一致\n * @param algo 'prim' | 'kruskal' 算法类型\n * @return EdgeConfig[] 返回构成MST的边的数组\n */\n\n\nvar minimumSpanningTree = function minimumSpanningTree(graphData, weight, algo) {\n var algos = {\n prim: mts_primMST,\n kruskal: mts_kruskalMST\n };\n if (!algo) return mts_kruskalMST(graphData, weight);\n return algos[algo](graphData, weight);\n};\n\n/* harmony default export */ var mts = (minimumSpanningTree);\n// CONCATENATED MODULE: ./node_modules/@antv/algorithm/es/pageRank.js\n\n\n/**\n * PageRank https://en.wikipedia.org/wiki/PageRank\n * refer: https://github.com/anvaka/ngraph.pagerank\n * @param graph\n * @param epsilon 判断是否收敛的精度值,默认 0.000001\n * @param linkProb 阻尼系数(dumping factor),指任意时刻,用户访问到某节点后继续访问该节点链接的下一个节点的概率,经验值 0.85\n */\n\nvar pageRank_pageRank = function pageRank(graphData, epsilon, linkProb) {\n if (typeof epsilon !== 'number') epsilon = 0.000001;\n if (typeof linkProb !== 'number') linkProb = 0.85;\n var distance = 1;\n var leakedRank = 0;\n var maxIterations = 1000;\n var _a = graphData.nodes,\n nodes = _a === void 0 ? [] : _a,\n _b = graphData.edges,\n edges = _b === void 0 ? [] : _b;\n var nodesCount = nodes.length;\n var currentRank;\n var curRanks = {};\n var prevRanks = {}; // Initialize pageranks 初始化\n\n for (var j = 0; j < nodesCount; ++j) {\n var node = nodes[j];\n var nodeId = node.id;\n curRanks[nodeId] = 1 / nodesCount;\n prevRanks[nodeId] = 1 / nodesCount;\n }\n\n var nodeDegree = es_degree(graphData);\n\n while (maxIterations > 0 && distance > epsilon) {\n leakedRank = 0;\n\n for (var j = 0; j < nodesCount; ++j) {\n var node = nodes[j];\n var nodeId = node.id;\n currentRank = 0;\n\n if (nodeDegree[node.id].inDegree === 0) {\n curRanks[nodeId] = 0;\n } else {\n var neighbors = getNeighbors(nodeId, edges, 'source');\n\n for (var i = 0; i < neighbors.length; ++i) {\n var neighbor = neighbors[i];\n var outDegree = nodeDegree[neighbor].outDegree;\n if (outDegree > 0) currentRank += prevRanks[neighbor] / outDegree;\n }\n\n curRanks[nodeId] = linkProb * currentRank;\n leakedRank += curRanks[nodeId];\n }\n }\n\n leakedRank = (1 - leakedRank) / nodesCount;\n distance = 0;\n\n for (var j = 0; j < nodesCount; ++j) {\n var node = nodes[j];\n var nodeId = node.id;\n currentRank = curRanks[nodeId] + leakedRank;\n distance += Math.abs(currentRank - prevRanks[nodeId]);\n prevRanks[nodeId] = currentRank;\n }\n\n maxIterations -= 1;\n }\n\n return prevRanks;\n};\n\n/* harmony default export */ var es_pageRank = (pageRank_pageRank);\n// CONCATENATED MODULE: ./node_modules/@antv/algorithm/es/gSpan/struct.js\nvar VACANT_EDGE_ID = -1;\nvar VACANT_NODE_ID = -1;\nvar VACANT_EDGE_LABEL = \"-1\";\nvar VACANT_NODE_LABEL = \"-1\";\nvar VACANT_GRAPH_ID = -1;\nvar AUTO_EDGE_ID = \"-1\";\n\nvar struct_Edge =\n/** @class */\nfunction () {\n function Edge(id, from, to, label) {\n if (id === void 0) {\n id = VACANT_EDGE_ID;\n }\n\n if (from === void 0) {\n from = VACANT_NODE_ID;\n }\n\n if (to === void 0) {\n to = VACANT_NODE_ID;\n }\n\n if (label === void 0) {\n label = VACANT_EDGE_LABEL;\n }\n\n this.id = id;\n this.from = from;\n this.to = to;\n this.label = label;\n }\n\n return Edge;\n}();\n\n\n\nvar struct_Node =\n/** @class */\nfunction () {\n function Node(id, label) {\n if (id === void 0) {\n id = VACANT_NODE_ID;\n }\n\n if (label === void 0) {\n label = VACANT_NODE_LABEL;\n }\n\n this.id = id;\n this.label = label;\n this.edges = [];\n this.edgeMap = {};\n }\n\n Node.prototype.addEdge = function (edge) {\n this.edges.push(edge);\n this.edgeMap[edge.id] = edge;\n };\n\n return Node;\n}();\n\n\n\nvar struct_Graph =\n/** @class */\nfunction () {\n function Graph(id, edgeIdAutoIncrease, directed) {\n if (id === void 0) {\n id = VACANT_NODE_ID;\n }\n\n if (edgeIdAutoIncrease === void 0) {\n edgeIdAutoIncrease = true;\n }\n\n if (directed === void 0) {\n directed = false;\n }\n\n this.id = id;\n this.edgeIdAutoIncrease = edgeIdAutoIncrease;\n this.edges = [];\n this.nodes = [];\n this.nodeMap = {};\n this.edgeMap = {};\n this.nodeLabelMap = {};\n this.edgeLabelMap = {};\n this.counter = 0;\n this.directed = directed;\n }\n\n Graph.prototype.getNodeNum = function () {\n return this.nodes.length;\n };\n\n Graph.prototype.addNode = function (id, label) {\n if (this.nodeMap[id]) return;\n var node = new struct_Node(id, label);\n this.nodes.push(node);\n this.nodeMap[id] = node;\n if (!this.nodeLabelMap[label]) this.nodeLabelMap[label] = [];\n this.nodeLabelMap[label].push(id);\n };\n\n Graph.prototype.addEdge = function (id, from, to, label) {\n if (this.edgeIdAutoIncrease || id === undefined) id = this.counter++;\n if (this.nodeMap[from] && this.nodeMap[to] && this.nodeMap[to].edgeMap[id]) return;\n var edge = new struct_Edge(id, from, to, label);\n this.edges.push(edge);\n this.edgeMap[id] = edge;\n this.nodeMap[from].addEdge(edge);\n if (!this.edgeLabelMap[label]) this.edgeLabelMap[label] = [];\n this.edgeLabelMap[label].push(edge);\n\n if (!this.directed) {\n var rEdge = new struct_Edge(id, to, from, label);\n this.nodeMap[to].addEdge(rEdge);\n this.edgeLabelMap[label].push(rEdge);\n }\n };\n\n return Graph;\n}();\n\n\n// CONCATENATED MODULE: ./node_modules/@antv/algorithm/es/gSpan/gSpan.js\n\n\n\nvar gSpan_DFSedge =\n/** @class */\nfunction () {\n function DFSedge(fromNode, toNode, fromNodeLabel, edgeLabel, toNodeLabel) {\n this.fromNode = fromNode;\n this.toNode = toNode;\n this.nodeEdgeNodeLabel = {\n nodeLabel1: fromNodeLabel || VACANT_NODE_LABEL,\n edgeLabel: edgeLabel || VACANT_EDGE_LABEL,\n nodeLabel2: toNodeLabel || VACANT_NODE_LABEL\n };\n }\n\n DFSedge.prototype.equalTo = function (other) {\n return this.fromNode === other.formNode && this.toNode === other.toNode && this.nodeEdgeNodeLabel === other.nodeEdgeNodeLabel;\n };\n\n DFSedge.prototype.notEqualTo = function (other) {\n return !this.equalTo(other);\n };\n\n return DFSedge;\n}(); // DFScode 是 DESedge 的数组\n\n\nvar gSpan_DFScode =\n/** @class */\nfunction () {\n function DFScode() {\n this.rmpath = [];\n this.dfsEdgeList = [];\n }\n\n DFScode.prototype.equalTo = function (other) {\n var aLength = this.dfsEdgeList.length;\n var bLength = other.length;\n if (aLength !== bLength) return false;\n\n for (var i = 0; i < aLength; i++) {\n if (this.dfsEdgeList[i] !== other[i]) return false;\n }\n\n return true;\n };\n\n DFScode.prototype.notEqualTo = function (other) {\n return !this.equalTo(other);\n };\n /** 增加一条 edge 到 DFScode */\n\n\n DFScode.prototype.pushBack = function (fromNode, toNode, fromNodeLabel, edgeLabel, toNodeLabel) {\n this.dfsEdgeList.push(new gSpan_DFSedge(fromNode, toNode, fromNodeLabel, edgeLabel, toNodeLabel));\n return this.dfsEdgeList;\n };\n /** 根据 dfs 构建图 */\n\n\n DFScode.prototype.toGraph = function (graphId, directed) {\n if (graphId === void 0) {\n graphId = VACANT_GRAPH_ID;\n }\n\n if (directed === void 0) {\n directed = false;\n }\n\n var graph = new struct_Graph(graphId, true, directed);\n this.dfsEdgeList.forEach(function (dfsEdge) {\n var fromNodeId = dfsEdge.fromNode;\n var toNodeId = dfsEdge.toNode;\n var _a = dfsEdge.nodeEdgeNodeLabel,\n nodeLabel1 = _a.nodeLabel1,\n edgeLabel = _a.edgeLabel,\n nodeLabel2 = _a.nodeLabel2;\n if (nodeLabel1 !== VACANT_NODE_LABEL) graph.addNode(fromNodeId, nodeLabel1);\n if (nodeLabel2 !== VACANT_NODE_LABEL) graph.addNode(toNodeId, nodeLabel2);\n if (nodeLabel1 !== VACANT_NODE_LABEL && nodeLabel2 !== nodeLabel1) graph.addEdge(undefined, fromNodeId, toNodeId, edgeLabel);\n });\n return graph;\n }; // 建立 rightmost path\n\n\n DFScode.prototype.buildRmpath = function () {\n this.rmpath = [];\n var oldFrom = undefined;\n var selfLength = this.dfsEdgeList.length;\n\n for (var i = selfLength - 1; i >= 0; i--) {\n var dfsEdge = this.dfsEdgeList[i];\n var fromNodeIdx = dfsEdge.fromNode;\n var toNodeIdx = dfsEdge.toNode;\n\n if (fromNodeIdx < toNodeIdx && (oldFrom === undefined || toNodeIdx === oldFrom)) {\n this.rmpath.push(i);\n oldFrom = fromNodeIdx;\n }\n }\n\n return this.rmpath;\n };\n\n DFScode.prototype.getNodeNum = function () {\n var nodeMap = {};\n this.dfsEdgeList.forEach(function (dfsEdge) {\n if (!nodeMap[dfsEdge.fromNode]) nodeMap[dfsEdge.fromNode] = true;\n if (!nodeMap[dfsEdge.toNode]) nodeMap[dfsEdge.toNode] = true;\n });\n return Object.keys(nodeMap).length;\n };\n\n return DFScode;\n}();\n\nvar History =\n/** @class */\nfunction () {\n function History(pdfs) {\n this.his = {};\n this.nodesUsed = {};\n this.edgesUsed = {};\n this.edges = [];\n if (!pdfs) return;\n\n while (pdfs) {\n var e = pdfs.edge;\n this.edges.push(e);\n this.nodesUsed[e.from] = 1;\n this.nodesUsed[e.to] = 1;\n this.edgesUsed[e.id] = 1;\n pdfs = pdfs.preNode;\n } // 倒序\n\n\n this.edges = this.edges.reverse();\n }\n\n History.prototype.hasNode = function (node) {\n return this.nodesUsed[node.id] === 1;\n };\n\n History.prototype.hasEdge = function (edge) {\n return this.edgesUsed[edge.id] === 1;\n };\n\n return History;\n}();\n\nvar gSpan_GSpan =\n/** @class */\nfunction () {\n function GSpan(_a) {\n var graphs = _a.graphs,\n _b = _a.minSupport,\n minSupport = _b === void 0 ? 2 : _b,\n _c = _a.minNodeNum,\n minNodeNum = _c === void 0 ? 1 : _c,\n _d = _a.maxNodeNum,\n maxNodeNum = _d === void 0 ? 4 : _d,\n _e = _a.top,\n top = _e === void 0 ? 10 : _e,\n _f = _a.directed,\n directed = _f === void 0 ? false : _f,\n _g = _a.verbose,\n verbose = _g === void 0 ? false : _g; // -------- 第零步,初始化-------\n\n this.graphs = graphs;\n this.dfsCode = new gSpan_DFScode();\n this.support = 0;\n this.frequentSize1Subgraphs = [];\n this.frequentSubgraphs = [];\n this.minSupport = minSupport;\n this.top = top;\n this.directed = directed;\n this.counter = 0; // TODO? timestamp = {}\n\n this.maxNodeNum = maxNodeNum;\n this.minNodeNum = minNodeNum;\n this.verbose = verbose;\n if (this.maxNodeNum < this.minNodeNum) this.maxNodeNum = this.minNodeNum;\n this.reportDF = []; // matrix\n } // Line 352\n\n\n GSpan.prototype.findForwardRootEdges = function (graph, fromNode) {\n var _this = this;\n\n var result = [];\n var nodeMap = graph.nodeMap;\n fromNode.edges.forEach(function (edge) {\n if (_this.directed || fromNode.label <= nodeMap[edge.to].label) result.push(edge);\n });\n return result;\n };\n\n GSpan.prototype.findBackwardEdge = function (graph, edge1, edge2, history) {\n if (!this.directed && edge1 === edge2) return null;\n var nodeMap = graph.nodeMap;\n var edge2To = nodeMap[edge2.to];\n var edge2ToEdges = edge2To.edges;\n var edgeLength = edge2ToEdges.length;\n\n for (var i = 0; i < edgeLength; i++) {\n var edge = edge2ToEdges[i];\n if (history.hasEdge(edge) || edge.to !== edge1.from) continue;\n\n if (!this.directed) {\n if (edge1.label < edge.label || edge1.label === edge.label && nodeMap[edge1.to].label <= nodeMap[edge2.to].label) {\n return edge;\n }\n } else {\n if (nodeMap[edge1.from].label < nodeMap[edge2.to].label || nodeMap[edge1.from].label === nodeMap[edge2.to].label && edge1.label <= edge.label) {\n return edge;\n }\n }\n }\n\n return null;\n };\n\n GSpan.prototype.findForwardPureEdges = function (graph, rightmostEdge, minNodeLabel, history) {\n var result = [];\n var rightmostEdgeToId = rightmostEdge.to;\n var edges = graph.nodeMap[rightmostEdgeToId].edges;\n var edgeLength = edges.length;\n\n for (var i = 0; i < edgeLength; i++) {\n var edge = edges[i];\n var toNode = graph.nodeMap[edge.to];\n\n if (minNodeLabel <= toNode.label && !history.hasNode(toNode)) {\n result.push(edge);\n }\n }\n\n return result;\n };\n\n GSpan.prototype.findForwardRmpathEdges = function (graph, rightmostEdge, minNodeLabel, history) {\n var result = [];\n var nodeMap = graph.nodeMap;\n var toNodeLabel = nodeMap[rightmostEdge.to].label;\n var fromNode = nodeMap[rightmostEdge.from];\n var edges = fromNode.edges;\n var edgeLength = edges.length;\n\n for (var i = 0; i < edgeLength; i++) {\n var edge = edges[i];\n var newToNodeLabel = nodeMap[edge.to].label;\n\n if (rightmostEdge.to === edge.to || minNodeLabel > newToNodeLabel || history.hasNode(nodeMap[edge.to])) {\n continue;\n }\n\n if (rightmostEdge.label < edge.label || rightmostEdge.label === edge.label && toNodeLabel <= newToNodeLabel) {\n result.push(edge);\n }\n }\n\n return result;\n };\n\n GSpan.prototype.getSupport = function (projected) {\n var graphMap = {};\n projected.forEach(function (pro) {\n if (!graphMap[pro.graphId]) graphMap[pro.graphId] = true;\n });\n return Object.keys(graphMap).length;\n };\n\n GSpan.prototype.findMinLabel = function (obj) {\n var minLabel = undefined;\n Object.keys(obj).forEach(function (nodeEdgeNodeLabel) {\n var _a = obj[nodeEdgeNodeLabel],\n nodeLabel1 = _a.nodeLabel1,\n edgeLabel = _a.edgeLabel,\n nodeLabel2 = _a.nodeLabel2;\n\n if (!minLabel) {\n minLabel = {\n nodeLabel1: nodeLabel1,\n edgeLabel: edgeLabel,\n nodeLabel2: nodeLabel2\n };\n return;\n }\n\n if (nodeLabel1 < minLabel.nodeLabel1 || nodeLabel1 === minLabel.nodeLabel1 && edgeLabel < minLabel.edgeLabel || nodeLabel1 === minLabel.nodeLabel1 && edgeLabel === minLabel.edgeLabel && nodeLabel2 < minLabel.nodeLabel2) {\n minLabel = {\n nodeLabel1: nodeLabel1,\n edgeLabel: edgeLabel,\n nodeLabel2: nodeLabel2\n };\n }\n });\n return minLabel;\n };\n\n GSpan.prototype.isMin = function () {\n var _this = this;\n\n var dfsCode = this.dfsCode;\n if (this.verbose) console.log(\"isMin checking\", dfsCode);\n if (dfsCode.dfsEdgeList.length === 1) return true;\n var directed = this.directed;\n var graph = dfsCode.toGraph(VACANT_GRAPH_ID, directed);\n var nodeMap = graph.nodeMap;\n var dfsCodeMin = new gSpan_DFScode();\n var root = {};\n graph.nodes.forEach(function (node) {\n var forwardEdges = _this.findForwardRootEdges(graph, node);\n\n forwardEdges.forEach(function (edge) {\n var otherNode = nodeMap[edge.to];\n var nodeEdgeNodeLabel = node.label + \"-\" + edge.label + \"-\" + otherNode.label;\n if (!root[nodeEdgeNodeLabel]) root[nodeEdgeNodeLabel] = {\n projected: [],\n nodeLabel1: node.label,\n edgeLabel: edge.label,\n nodeLabel2: otherNode.label\n };\n var pdfs = {\n graphId: graph.id,\n edge: edge,\n preNode: null\n };\n root[nodeEdgeNodeLabel].projected.push(pdfs);\n });\n }); // 比较 root 中每一项的 nodeEdgeNodeLabel 大小,按照 nodeLabel1、edgeLabe、nodeLabel2 的顺序比较\n\n var minLabel = this.findMinLabel(root); // line 419\n\n if (!minLabel) return;\n dfsCodeMin.dfsEdgeList.push(new gSpan_DFSedge(0, 1, minLabel.nodeLabel1, minLabel.edgeLabel, minLabel.nodeLabel2)); // line 423\n\n var projectIsMin = function projectIsMin(projected) {\n // right most path\n var rmpath = dfsCodeMin.buildRmpath();\n var minNodeLabel = dfsCodeMin.dfsEdgeList[0].nodeEdgeNodeLabel.nodeLabel1;\n var maxToC = dfsCodeMin.dfsEdgeList[rmpath[0]].toNode; // node id\n\n var backwardRoot = {};\n var flag = false,\n newTo = 0;\n var end = directed ? -1 : 0; // 遍历到 1 还是到 0\n\n var _loop_1 = function _loop_1(i) {\n if (flag) return \"break\"; // line 435\n\n projected.forEach(function (p) {\n var history = new History(p);\n\n var backwardEdge = _this.findBackwardEdge(graph, history.edges[rmpath[i]], history.edges[rmpath[0]], history);\n\n if (backwardEdge) {\n // Line 441\n if (!backwardRoot[backwardEdge.label]) {\n backwardRoot[backwardEdge.label] = {\n projected: [],\n edgeLabel: backwardEdge.label\n };\n }\n\n backwardRoot[backwardEdge.label].projected.push({\n graphId: graph.id,\n edge: backwardRoot,\n preNode: p\n });\n newTo = dfsCodeMin.dfsEdgeList[rmpath[i]].fromNode;\n flag = true;\n }\n });\n };\n\n for (var i = rmpath.length - 1; i > end; i--) {\n var state_1 = _loop_1(i);\n\n if (state_1 === \"break\") break;\n }\n\n if (flag) {\n var minBackwardEdgeLabel = _this.findMinLabel(backwardRoot);\n\n dfsCodeMin.dfsEdgeList.push(new gSpan_DFSedge(maxToC, newTo, VACANT_NODE_LABEL, minBackwardEdgeLabel.edgeLabel, VACANT_NODE_LABEL));\n var idx_1 = dfsCodeMin.dfsEdgeList.length - 1;\n if (_this.dfsCode.dfsEdgeList[idx_1] !== dfsCodeMin.dfsEdgeList[idx_1]) return false;\n return projectIsMin(backwardRoot[minBackwardEdgeLabel.edgeLabel].projected);\n }\n\n var forwardRoot = {};\n flag = false;\n var newFrom = 0;\n projected.forEach(function (p) {\n var history = new History(p);\n\n var forwardPureEdges = _this.findForwardPureEdges(graph, history.edges[rmpath[0]], minNodeLabel, history);\n\n if (forwardPureEdges.length > 0) {\n flag = true;\n newFrom = maxToC;\n forwardPureEdges.forEach(function (edge) {\n var key = edge.label + \"-\" + nodeMap[edge.to].label;\n if (!forwardRoot[key]) forwardRoot[key] = {\n projected: [],\n edgeLabel: edge.label,\n nodeLabel2: nodeMap[edge.to].label\n };\n forwardRoot[key].projected.push({\n graphId: graph.id,\n edge: edge,\n preNode: p\n });\n });\n }\n });\n var pathLength = rmpath.length;\n\n var _loop_2 = function _loop_2(i) {\n if (flag) return \"break\";\n var value = rmpath[i];\n projected.forEach(function (p) {\n var history = new History(p);\n\n var forwardRmpathEdges = _this.findForwardRmpathEdges(graph, history.edges[value], minNodeLabel, history);\n\n if (forwardRmpathEdges.length > 0) {\n flag = true;\n newFrom = dfsCodeMin.dfsEdgeList[value].fromNode;\n forwardRmpathEdges.forEach(function (edge) {\n var key = edge.label + \"-\" + nodeMap[edge.to].label;\n if (!forwardRoot[key]) forwardRoot[key] = {\n projected: [],\n edgeLabel: edge.label,\n nodeLabel2: nodeMap[edge.to].label\n };\n forwardRoot[key].projected.push({\n graphId: graph.id,\n edge: edge,\n preNode: p\n });\n });\n }\n });\n };\n\n for (var i = 0; i < pathLength; i++) {\n var state_2 = _loop_2(i);\n\n if (state_2 === \"break\") break;\n }\n\n if (!flag) return true;\n\n var forwardMinEdgeNodeLabel = _this.findMinLabel(forwardRoot);\n\n dfsCodeMin.dfsEdgeList.push(new gSpan_DFSedge(newFrom, maxToC + 1, VACANT_NODE_LABEL, forwardMinEdgeNodeLabel.edgeLabel, forwardMinEdgeNodeLabel.nodeLabel2));\n var idx = dfsCodeMin.dfsEdgeList.length - 1;\n if (dfsCode.dfsEdgeList[idx] !== dfsCodeMin.dfsEdgeList[idx]) return false;\n return projectIsMin(forwardRoot[forwardMinEdgeNodeLabel.edgeLabel + \"-\" + forwardMinEdgeNodeLabel.nodeLabel2].projected);\n };\n\n var key = minLabel.nodeLabel1 + \"-\" + minLabel.edgeLabel + \"-\" + minLabel.nodeLabel2;\n return projectIsMin(root[key].projected);\n };\n\n GSpan.prototype.report = function () {\n if (this.dfsCode.getNodeNum() < this.minNodeNum) return;\n this.counter++;\n var graph = this.dfsCode.toGraph(this.counter, this.directed);\n this.frequentSubgraphs.push(Object(esm[\"clone\"])(graph));\n };\n\n GSpan.prototype.subGraphMining = function (projected) {\n var _this = this;\n\n var support = this.getSupport(projected);\n if (support < this.minSupport) return;\n if (!this.isMin()) return;\n this.report();\n var nodeNum = this.dfsCode.getNodeNum();\n var rmpath = this.dfsCode.buildRmpath();\n var maxToC = this.dfsCode.dfsEdgeList[rmpath[0]].toNode;\n var minNodeLabel = this.dfsCode.dfsEdgeList[0].nodeEdgeNodeLabel.nodeLabel1;\n var forwardRoot = {};\n var backwardRoot = {};\n projected.forEach(function (p) {\n var graph = _this.graphs[p.graphId];\n var nodeMap = graph.nodeMap;\n var history = new History(p); // backward Line 526\n\n for (var i = rmpath.length - 1; i >= 0; i--) {\n var backwardEdge = _this.findBackwardEdge(graph, history.edges[rmpath[i]], history.edges[rmpath[0]], history);\n\n if (backwardEdge) {\n var key = _this.dfsCode.dfsEdgeList[rmpath[i]].fromNode + \"-\" + backwardEdge.label;\n if (!backwardRoot[key]) backwardRoot[key] = {\n projected: [],\n toNodeId: _this.dfsCode.dfsEdgeList[rmpath[i]].fromNode,\n edgeLabel: backwardEdge.label\n };\n backwardRoot[key].projected.push({\n graphId: p.graphId,\n edge: backwardEdge,\n preNode: p\n });\n }\n } // pure forward\n\n\n if (nodeNum >= _this.maxNodeNum) return;\n\n var forwardPureEdges = _this.findForwardPureEdges(graph, history.edges[rmpath[0]], minNodeLabel, history);\n\n forwardPureEdges.forEach(function (edge) {\n var key = maxToC + \"-\" + edge.label + \"-\" + nodeMap[edge.to].label;\n if (!forwardRoot[key]) forwardRoot[key] = {\n projected: [],\n fromNodeId: maxToC,\n edgeLabel: edge.label,\n nodeLabel2: nodeMap[edge.to].label\n };\n forwardRoot[key].projected.push({\n graphId: p.graphId,\n edge: edge,\n preNode: p\n });\n });\n\n var _loop_3 = function _loop_3(i) {\n var forwardRmpathEdges = _this.findForwardRmpathEdges(graph, history.edges[rmpath[i]], minNodeLabel, history);\n\n forwardRmpathEdges.forEach(function (edge) {\n var key = _this.dfsCode.dfsEdgeList[rmpath[i]].fromNode + \"-\" + edge.label + \"-\" + nodeMap[edge.to].label;\n if (!forwardRoot[key]) forwardRoot[key] = {\n projected: [],\n fromNodeId: _this.dfsCode.dfsEdgeList[rmpath[i]].fromNode,\n edgeLabel: edge.label,\n nodeLabel2: nodeMap[edge.to].label\n };\n forwardRoot[key].projected.push({\n graphId: p.graphId,\n edge: edge,\n preNode: p\n });\n });\n }; // rmpath forward\n\n\n for (var i = 0; i < rmpath.length; i++) {\n _loop_3(i);\n }\n }); // backward\n\n Object.keys(backwardRoot).forEach(function (key) {\n var _a = backwardRoot[key],\n toNodeId = _a.toNodeId,\n edgeLabel = _a.edgeLabel;\n\n _this.dfsCode.dfsEdgeList.push(new gSpan_DFSedge(maxToC, toNodeId, \"-1\", edgeLabel, \"-1\"));\n\n _this.subGraphMining(backwardRoot[key].projected);\n\n _this.dfsCode.dfsEdgeList.pop();\n }); // forward\n\n Object.keys(forwardRoot).forEach(function (key) {\n var _a = forwardRoot[key],\n fromNodeId = _a.fromNodeId,\n edgeLabel = _a.edgeLabel,\n nodeLabel2 = _a.nodeLabel2;\n\n _this.dfsCode.dfsEdgeList.push(new gSpan_DFSedge(fromNodeId, maxToC + 1, VACANT_NODE_LABEL, edgeLabel, nodeLabel2));\n\n _this.subGraphMining(forwardRoot[key].projected);\n\n _this.dfsCode.dfsEdgeList.pop();\n });\n };\n\n GSpan.prototype.generate1EdgeFrequentSubGraphs = function () {\n var graphs = this.graphs;\n var directed = this.directed;\n var minSupport = this.minSupport;\n var frequentSize1Subgraphs = this.frequentSize1Subgraphs;\n var nodeLabelCounter = {},\n nodeEdgeNodeCounter = {}; // 保存各个图和各自节点的关系 map,key 格式为 graphKey-node类型\n\n var nodeLableCounted = {}; // 保存各个图和各自边的关系 map,key 格式为 graphKey-fromNode类型-edge类型-toNode类型\n\n var nodeEdgeNodeLabelCounted = {};\n Object.keys(graphs).forEach(function (key) {\n // Line 271\n var graph = graphs[key];\n var nodeMap = graph.nodeMap; // 遍历节点,记录对应图 与 每个节点的 label 到 nodeLableCounted\n\n graph.nodes.forEach(function (node, i) {\n // Line 272\n var nodeLabel = node.label;\n var graphNodeKey = key + \"-\" + nodeLabel;\n\n if (!nodeLableCounted[graphNodeKey]) {\n var counter = nodeLabelCounter[nodeLabel] || 0;\n counter++;\n nodeLabelCounter[nodeLabel] = counter;\n }\n\n nodeLableCounted[graphNodeKey] = {\n graphKey: key,\n label: nodeLabel\n }; // 遍历该节点的所有边,记录各个图和各自边的关系到 nodeEdgeNodeLabelCounted. Line 276\n\n node.edges.forEach(function (edge) {\n var nodeLabel1 = nodeLabel;\n var nodeLabel2 = nodeMap[edge.to].label;\n\n if (!directed && nodeLabel1 > nodeLabel2) {\n var tmp = nodeLabel2;\n nodeLabel2 = nodeLabel1;\n nodeLabel1 = tmp;\n }\n\n var edgeLabel = edge.label;\n var graphNodeEdgeNodeKey = key + \"-\" + nodeLabel1 + \"-\" + edgeLabel + \"-\" + nodeLabel2;\n var nodeEdgeNodeKey = nodeLabel1 + \"-\" + edgeLabel + \"-\" + nodeLabel2;\n\n if (!nodeEdgeNodeCounter[nodeEdgeNodeKey]) {\n var counter = nodeEdgeNodeCounter[nodeEdgeNodeKey] || 0;\n counter++;\n nodeEdgeNodeCounter[nodeEdgeNodeKey] = counter; // Line281\n }\n\n nodeEdgeNodeLabelCounted[graphNodeEdgeNodeKey] = {\n graphId: key,\n nodeLabel1: nodeLabel1,\n edgeLabel: edgeLabel,\n nodeLabel2: nodeLabel2\n };\n });\n });\n }); // 计算频繁的节点\n\n Object.keys(nodeLabelCounter).forEach(function (label) {\n var count = nodeLabelCounter[label];\n if (count < minSupport) return;\n var g = {\n nodes: [],\n edges: []\n };\n g.nodes.push({\n id: \"0\",\n label: label\n });\n frequentSize1Subgraphs.push(g); // if (minNodeNum <= 1) reportSize1 TODO\n });\n return frequentSize1Subgraphs;\n };\n\n GSpan.prototype.run = function () {\n var _this = this; // -------- 第一步, _generate_1edge_frequent_subgraphs:频繁的单个节点-------\n\n\n this.frequentSize1Subgraphs = this.generate1EdgeFrequentSubGraphs();\n if (this.maxNodeNum < 2) return;\n var graphs = this.graphs;\n var directed = this.directed; // PDFS 数组的 map Line 304\n\n var root = {};\n Object.keys(graphs).forEach(function (graphId) {\n var graph = graphs[graphId];\n var nodeMap = graph.nodeMap; // Line 306\n\n graph.nodes.forEach(function (node) {\n var forwardRootEdges = _this.findForwardRootEdges(graph, node); // Line 308\n\n\n forwardRootEdges.forEach(function (edge) {\n var toNode = nodeMap[edge.to];\n var nodeEdgeNodeLabel = node.label + \"-\" + edge.label + \"-\" + toNode.label;\n if (!root[nodeEdgeNodeLabel]) root[nodeEdgeNodeLabel] = {\n projected: [],\n nodeLabel1: node.label,\n edgeLabel: edge.label,\n nodeLabel2: toNode.label\n };\n var pdfs = {\n graphId: graphId,\n edge: edge,\n preNode: null\n };\n root[nodeEdgeNodeLabel].projected.push(pdfs);\n });\n });\n }); // Line 313\n\n Object.keys(root).forEach(function (nodeEdgeNodeLabel) {\n var _a = root[nodeEdgeNodeLabel],\n projected = _a.projected,\n nodeLabel1 = _a.nodeLabel1,\n edgeLabel = _a.edgeLabel,\n nodeLabel2 = _a.nodeLabel2;\n\n _this.dfsCode.dfsEdgeList.push(new gSpan_DFSedge(0, 1, nodeLabel1, edgeLabel, nodeLabel2));\n\n _this.subGraphMining(projected);\n\n _this.dfsCode.dfsEdgeList.pop();\n });\n };\n\n return GSpan;\n}();\n\nvar gSpan_formatGraphs = function formatGraphs(graphs, directed, nodeLabelProp, edgeLabelProp) {\n var result = {};\n Object.keys(graphs).forEach(function (key, i) {\n var graph = graphs[key];\n var fGraph = new struct_Graph(i, true, directed);\n var nodeIdxMap = {};\n graph.nodes.forEach(function (node, j) {\n fGraph.addNode(j, node[nodeLabelProp]);\n nodeIdxMap[node.id] = j;\n });\n graph.edges.forEach(function (edge, k) {\n var sourceIdx = nodeIdxMap[edge.source];\n var targetIdx = nodeIdxMap[edge.target];\n fGraph.addEdge(-1, sourceIdx, targetIdx, edge[edgeLabelProp]);\n });\n if (fGraph && fGraph.getNodeNum()) result[fGraph.id] = fGraph;\n });\n return result;\n};\n\nvar toGraphDatas = function toGraphDatas(graphs, nodeLabelProp, edgeLabelProp) {\n var result = [];\n graphs.forEach(function (graph) {\n var graphData = {\n nodes: [],\n edges: []\n };\n graph.nodes.forEach(function (node) {\n var _a;\n\n graphData.nodes.push((_a = {\n id: \"\" + node.id\n }, _a[nodeLabelProp] = node.label, _a));\n });\n graph.edges.forEach(function (edge) {\n var _a;\n\n graphData.edges.push((_a = {\n source: \"\" + edge.from,\n target: \"\" + edge.to\n }, _a[edgeLabelProp] = edge.label, _a));\n });\n result.push(graphData);\n });\n return result;\n};\n\nvar DEFAULT_LABEL_NAME = \"cluster\";\n/**\n * gSpan 频繁子图计算算法(frequent graph mining)\n * @param params 参数\n */\n\nvar gSpan = function gSpan(params) {\n // ------- 将图数据 GraphData 的 map 转换为格式 -------\n var graphs = params.graphs,\n _a = params.directed,\n directed = _a === void 0 ? false : _a,\n _b = params.nodeLabelProp,\n nodeLabelProp = _b === void 0 ? DEFAULT_LABEL_NAME : _b,\n _c = params.edgeLabelProp,\n edgeLabelProp = _c === void 0 ? DEFAULT_LABEL_NAME : _c;\n var formattedGraphs = gSpan_formatGraphs(graphs, directed, nodeLabelProp, edgeLabelProp);\n var minSupport = params.minSupport,\n maxNodeNum = params.maxNodeNum,\n minNodeNum = params.minNodeNum,\n verbose = params.verbose,\n top = params.top; // ------- 初始化与执行算法 -------\n\n var algoParams = {\n graphs: formattedGraphs,\n minSupport: minSupport,\n maxNodeNum: maxNodeNum,\n minNodeNum: minNodeNum,\n top: top,\n verbose: verbose,\n directed: directed\n };\n var calculator = new gSpan_GSpan(algoParams);\n calculator.run();\n var result = toGraphDatas(calculator.frequentSubgraphs, nodeLabelProp, edgeLabelProp);\n return result;\n};\n\n/* harmony default export */ var gSpan_gSpan = (gSpan);\n// CONCATENATED MODULE: ./node_modules/@antv/algorithm/es/gaddi.js\n\n\n\n\n\n/**\n * 为 graphData 中每个节点生成邻居单元数组\n * @param graphData\n * @param spm\n * @param nodeLabelProp\n * @param k k-近邻\n */\n\nvar findKNeighborUnits = function findKNeighborUnits(graphData, spm, nodeLabelProp, k) {\n if (nodeLabelProp === void 0) {\n nodeLabelProp = 'cluster';\n }\n\n if (k === void 0) {\n k = 2;\n }\n\n var units = [];\n var nodes = graphData.nodes;\n spm.forEach(function (row, i) {\n units.push(findKNeighborUnit(nodes, row, i, nodeLabelProp, k));\n });\n return units;\n};\n\nvar findKNeighborUnit = function findKNeighborUnit(nodes, row, i, nodeLabelProp, k) {\n var unitNodeIdxs = [i];\n var neighbors = [];\n var labelCountMap = {};\n row.forEach(function (v, j) {\n if (v <= k && i !== j) {\n unitNodeIdxs.push(j);\n neighbors.push(nodes[j]);\n var label = nodes[j][nodeLabelProp];\n if (!labelCountMap[label]) labelCountMap[label] = {\n count: 1,\n dists: [v]\n };else {\n labelCountMap[label].count++;\n labelCountMap[label].dists.push(v);\n }\n }\n }); // 将 labelCountMap 中的 dists 按照从小到大排序,方便后面使用\n\n Object.keys(labelCountMap).forEach(function (label) {\n labelCountMap[label].dists = labelCountMap[label].dists.sort(function (a, b) {\n return a - b;\n });\n });\n return {\n nodeIdx: i,\n nodeId: nodes[i].id,\n nodeIdxs: unitNodeIdxs,\n neighbors: neighbors,\n neighborNum: unitNodeIdxs.length - 1,\n nodeLabelCountMap: labelCountMap\n };\n};\n/**\n * 随机寻找点对,满足距离小于 k\n * @param k 参数 k,表示 k-近邻\n * @param nodeNum 参数 length\n * @param maxNodePairNum 寻找点对的数量不超过 maxNodePairNum\n * @param spm 最短路径矩阵\n */\n\n\nvar findNodePairsRandomly = function findNodePairsRandomly(k, nodeNum, maxNodePairNum, kNeighborUnits, spm) {\n // 每个节点需要随机找出的点对数\n var nodePairNumEachNode = Math.ceil(maxNodePairNum / nodeNum);\n var nodePairMap = {};\n var foundNodePairCount = 0; // 遍历节点,为每个节点随机找出 nodePairNumEachNode 个点对,满足距离小于 k。找到的点对数量超过 maxNodePairNum 或所有节点遍历结束时终止\n\n kNeighborUnits.forEach(function (unit, i) {\n // 若未达到 nodePairNumEachNode,或循环次数小于最大循环次数(2 * nodeNum),继续循环\n var nodePairForICount = 0;\n var outerLoopCount = 0;\n var neighbors = unit.nodeIdxs; // the first one is the center node\n\n var neighborNum = unit.neighborNum - 1;\n\n while (nodePairForICount < nodePairNumEachNode) {\n // 另一端节点在节点数组中的的 index\n var oidx = neighbors[1 + Math.floor(Math.random() * neighborNum)];\n var innerLoopCount = 0; // 若随机得到的另一端 idx 不符合条件,则继续 random。条件是不是同一个节点、这个点对没有被记录过、距离小于 k\n\n while (nodePairMap[i + \"-\" + oidx] || nodePairMap[oidx + \"-\" + i]) {\n oidx = Math.floor(Math.random() * nodeNum);\n innerLoopCount++;\n if (innerLoopCount > 2 * nodeNum) break; // 循环次数大于最大循环次数(2 * nodeNum)跳出循环,避免死循环\n }\n\n if (innerLoopCount < 2 * nodeNum) {\n // 未达到最大循环次数,说明找到了合适的另一端\n nodePairMap[i + \"-\" + oidx] = {\n start: i,\n end: oidx,\n distance: spm[i][oidx]\n };\n nodePairForICount++;\n foundNodePairCount++; // 如果当前找到的点对数量达到了上限,返回结果\n\n if (foundNodePairCount >= maxNodePairNum) return nodePairMap;\n }\n\n outerLoopCount++;\n if (outerLoopCount > 2 * nodeNum) break; // 循环次数大于最大循环次数(2 * nodeNum)跳出循环,避免死循环\n } // 这个节点没有找到足够 nodePairNumEachNode 的点对。更新 nodePairNumEachNode,让后续节点找更多的点对\n\n\n if (nodePairForICount < nodePairNumEachNode) {\n var gap = nodePairNumEachNode - nodePairForICount;\n nodePairNumEachNode = (nodePairNumEachNode + gap) / (nodeNum - i - 1);\n }\n });\n return nodePairMap;\n};\n/**\n * 计算所有 nodePairMap 中节点对的相交邻居诱导子图\n * @param nodePairMap 节点对 map,key 为 node1.id-node2.id,value 为 { startNodeIdx, endNodeIdx, distance }\n * @param neighborUnits 每个节点的邻居元数组\n * @param graphData 原图数据\n * @param edgeMap 边的 map,方便检索\n * @param cachedInducedGraphMap 缓存的结果,下次进入该函数将继续更新该缓存,若 key 在缓存中存在则不需要重复计算\n */\n\n\nvar getIntersectNeighborInducedGraph = function getIntersectNeighborInducedGraph(nodePairMap, neighborUnits, graphData, cachedInducedGraphMap) {\n var nodes = graphData.nodes;\n if (!cachedInducedGraphMap) cachedInducedGraphMap = {};\n Object.keys(nodePairMap).forEach(function (key) {\n var _a, _b;\n\n if (cachedInducedGraphMap && cachedInducedGraphMap[key]) return;\n cachedInducedGraphMap[key] = {\n nodes: [],\n edges: []\n };\n var pair = nodePairMap[key];\n var startUnitNodeIds = (_a = neighborUnits[pair.start]) === null || _a === void 0 ? void 0 : _a.nodeIdxs;\n var endUnitNodeIds = (_b = neighborUnits[pair.end]) === null || _b === void 0 ? void 0 : _b.nodeIdxs;\n if (!startUnitNodeIds || !endUnitNodeIds) return; // 不存在邻元,返回空图\n\n var endSet = new Set(endUnitNodeIds);\n var intersect = startUnitNodeIds.filter(function (x) {\n return endSet.has(x);\n }); // 可能会爆栈(在 1580 + 6 nodes full-connected 时出现)\n\n if (!intersect || !intersect.length) return; // 没有交集,返回空图\n\n var intersectIdMap = {};\n var intersectLength = intersect.length;\n\n for (var i = 0; i < intersectLength; i++) {\n var node = nodes[intersect[i]];\n cachedInducedGraphMap[key].nodes.push(node); // 将交集中的点加入诱导子图\n\n intersectIdMap[node.id] = true;\n } // 遍历所有边数据,如果边的两端都在交集中,将该边加入诱导子图\n\n\n graphData.edges.forEach(function (edge) {\n if (intersectIdMap[edge.source] && intersectIdMap[edge.target]) cachedInducedGraphMap[key].edges.push(edge);\n });\n });\n return cachedInducedGraphMap;\n};\n/**\n * 计算 strcutre 在 graph 上的匹配数量\n * @param graph 图数据\n * @param structure 目前支持只有两个节点一条边的最简单结构\n * @param nodeLabelProp 节点类型字段名\n * @param edgeLabelProp 边类型字段名\n */\n\n\nvar getMatchedCount = function getMatchedCount(graph, structure, nodeLabelProp, edgeLabelProp) {\n var _a, _b;\n\n var nodeMap = {};\n graph.nodes.forEach(function (node) {\n nodeMap[node.id] = node;\n });\n var count = 0;\n if (!((_a = structure === null || structure === void 0 ? void 0 : structure.edges) === null || _a === void 0 ? void 0 : _a.length) || ((_b = structure === null || structure === void 0 ? void 0 : structure.nodes) === null || _b === void 0 ? void 0 : _b.length) < 2) return 0;\n graph.edges.forEach(function (e) {\n var sourceLabel = nodeMap[e.source][nodeLabelProp];\n var targetLabel = nodeMap[e.target][nodeLabelProp];\n var strNodeLabel1 = structure === null || structure === void 0 ? void 0 : structure.nodes[0][nodeLabelProp];\n var strNodeLabel2 = structure === null || structure === void 0 ? void 0 : structure.nodes[1][nodeLabelProp];\n var strEdgeLabel = structure === null || structure === void 0 ? void 0 : structure.edges[0][edgeLabelProp];\n if (e[edgeLabelProp] !== strEdgeLabel) return;\n\n if (sourceLabel === strNodeLabel1 && targetLabel === strNodeLabel2 || sourceLabel === strNodeLabel2 && targetLabel === strNodeLabel1) {\n count++;\n }\n });\n return count;\n};\n/**\n * structures 中寻找最具有代表性的一个。这个结构是使得 matchedCountMap 的分组方式类内间距最小,类间间距最大\n * @param matchedCountMap 每个 structure 分类后的各图匹配数量,格式 { [strcture.idx]: { [interInducedGraphKey]: count } }\n * @param structureNum strcuture 个数,与 matchedCountMap.length 对应\n * @param structures\n */\n\n\nvar findRepresentStructure = function findRepresentStructure(matchedCountMap, structureNum, structures) {\n var maxOffset = Infinity,\n representClusterType = 0;\n\n var _loop_1 = function _loop_1(i) {\n // 一种分组的 map,key 是 intGraph 的 key,value 是 structures[i] 的匹配个数\n var countMapI = matchedCountMap[i]; // 按照 value 为该组排序,生成 keys 的数组:\n\n var sortedGraphKeys = Object.keys(countMapI).sort(function (a, b) {\n return countMapI[a] - countMapI[b];\n }); // 共 100 个 graphKeys,将 graphKeys 按顺序分为 groupNum 组\n\n var groupNum = 10;\n var clusters = []; // 总共有 groupNum 个项\n\n sortedGraphKeys.forEach(function (key, j) {\n if (!clusters[j % groupNum]) clusters[j % groupNum] = {\n graphs: [],\n totalCount: 0,\n aveCount: 0\n };\n clusters[j % groupNum].graphs.push(key);\n clusters[j % groupNum].totalCount += countMapI[key];\n }); // 计算 cluster 与 cluster 之间的距离 innerDist,每个 cluster 内部的距离 intraDist\n\n var aveIntraDist = 0; // 该类的类内平均值\n\n var aveCounts = []; // 类内平均匹配数量,将用于计算类间距离\n\n clusters.forEach(function (graphsInCluster) {\n // 类内均值\n var aveCount = graphsInCluster.totalCount / graphsInCluster.graphs.length;\n graphsInCluster.aveCount = aveCount;\n aveCounts.push(aveCount); // 对于每类,计算类内间距平均值\n\n var aveIntraPerCluster = 0;\n var graphsNum = graphsInCluster.length;\n graphsInCluster.graphs.forEach(function (graphKey1, j) {\n var graph1Count = countMapI[graphKey1];\n graphsInCluster.graphs.forEach(function (graphKey2, k) {\n if (j === k) return;\n aveIntraPerCluster += Math.abs(graph1Count - countMapI[graphKey2]);\n });\n });\n aveIntraPerCluster /= graphsNum * (graphsNum - 1) / 2;\n aveIntraDist += aveIntraPerCluster;\n });\n aveIntraDist /= clusters.length; // 用类内均值计算类间距\n\n var aveInterDist = 0; // 类间间距平均值\n\n aveCounts.forEach(function (aveCount1, j) {\n aveCounts.forEach(function (aveCount2, k) {\n if (j === k) return;\n aveInterDist += Math.abs(aveCount1 - aveCount2);\n });\n aveInterDist /= aveCounts.length * (aveCounts.length - 1) / 2;\n }); // 寻找 (类间间距均值-类内间距均值) 最大的一种分组方式(对应的 structure 就是最终要找的唯一 DS(G))\n\n var offset = aveInterDist - aveIntraDist;\n\n if (maxOffset < offset) {\n maxOffset = offset;\n representClusterType = i;\n }\n };\n\n for (var i = 0; i < structureNum; i++) {\n _loop_1(i);\n }\n\n return {\n structure: structures[representClusterType],\n structureCountMap: matchedCountMap[representClusterType]\n };\n};\n\nvar getNodeMaps = function getNodeMaps(nodes, nodeLabelProp) {\n var nodeMap = {},\n nodeLabelMap = {};\n nodes.forEach(function (node, i) {\n nodeMap[node.id] = {\n idx: i,\n node: node,\n degree: 0,\n inDegree: 0,\n outDegree: 0\n };\n var label = node[nodeLabelProp];\n if (!nodeLabelMap[label]) nodeLabelMap[label] = [];\n nodeLabelMap[label].push(node);\n });\n return {\n nodeMap: nodeMap,\n nodeLabelMap: nodeLabelMap\n };\n};\n\nvar gaddi_getEdgeMaps = function getEdgeMaps(edges, edgeLabelProp, nodeMap) {\n var edgeMap = {},\n edgeLabelMap = {};\n edges.forEach(function (edge, i) {\n edgeMap[\"\" + util_uniqueId] = {\n idx: i,\n edge: edge\n };\n var label = edge[edgeLabelProp];\n if (!edgeLabelMap[label]) edgeLabelMap[label] = [];\n edgeLabelMap[label].push(edge);\n var sourceNode = nodeMap[edge.source];\n\n if (sourceNode) {\n sourceNode.degree++;\n sourceNode.outDegree++;\n }\n\n var targetNode = nodeMap[edge.target];\n\n if (targetNode) {\n targetNode.degree++;\n targetNode.inDegree++;\n }\n });\n return {\n edgeMap: edgeMap,\n edgeLabelMap: edgeLabelMap\n };\n};\n/**\n * 输出最短路径的 map,key 为 sourceNode.id-targetNode.id,value 为这两个节点的最短路径长度\n * @param nodes\n * @param spm\n * @param directed\n */\n\n\nvar getSpmMap = function getSpmMap(nodes, spm, directed) {\n var length = spm.length;\n var map = {};\n spm.forEach(function (row, i) {\n var start = directed ? 0 : i + 1;\n var iId = nodes[i].id;\n\n for (var j = start; j < length; j++) {\n if (i === j) continue;\n var jId = nodes[j].id;\n var dist = row[j];\n map[iId + \"-\" + jId] = dist;\n if (!directed) map[jId + \"-\" + iId] = dist;\n }\n });\n return map;\n};\n/**\n * 计算一对节点(node1,node2)的 NDS 距离\n * @param graph 原图数据\n * @param node1\n * @param node2\n */\n\n\nvar getNDSDist = function getNDSDist(graph, node1, node2, nodeMap, spDist, kNeighborUnits, structure, nodeLabelProp, edgeLabelProp, cachedNDSMap, cachedInterInducedGraph) {\n var _a;\n\n var key = node1.id + \"-\" + node2.id;\n if (cachedNDSMap && cachedNDSMap[key]) return cachedNDSMap[key];\n var interInducedGraph = cachedInterInducedGraph ? cachedInterInducedGraph[key] : undefined; // 若没有缓存相交邻居诱导子图,计算\n\n if (!interInducedGraph) {\n var pairMap = (_a = {}, _a[key] = {\n start: nodeMap[node1.id].idx,\n end: nodeMap[node2.id].idx,\n distance: spDist\n }, _a);\n cachedInterInducedGraph = getIntersectNeighborInducedGraph(pairMap, kNeighborUnits, graph, cachedInterInducedGraph);\n interInducedGraph = cachedInterInducedGraph[key];\n }\n\n return getMatchedCount(interInducedGraph, structure, nodeLabelProp, edgeLabelProp);\n};\n/**\n * 计算 pattern 上绩点的度数并存储到 minPatternNodeLabelDegreeMap\n */\n\n\nvar stashPatternNodeLabelDegreeMap = function stashPatternNodeLabelDegreeMap(minPatternNodeLabelDegreeMap, neighborLabel, patternNodeMap, patternNodeLabelMap) {\n var _a, _b, _c;\n\n var minPatternNodeLabelDegree = (_a = minPatternNodeLabelDegreeMap[neighborLabel]) === null || _a === void 0 ? void 0 : _a.degree;\n var minPatternNodeLabelInDegree = (_b = minPatternNodeLabelDegreeMap[neighborLabel]) === null || _b === void 0 ? void 0 : _b.inDegree;\n var minPatternNodeLabelOutDegree = (_c = minPatternNodeLabelDegreeMap[neighborLabel]) === null || _c === void 0 ? void 0 : _c.outDegree;\n\n if (minPatternNodeLabelDegreeMap[neighborLabel] === undefined) {\n minPatternNodeLabelDegree = Infinity;\n minPatternNodeLabelInDegree = Infinity;\n minPatternNodeLabelOutDegree = Infinity;\n patternNodeLabelMap[neighborLabel].forEach(function (patternNodeWithLabel) {\n var patternNodeDegree = patternNodeMap[patternNodeWithLabel.id].degree;\n if (minPatternNodeLabelDegree > patternNodeDegree) minPatternNodeLabelDegree = patternNodeDegree;\n var patternNodeInDegree = patternNodeMap[patternNodeWithLabel.id].inDegree;\n if (minPatternNodeLabelInDegree > patternNodeInDegree) minPatternNodeLabelInDegree = patternNodeInDegree;\n var patternNodeOutDegree = patternNodeMap[patternNodeWithLabel.id].outDegree;\n if (minPatternNodeLabelOutDegree > patternNodeOutDegree) minPatternNodeLabelOutDegree = patternNodeOutDegree;\n });\n minPatternNodeLabelDegreeMap[neighborLabel] = {\n degree: minPatternNodeLabelDegree,\n inDegree: minPatternNodeLabelInDegree,\n outDegree: minPatternNodeLabelOutDegree\n };\n }\n\n return {\n minPatternNodeLabelDegree: minPatternNodeLabelDegree,\n minPatternNodeLabelInDegree: minPatternNodeLabelInDegree,\n minPatternNodeLabelOutDegree: minPatternNodeLabelOutDegree\n };\n};\n/**\n * GADDI 模式匹配\n * @param graphData 原图数据\n * @param pattern 搜索图(需要在原图上搜索的模式)数据\n * @param directed 是否计算有向图,默认 false\n * @param k 参数 k,表示 k-近邻\n * @param length 参数 length\n * @param nodeLabelProp 节点数据中代表节点标签(分类信息)的属性名。默认为 cluster\n * @param edgeLabelProp 边数据中代表边标签(分类信息)的属性名。默认为 cluster\n */\n\n\nvar gaddi_GADDI = function GADDI(graphData, pattern, directed, k, length, nodeLabelProp, edgeLabelProp) {\n if (directed === void 0) {\n directed = false;\n }\n\n if (nodeLabelProp === void 0) {\n nodeLabelProp = 'cluster';\n }\n\n if (edgeLabelProp === void 0) {\n edgeLabelProp = 'cluster';\n }\n\n if (!graphData || !graphData.nodes) return; // 分为三步:\n // 0. 预计算:节点/边数,邻接矩阵、最短路径矩阵\n // 1. 处理原图 graphData。再分为 1~5 小步\n // 2. 匹配\n // console.log(\"----- stage-pre: preprocessing -------\");\n // -------- 第零步,预计算:节点/边数,邻接矩阵、最短路径矩阵-------\n\n var nodeNum = graphData.nodes.length;\n if (!nodeNum) return; // console.log(\"----- stage-pre.1: calc shortest path matrix for graph -------\");\n\n var spm = es_floydWarshall(graphData, directed); // console.log(\n // \"----- stage-pre.2: calc shortest path matrix for pattern -------\"\n // );\n\n var patternSpm = es_floydWarshall(pattern, directed); // console.log(\n // \"----- stage-pre.3: calc shortest path matrix map for graph -------\"\n // );\n\n var spmMap = getSpmMap(graphData.nodes, spm, directed); // console.log(\n // \"----- stage-pre.4: calc shortest path matrix map for pattern -------\"\n // );\n\n var patternSpmMap = getSpmMap(pattern.nodes, patternSpm, directed); // console.log(\"----- stage-pre.5: establish maps -------\");\n // 节点的 map,以 id 为 id 映射,方便后续快速检索\n\n var _a = getNodeMaps(graphData.nodes, nodeLabelProp),\n nodeMap = _a.nodeMap,\n nodeLabelMap = _a.nodeLabelMap;\n\n var _b = getNodeMaps(pattern.nodes, nodeLabelProp),\n patternNodeMap = _b.nodeMap,\n patternNodeLabelMap = _b.nodeLabelMap; // 计算节点度数\n\n\n gaddi_getEdgeMaps(graphData.edges, edgeLabelProp, nodeMap);\n var patternEdgeLabelMap = gaddi_getEdgeMaps(pattern.edges, edgeLabelProp, patternNodeMap).edgeLabelMap; // 若未指定 length,自动计算 pattern 半径(最短路径最大值)\n\n var patternSpmSpread = [];\n patternSpm === null || patternSpm === void 0 ? void 0 : patternSpm.forEach(function (row) {\n patternSpmSpread = patternSpmSpread.concat(row);\n });\n if (!length) length = Math.max.apply(Math, Object(tslib_es6[\"__spreadArray\"])(Object(tslib_es6[\"__spreadArray\"])([], patternSpmSpread), [2]));\n if (!k) k = length; // console.log(\"params\", directed, length, k);\n // console.log(\"----- stage-pre.6: calc k neighbor units -------\");\n // 计算每个节点的 k 邻元集合\n\n var kNeighborUnits = findKNeighborUnits(graphData, spm, nodeLabelProp, k);\n var patternKNeighborUnits = findKNeighborUnits(pattern, patternSpm, nodeLabelProp, k); // console.log(\n // \"----- stage0: going to processing graph and find intersect neighbor induced graphs -------\"\n // );\n // console.log(\"----- stage0.1: going to select random node pairs -------\");\n // -------- 第一步,处理原图 graphData-------\n // 1.1. 随机选择最多 100 个点对,满足距离小于 Length 和 k\n // 当 graphData 少于 20 个节点,则不能找出 100 个点对,只找出不多于 n(n-1)/2 个点对\n\n var maxNodePairNum = Math.min(100, nodeNum * (nodeNum - 1) / 2);\n var nodePairsMap = findNodePairsRandomly(k, nodeNum, maxNodePairNum, patternKNeighborUnits, spm); // console.log(\n // \"----- stage0.2: going to calculate intersect neighbor induced graphs -------\"\n // );\n // 1.2. 生成上面节点对的相应相交邻居诱导子图。格式为 {'beginNodeIdx-endNodeIdx': {nodes: [], edges: []}}\n\n var intGMap = getIntersectNeighborInducedGraph(nodePairsMap, kNeighborUnits, graphData); // 1.3. 使用 gSpan 算法(frequent graph mining)计算 ISIntG 的前 10 个频率最高的子结构(3-4条边)\n\n var top = 10,\n minSupport = 1,\n minNodeNum = 1,\n maxNodeNum = 4;\n var params = {\n graphs: intGMap,\n nodeLabelProp: nodeLabelProp,\n edgeLabelProp: edgeLabelProp,\n minSupport: minSupport,\n minNodeNum: minNodeNum,\n maxNodeNum: maxNodeNum,\n directed: directed\n }; // console.log(\n // \"----- stage1: (gSpan) going to find frequent structure dsG -------\"\n // );\n // console.log(\"----- stage1.1: going to run gSpan -------\");\n // 暂时假设生成的 sub structure 都只有一条边\n\n var freStructures = gSpan_gSpan(params).slice(0, top); // structureNum 可能小于 top\n\n var structureNum = freStructures.length; // 1.4. 计算上述 10 个子结构在 intGMap 中每个诱导子图的匹配个数\n\n var matchedCountMap = [];\n freStructures.forEach(function (structure, i) {\n matchedCountMap[i] = {};\n Object.keys(intGMap).forEach(function (key) {\n var graph = intGMap[key];\n var subStructureCount = getMatchedCount(graph, structure, nodeLabelProp, edgeLabelProp);\n matchedCountMap[i][key] = subStructureCount;\n });\n }); // console.log(\n // \"----- stage1.1: going to find the most represent strucutre -------\"\n // );\n // 1.5. 对于每个子结构,根据匹配个数为 intGMap 中的诱导子图分组,生成 structureNum 种分组\n // 计算每种分组的类间距和类内间距,找到类间距最大、类内间距最小的一种分组,这种分组对应的子结构被选为唯一代表性子结构 DS(G)\n\n var _c = findRepresentStructure(matchedCountMap, structureNum, freStructures),\n dsG = _c.structure,\n ndsDist = _c.structureCountMap; // -------- 第二步,匹配-------\n // 2.1 从 Q 中的第一个标签的第一个节点开始,寻找 G 中的匹配\n\n\n var beginPNode = pattern.nodes[0];\n var label = beginPNode[nodeLabelProp]; // 2.1.1 找到 G 中标签与之相同的节点\n\n var candidates = nodeLabelMap[label]; // console.log(\"----- stage2: going to find candidates -------\");\n // 全局缓存,避免重复计算\n\n var minPatternNodeLabelDegreeMap = {}; // key 是 label,value 是该 label 节点的最小度数\n\n var patternIntGraphMap = {},\n patternNDSDist = {},\n // key 为 node.id-node.id\n patternNDSDistMap = {}; // key 为 node.id-label2,value nds距离值数组(按从大到小排序,无需关心具体对应哪个 node2)\n // 2.2.2 对于 Q 中的另一个标签的 k 个节点,计算它们到 node 的最短路径以及 NDS 距离\n\n var patternSpDist = {};\n var patternSpDistBack = {};\n Object.keys(patternNodeLabelMap).forEach(function (label2, j) {\n patternSpDist[label2] = [];\n\n if (directed) {\n patternSpDistBack[label2] = [];\n }\n\n var maxDist = -Infinity;\n var patternNodesWithLabel2 = patternNodeLabelMap[label2];\n var patternNodePairMap = {};\n patternNodesWithLabel2.forEach(function (nodeWithLabel2) {\n var dist = patternSpmMap[beginPNode.id + \"-\" + nodeWithLabel2.id];\n dist && patternSpDist[label2].push(dist);\n if (maxDist < dist) maxDist = dist;\n patternNodePairMap[beginPNode.id + \"-\" + nodeWithLabel2.id] = {\n start: 0,\n end: patternNodeMap[nodeWithLabel2.id].idx,\n distance: dist\n };\n\n if (directed) {\n var distBack = patternSpmMap[nodeWithLabel2.id + \"-\" + beginPNode.id];\n distBack && patternSpDistBack[label2].push(distBack);\n }\n }); // spDist[label2] 按照从小到大排序\n\n patternSpDist[label2] = patternSpDist[label2].sort(function (a, b) {\n return a - b;\n });\n if (directed) patternSpDistBack[label2] = patternSpDistBack[label2].sort(function (a, b) {\n return a - b;\n }); // 计算 Q 中所有 label2 节点到 beginPNode 的 NDS 距离\n // 所有 label2 节点到 beginPNode 的邻居相交诱导子图:\n // key: node1.id-node2.id\n\n patternIntGraphMap = getIntersectNeighborInducedGraph(patternNodePairMap, patternKNeighborUnits, pattern, patternIntGraphMap); // pattern 中 beginNode 到当前 label2 节点 的 NDS 距离(数组,无需关心具体对应到哪个节点)\n\n var currentPatternNDSDistArray = [];\n Object.keys(patternNodePairMap).forEach(function (key) {\n if (patternNDSDist[key]) {\n currentPatternNDSDistArray.push(patternNDSDist[key]);\n return; // 缓存过则不需要再次计算\n }\n\n var patternIntGraph = patternIntGraphMap[key];\n patternNDSDist[key] = getMatchedCount(patternIntGraph, dsG, nodeLabelProp, edgeLabelProp);\n currentPatternNDSDistArray.push(patternNDSDist[key]);\n }); // 根据值为 currentPatternNDSDist 从大到小排序\n\n currentPatternNDSDistArray = currentPatternNDSDistArray.sort(function (a, b) {\n return b - a;\n });\n patternNDSDistMap[beginPNode.id + \"-\" + label2] = currentPatternNDSDistArray;\n if (label2 === label) return;\n var candidatesNum = candidates.length;\n\n var _loop_4 = function _loop_4(m) {\n var cNode = candidates[m]; // prune1:若 candidates 中节点 cNode 的 kNeighborUnits 中标签为 label2 的节点个数少于 pattern 中 label2 个数,删去它\n\n var graphNeighborUnit = kNeighborUnits[nodeMap[cNode.id].idx];\n var graphNeighborUnitCountMap = graphNeighborUnit.nodeLabelCountMap[label2];\n var patternLabel2Num = patternNodeLabelMap[label2].length;\n\n if (!graphNeighborUnitCountMap || graphNeighborUnitCountMap.count < patternLabel2Num) {\n candidates.splice(m, 1);\n return \"continue\";\n } // prune2:若 candidates 中节点 cNode 到 kNeighborUnits 中标签为 label2 的节点最短路径大于 patternSpDist[label2],删去它\n // (prune2 规则即:candidate 相关的最短路径的最大 spDist[label2].length 个,按照大小顺序依次和 patternSpDist[label2] 中的值比较,只要遇到一个是 G > Q 的,就删去这个 candidate)\n\n\n var prune2Invalid = false;\n\n for (var n = 0; n < patternLabel2Num; n++) {\n if (graphNeighborUnitCountMap.dists[n] > patternSpDist[label2][n]) {\n prune2Invalid = true;\n break;\n }\n }\n\n if (prune2Invalid) {\n candidates.splice(m, 1);\n return \"continue\";\n } // prune3:若 candidates 中节点 cNode 到 kNeighborUnits 中标签为 label2 的节点 NDS 距离小于 patternNDSDist[beginNode.id-label2],删去它\n // TODO:prune3,currentPatternNDSDistArray 与 currentNDSDist 的比较\n // 计算 G 中所有 label2 节点到 cNode 的 NDS 距离\n // 所有 label2 节点到 cNode 的邻居相交诱导子图:\n\n\n var cNodePairMap = {};\n graphNeighborUnit.neighbors.forEach(function (neighborNode) {\n var dist = spmMap[cNode.id + \"-\" + neighborNode.id];\n cNodePairMap[cNode.id + \"-\" + neighborNode.id] = {\n start: nodeMap[cNode.id].idx,\n end: nodeMap[neighborNode.id].idx,\n distance: dist\n };\n }); // 更新 intGMap\n\n intGMap = getIntersectNeighborInducedGraph(cNodePairMap, kNeighborUnits, graphData, intGMap); // candidate 到它周围 label2 节点的 NDS 距离, key 是 node.id-node.id\n\n var currentNDSDistArray = [];\n Object.keys(cNodePairMap).forEach(function (key) {\n if (ndsDist[key]) {\n currentNDSDistArray.push(ndsDist[key]);\n return; // 缓存过则不需要再次计算\n }\n\n var intGraph = intGMap[key];\n ndsDist[key] = getMatchedCount(intGraph, dsG, nodeLabelProp, edgeLabelProp);\n currentNDSDistArray.push(ndsDist[key]);\n }); // 根据值为 currentNDSDistArray 从大到小排序\n\n currentNDSDistArray = currentNDSDistArray.sort(function (a, b) {\n return b - a;\n });\n var prune3Invalid = false;\n\n for (var n = 0; n < patternLabel2Num; n++) {\n if (currentNDSDistArray[n] < currentPatternNDSDistArray[n]) {\n prune3Invalid = true;\n break;\n }\n }\n\n if (prune3Invalid) {\n candidates.splice(m, 1);\n return \"continue\";\n }\n };\n\n for (var m = candidatesNum - 1; m >= 0; m--) {\n _loop_4(m);\n }\n });\n var candidateGraphs = []; // console.log(\n // \"----- stage3: going to splice neighbors for each candidate graph -------\"\n // );\n // candidates 经过筛选后,以每个 candidate 为中心,生成 Length-neighbor 的邻居诱导子图\n // 并在诱导子图中去除不可能在 Q 上找到匹配的点:在 Q 上不存在的 label,其他 label 到 candidate 的最大最短距离符合 Q、NDS 距离符合 Q\n\n candidates === null || candidates === void 0 ? void 0 : candidates.forEach(function (candidate) {\n var nodeIdx = nodeMap[candidate.id].idx;\n var lengthNeighborUnit = findKNeighborUnit(graphData.nodes, spm[nodeIdx], nodeIdx, nodeLabelProp, length);\n var neighborNodes = lengthNeighborUnit.neighbors; // 删除不可能找到匹配的邻居点\n\n var neighborNum = neighborNodes.length;\n var unmatched = false;\n\n for (var i = neighborNum - 1; i >= 0; i--) {\n // 如果通过裁剪,符合条件的节点数量已过少,说明不能匹配这个 candidate 相关的图\n if (neighborNodes.length + 1 < pattern.nodes.length) {\n unmatched = true;\n return;\n }\n\n var neighborNode = neighborNodes[i];\n var neighborLabel = neighborNode[nodeLabelProp]; // prune1: 若该邻居点的 label 不存在于 pattern 中,移除这个点\n\n if (!patternNodeLabelMap[neighborLabel] || !patternNodeLabelMap[neighborLabel].length) {\n neighborNodes.splice(i, 1);\n continue;\n } // prune2: 若该邻居点到 candidate 的最短路径比和它有相同 label 的节点到 beginPNode 的最大最短路径长度长,移除这个点\n // prune2.1: 如果没有这个标签到 beginPNode 的距离记录,说明 pattern 上(可能 beginPNode 是这个 label)没有其他这个 label 的节点\n\n\n if (!patternSpDist[neighborLabel] || !patternSpDist[neighborLabel].length) {\n neighborNodes.splice(i, 1);\n continue;\n }\n\n var key = candidate.id + \"-\" + neighborNode.id; // prune2.2\n\n var distToCandidate = spmMap[key];\n var idx = patternSpDist[neighborLabel].length - 1;\n var maxDistWithLabelInPattern = patternSpDist[neighborLabel][idx]; // patternSpDist[neighborLabel] 已经按照从小到大排序\n\n if (distToCandidate > maxDistWithLabelInPattern) {\n neighborNodes.splice(i, 1);\n continue;\n }\n\n if (directed) {\n var keyBack = neighborNode.id + \"-\" + candidate.id;\n var distFromCandidate = spmMap[keyBack];\n idx = patternSpDistBack[neighborLabel].length - 1;\n var maxBackDistWithLabelInPattern = patternSpDistBack[neighborLabel][idx];\n\n if (distFromCandidate > maxBackDistWithLabelInPattern) {\n neighborNodes.splice(i, 1);\n continue;\n }\n } // prune3: 若该邻居点到 candidate 的 NDS 距离比和它有相同 label 的节点到 beginPNode 的最小 NDS 距离小,移除这个点\n\n\n var ndsToCandidate = ndsDist[key] ? ndsDist[key] : getNDSDist(graphData, candidate, neighborNode, nodeMap, distToCandidate, kNeighborUnits, dsG, nodeLabelProp, edgeLabelProp, ndsDist, intGMap);\n var patternKey = beginPNode.id + \"-\" + neighborLabel;\n var minNdsWithLabelInPattern = patternNDSDistMap[patternKey][patternNDSDistMap[patternKey].length - 1]; // patternNDSDist[key] 一定存在\n\n if (ndsToCandidate < minNdsWithLabelInPattern) {\n neighborNodes.splice(i, 1);\n continue;\n } // prune4: 若该邻居点的度数小于 pattern 同 label 节点最小度数,删去该点\n\n\n var _a = stashPatternNodeLabelDegreeMap(minPatternNodeLabelDegreeMap, neighborLabel, patternNodeMap, patternNodeLabelMap),\n minPatternNodeLabelDegree = _a.minPatternNodeLabelDegree,\n minPatternNodeLabelInDegree = _a.minPatternNodeLabelInDegree,\n minPatternNodeLabelOutDegree = _a.minPatternNodeLabelOutDegree;\n\n if (nodeMap[neighborNode.id].degree < minPatternNodeLabelDegree) {\n neighborNodes.splice(i, 1);\n continue;\n }\n } // 节点在个数上符合匹配(不少于 pattern 的节点个数),现在筛选相关边\n\n\n if (!unmatched) {\n candidateGraphs.push({\n nodes: [candidate].concat(neighborNodes)\n });\n }\n }); // console.log(\n // \"----- stage4: going to splice edges and neighbors for each candidate graph -------\"\n // );\n\n var undirectedLengthsToBeginPNode = es_dijkstra(pattern, beginPNode.id, false).length;\n var undirectedLengthsToBeginPNodeLabelMap = {};\n\n if (directed) {\n Object.keys(undirectedLengthsToBeginPNode).forEach(function (nodeId) {\n var nodeLabel = patternNodeMap[nodeId].node[nodeLabelProp];\n if (!undirectedLengthsToBeginPNodeLabelMap[nodeLabel]) undirectedLengthsToBeginPNodeLabelMap[nodeLabel] = [undirectedLengthsToBeginPNode[nodeId]];else undirectedLengthsToBeginPNodeLabelMap[nodeLabel].push(undirectedLengthsToBeginPNode[nodeId]);\n });\n Object.keys(undirectedLengthsToBeginPNodeLabelMap).forEach(function (pLabel) {\n undirectedLengthsToBeginPNodeLabelMap[pLabel].sort(function (a, b) {\n return a - b;\n });\n });\n } else {\n undirectedLengthsToBeginPNodeLabelMap = patternSpDist;\n } // 现在 candidateGraphs 里面只有节点,进行边的筛选\n\n\n var candidateGraphNum = candidateGraphs.length;\n\n var _loop_2 = function _loop_2(i) {\n var candidateGraph = candidateGraphs[i];\n var candidate = candidateGraph.nodes[0];\n var candidateNodeLabelCountMap = {};\n var candidateNodeMap = {};\n candidateGraph.nodes.forEach(function (node, q) {\n candidateNodeMap[node.id] = {\n idx: q,\n node: node,\n degree: 0,\n inDegree: 0,\n outDegree: 0\n };\n var cNodeLabel = node[nodeLabelProp];\n if (!candidateNodeLabelCountMap[cNodeLabel]) candidateNodeLabelCountMap[cNodeLabel] = 1;else candidateNodeLabelCountMap[cNodeLabel]++;\n }); // 根据 candidate 和 neighborNodes 中的节点生成 G 的诱导子图\n // 即,将 graphData 上两端都在 candidateGraph.nodes 中的边放入 candidateEdges\n\n var candidateEdges = [];\n var edgeLabelCountMap = {};\n graphData.edges.forEach(function (edge) {\n if (candidateNodeMap[edge.source] && candidateNodeMap[edge.target]) {\n candidateEdges.push(edge);\n if (!edgeLabelCountMap[edge[edgeLabelProp]]) edgeLabelCountMap[edge[edgeLabelProp]] = 1;else edgeLabelCountMap[edge[edgeLabelProp]]++;\n candidateNodeMap[edge.source].degree++;\n candidateNodeMap[edge.target].degree++;\n candidateNodeMap[edge.source].outDegree++;\n candidateNodeMap[edge.target].inDegree++;\n }\n }); // prune:若有一个 edgeLabel 在 candidateGraph 上的个数少于 pattern,去除该图\n\n var pattenrEdgeLabelNum = Object.keys(patternEdgeLabelMap).length;\n var prunedByEdgeLabel = false;\n\n for (var e = 0; e < pattenrEdgeLabelNum; e++) {\n var label_1 = Object.keys(patternEdgeLabelMap)[e];\n\n if (!edgeLabelCountMap[label_1] || edgeLabelCountMap[label_1] < patternEdgeLabelMap[label_1].length) {\n prunedByEdgeLabel = true;\n break;\n }\n }\n\n if (prunedByEdgeLabel) {\n candidateGraphs.splice(i, 1);\n return \"continue\";\n } // 遍历 candidateEdges,进行边的筛选\n\n\n var candidateEdgeNum = candidateEdges.length; // prune:若边数过少,去除该图\n\n if (candidateEdgeNum < pattern.edges.length) {\n candidateGraphs.splice(i, 1);\n return \"break\";\n }\n\n var candidateGraphInvalid = false;\n\n var _loop_5 = function _loop_5(e) {\n var edge = candidateEdges[e];\n var edgeLabel = edge[edgeLabelProp];\n var patternEdgesWithLabel = patternEdgeLabelMap[edgeLabel]; // prune 1: 若边的 label 不存在于 pattern 边 label 中,去除该边\n\n if (!patternEdgesWithLabel || !patternEdgesWithLabel.length) {\n edgeLabelCountMap[edgeLabel]--; // 若这个 label 的 count 减少之后,该 label 的边数不足,去除该图\n\n if (patternEdgesWithLabel && edgeLabelCountMap[edgeLabel] < patternEdgesWithLabel.length) {\n candidateGraphInvalid = true;\n return \"break\";\n }\n\n candidateEdges.splice(e, 1);\n candidateNodeMap[edge.source].degree--;\n candidateNodeMap[edge.target].degree--;\n candidateNodeMap[edge.source].outDegree--;\n candidateNodeMap[edge.target].inDegree--;\n return \"continue\";\n } // prune 2: 若边的 label +两端 label 的三元组关系不能在 pattern 中找到,去除该边\n\n\n var sourceLabel = candidateNodeMap[edge.source].node[nodeLabelProp];\n var targetLabel = candidateNodeMap[edge.target].node[nodeLabelProp];\n var edgeMatched = false;\n patternEdgesWithLabel.forEach(function (patternEdge) {\n var patternSource = patternNodeMap[patternEdge.source].node;\n var patternTarget = patternNodeMap[patternEdge.target].node;\n if (patternSource[nodeLabelProp] === sourceLabel && patternTarget[nodeLabelProp] === targetLabel) edgeMatched = true;\n if (!directed && patternSource[nodeLabelProp] === targetLabel && patternTarget[nodeLabelProp] === sourceLabel) edgeMatched = true;\n });\n\n if (!edgeMatched) {\n edgeLabelCountMap[edgeLabel]--; // 若这个 label 的 count 减少之后,该 label 的边数不足,去除该图\n\n if (patternEdgesWithLabel && edgeLabelCountMap[edgeLabel] < patternEdgesWithLabel.length) {\n candidateGraphInvalid = true;\n return \"break\";\n }\n\n candidateEdges.splice(e, 1);\n candidateNodeMap[edge.source].degree--;\n candidateNodeMap[edge.target].degree--;\n candidateNodeMap[edge.source].outDegree--;\n candidateNodeMap[edge.target].inDegree--;\n return \"continue\";\n }\n };\n\n for (var e = candidateEdgeNum - 1; e >= 0; e--) {\n var state_2 = _loop_5(e);\n\n if (state_2 === \"break\") break;\n } // prune2: 删除边的过程中,发现边数过少/边 label 数过少时,去除该图\n\n\n if (candidateGraphInvalid) {\n candidateGraphs.splice(i, 1);\n return \"continue\";\n }\n\n candidateGraph.edges = candidateEdges;\n var lengthsToCandidate = es_dijkstra(candidateGraph, candidateGraph.nodes[0].id, false).length;\n Object.keys(lengthsToCandidate).reverse().forEach(function (targetId) {\n if (targetId === candidateGraph.nodes[0].id || candidateGraphInvalid) return; // prune4: 通过上述裁剪,可能导致该邻居子图变为不连通。裁剪掉目前在这个邻居子图中和 candidate(第一个节点)不连通的节点\n\n if (lengthsToCandidate[targetId] === Infinity) {\n var targetNodeLabel = candidateNodeMap[targetId].node[nodeLabelProp];\n candidateNodeLabelCountMap[targetNodeLabel]--;\n\n if (candidateNodeLabelCountMap[targetNodeLabel] < patternNodeLabelMap[targetNodeLabel].length) {\n candidateGraphInvalid = true;\n return;\n }\n\n var idx = candidateGraph.nodes.indexOf(candidateNodeMap[targetId].node);\n candidateGraph.nodes.splice(idx, 1);\n candidateNodeMap[targetId] = undefined;\n return;\n } // prune5: 经过边裁剪后,可能又出现了最短路径过长的节点 (比 pattern 中同 label 的节点到 beginNode 最大最短距离远),删去这些节点\n\n\n var nLabel = nodeMap[targetId].node[nodeLabelProp];\n\n if (!undirectedLengthsToBeginPNodeLabelMap[nLabel] || !undirectedLengthsToBeginPNodeLabelMap[nLabel].length || lengthsToCandidate[targetId] > undirectedLengthsToBeginPNodeLabelMap[nLabel][undirectedLengthsToBeginPNodeLabelMap[nLabel].length - 1]) {\n var targetNodeLabel = candidateNodeMap[targetId].node[nodeLabelProp];\n candidateNodeLabelCountMap[targetNodeLabel]--;\n\n if (candidateNodeLabelCountMap[targetNodeLabel] < patternNodeLabelMap[targetNodeLabel].length) {\n candidateGraphInvalid = true;\n return;\n }\n\n var idx = candidateGraph.nodes.indexOf(candidateNodeMap[targetId].node);\n candidateGraph.nodes.splice(idx, 1);\n candidateNodeMap[targetId] = undefined;\n }\n });\n\n if (candidateGraphInvalid) {\n candidateGraphs.splice(i, 1);\n return \"continue\";\n }\n\n var degreeChanged = true;\n var loopCount = 0;\n\n while (degreeChanged && !candidateGraphInvalid) {\n degreeChanged = false; // candidate 度数不足,删去该图\n\n var condition = directed ? candidateNodeMap[candidate.id].degree < patternNodeMap[beginPNode.id].degree || candidateNodeMap[candidate.id].inDegree < patternNodeMap[beginPNode.id].inDegree || candidateNodeMap[candidate.id].outDegree < patternNodeMap[beginPNode.id].outDegree : candidateNodeMap[candidate.id].degree < patternNodeMap[beginPNode.id].degree;\n\n if (condition) {\n candidateGraphInvalid = true;\n break;\n } // candidate label 个数不足,删去该图\n\n\n if (candidateNodeLabelCountMap[candidate[nodeLabelProp]] < patternNodeLabelMap[candidate[nodeLabelProp]].length) {\n candidateGraphInvalid = true;\n break;\n } // prune6:去除度数过小的节点\n\n\n var currentCandidateNodeNum = candidateGraph.nodes.length;\n\n for (var o = currentCandidateNodeNum - 1; o >= 0; o--) {\n var cgNode = candidateGraph.nodes[o];\n var nodeDegree = candidateNodeMap[cgNode.id].degree;\n var nodeInDegree = candidateNodeMap[cgNode.id].inDegree;\n var nodeOutDegree = candidateNodeMap[cgNode.id].outDegree;\n var cNodeLabel = cgNode[nodeLabelProp];\n\n var _d = stashPatternNodeLabelDegreeMap(minPatternNodeLabelDegreeMap, cNodeLabel, patternNodeMap, patternNodeLabelMap),\n minPatternNodeLabelDegree = _d.minPatternNodeLabelDegree,\n minPatternNodeLabelInDegree = _d.minPatternNodeLabelInDegree,\n minPatternNodeLabelOutDegree = _d.minPatternNodeLabelOutDegree;\n\n var deleteCondition = directed ? nodeDegree < minPatternNodeLabelDegree || nodeInDegree < minPatternNodeLabelInDegree || nodeOutDegree < minPatternNodeLabelOutDegree : nodeDegree < minPatternNodeLabelDegree;\n\n if (deleteCondition) {\n candidateNodeLabelCountMap[cgNode[nodeLabelProp]]--; // 节点 label 个数不足\n\n if (candidateNodeLabelCountMap[cgNode[nodeLabelProp]] < patternNodeLabelMap[cgNode[nodeLabelProp]].length) {\n candidateGraphInvalid = true;\n break;\n }\n\n candidateGraph.nodes.splice(o, 1);\n candidateNodeMap[cgNode.id] = undefined;\n degreeChanged = true;\n }\n }\n\n if (candidateGraphInvalid || !degreeChanged && loopCount !== 0) break; // 经过 prune5 节点裁剪,删去端点已经不在 candidateGraph 中的边\n\n candidateEdgeNum = candidateEdges.length;\n\n for (var y = candidateEdgeNum - 1; y >= 0; y--) {\n var cedge = candidateEdges[y];\n\n if (!candidateNodeMap[cedge.source] || !candidateNodeMap[cedge.target]) {\n candidateEdges.splice(y, 1);\n var edgeLabel = cedge[edgeLabelProp];\n edgeLabelCountMap[edgeLabel]--;\n\n if (candidateNodeMap[cedge.source]) {\n candidateNodeMap[cedge.source].degree--;\n candidateNodeMap[cedge.source].outDegree--;\n }\n\n if (candidateNodeMap[cedge.target]) {\n candidateNodeMap[cedge.target].degree--;\n candidateNodeMap[cedge.target].inDegree--;\n } // 边 label 数量不足\n\n\n if (patternEdgeLabelMap[edgeLabel] && edgeLabelCountMap[edgeLabel] < patternEdgeLabelMap[edgeLabel].length) {\n candidateGraphInvalid = true;\n break;\n }\n\n degreeChanged = true;\n }\n }\n\n loopCount++;\n }\n\n if (candidateGraphInvalid) {\n candidateGraphs.splice(i, 1);\n return \"continue\";\n } // prune: 若节点/边数过少,节点/边 label 过少,去掉这个图\n\n\n if (candidateGraphInvalid || candidateGraph.nodes.length < pattern.nodes.length || candidateEdges.length < pattern.edges.length) {\n candidateGraphs.splice(i, 1);\n return \"continue\";\n }\n };\n\n for (var i = candidateGraphNum - 1; i >= 0; i--) {\n var state_1 = _loop_2(i);\n\n if (state_1 === \"break\") break;\n } // 此时已经生成的多个 candidateGraphs,可能有重复\n // console.log(\n // \"----- stage5: going to splice dulplicated candidate graphs -------\"\n // );\n // 删去 candidateGraphs 中一模一样的子图,通过边的 node-node-edgeLabel 作为 key,这类边个数作为 value,进行匹配\n\n\n var currentLength = candidateGraphs.length;\n\n var _loop_3 = function _loop_3(i) {\n var cg1 = candidateGraphs[i];\n var cg1EdgeMap = {}; // [node1.id-node2.id-edge.label]: count\n\n cg1.edges.forEach(function (edge) {\n var key = edge.source + \"-\" + edge.target + \"-\" + edge.label;\n if (!cg1EdgeMap[key]) cg1EdgeMap[key] = 1;else cg1EdgeMap[key]++;\n });\n\n var _loop_6 = function _loop_6(j) {\n var cg2 = candidateGraphs[j];\n var cg2EdgeMap = {}; // [node1.id-node2.id-edge.label]: count\n\n cg2.edges.forEach(function (edge) {\n var key = edge.source + \"-\" + edge.target + \"-\" + edge.label;\n if (!cg2EdgeMap[key]) cg2EdgeMap[key] = 1;else cg2EdgeMap[key]++;\n });\n var same = true;\n\n if (Object.keys(cg2EdgeMap).length !== Object.keys(cg1EdgeMap).length) {\n same = false;\n } else {\n Object.keys(cg1EdgeMap).forEach(function (key) {\n if (cg2EdgeMap[key] !== cg1EdgeMap[key]) same = false;\n });\n }\n\n if (same) {\n candidateGraphs.splice(j, 1);\n }\n };\n\n for (var j = currentLength - 1; j > i; j--) {\n _loop_6(j);\n }\n\n currentLength = candidateGraphs.length;\n };\n\n for (var i = 0; i <= currentLength - 1; i++) {\n _loop_3(i);\n }\n\n return candidateGraphs;\n};\n\n/* harmony default export */ var gaddi = (gaddi_GADDI);\n// CONCATENATED MODULE: ./node_modules/@antv/algorithm/es/structs/stack.js\n\n\nvar stack_Stack =\n/** @class */\nfunction () {\n function Stack(maxStep) {\n if (maxStep === void 0) {\n maxStep = 10;\n }\n\n this.linkedList = new linked_list();\n this.maxStep = maxStep;\n }\n\n Object.defineProperty(Stack.prototype, \"length\", {\n get: function get() {\n return this.linkedList.toArray().length;\n },\n enumerable: false,\n configurable: true\n });\n /**\n * 判断栈是否为空,如果链表中没有头部元素,则栈为空\n */\n\n Stack.prototype.isEmpty = function () {\n return !this.linkedList.head;\n };\n /**\n * 是否到定义的栈的最大长度,如果达到最大长度后,不再允许入栈\n */\n\n\n Stack.prototype.isMaxStack = function () {\n return this.toArray().length >= this.maxStep;\n };\n /**\n * 访问顶端元素\n */\n\n\n Stack.prototype.peek = function () {\n if (this.isEmpty()) {\n return null;\n } // 返回头部元素,不删除元素\n\n\n return this.linkedList.head.value;\n };\n\n Stack.prototype.push = function (value) {\n this.linkedList.prepend(value);\n\n if (this.length > this.maxStep) {\n this.linkedList.deleteTail();\n }\n };\n\n Stack.prototype.pop = function () {\n var removeHead = this.linkedList.deleteHead();\n return removeHead ? removeHead.value : null;\n };\n\n Stack.prototype.toArray = function () {\n return this.linkedList.toArray().map(function (node) {\n return node.value;\n });\n };\n\n Stack.prototype.clear = function () {\n while (!this.isEmpty()) {\n this.pop();\n }\n };\n\n return Stack;\n}();\n\n/* harmony default export */ var structs_stack = (stack_Stack);\n// CONCATENATED MODULE: ./node_modules/@antv/algorithm/es/index.js\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nvar es_detectDirectedCycle = detect_cycle;\n\n/* harmony default export */ var es = ({\n getAdjMatrix: adjacent_matrix,\n breadthFirstSearch: bfs,\n connectedComponent: getConnectedComponents,\n getDegree: es_degree,\n getInDegree: getInDegree,\n getOutDegree: getOutDegree,\n detectCycle: detect_cycle,\n detectDirectedCycle: es_detectDirectedCycle,\n detectAllCycles: detectAllCycles,\n detectAllDirectedCycle: detect_cycle_detectAllDirectedCycle,\n detectAllUndirectedCycle: detect_cycle_detectAllUndirectedCycle,\n depthFirstSearch: depthFirstSearch,\n dijkstra: es_dijkstra,\n findAllPath: find_path_findAllPath,\n findShortestPath: find_path_findShortestPath,\n floydWarshall: es_floydWarshall,\n labelPropagation: label_propagation,\n louvain: es_louvain,\n minimumSpanningTree: mts,\n pageRank: es_pageRank,\n getNeighbors: getNeighbors,\n Stack: structs_stack,\n GADDI: gaddi\n});\n// CONCATENATED MODULE: ./node_modules/@antv/g6-core/es/util/math.js\n\n\nvar math_transform = matrix_util_esm[\"ext\"].transform;\n/**\n * 对比对象,用于对象数组排序\n * @param {string} attributeName 排序依据的字段名称\n * @param {number} min 最小值\n * @param {number} max 最大值\n * @return {boolean} bool 布尔\n */\n\nvar compare = function compare(attributeName) {\n return function (m, n) {\n return m[attributeName] - n[attributeName];\n };\n};\n/**\n * 是否在区间内\n * @param {number} value 值\n * @param {number} min 最小值\n * @param {number} max 最大值\n * @return {boolean} bool 布尔\n */\n\nvar isBetween = function isBetween(value, min, max) {\n return value >= min && value <= max;\n};\n/**\n * 获取两条线段的交点\n * @param {Point} p0 第一条线段起点\n * @param {Point} p1 第一条线段终点\n * @param {Point} p2 第二条线段起点\n * @param {Point} p3 第二条线段终点\n * @return {Point} 交点\n */\n\n\nvar getLineIntersect = function getLineIntersect(p0, p1, p2, p3) {\n var tolerance = 0.0001;\n var E = {\n x: p2.x - p0.x,\n y: p2.y - p0.y\n };\n var D0 = {\n x: p1.x - p0.x,\n y: p1.y - p0.y\n };\n var D1 = {\n x: p3.x - p2.x,\n y: p3.y - p2.y\n };\n var kross = D0.x * D1.y - D0.y * D1.x;\n var sqrKross = kross * kross;\n var invertKross = 1 / kross;\n var sqrLen0 = D0.x * D0.x + D0.y * D0.y;\n var sqrLen1 = D1.x * D1.x + D1.y * D1.y;\n\n if (sqrKross > tolerance * sqrLen0 * sqrLen1) {\n var s = (E.x * D1.y - E.y * D1.x) * invertKross;\n var t = (E.x * D0.y - E.y * D0.x) * invertKross;\n if (!isBetween(s, 0, 1) || !isBetween(t, 0, 1)) return null;\n return {\n x: p0.x + s * D0.x,\n y: p0.y + s * D0.y\n };\n }\n\n return null;\n};\n/**\n * point and rectangular intersection point\n * @param {IRect} rect rect\n * @param {Point} point point\n * @return {PointPoint} rst;\n */\n\nvar getRectIntersectByPoint = function getRectIntersectByPoint(rect, point) {\n var x = rect.x,\n y = rect.y,\n width = rect.width,\n height = rect.height;\n var cx = x + width / 2;\n var cy = y + height / 2;\n var points = [];\n var center = {\n x: cx,\n y: cy\n };\n points.push({\n x: x,\n y: y\n });\n points.push({\n x: x + width,\n y: y\n });\n points.push({\n x: x + width,\n y: y + height\n });\n points.push({\n x: x,\n y: y + height\n });\n points.push({\n x: x,\n y: y\n });\n var rst = null;\n\n for (var i = 1; i < points.length; i++) {\n rst = getLineIntersect(points[i - 1], points[i], center, point);\n\n if (rst) {\n break;\n }\n }\n\n return rst;\n};\n/**\n * get point and circle inIntersect\n * @param {ICircle} circle 圆点,x,y,r\n * @param {Point} point 点 x,y\n * @return {Point} applied point\n */\n\nvar getCircleIntersectByPoint = function getCircleIntersectByPoint(circle, point) {\n var cx = circle.x,\n cy = circle.y,\n r = circle.r;\n var x = point.x,\n y = point.y;\n var dx = x - cx;\n var dy = y - cy;\n\n if (dx * dx + dy * dy < r * r) {\n return null;\n }\n\n var angle = Math.atan(dy / dx);\n return {\n x: cx + Math.abs(r * Math.cos(angle)) * Math.sign(dx),\n y: cy + Math.abs(r * Math.sin(angle)) * Math.sign(dy)\n };\n};\n/**\n * get point and ellipse inIntersect\n * @param {Object} ellipse 椭圆 x,y,rx,ry\n * @param {Object} point 点 x,y\n * @return {object} applied point\n */\n\nvar getEllipseIntersectByPoint = function getEllipseIntersectByPoint(ellipse, point) {\n var a = ellipse.rx;\n var b = ellipse.ry;\n var cx = ellipse.x;\n var cy = ellipse.y;\n var dx = point.x - cx;\n var dy = point.y - cy; // 直接通过 x,y 求夹角,求出来的范围是 -PI, PI\n\n var angle = Math.atan2(dy / b, dx / a);\n\n if (angle < 0) {\n angle += 2 * Math.PI; // 转换到 0,2PI\n }\n\n return {\n x: cx + a * Math.cos(angle),\n y: cy + b * Math.sin(angle)\n };\n};\n/**\n * coordinate matrix transformation\n * @param {number} point coordinate\n * @param {Matrix} matrix matrix\n * @param {number} tag could be 0 or 1\n * @return {Point} transformed point\n */\n\nvar math_applyMatrix = function applyMatrix(point, matrix, tag) {\n if (tag === void 0) {\n tag = 1;\n }\n\n var vector = [point.x, point.y, tag];\n\n if (!matrix || isNaN(matrix[0])) {\n matrix = [1, 0, 0, 0, 1, 0, 0, 0, 1];\n }\n\n matrix_util_esm[\"vec3\"].transformMat3(vector, vector, matrix);\n return {\n x: vector[0],\n y: vector[1]\n };\n};\n/**\n * coordinate matrix invert transformation\n * @param {number} point coordinate\n * @param {number} matrix matrix\n * @param {number} tag could be 0 or 1\n * @return {object} transformed point\n */\n\nvar math_invertMatrix = function invertMatrix(point, matrix, tag) {\n if (tag === void 0) {\n tag = 1;\n }\n\n if (!matrix || isNaN(matrix[0])) {\n matrix = [1, 0, 0, 0, 1, 0, 0, 0, 1];\n }\n\n var inversedMatrix = matrix_util_esm[\"mat3\"].invert([1, 0, 0, 0, 1, 0, 0, 0, 1], matrix);\n\n if (!inversedMatrix) {\n inversedMatrix = [1, 0, 0, 0, 1, 0, 0, 0, 1];\n }\n\n var vector = [point.x, point.y, tag];\n matrix_util_esm[\"vec3\"].transformMat3(vector, vector, inversedMatrix);\n return {\n x: vector[0],\n y: vector[1]\n };\n};\n/**\n *\n * @param p1 First coordinate\n * @param p2 second coordinate\n * @param p3 three coordinate\n */\n\nvar getCircleCenterByPoints = function getCircleCenterByPoints(p1, p2, p3) {\n var a = p1.x - p2.x;\n var b = p1.y - p2.y;\n var c = p1.x - p3.x;\n var d = p1.y - p3.y;\n var e = (p1.x * p1.x - p2.x * p2.x - p2.y * p2.y + p1.y * p1.y) / 2;\n var f = (p1.x * p1.x - p3.x * p3.x - p3.y * p3.y + p1.y * p1.y) / 2;\n var denominator = b * c - a * d;\n return {\n x: -(d * e - b * f) / denominator,\n y: -(a * f - c * e) / denominator\n };\n};\n/**\n * get distance by two points\n * @param p1 first point\n * @param p2 second point\n */\n\nvar math_distance = function distance(p1, p2) {\n var vx = p1.x - p2.x;\n var vy = p1.y - p2.y;\n return Math.sqrt(vx * vx + vy * vy);\n};\n/**\n * scale matrix\n * @param matrix [ [], [], [] ]\n * @param ratio\n */\n\nvar scaleMatrix = function scaleMatrix(matrix, ratio) {\n var result = [];\n matrix.forEach(function (row) {\n var newRow = [];\n row.forEach(function (v) {\n newRow.push(v * ratio);\n });\n result.push(newRow);\n });\n return result;\n};\n/**\n * Floyd Warshall algorithm for shortest path distances matrix\n * @param {array} adjMatrix adjacency matrix\n * @return {array} distances shortest path distances matrix\n */\n\nvar math_floydWarshall = function floydWarshall(adjMatrix) {\n // initialize\n var dist = [];\n var size = adjMatrix.length;\n\n for (var i = 0; i < size; i += 1) {\n dist[i] = [];\n\n for (var j = 0; j < size; j += 1) {\n if (i === j) {\n dist[i][j] = 0;\n } else if (adjMatrix[i][j] === 0 || !adjMatrix[i][j]) {\n dist[i][j] = Infinity;\n } else {\n dist[i][j] = adjMatrix[i][j];\n }\n }\n } // floyd\n\n\n for (var k = 0; k < size; k += 1) {\n for (var i = 0; i < size; i += 1) {\n for (var j = 0; j < size; j += 1) {\n if (dist[i][j] > dist[i][k] + dist[k][j]) {\n dist[i][j] = dist[i][k] + dist[k][j];\n }\n }\n }\n }\n\n return dist;\n};\n/**\n * get adjacency matrix\n * @param data graph data\n * @param directed whether it's a directed graph\n */\n\nvar getAdjMatrix = function getAdjMatrix(data, directed) {\n var nodes = data.nodes,\n edges = data.edges;\n var matrix = []; // map node with index in data.nodes\n\n var nodeMap = {};\n\n if (!nodes) {\n throw new Error('invalid nodes data!');\n }\n\n if (nodes) {\n nodes.forEach(function (node, i) {\n nodeMap[node.id] = i;\n var row = [];\n matrix.push(row);\n });\n }\n\n if (edges) {\n edges.forEach(function (e) {\n var source = e.source,\n target = e.target;\n var sIndex = nodeMap[source];\n var tIndex = nodeMap[target];\n matrix[sIndex][tIndex] = 1;\n\n if (!directed) {\n matrix[tIndex][sIndex] = 1;\n }\n });\n }\n\n return matrix;\n};\n/**\n * 平移group\n * @param group Group 实例\n * @param vec 移动向量\n */\n\nvar translate = function translate(group, vec) {\n group.translate(vec.x, vec.y);\n};\n/**\n * 移动到指定坐标点\n * @param group Group 实例\n * @param point 移动到的坐标点\n */\n\nvar move = function move(group, point, animate, animateCfg) {\n if (animateCfg === void 0) {\n animateCfg = {\n duration: 500\n };\n }\n\n var matrix = group.getMatrix();\n\n if (!matrix) {\n matrix = [1, 0, 0, 0, 1, 0, 0, 0, 1];\n }\n\n var bbox = group.getCanvasBBox();\n var vx = point.x - bbox.minX;\n var vy = point.y - bbox.minY;\n\n if (animate) {\n var dx_1 = vx * matrix[0];\n var dy_1 = vy * matrix[4];\n var lastX_1 = 0;\n var lastY_1 = 0;\n var newX_1 = 0;\n var newY_1 = 0;\n group.animate(function (ratio) {\n newX_1 = dx_1 * ratio;\n newY_1 = dy_1 * ratio;\n matrix = math_transform(matrix, [['t', newX_1 - lastX_1, newY_1 - lastY_1]]);\n lastX_1 = newX_1;\n lastY_1 = newY_1;\n return {\n matrix: matrix\n };\n }, animateCfg);\n } else {\n var movedMatrix = math_transform(matrix, [['t', vx, vy]]);\n group.setMatrix(movedMatrix);\n }\n};\n/**\n * 缩放 group\n * @param group Group 实例\n * @param point 在x 和 y 方向上的缩放比例\n */\n\nvar math_scale = function scale(group, ratio) {\n var matrix = group.getMatrix();\n\n if (!matrix) {\n matrix = [1, 0, 0, 0, 1, 0, 0, 0, 1];\n }\n\n var scaleXY = ratio;\n\n if (!Object(esm[\"isArray\"])(ratio)) {\n scaleXY = [ratio, ratio];\n }\n\n if (Object(esm[\"isArray\"])(ratio) && ratio.length === 1) {\n scaleXY = [ratio[0], ratio[0]];\n }\n\n matrix = math_transform(matrix, [['s', scaleXY[0], scaleXY[1]]]);\n group.setMatrix(matrix);\n};\n/**\n *\n * @param group Group 实例\n * @param ratio 选择角度\n */\n\nvar math_rotate = function rotate(group, angle) {\n var matrix = group.getMatrix();\n\n if (!matrix) {\n matrix = [1, 0, 0, 0, 1, 0, 0, 0, 1];\n }\n\n matrix = math_transform(matrix, [['r', angle]]);\n group.setMatrix(matrix);\n};\nvar getDegree = function getDegree(n, nodeIdxMap, edges) {\n var degrees = [];\n\n for (var i = 0; i < n; i++) {\n degrees[i] = 0;\n }\n\n edges.forEach(function (e) {\n if (e.source) {\n degrees[nodeIdxMap[e.source]] += 1;\n }\n\n if (e.target) {\n degrees[nodeIdxMap[e.target]] += 1;\n }\n });\n return degrees;\n}; // 判断点Q是否在p1和p2的线段上\n\nfunction onSegment(p1, p2, q) {\n if ((q[0] - p1[0]) * (p2[1] - p1[1]) === (p2[0] - p1[0]) * (q[1] - p1[1]) && Math.min(p1[0], p2[0]) <= q[0] && q[0] <= Math.max(p1[0], p2[0]) && Math.min(p1[1], p2[1]) <= q[1] && q[1] <= Math.max(p1[1], p2[1])) {\n return true;\n }\n\n return false;\n}\n/**\n * 判断点P在多边形内-射线法. Borrow from https://github.com/antvis/util/blob/master/packages/path-util/src/point-in-polygon.ts\n * @param points\n * @param x\n * @param y\n */\n\n\nvar isPointInPolygon = function isPointInPolygon(points, x, y) {\n var isHit = false;\n var n = points.length; // 判断两个double在eps精度下的大小关系\n\n var tolerance = 1e-6;\n\n function dcmp(xValue) {\n if (Math.abs(xValue) < tolerance) {\n return 0;\n }\n\n return xValue < 0 ? -1 : 1;\n }\n\n if (n <= 2) {\n // svg 中点小于 3 个时,不显示,也无法被拾取\n return false;\n }\n\n for (var i = 0; i < n; i++) {\n var p1 = points[i];\n var p2 = points[(i + 1) % n];\n\n if (onSegment(p1, p2, [x, y])) {\n // 点在多边形一条边上\n return true;\n } // 前一个判断min(p1[1],p2[1]) 0 !== dcmp(p2[1] - y) > 0 && dcmp(x - (y - p1[1]) * (p1[0] - p2[0]) / (p1[1] - p2[1]) - p1[0]) < 0) {\n isHit = !isHit;\n }\n }\n\n return isHit;\n}; // 判断两个BBox是否相交\n\nvar intersectBBox = function intersectBBox(box1, box2) {\n return !(box2.minX > box1.maxX || box2.maxX < box1.minX || box2.minY > box1.maxY || box2.maxY < box1.minY);\n};\n\nvar math_lineIntersectPolygon = function lineIntersectPolygon(lines, line) {\n var isIntersect = false;\n Object(esm[\"each\"])(lines, function (l) {\n if (getLineIntersect(l.from, l.to, line.from, line.to)) {\n isIntersect = true;\n return false;\n }\n });\n return isIntersect;\n};\n/**\n * 判断两个polygon是否相交。\n * borrow from @antv/path-util\n * @param points1 polygon1的顶点数组\n * @param points2 polygon2的顶点数组\n */\n\n\nvar math_isPolygonsIntersect = function isPolygonsIntersect(points1, points2) {\n var getBBox = function getBBox(points) {\n var xArr = points.map(function (p) {\n return p[0];\n });\n var yArr = points.map(function (p) {\n return p[1];\n });\n return {\n minX: Math.min.apply(null, xArr),\n maxX: Math.max.apply(null, xArr),\n minY: Math.min.apply(null, yArr),\n maxY: Math.max.apply(null, yArr)\n };\n };\n\n var parseToLines = function parseToLines(points) {\n var lines = [];\n var count = points.length;\n\n for (var i = 0; i < count - 1; i++) {\n var point = points[i];\n var next = points[i + 1];\n lines.push({\n from: {\n x: point[0],\n y: point[1]\n },\n to: {\n x: next[0],\n y: next[1]\n }\n });\n }\n\n if (lines.length > 1) {\n var first = points[0];\n var last = points[count - 1];\n lines.push({\n from: {\n x: last[0],\n y: last[1]\n },\n to: {\n x: first[0],\n y: first[1]\n }\n });\n }\n\n return lines;\n }; // 空数组,或者一个点返回 false\n\n\n if (points1.length < 2 || points2.length < 2) {\n return false;\n }\n\n var bbox1 = getBBox(points1);\n var bbox2 = getBBox(points2); // 判定包围盒是否相交,比判定点是否在多边形内要快的多,可以筛选掉大多数情况\n\n if (!intersectBBox(bbox1, bbox2)) {\n return false;\n }\n\n var isIn = false; // 判定点是否在多边形内部,一旦有一个点在另一个多边形内,则返回\n\n Object(esm[\"each\"])(points2, function (point) {\n if (isPointInPolygon(points1, point[0], point[1])) {\n isIn = true;\n return false;\n }\n });\n\n if (isIn) {\n return true;\n }\n\n Object(esm[\"each\"])(points1, function (point) {\n if (isPointInPolygon(points2, point[0], point[1])) {\n isIn = true;\n return false;\n }\n });\n\n if (isIn) {\n return true;\n }\n\n var lines1 = parseToLines(points1);\n var lines2 = parseToLines(points2);\n var isIntersect = false;\n Object(esm[\"each\"])(lines2, function (line) {\n if (math_lineIntersectPolygon(lines1, line)) {\n isIntersect = true;\n return false;\n }\n });\n return isIntersect;\n};\n\nvar math_Line =\n/** @class */\nfunction () {\n function Line(x1, y1, x2, y2) {\n this.x1 = x1;\n this.y1 = y1;\n this.x2 = x2;\n this.y2 = y2;\n }\n\n Line.prototype.getBBox = function () {\n var minX = Math.min(this.x1, this.x2);\n var minY = Math.min(this.y1, this.y2);\n var maxX = Math.max(this.x1, this.x2);\n var maxY = Math.max(this.y1, this.y2);\n var res = {\n x: minX,\n y: minY,\n minX: minX,\n minY: minY,\n maxX: maxX,\n maxY: maxY,\n width: maxX - minX,\n height: maxY - minY\n };\n return res;\n };\n\n return Line;\n}();\n\n\nvar getBBoxBoundLine = function getBBoxBoundLine(bbox, direction) {\n var bounds = {\n top: [bbox.minX, bbox.minY, bbox.maxX, bbox.minY],\n left: [bbox.minX, bbox.minY, bbox.minX, bbox.maxY],\n bottom: [bbox.minX, bbox.maxY, bbox.maxX, bbox.maxY],\n right: [bbox.maxX, bbox.minY, bbox.maxX, bbox.maxY]\n };\n return bounds[direction];\n};\n/**\n * 计算两条线段相交时,相交点对第一条线段上的分割比例\n */\n\nvar fractionAlongLineA = function fractionAlongLineA(la, lb) {\n var uaT = (lb.x2 - lb.x1) * (la.y1 - lb.y1) - (lb.y2 - lb.y1) * (la.x1 - lb.x1);\n var ubT = (la.x2 - la.x1) * (la.y1 - lb.y1) - (la.y2 - la.y1) * (la.x1 - lb.x1);\n var uB = (lb.y2 - lb.y1) * (la.x2 - la.x1) - (lb.x2 - lb.x1) * (la.y2 - la.y1);\n\n if (uB) {\n var ua = uaT / uB;\n var ub = ubT / uB;\n\n if (ua >= 0 && ua <= 1 && ub >= 0 && ub <= 1) {\n return ua;\n }\n }\n\n return Number.POSITIVE_INFINITY;\n};\n\nvar itemIntersectByLine = function itemIntersectByLine(item, line) {\n var directions = ['top', 'left', 'bottom', 'right'];\n var bbox = item.getBBox();\n var countIntersections = 0;\n var intersections = [];\n\n for (var i = 0; i < 4; i++) {\n var _a = getBBoxBoundLine(bbox, directions[i]),\n x1 = _a[0],\n y1 = _a[1],\n x2 = _a[2],\n y2 = _a[3];\n\n intersections[i] = getLineIntersect({\n x: line.x1,\n y: line.y1\n }, {\n x: line.x2,\n y: line.y2\n }, {\n x: x1,\n y: y1\n }, {\n x: x2,\n y: y2\n });\n\n if (intersections[i]) {\n countIntersections += 1;\n }\n }\n\n return [intersections, countIntersections];\n};\nvar fractionToLine = function fractionToLine(item, line) {\n var directions = ['top', 'left', 'bottom', 'right'];\n var bbox = item.getBBox();\n var minDistance = Number.POSITIVE_INFINITY;\n var countIntersections = 0;\n\n for (var i = 0; i < 4; i++) {\n var _a = getBBoxBoundLine(bbox, directions[i]),\n x1 = _a[0],\n y1 = _a[1],\n x2 = _a[2],\n y2 = _a[3];\n\n var testDistance = fractionAlongLineA(line, new math_Line(x1, y1, x2, y2));\n testDistance = Math.abs(testDistance - 0.5);\n\n if (testDistance >= 0 && testDistance <= 1) {\n countIntersections += 1;\n minDistance = testDistance < minDistance ? testDistance : minDistance;\n }\n }\n\n if (countIntersections === 0) return -1;\n return minDistance;\n};\nvar getPointsCenter = function getPointsCenter(points) {\n var centerX = 0;\n var centerY = 0;\n\n if (points.length > 0) {\n for (var _i = 0, points_1 = points; _i < points_1.length; _i++) {\n var point = points_1[_i];\n centerX += point.x;\n centerY += point.y;\n }\n\n centerX /= points.length;\n centerY /= points.length;\n }\n\n return {\n x: centerX,\n y: centerY\n };\n};\nvar squareDist = function squareDist(a, b) {\n return Math.pow(a.x - b.x, 2) + Math.pow(a.y - b.y, 2);\n};\nvar pointLineSquareDist = function pointLineSquareDist(point, line) {\n var x1 = line.x1;\n var y1 = line.y1;\n var x2 = line.x2 - x1;\n var y2 = line.y2 - y1;\n var px = point.x - x1;\n var py = point.y - y1;\n var dotprod = px * x2 + py * y2;\n var projlenSq;\n\n if (dotprod <= 0) {\n projlenSq = 0;\n } else {\n px = x2 - px;\n py = y2 - py;\n dotprod = px * x2 + py * y2;\n\n if (dotprod <= 0) {\n projlenSq = 0;\n } else {\n projlenSq = dotprod * dotprod / (x2 * x2 + y2 * y2);\n }\n }\n\n var lenSq = px * px + py * py - projlenSq;\n\n if (lenSq < 0) {\n lenSq = 0;\n }\n\n return lenSq;\n};\nvar isPointsOverlap = function isPointsOverlap(p1, p2, e) {\n if (e === void 0) {\n e = 1e-3;\n }\n\n return Math.pow(p1.x - p2.x, 2) + Math.pow(p1.y - p2.y, 2) < Math.pow(e, 2);\n};\n/**\n * 点到矩形的距离的平方:矩形内部点视作距离为0,外部的点若投影落在矩形边上则为点到矩形边的最近的垂直距离,否则为点到矩形顶点的距离,\n * @param point IPoint\n * @param rect IRect\n */\n\nvar pointRectSquareDist = function pointRectSquareDist(point, rect) {\n var isLeft = point.x < rect.x;\n var isRight = point.x > rect.x + rect.width;\n var isTop = point.y > rect.y + rect.height;\n var isBottom = point.y < rect.y;\n var isPointOutside = isLeft || isRight || isTop || isBottom;\n\n if (!isPointOutside) {\n return 0;\n }\n\n if (isTop && !isLeft && !isRight) {\n return Math.pow(rect.y + rect.height - point.y, 2);\n }\n\n if (isBottom && !isLeft && !isRight) {\n return Math.pow(point.y - rect.y, 2);\n }\n\n if (isLeft && !isTop && !isBottom) {\n return Math.pow(rect.x - point.x, 2);\n }\n\n if (isRight && !isTop && !isBottom) {\n return Math.pow(rect.x + rect.width - point.x, 2);\n }\n\n var dx = Math.min(Math.abs(rect.x - point.x), Math.abs(rect.x + rect.width - point.x));\n var dy = Math.min(Math.abs(rect.y - point.y), Math.abs(rect.y + rect.height - point.y));\n return dx * dx + dy * dy;\n};\n/**\n * point to line distance\n * @param {array} line 线的四个顶点 [x1, y1, x2, y2]\n * @param {object} point 坐标点 {x, y}\n * @return {Number|NaN} distance\n */\n\nvar math_pointLineDistance = function pointLineDistance(line, point) {\n var x1 = line[0],\n y1 = line[1],\n x2 = line[2],\n y2 = line[3];\n var x = point.x,\n y = point.y;\n var d = [x2 - x1, y2 - y1];\n\n if (matrix_util_esm[\"vec2\"].exactEquals(d, [0, 0])) {\n return NaN;\n }\n\n var u = [-d[1], d[0]]; // @ts-ignore\n\n matrix_util_esm[\"vec2\"].normalize(u, u);\n var a = [x - x1, y - y1]; // @ts-ignore\n\n return Math.abs(matrix_util_esm[\"vec2\"].dot(a, u));\n};\n/**\n * Linearly interpolate between start and end, where alpha is the percent distance along the line.\n * alpha = 0 will be start, and alpha = 1 will be end.\n * @param {Number} start\n * @param {Number} end\n * @param {Number} alpha interpolation factor, typically in the closed interval [0, 1]\n * @returns\n */\n\nvar lerp = function lerp(start, end, alpha) {\n return start + (end - start) * alpha;\n};\n// CONCATENATED MODULE: ./node_modules/@antv/g6-core/es/global.js\nvar global_subjectColor = 'rgb(95, 149, 255)';\nvar global_backColor = 'rgb(255, 255, 255)';\nvar global_textColor = 'rgb(0, 0, 0)';\nvar activeFill = 'rgb(247, 250, 255)';\nvar nodeMainFill = 'rgb(239, 244, 255)';\nvar comboFill = 'rgb(253, 253, 253)';\nvar disabledFill = 'rgb(250, 250, 250)';\nvar edgeMainStroke = 'rgb(224, 224, 224)';\nvar edgeInactiveStroke = 'rgb(234, 234, 234)';\nvar edgeDisablesStroke = 'rgb(245, 245, 245)';\nvar inactiveStroke = 'rgb(191, 213, 255)';\nvar highlightStroke = '#4572d9';\nvar highlightFill = 'rgb(223, 234, 255)';\nvar colorSet = {\n // for nodes\n mainStroke: global_subjectColor,\n mainFill: nodeMainFill,\n activeStroke: global_subjectColor,\n activeFill: activeFill,\n inactiveStroke: inactiveStroke,\n inactiveFill: activeFill,\n selectedStroke: global_subjectColor,\n selectedFill: global_backColor,\n highlightStroke: highlightStroke,\n highlightFill: highlightFill,\n disableStroke: edgeMainStroke,\n disableFill: disabledFill,\n // for edges\n edgeMainStroke: edgeMainStroke,\n edgeActiveStroke: global_subjectColor,\n edgeInactiveStroke: edgeInactiveStroke,\n edgeSelectedStroke: global_subjectColor,\n edgeHighlightStroke: global_subjectColor,\n edgeDisableStroke: edgeDisablesStroke,\n // for combos\n comboMainStroke: edgeMainStroke,\n comboMainFill: comboFill,\n comboActiveStroke: global_subjectColor,\n comboActiveFill: activeFill,\n comboInactiveStroke: edgeMainStroke,\n comboInactiveFill: comboFill,\n comboSelectedStroke: global_subjectColor,\n comboSelectedFill: comboFill,\n comboHighlightStroke: highlightStroke,\n comboHighlightFill: comboFill,\n comboDisableStroke: edgeInactiveStroke,\n comboDisableFill: disabledFill\n};\n/* harmony default export */ var global = ({\n version: '0.4.1',\n rootContainerClassName: 'root-container',\n nodeContainerClassName: 'node-container',\n edgeContainerClassName: 'edge-container',\n comboContainerClassName: 'combo-container',\n delegateContainerClassName: 'delegate-container',\n defaultLoopPosition: 'top',\n nodeLabel: {\n style: {\n fill: '#000',\n fontSize: 12,\n textAlign: 'center',\n textBaseline: 'middle'\n },\n offset: 4 // 节点的默认文本不居中时的偏移量\n\n },\n defaultNode: {\n type: 'circle',\n style: {\n lineWidth: 1,\n stroke: colorSet.mainStroke,\n fill: nodeMainFill\n },\n size: 20,\n color: colorSet.mainStroke,\n linkPoints: {\n size: 8,\n lineWidth: 1,\n fill: colorSet.activeFill,\n stroke: colorSet.activeStroke\n }\n },\n // 节点应用状态后的样式,默认仅提供 active、selected、highlight、inactive、disable,用户可以自己扩展\n nodeStateStyles: {\n active: {\n fill: colorSet.activeFill,\n stroke: colorSet.activeStroke,\n lineWidth: 2,\n shadowColor: colorSet.mainStroke,\n shadowBlur: 10\n },\n selected: {\n fill: colorSet.selectedFill,\n stroke: colorSet.selectedStroke,\n lineWidth: 4,\n shadowColor: colorSet.selectedStroke,\n shadowBlur: 10,\n 'text-shape': {\n fontWeight: 500\n }\n },\n highlight: {\n fill: colorSet.highlightFill,\n stroke: colorSet.highlightStroke,\n lineWidth: 2,\n 'text-shape': {\n fontWeight: 500\n }\n },\n inactive: {\n fill: colorSet.inactiveFill,\n stroke: colorSet.inactiveStroke,\n lineWidth: 1\n },\n disable: {\n fill: colorSet.disableFill,\n stroke: colorSet.disableStroke,\n lineWidth: 1\n }\n },\n edgeLabel: {\n style: {\n fill: global_textColor,\n textAlign: 'center',\n textBaseline: 'middle',\n fontSize: 12\n }\n },\n defaultEdge: {\n type: 'line',\n size: 1,\n style: {\n stroke: colorSet.edgeMainStroke,\n lineAppendWidth: 2\n },\n color: colorSet.edgeMainStroke\n },\n // 边应用状态后的样式,默认仅提供 active、selected、highlight、inactive、disable,用户可以自己扩展\n edgeStateStyles: {\n active: {\n stroke: colorSet.edgeActiveStroke,\n lineWidth: 1\n },\n selected: {\n stroke: colorSet.edgeSelectedStroke,\n lineWidth: 2,\n shadowColor: colorSet.edgeSelectedStroke,\n shadowBlur: 10,\n 'text-shape': {\n fontWeight: 500\n }\n },\n highlight: {\n stroke: colorSet.edgeHighlightStroke,\n lineWidth: 2,\n 'text-shape': {\n fontWeight: 500\n }\n },\n inactive: {\n stroke: colorSet.edgeInactiveStroke,\n lineWidth: 1\n },\n disable: {\n stroke: colorSet.edgeDisableStroke,\n lineWidth: 1\n }\n },\n comboLabel: {\n style: {\n fill: global_textColor,\n // textAlign: 'center',\n textBaseline: 'middle',\n fontSize: 12\n },\n refY: 10,\n refX: 10 // Combo 的默认文本不居中时的偏移量\n\n },\n defaultCombo: {\n type: 'circle',\n style: {\n fill: colorSet.comboMainFill,\n lineWidth: 1,\n stroke: colorSet.comboMainStroke,\n r: 5,\n width: 20,\n height: 10\n },\n size: [20, 5],\n color: colorSet.comboMainStroke,\n padding: [25, 20, 15, 20]\n },\n // combo 应用状态后的样式,默认仅提供 active、selected、highlight、inactive、disable,用户可以自己扩展\n comboStateStyles: {\n active: {\n stroke: colorSet.comboActiveStroke,\n lineWidth: 1,\n fill: colorSet.comboActiveFill\n },\n selected: {\n stroke: colorSet.comboSelectedStroke,\n lineWidth: 2,\n fill: colorSet.comboSelectedFill,\n shadowColor: colorSet.comboSelectedStroke,\n shadowBlur: 10,\n 'text-shape': {\n fontWeight: 500\n }\n },\n highlight: {\n stroke: colorSet.comboHighlightStroke,\n lineWidth: 2,\n fill: colorSet.comboHighlightFill,\n 'text-shape': {\n fontWeight: 500\n }\n },\n inactive: {\n stroke: colorSet.comboInactiveStroke,\n fill: colorSet.comboInactiveFill,\n lineWidth: 1\n },\n disable: {\n stroke: colorSet.comboDisableStroke,\n fill: colorSet.comboDisableFill,\n lineWidth: 1\n }\n },\n delegateStyle: {\n fill: '#F3F9FF',\n fillOpacity: 0.5,\n stroke: '#1890FF',\n strokeOpacity: 0.9,\n lineDash: [5, 5]\n },\n windowFontFamily: typeof window !== 'undefined' && window.getComputedStyle ? window.getComputedStyle(document.body, null).getPropertyValue('font-family') || 'Arial, sans-serif' : 'Arial, sans-serif'\n});\n// CONCATENATED MODULE: ./node_modules/@antv/g6-core/es/util/letterAspectRatio.js\n/* harmony default export */ var letterAspectRatio = ({\n ' ': 0.3329986572265625,\n a: 0.5589996337890625,\n A: 0.6569992065429687,\n b: 0.58599853515625,\n B: 0.6769989013671875,\n c: 0.5469985961914062,\n C: 0.7279998779296875,\n d: 0.58599853515625,\n D: 0.705999755859375,\n e: 0.554998779296875,\n E: 0.63699951171875,\n f: 0.37299957275390627,\n F: 0.5769989013671875,\n g: 0.5909988403320312,\n G: 0.7479995727539063,\n h: 0.555999755859375,\n H: 0.7199996948242188,\n i: 0.255999755859375,\n I: 0.23699951171875,\n j: 0.26699981689453123,\n J: 0.5169998168945312,\n k: 0.5289993286132812,\n K: 0.6899993896484375,\n l: 0.23499908447265624,\n L: 0.5879989624023437,\n m: 0.854998779296875,\n M: 0.8819992065429687,\n n: 0.5589996337890625,\n N: 0.7189987182617188,\n o: 0.58599853515625,\n O: 0.7669998168945312,\n p: 0.58599853515625,\n P: 0.6419998168945312,\n q: 0.58599853515625,\n Q: 0.7669998168945312,\n r: 0.3649993896484375,\n R: 0.6759994506835938,\n s: 0.504998779296875,\n S: 0.6319992065429687,\n t: 0.354998779296875,\n T: 0.6189987182617187,\n u: 0.5599990844726562,\n U: 0.7139999389648437,\n v: 0.48199920654296874,\n V: 0.6389999389648438,\n w: 0.754998779296875,\n W: 0.929998779296875,\n x: 0.5089996337890625,\n X: 0.63699951171875,\n y: 0.4959991455078125,\n Y: 0.66199951171875,\n z: 0.48699951171875,\n Z: 0.6239990234375,\n '0': 0.6,\n '1': 0.40099945068359377,\n '2': 0.6,\n '3': 0.6,\n '4': 0.6,\n '5': 0.6,\n '6': 0.6,\n '7': 0.5469985961914062,\n '8': 0.6,\n '9': 0.6,\n '[': 0.3329986572265625,\n ']': 0.3329986572265625,\n ',': 0.26399993896484375,\n '.': 0.26399993896484375,\n ';': 0.26399993896484375,\n ':': 0.26399993896484375,\n '{': 0.3329986572265625,\n '}': 0.3329986572265625,\n '\\\\': 0.5,\n '|': 0.19499969482421875,\n '=': 0.604998779296875,\n '+': 0.604998779296875,\n '-': 0.604998779296875,\n _: 0.5,\n '`': 0.3329986572265625,\n ' ~': 0.8329986572265625,\n '!': 0.3329986572265625,\n '@': 0.8579986572265625,\n '#': 0.6,\n $: 0.6,\n '%': 0.9699996948242188,\n '^': 0.517999267578125,\n '&': 0.7259994506835937,\n '*': 0.505999755859375,\n '(': 0.3329986572265625,\n ')': 0.3329986572265625,\n '<': 0.604998779296875,\n '>': 0.604998779296875,\n '/': 0.5,\n '?': 0.53699951171875\n});\n// CONCATENATED MODULE: ./node_modules/@antv/g6-core/es/util/graphic.js\n\n\n\n\n\n\nvar PI = Math.PI,\n sin = Math.sin,\n cos = Math.cos; // 一共支持8个方向的自环,每个环占的角度是45度,在计算时再二分,为22.5度\n\nvar SELF_LINK_SIN = sin(PI / 8);\nvar SELF_LINK_COS = cos(PI / 8);\nvar graphic_getBBox = function getBBox(element, group) {\n var bbox = element.getBBox();\n var leftTop = {\n x: bbox.minX,\n y: bbox.minY\n };\n var rightBottom = {\n x: bbox.maxX,\n y: bbox.maxY\n }; // 根据父元素变换矩阵\n\n if (group) {\n var matrix = group.getMatrix();\n\n if (!matrix) {\n matrix = [1, 0, 0, 0, 1, 0, 0, 0, 1];\n }\n\n leftTop = math_applyMatrix(leftTop, matrix);\n rightBottom = math_applyMatrix(rightBottom, matrix);\n }\n\n var lx = leftTop.x,\n ly = leftTop.y;\n var rx = rightBottom.x,\n ry = rightBottom.y;\n return {\n x: lx,\n y: ly,\n minX: lx,\n minY: ly,\n maxX: rx,\n maxY: ry,\n width: rx - lx,\n height: ry - ly\n };\n};\n/**\n * get loop edge config\n * @param cfg edge config\n */\n\nvar graphic_getLoopCfgs = function getLoopCfgs(cfg) {\n var item = cfg.sourceNode || cfg.targetNode;\n var container = item.get('group');\n var containerMatrix = container.getMatrix();\n if (!containerMatrix) containerMatrix = [1, 0, 0, 0, 1, 0, 0, 0, 1];\n var keyShape = item.getKeyShape();\n var bbox = keyShape.getBBox();\n var loopCfg = cfg.loopCfg || {}; // 距离keyShape边的最高距离\n\n var dist = loopCfg.dist || Math.max(bbox.width, bbox.height) * 2; // 自环边与keyShape的相对位置关系\n\n var position = loopCfg.position || global.defaultLoopPosition; // 中心取group上真实位置\n\n var center = [containerMatrix[6], containerMatrix[7]];\n var startPoint = [cfg.startPoint.x, cfg.startPoint.y];\n var endPoint = [cfg.endPoint.x, cfg.endPoint.y];\n var rstart = bbox.height / 2;\n var rend = bbox.height / 2;\n var sinDeltaStart = rstart * SELF_LINK_SIN;\n var cosDeltaStart = rstart * SELF_LINK_COS;\n var sinDeltaEnd = rend * SELF_LINK_SIN;\n var cosDeltaEnd = rend * SELF_LINK_COS; // 如果定义了锚点的,直接用锚点坐标,否则,根据自环的 cfg 计算\n\n if (startPoint[0] === endPoint[0] && startPoint[1] === endPoint[1]) {\n switch (position) {\n case 'top':\n startPoint = [center[0] - sinDeltaStart, center[1] - cosDeltaStart];\n endPoint = [center[0] + sinDeltaEnd, center[1] - cosDeltaEnd];\n break;\n\n case 'top-right':\n rstart = bbox.height / 2;\n rend = bbox.width / 2;\n sinDeltaStart = rstart * SELF_LINK_SIN;\n cosDeltaStart = rstart * SELF_LINK_COS;\n sinDeltaEnd = rend * SELF_LINK_SIN;\n cosDeltaEnd = rend * SELF_LINK_COS;\n startPoint = [center[0] + sinDeltaStart, center[1] - cosDeltaStart];\n endPoint = [center[0] + cosDeltaEnd, center[1] - sinDeltaEnd];\n break;\n\n case 'right':\n rstart = bbox.width / 2;\n rend = bbox.width / 2;\n sinDeltaStart = rstart * SELF_LINK_SIN;\n cosDeltaStart = rstart * SELF_LINK_COS;\n sinDeltaEnd = rend * SELF_LINK_SIN;\n cosDeltaEnd = rend * SELF_LINK_COS;\n startPoint = [center[0] + cosDeltaStart, center[1] - sinDeltaStart];\n endPoint = [center[0] + cosDeltaEnd, center[1] + sinDeltaEnd];\n break;\n\n case 'bottom-right':\n rstart = bbox.width / 2;\n rend = bbox.height / 2;\n sinDeltaStart = rstart * SELF_LINK_SIN;\n cosDeltaStart = rstart * SELF_LINK_COS;\n sinDeltaEnd = rend * SELF_LINK_SIN;\n cosDeltaEnd = rend * SELF_LINK_COS;\n startPoint = [center[0] + cosDeltaStart, center[1] + sinDeltaStart];\n endPoint = [center[0] + sinDeltaEnd, center[1] + cosDeltaEnd];\n break;\n\n case 'bottom':\n rstart = bbox.height / 2;\n rend = bbox.height / 2;\n sinDeltaStart = rstart * SELF_LINK_SIN;\n cosDeltaStart = rstart * SELF_LINK_COS;\n sinDeltaEnd = rend * SELF_LINK_SIN;\n cosDeltaEnd = rend * SELF_LINK_COS;\n startPoint = [center[0] + sinDeltaStart, center[1] + cosDeltaStart];\n endPoint = [center[0] - sinDeltaEnd, center[1] + cosDeltaEnd];\n break;\n\n case 'bottom-left':\n rstart = bbox.height / 2;\n rend = bbox.width / 2;\n sinDeltaStart = rstart * SELF_LINK_SIN;\n cosDeltaStart = rstart * SELF_LINK_COS;\n sinDeltaEnd = rend * SELF_LINK_SIN;\n cosDeltaEnd = rend * SELF_LINK_COS;\n startPoint = [center[0] - sinDeltaStart, center[1] + cosDeltaStart];\n endPoint = [center[0] - cosDeltaEnd, center[1] + sinDeltaEnd];\n break;\n\n case 'left':\n rstart = bbox.width / 2;\n rend = bbox.width / 2;\n sinDeltaStart = rstart * SELF_LINK_SIN;\n cosDeltaStart = rstart * SELF_LINK_COS;\n sinDeltaEnd = rend * SELF_LINK_SIN;\n cosDeltaEnd = rend * SELF_LINK_COS;\n startPoint = [center[0] - cosDeltaStart, center[1] + sinDeltaStart];\n endPoint = [center[0] - cosDeltaEnd, center[1] - sinDeltaEnd];\n break;\n\n case 'top-left':\n rstart = bbox.width / 2;\n rend = bbox.height / 2;\n sinDeltaStart = rstart * SELF_LINK_SIN;\n cosDeltaStart = rstart * SELF_LINK_COS;\n sinDeltaEnd = rend * SELF_LINK_SIN;\n cosDeltaEnd = rend * SELF_LINK_COS;\n startPoint = [center[0] - cosDeltaStart, center[1] - sinDeltaStart];\n endPoint = [center[0] - sinDeltaEnd, center[1] - cosDeltaEnd];\n break;\n\n default:\n rstart = bbox.width / 2;\n rend = bbox.width / 2;\n sinDeltaStart = rstart * SELF_LINK_SIN;\n cosDeltaStart = rstart * SELF_LINK_COS;\n sinDeltaEnd = rend * SELF_LINK_SIN;\n cosDeltaEnd = rend * SELF_LINK_COS;\n startPoint = [center[0] - sinDeltaStart, center[1] - cosDeltaStart];\n endPoint = [center[0] + sinDeltaEnd, center[1] - cosDeltaEnd];\n } // 如果逆时针画,交换起点和终点\n\n\n if (loopCfg.clockwise === false) {\n var swap = [startPoint[0], startPoint[1]];\n startPoint = [endPoint[0], endPoint[1]];\n endPoint = [swap[0], swap[1]];\n }\n }\n\n var startVec = [startPoint[0] - center[0], startPoint[1] - center[1]];\n var scaleRateStart = (rstart + dist) / rstart;\n var scaleRateEnd = (rend + dist) / rend;\n\n if (loopCfg.clockwise === false) {\n scaleRateStart = (rend + dist) / rend;\n scaleRateEnd = (rstart + dist) / rstart;\n }\n\n var startExtendVec = matrix_util_esm[\"vec2\"].scale([0, 0], startVec, scaleRateStart);\n var controlPoint1 = [center[0] + startExtendVec[0], center[1] + startExtendVec[1]];\n var endVec = [endPoint[0] - center[0], endPoint[1] - center[1]];\n var endExtendVec = matrix_util_esm[\"vec2\"].scale([0, 0], endVec, scaleRateEnd);\n var controlPoint2 = [center[0] + endExtendVec[0], center[1] + endExtendVec[1]];\n cfg.startPoint = {\n x: startPoint[0],\n y: startPoint[1]\n };\n cfg.endPoint = {\n x: endPoint[0],\n y: endPoint[1]\n };\n cfg.controlPoints = [{\n x: controlPoint1[0],\n y: controlPoint1[1]\n }, {\n x: controlPoint2[0],\n y: controlPoint2[1]\n }];\n return cfg;\n};\n/**\n * 根据 label 所在线条的位置百分比,计算 label 坐标\n * @param {object} pathShape G 的 path 实例,一般是 Edge 实例的 keyShape\n * @param {number} percent 范围 0 - 1 的线条百分比\n * @param {number} refX x 轴正方向为基准的 label 偏移\n * @param {number} refY y 轴正方向为基准的 label 偏移\n * @param {boolean} rotate 是否根据线条斜率旋转文本\n * @return {object} 文本的 x, y, 文本的旋转角度\n */\n\nvar graphic_getLabelPosition = function getLabelPosition(pathShape, percent, refX, refY, rotate) {\n var TAN_OFFSET = 0.0001;\n var vector = [];\n var point = pathShape === null || pathShape === void 0 ? void 0 : pathShape.getPoint(percent);\n\n if (!point) {\n return {\n x: 0,\n y: 0,\n angle: 0\n };\n } // 头尾最可能,放在最前面,使用 g path 上封装的方法\n\n\n if (percent < TAN_OFFSET) {\n vector = pathShape.getStartTangent().reverse();\n } else if (percent > 1 - TAN_OFFSET) {\n vector = pathShape.getEndTangent();\n } else {\n // 否则取指定位置的点,与少量偏移的点,做微分向量\n var offsetPoint = pathShape === null || pathShape === void 0 ? void 0 : pathShape.getPoint(percent + TAN_OFFSET);\n vector.push([point.x, point.y]);\n vector.push([offsetPoint.x, offsetPoint.y]);\n }\n\n var rad = Math.atan2(vector[1][1] - vector[0][1], vector[1][0] - vector[0][0]);\n\n if (rad < 0) {\n rad += PI * 2;\n }\n\n if (refX) {\n point.x += cos(rad) * refX;\n point.y += sin(rad) * refX;\n }\n\n if (refY) {\n // 默认方向是 x 轴正方向,法线是 求出角度 - 90°\n var normal = rad - PI / 2; // 若法线角度在 y 轴负方向,切到正方向,保证 refY 相对于 y 轴正方向\n\n if (rad > 1 / 2 * PI && rad < 3 * 1 / 2 * PI) {\n normal -= PI;\n }\n\n point.x += cos(normal) * refY;\n point.y += sin(normal) * refY;\n }\n\n var result = {\n x: point.x,\n y: point.y,\n angle: rad\n };\n\n if (rotate) {\n if (rad > 0.5 * PI && rad < 1.5 * PI) {\n rad -= PI;\n }\n\n return Object(tslib_es6[\"__assign\"])({\n rotate: rad\n }, result);\n }\n\n return result;\n};\n/**\n * depth first traverse, from root to leaves, children in inverse order\n * if the fn returns false, terminate the traverse\n */\n\nvar graphic_traverse = function traverse(data, fn) {\n if (fn(data) === false) {\n return false;\n }\n\n if (data && data.children) {\n for (var i = data.children.length - 1; i >= 0; i--) {\n if (!traverse(data.children[i], fn)) return false;\n }\n }\n\n return true;\n};\n/**\n * depth first traverse, from leaves to root, children in inverse order\n * if the fn returns false, terminate the traverse\n */\n\n\nvar traverseUp = function traverseUp(data, fn) {\n if (data && data.children) {\n for (var i = data.children.length - 1; i >= 0; i--) {\n if (!traverseUp(data.children[i], fn)) return;\n }\n }\n\n if (fn(data) === false) {\n return false;\n }\n\n return true;\n};\n/**\n * depth first traverse, from root to leaves, children in inverse order\n * if the fn returns false, terminate the traverse\n */\n\n\nvar traverseTree = function traverseTree(data, fn) {\n if (typeof fn !== 'function') {\n return;\n }\n\n graphic_traverse(data, fn);\n};\n/**\n * depth first traverse, from leaves to root, children in inverse order\n * if the fn returns false, terminate the traverse\n */\n\nvar traverseTreeUp = function traverseTreeUp(data, fn) {\n if (typeof fn !== 'function') {\n return;\n }\n\n traverseUp(data, fn);\n};\n/**\n *\n * @param letter the letter\n * @param fontSize\n * @return the letter's width\n */\n\nvar graphic_getLetterWidth = function getLetterWidth(letter, fontSize) {\n return fontSize * (letterAspectRatio[letter] || 1);\n};\n/**\n *\n * @param text the text\n * @param fontSize\n * @return the text's size\n */\n\nvar getTextSize = function getTextSize(text, fontSize) {\n var width = 0;\n var pattern = new RegExp(\"[\\u4E00-\\u9FA5]+\");\n text.split('').forEach(function (letter) {\n if (pattern.test(letter)) {\n // 中文字符\n width += fontSize;\n } else {\n width += graphic_getLetterWidth(letter, fontSize);\n }\n });\n return [width, fontSize];\n};\n/**\n * construct the trees from combos data\n * @param array the combos array\n * @param nodes the nodes array\n * @return the tree\n */\n\nvar graphic_plainCombosToTrees = function plainCombosToTrees(array, nodes) {\n var result = [];\n var addedMap = {};\n var modelMap = {};\n array.forEach(function (d) {\n modelMap[d.id] = d;\n });\n array.forEach(function (d, i) {\n var cd = Object(esm[\"clone\"])(d);\n cd.itemType = 'combo';\n cd.children = undefined;\n\n if (cd.parentId === cd.id) {\n console.warn(\"The parentId for combo \" + cd.id + \" can not be the same as the combo's id\");\n delete cd.parentId;\n } else if (cd.parentId && !modelMap[cd.parentId]) {\n console.warn(\"The parent combo for combo \" + cd.id + \" does not exist!\");\n delete cd.parentId;\n }\n\n var mappedObj = addedMap[cd.id];\n\n if (mappedObj) {\n cd.children = mappedObj.children;\n addedMap[cd.id] = cd;\n mappedObj = cd;\n\n if (!mappedObj.parentId) {\n result.push(mappedObj);\n return;\n }\n\n var mappedParent = addedMap[mappedObj.parentId];\n\n if (mappedParent) {\n if (mappedParent.children) mappedParent.children.push(cd);else mappedParent.children = [cd];\n } else {\n var parent_1 = {\n id: mappedObj.parentId,\n children: [mappedObj]\n };\n addedMap[mappedObj.parentId] = parent_1;\n addedMap[cd.id] = cd;\n }\n\n return;\n }\n\n if (Object(esm[\"isString\"])(d.parentId)) {\n var parent_2 = addedMap[d.parentId];\n\n if (parent_2) {\n if (parent_2.children) parent_2.children.push(cd);else parent_2.children = [cd];\n addedMap[cd.id] = cd;\n } else {\n var pa = {\n id: d.parentId,\n children: [cd]\n };\n addedMap[pa.id] = pa;\n addedMap[cd.id] = cd;\n }\n } else {\n result.push(cd);\n addedMap[cd.id] = cd;\n }\n }); // proccess the nodes\n\n var nodeMap = {};\n (nodes || []).forEach(function (node) {\n nodeMap[node.id] = node;\n var combo = addedMap[node.comboId];\n\n if (combo) {\n var cnode = {\n id: node.id,\n comboId: node.comboId\n };\n if (combo.children) combo.children.push(cnode);else combo.children = [cnode];\n cnode.itemType = 'node';\n addedMap[node.id] = cnode;\n }\n }); // assign the depth for each element\n\n var maxDepth = 0;\n result.forEach(function (tree) {\n tree.depth = maxDepth + 10;\n graphic_traverse(tree, function (child) {\n var parent;\n var itemType = addedMap[child.id].itemType;\n\n if (itemType === 'node') {\n parent = addedMap[child.comboId];\n } else {\n parent = addedMap[child.parentId];\n }\n\n if (parent) {\n if (itemType === 'node') child.depth = maxDepth + 1;else child.depth = maxDepth + 10;\n } else {\n child.depth = maxDepth + 10;\n }\n\n if (maxDepth < child.depth) maxDepth = child.depth;\n var oriNodeModel = nodeMap[child.id];\n\n if (oriNodeModel) {\n oriNodeModel.depth = child.depth;\n }\n\n return true;\n });\n });\n return result;\n};\nvar reconstructTree = function reconstructTree(trees, subtreeId, newParentId) {\n var brothers = trees;\n var subtree;\n var comboChildsMap = {\n root: {\n children: trees\n }\n };\n var foundSubTree = false;\n var oldParentId = 'root';\n (trees || []).forEach(function (tree) {\n if (foundSubTree) return;\n\n if (tree.id === subtreeId) {\n subtree = tree;\n\n if (tree.itemType === 'combo') {\n subtree.parentId = newParentId;\n } else {\n subtree.comboId = newParentId;\n }\n\n foundSubTree = true;\n return;\n }\n\n traverseTree(tree, function (child) {\n comboChildsMap[child.id] = {\n children: child.children\n }; // store the old parent id to delete the subtree from the old parent's children in next recursion\n\n brothers = comboChildsMap[child.parentId || child.comboId || 'root'].children;\n\n if (child && (child.removed || subtreeId === child.id) && brothers) {\n oldParentId = child.parentId || child.comboId || 'root';\n subtree = child; // re-assign the parentId or comboId for the moved subtree\n\n if (child.itemType === 'combo') {\n subtree.parentId = newParentId;\n } else {\n subtree.comboId = newParentId;\n }\n\n foundSubTree = true;\n return false;\n }\n\n return true;\n });\n });\n brothers = comboChildsMap[oldParentId].children;\n var index = brothers ? brothers.indexOf(subtree) : -1;\n if (index > -1) brothers.splice(index, 1); // 如果遍历完整棵树还没有找到,说明之前就不在树中\n\n if (!foundSubTree) {\n subtree = {\n id: subtreeId,\n itemType: 'node',\n comboId: newParentId\n };\n comboChildsMap[subtreeId] = {\n children: undefined\n };\n } // append to new parent\n\n\n if (subtreeId) {\n var found_1 = false; // newParentId is undefined means the subtree will have no parent\n\n if (newParentId) {\n var newParentDepth_1 = 0;\n (trees || []).forEach(function (tree) {\n if (found_1) return; // terminate\n\n traverseTree(tree, function (child) {\n // append subtree to the new parent ans assign the depth to the subtree\n if (newParentId === child.id) {\n found_1 = true;\n if (child.children) child.children.push(subtree);else child.children = [subtree];\n newParentDepth_1 = child.depth;\n if (subtree.itemType === 'node') subtree.depth = newParentDepth_1 + 2;else subtree.depth = newParentDepth_1 + 1;\n return false; // terminate\n }\n\n return true;\n });\n });\n } else if ((!newParentId || !found_1) && subtree.itemType !== 'node') {\n // if the newParentId is undefined or it is not found in the tree, add the subTree to the root\n trees.push(subtree);\n } // update the depth of the subtree and its children from the subtree\n\n\n var currentDepth_1 = subtree.depth;\n traverseTree(subtree, function (child) {\n if (child.itemType === 'node') currentDepth_1 += 2;else currentDepth_1 += 1;\n child.depth = currentDepth_1;\n return true;\n });\n }\n\n return trees;\n};\nvar getComboBBox = function getComboBBox(children, graph) {\n var comboBBox = {\n minX: Infinity,\n minY: Infinity,\n maxX: -Infinity,\n maxY: -Infinity,\n x: undefined,\n y: undefined,\n width: undefined,\n height: undefined,\n centerX: undefined,\n centerY: undefined\n };\n\n if (!children || children.length === 0) {\n return comboBBox;\n }\n\n children.forEach(function (child) {\n var childItem = graph.findById(child.id);\n if (!childItem || !childItem.isVisible()) return; // ignore hidden children\n\n childItem.set('bboxCanvasCache', undefined);\n var childBBox = childItem.getCanvasBBox();\n if (childBBox.x && comboBBox.minX > childBBox.minX) comboBBox.minX = childBBox.minX;\n if (childBBox.y && comboBBox.minY > childBBox.minY) comboBBox.minY = childBBox.minY;\n if (childBBox.x && comboBBox.maxX < childBBox.maxX) comboBBox.maxX = childBBox.maxX;\n if (childBBox.y && comboBBox.maxY < childBBox.maxY) comboBBox.maxY = childBBox.maxY;\n });\n comboBBox.x = (comboBBox.minX + comboBBox.maxX) / 2;\n comboBBox.y = (comboBBox.minY + comboBBox.maxY) / 2;\n comboBBox.width = comboBBox.maxX - comboBBox.minX;\n comboBBox.height = comboBBox.maxY - comboBBox.minY;\n comboBBox.centerX = (comboBBox.minX + comboBBox.maxX) / 2;\n comboBBox.centerY = (comboBBox.minY + comboBBox.maxY) / 2;\n Object.keys(comboBBox).forEach(function (key) {\n if (comboBBox[key] === Infinity || comboBBox[key] === -Infinity) {\n comboBBox[key] = undefined;\n }\n });\n return comboBBox;\n};\nvar graphic_shouldRefreshEdge = function shouldRefreshEdge(cfg) {\n var refreshEdge = Object(esm[\"isNumber\"])(cfg.x) || Object(esm[\"isNumber\"])(cfg.y) || cfg.type || cfg.anchorPoints || cfg.size;\n if (cfg.style) refreshEdge = refreshEdge || Object(esm[\"isNumber\"])(cfg.style.r) || Object(esm[\"isNumber\"])(cfg.style.width) || Object(esm[\"isNumber\"])(cfg.style.height) || Object(esm[\"isNumber\"])(cfg.style.rx) || Object(esm[\"isNumber\"])(cfg.style.ry);\n return refreshEdge;\n};\nvar graphic_cloneBesidesImg = function cloneBesidesImg(obj) {\n var clonedObj = {};\n Object.keys(obj).forEach(function (key1) {\n var obj2 = obj[key1];\n\n if (Object(esm[\"isObject\"])(obj2) && !Object(esm[\"isArray\"])(obj2)) {\n var clonedObj2_1 = {};\n Object.keys(obj2).forEach(function (key2) {\n var v = obj2[key2];\n if (key2 === 'img' && !Object(esm[\"isString\"])(v)) return;\n clonedObj2_1[key2] = Object(esm[\"clone\"])(v);\n });\n clonedObj[key1] = clonedObj2_1;\n } else {\n clonedObj[key1] = Object(esm[\"clone\"])(obj2);\n }\n });\n return clonedObj;\n};\n// CONCATENATED MODULE: ./node_modules/@antv/g6-core/es/util/validation.js\n\n\n\n/**\n * 验证关系图或树图数据的合法性,必须符合以下规则才会渲染图:\n * 1. 必须传入数据\n * 2. 节点的 ID 必须为字符串,暂不支持数字类型,如果支持数字类型,会出现类似 123 与 '123' 是否相等的问题\n * 3. 边的 source 和 target 值必须在节点 ID 中存在\n * @param data 关系图或树图数据\n * @return boolean 全部验证通过返回 true,否则返回 false\n */\n\nvar validation_dataValidation = function dataValidation(data) {\n var _a; // 1. 必须传入数据\n\n\n if (!data) {\n console.error('G6 Error Tips: the data must be defined');\n return false;\n } // 2. 节点的 ID 必须为字符串或数字类型\n\n\n var nodes = data.nodes,\n edges = data.edges,\n _b = data.combos,\n combos = _b === void 0 ? [] : _b;\n\n if (!nodes && !edges) {\n var validated_1 = true; // 不存在 nodes 和 edges,则说明是 TreeGraphData,按 TreeGraphData 规则验证\n\n traverseTree(data, function (param) {\n if (!Object(esm[\"isString\"])(param.id)) {\n validated_1 = false;\n return false;\n }\n\n return true;\n });\n return validated_1;\n }\n\n var nonNode = (nodes || []).find(function (node) {\n return !Object(esm[\"isString\"])(node.id);\n });\n\n if (nonNode) {\n console.warn(\"G6 Warning Tips: missing 'id' property, or %c\" + nonNode.id + \"%c is not a string.\", 'font-size: 20px; color: red;', '');\n return false;\n } // 3. 边的 source 和 target 必须存在于节点 或 Combo中\n\n\n var nodeIds = (nodes || []).map(function (node) {\n return node.id;\n });\n var comboIds = (_a = combos) === null || _a === void 0 ? void 0 : _a.map(function (combo) {\n return combo.id;\n });\n\n var ids = Object(tslib_es6[\"__spreadArray\"])(Object(tslib_es6[\"__spreadArray\"])([], nodeIds, true), comboIds, true);\n\n var nonEdges = (edges || []).find(function (edge) {\n return !ids.includes(edge.source) || !ids.includes(edge.target);\n });\n\n if (nonEdges) {\n console.warn(\"G6 Warning Tips: The source %c\" + nonEdges.source + \"%c or the target %c\" + nonEdges.target + \"%c of the edge do not exist in the nodes or combos.\", 'font-size: 20px; color: red;', '', 'font-size: 20px; color: red;', '');\n return false;\n }\n\n return true;\n};\n/**\n * 验证添加节点、边或从combo时的数据\n * @param type 节点、边或从combo\n * @param data 添加的单条数据\n * @return boolean 全部验证通过返回 true,否则返回 false\n */\n\nvar validation_singleDataValidation = function singleDataValidation(type, data) {\n if (type === 'node' || type === 'combo') {\n // 必须有 id 字段,且id必须为字符串类型\n if (data.id && !Object(esm[\"isString\"])(data.id)) {\n console.warn(\"G6 Warning Tips: missing 'id' property, or the 'id' %c\" + data.id + \"%c is not a string.\", 'font-size: 20px; color: red;', '');\n return false;\n }\n } else if (type === 'edge') {\n // 必须有 source 和 target 字段\n if (!data.source || !data.target) {\n console.warn(\"G6 Warning Tips: missing 'source' or 'target' for the edge.\");\n return false;\n }\n }\n\n return true;\n};\n// CONCATENATED MODULE: ./node_modules/@antv/g6-core/es/graph/controller/mode.js\n\n\n\nvar mode_ModeController =\n/** @class */\nfunction () {\n function ModeController(graph) {\n this.graph = graph;\n this.destroyed = false;\n this.modes = graph.get('modes') || {\n default: []\n };\n this.formatModes();\n this.mode = graph.get('defaultMode') || 'default';\n this.currentBehaves = [];\n this.setMode(this.mode);\n }\n\n ModeController.prototype.formatModes = function () {\n var modes = this.modes;\n Object(esm[\"each\"])(modes, function (mode) {\n Object(esm[\"each\"])(mode, function (behavior, i) {\n if (Object(esm[\"isString\"])(behavior)) {\n mode[i] = {\n type: behavior\n };\n }\n });\n });\n };\n\n ModeController.prototype.setBehaviors = function (mode) {\n var graph = this.graph;\n var behaviors = this.modes[mode];\n var behaves = [];\n var behave;\n Object(esm[\"each\"])(behaviors || [], function (behavior) {\n var BehaviorInstance = behavior_behavior.getBehavior(behavior.type || behavior);\n\n if (!BehaviorInstance) {\n return;\n }\n\n behave = new BehaviorInstance(behavior);\n\n if (behave) {\n behave.bind(graph);\n behaves.push(behave);\n }\n });\n this.currentBehaves = behaves;\n };\n\n ModeController.mergeBehaviors = function (modeBehaviors, behaviors) {\n Object(esm[\"each\"])(behaviors, function (behavior) {\n if (modeBehaviors.indexOf(behavior) < 0) {\n if (Object(esm[\"isString\"])(behavior)) {\n behavior = {\n type: behavior\n };\n }\n\n modeBehaviors.push(behavior);\n }\n });\n return modeBehaviors;\n };\n\n ModeController.filterBehaviors = function (modeBehaviors, behaviors) {\n var result = [];\n modeBehaviors.forEach(function (behavior) {\n var type = '';\n\n if (Object(esm[\"isString\"])(behavior)) {\n type = behavior;\n } else {\n // eslint-disable-next-line prefer-destructuring\n type = behavior.type;\n }\n\n if (behaviors.indexOf(type) < 0) {\n result.push(behavior);\n }\n });\n return result;\n };\n\n ModeController.prototype.setMode = function (mode) {\n var _a = this,\n modes = _a.modes,\n graph = _a.graph;\n\n var current = mode;\n var behaviors = modes[current];\n\n if (!behaviors) {\n return;\n }\n\n graph.emit('beforemodechange', {\n mode: mode\n });\n Object(esm[\"each\"])(this.currentBehaves, function (behave) {\n if (behave.delegate) behave.delegate.remove();\n behave.unbind(graph);\n });\n this.setBehaviors(current);\n graph.emit('aftermodechange', {\n mode: mode\n });\n this.mode = mode;\n };\n\n ModeController.prototype.getMode = function () {\n return this.mode;\n };\n /**\n * 动态增加或删除 Behavior\n *\n * @param {ModeType[]} behaviors\n * @param {(ModeType[] | ModeType)} modes\n * @param {boolean} isAdd\n * @returns {Mode}\n * @memberof Mode\n */\n\n\n ModeController.prototype.manipulateBehaviors = function (behaviors, modes, isAdd) {\n var _this = this;\n\n var behaves;\n\n if (!Object(esm[\"isArray\"])(behaviors)) {\n behaves = [behaviors];\n } else {\n behaves = behaviors;\n }\n\n if (Object(esm[\"isArray\"])(modes)) {\n Object(esm[\"each\"])(modes, function (mode) {\n if (!_this.modes[mode]) {\n if (isAdd) {\n _this.modes[mode] = behaves;\n }\n } else if (isAdd) {\n _this.modes[mode] = ModeController.mergeBehaviors(_this.modes[mode] || [], behaves);\n } else {\n _this.modes[mode] = ModeController.filterBehaviors(_this.modes[mode] || [], behaves);\n }\n });\n return this;\n }\n\n var currentMode = modes;\n\n if (!modes) {\n currentMode = this.mode; // isString(this.mode) ? this.mode : this.mode.type\n }\n\n if (!this.modes[currentMode]) {\n if (isAdd) {\n this.modes[currentMode] = behaves;\n }\n }\n\n if (isAdd) {\n this.modes[currentMode] = ModeController.mergeBehaviors(this.modes[currentMode] || [], behaves);\n } else {\n this.modes[currentMode] = ModeController.filterBehaviors(this.modes[currentMode] || [], behaves);\n }\n\n this.formatModes();\n this.setMode(this.mode);\n return this;\n };\n /**\n * 更新行为参数\n * @param {string | ModeOption | ModeType} behavior 需要更新的行为\n * @param {string | string[]} modes 指定的模式中的行为,不指定则为 default\n * @return {Graph} Graph\n */\n\n\n ModeController.prototype.updateBehavior = function (behavior, newCfg, mode) {\n if (Object(esm[\"isString\"])(behavior)) {\n behavior = {\n type: behavior\n };\n }\n\n var behaviorSet = [];\n\n if (!mode || mode === this.mode || mode === 'default') {\n behaviorSet = this.currentBehaves;\n\n if (!behaviorSet || !behaviorSet.length) {\n console.warn('Update behavior failed! There is no behaviors in this mode on the graph.');\n return this;\n }\n\n var length_1 = behaviorSet.length;\n\n for (var i = 0; i < length_1; i++) {\n var behave = behaviorSet[i];\n\n if (behave.type === behavior.type) {\n behave.updateCfg(newCfg);\n return this;\n }\n\n if (i === length_1 - 1) console.warn('Update behavior failed! There is no such behavior in the mode');\n }\n } else {\n behaviorSet = this.modes[mode];\n\n if (!behaviorSet || !behaviorSet.length) {\n console.warn('Update behavior failed! There is no behaviors in this mode on the graph.');\n return this;\n }\n\n var length_2 = behaviorSet.length;\n\n for (var i = 0; i < length_2; i++) {\n var behave = behaviorSet[i];\n\n if (behave.type === behavior.type || behave === behavior.type) {\n if (behave === behavior.type) behave = {\n type: behave\n };\n Object.assign(behave, newCfg);\n behaviorSet[i] = behave;\n return this;\n }\n\n if (i === length_2 - 1) console.warn('Update behavior failed! There is no such behavior in the mode');\n }\n }\n\n return this;\n };\n\n ModeController.prototype.destroy = function () {\n this.graph = null;\n this.modes = null;\n this.currentBehaves = null;\n this.destroyed = true;\n };\n\n return ModeController;\n}();\n\n/* harmony default export */ var controller_mode = (mode_ModeController);\n// EXTERNAL MODULE: ./node_modules/@antv/g-base/esm/index.js\nvar g_base_esm = __webpack_require__(21);\n\n// CONCATENATED MODULE: ./node_modules/@antv/g6-core/es/interface/behavior.js\n\n\n\nvar behavior_G6GraphEvent =\n/** @class */\nfunction (_super) {\n Object(tslib_es6[\"__extends\"])(G6GraphEvent, _super);\n\n function G6GraphEvent(type, event) {\n var _this = _super.call(this, type, event) || this;\n\n _this.item = event.item;\n _this.canvasX = event.canvasX;\n _this.canvasY = event.canvasY;\n _this.wheelDelta = event.wheelDelta;\n _this.detail = event.detail;\n return _this;\n }\n\n return G6GraphEvent;\n}(g_base_esm[\"Event\"]);\n\n\n// CONCATENATED MODULE: ./node_modules/@antv/g6-core/es/util/base.js\n\n\nvar base_uniqueId = function uniqueId(type) {\n return type + \"-\" + Math.random() + Date.now();\n};\n/**\n * turn padding into [top, right, bottom, right]\n * @param {Number|Array} padding input padding\n * @return {array} output\n */\n\nvar base_formatPadding = function formatPadding(padding) {\n if (Object(esm[\"isArray\"])(padding)) {\n switch (padding.length) {\n case 4:\n return padding;\n\n case 3:\n padding.push(padding[1]);\n return padding;\n\n case 2:\n return padding.concat(padding);\n\n case 1:\n return [padding[0], padding[0], padding[0], padding[0]];\n\n default:\n return [0, 0, 0, 0];\n }\n }\n\n if (Object(esm[\"isNumber\"])(padding)) {\n return [padding, padding, padding, padding];\n } else if (Object(esm[\"isString\"])(padding)) {\n var intPadding = parseInt(padding, 10);\n return [intPadding, intPadding, intPadding, intPadding];\n }\n\n return [0, 0, 0, 0];\n};\n/**\n * clone event\n * @param e\n */\n\nvar base_cloneEvent = function cloneEvent(e) {\n var event = new behavior_G6GraphEvent(e.type, e);\n event.clientX = e.clientX;\n event.clientY = e.clientY;\n event.x = e.x;\n event.y = e.y;\n event.target = e.target;\n event.currentTarget = e.currentTarget;\n event.bubbles = true;\n event.item = e.item;\n return event;\n};\n/**\n * 判断 viewport 是否改变,通过和单位矩阵对比\n * @param matrix Viewport 的 Matrix\n */\n\nvar isViewportChanged = function isViewportChanged(matrix) {\n // matrix 为 null, 则说明没有变化\n if (!matrix) {\n return false;\n }\n\n var MATRIX_LEN = 9;\n var ORIGIN_MATRIX = [1, 0, 0, 0, 1, 0, 0, 0, 1];\n\n for (var i = 0; i < MATRIX_LEN; i++) {\n if (matrix[i] !== ORIGIN_MATRIX[i]) {\n return true;\n }\n }\n\n return false;\n};\nvar base_isNaN = function isNaN(input) {\n return Number.isNaN(Number(input));\n};\n/**\n * 计算一组 Item 的 BBox\n * @param items 选中的一组Item,可以是 node 或 combo\n */\n\nvar calculationItemsBBox = function calculationItemsBBox(items) {\n var minx = Infinity;\n var maxx = -Infinity;\n var miny = Infinity;\n var maxy = -Infinity; // 获取已节点的所有最大最小x y值\n\n for (var i = 0; i < items.length; i++) {\n var element = items[i];\n var bbox = element.getBBox();\n var minX = bbox.minX,\n minY = bbox.minY,\n maxX = bbox.maxX,\n maxY = bbox.maxY;\n\n if (minX < minx) {\n minx = minX;\n }\n\n if (minY < miny) {\n miny = minY;\n }\n\n if (maxX > maxx) {\n maxx = maxX;\n }\n\n if (maxY > maxy) {\n maxy = maxY;\n }\n }\n\n var x = Math.floor(minx);\n var y = Math.floor(miny);\n var width = Math.ceil(maxx) - Math.floor(minx);\n var height = Math.ceil(maxy) - Math.floor(miny);\n return {\n x: x,\n y: y,\n width: width,\n height: height,\n minX: minx,\n minY: miny,\n maxX: maxx,\n maxY: maxy\n };\n};\n/**\n * 若 edges 中存在两端点相同的边,使用 quadratic 边并自动计算 curveOffset 使它们不相互重叠\n * 文档: https://g6.antv.vision/en/docs/api/Util\n * @param edges 边数据集合\n * @param offsetDiff 相邻两边的 offset 之差\n * @param multiEdgeType\n * @param singleEdgeType\n * @param loopEdgeType\n */\n\nvar processParallelEdges = function processParallelEdges(edges, offsetDiff, multiEdgeType, singleEdgeType, loopEdgeType) {\n if (offsetDiff === void 0) {\n offsetDiff = 15;\n }\n\n if (multiEdgeType === void 0) {\n multiEdgeType = 'quadratic';\n }\n\n if (singleEdgeType === void 0) {\n singleEdgeType = undefined;\n }\n\n if (loopEdgeType === void 0) {\n loopEdgeType = undefined;\n }\n\n var len = edges.length;\n var cod = offsetDiff * 2;\n var loopPosition = ['top', 'top-right', 'right', 'bottom-right', 'bottom', 'bottom-left', 'left', 'top-left'];\n var edgeMap = {};\n var tags = [];\n var reverses = {};\n\n for (var i = 0; i < len; i++) {\n var edge = edges[i];\n var source = edge.source,\n target = edge.target;\n var sourceTarget = source + \"-\" + target;\n if (tags[i]) continue;\n\n if (!edgeMap[sourceTarget]) {\n edgeMap[sourceTarget] = [];\n }\n\n tags[i] = true;\n edgeMap[sourceTarget].push(edge);\n\n for (var j = 0; j < len; j++) {\n if (i === j) continue;\n var sedge = edges[j];\n var src = sedge.source;\n var dst = sedge.target; // 两个节点之间共同的边\n // 第一条的source = 第二条的target\n // 第一条的target = 第二条的source\n\n if (!tags[j]) {\n if (source === dst && target === src) {\n edgeMap[sourceTarget].push(sedge);\n tags[j] = true;\n reverses[src + \"|\" + dst + \"|\" + (edgeMap[sourceTarget].length - 1)] = true;\n } else if (source === src && target === dst) {\n edgeMap[sourceTarget].push(sedge);\n tags[j] = true;\n }\n }\n }\n }\n\n for (var key in edgeMap) {\n var arcEdges = edgeMap[key];\n var length_1 = arcEdges.length;\n\n for (var k = 0; k < length_1; k++) {\n var current = arcEdges[k];\n\n if (current.source === current.target) {\n if (loopEdgeType) current.type = loopEdgeType; // 超过8条自环边,则需要重新处理\n\n current.loopCfg = {\n position: loopPosition[k % 8],\n dist: Math.floor(k / 8) * 20 + 50\n };\n continue;\n }\n\n if (length_1 === 1 && singleEdgeType && current.source !== current.target) {\n current.type = singleEdgeType;\n continue;\n }\n\n current.type = multiEdgeType;\n var sign = (k % 2 === 0 ? 1 : -1) * (reverses[current.source + \"|\" + current.target + \"|\" + k] ? -1 : 1);\n\n if (length_1 % 2 === 1) {\n current.curveOffset = sign * Math.ceil(k / 2) * cod;\n } else {\n current.curveOffset = sign * (Math.floor(k / 2) * cod + offsetDiff);\n }\n }\n }\n\n return edges;\n};\n// CONCATENATED MODULE: ./node_modules/@antv/g6-core/es/graph/controller/view.js\n\n\n\n\n\nvar view_ViewController =\n/** @class */\nfunction () {\n function ViewController(graph) {\n this.destroyed = false;\n this.graph = graph;\n this.destroyed = false;\n } // get view center coordinate\n\n\n ViewController.prototype.getViewCenter = function () {\n var padding = this.getFormatPadding();\n var graph = this.graph;\n var width = this.graph.get('width');\n var height = graph.get('height');\n return {\n x: (width - padding[1] - padding[3]) / 2 + padding[3],\n y: (height - padding[0] - padding[2]) / 2 + padding[0]\n };\n };\n\n ViewController.prototype.fitCenter = function () {\n var graph = this.graph;\n var group = graph.get('group');\n group.resetMatrix();\n var bbox = group.getCanvasBBox();\n if (bbox.width === 0 || bbox.height === 0) return;\n var viewCenter = this.getViewCenter();\n var groupCenter = {\n x: bbox.x + bbox.width / 2,\n y: bbox.y + bbox.height / 2\n };\n graph.translate(viewCenter.x - groupCenter.x, viewCenter.y - groupCenter.y);\n }; // fit view graph\n\n\n ViewController.prototype.fitView = function () {\n var graph = this.graph;\n var padding = this.getFormatPadding();\n var width = graph.get('width');\n var height = graph.get('height');\n var group = graph.get('group');\n group.resetMatrix();\n var bbox = group.getCanvasBBox();\n if (bbox.width === 0 || bbox.height === 0) return;\n var viewCenter = this.getViewCenter();\n var groupCenter = {\n x: bbox.x + bbox.width / 2,\n y: bbox.y + bbox.height / 2\n };\n graph.translate(viewCenter.x - groupCenter.x, viewCenter.y - groupCenter.y);\n var w = (width - padding[1] - padding[3]) / bbox.width;\n var h = (height - padding[0] - padding[2]) / bbox.height;\n var ratio = w;\n\n if (w > h) {\n ratio = h;\n }\n\n if (!graph.zoom(ratio, viewCenter)) {\n console.warn('zoom failed, ratio out of range, ratio: %f', ratio);\n }\n }; // fit view graph by rule\n\n\n ViewController.prototype.fitViewByRules = function (rules) {\n var _a = rules.onlyOutOfViewPort,\n onlyOutOfViewPort = _a === void 0 ? false : _a,\n _b = rules.direction,\n direction = _b === void 0 ? 'both' : _b,\n _c = rules.ratioRule,\n ratioRule = _c === void 0 ? 'min' : _c;\n var graph = this.graph;\n var padding = this.getFormatPadding();\n var width = graph.get('width');\n var height = graph.get('height');\n var group = graph.get('group');\n group.resetMatrix();\n var bbox = group.getCanvasBBox();\n if (bbox.width === 0 || bbox.height === 0) return;\n var viewCenter = this.getViewCenter();\n var groupCenter = {\n x: bbox.x + bbox.width / 2,\n y: bbox.y + bbox.height / 2\n };\n graph.translate(viewCenter.x - groupCenter.x, viewCenter.y - groupCenter.y);\n var wRatio = (width - padding[1] - padding[3]) / bbox.width;\n var hRatio = (height - padding[0] - padding[2]) / bbox.height;\n var ratio;\n\n if (direction === 'x') {\n ratio = wRatio;\n } else if (direction === 'y') {\n ratio = hRatio;\n } else {\n // ratioRule\n ratio = ratioRule === 'max' ? Math.max(wRatio, hRatio) : Math.min(wRatio, hRatio);\n } // 如果设置了仅对超出视口宽高的场景进行fitview,则没超出的场景zoom取1\n\n\n if (onlyOutOfViewPort) {\n ratio = ratio < 1 ? ratio : 1;\n }\n\n var initZoomRatio = graph.getZoom();\n var endZoom = initZoomRatio * ratio;\n var minZoom = graph.get('minZoom'); // 如果zoom小于最小zoom, 则以最小zoom为准\n\n if (endZoom < minZoom) {\n endZoom = minZoom;\n console.warn('fitview failed, ratio out of range, ratio: %f', ratio, 'graph minzoom has been used instead');\n }\n\n graph.zoomTo(endZoom, viewCenter);\n };\n\n ViewController.prototype.getFormatPadding = function () {\n var padding = this.graph.get('fitViewPadding');\n return base_formatPadding(padding);\n };\n\n ViewController.prototype.focusPoint = function (point, animate, animateCfg) {\n var _this = this;\n\n var viewCenter = this.getViewCenter();\n var modelCenter = this.getPointByCanvas(viewCenter.x, viewCenter.y);\n var viewportMatrix = this.graph.get('group').getMatrix();\n if (!viewportMatrix) viewportMatrix = [1, 0, 0, 0, 1, 0, 0, 0, 1];\n\n if (animate) {\n var dx_1 = (modelCenter.x - point.x) * viewportMatrix[0];\n var dy_1 = (modelCenter.y - point.y) * viewportMatrix[4];\n var lastX_1 = 0;\n var lastY_1 = 0;\n var newX_1 = 0;\n var newY_1 = 0; // 动画每次平移一点,直到目标位置\n\n this.graph.get('canvas').animate(function (ratio) {\n newX_1 = dx_1 * ratio;\n newY_1 = dy_1 * ratio;\n\n _this.graph.translate(newX_1 - lastX_1, newY_1 - lastY_1);\n\n lastX_1 = newX_1;\n lastY_1 = newY_1;\n }, Object(tslib_es6[\"__assign\"])({}, animateCfg));\n } else {\n this.graph.translate((modelCenter.x - point.x) * viewportMatrix[0], (modelCenter.y - point.y) * viewportMatrix[4]);\n }\n };\n /**\n * 将 Canvas 坐标转成视口坐标\n * @param canvasX canvas x 坐标\n * @param canvasY canvas y 坐标\n */\n\n\n ViewController.prototype.getPointByCanvas = function (canvasX, canvasY) {\n var viewportMatrix = this.graph.get('group').getMatrix();\n\n if (!viewportMatrix) {\n viewportMatrix = [1, 0, 0, 0, 1, 0, 0, 0, 1];\n }\n\n var point = math_invertMatrix({\n x: canvasX,\n y: canvasY\n }, viewportMatrix);\n return point;\n };\n /**\n * 将页面坐标转成视口坐标\n * @param clientX 页面 x 坐标\n * @param clientY 页面 y 坐标\n */\n\n\n ViewController.prototype.getPointByClient = function (clientX, clientY) {\n var canvas = this.graph.get('canvas');\n var canvasPoint = canvas.getPointByClient(clientX, clientY);\n return this.getPointByCanvas(canvasPoint.x, canvasPoint.y);\n };\n /**\n * 将视口坐标转成页面坐标\n * @param x 视口 x 坐标\n * @param y 视口 y 坐标\n */\n\n\n ViewController.prototype.getClientByPoint = function (x, y) {\n var canvas = this.graph.get('canvas');\n var canvasPoint = this.getCanvasByPoint(x, y);\n var point = canvas.getClientByPoint(canvasPoint.x, canvasPoint.y);\n return {\n x: point.x,\n y: point.y\n };\n };\n /**\n * 将视口坐标转成 Canvas 坐标\n * @param x 视口 x 坐标\n * @param y 视口 y 坐标\n */\n\n\n ViewController.prototype.getCanvasByPoint = function (x, y) {\n var viewportMatrix = this.graph.get('group').getMatrix();\n\n if (!viewportMatrix) {\n viewportMatrix = [1, 0, 0, 0, 1, 0, 0, 0, 1];\n }\n\n return math_applyMatrix({\n x: x,\n y: y\n }, viewportMatrix);\n };\n /**\n * 将元素移动到画布中心\n * @param item Item 实例或 id\n * @param {boolean} animate 是否带有动画地移动\n * @param {GraphAnimateConfig} animateCfg 若带有动画,动画的配置项\n */\n\n\n ViewController.prototype.focus = function (item, animate, animateCfg) {\n if (Object(esm[\"isString\"])(item)) {\n item = this.graph.findById(item);\n }\n\n if (item) {\n var x = 0,\n y = 0;\n\n if (item.getType && item.getType() === 'edge') {\n var sourceMatrix = item.getSource().get('group').getMatrix();\n var targetMatrix = item.getTarget().get('group').getMatrix();\n\n if (sourceMatrix && targetMatrix) {\n x = (sourceMatrix[6] + targetMatrix[6]) / 2;\n y = (sourceMatrix[7] + targetMatrix[7]) / 2;\n } else if (sourceMatrix || targetMatrix) {\n x = sourceMatrix ? sourceMatrix[6] : targetMatrix[6];\n y = sourceMatrix ? sourceMatrix[7] : targetMatrix[7];\n }\n } else {\n var group = item.get('group');\n var matrix = group.getMatrix();\n if (!matrix) matrix = [1, 0, 0, 0, 1, 0, 0, 0, 1];\n x = matrix[6];\n y = matrix[7];\n } // 用实际位置而不是model中的x,y,防止由于拖拽等的交互导致model的x,y并不是当前的x,y\n\n\n this.focusPoint({\n x: x,\n y: y\n }, animate, animateCfg);\n }\n };\n /**\n * 改变 canvas 画布的宽度和高度\n * @param width canvas 宽度\n * @param height canvas 高度\n */\n\n\n ViewController.prototype.changeSize = function (width, height) {\n var graph = this.graph;\n\n if (!Object(esm[\"isNumber\"])(width) || !Object(esm[\"isNumber\"])(height)) {\n throw Error('invalid canvas width & height, please make sure width & height type is number');\n }\n\n graph.set({\n width: width,\n height: height\n });\n var canvas = graph.get('canvas');\n canvas.changeSize(width, height); // change the size of grid plugin if it exists on graph\n\n var plugins = graph.get('plugins');\n plugins.forEach(function (plugin) {\n if (plugin.get('gridContainer')) {\n // 网格定位信息初始化\n plugin.positionInit();\n }\n });\n };\n\n ViewController.prototype.destroy = function () {\n this.graph = null;\n this.destroyed = false;\n };\n\n return ViewController;\n}();\n\n/* harmony default export */ var view = (view_ViewController);\n// CONCATENATED MODULE: ./node_modules/@antv/g6-core/es/element/xml.js\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\n/**\n * @fileOverview 从xml建立自定义Node,包含update\n * @author xuzhi.mxz@antfin.com\n */\n\n\n\n/**\n * 一种更宽松的JSON 解析,如果遇到不符合规范的字段会直接转为字符串\n * @param text json 内容\n */\n\nfunction looseJSONParse(text) {\n if (typeof text !== 'string') {\n return text;\n }\n\n var safeParse = function safeParse(str) {\n if (typeof str !== 'string') {\n return str;\n }\n\n try {\n return JSON.parse(str.trim());\n } catch (e) {\n return str.trim();\n }\n };\n\n var firstAttempt = safeParse(text);\n\n if (typeof firstAttempt !== 'string') {\n return firstAttempt;\n }\n\n var tail = function tail(arr) {\n return arr[arr.length - 1];\n };\n\n var str = text.trim();\n var objectStack = [];\n var syntaxStack = [];\n\n var isLastPair = function isLastPair() {\n var syntaxes = [];\n\n for (var _i = 0; _i < arguments.length; _i++) {\n syntaxes[_i] = arguments[_i];\n }\n\n return syntaxes.some(function (syntax) {\n return tail(syntaxStack) === syntax;\n });\n };\n\n var getValueStore = function getValueStore() {\n return tail(objectStack);\n };\n\n var rst = null;\n var i = 0;\n var temp = '';\n\n while (i < str.length) {\n var nowChar = str[i];\n var isInString = isLastPair('\"', \"'\");\n\n if (!isInString && !nowChar.trim()) {\n i += 1;\n continue;\n }\n\n var isLastTranslate = str[i - 1] === '\\\\';\n var isInObject = isLastPair('}');\n var isInArray = isLastPair(']');\n var isWaitingValue = isLastPair(',');\n var tempArr = getValueStore();\n\n if (isInString) {\n if (tail(syntaxStack) === nowChar && !isLastTranslate) {\n syntaxStack.pop();\n var value = safeParse(temp);\n tempArr.push(value);\n rst = value;\n temp = '';\n } else {\n temp += nowChar;\n }\n } else if (isInArray && nowChar === ',') {\n if (temp) {\n tempArr.push(safeParse(temp));\n temp = '';\n }\n } else if (isInObject && nowChar === ':') {\n syntaxStack.push(',');\n\n if (temp) {\n tempArr.push(temp);\n temp = '';\n }\n } else if (isWaitingValue && nowChar === ',') {\n if (temp) {\n tempArr.push(safeParse(temp));\n temp = '';\n }\n\n syntaxStack.pop();\n } else if (nowChar === '}' && (isInObject || isWaitingValue)) {\n if (temp) {\n tempArr.push(safeParse(temp));\n temp = '';\n }\n\n if (isWaitingValue) {\n syntaxStack.pop();\n }\n\n var obj = {};\n\n for (var c = 1; c < tempArr.length; c += 2) {\n obj[tempArr[c - 1]] = tempArr[c];\n }\n\n objectStack.pop();\n\n if (objectStack.length) {\n tail(objectStack).push(obj);\n }\n\n syntaxStack.pop();\n rst = obj;\n } else if (nowChar === ']' && isInArray) {\n if (temp) {\n tempArr.push(safeParse(temp));\n temp = '';\n }\n\n objectStack.pop();\n\n if (objectStack.length) {\n tail(objectStack).push(tempArr);\n }\n\n syntaxStack.pop();\n rst = tempArr;\n } else if (nowChar === '{') {\n objectStack.push([]);\n syntaxStack.push('}');\n } else if (nowChar === '[') {\n objectStack.push([]);\n syntaxStack.push(']');\n } else if (nowChar === '\"') {\n syntaxStack.push('\"');\n } else if (nowChar === \"'\") {\n syntaxStack.push(\"'\");\n } else {\n temp += nowChar;\n }\n\n i += 1;\n }\n\n return rst || temp;\n}\n\nvar keyConvert = function keyConvert(str) {\n return str.split('-').reduce(function (a, b) {\n return a + b.charAt(0).toUpperCase() + b.slice(1);\n });\n};\n/**\n * 简单的一个{{}}模板渲染,不包含任何复杂语法\n * @param xml\n */\n\n\nvar xml_xmlDataRenderer = function xmlDataRenderer(xml) {\n return function (data) {\n var len = xml.length;\n var arr = [];\n var i = 0;\n var tmp = '';\n\n while (i < len) {\n if (xml[i] === '{' && xml[i + 1] === '{') {\n arr.push(tmp);\n tmp = '';\n i += 2;\n } else if (xml[i] === '}' && xml[i + 1] === '}') {\n if (arr.length) {\n var last = arr.pop();\n tmp = Object(esm[\"get\"])(data, tmp, last.endsWith('=') ? \"\\\"{\" + tmp + \"}\\\"\" : tmp);\n arr.push(last + tmp);\n }\n\n i += 2;\n tmp = '';\n } else {\n tmp += xml[i];\n i += 1;\n }\n }\n\n arr.push(tmp);\n return arr.map(function (e, index) {\n return arr[index - 1] && arr[index - 1].endsWith('=') ? \"\\\"{\" + e + \"}\\\"\" : e;\n }).join('');\n };\n};\n/**\n * 解析XML,并转化为相应的JSON结构\n * @param xml xml解析后的节点\n */\n\nfunction parseXML(xml, cfg) {\n var attrs = {};\n var keys = xml.getAttributeNames && xml.getAttributeNames() || [];\n var children = xml.children && Array.from(xml.children).map(function (e) {\n return parseXML(e, cfg);\n });\n var rst = {};\n var tagName = xml.tagName ? xml.tagName.toLowerCase() : 'group';\n\n if (tagName === 'text') {\n attrs.text = xml.innerText;\n }\n\n rst.type = tagName;\n\n if (tagName === 'img') {\n rst.type = 'image';\n }\n\n Array.from(keys).forEach(function (k) {\n var key = keyConvert(k);\n var val = xml.getAttribute(k);\n\n try {\n if (key === 'style' || key === 'attrs') {\n var style = looseJSONParse(val);\n attrs = Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, attrs), style);\n } else {\n rst[key] = looseJSONParse(val);\n }\n } catch (e) {\n if (key === 'style') {\n throw e;\n }\n\n rst[key] = val;\n }\n });\n rst.attrs = attrs;\n\n if (cfg && cfg.style && rst.name && _typeof(cfg.style[rst.name]) === 'object') {\n rst.attrs = Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, rst.attrs), cfg.style[rst.name]);\n }\n\n if (cfg && cfg.style && rst.keyshape) {\n rst.attrs = Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, rst.attrs), cfg.style);\n }\n\n if (children.length) {\n rst.children = children;\n }\n\n return rst;\n}\n/**\n * 根据偏移量和内部节点最终的bounding box来得出该shape最终的bbox\n */\n\nfunction xml_getBBox(node, offset, chilrenBBox) {\n var _a = node.attrs,\n attrs = _a === void 0 ? {} : _a;\n var bbox = {\n x: offset.x || 0,\n y: offset.y || 0,\n width: chilrenBBox.width || 0,\n height: chilrenBBox.height || 0\n };\n var shapeHeight, shapeWidth;\n\n switch (node.type) {\n case 'maker':\n case 'circle':\n if (attrs.r) {\n shapeWidth = 2 * attrs.r;\n shapeHeight = 2 * attrs.r;\n }\n\n break;\n\n case 'text':\n if (attrs.text) {\n shapeWidth = getTextSize(attrs.text, attrs.fontSize || 12)[0];\n shapeHeight = 16;\n bbox.y += shapeHeight;\n bbox.height = shapeHeight;\n bbox.width = shapeWidth;\n node.attrs = Object(tslib_es6[\"__assign\"])({\n fontSize: 12,\n fill: '#000'\n }, attrs);\n }\n\n break;\n\n default:\n if (attrs.width) {\n shapeWidth = attrs.width;\n }\n\n if (attrs.height) {\n shapeHeight = attrs.height;\n }\n\n }\n\n if (shapeHeight >= 0) {\n bbox.height = shapeHeight;\n }\n\n if (shapeWidth >= 0) {\n bbox.width = shapeWidth;\n }\n\n if (attrs.marginTop) {\n bbox.y += attrs.marginTop;\n }\n\n if (attrs.marginLeft) {\n bbox.x += attrs.marginLeft;\n }\n\n return bbox;\n}\n/**\n * 把从xml计算出的结构填上位置信息,补全attrs\n * @param target\n * @param lastOffset\n */\n\nfunction generateTarget(target, lastOffset) {\n var _a;\n\n if (lastOffset === void 0) {\n lastOffset = {\n x: 0,\n y: 0\n };\n }\n\n var defaultBbox = Object(tslib_es6[\"__assign\"])({\n x: 0,\n y: 0,\n width: 0,\n height: 0\n }, lastOffset);\n\n if ((_a = target.children) === null || _a === void 0 ? void 0 : _a.length) {\n var _b = target.attrs,\n attrs = _b === void 0 ? {} : _b;\n var marginTop = attrs.marginTop;\n\n var offset = Object(tslib_es6[\"__assign\"])({}, lastOffset);\n\n if (marginTop) {\n offset.y += marginTop;\n }\n\n for (var index = 0; index < target.children.length; index++) {\n target.children[index].attrs.key = (attrs.key || 'root') + \" -\" + index + \" \";\n var node = generateTarget(target.children[index], offset);\n\n if (node.bbox) {\n var bbox = node.bbox;\n\n if (node.attrs.next === 'inline') {\n offset.x += node.bbox.width;\n } else {\n offset.y += node.bbox.height;\n }\n\n if (bbox.width + bbox.x > defaultBbox.width) {\n defaultBbox.width = bbox.width + bbox.x;\n }\n\n if (bbox.height + bbox.y > defaultBbox.height) {\n defaultBbox.height = bbox.height + bbox.y;\n }\n }\n }\n }\n\n target.bbox = xml_getBBox(target, lastOffset, defaultBbox);\n target.attrs = Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, target.attrs), target.bbox);\n return target;\n}\n/**\n * 对比前后两个最终计算出来的node,并对比出最小改动,\n * 动作: 'add' 添加节点 | ’delete‘ 删除节点 | ’change‘ 改变节点attrs | 'restructure' 重构节点\n * @param nowTarget\n * @param formerTarget\n */\n\nfunction compareTwoTarget(nowTarget, formerTarget) {\n var _a, _b, _c, _d;\n\n var type = (nowTarget || {}).type;\n var key = ((formerTarget === null || formerTarget === void 0 ? void 0 : formerTarget.attrs) || {}).key;\n\n if (key && nowTarget) {\n nowTarget.attrs.key = key;\n }\n\n if (!nowTarget && formerTarget) {\n return {\n action: 'delete',\n val: formerTarget,\n type: type,\n key: key\n };\n }\n\n if (nowTarget && !formerTarget) {\n return {\n action: 'add',\n val: nowTarget,\n type: type\n };\n }\n\n if (!nowTarget && !formerTarget) {\n return {\n action: 'same',\n type: type\n };\n }\n\n var children = [];\n\n if (((_a = nowTarget.children) === null || _a === void 0 ? void 0 : _a.length) > 0 || ((_b = formerTarget.children) === null || _b === void 0 ? void 0 : _b.length) > 0) {\n var length_1 = Math.max((_c = nowTarget.children) === null || _c === void 0 ? void 0 : _c.length, (_d = formerTarget.children) === null || _d === void 0 ? void 0 : _d.length);\n var formerChilren = formerTarget.children || [];\n var nowChilren = nowTarget.children || [];\n\n for (var index = 0; index < length_1; index += 1) {\n children.push(compareTwoTarget(nowChilren[index], formerChilren[index]));\n }\n }\n\n var formerKeys = Object.keys(formerTarget.attrs);\n var nowKeys = Object.keys(nowTarget.attrs);\n\n if (formerTarget.type !== nowTarget.type) {\n return {\n action: 'restructure',\n nowTarget: nowTarget,\n formerTarget: formerTarget,\n key: key,\n children: children\n };\n }\n\n if (formerKeys.filter(function (e) {\n return e !== 'children';\n }).some(function (e) {\n return nowTarget.attrs[e] !== formerTarget.attrs[e] || !nowKeys.includes(e);\n })) {\n return {\n action: 'change',\n val: nowTarget,\n children: children,\n type: type,\n key: key\n };\n }\n\n return {\n action: 'same',\n children: children,\n type: type,\n key: key\n };\n}\n/**\n * 根据xml或者返回xml的函数构建自定义节点的结构\n * @param gen\n */\n\nfunction createNodeFromXML(gen) {\n var structures = {};\n\n var compileXML = function compileXML(cfg) {\n var rawStr = typeof gen === 'function' ? gen(cfg) : gen;\n var target = xml_xmlDataRenderer(rawStr)(cfg);\n var xmlParser = document.createElement('div');\n xmlParser.innerHTML = target;\n var xml = xmlParser.children[0];\n var result = generateTarget(parseXML(xml, cfg));\n xmlParser.remove();\n return result;\n };\n\n return {\n draw: function draw(cfg, group) {\n var resultTarget = compileXML(cfg);\n var keyshape = group;\n\n var renderTarget = function renderTarget(target) {\n var _a = target.attrs,\n attrs = _a === void 0 ? {} : _a,\n bbox = target.bbox,\n type = target.type,\n children = target.children,\n rest = Object(tslib_es6[\"__rest\"])(target, [\"attrs\", \"bbox\", \"type\", \"children\"]);\n\n if (target.type !== 'group') {\n var shape = group.addShape(target.type, Object(tslib_es6[\"__assign\"])({\n attrs: attrs,\n origin: {\n bbox: bbox,\n type: type,\n children: children\n }\n }, rest));\n\n if (target.keyshape) {\n keyshape = shape;\n }\n }\n\n if (target.children) {\n target.children.forEach(function (n) {\n return renderTarget(n);\n });\n }\n };\n\n renderTarget(resultTarget);\n structures[cfg.id] = [resultTarget];\n return keyshape;\n },\n update: function update(cfg, node) {\n if (!structures[cfg.id]) {\n structures[cfg.id] = [];\n }\n\n var container = node.getContainer();\n var children = container.get('children');\n var newTarget = compileXML(cfg);\n var lastTarget = structures[cfg.id].pop();\n var diffResult = compareTwoTarget(newTarget, lastTarget);\n\n var addShape = function addShape(shape) {\n var _a;\n\n if (shape.type !== 'group') {\n container.addShape(shape.type, {\n attrs: shape.attrs\n });\n }\n\n if ((_a = shape.children) === null || _a === void 0 ? void 0 : _a.length) {\n shape.children.map(function (e) {\n return addShape(e);\n });\n }\n };\n\n var delShape = function delShape(shape) {\n var _a;\n\n var targetShape = children.find(function (e) {\n return e.attrs.key === shape.attrs.key;\n });\n\n if (targetShape) {\n container.removeChild(targetShape);\n }\n\n if ((_a = shape.children) === null || _a === void 0 ? void 0 : _a.length) {\n shape.children.map(function (e) {\n return delShape(e);\n });\n }\n };\n\n var updateTarget = function updateTarget(target) {\n var key = target.key;\n\n if (target.type !== 'group') {\n var targetShape = children.find(function (e) {\n return e.attrs.key === key;\n });\n\n switch (target.action) {\n case 'change':\n if (targetShape) {\n var originAttr = target.val.keyshape ? node.getOriginStyle() : {};\n targetShape.attr(Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, originAttr), target.val.attrs));\n }\n\n break;\n\n case 'add':\n addShape(target.val);\n break;\n\n case 'delete':\n delShape(target.val);\n break;\n\n case 'restructure':\n delShape(target.formerTarget);\n addShape(target.nowTarget);\n break;\n\n default:\n break;\n }\n }\n\n if (target.children) {\n target.children.forEach(function (n) {\n return updateTarget(n);\n });\n }\n };\n\n updateTarget(diffResult);\n structures[cfg.id].push(newTarget);\n },\n getAnchorPoints: function getAnchorPoints() {\n return [[0, 0.5], [1, 0.5], [0.5, 1], [0.5, 0]];\n }\n };\n}\n// CONCATENATED MODULE: ./node_modules/@antv/g6-core/es/element/shape.js\n\n\n\nvar shape_cache = {}; // ucfirst 开销过大,进行缓存\n// 首字母大写\n\nfunction ucfirst(str) {\n if (!shape_cache[str]) {\n shape_cache[str] = Object(esm[\"upperFirst\"])(str);\n }\n\n return shape_cache[str];\n}\n/**\n * 工厂方法的基类\n * @type Shape.FactoryBase\n */\n\n\nvar ShapeFactoryBase = {\n /**\n * 默认的形状,当没有指定/匹配 shapeType 时,使用默认的\n * @type {String}\n */\n defaultShapeType: 'defaultType',\n\n /**\n * 形状的 className,用于搜索\n * @type {String}\n */\n className: null,\n\n /**\n * 获取绘制 Shape 的工具类,无状态\n * @param {String} type 类型\n * @return {Shape} 工具类\n */\n getShape: function getShape(type) {\n var self = this;\n var shape = self[type] || self[self.defaultShapeType] || self['simple-circle'];\n return shape;\n },\n\n /**\n * 绘制图形\n * @param {String} type 类型\n * @param {Object} cfg 配置项\n * @param {G.Group} group 图形的分组\n * @return {IShape} 图形对象\n */\n draw: function draw(type, cfg, group) {\n var shape = this.getShape(type);\n group['shapeMap'] = {};\n var rst = shape.draw(cfg, group);\n\n if (shape.afterDraw) {\n shape.afterDraw(cfg, group, rst);\n }\n\n return rst;\n },\n\n /**\n * 更新\n * @param {String} type 类型\n * @param {Object} cfg 配置项\n * @param {G6.Item} item 节点、边、分组等\n */\n baseUpdate: function baseUpdate(type, cfg, item, updateType) {\n var _a, _b;\n\n var shape = this.getShape(type); // 防止没定义 update 函数\n\n if (shape.update) {\n // shape.mergeStyle = updateType === 'move' || updateType === 'bbox' ? {} : shape.getOptions?.(cfg);\n shape.mergeStyle = (_a = shape.getOptions) === null || _a === void 0 ? void 0 : _a.call(shape, cfg, updateType);\n (_b = shape.update) === null || _b === void 0 ? void 0 : _b.call(shape, cfg, item, updateType);\n }\n\n if (shape.afterUpdate) {\n shape.afterUpdate(cfg, item);\n }\n },\n\n /**\n * 设置状态\n * @param {String} type 类型\n * @param {String} name 状态名\n * @param {String | Boolean} value 状态值\n * @param {G6.Item} item 节点、边、分组等\n */\n setState: function setState(type, name, value, item) {\n var shape = this.getShape(type); // 调用 shape/shapeBase.ts 中的 setState 方法\n\n shape.setState(name, value, item);\n },\n\n /**\n * 是否允许更新,不重新绘制图形\n * @param {String} type 类型\n * @return {Boolean} 是否允许使用更新\n */\n shouldUpdate: function shouldUpdate(type) {\n var shape = this.getShape(type);\n return !!shape.update;\n },\n getControlPoints: function getControlPoints(type, cfg) {\n var shape = this.getShape(type);\n return shape.getControlPoints(cfg);\n },\n\n /**\n * 获取控制点\n * @param {String} type 节点、边类型\n * @param {Object} cfg 节点、边的配置项\n * @return {Array|null} 控制点的数组,如果为 null,则没有控制点\n */\n getAnchorPoints: function getAnchorPoints(type, cfg) {\n var shape = this.getShape(type);\n return shape.getAnchorPoints(cfg);\n }\n};\n/**\n * 元素的框架\n */\n\nvar ShapeFramework = {\n // 默认样式及配置\n options: {},\n\n /**\n * 绘制\n */\n draw: function draw(cfg, group) {\n return this.drawShape(cfg, group);\n },\n\n /**\n * 绘制\n */\n drawShape: function drawShape() {},\n\n /**\n * 绘制完成后的操作,便于用户继承现有的节点、边\n */\n afterDraw: function afterDraw() {},\n // update(cfg, item) // 默认不定义\n afterUpdate: function afterUpdate() {},\n\n /**\n * 设置节点、边状态\n */\n setState: function setState() {},\n\n /**\n * 获取控制点\n * @param {Object} cfg 节点、边的配置项\n * @return {Array|null} 控制点的数组,如果为 null,则没有控制点\n */\n getControlPoints: function getControlPoints(cfg) {\n return cfg.controlPoints;\n },\n\n /**\n * 获取控制点\n * @param {Object} cfg 节点、边的配置项\n * @return {Array|null} 控制点的数组,如果为 null,则没有控制点\n */\n getAnchorPoints: function getAnchorPoints(cfg) {\n var defaultAnchorPoints = this.options.anchorPoints;\n var anchorPoints = cfg.anchorPoints || defaultAnchorPoints;\n return anchorPoints;\n }\n /* 如果没定义 update 方法,每次都调用 draw 方法\n update(cfg, item) {\n }\n */\n\n};\n\nvar shape_Shape =\n/** @class */\nfunction () {\n function Shape() {}\n\n Shape.registerFactory = function (factoryType, cfg) {\n var className = ucfirst(factoryType);\n var factoryBase = ShapeFactoryBase;\n\n var shapeFactory = Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, factoryBase), cfg);\n\n Shape[className] = shapeFactory;\n shapeFactory.className = className;\n return shapeFactory;\n };\n\n Shape.getFactory = function (factoryType) {\n var className = ucfirst(factoryType);\n return Shape[className];\n };\n\n Shape.registerNode = function (shapeType, nodeDefinition, extendShapeType) {\n var shapeFactory = Shape.Node;\n var shapeObj;\n\n if (typeof nodeDefinition === 'string' || typeof nodeDefinition === 'function') {\n var autoNodeDefinition = createNodeFromXML(nodeDefinition);\n shapeObj = Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, shapeFactory.getShape('single-node')), autoNodeDefinition);\n } else if (nodeDefinition.jsx) {\n var jsx = nodeDefinition.jsx;\n var autoNodeDefinition = createNodeFromXML(jsx);\n shapeObj = Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, shapeFactory.getShape('single-node')), autoNodeDefinition), nodeDefinition);\n } else {\n shapeFactory.getShape(extendShapeType);\n var extendShape = extendShapeType ? shapeFactory.getShape(extendShapeType) : ShapeFramework;\n shapeObj = Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, extendShape), nodeDefinition);\n }\n\n shapeObj.type = shapeType;\n shapeObj.itemType = 'node';\n shapeFactory[shapeType] = shapeObj;\n return shapeObj;\n };\n\n Shape.registerEdge = function (shapeType, edgeDefinition, extendShapeType) {\n var shapeFactory = Shape.Edge;\n var extendShape = extendShapeType ? shapeFactory.getShape(extendShapeType) : ShapeFramework;\n\n var shapeObj = Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, extendShape), edgeDefinition);\n\n shapeObj.type = shapeType;\n shapeObj.itemType = 'edge';\n shapeFactory[shapeType] = shapeObj;\n return shapeObj;\n };\n\n Shape.registerCombo = function (shapeType, comboDefinition, extendShapeType) {\n var shapeFactory = Shape.Combo;\n var extendShape = extendShapeType ? shapeFactory.getShape(extendShapeType) : ShapeFramework;\n\n var shapeObj = Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, extendShape), comboDefinition);\n\n shapeObj.type = shapeType;\n shapeObj.itemType = 'combo';\n shapeFactory[shapeType] = shapeObj;\n return shapeObj;\n };\n\n return Shape;\n}();\n\n/* harmony default export */ var element_shape = (shape_Shape); // 注册 Node 的工厂方法\n\nshape_Shape.registerFactory('node', {\n defaultShapeType: 'circle'\n}); // 注册 Edge 的工厂方法\n\nshape_Shape.registerFactory('edge', {\n defaultShapeType: 'line'\n}); // 注册 Combo 的工厂方法\n\nshape_Shape.registerFactory('combo', {\n defaultShapeType: 'circle'\n});\n// CONCATENATED MODULE: ./node_modules/@antv/g6-core/es/item/item.js\n\n\n\n\n\n\nvar CACHE_BBOX = 'bboxCache';\nvar CACHE_CANVAS_BBOX = 'bboxCanvasCache';\nvar ARROWS = ['startArrow', 'endArrow'];\n\nvar item_ItemBase =\n/** @class */\nfunction () {\n function ItemBase(cfg) {\n this._cfg = {};\n this.destroyed = false;\n var defaultCfg = {\n /**\n * id\n * @type {string}\n */\n id: undefined,\n\n /**\n * 类型\n * @type {string}\n */\n type: 'item',\n\n /**\n * data model\n * @type {object}\n */\n model: {},\n\n /**\n * g group\n * @type {G.Group}\n */\n group: undefined,\n\n /**\n * is open animate\n * @type {boolean}\n */\n animate: false,\n\n /**\n * visible - not group visible\n * @type {boolean}\n */\n visible: true,\n\n /**\n * locked - lock node\n * @type {boolean}\n */\n locked: false,\n\n /**\n * capture event\n * @type {boolean}\n */\n event: true,\n\n /**\n * key shape to calculate item's bbox\n * @type object\n */\n keyShape: undefined,\n\n /**\n * item's states, such as selected or active\n * @type Array\n */\n states: []\n };\n this._cfg = Object.assign(defaultCfg, this.getDefaultCfg(), cfg);\n var model = this.get('model');\n var id = model.id;\n var itemType = this.get('type');\n\n if (!id) {\n id = base_uniqueId(itemType);\n this.get('model').id = id;\n }\n\n this.set('id', id);\n var group = cfg.group;\n\n if (group) {\n group.set('item', this);\n group.set('id', id);\n }\n\n this.init();\n this.draw();\n var shapeType = model.shape || model.type || (itemType === 'edge' ? 'line' : 'circle');\n var shapeFactory = this.get('shapeFactory');\n\n if (shapeFactory && shapeFactory[shapeType]) {\n var options = shapeFactory[shapeType].options; // merge the stateStyles from item and shape\n\n if (options && options.stateStyles) {\n var styles = this.get('styles') || model.stateStyles;\n styles = Object(esm[\"deepMix\"])({}, options.stateStyles, styles);\n this.set('styles', styles);\n }\n }\n }\n /**\n * 根据 keyshape 计算包围盒\n */\n\n\n ItemBase.prototype.calculateBBox = function () {\n var keyShape = this.get('keyShape');\n var group = this.get('group'); // 因为 group 可能会移动,所以必须通过父元素计算才能计算出正确的包围盒\n\n var bbox = graphic_getBBox(keyShape, group);\n bbox.x = bbox.minX;\n bbox.y = bbox.minY;\n bbox.width = bbox.maxX - bbox.minX;\n bbox.height = bbox.maxY - bbox.minY;\n bbox.centerX = (bbox.minX + bbox.maxX) / 2;\n bbox.centerY = (bbox.minY + bbox.maxY) / 2;\n return bbox;\n };\n /**\n * 根据 keyshape 计算包围盒\n */\n\n\n ItemBase.prototype.calculateCanvasBBox = function () {\n var keyShape = this.get('keyShape');\n var group = this.get('group'); // 因为 group 可能会移动,所以必须通过父元素计算才能计算出正确的包围盒\n\n var bbox = graphic_getBBox(keyShape, group);\n bbox.x = bbox.minX;\n bbox.y = bbox.minY;\n bbox.width = bbox.maxX - bbox.minX;\n bbox.height = bbox.maxY - bbox.minY;\n bbox.centerX = (bbox.minX + bbox.maxX) / 2;\n bbox.centerY = (bbox.minY + bbox.maxY) / 2;\n return bbox;\n };\n /**\n * draw shape\n */\n\n\n ItemBase.prototype.drawInner = function () {\n var self = this;\n var shapeFactory = self.get('shapeFactory');\n var group = self.get('group');\n var model = self.get('model');\n group.clear();\n var visible = model.visible;\n if (visible !== undefined && !visible) self.changeVisibility(visible);\n\n if (!shapeFactory) {\n return;\n }\n\n self.updatePosition(model);\n var cfg = self.getShapeCfg(model); // 可能会附加额外信息\n\n var shapeType = cfg.type;\n var keyShape = shapeFactory.draw(shapeType, cfg, group);\n\n if (keyShape) {\n self.set('keyShape', keyShape);\n keyShape.set('isKeyShape', true);\n keyShape.set('draggable', true);\n }\n\n this.setOriginStyle(); // 防止由于用户外部修改 model 中的 shape 导致 shape 不更新\n\n this.set('currentShape', shapeType);\n this.restoreStates(shapeFactory, shapeType);\n };\n /**\n * 设置图元素原始样式\n * @param keyShape 图元素 keyShape\n * @param group Group 容器\n */\n\n\n ItemBase.prototype.setOriginStyle = function () {\n var group = this.get('group');\n var children = group.get('children');\n var keyShape = this.getKeyShape();\n var self = this;\n var keyShapeName = keyShape.get('name');\n\n if (!this.get('originStyle')) {\n // 第一次 set originStyle,直接拿首次渲染所有图形的 attrs\n var originStyles = {};\n\n for (var i = 0; i < children.length; i++) {\n var child = children[i];\n var shapeType = child.get('type');\n var name_1 = child.get('name');\n\n if (name_1 && name_1 !== keyShapeName) {\n originStyles[name_1] = shapeType !== 'image' ? Object(esm[\"clone\"])(child.attr()) : self.getShapeStyleByName(name_1); // The text's position and matrix is not allowed to be affected by states\n\n if (shapeType === 'text' && originStyles[name_1]) {\n delete originStyles[name_1].x;\n delete originStyles[name_1].y;\n delete originStyles[name_1].matrix;\n }\n } else {\n var keyShapeStyle = self.getShapeStyleByName(); // 可优化,需要去除 child.attr 中其他 shape 名的对象\n\n delete keyShapeStyle.path;\n delete keyShapeStyle.matrix;\n\n if (!keyShapeName) {\n Object.assign(originStyles, keyShapeStyle);\n } else {\n // 若 keyShape 有 name 且 !name,这个图形不是 keyShape,给这个图形一个 name\n if (!name_1) {\n var shapeName = base_uniqueId('shape');\n child.set('name', shapeName);\n group['shapeMap'][shapeName] = child;\n originStyles[shapeName] = shapeType !== 'image' ? Object(esm[\"clone\"])(child.attr()) : self.getShapeStyleByName(name_1);\n } else {\n originStyles[keyShapeName] = keyShapeStyle;\n }\n }\n }\n }\n\n self.set('originStyle', originStyles);\n } else {\n // 第二次 set originStyles,需要找到不是 stateStyles 的样式,更新到 originStyles 中\n // 上一次设置的 originStyle,是初始的 shape attrs\n var styles_1 = this.get('originStyle'); // let styles: ShapeStyle = {};\n\n if (keyShapeName && !styles_1[keyShapeName]) styles_1[keyShapeName] = {}; // 获取当前状态样式\n\n var currentStatesStyle_1 = this.getCurrentStatesStyle();\n\n var _loop_1 = function _loop_1(i) {\n var child = children[i];\n var name_2 = child.get('name');\n var shapeAttrs = child.attr();\n\n if (name_2 && name_2 !== keyShapeName) {\n // 有 name 的非 keyShape 图形\n var shapeStateStyle_1 = currentStatesStyle_1[name_2];\n if (!styles_1[name_2]) styles_1[name_2] = {};\n\n if (shapeStateStyle_1) {\n Object.keys(shapeAttrs).forEach(function (key) {\n var value = shapeAttrs[key];\n if (value !== shapeStateStyle_1[key]) styles_1[name_2][key] = value;\n });\n } else {\n styles_1[name_2] = child.get('type') !== 'image' ? Object(esm[\"clone\"])(shapeAttrs) : self.getShapeStyleByName(name_2);\n }\n } else {\n var shapeAttrs_1 = child.attr();\n var keyShapeStateStyles_1 = {};\n Object.keys(currentStatesStyle_1).forEach(function (styleKey) {\n var subStyle = currentStatesStyle_1[styleKey];\n\n if (styleKey === keyShapeName || !Object(esm[\"isPlainObject\"])(subStyle)) {\n keyShapeStateStyles_1[styleKey] = subStyle;\n }\n });\n Object.keys(shapeAttrs_1).forEach(function (key) {\n var value = shapeAttrs_1[key]; // 如果是对象且不是 arrow,则是其他 shape 的样式\n // if (isPlainObject(value) && ARROWS.indexOf(name) === -1) return;\n\n if (keyShapeStateStyles_1[key] !== value) {\n if (keyShapeName) styles_1[keyShapeName][key] = value;else styles_1[key] = value;\n }\n });\n }\n }; // 遍历当前所有图形的 attrs,找到不是 stateStyles 的样式更新到 originStyles 中\n\n\n for (var i = 0; i < children.length; i++) {\n _loop_1(i);\n }\n\n delete styles_1.path;\n delete styles_1.matrix;\n delete styles_1.x;\n delete styles_1.y;\n\n if (styles_1[keyShapeName]) {\n delete styles_1[keyShapeName].x;\n delete styles_1[keyShapeName].y;\n delete styles_1[keyShapeName].matrix;\n delete styles_1[keyShapeName].path;\n }\n\n self.set('originStyle', styles_1);\n }\n };\n /**\n * restore shape states\n * @param shapeFactory\n * @param shapeType\n */\n\n\n ItemBase.prototype.restoreStates = function (shapeFactory, shapeType) {\n var self = this;\n var states = self.get('states');\n Object(esm[\"each\"])(states, function (state) {\n shapeFactory.setState(shapeType, state, true, self);\n });\n };\n\n ItemBase.prototype.init = function () {\n var shapeFactory = element_shape.getFactory(this.get('type'));\n this.set('shapeFactory', shapeFactory);\n };\n /**\n * 获取属性\n * @internal 仅内部类使用\n * @param {String} key 属性名\n * @return {object | string | number} 属性值\n */\n\n\n ItemBase.prototype.get = function (key) {\n return this._cfg[key];\n };\n /**\n * 设置属性\n * @internal 仅内部类使用\n * @param {String|Object} key 属性名,也可以是对象\n * @param {object | string | number} val 属性值\n */\n\n\n ItemBase.prototype.set = function (key, val) {\n if (Object(esm[\"isPlainObject\"])(key)) {\n this._cfg = Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, this._cfg), key);\n } else {\n this._cfg[key] = val;\n }\n };\n\n ItemBase.prototype.getDefaultCfg = function () {\n return {};\n };\n /**\n * 更新/刷新等操作后,清除 cache\n */\n\n\n ItemBase.prototype.clearCache = function () {\n this.set(CACHE_BBOX, null);\n this.set(CACHE_CANVAS_BBOX, null);\n };\n /**\n * 渲染前的逻辑,提供给子类复写\n */\n\n\n ItemBase.prototype.beforeDraw = function () {};\n /**\n * 渲染后的逻辑,提供给子类复写\n */\n\n\n ItemBase.prototype.afterDraw = function () {};\n /**\n * 更新后做一些工作\n */\n\n\n ItemBase.prototype.afterUpdate = function () {};\n /**\n * draw shape\n */\n\n\n ItemBase.prototype.draw = function () {\n this.beforeDraw();\n this.drawInner();\n this.afterDraw();\n };\n\n ItemBase.prototype.getShapeStyleByName = function (name) {\n var group = this.get('group');\n var currentShape;\n\n if (name) {\n currentShape = group['shapeMap'][name]; // group.find((element) => element.get('name') === name) as IShapeBase;\n } else {\n currentShape = this.getKeyShape();\n }\n\n if (currentShape) {\n var styles_2 = {};\n Object(esm[\"each\"])(currentShape.attr(), function (val, key) {\n // 修改 img 通过 updateItem 实现\n if (key !== 'img' || Object(esm[\"isString\"])(val)) {\n styles_2[key] = val;\n }\n });\n return styles_2;\n }\n\n return {};\n };\n\n ItemBase.prototype.getShapeCfg = function (model, updateType) {\n var styles = this.get('styles');\n\n if (styles) {\n // merge graph的item样式与数据模型中的样式\n var newModel = model;\n newModel.style = Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, styles), model.style);\n return newModel;\n }\n\n return model;\n };\n /**\n * 获取指定状态的样式,去除了全局样式\n * @param state 状态名称\n */\n\n\n ItemBase.prototype.getStateStyle = function (state) {\n var styles = this.get('styles');\n var stateStyle = styles && styles[state];\n return stateStyle;\n };\n /**\n * get keyshape style\n */\n\n\n ItemBase.prototype.getOriginStyle = function () {\n return this.get('originStyle');\n };\n\n ItemBase.prototype.getCurrentStatesStyle = function () {\n var self = this;\n var styles = {};\n var states = self.getStates();\n\n if (!states || !states.length) {\n return this.get('originStyle');\n }\n\n Object(esm[\"each\"])(self.getStates(), function (state) {\n styles = Object.assign(styles, self.getStateStyle(state));\n });\n return styles;\n };\n /**\n * 更改元素状态, visible 不属于这个范畴\n * @internal 仅提供内部类 graph 使用\n * @param {String} state 状态名\n * @param {Boolean} value 节点状态值\n */\n\n\n ItemBase.prototype.setState = function (state, value) {\n var states = this.get('states');\n var shapeFactory = this.get('shapeFactory');\n var stateName = state;\n var filterStateName = state;\n\n if (Object(esm[\"isString\"])(value)) {\n stateName = state + \":\" + value;\n filterStateName = state + \":\";\n }\n\n var newStates = states;\n\n if (Object(esm[\"isBoolean\"])(value)) {\n var index = states.indexOf(filterStateName);\n\n if (value) {\n if (index > -1) {\n return;\n }\n\n states.push(stateName);\n } else if (index > -1) {\n states.splice(index, 1);\n }\n } else if (Object(esm[\"isString\"])(value)) {\n // 过滤掉 states 中 filterStateName 相关的状态\n var filterStates = states.filter(function (name) {\n return name.includes(filterStateName);\n });\n\n if (filterStates.length > 0) {\n this.clearStates(filterStates);\n }\n\n newStates = newStates.filter(function (name) {\n return !name.includes(filterStateName);\n });\n newStates.push(stateName);\n this.set('states', newStates);\n }\n\n if (shapeFactory) {\n var model = this.get('model');\n var type = model.type; // 调用 shape/shape.ts 中的 setState\n\n shapeFactory.setState(type, state, value, this);\n }\n };\n /**\n * 清除指定的状态,如果参数为空,则不做任务处理\n * @param states 状态名称\n */\n\n\n ItemBase.prototype.clearStates = function (states) {\n var self = this;\n var originStates = self.getStates();\n var shapeFactory = self.get('shapeFactory');\n var model = self.get('model');\n var shape = model.type;\n\n if (!states) {\n states = originStates;\n }\n\n if (Object(esm[\"isString\"])(states)) {\n states = [states];\n }\n\n var newStates = originStates.filter(function (state) {\n return states.indexOf(state) === -1;\n });\n self.set('states', newStates);\n states.forEach(function (state) {\n shapeFactory.setState(shape, state, false, self);\n });\n };\n /**\n * 节点的图形容器\n * @return {G.Group} 图形容器\n */\n\n\n ItemBase.prototype.getContainer = function () {\n return this.get('group');\n };\n /**\n * 节点的关键形状,用于计算节点大小,连线截距等\n * @return {IShapeBase} 关键形状\n */\n\n\n ItemBase.prototype.getKeyShape = function () {\n return this.get('keyShape');\n };\n /**\n * 节点数据模型\n * @return {Object} 数据模型\n */\n\n\n ItemBase.prototype.getModel = function () {\n return this.get('model');\n };\n /**\n * 节点类型\n * @return {string} 节点的类型\n */\n\n\n ItemBase.prototype.getType = function () {\n return this.get('type');\n };\n /**\n * 获取 Item 的ID\n */\n\n\n ItemBase.prototype.getID = function () {\n return this.get('id');\n };\n /**\n * 是否是 Item 对象,悬空边情况下进行判定\n */\n\n\n ItemBase.prototype.isItem = function () {\n return true;\n };\n /**\n * 获取当前元素的所有状态\n * @return {Array} 元素的所有状态\n */\n\n\n ItemBase.prototype.getStates = function () {\n return this.get('states');\n };\n /**\n * 当前元素是否处于某状态\n * @param {String} state 状态名\n * @return {Boolean} 是否处于某状态\n */\n\n\n ItemBase.prototype.hasState = function (state) {\n var states = this.getStates();\n return states.indexOf(state) >= 0;\n };\n /**\n * 刷新一般用于处理几种情况\n * 1. item model 在外部被改变\n * 2. 边的节点位置发生改变,需要重新计算边\n *\n * 因为数据从外部被修改无法判断一些属性是否被修改,直接走位置和 shape 的更新\n */\n\n\n ItemBase.prototype.refresh = function (updateType) {\n var model = this.get('model'); // 更新元素位置\n\n this.updatePosition(model); // 更新元素内容,样式\n\n this.updateShape(updateType); // 做一些更新之后的操作\n\n this.afterUpdate(); // 清除缓存\n\n this.clearCache();\n };\n\n ItemBase.prototype.getUpdateType = function (cfg) {\n return undefined;\n };\n /**\n * 将更新应用到 model 上,刷新属性\n * @internal 仅提供给 Graph 使用,外部直接调用 graph.update 接口\n * @param {Object} cfg 配置项,可以是增量信息\n */\n\n\n ItemBase.prototype.update = function (cfg, updateType) {\n if (updateType === void 0) {\n updateType = undefined;\n }\n\n var model = this.get('model'); // 仅仅移动位置时,既不更新,也不重绘\n\n if (updateType === 'move') {\n this.updatePosition(cfg);\n } else {\n var oriVisible = model.visible;\n var cfgVisible = cfg.visible;\n if (oriVisible !== cfgVisible && cfgVisible !== undefined) this.changeVisibility(cfgVisible);\n var originPosition = {\n x: model.x,\n y: model.y\n };\n cfg.x = isNaN(+cfg.x) ? model.x : +cfg.x;\n cfg.y = isNaN(+cfg.y) ? model.y : +cfg.y;\n var styles = this.get('styles');\n\n if (cfg.stateStyles) {\n // 更新 item 时更新 this.get('styles') 中的值\n var stateStyles = cfg.stateStyles;\n Object(esm[\"mix\"])(styles, stateStyles);\n delete cfg.stateStyles;\n } // 直接将更新合到原数据模型上,可以保证用户在外部修改源数据然后刷新时的样式符合期待。\n\n\n Object.assign(model, cfg); // 如果 x,y 有变化,先重置位置\n\n if (originPosition.x !== cfg.x || originPosition.y !== cfg.y) {\n this.updatePosition(cfg);\n }\n\n this.updateShape(updateType);\n }\n\n this.afterUpdate();\n this.clearCache();\n };\n /**\n * 更新元素内容,样式\n */\n\n\n ItemBase.prototype.updateShape = function (updateType) {\n var shapeFactory = this.get('shapeFactory');\n var model = this.get('model');\n var shape = model.type; // 判定是否允许更新\n // 1. 注册的节点允许更新\n // 2. 更新后的 shape 等于原先的 shape\n\n if (shapeFactory.shouldUpdate(shape) && shape === this.get('currentShape')) {\n var updateCfg = this.getShapeCfg(model, updateType);\n shapeFactory.baseUpdate(shape, updateCfg, this, updateType); // 更新完以后重新设置原始样式\n\n if (updateType !== 'move') this.setOriginStyle();\n } else {\n // 如果不满足上面两种状态,重新绘制\n this.draw();\n } // 更新后重置节点状态\n\n\n this.restoreStates(shapeFactory, shape);\n };\n /**\n * 更新位置,避免整体重绘\n * @param {object} cfg 待更新数据\n */\n\n\n ItemBase.prototype.updatePosition = function (cfg) {\n var model = this.get('model');\n var x = isNaN(+cfg.x) ? +model.x : +cfg.x;\n var y = isNaN(+cfg.y) ? +model.y : +cfg.y;\n var group = this.get('group');\n\n if (isNaN(x) || isNaN(y)) {\n return false;\n }\n\n model.x = x;\n model.y = y;\n var matrix = group.getMatrix();\n if (matrix && matrix[6] === x && matrix[7] === y) return false;\n group.resetMatrix(); // G 4.0 element 中移除了矩阵相关方法,详见https://www.yuque.com/antv/blog/kxzk9g#4rMMV\n\n translate(group, {\n x: x,\n y: y\n });\n this.clearCache(); // 位置更新后需要清除缓存\n\n return true;\n };\n /**\n * 获取 item 的包围盒,这个包围盒是相对于 item 自己,不会将 matrix 计算在内\n * @return {Object} 包含 x,y,width,height, centerX, centerY\n */\n\n\n ItemBase.prototype.getBBox = function () {\n // 计算 bbox 开销有些大,缓存\n var bbox = this.get(CACHE_BBOX);\n\n if (!bbox) {\n bbox = this.calculateBBox();\n this.set(CACHE_BBOX, bbox);\n }\n\n return bbox;\n };\n /**\n * 获取 item 相对于画布的包围盒,会将从顶层到当前元素的 matrix 都计算在内\n * @return {Object} 包含 x,y,width,height, centerX, centerY\n */\n\n\n ItemBase.prototype.getCanvasBBox = function () {\n // 计算 bbox 开销有些大,缓存\n var bbox = this.get(CACHE_CANVAS_BBOX);\n\n if (!bbox) {\n bbox = this.calculateCanvasBBox();\n this.set(CACHE_CANVAS_BBOX, bbox);\n }\n\n return bbox;\n };\n /**\n * 将元素放到最前面\n */\n\n\n ItemBase.prototype.toFront = function () {\n var group = this.get('group');\n group.toFront();\n };\n /**\n * 将元素放到最后面\n */\n\n\n ItemBase.prototype.toBack = function () {\n var group = this.get('group');\n group.toBack();\n };\n /**\n * 显示元素\n */\n\n\n ItemBase.prototype.show = function () {\n this.changeVisibility(true);\n };\n /**\n * 隐藏元素\n */\n\n\n ItemBase.prototype.hide = function () {\n this.changeVisibility(false);\n };\n /**\n * 更改是否显示\n * @param {Boolean} visible 是否显示\n */\n\n\n ItemBase.prototype.changeVisibility = function (visible) {\n var group = this.get('group');\n\n if (visible) {\n group.show();\n } else {\n group.hide();\n }\n\n this.set('visible', visible);\n };\n /**\n * 元素是否可见\n * @return {Boolean} 返回该元素是否可见\n */\n\n\n ItemBase.prototype.isVisible = function () {\n return this.get('visible');\n };\n /**\n * 是否拾取及出发该元素的交互事件\n * @param {Boolean} enable 标识位\n */\n\n\n ItemBase.prototype.enableCapture = function (enable) {\n var group = this.get('group');\n\n if (group) {\n group.set('capture', enable);\n }\n };\n\n ItemBase.prototype.destroy = function () {\n if (!this.destroyed) {\n var animate = this.get('animate');\n var group = this.get('group');\n\n if (animate) {\n group.stopAnimate();\n }\n\n group['shapeMap'] = {};\n this.clearCache();\n group.remove();\n this._cfg = null;\n this.destroyed = true;\n }\n };\n\n return ItemBase;\n}();\n\n/* harmony default export */ var item_item = (item_ItemBase);\n// CONCATENATED MODULE: ./node_modules/@antv/g6-core/es/item/edge.js\n\n\n\nvar END_MAP = {\n source: 'start',\n target: 'end'\n};\nvar ITEM_NAME_SUFFIX = 'Node'; // 端点的后缀,如 sourceNode, targetNode\n\nvar POINT_NAME_SUFFIX = 'Point'; // 起点或者结束点的后缀,如 startPoint, endPoint\n\nvar ANCHOR_NAME_SUFFIX = 'Anchor';\n\nvar edge_Edge =\n/** @class */\nfunction (_super) {\n Object(tslib_es6[\"__extends\"])(Edge, _super);\n\n function Edge() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n\n Edge.prototype.getDefaultCfg = function () {\n return {\n type: 'edge',\n sourceNode: null,\n targetNode: null,\n startPoint: null,\n endPoint: null,\n linkCenter: false\n };\n };\n\n Edge.prototype.setEnd = function (name, value) {\n var pointName = END_MAP[name] + POINT_NAME_SUFFIX;\n var itemName = name + ITEM_NAME_SUFFIX;\n var preItem = this.get(itemName);\n\n if (preItem && !preItem.destroyed) {\n // 如果之前存在节点,则移除掉边\n preItem.removeEdge(this);\n }\n\n if (Object(esm[\"isPlainObject\"])(value)) {\n // 如果设置成具体的点,则清理节点\n this.set(pointName, value);\n this.set(itemName, null);\n } else if (value) {\n value.addEdge(this);\n this.set(itemName, value);\n this.set(pointName, null);\n }\n };\n /**\n * 获取连接点的坐标\n * @param name source | target\n * @param model 边的数据模型\n * @param controlPoints 控制点\n */\n\n\n Edge.prototype.getLinkPoint = function (name, model, controlPoints) {\n var pointName = END_MAP[name] + POINT_NAME_SUFFIX;\n var itemName = name + ITEM_NAME_SUFFIX;\n var point = this.get(pointName);\n\n if (!point) {\n var item = this.get(itemName);\n var anchorName = name + ANCHOR_NAME_SUFFIX;\n var prePoint = this.getPrePoint(name, controlPoints);\n var anchorIndex = model[anchorName];\n\n if (!Object(esm[\"isNil\"])(anchorIndex)) {\n // 如果有锚点,则使用锚点索引获取连接点\n point = item.getLinkPointByAnchor(anchorIndex);\n } // 如果锚点没有对应的点或者没有锚点,则直接计算连接点\n\n\n point = point || item.getLinkPoint(prePoint);\n\n if (!Object(esm[\"isNil\"])(point.index)) {\n this.set(name + \"AnchorIndex\", point.index);\n }\n }\n\n return point;\n };\n /**\n * 获取同端点进行连接的点,计算交汇点\n * @param name\n * @param controlPoints\n */\n\n\n Edge.prototype.getPrePoint = function (name, controlPoints) {\n if (controlPoints && controlPoints.length) {\n var index = name === 'source' ? 0 : controlPoints.length - 1;\n return controlPoints[index];\n }\n\n var oppositeName = name === 'source' ? 'target' : 'source'; // 取另一个节点的位置\n\n return this.getEndPoint(oppositeName);\n };\n /**\n * 获取端点的位置\n * @param name\n */\n\n\n Edge.prototype.getEndPoint = function (name) {\n var itemName = name + ITEM_NAME_SUFFIX;\n var pointName = END_MAP[name] + POINT_NAME_SUFFIX;\n var item = this.get(itemName); // 如果有端点,直接使用 model\n\n if (item) {\n return item.get('model');\n } // 否则直接使用点\n\n\n return this.get(pointName);\n };\n /**\n * 通过端点的中心获取控制点\n * @param model\n */\n\n\n Edge.prototype.getControlPointsByCenter = function (model) {\n var sourcePoint = this.getEndPoint('source');\n var targetPoint = this.getEndPoint('target');\n var shapeFactory = this.get('shapeFactory');\n var type = model.type;\n return shapeFactory.getControlPoints(type, {\n startPoint: sourcePoint,\n endPoint: targetPoint\n });\n };\n\n Edge.prototype.getEndCenter = function (name) {\n var itemName = name + ITEM_NAME_SUFFIX;\n var pointName = END_MAP[name] + POINT_NAME_SUFFIX;\n var item = this.get(itemName); // 如果有端点,直接使用 model\n\n if (item) {\n var bbox = item.getBBox();\n return {\n x: bbox.centerX,\n y: bbox.centerY\n };\n } // 否则直接使用点\n\n\n return this.get(pointName);\n };\n\n Edge.prototype.init = function () {\n _super.prototype.init.call(this); // 初始化两个端点\n\n\n this.setSource(this.get('source'));\n this.setTarget(this.get('target'));\n };\n\n Edge.prototype.getShapeCfg = function (model, updateType) {\n var self = this;\n var linkCenter = self.get('linkCenter'); // 如果连接到中心,忽视锚点、忽视控制点\n\n var cfg = (updateType === null || updateType === void 0 ? void 0 : updateType.includes('move')) ? model : _super.prototype.getShapeCfg.call(this, model);\n\n if (linkCenter) {\n cfg.startPoint = self.getEndCenter('source');\n cfg.endPoint = self.getEndCenter('target');\n } else {\n var controlPoints = cfg.controlPoints || self.getControlPointsByCenter(cfg);\n cfg.startPoint = self.getLinkPoint('source', model, controlPoints);\n cfg.endPoint = self.getLinkPoint('target', model, controlPoints);\n }\n\n cfg.sourceNode = self.get('sourceNode');\n cfg.targetNode = self.get('targetNode');\n return cfg;\n };\n /**\n * 获取边的数据模型\n */\n\n\n Edge.prototype.getModel = function () {\n var out = this.get('model');\n var sourceItem = this.get(\"source\" + ITEM_NAME_SUFFIX);\n var targetItem = this.get(\"target\" + ITEM_NAME_SUFFIX);\n\n if (sourceItem) {\n delete out[\"source\" + ITEM_NAME_SUFFIX];\n } else {\n out.source = this.get(\"start\" + POINT_NAME_SUFFIX);\n }\n\n if (targetItem) {\n delete out[\"target\" + ITEM_NAME_SUFFIX];\n } else {\n out.target = this.get(\"end\" + POINT_NAME_SUFFIX);\n }\n\n if (!Object(esm[\"isString\"])(out.source) && !Object(esm[\"isPlainObject\"])(out.source)) {\n out.source = out.source.getID();\n }\n\n if (!Object(esm[\"isString\"])(out.target) && !Object(esm[\"isPlainObject\"])(out.target)) {\n out.target = out.target.getID();\n }\n\n return out;\n };\n\n Edge.prototype.setSource = function (source) {\n this.setEnd('source', source);\n this.set('source', source);\n };\n\n Edge.prototype.setTarget = function (target) {\n this.setEnd('target', target);\n this.set('target', target);\n };\n\n Edge.prototype.getSource = function () {\n return this.get('source');\n };\n\n Edge.prototype.getTarget = function () {\n return this.get('target');\n };\n\n Edge.prototype.updatePosition = function () {\n return false;\n };\n /**\n * 边不需要重计算容器位置,直接重新计算 path 位置\n * @param {object} cfg 待更新数据\n */\n\n\n Edge.prototype.update = function (cfg, updateType) {\n if (updateType === void 0) {\n updateType = undefined;\n }\n\n var model = this.get('model');\n var oriVisible = model.visible;\n var cfgVisible = cfg.visible;\n if (oriVisible !== cfgVisible && cfgVisible !== undefined) this.changeVisibility(cfgVisible);\n var styles = this.get('styles');\n\n if (cfg.stateStyles) {\n // 更新 item 时更新 this.get('styles') 中的值\n var stateStyles = cfg.stateStyles;\n Object(esm[\"mix\"])(styles, stateStyles);\n delete cfg.stateStyles;\n }\n\n Object.assign(model, cfg);\n this.updateShape(updateType);\n this.afterUpdate();\n this.clearCache();\n };\n\n Edge.prototype.destroy = function () {\n var sourceItem = this.get(\"source\" + ITEM_NAME_SUFFIX);\n var targetItem = this.get(\"target\" + ITEM_NAME_SUFFIX);\n\n if (sourceItem && !sourceItem.destroyed) {\n sourceItem.removeEdge(this);\n }\n\n if (targetItem && !targetItem.destroyed) {\n targetItem.removeEdge(this);\n }\n\n _super.prototype.destroy.call(this);\n };\n\n return Edge;\n}(item_item);\n\n/* harmony default export */ var item_edge = (edge_Edge);\n// CONCATENATED MODULE: ./node_modules/@antv/g6-core/es/item/node.js\n\n\n\n\nvar CACHE_ANCHOR_POINTS = 'anchorPointsCache';\nvar node_CACHE_BBOX = 'bboxCache';\n\nvar node_Node =\n/** @class */\nfunction (_super) {\n Object(tslib_es6[\"__extends\"])(Node, _super);\n\n function Node() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n\n Node.prototype.getNearestPoint = function (points, curPoint) {\n var index = 0;\n var nearestPoint = points[0];\n var minDistance = math_distance(points[0], curPoint);\n\n for (var i = 0; i < points.length; i++) {\n var point = points[i];\n var dis = math_distance(point, curPoint);\n\n if (dis < minDistance) {\n nearestPoint = point;\n minDistance = dis;\n index = i;\n }\n }\n\n nearestPoint.anchorIndex = index;\n return nearestPoint;\n };\n\n Node.prototype.getDefaultCfg = function () {\n return {\n type: 'node',\n edges: []\n };\n };\n /**\n * 获取从节点关联的所有边\n */\n\n\n Node.prototype.getEdges = function () {\n return this.get('edges');\n };\n /**\n * 获取所有的入边\n */\n\n\n Node.prototype.getInEdges = function () {\n var self = this;\n return this.get('edges').filter(function (edge) {\n return edge.get('target') === self;\n });\n };\n /**\n * 获取所有的出边\n */\n\n\n Node.prototype.getOutEdges = function () {\n var self = this;\n return this.get('edges').filter(function (edge) {\n return edge.get('source') === self;\n });\n };\n /**\n * 获取节点的邻居节点\n *\n * @returns {INode[]}\n * @memberof Node\n */\n\n\n Node.prototype.getNeighbors = function (type) {\n var _this = this;\n\n var edges = this.get('edges');\n\n if (type === 'target') {\n // 当前节点为 source,它所指向的目标节点\n var neighhborsConverter_1 = function neighhborsConverter_1(edge) {\n return edge.getSource() === _this;\n };\n\n return edges.filter(neighhborsConverter_1).map(function (edge) {\n return edge.getTarget();\n });\n }\n\n if (type === 'source') {\n // 当前节点为 target,它所指向的源节点\n var neighhborsConverter_2 = function neighhborsConverter_2(edge) {\n return edge.getTarget() === _this;\n };\n\n return edges.filter(neighhborsConverter_2).map(function (edge) {\n return edge.getSource();\n });\n } // 若未指定 type ,则返回所有邻居\n\n\n var neighhborsConverter = function neighhborsConverter(edge) {\n return edge.getSource() === _this ? edge.getTarget() : edge.getSource();\n };\n\n return edges.map(neighhborsConverter);\n };\n /**\n * 根据锚点的索引获取连接点\n * @param {Number} index 索引\n */\n\n\n Node.prototype.getLinkPointByAnchor = function (index) {\n var anchorPoints = this.getAnchorPoints();\n return anchorPoints[index];\n };\n /**\n * 获取连接点\n * @param point\n */\n\n\n Node.prototype.getLinkPoint = function (point) {\n var keyShape = this.get('keyShape');\n var type = keyShape.get('type');\n var itemType = this.get('type');\n var centerX;\n var centerY;\n var bbox = this.getBBox();\n\n if (itemType === 'combo') {\n centerX = bbox.centerX || (bbox.maxX + bbox.minX) / 2;\n centerY = bbox.centerY || (bbox.maxY + bbox.minY) / 2;\n } else {\n centerX = bbox.centerX;\n centerY = bbox.centerY;\n }\n\n var anchorPoints = this.getAnchorPoints();\n var intersectPoint;\n\n switch (type) {\n case 'circle':\n intersectPoint = getCircleIntersectByPoint({\n x: centerX,\n y: centerY,\n r: bbox.width / 2\n }, point);\n break;\n\n case 'ellipse':\n intersectPoint = getEllipseIntersectByPoint({\n x: centerX,\n y: centerY,\n rx: bbox.width / 2,\n ry: bbox.height / 2\n }, point);\n break;\n\n default:\n intersectPoint = getRectIntersectByPoint(bbox, point);\n }\n\n var linkPoint = intersectPoint; // 如果存在锚点,则使用交点计算最近的锚点\n\n if (anchorPoints.length) {\n if (!linkPoint) {\n // 如果计算不出交点\n linkPoint = point;\n }\n\n linkPoint = this.getNearestPoint(anchorPoints, linkPoint);\n }\n\n if (!linkPoint) {\n // 如果最终依然没法找到锚点和连接点,直接返回中心点\n linkPoint = {\n x: centerX,\n y: centerY\n };\n }\n\n return linkPoint;\n };\n /**\n * 获取锚点的定义\n * @return {array} anchorPoints\n */\n\n\n Node.prototype.getAnchorPoints = function () {\n var anchorPoints = this.get(CACHE_ANCHOR_POINTS);\n\n if (!anchorPoints) {\n anchorPoints = [];\n var shapeFactory = this.get('shapeFactory');\n var bbox_1 = this.getBBox();\n var model = this.get('model');\n var shapeCfg = this.getShapeCfg(model);\n var type = model.type;\n var points = shapeFactory.getAnchorPoints(type, shapeCfg) || [];\n Object(esm[\"each\"])(points, function (pointArr, index) {\n var point = {\n x: bbox_1.minX + pointArr[0] * bbox_1.width,\n y: bbox_1.minY + pointArr[1] * bbox_1.height,\n anchorIndex: index\n };\n anchorPoints.push(point);\n });\n this.set(CACHE_ANCHOR_POINTS, anchorPoints);\n }\n\n return anchorPoints;\n };\n /**\n * add edge\n * @param edge Edge instance\n */\n\n\n Node.prototype.addEdge = function (edge) {\n this.get('edges').push(edge);\n };\n /**\n * 锁定节点\n */\n\n\n Node.prototype.lock = function () {\n this.set('locked', true);\n };\n /**\n * 解锁锁定的节点\n */\n\n\n Node.prototype.unlock = function () {\n this.set('locked', false);\n };\n\n Node.prototype.hasLocked = function () {\n return this.get('locked');\n };\n /**\n * 移除边\n * @param {Edge} edge 边\n */\n\n\n Node.prototype.removeEdge = function (edge) {\n var edges = this.getEdges();\n var index = edges.indexOf(edge);\n if (index > -1) edges.splice(index, 1);\n };\n\n Node.prototype.clearCache = function () {\n this.set(node_CACHE_BBOX, null); // 清理缓存的 bbox\n\n this.set(CACHE_ANCHOR_POINTS, null);\n };\n /**\n * 判断更新的种类,move 表示仅移动,bbox 表示大小有变化,style 表示仅与大小无关的参数变化\n * @param cfg 节点数据模型\n */\n\n\n Node.prototype.getUpdateType = function (cfg) {\n var _a, _b, _c, _d, _e;\n\n if (!cfg) return undefined;\n var existX = !Object(esm[\"isNil\"])(cfg.x);\n var existY = !Object(esm[\"isNil\"])(cfg.y);\n var keys = Object.keys(cfg); // 仅有一个字段,包含 x 或者 包含 y\n // 两个字段,同时有 x,同时有 y\n\n if (keys.length === 1 && (existX || existY) || keys.length === 2 && existX && existY) return 'move';\n if (Object(esm[\"isNumber\"])(cfg.x) || Object(esm[\"isNumber\"])(cfg.y) || cfg.type || cfg.anchorPoints || cfg.size || (cfg === null || cfg === void 0 ? void 0 : cfg.style) && (((_a = cfg === null || cfg === void 0 ? void 0 : cfg.style) === null || _a === void 0 ? void 0 : _a.r) || ((_b = cfg === null || cfg === void 0 ? void 0 : cfg.style) === null || _b === void 0 ? void 0 : _b.width) || ((_c = cfg === null || cfg === void 0 ? void 0 : cfg.style) === null || _c === void 0 ? void 0 : _c.height) || ((_d = cfg === null || cfg === void 0 ? void 0 : cfg.style) === null || _d === void 0 ? void 0 : _d.rx) || ((_e = cfg === null || cfg === void 0 ? void 0 : cfg.style) === null || _e === void 0 ? void 0 : _e.ry))) return 'bbox|label';\n var updateLabel = keys.includes('label') || keys.includes('labelCfg');\n return updateLabel ? 'style|label' : 'style';\n };\n\n return Node;\n}(item_item);\n\n/* harmony default export */ var item_node = (node_Node);\n// CONCATENATED MODULE: ./node_modules/@antv/g6-core/es/item/combo.js\n\n\n\n\n\nvar combo_CACHE_BBOX = 'bboxCache';\nvar combo_CACHE_CANVAS_BBOX = 'bboxCanvasCache';\nvar CACHE_SIZE = 'sizeCache';\nvar combo_CACHE_ANCHOR_POINTS = 'anchorPointsCache';\n\nvar combo_Combo =\n/** @class */\nfunction (_super) {\n Object(tslib_es6[\"__extends\"])(Combo, _super);\n\n function Combo() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n\n Combo.prototype.getDefaultCfg = function () {\n return {\n type: 'combo',\n nodes: [],\n edges: [],\n combos: []\n };\n };\n\n Combo.prototype.getShapeCfg = function (model) {\n var styles = this.get('styles');\n var bbox = this.get('bbox');\n\n if (styles && bbox) {\n // merge graph的item样式与数据模型中的样式\n var newModel = model;\n var size = {\n r: Math.hypot(bbox.height, bbox.width) / 2 || global.defaultCombo.size[0] / 2,\n width: bbox.width || global.defaultCombo.size[0],\n height: bbox.height || global.defaultCombo.size[1]\n };\n newModel.style = Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, styles), model.style), size);\n var padding = model.padding || global.defaultCombo.padding;\n\n if (Object(esm[\"isNumber\"])(padding)) {\n size.r += padding;\n size.width += padding * 2;\n size.height += padding * 2;\n } else {\n size.r += padding[0];\n size.width += padding[1] + padding[3] || padding[1] * 2;\n size.height += padding[0] + padding[2] || padding[0] * 2;\n }\n\n this.set(CACHE_SIZE, size);\n return newModel;\n }\n\n return model;\n };\n /**\n * 根据 keyshape 计算包围盒\n */\n\n\n Combo.prototype.calculateCanvasBBox = function () {\n if (this.destroyed) return;\n var keyShape = this.get('keyShape');\n var group = this.get('group'); // 因为 group 可能会移动,所以必须通过父元素计算才能计算出正确的包围盒\n\n var bbox = graphic_getBBox(keyShape, group);\n bbox.centerX = (bbox.minX + bbox.maxX) / 2;\n bbox.centerY = (bbox.minY + bbox.maxY) / 2;\n var cacheSize = this.get(CACHE_SIZE);\n var cacheBBox = this.get(combo_CACHE_BBOX) || {};\n var oriX = cacheBBox.x;\n var oriY = cacheBBox.x;\n\n if (cacheSize) {\n cacheSize.width = Math.max(cacheSize.width, bbox.width);\n cacheSize.height = Math.max(cacheSize.height, bbox.height);\n var type = keyShape.get('type');\n\n if (type === 'circle') {\n bbox.width = cacheSize.r * 2;\n bbox.height = cacheSize.r * 2;\n } else {\n bbox.width = cacheSize.width;\n bbox.height = cacheSize.height;\n }\n\n bbox.minX = bbox.centerX - bbox.width / 2;\n bbox.minY = bbox.centerY - bbox.height / 2;\n bbox.maxX = bbox.centerX + bbox.width / 2;\n bbox.maxY = bbox.centerY + bbox.height / 2;\n } else {\n bbox.width = bbox.maxX - bbox.minX;\n bbox.height = bbox.maxY - bbox.minY;\n bbox.centerX = (bbox.minX + bbox.maxX) / 2;\n bbox.centerY = (bbox.minY + bbox.maxY) / 2;\n }\n\n bbox.x = bbox.minX;\n bbox.y = bbox.minY;\n if (bbox.x !== oriX || bbox.y !== oriY) this.set(combo_CACHE_ANCHOR_POINTS, null);\n return bbox;\n };\n /**\n * 获取 Combo 中所有的子元素,包括 Combo、Node 及 Edge\n */\n\n\n Combo.prototype.getChildren = function () {\n var self = this;\n return {\n nodes: self.getNodes(),\n combos: self.getCombos()\n };\n };\n /**\n * 获取 Combo 中所有子节点\n */\n\n\n Combo.prototype.getNodes = function () {\n var self = this;\n return self.get('nodes');\n };\n /**\n * 获取 Combo 中所有子 combo\n */\n\n\n Combo.prototype.getCombos = function () {\n var self = this;\n return self.get('combos');\n };\n /**\n * 向 Combo 中增加子 combo 或 node\n * @param item Combo 或节点实例\n * @return boolean 添加成功返回 true,否则返回 false\n */\n\n\n Combo.prototype.addChild = function (item) {\n var self = this;\n var itemType = item.getType();\n\n switch (itemType) {\n case 'node':\n self.addNode(item);\n break;\n\n case 'combo':\n self.addCombo(item);\n break;\n\n default:\n console.warn('Only node or combo items are allowed to be added into a combo');\n return false;\n }\n\n return true;\n };\n /**\n * 向 Combo 中增加 combo\n * @param combo Combo 实例\n * @return boolean 添加成功返回 true,否则返回 false\n */\n\n\n Combo.prototype.addCombo = function (combo) {\n var self = this;\n self.get('combos').push(combo);\n return true;\n };\n /**\n * 向 Combo 中添加节点\n * @param node 节点实例\n * @return boolean 添加成功返回 true,否则返回 false\n */\n\n\n Combo.prototype.addNode = function (node) {\n var self = this;\n self.get('nodes').push(node);\n return true;\n };\n /**\n * 向 Combo 中增加子 combo 或 node\n * @param item Combo 或节点实例\n * @return boolean 添加成功返回 true,否则返回 false\n */\n\n\n Combo.prototype.removeChild = function (item) {\n var self = this;\n var itemType = item.getType();\n\n switch (itemType) {\n case 'node':\n self.removeNode(item);\n break;\n\n case 'combo':\n self.removeCombo(item);\n break;\n\n default:\n console.warn('Only node or combo items are allowed to be added into a combo');\n return false;\n }\n\n return true;\n };\n /**\n * 从 Combo 中移除指定的 combo\n * @param combo Combo 实例\n * @return boolean 移除成功返回 true,否则返回 false\n */\n\n\n Combo.prototype.removeCombo = function (combo) {\n if (!combo) return;\n var combos = this.getCombos();\n var index = combos.indexOf(combo);\n\n if (index > -1) {\n combos.splice(index, 1);\n return true;\n }\n\n return false;\n };\n /**\n * 向 Combo 中移除指定的节点\n * @param node 节点实例\n * @return boolean 移除成功返回 true,否则返回 false\n */\n\n\n Combo.prototype.removeNode = function (node) {\n if (!node) return;\n var nodes = this.getNodes();\n var index = nodes.indexOf(node);\n\n if (index > -1) {\n nodes.splice(index, 1);\n return true;\n }\n\n return false;\n };\n\n Combo.prototype.getUpdateType = function (cfg) {\n return undefined;\n };\n /**\n * 获取 item 的包围盒,这个包围盒是相对于 item 自己,不会将 matrix 计算在内\n * @return {Object} 包含 x,y,width,height, centerX, centerY\n */\n\n\n Combo.prototype.getBBox = function () {\n this.set(combo_CACHE_CANVAS_BBOX, null);\n var bbox = this.calculateCanvasBBox();\n return bbox;\n };\n\n Combo.prototype.clearCache = function () {\n this.set(combo_CACHE_BBOX, null); // 清理缓存的 bbox\n\n this.set(combo_CACHE_CANVAS_BBOX, null);\n this.set(combo_CACHE_ANCHOR_POINTS, null);\n };\n\n Combo.prototype.destroy = function () {\n if (!this.destroyed) {\n var animate = this.get('animate');\n var group = this.get('group');\n\n if (animate) {\n group.stopAnimate();\n }\n\n group['shapeMap'] = {};\n this.clearCache();\n this.set(CACHE_SIZE, null);\n this.set('bbox', null);\n group.remove();\n this._cfg = null;\n this.destroyed = true;\n }\n };\n\n return Combo;\n}(item_node);\n\n/* harmony default export */ var item_combo = (combo_Combo);\n// CONCATENATED MODULE: ./node_modules/@antv/g6-core/es/graph/controller/item.js\n\n\n\n\n\n\nvar NODE = 'node';\nvar EDGE = 'edge';\nvar VEDGE = 'vedge';\nvar COMBO = 'combo';\nvar CFG_PREFIX = 'default';\nvar MAPPER_SUFFIX = 'Mapper';\nvar STATE_SUFFIX = 'stateStyles';\n\nvar item_ItemController =\n/** @class */\nfunction () {\n function ItemController(graph) {\n var _this = this;\n\n this.edgeToBeUpdateMap = {};\n /**\n * 更新边限流,同时可以防止相同的边频繁重复更新\n * */\n\n this.throttleRefresh = Object(esm[\"throttle\"])(function (_) {\n var _a;\n\n var graph = _this.graph;\n if (!graph || graph.get('destroyed')) return;\n var edgeToBeUpdateMap = _this.edgeToBeUpdateMap;\n if (!edgeToBeUpdateMap || !((_a = Object.keys(edgeToBeUpdateMap)) === null || _a === void 0 ? void 0 : _a.length)) return;\n Object.keys(edgeToBeUpdateMap).forEach(function (eid) {\n var edge = edgeToBeUpdateMap[eid].edge;\n if (!edge || edge.destroyed) return;\n edge.refresh(edgeToBeUpdateMap[eid].updateType);\n });\n _this.edgeToBeUpdateMap = {};\n }, 16, {\n trailing: true,\n leading: true\n });\n this.graph = graph;\n this.destroyed = false;\n }\n /**\n * 增加 Item 实例\n *\n * @param {ITEM_TYPE} type 实例类型,node 或 edge\n * @param {(NodeConfig & EdgeConfig)} model 数据模型\n * @returns {(Item)}\n * @memberof ItemController\n */\n\n\n ItemController.prototype.addItem = function (type, model) {\n var graph = this.graph;\n var vType = type === VEDGE ? EDGE : type;\n var parent = graph.get(vType + \"Group\") || graph.get('group');\n var upperType = Object(esm[\"upperFirst\"])(vType);\n var item = null; // 获取 this.get('styles') 中的值\n\n var styles = graph.get(vType + Object(esm[\"upperFirst\"])(STATE_SUFFIX)) || {};\n var defaultModel = graph.get(CFG_PREFIX + upperType);\n\n if (model[STATE_SUFFIX]) {\n // 设置 this.get('styles') 中的值\n styles = model[STATE_SUFFIX];\n }\n\n if (defaultModel) {\n // 很多布局会直接修改原数据模型,所以不能用 merge 的形式,逐个写入原 model 中\n Object(esm[\"each\"])(defaultModel, function (val, cfg) {\n if (Object(esm[\"isObject\"])(val) && !Object(esm[\"isArray\"])(val)) {\n model[cfg] = Object(esm[\"deepMix\"])({}, val, model[cfg]);\n } else if (Object(esm[\"isArray\"])(val)) {\n model[cfg] = model[cfg] || Object(esm[\"clone\"])(defaultModel[cfg]);\n } else {\n model[cfg] = model[cfg] || defaultModel[cfg];\n }\n });\n }\n\n var mapper = graph.get(vType + MAPPER_SUFFIX);\n\n if (mapper) {\n var mappedModel_1 = mapper(model);\n\n if (mappedModel_1[STATE_SUFFIX]) {\n // 设置 this.get('styles') 中的值\n styles = mappedModel_1[STATE_SUFFIX];\n delete mappedModel_1[STATE_SUFFIX];\n } // 如果配置了 defaultEdge 或 defaultNode,则将默认配置的数据也合并进去\n\n\n Object(esm[\"each\"])(mappedModel_1, function (val, cfg) {\n if (Object(esm[\"isObject\"])(val) && !Object(esm[\"isArray\"])(val)) {\n model[cfg] = Object(esm[\"deepMix\"])({}, model[cfg], val);\n } else {\n model[cfg] = mappedModel_1[cfg] || model[cfg];\n }\n });\n }\n\n graph.emit('beforeadditem', {\n type: type,\n model: model\n });\n\n if (type === EDGE || type === VEDGE) {\n var source = void 0;\n var target = void 0;\n source = model.source; // eslint-disable-line prefer-destructuring\n\n target = model.target; // eslint-disable-line prefer-destructuring\n\n if (source && Object(esm[\"isString\"])(source)) {\n source = graph.findById(source);\n }\n\n if (target && Object(esm[\"isString\"])(target)) {\n target = graph.findById(target);\n }\n\n if (!source || !target) {\n console.warn(\"The source or target node of edge \" + model.id + \" does not exist!\");\n return;\n }\n\n if (source.getType && source.getType() === 'combo') {\n model.isComboEdge = true; // graph.updateCombo(source as ICombo);\n }\n\n if (target.getType && target.getType() === 'combo') {\n model.isComboEdge = true; // graph.updateCombo(target as ICombo);\n }\n\n item = new item_edge({\n model: model,\n source: source,\n target: target,\n styles: styles,\n linkCenter: graph.get('linkCenter'),\n group: parent.addGroup()\n });\n } else if (type === NODE) {\n item = new item_node({\n model: model,\n styles: styles,\n group: parent.addGroup()\n });\n } else if (type === COMBO) {\n var children = model.children;\n var comboBBox = getComboBBox(children, graph);\n if (!isNaN(comboBBox.x)) model.x = comboBBox.x;else if (isNaN(model.x)) model.x = Math.random() * 100;\n if (!isNaN(comboBBox.y)) model.y = comboBBox.y;else if (isNaN(model.y)) model.y = Math.random() * 100;\n var comboGroup = parent.addGroup();\n comboGroup.setZIndex(model.depth);\n item = new item_combo({\n model: model,\n styles: styles,\n bbox: model.collapsed ? getComboBBox([], graph) : comboBBox,\n group: comboGroup\n });\n var comboModel_1 = item.getModel();\n (children || []).forEach(function (child) {\n var childItem = graph.findById(child.id);\n item.addChild(childItem);\n child.depth = comboModel_1.depth + 2;\n }); // collapse the combo if the collapsed is true in the model\n\n if (model.collapsed) {\n setTimeout(function () {\n if (!item.destroyed) {\n graph.collapseCombo(item);\n }\n }, 0);\n }\n }\n\n if (item) {\n graph.get(type + \"s\").push(item);\n graph.get('itemMap')[item.get('id')] = item;\n graph.emit('afteradditem', {\n item: item,\n model: model\n }); // eslint-disable-next-line consistent-return\n\n return item;\n }\n };\n /**\n * 更新节点或边\n *\n * @param {Item} item ID 或 实例\n * @param {(EdgeConfig | Partial)} cfg 数据模型\n * @returns\n * @memberof ItemController\n */\n\n\n ItemController.prototype.updateItem = function (item, cfg) {\n var _this = this;\n\n var _a, _b;\n\n var graph = this.graph;\n\n if (Object(esm[\"isString\"])(item)) {\n item = graph.findById(item);\n }\n\n if (!item || item.destroyed) {\n return;\n } // 更新的 item 的类型\n\n\n var type = '';\n if (item.getType) type = item.getType();\n var mapper = graph.get(type + MAPPER_SUFFIX);\n var model = item.getModel();\n var updateType = item.getUpdateType(cfg);\n\n if (mapper) {\n var result = Object(esm[\"deepMix\"])({}, model, cfg);\n var mappedModel = mapper(result); // 将 update 时候用户传入的参数与mapperModel做deepMix,以便复用之前设置的参数值\n\n var newModel = Object(esm[\"deepMix\"])({}, model, mappedModel, cfg);\n\n if (mappedModel[STATE_SUFFIX]) {\n item.set('styles', newModel[STATE_SUFFIX]);\n delete newModel[STATE_SUFFIX];\n }\n\n Object(esm[\"each\"])(newModel, function (val, key) {\n cfg[key] = val;\n });\n } else {\n // merge update传进来的对象参数,model中没有的数据不做处理,对象和字符串值也不做处理,直接替换原来的\n Object(esm[\"each\"])(cfg, function (val, key) {\n if (model[key]) {\n if (Object(esm[\"isObject\"])(val) && !Object(esm[\"isArray\"])(val)) {\n cfg[key] = Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, model[key]), cfg[key]);\n }\n }\n });\n } // emit beforeupdateitem 事件\n\n\n graph.emit('beforeupdateitem', {\n item: item,\n cfg: cfg\n });\n\n if (type === EDGE) {\n // 若是边要更新source || target, 为了不影响示例内部model,并且重新计算startPoint和endPoint,手动设置\n if (cfg.source) {\n var source = cfg.source;\n\n if (Object(esm[\"isString\"])(source)) {\n source = graph.findById(source);\n }\n\n item.setSource(source);\n }\n\n if (cfg.target) {\n var target = cfg.target;\n\n if (Object(esm[\"isString\"])(target)) {\n target = graph.findById(target);\n }\n\n item.setTarget(target);\n }\n\n item.update(cfg);\n } // item.update(cfg);\n\n\n if (type === NODE || type === COMBO) {\n item.update(cfg, updateType);\n var edges_1 = item.getEdges();\n var refreshEdge = (updateType === null || updateType === void 0 ? void 0 : updateType.includes('bbox')) || updateType === 'move';\n\n if (type === NODE) {\n if (updateType === 'move') {\n Object(esm[\"each\"])(edges_1, function (edge) {\n _this.edgeToBeUpdateMap[edge.getID()] = {\n edge: edge,\n updateType: updateType\n };\n\n _this.throttleRefresh();\n });\n } else if (refreshEdge) {\n Object(esm[\"each\"])(edges_1, function (edge) {\n edge.refresh(updateType);\n });\n }\n } else if (refreshEdge && type === COMBO) {\n var shapeFactory = item.get('shapeFactory');\n var shapeType = model.type || 'circle';\n var comboAnimate = model.animate === undefined || cfg.animate === undefined ? (_b = (_a = shapeFactory[shapeType]) === null || _a === void 0 ? void 0 : _a.options) === null || _b === void 0 ? void 0 : _b.animate : model.animate || cfg.animate;\n\n if (comboAnimate) {\n setTimeout(function () {\n if (!item || item.destroyed) return;\n var keyShape = item.getKeyShape();\n if (!keyShape || keyShape.destroyed) return;\n Object(esm[\"each\"])(edges_1, function (edge) {\n if (edge && !edge.destroyed) edge.refresh();\n });\n }, 201);\n } else {\n Object(esm[\"each\"])(edges_1, function (edge) {\n edge.refresh();\n });\n }\n }\n }\n\n graph.emit('afterupdateitem', {\n item: item,\n cfg: cfg\n });\n };\n /**\n * 根据 combo 的子元素更新 combo 的位置及大小\n *\n * @param {ICombo} combo ID 或 实例\n * @returns\n * @memberof ItemController\n */\n\n\n ItemController.prototype.updateCombo = function (combo, children) {\n var _this = this;\n\n var _a, _b;\n\n var graph = this.graph;\n\n if (Object(esm[\"isString\"])(combo)) {\n combo = graph.findById(combo);\n }\n\n if (!combo || combo.destroyed) {\n return;\n }\n\n var model = combo.getModel();\n var comboBBox = getComboBBox(model.collapsed ? [] : children, graph);\n\n var _c = model.collapsed ? getComboBBox(children, graph) : comboBBox,\n comboX = _c.x,\n comboY = _c.y;\n\n combo.set('bbox', comboBBox);\n combo.update({\n x: comboX,\n y: comboY\n });\n var shapeFactory = combo.get('shapeFactory');\n var shapeType = model.type || 'circle';\n var comboAnimate = model.animate === undefined ? (_b = (_a = shapeFactory[shapeType]) === null || _a === void 0 ? void 0 : _a.options) === null || _b === void 0 ? void 0 : _b.animate : model.animate;\n\n if (comboAnimate) {\n setTimeout(function () {\n if (!combo || combo.destroyed) return;\n var keyShape = combo.getKeyShape();\n if (!keyShape || keyShape.destroyed) return;\n combo.getShapeCfg(model); // 更新 combo 缓存的 size\n\n _this.updateComboEdges(combo);\n }, 201);\n } else {\n this.updateComboEdges(combo);\n }\n };\n\n ItemController.prototype.updateComboEdges = function (combo) {\n var combEdges = combo.getEdges() || [];\n\n for (var i = 0; i < combEdges.length; i++) {\n var edge = combEdges[i];\n\n if (edge && !edge.destroyed) {\n var edgeSF = edge.get('shapeFactory');\n var edgeCfg = edge.getShapeCfg(edge.getModel());\n var edgeGroup = edge.getContainer();\n edgeGroup.clear();\n var keyShape = edgeSF.draw(edgeCfg.type, edgeCfg, edgeGroup);\n edge.set('keyShape', keyShape);\n keyShape.set('isKeyShape', true);\n keyShape.set('draggable', true);\n edge.setOriginStyle();\n }\n }\n };\n /**\n * 收起 combo,隐藏相关元素\n */\n\n\n ItemController.prototype.collapseCombo = function (combo) {\n var graph = this.graph;\n\n if (Object(esm[\"isString\"])(combo)) {\n combo = graph.findById(combo);\n }\n\n var children = combo.getChildren();\n children.nodes.forEach(function (node) {\n graph.hideItem(node);\n });\n children.combos.forEach(function (c) {\n graph.hideItem(c);\n });\n };\n /**\n * 展开 combo,相关元素出现\n * 若子 combo 原先是收起状态,则保持它的收起状态\n */\n\n\n ItemController.prototype.expandCombo = function (combo) {\n var graph = this.graph;\n\n if (Object(esm[\"isString\"])(combo)) {\n combo = graph.findById(combo);\n }\n\n var children = combo.getChildren();\n children.nodes.forEach(function (node) {\n graph.showItem(node);\n });\n children.combos.forEach(function (c) {\n if (c.getModel().collapsed) {\n c.show();\n } else {\n graph.showItem(c);\n }\n });\n };\n /**\n * 删除指定的节点或边\n *\n * @param {Item} item item ID 或实例\n * @returns {void}\n * @memberof ItemController\n */\n\n\n ItemController.prototype.removeItem = function (item) {\n var _this = this;\n\n var graph = this.graph;\n\n if (Object(esm[\"isString\"])(item)) {\n item = graph.findById(item);\n }\n\n if (!item || item.destroyed) {\n return;\n }\n\n var itemModel = Object(esm[\"clone\"])(item.getModel());\n graph.emit('beforeremoveitem', {\n item: itemModel\n });\n var type = '';\n if (item.getType) type = item.getType();\n var items = graph.get(type + \"s\");\n var index = items.indexOf(item);\n if (index > -1) items.splice(index, 1);\n\n if (type === EDGE) {\n var vitems = graph.get(\"v\" + type + \"s\");\n var vindex = vitems.indexOf(item);\n if (vindex > -1) vitems.splice(vindex, 1);\n }\n\n var itemId = item.get('id');\n var itemMap = graph.get('itemMap');\n delete itemMap[itemId];\n var comboTrees = graph.get('comboTrees');\n var id = item.get('id');\n\n if (type === NODE) {\n var comboId = item.getModel().comboId;\n\n if (comboTrees && comboId) {\n var brothers_1 = comboTrees;\n var found_1 = false; // the flag to terminate the forEach circulation\n // remove the node from the children array of its parent fromt he tree\n\n comboTrees.forEach(function (ctree) {\n if (found_1) return;\n traverseTree(ctree, function (combo) {\n if (combo.id === id && brothers_1) {\n var bidx = brothers_1.indexOf(combo);\n brothers_1.splice(bidx, 1);\n found_1 = true;\n return false; // terminate the traverse\n }\n\n brothers_1 = combo.children;\n return true;\n });\n });\n } // 若移除的是节点,需要将与之相连的边一同删除\n\n\n var edges = item.getEdges();\n\n for (var i = edges.length - 1; i >= 0; i--) {\n graph.removeItem(edges[i], false);\n }\n\n if (comboId) graph.updateCombo(comboId);\n } else if (type === COMBO) {\n var parentId = item.getModel().parentId;\n var comboInTree_1; // find the subtree rooted at the item to be removed\n\n var found_2 = false; // the flag to terminate the forEach circulation\n\n (comboTrees || []).forEach(function (ctree) {\n if (found_2) return;\n traverseTree(ctree, function (combo) {\n if (combo.id === id) {\n comboInTree_1 = combo;\n found_2 = true;\n return false; // terminate the traverse\n }\n\n return true;\n });\n });\n comboInTree_1.removed = true;\n\n if (comboInTree_1 && comboInTree_1.children) {\n comboInTree_1.children.forEach(function (child) {\n _this.removeItem(child.id);\n });\n } // 若移除的是 combo,需要将与之相连的边一同删除\n\n\n var edges = item.getEdges();\n\n for (var i = edges.length; i >= 0; i--) {\n graph.removeItem(edges[i], false);\n }\n\n if (parentId) graph.updateCombo(parentId);\n }\n\n item.destroy();\n graph.emit('afterremoveitem', {\n item: itemModel\n });\n };\n /**\n * 更新 item 状态\n *\n * @param {Item} item Item 实例\n * @param {string} state 状态名称\n * @param {boolean} value 是否启用状态或状态值\n * @returns {void}\n * @memberof ItemController\n */\n\n\n ItemController.prototype.setItemState = function (item, state, value) {\n var graph = this.graph;\n var stateName = state;\n\n if (Object(esm[\"isString\"])(value)) {\n stateName = state + \":\" + value;\n } // 已经存在要设置的 state,或不存在 state 的样式为 undefined\n\n\n if (item.hasState(stateName) === value && value || // 当该状态已经存在且现在需要设置为 true 时,不需要继续。当该状态不存在,且设置为 false 时,需要继续\n Object(esm[\"isString\"])(value) && item.hasState(stateName)) {\n // 当该状态 value 是字符串,且已经存在该状态,不需要继续\n return;\n }\n\n graph.emit('beforeitemstatechange', {\n item: item,\n state: stateName,\n enabled: value\n });\n item.setState(state, value);\n graph.autoPaint();\n graph.emit('afteritemstatechange', {\n item: item,\n state: stateName,\n enabled: value\n });\n };\n /**\n * 将指定状态的优先级提升为最高优先级\n * @param {Item} item 元素id或元素实例\n * @param state 状态名称\n */\n\n\n ItemController.prototype.priorityState = function (item, state) {\n var graph = this.graph;\n var currentItem = item;\n\n if (Object(esm[\"isString\"])(item)) {\n currentItem = graph.findById(item);\n } // 先取消已有的 state\n\n\n this.setItemState(currentItem, state, false); // 再设置state,则此时该优先级为最高\n\n this.setItemState(currentItem, state, true);\n };\n /**\n * 清除所有指定的状态\n *\n * @param {Item} item Item 实例\n * @param {string[]} states 状态名称集合\n * @memberof ItemController\n */\n\n\n ItemController.prototype.clearItemStates = function (item, states) {\n var graph = this.graph;\n\n if (Object(esm[\"isString\"])(item)) {\n item = graph.findById(item);\n }\n\n graph.emit('beforeitemstatesclear', {\n item: item,\n states: states\n });\n item.clearStates(states);\n graph.emit('afteritemstatesclear', {\n item: item,\n states: states\n });\n };\n /**\n * 刷新指定的 Item\n *\n * @param {Item} item Item ID 或 实例\n * @memberof ItemController\n */\n\n\n ItemController.prototype.refreshItem = function (item) {\n var graph = this.graph;\n\n if (Object(esm[\"isString\"])(item)) {\n item = graph.findById(item);\n }\n\n graph.emit('beforeitemrefresh', {\n item: item\n }); // 调用 Item 的 refresh 方法,实现刷新功能\n\n item.refresh();\n graph.emit('afteritemrefresh', {\n item: item\n });\n };\n /**\n * 根据 graph 上用 combos 数据生成的 comboTree 来增加所有 combos\n *\n * @param {ComboTree[]} comboTrees graph 上用 combos 数据生成的 comboTree\n * @param {ComboConfig[]} comboModels combos 数据\n * @memberof ItemController\n */\n\n\n ItemController.prototype.addCombos = function (comboTrees, comboModels) {\n var _this = this;\n\n var graph = this.graph;\n (comboTrees || []).forEach(function (ctree) {\n traverseTreeUp(ctree, function (child) {\n var comboModel;\n comboModels.forEach(function (model) {\n if (model.id === child.id) {\n model.children = child.children;\n model.depth = child.depth;\n comboModel = model;\n }\n });\n\n if (comboModel) {\n _this.addItem('combo', comboModel);\n }\n\n return true;\n });\n });\n var comboGroup = graph.get('comboGroup');\n if (comboGroup) comboGroup.sort();\n };\n /**\n * 改变Item的显示状态\n *\n * @param {Item} item Item ID 或 实例\n * @param {boolean} visible 是否显示\n * @memberof ItemController\n */\n\n\n ItemController.prototype.changeItemVisibility = function (item, visible) {\n var _this = this;\n\n var graph = this.graph;\n\n if (Object(esm[\"isString\"])(item)) {\n item = graph.findById(item);\n }\n\n if (!item) {\n console.warn('The item to be shown or hidden does not exist!');\n return;\n }\n\n graph.emit('beforeitemvisibilitychange', {\n item: item,\n visible: visible\n });\n item.changeVisibility(visible);\n\n if (item.getType && item.getType() === NODE) {\n var edges = item.getEdges();\n Object(esm[\"each\"])(edges, function (edge) {\n // 若隐藏节点,则将与之关联的边也隐藏\n // 若显示节点,则将与之关联的边也显示,但是需要判断边两端的节点都是可见的\n if (visible && !(edge.get('source').isVisible() && edge.get('target').isVisible())) {\n return;\n }\n\n _this.changeItemVisibility(edge, visible);\n });\n } else if (item.getType && item.getType() === COMBO) {\n var comboTrees = graph.get('comboTrees');\n var id_1 = item.get('id');\n var children_1 = [];\n var found_3 = false; // flag the terminate the forEach\n\n (comboTrees || []).forEach(function (ctree) {\n if (found_3) return;\n if (!ctree.children || ctree.children.length === 0) return;\n traverseTree(ctree, function (combo) {\n if (combo.id === id_1) {\n children_1 = combo.children;\n found_3 = true;\n return false; // terminate the traverse\n }\n\n return true;\n });\n });\n\n if (children_1 && (!visible || visible && !item.getModel().collapsed)) {\n children_1.forEach(function (child) {\n var childItem = graph.findById(child.id);\n\n _this.changeItemVisibility(childItem, visible);\n });\n }\n\n var edges = item.getEdges();\n Object(esm[\"each\"])(edges, function (edge) {\n // 若隐藏 combo,则将与 combo 本身关联的边也隐藏\n // 若显示 combo,则将与 combo 本身关联的边也显示,但是需要判断边两端的节点都是可见的\n if (visible && !(edge.get('source').isVisible() && edge.get('target').isVisible())) {\n return;\n }\n\n _this.changeItemVisibility(edge, visible);\n });\n }\n\n graph.emit('afteritemvisibilitychange', {\n item: item,\n visible: visible\n });\n return item;\n };\n\n ItemController.prototype.destroy = function () {\n this.graph = null;\n this.destroyed = true;\n };\n\n return ItemController;\n}();\n\n/* harmony default export */ var controller_item = (item_ItemController);\n// CONCATENATED MODULE: ./node_modules/@antv/g6-core/es/graph/controller/state.js\n\nvar timer = null;\n\nvar state_StateController =\n/** @class */\nfunction () {\n function StateController(graph) {\n this.graph = graph;\n /**\n * this.cachedStates = {\n * enabled: {\n * hover: [Node]\n * },\n * disabled: {}\n * }\n */\n\n this.cachedStates = {\n enabled: {},\n disabled: {}\n };\n this.destroyed = false;\n }\n /**\n * 检查 cache 的可用性\n *\n * @private\n * @param {Item} item\n * @param {string} state\n * @param {object} cache\n * @returns\n * @memberof State\n */\n\n\n StateController.checkCache = function (item, state, cache) {\n if (!cache[state]) {\n return;\n }\n\n var index = cache[state].indexOf(item);\n\n if (index >= 0) {\n cache[state].splice(index, 1);\n }\n };\n /**\n * 缓存 state\n *\n * @private\n * @param {Item} item Item 实例\n * @param {string} state 状态名称\n * @param {object} states\n * @memberof State\n */\n\n\n StateController.cacheState = function (item, state, states) {\n if (!states[state]) {\n states[state] = [];\n }\n\n states[state].push(item);\n };\n /**\n * 更新 Item 的状态\n *\n * @param {Item} item Item实例\n * @param {string} state 状态名称\n * @param {boolean} enabled 状态是否可用\n * @memberof State\n */\n\n\n StateController.prototype.updateState = function (item, state, enabled) {\n var _this = this;\n\n var checkCache = StateController.checkCache,\n cacheState = StateController.cacheState;\n\n if (item.destroyed) {\n return;\n }\n\n var cachedStates = this.cachedStates;\n var enabledStates = cachedStates.enabled;\n var disabledStates = cachedStates.disabled;\n\n if (enabled) {\n checkCache(item, state, disabledStates);\n cacheState(item, state, enabledStates);\n } else {\n checkCache(item, state, enabledStates);\n cacheState(item, state, disabledStates);\n }\n\n if (timer) {\n clearTimeout(timer);\n }\n\n timer = setTimeout(function () {\n timer = null;\n\n _this.updateGraphStates();\n }, 16);\n };\n /**\n * 批量更新 states,兼容 updateState,支持更新一个 state\n *\n * @param {Item} item\n * @param {(string | string[])} states\n * @param {boolean} enabled\n * @memberof State\n */\n\n\n StateController.prototype.updateStates = function (item, states, enabled) {\n var _this = this;\n\n if (Object(esm[\"isString\"])(states)) {\n this.updateState(item, states, enabled);\n } else {\n states.forEach(function (state) {\n _this.updateState(item, state, enabled);\n });\n }\n };\n /**\n * 更新 states\n *\n * @memberof State\n */\n\n\n StateController.prototype.updateGraphStates = function () {\n var states = this.graph.get('states');\n var cachedStates = this.cachedStates;\n Object(esm[\"each\"])(cachedStates.disabled, function (val, key) {\n if (states[key]) {\n states[key] = states[key].filter(function (item) {\n return val.indexOf(item) < 0 && !val.destroyed;\n });\n }\n });\n Object(esm[\"each\"])(cachedStates.enabled, function (val, key) {\n if (!states[key]) {\n states[key] = val;\n } else {\n var map_1 = {};\n states[key].forEach(function (item) {\n if (!item.destroyed) {\n map_1[item.get('id')] = true;\n }\n });\n val.forEach(function (item) {\n if (!item.destroyed) {\n var id = item.get('id');\n\n if (!map_1[id]) {\n map_1[id] = true;\n states[key].push(item);\n }\n }\n });\n }\n });\n this.graph.emit('graphstatechange', {\n states: states\n });\n this.cachedStates = {\n enabled: {},\n disabled: {}\n };\n };\n\n StateController.prototype.destroy = function () {\n this.graph = null;\n this.cachedStates = null;\n\n if (timer) {\n clearTimeout(timer);\n }\n\n timer = null;\n this.destroyed = true;\n };\n\n return StateController;\n}();\n\n/* harmony default export */ var controller_state = (state_StateController);\n// CONCATENATED MODULE: ./node_modules/@antv/g6-core/es/graph/controller/index.js\n\n\n\n\n// EXTERNAL MODULE: ./node_modules/@antv/path-util/esm/index.js + 22 modules\nvar path_util_esm = __webpack_require__(37);\n\n// CONCATENATED MODULE: ./node_modules/@antv/g6-core/es/util/path.js\n\n\n/**\n * 替换字符串中的字段\n * @param {String} str 模版字符串\n * @param {Object} o json data\n */\n\nvar substitute = function substitute(str, o) {\n if (!str || !o) {\n return str;\n }\n\n return str.replace(/\\\\?\\{([^{}]+)\\}/g, function (match, name) {\n if (match.charAt(0) === '\\\\') {\n return match.slice(1);\n }\n\n var res = o[name];\n if (res === 0) res = '0';\n return res || '';\n });\n};\n/**\n * 给定坐标获取三次贝塞尔曲线的 M 及 C 值\n * @param points coordinate set\n */\n\n\nvar path_getSpline = function getSpline(points) {\n var data = [];\n\n if (points.length < 2) {\n throw new Error(\"point length must largn than 2, now it's \" + points.length);\n }\n\n for (var _i = 0, points_1 = points; _i < points_1.length; _i++) {\n var point = points_1[_i];\n var x = point.x,\n y = point.y;\n data.push(x);\n data.push(y);\n }\n\n var spliePath = Object(path_util_esm[\"a\" /* catmullRom2Bezier */])(data);\n spliePath.unshift(['M', points[0].x, points[0].y]);\n return spliePath;\n};\n/**\n * 根据起始点、相对位置、偏移量计算控制点\n * @param {IPoint} startPoint 起始点,包含 x,y\n * @param {IPoint} endPoint 结束点, 包含 x,y\n * @param {Number} percent 相对位置,范围 0-1\n * @param {Number} offset 偏移量\n * @return {IPoint} 控制点,包含 x,y\n */\n\nvar path_getControlPoint = function getControlPoint(startPoint, endPoint, percent, offset) {\n if (percent === void 0) {\n percent = 0;\n }\n\n if (offset === void 0) {\n offset = 0;\n }\n\n var point = {\n x: (1 - percent) * startPoint.x + percent * endPoint.x,\n y: (1 - percent) * startPoint.y + percent * endPoint.y\n };\n var tangent = [0, 0];\n matrix_util_esm[\"vec2\"].normalize(tangent, [endPoint.x - startPoint.x, endPoint.y - startPoint.y]);\n\n if (!tangent || !tangent[0] && !tangent[1]) {\n tangent = [0, 0];\n }\n\n var perpendicular = [-tangent[1] * offset, tangent[0] * offset]; // 垂直向量\n\n point.x += perpendicular[0];\n point.y += perpendicular[1];\n return point;\n};\n/**\n * 点集转化为Path多边形\n * @param {Array} points 点集\n * @param {Boolen} z 是否封闭\n * @return {Array} Path\n */\n\nvar pointsToPolygon = function pointsToPolygon(points, z) {\n var length = points.length;\n\n if (!length) {\n return '';\n }\n\n var path = '';\n var str = '';\n\n for (var i = 0; i < length; i++) {\n var item = points[i];\n\n if (i === 0) {\n str = 'M{x} {y}';\n } else {\n str = 'L{x} {y}';\n }\n\n path += substitute(str, item);\n }\n\n if (z) {\n path += 'Z';\n }\n\n return path;\n};\nvar pathToPoints = function pathToPoints(path) {\n var points = [];\n path.forEach(function (seg) {\n var command = seg[0];\n\n if (command !== 'A') {\n for (var i = 1; i < seg.length; i = i + 2) {\n points.push([seg[i], seg[i + 1]]);\n }\n } else {\n var length_1 = seg.length;\n points.push([seg[length_1 - 2], seg[length_1 - 1]]);\n }\n });\n return points;\n};\n/**\n * 生成平滑的闭合曲线\n * @param points\n */\n\nvar getClosedSpline = function getClosedSpline(points) {\n if (points.length < 2) {\n throw new Error(\"point length must largn than 2, now it's \" + points.length);\n }\n\n var first = points[0];\n var second = points[1];\n var last = points[points.length - 1];\n var lastSecond = points[points.length - 2];\n points.unshift(last);\n points.unshift(lastSecond);\n points.push(first);\n points.push(second);\n var closedPath = [];\n\n for (var i = 1; i < points.length - 2; i += 1) {\n var x0 = points[i - 1].x;\n var y0 = points[i - 1].y;\n var x1 = points[i].x;\n var y1 = points[i].y;\n var x2 = points[i + 1].x;\n var y2 = points[i + 1].y;\n var x3 = i !== points.length - 2 ? points[i + 2].x : x2;\n var y3 = i !== points.length - 2 ? points[i + 2].y : y2;\n var cp1x = x1 + (x2 - x0) / 6;\n var cp1y = y1 + (y2 - y0) / 6;\n var cp2x = x2 - (x3 - x1) / 6;\n var cp2y = y2 - (y3 - y1) / 6;\n closedPath.push(['C', cp1x, cp1y, cp2x, cp2y, x2, y2]);\n }\n\n closedPath.unshift(['M', last.x, last.y]);\n return closedPath;\n};\n\nvar path_vecScaleTo = function vecScaleTo(v, length) {\n // Vector with direction of v with specified length\n return matrix_util_esm[\"vec2\"].scale([0, 0], matrix_util_esm[\"vec2\"].normalize([0, 0], v), length);\n};\n\nvar unitNormal = function unitNormal(p0, p1) {\n // Returns the unit normal to the line segment from p0 to p1.\n var n = [p0[1] - p1[1], p1[0] - p0[0]];\n var nLength = Math.sqrt(n[0] * n[0] + n[1] * n[1]);\n\n if (nLength === 0) {\n throw new Error('p0 should not be equal to p1');\n }\n\n return [n[0] / nLength, n[1] / nLength];\n};\n\nvar vecFrom = function vecFrom(p0, p1) {\n // Vector from p0 to p1\n return [p1[0] - p0[0], p1[1] - p0[1]];\n};\n/**\n * 传入的节点作为多边形顶点,生成有圆角的多边形\n * @param polyPoints 多边形顶点\n * @param padding 在原多边形基础上增加最终轮廓和原多边形的空白间隔\n */\n\n\nfunction roundedHull(polyPoints, padding) {\n // The rounded hull path around a single point\n var roundedHull1 = function roundedHull1(points) {\n var p1 = [points[0][0], points[0][1] - padding];\n var p2 = [points[0][0], points[0][1] + padding];\n return \"M \" + p1 + \" A \" + padding + \",\" + padding + \",0,0,0,\" + p2 + \" A \" + padding + \",\" + padding + \",0,0,0,\" + p1;\n }; // The rounded hull path around two points\n\n\n var roundedHull2 = function roundedHull2(points) {\n var offsetVector = matrix_util_esm[\"vec2\"].scale([0, 0], unitNormal(points[0], points[1]), padding);\n var invOffsetVector = matrix_util_esm[\"vec2\"].scale([0, 0], offsetVector, -1);\n var p0 = matrix_util_esm[\"vec2\"].add([0, 0], points[0], offsetVector);\n var p1 = matrix_util_esm[\"vec2\"].add([0, 0], points[1], offsetVector);\n var p2 = matrix_util_esm[\"vec2\"].add([0, 0], points[1], invOffsetVector);\n var p3 = matrix_util_esm[\"vec2\"].add([0, 0], points[0], invOffsetVector);\n return \"M \" + p0 + \" L \" + p1 + \" A \" + [padding, padding, '0,0,0', p2].join(',') + \" L \" + p3 + \" A \" + [padding, padding, '0,0,0', p0].join(',');\n }; // 特殊情况处理:节点数小于等于2\n\n\n if (!polyPoints || polyPoints.length < 1) return '';\n if (polyPoints.length === 1) return roundedHull1(polyPoints);\n if (polyPoints.length === 2) return roundedHull2(polyPoints);\n var segments = new Array(polyPoints.length); // Calculate each offset (outwards) segment of the convex hull.\n\n for (var segmentIndex = 0; segmentIndex < segments.length; ++segmentIndex) {\n var p0 = segmentIndex === 0 ? polyPoints[polyPoints.length - 1] : polyPoints[segmentIndex - 1];\n var p1 = polyPoints[segmentIndex]; // Compute the offset vector for the line segment, with length = padding.\n\n var offset = matrix_util_esm[\"vec2\"].scale([0, 0], unitNormal(p0, p1), padding);\n segments[segmentIndex] = [matrix_util_esm[\"vec2\"].add([0, 0], p0, offset), matrix_util_esm[\"vec2\"].add([0, 0], p1, offset)];\n }\n\n var arcData = \"A \" + [padding, padding, '0,0,0,'].join(',');\n segments = segments.map(function (segment, index) {\n var pathFragment = '';\n\n if (index === 0) {\n pathFragment = \"M \" + segments[segments.length - 1][1] + \" \";\n }\n\n pathFragment += arcData + segment[0] + \" L \" + segment[1];\n return pathFragment;\n });\n return segments.join(' ');\n}\n/**\n * 传入的节点作为多边形顶点,生成平滑的闭合多边形\n * @param polyPoints\n * @param padding\n */\n\nfunction paddedHull(polyPoints, padding) {\n var pointCount = polyPoints.length;\n\n var smoothHull1 = function smoothHull1(points) {\n // Returns the path for a circular hull around a single point.\n var p1 = [points[0][0], points[0][1] - padding];\n var p2 = [points[0][0], points[0][1] + padding];\n return \"M \" + p1 + \" A \" + [padding, padding, '0,0,0', p2].join(',') + \" A \" + [padding, padding, '0,0,0', p1].join(',');\n }; // Returns the path for a rounded hull around two points.\n\n\n var smoothHull2 = function smoothHull2(points) {\n var v = vecFrom(points[0], points[1]);\n var extensionVec = path_vecScaleTo(v, padding);\n var extension0 = matrix_util_esm[\"vec2\"].add([0, 0], points[0], matrix_util_esm[\"vec2\"].scale([0, 0], extensionVec, -1));\n var extension1 = matrix_util_esm[\"vec2\"].add([0, 0], points[1], extensionVec);\n var tangentHalfLength = 1.2 * padding;\n var controlDelta = path_vecScaleTo(matrix_util_esm[\"vec2\"].normalize([0, 0], v), tangentHalfLength);\n var invControlDelta = matrix_util_esm[\"vec2\"].scale([0, 0], controlDelta, -1);\n var control0 = matrix_util_esm[\"vec2\"].add([0, 0], extension0, invControlDelta);\n var control1 = matrix_util_esm[\"vec2\"].add([0, 0], extension1, invControlDelta);\n var control3 = matrix_util_esm[\"vec2\"].add([0, 0], extension0, controlDelta); // return [\n // ['M', extension0[0], extension0[1]],\n // ['C', control0, control1, extension1],\n // ['S', control3, extension0],\n // 'Z',\n // ];\n\n return \"M \" + extension0 + \" C \" + [control0, control1, extension1].join(',') + \" S \" + [control3, extension0].join(',') + \" Z\";\n }; // Handle special cases\n\n\n if (!polyPoints || pointCount < 1) return '';\n if (pointCount === 1) return smoothHull1(polyPoints);\n if (pointCount === 2) return smoothHull2(polyPoints);\n var hullPoints = polyPoints.map(function (point, index) {\n var pNext = polyPoints[(index + 1) % pointCount];\n return {\n p: point,\n v: matrix_util_esm[\"vec2\"].normalize([0, 0], vecFrom(point, pNext))\n };\n }); // Compute the expanded hull points, and the nearest prior control point for each.\n\n for (var i = 0; i < hullPoints.length; ++i) {\n var priorIndex = i > 0 ? i - 1 : pointCount - 1;\n var extensionVec = matrix_util_esm[\"vec2\"].normalize([0, 0], matrix_util_esm[\"vec2\"].add([0, 0], hullPoints[priorIndex].v, matrix_util_esm[\"vec2\"].scale([0, 0], hullPoints[i].v, -1)));\n hullPoints[i].p = matrix_util_esm[\"vec2\"].add([0, 0], hullPoints[i].p, matrix_util_esm[\"vec2\"].scale([0, 0], extensionVec, padding));\n }\n\n return hullPoints.map(function (obj) {\n var point = obj.p;\n return {\n x: point[0],\n y: point[1]\n };\n });\n}\n// CONCATENATED MODULE: ./node_modules/@antv/g6-core/es/element/hull/convexHull.js\n/**\n * Use cross product to judge the direction of the turn.\n * Returns a positive value, if OAB makes a clockwise turn,\n * negative for counter-clockwise turn, and zero if the points are collinear.\n */\nvar cross = function cross(a, b, o) {\n return (a.y - o.y) * (b.x - o.x) - (a.x - o.x) * (b.y - o.y);\n};\n/**\n * Generate a convex hull of given points. Andrew's monotone chain algorithm.\n * @param points An array of [x, y] representing the coordinates of points.\n * @return a list of vertices of the convex hull in counter-clockwise order,\n */\n\nvar genConvexHull = function genConvexHull(items) {\n var points = items.map(function (item) {\n return {\n x: item.getModel().x,\n y: item.getModel().y\n };\n });\n points.sort(function (a, b) {\n return a.x === b.x ? a.y - b.y : a.x - b.x;\n });\n\n if (points.length === 1) {\n return points;\n } // build the lower hull\n\n\n var lower = [];\n\n for (var i = 0; i < points.length; i++) {\n while (lower.length >= 2 && cross(lower[lower.length - 2], lower[lower.length - 1], points[i]) <= 0) {\n lower.pop();\n }\n\n lower.push(points[i]);\n } // build the upper hull\n\n\n var upper = [];\n\n for (var i = points.length - 1; i >= 0; i--) {\n while (upper.length >= 2 && cross(upper[upper.length - 2], upper[upper.length - 1], points[i]) <= 0) {\n upper.pop();\n }\n\n upper.push(points[i]);\n }\n\n upper.pop();\n lower.pop();\n var strictHull = lower.concat(upper);\n return strictHull;\n};\n// CONCATENATED MODULE: ./node_modules/@antv/g6-core/es/element/hull/bubbleset.js\n\nvar defaultOps = {\n maxRoutingIterations: 100,\n maxMarchingIterations: 100,\n pixelGroupSize: 2,\n edgeR0: 10,\n edgeR1: 10,\n nodeR0: 5,\n nodeR1: 10,\n morphBuffer: 5,\n threshold: 0.001,\n skip: 16,\n nodeInfluenceFactor: 1,\n edgeInfluenceFactor: 1,\n negativeNodeInfluenceFactor: -0.5\n};\n/**\n * Marching square algorithm for traching the contour of a pixel group\n * https://www.emanueleferonato.com/2013/03/01/using-marching-squares-algorithm-to-trace-the-contour-of-an-image/\n * @param potentialArea\n * @param threshold\n */\n\nfunction MarchingSquares(contour, potentialArea, threshold) {\n var marched = false;\n\n var getVal = function getVal(x, y) {\n return potentialArea.cells[x + y * potentialArea.width];\n };\n\n var getState = function getState(x, y) {\n var squareVal = 0;\n\n if (getVal(x - 1, y - 1) >= threshold) {\n squareVal += 1;\n }\n\n if (getVal(x, y - 1) > threshold) {\n squareVal += 2;\n }\n\n if (getVal(x - 1, y) > threshold) {\n squareVal += 4;\n }\n\n if (getVal(x, y) > threshold) {\n squareVal += 8;\n }\n\n return squareVal;\n };\n\n var doMarch = function doMarch(xPos, yPos) {\n var x = xPos;\n var y = yPos;\n var prevX;\n var prevY;\n\n for (var i = 0; i < potentialArea.width * potentialArea.height; i++) {\n prevX = x;\n prevY = y;\n\n if (contour.findIndex(function (item) {\n return item.x === x && item.y === y;\n }) > -1) {\n if (contour[0].x !== x || contour[0].y !== y) {// encountered a loop but haven't returned to start: change direction using conditionals and continue back to start\n } else {\n return true;\n }\n } else {\n contour.push({\n x: x,\n y: y\n });\n }\n\n var state = getState(x, y); // assign the move direction according to state of the square\n\n switch (state) {\n case -1:\n console.warn('Marched out of bounds');\n return true;\n\n case 0:\n case 3:\n case 2:\n case 7:\n x++; // go right\n\n break;\n\n case 12:\n case 14:\n case 4:\n x--; // go left\n\n break;\n\n case 6:\n // go left if come from up else go right\n if (prevX === 0) {\n if (prevY === -1) {\n x -= 1;\n } else {\n x += 1;\n }\n }\n\n break;\n\n case 1:\n case 13:\n case 5:\n y--; // go up\n\n break;\n\n case 9:\n // go up if come from right else go down\n if (prevX === 1) {\n if (prevY === 0) {\n y -= 1;\n } else {\n y += 1;\n }\n }\n\n break;\n\n case 10:\n case 8:\n case 11:\n y++; // go down\n\n break;\n\n default:\n console.warn(\"Marching squares invalid state: \" + state);\n return true;\n }\n }\n };\n\n this.march = function () {\n for (var x = 0; x < potentialArea.width && !marched; x += 1) {\n for (var y = 0; y < potentialArea.height && !marched; y += 1) {\n if (getVal(x, y) > threshold && getState(x, y) !== 15) {\n marched = doMarch(x, y);\n }\n }\n }\n\n return marched;\n };\n}\n/**\n * Space partition & assign value to each cell\n * @param points\n */\n\n\nvar initGridCells = function initGridCells(width, height, pixelGroupSize) {\n var scaleWidth = Math.ceil(width / pixelGroupSize);\n var scaleHeight = Math.ceil(height / pixelGroupSize);\n var gridCells = new Float32Array(Math.max(0, scaleWidth * scaleHeight)).fill(0);\n return {\n cells: gridCells,\n width: scaleWidth,\n height: scaleHeight\n };\n};\n/**\n * Find the optimal already visited member to item;\n Optimal: minimize cost(j) = distance(i,j) ∗ countObstacles(i,j)\n * @param item\n * @param visited\n */\n\n\nvar bubbleset_pickBestNeighbor = function pickBestNeighbor(item, visited, nonMembers) {\n var closestNeighbour = null;\n var minCost = Number.POSITIVE_INFINITY;\n visited.forEach(function (neighbourItem) {\n var itemP = {\n x: item.getModel().x,\n y: item.getModel().y\n };\n var neighbourItemP = {\n x: neighbourItem.getModel().x,\n y: neighbourItem.getModel().y\n };\n var dist = squareDist(itemP, neighbourItemP);\n var directLine = new math_Line(itemP.x, itemP.y, neighbourItemP.x, neighbourItemP.y);\n var numberObstacles = nonMembers.reduce(function (count, _item) {\n if (fractionToLine(_item, directLine) > 0) {\n return count + 1;\n }\n\n return count;\n }, 0);\n\n if (dist * Math.pow(numberObstacles + 1, 2) < minCost) {\n closestNeighbour = neighbourItem;\n minCost = dist * Math.pow(numberObstacles + 1, 2);\n }\n });\n return closestNeighbour;\n};\n/**\n * 返回和线相交的item中,离边的起点最近的item\n * @param items\n * @param line\n */\n\n\nvar bubbleset_getIntersectItem = function getIntersectItem(items, line) {\n var minDistance = Number.POSITIVE_INFINITY;\n var closestItem = null;\n items.forEach(function (item) {\n var distance = fractionToLine(item, line); // find closest intersection\n\n if (distance >= 0 && distance < minDistance) {\n closestItem = item;\n minDistance = distance;\n }\n });\n return closestItem;\n};\n/**\n * Modify the directLine and Route virtual edges around obstacles\n */\n\n\nvar bubbleset_computeRoute = function computeRoute(directLine, nonMembers, maxRoutingIterations, morphBuffer) {\n var checkedLines = [];\n var linesToCheck = [];\n linesToCheck.push(directLine);\n var hasIntersection = true;\n var iterations = 0;\n\n var pointExists = function pointExists(point, lines) {\n var flag = false;\n lines.forEach(function (line) {\n if (flag) return;\n\n if (isPointsOverlap(point, {\n x: line.x1,\n y: line.y1\n }) || isPointsOverlap(point, {\n x: line.x2,\n y: line.y2\n })) {\n flag = true;\n }\n });\n return flag;\n };\n\n var isPointInNonMembers = function isPointInNonMembers(point, _nonMembers) {\n for (var _i = 0, _nonMembers_1 = _nonMembers; _i < _nonMembers_1.length; _i++) {\n var item = _nonMembers_1[_i];\n var bbox = item.getBBox();\n var itemContour = [[bbox.x, bbox.y], [bbox.x + bbox.width, bbox.y], [bbox.x, bbox.y + bbox.height], [bbox.x + bbox.width, bbox.y + bbox.height]];\n\n if (isPointInPolygon(itemContour, point.x, point.y)) {\n return true;\n }\n }\n\n return false;\n }; // outer loop end when no more intersections or out of iterations\n\n\n while (hasIntersection && iterations < maxRoutingIterations) {\n hasIntersection = false;\n\n var _loop_1 = function _loop_1() {\n var line = linesToCheck.pop();\n var closestItem = bubbleset_getIntersectItem(nonMembers, line);\n\n if (closestItem) {\n var _a = itemIntersectByLine(closestItem, line),\n intersections_1 = _a[0],\n countIntersections = _a[1]; // if line passes through item\n\n\n if (countIntersections === 2) {\n var testReroute = function testReroute(isFirst) {\n var tempMorphBuffer = morphBuffer;\n var virtualNode = rerouteLine(closestItem, tempMorphBuffer, intersections_1, isFirst); // test the virtualNode already exists\n\n var exist = pointExists(virtualNode, linesToCheck) || pointExists(virtualNode, checkedLines);\n var pointInside = isPointInNonMembers(virtualNode, nonMembers);\n\n while (!exist && pointInside && tempMorphBuffer >= 1) {\n // try a smaller buffer\n tempMorphBuffer /= 1.5;\n virtualNode = rerouteLine(closestItem, tempMorphBuffer, intersections_1, isFirst);\n exist = pointExists(virtualNode, linesToCheck) || pointExists(virtualNode, checkedLines);\n pointInside = isPointInNonMembers(virtualNode, nonMembers);\n } // 第二次route时不要求pointInside\n\n\n if (virtualNode && !exist && (!isFirst || !pointInside)) {\n // add 2 rerouted lines to check\n linesToCheck.push(new math_Line(line.x1, line.y1, virtualNode.x, virtualNode.y));\n linesToCheck.push(new math_Line(virtualNode.x, virtualNode.y, line.x2, line.y2));\n hasIntersection = true;\n }\n };\n\n testReroute(true);\n\n if (!hasIntersection) {\n // if we didn't find a valid point around the first corner, try the second\n testReroute(false);\n }\n }\n } // no intersection found, mark this line as completed\n\n\n if (!hasIntersection) {\n checkedLines.push(line);\n }\n\n iterations += 1;\n }; // inner loop end when out of lines or found an intersection\n\n\n while (!hasIntersection && linesToCheck.length) {\n _loop_1();\n }\n } // 加入剩余的线\n\n\n while (linesToCheck.length) {\n checkedLines.push(linesToCheck.pop());\n }\n\n return checkedLines;\n};\n/**\n * Connect item with visited members using direct line or virtual edges\n */\n\n\nfunction getRoute(item, nonMembers, visited, maxRoutingIterations, morphBuffer) {\n var optimalNeighbor = bubbleset_pickBestNeighbor(item, visited, nonMembers);\n\n if (optimalNeighbor === null) {\n return [];\n } // merge the consecutive lines\n\n\n var mergeLines = function mergeLines(checkedLines) {\n var finalRoute = [];\n\n while (checkedLines.length > 0) {\n var line1 = checkedLines.pop();\n\n if (checkedLines.length === 0) {\n finalRoute.push(line1);\n break;\n }\n\n var line2 = checkedLines.pop();\n var mergeLine = new math_Line(line1.x1, line1.y1, line2.x2, line2.y2);\n var closestItem = bubbleset_getIntersectItem(nonMembers, mergeLine); // merge most recent line and previous line\n\n if (!closestItem) {\n checkedLines.push(mergeLine);\n } else {\n finalRoute.push(line1);\n checkedLines.push(line2);\n }\n }\n\n return finalRoute;\n };\n\n var directLine = new math_Line(item.getModel().x, item.getModel().y, optimalNeighbor.getModel().x, optimalNeighbor.getModel().y);\n var checkedLines = bubbleset_computeRoute(directLine, nonMembers, maxRoutingIterations, morphBuffer);\n var finalRoute = mergeLines(checkedLines);\n return finalRoute;\n}\n/**\n * Calculate the countor that includes the selected items and exclues the non-selected items\n * @param graph\n * @param members\n * @param nonMembers\n * @param options\n */\n\n\nvar bubbleset_genBubbleSet = function genBubbleSet(members, nonMembers, ops) {\n // eslint-disable-next-line no-redeclare\n var options = Object.assign(defaultOps, ops);\n var centroid = getPointsCenter(members.map(function (item) {\n return {\n x: item.getModel().x,\n y: item.getModel().y\n };\n })); // 按照到中心距离远近排序\n\n members = members.sort(function (a, b) {\n return squareDist({\n x: a.getModel().x,\n y: a.getModel().y\n }, centroid) - squareDist({\n x: b.getModel().x,\n y: b.getModel().y\n }, centroid);\n });\n var visited = [];\n var virtualEdges = [];\n members.forEach(function (item) {\n var lines = getRoute(item, nonMembers, visited, options.maxRoutingIterations, options.morphBuffer);\n lines.forEach(function (l) {\n virtualEdges.push(l);\n });\n visited.push(item);\n }); // 由于edge也可以作为member和nonMember传入,暂时不考虑把edges作为参数传入genBubbleSet\n // edges && edges.forEach(e => {\n // virtualEdges.push(new Line(e.getSource().getModel().x, e.getSource().getModel().y, e.getTarget().getModel().x, e.getTarget().getModel().y));\n // });\n\n var activeRegion = getActiveRregion(members, virtualEdges, options.nodeR0);\n var potentialArea = initGridCells(activeRegion.width, activeRegion.height, options.pixelGroupSize); // Use march squares to generate contour\n\n var contour = [];\n var hull = [];\n\n for (var iterations = 0; iterations < options.maxMarchingIterations; iterations++) {\n fillPotentialArea(members, nonMembers, virtualEdges, activeRegion, potentialArea, options);\n contour = [];\n hull = [];\n if (!new MarchingSquares(contour, potentialArea, options.threshold).march()) continue;\n var marchedPath = contour.map(function (point) {\n return {\n x: Math.round(point.x * options.pixelGroupSize + activeRegion.minX),\n y: Math.round(point.y * options.pixelGroupSize + activeRegion.minY)\n };\n }); // const marchedPath = marchingSquares(potentialArea, options.threshold).map(point => ({ x: Math.round(point.x * options.pixelGroupSize + activeRegion.minX), y: Math.round(point.y * options.pixelGroupSize + activeRegion.minY) }))\n\n if (marchedPath) {\n var size = marchedPath.length;\n\n if (options.skip > 1) {\n size = Math.floor(marchedPath.length / options.skip); // if we reduced too much (fewer than three points in reduced surface) reduce skip and try again\n\n while (size < 3 && options.skip > 1) {\n options.skip -= 1;\n size = Math.floor(marchedPath.length / options.skip);\n }\n } // copy hull values\n\n\n for (var i = 0, j = 0; j < size; j += 1, i += options.skip) {\n hull.push({\n x: marchedPath[i].x,\n y: marchedPath[i].y\n });\n }\n }\n\n var isContourValid = function isContourValid() {\n for (var _i = 0, members_1 = members; _i < members_1.length; _i++) {\n var item = members_1[_i];\n var hullPoints = hull.map(function (point) {\n return [point.x, point.y];\n });\n if (!isPointInPolygon(hullPoints, item.getBBox().centerX, item.getBBox().centerY)) return false;\n } // 不强制要求所有nonMembers都没有包含在内\n // for (const item of nonMembers) {\n // if (isPointInPolygon({ x: item.getBBox().centerX, y: item.getBBox().centerY }, contour)) return false\n // }\n\n\n return true;\n };\n\n if (hull && isContourValid()) {\n return hull;\n } // update parameters for next iteraction\n\n\n options.threshold *= 0.9;\n\n if (iterations <= options.maxMarchingIterations * 0.5) {\n options.memberInfluenceFactor *= 1.2;\n options.edgeInfluenceFactor *= 1.2;\n } else if (options.nonMemberInfluenceFactor !== 0 && nonMembers.length > 0) {\n // after half the iterations, start increasing positive energy and lowering the threshold\n options.nonMemberInfluenceFactor *= 0.8;\n } else {\n break;\n }\n }\n\n return hull;\n};\n/**\n * unionboundingbox\n * @param members\n * @param edges\n */\n\nfunction getActiveRregion(members, edges, offset) {\n var activeRegion = {\n minX: Number.POSITIVE_INFINITY,\n minY: Number.POSITIVE_INFINITY,\n maxX: Number.NEGATIVE_INFINITY,\n maxY: Number.NEGATIVE_INFINITY,\n width: 0,\n height: 0,\n x: 0,\n y: 0\n };\n var bboxes = [];\n members.forEach(function (item) {\n bboxes.push(item.getBBox());\n });\n edges.forEach(function (l) {\n bboxes.push(l.getBBox());\n });\n\n for (var _i = 0, bboxes_1 = bboxes; _i < bboxes_1.length; _i++) {\n var bbox = bboxes_1[_i];\n activeRegion.minX = (bbox.minX < activeRegion.minX ? bbox.minX : activeRegion.minX) - offset;\n activeRegion.minY = (bbox.minY < activeRegion.minY ? bbox.minY : activeRegion.minY) - offset;\n activeRegion.maxX = (bbox.maxX > activeRegion.maxX ? bbox.maxX : activeRegion.maxX) + offset;\n activeRegion.maxY = (bbox.maxY > activeRegion.maxY ? bbox.maxY : activeRegion.maxY) + offset;\n }\n\n activeRegion.width = activeRegion.maxX - activeRegion.minX;\n activeRegion.height = activeRegion.maxY - activeRegion.minY;\n activeRegion.x = activeRegion.minX;\n activeRegion.y = activeRegion.minY;\n return activeRegion;\n}\n\nfunction fillPotentialArea(members, nonMembers, edges, activeRegion, potentialArea, options) {\n function pos2GridIx(x, offset) {\n var gridIx = Math.floor((x - offset) / options.pixelGroupSize);\n return gridIx < 0 ? 0 : gridIx;\n }\n\n function gridIx2Pos(x, offset) {\n return x * options.pixelGroupSize + offset;\n } // using inverse a for numerical stability\n\n\n var nodeInfA = (options.nodeR0 - options.nodeR1) * (options.nodeR0 - options.nodeR1);\n var edgeInfA = (options.edgeR0 - options.edgeR1) * (options.edgeR0 - options.edgeR1);\n\n var getAffectedRegion = function getAffectedRegion(bbox, thresholdR) {\n var startX = Math.min(pos2GridIx(bbox.minX, thresholdR + activeRegion.minX), potentialArea.width);\n var startY = Math.min(pos2GridIx(bbox.minY, thresholdR + activeRegion.minY), potentialArea.height);\n var endX = Math.min(pos2GridIx(bbox.maxX, -thresholdR + activeRegion.minX), potentialArea.width);\n var endY = Math.min(pos2GridIx(bbox.maxY, -thresholdR + activeRegion.minY), potentialArea.height);\n return [startX, startY, endX, endY];\n };\n\n var addItemInfluence = function addItemInfluence(item, influenceFactor) {\n var bbox = item.getBBox();\n\n var _a = getAffectedRegion(bbox, options.nodeR1),\n startX = _a[0],\n startY = _a[1],\n endX = _a[2],\n endY = _a[3]; // calculate item influence for each cell\n\n\n for (var y = startY; y < endY; y += 1) {\n for (var x = startX; x < endX; x += 1) {\n if (influenceFactor < 0 && potentialArea[x + y * potentialArea.width] <= 0) {\n continue;\n }\n\n var tempX = gridIx2Pos(x, activeRegion.minX);\n var tempY = gridIx2Pos(y, activeRegion.minY);\n var distanceSq = pointRectSquareDist({\n x: tempX,\n y: tempY\n }, {\n x: bbox.minX,\n y: bbox.minY,\n width: bbox.width,\n height: bbox.height\n });\n\n if (distanceSq < Math.pow(options.nodeR1, 2)) {\n var dr = Math.sqrt(distanceSq) - options.nodeR1;\n potentialArea.cells[x + y * potentialArea.width] += influenceFactor * dr * dr;\n }\n }\n }\n };\n\n var addEdgeInfluence = function addEdgeInfluence(line, influenceFactor) {\n var bbox = line.getBBox();\n\n var _a = getAffectedRegion(bbox, options.edgeR1),\n startX = _a[0],\n startY = _a[1],\n endX = _a[2],\n endY = _a[3]; // for every point in active part of potentialArea, calculate distance to nearest point on line and add influence\n\n\n for (var y = startY; y < endY; y += 1) {\n for (var x = startX; x < endX; x += 1) {\n if (influenceFactor < 0 && potentialArea.cells[x + y * potentialArea.width] <= 0) {\n continue;\n }\n\n var tempX = gridIx2Pos(x, activeRegion.minX);\n var tempY = gridIx2Pos(y, activeRegion.minY);\n var minDistanceSq = pointLineSquareDist({\n x: tempX,\n y: tempY\n }, line); // only influence if less than r1\n\n if (minDistanceSq < Math.pow(options.edgeR1, 2)) {\n var mdr = Math.sqrt(minDistanceSq) - options.edgeR1;\n potentialArea.cells[x + y * potentialArea.width] += influenceFactor * mdr * mdr;\n }\n }\n }\n };\n\n if (options.nodeInfluenceFactor) {\n members.forEach(function (item) {\n addItemInfluence(item, options.nodeInfluenceFactor / nodeInfA);\n });\n }\n\n if (options.edgeInfluenceFactor) {\n edges.forEach(function (edge) {\n addEdgeInfluence(edge, options.edgeInfluenceFactor / edgeInfA);\n });\n }\n\n if (options.negativeNodeInfluenceFactor) {\n nonMembers.forEach(function (item) {\n addItemInfluence(item, options.negativeNodeInfluenceFactor / nodeInfA);\n });\n }\n}\n\nfunction rerouteLine(item, buffer, intersections, wrapNormal) {\n var bbox = item.getBBox();\n var topIntersect = intersections[0],\n leftIntersect = intersections[1],\n bottomIntersect = intersections[2],\n rightIntersect = intersections[3];\n var cornerPos = {\n topLeft: {\n x: bbox.minX - buffer,\n y: bbox.minY - buffer\n },\n topRight: {\n x: bbox.maxX + buffer,\n y: bbox.minY - buffer\n },\n bottomLeft: {\n x: bbox.minX - buffer,\n y: bbox.maxY + buffer\n },\n bottomRight: {\n x: bbox.maxX + buffer,\n y: bbox.maxY + buffer\n }\n };\n var totalArea = bbox.height * bbox.width;\n\n function calcHalfArea(intersect1, intersect2) {\n return bbox.width * ((intersect1.y - bbox.minY + (intersect2.y - bbox.minY)) * 0.5);\n } // 根据线和boundingbox相交的情况,确定control point的位置\n\n\n if (leftIntersect) {\n // 相交区域有三角形\n if (topIntersect) return wrapNormal ? cornerPos.topLeft : cornerPos.bottomRight;\n if (bottomIntersect) return wrapNormal ? cornerPos.bottomLeft : cornerPos.topRight; // 相交区域分成上下两个梯形,比较面积\n\n var topArea = calcHalfArea(leftIntersect, rightIntersect);\n\n if (topArea < totalArea * 0.5) {\n if (leftIntersect.y > rightIntersect.y) return wrapNormal ? cornerPos.topLeft : cornerPos.bottomRight;\n return wrapNormal ? cornerPos.topRight : cornerPos.bottomLeft;\n }\n\n if (leftIntersect.y < rightIntersect.y) return wrapNormal ? cornerPos.bottomLeft : cornerPos.topRight;\n return wrapNormal ? cornerPos.bottomRight : cornerPos.topLeft;\n }\n\n if (rightIntersect) {\n if (topIntersect) return wrapNormal ? cornerPos.topRight : cornerPos.bottomLeft;\n if (bottomIntersect) return wrapNormal ? cornerPos.bottomRight : cornerPos.topLeft;\n } // 相交区域分成左右两个梯形\n\n\n var leftArea = calcHalfArea(topIntersect, bottomIntersect);\n\n if (leftArea < totalArea * 0.5) {\n if (topIntersect.x > bottomIntersect.x) return wrapNormal ? cornerPos.topLeft : cornerPos.bottomRight;\n return wrapNormal ? cornerPos.bottomLeft : cornerPos.topRight;\n }\n\n if (topIntersect.x < bottomIntersect.x) return wrapNormal ? cornerPos.topRight : cornerPos.bottomLeft;\n return wrapNormal ? cornerPos.bottomRight : cornerPos.topLeft;\n}\n// CONCATENATED MODULE: ./node_modules/@antv/g6-core/es/item/hull.js\n\n\n\n\n\n\n\n/**\n * 用于包裹内部的成员的轮廓。\n * convex hull(凸包):http://geomalgorithms.com/a10-_hull-1.html#Monotone%20Chain\n * bubble: 使用 bubbleset算法,refer: http://vialab.science.uoit.ca/wp-content/papercite-data/pdf/col2009c.pdf\n * 通过配置 padding 可以调节包裹轮廓对节点的松紧程度\n */\n\nvar hull_Hull =\n/** @class */\nfunction () {\n function Hull(graph, cfg) {\n this.cfg = Object(esm[\"deepMix\"])(this.getDefaultCfg(), cfg);\n this.graph = graph;\n this.id = this.cfg.id;\n this.group = this.cfg.group;\n this.members = this.cfg.members.map(function (item) {\n return Object(esm[\"isString\"])(item) ? graph.findById(item) : item;\n });\n this.nonMembers = this.cfg.nonMembers.map(function (item) {\n return Object(esm[\"isString\"])(item) ? graph.findById(item) : item;\n });\n this.setPadding();\n this.setType();\n this.path = this.calcPath(this.members, this.nonMembers);\n this.render();\n }\n\n Hull.prototype.getDefaultCfg = function () {\n return {\n id: 'g6-hull',\n type: 'round-convex',\n members: [],\n nonMembers: [],\n style: {\n fill: 'lightblue',\n stroke: 'blue',\n opacity: 0.2\n },\n padding: 10\n };\n };\n\n Hull.prototype.setPadding = function () {\n var nodeSize = this.members.length && this.members[0].getKeyShape().getCanvasBBox().width / 2;\n this.padding = this.cfg.padding > 0 ? this.cfg.padding + nodeSize : 10 + nodeSize;\n this.cfg.bubbleCfg = {\n nodeR0: this.padding - nodeSize,\n nodeR1: this.padding - nodeSize,\n morphBuffer: this.padding - nodeSize\n };\n };\n\n Hull.prototype.setType = function () {\n this.type = this.cfg.type;\n\n if (this.members.length < 3) {\n this.type = 'round-convex';\n }\n\n if (this.type !== 'round-convex' && this.type !== 'smooth-convex' && this.type !== 'bubble') {\n console.warn('The hull type should be either round-convex, smooth-convex or bubble, round-convex is used by default.');\n this.type = 'round-convex';\n }\n };\n\n Hull.prototype.calcPath = function (members, nonMembers) {\n var contour, path, hull;\n\n switch (this.type) {\n case 'round-convex':\n contour = genConvexHull(members);\n hull = roundedHull(contour.map(function (p) {\n return [p.x, p.y];\n }), this.padding);\n path = Object(path_util_esm[\"b\" /* parsePathString */])(hull);\n break;\n\n case 'smooth-convex':\n contour = genConvexHull(members);\n\n if (contour.length === 2) {\n hull = roundedHull(contour.map(function (p) {\n return [p.x, p.y];\n }), this.padding);\n path = Object(path_util_esm[\"b\" /* parsePathString */])(hull);\n } else if (contour.length > 2) {\n hull = paddedHull(contour.map(function (p) {\n return [p.x, p.y];\n }), this.padding);\n path = getClosedSpline(hull);\n }\n\n break;\n\n case 'bubble':\n contour = bubbleset_genBubbleSet(members, nonMembers, this.cfg.bubbleCfg);\n path = contour.length >= 2 && getClosedSpline(contour);\n break;\n\n default:\n }\n\n return path;\n };\n\n Hull.prototype.render = function () {\n this.group.addShape('path', {\n attrs: Object(tslib_es6[\"__assign\"])({\n path: this.path\n }, this.cfg.style),\n id: this.id,\n name: this.cfg.id,\n capture: false\n });\n this.group.toBack();\n };\n /**\n * 增加hull的成员,同时如果该成员原先在nonMembers中,则从nonMembers中去掉\n * @param item 节点实例\n * @return boolean 添加成功返回 true,否则返回 false\n */\n\n\n Hull.prototype.addMember = function (item) {\n if (!item) return;\n if (Object(esm[\"isString\"])(item)) item = this.graph.findById(item);\n this.members.push(item);\n var index = this.nonMembers.indexOf(item);\n\n if (index > -1) {\n this.nonMembers.splice(index, 1);\n }\n\n this.updateData(this.members, this.nonMembers);\n return true;\n };\n /**\n * 增加hull需要排除的节点,同时如果该成员原先在members中,则从members中去掉\n * @param item 节点实例\n * @return boolean 添加成功返回 true,否则返回 false\n */\n\n\n Hull.prototype.addNonMember = function (item) {\n if (!item) return;\n if (Object(esm[\"isString\"])(item)) item = this.graph.findById(item);\n this.nonMembers.push(item);\n var index = this.members.indexOf(item);\n\n if (index > -1) {\n this.members.splice(index, 1);\n }\n\n this.updateData(this.members, this.nonMembers);\n return true;\n };\n /**\n * 移除hull中的成员\n * @param node 节点实例\n * @return boolean 移除成功返回 true,否则返回 false\n */\n\n\n Hull.prototype.removeMember = function (item) {\n if (!item) return;\n if (Object(esm[\"isString\"])(item)) item = this.graph.findById(item);\n var index = this.members.indexOf(item);\n\n if (index > -1) {\n this.members.splice(index, 1);\n this.updateData(this.members, this.nonMembers);\n return true;\n }\n\n return false;\n };\n /**\n * @param node 节点实例\n * @return boolean 移除成功返回 true,否则返回 false\n */\n\n\n Hull.prototype.removeNonMember = function (item) {\n if (!item) return;\n if (Object(esm[\"isString\"])(item)) item = this.graph.findById(item);\n var index = this.nonMembers.indexOf(item);\n\n if (index > -1) {\n this.nonMembers.splice(index, 1);\n this.updateData(this.members, this.nonMembers);\n return true;\n }\n\n return false;\n };\n\n Hull.prototype.updateData = function (members, nonMembers) {\n var _this = this;\n\n this.group.findById(this.id).remove();\n if (members) this.members = members.map(function (item) {\n return Object(esm[\"isString\"])(item) ? _this.graph.findById(item) : item;\n });\n if (nonMembers) this.nonMembers = nonMembers.map(function (item) {\n return Object(esm[\"isString\"])(item) ? _this.graph.findById(item) : item;\n });\n this.path = this.calcPath(this.members, this.nonMembers);\n this.render();\n };\n\n Hull.prototype.updateStyle = function (cfg) {\n var path = this.group.findById(this.id);\n path.attr(Object(tslib_es6[\"__assign\"])({}, cfg));\n };\n /**\n * 更新 hull\n * @param cfg hull 配置项\n */\n\n\n Hull.prototype.updateCfg = function (cfg) {\n var _this = this;\n\n this.cfg = Object(esm[\"deepMix\"])(this.cfg, cfg);\n this.id = this.cfg.id;\n this.group = this.cfg.group;\n\n if (cfg.members) {\n this.members = this.cfg.members.map(function (item) {\n return Object(esm[\"isString\"])(item) ? _this.graph.findById(item) : item;\n });\n }\n\n if (cfg.nonMembers) {\n this.nonMembers = this.cfg.nonMembers.map(function (item) {\n return Object(esm[\"isString\"])(item) ? _this.graph.findById(item) : item;\n });\n } // TODO padding 设置太大,会影响到 contain 结果\n\n\n this.setPadding();\n this.setType();\n this.path = this.calcPath(this.members, this.nonMembers);\n this.render();\n };\n /**\n * 判断是否在hull内部\n * @param item\n */\n\n\n Hull.prototype.contain = function (item) {\n var _this = this;\n\n var nodeItem;\n\n if (Object(esm[\"isString\"])(item)) {\n nodeItem = this.graph.findById(item);\n } else {\n nodeItem = item;\n }\n\n var shapePoints;\n var shape = nodeItem.getKeyShape();\n\n if (nodeItem.get('type') === 'path') {\n shapePoints = pathToPoints(shape.attr('path'));\n } else {\n var shapeBBox = shape.getCanvasBBox();\n shapePoints = [[shapeBBox.minX, shapeBBox.minY], [shapeBBox.maxX, shapeBBox.minY], [shapeBBox.maxX, shapeBBox.maxY], [shapeBBox.minX, shapeBBox.maxY]];\n }\n\n shapePoints = shapePoints.map(function (canvasPoint) {\n var point = _this.graph.getPointByCanvas(canvasPoint[0], canvasPoint[1]);\n\n return [point.x, point.y];\n });\n return math_isPolygonsIntersect(shapePoints, pathToPoints(this.path));\n };\n\n Hull.prototype.destroy = function () {\n this.group.remove();\n this.cfg = null;\n };\n\n return Hull;\n}();\n\n/* harmony default export */ var item_hull = (hull_Hull);\n// CONCATENATED MODULE: ./node_modules/@antv/g6-core/es/graph/graph.js\n\n\n\n\n\n\n\n\n\n\n\nvar graph_transform = matrix_util_esm[\"ext\"].transform;\nvar graph_NODE = 'node';\n\nvar graph_AbstractGraph =\n/** @class */\nfunction (_super) {\n Object(tslib_es6[\"__extends\"])(AbstractGraph, _super);\n\n function AbstractGraph(cfg) {\n var _this = _super.call(this) || this;\n\n _this.cfg = Object(esm[\"deepMix\"])(_this.getDefaultCfg(), cfg);\n\n _this.init();\n\n _this.animating = false;\n _this.destroyed = false; // 启用 stack 后,实例化 undoStack 和 redoStack\n\n if (_this.cfg.enabledStack) {\n // 实例化 undo 和 redo 栈\n _this.undoStack = new structs_stack(_this.cfg.maxStep);\n _this.redoStack = new structs_stack(_this.cfg.maxStep);\n }\n\n return _this;\n }\n\n AbstractGraph.prototype.init = function () {\n this.initCanvas(); // instance controller\n\n var viewController = new view(this);\n var modeController = new controller_mode(this);\n var itemController = new controller_item(this);\n var stateController = new controller_state(this);\n this.set({\n viewController: viewController,\n modeController: modeController,\n itemController: itemController,\n stateController: stateController\n }); // 初始化布局机制\n\n this.initLayoutController(); // 初始化事件机制\n\n this.initEventController();\n this.initGroups();\n /** 初始化插件 */\n\n this.initPlugins();\n }; // 初始化所有 Group\n\n\n AbstractGraph.prototype.initGroups = function () {\n var canvas = this.get('canvas');\n if (!canvas) return;\n var el = canvas.get('el');\n var _a = (el || {}).id,\n id = _a === void 0 ? 'g6' : _a;\n var group = canvas.addGroup({\n id: id + \"-root\",\n className: global.rootContainerClassName\n });\n\n if (this.get('groupByTypes')) {\n var edgeGroup = group.addGroup({\n id: id + \"-edge\",\n className: global.edgeContainerClassName\n });\n var nodeGroup = group.addGroup({\n id: id + \"-node\",\n className: global.nodeContainerClassName\n });\n var comboGroup = group.addGroup({\n id: id + \"-combo\",\n className: global.comboContainerClassName\n }); // 用于存储自定义的群组\n\n comboGroup.toBack();\n this.set({\n nodeGroup: nodeGroup,\n edgeGroup: edgeGroup,\n comboGroup: comboGroup\n });\n }\n\n var delegateGroup = group.addGroup({\n id: id + \"-delegate\",\n className: global.delegateContainerClassName\n });\n this.set({\n delegateGroup: delegateGroup\n });\n this.set('group', group);\n }; // eslint-disable-next-line class-methods-use-this\n\n\n AbstractGraph.prototype.getDefaultCfg = function () {\n return {\n /**\n * Container could be dom object or dom id\n */\n container: undefined,\n\n /**\n * Canvas width\n * unit pixel if undefined force fit width\n */\n width: undefined,\n\n /**\n * Canvas height\n * unit pixel if undefined force fit height\n */\n height: undefined,\n\n /**\n * renderer canvas or svg\n * @type {string}\n */\n renderer: 'canvas',\n\n /**\n * control graph behaviors\n */\n modes: {},\n\n /**\n * 注册插件\n */\n plugins: [],\n\n /**\n * source data\n */\n data: {},\n\n /**\n * Fit view padding (client scale)\n */\n fitViewPadding: 10,\n\n /**\n * Minimum scale size\n */\n minZoom: 0.2,\n\n /**\n * Maxmum scale size\n */\n maxZoom: 10,\n\n /**\n * capture events\n */\n event: true,\n\n /**\n * group node & edges into different graphic groups\n */\n groupByTypes: true,\n\n /**\n * determine if it's a directed graph\n */\n directed: false,\n\n /**\n * when data or shape changed, should canvas draw automatically\n */\n autoPaint: true,\n\n /**\n * store all the node instances\n */\n nodes: [],\n\n /**\n * store all the edge instances\n */\n edges: [],\n\n /**\n * store all the combo instances\n */\n combos: [],\n\n /**\n * store all the edge instances which are virtual edges related to collapsed combo\n */\n vedges: [],\n\n /**\n * all the instances indexed by id\n */\n itemMap: {},\n\n /**\n * 边直接连接到节点的中心,不再考虑锚点\n */\n linkCenter: false,\n\n /**\n * 默认的节点配置,data 上定义的配置会覆盖这些配置。例如:\n * defaultNode: {\n * type: 'rect',\n * size: [60, 40],\n * style: {\n * //... 样式配置项\n * }\n * }\n * 若数据项为 { id: 'node', x: 100, y: 100 }\n * 实际创建的节点模型是 { id: 'node', x: 100, y: 100, type: 'rect', size: [60, 40] }\n * 若数据项为 { id: 'node', x: 100, y: 100, type: 'circle' }\n * 实际创建的节点模型是 { id: 'node', x: 100, y: 100, type: 'circle', size: [60, 40] }\n */\n defaultNode: {},\n\n /**\n * 默认边配置,data 上定义的配置会覆盖这些配置。用法同 defaultNode\n */\n defaultEdge: {},\n\n /**\n * 节点默认样式,也可以添加状态样式\n * 例如:\n * const graph = new G6.Graph({\n * nodeStateStyles: {\n * selected: { fill: '#ccc', stroke: '#666' },\n * active: { lineWidth: 2 }\n * },\n * ...\n * });\n *\n */\n nodeStateStyles: {},\n\n /**\n * 边默认样式,用法同nodeStateStyle\n */\n edgeStateStyles: {},\n\n /**\n * graph 状态\n */\n states: {},\n\n /**\n * 是否启用全局动画\n */\n animate: false,\n\n /**\n * 动画设置,仅在 animate 为 true 时有效\n */\n animateCfg: {\n /**\n * 帧回调函数,用于自定义节点运动路径,为空时线性运动\n */\n onFrame: undefined,\n\n /**\n * 动画时长(ms)\n */\n duration: 500,\n\n /**\n * 指定动画动效\n */\n easing: 'easeLinear'\n },\n callback: undefined,\n // 默认不启用 undo & redo 功能\n enabledStack: false,\n // 只有当 enabledStack 为 true 时才起作用\n maxStep: 10,\n // 存储图上的 tooltip dom,方便销毁\n tooltips: []\n };\n };\n /**\n * 将值设置到 this.cfg 变量上面\n * @param key 键 或 对象值\n * @param val 值\n */\n\n\n AbstractGraph.prototype.set = function (key, val) {\n if (Object(esm[\"isPlainObject\"])(key)) {\n this.cfg = Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, this.cfg), key);\n } else {\n this.cfg[key] = val;\n }\n\n return this;\n };\n /**\n * 获取 this.cfg 中的值\n * @param key 键\n */\n\n\n AbstractGraph.prototype.get = function (key) {\n var _a;\n\n return (_a = this.cfg) === null || _a === void 0 ? void 0 : _a[key];\n };\n /**\n * 获取 graph 的根图形分组\n * @return 根 group\n */\n\n\n AbstractGraph.prototype.getGroup = function () {\n return this.get('group');\n };\n /**\n * 获取 graph 的 DOM 容器\n * @return DOM 容器\n */\n\n\n AbstractGraph.prototype.getContainer = function () {\n return this.get('container');\n };\n /**\n * 获取 graph 的最小缩放比例\n * @return minZoom\n */\n\n\n AbstractGraph.prototype.getMinZoom = function () {\n return this.get('minZoom');\n };\n /**\n * 设置 graph 的最小缩放比例\n * @return minZoom\n */\n\n\n AbstractGraph.prototype.setMinZoom = function (ratio) {\n return this.set('minZoom', ratio);\n };\n /**\n * 获取 graph 的最大缩放比例\n * @param maxZoom\n */\n\n\n AbstractGraph.prototype.getMaxZoom = function () {\n return this.get('maxZoom');\n };\n /**\n * 设置 graph 的最大缩放比例\n * @param maxZoom\n */\n\n\n AbstractGraph.prototype.setMaxZoom = function (ratio) {\n return this.set('maxZoom', ratio);\n };\n /**\n * 获取 graph 的宽度\n * @return width\n */\n\n\n AbstractGraph.prototype.getWidth = function () {\n return this.get('width');\n };\n /**\n * 获取 graph 的高度\n * @return width\n */\n\n\n AbstractGraph.prototype.getHeight = function () {\n return this.get('height');\n };\n /**\n * 清理元素多个状态\n * @param {string|Item} item 元素id或元素实例\n * @param {string[]} states 状态\n */\n\n\n AbstractGraph.prototype.clearItemStates = function (item, states) {\n if (Object(esm[\"isString\"])(item)) {\n item = this.findById(item);\n }\n\n var itemController = this.get('itemController');\n\n if (!states) {\n states = item.get('states');\n }\n\n itemController.clearItemStates(item, states);\n var stateController = this.get('stateController');\n stateController.updateStates(item, states, false);\n };\n /**\n * 设置各个节点样式,以及在各种状态下节点 keyShape 的样式。\n * 若是自定义节点切在各种状态下\n * graph.node(node => {\n * return {\n * type: 'rect',\n * label: node.id,\n * style: { fill: '#666' },\n * stateStyles: {\n * selected: { fill: 'blue' },\n * custom: { fill: 'green' }\n * }\n * }\n * });\n * @param {function} nodeFn 指定每个节点样式\n */\n\n\n AbstractGraph.prototype.node = function (nodeFn) {\n if (typeof nodeFn === 'function') {\n this.set('nodeMapper', nodeFn);\n }\n };\n /**\n * 设置各个边样式\n * @param {function} edgeFn 指定每个边的样式,用法同 node\n */\n\n\n AbstractGraph.prototype.edge = function (edgeFn) {\n if (typeof edgeFn === 'function') {\n this.set('edgeMapper', edgeFn);\n }\n };\n /**\n * 设置各个 combo 的配置\n * @param comboFn\n */\n\n\n AbstractGraph.prototype.combo = function (comboFn) {\n if (typeof comboFn === 'function') {\n this.set('comboMapper', comboFn);\n }\n };\n /**\n * 根据 ID 查询图元素实例\n * @param id 图元素 ID\n */\n\n\n AbstractGraph.prototype.findById = function (id) {\n return this.get('itemMap')[id];\n };\n /**\n * 根据对应规则查找单个元素\n * @param {ITEM_TYPE} type 元素类型(node | edge | group)\n * @param {(item: T, index: number) => T} fn 指定规则\n * @return {T} 元素实例\n */\n\n\n AbstractGraph.prototype.find = function (type, fn) {\n var result;\n var items = this.get(type + \"s\"); // eslint-disable-next-line consistent-return\n\n Object(esm[\"each\"])(items, function (item, i) {\n if (fn(item, i)) {\n result = item;\n return result;\n }\n });\n return result;\n };\n /**\n * 查找所有满足规则的元素\n * @param {string} type 元素类型(node|edge)\n * @param {string} fn 指定规则\n * @return {array} 元素实例\n */\n\n\n AbstractGraph.prototype.findAll = function (type, fn) {\n var result = [];\n Object(esm[\"each\"])(this.get(type + \"s\"), function (item, i) {\n if (fn(item, i)) {\n result.push(item);\n }\n });\n return result;\n };\n /**\n * 查找所有处于指定状态的元素\n * @param {string} type 元素类型(node|edge)\n * @param {string} state 状态\n * @return {object} 元素实例\n */\n\n\n AbstractGraph.prototype.findAllByState = function (type, state) {\n return this.findAll(type, function (item) {\n return item.hasState(state);\n });\n };\n /**\n * 平移画布\n * @param dx 水平方向位移\n * @param dy 垂直方向位移\n */\n\n\n AbstractGraph.prototype.translate = function (dx, dy) {\n var group = this.get('group');\n var matrix = Object(esm[\"clone\"])(group.getMatrix());\n\n if (!matrix) {\n matrix = [1, 0, 0, 0, 1, 0, 0, 0, 1];\n }\n\n matrix = graph_transform(matrix, [['t', dx, dy]]);\n group.setMatrix(matrix);\n this.emit('viewportchange', {\n action: 'translate',\n matrix: group.getMatrix()\n });\n this.autoPaint();\n };\n /**\n * 平移画布到某点\n * @param {number} x 水平坐标\n * @param {number} y 垂直坐标\n */\n\n\n AbstractGraph.prototype.moveTo = function (x, y, animate, animateCfg) {\n var group = this.get('group');\n move(group, {\n x: x,\n y: y\n }, animate, animateCfg || {\n duration: 500,\n easing: 'easeCubic'\n });\n this.emit('viewportchange', {\n action: 'move',\n matrix: group.getMatrix()\n });\n };\n /**\n * 调整视口适应视图\n * @param {object} padding 四周围边距\n * @param {FitViewRules} rules fitView的规则\n */\n\n\n AbstractGraph.prototype.fitView = function (padding, rules) {\n if (padding) {\n this.set('fitViewPadding', padding);\n }\n\n var viewController = this.get('viewController');\n\n if (rules) {\n viewController.fitViewByRules(rules);\n } else {\n viewController.fitView();\n }\n\n this.autoPaint();\n };\n /**\n * 调整视口适应视图,不缩放,仅将图 bbox 中心对齐到画布中心\n */\n\n\n AbstractGraph.prototype.fitCenter = function () {\n var viewController = this.get('viewController');\n viewController.fitCenter();\n this.autoPaint();\n };\n /**\n * 新增行为\n * @param {string | ModeOption | ModeType[]} behaviors 添加的行为\n * @param {string | string[]} modes 添加到对应的模式\n * @return {Graph} Graph\n */\n\n\n AbstractGraph.prototype.addBehaviors = function (behaviors, modes) {\n var modeController = this.get('modeController');\n modeController.manipulateBehaviors(behaviors, modes, true);\n return this;\n };\n /**\n * 移除行为\n * @param {string | ModeOption | ModeType[]} behaviors 移除的行为\n * @param {string | string[]} modes 从指定的模式中移除\n * @return {Graph} Graph\n */\n\n\n AbstractGraph.prototype.removeBehaviors = function (behaviors, modes) {\n var modeController = this.get('modeController');\n modeController.manipulateBehaviors(behaviors, modes, false);\n return this;\n };\n /**\n * 更新行为参数\n * @param {string | ModeOption | ModeType} behavior 需要更新的行为\n * @param {string | string[]} modes 指定的模式中的行为,不指定则为 default\n * @return {Graph} Graph\n */\n\n\n AbstractGraph.prototype.updateBehavior = function (behavior, newCfg, mode) {\n var modeController = this.get('modeController');\n modeController.updateBehavior(behavior, newCfg, mode);\n return this;\n };\n /**\n * 伸缩窗口\n * @param ratio 伸缩比例\n * @param center 以center的x, y坐标为中心缩放\n * @param {boolean} animate 是否带有动画地移动\n * @param {GraphAnimateConfig} animateCfg 若带有动画,动画的配置项\n * @return {boolean} 缩放是否成功\n */\n\n\n AbstractGraph.prototype.zoom = function (ratio, center, animate, animateCfg) {\n var _this = this;\n\n var group = this.get('group');\n var matrix = Object(esm[\"clone\"])(group.getMatrix());\n var minZoom = this.get('minZoom');\n var maxZoom = this.get('maxZoom');\n\n if (!matrix) {\n matrix = [1, 0, 0, 0, 1, 0, 0, 0, 1];\n }\n\n if (center) {\n matrix = graph_transform(matrix, [['t', -center.x, -center.y], ['s', ratio, ratio], ['t', center.x, center.y]]);\n } else {\n matrix = graph_transform(matrix, [['s', ratio, ratio]]);\n }\n\n if (minZoom && matrix[0] < minZoom || maxZoom && matrix[0] > maxZoom) {\n return false;\n } // matrix = [2, 0, 0, 0, 2, 0, -125, -125, 1];\n\n\n if (animate) {\n // Clone the original matrix to perform the animation\n var aniMatrix_1 = Object(esm[\"clone\"])(group.getMatrix());\n\n if (!aniMatrix_1) {\n aniMatrix_1 = [1, 0, 0, 0, 1, 0, 0, 0, 1];\n }\n\n var initialRatio_1 = aniMatrix_1[0];\n var targetRatio_1 = initialRatio_1 * ratio;\n var animateConfig = void 0;\n\n if (!animateCfg) {\n animateConfig = {\n duration: 500,\n callback: function callback() {\n _this.emit('viewportchange', {\n action: 'zoom',\n matrix: aniMatrix_1\n });\n }\n };\n } else if (animateCfg.callback) {\n // This is to prevent modifying the original animateCfg.callback\n var callback_1 = animateCfg.callback;\n animateConfig = Object(esm[\"clone\"])(animateCfg);\n\n animateConfig.callback = function () {\n _this.emit('viewportchange', {\n action: 'zoom',\n matrix: aniMatrix_1\n });\n\n callback_1();\n };\n } else {\n animateConfig = animateCfg;\n }\n\n group.animate(function (ratio) {\n if (ratio === 1) {\n // Reuse the first transformation\n aniMatrix_1 = matrix;\n } else {\n var scale = lerp(initialRatio_1, targetRatio_1, ratio) / aniMatrix_1[0];\n\n if (center) {\n aniMatrix_1 = graph_transform(aniMatrix_1, [['t', -center.x, -center.y], ['s', scale, scale], ['t', center.x, center.y]]);\n } else {\n aniMatrix_1 = graph_transform(aniMatrix_1, [['s', scale, scale]]);\n }\n }\n\n return {\n matrix: aniMatrix_1\n };\n }, animateConfig);\n } else {\n group.setMatrix(matrix);\n this.emit('viewportchange', {\n action: 'zoom',\n matrix: matrix\n });\n this.autoPaint();\n }\n\n return true;\n };\n /**\n * 伸缩视口到一固定比例\n * @param {number} toRatio 伸缩比例\n * @param {Point} center 以center的x, y坐标为中心缩放\n * @return {boolean} 缩放是否成功\n */\n\n\n AbstractGraph.prototype.zoomTo = function (toRatio, center) {\n var ratio = toRatio / this.getZoom();\n return this.zoom(ratio, center);\n };\n /**\n * 将元素移动到视口中心\n * @param {Item} item 指定元素\n * @param {boolean} animate 是否带有动画地移动\n * @param {GraphAnimateConfig} animateCfg 若带有动画,动画的配置项\n */\n\n\n AbstractGraph.prototype.focusItem = function (item, animate, animateCfg) {\n var viewController = this.get('viewController');\n var isAnimate = false;\n if (animate) isAnimate = true;else if (animate === undefined) isAnimate = this.get('animate');\n var curAniamteCfg = {};\n if (animateCfg) curAniamteCfg = animateCfg;else if (animateCfg === undefined) curAniamteCfg = this.get('animateCfg');\n viewController.focus(item, isAnimate, curAniamteCfg);\n this.autoPaint();\n };\n /**\n * 自动重绘\n * @internal 仅供内部更新机制调用,外部根据需求调用 render 或 paint 接口\n */\n\n\n AbstractGraph.prototype.autoPaint = function () {\n if (this.get('autoPaint')) {\n this.paint();\n }\n };\n /**\n * 仅画布重新绘制\n */\n\n\n AbstractGraph.prototype.paint = function () {\n this.emit('beforepaint');\n this.get('canvas').draw();\n this.emit('afterpaint');\n };\n /**\n * 将屏幕坐标转换为视口坐标\n * @param {number} clientX 屏幕x坐标\n * @param {number} clientY 屏幕y坐标\n * @return {Point} 视口坐标\n */\n\n\n AbstractGraph.prototype.getPointByClient = function (clientX, clientY) {\n var viewController = this.get('viewController');\n return viewController.getPointByClient(clientX, clientY);\n };\n /**\n * 将绘制坐标转换为屏幕坐标\n * @param {number} x 绘制坐标 x\n * @param {number} y 绘制坐标 y\n * @return {Point} 绘制坐标\n */\n\n\n AbstractGraph.prototype.getClientByPoint = function (x, y) {\n var viewController = this.get('viewController');\n return viewController.getClientByPoint(x, y);\n };\n /**\n * 将画布坐标转换为绘制坐标\n * @param {number} canvasX 画布 x 坐标\n * @param {number} canvasY 画布 y 坐标\n * @return {object} 绘制坐标\n */\n\n\n AbstractGraph.prototype.getPointByCanvas = function (canvasX, canvasY) {\n var viewController = this.get('viewController');\n return viewController.getPointByCanvas(canvasX, canvasY);\n };\n /**\n * 将绘制坐标转换为画布坐标\n * @param {number} x 绘制坐标 x\n * @param {number} y 绘制坐标 y\n * @return {object} 画布坐标\n */\n\n\n AbstractGraph.prototype.getCanvasByPoint = function (x, y) {\n var viewController = this.get('viewController');\n return viewController.getCanvasByPoint(x, y);\n };\n /**\n * 获取图内容的中心绘制坐标\n * @return {object} 中心绘制坐标\n */\n\n\n AbstractGraph.prototype.getGraphCenterPoint = function () {\n var bbox = this.get('group').getCanvasBBox();\n return {\n x: (bbox.minX + bbox.maxX) / 2,\n y: (bbox.minY + bbox.maxY) / 2\n };\n };\n /**\n * 获取视口中心绘制坐标\n * @return {object} 视口中心绘制坐标\n */\n\n\n AbstractGraph.prototype.getViewPortCenterPoint = function () {\n return this.getPointByCanvas(this.get('width') / 2, this.get('height') / 2);\n };\n /**\n * 显示元素\n * @param {Item} item 指定元素\n * @param {boolean} stack 本次操作是否入栈,默认为 true\n */\n\n\n AbstractGraph.prototype.showItem = function (item, stack) {\n if (stack === void 0) {\n stack = true;\n }\n\n var itemController = this.get('itemController');\n var object = itemController.changeItemVisibility(item, true);\n\n if (stack && this.get('enabledStack')) {\n var id = object.getID();\n var type = object.getType();\n var before = {};\n var after = {};\n\n switch (type) {\n case 'node':\n before.nodes = [{\n id: id,\n visible: false\n }];\n after.nodes = [{\n id: id,\n visible: true\n }];\n break;\n\n case 'edge':\n before.nodes = [{\n id: id,\n visible: false\n }];\n after.edges = [{\n id: id,\n visible: true\n }];\n break;\n\n case 'combo':\n before.nodes = [{\n id: id,\n visible: false\n }];\n after.combos = [{\n id: id,\n visible: true\n }];\n break;\n\n default:\n break;\n }\n\n this.pushStack('visible', {\n before: before,\n after: after\n });\n }\n };\n /**\n * 隐藏元素\n * @param {Item} item 指定元素\n * @param {boolean} stack 本次操作是否入栈,默认为 true\n */\n\n\n AbstractGraph.prototype.hideItem = function (item, stack) {\n if (stack === void 0) {\n stack = true;\n }\n\n var itemController = this.get('itemController');\n var object = itemController.changeItemVisibility(item, false);\n\n if (stack && this.get('enabledStack')) {\n var id = object.getID();\n var type = object.getType();\n var before = {};\n var after = {};\n\n switch (type) {\n case 'node':\n before.nodes = [{\n id: id,\n visible: true\n }];\n after.nodes = [{\n id: id,\n visible: false\n }];\n break;\n\n case 'edge':\n before.nodes = [{\n id: id,\n visible: true\n }];\n after.edges = [{\n id: id,\n visible: false\n }];\n break;\n\n case 'combo':\n before.nodes = [{\n id: id,\n visible: true\n }];\n after.combos = [{\n id: id,\n visible: false\n }];\n break;\n\n default:\n break;\n }\n\n this.pushStack('visible', {\n before: before,\n after: after\n });\n }\n };\n /**\n * 刷新元素\n * @param {string|object} item 元素id或元素实例\n */\n\n\n AbstractGraph.prototype.refreshItem = function (item) {\n var itemController = this.get('itemController');\n itemController.refreshItem(item);\n };\n /**\n * 设置是否在更新/刷新后自动重绘\n * @param {boolean} auto 自动重绘\n */\n\n\n AbstractGraph.prototype.setAutoPaint = function (auto) {\n var self = this;\n self.set('autoPaint', auto);\n var canvas = self.get('canvas');\n canvas.set('autoDraw', auto);\n };\n /**\n * 删除元素\n * @param {Item} item 元素id或元素实例\n * @param {boolean} stack 本次操作是否入栈,默认为 true\n */\n\n\n AbstractGraph.prototype.remove = function (item, stack) {\n if (stack === void 0) {\n stack = true;\n }\n\n this.removeItem(item, stack);\n };\n /**\n * 删除元素\n * @param {Item} item 元素id或元素实例\n * @param {boolean} stack 本次操作是否入栈,默认为 true\n */\n\n\n AbstractGraph.prototype.removeItem = function (item, stack) {\n if (stack === void 0) {\n stack = true;\n }\n\n var nodeItem = item;\n if (Object(esm[\"isString\"])(item)) nodeItem = this.findById(item);\n\n if (!nodeItem && Object(esm[\"isString\"])(item)) {\n console.warn('The item to be removed does not exist!');\n } else if (nodeItem) {\n var type = '';\n if (nodeItem.getType) type = nodeItem.getType(); // 将删除的元素入栈\n\n if (stack && this.get('enabledStack')) {\n var deletedModel = Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, nodeItem.getModel()), {\n itemType: type\n });\n\n var before = {};\n\n switch (type) {\n case 'node':\n {\n before.nodes = [deletedModel];\n before.edges = [];\n var edges = nodeItem.getEdges();\n\n for (var i = edges.length - 1; i >= 0; i--) {\n before.edges.push(Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, edges[i].getModel()), {\n itemType: 'edge'\n }));\n }\n\n break;\n }\n\n case 'edge':\n before.edges = [deletedModel];\n break;\n\n case 'combo':\n before.combos = [deletedModel];\n break;\n\n default:\n break;\n }\n\n this.pushStack('delete', {\n before: before,\n after: {}\n });\n }\n\n if (type === 'node') {\n var model = nodeItem.getModel(); // 如果删除的是节点,且该节点存在于某个 Combo 中,则需要先将 node 从 combo 中移除,否则删除节点后,操作 combo 会出错\n\n if (model.comboId) {\n this.updateComboTree(nodeItem, undefined, false);\n }\n }\n\n var itemController = this.get('itemController');\n itemController.removeItem(nodeItem);\n\n if (type === 'combo') {\n var newComboTrees = reconstructTree(this.get('comboTrees'));\n this.set('comboTrees', newComboTrees);\n }\n }\n };\n /**\n * 新增元素\n * @param {ITEM_TYPE} type 元素类型(node | edge)\n * @param {ModelConfig} model 元素数据模型\n * @param {boolean} stack 本次操作是否入栈,默认为 true\n * @param {boolean} sortCombo 本次操作是否需要更新 combo 层级顺序,内部参数,用户在外部使用 addItem 时始终时需要更新\n * @return {Item} 元素实例\n */\n\n\n AbstractGraph.prototype.addItem = function (type, model, stack, sortCombo) {\n if (stack === void 0) {\n stack = true;\n }\n\n if (sortCombo === void 0) {\n sortCombo = true;\n }\n\n var currentComboSorted = this.get('comboSorted');\n this.set('comboSorted', currentComboSorted && !sortCombo);\n var itemController = this.get('itemController'); // 添加节点、边或combo之前,先验证数据是否符合规范\n\n if (!validation_singleDataValidation(type, model)) {\n return false;\n }\n\n if (model.id && this.findById(model.id)) {\n console.warn(\"This item exists already. Be sure the id %c\" + model.id + \"%c is unique.\", 'font-size: 20px; color: red;', '');\n return;\n }\n\n var item;\n var comboTrees = this.get('comboTrees');\n if (!comboTrees) comboTrees = [];\n\n if (type === 'combo') {\n var itemMap_1 = this.get('itemMap');\n var foundParent_1 = false;\n comboTrees.forEach(function (ctree) {\n if (foundParent_1) return; // terminate the forEach after the tree containing the item is done\n\n traverseTreeUp(ctree, function (child) {\n // find the parent\n if (model.parentId === child.id) {\n foundParent_1 = true;\n\n var newCombo = Object(tslib_es6[\"__assign\"])({\n id: model.id,\n depth: child.depth + 2\n }, model);\n\n if (child.children) child.children.push(newCombo);else child.children = [newCombo];\n model.depth = newCombo.depth;\n item = itemController.addItem(type, model);\n }\n\n var childItem = itemMap_1[child.id]; // after the parent is found, update all the ancestors\n\n if (foundParent_1 && childItem && childItem.getType && childItem.getType() === 'combo') {\n itemController.updateCombo(childItem, child.children);\n }\n\n return true;\n });\n }); // if the parent is not found, add it to the root\n\n if (!foundParent_1) {\n var newCombo = Object(tslib_es6[\"__assign\"])({\n id: model.id,\n depth: 0\n }, model);\n\n model.depth = newCombo.depth;\n comboTrees.push(newCombo);\n item = itemController.addItem(type, model);\n }\n\n this.set('comboTrees', comboTrees);\n } else if (type === 'node' && Object(esm[\"isString\"])(model.comboId) && comboTrees) {\n var parentCombo = this.findById(model.comboId);\n\n if (parentCombo && parentCombo.getType && parentCombo.getType() !== 'combo') {\n console.warn(\"'\" + model.comboId + \"' is not a id of a combo in the graph, the node will be added without combo.\");\n }\n\n item = itemController.addItem(type, model);\n var itemMap_2 = this.get('itemMap');\n var foundParent_2 = false,\n foundNode_1 = false;\n (comboTrees || []).forEach(function (ctree) {\n if (foundNode_1 || foundParent_2) return; // terminate the forEach\n\n traverseTreeUp(ctree, function (child) {\n if (child.id === model.id) {\n // if the item exists in the tree already, terminate\n foundNode_1 = true;\n return false;\n }\n\n if (model.comboId === child.id && !foundNode_1) {\n // found the parent, add the item to the children of its parent in the tree\n foundParent_2 = true;\n var cloneNode = Object(esm[\"clone\"])(model);\n cloneNode.itemType = 'node';\n if (child.children) child.children.push(cloneNode);else child.children = [cloneNode];\n cloneNode.depth = child.depth + 1;\n } // update the size of all the ancestors\n\n\n if (foundParent_2 && itemMap_2[child.id].getType && itemMap_2[child.id].getType() === 'combo') {\n itemController.updateCombo(itemMap_2[child.id], child.children);\n }\n\n return true;\n });\n });\n } else {\n item = itemController.addItem(type, model);\n }\n\n if (type === 'node' && model.comboId || type === 'combo' && model.parentId) {\n // add the combo to the parent's children array\n var parentCombo = this.findById(model.comboId || model.parentId);\n if (parentCombo && parentCombo.getType && parentCombo.getType() === 'combo') parentCombo.addChild(item);\n }\n\n var combos = this.get('combos');\n\n if (combos && combos.length > 0) {\n this.sortCombos();\n }\n\n this.autoPaint();\n\n if (stack && this.get('enabledStack')) {\n var addedModel = Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, item.getModel()), {\n itemType: type\n });\n\n var after = {};\n\n switch (type) {\n case 'node':\n after.nodes = [addedModel];\n break;\n\n case 'edge':\n after.edges = [addedModel];\n break;\n\n case 'combo':\n after.combos = [addedModel];\n break;\n\n default:\n break;\n }\n\n this.pushStack('add', {\n before: {},\n after: after\n });\n }\n\n return item;\n };\n /**\n * 新增元素\n * @param {ITEM_TYPE} type 元素类型(node | edge)\n * @param {ModelConfig} model 元素数据模型\n * @param {boolean} stack 本次操作是否入栈,默认为 true\n * @return {Item} 元素实例\n */\n\n\n AbstractGraph.prototype.add = function (type, model, stack, sortCombo) {\n if (stack === void 0) {\n stack = true;\n }\n\n if (sortCombo === void 0) {\n sortCombo = true;\n }\n\n return this.addItem(type, model, stack, sortCombo);\n };\n /**\n * 更新元素\n * @param {Item} item 元素id或元素实例\n * @param {Partial | EdgeConfig} cfg 需要更新的数据\n */\n\n\n AbstractGraph.prototype.updateItem = function (item, cfg, stack) {\n var _this = this;\n\n if (stack === void 0) {\n stack = true;\n }\n\n var itemController = this.get('itemController');\n var currentItem;\n\n if (Object(esm[\"isString\"])(item)) {\n currentItem = this.findById(item);\n } else {\n currentItem = item;\n }\n\n var UnupdateModel = Object(esm[\"clone\"])(currentItem.getModel());\n var type = '';\n if (currentItem.getType) type = currentItem.getType();\n\n var states = Object(tslib_es6[\"__spreadArray\"])([], currentItem.getStates(), true);\n\n if (type === 'combo') {\n Object(esm[\"each\"])(states, function (state) {\n return _this.setItemState(currentItem, state, false);\n });\n }\n\n itemController.updateItem(currentItem, cfg);\n\n if (type === 'combo') {\n Object(esm[\"each\"])(states, function (state) {\n return _this.setItemState(currentItem, state, true);\n });\n }\n\n if (stack && this.get('enabledStack')) {\n var before = {\n nodes: [],\n edges: [],\n combos: []\n };\n var after = {\n nodes: [],\n edges: [],\n combos: []\n };\n\n var afterModel = Object(tslib_es6[\"__assign\"])({\n id: UnupdateModel.id\n }, cfg);\n\n switch (type) {\n case 'node':\n before.nodes.push(UnupdateModel);\n after.nodes.push(afterModel);\n break;\n\n case 'edge':\n before.edges.push(UnupdateModel);\n after.edges.push(afterModel);\n break;\n\n case 'combo':\n before.combos.push(UnupdateModel);\n after.combos.push(afterModel);\n break;\n\n default:\n break;\n }\n\n if (type === 'node') {\n before.nodes.push(UnupdateModel);\n }\n\n this.pushStack('update', {\n before: before,\n after: after\n });\n }\n };\n /**\n * 更新元素\n * @param {Item} item 元素id或元素实例\n * @param {Partial | EdgeConfig} cfg 需要更新的数据\n * @param {boolean} stack 本次操作是否入栈,默认为 true\n */\n\n\n AbstractGraph.prototype.update = function (item, cfg, stack) {\n if (stack === void 0) {\n stack = true;\n }\n\n this.updateItem(item, cfg, stack);\n };\n /**\n * 设置元素状态\n * @param {Item} item 元素id或元素实例\n * @param {string} state 状态名称\n * @param {string | boolean} value 是否启用状态 或 状态值\n */\n\n\n AbstractGraph.prototype.setItemState = function (item, state, value) {\n if (Object(esm[\"isString\"])(item)) {\n item = this.findById(item);\n }\n\n var itemController = this.get('itemController');\n itemController.setItemState(item, state, value);\n var stateController = this.get('stateController');\n\n if (Object(esm[\"isString\"])(value)) {\n stateController.updateState(item, state + \":\" + value, true);\n } else {\n stateController.updateState(item, state, value);\n }\n };\n /**\n * 将指定状态的优先级提升为最高优先级\n * @param {Item} item 元素id或元素实例\n * @param state 状态名称\n */\n\n\n AbstractGraph.prototype.priorityState = function (item, state) {\n var itemController = this.get('itemController');\n itemController.priorityState(item, state);\n };\n /**\n * 设置视图初始化数据\n * @param {GraphData} data 初始化数据\n */\n\n\n AbstractGraph.prototype.data = function (data) {\n validation_dataValidation(data);\n this.set('data', data);\n };\n /**\n * 根据data接口的数据渲染视图\n */\n\n\n AbstractGraph.prototype.render = function () {\n var self = this;\n this.set('comboSorted', false);\n var data = this.get('data');\n\n if (this.get('enabledStack')) {\n // render 之前清空 redo 和 undo 栈\n this.clearStack();\n }\n\n if (!data) {\n throw new Error('data must be defined first');\n }\n\n var _a = data.nodes,\n nodes = _a === void 0 ? [] : _a,\n _b = data.edges,\n edges = _b === void 0 ? [] : _b,\n _c = data.combos,\n combos = _c === void 0 ? [] : _c;\n this.clear(true);\n this.emit('beforerender');\n Object(esm[\"each\"])(nodes, function (node) {\n self.add('node', node, false, false);\n }); // process the data to tree structure\n\n if (combos && combos.length !== 0) {\n var comboTrees = graphic_plainCombosToTrees(combos, nodes);\n this.set('comboTrees', comboTrees); // add combos\n\n self.addCombos(combos);\n }\n\n Object(esm[\"each\"])(edges, function (edge) {\n self.add('edge', edge, false, false);\n });\n var animate = self.get('animate');\n\n if (self.get('fitView') || self.get('fitCenter')) {\n self.set('animate', false);\n } // layout\n\n\n var layoutController = self.get('layoutController');\n\n if (layoutController) {\n layoutController.layout(success);\n if (this.destroyed) return;\n } else {\n if (self.get('fitView')) {\n self.fitView();\n }\n\n if (self.get('fitCenter')) {\n self.fitCenter();\n }\n\n self.emit('afterrender');\n self.set('animate', animate);\n } // 将在 onLayoutEnd 中被调用\n\n\n function success() {\n // fitView 与 fitCenter 共存时,fitView 优先,fitCenter 不再执行\n if (self.get('fitView')) {\n self.fitView();\n } else if (self.get('fitCenter')) {\n self.fitCenter();\n }\n\n self.autoPaint();\n self.emit('afterrender');\n\n if (self.get('fitView') || self.get('fitCenter')) {\n self.set('animate', animate);\n }\n }\n\n if (!this.get('groupByTypes')) {\n if (combos && combos.length !== 0) {\n this.sortCombos();\n } else {\n // 为提升性能,选择数量少的进行操作\n if (data.nodes && data.edges && data.nodes.length < data.edges.length) {\n var nodesArr = this.getNodes(); // 遍历节点实例,将所有节点提前。\n\n nodesArr.forEach(function (node) {\n node.toFront();\n });\n } else {\n var edgesArr = this.getEdges(); // 遍历节点实例,将所有节点提前。\n\n edgesArr.forEach(function (edge) {\n edge.toBack();\n });\n }\n }\n }\n\n if (this.get('enabledStack')) {\n this.pushStack('render');\n }\n };\n /**\n * 接收数据进行渲染\n * @Param {Object} data 初始化数据\n */\n\n\n AbstractGraph.prototype.read = function (data) {\n this.data(data);\n this.render();\n }; // 比较item\n\n\n AbstractGraph.prototype.diffItems = function (type, items, models) {\n var self = this;\n var item;\n var itemMap = this.get('itemMap');\n Object(esm[\"each\"])(models, function (model) {\n item = itemMap[model.id];\n\n if (item) {\n if (self.get('animate') && type === graph_NODE) {\n var containerMatrix = item.getContainer().getMatrix();\n if (!containerMatrix) containerMatrix = [1, 0, 0, 0, 1, 0, 0, 0, 1];\n item.set('originAttrs', {\n x: containerMatrix[6],\n y: containerMatrix[7]\n });\n }\n\n self.updateItem(item, model, false);\n } else {\n item = self.addItem(type, model, false);\n }\n\n if (item) items[type + \"s\"].push(item);\n });\n };\n /**\n * 更改源数据,根据新数据重新渲染视图\n * @param {GraphData | TreeGraphData} data 源数据\n * @param {boolean} 是否入栈,默认为true\n * @return {object} this\n */\n\n\n AbstractGraph.prototype.changeData = function (data, stack) {\n if (stack === void 0) {\n stack = true;\n }\n\n var self = this;\n\n if (!validation_dataValidation(data)) {\n return this;\n }\n\n if (stack && this.get('enabledStack')) {\n this.pushStack('changedata', {\n before: self.save(),\n after: data\n });\n }\n\n this.set('comboSorted', false); // 删除 hulls\n\n this.removeHulls(); // 更改数据源后,取消所有状态\n\n this.getNodes().map(function (node) {\n return self.clearItemStates(node);\n });\n this.getEdges().map(function (edge) {\n return self.clearItemStates(edge);\n });\n var canvas = this.get('canvas');\n var localRefresh = canvas.get('localRefresh');\n canvas.set('localRefresh', false);\n\n if (!self.get('data')) {\n self.data(data);\n self.render();\n }\n\n var itemMap = this.get('itemMap');\n var items = {\n nodes: [],\n edges: []\n };\n var combosData = data.combos;\n\n if (combosData) {\n var comboTrees = graphic_plainCombosToTrees(combosData, data.nodes);\n this.set('comboTrees', comboTrees);\n } else {\n this.set('comboTrees', []);\n }\n\n this.diffItems('node', items, data.nodes);\n Object(esm[\"each\"])(itemMap, function (item, id) {\n itemMap[id].getModel().depth = 0;\n if (item.getType && item.getType() === 'edge') return;\n\n if (item.getType && item.getType() === 'combo') {\n delete itemMap[id];\n item.destroy();\n } else if (items.nodes.indexOf(item) < 0) {\n delete itemMap[id];\n self.remove(item, false);\n }\n }); // clear the destroyed combos here to avoid removing sub nodes before removing the parent combo\n\n var comboItems = this.getCombos();\n var combosLength = comboItems.length;\n\n for (var i = combosLength - 1; i >= 0; i--) {\n if (comboItems[i].destroyed) {\n comboItems.splice(i, 1);\n }\n } // process the data to tree structure\n\n\n if (combosData) {\n // add combos\n self.addCombos(combosData);\n\n if (!this.get('groupByTypes')) {\n this.sortCombos();\n }\n }\n\n this.diffItems('edge', items, data.edges);\n Object(esm[\"each\"])(itemMap, function (item, id) {\n if (item.getType && (item.getType() === 'node' || item.getType() === 'combo')) return;\n\n if (items.edges.indexOf(item) < 0) {\n delete itemMap[id];\n self.remove(item, false);\n }\n });\n this.set({\n nodes: items.nodes,\n edges: items.edges\n });\n var layoutController = this.get('layoutController');\n\n if (layoutController) {\n layoutController.changeData();\n\n if (self.get('animate') && !layoutController.getLayoutType()) {\n // 如果没有指定布局\n self.positionsAnimate();\n } else {\n self.autoPaint();\n }\n }\n\n setTimeout(function () {\n canvas.set('localRefresh', localRefresh);\n }, 16);\n return this;\n };\n /**\n * 私有方法,在 render 和 changeData 的时候批量添加数据中所有平铺的 combos\n * @param {ComboConfig[]} combos 平铺的 combos 数据\n */\n\n\n AbstractGraph.prototype.addCombos = function (combos) {\n var self = this;\n var comboTrees = self.get('comboTrees');\n var itemController = this.get('itemController');\n itemController.addCombos(comboTrees, combos);\n };\n /**\n * 根据已经存在的节点或 combo 创建新的 combo\n * @param combo combo ID 或 Combo 配置\n * @param children 添加到 Combo 中的元素,包括节点和 combo\n */\n\n\n AbstractGraph.prototype.createCombo = function (combo, children) {\n var _this = this;\n\n this.set('comboSorted', false); // step 1: 创建新的 Combo\n\n var comboId = '';\n var comboConfig;\n if (!combo) return;\n\n if (Object(esm[\"isString\"])(combo)) {\n comboId = combo;\n comboConfig = {\n id: combo\n };\n } else {\n comboId = combo.id;\n\n if (!comboId) {\n console.warn('Create combo failed. Please assign a unique string id for the adding combo.');\n return;\n }\n\n comboConfig = combo;\n } // step2: 更新 children,根据类型添加 comboId 或 parentId\n\n\n var trees = children.map(function (elementId) {\n var item = _this.findById(elementId);\n\n var model = item.getModel();\n var type = '';\n if (item.getType) type = item.getType();\n var cItem = {\n id: item.getID(),\n itemType: type\n };\n\n if (type === 'combo') {\n cItem.parentId = comboId;\n model.parentId = comboId;\n } else if (type === 'node') {\n cItem.comboId = comboId;\n model.comboId = comboId;\n }\n\n return cItem;\n });\n comboConfig.children = trees; // step 3: 添加 Combo,addItem 时会将子将元素添加到 Combo 中\n\n this.addItem('combo', comboConfig, false);\n this.set('comboSorted', false); // step4: 更新 comboTrees 结构\n\n var comboTrees = this.get('comboTrees');\n (comboTrees || []).forEach(function (ctree) {\n traverseTreeUp(ctree, function (child) {\n if (child.id === comboId) {\n child.itemType = 'combo';\n child.children = trees;\n return false;\n }\n\n return true;\n });\n });\n\n if (comboTrees) {\n this.sortCombos();\n }\n };\n /**\n * 解散 combo\n * @param {String | INode | ICombo} combo 需要被解散的 Combo item 或 id\n */\n\n\n AbstractGraph.prototype.uncombo = function (combo) {\n var _this = this;\n\n var _a;\n\n var self = this;\n var comboItem = combo;\n\n if (Object(esm[\"isString\"])(combo)) {\n comboItem = this.findById(combo);\n }\n\n if (!comboItem || comboItem.getType && comboItem.getType() !== 'combo') {\n console.warn('The item is not a combo!');\n return;\n }\n\n var parentId = comboItem.getModel().parentId;\n var comboTrees = self.get('comboTrees');\n if (!comboTrees) comboTrees = [];\n var itemMap = this.get('itemMap');\n var comboId = comboItem.get('id');\n var treeToBeUncombo;\n var brothers = [];\n var comboItems = this.get('combos');\n var parentItem = this.findById(parentId);\n comboTrees.forEach(function (ctree) {\n if (treeToBeUncombo) return; // terminate the forEach\n\n traverseTreeUp(ctree, function (subtree) {\n var _a; // find the combo to be uncomboed, delete the combo from map and cache\n\n\n if (subtree.id === comboId) {\n treeToBeUncombo = subtree; // delete the related edges\n\n var edges = comboItem.getEdges();\n edges.forEach(function (edge) {\n _this.removeItem(edge, false);\n });\n var index = comboItems.indexOf(comboItem);\n comboItems.splice(index, 1);\n delete itemMap[comboId];\n comboItem.destroy();\n\n _this.emit('afterremoveitem', {\n item: comboItem\n });\n } // find the parent to remove the combo from the combo's brothers array and add the combo's children to the combo's brothers array in the tree\n\n\n if (parentId && treeToBeUncombo && subtree.id === parentId) {\n parentItem.removeCombo(comboItem);\n brothers = subtree.children; // the combo's brothers\n // remove the combo from its brothers array\n\n var index = brothers.indexOf(treeToBeUncombo);\n\n if (index !== -1) {\n brothers.splice(index, 1);\n } // append the combo's children to the combo's brothers array\n\n\n (_a = treeToBeUncombo.children) === null || _a === void 0 ? void 0 : _a.forEach(function (child) {\n var item = _this.findById(child.id);\n\n var childModel = item.getModel();\n\n if (item.getType && item.getType() === 'combo') {\n child.parentId = parentId;\n delete child.comboId;\n childModel.parentId = parentId; // update the parentId of the model\n\n delete childModel.comboId;\n } else if (item.getType && item.getType() === 'node') {\n child.comboId = parentId;\n childModel.comboId = parentId; // update the parentId of the model\n }\n\n parentItem.addChild(item);\n brothers.push(child);\n });\n return false;\n }\n\n return true;\n });\n }); // if the parentId is not found, remove the combo from the roots\n\n if (!parentId && treeToBeUncombo) {\n var index = comboTrees.indexOf(treeToBeUncombo);\n comboTrees.splice(index, 1); // modify the parentId of the children\n\n (_a = treeToBeUncombo.children) === null || _a === void 0 ? void 0 : _a.forEach(function (child) {\n child.parentId = undefined;\n\n var childModel = _this.findById(child.id).getModel();\n\n delete childModel.parentId; // update the parentId of the model\n\n delete childModel.comboId; // update the comboId of the model\n\n if (child.itemType !== 'node') comboTrees.push(child);\n });\n }\n };\n /**\n * 根据节点的 bbox 更新所有 combos 的绘制,包括 combos 的位置和范围\n */\n\n\n AbstractGraph.prototype.updateCombos = function () {\n var _this = this;\n\n var self = this;\n var comboTrees = this.get('comboTrees');\n var itemController = self.get('itemController');\n var itemMap = self.get('itemMap');\n (comboTrees || []).forEach(function (ctree) {\n traverseTreeUp(ctree, function (child) {\n if (!child) {\n return true;\n }\n\n var childItem = itemMap[child.id];\n\n if (childItem && childItem.getType && childItem.getType() === 'combo') {\n // 更新具体的 Combo 之前先清除所有的已有状态,以免将 state 中的样式更新为 Combo 的样式\n var states = Object(tslib_es6[\"__spreadArray\"])([], childItem.getStates(), true);\n\n Object(esm[\"each\"])(states, function (state) {\n return _this.setItemState(childItem, state, false);\n }); // 更新具体的 Combo\n\n itemController.updateCombo(childItem, child.children); // 更新 Combo 后,还原已有的状态\n\n Object(esm[\"each\"])(states, function (state) {\n return _this.setItemState(childItem, state, true);\n });\n }\n\n return true;\n });\n });\n self.sortCombos();\n };\n /**\n * 根据节点的 bbox 更新 combo 及其祖先 combos 的绘制,包括 combos 的位置和范围\n * @param {String | ICombo} combo 需要被更新的 Combo 或 id,若指定,则该 Combo 及所有祖先 Combod 都会被更新\n */\n\n\n AbstractGraph.prototype.updateCombo = function (combo) {\n var _this = this;\n\n var self = this;\n var comboItem = combo;\n var comboId;\n\n if (Object(esm[\"isString\"])(combo)) {\n comboItem = this.findById(combo);\n }\n\n if (!comboItem || comboItem.getType && comboItem.getType() !== 'combo') {\n console.warn('The item to be updated is not a combo!');\n return;\n }\n\n comboId = comboItem.get('id');\n var comboTrees = this.get('comboTrees');\n var itemController = self.get('itemController');\n var itemMap = self.get('itemMap');\n (comboTrees || []).forEach(function (ctree) {\n traverseTreeUp(ctree, function (child) {\n if (!child) {\n return true;\n }\n\n var childItem = itemMap[child.id];\n\n if (comboId === child.id && childItem && childItem.getType && childItem.getType() === 'combo') {\n // 更新具体的 Combo 之前先清除所有的已有状态,以免将 state 中的样式更新为 Combo 的样式\n var states = Object(tslib_es6[\"__spreadArray\"])([], childItem.getStates(), true); // || !item.getStateStyle(stateName)\n\n\n Object(esm[\"each\"])(states, function (state) {\n if (childItem.getStateStyle(state)) {\n _this.setItemState(childItem, state, false);\n }\n }); // 更新具体的 Combo\n\n itemController.updateCombo(childItem, child.children); // 更新 Combo 后,还原已有的状态\n\n Object(esm[\"each\"])(states, function (state) {\n if (childItem.getStateStyle(state)) {\n _this.setItemState(childItem, state, true);\n }\n });\n if (comboId) comboId = child.parentId;\n }\n\n return true;\n });\n });\n };\n /**\n * 更新树结构,例如移动子树等\n * @param {String | INode | ICombo} item 需要被更新的 Combo 或 节点 id\n * @param {string | undefined} parentId 新的父 combo id,undefined 代表没有父 combo\n */\n\n\n AbstractGraph.prototype.updateComboTree = function (item, parentId, stack) {\n if (stack === void 0) {\n stack = true;\n }\n\n var self = this;\n this.set('comboSorted', false);\n var uItem;\n\n if (Object(esm[\"isString\"])(item)) {\n uItem = self.findById(item);\n } else {\n uItem = item;\n }\n\n var model = uItem.getModel();\n var oldParentId = model.comboId || model.parentId;\n var type = '';\n if (uItem.getType) type = uItem.getType(); // 若 item 是 Combo,且 parentId 是其子孙 combo 的 id,则警告并终止\n\n if (parentId && type === 'combo') {\n var comboTrees = this.get('comboTrees');\n var valid_1 = true;\n var itemSubTree_1;\n (comboTrees || []).forEach(function (ctree) {\n if (itemSubTree_1) return;\n traverseTree(ctree, function (subTree) {\n if (itemSubTree_1) return; // 找到从 item 开始的子树\n\n if (subTree.id === uItem.getID()) {\n itemSubTree_1 = subTree;\n }\n\n return true;\n });\n }); // 在以 item 为根的子树中寻找与 parentId 相同的后继元素\n\n traverseTree(itemSubTree_1, function (subTree) {\n if (subTree.id === parentId) {\n valid_1 = false;\n return false;\n }\n\n return true;\n }); // parentId 是 item 的一个后继元素,不能进行更新\n\n if (!valid_1) {\n console.warn('Failed to update the combo tree! The parentId points to a descendant of the combo!');\n return;\n }\n }\n\n if (stack && this.get('enabledStack')) {\n var beforeData = {},\n afterData = {};\n\n if (type === 'combo') {\n beforeData.combos = [{\n id: model.id,\n parentId: model.parentId\n }];\n afterData.combos = [{\n id: model.id,\n parentId: parentId\n }];\n } else if (type === 'node') {\n beforeData.nodes = [{\n id: model.id,\n parentId: model.comboId\n }];\n afterData.nodes = [{\n id: model.id,\n parentId: parentId\n }];\n }\n\n this.pushStack('updateComboTree', {\n before: beforeData,\n after: afterData\n });\n } // 当 combo 存在 parentId 或 comboId 时,才将其移除\n\n\n if (model.parentId || model.comboId) {\n var combo = this.findById(model.parentId || model.comboId);\n\n if (combo) {\n combo.removeChild(uItem);\n }\n }\n\n if (type === 'combo') {\n model.parentId = parentId;\n } else if (type === 'node') {\n model.comboId = parentId;\n } // 只有当移入到指定 combo 时才添加\n\n\n if (parentId) {\n var parentCombo = this.findById(parentId);\n\n if (parentCombo) {\n // 将元素添加到 parentCombo 中\n parentCombo.addChild(uItem);\n }\n } // 如果原先有父亲 combo,则从原父 combo 的子元素数组中删除\n\n\n if (oldParentId) {\n var parentCombo = this.findById(oldParentId);\n\n if (parentCombo) {\n // 将元素从 parentCombo 中移除\n parentCombo.removeChild(uItem);\n }\n }\n\n var newComboTrees = reconstructTree(this.get('comboTrees'), model.id, parentId);\n this.set('comboTrees', newComboTrees);\n this.updateCombos();\n };\n /**\n * 导出图数据\n * @return {object} data\n */\n\n\n AbstractGraph.prototype.save = function () {\n var nodes = [];\n var edges = [];\n var combos = [];\n Object(esm[\"each\"])(this.get('nodes'), function (node) {\n nodes.push(node.getModel());\n });\n Object(esm[\"each\"])(this.get('edges'), function (edge) {\n edges.push(edge.getModel());\n });\n Object(esm[\"each\"])(this.get('combos'), function (combo) {\n combos.push(combo.getModel());\n });\n return {\n nodes: nodes,\n edges: edges,\n combos: combos\n };\n };\n /**\n * 改变画布大小\n * @param {number} width 画布宽度\n * @param {number} height 画布高度\n * @return {object} this\n */\n\n\n AbstractGraph.prototype.changeSize = function (width, height) {\n var viewController = this.get('viewController');\n viewController.changeSize(width, height);\n return this;\n };\n /**\n * 当源数据在外部发生变更时,根据新数据刷新视图。但是不刷新节点位置\n */\n\n\n AbstractGraph.prototype.refresh = function () {\n var self = this;\n self.emit('beforegraphrefresh');\n\n if (self.get('animate')) {\n self.positionsAnimate();\n } else {\n var nodes = self.get('nodes');\n var edges = self.get('edges');\n var vedges = self.get('edges');\n Object(esm[\"each\"])(nodes, function (node) {\n node.refresh();\n });\n Object(esm[\"each\"])(edges, function (edge) {\n edge.refresh();\n });\n Object(esm[\"each\"])(vedges, function (vedge) {\n vedge.refresh();\n });\n }\n\n self.emit('aftergraphrefresh');\n self.autoPaint();\n };\n /**\n * 获取当前图中所有节点的item实例\n * @return {INode} item数组\n */\n\n\n AbstractGraph.prototype.getNodes = function () {\n return this.get('nodes');\n };\n /**\n * 获取当前图中所有边的item实例\n * @return {IEdge} item数组\n */\n\n\n AbstractGraph.prototype.getEdges = function () {\n return this.get('edges');\n };\n /**\n * 获取图中所有的 combo 实例\n */\n\n\n AbstractGraph.prototype.getCombos = function () {\n return this.get('combos');\n };\n /**\n * 获取指定 Combo 中所有的节点\n * @param comboId combo ID\n */\n\n\n AbstractGraph.prototype.getComboChildren = function (combo) {\n if (Object(esm[\"isString\"])(combo)) {\n combo = this.findById(combo);\n }\n\n if (!combo || combo.getType && combo.getType() !== 'combo') {\n console.warn('The combo does not exist!');\n return;\n }\n\n return combo.getChildren();\n };\n /**\n * 根据 graph 上的 animateCfg 进行视图中节点位置动画接口\n */\n\n\n AbstractGraph.prototype.positionsAnimate = function () {\n var self = this;\n self.emit('beforeanimate');\n var animateCfg = self.get('animateCfg');\n var onFrame = animateCfg.onFrame;\n var nodes = self.getNodes();\n var toNodes = nodes.map(function (node) {\n var model = node.getModel();\n return {\n id: model.id,\n x: model.x,\n y: model.y\n };\n });\n\n if (self.isAnimating()) {\n self.stopAnimate();\n }\n\n var canvas = self.get('canvas');\n canvas.animate(function (ratio) {\n Object(esm[\"each\"])(toNodes, function (data) {\n var node = self.findById(data.id);\n\n if (!node || node.destroyed) {\n return;\n }\n\n var originAttrs = node.get('originAttrs');\n var model = node.get('model');\n\n if (!originAttrs) {\n var containerMatrix = node.getContainer().getMatrix();\n if (!containerMatrix) containerMatrix = [1, 0, 0, 0, 1, 0, 0, 0, 1];\n originAttrs = {\n x: containerMatrix[6],\n y: containerMatrix[7]\n };\n node.set('originAttrs', originAttrs);\n }\n\n if (onFrame) {\n var attrs = onFrame(node, ratio, data, originAttrs);\n node.set('model', Object.assign(model, attrs));\n } else {\n model.x = originAttrs.x + (data.x - originAttrs.x) * ratio;\n model.y = originAttrs.y + (data.y - originAttrs.y) * ratio;\n }\n });\n self.refreshPositions();\n }, {\n duration: animateCfg.duration,\n easing: animateCfg.easing,\n callback: function callback() {\n Object(esm[\"each\"])(nodes, function (node) {\n node.set('originAttrs', null);\n });\n\n if (animateCfg.callback) {\n animateCfg.callback();\n }\n\n self.emit('afteranimate');\n self.animating = false;\n }\n });\n };\n /**\n * 当节点位置在外部发生改变时,刷新所有节点位置,重计算边\n */\n\n\n AbstractGraph.prototype.refreshPositions = function () {\n var self = this;\n self.emit('beforegraphrefreshposition');\n var nodes = self.get('nodes');\n var edges = self.get('edges');\n var vedges = self.get('vedges');\n var combos = self.get('combos');\n var model;\n var updatedNodes = {};\n Object(esm[\"each\"])(nodes, function (node) {\n model = node.getModel();\n var originAttrs = node.get('originAttrs');\n\n if (originAttrs && model.x === originAttrs.x && model.y === originAttrs.y) {\n return;\n }\n\n var changed = node.updatePosition({\n x: model.x,\n y: model.y\n });\n updatedNodes[model.id] = changed;\n if (model.comboId) updatedNodes[model.comboId] = updatedNodes[model.comboId] || changed;\n });\n\n if (combos && combos.length !== 0) {\n self.updateCombos();\n }\n\n Object(esm[\"each\"])(edges, function (edge) {\n var sourceModel = edge.getSource().getModel();\n var target = edge.getTarget(); // 避免 target 是纯对象的情况下调用 getModel 方法\n // 拖动生成边的时候 target 会是纯对象\n\n if (!Object(esm[\"isPlainObject\"])(target)) {\n var targetModel = target.getModel();\n\n if (updatedNodes[sourceModel.id] || updatedNodes[targetModel.id] || edge.getModel().isComboEdge) {\n edge.refresh();\n }\n }\n });\n Object(esm[\"each\"])(vedges, function (vedge) {\n vedge.refresh();\n });\n self.emit('aftergraphrefreshposition');\n self.autoPaint();\n };\n\n AbstractGraph.prototype.stopAnimate = function () {\n this.get('canvas').stopAnimate();\n };\n\n AbstractGraph.prototype.isAnimating = function () {\n return this.animating;\n };\n /**\n * 获取当前视口伸缩比例\n * @return {number} 比例\n */\n\n\n AbstractGraph.prototype.getZoom = function () {\n var matrix = this.get('group').getMatrix();\n return matrix ? matrix[0] : 1;\n };\n /**\n * 获取当前的行为模式\n * @return {string} 当前行为模式\n */\n\n\n AbstractGraph.prototype.getCurrentMode = function () {\n var modeController = this.get('modeController');\n return modeController.getMode();\n };\n /**\n * 切换行为模式\n * @param {string} mode 指定模式\n * @return {object} this\n */\n\n\n AbstractGraph.prototype.setMode = function (mode) {\n var modeController = this.get('modeController');\n modeController.setMode(mode);\n return this;\n };\n /**\n * 清除画布元素\n * @return {object} this\n */\n\n\n AbstractGraph.prototype.clear = function (avoidEmit) {\n var _a;\n\n if (avoidEmit === void 0) {\n avoidEmit = false;\n }\n\n (_a = this.get('canvas')) === null || _a === void 0 ? void 0 : _a.clear();\n this.initGroups(); // 清空画布时同时清除数据\n\n this.set({\n itemMap: {},\n nodes: [],\n edges: [],\n groups: [],\n combos: [],\n comboTrees: []\n });\n if (!avoidEmit) this.emit('afterrender');\n return this;\n };\n /**\n * 更换布局配置项\n * @param {object} cfg 新布局配置项\n * @param {'center' | 'begin'} align 对齐方式,可选中心(center)对齐到对齐点,或左上角(begin)对齐到对齐点\n * @param {IPoint} alignPoint 画布上的对齐点,为 Canvas 坐标系(Canvas DOM)\n * 若 cfg 含有 type 字段或为 String 类型,且与现有布局方法不同,则更换布局\n * 若 cfg 不包括 type ,则保持原有布局方法,仅更新布局配置项\n */\n\n\n AbstractGraph.prototype.updateLayout = function (cfg, align, alignPoint) {\n var _this = this;\n\n var layoutController = this.get('layoutController');\n\n if (Object(esm[\"isString\"])(cfg)) {\n cfg = {\n type: cfg\n };\n } // align the graph after layout\n\n\n if (align) {\n var toPoint_1 = alignPoint;\n\n if (!toPoint_1) {\n if (align === 'begin') toPoint_1 = {\n x: 0,\n y: 0\n };else toPoint_1 = {\n x: this.getWidth() / 2,\n y: this.getHeight() / 2\n };\n } // translate to point coordinate system\n\n\n toPoint_1 = this.getPointByCanvas(toPoint_1.x, toPoint_1.y);\n var forceTypes = ['force', 'gForce', 'fruchterman']; // if it is force layout, only center takes effect, and assign center force\n\n if (forceTypes.includes(cfg.type) || !cfg.type && forceTypes.includes(layoutController === null || layoutController === void 0 ? void 0 : layoutController.layoutType)) {\n cfg.center = [toPoint_1.x, toPoint_1.y];\n } else {\n this.once('afterlayout', function (e) {\n var matrix = _this.getGroup().getMatrix() || [1, 0, 0, 0, 1, 0, 0, 0, 1];\n toPoint_1.x = toPoint_1.x * matrix[0] + matrix[6];\n toPoint_1.y = toPoint_1.y * matrix[0] + matrix[7];\n\n var _a = _this.getGroup().getCanvasBBox(),\n minX = _a.minX,\n maxX = _a.maxX,\n minY = _a.minY,\n maxY = _a.maxY;\n\n var bboxPoint = {\n x: (minX + maxX) / 2,\n y: (minY + maxY) / 2\n };\n\n if (align === 'begin') {\n bboxPoint.x = minX;\n bboxPoint.y = minY;\n }\n\n _this.translate(toPoint_1.x - bboxPoint.x, toPoint_1.y - bboxPoint.y);\n });\n }\n }\n\n var oriLayoutCfg = this.get('layout');\n var layoutCfg = {};\n Object.assign(layoutCfg, oriLayoutCfg, cfg);\n this.set('layout', layoutCfg);\n\n if (layoutController.isLayoutTypeSame(layoutCfg) && layoutCfg.gpuEnabled === oriLayoutCfg.gpuEnabled) {\n // no type or same type, or switch the gpu and cpu, update layout\n layoutController.updateLayoutCfg(layoutCfg);\n } else {\n // has different type, change layout\n layoutController.changeLayout(layoutCfg);\n }\n };\n /**\n * 销毁布局,changeData 时不会再使用原来的布局方法对新数据进行布局\n */\n\n\n AbstractGraph.prototype.destroyLayout = function () {\n var layoutController = this.get('layoutController');\n layoutController.destroyLayout();\n };\n /**\n * 重新以当前示例中配置的属性进行一次布局\n */\n\n\n AbstractGraph.prototype.layout = function () {\n var layoutController = this.get('layoutController');\n var layoutCfg = this.get('layout');\n if (!layoutCfg || !layoutController) return;\n\n if (layoutCfg.workerEnabled) {\n // 如果使用web worker布局\n layoutController.layout();\n return;\n }\n\n if (layoutController.layoutMethod) {\n layoutController.relayout(true);\n } else {\n layoutController.layout();\n }\n };\n /**\n * 收起指定的 combo\n * @param {string | ICombo} combo combo ID 或 combo item\n */\n\n\n AbstractGraph.prototype.collapseCombo = function (combo) {\n var _this = this;\n\n if (Object(esm[\"isString\"])(combo)) {\n combo = this.findById(combo);\n }\n\n if (!combo) {\n console.warn('The combo to be collapsed does not exist!');\n return;\n }\n\n this.emit('beforecollapseexpandcombo', {\n action: 'expand',\n item: combo\n });\n var comboModel = combo.getModel();\n var itemController = this.get('itemController');\n itemController.collapseCombo(combo);\n comboModel.collapsed = true; // add virtual edges\n\n var edges = this.getEdges().concat(this.get('vedges')); // find all the descendant nodes and combos\n\n var cnodes = [];\n var ccombos = [];\n var comboTrees = this.get('comboTrees');\n var found = false;\n (comboTrees || []).forEach(function (ctree) {\n if (found) return; // if the combo is found, terminate the forEach\n\n traverseTree(ctree, function (subTree) {\n // if the combo is found and it is traversing the other branches, terminate\n if (found && subTree.depth <= comboModel.depth) return false; // if the combo is found\n\n if (comboModel.id === subTree.id) found = true;\n\n if (found) {\n // if the combo is found, concat the descendant nodes and combos\n var item = _this.findById(subTree.id);\n\n if (item && item.getType && item.getType() === 'combo') {\n cnodes = cnodes.concat(item.getNodes());\n ccombos = ccombos.concat(item.getCombos());\n }\n }\n\n return true;\n });\n });\n var edgeWeightMap = {};\n var addedVEdges = [];\n edges.forEach(function (edge) {\n if (edge.isVisible() && !edge.getModel().isVEdge) return;\n var source = edge.getSource();\n var target = edge.getTarget();\n\n if ((cnodes.includes(source) || ccombos.includes(source)) && !cnodes.includes(target) && !ccombos.includes(target) || source.getModel().id === comboModel.id) {\n var edgeModel = edge.getModel();\n\n if (edgeModel.isVEdge) {\n _this.removeItem(edge, false);\n\n return;\n }\n\n var targetModel = target.getModel();\n\n while (!target.isVisible()) {\n target = _this.findById(targetModel.parentId || targetModel.comboId);\n if (!target || !targetModel.parentId && !targetModel.comboId) return; // all the ancestors are hidden, then ignore the edge\n\n targetModel = target.getModel();\n }\n\n var targetId = targetModel.id;\n\n if (edgeWeightMap[comboModel.id + \"-\" + targetId]) {\n edgeWeightMap[comboModel.id + \"-\" + targetId] += edgeModel.size || 1;\n return;\n } // the source is in the combo, the target is not\n\n\n var vedge = _this.addItem('vedge', {\n source: comboModel.id,\n target: targetId,\n isVEdge: true\n }, false);\n\n edgeWeightMap[comboModel.id + \"-\" + targetId] = edgeModel.size || 1;\n addedVEdges.push(vedge);\n } else if (!cnodes.includes(source) && !ccombos.includes(source) && (cnodes.includes(target) || ccombos.includes(target)) || target.getModel().id === comboModel.id) {\n var edgeModel = edge.getModel();\n\n if (edgeModel.isVEdge) {\n _this.removeItem(edge, false);\n\n return;\n }\n\n var sourceModel = source.getModel();\n\n while (!source.isVisible()) {\n source = _this.findById(sourceModel.parentId || sourceModel.comboId);\n if (!source || !sourceModel.parentId && !sourceModel.comboId) return; // all the ancestors are hidden, then ignore the edge\n\n sourceModel = source.getModel();\n }\n\n var sourceId = sourceModel.id;\n\n if (edgeWeightMap[sourceId + \"-\" + comboModel.id]) {\n edgeWeightMap[sourceId + \"-\" + comboModel.id] += edgeModel.size || 1;\n return;\n } // the target is in the combo, the source is not\n\n\n var vedge = _this.addItem('vedge', {\n target: comboModel.id,\n source: sourceId,\n isVEdge: true\n }, false);\n\n edgeWeightMap[sourceId + \"-\" + comboModel.id] = edgeModel.size || 1;\n addedVEdges.push(vedge);\n }\n }); // update the width of the virtual edges, which is the sum of merged actual edges\n // be attention that the actual edges with same endpoints but different directions will be represented by two different virtual edges\n\n addedVEdges.forEach(function (vedge) {\n var vedgeModel = vedge.getModel();\n\n _this.updateItem(vedge, {\n size: edgeWeightMap[vedgeModel.source + \"-\" + vedgeModel.target]\n }, false);\n });\n this.emit('aftercollapseexpandcombo', {\n action: 'collapse',\n item: combo\n });\n };\n /**\n * 展开指定的 combo\n * @param {string | ICombo} combo combo ID 或 combo item\n */\n\n\n AbstractGraph.prototype.expandCombo = function (combo) {\n var _this = this;\n\n if (Object(esm[\"isString\"])(combo)) {\n combo = this.findById(combo);\n }\n\n if (!combo || combo.getType && combo.getType() !== 'combo') {\n console.warn('The combo to be collapsed does not exist!');\n return;\n }\n\n this.emit('beforecollapseexpandcombo', {\n action: 'expand',\n item: combo\n });\n var comboModel = combo.getModel();\n var itemController = this.get('itemController');\n itemController.expandCombo(combo);\n comboModel.collapsed = false; // add virtual edges\n\n var edges = this.getEdges().concat(this.get('vedges')); // find all the descendant nodes and combos\n\n var cnodes = [];\n var ccombos = [];\n var comboTrees = this.get('comboTrees');\n var found = false;\n (comboTrees || []).forEach(function (ctree) {\n if (found) return; // if the combo is found, terminate\n\n traverseTree(ctree, function (subTree) {\n // if the combo is found and it is traversing the other branches, terminate\n if (found && subTree.depth <= comboModel.depth) return false;\n if (comboModel.id === subTree.id) found = true;\n\n if (found) {\n var item = _this.findById(subTree.id);\n\n if (item && item.getType && item.getType() === 'combo') {\n cnodes = cnodes.concat(item.getNodes());\n ccombos = ccombos.concat(item.getCombos());\n }\n }\n\n return true;\n });\n });\n var edgeWeightMap = {};\n var addedVEdges = {};\n edges.forEach(function (edge) {\n if (edge.isVisible() && !edge.getModel().isVEdge) return;\n var source = edge.getSource();\n var target = edge.getTarget();\n var sourceId = source.get('id');\n var targetId = target.get('id');\n\n if ((cnodes.includes(source) || ccombos.includes(source)) && !cnodes.includes(target) && !ccombos.includes(target) || sourceId === comboModel.id) {\n // the source is in the combo, the target is not\n // ignore the virtual edges\n if (edge.getModel().isVEdge) {\n _this.removeItem(edge, false);\n\n return;\n }\n\n var targetModel = target.getModel(); // find the nearest visible ancestor\n\n while (!target.isVisible()) {\n target = _this.findById(targetModel.comboId || targetModel.parentId);\n\n if (!target || !targetModel.parentId && !targetModel.comboId) {\n return; // if all the ancestors of the oppsite are all hidden, ignore the edge\n }\n\n targetModel = target.getModel();\n }\n\n targetId = targetModel.id;\n var sourceModel = source.getModel(); // find the nearest visible ancestor\n\n while (!source.isVisible()) {\n source = _this.findById(sourceModel.comboId || sourceModel.parentId);\n\n if (!source || !sourceModel.parentId && !sourceModel.comboId) {\n return; // if all the ancestors of the oppsite are all hidden, ignore the edge\n }\n\n if (sourceModel.comboId === comboModel.id || sourceModel.parentId === comboModel.id) {\n break; // if the next ancestor is the combo, break the while\n }\n\n sourceModel = source.getModel();\n }\n\n sourceId = sourceModel.id;\n\n if (targetId) {\n var vedgeId = sourceId + \"-\" + targetId; // update the width of the virtual edges, which is the sum of merged actual edges\n // be attention that the actual edges with same endpoints but different directions will be represented by two different virtual edges\n\n if (edgeWeightMap[vedgeId]) {\n edgeWeightMap[vedgeId] += edge.getModel().size || 1;\n\n _this.updateItem(addedVEdges[vedgeId], {\n size: edgeWeightMap[vedgeId]\n }, false);\n\n return;\n }\n\n var vedge = _this.addItem('vedge', {\n source: sourceId,\n target: targetId,\n isVEdge: true\n }, false);\n\n edgeWeightMap[vedgeId] = edge.getModel().size || 1;\n addedVEdges[vedgeId] = vedge;\n }\n } else if (!cnodes.includes(source) && !ccombos.includes(source) && (cnodes.includes(target) || ccombos.includes(target)) || targetId === comboModel.id) {\n // the target is in the combo, the source is not\n // ignore the virtual edges\n if (edge.getModel().isVEdge) {\n _this.removeItem(edge, false);\n\n return;\n }\n\n var sourceModel = source.getModel(); // find the nearest visible ancestor\n\n while (!source.isVisible()) {\n source = _this.findById(sourceModel.comboId || sourceModel.parentId);\n\n if (!source || !sourceModel.parentId && !sourceModel.comboId) {\n return; // if all the ancestors of the oppsite are all hidden, ignore the edge\n }\n\n sourceModel = source.getModel();\n }\n\n sourceId = sourceModel.id;\n var targetModel = target.getModel(); // find the nearest visible ancestor\n\n while (!target.isVisible()) {\n target = _this.findById(targetModel.comboId || targetModel.parentId);\n\n if (!target || !targetModel.parentId && !targetModel.comboId) {\n return; // if all the ancestors of the oppsite are all hidden, ignore the edge\n }\n\n if (targetModel.comboId === comboModel.id || targetModel.parentId === comboModel.id) {\n break; // if the next ancestor is the combo, break the while\n }\n\n targetModel = target.getModel();\n }\n\n targetId = targetModel.id;\n\n if (sourceId) {\n var vedgeId = sourceId + \"-\" + targetId; // update the width of the virtual edges, which is the sum of merged actual edges\n // be attention that the actual edges with same endpoints but different directions will be represented by two different virtual edges\n\n if (edgeWeightMap[vedgeId]) {\n edgeWeightMap[vedgeId] += edge.getModel().size || 1;\n\n _this.updateItem(addedVEdges[vedgeId], {\n size: edgeWeightMap[vedgeId]\n }, false);\n\n return;\n }\n\n var vedge = _this.addItem('vedge', {\n target: targetId,\n source: sourceId,\n isVEdge: true\n }, false);\n\n edgeWeightMap[vedgeId] = edge.getModel().size || 1;\n addedVEdges[vedgeId] = vedge;\n }\n } else if ((cnodes.includes(source) || ccombos.includes(source)) && (cnodes.includes(target) || ccombos.includes(target))) {\n // both source and target are in the combo, if the target and source are both visible, show the edge\n if (source.isVisible() && target.isVisible()) {\n edge.show();\n }\n }\n });\n this.emit('aftercollapseexpandcombo', {\n action: 'expand',\n item: combo\n });\n };\n\n AbstractGraph.prototype.collapseExpandCombo = function (combo) {\n if (Object(esm[\"isString\"])(combo)) {\n combo = this.findById(combo);\n }\n\n if (!combo || combo.getType && combo.getType() !== 'combo') return;\n var comboModel = combo.getModel(); // if one ancestor combo of the combo is collapsed, it should not be collapsed or expanded\n\n var parentItem = this.findById(comboModel.parentId);\n\n while (parentItem) {\n var parentModel = parentItem.getModel();\n\n if (parentModel.collapsed) {\n console.warn(\"Fail to expand the combo since it's ancestor combo is collapsed.\");\n parentItem = undefined;\n return;\n }\n\n parentItem = this.findById(parentModel.parentId);\n }\n\n var collapsed = comboModel.collapsed; // 该群组已经处于收起状态,需要展开\n\n if (collapsed) {\n this.expandCombo(combo);\n } else {\n this.collapseCombo(combo);\n }\n\n this.updateCombo(combo);\n };\n /**\n * 根据 comboTree 结构整理 Combo 相关的图形绘制层级,包括 Combo 本身、节点、边\n * @param {GraphData} data 数据\n */\n\n\n AbstractGraph.prototype.sortCombos = function () {\n var _this = this;\n\n var comboSorted = this.get('comboSorted');\n if (comboSorted) return;\n this.set('comboSorted', true);\n var depthMap = [];\n var dataDepthMap = {};\n var comboTrees = this.get('comboTrees');\n (comboTrees || []).forEach(function (cTree) {\n traverseTree(cTree, function (child) {\n if (depthMap[child.depth]) depthMap[child.depth].push(child.id);else depthMap[child.depth] = [child.id];\n dataDepthMap[child.id] = child.depth;\n return true;\n });\n });\n var edges = this.getEdges().concat(this.get('vedges'));\n (edges || []).forEach(function (edgeItem) {\n var edge = edgeItem.getModel();\n var sourceDepth = dataDepthMap[edge.source] || 0;\n var targetDepth = dataDepthMap[edge.target] || 0;\n var depth = Math.max(sourceDepth, targetDepth);\n if (depthMap[depth]) depthMap[depth].push(edge.id);else depthMap[depth] = [edge.id];\n });\n depthMap.forEach(function (array) {\n if (!array || !array.length) return;\n\n for (var i = array.length - 1; i >= 0; i--) {\n var item = _this.findById(array[i]);\n\n if (item) item.toFront();\n }\n });\n };\n /**\n * 获取节点所有的邻居节点\n *\n * @param {(string | INode)} node 节点 ID 或实例\n * @returns {INode[]}\n * @memberof IAbstractGraph\n */\n\n\n AbstractGraph.prototype.getNeighbors = function (node, type) {\n var item = node;\n\n if (Object(esm[\"isString\"])(node)) {\n item = this.findById(node);\n }\n\n return item.getNeighbors(type);\n };\n /**\n * 获取 node 的度数\n *\n * @param {(string | INode)} node 节点 ID 或实例\n * @param {('in' | 'out' | 'total' | 'all' | undefined)} 度数类型,in 入度,out 出度,total 总度数,all 返回三种类型度数的对象\n * @returns {Number | Object} 该节点的度数\n * @memberof IAbstractGraph\n */\n\n\n AbstractGraph.prototype.getNodeDegree = function (node, type, refresh) {\n if (type === void 0) {\n type = undefined;\n }\n\n if (refresh === void 0) {\n refresh = false;\n }\n\n var item = node;\n\n if (Object(esm[\"isString\"])(node)) {\n item = this.findById(node);\n }\n\n var degrees = this.get('degrees');\n\n if (!degrees || refresh) {\n degrees = es_degree(this.save());\n this.set('degrees', degrees);\n }\n\n var nodeDegrees = degrees[item.getID()];\n var res = 0; // 如果是通过 addItem 后面新增加的节点,此时它的所有度数都为 0\n\n if (!nodeDegrees) {\n return 0;\n }\n\n switch (type) {\n case 'in':\n res = nodeDegrees.inDegree;\n break;\n\n case 'out':\n res = nodeDegrees.outDegree;\n break;\n\n case 'all':\n res = nodeDegrees;\n break;\n\n default:\n res = nodeDegrees.degree;\n break;\n }\n\n return res;\n };\n\n AbstractGraph.prototype.getUndoStack = function () {\n return this.undoStack;\n };\n\n AbstractGraph.prototype.getRedoStack = function () {\n return this.redoStack;\n };\n /**\n * 获取 undo 和 redo 栈的数据\n */\n\n\n AbstractGraph.prototype.getStackData = function () {\n if (!this.get('enabledStack')) {\n return null;\n }\n\n return {\n undoStack: this.undoStack.toArray(),\n redoStack: this.redoStack.toArray()\n };\n };\n /**\n * 清空 undo stack & redo stack\n */\n\n\n AbstractGraph.prototype.clearStack = function () {\n if (this.get('enabledStack')) {\n this.undoStack.clear();\n this.redoStack.clear();\n }\n };\n /**\n * 将操作类型和操作数据入栈\n * @param action 操作类型\n * @param data 入栈的数据\n * @param stackType 栈的类型\n */\n\n\n AbstractGraph.prototype.pushStack = function (action, data, stackType) {\n if (action === void 0) {\n action = 'update';\n }\n\n if (stackType === void 0) {\n stackType = 'undo';\n }\n\n if (!this.get('enabledStack')) {\n console.warn('请先启用 undo & redo 功能,在实例化 Graph 时候配置 enabledStack: true !');\n return;\n }\n\n var stackData = data ? Object(esm[\"clone\"])(data) : {\n before: {},\n after: Object(esm[\"clone\"])(this.save())\n };\n\n if (stackType === 'redo') {\n this.redoStack.push({\n action: action,\n data: stackData\n });\n } else {\n this.undoStack.push({\n action: action,\n data: stackData\n });\n }\n\n this.emit('stackchange', {\n undoStack: this.undoStack,\n redoStack: this.redoStack\n });\n };\n /**\n * 获取邻接矩阵\n *\n * @param {boolean} cache 是否使用缓存的\n * @param {boolean} directed 是否是有向图,默认取 graph.directed\n * @returns {Matrix} 邻接矩阵\n * @memberof IAbstractGraph\n */\n\n\n AbstractGraph.prototype.getAdjMatrix = function (cache, directed) {\n if (cache === void 0) {\n cache = true;\n }\n\n if (directed === undefined) directed = this.get('directed');\n var currentAdjMatrix = this.get('adjMatrix');\n\n if (!currentAdjMatrix || !cache) {\n currentAdjMatrix = adjacent_matrix(this.save(), directed);\n this.set('adjMatrix', currentAdjMatrix);\n }\n\n return currentAdjMatrix;\n };\n /**\n * 获取最短路径矩阵\n *\n * @param {boolean} cache 是否使用缓存的\n * @param {boolean} directed 是否是有向图,默认取 graph.directed\n * @returns {Matrix} 最短路径矩阵\n * @memberof IAbstractGraph\n */\n\n\n AbstractGraph.prototype.getShortestPathMatrix = function (cache, directed) {\n if (cache === void 0) {\n cache = true;\n }\n\n if (directed === undefined) directed = this.get('directed');\n var currentAdjMatrix = this.get('adjMatrix');\n var currentShourtestPathMatrix = this.get('shortestPathMatrix');\n\n if (!currentAdjMatrix || !cache) {\n currentAdjMatrix = adjacent_matrix(this.save(), directed);\n this.set('adjMatrix', currentAdjMatrix);\n }\n\n if (!currentShourtestPathMatrix || !cache) {\n currentShourtestPathMatrix = es_floydWarshall(this.save(), directed);\n this.set('shortestPathMatrix', currentShourtestPathMatrix);\n }\n\n return currentShourtestPathMatrix;\n };\n /**\n * 重新定义监听函数,复写参数类型\n */\n\n\n AbstractGraph.prototype.on = function (eventName, callback, once) {\n return _super.prototype.on.call(this, eventName, callback, once);\n };\n /**\n * 销毁画布\n */\n\n\n AbstractGraph.prototype.destroy = function () {\n this.clear(); // 清空栈数据\n\n this.clearStack();\n this.get('itemController').destroy();\n this.get('modeController').destroy();\n this.get('viewController').destroy();\n this.get('stateController').destroy();\n this.get('canvas').destroy();\n this.cfg = null;\n this.destroyed = true;\n this.redoStack = null;\n this.undoStack = null;\n };\n /**\n * 创建凸包或凹包轮廓\n * @param cfg HullCfg 轮廓配置项\n */\n\n\n AbstractGraph.prototype.createHull = function (cfg) {\n if (!cfg.members || cfg.members.length < 1) {\n console.warn('Create hull failed! The members is empty.');\n return;\n }\n\n var parent = this.get('hullGroup');\n var hullMap = this.get('hullMap');\n\n if (!hullMap) {\n hullMap = {};\n this.set('hullMap', hullMap);\n }\n\n if (!parent || parent.get('destroyed')) {\n parent = this.get('group').addGroup({\n id: 'hullGroup'\n });\n parent.toBack();\n this.set('hullGroup', parent);\n }\n\n if (hullMap[cfg.id]) {\n console.warn('Existed hull id.');\n return hullMap[cfg.id];\n }\n\n var group = parent.addGroup({\n id: cfg.id + \"-container\"\n });\n var hull = new item_hull(this, Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, cfg), {\n group: group\n }));\n var hullId = hull.id;\n hullMap[hullId] = hull;\n return hull;\n };\n /**\n * 获取当前 graph 中存在的包裹轮廓\n * @return {[key: string]: Hull} Hull 的 map,hullId 对应的 hull 实例\n */\n\n\n AbstractGraph.prototype.getHulls = function () {\n return this.get('hullMap');\n };\n /**\n * 根据 hullId 获取对应的 hull\n * @return Hull\n */\n\n\n AbstractGraph.prototype.getHullById = function (hullId) {\n return this.get('hullMap')[hullId];\n };\n\n AbstractGraph.prototype.removeHull = function (hull) {\n var _a;\n\n var hullInstance;\n\n if (Object(esm[\"isString\"])(hull)) {\n hullInstance = this.getHullById(hull);\n } else {\n hullInstance = hull;\n }\n\n (_a = this.get('hullMap')) === null || _a === void 0 ? true : delete _a[hullInstance.id];\n hullInstance.destroy();\n };\n\n AbstractGraph.prototype.removeHulls = function () {\n var hulls = this.getHulls();\n if (!hulls || !Object.keys(hulls).length) return;\n Object.keys(hulls).forEach(function (key) {\n var hull = hulls[key];\n hull.destroy();\n });\n this.set('hullMap', {});\n };\n\n return AbstractGraph;\n}(event_emitter_esm[\"a\" /* default */]);\n\n/* harmony default export */ var graph_graph = (graph_AbstractGraph);\n// CONCATENATED MODULE: ./node_modules/@antv/g6-core/es/element/shapeBase.js\nfunction shapeBase_typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { shapeBase_typeof = function _typeof(obj) { return typeof obj; }; } else { shapeBase_typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return shapeBase_typeof(obj); }\n\n\n\n\n\n\nvar shapeBase_transform = matrix_util_esm[\"ext\"].transform;\nvar CLS_SHAPE_SUFFIX = '-shape';\nvar CLS_LABEL_SUFFIX = '-label';\nvar shapeBase_ARROWS = ['startArrow', 'endArrow'];\nvar SHAPE_DEFAULT_ATTRS = {\n lineWidth: 1,\n stroke: undefined,\n fill: undefined,\n lineAppendWidth: 1,\n opacity: undefined,\n strokeOpacity: undefined,\n fillOpacity: undefined,\n x: 0,\n y: 0,\n r: 10,\n width: 20,\n height: 20,\n shadowColor: undefined,\n shadowBlur: 0,\n shadowOffsetX: 0,\n shadowOffsetY: 0\n};\nvar PATH_SHAPE_DEFAULT_ATTRS = {\n lineWidth: 1,\n stroke: '#000',\n lineDash: undefined,\n startArrow: false,\n endArrow: false,\n opacity: undefined,\n strokeOpacity: undefined,\n fillOpacity: undefined,\n shadowColor: undefined,\n shadowBlur: 0,\n shadowOffsetX: 0,\n shadowOffsetY: 0\n};\nvar SHAPES_DEFAULT_ATTRS = {\n edge: PATH_SHAPE_DEFAULT_ATTRS,\n node: SHAPE_DEFAULT_ATTRS,\n combo: SHAPE_DEFAULT_ATTRS\n};\nvar CLS_LABEL_BG_SUFFIX = '-label-bg'; // 单个 shape 带有一个 label,共用这段代码\n\nvar shapeBase = {\n // 默认样式及配置\n options: {\n labelCfg: {\n style: {\n fontFamily: global.windowFontFamily\n }\n },\n descriptionCfg: {\n style: {\n fontFamily: global.windowFontFamily\n }\n }\n },\n itemType: '',\n\n /**\n * 形状的类型,例如 circle,ellipse,polyline...\n */\n type: '',\n getCustomConfig: function getCustomConfig(cfg) {\n return {};\n },\n getOptions: function getOptions(cfg, updateType) {\n if (updateType === 'move' || (updateType === null || updateType === void 0 ? void 0 : updateType.includes('bbox'))) {\n return {};\n }\n\n return Object(esm[\"deepMix\"])({}, this.options, this.getCustomConfig(cfg) || {}, cfg);\n },\n\n /**\n * 绘制节点/边,包含文本\n * @override\n * @param {Object} cfg 节点的配置项\n * @param {G.Group} group 节点的容器\n * @return {IShape} 绘制的图形\n */\n draw: function draw(cfg, group) {\n group['shapeMap'] = {};\n this.mergeStyle = this.getOptions(cfg);\n var shape = this.drawShape(cfg, group);\n shape.set('className', this.itemType + CLS_SHAPE_SUFFIX);\n group['shapeMap'][this.itemType + CLS_SHAPE_SUFFIX] = shape;\n\n if (cfg.label) {\n var label = this.drawLabel(cfg, group);\n label.set('className', this.itemType + CLS_LABEL_SUFFIX);\n group['shapeMap'][this.itemType + CLS_LABEL_SUFFIX] = label;\n }\n\n return shape;\n },\n\n /**\n * 绘制完成后的操作,便于用户继承现有的节点、边\n * @param cfg\n * @param group\n * @param keyShape\n */\n afterDraw: function afterDraw(cfg, group, keyShape) {},\n drawShape: function drawShape(cfg, group) {\n return null;\n },\n drawLabel: function drawLabel(cfg, group) {\n var defaultLabelCfg = (this.mergeStyle || this.getOptions(cfg) || {}).labelCfg; // image的情况下有可能为null\n\n var labelCfg = defaultLabelCfg || {};\n var labelStyle = this.getLabelStyle(cfg, labelCfg, group);\n var rotate = labelStyle.rotate;\n delete labelStyle.rotate;\n var label = group.addShape('text', {\n attrs: labelStyle,\n draggable: true,\n className: 'text-shape',\n name: 'text-shape'\n });\n group['shapeMap']['text-shape'] = label;\n\n if (!isNaN(rotate) && rotate !== '') {\n var labelBBox = label.getBBox();\n var labelMatrix = [1, 0, 0, 0, 1, 0, 0, 0, 1];\n\n if (labelStyle.rotateCenter) {\n switch (labelStyle.rotateCenter) {\n case 'center':\n labelMatrix = shapeBase_transform(labelMatrix, [['t', -labelBBox.width / 2, -labelBBox.height / 2], ['r', rotate], ['t', labelBBox.width / 2, labelBBox.height / 2]]);\n break;\n\n case 'lefttop':\n labelMatrix = shapeBase_transform(labelMatrix, [['t', -labelStyle.x, -labelStyle.y], ['r', rotate], ['t', labelStyle.x, labelStyle.y]]);\n break;\n\n case 'leftcenter':\n labelMatrix = shapeBase_transform(labelMatrix, [['t', -labelStyle.x, -labelStyle.y - labelBBox.height / 2], ['r', rotate], ['t', labelStyle.x, labelStyle.y + labelBBox.height / 2]]);\n break;\n\n default:\n labelMatrix = shapeBase_transform(labelMatrix, [['t', -labelBBox.width / 2, -labelBBox.height / 2], ['r', rotate], ['t', labelBBox.width / 2, labelBBox.height / 2]]);\n break;\n }\n } else {\n labelMatrix = shapeBase_transform(labelMatrix, [['t', -labelStyle.x, -labelStyle.y - labelBBox.height / 2], ['r', rotate], ['t', labelStyle.x, labelStyle.y + labelBBox.height / 2]]);\n }\n\n label.setMatrix(labelMatrix);\n }\n\n if (labelStyle.background) {\n var rect = this.drawLabelBg(cfg, group, label);\n var labelBgClassname = this.itemType + CLS_LABEL_BG_SUFFIX;\n rect.set('classname', labelBgClassname);\n group['shapeMap'][labelBgClassname] = rect;\n label.toFront();\n }\n\n return label;\n },\n drawLabelBg: function drawLabelBg(cfg, group, label) {\n var defaultLabelCfg = this.options.labelCfg;\n var labelCfg = Object(esm[\"mix\"])({}, defaultLabelCfg, cfg.labelCfg);\n var style = this.getLabelBgStyleByPosition(label, cfg, labelCfg, group);\n var rect = group.addShape('rect', {\n name: 'text-bg-shape',\n attrs: style\n });\n group['shapeMap']['text-bg-shape'] = rect;\n return rect;\n },\n getLabelStyleByPosition: function getLabelStyleByPosition(cfg, labelCfg, group) {\n return {\n text: cfg.label\n };\n },\n getLabelBgStyleByPosition: function getLabelBgStyleByPosition(label, cfg, labelCfg, group) {\n return {};\n },\n\n /**\n * 获取文本的配置项\n * @param cfg 节点的配置项\n * @param labelCfg 文本的配置项\n * @param group 父容器,label 的定位可能与图形相关\n */\n getLabelStyle: function getLabelStyle(cfg, labelCfg, group) {\n var calculateStyle = this.getLabelStyleByPosition(cfg, labelCfg, group);\n var attrName = this.itemType + \"Label\"; // 取 nodeLabel,edgeLabel 的配置项\n\n var defaultStyle = global[attrName] ? global[attrName].style : null;\n return Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, defaultStyle), calculateStyle), labelCfg.style);\n },\n\n /**\n * 获取图形的配置项\n * @param cfg\n */\n getShapeStyle: function getShapeStyle(cfg) {\n return cfg.style;\n },\n\n /**\n * 更新节点,包含文本\n * @override\n * @param {Object} cfg 节点/边的配置项\n * @param {G6.Item} item 节点/边\n */\n update: function update(cfg, item, updateType) {\n this.updateShapeStyle(cfg, item, updateType);\n this.updateLabel(cfg, item, updateType);\n },\n updateShapeStyle: function updateShapeStyle(cfg, item, updateType) {\n var _a;\n\n var group = item.getContainer();\n var shape = item.getKeyShape();\n var shapeStyle = Object(esm[\"mix\"])({}, shape.attr(), cfg.style);\n\n var _loop_1 = function _loop_1(key) {\n var _b;\n\n var style = shapeStyle[key];\n\n if (Object(esm[\"isPlainObject\"])(style)) {\n // 更新图元素样式,支持更新子元素\n var subShape = ((_a = group['shapeMap']) === null || _a === void 0 ? void 0 : _a[key]) || group.find(function (element) {\n return element.get('name') === key;\n });\n subShape === null || subShape === void 0 ? void 0 : subShape.attr(style);\n } else {\n shape.attr((_b = {}, _b[key] = style, _b));\n }\n };\n\n for (var key in shapeStyle) {\n _loop_1(key);\n }\n },\n updateLabel: function updateLabel(cfg, item, updateType) {\n var _a, _b; // 防止 cfg.label = \"\" 的情况\n\n\n if (cfg.label || cfg.label === '') {\n var group = item.getContainer();\n var _c = (this.mergeStyle || this.getOptions({}, updateType) || {}).labelCfg,\n labelCfg = _c === void 0 ? {} : _c;\n var labelClassName_1 = this.itemType + CLS_LABEL_SUFFIX;\n var label = group['shapeMap'][labelClassName_1] || group.find(function (ele) {\n return ele.get('className') === labelClassName_1;\n });\n var labelBgClassname_1 = this.itemType + CLS_LABEL_BG_SUFFIX;\n var labelBg = group['shapeMap'][labelBgClassname_1] || group.find(function (ele) {\n return ele.get('className') === labelBgClassname_1;\n }); // 若传入的新配置中有 label,(用户没传入但原先有 label,label 也会有值)\n\n if (!label) {\n // 若原先不存在 label,则绘制一个新的 label\n var newLabel = this.drawLabel(cfg, group);\n newLabel.set('className', labelClassName_1);\n group['shapeMap'][labelClassName_1] = newLabel;\n } else {\n // 若原先存在 label,则更新样式。与 getLabelStyle 不同在于这里需要融合当前 label 的样式\n // 融合 style 以外的属性:position, offset, ...\n if (!updateType || updateType === 'bbox|label' || this.itemType === 'edge' && updateType !== 'style') {\n labelCfg = Object(esm[\"deepMix\"])(labelCfg, cfg.labelCfg);\n } // 获取位置信息\n\n\n var calculateStyle = this.getLabelStyleByPosition(cfg, labelCfg, group); // 取 nodeLabel,edgeLabel 的配置项\n\n var cfgStyle = (_a = cfg.labelCfg) === null || _a === void 0 ? void 0 : _a.style; // const cfgBgStyle = labelCfg.style?.background;\n // 需要融合当前\b label 的样式 label.attr()。不再需要全局/默认样式,因为已经应用在当前的 label 上\n\n var labelStyle = Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, calculateStyle), cfgStyle);\n\n var rotate = labelStyle.rotate;\n delete labelStyle.rotate; // 计算 label 的旋转矩阵\n\n if (!isNaN(rotate) && rotate !== '') {\n // if G 4.x define the rotateAtStart, use it directly instead of using the following codes\n var rotateMatrix = [1, 0, 0, 0, 1, 0, 0, 0, 1];\n rotateMatrix = shapeBase_transform(rotateMatrix, [['t', -labelStyle.x, -labelStyle.y], ['r', rotate], ['t', labelStyle.x, labelStyle.y]]);\n labelStyle.matrix = rotateMatrix;\n label.attr(labelStyle);\n } else {\n if (((_b = label.getMatrix()) === null || _b === void 0 ? void 0 : _b[4]) !== 1) {\n label.resetMatrix();\n }\n\n label.attr(labelStyle);\n }\n\n if (!labelBg) {\n if (labelStyle.background) {\n labelBg = this.drawLabelBg(cfg, group, label);\n labelBg.set('classname', labelBgClassname_1);\n group['shapeMap'][labelBgClassname_1] = labelBg;\n label.toFront();\n }\n } else if (labelStyle.background) {\n var calculateBgStyle = this.getLabelBgStyleByPosition(label, cfg, labelCfg, group);\n var labelBgStyle = calculateBgStyle;\n\n if (!isNaN(rotate) && rotate !== '') {\n var bgRotateMatrix = [1, 0, 0, 0, 1, 0, 0, 0, 1];\n bgRotateMatrix = shapeBase_transform(bgRotateMatrix, [['t', -labelBgStyle.x, -labelBgStyle.y], ['r', rotate], ['t', labelBgStyle.x, labelBgStyle.y]]);\n labelBgStyle.matrix = bgRotateMatrix;\n } else {\n labelBg.resetMatrix();\n }\n\n labelBg.attr(labelBgStyle);\n } else {\n group.removeChild(labelBg);\n }\n }\n }\n },\n // update(cfg, item) // 默认不定义\n afterUpdate: function afterUpdate(cfg, item) {},\n\n /**\n * 设置节点的状态,主要是交互状态,业务状态请在 draw 方法中实现\n * 单图形的节点仅考虑 selected、active 状态,有其他状态需求的用户自己复写这个方法\n * @override\n * @param {String} name 状态名称\n * @param {String | Boolean} value 状态值\n * @param {G6.Item} item 节点\n */\n setState: function setState(name, value, item) {\n var _a, _b;\n\n var _c;\n\n var shape = item.get('keyShape');\n if (!shape || shape.destroyed) return;\n var type = item.getType();\n var stateName = Object(esm[\"isBoolean\"])(value) ? name : name + \":\" + value;\n var shapeStateStyle = this.getStateStyle(stateName, item);\n var itemStateStyle = item.getStateStyle(stateName); // const originStyle = item.getOriginStyle();\n // 不允许设置一个不存在的状态\n\n if (!itemStateStyle && !shapeStateStyle) {\n return;\n } // 要设置或取消的状态的样式\n // 当没有 state 状态时,默认使用 model.stateStyles 中的样式\n\n\n var styles = Object(esm[\"mix\"])({}, itemStateStyle || shapeStateStyle);\n var group = item.getContainer(); // 从图元素现有的样式中删除本次要取消的 states 中存在的属性值。使用对象检索更快\n\n var keptAttrs = {\n x: 1,\n y: 1,\n cx: 1,\n cy: 1\n };\n\n if (type === 'combo') {\n keptAttrs.r = 1;\n keptAttrs.width = 1;\n keptAttrs.height = 1;\n }\n\n if (value) {\n var _loop_2 = function _loop_2(key) {\n var _d;\n\n var style = styles[key];\n\n if (Object(esm[\"isPlainObject\"])(style) && !shapeBase_ARROWS.includes(key)) {\n var subShape = ((_c = group['shapeMap']) === null || _c === void 0 ? void 0 : _c[key]) || group.find(function (element) {\n return element.get('name') === key;\n });\n subShape === null || subShape === void 0 ? void 0 : subShape.attr(style);\n } else {\n // 非纯对象,则认为是设置到 keyShape 上面的\n shape.attr((_d = {}, _d[key] = style, _d));\n }\n }; // style 为要设置的状态的样式\n\n\n for (var key in styles) {\n _loop_2(key);\n }\n } else {\n // 所有生效的 state 的样式\n var enableStatesStyle = graphic_cloneBesidesImg(item.getCurrentStatesStyle());\n var model = item.getModel(); // 原始样式\n\n var originStyle_1 = Object(esm[\"mix\"])({}, model.style, graphic_cloneBesidesImg(item.getOriginStyle()));\n var keyShapeName_1 = shape.get('name'); // cloning shape.attr(), keys.forEach to avoid cloning the img attr, which leads to maximum clone heap #2383\n // const keyShapeStyles = clone(shape.attr())\n\n var shapeAttrs_1 = shape.attr();\n var keyShapeStyles_1 = {};\n Object.keys(shapeAttrs_1).forEach(function (key) {\n if (key === 'img') return;\n var attr = shapeAttrs_1[key];\n\n if (attr && shapeBase_typeof(attr) === 'object') {\n keyShapeStyles_1[key] = Object(esm[\"clone\"])(attr);\n } else {\n keyShapeStyles_1[key] = attr;\n }\n }); // 已有样式 - 要取消的状态的样式\n\n var filtetDisableStatesStyle = {};\n\n var _loop_3 = function _loop_3(p) {\n var style = styles[p];\n\n if (Object(esm[\"isPlainObject\"])(style) && !shapeBase_ARROWS.includes(p)) {\n var subShape_1 = group['shapeMap'][p] || group.find(function (ele) {\n return ele.get('name') === p;\n });\n\n if (subShape_1) {\n var subShapeStyles_1 = graphic_cloneBesidesImg(subShape_1.attr());\n Object(esm[\"each\"])(style, function (v, key) {\n if (p === keyShapeName_1 && keyShapeStyles_1[key] && !keptAttrs[key]) {\n delete keyShapeStyles_1[key];\n var value_1 = originStyle_1[p][key] || SHAPES_DEFAULT_ATTRS[type][key];\n shape.attr(key, value_1);\n } else if (subShapeStyles_1[key] || subShapeStyles_1[key] === 0) {\n delete subShapeStyles_1[key];\n var value_2 = originStyle_1[p][key] || SHAPES_DEFAULT_ATTRS[type][key];\n subShape_1.attr(key, value_2);\n }\n });\n filtetDisableStatesStyle[p] = subShapeStyles_1;\n }\n } else {\n if (keyShapeStyles_1[p] && !keptAttrs[p]) {\n delete keyShapeStyles_1[p];\n var value_3 = originStyle_1[p] || (originStyle_1[keyShapeName_1] ? originStyle_1[keyShapeName_1][p] : undefined) || SHAPES_DEFAULT_ATTRS[type][p];\n shape.attr(p, value_3);\n }\n }\n }; // styles 为要取消的状态的样式\n\n\n for (var p in styles) {\n _loop_3(p);\n } // 从图元素现有的样式中删除本次要取消的 states 中存在的属性值后,\n // 如果 keyShape 有 name 属性,则 filtetDisableStatesStyle 的格式为 { keyShapeName: {} }\n // 否则为普通对象\n\n\n if (!keyShapeName_1) {\n Object(esm[\"mix\"])(filtetDisableStatesStyle, keyShapeStyles_1);\n } else {\n filtetDisableStatesStyle[keyShapeName_1] = keyShapeStyles_1;\n }\n\n for (var key in enableStatesStyle) {\n if (keptAttrs[key]) continue;\n var enableStyle = enableStatesStyle[key];\n\n if (!Object(esm[\"isPlainObject\"])(enableStyle) || shapeBase_ARROWS.includes(key)) {\n // 把样式属性merge到keyShape中\n if (!keyShapeName_1) {\n Object(esm[\"mix\"])(originStyle_1, (_a = {}, _a[key] = enableStyle, _a));\n } else {\n Object(esm[\"mix\"])(originStyle_1[keyShapeName_1], (_b = {}, _b[key] = enableStyle, _b));\n delete originStyle_1[key];\n }\n\n delete enableStatesStyle[key];\n }\n }\n\n var originstyles = {};\n Object(esm[\"deepMix\"])(originstyles, originStyle_1, filtetDisableStatesStyle, enableStatesStyle);\n var keyShapeSetted = false;\n\n var _loop_4 = function _loop_4(originKey) {\n var _e, _f;\n\n var style = originstyles[originKey];\n\n if (Object(esm[\"isPlainObject\"])(style) && !shapeBase_ARROWS.includes(originKey)) {\n var subShape = group['shapeMap'][originKey] || group.find(function (ele) {\n return ele.get('name') === originKey;\n });\n\n if (subShape) {\n // The text's position and matrix is not allowed to be affected by states\n if (subShape.get('type') === 'text') {\n delete style.x;\n delete style.y;\n delete style.matrix;\n }\n\n if (originKey === keyShapeName_1) {\n if (type === 'combo') {\n delete style.r;\n delete style.width;\n delete style.height;\n }\n\n keyShapeSetted = true;\n }\n\n subShape.attr(style);\n }\n } else if (!keyShapeSetted) {\n var value_4 = style || SHAPES_DEFAULT_ATTRS[type][originKey]; // 当更新 combo 状态时,当不存在 keyShapeName 时候,则认为是设置到 keyShape 上面的\n\n if (type === 'combo') {\n if (!keyShapeName_1) {\n shape.attr((_e = {}, _e[originKey] = value_4, _e));\n }\n } else {\n shape.attr((_f = {}, _f[originKey] = value_4, _f));\n }\n }\n };\n\n for (var originKey in originstyles) {\n _loop_4(originKey);\n }\n }\n },\n\n /**\n * 获取不同状态下的样式\n *\n * @param {string} name 状态名称\n * @param {Item} item Node或Edge的实例\n * @return {object} 样式\n */\n getStateStyle: function getStateStyle(name, item) {\n var model = item.getModel();\n var type = item.getType();\n\n var _a = this.getOptions(model),\n stateStyles = _a.stateStyles,\n _b = _a.style,\n style = _b === void 0 ? {} : _b;\n\n var modelStateStyle = model.stateStyles ? model.stateStyles[name] : stateStyles && stateStyles[name];\n\n if (type === 'combo') {\n return Object(esm[\"clone\"])(modelStateStyle);\n }\n\n return Object(esm[\"mix\"])({}, style, modelStateStyle);\n },\n\n /**\n * 获取控制点\n * @param {Object} cfg 节点、边的配置项\n * @return {Array|null} 控制点的数组,如果为 null,则没有控制点\n */\n getControlPoints: function getControlPoints(cfg) {\n return cfg.controlPoints;\n },\n\n /**\n * 获取控制点\n * @param {Object} cfg 节点、边的配置项\n * @return {Array|null} 锚点的数组,如果为 null,则没有锚点\n */\n getAnchorPoints: function getAnchorPoints(cfg) {\n var _a, _b;\n\n var anchorPoints = (cfg === null || cfg === void 0 ? void 0 : cfg.anchorPoints) || ((_a = this.getCustomConfig(cfg)) === null || _a === void 0 ? void 0 : _a.anchorPoints) || ((_b = this.options) === null || _b === void 0 ? void 0 : _b.anchorPoints);\n return anchorPoints;\n }\n};\n// CONCATENATED MODULE: ./node_modules/@antv/g6-core/es/element/node.js\n\n\n\n\n\n\nvar singleNode = {\n itemType: 'node',\n // 单个图形的类型\n shapeType: 'single-node',\n\n /**\n * 文本相对图形的位置,默认以中心点\n * 位置包括: top, bottom, left, right, center\n * @type {String}\n */\n labelPosition: 'center',\n\n /**\n * 文本相对偏移,当 labelPosition 不为 center 时有效\n * @type {Number}\n */\n offset: global.nodeLabel.offset,\n\n /**\n * 获取节点宽高\n * @internal 返回节点的大小,以 [width, height] 的方式维护\n * @param {Object} cfg 节点的配置项\n * @return {Array} 宽高\n */\n getSize: function getSize(cfg) {\n var _a;\n\n var size = ((_a = this.mergeStyle) === null || _a === void 0 ? void 0 : _a.size) || cfg.size || this.getOptions({}).size || global.defaultNode.size; // Global.defaultNode.size; // \n // size 是数组,但长度为1,则补长度为2\n\n if (Object(esm[\"isArray\"])(size) && size.length === 1) {\n size = [size[0], size[0]];\n } // size 为数字,则转换为数组\n\n\n if (!Object(esm[\"isArray\"])(size)) {\n size = [size, size];\n }\n\n return size;\n },\n // 私有方法,不希望扩展的节点复写这个方法\n getLabelStyleByPosition: function getLabelStyleByPosition(cfg, labelCfg) {\n var labelPosition = labelCfg.position || this.labelPosition; // 默认的位置(最可能的情形),所以放在最上面\n\n if (labelPosition === 'center') {\n return {\n x: 0,\n y: 0,\n text: cfg.label\n };\n }\n\n var offset = labelCfg.offset;\n\n if (Object(esm[\"isNil\"])(offset)) {\n // 考虑 offset = 0 的场景,不用用 labelCfg.offset || Global.nodeLabel.offset\n offset = this.offset; // 不居中时的偏移量\n }\n\n var size = this.getSize(cfg);\n var style;\n\n switch (labelPosition) {\n case 'top':\n style = {\n x: 0,\n y: -size[1] / 2 - offset,\n textBaseline: 'bottom' // 文本在图形的上面\n\n };\n break;\n\n case 'bottom':\n style = {\n x: 0,\n y: size[1] / 2 + offset,\n textBaseline: 'top'\n };\n break;\n\n case 'left':\n style = {\n x: -size[0] / 2 - offset,\n y: 0,\n textAlign: 'right'\n };\n break;\n\n default:\n style = {\n x: size[0] / 2 + offset,\n y: 0,\n textAlign: 'left'\n };\n break;\n }\n\n style.text = cfg.label;\n return style;\n },\n getLabelBgStyleByPosition: function getLabelBgStyleByPosition(label, cfg, labelCfg, group) {\n var _a;\n\n if (!label) return {};\n var backgroundStyle = (_a = labelCfg.style) === null || _a === void 0 ? void 0 : _a.background;\n if (!backgroundStyle) return {};\n var bbox = label.getBBox();\n var padding = base_formatPadding(backgroundStyle.padding);\n var backgroundWidth = bbox.width + padding[1] + padding[3];\n var backgroundHeight = bbox.height + padding[0] + padding[2];\n return Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({\n x: bbox.minX - padding[3],\n y: bbox.minY - padding[0]\n }, backgroundStyle), {\n width: backgroundWidth,\n height: backgroundHeight\n });\n },\n drawShape: function drawShape(cfg, group) {\n var shapeType = this.shapeType; // || this.type,都已经加了 shapeType\n\n var style = this.getShapeStyle(cfg);\n var shape = group.addShape(shapeType, {\n attrs: style,\n draggable: true,\n name: 'node-shape'\n });\n group['shapeMap']['node-shape'] = shape;\n return shape;\n },\n\n /**\n * 更新linkPoints\n * @param {Object} cfg 节点数据配置项\n * @param {Group} group Item所在的group\n */\n updateLinkPoints: function updateLinkPoints(cfg, group) {\n var defaultLinkPoints = (this.mergeStyle || this.getOptions(cfg)).linkPoints;\n var markLeft = group['shapeMap']['link-point-left'] || group.find(function (element) {\n return element.get('className') === 'link-point-left';\n });\n var markRight = group['shapeMap']['link-point-right'] || group.find(function (element) {\n return element.get('className') === 'link-point-right';\n });\n var markTop = group['shapeMap']['link-point-top'] || group.find(function (element) {\n return element.get('className') === 'link-point-top';\n });\n var markBottom = group['shapeMap']['link-point-bottom'] || group.find(function (element) {\n return element.get('className') === 'link-point-bottom';\n });\n var currentLinkPoints;\n\n if (markLeft) {\n currentLinkPoints = markLeft.attr();\n }\n\n if (markRight && !currentLinkPoints) {\n currentLinkPoints = markRight.attr();\n }\n\n if (markTop && !currentLinkPoints) {\n currentLinkPoints = markTop.attr();\n }\n\n if (markBottom && !currentLinkPoints) {\n currentLinkPoints = markBottom.attr();\n }\n\n if (!currentLinkPoints) currentLinkPoints = defaultLinkPoints;\n var linkPoints = Object(esm[\"mix\"])({}, currentLinkPoints, cfg.linkPoints);\n var markFill = linkPoints.fill,\n markStroke = linkPoints.stroke,\n borderWidth = linkPoints.lineWidth;\n var markSize = linkPoints.size / 2;\n if (!markSize) markSize = linkPoints.r;\n\n var _a = cfg.linkPoints ? cfg.linkPoints : {\n left: undefined,\n right: undefined,\n top: undefined,\n bottom: undefined\n },\n left = _a.left,\n right = _a.right,\n top = _a.top,\n bottom = _a.bottom;\n\n var size = this.getSize(cfg);\n var width = size[0];\n var height = size[1];\n var styles = {\n r: markSize,\n fill: markFill,\n stroke: markStroke,\n lineWidth: borderWidth\n };\n\n if (markLeft) {\n if (!left && left !== undefined) {\n markLeft.remove();\n delete group['shapeMap']['link-point-left'];\n } else {\n markLeft.attr(Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, styles), {\n x: -width / 2,\n y: 0\n }));\n }\n } else if (left) {\n var name_1 = 'link-point-left';\n group['shapeMap'][name_1] = group.addShape('circle', {\n attrs: Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, styles), {\n x: -width / 2,\n y: 0\n }),\n className: name_1,\n name: name_1,\n isAnchorPoint: true\n });\n }\n\n if (markRight) {\n if (!right && right !== undefined) {\n markRight.remove();\n delete group['shapeMap']['link-point-right'];\n }\n\n markRight.attr(Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, styles), {\n x: width / 2,\n y: 0\n }));\n } else if (right) {\n var name_2 = 'link-point-right';\n group['shapeMap'][name_2] = group.addShape('circle', {\n attrs: Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, styles), {\n x: width / 2,\n y: 0\n }),\n className: name_2,\n name: name_2,\n isAnchorPoint: true\n });\n }\n\n if (markTop) {\n if (!top && top !== undefined) {\n markTop.remove();\n delete group['shapeMap']['link-point-top'];\n }\n\n markTop.attr(Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, styles), {\n x: 0,\n y: -height / 2\n }));\n } else if (top) {\n var name_3 = 'link-point-top';\n group['shapeMap'][name_3] = group.addShape('circle', {\n attrs: Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, styles), {\n x: 0,\n y: -height / 2\n }),\n className: name_3,\n name: name_3,\n isAnchorPoint: true\n });\n }\n\n if (markBottom) {\n if (!bottom && bottom !== undefined) {\n markBottom.remove();\n delete group['shapeMap']['link-point-bottom'];\n } else {\n markBottom.attr(Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, styles), {\n x: 0,\n y: height / 2\n }));\n }\n } else if (bottom) {\n var name_4 = 'link-point-bottom';\n group['shapeMap'][name_4] = group.addShape('circle', {\n attrs: Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, styles), {\n x: 0,\n y: height / 2\n }),\n className: name_4,\n name: name_4,\n isAnchorPoint: true\n });\n }\n },\n updateShape: function updateShape(cfg, item, keyShapeStyle, hasIcon, updateType) {\n var keyShape = item.get('keyShape');\n keyShape.attr(Object(tslib_es6[\"__assign\"])({}, keyShapeStyle));\n\n if (!undefined || (updateType === null || updateType === void 0 ? void 0 : updateType.includes('label'))) {\n this.updateLabel(cfg, item, updateType);\n }\n\n if (hasIcon) {\n this.updateIcon(cfg, item);\n }\n },\n updateIcon: function updateIcon(cfg, item) {\n var _this = this;\n\n var group = item.getContainer();\n var icon = (this.mergeStyle || this.getOptions(cfg)).icon;\n var show = (cfg.icon ? cfg.icon : {\n show: undefined\n }).show;\n var iconShape = group['shapeMap'][this.type + \"-icon\"] || group.find(function (ele) {\n return ele.get('name') === _this.type + \"-icon\";\n });\n\n if (iconShape) {\n // 若原先存在 icon\n if (show || show === undefined) {\n // 若传入 show: true, 或没有设置,则更新原有的 icon 样式\n var iconConfig = Object(esm[\"mix\"])({}, iconShape.attr(), icon);\n var _a = iconConfig.width,\n w = _a === void 0 ? 20 : _a,\n _b = iconConfig.height,\n h = _b === void 0 ? 20 : _b;\n iconShape.attr(Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, iconConfig), {\n x: -w / 2,\n y: -h / 2\n }));\n } else {\n // 若传入了 show: false 则删除原先的 icon\n iconShape.remove();\n }\n } else if (show) {\n // 如果原先不存在 icon,但传入了 show: true,则新增 icon\n var w = icon.width,\n h = icon.height;\n var name_5 = this.type + \"-icon\";\n group['shapeMap'][name_5] = group.addShape('image', {\n attrs: Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, icon), {\n x: -w / 2,\n y: -h / 2\n }),\n className: name_5,\n name: name_5\n }); // to ensure the label is on the top of all the shapes\n\n var labelShape = group['shapeMap']['node-label'] || group.find(function (ele) {\n return ele.get('name') === 'node-label';\n });\n\n if (labelShape) {\n labelShape.toFront();\n }\n }\n }\n};\n\nvar singleNodeDef = Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, shapeBase), singleNode);\n\nelement_shape.registerNode('single-node', singleNodeDef);\n// CONCATENATED MODULE: ./node_modules/@antv/g6-core/es/element/edge.js\n/**\n * @fileOverview 自定义边\n * @description 自定义边中有大量逻辑同自定义节点重复,虽然可以提取成为 mixin ,但是考虑到代码的可读性,还是单独实现。\n */\n\n\n\n\n\n\n\n\nvar CLS_SHAPE = 'edge-shape'; // start,end 倒置,center 不变\n\nfunction revertAlign(labelPosition) {\n var textAlign = labelPosition;\n\n if (labelPosition === 'start') {\n textAlign = 'end';\n } else if (labelPosition === 'end') {\n textAlign = 'start';\n }\n\n return textAlign;\n}\n\nvar singleEdge = {\n itemType: 'edge',\n\n /**\n * 文本的位置\n * @type {String}\n */\n labelPosition: 'center',\n\n /**\n * 文本的 x 偏移\n * @type {Number}\n */\n refX: 0,\n\n /**\n * 文本的 y 偏移\n * @type {Number}\n */\n refY: 0,\n\n /**\n * 文本是否跟着线自动旋转,默认 false\n * @type {Boolean}\n */\n labelAutoRotate: false,\n // 自定义边时的配置\n options: {\n size: global.defaultEdge.size,\n style: {\n x: 0,\n y: 0,\n stroke: global.defaultEdge.style.stroke,\n lineAppendWidth: global.defaultEdge.style.lineAppendWidth\n },\n labelCfg: {\n style: {\n fill: global.edgeLabel.style.fill,\n fontSize: global.edgeLabel.style.fontSize,\n fontFamily: global.windowFontFamily\n }\n },\n stateStyles: Object(tslib_es6[\"__assign\"])({}, global.edgeStateStyles)\n },\n\n /**\n * 获取边的 path\n * @internal 供扩展的边覆盖\n * @param {Array} points 构成边的点的集合\n * @return {Array} 构成 path 的数组\n */\n getPath: function getPath(points) {\n var path = [];\n Object(esm[\"each\"])(points, function (point, index) {\n if (index === 0) {\n path.push(['M', point.x, point.y]);\n } else {\n path.push(['L', point.x, point.y]);\n }\n });\n return path;\n },\n getShapeStyle: function getShapeStyle(cfg) {\n var defaultStyle = this.options.style;\n var strokeStyle = {\n stroke: cfg.color\n }; // 如果设置了color,则覆盖默认的stroke属性\n\n var style = Object(esm[\"mix\"])({}, defaultStyle, strokeStyle, cfg.style);\n var size = cfg.size || global.defaultEdge.size;\n cfg = this.getPathPoints(cfg);\n var startPoint = cfg.startPoint,\n endPoint = cfg.endPoint;\n var controlPoints = this.getControlPoints(cfg);\n var points = [startPoint]; // 添加起始点\n // 添加控制点\n\n if (controlPoints) {\n points = points.concat(controlPoints);\n } // 添加结束点\n\n\n points.push(endPoint);\n var path = this.getPath(points);\n var styles = Object(esm[\"mix\"])({}, global.defaultEdge.style, {\n stroke: global.defaultEdge.color,\n lineWidth: size,\n path: path\n }, style);\n return styles;\n },\n updateShapeStyle: function updateShapeStyle(cfg, item, updateType) {\n var _a;\n\n var group = item.getContainer(); // const strokeStyle: ShapeStyle = {\n // stroke: cfg.color,\n // };\n\n var shape = ((_a = item.getKeyShape) === null || _a === void 0 ? void 0 : _a.call(item)) || group['shapeMap']['edge-shape']; // group.find((element) => element.get('className') === 'edge-shape');\n\n var size = cfg.size;\n cfg = this.getPathPoints(cfg);\n var startPoint = cfg.startPoint,\n endPoint = cfg.endPoint;\n var controlPoints = this.getControlPoints(cfg); // || cfg.controlPoints;\n\n var points = [startPoint]; // 添加起始点\n // 添加控制点\n\n if (controlPoints) {\n points = points.concat(controlPoints);\n } // 添加结束点\n\n\n points.push(endPoint);\n var currentAttr = shape.attr(); // const previousStyle = mix({}, strokeStyle, currentAttr, cfg.style);\n\n var previousStyle = cfg.style || {};\n\n if (previousStyle.stroke === undefined) {\n previousStyle.stroke = cfg.color;\n }\n\n var source = cfg.sourceNode;\n var target = cfg.targetNode;\n var routeCfg = {\n radius: previousStyle.radius\n };\n\n if (!controlPoints) {\n routeCfg = {\n source: source,\n target: target,\n offset: previousStyle.offset,\n radius: previousStyle.radius\n };\n }\n\n var path = this.getPath(points, routeCfg);\n var style = {};\n\n if (updateType === 'move') {\n style = {\n path: path\n };\n } else {\n if (currentAttr.endArrow && previousStyle.endArrow === false) {\n cfg.style.endArrow = {\n path: ''\n };\n }\n\n if (currentAttr.startArrow && previousStyle.startArrow === false) {\n cfg.style.startArrow = {\n path: ''\n };\n }\n\n style = Object(tslib_es6[\"__assign\"])({}, cfg.style);\n if (style.lineWidth === undefined) style.lineWdith = (Object(esm[\"isNumber\"])(size) ? size : size === null || size === void 0 ? void 0 : size[0]) || currentAttr.lineWidth;\n if (style.path === undefined) style.path = path;\n if (style.stroke === undefined) style.stroke = currentAttr.stroke || cfg.color;\n }\n\n if (shape) {\n shape.attr(style);\n }\n },\n getLabelStyleByPosition: function getLabelStyleByPosition(cfg, labelCfg, group) {\n var labelPosition = labelCfg.position || this.labelPosition; // 文本的位置用户可以传入\n\n var style = {};\n var pathShape = group === null || group === void 0 ? void 0 : group['shapeMap'][CLS_SHAPE]; // group?.find((element) => element.get('className') === CLS_SHAPE);\n // 不对 pathShape 进行判空,如果线不存在,说明有问题了\n\n var pointPercent;\n\n if (labelPosition === 'start') {\n pointPercent = 0;\n } else if (labelPosition === 'end') {\n pointPercent = 1;\n } else {\n pointPercent = 0.5;\n } // 偏移量\n\n\n var offsetX = labelCfg.refX || this.refX;\n var offsetY = labelCfg.refY || this.refY; // 如果两个节点重叠,线就变成了一个点,这时候label的位置,就是这个点 + 绝对偏移\n\n if (cfg.startPoint.x === cfg.endPoint.x && cfg.startPoint.y === cfg.endPoint.y) {\n style.x = cfg.startPoint.x + offsetX;\n style.y = cfg.startPoint.y + offsetY;\n style.text = cfg.label;\n return style;\n }\n\n var autoRotate;\n if (Object(esm[\"isNil\"])(labelCfg.autoRotate)) autoRotate = this.labelAutoRotate;else autoRotate = labelCfg.autoRotate;\n var offsetStyle = graphic_getLabelPosition(pathShape, pointPercent, offsetX, offsetY, autoRotate);\n style.x = offsetStyle.x;\n style.y = offsetStyle.y;\n style.rotate = offsetStyle.rotate;\n style.textAlign = this._getTextAlign(labelPosition, offsetStyle.angle);\n style.text = cfg.label;\n return style;\n },\n getLabelBgStyleByPosition: function getLabelBgStyleByPosition(label, cfg, labelCfg, group) {\n if (!label) {\n return {};\n }\n\n var bbox = label.getBBox();\n var backgroundStyle = labelCfg.style && labelCfg.style.background;\n\n if (!backgroundStyle) {\n return {};\n }\n\n var padding = backgroundStyle.padding;\n var backgroundWidth = bbox.width + padding[1] + padding[3];\n var backgroundHeight = bbox.height + padding[0] + padding[2];\n var labelPosition = labelCfg.position || this.labelPosition;\n\n var style = Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, backgroundStyle), {\n width: backgroundWidth,\n height: backgroundHeight,\n x: bbox.minX - padding[2],\n y: bbox.minY - padding[0],\n rotate: 0\n });\n\n var autoRotate;\n if (Object(esm[\"isNil\"])(labelCfg.autoRotate)) autoRotate = this.labelAutoRotate;else autoRotate = labelCfg.autoRotate;\n var pathShape = group === null || group === void 0 ? void 0 : group['shapeMap'][CLS_SHAPE]; // group?.find((element) => element.get('className') === CLS_SHAPE);\n // 不对 pathShape 进行判空,如果线不存在,说明有问题了\n\n var pointPercent;\n\n if (labelPosition === 'start') {\n pointPercent = 0;\n } else if (labelPosition === 'end') {\n pointPercent = 1;\n } else {\n pointPercent = 0.5;\n } // 偏移量\n\n\n var offsetX = labelCfg.refX || this.refX;\n var offsetY = labelCfg.refY || this.refY; // // 如果两个节点重叠,线就变成了一个点,这时候label的位置,就是这个点 + 绝对偏移\n\n if (cfg.startPoint.x === cfg.endPoint.x && cfg.startPoint.y === cfg.endPoint.y) {\n style.x = cfg.startPoint.x + offsetX - backgroundWidth / 2;\n style.y = cfg.startPoint.y + offsetY - backgroundHeight / 2;\n return style;\n }\n\n var bgOffsetX = offsetX - backgroundWidth / 2;\n\n if (labelCfg.position === 'start') {\n bgOffsetX = offsetX - padding[2];\n } else if (labelCfg.position === 'end') {\n bgOffsetX = offsetX - backgroundWidth;\n }\n\n var offsetStyle = graphic_getLabelPosition(pathShape, pointPercent, bgOffsetX, offsetY + backgroundHeight / 2, autoRotate);\n\n if (autoRotate) {\n style.x = offsetStyle.x;\n style.y = offsetStyle.y;\n }\n\n style.rotate = offsetStyle.rotate;\n return style;\n },\n // 获取文本对齐方式\n _getTextAlign: function _getTextAlign(labelPosition, angle) {\n var textAlign = 'center';\n\n if (!angle) {\n return labelPosition;\n }\n\n angle = angle % (Math.PI * 2); // 取模\n\n if (labelPosition !== 'center') {\n if (angle >= 0 && angle <= Math.PI / 2 || angle >= 3 / 2 * Math.PI && angle < 2 * Math.PI) {\n textAlign = labelPosition;\n } else {\n textAlign = revertAlign(labelPosition);\n }\n }\n\n return textAlign;\n },\n\n /**\n * @internal 获取边的控制点\n * @param {Object} cfg 边的配置项\n * @return {Array} 控制点的数组\n */\n getControlPoints: function getControlPoints(cfg) {\n return cfg.controlPoints;\n },\n\n /**\n * @internal 处理需要重计算点和边的情况\n * @param {Object} cfg 边的配置项\n * @return {Object} 边的配置项\n */\n getPathPoints: function getPathPoints(cfg) {\n return cfg;\n },\n\n /**\n * 绘制边\n * @override\n * @param {Object} cfg 边的配置项\n * @param {G.Group} group 边的容器\n * @return {IShape} 图形\n */\n drawShape: function drawShape(cfg, group) {\n var shapeStyle = this.getShapeStyle(cfg);\n var shape = group.addShape('path', {\n className: CLS_SHAPE,\n name: CLS_SHAPE,\n attrs: shapeStyle\n });\n group['shapeMap'][CLS_SHAPE] = shape;\n return shape;\n },\n drawLabel: function drawLabel(cfg, group) {\n var defaultLabelCfg = this.options.labelCfg;\n var labelCfg = Object(esm[\"deepMix\"])({}, defaultLabelCfg, cfg.labelCfg);\n var labelStyle = this.getLabelStyle(cfg, labelCfg, group);\n var rotate = labelStyle.rotate;\n delete labelStyle.rotate;\n var label = group.addShape('text', {\n attrs: labelStyle,\n name: 'text-shape'\n });\n group['shapeMap']['text-shape'] = label;\n\n if (!isNaN(rotate) && rotate !== '') {\n label.rotateAtStart(rotate);\n }\n\n if (labelStyle.background) {\n var rect = this.drawLabelBg(cfg, group, label, labelStyle, rotate);\n var labelBgClassname = this.itemType + CLS_LABEL_BG_SUFFIX;\n rect.set('classname', labelBgClassname);\n group['shapeMap'][labelBgClassname] = rect;\n label.toFront();\n }\n\n return label;\n },\n drawLabelBg: function drawLabelBg(cfg, group, label, labelStyle, rotate) {\n var defaultLabelCfg = this.options.labelCfg;\n var labelCfg = Object(esm[\"deepMix\"])({}, defaultLabelCfg, cfg.labelCfg);\n var style = this.getLabelBgStyleByPosition(label, cfg, labelCfg, group);\n delete style.rotate;\n var rect = group.addShape('rect', {\n name: 'text-bg-shape',\n attrs: style\n });\n group['shapeMap']['text-bg-shape'] = rect;\n if (!isNaN(rotate)) rect.rotateAtStart(rotate);\n return rect;\n }\n};\n\nvar singleEdgeDef = Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, shapeBase), singleEdge);\n\nelement_shape.registerEdge('single-edge', singleEdgeDef); // 直线, 不支持控制点\n\nelement_shape.registerEdge('line', {\n // 控制点不生效\n getControlPoints: function getControlPoints() {\n return undefined;\n }\n}, 'single-edge'); // 直线\n\nelement_shape.registerEdge('spline', {\n getPath: function getPath(points) {\n var path = path_getSpline(points);\n return path;\n }\n}, 'single-edge');\nelement_shape.registerEdge('arc', {\n curveOffset: 20,\n clockwise: 1,\n getControlPoints: function getControlPoints(cfg) {\n var startPoint = cfg.startPoint,\n endPoint = cfg.endPoint;\n var midPoint = {\n x: (startPoint.x + endPoint.x) / 2,\n y: (startPoint.y + endPoint.y) / 2\n };\n var center;\n var arcPoint; // 根据给定点计算圆弧\n\n if (cfg.controlPoints !== undefined) {\n arcPoint = cfg.controlPoints[0];\n center = getCircleCenterByPoints(startPoint, arcPoint, endPoint); // 根据控制点和直线关系决定 clockwise值\n\n if (startPoint.x <= endPoint.x && startPoint.y > endPoint.y) {\n this.clockwise = center.x > arcPoint.x ? 0 : 1;\n } else if (startPoint.x <= endPoint.x && startPoint.y < endPoint.y) {\n this.clockwise = center.x > arcPoint.x ? 1 : 0;\n } else if (startPoint.x > endPoint.x && startPoint.y <= endPoint.y) {\n this.clockwise = center.y < arcPoint.y ? 0 : 1;\n } else {\n this.clockwise = center.y < arcPoint.y ? 1 : 0;\n } // 若给定点和两端点共线,无法生成圆弧,绘制直线\n\n\n if ((arcPoint.x - startPoint.x) / (arcPoint.y - startPoint.y) === (endPoint.x - startPoint.x) / (endPoint.y - startPoint.y)) {\n return [];\n }\n } else {\n // 根据直线连线中点的的偏移计算圆弧\n // 若用户给定偏移量则根据其计算,否则按照默认偏移值计算\n if (cfg.curveOffset === undefined) {\n cfg.curveOffset = this.curveOffset;\n }\n\n if (Object(esm[\"isArray\"])(cfg.curveOffset)) {\n cfg.curveOffset = cfg.curveOffset[0];\n }\n\n if (cfg.curveOffset < 0) {\n this.clockwise = 0;\n } else {\n this.clockwise = 1;\n }\n\n var vec = {\n x: endPoint.x - startPoint.x,\n y: endPoint.y - startPoint.y\n };\n var edgeAngle = Math.atan2(vec.y, vec.x);\n arcPoint = {\n x: cfg.curveOffset * Math.cos(-Math.PI / 2 + edgeAngle) + midPoint.x,\n y: cfg.curveOffset * Math.sin(-Math.PI / 2 + edgeAngle) + midPoint.y\n };\n center = getCircleCenterByPoints(startPoint, arcPoint, endPoint);\n }\n\n var radius = math_distance(startPoint, center);\n var controlPoints = [{\n x: radius,\n y: radius\n }];\n return controlPoints;\n },\n getPath: function getPath(points) {\n var path = [];\n path.push(['M', points[0].x, points[0].y]); // 控制点与端点共线\n\n if (points.length === 2) {\n path.push(['L', points[1].x, points[1].y]);\n } else {\n path.push(['A', points[1].x, points[1].y, 0, 0, this.clockwise, points[2].x, points[2].y]);\n }\n\n return path;\n }\n}, 'single-edge');\nelement_shape.registerEdge('quadratic', {\n curvePosition: 0.5,\n curveOffset: -20,\n getControlPoints: function getControlPoints(cfg) {\n var controlPoints = cfg.controlPoints; // 指定controlPoints\n\n if (!controlPoints || !controlPoints.length) {\n var startPoint = cfg.startPoint,\n endPoint = cfg.endPoint;\n if (cfg.curveOffset === undefined) cfg.curveOffset = this.curveOffset;\n if (cfg.curvePosition === undefined) cfg.curvePosition = this.curvePosition;\n if (Object(esm[\"isArray\"])(this.curveOffset)) cfg.curveOffset = cfg.curveOffset[0];\n if (Object(esm[\"isArray\"])(this.curvePosition)) cfg.curvePosition = cfg.curveOffset[0];\n var innerPoint = path_getControlPoint(startPoint, endPoint, cfg.curvePosition, cfg.curveOffset);\n controlPoints = [innerPoint];\n }\n\n return controlPoints;\n },\n getPath: function getPath(points) {\n var path = [];\n path.push(['M', points[0].x, points[0].y]);\n path.push(['Q', points[1].x, points[1].y, points[2].x, points[2].y]);\n return path;\n }\n}, 'single-edge');\nelement_shape.registerEdge('cubic', {\n curvePosition: [1 / 2, 1 / 2],\n curveOffset: [-20, 20],\n getControlPoints: function getControlPoints(cfg) {\n var controlPoints = cfg.controlPoints; // 指定 controlPoints\n\n if (cfg.curveOffset === undefined) cfg.curveOffset = this.curveOffset;\n if (cfg.curvePosition === undefined) cfg.curvePosition = this.curvePosition;\n if (Object(esm[\"isNumber\"])(cfg.curveOffset)) cfg.curveOffset = [cfg.curveOffset, -cfg.curveOffset];\n if (Object(esm[\"isNumber\"])(cfg.curvePosition)) cfg.curvePosition = [cfg.curvePosition, 1 - cfg.curvePosition];\n\n if (!controlPoints || !controlPoints.length || controlPoints.length < 2) {\n var startPoint = cfg.startPoint,\n endPoint = cfg.endPoint;\n var innerPoint1 = path_getControlPoint(startPoint, endPoint, cfg.curvePosition[0], cfg.curveOffset[0]);\n var innerPoint2 = path_getControlPoint(startPoint, endPoint, cfg.curvePosition[1], cfg.curveOffset[1]);\n controlPoints = [innerPoint1, innerPoint2];\n }\n\n return controlPoints;\n },\n getPath: function getPath(points) {\n var path = [];\n path.push(['M', points[0].x, points[0].y]);\n path.push(['C', points[1].x, points[1].y, points[2].x, points[2].y, points[3].x, points[3].y]);\n return path;\n }\n}, 'single-edge'); // 垂直方向的三阶贝塞尔曲线,不再考虑用户外部传入的控制点\n\nelement_shape.registerEdge('cubic-vertical', {\n curvePosition: [1 / 2, 1 / 2],\n minCurveOffset: [0, 0],\n curveOffset: undefined,\n getControlPoints: function getControlPoints(cfg) {\n var startPoint = cfg.startPoint,\n endPoint = cfg.endPoint;\n if (cfg.curvePosition === undefined) cfg.curvePosition = this.curvePosition;\n if (cfg.curveOffset === undefined) cfg.curveOffset = this.curveOffset;\n if (cfg.minCurveOffset === undefined) cfg.minCurveOffset = this.minCurveOffset;\n if (Object(esm[\"isNumber\"])(cfg.curveOffset)) cfg.curveOffset = [cfg.curveOffset, -cfg.curveOffset];\n if (Object(esm[\"isNumber\"])(cfg.minCurveOffset)) cfg.minCurveOffset = [cfg.minCurveOffset, -cfg.minCurveOffset];\n if (Object(esm[\"isNumber\"])(cfg.curvePosition)) cfg.curvePosition = [cfg.curvePosition, 1 - cfg.curvePosition];\n var yDist = endPoint.y - startPoint.y;\n var curveOffset = [0, 0];\n\n if (cfg.curveOffset) {\n curveOffset = cfg.curveOffset;\n } else if (Math.abs(yDist) < Math.abs(cfg.minCurveOffset[0])) {\n curveOffset = cfg.minCurveOffset;\n }\n\n var innerPoint1 = {\n x: startPoint.x,\n y: startPoint.y + yDist * this.curvePosition[0] + curveOffset[0]\n };\n var innerPoint2 = {\n x: endPoint.x,\n y: endPoint.y - yDist * this.curvePosition[1] + curveOffset[1]\n };\n return [innerPoint1, innerPoint2];\n }\n}, 'cubic'); // 水平方向的三阶贝塞尔曲线,不再考虑用户外部传入的控制点\n\nelement_shape.registerEdge('cubic-horizontal', {\n curvePosition: [1 / 2, 1 / 2],\n minCurveOffset: [0, 0],\n curveOffset: undefined,\n getControlPoints: function getControlPoints(cfg) {\n var startPoint = cfg.startPoint,\n endPoint = cfg.endPoint;\n if (cfg.curvePosition === undefined) cfg.curvePosition = this.curvePosition;\n if (cfg.curveOffset === undefined) cfg.curveOffset = this.curveOffset;\n if (cfg.minCurveOffset === undefined) cfg.minCurveOffset = this.minCurveOffset;\n if (Object(esm[\"isNumber\"])(cfg.curveOffset)) cfg.curveOffset = [cfg.curveOffset, -cfg.curveOffset];\n if (Object(esm[\"isNumber\"])(cfg.minCurveOffset)) cfg.minCurveOffset = [cfg.minCurveOffset, -cfg.minCurveOffset];\n if (Object(esm[\"isNumber\"])(cfg.curvePosition)) cfg.curvePosition = [cfg.curvePosition, 1 - cfg.curvePosition];\n var xDist = endPoint.x - startPoint.x;\n var curveOffset = [0, 0];\n\n if (cfg.curveOffset) {\n curveOffset = cfg.curveOffset;\n } else if (Math.abs(xDist) < Math.abs(cfg.minCurveOffset[0])) {\n curveOffset = cfg.minCurveOffset;\n }\n\n var innerPoint1 = {\n x: startPoint.x + xDist * this.curvePosition[0] + curveOffset[0],\n y: startPoint.y\n };\n var innerPoint2 = {\n x: endPoint.x - xDist * this.curvePosition[1] + curveOffset[1],\n y: endPoint.y\n };\n var controlPoints = [innerPoint1, innerPoint2];\n return controlPoints;\n }\n}, 'cubic');\nelement_shape.registerEdge('loop', {\n getPathPoints: function getPathPoints(cfg) {\n return graphic_getLoopCfgs(cfg);\n },\n getControlPoints: function getControlPoints(cfg) {\n return cfg.controlPoints;\n },\n afterDraw: function afterDraw(cfg) {\n cfg.controlPoints = undefined;\n },\n afterUpdate: function afterUpdate(cfg) {\n cfg.controlPoints = undefined;\n }\n}, 'cubic');\n// CONCATENATED MODULE: ./node_modules/@antv/g6-core/es/element/combo.js\n\n\n\n\n\nvar singleCombo = {\n itemType: 'combo',\n // 单个图形的类型\n shapeType: 'single-combo',\n\n /**\n * Combo 标题文本相对图形的位置,默认为 top\n * 位置包括: top, bottom, left, right, center\n * @type {String}\n */\n labelPosition: 'top',\n\n /**\n * 标题文本相对偏移,当 labelPosition 不为 center 时有效\n * @type {Number}\n */\n refX: global.comboLabel.refX,\n refY: global.comboLabel.refY,\n options: {\n style: {\n stroke: global.defaultCombo.style.stroke,\n fill: global.defaultCombo.style.fill,\n lineWidth: global.defaultCombo.style.lineWidth\n },\n labelCfg: {\n style: {\n fill: global.comboLabel.style.fill,\n fontSize: global.comboLabel.style.fontSize,\n fontFamily: global.windowFontFamily\n }\n },\n stateStyles: Object(tslib_es6[\"__assign\"])({}, global.comboStateStyles)\n },\n\n /**\n * 获取 Combo 宽高\n * @internal 返回 Combo 的大小,以 [width, height] 的方式维护\n * @param {Object} cfg Combo 的配置项\n * @return {Array} 宽高\n */\n getSize: function getSize(cfg) {\n var size = Object(esm[\"clone\"])(cfg.size || this.options.size || global.defaultCombo.size); // size 是数组,若长度为 1,则补长度为 2\n\n if (Object(esm[\"isArray\"])(size) && size.length === 1) {\n size = [size[0], size[0]];\n } // size 为数字,则转换为数组\n\n\n if (!Object(esm[\"isArray\"])(size)) {\n size = [size, size];\n }\n\n return size;\n },\n // 私有方法,不希望扩展的 Combo 复写这个方法\n getLabelStyleByPosition: function getLabelStyleByPosition(cfg, labelCfg) {\n var labelPosition = labelCfg.position || this.labelPosition;\n var cfgStyle = cfg.style;\n var padding = cfg.padding || this.options.padding;\n if (Object(esm[\"isArray\"])(padding)) padding = padding[0];\n var refX = labelCfg.refX,\n refY = labelCfg.refY; // 考虑 refX 和 refY = 0 的场景,不用用 labelCfg.refX || Global.nodeLabel.refX\n\n if (Object(esm[\"isNil\"])(refX)) {\n refX = this.refX; // 不居中时的偏移量\n }\n\n if (Object(esm[\"isNil\"])(refY)) {\n refY = this.refY; // 不居中时的偏移量\n }\n\n var size = this.getSize(cfg);\n var r = Math.max(cfgStyle.r, size[0] / 2) || size[0] / 2;\n var dis = r + padding;\n var style;\n\n switch (labelPosition) {\n case 'top':\n style = {\n x: 0,\n y: -dis - refY,\n textBaseline: 'bottom',\n textAlign: 'center'\n };\n break;\n\n case 'bottom':\n style = {\n x: 0,\n y: dis + refY,\n textBaseline: 'bottom',\n textAlign: 'center'\n };\n break;\n\n case 'left':\n style = {\n x: -dis + refX,\n y: 0,\n textAlign: 'left'\n };\n break;\n\n case 'center':\n style = {\n x: 0,\n y: 0,\n text: cfg.label,\n textAlign: 'center'\n };\n break;\n\n default:\n style = {\n x: dis + refX,\n y: 0,\n textAlign: 'right'\n };\n break;\n }\n\n style.text = cfg.label;\n return style;\n },\n drawShape: function drawShape(cfg, group) {\n var shapeType = this.shapeType; // || this.type,都已经加了 shapeType\n\n var style = this.getShapeStyle(cfg);\n var shape = group.addShape(shapeType, {\n attrs: style,\n draggable: true,\n name: 'combo-shape'\n });\n return shape;\n },\n updateShape: function updateShape(cfg, item, keyShapeStyle) {\n var keyShape = item.get('keyShape');\n var animate = cfg.animate === undefined ? this.options.animate : cfg.animate;\n\n if (animate && keyShape.animate) {\n keyShape.animate(keyShapeStyle, {\n duration: 200,\n easing: 'easeLinear'\n });\n } else {\n keyShape.attr(Object(tslib_es6[\"__assign\"])({}, keyShapeStyle));\n }\n\n this.updateLabel(cfg, item); // special for some types of nodes\n }\n};\n\nvar singleComboDef = Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, shapeBase), singleCombo);\n\nelement_shape.registerCombo('single-combo', singleComboDef);\n// CONCATENATED MODULE: ./node_modules/@antv/g6-core/es/element/combos/circle.js\n\n\n\n // 圆形 Combo\n\nelement_shape.registerCombo('circle', {\n // 自定义节点时的配置\n options: {\n size: [global.defaultCombo.size[0], global.defaultCombo.size[0]],\n padding: global.defaultCombo.padding[0],\n animate: true,\n style: {\n stroke: global.defaultCombo.style.stroke,\n fill: global.defaultCombo.style.fill,\n lineWidth: global.defaultCombo.style.lineWidth\n },\n labelCfg: {\n style: {\n fill: global.comboLabel.style.fill,\n fontSize: global.comboLabel.style.fontSize\n },\n refX: 0,\n refY: 0\n },\n stateStyles: Object(tslib_es6[\"__assign\"])({}, global.comboStateStyles)\n },\n shapeType: 'circle',\n // 文本位置\n labelPosition: 'top',\n drawShape: function drawShape(cfg, group) {\n var style = this.getShapeStyle(cfg);\n delete style.height;\n delete style.width;\n var keyShape = group.addShape('circle', {\n attrs: style,\n className: 'circle-combo',\n name: 'circle-combo',\n draggable: true\n });\n return keyShape;\n },\n\n /**\n * 获取 Combo 的样式,供基于该 Combo 自定义时使用\n * @param {Object} cfg Combo 数据模型\n * @return {Object} Combo 的样式\n */\n getShapeStyle: function getShapeStyle(cfg) {\n var defaultStyle = this.options.style;\n var padding = cfg.padding || this.options.padding;\n if (Object(esm[\"isArray\"])(padding)) padding = padding[0];\n var strokeStyle = {\n stroke: cfg.color\n }; // 如果设置了color,则覆盖默认的stroke属性\n\n var style = Object(esm[\"mix\"])({}, defaultStyle, strokeStyle, cfg.style);\n var r;\n\n if (cfg.fixSize) {\n r = Object(esm[\"isNumber\"])(cfg.fixSize) ? cfg.fixSize : cfg.fixSize[0];\n } else {\n var size = this.getSize(cfg);\n if (!Object(esm[\"isNumber\"])(style.r) || isNaN(style.r)) r = size[0] / 2 || global.defaultCombo.style.r;else r = Math.max(style.r, size[0] / 2) || size[0] / 2;\n }\n\n style.r = r + padding;\n\n var styles = Object(tslib_es6[\"__assign\"])({\n x: 0,\n y: 0\n }, style);\n\n if (cfg.style) cfg.style.r = r;else {\n cfg.style = {\n r: r\n };\n }\n return styles;\n },\n update: function update(cfg, item) {\n var size = this.getSize(cfg);\n var padding = cfg.padding || this.options.padding;\n if (Object(esm[\"isArray\"])(padding)) padding = padding[0];\n var cfgStyle = Object(esm[\"clone\"])(cfg.style);\n var r;\n\n if (cfg.fixSize) {\n r = Object(esm[\"isNumber\"])(cfg.fixSize) ? cfg.fixSize : cfg.fixSize[0];\n } else {\n r = Math.max(cfgStyle.r, size[0] / 2) || size[0] / 2;\n }\n\n cfgStyle.r = r + padding;\n var itemCacheSize = item.get('sizeCache');\n\n if (itemCacheSize) {\n itemCacheSize.r = cfgStyle.r;\n } // 下面这些属性需要覆盖默认样式与目前样式,但若在 cfg 中有指定则应该被 cfg 的相应配置覆盖。\n\n\n var strokeStyle = {\n stroke: cfg.color\n }; // 与 getShapeStyle 不同在于,update 时需要获取到当前的 style 进行融合。即新传入的配置项中没有涉及的属性,保留当前的配置。\n\n var keyShape = item.get('keyShape');\n var style = Object(esm[\"mix\"])({}, keyShape.attr(), strokeStyle, cfgStyle);\n if (cfg.style) cfg.style.r = r;else {\n cfg.style = {\n r: r\n };\n }\n this.updateShape(cfg, item, style, true);\n }\n}, 'single-combo');\n// CONCATENATED MODULE: ./node_modules/@antv/g6-core/es/element/combos/rect.js\n\n\n\n\nelement_shape.registerCombo('rect', {\n // 自定义 Combo 时的配置\n options: {\n size: [40, 5],\n padding: [25, 20, 15, 20],\n animate: true,\n style: {\n radius: 0,\n stroke: global.defaultCombo.style.stroke,\n fill: global.defaultCombo.style.fill,\n lineWidth: global.defaultCombo.style.lineWidth\n },\n // 文本样式配置\n labelCfg: {\n style: {\n fill: global.comboLabel.style.fill,\n fontSize: global.comboLabel.style.fontSize,\n fontFamily: global.windowFontFamily\n }\n },\n // 连接点,默认为左右\n anchorPoints: [[0, 0.5], [1, 0.5]],\n stateStyles: Object(tslib_es6[\"__assign\"])({}, global.comboStateStyles)\n },\n shapeType: 'rect',\n labelPosition: 'top',\n drawShape: function drawShape(cfg, group) {\n var style = this.getShapeStyle(cfg);\n var keyShape = group.addShape('rect', {\n attrs: style,\n className: 'rect-combo',\n name: 'rect-combo',\n draggable: true\n });\n return keyShape;\n },\n // 私有方法,不希望扩展的 Combo 复写这个方法\n getLabelStyleByPosition: function getLabelStyleByPosition(cfg, labelCfg) {\n var labelPosition = labelCfg.position || this.labelPosition;\n var cfgStyle = cfg.style;\n var padding = cfg.padding || this.options.padding;\n if (Object(esm[\"isNumber\"])(padding)) padding = [padding, padding, padding, padding];\n var refX = labelCfg.refX,\n refY = labelCfg.refY; // 考虑 refX 和 refY = 0 的场景,不用用 labelCfg.refX || Global.nodeLabel.refY\n\n if (Object(esm[\"isNil\"])(refX)) {\n refX = this.refX; // 不居中时的偏移量\n }\n\n if (Object(esm[\"isNil\"])(refY)) {\n refY = this.refY; // 不居中时的偏移量\n }\n\n var leftDis = cfgStyle.width / 2 + padding[3];\n var topDis = cfgStyle.height / 2 + padding[0];\n var style;\n\n switch (labelPosition) {\n case 'top':\n style = {\n x: 0 - leftDis + refX,\n y: 0 - topDis + refY,\n textBaseline: 'top',\n textAlign: 'left'\n };\n break;\n\n case 'bottom':\n style = {\n x: 0,\n y: topDis + refY,\n textBaseline: 'bottom',\n textAlign: 'center'\n };\n break;\n\n case 'left':\n style = {\n x: 0 - leftDis + refY,\n y: 0,\n textAlign: 'left'\n };\n break;\n\n case 'center':\n style = {\n x: 0,\n y: 0,\n text: cfg.label,\n textAlign: 'center'\n };\n break;\n\n default:\n style = {\n x: leftDis + refX,\n y: 0,\n textAlign: 'right'\n };\n break;\n }\n\n style.text = cfg.label;\n return style;\n },\n\n /**\n * 获取节点的样式,供基于该节点自定义时使用\n * @param {Object} cfg 节点数据模型\n * @return {Object} 节点的样式\n */\n getShapeStyle: function getShapeStyle(cfg) {\n var defaultStyle = this.options.style;\n var padding = cfg.padding || this.options.padding;\n if (Object(esm[\"isNumber\"])(padding)) padding = [padding, padding, padding, padding];\n var strokeStyle = {\n stroke: cfg.color\n }; // 如果设置了color,则覆盖默认的stroke属性\n\n var style = Object(esm[\"mix\"])({}, defaultStyle, strokeStyle, cfg.style);\n var size = this.getSize(cfg);\n var width;\n var height;\n var fixSize = cfg.collapsed && cfg.fixCollapseSize ? cfg.fixCollapseSize : cfg.fixSize;\n\n if (fixSize) {\n if (Object(esm[\"isNumber\"])(fixSize)) {\n width = fixSize;\n height = fixSize;\n } else {\n width = fixSize[0];\n height = fixSize[1];\n }\n } else {\n if (!Object(esm[\"isNumber\"])(style.width) || isNaN(style.width)) width = size[0] || global.defaultCombo.style.width;else width = Math.max(style.width, size[0]) || size[0];\n if (!Object(esm[\"isNumber\"])(style.height) || isNaN(style.height)) height = size[1] || global.defaultCombo.style.height;else height = Math.max(style.height, size[1]) || size[1];\n }\n\n var x = -width / 2 - padding[3];\n var y = -height / 2 - padding[0];\n style.width = width + padding[1] + padding[3];\n style.height = height + padding[0] + padding[2];\n\n var styles = Object(tslib_es6[\"__assign\"])({\n x: x,\n y: y\n }, style);\n\n if (!cfg.style) {\n cfg.style = {\n width: width,\n height: height\n };\n } else {\n cfg.style.width = width;\n cfg.style.height = height;\n }\n\n return styles;\n },\n update: function update(cfg, item) {\n var size = this.getSize(cfg);\n var padding = cfg.padding || this.options.padding;\n if (Object(esm[\"isNumber\"])(padding)) padding = [padding, padding, padding, padding];\n var cfgStyle = Object(esm[\"clone\"])(cfg.style);\n var width, height;\n var fixSize = cfg.collapsed && cfg.fixCollapseSize ? cfg.fixCollapseSize : cfg.fixSize;\n\n if (fixSize) {\n if (Object(esm[\"isNumber\"])(fixSize)) {\n width = fixSize;\n height = fixSize;\n } else {\n width = fixSize[0];\n height = fixSize[1];\n }\n } else {\n width = Math.max(cfgStyle.width, size[0]) || size[0];\n height = Math.max(cfgStyle.height, size[1]) || size[1];\n }\n\n cfgStyle.width = width + padding[1] + padding[3];\n cfgStyle.height = height + padding[0] + padding[2];\n var itemCacheSize = item.get('sizeCache');\n\n if (itemCacheSize) {\n itemCacheSize.width = cfgStyle.width;\n itemCacheSize.height = cfgStyle.height;\n }\n\n cfgStyle.x = -width / 2 - padding[3];\n cfgStyle.y = -height / 2 - padding[0]; // 下面这些属性需要覆盖默认样式与目前样式,但若在 cfg 中有指定则应该被 cfg 的相应配置覆盖。\n\n var strokeStyle = {\n stroke: cfg.color\n }; // 与 getShapeStyle 不同在于,update 时需要获取到当前的 style 进行融合。即新传入的配置项中没有涉及的属性,保留当前的配置。\n\n var keyShape = item.get('keyShape');\n var style = Object(esm[\"mix\"])({}, keyShape.attr(), strokeStyle, cfgStyle);\n\n if (cfg.style) {\n cfg.style.width = width;\n cfg.style.height = height;\n } else {\n cfg.style = {\n width: width,\n height: height\n };\n }\n\n this.updateShape(cfg, item, style, false);\n },\n updateShape: function updateShape(cfg, item, keyShapeStyle) {\n var keyShape = item.get('keyShape');\n var animate = cfg.animate === undefined ? this.options.animate : cfg.animate;\n\n if (animate && keyShape.animate) {\n keyShape.animate(keyShapeStyle, {\n duration: 200,\n easing: 'easeLinear'\n });\n } else {\n keyShape.attr(Object(tslib_es6[\"__assign\"])({}, keyShapeStyle));\n }\n\n this.updateLabel(cfg, item);\n }\n}, 'single-combo');\n// CONCATENATED MODULE: ./node_modules/@antv/g6-core/es/element/combos/index.js\n\n\n// CONCATENATED MODULE: ./node_modules/@antv/g6-core/es/element/nodes/simple-circle.js\n\n\n\n // 带有图标的圆,可用于拓扑图中\n\nelement_shape.registerNode('simple-circle', {\n // 自定义节点时的配置\n options: {\n size: global.defaultNode.size,\n style: {\n x: 0,\n y: 0,\n stroke: global.defaultNode.style.stroke,\n fill: global.defaultNode.style.fill,\n lineWidth: global.defaultNode.style.lineWidth\n },\n labelCfg: {\n style: {\n fill: global.nodeLabel.style.fill,\n fontSize: global.nodeLabel.style.fontSize,\n fontFamily: global.windowFontFamily\n }\n },\n stateStyles: Object(tslib_es6[\"__assign\"])({}, global.nodeStateStyles)\n },\n shapeType: 'simple-circle',\n // 文本位置\n labelPosition: 'center',\n shapeMap: {},\n drawShape: function drawShape(cfg, group) {\n var style = this.getShapeStyle(cfg);\n var name = this.type + \"-keyShape\";\n var keyShape = group.addShape('circle', {\n attrs: style,\n className: this.type + \"-keyShape\",\n name: name,\n draggable: true\n });\n group['shapeMap'][name] = keyShape;\n return keyShape;\n },\n\n /**\n * 获取节点的样式,供基于该节点自定义时使用\n * @param {Object} cfg 节点数据模型\n * @return {Object} 节点的样式\n */\n getShapeStyle: function getShapeStyle(cfg) {\n var defaultStyle = (this.mergeStyle || this.getOptions(cfg)).style;\n var strokeStyle = {\n stroke: cfg.color\n }; // 如果设置了color,则覆盖默认的stroke属性\n\n var style = Object(esm[\"deepMix\"])({}, defaultStyle, strokeStyle);\n var size = this.getSize(cfg);\n var r = size[0] / 2;\n\n var styles = Object(tslib_es6[\"__assign\"])({\n x: 0,\n y: 0,\n r: r\n }, style);\n\n return styles;\n },\n update: function update(cfg, item, updateType) {\n var size = this.getSize(cfg); // 下面这些属性需要覆盖默认样式与目前样式,但若在 cfg 中有指定则应该被 cfg 的相应配置覆盖。\n\n var strokeStyle = {\n stroke: cfg.color,\n r: size[0] / 2\n }; // 与 getShapeStyle 不同在于,update 时需要获取到当前的 style 进行融合。即新传入的配置项中没有涉及的属性,保留当前的配置。\n\n var keyShape = item.get('keyShape');\n var style = Object(esm[\"deepMix\"])({}, keyShape.attr(), strokeStyle, cfg.style);\n this.updateShape(cfg, item, style, true, updateType);\n }\n}, 'single-node');\n// CONCATENATED MODULE: ./node_modules/@antv/g6-core/es/element/nodes/simple-rect.js\n\n\n\n\nelement_shape.registerNode('simple-rect', {\n // 自定义节点时的配置\n options: {\n size: [100, 30],\n style: {\n radius: 0,\n stroke: global.defaultNode.style.stroke,\n fill: global.defaultNode.style.fill,\n lineWidth: global.defaultNode.style.lineWidth\n },\n // 文本样式配置\n labelCfg: {\n style: {\n fill: global.nodeLabel.style.fill,\n fontSize: global.nodeLabel.style.fontSize,\n fontFamily: global.windowFontFamily\n }\n },\n // 连接点,默认为左右\n // anchorPoints: [{ x: 0, y: 0.5 }, { x: 1, y: 0.5 }]\n anchorPoints: [[0, 0.5], [1, 0.5]],\n stateStyles: Object(tslib_es6[\"__assign\"])({}, global.nodeStateStyles)\n },\n shapeType: 'simple-rect',\n labelPosition: 'center',\n drawShape: function drawShape(cfg, group) {\n var style = this.getShapeStyle(cfg);\n var keyShape = group.addShape('rect', {\n attrs: style,\n className: this.type + \"-keyShape\",\n name: this.type + \"-keyShape\",\n draggable: true\n });\n return keyShape;\n },\n\n /**\n * 获取节点的样式,供基于该节点自定义时使用\n * @param {Object} cfg 节点数据模型\n * @return {Object} 节点的样式\n */\n getShapeStyle: function getShapeStyle(cfg) {\n var defaultStyle = (this.mergeStyle || this.getOptions(cfg)).style;\n var strokeStyle = {\n stroke: cfg.color\n }; // 如果设置了color,则覆盖默认的stroke属性\n\n var style = Object(esm[\"mix\"])({}, defaultStyle, strokeStyle);\n var size = this.getSize(cfg);\n var width = style.width || size[0];\n var height = style.height || size[1];\n\n var styles = Object(tslib_es6[\"__assign\"])({\n x: -width / 2,\n y: -height / 2,\n width: width,\n height: height\n }, style);\n\n return styles;\n },\n update: function update(cfg, item, updateType) {\n var group = item.getContainer(); // 这里不传 cfg 参数是因为 cfg.style 需要最后覆盖样式\n\n var defaultStyle = (this.mergeStyle || this.getOptions(cfg)).style;\n var size = this.getSize(cfg);\n var keyShape = item.get('keyShape');\n\n if (!cfg.size) {\n size[0] = keyShape.attr('width') || defaultStyle.width;\n size[1] = keyShape.attr('height') || defaultStyle.height;\n } // 下面这些属性需要覆盖默认样式与目前样式,但若在 cfg 中有指定则应该被 cfg 的相应配置覆盖。\n\n\n var strokeStyle = {\n stroke: cfg.color,\n x: -size[0] / 2,\n y: -size[1] / 2,\n width: size[0],\n height: size[1]\n }; // 与 getShapeStyle 不同在于,update 时需要获取到当前的 style 进行融合。即新传入的配置项中没有涉及的属性,保留当前的配置。\n\n var style = Object(esm[\"mix\"])({}, defaultStyle, keyShape.attr(), strokeStyle);\n style = Object(esm[\"mix\"])(style, cfg.style);\n this.updateShape(cfg, item, style, false, updateType);\n }\n}, 'single-node');\n// CONCATENATED MODULE: ./node_modules/@antv/g6-core/es/element/nodes/image.js\n\n\n\n/**\n * 基本的图片,可以添加文本,默认文本在图片的下面\n */\n\nelement_shape.registerNode('image', {\n options: {\n img: 'https://gw.alipayobjects.com/mdn/rms_f8c6a0/afts/img/A*eD7nT6tmYgAAAAAAAAAAAABkARQnAQ',\n size: 200,\n labelCfg: {\n style: {\n fontFamily: global.windowFontFamily\n }\n },\n clipCfg: {\n show: false,\n type: 'circle',\n // circle\n r: 50,\n // ellipse\n rx: 50,\n ry: 35,\n // rect\n width: 50,\n height: 35,\n // polygon\n points: [[30, 12], [12, 30], [30, 48], [48, 30]],\n // path\n path: [['M', 25, 25], ['L', 50, 25], ['A', 12.5, 12.5, 0, 1, 1, 50, 50], ['A', 12.5, 12.5, 0, 1, 0, 50, 50], ['L', 25, 75], ['Z']],\n // 坐标\n x: 0,\n y: 0 // clip 的属性样式\n // style: {\n // lineWidth: 1\n // },\n\n }\n },\n shapeType: 'image',\n labelPosition: 'bottom',\n drawShape: function drawShape(cfg, group) {\n var shapeType = this.shapeType;\n var style = this.getShapeStyle(cfg);\n delete style.fill;\n var shape = group.addShape(shapeType, {\n attrs: style,\n className: this.type + \"-keyShape\",\n name: this.type + \"-keyShape\",\n draggable: true\n });\n this.drawClip(cfg, shape);\n return shape;\n },\n drawClip: function drawClip(cfg, shape) {\n var clip = (this.mergeStyle || this.getOptions(cfg)).clipCfg;\n\n if (!clip.show) {\n return;\n } // 支持 circle、rect、ellipse、Polygon 及自定义 path clip\n\n\n var type = clip.type,\n x = clip.x,\n y = clip.y,\n style = clip.style;\n\n if (type === 'circle') {\n var r = clip.r;\n shape.setClip({\n type: 'circle',\n attrs: Object(tslib_es6[\"__assign\"])({\n r: r,\n x: x,\n y: y\n }, style)\n });\n } else if (type === 'rect') {\n var width = clip.width,\n height = clip.height;\n var rectX = x - width / 2;\n var rectY = y - height / 2;\n shape.setClip({\n type: 'rect',\n attrs: Object(tslib_es6[\"__assign\"])({\n x: rectX,\n y: rectY,\n width: width,\n height: height\n }, style)\n });\n } else if (type === 'ellipse') {\n var rx = clip.rx,\n ry = clip.ry;\n shape.setClip({\n type: 'ellipse',\n attrs: Object(tslib_es6[\"__assign\"])({\n x: x,\n y: y,\n rx: rx,\n ry: ry\n }, style)\n });\n } else if (type === 'polygon') {\n var points = clip.points;\n shape.setClip({\n type: 'polygon',\n attrs: Object(tslib_es6[\"__assign\"])({\n points: points\n }, style)\n });\n } else if (type === 'path') {\n var path = clip.path;\n shape.setClip({\n type: 'path',\n attrs: Object(tslib_es6[\"__assign\"])({\n path: path\n }, style)\n });\n }\n },\n getShapeStyle: function getShapeStyle(cfg) {\n var _a = this.mergeStyle || this.getOptions(cfg),\n defaultStyle = _a.style,\n img = _a.img;\n\n var size = this.getSize(cfg);\n var width = size[0];\n var height = size[1];\n\n if (defaultStyle) {\n width = defaultStyle.width || size[0];\n height = defaultStyle.height || size[1];\n }\n\n var style = Object(tslib_es6[\"__assign\"])({\n x: -width / 2,\n y: -height / 2,\n width: width,\n height: height,\n img: img\n }, defaultStyle);\n\n return style;\n },\n updateShapeStyle: function updateShapeStyle(cfg, item) {\n var group = item.getContainer();\n var shapeClassName = this.itemType + \"-shape\";\n var shape = group['shapeMap'][shapeClassName] || group.find(function (element) {\n return element.get('className') === shapeClassName;\n }) || item.getKeyShape();\n var shapeStyle = this.getShapeStyle(cfg);\n\n if (shape && !shape.destroyed) {\n shape.attr(shapeStyle);\n }\n }\n}, 'single-node');\n// CONCATENATED MODULE: ./node_modules/@antv/g6-core/es/element/nodes/index.js\n\n\n\n// CONCATENATED MODULE: ./node_modules/@antv/g6-core/es/element/arrow.js\n/* harmony default export */ var element_arrow = ({\n triangle: function triangle(width, length, d) {\n if (width === void 0) {\n width = 10;\n }\n\n if (length === void 0) {\n length = 15;\n }\n\n if (d === void 0) {\n d = 0;\n }\n\n var begin = d * 2;\n var path = \"M \" + begin + \",0 L \" + (begin + length) + \",-\" + width / 2 + \" L \" + (begin + length) + \",\" + width / 2 + \" Z\";\n return path;\n },\n vee: function vee(width, length, d) {\n if (width === void 0) {\n width = 15;\n }\n\n if (length === void 0) {\n length = 20;\n }\n\n if (d === void 0) {\n d = 0;\n }\n\n var begin = d * 2;\n var path = \"M \" + begin + \",0 L \" + (begin + length) + \",-\" + width / 2 + \"\\n L \" + (begin + 2 * length / 3) + \",0 L \" + (begin + length) + \",\" + width / 2 + \" Z\";\n return path;\n },\n circle: function circle(r, d) {\n if (r === void 0) {\n r = 5;\n }\n\n if (d === void 0) {\n d = 0;\n }\n\n var begin = d * 2;\n var path = \"M \" + begin + \", 0\\n a \" + r + \",\" + r + \" 0 1,0 \" + r * 2 + \",0\\n a \" + r + \",\" + r + \" 0 1,0 \" + -r * 2 + \",0\";\n return path;\n },\n rect: function rect(width, length, d) {\n if (width === void 0) {\n width = 10;\n }\n\n if (length === void 0) {\n length = 10;\n }\n\n if (d === void 0) {\n d = 0;\n }\n\n var begin = d * 2;\n var path = \"M \" + begin + \",\" + -width / 2 + \" \\n L \" + (begin + length) + \",\" + -width / 2 + \" \\n L \" + (begin + length) + \",\" + width / 2 + \" \\n L \" + begin + \",\" + width / 2 + \" Z\";\n return path;\n },\n diamond: function diamond(width, length, d) {\n if (width === void 0) {\n width = 15;\n }\n\n if (length === void 0) {\n length = 15;\n }\n\n if (d === void 0) {\n d = 0;\n }\n\n var begin = d * 2;\n var path = \"M \" + begin + \",0 \\n L \" + (begin + length / 2) + \",\" + -width / 2 + \" \\n L \" + (begin + length) + \",0 \\n L \" + (begin + length / 2) + \",\" + width / 2 + \" Z\";\n return path;\n },\n triangleRect: function triangleRect(tWidth, tLength, rWidth, rLength, gap, d) {\n if (tWidth === void 0) {\n tWidth = 15;\n }\n\n if (tLength === void 0) {\n tLength = 15;\n }\n\n if (rWidth === void 0) {\n rWidth = 15;\n }\n\n if (rLength === void 0) {\n rLength = 3;\n }\n\n if (gap === void 0) {\n gap = 5;\n }\n\n if (d === void 0) {\n d = 0;\n }\n\n var begin = d * 2;\n var rectBegin = begin + tLength + gap;\n var path = \"M \" + begin + \",0 L \" + (begin + tLength) + \",-\" + tWidth / 2 + \" L \" + (begin + tLength) + \",\" + tWidth / 2 + \" Z\\n M \" + rectBegin + \", -\" + rWidth / 2 + \"\\n L \" + (rectBegin + rLength) + \" -\" + rWidth / 2 + \"\\n L \" + (rectBegin + rLength) + \" \" + rWidth / 2 + \"\\n L \" + rectBegin + \" \" + rWidth / 2 + \"\\n Z\";\n return path;\n }\n});\n// CONCATENATED MODULE: ./node_modules/@antv/g6-core/es/element/marker.js\n/* harmony default export */ var marker = ({\n collapse: function collapse(x, y, r) {\n return [['M', x - r, y], ['a', r, r, 0, 1, 0, r * 2, 0], ['a', r, r, 0, 1, 0, -r * 2, 0], ['M', x - r + 4, y], ['L', x + r - 4, y]];\n },\n expand: function expand(x, y, r) {\n return [['M', x - r, y], ['a', r, r, 0, 1, 0, r * 2, 0], ['a', r, r, 0, 1, 0, -r * 2, 0], ['M', x - r + 4, y], ['L', x - r + 2 * r - 4, y], ['M', x - r + r, y - r + 4], ['L', x, y + r - 4]];\n },\n upTriangle: function upTriangle(x, y, r) {\n var l1 = r * Math.cos(Math.PI / 6);\n var l2 = r * Math.sin(Math.PI / 6);\n return [['M', x - l1, y + l2], ['L', x + l1, y + l2], ['L', x, y - r], ['Z']];\n },\n downTriangle: function downTriangle(x, y, r) {\n var l1 = r * Math.cos(Math.PI / 6);\n var l2 = r * Math.sin(Math.PI / 6);\n return [['M', x - l1, y - l2], ['L', x + l1, y - l2], ['L', x, y + r], ['Z']];\n }\n});\n// CONCATENATED MODULE: ./node_modules/@antv/g6-core/es/element/index.js\n\n\n\n\n\n\n\n\n/* harmony default export */ var es_element = (element_shape);\n// CONCATENATED MODULE: ./node_modules/@antv/g6-core/es/util/color.js\nvar defaultSubjectColors = ['#5F95FF', '#61DDAA', '#65789B', '#F6BD16', '#7262FD', '#78D3F8', '#9661BC', '#F6903D', '#008685', '#F08BB4'];\n// CONCATENATED MODULE: ./node_modules/@antv/g6-core/es/util/index.js\n\n\n\n\n\n\n\nvar util_transform = matrix_util_esm[\"ext\"].transform;\n\nvar Util = Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, base_namespaceObject), graphic_namespaceObject), path_namespaceObject), math_namespaceObject), color_namespaceObject), {\n transform: util_transform,\n mat3: matrix_util_esm[\"mat3\"]\n});\n\n/* harmony default export */ var util = (Util);\n// CONCATENATED MODULE: ./node_modules/@antv/g6-core/es/graph/controller/layout.js\n\n\n\n\nvar layout_LayoutController =\n/** @class */\nfunction () {\n function LayoutController(graph) {\n this.graph = graph;\n this.layoutCfg = graph.get('layout') || {};\n this.layoutType = this.getLayoutType();\n this.layoutMethods = [];\n this.initLayout();\n } // eslint-disable-next-line class-methods-use-this\n\n\n LayoutController.prototype.initLayout = function () {// no data before rendering\n };\n\n LayoutController.prototype.getLayoutType = function () {\n return this.getLayoutCfgType(this.layoutCfg);\n };\n\n LayoutController.prototype.getLayoutCfgType = function (layoutCfg) {\n var type = layoutCfg.type; // type should be top priority\n\n if (type) {\n return type;\n }\n\n var pipes = layoutCfg.pipes;\n\n if (Array.isArray(pipes)) {\n return pipes.map(function (pipe) {\n return (pipe === null || pipe === void 0 ? void 0 : pipe.type) || '';\n });\n }\n\n return null;\n };\n\n LayoutController.prototype.isLayoutTypeSame = function (cfg) {\n var current = this.getLayoutCfgType(cfg); // already has pipes\n\n if (Array.isArray(this.layoutType)) {\n return this.layoutType.every(function (type, index) {\n return type === current[index];\n });\n }\n\n return (cfg === null || cfg === void 0 ? void 0 : cfg.type) === this.layoutType;\n }; // 绘制\n\n\n LayoutController.prototype.refreshLayout = function () {\n var graph = this.graph;\n if (!graph) return;\n\n if (graph.get('animate')) {\n graph.positionsAnimate();\n } else {\n graph.refreshPositions();\n }\n }; // 更换布局\n\n\n LayoutController.prototype.changeLayout = function (cfg) {\n this.layoutCfg = cfg;\n this.destoryLayoutMethods();\n this.layout();\n }; // 更换数据\n\n\n LayoutController.prototype.changeData = function () {\n this.destoryLayoutMethods();\n this.layout();\n };\n\n LayoutController.prototype.destoryLayoutMethods = function () {\n var layoutMethods = this.layoutMethods;\n layoutMethods === null || layoutMethods === void 0 ? void 0 : layoutMethods.forEach(function (layoutMethod) {\n layoutMethod.destroy();\n });\n this.layoutMethods = [];\n }; // 销毁布局,不能使用 this.destroy,因为 controller 还需要被使用,只是把布局算法销毁\n\n\n LayoutController.prototype.destroyLayout = function () {\n var graph = this.graph;\n this.destoryLayoutMethods();\n graph.set('layout', undefined);\n this.layoutCfg = undefined;\n this.layoutType = undefined;\n this.layoutMethods = undefined;\n }; // 从 this.graph 获取数据\n\n\n LayoutController.prototype.setDataFromGraph = function () {\n var nodes = [];\n var hiddenNodes = [];\n var edges = [];\n var hiddenEdges = [];\n var comboEdges = [];\n var combos = [];\n var hiddenCombos = [];\n var nodeItems = this.graph.getNodes();\n var edgeItems = this.graph.getEdges();\n var comboItems = this.graph.getCombos();\n var nodeLength = nodeItems.length;\n\n for (var i = 0; i < nodeLength; i++) {\n var nodeItem = nodeItems[i];\n if (!nodeItem || nodeItem.destroyed) continue;\n var model = nodeItem.getModel();\n\n if (!nodeItem.isVisible()) {\n hiddenNodes.push(model);\n continue;\n }\n\n nodes.push(model);\n }\n\n var edgeLength = edgeItems.length;\n\n for (var i = 0; i < edgeLength; i++) {\n var edgeItem = edgeItems[i];\n if (!edgeItem || edgeItem.destroyed) continue;\n var model = edgeItem.getModel();\n\n if (!edgeItem.isVisible()) {\n hiddenEdges.push(model);\n continue;\n }\n\n if (!model.isComboEdge) edges.push(model);else comboEdges.push(model);\n }\n\n var comboLength = comboItems.length;\n\n for (var i = 0; i < comboLength; i++) {\n var comboItem = comboItems[i];\n if (comboItem.destroyed) continue;\n var model = comboItem.getModel();\n\n if (!comboItem.isVisible()) {\n hiddenEdges.push(model);\n continue;\n }\n\n combos.push(model);\n }\n\n return {\n nodes: nodes,\n hiddenNodes: hiddenNodes,\n edges: edges,\n hiddenEdges: hiddenEdges,\n combos: combos,\n hiddenCombos: hiddenCombos,\n comboEdges: comboEdges\n };\n };\n\n LayoutController.prototype.reLayoutMethod = function (layoutMethod, layoutCfg) {\n var _this = this;\n\n return new Promise(function (reslove, reject) {\n var graph = _this.graph;\n var layoutType = layoutCfg === null || layoutCfg === void 0 ? void 0 : layoutCfg.type; // 每个布局方法都需要注册\n\n layoutCfg.onLayoutEnd = function () {\n graph.emit('aftersublayout', {\n type: layoutType\n });\n reslove();\n };\n\n layoutMethod.init(_this.data);\n\n if (layoutType === 'force') {\n layoutMethod.ticking = false;\n layoutMethod.forceSimulation.stop();\n }\n\n graph.emit('beforesublayout', {\n type: layoutType\n });\n layoutMethod.execute();\n if (layoutMethod.isCustomLayout && layoutCfg.onLayoutEnd) layoutCfg.onLayoutEnd();\n });\n }; // 重新布局\n\n\n LayoutController.prototype.relayout = function (reloadData) {\n var _this = this;\n\n var _a = this,\n graph = _a.graph,\n layoutMethods = _a.layoutMethods,\n layoutCfg = _a.layoutCfg;\n\n if (reloadData) {\n this.data = this.setDataFromGraph();\n var nodes = this.data.nodes;\n\n if (!nodes) {\n return false;\n }\n\n this.initPositions(layoutCfg.center, nodes);\n }\n\n graph.emit('beforelayout');\n var start = Promise.resolve();\n layoutMethods === null || layoutMethods === void 0 ? void 0 : layoutMethods.forEach(function (layoutMethod, index) {\n var currentCfg = layoutCfg[index];\n start = start.then(function () {\n return _this.reLayoutMethod(layoutMethod, currentCfg);\n });\n });\n start.then(function () {\n if (layoutCfg.onAllLayoutEnd) layoutCfg.onAllLayoutEnd();\n }).catch(function (error) {\n console.warn('relayout failed', error);\n });\n }; // 筛选参与布局的nodes和edges\n\n\n LayoutController.prototype.filterLayoutData = function (data, cfg) {\n var nodes = data.nodes,\n edges = data.edges,\n rest = Object(tslib_es6[\"__rest\"])(data, [\"nodes\", \"edges\"]);\n\n if (!nodes) {\n return data;\n }\n\n var nodesFilter;\n var edegsFilter;\n\n if (Object(esm[\"isFunction\"])(cfg === null || cfg === void 0 ? void 0 : cfg.nodesFilter)) {\n nodesFilter = cfg.nodesFilter;\n } else {\n nodesFilter = function nodesFilter() {\n return true;\n };\n }\n\n var fNodes = nodes.filter(nodesFilter);\n\n if (Object(esm[\"isFunction\"])(cfg === null || cfg === void 0 ? void 0 : cfg.edgesFilter)) {\n edegsFilter = cfg.edgesFilter;\n } else {\n var nodesMap_1 = fNodes.reduce(function (acc, cur) {\n acc[cur.id] = true;\n return acc;\n }, {});\n\n edegsFilter = function edegsFilter(edge) {\n return nodesMap_1[edge.source] && nodesMap_1[edge.target];\n };\n }\n\n return Object(tslib_es6[\"__assign\"])({\n nodes: fNodes,\n edges: edges.filter(edegsFilter)\n }, rest);\n };\n\n LayoutController.prototype.getLayoutBBox = function (nodes) {\n var graph = this.graph;\n var graphGroupNodes = Object(esm[\"groupBy\"])(graph.getNodes(), function (n) {\n return n.getModel().layoutOrder;\n });\n var layoutNodes = Object.values(graphGroupNodes).map(function (value) {\n var bbox = calculationItemsBBox(value);\n bbox.size = [bbox.width, bbox.height];\n return bbox;\n });\n var groupNodes = Object.values(Object(esm[\"groupBy\"])(nodes, 'layoutOrder'));\n return {\n groupNodes: groupNodes,\n layoutNodes: layoutNodes\n };\n }; // 控制布局动画\n // eslint-disable-next-line class-methods-use-this\n\n\n LayoutController.prototype.layoutAnimate = function () {}; // 将当前节点的平均中心移动到原点\n\n\n LayoutController.prototype.moveToZero = function () {\n var graph = this.graph;\n var data = graph.get('data');\n var nodes = data.nodes;\n\n if (nodes[0].x === undefined || nodes[0].x === null || base_isNaN(nodes[0].x)) {\n return;\n }\n\n var meanCenter = [0, 0];\n var nodeLength = nodes.length;\n\n for (var i = 0; i < nodeLength; i++) {\n var node = nodes[i];\n meanCenter[0] += node.x;\n meanCenter[1] += node.y;\n }\n\n meanCenter[0] /= nodes.length;\n meanCenter[1] /= nodes.length;\n\n for (var i = 0; i < nodeLength; i++) {\n var node = nodes[i];\n node.x -= meanCenter[0];\n node.y -= meanCenter[1];\n }\n }; // 初始化节点到 center 附近\n\n\n LayoutController.prototype.initPositions = function (center, nodes) {\n var graph = this.graph;\n\n if (!nodes) {\n return false;\n }\n\n var nodeLength = nodes ? nodes.length : 0;\n if (!nodeLength) return;\n var width = graph.get('width') * 0.85;\n var height = graph.get('height') * 0.85;\n var horiNum = Math.ceil(Math.sqrt(nodeLength) * (width / height));\n var vertiNum = Math.ceil(nodeLength / horiNum);\n var horiGap = width / (horiNum - 1);\n var vertiGap = height / (vertiNum - 1);\n if (!isFinite(horiGap) || !horiGap) horiGap = 0;\n if (!isFinite(vertiGap) || !horiGap) vertiGap = 0;\n var beginX = center[0] - width / 2;\n var beginY = center[1] - height / 2;\n var allHavePos = true;\n\n for (var i = 0; i < nodeLength; i++) {\n var node = nodes[i];\n\n if (base_isNaN(+node.x)) {\n allHavePos = false;\n node.x = i % horiNum * horiGap + beginX;\n }\n\n if (base_isNaN(+node.y)) {\n allHavePos = false;\n node.y = Math.floor(i / horiNum) * vertiGap + beginY;\n }\n }\n\n return allHavePos;\n };\n\n LayoutController.prototype.destroy = function () {\n this.graph = null;\n this.destoryLayoutMethods();\n this.destroyed = true;\n };\n\n return LayoutController;\n}();\n\n/* harmony default export */ var controller_layout = (layout_LayoutController);\n// CONCATENATED MODULE: ./node_modules/@antv/g6-core/es/graph/controller/event.js\nvar event_EventController =\n/** @class */\nfunction () {\n function EventController(graph) {\n this.graph = graph;\n this.destroyed = false;\n this.initEvents();\n }\n\n return EventController;\n}();\n\n/* harmony default export */ var controller_event = (event_EventController);\n// CONCATENATED MODULE: ./node_modules/@antv/g6-core/es/interface/graph.js\n\n// CONCATENATED MODULE: ./node_modules/@antv/g6-core/es/interface/item.js\n\n// CONCATENATED MODULE: ./node_modules/@antv/g6-core/es/interface/shape.js\n\n// CONCATENATED MODULE: ./node_modules/@antv/g6-core/es/interface/index.js\n\n\n\n\n// CONCATENATED MODULE: ./node_modules/@antv/g6-core/es/types/index.js\n // Behavior type file\n\nvar G6Event;\n\n(function (G6Event) {\n // common events\n G6Event[\"CLICK\"] = \"click\";\n G6Event[\"DBLCLICK\"] = \"dblclick\";\n G6Event[\"MOUSEDOWN\"] = \"mousedown\";\n G6Event[\"MOUDEUP\"] = \"mouseup\";\n G6Event[\"CONTEXTMENU\"] = \"contextmenu\";\n G6Event[\"MOUSEENTER\"] = \"mouseenter\";\n G6Event[\"MOUSEOUT\"] = \"mouseout\";\n G6Event[\"MOUSEOVER\"] = \"mouseover\";\n G6Event[\"MOUSEMOVE\"] = \"mousemove\";\n G6Event[\"MOUSELEAVE\"] = \"mouseleave\";\n G6Event[\"DRAGSTART\"] = \"dragstart\";\n G6Event[\"DRAGEND\"] = \"dragend\";\n G6Event[\"DRAG\"] = \"drag\";\n G6Event[\"DRAGENTER\"] = \"dragenter\";\n G6Event[\"DRAGLEAVE\"] = \"dragleave\";\n G6Event[\"DRAGOVER\"] = \"dragover\";\n G6Event[\"DRAGOUT\"] = \"dragout\";\n G6Event[\"DDROP\"] = \"drop\";\n G6Event[\"KEYUP\"] = \"keyup\";\n G6Event[\"KEYDOWN\"] = \"keydown\";\n G6Event[\"WHEEL\"] = \"wheel\";\n G6Event[\"FOCUS\"] = \"focus\";\n G6Event[\"BLUR\"] = \"blur\"; // touch events\n\n G6Event[\"TOUCHSTART\"] = \"touchstart\";\n G6Event[\"TOUCHMOVE\"] = \"touchmove\";\n G6Event[\"TOUCHEND\"] = \"touchend\";\n G6Event[\"CANVAS_TOUCHSTART\"] = \"canvas:touchstart\";\n G6Event[\"CANVAS_TOUCHMOVE\"] = \"canvas:touchmove\";\n G6Event[\"CANVAS_TOUCHEND\"] = \"canvas:touchend\";\n G6Event[\"NODE_TOUCHSTART\"] = \"node:touchstart\";\n G6Event[\"NODE_TOUCHMOVE\"] = \"node:touchmove\";\n G6Event[\"NODE_TOUCHEND\"] = \"node:touchend\";\n G6Event[\"COMBO_TOUCHSTART\"] = \"combo:touchstart\";\n G6Event[\"COMBO_TOUCHMOVE\"] = \"combo:touchmove\";\n G6Event[\"COMBO_TOUCHEND\"] = \"combo:touchend\";\n G6Event[\"EDGE_TOUCHSTART\"] = \"edge:touchstart\";\n G6Event[\"EDGE_TOUCHMOVE\"] = \"edge:touchmove\";\n G6Event[\"EDGE_TOUCHEND\"] = \"edge:touchend\"; // node events\n\n G6Event[\"NODE_CONTEXTMENU\"] = \"node:contextmenu\";\n G6Event[\"NODE_CLICK\"] = \"node:click\";\n G6Event[\"NODE_DBLCLICK\"] = \"node:dblclick\";\n G6Event[\"NODE_MOUSEDOWN\"] = \"node:mousedown\";\n G6Event[\"NODE_MOUSEUP\"] = \"node:mouseup\";\n G6Event[\"NODE_MOUSEENTER\"] = \"node:mouseenter\";\n G6Event[\"NODE_MOUSELEAVE\"] = \"node:mouseleave\";\n G6Event[\"NODE_MOUSEMOVE\"] = \"node:mousemove\";\n G6Event[\"NODE_MOUSEOUT\"] = \"node:mouseout\";\n G6Event[\"NODE_MOUSEOVER\"] = \"node:mouseover\";\n G6Event[\"NODE_DROP\"] = \"node:drop\";\n G6Event[\"NODE_DRAGOVER\"] = \"node:dragover\";\n G6Event[\"NODE_DRAGENTER\"] = \"node:dragenter\";\n G6Event[\"NODE_DRAGLEAVE\"] = \"node:dragleave\";\n G6Event[\"NODE_DRAGSTART\"] = \"node:dragstart\";\n G6Event[\"NODE_DRAG\"] = \"node:drag\";\n G6Event[\"NODE_DRAGEND\"] = \"node:dragend\";\n G6Event[\"NODE_TAP\"] = \"node:tap\";\n G6Event[\"NODE_PANSTART\"] = \"node:panstart\";\n G6Event[\"NODE_PANMOVE\"] = \"node:panmove\";\n G6Event[\"NODE_PANEND\"] = \"node:panend\"; // combo, extends from nodes\n\n G6Event[\"COMBO_CONTEXTMENU\"] = \"combo:contextmenu\";\n G6Event[\"COMBO_CLICK\"] = \"combo:click\";\n G6Event[\"COMBO_DBLCLICK\"] = \"combo:dblclick\";\n G6Event[\"COMBO_MOUSEDOWN\"] = \"combo:mousedown\";\n G6Event[\"COMBO_MOUSEUP\"] = \"combo:mouseup\";\n G6Event[\"COMBO_MOUSEENTER\"] = \"combo:mouseenter\";\n G6Event[\"COMBO_MOUSELEAVE\"] = \"combo:mouseleave\";\n G6Event[\"COMBO_MOUSEMOVE\"] = \"combo:mousemove\";\n G6Event[\"COMBO_MOUSEOUT\"] = \"combo:mouseout\";\n G6Event[\"COMBO_MOUSEOVER\"] = \"combo:mouseover\";\n G6Event[\"COMBO_DROP\"] = \"combo:drop\";\n G6Event[\"COMBO_DRAGOVER\"] = \"combo:dragover\";\n G6Event[\"COMBO_DRAGENTER\"] = \"combo:dragenter\";\n G6Event[\"COMBO_DRAGLEAVE\"] = \"combo:dragleave\";\n G6Event[\"COMBO_DRAGSTART\"] = \"combo:dragstart\";\n G6Event[\"COMBO_DRAG\"] = \"combo:drag\";\n G6Event[\"COMBO_DRAGEND\"] = \"combo:dragend\";\n G6Event[\"COMBO_TAP\"] = \"combo:tap\";\n G6Event[\"COMBO_PANSTART\"] = \"combo:panstart\";\n G6Event[\"COMBO_PANMOVE\"] = \"combo:panmove\";\n G6Event[\"COMBO_PANEND\"] = \"combo:panend\"; // edge events\n\n G6Event[\"EDGE_CONTEXTMENU\"] = \"edge:contextmenu\";\n G6Event[\"EDGE_CLICK\"] = \"edge:click\";\n G6Event[\"EDGE_DBLCLICK\"] = \"edge:dblclick\";\n G6Event[\"EDGE_MOUSEDOWN\"] = \"edge:mousedown\";\n G6Event[\"EDGE_MOUSEUP\"] = \"edge:mouseup\";\n G6Event[\"EDGE_MOUSEENTER\"] = \"edge:mouseenter\";\n G6Event[\"EDGE_MOUSELEAVE\"] = \"edge:mouseleave\";\n G6Event[\"EDGE_MOUSEMOVE\"] = \"edge:mousemove\";\n G6Event[\"EDGE_MOUSEOUT\"] = \"edge:mouseout\";\n G6Event[\"EDGE_MOUSEOVER\"] = \"edge:mouseover\";\n G6Event[\"EDGE_DROP\"] = \"edge:drop\";\n G6Event[\"EDGE_DRAGOVER\"] = \"edge:dragover\";\n G6Event[\"EDGE_DRAGENTER\"] = \"edge:dragenter\";\n G6Event[\"EDGE_DRAGLEAVE\"] = \"edge:dragleave\"; // canvas events\n\n G6Event[\"CANVAS_CONTEXTMENU\"] = \"canvas:contextmenu\";\n G6Event[\"CANVAS_CLICK\"] = \"canvas:click\";\n G6Event[\"CANVAS_DBLCLICK\"] = \"canvas:dblclick\";\n G6Event[\"CANVAS_MOUSEDOWN\"] = \"canvas:mousedown\";\n G6Event[\"CANVAS_MOUSEUP\"] = \"canvas:mouseup\";\n G6Event[\"CANVAS_MOUSEENTER\"] = \"canvas:mouseenter\";\n G6Event[\"CANVAS_MOUSELEAVE\"] = \"canvas:mouseleave\";\n G6Event[\"CANVAS_MOUSEMOVE\"] = \"canvas:mousemove\";\n G6Event[\"CANVAS_MOUSEOUT\"] = \"canvas:mouseout\";\n G6Event[\"CANVAS_MOUSEOVER\"] = \"canvas:mouseover\";\n G6Event[\"CANVAS_DROP\"] = \"canvas:drop\";\n G6Event[\"CANVAS_DRAGENTER\"] = \"canvas:dragenter\";\n G6Event[\"CANVAS_DRAGLEAVE\"] = \"canvas:dragleave\";\n G6Event[\"CANVAS_DRAGSTART\"] = \"canvas:dragstart\";\n G6Event[\"CANVAS_DRAG\"] = \"canvas:drag\";\n G6Event[\"CANVAS_DRAGEND\"] = \"canvas:dragend\";\n G6Event[\"CANVAS_TAP\"] = \"canvas:tap\";\n G6Event[\"CANVAS_PANSTART\"] = \"canvas:panstart\";\n G6Event[\"CANVAS_PANMOVE\"] = \"canvas:panmove\";\n G6Event[\"CANVAS_PANEND\"] = \"canvas:panend\"; // timing events\n\n G6Event[\"BEFORERENDER\"] = \"beforerender\";\n G6Event[\"AFTERRENDER\"] = \"afterrender\";\n G6Event[\"BEFOREADDITEM\"] = \"beforeadditem\";\n G6Event[\"AFTERADDITEM\"] = \"afteradditem\";\n G6Event[\"BEFOREREMOVEITEM\"] = \"beforeremoveitem\";\n G6Event[\"AFTERREMOVEITEM\"] = \"afterremoveitem\";\n G6Event[\"BEFOREUPDATEITEM\"] = \"beforeupdateitem\";\n G6Event[\"AFTERUPDATEITEM\"] = \"afterupdateitem\";\n G6Event[\"BEFOREITEMVISIBILITYCHANGE\"] = \"beforeitemvisibilitychange\";\n G6Event[\"AFTERITEMVISIBILITYCHANGE\"] = \"afteritemvisibilitychange\";\n G6Event[\"BEFOREITEMSTATECHANGE\"] = \"beforeitemstatechange\";\n G6Event[\"AFTERITEMSTATECHANGE\"] = \"afteritemstatechange\";\n G6Event[\"BEFOREITEMREFRESH\"] = \"beforeitemrefresh\";\n G6Event[\"AFTERITEMREFRESH\"] = \"afteritemrefresh\";\n G6Event[\"BEFOREITEMSTATESCLEAR\"] = \"beforeitemstatesclear\";\n G6Event[\"AFTERITEMSTATESCLEAR\"] = \"afteritemstatesclear\";\n G6Event[\"BEFOREMODECHANGE\"] = \"beforemodechange\";\n G6Event[\"AFTERMODECHANGE\"] = \"aftermodechange\";\n G6Event[\"BEFORELAYOUT\"] = \"beforelayout\";\n G6Event[\"AFTERLAYOUT\"] = \"afterlayout\";\n G6Event[\"BEFORECREATEEDGE\"] = \"beforecreateedge\";\n G6Event[\"AFTERCREATEEDGE\"] = \"aftercreateedge\";\n G6Event[\"BEFOREGRAPHREFRESHPOSITION\"] = \"beforegraphrefreshposition\";\n G6Event[\"AFTERGRAPHREFRESHPOSITION\"] = \"aftergraphrefreshposition\";\n G6Event[\"BEFOREGRAPHREFRESH\"] = \"beforegraphrefresh\";\n G6Event[\"AFTERGRAPHREFRESH\"] = \"aftergraphrefresh\";\n G6Event[\"BEFOREANIMATE\"] = \"beforeanimate\";\n G6Event[\"AFTERANIMATE\"] = \"afteranimate\";\n G6Event[\"BEFOREPAINT\"] = \"beforepaint\";\n G6Event[\"AFTERPAINT\"] = \"afterpaint\";\n G6Event[\"BEFORECOLLAPSEEXPANDCOMBO\"] = \"beforecollapseexpandcombo\";\n G6Event[\"AFTERCOLLAPSEEXPANDCOMBO\"] = \"aftercollapseexpandcombo\";\n G6Event[\"GRAPHSTATECHANGE\"] = \"graphstatechange\";\n G6Event[\"AFTERACTIVATERELATIONS\"] = \"afteractivaterelations\";\n G6Event[\"NODESELECTCHANGE\"] = \"nodeselectchange\";\n G6Event[\"TOOLTIPCHANGE\"] = \"tooltipchange\";\n G6Event[\"WHEELZOOM\"] = \"wheelzoom\";\n G6Event[\"VIEWPORTCHANGE\"] = \"viewportchange\";\n G6Event[\"DRAGNODEEND\"] = \"dragnodeend\";\n G6Event[\"STACKCHANGE\"] = \"stackchange\"; // Mobile event support\n\n G6Event[\"TAP\"] = \"tap\";\n G6Event[\"PINCHSTART\"] = \"pinchstart\";\n G6Event[\"PINCHMOVE\"] = \"pinchmove\";\n G6Event[\"PANSTART\"] = \"panstart\";\n G6Event[\"PANMOVE\"] = \"panmove\";\n G6Event[\"PANEND\"] = \"panend\";\n})(G6Event || (G6Event = {}));\n// CONCATENATED MODULE: ./node_modules/@antv/g6-core/es/index.js\n\n\n\n\n // 用于 PC 和 Mobile 端分别实现 layout 和 updateLayoutCfg 方法\n\n\n\n\n\n\n\nvar registerNode = es_element.registerNode;\nvar registerEdge = es_element.registerEdge;\nvar registerCombo = es_element.registerCombo;\nvar registerBehavior = es_behavior.registerBehavior;\nvar BaseGlobal = global;\n\n\n/* harmony default export */ var g6_core_es = ({\n version: global.version,\n AbstractGraph: graph_graph,\n BaseGlobal: BaseGlobal,\n Util: util,\n Shape: es_element,\n Node: item_node,\n Edge: item_edge,\n Combo: item_combo,\n Hull: item_hull,\n registerNode: es_element.registerNode,\n registerEdge: es_element.registerEdge,\n registerCombo: es_element.registerCombo,\n registerBehavior: es_behavior.registerBehavior,\n Arrow: element_arrow,\n Marker: marker,\n AbstractLayout: controller_layout,\n AbstractEvent: controller_event\n});\n// EXTERNAL MODULE: ./node_modules/@antv/algorithm/lib/asyncIndex.js\nvar asyncIndex = __webpack_require__(281);\n\n// EXTERNAL MODULE: ./node_modules/@antv/g-canvas/esm/index.js\nvar g_canvas_esm = __webpack_require__(44);\n\n// EXTERNAL MODULE: ./node_modules/@antv/g-svg/esm/index.js\nvar g_svg_esm = __webpack_require__(62);\n\n// EXTERNAL MODULE: ./node_modules/color/index.js\nvar node_modules_color = __webpack_require__(85);\nvar color_default = /*#__PURE__*/__webpack_require__.n(node_modules_color);\n\n// EXTERNAL MODULE: ./node_modules/tinycolor2/tinycolor.js\nvar tinycolor = __webpack_require__(94);\nvar tinycolor_default = /*#__PURE__*/__webpack_require__.n(tinycolor);\n\n// CONCATENATED MODULE: ./node_modules/@ant-design/colors/dist/index.esm.js\n\n\nvar hueStep = 2; // 色相阶梯\n\nvar saturationStep = 0.16; // 饱和度阶梯,浅色部分\n\nvar saturationStep2 = 0.05; // 饱和度阶梯,深色部分\n\nvar brightnessStep1 = 0.05; // 亮度阶梯,浅色部分\n\nvar brightnessStep2 = 0.15; // 亮度阶梯,深色部分\n\nvar lightColorCount = 5; // 浅色数量,主色上\n\nvar darkColorCount = 4; // 深色数量,主色下\n// 暗色主题颜色映射关系表\n\nvar darkColorMap = [{\n index: 7,\n opacity: 0.15\n}, {\n index: 6,\n opacity: 0.25\n}, {\n index: 5,\n opacity: 0.3\n}, {\n index: 5,\n opacity: 0.45\n}, {\n index: 5,\n opacity: 0.65\n}, {\n index: 5,\n opacity: 0.85\n}, {\n index: 4,\n opacity: 0.9\n}, {\n index: 3,\n opacity: 0.95\n}, {\n index: 2,\n opacity: 0.97\n}, {\n index: 1,\n opacity: 0.98\n}];\n\nfunction getHue(hsv, i, light) {\n var hue; // 根据色相不同,色相转向不同\n\n if (Math.round(hsv.h) >= 60 && Math.round(hsv.h) <= 240) {\n hue = light ? Math.round(hsv.h) - hueStep * i : Math.round(hsv.h) + hueStep * i;\n } else {\n hue = light ? Math.round(hsv.h) + hueStep * i : Math.round(hsv.h) - hueStep * i;\n }\n\n if (hue < 0) {\n hue += 360;\n } else if (hue >= 360) {\n hue -= 360;\n }\n\n return hue;\n}\n\nfunction getSaturation(hsv, i, light) {\n // grey color don't change saturation\n if (hsv.h === 0 && hsv.s === 0) {\n return hsv.s;\n }\n\n var saturation;\n\n if (light) {\n saturation = hsv.s - saturationStep * i;\n } else if (i === darkColorCount) {\n saturation = hsv.s + saturationStep;\n } else {\n saturation = hsv.s + saturationStep2 * i;\n } // 边界值修正\n\n\n if (saturation > 1) {\n saturation = 1;\n } // 第一格的 s 限制在 0.06-0.1 之间\n\n\n if (light && i === lightColorCount && saturation > 0.1) {\n saturation = 0.1;\n }\n\n if (saturation < 0.06) {\n saturation = 0.06;\n }\n\n return Number(saturation.toFixed(2));\n}\n\nfunction getValue(hsv, i, light) {\n var value;\n\n if (light) {\n value = hsv.v + brightnessStep1 * i;\n } else {\n value = hsv.v - brightnessStep2 * i;\n }\n\n if (value > 1) {\n value = 1;\n }\n\n return Number(value.toFixed(2));\n}\n\nfunction generate(color) {\n var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var patterns = [];\n var pColor = tinycolor_default()(color);\n\n for (var i = lightColorCount; i > 0; i -= 1) {\n var hsv = pColor.toHsv();\n var colorString = tinycolor_default()({\n h: getHue(hsv, i, true),\n s: getSaturation(hsv, i, true),\n v: getValue(hsv, i, true)\n }).toHexString();\n patterns.push(colorString);\n }\n\n patterns.push(pColor.toHexString());\n\n for (var _i = 1; _i <= darkColorCount; _i += 1) {\n var _hsv = pColor.toHsv();\n\n var _colorString = tinycolor_default()({\n h: getHue(_hsv, _i),\n s: getSaturation(_hsv, _i),\n v: getValue(_hsv, _i)\n }).toHexString();\n\n patterns.push(_colorString);\n } // dark theme patterns\n\n\n if (opts.theme === 'dark') {\n return darkColorMap.map(function (_ref) {\n var index = _ref.index,\n opacity = _ref.opacity;\n var darkColorString = tinycolor_default.a.mix(opts.backgroundColor || '#141414', patterns[index], opacity * 100).toHexString();\n return darkColorString;\n });\n }\n\n return patterns;\n}\n\nvar presetPrimaryColors = {\n red: '#F5222D',\n volcano: '#FA541C',\n orange: '#FA8C16',\n gold: '#FAAD14',\n yellow: '#FADB14',\n lime: '#A0D911',\n green: '#52C41A',\n cyan: '#13C2C2',\n blue: '#1890FF',\n geekblue: '#2F54EB',\n purple: '#722ED1',\n magenta: '#EB2F96',\n grey: '#666666'\n};\nvar presetPalettes = {};\nvar presetDarkPalettes = {};\nObject.keys(presetPrimaryColors).forEach(function (key) {\n presetPalettes[key] = generate(presetPrimaryColors[key]);\n presetPalettes[key].primary = presetPalettes[key][5]; // dark presetPalettes\n\n presetDarkPalettes[key] = generate(presetPrimaryColors[key], {\n theme: 'dark',\n backgroundColor: '#141414'\n });\n presetDarkPalettes[key].primary = presetDarkPalettes[key][5];\n});\nvar red = presetPalettes.red;\nvar volcano = presetPalettes.volcano;\nvar gold = presetPalettes.gold;\nvar orange = presetPalettes.orange;\nvar yellow = presetPalettes.yellow;\nvar lime = presetPalettes.lime;\nvar green = presetPalettes.green;\nvar cyan = presetPalettes.cyan;\nvar blue = presetPalettes.blue;\nvar geekblue = presetPalettes.geekblue;\nvar purple = presetPalettes.purple;\nvar magenta = presetPalettes.magenta;\nvar grey = presetPalettes.grey;\n\n\n\n// CONCATENATED MODULE: ./node_modules/@antv/g6-pc/es/util/color.js\n\n\n/**\n * get the mix color of backColor and frontColor with alpah\n * @param backColor background color\n * @param frontColor foreground color\n * @param frontAlpha the opacity of foreground color\n */\n\nvar color_mixColor = function mixColor(backColor, frontColor, frontAlpha) {\n var bc = color_default()(backColor);\n var fc = color_default()(frontColor);\n return color_default()([(1 - frontAlpha) * bc.red() + frontAlpha * fc.red(), (1 - frontAlpha) * bc.green() + frontAlpha * fc.green(), (1 - frontAlpha) * bc.blue() + frontAlpha * fc.blue()]).rgb();\n};\n\nvar color_getColorsWithDefaultTheme = function getColorsWithDefaultTheme(subjectColor, backColor, disableColor) {\n if (backColor === void 0) {\n backColor = '#fff';\n }\n\n if (disableColor === void 0) {\n disableColor = 'rgb(150, 150, 150)';\n }\n\n var subjectColor005 = color_mixColor(backColor, subjectColor, 0.05).rgb().toString();\n var subjectColor01 = color_mixColor(backColor, subjectColor, 0.1).rgb().toString();\n var subjectColor02 = color_mixColor(backColor, subjectColor, 0.2).rgb().toString();\n var subjectColor04 = color_mixColor(backColor, subjectColor, 0.4).rgb().toString();\n var disableColor002 = color_mixColor(backColor, disableColor, 0.02).rgb().toString();\n var disableColor005 = color_mixColor(backColor, disableColor, 0.05).rgb().toString();\n var disableColor01 = color_mixColor(backColor, disableColor, 0.1).rgb().toString();\n var disableColor02 = color_mixColor(backColor, disableColor, 0.2).rgb().toString();\n var disableColor03 = color_mixColor(backColor, disableColor, 0.3).rgb().toString();\n var paletteFromSubject = generate(subjectColor, {\n theme: 'default',\n backgroundColor: backColor\n });\n var subjectHex = color_default()(subjectColor).hex().toLowerCase();\n var subjectIdx = paletteFromSubject.indexOf(subjectHex);\n var deeperSubject = subjectColor;\n\n if (subjectIdx !== -1) {\n deeperSubject = paletteFromSubject[subjectIdx + 1];\n }\n\n return {\n // for nodes\n mainStroke: subjectColor,\n mainFill: subjectColor01,\n activeStroke: subjectColor,\n activeFill: subjectColor005,\n inactiveStroke: subjectColor04,\n inactiveFill: subjectColor005,\n selectedStroke: subjectColor,\n selectedFill: backColor,\n highlightStroke: deeperSubject,\n highlightFill: subjectColor02,\n disableStroke: disableColor03,\n disableFill: disableColor005,\n // for edges\n edgeMainStroke: disableColor03,\n edgeActiveStroke: subjectColor,\n edgeInactiveStroke: disableColor02,\n edgeSelectedStroke: subjectColor,\n edgeHighlightStroke: subjectColor,\n edgeDisableStroke: disableColor01,\n // for combos\n comboMainStroke: disableColor03,\n comboMainFill: disableColor002,\n comboActiveStroke: subjectColor,\n comboActiveFill: subjectColor005,\n comboInactiveStroke: disableColor03,\n comboInactiveFill: disableColor002,\n comboSelectedStroke: subjectColor,\n comboSelectedFill: disableColor002,\n comboHighlightStroke: deeperSubject,\n comboHighlightFill: disableColor002,\n comboDisableStroke: disableColor02,\n comboDisableFill: disableColor005\n };\n};\n\nvar color_getColorsWithDarkTheme = function getColorsWithDarkTheme(subjectColor, backColor, disableColor) {\n if (backColor === void 0) {\n backColor = '#fff';\n }\n\n if (disableColor === void 0) {\n disableColor = '#777';\n }\n\n var subjectColor02 = color_mixColor(backColor, subjectColor, 0.2).rgb().toString();\n var subjectColor03 = color_mixColor(backColor, subjectColor, 0.3).rgb().toString();\n var subjectColor06 = color_mixColor(backColor, subjectColor, 0.6).rgb().toString();\n var subjectColor08 = color_mixColor(backColor, subjectColor, 0.8).rgb().toString();\n var disableColor02 = color_mixColor(backColor, disableColor, 0.2).rgb().toString();\n var disableColor025 = color_mixColor(backColor, disableColor, 0.25).rgb().toString();\n var disableColor03 = color_mixColor(backColor, disableColor, 0.3).rgb().toString();\n var disableColor04 = color_mixColor(backColor, disableColor, 0.4).rgb().toString();\n var disableColor05 = color_mixColor(backColor, disableColor, 0.5).rgb().toString();\n var paletteFromSubject = generate(subjectColor, {\n theme: 'dark',\n backgroundColor: backColor\n });\n var subjectHex = color_default()(subjectColor).hex().toLowerCase();\n var subjectIdx = paletteFromSubject.indexOf(subjectHex);\n var deeperSubject = subjectColor;\n\n if (subjectIdx !== -1) {\n deeperSubject = paletteFromSubject[subjectIdx + 1];\n }\n\n return {\n // for nodes\n mainStroke: subjectColor08,\n mainFill: subjectColor02,\n activeStroke: subjectColor,\n activeFill: subjectColor03,\n inactiveStroke: subjectColor08,\n inactiveFill: subjectColor02,\n selectedStroke: subjectColor,\n selectedFill: subjectColor02,\n highlightStroke: subjectColor,\n highlightFill: subjectColor06,\n disableStroke: disableColor05,\n disableFill: disableColor025,\n // for edges\n edgeMainStroke: disableColor,\n edgeActiveStroke: subjectColor,\n edgeInactiveStroke: disableColor,\n edgeSelectedStroke: subjectColor,\n edgeHighlightStroke: subjectColor,\n edgeDisableStroke: disableColor03,\n // for combos\n comboMainStroke: disableColor04,\n comboMainFill: disableColor025,\n comboActiveStroke: subjectColor,\n comboActiveFill: disableColor02,\n comboInactiveStroke: disableColor04,\n comboInactiveFill: disableColor025,\n comboSelectedStroke: subjectColor,\n comboSelectedFill: disableColor02,\n comboHighlightStroke: deeperSubject,\n comboHighlightFill: disableColor025,\n comboDisableStroke: disableColor04,\n comboDisableFill: disableColor02\n };\n};\n/**\n * get the set of colors according to the subject color and background color\n * @param subjectColor the subject color\n * @param backColor background color\n * @param disableColor the color for disable state\n */\n\n\nvar getColorsWithSubjectColor = function getColorsWithSubjectColor(subjectColor, backColor, theme, disableColor) {\n if (backColor === void 0) {\n backColor = '#fff';\n }\n\n if (theme === void 0) {\n theme = 'default';\n }\n\n if (disableColor === void 0) {\n disableColor = 'rgb(150, 150, 150)';\n }\n\n if (theme === 'default') return color_getColorsWithDefaultTheme(subjectColor, backColor, 'rgb(150, 150, 150)');\n return color_getColorsWithDarkTheme(subjectColor, backColor, '#777');\n};\nvar getColorSetsBySubjectColors = function getColorSetsBySubjectColors(subjectColors, backColor, theme, disableColor) {\n if (backColor === void 0) {\n backColor = '#fff';\n }\n\n if (theme === void 0) {\n theme = 'default';\n }\n\n if (disableColor === void 0) {\n disableColor = 'rgb(150, 150, 150)';\n }\n\n var sets = [];\n subjectColors.forEach(function (sColor) {\n sets.push(getColorsWithSubjectColor(sColor, backColor, theme, disableColor));\n });\n return sets;\n};\n// CONCATENATED MODULE: ./node_modules/@antv/g6-pc/es/global.js\n\nvar es_global_subjectColor = 'rgb(95, 149, 255)';\nvar es_global_backColor = 'rgb(255, 255, 255)';\nvar es_global_textColor = 'rgb(0, 0, 0)';\nvar global_colorSet = getColorsWithSubjectColor(es_global_subjectColor, es_global_backColor);\n/* harmony default export */ var es_global = ({\n version: '0.4.1',\n rootContainerClassName: 'root-container',\n nodeContainerClassName: 'node-container',\n edgeContainerClassName: 'edge-container',\n comboContainerClassName: 'combo-container',\n delegateContainerClassName: 'delegate-container',\n defaultLoopPosition: 'top',\n nodeLabel: {\n style: {\n fill: '#000',\n fontSize: 12,\n textAlign: 'center',\n textBaseline: 'middle'\n },\n offset: 4 // 节点的默认文本不居中时的偏移量\n\n },\n defaultNode: {\n type: 'circle',\n style: {\n lineWidth: 1,\n stroke: global_colorSet.mainStroke,\n fill: global_colorSet.mainFill\n },\n size: 20,\n color: global_colorSet.mainStroke,\n linkPoints: {\n size: 8,\n lineWidth: 1,\n fill: global_colorSet.activeFill,\n stroke: global_colorSet.activeStroke\n }\n },\n // 节点应用状态后的样式,默认仅提供 active、selected、highlight、inactive、disable,用户可以自己扩展\n nodeStateStyles: {\n active: {\n fill: global_colorSet.activeFill,\n stroke: global_colorSet.activeStroke,\n lineWidth: 2,\n shadowColor: global_colorSet.mainStroke,\n shadowBlur: 10\n },\n selected: {\n fill: global_colorSet.selectedFill,\n stroke: global_colorSet.selectedStroke,\n lineWidth: 4,\n shadowColor: global_colorSet.selectedStroke,\n shadowBlur: 10,\n 'text-shape': {\n fontWeight: 500\n }\n },\n highlight: {\n fill: global_colorSet.highlightFill,\n stroke: global_colorSet.highlightStroke,\n lineWidth: 2,\n 'text-shape': {\n fontWeight: 500\n }\n },\n inactive: {\n fill: global_colorSet.inactiveFill,\n stroke: global_colorSet.inactiveStroke,\n lineWidth: 1\n },\n disable: {\n fill: global_colorSet.disableFill,\n stroke: global_colorSet.disableStroke,\n lineWidth: 1\n }\n },\n edgeLabel: {\n style: {\n fill: es_global_textColor,\n textAlign: 'center',\n textBaseline: 'middle',\n fontSize: 12\n }\n },\n defaultEdge: {\n type: 'line',\n size: 1,\n style: {\n stroke: global_colorSet.edgeMainStroke,\n lineAppendWidth: 2\n },\n color: global_colorSet.edgeMainStroke\n },\n // 边应用状态后的样式,默认仅提供 active、selected、highlight、inactive、disable,用户可以自己扩展\n edgeStateStyles: {\n active: {\n stroke: global_colorSet.edgeActiveStroke,\n lineWidth: 1\n },\n selected: {\n stroke: global_colorSet.edgeSelectedStroke,\n lineWidth: 2,\n shadowColor: global_colorSet.edgeSelectedStroke,\n shadowBlur: 10,\n 'text-shape': {\n fontWeight: 500\n }\n },\n highlight: {\n stroke: global_colorSet.edgeHighlightStroke,\n lineWidth: 2,\n 'text-shape': {\n fontWeight: 500\n }\n },\n inactive: {\n stroke: global_colorSet.edgeInactiveStroke,\n lineWidth: 1\n },\n disable: {\n stroke: global_colorSet.edgeDisableStroke,\n lineWidth: 1\n }\n },\n comboLabel: {\n style: {\n fill: es_global_textColor,\n // textAlign: 'center',\n textBaseline: 'middle',\n fontSize: 12\n },\n refY: 10,\n refX: 10 // Combo 的默认文本不居中时的偏移量\n\n },\n defaultCombo: {\n type: 'circle',\n style: {\n fill: global_colorSet.comboMainFill,\n lineWidth: 1,\n stroke: global_colorSet.comboMainStroke,\n r: 5,\n width: 20,\n height: 10\n },\n size: [20, 5],\n color: global_colorSet.comboMainStroke,\n padding: [25, 20, 15, 20]\n },\n // combo 应用状态后的样式,默认仅提供 active、selected、highlight、inactive、disable,用户可以自己扩展\n comboStateStyles: {\n active: {\n stroke: global_colorSet.comboActiveStroke,\n lineWidth: 1,\n fill: global_colorSet.comboActiveFill\n },\n selected: {\n stroke: global_colorSet.comboSelectedStroke,\n lineWidth: 2,\n fill: global_colorSet.comboSelectedFill,\n shadowColor: global_colorSet.comboSelectedStroke,\n shadowBlur: 10,\n 'text-shape': {\n fontWeight: 500\n }\n },\n highlight: {\n stroke: global_colorSet.comboHighlightStroke,\n lineWidth: 2,\n fill: global_colorSet.comboHighlightFill,\n 'text-shape': {\n fontWeight: 500\n }\n },\n inactive: {\n stroke: global_colorSet.comboInactiveStroke,\n fill: global_colorSet.comboInactiveFill,\n lineWidth: 1\n },\n disable: {\n stroke: global_colorSet.comboDisableStroke,\n fill: global_colorSet.comboDisableFill,\n lineWidth: 1\n }\n },\n delegateStyle: {\n fill: '#F3F9FF',\n fillOpacity: 0.5,\n stroke: '#1890FF',\n strokeOpacity: 0.9,\n lineDash: [5, 5]\n },\n // 文本水印默认配置\n textWaterMarkerConfig: {\n width: 150,\n height: 100,\n compatible: false,\n text: {\n x: 0,\n y: 60,\n lineHeight: 20,\n rotate: 20,\n fontSize: 14,\n fontFamily: 'Microsoft YaHei',\n fill: 'rgba(0, 0, 0, 0.1)',\n baseline: 'Middle'\n }\n },\n imageWaterMarkerConfig: {\n width: 150,\n height: 130,\n compatible: false,\n image: {\n x: 0,\n y: 0,\n width: 30,\n height: 20,\n rotate: 0\n }\n },\n waterMarkerImage: 'https://gw.alipayobjects.com/os/s/prod/antv/assets/image/logo-with-text-73b8a.svg'\n});\n// CONCATENATED MODULE: ./node_modules/@antv/dom-util/esm/add-event-listener.js\nfunction addEventListener(target, eventType, callback) {\n if (target) {\n if (typeof target.addEventListener === 'function') {\n target.addEventListener(eventType, callback, false);\n return {\n remove: function () {\n target.removeEventListener(eventType, callback, false);\n },\n };\n // @ts-ignore\n }\n if (typeof target.attachEvent === 'function') {\n // @ts-ignore\n target.attachEvent('on' + eventType, callback);\n return {\n remove: function () {\n // @ts-ignore\n target.detachEvent('on' + eventType, callback);\n },\n };\n }\n }\n}\n//# sourceMappingURL=add-event-listener.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/dom-util/esm/create-dom.js\n/**\n * 创建DOM 节点\n * @param {String} str Dom 字符串\n * @return {HTMLElement} DOM 节点\n */\nvar TABLE;\nvar TABLE_TR;\nvar FRAGMENT_REG;\nvar CONTAINERS;\nfunction initConstants() {\n TABLE = document.createElement('table');\n TABLE_TR = document.createElement('tr');\n FRAGMENT_REG = /^\\s*<(\\w+|!)[^>]*>/;\n CONTAINERS = {\n tr: document.createElement('tbody'),\n tbody: TABLE,\n thead: TABLE,\n tfoot: TABLE,\n td: TABLE_TR,\n th: TABLE_TR,\n '*': document.createElement('div'),\n };\n}\nfunction createDom(str) {\n if (!TABLE) {\n initConstants();\n }\n var name = FRAGMENT_REG.test(str) && RegExp.$1;\n if (!name || !(name in CONTAINERS)) {\n name = '*';\n }\n var container = CONTAINERS[name];\n str = str.replace(/(^\\s*)|(\\s*$)/g, '');\n container.innerHTML = '' + str;\n var dom = container.childNodes[0];\n container.removeChild(dom);\n return dom;\n}\n//# sourceMappingURL=create-dom.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/dom-util/esm/get-style.js\n/**\n * 获取样式\n * @param {Object} dom DOM节点\n * @param {String} name 样式名\n * @param {Any} defaultValue 默认值\n * @return {String} 属性值\n */\nfunction getStyle(dom, name, defaultValue) {\n var v;\n try {\n v = window.getComputedStyle ?\n window.getComputedStyle(dom, null)[name] :\n dom.style[name]; // 一般不会走到这个逻辑,dom.style 获取的是标签 style 属性,也不准确\n }\n catch (e) {\n // do nothing\n }\n finally {\n v = v === undefined ? defaultValue : v;\n }\n return v;\n}\n//# sourceMappingURL=get-style.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/dom-util/esm/get-height.js\n\nfunction getHeight(el, defaultValue) {\n var height = getStyle(el, 'height', defaultValue);\n if (height === 'auto') {\n height = el.offsetHeight;\n }\n return parseFloat(height);\n}\n//# sourceMappingURL=get-height.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/dom-util/esm/get-outer-height.js\n\n\nfunction getOuterHeight(el, defaultValue) {\n var height = getHeight(el, defaultValue);\n var bTop = parseFloat(getStyle(el, 'borderTopWidth')) || 0;\n var pTop = parseFloat(getStyle(el, 'paddingTop')) || 0;\n var pBottom = parseFloat(getStyle(el, 'paddingBottom')) || 0;\n var bBottom = parseFloat(getStyle(el, 'borderBottomWidth')) || 0;\n var mTop = parseFloat(getStyle(el, 'marginTop')) || 0;\n var mBottom = parseFloat(getStyle(el, 'marginBottom')) || 0;\n return height + bTop + bBottom + pTop + pBottom + mTop + mBottom;\n}\n//# sourceMappingURL=get-outer-height.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/dom-util/esm/get-width.js\n\nfunction get_width_getHeight(el, defaultValue) {\n var width = getStyle(el, 'width', defaultValue);\n if (width === 'auto') {\n width = el.offsetWidth;\n }\n return parseFloat(width);\n}\n//# sourceMappingURL=get-width.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/dom-util/esm/get-outer-width.js\n\n\nfunction getOuterWidth(el, defaultValue) {\n var width = get_width_getHeight(el, defaultValue);\n var bLeft = parseFloat(getStyle(el, 'borderLeftWidth')) || 0;\n var pLeft = parseFloat(getStyle(el, 'paddingLeft')) || 0;\n var pRight = parseFloat(getStyle(el, 'paddingRight')) || 0;\n var bRight = parseFloat(getStyle(el, 'borderRightWidth')) || 0;\n var mRight = parseFloat(getStyle(el, 'marginRight')) || 0;\n var mLeft = parseFloat(getStyle(el, 'marginLeft')) || 0;\n return width + bLeft + bRight + pLeft + pRight + mLeft + mRight;\n}\n//# sourceMappingURL=get-outer-width.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/dom-util/esm/get-ratio.js\nfunction getRatio() {\n return window.devicePixelRatio ? window.devicePixelRatio : 2;\n}\n//# sourceMappingURL=get-ratio.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/dom-util/esm/modify-css.js\nfunction modifyCSS(dom, css) {\n if (dom) {\n for (var key in css) {\n if (css.hasOwnProperty(key)) {\n dom.style[key] = css[key];\n }\n }\n }\n return dom;\n}\n//# sourceMappingURL=modify-css.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/dom-util/esm/index.js\n// dom\n\n\n\n\n\n\n\n\n\n//# sourceMappingURL=index.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g6-pc/es/graph/controller/event.js\n\n\n\n\nvar event_cloneEvent = util.cloneEvent,\n event_isViewportChanged = util.isViewportChanged;\n\nvar controller_event_EventController =\n/** @class */\nfunction (_super) {\n Object(tslib_es6[\"__extends\"])(EventController, _super);\n\n function EventController(graph) {\n var _this = _super.call(this, graph) || this;\n\n _this.extendEvents = [];\n _this.dragging = false;\n _this.preItem = null;\n _this.graph = graph;\n _this.destroyed = false;\n\n _this.initEvents();\n\n return _this;\n } // 初始化 G6 中的事件\n\n\n EventController.prototype.initEvents = function () {\n var _a = this,\n graph = _a.graph,\n _b = _a.extendEvents,\n extendEvents = _b === void 0 ? [] : _b;\n\n var canvas = graph.get('canvas'); // canvas.set('draggable', true);\n\n var el = canvas.get('el');\n var canvasHandler = Object(esm[\"wrapBehavior\"])(this, 'onCanvasEvents');\n var originHandler = Object(esm[\"wrapBehavior\"])(this, 'onExtendEvents');\n var wheelHandler = Object(esm[\"wrapBehavior\"])(this, 'onWheelEvent'); // each(EVENTS, event => {\n // canvas.off(event).on(event, canvasHandler);\n // });\n\n canvas.off('*').on('*', canvasHandler);\n this.canvasHandler = canvasHandler;\n extendEvents.push(addEventListener(el, 'DOMMouseScroll', wheelHandler));\n extendEvents.push(addEventListener(el, 'mousewheel', wheelHandler));\n\n if (typeof window !== 'undefined') {\n extendEvents.push(addEventListener(window, 'keydown', originHandler));\n extendEvents.push(addEventListener(window, 'keyup', originHandler));\n extendEvents.push(addEventListener(window, 'focus', originHandler));\n }\n }; // 获取 shape 的 item 对象\n\n\n EventController.getItemRoot = function (shape) {\n while (shape && !shape.get('item')) {\n shape = shape.get('parent');\n }\n\n return shape;\n };\n /**\n * 处理 canvas 事件\n * @param evt 事件句柄\n */\n\n\n EventController.prototype.onCanvasEvents = function (evt) {\n var graph = this.graph;\n var canvas = graph.get('canvas');\n var target = evt.target;\n var eventType = evt.type;\n /**\n * (clientX, clientY): 相对于页面的坐标;\n * (canvasX, canvasY): 相对于 左上角的坐标;\n * (x, y): 相对于整个画布的坐标, 与 model 的 x, y 是同一维度的。\n */\n\n evt.canvasX = evt.x;\n evt.canvasY = evt.y;\n var point = {\n x: evt.canvasX,\n y: evt.canvasY\n };\n var group = graph.get('group');\n var matrix = group.getMatrix();\n\n if (!matrix) {\n matrix = [1, 0, 0, 0, 1, 0, 0, 0, 1];\n }\n\n if (event_isViewportChanged(matrix)) {\n point = graph.getPointByClient(evt.clientX, evt.clientY);\n }\n\n evt.x = point.x;\n evt.y = point.y;\n evt.currentTarget = graph;\n\n if (target === canvas) {\n if (eventType === 'mousemove' || eventType === 'mouseleave') {\n this.handleMouseMove(evt, 'canvas');\n }\n\n evt.target = canvas;\n evt.item = null;\n graph.emit(eventType, evt);\n graph.emit(\"canvas:\" + eventType, evt);\n return;\n }\n\n var itemShape = EventController.getItemRoot(target);\n\n if (!itemShape) {\n graph.emit(eventType, evt);\n return;\n }\n\n var item = itemShape.get('item');\n\n if (item.destroyed) {\n return;\n }\n\n var type = item.getType(); // 事件target是触发事件的Shape实例,item是触发事件的item实例\n\n evt.target = target;\n evt.item = item;\n\n if (evt.canvasX === evt.x && evt.canvasY === evt.y) {\n var canvasPoint = graph.getCanvasByPoint(evt.x, evt.y);\n evt.canvasX = canvasPoint.x;\n evt.canvasY = canvasPoint.y;\n } // emit('click', evt);\n\n\n graph.emit(eventType, evt);\n if (evt.name && !evt.name.includes(':')) graph.emit(type + \":\" + eventType, evt); // emit('node:click', evt)\n else graph.emit(evt.name, evt); // emit('text-shape:click', evt)\n\n if (eventType === 'dragstart') {\n this.dragging = true;\n }\n\n if (eventType === 'dragend') {\n this.dragging = false;\n }\n\n if (eventType === 'mousemove') {\n this.handleMouseMove(evt, type);\n }\n };\n /**\n * 处理扩展事件\n * @param evt 事件句柄\n */\n\n\n EventController.prototype.onExtendEvents = function (evt) {\n this.graph.emit(evt.type, evt);\n };\n /**\n * 处理滚轮事件\n * @param evt 事件句柄\n */\n\n\n EventController.prototype.onWheelEvent = function (evt) {\n if (Object(esm[\"isNil\"])(evt.wheelDelta)) {\n evt.wheelDelta = -evt.detail;\n }\n\n this.graph.emit('wheel', evt);\n };\n /**\n * 处理鼠标移动的事件\n * @param evt 事件句柄\n * @param type item 类型\n */\n\n\n EventController.prototype.handleMouseMove = function (evt, type) {\n var _a = this,\n graph = _a.graph,\n preItem = _a.preItem;\n\n var canvas = graph.get('canvas');\n var item = evt.target === canvas ? null : evt.item;\n evt = event_cloneEvent(evt); // 从前一个item直接移动到当前item,触发前一个item的leave事件\n\n if (preItem && preItem !== item && !preItem.destroyed) {\n evt.item = preItem;\n this.emitCustomEvent(preItem.getType(), 'mouseleave', evt);\n\n if (this.dragging) {\n this.emitCustomEvent(preItem.getType(), 'dragleave', evt);\n }\n } // 从一个item或canvas移动到当前item,触发当前item的enter事件\n\n\n if (item && preItem !== item) {\n evt.item = item;\n this.emitCustomEvent(type, 'mouseenter', evt);\n\n if (this.dragging) {\n this.emitCustomEvent(type, 'dragenter', evt);\n }\n }\n\n this.preItem = item;\n };\n /**\n * 在 graph 上面 emit 事件\n * @param itemType item 类型\n * @param eventType 事件类型\n * @param evt 事件句柄\n */\n\n\n EventController.prototype.emitCustomEvent = function (itemType, eventType, evt) {\n evt.type = eventType;\n this.graph.emit(itemType + \":\" + eventType, evt);\n };\n\n EventController.prototype.destroy = function () {\n var _a = this,\n graph = _a.graph,\n canvasHandler = _a.canvasHandler,\n extendEvents = _a.extendEvents;\n\n var canvas = graph.get('canvas'); // each(EVENTS, event => {\n // canvas.off(event, canvasHandler);\n // });\n\n canvas.off('*', canvasHandler);\n Object(esm[\"each\"])(extendEvents, function (event) {\n event.remove();\n });\n this.dragging = false;\n this.preItem = null;\n this.extendEvents.length = 0;\n this.canvasHandler = null;\n this.destroyed = true;\n };\n\n return EventController;\n}(controller_event);\n\n/* harmony default export */ var graph_controller_event = (controller_event_EventController);\n// CONCATENATED MODULE: ./node_modules/@antv/layout/es/layout/base.js\nclass Base {\n constructor() {\n this.nodes = [];\n this.edges = [];\n this.combos = [];\n this.positions = [];\n this.destroyed = false;\n this.onLayoutEnd = () => { };\n }\n layout(data) {\n this.init(data);\n return this.execute(true);\n }\n init(data) {\n this.nodes = data.nodes || [];\n this.edges = data.edges || [];\n this.combos = data.combos || [];\n }\n execute(reloadData) { }\n executeWithWorker() { }\n getDefaultCfg() {\n return {};\n }\n updateCfg(cfg) {\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n getType() {\n return 'base';\n }\n destroy() {\n this.nodes = null;\n this.edges = null;\n this.combos = null;\n this.positions = null;\n this.destroyed = true;\n }\n}\n//# sourceMappingURL=base.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/layout/es/util/string.js\nconst isString = (val) => typeof val === 'string';\nconst cacheStringFunction = (fn) => {\n const cache = Object.create(null);\n return ((str) => {\n const hit = cache[str];\n return hit || (cache[str] = fn(str));\n });\n};\nconst camelizeRE = /-(\\w)/g;\nconst camelize = cacheStringFunction((str) => {\n return str.replace(camelizeRE, (_, c) => (c ? c.toUpperCase() : ''));\n});\n// export const capitalize = cacheStringFunction(\n// (str: string) => str.charAt(0).toUpperCase() + str.slice(1),\n// )\n//# sourceMappingURL=string.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/layout/es/util/array.js\nconst isArray = Array.isArray;\n//# sourceMappingURL=array.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/layout/es/util/number.js\nconst isNumber = (val) => typeof val === 'number';\nconst number_isNaN = (num) => Number.isNaN(Number(num));\nconst toNumber = (val) => {\n const n = parseFloat(val);\n return number_isNaN(n) ? val : n;\n};\n//# sourceMappingURL=number.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/layout/es/util/object.js\nconst isObject = (val) => val !== null && typeof val === 'object';\nconst clone = (target) => {\n if (target === null) {\n return target;\n }\n if (target instanceof Date) {\n return new Date(target.getTime());\n }\n if (target instanceof Array) {\n const cp = [];\n target.forEach((v) => {\n cp.push(v);\n });\n return cp.map((n) => clone(n));\n }\n if (typeof target === 'object' && target !== {}) {\n const cp = Object.assign({}, target);\n Object.keys(cp).forEach((k) => {\n cp[k] = clone(cp[k]);\n });\n return cp;\n }\n return target;\n};\n//# sourceMappingURL=object.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/layout/es/util/math.js\n\nconst getEdgeTerminal = (edge, type) => {\n const terminal = edge[type];\n if (isObject(terminal)) {\n return terminal.cell;\n }\n return terminal;\n};\nconst math_getDegree = (n, nodeIdxMap, edges) => {\n const degrees = [];\n for (let i = 0; i < n; i++) {\n degrees[i] = 0;\n }\n if (!edges)\n return degrees;\n edges.forEach((e) => {\n const source = getEdgeTerminal(e, 'source');\n const target = getEdgeTerminal(e, 'target');\n if (source) {\n degrees[nodeIdxMap[source]] += 1;\n }\n if (target) {\n degrees[nodeIdxMap[target]] += 1;\n }\n });\n return degrees;\n};\nconst util_math_floydWarshall = (adjMatrix) => {\n // initialize\n const dist = [];\n const size = adjMatrix.length;\n for (let i = 0; i < size; i += 1) {\n dist[i] = [];\n for (let j = 0; j < size; j += 1) {\n if (i === j) {\n dist[i][j] = 0;\n }\n else if (adjMatrix[i][j] === 0 || !adjMatrix[i][j]) {\n dist[i][j] = Infinity;\n }\n else {\n dist[i][j] = adjMatrix[i][j];\n }\n }\n }\n // floyd\n for (let k = 0; k < size; k += 1) {\n for (let i = 0; i < size; i += 1) {\n for (let j = 0; j < size; j += 1) {\n if (dist[i][j] > dist[i][k] + dist[k][j]) {\n dist[i][j] = dist[i][k] + dist[k][j];\n }\n }\n }\n }\n return dist;\n};\nconst math_getAdjMatrix = (data, directed) => {\n const { nodes, edges } = data;\n const matrix = [];\n // map node with index in data.nodes\n const nodeMap = {};\n if (!nodes) {\n throw new Error('invalid nodes data!');\n }\n if (nodes) {\n nodes.forEach((node, i) => {\n nodeMap[node.id] = i;\n const row = [];\n matrix.push(row);\n });\n }\n if (edges) {\n edges.forEach((e) => {\n const source = getEdgeTerminal(e, 'source');\n const target = getEdgeTerminal(e, 'target');\n const sIndex = nodeMap[source];\n const tIndex = nodeMap[target];\n matrix[sIndex][tIndex] = 1;\n if (!directed) {\n matrix[tIndex][sIndex] = 1;\n }\n });\n }\n return matrix;\n};\n/**\n * scale matrix\n * @param matrix [ [], [], [] ]\n * @param ratio\n */\nconst math_scaleMatrix = (matrix, ratio) => {\n const result = [];\n matrix.forEach((row) => {\n const newRow = [];\n row.forEach((v) => {\n newRow.push(v * ratio);\n });\n result.push(newRow);\n });\n return result;\n};\n/**\n * depth first traverse, from leaves to root, children in inverse order\n * if the fn returns false, terminate the traverse\n */\nconst math_traverseUp = (data, fn) => {\n if (data && data.children) {\n for (let i = data.children.length - 1; i >= 0; i--) {\n if (!math_traverseUp(data.children[i], fn))\n return;\n }\n }\n if (!fn(data)) {\n return false;\n }\n return true;\n};\n/**\n * depth first traverse, from leaves to root, children in inverse order\n * if the fn returns false, terminate the traverse\n */\nconst math_traverseTreeUp = (data, fn) => {\n if (typeof fn !== 'function') {\n return;\n }\n math_traverseUp(data, fn);\n};\n//# sourceMappingURL=math.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/layout/es/util/function.js\nconst isFunction = (val) => typeof val === 'function';\n//# sourceMappingURL=function.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/layout/es/util/index.js\n\n\n\n\n\n\n//# sourceMappingURL=index.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/layout/es/registy/index.js\n\n\nconst registy_map = new Map();\nconst registy_registerLayout = (name, layoutOverride) => {\n if (registy_map.get(name)) {\n console.warn(`The layout with the name ${name} exists already, it will be overridden`);\n }\n if (isObject(layoutOverride)) {\n // tslint:disable-next-line: max-classes-per-file\n class GLayout extends Base {\n constructor(cfg) {\n super();\n const self = this;\n const props = {};\n const defaultCfg = self.getDefaultCfg();\n Object.assign(props, defaultCfg, layoutOverride, cfg);\n Object.keys(props).forEach((key) => {\n const value = props[key];\n self[key] = value;\n });\n }\n }\n registy_map.set(name, GLayout);\n }\n else {\n registy_map.set(name, layoutOverride);\n }\n return registy_map.get(name);\n};\nconst unRegisterLayout = (name) => {\n if (registy_map.has(name)) {\n registy_map.delete(name);\n }\n};\nconst getLayoutByName = (name) => {\n if (registy_map.has(name)) {\n return registy_map.get(name);\n }\n return null;\n};\n//# sourceMappingURL=index.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/layout/es/layout/grid.js\n/**\n * @fileOverview grid layout\n * @author shiwu.wyy@antfin.com\n * this algorithm refers to - https://github.com/cytoscape/cytoscape.js/\n */\n\n\n/**\n * 网格布局\n */\nclass grid_GridLayout extends Base {\n constructor(options) {\n super();\n /** 布局起始点 */\n this.begin = [0, 0];\n /** prevents node overlap, may overflow boundingBox if not enough space */\n this.preventOverlap = true;\n /** extra spacing around nodes when preventOverlap: true */\n this.preventOverlapPadding = 10;\n /** uses all available space on false, uses minimal space on true */\n this.condense = false;\n /** a sorting function to order the nodes; e.g. function(a, b){ return a.datapublic ('weight') - b.data('weight') } */\n this.sortBy = \"degree\";\n this.nodeSize = 30;\n this.nodes = [];\n this.edges = [];\n this.width = 300;\n this.height = 300;\n this.row = 0;\n this.col = 0;\n this.cellWidth = 0;\n this.cellHeight = 0;\n this.cellUsed = {};\n this.id2manPos = {};\n /** 迭代结束的回调函数 */\n this.onLayoutEnd = () => { };\n this.updateCfg(options);\n }\n getDefaultCfg() {\n return {\n begin: [0, 0],\n preventOverlap: true,\n preventOverlapPadding: 10,\n condense: false,\n rows: undefined,\n cols: undefined,\n position: undefined,\n sortBy: \"degree\",\n nodeSize: 30\n };\n }\n /**\n * 执行布局\n */\n execute() {\n const self = this;\n const nodes = self.nodes;\n const edges = self.edges;\n const n = nodes.length;\n const begin = self.begin;\n if (n === 0) {\n if (self.onLayoutEnd)\n self.onLayoutEnd();\n return {\n nodes,\n edges\n };\n }\n if (n === 1) {\n nodes[0].x = begin[0];\n nodes[0].y = begin[1];\n if (self.onLayoutEnd)\n self.onLayoutEnd();\n return {\n nodes,\n edges,\n };\n }\n const layoutNodes = [];\n nodes.forEach((node) => {\n layoutNodes.push(node);\n });\n const nodeIdxMap = {};\n layoutNodes.forEach((node, i) => {\n nodeIdxMap[node.id] = i;\n });\n if (self.sortBy === \"degree\" ||\n !isString(self.sortBy) ||\n layoutNodes[0][self.sortBy] === undefined) {\n self.sortBy = \"degree\";\n if (number_isNaN(nodes[0].degree)) {\n const values = math_getDegree(layoutNodes.length, nodeIdxMap, edges);\n layoutNodes.forEach((node, i) => {\n node.degree = values[i];\n });\n }\n }\n // sort nodes by value\n layoutNodes.sort((n1, n2) => n2[self.sortBy] - n1[self.sortBy]);\n if (!self.width && typeof window !== \"undefined\") {\n self.width = window.innerWidth;\n }\n if (!self.height && typeof window !== \"undefined\") {\n self.height = window.innerHeight;\n }\n const oRows = self.rows;\n const oCols = self.cols != null ? self.cols : self.columns;\n self.cells = n;\n // if rows or columns were set in self, use those values\n if (oRows != null && oCols != null) {\n self.rows = oRows;\n self.cols = oCols;\n }\n else if (oRows != null && oCols == null) {\n self.rows = oRows;\n self.cols = Math.ceil(self.cells / self.rows);\n }\n else if (oRows == null && oCols != null) {\n self.cols = oCols;\n self.rows = Math.ceil(self.cells / self.cols);\n }\n else {\n // otherwise use the automatic values and adjust accordingly\t // otherwise use the automatic values and adjust accordingly\n // width/height * splits^2 = cells where splits is number of times to split width\n self.splits = Math.sqrt((self.cells * self.height) / self.width);\n self.rows = Math.round(self.splits);\n self.cols = Math.round((self.width / self.height) * self.splits);\n }\n if (self.cols * self.rows > self.cells) {\n // otherwise use the automatic values and adjust accordingly\n // if rounding was up, see if we can reduce rows or columns\n const sm = self.small();\n const lg = self.large();\n // reducing the small side takes away the most cells, so try it first\n if ((sm - 1) * lg >= self.cells) {\n self.small(sm - 1);\n }\n else if ((lg - 1) * sm >= self.cells) {\n self.large(lg - 1);\n }\n }\n else {\n // if rounding was too low, add rows or columns\n while (self.cols * self.rows < self.cells) {\n const sm = self.small();\n const lg = self.large();\n // try to add to larger side first (adds less in multiplication)\n if ((lg + 1) * sm >= self.cells) {\n self.large(lg + 1);\n }\n else {\n self.small(sm + 1);\n }\n }\n }\n self.cellWidth = self.width / self.cols;\n self.cellHeight = self.height / self.rows;\n if (self.condense) {\n self.cellWidth = 0;\n self.cellHeight = 0;\n }\n if (self.preventOverlap) {\n layoutNodes.forEach((node) => {\n if (!node.x || !node.y) {\n // for bb\n node.x = 0;\n node.y = 0;\n }\n let nodew;\n let nodeh;\n if (isArray(node.size)) {\n nodew = node.size[0];\n nodeh = node.size[1];\n }\n else if (isNumber(node.size)) {\n nodew = node.size;\n nodeh = node.size;\n }\n else if (isObject(node.size)) {\n nodew = node.size.width;\n nodeh = node.size.height;\n }\n if (nodew === undefined || nodeh === undefined) {\n if (isArray(self.nodeSize)) {\n nodew = self.nodeSize[0];\n nodeh = self.nodeSize[1];\n }\n else if (isNumber(self.nodeSize)) {\n nodew = self.nodeSize;\n nodeh = self.nodeSize;\n }\n else {\n nodew = 30;\n nodeh = 30;\n }\n }\n const p = self.preventOverlapPadding;\n const w = nodew + p;\n const h = nodeh + p;\n self.cellWidth = Math.max(self.cellWidth, w);\n self.cellHeight = Math.max(self.cellHeight, h);\n });\n }\n self.cellUsed = {}; // e.g. 'c-0-2' => true\n // to keep track of current cell position\n self.row = 0;\n self.col = 0;\n // get a cache of all the manual positions\n self.id2manPos = {};\n for (let i = 0; i < layoutNodes.length; i++) {\n const node = layoutNodes[i];\n let rcPos;\n if (self.position) {\n rcPos = self.position(node);\n }\n if (rcPos && (rcPos.row !== undefined || rcPos.col !== undefined)) {\n // must have at least row or col def'd\n const pos = {\n row: rcPos.row,\n col: rcPos.col\n };\n if (pos.col === undefined) {\n // find unused col\n pos.col = 0;\n while (self.used(pos.row, pos.col)) {\n pos.col++;\n }\n }\n else if (pos.row === undefined) {\n // find unused row\n pos.row = 0;\n while (self.used(pos.row, pos.col)) {\n pos.row++;\n }\n }\n self.id2manPos[node.id] = pos;\n self.use(pos.row, pos.col);\n }\n self.getPos(node);\n }\n if (self.onLayoutEnd)\n self.onLayoutEnd();\n return {\n edges,\n nodes: layoutNodes\n };\n }\n small(val) {\n const self = this;\n let res;\n const rows = self.rows || 5;\n const cols = self.cols || 5;\n if (val == null) {\n res = Math.min(rows, cols);\n }\n else {\n const min = Math.min(rows, cols);\n if (min === self.rows) {\n self.rows = val;\n }\n else {\n self.cols = val;\n }\n }\n return res;\n }\n large(val) {\n const self = this;\n let res;\n const rows = self.rows || 5;\n const cols = self.cols || 5;\n if (val == null) {\n res = Math.max(rows, cols);\n }\n else {\n const max = Math.max(rows, cols);\n if (max === self.rows) {\n self.rows = val;\n }\n else {\n self.cols = val;\n }\n }\n return res;\n }\n used(row, col) {\n const self = this;\n return self.cellUsed[`c-${row}-${col}`] || false;\n }\n use(row, col) {\n const self = this;\n self.cellUsed[`c-${row}-${col}`] = true;\n }\n moveToNextCell() {\n const self = this;\n const cols = self.cols || 5;\n self.col++;\n if (self.col >= cols) {\n self.col = 0;\n self.row++;\n }\n }\n getPos(node) {\n const self = this;\n const begin = self.begin;\n const cellWidth = self.cellWidth;\n const cellHeight = self.cellHeight;\n let x;\n let y;\n // see if we have a manual position set\n const rcPos = self.id2manPos[node.id];\n if (rcPos) {\n x = rcPos.col * cellWidth + cellWidth / 2 + begin[0];\n y = rcPos.row * cellHeight + cellHeight / 2 + begin[1];\n }\n else {\n // otherwise set automatically\n while (self.used(self.row, self.col)) {\n self.moveToNextCell();\n }\n x = self.col * cellWidth + cellWidth / 2 + begin[0];\n y = self.row * cellHeight + cellHeight / 2 + begin[1];\n self.use(self.row, self.col);\n self.moveToNextCell();\n }\n node.x = x;\n node.y = y;\n }\n getType() {\n return \"grid\";\n }\n}\n//# sourceMappingURL=grid.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/layout/es/layout/random.js\n/**\n * @fileOverview random layout\n * @author shiwu.wyy@antfin.com\n */\n\n/**\n * 随机布局\n */\nclass random_RandomLayout extends Base {\n constructor(options) {\n super();\n /** 布局中心 */\n this.center = [0, 0];\n /** 宽度 */\n this.width = 300;\n /** 高度 */\n this.height = 300;\n this.nodes = [];\n this.edges = [];\n /** 迭代结束的回调函数 */\n this.onLayoutEnd = () => { };\n this.updateCfg(options);\n }\n getDefaultCfg() {\n return {\n center: [0, 0],\n width: 300,\n height: 300\n };\n }\n /**\n * 执行布局\n */\n execute() {\n const self = this;\n const nodes = self.nodes;\n const layoutScale = 0.9;\n const center = self.center;\n if (!self.width && typeof window !== \"undefined\") {\n self.width = window.innerWidth;\n }\n if (!self.height && typeof window !== \"undefined\") {\n self.height = window.innerHeight;\n }\n if (nodes) {\n nodes.forEach((node) => {\n node.x = (Math.random() - 0.5) * layoutScale * self.width + center[0];\n node.y = (Math.random() - 0.5) * layoutScale * self.height + center[1];\n });\n }\n if (self.onLayoutEnd)\n self.onLayoutEnd();\n return {\n nodes,\n edges: this.edges\n };\n }\n getType() {\n return \"random\";\n }\n}\n//# sourceMappingURL=random.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/layout/es/layout/gForce.js\n/**\n * @fileOverview fruchterman layout\n * @author shiwu.wyy@antfin.com\n */\n\n\nconst gForce_proccessToFunc = (value, defaultV) => {\n let func;\n if (!value) {\n func = (d) => {\n return defaultV || 1;\n };\n }\n else if (isNumber(value)) {\n func = (d) => {\n return value;\n };\n }\n else {\n func = value;\n }\n return func;\n};\n/**\n * graphin 中的 force 布局\n */\nclass gForce_GForceLayout extends Base {\n constructor(options) {\n super();\n /** 停止迭代的最大迭代数 */\n this.maxIteration = 1000;\n /** 是否启动 worker */\n this.workerEnabled = false;\n /** 弹簧引力系数 */\n this.edgeStrength = 200;\n /** 斥力系数 */\n this.nodeStrength = 1000;\n /** 库伦系数 */\n this.coulombDisScale = 0.005;\n /** 阻尼系数 */\n this.damping = 0.9;\n /** 最大速度 */\n this.maxSpeed = 1000;\n /** 一次迭代的平均移动距离小于该值时停止迭代 */\n this.minMovement = 0.5;\n /** 迭代中衰减 */\n this.interval = 0.02;\n /** 斥力的一个系数 */\n this.factor = 1;\n /** 理想边长 */\n this.linkDistance = 1;\n /** 重力大小 */\n this.gravity = 10;\n /** 是否防止重叠 */\n this.preventOverlap = true;\n /** 每次迭代结束的回调函数 */\n this.tick = () => { };\n this.nodes = [];\n this.edges = [];\n this.width = 300;\n this.height = 300;\n this.nodeMap = {};\n this.nodeIdxMap = {};\n this.updateCfg(options);\n }\n getDefaultCfg() {\n return {\n maxIteration: 500,\n gravity: 10,\n enableTick: true\n };\n }\n /**\n * 执行布局\n */\n execute() {\n var _a, _b;\n const self = this;\n const nodes = self.nodes;\n if (self.timeInterval !== undefined && typeof window !== \"undefined\") {\n window.clearInterval(self.timeInterval);\n }\n if (!nodes || nodes.length === 0) {\n (_a = self.onLayoutEnd) === null || _a === void 0 ? void 0 : _a.call(self);\n return;\n }\n if (!self.width && typeof window !== \"undefined\") {\n self.width = window.innerWidth;\n }\n if (!self.height && typeof window !== \"undefined\") {\n self.height = window.innerHeight;\n }\n if (!self.center) {\n self.center = [self.width / 2, self.height / 2];\n }\n const center = self.center;\n if (nodes.length === 1) {\n nodes[0].x = center[0];\n nodes[0].y = center[1];\n (_b = self.onLayoutEnd) === null || _b === void 0 ? void 0 : _b.call(self);\n return;\n }\n const nodeMap = {};\n const nodeIdxMap = {};\n nodes.forEach((node, i) => {\n if (!isNumber(node.x))\n node.x = Math.random() * self.width;\n if (!isNumber(node.y))\n node.y = Math.random() * self.height;\n nodeMap[node.id] = node;\n nodeIdxMap[node.id] = i;\n });\n self.nodeMap = nodeMap;\n self.nodeIdxMap = nodeIdxMap;\n self.linkDistance = gForce_proccessToFunc(self.linkDistance, 1);\n self.nodeStrength = gForce_proccessToFunc(self.nodeStrength, 1);\n self.edgeStrength = gForce_proccessToFunc(self.edgeStrength, 1);\n // node size function\n const nodeSize = self.nodeSize;\n let nodeSizeFunc;\n if (self.preventOverlap) {\n const nodeSpacing = self.nodeSpacing;\n let nodeSpacingFunc;\n if (isNumber(nodeSpacing)) {\n nodeSpacingFunc = () => nodeSpacing;\n }\n else if (isFunction(nodeSpacing)) {\n nodeSpacingFunc = nodeSpacing;\n }\n else {\n nodeSpacingFunc = () => 0;\n }\n if (!nodeSize) {\n nodeSizeFunc = (d) => {\n if (d.size) {\n if (isArray(d.size)) {\n const res = d.size[0] > d.size[1] ? d.size[0] : d.size[1];\n return res + nodeSpacingFunc(d);\n }\n if (isObject(d.size)) {\n const res = d.size.width > d.size.height ? d.size.width : d.size.height;\n return res + nodeSpacingFunc(d);\n }\n return d.size + nodeSpacingFunc(d);\n }\n return 10 + nodeSpacingFunc(d);\n };\n }\n else if (isArray(nodeSize)) {\n nodeSizeFunc = (d) => {\n const res = nodeSize[0] > nodeSize[1] ? nodeSize[0] : nodeSize[1];\n return res + nodeSpacingFunc(d);\n };\n }\n else {\n nodeSizeFunc = (d) => nodeSize + nodeSpacingFunc(d);\n }\n }\n self.nodeSize = nodeSizeFunc;\n const edges = self.edges;\n self.degrees = math_getDegree(nodes.length, self.nodeIdxMap, edges);\n if (!self.getMass) {\n self.getMass = (d) => {\n const mass = self.degrees[self.nodeIdxMap[d.id]] || 1;\n return mass;\n };\n }\n // layout\n self.run();\n }\n run() {\n var _a;\n const self = this;\n const { maxIteration, nodes, workerEnabled, minMovement } = self;\n if (!nodes)\n return;\n if (workerEnabled) {\n for (let i = 0; i < maxIteration; i++) {\n const previousPos = self.runOneStep(i);\n if (self.reachMoveThreshold(nodes, previousPos, minMovement)) {\n break;\n }\n }\n (_a = self.onLayoutEnd) === null || _a === void 0 ? void 0 : _a.call(self);\n }\n else {\n if (typeof window === \"undefined\")\n return;\n let iter = 0;\n // interval for render the result after each iteration\n this.timeInterval = window.setInterval(() => {\n var _a, _b;\n if (!nodes)\n return;\n const previousPos = self.runOneStep(iter) || [];\n if (self.reachMoveThreshold(nodes, previousPos, minMovement)) {\n (_a = self.onLayoutEnd) === null || _a === void 0 ? void 0 : _a.call(self);\n window.clearInterval(self.timeInterval);\n }\n iter++;\n if (iter >= maxIteration) {\n (_b = self.onLayoutEnd) === null || _b === void 0 ? void 0 : _b.call(self);\n window.clearInterval(self.timeInterval);\n }\n }, 0);\n }\n }\n reachMoveThreshold(nodes, previousPos, minMovement) {\n // whether to stop the iteration\n let movement = 0;\n nodes.forEach((node, j) => {\n const vx = node.x - previousPos[j].x;\n const vy = node.y - previousPos[j].y;\n movement += Math.sqrt(vx * vx + vy * vy);\n });\n movement /= nodes.length;\n return movement < minMovement;\n }\n runOneStep(iter) {\n var _a;\n const self = this;\n const { nodes, edges } = self;\n const accArray = [];\n const velArray = [];\n if (!nodes)\n return;\n nodes.forEach((_, i) => {\n accArray[2 * i] = 0;\n accArray[2 * i + 1] = 0;\n velArray[2 * i] = 0;\n velArray[2 * i + 1] = 0;\n });\n self.calRepulsive(accArray, nodes);\n if (edges)\n self.calAttractive(accArray, edges);\n self.calGravity(accArray, nodes);\n const stepInterval = Math.max(0.02, self.interval - iter * 0.002);\n self.updateVelocity(accArray, velArray, stepInterval, nodes);\n const previousPos = [];\n nodes.forEach((node) => {\n previousPos.push({\n x: node.x,\n y: node.y\n });\n });\n self.updatePosition(velArray, stepInterval, nodes);\n (_a = self.tick) === null || _a === void 0 ? void 0 : _a.call(self);\n return previousPos;\n }\n calRepulsive(accArray, nodes) {\n const self = this;\n // const nodes = self.nodes;\n const getMass = self.getMass;\n const nodeStrength = self.nodeStrength;\n const factor = self.factor;\n const coulombDisScale = self.coulombDisScale;\n const preventOverlap = self.preventOverlap;\n const nodeSize = self.nodeSize;\n nodes.forEach((ni, i) => {\n const massi = getMass ? getMass(ni) : 1;\n nodes.forEach((nj, j) => {\n if (i >= j)\n return;\n // if (!accArray[j]) accArray[j] = 0;\n const vecX = ni.x - nj.x;\n const vecY = ni.y - nj.y;\n const vecLength = Math.sqrt(vecX * vecX + vecY * vecY) + 0.01;\n const nVecLength = (vecLength + 0.1) * coulombDisScale;\n const direX = vecX / vecLength;\n const direY = vecY / vecLength;\n const param = (((nodeStrength(ni) + nodeStrength(nj)) / 2) * factor) /\n (nVecLength * nVecLength);\n const massj = getMass ? getMass(nj) : 1;\n accArray[2 * i] += (direX * param);\n accArray[2 * i + 1] += (direY * param);\n accArray[2 * j] -= (direX * param);\n accArray[2 * j + 1] -= (direY * param);\n if (preventOverlap && vecLength < (nodeSize(ni) + nodeSize(nj)) / 2) {\n const paramOverlap = (nodeStrength(ni) + nodeStrength(nj)) / 2 / (vecLength * vecLength);\n accArray[2 * i] += (direX * paramOverlap) / massi;\n accArray[2 * i + 1] += (direY * paramOverlap) / massi;\n accArray[2 * j] -= (direX * paramOverlap) / massj;\n accArray[2 * j + 1] -= (direY * paramOverlap) / massj;\n }\n });\n });\n }\n calAttractive(accArray, edges) {\n const self = this;\n // const edges = self.edges;\n const nodeMap = self.nodeMap;\n const nodeIdxMap = self.nodeIdxMap;\n const linkDistance = self.linkDistance;\n const edgeStrength = self.edgeStrength;\n const getMass = self.getMass;\n edges.forEach((edge, i) => {\n const source = getEdgeTerminal(edge, 'source');\n const target = getEdgeTerminal(edge, 'target');\n const sourceNode = nodeMap[source];\n const targetNode = nodeMap[target];\n const vecX = targetNode.x - sourceNode.x;\n const vecY = targetNode.y - sourceNode.y;\n const vecLength = Math.sqrt(vecX * vecX + vecY * vecY) + 0.01;\n const direX = vecX / vecLength;\n const direY = vecY / vecLength;\n const length = linkDistance(edge) || 1;\n const diff = length - vecLength;\n const param = diff * edgeStrength(edge);\n const sourceIdx = nodeIdxMap[source];\n const targetIdx = nodeIdxMap[target];\n const massSource = getMass ? getMass(sourceNode) : 1;\n const massTarget = getMass ? getMass(targetNode) : 1;\n accArray[2 * sourceIdx] -= (direX * param) / massSource;\n accArray[2 * sourceIdx + 1] -= (direY * param) / massSource;\n accArray[2 * targetIdx] += (direX * param) / massTarget;\n accArray[2 * targetIdx + 1] += (direY * param) / massTarget;\n });\n }\n calGravity(accArray, nodes) {\n const self = this;\n // const nodes = self.nodes;\n const center = self.center;\n const defaultGravity = self.gravity;\n const degrees = self.degrees;\n const nodeLength = nodes.length;\n for (let i = 0; i < nodeLength; i++) {\n const node = nodes[i];\n let vecX = node.x - center[0];\n let vecY = node.y - center[1];\n let gravity = defaultGravity;\n if (self.getCenter) {\n const customCenterOpt = self.getCenter(node, degrees[i]);\n if (customCenterOpt &&\n isNumber(customCenterOpt[0]) &&\n isNumber(customCenterOpt[1]) &&\n isNumber(customCenterOpt[2])) {\n vecX = node.x - customCenterOpt[0];\n vecY = node.y - customCenterOpt[1];\n gravity = customCenterOpt[2];\n }\n }\n if (!gravity)\n continue;\n accArray[2 * i] -= gravity * vecX;\n accArray[2 * i + 1] -= gravity * vecY;\n }\n }\n updateVelocity(accArray, velArray, stepInterval, nodes) {\n const self = this;\n const param = stepInterval * self.damping;\n // const nodes = self.nodes;\n nodes.forEach((node, i) => {\n let vx = accArray[2 * i] * param || 0.01;\n let vy = accArray[2 * i + 1] * param || 0.01;\n const vLength = Math.sqrt(vx * vx + vy * vy);\n if (vLength > self.maxSpeed) {\n const param2 = self.maxSpeed / vLength;\n vx = param2 * vx;\n vy = param2 * vy;\n }\n velArray[2 * i] = vx;\n velArray[2 * i + 1] = vy;\n });\n }\n updatePosition(velArray, stepInterval, nodes) {\n nodes.forEach((node, i) => {\n if (isNumber(node.fx) && isNumber(node.fy)) {\n node.x = node.fx;\n node.y = node.fy;\n return;\n }\n const distX = velArray[2 * i] * stepInterval;\n const distY = velArray[2 * i + 1] * stepInterval;\n node.x += distX;\n node.y += distY;\n });\n }\n stop() {\n if (this.timeInterval && typeof window !== \"undefined\") {\n window.clearInterval(this.timeInterval);\n }\n }\n destroy() {\n const self = this;\n self.stop();\n self.tick = null;\n self.nodes = null;\n self.edges = null;\n self.destroyed = true;\n }\n getType() {\n return \"gForce\";\n }\n}\n//# sourceMappingURL=gForce.js.map\n// CONCATENATED MODULE: ./node_modules/d3-quadtree/src/add.js\n/* harmony default export */ var add = (function(d) {\n const x = +this._x.call(null, d),\n y = +this._y.call(null, d);\n return add_add(this.cover(x, y), x, y, d);\n});\n\nfunction add_add(tree, x, y, d) {\n if (isNaN(x) || isNaN(y)) return tree; // ignore invalid points\n\n var parent,\n node = tree._root,\n leaf = {data: d},\n x0 = tree._x0,\n y0 = tree._y0,\n x1 = tree._x1,\n y1 = tree._y1,\n xm,\n ym,\n xp,\n yp,\n right,\n bottom,\n i,\n j;\n\n // If the tree is empty, initialize the root as a leaf.\n if (!node) return tree._root = leaf, tree;\n\n // Find the existing leaf for the new point, or add it.\n while (node.length) {\n if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;\n if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;\n if (parent = node, !(node = node[i = bottom << 1 | right])) return parent[i] = leaf, tree;\n }\n\n // Is the new point is exactly coincident with the existing point?\n xp = +tree._x.call(null, node.data);\n yp = +tree._y.call(null, node.data);\n if (x === xp && y === yp) return leaf.next = node, parent ? parent[i] = leaf : tree._root = leaf, tree;\n\n // Otherwise, split the leaf node until the old and new point are separated.\n do {\n parent = parent ? parent[i] = new Array(4) : tree._root = new Array(4);\n if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;\n if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;\n } while ((i = bottom << 1 | right) === (j = (yp >= ym) << 1 | (xp >= xm)));\n return parent[j] = node, parent[i] = leaf, tree;\n}\n\nfunction addAll(data) {\n var d, i, n = data.length,\n x,\n y,\n xz = new Array(n),\n yz = new Array(n),\n x0 = Infinity,\n y0 = Infinity,\n x1 = -Infinity,\n y1 = -Infinity;\n\n // Compute the points and their extent.\n for (i = 0; i < n; ++i) {\n if (isNaN(x = +this._x.call(null, d = data[i])) || isNaN(y = +this._y.call(null, d))) continue;\n xz[i] = x;\n yz[i] = y;\n if (x < x0) x0 = x;\n if (x > x1) x1 = x;\n if (y < y0) y0 = y;\n if (y > y1) y1 = y;\n }\n\n // If there were no (valid) points, abort.\n if (x0 > x1 || y0 > y1) return this;\n\n // Expand the tree to cover the new points.\n this.cover(x0, y0).cover(x1, y1);\n\n // Add the new points.\n for (i = 0; i < n; ++i) {\n add_add(this, xz[i], yz[i], data[i]);\n }\n\n return this;\n}\n\n// CONCATENATED MODULE: ./node_modules/d3-quadtree/src/cover.js\n/* harmony default export */ var cover = (function(x, y) {\n if (isNaN(x = +x) || isNaN(y = +y)) return this; // ignore invalid points\n\n var x0 = this._x0,\n y0 = this._y0,\n x1 = this._x1,\n y1 = this._y1;\n\n // If the quadtree has no extent, initialize them.\n // Integer extent are necessary so that if we later double the extent,\n // the existing quadrant boundaries don’t change due to floating point error!\n if (isNaN(x0)) {\n x1 = (x0 = Math.floor(x)) + 1;\n y1 = (y0 = Math.floor(y)) + 1;\n }\n\n // Otherwise, double repeatedly to cover.\n else {\n var z = x1 - x0 || 1,\n node = this._root,\n parent,\n i;\n\n while (x0 > x || x >= x1 || y0 > y || y >= y1) {\n i = (y < y0) << 1 | (x < x0);\n parent = new Array(4), parent[i] = node, node = parent, z *= 2;\n switch (i) {\n case 0: x1 = x0 + z, y1 = y0 + z; break;\n case 1: x0 = x1 - z, y1 = y0 + z; break;\n case 2: x1 = x0 + z, y0 = y1 - z; break;\n case 3: x0 = x1 - z, y0 = y1 - z; break;\n }\n }\n\n if (this._root && this._root.length) this._root = node;\n }\n\n this._x0 = x0;\n this._y0 = y0;\n this._x1 = x1;\n this._y1 = y1;\n return this;\n});\n\n// CONCATENATED MODULE: ./node_modules/d3-quadtree/src/data.js\n/* harmony default export */ var src_data = (function() {\n var data = [];\n this.visit(function(node) {\n if (!node.length) do data.push(node.data); while (node = node.next)\n });\n return data;\n});\n\n// CONCATENATED MODULE: ./node_modules/d3-quadtree/src/extent.js\n/* harmony default export */ var extent = (function(_) {\n return arguments.length\n ? this.cover(+_[0][0], +_[0][1]).cover(+_[1][0], +_[1][1])\n : isNaN(this._x0) ? undefined : [[this._x0, this._y0], [this._x1, this._y1]];\n});\n\n// CONCATENATED MODULE: ./node_modules/d3-quadtree/src/quad.js\n/* harmony default export */ var src_quad = (function(node, x0, y0, x1, y1) {\n this.node = node;\n this.x0 = x0;\n this.y0 = y0;\n this.x1 = x1;\n this.y1 = y1;\n});\n\n// CONCATENATED MODULE: ./node_modules/d3-quadtree/src/find.js\n\n\n/* harmony default export */ var find = (function(x, y, radius) {\n var data,\n x0 = this._x0,\n y0 = this._y0,\n x1,\n y1,\n x2,\n y2,\n x3 = this._x1,\n y3 = this._y1,\n quads = [],\n node = this._root,\n q,\n i;\n\n if (node) quads.push(new src_quad(node, x0, y0, x3, y3));\n if (radius == null) radius = Infinity;\n else {\n x0 = x - radius, y0 = y - radius;\n x3 = x + radius, y3 = y + radius;\n radius *= radius;\n }\n\n while (q = quads.pop()) {\n\n // Stop searching if this quadrant can’t contain a closer node.\n if (!(node = q.node)\n || (x1 = q.x0) > x3\n || (y1 = q.y0) > y3\n || (x2 = q.x1) < x0\n || (y2 = q.y1) < y0) continue;\n\n // Bisect the current quadrant.\n if (node.length) {\n var xm = (x1 + x2) / 2,\n ym = (y1 + y2) / 2;\n\n quads.push(\n new src_quad(node[3], xm, ym, x2, y2),\n new src_quad(node[2], x1, ym, xm, y2),\n new src_quad(node[1], xm, y1, x2, ym),\n new src_quad(node[0], x1, y1, xm, ym)\n );\n\n // Visit the closest quadrant first.\n if (i = (y >= ym) << 1 | (x >= xm)) {\n q = quads[quads.length - 1];\n quads[quads.length - 1] = quads[quads.length - 1 - i];\n quads[quads.length - 1 - i] = q;\n }\n }\n\n // Visit this point. (Visiting coincident points isn’t necessary!)\n else {\n var dx = x - +this._x.call(null, node.data),\n dy = y - +this._y.call(null, node.data),\n d2 = dx * dx + dy * dy;\n if (d2 < radius) {\n var d = Math.sqrt(radius = d2);\n x0 = x - d, y0 = y - d;\n x3 = x + d, y3 = y + d;\n data = node.data;\n }\n }\n }\n\n return data;\n});\n\n// CONCATENATED MODULE: ./node_modules/d3-quadtree/src/remove.js\n/* harmony default export */ var remove = (function(d) {\n if (isNaN(x = +this._x.call(null, d)) || isNaN(y = +this._y.call(null, d))) return this; // ignore invalid points\n\n var parent,\n node = this._root,\n retainer,\n previous,\n next,\n x0 = this._x0,\n y0 = this._y0,\n x1 = this._x1,\n y1 = this._y1,\n x,\n y,\n xm,\n ym,\n right,\n bottom,\n i,\n j;\n\n // If the tree is empty, initialize the root as a leaf.\n if (!node) return this;\n\n // Find the leaf node for the point.\n // While descending, also retain the deepest parent with a non-removed sibling.\n if (node.length) while (true) {\n if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;\n if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;\n if (!(parent = node, node = node[i = bottom << 1 | right])) return this;\n if (!node.length) break;\n if (parent[(i + 1) & 3] || parent[(i + 2) & 3] || parent[(i + 3) & 3]) retainer = parent, j = i;\n }\n\n // Find the point to remove.\n while (node.data !== d) if (!(previous = node, node = node.next)) return this;\n if (next = node.next) delete node.next;\n\n // If there are multiple coincident points, remove just the point.\n if (previous) return (next ? previous.next = next : delete previous.next), this;\n\n // If this is the root point, remove it.\n if (!parent) return this._root = next, this;\n\n // Remove this leaf.\n next ? parent[i] = next : delete parent[i];\n\n // If the parent now contains exactly one leaf, collapse superfluous parents.\n if ((node = parent[0] || parent[1] || parent[2] || parent[3])\n && node === (parent[3] || parent[2] || parent[1] || parent[0])\n && !node.length) {\n if (retainer) retainer[j] = node;\n else this._root = node;\n }\n\n return this;\n});\n\nfunction removeAll(data) {\n for (var i = 0, n = data.length; i < n; ++i) this.remove(data[i]);\n return this;\n}\n\n// CONCATENATED MODULE: ./node_modules/d3-quadtree/src/root.js\n/* harmony default export */ var src_root = (function() {\n return this._root;\n});\n\n// CONCATENATED MODULE: ./node_modules/d3-quadtree/src/size.js\n/* harmony default export */ var src_size = (function() {\n var size = 0;\n this.visit(function(node) {\n if (!node.length) do ++size; while (node = node.next)\n });\n return size;\n});\n\n// CONCATENATED MODULE: ./node_modules/d3-quadtree/src/visit.js\n\n\n/* harmony default export */ var visit = (function(callback) {\n var quads = [], q, node = this._root, child, x0, y0, x1, y1;\n if (node) quads.push(new src_quad(node, this._x0, this._y0, this._x1, this._y1));\n while (q = quads.pop()) {\n if (!callback(node = q.node, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1) && node.length) {\n var xm = (x0 + x1) / 2, ym = (y0 + y1) / 2;\n if (child = node[3]) quads.push(new src_quad(child, xm, ym, x1, y1));\n if (child = node[2]) quads.push(new src_quad(child, x0, ym, xm, y1));\n if (child = node[1]) quads.push(new src_quad(child, xm, y0, x1, ym));\n if (child = node[0]) quads.push(new src_quad(child, x0, y0, xm, ym));\n }\n }\n return this;\n});\n\n// CONCATENATED MODULE: ./node_modules/d3-quadtree/src/visitAfter.js\n\n\n/* harmony default export */ var visitAfter = (function(callback) {\n var quads = [], next = [], q;\n if (this._root) quads.push(new src_quad(this._root, this._x0, this._y0, this._x1, this._y1));\n while (q = quads.pop()) {\n var node = q.node;\n if (node.length) {\n var child, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1, xm = (x0 + x1) / 2, ym = (y0 + y1) / 2;\n if (child = node[0]) quads.push(new src_quad(child, x0, y0, xm, ym));\n if (child = node[1]) quads.push(new src_quad(child, xm, y0, x1, ym));\n if (child = node[2]) quads.push(new src_quad(child, x0, ym, xm, y1));\n if (child = node[3]) quads.push(new src_quad(child, xm, ym, x1, y1));\n }\n next.push(q);\n }\n while (q = next.pop()) {\n callback(q.node, q.x0, q.y0, q.x1, q.y1);\n }\n return this;\n});\n\n// CONCATENATED MODULE: ./node_modules/d3-quadtree/src/x.js\nfunction defaultX(d) {\n return d[0];\n}\n\n/* harmony default export */ var src_x = (function(_) {\n return arguments.length ? (this._x = _, this) : this._x;\n});\n\n// CONCATENATED MODULE: ./node_modules/d3-quadtree/src/y.js\nfunction defaultY(d) {\n return d[1];\n}\n\n/* harmony default export */ var src_y = (function(_) {\n return arguments.length ? (this._y = _, this) : this._y;\n});\n\n// CONCATENATED MODULE: ./node_modules/d3-quadtree/src/quadtree.js\n\n\n\n\n\n\n\n\n\n\n\n\n\nfunction quadtree(nodes, x, y) {\n var tree = new Quadtree(x == null ? defaultX : x, y == null ? defaultY : y, NaN, NaN, NaN, NaN);\n return nodes == null ? tree : tree.addAll(nodes);\n}\n\nfunction Quadtree(x, y, x0, y0, x1, y1) {\n this._x = x;\n this._y = y;\n this._x0 = x0;\n this._y0 = y0;\n this._x1 = x1;\n this._y1 = y1;\n this._root = undefined;\n}\n\nfunction leaf_copy(leaf) {\n var copy = {data: leaf.data}, next = copy;\n while (leaf = leaf.next) next = next.next = {data: leaf.data};\n return copy;\n}\n\nvar treeProto = quadtree.prototype = Quadtree.prototype;\n\ntreeProto.copy = function() {\n var copy = new Quadtree(this._x, this._y, this._x0, this._y0, this._x1, this._y1),\n node = this._root,\n nodes,\n child;\n\n if (!node) return copy;\n\n if (!node.length) return copy._root = leaf_copy(node), copy;\n\n nodes = [{source: node, target: copy._root = new Array(4)}];\n while (node = nodes.pop()) {\n for (var i = 0; i < 4; ++i) {\n if (child = node.source[i]) {\n if (child.length) nodes.push({source: child, target: node.target[i] = new Array(4)});\n else node.target[i] = leaf_copy(child);\n }\n }\n }\n\n return copy;\n};\n\ntreeProto.add = add;\ntreeProto.addAll = addAll;\ntreeProto.cover = cover;\ntreeProto.data = src_data;\ntreeProto.extent = extent;\ntreeProto.find = find;\ntreeProto.remove = remove;\ntreeProto.removeAll = removeAll;\ntreeProto.root = src_root;\ntreeProto.size = src_size;\ntreeProto.visit = visit;\ntreeProto.visitAfter = visitAfter;\ntreeProto.x = src_x;\ntreeProto.y = src_y;\n\n// CONCATENATED MODULE: ./node_modules/d3-force/src/constant.js\n/* harmony default export */ var src_constant = (function(x) {\n return function() {\n return x;\n };\n});\n\n// CONCATENATED MODULE: ./node_modules/d3-force/src/jiggle.js\n/* harmony default export */ var jiggle = (function(random) {\n return (random() - 0.5) * 1e-6;\n});\n\n// CONCATENATED MODULE: ./node_modules/d3-dispatch/src/dispatch.js\nvar noop = {value: () => {}};\n\nfunction dispatch() {\n for (var i = 0, n = arguments.length, _ = {}, t; i < n; ++i) {\n if (!(t = arguments[i] + \"\") || (t in _) || /[\\s.]/.test(t)) throw new Error(\"illegal type: \" + t);\n _[t] = [];\n }\n return new Dispatch(_);\n}\n\nfunction Dispatch(_) {\n this._ = _;\n}\n\nfunction parseTypenames(typenames, types) {\n return typenames.trim().split(/^|\\s+/).map(function(t) {\n var name = \"\", i = t.indexOf(\".\");\n if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);\n if (t && !types.hasOwnProperty(t)) throw new Error(\"unknown type: \" + t);\n return {type: t, name: name};\n });\n}\n\nDispatch.prototype = dispatch.prototype = {\n constructor: Dispatch,\n on: function(typename, callback) {\n var _ = this._,\n T = parseTypenames(typename + \"\", _),\n t,\n i = -1,\n n = T.length;\n\n // If no callback was specified, return the callback of the given type and name.\n if (arguments.length < 2) {\n while (++i < n) if ((t = (typename = T[i]).type) && (t = get(_[t], typename.name))) return t;\n return;\n }\n\n // If a type was specified, set the callback for the given type and name.\n // Otherwise, if a null callback was specified, remove callbacks of the given name.\n if (callback != null && typeof callback !== \"function\") throw new Error(\"invalid callback: \" + callback);\n while (++i < n) {\n if (t = (typename = T[i]).type) _[t] = set(_[t], typename.name, callback);\n else if (callback == null) for (t in _) _[t] = set(_[t], typename.name, null);\n }\n\n return this;\n },\n copy: function() {\n var copy = {}, _ = this._;\n for (var t in _) copy[t] = _[t].slice();\n return new Dispatch(copy);\n },\n call: function(type, that) {\n if ((n = arguments.length - 2) > 0) for (var args = new Array(n), i = 0, n, t; i < n; ++i) args[i] = arguments[i + 2];\n if (!this._.hasOwnProperty(type)) throw new Error(\"unknown type: \" + type);\n for (t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);\n },\n apply: function(type, that, args) {\n if (!this._.hasOwnProperty(type)) throw new Error(\"unknown type: \" + type);\n for (var t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);\n }\n};\n\nfunction get(type, name) {\n for (var i = 0, n = type.length, c; i < n; ++i) {\n if ((c = type[i]).name === name) {\n return c.value;\n }\n }\n}\n\nfunction set(type, name, callback) {\n for (var i = 0, n = type.length; i < n; ++i) {\n if (type[i].name === name) {\n type[i] = noop, type = type.slice(0, i).concat(type.slice(i + 1));\n break;\n }\n }\n if (callback != null) type.push({name: name, value: callback});\n return type;\n}\n\n/* harmony default export */ var src_dispatch = (dispatch);\n\n// CONCATENATED MODULE: ./node_modules/d3-timer/src/timer.js\nvar timer_frame = 0, // is an animation frame pending?\n timer_timeout = 0, // is a timeout pending?\n timer_interval = 0, // are any timers active?\n pokeDelay = 1000, // how frequently we check for clock skew\n taskHead,\n taskTail,\n clockLast = 0,\n clockNow = 0,\n clockSkew = 0,\n clock = typeof performance === \"object\" && performance.now ? performance : Date,\n setFrame = typeof window === \"object\" && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function(f) { setTimeout(f, 17); };\n\nfunction now() {\n return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew);\n}\n\nfunction clearNow() {\n clockNow = 0;\n}\n\nfunction Timer() {\n this._call =\n this._time =\n this._next = null;\n}\n\nTimer.prototype = timer_timer.prototype = {\n constructor: Timer,\n restart: function(callback, delay, time) {\n if (typeof callback !== \"function\") throw new TypeError(\"callback is not a function\");\n time = (time == null ? now() : +time) + (delay == null ? 0 : +delay);\n if (!this._next && taskTail !== this) {\n if (taskTail) taskTail._next = this;\n else taskHead = this;\n taskTail = this;\n }\n this._call = callback;\n this._time = time;\n sleep();\n },\n stop: function() {\n if (this._call) {\n this._call = null;\n this._time = Infinity;\n sleep();\n }\n }\n};\n\nfunction timer_timer(callback, delay, time) {\n var t = new Timer;\n t.restart(callback, delay, time);\n return t;\n}\n\nfunction timerFlush() {\n now(); // Get the current time, if not already set.\n ++timer_frame; // Pretend we’ve set an alarm, if we haven’t already.\n var t = taskHead, e;\n while (t) {\n if ((e = clockNow - t._time) >= 0) t._call.call(null, e);\n t = t._next;\n }\n --timer_frame;\n}\n\nfunction wake() {\n clockNow = (clockLast = clock.now()) + clockSkew;\n timer_frame = timer_timeout = 0;\n try {\n timerFlush();\n } finally {\n timer_frame = 0;\n nap();\n clockNow = 0;\n }\n}\n\nfunction poke() {\n var now = clock.now(), delay = now - clockLast;\n if (delay > pokeDelay) clockSkew -= delay, clockLast = now;\n}\n\nfunction nap() {\n var t0, t1 = taskHead, t2, time = Infinity;\n while (t1) {\n if (t1._call) {\n if (time > t1._time) time = t1._time;\n t0 = t1, t1 = t1._next;\n } else {\n t2 = t1._next, t1._next = null;\n t1 = t0 ? t0._next = t2 : taskHead = t2;\n }\n }\n taskTail = t0;\n sleep(time);\n}\n\nfunction sleep(time) {\n if (timer_frame) return; // Soonest alarm already set, or will be.\n if (timer_timeout) timer_timeout = clearTimeout(timer_timeout);\n var delay = time - clockNow; // Strictly less than if we recomputed clockNow.\n if (delay > 24) {\n if (time < Infinity) timer_timeout = setTimeout(wake, time - clock.now() - clockSkew);\n if (timer_interval) timer_interval = clearInterval(timer_interval);\n } else {\n if (!timer_interval) clockLast = clock.now(), timer_interval = setInterval(poke, pokeDelay);\n timer_frame = 1, setFrame(wake);\n }\n}\n\n// CONCATENATED MODULE: ./node_modules/d3-force/src/lcg.js\n// https://en.wikipedia.org/wiki/Linear_congruential_generator#Parameters_in_common_use\nconst lcg_a = 1664525;\nconst lcg_c = 1013904223;\nconst lcg_m = 4294967296; // 2^32\n\n/* harmony default export */ var lcg = (function() {\n let s = 1;\n return () => (s = (lcg_a * s + lcg_c) % lcg_m) / lcg_m;\n});\n\n// CONCATENATED MODULE: ./node_modules/d3-force/src/simulation.js\n\n\n\n\nfunction simulation_x(d) {\n return d.x;\n}\n\nfunction simulation_y(d) {\n return d.y;\n}\n\nvar initialRadius = 10,\n initialAngle = Math.PI * (3 - Math.sqrt(5));\n\n/* harmony default export */ var src_simulation = (function(nodes) {\n var simulation,\n alpha = 1,\n alphaMin = 0.001,\n alphaDecay = 1 - Math.pow(alphaMin, 1 / 300),\n alphaTarget = 0,\n velocityDecay = 0.6,\n forces = new Map(),\n stepper = timer_timer(step),\n event = src_dispatch(\"tick\", \"end\"),\n random = lcg();\n\n if (nodes == null) nodes = [];\n\n function step() {\n tick();\n event.call(\"tick\", simulation);\n if (alpha < alphaMin) {\n stepper.stop();\n event.call(\"end\", simulation);\n }\n }\n\n function tick(iterations) {\n var i, n = nodes.length, node;\n\n if (iterations === undefined) iterations = 1;\n\n for (var k = 0; k < iterations; ++k) {\n alpha += (alphaTarget - alpha) * alphaDecay;\n\n forces.forEach(function(force) {\n force(alpha);\n });\n\n for (i = 0; i < n; ++i) {\n node = nodes[i];\n if (node.fx == null) node.x += node.vx *= velocityDecay;\n else node.x = node.fx, node.vx = 0;\n if (node.fy == null) node.y += node.vy *= velocityDecay;\n else node.y = node.fy, node.vy = 0;\n }\n }\n\n return simulation;\n }\n\n function initializeNodes() {\n for (var i = 0, n = nodes.length, node; i < n; ++i) {\n node = nodes[i], node.index = i;\n if (node.fx != null) node.x = node.fx;\n if (node.fy != null) node.y = node.fy;\n if (isNaN(node.x) || isNaN(node.y)) {\n var radius = initialRadius * Math.sqrt(0.5 + i), angle = i * initialAngle;\n node.x = radius * Math.cos(angle);\n node.y = radius * Math.sin(angle);\n }\n if (isNaN(node.vx) || isNaN(node.vy)) {\n node.vx = node.vy = 0;\n }\n }\n }\n\n function initializeForce(force) {\n if (force.initialize) force.initialize(nodes, random);\n return force;\n }\n\n initializeNodes();\n\n return simulation = {\n tick: tick,\n\n restart: function() {\n return stepper.restart(step), simulation;\n },\n\n stop: function() {\n return stepper.stop(), simulation;\n },\n\n nodes: function(_) {\n return arguments.length ? (nodes = _, initializeNodes(), forces.forEach(initializeForce), simulation) : nodes;\n },\n\n alpha: function(_) {\n return arguments.length ? (alpha = +_, simulation) : alpha;\n },\n\n alphaMin: function(_) {\n return arguments.length ? (alphaMin = +_, simulation) : alphaMin;\n },\n\n alphaDecay: function(_) {\n return arguments.length ? (alphaDecay = +_, simulation) : +alphaDecay;\n },\n\n alphaTarget: function(_) {\n return arguments.length ? (alphaTarget = +_, simulation) : alphaTarget;\n },\n\n velocityDecay: function(_) {\n return arguments.length ? (velocityDecay = 1 - _, simulation) : 1 - velocityDecay;\n },\n\n randomSource: function(_) {\n return arguments.length ? (random = _, forces.forEach(initializeForce), simulation) : random;\n },\n\n force: function(name, _) {\n return arguments.length > 1 ? ((_ == null ? forces.delete(name) : forces.set(name, initializeForce(_))), simulation) : forces.get(name);\n },\n\n find: function(x, y, radius) {\n var i = 0,\n n = nodes.length,\n dx,\n dy,\n d2,\n node,\n closest;\n\n if (radius == null) radius = Infinity;\n else radius *= radius;\n\n for (i = 0; i < n; ++i) {\n node = nodes[i];\n dx = x - node.x;\n dy = y - node.y;\n d2 = dx * dx + dy * dy;\n if (d2 < radius) closest = node, radius = d2;\n }\n\n return closest;\n },\n\n on: function(name, _) {\n return arguments.length > 1 ? (event.on(name, _), simulation) : event.on(name);\n }\n };\n});\n\n// CONCATENATED MODULE: ./node_modules/d3-force/src/manyBody.js\n\n\n\n\n\n/* harmony default export */ var manyBody = (function() {\n var nodes,\n node,\n random,\n alpha,\n strength = src_constant(-30),\n strengths,\n distanceMin2 = 1,\n distanceMax2 = Infinity,\n theta2 = 0.81;\n\n function force(_) {\n var i, n = nodes.length, tree = quadtree(nodes, simulation_x, simulation_y).visitAfter(accumulate);\n for (alpha = _, i = 0; i < n; ++i) node = nodes[i], tree.visit(apply);\n }\n\n function initialize() {\n if (!nodes) return;\n var i, n = nodes.length, node;\n strengths = new Array(n);\n for (i = 0; i < n; ++i) node = nodes[i], strengths[node.index] = +strength(node, i, nodes);\n }\n\n function accumulate(quad) {\n var strength = 0, q, c, weight = 0, x, y, i;\n\n // For internal nodes, accumulate forces from child quadrants.\n if (quad.length) {\n for (x = y = i = 0; i < 4; ++i) {\n if ((q = quad[i]) && (c = Math.abs(q.value))) {\n strength += q.value, weight += c, x += c * q.x, y += c * q.y;\n }\n }\n quad.x = x / weight;\n quad.y = y / weight;\n }\n\n // For leaf nodes, accumulate forces from coincident quadrants.\n else {\n q = quad;\n q.x = q.data.x;\n q.y = q.data.y;\n do strength += strengths[q.data.index];\n while (q = q.next);\n }\n\n quad.value = strength;\n }\n\n function apply(quad, x1, _, x2) {\n if (!quad.value) return true;\n\n var x = quad.x - node.x,\n y = quad.y - node.y,\n w = x2 - x1,\n l = x * x + y * y;\n\n // Apply the Barnes-Hut approximation if possible.\n // Limit forces for very close nodes; randomize direction if coincident.\n if (w * w / theta2 < l) {\n if (l < distanceMax2) {\n if (x === 0) x = jiggle(random), l += x * x;\n if (y === 0) y = jiggle(random), l += y * y;\n if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l);\n node.vx += x * quad.value * alpha / l;\n node.vy += y * quad.value * alpha / l;\n }\n return true;\n }\n\n // Otherwise, process points directly.\n else if (quad.length || l >= distanceMax2) return;\n\n // Limit forces for very close nodes; randomize direction if coincident.\n if (quad.data !== node || quad.next) {\n if (x === 0) x = jiggle(random), l += x * x;\n if (y === 0) y = jiggle(random), l += y * y;\n if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l);\n }\n\n do if (quad.data !== node) {\n w = strengths[quad.data.index] * alpha / l;\n node.vx += x * w;\n node.vy += y * w;\n } while (quad = quad.next);\n }\n\n force.initialize = function(_nodes, _random) {\n nodes = _nodes;\n random = _random;\n initialize();\n };\n\n force.strength = function(_) {\n return arguments.length ? (strength = typeof _ === \"function\" ? _ : src_constant(+_), initialize(), force) : strength;\n };\n\n force.distanceMin = function(_) {\n return arguments.length ? (distanceMin2 = _ * _, force) : Math.sqrt(distanceMin2);\n };\n\n force.distanceMax = function(_) {\n return arguments.length ? (distanceMax2 = _ * _, force) : Math.sqrt(distanceMax2);\n };\n\n force.theta = function(_) {\n return arguments.length ? (theta2 = _ * _, force) : Math.sqrt(theta2);\n };\n\n return force;\n});\n\n// CONCATENATED MODULE: ./node_modules/d3-force/src/center.js\n/* harmony default export */ var src_center = (function(x, y) {\n var nodes, strength = 1;\n\n if (x == null) x = 0;\n if (y == null) y = 0;\n\n function force() {\n var i,\n n = nodes.length,\n node,\n sx = 0,\n sy = 0;\n\n for (i = 0; i < n; ++i) {\n node = nodes[i], sx += node.x, sy += node.y;\n }\n\n for (sx = (sx / n - x) * strength, sy = (sy / n - y) * strength, i = 0; i < n; ++i) {\n node = nodes[i], node.x -= sx, node.y -= sy;\n }\n }\n\n force.initialize = function(_) {\n nodes = _;\n };\n\n force.x = function(_) {\n return arguments.length ? (x = +_, force) : x;\n };\n\n force.y = function(_) {\n return arguments.length ? (y = +_, force) : y;\n };\n\n force.strength = function(_) {\n return arguments.length ? (strength = +_, force) : strength;\n };\n\n return force;\n});\n\n// CONCATENATED MODULE: ./node_modules/d3-force/src/link.js\n\n\n\nfunction link_index(d) {\n return d.index;\n}\n\nfunction link_find(nodeById, nodeId) {\n var node = nodeById.get(nodeId);\n if (!node) throw new Error(\"node not found: \" + nodeId);\n return node;\n}\n\n/* harmony default export */ var src_link = (function(links) {\n var id = link_index,\n strength = defaultStrength,\n strengths,\n distance = src_constant(30),\n distances,\n nodes,\n count,\n bias,\n random,\n iterations = 1;\n\n if (links == null) links = [];\n\n function defaultStrength(link) {\n return 1 / Math.min(count[link.source.index], count[link.target.index]);\n }\n\n function force(alpha) {\n for (var k = 0, n = links.length; k < iterations; ++k) {\n for (var i = 0, link, source, target, x, y, l, b; i < n; ++i) {\n link = links[i], source = link.source, target = link.target;\n x = target.x + target.vx - source.x - source.vx || jiggle(random);\n y = target.y + target.vy - source.y - source.vy || jiggle(random);\n l = Math.sqrt(x * x + y * y);\n l = (l - distances[i]) / l * alpha * strengths[i];\n x *= l, y *= l;\n target.vx -= x * (b = bias[i]);\n target.vy -= y * b;\n source.vx += x * (b = 1 - b);\n source.vy += y * b;\n }\n }\n }\n\n function initialize() {\n if (!nodes) return;\n\n var i,\n n = nodes.length,\n m = links.length,\n nodeById = new Map(nodes.map((d, i) => [id(d, i, nodes), d])),\n link;\n\n for (i = 0, count = new Array(n); i < m; ++i) {\n link = links[i], link.index = i;\n if (typeof link.source !== \"object\") link.source = link_find(nodeById, link.source);\n if (typeof link.target !== \"object\") link.target = link_find(nodeById, link.target);\n count[link.source.index] = (count[link.source.index] || 0) + 1;\n count[link.target.index] = (count[link.target.index] || 0) + 1;\n }\n\n for (i = 0, bias = new Array(m); i < m; ++i) {\n link = links[i], bias[i] = count[link.source.index] / (count[link.source.index] + count[link.target.index]);\n }\n\n strengths = new Array(m), initializeStrength();\n distances = new Array(m), initializeDistance();\n }\n\n function initializeStrength() {\n if (!nodes) return;\n\n for (var i = 0, n = links.length; i < n; ++i) {\n strengths[i] = +strength(links[i], i, links);\n }\n }\n\n function initializeDistance() {\n if (!nodes) return;\n\n for (var i = 0, n = links.length; i < n; ++i) {\n distances[i] = +distance(links[i], i, links);\n }\n }\n\n force.initialize = function(_nodes, _random) {\n nodes = _nodes;\n random = _random;\n initialize();\n };\n\n force.links = function(_) {\n return arguments.length ? (links = _, initialize(), force) : links;\n };\n\n force.id = function(_) {\n return arguments.length ? (id = _, force) : id;\n };\n\n force.iterations = function(_) {\n return arguments.length ? (iterations = +_, force) : iterations;\n };\n\n force.strength = function(_) {\n return arguments.length ? (strength = typeof _ === \"function\" ? _ : src_constant(+_), initializeStrength(), force) : strength;\n };\n\n force.distance = function(_) {\n return arguments.length ? (distance = typeof _ === \"function\" ? _ : src_constant(+_), initializeDistance(), force) : distance;\n };\n\n return force;\n});\n\n// CONCATENATED MODULE: ./node_modules/d3-force/src/collide.js\n\n\n\n\nfunction collide_x(d) {\n return d.x + d.vx;\n}\n\nfunction collide_y(d) {\n return d.y + d.vy;\n}\n\n/* harmony default export */ var collide = (function(radius) {\n var nodes,\n radii,\n random,\n strength = 1,\n iterations = 1;\n\n if (typeof radius !== \"function\") radius = src_constant(radius == null ? 1 : +radius);\n\n function force() {\n var i, n = nodes.length,\n tree,\n node,\n xi,\n yi,\n ri,\n ri2;\n\n for (var k = 0; k < iterations; ++k) {\n tree = quadtree(nodes, collide_x, collide_y).visitAfter(prepare);\n for (i = 0; i < n; ++i) {\n node = nodes[i];\n ri = radii[node.index], ri2 = ri * ri;\n xi = node.x + node.vx;\n yi = node.y + node.vy;\n tree.visit(apply);\n }\n }\n\n function apply(quad, x0, y0, x1, y1) {\n var data = quad.data, rj = quad.r, r = ri + rj;\n if (data) {\n if (data.index > node.index) {\n var x = xi - data.x - data.vx,\n y = yi - data.y - data.vy,\n l = x * x + y * y;\n if (l < r * r) {\n if (x === 0) x = jiggle(random), l += x * x;\n if (y === 0) y = jiggle(random), l += y * y;\n l = (r - (l = Math.sqrt(l))) / l * strength;\n node.vx += (x *= l) * (r = (rj *= rj) / (ri2 + rj));\n node.vy += (y *= l) * r;\n data.vx -= x * (r = 1 - r);\n data.vy -= y * r;\n }\n }\n return;\n }\n return x0 > xi + r || x1 < xi - r || y0 > yi + r || y1 < yi - r;\n }\n }\n\n function prepare(quad) {\n if (quad.data) return quad.r = radii[quad.data.index];\n for (var i = quad.r = 0; i < 4; ++i) {\n if (quad[i] && quad[i].r > quad.r) {\n quad.r = quad[i].r;\n }\n }\n }\n\n function initialize() {\n if (!nodes) return;\n var i, n = nodes.length, node;\n radii = new Array(n);\n for (i = 0; i < n; ++i) node = nodes[i], radii[node.index] = +radius(node, i, nodes);\n }\n\n force.initialize = function(_nodes, _random) {\n nodes = _nodes;\n random = _random;\n initialize();\n };\n\n force.iterations = function(_) {\n return arguments.length ? (iterations = +_, force) : iterations;\n };\n\n force.strength = function(_) {\n return arguments.length ? (strength = +_, force) : strength;\n };\n\n force.radius = function(_) {\n return arguments.length ? (radius = typeof _ === \"function\" ? _ : src_constant(+_), initialize(), force) : radius;\n };\n\n return force;\n});\n\n// CONCATENATED MODULE: ./node_modules/d3-force/src/x.js\n\n\n/* harmony default export */ var d3_force_src_x = (function(x) {\n var strength = src_constant(0.1),\n nodes,\n strengths,\n xz;\n\n if (typeof x !== \"function\") x = src_constant(x == null ? 0 : +x);\n\n function force(alpha) {\n for (var i = 0, n = nodes.length, node; i < n; ++i) {\n node = nodes[i], node.vx += (xz[i] - node.x) * strengths[i] * alpha;\n }\n }\n\n function initialize() {\n if (!nodes) return;\n var i, n = nodes.length;\n strengths = new Array(n);\n xz = new Array(n);\n for (i = 0; i < n; ++i) {\n strengths[i] = isNaN(xz[i] = +x(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes);\n }\n }\n\n force.initialize = function(_) {\n nodes = _;\n initialize();\n };\n\n force.strength = function(_) {\n return arguments.length ? (strength = typeof _ === \"function\" ? _ : src_constant(+_), initialize(), force) : strength;\n };\n\n force.x = function(_) {\n return arguments.length ? (x = typeof _ === \"function\" ? _ : src_constant(+_), initialize(), force) : x;\n };\n\n return force;\n});\n\n// CONCATENATED MODULE: ./node_modules/d3-force/src/y.js\n\n\n/* harmony default export */ var d3_force_src_y = (function(y) {\n var strength = src_constant(0.1),\n nodes,\n strengths,\n yz;\n\n if (typeof y !== \"function\") y = src_constant(y == null ? 0 : +y);\n\n function force(alpha) {\n for (var i = 0, n = nodes.length, node; i < n; ++i) {\n node = nodes[i], node.vy += (yz[i] - node.y) * strengths[i] * alpha;\n }\n }\n\n function initialize() {\n if (!nodes) return;\n var i, n = nodes.length;\n strengths = new Array(n);\n yz = new Array(n);\n for (i = 0; i < n; ++i) {\n strengths[i] = isNaN(yz[i] = +y(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes);\n }\n }\n\n force.initialize = function(_) {\n nodes = _;\n initialize();\n };\n\n force.strength = function(_) {\n return arguments.length ? (strength = typeof _ === \"function\" ? _ : src_constant(+_), initialize(), force) : strength;\n };\n\n force.y = function(_) {\n return arguments.length ? (y = typeof _ === \"function\" ? _ : src_constant(+_), initialize(), force) : y;\n };\n\n return force;\n});\n\n// CONCATENATED MODULE: ./node_modules/@antv/layout/es/layout/force/force-in-a-box.js\n\n\n// https://github.com/john-guerra/forceInABox/blob/master/src/forceInABox.js\nfunction forceInABox() {\n function constant(_) {\n return () => _;\n }\n let groupBy = (d) => {\n return d.cluster;\n };\n let forceNodeSize = constant(1);\n let forceCharge = constant(-1);\n let forceLinkDistance = constant(100);\n let forceLinkStrength = constant(0.1);\n let offset = [0, 0];\n let nodes = [];\n let nodesMap = {};\n let links = [];\n let centerX = 100;\n let centerY = 100;\n let foci = {\n none: {\n x: 0,\n y: 0,\n },\n };\n let templateNodes = [];\n let templateForce;\n let template = 'force';\n let enableGrouping = true;\n let strength = 0.1;\n function force(alpha) {\n if (!enableGrouping) {\n return force;\n }\n templateForce.tick();\n getFocisFromTemplate();\n for (let i = 0, n = nodes.length, node, k = alpha * strength; i < n; ++i) {\n node = nodes[i];\n node.vx += (foci[groupBy(node)].x - node.x) * k;\n node.vy += (foci[groupBy(node)].y - node.y) * k;\n }\n }\n function initialize() {\n if (!nodes)\n return;\n initializeWithForce();\n }\n function initializeWithForce() {\n if (!nodes || !nodes.length) {\n return;\n }\n if (groupBy(nodes[0]) === undefined) {\n throw Error(\"Couldnt find the grouping attribute for the nodes. Make sure to set it up with forceInABox.groupBy('clusterAttr') before calling .links()\");\n }\n // checkLinksAsObjects();\n const net = getGroupsGraph();\n templateForce = src_simulation(net.nodes)\n .force('x', d3_force_src_x(centerX).strength(0.1))\n .force('y', d3_force_src_y(centerY).strength(0.1))\n .force('collide', collide((d) => d.r).iterations(4))\n .force('charge', manyBody().strength(forceCharge))\n .force('links', src_link(net.nodes.length ? net.links : [])\n .distance(forceLinkDistance)\n .strength(forceLinkStrength));\n templateNodes = templateForce.nodes();\n getFocisFromTemplate();\n }\n function getGroupsGraph() {\n const gnodes = [];\n const glinks = [];\n const dNodes = {};\n let clustersList = [];\n let clustersCounts = {};\n let clustersLinks = [];\n clustersCounts = computeClustersNodeCounts(nodes);\n clustersLinks = computeClustersLinkCounts(links);\n clustersList = Object.keys(clustersCounts);\n clustersList.forEach((key, index) => {\n const val = clustersCounts[key];\n // Uses approx meta-node size\n gnodes.push({\n id: key,\n size: val.count,\n r: Math.sqrt(val.sumforceNodeSize / Math.PI),\n });\n dNodes[key] = index;\n });\n clustersLinks.forEach((l) => {\n const sourceTerminal = getEdgeTerminal(l, 'source');\n const targetTerminal = getEdgeTerminal(l, 'target');\n const source = dNodes[sourceTerminal];\n const target = dNodes[targetTerminal];\n if (source !== undefined && target !== undefined) {\n glinks.push({\n source,\n target,\n count: l.count,\n });\n }\n });\n return {\n nodes: gnodes,\n links: glinks,\n };\n }\n function computeClustersNodeCounts(nodes) {\n const clustersCounts = {};\n nodes.forEach((d) => {\n const key = groupBy(d);\n if (!clustersCounts[key]) {\n clustersCounts[key] = {\n count: 0,\n sumforceNodeSize: 0,\n };\n }\n });\n nodes.forEach((d) => {\n const key = groupBy(d);\n const nodeSize = forceNodeSize(d);\n const tmpCount = clustersCounts[key];\n tmpCount.count = tmpCount.count + 1;\n tmpCount.sumforceNodeSize =\n tmpCount.sumforceNodeSize + Math.PI * (nodeSize * nodeSize) * 1.3;\n clustersCounts[key] = tmpCount;\n });\n return clustersCounts;\n }\n function computeClustersLinkCounts(links) {\n const dClusterLinks = {};\n const clusterLinks = [];\n links.forEach((l) => {\n const key = getLinkKey(l);\n let count = 0;\n if (dClusterLinks[key] !== undefined) {\n count = dClusterLinks[key];\n }\n count += 1;\n dClusterLinks[key] = count;\n });\n const entries = Object.entries(dClusterLinks);\n entries.forEach(([key, count]) => {\n const source = key.split('~')[0];\n const target = key.split('~')[1];\n if (source !== undefined && target !== undefined) {\n clusterLinks.push({\n source,\n target,\n count,\n });\n }\n });\n return clusterLinks;\n }\n function getFocisFromTemplate() {\n foci = {\n none: {\n x: 0,\n y: 0,\n },\n };\n templateNodes.forEach((d) => {\n foci[d.id] = {\n x: d.x - offset[0],\n y: d.y - offset[1],\n };\n });\n return foci;\n }\n function getLinkKey(l) {\n const source = getEdgeTerminal(l, 'source');\n const target = getEdgeTerminal(l, 'target');\n const sourceID = groupBy(nodesMap[source]);\n const targetID = groupBy(nodesMap[target]);\n return sourceID <= targetID\n ? `${sourceID}~${targetID}`\n : `${targetID}~${sourceID}`;\n }\n function genNodesMap(nodes) {\n nodesMap = {};\n nodes.forEach((node) => {\n nodesMap[node.id] = node;\n });\n }\n function setTemplate(x) {\n if (!arguments.length)\n return template;\n template = x;\n initialize();\n return force;\n }\n function setGroupBy(x) {\n if (!arguments.length)\n return groupBy;\n if (typeof x === 'string') {\n groupBy = (d) => {\n return d[x];\n };\n return force;\n }\n groupBy = x;\n return force;\n }\n function setEnableGrouping(x) {\n if (!arguments.length)\n return enableGrouping;\n enableGrouping = x;\n return force;\n }\n function setStrength(x) {\n if (!arguments.length)\n return strength;\n strength = x;\n return force;\n }\n function setCenterX(_) {\n if (arguments.length) {\n centerX = _;\n return force;\n }\n return centerX;\n }\n function setCenterY(_) {\n if (arguments.length) {\n centerY = _;\n return force;\n }\n return centerY;\n }\n function setNodes(_) {\n if (arguments.length) {\n genNodesMap(_ || []);\n nodes = _ || [];\n return force;\n }\n return nodes;\n }\n function setLinks(_) {\n if (arguments.length) {\n links = _ || [];\n initialize();\n return force;\n }\n return links;\n }\n function setForceNodeSize(_) {\n if (arguments.length) {\n if (typeof _ === 'function') {\n forceNodeSize = _;\n }\n else {\n forceNodeSize = constant(+_);\n }\n initialize();\n return force;\n }\n return forceNodeSize;\n }\n function setForceCharge(_) {\n if (arguments.length) {\n if (typeof _ === 'function') {\n forceCharge = _;\n }\n else {\n forceCharge = constant(+_);\n }\n initialize();\n return force;\n }\n return forceCharge;\n }\n function setForceLinkDistance(_) {\n if (arguments.length) {\n if (typeof _ === 'function') {\n forceLinkDistance = _;\n }\n else {\n forceLinkDistance = constant(+_);\n }\n initialize();\n return force;\n }\n return forceLinkDistance;\n }\n function setForceLinkStrength(_) {\n if (arguments.length) {\n if (typeof _ === 'function') {\n forceLinkStrength = _;\n }\n else {\n forceLinkStrength = constant(+_);\n }\n initialize();\n return force;\n }\n return forceLinkStrength;\n }\n function setOffset(_) {\n if (arguments.length) {\n offset = _;\n return force;\n }\n return offset;\n }\n force.initialize = (_) => {\n nodes = _;\n initialize();\n };\n force.template = setTemplate;\n force.groupBy = setGroupBy;\n force.enableGrouping = setEnableGrouping;\n force.strength = setStrength;\n force.centerX = setCenterX;\n force.centerY = setCenterY;\n force.nodes = setNodes;\n force.links = setLinks;\n force.forceNodeSize = setForceNodeSize;\n // Legacy support\n force.nodeSize = force.forceNodeSize;\n force.forceCharge = setForceCharge;\n force.forceLinkDistance = setForceLinkDistance;\n force.forceLinkStrength = setForceLinkStrength;\n force.offset = setOffset;\n force.getFocis = getFocisFromTemplate;\n return force;\n}\n//# sourceMappingURL=force-in-a-box.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/layout/es/layout/constants.js\n/** layout message type */\nconst LAYOUT_MESSAGE = {\n // run layout\n RUN: \"LAYOUT_RUN\",\n // layout ended with success\n END: \"LAYOUT_END\",\n // layout error\n ERROR: \"LAYOUT_ERROR\",\n // layout tick, used in force directed layout\n TICK: \"LAYOUT_TICK\",\n GPURUN: \"GPU_LAYOUT_RUN\",\n GPUEND: \"GPU_LAYOUT_END\"\n};\n//# sourceMappingURL=constants.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/layout/es/layout/force/force.js\n/**\n * @fileOverview random layout\n * @author shiwu.wyy@antfin.com\n */\n\n\n\n\n\n/**\n * 经典力导布局 force-directed\n */\nclass force_ForceLayout extends Base {\n constructor(options) {\n super();\n /** 向心力作用点 */\n this.center = [0, 0];\n /** 节点作用力 */\n this.nodeStrength = null;\n /** 边的作用力, 默认为根据节点的入度出度自适应 */\n this.edgeStrength = null;\n /** 是否防止节点相互覆盖 */\n this.preventOverlap = false;\n /** 聚类节点作用力 */\n this.clusterNodeStrength = null;\n /** 聚类边作用力 */\n this.clusterEdgeStrength = null;\n /** 聚类边长度 */\n this.clusterEdgeDistance = null;\n /** 聚类节点大小 / 直径,直径越大,越分散 */\n this.clusterNodeSize = null;\n /** 用于 foci 的力 */\n this.clusterFociStrength = null;\n /** 默认边长度 */\n this.linkDistance = 50;\n /** 迭代阈值的衰减率 [0, 1],0.028 对应最大迭代数为 300 */\n this.alphaDecay = 0.028;\n /** 停止迭代的阈值 */\n this.alphaMin = 0.001;\n /** 当前阈值 */\n this.alpha = 0.3;\n /** 防止重叠的力强度 */\n this.collideStrength = 1;\n /** 是否启用web worker。前提是在web worker里执行布局,否则无效\t*/\n this.workerEnabled = false;\n this.tick = () => { };\n /** 布局完成回调 */\n this.onLayoutEnd = () => { };\n /** 是否正在布局 */\n this.ticking = undefined;\n if (options) {\n this.updateCfg(options);\n }\n }\n getDefaultCfg() {\n return {\n center: [0, 0],\n nodeStrength: null,\n edgeStrength: null,\n preventOverlap: false,\n nodeSize: undefined,\n nodeSpacing: undefined,\n linkDistance: 50,\n forceSimulation: null,\n alphaDecay: 0.028,\n alphaMin: 0.001,\n alpha: 0.3,\n collideStrength: 1,\n clustering: false,\n clusterNodeStrength: -1,\n clusterEdgeStrength: 0.1,\n clusterEdgeDistance: 100,\n clusterFociStrength: 0.8,\n clusterNodeSize: 10,\n tick() { },\n onLayoutEnd() { },\n // 是否启用web worker。前提是在web worker里执行布局,否则无效\n workerEnabled: false\n };\n }\n /**\n * 初始化\n * @param {object} data 数据\n */\n init(data) {\n const self = this;\n self.nodes = data.nodes || [];\n const edges = data.edges || [];\n self.edges = edges.map((edge) => {\n const res = {};\n const expectKeys = [\"targetNode\", \"sourceNode\", \"startPoint\", \"endPoint\"];\n Object.keys(edge).forEach((key) => {\n if (!(expectKeys.indexOf(key) > -1)) {\n res[key] = edge[key];\n }\n });\n return res;\n });\n self.ticking = false;\n }\n /**\n * 执行布局\n */\n execute(reloadData) {\n const self = this;\n const nodes = self.nodes;\n const edges = self.edges;\n // 如果正在布局,忽略布局请求\n if (self.ticking) {\n return;\n }\n let simulation = self.forceSimulation;\n const alphaMin = self.alphaMin;\n const alphaDecay = self.alphaDecay;\n const alpha = self.alpha;\n if (!simulation) {\n try {\n // 定义节点的力\n const nodeForce = manyBody();\n if (self.nodeStrength) {\n nodeForce.strength(self.nodeStrength);\n }\n simulation = src_simulation().nodes(nodes);\n if (self.clustering) {\n const clusterForce = forceInABox();\n clusterForce\n .centerX(self.center[0])\n .centerY(self.center[1])\n .template(\"force\")\n .strength(self.clusterFociStrength);\n if (edges) {\n clusterForce.links(edges);\n }\n if (nodes) {\n clusterForce.nodes(nodes);\n }\n clusterForce\n .forceLinkDistance(self.clusterEdgeDistance)\n .forceLinkStrength(self.clusterEdgeStrength)\n .forceCharge(self.clusterNodeStrength)\n .forceNodeSize(self.clusterNodeSize);\n self.clusterForce = clusterForce;\n simulation.force(\"group\", clusterForce);\n }\n simulation\n .force(\"center\", src_center(self.center[0], self.center[1]))\n .force(\"charge\", nodeForce)\n .alpha(alpha)\n .alphaDecay(alphaDecay)\n .alphaMin(alphaMin);\n if (self.preventOverlap) {\n self.overlapProcess(simulation);\n }\n // 如果有边,定义边的力\n if (edges) {\n // d3 的 forceLayout 会重新生成边的数据模型,为了避免污染源数据\n const edgeForce = src_link()\n .id((d) => d.id)\n .links(edges);\n if (self.edgeStrength) {\n edgeForce.strength(self.edgeStrength);\n }\n if (self.linkDistance) {\n edgeForce.distance(self.linkDistance);\n }\n self.edgeForce = edgeForce;\n simulation.force(\"link\", edgeForce);\n }\n if (self.workerEnabled && !isInWorker()) {\n // 如果不是运行在web worker里,不用web worker布局\n self.workerEnabled = false;\n console.warn(\"workerEnabled option is only supported when running in web worker.\");\n }\n if (!self.workerEnabled) {\n simulation\n .on(\"tick\", () => {\n self.tick();\n })\n .on(\"end\", () => {\n self.ticking = false;\n if (self.onLayoutEnd)\n self.onLayoutEnd();\n });\n self.ticking = true;\n }\n else {\n // worker is enabled\n simulation.stop();\n const totalTicks = getSimulationTicks(simulation);\n for (let currentTick = 1; currentTick <= totalTicks; currentTick++) {\n simulation.tick();\n // currentTick starts from 1.\n postMessage({\n nodes,\n currentTick,\n totalTicks,\n type: LAYOUT_MESSAGE.TICK\n }, undefined);\n }\n self.ticking = false;\n }\n self.forceSimulation = simulation;\n self.ticking = true;\n }\n catch (e) {\n self.ticking = false;\n console.warn(e);\n }\n }\n else {\n if (reloadData) {\n if (self.clustering && self.clusterForce) {\n self.clusterForce.nodes(nodes);\n self.clusterForce.links(edges);\n }\n simulation.nodes(nodes);\n if (edges && self.edgeForce)\n self.edgeForce.links(edges);\n else if (edges && !self.edgeForce) {\n // d3 的 forceLayout 会重新生成边的数据模型,为了避免污染源数据\n const edgeForce = src_link()\n .id((d) => d.id)\n .links(edges);\n if (self.edgeStrength) {\n edgeForce.strength(self.edgeStrength);\n }\n if (self.linkDistance) {\n edgeForce.distance(self.linkDistance);\n }\n self.edgeForce = edgeForce;\n simulation.force(\"link\", edgeForce);\n }\n }\n if (self.preventOverlap) {\n self.overlapProcess(simulation);\n }\n simulation.alpha(alpha).restart();\n this.ticking = true;\n }\n }\n /**\n * 防止重叠\n * @param {object} simulation 力模拟模型\n */\n overlapProcess(simulation) {\n const self = this;\n const nodeSize = self.nodeSize;\n const nodeSpacing = self.nodeSpacing;\n let nodeSizeFunc;\n let nodeSpacingFunc;\n const collideStrength = self.collideStrength;\n if (isNumber(nodeSpacing)) {\n nodeSpacingFunc = () => nodeSpacing;\n }\n else if (isFunction(nodeSpacing)) {\n nodeSpacingFunc = nodeSpacing;\n }\n else {\n nodeSpacingFunc = () => 0;\n }\n if (!nodeSize) {\n nodeSizeFunc = (d) => {\n if (d.size) {\n if (isArray(d.size)) {\n const res = d.size[0] > d.size[1] ? d.size[0] : d.size[1];\n return res / 2 + nodeSpacingFunc(d);\n }\n if (isObject(d.size)) {\n const res = d.size.width > d.size.height ? d.size.width : d.size.height;\n return res / 2 + nodeSpacingFunc(d);\n }\n return d.size / 2 + nodeSpacingFunc(d);\n }\n return 10 + nodeSpacingFunc(d);\n };\n }\n else if (isFunction(nodeSize)) {\n nodeSizeFunc = (d) => {\n const size = nodeSize(d);\n return size + nodeSpacingFunc(d);\n };\n }\n else if (isArray(nodeSize)) {\n const larger = nodeSize[0] > nodeSize[1] ? nodeSize[0] : nodeSize[1];\n const radius = larger / 2;\n nodeSizeFunc = (d) => radius + nodeSpacingFunc(d);\n }\n else if (isNumber(nodeSize)) {\n const radius = nodeSize / 2;\n nodeSizeFunc = (d) => radius + nodeSpacingFunc(d);\n }\n else {\n nodeSizeFunc = () => 10;\n }\n // forceCollide's parameter is a radius\n simulation.force(\"collisionForce\", collide(nodeSizeFunc).strength(collideStrength));\n }\n /**\n * 更新布局配置,但不执行布局\n * @param {object} cfg 需要更新的配置项\n */\n updateCfg(cfg) {\n const self = this;\n if (self.ticking) {\n self.forceSimulation.stop();\n self.ticking = false;\n }\n self.forceSimulation = null;\n Object.assign(self, cfg);\n }\n destroy() {\n const self = this;\n if (self.ticking) {\n self.forceSimulation.stop();\n self.ticking = false;\n }\n self.nodes = null;\n self.edges = null;\n self.destroyed = true;\n }\n}\n// Return total ticks of d3-force simulation\nfunction getSimulationTicks(simulation) {\n const alphaMin = simulation.alphaMin();\n const alphaTarget = simulation.alphaTarget();\n const alpha = simulation.alpha();\n const totalTicksFloat = Math.log((alphaMin - alphaTarget) / (alpha - alphaTarget)) /\n Math.log(1 - simulation.alphaDecay());\n const totalTicks = Math.ceil(totalTicksFloat);\n return totalTicks;\n}\n// 判断是否运行在web worker里\nfunction isInWorker() {\n // eslint-disable-next-line no-undef\n return (typeof WorkerGlobalScope !== \"undefined\" &&\n self instanceof WorkerGlobalScope);\n}\n//# sourceMappingURL=force.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/layout/es/layout/force/index.js\n\n//# sourceMappingURL=index.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/layout/es/layout/circular.js\n/**\n * @fileOverview random layout\n * @author shiwu.wyy@antfin.com\n */\n\n\nfunction initHierarchy(nodes, edges, nodeMap, directed) {\n nodes.forEach((_, i) => {\n nodes[i].children = [];\n nodes[i].parent = [];\n });\n if (directed) {\n edges.forEach((e) => {\n const source = getEdgeTerminal(e, 'source');\n const target = getEdgeTerminal(e, 'target');\n let sourceIdx = 0;\n if (source) {\n sourceIdx = nodeMap[source];\n }\n let targetIdx = 0;\n if (target) {\n targetIdx = nodeMap[target];\n }\n const child = nodes[sourceIdx].children;\n const parent = nodes[targetIdx].parent;\n child.push(nodes[targetIdx].id);\n parent.push(nodes[sourceIdx].id);\n });\n }\n else {\n edges.forEach((e) => {\n const source = getEdgeTerminal(e, 'source');\n const target = getEdgeTerminal(e, 'target');\n let sourceIdx = 0;\n if (source) {\n sourceIdx = nodeMap[source];\n }\n let targetIdx = 0;\n if (target) {\n targetIdx = nodeMap[target];\n }\n const sourceChildren = nodes[sourceIdx].children;\n const targetChildren = nodes[targetIdx].children;\n sourceChildren.push(nodes[targetIdx].id);\n targetChildren.push(nodes[sourceIdx].id);\n });\n }\n}\nfunction connect(a, b, edges) {\n const m = edges.length;\n for (let i = 0; i < m; i++) {\n const source = getEdgeTerminal(edges[i], 'source');\n const target = getEdgeTerminal(edges[i], 'target');\n if ((a.id === source && b.id === target) ||\n (b.id === source && a.id === target)) {\n return true;\n }\n }\n return false;\n}\nfunction compareDegree(a, b) {\n const aDegree = a.degree;\n const bDegree = b.degree;\n if (aDegree < bDegree) {\n return -1;\n }\n if (aDegree > bDegree) {\n return 1;\n }\n return 0;\n}\n/**\n * 圆形布局\n */\nclass circular_CircularLayout extends Base {\n constructor(options) {\n super();\n /** 固定半径,若设置了 radius,则 startRadius 与 endRadius 不起效 */\n this.radius = null;\n /** 起始半径 */\n this.startRadius = null;\n /** 终止半径 */\n this.endRadius = null;\n /** 起始角度 */\n this.startAngle = 0;\n /** 终止角度 */\n this.endAngle = 2 * Math.PI;\n /** 是否顺时针 */\n this.clockwise = true;\n /** 节点在环上分成段数(几个段将均匀分布),在 endRadius - startRadius != 0 时生效 */\n this.divisions = 1;\n /** 节点在环上排序的依据,可选: 'topology', 'degree', 'null' */\n this.ordering = null;\n /** how many 2*pi from first to last nodes */\n this.angleRatio = 1;\n this.nodes = [];\n this.edges = [];\n this.nodeMap = {};\n this.degrees = [];\n this.width = 300;\n this.height = 300;\n this.updateCfg(options);\n }\n getDefaultCfg() {\n return {\n radius: null,\n startRadius: null,\n endRadius: null,\n startAngle: 0,\n endAngle: 2 * Math.PI,\n clockwise: true,\n divisions: 1,\n ordering: null,\n angleRatio: 1\n };\n }\n /**\n * 执行布局\n */\n execute() {\n const self = this;\n const nodes = self.nodes;\n const edges = self.edges;\n const n = nodes.length;\n if (n === 0) {\n if (self.onLayoutEnd)\n self.onLayoutEnd();\n return;\n }\n if (!self.width && typeof window !== \"undefined\") {\n self.width = window.innerWidth;\n }\n if (!self.height && typeof window !== \"undefined\") {\n self.height = window.innerHeight;\n }\n if (!self.center) {\n self.center = [self.width / 2, self.height / 2];\n }\n const center = self.center;\n if (n === 1) {\n nodes[0].x = center[0];\n nodes[0].y = center[1];\n if (self.onLayoutEnd)\n self.onLayoutEnd();\n return;\n }\n let radius = self.radius;\n let startRadius = self.startRadius;\n let endRadius = self.endRadius;\n const divisions = self.divisions;\n const startAngle = self.startAngle;\n const endAngle = self.endAngle;\n const angleStep = (endAngle - startAngle) / n;\n // layout\n const nodeMap = {};\n nodes.forEach((node, i) => {\n nodeMap[node.id] = i;\n });\n self.nodeMap = nodeMap;\n const degrees = math_getDegree(nodes.length, nodeMap, edges);\n self.degrees = degrees;\n if (!radius && !startRadius && !endRadius) {\n radius = self.height > self.width ? self.width / 2 : self.height / 2;\n }\n else if (!startRadius && endRadius) {\n startRadius = endRadius;\n }\n else if (startRadius && !endRadius) {\n endRadius = startRadius;\n }\n const angleRatio = self.angleRatio;\n const astep = angleStep * angleRatio;\n const ordering = self.ordering;\n let layoutNodes = [];\n if (ordering === \"topology\") {\n // layout according to the topology\n layoutNodes = self.topologyOrdering();\n }\n else if (ordering === \"topology-directed\") {\n // layout according to the topology\n layoutNodes = self.topologyOrdering(true);\n }\n else if (ordering === \"degree\") {\n // layout according to the descent order of degrees\n layoutNodes = self.degreeOrdering();\n }\n else {\n // layout according to the original order in the data.nodes\n layoutNodes = nodes;\n }\n const clockwise = self.clockwise;\n const divN = Math.ceil(n / divisions); // node number in each division\n for (let i = 0; i < n; ++i) {\n let r = radius;\n if (!r && startRadius !== null && endRadius !== null) {\n r = startRadius + (i * (endRadius - startRadius)) / (n - 1);\n }\n if (!r) {\n r = 10 + (i * 100) / (n - 1);\n }\n let angle = startAngle +\n (i % divN) * astep +\n ((2 * Math.PI) / divisions) * Math.floor(i / divN);\n if (!clockwise) {\n angle =\n endAngle -\n (i % divN) * astep -\n ((2 * Math.PI) / divisions) * Math.floor(i / divN);\n }\n layoutNodes[i].x = center[0] + Math.cos(angle) * r;\n layoutNodes[i].y = center[1] + Math.sin(angle) * r;\n layoutNodes[i].weight = degrees[i];\n }\n if (self.onLayoutEnd)\n self.onLayoutEnd();\n return {\n nodes: layoutNodes,\n edges: this.edges\n };\n }\n /**\n * 根据节点的拓扑结构排序\n * @return {array} orderedNodes 排序后的结果\n */\n topologyOrdering(directed = false) {\n const self = this;\n const degrees = self.degrees;\n const edges = self.edges;\n const nodes = self.nodes;\n const cnodes = clone(nodes);\n const nodeMap = self.nodeMap;\n const orderedCNodes = [cnodes[0]];\n const resNodes = [nodes[0]];\n const pickFlags = [];\n const n = nodes.length;\n pickFlags[0] = true;\n initHierarchy(cnodes, edges, nodeMap, directed);\n let k = 0;\n cnodes.forEach((cnode, i) => {\n if (i !== 0) {\n if ((i === n - 1 ||\n degrees[i] !== degrees[i + 1] ||\n connect(orderedCNodes[k], cnode, edges)) &&\n !pickFlags[i]) {\n orderedCNodes.push(cnode);\n resNodes.push(nodes[nodeMap[cnode.id]]);\n pickFlags[i] = true;\n k++;\n }\n else {\n const children = orderedCNodes[k].children;\n let foundChild = false;\n for (let j = 0; j < children.length; j++) {\n const childIdx = nodeMap[children[j]];\n if (degrees[childIdx] === degrees[i] && !pickFlags[childIdx]) {\n orderedCNodes.push(cnodes[childIdx]);\n resNodes.push(nodes[nodeMap[cnodes[childIdx].id]]);\n pickFlags[childIdx] = true;\n foundChild = true;\n break;\n }\n }\n let ii = 0;\n while (!foundChild) {\n if (!pickFlags[ii]) {\n orderedCNodes.push(cnodes[ii]);\n resNodes.push(nodes[nodeMap[cnodes[ii].id]]);\n pickFlags[ii] = true;\n foundChild = true;\n }\n ii++;\n if (ii === n) {\n break;\n }\n }\n }\n }\n });\n return resNodes;\n }\n /**\n * 根据节点度数大小排序\n * @return {array} orderedNodes 排序后的结果\n */\n degreeOrdering() {\n const self = this;\n const nodes = self.nodes;\n const orderedNodes = [];\n const degrees = self.degrees;\n nodes.forEach((node, i) => {\n node.degree = degrees[i];\n orderedNodes.push(node);\n });\n orderedNodes.sort(compareDegree);\n return orderedNodes;\n }\n getType() {\n return \"circular\";\n }\n}\n//# sourceMappingURL=circular.js.map\n// EXTERNAL MODULE: ./node_modules/dagrejs/index.js\nvar dagrejs = __webpack_require__(144);\nvar dagrejs_default = /*#__PURE__*/__webpack_require__.n(dagrejs);\n\n// CONCATENATED MODULE: ./node_modules/@antv/layout/es/layout/dagre.js\n/**\n * @fileOverview random layout\n * @author shiwu.wyy@antfin.com\n */\n\n\n\n/**\n * 层次布局\n */\nclass dagre_DagreLayout extends Base {\n constructor(options) {\n super();\n /** layout 方向, 可选 TB, BT, LR, RL */\n this.rankdir = \"TB\";\n /** 节点水平间距(px) */\n this.nodesep = 50;\n /** 每一层节点之间间距 */\n this.ranksep = 50;\n /** 是否保留布局连线的控制点 */\n this.controlPoints = false;\n /** 每层节点是否根据节点数据中的 comboId 进行排序,以防止同层 combo 重叠 */\n this.sortByCombo = false;\n /** 是否保留每条边上的dummy node */\n this.edgeLabelSpace = true;\n /** 是否按照给定的节点顺序排序 */\n this.keepNodeOrder = false;\n this.nodes = [];\n this.edges = [];\n /** 迭代结束的回调函数 */\n this.onLayoutEnd = () => { };\n this.layoutNode = (nodeId) => {\n const self = this;\n const { nodes } = self;\n const node = nodes.find(node => node.id === nodeId);\n if (node) {\n const layout = node.layout !== false;\n return layout;\n }\n return true;\n };\n this.updateCfg(options);\n }\n getDefaultCfg() {\n return {\n rankdir: \"TB\",\n align: undefined,\n nodeSize: undefined,\n nodesepFunc: undefined,\n ranksepFunc: undefined,\n nodesep: 50,\n ranksep: 50,\n controlPoints: false, // 是否保留布局连线的控制点\n };\n }\n /**\n * 执行布局\n */\n execute() {\n const self = this;\n const { nodes, nodeSize, rankdir, combos } = self;\n if (!nodes)\n return;\n const edges = self.edges || [];\n const g = new dagrejs_default.a.graphlib.Graph({\n multigraph: true,\n compound: true,\n });\n let nodeSizeFunc;\n if (!nodeSize) {\n nodeSizeFunc = (d) => {\n if (d.size) {\n if (isArray(d.size)) {\n return d.size;\n }\n if (isObject(d.size)) {\n return [d.size.width || 40, d.size.height || 40];\n }\n return [d.size, d.size];\n }\n return [40, 40];\n };\n }\n else if (isArray(nodeSize)) {\n nodeSizeFunc = () => nodeSize;\n }\n else {\n nodeSizeFunc = () => [nodeSize, nodeSize];\n }\n let horisep = getFunc(self.nodesepFunc, self.nodesep, 50);\n let vertisep = getFunc(self.ranksepFunc, self.ranksep, 50);\n if (rankdir === \"LR\" || rankdir === \"RL\") {\n horisep = getFunc(self.ranksepFunc, self.ranksep, 50);\n vertisep = getFunc(self.nodesepFunc, self.nodesep, 50);\n }\n g.setDefaultEdgeLabel(() => ({}));\n g.setGraph(self);\n const comboMap = {};\n nodes.filter((node) => node.layout !== false).forEach((node) => {\n const size = nodeSizeFunc(node);\n const verti = vertisep(node);\n const hori = horisep(node);\n const width = size[0] + 2 * hori;\n const height = size[1] + 2 * verti;\n const layer = node.layer;\n if (isNumber(layer)) {\n // 如果有layer属性,加入到node的label中\n g.setNode(node.id, { width, height, layer });\n }\n else {\n g.setNode(node.id, { width, height });\n }\n if (this.sortByCombo && node.comboId) {\n if (!comboMap[node.comboId]) {\n comboMap[node.comboId] = true;\n g.setNode(node.comboId, {});\n }\n g.setParent(node.id, node.comboId);\n }\n });\n if (this.sortByCombo && combos) {\n combos.forEach((combo) => {\n if (!combo.parentId)\n return;\n if (!comboMap[combo.parentId]) {\n comboMap[combo.parentId] = true;\n g.setNode(combo.parentId, {});\n }\n g.setParent(combo.id, combo.parentId);\n });\n }\n edges.forEach((edge) => {\n // dagrejs Wiki https://github.com/dagrejs/dagre/wiki#configuring-the-layout\n const source = getEdgeTerminal(edge, 'source');\n const target = getEdgeTerminal(edge, 'target');\n if (this.layoutNode(source) && this.layoutNode(target)) {\n g.setEdge(source, target, {\n weight: edge.weight || 1,\n });\n }\n });\n // 考虑增量图中的原始图\n let prevGraph = undefined;\n if (self.preset) {\n prevGraph = new dagrejs_default.a.graphlib.Graph({\n multigraph: true,\n compound: true,\n });\n self.preset.nodes.forEach((node) => {\n prevGraph === null || prevGraph === void 0 ? void 0 : prevGraph.setNode(node.id, node);\n });\n }\n dagrejs_default.a.layout(g, {\n prevGraph,\n edgeLabelSpace: self.edgeLabelSpace,\n keepNodeOrder: self.keepNodeOrder,\n nodeOrder: self.nodeOrder,\n });\n let coord;\n g.nodes().forEach((node) => {\n coord = g.node(node);\n const i = nodes.findIndex((it) => it.id === node);\n if (!nodes[i])\n return;\n nodes[i].x = coord.x;\n nodes[i].y = coord.y;\n // @ts-ignore: pass layer order to data for increment layout use\n nodes[i]._order = coord._order;\n });\n g.edges().forEach((edge) => {\n coord = g.edge(edge);\n const i = edges.findIndex((it) => {\n const source = getEdgeTerminal(it, 'source');\n const target = getEdgeTerminal(it, 'target');\n return source === edge.v && target === edge.w;\n });\n if ((self.edgeLabelSpace) && self.controlPoints && edges[i].type !== \"loop\") {\n edges[i].controlPoints = coord.points.slice(1, coord.points.length - 1);\n }\n });\n if (self.onLayoutEnd)\n self.onLayoutEnd();\n return {\n nodes,\n edges,\n };\n }\n getType() {\n return \"dagre\";\n }\n}\nfunction getFunc(func, value, defaultValue) {\n let resultFunc;\n if (func) {\n resultFunc = func;\n }\n else if (isNumber(value)) {\n resultFunc = () => value;\n }\n else {\n resultFunc = () => defaultValue;\n }\n return resultFunc;\n}\n//# sourceMappingURL=dagre.js.map\n// CONCATENATED MODULE: ./node_modules/is-any-array/src/index.js\nconst src_toString = Object.prototype.toString;\n\nfunction isAnyArray(object) {\n return src_toString.call(object).endsWith('Array]');\n}\n\n// CONCATENATED MODULE: ./node_modules/ml-array-max/lib-es6/index.js\n\n\nfunction lib_es6_max(input) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n if (!isAnyArray(input)) {\n throw new TypeError('input must be an array');\n }\n\n if (input.length === 0) {\n throw new TypeError('input must not be empty');\n }\n\n var _options$fromIndex = options.fromIndex,\n fromIndex = _options$fromIndex === void 0 ? 0 : _options$fromIndex,\n _options$toIndex = options.toIndex,\n toIndex = _options$toIndex === void 0 ? input.length : _options$toIndex;\n\n if (fromIndex < 0 || fromIndex >= input.length || !Number.isInteger(fromIndex)) {\n throw new Error('fromIndex must be a positive integer smaller than length');\n }\n\n if (toIndex <= fromIndex || toIndex > input.length || !Number.isInteger(toIndex)) {\n throw new Error('toIndex must be an integer greater than fromIndex and at most equal to length');\n }\n\n var maxValue = input[fromIndex];\n\n for (var i = fromIndex + 1; i < toIndex; i++) {\n if (input[i] > maxValue) maxValue = input[i];\n }\n\n return maxValue;\n}\n\n/* harmony default export */ var lib_es6 = (lib_es6_max);\n\n// CONCATENATED MODULE: ./node_modules/ml-array-min/lib-es6/index.js\n\n\nfunction lib_es6_min(input) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n if (!isAnyArray(input)) {\n throw new TypeError('input must be an array');\n }\n\n if (input.length === 0) {\n throw new TypeError('input must not be empty');\n }\n\n var _options$fromIndex = options.fromIndex,\n fromIndex = _options$fromIndex === void 0 ? 0 : _options$fromIndex,\n _options$toIndex = options.toIndex,\n toIndex = _options$toIndex === void 0 ? input.length : _options$toIndex;\n\n if (fromIndex < 0 || fromIndex >= input.length || !Number.isInteger(fromIndex)) {\n throw new Error('fromIndex must be a positive integer smaller than length');\n }\n\n if (toIndex <= fromIndex || toIndex > input.length || !Number.isInteger(toIndex)) {\n throw new Error('toIndex must be an integer greater than fromIndex and at most equal to length');\n }\n\n var minValue = input[fromIndex];\n\n for (var i = fromIndex + 1; i < toIndex; i++) {\n if (input[i] < minValue) minValue = input[i];\n }\n\n return minValue;\n}\n\n/* harmony default export */ var ml_array_min_lib_es6 = (lib_es6_min);\n\n// CONCATENATED MODULE: ./node_modules/ml-array-rescale/lib-es6/index.js\n\n\n\n\nfunction rescale(input) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n if (!isAnyArray(input)) {\n throw new TypeError('input must be an array');\n } else if (input.length === 0) {\n throw new TypeError('input must not be empty');\n }\n\n var output;\n\n if (options.output !== undefined) {\n if (!isAnyArray(options.output)) {\n throw new TypeError('output option must be an array if specified');\n }\n\n output = options.output;\n } else {\n output = new Array(input.length);\n }\n\n var currentMin = ml_array_min_lib_es6(input);\n var currentMax = lib_es6(input);\n\n if (currentMin === currentMax) {\n throw new RangeError('minimum and maximum input values are equal. Cannot rescale a constant array');\n }\n\n var _options$min = options.min,\n minValue = _options$min === void 0 ? options.autoMinMax ? currentMin : 0 : _options$min,\n _options$max = options.max,\n maxValue = _options$max === void 0 ? options.autoMinMax ? currentMax : 1 : _options$max;\n\n if (minValue >= maxValue) {\n throw new RangeError('min option must be smaller than max option');\n }\n\n var factor = (maxValue - minValue) / (currentMax - currentMin);\n\n for (var i = 0; i < input.length; i++) {\n output[i] = (input[i] - currentMin) * factor + minValue;\n }\n\n return output;\n}\n\n\n\n// CONCATENATED MODULE: ./node_modules/ml-matrix/src/inspect.js\nconst indent = ' '.repeat(2);\nconst indentData = ' '.repeat(4);\n\nfunction inspectMatrix() {\n return inspectMatrixWithOptions(this);\n}\n\nfunction inspectMatrixWithOptions(matrix, options = {}) {\n const { maxRows = 15, maxColumns = 10, maxNumSize = 8 } = options;\n return `${matrix.constructor.name} {\n${indent}[\n${indentData}${inspectData(matrix, maxRows, maxColumns, maxNumSize)}\n${indent}]\n${indent}rows: ${matrix.rows}\n${indent}columns: ${matrix.columns}\n}`;\n}\n\nfunction inspectData(matrix, maxRows, maxColumns, maxNumSize) {\n const { rows, columns } = matrix;\n const maxI = Math.min(rows, maxRows);\n const maxJ = Math.min(columns, maxColumns);\n const result = [];\n for (let i = 0; i < maxI; i++) {\n let line = [];\n for (let j = 0; j < maxJ; j++) {\n line.push(formatNumber(matrix.get(i, j), maxNumSize));\n }\n result.push(`${line.join(' ')}`);\n }\n if (maxJ !== columns) {\n result[result.length - 1] += ` ... ${columns - maxColumns} more columns`;\n }\n if (maxI !== rows) {\n result.push(`... ${rows - maxRows} more rows`);\n }\n return result.join(`\\n${indentData}`);\n}\n\nfunction formatNumber(num, maxNumSize) {\n const numStr = String(num);\n if (numStr.length <= maxNumSize) {\n return numStr.padEnd(maxNumSize, ' ');\n }\n const precise = num.toPrecision(maxNumSize - 2);\n if (precise.length <= maxNumSize) {\n return precise;\n }\n const exponential = num.toExponential(maxNumSize - 2);\n const eIndex = exponential.indexOf('e');\n const e = exponential.slice(eIndex);\n return exponential.slice(0, maxNumSize - e.length) + e;\n}\n\n// CONCATENATED MODULE: ./node_modules/ml-matrix/src/mathOperations.js\nfunction installMathOperations(AbstractMatrix, Matrix) {\n AbstractMatrix.prototype.add = function add(value) {\n if (typeof value === 'number') return this.addS(value);\n return this.addM(value);\n };\n\n AbstractMatrix.prototype.addS = function addS(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) + value);\n }\n }\n return this;\n };\n\n AbstractMatrix.prototype.addM = function addM(matrix) {\n matrix = Matrix.checkMatrix(matrix);\n if (this.rows !== matrix.rows ||\n this.columns !== matrix.columns) {\n throw new RangeError('Matrices dimensions must be equal');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) + matrix.get(i, j));\n }\n }\n return this;\n };\n\n AbstractMatrix.add = function add(matrix, value) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.add(value);\n };\n\n AbstractMatrix.prototype.sub = function sub(value) {\n if (typeof value === 'number') return this.subS(value);\n return this.subM(value);\n };\n\n AbstractMatrix.prototype.subS = function subS(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) - value);\n }\n }\n return this;\n };\n\n AbstractMatrix.prototype.subM = function subM(matrix) {\n matrix = Matrix.checkMatrix(matrix);\n if (this.rows !== matrix.rows ||\n this.columns !== matrix.columns) {\n throw new RangeError('Matrices dimensions must be equal');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) - matrix.get(i, j));\n }\n }\n return this;\n };\n\n AbstractMatrix.sub = function sub(matrix, value) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.sub(value);\n };\n AbstractMatrix.prototype.subtract = AbstractMatrix.prototype.sub;\n AbstractMatrix.prototype.subtractS = AbstractMatrix.prototype.subS;\n AbstractMatrix.prototype.subtractM = AbstractMatrix.prototype.subM;\n AbstractMatrix.subtract = AbstractMatrix.sub;\n\n AbstractMatrix.prototype.mul = function mul(value) {\n if (typeof value === 'number') return this.mulS(value);\n return this.mulM(value);\n };\n\n AbstractMatrix.prototype.mulS = function mulS(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) * value);\n }\n }\n return this;\n };\n\n AbstractMatrix.prototype.mulM = function mulM(matrix) {\n matrix = Matrix.checkMatrix(matrix);\n if (this.rows !== matrix.rows ||\n this.columns !== matrix.columns) {\n throw new RangeError('Matrices dimensions must be equal');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) * matrix.get(i, j));\n }\n }\n return this;\n };\n\n AbstractMatrix.mul = function mul(matrix, value) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.mul(value);\n };\n AbstractMatrix.prototype.multiply = AbstractMatrix.prototype.mul;\n AbstractMatrix.prototype.multiplyS = AbstractMatrix.prototype.mulS;\n AbstractMatrix.prototype.multiplyM = AbstractMatrix.prototype.mulM;\n AbstractMatrix.multiply = AbstractMatrix.mul;\n\n AbstractMatrix.prototype.div = function div(value) {\n if (typeof value === 'number') return this.divS(value);\n return this.divM(value);\n };\n\n AbstractMatrix.prototype.divS = function divS(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) / value);\n }\n }\n return this;\n };\n\n AbstractMatrix.prototype.divM = function divM(matrix) {\n matrix = Matrix.checkMatrix(matrix);\n if (this.rows !== matrix.rows ||\n this.columns !== matrix.columns) {\n throw new RangeError('Matrices dimensions must be equal');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) / matrix.get(i, j));\n }\n }\n return this;\n };\n\n AbstractMatrix.div = function div(matrix, value) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.div(value);\n };\n AbstractMatrix.prototype.divide = AbstractMatrix.prototype.div;\n AbstractMatrix.prototype.divideS = AbstractMatrix.prototype.divS;\n AbstractMatrix.prototype.divideM = AbstractMatrix.prototype.divM;\n AbstractMatrix.divide = AbstractMatrix.div;\n\n AbstractMatrix.prototype.mod = function mod(value) {\n if (typeof value === 'number') return this.modS(value);\n return this.modM(value);\n };\n\n AbstractMatrix.prototype.modS = function modS(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) % value);\n }\n }\n return this;\n };\n\n AbstractMatrix.prototype.modM = function modM(matrix) {\n matrix = Matrix.checkMatrix(matrix);\n if (this.rows !== matrix.rows ||\n this.columns !== matrix.columns) {\n throw new RangeError('Matrices dimensions must be equal');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) % matrix.get(i, j));\n }\n }\n return this;\n };\n\n AbstractMatrix.mod = function mod(matrix, value) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.mod(value);\n };\n AbstractMatrix.prototype.modulus = AbstractMatrix.prototype.mod;\n AbstractMatrix.prototype.modulusS = AbstractMatrix.prototype.modS;\n AbstractMatrix.prototype.modulusM = AbstractMatrix.prototype.modM;\n AbstractMatrix.modulus = AbstractMatrix.mod;\n\n AbstractMatrix.prototype.and = function and(value) {\n if (typeof value === 'number') return this.andS(value);\n return this.andM(value);\n };\n\n AbstractMatrix.prototype.andS = function andS(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) & value);\n }\n }\n return this;\n };\n\n AbstractMatrix.prototype.andM = function andM(matrix) {\n matrix = Matrix.checkMatrix(matrix);\n if (this.rows !== matrix.rows ||\n this.columns !== matrix.columns) {\n throw new RangeError('Matrices dimensions must be equal');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) & matrix.get(i, j));\n }\n }\n return this;\n };\n\n AbstractMatrix.and = function and(matrix, value) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.and(value);\n };\n\n AbstractMatrix.prototype.or = function or(value) {\n if (typeof value === 'number') return this.orS(value);\n return this.orM(value);\n };\n\n AbstractMatrix.prototype.orS = function orS(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) | value);\n }\n }\n return this;\n };\n\n AbstractMatrix.prototype.orM = function orM(matrix) {\n matrix = Matrix.checkMatrix(matrix);\n if (this.rows !== matrix.rows ||\n this.columns !== matrix.columns) {\n throw new RangeError('Matrices dimensions must be equal');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) | matrix.get(i, j));\n }\n }\n return this;\n };\n\n AbstractMatrix.or = function or(matrix, value) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.or(value);\n };\n\n AbstractMatrix.prototype.xor = function xor(value) {\n if (typeof value === 'number') return this.xorS(value);\n return this.xorM(value);\n };\n\n AbstractMatrix.prototype.xorS = function xorS(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) ^ value);\n }\n }\n return this;\n };\n\n AbstractMatrix.prototype.xorM = function xorM(matrix) {\n matrix = Matrix.checkMatrix(matrix);\n if (this.rows !== matrix.rows ||\n this.columns !== matrix.columns) {\n throw new RangeError('Matrices dimensions must be equal');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) ^ matrix.get(i, j));\n }\n }\n return this;\n };\n\n AbstractMatrix.xor = function xor(matrix, value) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.xor(value);\n };\n\n AbstractMatrix.prototype.leftShift = function leftShift(value) {\n if (typeof value === 'number') return this.leftShiftS(value);\n return this.leftShiftM(value);\n };\n\n AbstractMatrix.prototype.leftShiftS = function leftShiftS(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) << value);\n }\n }\n return this;\n };\n\n AbstractMatrix.prototype.leftShiftM = function leftShiftM(matrix) {\n matrix = Matrix.checkMatrix(matrix);\n if (this.rows !== matrix.rows ||\n this.columns !== matrix.columns) {\n throw new RangeError('Matrices dimensions must be equal');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) << matrix.get(i, j));\n }\n }\n return this;\n };\n\n AbstractMatrix.leftShift = function leftShift(matrix, value) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.leftShift(value);\n };\n\n AbstractMatrix.prototype.signPropagatingRightShift = function signPropagatingRightShift(value) {\n if (typeof value === 'number') return this.signPropagatingRightShiftS(value);\n return this.signPropagatingRightShiftM(value);\n };\n\n AbstractMatrix.prototype.signPropagatingRightShiftS = function signPropagatingRightShiftS(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) >> value);\n }\n }\n return this;\n };\n\n AbstractMatrix.prototype.signPropagatingRightShiftM = function signPropagatingRightShiftM(matrix) {\n matrix = Matrix.checkMatrix(matrix);\n if (this.rows !== matrix.rows ||\n this.columns !== matrix.columns) {\n throw new RangeError('Matrices dimensions must be equal');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) >> matrix.get(i, j));\n }\n }\n return this;\n };\n\n AbstractMatrix.signPropagatingRightShift = function signPropagatingRightShift(matrix, value) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.signPropagatingRightShift(value);\n };\n\n AbstractMatrix.prototype.rightShift = function rightShift(value) {\n if (typeof value === 'number') return this.rightShiftS(value);\n return this.rightShiftM(value);\n };\n\n AbstractMatrix.prototype.rightShiftS = function rightShiftS(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) >>> value);\n }\n }\n return this;\n };\n\n AbstractMatrix.prototype.rightShiftM = function rightShiftM(matrix) {\n matrix = Matrix.checkMatrix(matrix);\n if (this.rows !== matrix.rows ||\n this.columns !== matrix.columns) {\n throw new RangeError('Matrices dimensions must be equal');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) >>> matrix.get(i, j));\n }\n }\n return this;\n };\n\n AbstractMatrix.rightShift = function rightShift(matrix, value) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.rightShift(value);\n };\n AbstractMatrix.prototype.zeroFillRightShift = AbstractMatrix.prototype.rightShift;\n AbstractMatrix.prototype.zeroFillRightShiftS = AbstractMatrix.prototype.rightShiftS;\n AbstractMatrix.prototype.zeroFillRightShiftM = AbstractMatrix.prototype.rightShiftM;\n AbstractMatrix.zeroFillRightShift = AbstractMatrix.rightShift;\n\n AbstractMatrix.prototype.not = function not() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, ~(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.not = function not(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.not();\n };\n\n AbstractMatrix.prototype.abs = function abs() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.abs(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.abs = function abs(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.abs();\n };\n\n AbstractMatrix.prototype.acos = function acos() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.acos(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.acos = function acos(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.acos();\n };\n\n AbstractMatrix.prototype.acosh = function acosh() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.acosh(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.acosh = function acosh(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.acosh();\n };\n\n AbstractMatrix.prototype.asin = function asin() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.asin(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.asin = function asin(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.asin();\n };\n\n AbstractMatrix.prototype.asinh = function asinh() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.asinh(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.asinh = function asinh(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.asinh();\n };\n\n AbstractMatrix.prototype.atan = function atan() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.atan(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.atan = function atan(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.atan();\n };\n\n AbstractMatrix.prototype.atanh = function atanh() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.atanh(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.atanh = function atanh(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.atanh();\n };\n\n AbstractMatrix.prototype.cbrt = function cbrt() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.cbrt(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.cbrt = function cbrt(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.cbrt();\n };\n\n AbstractMatrix.prototype.ceil = function ceil() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.ceil(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.ceil = function ceil(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.ceil();\n };\n\n AbstractMatrix.prototype.clz32 = function clz32() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.clz32(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.clz32 = function clz32(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.clz32();\n };\n\n AbstractMatrix.prototype.cos = function cos() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.cos(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.cos = function cos(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.cos();\n };\n\n AbstractMatrix.prototype.cosh = function cosh() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.cosh(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.cosh = function cosh(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.cosh();\n };\n\n AbstractMatrix.prototype.exp = function exp() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.exp(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.exp = function exp(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.exp();\n };\n\n AbstractMatrix.prototype.expm1 = function expm1() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.expm1(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.expm1 = function expm1(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.expm1();\n };\n\n AbstractMatrix.prototype.floor = function floor() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.floor(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.floor = function floor(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.floor();\n };\n\n AbstractMatrix.prototype.fround = function fround() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.fround(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.fround = function fround(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.fround();\n };\n\n AbstractMatrix.prototype.log = function log() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.log(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.log = function log(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.log();\n };\n\n AbstractMatrix.prototype.log1p = function log1p() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.log1p(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.log1p = function log1p(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.log1p();\n };\n\n AbstractMatrix.prototype.log10 = function log10() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.log10(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.log10 = function log10(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.log10();\n };\n\n AbstractMatrix.prototype.log2 = function log2() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.log2(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.log2 = function log2(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.log2();\n };\n\n AbstractMatrix.prototype.round = function round() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.round(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.round = function round(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.round();\n };\n\n AbstractMatrix.prototype.sign = function sign() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.sign(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.sign = function sign(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.sign();\n };\n\n AbstractMatrix.prototype.sin = function sin() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.sin(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.sin = function sin(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.sin();\n };\n\n AbstractMatrix.prototype.sinh = function sinh() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.sinh(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.sinh = function sinh(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.sinh();\n };\n\n AbstractMatrix.prototype.sqrt = function sqrt() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.sqrt(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.sqrt = function sqrt(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.sqrt();\n };\n\n AbstractMatrix.prototype.tan = function tan() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.tan(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.tan = function tan(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.tan();\n };\n\n AbstractMatrix.prototype.tanh = function tanh() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.tanh(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.tanh = function tanh(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.tanh();\n };\n\n AbstractMatrix.prototype.trunc = function trunc() {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.trunc(this.get(i, j)));\n }\n }\n return this;\n };\n\n AbstractMatrix.trunc = function trunc(matrix) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.trunc();\n };\n\n AbstractMatrix.pow = function pow(matrix, arg0) {\n const newMatrix = new Matrix(matrix);\n return newMatrix.pow(arg0);\n };\n\n AbstractMatrix.prototype.pow = function pow(value) {\n if (typeof value === 'number') return this.powS(value);\n return this.powM(value);\n };\n\n AbstractMatrix.prototype.powS = function powS(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.pow(this.get(i, j), value));\n }\n }\n return this;\n };\n\n AbstractMatrix.prototype.powM = function powM(matrix) {\n matrix = Matrix.checkMatrix(matrix);\n if (this.rows !== matrix.rows ||\n this.columns !== matrix.columns) {\n throw new RangeError('Matrices dimensions must be equal');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, Math.pow(this.get(i, j), matrix.get(i, j)));\n }\n }\n return this;\n };\n}\n\n// CONCATENATED MODULE: ./node_modules/ml-matrix/src/util.js\n/**\n * @private\n * Check that a row index is not out of bounds\n * @param {Matrix} matrix\n * @param {number} index\n * @param {boolean} [outer]\n */\nfunction checkRowIndex(matrix, index, outer) {\n let max = outer ? matrix.rows : matrix.rows - 1;\n if (index < 0 || index > max) {\n throw new RangeError('Row index out of range');\n }\n}\n\n/**\n * @private\n * Check that a column index is not out of bounds\n * @param {Matrix} matrix\n * @param {number} index\n * @param {boolean} [outer]\n */\nfunction checkColumnIndex(matrix, index, outer) {\n let max = outer ? matrix.columns : matrix.columns - 1;\n if (index < 0 || index > max) {\n throw new RangeError('Column index out of range');\n }\n}\n\n/**\n * @private\n * Check that the provided vector is an array with the right length\n * @param {Matrix} matrix\n * @param {Array|Matrix} vector\n * @return {Array}\n * @throws {RangeError}\n */\nfunction checkRowVector(matrix, vector) {\n if (vector.to1DArray) {\n vector = vector.to1DArray();\n }\n if (vector.length !== matrix.columns) {\n throw new RangeError(\n 'vector size must be the same as the number of columns',\n );\n }\n return vector;\n}\n\n/**\n * @private\n * Check that the provided vector is an array with the right length\n * @param {Matrix} matrix\n * @param {Array|Matrix} vector\n * @return {Array}\n * @throws {RangeError}\n */\nfunction checkColumnVector(matrix, vector) {\n if (vector.to1DArray) {\n vector = vector.to1DArray();\n }\n if (vector.length !== matrix.rows) {\n throw new RangeError('vector size must be the same as the number of rows');\n }\n return vector;\n}\n\nfunction checkIndices(matrix, rowIndices, columnIndices) {\n return {\n row: checkRowIndices(matrix, rowIndices),\n column: checkColumnIndices(matrix, columnIndices),\n };\n}\n\nfunction checkRowIndices(matrix, rowIndices) {\n if (typeof rowIndices !== 'object') {\n throw new TypeError('unexpected type for row indices');\n }\n\n let rowOut = rowIndices.some((r) => {\n return r < 0 || r >= matrix.rows;\n });\n\n if (rowOut) {\n throw new RangeError('row indices are out of range');\n }\n\n if (!Array.isArray(rowIndices)) rowIndices = Array.from(rowIndices);\n\n return rowIndices;\n}\n\nfunction checkColumnIndices(matrix, columnIndices) {\n if (typeof columnIndices !== 'object') {\n throw new TypeError('unexpected type for column indices');\n }\n\n let columnOut = columnIndices.some((c) => {\n return c < 0 || c >= matrix.columns;\n });\n\n if (columnOut) {\n throw new RangeError('column indices are out of range');\n }\n if (!Array.isArray(columnIndices)) columnIndices = Array.from(columnIndices);\n\n return columnIndices;\n}\n\nfunction checkRange(matrix, startRow, endRow, startColumn, endColumn) {\n if (arguments.length !== 5) {\n throw new RangeError('expected 4 arguments');\n }\n checkNumber('startRow', startRow);\n checkNumber('endRow', endRow);\n checkNumber('startColumn', startColumn);\n checkNumber('endColumn', endColumn);\n if (\n startRow > endRow ||\n startColumn > endColumn ||\n startRow < 0 ||\n startRow >= matrix.rows ||\n endRow < 0 ||\n endRow >= matrix.rows ||\n startColumn < 0 ||\n startColumn >= matrix.columns ||\n endColumn < 0 ||\n endColumn >= matrix.columns\n ) {\n throw new RangeError('Submatrix indices are out of range');\n }\n}\n\nfunction newArray(length, value = 0) {\n let array = [];\n for (let i = 0; i < length; i++) {\n array.push(value);\n }\n return array;\n}\n\nfunction checkNumber(name, value) {\n if (typeof value !== 'number') {\n throw new TypeError(`${name} must be a number`);\n }\n}\n\nfunction checkNonEmpty(matrix) {\n if (matrix.isEmpty()) {\n throw new Error('Empty matrix has no elements to index');\n }\n}\n\n// CONCATENATED MODULE: ./node_modules/ml-matrix/src/stat.js\n\n\nfunction sumByRow(matrix) {\n let sum = newArray(matrix.rows);\n for (let i = 0; i < matrix.rows; ++i) {\n for (let j = 0; j < matrix.columns; ++j) {\n sum[i] += matrix.get(i, j);\n }\n }\n return sum;\n}\n\nfunction sumByColumn(matrix) {\n let sum = newArray(matrix.columns);\n for (let i = 0; i < matrix.rows; ++i) {\n for (let j = 0; j < matrix.columns; ++j) {\n sum[j] += matrix.get(i, j);\n }\n }\n return sum;\n}\n\nfunction sumAll(matrix) {\n let v = 0;\n for (let i = 0; i < matrix.rows; i++) {\n for (let j = 0; j < matrix.columns; j++) {\n v += matrix.get(i, j);\n }\n }\n return v;\n}\n\nfunction productByRow(matrix) {\n let sum = newArray(matrix.rows, 1);\n for (let i = 0; i < matrix.rows; ++i) {\n for (let j = 0; j < matrix.columns; ++j) {\n sum[i] *= matrix.get(i, j);\n }\n }\n return sum;\n}\n\nfunction productByColumn(matrix) {\n let sum = newArray(matrix.columns, 1);\n for (let i = 0; i < matrix.rows; ++i) {\n for (let j = 0; j < matrix.columns; ++j) {\n sum[j] *= matrix.get(i, j);\n }\n }\n return sum;\n}\n\nfunction productAll(matrix) {\n let v = 1;\n for (let i = 0; i < matrix.rows; i++) {\n for (let j = 0; j < matrix.columns; j++) {\n v *= matrix.get(i, j);\n }\n }\n return v;\n}\n\nfunction varianceByRow(matrix, unbiased, mean) {\n const rows = matrix.rows;\n const cols = matrix.columns;\n const variance = [];\n\n for (let i = 0; i < rows; i++) {\n let sum1 = 0;\n let sum2 = 0;\n let x = 0;\n for (let j = 0; j < cols; j++) {\n x = matrix.get(i, j) - mean[i];\n sum1 += x;\n sum2 += x * x;\n }\n if (unbiased) {\n variance.push((sum2 - (sum1 * sum1) / cols) / (cols - 1));\n } else {\n variance.push((sum2 - (sum1 * sum1) / cols) / cols);\n }\n }\n return variance;\n}\n\nfunction varianceByColumn(matrix, unbiased, mean) {\n const rows = matrix.rows;\n const cols = matrix.columns;\n const variance = [];\n\n for (let j = 0; j < cols; j++) {\n let sum1 = 0;\n let sum2 = 0;\n let x = 0;\n for (let i = 0; i < rows; i++) {\n x = matrix.get(i, j) - mean[j];\n sum1 += x;\n sum2 += x * x;\n }\n if (unbiased) {\n variance.push((sum2 - (sum1 * sum1) / rows) / (rows - 1));\n } else {\n variance.push((sum2 - (sum1 * sum1) / rows) / rows);\n }\n }\n return variance;\n}\n\nfunction varianceAll(matrix, unbiased, mean) {\n const rows = matrix.rows;\n const cols = matrix.columns;\n const size = rows * cols;\n\n let sum1 = 0;\n let sum2 = 0;\n let x = 0;\n for (let i = 0; i < rows; i++) {\n for (let j = 0; j < cols; j++) {\n x = matrix.get(i, j) - mean;\n sum1 += x;\n sum2 += x * x;\n }\n }\n if (unbiased) {\n return (sum2 - (sum1 * sum1) / size) / (size - 1);\n } else {\n return (sum2 - (sum1 * sum1) / size) / size;\n }\n}\n\nfunction centerByRow(matrix, mean) {\n for (let i = 0; i < matrix.rows; i++) {\n for (let j = 0; j < matrix.columns; j++) {\n matrix.set(i, j, matrix.get(i, j) - mean[i]);\n }\n }\n}\n\nfunction centerByColumn(matrix, mean) {\n for (let i = 0; i < matrix.rows; i++) {\n for (let j = 0; j < matrix.columns; j++) {\n matrix.set(i, j, matrix.get(i, j) - mean[j]);\n }\n }\n}\n\nfunction centerAll(matrix, mean) {\n for (let i = 0; i < matrix.rows; i++) {\n for (let j = 0; j < matrix.columns; j++) {\n matrix.set(i, j, matrix.get(i, j) - mean);\n }\n }\n}\n\nfunction getScaleByRow(matrix) {\n const scale = [];\n for (let i = 0; i < matrix.rows; i++) {\n let sum = 0;\n for (let j = 0; j < matrix.columns; j++) {\n sum += Math.pow(matrix.get(i, j), 2) / (matrix.columns - 1);\n }\n scale.push(Math.sqrt(sum));\n }\n return scale;\n}\n\nfunction scaleByRow(matrix, scale) {\n for (let i = 0; i < matrix.rows; i++) {\n for (let j = 0; j < matrix.columns; j++) {\n matrix.set(i, j, matrix.get(i, j) / scale[i]);\n }\n }\n}\n\nfunction getScaleByColumn(matrix) {\n const scale = [];\n for (let j = 0; j < matrix.columns; j++) {\n let sum = 0;\n for (let i = 0; i < matrix.rows; i++) {\n sum += Math.pow(matrix.get(i, j), 2) / (matrix.rows - 1);\n }\n scale.push(Math.sqrt(sum));\n }\n return scale;\n}\n\nfunction scaleByColumn(matrix, scale) {\n for (let i = 0; i < matrix.rows; i++) {\n for (let j = 0; j < matrix.columns; j++) {\n matrix.set(i, j, matrix.get(i, j) / scale[j]);\n }\n }\n}\n\nfunction getScaleAll(matrix) {\n const divider = matrix.size - 1;\n let sum = 0;\n for (let j = 0; j < matrix.columns; j++) {\n for (let i = 0; i < matrix.rows; i++) {\n sum += Math.pow(matrix.get(i, j), 2) / divider;\n }\n }\n return Math.sqrt(sum);\n}\n\nfunction scaleAll(matrix, scale) {\n for (let i = 0; i < matrix.rows; i++) {\n for (let j = 0; j < matrix.columns; j++) {\n matrix.set(i, j, matrix.get(i, j) / scale);\n }\n }\n}\n\n// CONCATENATED MODULE: ./node_modules/ml-matrix/src/matrix.js\n\n\n\n\n\n\n\nclass matrix_AbstractMatrix {\n static from1DArray(newRows, newColumns, newData) {\n let length = newRows * newColumns;\n if (length !== newData.length) {\n throw new RangeError('data length does not match given dimensions');\n }\n let newMatrix = new matrix_Matrix(newRows, newColumns);\n for (let row = 0; row < newRows; row++) {\n for (let column = 0; column < newColumns; column++) {\n newMatrix.set(row, column, newData[row * newColumns + column]);\n }\n }\n return newMatrix;\n }\n\n static rowVector(newData) {\n let vector = new matrix_Matrix(1, newData.length);\n for (let i = 0; i < newData.length; i++) {\n vector.set(0, i, newData[i]);\n }\n return vector;\n }\n\n static columnVector(newData) {\n let vector = new matrix_Matrix(newData.length, 1);\n for (let i = 0; i < newData.length; i++) {\n vector.set(i, 0, newData[i]);\n }\n return vector;\n }\n\n static zeros(rows, columns) {\n return new matrix_Matrix(rows, columns);\n }\n\n static ones(rows, columns) {\n return new matrix_Matrix(rows, columns).fill(1);\n }\n\n static rand(rows, columns, options = {}) {\n if (typeof options !== 'object') {\n throw new TypeError('options must be an object');\n }\n const { random = Math.random } = options;\n let matrix = new matrix_Matrix(rows, columns);\n for (let i = 0; i < rows; i++) {\n for (let j = 0; j < columns; j++) {\n matrix.set(i, j, random());\n }\n }\n return matrix;\n }\n\n static randInt(rows, columns, options = {}) {\n if (typeof options !== 'object') {\n throw new TypeError('options must be an object');\n }\n const { min = 0, max = 1000, random = Math.random } = options;\n if (!Number.isInteger(min)) throw new TypeError('min must be an integer');\n if (!Number.isInteger(max)) throw new TypeError('max must be an integer');\n if (min >= max) throw new RangeError('min must be smaller than max');\n let interval = max - min;\n let matrix = new matrix_Matrix(rows, columns);\n for (let i = 0; i < rows; i++) {\n for (let j = 0; j < columns; j++) {\n let value = min + Math.round(random() * interval);\n matrix.set(i, j, value);\n }\n }\n return matrix;\n }\n\n static eye(rows, columns, value) {\n if (columns === undefined) columns = rows;\n if (value === undefined) value = 1;\n let min = Math.min(rows, columns);\n let matrix = this.zeros(rows, columns);\n for (let i = 0; i < min; i++) {\n matrix.set(i, i, value);\n }\n return matrix;\n }\n\n static diag(data, rows, columns) {\n let l = data.length;\n if (rows === undefined) rows = l;\n if (columns === undefined) columns = rows;\n let min = Math.min(l, rows, columns);\n let matrix = this.zeros(rows, columns);\n for (let i = 0; i < min; i++) {\n matrix.set(i, i, data[i]);\n }\n return matrix;\n }\n\n static min(matrix1, matrix2) {\n matrix1 = this.checkMatrix(matrix1);\n matrix2 = this.checkMatrix(matrix2);\n let rows = matrix1.rows;\n let columns = matrix1.columns;\n let result = new matrix_Matrix(rows, columns);\n for (let i = 0; i < rows; i++) {\n for (let j = 0; j < columns; j++) {\n result.set(i, j, Math.min(matrix1.get(i, j), matrix2.get(i, j)));\n }\n }\n return result;\n }\n\n static max(matrix1, matrix2) {\n matrix1 = this.checkMatrix(matrix1);\n matrix2 = this.checkMatrix(matrix2);\n let rows = matrix1.rows;\n let columns = matrix1.columns;\n let result = new this(rows, columns);\n for (let i = 0; i < rows; i++) {\n for (let j = 0; j < columns; j++) {\n result.set(i, j, Math.max(matrix1.get(i, j), matrix2.get(i, j)));\n }\n }\n return result;\n }\n\n static checkMatrix(value) {\n return matrix_AbstractMatrix.isMatrix(value) ? value : new matrix_Matrix(value);\n }\n\n static isMatrix(value) {\n return value != null && value.klass === 'Matrix';\n }\n\n get size() {\n return this.rows * this.columns;\n }\n\n apply(callback) {\n if (typeof callback !== 'function') {\n throw new TypeError('callback must be a function');\n }\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n callback.call(this, i, j);\n }\n }\n return this;\n }\n\n to1DArray() {\n let array = [];\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n array.push(this.get(i, j));\n }\n }\n return array;\n }\n\n to2DArray() {\n let copy = [];\n for (let i = 0; i < this.rows; i++) {\n copy.push([]);\n for (let j = 0; j < this.columns; j++) {\n copy[i].push(this.get(i, j));\n }\n }\n return copy;\n }\n\n toJSON() {\n return this.to2DArray();\n }\n\n isRowVector() {\n return this.rows === 1;\n }\n\n isColumnVector() {\n return this.columns === 1;\n }\n\n isVector() {\n return this.rows === 1 || this.columns === 1;\n }\n\n isSquare() {\n return this.rows === this.columns;\n }\n\n isEmpty() {\n return this.rows === 0 || this.columns === 0;\n }\n\n isSymmetric() {\n if (this.isSquare()) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j <= i; j++) {\n if (this.get(i, j) !== this.get(j, i)) {\n return false;\n }\n }\n }\n return true;\n }\n return false;\n }\n\n isEchelonForm() {\n let i = 0;\n let j = 0;\n let previousColumn = -1;\n let isEchelonForm = true;\n let checked = false;\n while (i < this.rows && isEchelonForm) {\n j = 0;\n checked = false;\n while (j < this.columns && checked === false) {\n if (this.get(i, j) === 0) {\n j++;\n } else if (this.get(i, j) === 1 && j > previousColumn) {\n checked = true;\n previousColumn = j;\n } else {\n isEchelonForm = false;\n checked = true;\n }\n }\n i++;\n }\n return isEchelonForm;\n }\n\n isReducedEchelonForm() {\n let i = 0;\n let j = 0;\n let previousColumn = -1;\n let isReducedEchelonForm = true;\n let checked = false;\n while (i < this.rows && isReducedEchelonForm) {\n j = 0;\n checked = false;\n while (j < this.columns && checked === false) {\n if (this.get(i, j) === 0) {\n j++;\n } else if (this.get(i, j) === 1 && j > previousColumn) {\n checked = true;\n previousColumn = j;\n } else {\n isReducedEchelonForm = false;\n checked = true;\n }\n }\n for (let k = j + 1; k < this.rows; k++) {\n if (this.get(i, k) !== 0) {\n isReducedEchelonForm = false;\n }\n }\n i++;\n }\n return isReducedEchelonForm;\n }\n\n echelonForm() {\n let result = this.clone();\n let h = 0;\n let k = 0;\n while (h < result.rows && k < result.columns) {\n let iMax = h;\n for (let i = h; i < result.rows; i++) {\n if (result.get(i, k) > result.get(iMax, k)) {\n iMax = i;\n }\n }\n if (result.get(iMax, k) === 0) {\n k++;\n } else {\n result.swapRows(h, iMax);\n let tmp = result.get(h, k);\n for (let j = k; j < result.columns; j++) {\n result.set(h, j, result.get(h, j) / tmp);\n }\n for (let i = h + 1; i < result.rows; i++) {\n let factor = result.get(i, k) / result.get(h, k);\n result.set(i, k, 0);\n for (let j = k + 1; j < result.columns; j++) {\n result.set(i, j, result.get(i, j) - result.get(h, j) * factor);\n }\n }\n h++;\n k++;\n }\n }\n return result;\n }\n\n reducedEchelonForm() {\n let result = this.echelonForm();\n let m = result.columns;\n let n = result.rows;\n let h = n - 1;\n while (h >= 0) {\n if (result.maxRow(h) === 0) {\n h--;\n } else {\n let p = 0;\n let pivot = false;\n while (p < n && pivot === false) {\n if (result.get(h, p) === 1) {\n pivot = true;\n } else {\n p++;\n }\n }\n for (let i = 0; i < h; i++) {\n let factor = result.get(i, p);\n for (let j = p; j < m; j++) {\n let tmp = result.get(i, j) - factor * result.get(h, j);\n result.set(i, j, tmp);\n }\n }\n h--;\n }\n }\n return result;\n }\n\n set() {\n throw new Error('set method is unimplemented');\n }\n\n get() {\n throw new Error('get method is unimplemented');\n }\n\n repeat(options = {}) {\n if (typeof options !== 'object') {\n throw new TypeError('options must be an object');\n }\n const { rows = 1, columns = 1 } = options;\n if (!Number.isInteger(rows) || rows <= 0) {\n throw new TypeError('rows must be a positive integer');\n }\n if (!Number.isInteger(columns) || columns <= 0) {\n throw new TypeError('columns must be a positive integer');\n }\n let matrix = new matrix_Matrix(this.rows * rows, this.columns * columns);\n for (let i = 0; i < rows; i++) {\n for (let j = 0; j < columns; j++) {\n matrix.setSubMatrix(this, this.rows * i, this.columns * j);\n }\n }\n return matrix;\n }\n\n fill(value) {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, value);\n }\n }\n return this;\n }\n\n neg() {\n return this.mulS(-1);\n }\n\n getRow(index) {\n checkRowIndex(this, index);\n let row = [];\n for (let i = 0; i < this.columns; i++) {\n row.push(this.get(index, i));\n }\n return row;\n }\n\n getRowVector(index) {\n return matrix_Matrix.rowVector(this.getRow(index));\n }\n\n setRow(index, array) {\n checkRowIndex(this, index);\n array = checkRowVector(this, array);\n for (let i = 0; i < this.columns; i++) {\n this.set(index, i, array[i]);\n }\n return this;\n }\n\n swapRows(row1, row2) {\n checkRowIndex(this, row1);\n checkRowIndex(this, row2);\n for (let i = 0; i < this.columns; i++) {\n let temp = this.get(row1, i);\n this.set(row1, i, this.get(row2, i));\n this.set(row2, i, temp);\n }\n return this;\n }\n\n getColumn(index) {\n checkColumnIndex(this, index);\n let column = [];\n for (let i = 0; i < this.rows; i++) {\n column.push(this.get(i, index));\n }\n return column;\n }\n\n getColumnVector(index) {\n return matrix_Matrix.columnVector(this.getColumn(index));\n }\n\n setColumn(index, array) {\n checkColumnIndex(this, index);\n array = checkColumnVector(this, array);\n for (let i = 0; i < this.rows; i++) {\n this.set(i, index, array[i]);\n }\n return this;\n }\n\n swapColumns(column1, column2) {\n checkColumnIndex(this, column1);\n checkColumnIndex(this, column2);\n for (let i = 0; i < this.rows; i++) {\n let temp = this.get(i, column1);\n this.set(i, column1, this.get(i, column2));\n this.set(i, column2, temp);\n }\n return this;\n }\n\n addRowVector(vector) {\n vector = checkRowVector(this, vector);\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) + vector[j]);\n }\n }\n return this;\n }\n\n subRowVector(vector) {\n vector = checkRowVector(this, vector);\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) - vector[j]);\n }\n }\n return this;\n }\n\n mulRowVector(vector) {\n vector = checkRowVector(this, vector);\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) * vector[j]);\n }\n }\n return this;\n }\n\n divRowVector(vector) {\n vector = checkRowVector(this, vector);\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) / vector[j]);\n }\n }\n return this;\n }\n\n addColumnVector(vector) {\n vector = checkColumnVector(this, vector);\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) + vector[i]);\n }\n }\n return this;\n }\n\n subColumnVector(vector) {\n vector = checkColumnVector(this, vector);\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) - vector[i]);\n }\n }\n return this;\n }\n\n mulColumnVector(vector) {\n vector = checkColumnVector(this, vector);\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) * vector[i]);\n }\n }\n return this;\n }\n\n divColumnVector(vector) {\n vector = checkColumnVector(this, vector);\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n this.set(i, j, this.get(i, j) / vector[i]);\n }\n }\n return this;\n }\n\n mulRow(index, value) {\n checkRowIndex(this, index);\n for (let i = 0; i < this.columns; i++) {\n this.set(index, i, this.get(index, i) * value);\n }\n return this;\n }\n\n mulColumn(index, value) {\n checkColumnIndex(this, index);\n for (let i = 0; i < this.rows; i++) {\n this.set(i, index, this.get(i, index) * value);\n }\n return this;\n }\n\n max() {\n if (this.isEmpty()) {\n return NaN;\n }\n let v = this.get(0, 0);\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n if (this.get(i, j) > v) {\n v = this.get(i, j);\n }\n }\n }\n return v;\n }\n\n maxIndex() {\n checkNonEmpty(this);\n let v = this.get(0, 0);\n let idx = [0, 0];\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n if (this.get(i, j) > v) {\n v = this.get(i, j);\n idx[0] = i;\n idx[1] = j;\n }\n }\n }\n return idx;\n }\n\n min() {\n if (this.isEmpty()) {\n return NaN;\n }\n let v = this.get(0, 0);\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n if (this.get(i, j) < v) {\n v = this.get(i, j);\n }\n }\n }\n return v;\n }\n\n minIndex() {\n checkNonEmpty(this);\n let v = this.get(0, 0);\n let idx = [0, 0];\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n if (this.get(i, j) < v) {\n v = this.get(i, j);\n idx[0] = i;\n idx[1] = j;\n }\n }\n }\n return idx;\n }\n\n maxRow(row) {\n checkRowIndex(this, row);\n if (this.isEmpty()) {\n return NaN;\n }\n let v = this.get(row, 0);\n for (let i = 1; i < this.columns; i++) {\n if (this.get(row, i) > v) {\n v = this.get(row, i);\n }\n }\n return v;\n }\n\n maxRowIndex(row) {\n checkRowIndex(this, row);\n checkNonEmpty(this);\n let v = this.get(row, 0);\n let idx = [row, 0];\n for (let i = 1; i < this.columns; i++) {\n if (this.get(row, i) > v) {\n v = this.get(row, i);\n idx[1] = i;\n }\n }\n return idx;\n }\n\n minRow(row) {\n checkRowIndex(this, row);\n if (this.isEmpty()) {\n return NaN;\n }\n let v = this.get(row, 0);\n for (let i = 1; i < this.columns; i++) {\n if (this.get(row, i) < v) {\n v = this.get(row, i);\n }\n }\n return v;\n }\n\n minRowIndex(row) {\n checkRowIndex(this, row);\n checkNonEmpty(this);\n let v = this.get(row, 0);\n let idx = [row, 0];\n for (let i = 1; i < this.columns; i++) {\n if (this.get(row, i) < v) {\n v = this.get(row, i);\n idx[1] = i;\n }\n }\n return idx;\n }\n\n maxColumn(column) {\n checkColumnIndex(this, column);\n if (this.isEmpty()) {\n return NaN;\n }\n let v = this.get(0, column);\n for (let i = 1; i < this.rows; i++) {\n if (this.get(i, column) > v) {\n v = this.get(i, column);\n }\n }\n return v;\n }\n\n maxColumnIndex(column) {\n checkColumnIndex(this, column);\n checkNonEmpty(this);\n let v = this.get(0, column);\n let idx = [0, column];\n for (let i = 1; i < this.rows; i++) {\n if (this.get(i, column) > v) {\n v = this.get(i, column);\n idx[0] = i;\n }\n }\n return idx;\n }\n\n minColumn(column) {\n checkColumnIndex(this, column);\n if (this.isEmpty()) {\n return NaN;\n }\n let v = this.get(0, column);\n for (let i = 1; i < this.rows; i++) {\n if (this.get(i, column) < v) {\n v = this.get(i, column);\n }\n }\n return v;\n }\n\n minColumnIndex(column) {\n checkColumnIndex(this, column);\n checkNonEmpty(this);\n let v = this.get(0, column);\n let idx = [0, column];\n for (let i = 1; i < this.rows; i++) {\n if (this.get(i, column) < v) {\n v = this.get(i, column);\n idx[0] = i;\n }\n }\n return idx;\n }\n\n diag() {\n let min = Math.min(this.rows, this.columns);\n let diag = [];\n for (let i = 0; i < min; i++) {\n diag.push(this.get(i, i));\n }\n return diag;\n }\n\n norm(type = 'frobenius') {\n let result = 0;\n if (type === 'max') {\n return this.max();\n } else if (type === 'frobenius') {\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n result = result + this.get(i, j) * this.get(i, j);\n }\n }\n return Math.sqrt(result);\n } else {\n throw new RangeError(`unknown norm type: ${type}`);\n }\n }\n\n cumulativeSum() {\n let sum = 0;\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n sum += this.get(i, j);\n this.set(i, j, sum);\n }\n }\n return this;\n }\n\n dot(vector2) {\n if (matrix_AbstractMatrix.isMatrix(vector2)) vector2 = vector2.to1DArray();\n let vector1 = this.to1DArray();\n if (vector1.length !== vector2.length) {\n throw new RangeError('vectors do not have the same size');\n }\n let dot = 0;\n for (let i = 0; i < vector1.length; i++) {\n dot += vector1[i] * vector2[i];\n }\n return dot;\n }\n\n mmul(other) {\n other = matrix_Matrix.checkMatrix(other);\n\n let m = this.rows;\n let n = this.columns;\n let p = other.columns;\n\n let result = new matrix_Matrix(m, p);\n\n let Bcolj = new Float64Array(n);\n for (let j = 0; j < p; j++) {\n for (let k = 0; k < n; k++) {\n Bcolj[k] = other.get(k, j);\n }\n\n for (let i = 0; i < m; i++) {\n let s = 0;\n for (let k = 0; k < n; k++) {\n s += this.get(i, k) * Bcolj[k];\n }\n\n result.set(i, j, s);\n }\n }\n return result;\n }\n\n strassen2x2(other) {\n other = matrix_Matrix.checkMatrix(other);\n let result = new matrix_Matrix(2, 2);\n const a11 = this.get(0, 0);\n const b11 = other.get(0, 0);\n const a12 = this.get(0, 1);\n const b12 = other.get(0, 1);\n const a21 = this.get(1, 0);\n const b21 = other.get(1, 0);\n const a22 = this.get(1, 1);\n const b22 = other.get(1, 1);\n\n // Compute intermediate values.\n const m1 = (a11 + a22) * (b11 + b22);\n const m2 = (a21 + a22) * b11;\n const m3 = a11 * (b12 - b22);\n const m4 = a22 * (b21 - b11);\n const m5 = (a11 + a12) * b22;\n const m6 = (a21 - a11) * (b11 + b12);\n const m7 = (a12 - a22) * (b21 + b22);\n\n // Combine intermediate values into the output.\n const c00 = m1 + m4 - m5 + m7;\n const c01 = m3 + m5;\n const c10 = m2 + m4;\n const c11 = m1 - m2 + m3 + m6;\n\n result.set(0, 0, c00);\n result.set(0, 1, c01);\n result.set(1, 0, c10);\n result.set(1, 1, c11);\n return result;\n }\n\n strassen3x3(other) {\n other = matrix_Matrix.checkMatrix(other);\n let result = new matrix_Matrix(3, 3);\n\n const a00 = this.get(0, 0);\n const a01 = this.get(0, 1);\n const a02 = this.get(0, 2);\n const a10 = this.get(1, 0);\n const a11 = this.get(1, 1);\n const a12 = this.get(1, 2);\n const a20 = this.get(2, 0);\n const a21 = this.get(2, 1);\n const a22 = this.get(2, 2);\n\n const b00 = other.get(0, 0);\n const b01 = other.get(0, 1);\n const b02 = other.get(0, 2);\n const b10 = other.get(1, 0);\n const b11 = other.get(1, 1);\n const b12 = other.get(1, 2);\n const b20 = other.get(2, 0);\n const b21 = other.get(2, 1);\n const b22 = other.get(2, 2);\n\n const m1 = (a00 + a01 + a02 - a10 - a11 - a21 - a22) * b11;\n const m2 = (a00 - a10) * (-b01 + b11);\n const m3 = a11 * (-b00 + b01 + b10 - b11 - b12 - b20 + b22);\n const m4 = (-a00 + a10 + a11) * (b00 - b01 + b11);\n const m5 = (a10 + a11) * (-b00 + b01);\n const m6 = a00 * b00;\n const m7 = (-a00 + a20 + a21) * (b00 - b02 + b12);\n const m8 = (-a00 + a20) * (b02 - b12);\n const m9 = (a20 + a21) * (-b00 + b02);\n const m10 = (a00 + a01 + a02 - a11 - a12 - a20 - a21) * b12;\n const m11 = a21 * (-b00 + b02 + b10 - b11 - b12 - b20 + b21);\n const m12 = (-a02 + a21 + a22) * (b11 + b20 - b21);\n const m13 = (a02 - a22) * (b11 - b21);\n const m14 = a02 * b20;\n const m15 = (a21 + a22) * (-b20 + b21);\n const m16 = (-a02 + a11 + a12) * (b12 + b20 - b22);\n const m17 = (a02 - a12) * (b12 - b22);\n const m18 = (a11 + a12) * (-b20 + b22);\n const m19 = a01 * b10;\n const m20 = a12 * b21;\n const m21 = a10 * b02;\n const m22 = a20 * b01;\n const m23 = a22 * b22;\n\n const c00 = m6 + m14 + m19;\n const c01 = m1 + m4 + m5 + m6 + m12 + m14 + m15;\n const c02 = m6 + m7 + m9 + m10 + m14 + m16 + m18;\n const c10 = m2 + m3 + m4 + m6 + m14 + m16 + m17;\n const c11 = m2 + m4 + m5 + m6 + m20;\n const c12 = m14 + m16 + m17 + m18 + m21;\n const c20 = m6 + m7 + m8 + m11 + m12 + m13 + m14;\n const c21 = m12 + m13 + m14 + m15 + m22;\n const c22 = m6 + m7 + m8 + m9 + m23;\n\n result.set(0, 0, c00);\n result.set(0, 1, c01);\n result.set(0, 2, c02);\n result.set(1, 0, c10);\n result.set(1, 1, c11);\n result.set(1, 2, c12);\n result.set(2, 0, c20);\n result.set(2, 1, c21);\n result.set(2, 2, c22);\n return result;\n }\n\n mmulStrassen(y) {\n y = matrix_Matrix.checkMatrix(y);\n let x = this.clone();\n let r1 = x.rows;\n let c1 = x.columns;\n let r2 = y.rows;\n let c2 = y.columns;\n if (c1 !== r2) {\n // eslint-disable-next-line no-console\n console.warn(\n `Multiplying ${r1} x ${c1} and ${r2} x ${c2} matrix: dimensions do not match.`,\n );\n }\n\n // Put a matrix into the top left of a matrix of zeros.\n // `rows` and `cols` are the dimensions of the output matrix.\n function embed(mat, rows, cols) {\n let r = mat.rows;\n let c = mat.columns;\n if (r === rows && c === cols) {\n return mat;\n } else {\n let resultat = matrix_AbstractMatrix.zeros(rows, cols);\n resultat = resultat.setSubMatrix(mat, 0, 0);\n return resultat;\n }\n }\n\n // Make sure both matrices are the same size.\n // This is exclusively for simplicity:\n // this algorithm can be implemented with matrices of different sizes.\n\n let r = Math.max(r1, r2);\n let c = Math.max(c1, c2);\n x = embed(x, r, c);\n y = embed(y, r, c);\n\n // Our recursive multiplication function.\n function blockMult(a, b, rows, cols) {\n // For small matrices, resort to naive multiplication.\n if (rows <= 512 || cols <= 512) {\n return a.mmul(b); // a is equivalent to this\n }\n\n // Apply dynamic padding.\n if (rows % 2 === 1 && cols % 2 === 1) {\n a = embed(a, rows + 1, cols + 1);\n b = embed(b, rows + 1, cols + 1);\n } else if (rows % 2 === 1) {\n a = embed(a, rows + 1, cols);\n b = embed(b, rows + 1, cols);\n } else if (cols % 2 === 1) {\n a = embed(a, rows, cols + 1);\n b = embed(b, rows, cols + 1);\n }\n\n let halfRows = parseInt(a.rows / 2, 10);\n let halfCols = parseInt(a.columns / 2, 10);\n // Subdivide input matrices.\n let a11 = a.subMatrix(0, halfRows - 1, 0, halfCols - 1);\n let b11 = b.subMatrix(0, halfRows - 1, 0, halfCols - 1);\n\n let a12 = a.subMatrix(0, halfRows - 1, halfCols, a.columns - 1);\n let b12 = b.subMatrix(0, halfRows - 1, halfCols, b.columns - 1);\n\n let a21 = a.subMatrix(halfRows, a.rows - 1, 0, halfCols - 1);\n let b21 = b.subMatrix(halfRows, b.rows - 1, 0, halfCols - 1);\n\n let a22 = a.subMatrix(halfRows, a.rows - 1, halfCols, a.columns - 1);\n let b22 = b.subMatrix(halfRows, b.rows - 1, halfCols, b.columns - 1);\n\n // Compute intermediate values.\n let m1 = blockMult(\n matrix_AbstractMatrix.add(a11, a22),\n matrix_AbstractMatrix.add(b11, b22),\n halfRows,\n halfCols,\n );\n let m2 = blockMult(matrix_AbstractMatrix.add(a21, a22), b11, halfRows, halfCols);\n let m3 = blockMult(a11, matrix_AbstractMatrix.sub(b12, b22), halfRows, halfCols);\n let m4 = blockMult(a22, matrix_AbstractMatrix.sub(b21, b11), halfRows, halfCols);\n let m5 = blockMult(matrix_AbstractMatrix.add(a11, a12), b22, halfRows, halfCols);\n let m6 = blockMult(\n matrix_AbstractMatrix.sub(a21, a11),\n matrix_AbstractMatrix.add(b11, b12),\n halfRows,\n halfCols,\n );\n let m7 = blockMult(\n matrix_AbstractMatrix.sub(a12, a22),\n matrix_AbstractMatrix.add(b21, b22),\n halfRows,\n halfCols,\n );\n\n // Combine intermediate values into the output.\n let c11 = matrix_AbstractMatrix.add(m1, m4);\n c11.sub(m5);\n c11.add(m7);\n let c12 = matrix_AbstractMatrix.add(m3, m5);\n let c21 = matrix_AbstractMatrix.add(m2, m4);\n let c22 = matrix_AbstractMatrix.sub(m1, m2);\n c22.add(m3);\n c22.add(m6);\n\n // Crop output to the desired size (undo dynamic padding).\n let resultat = matrix_AbstractMatrix.zeros(2 * c11.rows, 2 * c11.columns);\n resultat = resultat.setSubMatrix(c11, 0, 0);\n resultat = resultat.setSubMatrix(c12, c11.rows, 0);\n resultat = resultat.setSubMatrix(c21, 0, c11.columns);\n resultat = resultat.setSubMatrix(c22, c11.rows, c11.columns);\n return resultat.subMatrix(0, rows - 1, 0, cols - 1);\n }\n\n return blockMult(x, y, r, c);\n }\n\n scaleRows(options = {}) {\n if (typeof options !== 'object') {\n throw new TypeError('options must be an object');\n }\n const { min = 0, max = 1 } = options;\n if (!Number.isFinite(min)) throw new TypeError('min must be a number');\n if (!Number.isFinite(max)) throw new TypeError('max must be a number');\n if (min >= max) throw new RangeError('min must be smaller than max');\n let newMatrix = new matrix_Matrix(this.rows, this.columns);\n for (let i = 0; i < this.rows; i++) {\n const row = this.getRow(i);\n if (row.length > 0) {\n rescale(row, { min, max, output: row });\n }\n newMatrix.setRow(i, row);\n }\n return newMatrix;\n }\n\n scaleColumns(options = {}) {\n if (typeof options !== 'object') {\n throw new TypeError('options must be an object');\n }\n const { min = 0, max = 1 } = options;\n if (!Number.isFinite(min)) throw new TypeError('min must be a number');\n if (!Number.isFinite(max)) throw new TypeError('max must be a number');\n if (min >= max) throw new RangeError('min must be smaller than max');\n let newMatrix = new matrix_Matrix(this.rows, this.columns);\n for (let i = 0; i < this.columns; i++) {\n const column = this.getColumn(i);\n if (column.length) {\n rescale(column, {\n min: min,\n max: max,\n output: column,\n });\n }\n newMatrix.setColumn(i, column);\n }\n return newMatrix;\n }\n\n flipRows() {\n const middle = Math.ceil(this.columns / 2);\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < middle; j++) {\n let first = this.get(i, j);\n let last = this.get(i, this.columns - 1 - j);\n this.set(i, j, last);\n this.set(i, this.columns - 1 - j, first);\n }\n }\n return this;\n }\n\n flipColumns() {\n const middle = Math.ceil(this.rows / 2);\n for (let j = 0; j < this.columns; j++) {\n for (let i = 0; i < middle; i++) {\n let first = this.get(i, j);\n let last = this.get(this.rows - 1 - i, j);\n this.set(i, j, last);\n this.set(this.rows - 1 - i, j, first);\n }\n }\n return this;\n }\n\n kroneckerProduct(other) {\n other = matrix_Matrix.checkMatrix(other);\n\n let m = this.rows;\n let n = this.columns;\n let p = other.rows;\n let q = other.columns;\n\n let result = new matrix_Matrix(m * p, n * q);\n for (let i = 0; i < m; i++) {\n for (let j = 0; j < n; j++) {\n for (let k = 0; k < p; k++) {\n for (let l = 0; l < q; l++) {\n result.set(p * i + k, q * j + l, this.get(i, j) * other.get(k, l));\n }\n }\n }\n }\n return result;\n }\n\n kroneckerSum(other) {\n other = matrix_Matrix.checkMatrix(other);\n if (!this.isSquare() || !other.isSquare()) {\n throw new Error('Kronecker Sum needs two Square Matrices');\n }\n let m = this.rows;\n let n = other.rows;\n let AxI = this.kroneckerProduct(matrix_Matrix.eye(n, n));\n let IxB = matrix_Matrix.eye(m, m).kroneckerProduct(other);\n return AxI.add(IxB);\n }\n\n transpose() {\n let result = new matrix_Matrix(this.columns, this.rows);\n for (let i = 0; i < this.rows; i++) {\n for (let j = 0; j < this.columns; j++) {\n result.set(j, i, this.get(i, j));\n }\n }\n return result;\n }\n\n sortRows(compareFunction = compareNumbers) {\n for (let i = 0; i < this.rows; i++) {\n this.setRow(i, this.getRow(i).sort(compareFunction));\n }\n return this;\n }\n\n sortColumns(compareFunction = compareNumbers) {\n for (let i = 0; i < this.columns; i++) {\n this.setColumn(i, this.getColumn(i).sort(compareFunction));\n }\n return this;\n }\n\n subMatrix(startRow, endRow, startColumn, endColumn) {\n checkRange(this, startRow, endRow, startColumn, endColumn);\n let newMatrix = new matrix_Matrix(\n endRow - startRow + 1,\n endColumn - startColumn + 1,\n );\n for (let i = startRow; i <= endRow; i++) {\n for (let j = startColumn; j <= endColumn; j++) {\n newMatrix.set(i - startRow, j - startColumn, this.get(i, j));\n }\n }\n return newMatrix;\n }\n\n subMatrixRow(indices, startColumn, endColumn) {\n if (startColumn === undefined) startColumn = 0;\n if (endColumn === undefined) endColumn = this.columns - 1;\n if (\n startColumn > endColumn ||\n startColumn < 0 ||\n startColumn >= this.columns ||\n endColumn < 0 ||\n endColumn >= this.columns\n ) {\n throw new RangeError('Argument out of range');\n }\n\n let newMatrix = new matrix_Matrix(indices.length, endColumn - startColumn + 1);\n for (let i = 0; i < indices.length; i++) {\n for (let j = startColumn; j <= endColumn; j++) {\n if (indices[i] < 0 || indices[i] >= this.rows) {\n throw new RangeError(`Row index out of range: ${indices[i]}`);\n }\n newMatrix.set(i, j - startColumn, this.get(indices[i], j));\n }\n }\n return newMatrix;\n }\n\n subMatrixColumn(indices, startRow, endRow) {\n if (startRow === undefined) startRow = 0;\n if (endRow === undefined) endRow = this.rows - 1;\n if (\n startRow > endRow ||\n startRow < 0 ||\n startRow >= this.rows ||\n endRow < 0 ||\n endRow >= this.rows\n ) {\n throw new RangeError('Argument out of range');\n }\n\n let newMatrix = new matrix_Matrix(endRow - startRow + 1, indices.length);\n for (let i = 0; i < indices.length; i++) {\n for (let j = startRow; j <= endRow; j++) {\n if (indices[i] < 0 || indices[i] >= this.columns) {\n throw new RangeError(`Column index out of range: ${indices[i]}`);\n }\n newMatrix.set(j - startRow, i, this.get(j, indices[i]));\n }\n }\n return newMatrix;\n }\n\n setSubMatrix(matrix, startRow, startColumn) {\n matrix = matrix_Matrix.checkMatrix(matrix);\n if (matrix.isEmpty()) {\n return this;\n }\n let endRow = startRow + matrix.rows - 1;\n let endColumn = startColumn + matrix.columns - 1;\n checkRange(this, startRow, endRow, startColumn, endColumn);\n for (let i = 0; i < matrix.rows; i++) {\n for (let j = 0; j < matrix.columns; j++) {\n this.set(startRow + i, startColumn + j, matrix.get(i, j));\n }\n }\n return this;\n }\n\n selection(rowIndices, columnIndices) {\n let indices = checkIndices(this, rowIndices, columnIndices);\n let newMatrix = new matrix_Matrix(rowIndices.length, columnIndices.length);\n for (let i = 0; i < indices.row.length; i++) {\n let rowIndex = indices.row[i];\n for (let j = 0; j < indices.column.length; j++) {\n let columnIndex = indices.column[j];\n newMatrix.set(i, j, this.get(rowIndex, columnIndex));\n }\n }\n return newMatrix;\n }\n\n trace() {\n let min = Math.min(this.rows, this.columns);\n let trace = 0;\n for (let i = 0; i < min; i++) {\n trace += this.get(i, i);\n }\n return trace;\n }\n\n clone() {\n let newMatrix = new matrix_Matrix(this.rows, this.columns);\n for (let row = 0; row < this.rows; row++) {\n for (let column = 0; column < this.columns; column++) {\n newMatrix.set(row, column, this.get(row, column));\n }\n }\n return newMatrix;\n }\n\n sum(by) {\n switch (by) {\n case 'row':\n return sumByRow(this);\n case 'column':\n return sumByColumn(this);\n case undefined:\n return sumAll(this);\n default:\n throw new Error(`invalid option: ${by}`);\n }\n }\n\n product(by) {\n switch (by) {\n case 'row':\n return productByRow(this);\n case 'column':\n return productByColumn(this);\n case undefined:\n return productAll(this);\n default:\n throw new Error(`invalid option: ${by}`);\n }\n }\n\n mean(by) {\n const sum = this.sum(by);\n switch (by) {\n case 'row': {\n for (let i = 0; i < this.rows; i++) {\n sum[i] /= this.columns;\n }\n return sum;\n }\n case 'column': {\n for (let i = 0; i < this.columns; i++) {\n sum[i] /= this.rows;\n }\n return sum;\n }\n case undefined:\n return sum / this.size;\n default:\n throw new Error(`invalid option: ${by}`);\n }\n }\n\n variance(by, options = {}) {\n if (typeof by === 'object') {\n options = by;\n by = undefined;\n }\n if (typeof options !== 'object') {\n throw new TypeError('options must be an object');\n }\n const { unbiased = true, mean = this.mean(by) } = options;\n if (typeof unbiased !== 'boolean') {\n throw new TypeError('unbiased must be a boolean');\n }\n switch (by) {\n case 'row': {\n if (!Array.isArray(mean)) {\n throw new TypeError('mean must be an array');\n }\n return varianceByRow(this, unbiased, mean);\n }\n case 'column': {\n if (!Array.isArray(mean)) {\n throw new TypeError('mean must be an array');\n }\n return varianceByColumn(this, unbiased, mean);\n }\n case undefined: {\n if (typeof mean !== 'number') {\n throw new TypeError('mean must be a number');\n }\n return varianceAll(this, unbiased, mean);\n }\n default:\n throw new Error(`invalid option: ${by}`);\n }\n }\n\n standardDeviation(by, options) {\n if (typeof by === 'object') {\n options = by;\n by = undefined;\n }\n const variance = this.variance(by, options);\n if (by === undefined) {\n return Math.sqrt(variance);\n } else {\n for (let i = 0; i < variance.length; i++) {\n variance[i] = Math.sqrt(variance[i]);\n }\n return variance;\n }\n }\n\n center(by, options = {}) {\n if (typeof by === 'object') {\n options = by;\n by = undefined;\n }\n if (typeof options !== 'object') {\n throw new TypeError('options must be an object');\n }\n const { center = this.mean(by) } = options;\n switch (by) {\n case 'row': {\n if (!Array.isArray(center)) {\n throw new TypeError('center must be an array');\n }\n centerByRow(this, center);\n return this;\n }\n case 'column': {\n if (!Array.isArray(center)) {\n throw new TypeError('center must be an array');\n }\n centerByColumn(this, center);\n return this;\n }\n case undefined: {\n if (typeof center !== 'number') {\n throw new TypeError('center must be a number');\n }\n centerAll(this, center);\n return this;\n }\n default:\n throw new Error(`invalid option: ${by}`);\n }\n }\n\n scale(by, options = {}) {\n if (typeof by === 'object') {\n options = by;\n by = undefined;\n }\n if (typeof options !== 'object') {\n throw new TypeError('options must be an object');\n }\n let scale = options.scale;\n switch (by) {\n case 'row': {\n if (scale === undefined) {\n scale = getScaleByRow(this);\n } else if (!Array.isArray(scale)) {\n throw new TypeError('scale must be an array');\n }\n scaleByRow(this, scale);\n return this;\n }\n case 'column': {\n if (scale === undefined) {\n scale = getScaleByColumn(this);\n } else if (!Array.isArray(scale)) {\n throw new TypeError('scale must be an array');\n }\n scaleByColumn(this, scale);\n return this;\n }\n case undefined: {\n if (scale === undefined) {\n scale = getScaleAll(this);\n } else if (typeof scale !== 'number') {\n throw new TypeError('scale must be a number');\n }\n scaleAll(this, scale);\n return this;\n }\n default:\n throw new Error(`invalid option: ${by}`);\n }\n }\n\n toString(options) {\n return inspectMatrixWithOptions(this, options);\n }\n}\n\nmatrix_AbstractMatrix.prototype.klass = 'Matrix';\nif (typeof Symbol !== 'undefined') {\n matrix_AbstractMatrix.prototype[Symbol.for('nodejs.util.inspect.custom')] =\n inspectMatrix;\n}\n\nfunction compareNumbers(a, b) {\n return a - b;\n}\n\n// Synonyms\nmatrix_AbstractMatrix.random = matrix_AbstractMatrix.rand;\nmatrix_AbstractMatrix.randomInt = matrix_AbstractMatrix.randInt;\nmatrix_AbstractMatrix.diagonal = matrix_AbstractMatrix.diag;\nmatrix_AbstractMatrix.prototype.diagonal = matrix_AbstractMatrix.prototype.diag;\nmatrix_AbstractMatrix.identity = matrix_AbstractMatrix.eye;\nmatrix_AbstractMatrix.prototype.negate = matrix_AbstractMatrix.prototype.neg;\nmatrix_AbstractMatrix.prototype.tensorProduct =\n matrix_AbstractMatrix.prototype.kroneckerProduct;\n\nclass matrix_Matrix extends matrix_AbstractMatrix {\n constructor(nRows, nColumns) {\n super();\n if (matrix_Matrix.isMatrix(nRows)) {\n // eslint-disable-next-line no-constructor-return\n return nRows.clone();\n } else if (Number.isInteger(nRows) && nRows >= 0) {\n // Create an empty matrix\n this.data = [];\n if (Number.isInteger(nColumns) && nColumns >= 0) {\n for (let i = 0; i < nRows; i++) {\n this.data.push(new Float64Array(nColumns));\n }\n } else {\n throw new TypeError('nColumns must be a positive integer');\n }\n } else if (Array.isArray(nRows)) {\n // Copy the values from the 2D array\n const arrayData = nRows;\n nRows = arrayData.length;\n nColumns = nRows ? arrayData[0].length : 0;\n if (typeof nColumns !== 'number') {\n throw new TypeError(\n 'Data must be a 2D array with at least one element',\n );\n }\n this.data = [];\n for (let i = 0; i < nRows; i++) {\n if (arrayData[i].length !== nColumns) {\n throw new RangeError('Inconsistent array dimensions');\n }\n this.data.push(Float64Array.from(arrayData[i]));\n }\n } else {\n throw new TypeError(\n 'First argument must be a positive number or an array',\n );\n }\n this.rows = nRows;\n this.columns = nColumns;\n }\n\n set(rowIndex, columnIndex, value) {\n this.data[rowIndex][columnIndex] = value;\n return this;\n }\n\n get(rowIndex, columnIndex) {\n return this.data[rowIndex][columnIndex];\n }\n\n removeRow(index) {\n checkRowIndex(this, index);\n this.data.splice(index, 1);\n this.rows -= 1;\n return this;\n }\n\n addRow(index, array) {\n if (array === undefined) {\n array = index;\n index = this.rows;\n }\n checkRowIndex(this, index, true);\n array = Float64Array.from(checkRowVector(this, array));\n this.data.splice(index, 0, array);\n this.rows += 1;\n return this;\n }\n\n removeColumn(index) {\n checkColumnIndex(this, index);\n for (let i = 0; i < this.rows; i++) {\n const newRow = new Float64Array(this.columns - 1);\n for (let j = 0; j < index; j++) {\n newRow[j] = this.data[i][j];\n }\n for (let j = index + 1; j < this.columns; j++) {\n newRow[j - 1] = this.data[i][j];\n }\n this.data[i] = newRow;\n }\n this.columns -= 1;\n return this;\n }\n\n addColumn(index, array) {\n if (typeof array === 'undefined') {\n array = index;\n index = this.columns;\n }\n checkColumnIndex(this, index, true);\n array = checkColumnVector(this, array);\n for (let i = 0; i < this.rows; i++) {\n const newRow = new Float64Array(this.columns + 1);\n let j = 0;\n for (; j < index; j++) {\n newRow[j] = this.data[i][j];\n }\n newRow[j++] = array[i];\n for (; j < this.columns + 1; j++) {\n newRow[j] = this.data[i][j - 1];\n }\n this.data[i] = newRow;\n }\n this.columns += 1;\n return this;\n }\n}\n\ninstallMathOperations(matrix_AbstractMatrix, matrix_Matrix);\n\n// CONCATENATED MODULE: ./node_modules/ml-matrix/src/wrap/WrapperMatrix2D.js\n\n\nclass WrapperMatrix2D_WrapperMatrix2D extends matrix_AbstractMatrix {\n constructor(data) {\n super();\n this.data = data;\n this.rows = data.length;\n this.columns = data[0].length;\n }\n\n set(rowIndex, columnIndex, value) {\n this.data[rowIndex][columnIndex] = value;\n return this;\n }\n\n get(rowIndex, columnIndex) {\n return this.data[rowIndex][columnIndex];\n }\n}\n\n// CONCATENATED MODULE: ./node_modules/ml-matrix/src/dc/util.js\nfunction hypotenuse(a, b) {\n let r = 0;\n if (Math.abs(a) > Math.abs(b)) {\n r = b / a;\n return Math.abs(a) * Math.sqrt(1 + r * r);\n }\n if (b !== 0) {\n r = a / b;\n return Math.abs(b) * Math.sqrt(1 + r * r);\n }\n return 0;\n}\n\n// CONCATENATED MODULE: ./node_modules/ml-matrix/src/dc/svd.js\n\n\n\n\n\nclass svd_SingularValueDecomposition {\n constructor(value, options = {}) {\n value = WrapperMatrix2D_WrapperMatrix2D.checkMatrix(value);\n\n if (value.isEmpty()) {\n throw new Error('Matrix must be non-empty');\n }\n\n let m = value.rows;\n let n = value.columns;\n\n const {\n computeLeftSingularVectors = true,\n computeRightSingularVectors = true,\n autoTranspose = false,\n } = options;\n\n let wantu = Boolean(computeLeftSingularVectors);\n let wantv = Boolean(computeRightSingularVectors);\n\n let swapped = false;\n let a;\n if (m < n) {\n if (!autoTranspose) {\n a = value.clone();\n // eslint-disable-next-line no-console\n console.warn(\n 'Computing SVD on a matrix with more columns than rows. Consider enabling autoTranspose',\n );\n } else {\n a = value.transpose();\n m = a.rows;\n n = a.columns;\n swapped = true;\n let aux = wantu;\n wantu = wantv;\n wantv = aux;\n }\n } else {\n a = value.clone();\n }\n\n let nu = Math.min(m, n);\n let ni = Math.min(m + 1, n);\n let s = new Float64Array(ni);\n let U = new matrix_Matrix(m, nu);\n let V = new matrix_Matrix(n, n);\n\n let e = new Float64Array(n);\n let work = new Float64Array(m);\n\n let si = new Float64Array(ni);\n for (let i = 0; i < ni; i++) si[i] = i;\n\n let nct = Math.min(m - 1, n);\n let nrt = Math.max(0, Math.min(n - 2, m));\n let mrc = Math.max(nct, nrt);\n\n for (let k = 0; k < mrc; k++) {\n if (k < nct) {\n s[k] = 0;\n for (let i = k; i < m; i++) {\n s[k] = hypotenuse(s[k], a.get(i, k));\n }\n if (s[k] !== 0) {\n if (a.get(k, k) < 0) {\n s[k] = -s[k];\n }\n for (let i = k; i < m; i++) {\n a.set(i, k, a.get(i, k) / s[k]);\n }\n a.set(k, k, a.get(k, k) + 1);\n }\n s[k] = -s[k];\n }\n\n for (let j = k + 1; j < n; j++) {\n if (k < nct && s[k] !== 0) {\n let t = 0;\n for (let i = k; i < m; i++) {\n t += a.get(i, k) * a.get(i, j);\n }\n t = -t / a.get(k, k);\n for (let i = k; i < m; i++) {\n a.set(i, j, a.get(i, j) + t * a.get(i, k));\n }\n }\n e[j] = a.get(k, j);\n }\n\n if (wantu && k < nct) {\n for (let i = k; i < m; i++) {\n U.set(i, k, a.get(i, k));\n }\n }\n\n if (k < nrt) {\n e[k] = 0;\n for (let i = k + 1; i < n; i++) {\n e[k] = hypotenuse(e[k], e[i]);\n }\n if (e[k] !== 0) {\n if (e[k + 1] < 0) {\n e[k] = 0 - e[k];\n }\n for (let i = k + 1; i < n; i++) {\n e[i] /= e[k];\n }\n e[k + 1] += 1;\n }\n e[k] = -e[k];\n if (k + 1 < m && e[k] !== 0) {\n for (let i = k + 1; i < m; i++) {\n work[i] = 0;\n }\n for (let i = k + 1; i < m; i++) {\n for (let j = k + 1; j < n; j++) {\n work[i] += e[j] * a.get(i, j);\n }\n }\n for (let j = k + 1; j < n; j++) {\n let t = -e[j] / e[k + 1];\n for (let i = k + 1; i < m; i++) {\n a.set(i, j, a.get(i, j) + t * work[i]);\n }\n }\n }\n if (wantv) {\n for (let i = k + 1; i < n; i++) {\n V.set(i, k, e[i]);\n }\n }\n }\n }\n\n let p = Math.min(n, m + 1);\n if (nct < n) {\n s[nct] = a.get(nct, nct);\n }\n if (m < p) {\n s[p - 1] = 0;\n }\n if (nrt + 1 < p) {\n e[nrt] = a.get(nrt, p - 1);\n }\n e[p - 1] = 0;\n\n if (wantu) {\n for (let j = nct; j < nu; j++) {\n for (let i = 0; i < m; i++) {\n U.set(i, j, 0);\n }\n U.set(j, j, 1);\n }\n for (let k = nct - 1; k >= 0; k--) {\n if (s[k] !== 0) {\n for (let j = k + 1; j < nu; j++) {\n let t = 0;\n for (let i = k; i < m; i++) {\n t += U.get(i, k) * U.get(i, j);\n }\n t = -t / U.get(k, k);\n for (let i = k; i < m; i++) {\n U.set(i, j, U.get(i, j) + t * U.get(i, k));\n }\n }\n for (let i = k; i < m; i++) {\n U.set(i, k, -U.get(i, k));\n }\n U.set(k, k, 1 + U.get(k, k));\n for (let i = 0; i < k - 1; i++) {\n U.set(i, k, 0);\n }\n } else {\n for (let i = 0; i < m; i++) {\n U.set(i, k, 0);\n }\n U.set(k, k, 1);\n }\n }\n }\n\n if (wantv) {\n for (let k = n - 1; k >= 0; k--) {\n if (k < nrt && e[k] !== 0) {\n for (let j = k + 1; j < n; j++) {\n let t = 0;\n for (let i = k + 1; i < n; i++) {\n t += V.get(i, k) * V.get(i, j);\n }\n t = -t / V.get(k + 1, k);\n for (let i = k + 1; i < n; i++) {\n V.set(i, j, V.get(i, j) + t * V.get(i, k));\n }\n }\n }\n for (let i = 0; i < n; i++) {\n V.set(i, k, 0);\n }\n V.set(k, k, 1);\n }\n }\n\n let pp = p - 1;\n let iter = 0;\n let eps = Number.EPSILON;\n while (p > 0) {\n let k, kase;\n for (k = p - 2; k >= -1; k--) {\n if (k === -1) {\n break;\n }\n const alpha =\n Number.MIN_VALUE + eps * Math.abs(s[k] + Math.abs(s[k + 1]));\n if (Math.abs(e[k]) <= alpha || Number.isNaN(e[k])) {\n e[k] = 0;\n break;\n }\n }\n if (k === p - 2) {\n kase = 4;\n } else {\n let ks;\n for (ks = p - 1; ks >= k; ks--) {\n if (ks === k) {\n break;\n }\n let t =\n (ks !== p ? Math.abs(e[ks]) : 0) +\n (ks !== k + 1 ? Math.abs(e[ks - 1]) : 0);\n if (Math.abs(s[ks]) <= eps * t) {\n s[ks] = 0;\n break;\n }\n }\n if (ks === k) {\n kase = 3;\n } else if (ks === p - 1) {\n kase = 1;\n } else {\n kase = 2;\n k = ks;\n }\n }\n\n k++;\n\n switch (kase) {\n case 1: {\n let f = e[p - 2];\n e[p - 2] = 0;\n for (let j = p - 2; j >= k; j--) {\n let t = hypotenuse(s[j], f);\n let cs = s[j] / t;\n let sn = f / t;\n s[j] = t;\n if (j !== k) {\n f = -sn * e[j - 1];\n e[j - 1] = cs * e[j - 1];\n }\n if (wantv) {\n for (let i = 0; i < n; i++) {\n t = cs * V.get(i, j) + sn * V.get(i, p - 1);\n V.set(i, p - 1, -sn * V.get(i, j) + cs * V.get(i, p - 1));\n V.set(i, j, t);\n }\n }\n }\n break;\n }\n case 2: {\n let f = e[k - 1];\n e[k - 1] = 0;\n for (let j = k; j < p; j++) {\n let t = hypotenuse(s[j], f);\n let cs = s[j] / t;\n let sn = f / t;\n s[j] = t;\n f = -sn * e[j];\n e[j] = cs * e[j];\n if (wantu) {\n for (let i = 0; i < m; i++) {\n t = cs * U.get(i, j) + sn * U.get(i, k - 1);\n U.set(i, k - 1, -sn * U.get(i, j) + cs * U.get(i, k - 1));\n U.set(i, j, t);\n }\n }\n }\n break;\n }\n case 3: {\n const scale = Math.max(\n Math.abs(s[p - 1]),\n Math.abs(s[p - 2]),\n Math.abs(e[p - 2]),\n Math.abs(s[k]),\n Math.abs(e[k]),\n );\n const sp = s[p - 1] / scale;\n const spm1 = s[p - 2] / scale;\n const epm1 = e[p - 2] / scale;\n const sk = s[k] / scale;\n const ek = e[k] / scale;\n const b = ((spm1 + sp) * (spm1 - sp) + epm1 * epm1) / 2;\n const c = sp * epm1 * (sp * epm1);\n let shift = 0;\n if (b !== 0 || c !== 0) {\n if (b < 0) {\n shift = 0 - Math.sqrt(b * b + c);\n } else {\n shift = Math.sqrt(b * b + c);\n }\n shift = c / (b + shift);\n }\n let f = (sk + sp) * (sk - sp) + shift;\n let g = sk * ek;\n for (let j = k; j < p - 1; j++) {\n let t = hypotenuse(f, g);\n if (t === 0) t = Number.MIN_VALUE;\n let cs = f / t;\n let sn = g / t;\n if (j !== k) {\n e[j - 1] = t;\n }\n f = cs * s[j] + sn * e[j];\n e[j] = cs * e[j] - sn * s[j];\n g = sn * s[j + 1];\n s[j + 1] = cs * s[j + 1];\n if (wantv) {\n for (let i = 0; i < n; i++) {\n t = cs * V.get(i, j) + sn * V.get(i, j + 1);\n V.set(i, j + 1, -sn * V.get(i, j) + cs * V.get(i, j + 1));\n V.set(i, j, t);\n }\n }\n t = hypotenuse(f, g);\n if (t === 0) t = Number.MIN_VALUE;\n cs = f / t;\n sn = g / t;\n s[j] = t;\n f = cs * e[j] + sn * s[j + 1];\n s[j + 1] = -sn * e[j] + cs * s[j + 1];\n g = sn * e[j + 1];\n e[j + 1] = cs * e[j + 1];\n if (wantu && j < m - 1) {\n for (let i = 0; i < m; i++) {\n t = cs * U.get(i, j) + sn * U.get(i, j + 1);\n U.set(i, j + 1, -sn * U.get(i, j) + cs * U.get(i, j + 1));\n U.set(i, j, t);\n }\n }\n }\n e[p - 2] = f;\n iter = iter + 1;\n break;\n }\n case 4: {\n if (s[k] <= 0) {\n s[k] = s[k] < 0 ? -s[k] : 0;\n if (wantv) {\n for (let i = 0; i <= pp; i++) {\n V.set(i, k, -V.get(i, k));\n }\n }\n }\n while (k < pp) {\n if (s[k] >= s[k + 1]) {\n break;\n }\n let t = s[k];\n s[k] = s[k + 1];\n s[k + 1] = t;\n if (wantv && k < n - 1) {\n for (let i = 0; i < n; i++) {\n t = V.get(i, k + 1);\n V.set(i, k + 1, V.get(i, k));\n V.set(i, k, t);\n }\n }\n if (wantu && k < m - 1) {\n for (let i = 0; i < m; i++) {\n t = U.get(i, k + 1);\n U.set(i, k + 1, U.get(i, k));\n U.set(i, k, t);\n }\n }\n k++;\n }\n iter = 0;\n p--;\n break;\n }\n // no default\n }\n }\n\n if (swapped) {\n let tmp = V;\n V = U;\n U = tmp;\n }\n\n this.m = m;\n this.n = n;\n this.s = s;\n this.U = U;\n this.V = V;\n }\n\n solve(value) {\n let Y = value;\n let e = this.threshold;\n let scols = this.s.length;\n let Ls = matrix_Matrix.zeros(scols, scols);\n\n for (let i = 0; i < scols; i++) {\n if (Math.abs(this.s[i]) <= e) {\n Ls.set(i, i, 0);\n } else {\n Ls.set(i, i, 1 / this.s[i]);\n }\n }\n\n let U = this.U;\n let V = this.rightSingularVectors;\n\n let VL = V.mmul(Ls);\n let vrows = V.rows;\n let urows = U.rows;\n let VLU = matrix_Matrix.zeros(vrows, urows);\n\n for (let i = 0; i < vrows; i++) {\n for (let j = 0; j < urows; j++) {\n let sum = 0;\n for (let k = 0; k < scols; k++) {\n sum += VL.get(i, k) * U.get(j, k);\n }\n VLU.set(i, j, sum);\n }\n }\n\n return VLU.mmul(Y);\n }\n\n solveForDiagonal(value) {\n return this.solve(matrix_Matrix.diag(value));\n }\n\n inverse() {\n let V = this.V;\n let e = this.threshold;\n let vrows = V.rows;\n let vcols = V.columns;\n let X = new matrix_Matrix(vrows, this.s.length);\n\n for (let i = 0; i < vrows; i++) {\n for (let j = 0; j < vcols; j++) {\n if (Math.abs(this.s[j]) > e) {\n X.set(i, j, V.get(i, j) / this.s[j]);\n }\n }\n }\n\n let U = this.U;\n\n let urows = U.rows;\n let ucols = U.columns;\n let Y = new matrix_Matrix(vrows, urows);\n\n for (let i = 0; i < vrows; i++) {\n for (let j = 0; j < urows; j++) {\n let sum = 0;\n for (let k = 0; k < ucols; k++) {\n sum += X.get(i, k) * U.get(j, k);\n }\n Y.set(i, j, sum);\n }\n }\n\n return Y;\n }\n\n get condition() {\n return this.s[0] / this.s[Math.min(this.m, this.n) - 1];\n }\n\n get norm2() {\n return this.s[0];\n }\n\n get rank() {\n let tol = Math.max(this.m, this.n) * this.s[0] * Number.EPSILON;\n let r = 0;\n let s = this.s;\n for (let i = 0, ii = s.length; i < ii; i++) {\n if (s[i] > tol) {\n r++;\n }\n }\n return r;\n }\n\n get diagonal() {\n return Array.from(this.s);\n }\n\n get threshold() {\n return (Number.EPSILON / 2) * Math.max(this.m, this.n) * this.s[0];\n }\n\n get leftSingularVectors() {\n return this.U;\n }\n\n get rightSingularVectors() {\n return this.V;\n }\n\n get diagonalMatrix() {\n return matrix_Matrix.diag(this.s);\n }\n}\n\n// CONCATENATED MODULE: ./node_modules/@antv/layout/es/layout/radial/mds.js\n\nclass mds_MDS {\n constructor(params) {\n this.distances = params.distances;\n this.dimension = params.dimension || 2;\n this.linkDistance = params.linkDistance;\n }\n layout() {\n const self = this;\n const { dimension, distances, linkDistance } = self;\n try {\n // square distances\n const M = matrix_Matrix.mul(matrix_Matrix.pow(distances, 2), -0.5);\n // double centre the rows/columns\n const rowMeans = M.mean('row');\n const colMeans = M.mean('column');\n const totalMean = M.mean();\n M.add(totalMean).subRowVector(rowMeans).subColumnVector(colMeans);\n // take the SVD of the double centred matrix, and return the\n // points from it\n const ret = new svd_SingularValueDecomposition(M);\n const eigenValues = matrix_Matrix.sqrt(ret.diagonalMatrix).diagonal();\n return ret.leftSingularVectors.toJSON().map((row) => {\n return matrix_Matrix.mul([row], [eigenValues]).toJSON()[0].splice(0, dimension);\n });\n }\n catch (_a) {\n const res = [];\n for (let i = 0; i < distances.length; i++) {\n const x = Math.random() * linkDistance;\n const y = Math.random() * linkDistance;\n res.push([x, y]);\n }\n return res;\n }\n }\n}\n//# sourceMappingURL=mds.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/layout/es/layout/radial/radialNonoverlapForce.js\nconst SPEED_DIVISOR = 800;\nclass RadialNonoverlapForce {\n constructor(params) {\n this.disp = [];\n this.positions = params.positions;\n this.adjMatrix = params.adjMatrix;\n this.focusID = params.focusID;\n this.radii = params.radii;\n this.iterations = params.iterations || 10;\n this.height = params.height || 10;\n this.width = params.width || 10;\n this.speed = params.speed || 100;\n this.gravity = params.gravity || 10;\n this.nodeSizeFunc = params.nodeSizeFunc;\n this.k = params.k || 5;\n this.strictRadial = params.strictRadial;\n this.nodes = params.nodes;\n }\n layout() {\n const self = this;\n const positions = self.positions;\n const disp = [];\n const iterations = self.iterations;\n const maxDisplace = self.width / 10;\n self.maxDisplace = maxDisplace;\n self.disp = disp;\n for (let i = 0; i < iterations; i++) {\n positions.forEach((_, k) => {\n disp[k] = { x: 0, y: 0 };\n });\n // 给重叠的节点增加斥力\n self.getRepulsion();\n self.updatePositions();\n }\n return positions;\n }\n getRepulsion() {\n const self = this;\n const positions = self.positions;\n const nodes = self.nodes;\n const disp = self.disp;\n const k = self.k;\n const radii = self.radii || [];\n positions.forEach((v, i) => {\n disp[i] = { x: 0, y: 0 };\n positions.forEach((u, j) => {\n if (i === j) {\n return;\n }\n // v and u are not on the same circle, return\n if (radii[i] !== radii[j]) {\n return;\n }\n let vecx = v[0] - u[0];\n let vecy = v[1] - u[1];\n let vecLength = Math.sqrt(vecx * vecx + vecy * vecy);\n if (vecLength === 0) {\n vecLength = 1;\n const sign = i > j ? 1 : -1;\n vecx = 0.01 * sign;\n vecy = 0.01 * sign;\n }\n // these two nodes overlap\n if (vecLength < self.nodeSizeFunc(nodes[i]) / 2 + self.nodeSizeFunc(nodes[j]) / 2) {\n const common = (k * k) / vecLength;\n disp[i].x += (vecx / vecLength) * common;\n disp[i].y += (vecy / vecLength) * common;\n }\n });\n });\n }\n updatePositions() {\n const self = this;\n const positions = self.positions;\n const disp = self.disp;\n const speed = self.speed;\n const strictRadial = self.strictRadial;\n const f = self.focusID;\n const maxDisplace = self.maxDisplace || self.width / 10;\n if (strictRadial) {\n disp.forEach((di, i) => {\n const vx = positions[i][0] - positions[f][0];\n const vy = positions[i][1] - positions[f][1];\n const vLength = Math.sqrt(vx * vx + vy * vy);\n let vpx = vy / vLength;\n let vpy = -vx / vLength;\n const diLength = Math.sqrt(di.x * di.x + di.y * di.y);\n let alpha = Math.acos((vpx * di.x + vpy * di.y) / diLength);\n if (alpha > Math.PI / 2) {\n alpha -= Math.PI / 2;\n vpx *= -1;\n vpy *= -1;\n }\n const tdispLength = Math.cos(alpha) * diLength;\n di.x = vpx * tdispLength;\n di.y = vpy * tdispLength;\n });\n }\n // move\n const radii = self.radii;\n positions.forEach((n, i) => {\n if (i === f) {\n return;\n }\n const distLength = Math.sqrt(disp[i].x * disp[i].x + disp[i].y * disp[i].y);\n if (distLength > 0 && i !== f) {\n const limitedDist = Math.min(maxDisplace * (speed / SPEED_DIVISOR), distLength);\n n[0] += (disp[i].x / distLength) * limitedDist;\n n[1] += (disp[i].y / distLength) * limitedDist;\n if (strictRadial) {\n let vx = n[0] - positions[f][0];\n let vy = n[1] - positions[f][1];\n const nfDis = Math.sqrt(vx * vx + vy * vy);\n vx = (vx / nfDis) * radii[i];\n vy = (vy / nfDis) * radii[i];\n n[0] = positions[f][0] + vx;\n n[1] = positions[f][1] + vy;\n }\n }\n });\n }\n}\n//# sourceMappingURL=radialNonoverlapForce.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/layout/es/layout/radial/radial.js\n/**\n * @fileOverview random layout\n * @author shiwu.wyy@antfin.com\n */\n\n\n\n\nfunction getWeightMatrix(M) {\n const rows = M.length;\n const cols = M[0].length;\n const result = [];\n for (let i = 0; i < rows; i++) {\n const row = [];\n for (let j = 0; j < cols; j++) {\n if (M[i][j] !== 0) {\n row.push(1 / (M[i][j] * M[i][j]));\n }\n else {\n row.push(0);\n }\n }\n result.push(row);\n }\n return result;\n}\nfunction getIndexById(array, id) {\n let index = -1;\n array.forEach((a, i) => {\n if (a.id === id) {\n index = i;\n }\n });\n return index;\n}\nfunction getEDistance(p1, p2) {\n return Math.sqrt((p1[0] - p2[0]) * (p1[0] - p2[0]) + (p1[1] - p2[1]) * (p1[1] - p2[1]));\n}\n/**\n * 辐射状布局\n */\nclass radial_RadialLayout extends Base {\n constructor(options) {\n super();\n /** 停止迭代的最大迭代数 */\n this.maxIteration = 1000;\n /** 中心点,默认为数据中第一个点 */\n this.focusNode = null;\n /** 每一圈半径 */\n this.unitRadius = null;\n /** 默认边长度 */\n this.linkDistance = 50;\n /** 是否防止重叠 */\n this.preventOverlap = false;\n /** 是否必须是严格的 radial 布局,即每一层的节点严格布局在一个环上。preventOverlap 为 true 时生效 */\n this.strictRadial = true;\n /** 防止重叠步骤的最大迭代次数 */\n this.maxPreventOverlapIteration = 200;\n this.sortStrength = 10;\n this.nodes = [];\n this.edges = [];\n this.updateCfg(options);\n }\n getDefaultCfg() {\n return {\n maxIteration: 1000,\n focusNode: null,\n unitRadius: null,\n linkDistance: 50,\n preventOverlap: false,\n nodeSize: undefined,\n nodeSpacing: undefined,\n strictRadial: true,\n maxPreventOverlapIteration: 200,\n sortBy: undefined,\n sortStrength: 10\n };\n }\n /**\n * 执行布局\n */\n execute() {\n const self = this;\n const nodes = self.nodes;\n const edges = self.edges || [];\n if (!nodes || nodes.length === 0) {\n if (self.onLayoutEnd)\n self.onLayoutEnd();\n return;\n }\n if (!self.width && typeof window !== \"undefined\") {\n self.width = window.innerWidth;\n }\n if (!self.height && typeof window !== \"undefined\") {\n self.height = window.innerHeight;\n }\n if (!self.center) {\n self.center = [self.width / 2, self.height / 2];\n }\n const center = self.center;\n if (nodes.length === 1) {\n nodes[0].x = center[0];\n nodes[0].y = center[1];\n if (self.onLayoutEnd)\n self.onLayoutEnd();\n return;\n }\n const linkDistance = self.linkDistance;\n // layout\n let focusNode = null;\n if (isString(self.focusNode)) {\n let found = false;\n for (let i = 0; i < nodes.length; i++) {\n if (nodes[i].id === self.focusNode) {\n focusNode = nodes[i];\n self.focusNode = focusNode;\n found = true;\n i = nodes.length;\n }\n }\n if (!found) {\n focusNode = null;\n }\n }\n else {\n focusNode = self.focusNode;\n }\n // default focus node\n if (!focusNode) {\n focusNode = nodes[0];\n self.focusNode = focusNode;\n }\n // the index of the focusNode in data\n const focusIndex = getIndexById(nodes, focusNode.id);\n self.focusIndex = focusIndex;\n // the graph-theoretic distance (shortest path distance) matrix\n const adjMatrix = math_getAdjMatrix({ nodes, edges }, false);\n const D = util_math_floydWarshall(adjMatrix);\n const maxDistance = self.maxToFocus(D, focusIndex);\n // replace first node in unconnected component to the circle at (maxDistance + 1)\n self.handleInfinity(D, focusIndex, maxDistance + 1);\n self.distances = D;\n // the shortest path distance from each node to focusNode\n const focusNodeD = D[focusIndex];\n const width = self.width || 500;\n const height = self.height || 500;\n let semiWidth = width - center[0] > center[0] ? center[0] : width - center[0];\n let semiHeight = height - center[1] > center[1] ? center[1] : height - center[1];\n if (semiWidth === 0) {\n semiWidth = width / 2;\n }\n if (semiHeight === 0) {\n semiHeight = height / 2;\n }\n // the maxRadius of the graph\n const maxRadius = semiHeight > semiWidth ? semiWidth : semiHeight;\n const maxD = Math.max(...focusNodeD);\n // the radius for each nodes away from focusNode\n const radii = [];\n focusNodeD.forEach((value, i) => {\n if (!self.unitRadius) {\n self.unitRadius = maxRadius / maxD;\n }\n radii[i] = value * self.unitRadius;\n });\n self.radii = radii;\n const eIdealD = self.eIdealDisMatrix();\n // const eIdealD = scaleMatrix(D, linkDistance);\n self.eIdealDistances = eIdealD;\n // the weight matrix, Wij = 1 / dij^(-2)\n const W = getWeightMatrix(eIdealD);\n self.weights = W;\n // the initial positions from mds\n const mds = new mds_MDS({ linkDistance, distances: eIdealD });\n let positions = mds.layout();\n positions.forEach((p) => {\n if (number_isNaN(p[0])) {\n p[0] = Math.random() * linkDistance;\n }\n if (number_isNaN(p[1])) {\n p[1] = Math.random() * linkDistance;\n }\n });\n self.positions = positions;\n positions.forEach((p, i) => {\n nodes[i].x = p[0] + center[0];\n nodes[i].y = p[1] + center[1];\n });\n // move the graph to origin, centered at focusNode\n positions.forEach((p) => {\n p[0] -= positions[focusIndex][0];\n p[1] -= positions[focusIndex][1];\n });\n self.run();\n const preventOverlap = self.preventOverlap;\n const nodeSize = self.nodeSize;\n let nodeSizeFunc;\n const strictRadial = self.strictRadial;\n // stagger the overlapped nodes\n if (preventOverlap) {\n const nodeSpacing = self.nodeSpacing;\n let nodeSpacingFunc;\n if (isNumber(nodeSpacing)) {\n nodeSpacingFunc = () => nodeSpacing;\n }\n else if (isFunction(nodeSpacing)) {\n nodeSpacingFunc = nodeSpacing;\n }\n else {\n nodeSpacingFunc = () => 0;\n }\n if (!nodeSize) {\n nodeSizeFunc = (d) => {\n if (d.size) {\n if (isArray(d.size)) {\n const res = d.size[0] > d.size[1] ? d.size[0] : d.size[1];\n return res + nodeSpacingFunc(d);\n }\n if (isObject(d.size)) {\n const res = d.size.width > d.size.height ? d.size.width : d.size.height;\n return res + nodeSpacingFunc(d);\n }\n return d.size + nodeSpacingFunc(d);\n }\n return 10 + nodeSpacingFunc(d);\n };\n }\n else if (isArray(nodeSize)) {\n nodeSizeFunc = (d) => {\n const res = nodeSize[0] > nodeSize[1] ? nodeSize[0] : nodeSize[1];\n return res + nodeSpacingFunc(d);\n };\n }\n else {\n nodeSizeFunc = (d) => nodeSize + nodeSpacingFunc(d);\n }\n const nonoverlapForceParams = {\n nodes,\n nodeSizeFunc,\n adjMatrix,\n positions,\n radii,\n height,\n width,\n strictRadial,\n focusID: focusIndex,\n iterations: self.maxPreventOverlapIteration || 200,\n k: positions.length / 4.5\n };\n const nonoverlapForce = new RadialNonoverlapForce(nonoverlapForceParams);\n positions = nonoverlapForce.layout();\n }\n // move the graph to center\n positions.forEach((p, i) => {\n nodes[i].x = p[0] + center[0];\n nodes[i].y = p[1] + center[1];\n });\n if (self.onLayoutEnd)\n self.onLayoutEnd();\n return {\n nodes,\n edges\n };\n }\n run() {\n const self = this;\n const maxIteration = self.maxIteration;\n const positions = self.positions || [];\n const W = self.weights || [];\n const eIdealDis = self.eIdealDistances || [];\n const radii = self.radii || [];\n for (let i = 0; i <= maxIteration; i++) {\n const param = i / maxIteration;\n self.oneIteration(param, positions, radii, eIdealDis, W);\n }\n }\n oneIteration(param, positions, radii, D, W) {\n const self = this;\n const vparam = 1 - param;\n const focusIndex = self.focusIndex;\n positions.forEach((v, i) => {\n // v\n const originDis = getEDistance(v, [0, 0]);\n const reciODis = originDis === 0 ? 0 : 1 / originDis;\n if (i === focusIndex) {\n return;\n }\n let xMolecule = 0;\n let yMolecule = 0;\n let denominator = 0;\n positions.forEach((u, j) => {\n // u\n if (i === j) {\n return;\n }\n // the euclidean distance between v and u\n const edis = getEDistance(v, u);\n const reciEdis = edis === 0 ? 0 : 1 / edis;\n const idealDis = D[j][i];\n // same for x and y\n denominator += W[i][j];\n // x\n xMolecule += W[i][j] * (u[0] + idealDis * (v[0] - u[0]) * reciEdis);\n // y\n yMolecule += W[i][j] * (u[1] + idealDis * (v[1] - u[1]) * reciEdis);\n });\n const reciR = radii[i] === 0 ? 0 : 1 / radii[i];\n denominator *= vparam;\n denominator += param * reciR * reciR;\n // x\n xMolecule *= vparam;\n xMolecule += param * reciR * v[0] * reciODis;\n v[0] = xMolecule / denominator;\n // y\n yMolecule *= vparam;\n yMolecule += param * reciR * v[1] * reciODis;\n v[1] = yMolecule / denominator;\n });\n }\n eIdealDisMatrix() {\n const self = this;\n const nodes = self.nodes;\n if (!nodes)\n return [];\n const D = self.distances;\n const linkDis = self.linkDistance;\n const radii = self.radii || [];\n const unitRadius = self.unitRadius || 50;\n const result = [];\n if (D) {\n D.forEach((row, i) => {\n const newRow = [];\n row.forEach((v, j) => {\n if (i === j) {\n newRow.push(0);\n }\n else if (radii[i] === radii[j]) {\n // i and j are on the same circle\n if (self.sortBy === \"data\") {\n // sort the nodes on the same circle according to the ordering of the data\n newRow.push((v * (Math.abs(i - j) * self.sortStrength)) /\n (radii[i] / unitRadius));\n }\n else if (self.sortBy) {\n // sort the nodes on the same circle according to the attributes\n let iValue = nodes[i][self.sortBy] || 0;\n let jValue = nodes[j][self.sortBy] || 0;\n if (isString(iValue)) {\n iValue = iValue.charCodeAt(0);\n }\n if (isString(jValue)) {\n jValue = jValue.charCodeAt(0);\n }\n newRow.push((v * (Math.abs(iValue - jValue) * self.sortStrength)) /\n (radii[i] / unitRadius));\n }\n else {\n newRow.push((v * linkDis) / (radii[i] / unitRadius));\n }\n }\n else {\n // i and j are on different circle\n // i and j are on different circle\n const link = (linkDis + unitRadius) / 2;\n newRow.push(v * link);\n }\n });\n result.push(newRow);\n });\n }\n return result;\n }\n handleInfinity(matrix, focusIndex, step) {\n const length = matrix.length;\n // 遍历 matrix 中遍历 focus 对应行\n for (let i = 0; i < length; i++) {\n // matrix 关注点对应行的 Inf 项\n if (matrix[focusIndex][i] === Infinity) {\n matrix[focusIndex][i] = step;\n matrix[i][focusIndex] = step;\n // 遍历 matrix 中的 i 行,i 行中非 Inf 项若在 focus 行为 Inf,则替换 focus 行的那个 Inf\n for (let j = 0; j < length; j++) {\n if (matrix[i][j] !== Infinity && matrix[focusIndex][j] === Infinity) {\n matrix[focusIndex][j] = step + matrix[i][j];\n matrix[j][focusIndex] = step + matrix[i][j];\n }\n }\n }\n }\n // 处理其他行的 Inf。根据该行对应点与 focus 距离以及 Inf 项点 与 focus 距离,决定替换值\n for (let i = 0; i < length; i++) {\n if (i === focusIndex) {\n continue;\n }\n for (let j = 0; j < length; j++) {\n if (matrix[i][j] === Infinity) {\n let minus = Math.abs(matrix[focusIndex][i] - matrix[focusIndex][j]);\n minus = minus === 0 ? 1 : minus;\n matrix[i][j] = minus;\n }\n }\n }\n }\n maxToFocus(matrix, focusIndex) {\n let max = 0;\n for (let i = 0; i < matrix[focusIndex].length; i++) {\n if (matrix[focusIndex][i] === Infinity) {\n continue;\n }\n max = matrix[focusIndex][i] > max ? matrix[focusIndex][i] : max;\n }\n return max;\n }\n getType() {\n return \"radial\";\n }\n}\n//# sourceMappingURL=radial.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/layout/es/layout/radial/index.js\n\n//# sourceMappingURL=index.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/layout/es/layout/concentric.js\n/**\n * @fileOverview concentric layout\n * @author shiwu.wyy@antfin.com\n * this algorithm refers to - https://github.com/cytoscape/cytoscape.js/\n */\n\n\n/**\n * 同心圆布局\n */\nclass concentric_ConcentricLayout extends Base {\n constructor(options) {\n super();\n this.nodeSize = 30;\n /** min spacing between outside of nodes (used for radius adjustment) */\n this.minNodeSpacing = 10;\n /** prevents node overlap, may overflow boundingBox if not enough space */\n this.preventOverlap = false;\n /** whether levels have an equal radial distance betwen them, may cause bounding box overflow */\n this.equidistant = false;\n /** where nodes start in radians */\n this.startAngle = (3 / 2) * Math.PI;\n /** whether the layout should go clockwise (true) or counterclockwise/anticlockwise (false) */\n this.clockwise = true;\n /** 根据 sortBy 指定的属性进行排布,数值高的放在中心,如果是 sortBy 则会计算节点度数,度数最高的放在中心 */\n this.sortBy = \"degree\";\n this.nodes = [];\n this.edges = [];\n this.width = 300;\n this.height = 300;\n /** 迭代结束的回调函数 */\n this.onLayoutEnd = () => { };\n this.updateCfg(options);\n }\n getDefaultCfg() {\n return {\n nodeSize: 30,\n minNodeSpacing: 10,\n preventOverlap: false,\n sweep: undefined,\n equidistant: false,\n startAngle: (3 / 2) * Math.PI,\n clockwise: true,\n maxLevelDiff: undefined,\n sortBy: \"degree\"\n };\n }\n /**\n * 执行布局\n */\n execute() {\n const self = this;\n const nodes = self.nodes;\n const edges = self.edges;\n const n = nodes.length;\n if (n === 0) {\n if (self.onLayoutEnd)\n self.onLayoutEnd();\n return;\n }\n if (!self.width && typeof window !== \"undefined\") {\n self.width = window.innerWidth;\n }\n if (!self.height && typeof window !== \"undefined\") {\n self.height = window.innerHeight;\n }\n if (!self.center) {\n self.center = [self.width / 2, self.height / 2];\n }\n const center = self.center;\n if (n === 1) {\n nodes[0].x = center[0];\n nodes[0].y = center[1];\n if (self.onLayoutEnd)\n self.onLayoutEnd();\n return;\n }\n const layoutNodes = [];\n let maxNodeSize;\n if (isArray(self.nodeSize)) {\n maxNodeSize = Math.max(self.nodeSize[0], self.nodeSize[1]);\n }\n else {\n maxNodeSize = self.nodeSize;\n }\n nodes.forEach((node) => {\n layoutNodes.push(node);\n let nodeSize = maxNodeSize;\n if (isArray(node.size)) {\n nodeSize = Math.max(node.size[0], node.size[1]);\n }\n else if (isNumber(node.size)) {\n nodeSize = node.size;\n }\n else if (isObject(node.size)) {\n nodeSize = Math.max(node.size.width, node.size.height);\n }\n maxNodeSize = Math.max(maxNodeSize, nodeSize);\n });\n self.clockwise =\n self.counterclockwise !== undefined\n ? !self.counterclockwise\n : self.clockwise;\n // layout\n const nodeMap = {};\n const indexMap = {};\n layoutNodes.forEach((node, i) => {\n nodeMap[node.id] = node;\n indexMap[node.id] = i;\n });\n // get the node degrees\n if (self.sortBy === \"degree\" ||\n !isString(self.sortBy) ||\n layoutNodes[0][self.sortBy] === undefined) {\n self.sortBy = \"degree\";\n if (!isNumber(nodes[0].degree)) {\n const values = math_getDegree(nodes.length, indexMap, edges);\n layoutNodes.forEach((node, i) => {\n node.degree = values[i];\n });\n }\n }\n // sort nodes by value\n layoutNodes.sort((n1, n2) => n2[self.sortBy] - n1[self.sortBy]);\n self.maxValueNode = layoutNodes[0];\n self.maxLevelDiff =\n self.maxLevelDiff || self.maxValueNode[self.sortBy] / 4;\n // put the values into levels\n const levels = [[]];\n let currentLevel = levels[0];\n layoutNodes.forEach((node) => {\n if (currentLevel.length > 0) {\n const diff = Math.abs(currentLevel[0][self.sortBy] - node[self.sortBy]);\n if (self.maxLevelDiff && diff >= self.maxLevelDiff) {\n currentLevel = [];\n levels.push(currentLevel);\n }\n }\n currentLevel.push(node);\n });\n // create positions for levels\n let minDist = maxNodeSize + self.minNodeSpacing; // min dist between nodes\n if (!self.preventOverlap) {\n // then strictly constrain to bb\n const firstLvlHasMulti = levels.length > 0 && levels[0].length > 1;\n const maxR = Math.min(self.width, self.height) / 2 - minDist;\n const rStep = maxR / (levels.length + (firstLvlHasMulti ? 1 : 0));\n minDist = Math.min(minDist, rStep);\n }\n // find the metrics for each level\n let r = 0;\n levels.forEach((level) => {\n let sweep = self.sweep;\n if (sweep === undefined) {\n sweep = 2 * Math.PI - (2 * Math.PI) / level.length;\n }\n const dTheta = (level.dTheta = sweep / Math.max(1, level.length - 1));\n // calculate the radius\n if (level.length > 1 && self.preventOverlap) {\n // but only if more than one node (can't overlap)\n const dcos = Math.cos(dTheta) - Math.cos(0);\n const dsin = Math.sin(dTheta) - Math.sin(0);\n const rMin = Math.sqrt((minDist * minDist) / (dcos * dcos + dsin * dsin)); // s.t. no nodes overlapping\n r = Math.max(rMin, r);\n }\n level.r = r;\n r += minDist;\n });\n if (self.equidistant) {\n let rDeltaMax = 0;\n let rr = 0;\n for (let i = 0; i < levels.length; i++) {\n const level = levels[i];\n const rDelta = level.r - rr;\n rDeltaMax = Math.max(rDeltaMax, rDelta);\n }\n rr = 0;\n levels.forEach((level, i) => {\n if (i === 0) {\n rr = level.r;\n }\n level.r = rr;\n rr += rDeltaMax;\n });\n }\n // calculate the node positions\n levels.forEach((level) => {\n const dTheta = level.dTheta;\n const rr = level.r;\n level.forEach((node, j) => {\n const theta = self.startAngle + (self.clockwise ? 1 : -1) * dTheta * j;\n node.x = center[0] + rr * Math.cos(theta);\n node.y = center[1] + rr * Math.sin(theta);\n });\n });\n if (self.onLayoutEnd)\n self.onLayoutEnd();\n return {\n nodes,\n edges\n };\n }\n getType() {\n return \"concentric\";\n }\n}\n//# sourceMappingURL=concentric.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/layout/es/layout/mds.js\n/**\n * @fileOverview MDS layout\n * @author shiwu.wyy@antfin.com\n */\n\n\n\n/**\n * mds 布局\n */\nclass mds_MDSLayout extends Base {\n constructor(options) {\n super();\n /** 布局中心 */\n this.center = [0, 0];\n /** 边长度 */\n this.linkDistance = 50;\n this.nodes = [];\n this.edges = [];\n /** 迭代结束的回调函数 */\n this.onLayoutEnd = () => { };\n this.updateCfg(options);\n }\n getDefaultCfg() {\n return {\n center: [0, 0],\n linkDistance: 50\n };\n }\n /**\n * 执行布局\n */\n execute() {\n const self = this;\n const { nodes, edges = [] } = self;\n const center = self.center;\n if (!nodes || nodes.length === 0) {\n if (self.onLayoutEnd)\n self.onLayoutEnd();\n return;\n }\n if (nodes.length === 1) {\n nodes[0].x = center[0];\n nodes[0].y = center[1];\n if (self.onLayoutEnd)\n self.onLayoutEnd();\n return;\n }\n const linkDistance = self.linkDistance;\n // the graph-theoretic distance (shortest path distance) matrix\n const adjMatrix = math_getAdjMatrix({ nodes, edges }, false);\n const distances = util_math_floydWarshall(adjMatrix);\n self.handleInfinity(distances);\n // scale the ideal edge length acoording to linkDistance\n const scaledD = math_scaleMatrix(distances, linkDistance);\n self.scaledDistances = scaledD;\n // get positions by MDS\n const positions = self.runMDS();\n self.positions = positions;\n positions.forEach((p, i) => {\n nodes[i].x = p[0] + center[0];\n nodes[i].y = p[1] + center[1];\n });\n if (self.onLayoutEnd)\n self.onLayoutEnd();\n return {\n nodes,\n edges\n };\n }\n /**\n * mds 算法\n * @return {array} positions 计算后的节点位置数组\n */\n runMDS() {\n const self = this;\n const dimension = 2;\n const distances = self.scaledDistances;\n // square distances\n const M = matrix_Matrix.mul(matrix_Matrix.pow(distances, 2), -0.5);\n // double centre the rows/columns\n const rowMeans = M.mean(\"row\");\n const colMeans = M.mean(\"column\");\n const totalMean = M.mean();\n M.add(totalMean)\n .subRowVector(rowMeans)\n .subColumnVector(colMeans);\n // take the SVD of the double centred matrix, and return the\n // points from it\n const ret = new svd_SingularValueDecomposition(M);\n const eigenValues = matrix_Matrix.sqrt(ret.diagonalMatrix).diagonal();\n return ret.leftSingularVectors.toJSON().map((row) => {\n return matrix_Matrix.mul([row], [eigenValues])\n .toJSON()[0]\n .splice(0, dimension);\n });\n }\n handleInfinity(distances) {\n let maxDistance = -999999;\n distances.forEach((row) => {\n row.forEach((value) => {\n if (value === Infinity) {\n return;\n }\n if (maxDistance < value) {\n maxDistance = value;\n }\n });\n });\n distances.forEach((row, i) => {\n row.forEach((value, j) => {\n if (value === Infinity) {\n distances[i][j] = maxDistance;\n }\n });\n });\n }\n getType() {\n return \"mds\";\n }\n}\n//# sourceMappingURL=mds.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/layout/es/layout/fruchterman.js\n/**\n * @fileOverview fruchterman layout\n * @author shiwu.wyy@antfin.com\n */\n\n\nconst fruchterman_SPEED_DIVISOR = 800;\n/**\n * fruchterman 布局\n */\nclass fruchterman_FruchtermanLayout extends Base {\n constructor(options) {\n super();\n /** 停止迭代的最大迭代数 */\n this.maxIteration = 1000;\n /** 是否启动 worker */\n this.workerEnabled = false;\n /** 重力大小,影响图的紧凑程度 */\n this.gravity = 10;\n /** 速度 */\n this.speed = 5;\n /** 是否产生聚类力 */\n this.clustering = false;\n /** 聚类力大小 */\n this.clusterGravity = 10;\n this.nodes = [];\n this.edges = [];\n this.width = 300;\n this.height = 300;\n this.nodeMap = {};\n this.nodeIdxMap = {};\n /** 迭代结束的回调函数 */\n this.onLayoutEnd = () => { };\n /** 每次迭代结束的回调函数 */\n this.tick = () => { };\n this.updateCfg(options);\n }\n getDefaultCfg() {\n return {\n maxIteration: 1000,\n gravity: 10,\n speed: 1,\n clustering: false,\n clusterGravity: 10\n };\n }\n /**\n * 执行布局\n */\n execute() {\n var _a, _b;\n const self = this;\n const nodes = self.nodes;\n if (self.timeInterval !== undefined && typeof window !== \"undefined\") {\n window.clearInterval(self.timeInterval);\n }\n if (!nodes || nodes.length === 0) {\n (_a = self.onLayoutEnd) === null || _a === void 0 ? void 0 : _a.call(self);\n return;\n }\n if (!self.width && typeof window !== \"undefined\") {\n self.width = window.innerWidth;\n }\n if (!self.height && typeof window !== \"undefined\") {\n self.height = window.innerHeight;\n }\n if (!self.center) {\n self.center = [self.width / 2, self.height / 2];\n }\n const center = self.center;\n if (nodes.length === 1) {\n nodes[0].x = center[0];\n nodes[0].y = center[1];\n (_b = self.onLayoutEnd) === null || _b === void 0 ? void 0 : _b.call(self);\n return;\n }\n const nodeMap = {};\n const nodeIdxMap = {};\n nodes.forEach((node, i) => {\n if (!isNumber(node.x))\n node.x = Math.random() * this.width;\n if (!isNumber(node.y))\n node.y = Math.random() * this.height;\n nodeMap[node.id] = node;\n nodeIdxMap[node.id] = i;\n });\n self.nodeMap = nodeMap;\n self.nodeIdxMap = nodeIdxMap;\n // layout\n return self.run();\n }\n run() {\n var _a;\n const self = this;\n const nodes = self.nodes;\n if (!nodes)\n return;\n const { edges, maxIteration, workerEnabled } = self;\n const clustering = self.clustering;\n const clusterMap = {};\n if (clustering) {\n nodes.forEach((n) => {\n if (clusterMap[n.cluster] === undefined) {\n const cluster = {\n name: n.cluster,\n cx: 0,\n cy: 0,\n count: 0\n };\n clusterMap[n.cluster] = cluster;\n }\n const c = clusterMap[n.cluster];\n if (isNumber(n.x)) {\n c.cx += n.x;\n }\n if (isNumber(n.y)) {\n c.cy += n.y;\n }\n c.count++;\n });\n for (const key in clusterMap) {\n clusterMap[key].cx /= clusterMap[key].count;\n clusterMap[key].cy /= clusterMap[key].count;\n }\n }\n if (workerEnabled) {\n for (let i = 0; i < maxIteration; i++) {\n self.runOneStep(clusterMap);\n }\n (_a = self.onLayoutEnd) === null || _a === void 0 ? void 0 : _a.call(self);\n }\n else {\n if (typeof window === \"undefined\")\n return;\n let iter = 0;\n // interval for render the result after each iteration\n this.timeInterval = window.setInterval(() => {\n var _a;\n self.runOneStep(clusterMap);\n iter++;\n if (iter >= maxIteration) {\n (_a = self.onLayoutEnd) === null || _a === void 0 ? void 0 : _a.call(self);\n window.clearInterval(self.timeInterval);\n }\n }, 0);\n }\n return {\n nodes,\n edges\n };\n }\n runOneStep(clusterMap) {\n var _a;\n const self = this;\n const nodes = self.nodes;\n if (!nodes)\n return;\n const { edges, center, gravity, speed, clustering } = self;\n const area = self.height * self.width;\n const maxDisplace = Math.sqrt(area) / 10;\n const k2 = area / (nodes.length + 1);\n const k = Math.sqrt(k2);\n const displacements = [];\n nodes.forEach((_, j) => {\n displacements[j] = { x: 0, y: 0 };\n });\n self.applyCalculate(nodes, edges, displacements, k, k2);\n // gravity for clusters\n if (clustering) {\n const clusterGravity = self.clusterGravity || gravity;\n nodes.forEach((n, j) => {\n if (!isNumber(n.x) || !isNumber(n.y))\n return;\n const c = clusterMap[n.cluster];\n const distLength = Math.sqrt((n.x - c.cx) * (n.x - c.cx) + (n.y - c.cy) * (n.y - c.cy));\n const gravityForce = k * clusterGravity;\n displacements[j].x -= (gravityForce * (n.x - c.cx)) / distLength;\n displacements[j].y -= (gravityForce * (n.y - c.cy)) / distLength;\n });\n for (const key in clusterMap) {\n clusterMap[key].cx = 0;\n clusterMap[key].cy = 0;\n clusterMap[key].count = 0;\n }\n nodes.forEach((n) => {\n const c = clusterMap[n.cluster];\n if (isNumber(n.x)) {\n c.cx += n.x;\n }\n if (isNumber(n.y)) {\n c.cy += n.y;\n }\n c.count++;\n });\n for (const key in clusterMap) {\n clusterMap[key].cx /= clusterMap[key].count;\n clusterMap[key].cy /= clusterMap[key].count;\n }\n }\n // gravity\n nodes.forEach((n, j) => {\n if (!isNumber(n.x) || !isNumber(n.y))\n return;\n const gravityForce = 0.01 * k * gravity;\n displacements[j].x -= gravityForce * (n.x - center[0]);\n displacements[j].y -= gravityForce * (n.y - center[1]);\n });\n // move\n nodes.forEach((n, j) => {\n if (isNumber(n.fx) && isNumber(n.fy)) {\n n.x = n.fx;\n n.y = n.fy;\n return;\n }\n if (!isNumber(n.x) || !isNumber(n.y))\n return;\n const distLength = Math.sqrt(displacements[j].x * displacements[j].x +\n displacements[j].y * displacements[j].y);\n if (distLength > 0) {\n // && !n.isFixed()\n const limitedDist = Math.min(maxDisplace * (speed / fruchterman_SPEED_DIVISOR), distLength);\n n.x += (displacements[j].x / distLength) * limitedDist;\n n.y += (displacements[j].y / distLength) * limitedDist;\n }\n });\n (_a = self.tick) === null || _a === void 0 ? void 0 : _a.call(self);\n }\n applyCalculate(nodes, edges, displacements, k, k2) {\n const self = this;\n self.calRepulsive(nodes, displacements, k2);\n if (edges)\n self.calAttractive(edges, displacements, k);\n }\n calRepulsive(nodes, displacements, k2) {\n nodes.forEach((v, i) => {\n displacements[i] = { x: 0, y: 0 };\n nodes.forEach((u, j) => {\n if (i === j) {\n return;\n }\n if (!isNumber(v.x) ||\n !isNumber(u.x) ||\n !isNumber(v.y) ||\n !isNumber(u.y)) {\n return;\n }\n let vecX = v.x - u.x;\n let vecY = v.y - u.y;\n let vecLengthSqr = vecX * vecX + vecY * vecY;\n if (vecLengthSqr === 0) {\n vecLengthSqr = 1;\n const sign = i > j ? 1 : -1;\n vecX = 0.01 * sign;\n vecY = 0.01 * sign;\n }\n const common = k2 / vecLengthSqr;\n displacements[i].x += vecX * common;\n displacements[i].y += vecY * common;\n });\n });\n }\n calAttractive(edges, displacements, k) {\n edges.forEach((e) => {\n const source = getEdgeTerminal(e, 'source');\n const target = getEdgeTerminal(e, 'target');\n if (!source || !target)\n return;\n const uIndex = this.nodeIdxMap[source];\n const vIndex = this.nodeIdxMap[target];\n if (uIndex === vIndex) {\n return;\n }\n const u = this.nodeMap[source];\n const v = this.nodeMap[target];\n if (!isNumber(v.x) || !isNumber(u.x) || !isNumber(v.y) || !isNumber(u.y)) {\n return;\n }\n const vecX = v.x - u.x;\n const vecY = v.y - u.y;\n const vecLength = Math.sqrt(vecX * vecX + vecY * vecY);\n const common = (vecLength * vecLength) / k;\n displacements[vIndex].x -= (vecX / vecLength) * common;\n displacements[vIndex].y -= (vecY / vecLength) * common;\n displacements[uIndex].x += (vecX / vecLength) * common;\n displacements[uIndex].y += (vecY / vecLength) * common;\n });\n }\n stop() {\n if (this.timeInterval && typeof window !== \"undefined\") {\n window.clearInterval(this.timeInterval);\n }\n }\n destroy() {\n const self = this;\n self.stop();\n self.tick = null;\n self.nodes = null;\n self.edges = null;\n self.destroyed = true;\n }\n getType() {\n return \"fruchterman\";\n }\n}\n//# sourceMappingURL=fruchterman.js.map\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/initializerDefineProperty.js\nvar initializerDefineProperty = __webpack_require__(10);\nvar initializerDefineProperty_default = /*#__PURE__*/__webpack_require__.n(initializerDefineProperty);\n\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/classCallCheck.js\nvar classCallCheck = __webpack_require__(6);\nvar classCallCheck_default = /*#__PURE__*/__webpack_require__.n(classCallCheck);\n\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/createClass.js\nvar createClass = __webpack_require__(7);\nvar createClass_default = /*#__PURE__*/__webpack_require__.n(createClass);\n\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/applyDecoratedDescriptor.js\nvar applyDecoratedDescriptor = __webpack_require__(11);\nvar applyDecoratedDescriptor_default = /*#__PURE__*/__webpack_require__.n(applyDecoratedDescriptor);\n\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/initializerWarningHelper.js\nvar initializerWarningHelper = __webpack_require__(29);\n\n// EXTERNAL MODULE: ./node_modules/@antv/g-webgpu-core/es/index.js\nvar g_webgpu_core_es = __webpack_require__(3);\n\n// EXTERNAL MODULE: ./node_modules/gl-matrix/esm/index.js + 4 modules\nvar gl_matrix_esm = __webpack_require__(2);\n\n// EXTERNAL MODULE: ./node_modules/inversify/lib/inversify.js\nvar inversify = __webpack_require__(5);\n\n// CONCATENATED MODULE: ./node_modules/@antv/g-webgpu/es/utils/is-number.js\nfunction is_number_isNumber(value) {\n return typeof value === 'number';\n}\n//# sourceMappingURL=is-number.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-webgpu/es/utils/math.js\n\n\nfunction getAngle(angle) {\n if (angle === undefined) {\n return 0;\n } else if (angle > 360 || angle < -360) {\n return angle % 360;\n }\n\n return angle;\n}\nfunction createVec3(x, y, z) {\n if (is_number_isNumber(x)) {\n return gl_matrix_esm[\"e\" /* vec3 */].fromValues(x, y, z);\n }\n\n if (x.length === 3) {\n return gl_matrix_esm[\"e\" /* vec3 */].clone(x);\n } // @ts-ignore\n\n\n return gl_matrix_esm[\"e\" /* vec3 */].fromValues(x[0], x[1], x[2]);\n}\n//# sourceMappingURL=math.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-webgpu/es/camera/Landmark.js\n\n\n\n\n/**\n * 保存相机状态,便于后续在多个 Landmark 间移动\n */\nvar Landmark_Landmark = /*#__PURE__*/function () {\n function Landmark(name, c) {\n classCallCheck_default()(this, Landmark);\n\n this.name = void 0;\n this.matrix = void 0;\n this.right = void 0;\n this.up = void 0;\n this.forward = void 0;\n this.position = void 0;\n this.focalPoint = void 0;\n this.distanceVector = void 0;\n this.distance = void 0;\n this.dollyingStep = void 0;\n this.azimuth = 0;\n this.elevation = 0;\n this.roll = 0;\n this.relAzimuth = 0;\n this.relElevation = 0;\n this.relRoll = 0;\n this.name = name;\n this.matrix = gl_matrix_esm[\"b\" /* mat4 */].clone(c.matrix);\n this.right = gl_matrix_esm[\"e\" /* vec3 */].clone(c.right);\n this.up = gl_matrix_esm[\"e\" /* vec3 */].clone(c.up);\n this.forward = gl_matrix_esm[\"e\" /* vec3 */].clone(c.forward);\n this.position = gl_matrix_esm[\"e\" /* vec3 */].clone(c.position);\n this.focalPoint = gl_matrix_esm[\"e\" /* vec3 */].clone(c.focalPoint);\n this.distanceVector = gl_matrix_esm[\"e\" /* vec3 */].clone(c.distanceVector);\n this.azimuth = c.azimuth;\n this.elevation = c.elevation;\n this.roll = c.roll;\n this.relAzimuth = c.relAzimuth;\n this.relElevation = c.relElevation;\n this.relRoll = c.relRoll;\n this.dollyingStep = c.dollyingStep;\n this.distance = c.distance;\n }\n\n createClass_default()(Landmark, [{\n key: \"getPosition\",\n value: function getPosition() {\n return this.position;\n }\n }, {\n key: \"getFocalPoint\",\n value: function getFocalPoint() {\n return this.focalPoint;\n }\n }, {\n key: \"getRoll\",\n value: function getRoll() {\n return this.roll;\n }\n }, {\n key: \"retrieve\",\n value: function retrieve(c) {\n c.matrix = gl_matrix_esm[\"b\" /* mat4 */].copy(c.matrix, this.matrix);\n c.right = gl_matrix_esm[\"e\" /* vec3 */].copy(c.right, this.right);\n c.up = gl_matrix_esm[\"e\" /* vec3 */].copy(c.up, this.up);\n c.forward = gl_matrix_esm[\"e\" /* vec3 */].copy(c.forward, this.forward);\n c.position = gl_matrix_esm[\"e\" /* vec3 */].copy(c.position, this.position);\n c.focalPoint = gl_matrix_esm[\"e\" /* vec3 */].copy(c.focalPoint, this.focalPoint);\n c.distanceVector = gl_matrix_esm[\"e\" /* vec3 */].copy(c.distanceVector, this.distanceVector);\n c.azimuth = this.azimuth;\n c.elevation = this.elevation;\n c.roll = this.roll;\n c.relAzimuth = this.relAzimuth;\n c.relElevation = this.relElevation;\n c.relRoll = this.relRoll;\n c.dollyingStep = this.dollyingStep;\n c.distance = this.distance;\n }\n }]);\n\n return Landmark;\n}();\n\n\n//# sourceMappingURL=Landmark.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-webgpu/es/camera/Camera.js\n\n\n\n\n\n\nvar _dec, _dec2, _class, _class2, _descriptor, _class3, _temp;\n\n\n\n\n\n\nvar CAMERA_TYPE;\n\n(function (CAMERA_TYPE) {\n CAMERA_TYPE[\"ORBITING\"] = \"ORBITING\";\n CAMERA_TYPE[\"EXPLORING\"] = \"EXPLORING\";\n CAMERA_TYPE[\"TRACKING\"] = \"TRACKING\";\n})(CAMERA_TYPE || (CAMERA_TYPE = {}));\n\nvar CAMERA_TRACKING_MODE;\n\n(function (CAMERA_TRACKING_MODE) {\n CAMERA_TRACKING_MODE[\"DEFAULT\"] = \"DEFAULT\";\n CAMERA_TRACKING_MODE[\"ROTATIONAL\"] = \"ROTATIONAL\";\n CAMERA_TRACKING_MODE[\"TRANSLATIONAL\"] = \"TRANSLATIONAL\";\n CAMERA_TRACKING_MODE[\"CINEMATIC\"] = \"CINEMATIC\";\n})(CAMERA_TRACKING_MODE || (CAMERA_TRACKING_MODE = {}));\n\nvar CAMERA_PROJECTION_MODE;\n\n(function (CAMERA_PROJECTION_MODE) {\n CAMERA_PROJECTION_MODE[\"ORTHOGRAPHIC\"] = \"ORTHOGRAPHIC\";\n CAMERA_PROJECTION_MODE[\"PERSPECTIVE\"] = \"PERSPECTIVE\";\n})(CAMERA_PROJECTION_MODE || (CAMERA_PROJECTION_MODE = {}));\n\nvar DEG_2_RAD = Math.PI / 180;\nvar RAD_2_DEG = 180 / Math.PI;\n/**\n * 参考「WebGL Insights - 23.Designing Cameras for WebGL Applications」,基于 Responsible Camera 思路设计\n * 保存相机参数,定义相机动作:\n * 1. dolly 沿 n 轴移动\n * 2. pan 沿 u v 轴移动\n * 3. rotate 以方位角旋转\n * 4. 移动到 Landmark,具有平滑的动画效果,其间禁止其他用户交互\n */\n\nvar Camera_Camera = (_dec = Object(inversify[\"injectable\"])(), _dec2 = Object(inversify[\"inject\"])(g_webgpu_core_es[\"IDENTIFIER\"].InteractorService), _dec(_class = (_class2 = (_temp = _class3 = /*#__PURE__*/function () {\n function Camera() {\n classCallCheck_default()(this, Camera);\n\n this.matrix = gl_matrix_esm[\"b\" /* mat4 */].create();\n this.right = gl_matrix_esm[\"e\" /* vec3 */].fromValues(1, 0, 0);\n this.up = gl_matrix_esm[\"e\" /* vec3 */].fromValues(0, 1, 0);\n this.forward = gl_matrix_esm[\"e\" /* vec3 */].fromValues(0, 0, 1);\n this.position = gl_matrix_esm[\"e\" /* vec3 */].fromValues(0, 0, 1);\n this.focalPoint = gl_matrix_esm[\"e\" /* vec3 */].fromValues(0, 0, 0);\n this.distanceVector = gl_matrix_esm[\"e\" /* vec3 */].fromValues(0, 0, 0);\n this.distance = 1;\n this.azimuth = 0;\n this.elevation = 0;\n this.roll = 0;\n this.relAzimuth = 0;\n this.relElevation = 0;\n this.relRoll = 0;\n this.dollyingStep = 0;\n this.maxDistance = Infinity;\n this.minDistance = -Infinity;\n this.rotateWorld = false;\n\n initializerDefineProperty_default()(this, \"interactor\", _descriptor, this);\n\n this.fov = 30;\n this.near = 0.1;\n this.far = 10000;\n this.aspect = 1;\n this.left = void 0;\n this.rright = void 0;\n this.top = void 0;\n this.bottom = void 0;\n this.zoom = 1;\n this.perspective = gl_matrix_esm[\"b\" /* mat4 */].create();\n this.view = void 0;\n this.following = undefined;\n this.type = CAMERA_TYPE.EXPLORING;\n this.trackingMode = CAMERA_TRACKING_MODE.DEFAULT;\n this.projectionMode = CAMERA_PROJECTION_MODE.PERSPECTIVE;\n this.frustum = new g_webgpu_core_es[\"Frustum\"]();\n this.landmarks = [];\n this.landmarkAnimationID = void 0;\n }\n\n createClass_default()(Camera, [{\n key: \"clone\",\n value: function clone() {\n var camera = new Camera();\n camera.setType(this.type, undefined);\n camera.interactor = this.interactor;\n return camera;\n }\n }, {\n key: \"getProjectionMode\",\n value: function getProjectionMode() {\n return this.projectionMode;\n }\n }, {\n key: \"getPerspective\",\n value: function getPerspective() {\n return this.perspective;\n }\n }, {\n key: \"getFrustum\",\n value: function getFrustum() {\n return this.frustum;\n }\n }, {\n key: \"getPosition\",\n value: function getPosition() {\n return this.position;\n }\n }, {\n key: \"setType\",\n value: function setType(type, trackingMode) {\n this.type = type;\n\n if (this.type === CAMERA_TYPE.EXPLORING) {\n this.setWorldRotation(true);\n } else {\n this.setWorldRotation(false);\n }\n\n this._getAngles();\n\n if (this.type === CAMERA_TYPE.TRACKING && trackingMode !== undefined) {\n this.setTrackingMode(trackingMode);\n }\n\n return this;\n }\n }, {\n key: \"setProjectionMode\",\n value: function setProjectionMode(projectionMode) {\n this.projectionMode = projectionMode;\n return this;\n }\n }, {\n key: \"setTrackingMode\",\n value: function setTrackingMode(trackingMode) {\n if (this.type !== CAMERA_TYPE.TRACKING) {\n throw new Error('Impossible to set a tracking mode if the camera is not of tracking type');\n }\n\n this.trackingMode = trackingMode;\n return this;\n }\n /**\n * If flag is true, it reverses the azimuth and elevation angles.\n * Subsequent calls to rotate, setAzimuth, setElevation,\n * changeAzimuth or changeElevation will cause the inverted effect.\n * setRoll or changeRoll is not affected by this method.\n *\n * This inversion is useful when one wants to simulate that the world\n * is moving, instead of the camera.\n *\n * By default the camera angles are not reversed.\n * @param {Boolean} flag the boolean flag to reverse the angles.\n */\n\n }, {\n key: \"setWorldRotation\",\n value: function setWorldRotation(flag) {\n this.rotateWorld = flag;\n\n this._getAngles();\n }\n /**\n * 计算 MV 矩阵,为相机矩阵的逆矩阵\n */\n\n }, {\n key: \"getViewTransform\",\n value: function getViewTransform() {\n return gl_matrix_esm[\"b\" /* mat4 */].invert(gl_matrix_esm[\"b\" /* mat4 */].create(), this.matrix);\n }\n }, {\n key: \"getWorldTransform\",\n value: function getWorldTransform() {\n return this.matrix;\n }\n /**\n * 设置相机矩阵\n */\n\n }, {\n key: \"setMatrix\",\n value: function setMatrix(matrix) {\n this.matrix = matrix;\n\n this._update();\n\n return this;\n }\n }, {\n key: \"setAspect\",\n value: function setAspect(aspect) {\n this.setPerspective(this.near, this.far, this.fov, aspect);\n return this;\n }\n /**\n * Sets an offset in a larger frustum, used in PixelPicking\n */\n\n }, {\n key: \"setViewOffset\",\n value: function setViewOffset(fullWidth, fullHeight, x, y, width, height) {\n this.aspect = fullWidth / fullHeight;\n\n if (this.view === undefined) {\n this.view = {\n enabled: true,\n fullWidth: 1,\n fullHeight: 1,\n offsetX: 0,\n offsetY: 0,\n width: 1,\n height: 1\n };\n }\n\n this.view.enabled = true;\n this.view.fullWidth = fullWidth;\n this.view.fullHeight = fullHeight;\n this.view.offsetX = x;\n this.view.offsetY = y;\n this.view.width = width;\n this.view.height = height;\n\n if (this.projectionMode === CAMERA_PROJECTION_MODE.PERSPECTIVE) {\n this.setPerspective(this.near, this.far, this.fov, this.aspect);\n } else {\n this.setOrthographic(this.left, this.rright, this.top, this.bottom, this.near, this.far);\n }\n\n return this;\n }\n }, {\n key: \"clearViewOffset\",\n value: function clearViewOffset() {\n if (this.view !== undefined) {\n this.view.enabled = false;\n }\n\n if (this.projectionMode === CAMERA_PROJECTION_MODE.PERSPECTIVE) {\n this.setPerspective(this.near, this.far, this.fov, this.aspect);\n } else {\n this.setOrthographic(this.left, this.rright, this.top, this.bottom, this.near, this.far);\n }\n\n return this;\n }\n }, {\n key: \"setPerspective\",\n value: function setPerspective(near, far, fov, aspect) {\n this.projectionMode = CAMERA_PROJECTION_MODE.PERSPECTIVE;\n this.fov = fov;\n this.near = near;\n this.far = far;\n this.aspect = aspect;\n gl_matrix_esm[\"b\" /* mat4 */].perspective(this.perspective, this.fov * DEG_2_RAD, this.aspect, this.near, this.far);\n return this;\n }\n }, {\n key: \"setOrthographic\",\n value: function setOrthographic(l, r, t, b, near, far) {\n this.projectionMode = CAMERA_PROJECTION_MODE.ORTHOGRAPHIC;\n this.rright = r;\n this.left = l;\n this.top = t;\n this.bottom = b;\n this.near = near;\n this.far = far;\n var dx = (this.rright - this.left) / (2 * this.zoom);\n var dy = (this.top - this.bottom) / (2 * this.zoom);\n var cx = (this.rright + this.left) / 2;\n var cy = (this.top + this.bottom) / 2;\n var left = cx - dx;\n var right = cx + dx;\n var top = cy + dy;\n var bottom = cy - dy;\n\n if (this.view !== undefined && this.view.enabled) {\n var scaleW = (this.rright - this.left) / this.view.fullWidth / this.zoom;\n var scaleH = (this.top - this.bottom) / this.view.fullHeight / this.zoom;\n left += scaleW * this.view.offsetX;\n right = left + scaleW * this.view.width;\n top -= scaleH * this.view.offsetY;\n bottom = top - scaleH * this.view.height;\n }\n\n gl_matrix_esm[\"b\" /* mat4 */].ortho(this.perspective, left, right, top, bottom, near, far);\n return this;\n }\n /**\n * 设置相机位置\n */\n\n }, {\n key: \"setPosition\",\n value: function setPosition(x, y, z) {\n this._setPosition(x, y, z);\n\n this.setFocalPoint(this.focalPoint);\n return this;\n }\n /**\n * 设置视点位置\n */\n\n }, {\n key: \"setFocalPoint\",\n value: function setFocalPoint(x, y, z) {\n var up = gl_matrix_esm[\"e\" /* vec3 */].fromValues(0, 1, 0);\n this.focalPoint = createVec3(x, y, z);\n\n if (this.trackingMode === CAMERA_TRACKING_MODE.CINEMATIC) {\n var d = gl_matrix_esm[\"e\" /* vec3 */].subtract(gl_matrix_esm[\"e\" /* vec3 */].create(), this.focalPoint, this.position);\n x = d[0];\n y = d[1];\n z = d[2];\n var r = gl_matrix_esm[\"e\" /* vec3 */].length(d);\n var el = Math.asin(y / r) * RAD_2_DEG;\n var az = 90 + Math.atan2(z, x) * RAD_2_DEG;\n var m = gl_matrix_esm[\"b\" /* mat4 */].create();\n gl_matrix_esm[\"b\" /* mat4 */].rotateY(m, m, az * DEG_2_RAD);\n gl_matrix_esm[\"b\" /* mat4 */].rotateX(m, m, el * DEG_2_RAD);\n up = gl_matrix_esm[\"e\" /* vec3 */].transformMat4(gl_matrix_esm[\"e\" /* vec3 */].create(), [0, 1, 0], m);\n }\n\n gl_matrix_esm[\"b\" /* mat4 */].invert(this.matrix, gl_matrix_esm[\"b\" /* mat4 */].lookAt(gl_matrix_esm[\"b\" /* mat4 */].create(), this.position, this.focalPoint, up));\n\n this._getAxes();\n\n this._getDistance();\n\n this._getAngles();\n\n return this;\n }\n /**\n * 固定当前视点,按指定距离放置相机\n */\n\n }, {\n key: \"setDistance\",\n value: function setDistance(d) {\n if (this.distance === d || d < 0) {\n return;\n }\n\n this.distance = d;\n\n if (this.distance < 0.0002) {\n this.distance = 0.0002;\n }\n\n this.dollyingStep = this.distance / 100;\n var pos = gl_matrix_esm[\"e\" /* vec3 */].create();\n d = this.distance;\n var n = this.forward;\n var f = this.focalPoint;\n pos[0] = d * n[0] + f[0];\n pos[1] = d * n[1] + f[1];\n pos[2] = d * n[2] + f[2];\n\n this._setPosition(pos);\n\n return this;\n }\n }, {\n key: \"setMaxDistance\",\n value: function setMaxDistance(d) {\n this.maxDistance = d;\n return this;\n }\n }, {\n key: \"setMinDistance\",\n value: function setMinDistance(d) {\n this.minDistance = d;\n return this;\n }\n /**\n * Changes the initial azimuth of the camera\n */\n\n }, {\n key: \"changeAzimuth\",\n value: function changeAzimuth(az) {\n this.setAzimuth(this.azimuth + az);\n return this;\n }\n /**\n * Changes the initial elevation of the camera\n */\n\n }, {\n key: \"changeElevation\",\n value: function changeElevation(el) {\n this.setElevation(this.elevation + el);\n return this;\n }\n /**\n * Changes the initial roll of the camera\n */\n\n }, {\n key: \"changeRoll\",\n value: function changeRoll(rl) {\n this.setRoll(this.roll + rl);\n return this;\n }\n /**\n * 设置相机方位角,不同相机模式下需要重新计算相机位置或者是视点位置\n * @param {Number} el the azimuth in degrees\n */\n\n }, {\n key: \"setAzimuth\",\n value: function setAzimuth(az) {\n this.azimuth = getAngle(az);\n this.computeMatrix();\n\n this._getAxes();\n\n if (this.type === CAMERA_TYPE.ORBITING || this.type === CAMERA_TYPE.EXPLORING) {\n this._getPosition();\n } else if (this.type === CAMERA_TYPE.TRACKING) {\n this._getFocalPoint();\n }\n\n return this;\n }\n }, {\n key: \"getAzimuth\",\n value: function getAzimuth() {\n return this.azimuth;\n }\n /**\n * 设置相机方位角,不同相机模式下需要重新计算相机位置或者是视点位置\n * @param {Number} el the elevation in degrees\n */\n\n }, {\n key: \"setElevation\",\n value: function setElevation(el) {\n this.elevation = getAngle(el);\n this.computeMatrix();\n\n this._getAxes();\n\n if (this.type === CAMERA_TYPE.ORBITING || this.type === CAMERA_TYPE.EXPLORING) {\n this._getPosition();\n } else if (this.type === CAMERA_TYPE.TRACKING) {\n this._getFocalPoint();\n }\n\n return this;\n }\n /**\n * 设置相机方位角,不同相机模式下需要重新计算相机位置或者是视点位置\n * @param {Number} angle the roll angle\n */\n\n }, {\n key: \"setRoll\",\n value: function setRoll(angle) {\n this.roll = getAngle(angle);\n this.computeMatrix();\n\n this._getAxes();\n\n if (this.type === CAMERA_TYPE.ORBITING || this.type === CAMERA_TYPE.EXPLORING) {\n this._getPosition();\n } else if (this.type === CAMERA_TYPE.TRACKING) {\n this._getFocalPoint();\n }\n\n return this;\n }\n /**\n * Changes the azimuth and elevation with respect to the current camera axes\n * @param {Number} azimuth the relative azimuth\n * @param {Number} elevation the relative elevation\n * @param {Number} roll the relative roll\n */\n\n }, {\n key: \"rotate\",\n value: function rotate(azimuth, elevation, roll) {\n if (this.type === CAMERA_TYPE.EXPLORING) {\n azimuth = getAngle(azimuth);\n elevation = getAngle(elevation);\n roll = getAngle(roll);\n var rotX = gl_matrix_esm[\"c\" /* quat */].setAxisAngle(gl_matrix_esm[\"c\" /* quat */].create(), [1, 0, 0], (this.rotateWorld ? 1 : -1) * elevation * DEG_2_RAD);\n var rotY = gl_matrix_esm[\"c\" /* quat */].setAxisAngle(gl_matrix_esm[\"c\" /* quat */].create(), [0, 1, 0], (this.rotateWorld ? 1 : -1) * azimuth * DEG_2_RAD);\n var rotZ = gl_matrix_esm[\"c\" /* quat */].setAxisAngle(gl_matrix_esm[\"c\" /* quat */].create(), [0, 0, 1], roll * DEG_2_RAD);\n var rotQ = gl_matrix_esm[\"c\" /* quat */].multiply(gl_matrix_esm[\"c\" /* quat */].create(), rotY, rotX);\n rotQ = gl_matrix_esm[\"c\" /* quat */].multiply(gl_matrix_esm[\"c\" /* quat */].create(), rotQ, rotZ);\n var rotMatrix = gl_matrix_esm[\"b\" /* mat4 */].fromQuat(gl_matrix_esm[\"b\" /* mat4 */].create(), rotQ);\n gl_matrix_esm[\"b\" /* mat4 */].translate(this.matrix, this.matrix, [0, 0, -this.distance]);\n gl_matrix_esm[\"b\" /* mat4 */].multiply(this.matrix, this.matrix, rotMatrix);\n gl_matrix_esm[\"b\" /* mat4 */].translate(this.matrix, this.matrix, [0, 0, this.distance]);\n } else {\n if (Math.abs(this.elevation + elevation) > 90) {\n return;\n }\n\n this.relElevation = getAngle(elevation);\n this.relAzimuth = getAngle(azimuth);\n this.relRoll = getAngle(roll);\n this.elevation += this.relElevation;\n this.azimuth += this.relAzimuth;\n this.roll += this.relRoll;\n this.computeMatrix();\n }\n\n this._getAxes();\n\n if (this.type === CAMERA_TYPE.ORBITING || this.type === CAMERA_TYPE.EXPLORING) {\n this._getPosition();\n } else if (this.type === CAMERA_TYPE.TRACKING) {\n this._getFocalPoint();\n }\n\n this._update();\n\n return this;\n }\n /**\n * 沿水平(right) & 垂直(up)平移相机\n */\n\n }, {\n key: \"pan\",\n value: function pan(tx, ty) {\n var coords = createVec3(tx, ty, 0);\n var pos = gl_matrix_esm[\"e\" /* vec3 */].clone(this.position);\n gl_matrix_esm[\"e\" /* vec3 */].add(pos, pos, gl_matrix_esm[\"e\" /* vec3 */].scale(gl_matrix_esm[\"e\" /* vec3 */].create(), this.right, coords[0]));\n gl_matrix_esm[\"e\" /* vec3 */].add(pos, pos, gl_matrix_esm[\"e\" /* vec3 */].scale(gl_matrix_esm[\"e\" /* vec3 */].create(), this.up, coords[1]));\n\n this._setPosition(pos);\n\n return this;\n }\n /**\n * 沿 n 轴移动,当距离视点远时移动速度较快,离视点越近速度越慢\n */\n\n }, {\n key: \"dolly\",\n value: function dolly(value) {\n var n = this.forward;\n var pos = gl_matrix_esm[\"e\" /* vec3 */].clone(this.position);\n var step = value * this.dollyingStep;\n var updatedDistance = this.distance + value * this.dollyingStep; // 限制视点距离范围\n\n step = Math.max(Math.min(updatedDistance, this.maxDistance), this.minDistance) - this.distance;\n pos[0] += step * n[0];\n pos[1] += step * n[1];\n pos[2] += step * n[2];\n\n this._setPosition(pos);\n\n if (this.type === CAMERA_TYPE.ORBITING || this.type === CAMERA_TYPE.EXPLORING) {\n // 重新计算视点距离\n this._getDistance();\n } else if (this.type === CAMERA_TYPE.TRACKING) {\n // 保持视距,移动视点位置\n gl_matrix_esm[\"e\" /* vec3 */].add(this.focalPoint, pos, this.distanceVector);\n }\n\n return this;\n }\n }, {\n key: \"createLandmark\",\n value: function createLandmark(name, params) {\n var camera = this.clone();\n camera.setPosition(params.position);\n camera.setFocalPoint(params.focalPoint);\n\n if (params.roll !== undefined) {\n camera.setRoll(params.roll);\n }\n\n var landmark = new Landmark_Landmark(name, camera);\n this.landmarks.push(landmark);\n return landmark;\n }\n }, {\n key: \"setLandmark\",\n value: function setLandmark(name) {\n var landmark = new Landmark_Landmark(name, this);\n this.landmarks.push(landmark);\n return this;\n }\n }, {\n key: \"gotoLandmark\",\n value: function gotoLandmark(name) {\n var _this = this;\n\n var duration = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1000;\n var landmark = this.landmarks.find(function (l) {\n return l.name === name;\n });\n\n if (landmark) {\n if (duration === 0) {\n landmark.retrieve(this);\n return;\n }\n\n if (this.landmarkAnimationID !== undefined) {\n window.cancelAnimationFrame(this.landmarkAnimationID);\n } // TODO: do not process events during animation\n\n\n this.interactor.disconnect();\n var destPosition = landmark.getPosition();\n var destFocalPoint = landmark.getFocalPoint();\n var destRoll = landmark.getRoll();\n var timeStart;\n\n var animate = function animate(timestamp) {\n if (timeStart === undefined) {\n timeStart = timestamp;\n }\n\n var elapsed = timestamp - timeStart; // TODO: use better ease function\n\n var t = (1 - Math.cos(elapsed / duration * Math.PI)) / 2;\n var interFocalPoint = gl_matrix_esm[\"e\" /* vec3 */].create();\n var interPosition = gl_matrix_esm[\"e\" /* vec3 */].create();\n var interRoll = 0;\n gl_matrix_esm[\"e\" /* vec3 */].lerp(interFocalPoint, _this.focalPoint, destFocalPoint, t);\n gl_matrix_esm[\"e\" /* vec3 */].lerp(interPosition, _this.position, destPosition, t);\n interRoll = _this.roll * (1 - t) + destRoll * t;\n\n _this.setFocalPoint(interFocalPoint);\n\n _this.setPosition(interPosition);\n\n _this.setRoll(interRoll);\n\n _this.computeMatrix();\n\n var dist = gl_matrix_esm[\"e\" /* vec3 */].dist(interFocalPoint, destFocalPoint) + gl_matrix_esm[\"e\" /* vec3 */].dist(interPosition, destPosition);\n\n if (dist > 0.01) {//\n } else {\n _this.setFocalPoint(interFocalPoint);\n\n _this.setPosition(interPosition);\n\n _this.setRoll(interRoll);\n\n _this.computeMatrix();\n\n _this.interactor.connect();\n\n return;\n }\n\n if (elapsed < duration) {\n _this.landmarkAnimationID = window.requestAnimationFrame(animate);\n }\n };\n\n window.requestAnimationFrame(animate);\n }\n }\n /**\n * 根据相机矩阵重新计算各种相机参数\n */\n\n }, {\n key: \"_update\",\n value: function _update() {\n this._getAxes();\n\n this._getPosition();\n\n this._getDistance();\n\n this._getAngles();\n }\n /**\n * 计算相机矩阵\n */\n\n }, {\n key: \"computeMatrix\",\n value: function computeMatrix() {\n var rotX;\n var rotY; // 使用四元数描述 3D 旋转\n // @see https://xiaoiver.github.io/coding/2018/12/28/Camera-%E8%AE%BE%E8%AE%A1-%E4%B8%80.html\n\n var rotZ = gl_matrix_esm[\"c\" /* quat */].setAxisAngle(gl_matrix_esm[\"c\" /* quat */].create(), [0, 0, 1], this.roll * DEG_2_RAD);\n gl_matrix_esm[\"b\" /* mat4 */].identity(this.matrix); // only consider HCS for EXPLORING and ORBITING cameras\n\n rotX = gl_matrix_esm[\"c\" /* quat */].setAxisAngle(gl_matrix_esm[\"c\" /* quat */].create(), [1, 0, 0], (this.rotateWorld && this.type !== CAMERA_TYPE.TRACKING || this.type === CAMERA_TYPE.TRACKING ? 1 : -1) * this.elevation * DEG_2_RAD);\n rotY = gl_matrix_esm[\"c\" /* quat */].setAxisAngle(gl_matrix_esm[\"c\" /* quat */].create(), [0, 1, 0], (this.rotateWorld && this.type !== CAMERA_TYPE.TRACKING || this.type === CAMERA_TYPE.TRACKING ? 1 : -1) * this.azimuth * DEG_2_RAD);\n var rotQ = gl_matrix_esm[\"c\" /* quat */].multiply(gl_matrix_esm[\"c\" /* quat */].create(), rotY, rotX);\n rotQ = gl_matrix_esm[\"c\" /* quat */].multiply(gl_matrix_esm[\"c\" /* quat */].create(), rotQ, rotZ);\n var rotMatrix = gl_matrix_esm[\"b\" /* mat4 */].fromQuat(gl_matrix_esm[\"b\" /* mat4 */].create(), rotQ);\n\n if (this.type === CAMERA_TYPE.ORBITING || this.type === CAMERA_TYPE.EXPLORING) {\n gl_matrix_esm[\"b\" /* mat4 */].translate(this.matrix, this.matrix, this.focalPoint);\n gl_matrix_esm[\"b\" /* mat4 */].multiply(this.matrix, this.matrix, rotMatrix);\n gl_matrix_esm[\"b\" /* mat4 */].translate(this.matrix, this.matrix, [0, 0, this.distance]);\n } else if (this.type === CAMERA_TYPE.TRACKING) {\n gl_matrix_esm[\"b\" /* mat4 */].translate(this.matrix, this.matrix, this.position);\n gl_matrix_esm[\"b\" /* mat4 */].multiply(this.matrix, this.matrix, rotMatrix);\n }\n }\n /**\n * Sets the camera position in the camera matrix\n */\n\n }, {\n key: \"_setPosition\",\n value: function _setPosition(x, y, z) {\n this.position = createVec3(x, y, z);\n var m = this.matrix;\n m[12] = this.position[0];\n m[13] = this.position[1];\n m[14] = this.position[2];\n m[15] = 1;\n }\n /**\n * Recalculates axes based on the current matrix\n */\n\n }, {\n key: \"_getAxes\",\n value: function _getAxes() {\n gl_matrix_esm[\"e\" /* vec3 */].copy(this.right, createVec3(gl_matrix_esm[\"f\" /* vec4 */].transformMat4(gl_matrix_esm[\"f\" /* vec4 */].create(), [1, 0, 0, 0], this.matrix)));\n gl_matrix_esm[\"e\" /* vec3 */].copy(this.up, createVec3(gl_matrix_esm[\"f\" /* vec4 */].transformMat4(gl_matrix_esm[\"f\" /* vec4 */].create(), [0, 1, 0, 0], this.matrix)));\n gl_matrix_esm[\"e\" /* vec3 */].copy(this.forward, createVec3(gl_matrix_esm[\"f\" /* vec4 */].transformMat4(gl_matrix_esm[\"f\" /* vec4 */].create(), [0, 0, 1, 0], this.matrix)));\n gl_matrix_esm[\"e\" /* vec3 */].normalize(this.right, this.right);\n gl_matrix_esm[\"e\" /* vec3 */].normalize(this.up, this.up);\n gl_matrix_esm[\"e\" /* vec3 */].normalize(this.forward, this.forward);\n }\n /**\n * Recalculates euler angles based on the current state\n */\n\n }, {\n key: \"_getAngles\",\n value: function _getAngles() {\n // Recalculates angles\n var x = this.distanceVector[0];\n var y = this.distanceVector[1];\n var z = this.distanceVector[2];\n var r = gl_matrix_esm[\"e\" /* vec3 */].length(this.distanceVector); // FAST FAIL: If there is no distance we cannot compute angles\n\n if (r === 0) {\n this.elevation = 0;\n this.azimuth = 0;\n return;\n }\n\n if (this.type === CAMERA_TYPE.TRACKING) {\n this.elevation = Math.asin(y / r) * RAD_2_DEG;\n this.azimuth = Math.atan2(-x, -z) * RAD_2_DEG;\n } else {\n if (this.rotateWorld) {\n this.elevation = Math.asin(y / r) * RAD_2_DEG;\n this.azimuth = Math.atan2(-x, -z) * RAD_2_DEG;\n } else {\n this.elevation = -Math.asin(y / r) * RAD_2_DEG;\n this.azimuth = -Math.atan2(-x, -z) * RAD_2_DEG;\n }\n }\n }\n /**\n * 重新计算相机位置,只有 ORBITING 模式相机位置才会发生变化\n */\n\n }, {\n key: \"_getPosition\",\n value: function _getPosition() {\n gl_matrix_esm[\"e\" /* vec3 */].copy(this.position, createVec3(gl_matrix_esm[\"f\" /* vec4 */].transformMat4(gl_matrix_esm[\"f\" /* vec4 */].create(), [0, 0, 0, 1], this.matrix))); // 相机位置变化,需要重新计算视距\n\n this._getDistance();\n }\n /**\n * 重新计算视点,只有 TRACKING 模式视点才会发生变化\n */\n\n }, {\n key: \"_getFocalPoint\",\n value: function _getFocalPoint() {\n gl_matrix_esm[\"e\" /* vec3 */].transformMat3(this.distanceVector, [0, 0, -this.distance], gl_matrix_esm[\"a\" /* mat3 */].fromMat4(gl_matrix_esm[\"a\" /* mat3 */].create(), this.matrix));\n gl_matrix_esm[\"e\" /* vec3 */].add(this.focalPoint, this.position, this.distanceVector); // 视点变化,需要重新计算视距\n\n this._getDistance();\n }\n /**\n * 重新计算视距\n */\n\n }, {\n key: \"_getDistance\",\n value: function _getDistance() {\n this.distanceVector = gl_matrix_esm[\"e\" /* vec3 */].subtract(gl_matrix_esm[\"e\" /* vec3 */].create(), this.focalPoint, this.position);\n this.distance = gl_matrix_esm[\"e\" /* vec3 */].length(this.distanceVector);\n this.dollyingStep = this.distance / 100;\n }\n }]);\n\n return Camera;\n}(), _class3.ProjectionMode = {\n ORTHOGRAPHIC: 'ORTHOGRAPHIC',\n PERSPECTIVE: 'PERSPECTIVE'\n}, _temp), (_descriptor = applyDecoratedDescriptor_default()(_class2.prototype, \"interactor\", [_dec2], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n})), _class2)) || _class);\n//# sourceMappingURL=Camera.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-webgpu/es/geometry/index.js\n\n\n\n\n\n\nvar geometry_dec, geometry_dec2, geometry_class, geometry_class2, geometry_descriptor, geometry_class3, geometry_temp;\n\n\n\nvar geometry_Geometry = (geometry_dec = Object(inversify[\"injectable\"])(), geometry_dec2 = Object(inversify[\"inject\"])(g_webgpu_core_es[\"IDENTIFIER\"].GeometryComponentManager), geometry_dec(geometry_class = (geometry_class2 = (geometry_temp = geometry_class3 = /*#__PURE__*/function () {\n function Geometry() {\n classCallCheck_default()(this, Geometry);\n\n this.config = void 0;\n\n initializerDefineProperty_default()(this, \"geometry\", geometry_descriptor, this);\n\n this.entity = void 0;\n this.component = void 0;\n }\n\n createClass_default()(Geometry, [{\n key: \"getEntity\",\n value: function getEntity() {\n return this.entity;\n }\n }, {\n key: \"getComponent\",\n value: function getComponent() {\n return this.component;\n }\n }, {\n key: \"setConfig\",\n value: function setConfig(config) {\n this.config = config;\n }\n }, {\n key: \"setEntity\",\n value: function setEntity(entity) {\n this.entity = entity;\n this.component = this.geometry.create(entity);\n this.component.entity = entity;\n this.onEntityCreated();\n }\n }, {\n key: \"onEntityCreated\",\n value: function onEntityCreated() {//\n }\n }]);\n\n return Geometry;\n}(), geometry_class3.BOX = 'box', geometry_class3.SPHERE = 'sphere', geometry_class3.PLANE = 'plane', geometry_class3.MERGED = 'merged', geometry_temp), (geometry_descriptor = applyDecoratedDescriptor_default()(geometry_class2.prototype, \"geometry\", [geometry_dec2], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n})), geometry_class2)) || geometry_class);\n//# sourceMappingURL=index.js.map\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/regenerator/index.js\nvar regenerator = __webpack_require__(9);\nvar regenerator_default = /*#__PURE__*/__webpack_require__.n(regenerator);\n\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/asyncToGenerator.js\nvar asyncToGenerator = __webpack_require__(15);\nvar asyncToGenerator_default = /*#__PURE__*/__webpack_require__.n(asyncToGenerator);\n\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/defineProperty.js\nvar defineProperty = __webpack_require__(4);\nvar defineProperty_default = /*#__PURE__*/__webpack_require__.n(defineProperty);\n\n// EXTERNAL MODULE: ./node_modules/@webgpu/types/dist/constants.js\nvar constants = __webpack_require__(8);\n\n// CONCATENATED MODULE: ./node_modules/@antv/g-webgpu/es/utils/canvas.js\nfunction createCanvas() {\n if (typeof document !== 'undefined') {\n return document.createElement('canvas');\n } else {\n throw new Error('Cannot create a canvas in this context');\n }\n}\n//# sourceMappingURL=canvas.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-webgpu/es/utils/is-type.js\nvar is_type_toString = {}.toString;\n\nvar isType = function isType(value, type) {\n return is_type_toString.call(value) === '[object ' + type + ']';\n};\n\n/* harmony default export */ var is_type = (isType);\n//# sourceMappingURL=is-type.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-webgpu/es/utils/is-array.js\n\n/* harmony default export */ var is_array = (function (value) {\n return Array.isArray ? Array.isArray(value) : is_type(value, 'Array');\n});\n//# sourceMappingURL=is-array.js.map\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/typeof.js\nvar helpers_typeof = __webpack_require__(41);\nvar typeof_default = /*#__PURE__*/__webpack_require__.n(helpers_typeof);\n\n// CONCATENATED MODULE: ./node_modules/@antv/g-webgpu/es/utils/is-typedarray.js\n\n\n/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n/** `Object#toString` result references. */\n\nvar argsTag = '[object Arguments]';\nvar arrayTag = '[object Array]';\nvar boolTag = '[object Boolean]';\nvar dateTag = '[object Date]';\nvar errorTag = '[object Error]';\nvar funcTag = '[object Function]';\nvar mapTag = '[object Map]';\nvar numberTag = '[object Number]';\nvar objectTag = '[object Object]';\nvar regexpTag = '[object RegExp]';\nvar setTag = '[object Set]';\nvar stringTag = '[object String]';\nvar weakMapTag = '[object WeakMap]';\nvar arrayBufferTag = '[object ArrayBuffer]';\nvar dataViewTag = '[object DataView]';\nvar float32Tag = '[object Float32Array]';\nvar float64Tag = '[object Float64Array]';\nvar int8Tag = '[object Int8Array]';\nvar int16Tag = '[object Int16Array]';\nvar int32Tag = '[object Int32Array]';\nvar uint8Tag = '[object Uint8Array]';\nvar uint8ClampedTag = '[object Uint8ClampedArray]';\nvar uint16Tag = '[object Uint16Array]';\nvar uint32Tag = '[object Uint32Array]';\n/** Used to identify `toStringTag` values of typed arrays. */\n\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] = typedArrayTags[int8Tag] = typedArrayTags[int16Tag] = typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] = typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] = typedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] = typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] = typedArrayTags[dataViewTag] = typedArrayTags[dateTag] = typedArrayTags[errorTag] = typedArrayTags[funcTag] = typedArrayTags[mapTag] = typedArrayTags[numberTag] = typedArrayTags[objectTag] = typedArrayTags[regexpTag] = typedArrayTags[setTag] = typedArrayTags[stringTag] = typedArrayTags[weakMapTag] = false;\n/**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\n\nfunction baseUnary(func) {\n return function (value) {\n return func(value);\n };\n}\n/** Used for built-in method references. */\n\n\nvar objectProto = Object.prototype;\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\n\nvar objectToString = objectProto.toString;\n/**\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n */\n\nfunction baseIsTypedArray(value) {\n return isObjectLike(value) && isLength(value.length) && !!typedArrayTags[objectToString.call(value)];\n}\n\nfunction isLength(value) {\n return typeof value === 'number' && value > -1 && value % 1 === 0 && value <= MAX_SAFE_INTEGER;\n}\n\nfunction isObjectLike(value) {\n return !!value && typeof_default()(value) === 'object';\n}\n/**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\n\n\nvar isTypedArray = baseIsTypedArray;\n//# sourceMappingURL=is-typedarray.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-webgpu/es/Kernel.js\n\n\n\n\n\n\n\n\n\nvar Kernel_dec, Kernel_dec2, _dec3, Kernel_class, Kernel_class2, Kernel_descriptor, _descriptor2, Kernel_temp;\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { defineProperty_default()(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\n // tslint:disable-next-line:no-submodule-imports\n\n\n\n\n\n\n\nvar Kernel_Kernel = (Kernel_dec = Object(inversify[\"injectable\"])(), Kernel_dec2 = Object(inversify[\"inject\"])(g_webgpu_core_es[\"IDENTIFIER\"].RenderEngine), _dec3 = Object(inversify[\"inject\"])(g_webgpu_core_es[\"IDENTIFIER\"].ConfigService), Kernel_dec(Kernel_class = (Kernel_class2 = (Kernel_temp = /*#__PURE__*/function () {\n function Kernel() {\n classCallCheck_default()(this, Kernel);\n\n initializerDefineProperty_default()(this, \"engine\", Kernel_descriptor, this);\n\n initializerDefineProperty_default()(this, \"configService\", _descriptor2, this);\n\n this.entity = Object(g_webgpu_core_es[\"createEntity\"])();\n this.model = void 0;\n this.dirty = true;\n this.compiledBundle = void 0;\n this.initPromise = void 0;\n }\n\n createClass_default()(Kernel, [{\n key: \"init\",\n value: function init() {\n var _this$configService$g = this.configService.get(),\n canvas = _this$configService$g.canvas,\n engineOptions = _this$configService$g.engineOptions;\n\n this.initPromise = this.engine.init(_objectSpread({\n canvas: canvas || createCanvas(),\n swapChainFormat: constants[\"TextureFormat\"].BGRA8Unorm,\n antialiasing: false\n }, engineOptions));\n }\n }, {\n key: \"setBundle\",\n value: function setBundle(bundle) {\n // deep clone\n this.compiledBundle = JSON.parse(JSON.stringify(bundle));\n }\n }, {\n key: \"setDispatch\",\n value: function setDispatch(dispatch) {\n if (this.compiledBundle.context) {\n this.compiledBundle.context.dispatch = dispatch;\n }\n\n return this;\n }\n }, {\n key: \"setMaxIteration\",\n value: function setMaxIteration(maxIteration) {\n if (this.compiledBundle.context) {\n this.compiledBundle.context.maxIteration = maxIteration;\n }\n\n return this;\n }\n }, {\n key: \"setBinding\",\n value: function setBinding(name, data) {\n var _this = this;\n\n if (typeof name === 'string') {\n var isNumberLikeData = is_number_isNumber(data) || isTypedArray(data) || is_array(data);\n\n if (this.compiledBundle && this.compiledBundle.context) {\n // set define, eg. setBinding('MAX_LENGTH', 10)\n var existedDefine = this.compiledBundle.context.defines.find(function (b) {\n return b.name === name;\n });\n\n if (existedDefine) {\n existedDefine.value = data;\n return this;\n } // set uniform\n\n\n var existedBinding = this.compiledBundle.context.uniforms.find(function (b) {\n return b.name === name;\n });\n\n if (existedBinding) {\n // update uniform or buffer\n if (isNumberLikeData) {\n // @ts-ignore\n existedBinding.data = data;\n existedBinding.isReferer = false;\n\n if (existedBinding.storageClass === g_webgpu_core_es[\"STORAGE_CLASS\"].Uniform) {\n if (this.model) {\n // @ts-ignore\n this.model.updateUniform(name, data);\n }\n } else {\n if (this.model) {\n // @ts-ignore\n this.model.updateBuffer(name, data);\n }\n }\n } else {\n // update with another kernel\n existedBinding.isReferer = true; // @ts-ignore\n\n existedBinding.data = data;\n }\n }\n }\n } else {\n Object.keys(name).forEach(function (key) {\n _this.setBinding(key, name[key]);\n });\n }\n\n return this;\n }\n }, {\n key: \"execute\",\n value: function () {\n var _execute = asyncToGenerator_default()( /*#__PURE__*/regenerator_default.a.mark(function _callee() {\n var _this2 = this;\n\n var iteration,\n i,\n _args = arguments;\n return regenerator_default.a.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n iteration = _args.length > 0 && _args[0] !== undefined ? _args[0] : 1;\n\n if (!this.dirty) {\n _context.next = 6;\n break;\n }\n\n if (this.compiledBundle.context) {\n if (iteration > 1) {\n this.compiledBundle.context.maxIteration = iteration;\n } else {\n this.compiledBundle.context.maxIteration++;\n }\n }\n\n _context.next = 5;\n return this.compile();\n\n case 5:\n this.dirty = false;\n\n case 6:\n this.engine.beginFrame(); // 首先开启当前 frame 的 compute pass\n\n this.engine.clear({});\n\n if (this.compiledBundle.context) {\n this.compiledBundle.context.uniforms.filter(function (_ref) {\n var isReferer = _ref.isReferer;\n return isReferer;\n }).forEach(function (_ref2) {\n var data = _ref2.data,\n name = _ref2.name;\n\n // @ts-ignore\n _this2.model.confirmInput(data.model, name);\n });\n }\n\n for (i = 0; i < iteration; i++) {\n this.model.run();\n }\n\n this.engine.endFrame();\n return _context.abrupt(\"return\", this);\n\n case 12:\n case \"end\":\n return _context.stop();\n }\n }\n }, _callee, this);\n }));\n\n function execute() {\n return _execute.apply(this, arguments);\n }\n\n return execute;\n }()\n /**\n * read output from GPUBuffer\n */\n\n }, {\n key: \"getOutput\",\n value: function () {\n var _getOutput = asyncToGenerator_default()( /*#__PURE__*/regenerator_default.a.mark(function _callee2() {\n return regenerator_default.a.wrap(function _callee2$(_context2) {\n while (1) {\n switch (_context2.prev = _context2.next) {\n case 0:\n return _context2.abrupt(\"return\", this.model.readData());\n\n case 1:\n case \"end\":\n return _context2.stop();\n }\n }\n }, _callee2, this);\n }));\n\n function getOutput() {\n return _getOutput.apply(this, arguments);\n }\n\n return getOutput;\n }()\n }, {\n key: \"compile\",\n value: function () {\n var _compile = asyncToGenerator_default()( /*#__PURE__*/regenerator_default.a.mark(function _callee3() {\n var context, target, shader;\n return regenerator_default.a.wrap(function _callee3$(_context3) {\n while (1) {\n switch (_context3.prev = _context3.next) {\n case 0:\n _context3.next = 2;\n return this.initPromise;\n\n case 2:\n context = _objectSpread({}, this.compiledBundle.context);\n target = this.engine.supportWebGPU ? this.engine.useWGSL ? g_webgpu_core_es[\"Target\"].WGSL : g_webgpu_core_es[\"Target\"].GLSL450 : g_webgpu_core_es[\"Target\"].GLSL100;\n shader = this.compiledBundle.shaders[target]; // this.bindings?.forEach(({ name, data }) => {\n // if (name === name.toUpperCase()) {\n // const define = context.defines.find((d) => d.name === name);\n // if (define) {\n // // @ts-ignore\n // define.value = data;\n // }\n // }\n // });\n // 生成运行时 define\n\n context.defines.filter(function (define) {\n return define.runtime;\n }).forEach(function (define) {\n var valuePlaceHolder = \"\".concat(g_webgpu_core_es[\"DefineValuePlaceholder\"]).concat(define.name);\n shader = shader.replace(valuePlaceHolder, \"\".concat(define.value));\n });\n context.shader = shader; // 添加 uniform 绑定的数据\n\n context.uniforms.forEach(function (uniform) {\n // const binding = this.bindings.find((b) => b.name === uniform.name);\n // if (binding) {\n // // @ts-ignore\n // uniform.data = binding.referer || binding.data;\n // // @ts-ignore\n // uniform.isReferer = !!binding.referer;\n // }\n // 未指定数据,尝试根据 uniform 类型初始化\n if (!uniform.data) {\n if (uniform.storageClass === g_webgpu_core_es[\"STORAGE_CLASS\"].StorageBuffer) {\n var sizePerElement = 1;\n\n if (uniform.type === g_webgpu_core_es[\"AST_TOKEN_TYPES\"].FloatArray) {\n sizePerElement = 1;\n } else if (uniform.type === g_webgpu_core_es[\"AST_TOKEN_TYPES\"].Vector4FloatArray) {\n sizePerElement = 4;\n }\n\n uniform.data = new Float32Array(context.output.length * sizePerElement).fill(0);\n }\n }\n }); // } else if (uniform.type === 'image2D') {\n // // @ts-ignore\n // buffer.data = new Uint8ClampedArray(context.output.length!).fill(0);\n // }\n\n this.compiledBundle.context = context;\n _context3.next = 11;\n return this.engine.createComputeModel(this.compiledBundle.context);\n\n case 11:\n this.model = _context3.sent;\n\n case 12:\n case \"end\":\n return _context3.stop();\n }\n }\n }, _callee3, this);\n }));\n\n function compile() {\n return _compile.apply(this, arguments);\n }\n\n return compile;\n }()\n }]);\n\n return Kernel;\n}(), Kernel_temp), (Kernel_descriptor = applyDecoratedDescriptor_default()(Kernel_class2.prototype, \"engine\", [Kernel_dec2], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n}), _descriptor2 = applyDecoratedDescriptor_default()(Kernel_class2.prototype, \"configService\", [_dec3], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n})), Kernel_class2)) || Kernel_class);\n//# sourceMappingURL=Kernel.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-webgpu/es/material/index.js\n\n\n\n\n\n\nvar material_dec, material_dec2, material_class, material_class2, material_descriptor, material_class3, material_temp;\n\n\n\nvar material_Material = (material_dec = Object(inversify[\"injectable\"])(), material_dec2 = Object(inversify[\"inject\"])(g_webgpu_core_es[\"IDENTIFIER\"].MaterialComponentManager), material_dec(material_class = (material_class2 = (material_temp = material_class3 = /*#__PURE__*/function () {\n function Material() {\n classCallCheck_default()(this, Material);\n\n this.config = void 0;\n\n initializerDefineProperty_default()(this, \"material\", material_descriptor, this);\n\n this.entity = void 0;\n this.component = void 0;\n }\n\n createClass_default()(Material, [{\n key: \"getEntity\",\n value: function getEntity() {\n return this.entity;\n }\n }, {\n key: \"getComponent\",\n value: function getComponent() {\n return this.component;\n }\n }, {\n key: \"setConfig\",\n value: function setConfig(config) {\n this.config = config;\n }\n }, {\n key: \"setEntity\",\n value: function setEntity(entity, type) {\n this.entity = entity;\n this.component = this.material.create(entity);\n this.component.entity = entity;\n this.component.type = type;\n this.onEntityCreated();\n }\n }, {\n key: \"onEntityCreated\",\n value: function onEntityCreated() {//\n }\n }]);\n\n return Material;\n}(), material_class3.BASIC = 'basic', material_temp), (material_descriptor = applyDecoratedDescriptor_default()(material_class2.prototype, \"material\", [material_dec2], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n})), material_class2)) || material_class);\n//# sourceMappingURL=index.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-webgpu/es/renderable/Renderable.js\n\n\n\n\n\n\nvar Renderable_dec, Renderable_dec2, Renderable_dec3, _dec4, _dec5, _dec6, Renderable_class, Renderable_class2, Renderable_descriptor, Renderable_descriptor2, _descriptor3, _descriptor4, Renderable_class3, Renderable_temp;\n\n\n\nvar Renderable_Renderable = (Renderable_dec = Object(inversify[\"injectable\"])(), Renderable_dec2 = Object(inversify[\"inject\"])(g_webgpu_core_es[\"IDENTIFIER\"].MeshComponentManager), Renderable_dec3 = Object(inversify[\"inject\"])(g_webgpu_core_es[\"IDENTIFIER\"].CullableComponentManager), _dec4 = Object(inversify[\"inject\"])(g_webgpu_core_es[\"IDENTIFIER\"].TransformComponentManager), _dec5 = Object(inversify[\"inject\"])(g_webgpu_core_es[\"IDENTIFIER\"].Systems), _dec6 = Object(inversify[\"named\"])(g_webgpu_core_es[\"IDENTIFIER\"].SceneGraphSystem), Renderable_dec(Renderable_class = (Renderable_class2 = (Renderable_temp = Renderable_class3 = /*#__PURE__*/function () {\n function Renderable() {\n classCallCheck_default()(this, Renderable);\n\n this.attributes = {};\n this.config = void 0;\n\n initializerDefineProperty_default()(this, \"mesh\", Renderable_descriptor, this);\n\n initializerDefineProperty_default()(this, \"cullable\", Renderable_descriptor2, this);\n\n initializerDefineProperty_default()(this, \"transform\", _descriptor3, this);\n\n initializerDefineProperty_default()(this, \"sceneGraphSystem\", _descriptor4, this);\n\n this.meshComponent = void 0;\n this.transformComponent = void 0;\n this.entity = void 0;\n }\n\n createClass_default()(Renderable, [{\n key: \"getEntity\",\n value: function getEntity() {\n return this.entity;\n }\n }, {\n key: \"getTransformComponent\",\n value: function getTransformComponent() {\n return this.transformComponent;\n }\n }, {\n key: \"getMeshComponent\",\n value: function getMeshComponent() {\n return this.meshComponent;\n }\n }, {\n key: \"setConfig\",\n value: function setConfig(config) {\n this.config = config;\n }\n }, {\n key: \"setEntity\",\n value: function setEntity(entity) {\n this.entity = entity;\n this.cullable.create(entity);\n this.meshComponent = this.mesh.create(entity);\n this.transformComponent = this.transform.create(entity);\n this.onEntityCreated();\n }\n }, {\n key: \"setMaterial\",\n value: function setMaterial(material) {\n this.meshComponent.material = material;\n return this;\n }\n }, {\n key: \"setGeometry\",\n value: function setGeometry(geometry) {\n this.meshComponent.geometry = geometry;\n return this;\n }\n }, {\n key: \"setAttributes\",\n value: function setAttributes(attributes) {\n var _this = this;\n\n Object.keys(attributes).forEach(function (name) {\n if (attributes[name] !== undefined && attributes[name] !== _this.attributes[name]) {\n _this.onAttributeChanged({\n name: name,\n data: attributes[name]\n });\n\n _this.attributes[name] = attributes[name];\n }\n });\n }\n }, {\n key: \"setVisible\",\n value: function setVisible(visible) {\n var _this2 = this;\n\n this.meshComponent.visible = visible;\n this.meshComponent.children.forEach(function (childEntity) {\n var child = _this2.mesh.getComponentByEntity(childEntity);\n\n if (child) {\n child.visible = visible;\n }\n });\n return this;\n }\n }, {\n key: \"isVisible\",\n value: function isVisible() {\n return this.meshComponent.visible;\n }\n }, {\n key: \"attach\",\n value: function attach(parentRenderable) {\n this.sceneGraphSystem.attach(this.entity, parentRenderable.entity);\n return this;\n }\n }, {\n key: \"detach\",\n value: function detach() {\n this.sceneGraphSystem.detach(this.entity);\n return this;\n }\n }, {\n key: \"detachChildren\",\n value: function detachChildren() {\n this.sceneGraphSystem.detachChildren(this.entity);\n return this;\n }\n }, {\n key: \"onEntityCreated\",\n value: function onEntityCreated() {//\n }\n }, {\n key: \"onAttributeChanged\",\n value: function onAttributeChanged(_ref) {\n var name = _ref.name,\n data = _ref.data;\n\n if (this.meshComponent && this.meshComponent.material) {\n this.meshComponent.material.setUniform(this.convertAttributeName2UniformName(name), data);\n }\n }\n }, {\n key: \"convertAttributeName2UniformName\",\n value: function convertAttributeName2UniformName(attributeName) {\n return attributeName;\n }\n }]);\n\n return Renderable;\n}(), Renderable_class3.POINT = 'point', Renderable_class3.LINE = 'line', Renderable_class3.GRID = 'grid', Renderable_temp), (Renderable_descriptor = applyDecoratedDescriptor_default()(Renderable_class2.prototype, \"mesh\", [Renderable_dec2], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n}), Renderable_descriptor2 = applyDecoratedDescriptor_default()(Renderable_class2.prototype, \"cullable\", [Renderable_dec3], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n}), _descriptor3 = applyDecoratedDescriptor_default()(Renderable_class2.prototype, \"transform\", [_dec4], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n}), _descriptor4 = applyDecoratedDescriptor_default()(Renderable_class2.prototype, \"sceneGraphSystem\", [_dec5, _dec6], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n})), Renderable_class2)) || Renderable_class);\n//# sourceMappingURL=Renderable.js.map\n// EXTERNAL MODULE: ./node_modules/regl/dist/regl.js\nvar regl = __webpack_require__(283);\nvar regl_default = /*#__PURE__*/__webpack_require__.n(regl);\n\n// CONCATENATED MODULE: ./node_modules/@antv/g-webgpu-engine/es/webgl/ReglAttribute.js\n\n\n\n/**\n * @see https://github.com/regl-project/regl/blob/gh-pages/API.md#attributes\n */\nvar ReglAttribute_ReglAttribute = /*#__PURE__*/function () {\n function ReglAttribute(gl, options) {\n classCallCheck_default()(this, ReglAttribute);\n\n this.attribute = void 0;\n this.buffer = void 0;\n var buffer = options.buffer,\n offset = options.offset,\n stride = options.stride,\n normalized = options.normalized,\n size = options.size,\n divisor = options.divisor;\n this.buffer = buffer;\n this.attribute = {\n buffer: buffer.get(),\n offset: offset || 0,\n stride: stride || 0,\n normalized: normalized || false,\n divisor: divisor || 0\n };\n\n if (size) {\n this.attribute.size = size;\n }\n }\n\n createClass_default()(ReglAttribute, [{\n key: \"get\",\n value: function get() {\n return this.attribute;\n }\n }, {\n key: \"updateBuffer\",\n value: function updateBuffer(options) {\n this.buffer.subData(options);\n }\n }, {\n key: \"destroy\",\n value: function destroy() {\n this.buffer.destroy();\n }\n }]);\n\n return ReglAttribute;\n}();\n\n\n//# sourceMappingURL=ReglAttribute.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-webgpu-engine/es/webgl/constants.js\n\n\nvar _primitiveMap, _usageMap, _dataTypeMap, _formatMap, _mipmapMap, _filterMap, _wrapModeMap, _colorSpaceMap, _depthFuncMap, _blendEquationMap, _blendFuncMap, _stencilFuncMap, _stencilOpMap, _cullFaceMap;\n\n/**\n * @desc 由于 regl 使用大量字符串而非 WebGL 常量,因此需要映射\n */\n\n// @see https://github.com/regl-project/regl/blob/gh-pages/lib/constants/primitives.json\nvar primitiveMap = (_primitiveMap = {}, defineProperty_default()(_primitiveMap, g_webgpu_core_es[\"gl\"].POINTS, 'points'), defineProperty_default()(_primitiveMap, g_webgpu_core_es[\"gl\"].LINES, 'lines'), defineProperty_default()(_primitiveMap, g_webgpu_core_es[\"gl\"].LINE_LOOP, 'line loop'), defineProperty_default()(_primitiveMap, g_webgpu_core_es[\"gl\"].LINE_STRIP, 'line strip'), defineProperty_default()(_primitiveMap, g_webgpu_core_es[\"gl\"].TRIANGLES, 'triangles'), defineProperty_default()(_primitiveMap, g_webgpu_core_es[\"gl\"].TRIANGLE_FAN, 'triangle fan'), defineProperty_default()(_primitiveMap, g_webgpu_core_es[\"gl\"].TRIANGLE_STRIP, 'triangle strip'), _primitiveMap);\nvar usageMap = (_usageMap = {}, defineProperty_default()(_usageMap, g_webgpu_core_es[\"gl\"].STATIC_DRAW, 'static'), defineProperty_default()(_usageMap, g_webgpu_core_es[\"gl\"].DYNAMIC_DRAW, 'dynamic'), defineProperty_default()(_usageMap, g_webgpu_core_es[\"gl\"].STREAM_DRAW, 'stream'), _usageMap);\nvar dataTypeMap = (_dataTypeMap = {}, defineProperty_default()(_dataTypeMap, g_webgpu_core_es[\"gl\"].BYTE, 'int8'), defineProperty_default()(_dataTypeMap, g_webgpu_core_es[\"gl\"].UNSIGNED_INT, 'int16'), defineProperty_default()(_dataTypeMap, g_webgpu_core_es[\"gl\"].INT, 'int32'), defineProperty_default()(_dataTypeMap, g_webgpu_core_es[\"gl\"].UNSIGNED_BYTE, 'uint8'), defineProperty_default()(_dataTypeMap, g_webgpu_core_es[\"gl\"].UNSIGNED_SHORT, 'uint16'), defineProperty_default()(_dataTypeMap, g_webgpu_core_es[\"gl\"].UNSIGNED_INT, 'uint32'), defineProperty_default()(_dataTypeMap, g_webgpu_core_es[\"gl\"].FLOAT, 'float'), _dataTypeMap);\nvar formatMap = (_formatMap = {}, defineProperty_default()(_formatMap, g_webgpu_core_es[\"gl\"].ALPHA, 'alpha'), defineProperty_default()(_formatMap, g_webgpu_core_es[\"gl\"].LUMINANCE, 'luminance'), defineProperty_default()(_formatMap, g_webgpu_core_es[\"gl\"].LUMINANCE_ALPHA, 'luminance alpha'), defineProperty_default()(_formatMap, g_webgpu_core_es[\"gl\"].RGB, 'rgb'), defineProperty_default()(_formatMap, g_webgpu_core_es[\"gl\"].RGBA, 'rgba'), defineProperty_default()(_formatMap, g_webgpu_core_es[\"gl\"].RGBA4, 'rgba4'), defineProperty_default()(_formatMap, g_webgpu_core_es[\"gl\"].RGB5_A1, 'rgb5 a1'), defineProperty_default()(_formatMap, g_webgpu_core_es[\"gl\"].RGB565, 'rgb565'), defineProperty_default()(_formatMap, g_webgpu_core_es[\"gl\"].DEPTH_COMPONENT, 'depth'), defineProperty_default()(_formatMap, g_webgpu_core_es[\"gl\"].DEPTH_STENCIL, 'depth stencil'), _formatMap);\nvar mipmapMap = (_mipmapMap = {}, defineProperty_default()(_mipmapMap, g_webgpu_core_es[\"gl\"].DONT_CARE, 'dont care'), defineProperty_default()(_mipmapMap, g_webgpu_core_es[\"gl\"].NICEST, 'nice'), defineProperty_default()(_mipmapMap, g_webgpu_core_es[\"gl\"].FASTEST, 'fast'), _mipmapMap);\nvar filterMap = (_filterMap = {}, defineProperty_default()(_filterMap, g_webgpu_core_es[\"gl\"].NEAREST, 'nearest'), defineProperty_default()(_filterMap, g_webgpu_core_es[\"gl\"].LINEAR, 'linear'), defineProperty_default()(_filterMap, g_webgpu_core_es[\"gl\"].LINEAR_MIPMAP_LINEAR, 'mipmap'), defineProperty_default()(_filterMap, g_webgpu_core_es[\"gl\"].NEAREST_MIPMAP_LINEAR, 'nearest mipmap linear'), defineProperty_default()(_filterMap, g_webgpu_core_es[\"gl\"].LINEAR_MIPMAP_NEAREST, 'linear mipmap nearest'), defineProperty_default()(_filterMap, g_webgpu_core_es[\"gl\"].NEAREST_MIPMAP_NEAREST, 'nearest mipmap nearest'), _filterMap);\nvar wrapModeMap = (_wrapModeMap = {}, defineProperty_default()(_wrapModeMap, g_webgpu_core_es[\"gl\"].REPEAT, 'repeat'), defineProperty_default()(_wrapModeMap, g_webgpu_core_es[\"gl\"].CLAMP_TO_EDGE, 'clamp'), defineProperty_default()(_wrapModeMap, g_webgpu_core_es[\"gl\"].MIRRORED_REPEAT, 'mirror'), _wrapModeMap);\nvar colorSpaceMap = (_colorSpaceMap = {}, defineProperty_default()(_colorSpaceMap, g_webgpu_core_es[\"gl\"].NONE, 'none'), defineProperty_default()(_colorSpaceMap, g_webgpu_core_es[\"gl\"].BROWSER_DEFAULT_WEBGL, 'browser'), _colorSpaceMap);\nvar depthFuncMap = (_depthFuncMap = {}, defineProperty_default()(_depthFuncMap, g_webgpu_core_es[\"gl\"].NEVER, 'never'), defineProperty_default()(_depthFuncMap, g_webgpu_core_es[\"gl\"].ALWAYS, 'always'), defineProperty_default()(_depthFuncMap, g_webgpu_core_es[\"gl\"].LESS, 'less'), defineProperty_default()(_depthFuncMap, g_webgpu_core_es[\"gl\"].LEQUAL, 'lequal'), defineProperty_default()(_depthFuncMap, g_webgpu_core_es[\"gl\"].GREATER, 'greater'), defineProperty_default()(_depthFuncMap, g_webgpu_core_es[\"gl\"].GEQUAL, 'gequal'), defineProperty_default()(_depthFuncMap, g_webgpu_core_es[\"gl\"].EQUAL, 'equal'), defineProperty_default()(_depthFuncMap, g_webgpu_core_es[\"gl\"].NOTEQUAL, 'notequal'), _depthFuncMap);\nvar blendEquationMap = (_blendEquationMap = {}, defineProperty_default()(_blendEquationMap, g_webgpu_core_es[\"gl\"].FUNC_ADD, 'add'), defineProperty_default()(_blendEquationMap, g_webgpu_core_es[\"gl\"].MIN_EXT, 'min'), defineProperty_default()(_blendEquationMap, g_webgpu_core_es[\"gl\"].MAX_EXT, 'max'), defineProperty_default()(_blendEquationMap, g_webgpu_core_es[\"gl\"].FUNC_SUBTRACT, 'subtract'), defineProperty_default()(_blendEquationMap, g_webgpu_core_es[\"gl\"].FUNC_REVERSE_SUBTRACT, 'reverse subtract'), _blendEquationMap);\nvar blendFuncMap = (_blendFuncMap = {}, defineProperty_default()(_blendFuncMap, g_webgpu_core_es[\"gl\"].ZERO, 'zero'), defineProperty_default()(_blendFuncMap, g_webgpu_core_es[\"gl\"].ONE, 'one'), defineProperty_default()(_blendFuncMap, g_webgpu_core_es[\"gl\"].SRC_COLOR, 'src color'), defineProperty_default()(_blendFuncMap, g_webgpu_core_es[\"gl\"].ONE_MINUS_SRC_COLOR, 'one minus src color'), defineProperty_default()(_blendFuncMap, g_webgpu_core_es[\"gl\"].SRC_ALPHA, 'src alpha'), defineProperty_default()(_blendFuncMap, g_webgpu_core_es[\"gl\"].ONE_MINUS_SRC_ALPHA, 'one minus src alpha'), defineProperty_default()(_blendFuncMap, g_webgpu_core_es[\"gl\"].DST_COLOR, 'dst color'), defineProperty_default()(_blendFuncMap, g_webgpu_core_es[\"gl\"].ONE_MINUS_DST_COLOR, 'one minus dst color'), defineProperty_default()(_blendFuncMap, g_webgpu_core_es[\"gl\"].DST_ALPHA, 'dst alpha'), defineProperty_default()(_blendFuncMap, g_webgpu_core_es[\"gl\"].ONE_MINUS_DST_ALPHA, 'one minus dst alpha'), defineProperty_default()(_blendFuncMap, g_webgpu_core_es[\"gl\"].CONSTANT_COLOR, 'constant color'), defineProperty_default()(_blendFuncMap, g_webgpu_core_es[\"gl\"].ONE_MINUS_CONSTANT_COLOR, 'one minus constant color'), defineProperty_default()(_blendFuncMap, g_webgpu_core_es[\"gl\"].CONSTANT_ALPHA, 'constant alpha'), defineProperty_default()(_blendFuncMap, g_webgpu_core_es[\"gl\"].ONE_MINUS_CONSTANT_ALPHA, 'one minus constant alpha'), defineProperty_default()(_blendFuncMap, g_webgpu_core_es[\"gl\"].SRC_ALPHA_SATURATE, 'src alpha saturate'), _blendFuncMap);\nvar stencilFuncMap = (_stencilFuncMap = {}, defineProperty_default()(_stencilFuncMap, g_webgpu_core_es[\"gl\"].NEVER, 'never'), defineProperty_default()(_stencilFuncMap, g_webgpu_core_es[\"gl\"].ALWAYS, 'always'), defineProperty_default()(_stencilFuncMap, g_webgpu_core_es[\"gl\"].LESS, 'less'), defineProperty_default()(_stencilFuncMap, g_webgpu_core_es[\"gl\"].LEQUAL, 'lequal'), defineProperty_default()(_stencilFuncMap, g_webgpu_core_es[\"gl\"].GREATER, 'greater'), defineProperty_default()(_stencilFuncMap, g_webgpu_core_es[\"gl\"].GEQUAL, 'gequal'), defineProperty_default()(_stencilFuncMap, g_webgpu_core_es[\"gl\"].EQUAL, 'equal'), defineProperty_default()(_stencilFuncMap, g_webgpu_core_es[\"gl\"].NOTEQUAL, 'notequal'), _stencilFuncMap);\nvar stencilOpMap = (_stencilOpMap = {}, defineProperty_default()(_stencilOpMap, g_webgpu_core_es[\"gl\"].ZERO, 'zero'), defineProperty_default()(_stencilOpMap, g_webgpu_core_es[\"gl\"].KEEP, 'keep'), defineProperty_default()(_stencilOpMap, g_webgpu_core_es[\"gl\"].REPLACE, 'replace'), defineProperty_default()(_stencilOpMap, g_webgpu_core_es[\"gl\"].INVERT, 'invert'), defineProperty_default()(_stencilOpMap, g_webgpu_core_es[\"gl\"].INCR, 'increment'), defineProperty_default()(_stencilOpMap, g_webgpu_core_es[\"gl\"].DECR, 'decrement'), defineProperty_default()(_stencilOpMap, g_webgpu_core_es[\"gl\"].INCR_WRAP, 'increment wrap'), defineProperty_default()(_stencilOpMap, g_webgpu_core_es[\"gl\"].DECR_WRAP, 'decrement wrap'), _stencilOpMap);\nvar cullFaceMap = (_cullFaceMap = {}, defineProperty_default()(_cullFaceMap, g_webgpu_core_es[\"gl\"].FRONT, 'front'), defineProperty_default()(_cullFaceMap, g_webgpu_core_es[\"gl\"].BACK, 'back'), _cullFaceMap);\n//# sourceMappingURL=constants.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-webgpu-engine/es/webgl/ReglBuffer.js\n\n\n\n\n/**\n * adaptor for regl.Buffer\n * @see https://github.com/regl-project/regl/blob/gh-pages/API.md#buffers\n */\n\nvar ReglBuffer_ReglBuffer = /*#__PURE__*/function () {\n function ReglBuffer(reGl, options) {\n classCallCheck_default()(this, ReglBuffer);\n\n this.buffer = void 0;\n var data = options.data,\n usage = options.usage,\n type = options.type; // @ts-ignore\n\n this.buffer = reGl.buffer({\n data: data,\n usage: usageMap[usage || g_webgpu_core_es[\"gl\"].STATIC_DRAW],\n type: dataTypeMap[type || g_webgpu_core_es[\"gl\"].UNSIGNED_BYTE] // length: 0,\n\n });\n }\n\n createClass_default()(ReglBuffer, [{\n key: \"get\",\n value: function get() {\n return this.buffer;\n }\n }, {\n key: \"destroy\",\n value: function destroy() {// this.buffer.destroy();\n }\n }, {\n key: \"subData\",\n value: function subData(_ref) {\n var data = _ref.data,\n offset = _ref.offset;\n // @ts-ignore\n this.buffer.subdata(data, offset);\n }\n }]);\n\n return ReglBuffer;\n}();\n\n\n//# sourceMappingURL=ReglBuffer.js.map\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/toConsumableArray.js\nvar toConsumableArray = __webpack_require__(27);\nvar toConsumableArray_default = /*#__PURE__*/__webpack_require__.n(toConsumableArray);\n\n// CONCATENATED MODULE: ./node_modules/@antv/g-webgpu-engine/es/utils/is-typedarray.js\n\n\n/** Used as references for various `Number` constants. */\nvar is_typedarray_MAX_SAFE_INTEGER = 9007199254740991;\n/** `Object#toString` result references. */\n\nvar is_typedarray_argsTag = '[object Arguments]';\nvar is_typedarray_arrayTag = '[object Array]';\nvar is_typedarray_boolTag = '[object Boolean]';\nvar is_typedarray_dateTag = '[object Date]';\nvar is_typedarray_errorTag = '[object Error]';\nvar is_typedarray_funcTag = '[object Function]';\nvar is_typedarray_mapTag = '[object Map]';\nvar is_typedarray_numberTag = '[object Number]';\nvar is_typedarray_objectTag = '[object Object]';\nvar is_typedarray_regexpTag = '[object RegExp]';\nvar is_typedarray_setTag = '[object Set]';\nvar is_typedarray_stringTag = '[object String]';\nvar is_typedarray_weakMapTag = '[object WeakMap]';\nvar is_typedarray_arrayBufferTag = '[object ArrayBuffer]';\nvar is_typedarray_dataViewTag = '[object DataView]';\nvar is_typedarray_float32Tag = '[object Float32Array]';\nvar is_typedarray_float64Tag = '[object Float64Array]';\nvar is_typedarray_int8Tag = '[object Int8Array]';\nvar is_typedarray_int16Tag = '[object Int16Array]';\nvar is_typedarray_int32Tag = '[object Int32Array]';\nvar is_typedarray_uint8Tag = '[object Uint8Array]';\nvar is_typedarray_uint8ClampedTag = '[object Uint8ClampedArray]';\nvar is_typedarray_uint16Tag = '[object Uint16Array]';\nvar is_typedarray_uint32Tag = '[object Uint32Array]';\n/** Used to identify `toStringTag` values of typed arrays. */\n\nvar is_typedarray_typedArrayTags = {};\nis_typedarray_typedArrayTags[is_typedarray_float32Tag] = is_typedarray_typedArrayTags[is_typedarray_float64Tag] = is_typedarray_typedArrayTags[is_typedarray_int8Tag] = is_typedarray_typedArrayTags[is_typedarray_int16Tag] = is_typedarray_typedArrayTags[is_typedarray_int32Tag] = is_typedarray_typedArrayTags[is_typedarray_uint8Tag] = is_typedarray_typedArrayTags[is_typedarray_uint8ClampedTag] = is_typedarray_typedArrayTags[is_typedarray_uint16Tag] = is_typedarray_typedArrayTags[is_typedarray_uint32Tag] = true;\nis_typedarray_typedArrayTags[is_typedarray_argsTag] = is_typedarray_typedArrayTags[is_typedarray_arrayTag] = is_typedarray_typedArrayTags[is_typedarray_arrayBufferTag] = is_typedarray_typedArrayTags[is_typedarray_boolTag] = is_typedarray_typedArrayTags[is_typedarray_dataViewTag] = is_typedarray_typedArrayTags[is_typedarray_dateTag] = is_typedarray_typedArrayTags[is_typedarray_errorTag] = is_typedarray_typedArrayTags[is_typedarray_funcTag] = is_typedarray_typedArrayTags[is_typedarray_mapTag] = is_typedarray_typedArrayTags[is_typedarray_numberTag] = is_typedarray_typedArrayTags[is_typedarray_objectTag] = is_typedarray_typedArrayTags[is_typedarray_regexpTag] = is_typedarray_typedArrayTags[is_typedarray_setTag] = is_typedarray_typedArrayTags[is_typedarray_stringTag] = is_typedarray_typedArrayTags[is_typedarray_weakMapTag] = false;\n/**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\n\nfunction is_typedarray_baseUnary(func) {\n return function (value) {\n return func(value);\n };\n}\n/** Used for built-in method references. */\n\n\nvar is_typedarray_objectProto = Object.prototype;\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\n\nvar is_typedarray_objectToString = is_typedarray_objectProto.toString;\n/**\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n */\n\nfunction is_typedarray_baseIsTypedArray(value) {\n return is_typedarray_isObjectLike(value) && is_typedarray_isLength(value.length) && !!is_typedarray_typedArrayTags[is_typedarray_objectToString.call(value)];\n}\n\nfunction is_typedarray_isLength(value) {\n return typeof value === 'number' && value > -1 && value % 1 === 0 && value <= is_typedarray_MAX_SAFE_INTEGER;\n}\n\nfunction is_typedarray_isObjectLike(value) {\n return !!value && typeof_default()(value) === 'object';\n}\n/**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\n\n\nvar is_typedarray_isTypedArray = is_typedarray_baseIsTypedArray;\n//# sourceMappingURL=is-typedarray.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-webgpu-engine/es/webgl/ReglComputeModel.js\n\n\n\n\n\n\n\nfunction ReglComputeModel_ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }\n\nfunction ReglComputeModel_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ReglComputeModel_ownKeys(Object(source), true).forEach(function (key) { defineProperty_default()(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ReglComputeModel_ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\n\n\n\n/* babel-plugin-inline-import './shaders/quad.vert.glsl' */\nvar quadVert = \"attribute vec3 a_Position;\\nattribute vec2 a_TexCoord;\\n\\nvarying vec2 v_TexCoord;\\n\\nvoid main() {\\n gl_Position = vec4(a_Position, 1.0);\\n v_TexCoord = a_TexCoord;\\n}\";\nvar textureId = 0;\nvar debug = false;\n/**\n * adaptor for regl.DrawCommand\n */\n\nvar ReglComputeModel_ReglComputeModel = /*#__PURE__*/function () {\n function ReglComputeModel(reGl, context) {\n var _this = this;\n\n classCallCheck_default()(this, ReglComputeModel);\n\n this.reGl = reGl;\n this.context = context;\n this.entity = Object(g_webgpu_core_es[\"createEntity\"])();\n this.texFBO = void 0;\n this.computeCommand = void 0;\n this.textureCache = {};\n this.outputTextureName = void 0;\n this.swapOutputTextureName = void 0;\n this.compiledPingpong = void 0;\n this.dynamicPingpong = void 0;\n var uniforms = {};\n this.context.uniforms.forEach(function (uniform) {\n var name = uniform.name,\n type = uniform.type,\n data = uniform.data,\n isReferer = uniform.isReferer,\n storageClass = uniform.storageClass; // store data with a 2D texture\n\n if (storageClass === g_webgpu_core_es[\"STORAGE_CLASS\"].StorageBuffer) {\n if (!isReferer) {\n _this.textureCache[name] = _this.calcDataTexture(name, type, data);\n var _this$textureCache$na = _this.textureCache[name],\n width = _this$textureCache$na.textureWidth,\n isOutput = _this$textureCache$na.isOutput;\n uniforms[\"\".concat(name, \"Size\")] = [width, width];\n\n if (isOutput) {\n _this.outputTextureName = name;\n\n if (_this.context.needPingpong) {\n _this.outputTextureName = \"\".concat(name, \"Output\");\n _this.textureCache[_this.outputTextureName] = _this.calcDataTexture(name, type, data);\n }\n }\n } else {\n // @ts-ignore\n _this.textureCache[name] = {\n data: undefined\n }; // refer to another kernel's output,\n // the referred kernel may not have been initialized, so we use dynamic way here\n\n uniforms[\"\".concat(name, \"Size\")] = function () {\n return (// @ts-ignore\n data.compiledBundle.context.output.textureSize\n );\n };\n }\n\n uniforms[name] = function () {\n if (debug) {\n console.log(\"[\".concat(_this.entity, \"]: \").concat(name, \" \").concat(_this.textureCache[name].id));\n }\n\n return _this.textureCache[name].texture;\n };\n } else if (storageClass === g_webgpu_core_es[\"STORAGE_CLASS\"].Uniform) {\n if (data && (Array.isArray(data) || is_typedarray_isTypedArray(data)) && data.length > 16) {\n // up to mat4 which includes 16 elements\n throw new Error(\"invalid data type \".concat(type));\n } // get uniform dynamically\n\n\n uniforms[name] = function () {\n return uniform.data;\n };\n }\n });\n\n var _this$getOuputDataTex = this.getOuputDataTexture(),\n textureWidth = _this$getOuputDataTex.textureWidth,\n texelCount = _this$getOuputDataTex.texelCount; // 传入 output 纹理尺寸和数据长度,便于多余的 texel 提前退出\n\n\n uniforms.u_OutputTextureSize = [textureWidth, textureWidth];\n uniforms.u_OutputTexelCount = texelCount; // 保存在 Kernel 的上下文中,供其他 Kernel 引用\n\n this.context.output.textureSize = [textureWidth, textureWidth];\n var drawParams = {\n attributes: {\n a_Position: [[-1, 1, 0], [-1, -1, 0], [1, 1, 0], [1, -1, 0]],\n a_TexCoord: [[0, 1], [0, 0], [1, 1], [1, 0]]\n },\n frag: \"#ifdef GL_FRAGMENT_PRECISION_HIGH\\n precision highp float;\\n#else\\n precision mediump float;\\n#endif\\n\".concat(this.context.shader),\n uniforms: uniforms,\n vert: quadVert,\n // TODO: use a fullscreen triangle instead.\n primitive: 'triangle strip',\n count: 4\n };\n this.computeCommand = this.reGl(drawParams);\n }\n\n createClass_default()(ReglComputeModel, [{\n key: \"run\",\n value: function run() {\n var _this2 = this;\n\n if (this.context.maxIteration > 1 && this.context.needPingpong) {\n this.compiledPingpong = true;\n } // need pingpong when (@in@out and execute(10)) or use `setBinding('out', self)`\n // this.needPingpong =\n // !!(this.context.maxIteration > 1 && this.context.needPingpong);\n // if (this.relativeOutputTextureNames.length) {\n // const { id, texture } = this.getOuputDataTexture();\n // this.relativeOutputTextureNames.forEach((name) => {\n // this.textureCache[name].id = id;\n // this.textureCache[name].texture = texture;\n // });\n // this.swap();\n // }\n\n\n if (this.compiledPingpong || this.dynamicPingpong) {\n this.swap();\n }\n\n this.texFBO = this.reGl.framebuffer({\n color: this.getOuputDataTexture().texture\n });\n this.texFBO.use(function () {\n _this2.computeCommand();\n });\n\n if (debug) {\n console.log(\"[\".concat(this.entity, \"]: output \").concat(this.getOuputDataTexture().id));\n }\n }\n }, {\n key: \"readData\",\n value: function () {\n var _readData = asyncToGenerator_default()( /*#__PURE__*/regenerator_default.a.mark(function _callee() {\n var _this3 = this;\n\n var pixels, _this$getOuputDataTex2, originalDataLength, elementsPerTexel, _this$getOuputDataTex3, typedArrayConstructor, formattedPixels, i;\n\n return regenerator_default.a.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n this.reGl({\n framebuffer: this.texFBO\n })(function () {\n pixels = _this3.reGl.read();\n }); // @ts-ignore\n\n if (!pixels) {\n _context.next = 6;\n break;\n }\n\n _this$getOuputDataTex2 = this.getOuputDataTexture(), originalDataLength = _this$getOuputDataTex2.originalDataLength, elementsPerTexel = _this$getOuputDataTex2.elementsPerTexel, _this$getOuputDataTex3 = _this$getOuputDataTex2.typedArrayConstructor, typedArrayConstructor = _this$getOuputDataTex3 === void 0 ? Float32Array : _this$getOuputDataTex3;\n formattedPixels = [];\n\n if (elementsPerTexel !== 4) {\n for (i = 0; i < pixels.length; i += 4) {\n if (elementsPerTexel === 1) {\n formattedPixels.push(pixels[i]);\n } else if (elementsPerTexel === 2) {\n formattedPixels.push(pixels[i], pixels[i + 1]);\n } else {\n formattedPixels.push(pixels[i], pixels[i + 1], pixels[i + 2]);\n }\n }\n } else {\n // @ts-ignore\n formattedPixels = pixels;\n } // 截取多余的部分\n // @ts-ignore\n\n\n return _context.abrupt(\"return\", new typedArrayConstructor(formattedPixels.slice(0, originalDataLength)));\n\n case 6:\n return _context.abrupt(\"return\", new Float32Array());\n\n case 7:\n case \"end\":\n return _context.stop();\n }\n }\n }, _callee, this);\n }));\n\n function readData() {\n return _readData.apply(this, arguments);\n }\n\n return readData;\n }()\n }, {\n key: \"confirmInput\",\n value: function confirmInput(model, inputName) {\n var inputModel; // refer to self, same as pingpong\n\n if (this.entity === model.entity) {\n this.dynamicPingpong = true;\n inputModel = this;\n } else {\n inputModel = model;\n }\n\n this.textureCache[inputName].id = inputModel.getOuputDataTexture().id;\n this.textureCache[inputName].texture = inputModel.getOuputDataTexture().texture;\n\n if (debug) {\n console.log(\"[\".concat(this.entity, \"]: confirm input \").concat(inputName, \" from model \").concat(inputModel.entity, \", \").concat(inputModel.getOuputDataTexture().id));\n }\n }\n }, {\n key: \"updateUniform\",\n value: function updateUniform() {// already get uniform's data dynamically when created, do nothing here\n }\n }, {\n key: \"updateBuffer\",\n value: function updateBuffer(bufferName, data) {\n var offset = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n // regenerate data texture\n var buffer = this.context.uniforms.find(function (_ref) {\n var name = _ref.name;\n return name === bufferName;\n });\n\n if (buffer) {\n var _this$calcDataTexture = this.calcDataTexture(bufferName, buffer.type, data),\n texture = _this$calcDataTexture.texture,\n paddingData = _this$calcDataTexture.data; // TODO: destroy outdated texture\n\n\n this.textureCache[bufferName].data = paddingData;\n this.textureCache[bufferName].texture = texture;\n }\n }\n }, {\n key: \"destroy\",\n value: function destroy() {// regl will destroy all resources\n }\n }, {\n key: \"swap\",\n value: function swap() {\n if (!this.swapOutputTextureName) {\n this.createSwapOutputDataTexture();\n }\n\n if (this.compiledPingpong) {\n var outputTextureUniformName = this.context.output.name;\n this.textureCache[outputTextureUniformName].id = this.getOuputDataTexture().id;\n this.textureCache[outputTextureUniformName].texture = this.getOuputDataTexture().texture;\n }\n\n var tmp = this.outputTextureName;\n this.outputTextureName = this.swapOutputTextureName;\n this.swapOutputTextureName = tmp;\n\n if (debug) {\n console.log(\"[\".concat(this.entity, \"]: after swap, output \").concat(this.getOuputDataTexture().id));\n }\n }\n }, {\n key: \"getOuputDataTexture\",\n value: function getOuputDataTexture() {\n return this.textureCache[this.outputTextureName];\n }\n }, {\n key: \"createSwapOutputDataTexture\",\n value: function createSwapOutputDataTexture() {\n var texture = this.cloneDataTexture(this.getOuputDataTexture());\n this.swapOutputTextureName = \"\".concat(this.entity, \"-swap\");\n this.textureCache[this.swapOutputTextureName] = texture;\n }\n }, {\n key: \"cloneDataTexture\",\n value: function cloneDataTexture(texture) {\n var data = texture.data,\n textureWidth = texture.textureWidth;\n return ReglComputeModel_objectSpread(ReglComputeModel_objectSpread({}, texture), {}, {\n id: textureId++,\n // @ts-ignore\n texture: this.reGl.texture({\n width: textureWidth,\n height: textureWidth,\n data: data,\n type: 'float'\n })\n });\n }\n }, {\n key: \"calcDataTexture\",\n value: function calcDataTexture(name, type, data) {\n var elementsPerTexel = 1;\n\n if (type === g_webgpu_core_es[\"AST_TOKEN_TYPES\"].Vector4FloatArray) {\n elementsPerTexel = 4;\n } // 用 0 补全不足 vec4 的部分\n\n\n var paddingData = [];\n\n for (var i = 0; i < data.length; i += elementsPerTexel) {\n if (elementsPerTexel === 1) {\n paddingData.push(data[i], 0, 0, 0);\n } else if (elementsPerTexel === 2) {\n paddingData.push(data[i], data[i + 1], 0, 0);\n } else if (elementsPerTexel === 3) {\n paddingData.push(data[i], data[i + 1], data[i + 2], 0);\n } else if (elementsPerTexel === 4) {\n paddingData.push(data[i], data[i + 1], data[i + 2], data[i + 3]);\n }\n } // 使用纹理存储,例如 Array(8) 使用 3 * 3 纹理,末尾空白使用 0 填充\n\n\n var originalDataLength = data.length;\n var texelCount = Math.ceil(originalDataLength / elementsPerTexel);\n var width = Math.ceil(Math.sqrt(texelCount));\n var paddingTexelCount = width * width;\n\n if (texelCount < paddingTexelCount) {\n paddingData.push.apply(paddingData, toConsumableArray_default()(new Array((paddingTexelCount - texelCount) * 4).fill(0)));\n }\n\n var texture = this.reGl.texture({\n width: width,\n height: width,\n data: paddingData,\n type: 'float'\n });\n return {\n id: textureId++,\n data: paddingData,\n originalDataLength: originalDataLength,\n typedArrayConstructor: is_typedarray_isTypedArray(data) ? data.constructor : undefined,\n textureWidth: width,\n texture: texture,\n texelCount: texelCount,\n elementsPerTexel: elementsPerTexel,\n isOutput: name === this.context.output.name\n };\n }\n }]);\n\n return ReglComputeModel;\n}();\n\n\n//# sourceMappingURL=ReglComputeModel.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-webgpu-engine/es/webgl/ReglElements.js\n\n\n\n\n/**\n * @see https://github.com/regl-project/regl/blob/gh-pages/API.md#elements\n */\n\nvar ReglElements_ReglElements = /*#__PURE__*/function () {\n function ReglElements(reGl, options) {\n classCallCheck_default()(this, ReglElements);\n\n this.elements = void 0;\n var data = options.data,\n usage = options.usage,\n type = options.type,\n count = options.count;\n this.elements = reGl.elements({\n data: data,\n usage: usageMap[usage || g_webgpu_core_es[\"gl\"].STATIC_DRAW],\n type: dataTypeMap[type || g_webgpu_core_es[\"gl\"].UNSIGNED_BYTE],\n count: count\n });\n }\n\n createClass_default()(ReglElements, [{\n key: \"get\",\n value: function get() {\n return this.elements;\n }\n }, {\n key: \"subData\",\n value: function subData(_ref) {\n var data = _ref.data;\n this.elements.subdata(data);\n }\n }, {\n key: \"destroy\",\n value: function destroy() {\n this.elements.destroy();\n }\n }]);\n\n return ReglElements;\n}();\n\n\n//# sourceMappingURL=ReglElements.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-webgpu-engine/es/webgl/ReglFramebuffer.js\n\n\n\n/**\n * adaptor for regl.Framebuffer\n * @see https://github.com/regl-project/regl/blob/gh-pages/API.md#framebuffers\n */\nvar ReglFramebuffer_ReglFramebuffer = /*#__PURE__*/function () {\n function ReglFramebuffer(reGl, options) {\n classCallCheck_default()(this, ReglFramebuffer);\n\n this.framebuffer = void 0;\n var width = options.width,\n height = options.height,\n color = options.color,\n colors = options.colors,\n depth = options.depth,\n stencil = options.stencil;\n var framebufferOptions = {\n width: width,\n height: height\n };\n\n if (Array.isArray(colors)) {\n framebufferOptions.colors = colors.map(function (c) {\n return c.get();\n });\n }\n\n if (color && typeof color !== 'boolean') {\n framebufferOptions.color = color.get();\n } // TODO: depth & stencil\n\n\n this.framebuffer = reGl.framebuffer(framebufferOptions);\n }\n\n createClass_default()(ReglFramebuffer, [{\n key: \"get\",\n value: function get() {\n return this.framebuffer;\n }\n }, {\n key: \"destroy\",\n value: function destroy() {\n this.framebuffer.destroy();\n }\n }, {\n key: \"resize\",\n value: function resize(_ref) {\n var width = _ref.width,\n height = _ref.height;\n this.framebuffer.resize(width, height);\n }\n }]);\n\n return ReglFramebuffer;\n}();\n\n\n//# sourceMappingURL=ReglFramebuffer.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-webgpu-engine/es/utils/is-object.js\n\nfunction is_object_isObject(value) {\n var type = typeof_default()(value);\n\n return value != null && (type === 'object' || type === 'function');\n}\n//# sourceMappingURL=is-object.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-webgpu-engine/es/utils/uniform.js\n\n\n/**\n * 考虑结构体命名, eg:\n * a: { b: 1 } -> 'a.b'\n * a: [ { b: 1 } ] -> 'a[0].b'\n */\n\nfunction extractUniforms(uniforms) {\n var extractedUniforms = {};\n Object.keys(uniforms).forEach(function (uniformName) {\n extractUniformsRecursively(uniformName, uniforms[uniformName], extractedUniforms, '');\n });\n return extractedUniforms;\n}\n\nfunction extractUniformsRecursively(uniformName, uniformValue, uniforms, prefix) {\n if (uniformValue === null || typeof uniformValue === 'number' || // u_A: 1\n typeof uniformValue === 'boolean' || // u_A: false\n Array.isArray(uniformValue) && typeof uniformValue[0] === 'number' || // u_A: [1, 2, 3]\n is_typedarray_isTypedArray(uniformValue) || // u_A: Float32Array\n // @ts-ignore\n uniformValue === '' || // @ts-ignore\n uniformValue.resize !== undefined) {\n uniforms[\"\".concat(prefix && prefix + '.').concat(uniformName)] = uniformValue;\n return;\n } // u_Struct.a.b.c\n\n\n if (is_object_isObject(uniformValue)) {\n Object.keys(uniformValue).forEach(function (childName) {\n extractUniformsRecursively(childName, // @ts-ignore\n uniformValue[childName], uniforms, \"\".concat(prefix && prefix + '.').concat(uniformName));\n });\n } // u_Struct[0].a\n\n\n if (Array.isArray(uniformValue)) {\n // @ts-ignore\n uniformValue.forEach(function (child, idx) {\n Object.keys(child).forEach(function (childName) {\n extractUniformsRecursively(childName, // @ts-ignore\n child[childName], uniforms, \"\".concat(prefix && prefix + '.').concat(uniformName, \"[\").concat(idx, \"]\"));\n });\n });\n }\n}\n//# sourceMappingURL=uniform.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-webgpu-engine/es/webgl/ReglModel.js\n\n\n\n\n\nfunction ReglModel_ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }\n\nfunction ReglModel_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ReglModel_ownKeys(Object(source), true).forEach(function (key) { defineProperty_default()(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ReglModel_ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\n\n\n\n\n/**\n * adaptor for regl.DrawCommand\n */\nvar ReglModel_ReglModel = /*#__PURE__*/function () {\n function ReglModel(reGl, options) {\n classCallCheck_default()(this, ReglModel);\n\n this.reGl = void 0;\n this.drawCommand = void 0;\n this.uniforms = {};\n this.reGl = reGl;\n var vs = options.vs,\n fs = options.fs,\n defines = options.defines,\n attributes = options.attributes,\n uniforms = options.uniforms,\n primitive = options.primitive,\n count = options.count,\n elements = options.elements,\n depth = options.depth,\n blend = options.blend,\n stencil = options.stencil,\n cull = options.cull,\n instances = options.instances,\n scissor = options.scissor,\n viewport = options.viewport;\n var reglUniforms = {};\n\n if (uniforms) {\n this.uniforms = extractUniforms(uniforms);\n Object.keys(uniforms).forEach(function (uniformName) {\n // use regl prop API\n // @ts-ignore\n reglUniforms[uniformName] = reGl.prop(uniformName);\n });\n }\n\n var reglAttributes = {};\n Object.keys(attributes).forEach(function (name) {\n reglAttributes[name] = attributes[name].get();\n });\n var defineStmts = defines && this.generateDefines(defines) || '';\n var drawParams = {\n attributes: reglAttributes,\n frag: \"#ifdef GL_FRAGMENT_PRECISION_HIGH\\n precision highp float;\\n#else\\n precision mediump float;\\n#endif\\n\".concat(defineStmts, \"\\n\").concat(fs),\n uniforms: reglUniforms,\n vert: \"\\n\".concat(defineStmts, \"\\n\").concat(vs),\n primitive: primitiveMap[primitive === undefined ? g_webgpu_core_es[\"gl\"].TRIANGLES : primitive]\n };\n\n if (instances) {\n drawParams.instances = instances;\n } // elements 中可能包含 count,此时不应传入\n\n\n if (count) {\n drawParams.count = count;\n }\n\n if (elements) {\n drawParams.elements = elements.get();\n }\n\n if (scissor) {\n drawParams.scissor = scissor;\n }\n\n if (viewport) {\n drawParams.viewport = viewport;\n }\n\n this.initDepthDrawParams({\n depth: depth\n }, drawParams);\n this.initBlendDrawParams({\n blend: blend\n }, drawParams);\n this.initStencilDrawParams({\n stencil: stencil\n }, drawParams);\n this.initCullDrawParams({\n cull: cull\n }, drawParams);\n this.drawCommand = reGl(drawParams);\n }\n\n createClass_default()(ReglModel, [{\n key: \"addUniforms\",\n value: function addUniforms(uniforms) {\n this.uniforms = ReglModel_objectSpread(ReglModel_objectSpread({}, this.uniforms), extractUniforms(uniforms));\n }\n }, {\n key: \"draw\",\n value: function draw(options) {\n var uniforms = ReglModel_objectSpread(ReglModel_objectSpread({}, this.uniforms), extractUniforms(options.uniforms || {}));\n\n var reglDrawProps = {};\n Object.keys(uniforms).forEach(function (uniformName) {\n var type = typeof_default()(uniforms[uniformName]);\n\n if (type === 'boolean' || type === 'number' || Array.isArray(uniforms[uniformName]) || // @ts-ignore\n uniforms[uniformName].BYTES_PER_ELEMENT) {\n reglDrawProps[uniformName] = uniforms[uniformName];\n } else if (type === 'string') {// TODO: image url\n } else {\n reglDrawProps[uniformName] = uniforms[uniformName].get();\n }\n });\n this.drawCommand(reglDrawProps);\n }\n }, {\n key: \"destroy\",\n value: function destroy() {// don't need do anything since we will call `rendererService.cleanup()`\n }\n /**\n * @see https://github.com/regl-project/regl/blob/gh-pages/API.md#depth-buffer\n */\n\n }, {\n key: \"initDepthDrawParams\",\n value: function initDepthDrawParams(_ref, drawParams) {\n var depth = _ref.depth;\n\n if (depth) {\n drawParams.depth = {\n enable: depth.enable === undefined ? true : !!depth.enable,\n mask: depth.mask === undefined ? true : !!depth.mask,\n func: depthFuncMap[depth.func || g_webgpu_core_es[\"gl\"].LESS],\n range: depth.range || [0, 1]\n };\n }\n }\n /**\n * @see https://github.com/regl-project/regl/blob/gh-pages/API.md#blending\n */\n\n }, {\n key: \"initBlendDrawParams\",\n value: function initBlendDrawParams(_ref2, drawParams) {\n var blend = _ref2.blend;\n\n if (blend) {\n var enable = blend.enable,\n func = blend.func,\n equation = blend.equation,\n _blend$color = blend.color,\n color = _blend$color === void 0 ? [0, 0, 0, 0] : _blend$color; // @ts-ignore\n\n drawParams.blend = {\n enable: !!enable,\n func: {\n srcRGB: blendFuncMap[func && func.srcRGB || g_webgpu_core_es[\"gl\"].SRC_ALPHA],\n srcAlpha: blendFuncMap[func && func.srcAlpha || g_webgpu_core_es[\"gl\"].SRC_ALPHA],\n dstRGB: blendFuncMap[func && func.dstRGB || g_webgpu_core_es[\"gl\"].ONE_MINUS_SRC_ALPHA],\n dstAlpha: blendFuncMap[func && func.dstAlpha || g_webgpu_core_es[\"gl\"].ONE_MINUS_SRC_ALPHA]\n },\n equation: {\n rgb: blendEquationMap[equation && equation.rgb || g_webgpu_core_es[\"gl\"].FUNC_ADD],\n alpha: blendEquationMap[equation && equation.alpha || g_webgpu_core_es[\"gl\"].FUNC_ADD]\n },\n color: color\n };\n }\n }\n /**\n * @see https://github.com/regl-project/regl/blob/gh-pages/API.md#stencil\n */\n\n }, {\n key: \"initStencilDrawParams\",\n value: function initStencilDrawParams(_ref3, drawParams) {\n var stencil = _ref3.stencil;\n\n if (stencil) {\n var enable = stencil.enable,\n _stencil$mask = stencil.mask,\n mask = _stencil$mask === void 0 ? -1 : _stencil$mask,\n _stencil$func = stencil.func,\n func = _stencil$func === void 0 ? {\n cmp: g_webgpu_core_es[\"gl\"].ALWAYS,\n ref: 0,\n mask: -1\n } : _stencil$func,\n _stencil$opFront = stencil.opFront,\n opFront = _stencil$opFront === void 0 ? {\n fail: g_webgpu_core_es[\"gl\"].KEEP,\n zfail: g_webgpu_core_es[\"gl\"].KEEP,\n zpass: g_webgpu_core_es[\"gl\"].KEEP\n } : _stencil$opFront,\n _stencil$opBack = stencil.opBack,\n opBack = _stencil$opBack === void 0 ? {\n fail: g_webgpu_core_es[\"gl\"].KEEP,\n zfail: g_webgpu_core_es[\"gl\"].KEEP,\n zpass: g_webgpu_core_es[\"gl\"].KEEP\n } : _stencil$opBack;\n drawParams.stencil = {\n enable: !!enable,\n mask: mask,\n func: ReglModel_objectSpread(ReglModel_objectSpread({}, func), {}, {\n cmp: stencilFuncMap[func.cmp]\n }),\n opFront: {\n fail: stencilOpMap[opFront.fail],\n zfail: stencilOpMap[opFront.zfail],\n zpass: stencilOpMap[opFront.zpass]\n },\n opBack: {\n fail: stencilOpMap[opBack.fail],\n zfail: stencilOpMap[opBack.zfail],\n zpass: stencilOpMap[opBack.zpass]\n }\n };\n }\n }\n /**\n * @see https://github.com/regl-project/regl/blob/gh-pages/API.md#culling\n */\n\n }, {\n key: \"initCullDrawParams\",\n value: function initCullDrawParams(_ref4, drawParams) {\n var cull = _ref4.cull;\n\n if (cull) {\n var enable = cull.enable,\n _cull$face = cull.face,\n face = _cull$face === void 0 ? g_webgpu_core_es[\"gl\"].BACK : _cull$face;\n drawParams.cull = {\n enable: !!enable,\n face: cullFaceMap[face]\n };\n }\n }\n }, {\n key: \"generateDefines\",\n value: function generateDefines(defines) {\n return Object.keys(defines).map(function (name) {\n return \"#define \".concat(name, \" \").concat(Number(defines[name]));\n }).join('\\n');\n }\n }]);\n\n return ReglModel;\n}();\n\n\n//# sourceMappingURL=ReglModel.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-webgpu-engine/es/webgl/ReglTexture2D.js\n\n\n\n\n/**\n * adaptor for regl.Buffer\n * @see https://github.com/regl-project/regl/blob/gh-pages/API.md#buffers\n */\n\nvar ReglTexture2D_ReglTexture2D = /*#__PURE__*/function () {\n function ReglTexture2D(reGl, options) {\n classCallCheck_default()(this, ReglTexture2D);\n\n this.texture = void 0;\n this.width = void 0;\n this.height = void 0;\n var data = options.data,\n _options$type = options.type,\n type = _options$type === void 0 ? g_webgpu_core_es[\"gl\"].UNSIGNED_BYTE : _options$type,\n width = options.width,\n height = options.height,\n _options$flipY = options.flipY,\n flipY = _options$flipY === void 0 ? false : _options$flipY,\n _options$format = options.format,\n format = _options$format === void 0 ? g_webgpu_core_es[\"gl\"].RGBA : _options$format,\n _options$mipmap = options.mipmap,\n mipmap = _options$mipmap === void 0 ? false : _options$mipmap,\n _options$wrapS = options.wrapS,\n wrapS = _options$wrapS === void 0 ? g_webgpu_core_es[\"gl\"].CLAMP_TO_EDGE : _options$wrapS,\n _options$wrapT = options.wrapT,\n wrapT = _options$wrapT === void 0 ? g_webgpu_core_es[\"gl\"].CLAMP_TO_EDGE : _options$wrapT,\n _options$aniso = options.aniso,\n aniso = _options$aniso === void 0 ? 0 : _options$aniso,\n _options$alignment = options.alignment,\n alignment = _options$alignment === void 0 ? 1 : _options$alignment,\n _options$premultiplyA = options.premultiplyAlpha,\n premultiplyAlpha = _options$premultiplyA === void 0 ? false : _options$premultiplyA,\n _options$mag = options.mag,\n mag = _options$mag === void 0 ? g_webgpu_core_es[\"gl\"].NEAREST : _options$mag,\n _options$min = options.min,\n min = _options$min === void 0 ? g_webgpu_core_es[\"gl\"].NEAREST : _options$min,\n _options$colorSpace = options.colorSpace,\n colorSpace = _options$colorSpace === void 0 ? g_webgpu_core_es[\"gl\"].BROWSER_DEFAULT_WEBGL : _options$colorSpace;\n this.width = width;\n this.height = height;\n var textureOptions = {\n width: width,\n height: height,\n // @ts-ignore\n type: dataTypeMap[type],\n format: formatMap[format],\n wrapS: wrapModeMap[wrapS],\n wrapT: wrapModeMap[wrapT],\n // @ts-ignore\n mag: filterMap[mag],\n min: filterMap[min],\n alignment: alignment,\n flipY: flipY,\n colorSpace: colorSpaceMap[colorSpace],\n premultiplyAlpha: premultiplyAlpha,\n aniso: aniso\n };\n\n if (data) {\n textureOptions.data = data;\n }\n\n if (typeof mipmap === 'number') {\n textureOptions.mipmap = mipmapMap[mipmap];\n } else if (typeof mipmap === 'boolean') {\n textureOptions.mipmap = mipmap;\n }\n\n this.texture = reGl.texture(textureOptions);\n }\n\n createClass_default()(ReglTexture2D, [{\n key: \"get\",\n value: function get() {\n return this.texture;\n }\n }, {\n key: \"update\",\n value: function update() {\n // @ts-ignore\n this.texture._texture.bind();\n }\n }, {\n key: \"resize\",\n value: function resize(_ref) {\n var width = _ref.width,\n height = _ref.height;\n this.texture.resize(width, height);\n this.width = width;\n this.height = height;\n }\n }, {\n key: \"destroy\",\n value: function destroy() {\n this.texture.destroy();\n }\n }]);\n\n return ReglTexture2D;\n}();\n\n\n//# sourceMappingURL=ReglTexture2D.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-webgpu-engine/es/webgl/index.js\n\n\n\n\n\nvar webgl_dec, webgl_class, webgl_temp;\n\n/**\n * render w/ regl\n * @see https://github.com/regl-project/regl/blob/gh-pages/API.md\n */\n\n\n\n\n\n\n\n\n\n\n/**\n * regl renderer\n */\n\nvar webgl_WebGLEngine = (webgl_dec = Object(inversify[\"injectable\"])(), webgl_dec(webgl_class = (webgl_temp = /*#__PURE__*/function () {\n function WebGLEngine() {\n var _this = this;\n\n classCallCheck_default()(this, WebGLEngine);\n\n this.supportWebGPU = false;\n this.useWGSL = false;\n this.$canvas = void 0;\n this.gl = void 0;\n this.inited = void 0;\n\n this.createModel = /*#__PURE__*/function () {\n var _ref = asyncToGenerator_default()( /*#__PURE__*/regenerator_default.a.mark(function _callee2(options) {\n return regenerator_default.a.wrap(function _callee2$(_context2) {\n while (1) {\n switch (_context2.prev = _context2.next) {\n case 0:\n if (!options.uniforms) {\n _context2.next = 3;\n break;\n }\n\n _context2.next = 3;\n return Promise.all(Object.keys(options.uniforms).map( /*#__PURE__*/function () {\n var _ref2 = asyncToGenerator_default()( /*#__PURE__*/regenerator_default.a.mark(function _callee(name) {\n var texture;\n return regenerator_default.a.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n if (!(options.uniforms[name] && options.uniforms[name].load !== undefined)) {\n _context.next = 5;\n break;\n }\n\n _context.next = 3;\n return options.uniforms[name].load();\n\n case 3:\n texture = _context.sent;\n // @ts-ignore\n options.uniforms[name] = texture;\n\n case 5:\n case \"end\":\n return _context.stop();\n }\n }\n }, _callee);\n }));\n\n return function (_x2) {\n return _ref2.apply(this, arguments);\n };\n }()));\n\n case 3:\n return _context2.abrupt(\"return\", new ReglModel_ReglModel(_this.gl, options));\n\n case 4:\n case \"end\":\n return _context2.stop();\n }\n }\n }, _callee2);\n }));\n\n return function (_x) {\n return _ref.apply(this, arguments);\n };\n }();\n\n this.createAttribute = function (options) {\n return new ReglAttribute_ReglAttribute(_this.gl, options);\n };\n\n this.createBuffer = function (options) {\n return new ReglBuffer_ReglBuffer(_this.gl, options);\n };\n\n this.createElements = function (options) {\n return new ReglElements_ReglElements(_this.gl, options);\n };\n\n this.createTexture2D = function (options) {\n return new ReglTexture2D_ReglTexture2D(_this.gl, options);\n };\n\n this.createFramebuffer = function (options) {\n return new ReglFramebuffer_ReglFramebuffer(_this.gl, options);\n };\n\n this.useFramebuffer = function (framebuffer, drawCommands) {\n _this.gl({\n framebuffer: framebuffer ? framebuffer.get() : null\n })(drawCommands);\n };\n\n this.createComputeModel = /*#__PURE__*/function () {\n var _ref3 = asyncToGenerator_default()( /*#__PURE__*/regenerator_default.a.mark(function _callee3(context) {\n return regenerator_default.a.wrap(function _callee3$(_context3) {\n while (1) {\n switch (_context3.prev = _context3.next) {\n case 0:\n return _context3.abrupt(\"return\", new ReglComputeModel_ReglComputeModel(_this.gl, context));\n\n case 1:\n case \"end\":\n return _context3.stop();\n }\n }\n }, _callee3);\n }));\n\n return function (_x3) {\n return _ref3.apply(this, arguments);\n };\n }();\n\n this.clear = function (options) {\n // @see https://github.com/regl-project/regl/blob/gh-pages/API.md#clear-the-draw-buffer\n var color = options.color,\n depth = options.depth,\n stencil = options.stencil,\n _options$framebuffer = options.framebuffer,\n framebuffer = _options$framebuffer === void 0 ? null : _options$framebuffer;\n var reglClearOptions = {\n color: color,\n depth: depth,\n stencil: stencil\n };\n reglClearOptions.framebuffer = framebuffer === null ? framebuffer : framebuffer.get();\n\n _this.gl.clear(reglClearOptions);\n };\n\n this.setScissor = function (scissor) {\n if (_this.gl && _this.gl._gl) {\n // https://developer.mozilla.org/zh-CN/docs/Web/API/WebGLRenderingContext/scissor\n if (scissor.enable && scissor.box) {\n // console.log(scissor.box);\n _this.gl._gl.enable(g_webgpu_core_es[\"gl\"].SCISSOR_TEST);\n\n _this.gl._gl.scissor(scissor.box.x, scissor.box.y, scissor.box.width, scissor.box.height);\n } else {\n _this.gl._gl.disable(g_webgpu_core_es[\"gl\"].SCISSOR_TEST);\n }\n\n _this.gl._refresh();\n }\n };\n\n this.viewport = function (_ref4) {\n var x = _ref4.x,\n y = _ref4.y,\n width = _ref4.width,\n height = _ref4.height;\n\n if (_this.gl && _this.gl._gl) {\n // use WebGL context directly\n // @see https://github.com/regl-project/regl/blob/gh-pages/API.md#unsafe-escape-hatch\n _this.gl._gl.viewport(x, y, width, height);\n\n _this.gl._refresh();\n }\n };\n\n this.readPixels = function (options) {\n var framebuffer = options.framebuffer,\n x = options.x,\n y = options.y,\n width = options.width,\n height = options.height;\n var readPixelsOptions = {\n x: x,\n y: y,\n width: width,\n height: height\n };\n\n if (framebuffer) {\n readPixelsOptions.framebuffer = framebuffer.get();\n }\n\n return _this.gl.read(readPixelsOptions);\n };\n\n this.getCanvas = function () {\n return _this.$canvas;\n };\n\n this.getGLContext = function () {\n return _this.gl._gl;\n };\n\n this.destroy = function () {\n if (_this.gl) {\n // @see https://github.com/regl-project/regl/blob/gh-pages/API.md#clean-up\n _this.gl.destroy();\n\n _this.inited = false;\n }\n };\n }\n\n createClass_default()(WebGLEngine, [{\n key: \"init\",\n value: function () {\n var _init = asyncToGenerator_default()( /*#__PURE__*/regenerator_default.a.mark(function _callee4(cfg) {\n return regenerator_default.a.wrap(function _callee4$(_context4) {\n while (1) {\n switch (_context4.prev = _context4.next) {\n case 0:\n if (!this.inited) {\n _context4.next = 2;\n break;\n }\n\n return _context4.abrupt(\"return\");\n\n case 2:\n this.$canvas = cfg.canvas; // tslint:disable-next-line:typedef\n\n _context4.next = 5;\n return new Promise(function (resolve, reject) {\n regl_default()({\n canvas: cfg.canvas,\n attributes: {\n alpha: true,\n // use TAA instead of MSAA\n // @see https://www.khronos.org/registry/webgl/specs/1.0/#5.2.1\n antialias: cfg.antialias,\n premultipliedAlpha: true // preserveDrawingBuffer: false,\n\n },\n pixelRatio: 1,\n // TODO: use extensions\n extensions: ['OES_element_index_uint', 'OES_texture_float', 'OES_standard_derivatives', // wireframe\n 'angle_instanced_arrays' // VSM shadow map\n ],\n optionalExtensions: ['EXT_texture_filter_anisotropic', 'EXT_blend_minmax', 'WEBGL_depth_texture'],\n profile: true,\n onDone: function onDone(err, r) {\n if (err || !r) {\n reject(err);\n } // @ts-ignore\n\n\n resolve(r);\n }\n });\n });\n\n case 5:\n this.gl = _context4.sent;\n this.inited = true;\n\n case 7:\n case \"end\":\n return _context4.stop();\n }\n }\n }, _callee4, this);\n }));\n\n function init(_x4) {\n return _init.apply(this, arguments);\n }\n\n return init;\n }()\n }, {\n key: \"isFloatSupported\",\n value: function isFloatSupported() {\n // @see https://github.com/antvis/GWebGPUEngine/issues/26\n // @ts-ignore\n return this.gl.limits.readFloat;\n }\n }, {\n key: \"beginFrame\",\n value: function beginFrame() {//\n }\n }, {\n key: \"endFrame\",\n value: function endFrame() {//\n }\n }]);\n\n return WebGLEngine;\n}(), webgl_temp)) || webgl_class);\n//# sourceMappingURL=index.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-webgpu-engine/es/utils/dom.js\nfunction isWindowObjectExist() {\n return typeof window !== 'undefined';\n}\nfunction loadScript(scriptUrl, onSuccess, onError, scriptId) {\n if (!isWindowObjectExist()) {\n return;\n }\n\n var head = document.getElementsByTagName('head')[0];\n var script = document.createElement('script');\n script.setAttribute('type', 'text/javascript');\n script.setAttribute('src', scriptUrl);\n\n if (scriptId) {\n script.id = scriptId;\n }\n\n script.onload = function () {\n if (onSuccess) {\n onSuccess();\n }\n };\n\n script.onerror = function (e) {\n if (onError) {\n onError(\"Unable to load script '\".concat(scriptUrl, \"'\"), e);\n }\n };\n\n head.appendChild(script);\n}\nfunction loadScriptAsync(scriptUrl, scriptId) {\n return new Promise(function (resolve, reject) {\n loadScript(scriptUrl, function () {\n resolve();\n }, function (message, exception) {\n reject(exception);\n });\n });\n}\n//# sourceMappingURL=dom.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-webgpu-engine/es/webgpu/glslang.js\n\n\n\nvar glslang;\n/* harmony default export */ var webgpu_glslang = (function () {\n return glslang_ref.apply(this, arguments);\n});\n\nfunction glslang_ref() {\n glslang_ref = asyncToGenerator_default()( /*#__PURE__*/regenerator_default.a.mark(function _callee() {\n return regenerator_default.a.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n if (!glslang) {\n _context.next = 2;\n break;\n }\n\n return _context.abrupt(\"return\", glslang);\n\n case 2:\n _context.next = 4;\n return loadScriptAsync('https://preview.babylonjs.com/glslang/glslang.js');\n\n case 4:\n glslang = window.glslang('https://preview.babylonjs.com/glslang/glslang.wasm');\n return _context.abrupt(\"return\", glslang);\n\n case 6:\n case \"end\":\n return _context.stop();\n }\n }\n }, _callee);\n }));\n return glslang_ref.apply(this, arguments);\n}\n//# sourceMappingURL=glslang.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-webgpu-engine/es/webgpu/WebGPUAttribute.js\n\n\n\nvar WebGPUAttribute_WebGPUAttribute = /*#__PURE__*/function () {\n function WebGPUAttribute(engine, options) {\n classCallCheck_default()(this, WebGPUAttribute);\n\n this.engine = engine;\n this.options = options;\n this.attribute = void 0;\n this.buffer = void 0;\n var _options = options,\n buffer = _options.buffer,\n offset = _options.offset,\n stride = _options.stride,\n normalized = _options.normalized,\n size = _options.size,\n divisor = _options.divisor,\n arrayStride = _options.arrayStride,\n attributes = _options.attributes,\n stepMode = _options.stepMode;\n this.buffer = buffer;\n this.attribute = {\n buffer: buffer.get(),\n offset: offset || 0,\n stride: stride || 0,\n normalized: normalized || false,\n divisor: divisor || 0,\n arrayStride: arrayStride || 0,\n // @ts-ignore\n attributes: attributes,\n stepMode: stepMode || 'vertex'\n };\n\n if (size) {\n this.attribute.size = size;\n }\n }\n\n createClass_default()(WebGPUAttribute, [{\n key: \"get\",\n value: function get() {\n return this.attribute;\n }\n }, {\n key: \"updateBuffer\",\n value: function updateBuffer(options) {\n this.buffer.subData(options);\n }\n }, {\n key: \"destroy\",\n value: function destroy() {\n this.buffer.destroy();\n }\n }]);\n\n return WebGPUAttribute;\n}();\n\n\n//# sourceMappingURL=WebGPUAttribute.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-webgpu-engine/es/webgpu/WebGPUBuffer.js\n\n\n\n\n\nvar WebGPUBuffer_WebGPUBuffer = /*#__PURE__*/function () {\n function WebGPUBuffer(engine, options) {\n classCallCheck_default()(this, WebGPUBuffer);\n\n this.engine = engine;\n this.options = options;\n this.buffer = void 0;\n var _options = options,\n data = _options.data,\n usage = _options.usage,\n type = _options.type;\n this.buffer = this.createBuffer(data instanceof Array ? new Float32Array(data) : data, // TODO: WebGL 和 WebGPU buffer usage 映射关系\n usage || constants[\"BufferUsage\"].Vertex | constants[\"BufferUsage\"].CopyDst);\n }\n\n createClass_default()(WebGPUBuffer, [{\n key: \"get\",\n value: function get() {\n return this.buffer;\n }\n }, {\n key: \"destroy\",\n value: function destroy() {\n this.buffer.destroy();\n }\n }, {\n key: \"subData\",\n value: function subData(_ref) {\n var data = _ref.data,\n offset = _ref.offset;\n this.setSubData(this.buffer, offset, data instanceof Array ? new Float32Array(data) : data);\n }\n }, {\n key: \"createBuffer\",\n value: function createBuffer(view, flags) {\n // @ts-ignore\n var padding = view.byteLength % 4;\n var verticesBufferDescriptor = {\n // @ts-ignore\n size: view.byteLength + padding,\n usage: flags\n };\n var buffer = this.engine.device.createBuffer(verticesBufferDescriptor);\n this.setSubData(buffer, 0, view);\n return buffer;\n }\n /**\n * 不同于 Babylon.js 的版本,使用最新的 GPUQueue.writeBuffer 方法\n * @see https://gpuweb.github.io/gpuweb/#dom-gpuqueue-writebuffer\n * 已废弃创建一个临时的 mapped buffer 用于拷贝数据 @see https://gpuweb.github.io/gpuweb/#GPUDevice-createBufferMapped\n * @see https://github.com/gpuweb/gpuweb/blob/master/design/BufferOperations.md#updating-data-to-an-existing-buffer-like-webgls-buffersubdata\n */\n\n }, {\n key: \"setSubData\",\n value: function setSubData(destBuffer, destOffset, srcArrayBuffer) {\n // deprecated API setSubData\n // destBuffer.setSubData(0, srcArrayBuffer);\n // deprecated API createBufferMapped\n // use createBuffer & getMappedRange instead\n // const [srcBuffer, arrayBuffer] = this.engine.device.createBufferMapped({\n // size: byteCount,\n // usage: WebGPUConstants.BufferUsage.CopySrc,\n // });\n var queue = g_webgpu_core_es[\"isSafari\"] ? // @ts-ignore\n this.engine.device.getQueue() : this.engine.device.defaultQueue; // @ts-ignore\n\n queue.writeBuffer(destBuffer, destOffset, srcArrayBuffer);\n }\n }]);\n\n return WebGPUBuffer;\n}();\n\n\n//# sourceMappingURL=WebGPUBuffer.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-webgpu-engine/es/utils/is-number.js\nfunction utils_is_number_isNumber(value) {\n return typeof value === 'number';\n}\n//# sourceMappingURL=is-number.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-webgpu-engine/es/webgpu/WebGPUComputeModel.js\n\n\n\n\n\n\n\n\n\n\nvar WebGPUComputeModel_WebGPUComputeModel = /*#__PURE__*/function () {\n /**\n * 用于后续渲染时动态更新\n */\n function WebGPUComputeModel(engine, context) {\n classCallCheck_default()(this, WebGPUComputeModel);\n\n this.engine = engine;\n this.context = context;\n this.entity = Object(g_webgpu_core_es[\"createEntity\"])();\n this.uniformGPUBufferLayout = [];\n this.uniformBuffer = void 0;\n this.vertexBuffers = {};\n this.outputBuffer = void 0;\n this.bindGroupEntries = void 0;\n this.bindGroup = void 0;\n this.computePipeline = void 0;\n }\n\n createClass_default()(WebGPUComputeModel, [{\n key: \"init\",\n value: function () {\n var _init = asyncToGenerator_default()( /*#__PURE__*/regenerator_default.a.mark(function _callee() {\n var _this = this;\n\n var _yield$this$compileCo, computeStage, buffers, uniforms, bufferBindingIndex, offset, mergedUniformData;\n\n return regenerator_default.a.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n _context.next = 2;\n return this.compileComputePipelineStageDescriptor(this.context.shader);\n\n case 2:\n _yield$this$compileCo = _context.sent;\n computeStage = _yield$this$compileCo.computeStage;\n buffers = this.context.uniforms.filter(function (uniform) {\n return uniform.storageClass === g_webgpu_core_es[\"STORAGE_CLASS\"].StorageBuffer;\n });\n uniforms = this.context.uniforms.filter(function (uniform) {\n return uniform.storageClass === g_webgpu_core_es[\"STORAGE_CLASS\"].Uniform;\n });\n bufferBindingIndex = uniforms.length ? 1 : 0;\n this.bindGroupEntries = [];\n\n if (bufferBindingIndex) {\n offset = 0; // FIXME: 所有 uniform 合并成一个 buffer,固定使用 Float32Array 存储,确实会造成一些内存的浪费\n // we use std140 layout @see https://www.khronos.org/opengl/wiki/Interface_Block_(GLSL)\n\n mergedUniformData = [];\n uniforms.forEach(function (uniform) {\n if (utils_is_number_isNumber(uniform.data)) {\n _this.uniformGPUBufferLayout.push({\n name: uniform.name,\n offset: offset\n });\n\n offset += 4; // @ts-ignore\n\n mergedUniformData.push(uniform.data);\n } else {\n var _uniform$data;\n\n // @ts-ignore\n var originDataLength = ((_uniform$data = uniform.data) === null || _uniform$data === void 0 ? void 0 : _uniform$data.length) || 1;\n\n if (originDataLength === 3) {\n // vec3 -> vec4\n // @see http://ptgmedia.pearsoncmg.com/images/9780321552624/downloads/0321552628_AppL.pdf\n originDataLength = 4; // @ts-ignore\n\n uniform.data.push(0);\n } // 4 elements per block/line\n\n\n var padding = offset / 4 % 4;\n\n if (padding > 0) {\n var space = 4 - padding;\n\n if (originDataLength > 1 && originDataLength <= space) {\n if (originDataLength === 2) {\n if (space === 3) {\n offset += 4;\n mergedUniformData.push(0);\n } // @ts-ignore\n\n\n mergedUniformData.push.apply(mergedUniformData, toConsumableArray_default()(uniform.data));\n\n _this.uniformGPUBufferLayout.push({\n name: uniform.name,\n offset: offset\n });\n }\n } else {\n for (var i = 0; i < space; i++) {\n offset += 4;\n mergedUniformData.push(0);\n } // @ts-ignore\n\n\n mergedUniformData.push.apply(mergedUniformData, toConsumableArray_default()(uniform.data));\n\n _this.uniformGPUBufferLayout.push({\n name: uniform.name,\n offset: offset\n });\n }\n }\n\n offset += 4 * originDataLength;\n }\n });\n this.uniformBuffer = new WebGPUBuffer_WebGPUBuffer(this.engine, {\n // TODO: 处理 Struct 和 boolean\n // @ts-ignore\n data: mergedUniformData instanceof Array ? // @ts-ignore\n new Float32Array(mergedUniformData) : mergedUniformData,\n usage: constants[\"BufferUsage\"].Uniform | constants[\"BufferUsage\"].CopyDst\n });\n this.bindGroupEntries.push({\n binding: 0,\n resource: {\n buffer: this.uniformBuffer.get()\n }\n });\n } // create GPUBuffers for storeage buffers\n\n\n buffers.forEach(function (buffer) {\n if (buffer.data !== null) {\n if (buffer.type === g_webgpu_core_es[\"AST_TOKEN_TYPES\"].Vector4FloatArray || buffer.type === g_webgpu_core_es[\"AST_TOKEN_TYPES\"].FloatArray) {\n var gpuBuffer;\n\n if (buffer.name === _this.context.output.name) {\n gpuBuffer = new WebGPUBuffer_WebGPUBuffer(_this.engine, {\n // @ts-ignore\n data: isFinite(Number(buffer.data)) ? [buffer.data] : buffer.data,\n usage: constants[\"BufferUsage\"].Storage | constants[\"BufferUsage\"].CopyDst | constants[\"BufferUsage\"].CopySrc\n });\n _this.outputBuffer = gpuBuffer;\n _this.context.output = {\n name: buffer.name,\n // @ts-ignore\n length: isFinite(Number(buffer.data)) ? 1 : buffer.data.length,\n typedArrayConstructor: Float32Array,\n gpuBuffer: gpuBuffer.get()\n };\n } else {\n if (buffer.isReferer) {\n // @ts-ignore\n if (buffer.data.model && buffer.data.model.outputBuffer) {\n // @ts-ignore\n gpuBuffer = buffer.data.model.outputBuffer;\n } else {// referred kernel haven't been executed\n }\n } else {\n gpuBuffer = new WebGPUBuffer_WebGPUBuffer(_this.engine, {\n // @ts-ignore\n data: isFinite(Number(buffer.data)) ? [buffer.data] : buffer.data,\n usage: constants[\"BufferUsage\"].Storage | constants[\"BufferUsage\"].CopyDst | constants[\"BufferUsage\"].CopySrc\n });\n }\n } // @ts-ignore\n\n\n _this.vertexBuffers[buffer.name] = gpuBuffer;\n\n _this.bindGroupEntries.push({\n binding: bufferBindingIndex,\n resource: {\n name: buffer.name,\n refer: gpuBuffer ? undefined : buffer.data,\n // @ts-ignore\n buffer: gpuBuffer ? gpuBuffer.get() : undefined\n }\n });\n\n bufferBindingIndex++;\n }\n }\n }); // create compute pipeline layout\n\n this.computePipeline = this.engine.device.createComputePipeline({\n computeStage: computeStage\n });\n console.log(this.bindGroupEntries);\n this.bindGroup = this.engine.device.createBindGroup({\n layout: this.computePipeline.getBindGroupLayout(0),\n entries: this.bindGroupEntries\n });\n\n case 13:\n case \"end\":\n return _context.stop();\n }\n }\n }, _callee, this);\n }));\n\n function init() {\n return _init.apply(this, arguments);\n }\n\n return init;\n }()\n }, {\n key: \"destroy\",\n value: function destroy() {\n var _this2 = this;\n\n if (this.uniformBuffer) {\n this.uniformBuffer.destroy();\n }\n\n Object.keys(this.vertexBuffers).forEach(function (bufferName) {\n return _this2.vertexBuffers[bufferName].destroy();\n });\n }\n }, {\n key: \"readData\",\n value: function () {\n var _readData = asyncToGenerator_default()( /*#__PURE__*/regenerator_default.a.mark(function _callee2() {\n var output, length, typedArrayConstructor, gpuBuffer, byteCount, gpuReadBuffer, encoder, queue, arraybuffer, typedArray;\n return regenerator_default.a.wrap(function _callee2$(_context2) {\n while (1) {\n switch (_context2.prev = _context2.next) {\n case 0:\n output = this.context.output;\n\n if (!output) {\n _context2.next = 16;\n break;\n }\n\n length = output.length, typedArrayConstructor = output.typedArrayConstructor, gpuBuffer = output.gpuBuffer;\n\n if (!gpuBuffer) {\n _context2.next = 16;\n break;\n }\n\n // await gpuBuffer.mapAsync(WebGPUConstants.MapMode.Read);\n // const arraybuffer = gpuBuffer.getMappedRange();\n // let arraybuffer;\n // if (isSafari) {\n // arraybuffer = await gpuBuffer.mapReadAsync();\n // } else {\n byteCount = length * typedArrayConstructor.BYTES_PER_ELEMENT; // @see https://developers.google.com/web/updates/2019/08/get-started-with-gpu-compute-on-the-web\n\n gpuReadBuffer = this.engine.device.createBuffer({\n size: byteCount,\n usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ\n });\n encoder = this.engine.device.createCommandEncoder();\n encoder.copyBufferToBuffer(gpuBuffer, 0, gpuReadBuffer, 0, byteCount);\n queue = g_webgpu_core_es[\"isSafari\"] ? // @ts-ignore\n this.engine.device.getQueue() : this.engine.device.defaultQueue;\n queue.submit([encoder.finish()]);\n _context2.next = 12;\n return gpuReadBuffer.mapAsync(constants[\"MapMode\"].Read);\n\n case 12:\n arraybuffer = gpuReadBuffer.getMappedRange();\n typedArray = new typedArrayConstructor(arraybuffer.slice(0));\n gpuReadBuffer.unmap();\n return _context2.abrupt(\"return\", typedArray);\n\n case 16:\n return _context2.abrupt(\"return\", new Float32Array());\n\n case 17:\n case \"end\":\n return _context2.stop();\n }\n }\n }, _callee2, this);\n }));\n\n function readData() {\n return _readData.apply(this, arguments);\n }\n\n return readData;\n }()\n }, {\n key: \"run\",\n value: function run() {\n if (this.engine.currentComputePass) {\n var _this$engine$currentC;\n\n this.engine.currentComputePass.setPipeline(this.computePipeline); // this.bindGroupEntries.forEach((entry) => {\n // if (!entry.resource.buffer) {\n // // get referred kernel's output\n // const gpuBuffer = (entry.resource.refer.model as WebGPUComputeModel)\n // .outputBuffer;\n // this.vertexBuffers[entry.resource.name] = gpuBuffer;\n // entry.resource.buffer = gpuBuffer.get();\n // }\n // });\n // const bindGroup = this.engine.device.createBindGroup({\n // layout: this.computePipeline.getBindGroupLayout(0),\n // entries: this.bindGroupEntries,\n // });\n\n this.engine.currentComputePass.setBindGroup(0, this.bindGroup);\n\n (_this$engine$currentC = this.engine.currentComputePass).dispatch.apply(_this$engine$currentC, toConsumableArray_default()(this.context.dispatch));\n }\n }\n }, {\n key: \"updateBuffer\",\n value: function updateBuffer(bufferName, data) {\n var offset = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n var buffer = this.vertexBuffers[bufferName];\n\n if (buffer) {\n buffer.subData({\n data: data,\n offset: offset\n });\n }\n }\n }, {\n key: \"updateUniform\",\n value: function updateUniform(uniformName, data) {\n var layout = this.uniformGPUBufferLayout.find(function (l) {\n return l.name === uniformName;\n });\n\n if (layout) {\n this.uniformBuffer.subData({\n data: Number.isFinite(data) ? new Float32Array([data]) : new Float32Array(data),\n offset: layout.offset\n });\n }\n }\n }, {\n key: \"confirmInput\",\n value: function confirmInput(model, inputName) {\n // copy output GPUBuffer of kernel\n var inputBuffer = this.vertexBuffers[inputName];\n var outputBuffer = model.outputBuffer;\n\n if (inputBuffer && outputBuffer && inputBuffer !== outputBuffer) {\n var encoder = this.engine.device.createCommandEncoder();\n var _context$output = model.context.output,\n length = _context$output.length,\n typedArrayConstructor = _context$output.typedArrayConstructor;\n var byteCount = length * typedArrayConstructor.BYTES_PER_ELEMENT;\n encoder.copyBufferToBuffer(outputBuffer.get(), 0, inputBuffer.get(), 0, byteCount);\n var queue = g_webgpu_core_es[\"isSafari\"] ? // @ts-ignore\n this.engine.device.getQueue() : this.engine.device.defaultQueue;\n queue.submit([encoder.finish()]);\n }\n }\n }, {\n key: \"compileShaderToSpirV\",\n value: function compileShaderToSpirV(source, type, shaderVersion) {\n return this.compileRawShaderToSpirV(shaderVersion + source, type);\n }\n }, {\n key: \"compileRawShaderToSpirV\",\n value: function compileRawShaderToSpirV(source, type) {\n return this.engine.glslang.compileGLSL(source, type);\n }\n }, {\n key: \"compileComputePipelineStageDescriptor\",\n value: function () {\n var _compileComputePipelineStageDescriptor = asyncToGenerator_default()( /*#__PURE__*/regenerator_default.a.mark(function _callee3(computeCode) {\n var computeShader, shaderVersion;\n return regenerator_default.a.wrap(function _callee3$(_context3) {\n while (1) {\n switch (_context3.prev = _context3.next) {\n case 0:\n computeShader = computeCode;\n shaderVersion = '#version 450\\n';\n\n if (this.engine.options.useWGSL) {\n _context3.next = 6;\n break;\n }\n\n _context3.next = 5;\n return this.compileShaderToSpirV(computeCode, 'compute', shaderVersion);\n\n case 5:\n computeShader = _context3.sent;\n\n case 6:\n return _context3.abrupt(\"return\", {\n computeStage: {\n module: this.engine.device.createShaderModule({\n code: computeShader,\n // @ts-ignore\n isWHLSL: g_webgpu_core_es[\"isSafari\"]\n }),\n entryPoint: 'main'\n }\n });\n\n case 7:\n case \"end\":\n return _context3.stop();\n }\n }\n }, _callee3, this);\n }));\n\n function compileComputePipelineStageDescriptor(_x) {\n return _compileComputePipelineStageDescriptor.apply(this, arguments);\n }\n\n return compileComputePipelineStageDescriptor;\n }()\n }]);\n\n return WebGPUComputeModel;\n}();\n\n\n//# sourceMappingURL=WebGPUComputeModel.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-webgpu-engine/es/webgpu/WebGPUElements.js\n\n\n\n\n\nvar WebGPUElements_WebGPUElements = /*#__PURE__*/function () {\n function WebGPUElements(engine, options) {\n classCallCheck_default()(this, WebGPUElements);\n\n this.engine = engine;\n this.options = options;\n this.indexCount = void 0;\n this.buffer = void 0;\n var _options = options,\n data = _options.data,\n usage = _options.usage,\n type = _options.type,\n count = _options.count;\n this.indexCount = count || 0;\n this.buffer = new WebGPUBuffer_WebGPUBuffer(engine, {\n // @ts-ignore\n data: data instanceof Array ? new Uint16Array(data) : data,\n usage: constants[\"BufferUsage\"].Index | constants[\"BufferUsage\"].CopyDst\n });\n }\n\n createClass_default()(WebGPUElements, [{\n key: \"get\",\n value: function get() {\n return this.buffer;\n }\n }, {\n key: \"subData\",\n value: function subData(options) {\n this.buffer.subData(options);\n }\n }, {\n key: \"destroy\",\n value: function destroy() {\n this.buffer.destroy();\n }\n }]);\n\n return WebGPUElements;\n}();\n\n\n//# sourceMappingURL=WebGPUElements.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-webgpu-engine/es/webgpu/WebGPUFramebuffer.js\n\n\n\nvar WebGPUFramebuffer_WebGPUFramebuffer = /*#__PURE__*/function () {\n function WebGPUFramebuffer(engine, options) {\n classCallCheck_default()(this, WebGPUFramebuffer);\n\n this.engine = engine;\n this.options = options;\n this.colorTexture = void 0;\n this.depthTexture = void 0;\n this.width = 0;\n this.height = 0;\n var _options = options,\n width = _options.width,\n height = _options.height,\n color = _options.color,\n colors = _options.colors,\n depth = _options.depth,\n stencil = _options.stencil;\n\n if (color) {\n this.colorTexture = color;\n }\n\n if (depth) {\n this.depthTexture = depth;\n } // TODO: depth & stencil\n\n }\n\n createClass_default()(WebGPUFramebuffer, [{\n key: \"get\",\n value: function get() {\n var _this$colorTexture, _this$depthTexture;\n\n return {\n color: (_this$colorTexture = this.colorTexture) === null || _this$colorTexture === void 0 ? void 0 : _this$colorTexture.get(),\n depth: (_this$depthTexture = this.depthTexture) === null || _this$depthTexture === void 0 ? void 0 : _this$depthTexture.get()\n };\n }\n }, {\n key: \"destroy\",\n value: function destroy() {\n var _this$colorTexture2, _this$depthTexture2;\n\n (_this$colorTexture2 = this.colorTexture) === null || _this$colorTexture2 === void 0 ? void 0 : _this$colorTexture2.destroy();\n (_this$depthTexture2 = this.depthTexture) === null || _this$depthTexture2 === void 0 ? void 0 : _this$depthTexture2.destroy();\n }\n }, {\n key: \"resize\",\n value: function resize(_ref) {\n var width = _ref.width,\n height = _ref.height;\n\n if (width !== this.width || height !== this.height) {\n var _this$colorTexture3, _this$depthTexture3;\n\n (_this$colorTexture3 = this.colorTexture) === null || _this$colorTexture3 === void 0 ? void 0 : _this$colorTexture3.resize({\n width: width,\n height: height\n });\n (_this$depthTexture3 = this.depthTexture) === null || _this$depthTexture3 === void 0 ? void 0 : _this$depthTexture3.resize({\n width: width,\n height: height\n });\n }\n\n this.width = width;\n this.height = height;\n }\n }]);\n\n return WebGPUFramebuffer;\n}();\n\n\n//# sourceMappingURL=WebGPUFramebuffer.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-webgpu-engine/es/webgpu/constants.js\n\n\nvar constants_primitiveMap, constants_depthFuncMap, constants_blendEquationMap, constants_blendFuncMap, constants_formatMap, constants_filterMap, constants_wrapModeMap;\n\n\n // WebGPU 不支持 LINE_LOOP & TRIANGLE_FAN\n\nvar webgpu_constants_primitiveMap = (constants_primitiveMap = {}, defineProperty_default()(constants_primitiveMap, g_webgpu_core_es[\"gl\"].POINTS, constants[\"PrimitiveTopology\"].PointList), defineProperty_default()(constants_primitiveMap, g_webgpu_core_es[\"gl\"].LINES, constants[\"PrimitiveTopology\"].LineList), defineProperty_default()(constants_primitiveMap, g_webgpu_core_es[\"gl\"].LINE_LOOP, constants[\"PrimitiveTopology\"].LineList), defineProperty_default()(constants_primitiveMap, g_webgpu_core_es[\"gl\"].LINE_STRIP, constants[\"PrimitiveTopology\"].LineStrip), defineProperty_default()(constants_primitiveMap, g_webgpu_core_es[\"gl\"].TRIANGLES, constants[\"PrimitiveTopology\"].TriangleList), defineProperty_default()(constants_primitiveMap, g_webgpu_core_es[\"gl\"].TRIANGLE_FAN, constants[\"PrimitiveTopology\"].TriangleList), defineProperty_default()(constants_primitiveMap, g_webgpu_core_es[\"gl\"].TRIANGLE_STRIP, constants[\"PrimitiveTopology\"].TriangleStrip), constants_primitiveMap);\nvar webgpu_constants_depthFuncMap = (constants_depthFuncMap = {}, defineProperty_default()(constants_depthFuncMap, g_webgpu_core_es[\"gl\"].NEVER, constants[\"CompareFunction\"].Never), defineProperty_default()(constants_depthFuncMap, g_webgpu_core_es[\"gl\"].ALWAYS, constants[\"CompareFunction\"].Always), defineProperty_default()(constants_depthFuncMap, g_webgpu_core_es[\"gl\"].LESS, constants[\"CompareFunction\"].Less), defineProperty_default()(constants_depthFuncMap, g_webgpu_core_es[\"gl\"].LEQUAL, constants[\"CompareFunction\"].LessEqual), defineProperty_default()(constants_depthFuncMap, g_webgpu_core_es[\"gl\"].GREATER, constants[\"CompareFunction\"].Greater), defineProperty_default()(constants_depthFuncMap, g_webgpu_core_es[\"gl\"].GEQUAL, constants[\"CompareFunction\"].GreaterEqual), defineProperty_default()(constants_depthFuncMap, g_webgpu_core_es[\"gl\"].EQUAL, constants[\"CompareFunction\"].Equal), defineProperty_default()(constants_depthFuncMap, g_webgpu_core_es[\"gl\"].NOTEQUAL, constants[\"CompareFunction\"].NotEqual), constants_depthFuncMap);\nvar webgpu_constants_blendEquationMap = (constants_blendEquationMap = {}, defineProperty_default()(constants_blendEquationMap, g_webgpu_core_es[\"gl\"].FUNC_ADD, constants[\"BlendOperation\"].Add), defineProperty_default()(constants_blendEquationMap, g_webgpu_core_es[\"gl\"].MIN_EXT, constants[\"BlendOperation\"].Min), defineProperty_default()(constants_blendEquationMap, g_webgpu_core_es[\"gl\"].MAX_EXT, constants[\"BlendOperation\"].Max), defineProperty_default()(constants_blendEquationMap, g_webgpu_core_es[\"gl\"].FUNC_SUBTRACT, constants[\"BlendOperation\"].Subtract), defineProperty_default()(constants_blendEquationMap, g_webgpu_core_es[\"gl\"].FUNC_REVERSE_SUBTRACT, constants[\"BlendOperation\"].ReverseSubtract), constants_blendEquationMap); // @see https://gpuweb.github.io/gpuweb/#blend-state\n// 不支持 'constant alpha' 和 'one minus constant alpha'\n\nvar webgpu_constants_blendFuncMap = (constants_blendFuncMap = {}, defineProperty_default()(constants_blendFuncMap, g_webgpu_core_es[\"gl\"].ZERO, constants[\"BlendFactor\"].Zero), defineProperty_default()(constants_blendFuncMap, g_webgpu_core_es[\"gl\"].ONE, constants[\"BlendFactor\"].One), defineProperty_default()(constants_blendFuncMap, g_webgpu_core_es[\"gl\"].SRC_COLOR, constants[\"BlendFactor\"].SrcColor), defineProperty_default()(constants_blendFuncMap, g_webgpu_core_es[\"gl\"].ONE_MINUS_SRC_COLOR, constants[\"BlendFactor\"].OneMinusSrcColor), defineProperty_default()(constants_blendFuncMap, g_webgpu_core_es[\"gl\"].SRC_ALPHA, constants[\"BlendFactor\"].SrcAlpha), defineProperty_default()(constants_blendFuncMap, g_webgpu_core_es[\"gl\"].ONE_MINUS_SRC_ALPHA, constants[\"BlendFactor\"].OneMinusSrcAlpha), defineProperty_default()(constants_blendFuncMap, g_webgpu_core_es[\"gl\"].DST_COLOR, constants[\"BlendFactor\"].DstColor), defineProperty_default()(constants_blendFuncMap, g_webgpu_core_es[\"gl\"].ONE_MINUS_DST_COLOR, constants[\"BlendFactor\"].OneMinusDstColor), defineProperty_default()(constants_blendFuncMap, g_webgpu_core_es[\"gl\"].DST_ALPHA, constants[\"BlendFactor\"].DstAlpha), defineProperty_default()(constants_blendFuncMap, g_webgpu_core_es[\"gl\"].ONE_MINUS_DST_ALPHA, constants[\"BlendFactor\"].OneMinusDstAlpha), defineProperty_default()(constants_blendFuncMap, g_webgpu_core_es[\"gl\"].CONSTANT_COLOR, constants[\"BlendFactor\"].BlendColor), defineProperty_default()(constants_blendFuncMap, g_webgpu_core_es[\"gl\"].ONE_MINUS_CONSTANT_COLOR, constants[\"BlendFactor\"].OneMinusBlendColor), defineProperty_default()(constants_blendFuncMap, g_webgpu_core_es[\"gl\"].SRC_ALPHA_SATURATE, constants[\"BlendFactor\"].SrcAlphaSaturated), constants_blendFuncMap); // @see https://gpuweb.github.io/gpuweb/#texture-formats\n\nvar webgpu_constants_formatMap = (constants_formatMap = {}, defineProperty_default()(constants_formatMap, g_webgpu_core_es[\"gl\"].ALPHA, 'r8unorm'), defineProperty_default()(constants_formatMap, g_webgpu_core_es[\"gl\"].RGBA, 'rgba8unorm'), defineProperty_default()(constants_formatMap, g_webgpu_core_es[\"gl\"].DEPTH_COMPONENT, 'depth32float'), defineProperty_default()(constants_formatMap, g_webgpu_core_es[\"gl\"].DEPTH_STENCIL, 'depth24plus-stencil8'), constants_formatMap); // @see https://gpuweb.github.io/gpuweb/#enumdef-gpufiltermode\n\nvar webgpu_constants_filterMap = (constants_filterMap = {}, defineProperty_default()(constants_filterMap, g_webgpu_core_es[\"gl\"].NEAREST, 'nearest'), defineProperty_default()(constants_filterMap, g_webgpu_core_es[\"gl\"].LINEAR, 'linear'), constants_filterMap); // @see https://gpuweb.github.io/gpuweb/#enumdef-gpuaddressmode\n\nvar webgpu_constants_wrapModeMap = (constants_wrapModeMap = {}, defineProperty_default()(constants_wrapModeMap, g_webgpu_core_es[\"gl\"].REPEAT, 'repeat'), defineProperty_default()(constants_wrapModeMap, g_webgpu_core_es[\"gl\"].CLAMP_TO_EDGE, 'clamp-to-edge'), defineProperty_default()(constants_wrapModeMap, g_webgpu_core_es[\"gl\"].MIRRORED_REPEAT, 'mirror-repeat'), constants_wrapModeMap);\nfunction getCullMode(_ref) {\n var cull = _ref.cull;\n\n if (!cull || !cull.enable) {\n return constants[\"CullMode\"].None;\n }\n\n if (cull.face) {\n return cull.face === g_webgpu_core_es[\"gl\"].FRONT ? constants[\"CullMode\"].Front : constants[\"CullMode\"].Back;\n }\n}\nfunction getDepthStencilStateDescriptor(_ref2) {\n var depth = _ref2.depth,\n stencil = _ref2.stencil;\n // TODO: stencil\n var stencilFrontBack = {\n compare: constants[\"CompareFunction\"].Always,\n depthFailOp: constants[\"StencilOperation\"].Keep,\n failOp: constants[\"StencilOperation\"].Keep,\n passOp: constants[\"StencilOperation\"].Keep\n };\n return {\n depthWriteEnabled: depth && depth.enable,\n depthCompare: webgpu_constants_depthFuncMap[(depth === null || depth === void 0 ? void 0 : depth.func) || g_webgpu_core_es[\"gl\"].ALWAYS],\n format: constants[\"TextureFormat\"].Depth24PlusStencil8,\n stencilFront: stencilFrontBack,\n stencilBack: stencilFrontBack,\n stencilReadMask: 0xffffffff,\n stencilWriteMask: 0xffffffff\n };\n}\n/**\n * @see https://gpuweb.github.io/gpuweb/#color-state\n */\n\nfunction getColorStateDescriptors(_ref3, swapChainFormat) {\n var blend = _ref3.blend;\n return [{\n format: swapChainFormat,\n // https://gpuweb.github.io/gpuweb/#blend-state\n alphaBlend: {\n srcFactor: webgpu_constants_blendFuncMap[blend && blend.func && blend.func.srcAlpha || g_webgpu_core_es[\"gl\"].ONE],\n dstFactor: webgpu_constants_blendFuncMap[blend && blend.func && blend.func.dstAlpha || g_webgpu_core_es[\"gl\"].ZERO],\n operation: webgpu_constants_blendEquationMap[blend && blend.equation && blend.equation.alpha || g_webgpu_core_es[\"gl\"].FUNC_ADD]\n },\n colorBlend: {\n srcFactor: webgpu_constants_blendFuncMap[blend && blend.func && blend.func.srcRGB || g_webgpu_core_es[\"gl\"].ONE],\n dstFactor: webgpu_constants_blendFuncMap[blend && blend.func && blend.func.dstRGB || g_webgpu_core_es[\"gl\"].ZERO],\n operation: webgpu_constants_blendEquationMap[blend && blend.equation && blend.equation.rgb || g_webgpu_core_es[\"gl\"].FUNC_ADD]\n },\n writeMask: constants[\"ColorWrite\"].All\n }];\n}\n//# sourceMappingURL=constants.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-webgpu-engine/es/webgpu/WebGPUModel.js\n\n\n\n\n\n\n\n\nfunction WebGPUModel_ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }\n\nfunction WebGPUModel_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { WebGPUModel_ownKeys(Object(source), true).forEach(function (key) { defineProperty_default()(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { WebGPUModel_ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\n\n\n\n\n\n\n// @ts-ignore\nfunction concatenate(resultConstructor) {\n var totalLength = 0;\n\n for (var _len = arguments.length, arrays = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n arrays[_key - 1] = arguments[_key];\n }\n\n for (var _i = 0, _arrays = arrays; _i < _arrays.length; _i++) {\n var arr = _arrays[_i];\n totalLength += arr.length;\n }\n\n var result = new resultConstructor(totalLength);\n var offset = 0;\n\n for (var _i2 = 0, _arrays2 = arrays; _i2 < _arrays2.length; _i2++) {\n var _arr = _arrays2[_i2];\n result.set(_arr, offset);\n offset += _arr.length;\n }\n\n return result;\n}\n\nvar WebGPUModel_WebGPUModel = /*#__PURE__*/function () {\n /**\n * 用于后续渲染时动态更新\n */\n\n /**\n * vertex\n */\n\n /**\n * indices's buffer\n */\n function WebGPUModel(engine, options) {\n classCallCheck_default()(this, WebGPUModel);\n\n this.engine = engine;\n this.options = options;\n this.pipelineLayout = void 0;\n this.renderPipeline = void 0;\n this.uniformsBindGroupLayout = void 0;\n this.uniformBindGroup = void 0;\n this.uniformBuffer = void 0;\n this.uniforms = {};\n this.uniformGPUBufferLayout = [];\n this.attributeCache = {};\n this.indexBuffer = void 0;\n this.indexCount = void 0;\n }\n\n createClass_default()(WebGPUModel, [{\n key: \"init\",\n value: function () {\n var _init = asyncToGenerator_default()( /*#__PURE__*/regenerator_default.a.mark(function _callee() {\n var _this = this;\n\n var _this$options, vs, fs, attributes, uniforms, primitive, count, elements, depth, blend, stencil, cull, instances, _yield$this$compilePi, vertexStage, fragmentStage, vertexState, descriptor;\n\n return regenerator_default.a.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n _this$options = this.options, vs = _this$options.vs, fs = _this$options.fs, attributes = _this$options.attributes, uniforms = _this$options.uniforms, primitive = _this$options.primitive, count = _this$options.count, elements = _this$options.elements, depth = _this$options.depth, blend = _this$options.blend, stencil = _this$options.stencil, cull = _this$options.cull, instances = _this$options.instances; // build shaders first\n\n _context.next = 3;\n return this.compilePipelineStageDescriptor(vs, fs, null);\n\n case 3:\n _yield$this$compilePi = _context.sent;\n vertexStage = _yield$this$compilePi.vertexStage;\n fragmentStage = _yield$this$compilePi.fragmentStage;\n\n if (uniforms) {\n // create uniform bind groups & layout\n this.buildUniformBindGroup(uniforms);\n }\n\n if (elements) {\n this.indexBuffer = elements.get();\n this.indexCount = elements.indexCount;\n } // TODO: instanced array\n\n\n vertexState = {\n vertexBuffers: Object.keys(attributes).map(function (attributeName, i) {\n var attribute = attributes[attributeName];\n\n var _attribute$get = attribute.get(),\n arrayStride = _attribute$get.arrayStride,\n stepMode = _attribute$get.stepMode,\n ats = _attribute$get.attributes;\n\n _this.attributeCache[attributeName] = attribute;\n return {\n arrayStride: arrayStride,\n stepMode: stepMode,\n attributes: ats\n };\n })\n };\n descriptor = {\n sampleCount: this.engine.mainPassSampleCount,\n primitiveTopology: webgpu_constants_primitiveMap[primitive || g_webgpu_core_es[\"gl\"].TRIANGLES],\n rasterizationState: WebGPUModel_objectSpread(WebGPUModel_objectSpread({}, this.getDefaultRasterizationStateDescriptor()), {}, {\n // TODO: support frontface\n cullMode: getCullMode({\n cull: cull\n })\n }),\n depthStencilState: getDepthStencilStateDescriptor({\n depth: depth,\n stencil: stencil\n }),\n colorStates: getColorStateDescriptors({\n blend: blend\n }, this.engine.options.swapChainFormat),\n layout: this.pipelineLayout,\n vertexStage: vertexStage,\n fragmentStage: fragmentStage,\n vertexState: vertexState\n }; // create pipeline\n\n this.renderPipeline = this.engine.device.createRenderPipeline(descriptor);\n\n case 11:\n case \"end\":\n return _context.stop();\n }\n }\n }, _callee, this);\n }));\n\n function init() {\n return _init.apply(this, arguments);\n }\n\n return init;\n }()\n }, {\n key: \"addUniforms\",\n value: function addUniforms(uniforms) {\n this.uniforms = WebGPUModel_objectSpread(WebGPUModel_objectSpread({}, this.uniforms), extractUniforms(uniforms));\n }\n }, {\n key: \"draw\",\n value: function draw(options) {\n var _this2 = this;\n\n var renderPass = this.engine.getCurrentRenderPass();\n\n var uniforms = WebGPUModel_objectSpread(WebGPUModel_objectSpread({}, this.uniforms), extractUniforms(options.uniforms || {}));\n\n var bindGroupBindings = []; // TODO: uniform 发生修改\n\n Object.keys(uniforms).forEach(function (uniformName) {\n var type = typeof_default()(uniforms[uniformName]);\n\n if (type === 'boolean' || type === 'number' || Array.isArray(uniforms[uniformName]) || // @ts-ignore\n uniforms[uniformName].BYTES_PER_ELEMENT) {\n var _this2$uniformGPUBuff;\n\n var offset = (_this2$uniformGPUBuff = _this2.uniformGPUBufferLayout.find(function (_ref) {\n var name = _ref.name;\n return name === uniformName;\n })) === null || _this2$uniformGPUBuff === void 0 ? void 0 : _this2$uniformGPUBuff.offset;\n\n if (offset !== null) {\n _this2.uniformBuffer.subData({\n // @ts-ignore\n data: uniforms[uniformName],\n // @ts-ignore\n offset: offset\n });\n }\n } else {\n var _this2$uniformGPUBuff2;\n\n var _offset = (_this2$uniformGPUBuff2 = _this2.uniformGPUBufferLayout.find(function (_ref2) {\n var name = _ref2.name;\n return name === uniformName;\n })) === null || _this2$uniformGPUBuff2 === void 0 ? void 0 : _this2$uniformGPUBuff2.offset;\n\n if (_offset !== null) {\n var textureOrFramebuffer = uniforms[uniformName].get();\n\n var _ref3 = // @ts-ignore\n textureOrFramebuffer.color || textureOrFramebuffer,\n texture = _ref3.texture,\n sampler = _ref3.sampler;\n\n if (sampler) {\n bindGroupBindings.push({\n // @ts-ignore\n binding: _offset,\n resource: sampler\n }); // @ts-ignore\n\n _offset++;\n }\n\n bindGroupBindings.push({\n // @ts-ignore\n binding: _offset,\n resource: texture.createView()\n });\n }\n }\n });\n\n if (this.uniformBuffer) {\n bindGroupBindings[0] = {\n binding: 0,\n resource: {\n buffer: this.uniformBuffer.get() // 返回 GPUBuffer 原生对象\n\n }\n };\n }\n\n this.uniformBindGroup = this.engine.device.createBindGroup({\n layout: this.uniformsBindGroupLayout,\n entries: bindGroupBindings\n });\n\n if (this.renderPipeline) {\n renderPass.setPipeline(this.renderPipeline);\n }\n\n renderPass.setBindGroup(0, this.uniformBindGroup);\n\n if (this.indexBuffer) {\n renderPass.setIndexBuffer(this.indexBuffer.get(), constants[\"IndexFormat\"].Uint32, 0);\n }\n\n Object.keys(this.attributeCache).forEach(function (attributeName, i) {\n renderPass.setVertexBuffer(0 + i, _this2.attributeCache[attributeName].get().buffer, 0);\n }); // renderPass.draw(verticesCount, instancesCount, verticesStart, 0);\n\n if (this.indexBuffer) {\n renderPass.drawIndexed(this.indexCount, this.options.instances || 1, 0, 0, 0);\n } else {\n renderPass.draw(this.options.count || 0, this.options.instances || 0, 0, 0);\n }\n }\n }, {\n key: \"destroy\",\n value: function destroy() {\n throw new Error('Method not implemented.');\n }\n }, {\n key: \"compilePipelineStageDescriptor\",\n value: function () {\n var _compilePipelineStageDescriptor = asyncToGenerator_default()( /*#__PURE__*/regenerator_default.a.mark(function _callee2(vertexCode, fragmentCode, defines) {\n var shaderVersion, vertexShader, fragmentShader;\n return regenerator_default.a.wrap(function _callee2$(_context2) {\n while (1) {\n switch (_context2.prev = _context2.next) {\n case 0:\n shaderVersion = '#version 450\\n';\n vertexShader = vertexCode;\n fragmentShader = fragmentCode;\n\n if (this.engine.options.useWGSL) {\n _context2.next = 10;\n break;\n }\n\n _context2.next = 6;\n return this.compileShaderToSpirV(vertexCode, 'vertex', shaderVersion);\n\n case 6:\n vertexShader = _context2.sent;\n _context2.next = 9;\n return this.compileShaderToSpirV(fragmentCode, 'fragment', shaderVersion);\n\n case 9:\n fragmentShader = _context2.sent;\n\n case 10:\n return _context2.abrupt(\"return\", this.createPipelineStageDescriptor(vertexShader, fragmentShader));\n\n case 11:\n case \"end\":\n return _context2.stop();\n }\n }\n }, _callee2, this);\n }));\n\n function compilePipelineStageDescriptor(_x, _x2, _x3) {\n return _compilePipelineStageDescriptor.apply(this, arguments);\n }\n\n return compilePipelineStageDescriptor;\n }()\n }, {\n key: \"compileShaderToSpirV\",\n value: function compileShaderToSpirV(source, type, shaderVersion) {\n return this.compileRawShaderToSpirV(shaderVersion + source, type);\n }\n }, {\n key: \"compileRawShaderToSpirV\",\n value: function compileRawShaderToSpirV(source, type) {\n return this.engine.glslang.compileGLSL(source, type);\n }\n }, {\n key: \"createPipelineStageDescriptor\",\n value: function createPipelineStageDescriptor(vertexShader, fragmentShader) {\n return {\n vertexStage: {\n module: this.engine.device.createShaderModule({\n code: vertexShader,\n // @ts-ignore\n isWHLSL: g_webgpu_core_es[\"isSafari\"]\n }),\n entryPoint: 'main'\n },\n fragmentStage: {\n module: this.engine.device.createShaderModule({\n code: fragmentShader,\n // @ts-ignore\n isWHLSL: g_webgpu_core_es[\"isSafari\"]\n }),\n entryPoint: 'main'\n }\n };\n }\n /**\n * @see https://gpuweb.github.io/gpuweb/#rasterization-state\n */\n\n }, {\n key: \"getDefaultRasterizationStateDescriptor\",\n value: function getDefaultRasterizationStateDescriptor() {\n return {\n frontFace: constants[\"FrontFace\"].CCW,\n cullMode: constants[\"CullMode\"].None,\n depthBias: 0,\n depthBiasSlopeScale: 0,\n depthBiasClamp: 0\n };\n }\n }, {\n key: \"buildUniformBindGroup\",\n value: function buildUniformBindGroup(uniforms) {\n var _this3 = this;\n\n var offset = 0; // FIXME: 所有 uniform 合并成一个 buffer,固定使用 Float32Array 存储,确实会造成一些内存的浪费\n\n var mergedUniformData = concatenate.apply(void 0, [Float32Array].concat(toConsumableArray_default()(Object.keys(uniforms).map(function (uniformName) {\n if (uniforms[uniformName]) {\n _this3.uniformGPUBufferLayout.push({\n name: uniformName,\n offset: offset\n }); // @ts-ignore\n\n\n offset += (uniforms[uniformName].length || 1) * 4;\n return uniforms[uniformName];\n } else {\n // texture & framebuffer\n return [];\n }\n }))));\n var entries = [];\n var hasUniform = false;\n\n if (mergedUniformData.length) {\n hasUniform = true; // TODO: 所有 uniform 绑定到 slot 0,通过解析 Shader 代码判定可见性\n\n entries.push({\n // TODO: 暂时都绑定到 slot 0\n binding: 0,\n visibility: constants[\"ShaderStage\"].Fragment | constants[\"ShaderStage\"].Vertex,\n // TODO: 暂时 VS 和 FS 都可见\n type: constants[\"BindingType\"].UniformBuffer\n });\n } // 声明 texture & sampler\n\n\n Object.keys(uniforms).filter(function (uniformName) {\n return uniforms[uniformName] === null;\n }).forEach(function (uniformName, i) {\n _this3.uniformGPUBufferLayout.push({\n name: uniformName,\n offset: i * 2 + (hasUniform ? 1 : 0)\n });\n\n entries.push({\n // Sampler\n binding: i * 2 + (hasUniform ? 1 : 0),\n visibility: constants[\"ShaderStage\"].Fragment,\n type: constants[\"BindingType\"].Sampler\n }, {\n // Texture view\n binding: i * 2 + (hasUniform ? 1 : 0) + 1,\n visibility: constants[\"ShaderStage\"].Fragment,\n type: constants[\"BindingType\"].SampledTexture\n });\n });\n this.uniformsBindGroupLayout = this.engine.device.createBindGroupLayout({\n // 最新 API 0.0.22 版本使用 entries。Chrome Canary 84.0.4110.0 已实现。\n // 使用 bindings 会报 Warning: GPUBindGroupLayoutDescriptor.bindings is deprecated: renamed to entries\n // @see https://github.com/antvis/GWebGPUEngine/issues/5\n entries: entries\n });\n this.pipelineLayout = this.engine.device.createPipelineLayout({\n bindGroupLayouts: [this.uniformsBindGroupLayout]\n });\n\n if (hasUniform) {\n this.uniformBuffer = new WebGPUBuffer_WebGPUBuffer(this.engine, {\n // TODO: 处理 Struct 和 boolean\n // @ts-ignore\n data: mergedUniformData instanceof Array ? // @ts-ignore\n new Float32Array(mergedUniformData) : mergedUniformData,\n usage: constants[\"BufferUsage\"].Uniform | constants[\"BufferUsage\"].CopyDst\n });\n }\n }\n }]);\n\n return WebGPUModel;\n}();\n\n\n//# sourceMappingURL=WebGPUModel.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-webgpu-engine/es/webgpu/WebGPUTexture2D.js\n\n\n\n\n\n/**\n * adaptor for regl.Buffer\n * @see https://github.com/regl-project/regl/blob/gh-pages/API.md#buffers\n */\n\nvar WebGPUTexture2D_WebGPUTexture2D = /*#__PURE__*/function () {\n function WebGPUTexture2D(engine, options) {\n classCallCheck_default()(this, WebGPUTexture2D);\n\n this.engine = engine;\n this.options = options;\n this.texture = void 0;\n this.sampler = void 0;\n this.width = void 0;\n this.height = void 0;\n this.createTexture();\n }\n\n createClass_default()(WebGPUTexture2D, [{\n key: \"get\",\n value: function get() {\n return {\n texture: this.texture,\n sampler: this.sampler\n };\n }\n }, {\n key: \"update\",\n value: function update() {// TODO\n }\n }, {\n key: \"resize\",\n value: function resize(_ref) {\n var width = _ref.width,\n height = _ref.height;\n\n // TODO: it seems that Texture doesn't support `resize`\n if (width !== this.width || height !== this.height) {\n this.destroy();\n this.createTexture();\n }\n\n this.width = width;\n this.height = height;\n }\n }, {\n key: \"destroy\",\n value: function destroy() {\n if (this.texture) {\n this.texture.destroy();\n }\n }\n }, {\n key: \"createTexture\",\n value: function createTexture() {\n var _this$options = this.options,\n data = _this$options.data,\n _this$options$type = _this$options.type,\n type = _this$options$type === void 0 ? g_webgpu_core_es[\"gl\"].UNSIGNED_BYTE : _this$options$type,\n width = _this$options.width,\n height = _this$options.height,\n _this$options$flipY = _this$options.flipY,\n flipY = _this$options$flipY === void 0 ? false : _this$options$flipY,\n _this$options$format = _this$options.format,\n format = _this$options$format === void 0 ? g_webgpu_core_es[\"gl\"].RGBA : _this$options$format,\n _this$options$mipmap = _this$options.mipmap,\n mipmap = _this$options$mipmap === void 0 ? false : _this$options$mipmap,\n _this$options$wrapS = _this$options.wrapS,\n wrapS = _this$options$wrapS === void 0 ? g_webgpu_core_es[\"gl\"].CLAMP_TO_EDGE : _this$options$wrapS,\n _this$options$wrapT = _this$options.wrapT,\n wrapT = _this$options$wrapT === void 0 ? g_webgpu_core_es[\"gl\"].CLAMP_TO_EDGE : _this$options$wrapT,\n _this$options$aniso = _this$options.aniso,\n aniso = _this$options$aniso === void 0 ? 0 : _this$options$aniso,\n _this$options$alignme = _this$options.alignment,\n alignment = _this$options$alignme === void 0 ? 1 : _this$options$alignme,\n _this$options$premult = _this$options.premultiplyAlpha,\n premultiplyAlpha = _this$options$premult === void 0 ? false : _this$options$premult,\n _this$options$mag = _this$options.mag,\n mag = _this$options$mag === void 0 ? g_webgpu_core_es[\"gl\"].NEAREST : _this$options$mag,\n _this$options$min = _this$options.min,\n min = _this$options$min === void 0 ? g_webgpu_core_es[\"gl\"].NEAREST : _this$options$min,\n _this$options$colorSp = _this$options.colorSpace,\n colorSpace = _this$options$colorSp === void 0 ? g_webgpu_core_es[\"gl\"].BROWSER_DEFAULT_WEBGL : _this$options$colorSp,\n usage = _this$options.usage;\n this.width = width;\n this.height = height;\n this.texture = this.engine.device.createTexture({\n size: [width, height, 1],\n // TODO: arrayLayerCount is deprecated: use size.depth\n // arrayLayerCount: 1,\n mipLevelCount: 1,\n // TODO: https://gpuweb.github.io/gpuweb/#dom-gputextureviewdescriptor-miplevelcount\n sampleCount: 1,\n dimension: constants[\"TextureDimension\"].E2d,\n format: webgpu_constants_formatMap[format],\n // could throw texture binding usage mismatch\n usage: usage || constants[\"TextureUsage\"].Sampled | constants[\"TextureUsage\"].CopyDst\n });\n\n if (!usage || usage & constants[\"TextureUsage\"].Sampled) {\n this.sampler = this.engine.device.createSampler({\n addressModeU: webgpu_constants_wrapModeMap[wrapS],\n addressModeV: webgpu_constants_wrapModeMap[wrapT],\n addressModeW: webgpu_constants_wrapModeMap[wrapS],\n // TODO: same as addressModeU\n magFilter: webgpu_constants_filterMap[mag],\n minFilter: webgpu_constants_filterMap[min],\n maxAnisotropy: aniso // @see https://gpuweb.github.io/gpuweb/#dom-gpusamplerdescriptor-maxanisotropy\n\n });\n }\n }\n }]);\n\n return WebGPUTexture2D;\n}();\n\n\n//# sourceMappingURL=WebGPUTexture2D.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-webgpu-engine/es/webgpu/index.js\n\n\n\n\n\nvar webgpu_dec, webgpu_class, webgpu_temp;\n\n/**\n * implements renderService with WebGPU API\n * @see https://webgpu.io/\n * @see https://github.com/BabylonJS/Babylon.js/blob/WebGPU/src/Engines/webgpuEngine.ts\n */\n // import { Glslang } from '@webgpu/glslang/dist/web-devel/glslang.onefile';\n\n\n\n\n\n\n\n\n\n\n\nvar webgpu_WebGPUEngine = (webgpu_dec = Object(inversify[\"injectable\"])(), webgpu_dec(webgpu_class = (webgpu_temp = /*#__PURE__*/function () {\n function WebGPUEngine() {\n var _this = this;\n\n classCallCheck_default()(this, WebGPUEngine);\n\n this.supportWebGPU = true;\n this.useWGSL = false;\n this.options = void 0;\n this.canvas = void 0;\n this.context = void 0;\n this.glslang = void 0;\n this.adapter = void 0;\n this.device = void 0;\n this.swapChain = void 0;\n this.mainPassSampleCount = void 0;\n this.mainTexture = void 0;\n this.depthTexture = void 0;\n this.mainColorAttachments = void 0;\n this.mainTextureExtends = void 0;\n this.mainDepthAttachment = void 0;\n this.uploadEncoder = void 0;\n this.renderEncoder = void 0;\n this.computeEncoder = void 0;\n this.renderTargetEncoder = void 0;\n this.commandBuffers = new Array(4).fill(undefined);\n this.currentRenderPass = null;\n this.mainRenderPass = null;\n this.currentRenderTargetViewDescriptor = void 0;\n this.currentComputePass = null;\n this.bundleEncoder = void 0;\n this.tempBuffers = [];\n this.currentRenderTarget = null;\n this.uploadEncoderDescriptor = {\n label: 'upload'\n };\n this.renderEncoderDescriptor = {\n label: 'render'\n };\n this.renderTargetEncoderDescriptor = {\n label: 'renderTarget'\n };\n this.computeEncoderDescriptor = {\n label: 'compute'\n };\n this.pipelines = {};\n this.computePipelines = {};\n this.defaultSampleCount = 4;\n this.clearDepthValue = 1;\n this.clearStencilValue = 0;\n this.transientViewport = {\n x: Infinity,\n y: 0,\n width: 0,\n height: 0\n };\n this.cachedViewport = {\n x: 0,\n y: 0,\n width: 0,\n height: 0\n };\n\n this.clear = function (options) {\n var framebuffer = options.framebuffer,\n color = options.color,\n depth = options.depth,\n stencil = options.stencil;\n\n if (_this.options.supportCompute) {\n _this.startComputePass();\n } // We need to recreate the render pass so that the new parameters for clear color / depth / stencil are taken into account\n\n\n if (_this.currentRenderTarget) {\n if (_this.currentRenderPass) {\n _this.endRenderTargetRenderPass();\n }\n\n _this.startRenderTargetRenderPass(_this.currentRenderTarget, color ? color : null, !!depth, !!stencil);\n } else {\n // if (this.useReverseDepthBuffer) {\n // this._depthCullingState.depthFunc = Constants.GREATER;\n // }\n _this.mainColorAttachments[0].loadValue = color ? color : constants[\"LoadOp\"].Load;\n _this.mainDepthAttachment.depthLoadValue = depth ? depth : constants[\"LoadOp\"].Load;\n _this.mainDepthAttachment.stencilLoadValue = stencil ? _this.clearStencilValue : constants[\"LoadOp\"].Load;\n\n if (_this.mainRenderPass) {\n _this.endMainRenderPass();\n }\n\n _this.startMainRenderPass();\n }\n };\n\n this.createModel = /*#__PURE__*/function () {\n var _ref = asyncToGenerator_default()( /*#__PURE__*/regenerator_default.a.mark(function _callee(options) {\n var model;\n return regenerator_default.a.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n model = new WebGPUModel_WebGPUModel(_this, options);\n _context.next = 3;\n return model.init();\n\n case 3:\n return _context.abrupt(\"return\", model);\n\n case 4:\n case \"end\":\n return _context.stop();\n }\n }\n }, _callee);\n }));\n\n return function (_x) {\n return _ref.apply(this, arguments);\n };\n }();\n\n this.createAttribute = function (options) {\n return new WebGPUAttribute_WebGPUAttribute(_this, options);\n };\n\n this.createBuffer = function (options) {\n return new WebGPUBuffer_WebGPUBuffer(_this, options);\n };\n\n this.createElements = function (options) {\n return new WebGPUElements_WebGPUElements(_this, options);\n };\n\n this.createTexture2D = function (options) {\n return new WebGPUTexture2D_WebGPUTexture2D(_this, options);\n };\n\n this.createFramebuffer = function (options) {\n return new WebGPUFramebuffer_WebGPUFramebuffer(_this, options);\n };\n\n this.useFramebuffer = function (framebuffer, drawCommands) {\n // bind\n if (_this.currentRenderTarget) {\n _this.unbindFramebuffer(_this.currentRenderTarget);\n }\n\n _this.currentRenderTarget = framebuffer; // TODO: use mipmap options in framebuffer\n\n _this.currentRenderTargetViewDescriptor = {\n dimension: constants[\"TextureViewDimension\"].E2d,\n // mipLevelCount: bindWithMipMaps ? WebGPUTextureHelper.computeNumMipmapLevels(texture.width, texture.height) - lodLevel : 1,\n // baseArrayLayer: faceIndex,\n // baseMipLevel: lodLevel,\n arrayLayerCount: 1,\n aspect: constants[\"TextureAspect\"].All\n };\n _this.currentRenderPass = null;\n drawCommands();\n };\n\n this.createComputeModel = /*#__PURE__*/function () {\n var _ref2 = asyncToGenerator_default()( /*#__PURE__*/regenerator_default.a.mark(function _callee2(context) {\n var model;\n return regenerator_default.a.wrap(function _callee2$(_context2) {\n while (1) {\n switch (_context2.prev = _context2.next) {\n case 0:\n model = new WebGPUComputeModel_WebGPUComputeModel(_this, context);\n _context2.next = 3;\n return model.init();\n\n case 3:\n return _context2.abrupt(\"return\", model);\n\n case 4:\n case \"end\":\n return _context2.stop();\n }\n }\n }, _callee2);\n }));\n\n return function (_x2) {\n return _ref2.apply(this, arguments);\n };\n }();\n\n this.getCanvas = function () {\n return _this.canvas;\n };\n\n this.getGLContext = function () {\n throw new Error('Method not implemented.');\n };\n\n this.viewport = function (_ref3) {\n var x = _ref3.x,\n y = _ref3.y,\n width = _ref3.width,\n height = _ref3.height;\n\n if (!_this.currentRenderPass) {\n // call viewport() before current render pass created\n _this.transientViewport = {\n x: x,\n y: y,\n width: width,\n height: height\n };\n } else if (_this.transientViewport.x !== Infinity) {\n var renderPass = _this.getCurrentRenderPass(); // @see https://gpuweb.github.io/gpuweb/#dom-gpurenderpassencoder-setviewport\n\n\n renderPass.setViewport(_this.transientViewport.x, _this.transientViewport.y, _this.transientViewport.width, _this.transientViewport.height, 0, 1);\n } else if (x !== _this.cachedViewport.x || y !== _this.cachedViewport.y || width !== _this.cachedViewport.width || height !== _this.cachedViewport.height) {\n _this.cachedViewport = {\n x: x,\n y: y,\n width: width,\n height: height\n };\n\n var _renderPass = _this.getCurrentRenderPass();\n\n _renderPass.setViewport(x, y, width, height, 0, 1);\n }\n };\n\n this.readPixels = function (options) {\n throw new Error('Method not implemented.');\n };\n }\n\n createClass_default()(WebGPUEngine, [{\n key: \"isFloatSupported\",\n value: function isFloatSupported() {\n return true;\n }\n }, {\n key: \"init\",\n value: function () {\n var _init = asyncToGenerator_default()( /*#__PURE__*/regenerator_default.a.mark(function _callee3(config) {\n return regenerator_default.a.wrap(function _callee3$(_context3) {\n while (1) {\n switch (_context3.prev = _context3.next) {\n case 0:\n this.canvas = config.canvas;\n this.options = config;\n this.useWGSL = !!config.useWGSL;\n this.mainPassSampleCount = config.antialiasing ? this.defaultSampleCount : 1;\n _context3.next = 6;\n return this.initGlslang();\n\n case 6:\n this.initContextAndSwapChain();\n this.initMainAttachments();\n\n case 8:\n case \"end\":\n return _context3.stop();\n }\n }\n }, _callee3, this);\n }));\n\n function init(_x3) {\n return _init.apply(this, arguments);\n }\n\n return init;\n }()\n }, {\n key: \"setScissor\",\n value: function setScissor(scissor) {\n throw new Error('Method not implemented.');\n }\n }, {\n key: \"destroy\",\n value: function destroy() {\n if (this.mainTexture) {\n this.mainTexture.destroy();\n }\n\n if (this.depthTexture) {\n this.depthTexture.destroy();\n }\n\n this.tempBuffers.forEach(function (buffer) {\n return buffer.destroy();\n });\n this.tempBuffers = [];\n }\n }, {\n key: \"beginFrame\",\n value: function beginFrame() {\n this.uploadEncoder = this.device.createCommandEncoder(this.uploadEncoderDescriptor);\n this.renderEncoder = this.device.createCommandEncoder(this.renderEncoderDescriptor);\n this.renderTargetEncoder = this.device.createCommandEncoder(this.renderTargetEncoderDescriptor);\n\n if (this.options.supportCompute) {\n this.computeEncoder = this.device.createCommandEncoder(this.computeEncoderDescriptor);\n }\n }\n }, {\n key: \"endFrame\",\n value: function endFrame() {\n if (this.options.supportCompute) {\n this.endComputePass();\n }\n\n this.endMainRenderPass();\n this.commandBuffers[0] = this.uploadEncoder.finish();\n this.commandBuffers[1] = this.renderEncoder.finish();\n\n if (this.options.supportCompute) {\n this.commandBuffers[2] = this.computeEncoder.finish();\n }\n\n this.commandBuffers[3] = this.renderTargetEncoder.finish();\n\n if (g_webgpu_core_es[\"isSafari\"]) {\n this.device // @ts-ignore\n .getQueue().submit(this.commandBuffers.filter(function (buffer) {\n return buffer;\n }));\n } else {\n this.device.defaultQueue.submit(this.commandBuffers.filter(function (buffer) {\n return buffer;\n }));\n }\n }\n }, {\n key: \"getCurrentRenderPass\",\n value: function getCurrentRenderPass() {\n if (this.currentRenderTarget && !this.currentRenderPass) {\n this.startRenderTargetRenderPass(this.currentRenderTarget, null, false, false);\n } else if (!this.currentRenderPass) {\n this.startMainRenderPass();\n }\n\n return this.currentRenderPass;\n }\n }, {\n key: \"initGlslang\",\n value: function () {\n var _initGlslang = asyncToGenerator_default()( /*#__PURE__*/regenerator_default.a.mark(function _callee4() {\n var _navigator, _navigator$gpu;\n\n return regenerator_default.a.wrap(function _callee4$(_context4) {\n while (1) {\n switch (_context4.prev = _context4.next) {\n case 0:\n _context4.next = 2;\n return webgpu_glslang();\n\n case 2:\n this.glslang = _context4.sent;\n _context4.next = 5;\n return (_navigator = navigator) === null || _navigator === void 0 ? void 0 : (_navigator$gpu = _navigator.gpu) === null || _navigator$gpu === void 0 ? void 0 : _navigator$gpu.requestAdapter();\n\n case 5:\n this.adapter = _context4.sent;\n _context4.next = 8;\n return this.adapter.requestDevice();\n\n case 8:\n this.device = _context4.sent;\n\n case 9:\n case \"end\":\n return _context4.stop();\n }\n }\n }, _callee4, this);\n }));\n\n function initGlslang() {\n return _initGlslang.apply(this, arguments);\n }\n\n return initGlslang;\n }()\n }, {\n key: \"initContextAndSwapChain\",\n value: function initContextAndSwapChain() {\n this.context = this.canvas.getContext(g_webgpu_core_es[\"isSafari\"] ? 'gpu' : 'gpupresent');\n this.swapChain = this.context.configureSwapChain({\n device: this.device,\n format: this.options.swapChainFormat,\n usage: constants[\"TextureUsage\"].OutputAttachment | constants[\"TextureUsage\"].CopySrc\n });\n }\n }, {\n key: \"initMainAttachments\",\n value: function initMainAttachments() {\n this.mainTextureExtends = {\n width: this.canvas.width,\n height: this.canvas.height,\n depth: 1\n };\n\n if (this.options.antialiasing) {\n var mainTextureDescriptor = {\n size: this.mainTextureExtends,\n // TODO: arrayLayerCount is deprecated: use size.depth\n // arrayLayerCount: 1,\n mipLevelCount: 1,\n sampleCount: this.mainPassSampleCount,\n dimension: constants[\"TextureDimension\"].E2d,\n format: constants[\"TextureFormat\"].BGRA8Unorm,\n usage: constants[\"TextureUsage\"].OutputAttachment\n };\n\n if (this.mainTexture) {\n this.mainTexture.destroy();\n }\n\n this.mainTexture = this.device.createTexture(mainTextureDescriptor);\n this.mainColorAttachments = [{\n attachment: g_webgpu_core_es[\"isSafari\"] ? // @ts-ignore\n this.mainTexture.createDefaultView() : this.mainTexture.createView(),\n loadValue: [0, 0, 0, 1],\n storeOp: constants[\"StoreOp\"].Store\n }];\n } else {\n this.mainColorAttachments = [{\n attachment: g_webgpu_core_es[\"isSafari\"] ? // @ts-ignore\n this.swapChain.getCurrentTexture().createDefaultView() : this.swapChain.getCurrentTexture().createView(),\n loadValue: [0, 0, 0, 1],\n storeOp: constants[\"StoreOp\"].Store\n }];\n }\n\n var depthTextureDescriptor = {\n size: this.mainTextureExtends,\n // arrayLayerCount: 1,\n mipLevelCount: 1,\n sampleCount: this.mainPassSampleCount,\n dimension: constants[\"TextureDimension\"].E2d,\n format: g_webgpu_core_es[\"isSafari\"] ? 'depth32float-stencil8' : constants[\"TextureFormat\"].Depth24PlusStencil8,\n usage: constants[\"TextureUsage\"].OutputAttachment\n };\n\n if (this.depthTexture) {\n this.depthTexture.destroy();\n }\n\n this.depthTexture = this.device.createTexture( // @ts-ignore\n depthTextureDescriptor);\n this.mainDepthAttachment = {\n attachment: g_webgpu_core_es[\"isSafari\"] ? // @ts-ignore\n this.depthTexture.createDefaultView() : this.depthTexture.createView(),\n depthLoadValue: this.clearDepthValue,\n depthStoreOp: constants[\"StoreOp\"].Store,\n stencilLoadValue: this.clearStencilValue,\n stencilStoreOp: constants[\"StoreOp\"].Store\n };\n }\n }, {\n key: \"startComputePass\",\n value: function startComputePass() {\n if (this.currentComputePass) {\n this.endComputePass();\n }\n\n this.currentComputePass = this.computeEncoder.beginComputePass();\n }\n }, {\n key: \"startMainRenderPass\",\n value: function startMainRenderPass() {\n if (this.currentRenderPass && !this.currentRenderTarget) {\n this.endMainRenderPass();\n } // Resolve in case of MSAA\n\n\n if (this.options.antialiasing) {\n this.mainColorAttachments[0].resolveTarget = g_webgpu_core_es[\"isSafari\"] ? // @ts-ignore\n this.swapChain.getCurrentTexture().createDefaultView() : this.swapChain.getCurrentTexture().createView();\n } else {\n this.mainColorAttachments[0].attachment = g_webgpu_core_es[\"isSafari\"] ? // @ts-ignore\n this.swapChain.getCurrentTexture().createDefaultView() : this.swapChain.getCurrentTexture().createView();\n }\n\n this.currentRenderPass = this.renderEncoder.beginRenderPass({\n colorAttachments: this.mainColorAttachments,\n depthStencilAttachment: this.mainDepthAttachment // TODO: use framebuffer's depth & stencil\n\n });\n this.mainRenderPass = this.currentRenderPass;\n\n if (this.cachedViewport) {\n this.viewport(this.cachedViewport);\n }\n }\n }, {\n key: \"startRenderTargetRenderPass\",\n value: function startRenderTargetRenderPass(renderTarget, clearColor, clearDepth) {\n var _renderTarget$get$col, _renderTarget$get$dep;\n\n var clearStencil = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n var gpuTexture = (_renderTarget$get$col = renderTarget.get().color) === null || _renderTarget$get$col === void 0 ? void 0 : _renderTarget$get$col.texture;\n var colorTextureView;\n\n if (gpuTexture) {\n colorTextureView = gpuTexture.createView(this.currentRenderTargetViewDescriptor);\n }\n\n var depthStencilTexture = (_renderTarget$get$dep = renderTarget.get().depth) === null || _renderTarget$get$dep === void 0 ? void 0 : _renderTarget$get$dep.texture;\n var depthStencilTextureView;\n\n if (depthStencilTexture) {\n depthStencilTextureView = depthStencilTexture.createView();\n }\n\n var renderPass = this.renderTargetEncoder.beginRenderPass({\n colorAttachments: [{\n attachment: colorTextureView,\n loadValue: clearColor !== null ? clearColor : constants[\"LoadOp\"].Load,\n storeOp: constants[\"StoreOp\"].Store\n }],\n depthStencilAttachment: depthStencilTexture && depthStencilTextureView ? {\n attachment: depthStencilTextureView,\n depthLoadValue: clearDepth ? this.clearDepthValue : constants[\"LoadOp\"].Load,\n depthStoreOp: constants[\"StoreOp\"].Store,\n stencilLoadValue: clearStencil ? this.clearStencilValue : constants[\"LoadOp\"].Load,\n stencilStoreOp: constants[\"StoreOp\"].Store\n } : undefined\n });\n this.currentRenderPass = renderPass;\n\n if (this.cachedViewport) {\n this.viewport(this.cachedViewport);\n } // TODO WEBGPU set the scissor rect and the stencil reference value\n\n }\n }, {\n key: \"endMainRenderPass\",\n value: function endMainRenderPass() {\n if (this.currentRenderPass === this.mainRenderPass && this.currentRenderPass !== null) {\n this.currentRenderPass.endPass();\n this.resetCachedViewport();\n this.currentRenderPass = null;\n this.mainRenderPass = null;\n }\n }\n }, {\n key: \"endComputePass\",\n value: function endComputePass() {\n if (this.currentComputePass) {\n this.currentComputePass.endPass();\n this.currentComputePass = null;\n }\n }\n }, {\n key: \"endRenderTargetRenderPass\",\n value: function endRenderTargetRenderPass() {\n if (this.currentRenderPass) {\n this.currentRenderPass.endPass();\n this.resetCachedViewport();\n }\n }\n }, {\n key: \"resetCachedViewport\",\n value: function resetCachedViewport() {\n this.cachedViewport = {\n x: 0,\n y: 0,\n width: 0,\n height: 0\n };\n }\n }, {\n key: \"unbindFramebuffer\",\n value: function unbindFramebuffer(framebuffer) {\n // unbind\n if (this.currentRenderPass && this.currentRenderPass !== this.mainRenderPass) {\n this.endRenderTargetRenderPass();\n }\n\n this.transientViewport.x = Infinity;\n this.currentRenderTarget = null; // if (texture.generateMipMaps && !disableGenerateMipMaps && !texture.isCube) {\n // this._generateMipmaps(texture);\n // }\n\n this.currentRenderPass = this.mainRenderPass;\n }\n }]);\n\n return WebGPUEngine;\n}(), webgpu_temp)) || webgpu_class);\n//# sourceMappingURL=index.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-webgpu-engine/es/index.js\n\n\n\n//# sourceMappingURL=index.js.map\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/slicedToArray.js\nvar slicedToArray = __webpack_require__(61);\nvar slicedToArray_default = /*#__PURE__*/__webpack_require__.n(slicedToArray);\n\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/inherits.js\nvar inherits = __webpack_require__(23);\nvar inherits_default = /*#__PURE__*/__webpack_require__.n(inherits);\n\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/possibleConstructorReturn.js\nvar possibleConstructorReturn = __webpack_require__(24);\nvar possibleConstructorReturn_default = /*#__PURE__*/__webpack_require__.n(possibleConstructorReturn);\n\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/getPrototypeOf.js\nvar getPrototypeOf = __webpack_require__(18);\nvar getPrototypeOf_default = /*#__PURE__*/__webpack_require__.n(getPrototypeOf);\n\n// CONCATENATED MODULE: ./node_modules/@antv/g-webgpu/es/geometry/Box.js\n\n\n\n\n\n\n\nvar Box_dec, Box_class;\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = getPrototypeOf_default()(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = getPrototypeOf_default()(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return possibleConstructorReturn_default()(this, result); }; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\n\n\n\n\nvar primitiveUv1Padding = 4.0 / 64;\nvar primitiveUv1PaddingScale = 1.0 - primitiveUv1Padding * 2;\nvar\n/**\n * borrow from playcanvas:\n * Creates a procedural box-shaped mesh\n */\nBox_Box = (Box_dec = Object(inversify[\"injectable\"])(), Box_dec(Box_class = /*#__PURE__*/function (_Geometry) {\n inherits_default()(Box, _Geometry);\n\n var _super = _createSuper(Box);\n\n function Box() {\n classCallCheck_default()(this, Box);\n\n return _super.apply(this, arguments);\n }\n\n createClass_default()(Box, [{\n key: \"onEntityCreated\",\n value: function onEntityCreated() {\n var _this$config = this.config,\n _this$config$widthSeg = _this$config.widthSegments,\n widthSegments = _this$config$widthSeg === void 0 ? 1 : _this$config$widthSeg,\n _this$config$heightSe = _this$config.heightSegments,\n heightSegments = _this$config$heightSe === void 0 ? 1 : _this$config$heightSe,\n _this$config$depthSeg = _this$config.depthSegments,\n depthSegments = _this$config$depthSeg === void 0 ? 1 : _this$config$depthSeg,\n _this$config$halfExte = _this$config.halfExtents,\n halfExtents = _this$config$halfExte === void 0 ? gl_matrix_esm[\"e\" /* vec3 */].fromValues(0.5, 0.5, 0.5) : _this$config$halfExte;\n var ws = widthSegments;\n var hs = heightSegments;\n var ds = depthSegments;\n\n var _halfExtents = slicedToArray_default()(halfExtents, 3),\n hex = _halfExtents[0],\n hey = _halfExtents[1],\n hez = _halfExtents[2];\n\n var corners = [gl_matrix_esm[\"e\" /* vec3 */].fromValues(-hex, -hey, hez), gl_matrix_esm[\"e\" /* vec3 */].fromValues(hex, -hey, hez), gl_matrix_esm[\"e\" /* vec3 */].fromValues(hex, hey, hez), gl_matrix_esm[\"e\" /* vec3 */].fromValues(-hex, hey, hez), gl_matrix_esm[\"e\" /* vec3 */].fromValues(hex, -hey, -hez), gl_matrix_esm[\"e\" /* vec3 */].fromValues(-hex, -hey, -hez), gl_matrix_esm[\"e\" /* vec3 */].fromValues(-hex, hey, -hez), gl_matrix_esm[\"e\" /* vec3 */].fromValues(hex, hey, -hez)];\n var faceAxes = [[0, 1, 3], // FRONT\n [4, 5, 7], // BACK\n [3, 2, 6], // TOP\n [1, 0, 4], // BOTTOM\n [1, 4, 2], // RIGHT\n [5, 0, 6] // LEFT\n ];\n var faceNormals = [[0, 0, 1], // FRONT\n [0, 0, -1], // BACK\n [0, 1, 0], // TOP\n [0, -1, 0], // BOTTOM\n [1, 0, 0], // RIGHT\n [-1, 0, 0] // LEFT\n ];\n var sides = {\n FRONT: 0,\n BACK: 1,\n TOP: 2,\n BOTTOM: 3,\n RIGHT: 4,\n LEFT: 5\n };\n var positions = [];\n var normals = [];\n var uvs = [];\n var uvs1 = [];\n var indices = [];\n var vcounter = 0;\n\n var generateFace = function generateFace(side, uSegments, vSegments) {\n var u;\n var v;\n var i;\n var j;\n\n for (i = 0; i <= uSegments; i++) {\n for (j = 0; j <= vSegments; j++) {\n var temp1 = gl_matrix_esm[\"e\" /* vec3 */].create();\n var temp2 = gl_matrix_esm[\"e\" /* vec3 */].create();\n var temp3 = gl_matrix_esm[\"e\" /* vec3 */].create();\n var r = gl_matrix_esm[\"e\" /* vec3 */].create();\n gl_matrix_esm[\"e\" /* vec3 */].lerp(temp1, corners[faceAxes[side][0]], corners[faceAxes[side][1]], i / uSegments);\n gl_matrix_esm[\"e\" /* vec3 */].lerp(temp2, corners[faceAxes[side][0]], corners[faceAxes[side][2]], j / vSegments);\n gl_matrix_esm[\"e\" /* vec3 */].sub(temp3, temp2, corners[faceAxes[side][0]]);\n gl_matrix_esm[\"e\" /* vec3 */].add(r, temp1, temp3);\n u = i / uSegments;\n v = j / vSegments;\n positions.push(r[0], r[1], r[2]);\n normals.push(faceNormals[side][0], faceNormals[side][1], faceNormals[side][2]);\n uvs.push(u, v); // pack as 3x2\n // 1/3 will be empty, but it's either that or stretched pixels\n // TODO: generate non-rectangular lightMaps, so we could use space without stretching\n\n u /= 3;\n v /= 3;\n u = u * primitiveUv1PaddingScale + primitiveUv1Padding;\n v = v * primitiveUv1PaddingScale + primitiveUv1Padding;\n u += side % 3 / 3;\n v += Math.floor(side / 3) / 3;\n uvs1.push(u, v);\n\n if (i < uSegments && j < vSegments) {\n indices.push(vcounter + vSegments + 1, vcounter + 1, vcounter);\n indices.push(vcounter + vSegments + 1, vcounter + vSegments + 2, vcounter + 1);\n }\n\n vcounter++;\n }\n }\n };\n\n generateFace(sides.FRONT, ws, hs);\n generateFace(sides.BACK, ws, hs);\n generateFace(sides.TOP, ws, ds);\n generateFace(sides.BOTTOM, ws, ds);\n generateFace(sides.RIGHT, ds, hs);\n generateFace(sides.LEFT, ds, hs); // generate AABB\n\n var aabb = Object(g_webgpu_core_es[\"generateAABBFromVertices\"])(positions);\n var component = this.getComponent();\n component.indices = Uint32Array.from(indices);\n component.aabb = aabb;\n component.vertexCount = vcounter;\n component.attributes = [{\n dirty: true,\n name: 'position',\n data: Float32Array.from(positions),\n arrayStride: 4 * 3,\n stepMode: 'vertex',\n attributes: [{\n shaderLocation: 0,\n offset: 0,\n format: 'float3'\n }]\n }, {\n dirty: true,\n name: 'normal',\n data: Float32Array.from(normals),\n arrayStride: 4 * 3,\n stepMode: 'vertex',\n attributes: [{\n shaderLocation: 1,\n offset: 0,\n format: 'float3'\n }]\n }, {\n dirty: true,\n name: 'uv',\n data: Float32Array.from(uvs),\n arrayStride: 4 * 2,\n stepMode: 'vertex',\n attributes: [{\n shaderLocation: 2,\n offset: 0,\n format: 'float2'\n }]\n }]; // TODO: barycentric & tangent\n }\n }]);\n\n return Box;\n}(geometry_Geometry)) || Box_class);\n//# sourceMappingURL=Box.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-webgpu/es/utils/typedarray.js\nfunction merge(a, b) {\n // Checks for truthy values on both arrays\n if (!a && !b) {\n throw new Error('Please specify valid arguments for parameters a and b.');\n } // Checks for truthy values or empty arrays on each argument\n // to avoid the unnecessary construction of a new array and\n // the type comparison\n\n\n if (!b || b.length === 0) {\n return a;\n }\n\n if (!a || a.length === 0) {\n return b;\n } // Make sure that both typed arrays are of the same type\n\n\n if (Object.prototype.toString.call(a) !== Object.prototype.toString.call(b)) {\n throw new Error('The types of the two arguments passed for parameters a and b do not match.');\n } // @ts-ignore\n\n\n var c = new a.constructor(a.length + b.length);\n c.set(a);\n c.set(b, a.length);\n return c;\n}\n//# sourceMappingURL=typedarray.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-webgpu/es/geometry/Merged.js\n\n\n\n\n\n\n\nvar Merged_dec, Merged_class;\n\nfunction Merged_createSuper(Derived) { var hasNativeReflectConstruct = Merged_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = getPrototypeOf_default()(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = getPrototypeOf_default()(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return possibleConstructorReturn_default()(this, result); }; }\n\nfunction Merged_isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\n\n\n\n\n\n\nvar\n/**\n * merge many geometries into one, use a batch of draw calls\n */\nMerged_Merged = (Merged_dec = Object(inversify[\"injectable\"])(), Merged_dec(Merged_class = /*#__PURE__*/function (_Geometry) {\n inherits_default()(Merged, _Geometry);\n\n var _super = Merged_createSuper(Merged);\n\n function Merged() {\n classCallCheck_default()(this, Merged);\n\n return _super.apply(this, arguments);\n }\n\n createClass_default()(Merged, [{\n key: \"onEntityCreated\",\n value: function onEntityCreated() {\n var _this$config$geometri = this.config.geometries,\n geometries = _this$config$geometri === void 0 ? [] : _this$config$geometri;\n var mergedComponent = this.getComponent();\n mergedComponent.aabb = new g_webgpu_core_es[\"AABB\"]();\n var mergedAttributes = [];\n var mergedIndices = [];\n var indexOffset = 0;\n geometries.forEach(function (geometry) {\n var aabb = geometry.aabb,\n indices = geometry.indices,\n vertexCount = geometry.vertexCount,\n attributes = geometry.attributes; // merge aabb\n\n mergedComponent.aabb.add(aabb);\n mergedComponent.vertexCount += vertexCount; // merge indices\n\n if (indices) {\n mergedIndices.push.apply(mergedIndices, toConsumableArray_default()(indices.map(function (index) {\n return index + indexOffset;\n })));\n }\n\n indexOffset += vertexCount; // merge attributes\n\n attributes.forEach(function (attribute, i) {\n if (!mergedAttributes[i]) {\n mergedAttributes[i] = attribute;\n mergedAttributes[i].dirty = true;\n } else {\n if (attribute.data) {\n if (is_number_isNumber(attribute.data)) {\n // @ts-ignore\n mergedAttributes[i].push(attribute.data);\n } else if (isTypedArray(attribute.data)) {\n // @ts-ignore\n mergedAttributes[i].data = merge( // @ts-ignore\n mergedAttributes[i].data, attribute.data);\n } else {\n // @ts-ignore\n mergedAttributes[i].data = mergedAttributes[i].data.concat(attribute.data);\n }\n }\n }\n });\n });\n mergedComponent.attributes = mergedAttributes;\n mergedComponent.indices = Uint32Array.from(mergedIndices);\n mergedComponent.dirty = true;\n }\n }]);\n\n return Merged;\n}(geometry_Geometry)) || Merged_class);\n//# sourceMappingURL=Merged.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-webgpu/es/geometry/Plane.js\n\n\n\n\n\n\nvar Plane_dec, Plane_class;\n\nfunction Plane_createSuper(Derived) { var hasNativeReflectConstruct = Plane_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = getPrototypeOf_default()(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = getPrototypeOf_default()(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return possibleConstructorReturn_default()(this, result); }; }\n\nfunction Plane_isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\n\n\n\nvar\n/**\n * borrow from playcanvas\n */\nPlane_Plane = (Plane_dec = Object(inversify[\"injectable\"])(), Plane_dec(Plane_class = /*#__PURE__*/function (_Geometry) {\n inherits_default()(Plane, _Geometry);\n\n var _super = Plane_createSuper(Plane);\n\n function Plane() {\n classCallCheck_default()(this, Plane);\n\n return _super.apply(this, arguments);\n }\n\n createClass_default()(Plane, [{\n key: \"onEntityCreated\",\n value: function onEntityCreated() {\n var _this$config = this.config,\n _this$config$halfExte = _this$config.halfExtents,\n halfExtents = _this$config$halfExte === void 0 ? [0.5, 0.5] : _this$config$halfExte,\n _this$config$widthSeg = _this$config.widthSegments,\n widthSegments = _this$config$widthSeg === void 0 ? 5 : _this$config$widthSeg,\n _this$config$lengthSe = _this$config.lengthSegments,\n lengthSegments = _this$config$lengthSe === void 0 ? 5 : _this$config$lengthSe;\n var positions = [];\n var normals = [];\n var uvs = [];\n var indices = [];\n var vcounter = 0;\n\n for (var i = 0; i <= widthSegments; i++) {\n for (var j = 0; j <= lengthSegments; j++) {\n var x = -halfExtents[0] + 2.0 * halfExtents[0] * i / widthSegments;\n var y = 0.0;\n var z = -(-halfExtents[1] + 2.0 * halfExtents[1] * j / lengthSegments);\n var u = i / widthSegments;\n var v = j / lengthSegments;\n positions.push(x, y, z);\n normals.push(0.0, 1.0, 0.0);\n uvs.push(u, v);\n\n if (i < widthSegments && j < lengthSegments) {\n indices.push(vcounter + lengthSegments + 1, vcounter + 1, vcounter);\n indices.push(vcounter + lengthSegments + 1, vcounter + lengthSegments + 2, vcounter + 1);\n }\n\n vcounter++;\n }\n } // generate AABB\n\n\n var aabb = Object(g_webgpu_core_es[\"generateAABBFromVertices\"])(positions);\n var component = this.getComponent();\n component.indices = Uint32Array.from(indices);\n component.aabb = aabb;\n component.vertexCount = vcounter;\n component.attributes = [{\n dirty: true,\n name: 'position',\n data: Float32Array.from(positions),\n arrayStride: 4 * 3,\n stepMode: 'vertex',\n attributes: [{\n shaderLocation: 0,\n offset: 0,\n format: 'float3'\n }]\n }, {\n dirty: true,\n name: 'normal',\n data: Float32Array.from(normals),\n arrayStride: 4 * 3,\n stepMode: 'vertex',\n attributes: [{\n shaderLocation: 1,\n offset: 0,\n format: 'float3'\n }]\n }, {\n dirty: true,\n name: 'uv',\n data: Float32Array.from(uvs),\n arrayStride: 4 * 2,\n stepMode: 'vertex',\n attributes: [{\n shaderLocation: 2,\n offset: 0,\n format: 'float2'\n }]\n }]; // TODO: barycentric & tangent\n }\n }]);\n\n return Plane;\n}(geometry_Geometry)) || Plane_class);\n//# sourceMappingURL=Plane.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-webgpu/es/geometry/Sphere.js\n\n\n\n\n\n\nvar Sphere_dec, Sphere_class;\n\nfunction Sphere_createSuper(Derived) { var hasNativeReflectConstruct = Sphere_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = getPrototypeOf_default()(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = getPrototypeOf_default()(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return possibleConstructorReturn_default()(this, result); }; }\n\nfunction Sphere_isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\n\n\n\nvar\n/**\n * borrow from playcanvas\n */\nSphere_Sphere = (Sphere_dec = Object(inversify[\"injectable\"])(), Sphere_dec(Sphere_class = /*#__PURE__*/function (_Geometry) {\n inherits_default()(Sphere, _Geometry);\n\n var _super = Sphere_createSuper(Sphere);\n\n function Sphere() {\n classCallCheck_default()(this, Sphere);\n\n return _super.apply(this, arguments);\n }\n\n createClass_default()(Sphere, [{\n key: \"onEntityCreated\",\n value: function onEntityCreated() {\n var _this$config = this.config,\n _this$config$radius = _this$config.radius,\n radius = _this$config$radius === void 0 ? 0.5 : _this$config$radius,\n _this$config$latitude = _this$config.latitudeBands,\n latitudeBands = _this$config$latitude === void 0 ? 16 : _this$config$latitude,\n _this$config$longitud = _this$config.longitudeBands,\n longitudeBands = _this$config$longitud === void 0 ? 16 : _this$config$longitud;\n var positions = [];\n var normals = [];\n var uvs = [];\n var indices = [];\n\n for (var lat = 0; lat <= latitudeBands; lat++) {\n var theta = lat * Math.PI / latitudeBands;\n var sinTheta = Math.sin(theta);\n var cosTheta = Math.cos(theta);\n\n for (var lon = 0; lon <= longitudeBands; lon++) {\n // Sweep the sphere from the positive Z axis to match a 3DS Max sphere\n var phi = lon * 2 * Math.PI / longitudeBands - Math.PI / 2.0;\n var sinPhi = Math.sin(phi);\n var cosPhi = Math.cos(phi);\n var x = cosPhi * sinTheta;\n var y = cosTheta;\n var z = sinPhi * sinTheta;\n var u = 1.0 - lon / longitudeBands;\n var v = 1.0 - lat / latitudeBands;\n positions.push(x * radius, y * radius, z * radius);\n normals.push(x, y, z);\n uvs.push(u, v);\n }\n }\n\n for (var _lat = 0; _lat < latitudeBands; ++_lat) {\n for (var _lon = 0; _lon < longitudeBands; ++_lon) {\n var first = _lat * (longitudeBands + 1) + _lon;\n var second = first + longitudeBands + 1;\n indices.push(first + 1, second, first);\n indices.push(first + 1, second + 1, second);\n }\n } // generate AABB\n\n\n var aabb = Object(g_webgpu_core_es[\"generateAABBFromVertices\"])(positions);\n var component = this.getComponent();\n component.indices = Uint32Array.from(indices);\n component.aabb = aabb;\n component.vertexCount = positions.length / 3;\n component.attributes = [{\n dirty: true,\n name: 'position',\n data: Float32Array.from(positions),\n arrayStride: 4 * 3,\n stepMode: 'vertex',\n attributes: [{\n shaderLocation: 0,\n offset: 0,\n format: 'float3'\n }]\n }, {\n dirty: true,\n name: 'normal',\n data: Float32Array.from(normals),\n arrayStride: 4 * 3,\n stepMode: 'vertex',\n attributes: [{\n shaderLocation: 1,\n offset: 0,\n format: 'float3'\n }]\n }, {\n dirty: true,\n name: 'uv',\n data: Float32Array.from(uvs),\n arrayStride: 4 * 2,\n stepMode: 'vertex',\n attributes: [{\n shaderLocation: 2,\n offset: 0,\n format: 'float2'\n }]\n }]; // TODO: barycentric & tangent\n }\n }]);\n\n return Sphere;\n}(geometry_Geometry)) || Sphere_class);\n//# sourceMappingURL=Sphere.js.map\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/assertThisInitialized.js\nvar assertThisInitialized = __webpack_require__(22);\nvar assertThisInitialized_default = /*#__PURE__*/__webpack_require__.n(assertThisInitialized);\n\n// CONCATENATED MODULE: ./node_modules/@antv/g-webgpu/es/material/basic/index.js\n\n\n\n\n\n\n\n\n\n\nvar basic_dec, basic_dec2, basic_dec3, basic_class, basic_class2, basic_descriptor, basic_descriptor2, basic_temp;\n\nfunction basic_createSuper(Derived) { var hasNativeReflectConstruct = basic_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = getPrototypeOf_default()(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = getPrototypeOf_default()(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return possibleConstructorReturn_default()(this, result); }; }\n\nfunction basic_isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\n\n\n\n\n\n/* babel-plugin-inline-import './shaders/webgl.basic.frag.glsl' */\nvar webglFragmentShaderGLSL = \"varying vec4 fragColor;\\n\\n#pragma include \\\"uv.frag.declaration\\\"\\n#pragma include \\\"map.frag.declaration\\\"\\n\\nvoid main() {\\n vec4 diffuseColor = fragColor;\\n\\n #pragma include \\\"map.frag.main\\\"\\n\\n gl_FragColor = diffuseColor;\\n}\";\n\n/* babel-plugin-inline-import './shaders/webgl.basic.vert.glsl' */\nvar webglVertexShaderGLSL = \"attribute vec3 position;\\nattribute vec3 normal;\\n\\nuniform mat4 projectionMatrix;\\nuniform mat4 modelViewMatrix;\\nuniform vec4 color;\\n\\nvarying vec4 fragColor;\\n\\n#pragma include \\\"uv.vert.declaration\\\"\\n\\nvoid main() {\\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\\n fragColor = color;\\n\\n #pragma include \\\"uv.vert.main\\\"\\n}\";\n\n/* babel-plugin-inline-import './shaders/webgpu.basic.frag.glsl' */\nvar webgpuFragmentShaderGLSL = \"// layout(set = 0, binding = 1) uniform WireframeUniforms {\\n// float lineWidth;\\n// vec4 lineColor;\\n// } wireframe;\\n\\nlayout(location = 0) in vec4 fragColor;\\n// layout(location = 1) in vec3 v_Barycentric;\\n\\nlayout(location = 0) out vec4 outColor;\\n\\n// wireframe\\n// float edgeFactor() {\\n// vec3 d = fwidth(v_Barycentric);\\n// vec3 a3 = smoothstep(vec3(0.0), d * wireframe.lineWidth, v_Barycentric);\\n// return min(min(a3.x, a3.y), a3.z);\\n// }\\n\\nvoid main() {\\n // outColor = mix(fragColor, wireframe.lineColor, (1.0 - edgeFactor()));\\n outColor = fragColor;\\n}\";\n\n/* babel-plugin-inline-import './shaders/webgpu.basic.vert.glsl' */\nvar webgpuVertexShaderGLSL = \"layout(set = 0, binding = 0) uniform Uniforms {\\n vec4 color;\\n mat4 projectionMatrix;\\n mat4 modelViewMatrix;\\n} uniforms;\\n\\nlayout(location = 0) in vec3 position;\\n// layout(location = 1) in vec3 barycentric;\\n\\nlayout(location = 0) out vec4 fragColor;\\n// layout(location = 1) out vec3 v_Barycentric;\\n\\nvoid main() {\\n gl_Position = uniforms.projectionMatrix * uniforms.modelViewMatrix * vec4(position, 1.0);\\n fragColor = uniforms.color;\\n // v_Barycentric = barycentric;\\n}\";\nvar\n/**\n * This material is not affected by lights.\n * @see https://threejs.org/docs/#api/en/materials/MeshBasicMaterial\n */\nbasic_Basic = (basic_dec = Object(inversify[\"injectable\"])(), basic_dec2 = Object(inversify[\"inject\"])(g_webgpu_core_es[\"IDENTIFIER\"].RenderEngine), basic_dec3 = Object(inversify[\"inject\"])(g_webgpu_core_es[\"IDENTIFIER\"].ShaderModuleService), basic_dec(basic_class = (basic_class2 = (basic_temp = /*#__PURE__*/function (_Material) {\n inherits_default()(Basic, _Material);\n\n var _super = basic_createSuper(Basic);\n\n function Basic() {\n var _this;\n\n classCallCheck_default()(this, Basic);\n\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n _this = _super.call.apply(_super, [this].concat(args));\n\n initializerDefineProperty_default()(_this, \"engine\", basic_descriptor, assertThisInitialized_default()(_this));\n\n initializerDefineProperty_default()(_this, \"shaderModuleService\", basic_descriptor2, assertThisInitialized_default()(_this));\n\n return _this;\n }\n\n createClass_default()(Basic, [{\n key: \"onEntityCreated\",\n value: function onEntityCreated() {\n var component = this.getComponent();\n var vertexShaderGLSL = this.engine.supportWebGPU ? webgpuVertexShaderGLSL : webglVertexShaderGLSL;\n var fragmentShaderGLSL = this.engine.supportWebGPU ? webgpuFragmentShaderGLSL : webglFragmentShaderGLSL;\n this.shaderModuleService.registerModule('material-basic', {\n vs: vertexShaderGLSL,\n fs: fragmentShaderGLSL\n });\n\n var _this$shaderModuleSer = this.shaderModuleService.getModule('material-basic'),\n vs = _this$shaderModuleSer.vs,\n fs = _this$shaderModuleSer.fs,\n extractedUniforms = _this$shaderModuleSer.uniforms;\n\n component.vertexShaderGLSL = vs;\n component.fragmentShaderGLSL = fs; // @ts-ignore\n\n component.setUniform(extractedUniforms);\n\n if (this.config.map) {\n component.setDefines({\n USE_UV: 1,\n USE_MAP: 1\n });\n component.setUniform({\n // @ts-ignore\n map: this.config.map,\n uvTransform: gl_matrix_esm[\"a\" /* mat3 */].create()\n });\n }\n }\n }]);\n\n return Basic;\n}(material_Material), basic_temp), (basic_descriptor = applyDecoratedDescriptor_default()(basic_class2.prototype, \"engine\", [basic_dec2], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n}), basic_descriptor2 = applyDecoratedDescriptor_default()(basic_class2.prototype, \"shaderModuleService\", [basic_dec3], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n})), basic_class2)) || basic_class);\n//# sourceMappingURL=index.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-webgpu/es/renderable/grid/index.js\n\n\n\n\n\n\n\n\n\n\nvar grid_dec, grid_dec2, grid_dec3, grid_dec4, grid_dec5, grid_dec6, grid_class, grid_class2, grid_descriptor, grid_descriptor2, grid_descriptor3, grid_temp;\n\nfunction grid_createSuper(Derived) { var hasNativeReflectConstruct = grid_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = getPrototypeOf_default()(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = getPrototypeOf_default()(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return possibleConstructorReturn_default()(this, result); }; }\n\nfunction grid_isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\n\n\n\n\n/* babel-plugin-inline-import './shaders/webgl.grid.frag.glsl' */\nvar gridFrag = \"// generate grid, borrow from clay.gl viewer\\n// @see https://github.com/pissang/clay-viewer/blob/master/src/graphic/ground.glsl\\n#extension GL_OES_standard_derivatives : enable\\n\\nvarying vec3 v_Position;\\n// varying vec3 v_Normal;\\n\\nuniform float u_GridSize : 5;\\nuniform float u_GridSize2 : .5;\\nuniform vec4 u_GridColor : [0, 0, 0, 1];\\nuniform vec4 u_GridColor2 : [0.3, 0.3, 0.3, 1];\\nuniform bool u_GridEnabled : true;\\n\\n// uniform vec3 u_LightDirection;\\n// uniform vec3 u_LightColor;\\n// uniform vec3 u_Camera;\\n\\nvoid main() {\\n // vec3 n = v_Normal;\\n // vec3 l = normalize(u_LightDirection);\\n // float NdotL = clamp(dot(n, l), 0.001, 1.0);\\n\\n gl_FragColor = vec4(1.);\\n\\n if (u_GridEnabled) {\\n float wx = v_Position.x;\\n float wz = v_Position.z;\\n // float x0 = abs(fract(wx / u_GridSize - 0.5) - 0.5) / fwidth(wx) * u_GridSize / 2.0;\\n // float z0 = abs(fract(wz / u_GridSize - 0.5) - 0.5) / fwidth(wz) * u_GridSize / 2.0;\\n\\n float x1 = abs(fract(wx / u_GridSize2 - 0.5) - 0.5) / fwidth(wx) * u_GridSize2;\\n float z1 = abs(fract(wz / u_GridSize2 - 0.5) - 0.5) / fwidth(wz) * u_GridSize2;\\n\\n // float v0 = 1.0 - clamp(min(x0, z0), 0.0, 1.0);\\n float v1 = 1.0 - clamp(min(x1, z1), 0.0, 1.0);\\n // if (v0 > 0.1) {\\n // gl_FragColor = mix(gl_FragColor, u_GridColor, v0);\\n // }\\n // else {\\n gl_FragColor = mix(gl_FragColor, u_GridColor2, v1);\\n // }\\n }\\n\\n // float shadowFactor = calcShadow(u_ShadowMap, v_PositionFromLight, l, n);\\n // vec3 diffuseColor = u_LightColor * NdotL * shadowFactor;\\n\\n // gl_FragColor.rgb *= diffuseColor;\\n}\";\n\n/* babel-plugin-inline-import './shaders/webgl.grid.vert.glsl' */\nvar gridVert = \"attribute vec3 a_Position;\\n\\nvarying vec3 v_Position;\\n\\nuniform mat4 projectionMatrix;\\nuniform mat4 modelViewMatrix;\\n\\nvoid main() {\\n v_Position = a_Position;\\n gl_Position = projectionMatrix * modelViewMatrix * vec4(a_Position, 1.);\\n}\";\nvar grid_Grid = (grid_dec = Object(inversify[\"injectable\"])(), grid_dec2 = Object(inversify[\"inject\"])(g_webgpu_core_es[\"IDENTIFIER\"].Systems), grid_dec3 = Object(inversify[\"named\"])(g_webgpu_core_es[\"IDENTIFIER\"].MaterialSystem), grid_dec4 = Object(inversify[\"inject\"])(g_webgpu_core_es[\"IDENTIFIER\"].Systems), grid_dec5 = Object(inversify[\"named\"])(g_webgpu_core_es[\"IDENTIFIER\"].GeometrySystem), grid_dec6 = Object(inversify[\"inject\"])(g_webgpu_core_es[\"IDENTIFIER\"].ShaderModuleService), grid_dec(grid_class = (grid_class2 = (grid_temp = /*#__PURE__*/function (_Renderable) {\n inherits_default()(Grid, _Renderable);\n\n var _super = grid_createSuper(Grid);\n\n function Grid() {\n var _this;\n\n classCallCheck_default()(this, Grid);\n\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n _this = _super.call.apply(_super, [this].concat(args));\n\n initializerDefineProperty_default()(_this, \"materialSystem\", grid_descriptor, assertThisInitialized_default()(_this));\n\n initializerDefineProperty_default()(_this, \"geometrySystem\", grid_descriptor2, assertThisInitialized_default()(_this));\n\n initializerDefineProperty_default()(_this, \"shaderModuleService\", grid_descriptor3, assertThisInitialized_default()(_this));\n\n return _this;\n }\n\n createClass_default()(Grid, [{\n key: \"onAttributeChanged\",\n value: function onAttributeChanged(_ref) {\n var name = _ref.name,\n data = _ref.data;\n var mesh = this.getMeshComponent();\n\n if (mesh && mesh.material) {\n if (name === 'gridColor') {\n mesh.material.setUniform('u_GridColor', data);\n mesh.material.setUniform('u_GridColor2', data);\n } else if (name === 'gridSize') {\n mesh.material.setUniform('u_GridSize', data);\n mesh.material.setUniform('u_GridSize2', data);\n }\n }\n }\n }, {\n key: \"onEntityCreated\",\n value: function onEntityCreated() {\n this.shaderModuleService.registerModule('grid', {\n vs: gridVert,\n fs: gridFrag\n });\n\n var _this$shaderModuleSer = this.shaderModuleService.getModule('grid'),\n vs = _this$shaderModuleSer.vs,\n fs = _this$shaderModuleSer.fs,\n extractedUniforms = _this$shaderModuleSer.uniforms;\n\n var material = this.materialSystem.createShaderMaterial({\n vertexShader: vs,\n fragmentShader: fs\n });\n this.setMaterial(material);\n var geometry = this.geometrySystem.createBufferGeometry({\n vertexCount: 4\n });\n this.setGeometry(geometry);\n material.setCull({\n enable: false,\n face: g_webgpu_core_es[\"gl\"].BACK\n }).setDepth({\n enable: true,\n func: g_webgpu_core_es[\"gl\"].LESS\n }); // @ts-ignore\n\n material.setUniform(extractedUniforms);\n this.setAttributes({\n gridColor: this.config.gridColor,\n gridSize: this.config.gridSize\n });\n geometry.setIndex([0, 3, 2, 2, 1, 0]);\n geometry.setAttribute('a_Position', Float32Array.from([-4, -1, -4, 4, -1, -4, 4, -1, 4, -4, -1, 4]), {\n arrayStride: 4 * 2,\n stepMode: 'vertex',\n attributes: [{\n shaderLocation: 0,\n offset: 0,\n format: 'float2'\n }]\n });\n }\n }]);\n\n return Grid;\n}(Renderable_Renderable), grid_temp), (grid_descriptor = applyDecoratedDescriptor_default()(grid_class2.prototype, \"materialSystem\", [grid_dec2, grid_dec3], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n}), grid_descriptor2 = applyDecoratedDescriptor_default()(grid_class2.prototype, \"geometrySystem\", [grid_dec4, grid_dec5], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n}), grid_descriptor3 = applyDecoratedDescriptor_default()(grid_class2.prototype, \"shaderModuleService\", [grid_dec6], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n})), grid_class2)) || grid_class);\n//# sourceMappingURL=index.js.map\n// EXTERNAL MODULE: ./node_modules/gl-vec2/index.js\nvar gl_vec2 = __webpack_require__(95);\n\n// EXTERNAL MODULE: ./node_modules/polyline-miter-util/index.js\nvar polyline_miter_util = __webpack_require__(63);\n\n// CONCATENATED MODULE: ./node_modules/@antv/g-webgpu/es/utils/polyline-normals.js\n// @ts-ignore\n // @ts-ignore\n\n\n\nfunction extrusions(positions, out, point, normal, scale) {\n addNext(out, normal, -scale);\n addNext(out, normal, scale);\n positions.push(point);\n positions.push(point);\n}\n\nfunction addNext(out, normal, length) {\n out.push([[normal[0], normal[1]], length]);\n}\n\n/* harmony default export */ var polyline_normals = (function (points, closed, indexOffset) {\n var lineA = [0, 0];\n var lineB = [0, 0];\n var tangent = [0, 0];\n var miter = [0, 0];\n\n var _lastFlip = -1;\n\n var _started = false;\n var _normal = null;\n var tmp = Object(gl_vec2[\"create\"])();\n var count = indexOffset || 0;\n var miterLimit = 3;\n var out = [];\n var attrPos = [];\n var attrIndex = [];\n var attrCounters = [0, 0];\n\n if (closed) {\n points = points.slice();\n points.push(points[0]);\n }\n\n var total = points.length;\n\n for (var i = 1; i < total; i++) {\n var index = count;\n var last = points[i - 1];\n var cur = points[i];\n var next = i < points.length - 1 ? points[i + 1] : null;\n attrCounters.push(i / total, i / total);\n Object(polyline_miter_util[\"direction\"])(lineA, cur, last);\n\n if (!_normal) {\n _normal = [0, 0];\n Object(polyline_miter_util[\"normal\"])(_normal, lineA);\n }\n\n if (!_started) {\n _started = true;\n extrusions(attrPos, out, last, _normal, 1);\n }\n\n attrIndex.push([index + 0, index + 1, index + 2]);\n\n if (!next) {\n // no miter, simple segment\n Object(polyline_miter_util[\"normal\"])(_normal, lineA); // reset normal\n\n extrusions(attrPos, out, cur, _normal, 1);\n attrIndex.push(_lastFlip === 1 ? [index, index + 2, index + 3] : [index + 2, index + 1, index + 3]);\n count += 2;\n } else {\n // miter with last\n // get unit dir of next line\n Object(polyline_miter_util[\"direction\"])(lineB, next, cur); // stores tangent & miter\n\n var miterLen = Object(polyline_miter_util[\"computeMiter\"])(tangent, miter, lineA, lineB, 1); // get orientation\n\n var flip = Object(gl_vec2[\"dot\"])(tangent, _normal) < 0 ? -1 : 1;\n var bevel = miterLen > miterLimit; // 处理相邻线段重叠的情况\n\n if (!isFinite(miterLen)) {\n Object(polyline_miter_util[\"normal\"])(_normal, lineA); // reset normal\n\n extrusions(attrPos, out, cur, _normal, 1);\n attrIndex.push(_lastFlip === 1 ? [index, index + 2, index + 3] : [index + 2, index + 1, index + 3]);\n count += 2;\n _lastFlip = flip;\n continue;\n }\n\n if (bevel) {\n miterLen = miterLimit;\n attrCounters.push(i / total); // next two points in our first segment\n\n addNext(out, _normal, -flip);\n attrPos.push(cur);\n addNext(out, miter, miterLen * flip);\n attrPos.push(cur);\n attrIndex.push(_lastFlip !== -flip ? [index, index + 2, index + 3] : [index + 2, index + 1, index + 3]); // now add the bevel triangle\n\n attrIndex.push([index + 2, index + 3, index + 4]);\n Object(polyline_miter_util[\"normal\"])(tmp, lineB);\n Object(gl_vec2[\"copy\"])(_normal, tmp); // store normal for next round\n\n addNext(out, _normal, -flip);\n attrPos.push(cur); // the miter is now the normal for our next join\n\n count += 3;\n } else {\n // miter\n // next two points for our miter join\n extrusions(attrPos, out, cur, miter, miterLen);\n attrIndex.push(_lastFlip === 1 ? [index, index + 2, index + 3] : [index + 2, index + 1, index + 3]);\n flip = -1; // the miter is now the normal for our next join\n\n Object(gl_vec2[\"copy\"])(_normal, miter);\n count += 2;\n }\n\n _lastFlip = flip;\n }\n }\n\n return {\n normals: out,\n attrIndex: attrIndex,\n attrPos: attrPos,\n attrCounters: attrCounters\n };\n});\n//# sourceMappingURL=polyline-normals.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-webgpu/es/renderable/line/index.js\n\n\n\n\n\n\n\n\n\n\n\nvar line_dec, line_dec2, line_dec3, line_dec4, line_dec5, line_dec6, line_class, line_class2, line_descriptor, line_descriptor2, line_descriptor3, line_temp;\n\nfunction line_createSuper(Derived) { var hasNativeReflectConstruct = line_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = getPrototypeOf_default()(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = getPrototypeOf_default()(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return possibleConstructorReturn_default()(this, result); }; }\n\nfunction line_isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\n\n\n\n\n\n/* babel-plugin-inline-import './shaders/webgl.line.frag.glsl' */\nvar lineFrag = \"uniform float u_dash_array : 0.02;\\nuniform float u_dash_offset : 0;\\nuniform float u_dash_ratio : 0;\\nuniform float u_thickness : 0.02;\\n\\nvarying vec4 v_color;\\nvarying vec2 v_normal;\\nvarying float v_counters;\\n\\nvoid main() {\\n float blur = 1. - smoothstep(0.98, 1., length(v_normal));\\n\\n gl_FragColor = v_color;\\n gl_FragColor.a *= blur * ceil(mod(v_counters + u_dash_offset, u_dash_array) - (u_dash_array * u_dash_ratio));\\n}\";\n\n/* babel-plugin-inline-import './shaders/webgl.line.vert.glsl' */\nvar lineVert = \"attribute vec2 a_pos;\\nattribute vec4 a_color;\\nattribute float a_line_miter;\\nattribute vec2 a_line_normal;\\nattribute float a_counters;\\n\\nuniform mat4 projectionMatrix;\\nuniform mat4 modelViewMatrix;\\nuniform float u_thickness : 0.02;\\nuniform vec2 u_viewport;\\n\\nvarying vec4 v_color;\\nvarying vec2 v_normal;\\nvarying float v_counters;\\n\\nvoid main() {\\n v_color = a_color;\\n v_counters = a_counters;\\n\\n vec3 normal = normalize(vec3(a_line_normal, 0.0));\\n\\n vec4 offset = vec4(normal * u_thickness / 2.0 * a_line_miter, 0.0);\\n\\n v_normal = vec2(normal * sign(a_line_miter));\\n\\n gl_Position = projectionMatrix * modelViewMatrix * vec4(a_pos, 0.0, 1.0) + offset;\\n}\\n\";\nvar line_Line = (line_dec = Object(inversify[\"injectable\"])(), line_dec2 = Object(inversify[\"inject\"])(g_webgpu_core_es[\"IDENTIFIER\"].Systems), line_dec3 = Object(inversify[\"named\"])(g_webgpu_core_es[\"IDENTIFIER\"].MaterialSystem), line_dec4 = Object(inversify[\"inject\"])(g_webgpu_core_es[\"IDENTIFIER\"].Systems), line_dec5 = Object(inversify[\"named\"])(g_webgpu_core_es[\"IDENTIFIER\"].GeometrySystem), line_dec6 = Object(inversify[\"inject\"])(g_webgpu_core_es[\"IDENTIFIER\"].ShaderModuleService), line_dec(line_class = (line_class2 = (line_temp = /*#__PURE__*/function (_Renderable) {\n inherits_default()(Line, _Renderable);\n\n var _super = line_createSuper(Line);\n\n function Line() {\n var _this;\n\n classCallCheck_default()(this, Line);\n\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n _this = _super.call.apply(_super, [this].concat(args));\n\n initializerDefineProperty_default()(_this, \"materialSystem\", line_descriptor, assertThisInitialized_default()(_this));\n\n initializerDefineProperty_default()(_this, \"geometrySystem\", line_descriptor2, assertThisInitialized_default()(_this));\n\n initializerDefineProperty_default()(_this, \"shaderModuleService\", line_descriptor3, assertThisInitialized_default()(_this));\n\n _this.vertexCount = void 0;\n return _this;\n }\n\n createClass_default()(Line, [{\n key: \"onAttributeChanged\",\n value: function onAttributeChanged(_ref) {\n var name = _ref.name,\n data = _ref.data;\n var mesh = this.getMeshComponent();\n\n if (mesh && mesh.material) {\n switch (name) {\n case 'dashArray':\n mesh.material.setUniform('u_dash_array', data);\n break;\n\n case 'dashOffset':\n mesh.material.setUniform('u_dash_offset', data);\n break;\n\n case 'dashRatio':\n mesh.material.setUniform('u_dash_ratio', data);\n break;\n\n case 'thickness':\n mesh.material.setUniform('u_thickness', data);\n break;\n\n case 'color':\n var colors = new Array(this.vertexCount).fill(undefined).map(function () {\n return data;\n }).reduce(function (prev, cur) {\n // @ts-ignore\n return [].concat(toConsumableArray_default()(prev), toConsumableArray_default()(cur));\n }, []); // @ts-ignore\n\n mesh.geometry.setAttribute('a_color', Float32Array.from(colors), {\n arrayStride: 4 * 4,\n stepMode: 'vertex',\n attributes: [{\n shaderLocation: 1,\n offset: 0,\n format: 'float4'\n }]\n });\n break;\n }\n }\n }\n }, {\n key: \"onEntityCreated\",\n value: function onEntityCreated() {\n var _this2 = this;\n\n this.shaderModuleService.registerModule('line', {\n vs: lineVert,\n fs: lineFrag\n });\n\n var _this$shaderModuleSer = this.shaderModuleService.getModule('line'),\n vs = _this$shaderModuleSer.vs,\n fs = _this$shaderModuleSer.fs,\n extractedUniforms = _this$shaderModuleSer.uniforms;\n\n var material = this.materialSystem.createShaderMaterial({\n vertexShader: vs,\n fragmentShader: fs\n });\n\n var _getNormals = polyline_normals(this.config.points, false),\n normals = _getNormals.normals,\n attrIndex = _getNormals.attrIndex,\n attrPos = _getNormals.attrPos,\n attrCounters = _getNormals.attrCounters;\n\n var vertexCount = attrPos.length;\n this.vertexCount = vertexCount;\n var geometry = this.geometrySystem.createBufferGeometry({\n vertexCount: vertexCount\n });\n this.setMaterial(material);\n this.setGeometry(geometry);\n material.setCull({\n enable: false,\n face: g_webgpu_core_es[\"gl\"].BACK\n }) // @ts-ignore\n .setUniform(extractedUniforms);\n this.setAttributes({\n dashArray: this.config.dashArray,\n dashOffset: this.config.dashOffset,\n dashRatio: this.config.dashRatio,\n thickness: this.config.thickness\n });\n var attrNormal = [];\n var attrMiter = [];\n normals.forEach(function (n) {\n var norm = n[0];\n var miter = n[1];\n attrNormal.push([norm[0], norm[1]]); // @ts-ignore\n\n attrMiter.push(miter);\n }); // [[0,1,2], [2,1,3]]\n\n geometry.setIndex(attrIndex.reduce(function (prev, cur) {\n return [].concat(toConsumableArray_default()(prev), toConsumableArray_default()(cur));\n }, []));\n geometry.setAttribute('a_pos', Float32Array.from(attrPos.reduce(function (prev, cur) {\n return [].concat(toConsumableArray_default()(prev), toConsumableArray_default()(cur));\n }, [])), {\n arrayStride: 4 * 2,\n stepMode: 'vertex',\n attributes: [{\n shaderLocation: 0,\n offset: 0,\n format: 'float2'\n }]\n });\n var colors = new Array(vertexCount).fill(undefined).map(function () {\n return toConsumableArray_default()(_this2.config.color);\n }).reduce(function (prev, cur) {\n return [].concat(toConsumableArray_default()(prev), toConsumableArray_default()(cur));\n }, []);\n geometry.setAttribute('a_color', Float32Array.from(colors), {\n arrayStride: 4 * 4,\n stepMode: 'vertex',\n attributes: [{\n shaderLocation: 1,\n offset: 0,\n format: 'float4'\n }]\n });\n geometry.setAttribute('a_line_miter', Float32Array.from(attrMiter), {\n arrayStride: 4 * 1,\n stepMode: 'vertex',\n attributes: [{\n shaderLocation: 2,\n offset: 0,\n format: 'float'\n }]\n });\n geometry.setAttribute('a_line_normal', Float32Array.from(attrNormal.reduce(function (prev, cur) {\n return [].concat(toConsumableArray_default()(prev), toConsumableArray_default()(cur));\n }, [])), {\n arrayStride: 4 * 2,\n stepMode: 'vertex',\n attributes: [{\n shaderLocation: 3,\n offset: 0,\n format: 'float2'\n }]\n });\n geometry.setAttribute('a_counters', Float32Array.from(attrCounters), {\n arrayStride: 4 * 1,\n stepMode: 'vertex',\n attributes: [{\n shaderLocation: 4,\n offset: 0,\n format: 'float'\n }]\n });\n }\n }]);\n\n return Line;\n}(Renderable_Renderable), line_temp), (line_descriptor = applyDecoratedDescriptor_default()(line_class2.prototype, \"materialSystem\", [line_dec2, line_dec3], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n}), line_descriptor2 = applyDecoratedDescriptor_default()(line_class2.prototype, \"geometrySystem\", [line_dec4, line_dec5], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n}), line_descriptor3 = applyDecoratedDescriptor_default()(line_class2.prototype, \"shaderModuleService\", [line_dec6], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n})), line_class2)) || line_class);\n//# sourceMappingURL=index.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-webgpu/es/utils/picking.js\nfunction encodePickingColor(featureIdx) {\n return [featureIdx + 1 & 255, featureIdx + 1 >> 8 & 255, featureIdx + 1 >> 8 >> 8 & 255];\n}\n//# sourceMappingURL=picking.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-webgpu/es/renderable/point/index.js\n\n\n\n\n\n\n\n\n\n\n\n\nvar point_dec, point_dec2, point_dec3, point_dec4, point_dec5, point_dec6, point_class, point_class2, point_descriptor, point_descriptor2, point_descriptor3, point_temp;\n\nfunction point_ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }\n\nfunction point_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { point_ownKeys(Object(source), true).forEach(function (key) { defineProperty_default()(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { point_ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\nfunction point_createSuper(Derived) { var hasNativeReflectConstruct = point_isNativeReflectConstruct(); return function _createSuperInternal() { var Super = getPrototypeOf_default()(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = getPrototypeOf_default()(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return possibleConstructorReturn_default()(this, result); }; }\n\nfunction point_isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\n\n\n\n\n\n/* babel-plugin-inline-import './shaders/webgl.point.frag.glsl' */\nvar pointFrag = \"uniform float u_blur : 0.05;\\nuniform float u_opacity : 0.7;\\nuniform float u_stroke_width : 0.01;\\nuniform vec4 u_stroke_color : [0, 0, 0, 0];\\nuniform float u_stroke_opacity : 1;\\n\\nvarying vec4 v_color;\\nvarying vec4 v_data;\\nvarying float v_radius;\\n\\n#pragma include \\\"sdf2d\\\"\\n#pragma include \\\"picking\\\"\\n\\nvoid main() {\\n int shape = int(floor(v_data.w + 0.5));\\n\\n float antialiasblur = v_data.z;\\n float antialiased_blur = -max(u_blur, antialiasblur);\\n float r = v_radius / (v_radius + u_stroke_width);\\n\\n float outer_df;\\n float inner_df;\\n // 'circle', 'triangle', 'square', 'pentagon', 'hexagon', 'octogon', 'hexagram', 'rhombus', 'vesica'\\n // if (shape == 0) {\\n outer_df = sdCircle(v_data.xy, 1.0);\\n inner_df = sdCircle(v_data.xy, r);\\n // } else if (shape == 1) {\\n // outer_df = sdEquilateralTriangle(1.1 * v_data.xy);\\n // inner_df = sdEquilateralTriangle(1.1 / r * v_data.xy);\\n // } else if (shape == 2) {\\n // outer_df = sdBox(v_data.xy, vec2(1.));\\n // inner_df = sdBox(v_data.xy, vec2(r));\\n // } else if (shape == 3) {\\n // outer_df = sdPentagon(v_data.xy, 0.8);\\n // inner_df = sdPentagon(v_data.xy, r * 0.8);\\n // } else if (shape == 4) {\\n // outer_df = sdHexagon(v_data.xy, 0.8);\\n // inner_df = sdHexagon(v_data.xy, r * 0.8);\\n // } else if (shape == 5) {\\n // outer_df = sdOctogon(v_data.xy, 1.0);\\n // inner_df = sdOctogon(v_data.xy, r);\\n // } else if (shape == 6) {\\n // outer_df = sdHexagram(v_data.xy, 0.52);\\n // inner_df = sdHexagram(v_data.xy, r * 0.52);\\n // } else if (shape == 7) {\\n // outer_df = sdRhombus(v_data.xy, vec2(1.0));\\n // inner_df = sdRhombus(v_data.xy, vec2(r));\\n // } else if (shape == 8) {\\n // outer_df = sdVesica(v_data.xy, 1.1, 0.8);\\n // inner_df = sdVesica(v_data.xy, r * 1.1, r * 0.8);\\n // }\\n\\n float opacity_t = smoothstep(0.0, antialiased_blur, outer_df);\\n\\n float color_t = u_stroke_width < 0.01 ? 0.0 : smoothstep(\\n antialiased_blur,\\n 0.0,\\n inner_df\\n );\\n vec4 strokeColor = u_stroke_color == vec4(0) ? v_color : u_stroke_color;\\n\\n gl_FragColor = mix(vec4(v_color.rgb, v_color.a * u_opacity), strokeColor * u_stroke_opacity, color_t);\\n gl_FragColor.a = gl_FragColor.a * opacity_t;\\n\\n gl_FragColor = filterColor(gl_FragColor);\\n}\";\n\n/* babel-plugin-inline-import './shaders/webgl.point.vert.glsl' */\nvar pointVert = \"attribute vec2 position;\\nattribute vec4 color;\\nattribute float shape;\\nattribute vec2 offset;\\nattribute float size;\\n\\nuniform mat4 projectionMatrix;\\nuniform mat4 modelViewMatrix;\\n\\nuniform float u_stroke_width : 0.01;\\nuniform float u_device_pixel_ratio;\\nuniform vec2 u_viewport;\\n\\nvarying vec4 v_color;\\nvarying vec4 v_data;\\nvarying float v_radius;\\n\\n#pragma include \\\"picking\\\"\\n\\nvoid main() {\\n v_color = color;\\n v_radius = size;\\n\\n lowp float antialiasblur = 1.0 / u_device_pixel_ratio * (size + u_stroke_width);\\n\\n // construct point coords\\n v_data = vec4(position, antialiasblur, shape);\\n\\n gl_Position = projectionMatrix * modelViewMatrix\\n * vec4(position * size + offset, 0.0, 1.0);\\n\\n setPickingColor(a_PickingColor);\\n}\";\nvar pointShapes = ['circle', 'triangle', 'square', 'pentagon', 'hexagon', 'octogon', 'hexagram', 'rhombus', 'vesica'];\nvar point_Point = (point_dec = Object(inversify[\"injectable\"])(), point_dec2 = Object(inversify[\"inject\"])(g_webgpu_core_es[\"IDENTIFIER\"].Systems), point_dec3 = Object(inversify[\"named\"])(g_webgpu_core_es[\"IDENTIFIER\"].MaterialSystem), point_dec4 = Object(inversify[\"inject\"])(g_webgpu_core_es[\"IDENTIFIER\"].Systems), point_dec5 = Object(inversify[\"named\"])(g_webgpu_core_es[\"IDENTIFIER\"].GeometrySystem), point_dec6 = Object(inversify[\"inject\"])(g_webgpu_core_es[\"IDENTIFIER\"].ShaderModuleService), point_dec(point_class = (point_class2 = (point_temp = /*#__PURE__*/function (_Renderable) {\n inherits_default()(Point, _Renderable);\n\n var _super = point_createSuper(Point);\n\n function Point() {\n var _this;\n\n classCallCheck_default()(this, Point);\n\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n _this = _super.call.apply(_super, [this].concat(args));\n\n initializerDefineProperty_default()(_this, \"materialSystem\", point_descriptor, assertThisInitialized_default()(_this));\n\n initializerDefineProperty_default()(_this, \"geometrySystem\", point_descriptor2, assertThisInitialized_default()(_this));\n\n initializerDefineProperty_default()(_this, \"shaderModuleService\", point_descriptor3, assertThisInitialized_default()(_this));\n\n return _this;\n }\n\n createClass_default()(Point, [{\n key: \"onAttributeChanged\",\n value: function onAttributeChanged(_ref) {\n var name = _ref.name,\n data = _ref.data;\n var mesh = this.getMeshComponent();\n\n if (mesh && mesh.material) {\n if (name === 'strokeWidth') {\n mesh.material.setUniform('u_stroke_width', data);\n } else if (name === 'strokeColor') {\n mesh.material.setUniform('u_stroke_color', data);\n } else if (name === 'strokeOpacity') {\n mesh.material.setUniform('u_stroke_opacity', data);\n } else if (name === 'opacity') {\n mesh.material.setUniform('u_opacity', data);\n } else if (name === 'blur') {\n mesh.material.setUniform('u_blur', data);\n }\n }\n }\n }, {\n key: \"onEntityCreated\",\n value: function onEntityCreated() {\n this.shaderModuleService.registerModule('grid', {\n vs: pointVert,\n fs: pointFrag\n });\n\n var _this$shaderModuleSer = this.shaderModuleService.getModule('grid'),\n vs = _this$shaderModuleSer.vs,\n fs = _this$shaderModuleSer.fs,\n extractedUniforms = _this$shaderModuleSer.uniforms;\n\n var material = this.materialSystem.createShaderMaterial({\n vertexShader: vs,\n fragmentShader: fs,\n cull: {\n enable: false\n },\n depth: {\n enable: false\n },\n blend: {\n enable: true,\n func: {\n srcRGB: g_webgpu_core_es[\"gl\"].SRC_ALPHA,\n dstRGB: g_webgpu_core_es[\"gl\"].ONE_MINUS_SRC_ALPHA,\n srcAlpha: 1,\n dstAlpha: 1\n }\n }\n }); // TODO: support define stroke-relative props per point\n\n material.setUniform(point_objectSpread({\n u_device_pixel_ratio: window.devicePixelRatio\n }, extractedUniforms));\n var attributes = this.buildAttributes();\n var geometry = this.geometrySystem.createInstancedBufferGeometry({\n maxInstancedCount: attributes.instancedOffsets.length / 2,\n vertexCount: 6\n });\n geometry.setIndex([0, 2, 1, 0, 3, 2]);\n geometry.setAttribute('position', Float32Array.from(attributes.positions), {\n arrayStride: 4 * 2,\n stepMode: 'vertex',\n attributes: [{\n shaderLocation: 0,\n offset: 0,\n format: 'float2'\n }]\n });\n geometry.setAttribute('offset', Float32Array.from(attributes.instancedOffsets), {\n arrayStride: 4 * 2,\n stepMode: 'instance',\n attributes: [{\n shaderLocation: 1,\n offset: 0,\n format: 'float2'\n }]\n });\n geometry.setAttribute('color', Float32Array.from(attributes.instancedColors), {\n arrayStride: 4 * 4,\n stepMode: 'instance',\n attributes: [{\n shaderLocation: 2,\n offset: 0,\n format: 'float4'\n }]\n });\n geometry.setAttribute('size', Float32Array.from(attributes.instancedSizes), {\n arrayStride: 4,\n stepMode: 'instance',\n attributes: [{\n shaderLocation: 3,\n offset: 0,\n format: 'float'\n }]\n });\n geometry.setAttribute('shape', Float32Array.from(attributes.instancedShapes), {\n arrayStride: 4,\n stepMode: 'instance',\n attributes: [{\n shaderLocation: 4,\n offset: 0,\n format: 'float'\n }]\n });\n geometry.setAttribute('a_PickingColor', Float32Array.from(attributes.instancedPickingColors), {\n arrayStride: 4 * 3,\n stepMode: 'instance',\n attributes: [{\n shaderLocation: 6,\n offset: 0,\n format: 'float3'\n }]\n });\n this.setMaterial(material);\n this.setGeometry(geometry);\n }\n }, {\n key: \"buildAttribute\",\n value: function buildAttribute(config, attributes, index) {\n var _attributes$instanced, _attributes$instanced2, _attributes$instanced3, _attributes$instanced4;\n\n (_attributes$instanced = attributes.instancedPickingColors).push.apply(_attributes$instanced, toConsumableArray_default()(encodePickingColor(config.id || index)));\n\n attributes.instancedShapes.push(pointShapes.indexOf(config.shape || 'circle'));\n\n (_attributes$instanced2 = attributes.instancedColors).push.apply(_attributes$instanced2, toConsumableArray_default()(config.color || [1, 0, 0, 1]));\n\n (_attributes$instanced3 = attributes.instancedOffsets).push.apply(_attributes$instanced3, toConsumableArray_default()(config.position || [0, 0]));\n\n (_attributes$instanced4 = attributes.instancedSizes).push.apply(_attributes$instanced4, toConsumableArray_default()(config.size || [0.2, 0.2]));\n }\n }, {\n key: \"buildAttributes\",\n value: function buildAttributes() {\n var _this2 = this;\n\n var attributes = {\n positions: [1, 1, 1, -1, -1, -1, -1, 1],\n instancedOffsets: [],\n instancedColors: [],\n instancedSizes: [],\n instancedShapes: [],\n instancedPickingColors: []\n };\n\n if (Array.isArray(this.config)) {\n this.config.forEach(function (config, i) {\n _this2.buildAttribute(config, attributes, i);\n });\n } else {\n this.buildAttribute(this.config, attributes, 0);\n }\n\n return attributes;\n }\n }]);\n\n return Point;\n}(Renderable_Renderable), point_temp), (point_descriptor = applyDecoratedDescriptor_default()(point_class2.prototype, \"materialSystem\", [point_dec2, point_dec3], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n}), point_descriptor2 = applyDecoratedDescriptor_default()(point_class2.prototype, \"geometrySystem\", [point_dec4, point_dec5], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n}), point_descriptor3 = applyDecoratedDescriptor_default()(point_class2.prototype, \"shaderModuleService\", [point_dec6], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n})), point_class2)) || point_class);\n//# sourceMappingURL=index.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-webgpu/es/Renderer.js\n\n\n\n\n\n\n\n\nvar Renderer_dec, Renderer_dec2, Renderer_dec3, Renderer_dec4, Renderer_class, Renderer_class2, Renderer_descriptor, Renderer_descriptor2, Renderer_descriptor3, Renderer_temp;\n\nfunction _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\n // tslint:disable-next-line:no-submodule-imports\n\n\n\n\n/* babel-plugin-inline-import './material/shaders/map.frag.declaration.glsl' */\nvar mapFragDeclaration = \"#ifdef USE_MAP\\n uniform sampler2D map;\\n#endif\";\n\n/* babel-plugin-inline-import './material/shaders/map.frag.main.glsl' */\nvar mapFragMain = \"#ifdef USE_MAP\\n vec4 texelColor = texture2D(map, vUv);\\n // texelColor = mapTexelToLinear(texelColor);\\n diffuseColor *= texelColor;\\n#endif\";\n\n/* babel-plugin-inline-import './material/shaders/uv.frag.declaration.glsl' */\nvar uvFragDeclaration = \"#if (defined( USE_UV ) && ! defined( UVS_VERTEX_ONLY ))\\n varying vec2 vUv;\\n#endif\";\n\n/* babel-plugin-inline-import './material/shaders/uv.vert.declaration.glsl' */\nvar uvVertDeclaration = \"#ifdef USE_UV\\n attribute vec2 uv;\\n\\t#ifdef UVS_VERTEX_ONLY\\n vec2 vUv;\\n\\t#else\\n\\t\\tvarying vec2 vUv;\\n\\t#endif\\n\\tuniform mat3 uvTransform;\\n#endif\";\n\n/* babel-plugin-inline-import './material/shaders/uv.vert.main.glsl' */\nvar uvVertMain = \"#ifdef USE_UV\\n vUv = (uvTransform * vec3(uv, 1)).xy;\\n#endif\";\nvar Renderer_Renderer = (Renderer_dec = Object(inversify[\"injectable\"])(), Renderer_dec2 = Object(inversify[\"inject\"])(g_webgpu_core_es[\"IDENTIFIER\"].RenderEngine), Renderer_dec3 = Object(inversify[\"inject\"])(g_webgpu_core_es[\"IDENTIFIER\"].ShaderModuleService), Renderer_dec4 = Object(inversify[\"inject\"])(g_webgpu_core_es[\"IDENTIFIER\"].ConfigService), Renderer_dec(Renderer_class = (Renderer_class2 = (Renderer_temp = /*#__PURE__*/function () {\n function Renderer() {\n classCallCheck_default()(this, Renderer);\n\n this.container = void 0;\n\n initializerDefineProperty_default()(this, \"engine\", Renderer_descriptor, this);\n\n initializerDefineProperty_default()(this, \"shaderModule\", Renderer_descriptor2, this);\n\n initializerDefineProperty_default()(this, \"configService\", Renderer_descriptor3, this);\n\n this.inited = false;\n this.rendering = false;\n this.pendings = [];\n this.views = [];\n this.size = void 0;\n }\n\n createClass_default()(Renderer, [{\n key: \"init\",\n value: function () {\n var _init = asyncToGenerator_default()( /*#__PURE__*/regenerator_default.a.mark(function _callee() {\n var systems, config, _iterator, _step, system;\n\n return regenerator_default.a.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n // 模块化处理\n this.shaderModule.registerBuiltinModules();\n this.shaderModule.registerModule('uv.vert.declaration', {\n vs: uvVertDeclaration\n });\n this.shaderModule.registerModule('uv.vert.main', {\n vs: uvVertMain\n });\n this.shaderModule.registerModule('uv.frag.declaration', {\n fs: uvFragDeclaration\n });\n this.shaderModule.registerModule('map.frag.declaration', {\n fs: mapFragDeclaration\n });\n this.shaderModule.registerModule('map.frag.main', {\n fs: mapFragMain\n });\n systems = this.container.getAll(g_webgpu_core_es[\"IDENTIFIER\"].Systems);\n config = this.configService.get();\n\n if (!config.canvas) {\n _context.next = 30;\n break;\n }\n\n _context.next = 11;\n return this.engine.init({\n canvas: config.canvas,\n swapChainFormat: constants[\"TextureFormat\"].BGRA8Unorm,\n antialiasing: false\n });\n\n case 11:\n _iterator = _createForOfIteratorHelper(systems);\n _context.prev = 12;\n\n _iterator.s();\n\n case 14:\n if ((_step = _iterator.n()).done) {\n _context.next = 21;\n break;\n }\n\n system = _step.value;\n\n if (!system.initialize) {\n _context.next = 19;\n break;\n }\n\n _context.next = 19;\n return system.initialize();\n\n case 19:\n _context.next = 14;\n break;\n\n case 21:\n _context.next = 26;\n break;\n\n case 23:\n _context.prev = 23;\n _context.t0 = _context[\"catch\"](12);\n\n _iterator.e(_context.t0);\n\n case 26:\n _context.prev = 26;\n\n _iterator.f();\n\n return _context.finish(26);\n\n case 29:\n this.inited = true;\n\n case 30:\n case \"end\":\n return _context.stop();\n }\n }\n }, _callee, this, [[12, 23, 26, 29]]);\n }));\n\n function init() {\n return _init.apply(this, arguments);\n }\n\n return init;\n }()\n }, {\n key: \"render\",\n value: function () {\n var _render = asyncToGenerator_default()( /*#__PURE__*/regenerator_default.a.mark(function _callee2() {\n var systems,\n _len,\n views,\n _key,\n _iterator2,\n _step2,\n system,\n _args2 = arguments;\n\n return regenerator_default.a.wrap(function _callee2$(_context2) {\n while (1) {\n switch (_context2.prev = _context2.next) {\n case 0:\n if (!(!this.inited || this.rendering)) {\n _context2.next = 2;\n break;\n }\n\n return _context2.abrupt(\"return\");\n\n case 2:\n if (this.pendings.length) {\n this.pendings.forEach(function (pending) {\n pending();\n });\n }\n\n this.rendering = true;\n this.engine.beginFrame();\n systems = this.container.getAll(g_webgpu_core_es[\"IDENTIFIER\"].Systems);\n\n for (_len = _args2.length, views = new Array(_len), _key = 0; _key < _len; _key++) {\n views[_key] = _args2[_key];\n }\n\n _iterator2 = _createForOfIteratorHelper(systems);\n _context2.prev = 8;\n\n _iterator2.s();\n\n case 10:\n if ((_step2 = _iterator2.n()).done) {\n _context2.next = 17;\n break;\n }\n\n system = _step2.value;\n\n if (!system.execute) {\n _context2.next = 15;\n break;\n }\n\n _context2.next = 15;\n return system.execute(views);\n\n case 15:\n _context2.next = 10;\n break;\n\n case 17:\n _context2.next = 22;\n break;\n\n case 19:\n _context2.prev = 19;\n _context2.t0 = _context2[\"catch\"](8);\n\n _iterator2.e(_context2.t0);\n\n case 22:\n _context2.prev = 22;\n\n _iterator2.f();\n\n return _context2.finish(22);\n\n case 25:\n // 录制一遍绘制命令,后续直接播放\n // if (this.useRenderBundle) {\n // if (!this.renderBundleRecorded) {\n // this.engine.startRecordBundle();\n // if (this.onUpdate) {\n // await this.onUpdate(this.engine);\n // }\n // this.renderBundle = this.engine.stopRecordBundle();\n // this.renderBundleRecorded = true;\n // }\n // this.engine.executeBundles([this.renderBundle]);\n // } else {\n // if (this.onUpdate) {\n // await this.onUpdate(this.engine);\n // }\n // }\n this.engine.endFrame();\n this.rendering = false;\n\n case 27:\n case \"end\":\n return _context2.stop();\n }\n }\n }, _callee2, this, [[8, 19, 22, 25]]);\n }));\n\n function render() {\n return _render.apply(this, arguments);\n }\n\n return render;\n }()\n }, {\n key: \"clear\",\n value: function clear(options) {\n var _this = this;\n\n if (this.inited) {\n this.engine.clear(options);\n } else {\n this.pendings.unshift(function () {\n _this.engine.clear(options);\n\n _this.pendings.shift();\n });\n }\n\n return this;\n } // public setScissor(\n // scissor: Partial<{\n // enable: boolean;\n // box: {\n // x: number;\n // y: number;\n // width: number;\n // height: number;\n // };\n // }>,\n // ) {\n // this.engine.setScissor(scissor);\n // return this;\n // }\n\n }, {\n key: \"setSize\",\n value: function setSize(_ref) {\n var width = _ref.width,\n height = _ref.height;\n var canvas = this.engine.getCanvas();\n this.size = {\n width: width,\n height: height\n };\n canvas.width = width;\n canvas.height = height;\n return this;\n }\n }, {\n key: \"getSize\",\n value: function getSize() {\n return this.size;\n }\n }]);\n\n return Renderer;\n}(), Renderer_temp), (Renderer_descriptor = applyDecoratedDescriptor_default()(Renderer_class2.prototype, \"engine\", [Renderer_dec2], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n}), Renderer_descriptor2 = applyDecoratedDescriptor_default()(Renderer_class2.prototype, \"shaderModule\", [Renderer_dec3], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n}), Renderer_descriptor3 = applyDecoratedDescriptor_default()(Renderer_class2.prototype, \"configService\", [Renderer_dec4], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n})), Renderer_class2)) || Renderer_class);\n//# sourceMappingURL=Renderer.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-webgpu/es/Scene.js\n\n\n\nvar Scene_dec, Scene_class, Scene_temp;\n\n\nvar Scene_Scene = (Scene_dec = Object(inversify[\"injectable\"])(), Scene_dec(Scene_class = (Scene_temp = /*#__PURE__*/function () {\n function Scene() {\n classCallCheck_default()(this, Scene);\n\n this.entities = [];\n }\n\n createClass_default()(Scene, [{\n key: \"getEntities\",\n value: function getEntities() {\n return this.entities;\n }\n }, {\n key: \"addRenderable\",\n value: function addRenderable(renderable) {\n this.addEntity(renderable.getEntity());\n return this;\n }\n }, {\n key: \"removeRenderable\",\n value: function removeRenderable(renderable) {\n this.removeEntity(renderable.getEntity());\n return this;\n }\n }, {\n key: \"addLight\",\n value: function addLight() {}\n }, {\n key: \"addEntity\",\n value: function addEntity(entity) {\n if (this.entities.indexOf(entity) === -1) {\n this.entities.push(entity);\n }\n\n return this;\n }\n }, {\n key: \"removeEntity\",\n value: function removeEntity(entity) {\n var index = this.entities.indexOf(entity);\n this.entities.splice(index, 1);\n return this;\n }\n }]);\n\n return Scene;\n}(), Scene_temp)) || Scene_class);\n//# sourceMappingURL=Scene.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-webgpu/es/texture/Cache.js\n\n\n\nvar Cache_dec, Cache_class, Cache_temp;\n\n\nvar Cache_TextureCache = (Cache_dec = Object(inversify[\"injectable\"])(), Cache_dec(Cache_class = (Cache_temp = /*#__PURE__*/function () {\n function TextureCache() {\n classCallCheck_default()(this, TextureCache);\n\n this.cache = {};\n }\n\n createClass_default()(TextureCache, [{\n key: \"get\",\n value: function get(name) {\n return this.cache[name];\n }\n }, {\n key: \"set\",\n value: function set(name, texture) {\n this.cache[name] = texture;\n }\n }]);\n\n return TextureCache;\n}(), Cache_temp)) || Cache_class);\n//# sourceMappingURL=Cache.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-webgpu/es/texture/Texture2D.js\n\n\n\n\n\n\n\n\n\nvar Texture2D_dec, Texture2D_dec2, Texture2D_dec3, Texture2D_class, Texture2D_class2, Texture2D_descriptor, Texture2D_descriptor2, Texture2D_temp;\n\nfunction Texture2D_ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }\n\nfunction Texture2D_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { Texture2D_ownKeys(Object(source), true).forEach(function (key) { defineProperty_default()(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { Texture2D_ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\n\n\n\nvar Texture2D_Texture2D = (Texture2D_dec = Object(inversify[\"injectable\"])(), Texture2D_dec2 = Object(inversify[\"inject\"])(Cache_TextureCache), Texture2D_dec3 = Object(inversify[\"inject\"])(g_webgpu_core_es[\"IDENTIFIER\"].RenderEngine), Texture2D_dec(Texture2D_class = (Texture2D_class2 = (Texture2D_temp = /*#__PURE__*/function () {\n function Texture2D() {\n classCallCheck_default()(this, Texture2D);\n\n initializerDefineProperty_default()(this, \"textureCache\", Texture2D_descriptor, this);\n\n initializerDefineProperty_default()(this, \"engine\", Texture2D_descriptor2, this);\n\n this.config = void 0;\n this.loaded = false;\n this.texture = void 0;\n }\n\n createClass_default()(Texture2D, [{\n key: \"setConfig\",\n value: function setConfig(config) {\n this.config = config;\n }\n }, {\n key: \"isLoaded\",\n value: function isLoaded() {\n return this.loaded;\n } // public update(config: ITexture2DInitializationOptions) {\n // if (this.loaded && this.texture) {\n // const t = this.texture.get();\n // }\n // }\n\n }, {\n key: \"load\",\n value: function () {\n var _load = asyncToGenerator_default()( /*#__PURE__*/regenerator_default.a.mark(function _callee() {\n var _this = this;\n\n return regenerator_default.a.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n if (!this.config.url) {\n _context.next = 4;\n break;\n }\n\n return _context.abrupt(\"return\", new Promise(function (resolve, reject) {\n var existed = _this.textureCache.get(_this.config.url);\n\n if (existed) {\n resolve(existed);\n } else {\n var image = new Image();\n image.crossOrigin = 'Anonymous';\n image.src = _this.config.url;\n\n image.onload = function () {\n var texture = _this.engine.createTexture2D(Texture2D_objectSpread(Texture2D_objectSpread({}, _this.config), {}, {\n data: image,\n width: image.width,\n height: image.height,\n flipY: true\n }));\n\n _this.textureCache.set(_this.config.url, texture);\n\n _this.texture = texture;\n _this.loaded = true;\n resolve(texture);\n };\n\n image.onerror = function () {\n reject();\n };\n }\n }));\n\n case 4:\n this.loaded = true;\n this.texture = this.engine.createTexture2D(this.config);\n return _context.abrupt(\"return\", this.texture);\n\n case 7:\n case \"end\":\n return _context.stop();\n }\n }\n }, _callee, this);\n }));\n\n function load() {\n return _load.apply(this, arguments);\n }\n\n return load;\n }()\n }]);\n\n return Texture2D;\n}(), Texture2D_temp), (Texture2D_descriptor = applyDecoratedDescriptor_default()(Texture2D_class2.prototype, \"textureCache\", [Texture2D_dec2], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n}), Texture2D_descriptor2 = applyDecoratedDescriptor_default()(Texture2D_class2.prototype, \"engine\", [Texture2D_dec3], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n})), Texture2D_class2)) || Texture2D_class);\n//# sourceMappingURL=Texture2D.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-webgpu/es/View.js\n\n\n\n\n\n\nvar View_dec, View_dec2, View_dec3, View_class, View_class2, View_descriptor, View_temp;\n\n\n\nvar View_View = (View_dec = Object(inversify[\"injectable\"])(), View_dec2 = Object(inversify[\"inject\"])(g_webgpu_core_es[\"IDENTIFIER\"].Systems), View_dec3 = Object(inversify[\"named\"])(g_webgpu_core_es[\"IDENTIFIER\"].RendererSystem), View_dec(View_class = (View_class2 = (View_temp = /*#__PURE__*/function () {\n function View() {\n classCallCheck_default()(this, View);\n\n initializerDefineProperty_default()(this, \"rendererSystem\", View_descriptor, this);\n\n this.camera = void 0;\n this.scene = void 0;\n this.viewport = {\n x: 0,\n y: 0,\n width: 0,\n height: 0\n };\n this.clearColor = [1, 1, 1, 1];\n }\n\n createClass_default()(View, [{\n key: \"getCamera\",\n value: function getCamera() {\n return this.camera;\n }\n }, {\n key: \"getScene\",\n value: function getScene() {\n return this.scene;\n }\n }, {\n key: \"getViewport\",\n value: function getViewport() {\n return this.viewport;\n }\n }, {\n key: \"getClearColor\",\n value: function getClearColor() {\n return this.clearColor;\n }\n }, {\n key: \"setCamera\",\n value: function setCamera(camera) {\n this.camera = camera;\n return this;\n }\n }, {\n key: \"setScene\",\n value: function setScene(scene) {\n this.scene = scene;\n return this;\n }\n }, {\n key: \"setViewport\",\n value: function setViewport(viewport) {\n this.viewport = viewport;\n return this;\n }\n }, {\n key: \"setClearColor\",\n value: function setClearColor(clearColor) {\n this.clearColor = clearColor;\n return this;\n }\n }, {\n key: \"pick\",\n value: function pick(position) {\n return this.rendererSystem.pick(position, this);\n }\n }]);\n\n return View;\n}(), View_temp), (View_descriptor = applyDecoratedDescriptor_default()(View_class2.prototype, \"rendererSystem\", [View_dec2, View_dec3], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n})), View_class2)) || View_class);\n//# sourceMappingURL=View.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-webgpu/es/World.js\n\n\n\n\n\n\n\n\n\nvar World_dec, World_dec2, World_class, World_class2, World_descriptor, World_temp;\n\nfunction World_ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }\n\nfunction World_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { World_ownKeys(Object(source), true).forEach(function (key) { defineProperty_default()(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { World_ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\n// tslint:disable-next-line:no-reference\n/// \n\n // tslint:disable-next-line:no-submodule-imports\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nvar World_World = (World_dec = Object(inversify[\"injectable\"])(), World_dec2 = Object(inversify[\"inject\"])(g_webgpu_core_es[\"IDENTIFIER\"].ConfigService), World_dec(World_class = (World_class2 = (World_temp = /*#__PURE__*/function () {\n function World() {\n classCallCheck_default()(this, World);\n\n initializerDefineProperty_default()(this, \"configService\", World_descriptor, this);\n\n this.container = void 0;\n }\n\n createClass_default()(World, [{\n key: \"getEngine\",\n value: function () {\n var _getEngine = asyncToGenerator_default()( /*#__PURE__*/regenerator_default.a.mark(function _callee() {\n var engine, _this$configService$g, canvas, engineOptions;\n\n return regenerator_default.a.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n engine = this.container.get(g_webgpu_core_es[\"IDENTIFIER\"].RenderEngine);\n _this$configService$g = this.configService.get(), canvas = _this$configService$g.canvas, engineOptions = _this$configService$g.engineOptions;\n _context.next = 4;\n return engine.init(World_objectSpread({\n canvas: canvas || createCanvas(),\n swapChainFormat: constants[\"TextureFormat\"].BGRA8Unorm,\n antialiasing: false\n }, engineOptions));\n\n case 4:\n return _context.abrupt(\"return\", engine);\n\n case 5:\n case \"end\":\n return _context.stop();\n }\n }\n }, _callee, this);\n }));\n\n function getEngine() {\n return _getEngine.apply(this, arguments);\n }\n\n return getEngine;\n }()\n /**\n * get transform component\n * @param entity\n */\n\n }, {\n key: \"getTransformComponent\",\n value: function getTransformComponent(entity) {\n var manager = this.container.get(g_webgpu_core_es[\"IDENTIFIER\"].TransformComponentManager);\n return manager.getComponentByEntity(entity);\n }\n }, {\n key: \"getMeshComponent\",\n value: function getMeshComponent(entity) {\n var manager = this.container.get(g_webgpu_core_es[\"IDENTIFIER\"].MeshComponentManager);\n return manager.getComponentByEntity(entity);\n }\n }, {\n key: \"setConfig\",\n value: function setConfig(config) {\n this.configService.set(config);\n }\n }, {\n key: \"setContainer\",\n value: function setContainer(container) {\n this.container = container;\n }\n }, {\n key: \"getContainer\",\n value: function getContainer() {\n return this.container;\n }\n }, {\n key: \"createEntity\",\n value: function createEntity() {\n return Object(g_webgpu_core_es[\"createEntity\"])();\n }\n }, {\n key: \"createScene\",\n value: function createScene() {\n return this.container.get(Scene_Scene);\n }\n }, {\n key: \"createCamera\",\n value: function createCamera() {\n return this.container.get(Camera_Camera);\n }\n }, {\n key: \"createView\",\n value: function createView() {\n return this.container.get(View_View);\n } // public createLight(type: string,) {\n // return this.container.getNamed(IDENTIFIER.Light, type)\n // }\n\n }, {\n key: \"createRenderable\",\n value: function createRenderable(type, config) {\n var renderable = type ? this.container.getNamed(g_webgpu_core_es[\"IDENTIFIER\"].Renderable, type) : this.container.get(Renderable_Renderable);\n\n var entity = Object(g_webgpu_core_es[\"createEntity\"])();\n\n renderable.setConfig(config || {});\n renderable.setEntity(entity);\n return renderable;\n }\n }, {\n key: \"createGeometry\",\n value: function createGeometry(type, config) {\n var geometry = this.container.getNamed(g_webgpu_core_es[\"IDENTIFIER\"].Geometry, type);\n\n var entity = Object(g_webgpu_core_es[\"createEntity\"])();\n\n geometry.setConfig(config || {});\n geometry.setEntity(entity);\n return geometry.getComponent();\n }\n }, {\n key: \"createMaterial\",\n value: function createMaterial(type, config) {\n var material = this.container.getNamed(g_webgpu_core_es[\"IDENTIFIER\"].Material, type);\n\n var entity = Object(g_webgpu_core_es[\"createEntity\"])();\n\n material.setConfig(config || {});\n material.setEntity(entity, type);\n return material.getComponent();\n }\n }, {\n key: \"createTexture2D\",\n value: function createTexture2D(config) {\n var texture = this.container.get(Texture2D_Texture2D);\n texture.setConfig(config);\n return texture;\n }\n }, {\n key: \"createBufferGeometry\",\n value: function createBufferGeometry(params) {\n var geometrySystem = this.container.getNamed(g_webgpu_core_es[\"IDENTIFIER\"].Systems, g_webgpu_core_es[\"IDENTIFIER\"].GeometrySystem);\n return geometrySystem.createBufferGeometry(params);\n }\n }, {\n key: \"createInstancedBufferGeometry\",\n value: function createInstancedBufferGeometry(params) {\n var geometrySystem = this.container.getNamed(g_webgpu_core_es[\"IDENTIFIER\"].Systems, g_webgpu_core_es[\"IDENTIFIER\"].GeometrySystem);\n return geometrySystem.createInstancedBufferGeometry(params);\n }\n }, {\n key: \"createShaderMaterial\",\n value: function createShaderMaterial(params) {\n var materialSystem = this.container.getNamed(g_webgpu_core_es[\"IDENTIFIER\"].Systems, g_webgpu_core_es[\"IDENTIFIER\"].MaterialSystem);\n return materialSystem.createShaderMaterial(params);\n }\n }, {\n key: \"createKernel\",\n value: function createKernel(precompiledBundle) {\n var kernel = this.container.get(Kernel_Kernel);\n\n if (typeof precompiledBundle === 'string') {\n kernel.setBundle(JSON.parse(precompiledBundle));\n } else {\n kernel.setBundle(precompiledBundle);\n }\n\n kernel.init();\n return kernel;\n }\n }, {\n key: \"createRenderer\",\n value: function createRenderer() {\n var renderer = this.container.get(Renderer_Renderer);\n renderer.container = this.container;\n renderer.init();\n return renderer;\n }\n }, {\n key: \"destroy\",\n value: function destroy() {\n var systems = this.container.getAll(g_webgpu_core_es[\"IDENTIFIER\"].Systems);\n systems.forEach(function (system) {\n if (system.tearDown) {\n system.tearDown();\n }\n });\n var engine = this.container.get(g_webgpu_core_es[\"IDENTIFIER\"].RenderEngine);\n engine.destroy();\n var interactor = this.container.get(g_webgpu_core_es[\"IDENTIFIER\"].InteractorService);\n interactor.destroy();\n }\n }], [{\n key: \"create\",\n value: function create() {\n var config = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var worldContainer = Object(g_webgpu_core_es[\"createWorldContainer\"])(); // bind render engine, fallback to WebGL\n\n var engineClazz = !navigator.gpu ? webgl_WebGLEngine : webgpu_WebGPUEngine;\n\n if (!worldContainer.isBound(g_webgpu_core_es[\"IDENTIFIER\"].RenderEngine)) {\n worldContainer.bind(g_webgpu_core_es[\"IDENTIFIER\"].RenderEngine) // @ts-ignore\n .to(engineClazz).inSingletonScope();\n }\n\n worldContainer.bind(Renderer_Renderer).toSelf();\n worldContainer.bind(Kernel_Kernel).toSelf();\n worldContainer.bind(Renderable_Renderable).toSelf();\n worldContainer.bind(View_View).toSelf();\n worldContainer.bind(Camera_Camera).toSelf();\n worldContainer.bind(Scene_Scene).toSelf();\n worldContainer.bind(World).toSelf();\n worldContainer.bind(Cache_TextureCache).toSelf();\n worldContainer.bind(Texture2D_Texture2D).toSelf(); // bind geometries\n\n worldContainer.bind(g_webgpu_core_es[\"IDENTIFIER\"].Geometry).to(Box_Box).whenTargetNamed(geometry_Geometry.BOX);\n worldContainer.bind(g_webgpu_core_es[\"IDENTIFIER\"].Geometry).to(Sphere_Sphere).whenTargetNamed(geometry_Geometry.SPHERE);\n worldContainer.bind(g_webgpu_core_es[\"IDENTIFIER\"].Geometry).to(Plane_Plane).whenTargetNamed(geometry_Geometry.PLANE);\n worldContainer.bind(g_webgpu_core_es[\"IDENTIFIER\"].Geometry).to(Merged_Merged).whenTargetNamed(geometry_Geometry.MERGED); // bind materials\n\n worldContainer.bind(g_webgpu_core_es[\"IDENTIFIER\"].Material).to(basic_Basic).whenTargetNamed(material_Material.BASIC); // bind renderables\n\n worldContainer.bind(g_webgpu_core_es[\"IDENTIFIER\"].Renderable).to(point_Point).whenTargetNamed(Renderable_Renderable.POINT);\n worldContainer.bind(g_webgpu_core_es[\"IDENTIFIER\"].Renderable).to(line_Line).whenTargetNamed(Renderable_Renderable.LINE);\n worldContainer.bind(g_webgpu_core_es[\"IDENTIFIER\"].Renderable).to(grid_Grid).whenTargetNamed(Renderable_Renderable.GRID);\n var world = worldContainer.get(World);\n world.setContainer(worldContainer);\n world.setConfig(config);\n return world;\n }\n }]);\n\n return World;\n}(), World_temp), (World_descriptor = applyDecoratedDescriptor_default()(World_class2.prototype, \"configService\", [World_dec2], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n})), World_class2)) || World_class);\n//# sourceMappingURL=World.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-webgpu/es/index.js\n\n\n\n\n\n\n\n//# sourceMappingURL=index.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/layout/es/util/gpu.js\n\n\n/**\n * 将 number | Function 类型的参数转换为 return number 的 Function\n * @param {number | Function} value 需要被转换的值\n * @param {number} defaultV 返回函数的默认返回值\n * @return {Function} 转换后的函数\n */\nconst gpu_proccessToFunc = (value, defaultV) => {\n let func;\n if (!value) {\n func = () => {\n return defaultV || 1;\n };\n }\n else if (isNumber(value)) {\n func = () => {\n return value;\n };\n }\n else {\n func = value;\n }\n return func;\n};\n/**\n * 将节点和边数据转换为 GPU 可读的数组。并返回 maxEdgePerVetex,每个节点上最多的边数\n * @param {NodeConfig[]} nodes 需要被转换的值\n * @param {EdgeConfig[]} edges 返回函数的默认返回值\n * @return {Object} 转换后的数组及 maxEdgePerVetex 组成的对象\n */\nconst buildTextureData = (nodes, edges) => {\n const dataArray = [];\n const nodeDict = [];\n const mapIdPos = {};\n let i = 0;\n for (i = 0; i < nodes.length; i++) {\n const n = nodes[i];\n mapIdPos[n.id] = i;\n dataArray.push(n.x);\n dataArray.push(n.y);\n dataArray.push(0);\n dataArray.push(0);\n nodeDict.push([]);\n }\n for (i = 0; i < edges.length; i++) {\n const e = edges[i];\n const source = getEdgeTerminal(e, 'source');\n const target = getEdgeTerminal(e, 'target');\n nodeDict[mapIdPos[source]].push(mapIdPos[target]);\n nodeDict[mapIdPos[target]].push(mapIdPos[source]);\n }\n let maxEdgePerVetex = 0;\n for (i = 0; i < nodes.length; i++) {\n const offset = dataArray.length;\n const dests = nodeDict[i];\n const len = dests.length;\n dataArray[i * 4 + 2] = offset;\n dataArray[i * 4 + 3] = dests.length;\n maxEdgePerVetex = Math.max(maxEdgePerVetex, dests.length);\n for (let j = 0; j < len; ++j) {\n const dest = dests[j];\n dataArray.push(+dest);\n }\n }\n while (dataArray.length % 4 !== 0) {\n dataArray.push(0);\n }\n return {\n maxEdgePerVetex,\n array: new Float32Array(dataArray),\n };\n};\n/**\n* 将节点和边数据转换为 GPU 可读的数组,每条边带有一个属性。并返回 maxEdgePerVetex,每个节点上最多的边数\n* @param {NodeConfig[]} nodes 节点数组\n* @param {EdgeConfig[]} edges 边数组\n* @param {Function} attrs 读取边属性的函数\n* @return {Object} 转换后的数组及 maxEdgePerVetex 组成的对象\n*/\n// export const buildTextureDataWithOneEdgeAttr = (nodes: OutNode[], edges: Edge[], attrs: Function): {\n// array: Float32Array,\n// maxEdgePerVetex: number\n// } => {\n// const dataArray = [];\n// const nodeDict: any = [];\n// const mapIdPos: IndexMap = {};\n// let i = 0;\n// for (i = 0; i < nodes.length; i++) {\n// const n = nodes[i];\n// mapIdPos[n.id] = i;\n// dataArray.push(n.x);\n// dataArray.push(n.y);\n// dataArray.push(0);\n// dataArray.push(0);\n// nodeDict.push([]);\n// }\n// for (i = 0; i < edges.length; i++) {\n// const e = edges[i];\n// nodeDict[mapIdPos[e.source]].push(mapIdPos[e.target]);\n// nodeDict[mapIdPos[e.source]].push(attrs(e)); // 理想边长,后续可以改成每条边不同\n// nodeDict[mapIdPos[e.target]].push(mapIdPos[e.source]);\n// nodeDict[mapIdPos[e.target]].push(attrs(e)); // 理想边长,后续可以改成每条边不同\n// }\n// let maxEdgePerVetex = 0;\n// for (i = 0; i < nodes.length; i++) {\n// const offset: number = dataArray.length;\n// const dests = nodeDict[i]; // dest 中节点 id 与边长间隔存储,即一位节点 id,一位边长……\n// const len = dests.length;\n// dataArray[i * 4 + 2] = offset;\n// dataArray[i * 4 + 3] = len / 2; // 第四位存储与该节点相关的所有节点个数\n// maxEdgePerVetex = Math.max(maxEdgePerVetex, len / 2);\n// for (let j = 0; j < len; ++j) {\n// const dest = dests[j];\n// dataArray.push(+dest);\n// }\n// }\n// // 不是 4 的倍数,填充 0\n// while (dataArray.length % 4 !== 0) {\n// dataArray.push(0);\n// }\n// return {\n// array: new Float32Array(dataArray),\n// maxEdgePerVetex\n// }\n// }\n/**\n* 将节点和边数据转换为 GPU 可读的数组,每条边带有一个以上属性。并返回 maxEdgePerVetex,每个节点上最多的边数\n* @param {NodeConfig[]} nodes 节点数组\n* @param {EdgeConfig[]} edges 边数组\n* @param {Function} attrs 读取边属性的函数\n* @return {Object} 转换后的数组及 maxEdgePerVetex 组成的对象\n*/\nconst buildTextureDataWithTwoEdgeAttr = (nodes, edges, attrs1, attrs2) => {\n const dataArray = [];\n const nodeDict = [];\n const mapIdPos = {};\n let i = 0;\n for (i = 0; i < nodes.length; i++) {\n const n = nodes[i];\n mapIdPos[n.id] = i;\n dataArray.push(n.x);\n dataArray.push(n.y);\n dataArray.push(0);\n dataArray.push(0);\n nodeDict.push([]);\n }\n for (i = 0; i < edges.length; i++) {\n const e = edges[i];\n const source = getEdgeTerminal(e, 'source');\n const target = getEdgeTerminal(e, 'target');\n nodeDict[mapIdPos[source]].push(mapIdPos[target]);\n nodeDict[mapIdPos[source]].push(attrs1(e));\n nodeDict[mapIdPos[source]].push(attrs2(e));\n nodeDict[mapIdPos[source]].push(0);\n nodeDict[mapIdPos[target]].push(mapIdPos[source]);\n nodeDict[mapIdPos[target]].push(attrs1(e));\n nodeDict[mapIdPos[target]].push(attrs2(e));\n nodeDict[mapIdPos[target]].push(0);\n }\n let maxEdgePerVetex = 0;\n for (i = 0; i < nodes.length; i++) {\n const offset = dataArray.length;\n const dests = nodeDict[i]; // dest 中节点 id 与边长间隔存储,即一位节点 id,一位边长……\n const len = dests.length;\n // dataArray[i * 4 + 2] = offset;\n // dataArray[i * 4 + 3] = len / 4; // 第四位存储与该节点相关的所有节点个数\n // pack offset & length into float32: offset 20bit, length 12bit\n dataArray[i * 4 + 2] = offset + 1048576 * len / 4;\n dataArray[i * 4 + 3] = 0; // 第四位存储与上一次的距离差值\n maxEdgePerVetex = Math.max(maxEdgePerVetex, len / 4);\n for (let j = 0; j < len; ++j) {\n const dest = dests[j];\n dataArray.push(+dest);\n }\n }\n // 不是 4 的倍数,填充 0\n while (dataArray.length % 4 !== 0) {\n dataArray.push(0);\n }\n return {\n maxEdgePerVetex,\n array: new Float32Array(dataArray),\n };\n};\n/**\n* transform the extended attributes of nodes or edges to a texture array\n* @param {string[]} attributeNames attributes' name to be read from items and put into output array\n* @param {ModelConfig[]} items the items to be read\n* @return {Float32Array} the attributes' value array to be read by GPU\n*/\nconst attributesToTextureData = (attributeNames, items) => {\n const dataArray = [];\n const attributeNum = attributeNames.length;\n const attributteStringMap = {};\n items.forEach((item) => {\n attributeNames.forEach((name, i) => {\n if (attributteStringMap[item[name]] === undefined) {\n attributteStringMap[item[name]] = Object.keys(attributteStringMap).length;\n }\n dataArray.push(attributteStringMap[item[name]]);\n // insure each node's attributes take inter number of grids\n if (i === attributeNum - 1) {\n while (dataArray.length % 4 !== 0) {\n dataArray.push(0);\n }\n }\n });\n });\n return {\n array: new Float32Array(dataArray),\n count: Object.keys(attributteStringMap).length\n };\n};\n/**\n* transform the number array format of extended attributes of nodes or edges to a texture array\n* @param {string[]} attributeNames attributes' name to be read from items and put into output array\n* @return {Float32Array} the attributes' value array to be read by GPU\n*/\nconst arrayToTextureData = (valueArrays) => {\n const dataArray = [];\n const attributeNum = valueArrays.length;\n const itemNum = valueArrays[0].length;\n for (let j = 0; j < itemNum; j++) {\n valueArrays.forEach((valueArray, i) => {\n dataArray.push(valueArray[j]);\n // insure each node's attributes take inter number of grids\n if (i === attributeNum - 1) {\n while (dataArray.length % 4 !== 0) {\n dataArray.push(0);\n }\n }\n });\n }\n return new Float32Array(dataArray);\n};\n//# sourceMappingURL=gpu.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/layout/es/layout/gpu/fruchtermanShader.js\nconst fruchtermanCode = `\nimport { globalInvocationID } from 'g-webgpu';\nconst MAX_EDGE_PER_VERTEX;\nconst VERTEX_COUNT;\n@numthreads(1, 1, 1)\nclass Fruchterman {\n @in @out\n u_Data: vec4[];\n @in\n u_K: float;\n @in\n u_K2: float;\n \n @in\n u_Center: vec2;\n @in\n u_Gravity: float;\n @in\n u_ClusterGravity: float;\n @in\n u_Speed: float;\n @in\n u_MaxDisplace: float;\n @in\n u_Clustering: float;\n @in\n u_AttributeArray: vec4[];\n @in\n u_ClusterCenters: vec4[];\n calcRepulsive(i: int, currentNode: vec4): vec2 {\n let dx = 0, dy = 0;\n for (let j = 0; j < VERTEX_COUNT; j++) {\n if (i != j) {\n const nextNode = this.u_Data[j];\n const xDist = currentNode[0] - nextNode[0];\n const yDist = currentNode[1] - nextNode[1];\n const dist = (xDist * xDist + yDist * yDist) + 0.01;\n let param = this.u_K2 / dist;\n \n if (dist > 0.0) {\n dx += param * xDist;\n dy += param * yDist;\n if (xDist == 0 && yDist == 0) {\n const sign = i < j ? 1 : -1;\n dx += param * sign;\n dy += param * sign;\n }\n }\n }\n }\n return [dx, dy];\n }\n calcGravity(currentNode: vec4, nodeAttributes: vec4): vec2 { // \n let dx = 0, dy = 0;\n const vx = currentNode[0] - this.u_Center[0];\n const vy = currentNode[1] - this.u_Center[1];\n const gf = 0.01 * this.u_K * this.u_Gravity;\n dx = gf * vx;\n dy = gf * vy;\n if (this.u_Clustering == 1) {\n const clusterIdx = int(nodeAttributes[0]);\n const center = this.u_ClusterCenters[clusterIdx];\n const cvx = currentNode[0] - center[0];\n const cvy = currentNode[1] - center[1];\n const dist = sqrt(cvx * cvx + cvy * cvy) + 0.01;\n const parma = this.u_K * this.u_ClusterGravity / dist;\n dx += parma * cvx;\n dy += parma * cvy;\n }\n return [dx, dy];\n }\n calcAttractive(i: int, currentNode: vec4): vec2 {\n let dx = 0, dy = 0;\n const arr_offset = int(floor(currentNode[2] + 0.5));\n const length = int(floor(currentNode[3] + 0.5));\n const node_buffer: vec4;\n for (let p = 0; p < MAX_EDGE_PER_VERTEX; p++) {\n if (p >= length) break;\n const arr_idx = arr_offset + p;\n // when arr_idx % 4 == 0 update currentNodedx_buffer\n const buf_offset = arr_idx - arr_idx / 4 * 4;\n if (p == 0 || buf_offset == 0) {\n node_buffer = this.u_Data[int(arr_idx / 4)];\n }\n const float_j = buf_offset == 0 ? node_buffer[0] :\n buf_offset == 1 ? node_buffer[1] :\n buf_offset == 2 ? node_buffer[2] :\n node_buffer[3];\n const nextNode = this.u_Data[int(float_j)];\n const xDist = currentNode[0] - nextNode[0];\n const yDist = currentNode[1] - nextNode[1];\n const dist = sqrt(xDist * xDist + yDist * yDist) + 0.01;\n let attractiveF = dist / this.u_K;\n \n if (dist > 0.0) {\n dx -= xDist * attractiveF;\n dy -= yDist * attractiveF;\n if (xDist == 0 && yDist == 0) {\n const sign = i < int(float_j) ? 1 : -1;\n dx -= sign * attractiveF;\n dy -= sign * attractiveF;\n }\n }\n }\n return [dx, dy];\n }\n @main\n compute() {\n const i = globalInvocationID.x;\n const currentNode = this.u_Data[i];\n let dx = 0, dy = 0;\n if (i >= VERTEX_COUNT) {\n this.u_Data[i] = currentNode;\n return;\n }\n\n // [gravity, fx, fy, 0]\n const nodeAttributes = this.u_AttributeArray[i];\n\n if (nodeAttributes[1] != 0 && nodeAttributes[2] != 0) {\n // the node is fixed\n this.u_Data[i] = [\n nodeAttributes[1],\n nodeAttributes[2],\n currentNode[2],\n currentNode[3]\n ];\n return;\n }\n\n // repulsive\n const repulsive = this.calcRepulsive(i, currentNode);\n dx += repulsive[0];\n dy += repulsive[1];\n // attractive\n const attractive = this.calcAttractive(i, currentNode);\n dx += attractive[0];\n dy += attractive[1];\n // gravity\n const gravity = this.calcGravity(currentNode, nodeAttributes);\n dx -= gravity[0];\n dy -= gravity[1];\n // speed\n dx *= this.u_Speed;\n dy *= this.u_Speed;\n\n // move\n const distLength = sqrt(dx * dx + dy * dy);\n if (distLength > 0.0) {\n const limitedDist = min(this.u_MaxDisplace * this.u_Speed, distLength);\n this.u_Data[i] = [\n currentNode[0] + dx / distLength * limitedDist,\n currentNode[1] + dy / distLength * limitedDist,\n currentNode[2],\n currentNode[3]\n ];\n }\n }\n}\n`;\nconst fruchtermanBundle = `{\"shaders\":{\"WGSL\":\"import \\\\\"GLSL.std.450\\\\\" as std;\\\\n\\\\n\\\\n# var gWebGPUDebug : bool = false;\\\\n# var gWebGPUDebugOutput : vec4 = vec4(0.0);\\\\n\\\\n[[builtin global_invocation_id]] var globalInvocationID : vec3;\\\\n# [[builtin work_group_size]] var workGroupSize : vec3;\\\\n# [[builtin work_group_id]] var workGroupID : vec3;\\\\n[[builtin local_invocation_id]] var localInvocationID : vec3;\\\\n# [[builtin num_work_groups]] var numWorkGroups : vec3;\\\\n[[builtin local_invocation_idx]] var localInvocationIndex : u32;\\\\n\\\\ntype GWebGPUParams = [[block]] struct {\\\\n [[offset 0]] u_K : f32;\\\\n [[offset 4]] u_K2 : f32;\\\\n [[offset 8]] u_Center : vec2;\\\\n [[offset 16]] u_Gravity : f32;\\\\n [[offset 20]] u_ClusterGravity : f32;\\\\n [[offset 24]] u_Speed : f32;\\\\n [[offset 28]] u_MaxDisplace : f32;\\\\n [[offset 32]] u_Clustering : f32;\\\\n};\\\\n[[binding 0, set 0]] var gWebGPUUniformParams : GWebGPUParams;\\\\ntype GWebGPUBuffer0 = [[block]] struct {\\\\n [[offset 0]] u_Data : [[stride 16]] array>;\\\\n};\\\\n[[binding 1, set 0]] var gWebGPUBuffer0 : GWebGPUBuffer0;\\\\ntype GWebGPUBuffer1 = [[block]] struct {\\\\n [[offset 0]] u_AttributeArray : [[stride 16]] array>;\\\\n};\\\\n[[binding 2, set 0]] var gWebGPUBuffer1 : GWebGPUBuffer1;\\\\ntype GWebGPUBuffer2 = [[block]] struct {\\\\n [[offset 0]] u_ClusterCenters : [[stride 16]] array>;\\\\n};\\\\n[[binding 3, set 0]] var gWebGPUBuffer2 : GWebGPUBuffer2;\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\nfn calcRepulsive(i : i32, currentNode : vec4) -> vec2 {var dx : f32 = 0.0;\\\\nvar dy : f32 = 0.0;\\\\nfor (var j : i32 = 0; j < __DefineValuePlaceholder__VERTEX_COUNT; j = j + 1) {if (i != j) {var nextNode : vec4 = gWebGPUBuffer0.u_Data[j];\\\\nvar xDist : f32 = currentNode.x - nextNode.x;\\\\nvar yDist : f32 = currentNode.y - nextNode.y;\\\\nvar dist : f32 = ((xDist * xDist) + (yDist * yDist)) + 0.01;\\\\nvar param : f32 = gWebGPUUniformParams.u_K2 / dist;\\\\nif (dist > 0.0) {dx = dx + param * xDist;\\\\ndy = dy + param * yDist;\\\\nif ((xDist == 0.0) && (yDist == 0.0)) {var sign : f32 = select(1.0, -1.0, i < j);\\\\ndx = dx + param * std::sign;\\\\ndy = dy + param * std::sign;}}}}\\\\nreturn vec2(dx, dy);}\\\\nfn calcGravity(currentNode : vec4, nodeAttributes : vec4) -> vec2 {var dx : f32 = 0.0;\\\\nvar dy : f32 = 0.0;\\\\nvar vx : f32 = currentNode.x - gWebGPUUniformParams.u_Center.x;\\\\nvar vy : f32 = currentNode.y - gWebGPUUniformParams.u_Center.y;\\\\nvar gf : f32 = (0.01 * gWebGPUUniformParams.u_K) * gWebGPUUniformParams.u_Gravity;\\\\ndx = gf * vx;\\\\ndy = gf * vy;\\\\nif (gWebGPUUniformParams.u_Clustering == 1.0) {var clusterIdx : i32 = i32(nodeAttributes.x);\\\\nvar center : vec4 = gWebGPUBuffer2.u_ClusterCenters[clusterIdx];\\\\nvar cvx : f32 = currentNode.x - center.x;\\\\nvar cvy : f32 = currentNode.y - center.y;\\\\nvar dist : f32 = std::sqrt((cvx * cvx) + (cvy * cvy)) + 0.01;\\\\nvar parma : f32 = (gWebGPUUniformParams.u_K * gWebGPUUniformParams.u_ClusterGravity) / dist;\\\\ndx = dx + parma * cvx;\\\\ndy = dy + parma * cvy;}\\\\nreturn vec2(dx, dy);}\\\\nfn calcAttractive(i : i32, currentNode : vec4) -> vec2 {var dx : f32 = 0.0;\\\\nvar dy : f32 = 0.0;\\\\nvar arr_offset : i32 = i32(std::floor(currentNode.z + 0.5));\\\\nvar length : i32 = i32(std::floor(currentNode.w + 0.5));\\\\nvar node_buffer : vec4;\\\\nfor (var p : i32 = 0; p < __DefineValuePlaceholder__MAX_EDGE_PER_VERTEX; p = p + 1) {if (p >= length) {break;}\\\\nvar arr_idx : i32 = arr_offset + i32(p);\\\\nvar buf_offset : i32 = arr_idx - ((arr_idx / 4) * 4);\\\\nif ((p == 0) || (buf_offset == 0)) {node_buffer = gWebGPUBuffer0.u_Data[i32(arr_idx / 4)];}\\\\nvar float_j : f32 = select(node_buffer.x, select(node_buffer.y, select(node_buffer.z, node_buffer.w, buf_offset == 2), buf_offset == 1), buf_offset == 0);\\\\nvar nextNode : vec4 = gWebGPUBuffer0.u_Data[i32(float_j)];\\\\nvar xDist : f32 = currentNode.x - nextNode.x;\\\\nvar yDist : f32 = currentNode.y - nextNode.y;\\\\nvar dist : f32 = std::sqrt((xDist * xDist) + (yDist * yDist)) + 0.01;\\\\nvar attractiveF : f32 = dist / gWebGPUUniformParams.u_K;\\\\nif (dist > 0.0) {dx = dx - xDist * attractiveF;\\\\ndy = dy - yDist * attractiveF;\\\\nif ((xDist == 0.0) && (yDist == 0.0)) {var sign : f32 = select(1.0, -1.0, i < i32(float_j));\\\\ndx = dx - std::sign * attractiveF;\\\\ndy = dy - std::sign * attractiveF;}}}\\\\nreturn vec2(dx, dy);}\\\\nfn main() -> void {var i : i32 = globalInvocationID.x;\\\\nvar currentNode : vec4 = gWebGPUBuffer0.u_Data[i];\\\\nvar dx : f32 = 0.0;\\\\nvar dy : f32 = 0.0;\\\\nif (i >= __DefineValuePlaceholder__VERTEX_COUNT) {gWebGPUBuffer0.u_Data[i] = currentNode;\\\\nreturn ;}\\\\nvar nodeAttributes : vec4 = gWebGPUBuffer1.u_AttributeArray[i];\\\\nif ((nodeAttributes.y != 0.0) && (nodeAttributes.z != 0.0)) {gWebGPUBuffer0.u_Data[i] = vec4(nodeAttributes.y, nodeAttributes.z, currentNode.z, currentNode.w);\\\\nreturn ;}\\\\nvar repulsive : vec2 = calcRepulsive(i, currentNode);\\\\ndx = dx + repulsive.x;\\\\ndy = dy + repulsive.y;\\\\nvar attractive : vec2 = calcAttractive(i, currentNode);\\\\ndx = dx + attractive.x;\\\\ndy = dy + attractive.y;\\\\nvar gravity : vec2 = calcGravity(currentNode, nodeAttributes);\\\\ndx = dx - gravity.x;\\\\ndy = dy - gravity.y;\\\\ndx = dx * gWebGPUUniformParams.u_Speed;\\\\ndy = dy * gWebGPUUniformParams.u_Speed;\\\\nvar distLength : f32 = std::sqrt((dx * dx) + (dy * dy));\\\\nif (distLength > 0.0) {var limitedDist : f32 = std::min(gWebGPUUniformParams.u_MaxDisplace * gWebGPUUniformParams.u_Speed, distLength);\\\\ngWebGPUBuffer0.u_Data[i] = vec4(currentNode.x + ((dx / distLength) * limitedDist), currentNode.y + ((dy / distLength) * limitedDist), currentNode.z, currentNode.w);}\\\\nreturn;}\\\\n\\\\nentry_point compute as \\\\\"main\\\\\" = main;\\\\n\",\"GLSL450\":\"\\\\n\\\\n\\\\nbool gWebGPUDebug = false;\\\\nvec4 gWebGPUDebugOutput = vec4(0.0);\\\\n\\\\nivec3 globalInvocationID = ivec3(gl_GlobalInvocationID);\\\\nivec3 workGroupSize = ivec3(1,1,1);\\\\nivec3 workGroupID = ivec3(gl_WorkGroupID);\\\\nivec3 localInvocationID = ivec3(gl_LocalInvocationID);\\\\nivec3 numWorkGroups = ivec3(gl_NumWorkGroups);\\\\nint localInvocationIndex = int(gl_LocalInvocationIndex);\\\\n\\\\nlayout(std140, set = 0, binding = 0) uniform GWebGPUParams {\\\\n float u_K;\\\\n float u_K2;\\\\n vec2 u_Center;\\\\n float u_Gravity;\\\\n float u_ClusterGravity;\\\\n float u_Speed;\\\\n float u_MaxDisplace;\\\\n float u_Clustering;\\\\n} gWebGPUUniformParams;\\\\nlayout(std430, set = 0, binding = 1) buffer GWebGPUBuffer0 {\\\\n vec4 u_Data[];\\\\n} gWebGPUBuffer0;\\\\n\\\\nlayout(std430, set = 0, binding = 2) buffer readonly GWebGPUBuffer1 {\\\\n vec4 u_AttributeArray[];\\\\n} gWebGPUBuffer1;\\\\n\\\\nlayout(std430, set = 0, binding = 3) buffer readonly GWebGPUBuffer2 {\\\\n vec4 u_ClusterCenters[];\\\\n} gWebGPUBuffer2;\\\\n\\\\n\\\\n\\\\n#define MAX_EDGE_PER_VERTEX __DefineValuePlaceholder__MAX_EDGE_PER_VERTEX\\\\n#define VERTEX_COUNT __DefineValuePlaceholder__VERTEX_COUNT\\\\nlayout (\\\\n local_size_x = 1,\\\\n local_size_y = 1,\\\\n local_size_z = 1\\\\n) in;\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\nvec2 calcRepulsive(int i, vec4 currentNode) {float dx = 0.0;\\\\nfloat dy = 0.0;\\\\nfor (int j = 0; j < VERTEX_COUNT; j++) {if (i != j) {vec4 nextNode = gWebGPUBuffer0.u_Data[j];\\\\nfloat xDist = currentNode.x - nextNode.x;\\\\nfloat yDist = currentNode.y - nextNode.y;\\\\nfloat dist = ((xDist * xDist) + (yDist * yDist)) + 0.01;\\\\nfloat param = gWebGPUUniformParams.u_K2 / dist;\\\\nif (dist > 0.0) {dx += param * xDist;\\\\ndy += param * yDist;\\\\nif ((xDist == 0.0) && (yDist == 0.0)) {float sign = (i < j) ? (1.0) : (-1.0);\\\\ndx += param * sign;\\\\ndy += param * sign;}}}}\\\\nreturn vec2(dx, dy);}\\\\nvec2 calcGravity(vec4 currentNode, vec4 nodeAttributes) {float dx = 0.0;\\\\nfloat dy = 0.0;\\\\nfloat vx = currentNode.x - gWebGPUUniformParams.u_Center.x;\\\\nfloat vy = currentNode.y - gWebGPUUniformParams.u_Center.y;\\\\nfloat gf = (0.01 * gWebGPUUniformParams.u_K) * gWebGPUUniformParams.u_Gravity;\\\\ndx = gf * vx;\\\\ndy = gf * vy;\\\\nif (gWebGPUUniformParams.u_Clustering == 1.0) {int clusterIdx = int(nodeAttributes.x);\\\\nvec4 center = gWebGPUBuffer2.u_ClusterCenters[clusterIdx];\\\\nfloat cvx = currentNode.x - center.x;\\\\nfloat cvy = currentNode.y - center.y;\\\\nfloat dist = sqrt((cvx * cvx) + (cvy * cvy)) + 0.01;\\\\nfloat parma = (gWebGPUUniformParams.u_K * gWebGPUUniformParams.u_ClusterGravity) / dist;\\\\ndx += parma * cvx;\\\\ndy += parma * cvy;}\\\\nreturn vec2(dx, dy);}\\\\nvec2 calcAttractive(int i, vec4 currentNode) {float dx = 0.0;\\\\nfloat dy = 0.0;\\\\nint arr_offset = int(floor(currentNode.z + 0.5));\\\\nint length = int(floor(currentNode.w + 0.5));\\\\nvec4 node_buffer;\\\\nfor (int p = 0; p < MAX_EDGE_PER_VERTEX; p++) {if (p >= length) {break;}\\\\nint arr_idx = arr_offset + int(p);\\\\nint buf_offset = arr_idx - ((arr_idx / 4) * 4);\\\\nif ((p == 0) || (buf_offset == 0)) {node_buffer = gWebGPUBuffer0.u_Data[int(arr_idx / 4)];}\\\\nfloat float_j = (buf_offset == 0) ? (node_buffer.x) : ((buf_offset == 1) ? (node_buffer.y) : ((buf_offset == 2) ? (node_buffer.z) : (node_buffer.w)));\\\\nvec4 nextNode = gWebGPUBuffer0.u_Data[int(float_j)];\\\\nfloat xDist = currentNode.x - nextNode.x;\\\\nfloat yDist = currentNode.y - nextNode.y;\\\\nfloat dist = sqrt((xDist * xDist) + (yDist * yDist)) + 0.01;\\\\nfloat attractiveF = dist / gWebGPUUniformParams.u_K;\\\\nif (dist > 0.0) {dx -= xDist * attractiveF;\\\\ndy -= yDist * attractiveF;\\\\nif ((xDist == 0.0) && (yDist == 0.0)) {float sign = (i < int(float_j)) ? (1.0) : (-1.0);\\\\ndx -= sign * attractiveF;\\\\ndy -= sign * attractiveF;}}}\\\\nreturn vec2(dx, dy);}\\\\nvoid main() {int i = globalInvocationID.x;\\\\nvec4 currentNode = gWebGPUBuffer0.u_Data[i];\\\\nfloat dx = 0.0;\\\\nfloat dy = 0.0;\\\\nif (i >= VERTEX_COUNT) {gWebGPUBuffer0.u_Data[i] = currentNode;\\\\nreturn ;}\\\\nvec4 nodeAttributes = gWebGPUBuffer1.u_AttributeArray[i];\\\\nif ((nodeAttributes.y != 0.0) && (nodeAttributes.z != 0.0)) {gWebGPUBuffer0.u_Data[i] = vec4(nodeAttributes.y, nodeAttributes.z, currentNode.z, currentNode.w);\\\\nreturn ;}\\\\nvec2 repulsive = calcRepulsive(i, currentNode);\\\\ndx += repulsive.x;\\\\ndy += repulsive.y;\\\\nvec2 attractive = calcAttractive(i, currentNode);\\\\ndx += attractive.x;\\\\ndy += attractive.y;\\\\nvec2 gravity = calcGravity(currentNode, nodeAttributes);\\\\ndx -= gravity.x;\\\\ndy -= gravity.y;\\\\ndx *= gWebGPUUniformParams.u_Speed;\\\\ndy *= gWebGPUUniformParams.u_Speed;\\\\nfloat distLength = sqrt((dx * dx) + (dy * dy));\\\\nif (distLength > 0.0) {float limitedDist = min(gWebGPUUniformParams.u_MaxDisplace * gWebGPUUniformParams.u_Speed, distLength);\\\\ngWebGPUBuffer0.u_Data[i] = vec4(currentNode.x + ((dx / distLength) * limitedDist), currentNode.y + ((dy / distLength) * limitedDist), currentNode.z, currentNode.w);}}\\\\n\",\"GLSL100\":\"\\\\n\\\\nfloat epsilon = 0.00001;\\\\nvec2 addrTranslation_1Dto2D(float address1D, vec2 texSize) {\\\\n vec2 conv_const = vec2(1.0 / texSize.x, 1.0 / (texSize.x * texSize.y));\\\\n vec2 normAddr2D = float(address1D) * conv_const;\\\\n return vec2(fract(normAddr2D.x + epsilon), normAddr2D.y);\\\\n}\\\\n\\\\nvoid barrier() {}\\\\n \\\\n\\\\nuniform vec2 u_OutputTextureSize;\\\\nuniform int u_OutputTexelCount;\\\\nvarying vec2 v_TexCoord;\\\\n\\\\nbool gWebGPUDebug = false;\\\\nvec4 gWebGPUDebugOutput = vec4(0.0);\\\\n\\\\n#define MAX_EDGE_PER_VERTEX __DefineValuePlaceholder__MAX_EDGE_PER_VERTEX\\\\n#define VERTEX_COUNT __DefineValuePlaceholder__VERTEX_COUNT\\\\n\\\\nuniform sampler2D u_Data;\\\\nuniform vec2 u_DataSize;\\\\nvec4 getDatau_Data(vec2 address2D) {\\\\n return vec4(texture2D(u_Data, address2D).rgba);\\\\n}\\\\nvec4 getDatau_Data(float address1D) {\\\\n return getDatau_Data(addrTranslation_1Dto2D(address1D, u_DataSize));\\\\n}\\\\nvec4 getDatau_Data(int address1D) {\\\\n return getDatau_Data(float(address1D));\\\\n}\\\\nuniform float u_K;\\\\nuniform float u_K2;\\\\nuniform vec2 u_Center;\\\\nuniform float u_Gravity;\\\\nuniform float u_ClusterGravity;\\\\nuniform float u_Speed;\\\\nuniform float u_MaxDisplace;\\\\nuniform float u_Clustering;\\\\nuniform sampler2D u_AttributeArray;\\\\nuniform vec2 u_AttributeArraySize;\\\\nvec4 getDatau_AttributeArray(vec2 address2D) {\\\\n return vec4(texture2D(u_AttributeArray, address2D).rgba);\\\\n}\\\\nvec4 getDatau_AttributeArray(float address1D) {\\\\n return getDatau_AttributeArray(addrTranslation_1Dto2D(address1D, u_AttributeArraySize));\\\\n}\\\\nvec4 getDatau_AttributeArray(int address1D) {\\\\n return getDatau_AttributeArray(float(address1D));\\\\n}\\\\nuniform sampler2D u_ClusterCenters;\\\\nuniform vec2 u_ClusterCentersSize;\\\\nvec4 getDatau_ClusterCenters(vec2 address2D) {\\\\n return vec4(texture2D(u_ClusterCenters, address2D).rgba);\\\\n}\\\\nvec4 getDatau_ClusterCenters(float address1D) {\\\\n return getDatau_ClusterCenters(addrTranslation_1Dto2D(address1D, u_ClusterCentersSize));\\\\n}\\\\nvec4 getDatau_ClusterCenters(int address1D) {\\\\n return getDatau_ClusterCenters(float(address1D));\\\\n}\\\\nvec2 calcRepulsive(int i, vec4 currentNode) {\\\\nivec3 workGroupSize = ivec3(1, 1, 1);\\\\nivec3 numWorkGroups = ivec3(1, 1, 1); \\\\nint globalInvocationIndex = int(floor(v_TexCoord.x * u_OutputTextureSize.x))\\\\n + int(floor(v_TexCoord.y * u_OutputTextureSize.y)) * int(u_OutputTextureSize.x);\\\\nint workGroupIDLength = globalInvocationIndex / (workGroupSize.x * workGroupSize.y * workGroupSize.z);\\\\nivec3 workGroupID = ivec3(workGroupIDLength / numWorkGroups.y / numWorkGroups.z, workGroupIDLength / numWorkGroups.x / numWorkGroups.z, workGroupIDLength / numWorkGroups.x / numWorkGroups.y);\\\\nint localInvocationIDZ = globalInvocationIndex / (workGroupSize.x * workGroupSize.y);\\\\nint localInvocationIDY = (globalInvocationIndex - localInvocationIDZ * workGroupSize.x * workGroupSize.y) / workGroupSize.x;\\\\nint localInvocationIDX = globalInvocationIndex - localInvocationIDZ * workGroupSize.x * workGroupSize.y - localInvocationIDY * workGroupSize.x;\\\\nivec3 localInvocationID = ivec3(localInvocationIDX, localInvocationIDY, localInvocationIDZ);\\\\nivec3 globalInvocationID = workGroupID * workGroupSize + localInvocationID;\\\\nint localInvocationIndex = localInvocationID.z * workGroupSize.x * workGroupSize.y\\\\n + localInvocationID.y * workGroupSize.x + localInvocationID.x;\\\\nfloat dx = 0.0;\\\\nfloat dy = 0.0;\\\\nfor (int j = 0; j < VERTEX_COUNT; j++) {if (i != j) {vec4 nextNode = getDatau_Data(j);\\\\nfloat xDist = currentNode.x - nextNode.x;\\\\nfloat yDist = currentNode.y - nextNode.y;\\\\nfloat dist = ((xDist * xDist) + (yDist * yDist)) + 0.01;\\\\nfloat param = u_K2 / dist;\\\\nif (dist > 0.0) {dx += param * xDist;\\\\ndy += param * yDist;\\\\nif ((xDist == 0.0) && (yDist == 0.0)) {float sign = (i < j) ? (1.0) : (-1.0);\\\\ndx += param * sign;\\\\ndy += param * sign;}}}}\\\\nreturn vec2(dx, dy);}\\\\nvec2 calcGravity(vec4 currentNode, vec4 nodeAttributes) {\\\\nivec3 workGroupSize = ivec3(1, 1, 1);\\\\nivec3 numWorkGroups = ivec3(1, 1, 1); \\\\nint globalInvocationIndex = int(floor(v_TexCoord.x * u_OutputTextureSize.x))\\\\n + int(floor(v_TexCoord.y * u_OutputTextureSize.y)) * int(u_OutputTextureSize.x);\\\\nint workGroupIDLength = globalInvocationIndex / (workGroupSize.x * workGroupSize.y * workGroupSize.z);\\\\nivec3 workGroupID = ivec3(workGroupIDLength / numWorkGroups.y / numWorkGroups.z, workGroupIDLength / numWorkGroups.x / numWorkGroups.z, workGroupIDLength / numWorkGroups.x / numWorkGroups.y);\\\\nint localInvocationIDZ = globalInvocationIndex / (workGroupSize.x * workGroupSize.y);\\\\nint localInvocationIDY = (globalInvocationIndex - localInvocationIDZ * workGroupSize.x * workGroupSize.y) / workGroupSize.x;\\\\nint localInvocationIDX = globalInvocationIndex - localInvocationIDZ * workGroupSize.x * workGroupSize.y - localInvocationIDY * workGroupSize.x;\\\\nivec3 localInvocationID = ivec3(localInvocationIDX, localInvocationIDY, localInvocationIDZ);\\\\nivec3 globalInvocationID = workGroupID * workGroupSize + localInvocationID;\\\\nint localInvocationIndex = localInvocationID.z * workGroupSize.x * workGroupSize.y\\\\n + localInvocationID.y * workGroupSize.x + localInvocationID.x;\\\\nfloat dx = 0.0;\\\\nfloat dy = 0.0;\\\\nfloat vx = currentNode.x - u_Center.x;\\\\nfloat vy = currentNode.y - u_Center.y;\\\\nfloat gf = (0.01 * u_K) * u_Gravity;\\\\ndx = gf * vx;\\\\ndy = gf * vy;\\\\nif (u_Clustering == 1.0) {int clusterIdx = int(nodeAttributes.x);\\\\nvec4 center = getDatau_ClusterCenters(clusterIdx);\\\\nfloat cvx = currentNode.x - center.x;\\\\nfloat cvy = currentNode.y - center.y;\\\\nfloat dist = sqrt((cvx * cvx) + (cvy * cvy)) + 0.01;\\\\nfloat parma = (u_K * u_ClusterGravity) / dist;\\\\ndx += parma * cvx;\\\\ndy += parma * cvy;}\\\\nreturn vec2(dx, dy);}\\\\nvec2 calcAttractive(int i, vec4 currentNode) {\\\\nivec3 workGroupSize = ivec3(1, 1, 1);\\\\nivec3 numWorkGroups = ivec3(1, 1, 1); \\\\nint globalInvocationIndex = int(floor(v_TexCoord.x * u_OutputTextureSize.x))\\\\n + int(floor(v_TexCoord.y * u_OutputTextureSize.y)) * int(u_OutputTextureSize.x);\\\\nint workGroupIDLength = globalInvocationIndex / (workGroupSize.x * workGroupSize.y * workGroupSize.z);\\\\nivec3 workGroupID = ivec3(workGroupIDLength / numWorkGroups.y / numWorkGroups.z, workGroupIDLength / numWorkGroups.x / numWorkGroups.z, workGroupIDLength / numWorkGroups.x / numWorkGroups.y);\\\\nint localInvocationIDZ = globalInvocationIndex / (workGroupSize.x * workGroupSize.y);\\\\nint localInvocationIDY = (globalInvocationIndex - localInvocationIDZ * workGroupSize.x * workGroupSize.y) / workGroupSize.x;\\\\nint localInvocationIDX = globalInvocationIndex - localInvocationIDZ * workGroupSize.x * workGroupSize.y - localInvocationIDY * workGroupSize.x;\\\\nivec3 localInvocationID = ivec3(localInvocationIDX, localInvocationIDY, localInvocationIDZ);\\\\nivec3 globalInvocationID = workGroupID * workGroupSize + localInvocationID;\\\\nint localInvocationIndex = localInvocationID.z * workGroupSize.x * workGroupSize.y\\\\n + localInvocationID.y * workGroupSize.x + localInvocationID.x;\\\\nfloat dx = 0.0;\\\\nfloat dy = 0.0;\\\\nint arr_offset = int(floor(currentNode.z + 0.5));\\\\nint length = int(floor(currentNode.w + 0.5));\\\\nvec4 node_buffer;\\\\nfor (int p = 0; p < MAX_EDGE_PER_VERTEX; p++) {if (p >= length) {break;}\\\\nint arr_idx = arr_offset + int(p);\\\\nint buf_offset = arr_idx - ((arr_idx / 4) * 4);\\\\nif ((p == 0) || (buf_offset == 0)) {node_buffer = getDatau_Data(int(arr_idx / 4));}\\\\nfloat float_j = (buf_offset == 0) ? (node_buffer.x) : ((buf_offset == 1) ? (node_buffer.y) : ((buf_offset == 2) ? (node_buffer.z) : (node_buffer.w)));\\\\nvec4 nextNode = getDatau_Data(int(float_j));\\\\nfloat xDist = currentNode.x - nextNode.x;\\\\nfloat yDist = currentNode.y - nextNode.y;\\\\nfloat dist = sqrt((xDist * xDist) + (yDist * yDist)) + 0.01;\\\\nfloat attractiveF = dist / u_K;\\\\nif (dist > 0.0) {dx -= xDist * attractiveF;\\\\ndy -= yDist * attractiveF;\\\\nif ((xDist == 0.0) && (yDist == 0.0)) {float sign = (i < int(float_j)) ? (1.0) : (-1.0);\\\\ndx -= sign * attractiveF;\\\\ndy -= sign * attractiveF;}}}\\\\nreturn vec2(dx, dy);}\\\\nvoid main() {\\\\nivec3 workGroupSize = ivec3(1, 1, 1);\\\\nivec3 numWorkGroups = ivec3(1, 1, 1); \\\\nint globalInvocationIndex = int(floor(v_TexCoord.x * u_OutputTextureSize.x))\\\\n + int(floor(v_TexCoord.y * u_OutputTextureSize.y)) * int(u_OutputTextureSize.x);\\\\nint workGroupIDLength = globalInvocationIndex / (workGroupSize.x * workGroupSize.y * workGroupSize.z);\\\\nivec3 workGroupID = ivec3(workGroupIDLength / numWorkGroups.y / numWorkGroups.z, workGroupIDLength / numWorkGroups.x / numWorkGroups.z, workGroupIDLength / numWorkGroups.x / numWorkGroups.y);\\\\nint localInvocationIDZ = globalInvocationIndex / (workGroupSize.x * workGroupSize.y);\\\\nint localInvocationIDY = (globalInvocationIndex - localInvocationIDZ * workGroupSize.x * workGroupSize.y) / workGroupSize.x;\\\\nint localInvocationIDX = globalInvocationIndex - localInvocationIDZ * workGroupSize.x * workGroupSize.y - localInvocationIDY * workGroupSize.x;\\\\nivec3 localInvocationID = ivec3(localInvocationIDX, localInvocationIDY, localInvocationIDZ);\\\\nivec3 globalInvocationID = workGroupID * workGroupSize + localInvocationID;\\\\nint localInvocationIndex = localInvocationID.z * workGroupSize.x * workGroupSize.y\\\\n + localInvocationID.y * workGroupSize.x + localInvocationID.x;\\\\nint i = globalInvocationID.x;\\\\nvec4 currentNode = getDatau_Data(i);\\\\nfloat dx = 0.0;\\\\nfloat dy = 0.0;\\\\nif (i >= VERTEX_COUNT) {gl_FragColor = vec4(currentNode);\\\\nreturn ;}\\\\nvec4 nodeAttributes = getDatau_AttributeArray(i);\\\\nif ((nodeAttributes.y != 0.0) && (nodeAttributes.z != 0.0)) {gl_FragColor = vec4(vec4(nodeAttributes.y, nodeAttributes.z, currentNode.z, currentNode.w));\\\\nreturn ;}\\\\nvec2 repulsive = calcRepulsive(i, currentNode);\\\\ndx += repulsive.x;\\\\ndy += repulsive.y;\\\\nvec2 attractive = calcAttractive(i, currentNode);\\\\ndx += attractive.x;\\\\ndy += attractive.y;\\\\nvec2 gravity = calcGravity(currentNode, nodeAttributes);\\\\ndx -= gravity.x;\\\\ndy -= gravity.y;\\\\ndx *= u_Speed;\\\\ndy *= u_Speed;\\\\nfloat distLength = sqrt((dx * dx) + (dy * dy));\\\\nif (distLength > 0.0) {float limitedDist = min(u_MaxDisplace * u_Speed, distLength);\\\\ngl_FragColor = vec4(vec4(currentNode.x + ((dx / distLength) * limitedDist), currentNode.y + ((dy / distLength) * limitedDist), currentNode.z, currentNode.w));}if (gWebGPUDebug) {\\\\n gl_FragColor = gWebGPUDebugOutput;\\\\n}}\\\\n\"},\"context\":{\"name\":\"\",\"dispatch\":[1,1,1],\"threadGroupSize\":[1,1,1],\"maxIteration\":1,\"defines\":[{\"name\":\"MAX_EDGE_PER_VERTEX\",\"type\":\"Float\",\"runtime\":true},{\"name\":\"VERTEX_COUNT\",\"type\":\"Float\",\"runtime\":true}],\"uniforms\":[{\"name\":\"u_Data\",\"type\":\"vec4[]\",\"storageClass\":\"StorageBuffer\",\"readonly\":false,\"writeonly\":false,\"size\":[1,1]},{\"name\":\"u_K\",\"type\":\"Float\",\"storageClass\":\"Uniform\",\"readonly\":true,\"writeonly\":false,\"size\":[1,1]},{\"name\":\"u_K2\",\"type\":\"Float\",\"storageClass\":\"Uniform\",\"readonly\":true,\"writeonly\":false,\"size\":[1,1]},{\"name\":\"u_Center\",\"type\":\"vec2\",\"storageClass\":\"Uniform\",\"readonly\":true,\"writeonly\":false,\"size\":[1,1]},{\"name\":\"u_Gravity\",\"type\":\"Float\",\"storageClass\":\"Uniform\",\"readonly\":true,\"writeonly\":false,\"size\":[1,1]},{\"name\":\"u_ClusterGravity\",\"type\":\"Float\",\"storageClass\":\"Uniform\",\"readonly\":true,\"writeonly\":false,\"size\":[1,1]},{\"name\":\"u_Speed\",\"type\":\"Float\",\"storageClass\":\"Uniform\",\"readonly\":true,\"writeonly\":false,\"size\":[1,1]},{\"name\":\"u_MaxDisplace\",\"type\":\"Float\",\"storageClass\":\"Uniform\",\"readonly\":true,\"writeonly\":false,\"size\":[1,1]},{\"name\":\"u_Clustering\",\"type\":\"Float\",\"storageClass\":\"Uniform\",\"readonly\":true,\"writeonly\":false,\"size\":[1,1]},{\"name\":\"u_AttributeArray\",\"type\":\"vec4[]\",\"storageClass\":\"StorageBuffer\",\"readonly\":true,\"writeonly\":false,\"size\":[1,1]},{\"name\":\"u_ClusterCenters\",\"type\":\"vec4[]\",\"storageClass\":\"StorageBuffer\",\"readonly\":true,\"writeonly\":false,\"size\":[1,1]}],\"globalDeclarations\":[],\"output\":{\"name\":\"u_Data\",\"size\":[1,1],\"length\":1},\"needPingpong\":true}}`;\nconst clusterCode = `\nimport { globalInvocationID } from 'g-webgpu';\nconst VERTEX_COUNT;\nconst CLUSTER_COUNT;\n@numthreads(1, 1, 1)\nclass CalcCenter {\n @in\n u_Data: vec4[];\n @in\n u_NodeAttributes: vec4[]; // [[clusterIdx, 0, 0, 0], ...]\n @in @out\n u_ClusterCenters: vec4[]; // [[cx, cy, nodeCount, clusterIdx], ...]\n @main\n compute() {\n const i = globalInvocationID.x;\n const center = this.u_ClusterCenters[i];\n let sumx = 0;\n let sumy = 0;\n let count = 0;\n for (let j = 0; j < VERTEX_COUNT; j++) {\n const attributes = this.u_NodeAttributes[j];\n const clusterIdx = int(attributes[0]);\n const vertex = this.u_Data[j];\n if (clusterIdx == i) {\n sumx += vertex.x;\n sumy += vertex.y;\n count += 1;\n }\n }\n this.u_ClusterCenters[i] = [\n sumx / count,\n sumy / count,\n count,\n i\n ];\n }\n}\n`;\nconst clusterBundle = `{\"shaders\":{\"WGSL\":\"import \\\\\"GLSL.std.450\\\\\" as std;\\\\n\\\\n\\\\n# var gWebGPUDebug : bool = false;\\\\n# var gWebGPUDebugOutput : vec4 = vec4(0.0);\\\\n\\\\n[[builtin global_invocation_id]] var globalInvocationID : vec3;\\\\n# [[builtin work_group_size]] var workGroupSize : vec3;\\\\n# [[builtin work_group_id]] var workGroupID : vec3;\\\\n[[builtin local_invocation_id]] var localInvocationID : vec3;\\\\n# [[builtin num_work_groups]] var numWorkGroups : vec3;\\\\n[[builtin local_invocation_idx]] var localInvocationIndex : u32;\\\\n\\\\n\\\\ntype GWebGPUBuffer0 = [[block]] struct {\\\\n [[offset 0]] u_Data : [[stride 16]] array>;\\\\n};\\\\n[[binding 0, set 0]] var gWebGPUBuffer0 : GWebGPUBuffer0;\\\\ntype GWebGPUBuffer1 = [[block]] struct {\\\\n [[offset 0]] u_NodeAttributes : [[stride 16]] array>;\\\\n};\\\\n[[binding 1, set 0]] var gWebGPUBuffer1 : GWebGPUBuffer1;\\\\ntype GWebGPUBuffer2 = [[block]] struct {\\\\n [[offset 0]] u_ClusterCenters : [[stride 16]] array>;\\\\n};\\\\n[[binding 2, set 0]] var gWebGPUBuffer2 : GWebGPUBuffer2;\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\nfn main() -> void {var i : i32 = globalInvocationID.x;\\\\nvar center : vec4 = gWebGPUBuffer2.u_ClusterCenters[i];\\\\nvar sumx : f32 = 0.0;\\\\nvar sumy : f32 = 0.0;\\\\nvar count : f32 = 0.0;\\\\nfor (var j : i32 = 0; j < __DefineValuePlaceholder__VERTEX_COUNT; j = j + 1) {var attributes : vec4 = gWebGPUBuffer1.u_NodeAttributes[j];\\\\nvar clusterIdx : i32 = i32(attributes.x);\\\\nvar vertex : vec4 = gWebGPUBuffer0.u_Data[j];\\\\nif (clusterIdx == i) {sumx = sumx + vertex.x;\\\\nsumy = sumy + vertex.y;\\\\ncount = count + 1.0;}}\\\\ngWebGPUBuffer2.u_ClusterCenters[i] = vec4(sumx / count, sumy / count, count, i);\\\\nreturn;}\\\\n\\\\nentry_point compute as \\\\\"main\\\\\" = main;\\\\n\",\"GLSL450\":\"\\\\n\\\\n\\\\nbool gWebGPUDebug = false;\\\\nvec4 gWebGPUDebugOutput = vec4(0.0);\\\\n\\\\nivec3 globalInvocationID = ivec3(gl_GlobalInvocationID);\\\\nivec3 workGroupSize = ivec3(1,1,1);\\\\nivec3 workGroupID = ivec3(gl_WorkGroupID);\\\\nivec3 localInvocationID = ivec3(gl_LocalInvocationID);\\\\nivec3 numWorkGroups = ivec3(gl_NumWorkGroups);\\\\nint localInvocationIndex = int(gl_LocalInvocationIndex);\\\\n\\\\n\\\\nlayout(std430, set = 0, binding = 0) buffer readonly GWebGPUBuffer0 {\\\\n vec4 u_Data[];\\\\n} gWebGPUBuffer0;\\\\n\\\\nlayout(std430, set = 0, binding = 1) buffer readonly GWebGPUBuffer1 {\\\\n vec4 u_NodeAttributes[];\\\\n} gWebGPUBuffer1;\\\\n\\\\nlayout(std430, set = 0, binding = 2) buffer GWebGPUBuffer2 {\\\\n vec4 u_ClusterCenters[];\\\\n} gWebGPUBuffer2;\\\\n\\\\n\\\\n\\\\n#define VERTEX_COUNT __DefineValuePlaceholder__VERTEX_COUNT\\\\n#define CLUSTER_COUNT __DefineValuePlaceholder__CLUSTER_COUNT\\\\nlayout (\\\\n local_size_x = 1,\\\\n local_size_y = 1,\\\\n local_size_z = 1\\\\n) in;\\\\n\\\\n\\\\n\\\\nvoid main() {int i = globalInvocationID.x;\\\\nvec4 center = gWebGPUBuffer2.u_ClusterCenters[i];\\\\nfloat sumx = 0.0;\\\\nfloat sumy = 0.0;\\\\nfloat count = 0.0;\\\\nfor (int j = 0; j < VERTEX_COUNT; j++) {vec4 attributes = gWebGPUBuffer1.u_NodeAttributes[j];\\\\nint clusterIdx = int(attributes.x);\\\\nvec4 vertex = gWebGPUBuffer0.u_Data[j];\\\\nif (clusterIdx == i) {sumx += vertex.x;\\\\nsumy += vertex.y;\\\\ncount += 1.0;}}\\\\ngWebGPUBuffer2.u_ClusterCenters[i] = vec4(sumx / count, sumy / count, count, i);}\\\\n\",\"GLSL100\":\"\\\\n\\\\nfloat epsilon = 0.00001;\\\\nvec2 addrTranslation_1Dto2D(float address1D, vec2 texSize) {\\\\n vec2 conv_const = vec2(1.0 / texSize.x, 1.0 / (texSize.x * texSize.y));\\\\n vec2 normAddr2D = float(address1D) * conv_const;\\\\n return vec2(fract(normAddr2D.x + epsilon), normAddr2D.y);\\\\n}\\\\n\\\\nvoid barrier() {}\\\\n \\\\n\\\\nuniform vec2 u_OutputTextureSize;\\\\nuniform int u_OutputTexelCount;\\\\nvarying vec2 v_TexCoord;\\\\n\\\\nbool gWebGPUDebug = false;\\\\nvec4 gWebGPUDebugOutput = vec4(0.0);\\\\n\\\\n#define VERTEX_COUNT __DefineValuePlaceholder__VERTEX_COUNT\\\\n#define CLUSTER_COUNT __DefineValuePlaceholder__CLUSTER_COUNT\\\\n\\\\nuniform sampler2D u_Data;\\\\nuniform vec2 u_DataSize;\\\\nvec4 getDatau_Data(vec2 address2D) {\\\\n return vec4(texture2D(u_Data, address2D).rgba);\\\\n}\\\\nvec4 getDatau_Data(float address1D) {\\\\n return getDatau_Data(addrTranslation_1Dto2D(address1D, u_DataSize));\\\\n}\\\\nvec4 getDatau_Data(int address1D) {\\\\n return getDatau_Data(float(address1D));\\\\n}\\\\nuniform sampler2D u_NodeAttributes;\\\\nuniform vec2 u_NodeAttributesSize;\\\\nvec4 getDatau_NodeAttributes(vec2 address2D) {\\\\n return vec4(texture2D(u_NodeAttributes, address2D).rgba);\\\\n}\\\\nvec4 getDatau_NodeAttributes(float address1D) {\\\\n return getDatau_NodeAttributes(addrTranslation_1Dto2D(address1D, u_NodeAttributesSize));\\\\n}\\\\nvec4 getDatau_NodeAttributes(int address1D) {\\\\n return getDatau_NodeAttributes(float(address1D));\\\\n}\\\\nuniform sampler2D u_ClusterCenters;\\\\nuniform vec2 u_ClusterCentersSize;\\\\nvec4 getDatau_ClusterCenters(vec2 address2D) {\\\\n return vec4(texture2D(u_ClusterCenters, address2D).rgba);\\\\n}\\\\nvec4 getDatau_ClusterCenters(float address1D) {\\\\n return getDatau_ClusterCenters(addrTranslation_1Dto2D(address1D, u_ClusterCentersSize));\\\\n}\\\\nvec4 getDatau_ClusterCenters(int address1D) {\\\\n return getDatau_ClusterCenters(float(address1D));\\\\n}\\\\nvoid main() {\\\\nivec3 workGroupSize = ivec3(1, 1, 1);\\\\nivec3 numWorkGroups = ivec3(1, 1, 1); \\\\nint globalInvocationIndex = int(floor(v_TexCoord.x * u_OutputTextureSize.x))\\\\n + int(floor(v_TexCoord.y * u_OutputTextureSize.y)) * int(u_OutputTextureSize.x);\\\\nint workGroupIDLength = globalInvocationIndex / (workGroupSize.x * workGroupSize.y * workGroupSize.z);\\\\nivec3 workGroupID = ivec3(workGroupIDLength / numWorkGroups.y / numWorkGroups.z, workGroupIDLength / numWorkGroups.x / numWorkGroups.z, workGroupIDLength / numWorkGroups.x / numWorkGroups.y);\\\\nint localInvocationIDZ = globalInvocationIndex / (workGroupSize.x * workGroupSize.y);\\\\nint localInvocationIDY = (globalInvocationIndex - localInvocationIDZ * workGroupSize.x * workGroupSize.y) / workGroupSize.x;\\\\nint localInvocationIDX = globalInvocationIndex - localInvocationIDZ * workGroupSize.x * workGroupSize.y - localInvocationIDY * workGroupSize.x;\\\\nivec3 localInvocationID = ivec3(localInvocationIDX, localInvocationIDY, localInvocationIDZ);\\\\nivec3 globalInvocationID = workGroupID * workGroupSize + localInvocationID;\\\\nint localInvocationIndex = localInvocationID.z * workGroupSize.x * workGroupSize.y\\\\n + localInvocationID.y * workGroupSize.x + localInvocationID.x;\\\\nint i = globalInvocationID.x;\\\\nvec4 center = getDatau_ClusterCenters(i);\\\\nfloat sumx = 0.0;\\\\nfloat sumy = 0.0;\\\\nfloat count = 0.0;\\\\nfor (int j = 0; j < VERTEX_COUNT; j++) {vec4 attributes = getDatau_NodeAttributes(j);\\\\nint clusterIdx = int(attributes.x);\\\\nvec4 vertex = getDatau_Data(j);\\\\nif (clusterIdx == i) {sumx += vertex.x;\\\\nsumy += vertex.y;\\\\ncount += 1.0;}}\\\\ngl_FragColor = vec4(vec4(sumx / count, sumy / count, count, i));if (gWebGPUDebug) {\\\\n gl_FragColor = gWebGPUDebugOutput;\\\\n}}\\\\n\"},\"context\":{\"name\":\"\",\"dispatch\":[1,1,1],\"threadGroupSize\":[1,1,1],\"maxIteration\":1,\"defines\":[{\"name\":\"VERTEX_COUNT\",\"type\":\"Float\",\"runtime\":true},{\"name\":\"CLUSTER_COUNT\",\"type\":\"Float\",\"runtime\":true}],\"uniforms\":[{\"name\":\"u_Data\",\"type\":\"vec4[]\",\"storageClass\":\"StorageBuffer\",\"readonly\":true,\"writeonly\":false,\"size\":[1,1]},{\"name\":\"u_NodeAttributes\",\"type\":\"vec4[]\",\"storageClass\":\"StorageBuffer\",\"readonly\":true,\"writeonly\":false,\"size\":[1,1]},{\"name\":\"u_ClusterCenters\",\"type\":\"vec4[]\",\"storageClass\":\"StorageBuffer\",\"readonly\":false,\"writeonly\":false,\"size\":[1,1]}],\"globalDeclarations\":[],\"output\":{\"name\":\"u_ClusterCenters\",\"size\":[1,1],\"length\":1},\"needPingpong\":true}}`;\n//# sourceMappingURL=fruchtermanShader.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/layout/es/layout/gpu/fruchterman.js\n// @ts-nocheck\n/**\n * @fileOverview fruchterman layout\n * @author shiwu.wyy@antfin.com\n */\nvar __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\n\n\n// @ts-ignore\n\n// compile at runtime in dev mode\n\n// use compiled bundle in prod mode\n\n\n/**\n * fruchterman 布局\n */\nclass fruchterman_FruchtermanGPULayout extends Base {\n constructor(options) {\n super();\n /** 停止迭代的最大迭代数 */\n this.maxIteration = 1000;\n /** 重力大小,影响图的紧凑程度 */\n this.gravity = 10;\n /** 速度 */\n this.speed = 1;\n /** 是否产生聚类力 */\n this.clustering = false;\n /** 根据哪个字段聚类 */\n this.clusterField = \"cluster\";\n /** 聚类力大小 */\n this.clusterGravity = 10;\n /** 是否启用web worker。前提是在web worker里执行布局,否则无效\t*/\n this.workerEnabled = false;\n this.nodes = [];\n this.edges = [];\n this.width = 300;\n this.height = 300;\n this.nodeMap = {};\n this.nodeIdxMap = {};\n this.updateCfg(options);\n }\n getDefaultCfg() {\n return {\n maxIteration: 1000,\n gravity: 10,\n speed: 1,\n clustering: false,\n clusterGravity: 10\n };\n }\n /**\n * 执行布局\n */\n execute() {\n return __awaiter(this, void 0, void 0, function* () {\n const self = this;\n const nodes = self.nodes;\n if (!nodes || nodes.length === 0) {\n if (self.onLayoutEnd)\n self.onLayoutEnd();\n return;\n }\n if (!self.width && typeof window !== \"undefined\") {\n self.width = window.innerWidth;\n }\n if (!self.height && typeof window !== \"undefined\") {\n self.height = window.innerHeight;\n }\n if (!self.center) {\n self.center = [self.width / 2, self.height / 2];\n }\n const center = self.center;\n if (nodes.length === 1) {\n nodes[0].x = center[0];\n nodes[0].y = center[1];\n if (self.onLayoutEnd)\n self.onLayoutEnd();\n return;\n }\n const nodeMap = {};\n const nodeIdxMap = {};\n nodes.forEach((node, i) => {\n if (!isNumber(node.x))\n node.x = Math.random() * this.width;\n if (!isNumber(node.y))\n node.y = Math.random() * this.height;\n nodeMap[node.id] = node;\n nodeIdxMap[node.id] = i;\n });\n self.nodeMap = nodeMap;\n self.nodeIdxMap = nodeIdxMap;\n // layout\n yield self.run();\n });\n }\n executeWithWorker(canvas, ctx) {\n return __awaiter(this, void 0, void 0, function* () {\n const self = this;\n const nodes = self.nodes;\n const center = self.center;\n if (!nodes || nodes.length === 0) {\n return;\n }\n if (nodes.length === 1) {\n nodes[0].x = center[0];\n nodes[0].y = center[1];\n return;\n }\n const nodeMap = {};\n const nodeIdxMap = {};\n nodes.forEach((node, i) => {\n if (!isNumber(node.x))\n node.x = Math.random() * this.width;\n if (!isNumber(node.y))\n node.y = Math.random() * this.height;\n nodeMap[node.id] = node;\n nodeIdxMap[node.id] = i;\n });\n self.nodeMap = nodeMap;\n self.nodeIdxMap = nodeIdxMap;\n // layout\n yield self.run(canvas, ctx);\n });\n }\n run(canvas, ctx) {\n return __awaiter(this, void 0, void 0, function* () {\n const self = this;\n const nodes = self.nodes;\n const edges = self.edges;\n const maxIteration = self.maxIteration;\n const center = self.center;\n const area = self.height * self.width;\n let maxDisplace = Math.sqrt(area) / 10;\n const k2 = area / (nodes.length + 1);\n const k = Math.sqrt(k2);\n const speed = self.speed;\n const clustering = self.clustering;\n const { array: attributeArray, count: clusterCount } = attributesToTextureData([self.clusterField], nodes);\n // pushing the fx and fy\n nodes.forEach((node, i) => {\n let fx = 0;\n let fy = 0;\n if (isNumber(node.fx) && isNumber(node.fy)) {\n fx = node.fx || 0.001;\n fy = node.fy || 0.001;\n }\n attributeArray[4 * i + 1] = fx;\n attributeArray[4 * i + 2] = fy;\n });\n const numParticles = nodes.length;\n const { maxEdgePerVetex, array: nodesEdgesArray } = buildTextureData(nodes, edges);\n const workerEnabled = self.workerEnabled;\n let world;\n if (workerEnabled) {\n world = World_World.create({\n canvas,\n engineOptions: {\n supportCompute: true\n }\n });\n }\n else {\n world = World_World.create({\n engineOptions: {\n supportCompute: true\n }\n });\n }\n // compile at runtime in dev mode\n // const compiler = new Compiler()\n // const fruchtermanBundle = compiler.compileBundle(fruchtermanCode)\n // const clusterBundle = compiler.compileBundle(clusterCode)\n // use compiled bundle in prod mode\n // console.log(fruchtermanBundle.toString())\n // console.log(clusterBundle.toString())\n const onLayoutEnd = self.onLayoutEnd;\n const clusterCenters = [];\n for (let i = 0; i < clusterCount; i++) {\n clusterCenters.push(0, 0, 0, 0);\n }\n const kernelFruchterman = world\n .createKernel(fruchtermanBundle)\n .setDispatch([numParticles, 1, 1])\n .setBinding({\n u_Data: nodesEdgesArray,\n u_K: k,\n u_K2: k2,\n u_Gravity: self.gravity,\n u_ClusterGravity: self.clusterGravity || self.gravity || 1,\n u_Speed: speed,\n u_MaxDisplace: maxDisplace,\n u_Clustering: clustering ? 1 : 0,\n u_Center: center,\n u_AttributeArray: attributeArray,\n u_ClusterCenters: clusterCenters,\n MAX_EDGE_PER_VERTEX: maxEdgePerVetex,\n VERTEX_COUNT: numParticles\n });\n let kernelCluster;\n if (clustering) {\n kernelCluster = world\n .createKernel(clusterBundle)\n .setDispatch([clusterCount, 1, 1])\n .setBinding({\n u_Data: nodesEdgesArray,\n u_NodeAttributes: attributeArray,\n u_ClusterCenters: clusterCenters,\n VERTEX_COUNT: numParticles,\n CLUSTER_COUNT: clusterCount\n });\n }\n const execute = () => __awaiter(this, void 0, void 0, function* () {\n for (let i = 0; i < maxIteration; i++) {\n // eslint-disable-next-line no-await-in-loop\n yield kernelFruchterman.execute();\n if (clustering) {\n kernelCluster.setBinding({\n u_Data: kernelFruchterman\n });\n // eslint-disable-next-line no-await-in-loop\n yield kernelCluster.execute();\n kernelFruchterman.setBinding({\n u_ClusterCenters: kernelCluster\n });\n }\n kernelFruchterman.setBinding({\n u_MaxDisplace: maxDisplace *= 0.99\n });\n }\n const finalParticleData = yield kernelFruchterman.getOutput();\n if (canvas) {\n // 传递数据给主线程\n ctx.postMessage({\n type: LAYOUT_MESSAGE.GPUEND,\n vertexEdgeData: finalParticleData\n // edgeIndexBufferData,\n });\n }\n else {\n nodes.forEach((node, i) => {\n const x = finalParticleData[4 * i];\n const y = finalParticleData[4 * i + 1];\n node.x = x;\n node.y = y;\n });\n }\n if (onLayoutEnd)\n onLayoutEnd();\n });\n yield execute();\n });\n }\n getType() {\n return \"fruchterman-gpu\";\n }\n}\n//# sourceMappingURL=fruchterman.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/layout/es/layout/gpu/gForceShader.js\nconst gForceCode = `\nimport { globalInvocationID } from 'g-webgpu';\n\nconst MAX_EDGE_PER_VERTEX;\nconst VERTEX_COUNT;\nconst SHIFT_20 = 1048576;\n\n@numthreads(1, 1, 1)\nclass GGForce {\n @in @out\n u_Data: vec4[];\n\n @in\n u_damping: float;\n \n @in\n u_maxSpeed: float;\n\n @in\n u_minMovement: float;\n\n @in\n u_AveMovement: vec4[];\n\n @in\n u_coulombDisScale: float;\n\n @in\n u_factor: float;\n\n @in\n u_NodeAttributeArray1: vec4[];\n\n @in\n u_NodeAttributeArray2: vec4[];\n\n @in\n u_interval: float;\n\n unpack_float(packedValue: float): ivec2 {\n const packedIntValue = int(packedValue);\n const v0 = packedIntValue / SHIFT_20;\n return [v0, packedIntValue - v0 * SHIFT_20];\n }\n\n calcRepulsive(i: int, currentNode: vec4): vec2 {\n let ax = 0, ay = 0;\n for (let j: int = 0; j < VERTEX_COUNT; j++) {\n if (i != j) {\n const nextNode = this.u_Data[j];\n const vx = currentNode[0] - nextNode[0];\n const vy = currentNode[1] - nextNode[1];\n const dist = sqrt(vx * vx + vy * vy) + 0.01;\n const n_dist = (dist + 0.1) * this.u_coulombDisScale;\n const direx = vx / dist;\n const direy = vy / dist;\n const attributesi = this.u_NodeAttributeArray1[i];\n const attributesj = this.u_NodeAttributeArray1[j];\n const massi = attributesi[0];\n const nodeStrengthi = attributesi[2];\n const nodeStrengthj = attributesj[2];\n const nodeStrength = (nodeStrengthi + nodeStrengthj) / 2;\n // const param = nodeStrength * this.u_factor / (n_dist * n_dist * massi);\n const param = nodeStrength * this.u_factor / (n_dist * n_dist);\n ax += direx * param;\n ay += direy * param;\n }\n }\n return [ax, ay];\n }\n\n calcGravity(i: int, currentNode: vec4, attributes2: vec4): vec2 {\n // note: attributes2 = [centerX, centerY, gravity, 0]\n\n const vx = currentNode[0] - attributes2[0];\n const vy = currentNode[1] - attributes2[1];\n \n const ax = vx * attributes2[2];\n const ay = vy * attributes2[2];\n \n return [ax, ay];\n }\n\n calcAttractive(i: int, currentNode: vec4, attributes1: vec4): vec2 {\n // note: attributes1 = [mass, degree, nodeSterngth, 0]\n\n const mass = attributes1[0];\n let ax = 0, ay = 0;\n // const arr_offset = int(floor(currentNode[2] + 0.5));\n // const length = int(floor(currentNode[3] + 0.5));\n\n const compressed = this.unpack_float(currentNode[2]);\n const length = compressed[0];\n const arr_offset = compressed[1];\n\n const node_buffer: vec4;\n for (let p: int = 0; p < MAX_EDGE_PER_VERTEX; p++) {\n if (p >= length) break;\n const arr_idx = arr_offset + 4 * p; // i 节点的第 p 条边开始的小格子位置\n const buf_offset = arr_idx - arr_idx / 4 * 4;\n if (p == 0 || buf_offset == 0) {\n node_buffer = this.u_Data[int(arr_idx / 4)]; // 大格子,大格子位置=小个子位置 / 4,\n }\n\n let float_j: float = node_buffer[0];\n\n const nextNode = this.u_Data[int(float_j)];\n const vx = nextNode[0] - currentNode[0];\n const vy = nextNode[1] - currentNode[1];\n const dist = sqrt(vx * vx + vy * vy) + 0.01;\n const direx = vx / dist;\n const direy = vy / dist;\n const edgeLength = node_buffer[1];\n const edgeStrength = node_buffer[2];\n const diff: float = edgeLength - dist;//edgeLength\n // const param = diff * this.u_stiffness / mass; //\n const param = diff * edgeStrength / mass; // \n ax -= direx * param;\n ay -= direy * param;\n }\n return [ax, ay];\n }\n\n @main\n compute() {\n const i = globalInvocationID.x;\n const currentNode = this.u_Data[i];\n const movement = u_AveMovement[0];\n let ax = 0, ay = 0;\n\n if (i >= VERTEX_COUNT || movement.x < u_minMovement) {\n this.u_Data[i] = currentNode;\n return;\n }\n\n // 每个节点属性占两个数组中各一格\n // [mass, degree, nodeStrength, fx]\n const nodeAttributes1 = this.u_NodeAttributeArray1[i];\n // [centerX, centerY, centerGravity, fy]\n const nodeAttributes2 = this.u_NodeAttributeArray2[i];\n\n // repulsive\n const repulsive = this.calcRepulsive(i, currentNode);\n ax += repulsive[0];\n ay += repulsive[1];\n\n // attractive\n const attractive = this.calcAttractive(i, currentNode, nodeAttributes1);\n ax += attractive[0];\n ay += attractive[1];\n\n // gravity\n const gravity = this.calcGravity(i, currentNode, nodeAttributes2);\n ax -= gravity[0];\n ay -= gravity[1];\n\n // speed\n const param = this.u_interval * this.u_damping;\n let vx = ax * param;\n let vy = ay * param;\n const vlength = sqrt(vx * vx + vy * vy) + 0.0001;\n if (vlength > this.u_maxSpeed) {\n const param2 = this.u_maxSpeed / vlength;\n vx = param2 * vx;\n vy = param2 * vy;\n }\n\n // move\n if (nodeAttributes1[3] != 0 && nodeAttributes2[3] != 0) {\n this.u_Data[i] = [\n nodeAttributes1[3],\n nodeAttributes2[3],\n currentNode[2],\n 0\n ];\n } else {\n const distx = vx * this.u_interval;\n const disty = vy * this.u_interval;\n const distLength = sqrt(distx * distx + disty * disty);\n this.u_Data[i] = [\n currentNode[0] + distx,\n currentNode[1] + disty,\n currentNode[2],\n distLength\n ];\n }\n \n // the avarage move distance\n // need to share memory\n \n }\n}\n`;\nconst gForceBundle = `{\"shaders\":{\"WGSL\":\"import \\\\\"GLSL.std.450\\\\\" as std;\\\\n\\\\n\\\\n# var gWebGPUDebug : bool = false;\\\\n# var gWebGPUDebugOutput : vec4 = vec4(0.0);\\\\n\\\\n[[builtin global_invocation_id]] var globalInvocationID : vec3;\\\\n# [[builtin work_group_size]] var workGroupSize : vec3;\\\\n# [[builtin work_group_id]] var workGroupID : vec3;\\\\n[[builtin local_invocation_id]] var localInvocationID : vec3;\\\\n# [[builtin num_work_groups]] var numWorkGroups : vec3;\\\\n[[builtin local_invocation_idx]] var localInvocationIndex : u32;\\\\n\\\\ntype GWebGPUParams = [[block]] struct {\\\\n [[offset 0]] u_damping : f32;\\\\n [[offset 4]] u_maxSpeed : f32;\\\\n [[offset 8]] u_minMovement : f32;\\\\n \\\\n [[offset 12]] u_coulombDisScale : f32;\\\\n [[offset 16]] u_factor : f32;\\\\n \\\\n \\\\n [[offset 20]] u_interval : f32;\\\\n};\\\\n[[binding 0, set 0]] var gWebGPUUniformParams : GWebGPUParams;\\\\ntype GWebGPUBuffer0 = [[block]] struct {\\\\n [[offset 0]] u_Data : [[stride 16]] array>;\\\\n};\\\\n[[binding 1, set 0]] var gWebGPUBuffer0 : GWebGPUBuffer0;\\\\ntype GWebGPUBuffer1 = [[block]] struct {\\\\n [[offset 0]] u_AveMovement : [[stride 16]] array>;\\\\n};\\\\n[[binding 2, set 0]] var gWebGPUBuffer1 : GWebGPUBuffer1;\\\\ntype GWebGPUBuffer2 = [[block]] struct {\\\\n [[offset 0]] u_NodeAttributeArray1 : [[stride 16]] array>;\\\\n};\\\\n[[binding 3, set 0]] var gWebGPUBuffer2 : GWebGPUBuffer2;\\\\ntype GWebGPUBuffer3 = [[block]] struct {\\\\n [[offset 0]] u_NodeAttributeArray2 : [[stride 16]] array>;\\\\n};\\\\n[[binding 4, set 0]] var gWebGPUBuffer3 : GWebGPUBuffer3;\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\nfn unpack_float(packedValue : f32) -> vec2 {var packedIntValue : i32 = i32(packedValue);\\\\nvar v0 : i32 = packedIntValue / 1048576;\\\\nreturn vec2(v0, packedIntValue - (v0 * 1048576));}\\\\nfn calcRepulsive(i : i32, currentNode : vec4) -> vec2 {var ax : f32 = 0.0;\\\\nvar ay : f32 = 0.0;\\\\nfor (var j : i32 = 0; j < __DefineValuePlaceholder__VERTEX_COUNT; j = j + 1) {if (i != j) {var nextNode : vec4 = gWebGPUBuffer0.u_Data[j];\\\\nvar vx : f32 = currentNode.x - nextNode.x;\\\\nvar vy : f32 = currentNode.y - nextNode.y;\\\\nvar dist : f32 = std::sqrt((vx * vx) + (vy * vy)) + 0.01;\\\\nvar n_dist : f32 = (dist + 0.1) * gWebGPUUniformParams.u_coulombDisScale;\\\\nvar direx : f32 = vx / dist;\\\\nvar direy : f32 = vy / dist;\\\\nvar attributesi : vec4 = gWebGPUBuffer2.u_NodeAttributeArray1[i];\\\\nvar attributesj : vec4 = gWebGPUBuffer2.u_NodeAttributeArray1[j];\\\\nvar massi : f32 = attributesi.x;\\\\nvar nodeStrengthi : f32 = attributesi.z;\\\\nvar nodeStrengthj : f32 = attributesj.z;\\\\nvar nodeStrength : f32 = (nodeStrengthi + nodeStrengthj) / 2.0;\\\\nvar param : f32 = (nodeStrength * gWebGPUUniformParams.u_factor) / (n_dist * n_dist);\\\\nax = ax + direx * param;\\\\nay = ay + direy * param;}}\\\\nreturn vec2(ax, ay);}\\\\nfn calcGravity(i : i32, currentNode : vec4, attributes2 : vec4) -> vec2 {var vx : f32 = currentNode.x - attributes2.x;\\\\nvar vy : f32 = currentNode.y - attributes2.y;\\\\nvar ax : f32 = vx * attributes2.z;\\\\nvar ay : f32 = vy * attributes2.z;\\\\nreturn vec2(ax, ay);}\\\\nfn calcAttractive(i : i32, currentNode : vec4, attributes1 : vec4) -> vec2 {var mass : f32 = attributes1.x;\\\\nvar ax : f32 = 0.0;\\\\nvar ay : f32 = 0.0;\\\\nvar compressed : vec2 = unpack_float(currentNode.z);\\\\nvar length : i32 = compressed.x;\\\\nvar arr_offset : i32 = compressed.y;\\\\nvar node_buffer : vec4;\\\\nfor (var p : i32 = 0; p < __DefineValuePlaceholder__MAX_EDGE_PER_VERTEX; p = p + 1) {if (p >= length) {break;}\\\\nvar arr_idx : i32 = arr_offset + (4 * p);\\\\nvar buf_offset : i32 = arr_idx - ((arr_idx / 4) * 4);\\\\nif ((p == 0) || (buf_offset == 0)) {node_buffer = gWebGPUBuffer0.u_Data[i32(arr_idx / 4)];}\\\\nvar float_j : f32 = node_buffer.x;\\\\nvar nextNode : vec4 = gWebGPUBuffer0.u_Data[i32(float_j)];\\\\nvar vx : f32 = nextNode.x - currentNode.x;\\\\nvar vy : f32 = nextNode.y - currentNode.y;\\\\nvar dist : f32 = std::sqrt((vx * vx) + (vy * vy)) + 0.01;\\\\nvar direx : f32 = vx / dist;\\\\nvar direy : f32 = vy / dist;\\\\nvar edgeLength : f32 = node_buffer.y;\\\\nvar edgeStrength : f32 = node_buffer.z;\\\\nvar diff : f32 = edgeLength - dist;\\\\nvar param : f32 = (diff * edgeStrength) / mass;\\\\nax = ax - direx * param;\\\\nay = ay - direy * param;}\\\\nreturn vec2(ax, ay);}\\\\nfn main() -> void {var i : i32 = globalInvocationID.x;\\\\nvar currentNode : vec4 = gWebGPUBuffer0.u_Data[i];\\\\nvar movement : vec4 = gWebGPUBuffer1.u_AveMovement[0];\\\\nvar ax : f32 = 0.0;\\\\nvar ay : f32 = 0.0;\\\\nif ((i >= __DefineValuePlaceholder__VERTEX_COUNT) || (movement.x < gWebGPUUniformParams.u_minMovement)) {gWebGPUBuffer0.u_Data[i] = currentNode;\\\\nreturn ;}\\\\nvar nodeAttributes1 : vec4 = gWebGPUBuffer2.u_NodeAttributeArray1[i];\\\\nvar nodeAttributes2 : vec4 = gWebGPUBuffer3.u_NodeAttributeArray2[i];\\\\nvar repulsive : vec2 = calcRepulsive(i, currentNode);\\\\nax = ax + repulsive.x;\\\\nay = ay + repulsive.y;\\\\nvar attractive : vec2 = calcAttractive(i, currentNode, nodeAttributes1);\\\\nax = ax + attractive.x;\\\\nay = ay + attractive.y;\\\\nvar gravity : vec2 = calcGravity(i, currentNode, nodeAttributes2);\\\\nax = ax - gravity.x;\\\\nay = ay - gravity.y;\\\\nvar param : f32 = gWebGPUUniformParams.u_interval * gWebGPUUniformParams.u_damping;\\\\nvar vx : f32 = ax * param;\\\\nvar vy : f32 = ay * param;\\\\nvar vlength : f32 = std::sqrt((vx * vx) + (vy * vy)) + 0.0001;\\\\nif (vlength > gWebGPUUniformParams.u_maxSpeed) {var param2 : f32 = gWebGPUUniformParams.u_maxSpeed / vlength;\\\\nvx = param2 * vx;\\\\nvy = param2 * vy;}\\\\nvar distx : f32 = vx * gWebGPUUniformParams.u_interval;\\\\nvar disty : f32 = vy * gWebGPUUniformParams.u_interval;\\\\nvar distLength : f32 = std::sqrt((distx * distx) + (disty * disty));\\\\nif ((nodeAttributes1.w != 0.0) && (nodeAttributes2.w != 0.0)) {gWebGPUBuffer0.u_Data[i] = vec4(nodeAttributes1.w, nodeAttributes2.w, currentNode.z, 0.0);}else {gWebGPUBuffer0.u_Data[i] = vec4(currentNode.x + distx, currentNode.y + disty, currentNode.z, distLength);}\\\\nreturn;}\\\\n\\\\nentry_point compute as \\\\\"main\\\\\" = main;\\\\n\",\"GLSL450\":\"\\\\n\\\\n\\\\nbool gWebGPUDebug = false;\\\\nvec4 gWebGPUDebugOutput = vec4(0.0);\\\\n\\\\nivec3 globalInvocationID = ivec3(gl_GlobalInvocationID);\\\\nivec3 workGroupSize = ivec3(1,1,1);\\\\nivec3 workGroupID = ivec3(gl_WorkGroupID);\\\\nivec3 localInvocationID = ivec3(gl_LocalInvocationID);\\\\nivec3 numWorkGroups = ivec3(gl_NumWorkGroups);\\\\nint localInvocationIndex = int(gl_LocalInvocationIndex);\\\\n\\\\nlayout(std140, set = 0, binding = 0) uniform GWebGPUParams {\\\\n float u_damping;\\\\n float u_maxSpeed;\\\\n float u_minMovement;\\\\n \\\\n float u_coulombDisScale;\\\\n float u_factor;\\\\n \\\\n \\\\n float u_interval;\\\\n} gWebGPUUniformParams;\\\\nlayout(std430, set = 0, binding = 1) buffer GWebGPUBuffer0 {\\\\n vec4 u_Data[];\\\\n} gWebGPUBuffer0;\\\\n\\\\nlayout(std430, set = 0, binding = 2) buffer readonly GWebGPUBuffer1 {\\\\n vec4 u_AveMovement[];\\\\n} gWebGPUBuffer1;\\\\n\\\\nlayout(std430, set = 0, binding = 3) buffer readonly GWebGPUBuffer2 {\\\\n vec4 u_NodeAttributeArray1[];\\\\n} gWebGPUBuffer2;\\\\n\\\\nlayout(std430, set = 0, binding = 4) buffer readonly GWebGPUBuffer3 {\\\\n vec4 u_NodeAttributeArray2[];\\\\n} gWebGPUBuffer3;\\\\n\\\\n\\\\n\\\\n#define MAX_EDGE_PER_VERTEX __DefineValuePlaceholder__MAX_EDGE_PER_VERTEX\\\\n#define VERTEX_COUNT __DefineValuePlaceholder__VERTEX_COUNT\\\\n#define SHIFT_20 1048576.0\\\\nlayout (\\\\n local_size_x = 1,\\\\n local_size_y = 1,\\\\n local_size_z = 1\\\\n) in;\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\nivec2 unpack_float(float packedValue) {int packedIntValue = int(packedValue);\\\\nint v0 = packedIntValue / int(SHIFT_20);\\\\nreturn ivec2(v0, packedIntValue - (v0 * int(SHIFT_20)));}\\\\nvec2 calcRepulsive(int i, vec4 currentNode) {float ax = 0.0;\\\\nfloat ay = 0.0;\\\\nfor (int j = 0; j < VERTEX_COUNT; j++) {if (i != j) {vec4 nextNode = gWebGPUBuffer0.u_Data[j];\\\\nfloat vx = currentNode.x - nextNode.x;\\\\nfloat vy = currentNode.y - nextNode.y;\\\\nfloat dist = sqrt((vx * vx) + (vy * vy)) + 0.01;\\\\nfloat n_dist = (dist + 0.1) * gWebGPUUniformParams.u_coulombDisScale;\\\\nfloat direx = vx / dist;\\\\nfloat direy = vy / dist;\\\\nvec4 attributesi = gWebGPUBuffer2.u_NodeAttributeArray1[i];\\\\nvec4 attributesj = gWebGPUBuffer2.u_NodeAttributeArray1[j];\\\\nfloat massi = attributesi.x;\\\\nfloat nodeStrengthi = attributesi.z;\\\\nfloat nodeStrengthj = attributesj.z;\\\\nfloat nodeStrength = (nodeStrengthi + nodeStrengthj) / 2.0;\\\\nfloat param = (nodeStrength * gWebGPUUniformParams.u_factor) / (n_dist * n_dist);\\\\nax += direx * param;\\\\nay += direy * param;}}\\\\nreturn vec2(ax, ay);}\\\\nvec2 calcGravity(int i, vec4 currentNode, vec4 attributes2) {float vx = currentNode.x - attributes2.x;\\\\nfloat vy = currentNode.y - attributes2.y;\\\\nfloat ax = vx * attributes2.z;\\\\nfloat ay = vy * attributes2.z;\\\\nreturn vec2(ax, ay);}\\\\nvec2 calcAttractive(int i, vec4 currentNode, vec4 attributes1) {float mass = attributes1.x;\\\\nfloat ax = 0.0;\\\\nfloat ay = 0.0;\\\\nivec2 compressed = unpack_float(currentNode.z);\\\\nint length = compressed.x;\\\\nint arr_offset = compressed.y;\\\\nvec4 node_buffer;\\\\nfor (int p = 0; p < MAX_EDGE_PER_VERTEX; p++) {if (p >= length) {break;}\\\\nint arr_idx = arr_offset + (4 * p);\\\\nint buf_offset = arr_idx - ((arr_idx / 4) * 4);\\\\nif ((p == 0) || (buf_offset == 0)) {node_buffer = gWebGPUBuffer0.u_Data[int(arr_idx / 4)];}\\\\nfloat float_j = node_buffer.x;\\\\nvec4 nextNode = gWebGPUBuffer0.u_Data[int(float_j)];\\\\nfloat vx = nextNode.x - currentNode.x;\\\\nfloat vy = nextNode.y - currentNode.y;\\\\nfloat dist = sqrt((vx * vx) + (vy * vy)) + 0.01;\\\\nfloat direx = vx / dist;\\\\nfloat direy = vy / dist;\\\\nfloat edgeLength = node_buffer.y;\\\\nfloat edgeStrength = node_buffer.z;\\\\nfloat diff = edgeLength - dist;\\\\nfloat param = (diff * edgeStrength) / mass;\\\\nax -= direx * param;\\\\nay -= direy * param;}\\\\nreturn vec2(ax, ay);}\\\\nvoid main() {int i = globalInvocationID.x;\\\\nvec4 currentNode = gWebGPUBuffer0.u_Data[i];\\\\nvec4 movement = gWebGPUBuffer1.u_AveMovement[0];\\\\nfloat ax = 0.0;\\\\nfloat ay = 0.0;\\\\nif ((i >= VERTEX_COUNT) || (movement.x < gWebGPUUniformParams.u_minMovement)) {gWebGPUBuffer0.u_Data[i] = currentNode;\\\\nreturn ;}\\\\nvec4 nodeAttributes1 = gWebGPUBuffer2.u_NodeAttributeArray1[i];\\\\nvec4 nodeAttributes2 = gWebGPUBuffer3.u_NodeAttributeArray2[i];\\\\nvec2 repulsive = calcRepulsive(i, currentNode);\\\\nax += repulsive.x;\\\\nay += repulsive.y;\\\\nvec2 attractive = calcAttractive(i, currentNode, nodeAttributes1);\\\\nax += attractive.x;\\\\nay += attractive.y;\\\\nvec2 gravity = calcGravity(i, currentNode, nodeAttributes2);\\\\nax -= gravity.x;\\\\nay -= gravity.y;\\\\nfloat param = gWebGPUUniformParams.u_interval * gWebGPUUniformParams.u_damping;\\\\nfloat vx = ax * param;\\\\nfloat vy = ay * param;\\\\nfloat vlength = sqrt((vx * vx) + (vy * vy)) + 0.0001;\\\\nif (vlength > gWebGPUUniformParams.u_maxSpeed) {float param2 = gWebGPUUniformParams.u_maxSpeed / vlength;\\\\nvx = param2 * vx;\\\\nvy = param2 * vy;}\\\\nfloat distx = vx * gWebGPUUniformParams.u_interval;\\\\nfloat disty = vy * gWebGPUUniformParams.u_interval;\\\\nfloat distLength = sqrt((distx * distx) + (disty * disty));\\\\nif ((nodeAttributes1.w != 0.0) && (nodeAttributes2.w != 0.0)) {gWebGPUBuffer0.u_Data[i] = vec4(nodeAttributes1.w, nodeAttributes2.w, currentNode.z, 0.0);}else {gWebGPUBuffer0.u_Data[i] = vec4(currentNode.x + distx, currentNode.y + disty, currentNode.z, distLength);}}\\\\n\",\"GLSL100\":\"\\\\n\\\\nfloat epsilon = 0.00001;\\\\nvec2 addrTranslation_1Dto2D(float address1D, vec2 texSize) {\\\\n vec2 conv_const = vec2(1.0 / texSize.x, 1.0 / (texSize.x * texSize.y));\\\\n vec2 normAddr2D = float(address1D) * conv_const;\\\\n return vec2(fract(normAddr2D.x + epsilon), normAddr2D.y);\\\\n}\\\\n\\\\nvoid barrier() {}\\\\n \\\\n\\\\nuniform vec2 u_OutputTextureSize;\\\\nuniform int u_OutputTexelCount;\\\\nvarying vec2 v_TexCoord;\\\\n\\\\nbool gWebGPUDebug = false;\\\\nvec4 gWebGPUDebugOutput = vec4(0.0);\\\\n\\\\n#define MAX_EDGE_PER_VERTEX __DefineValuePlaceholder__MAX_EDGE_PER_VERTEX\\\\n#define VERTEX_COUNT __DefineValuePlaceholder__VERTEX_COUNT\\\\n#define SHIFT_20 1048576.0\\\\n\\\\nuniform sampler2D u_Data;\\\\nuniform vec2 u_DataSize;\\\\nvec4 getDatau_Data(vec2 address2D) {\\\\n return vec4(texture2D(u_Data, address2D).rgba);\\\\n}\\\\nvec4 getDatau_Data(float address1D) {\\\\n return getDatau_Data(addrTranslation_1Dto2D(address1D, u_DataSize));\\\\n}\\\\nvec4 getDatau_Data(int address1D) {\\\\n return getDatau_Data(float(address1D));\\\\n}\\\\nuniform float u_damping;\\\\nuniform float u_maxSpeed;\\\\nuniform float u_minMovement;\\\\nuniform sampler2D u_AveMovement;\\\\nuniform vec2 u_AveMovementSize;\\\\nvec4 getDatau_AveMovement(vec2 address2D) {\\\\n return vec4(texture2D(u_AveMovement, address2D).rgba);\\\\n}\\\\nvec4 getDatau_AveMovement(float address1D) {\\\\n return getDatau_AveMovement(addrTranslation_1Dto2D(address1D, u_AveMovementSize));\\\\n}\\\\nvec4 getDatau_AveMovement(int address1D) {\\\\n return getDatau_AveMovement(float(address1D));\\\\n}\\\\nuniform float u_coulombDisScale;\\\\nuniform float u_factor;\\\\nuniform sampler2D u_NodeAttributeArray1;\\\\nuniform vec2 u_NodeAttributeArray1Size;\\\\nvec4 getDatau_NodeAttributeArray1(vec2 address2D) {\\\\n return vec4(texture2D(u_NodeAttributeArray1, address2D).rgba);\\\\n}\\\\nvec4 getDatau_NodeAttributeArray1(float address1D) {\\\\n return getDatau_NodeAttributeArray1(addrTranslation_1Dto2D(address1D, u_NodeAttributeArray1Size));\\\\n}\\\\nvec4 getDatau_NodeAttributeArray1(int address1D) {\\\\n return getDatau_NodeAttributeArray1(float(address1D));\\\\n}\\\\nuniform sampler2D u_NodeAttributeArray2;\\\\nuniform vec2 u_NodeAttributeArray2Size;\\\\nvec4 getDatau_NodeAttributeArray2(vec2 address2D) {\\\\n return vec4(texture2D(u_NodeAttributeArray2, address2D).rgba);\\\\n}\\\\nvec4 getDatau_NodeAttributeArray2(float address1D) {\\\\n return getDatau_NodeAttributeArray2(addrTranslation_1Dto2D(address1D, u_NodeAttributeArray2Size));\\\\n}\\\\nvec4 getDatau_NodeAttributeArray2(int address1D) {\\\\n return getDatau_NodeAttributeArray2(float(address1D));\\\\n}\\\\nuniform float u_interval;\\\\nivec2 unpack_float(float packedValue) {\\\\nivec3 workGroupSize = ivec3(1, 1, 1);\\\\nivec3 numWorkGroups = ivec3(1, 1, 1); \\\\nint globalInvocationIndex = int(floor(v_TexCoord.x * u_OutputTextureSize.x))\\\\n + int(floor(v_TexCoord.y * u_OutputTextureSize.y)) * int(u_OutputTextureSize.x);\\\\nint workGroupIDLength = globalInvocationIndex / (workGroupSize.x * workGroupSize.y * workGroupSize.z);\\\\nivec3 workGroupID = ivec3(workGroupIDLength / numWorkGroups.y / numWorkGroups.z, workGroupIDLength / numWorkGroups.x / numWorkGroups.z, workGroupIDLength / numWorkGroups.x / numWorkGroups.y);\\\\nint localInvocationIDZ = globalInvocationIndex / (workGroupSize.x * workGroupSize.y);\\\\nint localInvocationIDY = (globalInvocationIndex - localInvocationIDZ * workGroupSize.x * workGroupSize.y) / workGroupSize.x;\\\\nint localInvocationIDX = globalInvocationIndex - localInvocationIDZ * workGroupSize.x * workGroupSize.y - localInvocationIDY * workGroupSize.x;\\\\nivec3 localInvocationID = ivec3(localInvocationIDX, localInvocationIDY, localInvocationIDZ);\\\\nivec3 globalInvocationID = workGroupID * workGroupSize + localInvocationID;\\\\nint localInvocationIndex = localInvocationID.z * workGroupSize.x * workGroupSize.y\\\\n + localInvocationID.y * workGroupSize.x + localInvocationID.x;\\\\nint packedIntValue = int(packedValue);\\\\nint v0 = packedIntValue / int(SHIFT_20);\\\\nreturn ivec2(v0, packedIntValue - (v0 * int(SHIFT_20)));}\\\\nvec2 calcRepulsive(int i, vec4 currentNode) {\\\\nivec3 workGroupSize = ivec3(1, 1, 1);\\\\nivec3 numWorkGroups = ivec3(1, 1, 1); \\\\nint globalInvocationIndex = int(floor(v_TexCoord.x * u_OutputTextureSize.x))\\\\n + int(floor(v_TexCoord.y * u_OutputTextureSize.y)) * int(u_OutputTextureSize.x);\\\\nint workGroupIDLength = globalInvocationIndex / (workGroupSize.x * workGroupSize.y * workGroupSize.z);\\\\nivec3 workGroupID = ivec3(workGroupIDLength / numWorkGroups.y / numWorkGroups.z, workGroupIDLength / numWorkGroups.x / numWorkGroups.z, workGroupIDLength / numWorkGroups.x / numWorkGroups.y);\\\\nint localInvocationIDZ = globalInvocationIndex / (workGroupSize.x * workGroupSize.y);\\\\nint localInvocationIDY = (globalInvocationIndex - localInvocationIDZ * workGroupSize.x * workGroupSize.y) / workGroupSize.x;\\\\nint localInvocationIDX = globalInvocationIndex - localInvocationIDZ * workGroupSize.x * workGroupSize.y - localInvocationIDY * workGroupSize.x;\\\\nivec3 localInvocationID = ivec3(localInvocationIDX, localInvocationIDY, localInvocationIDZ);\\\\nivec3 globalInvocationID = workGroupID * workGroupSize + localInvocationID;\\\\nint localInvocationIndex = localInvocationID.z * workGroupSize.x * workGroupSize.y\\\\n + localInvocationID.y * workGroupSize.x + localInvocationID.x;\\\\nfloat ax = 0.0;\\\\nfloat ay = 0.0;\\\\nfor (int j = 0; j < VERTEX_COUNT; j++) {if (i != j) {vec4 nextNode = getDatau_Data(j);\\\\nfloat vx = currentNode.x - nextNode.x;\\\\nfloat vy = currentNode.y - nextNode.y;\\\\nfloat dist = sqrt((vx * vx) + (vy * vy)) + 0.01;\\\\nfloat n_dist = (dist + 0.1) * u_coulombDisScale;\\\\nfloat direx = vx / dist;\\\\nfloat direy = vy / dist;\\\\nvec4 attributesi = getDatau_NodeAttributeArray1(i);\\\\nvec4 attributesj = getDatau_NodeAttributeArray1(j);\\\\nfloat massi = attributesi.x;\\\\nfloat nodeStrengthi = attributesi.z;\\\\nfloat nodeStrengthj = attributesj.z;\\\\nfloat nodeStrength = (nodeStrengthi + nodeStrengthj) / 2.0;\\\\nfloat param = (nodeStrength * u_factor) / (n_dist * n_dist);\\\\nax += direx * param;\\\\nay += direy * param;}}\\\\nreturn vec2(ax, ay);}\\\\nvec2 calcGravity(int i, vec4 currentNode, vec4 attributes2) {\\\\nivec3 workGroupSize = ivec3(1, 1, 1);\\\\nivec3 numWorkGroups = ivec3(1, 1, 1); \\\\nint globalInvocationIndex = int(floor(v_TexCoord.x * u_OutputTextureSize.x))\\\\n + int(floor(v_TexCoord.y * u_OutputTextureSize.y)) * int(u_OutputTextureSize.x);\\\\nint workGroupIDLength = globalInvocationIndex / (workGroupSize.x * workGroupSize.y * workGroupSize.z);\\\\nivec3 workGroupID = ivec3(workGroupIDLength / numWorkGroups.y / numWorkGroups.z, workGroupIDLength / numWorkGroups.x / numWorkGroups.z, workGroupIDLength / numWorkGroups.x / numWorkGroups.y);\\\\nint localInvocationIDZ = globalInvocationIndex / (workGroupSize.x * workGroupSize.y);\\\\nint localInvocationIDY = (globalInvocationIndex - localInvocationIDZ * workGroupSize.x * workGroupSize.y) / workGroupSize.x;\\\\nint localInvocationIDX = globalInvocationIndex - localInvocationIDZ * workGroupSize.x * workGroupSize.y - localInvocationIDY * workGroupSize.x;\\\\nivec3 localInvocationID = ivec3(localInvocationIDX, localInvocationIDY, localInvocationIDZ);\\\\nivec3 globalInvocationID = workGroupID * workGroupSize + localInvocationID;\\\\nint localInvocationIndex = localInvocationID.z * workGroupSize.x * workGroupSize.y\\\\n + localInvocationID.y * workGroupSize.x + localInvocationID.x;\\\\nfloat vx = currentNode.x - attributes2.x;\\\\nfloat vy = currentNode.y - attributes2.y;\\\\nfloat ax = vx * attributes2.z;\\\\nfloat ay = vy * attributes2.z;\\\\nreturn vec2(ax, ay);}\\\\nvec2 calcAttractive(int i, vec4 currentNode, vec4 attributes1) {\\\\nivec3 workGroupSize = ivec3(1, 1, 1);\\\\nivec3 numWorkGroups = ivec3(1, 1, 1); \\\\nint globalInvocationIndex = int(floor(v_TexCoord.x * u_OutputTextureSize.x))\\\\n + int(floor(v_TexCoord.y * u_OutputTextureSize.y)) * int(u_OutputTextureSize.x);\\\\nint workGroupIDLength = globalInvocationIndex / (workGroupSize.x * workGroupSize.y * workGroupSize.z);\\\\nivec3 workGroupID = ivec3(workGroupIDLength / numWorkGroups.y / numWorkGroups.z, workGroupIDLength / numWorkGroups.x / numWorkGroups.z, workGroupIDLength / numWorkGroups.x / numWorkGroups.y);\\\\nint localInvocationIDZ = globalInvocationIndex / (workGroupSize.x * workGroupSize.y);\\\\nint localInvocationIDY = (globalInvocationIndex - localInvocationIDZ * workGroupSize.x * workGroupSize.y) / workGroupSize.x;\\\\nint localInvocationIDX = globalInvocationIndex - localInvocationIDZ * workGroupSize.x * workGroupSize.y - localInvocationIDY * workGroupSize.x;\\\\nivec3 localInvocationID = ivec3(localInvocationIDX, localInvocationIDY, localInvocationIDZ);\\\\nivec3 globalInvocationID = workGroupID * workGroupSize + localInvocationID;\\\\nint localInvocationIndex = localInvocationID.z * workGroupSize.x * workGroupSize.y\\\\n + localInvocationID.y * workGroupSize.x + localInvocationID.x;\\\\nfloat mass = attributes1.x;\\\\nfloat ax = 0.0;\\\\nfloat ay = 0.0;\\\\nivec2 compressed = unpack_float(currentNode.z);\\\\nint length = compressed.x;\\\\nint arr_offset = compressed.y;\\\\nvec4 node_buffer;\\\\nfor (int p = 0; p < MAX_EDGE_PER_VERTEX; p++) {if (p >= length) {break;}\\\\nint arr_idx = arr_offset + (4 * p);\\\\nint buf_offset = arr_idx - ((arr_idx / 4) * 4);\\\\nif ((p == 0) || (buf_offset == 0)) {node_buffer = getDatau_Data(int(arr_idx / 4));}\\\\nfloat float_j = node_buffer.x;\\\\nvec4 nextNode = getDatau_Data(int(float_j));\\\\nfloat vx = nextNode.x - currentNode.x;\\\\nfloat vy = nextNode.y - currentNode.y;\\\\nfloat dist = sqrt((vx * vx) + (vy * vy)) + 0.01;\\\\nfloat direx = vx / dist;\\\\nfloat direy = vy / dist;\\\\nfloat edgeLength = node_buffer.y;\\\\nfloat edgeStrength = node_buffer.z;\\\\nfloat diff = edgeLength - dist;\\\\nfloat param = (diff * edgeStrength) / mass;\\\\nax -= direx * param;\\\\nay -= direy * param;}\\\\nreturn vec2(ax, ay);}\\\\nvoid main() {\\\\nivec3 workGroupSize = ivec3(1, 1, 1);\\\\nivec3 numWorkGroups = ivec3(1, 1, 1); \\\\nint globalInvocationIndex = int(floor(v_TexCoord.x * u_OutputTextureSize.x))\\\\n + int(floor(v_TexCoord.y * u_OutputTextureSize.y)) * int(u_OutputTextureSize.x);\\\\nint workGroupIDLength = globalInvocationIndex / (workGroupSize.x * workGroupSize.y * workGroupSize.z);\\\\nivec3 workGroupID = ivec3(workGroupIDLength / numWorkGroups.y / numWorkGroups.z, workGroupIDLength / numWorkGroups.x / numWorkGroups.z, workGroupIDLength / numWorkGroups.x / numWorkGroups.y);\\\\nint localInvocationIDZ = globalInvocationIndex / (workGroupSize.x * workGroupSize.y);\\\\nint localInvocationIDY = (globalInvocationIndex - localInvocationIDZ * workGroupSize.x * workGroupSize.y) / workGroupSize.x;\\\\nint localInvocationIDX = globalInvocationIndex - localInvocationIDZ * workGroupSize.x * workGroupSize.y - localInvocationIDY * workGroupSize.x;\\\\nivec3 localInvocationID = ivec3(localInvocationIDX, localInvocationIDY, localInvocationIDZ);\\\\nivec3 globalInvocationID = workGroupID * workGroupSize + localInvocationID;\\\\nint localInvocationIndex = localInvocationID.z * workGroupSize.x * workGroupSize.y\\\\n + localInvocationID.y * workGroupSize.x + localInvocationID.x;\\\\nint i = globalInvocationID.x;\\\\nvec4 currentNode = getDatau_Data(i);\\\\nvec4 movement = getDatau_AveMovement(0.0);\\\\nfloat ax = 0.0;\\\\nfloat ay = 0.0;\\\\nif ((i >= VERTEX_COUNT) || (movement.x < u_minMovement)) {gl_FragColor = vec4(currentNode);\\\\nreturn ;}\\\\nvec4 nodeAttributes1 = getDatau_NodeAttributeArray1(i);\\\\nvec4 nodeAttributes2 = getDatau_NodeAttributeArray2(i);\\\\nvec2 repulsive = calcRepulsive(i, currentNode);\\\\nax += repulsive.x;\\\\nay += repulsive.y;\\\\nvec2 attractive = calcAttractive(i, currentNode, nodeAttributes1);\\\\nax += attractive.x;\\\\nay += attractive.y;\\\\nvec2 gravity = calcGravity(i, currentNode, nodeAttributes2);\\\\nax -= gravity.x;\\\\nay -= gravity.y;\\\\nfloat param = u_interval * u_damping;\\\\nfloat vx = ax * param;\\\\nfloat vy = ay * param;\\\\nfloat vlength = sqrt((vx * vx) + (vy * vy)) + 0.0001;\\\\nif (vlength > u_maxSpeed) {float param2 = u_maxSpeed / vlength;\\\\nvx = param2 * vx;\\\\nvy = param2 * vy;}\\\\nfloat distx = vx * u_interval;\\\\nfloat disty = vy * u_interval;\\\\nfloat distLength = sqrt((distx * distx) + (disty * disty));\\\\nif ((nodeAttributes1.w != 0.0) && (nodeAttributes2.w != 0.0)) {gl_FragColor = vec4(vec4(nodeAttributes1.w, nodeAttributes2.w, currentNode.z, 0.0));}else {gl_FragColor = vec4(vec4(currentNode.x + distx, currentNode.y + disty, currentNode.z, distLength));}if (gWebGPUDebug) {\\\\n gl_FragColor = gWebGPUDebugOutput;\\\\n}}\\\\n\"},\"context\":{\"name\":\"\",\"dispatch\":[1,1,1],\"threadGroupSize\":[1,1,1],\"maxIteration\":1,\"defines\":[{\"name\":\"MAX_EDGE_PER_VERTEX\",\"type\":\"Float\",\"runtime\":true},{\"name\":\"VERTEX_COUNT\",\"type\":\"Float\",\"runtime\":true},{\"name\":\"SHIFT_20\",\"type\":\"Float\",\"value\":1048576,\"runtime\":false}],\"uniforms\":[{\"name\":\"u_Data\",\"type\":\"vec4[]\",\"storageClass\":\"StorageBuffer\",\"readonly\":false,\"writeonly\":false,\"size\":[1,1]},{\"name\":\"u_damping\",\"type\":\"Float\",\"storageClass\":\"Uniform\",\"readonly\":true,\"writeonly\":false,\"size\":[1,1]},{\"name\":\"u_maxSpeed\",\"type\":\"Float\",\"storageClass\":\"Uniform\",\"readonly\":true,\"writeonly\":false,\"size\":[1,1]},{\"name\":\"u_minMovement\",\"type\":\"Float\",\"storageClass\":\"Uniform\",\"readonly\":true,\"writeonly\":false,\"size\":[1,1]},{\"name\":\"u_AveMovement\",\"type\":\"vec4[]\",\"storageClass\":\"StorageBuffer\",\"readonly\":true,\"writeonly\":false,\"size\":[1,1]},{\"name\":\"u_coulombDisScale\",\"type\":\"Float\",\"storageClass\":\"Uniform\",\"readonly\":true,\"writeonly\":false,\"size\":[1,1]},{\"name\":\"u_factor\",\"type\":\"Float\",\"storageClass\":\"Uniform\",\"readonly\":true,\"writeonly\":false,\"size\":[1,1]},{\"name\":\"u_NodeAttributeArray1\",\"type\":\"vec4[]\",\"storageClass\":\"StorageBuffer\",\"readonly\":true,\"writeonly\":false,\"size\":[1,1]},{\"name\":\"u_NodeAttributeArray2\",\"type\":\"vec4[]\",\"storageClass\":\"StorageBuffer\",\"readonly\":true,\"writeonly\":false,\"size\":[1,1]},{\"name\":\"u_interval\",\"type\":\"Float\",\"storageClass\":\"Uniform\",\"readonly\":true,\"writeonly\":false,\"size\":[1,1]}],\"globalDeclarations\":[],\"output\":{\"name\":\"u_Data\",\"size\":[1,1],\"length\":1},\"needPingpong\":true}}`;\nconst aveMovementCode = `\nconst VERTEX_COUNT;\n@numthreads(1, 1, 1)\nclass CalcAveMovement {\n @in\n u_Data: vec4[];\n @in\n u_iter: float;\n @in @out\n u_AveMovement: vec4[];\n @main\n compute() {\n let movement = 0;\n for (let j: int = 0; j < VERTEX_COUNT; j++) {\n const vertex = this.u_Data[j];\n movement += vertex[3];\n }\n movement = movement / float(VERTEX_COUNT);\n this.u_AveMovement[0] = [movement, 0, 0, 0];\n }\n}\n`;\nconst aveMovementBundle = `{\"shaders\":{\"WGSL\":\"import \\\\\"GLSL.std.450\\\\\" as std;\\\\n\\\\n\\\\n# var gWebGPUDebug : bool = false;\\\\n# var gWebGPUDebugOutput : vec4 = vec4(0.0);\\\\n\\\\n[[builtin global_invocation_id]] var globalInvocationID : vec3;\\\\n# [[builtin work_group_size]] var workGroupSize : vec3;\\\\n# [[builtin work_group_id]] var workGroupID : vec3;\\\\n[[builtin local_invocation_id]] var localInvocationID : vec3;\\\\n# [[builtin num_work_groups]] var numWorkGroups : vec3;\\\\n[[builtin local_invocation_idx]] var localInvocationIndex : u32;\\\\n\\\\ntype GWebGPUParams = [[block]] struct {\\\\n [[offset 0]] u_iter : f32;\\\\n};\\\\n[[binding 0, set 0]] var gWebGPUUniformParams : GWebGPUParams;\\\\ntype GWebGPUBuffer0 = [[block]] struct {\\\\n [[offset 0]] u_Data : [[stride 16]] array>;\\\\n};\\\\n[[binding 1, set 0]] var gWebGPUBuffer0 : GWebGPUBuffer0;\\\\ntype GWebGPUBuffer1 = [[block]] struct {\\\\n [[offset 0]] u_AveMovement : [[stride 16]] array>;\\\\n};\\\\n[[binding 2, set 0]] var gWebGPUBuffer1 : GWebGPUBuffer1;\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\nfn main() -> void {var movement : f32 = 0.0;\\\\nfor (var j : i32 = 0; j < __DefineValuePlaceholder__VERTEX_COUNT; j = j + 1) {var vertex : vec4 = gWebGPUBuffer0.u_Data[j];\\\\nmovement = movement + vertex.w;}\\\\nmovement = movement / f32(__DefineValuePlaceholder__VERTEX_COUNT);\\\\ngWebGPUBuffer1.u_AveMovement[0] = vec4(movement, 0.0, 0.0, 0.0);\\\\nreturn;}\\\\n\\\\nentry_point compute as \\\\\"main\\\\\" = main;\\\\n\",\"GLSL450\":\"\\\\n\\\\n\\\\nbool gWebGPUDebug = false;\\\\nvec4 gWebGPUDebugOutput = vec4(0.0);\\\\n\\\\nivec3 globalInvocationID = ivec3(gl_GlobalInvocationID);\\\\nivec3 workGroupSize = ivec3(1,1,1);\\\\nivec3 workGroupID = ivec3(gl_WorkGroupID);\\\\nivec3 localInvocationID = ivec3(gl_LocalInvocationID);\\\\nivec3 numWorkGroups = ivec3(gl_NumWorkGroups);\\\\nint localInvocationIndex = int(gl_LocalInvocationIndex);\\\\n\\\\nlayout(std140, set = 0, binding = 0) uniform GWebGPUParams {\\\\n float u_iter;\\\\n} gWebGPUUniformParams;\\\\nlayout(std430, set = 0, binding = 1) buffer readonly GWebGPUBuffer0 {\\\\n vec4 u_Data[];\\\\n} gWebGPUBuffer0;\\\\n\\\\nlayout(std430, set = 0, binding = 2) buffer GWebGPUBuffer1 {\\\\n vec4 u_AveMovement[];\\\\n} gWebGPUBuffer1;\\\\n\\\\n\\\\n\\\\n#define VERTEX_COUNT __DefineValuePlaceholder__VERTEX_COUNT\\\\nlayout (\\\\n local_size_x = 1,\\\\n local_size_y = 1,\\\\n local_size_z = 1\\\\n) in;\\\\n\\\\n\\\\n\\\\nvoid main() {float movement = 0.0;\\\\nfor (int j = 0; j < VERTEX_COUNT; j++) {vec4 vertex = gWebGPUBuffer0.u_Data[j];\\\\nmovement += vertex.w;}\\\\nmovement = movement / float(VERTEX_COUNT);\\\\ngWebGPUBuffer1.u_AveMovement[0] = vec4(movement, 0.0, 0.0, 0.0);}\\\\n\",\"GLSL100\":\"\\\\n\\\\nfloat epsilon = 0.00001;\\\\nvec2 addrTranslation_1Dto2D(float address1D, vec2 texSize) {\\\\n vec2 conv_const = vec2(1.0 / texSize.x, 1.0 / (texSize.x * texSize.y));\\\\n vec2 normAddr2D = float(address1D) * conv_const;\\\\n return vec2(fract(normAddr2D.x + epsilon), normAddr2D.y);\\\\n}\\\\n\\\\nvoid barrier() {}\\\\n \\\\n\\\\nuniform vec2 u_OutputTextureSize;\\\\nuniform int u_OutputTexelCount;\\\\nvarying vec2 v_TexCoord;\\\\n\\\\nbool gWebGPUDebug = false;\\\\nvec4 gWebGPUDebugOutput = vec4(0.0);\\\\n\\\\n#define VERTEX_COUNT __DefineValuePlaceholder__VERTEX_COUNT\\\\n\\\\nuniform sampler2D u_Data;\\\\nuniform vec2 u_DataSize;\\\\nvec4 getDatau_Data(vec2 address2D) {\\\\n return vec4(texture2D(u_Data, address2D).rgba);\\\\n}\\\\nvec4 getDatau_Data(float address1D) {\\\\n return getDatau_Data(addrTranslation_1Dto2D(address1D, u_DataSize));\\\\n}\\\\nvec4 getDatau_Data(int address1D) {\\\\n return getDatau_Data(float(address1D));\\\\n}\\\\nuniform float u_iter;\\\\nuniform sampler2D u_AveMovement;\\\\nuniform vec2 u_AveMovementSize;\\\\nvec4 getDatau_AveMovement(vec2 address2D) {\\\\n return vec4(texture2D(u_AveMovement, address2D).rgba);\\\\n}\\\\nvec4 getDatau_AveMovement(float address1D) {\\\\n return getDatau_AveMovement(addrTranslation_1Dto2D(address1D, u_AveMovementSize));\\\\n}\\\\nvec4 getDatau_AveMovement(int address1D) {\\\\n return getDatau_AveMovement(float(address1D));\\\\n}\\\\nvoid main() {\\\\nivec3 workGroupSize = ivec3(1, 1, 1);\\\\nivec3 numWorkGroups = ivec3(1, 1, 1); \\\\nint globalInvocationIndex = int(floor(v_TexCoord.x * u_OutputTextureSize.x))\\\\n + int(floor(v_TexCoord.y * u_OutputTextureSize.y)) * int(u_OutputTextureSize.x);\\\\nint workGroupIDLength = globalInvocationIndex / (workGroupSize.x * workGroupSize.y * workGroupSize.z);\\\\nivec3 workGroupID = ivec3(workGroupIDLength / numWorkGroups.y / numWorkGroups.z, workGroupIDLength / numWorkGroups.x / numWorkGroups.z, workGroupIDLength / numWorkGroups.x / numWorkGroups.y);\\\\nint localInvocationIDZ = globalInvocationIndex / (workGroupSize.x * workGroupSize.y);\\\\nint localInvocationIDY = (globalInvocationIndex - localInvocationIDZ * workGroupSize.x * workGroupSize.y) / workGroupSize.x;\\\\nint localInvocationIDX = globalInvocationIndex - localInvocationIDZ * workGroupSize.x * workGroupSize.y - localInvocationIDY * workGroupSize.x;\\\\nivec3 localInvocationID = ivec3(localInvocationIDX, localInvocationIDY, localInvocationIDZ);\\\\nivec3 globalInvocationID = workGroupID * workGroupSize + localInvocationID;\\\\nint localInvocationIndex = localInvocationID.z * workGroupSize.x * workGroupSize.y\\\\n + localInvocationID.y * workGroupSize.x + localInvocationID.x;\\\\nfloat movement = 0.0;\\\\nfor (int j = 0; j < VERTEX_COUNT; j++) {vec4 vertex = getDatau_Data(j);\\\\nmovement += vertex.w;}\\\\nmovement = movement / float(VERTEX_COUNT);\\\\ngl_FragColor = vec4(vec4(movement, 0.0, 0.0, 0.0));if (gWebGPUDebug) {\\\\n gl_FragColor = gWebGPUDebugOutput;\\\\n}}\\\\n\"},\"context\":{\"name\":\"\",\"dispatch\":[1,1,1],\"threadGroupSize\":[1,1,1],\"maxIteration\":1,\"defines\":[{\"name\":\"VERTEX_COUNT\",\"type\":\"Float\",\"runtime\":true}],\"uniforms\":[{\"name\":\"u_Data\",\"type\":\"vec4[]\",\"storageClass\":\"StorageBuffer\",\"readonly\":true,\"writeonly\":false,\"size\":[1,1]},{\"name\":\"u_iter\",\"type\":\"Float\",\"storageClass\":\"Uniform\",\"readonly\":true,\"writeonly\":false,\"size\":[1,1]},{\"name\":\"u_AveMovement\",\"type\":\"vec4[]\",\"storageClass\":\"StorageBuffer\",\"readonly\":false,\"writeonly\":false,\"size\":[1,1]}],\"globalDeclarations\":[],\"output\":{\"name\":\"u_AveMovement\",\"size\":[1,1],\"length\":1},\"needPingpong\":true}}`;\n//# sourceMappingURL=gForceShader.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/layout/es/layout/gpu/gForce.js\n// @ts-nocheck\n/**\n * @fileOverview fruchterman layout\n * @author shiwu.wyy@antfin.com\n */\nvar gForce_awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\n\n\n// @ts-ignore\n\n\n\n\n\n/**\n * graphin 中的 force 布局\n */\nclass gForce_GForceGPULayout extends Base {\n constructor(options) {\n super();\n /** 停止迭代的最大迭代数 */\n this.maxIteration = 1000;\n /** 弹簧引力系数 */\n this.edgeStrength = 200;\n /** 斥力系数 */\n this.nodeStrength = 1000;\n /** 库伦系数 */\n this.coulombDisScale = 0.005;\n /** 阻尼系数 */\n this.damping = 0.9;\n /** 最大速度 */\n this.maxSpeed = 1000;\n /** 一次迭代的平均移动距离小于该值时停止迭代 */\n this.minMovement = 0.5;\n /** 迭代中衰减 */\n this.interval = 0.02;\n /** 斥力的一个系数 */\n this.factor = 1;\n /** 理想边长 */\n this.linkDistance = 1;\n /** 重力大小 */\n this.gravity = 10;\n /** 是否启用web worker。前提是在web worker里执行布局,否则无效\t*/\n this.workerEnabled = false;\n this.nodes = [];\n this.edges = [];\n this.width = 300;\n this.height = 300;\n this.nodeMap = {};\n this.nodeIdxMap = {};\n this.updateCfg(options);\n }\n getDefaultCfg() {\n return {\n maxIteration: 2000,\n gravity: 10,\n clustering: false,\n clusterGravity: 10\n };\n }\n /**\n * 执行布局\n */\n execute() {\n return gForce_awaiter(this, void 0, void 0, function* () {\n const self = this;\n const nodes = self.nodes;\n if (!nodes || nodes.length === 0) {\n if (self.onLayoutEnd)\n self.onLayoutEnd();\n return;\n }\n if (!self.width && typeof window !== \"undefined\") {\n self.width = window.innerWidth;\n }\n if (!self.height && typeof window !== \"undefined\") {\n self.height = window.innerHeight;\n }\n if (!self.center) {\n self.center = [self.width / 2, self.height / 2];\n }\n const center = self.center;\n if (nodes.length === 1) {\n nodes[0].x = center[0];\n nodes[0].y = center[1];\n if (self.onLayoutEnd)\n self.onLayoutEnd();\n return;\n }\n const nodeMap = {};\n const nodeIdxMap = {};\n nodes.forEach((node, i) => {\n if (!isNumber(node.x))\n node.x = Math.random() * self.width;\n if (!isNumber(node.y))\n node.y = Math.random() * self.height;\n nodeMap[node.id] = node;\n nodeIdxMap[node.id] = i;\n });\n self.nodeMap = nodeMap;\n self.nodeIdxMap = nodeIdxMap;\n self.nodeStrength = gpu_proccessToFunc(self.nodeStrength, 1);\n self.edgeStrength = gpu_proccessToFunc(self.edgeStrength, 1);\n // layout\n yield self.run();\n });\n }\n executeWithWorker(canvas, ctx) {\n const self = this;\n const nodes = self.nodes;\n const center = self.center;\n if (!nodes || nodes.length === 0) {\n return;\n }\n if (nodes.length === 1) {\n nodes[0].x = center[0];\n nodes[0].y = center[1];\n return;\n }\n const nodeMap = {};\n const nodeIdxMap = {};\n nodes.forEach((node, i) => {\n if (!isNumber(node.x))\n node.x = Math.random() * self.width;\n if (!isNumber(node.y))\n node.y = Math.random() * self.height;\n nodeMap[node.id] = node;\n nodeIdxMap[node.id] = i;\n });\n self.nodeMap = nodeMap;\n self.nodeIdxMap = nodeIdxMap;\n self.nodeStrength = gpu_proccessToFunc(self.nodeStrength, 1);\n self.edgeStrength = gpu_proccessToFunc(self.edgeStrength, 1);\n // layout\n self.run(canvas, ctx);\n }\n run(canvas, ctx) {\n return gForce_awaiter(this, void 0, void 0, function* () {\n const self = this;\n const nodes = self.nodes;\n const edges = self.edges;\n const maxIteration = self.maxIteration;\n if (!self.width && typeof window !== \"undefined\") {\n self.width = window.innerWidth;\n }\n if (!self.height && typeof window !== \"undefined\") {\n self.height = window.innerHeight;\n }\n const numParticles = nodes.length;\n self.linkDistance = gpu_proccessToFunc(self.linkDistance);\n self.edgeStrength = gpu_proccessToFunc(self.edgeStrength);\n const { maxEdgePerVetex, array: nodesEdgesArray } = buildTextureDataWithTwoEdgeAttr(nodes, edges, self.linkDistance, self.edgeStrength);\n // init degree for mass\n self.degrees = math_getDegree(nodes.length, self.nodeIdxMap, edges);\n const masses = [];\n const nodeStrengths = [];\n const centerXs = [];\n const centerYs = [];\n const centerGravities = [];\n const fxs = [];\n const fys = [];\n if (!self.getMass) {\n self.getMass = (d) => {\n return self.degrees[self.nodeIdxMap[d.id]] || 1;\n };\n }\n const gravity = self.gravity;\n const center = self.center;\n nodes.forEach((node, i) => {\n masses.push(self.getMass(node));\n nodeStrengths.push(self.nodeStrength(node));\n if (!self.degrees[i])\n self.degrees[i] = 0;\n let nodeGravity = [center[0], center[1], gravity];\n if (self.getCenter) {\n const customCenter = self.getCenter(node, self.degrees[i]);\n if (customCenter &&\n isNumber(customCenter[0]) &&\n isNumber(customCenter[1]) &&\n isNumber(customCenter[2])) {\n nodeGravity = customCenter;\n }\n }\n centerXs.push(nodeGravity[0]);\n centerYs.push(nodeGravity[1]);\n centerGravities.push(nodeGravity[2]);\n if (isNumber(node.fx) && isNumber(node.fy)) {\n fxs.push(node.fx || 0.001);\n fys.push(node.fy || 0.001);\n }\n else {\n fxs.push(0);\n fys.push(0);\n }\n });\n // 每个节点的额外属性占两个数组各一格,nodeAttributeArray1 中是:mass, degree, nodeSterngth, 0\n const nodeAttributeArray1 = arrayToTextureData([\n masses,\n self.degrees,\n nodeStrengths,\n fxs\n ]);\n // nodeAttributeArray2 中是:centerX, centerY, gravity, 0,\n const nodeAttributeArray2 = arrayToTextureData([\n centerXs,\n centerYs,\n centerGravities,\n fys\n ]);\n const workerEnabled = self.workerEnabled;\n let world;\n if (workerEnabled) {\n world = World_World.create({\n canvas,\n engineOptions: {\n supportCompute: true\n }\n });\n }\n else {\n world = World_World.create({\n engineOptions: {\n supportCompute: true\n }\n });\n }\n // TODO: 最终的预编译代码放入到 gForceShader.ts 中直接引入,不再需要下面三行\n // const compiler = new Compiler();\n // const gForceBundle = compiler.compileBundle(gForceCode);\n // console.log(gForceBundle.toString());\n const onLayoutEnd = self.onLayoutEnd;\n const initPreviousData = [];\n nodesEdgesArray.forEach((value) => {\n initPreviousData.push(value);\n });\n for (let i = 0; i < 4; i++) {\n initPreviousData.push(0);\n }\n const kernelGForce = world\n .createKernel(gForceBundle)\n .setDispatch([numParticles, 1, 1])\n .setBinding({\n u_Data: nodesEdgesArray,\n u_damping: self.damping,\n u_maxSpeed: self.maxSpeed,\n u_minMovement: self.minMovement,\n u_coulombDisScale: self.coulombDisScale,\n u_factor: self.factor,\n u_NodeAttributeArray1: nodeAttributeArray1,\n u_NodeAttributeArray2: nodeAttributeArray2,\n MAX_EDGE_PER_VERTEX: maxEdgePerVetex,\n VERTEX_COUNT: numParticles,\n u_AveMovement: initPreviousData,\n u_interval: self.interval // 每次迭代更新,首次设置为 interval,在 onIterationCompleted 中更新\n });\n // const aveMovementBundle = compiler.compileBundle(aveMovementCode);\n // console.log(aveMovementBundle.toString());\n const kernelAveMovement = world\n .createKernel(aveMovementBundle)\n .setDispatch([1, 1, 1])\n .setBinding({\n u_Data: nodesEdgesArray,\n VERTEX_COUNT: numParticles,\n u_AveMovement: [0, 0, 0, 0]\n });\n // 执行迭代\n // let midRes = nodesEdgesArray;\n const execute = () => gForce_awaiter(this, void 0, void 0, function* () {\n for (let i = 0; i < maxIteration; i++) {\n // TODO: 似乎都来自 kernelGForce 是一个引用\n // 当前坐标作为下一次迭代的 PreviousData\n // if (i > 0) {\n // kernelAveMovement.setBinding({\n // u_PreviousData: kernelGForce\n // });\n // }\n // eslint-disable-next-line no-await-in-loop\n yield kernelGForce.execute();\n // midRes = await kernelGForce.getOutput();\n // 每次迭代完成后\n // 计算平均位移,用于提前终止迭代\n kernelAveMovement.setBinding({\n u_Data: kernelGForce\n });\n // eslint-disable-next-line no-await-in-loop\n yield kernelAveMovement.execute();\n // 更新衰减函数\n const stepInterval = Math.max(0.02, self.interval - i * 0.002);\n kernelGForce.setBinding({\n u_interval: stepInterval,\n u_AveMovement: kernelAveMovement\n });\n }\n const finalParticleData = yield kernelGForce.getOutput();\n // 所有迭代完成后\n if (canvas) {\n // 传递数据给主线程\n ctx.postMessage({\n type: LAYOUT_MESSAGE.GPUEND,\n vertexEdgeData: finalParticleData\n // edgeIndexBufferData,\n });\n }\n else {\n nodes.forEach((node, i) => {\n const x = finalParticleData[4 * i];\n const y = finalParticleData[4 * i + 1];\n node.x = x;\n node.y = y;\n });\n }\n if (onLayoutEnd)\n onLayoutEnd();\n });\n yield execute();\n });\n }\n getType() {\n return \"gForce-gpu\";\n }\n}\n//# sourceMappingURL=gForce.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/layout/es/layout/comboForce.js\n/**\n * @fileOverview Combo force layout\n * @author shiwu.wyy@antfin.com\n */\n\n\n/**\n * force layout for graph with combos\n */\nclass comboForce_ComboForceLayout extends Base {\n constructor(options) {\n super();\n /** 布局中心 */\n this.center = [0, 0];\n /** 停止迭代的最大迭代数 */\n this.maxIteration = 100;\n /** 重力大小,影响图的紧凑程度 */\n this.gravity = 10;\n /** 群组中心力大小 */\n this.comboGravity = 10;\n /** 默认边长度 */\n this.linkDistance = 10;\n /** 每次迭代位移的衰减相关参数 */\n this.alpha = 1;\n this.alphaMin = 0.001;\n this.alphaDecay = 1 - Math.pow(this.alphaMin, (1 / 300));\n this.alphaTarget = 0;\n /** 节点运动速度衰减参数 */\n this.velocityDecay = 0.6;\n /** 边引力大小 */\n this.edgeStrength = 0.6;\n /** 节点引力大小 */\n this.nodeStrength = 30;\n /** 是否开启防止重叠 */\n this.preventOverlap = false;\n /** 是否开启节点之间的防止重叠 */\n this.preventNodeOverlap = false;\n /** 是否开启 Combo 之间的防止重叠 */\n this.preventComboOverlap = false;\n /** 防止重叠的碰撞力大小 */\n this.collideStrength = undefined;\n /** 防止重叠的碰撞力大小 */\n this.nodeCollideStrength = 0.5;\n /** 防止重叠的碰撞力大小 */\n this.comboCollideStrength = 0.5;\n /** Combo 最小间距,防止重叠时的间隙 */\n this.comboSpacing = 20;\n /** Combo 内部的 padding */\n this.comboPadding = 10;\n /** 优化计算斥力的速度,两节点间距超过 optimizeRangeFactor * width 则不再计算斥力和重叠斥力 */\n this.optimizeRangeFactor = 1;\n /** 每次迭代的回调函数 */\n this.onTick = () => { };\n /** 迭代结束的回调函数 */\n this.onLayoutEnd = () => { };\n /** 根据边两端节点层级差距的调整引力系数的因子,取值范围 [0, 1]。层级差距越大,引力越小 */\n this.depthAttractiveForceScale = 1;\n /** 根据边两端节点层级差距的调整斥力系数的因子,取值范围 [1, Infinity]。层级差距越大,斥力越大 */\n this.depthRepulsiveForceScale = 2;\n /** 内部计算参数 */\n this.nodes = [];\n this.edges = [];\n this.combos = [];\n this.comboTrees = [];\n this.width = 300;\n this.height = 300;\n this.bias = [];\n this.nodeMap = {};\n this.oriComboMap = {};\n this.indexMap = {};\n this.comboMap = {};\n this.previousLayouted = false;\n this.updateCfg(options);\n }\n getDefaultCfg() {\n return {\n maxIteration: 100,\n center: [0, 0],\n gravity: 10,\n speed: 1,\n comboGravity: 30,\n preventOverlap: false,\n preventComboOverlap: true,\n preventNodeOverlap: true,\n nodeSpacing: undefined,\n collideStrength: undefined,\n nodeCollideStrength: 0.5,\n comboCollideStrength: 0.5,\n comboSpacing: 20,\n comboPadding: 10,\n edgeStrength: 0.6,\n nodeStrength: 30,\n linkDistance: 10\n };\n }\n /**\n * 执行布局\n */\n execute() {\n const self = this;\n const nodes = self.nodes;\n const center = self.center;\n self.comboTree = {\n id: \"comboTreeRoot\",\n depth: -1,\n children: self.comboTrees\n };\n if (!nodes || nodes.length === 0) {\n if (self.onLayoutEnd)\n self.onLayoutEnd();\n return;\n }\n if (nodes.length === 1) {\n nodes[0].x = center[0];\n nodes[0].y = center[1];\n if (self.onLayoutEnd)\n self.onLayoutEnd();\n return;\n }\n self.initVals();\n // layout\n self.run();\n if (self.onLayoutEnd)\n self.onLayoutEnd();\n }\n run() {\n const self = this;\n const nodes = self.nodes;\n const maxIteration = self.previousLayouted\n ? self.maxIteration / 5\n : self.maxIteration;\n if (!self.width && typeof window !== \"undefined\") {\n self.width = window.innerWidth;\n }\n if (!self.height && typeof window !== \"undefined\") {\n self.height = window.innerHeight;\n }\n const center = self.center;\n const velocityDecay = self.velocityDecay;\n // init the positions to make the nodes with same combo gather around the combo\n const comboMap = self.comboMap;\n if (!self.previousLayouted)\n self.initPos(comboMap);\n // iterate\n for (let i = 0; i < maxIteration; i++) {\n const displacements = [];\n nodes.forEach((_, j) => {\n displacements[j] = { x: 0, y: 0 };\n });\n self.applyCalculate(displacements);\n // gravity for combos\n self.applyComboCenterForce(displacements);\n // move\n nodes.forEach((n, j) => {\n if (!isNumber(n.x) || !isNumber(n.y))\n return;\n n.x += displacements[j].x * velocityDecay;\n n.y += displacements[j].y * velocityDecay;\n });\n self.alpha += (self.alphaTarget - self.alpha) * self.alphaDecay;\n self.onTick();\n }\n // move to center\n const meanCenter = [0, 0];\n nodes.forEach((n) => {\n if (!isNumber(n.x) || !isNumber(n.y))\n return;\n meanCenter[0] += n.x;\n meanCenter[1] += n.y;\n });\n meanCenter[0] /= nodes.length;\n meanCenter[1] /= nodes.length;\n const centerOffset = [center[0] - meanCenter[0], center[1] - meanCenter[1]];\n nodes.forEach((n, j) => {\n if (!isNumber(n.x) || !isNumber(n.y))\n return;\n n.x += centerOffset[0];\n n.y += centerOffset[1];\n });\n // arrange the empty combo\n self.combos.forEach((combo) => {\n const mapped = comboMap[combo.id];\n if (mapped && mapped.empty) {\n combo.x = mapped.cx || combo.x;\n combo.y = mapped.cy || combo.y;\n }\n });\n self.previousLayouted = true;\n }\n initVals() {\n const self = this;\n const edges = self.edges;\n const nodes = self.nodes;\n const combos = self.combos;\n const count = {};\n const nodeMap = {};\n const indexMap = {};\n nodes.forEach((node, i) => {\n nodeMap[node.id] = node;\n indexMap[node.id] = i;\n });\n self.nodeMap = nodeMap;\n self.indexMap = indexMap;\n const oriComboMap = {};\n combos.forEach((combo) => {\n oriComboMap[combo.id] = combo;\n });\n self.oriComboMap = oriComboMap;\n self.comboMap = self.getComboMap();\n const preventOverlap = self.preventOverlap;\n self.preventComboOverlap = self.preventComboOverlap || preventOverlap;\n self.preventNodeOverlap = self.preventNodeOverlap || preventOverlap;\n const collideStrength = self.collideStrength;\n if (collideStrength) {\n self.comboCollideStrength = collideStrength;\n self.nodeCollideStrength = collideStrength;\n }\n self.comboCollideStrength = self.comboCollideStrength\n ? self.comboCollideStrength\n : 0;\n self.nodeCollideStrength = self.nodeCollideStrength\n ? self.nodeCollideStrength\n : 0;\n // get edge bias\n for (let i = 0; i < edges.length; ++i) {\n const source = getEdgeTerminal(edges[i], 'source');\n const target = getEdgeTerminal(edges[i], 'target');\n if (count[source])\n count[source]++;\n else\n count[source] = 1;\n if (count[target])\n count[target]++;\n else\n count[target] = 1;\n }\n const bias = [];\n for (let i = 0; i < edges.length; ++i) {\n const source = getEdgeTerminal(edges[i], 'source');\n const target = getEdgeTerminal(edges[i], 'target');\n bias[i] = count[source] / (count[source] + count[target]);\n }\n this.bias = bias;\n const nodeSize = self.nodeSize;\n const nodeSpacing = self.nodeSpacing;\n let nodeSizeFunc;\n let nodeSpacingFunc;\n // nodeSpacing to function\n if (isNumber(nodeSpacing)) {\n nodeSpacingFunc = () => nodeSpacing;\n }\n else if (isFunction(nodeSpacing)) {\n nodeSpacingFunc = nodeSpacing;\n }\n else {\n nodeSpacingFunc = () => 0;\n }\n this.nodeSpacing = nodeSpacingFunc;\n // nodeSize to function\n if (!nodeSize) {\n nodeSizeFunc = (d) => {\n if (d.size) {\n if (isArray(d.size)) {\n const res = d.size[0] > d.size[1] ? d.size[0] : d.size[1];\n return res / 2;\n }\n if (isObject(d.size)) {\n const res = d.size.width > d.size.height ? d.size.width : d.size.height;\n return res / 2;\n }\n return d.size / 2;\n }\n return 10;\n };\n }\n else if (isFunction(nodeSize)) {\n nodeSizeFunc = (d) => {\n return nodeSize(d);\n };\n }\n else if (isArray(nodeSize)) {\n const larger = nodeSize[0] > nodeSize[1] ? nodeSize[0] : nodeSize[1];\n const radius = larger / 2;\n nodeSizeFunc = (d) => radius;\n }\n else {\n // number type\n const radius = nodeSize / 2;\n nodeSizeFunc = (d) => radius;\n }\n this.nodeSize = nodeSizeFunc;\n // comboSpacing to function\n const comboSpacing = self.comboSpacing;\n let comboSpacingFunc;\n if (isNumber(comboSpacing)) {\n comboSpacingFunc = () => comboSpacing;\n }\n else if (isFunction(comboSpacing)) {\n comboSpacingFunc = comboSpacing;\n }\n else {\n // null type\n comboSpacingFunc = () => 0;\n }\n this.comboSpacing = comboSpacingFunc;\n // comboPadding to function\n const comboPadding = self.comboPadding;\n let comboPaddingFunc;\n if (isNumber(comboPadding)) {\n comboPaddingFunc = () => comboPadding;\n }\n else if (isArray(comboPadding)) {\n comboPaddingFunc = () => Math.max.apply(null, comboPadding);\n }\n else if (isFunction(comboPadding)) {\n comboPaddingFunc = comboPadding;\n }\n else {\n // null type\n comboPaddingFunc = () => 0;\n }\n this.comboPadding = comboPaddingFunc;\n // linkDistance to function\n let linkDistance = this.linkDistance;\n let linkDistanceFunc;\n if (!linkDistance) {\n linkDistance = 10;\n }\n if (isNumber(linkDistance)) {\n linkDistanceFunc = (d) => {\n return linkDistance;\n };\n }\n else {\n linkDistanceFunc = linkDistance;\n }\n this.linkDistance = linkDistanceFunc;\n // linkStrength to function\n let edgeStrength = this.edgeStrength;\n let edgeStrengthFunc;\n if (!edgeStrength) {\n edgeStrength = 1;\n }\n if (isNumber(edgeStrength)) {\n edgeStrengthFunc = (d) => {\n return edgeStrength;\n };\n }\n else {\n edgeStrengthFunc = edgeStrength;\n }\n this.edgeStrength = edgeStrengthFunc;\n // nodeStrength to function\n let nodeStrength = this.nodeStrength;\n let nodeStrengthFunc;\n if (!nodeStrength) {\n nodeStrength = 30;\n }\n if (isNumber(nodeStrength)) {\n nodeStrengthFunc = (d) => {\n return nodeStrength;\n };\n }\n else {\n nodeStrengthFunc = nodeStrength;\n }\n this.nodeStrength = nodeStrengthFunc;\n }\n initPos(comboMap) {\n const self = this;\n const nodes = self.nodes;\n nodes.forEach((node, i) => {\n const comboId = node.comboId;\n const combo = comboMap[comboId];\n if (comboId && combo) {\n node.x = combo.cx + 100 / (i + 1);\n node.y = combo.cy + 100 / (i + 1);\n }\n else {\n node.x = 100 / (i + 1);\n node.y = 100 / (i + 1);\n }\n });\n }\n getComboMap() {\n const self = this;\n const nodeMap = self.nodeMap;\n const indexMap = self.indexMap;\n const comboTrees = self.comboTrees;\n const oriComboMap = self.oriComboMap;\n const comboMap = {};\n (comboTrees || []).forEach((ctree) => {\n const treeChildren = [];\n math_traverseTreeUp(ctree, (treeNode) => {\n if (treeNode.itemType === \"node\")\n return true; // skip it\n if (!oriComboMap[treeNode.id])\n return true; // means it is hidden, skip it\n if (comboMap[treeNode.id] === undefined) {\n const combo = {\n id: treeNode.id,\n name: treeNode.id,\n cx: 0,\n cy: 0,\n count: 0,\n depth: self.oriComboMap[treeNode.id].depth || 0,\n children: []\n };\n comboMap[treeNode.id] = combo;\n }\n const children = treeNode.children;\n if (children) {\n children.forEach((child) => {\n if (!comboMap[child.id] && !nodeMap[child.id])\n return true; // means it is hidden\n treeChildren.push(child);\n });\n }\n const c = comboMap[treeNode.id];\n c.cx = 0;\n c.cy = 0;\n // In order to layout the empty combo, add a virtual node to it\n if (treeChildren.length === 0) {\n c.empty = true;\n const oriCombo = oriComboMap[treeNode.id];\n const idx = Object.keys(nodeMap).length;\n const virtualNodeId = `${treeNode.id}-visual-child-${idx}`;\n const vnode = {\n id: virtualNodeId,\n x: oriCombo.x,\n y: oriCombo.y,\n depth: c.depth + 1,\n itemType: \"node\"\n };\n self.nodes.push(vnode);\n nodeMap[virtualNodeId] = vnode;\n indexMap[virtualNodeId] = idx;\n c.cx = oriCombo.x;\n c.cy = oriCombo.y;\n treeChildren.push(vnode);\n }\n treeChildren.forEach((child) => {\n c.count++;\n if (child.itemType !== \"node\") {\n const childCombo = comboMap[child.id];\n if (isNumber(childCombo.cx))\n c.cx += childCombo.cx;\n if (isNumber(childCombo.cy))\n c.cy += childCombo.cy;\n return;\n }\n const node = nodeMap[child.id];\n // means the node is hidden, skip it\n if (!node)\n return;\n if (isNumber(node.x)) {\n c.cx += node.x;\n }\n if (isNumber(node.y)) {\n c.cy += node.y;\n }\n });\n c.cx /= c.count;\n c.cy /= c.count;\n c.children = treeChildren;\n return true;\n });\n });\n return comboMap;\n }\n applyComboCenterForce(displacements) {\n const self = this;\n const gravity = self.gravity;\n const comboGravity = self.comboGravity || gravity;\n const alpha = this.alpha;\n const comboTrees = self.comboTrees;\n const indexMap = self.indexMap;\n const nodeMap = self.nodeMap;\n const comboMap = self.comboMap;\n (comboTrees || []).forEach((ctree) => {\n math_traverseTreeUp(ctree, (treeNode) => {\n if (treeNode.itemType === \"node\")\n return true; // skip it\n const combo = comboMap[treeNode.id];\n // means the combo is hidden, skip it\n if (!combo)\n return true;\n const c = comboMap[treeNode.id];\n // higher depth the combo, larger the gravity\n const gravityScale = ((c.depth + 1) / 10) * 0.5;\n // apply combo center force for all the descend nodes in this combo\n // and update the center position and count for this combo\n const comboX = c.cx;\n const comboY = c.cy;\n c.cx = 0;\n c.cy = 0;\n c.children.forEach((child) => {\n if (child.itemType !== \"node\") {\n const childCombo = comboMap[child.id];\n if (childCombo && isNumber(childCombo.cx))\n c.cx += childCombo.cx;\n if (childCombo && isNumber(childCombo.cy))\n c.cy += childCombo.cy;\n return;\n }\n const node = nodeMap[child.id];\n const vecX = (node.x - comboX) || 0.005;\n const vecY = (node.y - comboY) || 0.005;\n const l = Math.sqrt(vecX * vecX + vecY * vecY);\n const childIdx = indexMap[node.id];\n const params = ((comboGravity * alpha) / l) * gravityScale;\n displacements[childIdx].x -= vecX * params;\n displacements[childIdx].y -= vecY * params;\n if (isNumber(node.x))\n c.cx += node.x;\n if (isNumber(node.y))\n c.cy += node.y;\n });\n c.cx /= c.count;\n c.cy /= c.count;\n return true;\n });\n });\n }\n applyCalculate(displacements) {\n const self = this;\n const comboMap = self.comboMap;\n const nodes = self.nodes;\n // store the vx, vy, and distance to reduce dulplicate calculation\n const vecMap = {};\n nodes.forEach((v, i) => {\n nodes.forEach((u, j) => {\n if (i < j)\n return;\n const vx = (v.x - u.x) || 0.005;\n const vy = (v.y - u.y) || 0.005;\n let vl2 = vx * vx + vy * vy;\n const vl = Math.sqrt(vl2);\n if (vl2 < 1)\n vl2 = vl;\n vecMap[`${v.id}-${u.id}`] = { vx, vy, vl2, vl };\n vecMap[`${u.id}-${v.id}`] = { vl2, vl, vx: -vx, vy: -vy };\n });\n });\n // get the sizes of the combos\n self.updateComboSizes(comboMap);\n self.calRepulsive(displacements, vecMap);\n self.calAttractive(displacements, vecMap);\n const preventComboOverlap = self.preventComboOverlap;\n if (preventComboOverlap)\n self.comboNonOverlapping(displacements, comboMap);\n }\n /**\n * Update the sizes of the combos according to their children\n * Used for combos nonoverlap, but not re-render the combo shapes\n */\n updateComboSizes(comboMap) {\n const self = this;\n const comboTrees = self.comboTrees;\n const nodeMap = self.nodeMap;\n const nodeSize = self.nodeSize;\n const comboSpacing = self.comboSpacing;\n const comboPadding = self.comboPadding;\n (comboTrees || []).forEach((ctree) => {\n const treeChildren = [];\n math_traverseTreeUp(ctree, (treeNode) => {\n if (treeNode.itemType === \"node\")\n return true; // skip it\n const c = comboMap[treeNode.id];\n // means the combo is hidden, skip it\n if (!c)\n return false;\n const children = treeNode.children;\n if (children) {\n children.forEach((child) => {\n // means the combo is hidden.\n if (!comboMap[child.id] && !nodeMap[child.id])\n return;\n treeChildren.push(child);\n });\n }\n c.minX = Infinity;\n c.minY = Infinity;\n c.maxX = -Infinity;\n c.maxY = -Infinity;\n treeChildren.forEach((child) => {\n if (child.itemType !== \"node\")\n return true; // skip it\n const node = nodeMap[child.id];\n if (!node)\n return true; // means it is hidden\n const r = nodeSize(node);\n const nodeMinX = node.x - r;\n const nodeMinY = node.y - r;\n const nodeMaxX = node.x + r;\n const nodeMaxY = node.y + r;\n if (c.minX > nodeMinX)\n c.minX = nodeMinX;\n if (c.minY > nodeMinY)\n c.minY = nodeMinY;\n if (c.maxX < nodeMaxX)\n c.maxX = nodeMaxX;\n if (c.maxY < nodeMaxY)\n c.maxY = nodeMaxY;\n });\n let minSize = self.oriComboMap[treeNode.id].size || 10;\n if (isArray(minSize))\n minSize = minSize[0];\n const maxLength = Math.max(c.maxX - c.minX, c.maxY - c.minY, minSize);\n c.r = maxLength / 2 + comboSpacing(c) / 2 + comboPadding(c);\n return true;\n });\n });\n }\n /**\n * prevent the overlappings among combos\n */\n comboNonOverlapping(displacements, comboMap) {\n const self = this;\n const comboTree = self.comboTree;\n const comboCollideStrength = self.comboCollideStrength;\n const indexMap = self.indexMap;\n const nodeMap = self.nodeMap;\n math_traverseTreeUp(comboTree, (treeNode) => {\n if (!comboMap[treeNode.id] &&\n !nodeMap[treeNode.id] &&\n treeNode.id !== \"comboTreeRoot\") {\n return false;\n } // means it is hidden\n const children = treeNode.children;\n // 同个子树下的子 combo 间两两对比\n if (children && children.length > 1) {\n children.forEach((v, i) => {\n if (v.itemType === \"node\")\n return false; // skip it\n const cv = comboMap[v.id];\n if (!cv)\n return; // means it is hidden, skip it\n children.forEach((u, j) => {\n if (i <= j)\n return false;\n if (u.itemType === \"node\")\n return false; // skip it\n const cu = comboMap[u.id];\n if (!cu)\n return false; // means it is hidden, skip it\n const vx = (cv.cx - cu.cx) || 0.005;\n const vy = (cv.cy - cu.cy) || 0.005;\n const l = vx * vx + vy * vy;\n const rv = cv.r || 1;\n const ru = cu.r || 1;\n const r = rv + ru;\n const ru2 = ru * ru;\n const rv2 = rv * rv;\n // overlapping\n if (l < r * r) {\n const vnodes = v.children;\n if (!vnodes || vnodes.length === 0)\n return false; // skip it\n const unodes = u.children;\n if (!unodes || unodes.length === 0)\n return false; // skip it\n const sqrtl = Math.sqrt(l);\n const ll = ((r - sqrtl) / sqrtl) * comboCollideStrength;\n const xl = vx * ll;\n const yl = vy * ll;\n const rratio = ru2 / (rv2 + ru2);\n const irratio = 1 - rratio;\n // 两兄弟 combo 的子节点上施加斥力\n vnodes.forEach((vn) => {\n if (vn.itemType !== \"node\")\n return false; // skip it\n if (!nodeMap[vn.id])\n return; // means it is hidden, skip it\n const vindex = indexMap[vn.id];\n unodes.forEach((un) => {\n if (un.itemType !== \"node\")\n return false;\n if (!nodeMap[un.id])\n return false; // means it is hidden, skip it\n const uindex = indexMap[un.id];\n displacements[vindex].x += xl * rratio;\n displacements[vindex].y += yl * rratio;\n displacements[uindex].x -= xl * irratio;\n displacements[uindex].y -= yl * irratio;\n });\n });\n }\n });\n });\n }\n return true;\n });\n }\n /**\n * Calculate the repulsive force between each node pair\n * @param displacements The array stores the displacements for nodes\n * @param vecMap The map stores vector between each node pair\n */\n calRepulsive(displacements, vecMap) {\n const self = this;\n const nodes = self.nodes;\n const max = self.width * self.optimizeRangeFactor;\n const nodeStrength = self.nodeStrength;\n const alpha = self.alpha;\n const nodeCollideStrength = self.nodeCollideStrength;\n const preventNodeOverlap = self.preventNodeOverlap;\n const nodeSizeFunc = self.nodeSize;\n const nodeSpacingFunc = self.nodeSpacing;\n const scale = self.depthRepulsiveForceScale;\n const center = self.center;\n nodes.forEach((v, i) => {\n if (!v.x || !v.y)\n return;\n // center gravity\n if (center) {\n const gravity = self.gravity;\n const vecX = (v.x - center[0]) || 0.005;\n const vecY = (v.y - center[1]) || 0.005;\n const l = Math.sqrt(vecX * vecX + vecY * vecY);\n displacements[i].x -= (vecX * gravity * alpha) / l;\n displacements[i].y -= (vecY * gravity * alpha) / l;\n }\n nodes.forEach((u, j) => {\n if (i === j) {\n return;\n }\n if (!u.x || !u.y)\n return;\n const { vl2, vl } = vecMap[`${v.id}-${u.id}`];\n if (vl > max)\n return;\n const { vx, vy } = vecMap[`${v.id}-${u.id}`];\n let depthDiff = Math.log(Math.abs(u.depth - v.depth) / 10) + 1 || 1;\n depthDiff = depthDiff < 1 ? 1 : depthDiff;\n if (u.comboId !== v.comboId)\n depthDiff += 1;\n const depthParam = depthDiff ? Math.pow(scale, depthDiff) : 1;\n const params = ((nodeStrength(u) * alpha) / vl2) * depthParam;\n displacements[i].x += vx * params;\n displacements[i].y += vy * params;\n // prevent node overlappings\n if (i < j && preventNodeOverlap) {\n const ri = (nodeSizeFunc(v) + nodeSpacingFunc(v)) || 1;\n const rj = (nodeSizeFunc(u) + nodeSpacingFunc(u)) || 1;\n const r = ri + rj;\n if (vl2 < r * r) {\n const ll = ((r - vl) / vl) * nodeCollideStrength;\n const rj2 = rj * rj;\n let rratio = rj2 / (ri * ri + rj2);\n const xl = vx * ll;\n const yl = vy * ll;\n displacements[i].x += xl * rratio;\n displacements[i].y += yl * rratio;\n rratio = 1 - rratio;\n displacements[j].x -= xl * rratio;\n displacements[j].y -= yl * rratio;\n }\n }\n });\n });\n }\n /**\n * Calculate the attractive force between the node pair with edge\n * @param displacements The array stores the displacements for nodes\n * @param vecMap The map stores vector between each node pair\n */\n calAttractive(displacements, vecMap) {\n const self = this;\n const edges = self.edges;\n const linkDistance = self.linkDistance;\n const alpha = self.alpha;\n const edgeStrength = self.edgeStrength;\n const bias = self.bias;\n const scale = self.depthAttractiveForceScale;\n edges.forEach((e, i) => {\n const source = getEdgeTerminal(e, 'source');\n const target = getEdgeTerminal(e, 'target');\n if (!source || !target || source === target)\n return;\n const uIndex = self.indexMap[source];\n const vIndex = self.indexMap[target];\n const u = self.nodeMap[source];\n const v = self.nodeMap[target];\n if (!u || !v)\n return;\n let depthDiff = u.depth === v.depth ? 0 : Math.log(Math.abs(u.depth - v.depth) / 10);\n if (u.comboId === v.comboId) {\n depthDiff = depthDiff / 2;\n }\n let depthParam = depthDiff ? Math.pow(scale, depthDiff) : 1;\n if (u.comboId !== v.comboId && depthParam === 1) {\n depthParam = scale / 2;\n }\n else if (u.comboId === v.comboId) {\n depthParam = 2;\n }\n if (!isNumber(v.x) || !isNumber(u.x) || !isNumber(v.y) || !isNumber(u.y)) {\n return;\n }\n const { vl, vx, vy } = vecMap[`${target}-${source}`];\n const l = ((vl - linkDistance(e)) / vl) * alpha * edgeStrength(e) * depthParam;\n const vecX = vx * l;\n const vecY = vy * l;\n const b = bias[i];\n displacements[vIndex].x -= vecX * b;\n displacements[vIndex].y -= vecY * b;\n displacements[uIndex].x += vecX * (1 - b);\n displacements[uIndex].y += vecY * (1 - b);\n });\n }\n getType() {\n return \"comboForce\";\n }\n}\n//# sourceMappingURL=comboForce.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/layout/es/layout/forceAtlas2/body.js\n// represents a body(a point mass) and its position\nclass Body {\n constructor(params) {\n /**\n * the id of this body, the same with the node id\n * @type {number}\n */\n this.id = params.id || 0;\n /**\n * the position of this body\n * @type {number}\n */\n this.rx = params.rx;\n /**\n * the position of this body\n * @type {number}\n */\n this.ry = params.ry;\n /**\n * the force acting on this body\n * @type {number}\n */\n this.fx = 0;\n /**\n * the force acting on this body\n * @type {number}\n */\n this.fy = 0;\n /**\n * the mass of this body, =1 for a node\n * @type {number}\n */\n this.mass = params.mass;\n /**\n * the degree of the node represented by this body\n * @type {number}\n */\n this.degree = params.degree;\n /**\n * the parameter for repulsive force, = kr\n * @type {number}\n */\n this.g = params.g || 0;\n }\n // returns the euclidean distance\n distanceTo(bo) {\n const dx = this.rx - bo.rx;\n const dy = this.ry - bo.ry;\n return Math.hypot(dx, dy);\n }\n setPos(x, y) {\n this.rx = x;\n this.ry = y;\n }\n // resets the forces\n resetForce() {\n this.fx = 0;\n this.fy = 0;\n }\n addForce(b) {\n const dx = b.rx - this.rx;\n const dy = b.ry - this.ry;\n let dist = Math.hypot(dx, dy);\n dist = dist < 0.0001 ? 0.0001 : dist;\n // the repulsive defined by force atlas 2\n const F = (this.g * (this.degree + 1) * (b.degree + 1)) / dist;\n this.fx += F * dx / dist;\n this.fy += F * dy / dist;\n }\n // if quad contains this body\n in(quad) {\n return quad.contains(this.rx, this.ry);\n }\n // returns a new body\n add(bo) {\n const nenwMass = this.mass + bo.mass;\n const x = (this.rx * this.mass + bo.rx * bo.mass) / nenwMass;\n const y = (this.ry * this.mass + bo.ry * bo.mass) / nenwMass;\n const dg = this.degree + bo.degree;\n const params = {\n rx: x,\n ry: y,\n mass: nenwMass,\n degree: dg\n };\n return new Body(params);\n }\n}\n//# sourceMappingURL=body.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/layout/es/layout/forceAtlas2/quad.js\nclass Quad {\n constructor(params) {\n /**\n * the center position of this quad\n * @type {number}\n */\n this.xmid = params.xmid;\n /**\n * the center position of this quad\n * @type {number}\n */\n this.ymid = params.ymid;\n /**\n * the length of this quad\n * @type {number}\n */\n this.length = params.length;\n /**\n * the mass center of this quad\n * @type {number}\n */\n this.massCenter = params.massCenter || [0, 0];\n /**\n * the mass of this quad\n * @type {number}\n */\n this.mass = params.mass || 1;\n }\n getLength() {\n return this.length;\n }\n contains(x, y) {\n const halfLen = this.length / 2;\n return (x <= this.xmid + halfLen &&\n x >= this.xmid - halfLen &&\n y <= this.ymid + halfLen &&\n y >= this.ymid - halfLen);\n }\n // northwest quadrant\n // tslint:disable-next-line\n NW() {\n const x = this.xmid - this.length / 4;\n const y = this.ymid + this.length / 4;\n const len = this.length / 2;\n const params = {\n xmid: x,\n ymid: y,\n length: len\n };\n const NW = new Quad(params);\n return NW;\n }\n // northeast\n // tslint:disable-next-line\n NE() {\n const x = this.xmid + this.length / 4;\n const y = this.ymid + this.length / 4;\n const len = this.length / 2;\n const params = {\n xmid: x,\n ymid: y,\n length: len\n };\n const NE = new Quad(params);\n return NE;\n }\n // southwest\n // tslint:disable-next-line\n SW() {\n const x = this.xmid - this.length / 4;\n const y = this.ymid - this.length / 4;\n const len = this.length / 2;\n const params = {\n xmid: x,\n ymid: y,\n length: len\n };\n const SW = new Quad(params);\n return SW;\n }\n // southeast\n // tslint:disable-next-line\n SE() {\n const x = this.xmid + this.length / 4;\n const y = this.ymid - this.length / 4;\n const len = this.length / 2;\n const params = {\n xmid: x,\n ymid: y,\n length: len\n };\n const SE = new Quad(params);\n return SE;\n }\n}\n//# sourceMappingURL=quad.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/layout/es/layout/forceAtlas2/quadTree.js\n/**\n * @fileOverview quadTree\n * @author shiwu.wyy@antfin.com\n */\nclass QuadTree {\n // each quadtree represents a quadrant and an aggregate body\n // that represents all bodies inside the quadrant\n constructor(param) {\n /**\n * (aggregated) body in this quad\n * @type {object}\n */\n this.body = null;\n /**\n * tree representing the northwest quadrant\n * @type {object}\n */\n this.quad = null;\n this.NW = null;\n this.NE = null;\n this.SW = null;\n this.SE = null;\n /**\n * threshold\n * @type {number}\n */\n this.theta = 0.5;\n if (param != null)\n this.quad = param;\n }\n // insert a body(node) into the tree\n insert(bo) {\n // if this node does not contain a body, put the new body bo here\n if (this.body == null) {\n this.body = bo;\n return;\n }\n // internal node\n if (!this._isExternal()) {\n // update mass info\n this.body = this.body.add(bo);\n // insert body into quadrant\n this._putBody(bo);\n }\n else { // external node\n // divide this region into four children\n if (this.quad) {\n this.NW = new QuadTree(this.quad.NW());\n this.NE = new QuadTree(this.quad.NE());\n this.SW = new QuadTree(this.quad.SW());\n this.SE = new QuadTree(this.quad.SE());\n }\n // insert this body and bo\n this._putBody(this.body);\n this._putBody(bo);\n // update the mass info\n this.body = this.body.add(bo);\n }\n }\n // inserts bo into a quad\n // tslint:disable-next-line\n _putBody(bo) {\n if (!this.quad)\n return;\n if (bo.in(this.quad.NW()) && this.NW)\n this.NW.insert(bo);\n else if (bo.in(this.quad.NE()) && this.NE)\n this.NE.insert(bo);\n else if (bo.in(this.quad.SW()) && this.SW)\n this.SW.insert(bo);\n else if (bo.in(this.quad.SE()) && this.SE)\n this.SE.insert(bo);\n }\n // tslint:disable-next-line\n _isExternal() {\n // four children are null\n return (this.NW == null && this.NE == null && this.SW == null && this.SE == null);\n }\n // update the forces\n updateForce(bo) {\n if (this.body == null || bo === this.body) {\n return;\n }\n // if the current node is external\n if (this._isExternal())\n bo.addForce(this.body);\n // internal nodes\n else {\n const s = this.quad ? this.quad.getLength() : 0;\n const d = this.body.distanceTo(bo);\n // b is far enough\n if ((s / d) < this.theta)\n bo.addForce(this.body);\n else {\n this.NW && this.NW.updateForce(bo);\n this.NE && this.NE.updateForce(bo);\n this.SW && this.SW.updateForce(bo);\n this.SE && this.SE.updateForce(bo);\n }\n }\n }\n}\n//# sourceMappingURL=quadTree.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/layout/es/layout/forceAtlas2/index.js\n\n\n\n\n\nclass forceAtlas2_ForceAtlas2Layout extends Base {\n constructor(options) {\n super();\n /** 布局中心 */\n this.center = [0, 0];\n /** 宽度 */\n this.width = 300;\n /** 高度 */\n this.height = 300;\n this.nodes = [];\n this.edges = [];\n /**\n * the parameter for repulsive forces,\n * it will scale the layout but won't change the layout\n * larger the kr, looser the layout\n * @type {number}\n */\n this.kr = 5;\n /**\n * the parameter for gravity forces\n * @type {number}\n */\n this.kg = 1;\n /**\n * modes:\n * 'normal' for normal using\n * 'linlog' for compact clusters.\n * @type {string}\n */\n this.mode = 'normal';\n /**\n * whether preventing the node overlapping\n * @type {boolean}\n */\n this.preventOverlap = false;\n /**\n * whether active the dissuade hub mode\n * true: grant authorities (nodes with a high indegree)\n * a more central position than hubs (nodes with a high outdegree)\n * @type {boolean}\n */\n this.dissuadeHubs = false;\n /**\n * whether active the barnes hut optimization on computing repulsive forces\n * @type {boolean}\n */\n this.barnesHut = undefined;\n /**\n * the max iteration number\n * @type {number}\n */\n this.maxIteration = 0;\n /**\n * control the global velocity\n * defualt: 0.1(gephi)\n * @type {number}\n */\n this.ks = 0.1;\n /**\n * the max global velocity\n * @type {number}\n */\n this.ksmax = 10;\n /**\n * the tolerance for the global swinging\n * @type {number}\n */\n this.tao = 0.1;\n /**\n * the function of layout complete listener, display the legend and minimap after layout\n * @type {function}\n */\n this.onLayoutEnd = () => { };\n /**\n * activate prune or not.\n * prune the leaves during most iterations, layout the leaves in the last 50 iteraitons.\n * if prune === '', it will be activated when the nodes number > 100\n * note that it will reduce the quality of the layout\n * @type {boolean}\n */\n this.prune = undefined;\n this.updateCfg(options);\n }\n getDefaultCfg() {\n return {};\n }\n // execute the layout\n execute() {\n const self = this;\n const { nodes, onLayoutEnd, prune, } = self;\n let maxIteration = self.maxIteration;\n if (!self.width && typeof window !== \"undefined\") {\n self.width = window.innerWidth;\n }\n if (!self.height && typeof window !== \"undefined\") {\n self.height = window.innerHeight;\n }\n // the whidth of each nodes\n const sizes = [];\n const nodeNum = nodes.length;\n for (let i = 0; i < nodeNum; i += 1) {\n const node = nodes[i];\n let nodeWidth = 10;\n let nodeHeight = 10;\n if (isNumber(node.size)) {\n nodeWidth = node.size;\n nodeHeight = node.size;\n }\n if (isArray(node.size)) {\n if (!isNaN(node.size[0]))\n nodeWidth = node.size[0];\n if (!isNaN(node.size[1]))\n nodeHeight = node.size[1];\n }\n else if (isObject(node.size)) {\n nodeWidth = node.size.width;\n nodeHeight = node.size.height;\n }\n if (self.getWidth && !isNaN(self.getWidth(node)))\n nodeHeight = self.getWidth(node);\n if (self.getHeight && !isNaN(self.getHeight(node)))\n nodeWidth = self.getHeight(node);\n const maxSize = Math.max(nodeWidth, nodeHeight);\n sizes.push(maxSize);\n }\n if (self.barnesHut === undefined && nodeNum > 250)\n self.barnesHut = true;\n if (self.prune === undefined && nodeNum > 100)\n self.prune = true;\n if (this.maxIteration === 0 && !self.prune) {\n maxIteration = 250;\n if (nodeNum <= 200 && nodeNum > 100)\n maxIteration = 1000;\n else if (nodeNum > 200)\n maxIteration = 1200;\n this.maxIteration = maxIteration;\n }\n else if (this.maxIteration === 0 && prune) {\n maxIteration = 100;\n if (nodeNum <= 200 && nodeNum > 100)\n maxIteration = 500;\n else if (nodeNum > 200)\n maxIteration = 950;\n this.maxIteration = maxIteration;\n }\n if (!self.kr) {\n self.kr = 50;\n if (nodeNum > 100 && nodeNum <= 500)\n self.kr = 20;\n else if (nodeNum > 500)\n self.kr = 1;\n }\n if (!self.kg) {\n self.kg = 20;\n if (nodeNum > 100 && nodeNum <= 500)\n self.kg = 10;\n else if (nodeNum > 500)\n self.kg = 1;\n }\n this.nodes = self.updateNodesByForces(sizes);\n onLayoutEnd();\n }\n updateNodesByForces(sizes) {\n const self = this;\n const { edges, maxIteration } = self;\n let nodes = self.nodes;\n const nonLoopEdges = edges.filter((edge) => {\n const source = getEdgeTerminal(edge, 'source');\n const target = getEdgeTerminal(edge, 'target');\n return source !== target;\n });\n const size = nodes.length;\n const esize = nonLoopEdges.length;\n const degrees = [];\n const idMap = {};\n const edgeEndsIdMap = {};\n // tslint:disable-next-line\n const Es = [];\n for (let i = 0; i < size; i += 1) {\n idMap[nodes[i].id] = i;\n degrees[i] = 0;\n if (nodes[i].x === undefined || isNaN(nodes[i].x)) {\n nodes[i].x = Math.random() * 1000;\n }\n if (nodes[i].y === undefined || isNaN(nodes[i].y)) {\n nodes[i].y = Math.random() * 1000;\n }\n Es.push({ x: nodes[i].x, y: nodes[i].y });\n }\n for (let i = 0; i < esize; i += 1) {\n let node1;\n let node2;\n let sIdx = 0;\n let tIdx = 0;\n for (let j = 0; j < size; j += 1) {\n const source = getEdgeTerminal(nonLoopEdges[i], 'source');\n const target = getEdgeTerminal(nonLoopEdges[i], 'target');\n if (nodes[j].id === source) {\n node1 = nodes[j];\n sIdx = j;\n }\n else if (nodes[j].id === target) {\n node2 = nodes[j];\n tIdx = j;\n }\n edgeEndsIdMap[i] = { sourceIdx: sIdx, targetIdx: tIdx };\n }\n if (node1)\n degrees[idMap[node1.id]] += 1;\n if (node2)\n degrees[idMap[node2.id]] += 1;\n }\n let iteration = maxIteration;\n nodes = this.iterate(iteration, idMap, edgeEndsIdMap, esize, degrees, sizes);\n // if prune, place the leaves around their parents, and then re-layout for several iterations.\n if (self.prune) {\n for (let j = 0; j < esize; j += 1) {\n if (degrees[edgeEndsIdMap[j].sourceIdx] <= 1) {\n nodes[edgeEndsIdMap[j].sourceIdx].x = nodes[edgeEndsIdMap[j].targetIdx].x;\n nodes[edgeEndsIdMap[j].sourceIdx].y = nodes[edgeEndsIdMap[j].targetIdx].y;\n }\n else if (degrees[edgeEndsIdMap[j].targetIdx] <= 1) {\n nodes[edgeEndsIdMap[j].targetIdx].x = nodes[edgeEndsIdMap[j].sourceIdx].x;\n nodes[edgeEndsIdMap[j].targetIdx].y = nodes[edgeEndsIdMap[j].sourceIdx].y;\n }\n }\n self.prune = false;\n self.barnesHut = false;\n iteration = 100;\n nodes = this.iterate(iteration, idMap, edgeEndsIdMap, esize, degrees, sizes);\n }\n return nodes;\n }\n iterate(iteration, idMap, edgeEndsIdMap, esize, degrees, sizes) {\n const self = this;\n let { nodes } = self;\n const { kr, preventOverlap } = self;\n const { barnesHut } = self;\n const nodeNum = nodes.length;\n let sg = 0;\n const krPrime = 100;\n let iter = iteration;\n const prevoIter = 50;\n let forces = [];\n const preForces = [];\n const bodies = [];\n for (let i = 0; i < nodeNum; i += 1) {\n forces[2 * i] = 0;\n forces[2 * i + 1] = 0;\n if (barnesHut) {\n const params = {\n id: i,\n rx: nodes[i].x,\n ry: nodes[i].y,\n mass: 1,\n g: kr,\n degree: degrees[i]\n };\n bodies[i] = new Body(params);\n }\n }\n while (iter > 0) {\n for (let i = 0; i < nodeNum; i += 1) {\n preForces[2 * i] = forces[2 * i];\n preForces[2 * i + 1] = forces[2 * i + 1];\n forces[2 * i] = 0;\n forces[2 * i + 1] = 0;\n }\n // attractive forces, existing on every actual edge\n forces = this.getAttrForces(iter, prevoIter, esize, idMap, edgeEndsIdMap, degrees, sizes, forces);\n // repulsive forces and Gravity, existing on every node pair\n // if preventOverlap, using the no-optimized method in the last prevoIter instead.\n if (barnesHut && ((preventOverlap && iter > prevoIter) || !preventOverlap)) {\n forces = this.getOptRepGraForces(forces, bodies, degrees);\n }\n else {\n forces = this.getRepGraForces(iter, prevoIter, forces, krPrime, sizes, degrees);\n }\n // update the positions\n const res = this.updatePos(forces, preForces, sg, degrees);\n nodes = res.nodes;\n sg = res.sg;\n iter--;\n if (self.tick)\n self.tick();\n }\n return nodes;\n }\n getAttrForces(iter, prevoIter, esize, idMap, edgeEndsIdMap, degrees, sizes, forces) {\n const self = this;\n const { nodes, preventOverlap, dissuadeHubs, mode, prune } = self;\n for (let i = 0; i < esize; i += 1) {\n const sourceNode = nodes[edgeEndsIdMap[i].sourceIdx];\n const sourceIdx = edgeEndsIdMap[i].sourceIdx;\n const targetNode = nodes[edgeEndsIdMap[i].targetIdx];\n const targetIdx = edgeEndsIdMap[i].targetIdx;\n if (prune && (degrees[sourceIdx] <= 1 || degrees[targetIdx] <= 1))\n continue;\n const dir = [targetNode.x - sourceNode.x, targetNode.y - sourceNode.y];\n let eucliDis = Math.hypot(dir[0], dir[1]);\n eucliDis = eucliDis < 0.0001 ? 0.0001 : eucliDis;\n dir[0] = dir[0] / eucliDis;\n dir[1] = dir[1] / eucliDis;\n if (preventOverlap && iter < prevoIter)\n eucliDis = eucliDis - sizes[sourceIdx] - sizes[targetIdx];\n let Fa1 = eucliDis; // tslint:disable-line\n let Fa2 = Fa1; // tslint:disable-line\n if (mode === 'linlog') {\n Fa1 = Math.log(1 + eucliDis);\n Fa2 = Fa1;\n }\n if (dissuadeHubs) {\n Fa1 = eucliDis / degrees[sourceIdx];\n Fa2 = eucliDis / degrees[targetIdx];\n }\n if (preventOverlap && iter < prevoIter && eucliDis <= 0) {\n Fa1 = 0;\n Fa2 = 0;\n }\n else if (preventOverlap && iter < prevoIter && eucliDis > 0) {\n Fa1 = eucliDis;\n Fa2 = eucliDis;\n }\n forces[2 * idMap[sourceNode.id]] += Fa1 * dir[0];\n forces[2 * idMap[targetNode.id]] -= Fa2 * dir[0];\n forces[2 * idMap[sourceNode.id] + 1] += Fa1 * dir[1];\n forces[2 * idMap[targetNode.id] + 1] -= Fa2 * dir[1];\n }\n return forces;\n }\n getRepGraForces(iter, prevoIter, forces, krPrime, sizes, degrees) {\n const self = this;\n const { nodes, preventOverlap, kr, kg, center, prune } = self;\n const nodeNum = nodes.length;\n for (let i = 0; i < nodeNum; i += 1) {\n for (let j = i + 1; j < nodeNum; j += 1) {\n if (prune && (degrees[i] <= 1 || degrees[j] <= 1))\n continue;\n const dir = [nodes[j].x - nodes[i].x, nodes[j].y - nodes[i].y];\n let eucliDis = Math.hypot(dir[0], dir[1]);\n eucliDis = eucliDis < 0.0001 ? 0.0001 : eucliDis;\n dir[0] = dir[0] / eucliDis;\n dir[1] = dir[1] / eucliDis;\n if (preventOverlap && iter < prevoIter)\n eucliDis = eucliDis - sizes[i] - sizes[j];\n let Fr = kr * (degrees[i] + 1) * (degrees[j] + 1) / eucliDis; // tslint:disable-line\n if (preventOverlap && iter < prevoIter && eucliDis < 0) {\n Fr = krPrime * (degrees[i] + 1) * (degrees[j] + 1);\n }\n else if (preventOverlap && iter < prevoIter && eucliDis === 0) {\n Fr = 0;\n }\n else if (preventOverlap && iter < prevoIter && eucliDis > 0) {\n Fr = kr * (degrees[i] + 1) * (degrees[j] + 1) / eucliDis;\n }\n forces[2 * i] -= Fr * dir[0];\n forces[2 * j] += Fr * dir[0];\n forces[2 * i + 1] -= Fr * dir[1];\n forces[2 * j + 1] += Fr * dir[1];\n }\n // gravity\n const dir = [nodes[i].x - center[0], nodes[i].y - center[1]];\n const eucliDis = Math.hypot(dir[0], dir[1]);\n dir[0] = dir[0] / eucliDis;\n dir[1] = dir[1] / eucliDis;\n const Fg = kg * (degrees[i] + 1); // tslint:disable-line\n forces[2 * i] -= Fg * dir[0];\n forces[2 * i + 1] -= Fg * dir[1];\n }\n return forces;\n }\n getOptRepGraForces(forces, bodies, degrees) {\n const self = this;\n const { nodes, kg, center, prune } = self;\n const nodeNum = nodes.length;\n let minx = 9e10;\n let maxx = -9e10;\n let miny = 9e10;\n let maxy = -9e10;\n for (let i = 0; i < nodeNum; i += 1) {\n if (prune && (degrees[i] <= 1))\n continue;\n bodies[i].setPos(nodes[i].x, nodes[i].y);\n if (nodes[i].x >= maxx)\n maxx = nodes[i].x;\n if (nodes[i].x <= minx)\n minx = nodes[i].x;\n if (nodes[i].y >= maxy)\n maxy = nodes[i].y;\n if (nodes[i].y <= miny)\n miny = nodes[i].y;\n }\n const width = Math.max(maxx - minx, maxy - miny);\n const quadParams = {\n xmid: (maxx + minx) / 2,\n ymid: (maxy + miny) / 2,\n length: width,\n massCenter: center,\n mass: nodeNum\n };\n const quad = new Quad(quadParams);\n const quadTree = new QuadTree(quad);\n // build the tree, insert the nodes(quads) into the tree\n for (let i = 0; i < nodeNum; i += 1) {\n if (prune && (degrees[i] <= 1))\n continue;\n if (bodies[i].in(quad))\n quadTree.insert(bodies[i]);\n }\n // update the repulsive forces and the gravity.\n for (let i = 0; i < nodeNum; i += 1) {\n if (prune && (degrees[i] <= 1))\n continue;\n bodies[i].resetForce();\n quadTree.updateForce(bodies[i]);\n forces[2 * i] -= bodies[i].fx;\n forces[2 * i + 1] -= bodies[i].fy;\n // gravity\n const dir = [nodes[i].x - center[0], nodes[i].y - center[1]];\n let eucliDis = Math.hypot(dir[0], dir[1]);\n eucliDis = eucliDis < 0.0001 ? 0.0001 : eucliDis;\n dir[0] = dir[0] / eucliDis;\n dir[1] = dir[1] / eucliDis;\n const Fg = kg * (degrees[i] + 1); // tslint:disable-line\n forces[2 * i] -= Fg * dir[0];\n forces[2 * i + 1] -= Fg * dir[1];\n }\n return forces;\n }\n updatePos(forces, preForces, sg, degrees) {\n const self = this;\n const { nodes, ks, tao, prune, ksmax } = self;\n const nodeNum = nodes.length;\n const swgns = [];\n const trans = [];\n // swg(G) and tra(G)\n let swgG = 0;\n let traG = 0;\n for (let i = 0; i < nodeNum; i += 1) {\n if (prune && (degrees[i] <= 1))\n continue;\n const minus = [forces[2 * i] - preForces[2 * i],\n forces[2 * i + 1] - preForces[2 * i + 1]\n ];\n const minusNorm = Math.hypot(minus[0], minus[1]);\n const add = [forces[2 * i] + preForces[2 * i],\n forces[2 * i + 1] + preForces[2 * i + 1]\n ];\n const addNorm = Math.hypot(add[0], add[1]);\n swgns[i] = minusNorm;\n trans[i] = addNorm / 2;\n swgG += (degrees[i] + 1) * swgns[i];\n traG += (degrees[i] + 1) * trans[i];\n }\n const preSG = sg;\n sg = tao * traG / swgG; // tslint:disable-line\n if (preSG !== 0) {\n sg = sg > (1.5 * preSG) ? (1.5 * preSG) : sg; // tslint:disable-line\n }\n // update the node positions\n for (let i = 0; i < nodeNum; i += 1) {\n if (prune && (degrees[i] <= 1))\n continue;\n let sn = ks * sg / (1 + sg * Math.sqrt(swgns[i]));\n let absForce = Math.hypot(forces[2 * i], forces[2 * i + 1]);\n absForce = absForce < 0.0001 ? 0.0001 : absForce;\n const max = ksmax / absForce;\n sn = sn > max ? max : sn;\n const dnx = sn * forces[2 * i];\n const dny = sn * forces[2 * i + 1];\n nodes[i].x += dnx;\n nodes[i].y += dny;\n }\n return { nodes, sg };\n }\n}\n//# sourceMappingURL=index.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/layout/es/layout/layout.js\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nclass layout_Layout {\n constructor(options) {\n const layoutClass = getLayoutByName(options.type);\n this.layoutInstance = new layoutClass(options);\n }\n layout(data) {\n return this.layoutInstance.layout(data);\n }\n updateCfg(cfg) {\n this.layoutInstance.updateCfg(cfg);\n }\n init(data) {\n this.layoutInstance.init(data);\n }\n execute() {\n this.layoutInstance.execute();\n }\n getDefaultCfg() {\n return this.layoutInstance.getDefaultCfg();\n }\n destroy() {\n return this.layoutInstance.destroy();\n }\n}\n// FIXME\n// FOR G6\n// tslint:disable-next-line\nconst Layouts = {\n force: force_ForceLayout,\n fruchterman: fruchterman_FruchtermanLayout,\n forceAtlas2: forceAtlas2_ForceAtlas2Layout,\n gForce: gForce_GForceLayout,\n dagre: dagre_DagreLayout,\n circular: circular_CircularLayout,\n radial: radial_RadialLayout,\n concentric: concentric_ConcentricLayout,\n grid: grid_GridLayout,\n mds: mds_MDSLayout,\n comboForce: comboForce_ComboForceLayout,\n random: random_RandomLayout,\n 'gForce-gpu': gForce_GForceGPULayout,\n 'fruchterman-gpu': fruchterman_FruchtermanGPULayout,\n};\n//# sourceMappingURL=layout.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/layout/es/layout/types.js\n\n//# sourceMappingURL=types.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/layout/es/layout/index.js\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n// layout\n\n// types file\n\n//# sourceMappingURL=index.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/layout/es/index.js\n\n// register layout\n\n// layout, layout types file, worker\n\n//# sourceMappingURL=index.js.map\n// EXTERNAL MODULE: ./node_modules/@antv/hierarchy/build/hierarchy.js\nvar hierarchy = __webpack_require__(84);\nvar hierarchy_default = /*#__PURE__*/__webpack_require__.n(hierarchy);\n\n// CONCATENATED MODULE: ./node_modules/@antv/g6-pc/es/util/layout.js\n\n\nvar layout_traverseTree = util.traverseTree;\n/**\n * 将 number | Function 类型的参数转换为 return number 的 Function\n * @param {number | Function} value 需要被转换的值\n * @param {number} defaultV 返回函数的默认返回值\n * @return {Function} 转换后的函数\n */\n\nvar layout_proccessToFunc = function proccessToFunc(value, defaultV) {\n var func;\n\n if (!value) {\n func = function func(d) {\n return defaultV || 1;\n };\n } else if (Object(esm[\"isNumber\"])(value)) {\n func = function func(d) {\n return value;\n };\n } else {\n func = value;\n }\n\n return func;\n};\n/**\n * 将节点和边数据转换为 GPU 可读的数组。并返回 maxEdgePerVetex,每个节点上最多的边数\n * @param {NodeConfig[]} nodes 需要被转换的值\n * @param {EdgeConfig[]} edges 返回函数的默认返回值\n * @return {Object} 转换后的数组及 maxEdgePerVetex 组成的对象\n */\n\nvar layout_buildTextureData = function buildTextureData(nodes, edges) {\n var dataArray = [];\n var nodeDict = [];\n var mapIdPos = {};\n var i = 0;\n\n for (i = 0; i < nodes.length; i++) {\n var n = nodes[i];\n mapIdPos[n.id] = i;\n dataArray.push(n.x);\n dataArray.push(n.y);\n dataArray.push(0);\n dataArray.push(0);\n nodeDict.push([]);\n }\n\n for (i = 0; i < edges.length; i++) {\n var e = edges[i];\n nodeDict[mapIdPos[e.source]].push(mapIdPos[e.target]);\n nodeDict[mapIdPos[e.target]].push(mapIdPos[e.source]);\n }\n\n var maxEdgePerVetex = 0;\n\n for (i = 0; i < nodes.length; i++) {\n var offset = dataArray.length;\n var dests = nodeDict[i];\n var len = dests.length;\n dataArray[i * 4 + 2] = offset;\n dataArray[i * 4 + 3] = dests.length;\n maxEdgePerVetex = Math.max(maxEdgePerVetex, dests.length);\n\n for (var j = 0; j < len; ++j) {\n var dest = dests[j];\n dataArray.push(+dest);\n }\n }\n\n while (dataArray.length % 4 !== 0) {\n dataArray.push(0);\n }\n\n return {\n array: new Float32Array(dataArray),\n maxEdgePerVetex: maxEdgePerVetex\n };\n};\n/**\n * 将节点和边数据转换为 GPU 可读的数组,每条边带有一个属性。并返回 maxEdgePerVetex,每个节点上最多的边数\n * @param {NodeConfig[]} nodes 节点数组\n * @param {EdgeConfig[]} edges 边数组\n * @param {Function} attrs 读取边属性的函数\n * @return {Object} 转换后的数组及 maxEdgePerVetex 组成的对象\n */\n\nvar buildTextureDataWithOneEdgeAttr = function buildTextureDataWithOneEdgeAttr(nodes, edges, attrs) {\n var dataArray = [];\n var nodeDict = [];\n var mapIdPos = {};\n var i = 0;\n\n for (i = 0; i < nodes.length; i++) {\n var n = nodes[i];\n mapIdPos[n.id] = i;\n dataArray.push(n.x);\n dataArray.push(n.y);\n dataArray.push(0);\n dataArray.push(0);\n nodeDict.push([]);\n }\n\n for (i = 0; i < edges.length; i++) {\n var e = edges[i];\n nodeDict[mapIdPos[e.source]].push(mapIdPos[e.target]);\n nodeDict[mapIdPos[e.source]].push(attrs(e)); // 理想边长,后续可以改成每条边不同\n\n nodeDict[mapIdPos[e.target]].push(mapIdPos[e.source]);\n nodeDict[mapIdPos[e.target]].push(attrs(e)); // 理想边长,后续可以改成每条边不同\n }\n\n var maxEdgePerVetex = 0;\n\n for (i = 0; i < nodes.length; i++) {\n var offset = dataArray.length;\n var dests = nodeDict[i]; // dest 中节点 id 与边长间隔存储,即一位节点 id,一位边长……\n\n var len = dests.length;\n dataArray[i * 4 + 2] = offset;\n dataArray[i * 4 + 3] = len / 2; // 第四位存储与该节点相关的所有节点个数\n\n maxEdgePerVetex = Math.max(maxEdgePerVetex, len / 2);\n\n for (var j = 0; j < len; ++j) {\n var dest = dests[j];\n dataArray.push(+dest);\n }\n } // 不是 4 的倍数,填充 0\n\n\n while (dataArray.length % 4 !== 0) {\n dataArray.push(0);\n }\n\n return {\n array: new Float32Array(dataArray),\n maxEdgePerVetex: maxEdgePerVetex\n };\n};\n/**\n * 将节点和边数据转换为 GPU 可读的数组,每条边带有一个以上属性。并返回 maxEdgePerVetex,每个节点上最多的边数\n * @param {NodeConfig[]} nodes 节点数组\n * @param {EdgeConfig[]} edges 边数组\n * @param {Function} attrs 读取边属性的函数\n * @return {Object} 转换后的数组及 maxEdgePerVetex 组成的对象\n */\n\nvar layout_buildTextureDataWithTwoEdgeAttr = function buildTextureDataWithTwoEdgeAttr(nodes, edges, attrs1, attrs2) {\n var dataArray = [];\n var nodeDict = [];\n var mapIdPos = {};\n var i = 0;\n\n for (i = 0; i < nodes.length; i++) {\n var n = nodes[i];\n mapIdPos[n.id] = i;\n dataArray.push(n.x);\n dataArray.push(n.y);\n dataArray.push(0);\n dataArray.push(0);\n nodeDict.push([]);\n }\n\n for (i = 0; i < edges.length; i++) {\n var e = edges[i];\n nodeDict[mapIdPos[e.source]].push(mapIdPos[e.target]);\n nodeDict[mapIdPos[e.source]].push(attrs1(e));\n nodeDict[mapIdPos[e.source]].push(attrs2(e));\n nodeDict[mapIdPos[e.source]].push(0);\n nodeDict[mapIdPos[e.target]].push(mapIdPos[e.source]);\n nodeDict[mapIdPos[e.target]].push(attrs1(e));\n nodeDict[mapIdPos[e.target]].push(attrs2(e));\n nodeDict[mapIdPos[e.target]].push(0);\n }\n\n var maxEdgePerVetex = 0;\n\n for (i = 0; i < nodes.length; i++) {\n var offset = dataArray.length;\n var dests = nodeDict[i]; // dest 中节点 id 与边长间隔存储,即一位节点 id,一位边长……\n\n var len = dests.length; // dataArray[i * 4 + 2] = offset;\n // dataArray[i * 4 + 3] = len / 4; // 第四位存储与该节点相关的所有节点个数\n // pack offset & length into float32: offset 20bit, length 12bit\n\n dataArray[i * 4 + 2] = offset + 1048576 * len / 4;\n dataArray[i * 4 + 3] = 0; // 第四位存储与上一次的距离差值\n\n maxEdgePerVetex = Math.max(maxEdgePerVetex, len / 4);\n\n for (var j = 0; j < len; ++j) {\n var dest = dests[j];\n dataArray.push(+dest);\n }\n } // 不是 4 的倍数,填充 0\n\n\n while (dataArray.length % 4 !== 0) {\n dataArray.push(0);\n }\n\n return {\n array: new Float32Array(dataArray),\n maxEdgePerVetex: maxEdgePerVetex\n };\n};\n/**\n * transform the extended attributes of nodes or edges to a texture array\n * @param {string[]} attributeNames attributes' name to be read from items and put into output array\n * @param {ModelConfig[]} items the items to be read\n * @return {Float32Array} the attributes' value array to be read by GPU\n */\n\nvar layout_attributesToTextureData = function attributesToTextureData(attributeNames, items) {\n var dataArray = [];\n var attributeNum = attributeNames.length;\n var attributteStringMap = {};\n items.forEach(function (item) {\n attributeNames.forEach(function (name, i) {\n if (attributteStringMap[item[name]] === undefined) {\n attributteStringMap[item[name]] = Object.keys(attributteStringMap).length;\n }\n\n dataArray.push(attributteStringMap[item[name]]); // insure each node's attributes take inter number of grids\n\n if (i === attributeNum - 1) {\n while (dataArray.length % 4 !== 0) {\n dataArray.push(0);\n }\n }\n });\n });\n return {\n array: new Float32Array(dataArray),\n count: Object.keys(attributteStringMap).length\n };\n};\n/**\n * transform the number array format of extended attributes of nodes or edges to a texture array\n * @param {string[]} attributeNames attributes' name to be read from items and put into output array\n * @return {Float32Array} the attributes' value array to be read by GPU\n */\n\nvar layout_arrayToTextureData = function arrayToTextureData(valueArrays) {\n var dataArray = [];\n var attributeNum = valueArrays.length;\n var itemNum = valueArrays[0].length;\n\n var _loop_1 = function _loop_1(j) {\n valueArrays.forEach(function (valueArray, i) {\n dataArray.push(valueArray[j]); // insure each node's attributes take inter number of grids\n\n if (i === attributeNum - 1) {\n while (dataArray.length % 4 !== 0) {\n dataArray.push(0);\n }\n }\n });\n };\n\n for (var j = 0; j < itemNum; j++) {\n _loop_1(j);\n }\n\n return new Float32Array(dataArray);\n};\n/**\n *\n * @param data Tree graph data\n * @param layout\n */\n\nvar radialLayout = function radialLayout(data, layout) {\n // 布局方式有 H / V / LR / RL / TB / BT\n var VERTICAL_LAYOUTS = ['V', 'TB', 'BT'];\n var min = {\n x: Infinity,\n y: Infinity\n };\n var max = {\n x: -Infinity,\n y: -Infinity\n }; // 默认布局是垂直布局TB,此时x对应rad,y对应r\n\n var rScale = 'x';\n var radScale = 'y';\n\n if (layout && VERTICAL_LAYOUTS.indexOf(layout) >= 0) {\n // 若是水平布局,y对应rad,x对应r\n radScale = 'x';\n rScale = 'y';\n }\n\n var count = 0;\n layout_traverseTree(data, function (node) {\n count++;\n\n if (node.x > max.x) {\n max.x = node.x;\n }\n\n if (node.x < min.x) {\n min.x = node.x;\n }\n\n if (node.y > max.y) {\n max.y = node.y;\n }\n\n if (node.y < min.y) {\n min.y = node.y;\n }\n\n return true;\n });\n var avgRad = Math.PI * 2 / count;\n var radDiff = max[radScale] - min[radScale];\n\n if (radDiff === 0) {\n return data;\n }\n\n layout_traverseTree(data, function (node) {\n var radial = (node[radScale] - min[radScale]) / radDiff * (Math.PI * 2 - avgRad) + avgRad;\n var r = Math.abs(rScale === 'x' ? node.x - data.x : node.y - data.y);\n node.x = r * Math.cos(radial);\n node.y = r * Math.sin(radial);\n return true;\n });\n return data;\n};\n// CONCATENATED MODULE: ./node_modules/@antv/g6-pc/es/util/gpu.js\n/**\n * 调用 gpuDetector.webgl 判断当前浏览器是否支持 webgl。(支持 gpgpu 的浏览器一定也支持 webgl)\n */\nvar gpuDetector = function gpuDetector() {\n if (typeof window === 'undefined' || typeof document === 'undefined') return {};\n return {\n canvas: !!window.CanvasRenderingContext2D,\n webgl: function () {\n try {\n var canvas = document.createElement('canvas');\n return !!(window.WebGLRenderingContext && (canvas.getContext('webgl') || canvas.getContext('experimental-webgl')));\n } catch (e) {\n return false;\n }\n }(),\n workers: !!window.Worker,\n fileapi: window.File && window.FileReader && window.FileList && window.Blob,\n getWebGLErrorMessage: function getWebGLErrorMessage() {\n var element = document.createElement('div');\n element.id = 'webgl-error-message';\n element.style.fontFamily = 'monospace';\n element.style.fontSize = '13px';\n element.style.fontWeight = 'normal';\n element.style.textAlign = 'center';\n element.style.background = '#fff';\n element.style.color = '#000';\n element.style.padding = '1.5em';\n element.style.width = '400px';\n element.style.margin = '5em auto 0';\n\n if (!this.webgl) {\n element.innerHTML = window.WebGLRenderingContext ? ['Your graphics card does not seem to support WebGL.
', 'Find out how to get it here.'].join('\\n') : ['Your browser does not seem to support WebGL.
', 'Find out how to get it here.'].join('\\n');\n }\n\n return element;\n },\n addGetWebGLMessage: function addGetWebGLMessage(parameters) {\n parameters = parameters || {};\n var parent = parameters.parent !== undefined ? parameters.parent : document.body;\n var id = parameters.id !== undefined ? parameters.id : 'oldie';\n var element = gpuDetector().getWebGLErrorMessage();\n element.id = id;\n parent.appendChild(element);\n }\n };\n};\n// CONCATENATED MODULE: ./node_modules/@antv/g6-pc/es/util/index.js\n\n\n\n\n\n\nvar G6Util = Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, util), util_color_namespaceObject), util_layout_namespaceObject), util_gpu_namespaceObject);\n\n/* harmony default export */ var es_util = (G6Util);\n// CONCATENATED MODULE: ./node_modules/@antv/g6-pc/es/layout/tree-layout.js\n\n\nvar tree_layout_radialLayout = es_util.radialLayout;\n\nvar tree_layout_TreeLayout =\n/** @class */\nfunction () {\n function TreeLayout(cfg) {\n this.type = cfg.type;\n this.radial = cfg.radial;\n this.config = cfg;\n }\n\n TreeLayout.prototype.init = function (data) {\n var _this = this;\n\n this.data = data;\n\n if (this.radial) {\n this.layoutMethod = function (data) {\n var layoutData = hierarchy_default.a[_this.type](data, _this.config);\n\n tree_layout_radialLayout(layoutData);\n return layoutData;\n };\n\n return;\n }\n\n this.layoutMethod = function (data) {\n return hierarchy_default.a[_this.type](data, _this.config);\n };\n };\n\n TreeLayout.prototype.execute = function () {\n return this.layoutMethod(this.data, this.config);\n };\n\n TreeLayout.prototype.layout = function (data) {\n this.init(data);\n return this.execute();\n };\n\n return TreeLayout;\n}();\n\n/* harmony default export */ var tree_layout = (tree_layout_TreeLayout);\n// CONCATENATED MODULE: ./node_modules/@antv/g6-pc/es/layout/index.js\n\n\nregisty_registerLayout('grid', grid_GridLayout);\nregisty_registerLayout('random', random_RandomLayout);\nregisty_registerLayout('force', force_ForceLayout);\nregisty_registerLayout('circular', circular_CircularLayout);\nregisty_registerLayout('dagre', dagre_DagreLayout);\nregisty_registerLayout('radial', radial_RadialLayout);\nregisty_registerLayout('concentric', concentric_ConcentricLayout);\nregisty_registerLayout('mds', mds_MDSLayout);\nregisty_registerLayout('fruchterman', fruchterman_FruchtermanLayout);\nregisty_registerLayout('fruchterman-gpu', fruchterman_FruchtermanGPULayout);\nregisty_registerLayout('gForce', gForce_GForceLayout);\nregisty_registerLayout('gForce-gpu', gForce_GForceGPULayout);\nregisty_registerLayout('comboForce', comboForce_ComboForceLayout);\nregisty_registerLayout('forceAtlas2', forceAtlas2_ForceAtlas2Layout);\n\nvar layout_registerLayout = function registerLayout(name, layoutOverride) {\n layoutOverride.isCustomLayout = true;\n Layouts[name] = registy_registerLayout(name, layoutOverride);\n};\n\n\n// CONCATENATED MODULE: ./node_modules/@antv/g6-pc/es/layout/worker/work.js\nvar WebWorker =\n/** @class */\nfunction () {\n function WebWorker(worker, workerScirptURL) {\n var code = worker.toString();\n var blob = new Blob([\"importScripts('\" + workerScirptURL + \"');(\" + code + \")()\"], {\n type: 'text/javascript'\n });\n return new Worker(URL.createObjectURL(blob));\n }\n\n return WebWorker;\n}();\n\n/* harmony default export */ var worker_work = (WebWorker);\n// CONCATENATED MODULE: ./node_modules/@antv/g6-pc/es/layout/worker/layout.worker.js\n\nvar layout_worker_LayoutWorker = function LayoutWorker(workerScriptURL) {\n if (workerScriptURL === void 0) {\n workerScriptURL = 'https://unpkg.com/@antv/layout@latest/dist/layout.min.js';\n }\n\n function workerCode() {\n var LAYOUT_MESSAGE = {\n // run layout\n RUN: 'LAYOUT_RUN',\n // layout ended with success\n END: 'LAYOUT_END',\n // layout error\n ERROR: 'LAYOUT_ERROR',\n // layout tick, used in force directed layout\n TICK: 'LAYOUT_TICK',\n GPURUN: 'GPU_LAYOUT_RUN',\n GPUEND: 'GPU_LAYOUT_END'\n }; // @ts-ignore\n\n layout.registerLayout('grid', layout.GridLayout); // @ts-ignore\n\n layout.registerLayout('random', layout.RandomLayout); // @ts-ignore\n\n layout.registerLayout('force', layout.ForceLayout); // @ts-ignore\n\n layout.registerLayout('circular', layout.CircularLayout); // @ts-ignore\n\n layout.registerLayout('dagre', layout.DagreLayout); // @ts-ignore\n\n layout.registerLayout('radial', layout.RadialLayout); // @ts-ignore\n\n layout.registerLayout('concentric', layout.ConcentricLayout); // @ts-ignore\n\n layout.registerLayout('mds', layout.MDSLayout); // @ts-ignore\n\n layout.registerLayout('fruchterman', layout.FruchtermanLayout); // @ts-ignore\n\n layout.registerLayout('fruchterman-gpu', layout.FruchtermanGPULayout); // @ts-ignore\n\n layout.registerLayout('gForce', layout.GForceLayout); // @ts-ignore\n\n layout.registerLayout('gForce-gpu', layout.GForceGPULayout); // @ts-ignore\n\n layout.registerLayout('comboForce', layout.ComboForceLayout); // @ts-ignore\n\n layout.registerLayout('forceAtlas2', layout.ForceAtlas2Layout);\n\n function isLayoutMessage(event) {\n var type = event.data.type;\n return type === LAYOUT_MESSAGE.RUN || type === LAYOUT_MESSAGE.GPURUN;\n }\n\n function handleLayoutMessage(event) {\n var _this = this;\n\n var type = event.data.type;\n\n switch (type) {\n case LAYOUT_MESSAGE.RUN:\n {\n var _a = event.data,\n nodes_1 = _a.nodes,\n edges = _a.edges,\n _b = _a.layoutCfg,\n layoutCfg = _b === void 0 ? {} : _b;\n var layoutType = layoutCfg.type; // @ts-ignore\n\n var LayoutClass = layout.getLayoutByName(layoutType);\n\n if (!LayoutClass) {\n this.postMessage({\n type: LAYOUT_MESSAGE.ERROR,\n message: \"layout \" + layoutType + \" not found\"\n });\n break;\n }\n\n var layoutMethod_1;\n\n layoutCfg.onLayoutEnd = function () {\n _this.postMessage({\n type: LAYOUT_MESSAGE.END,\n nodes: nodes_1\n });\n\n layoutMethod_1 === null || layoutMethod_1 === void 0 ? void 0 : layoutMethod_1.destroy();\n };\n\n layoutMethod_1 = new LayoutClass(layoutCfg);\n layoutMethod_1.init({\n nodes: nodes_1,\n edges: edges\n });\n layoutMethod_1.execute();\n break;\n }\n\n case LAYOUT_MESSAGE.GPURUN:\n {\n var _c = event.data,\n nodes = _c.nodes,\n edges = _c.edges,\n _d = _c.layoutCfg,\n layoutCfg = _d === void 0 ? {} : _d,\n canvas = _c.canvas;\n var layoutType = layoutCfg.type; // @ts-ignore\n\n var LayoutClass = layout.getLayoutByName(layoutType);\n\n if (!LayoutClass) {\n this.postMessage({\n type: LAYOUT_MESSAGE.ERROR,\n message: \"layout \" + layoutType + \" not found\"\n });\n break;\n }\n\n if (layoutType.split('-')[1] !== 'gpu') {\n this.postMessage({\n type: LAYOUT_MESSAGE.ERROR,\n message: \"layout \" + layoutType + \" does not support GPU\"\n });\n break;\n }\n\n var layoutMethod = new LayoutClass(layoutCfg);\n layoutMethod.init({\n nodes: nodes,\n edges: edges\n });\n layoutMethod.executeWithWorker(canvas, this);\n break;\n }\n\n default:\n break;\n }\n }\n\n onmessage = function onmessage(event) {\n if (isLayoutMessage(event)) {\n handleLayoutMessage(event);\n }\n };\n }\n\n var layoutWorker = new worker_work(workerCode, workerScriptURL);\n return layoutWorker;\n};\n// CONCATENATED MODULE: ./node_modules/@antv/g6-pc/es/layout/worker/layoutConst.js\n/**\n * @fileoverview constants for layout\n * @author changzhe.zb@antfin.com\n */\n\n/** layout message type */\nvar layoutConst_LAYOUT_MESSAGE = {\n // run layout\n RUN: 'LAYOUT_RUN',\n // layout ended with success\n END: 'LAYOUT_END',\n // layout error\n ERROR: 'LAYOUT_ERROR',\n // layout tick, used in force directed layout\n TICK: 'LAYOUT_TICK',\n GPURUN: 'GPU_LAYOUT_RUN',\n GPUEND: 'GPU_LAYOUT_END'\n};\n// CONCATENATED MODULE: ./node_modules/@antv/g6-pc/es/graph/controller/layout.js\nfunction layout_typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { layout_typeof = function _typeof(obj) { return typeof obj; }; } else { layout_typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return layout_typeof(obj); }\n\n\n\n\n\n\n\n // eslint-disable-next-line @typescript-eslint/no-implied-eval\n\nvar mockRaf = function mockRaf(cb) {\n return setTimeout(cb, 16);\n};\n\nvar mockCaf = function mockCaf(reqId) {\n return clearTimeout(reqId);\n};\n\nvar helper = {\n // pollyfill\n requestAnimationFrame: function requestAnimationFrame(callback) {\n var fn = typeof window !== 'undefined' ? window.requestAnimationFrame || window.webkitRequestAnimationFrame || mockRaf : mockRaf;\n return fn(callback);\n },\n cancelAnimationFrame: function cancelAnimationFrame(requestId) {\n var fn = typeof window !== 'undefined' ? window.cancelAnimationFrame || window.webkitCancelAnimationFrame || mockCaf : mockCaf;\n return fn(requestId);\n }\n};\nvar GPU_LAYOUT_NAMES = ['fruchterman', 'gForce'];\nvar LAYOUT_PIPES_ADJUST_NAMES = ['force', 'grid', 'circular'];\n\nvar controller_layout_LayoutController =\n/** @class */\nfunction (_super) {\n Object(tslib_es6[\"__extends\"])(LayoutController, _super); // the configurations of the layout\n // private layoutCfg: any; // LayoutOptions\n // the type name of the layout\n // private layoutType: string;\n // private data: GraphData;\n // private layoutMethods: typeof Layout;\n\n\n function LayoutController(graph) {\n var _this = _super.call(this, graph) || this;\n\n _this.graph = graph;\n _this.layoutCfg = graph.get('layout') || {};\n _this.layoutType = _this.getLayoutType();\n _this.worker = null;\n _this.workerData = {};\n\n _this.initLayout();\n\n return _this;\n } // eslint-disable-next-line class-methods-use-this\n\n\n LayoutController.prototype.initLayout = function () {// no data before rendering\n }; // get layout worker and create one if not exists\n\n\n LayoutController.prototype.getWorker = function () {\n if (this.worker) {\n return this.worker;\n }\n\n if (typeof Worker === 'undefined') {\n // 如果当前浏览器不支持 web worker,则不使用 web worker\n console.warn('Web worker is not supported in current browser.');\n this.worker = null;\n } else {\n this.worker = layout_worker_LayoutWorker(this.layoutCfg.workerScriptURL);\n }\n\n return this.worker;\n }; // stop layout worker\n\n\n LayoutController.prototype.stopWorker = function () {\n var workerData = this.workerData;\n\n if (!this.worker) {\n return;\n }\n\n this.worker.terminate();\n this.worker = null; // 重新开始新的布局之前,先取消之前布局的requestAnimationFrame。\n\n if (workerData.requestId) {\n helper.cancelAnimationFrame(workerData.requestId);\n workerData.requestId = null;\n }\n\n if (workerData.requestId2) {\n helper.cancelAnimationFrame(workerData.requestId2);\n workerData.requestId2 = null;\n }\n };\n\n LayoutController.prototype.execLayoutMethod = function (layoutCfg, order) {\n var _this = this;\n\n return new Promise(function (reslove, reject) {\n return Object(tslib_es6[\"__awaiter\"])(_this, void 0, void 0, function () {\n var graph, layoutType, isForce, onTick_1, tick, enableTick, layoutMethod, onTick_2, tick, layoutData;\n return Object(tslib_es6[\"__generator\"])(this, function (_a) {\n switch (_a.label) {\n case 0:\n graph = this.graph;\n if (!graph || graph.get('destroyed')) return [2\n /*return*/\n ];\n layoutType = layoutCfg.type; // 每个布局方法都需要注册\n\n layoutCfg.onLayoutEnd = function () {\n graph.emit('aftersublayout', {\n type: layoutType\n });\n reslove();\n }; // 若用户指定开启 gpu,且当前浏览器支持 webgl,且该算法存在 GPU 版本(目前仅支持 fruchterman 和 gForce),使用 gpu 版本的布局\n\n\n if (layoutType && this.isGPU) {\n if (!this.hasGPUVersion(layoutType)) {\n console.warn(\"The '\" + layoutType + \"' layout does not support GPU calculation for now, it will run in CPU.\");\n } else {\n layoutType = layoutType + \"-gpu\";\n }\n }\n\n isForce = layoutType === 'force' || layoutType === 'g6force' || layoutType === 'gForce';\n\n if (isForce) {\n onTick_1 = layoutCfg.onTick;\n\n tick = function tick() {\n if (onTick_1) {\n onTick_1();\n }\n\n graph.refreshPositions();\n };\n\n layoutCfg.tick = tick;\n } else if (layoutCfg.type === 'comboForce') {\n layoutCfg.comboTrees = graph.get('comboTrees');\n }\n\n enableTick = false;\n\n try {\n layoutMethod = new Layouts[layoutType](layoutCfg);\n } catch (e) {\n console.warn(\"The layout method: '\" + layoutType + \"' does not exist! Please specify it first.\");\n reject();\n } // 是否需要迭代的方式完成布局。这里是来自布局对象的实例属性,是由布局的定义者在布局类定义的。\n\n\n enableTick = layoutMethod.enableTick;\n\n if (enableTick) {\n onTick_2 = layoutCfg.onTick;\n\n tick = function tick() {\n if (onTick_2) {\n onTick_2();\n }\n\n graph.refreshPositions();\n };\n\n layoutMethod.tick = tick;\n }\n\n layoutData = this.filterLayoutData(this.data, layoutCfg);\n addLayoutOrder(layoutData, order);\n layoutMethod.init(layoutData); // 若存在节点没有位置信息,且没有设置 layout,在 initPositions 中 random 给出了所有节点的位置,不需要再次执行 random 布局\n // 所有节点都有位置信息,且指定了 layout,则执行布局(代表不是第一次进行布局)\n\n graph.emit('beforesublayout', {\n type: layoutType\n });\n return [4\n /*yield*/\n , layoutMethod.execute()];\n\n case 1:\n _a.sent();\n\n if (layoutMethod.isCustomLayout && layoutCfg.onLayoutEnd) layoutCfg.onLayoutEnd();\n this.layoutMethods[order] = layoutMethod;\n return [2\n /*return*/\n ];\n }\n });\n });\n });\n };\n\n LayoutController.prototype.updateLayoutMethod = function (layoutMethod, layoutCfg) {\n var _this = this;\n\n return new Promise(function (reslove, reject) {\n return Object(tslib_es6[\"__awaiter\"])(_this, void 0, void 0, function () {\n var graph, layoutType, layoutData;\n return Object(tslib_es6[\"__generator\"])(this, function (_a) {\n switch (_a.label) {\n case 0:\n graph = this.graph;\n layoutType = layoutCfg === null || layoutCfg === void 0 ? void 0 : layoutCfg.type; // 每个布局方法都需要注册\n\n layoutCfg.onLayoutEnd = function () {\n graph.emit('aftersublayout', {\n type: layoutType\n });\n reslove();\n };\n\n layoutData = this.filterLayoutData(this.data, layoutCfg);\n layoutMethod.init(layoutData);\n layoutMethod.updateCfg(layoutCfg);\n graph.emit('beforesublayout', {\n type: layoutType\n });\n return [4\n /*yield*/\n , layoutMethod.execute()];\n\n case 1:\n _a.sent();\n\n if (layoutMethod.isCustomLayout && layoutCfg.onLayoutEnd) layoutCfg.onLayoutEnd();\n return [2\n /*return*/\n ];\n }\n });\n });\n });\n };\n /**\n * @param {function} success callback\n * @return {boolean} 是否使用web worker布局\n */\n\n\n LayoutController.prototype.layout = function (success) {\n var _this = this;\n\n var graph = this.graph;\n this.data = this.setDataFromGraph();\n var _a = this.data,\n nodes = _a.nodes,\n hiddenNodes = _a.hiddenNodes;\n\n if (!nodes) {\n return false;\n }\n\n var width = graph.get('width');\n var height = graph.get('height');\n var layoutCfg = {};\n Object.assign(layoutCfg, {\n width: width,\n height: height,\n center: [width / 2, height / 2]\n }, this.layoutCfg);\n this.layoutCfg = layoutCfg;\n this.destoryLayoutMethods();\n graph.emit('beforelayout');\n this.initPositions(layoutCfg.center, nodes); // init hidden nodes\n\n this.initPositions(layoutCfg.center, hiddenNodes); // 防止用户直接用 -gpu 结尾指定布局\n\n var layoutType = layoutCfg.type;\n\n if (layoutType && layoutType.split('-')[1] === 'gpu') {\n layoutType = layoutType.split('-')[0];\n layoutCfg.gpuEnabled = true;\n } // 若用户指定开启 gpu,且当前浏览器支持 webgl,且该算法存在 GPU 版本(目前仅支持 fruchterman 和 gForce),使用 gpu 版本的布局\n\n\n var enableGPU = false;\n\n if (layoutCfg.gpuEnabled) {\n enableGPU = true; // 打开下面语句将会导致 webworker 报找不到 window\n\n if (!gpuDetector().webgl) {\n console.warn(\"Your browser does not support webGL or GPGPU. The layout will run in CPU.\");\n enableGPU = false;\n }\n }\n\n this.isGPU = enableGPU; // 在 onAllLayoutEnd 中执行用户自定义 onLayoutEnd,触发 afterlayout、更新节点位置、fitView/fitCenter、触发 afterrender\n\n var onLayoutEnd = layoutCfg.onLayoutEnd,\n layoutEndFormatted = layoutCfg.layoutEndFormatted,\n adjust = layoutCfg.adjust;\n\n if (!layoutEndFormatted) {\n layoutCfg.layoutEndFormatted = true;\n\n layoutCfg.onAllLayoutEnd = function () {\n return Object(tslib_es6[\"__awaiter\"])(_this, void 0, void 0, function () {\n return Object(tslib_es6[\"__generator\"])(this, function (_a) {\n switch (_a.label) {\n case 0:\n // 执行用户自定义 onLayoutEnd\n if (onLayoutEnd) {\n onLayoutEnd();\n } // 更新节点位置\n\n\n this.refreshLayout();\n if (!(adjust && layoutCfg.pipes)) return [3\n /*break*/\n , 2];\n return [4\n /*yield*/\n , this.adjustPipesBox(this.data, adjust)];\n\n case 1:\n _a.sent();\n\n this.refreshLayout();\n _a.label = 2;\n\n case 2:\n // 触发 afterlayout\n graph.emit('afterlayout');\n return [2\n /*return*/\n ];\n }\n });\n });\n };\n }\n\n this.stopWorker();\n\n if (layoutCfg.workerEnabled && this.layoutWithWorker(this.data)) {\n // 如果启用布局web worker并且浏览器支持web worker,用web worker布局。否则回退到不用web worker布局。\n return true;\n }\n\n var start = Promise.resolve();\n\n if (layoutCfg.type) {\n start = start.then(function () {\n return Object(tslib_es6[\"__awaiter\"])(_this, void 0, void 0, function () {\n return Object(tslib_es6[\"__generator\"])(this, function (_a) {\n switch (_a.label) {\n case 0:\n return [4\n /*yield*/\n , this.execLayoutMethod(layoutCfg, 0)];\n\n case 1:\n return [2\n /*return*/\n , _a.sent()];\n }\n });\n });\n });\n } else if (layoutCfg.pipes) {\n layoutCfg.pipes.forEach(function (cfg, index) {\n start = start.then(function () {\n return Object(tslib_es6[\"__awaiter\"])(_this, void 0, void 0, function () {\n return Object(tslib_es6[\"__generator\"])(this, function (_a) {\n switch (_a.label) {\n case 0:\n return [4\n /*yield*/\n , this.execLayoutMethod(cfg, index)];\n\n case 1:\n return [2\n /*return*/\n , _a.sent()];\n }\n });\n });\n });\n });\n } // 最后统一在外部调用onAllLayoutEnd\n\n\n start.then(function () {\n if (layoutCfg.onAllLayoutEnd) layoutCfg.onAllLayoutEnd(); // 在执行 execute 后立即执行 success,且在 timeBar 中有 throttle,可以防止 timeBar 监听 afterrender 进行 changeData 后 layout,从而死循环\n // 对于 force 一类布局完成后的 fitView 需要用户自己在 onLayoutEnd 中配置\n\n if (success) success();\n }).catch(function (error) {\n console.warn('graph layout failed,', error);\n });\n return false;\n };\n /**\n * layout with web worker\n * @param {object} data graph data\n * @return {boolean} 是否支持web worker\n */\n\n\n LayoutController.prototype.layoutWithWorker = function (data) {\n var _this = this;\n\n var _a = this,\n layoutCfg = _a.layoutCfg,\n graph = _a.graph;\n\n var worker = this.getWorker(); // 每次worker message event handler调用之间的共享数据,会被修改。\n\n var workerData = this.workerData;\n\n if (!worker) {\n return false;\n }\n\n workerData.requestId = null;\n workerData.requestId2 = null;\n workerData.currentTick = null;\n workerData.currentTickData = null;\n graph.emit('beforelayout');\n var start = Promise.resolve();\n\n if (layoutCfg.type) {\n start = start.then(function () {\n return _this.runWebworker(worker, data, layoutCfg);\n });\n } else if (layoutCfg.pipes) {\n var _loop_1 = function _loop_1(cfg) {\n start = start.then(function () {\n return _this.runWebworker(worker, data, cfg);\n });\n };\n\n for (var _i = 0, _b = layoutCfg.pipes; _i < _b.length; _i++) {\n var cfg = _b[_i];\n\n _loop_1(cfg);\n }\n } // 最后统一在外部调用onAllLayoutEnd\n\n\n start.then(function () {\n if (layoutCfg.onAllLayoutEnd) layoutCfg.onAllLayoutEnd();\n }).catch(function (error) {\n console.error('layout failed', error);\n });\n return true;\n };\n\n LayoutController.prototype.runWebworker = function (worker, allData, layoutCfg) {\n var _this = this;\n\n var isGPU = this.isGPU;\n var data = this.filterLayoutData(allData, layoutCfg);\n var nodes = data.nodes,\n edges = data.edges;\n var offScreenCanvas = document.createElement('canvas');\n var gpuWorkerAbility = isGPU && typeof window !== 'undefined' && // eslint-disable-next-line @typescript-eslint/dot-notation\n window.navigator && !navigator[\"gpu\"] && // WebGPU 还不支持 OffscreenCanvas\n 'OffscreenCanvas' in window && 'transferControlToOffscreen' in offScreenCanvas; // NOTE: postMessage的message参数里面不能包含函数,否则postMessage会报错,\n // 例如:'function could not be cloned'。\n // 详情参考:https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Structured_clone_algorithm\n // 所以这里需要把过滤layoutCfg里的函数字段过滤掉。\n\n var filteredLayoutCfg = filterObject(layoutCfg, function (value) {\n return typeof value !== 'function';\n });\n\n if (!gpuWorkerAbility) {\n worker.postMessage({\n type: layoutConst_LAYOUT_MESSAGE.RUN,\n nodes: nodes,\n edges: edges,\n layoutCfg: filteredLayoutCfg\n });\n } else {\n var offscreen = offScreenCanvas.transferControlToOffscreen(); // filteredLayoutCfg.canvas = offscreen;\n\n filteredLayoutCfg.type = filteredLayoutCfg.type + \"-gpu\";\n worker.postMessage({\n type: layoutConst_LAYOUT_MESSAGE.GPURUN,\n nodes: nodes,\n edges: edges,\n layoutCfg: filteredLayoutCfg,\n canvas: offscreen\n }, [offscreen]);\n }\n\n return new Promise(function (reslove, reject) {\n worker.onmessage = function (event) {\n _this.handleWorkerMessage(reslove, reject, event, data, layoutCfg);\n };\n });\n }; // success callback will be called when updating graph positions for the first time.\n\n\n LayoutController.prototype.handleWorkerMessage = function (reslove, reject, event, data, layoutCfg) {\n var _a = this,\n graph = _a.graph,\n workerData = _a.workerData;\n\n var eventData = event.data;\n var type = eventData.type;\n\n var onTick = function onTick() {\n if (layoutCfg.onTick) {\n layoutCfg.onTick();\n }\n };\n\n switch (type) {\n case layoutConst_LAYOUT_MESSAGE.TICK:\n workerData.currentTick = eventData.currentTick;\n workerData.currentTickData = eventData;\n\n if (!workerData.requestId) {\n workerData.requestId = helper.requestAnimationFrame(function requestId() {\n updateLayoutPosition(data, eventData);\n graph.refreshPositions();\n onTick();\n\n if (eventData.currentTick === eventData.totalTicks) {\n // 如果是最后一次tick\n reslove();\n } else if (workerData.currentTick === eventData.totalTicks) {\n // 注意这里workerData.currentTick可能已经不再是前面赋值时候的值了,\n // 因为在requestAnimationFrame等待时间里,可能产生新的tick。\n // 如果当前tick不是最后一次tick,并且所有的tick消息都已发出来了,那么需要用最后一次tick的数据再刷新一次。\n workerData.requestId2 = helper.requestAnimationFrame(function requestId2() {\n updateLayoutPosition(data, workerData.currentTickData);\n graph.refreshPositions();\n workerData.requestId2 = null;\n onTick();\n reslove();\n });\n }\n\n workerData.requestId = null;\n });\n }\n\n break;\n\n case layoutConst_LAYOUT_MESSAGE.END:\n // 如果没有tick消息(非力导布局)\n if (workerData.currentTick == null) {\n updateLayoutPosition(data, eventData);\n reslove();\n }\n\n break;\n\n case layoutConst_LAYOUT_MESSAGE.GPUEND:\n // 如果没有tick消息(非力导布局)\n if (workerData.currentTick == null) {\n updateGPUWorkerLayoutPosition(data, eventData);\n reslove();\n }\n\n break;\n\n case layoutConst_LAYOUT_MESSAGE.ERROR:\n console.warn('Web-Worker layout error!', eventData.message);\n reject();\n break;\n\n default:\n reject();\n break;\n }\n }; // 更新布局参数\n\n\n LayoutController.prototype.updateLayoutCfg = function (cfg) {\n var _this = this;\n\n var _a = this,\n graph = _a.graph,\n layoutMethods = _a.layoutMethods;\n\n var layoutCfg = Object(esm[\"mix\"])({}, this.layoutCfg, cfg);\n this.layoutCfg = layoutCfg;\n\n if (!(layoutMethods === null || layoutMethods === void 0 ? void 0 : layoutMethods.length)) {\n this.layout();\n return;\n }\n\n this.data = this.setDataFromGraph();\n this.stopWorker();\n\n if (cfg.workerEnabled && this.layoutWithWorker(this.data)) {\n // 如果启用布局web worker并且浏览器支持web worker,用web worker布局。否则回退到不用web worker布局。\n return;\n }\n\n graph.emit('beforelayout');\n var start = Promise.resolve();\n\n if (layoutMethods.length === 1) {\n start = start.then(function () {\n return Object(tslib_es6[\"__awaiter\"])(_this, void 0, void 0, function () {\n return Object(tslib_es6[\"__generator\"])(this, function (_a) {\n switch (_a.label) {\n case 0:\n return [4\n /*yield*/\n , this.updateLayoutMethod(layoutMethods[0], layoutCfg)];\n\n case 1:\n return [2\n /*return*/\n , _a.sent()];\n }\n });\n });\n });\n } else {\n layoutMethods === null || layoutMethods === void 0 ? void 0 : layoutMethods.forEach(function (layoutMethod, index) {\n var currentCfg = layoutCfg.pipes[index];\n start = start.then(function () {\n return Object(tslib_es6[\"__awaiter\"])(_this, void 0, void 0, function () {\n return Object(tslib_es6[\"__generator\"])(this, function (_a) {\n switch (_a.label) {\n case 0:\n return [4\n /*yield*/\n , this.updateLayoutMethod(layoutMethod, currentCfg)];\n\n case 1:\n return [2\n /*return*/\n , _a.sent()];\n }\n });\n });\n });\n });\n }\n\n start.then(function () {\n if (layoutCfg.onAllLayoutEnd) layoutCfg.onAllLayoutEnd();\n }).catch(function (error) {\n console.warn('layout failed', error);\n });\n };\n\n LayoutController.prototype.adjustPipesBox = function (data, adjust) {\n var _this = this;\n\n return new Promise(function (resolve) {\n var nodes = data.nodes;\n\n if (!(nodes === null || nodes === void 0 ? void 0 : nodes.length)) {\n resolve();\n }\n\n if (!LAYOUT_PIPES_ADJUST_NAMES.includes(adjust)) {\n console.warn(\"The adjust type \" + adjust + \" is not supported yet, please assign it with 'force', 'grid', or 'circular'.\");\n resolve();\n }\n\n var layoutCfg = {\n center: _this.layoutCfg.center,\n nodeSize: function nodeSize(d) {\n return Math.max(d.height, d.width);\n },\n preventOverlap: true,\n onLayoutEnd: function onLayoutEnd() {}\n }; // 计算出大单元\n\n var _a = _this.getLayoutBBox(nodes),\n groupNodes = _a.groupNodes,\n layoutNodes = _a.layoutNodes;\n\n var preNodes = Object(esm[\"clone\"])(layoutNodes); // 根据大单元坐标的变化,调整这里面每个小单元nodes\n\n layoutCfg.onLayoutEnd = function () {\n layoutNodes === null || layoutNodes === void 0 ? void 0 : layoutNodes.forEach(function (ele, index) {\n var _a, _b, _c;\n\n var dx = ele.x - ((_a = preNodes[index]) === null || _a === void 0 ? void 0 : _a.x);\n var dy = ele.y - ((_b = preNodes[index]) === null || _b === void 0 ? void 0 : _b.y);\n (_c = groupNodes[index]) === null || _c === void 0 ? void 0 : _c.forEach(function (n) {\n n.x += dx;\n n.y += dy;\n });\n });\n resolve();\n };\n\n var layoutMethod = new Layouts[adjust](layoutCfg);\n layoutMethod.layout({\n nodes: layoutNodes\n });\n });\n };\n\n LayoutController.prototype.hasGPUVersion = function (layoutName) {\n return GPU_LAYOUT_NAMES.includes(layoutName);\n };\n\n LayoutController.prototype.destroy = function () {\n this.destoryLayoutMethods();\n var worker = this.worker;\n\n if (worker) {\n worker.terminate();\n this.worker = null;\n }\n\n this.destroyed = true;\n this.graph.set('layout', undefined);\n this.layoutCfg = undefined;\n this.layoutType = undefined;\n this.layoutMethods = undefined;\n this.graph = null;\n };\n\n return LayoutController;\n}(controller_layout);\n\n/* harmony default export */ var graph_controller_layout = (controller_layout_LayoutController);\n\nfunction updateLayoutPosition(data, layoutData) {\n var nodes = data.nodes;\n var layoutNodes = layoutData.nodes;\n var nodeLength = nodes.length;\n\n for (var i = 0; i < nodeLength; i++) {\n var node = nodes[i];\n node.x = layoutNodes[i].x;\n node.y = layoutNodes[i].y;\n }\n}\n\nfunction filterObject(collection, callback) {\n var result = {};\n\n if (collection && layout_typeof(collection) === 'object') {\n Object.keys(collection).forEach(function (key) {\n if (collection.hasOwnProperty(key) && callback(collection[key])) {\n result[key] = collection[key];\n }\n });\n return result;\n }\n\n return collection;\n}\n\nfunction updateGPUWorkerLayoutPosition(data, layoutData) {\n var nodes = data.nodes;\n var vertexEdgeData = layoutData.vertexEdgeData;\n var nodeLength = nodes.length;\n\n for (var i = 0; i < nodeLength; i++) {\n var node = nodes[i];\n var x = vertexEdgeData[4 * i];\n var y = vertexEdgeData[4 * i + 1];\n node.x = x;\n node.y = y;\n }\n}\n\nfunction addLayoutOrder(data, order) {\n var _a;\n\n if (!((_a = data === null || data === void 0 ? void 0 : data.nodes) === null || _a === void 0 ? void 0 : _a.length)) {\n return;\n }\n\n var nodes = data.nodes;\n nodes.forEach(function (node) {\n node.layoutOrder = order;\n });\n}\n// CONCATENATED MODULE: ./node_modules/@antv/g6-pc/es/graph/controller/index.js\n\n\n// CONCATENATED MODULE: ./node_modules/@antv/g6-pc/es/graph/graph.js\n\n\n\n\n\n\n\n\n\nvar graph_graph_transform = matrix_util_esm[\"ext\"].transform;\nvar SVG = 'svg';\n\nvar graph_Graph =\n/** @class */\nfunction (_super) {\n Object(tslib_es6[\"__extends\"])(Graph, _super);\n\n function Graph(cfg) {\n var _this = _super.call(this, cfg) || this;\n\n var defaultNode = _this.get('defaultNode');\n\n if (!defaultNode) {\n _this.set('defaultNode', {\n type: 'circle'\n });\n }\n\n if (!defaultNode.type) {\n defaultNode.type = 'circle';\n\n _this.set('defaultNode', defaultNode);\n }\n\n _this.destroyed = false;\n return _this;\n }\n\n Graph.prototype.initLayoutController = function () {\n var layoutController = new graph_controller_layout(this);\n this.set({\n layoutController: layoutController\n });\n };\n\n Graph.prototype.initEventController = function () {\n var eventController = new graph_controller_event(this);\n this.set({\n eventController: eventController\n });\n };\n\n Graph.prototype.initCanvas = function () {\n var container = this.get('container');\n\n if (typeof container === 'string') {\n container = document.getElementById(container);\n this.set('container', container);\n }\n\n if (!container) {\n throw new Error('invalid container');\n }\n\n var clientWidth = container.clientWidth,\n clientHeight = container.clientHeight;\n var width = this.get('width') || clientWidth;\n var height = this.get('height') || clientHeight;\n\n if (!this.get('width') && !this.get('height')) {\n this.set('width', clientWidth);\n this.set('height', clientHeight);\n }\n\n var renderer = this.get('renderer');\n var canvas;\n\n if (renderer === SVG) {\n canvas = new g_svg_esm[\"Canvas\"]({\n container: container,\n width: width,\n height: height\n });\n } else {\n var canvasCfg = {\n container: container,\n width: width,\n height: height\n };\n var pixelRatio = this.get('pixelRatio');\n\n if (pixelRatio) {\n canvasCfg.pixelRatio = pixelRatio;\n }\n\n canvas = new g_canvas_esm[\"Canvas\"](canvasCfg);\n }\n\n this.set('canvas', canvas);\n };\n\n Graph.prototype.initPlugins = function () {\n var self = this;\n Object(esm[\"each\"])(self.get('plugins'), function (plugin) {\n if (!plugin.destroyed && plugin.initPlugin) {\n plugin.initPlugin(self);\n }\n });\n };\n /**\n * 增加图片下载水印功能\n */\n\n\n Graph.prototype.downloadImageWatermark = function (watermarker, context, width, height) {\n return Object(tslib_es6[\"__awaiter\"])(this, void 0, void 0, function () {\n var watermarkStr, watermarkbase64, img;\n return Object(tslib_es6[\"__generator\"])(this, function (_a) {\n switch (_a.label) {\n case 0:\n watermarkStr = watermarker.style.backgroundImage;\n watermarkbase64 = watermarkStr.slice(5, watermarkStr.length - 2);\n img = new Image();\n img.src = watermarkbase64;\n return [4\n /*yield*/\n , new Promise(function (resolve) {\n img.onload = function () {\n var pat = context.createPattern(img, \"repeat\");\n context.rect(0, 0, width, height);\n context.fillStyle = pat;\n context.fill();\n resolve('');\n };\n })];\n\n case 1:\n _a.sent();\n\n return [2\n /*return*/\n ];\n }\n });\n });\n };\n /**\n * 用于生成图片 (异步callback)\n * @param {String} type 图片类型,可选值:\"image/png\" | \"image/jpeg\" | \"image/webp\" | \"image/bmp\"\n * @param {string} backgroundColor 图片背景色\n * @return {string} 图片 dataURL\n */\n\n\n Graph.prototype.asyncToDataUrl = function (type, backgroundColor, callback, widths, heights, vCanvasEl) {\n var _this = this;\n\n var watermarker = document.querySelector('.g6-graph-watermarker');\n var canvas = this.get('canvas');\n var renderer = canvas.getRenderer();\n var canvasDom = vCanvasEl || canvas.get('el');\n var dataURL = '';\n if (!type) type = 'image/png';\n setTimeout(function () {\n return Object(tslib_es6[\"__awaiter\"])(_this, void 0, void 0, function () {\n var cloneNode, svgDocType, svgDoc, svgData, imageData, context, width, height, compositeOperation, pixelRatio;\n return Object(tslib_es6[\"__generator\"])(this, function (_a) {\n switch (_a.label) {\n case 0:\n if (!(renderer === 'svg')) return [3\n /*break*/\n , 1];\n cloneNode = canvasDom.cloneNode(true);\n svgDocType = document.implementation.createDocumentType('svg', '-//W3C//DTD SVG 1.1//EN', 'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd');\n svgDoc = document.implementation.createDocument('http://www.w3.org/2000/svg', 'svg', svgDocType);\n svgDoc.replaceChild(cloneNode, svgDoc.documentElement);\n svgData = new XMLSerializer().serializeToString(svgDoc);\n dataURL = \"data:image/svg+xml;charset=utf8,\" + encodeURIComponent(svgData);\n return [3\n /*break*/\n , 4];\n\n case 1:\n imageData = void 0;\n context = canvasDom.getContext('2d');\n width = widths || this.get('width');\n height = heights || this.get('height');\n compositeOperation = void 0;\n if (!watermarker) return [3\n /*break*/\n , 3];\n return [4\n /*yield*/\n , this.downloadImageWatermark(watermarker, context, width, height)];\n\n case 2:\n _a.sent();\n\n _a.label = 3;\n\n case 3:\n if (backgroundColor) {\n pixelRatio = typeof window !== 'undefined' ? window.devicePixelRatio : 1;\n\n try {\n imageData = context.getImageData(0, 0, width * pixelRatio, height * pixelRatio);\n compositeOperation = context.globalCompositeOperation;\n context.globalCompositeOperation = 'destination-over';\n context.fillStyle = backgroundColor;\n context.fillRect(0, 0, width, height);\n } catch (error) {\n console.error('Download image failed. Out of memory at ImageData creation');\n }\n }\n\n dataURL = canvasDom.toDataURL(type);\n\n if (backgroundColor) {\n context.clearRect(0, 0, width, height);\n context.putImageData(imageData, 0, 0);\n context.globalCompositeOperation = compositeOperation;\n }\n\n _a.label = 4;\n\n case 4:\n if (callback) callback(dataURL);\n return [2\n /*return*/\n ];\n }\n });\n });\n }, 16);\n };\n /**\n * 返回可见区域的图的 dataUrl,用于生成图片\n * @param {String} type 图片类型,可选值:\"image/png\" | \"image/jpeg\" | \"image/webp\" | \"image/bmp\"\n * @param {string} backgroundColor 图片背景色\n * @return {string} 图片 dataURL\n */\n\n\n Graph.prototype.toDataURL = function (type, backgroundColor) {\n var canvas = this.get('canvas');\n var renderer = canvas.getRenderer();\n var canvasDom = canvas.get('el');\n if (!type) type = 'image/png';\n var dataURL = '';\n\n if (renderer === 'svg') {\n var cloneNode = canvasDom.cloneNode(true);\n var svgDocType = document.implementation.createDocumentType('svg', '-//W3C//DTD SVG 1.1//EN', 'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd');\n var svgDoc = document.implementation.createDocument('http://www.w3.org/2000/svg', 'svg', svgDocType);\n svgDoc.replaceChild(cloneNode, svgDoc.documentElement);\n var svgData = new XMLSerializer().serializeToString(svgDoc);\n dataURL = \"data:image/svg+xml;charset=utf8,\" + encodeURIComponent(svgData);\n } else {\n var imageData = void 0;\n var context = canvasDom.getContext('2d');\n var width = this.get('width');\n var height = this.get('height');\n var compositeOperation = void 0;\n\n if (backgroundColor) {\n var pixelRatio = typeof window !== 'undefined' ? window.devicePixelRatio : 1;\n\n try {\n imageData = context.getImageData(0, 0, width * pixelRatio, height * pixelRatio);\n compositeOperation = context.globalCompositeOperation;\n context.globalCompositeOperation = 'destination-over';\n context.fillStyle = backgroundColor;\n context.fillRect(0, 0, width, height);\n } catch (error) {\n console.error('Download image failed. Out of memory at ImageData creation');\n }\n }\n\n dataURL = canvasDom.toDataURL(type);\n\n if (backgroundColor) {\n context.clearRect(0, 0, width, height);\n context.putImageData(imageData, 0, 0);\n context.globalCompositeOperation = compositeOperation;\n }\n }\n\n return dataURL;\n };\n /**\n * 返回整个图(包括超出可见区域的部分)的 dataUrl,用于生成图片\n * @param {Function} callback 异步生成 dataUrl 完成后的回调函数,在这里处理生成的 dataUrl 字符串\n * @param {String} type 图片类型,可选值:\"image/png\" | \"image/jpeg\" | \"image/webp\" | \"image/bmp\"\n * @param {Object} imageConfig 图片配置项,包括背景色和上下左右的 padding\n */\n\n\n Graph.prototype.toFullDataURL = function (callback, type, imageConfig) {\n var bbox = this.get('group').getCanvasBBox();\n var height = bbox.height;\n var width = bbox.width;\n var renderer = this.get('renderer');\n var vContainerDOM = createDom('');\n var backgroundColor = imageConfig ? imageConfig.backgroundColor : undefined;\n var padding = imageConfig ? imageConfig.padding : undefined;\n if (!padding) padding = [0, 0, 0, 0];else if (Object(esm[\"isNumber\"])(padding)) padding = [padding, padding, padding, padding];\n var vHeight = height + padding[0] + padding[2];\n var vWidth = width + padding[1] + padding[3];\n var canvasOptions = {\n container: vContainerDOM,\n height: vHeight,\n width: vWidth,\n quickHit: true\n };\n var vCanvas = renderer === 'svg' ? new g_svg_esm[\"Canvas\"](canvasOptions) : new g_canvas_esm[\"Canvas\"](canvasOptions);\n var group = this.get('group');\n var vGroup = group.clone();\n var matrix = Object(esm[\"clone\"])(vGroup.getMatrix());\n if (!matrix) matrix = [1, 0, 0, 0, 1, 0, 0, 0, 1];\n var centerX = (bbox.maxX + bbox.minX) / 2;\n var centerY = (bbox.maxY + bbox.minY) / 2;\n matrix = graph_graph_transform(matrix, [['t', -centerX, -centerY], ['t', width / 2 + padding[3], height / 2 + padding[0]]]);\n vGroup.resetMatrix();\n vGroup.setMatrix(matrix);\n vCanvas.add(vGroup);\n var vCanvasEl = vCanvas.get('el');\n var dataURL = '';\n if (!type) type = 'image/png';\n setTimeout(function () {\n if (renderer === 'svg') {\n var cloneNode = vCanvasEl.cloneNode(true);\n var svgDocType = document.implementation.createDocumentType('svg', '-//W3C//DTD SVG 1.1//EN', 'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd');\n var svgDoc = document.implementation.createDocument('http://www.w3.org/2000/svg', 'svg', svgDocType);\n svgDoc.replaceChild(cloneNode, svgDoc.documentElement);\n var svgData = new XMLSerializer().serializeToString(svgDoc);\n dataURL = \"data:image/svg+xml;charset=utf8,\" + encodeURIComponent(svgData);\n } else {\n var imageData = void 0;\n var context = vCanvasEl.getContext('2d');\n var compositeOperation = void 0;\n\n if (backgroundColor) {\n var pixelRatio = typeof window !== 'undefined' ? window.devicePixelRatio : 1;\n\n try {\n imageData = context.getImageData(0, 0, vWidth * pixelRatio, vHeight * pixelRatio);\n compositeOperation = context.globalCompositeOperation;\n context.globalCompositeOperation = 'destination-over';\n context.fillStyle = backgroundColor;\n context.fillRect(0, 0, vWidth, vHeight);\n } catch (error) {\n console.error('Download image failed. Out of memory at ImageData creation');\n }\n }\n\n dataURL = vCanvasEl.toDataURL(type);\n\n if (backgroundColor) {\n context.clearRect(0, 0, vWidth, vHeight);\n context.putImageData(imageData, 0, 0);\n context.globalCompositeOperation = compositeOperation;\n }\n }\n\n if (callback) callback(dataURL);\n }, 16);\n };\n /**\n * 导出包含全图的图片\n * @param {String} name 图片的名称\n * @param {String} type 图片类型,可选值:\"image/png\" | \"image/jpeg\" | \"image/webp\" | \"image/bmp\"\n * @param {Object} imageConfig 图片配置项,包括背景色和上下左右的 padding\n */\n\n\n Graph.prototype.downloadFullImage = function (name, type, imageConfig) {\n var _this = this;\n\n var bbox = this.get('group').getCanvasBBox();\n var height = bbox.height;\n var width = bbox.width;\n var renderer = this.get('renderer');\n var vContainerDOM = createDom('');\n var watermarker = document.querySelector('.g6-graph-watermarker');\n var backgroundColor = imageConfig ? imageConfig.backgroundColor : undefined;\n var padding = imageConfig ? imageConfig.padding : undefined;\n if (!padding) padding = [0, 0, 0, 0];else if (Object(esm[\"isNumber\"])(padding)) padding = [padding, padding, padding, padding];\n var vHeight = height + padding[0] + padding[2];\n var vWidth = width + padding[1] + padding[3];\n\n if (watermarker) {\n var _a = this.get('graphWaterMarker').cfg || {},\n wmWidth = _a.width,\n wmHeight = _a.height;\n\n vHeight = Math.ceil(vHeight / wmHeight) * wmHeight;\n vWidth = Math.ceil(vWidth / wmWidth) * wmWidth;\n }\n\n var canvasOptions = {\n container: vContainerDOM,\n height: vHeight,\n width: vWidth\n };\n var vCanvas = renderer === 'svg' ? new g_svg_esm[\"Canvas\"](canvasOptions) : new g_canvas_esm[\"Canvas\"](canvasOptions);\n var group = this.get('group');\n var vGroup = group.clone();\n var matrix = Object(esm[\"clone\"])(vGroup.getMatrix());\n if (!matrix) matrix = [1, 0, 0, 0, 1, 0, 0, 0, 1];\n var centerX = (bbox.maxX + bbox.minX) / 2;\n var centerY = (bbox.maxY + bbox.minY) / 2;\n matrix = graph_graph_transform(matrix, [['t', -centerX, -centerY], ['t', width / 2 + padding[3], height / 2 + padding[0]]]);\n vGroup.resetMatrix();\n vGroup.setMatrix(matrix);\n vCanvas.add(vGroup);\n var vCanvasEl = vCanvas.get('el');\n if (!type) type = 'image/png';\n this.asyncToDataUrl(type, backgroundColor, function (dataURL) {\n var link = document.createElement('a');\n var fileName = (name || 'graph') + (renderer === 'svg' ? '.svg' : \".\" + type.split('/')[1]);\n\n _this.dataURLToImage(dataURL, renderer, link, fileName);\n\n var e = document.createEvent('MouseEvents');\n e.initEvent('click', false, false);\n link.dispatchEvent(e);\n }, vWidth, vHeight, vCanvasEl);\n };\n /**\n * 画布导出图片,图片仅包含画布可见区域部分内容\n * @param {String} name 图片的名称\n * @param {String} type 图片类型,可选值:\"image/png\" | \"image/jpeg\" | \"image/webp\" | \"image/bmp\"\n * @param {string} backgroundColor 图片背景色\n */\n\n\n Graph.prototype.downloadImage = function (name, type, backgroundColor) {\n var _this = this;\n\n var self = this;\n\n if (self.isAnimating()) {\n self.stopAnimate();\n }\n\n var canvas = self.get('canvas');\n var renderer = canvas.getRenderer();\n if (!type) type = 'image/png';\n var fileName = (name || 'graph') + (renderer === 'svg' ? '.svg' : type.split('/')[1]);\n var link = document.createElement('a');\n self.asyncToDataUrl(type, backgroundColor, function (dataURL) {\n _this.dataURLToImage(dataURL, renderer, link, fileName);\n\n var e = document.createEvent('MouseEvents');\n e.initEvent('click', false, false);\n link.dispatchEvent(e);\n });\n };\n\n Graph.prototype.dataURLToImage = function (dataURL, renderer, link, fileName) {\n if (!dataURL || dataURL === 'data:') {\n console.error('Download image failed. The graph is too large or there is invalid attribute values in graph items');\n return;\n }\n\n if (typeof window !== 'undefined') {\n if (window.Blob && window.URL && renderer !== 'svg') {\n var arr = dataURL.split(',');\n var mime = '';\n\n if (arr && arr.length > 0) {\n var match = arr[0].match(/:(.*?);/); // eslint-disable-next-line prefer-destructuring\n\n if (match && match.length >= 2) mime = match[1];\n }\n\n var bstr = atob(arr[1]);\n var n = bstr.length;\n var u8arr = new Uint8Array(n);\n\n while (n--) {\n u8arr[n] = bstr.charCodeAt(n);\n }\n\n var blobObj_1 = new Blob([u8arr], {\n type: mime\n });\n\n if (window.navigator.msSaveBlob) {\n window.navigator.msSaveBlob(blobObj_1, fileName);\n } else {\n link.addEventListener('click', function () {\n link.download = fileName;\n link.href = window.URL.createObjectURL(blobObj_1);\n });\n }\n } else {\n link.addEventListener('click', function () {\n link.download = fileName;\n link.href = dataURL;\n });\n }\n }\n };\n /**\n * 添加插件\n * @param {object} plugin 插件实例\n */\n\n\n Graph.prototype.addPlugin = function (plugin) {\n var self = this;\n\n if (plugin.destroyed) {\n return;\n }\n\n self.get('plugins').push(plugin);\n plugin.initPlugin(self);\n };\n /**\n * 添加插件\n * @param {object} plugin 插件实例\n */\n\n\n Graph.prototype.removePlugin = function (plugin) {\n var plugins = this.get('plugins');\n var index = plugins.indexOf(plugin);\n\n if (index >= 0) {\n plugin.destroyPlugin();\n plugins.splice(index, 1);\n }\n };\n /**\n * 设置图片水印\n * @param {string} imgURL 图片水印的url地址\n * @param {WaterMarkerConfig} config 文本水印的配置项\n */\n\n\n Graph.prototype.setImageWaterMarker = function (imgURL, config) {\n if (imgURL === void 0) {\n imgURL = es_global.waterMarkerImage;\n }\n\n var container = this.get('container');\n\n if (Object(esm[\"isString\"])(container)) {\n container = document.getElementById(container);\n }\n\n if (!container.style.position) {\n container.style.position = 'relative';\n }\n\n var canvas = this.get('graphWaterMarker');\n var waterMarkerConfig = Object(esm[\"deepMix\"])({}, es_global.imageWaterMarkerConfig, config);\n var width = waterMarkerConfig.width,\n height = waterMarkerConfig.height,\n compatible = waterMarkerConfig.compatible,\n image = waterMarkerConfig.image;\n\n if (!canvas) {\n var canvasCfg = {\n container: container,\n width: width,\n height: height,\n capture: false\n };\n var pixelRatio = this.get('pixelRatio');\n\n if (pixelRatio) {\n canvasCfg.pixelRatio = pixelRatio;\n }\n\n canvas = new g_canvas_esm[\"Canvas\"](canvasCfg);\n this.set('graphWaterMarker', canvas);\n }\n\n canvas.get('el').style.display = 'none';\n var ctx = canvas.get('context');\n var rotate = image.rotate,\n x = image.x,\n y = image.y; // 旋转20度\n\n ctx.rotate(-rotate * Math.PI / 180);\n var img = new Image();\n img.crossOrigin = 'anonymous';\n img.src = imgURL;\n\n img.onload = function () {\n ctx.drawImage(img, x, y, image.width, image.height); // 恢复旋转角度\n\n ctx.rotate(rotate * Math.PI / 180); // 默认按照现代浏览器处理\n\n if (!compatible) {\n var box = document.querySelector('.g6-graph-watermarker');\n\n if (!box) {\n box = document.createElement('div');\n box.className = 'g6-graph-watermarker';\n }\n\n box.className = 'g6-graph-watermarker';\n\n if (!canvas.destroyed) {\n box.style.cssText = \"background-image: url(\" + canvas.get('el').toDataURL('image/png') + \");background-repeat:repeat;position:absolute;top:0;bottom:0;left:0;right:0;pointer-events:none;z-index:-1;\";\n container.appendChild(box);\n }\n } else {\n // 当需要兼容不支持 pointer-events属性的浏览器时,将 compatible 设置为 true\n container.style.cssText = \"background-image: url(\" + canvas.get('el').toDataURL('image/png') + \");background-repeat:repeat;\";\n }\n };\n };\n /**\n * 设置文本水印\n * @param {string[]} texts 水印的文本内容\n * @param {WaterMarkerConfig} config 文本水印的配置项\n */\n\n\n Graph.prototype.setTextWaterMarker = function (texts, config) {\n var container = this.get('container');\n\n if (Object(esm[\"isString\"])(container)) {\n container = document.getElementById(container);\n }\n\n if (!container.style.position) {\n container.style.position = 'relative';\n }\n\n var canvas = this.get('graphWaterMarker');\n var waterMarkerConfig = Object(esm[\"deepMix\"])({}, es_global.textWaterMarkerConfig, config);\n var width = waterMarkerConfig.width,\n height = waterMarkerConfig.height,\n compatible = waterMarkerConfig.compatible,\n text = waterMarkerConfig.text;\n\n if (!canvas) {\n var canvasCfg = {\n container: container,\n width: width,\n height: height,\n capture: false\n };\n var pixelRatio = this.get('pixelRatio');\n\n if (pixelRatio) {\n canvasCfg.pixelRatio = pixelRatio;\n }\n\n canvas = new g_canvas_esm[\"Canvas\"](canvasCfg);\n this.set('graphWaterMarker', canvas);\n }\n\n canvas.get('el').style.display = 'none';\n var ctx = canvas.get('context');\n var rotate = text.rotate,\n fill = text.fill,\n fontFamily = text.fontFamily,\n fontSize = text.fontSize,\n baseline = text.baseline,\n x = text.x,\n y = text.y,\n lineHeight = text.lineHeight; // 旋转20度\n\n ctx.rotate(-rotate * Math.PI / 180); // 设置文字样式\n\n ctx.font = fontSize + \"px \" + fontFamily; // 设置文字颜色\n\n ctx.fillStyle = fill;\n ctx.textBaseline = baseline;\n\n for (var i = texts.length - 1; i >= 0; i--) {\n // 将文字绘制到画布\n ctx.fillText(texts[i], x, y + i * lineHeight);\n } // 恢复旋转角度\n\n\n ctx.rotate(rotate * Math.PI / 180); // 默认按照现代浏览器处理\n\n if (!compatible) {\n var box = document.querySelector('.g6-graph-watermarker');\n\n if (!box) {\n box = document.createElement('div');\n box.className = 'g6-graph-watermarker';\n }\n\n box.style.cssText = \"background-image: url(\" + canvas.get('el').toDataURL('image/png') + \");background-repeat:repeat;position:absolute;top:0;bottom:0;left:0;right:0;pointer-events:none;z-index:99;\";\n container.appendChild(box);\n } else {\n // 当需要兼容不支持 pointer-events属性的浏览器时,将 compatible 设置为 true\n container.style.cssText = \"background-image: url(\" + canvas.get('el').toDataURL('image/png') + \");background-repeat:repeat;\";\n }\n };\n /**\n * 销毁画布\n */\n\n\n Graph.prototype.destroy = function () {\n var _a, _b, _c, _d;\n\n Object(esm[\"each\"])(this.get('plugins'), function (plugin) {\n plugin.destroyPlugin();\n }); // destroy tooltip doms, removed when upgrade G6 4.0\n\n var tooltipDOMs = this.get('tooltips');\n\n if (tooltipDOMs) {\n for (var i = 0; i < tooltipDOMs.length; i++) {\n var container = tooltipDOMs[i];\n if (!container) continue;\n var parent_1 = container.parentElement;\n if (!parent_1) continue;\n parent_1.removeChild(container);\n }\n }\n\n (_a = this.get('eventController')) === null || _a === void 0 ? void 0 : _a.destroy();\n (_b = this.get('layoutController')) === null || _b === void 0 ? void 0 : _b.destroy(); // this.get('eventController').destroy();\n // this.get('itemController').destroy();\n // this.get('modeController').destroy();\n // this.get('viewController').destroy();\n // this.get('stateController').destroy();\n // this.get('canvas').destroy();\n\n (_c = this.get('graphWaterMarker')) === null || _c === void 0 ? void 0 : _c.destroy();\n (_d = document.querySelector('.g6-graph-watermarker')) === null || _d === void 0 ? void 0 : _d.remove();\n\n _super.prototype.destroy.call(this);\n };\n\n return Graph;\n}(graph_graph);\n\n/* harmony default export */ var es_graph_graph = (graph_Graph);\n// CONCATENATED MODULE: ./node_modules/@antv/g6-pc/es/graph/tree-graph.js\n\n\n\n\n\nvar tree_graph_radialLayout = es_util.radialLayout,\n tree_graph_traverseTree = es_util.traverseTree;\n\nvar tree_graph_TreeGraph =\n/** @class */\nfunction (_super) {\n Object(tslib_es6[\"__extends\"])(TreeGraph, _super);\n\n function TreeGraph(cfg) {\n var _this = _super.call(this, cfg) || this;\n\n _this.layoutAnimating = false; // 用于缓存动画结束后需要删除的节点\n\n _this.set('removeList', []);\n\n _this.set('layoutMethod', _this.getLayout());\n\n return _this;\n }\n /**\n * 通过 Layout 配置获取布局配置\n */\n\n\n TreeGraph.prototype.getLayout = function () {\n var layout = this.get('layout');\n\n if (!layout) {\n return null;\n }\n\n if (typeof layout === 'function') {\n return layout;\n }\n\n if (!layout.type) {\n layout.type = 'dendrogram';\n }\n\n if (!layout.direction) {\n layout.direction = 'TB';\n }\n\n if (layout.radial) {\n return function (data) {\n var layoutData = hierarchy_default.a[layout.type](data, layout);\n tree_graph_radialLayout(layoutData);\n return layoutData;\n };\n }\n\n return function (data) {\n return hierarchy_default.a[layout.type](data, layout);\n };\n };\n /**\n * 返回指定节点在树图数据中的索引\n * @param children 树图数据\n * @param child 树图中某一个 Item 的数据\n */\n\n\n TreeGraph.indexOfChild = function (children, id) {\n var index = -1; // eslint-disable-next-line consistent-return\n\n Object(esm[\"each\"])(children, function (former, i) {\n if (id === former.id) {\n index = i;\n return false;\n }\n });\n return index;\n };\n\n TreeGraph.prototype.getDefaultCfg = function () {\n var cfg = _super.prototype.getDefaultCfg.call(this); // 树图默认打开动画\n\n\n cfg.animate = true;\n return cfg;\n };\n /**\n * 向🌲树中添加数据\n * @param treeData 树图数据\n * @param parent 父节点实例\n * @param animate 是否开启动画\n */\n\n\n TreeGraph.prototype.innerAddChild = function (treeData, parent, animate) {\n var self = this;\n var model = treeData.data;\n\n if (model) {\n // model 中应存储真实的数据,特别是真实的 children\n model.x = treeData.x;\n model.y = treeData.y;\n model.depth = treeData.depth;\n }\n\n var node = self.addItem('node', model, false);\n\n if (parent) {\n node.set('parent', parent);\n\n if (animate) {\n var origin_1 = parent.get('originAttrs');\n\n if (origin_1) {\n node.set('originAttrs', origin_1);\n } else {\n var parentModel = parent.getModel();\n node.set('originAttrs', {\n x: parentModel.x,\n y: parentModel.y\n });\n }\n }\n\n var childrenList = parent.get('children');\n\n if (!childrenList) {\n parent.set('children', [node]);\n } else {\n childrenList.push(node);\n }\n\n self.addItem('edge', {\n source: parent.get('id'),\n target: node.get('id'),\n id: parent.get('id') + \":\" + node.get('id')\n }, false);\n } // 渲染到视图上应参考布局的children, 避免多绘制了收起的节点\n\n\n Object(esm[\"each\"])(treeData.children || [], function (child) {\n self.innerAddChild(child, node, animate);\n });\n self.emit('afteraddchild', {\n item: node,\n parent: parent\n });\n return node;\n };\n /**\n * 将数据上的变更转换到视图上\n * @param data\n * @param parent\n * @param animate\n */\n\n\n TreeGraph.prototype.innerUpdateChild = function (data, parent, animate) {\n var self = this;\n var current = self.findById(data.id); // 若子树不存在,整体添加即可\n\n if (!current) {\n self.innerAddChild(data, parent, animate);\n return;\n } // 更新新节点下所有子节点\n\n\n Object(esm[\"each\"])(data.children || [], function (child) {\n self.innerUpdateChild(child, current, animate);\n }); // 用现在节点的children实例来删除移除的子节点\n\n var children = current.get('children');\n\n if (children) {\n var len = children.length;\n\n if (len > 0) {\n for (var i = children.length - 1; i >= 0; i--) {\n var child = children[i].getModel();\n\n if (TreeGraph.indexOfChild(data.children || [], child.id) === -1) {\n self.innerRemoveChild(child.id, {\n x: data.x,\n y: data.y\n }, animate); // 更新父节点下缓存的子节点 item 实例列表\n\n children.splice(i, 1);\n }\n }\n }\n }\n\n var oriX;\n var oriY;\n\n if (current.get('originAttrs')) {\n oriX = current.get('originAttrs').x;\n oriY = current.get('originAttrs').y;\n }\n\n var model = current.getModel();\n\n if (animate) {\n // 如果有动画,先缓存节点运动再更新节点\n current.set('originAttrs', {\n x: model.x,\n y: model.y\n });\n }\n\n current.set('model', data.data);\n\n if (oriX !== data.x || oriY !== data.y) {\n current.updatePosition({\n x: data.x,\n y: data.y\n });\n }\n };\n /**\n * 删除子节点Item对象\n * @param id\n * @param to\n * @param animate\n */\n\n\n TreeGraph.prototype.innerRemoveChild = function (id, to, animate) {\n var self = this;\n var node = self.findById(id);\n\n if (!node) {\n return;\n }\n\n Object(esm[\"each\"])(node.get('children'), function (child) {\n self.innerRemoveChild(child.getModel().id, to, animate);\n });\n\n if (animate) {\n var model = node.getModel();\n node.set('to', to);\n node.set('originAttrs', {\n x: model.x,\n y: model.y\n });\n self.get('removeList').push(node);\n } else {\n self.removeItem(node, false);\n }\n };\n /**\n * 更新数据模型,差量更新并重新渲染\n * @param {object} data 数据模型\n */\n\n\n TreeGraph.prototype.changeData = function (data) {\n var self = this; // 更改数据源后,取消所有状态\n\n this.getNodes().map(function (node) {\n return self.clearItemStates(node);\n });\n this.getEdges().map(function (edge) {\n return self.clearItemStates(edge);\n });\n\n if (data) {\n self.data(data);\n self.render();\n } else {\n self.layout(this.get('fitView'));\n }\n };\n /**\n * 已更名为 updateLayout,为保持兼容暂且保留。\n * 更改并应用树布局算法\n * @param {object} layout 布局算法\n */\n\n\n TreeGraph.prototype.changeLayout = function (layout) {\n // eslint-disable-next-line no-console\n console.warn('Please call updateLayout instead of changeLayout. changeLayout will be discarded soon');\n var self = this;\n self.updateLayout(layout);\n };\n /**\n * 更改并应用树布局算法\n * @param {object} layout 布局算法\n */\n\n\n TreeGraph.prototype.updateLayout = function (layout) {\n var self = this;\n\n if (!layout) {\n // eslint-disable-next-line no-console\n console.warn('layout cannot be null');\n return;\n }\n\n self.set('layout', layout);\n self.set('layoutMethod', self.getLayout());\n self.layout();\n };\n /**\n * 已更名为 layout,为保持兼容暂且保留。\n * 根据目前的 data 刷新布局,更新到画布上。用于变更数据之后刷新视图。\n * @param {boolean} fitView 更新布局时是否需要适应窗口\n */\n\n\n TreeGraph.prototype.refreshLayout = function (fitView) {\n // eslint-disable-next-line no-console\n console.warn('Please call layout instead of refreshLayout. refreshLayout will be discarded soon');\n var self = this;\n self.layout(fitView);\n };\n /**\n * 根据目前的 data 刷新布局,更新到画布上。用于变更数据之后刷新视图。\n * @param {boolean} fitView 更新布局时是否需要适应窗口\n */\n\n\n TreeGraph.prototype.layout = function (fitView) {\n var self = this;\n var data = self.get('data');\n var layoutMethod = self.get('layoutMethod');\n var layoutData = layoutMethod ? layoutMethod(data, self.get('layout')) : data;\n var animate = self.get('animate');\n self.emit('beforerefreshlayout', {\n data: data,\n layoutData: layoutData\n });\n self.emit('beforelayout');\n self.innerUpdateChild(layoutData, undefined, animate);\n\n if (fitView) {\n var viewController = self.get('viewController');\n viewController.fitView();\n }\n\n if (!animate) {\n // 如果没有动画,目前仅更新了节点的位置,刷新一下边的样式\n self.refresh();\n self.paint();\n } else {\n self.layoutAnimate(layoutData);\n }\n\n self.emit('afterrefreshlayout', {\n data: data,\n layoutData: layoutData\n });\n self.emit('afterlayout');\n };\n /**\n * 添加子树到对应 id 的节点\n * @param {TreeGraphData} data 子树数据模型\n * @param {string} parent 子树的父节点id\n */\n\n\n TreeGraph.prototype.addChild = function (data, parent) {\n var self = this;\n self.emit('beforeaddchild', {\n model: data,\n parent: parent\n }); // 将数据添加到源数据中,走changeData方法\n\n if (!Object(esm[\"isString\"])(parent)) {\n parent = parent.get('id');\n }\n\n var parentData = self.findDataById(parent);\n\n if (parentData) {\n if (!parentData.children) {\n parentData.children = [];\n }\n\n parentData.children.push(data);\n self.changeData();\n }\n };\n /**\n * 更新某个节点下的所有子节点\n * @param {TreeGraphData[]} data 子树数据模型集合\n * @param {string} parent 子树的父节点id\n */\n\n\n TreeGraph.prototype.updateChildren = function (data, parentId) {\n var self = this; // 如果没有父节点或找不到该节点,是全量的更新,直接重置data\n\n if (!parentId || !self.findById(parentId)) {\n console.warn(\"Update children failed! There is no node with id '\" + parentId + \"'\");\n return;\n }\n\n var parentModel = self.findDataById(parentId);\n parentModel.children = data;\n self.changeData();\n };\n /**\n * 更新源数据,差量更新子树\n * @param {TreeGraphData} data 子树数据模型\n * @param {string} parentId 子树的父节点id\n */\n\n\n TreeGraph.prototype.updateChild = function (data, parentId) {\n var self = this; // 如果没有父节点或找不到该节点,是全量的更新,直接重置data\n\n if (!parentId || !self.findById(parentId)) {\n self.changeData(data);\n return;\n }\n\n var parentModel = self.findDataById(parentId);\n var current = self.findById(data.id);\n\n if (!parentModel.children) {\n // 当 current 不存在时,children 为空数组\n parentModel.children = [];\n } // 如果不存在该节点,则添加\n\n\n if (!current) {\n parentModel.children.push(data);\n } else {\n var index = TreeGraph.indexOfChild(parentModel.children, data.id);\n parentModel.children[index] = data;\n }\n\n self.changeData();\n };\n /**\n * 删除子树\n * @param {string} id 子树根节点id\n */\n\n\n TreeGraph.prototype.removeChild = function (id) {\n var self = this;\n var node = self.findById(id);\n\n if (!node) {\n return;\n }\n\n var parent = node.get('parent');\n\n if (parent && !parent.destroyed) {\n var parentNode = self.findDataById(parent.get('id'));\n var siblings = parentNode && parentNode.children || [];\n var model = node.getModel();\n var index = TreeGraph.indexOfChild(siblings, model.id);\n siblings.splice(index, 1);\n }\n\n self.changeData();\n };\n /**\n * 根据id获取对应的源数据\n * @param {string} id 元素id\n * @param {TreeGraphData | undefined} parent 从哪个节点开始寻找,为空时从根节点开始查找\n * @return {TreeGraphData} 对应源数据\n */\n\n\n TreeGraph.prototype.findDataById = function (id, parent) {\n var self = this;\n\n if (!parent) {\n parent = self.get('data');\n }\n\n if (id === parent.id) {\n return parent;\n }\n\n var result = null; // eslint-disable-next-line consistent-return\n\n Object(esm[\"each\"])(parent.children || [], function (child) {\n if (child.id === id) {\n result = child;\n return false;\n }\n\n result = self.findDataById(id, child);\n\n if (result) {\n return false;\n }\n });\n return result;\n };\n /**\n * 布局动画接口,用于数据更新时做节点位置更新的动画\n * @param {TreeGraphData} data 更新的数据\n * @param {function} onFrame 定义节点位置更新时如何移动\n */\n\n\n TreeGraph.prototype.layoutAnimate = function (data, onFrame) {\n var self = this;\n var animateCfg = this.get('animateCfg');\n self.emit('beforeanimate', {\n data: data\n }); // 如果边中没有指定锚点,但是本身有锚点控制,在动画过程中保持锚点不变\n\n self.getEdges().forEach(function (edge) {\n var model = edge.get('model');\n\n if (!model.sourceAnchor) {\n model.sourceAnchor = edge.get('sourceAnchorIndex');\n }\n });\n this.get('canvas').animate(function (ratio) {\n tree_graph_traverseTree(data, function (child) {\n var node = self.findById(child.id); // 只有当存在node的时候才执行\n\n if (node) {\n var origin_2 = node.get('originAttrs');\n var model = node.get('model');\n\n if (!origin_2) {\n origin_2 = {\n x: model.x,\n y: model.y\n };\n node.set('originAttrs', origin_2);\n }\n\n if (onFrame) {\n var attrs = onFrame(node, ratio, origin_2, data);\n node.set('model', Object.assign(model, attrs));\n } else {\n model.x = origin_2.x + (child.x - origin_2.x) * ratio;\n model.y = origin_2.y + (child.y - origin_2.y) * ratio;\n }\n }\n\n return true;\n });\n Object(esm[\"each\"])(self.get('removeList'), function (node) {\n var model = node.getModel();\n var from = node.get('originAttrs');\n var to = node.get('to');\n model.x = from.x + (to.x - from.x) * ratio;\n model.y = from.y + (to.y - from.y) * ratio;\n });\n self.refreshPositions();\n }, {\n duration: animateCfg.duration,\n easing: animateCfg.ease,\n callback: function callback() {\n Object(esm[\"each\"])(self.getNodes(), function (node) {\n node.set('originAttrs', null);\n });\n Object(esm[\"each\"])(self.get('removeList'), function (node) {\n self.removeItem(node);\n });\n self.set('removeList', []);\n\n if (animateCfg.callback) {\n animateCfg.callback();\n }\n\n self.emit('afteranimate', {\n data: data\n });\n },\n delay: animateCfg.delay\n });\n };\n /**\n * 立即停止布局动画\n */\n\n\n TreeGraph.prototype.stopLayoutAnimate = function () {\n this.get('canvas').stopAnimate();\n this.emit('layoutanimateend', {\n data: this.get('data')\n });\n this.layoutAnimating = false;\n };\n /**\n * 是否在布局动画\n * @return {boolean} 是否有布局动画\n */\n\n\n TreeGraph.prototype.isLayoutAnimating = function () {\n return this.layoutAnimating;\n };\n /**\n * 根据data接口的数据渲染视图\n */\n\n\n TreeGraph.prototype.render = function () {\n var self = this;\n var data = self.get('data');\n\n if (!data || !Object(esm[\"isObject\"])(data) || !Object.keys(data).length) {\n throw new Error('data must be defined first');\n }\n\n self.clear();\n self.emit('beforerender');\n self.layout(this.get('fitView'));\n self.emit('afterrender');\n };\n /**\n * 导出图数据\n * @return {object} data\n */\n\n\n TreeGraph.prototype.save = function () {\n return this.get('data');\n };\n\n return TreeGraph;\n}(es_graph_graph);\n\n/* harmony default export */ var tree_graph = (tree_graph_TreeGraph);\n// CONCATENATED MODULE: ./node_modules/@antv/g6-plugin/es/base.js\n\n\nvar base_PluginBase =\n/** @class */\nfunction () {\n /**\n * 插件基类的构造函数\n * @param cfgs 插件的配置项\n */\n function PluginBase(cfgs) {\n this._cfgs = Object(esm[\"deepMix\"])(this.getDefaultCfgs(), cfgs);\n this._events = {};\n this.destroyed = false;\n }\n /**\n * 获取默认的插件配置\n */\n\n\n PluginBase.prototype.getDefaultCfgs = function () {\n return {};\n };\n /**\n * 初始化插件\n * @param graph IGraph 实例\n */\n\n\n PluginBase.prototype.initPlugin = function (graph) {\n var self = this;\n self.set('graph', graph);\n var events = self.getEvents();\n var bindEvents = {};\n Object(esm[\"each\"])(events, function (v, k) {\n var event = Object(esm[\"wrapBehavior\"])(self, v);\n bindEvents[k] = event;\n graph.on(k, event);\n });\n this._events = bindEvents;\n this.init();\n };\n /**\n * 获取插件中的事件和事件处理方法,供子类实现\n */\n\n\n PluginBase.prototype.getEvents = function () {\n return {};\n };\n /**\n * 获取配置项中的某个值\n * @param key 键值\n */\n\n\n PluginBase.prototype.get = function (key) {\n var _a;\n\n return (_a = this._cfgs) === null || _a === void 0 ? void 0 : _a[key];\n };\n /**\n * 将指定的值存储到 cfgs 中\n * @param key 键值\n * @param val 设置的值\n */\n\n\n PluginBase.prototype.set = function (key, val) {\n this._cfgs[key] = val;\n };\n /**\n * 销毁方法,供子类复写\n */\n\n\n PluginBase.prototype.destroy = function () {};\n /**\n * 销毁插件\n */\n\n\n PluginBase.prototype.destroyPlugin = function () {\n this.destroy();\n var graph = this.get('graph');\n var events = this._events;\n Object(esm[\"each\"])(events, function (v, k) {\n graph.off(k, v);\n });\n this._events = null;\n this._cfgs = null;\n this.destroyed = true;\n };\n\n return PluginBase;\n}();\n\n/* harmony default export */ var es_base = (base_PluginBase);\n// CONCATENATED MODULE: ./node_modules/@antv/g6-plugin/es/grid/index.js\nvar __extends = undefined && undefined.__extends || function () {\n var _extendStatics = function extendStatics(d, b) {\n _extendStatics = Object.setPrototypeOf || {\n __proto__: []\n } instanceof Array && function (d, b) {\n d.__proto__ = b;\n } || function (d, b) {\n for (var p in b) {\n if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p];\n }\n };\n\n return _extendStatics(d, b);\n };\n\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null) throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n\n _extendStatics(d, b);\n\n function __() {\n this.constructor = d;\n }\n\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n}();\n\n\n // 网格背景图片\n\nvar GRID_PNG = 'url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PHBhdHRlcm4gaWQ9ImdyaWQiIHdpZHRoPSI0MCIgaGVpZ2h0PSI0MCIgcGF0dGVyblVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHBhdGggZD0iTSAwIDEwIEwgNDAgMTAgTSAxMCAwIEwgMTAgNDAgTSAwIDIwIEwgNDAgMjAgTSAyMCAwIEwgMjAgNDAgTSAwIDMwIEwgNDAgMzAgTSAzMCAwIEwgMzAgNDAiIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2UwZTBlMCIgb3BhY2l0eT0iMC4yIiBzdHJva2Utd2lkdGg9IjEiLz48cGF0aCBkPSJNIDQwIDAgTCAwIDAgMCA0MCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZTBlMGUwIiBzdHJva2Utd2lkdGg9IjEiLz48L3BhdHRlcm4+PC9kZWZzPjxyZWN0IHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JpZCkiLz48L3N2Zz4=)';\n\nvar es_grid_Grid =\n/** @class */\nfunction (_super) {\n __extends(Grid, _super);\n\n function Grid(config) {\n return _super.call(this, config) || this;\n }\n\n Grid.prototype.getDefaultCfgs = function () {\n return {\n img: GRID_PNG,\n follow: true\n };\n };\n\n Grid.prototype.init = function () {\n var graph = this.get('graph');\n var graphContainer = graph.get('container');\n var canvas = graph.get('canvas').get('el');\n var img = this.get('img') || GRID_PNG;\n var container = createDom(\"
\");\n var gridContainer = createDom(\"\");\n this.set('container', container);\n this.set('gridContainer', gridContainer);\n this.positionInit();\n container.appendChild(gridContainer);\n graphContainer.insertBefore(container, canvas);\n };\n /** 定位信息初始化 */\n\n\n Grid.prototype.positionInit = function () {\n var graph = this.get('graph');\n var minZoom = graph.get('minZoom');\n var width = graph.get('width');\n var height = graph.get('height');\n modifyCSS(this.get('container'), {\n width: width + \"px\",\n height: height + \"px\"\n }); // 网格 40*40 需保证 (gridContainerWidth / 2) % 40 = 0 才能让网格线对齐左上角 故 * 80\n\n var gridContainerWidth = width * 80 / minZoom;\n var gridContainerHeight = height * 80 / minZoom;\n modifyCSS(this.get('gridContainer'), {\n width: gridContainerWidth + \"px\",\n height: gridContainerHeight + \"px\",\n left: \"-\" + gridContainerWidth / 2 + \"px\",\n top: \"-\" + gridContainerHeight / 2 + \"px\"\n });\n }; // class-methods-use-this\n\n\n Grid.prototype.getEvents = function () {\n return {\n viewportchange: 'updateGrid'\n };\n };\n /**\n * viewport change 事件的响应函数\n * @param param\n */\n\n\n Grid.prototype.updateGrid = function (param) {\n var gridContainer = this.get('gridContainer');\n var matrix = param.matrix;\n if (!matrix) matrix = [1, 0, 0, 0, 1, 0, 0, 0, 1];\n var isFollow = this.get('follow');\n var transform = \"matrix(\" + matrix[0] + \", \" + matrix[1] + \", \" + matrix[3] + \", \" + matrix[4] + \", \" + (isFollow ? matrix[6] : '0') + \", \" + (isFollow ? matrix[7] : '0') + \")\";\n modifyCSS(gridContainer, {\n transform: transform\n });\n };\n\n Grid.prototype.getContainer = function () {\n return this.get('container');\n };\n\n Grid.prototype.destroy = function () {\n var graph = this.get('graph');\n var graphContainer = graph.get('container');\n var container = this.get('container');\n graphContainer.removeChild(container);\n };\n\n return Grid;\n}(es_base);\n\n/* harmony default export */ var grid = (es_grid_Grid);\n// EXTERNAL MODULE: ./node_modules/insert-css/index.js\nvar insert_css = __webpack_require__(82);\nvar insert_css_default = /*#__PURE__*/__webpack_require__.n(insert_css);\n\n// CONCATENATED MODULE: ./node_modules/@antv/g6-plugin/es/menu/index.js\nvar menu_extends = undefined && undefined.__extends || function () {\n var _extendStatics = function extendStatics(d, b) {\n _extendStatics = Object.setPrototypeOf || {\n __proto__: []\n } instanceof Array && function (d, b) {\n d.__proto__ = b;\n } || function (d, b) {\n for (var p in b) {\n if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p];\n }\n };\n\n return _extendStatics(d, b);\n };\n\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null) throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n\n _extendStatics(d, b);\n\n function __() {\n this.constructor = d;\n }\n\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n}();\n\n\n\n\n\ntypeof document !== 'undefined' && insert_css_default()(\"\\n .g6-component-contextmenu {\\n border: 1px solid #e2e2e2;\\n border-radius: 4px;\\n font-size: 12px;\\n color: #545454;\\n background-color: rgba(255, 255, 255, 0.9);\\n padding: 10px 8px;\\n box-shadow: rgb(174, 174, 174) 0px 0px 10px;\\n }\\n .g6-contextmenu-ul {\\n padding: 0;\\n margin: 0;\\n list-style: none;\\n }\\n\\n\");\n\nvar menu_Menu =\n/** @class */\nfunction (_super) {\n menu_extends(Menu, _super);\n\n function Menu(config) {\n return _super.call(this, config) || this;\n }\n\n Menu.prototype.getDefaultCfgs = function () {\n return {\n offsetX: 6,\n offsetY: 6,\n handleMenuClick: undefined,\n // 指定菜单内容,function(e) {...}\n getContent: function getContent(e) {\n return \"\\n
    \\n
  • \\u83DC\\u5355\\u98791
  • \\n
  • \\u83DC\\u5355\\u98792
  • \\n
\\n \";\n },\n shouldBegin: function shouldBegin(e) {\n return true;\n },\n // 菜单隐藏事件\n onHide: function onHide() {\n return true;\n },\n itemTypes: ['node', 'edge', 'combo'],\n trigger: 'contextmenu'\n };\n }; // class-methods-use-this\n\n\n Menu.prototype.getEvents = function () {\n if (this.get('trigger') === 'click') {\n return {\n click: 'onMenuShow'\n };\n }\n\n return {\n contextmenu: 'onMenuShow'\n };\n };\n\n Menu.prototype.init = function () {\n var className = this.get('className');\n var menu = createDom(\"
\");\n modifyCSS(menu, {\n top: '0px',\n position: 'absolute',\n visibility: 'hidden'\n });\n var container = this.get('container');\n\n if (!container) {\n container = this.get('graph').get('container');\n }\n\n if (Object(esm[\"isString\"])(container)) {\n container = document.getElementById(container);\n }\n\n container.appendChild(menu);\n this.set('menu', menu);\n };\n\n Menu.prototype.onMenuShow = function (e) {\n var self = this;\n e.preventDefault();\n var itemTypes = this.get('itemTypes');\n\n if (!e.item) {\n if (itemTypes.indexOf('canvas') === -1) {\n self.onMenuHide();\n return;\n }\n } else {\n if (e.item && e.item.getType && itemTypes.indexOf(e.item.getType()) === -1) {\n self.onMenuHide();\n return;\n }\n }\n\n var shouldBegin = this.get('shouldBegin');\n if (!shouldBegin(e)) return;\n var menuDom = this.get('menu');\n var getContent = this.get('getContent');\n var graph = this.get('graph');\n var menu = getContent(e, graph);\n\n if (Object(esm[\"isString\"])(menu)) {\n menuDom.innerHTML = menu;\n } else {\n menuDom.innerHTML = menu.outerHTML;\n } // 清除之前监听的事件\n\n\n this.removeMenuEventListener();\n var handleMenuClick = this.get('handleMenuClick');\n\n if (handleMenuClick) {\n var handleMenuClickWrapper = function handleMenuClickWrapper(evt) {\n handleMenuClick(evt.target, e.item, graph);\n };\n\n this.set('handleMenuClickWrapper', handleMenuClickWrapper);\n menuDom.addEventListener('click', handleMenuClickWrapper);\n }\n\n var width = graph.get('width');\n var height = graph.get('height');\n var bbox = menuDom.getBoundingClientRect();\n var offsetX = this.get('offsetX') || 0;\n var offsetY = this.get('offsetY') || 0;\n var graphTop = graph.getContainer().offsetTop;\n var graphLeft = graph.getContainer().offsetLeft;\n var x = e.canvasX + graphLeft + offsetX;\n var y = e.canvasY + graphTop + offsetY; // when the menu is (part of) out of the canvas\n\n if (x + bbox.width > width) {\n x = e.canvasX - bbox.width - offsetX + graphLeft;\n }\n\n if (y + bbox.height > height) {\n y = e.canvasY - bbox.height - offsetY + graphTop;\n }\n\n modifyCSS(menuDom, {\n top: y + \"px\",\n left: x + \"px\",\n visibility: 'visible'\n }); // 左键单击会触发 body 上监听的 click 事件,导致菜单展示出来后又立即被隐藏了,需要过滤掉\n\n var triggeredByFirstClick = this.get('trigger') === 'click';\n\n var handler = function handler(evt) {\n if (triggeredByFirstClick) {\n triggeredByFirstClick = false;\n return;\n }\n\n self.onMenuHide();\n }; // 如果在页面中其他任意地方进行click, 隐去菜单\n\n\n document.body.addEventListener('click', handler);\n this.set('handler', handler);\n };\n\n Menu.prototype.removeMenuEventListener = function () {\n var handleMenuClickWrapper = this.get('handleMenuClickWrapper');\n var handler = this.get('handler');\n\n if (handleMenuClickWrapper) {\n var menuDom = this.get('menu');\n menuDom.removeEventListener('click', handleMenuClickWrapper);\n this.set('handleMenuClickWrapper', null);\n }\n\n if (handler) {\n document.body.removeEventListener('click', handler);\n }\n };\n\n Menu.prototype.onMenuHide = function () {\n var menuDom = this.get('menu');\n\n if (menuDom) {\n modifyCSS(menuDom, {\n visibility: 'hidden'\n });\n } // 隐藏菜单后需要移除事件监听\n\n\n this.removeMenuEventListener();\n };\n\n Menu.prototype.destroy = function () {\n var menu = this.get('menu');\n this.removeMenuEventListener();\n\n if (menu) {\n var container = this.get('container');\n\n if (!container) {\n container = this.get('graph').get('container');\n }\n\n if (Object(esm[\"isString\"])(container)) {\n container = document.getElementById(container);\n }\n\n container.removeChild(menu);\n }\n };\n\n return Menu;\n}(es_base);\n\n/* harmony default export */ var es_menu = (menu_Menu);\n// CONCATENATED MODULE: ./node_modules/@antv/g6-plugin/es/minimap/index.js\nvar minimap_extends = undefined && undefined.__extends || function () {\n var _extendStatics = function extendStatics(d, b) {\n _extendStatics = Object.setPrototypeOf || {\n __proto__: []\n } instanceof Array && function (d, b) {\n d.__proto__ = b;\n } || function (d, b) {\n for (var p in b) {\n if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p];\n }\n };\n\n return _extendStatics(d, b);\n };\n\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null) throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n\n _extendStatics(d, b);\n\n function __() {\n this.constructor = d;\n }\n\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n}();\n\nvar __assign = undefined && undefined.__assign || function () {\n __assign = Object.assign || function (t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n\n for (var p in s) {\n if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n }\n\n return t;\n };\n\n return __assign.apply(this, arguments);\n};\n\n\n\n\n\n\n\nvar minimap_max = Math.max;\nvar minimap_transform = matrix_util_esm[\"ext\"].transform;\nvar DEFAULT_MODE = 'default';\nvar KEYSHAPE_MODE = 'keyShape';\nvar DELEGATE_MODE = 'delegate';\nvar minimap_SVG = 'svg';\n\nvar minimap_MiniMap =\n/** @class */\nfunction (_super) {\n minimap_extends(MiniMap, _super);\n\n function MiniMap(config) {\n var _this = _super.call(this, config) || this;\n /**\n * 主图更新的监听函数,使用 debounce 减少渲染频率\n * e.g. 拖拽节点只会在松手后的 100ms 后执行 updateCanvas\n * e.g. render 时大量 addItem 也只会执行一次 updateCanvas\n */\n\n\n _this.handleUpdateCanvas = Object(esm[\"debounce\"])(function (event) {\n var self = _this;\n if (self.destroyed) return;\n self.updateCanvas();\n }, 100, false);\n return _this;\n }\n\n MiniMap.prototype.getDefaultCfgs = function () {\n return {\n container: null,\n className: 'g6-minimap',\n viewportClassName: 'g6-minimap-viewport',\n // Minimap 中默认展示和主图一样的内容,KeyShape 只展示节点和边的 key shape 部分,delegate表示展示自定义的rect,用户可自定义样式\n type: 'default',\n padding: 50,\n size: [200, 120],\n delegateStyle: {\n fill: '#40a9ff',\n stroke: '#096dd9'\n },\n refresh: true\n };\n };\n\n MiniMap.prototype.getEvents = function () {\n return {\n beforepaint: 'updateViewport',\n beforeanimate: 'disableRefresh',\n afteranimate: 'enableRefresh',\n viewportchange: 'disableOneRefresh'\n };\n }; // 若是正在进行动画,不刷新缩略图\n\n\n MiniMap.prototype.disableRefresh = function () {\n this.set('refresh', false);\n };\n\n MiniMap.prototype.enableRefresh = function () {\n this.set('refresh', true);\n this.updateCanvas();\n };\n\n MiniMap.prototype.disableOneRefresh = function () {\n this.set('viewportChange', true);\n };\n\n MiniMap.prototype.initViewport = function () {\n var _this = this;\n\n var cfgs = this._cfgs;\n var size = cfgs.size,\n graph = cfgs.graph;\n if (this.destroyed) return;\n var canvas = this.get('canvas');\n var containerDOM = canvas.get('container');\n var viewport = createDom(\"\\n \\n \");\n var isFireFox = navigator.userAgent.toLowerCase().indexOf('firefox') > -1; // 计算拖拽水平方向距离\n\n var x = 0; // 计算拖拽垂直方向距离\n\n var y = 0; // 是否在拖拽minimap的视口\n\n var dragging = false; // 缓存viewport当前对于画布的x\n\n var left = 0; // 缓存viewport当前对于画布的y\n\n var top = 0; // 缓存viewport当前宽度\n\n var width = 0; // 缓存viewport当前高度\n\n var height = 0;\n var ratio = 0;\n var zoom = 0;\n viewport.addEventListener('dragstart', function (e) {\n var _a, _b;\n\n if (e.dataTransfer) {\n var img = new Image();\n img.src = \"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' %3E%3Cpath /%3E%3C/svg%3E\";\n (_b = (_a = e.dataTransfer).setDragImage) === null || _b === void 0 ? void 0 : _b.call(_a, img, 0, 0);\n\n try {\n e.dataTransfer.setData('text/html', 'view-port-minimap');\n } catch (_c) {\n // support IE\n e.dataTransfer.setData('text', 'view-port-minimap');\n }\n }\n\n cfgs.refresh = false;\n\n if (e.target !== viewport) {\n return;\n } // 如果视口已经最大了,不需要拖拽\n\n\n var style = viewport.style;\n left = parseInt(style.left, 10);\n top = parseInt(style.top, 10);\n width = parseInt(style.width, 10);\n height = parseInt(style.height, 10);\n\n if (width > size[0] || height > size[1]) {\n return;\n }\n\n zoom = graph.getZoom();\n ratio = _this.get('ratio');\n dragging = true;\n x = e.clientX;\n y = e.clientY;\n }, false);\n viewport.addEventListener(isFireFox ? 'dragover' : 'drag', function (e) {\n if (!dragging || Object(esm[\"isNil\"])(e.clientX) || Object(esm[\"isNil\"])(e.clientY)) {\n return;\n }\n\n var dx = x - e.clientX;\n var dy = y - e.clientY; // 若视口移动到最左边或最右边了,仅移动到边界\n\n if (left - dx < 0 || left - dx + width >= size[0]) {\n dx = 0;\n } // 若视口移动到最上或最下边了,仅移动到边界\n\n\n if (top - dy < 0 || top - dy + height >= size[1]) {\n dy = 0;\n }\n\n left -= dx;\n top -= dy; // 先移动视口,避免移动到边上以后出现视口闪烁\n\n modifyCSS(viewport, {\n left: left + \"px\",\n top: top + \"px\"\n }); // graph 移动需要偏移量 dx/dy * 缩放比例才会得到正确的移动距离\n\n graph.translate(dx * zoom / ratio, dy * zoom / ratio);\n x = e.clientX;\n y = e.clientY;\n }, false);\n viewport.addEventListener('dragend', function () {\n dragging = false;\n cfgs.refresh = true;\n }, false);\n this.set('viewport', viewport);\n containerDOM.appendChild(viewport);\n };\n /**\n * 更新 viewport 视图\n */\n\n\n MiniMap.prototype.updateViewport = function () {\n if (this.destroyed) return;\n var ratio = this.get('ratio');\n var dx = this.get('dx');\n var dy = this.get('dy');\n var totaldx = this.get('totaldx');\n var totaldy = this.get('totaldy');\n var graph = this.get('graph');\n var size = this.get('size');\n var graphWidth = graph.get('width');\n var graphHeight = graph.get('height');\n var topLeft = graph.getPointByCanvas(0, 0);\n var bottomRight = graph.getPointByCanvas(graphWidth, graphHeight);\n var viewport = this.get('viewport');\n\n if (!viewport) {\n this.initViewport();\n } // viewport宽高,左上角点的计算\n\n\n var width = (bottomRight.x - topLeft.x) * ratio;\n var height = (bottomRight.y - topLeft.y) * ratio;\n var left = topLeft.x * ratio + totaldx;\n var top = topLeft.y * ratio + totaldy;\n var right = left + width;\n var bottom = top + height;\n\n if (left < 0) {\n width += left;\n left = 0;\n }\n\n if (right > size[0]) {\n width = width - (right - size[0]);\n }\n\n if (top < 0) {\n height += top;\n top = 0;\n }\n\n if (bottom > size[1]) {\n height = height - (bottom - size[1]);\n } // 缓存目前缩放比,在移动 minimap 视窗时就不用再计算大图的移动量\n\n\n this.set('ratio', ratio);\n var correctLeft = left + \"px\";\n var correctTop = top + \"px\";\n modifyCSS(viewport, {\n left: correctLeft,\n top: correctTop,\n width: width + \"px\",\n height: height + \"px\"\n });\n };\n /**\n * 将主图上的图形完全复制到小图\n */\n\n\n MiniMap.prototype.updateGraphShapes = function () {\n var graph = this._cfgs.graph;\n var canvas = this.get('canvas');\n var graphGroup = graph.get('group');\n if (graphGroup.destroyed) return;\n var clonedGroup = graphGroup.clone();\n clonedGroup.resetMatrix();\n canvas.clear();\n canvas.add(clonedGroup); // 当 renderer 是 svg,由于渲染引擎的 bug,这里需要将 visible 为 false 的元素手动隐藏\n\n var renderer = graph.get('renderer');\n\n if (renderer === minimap_SVG) {\n // 递归更新子元素\n this.updateVisible(clonedGroup);\n }\n }; // svg 在 canvas.add(clonedGroup) 之后会出现 visible 为 false 的元素被展示出来,需要递归更新\n\n\n MiniMap.prototype.updateVisible = function (ele) {\n var _this = this;\n\n if (!ele.isGroup() && !ele.get('visible')) {\n ele.hide();\n } else {\n var children = ele.get('children');\n if (!children || !children.length) return;\n children.forEach(function (child) {\n if (!child.get('visible')) child.hide();\n\n _this.updateVisible(child);\n });\n }\n }; // 仅在 minimap 上绘制 keyShape\n // FIXME 如果用户自定义绘制了其他内容,minimap上就无法画出\n\n\n MiniMap.prototype.updateKeyShapes = function () {\n var _this = this;\n\n var graph = this._cfgs.graph;\n var canvas = this.get('canvas');\n var group = canvas.get('children')[0] || canvas.addGroup();\n Object(esm[\"each\"])(graph.getEdges(), function (edge) {\n _this.updateOneEdgeKeyShape(edge, group);\n });\n Object(esm[\"each\"])(graph.getNodes(), function (node) {\n _this.updateOneNodeKeyShape(node, group);\n });\n var combos = graph.getCombos();\n\n if (combos && combos.length) {\n var comboGroup_1 = group.find(function (e) {\n return e.get('name') === 'comboGroup';\n }) || group.addGroup({\n name: 'comboGroup'\n });\n setTimeout(function () {\n if (_this.destroyed) return;\n Object(esm[\"each\"])(combos, function (combo) {\n _this.updateOneComboKeyShape(combo, comboGroup_1);\n });\n comboGroup_1 === null || comboGroup_1 === void 0 ? void 0 : comboGroup_1.sort();\n comboGroup_1 === null || comboGroup_1 === void 0 ? void 0 : comboGroup_1.toBack();\n\n _this.updateCanvas();\n }, 250);\n }\n\n this.clearDestroyedShapes();\n };\n /**\n * 增加/更新单个元素的 keyShape\n * @param item ICombo 实例\n */\n\n\n MiniMap.prototype.updateOneComboKeyShape = function (item, comboGroup) {\n if (this.destroyed) return;\n var itemMap = this.get('itemMap') || {}; // 差量更新 minimap 上的一个节点,对应主图的 item\n\n var mappedItem = itemMap[item.get('id')];\n var bbox = item.getBBox(); // 计算了节点父组矩阵的 bbox\n\n var cKeyShape = item.get('keyShape').clone();\n var keyShapeStyle = cKeyShape.attr();\n var attrs = {\n x: bbox.centerX,\n y: bbox.centerY\n };\n\n if (!mappedItem) {\n mappedItem = cKeyShape;\n comboGroup.add(mappedItem);\n } else {\n attrs = Object.assign(keyShapeStyle, attrs);\n }\n\n var shapeType = mappedItem.get('type');\n\n if (shapeType === 'rect' || shapeType === 'image') {\n attrs.x = bbox.minX;\n attrs.y = bbox.minY;\n }\n\n mappedItem.attr(attrs);\n if (!item.isVisible()) mappedItem.hide();else mappedItem.show();\n mappedItem.exist = true;\n var zIndex = item.getModel().depth;\n if (!isNaN(zIndex)) mappedItem.set('zIndex', zIndex);\n itemMap[item.get('id')] = mappedItem;\n this.set('itemMap', itemMap);\n };\n /**\n * 增加/更新单个元素的 keyShape\n * @param item INode 实例\n */\n\n\n MiniMap.prototype.updateOneNodeKeyShape = function (item, group) {\n var itemMap = this.get('itemMap') || {}; // 差量更新 minimap 上的一个节点,对应主图的 item\n\n var mappedItem = itemMap[item.get('id')];\n var bbox = item.getBBox(); // 计算了节点父组矩阵的 bbox\n\n var cKeyShape = item.get('keyShape').clone();\n var keyShapeStyle = cKeyShape.attr();\n var attrs = {\n x: bbox.centerX,\n y: bbox.centerY\n };\n\n if (!mappedItem) {\n mappedItem = cKeyShape;\n group.add(mappedItem);\n } else {\n attrs = Object.assign(keyShapeStyle, attrs);\n }\n\n var shapeType = mappedItem.get('type');\n\n if (shapeType === 'rect' || shapeType === 'image') {\n attrs.x = bbox.minX;\n attrs.y = bbox.minY;\n }\n\n mappedItem.attr(attrs);\n if (!item.isVisible()) mappedItem.hide();else mappedItem.show();\n mappedItem.exist = true;\n var zIndex = item.getModel().depth;\n if (!isNaN(zIndex)) mappedItem.set('zIndex', zIndex);\n itemMap[item.get('id')] = mappedItem;\n this.set('itemMap', itemMap);\n };\n /**\n * Minimap 中展示自定义的rect,支持用户自定义样式和节点大小\n */\n\n\n MiniMap.prototype.updateDelegateShapes = function () {\n var _this = this;\n\n var graph = this._cfgs.graph;\n var canvas = this.get('canvas');\n var group = canvas.get('children')[0] || canvas.addGroup(); // 差量更新 minimap 上的节点和边\n\n Object(esm[\"each\"])(graph.getEdges(), function (edge) {\n _this.updateOneEdgeKeyShape(edge, group);\n });\n Object(esm[\"each\"])(graph.getNodes(), function (node) {\n _this.updateOneNodeDelegateShape(node, group);\n });\n var combos = graph.getCombos();\n\n if (combos && combos.length) {\n var comboGroup_2 = group.find(function (e) {\n return e.get('name') === 'comboGroup';\n }) || group.addGroup({\n name: 'comboGroup'\n });\n setTimeout(function () {\n if (_this.destroyed) return;\n Object(esm[\"each\"])(combos, function (combo) {\n _this.updateOneComboKeyShape(combo, comboGroup_2);\n });\n comboGroup_2 === null || comboGroup_2 === void 0 ? void 0 : comboGroup_2.sort();\n comboGroup_2 === null || comboGroup_2 === void 0 ? void 0 : comboGroup_2.toBack();\n\n _this.updateCanvas();\n }, 250);\n }\n\n this.clearDestroyedShapes();\n };\n\n MiniMap.prototype.clearDestroyedShapes = function () {\n var itemMap = this.get('itemMap') || {};\n var keys = Object.keys(itemMap);\n if (!keys || keys.length === 0) return;\n\n for (var i = keys.length - 1; i >= 0; i--) {\n var shape = itemMap[keys[i]];\n var exist = shape.exist;\n shape.exist = false;\n\n if (!exist) {\n shape.remove();\n delete itemMap[keys[i]];\n }\n }\n };\n /**\n * 设置只显示 edge 的 keyShape\n * @param item IEdge 实例\n */\n\n\n MiniMap.prototype.updateOneEdgeKeyShape = function (item, group) {\n var itemMap = this.get('itemMap') || {}; // 差量更新 minimap 上的一个节点,对应主图的 item\n\n var mappedItem = itemMap[item.get('id')];\n\n if (mappedItem) {\n var path = item.get('keyShape').attr('path');\n mappedItem.attr('path', path);\n } else {\n mappedItem = item.get('keyShape').clone();\n group.add(mappedItem);\n }\n\n if (!item.isVisible()) mappedItem.hide();else mappedItem.show();\n mappedItem.exist = true;\n itemMap[item.get('id')] = mappedItem;\n this.set('itemMap', itemMap);\n };\n /**\n * Minimap 中展示自定义的 rect,支持用户自定义样式和节点大小\n * 增加/更新单个元素\n * @param item INode 实例\n */\n\n\n MiniMap.prototype.updateOneNodeDelegateShape = function (item, group) {\n var delegateStyle = this.get('delegateStyle');\n var itemMap = this.get('itemMap') || {}; // 差量更新 minimap 上的一个节点,对应主图的 item\n\n var mappedItem = itemMap[item.get('id')];\n var bbox = item.getBBox(); // 计算了节点父组矩阵的 bbox\n\n if (mappedItem) {\n var attrs = {\n x: bbox.minX,\n y: bbox.minY,\n width: bbox.width,\n height: bbox.height\n };\n mappedItem.attr(attrs);\n } else {\n mappedItem = group.addShape('rect', {\n attrs: __assign({\n x: bbox.minX,\n y: bbox.minY,\n width: bbox.width,\n height: bbox.height\n }, delegateStyle),\n name: 'minimap-node-shape'\n });\n }\n\n if (!item.isVisible()) mappedItem.hide();else mappedItem.show();\n mappedItem.exist = true;\n itemMap[item.get('id')] = mappedItem;\n this.set('itemMap', itemMap);\n };\n\n MiniMap.prototype.init = function () {\n this.initContainer();\n this.get('graph').on('afterupdateitem', this.handleUpdateCanvas);\n this.get('graph').on('afteritemstatechange', this.handleUpdateCanvas);\n this.get('graph').on('afteradditem', this.handleUpdateCanvas);\n this.get('graph').on('afterremoveitem', this.handleUpdateCanvas);\n this.get('graph').on('afterrender', this.handleUpdateCanvas);\n this.get('graph').on('afterlayout', this.handleUpdateCanvas);\n };\n /**\n * 初始化 Minimap 的容器\n */\n\n\n MiniMap.prototype.initContainer = function () {\n var self = this;\n var graph = self.get('graph');\n var size = self.get('size');\n var className = self.get('className');\n var parentNode = self.get('container');\n var container = createDom(\"
\");\n\n if (Object(esm[\"isString\"])(parentNode)) {\n parentNode = document.getElementById(parentNode);\n }\n\n if (parentNode) {\n parentNode.appendChild(container);\n } else {\n graph.get('container').appendChild(container);\n }\n\n self.set('container', container);\n var containerDOM = createDom('
');\n container.appendChild(containerDOM);\n containerDOM.addEventListener('dragenter', function (e) {\n e.preventDefault();\n });\n containerDOM.addEventListener('dragover', function (e) {\n e.preventDefault();\n });\n var canvas;\n var renderer = graph.get('renderer');\n\n if (renderer === minimap_SVG) {\n canvas = new g_svg_esm[\"Canvas\"]({\n container: containerDOM,\n width: size[0],\n height: size[1]\n });\n } else {\n canvas = new g_canvas_esm[\"Canvas\"]({\n container: containerDOM,\n width: size[0],\n height: size[1]\n });\n }\n\n self.set('canvas', canvas);\n self.updateCanvas();\n };\n\n MiniMap.prototype.updateCanvas = function () {\n if (this.destroyed) return; // 如果是在动画,则不刷新视图\n\n var isRefresh = this.get('refresh');\n\n if (!isRefresh) {\n return;\n }\n\n var graph = this.get('graph');\n\n if (graph.get('destroyed')) {\n return;\n } // 如果是视口变换,也不刷新视图,但是需要重置视口大小和位置\n\n\n if (this.get('viewportChange')) {\n this.set('viewportChange', false);\n this.updateViewport();\n }\n\n var size = this.get('size'); // 用户定义的 minimap size\n\n var canvas = this.get('canvas'); // minimap 的 canvas\n\n var type = this.get('type'); // minimap 的类型\n\n var padding = this.get('padding'); // 用户额定义的 minimap 的 padding\n\n if (canvas.destroyed) {\n return;\n }\n\n switch (type) {\n case DEFAULT_MODE:\n this.updateGraphShapes();\n break;\n\n case KEYSHAPE_MODE:\n this.updateKeyShapes();\n break;\n\n case DELEGATE_MODE:\n // 得到的节点直接带有 x 和 y,每个节点不存在父 group,即每个节点位置不由父 group 控制\n this.updateDelegateShapes();\n break;\n\n default:\n break;\n }\n\n var group = canvas.get('children')[0];\n if (!group) return;\n group.resetMatrix(); // 该 bbox 是准确的,不计算 matrix 的包围盒\n\n var bbox = group.getCanvasBBox();\n var graphBBox = graph.get('canvas').getCanvasBBox(); // 主图的 bbox\n\n var graphZoom = graph.getZoom() || 1;\n var width = graphBBox.width / graphZoom;\n var height = graphBBox.height / graphZoom;\n\n if (Number.isFinite(bbox.width)) {\n // 刷新后bbox可能会变,需要重置画布矩阵以缩放到合适的大小\n width = minimap_max(bbox.width, width);\n height = minimap_max(bbox.height, height);\n }\n\n width += 2 * padding;\n height += 2 * padding;\n var ratio = Math.min(size[0] / width, size[1] / height);\n var matrix = [1, 0, 0, 0, 1, 0, 0, 0, 1];\n var minX = 0;\n var minY = 0; // 平移到左上角\n\n if (Number.isFinite(bbox.minX)) {\n minX = -bbox.minX;\n }\n\n if (Number.isFinite(bbox.minY)) {\n minY = -bbox.minY;\n } // 缩放到适合视口后, 平移到画布中心\n\n\n var dx = (size[0] - (width - 2 * padding) * ratio) / 2;\n var dy = (size[1] - (height - 2 * padding) * ratio) / 2;\n matrix = minimap_transform(matrix, [['t', minX, minY], ['s', ratio, ratio], ['t', dx, dy] // 移动到画布中心\n ]);\n group.setMatrix(matrix); // 更新minimap视口\n\n this.set('ratio', ratio);\n this.set('totaldx', dx + minX * ratio);\n this.set('totaldy', dy + minY * ratio);\n this.set('dx', dx);\n this.set('dy', dy);\n this.updateViewport();\n };\n /**\n * 获取minimap的画布\n * @return {GCanvas} G的canvas实例\n */\n\n\n MiniMap.prototype.getCanvas = function () {\n return this.get('canvas');\n };\n /**\n * 获取minimap的窗口\n * @return {HTMLElement} 窗口的dom实例\n */\n\n\n MiniMap.prototype.getViewport = function () {\n return this.get('viewport');\n };\n /**\n * 获取minimap的容器dom\n * @return {HTMLElement} dom\n */\n\n\n MiniMap.prototype.getContainer = function () {\n return this.get('container');\n };\n\n MiniMap.prototype.destroy = function () {\n this.get('canvas').destroy();\n var container = this.get('container');\n container.parentNode.removeChild(container);\n };\n\n return MiniMap;\n}(es_base);\n\n/* harmony default export */ var minimap = (minimap_MiniMap);\n// CONCATENATED MODULE: ./node_modules/@antv/g6-plugin/es/bundling/index.js\nvar bundling_extends = undefined && undefined.__extends || function () {\n var _extendStatics = function extendStatics(d, b) {\n _extendStatics = Object.setPrototypeOf || {\n __proto__: []\n } instanceof Array && function (d, b) {\n d.__proto__ = b;\n } || function (d, b) {\n for (var p in b) {\n if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p];\n }\n };\n\n return _extendStatics(d, b);\n };\n\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null) throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n\n _extendStatics(d, b);\n\n function __() {\n this.constructor = d;\n }\n\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n}();\n\n\n\nfunction getEucliDis(pointA, pointB, eps) {\n var vx = pointA.x - pointB.x;\n var vy = pointA.y - pointB.y;\n\n if (!eps || Math.abs(vx) > eps || Math.abs(vy) > eps) {\n return Math.sqrt(vx * vx + vy * vy);\n }\n\n return eps;\n}\n\nfunction getDotProduct(ei, ej) {\n return ei.x * ej.x + ei.y * ej.y;\n}\n\nfunction projectPointToEdge(p, e) {\n var k = (e.source.y - e.target.y) / (e.source.x - e.target.x);\n var x = (k * k * e.source.x + k * (p.y - e.source.y) + p.x) / (k * k + 1);\n var y = k * (x - e.source.x) + e.source.y;\n return {\n x: x,\n y: y\n };\n}\n\nvar Bundling =\n/** @class */\nfunction (_super) {\n bundling_extends(Bundling, _super);\n\n function Bundling(config) {\n return _super.call(this, config) || this;\n }\n\n Bundling.prototype.getDefaultCfgs = function () {\n return {\n edgeBundles: [],\n edgePoints: [],\n K: 0.1,\n lambda: 0.1,\n divisions: 1,\n divRate: 2,\n cycles: 6,\n iterations: 90,\n iterRate: 0.6666667,\n bundleThreshold: 0.6,\n eps: 1e-6,\n onLayoutEnd: function onLayoutEnd() {},\n onTick: function onTick() {}\n };\n };\n\n Bundling.prototype.init = function () {\n var graph = this.get('graph');\n var onTick = this.get('onTick');\n\n var tick = function tick() {\n if (onTick) {\n onTick();\n }\n\n graph.refreshPositions();\n };\n\n this.set('tick', tick);\n };\n\n Bundling.prototype.bundling = function (data) {\n var self = this;\n self.set('data', data); // 如果正在布局,忽略布局请求\n\n if (self.isTicking()) {\n return;\n }\n\n var edges = data.edges || [];\n var nodes = data.nodes || [];\n var nodeIdMap = {};\n var error = false;\n nodes.forEach(function (node) {\n if (node.x === null || !node.y === null || node.x === undefined || !node.y === undefined) {\n error = true;\n }\n\n nodeIdMap[node.id] = node;\n });\n if (error) throw new Error('please layout the graph or assign x and y for nodes first');\n self.set('nodeIdMap', nodeIdMap); // subdivide each edges\n\n var divisions = self.get('divisions');\n var divRate = self.get('divRate');\n var edgePoints = self.divideEdges(divisions);\n self.set('edgePoints', edgePoints); // compute the bundles\n\n var edgeBundles = self.getEdgeBundles();\n self.set('edgeBundles', edgeBundles); // iterations\n\n var C = self.get('cycles');\n var iterations = self.get('iterations');\n var iterRate = self.get('iterRate');\n var lambda = self.get('lambda');\n\n for (var i = 0; i < C; i++) {\n var _loop_1 = function _loop_1(j) {\n var forces = [];\n edges.forEach(function (e, k) {\n if (e.source === e.target) return;\n var source = nodeIdMap[e.source];\n var target = nodeIdMap[e.target];\n forces[k] = self.getEdgeForces({\n source: source,\n target: target\n }, k, divisions, lambda);\n\n for (var p = 0; p < divisions + 1; p++) {\n edgePoints[k][p].x += forces[k][p].x;\n edgePoints[k][p].y += forces[k][p].y;\n }\n });\n };\n\n for (var j = 0; j < iterations; j++) {\n _loop_1(j);\n } // parameters for nex cycle\n\n\n lambda = lambda / 2;\n divisions *= divRate;\n iterations *= iterRate;\n edgePoints = self.divideEdges(divisions);\n self.set('edgePoints', edgePoints);\n } // change the edges according to edgePoints\n\n\n edges.forEach(function (e, i) {\n if (e.source === e.target) return;\n e.type = 'polyline';\n e.controlPoints = edgePoints[i].slice(1, edgePoints[i].length - 1);\n });\n var graph = self.get('graph');\n graph.refresh();\n };\n\n Bundling.prototype.updateBundling = function (cfg) {\n var self = this;\n var data = cfg.data;\n\n if (data) {\n self.set('data', data);\n }\n\n if (self.get('ticking')) {\n self.set('ticking', false);\n }\n\n Object.keys(cfg).forEach(function (key) {\n self.set(key, cfg[key]);\n });\n\n if (cfg.onTick) {\n var graph_1 = this.get('graph');\n self.set('tick', function () {\n cfg.onTick();\n graph_1.refresh();\n });\n }\n\n self.bundling(data);\n };\n\n Bundling.prototype.divideEdges = function (divisions) {\n var self = this;\n var edges = self.get('data').edges;\n var nodeIdMap = self.get('nodeIdMap');\n var edgePoints = self.get('edgePoints');\n if (!edgePoints || edgePoints === undefined) edgePoints = [];\n edges.forEach(function (edge, i) {\n if (!edgePoints[i] || edgePoints[i] === undefined) {\n edgePoints[i] = [];\n }\n\n var source = nodeIdMap[edge.source];\n var target = nodeIdMap[edge.target];\n\n if (divisions === 1) {\n edgePoints[i].push({\n x: source.x,\n y: source.y\n }); // source\n\n edgePoints[i].push({\n x: 0.5 * (source.x + target.x),\n y: 0.5 * (source.y + target.y)\n }); // mid\n\n edgePoints[i].push({\n x: target.x,\n y: target.y\n }); // target\n } else {\n var edgeLength = 0;\n\n if (!edgePoints[i] || edgePoints[i] === []) {\n // it is a straight line\n edgeLength = getEucliDis({\n x: source.x,\n y: source.y\n }, {\n x: target.x,\n y: target.y\n });\n } else {\n edgeLength = self.getEdgeLength(edgePoints[i]);\n }\n\n var divisionLength_1 = edgeLength / (divisions + 1);\n var currentDivisonLength_1 = divisionLength_1;\n var newEdgePoints_1 = [{\n x: source.x,\n y: source.y\n }]; // source\n\n edgePoints[i].forEach(function (ep, j) {\n if (j === 0) return;\n var oriDivisionLength = getEucliDis(ep, edgePoints[i][j - 1]);\n\n while (oriDivisionLength > currentDivisonLength_1) {\n var ratio = currentDivisonLength_1 / oriDivisionLength;\n var edgePoint = {\n x: edgePoints[i][j - 1].x,\n y: edgePoints[i][j - 1].y\n };\n edgePoint.x += ratio * (ep.x - edgePoints[i][j - 1].x);\n edgePoint.y += ratio * (ep.y - edgePoints[i][j - 1].y);\n newEdgePoints_1.push(edgePoint);\n oriDivisionLength -= currentDivisonLength_1;\n currentDivisonLength_1 = divisionLength_1;\n }\n\n currentDivisonLength_1 -= oriDivisionLength;\n });\n newEdgePoints_1.push({\n x: target.x,\n y: target.y\n }); // target\n\n edgePoints[i] = newEdgePoints_1;\n }\n });\n return edgePoints;\n };\n /**\n * 计算边的长度\n * @param points\n */\n\n\n Bundling.prototype.getEdgeLength = function (points) {\n var length = 0;\n points.forEach(function (p, i) {\n if (i === 0) return;\n length += getEucliDis(p, points[i - 1]);\n });\n return length;\n };\n\n Bundling.prototype.getEdgeBundles = function () {\n var self = this;\n var data = self.get('data');\n var edges = data.edges || [];\n var bundleThreshold = self.get('bundleThreshold');\n var nodeIdMap = self.get('nodeIdMap');\n var edgeBundles = self.get('edgeBundles');\n if (!edgeBundles) edgeBundles = [];\n edges.forEach(function (e, i) {\n if (!edgeBundles[i] || edgeBundles[i] === undefined) {\n edgeBundles[i] = [];\n }\n });\n edges.forEach(function (ei, i) {\n var iSource = nodeIdMap[ei.source];\n var iTarget = nodeIdMap[ei.target];\n edges.forEach(function (ej, j) {\n if (j <= i) return;\n var jSource = nodeIdMap[ej.source];\n var jTarget = nodeIdMap[ej.target];\n var score = self.getBundleScore({\n source: iSource,\n target: iTarget\n }, {\n source: jSource,\n target: jTarget\n });\n\n if (score >= bundleThreshold) {\n edgeBundles[i].push(j);\n edgeBundles[j].push(i);\n }\n });\n });\n return edgeBundles;\n };\n\n Bundling.prototype.getBundleScore = function (ei, ej) {\n var self = this;\n ei.vx = ei.target.x - ei.source.x;\n ei.vy = ei.target.y - ei.source.y;\n ej.vx = ej.target.x - ej.source.x;\n ej.vy = ej.target.y - ej.source.y;\n ei.length = getEucliDis({\n x: ei.source.x,\n y: ei.source.y\n }, {\n x: ei.target.x,\n y: ei.target.y\n });\n ej.length = getEucliDis({\n x: ej.source.x,\n y: ej.source.y\n }, {\n x: ej.target.x,\n y: ej.target.y\n }); // angle score\n\n var aScore = self.getAngleScore(ei, ej); // scale score\n\n var sScore = self.getScaleScore(ei, ej); // position score\n\n var pScore = self.getPositionScore(ei, ej); // visibility socre\n\n var vScore = self.getVisibilityScore(ei, ej);\n return aScore * sScore * pScore * vScore;\n };\n\n Bundling.prototype.getAngleScore = function (ei, ej) {\n var dotProduct = getDotProduct({\n x: ei.vx,\n y: ei.vy\n }, {\n x: ej.vx,\n y: ej.vy\n });\n return dotProduct / (ei.length * ej.length);\n };\n\n Bundling.prototype.getScaleScore = function (ei, ej) {\n var aLength = (ei.length + ej.length) / 2;\n var score = 2 / (aLength / Math.min(ei.length, ej.length) + Math.max(ei.length, ej.length) / aLength);\n return score;\n };\n\n Bundling.prototype.getPositionScore = function (ei, ej) {\n var aLength = (ei.length + ej.length) / 2;\n var iMid = {\n x: (ei.source.x + ei.target.x) / 2,\n y: (ei.source.y + ei.target.y) / 2\n };\n var jMid = {\n x: (ej.source.x + ej.target.x) / 2,\n y: (ej.source.y + ej.target.y) / 2\n };\n var distance = getEucliDis(iMid, jMid);\n return aLength / (aLength + distance);\n };\n\n Bundling.prototype.getVisibilityScore = function (ei, ej) {\n var vij = this.getEdgeVisibility(ei, ej);\n var vji = this.getEdgeVisibility(ej, ei);\n return vij < vji ? vij : vji;\n };\n\n Bundling.prototype.getEdgeVisibility = function (ei, ej) {\n var ps = projectPointToEdge(ej.source, ei);\n var pt = projectPointToEdge(ej.target, ei);\n var pMid = {\n x: (ps.x + pt.x) / 2,\n y: (ps.y + pt.y) / 2\n };\n var iMid = {\n x: (ei.source.x + ei.target.x) / 2,\n y: (ei.source.y + ei.target.y) / 2\n };\n return Math.max(0, 1 - 2 * getEucliDis(pMid, iMid) / getEucliDis(ps, pt));\n };\n\n Bundling.prototype.getEdgeForces = function (e, eidx, divisions, lambda) {\n var self = this;\n var edgePoints = self.get('edgePoints');\n var K = self.get('K');\n var kp = K / (getEucliDis(e.source, e.target) * (divisions + 1));\n var edgePointForces = [{\n x: 0,\n y: 0\n }];\n\n for (var i = 1; i < divisions; i++) {\n var force = {\n x: 0,\n y: 0\n };\n var spring = self.getSpringForce({\n pre: edgePoints[eidx][i - 1],\n cur: edgePoints[eidx][i],\n next: edgePoints[eidx][i + 1]\n }, kp);\n var electrostatic = self.getElectrostaticForce(i, eidx);\n force.x = lambda * (spring.x + electrostatic.x);\n force.y = lambda * (spring.y + electrostatic.y);\n edgePointForces.push(force);\n }\n\n edgePointForces.push({\n x: 0,\n y: 0\n });\n return edgePointForces;\n };\n\n Bundling.prototype.getSpringForce = function (divisions, kp) {\n var x = divisions.pre.x + divisions.next.x - 2 * divisions.cur.x;\n var y = divisions.pre.y + divisions.next.y - 2 * divisions.cur.y;\n x *= kp;\n y *= kp;\n return {\n x: x,\n y: y\n };\n };\n\n Bundling.prototype.getElectrostaticForce = function (pidx, eidx) {\n var self = this;\n var eps = self.get('eps');\n var edgeBundles = self.get('edgeBundles');\n var edgePoints = self.get('edgePoints');\n var edgeBundle = edgeBundles[eidx];\n var resForce = {\n x: 0,\n y: 0\n };\n edgeBundle.forEach(function (eb) {\n var force = {\n x: edgePoints[eb][pidx].x - edgePoints[eidx][pidx].x,\n y: edgePoints[eb][pidx].y - edgePoints[eidx][pidx].y\n };\n\n if (Math.abs(force.x) > eps || Math.abs(force.y) > eps) {\n var length_1 = getEucliDis(edgePoints[eb][pidx], edgePoints[eidx][pidx]);\n var diff = 1 / length_1;\n resForce.x += force.x * diff;\n resForce.y += force.y * diff;\n }\n });\n return resForce;\n };\n\n Bundling.prototype.isTicking = function () {\n return this.get('ticking');\n };\n\n Bundling.prototype.getSimulation = function () {\n return this.get('forceSimulation');\n };\n\n Bundling.prototype.destroy = function () {\n if (this.get('ticking')) {\n this.getSimulation().stop();\n }\n\n _super.prototype.destroy.call(this);\n };\n\n return Bundling;\n}(es_base);\n\n/* harmony default export */ var bundling = (Bundling);\n// CONCATENATED MODULE: ./node_modules/@antv/g6-plugin/es/fisheye/index.js\nvar fisheye_extends = undefined && undefined.__extends || function () {\n var _extendStatics = function extendStatics(d, b) {\n _extendStatics = Object.setPrototypeOf || {\n __proto__: []\n } instanceof Array && function (d, b) {\n d.__proto__ = b;\n } || function (d, b) {\n for (var p in b) {\n if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p];\n }\n };\n\n return _extendStatics(d, b);\n };\n\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null) throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n\n _extendStatics(d, b);\n\n function __() {\n this.constructor = d;\n }\n\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n}();\n\nvar fisheye_assign = undefined && undefined.__assign || function () {\n fisheye_assign = Object.assign || function (t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n\n for (var p in s) {\n if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n }\n\n return t;\n };\n\n return fisheye_assign.apply(this, arguments);\n};\n\n\n\nvar DELTA = 0.05;\nvar lensDelegateStyle = {\n stroke: '#000',\n strokeOpacity: 0.8,\n lineWidth: 2,\n fillOpacity: 0.1,\n fill: '#ccc'\n};\n\nvar fisheye_Fisheye =\n/** @class */\nfunction (_super) {\n fisheye_extends(Fisheye, _super);\n\n function Fisheye(config) {\n return _super.call(this, config) || this;\n }\n\n Fisheye.prototype.getDefaultCfgs = function () {\n return {\n trigger: 'mousemove',\n d: 1.5,\n r: 300,\n delegateStyle: Object(esm[\"clone\"])(lensDelegateStyle),\n showLabel: false,\n maxD: 5,\n minD: 0,\n scaleRBy: 'unset',\n scaleDBy: 'unset',\n showDPercent: true\n };\n }; // class-methods-use-this\n\n\n Fisheye.prototype.getEvents = function () {\n var events;\n\n switch (this.get('trigger')) {\n case 'click':\n events = {\n click: 'magnify'\n };\n break;\n\n case 'drag':\n events = {\n click: 'createDelegate'\n };\n break;\n\n default:\n events = {\n mousemove: 'magnify'\n };\n break;\n }\n\n return events;\n };\n\n Fisheye.prototype.init = function () {\n var self = this;\n var r = self.get('r');\n self.set('cachedMagnifiedModels', []);\n self.set('cachedOriginPositions', {});\n self.set('r2', r * r);\n var d = self.get('d');\n self.set('molecularParam', (d + 1) * r);\n }; // Create the delegate when the trigger is drag\n\n\n Fisheye.prototype.createDelegate = function (e) {\n var _this = this;\n\n var self = this;\n var lensDelegate = self.get('delegate');\n\n if (!lensDelegate || lensDelegate.destroyed) {\n self.magnify(e);\n lensDelegate = self.get('delegate'); // drag to move the lens\n\n lensDelegate.on('dragstart', function (evt) {\n self.set('delegateCenterDiff', {\n x: lensDelegate.attr('x') - evt.x,\n y: lensDelegate.attr('y') - evt.y\n });\n });\n lensDelegate.on('drag', function (evt) {\n self.magnify(evt);\n }); // 绑定调整范围(r)和缩放系数(d)的监听\n // 由于 drag 用于改变 lens 位置, 因此在此模式下, drag 不能用于调整 r 和 d\n // scaling d\n\n if (this.get('scaleDBy') === 'wheel') {\n lensDelegate.on('mousewheel', function (evt) {\n _this.scaleDByWheel(evt);\n });\n } // scaling r\n\n\n if (this.get('scaleRBy') === 'wheel') {\n lensDelegate.on('mousewheel', function (evt) {\n self.scaleRByWheel(evt);\n });\n }\n }\n };\n /**\n * Scale the range by wheel\n * @param e mouse wheel event\n */\n\n\n Fisheye.prototype.scaleRByWheel = function (e) {\n var self = this;\n if (!e || !e.originalEvent) return;\n if (e.preventDefault) e.preventDefault();\n var graph = self.get('graph');\n var ratio;\n var lensDelegate = self.get('delegate');\n var lensCenter = lensDelegate ? {\n x: lensDelegate.attr('x'),\n y: lensDelegate.attr('y')\n } : undefined;\n var mousePos = lensCenter || graph.getPointByClient(e.clientX, e.clientY);\n\n if (e.originalEvent.wheelDelta < 0) {\n ratio = 1 - DELTA;\n } else {\n ratio = 1 / (1 - DELTA);\n }\n\n var maxR = self.get('maxR');\n var minR = self.get('minR');\n var r = self.get('r');\n\n if (r > (maxR || graph.get('height')) && ratio > 1 || r < (minR || graph.get('height') * 0.05) && ratio < 1) {\n ratio = 1;\n }\n\n r *= ratio;\n self.set('r', r);\n self.set('r2', r * r);\n var d = self.get('d');\n self.set('molecularParam', (d + 1) * r);\n self.set('delegateCenterDiff', undefined);\n self.magnify(e, mousePos);\n };\n /**\n * Scale the range by dragging\n * @param e mouse event\n */\n\n\n Fisheye.prototype.scaleRByDrag = function (e) {\n var self = this;\n if (!e) return;\n var dragPrePos = self.get('dragPrePos');\n var graph = self.get('graph');\n var ratio;\n var mousePos = graph.getPointByClient(e.clientX, e.clientY);\n\n if (e.x - dragPrePos.x < 0) {\n ratio = 1 - DELTA;\n } else {\n ratio = 1 / (1 - DELTA);\n }\n\n var maxR = self.get('maxR');\n var minR = self.get('minR');\n var r = self.get('r');\n\n if (r > (maxR || graph.get('height')) && ratio > 1 || r < (minR || graph.get('height') * 0.05) && ratio < 1) {\n ratio = 1;\n }\n\n r *= ratio;\n self.set('r', r);\n self.set('r2', r * r);\n var d = self.get('d');\n self.set('molecularParam', (d + 1) * r);\n self.magnify(e, mousePos);\n self.set('dragPrePos', {\n x: e.x,\n y: e.y\n });\n };\n /**\n * Scale the magnifying factor by wheel\n * @param e mouse wheel event\n */\n\n\n Fisheye.prototype.scaleDByWheel = function (evt) {\n var self = this;\n if (!evt && !evt.originalEvent) return;\n if (evt.preventDefault) evt.preventDefault();\n var delta = 0;\n\n if (evt.originalEvent.wheelDelta < 0) {\n delta = -0.1;\n } else {\n delta = 0.1;\n }\n\n var d = self.get('d');\n var newD = d + delta;\n var maxD = self.get('maxD');\n var minD = self.get('minD');\n\n if (newD < maxD && newD > minD) {\n self.set('d', newD);\n var r = self.get('r');\n self.set('molecularParam', (newD + 1) * r);\n var lensDelegate = self.get('delegate');\n var lensCenter = lensDelegate ? {\n x: lensDelegate.attr('x'),\n y: lensDelegate.attr('y')\n } : undefined;\n self.set('delegateCenterDiff', undefined);\n self.magnify(evt, lensCenter);\n }\n };\n /**\n * Scale the magnifying factor by dragging\n * @param e mouse event\n */\n\n\n Fisheye.prototype.scaleDByDrag = function (e) {\n var self = this;\n var dragPrePos = self.get('dragPrePos');\n var delta = e.x - dragPrePos.x > 0 ? 0.1 : -0.1;\n var d = self.get('d');\n var newD = d + delta;\n var maxD = self.get('maxD');\n var minD = self.get('minD');\n\n if (newD < maxD && newD > minD) {\n self.set('d', newD);\n var r = self.get('r');\n self.set('molecularParam', (newD + 1) * r);\n self.magnify(e);\n }\n\n self.set('dragPrePos', {\n x: e.x,\n y: e.y\n });\n };\n /**\n * Response function for mousemove, click, or drag to magnify\n * @param e mouse event\n */\n\n\n Fisheye.prototype.magnify = function (e, mousePos) {\n var self = this;\n self.restoreCache();\n var graph = self.get('graph');\n var cachedMagnifiedModels = self.get('cachedMagnifiedModels');\n var cachedOriginPositions = self.get('cachedOriginPositions');\n var showLabel = self.get('showLabel');\n var r = self.get('r');\n var r2 = self.get('r2');\n var d = self.get('d');\n var molecularParam = self.get('molecularParam');\n var nodes = graph.getNodes();\n var nodeLength = nodes.length;\n var mCenter = mousePos ? {\n x: mousePos.x,\n y: mousePos.y\n } : {\n x: e.x,\n y: e.y\n };\n\n if (self.get('dragging') && (self.get('trigger') === 'mousemove' || self.get('trigger') === 'click')) {\n mCenter = self.get('cacheCenter');\n }\n\n var delegateCenterDiff = self.get('delegateCenterDiff');\n\n if (delegateCenterDiff) {\n mCenter.x += delegateCenterDiff.x;\n mCenter.y += delegateCenterDiff.y;\n }\n\n self.updateDelegate(mCenter, r);\n\n for (var i = 0; i < nodeLength; i++) {\n var model = nodes[i].getModel();\n var x = model.x,\n y = model.y;\n if (isNaN(x) || isNaN(y)) continue; // the square of the distance between the node and the magnified center\n\n var dist2 = (x - mCenter.x) * (x - mCenter.x) + (y - mCenter.y) * (y - mCenter.y);\n\n if (!isNaN(dist2) && dist2 < r2 && dist2 !== 0) {\n var dist = Math.sqrt(dist2); // (r * (d + 1) * (dist / r)) / (d * (dist / r) + 1);\n\n var magnifiedDist = molecularParam * dist / (d * dist + r);\n var cos = (x - mCenter.x) / dist;\n var sin = (y - mCenter.y) / dist;\n model.x = cos * magnifiedDist + mCenter.x;\n model.y = sin * magnifiedDist + mCenter.y;\n\n if (!cachedOriginPositions[model.id]) {\n cachedOriginPositions[model.id] = {\n x: x,\n y: y,\n texts: []\n };\n }\n\n cachedMagnifiedModels.push(model);\n\n if (showLabel && 2 * dist < r) {\n var node = nodes[i];\n var nodeGroup = node.getContainer();\n var shapes = nodeGroup.getChildren();\n var shapeLength = shapes.length;\n\n for (var j = 0; j < shapeLength; j++) {\n var shape = shapes[j];\n\n if (shape.get('type') === 'text') {\n cachedOriginPositions[model.id].texts.push({\n visible: shape.get('visible'),\n shape: shape\n });\n shape.set('visible', true);\n }\n }\n }\n }\n }\n\n graph.refreshPositions();\n };\n /**\n * Restore the cache nodes while magnifying\n */\n\n\n Fisheye.prototype.restoreCache = function () {\n var self = this;\n var cachedMagnifiedModels = self.get('cachedMagnifiedModels');\n var cachedOriginPositions = self.get('cachedOriginPositions');\n var cacheLength = cachedMagnifiedModels.length;\n\n for (var i = 0; i < cacheLength; i++) {\n var node = cachedMagnifiedModels[i];\n var id = node.id;\n var ori = cachedOriginPositions[id];\n node.x = ori.x;\n node.y = ori.y;\n var textLength = ori.texts.length;\n\n for (var j = 0; j < textLength; j++) {\n var text = ori.texts[j];\n text.shape.set('visible', text.visible);\n }\n }\n\n self.set('cachedMagnifiedModels', []);\n self.set('cachedOriginPositions', {});\n };\n /**\n * Adjust part of the parameters, including trigger, d, r, maxR, minR, maxD, minD, scaleRBy, and scaleDBy\n * @param {FisheyeConfig} cfg\n */\n\n\n Fisheye.prototype.updateParams = function (cfg) {\n var self = this;\n var r = cfg.r,\n d = cfg.d,\n trigger = cfg.trigger,\n minD = cfg.minD,\n maxD = cfg.maxD,\n minR = cfg.minR,\n maxR = cfg.maxR,\n scaleDBy = cfg.scaleDBy,\n scaleRBy = cfg.scaleRBy;\n\n if (!isNaN(cfg.r)) {\n self.set('r', r);\n self.set('r2', r * r);\n }\n\n if (!isNaN(d)) {\n self.set('d', d);\n }\n\n if (!isNaN(maxD)) {\n self.set('maxD', maxD);\n }\n\n if (!isNaN(minD)) {\n self.set('minD', minD);\n }\n\n if (!isNaN(maxR)) {\n self.set('maxR', maxR);\n }\n\n if (!isNaN(minR)) {\n self.set('minR', minR);\n }\n\n var nd = self.get('d');\n var nr = self.get('r');\n self.set('molecularParam', (nd + 1) * nr);\n\n if (trigger === 'mousemove' || trigger === 'click' || trigger === 'drag') {\n self.set('trigger', trigger);\n }\n\n if (scaleDBy === 'drag' || scaleDBy === 'wheel' || scaleDBy === 'unset') {\n self.set('scaleDBy', scaleDBy);\n self.get('delegate').remove();\n self.get('delegate').destroy();\n var dPercentText = self.get('dPercentText');\n\n if (dPercentText) {\n dPercentText.remove();\n dPercentText.destroy();\n }\n }\n\n if (scaleRBy === 'drag' || scaleRBy === 'wheel' || scaleRBy === 'unset') {\n self.set('scaleRBy', scaleRBy);\n self.get('delegate').remove();\n self.get('delegate').destroy();\n var dPercentText = self.get('dPercentText');\n\n if (dPercentText) {\n dPercentText.remove();\n dPercentText.destroy();\n }\n }\n };\n /**\n * Update the delegate shape of the lens\n * @param {Point} mCenter the center of the shape\n * @param {number} r the radius of the shape\n */\n\n\n Fisheye.prototype.updateDelegate = function (mCenter, r) {\n var _this = this;\n\n var self = this;\n var graph = self.get('graph');\n var lensDelegate = self.get('delegate');\n\n if (!lensDelegate || lensDelegate.destroyed) {\n // 拖动多个\n var parent_1 = graph.get('group');\n var attrs = self.get('delegateStyle') || lensDelegateStyle; // model上的x, y是相对于图形中心的, delegateShape是g实例, x,y是绝对坐标\n\n lensDelegate = parent_1.addShape('circle', {\n attrs: fisheye_assign({\n r: r / 1.5,\n x: mCenter.x,\n y: mCenter.y\n }, attrs),\n name: 'lens-shape',\n draggable: true\n });\n\n if (this.get('trigger') !== 'drag') {\n // 调整范围 r 的监听\n if (this.get('scaleRBy') === 'wheel') {\n // 使用滚轮调整 r\n lensDelegate.on('mousewheel', function (evt) {\n self.scaleRByWheel(evt);\n });\n } else if (this.get('scaleRBy') === 'drag') {\n // 使用拖拽调整 r\n lensDelegate.on('dragstart', function (e) {\n self.set('dragging', true);\n self.set('cacheCenter', {\n x: e.x,\n y: e.y\n });\n self.set('dragPrePos', {\n x: e.x,\n y: e.y\n });\n });\n lensDelegate.on('drag', function (evt) {\n self.scaleRByDrag(evt);\n });\n lensDelegate.on('dragend', function (e) {\n self.set('dragging', false);\n });\n } // 调整缩放系数 d 的监听\n\n\n if (this.get('scaleDBy') === 'wheel') {\n // 使用滚轮调整 d\n lensDelegate.on('mousewheel', function (evt) {\n _this.scaleDByWheel(evt);\n });\n } else if (this.get('scaleDBy') === 'drag') {\n // 使用拖拽调整 d\n lensDelegate.on('dragstart', function (evt) {\n self.set('dragging', true);\n self.set('cacheCenter', {\n x: evt.x,\n y: evt.y\n });\n self.set('dragPrePos', {\n x: evt.x,\n y: evt.y\n });\n });\n lensDelegate.on('drag', function (evt) {\n _this.scaleDByDrag(evt);\n });\n lensDelegate.on('dragend', function (evt) {\n self.set('dragging', false);\n });\n }\n }\n } else {\n lensDelegate.attr({\n x: mCenter.x,\n y: mCenter.y,\n r: r / 1.5\n });\n } // 绘制缩放系数百分比文本\n\n\n if (self.get('showDPercent')) {\n var percent = Math.round((self.get('d') - self.get('minD')) / (self.get('maxD') - self.get('minD')) * 100);\n var dPercentText = self.get('dPercentText');\n var textY = mCenter.y + r / 1.5 + 16;\n\n if (!dPercentText || dPercentText.destroyed) {\n var parent_2 = graph.get('group');\n dPercentText = parent_2.addShape('text', {\n attrs: {\n text: percent + \"%\",\n x: mCenter.x,\n y: textY,\n fill: '#aaa',\n stroke: '#fff',\n lineWidth: 1,\n fontSize: 12\n }\n });\n self.set('dPercentText', dPercentText);\n } else {\n dPercentText.attr({\n text: percent + \"%\",\n x: mCenter.x,\n y: textY\n });\n }\n }\n\n self.set('delegate', lensDelegate);\n };\n /**\n * Clear the fisheye lens\n */\n\n\n Fisheye.prototype.clear = function () {\n var graph = this.get('graph');\n this.restoreCache();\n graph.refreshPositions();\n var lensDelegate = this.get('delegate');\n\n if (lensDelegate && !lensDelegate.destroyed) {\n lensDelegate.remove();\n lensDelegate.destroy();\n }\n\n var dPercentText = this.get('dPercentText');\n\n if (dPercentText && !dPercentText.destroyed) {\n dPercentText.remove();\n dPercentText.destroy();\n }\n };\n /**\n * Destroy the component\n */\n\n\n Fisheye.prototype.destroy = function () {\n this.clear();\n };\n\n return Fisheye;\n}(es_base);\n\n/* harmony default export */ var fisheye = (fisheye_Fisheye);\n// CONCATENATED MODULE: ./node_modules/@antv/g6-plugin/es/toolBar/index.js\nvar toolBar_extends = undefined && undefined.__extends || function () {\n var _extendStatics = function extendStatics(d, b) {\n _extendStatics = Object.setPrototypeOf || {\n __proto__: []\n } instanceof Array && function (d, b) {\n d.__proto__ = b;\n } || function (d, b) {\n for (var p in b) {\n if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p];\n }\n };\n\n return _extendStatics(d, b);\n };\n\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null) throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n\n _extendStatics(d, b);\n\n function __() {\n this.constructor = d;\n }\n\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n}();\n\n\n\n\n\nvar toolBar_DELTA = 0.05;\ntypeof document !== 'undefined' && insert_css_default()(\"\\n .g6-component-toolbar {\\n position: absolute;\\n list-style-type: none;\\n padding: 6px;\\n left: 0px;\\n top: 0px;\\n background-color: rgba(255, 255, 255, 0.9);\\n border: 1px solid #e2e2e2;\\n border-radius: 4px;\\n font-size: 12px;\\n color: #545454;\\n margin: 0;\\n }\\n .g6-component-toolbar li {\\n float: left;\\n text-align: center;\\n width: 35px;\\n height: 24px;\\n cursor: pointer;\\n\\t\\tlist-style-type:none;\\n list-style: none;\\n margin-left: 0px;\\n }\\n .g6-component-toolbar li .icon {\\n opacity: 0.7;\\n }\\n .g6-component-toolbar li .icon:hover {\\n opacity: 1;\\n }\\n\");\n\nvar getEventPath = function getEventPath(evt) {\n if (!evt) {\n return [];\n }\n\n if (evt.composedPath) {\n return evt.composedPath();\n }\n\n var path = [];\n var el = evt.target;\n\n while (el) {\n path.push(el);\n\n if (el.tagName === 'HTML') {\n path.push(document, window);\n return path;\n }\n\n el = el.parentElement;\n }\n\n return path;\n};\n\nvar toolBar_ToolBar =\n/** @class */\nfunction (_super) {\n toolBar_extends(ToolBar, _super);\n\n function ToolBar(config) {\n return _super.call(this, config) || this;\n }\n\n ToolBar.prototype.getDefaultCfgs = function () {\n return {\n handleClick: undefined,\n // 指定菜单内容,function(e) {...}\n getContent: function getContent(graph) {\n return \"\\n
    \\n
  • \\n \\n \\n \\n
  • \\n
  • \\n \\n \\n \\n
  • \\n
  • \\n \\n \\n \\n
  • \\n
  • \\n \\n \\n \\n
  • \\n
  • \\n \\n \\n \\n
  • \\n
  • \\n \\n \\n \\n
  • \\n
\\n \";\n },\n zoomSensitivity: 2\n };\n };\n\n ToolBar.prototype.init = function () {\n var _this = this;\n\n var graph = this.get('graph');\n var getContent = this.get('getContent');\n var toolBar = getContent(graph);\n var toolBarDOM = toolBar;\n\n if (Object(esm[\"isString\"])(toolBar)) {\n toolBarDOM = createDom(toolBar);\n }\n\n var className = this.get('className');\n toolBarDOM.setAttribute('class', className || 'g6-component-toolbar');\n var container = this.get('container');\n\n if (!container) {\n container = this.get('graph').get('container');\n }\n\n if (Object(esm[\"isString\"])(container)) {\n container = document.getElementById(container);\n }\n\n container.appendChild(toolBarDOM);\n this.set('toolBar', toolBarDOM);\n var handleClick = this.get('handleClick');\n toolBarDOM.addEventListener('click', function (evt) {\n var current = getEventPath(evt).filter(function (p) {\n return p.nodeName === 'LI';\n });\n\n if (current.length === 0) {\n return;\n }\n\n var code = current[0].getAttribute('code');\n\n if (!code) {\n return;\n }\n\n if (handleClick) {\n handleClick(code, graph);\n } else {\n _this.handleDefaultOperator(code, graph);\n }\n });\n var pos = this.get('position');\n\n if (pos) {\n modifyCSS(toolBarDOM, {\n top: pos.y + \"px\",\n left: pos.x + \"px\"\n });\n }\n\n this.bindUndoRedo();\n };\n\n ToolBar.prototype.bindUndoRedo = function () {\n var graph = this.get('graph');\n var undoDom = document.querySelector('.g6-component-toolbar li[code=\"undo\"]');\n var undoDomIcon = document.querySelector('.g6-component-toolbar li[code=\"undo\"] svg');\n var redoDom = document.querySelector('.g6-component-toolbar li[code=\"redo\"]');\n var redoDomIcon = document.querySelector('.g6-component-toolbar li[code=\"redo\"] svg');\n\n if (!undoDom || !undoDomIcon || !redoDom || !redoDomIcon) {\n return;\n }\n\n graph.on('stackchange', function (evt) {\n var undoStack = evt.undoStack,\n redoStack = evt.redoStack;\n var undoStackLen = undoStack.length;\n var redoStackLen = redoStack.length; // undo 不可用\n\n if (undoStackLen === 1) {\n undoDom.setAttribute('style', 'cursor: not-allowed');\n undoDomIcon.setAttribute('style', 'opacity: 0.4');\n } else {\n undoDom.removeAttribute('style');\n undoDomIcon.removeAttribute('style');\n } // redo 不可用\n\n\n if (redoStackLen === 0) {\n redoDom.setAttribute('style', 'cursor: not-allowed');\n redoDomIcon.setAttribute('style', 'opacity: 0.4');\n } else {\n redoDom.removeAttribute('style');\n redoDomIcon.removeAttribute('style');\n }\n });\n };\n /**\n * undo 操作\n */\n\n\n ToolBar.prototype.undo = function () {\n var graph = this.get('graph');\n var undoStack = graph.getUndoStack();\n\n if (!undoStack || undoStack.length === 1) {\n return;\n }\n\n var currentData = undoStack.pop();\n\n if (currentData) {\n var action = currentData.action;\n graph.pushStack(action, Object(esm[\"clone\"])(currentData.data), 'redo');\n var data_1 = currentData.data.before;\n\n if (action === 'add') {\n data_1 = currentData.data.after;\n }\n\n if (!data_1) return;\n\n switch (action) {\n case 'visible':\n {\n Object.keys(data_1).forEach(function (key) {\n var array = data_1[key];\n if (!array) return;\n array.forEach(function (model) {\n var item = graph.findById(model.id);\n\n if (model.visible) {\n graph.showItem(item, false);\n } else {\n graph.hideItem(item, false);\n }\n });\n });\n break;\n }\n\n case 'render':\n case 'update':\n Object.keys(data_1).forEach(function (key) {\n var array = data_1[key];\n if (!array) return;\n array.forEach(function (model) {\n graph.updateItem(model.id, model, false);\n });\n });\n break;\n\n case 'changedata':\n graph.changeData(data_1, false);\n break;\n\n case 'delete':\n {\n Object.keys(data_1).forEach(function (key) {\n var array = data_1[key];\n if (!array) return;\n array.forEach(function (model) {\n var itemType = model.itemType;\n delete model.itemType;\n graph.addItem(itemType, model, false);\n });\n });\n break;\n }\n\n case 'add':\n Object.keys(data_1).forEach(function (key) {\n var array = data_1[key];\n if (!array) return;\n array.forEach(function (model) {\n graph.removeItem(model.id, false);\n });\n });\n break;\n\n case 'updateComboTree':\n Object.keys(data_1).forEach(function (key) {\n var array = data_1[key];\n if (!array) return;\n array.forEach(function (model) {\n graph.updateComboTree(model.id, model.parentId, false);\n });\n });\n break;\n\n default:\n }\n }\n };\n /**\n * redo 操作\n */\n\n\n ToolBar.prototype.redo = function () {\n var graph = this.get('graph');\n var redoStack = graph.getRedoStack();\n\n if (!redoStack || redoStack.length === 0) {\n return;\n }\n\n var currentData = redoStack.pop();\n\n if (currentData) {\n var action = currentData.action;\n var data_2 = currentData.data.after;\n graph.pushStack(action, Object(esm[\"clone\"])(currentData.data));\n\n if (action === 'delete') {\n data_2 = currentData.data.before;\n }\n\n if (!data_2) return;\n\n switch (action) {\n case 'visible':\n {\n Object.keys(data_2).forEach(function (key) {\n var array = data_2[key];\n if (!array) return;\n array.forEach(function (model) {\n var item = graph.findById(model.id);\n\n if (model.visible) {\n graph.showItem(item, false);\n } else {\n graph.hideItem(item, false);\n }\n });\n });\n break;\n }\n\n case 'render':\n case 'update':\n Object.keys(data_2).forEach(function (key) {\n var array = data_2[key];\n if (!array) return;\n array.forEach(function (model) {\n graph.updateItem(model.id, model, false);\n });\n });\n break;\n\n case 'changedata':\n graph.changeData(data_2, false);\n break;\n\n case 'delete':\n if (data_2.edges) {\n data_2.edges.forEach(function (model) {\n graph.removeItem(model.id, false);\n });\n }\n\n if (data_2.nodes) {\n data_2.nodes.forEach(function (model) {\n graph.removeItem(model.id, false);\n });\n }\n\n if (data_2.combos) {\n data_2.combos.forEach(function (model) {\n graph.removeItem(model.id, false);\n });\n }\n\n break;\n\n case 'add':\n {\n Object.keys(data_2).forEach(function (key) {\n var array = data_2[key];\n if (!array) return;\n array.forEach(function (model) {\n var itemType = model.itemType;\n delete model.itemType;\n graph.addItem(itemType, model, false);\n });\n });\n break;\n }\n\n case 'updateComboTree':\n Object.keys(data_2).forEach(function (key) {\n var array = data_2[key];\n if (!array) return;\n array.forEach(function (model) {\n graph.updateComboTree(model.id, model.parentId, false);\n });\n });\n break;\n\n default:\n }\n }\n };\n /**\n * 根据 Toolbar 上不同类型对图进行操作\n * @param code 操作类型编码\n * @param graph Graph 实例\n */\n\n\n ToolBar.prototype.handleDefaultOperator = function (code, graph) {\n var currentZoom = graph.getZoom();\n\n switch (code) {\n case 'redo':\n this.redo();\n break;\n\n case 'undo':\n this.undo();\n break;\n\n case 'zoomOut':\n {\n var ratioOut = 1 / (1 - toolBar_DELTA * this.get('zoomSensitivity'));\n var maxZoom = this.get('maxZoom') || graph.get('maxZoom');\n\n if (ratioOut * currentZoom > maxZoom) {\n return;\n }\n\n graph.zoomTo(currentZoom * ratioOut);\n break;\n }\n\n case 'zoomIn':\n {\n var ratioIn = 1 - toolBar_DELTA * this.get('zoomSensitivity');\n var minZoom = this.get('minZoom') || graph.get('minZoom');\n\n if (ratioIn * currentZoom < minZoom) {\n return;\n }\n\n graph.zoomTo(currentZoom * ratioIn);\n break;\n }\n\n case 'realZoom':\n graph.zoomTo(1);\n break;\n\n case 'autoZoom':\n graph.fitView([20, 20]);\n break;\n\n default:\n }\n };\n\n ToolBar.prototype.destroy = function () {\n var toolBar = this.get('toolBar');\n\n if (toolBar) {\n var container = this.get('container');\n\n if (!container) {\n container = this.get('graph').get('container');\n }\n\n if (Object(esm[\"isString\"])(container)) {\n container = document.getElementById(container);\n }\n\n container.removeChild(toolBar);\n }\n\n var handleClick = this.get('handleClick');\n\n if (handleClick) {\n toolBar.removeEventListener('click', handleClick);\n }\n };\n\n return ToolBar;\n}(es_base);\n\n/* harmony default export */ var es_toolBar = (toolBar_ToolBar);\n// CONCATENATED MODULE: ./node_modules/@antv/g6-plugin/es/tooltip/index.js\nvar tooltip_extends = undefined && undefined.__extends || function () {\n var _extendStatics = function extendStatics(d, b) {\n _extendStatics = Object.setPrototypeOf || {\n __proto__: []\n } instanceof Array && function (d, b) {\n d.__proto__ = b;\n } || function (d, b) {\n for (var p in b) {\n if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p];\n }\n };\n\n return _extendStatics(d, b);\n };\n\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null) throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n\n _extendStatics(d, b);\n\n function __() {\n this.constructor = d;\n }\n\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n}();\n\n\n\n\n\ntypeof document !== 'undefined' && insert_css_default()(\"\\n .g6-component-tooltip {\\n border: 1px solid #e2e2e2;\\n border-radius: 4px;\\n font-size: 12px;\\n color: #545454;\\n background-color: rgba(255, 255, 255, 0.9);\\n padding: 10px 8px;\\n box-shadow: rgb(174, 174, 174) 0px 0px 10px;\\n }\\n .tooltip-type {\\n padding: 0;\\n margin: 0;\\n }\\n .tooltip-id {\\n color: #531dab;\\n }\\n\");\n\nvar tooltip_Tooltip =\n/** @class */\nfunction (_super) {\n tooltip_extends(Tooltip, _super);\n\n function Tooltip(config) {\n return _super.call(this, config) || this;\n }\n\n Tooltip.prototype.getDefaultCfgs = function () {\n return {\n offsetX: 6,\n offsetY: 6,\n // 指定菜单内容,function(e) {...}\n getContent: function getContent(e) {\n return \"\\n

\\u7C7B\\u578B\\uFF1A\" + e.item.getType() + \"

\\n ID\\uFF1A\" + e.item.getID() + \"\\n \";\n },\n shouldBegin: function shouldBegin(e) {\n return true;\n },\n itemTypes: ['node', 'edge', 'combo'],\n trigger: 'mouseenter',\n fixToNode: undefined\n };\n }; // class-methods-use-this\n\n\n Tooltip.prototype.getEvents = function () {\n if (this.get('trigger') === 'click') {\n return {\n 'node:click': 'onClick',\n 'edge:click': 'onClick',\n 'combo:click': 'onClick',\n 'canvas:click': 'onMouseLeave',\n afterremoveitem: 'onMouseLeave',\n contextmenu: 'onMouseLeave',\n drag: 'onMouseLeave'\n };\n }\n\n return {\n 'node:mouseenter': 'onMouseEnter',\n 'node:mouseleave': 'onMouseLeave',\n 'node:mousemove': 'onMouseMove',\n 'edge:mouseenter': 'onMouseEnter',\n 'edge:mouseleave': 'onMouseLeave',\n 'edge:mousemove': 'onMouseMove',\n 'combo:mouseenter': 'onMouseEnter',\n 'combo:mouseleave': 'onMouseLeave',\n 'combo:mousemove': 'onMouseMove',\n afterremoveitem: 'onMouseLeave',\n contextmenu: 'onMouseLeave',\n 'node:drag': 'onMouseLeave'\n };\n };\n\n Tooltip.prototype.init = function () {\n var self = this;\n var className = self.get('className') || 'g6-component-tooltip';\n var tooltip = createDom(\"
\");\n var container = self.get('container');\n\n if (!container) {\n container = self.get('graph').get('container');\n }\n\n if (Object(esm[\"isString\"])(container)) {\n container = document.getElementById(container);\n }\n\n modifyCSS(tooltip, {\n position: 'absolute',\n visibility: 'hidden',\n display: 'none'\n });\n container.appendChild(tooltip);\n\n if (self.get('trigger') !== 'click') {\n tooltip.addEventListener('mouseenter', function (e) {\n modifyCSS(tooltip, {\n visibility: 'visible',\n display: 'unset'\n });\n });\n tooltip.addEventListener('mouseleave', function (e) {\n self.hideTooltip();\n });\n }\n\n self.set('tooltip', tooltip);\n };\n\n Tooltip.prototype.onClick = function (e) {\n var itemTypes = this.get('itemTypes');\n if (e.item && e.item.getType && itemTypes.indexOf(e.item.getType()) === -1) return;\n var item = e.item;\n var graph = this.get('graph'); // 若与上一次同一 item,隐藏该 tooltip\n\n if (this.currentTarget === item) {\n this.currentTarget = null;\n this.hideTooltip();\n graph.emit('tooltipchange', {\n item: e.item,\n action: 'hide'\n });\n } else {\n this.currentTarget = item;\n this.showTooltip(e);\n graph.emit('tooltipchange', {\n item: e.item,\n action: 'show'\n });\n }\n };\n\n Tooltip.prototype.onMouseEnter = function (e) {\n var itemTypes = this.get('itemTypes');\n if (e.item && e.item.getType && itemTypes.indexOf(e.item.getType()) === -1) return;\n var item = e.item;\n var graph = this.get('graph');\n this.currentTarget = item;\n this.showTooltip(e);\n graph.emit('tooltipchange', {\n item: e.item,\n action: 'show'\n });\n };\n\n Tooltip.prototype.onMouseMove = function (e) {\n var itemTypes = this.get('itemTypes');\n if (e.item && e.item.getType && itemTypes.indexOf(e.item.getType()) === -1) return;\n\n if (!this.currentTarget || e.item !== this.currentTarget) {\n return;\n }\n\n this.showTooltip(e);\n };\n\n Tooltip.prototype.onMouseLeave = function () {\n this.hideTooltip();\n var graph = this.get('graph');\n graph.emit('tooltipchange', {\n item: this.currentTarget,\n action: 'hide'\n });\n this.currentTarget = null;\n };\n\n Tooltip.prototype.showTooltip = function (e) {\n if (!e.item) {\n return;\n }\n\n var itemTypes = this.get('itemTypes');\n if (e.item.getType && itemTypes.indexOf(e.item.getType()) === -1) return;\n var container = this.get('tooltip');\n var getContent = this.get('getContent');\n var tooltip = getContent(e);\n\n if (Object(esm[\"isString\"])(tooltip)) {\n container.innerHTML = tooltip;\n } else {\n container.innerHTML = tooltip.outerHTML;\n }\n\n this.updatePosition(e);\n };\n\n Tooltip.prototype.hideTooltip = function () {\n var tooltip = this.get('tooltip');\n\n if (tooltip) {\n modifyCSS(tooltip, {\n visibility: 'hidden',\n display: 'none'\n });\n }\n };\n\n Tooltip.prototype.updatePosition = function (e) {\n var shouldBegin = this.get('shouldBegin');\n var tooltip = this.get('tooltip');\n\n if (!shouldBegin(e)) {\n modifyCSS(tooltip, {\n visibility: 'hidden',\n display: 'none'\n });\n return;\n }\n\n var graph = this.get('graph');\n var width = graph.get('width');\n var height = graph.get('height');\n var offsetX = this.get('offsetX') || 0;\n var offsetY = this.get('offsetY') || 0; // const mousePos = graph.getPointByClient(e.clientX, e.clientY);\n\n var point = graph.getPointByClient(e.clientX, e.clientY);\n var fixToNode = this.get('fixToNode');\n var item = e.item;\n\n if (item.getType && item.getType() === 'node' && fixToNode && Object(esm[\"isArray\"])(fixToNode) && fixToNode.length >= 2) {\n var itemBBox = item.getBBox();\n point = {\n x: itemBBox.minX + itemBBox.width * fixToNode[0],\n y: itemBBox.minY + itemBBox.height * fixToNode[1]\n };\n }\n\n var _a = graph.getCanvasByPoint(point.x, point.y),\n x = _a.x,\n y = _a.y;\n\n var graphContainer = graph.getContainer();\n var res = {\n x: x + graphContainer.offsetLeft + offsetX,\n y: y + graphContainer.offsetTop + offsetY\n }; // 先修改为 visible 方可正确计算 bbox\n\n modifyCSS(tooltip, {\n visibility: 'visible',\n display: 'unset'\n });\n var bbox = tooltip.getBoundingClientRect();\n\n if (x + bbox.width + offsetX > width) {\n res.x -= bbox.width + offsetX;\n }\n\n if (y + bbox.height + offsetY > height) {\n res.y -= bbox.height + offsetY;\n }\n\n modifyCSS(tooltip, {\n left: res.x + \"px\",\n top: res.y + \"px\"\n });\n };\n\n Tooltip.prototype.hide = function () {\n this.onMouseLeave();\n };\n\n Tooltip.prototype.destroy = function () {\n var tooltip = this.get('tooltip');\n\n if (tooltip) {\n var container = this.get('container');\n\n if (!container) {\n container = this.get('graph').get('container');\n }\n\n if (Object(esm[\"isString\"])(container)) {\n container = document.getElementById(container);\n }\n\n container.removeChild(tooltip);\n }\n };\n\n return Tooltip;\n}(es_base);\n\n/* harmony default export */ var es_tooltip = (tooltip_Tooltip);\n// CONCATENATED MODULE: ./node_modules/@antv/scale/esm/tick-method/register.js\nvar methodCache = {};\n/**\n * 获取计算 ticks 的方法\n * @param key 键值\n * @returns 计算 ticks 的方法\n */\nfunction getTickMethod(key) {\n return methodCache[key];\n}\n/**\n * 注册计算 ticks 的方法\n * @param key 键值\n * @param method 方法\n */\nfunction registerTickMethod(key, method) {\n methodCache[key] = method;\n}\n//# sourceMappingURL=register.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/scale/esm/base.js\n\n\nvar base_Scale = /** @class */ (function () {\n function Scale(cfg) {\n /**\n * 度量的类型\n */\n this.type = 'base';\n /**\n * 是否分类类型的度量\n */\n this.isCategory = false;\n /**\n * 是否线性度量,有linear, time 度量\n */\n this.isLinear = false;\n /**\n * 是否连续类型的度量,linear,time,log, pow, quantile, quantize 都支持\n */\n this.isContinuous = false;\n /**\n * 是否是常量的度量,传入和传出一致\n */\n this.isIdentity = false;\n this.values = [];\n this.range = [0, 1];\n this.ticks = [];\n this.__cfg__ = cfg;\n this.initCfg();\n this.init();\n }\n // 对于原始值的必要转换,如分类、时间字段需转换成数值,用transform/map命名可能更好\n Scale.prototype.translate = function (v) {\n return v;\n };\n /** 重新初始化 */\n Scale.prototype.change = function (cfg) {\n // 覆盖配置项,而不替代\n Object(esm[\"assign\"])(this.__cfg__, cfg);\n this.init();\n };\n Scale.prototype.clone = function () {\n return this.constructor(this.__cfg__);\n };\n /** 获取坐标轴需要的ticks */\n Scale.prototype.getTicks = function () {\n var _this = this;\n return Object(esm[\"map\"])(this.ticks, function (tick, idx) {\n if (Object(esm[\"isObject\"])(tick)) {\n // 仅当符合Tick类型时才有意义\n return tick;\n }\n return {\n text: _this.getText(tick, idx),\n tickValue: tick,\n value: _this.scale(tick), // scaled\n };\n });\n };\n /** 获取Tick的格式化结果 */\n Scale.prototype.getText = function (value, key) {\n var formatter = this.formatter;\n var res = formatter ? formatter(value, key) : value;\n if (Object(esm[\"isNil\"])(res) || !Object(esm[\"isFunction\"])(res.toString)) {\n return '';\n }\n return res.toString();\n };\n // 获取配置项中的值,当前 scale 上的值可能会被修改\n Scale.prototype.getConfig = function (key) {\n return this.__cfg__[key];\n };\n // scale初始化\n Scale.prototype.init = function () {\n Object(esm[\"assign\"])(this, this.__cfg__);\n this.setDomain();\n if (Object(esm[\"isEmpty\"])(this.getConfig('ticks'))) {\n this.ticks = this.calculateTicks();\n }\n };\n // 子类上覆盖某些属性,不能直接在类上声明,否则会被覆盖\n Scale.prototype.initCfg = function () { };\n Scale.prototype.setDomain = function () { };\n Scale.prototype.calculateTicks = function () {\n var tickMethod = this.tickMethod;\n var ticks = [];\n if (Object(esm[\"isString\"])(tickMethod)) {\n var method = getTickMethod(tickMethod);\n if (!method) {\n throw new Error('There is no method to to calculate ticks!');\n }\n ticks = method(this);\n }\n else if (Object(esm[\"isFunction\"])(tickMethod)) {\n ticks = tickMethod(this);\n }\n return ticks;\n };\n // range 的最小值\n Scale.prototype.rangeMin = function () {\n return this.range[0];\n };\n // range 的最大值\n Scale.prototype.rangeMax = function () {\n return this.range[1];\n };\n /** 定义域转 0~1 */\n Scale.prototype.calcPercent = function (value, min, max) {\n if (Object(esm[\"isNumber\"])(value)) {\n return (value - min) / (max - min);\n }\n return NaN;\n };\n /** 0~1转定义域 */\n Scale.prototype.calcValue = function (percent, min, max) {\n return min + percent * (max - min);\n };\n return Scale;\n}());\n/* harmony default export */ var esm_base = (base_Scale);\n//# sourceMappingURL=base.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/scale/esm/category/base.js\n\n\n\n/**\n * 分类度量\n * @class\n */\nvar base_Category = /** @class */ (function (_super) {\n Object(tslib_es6[\"__extends\"])(Category, _super);\n function Category() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n _this.type = 'cat';\n _this.isCategory = true;\n return _this;\n }\n Category.prototype.buildIndexMap = function () {\n if (!this.translateIndexMap) {\n this.translateIndexMap = new Map();\n // 重新构建缓存\n for (var i = 0; i < this.values.length; i++) {\n this.translateIndexMap.set(this.values[i], i);\n }\n }\n };\n Category.prototype.translate = function (value) {\n // 按需构建 map\n this.buildIndexMap();\n // 找得到\n var idx = this.translateIndexMap.get(value);\n if (idx === undefined) {\n idx = Object(esm[\"isNumber\"])(value) ? value : NaN;\n }\n return idx;\n };\n Category.prototype.scale = function (value) {\n var order = this.translate(value);\n // 分类数据允许 0.5 范围内调整\n // if (order < this.min - 0.5 || order > this.max + 0.5) {\n // return NaN;\n // }\n var percent = this.calcPercent(order, this.min, this.max);\n return this.calcValue(percent, this.rangeMin(), this.rangeMax());\n };\n Category.prototype.invert = function (scaledValue) {\n var domainRange = this.max - this.min;\n var percent = this.calcPercent(scaledValue, this.rangeMin(), this.rangeMax());\n var idx = Math.round(domainRange * percent) + this.min;\n if (idx < this.min || idx > this.max) {\n return NaN;\n }\n return this.values[idx];\n };\n Category.prototype.getText = function (value) {\n var args = [];\n for (var _i = 1; _i < arguments.length; _i++) {\n args[_i - 1] = arguments[_i];\n }\n var v = value;\n // value为index\n if (Object(esm[\"isNumber\"])(value) && !this.values.includes(value)) {\n v = this.values[v];\n }\n return _super.prototype.getText.apply(this, Object(tslib_es6[\"__spreadArray\"])([v], args, false));\n };\n // 复写属性\n Category.prototype.initCfg = function () {\n this.tickMethod = 'cat';\n };\n // 设置 min, max\n Category.prototype.setDomain = function () {\n // 用户有可能设置 min\n if (Object(esm[\"isNil\"])(this.getConfig('min'))) {\n this.min = 0;\n }\n if (Object(esm[\"isNil\"])(this.getConfig('max'))) {\n var size = this.values.length;\n this.max = size > 1 ? size - 1 : size;\n }\n // scale.init 的时候清除缓存\n if (this.translateIndexMap) {\n this.translateIndexMap = undefined;\n }\n };\n return Category;\n}(esm_base));\n/* harmony default export */ var category_base = (base_Category);\n//# sourceMappingURL=base.js.map\n// CONCATENATED MODULE: ./node_modules/fecha/lib/fecha.js\nvar token = /d{1,4}|M{1,4}|YY(?:YY)?|S{1,3}|Do|ZZ|Z|([HhMsDm])\\1?|[aA]|\"[^\"]*\"|'[^']*'/g;\nvar twoDigitsOptional = \"[1-9]\\\\d?\";\nvar twoDigits = \"\\\\d\\\\d\";\nvar threeDigits = \"\\\\d{3}\";\nvar fourDigits = \"\\\\d{4}\";\nvar word = \"[^\\\\s]+\";\nvar literal = /\\[([^]*?)\\]/gm;\nfunction shorten(arr, sLen) {\n var newArr = [];\n for (var i = 0, len = arr.length; i < len; i++) {\n newArr.push(arr[i].substr(0, sLen));\n }\n return newArr;\n}\nvar monthUpdate = function (arrName) { return function (v, i18n) {\n var lowerCaseArr = i18n[arrName].map(function (v) { return v.toLowerCase(); });\n var index = lowerCaseArr.indexOf(v.toLowerCase());\n if (index > -1) {\n return index;\n }\n return null;\n}; };\nfunction fecha_assign(origObj) {\n var args = [];\n for (var _i = 1; _i < arguments.length; _i++) {\n args[_i - 1] = arguments[_i];\n }\n for (var _a = 0, args_1 = args; _a < args_1.length; _a++) {\n var obj = args_1[_a];\n for (var key in obj) {\n // @ts-ignore ex\n origObj[key] = obj[key];\n }\n }\n return origObj;\n}\nvar dayNames = [\n \"Sunday\",\n \"Monday\",\n \"Tuesday\",\n \"Wednesday\",\n \"Thursday\",\n \"Friday\",\n \"Saturday\"\n];\nvar monthNames = [\n \"January\",\n \"February\",\n \"March\",\n \"April\",\n \"May\",\n \"June\",\n \"July\",\n \"August\",\n \"September\",\n \"October\",\n \"November\",\n \"December\"\n];\nvar monthNamesShort = shorten(monthNames, 3);\nvar dayNamesShort = shorten(dayNames, 3);\nvar defaultI18n = {\n dayNamesShort: dayNamesShort,\n dayNames: dayNames,\n monthNamesShort: monthNamesShort,\n monthNames: monthNames,\n amPm: [\"am\", \"pm\"],\n DoFn: function (dayOfMonth) {\n return (dayOfMonth +\n [\"th\", \"st\", \"nd\", \"rd\"][dayOfMonth % 10 > 3\n ? 0\n : ((dayOfMonth - (dayOfMonth % 10) !== 10 ? 1 : 0) * dayOfMonth) % 10]);\n }\n};\nvar globalI18n = fecha_assign({}, defaultI18n);\nvar setGlobalDateI18n = function (i18n) {\n return (globalI18n = fecha_assign(globalI18n, i18n));\n};\nvar regexEscape = function (str) {\n return str.replace(/[|\\\\{()[^$+*?.-]/g, \"\\\\$&\");\n};\nvar pad = function (val, len) {\n if (len === void 0) { len = 2; }\n val = String(val);\n while (val.length < len) {\n val = \"0\" + val;\n }\n return val;\n};\nvar formatFlags = {\n D: function (dateObj) { return String(dateObj.getDate()); },\n DD: function (dateObj) { return pad(dateObj.getDate()); },\n Do: function (dateObj, i18n) {\n return i18n.DoFn(dateObj.getDate());\n },\n d: function (dateObj) { return String(dateObj.getDay()); },\n dd: function (dateObj) { return pad(dateObj.getDay()); },\n ddd: function (dateObj, i18n) {\n return i18n.dayNamesShort[dateObj.getDay()];\n },\n dddd: function (dateObj, i18n) {\n return i18n.dayNames[dateObj.getDay()];\n },\n M: function (dateObj) { return String(dateObj.getMonth() + 1); },\n MM: function (dateObj) { return pad(dateObj.getMonth() + 1); },\n MMM: function (dateObj, i18n) {\n return i18n.monthNamesShort[dateObj.getMonth()];\n },\n MMMM: function (dateObj, i18n) {\n return i18n.monthNames[dateObj.getMonth()];\n },\n YY: function (dateObj) {\n return pad(String(dateObj.getFullYear()), 4).substr(2);\n },\n YYYY: function (dateObj) { return pad(dateObj.getFullYear(), 4); },\n h: function (dateObj) { return String(dateObj.getHours() % 12 || 12); },\n hh: function (dateObj) { return pad(dateObj.getHours() % 12 || 12); },\n H: function (dateObj) { return String(dateObj.getHours()); },\n HH: function (dateObj) { return pad(dateObj.getHours()); },\n m: function (dateObj) { return String(dateObj.getMinutes()); },\n mm: function (dateObj) { return pad(dateObj.getMinutes()); },\n s: function (dateObj) { return String(dateObj.getSeconds()); },\n ss: function (dateObj) { return pad(dateObj.getSeconds()); },\n S: function (dateObj) {\n return String(Math.round(dateObj.getMilliseconds() / 100));\n },\n SS: function (dateObj) {\n return pad(Math.round(dateObj.getMilliseconds() / 10), 2);\n },\n SSS: function (dateObj) { return pad(dateObj.getMilliseconds(), 3); },\n a: function (dateObj, i18n) {\n return dateObj.getHours() < 12 ? i18n.amPm[0] : i18n.amPm[1];\n },\n A: function (dateObj, i18n) {\n return dateObj.getHours() < 12\n ? i18n.amPm[0].toUpperCase()\n : i18n.amPm[1].toUpperCase();\n },\n ZZ: function (dateObj) {\n var offset = dateObj.getTimezoneOffset();\n return ((offset > 0 ? \"-\" : \"+\") +\n pad(Math.floor(Math.abs(offset) / 60) * 100 + (Math.abs(offset) % 60), 4));\n },\n Z: function (dateObj) {\n var offset = dateObj.getTimezoneOffset();\n return ((offset > 0 ? \"-\" : \"+\") +\n pad(Math.floor(Math.abs(offset) / 60), 2) +\n \":\" +\n pad(Math.abs(offset) % 60, 2));\n }\n};\nvar monthParse = function (v) { return +v - 1; };\nvar emptyDigits = [null, twoDigitsOptional];\nvar emptyWord = [null, word];\nvar amPm = [\n \"isPm\",\n word,\n function (v, i18n) {\n var val = v.toLowerCase();\n if (val === i18n.amPm[0]) {\n return 0;\n }\n else if (val === i18n.amPm[1]) {\n return 1;\n }\n return null;\n }\n];\nvar timezoneOffset = [\n \"timezoneOffset\",\n \"[^\\\\s]*?[\\\\+\\\\-]\\\\d\\\\d:?\\\\d\\\\d|[^\\\\s]*?Z?\",\n function (v) {\n var parts = (v + \"\").match(/([+-]|\\d\\d)/gi);\n if (parts) {\n var minutes = +parts[1] * 60 + parseInt(parts[2], 10);\n return parts[0] === \"+\" ? minutes : -minutes;\n }\n return 0;\n }\n];\nvar parseFlags = {\n D: [\"day\", twoDigitsOptional],\n DD: [\"day\", twoDigits],\n Do: [\"day\", twoDigitsOptional + word, function (v) { return parseInt(v, 10); }],\n M: [\"month\", twoDigitsOptional, monthParse],\n MM: [\"month\", twoDigits, monthParse],\n YY: [\n \"year\",\n twoDigits,\n function (v) {\n var now = new Date();\n var cent = +(\"\" + now.getFullYear()).substr(0, 2);\n return +(\"\" + (+v > 68 ? cent - 1 : cent) + v);\n }\n ],\n h: [\"hour\", twoDigitsOptional, undefined, \"isPm\"],\n hh: [\"hour\", twoDigits, undefined, \"isPm\"],\n H: [\"hour\", twoDigitsOptional],\n HH: [\"hour\", twoDigits],\n m: [\"minute\", twoDigitsOptional],\n mm: [\"minute\", twoDigits],\n s: [\"second\", twoDigitsOptional],\n ss: [\"second\", twoDigits],\n YYYY: [\"year\", fourDigits],\n S: [\"millisecond\", \"\\\\d\", function (v) { return +v * 100; }],\n SS: [\"millisecond\", twoDigits, function (v) { return +v * 10; }],\n SSS: [\"millisecond\", threeDigits],\n d: emptyDigits,\n dd: emptyDigits,\n ddd: emptyWord,\n dddd: emptyWord,\n MMM: [\"month\", word, monthUpdate(\"monthNamesShort\")],\n MMMM: [\"month\", word, monthUpdate(\"monthNames\")],\n a: amPm,\n A: amPm,\n ZZ: timezoneOffset,\n Z: timezoneOffset\n};\n// Some common format strings\nvar globalMasks = {\n default: \"ddd MMM DD YYYY HH:mm:ss\",\n shortDate: \"M/D/YY\",\n mediumDate: \"MMM D, YYYY\",\n longDate: \"MMMM D, YYYY\",\n fullDate: \"dddd, MMMM D, YYYY\",\n isoDate: \"YYYY-MM-DD\",\n isoDateTime: \"YYYY-MM-DDTHH:mm:ssZ\",\n shortTime: \"HH:mm\",\n mediumTime: \"HH:mm:ss\",\n longTime: \"HH:mm:ss.SSS\"\n};\nvar setGlobalDateMasks = function (masks) { return fecha_assign(globalMasks, masks); };\n/***\n * Format a date\n * @method format\n * @param {Date|number} dateObj\n * @param {string} mask Format of the date, i.e. 'mm-dd-yy' or 'shortDate'\n * @returns {string} Formatted date string\n */\nvar fecha_format = function (dateObj, mask, i18n) {\n if (mask === void 0) { mask = globalMasks[\"default\"]; }\n if (i18n === void 0) { i18n = {}; }\n if (typeof dateObj === \"number\") {\n dateObj = new Date(dateObj);\n }\n if (Object.prototype.toString.call(dateObj) !== \"[object Date]\" ||\n isNaN(dateObj.getTime())) {\n throw new Error(\"Invalid Date pass to format\");\n }\n mask = globalMasks[mask] || mask;\n var literals = [];\n // Make literals inactive by replacing them with @@@\n mask = mask.replace(literal, function ($0, $1) {\n literals.push($1);\n return \"@@@\";\n });\n var combinedI18nSettings = fecha_assign(fecha_assign({}, globalI18n), i18n);\n // Apply formatting rules\n mask = mask.replace(token, function ($0) {\n return formatFlags[$0](dateObj, combinedI18nSettings);\n });\n // Inline literal values back into the formatted value\n return mask.replace(/@@@/g, function () { return literals.shift(); });\n};\n/**\n * Parse a date string into a Javascript Date object /\n * @method parse\n * @param {string} dateStr Date string\n * @param {string} format Date parse format\n * @param {i18n} I18nSettingsOptional Full or subset of I18N settings\n * @returns {Date|null} Returns Date object. Returns null what date string is invalid or doesn't match format\n */\nfunction parse(dateStr, format, i18n) {\n if (i18n === void 0) { i18n = {}; }\n if (typeof format !== \"string\") {\n throw new Error(\"Invalid format in fecha parse\");\n }\n // Check to see if the format is actually a mask\n format = globalMasks[format] || format;\n // Avoid regular expression denial of service, fail early for really long strings\n // https://www.owasp.org/index.php/Regular_expression_Denial_of_Service_-_ReDoS\n if (dateStr.length > 1000) {\n return null;\n }\n // Default to the beginning of the year.\n var today = new Date();\n var dateInfo = {\n year: today.getFullYear(),\n month: 0,\n day: 1,\n hour: 0,\n minute: 0,\n second: 0,\n millisecond: 0,\n isPm: null,\n timezoneOffset: null\n };\n var parseInfo = [];\n var literals = [];\n // Replace all the literals with @@@. Hopefully a string that won't exist in the format\n var newFormat = format.replace(literal, function ($0, $1) {\n literals.push(regexEscape($1));\n return \"@@@\";\n });\n var specifiedFields = {};\n var requiredFields = {};\n // Change every token that we find into the correct regex\n newFormat = regexEscape(newFormat).replace(token, function ($0) {\n var info = parseFlags[$0];\n var field = info[0], regex = info[1], requiredField = info[3];\n // Check if the person has specified the same field twice. This will lead to confusing results.\n if (specifiedFields[field]) {\n throw new Error(\"Invalid format. \" + field + \" specified twice in format\");\n }\n specifiedFields[field] = true;\n // Check if there are any required fields. For instance, 12 hour time requires AM/PM specified\n if (requiredField) {\n requiredFields[requiredField] = true;\n }\n parseInfo.push(info);\n return \"(\" + regex + \")\";\n });\n // Check all the required fields are present\n Object.keys(requiredFields).forEach(function (field) {\n if (!specifiedFields[field]) {\n throw new Error(\"Invalid format. \" + field + \" is required in specified format\");\n }\n });\n // Add back all the literals after\n newFormat = newFormat.replace(/@@@/g, function () { return literals.shift(); });\n // Check if the date string matches the format. If it doesn't return null\n var matches = dateStr.match(new RegExp(newFormat, \"i\"));\n if (!matches) {\n return null;\n }\n var combinedI18nSettings = fecha_assign(fecha_assign({}, globalI18n), i18n);\n // For each match, call the parser function for that date part\n for (var i = 1; i < matches.length; i++) {\n var _a = parseInfo[i - 1], field = _a[0], parser = _a[2];\n var value = parser\n ? parser(matches[i], combinedI18nSettings)\n : +matches[i];\n // If the parser can't make sense of the value, return null\n if (value == null) {\n return null;\n }\n dateInfo[field] = value;\n }\n if (dateInfo.isPm === 1 && dateInfo.hour != null && +dateInfo.hour !== 12) {\n dateInfo.hour = +dateInfo.hour + 12;\n }\n else if (dateInfo.isPm === 0 && +dateInfo.hour === 12) {\n dateInfo.hour = 0;\n }\n var dateWithoutTZ = new Date(dateInfo.year, dateInfo.month, dateInfo.day, dateInfo.hour, dateInfo.minute, dateInfo.second, dateInfo.millisecond);\n var validateFields = [\n [\"month\", \"getMonth\"],\n [\"day\", \"getDate\"],\n [\"hour\", \"getHours\"],\n [\"minute\", \"getMinutes\"],\n [\"second\", \"getSeconds\"]\n ];\n for (var i = 0, len = validateFields.length; i < len; i++) {\n // Check to make sure the date field is within the allowed range. Javascript dates allows values\n // outside the allowed range. If the values don't match the value was invalid\n if (specifiedFields[validateFields[i][0]] &&\n dateInfo[validateFields[i][0]] !== dateWithoutTZ[validateFields[i][1]]()) {\n return null;\n }\n }\n if (dateInfo.timezoneOffset == null) {\n return dateWithoutTZ;\n }\n return new Date(Date.UTC(dateInfo.year, dateInfo.month, dateInfo.day, dateInfo.hour, dateInfo.minute - dateInfo.timezoneOffset, dateInfo.second, dateInfo.millisecond));\n}\nvar fecha = {\n format: fecha_format,\n parse: parse,\n defaultI18n: defaultI18n,\n setGlobalDateI18n: setGlobalDateI18n,\n setGlobalDateMasks: setGlobalDateMasks\n};\n\n/* harmony default export */ var lib_fecha = (fecha);\n\n//# sourceMappingURL=fecha.js.map\n\n// CONCATENATED MODULE: ./node_modules/@antv/scale/esm/util/bisector.js\n\n/**\n * 二分右侧查找\n * https://github.com/d3/d3-array/blob/master/src/bisector.js\n */\n/* harmony default export */ var bisector = (function (getter) {\n /**\n * x: 目标值\n * lo: 起始位置\n * hi: 结束位置\n */\n return function (a, x, _lo, _hi) {\n var lo = Object(esm[\"isNil\"])(_lo) ? 0 : _lo;\n var hi = Object(esm[\"isNil\"])(_hi) ? a.length : _hi;\n while (lo < hi) {\n var mid = (lo + hi) >>> 1;\n if (getter(a[mid]) > x) {\n hi = mid;\n }\n else {\n lo = mid + 1;\n }\n }\n return lo;\n };\n});\n//# sourceMappingURL=bisector.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/scale/esm/util/time.js\n\n\n\n\nvar FORMAT_METHOD = 'format';\nfunction timeFormat(time, mask) {\n var method = fecha_namespaceObject[FORMAT_METHOD] || lib_fecha[FORMAT_METHOD];\n return method(time, mask);\n}\n/**\n * 转换成时间戳\n * @param value 时间值\n */\nfunction toTimeStamp(value) {\n if (Object(esm[\"isString\"])(value)) {\n if (value.indexOf('T') > 0) {\n value = new Date(value).getTime();\n }\n else {\n // new Date('2010/01/10') 和 new Date('2010-01-10') 的差别在于:\n // 如果仅有年月日时,前者是带有时区的: Fri Jan 10 2020 02:40:13 GMT+0800 (中国标准时间)\n // 后者会格式化成 Sun Jan 10 2010 08:00:00 GMT+0800 (中国标准时间)\n value = new Date(value.replace(/-/gi, '/')).getTime();\n }\n }\n if (Object(esm[\"isDate\"])(value)) {\n value = value.getTime();\n }\n return value;\n}\nvar SECOND = 1000;\nvar MINUTE = 60 * SECOND;\nvar HOUR = 60 * MINUTE;\nvar DAY = 24 * HOUR;\nvar MONTH = DAY * 31;\nvar YEAR = DAY * 365;\n\nvar intervals = [\n ['HH:mm:ss', SECOND],\n ['HH:mm:ss', SECOND * 10],\n ['HH:mm:ss', SECOND * 30],\n ['HH:mm', MINUTE],\n ['HH:mm', MINUTE * 10],\n ['HH:mm', MINUTE * 30],\n ['HH', HOUR],\n ['HH', HOUR * 6],\n ['HH', HOUR * 12],\n ['YYYY-MM-DD', DAY],\n ['YYYY-MM-DD', DAY * 4],\n ['YYYY-WW', DAY * 7],\n ['YYYY-MM', MONTH],\n ['YYYY-MM', MONTH * 4],\n ['YYYY-MM', MONTH * 6],\n ['YYYY', DAY * 380], // 借鉴echarts,保证每个周期累加时不会碰到恰巧不够的问题\n];\nfunction getTickInterval(min, max, tickCount) {\n var target = (max - min) / tickCount;\n var idx = bisector(function (o) { return o[1]; })(intervals, target) - 1;\n var interval = intervals[idx];\n if (idx < 0) {\n interval = intervals[0];\n }\n else if (idx >= intervals.length) {\n interval = Object(esm[\"last\"])(intervals);\n }\n return interval;\n}\n//# sourceMappingURL=time.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/scale/esm/category/time.js\n\n\n\n\n/**\n * 时间分类度量\n * @class\n */\nvar time_TimeCat = /** @class */ (function (_super) {\n Object(tslib_es6[\"__extends\"])(TimeCat, _super);\n function TimeCat() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n _this.type = 'timeCat';\n return _this;\n }\n /**\n * @override\n */\n TimeCat.prototype.translate = function (value) {\n value = toTimeStamp(value);\n var index = this.values.indexOf(value);\n if (index === -1) {\n if (Object(esm[\"isNumber\"])(value) && value < this.values.length) {\n index = value;\n }\n else {\n index = NaN;\n }\n }\n return index;\n };\n /**\n * 由于时间类型数据需要转换一下,所以复写 getText\n * @override\n */\n TimeCat.prototype.getText = function (value, tickIndex) {\n var index = this.translate(value);\n if (index > -1) {\n var result = this.values[index];\n var formatter = this.formatter;\n result = formatter ? formatter(result, tickIndex) : timeFormat(result, this.mask);\n return result;\n }\n return value;\n };\n TimeCat.prototype.initCfg = function () {\n this.tickMethod = 'time-cat';\n this.mask = 'YYYY-MM-DD';\n this.tickCount = 7; // 一般时间数据会显示 7, 14, 30 天的数字\n };\n TimeCat.prototype.setDomain = function () {\n var values = this.values;\n // 针对时间分类类型,会将时间统一转换为时间戳\n Object(esm[\"each\"])(values, function (v, i) {\n values[i] = toTimeStamp(v);\n });\n values.sort(function (v1, v2) {\n return v1 - v2;\n });\n _super.prototype.setDomain.call(this);\n };\n return TimeCat;\n}(category_base));\n/* harmony default export */ var category_time = (time_TimeCat);\n//# sourceMappingURL=time.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/scale/esm/continuous/base.js\n\n\n\n/**\n * 连续度量的基类\n * @class\n */\nvar base_Continuous = /** @class */ (function (_super) {\n Object(tslib_es6[\"__extends\"])(Continuous, _super);\n function Continuous() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n _this.isContinuous = true;\n return _this;\n }\n Continuous.prototype.scale = function (value) {\n if (Object(esm[\"isNil\"])(value)) {\n return NaN;\n }\n var rangeMin = this.rangeMin();\n var rangeMax = this.rangeMax();\n var max = this.max;\n var min = this.min;\n if (max === min) {\n return rangeMin;\n }\n var percent = this.getScalePercent(value);\n return rangeMin + percent * (rangeMax - rangeMin);\n };\n Continuous.prototype.init = function () {\n _super.prototype.init.call(this);\n // init 完成后保证 min, max 包含 ticks 的范围\n var ticks = this.ticks;\n var firstTick = Object(esm[\"head\"])(ticks);\n var lastTick = Object(esm[\"last\"])(ticks);\n if (firstTick < this.min) {\n this.min = firstTick;\n }\n if (lastTick > this.max) {\n this.max = lastTick;\n }\n // strict-limit 方式\n if (!Object(esm[\"isNil\"])(this.minLimit)) {\n this.min = firstTick;\n }\n if (!Object(esm[\"isNil\"])(this.maxLimit)) {\n this.max = lastTick;\n }\n };\n Continuous.prototype.setDomain = function () {\n var _a = Object(esm[\"getRange\"])(this.values), min = _a.min, max = _a.max;\n if (Object(esm[\"isNil\"])(this.min)) {\n this.min = min;\n }\n if (Object(esm[\"isNil\"])(this.max)) {\n this.max = max;\n }\n if (this.min > this.max) {\n this.min = min;\n this.max = max;\n }\n };\n Continuous.prototype.calculateTicks = function () {\n var _this = this;\n var ticks = _super.prototype.calculateTicks.call(this);\n if (!this.nice) {\n ticks = Object(esm[\"filter\"])(ticks, function (tick) {\n return tick >= _this.min && tick <= _this.max;\n });\n }\n return ticks;\n };\n // 计算原始值值占的百分比\n Continuous.prototype.getScalePercent = function (value) {\n var max = this.max;\n var min = this.min;\n return (value - min) / (max - min);\n };\n Continuous.prototype.getInvertPercent = function (value) {\n return (value - this.rangeMin()) / (this.rangeMax() - this.rangeMin());\n };\n return Continuous;\n}(esm_base));\n/* harmony default export */ var continuous_base = (base_Continuous);\n//# sourceMappingURL=base.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/scale/esm/continuous/linear.js\n\n\n/**\n * 线性度量\n * @class\n */\nvar linear_Linear = /** @class */ (function (_super) {\n Object(tslib_es6[\"__extends\"])(Linear, _super);\n function Linear() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n _this.type = 'linear';\n _this.isLinear = true;\n return _this;\n }\n Linear.prototype.invert = function (value) {\n var percent = this.getInvertPercent(value);\n return this.min + percent * (this.max - this.min);\n };\n Linear.prototype.initCfg = function () {\n this.tickMethod = 'wilkinson-extended';\n this.nice = false;\n };\n return Linear;\n}(continuous_base));\n/* harmony default export */ var linear = (linear_Linear);\n//# sourceMappingURL=linear.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/scale/esm/util/math.js\n\n// 求以a为次幂,结果为b的基数,如 x^^a = b;求x\n// 虽然数学上 b 不支持负数,但是这里需要支持 负数\nfunction calBase(a, b) {\n var e = Math.E;\n var value;\n if (b >= 0) {\n value = Math.pow(e, Math.log(b) / a); // 使用换底公式求底\n }\n else {\n value = Math.pow(e, Math.log(-b) / a) * -1; // 使用换底公式求底\n }\n return value;\n}\nfunction log(a, b) {\n if (a === 1) {\n return 1;\n }\n return Math.log(b) / Math.log(a);\n}\nfunction getLogPositiveMin(values, base, max) {\n if (Object(esm[\"isNil\"])(max)) {\n max = Math.max.apply(null, values);\n }\n var positiveMin = max;\n Object(esm[\"each\"])(values, function (value) {\n if (value > 0 && value < positiveMin) {\n positiveMin = value;\n }\n });\n if (positiveMin === max) {\n positiveMin = max / base;\n }\n if (positiveMin > 1) {\n positiveMin = 1;\n }\n return positiveMin;\n}\nfunction digitLength(num) {\n // Get digit length of e\n var eSplit = num.toString().split(/[eE]/);\n var len = (eSplit[0].split('.')[1] || '').length - +(eSplit[1] || 0);\n return len > 0 ? len : 0;\n}\n/**\n * 高精度加法,解决 0.1 + 0.2 !== 0.3 的经典问题\n *\n * @param num1 加数\n * @param num2 被加数\n * @return {number} 返回值\n */\nfunction precisionAdd(num1, num2) {\n var num1Digits = digitLength(num1);\n var num2Digits = digitLength(num2);\n var baseNum = Math.pow(10, Math.max(num1Digits, num2Digits));\n return (num1 * baseNum + num2 * baseNum) / baseNum;\n}\n//# sourceMappingURL=math.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/scale/esm/continuous/log.js\n\n\n\n/**\n * Log 度量,处理非均匀分布\n */\nvar log_Log = /** @class */ (function (_super) {\n Object(tslib_es6[\"__extends\"])(Log, _super);\n function Log() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n _this.type = 'log';\n return _this;\n }\n /**\n * @override\n */\n Log.prototype.invert = function (value) {\n var base = this.base;\n var max = log(base, this.max);\n var rangeMin = this.rangeMin();\n var range = this.rangeMax() - rangeMin;\n var min;\n var positiveMin = this.positiveMin;\n if (positiveMin) {\n if (value === 0) {\n return 0;\n }\n min = log(base, positiveMin / base);\n var appendPercent = (1 / (max - min)) * range; // 0 到 positiveMin的占比\n if (value < appendPercent) {\n // 落到 0 - positiveMin 之间\n return (value / appendPercent) * positiveMin;\n }\n }\n else {\n min = log(base, this.min);\n }\n var percent = (value - rangeMin) / range;\n var tmp = percent * (max - min) + min;\n return Math.pow(base, tmp);\n };\n Log.prototype.initCfg = function () {\n this.tickMethod = 'log';\n this.base = 10;\n this.tickCount = 6;\n this.nice = true;\n };\n // 设置\n Log.prototype.setDomain = function () {\n _super.prototype.setDomain.call(this);\n var min = this.min;\n if (min < 0) {\n throw new Error('When you use log scale, the minimum value must be greater than zero!');\n }\n if (min === 0) {\n this.positiveMin = getLogPositiveMin(this.values, this.base, this.max);\n }\n };\n // 根据当前值获取占比\n Log.prototype.getScalePercent = function (value) {\n var max = this.max;\n var min = this.min;\n if (max === min) {\n return 0;\n }\n // 如果值小于等于0,则按照0处理\n if (value <= 0) {\n return 0;\n }\n var base = this.base;\n var positiveMin = this.positiveMin;\n // 如果min == 0, 则根据比0大的最小值,计算比例关系。这个最小值作为坐标轴上的第二个tick,第一个是0但是不显示\n if (positiveMin) {\n min = (positiveMin * 1) / base;\n }\n var percent;\n // 如果数值小于次小值,那么就计算 value / 次小值 占整体的比例\n if (value < positiveMin) {\n percent = value / positiveMin / (log(base, max) - log(base, min));\n }\n else {\n percent = (log(base, value) - log(base, min)) / (log(base, max) - log(base, min));\n }\n return percent;\n };\n return Log;\n}(continuous_base));\n/* harmony default export */ var continuous_log = (log_Log);\n//# sourceMappingURL=log.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/scale/esm/continuous/pow.js\n\n\n\n/**\n * Pow 度量,处理非均匀分布\n */\nvar pow_Pow = /** @class */ (function (_super) {\n Object(tslib_es6[\"__extends\"])(Pow, _super);\n function Pow() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n _this.type = 'pow';\n return _this;\n }\n /**\n * @override\n */\n Pow.prototype.invert = function (value) {\n var percent = this.getInvertPercent(value);\n var exponent = this.exponent;\n var max = calBase(exponent, this.max);\n var min = calBase(exponent, this.min);\n var tmp = percent * (max - min) + min;\n var factor = tmp >= 0 ? 1 : -1;\n return Math.pow(tmp, exponent) * factor;\n };\n Pow.prototype.initCfg = function () {\n this.tickMethod = 'pow';\n this.exponent = 2;\n this.tickCount = 5;\n this.nice = true;\n };\n // 获取度量计算时,value占的定义域百分比\n Pow.prototype.getScalePercent = function (value) {\n var max = this.max;\n var min = this.min;\n if (max === min) {\n return 0;\n }\n var exponent = this.exponent;\n var percent = (calBase(exponent, value) - calBase(exponent, min)) / (calBase(exponent, max) - calBase(exponent, min));\n return percent;\n };\n return Pow;\n}(continuous_base));\n/* harmony default export */ var pow = (pow_Pow);\n//# sourceMappingURL=pow.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/scale/esm/continuous/time.js\n\n\n\n\n/**\n * 时间度量\n * @class\n */\nvar time_Time = /** @class */ (function (_super) {\n Object(tslib_es6[\"__extends\"])(Time, _super);\n function Time() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n _this.type = 'time';\n return _this;\n }\n /**\n * @override\n */\n Time.prototype.getText = function (value, index) {\n var numberValue = this.translate(value);\n var formatter = this.formatter;\n return formatter ? formatter(numberValue, index) : timeFormat(numberValue, this.mask);\n };\n /**\n * @override\n */\n Time.prototype.scale = function (value) {\n var v = value;\n if (Object(esm[\"isString\"])(v) || Object(esm[\"isDate\"])(v)) {\n v = this.translate(v);\n }\n return _super.prototype.scale.call(this, v);\n };\n /**\n * 将时间转换成数字\n * @override\n */\n Time.prototype.translate = function (v) {\n return toTimeStamp(v);\n };\n Time.prototype.initCfg = function () {\n this.tickMethod = 'time-pretty';\n this.mask = 'YYYY-MM-DD';\n this.tickCount = 7;\n this.nice = false;\n };\n Time.prototype.setDomain = function () {\n var values = this.values;\n // 是否设置了 min, max,而不是直接取 this.min, this.max\n var minConfig = this.getConfig('min');\n var maxConfig = this.getConfig('max');\n // 如果设置了 min,max 则转换成时间戳\n if (!Object(esm[\"isNil\"])(minConfig) || !Object(esm[\"isNumber\"])(minConfig)) {\n this.min = this.translate(this.min);\n }\n if (!Object(esm[\"isNil\"])(maxConfig) || !Object(esm[\"isNumber\"])(maxConfig)) {\n this.max = this.translate(this.max);\n }\n // 没有设置 min, max 时\n if (values && values.length) {\n // 重新计算最大最小值\n var timeStamps_1 = [];\n var min_1 = Infinity; // 最小值\n var secondMin_1 = min_1; // 次小值\n var max_1 = 0;\n // 使用一个循环,计算min,max,secondMin\n Object(esm[\"each\"])(values, function (v) {\n var timeStamp = toTimeStamp(v);\n if (isNaN(timeStamp)) {\n throw new TypeError(\"Invalid Time: \" + v + \" in time scale!\");\n }\n if (min_1 > timeStamp) {\n secondMin_1 = min_1;\n min_1 = timeStamp;\n }\n else if (secondMin_1 > timeStamp) {\n secondMin_1 = timeStamp;\n }\n if (max_1 < timeStamp) {\n max_1 = timeStamp;\n }\n timeStamps_1.push(timeStamp);\n });\n // 存在多个值时,设置最小间距\n if (values.length > 1) {\n this.minTickInterval = secondMin_1 - min_1;\n }\n if (Object(esm[\"isNil\"])(minConfig)) {\n this.min = min_1;\n }\n if (Object(esm[\"isNil\"])(maxConfig)) {\n this.max = max_1;\n }\n }\n };\n return Time;\n}(linear));\n/* harmony default export */ var continuous_time = (time_Time);\n//# sourceMappingURL=time.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/scale/esm/continuous/quantize.js\n\n\n\n/**\n * 分段度量\n */\nvar quantize_Quantize = /** @class */ (function (_super) {\n Object(tslib_es6[\"__extends\"])(Quantize, _super);\n function Quantize() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n _this.type = 'quantize';\n return _this;\n }\n Quantize.prototype.invert = function (value) {\n var ticks = this.ticks;\n var length = ticks.length;\n var percent = this.getInvertPercent(value);\n var minIndex = Math.floor(percent * (length - 1));\n // 最后一个\n if (minIndex >= length - 1) {\n return Object(esm[\"last\"])(ticks);\n }\n // 超出左边界, 则取第一个\n if (minIndex < 0) {\n return Object(esm[\"head\"])(ticks);\n }\n var minTick = ticks[minIndex];\n var nextTick = ticks[minIndex + 1];\n // 比当前值小的 tick 在度量上的占比\n var minIndexPercent = minIndex / (length - 1);\n var maxIndexPercent = (minIndex + 1) / (length - 1);\n return minTick + (percent - minIndexPercent) / (maxIndexPercent - minIndexPercent) * (nextTick - minTick);\n };\n Quantize.prototype.initCfg = function () {\n this.tickMethod = 'r-pretty';\n this.tickCount = 5;\n this.nice = true;\n };\n Quantize.prototype.calculateTicks = function () {\n var ticks = _super.prototype.calculateTicks.call(this);\n if (!this.nice) { // 如果 nice = false ,补充 min, max\n if (Object(esm[\"last\"])(ticks) !== this.max) {\n ticks.push(this.max);\n }\n if (Object(esm[\"head\"])(ticks) !== this.min) {\n ticks.unshift(this.min);\n }\n }\n return ticks;\n };\n // 计算当前值在刻度中的占比\n Quantize.prototype.getScalePercent = function (value) {\n var ticks = this.ticks;\n // 超出左边界\n if (value < Object(esm[\"head\"])(ticks)) {\n return 0;\n }\n // 超出右边界\n if (value > Object(esm[\"last\"])(ticks)) {\n return 1;\n }\n var minIndex = 0;\n Object(esm[\"each\"])(ticks, function (tick, index) {\n if (value >= tick) {\n minIndex = index;\n }\n else {\n return false;\n }\n });\n return minIndex / (ticks.length - 1);\n };\n return Quantize;\n}(continuous_base));\n/* harmony default export */ var quantize = (quantize_Quantize);\n//# sourceMappingURL=quantize.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/scale/esm/continuous/quantile.js\n\n\nvar quantile_Quantile = /** @class */ (function (_super) {\n Object(tslib_es6[\"__extends\"])(Quantile, _super);\n function Quantile() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n _this.type = 'quantile';\n return _this;\n }\n Quantile.prototype.initCfg = function () {\n this.tickMethod = 'quantile';\n this.tickCount = 5;\n this.nice = true;\n };\n return Quantile;\n}(quantize));\n/* harmony default export */ var quantile = (quantile_Quantile);\n//# sourceMappingURL=quantile.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/scale/esm/factory.js\n\nvar factory_map = {};\nfunction getClass(key) {\n return factory_map[key];\n}\nfunction registerClass(key, cls) {\n if (getClass(key)) {\n throw new Error(\"type '\" + key + \"' existed.\");\n }\n factory_map[key] = cls;\n}\n\n//# sourceMappingURL=factory.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/scale/esm/identity/index.js\n\n\n\n/**\n * identity scale原则上是定义域和值域一致,scale/invert方法也是一致的\n * 参考R的实现:https://github.com/r-lib/scales/blob/master/R/pal-identity.r\n * 参考d3的实现(做了下转型):https://github.com/d3/d3-scale/blob/master/src/identity.js\n */\nvar identity_Identity = /** @class */ (function (_super) {\n Object(tslib_es6[\"__extends\"])(Identity, _super);\n function Identity() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n _this.type = 'identity';\n _this.isIdentity = true;\n return _this;\n }\n Identity.prototype.calculateTicks = function () {\n return this.values;\n };\n Identity.prototype.scale = function (value) {\n // 如果传入的值不等于 identity 的值,则直接返回,用于一维图时的 dodge\n if (this.values[0] !== value && Object(esm[\"isNumber\"])(value)) {\n return value;\n }\n return this.range[0];\n };\n Identity.prototype.invert = function (value) {\n var range = this.range;\n if (value < range[0] || value > range[1]) {\n return NaN;\n }\n return this.values[0];\n };\n return Identity;\n}(esm_base));\n/* harmony default export */ var identity = (identity_Identity);\n//# sourceMappingURL=index.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/scale/esm/util/pretty-number.js\n// 为了解决 js 运算的精度问题\nfunction prettyNumber(n) {\n return Math.abs(n) < 1e-15 ? n : parseFloat(n.toFixed(15));\n}\n//# sourceMappingURL=pretty-number.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/scale/esm/util/extended.js\n\n\nvar DEFAULT_Q = [1, 5, 2, 2.5, 4, 3];\nvar ALL_Q = [1, 5, 2, 2.5, 4, 3, 1.5, 7, 6, 8, 9];\nvar extended_eps = Number.EPSILON * 100;\nfunction mod(n, m) {\n return ((n % m) + m) % m;\n}\nfunction round(n) {\n return Math.round(n * 1e12) / 1e12;\n}\nfunction simplicity(q, Q, j, lmin, lmax, lstep) {\n var n = Object(esm[\"size\"])(Q);\n var i = Object(esm[\"indexOf\"])(Q, q);\n var v = 0;\n var m = mod(lmin, lstep);\n if ((m < extended_eps || lstep - m < extended_eps) && lmin <= 0 && lmax >= 0) {\n v = 1;\n }\n return 1 - i / (n - 1) - j + v;\n}\nfunction simplicityMax(q, Q, j) {\n var n = Object(esm[\"size\"])(Q);\n var i = Object(esm[\"indexOf\"])(Q, q);\n var v = 1;\n return 1 - i / (n - 1) - j + v;\n}\nfunction density(k, m, dMin, dMax, lMin, lMax) {\n var r = (k - 1) / (lMax - lMin);\n var rt = (m - 1) / (Math.max(lMax, dMax) - Math.min(dMin, lMin));\n return 2 - Math.max(r / rt, rt / r);\n}\nfunction densityMax(k, m) {\n if (k >= m) {\n return 2 - (k - 1) / (m - 1);\n }\n return 1;\n}\nfunction coverage(dMin, dMax, lMin, lMax) {\n var range = dMax - dMin;\n return 1 - (0.5 * (Math.pow((dMax - lMax), 2) + Math.pow((dMin - lMin), 2))) / Math.pow((0.1 * range), 2);\n}\nfunction coverageMax(dMin, dMax, span) {\n var range = dMax - dMin;\n if (span > range) {\n var half = (span - range) / 2;\n return 1 - Math.pow(half, 2) / Math.pow((0.1 * range), 2);\n }\n return 1;\n}\nfunction legibility() {\n return 1;\n}\n/**\n * An Extension of Wilkinson's Algorithm for Position Tick Labels on Axes\n * https://www.yuque.com/preview/yuque/0/2019/pdf/185317/1546999150858-45c3b9c2-4e86-4223-bf1a-8a732e8195ed.pdf\n * @param dMin 最小值\n * @param dMax 最大值\n * @param m tick个数\n * @param onlyLoose 是否允许扩展min、max,不绝对强制,例如[3, 97]\n * @param Q nice numbers集合\n * @param w 四个优化组件的权重\n */\nfunction extended(dMin, dMax, n, onlyLoose, Q, w) {\n if (n === void 0) { n = 5; }\n if (onlyLoose === void 0) { onlyLoose = true; }\n if (Q === void 0) { Q = DEFAULT_Q; }\n if (w === void 0) { w = [0.25, 0.2, 0.5, 0.05]; }\n // 处理小于 0 和小数的 tickCount\n var m = n < 0 ? 0 : Math.round(n);\n // nan 也会导致异常\n if (Number.isNaN(dMin) || Number.isNaN(dMax) || typeof dMin !== 'number' || typeof dMax !== 'number' || !m) {\n return {\n min: 0,\n max: 0,\n ticks: [],\n };\n }\n // js 极大值极小值问题,差值小于 1e-15 会导致计算出错\n if (dMax - dMin < 1e-15 || m === 1) {\n return {\n min: dMin,\n max: dMax,\n ticks: [dMin],\n };\n }\n var best = {\n score: -2,\n lmin: 0,\n lmax: 0,\n lstep: 0,\n };\n var j = 1;\n while (j < Infinity) {\n for (var i = 0; i < Q.length; i += 1) {\n var q = Q[i];\n var sm = simplicityMax(q, Q, j);\n if (w[0] * sm + w[1] + w[2] + w[3] < best.score) {\n j = Infinity;\n break;\n }\n var k = 2;\n while (k < Infinity) {\n var dm = densityMax(k, m);\n if (w[0] * sm + w[1] + w[2] * dm + w[3] < best.score) {\n break;\n }\n var delta = (dMax - dMin) / (k + 1) / j / q;\n var z = Math.ceil(Math.log10(delta));\n while (z < Infinity) {\n var step = j * q * Math.pow(10, z);\n var cm = coverageMax(dMin, dMax, step * (k - 1));\n if (w[0] * sm + w[1] * cm + w[2] * dm + w[3] < best.score) {\n break;\n }\n var minStart = Math.floor(dMax / step) * j - (k - 1) * j;\n var maxStart = Math.ceil(dMin / step) * j;\n if (minStart <= maxStart) {\n var count = maxStart - minStart;\n for (var i_1 = 0; i_1 <= count; i_1 += 1) {\n var start = minStart + i_1;\n var lMin = start * (step / j);\n var lMax = lMin + step * (k - 1);\n var lStep = step;\n var s = simplicity(q, Q, j, lMin, lMax, lStep);\n var c = coverage(dMin, dMax, lMin, lMax);\n var g = density(k, m, dMin, dMax, lMin, lMax);\n var l = legibility();\n var score = w[0] * s + w[1] * c + w[2] * g + w[3] * l;\n if (score > best.score && (!onlyLoose || (lMin <= dMin && lMax >= dMax))) {\n best.lmin = lMin;\n best.lmax = lMax;\n best.lstep = lStep;\n best.score = score;\n }\n }\n }\n z += 1;\n }\n k += 1;\n }\n }\n j += 1;\n }\n // 处理精度问题,保证这三个数没有精度问题\n var lmax = prettyNumber(best.lmax);\n var lmin = prettyNumber(best.lmin);\n var lstep = prettyNumber(best.lstep);\n // 加 round 是为处理 extended(0.94, 1, 5)\n // 保证生成的 tickCount 没有精度问题\n var tickCount = Math.floor(round((lmax - lmin) / lstep)) + 1;\n var ticks = new Array(tickCount);\n // 少用乘法:防止出现 -1.2 + 1.2 * 3 = 2.3999999999999995 的情况\n ticks[0] = prettyNumber(lmin);\n for (var i = 1; i < tickCount; i++) {\n ticks[i] = prettyNumber(ticks[i - 1] + lstep);\n }\n return {\n min: Math.min(dMin, Object(esm[\"head\"])(ticks)),\n max: Math.max(dMax, Object(esm[\"last\"])(ticks)),\n ticks: ticks,\n };\n}\n//# sourceMappingURL=extended.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/scale/esm/tick-method/cat.js\n\n\n/**\n * 计算分类 ticks\n * @param cfg 度量的配置项\n * @returns 计算后的 ticks\n */\nfunction calculateCatTicks(cfg) {\n var values = cfg.values, tickInterval = cfg.tickInterval, tickCount = cfg.tickCount;\n var ticks = values;\n if (Object(esm[\"isNumber\"])(tickInterval)) {\n return Object(esm[\"filter\"])(ticks, function (__, i) { return i % tickInterval === 0; });\n }\n var min = cfg.min, max = cfg.max;\n if (Object(esm[\"isNil\"])(min)) {\n min = 0;\n }\n if (Object(esm[\"isNil\"])(max)) {\n max = values.length - 1;\n }\n if (Object(esm[\"isNumber\"])(tickCount) && tickCount < max - min) {\n // 简单过滤,部分情况下小数的倍数也可以是整数\n // tslint:disable-next-line: no-shadowed-variable\n var ticks_1 = extended(min, max, tickCount, false, [1, 2, 5, 3, 4, 7, 6, 8, 9]).ticks;\n var valid = Object(esm[\"filter\"])(ticks_1, function (tick) { return tick >= min && tick <= max; });\n return valid.map(function (index) { return values[index]; });\n }\n return values.slice(min, max + 1);\n}\n//# sourceMappingURL=cat.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/scale/esm/util/d3-linear.js\nfunction d3Linear(cfg) {\n var min = cfg.min, max = cfg.max, nice = cfg.nice, tickCount = cfg.tickCount;\n var linear = new D3Linear();\n linear.domain([min, max]);\n if (nice) {\n linear.nice(tickCount);\n }\n return linear.ticks(tickCount);\n}\nvar DEFAULT_COUNT = 5;\nvar e10 = Math.sqrt(50);\nvar e5 = Math.sqrt(10);\nvar e2 = Math.sqrt(2);\n// https://github.com/d3/d3-scale\nvar D3Linear = /** @class */ (function () {\n function D3Linear() {\n this._domain = [0, 1];\n }\n D3Linear.prototype.domain = function (domain) {\n if (domain) {\n this._domain = Array.from(domain, Number);\n return this;\n }\n return this._domain.slice();\n };\n D3Linear.prototype.nice = function (count) {\n var _a, _b;\n if (count === void 0) { count = DEFAULT_COUNT; }\n var d = this._domain.slice();\n var i0 = 0;\n var i1 = this._domain.length - 1;\n var start = this._domain[i0];\n var stop = this._domain[i1];\n var step;\n if (stop < start) {\n _a = [stop, start], start = _a[0], stop = _a[1];\n _b = [i1, i0], i0 = _b[0], i1 = _b[1];\n }\n step = tickIncrement(start, stop, count);\n if (step > 0) {\n start = Math.floor(start / step) * step;\n stop = Math.ceil(stop / step) * step;\n step = tickIncrement(start, stop, count);\n }\n else if (step < 0) {\n start = Math.ceil(start * step) / step;\n stop = Math.floor(stop * step) / step;\n step = tickIncrement(start, stop, count);\n }\n if (step > 0) {\n d[i0] = Math.floor(start / step) * step;\n d[i1] = Math.ceil(stop / step) * step;\n this.domain(d);\n }\n else if (step < 0) {\n d[i0] = Math.ceil(start * step) / step;\n d[i1] = Math.floor(stop * step) / step;\n this.domain(d);\n }\n return this;\n };\n D3Linear.prototype.ticks = function (count) {\n if (count === void 0) { count = DEFAULT_COUNT; }\n return d3ArrayTicks(this._domain[0], this._domain[this._domain.length - 1], count || DEFAULT_COUNT);\n };\n return D3Linear;\n}());\n\nfunction d3ArrayTicks(start, stop, count) {\n var reverse;\n var i = -1;\n var n;\n var ticks;\n var step;\n (stop = +stop), (start = +start), (count = +count);\n if (start === stop && count > 0) {\n return [start];\n }\n // tslint:disable-next-line\n if ((reverse = stop < start)) {\n (n = start), (start = stop), (stop = n);\n }\n // tslint:disable-next-line\n if ((step = tickIncrement(start, stop, count)) === 0 || !isFinite(step)) {\n return [];\n }\n if (step > 0) {\n start = Math.ceil(start / step);\n stop = Math.floor(stop / step);\n ticks = new Array((n = Math.ceil(stop - start + 1)));\n while (++i < n) {\n ticks[i] = (start + i) * step;\n }\n }\n else {\n start = Math.floor(start * step);\n stop = Math.ceil(stop * step);\n ticks = new Array((n = Math.ceil(start - stop + 1)));\n while (++i < n) {\n ticks[i] = (start - i) / step;\n }\n }\n if (reverse) {\n ticks.reverse();\n }\n return ticks;\n}\nfunction tickIncrement(start, stop, count) {\n var step = (stop - start) / Math.max(0, count);\n var power = Math.floor(Math.log(step) / Math.LN10);\n var error = step / Math.pow(10, power);\n return power >= 0\n ? (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1) * Math.pow(10, power)\n : -Math.pow(10, -power) / (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1);\n}\n//# sourceMappingURL=d3-linear.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/scale/esm/util/interval.js\n\nfunction snapMultiple(v, base, snapType) {\n var div;\n if (snapType === 'ceil') {\n div = Math.ceil(v / base);\n }\n else if (snapType === 'floor') {\n div = Math.floor(v / base);\n }\n else {\n div = Math.round(v / base);\n }\n return div * base;\n}\nfunction intervalTicks(min, max, interval) {\n // 变成 interval 的倍数\n var minTick = snapMultiple(min, interval, 'floor');\n var maxTick = snapMultiple(max, interval, 'ceil');\n // 统一小数位数\n minTick = Object(esm[\"fixedBase\"])(minTick, interval);\n maxTick = Object(esm[\"fixedBase\"])(maxTick, interval);\n var ticks = [];\n for (var i = minTick; i <= maxTick; i = i + interval) {\n var tickValue = Object(esm[\"fixedBase\"])(i, interval); // 防止浮点数加法出现问题\n ticks.push(tickValue);\n }\n return {\n min: minTick,\n max: maxTick,\n ticks: ticks\n };\n}\n//# sourceMappingURL=interval.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/scale/esm/util/strict-limit.js\n\n/**\n * 按照给定的 minLimit/maxLimit/tickCount 均匀计算出刻度 ticks\n *\n * @param cfg Scale 配置项\n * @return ticks\n */\nfunction strictLimit(cfg, defaultMin, defaultMax) {\n var _a;\n var minLimit = cfg.minLimit, maxLimit = cfg.maxLimit, min = cfg.min, max = cfg.max, _b = cfg.tickCount, tickCount = _b === void 0 ? 5 : _b;\n var tickMin = Object(esm[\"isNil\"])(minLimit) ? (Object(esm[\"isNil\"])(defaultMin) ? min : defaultMin) : minLimit;\n var tickMax = Object(esm[\"isNil\"])(maxLimit) ? (Object(esm[\"isNil\"])(defaultMax) ? max : defaultMax) : maxLimit;\n if (tickMin > tickMax) {\n _a = [tickMin, tickMax], tickMax = _a[0], tickMin = _a[1];\n }\n if (tickCount <= 2) {\n return [tickMin, tickMax];\n }\n var step = (tickMax - tickMin) / (tickCount - 1);\n var ticks = [];\n for (var i = 0; i < tickCount; i++) {\n ticks.push(tickMin + step * i);\n }\n return ticks;\n}\n//# sourceMappingURL=strict-limit.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/scale/esm/tick-method/d3-linear.js\n\n\n\n\nfunction d3LinearTickMethod(cfg) {\n var min = cfg.min, max = cfg.max, tickInterval = cfg.tickInterval, minLimit = cfg.minLimit, maxLimit = cfg.maxLimit;\n var ticks = d3Linear(cfg);\n if (!Object(esm[\"isNil\"])(minLimit) || !Object(esm[\"isNil\"])(maxLimit)) {\n return strictLimit(cfg, Object(esm[\"head\"])(ticks), Object(esm[\"last\"])(ticks));\n }\n if (tickInterval) {\n return intervalTicks(min, max, tickInterval).ticks;\n }\n return ticks;\n}\n//# sourceMappingURL=d3-linear.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/scale/esm/tick-method/linear.js\n\n\n\n\n/**\n * 计算线性的 ticks,使用 wilkinson extended 方法\n * @param cfg 度量的配置项\n * @returns 计算后的 ticks\n */\nfunction linear_linear(cfg) {\n var min = cfg.min, max = cfg.max, tickCount = cfg.tickCount, nice = cfg.nice, tickInterval = cfg.tickInterval, minLimit = cfg.minLimit, maxLimit = cfg.maxLimit;\n var ticks = extended(min, max, tickCount, nice).ticks;\n if (!Object(esm[\"isNil\"])(minLimit) || !Object(esm[\"isNil\"])(maxLimit)) {\n return strictLimit(cfg, Object(esm[\"head\"])(ticks), Object(esm[\"last\"])(ticks));\n }\n if (tickInterval) {\n return intervalTicks(min, max, tickInterval).ticks;\n }\n return ticks;\n}\n//# sourceMappingURL=linear.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/scale/esm/tick-method/log.js\n\n/**\n * 计算 log 的 ticks,考虑 min = 0 的场景\n * @param cfg 度量的配置项\n * @returns 计算后的 ticks\n */\nfunction calculateLogTicks(cfg) {\n var base = cfg.base, tickCount = cfg.tickCount, min = cfg.min, max = cfg.max, values = cfg.values;\n var minTick;\n var maxTick = log(base, max);\n if (min > 0) {\n minTick = Math.floor(log(base, min));\n }\n else {\n var positiveMin = getLogPositiveMin(values, base, max);\n minTick = Math.floor(log(base, positiveMin));\n }\n var count = maxTick - minTick;\n var avg = Math.ceil(count / tickCount);\n var ticks = [];\n for (var i = minTick; i < maxTick + avg; i = i + avg) {\n ticks.push(Math.pow(base, i));\n }\n if (min <= 0) {\n // 最小值 <= 0 时显示 0\n ticks.unshift(0);\n }\n return ticks;\n}\n//# sourceMappingURL=log.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/scale/esm/util/pretty.js\n\nfunction pretty(min, max, m) {\n if (m === void 0) { m = 5; }\n if (min === max) {\n return {\n max: max,\n min: min,\n ticks: [min],\n };\n }\n var n = m < 0 ? 0 : Math.round(m);\n if (n === 0)\n return { max: max, min: min, ticks: [] };\n /*\n R pretty:\n https://svn.r-project.org/R/trunk/src/appl/pretty.c\n https://www.rdocumentation.org/packages/base/versions/3.5.2/topics/pretty\n */\n var h = 1.5; // high.u.bias\n var h5 = 0.5 + 1.5 * h; // u5.bias\n // 反正我也不会调参,跳过所有判断步骤\n var d = max - min;\n var c = d / n;\n // 当d非常小的时候触发,但似乎没什么用\n // const min_n = Math.floor(n / 3);\n // const shrink_sml = Math.pow(2, 5);\n // if (Math.log10(d) < -2) {\n // c = (_.max([ Math.abs(max), Math.abs(min) ]) * shrink_sml) / min_n;\n // }\n var base = Math.pow(10, Math.floor(Math.log10(c)));\n var unit = base;\n if (2 * base - c < h * (c - unit)) {\n unit = 2 * base;\n if (5 * base - c < h5 * (c - unit)) {\n unit = 5 * base;\n if (10 * base - c < h * (c - unit)) {\n unit = 10 * base;\n }\n }\n }\n var nu = Math.ceil(max / unit);\n var ns = Math.floor(min / unit);\n var hi = Math.max(nu * unit, max);\n var lo = Math.min(ns * unit, min);\n var size = Math.floor((hi - lo) / unit) + 1;\n var ticks = new Array(size);\n for (var i = 0; i < size; i++) {\n ticks[i] = prettyNumber(lo + i * unit);\n }\n return {\n min: lo,\n max: hi,\n ticks: ticks,\n };\n}\n//# sourceMappingURL=pretty.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/scale/esm/tick-method/pow.js\n\n\n/**\n * 计算 Pow 的 ticks\n * @param cfg 度量的配置项\n * @returns 计算后的 ticks\n */\nfunction calculatePowTicks(cfg) {\n var exponent = cfg.exponent, tickCount = cfg.tickCount;\n var max = Math.ceil(calBase(exponent, cfg.max));\n var min = Math.floor(calBase(exponent, cfg.min));\n var ticks = pretty(min, max, tickCount).ticks;\n return ticks.map(function (tick) {\n var factor = tick >= 0 ? 1 : -1;\n return Math.pow(tick, exponent) * factor;\n });\n}\n//# sourceMappingURL=pow.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/scale/esm/tick-method/quantile.js\n/**\n * 计算几分位 https://github.com/simple-statistics/simple-statistics/blob/master/src/quantile_sorted.js\n * @param x 数组\n * @param p 百分比\n */\nfunction quantileSorted(x, p) {\n var idx = x.length * p;\n /*if (x.length === 0) { // 当前场景这些条件不可能命中\n throw new Error('quantile requires at least one value.');\n } else if (p < 0 || p > 1) {\n throw new Error('quantiles must be between 0 and 1');\n } else */\n if (p === 1) {\n // If p is 1, directly return the last element\n return x[x.length - 1];\n }\n else if (p === 0) {\n // If p is 0, directly return the first element\n return x[0];\n }\n else if (idx % 1 !== 0) {\n // If p is not integer, return the next element in array\n return x[Math.ceil(idx) - 1];\n }\n else if (x.length % 2 === 0) {\n // If the list has even-length, we'll take the average of this number\n // and the next value, if there is one\n return (x[idx - 1] + x[idx]) / 2;\n }\n else {\n // Finally, in the simple case of an integer value\n // with an odd-length list, return the x value at the index.\n return x[idx];\n }\n}\nfunction calculateTicks(cfg) {\n var tickCount = cfg.tickCount, values = cfg.values;\n if (!values || !values.length) {\n return [];\n }\n var sorted = values.slice().sort(function (a, b) {\n return a - b;\n });\n var ticks = [];\n for (var i = 0; i < tickCount; i++) {\n var p = i / (tickCount - 1);\n ticks.push(quantileSorted(sorted, p));\n }\n return ticks;\n}\n//# sourceMappingURL=quantile.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/scale/esm/tick-method/r-prettry.js\n\n\n\n\n/**\n * 计算线性的 ticks,使用 R's pretty 方法\n * @param cfg 度量的配置项\n * @returns 计算后的 ticks\n */\nfunction linearPretty(cfg) {\n var min = cfg.min, max = cfg.max, tickCount = cfg.tickCount, tickInterval = cfg.tickInterval, minLimit = cfg.minLimit, maxLimit = cfg.maxLimit;\n var ticks = pretty(min, max, tickCount).ticks;\n if (!Object(esm[\"isNil\"])(minLimit) || !Object(esm[\"isNil\"])(maxLimit)) {\n return strictLimit(cfg, Object(esm[\"head\"])(ticks), Object(esm[\"last\"])(ticks));\n }\n if (tickInterval) {\n return intervalTicks(min, max, tickInterval).ticks;\n }\n return ticks;\n}\n//# sourceMappingURL=r-prettry.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/scale/esm/tick-method/time.js\n\nfunction calculateTimeTicks(cfg) {\n var min = cfg.min, max = cfg.max, minTickInterval = cfg.minTickInterval;\n var tickInterval = cfg.tickInterval;\n var tickCount = cfg.tickCount;\n // 指定 tickInterval 后 tickCount 不生效,需要重新计算\n if (tickInterval) {\n tickCount = Math.ceil((max - min) / tickInterval);\n }\n else {\n tickInterval = getTickInterval(min, max, tickCount)[1];\n var count = (max - min) / tickInterval;\n var ratio = count / tickCount;\n if (ratio > 1) {\n tickInterval = tickInterval * Math.ceil(ratio);\n }\n // 如果设置了最小间距,则使用最小间距\n if (minTickInterval && tickInterval < minTickInterval) {\n tickInterval = minTickInterval;\n }\n }\n var ticks = [];\n for (var i = min; i < max + tickInterval; i += tickInterval) {\n ticks.push(i);\n }\n return ticks;\n}\n//# sourceMappingURL=time.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/scale/esm/tick-method/time-cat.js\n\n\n/**\n * 计算时间分类的 ticks, 保头,保尾\n * @param cfg 度量的配置项\n * @returns 计算后的 ticks\n */\nfunction calculateTimeCatTicks(cfg) {\n var ticks = calculateCatTicks(cfg);\n var lastValue = Object(esm[\"last\"])(cfg.values);\n if (lastValue !== Object(esm[\"last\"])(ticks)) {\n ticks.push(lastValue);\n }\n return ticks;\n}\n//# sourceMappingURL=time-cat.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/scale/esm/tick-method/time-pretty.js\n\nfunction getYear(date) {\n return new Date(date).getFullYear();\n}\nfunction createYear(year) {\n return new Date(year, 0, 1).getTime();\n}\nfunction getMonth(date) {\n return new Date(date).getMonth();\n}\nfunction diffMonth(min, max) {\n var minYear = getYear(min);\n var maxYear = getYear(max);\n var minMonth = getMonth(min);\n var maxMonth = getMonth(max);\n return (maxYear - minYear) * 12 + ((maxMonth - minMonth) % 12);\n}\nfunction creatMonth(year, month) {\n return new Date(year, month, 1).getTime();\n}\nfunction diffDay(min, max) {\n return Math.ceil((max - min) / DAY);\n}\nfunction diffHour(min, max) {\n return Math.ceil((max - min) / HOUR);\n}\nfunction diffMinus(min, max) {\n return Math.ceil((max - min) / (60 * 1000));\n}\n/**\n * 计算 time 的 ticks,对 month, year 进行 pretty 处理\n * @param cfg 度量的配置项\n * @returns 计算后的 ticks\n */\nfunction timePretty(cfg) {\n var min = cfg.min, max = cfg.max, minTickInterval = cfg.minTickInterval, tickCount = cfg.tickCount;\n var tickInterval = cfg.tickInterval;\n var ticks = [];\n // 指定 tickInterval 后 tickCount 不生效,需要重新计算\n if (!tickInterval) {\n tickInterval = (max - min) / tickCount;\n // 如果设置了最小间距,则使用最小间距\n if (minTickInterval && tickInterval < minTickInterval) {\n tickInterval = minTickInterval;\n }\n }\n var minYear = getYear(min);\n // 如果间距大于 1 年,则将开始日期从整年开始\n if (tickInterval > YEAR) {\n var maxYear = getYear(max);\n var yearInterval = Math.ceil(tickInterval / YEAR);\n for (var i = minYear; i <= maxYear + yearInterval; i = i + yearInterval) {\n ticks.push(createYear(i));\n }\n }\n else if (tickInterval > MONTH) {\n // 大于月时\n var monthInterval = Math.ceil(tickInterval / MONTH);\n var mmMoth = getMonth(min);\n var dMonths = diffMonth(min, max);\n for (var i = 0; i <= dMonths + monthInterval; i = i + monthInterval) {\n ticks.push(creatMonth(minYear, i + mmMoth));\n }\n }\n else if (tickInterval > DAY) {\n // 大于天\n var date = new Date(min);\n var year = date.getFullYear();\n var month = date.getMonth();\n var mday = date.getDate();\n var day = Math.ceil(tickInterval / DAY);\n var ddays = diffDay(min, max);\n for (var i = 0; i < ddays + day; i = i + day) {\n ticks.push(new Date(year, month, mday + i).getTime());\n }\n }\n else if (tickInterval > HOUR) {\n // 大于小时\n var date = new Date(min);\n var year = date.getFullYear();\n var month = date.getMonth();\n var day = date.getDate();\n var hour = date.getHours();\n var hours = Math.ceil(tickInterval / HOUR);\n var dHours = diffHour(min, max);\n for (var i = 0; i <= dHours + hours; i = i + hours) {\n ticks.push(new Date(year, month, day, hour + i).getTime());\n }\n }\n else if (tickInterval > MINUTE) {\n // 大于分钟\n var dMinus = diffMinus(min, max);\n var minutes = Math.ceil(tickInterval / MINUTE);\n for (var i = 0; i <= dMinus + minutes; i = i + minutes) {\n ticks.push(min + i * MINUTE);\n }\n }\n else {\n // 小于分钟\n var interval = tickInterval;\n if (interval < SECOND) {\n interval = SECOND;\n }\n var minSecond = Math.floor(min / SECOND) * SECOND;\n var dSeconds = Math.ceil((max - min) / SECOND);\n var seconds = Math.ceil(interval / SECOND);\n for (var i = 0; i < dSeconds + seconds; i = i + seconds) {\n ticks.push(minSecond + i * SECOND);\n }\n }\n // 最好是能从算法能解决这个问题,但是如果指定了 tickInterval,计算 ticks,也只能这么算,所以\n // 打印警告提示\n if (ticks.length >= 512) {\n console.warn(\"Notice: current ticks length(\" + ticks.length + \") >= 512, may cause performance issues, even out of memory. Because of the configure \\\"tickInterval\\\"(in milliseconds, current is \" + tickInterval + \") is too small, increase the value to solve the problem!\");\n }\n return ticks;\n}\n//# sourceMappingURL=time-pretty.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/scale/esm/tick-method/index.js\n\n\n\n\n\n\n\n\n\n\n\nregisterTickMethod('cat', calculateCatTicks);\nregisterTickMethod('time-cat', calculateTimeCatTicks);\nregisterTickMethod('wilkinson-extended', linear_linear);\nregisterTickMethod('r-pretty', linearPretty);\nregisterTickMethod('time', calculateTimeTicks);\nregisterTickMethod('time-pretty', timePretty);\nregisterTickMethod('log', calculateLogTicks);\nregisterTickMethod('pow', calculatePowTicks);\nregisterTickMethod('quantile', calculateTicks);\nregisterTickMethod('d3-linear', d3LinearTickMethod);\n\n//# sourceMappingURL=index.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/scale/esm/index.js\n\n\n\n\n\n\n\n\n\n\n\n\nregisterClass('cat', category_base);\nregisterClass('category', category_base);\nregisterClass('identity', identity);\nregisterClass('linear', linear);\nregisterClass('log', continuous_log);\nregisterClass('pow', pow);\nregisterClass('time', continuous_time);\nregisterClass('timeCat', category_time);\nregisterClass('quantize', quantize);\nregisterClass('quantile', quantile);\n\n//# sourceMappingURL=index.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g6-plugin/es/timeBar/path.js\nvar __spreadArray = undefined && undefined.__spreadArray || function (to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n};\n\n\n\n\n/**\n * 点数组转 path\n * @param points\n */\n\nfunction pointsToPath(points) {\n return Object(esm[\"map\"])(points, function (p, idx) {\n var command = idx === 0 ? 'M' : 'L';\n var x = p[0],\n y = p[1];\n return [command, x, y];\n });\n}\n/**\n * 将点连接成路径 path\n * @param points\n */\n\n\nfunction getLinePath(points) {\n return pointsToPath(points);\n}\n/**\n * 将点连成平滑的曲线\n * @param points\n */\n\nfunction getSmoothLinePath(points) {\n if (points.length <= 2) {\n // 两点以内直接绘制成路径\n return getLinePath(points);\n }\n\n var data = [];\n Object(esm[\"each\"])(points, function (p) {\n // 当前点和上一个点一样的时候,忽略掉\n if (!Object(esm[\"isEqual\"])(p, data.slice(data.length - 2))) {\n data.push(p[0], p[1]);\n }\n });\n var path = path_util_esm[\"a\" /* catmullRom2Bezier */](data, false);\n\n var _a = Object(esm[\"head\"])(points),\n x = _a[0],\n y = _a[1];\n\n path.unshift(['M', x, y]);\n return path;\n}\n/**\n * 将数据转成 path,利用 scale 的归一化能力\n * @param data\n * @param width\n * @param height\n * @param smooth\n */\n\nfunction dataToPath(data, width, height, smooth) {\n if (smooth === void 0) {\n smooth = true;\n } // 利用 scale 来获取 y 上的映射\n\n\n var y = new linear({\n values: data\n });\n var x = new category_base({\n values: Object(esm[\"map\"])(data, function (v, idx) {\n return idx;\n })\n });\n var points = Object(esm[\"map\"])(data, function (v, idx) {\n return [x.scale(idx) * width, height - y.scale(v) * height];\n });\n return smooth ? getSmoothLinePath(points) : getLinePath(points);\n}\nfunction dataToRectPath(data, width, height, barWidth) {\n if (barWidth === void 0) {\n barWidth = 5;\n } // 利用 scale 来获取 y 上的映射\n\n\n var y = new linear({\n values: data\n });\n var x = new category_base({\n values: Object(esm[\"map\"])(data, function (v, idx) {\n return idx;\n })\n });\n var points = Object(esm[\"map\"])(data, function (v, idx) {\n return [x.scale(idx) * width, height - y.scale(v) * height];\n });\n var rectPoints = [];\n\n for (var i = 0; i < points.length; i++) {\n var point = points[i];\n var param = {\n x: point[0],\n y: point[1],\n y0: height,\n size: barWidth\n };\n var rectPoint = getRectPoints(param);\n rectPoints.push.apply(rectPoints, rectPoint);\n }\n\n return getRectPath(rectPoints);\n}\n/**\n * 获得 area 面积的横向连接线的 px 位置\n * @param data\n * @param width\n * @param height\n */\n\nfunction getAreaLineY(data, height) {\n var y = new linear({\n values: data\n });\n var lineY = Math.max(0, y.min);\n return height - y.scale(lineY) * height;\n}\n/**\n * 线 path 转 area path\n * @param path\n * @param width\n * @param height\n */\n\nfunction linePathToAreaPath(path, width, height, data) {\n var areaPath = __spreadArray([], path, true);\n\n var lineYPx = getAreaLineY(data, height);\n areaPath.push(['L', width, lineYPx]);\n areaPath.push(['L', 0, lineYPx]);\n areaPath.push(['Z']);\n return areaPath;\n}\n/**\n * @ignore\n * 根据数据点生成矩形的四个关键点\n * @param pointInfo 数据点信息\n * @returns rect points 返回矩形四个顶点信息\n */\n\nfunction getRectPoints(pointInfo) {\n var x = pointInfo.x,\n y = pointInfo.y,\n y0 = pointInfo.y0,\n size = pointInfo.size; // 有 4 种情况,\n // 1. x, y 都不是数组\n // 2. y是数组,x不是\n // 3. x是数组,y不是\n // 4. x, y 都是数组\n\n var yMin;\n var yMax;\n\n if (Object(esm[\"isArray\"])(y)) {\n yMin = y[0], yMax = y[1];\n } else {\n yMin = y0;\n yMax = y;\n }\n\n var xMin;\n var xMax;\n\n if (Object(esm[\"isArray\"])(x)) {\n xMin = x[0], xMax = x[1];\n } else {\n xMin = x - size / 2;\n xMax = x + size / 2;\n }\n\n var points = [{\n x: xMin,\n y: yMin\n }, {\n x: xMin,\n y: yMax\n }]; // 矩形的四个关键点,结构如下(左下角顺时针连接)\n // 1 ---- 2\n // | |\n // 0 ---- 3\n\n points.push({\n x: xMax,\n y: yMax\n }, {\n x: xMax,\n y: yMin\n });\n return points;\n}\n/**\n * @ignore\n * 根据矩形关键点绘制 path\n * @param points 关键点数组\n * @param isClosed path 是否需要闭合\n * @returns 返回矩形的 path\n */\n\nfunction getRectPath(points, isClosed) {\n if (isClosed === void 0) {\n isClosed = true;\n }\n\n var path = [];\n var firstPoint = points[0];\n path.push(['M', firstPoint.x, firstPoint.y]);\n\n for (var i = 1, len = points.length; i < len; i++) {\n path.push(['L', points[i].x, points[i].y]);\n } // 对于 shape=\"line\" path 不应该闭合,否则会造成 lineCap 绘图属性失效\n\n\n if (isClosed) {\n path.push(['L', firstPoint.x, firstPoint.y]); // 需要闭合\n\n path.push(['z']);\n }\n\n return path;\n}\n// CONCATENATED MODULE: ./node_modules/@antv/g6-plugin/es/timeBar/trend.js\nvar trend_assign = undefined && undefined.__assign || function () {\n trend_assign = Object.assign || function (t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n\n for (var p in s) {\n if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n }\n\n return t;\n };\n\n return trend_assign.apply(this, arguments);\n};\n\n\nvar LINE_STYLE = {\n stroke: '#C5C5C5',\n strokeOpacity: 0.85\n};\nvar AREA_STYLE = {\n fill: '#CACED4',\n opacity: 0.85\n};\n/**\n * 缩略趋势图\n */\n\nvar trend_Trend =\n/** @class */\nfunction () {\n function Trend(cfg) {\n var _a = cfg.x,\n x = _a === void 0 ? 0 : _a,\n _b = cfg.y,\n y = _b === void 0 ? 0 : _b,\n _c = cfg.width,\n width = _c === void 0 ? 200 : _c,\n _d = cfg.height,\n height = _d === void 0 ? 26 : _d,\n _e = cfg.smooth,\n smooth = _e === void 0 ? true : _e,\n _f = cfg.isArea,\n isArea = _f === void 0 ? false : _f,\n _g = cfg.data,\n data = _g === void 0 ? [] : _g,\n lineStyle = cfg.lineStyle,\n areaStyle = cfg.areaStyle,\n group = cfg.group,\n _h = cfg.interval,\n interval = _h === void 0 ? null : _h;\n this.group = group;\n this.x = x;\n this.y = y;\n this.width = width;\n this.height = height;\n this.data = data;\n this.smooth = smooth;\n this.isArea = isArea;\n this.lineStyle = Object.assign({}, LINE_STYLE, lineStyle);\n this.areaStyle = Object.assign({}, AREA_STYLE, areaStyle);\n this.intervalConfig = interval;\n this.renderLine();\n }\n /**\n * 构造\n * @private\n */\n\n\n Trend.prototype.renderLine = function () {\n var _a = this,\n x = _a.x,\n y = _a.y,\n width = _a.width,\n height = _a.height,\n barWidth = _a.barWidth,\n data = _a.data,\n smooth = _a.smooth,\n isArea = _a.isArea,\n lineStyle = _a.lineStyle,\n areaStyle = _a.areaStyle;\n\n var trendGroup = this.group.addGroup({\n name: 'trend-group'\n });\n\n if (data) {\n var path = dataToPath(data, width, height, smooth); // 线\n\n trendGroup.addShape('path', {\n attrs: trend_assign({\n path: path\n }, lineStyle)\n }); // 在 line 的基础上,绘制面积图\n\n if (isArea) {\n var areaPath = linePathToAreaPath(path, width, height, data);\n trendGroup.addShape('path', {\n attrs: trend_assign({\n path: areaPath\n }, areaStyle)\n });\n }\n } // 绘制柱状图📊\n\n\n if (this.intervalConfig) {\n trendGroup.addShape('path', {\n attrs: trend_assign({\n path: dataToRectPath(this.intervalConfig.data, width, height, this.intervalConfig.style.barWidth)\n }, this.intervalConfig.style)\n });\n } // 统一移动到对应的位置\n\n\n trendGroup.move(x, y);\n };\n\n Trend.prototype.destory = function () {\n this.group.destroy();\n };\n\n return Trend;\n}();\n\n/* harmony default export */ var timeBar_trend = (trend_Trend);\n// CONCATENATED MODULE: ./node_modules/@antv/g6-plugin/es/timeBar/handler.js\nvar handler_assign = undefined && undefined.__assign || function () {\n handler_assign = Object.assign || function (t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n\n for (var p in s) {\n if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n }\n\n return t;\n };\n\n return handler_assign.apply(this, arguments);\n};\n\n\nvar DEFAULT_STYLE = {\n fill: '#1890ff',\n stroke: '#1890ff',\n type: 'trend',\n radius: 2,\n opacity: 1,\n cursor: 'ew-resize',\n // 高亮的颜色\n highLightFill: '#0050b3'\n};\nvar SIMPLE_DEFAULT_STYLE = {\n fill: '#fff',\n stroke: '#1890ff',\n radius: 2,\n opacity: 1,\n cursor: 'ew-resize'\n};\n\nvar handler_Handler =\n/** @class */\nfunction () {\n function Handler(cfg) {\n var group = cfg.group,\n name = cfg.name,\n type = cfg.type,\n _a = cfg.x,\n x = _a === void 0 ? 0 : _a,\n _b = cfg.y,\n y = _b === void 0 ? 0 : _b,\n _c = cfg.width,\n width = _c === void 0 ? 2 : _c,\n _d = cfg.height,\n height = _d === void 0 ? 24 : _d,\n _e = cfg.style,\n style = _e === void 0 ? {} : _e;\n this.group = group;\n this.name = name;\n this.handleType = type;\n this.x = x;\n this.y = y;\n this.width = width;\n this.height = height;\n\n if (type === 'trend') {\n this.style = handler_assign(handler_assign({}, DEFAULT_STYLE), style);\n } else if (type === 'simple') {\n this.style = handler_assign(handler_assign({}, SIMPLE_DEFAULT_STYLE), style);\n }\n\n this.renderHandle();\n }\n /**\n * 设置位置 x\n * @param x\n */\n\n\n Handler.prototype.setX = function (x) {\n this.setXY(x, undefined);\n };\n /**\n * 设置位置 y\n * @param y\n */\n\n\n Handler.prototype.setY = function (y) {\n this.setXY(undefined, y);\n };\n\n Handler.prototype.setXY = function (x, y) {\n if (Object(esm[\"isNumber\"])(x)) {\n this.x = x;\n }\n\n if (Object(esm[\"isNumber\"])(y)) {\n this.y = y;\n }\n\n this.updateXY();\n };\n /**\n * 初始化组件\n * @private\n */\n\n\n Handler.prototype.renderHandle = function () {\n var _a = this,\n width = _a.width,\n height = _a.height,\n style = _a.style,\n name = _a.name;\n\n var fill = style.fill,\n stroke = style.stroke,\n radius = style.radius,\n opacity = style.opacity,\n cursor = style.cursor;\n this.handleGroup = this.group.addGroup(); // 趋势图时的 handle\n\n if (this.handleType === 'trend') {\n // 垂直线\n this.verticalLine = this.handleGroup.addShape('rect', {\n attrs: {\n x: 0,\n y: 0,\n width: width,\n height: height,\n fill: fill,\n stroke: stroke,\n radius: radius,\n opacity: opacity,\n cursor: cursor\n },\n name: name + \"-handler\"\n });\n this.topCircle = this.handleGroup.addShape('circle', {\n attrs: {\n x: width / 2,\n y: 0,\n r: 2 * width,\n fill: fill,\n stroke: stroke,\n radius: radius,\n opacity: opacity,\n cursor: cursor\n },\n name: name + \"-handler\"\n });\n this.bottomCircle = this.handleGroup.addShape('circle', {\n attrs: {\n x: width / 2,\n y: height,\n r: 2 * width,\n fill: fill,\n stroke: stroke,\n radius: radius,\n opacity: opacity,\n cursor: cursor\n },\n name: name + \"-handler\"\n });\n } else if (this.handleType === 'simple') {\n this.topCircle = this.handleGroup.addShape('circle', {\n attrs: {\n x: width / 2,\n y: height / 2,\n r: 2 * width,\n fill: fill,\n stroke: stroke,\n radius: radius,\n opacity: opacity,\n cursor: cursor,\n lineWidth: 2\n },\n name: name + \"-handler\"\n });\n } // 移动到对应的位置\n\n\n this.updateXY();\n\n if (this.handleType === 'trend') {\n this.bindTrendEvents();\n } else if (this.handleType === 'simple') {\n this.bindSimpleEvents();\n }\n };\n\n Handler.prototype.bindSimpleEvents = function () {\n var _this = this;\n\n var name = this.name;\n this.handleGroup.on(name + \"-handler:mouseenter\", function () {\n var highLightFill = _this.style.highLightFill;\n\n _this.topCircle.attr('fill', highLightFill);\n });\n this.handleGroup.on(name + \"-handler:mouseleave\", function () {\n var fill = _this.style.fill;\n\n _this.topCircle.attr('fill', fill);\n });\n };\n\n Handler.prototype.bindTrendEvents = function () {\n var _this = this;\n\n var name = this.name;\n this.handleGroup.on(name + \"-handler:mouseenter\", function () {\n var highLightFill = _this.style.highLightFill;\n\n _this.verticalLine.attr('fill', highLightFill);\n\n _this.topCircle.attr('fill', highLightFill);\n\n _this.bottomCircle.attr('fill', highLightFill);\n });\n this.handleGroup.on(name + \"-handler:mouseleave\", function () {\n var fill = _this.style.fill;\n\n _this.verticalLine.attr('fill', fill);\n\n _this.topCircle.attr('fill', fill);\n\n _this.bottomCircle.attr('fill', fill);\n });\n };\n\n Handler.prototype.show = function () {\n this.handleGroup.show();\n };\n\n Handler.prototype.hide = function () {\n this.handleGroup.hide();\n };\n\n Handler.prototype.updateXY = function () {\n this.handleGroup.setMatrix([1, 0, 0, 0, 1, 0, this.x, this.y, 1]);\n };\n\n return Handler;\n}();\n\n/* harmony default export */ var timeBar_handler = (handler_Handler);\n// CONCATENATED MODULE: ./node_modules/@antv/g6-plugin/es/timeBar/constant.js\nvar TIMELINE_START = 'timebarstartplay';\nvar TIMELINE_END = 'timebarendplay';\nvar VALUE_CHANGE = 'valuechange';\nvar TIMEBAR_CONFIG_CHANGE = 'timebarConfigChanged';\nvar PLAY_PAUSE_BTN = 'playPauseBtn';\nvar NEXT_STEP_BTN = 'nextStepBtn';\nvar PRE_STEP_BTN = 'preStepBtn';\n// CONCATENATED MODULE: ./node_modules/@antv/g6-plugin/es/timeBar/timeButton.js\n/**\n * 基于 G 的按钮组件\n */\nvar timeButton_assign = undefined && undefined.__assign || function () {\n timeButton_assign = Object.assign || function (t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n\n for (var p in s) {\n if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n }\n\n return t;\n };\n\n return timeButton_assign.apply(this, arguments);\n};\n\n\n\n\nvar timeButton_Button =\n/** @class */\nfunction () {\n function Button(cfg) {\n this.config = Object(esm[\"deepMix\"])({}, cfg);\n this.init();\n }\n\n Button.prototype.update = function (cfg) {\n this.config = Object(esm[\"deepMix\"])({}, this.config, cfg);\n this.updateElement();\n this.renderMarker();\n };\n\n Button.prototype.init = function () {\n this.initElement();\n this.renderMarker();\n };\n\n Button.prototype.initElement = function () {\n var _a = this.config,\n group = _a.group,\n style = _a.style;\n var _b = style.scale,\n scale = _b === void 0 ? 1 : _b,\n _c = style.offsetX,\n offsetX = _c === void 0 ? 0 : _c,\n _d = style.offsetY,\n offsetY = _d === void 0 ? 0 : _d;\n var x = this.config.x + offsetX;\n var y = this.config.y + offsetY;\n var buttonGroup = group.addGroup({\n name: PLAY_PAUSE_BTN\n });\n this.startMarkerGroup = buttonGroup.addGroup({\n name: PLAY_PAUSE_BTN\n });\n this.circle = group.addShape('circle', {\n attrs: timeButton_assign({\n x: x,\n y: y,\n r: this.config.r * scale\n }, style),\n name: PLAY_PAUSE_BTN\n });\n this.startMarker = this.startMarkerGroup.addShape('path', {\n attrs: {\n path: this.getStartMarkerPath(x, y, scale),\n fill: style.stroke || '#aaa'\n }\n });\n this.pauseMarkerGroup = buttonGroup.addGroup({\n name: PLAY_PAUSE_BTN\n });\n var width = 0.25 * this.config.r * scale;\n var height = 0.5 * this.config.r * Math.sqrt(3) * scale;\n this.pauseLeftMarker = this.pauseMarkerGroup.addShape('rect', {\n attrs: {\n x: x - 0.375 * this.config.r * scale,\n y: y - height / 2,\n width: width,\n height: height,\n fill: style.stroke || '#aaa',\n lineWidth: 0\n }\n });\n this.pauseRightMarker = this.pauseMarkerGroup.addShape('rect', {\n attrs: {\n x: x + 1 / 8 * this.config.r * scale,\n y: y - height / 2,\n width: width,\n height: height,\n fill: style.stroke || '#aaa',\n lineWidth: 0\n }\n });\n };\n\n Button.prototype.updateElement = function () {\n var _a = this.config.style,\n _b = _a.scale,\n scale = _b === void 0 ? 1 : _b,\n _c = _a.offsetX,\n offsetX = _c === void 0 ? 0 : _c,\n _d = _a.offsetY,\n offsetY = _d === void 0 ? 0 : _d;\n var x = this.config.x + offsetX;\n var y = this.config.y + offsetY;\n this.circle.attr('x', x);\n this.circle.attr('y', y);\n this.circle.attr('r', this.config.r * scale);\n this.startMarker.attr('path', this.getStartMarkerPath(x, y, scale));\n var width = 0.25 * this.config.r * scale;\n var height = 0.5 * this.config.r * Math.sqrt(3) * scale;\n this.pauseLeftMarker.attr('x', x - (1 / 4 + 1 / 8) * this.config.r * scale);\n this.pauseLeftMarker.attr('y', y - height / 2);\n this.pauseLeftMarker.attr('width', width);\n this.pauseLeftMarker.attr('height', height);\n this.pauseRightMarker.attr('x', x + 1 / 8 * this.config.r * scale);\n this.pauseRightMarker.attr('y', y - height / 2);\n this.pauseRightMarker.attr('width', width);\n this.pauseRightMarker.attr('height', height);\n };\n\n Button.prototype.renderMarker = function () {\n if (this.config.isPlay) {\n this.startMarkerGroup.hide();\n this.pauseMarkerGroup.show();\n } else {\n this.startMarkerGroup.show();\n this.pauseMarkerGroup.hide();\n }\n };\n /** 获取播放键 marker path */\n\n\n Button.prototype.getStartMarkerPath = function (x, y, scale) {\n var sideLength = 0.5 * this.config.r * Math.sqrt(3) * scale;\n return [['M', x - sideLength / Math.sqrt(3) / 2, y - sideLength / 2], ['L', x + sideLength / Math.sqrt(3), y], ['L', x - sideLength / Math.sqrt(3) / 2, y + sideLength / 2]];\n };\n\n return Button;\n}();\n\n/* harmony default export */ var timeButton = (timeButton_Button);\n// CONCATENATED MODULE: ./node_modules/@antv/g6-plugin/es/timeBar/controllerBtn.js\nvar controllerBtn_assign = undefined && undefined.__assign || function () {\n controllerBtn_assign = Object.assign || function (t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n\n for (var p in s) {\n if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n }\n\n return t;\n };\n\n return controllerBtn_assign.apply(this, arguments);\n};\n\n\n\n\n\nvar controllerBtn_transform = matrix_util_esm[\"ext\"].transform;\nvar DEFAULT_RECT_FILL = '#aaa';\nvar DEFAULT_RECT_STROKE = 'green';\nvar DEFAULT_PLAYBTN_STYLE = {\n fill: '#aaa',\n fillOpacity: 0.35,\n stroke: '#aaa'\n};\nvar DEFAULT_PREBTN_STYLE = {\n fill: '#fff'\n};\nvar DEFAULT_NEXTBTN_STYLE = {\n fill: 'green'\n};\nvar DEFAULT_SPEED_CONTROLLER_STYLE = {\n pointer: {\n fill: '#aaa',\n lineWidth: 0\n },\n scroller: {\n stroke: '#aaa',\n fill: '#aaa',\n lineWidth: 1,\n lineAppendWidth: 5,\n cursor: 'pointer'\n },\n text: {\n fill: '#aaa',\n textBaseline: 'top'\n }\n};\nvar DEFAULT_TIMETYPE_CONTROLLER_STYLE = {\n check: {\n stroke: 'green',\n lineWidth: 3\n },\n box: {\n fill: '#fff',\n stroke: '#aaa',\n lineWidth: 2,\n radius: 3,\n width: 12,\n height: 12\n },\n text: {\n fill: '#aaa',\n fontSize: 12,\n textBaseline: 'top'\n }\n};\nvar DEFAULT_CONTROLLER_CONFIG = {\n speed: 1,\n loop: false,\n fill: '#fff',\n stroke: '#fff',\n hideTimeTypeController: false,\n preBtnStyle: {\n fill: '#aaa',\n stroke: '#aaa'\n },\n nextBtnStyle: {\n fill: '#aaa',\n stroke: '#aaa'\n },\n playBtnStyle: {\n fill: '#aaa',\n stroke: '#aaa',\n fillOpacity: 0.05\n },\n speedControllerStyle: DEFAULT_SPEED_CONTROLLER_STYLE,\n timeTypeControllerStyle: DEFAULT_TIMETYPE_CONTROLLER_STYLE\n};\nvar SPEED_CONTROLLER_OFFSET = 110;\nvar TOGGLE_MODEL_OFFSET = 50;\n\nvar controllerBtn_ControllerBtn =\n/** @class */\nfunction () {\n function ControllerBtn(cfg) {\n this.controllerCfg = Object(esm[\"deepMix\"])({}, DEFAULT_CONTROLLER_CONFIG, cfg);\n this.group = cfg.group;\n this.controllerGroup = this.group.addGroup({\n name: 'controller-group'\n });\n this.speedAxisY = [];\n this.currentSpeed = this.controllerCfg.speed;\n this.currentType = 'range';\n this.fontFamily = cfg.fontFamily || 'Arial, sans-serif';\n this.init();\n }\n\n ControllerBtn.prototype.init = function () {\n this.renderPlayButton();\n };\n /** 获取播放键 marker path */\n\n\n ControllerBtn.prototype.getNextMarkerPath = function (x, y, len) {\n return [['M', x, y - len], ['L', x + len, y], ['L', x, y + len], ['Z', x, y - len], ['M', x, y], ['L', x - len, y - len], ['L', x - len, y + len], ['Z']];\n };\n\n ControllerBtn.prototype.getPreMarkerPath = function (x, y, len) {\n return [['M', x, y - len], ['L', x - len, y], ['L', x, y + len], ['L', x, y - len], ['M', x, y], ['L', x + len, y - len], ['L', x + len, y + len], ['Z']];\n };\n\n ControllerBtn.prototype.renderPlayButton = function () {\n var controllerCfg = this.controllerCfg;\n var width = controllerCfg.width,\n height = controllerCfg.height,\n x = controllerCfg.x,\n y = controllerCfg.y,\n hideTimeTypeController = controllerCfg.hideTimeTypeController,\n _a = controllerCfg.fill,\n fill = _a === void 0 ? DEFAULT_RECT_FILL : _a,\n _b = controllerCfg.stroke,\n stroke = _b === void 0 ? DEFAULT_RECT_STROKE : _b;\n\n var playBtnStyle = controllerBtn_assign(controllerBtn_assign({}, DEFAULT_PLAYBTN_STYLE), controllerCfg.playBtnStyle || {});\n\n var preBtnStyle = controllerBtn_assign(controllerBtn_assign({}, DEFAULT_PREBTN_STYLE), controllerCfg.preBtnStyle || {});\n\n var nextBtnStyle = controllerBtn_assign(controllerBtn_assign({}, DEFAULT_NEXTBTN_STYLE), controllerCfg.nextBtnStyle || {});\n\n var r = height / 2 - 5;\n var realY = y + 10; // 绘制最外层的矩形包围框\n\n var container = this.controllerGroup.addShape('rect', {\n attrs: {\n x: x,\n y: realY,\n width: width,\n height: height,\n stroke: stroke,\n fill: fill\n },\n name: 'container-rect'\n });\n\n if (this.playButton) {\n this.playButton.update({\n x: width / 2,\n y: realY,\n r: r\n });\n } else {\n this.playButton = new timeButton({\n group: this.controllerGroup,\n x: width / 2,\n y: realY + r + 5,\n r: r,\n isPlay: this.isPlay,\n style: playBtnStyle\n });\n } // 后退按钮\n\n\n var prePaddingX = preBtnStyle.offsetX || 0;\n var prePaddingY = preBtnStyle.offsetY || 0;\n var preR = (preBtnStyle.scale || 1) * r;\n this.controllerGroup.addShape('path', {\n attrs: controllerBtn_assign({\n path: this.getPreMarkerPath(width / 2 - 5 * r + prePaddingX, realY + r + 5 + prePaddingY, preR * 0.5)\n }, preBtnStyle),\n name: PRE_STEP_BTN\n }); // 前进按钮\n\n var nxtPaddingX = nextBtnStyle.offsetX || 0;\n var nxtPaddingY = nextBtnStyle.offsetY || 0;\n var nxtR = (nextBtnStyle.scale || 1) * r;\n this.controllerGroup.addShape('path', {\n attrs: controllerBtn_assign({\n path: this.getNextMarkerPath(width / 2 + 5 * r + nxtPaddingX, realY + r + 5 + nxtPaddingY, nxtR * 0.5)\n }, nextBtnStyle),\n name: NEXT_STEP_BTN\n });\n container.toBack(); // 调节speed的按钮\n\n this.renderSpeedBtn();\n\n if (!hideTimeTypeController) {\n this.renderToggleTime();\n }\n\n this.bindEvent(); // 根据配置的 scale、offsetX,offsetY 缩放和移动控制栏\n\n var _c = this.controllerCfg.scale,\n scale = _c === void 0 ? 1 : _c;\n var currentBBox = this.controllerGroup.getCanvasBBox();\n var centerX = (currentBBox.maxX + currentBBox.minX) / 2;\n var centerY = (currentBBox.maxY + currentBBox.minY) / 2;\n var matrix = controllerBtn_transform([1, 0, 0, 0, 1, 0, 0, 0, 1], [['t', -centerX, -centerY], ['s', scale, scale], ['t', centerX, centerY]]);\n this.controllerGroup.setMatrix(matrix);\n };\n\n ControllerBtn.prototype.renderSpeedBtn = function () {\n var _a = this.controllerCfg,\n y = _a.y,\n width = _a.width,\n hideTimeTypeController = _a.hideTimeTypeController;\n\n var speedControllerStyle = controllerBtn_assign(controllerBtn_assign({}, DEFAULT_SPEED_CONTROLLER_STYLE), this.controllerCfg.speedControllerStyle || {});\n\n var _b = speedControllerStyle.scroller,\n scroller = _b === void 0 ? {} : _b,\n _c = speedControllerStyle.text,\n text = _c === void 0 ? {} : _c,\n _d = speedControllerStyle.pointer,\n pointer = _d === void 0 ? {} : _d,\n _e = speedControllerStyle.scale,\n scale = _e === void 0 ? 1 : _e,\n _f = speedControllerStyle.offsetX,\n offsetX = _f === void 0 ? 0 : _f,\n _g = speedControllerStyle.offsetY,\n offsetY = _g === void 0 ? 0 : _g;\n var speedGroup = this.controllerGroup.addGroup({\n name: 'speed-group'\n });\n this.speedGroup = speedGroup;\n var speedNum = [];\n var maxSpeed = 5;\n this.speedAxisY = [19, 22, 26, 32, 39]; // 增加speed刻度\n\n for (var i = 0; i < 5; i++) {\n var axisY = y + this.speedAxisY[i]; // 灰色刻度\n\n var startX = width - (!hideTimeTypeController ? SPEED_CONTROLLER_OFFSET : TOGGLE_MODEL_OFFSET);\n speedGroup.addShape('line', {\n attrs: controllerBtn_assign({\n x1: startX,\n x2: startX + 15,\n y1: axisY,\n y2: axisY\n }, scroller),\n speed: maxSpeed,\n name: 'speed-rect'\n });\n this.speedAxisY[i] = axisY;\n speedNum.push(maxSpeed);\n maxSpeed = maxSpeed - 1;\n } // 速度文本\n\n\n this.speedText = speedGroup.addShape('text', {\n attrs: controllerBtn_assign({\n x: width - (!hideTimeTypeController ? SPEED_CONTROLLER_OFFSET : TOGGLE_MODEL_OFFSET) + 20,\n y: this.speedAxisY[0] + 4,\n text: \"1.0X\",\n fontFamily: this.fontFamily || 'Arial, sans-serif'\n }, text)\n });\n this.speedPoint = speedGroup.addShape('path', {\n attrs: controllerBtn_assign({\n path: this.getPointerPath(width - (!hideTimeTypeController ? SPEED_CONTROLLER_OFFSET : TOGGLE_MODEL_OFFSET), 0),\n matrix: [1, 0, 0, 0, 1, 0, 0, this.speedAxisY[4], 1]\n }, pointer)\n }); // 根据配置在 speedControllerStyle 中的 scale offsetX offsetY 缩放和移动速度控制器\n\n var currentBBox = this.speedGroup.getCanvasBBox();\n var centerX = (currentBBox.maxX + currentBBox.minX) / 2;\n var centerY = (currentBBox.maxY + currentBBox.minY) / 2;\n var matrix = this.speedGroup.getMatrix() || [1, 0, 0, 0, 1, 0, 0, 0, 1];\n matrix = controllerBtn_transform(matrix, [['t', -centerX, -centerY], ['s', scale, scale], ['t', centerX + offsetX * scale, centerY + offsetY * scale]]);\n this.speedGroup.setMatrix(matrix);\n };\n\n ControllerBtn.prototype.getPointerPath = function (x, y) {\n return [['M', x, y], ['L', x - 10, y - 4], ['L', x - 10, y + 4], ['Z']];\n };\n\n ControllerBtn.prototype.renderToggleTime = function () {\n var _a;\n\n var width = this.controllerCfg.width;\n\n var timeTypeControllerStyle = controllerBtn_assign(controllerBtn_assign({}, DEFAULT_TIMETYPE_CONTROLLER_STYLE), this.controllerCfg.timeTypeControllerStyle || {});\n\n var _b = timeTypeControllerStyle.scale,\n scale = _b === void 0 ? 1 : _b,\n _c = timeTypeControllerStyle.offsetX,\n offsetX = _c === void 0 ? 0 : _c,\n _d = timeTypeControllerStyle.offsetY,\n offsetY = _d === void 0 ? 0 : _d,\n _e = timeTypeControllerStyle.box,\n box = _e === void 0 ? {} : _e,\n _f = timeTypeControllerStyle.check,\n check = _f === void 0 ? {} : _f,\n _g = timeTypeControllerStyle.text,\n text = _g === void 0 ? {} : _g;\n this.toggleGroup = this.controllerGroup.addGroup({\n name: 'toggle-group'\n });\n this.toggleGroup.addShape('rect', {\n attrs: controllerBtn_assign({\n x: width - TOGGLE_MODEL_OFFSET,\n y: this.speedAxisY[0] + 3.5\n }, box),\n isChecked: false,\n name: 'toggle-model'\n });\n this.checkedIcon = this.toggleGroup.addShape('path', {\n attrs: controllerBtn_assign({\n path: [['M', width - TOGGLE_MODEL_OFFSET + 3, this.speedAxisY[1] + 6], ['L', width - TOGGLE_MODEL_OFFSET + 7, this.speedAxisY[1] + 10], ['L', width - TOGGLE_MODEL_OFFSET + 12, this.speedAxisY[1] + 4]]\n }, check),\n capture: false\n });\n this.checkedIcon.hide();\n this.checkedText = this.toggleGroup.addShape('text', {\n attrs: controllerBtn_assign({\n text: ((_a = this.controllerCfg) === null || _a === void 0 ? void 0 : _a.timePointControllerText) || '单一时间',\n x: width - TOGGLE_MODEL_OFFSET + 15,\n y: this.speedAxisY[0] + 4,\n fontFamily: typeof window !== 'undefined' ? window.getComputedStyle(document.body, null).getPropertyValue('font-family') || 'Arial, sans-serif' : 'Arial, sans-serif'\n }, text)\n }); // 根据配置在 timeTypeControllerStyle 中的 scale offsetX offsetY 缩放和移动速度控制器\n\n var currentBBox = this.toggleGroup.getCanvasBBox();\n var centerX = (currentBBox.maxX + currentBBox.minX) / 2;\n var centerY = (currentBBox.maxY + currentBBox.minY) / 2;\n var matrix = this.toggleGroup.getMatrix() || [1, 0, 0, 0, 1, 0, 0, 0, 1];\n matrix = controllerBtn_transform(matrix, [['t', -centerX, -centerY], ['s', scale, scale], ['t', centerX + offsetX * scale, centerY + offsetY * scale]]);\n this.toggleGroup.setMatrix(matrix);\n };\n\n ControllerBtn.prototype.bindEvent = function () {\n var _this = this;\n\n this.speedGroup.on('speed-rect:click', function (evt) {\n var currentPointerY = evt.target.attr('y1');\n\n var pointerMatrix = _this.speedPoint.attr('matrix');\n\n var currentYIdx = _this.speedAxisY.indexOf(pointerMatrix[7] || 0);\n\n var targetYIdx = _this.speedAxisY.indexOf(currentPointerY);\n\n var yDiff = _this.speedAxisY[targetYIdx] - _this.speedAxisY[currentYIdx];\n pointerMatrix = controllerBtn_transform(pointerMatrix, [['t', 0, yDiff]]);\n\n _this.speedPoint.setMatrix(pointerMatrix);\n\n _this.currentSpeed = _this.speedAxisY.length - targetYIdx;\n\n _this.speedText.attr('text', _this.currentSpeed + \".0X\");\n\n _this.group.emit(TIMEBAR_CONFIG_CHANGE, {\n speed: _this.currentSpeed,\n type: _this.currentType\n });\n });\n this.speedGroup.on('mousewheel', function (evt) {\n evt.preventDefault();\n var pointerMatrix = _this.speedPoint.attr('matrix') || [1, 0, 0, 0, 1, 0, 0, 0, 1];\n var currentPointerY = pointerMatrix[7];\n\n var currentYIdx = _this.speedAxisY.indexOf(currentPointerY);\n\n if (currentYIdx === -1) {\n // 找到最近的一个 y\n var minDist_1 = Infinity;\n\n _this.speedAxisY.forEach(function (y, idx) {\n var dist = Math.abs(y - currentPointerY);\n\n if (minDist_1 > dist) {\n minDist_1 = dist;\n currentYIdx = idx;\n }\n });\n }\n\n if (evt.originalEvent.deltaY > 0) currentYIdx = Math.max(0, currentYIdx - 1);else currentYIdx = Math.min(_this.speedAxisY.length - 1, currentYIdx + 1);\n var yDiff = _this.speedAxisY[currentYIdx] - currentPointerY;\n pointerMatrix = controllerBtn_transform(pointerMatrix, [['t', 0, yDiff]]);\n\n _this.speedPoint.setMatrix(pointerMatrix);\n\n _this.currentSpeed = _this.speedAxisY.length - currentYIdx;\n\n _this.speedText.attr('text', _this.currentSpeed + \".0X\");\n\n _this.group.emit(TIMEBAR_CONFIG_CHANGE, {\n speed: _this.currentSpeed,\n type: _this.currentType\n });\n });\n\n if (this.toggleGroup) {\n this.toggleGroup.on('toggle-model:click', function (evt) {\n var _a, _b;\n\n var isChecked = evt.target.get('isChecked');\n\n if (!isChecked) {\n _this.checkedIcon.show();\n\n _this.checkedText.attr('text', ((_a = _this.controllerCfg) === null || _a === void 0 ? void 0 : _a.timeRangeControllerText) || '时间范围');\n\n _this.currentType = 'single';\n } else {\n _this.checkedIcon.hide();\n\n _this.checkedText.attr('text', ((_b = _this.controllerCfg) === null || _b === void 0 ? void 0 : _b.timePointControllerText) || '单一时间');\n\n _this.currentType = 'range';\n }\n\n evt.target.set('isChecked', !isChecked);\n\n _this.group.emit(TIMEBAR_CONFIG_CHANGE, {\n type: _this.currentType,\n speed: _this.currentSpeed\n });\n });\n }\n };\n\n ControllerBtn.prototype.destroy = function () {\n this.speedGroup.off('speed-rect:click');\n\n if (this.toggleGroup) {\n this.toggleGroup.off('toggle-model:click');\n this.toggleGroup.destroy();\n }\n\n this.speedGroup.destroy();\n };\n\n return ControllerBtn;\n}();\n\n/* harmony default export */ var controllerBtn = (controllerBtn_ControllerBtn);\n// CONCATENATED MODULE: ./node_modules/@antv/g6-plugin/es/timeBar/trendTimeBar.js\nvar trendTimeBar_assign = undefined && undefined.__assign || function () {\n trendTimeBar_assign = Object.assign || function (t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n\n for (var p in s) {\n if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n }\n\n return t;\n };\n\n return trendTimeBar_assign.apply(this, arguments);\n};\n\n\n\n\n\n\n\n/**\n * 一些默认的样式配置\n */\n\nvar BACKGROUND_STYLE = {\n fill: '#416180',\n opacity: 0.05\n};\nvar SIMPLE_BACKGROUND_STYLE = {\n fill: '#416180',\n opacity: 0.15,\n radius: 5\n};\nvar FOREGROUND_STYLE = {\n fill: '#5B8FF9',\n opacity: 0.3,\n cursor: 'grab'\n};\nvar DEFAULT_HANDLER_WIDTH = 2;\nvar HANDLER_STYLE = {\n width: DEFAULT_HANDLER_WIDTH,\n height: 24\n};\nvar TEXT_STYLE = {\n textBaseline: 'middle',\n fill: '#000',\n opacity: 0.45\n};\nvar TICK_LABEL_STYLE = {\n textAlign: 'center',\n textBaseline: 'top',\n fill: '#607889',\n opacity: 0.35\n};\nvar TICK_LINE_STYLE = {\n lineWidth: 1,\n stroke: '#ccc'\n};\n\nvar trendTimeBar_TrendTimeBar =\n/** @class */\nfunction () {\n function TrendTimeBar(cfg) {\n var _this = this;\n\n this.prevX = 0;\n\n this.onMouseDown = function (handler) {\n return function (e) {\n // 1. 记录点击的滑块\n _this.currentHandler = handler;\n var event = e.originalEvent; // 2. 存储当前点击位置\n\n event.stopPropagation();\n event.preventDefault(); // 兼容移动端获取数据\n\n _this.prevX = Object(esm[\"get\"])(event, 'touches.0.pageX', event.pageX); // 3. 开始滑动的时候,绑定 move 和 up 事件\n\n var containerDOM = _this.canvas.get('container');\n\n containerDOM.addEventListener('mousemove', _this.onMouseMove);\n containerDOM.addEventListener('mouseup', _this.onMouseUp);\n containerDOM.addEventListener('mouseleave', _this.onMouseUp); // 移动端事件\n\n containerDOM.addEventListener('touchmove', _this.onMouseMove);\n containerDOM.addEventListener('touchend', _this.onMouseUp);\n containerDOM.addEventListener('touchcancel', _this.onMouseUp);\n };\n };\n\n this.onMouseMove = function (e) {\n // 滑动过程中,计算偏移,更新滑块,然后 emit 数据出去\n e.stopPropagation();\n e.preventDefault();\n var x = Object(esm[\"get\"])(e, 'touches.0.pageX', e.pageX); // 横向的 slider 只处理 x\n\n var offsetX = x - _this.prevX;\n\n var offsetXRange = _this.adjustOffsetRange(offsetX / _this.width); // 更新 start end range 范围\n\n\n _this.updateStartEnd(offsetXRange); // 更新 ui\n\n\n _this.updateUI();\n\n _this.prevX = x;\n };\n\n this.onMouseUp = function () {\n // 结束之后,取消绑定的事件\n if (_this.currentHandler) {\n _this.currentHandler = undefined;\n }\n\n var containerDOM = _this.canvas.get('container');\n\n if (containerDOM) {\n containerDOM.removeEventListener('mousemove', _this.onMouseMove);\n containerDOM.removeEventListener('mouseup', _this.onMouseUp); // 防止滑动到 canvas 外部之后,状态丢失\n\n containerDOM.removeEventListener('mouseleave', _this.onMouseUp); // 移动端事件\n\n containerDOM.removeEventListener('touchmove', _this.onMouseMove);\n containerDOM.removeEventListener('touchend', _this.onMouseUp);\n containerDOM.removeEventListener('touchcancel', _this.onMouseUp);\n }\n };\n\n var _a = cfg.x,\n x = _a === void 0 ? 0 : _a,\n _b = cfg.y,\n y = _b === void 0 ? 0 : _b,\n _c = cfg.width,\n width = _c === void 0 ? 100 : _c,\n height = cfg.height,\n _d = cfg.padding,\n padding = _d === void 0 ? 10 : _d,\n trendCfg = cfg.trendCfg,\n _e = cfg.controllerCfg,\n controllerCfg = _e === void 0 ? {\n speed: 1\n } : _e,\n _f = cfg.backgroundStyle,\n backgroundStyle = _f === void 0 ? {} : _f,\n _g = cfg.foregroundStyle,\n foregroundStyle = _g === void 0 ? {} : _g,\n _h = cfg.handlerStyle,\n handlerStyle = _h === void 0 ? {} : _h,\n _j = cfg.textStyle,\n textStyle = _j === void 0 ? {} : _j,\n // 缩略轴的初始位置\n _k = cfg.start,\n // 缩略轴的初始位置\n start = _k === void 0 ? 0 : _k,\n _l = cfg.end,\n end = _l === void 0 ? 1 : _l,\n _m = cfg.minText,\n minText = _m === void 0 ? '' : _m,\n _o = cfg.maxText,\n maxText = _o === void 0 ? '' : _o,\n group = cfg.group,\n graph = cfg.graph,\n canvas = cfg.canvas,\n _p = cfg.tick,\n tick = _p === void 0 ? {\n tickLabelStyle: {},\n tickLineStyle: {},\n tickLabelFormatter: function tickLabelFormatter(d) {\n return d;\n },\n ticks: []\n } : _p,\n type = cfg.type;\n this.graph = graph;\n this.canvas = canvas;\n this.group = group;\n this.timeBarType = type; // position size\n\n this.x = x;\n this.y = y;\n this.width = width;\n this.height = height;\n this.padding = padding;\n this.ticks = tick.ticks;\n this.trendCfg = trendCfg;\n this.controllerCfg = controllerCfg;\n this.currentSpeed = controllerCfg.speed || 1;\n this.tickLabelFormatter = tick.tickLabelFormatter; // style\n\n if (type === 'trend') {\n this.backgroundStyle = trendTimeBar_assign(trendTimeBar_assign({}, BACKGROUND_STYLE), backgroundStyle);\n } else if (type === 'simple') {\n this.backgroundStyle = trendTimeBar_assign(trendTimeBar_assign({}, SIMPLE_BACKGROUND_STYLE), backgroundStyle);\n }\n\n this.foregroundStyle = trendTimeBar_assign(trendTimeBar_assign({}, FOREGROUND_STYLE), foregroundStyle);\n this.handlerStyle = trendTimeBar_assign(trendTimeBar_assign({}, HANDLER_STYLE), handlerStyle);\n this.textStyle = trendTimeBar_assign(trendTimeBar_assign({}, TEXT_STYLE), textStyle);\n this.tickLabelStyle = trendTimeBar_assign(trendTimeBar_assign({}, TICK_LABEL_STYLE), tick.tickLabelStyle);\n this.tickLineStyle = trendTimeBar_assign(trendTimeBar_assign({}, TICK_LINE_STYLE), tick.tickLineStyle);\n this.currentMode = 'range'; // 初始信息\n\n this.start = start;\n this.end = end;\n this.minText = minText;\n this.maxText = maxText; // 初始化 fontFamily,如果有浏览器,取 body 上的字体,防止文字更新时局部渲染造成的重影\n\n this.fontFamily = typeof window !== 'undefined' ? window.getComputedStyle(document.body, null).getPropertyValue('font-family') || 'Arial, sans-serif' : 'Arial, sans-serif';\n this.renderSlider();\n }\n /**\n * 更新配置\n * @param cfg\n */\n\n\n TrendTimeBar.prototype.update = function (cfg) {\n var x = cfg.x,\n y = cfg.y,\n width = cfg.width,\n height = cfg.height,\n minText = cfg.minText,\n maxText = cfg.maxText,\n start = cfg.start,\n end = cfg.end; // start、end 只能是 0~1 范围\n\n this.start = Math.min(1, Math.max(start, 0));\n this.end = Math.min(1, Math.max(end, 0)); // 如果传了则更新,没有传则不更新\n // @ts-ignore\n\n Object(esm[\"assign\"])(this, {\n x: x,\n y: y,\n width: width,\n height: height,\n minText: minText,\n maxText: maxText\n }); // 更新 ui,不自动绘制\n\n this.updateUI();\n };\n\n TrendTimeBar.prototype.setText = function (minText, maxText) {\n this.minTextShape.attr('text', minText);\n this.maxTextShape.attr('text', maxText);\n };\n /**\n * 初始化组件结构\n * @private\n */\n\n\n TrendTimeBar.prototype.renderSlider = function () {\n var _this = this;\n\n var _a = this,\n width = _a.width,\n height = _a.height,\n timeBarType = _a.timeBarType; // 趋势图数据\n\n\n if (timeBarType === 'trend' && Object(esm[\"size\"])(Object(esm[\"get\"])(this.trendCfg, 'data'))) {\n var trendComponent = new timeBar_trend(trendTimeBar_assign(trendTimeBar_assign({\n x: this.x,\n y: this.y,\n width: width,\n height: height\n }, this.trendCfg), {\n group: this.group\n }));\n this.trendComponent = trendComponent;\n }\n\n var sliderGroup = this.group.addGroup({\n name: 'slider-group'\n }); // 1. 背景\n\n sliderGroup.addShape('rect', {\n attrs: trendTimeBar_assign({\n x: 0,\n y: 0,\n width: width,\n height: height\n }, this.backgroundStyle)\n });\n var textGroup = this.group.addGroup(); // 2. 左右文字\n\n if (timeBarType === 'trend') {\n this.minTextShape = textGroup.addShape('text', {\n attrs: trendTimeBar_assign({\n x: 0,\n y: height / 2 + this.y,\n textAlign: 'right',\n text: this.minText,\n silent: false,\n fontFamily: this.fontFamily || 'Arial, sans-serif'\n }, this.textStyle),\n capture: false\n });\n this.maxTextShape = textGroup.addShape('text', {\n attrs: trendTimeBar_assign({\n y: height / 2 + this.y,\n textAlign: 'left',\n text: this.maxText,\n silent: false,\n fontFamily: this.fontFamily || 'Arial, sans-serif'\n }, this.textStyle),\n capture: false\n });\n } else {\n this.minTextShape = textGroup.addShape('text', {\n attrs: trendTimeBar_assign({\n x: 0,\n y: this.y - 10,\n textAlign: 'center',\n text: this.minText,\n silent: false,\n fontFamily: this.fontFamily || 'Arial, sans-serif'\n }, this.textStyle),\n capture: false\n });\n this.maxTextShape = textGroup.addShape('text', {\n attrs: trendTimeBar_assign({\n y: this.y - 10,\n textAlign: 'center',\n text: this.maxText,\n silent: false,\n fontFamily: this.fontFamily || 'Arial, sans-serif'\n }, this.textStyle),\n capture: false\n });\n } // 3. 前景 选中背景框\n\n\n this.foregroundShape = this.group.addGroup().addShape('rect', {\n attrs: trendTimeBar_assign({\n x: 0,\n y: this.y,\n height: height\n }, this.foregroundStyle)\n });\n this.foregroundShape.on('mousedown', function (e) {\n e.target.attr('cursor', 'grabbing');\n });\n this.foregroundShape.on('mouseup', function (e) {\n e.target.attr('cursor', _this.foregroundStyle.cursor || 'grab');\n }); // 滑块相关的大小信息\n\n var handlerWidth = Object(esm[\"get\"])(this.handlerStyle, 'width', 2);\n var handlerHeight = Object(esm[\"get\"])(this.handlerStyle, 'height', 24);\n var minHandleGroup = this.group.addGroup({\n name: 'minHandlerShape'\n }); // 4. 左右滑块\n\n this.minHandlerShape = new timeBar_handler({\n name: 'minHandlerShape',\n group: minHandleGroup,\n type: timeBarType,\n x: this.x,\n y: this.y,\n width: handlerWidth,\n height: handlerHeight,\n style: this.handlerStyle\n });\n var maxHandleGroup = this.group.addGroup({\n name: 'maxHandlerShape'\n });\n this.maxHandlerShape = new timeBar_handler({\n name: 'maxHandlerShape',\n group: maxHandleGroup,\n type: timeBarType,\n x: this.x,\n y: this.y,\n width: handlerWidth,\n height: handlerHeight,\n style: this.handlerStyle\n }); // 缩略图下面的时间刻度\n\n var tickData = this.ticks;\n var interval = width / (tickData.length - 1);\n this.tickPosList = [];\n\n if (this.textList && this.textList.length) {\n this.textList.forEach(function (text) {\n text.destroy();\n });\n }\n\n var lastX = -Infinity;\n this.textList = tickData.map(function (data, index) {\n _this.tickPosList.push(_this.x + index * interval);\n\n var label;\n\n if (_this.tickLabelFormatter) {\n label = _this.tickLabelFormatter(data);\n\n if (!Object(esm[\"isString\"])(label) && label) {\n // return true\n label = data.date;\n }\n } else {\n label = data.date;\n } // 文本刻度\n\n\n var text = _this.group.addShape('text', {\n attrs: trendTimeBar_assign({\n x: _this.x + index * interval,\n y: _this.y + height + 5,\n text: label,\n fontFamily: _this.fontFamily || 'Arial, sans-serif'\n }, _this.tickLabelStyle)\n }); // 文本刻度上面的竖线\n\n\n var line = _this.group.addShape('line', {\n attrs: trendTimeBar_assign({\n x1: _this.x + index * interval,\n y1: _this.y + height + 2,\n x2: _this.x + index * interval,\n y2: _this.y + height + 6\n }, _this.tickLineStyle)\n });\n\n line.toBack();\n var bbox = text.getBBox(); // 抽样,标签与标签间距不小于 10\n\n if (bbox.minX > lastX) {\n text.show();\n line.show();\n lastX = bbox.minX + bbox.width + 10;\n } else {\n text.hide();\n line.hide();\n }\n\n return text;\n }); // 渲染播放、快进和后退的控制按钮\n\n this.controllerBtnGroup = new controllerBtn(trendTimeBar_assign({\n group: this.group,\n x: this.x,\n y: this.y + height + 25,\n width: width,\n height: 35\n }, this.controllerCfg)); // 初始化 minText 和 maxText,方便计算它们的 bbox\n\n this.updateStartEnd(0); // 根据 start end 更新 ui 的位置信息\n\n this.updateUI(); // 移动到对应的位置\n\n sliderGroup.move(this.x, this.y); // 绑定事件鼠标事件\n\n this.bindEvents();\n };\n /**\n * 绑定事件:\n * - 点击\n * - 滑动\n * - 拖拽\n * - 滚动\n * @private\n */\n\n\n TrendTimeBar.prototype.bindEvents = function () {\n var _this = this; // 1. 左滑块的滑动\n\n\n var minHandleShapeGroup = this.group.find(function (group) {\n return group.get('name') === 'minHandlerShape';\n });\n\n if (minHandleShapeGroup) {\n minHandleShapeGroup.on('minHandlerShape-handler:mousedown', this.onMouseDown(this.minHandlerShape));\n minHandleShapeGroup.on('minHandlerShape-handler:touchstart', this.onMouseDown(this.minHandlerShape));\n }\n\n var maxHandleShapeGroup = this.group.find(function (group) {\n return group.get('name') === 'maxHandlerShape';\n }); // 2. 右滑块的滑动\n\n if (maxHandleShapeGroup) {\n maxHandleShapeGroup.on('maxHandlerShape-handler:mousedown', this.onMouseDown(this.maxHandlerShape));\n maxHandleShapeGroup.on('maxHandlerShape-handler:touchstart', this.onMouseDown(this.maxHandlerShape));\n } // 3. 前景选中区域\n\n\n this.foregroundShape.on('mousedown', this.onMouseDown(this.foregroundShape));\n this.foregroundShape.on('touchstart', this.onMouseDown(this.foregroundShape)); // 播放区按钮控制\n\n /** 播放/暂停事件 */\n\n this.group.on(PLAY_PAUSE_BTN + \":click\", function () {\n _this.isPlay = !_this.isPlay;\n _this.currentHandler = _this.maxHandlerShape;\n\n _this.changePlayStatus();\n }); // 处理前进一步的事件\n\n this.group.on(NEXT_STEP_BTN + \":click\", function () {\n _this.currentHandler = _this.maxHandlerShape;\n\n _this.updateStartEnd(0.01);\n\n _this.updateUI();\n }); // 处理后退一步的事件\n\n this.group.on(PRE_STEP_BTN + \":click\", function () {\n _this.currentHandler = _this.maxHandlerShape;\n\n _this.updateStartEnd(-0.01);\n\n _this.updateUI();\n });\n this.group.on(TIMEBAR_CONFIG_CHANGE, function (_a) {\n var type = _a.type,\n speed = _a.speed;\n _this.currentSpeed = speed;\n _this.currentMode = type;\n\n if (type === 'single') {\n _this.minHandlerShape.hide();\n\n _this.foregroundShape.hide();\n\n _this.minTextShape.hide();\n } else if (type === 'range') {\n _this.minHandlerShape.show();\n\n _this.foregroundShape.show();\n\n _this.minTextShape.show();\n }\n });\n };\n /** 输入当前圆点位置,输出离哪个 tick 的位置最近 */\n\n\n TrendTimeBar.prototype.adjustTickIndex = function (timeSelectX) {\n for (var i = 0; i < this.tickPosList.length - 1; i++) {\n if (this.tickPosList[i] <= timeSelectX && timeSelectX <= this.tickPosList[i + 1]) {\n return Math.abs(this.tickPosList[i] - timeSelectX) < Math.abs(timeSelectX - this.tickPosList[i + 1]) ? i : i + 1;\n }\n }\n\n return 0;\n };\n /**\n * 调整 offsetRange,因为一些范围的限制\n * @param offsetRange\n */\n\n\n TrendTimeBar.prototype.adjustOffsetRange = function (offsetRange) {\n // 针对不同的滑动组件,处理的方式不同\n switch (this.currentHandler) {\n case this.minHandlerShape:\n {\n var min = 0 - this.start;\n var max = 1 - this.start;\n return Math.min(max, Math.max(min, offsetRange));\n }\n\n case this.maxHandlerShape:\n {\n var min = 0 - this.end;\n var max = 1 - this.end;\n return Math.min(max, Math.max(min, offsetRange));\n }\n\n case this.foregroundShape:\n {\n var min = 0 - this.start;\n var max = 1 - this.end;\n return Math.min(max, Math.max(min, offsetRange));\n }\n\n default:\n return 0;\n }\n };\n /**\n * 更新起始、结束的控制块位置、文本、范围值(原始值)\n * @param offsetRange\n */\n\n\n TrendTimeBar.prototype.updateStartEnd = function (offsetRange) {\n var minData = this.ticks[this.adjustTickIndex(this.start * this.width)];\n var maxData = this.ticks[this.adjustTickIndex(this.end * this.width)];\n\n if (!this.currentHandler) {\n this.minText = this.tickLabelFormatter ? this.tickLabelFormatter(minData) : minData.date;\n this.maxText = this.tickLabelFormatter ? this.tickLabelFormatter(maxData) : maxData.date;\n return;\n } // 操作不同的组件,反馈不一样\n\n\n switch (this.currentHandler) {\n case this.minHandlerShape:\n // 拖动最小滑块时使用当前最大值设置最大值的文本,以便恢复到默认值\n this.maxText = this.maxTextShape.attr('text');\n this.start += offsetRange;\n this.minText = this.tickLabelFormatter ? this.tickLabelFormatter(minData) : minData.date;\n break;\n\n case this.maxHandlerShape:\n // 拖动最大滑块时使用当前最小值设置最小值的文本,以便恢复到默认值\n this.minText = this.minTextShape.attr('text');\n this.end += offsetRange;\n this.maxText = this.tickLabelFormatter ? this.tickLabelFormatter(maxData) : maxData.date;\n break;\n\n case this.foregroundShape:\n this.start += offsetRange;\n this.end += offsetRange;\n this.minText = this.tickLabelFormatter ? this.tickLabelFormatter(minData) : minData.date;\n this.maxText = this.tickLabelFormatter ? this.tickLabelFormatter(maxData) : maxData.date;\n break;\n\n default:\n break;\n }\n };\n /**\n * 根据移动的比例来更新 ui,更新范围(0-1 范围的比例值)\n * @private\n */\n\n\n TrendTimeBar.prototype.updateUI = function () {\n var _this = this;\n\n if (this.start < 0) {\n this.start = 0;\n }\n\n if (this.end > 1) {\n this.end = 1;\n }\n\n var min = this.x + this.start * this.width;\n var max = this.x + this.end * this.width; // 1. foreground\n\n this.foregroundShape.attr('x', min);\n this.foregroundShape.attr('width', max - min); // 滑块相关的大小信息\n\n var handlerWidth = Object(esm[\"get\"])(this.handlerStyle, 'width', DEFAULT_HANDLER_WIDTH); // 设置文本\n\n this.setText(this.minText, this.maxText);\n\n var _a = this.dodgeText([min, max]),\n minAttrs = _a[0],\n maxAttrs = _a[1]; // 2. 左侧滑块和文字位置\n\n\n this.minHandlerShape.setX(min - handlerWidth / 2);\n Object(esm[\"each\"])(minAttrs, function (v, k) {\n return _this.minTextShape.attr(k, v);\n }); // 3. 右侧滑块和文字位置\n\n this.maxHandlerShape.setX(max - handlerWidth / 2);\n Object(esm[\"each\"])(maxAttrs, function (v, k) {\n return _this.maxTextShape.attr(k, v);\n });\n\n if (this.currentMode === 'range') {\n // 因为存储的 start、end 可能不一定是按大小存储的,所以排序一下,对外是 end >= start\n this.graph.emit(VALUE_CHANGE, {\n value: [this.start, this.end].sort()\n });\n } else if (this.currentMode === 'single') {\n this.graph.emit(VALUE_CHANGE, {\n value: [this.end, this.end]\n });\n }\n };\n /**\n * 调整 text 的位置,自动躲避\n * 根据位置,调整返回新的位置\n * @param range\n */\n\n\n TrendTimeBar.prototype.dodgeText = function (range) {\n var _a, _b;\n\n var TEXTPADDING = 2;\n var handlerWidth = Object(esm[\"get\"])(this.handlerStyle, 'width', DEFAULT_HANDLER_WIDTH);\n var minTextShape = this.minTextShape;\n var maxTextShape = this.maxTextShape;\n var min = range[0],\n max = range[1];\n var sorted = false; // 如果交换了位置,则对应的 min max 也交换\n\n if (min > max) {\n _a = [max, min], min = _a[0], max = _a[1];\n _b = [maxTextShape, minTextShape], minTextShape = _b[0], maxTextShape = _b[1];\n sorted = true;\n } // 避让规则,优先显示在两侧,只有显示不下的时候,才显示在中间\n\n\n var minBBox = minTextShape.getBBox();\n var maxBBox = maxTextShape.getBBox();\n var minAttrs = null;\n var maxAttrs = null;\n\n if (this.timeBarType === 'trend') {\n minAttrs = min - minBBox.width < this.x + TEXTPADDING ? {\n x: min + handlerWidth / 2 + TEXTPADDING,\n textAlign: 'left'\n } : {\n x: min - handlerWidth / 2 - TEXTPADDING,\n textAlign: 'right'\n };\n maxAttrs = max + maxBBox.width > this.x + this.width ? {\n x: max - handlerWidth / 2 - TEXTPADDING,\n textAlign: 'right'\n } : {\n x: max + handlerWidth / 2 + TEXTPADDING,\n textAlign: 'left'\n };\n } else if (this.timeBarType === 'simple') {\n minAttrs = minBBox.width > min - TEXTPADDING ? {\n x: min + handlerWidth / 2 + TEXTPADDING,\n textAlign: 'center'\n } : {\n x: min - handlerWidth / 2 - TEXTPADDING,\n textAlign: 'center'\n };\n maxAttrs = maxBBox.width > this.width - max - TEXTPADDING ? {\n x: max - handlerWidth / 2 - TEXTPADDING,\n textAlign: 'center'\n } : {\n x: max + handlerWidth / 2 + TEXTPADDING,\n textAlign: 'center'\n };\n }\n\n return !sorted ? [minAttrs, maxAttrs] : [maxAttrs, minAttrs];\n };\n\n TrendTimeBar.prototype.startPlay = function () {\n var _this = this;\n\n return typeof window !== 'undefined' ? window.requestAnimationFrame(function () {\n var _a = _this,\n ticks = _a.ticks,\n width = _a.width;\n var speed = _this.currentSpeed;\n var tickInterval = width / ticks.length;\n var offsetX = tickInterval / ((10 - speed) * 1000 / 60);\n\n var offsetXRange = _this.adjustOffsetRange(offsetX / _this.width);\n\n _this.updateStartEnd(offsetXRange);\n\n _this.updateUI();\n\n if (_this.isPlay) {\n _this.playHandler = _this.startPlay();\n }\n }) : undefined;\n };\n\n TrendTimeBar.prototype.changePlayStatus = function (isSync) {\n if (isSync === void 0) {\n isSync = true;\n }\n\n this.controllerBtnGroup.playButton.update({\n isPlay: this.isPlay\n });\n\n if (this.isPlay) {\n // 开始播放\n this.playHandler = this.startPlay();\n this.graph.emit(TIMELINE_START, null);\n } else {\n // 结束播放\n if (this.playHandler) {\n if (typeof window !== 'undefined') window.cancelAnimationFrame(this.playHandler);\n\n if (isSync) {\n this.graph.emit(TIMELINE_END, null);\n }\n }\n }\n };\n\n TrendTimeBar.prototype.destory = function () {\n this.graph.off(VALUE_CHANGE);\n var group = this.group;\n var minHandleShapeGroup = group.find(function (g) {\n return g.get('name') === 'minHandlerShape';\n });\n\n if (minHandleShapeGroup) {\n minHandleShapeGroup.off('minHandlerShape-handler:mousedown');\n minHandleShapeGroup.off('minHandlerShape-handler:touchstart');\n minHandleShapeGroup.destroy();\n }\n\n var maxHandleShapeGroup = group.find(function (g) {\n return g.get('name') === 'maxHandlerShape';\n }); // 2. 右滑块的滑动\n\n if (maxHandleShapeGroup) {\n maxHandleShapeGroup.off('maxHandlerShape-handler:mousedown');\n maxHandleShapeGroup.off('maxHandlerShape-handler:touchstart');\n maxHandleShapeGroup.destroy();\n } // 3. 前景选中区域\n\n\n this.foregroundShape.off('mousedown');\n this.foregroundShape.off('touchstart');\n this.foregroundShape.destroy();\n group.off(PLAY_PAUSE_BTN + \":click\");\n group.off(NEXT_STEP_BTN + \":click\");\n group.off(PRE_STEP_BTN + \":click\");\n group.off(TIMEBAR_CONFIG_CHANGE);\n group.destroy();\n\n if (this.trendComponent) {\n this.trendComponent.destory();\n }\n };\n\n return TrendTimeBar;\n}();\n\n/* harmony default export */ var trendTimeBar = (trendTimeBar_TrendTimeBar);\n// CONCATENATED MODULE: ./node_modules/@antv/g6-plugin/es/timeBar/timeBarTooltip.js\n\n\nvar timeBarTooltip_BACKGROUND_STYLE = {\n opacity: 0.5,\n fill: '#000'\n};\nvar ARROW_STYLE = {\n opacity: 0.5,\n fill: '#000',\n r: 5\n};\nvar timeBarTooltip_TEXT_STYLE = {\n fill: '#fff',\n fontSize: 12\n};\n/**\n * 缩略趋势图\n */\n\nvar timeBarTooltip_TimeBarTooltip =\n/** @class */\nfunction () {\n function TimeBarTooltip(cfg) {\n var _a = cfg.x,\n x = _a === void 0 ? 0 : _a,\n _b = cfg.y,\n y = _b === void 0 ? 0 : _b,\n container = cfg.container,\n text = cfg.text,\n _c = cfg.padding,\n padding = _c === void 0 ? [4, 4, 4, 4] : _c,\n _d = cfg.className,\n className = _d === void 0 ? 'g6-component-timebar-tooltip' : _d,\n _e = cfg.backgroundColor,\n backgroundColor = _e === void 0 ? '#000' : _e,\n _f = cfg.textColor,\n textColor = _f === void 0 ? '#fff' : _f,\n _g = cfg.opacity,\n opacity = _g === void 0 ? 0.8 : _g,\n _h = cfg.fontSize,\n fontSize = _h === void 0 ? 12 : _h;\n this.container = container;\n this.className = className;\n this.backgroundColor = backgroundColor;\n this.textColor = textColor;\n this.x = x;\n this.y = y;\n this.text = text;\n this.padding = padding;\n this.opacity = opacity;\n this.fontSize = fontSize;\n this.render();\n }\n /**\n * 首次渲染\n * @private\n */\n\n\n TimeBarTooltip.prototype.render = function () {\n var self = this;\n var className = self.className,\n x = self.x,\n y = self.y,\n backgroundColor = self.backgroundColor,\n textColor = self.textColor,\n text = self.text,\n padding = self.padding,\n opacity = self.opacity,\n fontSize = self.fontSize;\n var parentNode = self.container;\n var container = createDom(\"
\");\n\n if (Object(esm[\"isString\"])(parentNode)) {\n parentNode = document.getElementById(parentNode);\n }\n\n parentNode.appendChild(container);\n self.parentHeight = parentNode.offsetHeight;\n self.parentWidth = parentNode.offsetWidth;\n modifyCSS(container, {\n visibility: 'hidden',\n top: 0,\n left: 0\n });\n var background = createDom(\"\\n
\");\n background.innerHTML = text;\n container.appendChild(background);\n self.backgroundDOM = background;\n var arrow = createDom(\"
\");\n container.appendChild(arrow);\n self.arrowDOM = arrow;\n self.container = container;\n };\n\n TimeBarTooltip.prototype.show = function (cfg) {\n var self = this;\n var text = cfg.text,\n x = cfg.x,\n y = cfg.y,\n clientX = cfg.clientX,\n clientY = cfg.clientY;\n self.backgroundDOM.innerHTML = text;\n var backgroundWidth = self.backgroundDOM.offsetWidth;\n var backgroundHeight = self.backgroundDOM.offsetHeight;\n var arrowWidth = self.arrowDOM.offsetWidth;\n var arrowHeight = self.arrowDOM.offsetHeight;\n modifyCSS(self.container, {\n top: -backgroundHeight - arrowHeight + \"px\",\n left: x + \"px\",\n visibility: 'visible'\n });\n modifyCSS(self.backgroundDOM, {\n marginLeft: -backgroundWidth / 2 + \"px\"\n });\n modifyCSS(self.arrowDOM, {\n marginLeft: -arrowWidth / 2 + \"px\",\n top: backgroundHeight + \"px\"\n });\n var left = x - backgroundWidth / 2;\n var right = x + backgroundWidth / 2;\n\n if (left < 0) {\n modifyCSS(self.backgroundDOM, {\n marginLeft: -backgroundWidth / 2 - left + \"px\"\n });\n } else if (right > self.parentWidth) {\n modifyCSS(self.backgroundDOM, {\n marginLeft: -backgroundWidth / 2 - right + self.parentWidth + 12 + \"px\"\n });\n }\n };\n\n TimeBarTooltip.prototype.hide = function () {\n modifyCSS(this.container, {\n top: 0,\n left: 0,\n visibility: 'hidden'\n });\n };\n\n return TimeBarTooltip;\n}();\n\n/* harmony default export */ var timeBarTooltip = (timeBarTooltip_TimeBarTooltip);\n// CONCATENATED MODULE: ./node_modules/@antv/g6-plugin/es/timeBar/timeBarSlice.js\nvar timeBarSlice_assign = undefined && undefined.__assign || function () {\n timeBarSlice_assign = Object.assign || function (t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n\n for (var p in s) {\n if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n }\n\n return t;\n };\n\n return timeBarSlice_assign.apply(this, arguments);\n};\n\n\n\n\n\nvar DEFAULT_SELECTEDTICK_STYLE = {\n fill: '#5B8FF9'\n};\nvar DEFAULT_UNSELECTEDTICK_STYLE = {\n fill: '#e6e8e9'\n};\n\nvar timeBarSlice_TimeBarSlice =\n/** @class */\nfunction () {\n function TimeBarSlice(cfgs) {\n this.frameCount = 0;\n this.fontFamily = 'Arial, sans-serif';\n var graph = cfgs.graph,\n canvas = cfgs.canvas,\n group = cfgs.group,\n width = cfgs.width,\n height = cfgs.height,\n padding = cfgs.padding,\n data = cfgs.data,\n start = cfgs.start,\n end = cfgs.end,\n _a = cfgs.x,\n x = _a === void 0 ? 0 : _a,\n _b = cfgs.y,\n y = _b === void 0 ? 0 : _b,\n tickLabelFormatter = cfgs.tickLabelFormatter,\n _c = cfgs.selectedTickStyle,\n selectedTickStyle = _c === void 0 ? DEFAULT_SELECTEDTICK_STYLE : _c,\n _d = cfgs.unselectedTickStyle,\n unselectedTickStyle = _d === void 0 ? DEFAULT_UNSELECTEDTICK_STYLE : _d,\n tooltipBackgroundColor = cfgs.tooltipBackgroundColor,\n tooltipFomatter = cfgs.tooltipFomatter;\n this.graph = graph;\n this.group = group;\n this.sliceGroup = group.addGroup({\n name: 'slice-group'\n });\n this.canvas = canvas;\n this.width = width;\n this.height = height;\n this.padding = padding;\n this.data = data;\n this.start = start;\n this.end = end;\n this.tickLabelFormatter = tickLabelFormatter;\n this.selectedTickStyle = selectedTickStyle;\n this.unselectedTickStyle = unselectedTickStyle;\n this.x = x;\n this.y = y;\n this.tooltipBackgroundColor = tooltipBackgroundColor;\n this.tooltipFomatter = tooltipFomatter; // 初始化 fontFamily,如果有浏览器,取 body 上的字体,防止文字更新时局部渲染造成的重影\n\n this.fontFamily = typeof window !== 'undefined' ? window.getComputedStyle(document.body, null).getPropertyValue('font-family') || 'Arial, sans-serif' : 'Arial, sans-serif';\n this.renderSlices();\n this.initEvent();\n }\n\n TimeBarSlice.prototype.renderSlices = function () {\n var _this = this;\n\n var _a = this,\n width = _a.width,\n height = _a.height,\n padding = _a.padding,\n data = _a.data,\n start = _a.start,\n end = _a.end,\n tickLabelFormatter = _a.tickLabelFormatter,\n selectedTickStyle = _a.selectedTickStyle,\n unselectedTickStyle = _a.unselectedTickStyle;\n\n var realWidth = width - 2 * padding;\n var fontSize = 10;\n var labelLineHeight = 4;\n var labelAreaHeight = 3 * padding + labelLineHeight + fontSize;\n var ticksAreaHeight = height - labelAreaHeight - 2 * padding;\n var gap = 2;\n var ticksLength = data.length;\n var tickWidth = (realWidth - gap * (ticksLength - 1)) / ticksLength;\n this.tickWidth = tickWidth;\n var sliceGroup = this.sliceGroup;\n var tickRects = [];\n var labels = [];\n var startTickId = Math.round(ticksLength * start);\n var endTickId = Math.round(ticksLength * end);\n this.startTickRectId = startTickId;\n this.endTickRectId = endTickId;\n data.forEach(function (d, i) {\n // draw the tick rects\n var selected = i >= startTickId && i <= endTickId;\n var tickStyle = selected ? selectedTickStyle : unselectedTickStyle;\n var rect = sliceGroup.addShape('rect', {\n attrs: timeBarSlice_assign({\n x: padding + i * (tickWidth + gap),\n y: padding,\n width: tickWidth,\n height: ticksAreaHeight\n }, tickStyle),\n draggable: true,\n name: \"tick-rect-\" + i\n }); // draw the pick tick rects\n\n var pickRect = sliceGroup.addShape('rect', {\n attrs: {\n x: padding + i * tickWidth + gap * (2 * i - 1) / 2,\n y: padding,\n width: i === 0 || i === ticksLength - 1 ? tickWidth + gap / 2 : tickWidth + gap,\n height: ticksAreaHeight,\n fill: '#fff',\n opacity: 0\n },\n draggable: true,\n name: \"pick-rect-\" + i\n });\n pickRect.toFront();\n var rectBBox = rect.getBBox();\n var centerX = (rectBBox.minX + rectBBox.maxX) / 2;\n tickRects.push({\n rect: rect,\n pickRect: pickRect,\n value: d.date,\n x: centerX,\n y: rectBBox.minY\n });\n var label;\n\n if (tickLabelFormatter) {\n label = tickLabelFormatter(d);\n\n if (!Object(esm[\"isString\"])(label) && label) {\n // return true\n label = d.date;\n }\n } else if (i % Math.round(ticksLength / 10) === 0) {\n label = d.date;\n }\n\n if (label) {\n labels.push(label); // draw tick lines\n\n var lineStartY = rectBBox.maxY + padding * 2;\n sliceGroup.addShape('line', {\n attrs: {\n stroke: '#BFBFBF',\n x1: centerX,\n y1: lineStartY,\n x2: centerX,\n y2: lineStartY + labelLineHeight\n }\n });\n var labelStartY = lineStartY + labelLineHeight + padding;\n var text = sliceGroup.addShape('text', {\n attrs: {\n fill: '#8c8c8c',\n stroke: '#fff',\n lineWidth: 1,\n x: centerX,\n y: labelStartY,\n textAlign: 'center',\n text: label,\n textBaseline: 'top',\n fontSize: 10,\n fontFamily: _this.fontFamily || 'Arial, sans-serif'\n },\n capture: false\n });\n var textBBox = text.getBBox();\n\n if (textBBox.maxX > width) {\n text.attr('textAlign', 'right');\n } else if (textBBox.minX < 0) {\n text.attr('textAlign', 'left');\n } // draw tick labels\n\n }\n });\n this.tickRects = tickRects; // 渲染播放、快进和后退的控制按钮\n\n var group = this.group;\n this.currentSpeed = 1;\n this.controllerBtnGroup = new controllerBtn({\n group: group,\n x: this.x,\n y: this.y + height + 5,\n width: width,\n height: 40,\n hideTimeTypeController: true,\n speed: this.currentSpeed,\n fontFamily: this.fontFamily || 'Arial, sans-serif'\n });\n };\n\n TimeBarSlice.prototype.initEvent = function () {\n var _this = this;\n\n var sliceGroup = this.sliceGroup;\n sliceGroup.on('click', function (e) {\n var targetRect = e.target;\n if (targetRect.get('type') !== 'rect' || !targetRect.get('name')) return;\n var id = parseInt(targetRect.get('name').split('-')[2], 10);\n\n if (!isNaN(id)) {\n var tickRects_1 = _this.tickRects; // cancel the selected ticks\n\n var unselectedTickStyle_1 = _this.unselectedTickStyle;\n tickRects_1.forEach(function (tickRect) {\n tickRect.rect.attr(unselectedTickStyle_1);\n });\n var selectedTickStyle = _this.selectedTickStyle;\n tickRects_1[id].rect.attr(selectedTickStyle);\n _this.startTickRectId = id;\n _this.endTickRectId = id;\n var ticksLength = tickRects_1.length;\n var start = id / ticksLength;\n\n _this.graph.emit(VALUE_CHANGE, {\n value: [start, start]\n });\n }\n });\n sliceGroup.on('dragstart', function (e) {\n var tickRects = _this.tickRects; // cancel the selected ticks\n\n var unselectedTickStyle = _this.unselectedTickStyle;\n tickRects.forEach(function (tickRect) {\n tickRect.rect.attr(unselectedTickStyle);\n });\n var targetRect = e.target;\n var id = parseInt(targetRect.get('name').split('-')[2], 10);\n var selectedTickStyle = _this.selectedTickStyle;\n tickRects[id].rect.attr(selectedTickStyle);\n _this.startTickRectId = id;\n var ticksLength = tickRects.length;\n var start = id / ticksLength;\n\n _this.graph.emit(VALUE_CHANGE, {\n value: [start, start]\n });\n\n _this.dragging = true;\n });\n sliceGroup.on('dragover', function (e) {\n if (!_this.dragging) return;\n if (e.target.get('type') !== 'rect') return;\n var id = parseInt(e.target.get('name').split('-')[2], 10);\n var startTickRectId = _this.startTickRectId;\n var tickRects = _this.tickRects;\n var selectedTickStyle = _this.selectedTickStyle;\n var unselectedTickStyle = _this.unselectedTickStyle;\n\n for (var i = 0; i < tickRects.length; i++) {\n var style = i >= startTickRectId && i <= id ? selectedTickStyle : unselectedTickStyle;\n tickRects[i].rect.attr(style);\n }\n\n var ticksLength = tickRects.length;\n _this.endTickRectId = id;\n var start = startTickRectId / ticksLength;\n var end = id / ticksLength;\n\n _this.graph.emit(VALUE_CHANGE, {\n value: [start, end]\n });\n });\n sliceGroup.on('drop', function (e) {\n if (!_this.dragging) return;\n _this.dragging = false;\n if (e.target.get('type') !== 'rect') return;\n var startTickRectId = _this.startTickRectId;\n var id = parseInt(e.target.get('name').split('-')[2], 10);\n if (id < startTickRectId) return;\n var selectedTickStyle = _this.selectedTickStyle;\n var tickRects = _this.tickRects;\n tickRects[id].rect.attr(selectedTickStyle);\n _this.endTickRectId = id;\n var ticksLength = tickRects.length;\n var start = startTickRectId / ticksLength;\n var end = id / ticksLength;\n\n _this.graph.emit(VALUE_CHANGE, {\n value: [start, end]\n });\n }); // tooltip\n\n var _a = this,\n tooltipBackgroundColor = _a.tooltipBackgroundColor,\n tooltipFomatter = _a.tooltipFomatter,\n canvas = _a.canvas;\n\n var tooltip = new timeBarTooltip({\n container: canvas.get('container'),\n backgroundColor: tooltipBackgroundColor\n });\n var tickRects = this.tickRects;\n tickRects.forEach(function (tickRect) {\n var pickRect = tickRect.pickRect;\n pickRect.on('mouseenter', function (e) {\n var rect = e.target;\n if (rect.get('type') !== 'rect') return;\n var id = parseInt(rect.get('name').split('-')[2], 10);\n var clientPoint = canvas.getClientByPoint(tickRects[id].x, tickRects[id].y);\n tooltip.show({\n x: tickRects[id].x,\n y: tickRects[id].y,\n clientX: clientPoint.x,\n clientY: clientPoint.y,\n text: tooltipFomatter ? tooltipFomatter(tickRects[id].value) : tickRects[id].value\n });\n });\n pickRect.on('mouseleave', function (e) {\n tooltip.hide();\n });\n }); // play controller events\n\n var group = this.group; // 播放区按钮控制\n\n /** 播放/暂停事件 */\n\n group.on(PLAY_PAUSE_BTN + \":click\", function () {\n _this.isPlay = !_this.isPlay;\n\n _this.changePlayStatus();\n }); // 处理前进一步的事件\n\n group.on(NEXT_STEP_BTN + \":click\", function () {\n _this.updateStartEnd(1);\n }); // 处理后退一步的事件\n\n group.on(PRE_STEP_BTN + \":click\", function () {\n _this.updateStartEnd(-1);\n });\n group.on(TIMEBAR_CONFIG_CHANGE, function (_a) {\n var type = _a.type,\n speed = _a.speed;\n _this.currentSpeed = speed;\n });\n };\n\n TimeBarSlice.prototype.changePlayStatus = function (isSync) {\n if (isSync === void 0) {\n isSync = true;\n }\n\n this.controllerBtnGroup.playButton.update({\n isPlay: this.isPlay\n });\n\n if (this.isPlay) {\n // 开始播放\n this.playHandler = this.startPlay();\n this.graph.emit(TIMELINE_START, null);\n } else {\n // 结束播放\n if (this.playHandler) {\n if (typeof window !== 'undefined') window.cancelAnimationFrame(this.playHandler);\n\n if (isSync) {\n this.graph.emit(TIMELINE_END, null);\n }\n }\n }\n };\n\n TimeBarSlice.prototype.startPlay = function () {\n var _this = this;\n\n return typeof window !== 'undefined' ? window.requestAnimationFrame(function () {\n var speed = _this.currentSpeed; // 一分钟刷新一次\n\n if (_this.frameCount % (60 / speed) === 0) {\n _this.frameCount = 0;\n\n _this.updateStartEnd(1);\n }\n\n _this.frameCount++;\n\n if (_this.isPlay) {\n _this.playHandler = _this.startPlay();\n }\n }) : undefined;\n };\n\n TimeBarSlice.prototype.updateStartEnd = function (sign) {\n var self = this;\n var tickRects = this.tickRects;\n var ticksLength = tickRects.length;\n var unselectedTickStyle = this.unselectedTickStyle;\n var selectedTickStyle = this.selectedTickStyle;\n var previousEndTickRectId = self.endTickRectId;\n\n if (sign > 0) {\n self.endTickRectId++;\n } else {\n tickRects[self.endTickRectId].rect.attr(unselectedTickStyle);\n self.endTickRectId--;\n } // 若此时 start 与 end 不同,范围前进/后退/播放\n\n\n if (previousEndTickRectId !== self.startTickRectId) {\n if (self.endTickRectId < self.startTickRectId) {\n self.startTickRectId = self.endTickRectId;\n }\n } else {\n // 否则是单帧的前进/后退/播放\n for (var i = self.startTickRectId; i <= self.endTickRectId - 1; i++) {\n tickRects[i].rect.attr(unselectedTickStyle);\n }\n\n self.startTickRectId = self.endTickRectId;\n }\n\n if (tickRects[self.endTickRectId]) {\n tickRects[self.endTickRectId].rect.attr(selectedTickStyle);\n var start = self.startTickRectId / ticksLength;\n var end = self.endTickRectId / ticksLength;\n this.graph.emit(VALUE_CHANGE, {\n value: [start, end]\n });\n }\n };\n\n TimeBarSlice.prototype.destory = function () {\n this.graph.off(VALUE_CHANGE);\n var group = this.sliceGroup;\n group.off('click');\n group.off('dragstart');\n group.off('dragover');\n group.off('drop');\n this.tickRects.forEach(function (tickRect) {\n var pickRect = tickRect.pickRect;\n pickRect.off('mouseenter');\n pickRect.off('mouseleave');\n });\n this.tickRects.length = 0;\n group.off(PLAY_PAUSE_BTN + \":click\");\n group.off(NEXT_STEP_BTN + \":click\");\n group.off(PRE_STEP_BTN + \":click\");\n group.off(TIMEBAR_CONFIG_CHANGE);\n this.sliceGroup.destroy();\n };\n\n return TimeBarSlice;\n}();\n\n/* harmony default export */ var timeBarSlice = (timeBarSlice_TimeBarSlice);\n// CONCATENATED MODULE: ./node_modules/@antv/g6-plugin/es/timeBar/index.js\nvar timeBar_extends = undefined && undefined.__extends || function () {\n var _extendStatics = function extendStatics(d, b) {\n _extendStatics = Object.setPrototypeOf || {\n __proto__: []\n } instanceof Array && function (d, b) {\n d.__proto__ = b;\n } || function (d, b) {\n for (var p in b) {\n if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p];\n }\n };\n\n return _extendStatics(d, b);\n };\n\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null) throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n\n _extendStatics(d, b);\n\n function __() {\n this.constructor = d;\n }\n\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n}();\n\nvar timeBar_assign = undefined && undefined.__assign || function () {\n timeBar_assign = Object.assign || function (t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n\n for (var p in s) {\n if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n }\n\n return t;\n };\n\n return timeBar_assign.apply(this, arguments);\n};\n\nvar __rest = undefined && undefined.__rest || function (s, e) {\n var t = {};\n\n for (var p in s) {\n if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p];\n }\n\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]];\n }\n return t;\n};\n/**\n * 基于 G 的时间轴组件\n */\n\n\n\n\n\n\n\n\n\n // simple 版本默认高度\n\nvar DEFAULT_SIMPLE_HEIGHT = 4; // trend 版本默认高度\n\nvar DEFAULT_TREND_HEIGHT = 26;\n\nvar timeBar_TimeBar =\n/** @class */\nfunction (_super) {\n timeBar_extends(TimeBar, _super);\n\n function TimeBar(config) {\n return _super.call(this, config) || this;\n }\n\n TimeBar.prototype.getDefaultCfgs = function () {\n return {\n container: null,\n className: 'g6-component-timebar',\n padding: 10,\n type: 'trend',\n trend: {\n data: [],\n isArea: false,\n smooth: true\n },\n controllerCfg: {\n speed: 1,\n loop: false\n },\n slider: {\n start: 0.1,\n end: 0.9,\n minText: 'min',\n maxText: 'max'\n },\n tick: {\n start: 0.1,\n end: 0.9,\n data: []\n },\n textStyle: {},\n filterEdge: false\n };\n };\n /**\n * 初始化 TimeBar 的容器\n */\n\n\n TimeBar.prototype.initContainer = function () {\n var graph = this.get('graph');\n var _a = this._cfgs,\n width = _a.width,\n height = _a.height;\n var className = this.get('className') || 'g6-component-timebar';\n var container = this.get('container');\n var graphContainer = this.get('graph').get('container');\n var timeBarContainer;\n\n if (!container) {\n timeBarContainer = createDom(\"
\");\n modifyCSS(timeBarContainer, {\n position: 'relative'\n });\n } else {\n if (Object(esm[\"isString\"])(container)) {\n container = document.getElementById(container);\n }\n\n timeBarContainer = container;\n }\n\n graphContainer.appendChild(timeBarContainer);\n this.set('timeBarContainer', timeBarContainer);\n var canvas;\n var renderer = graph.get('renderer');\n\n if (renderer === 'SVG') {\n canvas = new g_svg_esm[\"Canvas\"]({\n container: timeBarContainer,\n width: width,\n height: height\n });\n } else {\n canvas = new g_canvas_esm[\"Canvas\"]({\n container: timeBarContainer,\n width: width,\n height: height\n });\n }\n\n this.set('canvas', canvas);\n };\n\n TimeBar.prototype.init = function () {\n this.initContainer();\n var canvas = this.get('canvas');\n var timeBarGroup = canvas.addGroup({\n name: 'timebar-group'\n });\n this.set('timeBarGroup', timeBarGroup);\n this.renderTrend();\n this.initEvent();\n var fontFamily = typeof window !== 'undefined' ? window.getComputedStyle(document.body, null).getPropertyValue('font-family') || 'Arial, sans-serif' : 'Arial, sans-serif';\n this.set('fontFamily', fontFamily);\n };\n\n TimeBar.prototype.renderTrend = function () {\n var _a = this._cfgs,\n width = _a.width,\n x = _a.x,\n y = _a.y,\n padding = _a.padding,\n type = _a.type,\n trend = _a.trend,\n slider = _a.slider,\n controllerCfg = _a.controllerCfg,\n textStyle = _a.textStyle,\n tick = _a.tick,\n backgroundStyle = _a.backgroundStyle,\n foregroundStyle = _a.foregroundStyle;\n\n var data = trend.data,\n other = __rest(trend, [\"data\"]);\n\n var realWidth = width - 2 * padding;\n var defaultHeight = type === 'trend' ? DEFAULT_TREND_HEIGHT : DEFAULT_SIMPLE_HEIGHT;\n var graph = this.get('graph');\n var group = this.get('timeBarGroup');\n var canvas = this.get('canvas');\n var timebar = null;\n\n if (type === 'trend' || type === 'simple') {\n timebar = new trendTimeBar(timeBar_assign(timeBar_assign({\n graph: graph,\n canvas: canvas,\n group: group,\n type: type,\n x: x + padding,\n y: type === 'trend' ? y + padding : y + padding + 15,\n width: realWidth,\n height: defaultHeight,\n padding: padding,\n backgroundStyle: backgroundStyle,\n foregroundStyle: foregroundStyle,\n trendCfg: timeBar_assign(timeBar_assign({}, other), {\n data: data.map(function (d) {\n return d.value;\n })\n })\n }, slider), {\n tick: {\n ticks: data,\n tickLabelFormatter: tick.tickLabelFormatter,\n tickLabelStyle: tick.tickLabelStyle,\n tickLineStyle: tick.tickLineStyle\n },\n handlerStyle: timeBar_assign(timeBar_assign({}, slider.handlerStyle), {\n height: slider.height || defaultHeight\n }),\n controllerCfg: controllerCfg,\n textStyle: textStyle\n }));\n } else if (type === 'tick') {\n // 刻度时间轴\n timebar = new timeBarSlice(timeBar_assign({\n graph: graph,\n canvas: canvas,\n group: group,\n x: x + padding,\n y: y + padding\n }, tick));\n }\n\n this.set('timebar', timebar);\n };\n\n TimeBar.prototype.filterData = function (evt) {\n var _a;\n\n var value = evt.value;\n var trendData = null;\n var type = this._cfgs.type;\n\n if (type === 'trend' || type === 'simple') {\n trendData = this._cfgs.trend.data;\n } else if (type === 'tick') {\n trendData = this._cfgs.tick.data;\n }\n\n if (!trendData || trendData.length === 0) {\n console.warn('请配置 TimeBar 组件的数据');\n return;\n }\n\n var rangeChange = this.get('rangeChange');\n var graph = this.get('graph');\n var min = Math.round(trendData.length * value[0]);\n var max = Math.round(trendData.length * value[1]);\n max = max >= trendData.length ? trendData.length - 1 : max;\n min = min >= trendData.length ? trendData.length - 1 : min;\n var tickLabelFormatter = (_a = this._cfgs.tick) === null || _a === void 0 ? void 0 : _a.tickLabelFormatter;\n var minText = tickLabelFormatter ? tickLabelFormatter(trendData[min]) : trendData[min].date;\n var maxText = tickLabelFormatter ? tickLabelFormatter(trendData[max]) : trendData[max].date;\n\n if (type !== 'tick') {\n var timebar = this.get('timebar');\n timebar.setText(minText, maxText);\n }\n\n if (rangeChange) {\n rangeChange(graph, minText, maxText);\n } else {\n // 自动过滤数据,并渲染 graph\n if (!this.cacheGraphData || this.cacheGraphData.nodes && this.cacheGraphData.nodes.length === 0) {\n this.cacheGraphData = graph.get('data'); // graph.save() as GraphData;\n } // 过滤不在 min 和 max 范围内的节点\n\n\n var filterData = this.cacheGraphData.nodes.filter(function (d) {\n return d.date >= trendData[min].date && d.date <= trendData[max].date;\n });\n var nodeIds_1 = filterData.map(function (node) {\n return node.id;\n });\n var fileterEdges = [];\n\n if (this.cacheGraphData.edges) {\n // 过滤 source 或 target 不在 min 和 max 范围内的边\n fileterEdges = this.cacheGraphData.edges.filter(function (edge) {\n return nodeIds_1.includes(edge.source) && nodeIds_1.includes(edge.target);\n });\n\n if (this.get('filterEdge')) {\n fileterEdges = fileterEdges.filter(function (edge) {\n return edge.date >= trendData[min].date && edge.date <= trendData[max].date;\n });\n }\n }\n\n graph.changeData({\n nodes: filterData,\n edges: fileterEdges\n });\n }\n };\n\n TimeBar.prototype.initEvent = function () {\n var _this = this;\n\n var start = 0;\n var end = 0;\n var type = this._cfgs.type;\n\n if (!type || type === 'trend' || type === 'simple') {\n start = this._cfgs.slider.start;\n end = this._cfgs.slider.end;\n } else if (type === 'tick') {\n start = this._cfgs.tick.start;\n end = this._cfgs.tick.end;\n }\n\n var graph = this.get('graph');\n graph.on('afterrender', function (e) {\n _this.filterData({\n value: [start, end]\n });\n }); // 时间轴的值发生改变的事件\n\n graph.on(VALUE_CHANGE, Object(esm[\"throttle\"])(function (e) {\n _this.filterData(e);\n }, 200, {\n trailing: true,\n leading: true\n }));\n };\n\n TimeBar.prototype.destroy = function () {\n var timebar = this.get('timebar');\n\n if (timebar && timebar.destory) {\n timebar.destory();\n }\n\n _super.prototype.destroy.call(this);\n\n var timeBarContainer = this.get('timeBarContainer');\n\n if (timeBarContainer) {\n var container = this.get('container');\n\n if (!container) {\n container = this.get('graph').get('container');\n }\n\n if (Object(esm[\"isString\"])(container)) {\n container = document.getElementById(container);\n }\n\n container.removeChild(timeBarContainer);\n }\n };\n\n return TimeBar;\n}(es_base);\n\n/* harmony default export */ var timeBar = (timeBar_TimeBar);\n// CONCATENATED MODULE: ./node_modules/@antv/g6-plugin/es/imageMinimap/index.js\nvar imageMinimap_extends = undefined && undefined.__extends || function () {\n var _extendStatics = function extendStatics(d, b) {\n _extendStatics = Object.setPrototypeOf || {\n __proto__: []\n } instanceof Array && function (d, b) {\n d.__proto__ = b;\n } || function (d, b) {\n for (var p in b) {\n if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p];\n }\n };\n\n return _extendStatics(d, b);\n };\n\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null) throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n\n _extendStatics(d, b);\n\n function __() {\n this.constructor = d;\n }\n\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n}();\n\n\n\n\n\n\nvar imageMinimap_applyMatrix = util.applyMatrix;\n\nfunction getImgNaturalDimension(img, callback) {\n var nWidth, nHeight;\n\n if (img.naturalWidth) {\n // 现代浏览器\n nWidth = img.naturalWidth;\n nHeight = img.naturalHeight;\n } else {\n // IE6/7/8\n var image_1 = new Image();\n image_1.src = img.src;\n\n image_1.onload = function () {\n if (callback) callback(image_1.width, image_1.height);\n };\n }\n\n return [nWidth, nHeight];\n}\n\nvar imageMinimap_ImageMiniMap =\n/** @class */\nfunction (_super) {\n imageMinimap_extends(ImageMiniMap, _super);\n\n function ImageMiniMap(config) {\n return _super.call(this, config) || this;\n }\n\n ImageMiniMap.prototype.getDefaultCfgs = function () {\n return {\n container: null,\n className: 'g6-minimap',\n viewportClassName: 'g6-minimap-viewport',\n width: 200,\n delegateStyle: {\n fill: '#40a9ff',\n stroke: '#096dd9'\n },\n refresh: true\n };\n };\n\n ImageMiniMap.prototype.getEvents = function () {\n return {\n beforepaint: 'updateViewport',\n beforeanimate: 'disableRefresh',\n afteranimate: 'enableRefresh',\n viewportchange: 'disableOneRefresh'\n };\n }; // 若是正在进行动画,不刷新缩略图\n\n\n ImageMiniMap.prototype.disableRefresh = function () {\n this.set('refresh', false);\n };\n\n ImageMiniMap.prototype.enableRefresh = function () {\n this.set('refresh', true);\n this.updateCanvas();\n };\n\n ImageMiniMap.prototype.disableOneRefresh = function () {\n this.set('viewportChange', true);\n };\n\n ImageMiniMap.prototype.initViewport = function () {\n var _this = this;\n\n var cfgs = this._cfgs; // cWidth and cHeight are the width and height of the minimap's container\n\n var graph = cfgs.graph;\n if (this.destroyed) return;\n var containerDOM = this.get('container');\n\n if (Object(esm[\"isString\"])(containerDOM)) {\n containerDOM = document.getElementById(containerDOM);\n }\n\n var viewport = createDom(\"
\\n
\"); // 计算拖拽水平方向距离\n\n var x = 0; // 计算拖拽垂直方向距离\n\n var y = 0; // 是否在拖拽minimap的视口\n\n var dragging = false; // 缓存viewport当前对于画布的x\n\n var left = 0; // 缓存viewport当前对于画布的y\n\n var top = 0; // 缓存viewport当前宽度\n\n var width = 0; // 缓存viewport当前高度\n\n var height = 0;\n var ratio = 0;\n var zoom = 0;\n containerDOM.addEventListener('mousedown', function (e) {\n cfgs.refresh = false;\n\n if (e.target !== viewport) {\n return;\n } // 如果视口已经最大了,不需要拖拽\n\n\n var style = viewport.style;\n width = parseInt(style.width, 10);\n height = parseInt(style.height, 10);\n\n var cWidth = _this.get('width');\n\n var cHeight = _this.get('height');\n\n if (width > cWidth || height > cHeight) {\n return;\n }\n\n zoom = graph.getZoom();\n ratio = _this.get('ratio');\n dragging = true;\n x = e.clientX;\n y = e.clientY;\n }, false);\n containerDOM.addEventListener('mousemove', function (e) {\n if (!dragging || Object(esm[\"isNil\"])(e.clientX) || Object(esm[\"isNil\"])(e.clientY)) {\n return;\n }\n\n var cWidth = _this.get('width');\n\n var cHeight = _this.get('height');\n\n var style = viewport.style;\n left = parseInt(style.left, 10);\n top = parseInt(style.top, 10);\n width = parseInt(style.width, 10);\n height = parseInt(style.height, 10);\n var dx = x - e.clientX;\n var dy = y - e.clientY; // 若视口移动到最左边或最右边了,仅移动到边界\n\n if (left - dx < 0) {\n dx = left;\n } else if (left - dx + width >= cWidth) {\n dx = 0;\n } // 若视口移动到最上或最下边了,仅移动到边界\n\n\n if (top - dy < 0) {\n dy = top;\n } else if (top - dy + height >= cHeight) {\n dy = 0;\n }\n\n left -= dx;\n top -= dy; // 先移动视口,避免移动到边上以后出现视口闪烁\n\n modifyCSS(viewport, {\n left: left + \"px\",\n top: top + \"px\"\n }); // graph 移动需要偏移量 dx/dy * 缩放比例才会得到正确的移动距离\n\n graph.translate(dx * zoom / ratio, dy * zoom / ratio);\n x = e.clientX;\n y = e.clientY;\n }, false);\n containerDOM.addEventListener('mouseleave', function () {\n dragging = false;\n cfgs.refresh = true;\n }, false);\n containerDOM.addEventListener('mouseup', function () {\n dragging = false;\n cfgs.refresh = true;\n }, false);\n this.set('viewport', viewport);\n containerDOM.appendChild(viewport);\n };\n /**\n * 更新 viewport 视图\n */\n\n\n ImageMiniMap.prototype.updateViewport = function () {\n if (this.destroyed) return;\n var ratio = this.get('ratio');\n var cWidth = this.get('width');\n var cHeight = this.get('height');\n var graph = this.get('graph');\n var graphWidth = graph.get('width');\n var graphHeight = graph.get('height');\n var aspectRatio = graphWidth / graphHeight;\n var graphGroup = graph.getGroup(); // 主图的 bbox(矩阵变换相关的 bbox)\n\n var graphCanvasBBox = graphGroup.getCanvasBBox(); // 扩展 graphBBox 到和 graphWidth / graphHeight 等比\n\n var graphCanvasBBoxMean = [(graphCanvasBBox.minX + graphCanvasBBox.maxX) / 2, (graphCanvasBBox.minY + graphCanvasBBox.maxY) / 2];\n var graphCanvasBBoxSize = [graphCanvasBBox.maxX - graphCanvasBBox.minX, graphCanvasBBox.maxY - graphCanvasBBox.minY];\n var expandedGraphCanvasBBox = {\n centerX: graphCanvasBBoxMean[0],\n centerY: graphCanvasBBoxMean[1],\n width: 0,\n height: 0,\n minX: 0,\n minY: 0\n };\n\n if (graphCanvasBBox[0] / graphCanvasBBox[1] > aspectRatio) {\n expandedGraphCanvasBBox.width = graphCanvasBBoxSize[0];\n expandedGraphCanvasBBox.height = expandedGraphCanvasBBox.width / aspectRatio;\n } else {\n expandedGraphCanvasBBox.height = graphCanvasBBoxSize[1];\n expandedGraphCanvasBBox.width = expandedGraphCanvasBBox.height * aspectRatio;\n }\n\n expandedGraphCanvasBBox.minX = graphCanvasBBoxMean[0] - expandedGraphCanvasBBox.width / 2;\n expandedGraphCanvasBBox.minY = graphCanvasBBoxMean[1] - expandedGraphCanvasBBox.height / 2;\n var graphMatrix = graphGroup.getMatrix();\n if (!graphMatrix) graphMatrix = [1, 0, 0, 0, 1, 0, 0, 0, 1];\n var invertGraphMatrix = matrix_util_esm[\"mat3\"].invert([1, 0, 0, 0, 1, 0, 0, 0, 1], graphMatrix);\n var minXY = imageMinimap_applyMatrix({\n x: expandedGraphCanvasBBox.minX,\n y: expandedGraphCanvasBBox.minY\n }, invertGraphMatrix); // 扩展 graphBBox 后的 bbox 的左上角对应的 canvas container 坐标\n\n var topLeft = graph.getCanvasByPoint(minXY.x, minXY.y);\n var viewport = this.get('viewport');\n\n if (!viewport) {\n this.initViewport();\n } // Viewport 与 minimap container 的比例 = Graph container 与 expandedGraphBBox 比例\n\n\n var vpToMc = graphWidth / expandedGraphCanvasBBox.width; // viewport 宽高 = vpToMc * minimap container 宽高\n\n var width = vpToMc * cWidth;\n var height = vpToMc * cHeight; // vierport 左上角到 minimap container 的距离 / minimap container 宽高\n // = 主图 expandedBBox 左上角 canvas container 坐标距离 / expandedBBox 宽高\n\n var left = cWidth * -topLeft.x / expandedGraphCanvasBBox.width;\n var top = cHeight * -topLeft.y / expandedGraphCanvasBBox.height;\n var right = left + width;\n var bottom = top + height;\n\n if (left < 0) {\n width += left;\n left = 0;\n }\n\n if (right > cWidth) {\n width = width - (right - cWidth);\n }\n\n if (top < 0) {\n height += top;\n top = 0;\n }\n\n if (bottom > cHeight) {\n height = height - (bottom - cHeight);\n } // 缓存目前缩放比,在移动 minimap 视窗时就不用再计算大图的移动量\n\n\n this.set('ratio', ratio);\n var correctLeft = left + \"px\";\n var correctTop = top + \"px\";\n modifyCSS(viewport, {\n left: correctLeft,\n top: correctTop,\n width: width + \"px\",\n height: height + \"px\"\n });\n };\n\n ImageMiniMap.prototype.init = function () {\n this.initContainer();\n };\n /**\n * 初始化 Minimap 的容器\n */\n\n\n ImageMiniMap.prototype.initContainer = function () {\n var self = this;\n var graph = self.get('graph');\n var graphWidth = graph.get('width');\n var graphHeight = graph.get('height');\n var aspectRatio = graphHeight / graphWidth;\n var className = self.get('className');\n var parentNode = self.get('container'); // size of the minimap's container\n\n var cWidth = self.get('width');\n var cHeight = self.get('height');\n\n if (!cWidth && !cHeight) {\n cWidth = 200;\n }\n\n if (cWidth) {\n cHeight = aspectRatio * cWidth;\n self.set('height', cHeight);\n } else {\n cWidth = 1 / aspectRatio * cHeight;\n self.set('width', cWidth);\n }\n\n var container = createDom(\"
\");\n\n if (Object(esm[\"isString\"])(parentNode)) {\n parentNode = document.getElementById(parentNode);\n }\n\n if (parentNode) {\n parentNode.appendChild(container);\n } else {\n graph.get('container').appendChild(container);\n }\n\n self.set('container', container);\n var containerDOM = createDom(\"
\");\n container.appendChild(containerDOM);\n var span = createDom(\"\");\n containerDOM.appendChild(span);\n self.set('containerDOM', containerDOM);\n self.set('containerSpan', span);\n var img = createDom(\"\\\"\\\"\");\n self.set('imgDOM', img);\n self.updateImgSize();\n span.appendChild(img);\n self.updateCanvas();\n };\n\n ImageMiniMap.prototype.updateImgSize = function () {\n var self = this;\n var imgDOM = self.get('imgDOM');\n var cWidth = self.get('width');\n var cHeight = self.get('height');\n\n imgDOM.onload = function () {\n var naturalSize = getImgNaturalDimension(imgDOM);\n\n if (naturalSize[0] > naturalSize[1]) {\n imgDOM.width = cWidth;\n } else {\n imgDOM.height = cHeight;\n }\n };\n };\n\n ImageMiniMap.prototype.updateCanvas = function () {\n // 如果是在动画,则不刷新视图\n var isRefresh = this.get('refresh');\n\n if (!isRefresh) {\n return;\n }\n\n var graph = this.get('graph');\n\n if (graph.get('destroyed')) {\n return;\n } // 如果是视口变换,也不刷新视图,但是需要重置视口大小和位置\n\n\n if (this.get('viewportChange')) {\n this.set('viewportChange', false);\n this.updateViewport();\n }\n\n var cWidth = this.get('width');\n var graphBBox = graph.get('canvas').getCanvasBBox();\n var width = graphBBox.width;\n var ratio = cWidth / width; // // 更新minimap视口\n\n this.set('ratio', ratio);\n this.updateViewport();\n };\n /**\n * 获取minimap的窗口\n * @return {HTMLElement} 窗口的dom实例\n */\n\n\n ImageMiniMap.prototype.getViewport = function () {\n return this.get('viewport');\n };\n /**\n * 获取minimap的容器dom\n * @return {HTMLElement} dom\n */\n\n\n ImageMiniMap.prototype.getContainer = function () {\n return this.get('container');\n };\n\n ImageMiniMap.prototype.updateGraphImg = function (img) {\n var self = this;\n var oriImgDOM = self.get('imgDOM');\n oriImgDOM.remove();\n self.set('graphImg', img);\n var imgDOM = createDom(\"\\\"\\\"\");\n self.set('imgDOM', imgDOM);\n imgDOM.src = img;\n self.updateImgSize();\n var span = self.get('containerSpan');\n span.appendChild(imgDOM);\n self.updateCanvas();\n };\n\n ImageMiniMap.prototype.destroy = function () {\n var container = this.get('container');\n container.parentNode.removeChild(container);\n };\n\n return ImageMiniMap;\n}(es_base);\n\n/* harmony default export */ var imageMinimap = (imageMinimap_ImageMiniMap);\n// CONCATENATED MODULE: ./node_modules/@antv/g6-plugin/es/edgeFilterLens/index.js\nvar edgeFilterLens_extends = undefined && undefined.__extends || function () {\n var _extendStatics = function extendStatics(d, b) {\n _extendStatics = Object.setPrototypeOf || {\n __proto__: []\n } instanceof Array && function (d, b) {\n d.__proto__ = b;\n } || function (d, b) {\n for (var p in b) {\n if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p];\n }\n };\n\n return _extendStatics(d, b);\n };\n\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null) throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n\n _extendStatics(d, b);\n\n function __() {\n this.constructor = d;\n }\n\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n}();\n\nvar edgeFilterLens_assign = undefined && undefined.__assign || function () {\n edgeFilterLens_assign = Object.assign || function (t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n\n for (var p in s) {\n if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n }\n\n return t;\n };\n\n return edgeFilterLens_assign.apply(this, arguments);\n};\n\n\n\n\nvar edgeFilterLens_distance = util.distance;\nvar edgeFilterLens_DELTA = 0.05;\nvar edgeFilterLens_lensDelegateStyle = {\n stroke: '#000',\n strokeOpacity: 0.8,\n lineWidth: 2,\n fillOpacity: 1,\n fill: '#fff'\n};\n\nvar edgeFilterLens_EdgeFilterLens =\n/** @class */\nfunction (_super) {\n edgeFilterLens_extends(EdgeFilterLens, _super);\n\n function EdgeFilterLens(config) {\n return _super.call(this, config) || this;\n }\n\n EdgeFilterLens.prototype.getDefaultCfgs = function () {\n return {\n type: 'both',\n trigger: 'mousemove',\n r: 60,\n delegateStyle: Object(esm[\"clone\"])(edgeFilterLens_lensDelegateStyle),\n showLabel: 'edge',\n scaleRBy: 'wheel'\n };\n }; // class-methods-use-this\n\n\n EdgeFilterLens.prototype.getEvents = function () {\n var events;\n\n switch (this.get('trigger')) {\n case 'click':\n events = {\n click: 'filter'\n };\n break;\n\n case 'drag':\n events = {\n click: 'createDelegate'\n };\n break;\n\n default:\n events = {\n mousemove: 'filter'\n };\n break;\n }\n\n return events;\n };\n\n EdgeFilterLens.prototype.init = function () {\n var self = this;\n var showLabel = self.get('showLabel');\n var showNodeLabel = showLabel === 'node' || showLabel === 'both';\n var showEdgeLabel = showLabel === 'edge' || showLabel === 'both';\n self.set('showNodeLabel', showNodeLabel);\n self.set('showEdgeLabel', showEdgeLabel);\n var shouldShow = self.get('shouldShow');\n if (!shouldShow) self.set('shouldShow', function () {\n return true;\n });\n }; // Create the delegate when the trigger is drag\n\n\n EdgeFilterLens.prototype.createDelegate = function (e) {\n var self = this;\n var lensDelegate = self.get('delegate');\n\n if (!lensDelegate || lensDelegate.destroyed) {\n self.filter(e);\n lensDelegate = self.get('delegate'); // drag to move the lens\n\n lensDelegate.on('dragstart', function (evt) {});\n lensDelegate.on('drag', function (evt) {\n self.filter(evt);\n }); // 绑定调整范围(r)\n // 由于 drag 用于改变 lens 位置,因此在此模式下,drag 不能用于调整 r\n // scaling r\n\n if (this.get('scaleRBy') === 'wheel') {\n lensDelegate.on('mousewheel', function (evt) {\n self.scaleRByWheel(evt);\n });\n }\n }\n };\n /**\n * Scale the range by wheel\n * @param e mouse wheel event\n */\n\n\n EdgeFilterLens.prototype.scaleRByWheel = function (e) {\n var self = this;\n if (!e || !e.originalEvent) return;\n if (e.preventDefault) e.preventDefault();\n var graph = self.get('graph');\n var ratio;\n var lensDelegate = self.get('delegate');\n var lensCenter = lensDelegate ? {\n x: lensDelegate.attr('x'),\n y: lensDelegate.attr('y')\n } : undefined;\n var mousePos = lensCenter || graph.getPointByClient(e.clientX, e.clientY);\n\n if (e.originalEvent.wheelDelta < 0) {\n ratio = 1 - edgeFilterLens_DELTA;\n } else {\n ratio = 1 / (1 - edgeFilterLens_DELTA);\n }\n\n var maxR = self.get('maxR');\n var minR = self.get('minR');\n var r = self.get('r');\n\n if (r > (maxR || graph.get('height')) && ratio > 1 || r < (minR || graph.get('height') * 0.05) && ratio < 1) {\n ratio = 1;\n }\n\n r *= ratio;\n self.set('r', r);\n self.filter(e);\n };\n /**\n * Response function for mousemove, click, or drag to filter out the edges\n * @param e mouse event\n */\n\n\n EdgeFilterLens.prototype.filter = function (e) {\n var self = this;\n var graph = self.get('graph');\n var nodes = graph.getNodes();\n var hitNodesMap = {};\n var r = self.get('r');\n var type = self.get('type');\n var fCenter = {\n x: e.x,\n y: e.y\n };\n self.updateDelegate(fCenter, r);\n var shouldShow = self.get('shouldShow');\n var vShapes = self.get('vShapes');\n\n if (vShapes) {\n vShapes.forEach(function (shape) {\n shape.remove();\n shape.destroy();\n });\n }\n\n vShapes = [];\n nodes.forEach(function (node) {\n var model = node.getModel();\n var x = model.x,\n y = model.y;\n\n if (edgeFilterLens_distance({\n x: x,\n y: y\n }, fCenter) < r) {\n hitNodesMap[model.id] = node;\n }\n });\n var edges = graph.getEdges();\n var hitEdges = [];\n edges.forEach(function (edge) {\n var model = edge.getModel();\n var sourceId = model.source;\n var targetId = model.target;\n\n if (shouldShow(model)) {\n if (type === 'only-source' || type === 'one') {\n if (hitNodesMap[sourceId] && !hitNodesMap[targetId]) hitEdges.push(edge);\n } else if (type === 'only-target' || type === 'one') {\n if (hitNodesMap[targetId] && !hitNodesMap[sourceId]) hitEdges.push(edge);\n } else if (type === 'both' && hitNodesMap[sourceId] && hitNodesMap[targetId]) {\n hitEdges.push(edge);\n }\n }\n });\n var showNodeLabel = self.get('showNodeLabel');\n var showEdgeLabel = self.get('showEdgelabel'); // copy the shapes in hitEdges\n\n var group = graph.get('group');\n hitEdges.forEach(function (edge) {\n var shapes = edge.get('group').get('children');\n shapes.forEach(function (shape) {\n var shapeType = shape.get('type');\n var vShape = group.addShape(shapeType, {\n attrs: shape.attr()\n });\n vShapes.push(vShape);\n\n if (showNodeLabel && shapeType === 'text') {\n vShape.set('visible', true);\n }\n });\n }); // copy the shape sof hitNodes\n\n Object.keys(hitNodesMap).forEach(function (key) {\n var node = hitNodesMap[key];\n var clonedGroup = node.get('group').clone();\n group.add(clonedGroup);\n vShapes.push(clonedGroup);\n\n if (showEdgeLabel) {\n var shapes = clonedGroup.get('children');\n\n for (var j = 0; j < shapes.length; j++) {\n var shape = shapes[j];\n\n if (shape.get('type') === 'text') {\n shape.set('visible', true);\n }\n }\n }\n });\n self.set('vShapes', vShapes);\n };\n /**\n * Adjust part of the parameters, including trigger, type, r, maxR, minR, shouldShow, showLabel, and scaleRBy\n * @param {EdgeFilterLensConfig} cfg\n */\n\n\n EdgeFilterLens.prototype.updateParams = function (cfg) {\n var self = this;\n var r = cfg.r,\n trigger = cfg.trigger,\n minR = cfg.minR,\n maxR = cfg.maxR,\n scaleRBy = cfg.scaleRBy,\n showLabel = cfg.showLabel,\n shouldShow = cfg.shouldShow;\n\n if (!isNaN(cfg.r)) {\n self.set('r', r);\n }\n\n if (!isNaN(maxR)) {\n self.set('maxR', maxR);\n }\n\n if (!isNaN(minR)) {\n self.set('minR', minR);\n }\n\n if (trigger === 'mousemove' || trigger === 'click') {\n self.set('trigger', trigger);\n }\n\n if (scaleRBy === 'wheel' || scaleRBy === 'unset') {\n self.set('scaleRBy', scaleRBy);\n self.get('delegate').remove();\n self.get('delegate').destroy();\n var dPercentText = self.get('dPercentText');\n\n if (dPercentText) {\n dPercentText.remove();\n dPercentText.destroy();\n }\n }\n\n if (showLabel === 'node' || showLabel === 'both') {\n self.set('showNodeLabel', true);\n }\n\n if (showLabel === 'edge' || showLabel === 'both') {\n self.set('showEdgeLabel', true);\n }\n\n if (shouldShow) {\n self.set('shouldShow', shouldShow);\n }\n };\n /**\n * Update the delegate shape of the lens\n * @param {Point} mCenter the center of the shape\n * @param {number} r the radius of the shape\n */\n\n\n EdgeFilterLens.prototype.updateDelegate = function (mCenter, r) {\n var self = this;\n var graph = self.get('graph');\n var lensDelegate = self.get('delegate');\n\n if (!lensDelegate || lensDelegate.destroyed) {\n // 拖动多个\n var parent_1 = graph.get('group');\n var attrs = self.get('delegateStyle') || edgeFilterLens_lensDelegateStyle; // model上的x, y是相对于图形中心的,delegateShape是g实例,x,y是绝对坐标\n\n lensDelegate = parent_1.addShape('circle', {\n attrs: edgeFilterLens_assign({\n r: r,\n x: mCenter.x,\n y: mCenter.y\n }, attrs),\n name: 'lens-shape',\n draggable: true\n });\n\n if (this.get('trigger') !== 'drag') {\n // 调整范围 r 的监听\n if (this.get('scaleRBy') === 'wheel') {\n // 使用滚轮调整 r\n lensDelegate.on('mousewheel', function (evt) {\n self.scaleRByWheel(evt);\n });\n }\n }\n } else {\n lensDelegate.attr({\n x: mCenter.x,\n y: mCenter.y,\n r: r\n });\n }\n\n self.set('delegate', lensDelegate);\n };\n /**\n * Clear the filtering\n */\n\n\n EdgeFilterLens.prototype.clear = function () {\n var self = this;\n var vShapes = self.get('vShapes');\n\n if (vShapes) {\n vShapes.forEach(function (shape) {\n shape.remove();\n shape.destroy();\n });\n }\n\n vShapes = [];\n self.set('vShapes', vShapes);\n var lensDelegate = self.get('delegate');\n\n if (lensDelegate && !lensDelegate.destroyed) {\n lensDelegate.remove();\n lensDelegate.destroy();\n }\n };\n /**\n * Destroy the component\n */\n\n\n EdgeFilterLens.prototype.destroy = function () {\n this.clear();\n };\n\n return EdgeFilterLens;\n}(es_base);\n\n/* harmony default export */ var edgeFilterLens = (edgeFilterLens_EdgeFilterLens);\n// CONCATENATED MODULE: ./node_modules/@antv/g6-plugin/es/snapline/index.js\nvar snapline_extends = undefined && undefined.__extends || function () {\n var _extendStatics = function extendStatics(d, b) {\n _extendStatics = Object.setPrototypeOf || {\n __proto__: []\n } instanceof Array && function (d, b) {\n d.__proto__ = b;\n } || function (d, b) {\n for (var p in b) {\n if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p];\n }\n };\n\n return _extendStatics(d, b);\n };\n\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null) throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n\n _extendStatics(d, b);\n\n function __() {\n this.constructor = d;\n }\n\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n}();\n\n\n\n\nvar snapline_pointLineDistance = util.pointLineDistance; // 对齐线样式\n\nvar alignLineStyle = {\n stroke: '#FA8C16',\n lineWidth: 1\n};\n\nvar snapline_SnapLine =\n/** @class */\nfunction (_super) {\n snapline_extends(SnapLine, _super);\n\n function SnapLine(props) {\n return _super.call(this, props) || this;\n }\n\n SnapLine.prototype.getDefaultCfgs = function () {\n return {\n line: alignLineStyle,\n\n /**\n * item align type\n * @type {String|True|False}\n */\n itemAlignType: 'center',\n\n /**\n * tolerance to item force align\n * @type {String|True|False}\n */\n tolerance: 5,\n horizontalLines: {},\n verticalLines: {},\n alignLines: []\n };\n };\n\n SnapLine.prototype.init = function () {}; // class-methods-use-this\n\n\n SnapLine.prototype.getEvents = function () {\n return {\n 'node:dragstart': 'onDragStart',\n 'node:drag': 'onDrag',\n 'node:dragend': 'onDragEnd'\n };\n };\n\n SnapLine.prototype.onDragStart = function () {\n this.initBoxLine();\n };\n\n SnapLine.prototype.onDrag = function (e) {\n var item = e.item; // 计算辅助线位置,拖动过程中更新辅助线\n\n var delegateShape = item.get('delegateShape') || item;\n var bbox = delegateShape.getBBox();\n var model = item.getModel();\n var dx = model.x - bbox.x;\n var dy = model.y - bbox.y;\n this.show({\n x: bbox.minX + dx,\n y: bbox.minY + dy\n }, {\n width: bbox.width,\n height: bbox.height\n });\n };\n\n SnapLine.prototype.onDragEnd = function () {\n // 拖动结束时候删除辅助线\n this.destory();\n };\n /**\n * 每次开始拖动之前,计算出所有节点在水平和垂直方向上,左中右三条中线,并缓存起来\n *\n * @param {object} item Node节点\n * @memberof AlignLine\n */\n\n\n SnapLine.prototype.initBoxLine = function () {\n var _a = this._cfgs,\n horizontalLines = _a.horizontalLines,\n verticalLines = _a.verticalLines,\n itemAlignType = _a.itemAlignType;\n var graph = this.get('graph');\n var nodes = graph.getNodes();\n nodes.forEach(function (item) {\n var bbox = item.getBBox();\n var nodeId = item.get('id'); // 设置水平方向辅助线\n\n if (itemAlignType === true || itemAlignType === 'horizontal') {\n // tltr: top left top right\n // lcrc: left center right center\n // blbr: bottom left bottom right\n horizontalLines[nodeId + \"tltr\"] = [bbox.minX, bbox.minY, bbox.maxX, bbox.minY, item];\n horizontalLines[nodeId + \"lcrc\"] = [bbox.minX, bbox.centerY, bbox.maxX, bbox.centerY, item];\n horizontalLines[nodeId + \"blbr\"] = [bbox.minX, bbox.maxY, bbox.maxX, bbox.maxY, item];\n } else if (itemAlignType === 'center') {\n horizontalLines[nodeId + \"lcrc\"] = [bbox.minX, bbox.centerY, bbox.maxX, bbox.centerY, item];\n } // 设置垂直方向辅助线\n\n\n if (itemAlignType === true || itemAlignType === 'vertical') {\n // tlbl: top left bottom left\n // tcbc: top center bottom center\n // trbr: top right bottom right\n verticalLines[nodeId + \"tlbl\"] = [bbox.minX, bbox.minY, bbox.minX, bbox.maxY, item];\n verticalLines[nodeId + \"tcbc\"] = [bbox.centerX, bbox.minY, bbox.centerX, bbox.maxY, item];\n verticalLines[nodeId + \"trbr\"] = [bbox.maxX, bbox.minY, bbox.maxX, bbox.maxY, item];\n } else if (itemAlignType === 'center') {\n verticalLines[nodeId + \"tcbc\"] = [bbox.centerX, bbox.minY, bbox.centerX, bbox.maxY, item];\n }\n });\n };\n /**\n * 显示AlignLine\n *\n * @param {object} point 起始点\n * @param {object} bbox BBox\n * @returns\n * @memberof AlignLine\n */\n\n\n SnapLine.prototype.show = function (point, bbox) {\n var originPoint = Object(esm[\"mix\"])({}, point);\n this.itemAlign(point, bbox, originPoint);\n return point;\n };\n /**\n * 拖动拖出中添加辅助线\n *\n * @param {object} point 起始点\n * @param {object} bbox 代理形状的bbox\n * @param {object} originPoint 原始点,同point\n * @memberof AlignLine\n */\n\n\n SnapLine.prototype.itemAlign = function (point, bbox, originPoint) {\n var _this = this;\n\n var _a = this._cfgs,\n horizontalLines = _a.horizontalLines,\n verticalLines = _a.verticalLines,\n tolerance = _a.tolerance;\n var tc = {\n x: originPoint.x + bbox.width / 2,\n y: originPoint.y\n };\n var cc = {\n x: originPoint.x + bbox.width / 2,\n y: originPoint.y + bbox.height / 2\n };\n var bc = {\n x: originPoint.x + bbox.width / 2,\n y: originPoint.y + bbox.height\n };\n var lc = {\n x: originPoint.x,\n y: originPoint.y + bbox.height / 2\n };\n var rc = {\n x: originPoint.x + bbox.width,\n y: originPoint.y + bbox.height / 2\n };\n var horizontalDis = [];\n var verticalDis = [];\n var alignCfg = null;\n this.clearAlignLine();\n Object(esm[\"each\"])(horizontalLines, function (line) {\n if (line[4].isVisible) {\n horizontalDis.push(_this.getLineDisObject(line, tc));\n horizontalDis.push(_this.getLineDisObject(line, cc));\n horizontalDis.push(_this.getLineDisObject(line, bc));\n }\n });\n Object(esm[\"each\"])(verticalLines, function (line) {\n if (line[4].isVisible) {\n verticalDis.push(_this.getLineDisObject(line, lc));\n verticalDis.push(_this.getLineDisObject(line, cc));\n verticalDis.push(_this.getLineDisObject(line, rc));\n }\n });\n horizontalDis.sort(function (a, b) {\n return a.dis - b.dis;\n });\n verticalDis.sort(function (a, b) {\n return a.dis - b.dis;\n });\n\n if (horizontalDis.length !== 0 && horizontalDis[0].dis < tolerance) {\n point.y = horizontalDis[0].line[1] - horizontalDis[0].point.y + originPoint.y;\n alignCfg = {\n type: 'item',\n horizontals: [horizontalDis[0]]\n };\n\n for (var i = 1; i < 3; i++) {\n if (horizontalDis[0].dis === horizontalDis[i].dis) {\n alignCfg.horizontals.push(horizontalDis[i]);\n }\n }\n }\n\n if (verticalDis.length !== 0 && verticalDis[0].dis < tolerance) {\n point.x = verticalDis[0].line[0] - verticalDis[0].point.x + originPoint.x;\n\n if (!alignCfg) {\n alignCfg = {\n type: 'item',\n verticals: [verticalDis[0]]\n };\n } else {\n alignCfg.verticals = [verticalDis[0]];\n }\n\n for (var i = 1; i < 3; i++) {\n if (verticalDis[0].dis === verticalDis[i].dis) {\n alignCfg.verticals.push(verticalDis[i]);\n }\n }\n }\n\n if (alignCfg) {\n alignCfg.bbox = bbox;\n this.addAlignLine(alignCfg);\n }\n };\n /**\n * 根据配置项添加辅助线\n *\n * @param {object} cfg\n * @memberof AlignLine\n */\n\n\n SnapLine.prototype.addAlignLine = function (cfg) {\n var bbox = cfg.bbox,\n type = cfg.type,\n horizontals = cfg.horizontals,\n verticals = cfg.verticals;\n var _a = this._cfgs,\n lineStyle = _a.line,\n alignLines = _a.alignLines;\n var graph = this.get('graph');\n var group = graph.get('group');\n\n if (type === 'item') {\n if (horizontals) {\n Object(esm[\"each\"])(horizontals, function (horizontal) {\n var refLine = horizontal.line,\n refPoint = horizontal.point;\n var lineCenterX = (refLine[0] + refLine[2]) / 2;\n var x1;\n var x2;\n\n if (refPoint.x < lineCenterX) {\n x1 = refPoint.x - bbox.width / 2;\n x2 = Math.max(refLine[0], refLine[2]);\n } else {\n x1 = refPoint.x + bbox.width / 2;\n x2 = Math.min(refLine[0], refLine[2]);\n }\n\n var lineAttrs = Object(esm[\"mix\"])({\n x1: x1,\n y1: refLine[1],\n x2: x2,\n y2: refLine[1]\n }, lineStyle);\n var line = group.addShape('line', {\n attrs: lineAttrs,\n capture: false\n });\n alignLines.push(line);\n });\n }\n\n if (verticals) {\n Object(esm[\"each\"])(verticals, function (vertical) {\n var refLine = vertical.line,\n refPoint = vertical.point;\n var lineCenterY = (refLine[1] + refLine[3]) / 2;\n var y1;\n var y2;\n\n if (refPoint.y < lineCenterY) {\n y1 = refPoint.y - bbox.height / 2;\n y2 = Math.max(refLine[1], refLine[3]);\n } else {\n y1 = refPoint.y + bbox.height / 2;\n y2 = Math.min(refLine[1], refLine[3]);\n }\n\n var lineAtts = Object(esm[\"mix\"])({\n x1: refLine[0],\n y1: y1,\n x2: refLine[0],\n y2: y2\n }, lineStyle);\n var line = group.addShape('line', {\n attrs: lineAtts,\n capture: false\n });\n alignLines.push(line);\n });\n }\n }\n };\n /**\n * 获取点到线的距离\n *\n * @param {array} line [x1, y1, x2, y2] 线的四个点\n * @param {object} point 点的x和y坐标点 {x, y}\n * @returns\n * @memberof AlignLine\n */\n\n\n SnapLine.prototype.getLineDisObject = function (line, point) {\n return {\n line: line,\n point: point,\n dis: snapline_pointLineDistance(line, point)\n };\n };\n\n SnapLine.prototype.getContainer = function () {\n return this.get('container');\n };\n /**\n * 拖动过程中,清楚上次绘制的线\n *\n * @memberof AlignLine\n */\n\n\n SnapLine.prototype.clearAlignLine = function () {\n var alignLines = this._cfgs.alignLines;\n Object(esm[\"each\"])(alignLines, function (line) {\n line.remove();\n });\n alignLines.length = 0;\n };\n /**\n * 拖动结束时候,情况缓存的节点的辅助线,同时删除绘制的线\n *\n * @memberof AlignLine\n */\n\n\n SnapLine.prototype.destory = function () {\n var _a = this._cfgs,\n horizontalLines = _a.horizontalLines,\n verticalLines = _a.verticalLines;\n var graph = this.get('graph');\n var nodes = graph.getNodes();\n nodes.forEach(function (node) {\n var itemId = node.get('id');\n delete horizontalLines[itemId + \"tltr\"];\n delete horizontalLines[itemId + \"lcrc\"];\n delete horizontalLines[itemId + \"blbr\"];\n delete verticalLines[itemId + \"tlbl\"];\n delete verticalLines[itemId + \"tcbc\"];\n delete verticalLines[itemId + \"trbr\"];\n });\n this.clearAlignLine();\n };\n\n return SnapLine;\n}(es_base);\n\n/* harmony default export */ var snapline = (snapline_SnapLine);\n// CONCATENATED MODULE: ./node_modules/@antv/g6-plugin/es/legend/index.js\nvar legend_extends = undefined && undefined.__extends || function () {\n var _extendStatics = function extendStatics(d, b) {\n _extendStatics = Object.setPrototypeOf || {\n __proto__: []\n } instanceof Array && function (d, b) {\n d.__proto__ = b;\n } || function (d, b) {\n for (var p in b) {\n if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p];\n }\n };\n\n return _extendStatics(d, b);\n };\n\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null) throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n\n _extendStatics(d, b);\n\n function __() {\n this.constructor = d;\n }\n\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n}();\n\nvar legend_assign = undefined && undefined.__assign || function () {\n legend_assign = Object.assign || function (t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n\n for (var p in s) {\n if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n }\n\n return t;\n };\n\n return legend_assign.apply(this, arguments);\n};\n\n\n\n\n\n\nvar ALLOW_EVENTS = ['click', 'mouseenter'];\n\nvar legend_Legend =\n/** @class */\nfunction (_super) {\n legend_extends(Legend, _super);\n\n function Legend(config) {\n return _super.call(this, config) || this;\n }\n\n Legend.prototype.getDefaultCfgs = function () {\n return {\n data: {},\n position: 'top',\n padding: 8,\n margin: 8,\n offsetX: 0,\n offsetY: 0,\n layout: 'horizontal',\n flipPage: false,\n containerStyle: {},\n align: undefined,\n horiSep: 8,\n vertiSep: 8,\n filter: {\n enable: false,\n trigger: 'click'\n }\n };\n };\n\n Legend.prototype.init = function () {\n this.formatArray('padding');\n this.formatArray('margin');\n var filter = this.get('filter') || {};\n var multiple = filter.multiple;\n if (multiple && filter.trigger === 'mouseenter') this.set('multiple', false);\n var align = this.get('align');\n\n if (!align) {\n var positions = this.get('position').split('-');\n if (positions.includes('left')) align = 'left';\n if (positions.includes('right')) align = 'right';else align = 'center';\n this.set('align', align);\n }\n\n var graph = this.get('graph');\n var graphContainer = graph.get('container');\n var container = createDom(\"
\");\n graphContainer.appendChild(container);\n this.set('container', container);\n var size = this.render();\n modifyCSS(container, this.getContainerPos(size));\n this.bindEvents();\n };\n\n Legend.prototype.getContainerPos = function (size) {\n if (size === void 0) {\n size = [0, 0];\n }\n\n var self = this;\n var graph = self.get('graph');\n var offsetX = this.get('offsetX');\n var offsetY = this.get('offsetY');\n var margin = this.get('margin');\n var positions = this.get('position').split('-');\n var posIdxMap = {\n 'top': 0,\n 'right': 1,\n 'bottom': 2,\n 'left': 3\n };\n var x = 0,\n y = 0;\n var containerCSS = {\n left: (graph.getWidth() - size[0]) / 2 + x,\n top: (graph.getHeight() - size[1]) / 2 + y\n };\n positions.forEach(function (pos) {\n var marginValue = margin[posIdxMap[pos]];\n var key = pos;\n\n switch (pos) {\n case 'top':\n marginValue += y;\n break;\n\n case 'left':\n marginValue += x;\n break;\n\n case 'bottom':\n marginValue = graph.getHeight() - size[1] - marginValue + y;\n key = 'top';\n break;\n\n default:\n marginValue = graph.getWidth() - size[0] - marginValue + x;\n key = 'left';\n break;\n }\n\n containerCSS[key] = marginValue;\n });\n containerCSS.top += offsetY + graph.getContainer().offsetTop;\n containerCSS.left += offsetX + graph.getContainer().offsetLeft;\n Object.keys(containerCSS).forEach(function (key) {\n containerCSS[key] = containerCSS[key] + \"px\";\n });\n return containerCSS;\n }; // class-methods-use-this\n\n\n Legend.prototype.bindEvents = function () {\n var self = this;\n var filter = self.get('filter');\n if (!filter || !filter.enable) return;\n var trigger = filter.trigger || 'click';\n\n if (!ALLOW_EVENTS.includes(trigger)) {\n console.warn('Trigger for legend filterling must be \\'click\\' or \\'mouseenter\\', \\'click\\' will take effect by default.');\n trigger = 'click';\n }\n\n var lc = self.get('legendCanvas');\n\n if (trigger === 'mouseenter') {\n lc.on('node-container:mouseenter', function (e) {\n return self.filterData(e);\n });\n lc.on('node-container:mouseleave', function (e) {\n self.clearFilter();\n self.clearActiveLegend();\n });\n } else {\n lc.on('node-container:click', function (e) {\n return self.filterData(e);\n });\n lc.on('click', function (e) {\n if (e.target && e.target.isCanvas && e.target.isCanvas()) {\n self.clearFilter();\n self.clearActiveLegend();\n }\n });\n }\n };\n /**\n * 更新 legend 数据,开放给用户控制\n * @param param\n */\n\n\n Legend.prototype.changeData = function (data) {\n this.set('data', data);\n var size = this.render();\n modifyCSS(this.get('container'), this.getContainerPos(size));\n };\n\n Legend.prototype.activateLegend = function (shape) {\n var filter = this.get('filter');\n var multiple = filter === null || filter === void 0 ? void 0 : filter.multiple;\n if (!multiple) this.clearActiveLegend();\n var shapeGroup = shape.get('parent'); // 若被高亮元素已经处于 active 状态,则取消它的 active 状态\n // 并根据目前是否有其他 active 状态的元素决定是否要设置为 inactive 状态\n\n if (shapeGroup.get('active')) {\n shapeGroup.set('active', false);\n if (this.findLegendItemsByState('active').length) shapeGroup.set('inactive', true);\n } else {\n shapeGroup.set('inactive', false);\n shapeGroup.set('active', true);\n } // 当目前有元素为 active 状态时,将非 active 的元素设置为 inactive\n\n\n if (this.findLegendItemsByState('active').length) {\n this.findLegendItemsByState('active', 'all', false).forEach(function (subGroup) {\n subGroup.set('inactive', true);\n });\n } else {\n this.clearActiveLegend();\n } // 设置样式\n\n\n var stateStyles = (filter === null || filter === void 0 ? void 0 : filter.lengedStateStyles) || {};\n var legendInactive = (stateStyles === null || stateStyles === void 0 ? void 0 : stateStyles.inactive) || {\n opacity: 0.5,\n 'text-shape': {\n opacity: 0.5\n }\n };\n var legendTextInactive = legendInactive['text-shape'] || {};\n this.findLegendItemsByState('inactive').forEach(function (subGroup) {\n var _a = subGroup.get('children'),\n keyShape = _a[0],\n text = _a[1];\n\n keyShape.attr(legend_assign(legend_assign({}, keyShape.get('oriAttrs')), legendInactive));\n text.attr(legend_assign(legend_assign({}, text.get('oriAttrs')), legendTextInactive));\n });\n var legendActive = (stateStyles === null || stateStyles === void 0 ? void 0 : stateStyles.active) || {\n stroke: '#000',\n lineWidth: 2,\n 'text-shape': {\n fontWeight: 'bold'\n }\n };\n var legendTextActive = legendActive['text-shape'] || {};\n this.findLegendItemsByState('active').forEach(function (subGroup) {\n var _a = subGroup.get('children'),\n keyShape = _a[0],\n text = _a[1];\n\n keyShape.attr(legend_assign(legend_assign({}, keyShape.get('oriAttrs')), legendActive));\n text.attr(legend_assign(legend_assign({}, text.get('oriAttrs')), legendTextActive));\n });\n };\n\n Legend.prototype.findLegendItemsByState = function (stateName, type, value) {\n if (type === void 0) {\n type = 'all';\n }\n\n if (value === void 0) {\n value = true;\n }\n\n var group = this.get('legendCanvas').find(function (e) {\n return e.get('name') === 'root';\n });\n var nodeGroup = group.find(function (e) {\n return e.get('name') === 'node-group';\n });\n var edgeGroup = group.find(function (e) {\n return e.get('name') === 'edge-group';\n });\n if (type === 'node') return nodeGroup.get('children').filter(function (g) {\n return !!g.get(stateName) === value;\n });\n if (type === 'edge') return edgeGroup.get('children').filter(function (g) {\n return !!g.get(stateName) === value;\n });\n return nodeGroup.get('children').filter(function (g) {\n return !!g.get(stateName) === value;\n }).concat(edgeGroup.get('children').filter(function (g) {\n return !!g.get(stateName) === value;\n }));\n };\n\n Legend.prototype.clearActiveLegend = function () {\n var lg = this.get('legendCanvas');\n var group = lg.find(function (e) {\n return e.get('name') === 'root';\n });\n var groups = [group.find(function (e) {\n return e.get('name') === 'node-group';\n }), group.find(function (e) {\n return e.get('name') === 'edge-group';\n })];\n groups.forEach(function (itemGroup) {\n itemGroup.get('children').forEach(function (subGroup) {\n subGroup.set('active', false);\n subGroup.set('inactive', false);\n\n var _a = subGroup.get('children'),\n keyShape = _a[0],\n text = _a[1];\n\n keyShape.attr(keyShape.get('oriAttrs'));\n text.attr(text.get('oriAttrs'));\n });\n });\n };\n /**\n * 高亮和置灰图例,并过滤主图元素\n * @param param\n */\n\n\n Legend.prototype.filterData = function (e) {\n var filter = this.get('filter');\n var filterFunctions = filter === null || filter === void 0 ? void 0 : filter.filterFunctions;\n if (!filter || !filterFunctions) return;\n var lc = this.get('legendCanvas');\n var graph = this.get('graph');\n var activeState = filter.graphActiveState || 'active';\n var inactiveState = filter.graphInactiveState || 'inactive';\n var multiple = filter.multiple;\n this.clearFilter();\n if (!multiple) this.clearActiveLegend(); // 设置 legend 的高亮状态\n\n this.activateLegend(e.target);\n var group = lc.find(function (e) {\n return e.get('name') === 'root';\n });\n var nodeGroup = group.find(function (e) {\n return e.get('name') === 'node-group';\n });\n var edgeGroup = group.find(function (e) {\n return e.get('name') === 'edge-group';\n });\n var activeNodeLegend = nodeGroup.get('children').filter(function (e) {\n return e.get('active');\n });\n var activeEdgeLegend = edgeGroup.get('children').filter(function (e) {\n return e.get('active');\n });\n var activeCount = 0;\n var typeFuncs = ['getNodes', 'getEdges'];\n typeFuncs.forEach(function (typeFunc) {\n graph[typeFunc]().forEach(function (graphItem) {\n var active = false;\n var activeLegend = typeFunc === 'getNodes' ? activeNodeLegend : activeEdgeLegend;\n activeLegend.forEach(function (itemGroup) {\n var func = filterFunctions[itemGroup.get('id')];\n active = active || func(graphItem.getModel());\n });\n\n if (active) {\n graph.setItemState(graphItem, inactiveState, false);\n graph.setItemState(graphItem, activeState, true);\n activeCount++;\n } else {\n graph.setItemState(graphItem, activeState, false);\n graph.setItemState(graphItem, inactiveState, true);\n }\n });\n });\n if (!activeCount) typeFuncs.forEach(function (typeFunc) {\n graph[typeFunc]().forEach(function (graphItem) {\n graph.clearItemStates(graphItem, [inactiveState]);\n });\n });\n };\n /**\n * 清除主图相关状态\n * @param param\n */\n\n\n Legend.prototype.clearFilter = function () {\n // 清除 legend 的高亮状态\n var graph = this.get('graph');\n var filter = this.get('filter');\n if (!filter) return;\n var activeState = filter.graphActiveState || 'active';\n var inactiveState = filter.graphInactiveState || 'inactive';\n graph.getNodes().forEach(function (node) {\n graph.clearItemStates(node, [activeState, inactiveState]);\n });\n graph.getEdges().forEach(function (edge) {\n graph.clearItemStates(edge, [activeState, inactiveState]);\n });\n };\n /**\n * 渲染 legend 图\n * @param param\n */\n\n\n Legend.prototype.render = function () {\n var _this = this;\n\n this.processData();\n var lc = this.get('legendCanvas');\n\n if (!lc) {\n lc = new g_canvas_esm[\"Canvas\"]({\n container: this.get('container'),\n width: 200,\n height: 200\n });\n var rootGroup = lc.addGroup({\n name: 'root'\n });\n rootGroup.addGroup({\n name: 'node-group'\n });\n rootGroup.addGroup({\n name: 'edge-group'\n }); // nodeStateStyles: {\n // legendActive,\n // legendInactive\n // }\n\n this.set('legendCanvas', lc);\n }\n\n var group = lc.find(function (e) {\n return e.get('name') === 'root';\n });\n var nodeGroup = group.find(function (e) {\n return e.get('name') === 'node-group';\n });\n var edgeGroup = group.find(function (e) {\n return e.get('name') === 'edge-group';\n });\n var itemsData = this.get('itemsData');\n var itemTypes = ['nodes', 'edges'];\n var itemGroup = [nodeGroup, edgeGroup];\n itemTypes.forEach(function (itemType, i) {\n itemsData[itemType].forEach(function (data) {\n var _a;\n\n var subGroup = itemGroup[i].addGroup({\n id: data.id,\n name: 'node-container'\n });\n var attrs;\n var shapeType = data.type;\n\n var _b = _this.getShapeSize(data),\n width = _b.width,\n height = _b.height,\n r = _b.r;\n\n var style = _this.getStyle(itemType.substr(0, 4), data);\n\n switch (data.type) {\n case 'circle':\n attrs = {\n r: r,\n x: 0,\n y: 0\n };\n break;\n\n case 'rect':\n attrs = {\n width: width,\n height: height,\n x: -width / 2,\n y: -height / 2\n };\n break;\n\n case 'ellipse':\n attrs = {\n r1: width,\n r2: height,\n x: 0,\n y: 0\n };\n break;\n\n case 'line':\n attrs = {\n x1: -width / 2,\n y1: 0,\n x2: width / 2,\n y2: 0\n };\n shapeType = 'line';\n break;\n\n case 'quadratic':\n attrs = {\n path: [['M', -width / 2, 0], ['Q', 0, width / 2, width / 2, 0]]\n };\n shapeType = 'path';\n break;\n\n case 'cubic':\n attrs = {\n path: [['M', -width / 2, 0], ['C', -width / 6, width / 2, width / 6, -width / 2, width / 2, 0]]\n };\n shapeType = 'path';\n break;\n\n default:\n attrs = {\n r: r,\n x: 0,\n y: 0\n };\n break;\n }\n\n var keyShape = subGroup.addShape(shapeType, {\n attrs: legend_assign(legend_assign({}, attrs), style),\n name: data.type + \"-node-keyShape\",\n oriAttrs: legend_assign({\n opacity: 1\n }, style)\n });\n\n if (data.label) {\n var keyShapeBBox = keyShape.getBBox();\n var labelStyle = ((_a = data.labelCfg) === null || _a === void 0 ? void 0 : _a.style) || {};\n\n var attrs_1 = legend_assign({\n textAlign: 'begin',\n fontSize: 12,\n textBaseline: 'middle',\n fill: '#000',\n opacity: 1,\n fontWeight: 'normal'\n }, labelStyle);\n\n subGroup.addShape('text', {\n attrs: legend_assign({\n x: keyShapeBBox.maxX + 4,\n y: 0,\n text: data.label\n }, attrs_1),\n className: 'legend-label',\n name: data.type + \"-node-text\",\n oriAttrs: attrs_1\n });\n }\n });\n });\n var padding = this.get('padding');\n var titleShape;\n var titleGroup = group.find(function (e) {\n return e.get('name') === 'title-container';\n });\n var titleGroupBBox = {\n height: 0,\n maxY: 0,\n width: 0\n };\n\n if (this.get('title')) {\n if (!titleGroup) {\n titleGroup = group.addGroup({\n name: 'title-container'\n });\n }\n\n var defaultTitleStyle = {\n fontSize: 20,\n fontFamily: 'Arial',\n fontWeight: 300,\n textBaseline: 'top',\n textAlign: 'center',\n fill: \"#000\",\n x: 0,\n y: padding[0]\n };\n var titleConfig = this.get('titleConfig') || {};\n var style = Object.assign(defaultTitleStyle, titleConfig.style || {});\n titleShape = titleGroup.addShape('text', {\n attrs: legend_assign({\n text: this.get('title')\n }, style)\n });\n titleGroupBBox = titleGroup.getCanvasBBox();\n titleGroup.setMatrix([1, 0, 0, 0, 1, 0, titleConfig.offsetX, titleConfig.offsetY, 1]);\n }\n\n this.layoutItems();\n var lcBBox = group.getCanvasBBox();\n var nodeGroupBBox = nodeGroup.getCanvasBBox(); // 若有图形超过边界的情况,平移回来\n\n var nodeGroupBeginX = nodeGroupBBox.minX < 0 ? Math.abs(nodeGroupBBox.minX) + padding[3] : padding[3];\n var nodeGroupBeginY = titleGroupBBox.maxY < nodeGroupBBox.minY ? Math.abs(titleGroupBBox.maxY - nodeGroupBBox.minY) + padding[0] : titleGroupBBox.maxY + padding[0];\n var nodeGroupMatrix = [1, 0, 0, 0, 1, 0, nodeGroupBeginX, nodeGroupBeginY, 1];\n nodeGroup.setMatrix(nodeGroupMatrix);\n lcBBox = group.getCanvasBBox();\n var size = [lcBBox.minX + lcBBox.width + padding[1], lcBBox.minY + lcBBox.height + padding[2]]; // 根据 size 和 titleConfig 调整 title 位置,再调整 nodeGroup 位置\n\n if (titleShape) {\n var titleConfig = legend_assign({\n position: 'center',\n offsetX: 0,\n offsetY: 0\n }, this.get('titleConfig'));\n\n titleGroupBBox = titleGroup.getCanvasBBox();\n var titleGroupMatrix = titleGroup.getMatrix() || [1, 0, 0, 0, 1, 0, 0, 0, 1];\n\n if (titleConfig.position === 'center') {\n titleGroupMatrix[6] = size[0] / 2 + titleConfig.offsetX;\n } else if (titleConfig.position === 'right') {\n titleGroupMatrix[6] = size[0] - padding[3] + titleConfig.offsetX;\n titleShape.attr({\n textAlign: 'right'\n });\n } else {\n titleGroupMatrix[6] = padding[3] + titleConfig.offsetX;\n titleShape.attr({\n textAlign: 'left'\n });\n }\n\n titleGroup.setMatrix(titleGroupMatrix);\n titleGroupBBox = titleGroup.getCanvasBBox(); // 若有图形超过边界的情况,平移回来\n\n nodeGroupBeginX = nodeGroupBBox.minX < 0 ? Math.abs(nodeGroupBBox.minX) + padding[3] : padding[3];\n nodeGroupBeginY = nodeGroupBBox.minY < titleGroupBBox.maxY ? Math.abs(titleGroupBBox.maxY - nodeGroupBBox.minY) + padding[0] : titleGroupBBox.maxY + padding[0];\n nodeGroupMatrix = [1, 0, 0, 0, 1, 0, nodeGroupBeginX, nodeGroupBeginY, 1];\n nodeGroup.setMatrix(nodeGroupMatrix);\n var edgeGroupMatrix_1 = [1, 0, 0, 0, 1, 0, nodeGroupBeginX, nodeGroupBeginY, 1];\n if (this.get('layout') === 'vertical') edgeGroupMatrix_1[6] += nodeGroupBBox.maxX + this.get('horiSep');else edgeGroupMatrix_1[7] += nodeGroupBBox.maxY + this.get('vertiSep');\n edgeGroup.setMatrix(edgeGroupMatrix_1);\n } else {\n // 没有 title,也需要平移 edgeGroup\n nodeGroupBBox = nodeGroup.getCanvasBBox();\n var edgeGroupMatrix_2 = [1, 0, 0, 0, 1, 0, 0, 0, 1];\n if (this.get('layout') === 'vertical') edgeGroupMatrix_2[6] += nodeGroupMatrix[6] + nodeGroupBBox.maxX + this.get('horiSep');else edgeGroupMatrix_2[7] += nodeGroupMatrix[7] + nodeGroupBBox.maxY + this.get('vertiSep');\n edgeGroup.setMatrix(edgeGroupMatrix_2);\n }\n\n lcBBox = group.getCanvasBBox();\n nodeGroupBBox = nodeGroup.getCanvasBBox();\n nodeGroupMatrix = nodeGroup.getMatrix() || [1, 0, 0, 0, 1, 0, 0, 0, 1];\n var edgeGroupMatrix = edgeGroup.getMatrix() || [1, 0, 0, 0, 1, 0, 0, 0, 1];\n var edgeGroupBBox = edgeGroup.getCanvasBBox();\n size = [Math.max(nodeGroupBBox.width + nodeGroupMatrix[6], edgeGroupBBox.width + edgeGroupMatrix[6]) + padding[1], Math.max(nodeGroupBBox.height + nodeGroupMatrix[7], edgeGroupBBox.height + edgeGroupMatrix[7]) + padding[2]];\n lc.changeSize(size[0], size[1]); // 更新容器背景样式\n\n var containerStyle = this.get('containerStyle');\n var viewportMatrix = group.getMatrix() || [1, 0, 0, 0, 1, 0, 0, 0, 1];\n var beginPos = util.invertMatrix({\n x: 0,\n y: 0\n }, viewportMatrix);\n var backRect = group.addShape('rect', {\n attrs: legend_assign({\n x: beginPos.x + (containerStyle.lineWidth || 1),\n y: beginPos.y + (containerStyle.lineWidth || 1),\n width: size[0] - 2 * (containerStyle.lineWidth || 1),\n height: size[1] - 2 * (containerStyle.lineWidth || 1),\n fill: \"#f00\",\n stroke: '#000',\n lineWidth: 1,\n opacity: 0.5\n }, containerStyle),\n name: 'legend-back-rect',\n capture: false\n });\n backRect.toBack();\n return size;\n };\n\n Legend.prototype.layoutItems = function () {\n var lc = this.get('legendCanvas');\n var horiSep = this.get('horiSep');\n var vertiSep = this.get('vertiSep');\n var layout = this.get('layout');\n var align = this.get('align');\n var begin = [0, 0];\n var group = lc.find(function (e) {\n return e.get('name') === 'root';\n });\n var nodeGroup = group.find(function (e) {\n return e.get('name') === 'node-group';\n });\n var edgeGroup = group.find(function (e) {\n return e.get('name') === 'edge-group';\n });\n var nodeLegendSize = {\n min: 0,\n max: -Infinity\n };\n var rowMaxY = -Infinity;\n nodeGroup.get('children').forEach(function (cNodeGroup, i) {\n if (i === 0) nodeLegendSize.min = begin[0];\n var keyShape = cNodeGroup.get('children')[0];\n var bbox = cNodeGroup.getCanvasBBox();\n\n var _a = keyShape.getBBox(),\n keyShapeWidth = _a.width,\n keyShapeHeight = _a.height;\n\n var curHeight = 0,\n x = 0,\n y = 0;\n\n if (layout === 'vertical') {\n x = begin[1];\n y = begin[0] + keyShapeWidth / 2;\n begin[0] = y + bbox.height + vertiSep;\n curHeight = bbox.maxX + x + keyShapeWidth / 2;\n } else {\n x = begin[0] + keyShapeWidth / 2;\n y = begin[1];\n begin[0] = x + bbox.width + horiSep;\n curHeight = bbox.maxY + y + keyShapeHeight / 2;\n }\n\n if (begin[0] > nodeLegendSize.max) nodeLegendSize.max = begin[0];\n if (curHeight > rowMaxY) rowMaxY = curHeight;\n cNodeGroup.setMatrix([1, 0, 0, 0, 1, 0, x, y, 1]);\n });\n var nw = nodeLegendSize.max - nodeLegendSize.min;\n var edgeLegendSize = {\n min: 0,\n max: -Infinity\n };\n var nodeGroupBBox = nodeGroup.getCanvasBBox();\n begin[0] = 0;\n begin[1] = layout === 'vertical' ? nodeGroupBBox.maxX + horiSep : nodeGroupBBox.maxY + vertiSep;\n edgeGroup.get('children').forEach(function (subGroup, i) {\n if (i === 0) edgeLegendSize.min = begin[0];\n var keyShape = subGroup.get('children')[0];\n var bbox = subGroup.getCanvasBBox();\n\n var _a = keyShape.getBBox(),\n keyShapeWidth = _a.width,\n keyShapeHeight = _a.height;\n\n var x = 0,\n y = 0;\n\n if (layout === 'vertical') {\n x = begin[1];\n y = begin[0];\n begin[0] = y + bbox.height + vertiSep;\n subGroup.setMatrix([1, 0, 0, 0, 1, 0, 0, y + keyShapeHeight / 2, 1]);\n } else {\n x = begin[0];\n y = begin[1];\n begin[0] = x + bbox.width + horiSep;\n subGroup.setMatrix([1, 0, 0, 0, 1, 0, x + keyShapeWidth / 2, 0, 1]);\n }\n\n if (begin[0] > edgeLegendSize.max) edgeLegendSize.max = begin[0];\n });\n var ew = edgeLegendSize.max - edgeLegendSize.min;\n\n if (align && align !== '' && align !== 'left') {\n var widthDiff = nw - ew;\n var movement_1 = align === 'center' ? Math.abs(widthDiff) / 2 : Math.abs(widthDiff);\n var shouldAdjustGroup = widthDiff < 0 ? nodeGroup : edgeGroup;\n shouldAdjustGroup.get('children').forEach(function (subGroup) {\n var matrix = subGroup.getMatrix() || [1, 0, 0, 0, 1, 0, 0, 0, 1];\n if (layout === 'vertical') matrix[7] += movement_1;else matrix[6] += movement_1;\n subGroup.setMatrix(matrix);\n });\n }\n };\n\n Legend.prototype.processData = function () {\n var data = this.get('data');\n var itemsData = {\n nodes: [],\n edges: []\n };\n\n if (data.nodes) {\n data.nodes.sort(function (a, b) {\n return a.order - b.order;\n });\n data.nodes.forEach(function (node) {\n var _a, _b, _c, _d, _e;\n\n var size = node.size || [((_a = node.style) === null || _a === void 0 ? void 0 : _a.width) || ((_b = node.style) === null || _b === void 0 ? void 0 : _b.r) || 8, ((_c = node.style) === null || _c === void 0 ? void 0 : _c.height) || ((_d = node.style) === null || _d === void 0 ? void 0 : _d.r) || 8];\n var labelStyle = ((_e = node.labelCfg) === null || _e === void 0 ? void 0 : _e.style) || {};\n itemsData.nodes.push({\n id: node.id || Object(esm[\"uniqueId\"])(),\n type: node.type || 'circle',\n style: legend_assign({}, node.style),\n order: node.order,\n label: node.label,\n itemType: 'node',\n size: size,\n labelCfg: {\n position: 'right',\n style: legend_assign({\n fontFamily: \"Arial\"\n }, labelStyle)\n }\n });\n });\n }\n\n if (data.edges) {\n data.edges.sort(function (a, b) {\n return a.order - b.order;\n });\n data.edges.forEach(function (edge) {\n var _a, _b;\n\n var type = edge.type || 'line';\n if (edge.type === 'cubic-horizontal') type = 'cubic';\n var labelStyle = ((_a = edge.labelCfg) === null || _a === void 0 ? void 0 : _a.style) || {};\n var size = edge.size || [((_b = edge.style) === null || _b === void 0 ? void 0 : _b.width) || 8, 1];\n itemsData.edges.push({\n id: edge.id || Object(esm[\"uniqueId\"])(),\n type: type,\n size: size,\n style: legend_assign({\n lineWidth: Object(esm[\"isArray\"])(size) ? size[1] : 1\n }, edge.style),\n order: edge.order,\n label: edge.label,\n itemType: 'edge',\n labelCfg: {\n position: 'right',\n style: legend_assign({\n fontFamily: \"Arial\"\n }, labelStyle)\n }\n });\n });\n }\n\n this.set('itemsData', itemsData);\n };\n\n Legend.prototype.getContainer = function () {\n return this.get('container');\n };\n\n Legend.prototype.formatArray = function (key) {\n var value = this.get(key);\n if (Object(esm[\"isNumber\"])(value)) this.set(key, [value, value, value, value]);else if (Object(esm[\"isArray\"])(value)) {\n switch (value.length) {\n case 0:\n this.set(key, [0, 0, 0, 0]);\n break;\n\n case 1:\n this.set(key, [value[0], value[0], value[0], value[0]]);\n break;\n\n case 2:\n this.set(key, [value[0], value[1], value[0], value[1]]);\n break;\n\n case 3:\n this.set(key, [value[0], value[1], value[2], value[1]]);\n break;\n\n default:\n break;\n }\n }\n return this.get(key);\n };\n\n Legend.prototype.getShapeSize = function (data) {\n var width, height, r;\n\n if (data.size) {\n if (Object(esm[\"isArray\"])(data.size)) {\n width = data.size[0];\n height = data.size[1] || data.size[0];\n r = data.size[0] / 2;\n } else if (Object(esm[\"isNumber\"])(data.size)) {\n width = data.size;\n height = data.size;\n r = data.size / 2;\n }\n }\n\n if (data.style) {\n if (data.style.width) width = data.style.width;\n if (data.style.height) height = data.style.height;\n if (data.style.r) r = data.style.r;\n }\n\n if (!r) r = 5;\n if (!width) width = r;\n if (!height) height = r;\n return {\n width: width,\n height: height,\n r: r\n };\n };\n\n Legend.prototype.getStyle = function (type, data) {\n var defaultStyle = type === 'node' ? {\n fill: '#ccc',\n lineWidth: 0\n } : {\n stroke: '#000',\n lineWidth: 1\n };\n return legend_assign(legend_assign({}, defaultStyle), data.style || {});\n };\n\n Legend.prototype.destroy = function () {\n var graph = this.get('graph');\n var graphContainer = graph.get('container');\n var container = this.get('container');\n graphContainer.removeChild(container);\n };\n\n return Legend;\n}(es_base);\n\n/* harmony default export */ var legend = (legend_Legend);\n// CONCATENATED MODULE: ./node_modules/@antv/g6-plugin/es/index.js\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nvar Plugin = {\n PluginBase: es_base,\n Menu: es_menu,\n Grid: grid,\n Minimap: minimap,\n Bundling: bundling,\n ToolBar: es_toolBar,\n Tooltip: es_tooltip,\n Fisheye: fisheye,\n TimeBar: timeBar,\n ImageMinimap: imageMinimap,\n EdgeFilterLens: edgeFilterLens,\n SnapLine: snapline,\n Legend: legend\n};\n/* harmony default export */ var g6_plugin_es = (Plugin);\n// CONCATENATED MODULE: ./node_modules/@antv/g6-pc/es/plugin/index.js\n\n/* harmony default export */ var es_plugin = (g6_plugin_es); // export default {};\n// CONCATENATED MODULE: ./node_modules/@antv/g6-element/es/nodes/circle.js\n\n\n // 带有图标的圆,可用于拓扑图中\n\nregisterNode('circle', {\n // 自定义节点时的配置\n options: {\n size: BaseGlobal.defaultNode.size,\n style: {\n x: 0,\n y: 0,\n stroke: BaseGlobal.defaultNode.style.stroke,\n fill: BaseGlobal.defaultNode.style.fill,\n lineWidth: BaseGlobal.defaultNode.style.lineWidth\n },\n labelCfg: {\n style: {\n fill: BaseGlobal.nodeLabel.style.fill,\n fontSize: BaseGlobal.nodeLabel.style.fontSize,\n fontFamily: BaseGlobal.windowFontFamily\n }\n },\n // 节点上左右上下四个方向上的链接circle配置\n linkPoints: {\n top: false,\n right: false,\n bottom: false,\n left: false,\n // circle的大小\n size: BaseGlobal.defaultNode.linkPoints.size,\n lineWidth: BaseGlobal.defaultNode.linkPoints.lineWidth,\n fill: BaseGlobal.defaultNode.linkPoints.fill,\n stroke: BaseGlobal.defaultNode.linkPoints.stroke\n },\n // 节点中icon配置\n icon: {\n // 是否显示icon,值为 false 则不渲染icon\n show: false,\n // icon的地址,字符串类型\n img: 'https://gw.alipayobjects.com/zos/bmw-prod/5d015065-8505-4e7a-baec-976f81e3c41d.svg',\n width: 20,\n height: 20\n },\n stateStyles: Object(tslib_es6[\"__assign\"])({}, BaseGlobal.nodeStateStyles)\n },\n shapeType: 'circle',\n // 文本位置\n labelPosition: 'center',\n drawShape: function drawShape(cfg, group) {\n var _a = (this.mergeStyle || this.getOptions(cfg)).icon,\n defaultIcon = _a === void 0 ? {} : _a;\n var style = this.getShapeStyle(cfg);\n var icon = Object(esm[\"deepMix\"])({}, defaultIcon, cfg.icon);\n var name = this.type + \"-keyShape\";\n var keyShape = group.addShape('circle', {\n attrs: style,\n className: name,\n name: name,\n draggable: true\n });\n group['shapeMap'][name] = keyShape;\n var width = icon.width,\n height = icon.height,\n show = icon.show,\n text = icon.text;\n\n if (show) {\n var iconName = this.type + \"-icon\";\n\n if (text) {\n group['shapeMap'][iconName] = group.addShape('text', {\n attrs: Object(tslib_es6[\"__assign\"])({\n x: 0,\n y: 0,\n fontSize: 12,\n fill: '#000',\n stroke: '#000',\n textBaseline: 'middle',\n textAlign: 'center'\n }, icon),\n className: iconName,\n name: iconName,\n draggable: true\n });\n } else {\n group['shapeMap'][iconName] = group.addShape('image', {\n attrs: Object(tslib_es6[\"__assign\"])({\n x: -width / 2,\n y: -height / 2\n }, icon),\n className: iconName,\n name: iconName,\n draggable: true\n });\n }\n }\n\n this.drawLinkPoints(cfg, group);\n return keyShape;\n },\n\n /**\n * 绘制节点上的LinkPoints\n * @param {Object} cfg data数据配置项\n * @param {Group} group Group实例\n */\n drawLinkPoints: function drawLinkPoints(cfg, group) {\n var linkPoints = (this.mergeStyle || this.getOptions(cfg)).linkPoints;\n if (!linkPoints) return;\n\n var _a = linkPoints || {},\n top = _a.top,\n left = _a.left,\n right = _a.right,\n bottom = _a.bottom,\n markSize = _a.size,\n markR = _a.r,\n markStyle = Object(tslib_es6[\"__rest\"])(_a, [\"top\", \"left\", \"right\", \"bottom\", \"size\", \"r\"]);\n\n var size = this.getSize(cfg);\n var r = size[0] / 2;\n\n if (left) {\n // left circle\n var name_1 = 'link-point-left';\n group['shapeMap'][name_1] = group.addShape('circle', {\n attrs: Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, markStyle), {\n x: -r,\n y: 0,\n r: markSize / 2 || markR || 5\n }),\n className: name_1,\n name: name_1,\n isAnchorPoint: true\n });\n }\n\n if (right) {\n // right circle\n var name_2 = 'link-point-right';\n group['shapeMap'][name_2] = group.addShape('circle', {\n attrs: Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, markStyle), {\n x: r,\n y: 0,\n r: markSize / 2 || markR || 5\n }),\n className: name_2,\n name: name_2,\n isAnchorPoint: true\n });\n }\n\n if (top) {\n // top circle\n var name_3 = 'link-point-top';\n group['shapeMap'][name_3] = group.addShape('circle', {\n attrs: Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, markStyle), {\n x: 0,\n y: -r,\n r: markSize / 2 || markR || 5\n }),\n className: name_3,\n name: name_3,\n isAnchorPoint: true\n });\n }\n\n if (bottom) {\n // bottom circle\n var name_4 = 'link-point-bottom';\n group['shapeMap'][name_4] = group.addShape('circle', {\n attrs: Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, markStyle), {\n x: 0,\n y: r,\n r: markSize / 2 || markR || 5\n }),\n className: name_4,\n name: name_4,\n isAnchorPoint: true\n });\n }\n },\n\n /**\n * 获取节点的样式,供基于该节点自定义时使用\n * @param {Object} cfg 节点数据模型\n * @return {Object} 节点的样式\n */\n getShapeStyle: function getShapeStyle(cfg) {\n var defaultStyle = (this.mergeStyle || this.getOptions(cfg)).style;\n var strokeStyle = {\n stroke: cfg.color\n }; // 如果设置了color,则覆盖默认的stroke属性\n\n var style = Object(esm[\"deepMix\"])({}, defaultStyle, strokeStyle);\n var size = this.getSize(cfg);\n var r = size[0] / 2;\n\n var styles = Object(tslib_es6[\"__assign\"])({\n x: 0,\n y: 0,\n r: r\n }, style);\n\n return styles;\n },\n update: function update(cfg, item, updateType) {\n var group = item.getContainer();\n var size = this.getSize(cfg); // 下面这些属性需要覆盖默认样式与目前样式,但若在 cfg 中有指定则应该被 cfg 的相应配置覆盖。\n // const strokeStyle = {\n // stroke: cfg.color,\n // r: size[0] / 2,\n // };\n // // 与 getShapeStyle 不同在于,update 时需要获取到当前的 style 进行融合。即新传入的配置项中没有涉及的属性,保留当前的配置。\n // const keyShape = item.get('keyShape');\n // TODO: performance\n // const style = deepMix({}, keyShape.attr(), strokeStyle, cfg.style);\n // const style = deepMix({}, keyShape.attr(), cfg.style);\n\n var style = Object(tslib_es6[\"__assign\"])({}, cfg.style);\n\n if (cfg.style.stroke === undefined && cfg.color) {\n style.stroke = cfg.color;\n }\n\n if (cfg.style.r === undefined && !isNaN(size[0])) {\n style.r = size[0] / 2;\n }\n\n this.updateShape(cfg, item, style, true, updateType); // (this as any).updateShape(cfg, item, style, true, updateType);\n\n this.updateLinkPoints(cfg, group);\n }\n}, 'single-node');\n// CONCATENATED MODULE: ./node_modules/@antv/g6-element/es/nodes/rect.js\n\n\n\nregisterNode('rect', {\n // 自定义节点时的配置\n options: {\n size: [100, 30],\n style: {\n radius: 0,\n stroke: BaseGlobal.defaultNode.style.stroke,\n fill: BaseGlobal.defaultNode.style.fill,\n lineWidth: BaseGlobal.defaultNode.style.lineWidth\n },\n // 文本样式配置\n labelCfg: {\n style: {\n fill: BaseGlobal.nodeLabel.style.fill,\n fontSize: BaseGlobal.nodeLabel.style.fontSize,\n fontFamily: BaseGlobal.windowFontFamily\n }\n },\n // 节点上左右上下四个方向上的链接circle配置\n linkPoints: {\n top: false,\n right: false,\n bottom: false,\n left: false,\n // circle的大小\n size: BaseGlobal.defaultNode.linkPoints.size,\n lineWidth: BaseGlobal.defaultNode.linkPoints.lineWidth,\n fill: BaseGlobal.defaultNode.linkPoints.fill,\n stroke: BaseGlobal.defaultNode.linkPoints.stroke\n },\n // 节点中icon配置\n icon: {\n // 是否显示icon,值为 false 则不渲染icon\n show: false,\n // icon的地址,字符串类型\n img: 'https://gw.alipayobjects.com/zos/bmw-prod/5d015065-8505-4e7a-baec-976f81e3c41d.svg',\n width: 20,\n height: 20\n },\n // 连接点,默认为左右\n // anchorPoints: [{ x: 0, y: 0.5 }, { x: 1, y: 0.5 }]\n anchorPoints: [[0, 0.5], [1, 0.5]],\n stateStyles: Object(tslib_es6[\"__assign\"])({}, BaseGlobal.nodeStateStyles)\n },\n shapeType: 'rect',\n labelPosition: 'center',\n drawShape: function drawShape(cfg, group) {\n var style = this.getShapeStyle(cfg);\n var keyShape = group.addShape('rect', {\n attrs: style,\n className: this.type + \"-keyShape\",\n name: this.type + \"-keyShape\",\n draggable: true\n });\n group['shapeMap'][this.type + \"-keyShape\"] = keyShape;\n this.drawLinkPoints(cfg, group);\n return keyShape;\n },\n\n /**\n * 绘制节点上的LinkPoints\n * @param {Object} cfg data数据配置项\n * @param {Group} group Group实例\n */\n drawLinkPoints: function drawLinkPoints(cfg, group) {\n var _a = (this.mergeStyle || this.getOptions(cfg)).linkPoints,\n linkPoints = _a === void 0 ? {} : _a;\n\n var top = linkPoints.top,\n left = linkPoints.left,\n right = linkPoints.right,\n bottom = linkPoints.bottom,\n markSize = linkPoints.size,\n markR = linkPoints.r,\n markStyle = Object(tslib_es6[\"__rest\"])(linkPoints, [\"top\", \"left\", \"right\", \"bottom\", \"size\", \"r\"]);\n\n var size = this.getSize(cfg);\n var width = size[0];\n var height = size[1];\n\n if (left) {\n // left circle\n group['shapeMap']['link-point-left'] = group.addShape('circle', {\n attrs: Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, markStyle), {\n x: -width / 2,\n y: 0,\n r: markSize / 2 || markR || 5\n }),\n className: 'link-point-left',\n name: 'link-point-left',\n isAnchorPoint: true\n });\n }\n\n if (right) {\n // right circle\n group['shapeMap']['link-point-right'] = group.addShape('circle', {\n attrs: Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, markStyle), {\n x: width / 2,\n y: 0,\n r: markSize / 2 || markR || 5\n }),\n className: 'link-point-right',\n name: 'link-point-right',\n isAnchorPoint: true\n });\n }\n\n if (top) {\n // top circle\n group['shapeMap']['link-point-top'] = group.addShape('circle', {\n attrs: Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, markStyle), {\n x: 0,\n y: -height / 2,\n r: markSize / 2 || markR || 5\n }),\n className: 'link-point-top',\n name: 'link-point-top',\n isAnchorPoint: true\n });\n }\n\n if (bottom) {\n // bottom circle\n group['shapeMap']['link-point-bottom'] = group.addShape('circle', {\n attrs: Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, markStyle), {\n x: 0,\n y: height / 2,\n r: markSize / 2 || markR || 5\n }),\n className: 'link-point-bottom',\n name: 'link-point-bottom',\n isAnchorPoint: true\n });\n }\n },\n\n /**\n * 获取节点的样式,供基于该节点自定义时使用\n * @param {Object} cfg 节点数据模型\n * @return {Object} 节点的样式\n */\n getShapeStyle: function getShapeStyle(cfg) {\n var defaultStyle = (this.mergeStyle || this.getOptions(cfg)).style;\n var strokeStyle = {\n stroke: cfg.color\n }; // 如果设置了color,则覆盖默认的stroke属性\n\n var style = Object(esm[\"mix\"])({}, defaultStyle, strokeStyle);\n var size = this.getSize(cfg);\n var width = style.width || size[0];\n var height = style.height || size[1];\n\n var styles = Object(tslib_es6[\"__assign\"])({\n x: -width / 2,\n y: -height / 2,\n width: width,\n height: height\n }, style);\n\n return styles;\n },\n update: function update(cfg, item, updateType) {\n var group = item.getContainer(); // 这里不传 cfg 参数是因为 cfg.style 需要最后覆盖样式\n\n var defaultStyle = this.getOptions({}).style;\n var size = this.getSize(cfg);\n var keyShape = item.get('keyShape');\n\n if (!cfg.size) {\n size[0] = keyShape.attr('width') || defaultStyle.width;\n size[1] = keyShape.attr('height') || defaultStyle.height;\n } // 下面这些属性需要覆盖默认样式与目前样式,但若在 cfg 中有指定则应该被 cfg 的相应配置覆盖。\n\n\n var strokeStyle = {\n stroke: cfg.color,\n x: -size[0] / 2,\n y: -size[1] / 2,\n width: size[0],\n height: size[1]\n }; // 与 getShapeStyle 不同在于,update 时需要获取到当前的 style 进行融合。即新传入的配置项中没有涉及的属性,保留当前的配置。\n\n var style = Object(esm[\"mix\"])({}, defaultStyle, keyShape.attr(), strokeStyle);\n style = Object(esm[\"mix\"])(style, cfg.style);\n this.updateShape(cfg, item, style, false, updateType);\n this.updateLinkPoints(cfg, group);\n }\n}, 'single-node');\n// CONCATENATED MODULE: ./node_modules/@antv/g6-element/es/nodes/ellipse.js\n\n\n\n/**\n * 基本的椭圆,可以添加文本,默认文本居中\n */\n\nregisterNode('ellipse', {\n // 自定义节点时的配置\n options: {\n size: [80, 40],\n style: {\n x: 0,\n y: 0,\n stroke: BaseGlobal.defaultNode.style.stroke,\n fill: BaseGlobal.defaultNode.style.fill,\n lineWidth: BaseGlobal.defaultNode.style.lineWidth\n },\n // 文本样式配置\n labelCfg: {\n style: {\n fill: BaseGlobal.nodeLabel.style.fill,\n fontSize: BaseGlobal.nodeLabel.style.fontSize,\n fontFamily: BaseGlobal.windowFontFamily\n }\n },\n // 节点上左右上下四个方向上的链接circle配置\n linkPoints: {\n top: false,\n right: false,\n bottom: false,\n left: false,\n // circle的大小\n size: BaseGlobal.defaultNode.linkPoints.size,\n lineWidth: BaseGlobal.defaultNode.linkPoints.lineWidth,\n fill: BaseGlobal.defaultNode.linkPoints.fill,\n stroke: BaseGlobal.defaultNode.linkPoints.stroke\n },\n // 节点中icon配置\n icon: {\n // 是否显示icon,值为 false 则不渲染icon\n show: false,\n // icon的地址,字符串类型\n img: 'https://gw.alipayobjects.com/zos/bmw-prod/5d015065-8505-4e7a-baec-976f81e3c41d.svg',\n width: 20,\n height: 20\n },\n stateStyles: Object(tslib_es6[\"__assign\"])({}, BaseGlobal.nodeStateStyles)\n },\n shapeType: 'ellipse',\n // 文本位置\n labelPosition: 'center',\n drawShape: function drawShape(cfg, group) {\n var _a = (this.mergeStyle || this.getOptions(cfg)).icon,\n icon = _a === void 0 ? {} : _a;\n var style = this.getShapeStyle(cfg);\n var keyShape = group.addShape('ellipse', {\n attrs: style,\n className: 'ellipse-keyShape',\n name: 'ellipse-keyShape',\n draggable: true\n });\n group['shapeMap']['ellipse-keyShape'] = keyShape;\n var width = icon.width,\n height = icon.height,\n show = icon.show,\n text = icon.text;\n\n if (show) {\n if (text) {\n group['shapeMap'][this.type + \"-icon\"] = group.addShape('text', {\n attrs: Object(tslib_es6[\"__assign\"])({\n x: 0,\n y: 0,\n fontSize: 12,\n fill: '#000',\n stroke: '#000',\n textBaseline: 'middle',\n textAlign: 'center'\n }, icon),\n className: this.type + \"-icon\",\n name: this.type + \"-icon\",\n draggable: true\n });\n } else {\n group['shapeMap'][this.type + \"-icon\"] = group.addShape('image', {\n attrs: Object(tslib_es6[\"__assign\"])({\n x: -width / 2,\n y: -height / 2\n }, icon),\n className: this.type + \"-icon\",\n name: this.type + \"-icon\",\n draggable: true\n });\n }\n }\n\n this.drawLinkPoints(cfg, group);\n return keyShape;\n },\n\n /**\n * 绘制节点上的LinkPoints\n * @param {Object} cfg data数据配置项\n * @param {Group} group Group实例\n */\n drawLinkPoints: function drawLinkPoints(cfg, group) {\n var _a = (this.mergeStyle || this.getOptions(cfg)).linkPoints,\n linkPoints = _a === void 0 ? {} : _a;\n\n var top = linkPoints.top,\n left = linkPoints.left,\n right = linkPoints.right,\n bottom = linkPoints.bottom,\n markSize = linkPoints.size,\n markR = linkPoints.r,\n markStyle = Object(tslib_es6[\"__rest\"])(linkPoints, [\"top\", \"left\", \"right\", \"bottom\", \"size\", \"r\"]);\n\n var size = this.getSize(cfg);\n var rx = size[0] / 2;\n var ry = size[1] / 2;\n\n if (left) {\n // left circle\n group['shapeMap']['link-point-left'] = group.addShape('circle', {\n attrs: Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, markStyle), {\n x: -rx,\n y: 0,\n r: markSize / 2 || markR || 5\n }),\n className: 'link-point-left',\n name: 'link-point-left',\n isAnchorPoint: true\n });\n }\n\n if (right) {\n // right circle\n group['shapeMap']['link-point-right'] = group.addShape('circle', {\n attrs: Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, markStyle), {\n x: rx,\n y: 0,\n r: markSize / 2 || markR || 5\n }),\n className: 'link-point-right',\n name: 'link-point-right',\n isAnchorPoint: true\n });\n }\n\n if (top) {\n // top circle\n group['shapeMap']['link-point-top'] = group.addShape('circle', {\n attrs: Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, markStyle), {\n x: 0,\n y: -ry,\n r: markSize / 2 || markR || 5\n }),\n className: 'link-point-top',\n name: 'link-point-top',\n isAnchorPoint: true\n });\n }\n\n if (bottom) {\n // bottom circle\n group['shapeMap']['link-point-bottom'] = group.addShape('circle', {\n attrs: Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, markStyle), {\n x: 0,\n y: ry,\n r: markSize / 2 || markR || 5\n }),\n className: 'link-point-bottom',\n name: 'link-point-bottom',\n isAnchorPoint: true\n });\n }\n },\n\n /**\n * 获取节点的样式,供基于该节点自定义时使用\n * @param {Object} cfg 节点数据模型\n * @return {Object} 节点的样式\n */\n getShapeStyle: function getShapeStyle(cfg) {\n var defaultStyle = (this.mergeStyle || this.getOptions(cfg)).style;\n var strokeStyle = {\n stroke: cfg.color\n }; // 如果设置了color,则覆盖默认的stroke属性\n\n var style = Object(esm[\"mix\"])({}, defaultStyle, strokeStyle);\n var size = this.getSize(cfg);\n var rx = size[0] / 2;\n var ry = size[1] / 2;\n\n var styles = Object(tslib_es6[\"__assign\"])({\n x: 0,\n y: 0,\n rx: rx,\n ry: ry\n }, style);\n\n return styles;\n },\n update: function update(cfg, item, updateType) {\n var group = item.getContainer(); // 这里不传 cfg 参数是因为 cfg.style 需要最后覆盖样式\n\n var defaultStyle = this.getOptions({}).style;\n var size = this.getSize(cfg);\n var strokeStyle = {\n stroke: cfg.color,\n rx: size[0] / 2,\n ry: size[1] / 2\n }; // 与 getShapeStyle 不同在于,update 时需要获取到当前的 style 进行融合。即新传入的配置项中没有涉及的属性,保留当前的配置。\n\n var keyShape = item.get('keyShape');\n var style = Object(esm[\"mix\"])({}, defaultStyle, keyShape.attr(), strokeStyle);\n style = Object(esm[\"mix\"])(style, cfg.style);\n this.updateShape(cfg, item, style, true, updateType);\n this.updateLinkPoints(cfg, group);\n }\n}, 'single-node');\n// CONCATENATED MODULE: ./node_modules/@antv/g6-element/es/nodes/diamond.js\n\n\n // 菱形shape\n\nregisterNode('diamond', {\n // 自定义节点时的配置\n options: {\n size: [80, 80],\n style: {\n stroke: BaseGlobal.defaultNode.style.stroke,\n fill: BaseGlobal.defaultNode.style.fill,\n lineWidth: BaseGlobal.defaultNode.style.lineWidth\n },\n // 文本样式配置\n labelCfg: {\n style: {\n fill: BaseGlobal.nodeLabel.style.fill,\n fontSize: BaseGlobal.nodeLabel.style.fontSize,\n fontFamily: BaseGlobal.windowFontFamily\n }\n },\n // 节点上左右上下四个方向上的链接circle配置\n linkPoints: {\n top: false,\n right: false,\n bottom: false,\n left: false,\n // circle的大小\n size: BaseGlobal.defaultNode.linkPoints.size,\n lineWidth: BaseGlobal.defaultNode.linkPoints.lineWidth,\n fill: BaseGlobal.defaultNode.linkPoints.fill,\n stroke: BaseGlobal.defaultNode.linkPoints.stroke\n },\n // 节点中icon配置\n icon: {\n // 是否显示icon,值为 false 则不渲染icon\n show: false,\n // icon的地址,字符串类型\n img: 'https://gw.alipayobjects.com/zos/bmw-prod/5d015065-8505-4e7a-baec-976f81e3c41d.svg',\n width: 20,\n height: 20\n },\n stateStyles: Object(tslib_es6[\"__assign\"])({}, BaseGlobal.nodeStateStyles)\n },\n shapeType: 'diamond',\n // 文本位置\n labelPosition: 'center',\n drawShape: function drawShape(cfg, group) {\n var _a = (this.mergeStyle || this.getOptions(cfg)).icon,\n icon = _a === void 0 ? {} : _a;\n var style = this.getShapeStyle(cfg);\n var keyShape = group.addShape('path', {\n attrs: style,\n className: this.type + \"-keyShape\",\n name: this.type + \"-keyShape\",\n draggable: true\n });\n group['shapeMap'][this.type + \"-keyShape\"] = keyShape;\n var w = icon.width,\n h = icon.height,\n show = icon.show,\n text = icon.text;\n\n if (show) {\n if (text) {\n group['shapeMap'][this.type + \"-icon\"] = group.addShape('text', {\n attrs: Object(tslib_es6[\"__assign\"])({\n x: 0,\n y: 0,\n fontSize: 12,\n fill: '#000',\n stroke: '#000',\n textBaseline: 'middle',\n textAlign: 'center'\n }, icon),\n className: this.type + \"-icon\",\n name: this.type + \"-icon\",\n draggable: true\n });\n } else {\n group['shapeMap'][this.type + \"-icon\"] = group.addShape('image', {\n attrs: Object(tslib_es6[\"__assign\"])({\n x: -w / 2,\n y: -h / 2\n }, icon),\n className: this.type + \"-icon\",\n name: this.type + \"-icon\",\n draggable: true\n });\n }\n }\n\n this.drawLinkPoints(cfg, group);\n return keyShape;\n },\n\n /**\n * 绘制节点上的LinkPoints\n * @param {Object} cfg data数据配置项\n * @param {Group} group Group实例\n */\n drawLinkPoints: function drawLinkPoints(cfg, group) {\n var _a = (this.mergeStyle || this.getOptions(cfg)).linkPoints,\n linkPoints = _a === void 0 ? {} : _a;\n\n var top = linkPoints.top,\n left = linkPoints.left,\n right = linkPoints.right,\n bottom = linkPoints.bottom,\n markSize = linkPoints.size,\n markR = linkPoints.r,\n markStyle = Object(tslib_es6[\"__rest\"])(linkPoints, [\"top\", \"left\", \"right\", \"bottom\", \"size\", \"r\"]);\n\n var size = this.getSize(cfg);\n var width = size[0];\n var height = size[1];\n\n if (left) {\n // left circle\n group['shapeMap']['link-point-left'] = group.addShape('circle', {\n attrs: Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, markStyle), {\n x: -width / 2,\n y: 0,\n r: markSize / 2 || markR || 5\n }),\n className: 'link-point-left',\n name: 'link-point-left',\n isAnchorPoint: true\n });\n }\n\n if (right) {\n // right circle\n group['shapeMap']['link-point-right'] = group.addShape('circle', {\n attrs: Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, markStyle), {\n x: width / 2,\n y: 0,\n r: markSize / 2 || markR || 5\n }),\n className: 'link-point-right',\n name: 'link-point-right',\n isAnchorPoint: true\n });\n }\n\n if (top) {\n // top circle\n group['shapeMap']['link-point-top'] = group.addShape('circle', {\n attrs: Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, markStyle), {\n x: 0,\n y: -height / 2,\n r: markSize / 2 || markR || 5\n }),\n className: 'link-point-top',\n name: 'link-point-top',\n isAnchorPoint: true\n });\n }\n\n if (bottom) {\n // bottom circle\n group['shapeMap']['link-point-bottom'] = group.addShape('circle', {\n attrs: Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, markStyle), {\n x: 0,\n y: height / 2,\n r: markSize / 2 || markR || 5\n }),\n className: 'link-point-bottom',\n name: 'link-point-bottom',\n isAnchorPoint: true\n });\n }\n },\n getPath: function getPath(cfg) {\n var size = this.getSize(cfg);\n var width = size[0];\n var height = size[1];\n var path = [['M', 0, -height / 2], ['L', width / 2, 0], ['L', 0, height / 2], ['L', -width / 2, 0], ['Z'] // 封闭\n ];\n return path;\n },\n\n /**\n * 获取节点的样式,供基于该节点自定义时使用\n * @param {Object} cfg 节点数据模型\n * @return {Object} 节点的样式\n */\n getShapeStyle: function getShapeStyle(cfg) {\n var defaultStyle = (this.mergeStyle || this.getOptions(cfg)).style;\n var strokeStyle = {\n stroke: cfg.color\n }; // 如果设置了color,则覆盖默认的stroke属性\n\n var style = Object(esm[\"mix\"])({}, defaultStyle, strokeStyle);\n var path = this.getPath(cfg);\n\n var styles = Object(tslib_es6[\"__assign\"])({\n path: path\n }, style);\n\n return styles;\n },\n update: function update(cfg, item, updateType) {\n var group = item.getContainer(); // 这里不传 cfg 参数是因为 cfg.style 需要最后覆盖样式\n\n var defaultStyle = this.getOptions({}).style;\n var path = this.getPath(cfg); // 下面这些属性需要覆盖默认样式与目前样式,但若在 cfg 中有指定则应该被 cfg 的相应配置覆盖。\n\n var strokeStyle = {\n stroke: cfg.color,\n path: path\n }; // 与 getShapeStyle 不同在于,update 时需要获取到当前的 style 进行融合。即新传入的配置项中没有涉及的属性,保留当前的配置。\n\n var keyShape = item.get('keyShape');\n var style = Object(esm[\"mix\"])({}, defaultStyle, keyShape.attr(), strokeStyle);\n style = Object(esm[\"mix\"])(style, cfg.style);\n this.updateShape(cfg, item, style, true, updateType);\n this.updateLinkPoints(cfg, group);\n }\n}, 'single-node');\n// CONCATENATED MODULE: ./node_modules/@antv/g6-element/es/nodes/triangle.js\n\n\n // 三角形\n\nregisterNode('triangle', {\n // 自定义节点时的配置\n options: {\n size: 40,\n direction: 'up',\n style: {\n stroke: BaseGlobal.defaultNode.style.stroke,\n fill: BaseGlobal.defaultNode.style.fill,\n lineWidth: BaseGlobal.defaultNode.style.lineWidth\n },\n labelCfg: {\n style: {\n fill: BaseGlobal.nodeLabel.style.fill,\n fontSize: BaseGlobal.nodeLabel.style.fontSize\n },\n offset: 15\n },\n // 节点上左右上下四个方向上的链接circle配置\n linkPoints: {\n top: false,\n right: false,\n bottom: false,\n left: false,\n // circle的大小\n size: BaseGlobal.defaultNode.linkPoints.size,\n lineWidth: BaseGlobal.defaultNode.linkPoints.lineWidth,\n fill: BaseGlobal.defaultNode.linkPoints.fill,\n stroke: BaseGlobal.defaultNode.linkPoints.stroke\n },\n // 节点中icon配置\n icon: {\n // 是否显示icon,值为 false 则不渲染icon\n show: false,\n // icon的地址,字符串类型\n img: 'https://gw.alipayobjects.com/zos/bmw-prod/5d015065-8505-4e7a-baec-976f81e3c41d.svg',\n width: 20,\n height: 20,\n offset: 6\n },\n stateStyles: Object(tslib_es6[\"__assign\"])({}, BaseGlobal.nodeStateStyles)\n },\n shapeType: 'triangle',\n // 文本位置\n labelPosition: 'bottom',\n drawShape: function drawShape(cfg, group) {\n var _a = this.mergeStyle || this.getOptions(cfg),\n _b = _a.icon,\n icon = _b === void 0 ? {} : _b,\n defaultDirection = _a.direction;\n\n var style = this.getShapeStyle(cfg);\n var direction = cfg.direction || defaultDirection;\n var keyShape = group.addShape('path', {\n attrs: style,\n className: this.type + \"-keyShape\",\n name: this.type + \"-keyShape\",\n draggable: true\n });\n group['shapeMap'][this.type + \"-keyShape\"] = keyShape;\n var w = icon.width,\n h = icon.height,\n show = icon.show,\n offset = icon.offset,\n text = icon.text;\n\n if (show) {\n if (text) {\n group['shapeMap'][this.type + \"-icon\"] = group.addShape('text', {\n attrs: Object(tslib_es6[\"__assign\"])({\n x: 0,\n y: 0,\n fontSize: 12,\n fill: '#000',\n stroke: '#000',\n textBaseline: 'middle',\n textAlign: 'center'\n }, icon),\n className: this.type + \"-icon\",\n name: this.type + \"-icon\",\n draggable: true\n });\n } else {\n var iconW = -w / 2;\n var iconH = -h / 2;\n\n if (direction === 'up' || direction === 'down') {\n iconH += offset;\n }\n\n if (direction === 'left' || direction === 'right') {\n iconW += offset;\n }\n\n group['shapeMap'][this.type + \"-icon\"] = group.addShape('image', {\n attrs: Object(tslib_es6[\"__assign\"])({\n x: iconW,\n y: iconH\n }, icon),\n className: this.type + \"-icon\",\n name: this.type + \"-icon\",\n draggable: true\n });\n }\n }\n\n this.drawLinkPoints(cfg, group);\n return keyShape;\n },\n\n /**\n * 绘制节点上的LinkPoints\n * @param {Object} cfg data数据配置项\n * @param {Group} group Group实例\n */\n drawLinkPoints: function drawLinkPoints(cfg, group) {\n var _a = this.mergeStyle || this.getOptions(cfg),\n _b = _a.linkPoints,\n linkPoints = _b === void 0 ? {} : _b,\n defaultDirection = _a.direction;\n\n var direction = cfg.direction || defaultDirection;\n\n var top = linkPoints.top,\n left = linkPoints.left,\n right = linkPoints.right,\n bottom = linkPoints.bottom,\n markSize = linkPoints.size,\n markR = linkPoints.r,\n markStyle = Object(tslib_es6[\"__rest\"])(linkPoints, [\"top\", \"left\", \"right\", \"bottom\", \"size\", \"r\"]);\n\n var size = this.getSize(cfg);\n var len = size[0];\n\n if (left) {\n // up down left right 四个方向的坐标均不相同\n var leftPos = null;\n var diffY = len * Math.sin(1 / 3 * Math.PI);\n var r = len * Math.sin(1 / 3 * Math.PI);\n\n if (direction === 'up') {\n leftPos = [-r, diffY];\n } else if (direction === 'down') {\n leftPos = [-r, -diffY];\n } else if (direction === 'left') {\n leftPos = [-r, r - diffY];\n }\n\n if (leftPos) {\n // left circle\n group['shapeMap']['link-point-left'] = group.addShape('circle', {\n attrs: Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, markStyle), {\n x: leftPos[0],\n y: leftPos[1],\n r: markSize / 2 || markR || 5\n }),\n className: 'link-point-left',\n name: 'link-point-left'\n });\n }\n }\n\n if (right) {\n // right circle\n // up down left right 四个方向的坐标均不相同\n var rightPos = null;\n var diffY = len * Math.sin(1 / 3 * Math.PI);\n var r = len * Math.sin(1 / 3 * Math.PI);\n\n if (direction === 'up') {\n rightPos = [r, diffY];\n } else if (direction === 'down') {\n rightPos = [r, -diffY];\n } else if (direction === 'right') {\n rightPos = [r, r - diffY];\n }\n\n if (rightPos) {\n group['shapeMap']['link-point-right'] = group.addShape('circle', {\n attrs: Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, markStyle), {\n x: rightPos[0],\n y: rightPos[1],\n r: markSize / 2 || markR || 5\n }),\n className: 'link-point-right',\n name: 'link-point-right'\n });\n }\n }\n\n if (top) {\n // up down left right 四个方向的坐标均不相同\n var topPos = null;\n var diffY = len * Math.sin(1 / 3 * Math.PI);\n var r = len * Math.sin(1 / 3 * Math.PI);\n\n if (direction === 'up') {\n topPos = [r - diffY, -diffY];\n } else if (direction === 'left') {\n topPos = [r, -diffY];\n } else if (direction === 'right') {\n topPos = [-r, -diffY];\n }\n\n if (topPos) {\n // top circle\n group['shapeMap']['link-point-top'] = group.addShape('circle', {\n attrs: Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, markStyle), {\n x: topPos[0],\n y: topPos[1],\n r: markSize / 2 || markR || 5\n }),\n className: 'link-point-top',\n name: 'link-point-top'\n });\n }\n }\n\n if (bottom) {\n // up down left right 四个方向的坐标均不相同\n var bottomPos = null;\n var diffY = len * Math.sin(1 / 3 * Math.PI);\n var r = len * Math.sin(1 / 3 * Math.PI);\n\n if (direction === 'down') {\n bottomPos = [-r + diffY, diffY];\n } else if (direction === 'left') {\n bottomPos = [r, diffY];\n } else if (direction === 'right') {\n bottomPos = [-r, diffY];\n }\n\n if (bottomPos) {\n // bottom circle\n group['shapeMap']['link-point-bottom'] = group.addShape('circle', {\n attrs: Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, markStyle), {\n x: bottomPos[0],\n y: bottomPos[1],\n r: markSize / 2 || markR || 5\n }),\n className: 'link-point-bottom',\n name: 'link-point-bottom'\n });\n }\n }\n },\n getPath: function getPath(cfg) {\n var defaultDirection = (this.mergeStyle || this.getOptions(cfg)).direction;\n var direction = cfg.direction || defaultDirection;\n var size = this.getSize(cfg);\n var len = size[0];\n var diffY = len * Math.sin(1 / 3 * Math.PI);\n var r = len * Math.sin(1 / 3 * Math.PI);\n var path = [['M', -r, diffY], ['L', 0, -diffY], ['L', r, diffY], ['Z'] // 封闭\n ];\n\n if (direction === 'down') {\n path = [['M', -r, -diffY], ['L', r, -diffY], ['L', 0, diffY], ['Z'] // 封闭\n ];\n } else if (direction === 'left') {\n path = [['M', -r, r - diffY], ['L', r, -r], ['L', r, r], ['Z'] // 封闭\n ];\n } else if (direction === 'right') {\n path = [['M', r, r - diffY], ['L', -r, r], ['L', -r, -r], ['Z'] // 封闭\n ];\n }\n\n return path;\n },\n\n /**\n * 获取节点的样式,供基于该节点自定义时使用\n * @param {Object} cfg 节点数据模型\n * @return {Object} 节点的样式\n */\n getShapeStyle: function getShapeStyle(cfg) {\n var defaultStyle = (this.mergeStyle || this.getOptions(cfg)).style;\n var strokeStyle = {\n stroke: cfg.color\n }; // 如果设置了color,则覆盖默认的stroke属性\n\n var style = Object(esm[\"mix\"])({}, defaultStyle, strokeStyle);\n var path = this.getPath(cfg);\n\n var styles = Object(tslib_es6[\"__assign\"])({\n path: path\n }, style);\n\n return styles;\n },\n update: function update(cfg, item, updateType) {\n var group = item.getContainer(); // 这里不传 cfg 参数是因为 cfg.style 需要最后覆盖样式\n\n var defaultStyle = this.getOptions({}).style;\n var path = this.getPath(cfg); // 下面这些属性需要覆盖默认样式与目前样式,但若在 cfg 中有指定则应该被 cfg 的相应配置覆盖。\n\n var strokeStyle = {\n stroke: cfg.color,\n path: path\n }; // 与 getShapeStyle 不同在于,update 时需要获取到当前的 style 进行融合。即新传入的配置项中没有涉及的属性,保留当前的配置。\n\n var keyShape = item.get('keyShape');\n var style = Object(esm[\"mix\"])({}, defaultStyle, keyShape.attr(), strokeStyle);\n style = Object(esm[\"mix\"])(style, cfg.style);\n this.updateShape(cfg, item, style, true, updateType);\n this.updateLinkPoints(cfg, group);\n },\n\n /**\n * 更新linkPoints\n * @param {Object} cfg 节点数据配置项\n * @param {Group} group Item所在的group\n */\n updateLinkPoints: function updateLinkPoints(cfg, group) {\n var _a = this.getOptions({}),\n defaultLinkPoints = _a.linkPoints,\n defaultDirection = _a.direction;\n\n var direction = cfg.direction || defaultDirection;\n var markLeft = group['shapeMap']['link-point-left'] || group.find(function (element) {\n return element.get('className') === 'link-point-left';\n });\n var markRight = group['shapeMap']['link-point-right'] || group.find(function (element) {\n return element.get('className') === 'link-point-right';\n });\n var markTop = group['shapeMap']['link-point-top'] || group.find(function (element) {\n return element.get('className') === 'link-point-top';\n });\n var markBottom = group['shapeMap']['link-point-bottom'] || group.find(function (element) {\n return element.get('className') === 'link-point-bottom';\n });\n var currentLinkPoints = defaultLinkPoints;\n var existLinkPoint = markLeft || markRight || markTop || markBottom;\n\n if (existLinkPoint) {\n currentLinkPoints = existLinkPoint.attr();\n }\n\n var linkPoints = Object(esm[\"mix\"])({}, currentLinkPoints, cfg.linkPoints);\n var markFill = linkPoints.fill,\n markStroke = linkPoints.stroke,\n borderWidth = linkPoints.lineWidth;\n var markSize = linkPoints.size / 2;\n if (!markSize) markSize = linkPoints.r;\n\n var _b = cfg.linkPoints ? cfg.linkPoints : {\n left: undefined,\n right: undefined,\n top: undefined,\n bottom: undefined\n },\n left = _b.left,\n right = _b.right,\n top = _b.top,\n bottom = _b.bottom;\n\n var size = this.getSize(cfg);\n var len = size[0];\n var styles = {\n r: markSize,\n fill: markFill,\n stroke: markStroke,\n lineWidth: borderWidth\n };\n var leftPos = null;\n var diffY = len * Math.sin(1 / 3 * Math.PI);\n var r = len * Math.sin(1 / 3 * Math.PI);\n\n if (direction === 'up') {\n leftPos = [-r, diffY];\n } else if (direction === 'down') {\n leftPos = [-r, -diffY];\n } else if (direction === 'left') {\n leftPos = [-r, r - diffY];\n }\n\n if (leftPos) {\n if (markLeft) {\n if (!left && left !== undefined) {\n markLeft.remove();\n delete group['shapeMap']['link-point-left'];\n } else {\n markLeft.attr(Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, styles), {\n x: leftPos[0],\n y: leftPos[1]\n }));\n }\n } else if (left) {\n group['shapeMap']['link-point-left'] = group.addShape('circle', {\n attrs: Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, styles), {\n x: leftPos[0],\n y: leftPos[1]\n }),\n className: 'link-point-left',\n name: 'link-point-left',\n isAnchorPoint: true\n });\n }\n }\n\n var rightPos = null;\n\n if (direction === 'up') {\n rightPos = [r, diffY];\n } else if (direction === 'down') {\n rightPos = [r, -diffY];\n } else if (direction === 'right') {\n rightPos = [r, r - diffY];\n }\n\n if (rightPos) {\n if (markRight) {\n if (!right && right !== undefined) {\n markRight.remove();\n delete group['shapeMap']['link-point-right'];\n } else {\n markRight.attr(Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, styles), {\n x: rightPos[0],\n y: rightPos[1]\n }));\n }\n } else if (right) {\n group['shapeMap']['link-point-right'] = group.addShape('circle', {\n attrs: Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, styles), {\n x: rightPos[0],\n y: rightPos[1]\n }),\n className: 'link-point-right',\n name: 'link-point-right',\n isAnchorPoint: true\n });\n }\n }\n\n var topPos = null;\n\n if (direction === 'up') {\n topPos = [r - diffY, -diffY];\n } else if (direction === 'left') {\n topPos = [r, -diffY];\n } else if (direction === 'right') {\n topPos = [-r, -diffY];\n }\n\n if (topPos) {\n if (markTop) {\n if (!top && top !== undefined) {\n markTop.remove();\n delete group['shapeMap']['link-point-top'];\n } else {\n // top circle\n markTop.attr(Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, styles), {\n x: topPos[0],\n y: topPos[1]\n }));\n }\n } else if (top) {\n group['shapeMap']['link-point-top'] = group.addShape('circle', {\n attrs: Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, styles), {\n x: topPos[0],\n y: topPos[1]\n }),\n className: 'link-point-top',\n name: 'link-point-top',\n isAnchorPoint: true\n });\n }\n }\n\n var bottomPos = null;\n\n if (direction === 'down') {\n bottomPos = [-r + diffY, diffY];\n } else if (direction === 'left') {\n bottomPos = [r, diffY];\n } else if (direction === 'right') {\n bottomPos = [-r, diffY];\n }\n\n if (bottomPos) {\n if (markBottom) {\n if (!bottom && bottom !== undefined) {\n markBottom.remove();\n delete group['shapeMap']['link-point-bottom'];\n } else {\n markBottom.attr(Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, styles), {\n x: bottomPos[0],\n y: bottomPos[1]\n }));\n }\n } else if (bottom) {\n group['shapeMap']['link-point-bottom'] = group.addShape('circle', {\n attrs: Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, styles), {\n x: bottomPos[0],\n y: bottomPos[1]\n }),\n className: 'link-point-bottom',\n name: 'link-point-bottom',\n isAnchorPoint: true\n });\n }\n }\n }\n}, 'single-node');\n// CONCATENATED MODULE: ./node_modules/@antv/g6-element/es/nodes/modelRect.js\n\n\n\nregisterNode('modelRect', {\n // 自定义节点时的配置\n options: {\n size: [185, 70],\n style: {\n radius: 5,\n stroke: '#69c0ff',\n fill: '#ffffff',\n lineWidth: BaseGlobal.defaultNode.style.lineWidth,\n fillOpacity: 1\n },\n // 文本样式配置\n labelCfg: {\n style: {\n fill: '#595959',\n fontSize: 14,\n fontFamily: BaseGlobal.windowFontFamily\n },\n offset: 30 // 距离左侧的 offset,没有设置 y 轴上移动的配置\n\n },\n descriptionCfg: {\n style: {\n fontSize: 12,\n fill: '#bfbfbf',\n fontFamily: BaseGlobal.windowFontFamily\n },\n paddingTop: 0\n },\n preRect: {\n show: true,\n width: 4,\n fill: '#40a9ff',\n radius: 2\n },\n // 节点上左右上下四个方向上的链接circle配置\n linkPoints: {\n top: false,\n right: false,\n bottom: false,\n left: false,\n // circle的大小\n size: 10,\n lineWidth: 1,\n fill: '#72CC4A',\n stroke: '#72CC4A'\n },\n // 节点中icon配置\n logoIcon: {\n // 是否显示icon,值为 false 则不渲染icon\n show: true,\n x: 0,\n y: 0,\n // icon的地址,字符串类型\n img: 'https://gw.alipayobjects.com/zos/basement_prod/4f81893c-1806-4de4-aff3-9a6b266bc8a2.svg',\n width: 16,\n height: 16,\n // 用于调整图标的左右位置\n offset: 0\n },\n // 节点中表示状态的icon配置\n stateIcon: {\n // 是否显示icon,值为 false 则不渲染icon\n show: true,\n x: 0,\n y: 0,\n // icon的地址,字符串类型\n img: 'https://gw.alipayobjects.com/zos/basement_prod/300a2523-67e0-4cbf-9d4a-67c077b40395.svg',\n width: 16,\n height: 16,\n // 用于调整图标的左右位置\n offset: -5\n },\n // 连接点,默认为左右\n // anchorPoints: [{ x: 0, y: 0.5 }, { x: 1, y: 0.5 }]\n anchorPoints: [[0, 0.5], [1, 0.5]]\n },\n shapeType: 'modelRect',\n drawShape: function drawShape(cfg, group) {\n var _a = (this.mergeStyle || this.getOptions(cfg)).preRect,\n preRect = _a === void 0 ? {} : _a;\n var style = this.getShapeStyle(cfg);\n var size = this.getSize(cfg);\n var width = size[0];\n var height = size[1];\n var keyShape = group.addShape('rect', {\n attrs: style,\n className: this.type + \"-keyShape\",\n name: this.type + \"-keyShape\",\n draggable: true\n });\n group['shapeMap'][this.type + \"-keyShape\"] = keyShape;\n\n var preRectShow = preRect.show,\n preRectStyle = Object(tslib_es6[\"__rest\"])(preRect, [\"show\"]);\n\n if (preRectShow) {\n group['shapeMap']['pre-rect'] = group.addShape('rect', {\n attrs: Object(tslib_es6[\"__assign\"])({\n x: -width / 2,\n y: -height / 2,\n height: height\n }, preRectStyle),\n className: 'pre-rect',\n name: 'pre-rect',\n draggable: true\n });\n }\n\n this.drawLogoIcon(cfg, group);\n this.drawStateIcon(cfg, group);\n this.drawLinkPoints(cfg, group);\n return keyShape;\n },\n\n /**\n * 绘制模型矩形左边的logo图标\n * @param {Object} cfg 数据配置项\n * @param {Group} group Group实例\n */\n drawLogoIcon: function drawLogoIcon(cfg, group) {\n var _a = (this.mergeStyle || this.getOptions(cfg)).logoIcon,\n logoIcon = _a === void 0 ? {} : _a;\n var size = this.getSize(cfg);\n var width = size[0];\n\n if (logoIcon.show) {\n var w = logoIcon.width,\n h = logoIcon.height,\n x = logoIcon.x,\n y = logoIcon.y,\n offset = logoIcon.offset,\n text = logoIcon.text,\n logoIconStyle = Object(tslib_es6[\"__rest\"])(logoIcon, [\"width\", \"height\", \"x\", \"y\", \"offset\", \"text\"]);\n\n if (text) {\n group['shapeMap']['rect-logo-icon'] = group.addShape('text', {\n attrs: Object(tslib_es6[\"__assign\"])({\n x: 0,\n y: 0,\n fontSize: 12,\n fill: '#000',\n stroke: '#000',\n textBaseline: 'middle',\n textAlign: 'center'\n }, logoIconStyle),\n className: 'rect-logo-icon',\n name: 'rect-logo-icon',\n draggable: true\n });\n } else {\n group['shapeMap']['rect-logo-icon'] = group.addShape('image', {\n attrs: Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, logoIconStyle), {\n x: x || -width / 2 + w + offset,\n y: y || -h / 2,\n width: w,\n height: h\n }),\n className: 'rect-logo-icon',\n name: 'rect-logo-icon',\n draggable: true\n });\n }\n }\n },\n\n /**\n * 绘制模型矩形右边的状态图标\n * @param {Object} cfg 数据配置项\n * @param {Group} group Group实例\n */\n drawStateIcon: function drawStateIcon(cfg, group) {\n var _a = (this.mergeStyle || this.getOptions(cfg)).stateIcon,\n stateIcon = _a === void 0 ? {} : _a;\n var size = this.getSize(cfg);\n var width = size[0];\n\n if (stateIcon.show) {\n var w = stateIcon.width,\n h = stateIcon.height,\n x = stateIcon.x,\n y = stateIcon.y,\n offset = stateIcon.offset,\n text = stateIcon.text,\n iconStyle = Object(tslib_es6[\"__rest\"])(stateIcon, [\"width\", \"height\", \"x\", \"y\", \"offset\", \"text\"]);\n\n if (text) {\n group['shapeMap']['rect-state-icon'] = group.addShape('text', {\n attrs: Object(tslib_es6[\"__assign\"])({\n x: 0,\n y: 0,\n fontSize: 12,\n fill: '#000',\n stroke: '#000',\n textBaseline: 'middle',\n textAlign: 'center'\n }, iconStyle),\n className: 'rect-state-icon',\n name: 'rect-state-icon',\n draggable: true\n });\n } else {\n group['shapeMap']['rect-state-icon'] = group.addShape('image', {\n attrs: Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, iconStyle), {\n x: x || width / 2 - w + offset,\n y: y || -h / 2,\n width: w,\n height: h\n }),\n className: 'rect-state-icon',\n name: 'rect-state-icon',\n draggable: true\n });\n }\n }\n },\n\n /**\n * 绘制节点上的LinkPoints\n * @param {Object} cfg data数据配置项\n * @param {Group} group Group实例\n */\n drawLinkPoints: function drawLinkPoints(cfg, group) {\n var _a = (this.mergeStyle || this.getOptions(cfg)).linkPoints,\n linkPoints = _a === void 0 ? {} : _a;\n\n var top = linkPoints.top,\n left = linkPoints.left,\n right = linkPoints.right,\n bottom = linkPoints.bottom,\n markSize = linkPoints.size,\n markR = linkPoints.r,\n markStyle = Object(tslib_es6[\"__rest\"])(linkPoints, [\"top\", \"left\", \"right\", \"bottom\", \"size\", \"r\"]);\n\n var size = this.getSize(cfg);\n var width = size[0];\n var height = size[1];\n\n if (left) {\n // left circle\n group['shapeMap']['link-point-left'] = group.addShape('circle', {\n attrs: Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, markStyle), {\n x: -width / 2,\n y: 0,\n r: markSize / 2 || markR || 5\n }),\n className: 'link-point-left',\n name: 'link-point-left',\n isAnchorPoint: true\n });\n }\n\n if (right) {\n // right circle\n group['shapeMap']['link-point-right'] = group.addShape('circle', {\n attrs: Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, markStyle), {\n x: width / 2,\n y: 0,\n r: markSize / 2 || markR || 5\n }),\n className: 'link-point-right',\n name: 'link-point-right',\n isAnchorPoint: true\n });\n }\n\n if (top) {\n // top circle\n group['shapeMap']['link-point-top'] = group.addShape('circle', {\n attrs: Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, markStyle), {\n x: 0,\n y: -height / 2,\n r: markSize / 2 || markR || 5\n }),\n className: 'link-point-top',\n name: 'link-point-top',\n isAnchorPoint: true\n });\n }\n\n if (bottom) {\n // bottom circle\n group['shapeMap']['link-point-bottom'] = group.addShape('circle', {\n attrs: Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, markStyle), {\n x: 0,\n y: height / 2,\n r: markSize / 2 || markR || 5\n }),\n className: 'link-point-bottom',\n name: 'link-point-bottom',\n isAnchorPoint: true\n });\n }\n },\n drawLabel: function drawLabel(cfg, group) {\n var _a = this.getOptions(cfg),\n _b = _a.labelCfg,\n labelCfg = _b === void 0 ? {} : _b,\n _c = _a.logoIcon,\n logoIcon = _c === void 0 ? {} : _c,\n _d = _a.descriptionCfg,\n descriptionCfg = _d === void 0 ? {} : _d;\n\n var size = this.getSize(cfg);\n var width = size[0];\n var label = null;\n var show = logoIcon.show,\n w = logoIcon.width;\n var offsetX = -width / 2 + labelCfg.offset;\n\n if (show) {\n offsetX = -width / 2 + w + labelCfg.offset;\n }\n\n var fontStyle = labelCfg.style;\n var descriptionStyle = descriptionCfg.style,\n descriptionPaddingTop = descriptionCfg.paddingTop;\n\n if (Object(esm[\"isString\"])(cfg.description)) {\n label = group.addShape('text', {\n attrs: Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, fontStyle), {\n x: offsetX,\n y: -5,\n text: cfg.label\n }),\n className: 'text-shape',\n name: 'text-shape',\n draggable: true\n });\n group['shapeMap']['text-shape'] = label;\n group['shapeMap']['rect-description'] = group.addShape('text', {\n attrs: Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, descriptionStyle), {\n x: offsetX,\n y: 17 + (descriptionPaddingTop || 0),\n text: cfg.description\n }),\n className: 'rect-description',\n name: 'rect-description',\n draggable: true\n });\n } else {\n label = group.addShape('text', {\n attrs: Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, fontStyle), {\n x: offsetX,\n y: 7,\n text: cfg.label\n }),\n className: 'text-shape',\n name: 'text-shape',\n draggable: true\n });\n group['shapeMap']['text-shape'] = label;\n }\n\n return label;\n },\n\n /**\n * 获取节点的样式,供基于该节点自定义时使用\n * @param {Object} cfg 节点数据模型\n * @return {Object} 节点的样式\n */\n getShapeStyle: function getShapeStyle(cfg) {\n var defaultStyle = (this.mergeStyle || this.getOptions(cfg)).style;\n var strokeStyle = {\n stroke: cfg.color\n }; // 如果设置了color,则覆盖默认的stroke属性\n\n var style = Object(esm[\"mix\"])({}, defaultStyle, strokeStyle);\n var size = this.getSize(cfg);\n var width = style.width || size[0];\n var height = style.height || size[1];\n\n var styles = Object(tslib_es6[\"__assign\"])({\n x: -width / 2,\n y: -height / 2,\n width: width,\n height: height\n }, style);\n\n return styles;\n },\n update: function update(cfg, item) {\n var _a = this.mergeStyle || this.getOptions(cfg),\n _b = _a.style,\n style = _b === void 0 ? {} : _b,\n _c = _a.labelCfg,\n labelCfg = _c === void 0 ? {} : _c,\n _d = _a.descriptionCfg,\n descriptionCfg = _d === void 0 ? {} : _d;\n\n var size = this.getSize(cfg);\n var width = size[0];\n var height = size[1];\n var keyShape = item.get('keyShape');\n keyShape.attr(Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, style), {\n x: -width / 2,\n y: -height / 2,\n width: width,\n height: height\n }));\n var group = item.getContainer();\n var logoIconShape = group['shapeMap']['rect-logo-icon'] || group.find(function (element) {\n return element.get('className') === 'rect-logo-icon';\n });\n var currentLogoIconAttr = logoIconShape ? logoIconShape.attr() : {};\n var logoIcon = Object(esm[\"mix\"])({}, currentLogoIconAttr, cfg.logoIcon);\n var w = logoIcon.width;\n\n if (w === undefined) {\n w = this.options.logoIcon.width;\n }\n\n var show = cfg.logoIcon ? cfg.logoIcon.show : undefined;\n var offset = labelCfg.offset;\n var offsetX = -width / 2 + w + offset;\n\n if (!show && show !== undefined) {\n offsetX = -width / 2 + offset;\n }\n\n var label = group['shapeMap']['node-label'] || group.find(function (element) {\n return element.get('className') === 'node-label';\n });\n var description = group['shapeMap']['rect-description'] || group.find(function (element) {\n return element.get('className') === 'rect-description';\n });\n\n if (cfg.label) {\n if (!label) {\n group['shapeMap']['node-label'] = group.addShape('text', {\n attrs: Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, labelCfg.style), {\n x: offsetX,\n y: cfg.description ? -5 : 7,\n text: cfg.label\n }),\n className: 'node-label',\n name: 'node-label',\n draggable: true\n });\n } else {\n var cfgStyle = cfg.labelCfg ? cfg.labelCfg.style : {};\n var labelStyle = Object(esm[\"mix\"])({}, label.attr(), cfgStyle);\n if (cfg.label) labelStyle.text = cfg.label;\n labelStyle.x = offsetX;\n if (Object(esm[\"isString\"])(cfg.description)) labelStyle.y = -5;\n\n if (description) {\n description.resetMatrix();\n description.attr({\n x: offsetX\n });\n }\n\n label.resetMatrix();\n label.attr(labelStyle);\n }\n }\n\n if (Object(esm[\"isString\"])(cfg.description)) {\n var paddingTop = descriptionCfg.paddingTop;\n\n if (!description) {\n group['shapeMap']['rect-description'] = group.addShape('text', {\n attrs: Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, descriptionCfg.style), {\n x: offsetX,\n y: 17 + (paddingTop || 0),\n text: cfg.description\n }),\n className: 'rect-description',\n name: 'rect-description',\n draggable: true\n });\n } else {\n var cfgStyle = cfg.descriptionCfg ? cfg.descriptionCfg.style : {};\n var descriptionStyle = Object(esm[\"mix\"])({}, description.attr(), cfgStyle);\n if (Object(esm[\"isString\"])(cfg.description)) descriptionStyle.text = cfg.description;\n descriptionStyle.x = offsetX;\n description.resetMatrix();\n description.attr(Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, descriptionStyle), {\n y: 17 + (paddingTop || 0)\n }));\n }\n }\n\n var preRectShape = group['shapeMap']['pre-rect'] || group.find(function (element) {\n return element.get('className') === 'pre-rect';\n });\n\n if (preRectShape && !preRectShape.destroyed) {\n var preRect = Object(esm[\"mix\"])({}, preRectShape.attr(), cfg.preRect);\n preRectShape.attr(Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, preRect), {\n x: -width / 2,\n y: -height / 2,\n height: height\n }));\n }\n\n if (logoIconShape && !logoIconShape.destroyed) {\n if (!show && show !== undefined) {\n logoIconShape.remove();\n delete group['shapeMap']['pre-rect'];\n } else {\n var logoW = logoIcon.width,\n h = logoIcon.height,\n x = logoIcon.x,\n y = logoIcon.y,\n logoOffset = logoIcon.offset,\n logoIconStyle = Object(tslib_es6[\"__rest\"])(logoIcon, [\"width\", \"height\", \"x\", \"y\", \"offset\"]);\n\n logoIconShape.attr(Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, logoIconStyle), {\n x: x || -width / 2 + logoW + logoOffset,\n y: y || -h / 2,\n width: logoW,\n height: h\n }));\n }\n } else if (show) {\n this.drawLogoIcon(cfg, group);\n }\n\n var stateIconShape = group['shapeMap']['rect-state-icon'] || group.find(function (element) {\n return element.get('className') === 'rect-state-icon';\n });\n var currentStateIconAttr = stateIconShape ? stateIconShape.attr() : {};\n var stateIcon = Object(esm[\"mix\"])({}, currentStateIconAttr, cfg.stateIcon);\n\n if (stateIconShape) {\n if (!stateIcon.show && stateIcon.show !== undefined) {\n stateIconShape.remove();\n delete group['shapeMap']['rect-state-icon'];\n }\n\n var stateW = stateIcon.width,\n h = stateIcon.height,\n x = stateIcon.x,\n y = stateIcon.y,\n stateOffset = stateIcon.offset,\n stateIconStyle = Object(tslib_es6[\"__rest\"])(stateIcon, [\"width\", \"height\", \"x\", \"y\", \"offset\"]);\n\n stateIconShape.attr(Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, stateIconStyle), {\n x: x || width / 2 - stateW + stateOffset,\n y: y || -h / 2,\n width: stateW,\n height: h\n }));\n } else if (stateIcon.show) {\n this.drawStateIcon(cfg, group);\n }\n\n this.updateLinkPoints(cfg, group);\n }\n}, 'single-node');\n// CONCATENATED MODULE: ./node_modules/@antv/g6-element/es/nodes/star.js\n\n\n // 五角星shape\n\nregisterNode('star', {\n // 自定义节点时的配置\n options: {\n size: 60,\n style: {\n stroke: BaseGlobal.defaultNode.style.stroke,\n fill: BaseGlobal.defaultNode.style.fill,\n lineWidth: BaseGlobal.defaultNode.style.lineWidth\n },\n labelCfg: {\n style: {\n fill: BaseGlobal.nodeLabel.style.fill,\n fontSize: BaseGlobal.nodeLabel.style.fontSize,\n fontFamily: BaseGlobal.windowFontFamily\n }\n },\n // 节点上左右上下四个方向上的链接circle配置\n linkPoints: {\n top: false,\n right: false,\n bottom: false,\n left: false,\n // circle的大小\n size: BaseGlobal.defaultNode.linkPoints.size,\n lineWidth: BaseGlobal.defaultNode.linkPoints.lineWidth,\n fill: BaseGlobal.defaultNode.linkPoints.fill,\n stroke: BaseGlobal.defaultNode.linkPoints.stroke\n },\n // 节点中icon配置\n icon: {\n // 是否显示icon,值为 false 则不渲染icon\n show: false,\n // icon的地址,字符串类型\n img: 'https://gw.alipayobjects.com/zos/bmw-prod/5d015065-8505-4e7a-baec-976f81e3c41d.svg',\n width: 20,\n height: 20\n },\n stateStyles: Object(tslib_es6[\"__assign\"])({}, BaseGlobal.nodeStateStyles)\n },\n shapeType: 'star',\n // 文本位置\n labelPosition: 'center',\n drawShape: function drawShape(cfg, group) {\n var _a = (this.mergeStyle || this.getOptions(cfg)).icon,\n icon = _a === void 0 ? {} : _a;\n var style = this.getShapeStyle(cfg);\n var keyShape = group.addShape('path', {\n attrs: style,\n className: this.type + \"-keyShape\",\n name: this.type + \"-keyShape\",\n draggable: true\n });\n group['shapeMap'][this.type + \"-keyShape\"] = keyShape;\n var w = icon.width,\n h = icon.height,\n show = icon.show,\n text = icon.text;\n\n if (show) {\n if (text) {\n group['shapeMap'][this.type + \"-icon\"] = group.addShape('text', {\n attrs: Object(tslib_es6[\"__assign\"])({\n x: 0,\n y: 0,\n fontSize: 12,\n fill: '#000',\n stroke: '#000',\n textBaseline: 'middle',\n textAlign: 'center'\n }, icon),\n className: this.type + \"-icon\",\n name: this.type + \"-icon\",\n draggable: true\n });\n } else {\n group['shapeMap'][this.type + \"-icon\"] = group.addShape('image', {\n attrs: Object(tslib_es6[\"__assign\"])({\n x: -w / 2,\n y: -h / 2\n }, icon),\n className: this.type + \"-icon\",\n name: this.type + \"-icon\",\n draggable: true\n });\n }\n }\n\n this.drawLinkPoints(cfg, group);\n return keyShape;\n },\n\n /**\n * 绘制节点上的LinkPoints\n * @param {Object} cfg data数据配置项\n * @param {Group} group Group实例\n */\n drawLinkPoints: function drawLinkPoints(cfg, group) {\n var _a = (this.mergeStyle || this.getOptions(cfg)).linkPoints,\n linkPoints = _a === void 0 ? {} : _a;\n\n var top = linkPoints.top,\n left = linkPoints.left,\n right = linkPoints.right,\n leftBottom = linkPoints.leftBottom,\n rightBottom = linkPoints.rightBottom,\n markSize = linkPoints.size,\n markR = linkPoints.r,\n markStyle = Object(tslib_es6[\"__rest\"])(linkPoints, [\"top\", \"left\", \"right\", \"leftBottom\", \"rightBottom\", \"size\", \"r\"]);\n\n var size = this.getSize(cfg);\n var outerR = size[0];\n\n if (right) {\n // right circle\n // up down left right 四个方向的坐标均不相同\n var x1 = Math.cos((18 + 72 * 0) / 180 * Math.PI) * outerR;\n var y1 = Math.sin((18 + 72 * 0) / 180 * Math.PI) * outerR;\n group['shapeMap']['link-point-right'] = group.addShape('circle', {\n attrs: Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, markStyle), {\n x: x1,\n y: -y1,\n r: markSize / 2 || markR || 5\n }),\n className: 'link-point-right',\n name: 'link-point-right'\n });\n }\n\n if (top) {\n // up down left right 四个方向的坐标均不相同\n var x1 = Math.cos((18 + 72 * 1) / 180 * Math.PI) * outerR;\n var y1 = Math.sin((18 + 72 * 1) / 180 * Math.PI) * outerR; // top circle\n\n group['shapeMap']['link-point-top'] = group.addShape('circle', {\n attrs: Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, markStyle), {\n x: x1,\n y: -y1,\n r: markSize / 2 || markR || 5\n }),\n className: 'link-point-top',\n name: 'link-point-top'\n });\n }\n\n if (left) {\n // up down left right 四个方向的坐标均不相同\n var x1 = Math.cos((18 + 72 * 2) / 180 * Math.PI) * outerR;\n var y1 = Math.sin((18 + 72 * 2) / 180 * Math.PI) * outerR; // left circle\n\n group['shapeMap']['link-point-left'] = group.addShape('circle', {\n attrs: Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, markStyle), {\n x: x1,\n y: -y1,\n r: markSize / 2 || markR || 5\n }),\n className: 'link-point-left',\n name: 'link-point-left'\n });\n }\n\n if (leftBottom) {\n // up down left right 四个方向的坐标均不相同\n var x1 = Math.cos((18 + 72 * 3) / 180 * Math.PI) * outerR;\n var y1 = Math.sin((18 + 72 * 3) / 180 * Math.PI) * outerR; // left bottom circle\n\n group['shapeMap']['link-point-bottom'] = group.addShape('circle', {\n attrs: Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, markStyle), {\n x: x1,\n y: -y1,\n r: markSize / 2 || markR || 5\n }),\n className: 'link-point-left-bottom',\n name: 'link-point-left-bottom'\n });\n }\n\n if (rightBottom) {\n // up down left right 四个方向的坐标均不相同\n var x1 = Math.cos((18 + 72 * 4) / 180 * Math.PI) * outerR;\n var y1 = Math.sin((18 + 72 * 4) / 180 * Math.PI) * outerR; // left bottom circle\n\n group['shapeMap']['link-point-right-bottom'] = group.addShape('circle', {\n attrs: Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, markStyle), {\n x: x1,\n y: -y1,\n r: markSize / 2 || markR || 5\n }),\n className: 'link-point-right-bottom',\n name: 'link-point-right-bottom'\n });\n }\n },\n getPath: function getPath(cfg) {\n var size = this.getSize(cfg);\n var outerR = size[0];\n var defaultInnerR = outerR * 3 / 8;\n var innerR = cfg.innerR || defaultInnerR;\n var path = [];\n\n for (var i = 0; i < 5; i++) {\n var x1 = Math.cos((18 + 72 * i) / 180 * Math.PI) * outerR;\n var y1 = Math.sin((18 + 72 * i) / 180 * Math.PI) * outerR;\n var x2 = Math.cos((54 + 72 * i) / 180 * Math.PI) * innerR;\n var y2 = Math.sin((54 + 72 * i) / 180 * Math.PI) * innerR;\n\n if (i === 0) {\n path.push(['M', x1, -y1]);\n } else {\n path.push(['L', x1, -y1]);\n }\n\n path.push(['L', x2, -y2]);\n }\n\n path.push(['Z']);\n return path;\n },\n\n /**\n * 获取节点的样式,供基于该节点自定义时使用\n * @param {Object} cfg 节点数据模型\n * @return {Object} 节点的样式\n */\n getShapeStyle: function getShapeStyle(cfg) {\n var defaultStyle = (this.mergeStyle || this.getOptions(cfg)).style;\n var strokeStyle = {\n stroke: cfg.color\n }; // 如果设置了color,则覆盖原来默认的 stroke 属性。但 cfg 中但 stroke 属性优先级更高\n\n var style = Object(esm[\"mix\"])({}, defaultStyle, strokeStyle);\n var path = this.getPath(cfg);\n\n var styles = Object(tslib_es6[\"__assign\"])({\n path: path\n }, style);\n\n return styles;\n },\n update: function update(cfg, item, updateType) {\n var group = item.getContainer(); // 这里不传 cfg 参数是因为 cfg.style 需要最后覆盖样式\n\n var defaultStyle = this.getOptions({}).style;\n var path = this.getPath(cfg); // 下面这些属性需要覆盖默认样式与目前样式,但若在 cfg 中有指定则应该被 cfg 的相应配置覆盖。\n\n var strokeStyle = {\n stroke: cfg.color,\n path: path\n }; // 与 getShapeStyle 不同在于,update 时需要获取到当前的 style 进行融合。即新传入的配置项中没有涉及的属性,保留当前的配置。\n\n var keyShape = item.get('keyShape');\n var style = Object(esm[\"mix\"])({}, defaultStyle, keyShape.attr(), strokeStyle);\n style = Object(esm[\"mix\"])(style, cfg.style);\n this.updateShape(cfg, item, style, true, updateType);\n this.updateLinkPoints(cfg, group);\n },\n\n /**\n * 更新linkPoints\n * @param {Object} cfg 节点数据配置项\n * @param {Group} group Item所在的group\n */\n updateLinkPoints: function updateLinkPoints(cfg, group) {\n var defaultLinkPoints = this.getOptions({}).linkPoints;\n var markLeft = group['shapeMap']['link-point-left'] || group.find(function (element) {\n return element.get('className') === 'link-point-left';\n });\n var markRight = group['shapeMap']['link-point-right'] || group.find(function (element) {\n return element.get('className') === 'link-point-right';\n });\n var markTop = group['shapeMap']['link-point-top'] || group.find(function (element) {\n return element.get('className') === 'link-point-top';\n });\n var markLeftBottom = group['shapeMap']['link-point-left-bottom'] || group.find(function (element) {\n return element.get('className') === 'link-point-left-bottom';\n });\n var markRightBottom = group['shapeMap']['link-point-left-bottom'] || group.find(function (element) {\n return element.get('className') === 'link-point-right-bottom';\n });\n var currentLinkPoints = defaultLinkPoints;\n var existLinkPoint = markLeft || markRight || markTop || markLeftBottom || markRightBottom;\n\n if (existLinkPoint) {\n currentLinkPoints = existLinkPoint.attr();\n }\n\n var linkPoints = Object(esm[\"mix\"])({}, currentLinkPoints, cfg.linkPoints);\n var markFill = linkPoints.fill,\n markStroke = linkPoints.stroke,\n borderWidth = linkPoints.lineWidth;\n var markSize = linkPoints.size / 2;\n if (!markSize) markSize = linkPoints.r;\n\n var _a = cfg.linkPoints ? cfg.linkPoints : {\n left: undefined,\n right: undefined,\n top: undefined,\n leftBottom: undefined,\n rightBottom: undefined\n },\n left = _a.left,\n right = _a.right,\n top = _a.top,\n leftBottom = _a.leftBottom,\n rightBottom = _a.rightBottom;\n\n var size = this.getSize(cfg);\n var outerR = size[0];\n var styles = {\n r: markSize,\n fill: markFill,\n stroke: markStroke,\n lineWidth: borderWidth\n };\n var x = Math.cos((18 + 72 * 0) / 180 * Math.PI) * outerR;\n var y = Math.sin((18 + 72 * 0) / 180 * Math.PI) * outerR;\n\n if (markRight) {\n if (!right && right !== undefined) {\n markRight.remove();\n delete group['shapeMap']['link-point-right'];\n } else {\n markRight.attr(Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, styles), {\n x: x,\n y: -y\n }));\n }\n } else if (right) {\n group['shapeMap']['link-point-right'] = group.addShape('circle', {\n attrs: Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, styles), {\n x: x,\n y: -y\n }),\n className: 'link-point-right',\n name: 'link-point-right',\n isAnchorPoint: true\n });\n }\n\n x = Math.cos((18 + 72 * 1) / 180 * Math.PI) * outerR;\n y = Math.sin((18 + 72 * 1) / 180 * Math.PI) * outerR;\n\n if (markTop) {\n if (!top && top !== undefined) {\n markTop.remove();\n delete group['shapeMap']['link-point-top'];\n } else {\n markTop.attr(Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, styles), {\n x: x,\n y: -y\n }));\n }\n } else if (top) {\n group['shapeMap']['link-point-top'] = group.addShape('circle', {\n attrs: Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, styles), {\n x: x,\n y: -y\n }),\n className: 'link-point-top',\n name: 'link-point-top',\n isAnchorPoint: true\n });\n }\n\n x = Math.cos((18 + 72 * 2) / 180 * Math.PI) * outerR;\n y = Math.sin((18 + 72 * 2) / 180 * Math.PI) * outerR;\n\n if (markLeft) {\n if (!left && left !== undefined) {\n markLeft.remove();\n delete group['shapeMap']['link-point-left'];\n } else {\n markLeft.attr(Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, styles), {\n x: x,\n y: -y\n }));\n }\n } else if (left) {\n group['shapeMap']['link-point-left'] = group.addShape('circle', {\n attrs: Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, styles), {\n x: x,\n y: -y\n }),\n className: 'link-point-left',\n name: 'link-point-left',\n isAnchorPoint: true\n });\n }\n\n x = Math.cos((18 + 72 * 3) / 180 * Math.PI) * outerR;\n y = Math.sin((18 + 72 * 3) / 180 * Math.PI) * outerR;\n\n if (markLeftBottom) {\n if (!leftBottom && leftBottom !== undefined) {\n markLeftBottom.remove();\n delete group['shapeMap']['link-point-left-bottom'];\n } else {\n markLeftBottom.attr(Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, styles), {\n x: x,\n y: -y\n }));\n }\n } else if (leftBottom) {\n group['shapeMap']['link-point-left-bottom'] = group.addShape('circle', {\n attrs: Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, styles), {\n x: x,\n y: -y\n }),\n className: 'link-point-left-bottom',\n name: 'link-point-left-bottom',\n isAnchorPoint: true\n });\n }\n\n x = Math.cos((18 + 72 * 4) / 180 * Math.PI) * outerR;\n y = Math.sin((18 + 72 * 4) / 180 * Math.PI) * outerR;\n\n if (markRightBottom) {\n if (!rightBottom && rightBottom !== undefined) {\n markLeftBottom.remove();\n delete group['shapeMap']['link-point-right-bottom'];\n } else {\n markRightBottom.attr(Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, styles), {\n x: x,\n y: -y\n }));\n }\n } else if (rightBottom) {\n group['shapeMap']['link-point-right-bottom'] = group.addShape('circle', {\n attrs: Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, styles), {\n x: x,\n y: -y\n }),\n className: 'link-point-right-bottom',\n name: 'link-point-right-bottom',\n isAnchorPoint: true\n });\n }\n }\n}, 'single-node');\n// CONCATENATED MODULE: ./node_modules/@antv/g6-element/es/nodes/donut.js\n\n\n\nvar donut_defaultSubjectColors = util.defaultSubjectColors; // 饼图节点\n\nregisterNode('donut', {\n // 自定义节点时的配置\n options: {\n size: BaseGlobal.defaultNode.size,\n style: {\n x: 0,\n y: 0,\n stroke: BaseGlobal.defaultNode.style.stroke,\n fill: BaseGlobal.defaultNode.style.fill,\n lineWidth: BaseGlobal.defaultNode.style.lineWidth\n },\n labelCfg: {\n style: {\n fill: BaseGlobal.nodeLabel.style.fill,\n fontSize: BaseGlobal.nodeLabel.style.fontSize,\n fontFamily: BaseGlobal.windowFontFamily\n }\n },\n // 节点上左右上下四个方向上的链接circle配置\n linkPoints: {\n top: false,\n right: false,\n bottom: false,\n left: false,\n // circle的大小\n size: BaseGlobal.defaultNode.linkPoints.size,\n lineWidth: BaseGlobal.defaultNode.linkPoints.lineWidth,\n fill: BaseGlobal.defaultNode.linkPoints.fill,\n stroke: BaseGlobal.defaultNode.linkPoints.stroke\n },\n // 节点中icon配置\n icon: {\n // 是否显示icon,值为 false 则不渲染icon\n show: false,\n // icon的地址,字符串类型\n img: 'https://gw.alipayobjects.com/zos/bmw-prod/5d015065-8505-4e7a-baec-976f81e3c41d.svg',\n width: 20,\n height: 20\n },\n stateStyles: Object(tslib_es6[\"__assign\"])({}, BaseGlobal.nodeStateStyles)\n },\n shapeType: 'circle',\n // 文本位置\n labelPosition: 'center',\n drawShape: function drawShape(cfg, group) {\n var _a = (this.mergeStyle || this.getOptions(cfg)).icon,\n defaultIcon = _a === void 0 ? {} : _a;\n var style = this.getShapeStyle(cfg);\n var icon = Object(esm[\"deepMix\"])({}, defaultIcon, cfg.icon);\n var keyShape = group.addShape('circle', {\n attrs: style,\n className: this.type + \"-keyShape\",\n draggable: true,\n name: this.type + \"-keyShape\"\n });\n group['shapeMap'][this.type + \"-keyShape\"] = keyShape;\n var width = icon.width,\n height = icon.height,\n show = icon.show,\n text = icon.text;\n\n if (show) {\n if (text) {\n group['shapeMap'][this.type + \"-icon\"] = group.addShape('text', {\n attrs: Object(tslib_es6[\"__assign\"])({\n x: 0,\n y: 0,\n fontSize: 12,\n fill: '#000',\n stroke: '#000',\n textBaseline: 'middle',\n textAlign: 'center'\n }, icon),\n className: this.type + \"-icon\",\n name: this.type + \"-icon\",\n draggable: true\n });\n } else {\n group['shapeMap'][this.type + \"-icon\"] = group.addShape('image', {\n attrs: Object(tslib_es6[\"__assign\"])({\n x: -width / 2,\n y: -height / 2\n }, icon),\n className: this.type + \"-icon\",\n name: this.type + \"-icon\",\n draggable: true\n });\n }\n }\n\n var donutR = keyShape.attr('r');\n var innerR = 0.6 * donutR; // 甜甜圈的内环半径\n\n var arcR = (donutR + innerR) / 2; // 内环半径与外环半径的平均值\n\n var _b = cfg,\n _c = _b.donutAttrs,\n donutAttrs = _c === void 0 ? {} : _c,\n _d = _b.donutColorMap,\n donutColorMap = _d === void 0 ? {} : _d;\n var attrNum = Object.keys(donutAttrs).length;\n\n if (donutAttrs && attrNum > 1) {\n var attrs_1 = [];\n var totalValue_1 = 0;\n Object.keys(donutAttrs).forEach(function (name) {\n var value = donutAttrs[name] || 0;\n if (!Object(esm[\"isNumber\"])(value)) return;\n attrs_1.push({\n key: name,\n value: value,\n color: donutColorMap[name]\n });\n totalValue_1 += value;\n });\n\n if (totalValue_1) {\n var lineWidth_1 = donutR - innerR;\n\n if (attrNum === 1) {\n group['shapeMap']['fan-shape-0'] = group.addShape('circle', {\n attrs: {\n r: arcR,\n x: 0,\n y: 0,\n stroke: attrs_1[0].color || donut_defaultSubjectColors[0],\n lineWidth: lineWidth_1\n },\n name: \"fan-shape-0\"\n });\n return;\n }\n\n var arcBegin_1 = [arcR, 0];\n var beginAngle_1 = 0;\n attrs_1.forEach(function (attr, i) {\n var percent = attr.value / totalValue_1;\n if (percent < 0.001) return;\n if (percent > 0.999) percent = 1;\n\n if (percent === 1) {\n group['shapeMap'][\"fan-shape-\" + i] = group.addShape('circle', {\n attrs: {\n r: arcR,\n x: 0,\n y: 0,\n stroke: attr.color || donut_defaultSubjectColors[i % donut_defaultSubjectColors.length],\n lineWidth: lineWidth_1\n },\n name: \"fan-shape-\" + i\n });\n return;\n }\n\n attr.percent = percent;\n attr.angle = percent * Math.PI * 2;\n attr.beginAgnle = beginAngle_1;\n beginAngle_1 += attr.angle;\n attr.endAngle = beginAngle_1;\n attr.arcBegin = arcBegin_1;\n attr.arcEnd = [arcR * Math.cos(attr.endAngle), -arcR * Math.sin(attr.endAngle)];\n var isBig = attr.angle > Math.PI ? 1 : 0;\n var path = [['M', attr.arcBegin[0], attr.arcBegin[1]], ['A', arcR, arcR, 0, isBig, 0, attr.arcEnd[0], attr.arcEnd[1]], ['L', attr.arcEnd[0], attr.arcEnd[1]]];\n group['shapeMap'][\"fan-shape-\" + i] = group.addShape('path', {\n attrs: {\n path: path,\n lineWidth: lineWidth_1,\n stroke: attr.color || donut_defaultSubjectColors[i % donut_defaultSubjectColors.length]\n },\n name: \"fan-shape-\" + i\n });\n arcBegin_1 = attr.arcEnd;\n });\n }\n }\n\n this.drawLinkPoints(cfg, group);\n return keyShape;\n },\n update: undefined\n}, 'circle');\n// CONCATENATED MODULE: ./node_modules/@antv/g6-element/es/nodes/index.js\n\n\n\n\n\n\n\n // import './image';\n// CONCATENATED MODULE: ./node_modules/@antv/g6-element/es/edges/polyline-util.js\nvar getBBoxFromPoint = function getBBoxFromPoint(point) {\n var x = point.x,\n y = point.y;\n return {\n x: x,\n y: y,\n centerX: x,\n centerY: y,\n minX: x,\n minY: y,\n maxX: x,\n maxY: y,\n height: 0,\n width: 0\n };\n};\nvar getBBoxFromPoints = function getBBoxFromPoints(points) {\n if (points === void 0) {\n points = [];\n }\n\n var xs = [];\n var ys = [];\n points.forEach(function (p) {\n xs.push(p.x);\n ys.push(p.y);\n });\n var minX = Math.min.apply(Math, xs);\n var maxX = Math.max.apply(Math, xs);\n var minY = Math.min.apply(Math, ys);\n var maxY = Math.max.apply(Math, ys);\n return {\n centerX: (minX + maxX) / 2,\n centerY: (minY + maxY) / 2,\n maxX: maxX,\n maxY: maxY,\n minX: minX,\n minY: minY,\n height: maxY - minY,\n width: maxX - minX\n };\n};\nvar isBBoxesOverlapping = function isBBoxesOverlapping(b1, b2) {\n return Math.abs(b1.centerX - b2.centerX) * 2 < b1.width + b2.width && Math.abs(b1.centerY - b2.centerY) * 2 < b1.height + b2.height;\n};\nvar filterConnectPoints = function filterConnectPoints(points) {\n // pre-process: remove duplicated points\n var result = [];\n var pointsMap = {};\n var pointsLength = points.length;\n\n for (var i = pointsLength - 1; i >= 0; i--) {\n var p = points[i];\n p.id = p.x + \"|||\" + p.y;\n pointsMap[p.id] = p;\n result.push(p);\n }\n\n return result;\n};\nvar simplifyPolyline = function simplifyPolyline(points) {\n return filterConnectPoints(points);\n};\nvar getSimplePolyline = function getSimplePolyline(sPoint, tPoint) {\n return [sPoint, {\n x: sPoint.x,\n y: tPoint.y\n }, tPoint];\n};\nvar getExpandedBBox = function getExpandedBBox(bbox, offset) {\n if (bbox.width || bbox.height) {\n return {\n centerX: bbox.centerX,\n centerY: bbox.centerY,\n minX: bbox.minX - offset,\n minY: bbox.minY - offset,\n maxX: bbox.maxX + offset,\n maxY: bbox.maxY + offset,\n height: bbox.height + 2 * offset,\n width: bbox.width + 2 * offset\n };\n } // when it is a point\n\n\n return bbox;\n};\nvar isHorizontalPort = function isHorizontalPort(port, bbox) {\n var dx = Math.abs(port.x - bbox.centerX);\n var dy = Math.abs(port.y - bbox.centerY);\n if (dx === 0 && dy === 0) return 0;\n return dx / bbox.width > dy / bbox.height;\n};\nvar getExpandedBBoxPoint = function getExpandedBBoxPoint(bbox, // 将原来节点 bbox 扩展了 offset 后的 bbox,且被 gridSize 格式化\npoint, // 被 gridSize 格式化后的位置(anchorPoint)\nanotherPoint) {\n var isHorizontal = isHorizontalPort(point, bbox);\n\n if (isHorizontal === 0) {\n // 说明锚点是节点中心,linkCenter: true。需要根据两个节点的相对关系决定方向\n var x = bbox.centerX;\n var y = bbox.centerY;\n\n if (anotherPoint.y < point.y) {\n // 另一端在左上/右上方时,总是从上方走\n y = bbox.minY;\n } else if (anotherPoint.x > point.x) {\n // 另一端在右下方,往右边走\n x = bbox.maxX;\n } else if (anotherPoint.x < point.x) {\n // 另一端在左下方,往左边走\n x = bbox.minX;\n } else if (anotherPoint.x === point.x) {\n // 另一段在正下方,往下走\n y = bbox.maxY;\n }\n\n return {\n x: x,\n y: y\n };\n }\n\n if (isHorizontal) {\n return {\n x: point.x > bbox.centerX ? bbox.maxX : bbox.minX,\n y: point.y\n };\n }\n\n return {\n x: point.x,\n y: point.y > bbox.centerY ? bbox.maxY : bbox.minY\n };\n};\n/**\n *\n * @param b1\n * @param b2\n */\n\nvar mergeBBox = function mergeBBox(b1, b2) {\n var minX = Math.min(b1.minX, b2.minX);\n var minY = Math.min(b1.minY, b2.minY);\n var maxX = Math.max(b1.maxX, b2.maxX);\n var maxY = Math.max(b1.maxY, b2.maxY);\n return {\n centerX: (minX + maxX) / 2,\n centerY: (minY + maxY) / 2,\n minX: minX,\n minY: minY,\n maxX: maxX,\n maxY: maxY,\n height: maxY - minY,\n width: maxX - minX\n };\n};\nvar getPointsFromBBox = function getPointsFromBBox(bbox) {\n // anticlockwise\n // const { minX, minY, maxX, maxY } = bbox;\n return [{\n x: bbox.minX,\n y: bbox.minY\n }, {\n x: bbox.maxX,\n y: bbox.minY\n }, {\n x: bbox.maxX,\n y: bbox.maxY\n }, {\n x: bbox.minX,\n y: bbox.maxY\n }];\n};\nvar isPointOutsideBBox = function isPointOutsideBBox(point, bbox) {\n var x = point.x,\n y = point.y;\n return x < bbox.minX || x > bbox.maxX || y < bbox.minY || y > bbox.maxY;\n};\nvar getBBoxXCrossPoints = function getBBoxXCrossPoints(bbox, x) {\n if (x < bbox.minX || x > bbox.maxX) {\n return [];\n }\n\n return [{\n x: x,\n y: bbox.minY\n }, {\n x: x,\n y: bbox.maxY\n }];\n};\nvar getBBoxYCrossPoints = function getBBoxYCrossPoints(bbox, y) {\n if (y < bbox.minY || y > bbox.maxY) {\n return [];\n }\n\n return [{\n x: bbox.minX,\n y: y\n }, {\n x: bbox.maxX,\n y: y\n }];\n};\nvar getBBoxCrossPointsByPoint = function getBBoxCrossPointsByPoint(bbox, point) {\n return getBBoxXCrossPoints(bbox, point.x).concat(getBBoxYCrossPoints(bbox, point.y));\n};\n/**\n * 曼哈顿距离\n */\n\nvar polyline_util_distance = function distance(p1, p2) {\n return Math.abs(p1.x - p2.x) + Math.abs(p1.y - p2.y);\n};\n/**\n * 如果 points 中的一个节点 x 与 p 相等,则消耗 -2。y 同\n * 即优先选择和 points 在同一水平线 / 垂直线上的点\n */\n// eslint-disable-next-line @typescript-eslint/naming-convention\n\nvar _costByPoints = function _costByPoints(p, points) {\n var offset = -2;\n var result = 0;\n points.forEach(function (point) {\n if (point) {\n if (p.x === point.x) {\n result += offset;\n }\n\n if (p.y === point.y) {\n result += offset;\n }\n }\n });\n return result;\n};\n/**\n * ps 经过 p 到 pt 的距离,减去其他路过节点造成的消耗\n */\n\nvar heuristicCostEstimate = function heuristicCostEstimate(p, ps, pt, source, target) {\n return polyline_util_distance(p, ps) + polyline_util_distance(p, pt) + _costByPoints(p, [ps, pt, source, target]);\n};\nvar reconstructPath = function reconstructPath(pathPoints, pointById, cameFrom, currentId, iterator) {\n if (iterator === void 0) {\n iterator = 0;\n }\n\n pathPoints.unshift(pointById[currentId]);\n\n if (cameFrom[currentId] && cameFrom[currentId] !== currentId && iterator <= 100) {\n reconstructPath(pathPoints, pointById, cameFrom, cameFrom[currentId], iterator + 1);\n }\n};\n/**\n * 从 arr 中删去 item\n */\n\nvar removeFrom = function removeFrom(arr, item) {\n var index = arr.indexOf(item);\n\n if (index > -1) {\n arr.splice(index, 1);\n }\n};\nvar isSegmentsIntersected = function isSegmentsIntersected(p0, p1, p2, p3) {\n var v1x = p2.x - p0.x;\n var v1y = p2.y - p0.y;\n var v2x = p3.x - p0.x;\n var v2y = p3.y - p0.y;\n var v3x = p2.x - p1.x;\n var v3y = p2.y - p1.y;\n var v4x = p3.x - p1.x;\n var v4y = p3.y - p1.y;\n var pd1 = v1x * v2y - v1y * v2x;\n var pd2 = v3x * v4y - v3y * v4x;\n var pd3 = v1x * v3y - v1y * v3x;\n var pd4 = v2x * v4y - v2y * v4x;\n return pd1 * pd2 <= 0 && pd3 * pd4 <= 0;\n};\nvar isSegmentCrossingBBox = function isSegmentCrossingBBox(p1, p2, bbox) {\n if (bbox.width || bbox.height) {\n var _a = getPointsFromBBox(bbox),\n pa = _a[0],\n pb = _a[1],\n pc = _a[2],\n pd = _a[3];\n\n return isSegmentsIntersected(p1, p2, pa, pb) || isSegmentsIntersected(p1, p2, pa, pd) || isSegmentsIntersected(p1, p2, pb, pc) || isSegmentsIntersected(p1, p2, pc, pd);\n }\n\n return false;\n};\n/**\n * 在 points 中找到满足 x 或 y 和 point 的 x 或 y 相等,且与 point 连线不经过 bbox1 与 bbox2 的点\n */\n\nvar getNeighborPoints = function getNeighborPoints(points, point, bbox1, bbox2) {\n var neighbors = [];\n points.forEach(function (p) {\n if (p === point) return;\n\n if (p.x === point.x || p.y === point.y) {\n if (isSegmentCrossingBBox(p, point, bbox1) || isSegmentCrossingBBox(p, point, bbox2)) return;\n neighbors.push(p);\n }\n });\n return filterConnectPoints(neighbors);\n};\nvar polyline_util_pathFinder = function pathFinder(points, start, goal, sBBox, tBBox, os, ot) {\n // A-Star Algorithm\n var closedSet = [];\n var openSet = [start];\n var cameFrom = {};\n var gScore = {}; // all default values are Infinity\n\n var fScore = {}; // all default values are Infinity\n\n gScore[start.id] = 0;\n fScore[start.id] = heuristicCostEstimate(start, goal, start);\n var pointById = {};\n points.forEach(function (p) {\n pointById[p.id] = p;\n });\n var current, lowestFScore;\n\n while (openSet.length) {\n current = undefined;\n lowestFScore = Infinity; // 找到 openSet 中 fScore 最小的点\n\n openSet.forEach(function (p) {\n if (fScore[p.id] <= lowestFScore) {\n lowestFScore = fScore[p.id];\n current = p;\n }\n }); // 若 openSet 中 fScore 最小的点就是终点\n\n if (current === goal) {\n // ending condition\n var pathPoints = [];\n reconstructPath(pathPoints, pointById, cameFrom, goal.id);\n return pathPoints;\n }\n\n removeFrom(openSet, current);\n closedSet.push(current);\n getNeighborPoints(points, current, sBBox, tBBox).forEach(function (neighbor) {\n if (closedSet.indexOf(neighbor) !== -1) {\n return;\n }\n\n if (openSet.indexOf(neighbor) === -1) {\n openSet.push(neighbor);\n }\n\n var tentativeGScore = fScore[current.id] + polyline_util_distance(current, neighbor); // + distance(neighbor, goal);\n\n if (gScore[neighbor.id] && tentativeGScore >= gScore[neighbor.id]) {\n return;\n }\n\n cameFrom[neighbor.id] = current.id;\n gScore[neighbor.id] = tentativeGScore;\n fScore[neighbor.id] = gScore[neighbor.id] + heuristicCostEstimate(neighbor, goal, start, os, ot);\n });\n } // throw new Error('Cannot find path');\n\n\n return [start, goal];\n};\nvar isBending = function isBending(p0, p1, p2) {\n return !(p0.x === p1.x && p1.x === p2.x || p0.y === p1.y && p1.y === p2.y);\n};\nvar getBorderRadiusPoints = function getBorderRadiusPoints(p0, p1, p2, r) {\n var d0 = polyline_util_distance(p0, p1);\n var d1 = polyline_util_distance(p2, p1);\n\n if (d0 < r) {\n r = d0;\n }\n\n if (d1 < r) {\n r = d1;\n }\n\n var ps = {\n x: p1.x - r / d0 * (p1.x - p0.x),\n y: p1.y - r / d0 * (p1.y - p0.y)\n };\n var pt = {\n x: p1.x - r / d1 * (p1.x - p2.x),\n y: p1.y - r / d1 * (p1.y - p2.y)\n };\n return [ps, pt];\n};\nvar getPathWithBorderRadiusByPolyline = function getPathWithBorderRadiusByPolyline(points, borderRadius) {\n var pathSegments = [];\n var startPoint = points[0];\n pathSegments.push(\"M\" + startPoint.x + \" \" + startPoint.y);\n points.forEach(function (p, i) {\n var p1 = points[i + 1];\n var p2 = points[i + 2];\n\n if (p1 && p2) {\n if (isBending(p, p1, p2)) {\n var _a = getBorderRadiusPoints(p, p1, p2, borderRadius),\n ps = _a[0],\n pt = _a[1];\n\n pathSegments.push(\"L\" + ps.x + \" \" + ps.y);\n pathSegments.push(\"Q\" + p1.x + \" \" + p1.y + \" \" + pt.x + \" \" + pt.y);\n pathSegments.push(\"L\" + pt.x + \" \" + pt.y);\n } else {\n pathSegments.push(\"L\" + p1.x + \" \" + p1.y);\n }\n } else if (p1) {\n pathSegments.push(\"L\" + p1.x + \" \" + p1.y);\n }\n });\n return pathSegments.join('');\n};\nvar getPolylinePoints = function getPolylinePoints(start, end, sNode, tNode, offset) {\n var sBBox, tBBox;\n\n if (!sNode || !sNode.getType()) {\n sBBox = getBBoxFromPoint(start);\n } else if (sNode.getType() === 'combo') {\n var sNodeKeyShape = sNode.getKeyShape();\n sBBox = sNodeKeyShape.getCanvasBBox() || getBBoxFromPoint(start);\n sBBox.centerX = (sBBox.minX + sBBox.maxX) / 2;\n sBBox.centerY = (sBBox.minY + sBBox.maxY) / 2;\n } else {\n sBBox = sNode.getBBox();\n }\n\n if (!tNode || !tNode.getType()) {\n tBBox = getBBoxFromPoint(end);\n } else if (tNode.getType() === 'combo') {\n var tKeyShapeBBox = tNode.getKeyShape().getBBox();\n\n if (tKeyShapeBBox) {\n var _a = tNode.getModel(),\n tx = _a.x,\n ty = _a.y;\n\n tBBox = {\n x: tx,\n y: ty,\n width: tKeyShapeBBox.width,\n height: tKeyShapeBBox.height,\n minX: tKeyShapeBBox.minX + tx,\n maxX: tKeyShapeBBox.maxX + tx,\n minY: tKeyShapeBBox.minY + ty,\n maxY: tKeyShapeBBox.maxY + ty\n };\n tBBox.centerX = (tBBox.minX + tBBox.maxX) / 2;\n tBBox.centerY = (tBBox.minY + tBBox.maxY) / 2;\n } else {\n tBBox = getBBoxFromPoint(end);\n }\n } else {\n tBBox = tNode && tNode.getBBox();\n } // if (isBBoxesOverlapping(sBBox, tBBox)) {\n // // source and target nodes are overlapping\n // return simplifyPolyline(getSimplePolyline(start, end));\n // }\n\n\n var sxBBox = getExpandedBBox(sBBox, offset);\n var txBBox = getExpandedBBox(tBBox, offset); // if (isBBoxesOverlapping(sxBBox, txBBox)) {\n // // the expanded bounding boxes of source and target nodes are overlapping\n // return simplifyPolyline(getSimplePolyline(start, end));\n // }\n\n var sPoint = getExpandedBBoxPoint(sxBBox, start, end);\n var tPoint = getExpandedBBoxPoint(txBBox, end, start);\n var lineBBox = getBBoxFromPoints([sPoint, tPoint]);\n var sMixBBox = mergeBBox(sxBBox, lineBBox);\n var tMixBBox = mergeBBox(txBBox, lineBBox);\n var connectPoints = [];\n connectPoints = connectPoints.concat(getPointsFromBBox(sMixBBox)).concat(getPointsFromBBox(tMixBBox));\n var centerPoint = {\n x: (start.x + end.x) / 2,\n y: (start.y + end.y) / 2\n };\n [lineBBox, sMixBBox, tMixBBox].forEach(function (bbox) {\n connectPoints = connectPoints.concat(getBBoxCrossPointsByPoint(bbox, centerPoint).filter(function (p) {\n return isPointOutsideBBox(p, sxBBox) && isPointOutsideBBox(p, txBBox);\n }));\n });\n [{\n x: sPoint.x,\n y: tPoint.y\n }, {\n x: tPoint.x,\n y: sPoint.y\n }].forEach(function (p) {\n // impossible!!\n if (isPointOutsideBBox(p, sxBBox) && isPointOutsideBBox(p, txBBox) // &&\n // isPointInsideBBox(p, sMixBBox) && isPointInsideBBox(p, tMixBBox)\n ) {\n connectPoints.push(p);\n }\n });\n connectPoints.unshift(sPoint);\n connectPoints.push(tPoint); // filter out dulplicated points in connectPoints\n\n connectPoints = filterConnectPoints(connectPoints); // , sxBBox, txBBox, outerBBox\n\n var pathPoints = polyline_util_pathFinder(connectPoints, sPoint, tPoint, sBBox, tBBox, start, end);\n pathPoints.unshift(start);\n pathPoints.push(end);\n return simplifyPolyline(pathPoints);\n};\n// CONCATENATED MODULE: ./node_modules/@antv/g6-element/es/edges/router.js\n/**\n * 通过配置不同的 costFunc, distFunc, constraints 可以得到不同效果的 router\n * generalRouter: 不限制搜索时的移动方向,避开障碍即可\n * orthogonal: 线必须沿着竖直或水平方向(4个方向)\n * octolinearRouter: 线沿着竖直、水平、对角线方向(8个方向)\n */\n\n\n\n\nvar manhattanDist = function manhattanDist(p1, p2) {\n return Math.abs(p1.x - p2.x) + Math.abs(p1.y - p2.y);\n};\n\nvar eucliDist = function eucliDist(p1, p2) {\n return Math.sqrt(Math.pow(p1.x - p2.x, 2) + Math.pow(p1.y - p2.y, 2));\n};\n\nvar straightPath = function straightPath(start, end) {\n // console.warn('fallbackRoute: straight path');\n return [start, end];\n};\n\nvar router_simplePolyline = function simplePolyline(start, end, startNode, endNode, cfg) {\n return simplifyPolyline(getPolylinePoints(start, end, startNode, endNode, cfg.offset));\n}; // getPolylinePoints\n\n\nvar router_defaultCfg = {\n offset: 20,\n maxAllowedDirectionChange: Math.PI / 2,\n maximumLoops: 2000,\n gridSize: 10,\n directions: [{\n stepX: 1,\n stepY: 0\n }, {\n stepX: -1,\n stepY: 0\n }, {\n stepX: 0,\n stepY: 1\n }, {\n stepX: 0,\n stepY: -1\n } // top\n ],\n\n get penalties() {\n return {\n 0: 0,\n 45: this.gridSize / 2,\n 90: this.gridSize / 2\n };\n },\n\n distFunc: manhattanDist,\n fallbackRoute: router_simplePolyline\n};\nvar octolinearCfg = {\n maxAllowedDirectionChange: Math.PI / 4,\n // 8 个方向: 上下左右 + 45度斜线方向\n directions: [{\n stepX: 1,\n stepY: 0\n }, {\n stepX: 1,\n stepY: 1\n }, {\n stepX: 0,\n stepY: 1\n }, {\n stepX: -1,\n stepY: 1\n }, {\n stepX: -1,\n stepY: 0\n }, {\n stepX: -1,\n stepY: -1\n }, {\n stepX: 0,\n stepY: -1\n }, {\n stepX: 1,\n stepY: -1\n }],\n distFunc: eucliDist,\n fallbackRoute: straightPath\n};\n\nvar router_pos2GridIx = function pos2GridIx(pos, gridSize) {\n var gridIx = Math.round(Math.abs(pos / gridSize));\n var sign = pos < 0 ? -1 : 1;\n return gridIx < 0 ? 0 : sign * gridIx;\n};\n\nvar router_getObstacleMap = function getObstacleMap(items, gridSize, offset) {\n var map = {};\n items.forEach(function (item) {\n // create-edge 时,当边类型为 polyline 时 endNode 为 null\n if (!item) return;\n var bbox = getExpandedBBox(item.getBBox(), offset);\n\n for (var x = router_pos2GridIx(bbox.minX, gridSize); x <= router_pos2GridIx(bbox.maxX, gridSize); x += 1) {\n for (var y = router_pos2GridIx(bbox.minY, gridSize); y <= router_pos2GridIx(bbox.maxY, gridSize); y += 1) {\n map[x + \"|||\" + y] = true;\n }\n }\n });\n return map;\n};\n/**\n * 方向角:计算从 p1 到 p2 的射线与水平线形成的夹角度数(顺时针从右侧0°转到该射线的角度)\n * @param p1 PolyPoint\n * @param p2 PolyPoint\n */\n\n\nvar getDirectionAngle = function getDirectionAngle(p1, p2) {\n var deltaX = p2.x - p1.x;\n var deltaY = p2.y - p1.y;\n\n if (deltaX || deltaY) {\n return Math.atan2(deltaY, deltaX);\n }\n\n return 0;\n};\n/**\n * 方向角的改变,取小于180度角\n * @param angle1\n * @param angle2\n */\n\n\nvar getAngleDiff = function getAngleDiff(angle1, angle2) {\n var directionChange = Math.abs(angle1 - angle2);\n return directionChange > Math.PI ? 2 * Math.PI - directionChange : directionChange; // return directionChange > 180 ? 360 - directionChange : directionChange;\n}; // Path finder //\n\n\nvar estimateCost = function estimateCost(from, endPoints, distFunc) {\n var min = Infinity;\n\n for (var i = 0, len = endPoints.length; i < len; i++) {\n var cost = distFunc(from, endPoints[i]);\n\n if (cost < min) {\n min = cost;\n }\n }\n\n return min;\n}; // 计算考虑 offset 后的 BBox 上的连接点\n\n\nvar router_getBoxPoints = function getBoxPoints(point, // 被 gridSize 格式化后的位置(anchorPoint)\noriPoint, // 未被 gridSize 格式化的位置(anchorPoint)\nnode, // 原始节点,用于获取 bbox\nanotherPoint, // 另一端被 gridSize 格式化后的位置\ncfg) {\n var points = []; // create-edge 生成边的过程中,endNode 为 null\n\n if (!node) {\n return [point];\n }\n\n var directions = cfg.directions,\n offset = cfg.offset;\n var bbox = node.getBBox();\n var isInside = oriPoint.x > bbox.minX && oriPoint.x < bbox.maxX && oriPoint.y > bbox.minY && oriPoint.y < bbox.maxY;\n var expandBBox = getExpandedBBox(bbox, offset);\n\n for (var i in expandBBox) {\n expandBBox[i] = router_pos2GridIx(expandBBox[i], cfg.gridSize);\n }\n\n if (isInside) {\n // 如果 anchorPoint 在节点内部,允许第一段线穿过节点\n for (var _i = 0, directions_1 = directions; _i < directions_1.length; _i++) {\n var dir = directions_1[_i];\n var bounds = [[{\n x: expandBBox.minX,\n y: expandBBox.minY\n }, {\n x: expandBBox.maxX,\n y: expandBBox.minY\n }], [{\n x: expandBBox.minX,\n y: expandBBox.minY\n }, {\n x: expandBBox.minX,\n y: expandBBox.maxY\n }], [{\n x: expandBBox.maxX,\n y: expandBBox.minY\n }, {\n x: expandBBox.maxX,\n y: expandBBox.maxY\n }], [{\n x: expandBBox.minX,\n y: expandBBox.maxY\n }, {\n x: expandBBox.maxX,\n y: expandBBox.maxY\n }]];\n\n for (var i = 0; i < 4; i++) {\n var boundLine = bounds[i];\n var insterctP_1 = util.getLineIntersect(point, {\n x: point.x + dir.stepX * expandBBox.width,\n y: point.y + dir.stepY * expandBBox.height\n }, boundLine[0], boundLine[1]);\n\n if (insterctP_1 && !isSegmentCrossingBBox(point, insterctP_1, bbox)) {\n insterctP_1.id = insterctP_1.x + \"|||\" + insterctP_1.y;\n points.push(insterctP_1);\n }\n }\n }\n\n return points;\n } // 如果 anchorPoint 在节点上,只有一个可选方向\n\n\n var insterctP = getExpandedBBoxPoint(expandBBox, point, anotherPoint);\n insterctP.id = insterctP.x + \"|||\" + insterctP.y;\n return [insterctP];\n};\n\nvar getDirectionChange = function getDirectionChange(current, neighbor, cameFrom, scaleStartPoint) {\n var directionAngle = getDirectionAngle(current, neighbor);\n\n if (!cameFrom[current.id]) {\n var startAngle = getDirectionAngle(scaleStartPoint, current);\n return getAngleDiff(startAngle, directionAngle);\n }\n\n var prevDirectionAngle = getDirectionAngle({\n x: cameFrom[current.id].x,\n y: cameFrom[current.id].y\n }, current);\n return getAngleDiff(prevDirectionAngle, directionAngle);\n};\n\nvar router_getControlPoints = function getControlPoints(current, cameFrom, scaleStartPoint, endPoint, startPoint, scaleEndPoint, gridSize) {\n var controlPoints = [endPoint];\n var currentId = current.id;\n var currentX = current.x;\n var currentY = current.y;\n var lastPoint = {\n x: currentX,\n y: currentY,\n id: currentId\n };\n\n if (getDirectionChange(lastPoint, scaleEndPoint, cameFrom, scaleStartPoint)) {\n // if (scaleEndPoint.x === endPoint.x && scaleEndPoint.y === endPoint.y)\n // controlPoints.unshift({\n // x: endPoint.x,\n // y: endPoint.y\n // })\n // else\n // controlPoints.unshift({\n // x: lastPoint.x * gridSize,\n // y: lastPoint.y * gridSize,\n // });\n controlPoints.unshift({\n x: scaleEndPoint.x === endPoint.x ? endPoint.x : lastPoint.x * gridSize,\n y: scaleEndPoint.y === endPoint.y ? endPoint.y : lastPoint.y * gridSize\n });\n }\n\n while (cameFrom[currentId] && cameFrom[currentId].id !== currentId) {\n var point = {\n x: currentX,\n y: currentY,\n id: currentId\n };\n var preId = cameFrom[currentId].id;\n var preX = cameFrom[currentId].x;\n var preY = cameFrom[currentId].y;\n var prePoint = {\n x: preX,\n y: preY,\n id: preId\n };\n var directionChange = getDirectionChange(prePoint, point, cameFrom, scaleStartPoint);\n\n if (directionChange) {\n // if (prePoint.x === point.x && prePoint.y === point.y)\n // controlPoints.unshift({\n // x: controlPoints[0].x,\n // y: controlPoints[0].y\n // })\n // else\n // controlPoints.unshift({\n // x: prePoint.x * gridSize,\n // y: prePoint.y * gridSize,\n // });\n controlPoints.unshift({\n x: prePoint.x === point.x ? controlPoints[0].x : prePoint.x * gridSize,\n y: prePoint.y === point.y ? controlPoints[0].y : prePoint.y * gridSize\n });\n }\n\n currentId = preId;\n currentX = preX;\n currentY = preY;\n } // 和startNode对齐\n\n\n var firstPoint = {\n x: currentX,\n y: currentY,\n id: currentId\n }; // if (firstPoint.x === scaleStartPoint.x && firstPoint.y === scaleStartPoint.y) {\n // controlPoints[0].x = startPoint.x;\n // controlPoints[0].y = startPoint.y;\n // }\n\n controlPoints[0].x = firstPoint.x === scaleStartPoint.x ? startPoint.x : controlPoints[0].x;\n controlPoints[0].y = firstPoint.y === scaleStartPoint.y ? startPoint.y : controlPoints[0].y;\n controlPoints.unshift(startPoint);\n return controlPoints;\n};\n\nvar router_pathFinder = function pathFinder(startPoint, endPoint, startNode, endNode, routerCfg) {\n if (isNaN(startPoint.x) || isNaN(endPoint.x)) return [];\n var cfg = Object(esm[\"deepMix\"])(router_defaultCfg, routerCfg);\n cfg.obstacles = cfg.obstacles || [];\n var gridSize = cfg.gridSize;\n var map = router_getObstacleMap(cfg.obstacles.concat([startNode, endNode]), gridSize, cfg.offset);\n var scaleStartPoint = {\n x: router_pos2GridIx(startPoint.x, gridSize),\n y: router_pos2GridIx(startPoint.y, gridSize)\n };\n var scaleEndPoint = {\n x: router_pos2GridIx(endPoint.x, gridSize),\n y: router_pos2GridIx(endPoint.y, gridSize)\n };\n startPoint.id = scaleStartPoint.x + \"|||\" + scaleStartPoint.y;\n endPoint.id = scaleEndPoint.x + \"|||\" + scaleEndPoint.y;\n var startPoints = router_getBoxPoints(scaleStartPoint, startPoint, startNode, scaleEndPoint, cfg);\n var endPoints = router_getBoxPoints(scaleEndPoint, endPoint, endNode, scaleStartPoint, cfg);\n startPoints.forEach(function (point) {\n delete map[point.id];\n });\n endPoints.forEach(function (point) {\n delete map[point.id];\n });\n var openSet = {};\n var closedSet = {};\n var cameFrom = {}; // 从起点到当前点已产生的 cost, default: Infinity\n\n var gScore = {}; // 起点经过当前点到达终点预估的 cost, default: Infinity\n\n var fScore = {}; // initialize\n\n for (var i = 0; i < startPoints.length; i++) {\n var firstStep = startPoints[i];\n openSet[firstStep.id] = firstStep; // cameFrom[firstStep.id] = startPoint.id;\n\n gScore[firstStep.id] = 0;\n fScore[firstStep.id] = estimateCost(firstStep, endPoints, cfg.distFunc);\n }\n\n var remainLoops = cfg.maximumLoops;\n var penalties = cfg.penalties;\n var current, curCost, direction, neighbor, neighborCost, costFromStart, directionChange;\n\n while (Object.keys(openSet).length > 0 && remainLoops > 0) {\n current = undefined;\n curCost = Infinity; // 找到 openSet 中 fScore 最小的点\n\n Object.keys(openSet).forEach(function (key) {\n var id = openSet[key].id;\n\n if (fScore[id] <= curCost) {\n curCost = fScore[id];\n current = openSet[id];\n }\n });\n if (!current) break; // 如果 fScore 最小的点就是终点\n\n if (endPoints.findIndex(function (point) {\n return point.x === current.x && point.y === current.y;\n }) > -1) {\n return router_getControlPoints(current, cameFrom, scaleStartPoint, endPoint, startPoint, scaleEndPoint, gridSize);\n }\n\n delete openSet[current.id];\n closedSet[current.id] = true; // 获取符合条件的下一步的候选连接点\n // 沿候选方向走一步\n\n for (var i = 0; i < cfg.directions.length; i++) {\n direction = cfg.directions[i];\n neighbor = {\n x: current.x + direction.stepX,\n y: current.y + direction.stepY,\n id: Math.round(current.x) + direction.stepX + \"|||\" + (Math.round(current.y) + direction.stepY)\n };\n if (closedSet[neighbor.id]) continue;\n directionChange = getDirectionChange(current, neighbor, cameFrom, scaleStartPoint);\n if (directionChange > cfg.maxAllowedDirectionChange) continue;\n if (map[neighbor.id]) continue; // 如果交叉则跳过\n // 将候选点加入 openSet, 并计算每个候选点的 cost\n\n if (!openSet[neighbor.id]) {\n openSet[neighbor.id] = neighbor;\n }\n\n neighborCost = cfg.distFunc(current, neighbor) + (isNaN(penalties[directionChange]) ? gridSize : penalties[directionChange]);\n costFromStart = gScore[current.id] + neighborCost;\n\n if (gScore[neighbor.id] && costFromStart >= gScore[neighbor.id]) {\n continue;\n }\n\n cameFrom[neighbor.id] = current;\n gScore[neighbor.id] = costFromStart;\n fScore[neighbor.id] = costFromStart + estimateCost(neighbor, endPoints, cfg.distFunc);\n }\n\n remainLoops -= 1;\n }\n\n return cfg.fallbackRoute(startPoint, endPoint, startNode, endNode, cfg);\n};\n// CONCATENATED MODULE: ./node_modules/@antv/g6-element/es/edges/polyline.js\n\n\n\n\n // 折线\n\nregisterEdge('polyline', {\n options: {\n color: BaseGlobal.defaultEdge.color,\n size: BaseGlobal.defaultEdge.size,\n style: {\n radius: 0,\n offset: 15,\n x: 0,\n y: 0,\n stroke: BaseGlobal.defaultEdge.style.stroke,\n lineAppendWidth: BaseGlobal.defaultEdge.style.lineAppendWidth\n },\n // 文本样式配置\n labelCfg: {\n style: {\n fill: BaseGlobal.edgeLabel.style.fill,\n fontSize: BaseGlobal.edgeLabel.style.fontSize,\n fontFamily: BaseGlobal.windowFontFamily\n }\n },\n routeCfg: {\n obstacles: [],\n maxAllowedDirectionChange: Math.PI,\n maximumLoops: 500,\n gridSize: 10 // 指定精度\n\n },\n stateStyles: Object(tslib_es6[\"__assign\"])({}, BaseGlobal.edgeStateStyles)\n },\n shapeType: 'polyline',\n // 文本位置\n labelPosition: 'center',\n drawShape: function drawShape(cfg, group) {\n var shapeStyle = this.getShapeStyle(cfg);\n if (shapeStyle.radius === 0) delete shapeStyle.radius;\n var keyShape = group.addShape('path', {\n className: 'edge-shape',\n name: 'edge-shape',\n attrs: shapeStyle\n });\n group['shapeMap']['edge-shape'] = keyShape;\n return keyShape;\n },\n getShapeStyle: function getShapeStyle(cfg) {\n var defaultStyle = this.options.style;\n var strokeStyle = {\n stroke: cfg.color\n };\n var style = Object(esm[\"mix\"])({}, defaultStyle, strokeStyle, cfg.style);\n cfg = this.getPathPoints(cfg);\n this.radius = style.radius;\n this.offset = style.offset;\n var startPoint = cfg.startPoint,\n endPoint = cfg.endPoint;\n var controlPoints = this.getControlPoints(cfg);\n var points = [startPoint]; // 添加起始点\n // 添加控制点\n\n if (controlPoints) {\n points = points.concat(controlPoints);\n } // 添加结束点\n\n\n points.push(endPoint);\n var source = cfg.sourceNode;\n var target = cfg.targetNode;\n var radius = style.radius;\n var defaultRouteCfg = this.options.routeCfg;\n var routeCfg = Object(esm[\"mix\"])({}, defaultRouteCfg, cfg.routeCfg);\n routeCfg.offset = style.offset;\n var path = this.getPath(points, source, target, radius, routeCfg);\n\n if (Object(esm[\"isArray\"])(path) && path.length <= 1 || Object(esm[\"isString\"])(path) && path.indexOf('L') === -1) {\n path = 'M0 0, L0 0';\n }\n\n if (isNaN(startPoint.x) || isNaN(startPoint.y) || isNaN(endPoint.x) || isNaN(endPoint.y)) {\n path = 'M0 0, L0 0';\n }\n\n var attrs = Object(esm[\"mix\"])({}, BaseGlobal.defaultEdge.style, style, {\n lineWidth: cfg.size,\n path: path\n });\n return attrs;\n },\n updateShapeStyle: function updateShapeStyle(cfg, item) {\n var group = item.getContainer();\n if (!item.isVisible()) return;\n var strokeStyle = {\n stroke: cfg.color\n };\n var shape = group['shapeMap']['edge-shape'] || group.find(function (element) {\n return element.get('className') === 'edge-shape';\n }) || item.getKeyShape();\n var size = cfg.size;\n cfg = this.getPathPoints(cfg);\n var startPoint = cfg.startPoint,\n endPoint = cfg.endPoint;\n var controlPoints = this.getControlPoints(cfg); // || cfg.controlPoints;\n\n var points = [startPoint]; // 添加起始点\n // 添加控制点\n\n if (controlPoints) {\n points = points.concat(controlPoints);\n } // 添加结束点\n\n\n points.push(endPoint);\n var currentAttr = shape.attr();\n var previousStyle = Object(esm[\"mix\"])({}, strokeStyle, currentAttr, cfg.style);\n var source = cfg.sourceNode;\n var target = cfg.targetNode;\n var radius = previousStyle.radius;\n var defaultRouteCfg = this.options.routeCfg;\n var routeCfg = Object(esm[\"mix\"])({}, defaultRouteCfg, cfg.routeCfg);\n routeCfg.offset = previousStyle.offset;\n var path = this.getPath(points, source, target, radius, routeCfg);\n\n if (Object(esm[\"isArray\"])(path) && path.length <= 1 || Object(esm[\"isString\"])(path) && path.indexOf('L') === -1) {\n path = 'M0 0, L0 0';\n }\n\n if (isNaN(startPoint.x) || isNaN(startPoint.y) || isNaN(endPoint.x) || isNaN(endPoint.y)) {\n path = 'M0 0, L0 0';\n }\n\n if (currentAttr.endArrow && previousStyle.endArrow === false) {\n cfg.style.endArrow = {\n path: ''\n };\n }\n\n if (currentAttr.startArrow && previousStyle.startArrow === false) {\n cfg.style.startArrow = {\n path: ''\n };\n }\n\n var style = Object(esm[\"mix\"])(strokeStyle, shape.attr(), {\n lineWidth: size,\n path: path\n }, cfg.style);\n\n if (shape) {\n shape.attr(style);\n }\n },\n getPath: function getPath(points, source, target, radius, routeCfg) {\n var offset = routeCfg.offset,\n simple = routeCfg.simple; // 指定了控制点\n\n if (!offset || points.length > 2) {\n if (radius) {\n return getPathWithBorderRadiusByPolyline(points, radius);\n }\n\n var pathArray_1 = [];\n Object(esm[\"each\"])(points, function (point, index) {\n if (index === 0) {\n pathArray_1.push(['M', point.x, point.y]);\n } else {\n pathArray_1.push(['L', point.x, point.y]);\n }\n });\n return pathArray_1;\n } // 未指定控制点\n\n\n var polylinePoints = simple ? getPolylinePoints(points[points.length - 1], points[0], target, source, offset) : router_pathFinder(points[0], points[points.length - 1], source, target, routeCfg);\n if (!polylinePoints || !polylinePoints.length) return 'M0 0, L0 0';\n\n if (radius) {\n var res_1 = getPathWithBorderRadiusByPolyline(polylinePoints, radius);\n return res_1;\n }\n\n var res = util.pointsToPolygon(polylinePoints);\n return res;\n }\n}, 'single-edge');\n// CONCATENATED MODULE: ./node_modules/@antv/g6-element/es/edges/index.js\n\n// CONCATENATED MODULE: ./node_modules/@antv/g6-element/es/index.js\n\n\n// CONCATENATED MODULE: ./node_modules/@antv/g6-pc/es/element/index.js\n\n// CONCATENATED MODULE: ./node_modules/@antv/g6-pc/es/behavior/drag-canvas.js\n\n\nvar drag_canvas_cloneEvent = es_util.cloneEvent,\n drag_canvas_isNaN = es_util.isNaN;\nvar abs = Math.abs;\nvar DRAG_OFFSET = 10;\nvar drag_canvas_ALLOW_EVENTS = ['shift', 'ctrl', 'alt', 'control'];\n/* harmony default export */ var drag_canvas = ({\n getDefaultCfg: function getDefaultCfg() {\n return {\n direction: 'both',\n enableOptimize: false,\n // drag-canvas 可拖动的扩展范围,默认为 0,即最多可以拖动一屏的位置\n // 当设置的值大于 0 时,即拖动可以超过一屏\n // 当设置的值小于 0 时,相当于缩小了可拖动范围\n // 具体实例可参考:https://gw.alipayobjects.com/mdn/rms_f8c6a0/afts/img/A*IFfoS67_HssAAAAAAAAAAAAAARQnAQ\n scalableRange: 0,\n allowDragOnItem: false\n };\n },\n getEvents: function getEvents() {\n return {\n dragstart: 'onMouseDown',\n drag: 'onMouseMove',\n dragend: 'onMouseUp',\n 'canvas:click': 'onMouseUp',\n keyup: 'onKeyUp',\n focus: 'onKeyUp',\n keydown: 'onKeyDown',\n touchstart: 'onTouchStart',\n touchmove: 'onTouchMove',\n touchend: 'onMouseUp'\n };\n },\n updateViewport: function updateViewport(e) {\n var origin = this.origin;\n var clientX = +e.clientX;\n var clientY = +e.clientY;\n\n if (drag_canvas_isNaN(clientX) || drag_canvas_isNaN(clientY)) {\n return;\n }\n\n var dx = clientX - origin.x;\n var dy = clientY - origin.y;\n\n if (this.get('direction') === 'x') {\n dy = 0;\n } else if (this.get('direction') === 'y') {\n dx = 0;\n }\n\n this.origin = {\n x: clientX,\n y: clientY\n };\n var width = this.graph.get('width');\n var height = this.graph.get('height');\n var graphCanvasBBox = this.graph.get('canvas').getCanvasBBox();\n var expandWidth = this.scalableRange;\n var expandHeight = this.scalableRange; // 若 scalableRange 是 0~1 的小数,则作为比例考虑\n\n if (expandWidth < 1 && expandWidth > -1) {\n expandWidth = width * expandWidth;\n expandHeight = height * expandHeight;\n }\n\n if (graphCanvasBBox.minX <= width + expandWidth && graphCanvasBBox.minX + dx > width + expandWidth || graphCanvasBBox.maxX + expandWidth >= 0 && graphCanvasBBox.maxX + expandWidth + dx < 0) {\n dx = 0;\n }\n\n if (graphCanvasBBox.minY <= height + expandHeight && graphCanvasBBox.minY + dy > height + expandHeight || graphCanvasBBox.maxY + expandHeight >= 0 && graphCanvasBBox.maxY + expandHeight + dy < 0) {\n dy = 0;\n }\n\n this.graph.translate(dx, dy);\n },\n onTouchStart: function onTouchStart(e) {\n var self = this;\n var touches = e.originalEvent.touches;\n var event1 = touches[0];\n var event2 = touches[1]; // 如果是双指操作,不允许拖拽画布\n\n if (event1 && event2) {\n return;\n }\n\n e.preventDefault();\n self.onMouseDown(e);\n },\n onMouseDown: function onMouseDown(e) {\n var self = this;\n var event = e.originalEvent;\n\n if (event && e.name !== G6Event.TOUCHSTART && event.button !== 0) {\n return;\n }\n\n if (e.name !== G6Event.TOUCHSTART && typeof window !== 'undefined' && window.event && !window.event.buttons && !window.event.button) {\n return;\n }\n\n if (!this.shouldBegin.call(this, e)) {\n return;\n }\n\n if (self.keydown) return;\n var target = e.target;\n var targetIsCanvas = target && target.isCanvas && target.isCanvas();\n if (!this.allowDragOnItem && !targetIsCanvas) return;\n self.origin = {\n x: e.clientX,\n y: e.clientY\n };\n self.dragging = false;\n\n if (this.enableOptimize) {\n // 拖动 canvas 过程中隐藏所有的边及label\n var graph = this.graph;\n var edges = graph.getEdges();\n\n for (var i = 0, len = edges.length; i < len; i++) {\n var shapes = edges[i].get('group').get('children');\n if (!shapes) continue;\n shapes.forEach(function (shape) {\n shape.set('ori-visibility', shape.get('ori-visibility') || shape.get('visible'));\n shape.hide();\n });\n }\n\n var nodes = graph.getNodes();\n\n for (var j = 0, nodeLen = nodes.length; j < nodeLen; j++) {\n var container = nodes[j].getContainer();\n var children = container.get('children');\n\n for (var _i = 0, children_1 = children; _i < children_1.length; _i++) {\n var child = children_1[_i];\n var isKeyShape = child.get('isKeyShape');\n\n if (!isKeyShape) {\n child.set('ori-visibility', child.get('ori-visibility') || child.get('visible'));\n child.hide();\n }\n }\n }\n }\n },\n onTouchMove: function onTouchMove(e) {\n var self = this;\n var touches = e.originalEvent.touches;\n var event1 = touches[0];\n var event2 = touches[1]; // 如果是双指操作,不允许拖拽画布,结束拖拽\n\n if (event1 && event2) {\n this.onMouseUp(e);\n return;\n }\n\n e.preventDefault();\n self.onMouseMove(e);\n },\n onMouseMove: function onMouseMove(e) {\n var graph = this.graph;\n if (this.keydown) return;\n var target = e.target;\n var targetIsCanvas = target && target.isCanvas && target.isCanvas();\n if (!this.allowDragOnItem && !targetIsCanvas) return;\n e = drag_canvas_cloneEvent(e);\n\n if (!this.origin) {\n return;\n }\n\n if (!this.dragging) {\n if (abs(this.origin.x - e.clientX) + abs(this.origin.y - e.clientY) < DRAG_OFFSET) {\n return;\n }\n\n if (this.shouldBegin.call(this, e)) {\n e.type = 'dragstart';\n graph.emit('canvas:dragstart', e);\n this.originPosition = {\n x: e.clientX,\n y: e.clientY\n };\n this.dragging = true;\n }\n } else {\n e.type = 'drag';\n graph.emit('canvas:drag', e);\n }\n\n if (this.shouldUpdate.call(this, e)) {\n this.updateViewport(e);\n }\n },\n onMouseUp: function onMouseUp(e) {\n var _a, _b;\n\n var graph = this.graph;\n if (this.keydown) return;\n var currentZoom = graph.getZoom();\n var modeController = graph.get('modeController');\n var zoomCanvas = (_b = (_a = modeController === null || modeController === void 0 ? void 0 : modeController.modes[modeController.mode]) === null || _a === void 0 ? void 0 : _a.filter(function (behavior) {\n return behavior.type === 'zoom-canvas';\n })) === null || _b === void 0 ? void 0 : _b[0];\n var optimizeZoom = zoomCanvas ? zoomCanvas.optimizeZoom || 0.1 : 0;\n\n if (this.enableOptimize) {\n // 拖动结束后显示所有的边\n var edges = graph.getEdges();\n\n for (var i = 0, len = edges.length; i < len; i++) {\n var shapes = edges[i].get('group').get('children');\n if (!shapes) continue;\n shapes.forEach(function (shape) {\n var oriVis = shape.get('ori-visibility');\n if (oriVis) shape.show();\n });\n }\n\n if (currentZoom > optimizeZoom) {\n var nodes = graph.getNodes();\n\n for (var j = 0, nodeLen = nodes.length; j < nodeLen; j++) {\n var container = nodes[j].getContainer();\n var children = container.get('children');\n\n for (var _i = 0, children_2 = children; _i < children_2.length; _i++) {\n var child = children_2[_i];\n var isKeyShape = child.get('isKeyShape');\n\n if (!isKeyShape) {\n var oriVis = child.get('ori-visibility');\n if (oriVis) child.show();\n }\n }\n }\n }\n }\n\n if (!this.dragging) {\n this.origin = null;\n return;\n }\n\n e = drag_canvas_cloneEvent(e);\n\n if (this.shouldEnd.call(this, e)) {\n this.updateViewport(e);\n }\n\n e.type = 'dragend';\n e.dx = e.clientX - this.originPosition.x;\n e.dy = e.clientY - this.originPosition.y;\n graph.emit('canvas:dragend', e);\n this.endDrag();\n },\n endDrag: function endDrag() {\n this.origin = null;\n this.dragging = false;\n this.dragbegin = false;\n },\n onKeyDown: function onKeyDown(e) {\n var self = this;\n var code = e.key;\n\n if (!code) {\n return;\n }\n\n if (drag_canvas_ALLOW_EVENTS.indexOf(code.toLowerCase()) > -1) {\n self.keydown = true;\n } else {\n self.keydown = false;\n }\n },\n onKeyUp: function onKeyUp() {\n this.keydown = false;\n this.origin = null;\n this.dragging = false;\n this.dragbegin = false;\n }\n});\n// CONCATENATED MODULE: ./node_modules/@antv/g6-pc/es/behavior/drag-node.js\n\n\n\n/* harmony default export */ var drag_node = ({\n getDefaultCfg: function getDefaultCfg() {\n return {\n updateEdge: true,\n delegateStyle: {},\n // 是否开启delegate\n enableDelegate: false,\n // 拖动节点过程中是否只改变 Combo 的大小,而不改变其结构\n onlyChangeComboSize: false,\n // 拖动过程中目标 combo 状态样式\n comboActiveState: '',\n selectedState: 'selected',\n enableOptimize: false,\n enableDebounce: false,\n enableStack: true\n };\n },\n getEvents: function getEvents() {\n return {\n 'node:dragstart': 'onDragStart',\n 'node:drag': 'onDrag',\n 'node:dragend': 'onDragEnd',\n 'combo:dragenter': 'onDragEnter',\n 'combo:dragleave': 'onDragLeave',\n 'combo:drop': 'onDropCombo',\n 'node:drop': 'onDropNode',\n 'canvas:drop': 'onDropCanvas',\n 'touchstart': 'onTouchStart',\n 'touchmove': 'onTouchMove',\n 'touchend': 'onDragEnd'\n };\n },\n validationCombo: function validationCombo(item) {\n if (!this.origin || !item || item.destroyed) {\n return false;\n }\n\n var type = item.getType();\n\n if (type !== 'combo') {\n return false;\n }\n\n return true;\n },\n onTouchStart: function onTouchStart(e) {\n if (!e.item) return;\n var self = this;\n\n try {\n var touches = e.originalEvent.touches;\n var event1 = touches[0];\n var event2 = touches[1];\n\n if (event1 && event2) {\n return;\n }\n\n e.preventDefault();\n } catch (e) {\n console.warn('Touch original event not exist!');\n }\n\n self.onDragStart(e);\n },\n onTouchMove: function onTouchMove(e) {\n var self = this;\n\n try {\n var touches = e.originalEvent.touches;\n var event1 = touches[0];\n var event2 = touches[1];\n\n if (event1 && event2) {\n self.onDragEnd(e);\n return;\n }\n\n e.preventDefault();\n } catch (e) {\n console.warn('Touch original event not exist!');\n }\n\n self.onDrag(e);\n },\n\n /**\n * 开始拖动节点\n * @param evt\n */\n onDragStart: function onDragStart(evt) {\n var _this = this;\n\n this.currentShouldEnd = true;\n\n if (!this.shouldBegin.call(this, evt)) {\n return;\n }\n\n var item = evt.item;\n\n if (!item || item.destroyed || item.hasLocked()) {\n return;\n } // 拖动时,设置拖动元素的 capture 为false,则不拾取拖动的元素\n\n\n var group = item.getContainer();\n group.set('capture', false);\n if (!this.cachedCaptureItems) this.cachedCaptureItems = [];\n this.cachedCaptureItems.push(item); // 如果拖动的target 是linkPoints / anchorPoints 则不允许拖动\n\n var target = evt.target;\n\n if (target) {\n var isAnchorPoint = target.get('isAnchorPoint');\n\n if (isAnchorPoint) {\n return;\n }\n }\n\n var graph = this.graph;\n this.targets = []; // 将节点拖入到指定的 Combo\n\n this.targetCombo = null; // 获取所有选中的元素\n\n var nodes = graph.findAllByState('node', this.selectedState);\n var currentNodeId = item.get('id'); // 当前拖动的节点是否是选中的节点\n\n var dragNodes = nodes.filter(function (node) {\n var nodeId = node.get('id');\n return currentNodeId === nodeId;\n }); // 只拖动当前节点\n\n if (dragNodes.length === 0) {\n this.targets.push(item);\n } else if (nodes.length > 1) {\n // 拖动多个节点\n nodes.forEach(function (node) {\n var locked = node.hasLocked();\n\n if (!locked) {\n _this.targets.push(node);\n }\n });\n } else {\n this.targets.push(item);\n }\n\n var beforeDragNodes = [];\n this.targets.forEach(function (t) {\n beforeDragNodes.push(Object(esm[\"clone\"])(t.getModel()));\n });\n this.set('beforeDragNodes', beforeDragNodes);\n this.hidenEdge = {};\n\n if (this.get('updateEdge') && this.enableOptimize && !this.enableDelegate) {\n this.targets.forEach(function (node) {\n var edges = node.getEdges();\n edges.forEach(function (edge) {\n if (!edge.isVisible()) return;\n _this.hidenEdge[edge.getID()] = true;\n edge.hide();\n });\n });\n }\n\n this.origin = {\n x: evt.x,\n y: evt.y\n };\n this.point = {};\n this.originPoint = {};\n },\n\n /**\n * 持续拖动节点\n * @param evt\n */\n onDrag: function onDrag(evt) {\n var _this = this;\n\n if (!this.origin) {\n return;\n }\n\n if (!this.shouldUpdate.call(this, evt)) {\n return;\n }\n\n if (this.get('enableDelegate')) {\n this.updateDelegate(evt);\n } else {\n if (this.enableDebounce) this.debounceUpdate({\n targets: this.targets,\n graph: this.graph,\n point: this.point,\n origin: this.origin,\n evt: evt,\n updateEdge: this.get('updateEdge')\n });else this.targets.map(function (target) {\n _this.update(target, evt);\n });\n }\n },\n\n /**\n * 拖动结束,设置拖动元素capture为true,更新元素位置,如果是拖动涉及到 combo,则更新 combo 结构\n * @param evt\n */\n onDragEnd: function onDragEnd(evt) {\n var _this = this;\n\n var _a;\n\n if (!this.origin) {\n return;\n } // 拖动结束后,设置拖动元素 group 的 capture 为 true,允许拾取拖动元素\n\n\n (_a = this.cachedCaptureItems) === null || _a === void 0 ? void 0 : _a.forEach(function (item) {\n var group = item.getContainer();\n group.set('capture', true);\n });\n this.cachedCaptureItems = [];\n\n if (this.delegateRect) {\n this.delegateRect.remove();\n this.delegateRect = null;\n }\n\n if (this.get('updateEdge') && this.enableOptimize && !this.enableDelegate) {\n this.targets.forEach(function (node) {\n var edges = node.getEdges();\n edges.forEach(function (edge) {\n if (_this.hidenEdge[edge.getID()]) edge.show();\n edge.refresh();\n });\n });\n }\n\n this.hidenEdge = {};\n var graph = this.graph; // 拖动结束后,入栈\n\n if (graph.get('enabledStack') && this.enableStack) {\n var stackData_1 = {\n before: {\n nodes: [],\n edges: [],\n combos: []\n },\n after: {\n nodes: [],\n edges: [],\n combos: []\n }\n };\n this.get('beforeDragNodes').forEach(function (model) {\n stackData_1.before.nodes.push({\n id: model.id,\n x: model.x,\n y: model.y\n });\n });\n this.targets.forEach(function (target) {\n var targetModel = target.getModel();\n stackData_1.after.nodes.push({\n id: targetModel.id,\n x: targetModel.x,\n y: targetModel.y\n });\n });\n graph.pushStack('update', Object(esm[\"clone\"])(stackData_1));\n } // 拖动结束后emit事件,将当前操作的节点抛出去,目标节点为null\n\n\n graph.emit('dragnodeend', {\n items: this.targets,\n targetItem: null\n });\n this.point = {};\n this.origin = null;\n this.originPoint = {};\n this.targets.length = 0;\n this.targetCombo = null;\n },\n\n /**\n * 拖动过程中将节点放置到 combo 上\n * @param evt\n */\n onDropCombo: function onDropCombo(evt) {\n var item = evt.item;\n this.currentShouldEnd = this.shouldEnd.call(this, evt, item); // 若不允许结束,则将节点位置设置回初识位置。后面的逻辑仍需要执行\n\n this.updatePositions(evt, !this.currentShouldEnd);\n if (!this.currentShouldEnd || !this.validationCombo(item)) return;\n var graph = this.graph;\n\n if (this.comboActiveState) {\n graph.setItemState(item, this.comboActiveState, false);\n }\n\n this.targetCombo = item; // 拖动结束后是动态改变 Combo 大小还是将节点从 Combo 中删除\n\n if (this.onlyChangeComboSize) {\n // 拖动节点结束后,动态改变 Combo 的大小\n graph.updateCombos();\n } else {\n var targetComboModel_1 = item.getModel();\n this.targets.map(function (node) {\n var nodeModel = node.getModel();\n\n if (nodeModel.comboId !== targetComboModel_1.id) {\n graph.updateComboTree(node, targetComboModel_1.id);\n }\n });\n graph.updateCombo(item);\n } // 将节点拖动到 combo 上面,emit事件抛出当前操作的节点及目标 combo\n\n\n graph.emit('dragnodeend', {\n items: this.targets,\n targetItem: this.targetCombo\n });\n },\n onDropCanvas: function onDropCanvas(evt) {\n var graph = this.graph;\n this.currentShouldEnd = this.shouldEnd.call(this, evt, undefined); // 若不允许结束,则将节点位置设置回初识位置。后面的逻辑仍需要执行\n\n this.updatePositions(evt, !this.currentShouldEnd);\n if (!this.targets || this.targets.length === 0 || !this.currentShouldEnd) return;\n\n if (this.onlyChangeComboSize) {\n // 拖动节点结束后,动态改变 Combo 的大小\n graph.updateCombos();\n } else {\n this.targets.map(function (node) {\n // 拖动的节点有 comboId,即是从其他 combo 中拖出时才处理\n var model = node.getModel();\n\n if (model.comboId) {\n graph.updateComboTree(node);\n }\n });\n }\n },\n\n /**\n * 拖动放置到某个 combo 中的子 node 上\n * @param evt\n */\n onDropNode: function onDropNode(evt) {\n if (!this.targets || this.targets.length === 0) return;\n var self = this;\n var item = evt.item;\n var graph = self.graph;\n var comboId = item.getModel().comboId;\n var newParentCombo = comboId ? graph.findById(comboId) : undefined;\n this.currentShouldEnd = this.shouldEnd.call(this, evt, newParentCombo); // 若不允许结束,则将节点位置设置回初识位置。后面的逻辑仍需要执行\n\n this.updatePositions(evt, !this.currentShouldEnd);\n if (!this.currentShouldEnd) return;\n\n if (this.onlyChangeComboSize) {\n graph.updateCombos();\n } else if (comboId) {\n var combo = graph.findById(comboId);\n\n if (self.comboActiveState) {\n graph.setItemState(combo, self.comboActiveState, false);\n }\n\n this.targets.map(function (node) {\n var nodeModel = node.getModel();\n\n if (comboId !== nodeModel.comboId) {\n graph.updateComboTree(node, comboId);\n }\n });\n graph.updateCombo(combo);\n } else {\n this.targets.map(function (node) {\n var model = node.getModel();\n\n if (model.comboId) {\n graph.updateComboTree(node);\n }\n });\n } // 将节点拖动到另外个节点上面,emit 事件抛出当前操作的节点及目标节点\n\n\n graph.emit('dragnodeend', {\n items: this.targets,\n targetItem: item\n });\n },\n\n /**\n * 将节点拖入到 Combo 中\n * @param evt\n */\n onDragEnter: function onDragEnter(evt) {\n var item = evt.item;\n if (!this.validationCombo(item)) return;\n var graph = this.graph;\n\n if (this.comboActiveState) {\n graph.setItemState(item, this.comboActiveState, true);\n }\n },\n\n /**\n * 将节点从 Combo 中拖出\n * @param evt\n */\n onDragLeave: function onDragLeave(evt) {\n var item = evt.item;\n if (!this.validationCombo(item)) return;\n var graph = this.graph;\n\n if (this.comboActiveState) {\n graph.setItemState(item, this.comboActiveState, false);\n }\n },\n updatePositions: function updatePositions(evt, restore) {\n var _this = this;\n\n if (!this.targets || this.targets.length === 0) return; // 当开启 delegate 时,拖动结束后需要更新所有已选中节点的位置\n\n if (this.get('enableDelegate')) {\n if (this.enableDebounce) this.debounceUpdate({\n targets: this.targets,\n graph: this.graph,\n point: this.point,\n origin: this.origin,\n evt: evt,\n updateEdge: this.get('updateEdge'),\n updateFunc: this.update\n });else if (!restore) this.targets.map(function (node) {\n return _this.update(node, evt);\n });\n } else this.targets.map(function (node) {\n return _this.update(node, evt, restore);\n });\n },\n\n /**\n * 更新节点\n * @param item 拖动的节点实例\n * @param evt\n */\n update: function update(item, evt, restore) {\n var origin = this.origin;\n var model = item.get('model');\n var nodeId = item.get('id');\n\n if (!this.point[nodeId]) {\n this.point[nodeId] = {\n x: model.x || 0,\n y: model.y || 0\n };\n }\n\n var x = evt.x - origin.x + this.point[nodeId].x;\n var y = evt.y - origin.y + this.point[nodeId].y;\n\n if (restore) {\n x += origin.x - evt.x;\n y += origin.y - evt.y;\n }\n\n var pos = {\n x: x,\n y: y\n };\n\n if (this.get('updateEdge')) {\n this.graph.updateItem(item, pos, false);\n } else {\n item.updatePosition(pos);\n }\n },\n\n /**\n * 限流更新节点\n * @param item 拖动的节点实例\n * @param evt\n */\n debounceUpdate: Object(esm[\"debounce\"])(function (event) {\n var targets = event.targets,\n graph = event.graph,\n point = event.point,\n origin = event.origin,\n evt = event.evt,\n updateEdge = event.updateEdge,\n updateFunc = event.updateFunc;\n targets.map(function (item) {\n var model = item.get('model');\n var nodeId = item.get('id');\n\n if (!point[nodeId]) {\n point[nodeId] = {\n x: model.x || 0,\n y: model.y || 0\n };\n }\n\n var x = evt.x - origin.x + point[nodeId].x;\n var y = evt.y - origin.y + point[nodeId].y;\n var pos = {\n x: x,\n y: y\n };\n\n if (updateEdge) {\n graph.updateItem(item, pos, false);\n } else {\n item.updatePosition(pos);\n }\n });\n }, 50, true),\n\n /**\n * 更新拖动元素时的delegate\n * @param {Event} e 事件句柄\n * @param {number} x 拖动单个元素时候的x坐标\n * @param {number} y 拖动单个元素时候的y坐标\n */\n updateDelegate: function updateDelegate(e) {\n var graph = this.graph;\n\n if (!this.delegateRect) {\n // 拖动多个\n var parent_1 = graph.get('group');\n var attrs = Object(esm[\"deepMix\"])({}, es_global.delegateStyle, this.delegateStyle);\n\n var _a = this.calculationGroupPosition(e),\n cx = _a.x,\n cy = _a.y,\n width = _a.width,\n height = _a.height,\n minX = _a.minX,\n minY = _a.minY;\n\n this.originPoint = {\n x: cx,\n y: cy,\n width: width,\n height: height,\n minX: minX,\n minY: minY\n }; // model上的x, y是相对于图形中心的,delegateShape是g实例,x,y是绝对坐标\n\n this.delegateRect = parent_1.addShape('rect', {\n attrs: Object(tslib_es6[\"__assign\"])({\n width: width,\n height: height,\n x: cx,\n y: cy\n }, attrs),\n name: 'rect-delegate-shape'\n });\n this.delegate = this.delegateRect;\n this.delegateRect.set('capture', false);\n } else {\n var clientX = e.x - this.origin.x + this.originPoint.minX;\n var clientY = e.y - this.origin.y + this.originPoint.minY;\n this.delegateRect.attr({\n x: clientX,\n y: clientY\n });\n }\n },\n\n /**\n * 计算delegate位置,包括左上角左边及宽度和高度\n * @memberof ItemGroup\n * @return {object} 计算出来的delegate坐标信息及宽高\n */\n calculationGroupPosition: function calculationGroupPosition(evt) {\n var nodes = this.targets;\n\n if (nodes.length === 0) {\n nodes.push(evt.item);\n }\n\n var minx = Infinity;\n var maxx = -Infinity;\n var miny = Infinity;\n var maxy = -Infinity; // 获取已节点的所有最大最小x y值\n\n for (var i = 0; i < nodes.length; i++) {\n var element = nodes[i];\n var bbox = element.getBBox();\n var minX = bbox.minX,\n minY = bbox.minY,\n maxX = bbox.maxX,\n maxY = bbox.maxY;\n\n if (minX < minx) {\n minx = minX;\n }\n\n if (minY < miny) {\n miny = minY;\n }\n\n if (maxX > maxx) {\n maxx = maxX;\n }\n\n if (maxY > maxy) {\n maxy = maxY;\n }\n }\n\n var x = Math.floor(minx);\n var y = Math.floor(miny);\n var width = Math.ceil(maxx) - Math.floor(minx);\n var height = Math.ceil(maxy) - Math.floor(miny);\n return {\n x: x,\n y: y,\n width: width,\n height: height,\n minX: minx,\n minY: miny\n };\n }\n});\n// CONCATENATED MODULE: ./node_modules/@antv/g6-pc/es/behavior/activate-relations.js\n/* harmony default export */ var activate_relations = ({\n getDefaultCfg: function getDefaultCfg() {\n return {\n // 可选 mouseenter || click\n // 选择 click 会监听 touch,mouseenter 不会监听\n trigger: 'mouseenter',\n activeState: 'active',\n inactiveState: 'inactive',\n resetSelected: false,\n shouldUpdate: function shouldUpdate() {\n return true;\n }\n };\n },\n getEvents: function getEvents() {\n if (this.get('trigger') === 'mouseenter') {\n return {\n 'node:mouseenter': 'setAllItemStates',\n 'combo:mouseenter': 'setAllItemStates',\n 'node:mouseleave': 'clearActiveState',\n 'combo:mouseleave': 'clearActiveState'\n };\n }\n\n return {\n 'node:click': 'setAllItemStates',\n 'combo:click': 'setAllItemStates',\n 'canvas:click': 'clearActiveState',\n 'node:touchstart': 'setOnTouchStart',\n 'combo:touchstart': 'setOnTouchStart',\n 'canvas:touchstart': 'clearOnTouchStart'\n };\n },\n setOnTouchStart: function setOnTouchStart(e) {\n var self = this;\n\n try {\n var touches = e.originalEvent.touches;\n var event1 = touches[0];\n var event2 = touches[1];\n\n if (event1 && event2) {\n return;\n }\n\n e.preventDefault();\n } catch (e) {\n console.warn('Touch original event not exist!');\n }\n\n self.setAllItemStates(e);\n },\n clearOnTouchStart: function clearOnTouchStart(e) {\n var self = this;\n\n try {\n var touches = e.originalEvent.touches;\n var event1 = touches[0];\n var event2 = touches[1];\n\n if (event1 && event2) {\n return;\n }\n\n e.preventDefault();\n } catch (e) {\n console.warn('Touch original event not exist!');\n }\n\n self.clearActiveState(e);\n },\n setAllItemStates: function setAllItemStates(e) {\n var item = e.item;\n var graph = this.graph;\n this.item = item;\n\n if (!this.shouldUpdate(e.item, {\n event: e,\n action: 'activate'\n })) {\n return;\n }\n\n var self = this;\n var activeState = this.activeState;\n var inactiveState = this.inactiveState;\n var nodes = graph.getNodes();\n var combos = graph.getCombos();\n var edges = graph.getEdges();\n var vEdges = graph.get('vedges');\n var nodeLength = nodes.length;\n var comboLength = combos.length;\n var edgeLength = edges.length;\n var vEdgeLength = vEdges.length;\n\n for (var i = 0; i < nodeLength; i++) {\n var node = nodes[i];\n var hasSelected = node.hasState('selected');\n\n if (self.resetSelected) {\n if (hasSelected) {\n graph.setItemState(node, 'selected', false);\n }\n }\n\n graph.setItemState(node, activeState, false);\n\n if (inactiveState) {\n graph.setItemState(node, inactiveState, true);\n }\n }\n\n for (var i = 0; i < comboLength; i++) {\n var combo = combos[i];\n var hasSelected = combo.hasState('selected');\n\n if (self.resetSelected) {\n if (hasSelected) {\n graph.setItemState(combo, 'selected', false);\n }\n }\n\n graph.setItemState(combo, activeState, false);\n\n if (inactiveState) {\n graph.setItemState(combo, inactiveState, true);\n }\n }\n\n for (var i = 0; i < edgeLength; i++) {\n var edge = edges[i];\n graph.setItemState(edge, activeState, false);\n\n if (inactiveState) {\n graph.setItemState(edge, inactiveState, true);\n }\n }\n\n for (var i = 0; i < vEdgeLength; i++) {\n var vEdge = vEdges[i];\n graph.setItemState(vEdge, activeState, false);\n\n if (inactiveState) {\n graph.setItemState(vEdge, inactiveState, true);\n }\n }\n\n if (inactiveState) {\n graph.setItemState(item, inactiveState, false);\n }\n\n graph.setItemState(item, activeState, true);\n var rEdges = item.getEdges();\n var rEdgeLegnth = rEdges.length;\n\n for (var i = 0; i < rEdgeLegnth; i++) {\n var edge = rEdges[i];\n var otherEnd = void 0;\n\n if (edge.getSource() === item) {\n otherEnd = edge.getTarget();\n } else {\n otherEnd = edge.getSource();\n }\n\n if (inactiveState) {\n graph.setItemState(otherEnd, inactiveState, false);\n }\n\n graph.setItemState(otherEnd, activeState, true);\n graph.setItemState(edge, inactiveState, false);\n graph.setItemState(edge, activeState, true);\n edge.toFront();\n }\n\n graph.emit('afteractivaterelations', {\n item: e.item,\n action: 'activate'\n });\n },\n clearActiveState: function clearActiveState(e) {\n var self = this;\n var graph = self.get('graph');\n\n if (!self.shouldUpdate(e.item, {\n event: e,\n action: 'deactivate'\n })) {\n return;\n }\n\n var activeState = this.activeState;\n var inactiveState = this.inactiveState;\n var autoPaint = graph.get('autoPaint');\n graph.setAutoPaint(false);\n var nodes = graph.getNodes() || [];\n var combos = graph.getCombos() || [];\n var edges = graph.getEdges() || [];\n var vEdges = graph.get('vedges') || [];\n var nodeLength = nodes.length;\n var comboLength = combos.length;\n var edgeLength = edges.length;\n var vEdgeLength = vEdges.length;\n\n for (var i = 0; i < nodeLength; i++) {\n var node = nodes[i];\n graph.clearItemStates(node, [activeState, inactiveState]);\n }\n\n for (var i = 0; i < comboLength; i++) {\n var combo = combos[i];\n graph.clearItemStates(combo, [activeState, inactiveState]);\n }\n\n for (var i = 0; i < edgeLength; i++) {\n var edge = edges[i];\n graph.clearItemStates(edge, [activeState, inactiveState, 'deactivate']);\n }\n\n for (var i = 0; i < vEdgeLength; i++) {\n var vEdge = vEdges[i];\n graph.clearItemStates(vEdge, [activeState, inactiveState, 'deactivate']);\n }\n\n graph.paint();\n graph.setAutoPaint(autoPaint);\n graph.emit('afteractivaterelations', {\n item: e.item || self.get('item'),\n action: 'deactivate'\n });\n }\n});\n// CONCATENATED MODULE: ./node_modules/@antv/g6-pc/es/behavior/brush-select.js\nvar brush_select_min = Math.min,\n brush_select_max = Math.max,\n brush_select_abs = Math.abs;\nvar DEFAULT_TRIGGER = 'shift';\nvar brush_select_ALLOW_EVENTS = ['drag', 'shift', 'ctrl', 'alt', 'control'];\n/* harmony default export */ var brush_select = ({\n getDefaultCfg: function getDefaultCfg() {\n return {\n brushStyle: {\n fill: '#EEF6FF',\n fillOpacity: 0.4,\n stroke: '#DDEEFE',\n lineWidth: 1\n },\n onSelect: function onSelect() {},\n onDeselect: function onDeselect() {},\n selectedState: 'selected',\n trigger: DEFAULT_TRIGGER,\n includeEdges: true,\n selectedEdges: [],\n selectedNodes: []\n };\n },\n getEvents: function getEvents() {\n // 检测输入是否合法\n if (!(brush_select_ALLOW_EVENTS.indexOf(this.trigger.toLowerCase()) > -1)) {\n this.trigger = DEFAULT_TRIGGER;\n console.warn(\"Behavior brush-select 的 trigger 参数不合法,请输入 'drag'、'shift'、'ctrl' 或 'alt'\");\n }\n\n if (this.trigger === 'drag') {\n return {\n dragstart: 'onMouseDown',\n drag: 'onMouseMove',\n dragend: 'onMouseUp',\n 'canvas:click': 'clearStates'\n };\n }\n\n return {\n dragstart: 'onMouseDown',\n drag: 'onMouseMove',\n dragend: 'onMouseUp',\n 'canvas:click': 'clearStates',\n keyup: 'onKeyUp',\n keydown: 'onKeyDown'\n };\n },\n onMouseDown: function onMouseDown(e) {\n // 按在node上面拖动时候不应该是框选\n var item = e.item;\n var brush = this.brush;\n\n if (item) {\n return;\n }\n\n if (this.trigger !== 'drag' && !this.keydown) {\n return;\n }\n\n if (this.selectedNodes && this.selectedNodes.length !== 0) {\n this.clearStates();\n }\n\n if (!brush) {\n brush = this.createBrush();\n }\n\n this.originPoint = {\n x: e.canvasX,\n y: e.canvasY\n };\n brush.attr({\n width: 0,\n height: 0\n });\n brush.show();\n this.dragging = true;\n },\n onMouseMove: function onMouseMove(e) {\n if (!this.dragging) {\n return;\n }\n\n if (this.trigger !== 'drag' && !this.keydown) {\n return;\n }\n\n this.updateBrush(e);\n },\n onMouseUp: function onMouseUp(e) {\n var graph = this.graph; // TODO: 触发了 canvas:click 导致 clearStates\n\n if (!this.brush && !this.dragging) {\n return;\n }\n\n if (this.trigger !== 'drag' && !this.keydown) {\n return;\n }\n\n this.brush.remove(true); // remove and destroy\n\n this.brush = null;\n this.getSelectedNodes(e);\n this.dragging = false;\n },\n clearStates: function clearStates() {\n var _a = this,\n graph = _a.graph,\n selectedState = _a.selectedState;\n\n var nodes = graph.findAllByState('node', selectedState);\n var edges = graph.findAllByState('edge', selectedState);\n nodes.forEach(function (node) {\n return graph.setItemState(node, selectedState, false);\n });\n edges.forEach(function (edge) {\n return graph.setItemState(edge, selectedState, false);\n });\n this.selectedNodes = [];\n this.selectedEdges = [];\n\n if (this.onDeselect) {\n this.onDeselect(this.selectedNodes, this.selectedEdges);\n }\n\n graph.emit('nodeselectchange', {\n selectedItems: {\n nodes: [],\n edges: []\n },\n select: false\n });\n },\n getSelectedNodes: function getSelectedNodes(e) {\n var _this = this;\n\n var _a = this,\n graph = _a.graph,\n originPoint = _a.originPoint,\n shouldUpdate = _a.shouldUpdate;\n\n var state = this.selectedState;\n var p1 = {\n x: e.x,\n y: e.y\n };\n var p2 = graph.getPointByCanvas(originPoint.x, originPoint.y);\n var left = brush_select_min(p1.x, p2.x);\n var right = brush_select_max(p1.x, p2.x);\n var top = brush_select_min(p1.y, p2.y);\n var bottom = brush_select_max(p1.y, p2.y);\n var selectedNodes = [];\n var selectedIds = [];\n graph.getNodes().forEach(function (node) {\n if (!node.isVisible()) return; // 隐藏节点不能被选中\n\n var bbox = node.getBBox();\n\n if (bbox.centerX >= left && bbox.centerX <= right && bbox.centerY >= top && bbox.centerY <= bottom) {\n if (shouldUpdate(node, 'select')) {\n selectedNodes.push(node);\n var model = node.getModel();\n selectedIds.push(model.id);\n graph.setItemState(node, state, true);\n }\n }\n });\n var selectedEdges = [];\n\n if (this.includeEdges) {\n // 选中边,边的source和target都在选中的节点中时才选中\n selectedNodes.forEach(function (node) {\n var edges = node.getOutEdges();\n edges.forEach(function (edge) {\n if (!edge.isVisible()) return; // 隐藏边不能够被选中\n\n var model = edge.getModel();\n var source = model.source,\n target = model.target;\n\n if (selectedIds.includes(source) && selectedIds.includes(target) && shouldUpdate(edge, 'select')) {\n selectedEdges.push(edge);\n graph.setItemState(edge, _this.selectedState, true);\n }\n });\n });\n }\n\n this.selectedEdges = selectedEdges;\n this.selectedNodes = selectedNodes;\n\n if (this.onSelect) {\n this.onSelect(selectedNodes, selectedEdges);\n }\n\n graph.emit('nodeselectchange', {\n selectedItems: {\n nodes: selectedNodes,\n edges: selectedEdges\n },\n select: true\n });\n },\n createBrush: function createBrush() {\n var self = this;\n var brush = self.graph.get('canvas').addShape('rect', {\n attrs: self.brushStyle,\n capture: false,\n name: 'brush-shape'\n });\n this.brush = brush;\n this.delegate = brush;\n return brush;\n },\n updateBrush: function updateBrush(e) {\n var originPoint = this.originPoint;\n this.brush.attr({\n width: brush_select_abs(e.canvasX - originPoint.x),\n height: brush_select_abs(e.canvasY - originPoint.y),\n x: brush_select_min(e.canvasX, originPoint.x),\n y: brush_select_min(e.canvasY, originPoint.y)\n });\n },\n onKeyDown: function onKeyDown(e) {\n var code = e.key;\n\n if (!code) {\n return;\n }\n\n var triggerLowerCase = this.trigger.toLowerCase();\n var codeLowerCase = code.toLowerCase(); // 按住 control 键时,允许用户设置 trigger 为 ctrl\n\n if (codeLowerCase === triggerLowerCase || codeLowerCase === 'control' && triggerLowerCase === 'ctrl' || codeLowerCase === 'ctrl' && triggerLowerCase === 'control') {\n this.keydown = true;\n } else {\n this.keydown = false;\n }\n },\n onKeyUp: function onKeyUp() {\n if (this.brush) {\n // 清除所有选中状态后,设置拖得动状态为false,并清除框选的brush\n this.brush.remove(true);\n this.brush = null;\n this.dragging = false;\n }\n\n this.keydown = false;\n }\n});\n// CONCATENATED MODULE: ./node_modules/@antv/g6-pc/es/behavior/click-select.js\n\nvar click_select_DEFAULT_TRIGGER = 'shift';\nvar click_select_ALLOW_EVENTS = ['shift', 'ctrl', 'alt', 'control'];\n/* harmony default export */ var click_select = ({\n getDefaultCfg: function getDefaultCfg() {\n return {\n multiple: true,\n trigger: click_select_DEFAULT_TRIGGER,\n selectedState: 'selected'\n };\n },\n getEvents: function getEvents() {\n var self = this; // 检测输入是否合法\n\n if (!(click_select_ALLOW_EVENTS.indexOf(self.trigger.toLowerCase()) > -1)) {\n self.trigger = click_select_DEFAULT_TRIGGER; // eslint-disable-next-line no-console\n\n console.warn(\"Behavior brush-select 的 trigger 参数不合法,请输入 'drag'、'shift'、'ctrl' 或 'alt'\");\n }\n\n if (!self.multiple) {\n return {\n 'node:click': 'onClick',\n 'combo:click': 'onClick',\n 'canvas:click': 'onCanvasClick'\n };\n }\n\n return {\n 'node:click': 'onClick',\n 'combo:click': 'onClick',\n 'canvas:click': 'onCanvasClick',\n keyup: 'onKeyUp',\n keydown: 'onKeyDown'\n };\n },\n onClick: function onClick(evt) {\n var self = this;\n var item = evt.item;\n\n if (!item || item.destroyed) {\n return;\n }\n\n var type = item.getType();\n var graph = self.graph,\n keydown = self.keydown,\n multiple = self.multiple,\n shouldUpdate = self.shouldUpdate,\n shouldBegin = self.shouldBegin;\n\n if (!shouldBegin.call(self, evt)) {\n return;\n } // allow to select multiple nodes but did not press a key || do not allow the select multiple nodes\n\n\n if (!keydown || !multiple) {\n var selected = graph.findAllByState('node', self.selectedState).concat(graph.findAllByState('combo', self.selectedState));\n Object(esm[\"each\"])(selected, function (combo) {\n if (combo !== item) {\n graph.setItemState(combo, self.selectedState, false);\n }\n });\n }\n\n if (item.hasState(self.selectedState)) {\n if (shouldUpdate.call(self, evt)) {\n graph.setItemState(item, self.selectedState, false);\n }\n\n var selectedNodes = graph.findAllByState('node', self.selectedState);\n var selectedCombos = graph.findAllByState('combo', self.selectedState);\n graph.emit('nodeselectchange', {\n target: item,\n selectedItems: {\n nodes: selectedNodes,\n combos: selectedCombos\n },\n select: false\n });\n } else {\n if (shouldUpdate.call(self, evt)) {\n graph.setItemState(item, self.selectedState, true);\n }\n\n var selectedNodes = graph.findAllByState('node', self.selectedState);\n var selectedCombos = graph.findAllByState('combo', self.selectedState);\n graph.emit('nodeselectchange', {\n target: item,\n selectedItems: {\n nodes: selectedNodes,\n combos: selectedCombos\n },\n select: true\n });\n }\n },\n onCanvasClick: function onCanvasClick() {\n var _this = this;\n\n var graph = this.graph;\n var selected = graph.findAllByState('node', this.selectedState);\n Object(esm[\"each\"])(selected, function (node) {\n graph.setItemState(node, _this.selectedState, false);\n });\n var selectedCombos = graph.findAllByState('combo', this.selectedState);\n Object(esm[\"each\"])(selectedCombos, function (combo) {\n graph.setItemState(combo, _this.selectedState, false);\n });\n graph.emit('nodeselectchange', {\n selectedItems: {\n nodes: [],\n edges: [],\n combos: []\n },\n select: false\n });\n },\n onKeyDown: function onKeyDown(e) {\n var self = this;\n var code = e.key;\n\n if (!code) {\n return;\n }\n\n if (code.toLowerCase() === this.trigger.toLowerCase() || code.toLowerCase() === 'control') {\n self.keydown = true;\n } else {\n self.keydown = false;\n }\n },\n onKeyUp: function onKeyUp() {\n var self = this;\n self.keydown = false;\n }\n});\n// CONCATENATED MODULE: ./node_modules/@antv/g6-pc/es/behavior/zoom-canvas.js\n\n\nvar zoom_canvas_transform = matrix_util_esm[\"ext\"].transform;\nvar zoom_canvas_DELTA = 0.05;\n/* harmony default export */ var zoom_canvas = ({\n getDefaultCfg: function getDefaultCfg() {\n return {\n sensitivity: 2,\n minZoom: undefined,\n maxZoom: undefined,\n enableOptimize: false,\n optimizeZoom: 0.1,\n fixSelectedItems: {\n fixAll: false,\n fixLineWidth: false,\n fixLabel: false,\n fixState: 'selected'\n }\n };\n },\n getEvents: function getEvents() {\n var fixSelectedItems = this.fixSelectedItems;\n if (!fixSelectedItems.fixState) fixSelectedItems.fixState = 'selected';\n\n if (fixSelectedItems.fixAll) {\n fixSelectedItems.fixLineWidth = true;\n fixSelectedItems.fixLabel = true;\n }\n\n return {\n wheel: 'onWheel',\n touchstart: 'onTouchStart',\n touchmove: 'onTouchMove',\n touchend: 'onTouchEnd'\n };\n },\n onTouchStart: function onTouchStart(evt) {\n var touches = evt.originalEvent.touches;\n var event1 = touches[0];\n var event2 = touches[1];\n evt.preventDefault(); // 如果不是缩放事件则禁止继续执行\n\n if (!event2) {\n return;\n }\n\n if (this.shouldBegin && !this.shouldBegin.call(this, evt)) {\n return;\n } // 第一个触摸点位置\n\n\n this.startPoint = {\n pageX: event1.pageX,\n pageY: event1.pageY\n };\n this.moveable = true;\n\n if (event2) {\n this.endPoint = {\n pageX: event2.pageX,\n pageY: event2.pageY\n };\n }\n\n this.originScale = this.graph.getZoom() || this.currentScale || 1;\n },\n onTouchMove: function onTouchMove(evt) {\n if (!this.moveable) {\n return;\n }\n\n evt.preventDefault();\n var touches = evt.originalEvent.touches;\n var event1 = touches[0];\n var event2 = touches[1];\n\n if (!event2) {\n return;\n }\n\n if (!this.endPoint) {\n this.endPoint = {\n pageX: event2.pageX,\n pageY: event2.pageY\n };\n } // 获取坐标之间的距离\n\n\n var getDistance = function getDistance(start, end) {\n return Math.hypot(end.x - start.x, end.y - start.y);\n }; // 双指缩放比例\n\n\n var scale = getDistance({\n x: event1.pageX,\n y: event1.pageY\n }, {\n x: event2.pageX,\n y: event2.pageY\n }) / getDistance({\n x: this.startPoint.pageX,\n y: this.startPoint.pageY\n }, {\n x: this.endPoint.pageX,\n y: this.endPoint.pageY\n }); // 应用到画布上的缩放比例\n\n var zoom = this.originScale * scale; // 缓存当前的缩放比例\n\n this.currentScale = zoom;\n var minZoom = this.get('minZoom') || this.graph.get('minZoom');\n var maxZoom = this.get('maxZoom') || this.graph.get('maxZoom');\n\n if (zoom > maxZoom || zoom < minZoom) {\n return;\n }\n\n var canvas = this.graph.get('canvas');\n var point = canvas.getPointByClient(evt.clientX, evt.clientY);\n this.graph.zoomTo(zoom, {\n x: point.x,\n y: point.y\n });\n this.graph.emit('wheelzoom', evt);\n },\n onTouchEnd: function onTouchEnd() {\n this.moveable = false;\n this.endPoint = null;\n },\n onWheel: function onWheel(e) {\n var _this = this;\n\n var _a = this,\n graph = _a.graph,\n fixSelectedItems = _a.fixSelectedItems;\n\n if (this.shouldBegin && !this.shouldBegin.call(this, e)) {\n return;\n }\n\n if (!this.shouldUpdate.call(this, e)) {\n return;\n }\n\n e.preventDefault();\n var canvas = graph.get('canvas');\n var point = canvas.getPointByClient(e.clientX, e.clientY);\n var sensitivity = this.get('sensitivity');\n var graphZoom = graph.getZoom();\n var ratio = graphZoom;\n var zoom = graphZoom; // 兼容IE、Firefox及Chrome\n\n if (e.wheelDelta < 0) {\n ratio = 1 - zoom_canvas_DELTA * sensitivity;\n } else {\n ratio = 1 / (1 - zoom_canvas_DELTA * sensitivity);\n }\n\n zoom = graphZoom * ratio; // const zoom = ratio * graphZoom;\n\n var minZoom = this.get('minZoom') || graph.get('minZoom');\n var maxZoom = this.get('maxZoom') || graph.get('maxZoom');\n\n if (zoom > maxZoom || zoom < minZoom) {\n return;\n } // hide the shapes when the zoom ratio is smaller than optimizeZoom\n // hide the shapes when zoomming\n\n\n var enableOptimize = this.get('enableOptimize');\n\n if (enableOptimize) {\n var optimizeZoom_1 = this.get('optimizeZoom');\n var optimized = this.get('optimized');\n var nodes_1 = graph.getNodes();\n var edges_1 = graph.getEdges();\n var nodesLength_1 = nodes_1.length;\n var edgesLength_1 = edges_1.length; // hiding\n\n if (!optimized) {\n for (var n = 0; n < nodesLength_1; n++) {\n var node = nodes_1[n];\n\n if (!node.destroyed) {\n var children = node.get('group').get('children');\n var childrenLength = children.length;\n\n for (var c = 0; c < childrenLength; c++) {\n var shape = children[c];\n\n if (!shape.destoryed && !shape.get('isKeyShape')) {\n shape.set('ori-visibility', shape.get('ori-visibility') || shape.get('visible'));\n shape.hide();\n }\n }\n }\n }\n\n for (var edgeIndex = 0; edgeIndex < edgesLength_1; edgeIndex++) {\n var edge = edges_1[edgeIndex];\n var children = edge.get('group').get('children');\n var childrenLength = children.length;\n\n for (var c = 0; c < childrenLength; c++) {\n var shape = children[c];\n shape.set('ori-visibility', shape.get('ori-visibility') || shape.get('visible'));\n shape.hide();\n }\n }\n\n this.set('optimized', true);\n } // showing after 100ms\n\n\n clearTimeout(this.get('timeout'));\n var timeout = setTimeout(function () {\n var currentZoom = graph.getZoom();\n\n var curOptimized = _this.get('optimized');\n\n if (curOptimized) {\n _this.set('optimized', false);\n\n for (var n = 0; n < nodesLength_1; n++) {\n var node = nodes_1[n];\n var children = node.get('group').get('children');\n var childrenLength = children.length;\n\n if (currentZoom < optimizeZoom_1) {\n var keyShape = node.getKeyShape();\n var oriVis = keyShape.get('ori-visibility');\n if (oriVis) keyShape.show();\n } else {\n for (var c = 0; c < childrenLength; c++) {\n var shape = children[c];\n var oriVis = shape.get('ori-visibility');\n\n if (!shape.get('visible') && oriVis) {\n if (oriVis) shape.show();\n }\n }\n }\n }\n\n for (var edgeIndex = 0; edgeIndex < edgesLength_1; edgeIndex++) {\n var edge = edges_1[edgeIndex];\n var children = edge.get('group').get('children');\n var childrenLength = children.length;\n\n if (currentZoom < optimizeZoom_1) {\n var keyShape = edge.getKeyShape();\n var oriVis = keyShape.get('ori-visibility');\n if (oriVis) keyShape.show();\n } else {\n for (var c = 0; c < childrenLength; c++) {\n var shape = children[c];\n\n if (!shape.get('visible')) {\n var oriVis = shape.get('ori-visibility');\n if (oriVis) shape.show();\n }\n }\n }\n }\n }\n }, 100);\n this.set('timeout', timeout);\n } // fix the items when zooming\n\n\n if (graphZoom <= 1) {\n var fixNodes = void 0,\n fixEdges = void 0;\n\n if (fixSelectedItems.fixAll || fixSelectedItems.fixLineWidth || fixSelectedItems.fixLabel) {\n fixNodes = graph.findAllByState('node', fixSelectedItems.fixState);\n fixEdges = graph.findAllByState('edge', fixSelectedItems.fixState);\n var scale = graphZoom / zoom;\n var fixNodesLength = fixNodes.length;\n\n for (var fn = 0; fn < fixNodesLength; fn++) {\n var node = fixNodes[fn];\n var group = node.getContainer();\n var nodeModel = node.getModel();\n var originStyle = node.getOriginStyle();\n var itemStateStyle = node.getStateStyle(fixSelectedItems.fixState);\n var shapeStateStyle = node.get('shapeFactory').getShape(nodeModel.type).getStateStyle(fixSelectedItems.fixState, node)[fixSelectedItems.fixState];\n\n if (fixSelectedItems.fixAll) {\n if (zoom <= 1) {\n var groupMatrix = Object(esm[\"clone\"])(group.getMatrix());\n if (!groupMatrix) groupMatrix = [1, 0, 0, 0, 1, 0, 0, 0, 1];\n\n var _b = node.getModel(),\n x = _b.x,\n y = _b.y;\n\n groupMatrix = zoom_canvas_transform(groupMatrix, [['t', -x, -y], ['s', scale, scale], ['t', x, y]]);\n group.setMatrix(groupMatrix);\n }\n } else {\n var children = group.get('children');\n var childrenLength = children.length;\n\n for (var c = 0; c < childrenLength; c++) {\n var shape = children[c];\n var fontSize = void 0,\n lineWidth = void 0;\n\n if (fixSelectedItems.fixLabel) {\n var shapeType = shape.get('type');\n\n if (shapeType === 'text') {\n fontSize = shape.attr('fontSize') || 12;\n var itemStyle = itemStateStyle[shape.get('name')];\n var shapeStyle = shapeStateStyle[shape.get('name')];\n var itemFontSize = itemStyle ? itemStyle.fontSize : 12;\n var shapeFontSize = shapeStyle ? shapeStyle.fontSize : 12;\n var oriFontSize = itemFontSize || shapeFontSize || 12;\n if (zoom <= 1) shape.attr('fontSize', oriFontSize / zoom); // * graphZoom / zoom\n\n if (lineWidth) break;\n }\n }\n\n if (fixSelectedItems.fixLineWidth) {\n if (shape.get('isKeyShape')) {\n lineWidth = shape.attr('lineWidth') || 0;\n var oriLineWidth = itemStateStyle.lineWidth || shapeStateStyle.lineWidth || originStyle.lineWidth || 0;\n if (zoom <= 1) shape.attr('lineWidth', oriLineWidth / zoom); // * graphZoom / zoom\n\n if (fontSize) break;\n }\n }\n }\n }\n }\n\n var fixEdgesLength = fixEdges.length;\n\n for (var fe = 0; fe < fixEdgesLength; fe++) {\n var edge = fixEdges[fe];\n var group = edge.getContainer();\n var children = group.get('children');\n var nodeModel = edge.getModel();\n var itemStateStyle = edge.getStateStyle(fixSelectedItems.fixState);\n var shapeStateStyle = edge.get('shapeFactory').getShape(nodeModel.type).getStateStyle(fixSelectedItems.fixState, edge)[fixSelectedItems.fixState];\n var childrenLength = children.length;\n\n for (var c = 0; c < childrenLength; c++) {\n var shape = children[c];\n var fontSize = void 0,\n lineWidth = void 0;\n\n if (fixSelectedItems.fixLabel || fixSelectedItems.fixAll) {\n var shapeType = shape.get('type');\n\n if (shapeType === 'text') {\n fontSize = shape.attr('fontSize') || 12;\n var itemStyle = itemStateStyle[shape.get('name')];\n var shapeStyle = shapeStateStyle[shape.get('name')];\n var itemFontSize = itemStyle ? itemStyle.fontSize : 12;\n var shapeFontSize = shapeStyle ? shapeStyle.fontSize : 12;\n var oriFontSize = itemFontSize || shapeFontSize || 12;\n if (zoom <= 1) shape.attr('fontSize', oriFontSize / zoom);\n if (lineWidth) break;\n }\n }\n\n if (fixSelectedItems.fixLineWidth || fixSelectedItems.fixAll) {\n if (shape.get('isKeyShape')) {\n lineWidth = shape.attr('lineWidth') || 0;\n var oriLineWidth = itemStateStyle.lineWidth || shapeStateStyle.lineWidth || 1;\n if (zoom <= 1) shape.attr('lineWidth', oriLineWidth / zoom);\n if (fontSize) break;\n }\n }\n }\n }\n }\n }\n\n graph.zoomTo(zoom, {\n x: point.x,\n y: point.y\n });\n graph.emit('wheelzoom', e);\n }\n});\n// CONCATENATED MODULE: ./node_modules/@antv/g6-pc/es/behavior/tooltip-base.js\n\n/* harmony default export */ var tooltip_base = ({\n onMouseEnter: function onMouseEnter(e) {\n var item = e.item;\n this.currentTarget = item;\n this.showTooltip(e);\n this.graph.emit('tooltipchange', {\n item: e.item,\n action: 'show'\n });\n },\n onMouseMove: function onMouseMove(e) {\n if (!this.shouldUpdate(e)) {\n this.hideTooltip();\n return;\n }\n\n if (!this.currentTarget || e.item !== this.currentTarget) {\n return;\n }\n\n this.updatePosition(e);\n },\n onMouseLeave: function onMouseLeave(e) {\n if (!this.shouldEnd(e)) {\n return;\n }\n\n this.hideTooltip();\n this.graph.emit('tooltipchange', {\n item: this.currentTarget,\n action: 'hide'\n });\n this.currentTarget = null;\n },\n showTooltip: function showTooltip(e) {\n var container = this.container;\n\n if (!e.item || e.item.destroyed) {\n return;\n }\n\n if (!container) {\n container = this.createTooltip(this.graph.get('canvas'));\n this.container = container;\n }\n\n var text = this.formatText(e.item.get('model'), e);\n container.innerHTML = text;\n modifyCSS(this.container, {\n visibility: 'visible'\n });\n this.updatePosition(e);\n },\n hideTooltip: function hideTooltip() {\n modifyCSS(this.container, {\n visibility: 'hidden'\n });\n },\n updatePosition: function updatePosition(e) {\n var shouldBegin = this.get('shouldBegin');\n\n var _a = this,\n width = _a.width,\n height = _a.height,\n container = _a.container,\n graph = _a.graph;\n\n if (!shouldBegin(e)) {\n modifyCSS(container, {\n visibility: 'hidden'\n });\n return;\n }\n\n var point = graph.getPointByClient(e.clientX, e.clientY);\n\n var _b = graph.getCanvasByPoint(point.x, point.y),\n x = _b.x,\n y = _b.y;\n\n var bbox = container.getBoundingClientRect();\n\n if (x > width / 2) {\n x -= bbox.width;\n } else {\n x += this.offset;\n }\n\n if (y > height / 2) {\n y -= bbox.height;\n } else {\n y += this.offset;\n }\n\n var left = x + \"px\";\n var top = y + \"px\";\n modifyCSS(this.container, {\n left: left,\n top: top,\n visibility: 'visible'\n });\n },\n createTooltip: function createTooltip(canvas) {\n var el = canvas.get('el');\n el.style.position = 'relative';\n var container = createDom(\"
\");\n el.parentNode.appendChild(container);\n modifyCSS(container, {\n position: 'absolute',\n visibility: 'visible'\n });\n this.width = canvas.get('width');\n this.height = canvas.get('height');\n this.container = container;\n this.graph.get('tooltips').push(container);\n return container;\n }\n});\n// CONCATENATED MODULE: ./node_modules/@antv/g6-pc/es/behavior/tooltip.js\n\n\n/* harmony default export */ var behavior_tooltip = (Object(tslib_es6[\"__assign\"])({\n getDefaultCfg: function getDefaultCfg() {\n return {\n item: 'node',\n offset: 12,\n formatText: function formatText(model) {\n return model.label;\n }\n };\n },\n getEvents: function getEvents() {\n return {\n 'node:mouseenter': 'onMouseEnter',\n 'node:mouseleave': 'onMouseLeave',\n 'node:mousemove': 'onMouseMove',\n afterremoveitem: 'onMouseLeave'\n };\n }\n}, tooltip_base));\n// CONCATENATED MODULE: ./node_modules/@antv/g6-pc/es/behavior/edge-tooltip.js\n\n\n/* harmony default export */ var edge_tooltip = (Object(tslib_es6[\"__assign\"])({\n getDefaultCfg: function getDefaultCfg() {\n return {\n item: 'edge',\n offset: 12,\n formatText: function formatText(model) {\n return \"source: \" + model.source + \" target: \" + model.target;\n }\n };\n },\n getEvents: function getEvents() {\n return {\n 'edge:mouseenter': 'onMouseEnter',\n 'edge:mouseleave': 'onMouseLeave',\n 'edge:mousemove': 'onMouseMove',\n afterremoveitem: 'onMouseLeave'\n };\n }\n}, tooltip_base));\n// CONCATENATED MODULE: ./node_modules/@antv/g6-pc/es/behavior/collapse-expand.js\nvar collapse_expand_DEFAULT_TRIGGER = 'click';\nvar collapse_expand_ALLOW_EVENTS = ['click', 'dblclick'];\n/* harmony default export */ var collapse_expand = ({\n getDefaultCfg: function getDefaultCfg() {\n return {\n /**\n * 发生收缩/扩展变化时的回调\n */\n trigger: collapse_expand_DEFAULT_TRIGGER,\n onChange: function onChange() {}\n };\n },\n getEvents: function getEvents() {\n var _a;\n\n var trigger; // 检测输入是否合法\n\n if (collapse_expand_ALLOW_EVENTS.includes(this.trigger)) {\n trigger = this.trigger;\n } else {\n trigger = collapse_expand_DEFAULT_TRIGGER; // eslint-disable-next-line no-console\n\n console.warn(\"Behavior collapse-expand 的 trigger 参数不合法,请输入 'click' 或 'dblclick'\");\n }\n\n return _a = {}, _a[\"node:\" + trigger] = 'onNodeClick', // 支持移动端事件\n _a.touchstart = 'onNodeClick', _a;\n },\n onNodeClick: function onNodeClick(e) {\n var item = e.item;\n if (!item) return; // 如果节点进行过更新,model 会进行 merge,直接改 model 就不能改布局,所以需要去改源数据\n\n var sourceData = this.graph.findDataById(item.get('id'));\n\n if (!sourceData) {\n return;\n }\n\n var children = sourceData.children; // 叶子节点的收缩和展开没有意义\n\n if (!children || children.length === 0) {\n return;\n }\n\n var collapsed = !sourceData.collapsed;\n\n if (!this.shouldBegin(e, collapsed)) {\n return;\n }\n\n sourceData.collapsed = collapsed;\n item.getModel().collapsed = collapsed;\n this.graph.emit('itemcollapsed', {\n item: e.item,\n collapsed: collapsed\n });\n\n if (!this.shouldUpdate(e, collapsed)) {\n return;\n }\n\n this.onChange(item, collapsed);\n this.graph.layout();\n }\n});\n// CONCATENATED MODULE: ./node_modules/@antv/g6-pc/es/behavior/drag-combo.js\n\n/*\n * @Author: moyee\n * @LastEditors: moyee\n * @Description: 拖动 Combo\n */\n\n\n\n\nvar drag_combo_calculationItemsBBox = es_util.calculationItemsBBox;\n/**\n * 遍历拖动的 Combo 下的所有 Combo\n * @param data 拖动的 Combo\n * @param fn\n */\n\nvar drag_combo_traverseCombo = function traverseCombo(data, fn) {\n if (fn(data) === false) {\n return;\n }\n\n if (data) {\n var combos = data.get('combos');\n\n if (combos.length === 0) {\n return false;\n }\n\n Object(esm[\"each\"])(combos, function (child) {\n traverseCombo(child, fn);\n });\n }\n};\n\n/* harmony default export */ var drag_combo = ({\n getDefaultCfg: function getDefaultCfg() {\n return {\n enableDelegate: false,\n delegateStyle: {},\n // 拖动节点过程中是否只改变 Combo 的大小,而不改变其结构\n onlyChangeComboSize: false,\n // 拖动过程中目标 combo 状态样式\n activeState: '',\n selectedState: 'selected'\n };\n },\n getEvents: function getEvents() {\n return {\n 'combo:dragstart': 'onDragStart',\n 'combo:drag': 'onDrag',\n 'combo:dragend': 'onDragEnd',\n 'combo:drop': 'onDrop',\n 'node:drop': 'onNodeDrop',\n 'combo:dragenter': 'onDragEnter',\n 'combo:dragleave': 'onDragLeave'\n };\n },\n validationCombo: function validationCombo(evt) {\n var item = evt.item;\n\n if (!item || item.destroyed) {\n return false;\n }\n\n if (!this.shouldUpdate.call(this, evt)) {\n return false;\n }\n\n var type = item.getType();\n\n if (type !== 'combo') {\n return false;\n }\n\n return true;\n },\n onDragStart: function onDragStart(evt) {\n var _this = this;\n\n var graph = this.graph;\n var item = evt.item;\n this.currentShouldEnd = true;\n if (!this.validationCombo(evt)) return;\n this.targets = []; // 获取所有选中的 Combo\n\n var combos = graph.findAllByState('combo', this.selectedState);\n var currentCombo = item.get('id');\n var dragCombos = combos.filter(function (combo) {\n var comboId = combo.get('id');\n return currentCombo === comboId;\n });\n\n if (dragCombos.length === 0) {\n this.targets.push(item);\n } else {\n this.targets = combos;\n }\n\n if (this.activeState) {\n this.targets.map(function (combo) {\n var model = combo.getModel();\n\n if (model.parentId) {\n var parentCombo = graph.findById(model.parentId);\n\n if (parentCombo) {\n graph.setItemState(parentCombo, _this.activeState, true);\n }\n }\n });\n }\n\n this.point = {};\n this.originPoint = {};\n this.origin = {\n x: evt.x,\n y: evt.y\n };\n this.currentItemChildCombos = [];\n drag_combo_traverseCombo(item, function (param) {\n if (param.destroyed) {\n return false;\n }\n\n var model = param.getModel();\n\n _this.currentItemChildCombos.push(model.id);\n\n return true;\n });\n },\n onDrag: function onDrag(evt) {\n var _this = this;\n\n if (!this.origin) {\n return;\n }\n\n if (!this.validationCombo(evt)) return;\n\n if (this.enableDelegate) {\n this.updateDelegate(evt);\n } else {\n if (this.activeState) {\n var graph_1 = this.graph;\n var item = evt.item;\n var model_1 = item.getModel(); // 拖动过程中实时计算距离\n\n var combos = graph_1.getCombos();\n var sourceBBox = item.getBBox();\n var centerX_1 = sourceBBox.centerX,\n centerY_1 = sourceBBox.centerY,\n width_1 = sourceBBox.width; // 参与计算的 Combo,需要排除掉:\n // 1、拖动 combo 自己\n // 2、拖动 combo 的 parent\n // 3、拖动 Combo 的 children\n\n var calcCombos = combos.filter(function (combo) {\n var cmodel = combo.getModel(); // 被拖动的是最外层的 Combo,无 parent,排除自身和子元素\n\n if (!model_1.parentId) {\n return cmodel.id !== model_1.id && !_this.currentItemChildCombos.includes(cmodel.id);\n }\n\n return cmodel.id !== model_1.id && !_this.currentItemChildCombos.includes(cmodel.id);\n });\n calcCombos.map(function (combo) {\n var _a = combo.getBBox(),\n cx = _a.centerX,\n cy = _a.centerY,\n w = _a.width; // 拖动的 combo 和要进入的 combo 之间的距离\n\n\n var disX = centerX_1 - cx;\n var disY = centerY_1 - cy; // 圆心距离\n\n var distance = 2 * Math.sqrt(disX * disX + disY * disY);\n\n if (width_1 + w - distance > 0.8 * width_1) {\n graph_1.setItemState(combo, _this.activeState, true);\n } else {\n graph_1.setItemState(combo, _this.activeState, false);\n }\n });\n }\n\n Object(esm[\"each\"])(this.targets, function (item) {\n _this.updateCombo(item, evt);\n });\n }\n },\n updatePositions: function updatePositions(evt, restore) {\n var _this = this; // 当启用 delegate 时,拖动结束时需要更新 combo\n\n\n if (this.enableDelegate || restore) {\n Object(esm[\"each\"])(this.targets, function (item) {\n _this.updateCombo(item, evt, restore);\n });\n }\n },\n onDrop: function onDrop(evt) {\n var _this = this; // 被放下的目标 combo\n\n\n var item = evt.item;\n this.currentShouldEnd = this.shouldEnd.call(this, evt, item);\n this.updatePositions(evt, !this.currentShouldEnd);\n if (!this.currentShouldEnd || !item || !this.targets || item.destroyed) return;\n var graph = this.graph;\n var targetModel = item.getModel();\n this.targets.map(function (combo) {\n var model = combo.getModel();\n\n if (model.parentId !== targetModel.id) {\n if (_this.activeState) {\n graph.setItemState(item, _this.activeState, false);\n } // 将 Combo 放置到某个 Combo 上面时,只有当 onlyChangeComboSize 为 false 时候才更新 Combo 结构\n\n\n if (!_this.onlyChangeComboSize) {\n graph.updateComboTree(combo, targetModel.id);\n } else {\n graph.updateCombo(combo);\n }\n } else {\n graph.updateCombo(item);\n }\n });\n this.end(item, evt); // 如果已经拖放下了,则不需要再通过距离判断了\n\n this.endComparison = true;\n },\n onNodeDrop: function onNodeDrop(evt) {\n var _this = this;\n\n if (!this.targets || this.targets.length === 0) return;\n var graph = this.graph;\n var item = evt.item;\n var comboId = item.getModel().comboId;\n var newParentCombo = comboId ? graph.findById(comboId) : undefined;\n this.currentShouldEnd = this.shouldEnd.call(this, evt, newParentCombo);\n this.updatePositions(evt, !this.currentShouldEnd);\n if (!this.currentShouldEnd) return;\n var droppedCombo; // 如果被放置的的节点有 comboId,且这个 comboId 与正在被拖拽的 combo 的父 id 不相同,则更新父亲为 comboId\n\n if (comboId) {\n if (this.activeState) {\n var combo = graph.findById(comboId);\n graph.setItemState(combo, this.activeState, false);\n }\n\n this.targets.map(function (combo) {\n if (!_this.onlyChangeComboSize) {\n if (comboId !== combo.getID()) {\n droppedCombo = graph.findById(comboId);\n if (comboId !== combo.getModel().parentId) graph.updateComboTree(combo, comboId);\n }\n } else {\n graph.updateCombo(combo);\n }\n });\n } else {\n // 如果被放置的节点没有 comboId,且正在被拖拽的 combo 有父 id,则更新父亲为 undefined\n this.targets.map(function (combo) {\n if (!_this.onlyChangeComboSize) {\n var model = combo.getModel();\n\n if (model.comboId) {\n graph.updateComboTree(combo);\n }\n } else {\n graph.updateCombo(combo);\n }\n });\n } // 如果已经拖放下了,则不需要再通过距离判断了\n\n\n this.endComparison = true;\n this.end(droppedCombo, evt);\n },\n onDragEnter: function onDragEnter(evt) {\n if (!this.origin) {\n return;\n }\n\n if (!this.validationCombo(evt)) return;\n var item = evt.item;\n var graph = this.graph;\n\n if (this.activeState) {\n graph.setItemState(item, this.activeState, true);\n }\n },\n onDragLeave: function onDragLeave(evt) {\n if (!this.origin) {\n return;\n }\n\n if (!this.validationCombo(evt)) return;\n var item = evt.item;\n var graph = this.graph;\n\n if (this.activeState) {\n graph.setItemState(item, this.activeState, false);\n }\n },\n onDragEnd: function onDragEnd(evt) {\n if (!this.targets || this.targets.length === 0) return;\n var item = evt.item;\n\n if (this.currentShouldEnd) {\n this.updatePositions(evt);\n }\n\n var parentCombo = this.getParentCombo(item.getModel().parentId);\n var graph = this.graph;\n\n if (parentCombo && this.activeState) {\n graph.setItemState(parentCombo, this.activeState, false);\n }\n\n this.end(undefined, evt);\n },\n end: function end(comboDropedOn, evt) {\n var _this = this;\n\n if (!this.origin) return;\n var graph = this.graph; // 删除delegate shape\n\n if (this.delegateShape) {\n var delegateGroup = graph.get('delegateGroup');\n delegateGroup.clear();\n this.delegateShape = null;\n }\n\n if (comboDropedOn && this.activeState) {\n graph.setItemState(comboDropedOn, this.activeState, false);\n } // 若没有被放置的 combo,则是被放置在画布上\n\n\n if (!comboDropedOn) {\n this.targets.map(function (combo) {\n // 将 Combo 放置到某个 Combo 上面时,只有当 onlyChangeComboSize 为 false 时候才更新 Combo 结构\n if (!_this.onlyChangeComboSize) {\n graph.updateComboTree(combo);\n } else {\n graph.updateCombo(combo);\n }\n });\n }\n\n this.point = [];\n this.origin = null;\n this.originPoint = null;\n this.targets.length = 0;\n },\n\n /**\n * 遍历 comboTree,分别更新 node 和 combo\n * @param data\n * @param fn\n */\n traverse: function traverse(data, fn) {\n var _this = this;\n\n if (fn(data) === false) {\n return;\n }\n\n if (data) {\n var combos = data.get('combos');\n Object(esm[\"each\"])(combos, function (child) {\n _this.traverse(child, fn);\n });\n var nodes = data.get('nodes');\n Object(esm[\"each\"])(nodes, function (child) {\n _this.traverse(child, fn);\n });\n }\n },\n updateCombo: function updateCombo(item, evt, restore) {\n var _this = this;\n\n this.traverse(item, function (param) {\n if (param.destroyed) {\n return false;\n }\n\n _this.updateSignleItem(param, evt, restore);\n\n return true;\n });\n },\n\n /**\n *\n * @param item 当前正在拖动的元素\n * @param evt\n */\n updateSignleItem: function updateSignleItem(item, evt, restore) {\n var origin = this.origin;\n var graph = this.graph;\n var model = item.getModel();\n var itemId = item.get('id');\n\n if (!this.point[itemId]) {\n this.point[itemId] = {\n x: model.x,\n y: model.y\n };\n }\n\n var x = evt.x - origin.x + this.point[itemId].x;\n var y = evt.y - origin.y + this.point[itemId].y;\n\n if (restore) {\n x += origin.x - evt.x;\n y += origin.y - evt.y;\n }\n\n graph.updateItem(item, {\n x: x,\n y: y\n });\n },\n\n /**\n * 根据 ID 获取父 Combo\n * @param parentId 父 Combo ID\n */\n getParentCombo: function getParentCombo(parentId) {\n var graph = this.graph;\n\n if (!parentId) {\n return undefined;\n }\n\n var parentCombo = graph.findById(parentId);\n\n if (!parentCombo) {\n return undefined;\n }\n\n return parentCombo;\n },\n updateDelegate: function updateDelegate(evt) {\n var graph = this.graph; // 当没有 delegate shape 时创建\n\n if (!this.delegateShape) {\n var delegateGroup = graph.get('delegateGroup');\n var bbox = null;\n\n if (this.targets.length > 1) {\n bbox = drag_combo_calculationItemsBBox(this.targets);\n } else {\n bbox = this.targets[0].getBBox();\n }\n\n var x = bbox.x,\n y = bbox.y,\n width = bbox.width,\n height = bbox.height,\n minX = bbox.minX,\n minY = bbox.minY;\n this.originPoint = {\n x: x,\n y: y,\n width: width,\n height: height,\n minX: minX,\n minY: minY\n };\n\n var attrs = Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, es_global.delegateStyle), this.delegateStyle);\n\n this.delegateShape = delegateGroup.addShape('rect', {\n attrs: Object(tslib_es6[\"__assign\"])({\n width: bbox.width,\n height: bbox.height,\n x: bbox.x,\n y: bbox.y\n }, attrs),\n name: 'combo-delegate-shape'\n });\n this.delegateShape.set('capture', false);\n this.delegate = this.delegateShape;\n } else {\n var clientX = evt.x - this.origin.x + this.originPoint.minX;\n var clientY = evt.y - this.origin.y + this.originPoint.minY;\n this.delegateShape.attr({\n x: clientX,\n y: clientY\n });\n }\n }\n});\n// CONCATENATED MODULE: ./node_modules/@antv/g6-pc/es/behavior/collapse-expand-combo.js\n/*\n * @Author: Shiwu\n * @Description: 收起和展开 Combo\n */\nvar collapse_expand_combo_DEFAULT_TRIGGER = 'dblclick';\nvar collapse_expand_combo_ALLOW_EVENTS = ['click', 'dblclick'];\n/* harmony default export */ var collapse_expand_combo = ({\n getDefaultCfg: function getDefaultCfg() {\n return {\n trigger: collapse_expand_combo_DEFAULT_TRIGGER,\n relayout: true\n };\n },\n getEvents: function getEvents() {\n var _a;\n\n var trigger; // 检测输入是否合法\n\n if (collapse_expand_combo_ALLOW_EVENTS.includes(this.trigger)) {\n trigger = this.trigger;\n } else {\n trigger = collapse_expand_combo_DEFAULT_TRIGGER; // eslint-disable-next-line no-console\n\n console.warn(\"Behavior collapse-expand-group 的 trigger 参数不合法,请输入 'click' 或 'dblclick'\");\n }\n\n return _a = {}, _a[\"combo:\" + trigger] = 'onComboClick', _a;\n },\n onComboClick: function onComboClick(evt) {\n var item = evt.item;\n\n var _a = this,\n graph = _a.graph,\n relayout = _a.relayout;\n\n if (!item || item.destroyed || item.getType() !== 'combo') return;\n var model = item.getModel();\n var comboId = model.id;\n\n if (!comboId) {\n return;\n }\n\n graph.collapseExpandCombo(comboId);\n if (relayout && graph.get('layout')) graph.layout();else graph.refreshPositions();\n }\n});\n// CONCATENATED MODULE: ./node_modules/@antv/g6-pc/es/behavior/lasso-select.js\n\n\nvar lasso_select_isPolygonsIntersect = es_util.isPolygonsIntersect,\n lasso_select_pathToPoints = es_util.pathToPoints;\nvar lasso_select_DEFAULT_TRIGGER = 'shift';\nvar lasso_select_ALLOW_EVENTS = ['drag', 'shift', 'ctrl', 'alt', 'control'];\n\nvar isItemIntersecPolygon = function isItemIntersecPolygon(item, polyPoints) {\n var shapePoints;\n var shape = item.getKeyShape();\n\n if (item.get('type') === 'path') {\n shapePoints = lasso_select_pathToPoints(shape.attr('path'));\n } else {\n var shapeBBox = shape.getCanvasBBox();\n shapePoints = [[shapeBBox.minX, shapeBBox.minY], [shapeBBox.maxX, shapeBBox.minY], [shapeBBox.maxX, shapeBBox.maxY], [shapeBBox.minX, shapeBBox.maxY]];\n }\n\n return lasso_select_isPolygonsIntersect(polyPoints, shapePoints);\n};\n\n/* harmony default export */ var lasso_select = ({\n getDefaultCfg: function getDefaultCfg() {\n return {\n delegateStyle: {\n fill: '#EEF6FF',\n fillOpacity: 0.4,\n stroke: '#DDEEFE',\n lineWidth: 1\n },\n onSelect: function onSelect() {},\n onDeselect: function onDeselect() {},\n selectedState: 'selected',\n trigger: lasso_select_DEFAULT_TRIGGER,\n includeEdges: true,\n selectedEdges: [],\n selectedNodes: [] // multiple: false,\n\n };\n },\n getEvents: function getEvents() {\n // 检测输入是否合法\n if (!(lasso_select_ALLOW_EVENTS.indexOf(this.trigger.toLowerCase()) > -1)) {\n this.trigger = lasso_select_DEFAULT_TRIGGER;\n console.warn(\"Behavior lasso-select 的 trigger 参数不合法,请输入 'drag'、'shift'、'ctrl' 或 'alt'\");\n }\n\n if (this.trigger === 'drag') {\n return {\n dragstart: 'onDragStart',\n drag: 'onDragMove',\n dragend: 'onDragEnd',\n 'canvas:click': 'clearStates'\n };\n }\n\n return {\n dragstart: 'onDragStart',\n drag: 'onDragMove',\n dragend: 'onDragEnd',\n keyup: 'onKeyUp',\n keydown: 'onKeyDown',\n 'canvas:click': 'clearStates'\n };\n },\n onDragStart: function onDragStart(e) {\n var lasso = this.lasso;\n var item = e.item; // 排除在节点上拖动\n\n if (item) {\n return;\n }\n\n if (this.trigger !== 'drag' && !this.keydown) {\n return;\n }\n\n if (this.selectedNodes && this.selectedNodes.length !== 0) {\n this.clearStates();\n }\n\n if (!lasso) {\n lasso = this.createLasso();\n }\n\n this.dragging = true;\n this.originPoint = {\n x: e.x,\n y: e.y\n };\n this.points.push(this.originPoint);\n lasso.show();\n },\n onDragMove: function onDragMove(e) {\n if (!this.dragging) {\n return;\n }\n\n if (this.trigger !== 'drag' && !this.keydown) {\n return;\n }\n\n this.points.push({\n x: e.x,\n y: e.y\n });\n this.updateLasso(e);\n },\n onDragEnd: function onDragEnd(e) {\n if (!this.lasso && !this.dragging) {\n return;\n }\n\n if (this.trigger !== 'drag' && !this.keydown) {\n return;\n }\n\n this.points.push(this.originPoint);\n this.getSelectedItems();\n this.lasso.remove(true);\n this.lasso = null;\n this.points = [];\n this.dragging = false;\n },\n getLassoPath: function getLassoPath() {\n var points = this.points;\n var path = [];\n\n if (points.length) {\n points.forEach(function (point, index) {\n if (index === 0) {\n path.push(['M', point.x, point.y]);\n } else {\n path.push(['L', point.x, point.y]);\n }\n });\n path.push(['L', points[0].x, points[0].y]);\n }\n\n return path;\n },\n clearStates: function clearStates() {\n var _a = this,\n graph = _a.graph,\n selectedState = _a.selectedState;\n\n var nodes = graph.findAllByState('node', selectedState);\n var edges = graph.findAllByState('edge', selectedState);\n nodes.forEach(function (node) {\n return graph.setItemState(node, selectedState, false);\n });\n edges.forEach(function (edge) {\n return graph.setItemState(edge, selectedState, false);\n });\n\n if (this.onDeselect) {\n this.onDeselect(this.selectedNodes, this.selectedEdges);\n }\n\n this.selectedNodes = [];\n this.selectedEdges = [];\n graph.emit('nodeselectchange', {\n selectedItems: {\n nodes: [],\n edges: []\n },\n select: false\n });\n },\n getSelectedItems: function getSelectedItems() {\n var _this = this;\n\n var _a = this,\n graph = _a.graph,\n shouldUpdate = _a.shouldUpdate;\n\n var lassoContour = this.points.map(function (point) {\n return [graph.getCanvasByPoint(point.x, point.y).x, graph.getCanvasByPoint(point.x, point.y).y];\n });\n var state = this.selectedState;\n var selectedNodes = [];\n var selectedIds = [];\n graph.getNodes().forEach(function (node) {\n if (!node.isVisible()) return; // 隐藏节点不能被选中\n\n if (isItemIntersecPolygon(node, lassoContour)) {\n if (shouldUpdate(node, 'select')) {\n selectedNodes.push(node);\n var model = node.getModel();\n selectedIds.push(model.id);\n graph.setItemState(node, state, true);\n }\n }\n });\n var selectedEdges = [];\n\n if (this.includeEdges) {\n // 选中边,边的source和target都在选中的节点中时才选中\n selectedNodes.forEach(function (node) {\n var edges = node.getOutEdges();\n edges.forEach(function (edge) {\n if (!edge.isVisible()) return; // 隐藏边不能够被选中\n\n var model = edge.getModel();\n var source = model.source,\n target = model.target;\n\n if (selectedIds.includes(source) && selectedIds.includes(target) && shouldUpdate(edge, 'select')) {\n selectedEdges.push(edge);\n graph.setItemState(edge, _this.selectedState, true);\n }\n });\n });\n }\n\n this.selectedEdges = selectedEdges;\n this.selectedNodes = selectedNodes;\n\n if (this.onSelect) {\n this.onSelect(selectedNodes, selectedEdges);\n }\n\n graph.emit('nodeselectchange', {\n selectedItems: {\n nodes: selectedNodes,\n edges: selectedEdges\n },\n select: true\n });\n },\n createLasso: function createLasso() {\n var self = this;\n var lasso = self.graph.get('delegateGroup').addShape('path', {\n attrs: Object(tslib_es6[\"__assign\"])({\n path: []\n }, self.delegateStyle),\n capture: false,\n name: 'lasso-shape'\n });\n this.lasso = lasso;\n this.delegate = lasso;\n this.points = [];\n return lasso;\n },\n updateLasso: function updateLasso(e) {\n var self = this;\n this.lasso.attr({\n path: self.getLassoPath()\n });\n },\n onKeyDown: function onKeyDown(e) {\n var code = e.key;\n\n if (!code) {\n return;\n } // if (this.selectedNodes && this.selectedNodes.length !== 0) {\n // this.clearStates();\n // }\n\n\n if (code.toLowerCase() === this.trigger.toLowerCase()) {\n this.keydown = true;\n } else {\n this.keydown = false;\n }\n },\n onKeyUp: function onKeyUp() {\n if (this.lasso) {\n // 清除所有选中状态后,设置拖得动状态为false,并清除框选的lasso\n this.lasso.remove(true);\n this.lasso = null;\n this.points = [];\n this.dragging = false;\n }\n\n this.keydown = false;\n }\n});\n// CONCATENATED MODULE: ./node_modules/@antv/g6-pc/es/behavior/create-edge.js\n\n\nvar create_edge_DEFAULT_TRIGGER = 'click';\nvar create_edge_ALLOW_EVENTS = ['click', 'drag'];\nvar DEFAULT_KEY = undefined;\nvar ALLOW_KEYS = ['shift', 'ctrl', 'control', 'alt', 'meta', undefined];\n/* harmony default export */ var create_edge = ({\n getDefaultCfg: function getDefaultCfg() {\n return {\n trigger: create_edge_DEFAULT_TRIGGER,\n key: DEFAULT_KEY,\n edgeConfig: {},\n getEdgeConfig: undefined\n };\n },\n getEvents: function getEvents() {\n var self = this; // 检测输入是否合法\n\n if (!(create_edge_ALLOW_EVENTS.indexOf(self.trigger.toLowerCase()) > -1)) {\n self.trigger = create_edge_DEFAULT_TRIGGER; // eslint-disable-next-line no-console\n\n console.warn(\"Behavior create-edge 的 trigger 参数不合法,请输入 'click','drag'\");\n }\n\n if (self.key && ALLOW_KEYS.indexOf(self.key.toLowerCase()) === -1) {\n self.trigger = DEFAULT_KEY; // eslint-disable-next-line no-console\n\n console.warn(\"Behavior create-edge 的 key 参数不合法,请输入 'shift','ctrl','alt','control',或 undefined\");\n }\n\n var events;\n\n if (self.trigger === 'drag') {\n events = {\n 'node:dragstart': 'onClick',\n 'combo:dragstart': 'onClick',\n drag: 'updateEndPoint',\n 'node:drop': 'onClick',\n 'combo:drop': 'onClick',\n dragend: 'onDragEnd'\n };\n } else if (self.trigger === 'click') {\n events = {\n 'node:click': 'onClick',\n mousemove: 'updateEndPoint',\n 'edge:click': 'cancelCreating',\n 'canvas:click': 'cancelCreating',\n 'combo:click': 'onClick'\n };\n }\n\n if (self.key) {\n events.keydown = 'onKeyDown';\n events.keyup = 'onKeyUp';\n }\n\n return events;\n },\n onDragEnd: function onDragEnd(ev) {\n var self = this;\n if (self.key && !self.keydown) return;\n var item = ev.item;\n if (!item || item.getID() === self.source || item.getType() !== 'node') self.cancelCreating({\n item: self.edge,\n x: ev.x,\n y: ev.y\n });\n },\n // 如果边的起点没有指定,则根据起点创建新边;如果起点已经指定而终点未指定,则指定终点\n onClick: function onClick(ev) {\n var self = this;\n if (self.key && !self.keydown) return;\n var node = ev.item;\n var graph = self.graph;\n var model = node.getModel();\n var getEdgeConfig = self.getEdgeConfig; // 如果起点已经指定而终点未指定,则指定终点\n\n if (self.addingEdge && self.edge) {\n if (!self.shouldEnd.call(self, ev)) return;\n var edgeConfig = void 0;\n\n if (getEdgeConfig && Object(esm[\"isFunction\"])(getEdgeConfig)) {\n edgeConfig = getEdgeConfig({\n source: self.source,\n target: model.id\n });\n } else {\n edgeConfig = self.edgeConfig;\n }\n\n var updateCfg = Object(tslib_es6[\"__assign\"])({\n target: model.id\n }, edgeConfig);\n\n if (self.source === model.id) {\n updateCfg.type = 'loop';\n }\n\n graph.emit('beforecreateedge', {});\n graph.updateItem(self.edge, updateCfg, false);\n\n if (graph.get('enabledStack')) {\n var addedModel = Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, self.edge.getModel()), {\n itemType: 'edge'\n });\n\n var after = {};\n after.edges = [addedModel];\n graph.pushStack('add', {\n before: {},\n after: after\n });\n }\n\n graph.emit('aftercreateedge', {\n edge: self.edge\n }); // 暂时将该边的 capture 恢复为 true\n\n self.edge.getKeyShape().set('capture', true);\n self.edge = null;\n self.addingEdge = false;\n } else {\n // 如果边的起点没有指定,则根据起点创建新边\n if (!self.shouldBegin.call(self, ev)) return; // 获取自定义 edge 配置\n\n var edgeConfig = void 0;\n\n if (getEdgeConfig && Object(esm[\"isFunction\"])(getEdgeConfig)) {\n edgeConfig = getEdgeConfig({\n source: model.id,\n target: model.id\n });\n } else {\n edgeConfig = self.edgeConfig;\n }\n\n self.edge = graph.addItem('edge', Object(tslib_es6[\"__assign\"])({\n source: model.id,\n target: model.id\n }, edgeConfig), false);\n self.source = model.id;\n self.addingEdge = true; // 暂时将该边的 capture 设置为 false,这样可以拾取到后面的元素\n\n self.edge.getKeyShape().set('capture', false);\n }\n },\n // 边的起点已经确定,边的末端跟随鼠标移动\n updateEndPoint: function updateEndPoint(ev) {\n var self = this;\n if (self.key && !self.keydown) return;\n var point = {\n x: ev.x,\n y: ev.y\n }; // 若此时 source 节点已经被移除,结束添加边\n\n if (!self.graph.findById(self.source)) {\n self.addingEdge = false;\n return;\n }\n\n if (self.addingEdge && self.edge) {\n // 更新边的终点为鼠标位置\n self.graph.updateItem(self.edge, {\n target: point\n }, false);\n }\n },\n // 取消增加边,删除该边;或指定终点\n cancelCreating: function cancelCreating(ev) {\n var self = this;\n if (self.key && !self.keydown) return;\n var graph = self.graph;\n var currentEdge = ev.item;\n\n if (self.addingEdge && ev.target && ev.target.isCanvas && ev.target.isCanvas()) {\n graph.removeItem(self.edge, false);\n self.edge = null;\n self.addingEdge = false;\n return;\n }\n\n if (self.addingEdge && self.edge === currentEdge) {\n graph.removeItem(self.edge, false);\n self.edge = null;\n self.addingEdge = false;\n }\n },\n onKeyDown: function onKeyDown(e) {\n var self = this;\n var code = e.key;\n\n if (!code) {\n return;\n }\n\n if (code.toLowerCase() === self.key.toLowerCase()) {\n self.keydown = true;\n } else {\n self.keydown = false;\n }\n },\n onKeyUp: function onKeyUp() {\n var self = this;\n\n if (self.addingEdge && self.edge) {\n // 清除正在增加的边\n self.graph.removeItem(self.edge, false);\n self.addingEdge = false;\n self.edge = null;\n }\n\n this.keydown = false;\n }\n});\n// CONCATENATED MODULE: ./node_modules/@antv/g6-pc/es/behavior/shortcuts-call.js\nvar shortcuts_call_DEFAULT_TRIGGER = 'ctrl';\nvar shortcuts_call_ALLOW_EVENTS = ['shift', 'ctrl', 'alt', 'control'];\nvar DEFAULT_COMBINED_KEY = '1';\n/* harmony default export */ var shortcuts_call = ({\n getDefaultCfg: function getDefaultCfg() {\n return {\n trigger: shortcuts_call_DEFAULT_TRIGGER,\n combinedKey: DEFAULT_COMBINED_KEY,\n functionName: 'fitView',\n functionParams: []\n };\n },\n getEvents: function getEvents() {\n // 检测输入是否合法\n if (!(shortcuts_call_ALLOW_EVENTS.indexOf(this.trigger.toLowerCase()) > -1)) {\n this.trigger = shortcuts_call_DEFAULT_TRIGGER;\n console.warn(\"Behavior shortcuts-fit-view \\u7684 trigger \\u53C2\\u6570 '\" + this.trigger + \"' \\u4E0D\\u5408\\u6CD5\\uFF0C\\u8BF7\\u8F93\\u5165 'drag'\\u3001'shift'\\u3001'ctrl' \\u6216 'alt'\");\n }\n\n if (this.combinedKey === this.trigger) {\n this.combinedKey = undefined;\n }\n\n return {\n keyup: 'onKeyUp',\n keydown: 'onKeyDown'\n };\n },\n onKeyDown: function onKeyDown(e) {\n var code = e.key;\n\n if (!code) {\n return;\n }\n\n var triggerLowerCase = this.trigger.toLowerCase();\n var codeLowerCase = code.toLowerCase(); // 按住 control 键时,允许用户设置 trigger 为 ctrl\n\n if (!this.triggerKeydown) {\n if (codeLowerCase === triggerLowerCase || codeLowerCase === 'control' && triggerLowerCase === 'ctrl' || codeLowerCase === 'ctrl' && triggerLowerCase === 'control') {\n this.triggerKeydown = true;\n } else {\n this.triggerKeydown = false;\n }\n }\n\n var graph = this.graph;\n\n if (!graph[this.functionName]) {\n console.warn(\"Behavior shortcuts-fit-view \\u7684 functionName \\u53C2\\u6570 '\" + this.functionName + \"' \\u4E0D\\u5408\\u6CD5\\uFF0C\\u5B83\\u4E0D\\u662F Graph \\u7684\\u4E00\\u4E2A\\u51FD\\u6570\\u540D\");\n return {};\n } // 未配置 combinedKey,直接 fitView\n\n\n if (this.triggerKeydown && !this.combinedKey) {\n if (this.functionParams && this.functionParams.length) graph[this.functionName].apply(graph, this.functionParams);else graph[this.functionName]();\n return;\n }\n\n var combinedKeyLowerCase = this.combinedKey.toLowerCase();\n\n if (this.triggerKeydown) {\n if (codeLowerCase === combinedKeyLowerCase || codeLowerCase === 'control' && combinedKeyLowerCase === 'ctrl' || codeLowerCase === 'ctrl' && combinedKeyLowerCase === 'control') {\n if (this.functionParams && this.functionParams.length) graph[this.functionName].apply(graph, this.functionParams);else graph[this.functionName]();\n }\n }\n },\n onKeyUp: function onKeyUp() {\n if (this.brush) {\n // 清除所有选中状态后,设置拖得动状态为false,并清除框选的brush\n this.brush.remove(true);\n this.brush = null;\n this.dragging = false;\n }\n\n this.triggerKeydown = false;\n }\n});\n// CONCATENATED MODULE: ./node_modules/@antv/g6-pc/es/behavior/scroll-canvas.js\nvar scroll_canvas_ALLOW_EVENTS = ['shift', 'ctrl', 'alt', 'control'];\n/* harmony default export */ var scroll_canvas = ({\n getDefaultCfg: function getDefaultCfg() {\n return {\n direction: 'both',\n enableOptimize: false,\n zoomKey: 'ctrl',\n // scroll-canvas 可滚动的扩展范围,默认为 0,即最多可以滚动一屏的位置\n // 当设置的值大于 0 时,即滚动可以超过一屏\n // 当设置的值小于 0 时,相当于缩小了可滚动范围\n // 具体实例可参考:https://gw.alipayobjects.com/mdn/rms_f8c6a0/afts/img/A*IFfoS67_HssAAAAAAAAAAAAAARQnAQ\n scalableRange: 0\n };\n },\n getEvents: function getEvents() {\n if (!this.zoomKey || scroll_canvas_ALLOW_EVENTS.indexOf(this.zoomKey) === -1) this.zoomKey = 'ctrl';\n return {\n wheel: 'onWheel'\n };\n },\n onWheel: function onWheel(ev) {\n var _this = this;\n\n var graph = this.graph;\n var keyDown = ev[this.zoomKey + \"Key\"];\n if (this.zoomKey === 'control') keyDown = ev.ctrlKey;\n\n if (keyDown) {\n var canvas = graph.get('canvas');\n var point = canvas.getPointByClient(ev.clientX, ev.clientY);\n var ratio = graph.getZoom();\n\n if (ev.wheelDelta > 0) {\n ratio = ratio + ratio * 0.05;\n } else {\n ratio = ratio - ratio * 0.05;\n }\n\n graph.zoomTo(ratio, {\n x: point.x,\n y: point.y\n });\n } else {\n var dx = ev.deltaX || ev.movementX;\n var dy = ev.deltaY || ev.movementY;\n if (!dy && navigator.userAgent.indexOf('Firefox') > -1) dy = -ev.wheelDelta * 125 / 3;\n var width = this.graph.get('width');\n var height = this.graph.get('height');\n var graphCanvasBBox = this.graph.get('canvas').getCanvasBBox();\n var expandWidth = this.scalableRange;\n var expandHeight = this.scalableRange; // 若 scalableRange 是 0~1 的小数,则作为比例考虑\n\n if (expandWidth < 1 && expandWidth > -1) {\n expandWidth = width * expandWidth;\n expandHeight = height * expandHeight;\n }\n\n var minX = graphCanvasBBox.minX,\n maxX = graphCanvasBBox.maxX,\n minY = graphCanvasBBox.minY,\n maxY = graphCanvasBBox.maxY;\n\n if (dx > 0) {\n if (maxX < -expandWidth) {\n dx = 0;\n } else if (maxX - dx < -expandWidth) {\n dx = maxX + expandWidth;\n }\n } else if (dx < 0) {\n if (minX > width + expandWidth) {\n dx = 0;\n } else if (minX - dx > width + expandWidth) {\n dx = minX - (width + expandWidth);\n }\n }\n\n if (dy > 0) {\n if (maxY < -expandHeight) {\n dy = 0;\n } else if (maxY - dy < -expandHeight) {\n dy = maxY + expandHeight;\n }\n } else if (dy < 0) {\n if (minY > height + expandHeight) {\n dy = 0;\n } else if (minY - dy > height + expandHeight) {\n dy = minY - (height + expandHeight);\n }\n }\n\n if (this.get('direction') === 'x') {\n dy = 0;\n } else if (this.get('direction') === 'y') {\n dx = 0;\n }\n\n graph.translate(-dx, -dy);\n }\n\n ev.preventDefault(); // hide the shapes when the zoom ratio is smaller than optimizeZoom\n // hide the shapes when zoomming\n\n var enableOptimize = this.get('enableOptimize');\n\n if (enableOptimize) {\n var optimizeZoom_1 = this.get('optimizeZoom');\n var optimized = this.get('optimized');\n var nodes_1 = graph.getNodes();\n var edges_1 = graph.getEdges();\n var nodesLength_1 = nodes_1.length;\n var edgesLength_1 = edges_1.length; // hiding\n\n if (!optimized) {\n for (var n = 0; n < nodesLength_1; n++) {\n var node = nodes_1[n];\n\n if (!node.destroyed) {\n var children = node.get('group').get('children');\n var childrenLength = children.length;\n\n for (var c = 0; c < childrenLength; c++) {\n var shape = children[c];\n\n if (!shape.destoryed && !shape.get('isKeyShape')) {\n shape.set('ori-visibility', shape.get('ori-visibility') || shape.get('visible'));\n shape.hide();\n }\n }\n }\n }\n\n for (var edgeIndex = 0; edgeIndex < edgesLength_1; edgeIndex++) {\n var edge = edges_1[edgeIndex];\n var children = edge.get('group').get('children');\n var childrenLength = children.length;\n\n for (var c = 0; c < childrenLength; c++) {\n var shape = children[c];\n shape.set('ori-visibility', shape.get('ori-visibility') || shape.get('visible'));\n shape.hide();\n }\n }\n\n this.set('optimized', true);\n } // showing after 100ms\n\n\n clearTimeout(this.get('timeout'));\n var timeout = setTimeout(function () {\n var currentZoom = graph.getZoom();\n\n var curOptimized = _this.get('optimized');\n\n if (curOptimized) {\n _this.set('optimized', false);\n\n for (var n = 0; n < nodesLength_1; n++) {\n var node = nodes_1[n];\n var children = node.get('group').get('children');\n var childrenLength = children.length;\n\n if (currentZoom < optimizeZoom_1) {\n var keyShape = node.getKeyShape();\n var oriVis = keyShape.get('ori-visibility');\n if (oriVis) keyShape.show();\n } else {\n for (var c = 0; c < childrenLength; c++) {\n var shape = children[c];\n var oriVis = shape.get('ori-visibility');\n\n if (!shape.get('visible') && oriVis) {\n if (oriVis) shape.show();\n }\n }\n }\n }\n\n for (var edgeIndex = 0; edgeIndex < edgesLength_1; edgeIndex++) {\n var edge = edges_1[edgeIndex];\n var children = edge.get('group').get('children');\n var childrenLength = children.length;\n\n if (currentZoom < optimizeZoom_1) {\n var keyShape = edge.getKeyShape();\n var oriVis = keyShape.get('ori-visibility');\n if (oriVis) keyShape.show();\n } else {\n for (var c = 0; c < childrenLength; c++) {\n var shape = children[c];\n\n if (!shape.get('visible')) {\n var oriVis = shape.get('ori-visibility');\n if (oriVis) shape.show();\n }\n }\n }\n }\n }\n }, 100);\n this.set('timeout', timeout);\n }\n }\n});\n// CONCATENATED MODULE: ./node_modules/@antv/g6-pc/es/behavior/index.js\n\n // import Behavior from './behavior';\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nvar behavior_behaviors = {\n 'drag-canvas': drag_canvas,\n 'zoom-canvas': zoom_canvas,\n 'drag-node': drag_node,\n 'activate-relations': activate_relations,\n 'brush-select': brush_select,\n 'click-select': click_select,\n 'lasso-select': lasso_select,\n tooltip: behavior_tooltip,\n 'edge-tooltip': edge_tooltip,\n 'collapse-expand': collapse_expand,\n 'drag-combo': drag_combo,\n 'collapse-expand-combo': collapse_expand_combo,\n 'create-edge': create_edge,\n 'shortcuts-call': shortcuts_call,\n 'scroll-canvas': scroll_canvas\n};\nObject(esm[\"each\"])(behavior_behaviors, function (behavior, type) {\n registerBehavior(type, behavior);\n}); // export default Behavior;\n// CONCATENATED MODULE: ./node_modules/@antv/g6-pc/es/types/index.js\n\n// CONCATENATED MODULE: ./node_modules/@antv/g6-pc/es/interface/graph.js\n\n// CONCATENATED MODULE: ./node_modules/@antv/g6-pc/es/index.js\n\n\n\n\n\n\n\n\n\n\n\n\n\nvar Algorithm = Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, es_namespaceObject), asyncIndex);\n\nvar es_Grid = es_plugin.Grid;\nvar Minimap = es_plugin.Minimap;\nvar es_Bundling = es_plugin.Bundling;\nvar es_Menu = es_plugin.Menu;\nvar es_Fisheye = es_plugin.Fisheye;\nvar es_ToolBar = es_plugin.ToolBar;\nvar es_Tooltip = es_plugin.Tooltip;\nvar es_TimeBar = es_plugin.TimeBar;\nvar ImageMinimap = es_plugin.ImageMinimap;\nvar es_EdgeFilterLens = es_plugin.EdgeFilterLens;\nvar es_SnapLine = es_plugin.SnapLine;\nvar es_Legend = es_plugin.Legend;\n\n\n\n\n/* harmony default export */ var g6_pc_es = ({\n version: es_global.version,\n Graph: es_graph_graph,\n TreeGraph: tree_graph,\n Util: es_util,\n Layout: Layouts,\n TreeLayout: tree_layout,\n registerLayout: layout_registerLayout,\n Global: es_global,\n registerBehavior: registerBehavior,\n registerCombo: registerCombo,\n registerEdge: registerEdge,\n registerNode: registerNode,\n Minimap: es_plugin.Minimap,\n Grid: es_plugin.Grid,\n Bundling: es_plugin.Bundling,\n Menu: es_plugin.Menu,\n ToolBar: es_plugin.ToolBar,\n Tooltip: es_plugin.Tooltip,\n Legend: es_plugin.Legend,\n TimeBar: es_TimeBar,\n SnapLine: es_SnapLine,\n Fisheye: es_Fisheye,\n ImageMinimap: ImageMinimap,\n EdgeFilterLens: es_EdgeFilterLens,\n Algorithm: Algorithm,\n Arrow: element_arrow,\n Marker: marker,\n Shape: es_element\n});\n// CONCATENATED MODULE: ./node_modules/@antv/g6/es/index.js\n\ng6_pc_es.version = '4.4.1';\n\n/* harmony default export */ var g6_es = __webpack_exports__[\"default\"] = (g6_pc_es);\nvar version = '4.4.1';//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZzYtY29yZS9lcy9iZWhhdmlvci9iZWhhdmlvck9wdGlvbi5qcz8xZTU0Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9nNi1jb3JlL2VzL2JlaGF2aW9yL2JlaGF2aW9yLmpzPzI4ZDUiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2c2LWNvcmUvZXMvYmVoYXZpb3IvaW5kZXguanM/M2UxZSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvYWxnb3JpdGhtL2VzL2FkamFjZW50LW1hdHJpeC5qcz84ODUwIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9hbGdvcml0aG0vZXMvc3RydWN0cy9saW5rZWQtbGlzdC5qcz85NDM4Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9hbGdvcml0aG0vZXMvc3RydWN0cy9xdWV1ZS5qcz8yNGYxIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9hbGdvcml0aG0vZXMvdXRpbC5qcz82ZmU2Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9hbGdvcml0aG0vZXMvYmZzLmpzPzc3NDgiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2FsZ29yaXRobS9lcy9jb25uZWN0ZWQtY29tcG9uZW50LmpzPzJhMTAiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2FsZ29yaXRobS9lcy9kZWdyZWUuanM/Y2UwNCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvYWxnb3JpdGhtL2VzL2Rmcy5qcz84MzliIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9hbGdvcml0aG0vZXMvZGV0ZWN0LWN5Y2xlLmpzPzAyNTIiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2FsZ29yaXRobS9lcy9kaWprc3RyYS5qcz83YTBlIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9hbGdvcml0aG0vZXMvZmluZC1wYXRoLmpzPzk2OGMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2FsZ29yaXRobS9lcy9mbG95ZFdhcnNoYWxsLmpzP2MwNzMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2FsZ29yaXRobS9lcy9sYWJlbC1wcm9wYWdhdGlvbi5qcz9iOTUwIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9hbGdvcml0aG0vZXMvbG91dmFpbi5qcz9iODQ2Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9hbGdvcml0aG0vZXMvc3RydWN0cy91bmlvbi1maW5kLmpzPzA0MDMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2FsZ29yaXRobS9lcy9zdHJ1Y3RzL2JpbmFyeS1oZWFwLmpzPzI5ODgiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2FsZ29yaXRobS9lcy9tdHMuanM/MjIyMCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvYWxnb3JpdGhtL2VzL3BhZ2VSYW5rLmpzP2ZkYWUiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2FsZ29yaXRobS9lcy9nU3Bhbi9zdHJ1Y3QuanM/MGY3NSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvYWxnb3JpdGhtL2VzL2dTcGFuL2dTcGFuLmpzPzlmZjIiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2FsZ29yaXRobS9lcy9nYWRkaS5qcz80MGE4Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9hbGdvcml0aG0vZXMvc3RydWN0cy9zdGFjay5qcz8xODkyIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9hbGdvcml0aG0vZXMvaW5kZXguanM/OTdiMSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZzYtY29yZS9lcy91dGlsL21hdGguanM/YWRjNyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZzYtY29yZS9lcy9nbG9iYWwuanM/MmUwYyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZzYtY29yZS9lcy91dGlsL2xldHRlckFzcGVjdFJhdGlvLmpzPzkxNWYiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2c2LWNvcmUvZXMvdXRpbC9ncmFwaGljLmpzPzI5NzQiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2c2LWNvcmUvZXMvdXRpbC92YWxpZGF0aW9uLmpzP2RmNjQiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2c2LWNvcmUvZXMvZ3JhcGgvY29udHJvbGxlci9tb2RlLmpzPzExZWMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2c2LWNvcmUvZXMvaW50ZXJmYWNlL2JlaGF2aW9yLmpzPzAxMjIiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2c2LWNvcmUvZXMvdXRpbC9iYXNlLmpzPzY2MTgiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2c2LWNvcmUvZXMvZ3JhcGgvY29udHJvbGxlci92aWV3LmpzPzY1M2EiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2c2LWNvcmUvZXMvZWxlbWVudC94bWwuanM/OTRkNiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZzYtY29yZS9lcy9lbGVtZW50L3NoYXBlLmpzPzE5MjQiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2c2LWNvcmUvZXMvaXRlbS9pdGVtLmpzPzQyNWIiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2c2LWNvcmUvZXMvaXRlbS9lZGdlLmpzPzMwMGYiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2c2LWNvcmUvZXMvaXRlbS9ub2RlLmpzP2Y1NDEiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2c2LWNvcmUvZXMvaXRlbS9jb21iby5qcz8wY2M3Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9nNi1jb3JlL2VzL2dyYXBoL2NvbnRyb2xsZXIvaXRlbS5qcz8xNjdlIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9nNi1jb3JlL2VzL2dyYXBoL2NvbnRyb2xsZXIvc3RhdGUuanM/Nzc3YyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZzYtY29yZS9lcy9ncmFwaC9jb250cm9sbGVyL2luZGV4LmpzP2M4ZWUiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2c2LWNvcmUvZXMvdXRpbC9wYXRoLmpzP2FlNjAiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2c2LWNvcmUvZXMvZWxlbWVudC9odWxsL2NvbnZleEh1bGwuanM/NzM3YyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZzYtY29yZS9lcy9lbGVtZW50L2h1bGwvYnViYmxlc2V0LmpzP2UwMDMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2c2LWNvcmUvZXMvaXRlbS9odWxsLmpzP2E1NzkiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2c2LWNvcmUvZXMvZ3JhcGgvZ3JhcGguanM/ODZmOCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZzYtY29yZS9lcy9lbGVtZW50L3NoYXBlQmFzZS5qcz82ODg0Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9nNi1jb3JlL2VzL2VsZW1lbnQvbm9kZS5qcz9hYmQwIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9nNi1jb3JlL2VzL2VsZW1lbnQvZWRnZS5qcz84OTZjIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9nNi1jb3JlL2VzL2VsZW1lbnQvY29tYm8uanM/NzM2MCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZzYtY29yZS9lcy9lbGVtZW50L2NvbWJvcy9jaXJjbGUuanM/MWFmMyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZzYtY29yZS9lcy9lbGVtZW50L2NvbWJvcy9yZWN0LmpzP2YxZjQiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2c2LWNvcmUvZXMvZWxlbWVudC9jb21ib3MvaW5kZXguanM/ZTk3ZiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZzYtY29yZS9lcy9lbGVtZW50L25vZGVzL3NpbXBsZS1jaXJjbGUuanM/MGQzZCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZzYtY29yZS9lcy9lbGVtZW50L25vZGVzL3NpbXBsZS1yZWN0LmpzP2U0YjAiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2c2LWNvcmUvZXMvZWxlbWVudC9ub2Rlcy9pbWFnZS5qcz80MmY1Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9nNi1jb3JlL2VzL2VsZW1lbnQvbm9kZXMvaW5kZXguanM/MmM2MSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZzYtY29yZS9lcy9lbGVtZW50L2Fycm93LmpzPzY2NjUiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2c2LWNvcmUvZXMvZWxlbWVudC9tYXJrZXIuanM/ODlmZCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZzYtY29yZS9lcy9lbGVtZW50L2luZGV4LmpzP2VkYmYiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2c2LWNvcmUvZXMvdXRpbC9jb2xvci5qcz83NTg5Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9nNi1jb3JlL2VzL3V0aWwvaW5kZXguanM/NDkyYSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZzYtY29yZS9lcy9ncmFwaC9jb250cm9sbGVyL2xheW91dC5qcz9hZTU3Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9nNi1jb3JlL2VzL2dyYXBoL2NvbnRyb2xsZXIvZXZlbnQuanM/Y2JiNiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZzYtY29yZS9lcy9pbnRlcmZhY2UvaW5kZXguanM/NGIwMiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZzYtY29yZS9lcy90eXBlcy9pbmRleC5qcz8xZGU0Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9nNi1jb3JlL2VzL2luZGV4LmpzPzM4MjIiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnQtZGVzaWduL2NvbG9ycy9kaXN0L2luZGV4LmVzbS5qcz8wMDlhIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9nNi1wYy9lcy91dGlsL2NvbG9yLmpzPzY2NmEiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2c2LXBjL2VzL2dsb2JhbC5qcz82ZDFlIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9kb20tdXRpbC9lc20vYWRkLWV2ZW50LWxpc3RlbmVyLmpzP2Y1ODciLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2RvbS11dGlsL2VzbS9jcmVhdGUtZG9tLmpzPzNhNjEiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2RvbS11dGlsL2VzbS9nZXQtc3R5bGUuanM/NDAyYiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZG9tLXV0aWwvZXNtL2dldC1oZWlnaHQuanM/YjJlNiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZG9tLXV0aWwvZXNtL2dldC1vdXRlci1oZWlnaHQuanM/NGIwMCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZG9tLXV0aWwvZXNtL2dldC13aWR0aC5qcz84MGMzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9kb20tdXRpbC9lc20vZ2V0LW91dGVyLXdpZHRoLmpzPzNkMTUiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2RvbS11dGlsL2VzbS9nZXQtcmF0aW8uanM/ZmJhOCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZG9tLXV0aWwvZXNtL21vZGlmeS1jc3MuanM/ODExOCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZG9tLXV0aWwvZXNtL2luZGV4LmpzPzdjOGEiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2c2LXBjL2VzL2dyYXBoL2NvbnRyb2xsZXIvZXZlbnQuanM/MDBlZCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvbGF5b3V0L2VzL2xheW91dC9iYXNlLmpzP2JlMDUiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2xheW91dC9lcy91dGlsL3N0cmluZy5qcz82MDViIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9sYXlvdXQvZXMvdXRpbC9hcnJheS5qcz81OGMyIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9sYXlvdXQvZXMvdXRpbC9udW1iZXIuanM/YjZlNSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvbGF5b3V0L2VzL3V0aWwvb2JqZWN0LmpzPzk1N2YiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2xheW91dC9lcy91dGlsL21hdGguanM/ZDkxZSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvbGF5b3V0L2VzL3V0aWwvZnVuY3Rpb24uanM/YjY0YSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvbGF5b3V0L2VzL3V0aWwvaW5kZXguanM/MzUyMCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvbGF5b3V0L2VzL3JlZ2lzdHkvaW5kZXguanM/OGM1NCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvbGF5b3V0L2VzL2xheW91dC9ncmlkLmpzP2UwNGYiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2xheW91dC9lcy9sYXlvdXQvcmFuZG9tLmpzPzFhMjIiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2xheW91dC9lcy9sYXlvdXQvZ0ZvcmNlLmpzPzc2MTkiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLXF1YWR0cmVlL3NyYy9hZGQuanM/ZjY1ZCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtcXVhZHRyZWUvc3JjL2NvdmVyLmpzP2Y0MDAiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLXF1YWR0cmVlL3NyYy9kYXRhLmpzPzJjY2MiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLXF1YWR0cmVlL3NyYy9leHRlbnQuanM/MWZiMyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtcXVhZHRyZWUvc3JjL3F1YWQuanM/YTdmZSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtcXVhZHRyZWUvc3JjL2ZpbmQuanM/MWQ5NyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtcXVhZHRyZWUvc3JjL3JlbW92ZS5qcz8xYjQxIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1xdWFkdHJlZS9zcmMvcm9vdC5qcz80NTA1Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1xdWFkdHJlZS9zcmMvc2l6ZS5qcz9jMmY0Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1xdWFkdHJlZS9zcmMvdmlzaXQuanM/MTE1MyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtcXVhZHRyZWUvc3JjL3Zpc2l0QWZ0ZXIuanM/YjUyNyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtcXVhZHRyZWUvc3JjL3guanM/OWJiYiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtcXVhZHRyZWUvc3JjL3kuanM/MzZmZiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtcXVhZHRyZWUvc3JjL3F1YWR0cmVlLmpzP2NmYTEiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWZvcmNlL3NyYy9jb25zdGFudC5qcz85ZDc1Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1mb3JjZS9zcmMvamlnZ2xlLmpzPzQyZWEiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWRpc3BhdGNoL3NyYy9kaXNwYXRjaC5qcz9jNjhmIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy10aW1lci9zcmMvdGltZXIuanM/NzRmNCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtZm9yY2Uvc3JjL2xjZy5qcz8zNjAyIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1mb3JjZS9zcmMvc2ltdWxhdGlvbi5qcz81NDgxIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1mb3JjZS9zcmMvbWFueUJvZHkuanM/NjdkNSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtZm9yY2Uvc3JjL2NlbnRlci5qcz9kMGIxIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1mb3JjZS9zcmMvbGluay5qcz9mM2Q3Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1mb3JjZS9zcmMvY29sbGlkZS5qcz84OTBmIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1mb3JjZS9zcmMveC5qcz83Mjc1Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1mb3JjZS9zcmMveS5qcz9kMmIzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9sYXlvdXQvZXMvbGF5b3V0L2ZvcmNlL2ZvcmNlLWluLWEtYm94LmpzPzVhMDMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2xheW91dC9lcy9sYXlvdXQvY29uc3RhbnRzLmpzP2MwMDAiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2xheW91dC9lcy9sYXlvdXQvZm9yY2UvZm9yY2UuanM/YTJjMSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvbGF5b3V0L2VzL2xheW91dC9mb3JjZS9pbmRleC5qcz84MDgwIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9sYXlvdXQvZXMvbGF5b3V0L2NpcmN1bGFyLmpzP2FjYjAiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2xheW91dC9lcy9sYXlvdXQvZGFncmUuanM/YWRjMiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaXMtYW55LWFycmF5L3NyYy9pbmRleC5qcz9lYjU1Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9tbC1hcnJheS1tYXgvbGliLWVzNi9pbmRleC5qcz81YzQzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9tbC1hcnJheS1taW4vbGliLWVzNi9pbmRleC5qcz81MWQ4Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9tbC1hcnJheS1yZXNjYWxlL2xpYi1lczYvaW5kZXguanM/ZGE2MSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbWwtbWF0cml4L3NyYy9pbnNwZWN0LmpzPzQzMGIiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL21sLW1hdHJpeC9zcmMvbWF0aE9wZXJhdGlvbnMuanM/N2NhYSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbWwtbWF0cml4L3NyYy91dGlsLmpzP2VjZWIiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL21sLW1hdHJpeC9zcmMvc3RhdC5qcz80ODQ0Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9tbC1tYXRyaXgvc3JjL21hdHJpeC5qcz9mYWFkIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9tbC1tYXRyaXgvc3JjL3dyYXAvV3JhcHBlck1hdHJpeDJELmpzP2FiNzMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL21sLW1hdHJpeC9zcmMvZGMvdXRpbC5qcz9lYWNiIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9tbC1tYXRyaXgvc3JjL2RjL3N2ZC5qcz8zMDAyIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9sYXlvdXQvZXMvbGF5b3V0L3JhZGlhbC9tZHMuanM/NzM4MCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvbGF5b3V0L2VzL2xheW91dC9yYWRpYWwvcmFkaWFsTm9ub3ZlcmxhcEZvcmNlLmpzPzYyMzciLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2xheW91dC9lcy9sYXlvdXQvcmFkaWFsL3JhZGlhbC5qcz82NTMxIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9sYXlvdXQvZXMvbGF5b3V0L3JhZGlhbC9pbmRleC5qcz9mNzEyIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9sYXlvdXQvZXMvbGF5b3V0L2NvbmNlbnRyaWMuanM/MTM3MCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvbGF5b3V0L2VzL2xheW91dC9tZHMuanM/NzQ0MyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvbGF5b3V0L2VzL2xheW91dC9mcnVjaHRlcm1hbi5qcz82MzVhIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9nLXdlYmdwdS9lcy91dGlscy9pcy1udW1iZXIuanM/MTY0OSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy13ZWJncHUvZXMvdXRpbHMvbWF0aC5qcz82OWY3Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9nLXdlYmdwdS9lcy9jYW1lcmEvTGFuZG1hcmsuanM/YjlkYyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy13ZWJncHUvZXMvY2FtZXJhL0NhbWVyYS5qcz9hZDk1Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9nLXdlYmdwdS9lcy9nZW9tZXRyeS9pbmRleC5qcz9mZmE0Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9nLXdlYmdwdS9lcy91dGlscy9jYW52YXMuanM/MzNjZiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy13ZWJncHUvZXMvdXRpbHMvaXMtdHlwZS5qcz80ZGIyIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9nLXdlYmdwdS9lcy91dGlscy9pcy1hcnJheS5qcz8wNGQ3Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9nLXdlYmdwdS9lcy91dGlscy9pcy10eXBlZGFycmF5LmpzPzQzMDQiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2ctd2ViZ3B1L2VzL0tlcm5lbC5qcz8zYjdmIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9nLXdlYmdwdS9lcy9tYXRlcmlhbC9pbmRleC5qcz8xODQ3Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9nLXdlYmdwdS9lcy9yZW5kZXJhYmxlL1JlbmRlcmFibGUuanM/MDQxZSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy13ZWJncHUtZW5naW5lL2VzL3dlYmdsL1JlZ2xBdHRyaWJ1dGUuanM/NjY2MSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy13ZWJncHUtZW5naW5lL2VzL3dlYmdsL2NvbnN0YW50cy5qcz85YTIzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9nLXdlYmdwdS1lbmdpbmUvZXMvd2ViZ2wvUmVnbEJ1ZmZlci5qcz85ODMwIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9nLXdlYmdwdS1lbmdpbmUvZXMvdXRpbHMvaXMtdHlwZWRhcnJheS5qcz83MTBmIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9nLXdlYmdwdS1lbmdpbmUvZXMvd2ViZ2wvUmVnbENvbXB1dGVNb2RlbC5qcz81MjZiIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9nLXdlYmdwdS1lbmdpbmUvZXMvd2ViZ2wvUmVnbEVsZW1lbnRzLmpzP2UzZDciLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2ctd2ViZ3B1LWVuZ2luZS9lcy93ZWJnbC9SZWdsRnJhbWVidWZmZXIuanM/YWU3NyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy13ZWJncHUtZW5naW5lL2VzL3V0aWxzL2lzLW9iamVjdC5qcz8xZWE5Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9nLXdlYmdwdS1lbmdpbmUvZXMvdXRpbHMvdW5pZm9ybS5qcz8zOWY1Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9nLXdlYmdwdS1lbmdpbmUvZXMvd2ViZ2wvUmVnbE1vZGVsLmpzPzVlMWYiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2ctd2ViZ3B1LWVuZ2luZS9lcy93ZWJnbC9SZWdsVGV4dHVyZTJELmpzP2ZjZjYiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2ctd2ViZ3B1LWVuZ2luZS9lcy93ZWJnbC9pbmRleC5qcz9mYzk3Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9nLXdlYmdwdS1lbmdpbmUvZXMvdXRpbHMvZG9tLmpzPzQyNDkiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2ctd2ViZ3B1LWVuZ2luZS9lcy93ZWJncHUvZ2xzbGFuZy5qcz82YTI1Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9nLXdlYmdwdS1lbmdpbmUvZXMvd2ViZ3B1L1dlYkdQVUF0dHJpYnV0ZS5qcz9iOTNhIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9nLXdlYmdwdS1lbmdpbmUvZXMvd2ViZ3B1L1dlYkdQVUJ1ZmZlci5qcz9kNTA1Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9nLXdlYmdwdS1lbmdpbmUvZXMvdXRpbHMvaXMtbnVtYmVyLmpzPzVmNzIiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2ctd2ViZ3B1LWVuZ2luZS9lcy93ZWJncHUvV2ViR1BVQ29tcHV0ZU1vZGVsLmpzPzA1M2UiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2ctd2ViZ3B1LWVuZ2luZS9lcy93ZWJncHUvV2ViR1BVRWxlbWVudHMuanM/YWZkYiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy13ZWJncHUtZW5naW5lL2VzL3dlYmdwdS9XZWJHUFVGcmFtZWJ1ZmZlci5qcz82YmIwIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9nLXdlYmdwdS1lbmdpbmUvZXMvd2ViZ3B1L2NvbnN0YW50cy5qcz8xOTZlIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9nLXdlYmdwdS1lbmdpbmUvZXMvd2ViZ3B1L1dlYkdQVU1vZGVsLmpzPzVhNWIiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2ctd2ViZ3B1LWVuZ2luZS9lcy93ZWJncHUvV2ViR1BVVGV4dHVyZTJELmpzP2QxMTIiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2ctd2ViZ3B1LWVuZ2luZS9lcy93ZWJncHUvaW5kZXguanM/NGU1NyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy13ZWJncHUtZW5naW5lL2VzL2luZGV4LmpzP2QyNmIiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2ctd2ViZ3B1L2VzL2dlb21ldHJ5L0JveC5qcz83MTFiIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9nLXdlYmdwdS9lcy91dGlscy90eXBlZGFycmF5LmpzPzA4OWYiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2ctd2ViZ3B1L2VzL2dlb21ldHJ5L01lcmdlZC5qcz9mNTE2Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9nLXdlYmdwdS9lcy9nZW9tZXRyeS9QbGFuZS5qcz80MDlmIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9nLXdlYmdwdS9lcy9nZW9tZXRyeS9TcGhlcmUuanM/MTRiMiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy13ZWJncHUvZXMvbWF0ZXJpYWwvYmFzaWMvaW5kZXguanM/N2U2ZSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy13ZWJncHUvZXMvcmVuZGVyYWJsZS9ncmlkL2luZGV4LmpzPzcwYmQiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2ctd2ViZ3B1L2VzL3V0aWxzL3BvbHlsaW5lLW5vcm1hbHMuanM/ZTVhNyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy13ZWJncHUvZXMvcmVuZGVyYWJsZS9saW5lL2luZGV4LmpzP2QzMDEiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2ctd2ViZ3B1L2VzL3V0aWxzL3BpY2tpbmcuanM/MGQ4ZiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy13ZWJncHUvZXMvcmVuZGVyYWJsZS9wb2ludC9pbmRleC5qcz9hMjE1Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9nLXdlYmdwdS9lcy9SZW5kZXJlci5qcz8zZDE1Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9nLXdlYmdwdS9lcy9TY2VuZS5qcz9kYWY2Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9nLXdlYmdwdS9lcy90ZXh0dXJlL0NhY2hlLmpzPzg1MDkiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2ctd2ViZ3B1L2VzL3RleHR1cmUvVGV4dHVyZTJELmpzPzg4YzciLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2ctd2ViZ3B1L2VzL1ZpZXcuanM/MGU5MSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy13ZWJncHUvZXMvV29ybGQuanM/MTgxMyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy13ZWJncHUvZXMvaW5kZXguanM/YTE5NiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvbGF5b3V0L2VzL3V0aWwvZ3B1LmpzPzVjZTgiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2xheW91dC9lcy9sYXlvdXQvZ3B1L2ZydWNodGVybWFuU2hhZGVyLmpzPzc4ZmYiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2xheW91dC9lcy9sYXlvdXQvZ3B1L2ZydWNodGVybWFuLmpzPzg2NGEiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2xheW91dC9lcy9sYXlvdXQvZ3B1L2dGb3JjZVNoYWRlci5qcz9hOTdlIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9sYXlvdXQvZXMvbGF5b3V0L2dwdS9nRm9yY2UuanM/ODM5MiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvbGF5b3V0L2VzL2xheW91dC9jb21ib0ZvcmNlLmpzP2ViZmQiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2xheW91dC9lcy9sYXlvdXQvZm9yY2VBdGxhczIvYm9keS5qcz9hZGZhIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9sYXlvdXQvZXMvbGF5b3V0L2ZvcmNlQXRsYXMyL3F1YWQuanM/ZmFjMiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvbGF5b3V0L2VzL2xheW91dC9mb3JjZUF0bGFzMi9xdWFkVHJlZS5qcz80ODFkIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9sYXlvdXQvZXMvbGF5b3V0L2ZvcmNlQXRsYXMyL2luZGV4LmpzP2ZkYmQiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2xheW91dC9lcy9sYXlvdXQvbGF5b3V0LmpzPzYwMWYiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2xheW91dC9lcy9sYXlvdXQvdHlwZXMuanM/OGY1ZCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvbGF5b3V0L2VzL2xheW91dC9pbmRleC5qcz82YTY0Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9sYXlvdXQvZXMvaW5kZXguanM/MzJkNCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZzYtcGMvZXMvdXRpbC9sYXlvdXQuanM/MGM3ZCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZzYtcGMvZXMvdXRpbC9ncHUuanM/NTRjYSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZzYtcGMvZXMvdXRpbC9pbmRleC5qcz8wZTIwIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9nNi1wYy9lcy9sYXlvdXQvdHJlZS1sYXlvdXQuanM/MGNjNyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZzYtcGMvZXMvbGF5b3V0L2luZGV4LmpzP2M1YjciLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2c2LXBjL2VzL2xheW91dC93b3JrZXIvd29yay5qcz8yY2M2Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9nNi1wYy9lcy9sYXlvdXQvd29ya2VyL2xheW91dC53b3JrZXIuanM/MGFhZiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZzYtcGMvZXMvbGF5b3V0L3dvcmtlci9sYXlvdXRDb25zdC5qcz9iMDYyIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9nNi1wYy9lcy9ncmFwaC9jb250cm9sbGVyL2xheW91dC5qcz85ODM1Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9nNi1wYy9lcy9ncmFwaC9jb250cm9sbGVyL2luZGV4LmpzPzNkMDYiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2c2LXBjL2VzL2dyYXBoL2dyYXBoLmpzP2RiYTEiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2c2LXBjL2VzL2dyYXBoL3RyZWUtZ3JhcGguanM/OTVjMiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZzYtcGx1Z2luL2VzL2Jhc2UuanM/ZWZmZCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZzYtcGx1Z2luL2VzL2dyaWQvaW5kZXguanM/NDk4ZiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZzYtcGx1Z2luL2VzL21lbnUvaW5kZXguanM/NmU4NCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZzYtcGx1Z2luL2VzL21pbmltYXAvaW5kZXguanM/MDcyYSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZzYtcGx1Z2luL2VzL2J1bmRsaW5nL2luZGV4LmpzP2ZjZmIiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2c2LXBsdWdpbi9lcy9maXNoZXllL2luZGV4LmpzP2FjNWQiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2c2LXBsdWdpbi9lcy90b29sQmFyL2luZGV4LmpzP2M5YjciLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2c2LXBsdWdpbi9lcy90b29sdGlwL2luZGV4LmpzPzIwNWQiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L3NjYWxlL2VzbS90aWNrLW1ldGhvZC9yZWdpc3Rlci5qcz8xMDYzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9zY2FsZS9lc20vYmFzZS5qcz9iYWY3Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9zY2FsZS9lc20vY2F0ZWdvcnkvYmFzZS5qcz82ZjBiIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9mZWNoYS9saWIvZmVjaGEuanM/MTc4OSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvc2NhbGUvZXNtL3V0aWwvYmlzZWN0b3IuanM/ODIyMyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvc2NhbGUvZXNtL3V0aWwvdGltZS5qcz8wMGJjIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9zY2FsZS9lc20vY2F0ZWdvcnkvdGltZS5qcz9lZTI3Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9zY2FsZS9lc20vY29udGludW91cy9iYXNlLmpzP2ViZWQiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L3NjYWxlL2VzbS9jb250aW51b3VzL2xpbmVhci5qcz82OTE2Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9zY2FsZS9lc20vdXRpbC9tYXRoLmpzPzdjNWUiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L3NjYWxlL2VzbS9jb250aW51b3VzL2xvZy5qcz9iMzNlIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9zY2FsZS9lc20vY29udGludW91cy9wb3cuanM/ZjhjZiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvc2NhbGUvZXNtL2NvbnRpbnVvdXMvdGltZS5qcz8zNDIzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9zY2FsZS9lc20vY29udGludW91cy9xdWFudGl6ZS5qcz9mNjZlIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9zY2FsZS9lc20vY29udGludW91cy9xdWFudGlsZS5qcz80MmJjIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9zY2FsZS9lc20vZmFjdG9yeS5qcz82ZmU0Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9zY2FsZS9lc20vaWRlbnRpdHkvaW5kZXguanM/NTZkOSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvc2NhbGUvZXNtL3V0aWwvcHJldHR5LW51bWJlci5qcz9lZWFhIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9zY2FsZS9lc20vdXRpbC9leHRlbmRlZC5qcz8yNmY2Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9zY2FsZS9lc20vdGljay1tZXRob2QvY2F0LmpzPzY1ZmMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L3NjYWxlL2VzbS91dGlsL2QzLWxpbmVhci5qcz8xOTc5Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9zY2FsZS9lc20vdXRpbC9pbnRlcnZhbC5qcz8yN2M5Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9zY2FsZS9lc20vdXRpbC9zdHJpY3QtbGltaXQuanM/YmRhNyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvc2NhbGUvZXNtL3RpY2stbWV0aG9kL2QzLWxpbmVhci5qcz8wMjRjIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9zY2FsZS9lc20vdGljay1tZXRob2QvbGluZWFyLmpzP2E5OWEiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L3NjYWxlL2VzbS90aWNrLW1ldGhvZC9sb2cuanM/YjU0OCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvc2NhbGUvZXNtL3V0aWwvcHJldHR5LmpzP2NjZWIiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L3NjYWxlL2VzbS90aWNrLW1ldGhvZC9wb3cuanM/MDRmOSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvc2NhbGUvZXNtL3RpY2stbWV0aG9kL3F1YW50aWxlLmpzPzg3OTgiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L3NjYWxlL2VzbS90aWNrLW1ldGhvZC9yLXByZXR0cnkuanM/YzZiNiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvc2NhbGUvZXNtL3RpY2stbWV0aG9kL3RpbWUuanM/NGM2NyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvc2NhbGUvZXNtL3RpY2stbWV0aG9kL3RpbWUtY2F0LmpzP2FmMzgiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L3NjYWxlL2VzbS90aWNrLW1ldGhvZC90aW1lLXByZXR0eS5qcz9iYjE2Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9zY2FsZS9lc20vdGljay1tZXRob2QvaW5kZXguanM/ZGI5NyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvc2NhbGUvZXNtL2luZGV4LmpzP2YyZmIiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2c2LXBsdWdpbi9lcy90aW1lQmFyL3BhdGguanM/ZmZkOSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZzYtcGx1Z2luL2VzL3RpbWVCYXIvdHJlbmQuanM/NDMzMiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZzYtcGx1Z2luL2VzL3RpbWVCYXIvaGFuZGxlci5qcz8wMWY2Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9nNi1wbHVnaW4vZXMvdGltZUJhci9jb25zdGFudC5qcz8xODZkIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9nNi1wbHVnaW4vZXMvdGltZUJhci90aW1lQnV0dG9uLmpzPzk4NDciLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2c2LXBsdWdpbi9lcy90aW1lQmFyL2NvbnRyb2xsZXJCdG4uanM/NWMwMiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZzYtcGx1Z2luL2VzL3RpbWVCYXIvdHJlbmRUaW1lQmFyLmpzPzdiNDAiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2c2LXBsdWdpbi9lcy90aW1lQmFyL3RpbWVCYXJUb29sdGlwLmpzPzUyY2QiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2c2LXBsdWdpbi9lcy90aW1lQmFyL3RpbWVCYXJTbGljZS5qcz80NjE2Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9nNi1wbHVnaW4vZXMvdGltZUJhci9pbmRleC5qcz82YjA5Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9nNi1wbHVnaW4vZXMvaW1hZ2VNaW5pbWFwL2luZGV4LmpzP2U5NDUiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2c2LXBsdWdpbi9lcy9lZGdlRmlsdGVyTGVucy9pbmRleC5qcz9jMTM5Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9nNi1wbHVnaW4vZXMvc25hcGxpbmUvaW5kZXguanM/ZDI0YiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZzYtcGx1Z2luL2VzL2xlZ2VuZC9pbmRleC5qcz8yZDEwIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9nNi1wbHVnaW4vZXMvaW5kZXguanM/MGQzYyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZzYtcGMvZXMvcGx1Z2luL2luZGV4LmpzPzFiZjQiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2c2LWVsZW1lbnQvZXMvbm9kZXMvY2lyY2xlLmpzP2Y3N2QiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2c2LWVsZW1lbnQvZXMvbm9kZXMvcmVjdC5qcz82ZDUyIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9nNi1lbGVtZW50L2VzL25vZGVzL2VsbGlwc2UuanM/YjY0YSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZzYtZWxlbWVudC9lcy9ub2Rlcy9kaWFtb25kLmpzPzI4NTUiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2c2LWVsZW1lbnQvZXMvbm9kZXMvdHJpYW5nbGUuanM/Mzc3ZSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZzYtZWxlbWVudC9lcy9ub2Rlcy9tb2RlbFJlY3QuanM/NjFmOCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZzYtZWxlbWVudC9lcy9ub2Rlcy9zdGFyLmpzP2M1ZDYiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2c2LWVsZW1lbnQvZXMvbm9kZXMvZG9udXQuanM/NmUyNyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZzYtZWxlbWVudC9lcy9ub2Rlcy9pbmRleC5qcz84NjI1Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9nNi1lbGVtZW50L2VzL2VkZ2VzL3BvbHlsaW5lLXV0aWwuanM/MjEzOSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZzYtZWxlbWVudC9lcy9lZGdlcy9yb3V0ZXIuanM/YTUzZCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZzYtZWxlbWVudC9lcy9lZGdlcy9wb2x5bGluZS5qcz9mYTJjIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9nNi1lbGVtZW50L2VzL2luZGV4LmpzPzE2NDkiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2c2LXBjL2VzL2JlaGF2aW9yL2RyYWctY2FudmFzLmpzPzZhZjAiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2c2LXBjL2VzL2JlaGF2aW9yL2RyYWctbm9kZS5qcz84NTlmIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9nNi1wYy9lcy9iZWhhdmlvci9hY3RpdmF0ZS1yZWxhdGlvbnMuanM/NTY0YyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZzYtcGMvZXMvYmVoYXZpb3IvYnJ1c2gtc2VsZWN0LmpzPzc2MzMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2c2LXBjL2VzL2JlaGF2aW9yL2NsaWNrLXNlbGVjdC5qcz8yMTkzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9nNi1wYy9lcy9iZWhhdmlvci96b29tLWNhbnZhcy5qcz9mMTc0Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9nNi1wYy9lcy9iZWhhdmlvci90b29sdGlwLWJhc2UuanM/MDQ5YiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZzYtcGMvZXMvYmVoYXZpb3IvdG9vbHRpcC5qcz84ZjMzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9nNi1wYy9lcy9iZWhhdmlvci9lZGdlLXRvb2x0aXAuanM/YWY4OSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZzYtcGMvZXMvYmVoYXZpb3IvY29sbGFwc2UtZXhwYW5kLmpzPzFhNDkiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2c2LXBjL2VzL2JlaGF2aW9yL2RyYWctY29tYm8uanM/ZWVkYyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZzYtcGMvZXMvYmVoYXZpb3IvY29sbGFwc2UtZXhwYW5kLWNvbWJvLmpzPzRiNzkiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2c2LXBjL2VzL2JlaGF2aW9yL2xhc3NvLXNlbGVjdC5qcz8wNzlkIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9nNi1wYy9lcy9iZWhhdmlvci9jcmVhdGUtZWRnZS5qcz9jMzExIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9nNi1wYy9lcy9iZWhhdmlvci9zaG9ydGN1dHMtY2FsbC5qcz8zNzlkIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9nNi1wYy9lcy9iZWhhdmlvci9zY3JvbGwtY2FudmFzLmpzPzBkNDAiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2c2LXBjL2VzL2JlaGF2aW9yL2luZGV4LmpzPzU5YjIiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2c2LXBjL2VzL2luZGV4LmpzP2JmODIiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2c2L2VzL2luZGV4LmpzPzdjM2UiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFrQzs7QUFFbkI7QUFDZjtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsSUFBSSxtQkFBSTtBQUNSO0FBQ0EsS0FBSyxFQUFFOztBQUVQO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsSUFBSSxtQkFBSTtBQUNSO0FBQ0EsS0FBSztBQUNMO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLEU7O0FDekVzRDtBQUNUOztBQUU5QyxJQUFJLGlCQUFRO0FBQ1o7QUFD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QUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsWUFBWSxnQkFBUztBQUNyQjtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsQ0FBQyxFOztBQzdPYztBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLE1BQU0sbUJBQUk7QUFDVjtBQUNBLE9BQU87QUFDUCxNQUFNLG1CQUFJO0FBQ1Y7QUFDQSxPQUFPO0FBQ1AsTUFBTSxtQkFBSTtBQUNWO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLE1BQU07QUFDcEI7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLE1BQU07QUFDcEI7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0EsUUFBUSx1QkFBUTtBQUNoQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU0sbUJBQUk7QUFDVjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxRQUFRLG1CQUFJO0FBQ1o7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksbUJBQUk7QUFDUjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7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QUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLGVBQWU7QUFDdEMsdUJBQXVCLGVBQWU7QUFDdEM7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLFNBQVMsR0FBRyxTQUFTO0FBQ3RDLGlCQUFpQixTQUFTLEdBQUcsU0FBUztBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQzs7QUN4VUE7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQzs7QUNiQTtBQUNBO0FBQ0E7QUFDQTtBQUNvQztBQUNPO0FBQzBCO0FBQ3RDO0FBQ2U7QUFDOUM7QUFDQTtBQUNBO0FBQ08sTUFBTSxpQkFBVyxTQUFTLElBQUk7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQjtBQUMzQjtBQUNBLGtDQUFrQztBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLEVBQUU7QUFDdEIsMkJBQTJCLEVBQUU7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxPQUFPO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLFFBQXFCO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QixjQUF1QjtBQUNwRDtBQUNBLHlDQUF5QyxXQUFXO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUMsVUFBbUI7QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0MsUUFDSjtBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QywyQkFBMkI7QUFDeEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLGNBQWM7QUFDaEQseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDLFFBQ0o7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxPQUFPO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLFFBQVE7QUFDcEI7QUFDQTtBQUNBLGlCQUFpQixVQUFVO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsT0FBTztBQUMvQjtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsUUFBUTtBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLFVBQVU7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixPQUFPO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLFFBQVE7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQ0FBMkMsT0FBb0I7QUFDL0Q7QUFDQTtBQUNBO0FBQ0EsZUFBZSxPQUFPO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUM7O0FDblZ3QjtBQUN4QixpQzs7QUNEQTtBQUNBO0FBQ0E7QUFDQTtBQUM4QjtBQUM4QjtBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsMkJBQTJCLGVBQWU7QUFDMUMsMkJBQTJCLGVBQWU7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQixlQUFlO0FBQzFDLDJCQUEyQixlQUFlO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixPQUFPO0FBQzFCLHVCQUF1QixlQUFlO0FBQ3RDLHVCQUF1QixlQUFlO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLE1BQU0sdUJBQWMsU0FBUyxJQUFJO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0Esd0JBQXdCLGNBQVM7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEM7QUFDOUMsdUJBQXVCLE9BQU87QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixNQUFNO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixLQUFLO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DLHFCQUFxQjtBQUN4RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsTUFBTTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQzs7Ozs7O0FDNVNBO0FBQ0E7QUFDQTtBQUNBO0FBQzRCO0FBQzJDO0FBQ3pDO0FBQzlCO0FBQ0E7QUFDQTtBQUNPLE1BQU0saUJBQVcsU0FBUyxJQUFJO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDO0FBQ2xDO0FBQ0E7QUFDQSxtQkFBbUIsUUFBUTtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxtQ0FBbUM7QUFDbEQ7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLGlCQUFLO0FBQzNCO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsT0FBTztBQUMvQjtBQUNBO0FBQ0Esd0JBQXdCLFFBQVE7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsT0FBTztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixRQUFRO0FBQ3hCO0FBQ0Esb0NBQW9DLHVCQUF1QjtBQUMzRDtBQUNBO0FBQ0Esb0NBQW9DLGdCQUFnQjtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4QztBQUM5QztBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0RBQWdEO0FBQ2hEO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLGVBQWU7QUFDMUMsMkJBQTJCLGVBQWU7QUFDMUM7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixpQkFBSztBQUNqQztBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQSxRQUFRLGlCQUFLO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLGVBQWU7QUFDOUMsK0JBQStCLGVBQWU7QUFDOUM7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUM7O0FDNU1BLE1BQU0sWUFBUTs7QUFFQztBQUNmLFNBQVMsWUFBUTtBQUNqQjs7O0FDSm1DOztBQUVuQyxTQUFTLFdBQUc7QUFDWjs7QUFFQSxPQUFPLFVBQU87QUFDZDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBLDZCQUE2QixhQUFhO0FBQzFDO0FBQ0E7O0FBRUE7QUFDQTs7QUFFZSx1REFBRyxFQUFDOzs7QUNuQ2dCOztBQUVuQyxTQUFTLFdBQUc7QUFDWjs7QUFFQSxPQUFPLFVBQU87QUFDZDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBLDZCQUE2QixhQUFhO0FBQzFDO0FBQ0E7O0FBRUE7QUFDQTs7QUFFZSxvRUFBRyxFQUFDOzs7QUNuQ2dCO0FBQ0o7QUFDQTs7QUFFL0I7QUFDQTs7QUFFQSxPQUFPLFVBQU87QUFDZDtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBOztBQUVBO0FBQ0EsU0FBUyxVQUFPO0FBQ2hCO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQSxtQkFBbUIsb0JBQUc7QUFDdEIsbUJBQW1CLE9BQUc7O0FBRXRCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsaUJBQWlCLGtCQUFrQjtBQUNuQztBQUNBOztBQUVBO0FBQ0E7O0FBRThCOzs7QUNsRDlCO0FBQ0E7O0FBRU87QUFDUDtBQUNBOztBQUVPLHNEQUFzRDtBQUM3RCxTQUFTLGdEQUFnRDtBQUN6RCxZQUFZLHdCQUF3QjtBQUNwQyxFQUFFLE9BQU87QUFDVCxFQUFFLFdBQVcsRUFBRTtBQUNmLEVBQUUsT0FBTztBQUNULEVBQUUsT0FBTyxRQUFRO0FBQ2pCLEVBQUUsT0FBTyxXQUFXO0FBQ3BCLENBQUM7QUFDRDs7QUFFQTtBQUNBLFNBQVMsZ0JBQWdCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixVQUFVO0FBQzNCO0FBQ0EsbUJBQW1CLFVBQVU7QUFDN0I7QUFDQTtBQUNBLG1CQUFtQixlQUFlO0FBQ2xDO0FBQ0E7QUFDQSx5Q0FBeUMscUJBQXFCO0FBQzlEO0FBQ0E7QUFDQSx1QkFBdUIsZUFBZTtBQUN0QztBQUNBLDBCQUEwQixXQUFXO0FBQ3JDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ3BETztBQUNQO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsbUJBQW1CLGVBQWU7QUFDbEMscUJBQXFCLGtCQUFrQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixlQUFlO0FBQ2xDLHFCQUFxQixrQkFBa0I7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG1CQUFtQixlQUFlO0FBQ2xDLHFCQUFxQixrQkFBa0I7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsZUFBZTtBQUNsQyxxQkFBcUIsa0JBQWtCO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG1CQUFtQixlQUFlO0FBQ2xDLHFCQUFxQixrQkFBa0I7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsZUFBZTtBQUNsQyxxQkFBcUIsa0JBQWtCO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG1CQUFtQixlQUFlO0FBQ2xDLHFCQUFxQixrQkFBa0I7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsZUFBZTtBQUNsQyxxQkFBcUIsa0JBQWtCO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG1CQUFtQixlQUFlO0FBQ2xDLHFCQUFxQixrQkFBa0I7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsZUFBZTtBQUNsQyxxQkFBcUIsa0JBQWtCO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG1CQUFtQixlQUFlO0FBQ2xDLHFCQUFxQixrQkFBa0I7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsZUFBZTtBQUNsQyxxQkFBcUIsa0JBQWtCO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxtQkFBbUIsZUFBZTtBQUNsQyxxQkFBcUIsa0JBQWtCO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLGVBQWU7QUFDbEMscUJBQXFCLGtCQUFrQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsbUJBQW1CLGVBQWU7QUFDbEMscUJBQXFCLGtCQUFrQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixlQUFlO0FBQ2xDLHFCQUFxQixrQkFBa0I7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG1CQUFtQixlQUFlO0FBQ2xDLHFCQUFxQixrQkFBa0I7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsZUFBZTtBQUNsQyxxQkFBcUIsa0JBQWtCO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxtQkFBbUIsZUFBZTtBQUNsQyxxQkFBcUIsa0JBQWtCO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLGVBQWU7QUFDbEMscUJBQXFCLGtCQUFrQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsbUJBQW1CLGVBQWU7QUFDbEMscUJBQXFCLGtCQUFrQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixlQUFlO0FBQ2xDLHFCQUFxQixrQkFBa0I7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsbUJBQW1CLGVBQWU7QUFDbEMscUJBQXFCLGtCQUFrQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsbUJBQW1CLGVBQWU7QUFDbEMscUJBQXFCLGtCQUFrQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsbUJBQW1CLGVBQWU7QUFDbEMscUJBQXFCLGtCQUFrQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsbUJBQW1CLGVBQWU7QUFDbEMscUJBQXFCLGtCQUFrQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsbUJBQW1CLGVBQWU7QUFDbEMscUJBQXFCLGtCQUFrQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsbUJBQW1CLGVBQWU7QUFDbEMscUJBQXFCLGtCQUFrQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsbUJBQW1CLGVBQWU7QUFDbEMscUJBQXFCLGtCQUFrQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsbUJBQW1CLGVBQWU7QUFDbEMscUJBQXFCLGtCQUFrQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsbUJBQW1CLGVBQWU7QUFDbEMscUJBQXFCLGtCQUFrQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsbUJBQW1CLGVBQWU7QUFDbEMscUJBQXFCLGtCQUFrQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsbUJBQW1CLGVBQWU7QUFDbEMscUJBQXFCLGtCQUFrQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsbUJBQW1CLGVBQWU7QUFDbEMscUJBQXFCLGtCQUFrQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsbUJBQW1CLGVBQWU7QUFDbEMscUJBQXFCLGtCQUFrQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsbUJBQW1CLGVBQWU7QUFDbEMscUJBQXFCLGtCQUFrQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsbUJBQW1CLGVBQWU7QUFDbEMscUJBQXFCLGtCQUFrQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsbUJBQW1CLGVBQWU7QUFDbEMscUJBQXFCLGtCQUFrQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsbUJBQW1CLGVBQWU7QUFDbEMscUJBQXFCLGtCQUFrQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsbUJBQW1CLGVBQWU7QUFDbEMscUJBQXFCLGtCQUFrQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsbUJBQW1CLGVBQWU7QUFDbEMscUJBQXFCLGtCQUFrQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsbUJBQW1CLGVBQWU7QUFDbEMscUJBQXFCLGtCQUFrQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsbUJBQW1CLGVBQWU7QUFDbEMscUJBQXFCLGtCQUFrQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsbUJBQW1CLGVBQWU7QUFDbEMscUJBQXFCLGtCQUFrQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsbUJBQW1CLGVBQWU7QUFDbEMscUJBQXFCLGtCQUFrQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsbUJBQW1CLGVBQWU7QUFDbEMscUJBQXFCLGtCQUFrQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsbUJBQW1CLGVBQWU7QUFDbEMscUJBQXFCLGtCQUFrQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsbUJBQW1CLGVBQWU7QUFDbEMscUJBQXFCLGtCQUFrQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsbUJBQW1CLGVBQWU7QUFDbEMscUJBQXFCLGtCQUFrQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsbUJBQW1CLGVBQWU7QUFDbEMscUJBQXFCLGtCQUFrQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsbUJBQW1CLGVBQWU7QUFDbEMscUJBQXFCLGtCQUFrQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsbUJBQW1CLGVBQWU7QUFDbEMscUJBQXFCLGtCQUFrQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixlQUFlO0FBQ2xDLHFCQUFxQixrQkFBa0I7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUN0ekJBO0FBQ0E7QUFDQTtB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Q0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCOztBQUVBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLGFBQWEsNkJBQUksUUFBUSw2QkFBSTtBQUM3QjtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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Q0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQzs7QUMveUJBO0FBQ2U7QUFDZjtBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDOztBQ3hGZTtBQUNmO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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Q0EsU0FBUyxFQUFFOztBQUVYO0FBQ0E7QUFDQTtBQUNBLFNBQVMsRUFBRTtBQUNYLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsRUFBRTs7QUFFWDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVMsRUFBRTs7QUFFWDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUssRUFBRTs7QUFFUCw0Q0FBNEM7O0FBRTVDLDRDQUE0Qzs7QUFFNUMsK0NBQStDOztBQUUvQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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O0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxlQUFlLHNCQUFNO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU8sRUFBRTtBQUNUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFD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Q0g7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0EsWUFBWSx5QkFBeUI7QUFDckM7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ087QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRU8sSUFBSSxzQkFBUTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRU87QUFD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QSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSzs7O0FBR0w7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDOztBQUV2Qzs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esc0JBQXNCOztBQUV0Qiw0QkFBNEI7O0FBRTVCO0FBQ0EsdUNBQXVDOztBQUV2QztBQUNBO0FBQ0E7QUFDQSxLQUFLLEVBQUU7O0FBRVA7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQSwyQkFBMkIsb0JBQUs7QUFDaEMsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFD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QUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7OztBQUdMO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBLDJCQUEyQjs7QUFFM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSzs7O0FBR0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU0sbUJBQUk7QUFDVjtBQUNBLE9BQU87QUFDUDtBQUNBLE1BQU0sbUJBQUk7QUFDVjtBQUNBLE9BQU87QUFDUDtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsS0FBSztBQUNMLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztB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QixZQUFZO0FBQzVCLGdCQUFnQixZQUFZO0FBQzVCLFdBQVcsU0FBTTtBQUNqQixRQUFRLFNBQU07QUFDZCxZQUFZLFNBQU07QUFDbEIsUUFBUSxTQUFNO0FBQ2QsV0FBVyxTQUFNO0FBQ2pCLFdBQVcsU0FBTTtBQUNqQixVQUFVLFNBQU07QUFDaEIsV0FBVyxVQUFPO0FBQ2xCLFlBQVksV0FBUTtBQUNwQixXQUFXLFVBQU87QUFDbEI7QUFDQSxrQkFBa0IsaUJBQWM7QUFDaEM7QUFDQSxTQUFTLGFBQUs7QUFDZCxVQUFVLE1BQU07QUFDaEIsU0FBUyxVQUFLO0FBQ2QsQ0FBQyxFOztBQzVENEI7QUFDN0IsUUFBRTtBQUMwQjtBQUNiLG1GQUFFLEVBQUM7QUFDWCIsImZpbGUiOiI1MC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGVhY2ggfSBmcm9tICdAYW50di91dGlsJzsgLy8g6Ieq5a6a5LmJIEJlaGF2aW9yIOaXtuWAmeWFseacieeahOaWueazlVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGdldERlZmF1bHRDZmc6IGZ1bmN0aW9uIGdldERlZmF1bHRDZmcoKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9LFxuXG4gIC8qKlxuICAgKiByZWdpc3RlciBldmVudCBoYW5kbGVyLCBiZWhhdmlvciB3aWxsIGF1dG8gYmluZCBldmVudHNcbiAgICogZm9yIGV4YW1wbGU6XG4gICAqIHJldHVybiB7XG4gICAqICBjbGljazogJ29uQ2xpY2snXG4gICAqIH1cbiAgICovXG4gIGdldEV2ZW50czogZnVuY3Rpb24gZ2V0RXZlbnRzKCkge1xuICAgIHJldHVybiB7fTtcbiAgfSxcbiAgdXBkYXRlQ2ZnOiBmdW5jdGlvbiB1cGRhdGVDZmcoY2ZnKSB7XG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLCBjZmcpO1xuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICBzaG91bGRCZWdpbjogZnVuY3Rpb24gc2hvdWxkQmVnaW4oKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIHNob3VsZFVwZGF0ZTogZnVuY3Rpb24gc2hvdWxkVXBkYXRlKCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICBzaG91bGRFbmQ6IGZ1bmN0aW9uIHNob3VsZEVuZCgpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcblxuICAvKipcbiAgICogYXV0byBiaW5kIGV2ZW50cyB3aGVuIHJlZ2lzdGVyIGJlaGF2aW9yXG4gICAqIEBwYXJhbSBncmFwaCBHcmFwaCBpbnN0YW5jZVxuICAgKi9cbiAgYmluZDogZnVuY3Rpb24gYmluZChncmFwaCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICB2YXIgZXZlbnRzID0gdGhpcy5ldmVudHM7XG4gICAgdGhpcy5ncmFwaCA9IGdyYXBoO1xuXG4gICAgaWYgKHRoaXMudHlwZSA9PT0gJ2RyYWctY2FudmFzJyB8fCB0aGlzLnR5cGUgPT09ICdicnVzaC1zZWxlY3QnIHx8IHRoaXMudHlwZSA9PT0gJ2xhc3NvLXNlbGVjdCcpIHtcbiAgICAgIGdyYXBoLmdldCgnY2FudmFzJykuc2V0KCdkcmFnZ2FibGUnLCB0cnVlKTtcbiAgICB9XG5cbiAgICBlYWNoKGV2ZW50cywgZnVuY3Rpb24gKGhhbmRsZXIsIGV2ZW50KSB7XG4gICAgICBncmFwaC5vbihldmVudCwgaGFuZGxlcik7XG4gICAgfSk7IC8vIFRvIGF2b2lkIHRoZSB0YWJzIHN3aXRjaGluZyBtYWtlcyB0aGUga2V5ZG93biByZWxhdGVkIGJlaGF2aW9ycyBkaXNhYmxlXG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd2aXNpYmlsaXR5Y2hhbmdlJywgZnVuY3Rpb24gKCkge1xuICAgICAgX3RoaXMua2V5ZG93biA9IGZhbHNlO1xuICAgIH0pO1xuICB9LFxuICB1bmJpbmQ6IGZ1bmN0aW9uIHVuYmluZChncmFwaCkge1xuICAgIHZhciBldmVudHMgPSB0aGlzLmV2ZW50cztcbiAgICB2YXIgZHJhZ2dhYmxlID0gZ3JhcGguZ2V0KCdjYW52YXMnKS5nZXQoJ2RyYWdnYWJsZScpO1xuXG4gICAgaWYgKHRoaXMudHlwZSA9PT0gJ2RyYWctY2FudmFzJyB8fCB0aGlzLnR5cGUgPT09ICdicnVzaC1zZWxlY3QnIHx8IHRoaXMudHlwZSA9PT0gJ2xhc3NvLXNlbGVjdCcpIHtcbiAgICAgIGdyYXBoLmdldCgnY2FudmFzJykuc2V0KCdkcmFnZ2FibGUnLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgZWFjaChldmVudHMsIGZ1bmN0aW9uIChoYW5kbGVyLCBldmVudCkge1xuICAgICAgZ3JhcGgub2ZmKGV2ZW50LCBoYW5kbGVyKTtcbiAgICB9KTtcbiAgICBncmFwaC5nZXQoJ2NhbnZhcycpLnNldCgnZHJhZ2dhYmxlJywgZHJhZ2dhYmxlKTtcbiAgfSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQodmFsKSB7XG4gICAgcmV0dXJuIHRoaXNbdmFsXTtcbiAgfSxcbiAgc2V0OiBmdW5jdGlvbiBzZXQoa2V5LCB2YWwpIHtcbiAgICB0aGlzW2tleV0gPSB2YWw7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn07IiwiaW1wb3J0IHsgY2xvbmUsIGVhY2gsIHdyYXBCZWhhdmlvciB9IGZyb20gJ0BhbnR2L3V0aWwnO1xuaW1wb3J0IGJlaGF2aW9yT3B0aW9uIGZyb20gJy4vYmVoYXZpb3JPcHRpb24nO1xuXG52YXIgQmVoYXZpb3IgPVxuLyoqIEBjbGFzcyAqL1xuZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBCZWhhdmlvcigpIHt9XG4gIC8qKlxuICAgKiDoh6rlrprkuYkgQmVoYXZpb3JcbiAgICogQHBhcmFtIHR5cGUgQmVoYXZpb3Ig5ZCN56ewXG4gICAqIEBwYXJhbSBiZWhhdmlvciBCZWhhdmlvciDlrprkuYnnmoTmlrnms5Xpm4blkIhcbiAgICovXG5cblxuICBCZWhhdmlvci5yZWdpc3RlckJlaGF2aW9yID0gZnVuY3Rpb24gKHR5cGUsIGJlaGF2aW9yKSB7XG4gICAgaWYgKCFiZWhhdmlvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwicGxlYXNlIHNwZWNpZnkgaGFuZGxlciBmb3IgdGhpcyBiZWhhdmlvcjogXCIgKyB0eXBlKTtcbiAgICB9XG5cbiAgICB2YXIgcHJvdG90eXBlID0gY2xvbmUoYmVoYXZpb3JPcHRpb24pO1xuICAgIE9iamVjdC5hc3NpZ24ocHJvdG90eXBlLCBiZWhhdmlvcik7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLW5hbWVzXG5cbiAgICB2YXIgYmFzZSA9IGZ1bmN0aW9uIGJhc2UoY2ZnKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICBPYmplY3QuYXNzaWduKHRoaXMsIHRoaXMuZ2V0RGVmYXVsdENmZygpLCBjZmcpO1xuICAgICAgdmFyIGV2ZW50cyA9IHRoaXMuZ2V0RXZlbnRzKCk7XG4gICAgICB0aGlzLmV2ZW50cyA9IG51bGw7XG4gICAgICB2YXIgZXZlbnRzVG9CaW5kID0ge307XG5cbiAgICAgIGlmIChldmVudHMpIHtcbiAgICAgICAgZWFjaChldmVudHMsIGZ1bmN0aW9uIChoYW5kbGUsIGV2ZW50KSB7XG4gICAgICAgICAgZXZlbnRzVG9CaW5kW2V2ZW50XSA9IHdyYXBCZWhhdmlvcihfdGhpcywgaGFuZGxlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZXZlbnRzID0gZXZlbnRzVG9CaW5kO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBiYXNlLnByb3RvdHlwZSA9IHByb3RvdHlwZTtcbiAgICBCZWhhdmlvci50eXBlc1t0eXBlXSA9IGJhc2U7XG4gIH07XG5cbiAgQmVoYXZpb3IuaGFzQmVoYXZpb3IgPSBmdW5jdGlvbiAodHlwZSkge1xuICAgIHJldHVybiAhIUJlaGF2aW9yLnR5cGVzW3R5cGVdO1xuICB9O1xuXG4gIEJlaGF2aW9yLmdldEJlaGF2aW9yID0gZnVuY3Rpb24gKHR5cGUpIHtcbiAgICByZXR1cm4gQmVoYXZpb3IudHlwZXNbdHlwZV07XG4gIH07IC8vIOaJgOacieiHquWumuS5ieeahCBCZWhhdmlvciDnmoTlrp7kvotcblxuXG4gIEJlaGF2aW9yLnR5cGVzID0ge307XG4gIHJldHVybiBCZWhhdmlvcjtcbn0oKTtcblxuZXhwb3J0IGRlZmF1bHQgQmVoYXZpb3I7IiwiaW1wb3J0IEJlaGF2aW9yIGZyb20gJy4vYmVoYXZpb3InO1xuZXhwb3J0IGRlZmF1bHQgQmVoYXZpb3I7IiwidmFyIGFkak1hdHJpeCA9IGZ1bmN0aW9uIGFkak1hdHJpeChncmFwaERhdGEsIGRpcmVjdGVkKSB7XG4gIHZhciBub2RlcyA9IGdyYXBoRGF0YS5ub2RlcyxcbiAgICAgIGVkZ2VzID0gZ3JhcGhEYXRhLmVkZ2VzO1xuICB2YXIgbWF0cml4ID0gW107IC8vIG1hcCBub2RlIHdpdGggaW5kZXggaW4gZGF0YS5ub2Rlc1xuXG4gIHZhciBub2RlTWFwID0ge307XG5cbiAgaWYgKCFub2Rlcykge1xuICAgIHRocm93IG5ldyBFcnJvcihcImludmFsaWQgbm9kZXMgZGF0YSFcIik7XG4gIH1cblxuICBpZiAobm9kZXMpIHtcbiAgICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChub2RlLCBpKSB7XG4gICAgICBub2RlTWFwW25vZGUuaWRdID0gaTtcbiAgICAgIHZhciByb3cgPSBbXTtcbiAgICAgIG1hdHJpeC5wdXNoKHJvdyk7XG4gICAgfSk7XG4gIH1cblxuICBpZiAoZWRnZXMpIHtcbiAgICBlZGdlcy5mb3JFYWNoKGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgICB2YXIgc291cmNlID0gZWRnZS5zb3VyY2UsXG4gICAgICAgICAgdGFyZ2V0ID0gZWRnZS50YXJnZXQ7XG4gICAgICB2YXIgc0luZGV4ID0gbm9kZU1hcFtzb3VyY2VdO1xuICAgICAgdmFyIHRJbmRleCA9IG5vZGVNYXBbdGFyZ2V0XTtcbiAgICAgIGlmICghc0luZGV4ICYmIHNJbmRleCAhPT0gMCB8fCAhdEluZGV4ICYmIHRJbmRleCAhPT0gMCkgcmV0dXJuO1xuICAgICAgbWF0cml4W3NJbmRleF1bdEluZGV4XSA9IDE7XG5cbiAgICAgIGlmICghZGlyZWN0ZWQpIHtcbiAgICAgICAgbWF0cml4W3RJbmRleF1bc0luZGV4XSA9IDE7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gbWF0cml4O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgYWRqTWF0cml4OyIsInZhciBkZWZhdWx0Q29tcGFyYXRvciA9IGZ1bmN0aW9uIGRlZmF1bHRDb21wYXJhdG9yKGEsIGIpIHtcbiAgaWYgKGEgPT09IGIpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn07XG4vKipcbiAqIOmTvuihqOS4reWNleS4quWFg+e0oOiKgueCuVxuICovXG5cblxudmFyIExpbmtlZExpc3ROb2RlID1cbi8qKiBAY2xhc3MgKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gTGlua2VkTGlzdE5vZGUodmFsdWUsIG5leHQpIHtcbiAgICBpZiAobmV4dCA9PT0gdm9pZCAwKSB7XG4gICAgICBuZXh0ID0gbnVsbDtcbiAgICB9XG5cbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5uZXh0ID0gbmV4dDtcbiAgfVxuXG4gIExpbmtlZExpc3ROb2RlLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgIHJldHVybiBjYWxsYmFjayA/IGNhbGxiYWNrKHRoaXMudmFsdWUpIDogXCJcIiArIHRoaXMudmFsdWU7XG4gIH07XG5cbiAgcmV0dXJuIExpbmtlZExpc3ROb2RlO1xufSgpO1xuXG5leHBvcnQgeyBMaW5rZWRMaXN0Tm9kZSB9O1xuXG52YXIgTGlua2VkTGlzdCA9XG4vKiogQGNsYXNzICovXG5mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIExpbmtlZExpc3QoY29tcGFyYXRvcikge1xuICAgIGlmIChjb21wYXJhdG9yID09PSB2b2lkIDApIHtcbiAgICAgIGNvbXBhcmF0b3IgPSBkZWZhdWx0Q29tcGFyYXRvcjtcbiAgICB9XG5cbiAgICB0aGlzLmhlYWQgPSBudWxsO1xuICAgIHRoaXMudGFpbCA9IG51bGw7XG4gICAgdGhpcy5jb21wYXJlID0gY29tcGFyYXRvcjtcbiAgfVxuICAvKipcbiAgICog5bCG5oyH5a6a5YWD57Sg5re75Yqg5Yiw6ZO+6KGo5aS06YOoXG4gICAqIEBwYXJhbSB2YWx1ZVxuICAgKi9cblxuXG4gIExpbmtlZExpc3QucHJvdG90eXBlLnByZXBlbmQgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAvLyDlnKjlpLTpg6jmt7vliqDkuIDkuKroioLngrlcbiAgICB2YXIgbmV3Tm9kZSA9IG5ldyBMaW5rZWRMaXN0Tm9kZSh2YWx1ZSwgdGhpcy5oZWFkKTtcbiAgICB0aGlzLmhlYWQgPSBuZXdOb2RlO1xuXG4gICAgaWYgKCF0aGlzLnRhaWwpIHtcbiAgICAgIHRoaXMudGFpbCA9IG5ld05vZGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG4gIC8qKlxuICAgKiDlsIbmjIflrprlhYPntKDmt7vliqDliLDpk77ooajkuK1cbiAgICogQHBhcmFtIHZhbHVlXG4gICAqL1xuXG5cbiAgTGlua2VkTGlzdC5wcm90b3R5cGUuYXBwZW5kID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgdmFyIG5ld05vZGUgPSBuZXcgTGlua2VkTGlzdE5vZGUodmFsdWUpOyAvLyDlpoLmnpzkuI3lrZjlnKjlpLToioLngrnvvIzliJnlsIbliJvlu7rnmoTmlrDoioLngrnkvZzkuLrlpLToioLngrlcblxuICAgIGlmICghdGhpcy5oZWFkKSB7XG4gICAgICB0aGlzLmhlYWQgPSBuZXdOb2RlO1xuICAgICAgdGhpcy50YWlsID0gbmV3Tm9kZTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0gLy8g5bCG5paw6IqC54K56ZmE5Yqg5Yiw6ZO+6KGo5pyr5bC+XG5cblxuICAgIHRoaXMudGFpbC5uZXh0ID0gbmV3Tm9kZTtcbiAgICB0aGlzLnRhaWwgPSBuZXdOb2RlO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuICAvKipcbiAgICog5Yig6Zmk5oyH5a6a5YWD57SgXG4gICAqIEBwYXJhbSB2YWx1ZSDopoHliKDpmaTnmoTlhYPntKBcbiAgICovXG5cblxuICBMaW5rZWRMaXN0LnByb3RvdHlwZS5kZWxldGUgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICBpZiAoIXRoaXMuaGVhZCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgdmFyIGRlbGV0ZU5vZGUgPSBudWxsOyAvLyDlpoLmnpzliKDpmaTnmoTmmK/lpLTpg6jlhYPntKDvvIzliJnlsIZuZXh05L2c5Li65aS05YWD57SgXG5cbiAgICB3aGlsZSAodGhpcy5oZWFkICYmIHRoaXMuY29tcGFyZSh0aGlzLmhlYWQudmFsdWUsIHZhbHVlKSkge1xuICAgICAgZGVsZXRlTm9kZSA9IHRoaXMuaGVhZDtcbiAgICAgIHRoaXMuaGVhZCA9IHRoaXMuaGVhZC5uZXh0O1xuICAgIH1cblxuICAgIHZhciBjdXJyZW50Tm9kZSA9IHRoaXMuaGVhZDtcblxuICAgIGlmIChjdXJyZW50Tm9kZSAhPT0gbnVsbCkge1xuICAgICAgLy8g5aaC5p6c5Yig6Zmk5LqG6IqC54K55Lul5ZCO77yM5bCGbmV4dOiKgueCueWJjeenu1xuICAgICAgd2hpbGUgKGN1cnJlbnROb2RlLm5leHQpIHtcbiAgICAgICAgaWYgKHRoaXMuY29tcGFyZShjdXJyZW50Tm9kZS5uZXh0LnZhbHVlLCB2YWx1ZSkpIHtcbiAgICAgICAgICBkZWxldGVOb2RlID0gY3VycmVudE5vZGUubmV4dDtcbiAgICAgICAgICBjdXJyZW50Tm9kZS5uZXh0ID0gY3VycmVudE5vZGUubmV4dC5uZXh0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGN1cnJlbnROb2RlID0gY3VycmVudE5vZGUubmV4dDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gLy8g5qOA5p+l5bC+6YOo6IqC54K55piv5ZCm6KKr5Yig6ZmkXG5cblxuICAgIGlmICh0aGlzLmNvbXBhcmUodGhpcy50YWlsLnZhbHVlLCB2YWx1ZSkpIHtcbiAgICAgIHRoaXMudGFpbCA9IGN1cnJlbnROb2RlO1xuICAgIH1cblxuICAgIHJldHVybiBkZWxldGVOb2RlO1xuICB9O1xuICAvKipcbiAgICog5p+l5om+5oyH5a6a55qE5YWD57SgXG4gICAqIEBwYXJhbSBwYXJhbTBcbiAgICovXG5cblxuICBMaW5rZWRMaXN0LnByb3RvdHlwZS5maW5kID0gZnVuY3Rpb24gKF9hKSB7XG4gICAgdmFyIF9iID0gX2EudmFsdWUsXG4gICAgICAgIHZhbHVlID0gX2IgPT09IHZvaWQgMCA/IHVuZGVmaW5lZCA6IF9iLFxuICAgICAgICBfYyA9IF9hLmNhbGxiYWNrLFxuICAgICAgICBjYWxsYmFjayA9IF9jID09PSB2b2lkIDAgPyB1bmRlZmluZWQgOiBfYztcblxuICAgIGlmICghdGhpcy5oZWFkKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB2YXIgY3VycmVudE5vZGUgPSB0aGlzLmhlYWQ7XG5cbiAgICB3aGlsZSAoY3VycmVudE5vZGUpIHtcbiAgICAgIC8vIOWmguaenOaMh+WumuS6hiBjYWxsYmFja++8jOWImeaMieaMh+WumueahCBjYWxsYmFjayDmn6Xmib5cbiAgICAgIGlmIChjYWxsYmFjayAmJiBjYWxsYmFjayhjdXJyZW50Tm9kZS52YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnROb2RlO1xuICAgICAgfSAvLyDlpoLmnpzmjIflrprkuoYgdmFsdWXvvIzliJnmjIkgdmFsdWUg5p+l5om+XG5cblxuICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdGhpcy5jb21wYXJlKGN1cnJlbnROb2RlLnZhbHVlLCB2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnROb2RlO1xuICAgICAgfVxuXG4gICAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLm5leHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH07XG4gIC8qKlxuICAgKiDliKDpmaTlsL7pg6joioLngrlcbiAgICovXG5cblxuICBMaW5rZWRMaXN0LnByb3RvdHlwZS5kZWxldGVUYWlsID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBkZWxldGVkVGFpbCA9IHRoaXMudGFpbDtcblxuICAgIGlmICh0aGlzLmhlYWQgPT09IHRoaXMudGFpbCkge1xuICAgICAgLy8g6ZO+6KGo5Lit5Y+q5pyJ5LiA5Liq5YWD57SgXG4gICAgICB0aGlzLmhlYWQgPSBudWxsO1xuICAgICAgdGhpcy50YWlsID0gbnVsbDtcbiAgICAgIHJldHVybiBkZWxldGVkVGFpbDtcbiAgICB9XG5cbiAgICB2YXIgY3VycmVudE5vZGUgPSB0aGlzLmhlYWQ7XG5cbiAgICB3aGlsZSAoY3VycmVudE5vZGUubmV4dCkge1xuICAgICAgaWYgKCFjdXJyZW50Tm9kZS5uZXh0Lm5leHQpIHtcbiAgICAgICAgY3VycmVudE5vZGUubmV4dCA9IG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLm5leHQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy50YWlsID0gY3VycmVudE5vZGU7XG4gICAgcmV0dXJuIGRlbGV0ZWRUYWlsO1xuICB9O1xuICAvKipcbiAgICog5Yig6Zmk5aS06YOo6IqC54K5XG4gICAqL1xuXG5cbiAgTGlua2VkTGlzdC5wcm90b3R5cGUuZGVsZXRlSGVhZCA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXRoaXMuaGVhZCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgdmFyIGRlbGV0ZWRIZWFkID0gdGhpcy5oZWFkO1xuXG4gICAgaWYgKHRoaXMuaGVhZC5uZXh0KSB7XG4gICAgICB0aGlzLmhlYWQgPSB0aGlzLmhlYWQubmV4dDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5oZWFkID0gbnVsbDtcbiAgICAgIHRoaXMudGFpbCA9IG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlbGV0ZWRIZWFkO1xuICB9O1xuICAvKipcbiAgICog5bCG5LiA57uE5YWD57Sg6L2s5oiQ6ZO+6KGo5Lit55qE6IqC54K5XG4gICAqIEBwYXJhbSB2YWx1ZXMg6ZO+6KGo5Lit55qE5YWD57SgXG4gICAqL1xuXG5cbiAgTGlua2VkTGlzdC5wcm90b3R5cGUuZnJvbUFycmF5ID0gZnVuY3Rpb24gKHZhbHVlcykge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICB2YWx1ZXMuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIHJldHVybiBfdGhpcy5hcHBlbmQodmFsdWUpO1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuICAvKipcbiAgICog5bCG6ZO+6KGo5Lit55qE6IqC54K56L2s5oiQ5pWw57uE5YWD57SgXG4gICAqL1xuXG5cbiAgTGlua2VkTGlzdC5wcm90b3R5cGUudG9BcnJheSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgbm9kZXMgPSBbXTtcbiAgICB2YXIgY3VycmVudE5vZGUgPSB0aGlzLmhlYWQ7XG5cbiAgICB3aGlsZSAoY3VycmVudE5vZGUpIHtcbiAgICAgIG5vZGVzLnB1c2goY3VycmVudE5vZGUpO1xuICAgICAgY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS5uZXh0O1xuICAgIH1cblxuICAgIHJldHVybiBub2RlcztcbiAgfTtcbiAgLyoqXG4gICAqIOWPjei9rOmTvuihqOS4reeahOWFg+e0oOiKgueCuVxuICAgKi9cblxuXG4gIExpbmtlZExpc3QucHJvdG90eXBlLnJldmVyc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGN1cnJlbnROb2RlID0gdGhpcy5oZWFkO1xuICAgIHZhciBwcmV2Tm9kZSA9IG51bGw7XG4gICAgdmFyIG5leHROb2RlID0gbnVsbDtcblxuICAgIHdoaWxlIChjdXJyZW50Tm9kZSkge1xuICAgICAgLy8g5a2Y5YKo5LiL5LiA5Liq5YWD57Sg6IqC54K5XG4gICAgICBuZXh0Tm9kZSA9IGN1cnJlbnROb2RlLm5leHQ7IC8vIOabtOaUueW9k+WJjeiKgueCueeahOS4i+S4gOS4quiKgueCue+8jOS7peS+v+WwhuWug+i/nuaOpeWIsOS4iuS4gOS4quiKgueCueS4ilxuXG4gICAgICBjdXJyZW50Tm9kZS5uZXh0ID0gcHJldk5vZGU7IC8vIOWwhiBwcmV2Tm9kZSDlkowgY3VycmVudE5vZGUg5ZCR5YmN56e75Yqo5LiA5q2lXG5cbiAgICAgIHByZXZOb2RlID0gY3VycmVudE5vZGU7XG4gICAgICBjdXJyZW50Tm9kZSA9IG5leHROb2RlO1xuICAgIH1cblxuICAgIHRoaXMudGFpbCA9IHRoaXMuaGVhZDtcbiAgICB0aGlzLmhlYWQgPSBwcmV2Tm9kZTtcbiAgfTtcblxuICBMaW5rZWRMaXN0LnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgIGlmIChjYWxsYmFjayA9PT0gdm9pZCAwKSB7XG4gICAgICBjYWxsYmFjayA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy50b0FycmF5KCkubWFwKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICByZXR1cm4gbm9kZS50b1N0cmluZyhjYWxsYmFjayk7XG4gICAgfSkudG9TdHJpbmcoKTtcbiAgfTtcblxuICByZXR1cm4gTGlua2VkTGlzdDtcbn0oKTtcblxuZXhwb3J0IGRlZmF1bHQgTGlua2VkTGlzdDsiLCJpbXBvcnQgTGlua2VkTGlzdCBmcm9tICcuL2xpbmtlZC1saXN0JztcblxudmFyIFF1ZXVlID1cbi8qKiBAY2xhc3MgKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gUXVldWUoKSB7XG4gICAgdGhpcy5saW5rZWRMaXN0ID0gbmV3IExpbmtlZExpc3QoKTtcbiAgfVxuICAvKipcbiAgICog6Zif5YiX5piv5ZCm5Li656m6XG4gICAqL1xuXG5cbiAgUXVldWUucHJvdG90eXBlLmlzRW1wdHkgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuICF0aGlzLmxpbmtlZExpc3QuaGVhZDtcbiAgfTtcbiAgLyoqXG4gICAqIOivu+WPlumYn+WIl+WktOmDqOeahOWFg+e0oO+8jCDkuI3liKDpmaTpmJ/liJfkuK3nmoTlhYPntKBcbiAgICovXG5cblxuICBRdWV1ZS5wcm90b3R5cGUucGVlayA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXRoaXMubGlua2VkTGlzdC5oZWFkKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5saW5rZWRMaXN0LmhlYWQudmFsdWU7XG4gIH07XG4gIC8qKlxuICAgKiDlnKjpmJ/liJfnmoTlsL7pg6jmlrDlop7kuIDkuKrlhYPntKBcbiAgICogQHBhcmFtIHZhbHVlXG4gICAqL1xuXG5cbiAgUXVldWUucHJvdG90eXBlLmVucXVldWUgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICB0aGlzLmxpbmtlZExpc3QuYXBwZW5kKHZhbHVlKTtcbiAgfTtcbiAgLyoqXG4gICAqIOWIoOmZpOmYn+WIl+S4reeahOWktOmDqOWFg+e0oO+8jOWmguaenOmYn+WIl+S4uuepuu+8jOWImei/lOWbniBudWxsXG4gICAqL1xuXG5cbiAgUXVldWUucHJvdG90eXBlLmRlcXVldWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHJlbW92ZUhlYWQgPSB0aGlzLmxpbmtlZExpc3QuZGVsZXRlSGVhZCgpO1xuICAgIHJldHVybiByZW1vdmVIZWFkID8gcmVtb3ZlSGVhZC52YWx1ZSA6IG51bGw7XG4gIH07XG5cbiAgUXVldWUucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIHRoaXMubGlua2VkTGlzdC50b1N0cmluZyhjYWxsYmFjayk7XG4gIH07XG5cbiAgcmV0dXJuIFF1ZXVlO1xufSgpO1xuXG5leHBvcnQgZGVmYXVsdCBRdWV1ZTsiLCIvKipcbiAqIOiOt+WPluaMh+WumuiKgueCueeahOaJgOaciemCu+WxhVxuICogQHBhcmFtIG5vZGVJZCDoioLngrkgSURcbiAqIEBwYXJhbSBlZGdlcyDlm77kuK3nmoTmiYDmnInovrnmlbDmja5cbiAqIEBwYXJhbSB0eXBlIOmCu+Wxheexu+Wei1xuICovXG5leHBvcnQgdmFyIGdldE5laWdoYm9ycyA9IGZ1bmN0aW9uIGdldE5laWdoYm9ycyhub2RlSWQsIGVkZ2VzLCB0eXBlKSB7XG4gIGlmIChlZGdlcyA9PT0gdm9pZCAwKSB7XG4gICAgZWRnZXMgPSBbXTtcbiAgfVxuXG4gIHZhciBjdXJyZW50RWRnZXMgPSBlZGdlcy5maWx0ZXIoZnVuY3Rpb24gKGVkZ2UpIHtcbiAgICByZXR1cm4gZWRnZS5zb3VyY2UgPT09IG5vZGVJZCB8fCBlZGdlLnRhcmdldCA9PT0gbm9kZUlkO1xuICB9KTtcblxuICBpZiAodHlwZSA9PT0gJ3RhcmdldCcpIHtcbiAgICAvLyDlvZPliY3oioLngrnkuLogc291cmNl77yM5a6D5omA5oyH5ZCR55qE55uu5qCH6IqC54K5XG4gICAgdmFyIG5laWdoaGJvcnNDb252ZXJ0ZXJfMSA9IGZ1bmN0aW9uIG5laWdoaGJvcnNDb252ZXJ0ZXJfMShlZGdlKSB7XG4gICAgICByZXR1cm4gZWRnZS5zb3VyY2UgPT09IG5vZGVJZDtcbiAgICB9O1xuXG4gICAgcmV0dXJuIGN1cnJlbnRFZGdlcy5maWx0ZXIobmVpZ2hoYm9yc0NvbnZlcnRlcl8xKS5tYXAoZnVuY3Rpb24gKGVkZ2UpIHtcbiAgICAgIHJldHVybiBlZGdlLnRhcmdldDtcbiAgICB9KTtcbiAgfVxuXG4gIGlmICh0eXBlID09PSAnc291cmNlJykge1xuICAgIC8vIOW9k+WJjeiKgueCueS4uiB0YXJnZXTvvIzlroPmiYDmjIflkJHnmoTmupDoioLngrlcbiAgICB2YXIgbmVpZ2hoYm9yc0NvbnZlcnRlcl8yID0gZnVuY3Rpb24gbmVpZ2hoYm9yc0NvbnZlcnRlcl8yKGVkZ2UpIHtcbiAgICAgIHJldHVybiBlZGdlLnRhcmdldCA9PT0gbm9kZUlkO1xuICAgIH07XG5cbiAgICByZXR1cm4gY3VycmVudEVkZ2VzLmZpbHRlcihuZWlnaGhib3JzQ29udmVydGVyXzIpLm1hcChmdW5jdGlvbiAoZWRnZSkge1xuICAgICAgcmV0dXJuIGVkZ2Uuc291cmNlO1xuICAgIH0pO1xuICB9IC8vIOiLpeacquaMh+WumiB0eXBlIO+8jOWImei/lOWbnuaJgOaciemCu+WxhVxuXG5cbiAgdmFyIG5laWdoaGJvcnNDb252ZXJ0ZXIgPSBmdW5jdGlvbiBuZWlnaGhib3JzQ29udmVydGVyKGVkZ2UpIHtcbiAgICByZXR1cm4gZWRnZS5zb3VyY2UgPT09IG5vZGVJZCA/IGVkZ2UudGFyZ2V0IDogZWRnZS5zb3VyY2U7XG4gIH07XG5cbiAgcmV0dXJuIGN1cnJlbnRFZGdlcy5tYXAobmVpZ2hoYm9yc0NvbnZlcnRlcik7XG59O1xuLyoqXG4gKiDojrflj5bmjIflrproioLngrnnmoTlh7rovrlcbiAqIEBwYXJhbSBub2RlSWQg6IqC54K5IElEXG4gKiBAcGFyYW0gZWRnZXMg5Zu+5Lit55qE5omA5pyJ6L655pWw5o2uXG4gKi9cblxuZXhwb3J0IHZhciBnZXRPdXRFZGdlc05vZGVJZCA9IGZ1bmN0aW9uIGdldE91dEVkZ2VzTm9kZUlkKG5vZGVJZCwgZWRnZXMpIHtcbiAgcmV0dXJuIGVkZ2VzLmZpbHRlcihmdW5jdGlvbiAoZWRnZSkge1xuICAgIHJldHVybiBlZGdlLnNvdXJjZSA9PT0gbm9kZUlkO1xuICB9KTtcbn07XG4vKipcbiAqIOiOt+WPluaMh+WumuiKgueCueeahOi+ue+8jOWMheaLrOWHuui+ueWSjOWFpei+uVxuICogQHBhcmFtIG5vZGVJZCDoioLngrkgSURcbiAqIEBwYXJhbSBlZGdlcyDlm77kuK3nmoTmiYDmnInovrnmlbDmja5cbiAqL1xuXG5leHBvcnQgdmFyIGdldEVkZ2VzQnlOb2RlSWQgPSBmdW5jdGlvbiBnZXRFZGdlc0J5Tm9kZUlkKG5vZGVJZCwgZWRnZXMpIHtcbiAgcmV0dXJuIGVkZ2VzLmZpbHRlcihmdW5jdGlvbiAoZWRnZSkge1xuICAgIHJldHVybiBlZGdlLnNvdXJjZSA9PT0gbm9kZUlkIHx8IGVkZ2UudGFyZ2V0ID09PSBub2RlSWQ7XG4gIH0pO1xufTtcbi8qKlxuICog55Sf5oiQ5ZSv5LiA55qEIElE77yM6KeE5YiZ5piv5bqP5Y+3ICsg5pe26Ze05oizXG4gKiBAcGFyYW0gaW5kZXgg5bqP5Y+3XG4gKi9cblxuZXhwb3J0IHZhciB1bmlxdWVJZCA9IGZ1bmN0aW9uIHVuaXF1ZUlkKGluZGV4KSB7XG4gIGlmIChpbmRleCA9PT0gdm9pZCAwKSB7XG4gICAgaW5kZXggPSAwO1xuICB9XG5cbiAgdmFyIHJhbmRvbTEgPSAoXCJcIiArIE1hdGgucmFuZG9tKCkpLnNwbGl0KCcuJylbMV0uc3Vic3RyKDAsIDUpO1xuICB2YXIgcmFuZG9tMiA9IChcIlwiICsgTWF0aC5yYW5kb20oKSkuc3BsaXQoJy4nKVsxXS5zdWJzdHIoMCwgNSk7XG4gIHJldHVybiBpbmRleCArIFwiLVwiICsgcmFuZG9tMSArIHJhbmRvbTI7XG59OyIsImltcG9ydCBRdWV1ZSBmcm9tICcuL3N0cnVjdHMvcXVldWUnO1xuaW1wb3J0IHsgZ2V0TmVpZ2hib3JzIH0gZnJvbSAnLi91dGlsJztcbi8qKlxuICpcbiAqIEBwYXJhbSBjYWxsYmFja3NcbiAqIGFsbG93VHJhdmVyc2FsOiDnoa7lrpogQkZTIOaYr+WQpuS7jumhtueCueayv+edgOi+uemBjeWOhuWIsOWFtumCu+Wxhe+8jOm7mOiupOaDheWGteS4i++8jOWQjOS4gOS4quiKgueCueWPquiDvemBjeWOhuS4gOasoVxuICogZW50ZXJOb2RlOiDlvZMgQkZTIOiuv+mXruafkOS4quiKgueCueaXtuiwg+eUqFxuICogbGVhdmVOb2RlOiDlvZMgQkZTIOiuv+mXruiuv+mXrue7k+adn+afkOS4quiKgueCueaXtuiwg+eUqFxuICovXG5cbmZ1bmN0aW9uIGluaXRDYWxsYmFja3MoY2FsbGJhY2tzKSB7XG4gIGlmIChjYWxsYmFja3MgPT09IHZvaWQgMCkge1xuICAgIGNhbGxiYWNrcyA9IHt9O1xuICB9XG5cbiAgdmFyIGluaXRpYXRlZENhbGxiYWNrID0gY2FsbGJhY2tzO1xuXG4gIHZhciBzdHViQ2FsbGJhY2sgPSBmdW5jdGlvbiBzdHViQ2FsbGJhY2soKSB7fTtcblxuICB2YXIgYWxsb3dUcmF2ZXJzYWxDYWxsYmFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2VlbiA9IHt9O1xuICAgIHJldHVybiBmdW5jdGlvbiAoX2EpIHtcbiAgICAgIHZhciBuZXh0ID0gX2EubmV4dDtcbiAgICAgIHZhciBpZCA9IG5leHQ7XG5cbiAgICAgIGlmICghc2VlbltpZF0pIHtcbiAgICAgICAgc2VlbltpZF0gPSB0cnVlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG4gIH0oKTtcblxuICBpbml0aWF0ZWRDYWxsYmFjay5hbGxvd1RyYXZlcnNhbCA9IGNhbGxiYWNrcy5hbGxvd1RyYXZlcnNhbCB8fCBhbGxvd1RyYXZlcnNhbENhbGxiYWNrO1xuICBpbml0aWF0ZWRDYWxsYmFjay5lbnRlciA9IGNhbGxiYWNrcy5lbnRlciB8fCBzdHViQ2FsbGJhY2s7XG4gIGluaXRpYXRlZENhbGxiYWNrLmxlYXZlID0gY2FsbGJhY2tzLmxlYXZlIHx8IHN0dWJDYWxsYmFjaztcbiAgcmV0dXJuIGluaXRpYXRlZENhbGxiYWNrO1xufVxuLyoqXG4gKiDlub/luqbkvJjlhYjpgY3ljoblm75cbiAqIEBwYXJhbSBncmFwaCBHcmFwaCDlm77lrp7kvotcbiAqIEBwYXJhbSBzdGFydE5vZGUg5byA5aeL6YGN5Y6G55qE6IqC54K5XG4gKiBAcGFyYW0gb3JpZ2luYWxDYWxsYmFja3Mg5Zue6LCDXG4gKi9cblxuXG52YXIgYnJlYWR0aEZpcnN0U2VhcmNoID0gZnVuY3Rpb24gYnJlYWR0aEZpcnN0U2VhcmNoKGdyYXBoRGF0YSwgc3RhcnROb2RlSWQsIG9yaWdpbmFsQ2FsbGJhY2tzLCBkaXJlY3RlZCkge1xuICBpZiAoZGlyZWN0ZWQgPT09IHZvaWQgMCkge1xuICAgIGRpcmVjdGVkID0gdHJ1ZTtcbiAgfVxuXG4gIHZhciBjYWxsYmFja3MgPSBpbml0Q2FsbGJhY2tzKG9yaWdpbmFsQ2FsbGJhY2tzKTtcbiAgdmFyIG5vZGVRdWV1ZSA9IG5ldyBRdWV1ZSgpO1xuICB2YXIgX2EgPSBncmFwaERhdGEuZWRnZXMsXG4gICAgICBlZGdlcyA9IF9hID09PSB2b2lkIDAgPyBbXSA6IF9hOyAvLyDliJ3lp4vljJbpmJ/liJflhYPntKBcblxuICBub2RlUXVldWUuZW5xdWV1ZShzdGFydE5vZGVJZCk7XG4gIHZhciBwcmV2aW91c05vZGUgPSAnJztcblxuICB2YXIgX2xvb3BfMSA9IGZ1bmN0aW9uIF9sb29wXzEoKSB7XG4gICAgdmFyIGN1cnJlbnROb2RlID0gbm9kZVF1ZXVlLmRlcXVldWUoKTtcbiAgICBjYWxsYmFja3MuZW50ZXIoe1xuICAgICAgY3VycmVudDogY3VycmVudE5vZGUsXG4gICAgICBwcmV2aW91czogcHJldmlvdXNOb2RlXG4gICAgfSk7IC8vIOWwhuaJgOaciemCu+Wxhea3u+WKoOWIsOmYn+WIl+S4reS7peS+v+mBjeWOhlxuXG4gICAgZ2V0TmVpZ2hib3JzKGN1cnJlbnROb2RlLCBlZGdlcywgZGlyZWN0ZWQgPyAndGFyZ2V0JyA6IHVuZGVmaW5lZCkuZm9yRWFjaChmdW5jdGlvbiAobmV4dE5vZGUpIHtcbiAgICAgIGlmIChjYWxsYmFja3MuYWxsb3dUcmF2ZXJzYWwoe1xuICAgICAgICBwcmV2aW91czogcHJldmlvdXNOb2RlLFxuICAgICAgICBjdXJyZW50OiBjdXJyZW50Tm9kZSxcbiAgICAgICAgbmV4dDogbmV4dE5vZGVcbiAgICAgIH0pKSB7XG4gICAgICAgIG5vZGVRdWV1ZS5lbnF1ZXVlKG5leHROb2RlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBjYWxsYmFja3MubGVhdmUoe1xuICAgICAgY3VycmVudDogY3VycmVudE5vZGUsXG4gICAgICBwcmV2aW91czogcHJldmlvdXNOb2RlXG4gICAgfSk7IC8vIOS4i+S4gOasoeW+queOr+S5i+WJjeWtmOWCqOW9k+WJjemhtueCuVxuXG4gICAgcHJldmlvdXNOb2RlID0gY3VycmVudE5vZGU7XG4gIH07IC8vIOmBjeWOhumYn+WIl+S4reeahOaJgOaciemhtueCuVxuXG5cbiAgd2hpbGUgKCFub2RlUXVldWUuaXNFbXB0eSgpKSB7XG4gICAgX2xvb3BfMSgpO1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBicmVhZHRoRmlyc3RTZWFyY2g7IiwiaW1wb3J0IHsgZ2V0TmVpZ2hib3JzIH0gZnJvbSBcIi4vdXRpbFwiO1xuLyoqXG4gKiBHZW5lcmF0ZSBhbGwgY29ubmVjdGVkIGNvbXBvbmVudHMgZm9yIGFuIHVuZGlyZWN0ZWQgZ3JhcGhcbiAqIEBwYXJhbSBncmFwaFxuICovXG5cbmV4cG9ydCB2YXIgZGV0ZWN0Q29ubmVjdGVkQ29tcG9uZW50cyA9IGZ1bmN0aW9uIGRldGVjdENvbm5lY3RlZENvbXBvbmVudHMoZ3JhcGhEYXRhKSB7XG4gIHZhciBfYSA9IGdyYXBoRGF0YS5ub2RlcyxcbiAgICAgIG5vZGVzID0gX2EgPT09IHZvaWQgMCA/IFtdIDogX2EsXG4gICAgICBfYiA9IGdyYXBoRGF0YS5lZGdlcyxcbiAgICAgIGVkZ2VzID0gX2IgPT09IHZvaWQgMCA/IFtdIDogX2I7XG4gIHZhciBhbGxDb21wb25lbnRzID0gW107XG4gIHZhciB2aXNpdGVkID0ge307XG4gIHZhciBub2RlU3RhY2sgPSBbXTtcblxuICB2YXIgZ2V0Q29tcG9uZW50ID0gZnVuY3Rpb24gZ2V0Q29tcG9uZW50KG5vZGUpIHtcbiAgICBub2RlU3RhY2sucHVzaChub2RlKTtcbiAgICB2aXNpdGVkW25vZGUuaWRdID0gdHJ1ZTtcbiAgICB2YXIgbmVpZ2hib3JzID0gZ2V0TmVpZ2hib3JzKG5vZGUuaWQsIGVkZ2VzKTtcblxuICAgIHZhciBfbG9vcF8xID0gZnVuY3Rpb24gX2xvb3BfMShpKSB7XG4gICAgICB2YXIgbmVpZ2hib3IgPSBuZWlnaGJvcnNbaV07XG5cbiAgICAgIGlmICghdmlzaXRlZFtuZWlnaGJvcl0pIHtcbiAgICAgICAgdmFyIHRhcmdldE5vZGUgPSBub2Rlcy5maWx0ZXIoZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgICByZXR1cm4gbm9kZS5pZCA9PT0gbmVpZ2hib3I7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICh0YXJnZXROb2RlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBnZXRDb21wb25lbnQodGFyZ2V0Tm9kZVswXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuZWlnaGJvcnMubGVuZ3RoOyArK2kpIHtcbiAgICAgIF9sb29wXzEoaSk7XG4gICAgfVxuICB9O1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgbm9kZSA9IG5vZGVzW2ldO1xuXG4gICAgaWYgKCF2aXNpdGVkW25vZGUuaWRdKSB7XG4gICAgICAvLyDlr7nkuo7ml6DlkJHlm77ov5vooYxkZnPpgY3ljobvvIzmr4/kuIDmrKHosIPnlKjlkI7pg73lvpfliLDkuIDkuKrov57pgJrliIbph49cbiAgICAgIGdldENvbXBvbmVudChub2RlKTtcbiAgICAgIHZhciBjb21wb25lbnQgPSBbXTtcblxuICAgICAgd2hpbGUgKG5vZGVTdGFjay5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbXBvbmVudC5wdXNoKG5vZGVTdGFjay5wb3AoKSk7XG4gICAgICB9XG5cbiAgICAgIGFsbENvbXBvbmVudHMucHVzaChjb21wb25lbnQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBhbGxDb21wb25lbnRzO1xufTtcbi8qKlxuICogVGFyamFuJ3MgQWxnb3JpdGhtIOWkjeadguW6piAgTyh8VnwrfEV8KVxuICogRm9yIGRpcmVjdGVkIGdyYXBoIG9ubHlcbiAqIGEgZGlyZWN0ZWQgZ3JhcGggaXMgc2FpZCB0byBiZSBzdHJvbmdseSBjb25uZWN0ZWQgaWYgXCJldmVyeSB2ZXJ0ZXggaXMgcmVhY2hhYmxlIGZyb20gZXZlcnkgb3RoZXIgdmVydGV4XCIuXG4gKiByZWZlcjogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9UYXJqYW4lMjdzX3N0cm9uZ2x5X2Nvbm5lY3RlZF9jb21wb25lbnRzX2FsZ29yaXRobVxuICogQHBhcmFtIGdyYXBoXG4gKiBAcmV0dXJuIGEgbGlzdCBvZiBzdHJvbmdseSBjb25uZWN0ZWQgY29tcG9uZW50c1xuICovXG5cbmV4cG9ydCB2YXIgZGV0ZWN0U3Ryb25nQ29ubmVjdENvbXBvbmVudHMgPSBmdW5jdGlvbiBkZXRlY3RTdHJvbmdDb25uZWN0Q29tcG9uZW50cyhncmFwaERhdGEpIHtcbiAgdmFyIF9hID0gZ3JhcGhEYXRhLm5vZGVzLFxuICAgICAgbm9kZXMgPSBfYSA9PT0gdm9pZCAwID8gW10gOiBfYSxcbiAgICAgIF9iID0gZ3JhcGhEYXRhLmVkZ2VzLFxuICAgICAgZWRnZXMgPSBfYiA9PT0gdm9pZCAwID8gW10gOiBfYjtcbiAgdmFyIG5vZGVTdGFjayA9IFtdO1xuICB2YXIgaW5TdGFjayA9IHt9OyAvLyDovoXliqnliKTmlq3mmK/lkKblt7Lnu4/lnKhzdGFja+S4re+8jOWHj+WwkeafpeaJvuW8gOmUgFxuXG4gIHZhciBpbmRpY2VzID0ge307XG4gIHZhciBsb3dMaW5rID0ge307XG4gIHZhciBhbGxDb21wb25lbnRzID0gW107XG4gIHZhciBpbmRleCA9IDA7XG5cbiAgdmFyIGdldENvbXBvbmVudCA9IGZ1bmN0aW9uIGdldENvbXBvbmVudChub2RlKSB7XG4gICAgLy8gU2V0IHRoZSBkZXB0aCBpbmRleCBmb3IgdiB0byB0aGUgc21hbGxlc3QgdW51c2VkIGluZGV4XG4gICAgaW5kaWNlc1tub2RlLmlkXSA9IGluZGV4O1xuICAgIGxvd0xpbmtbbm9kZS5pZF0gPSBpbmRleDtcbiAgICBpbmRleCArPSAxO1xuICAgIG5vZGVTdGFjay5wdXNoKG5vZGUpO1xuICAgIGluU3RhY2tbbm9kZS5pZF0gPSB0cnVlOyAvLyDogIPomZHmr4/kuKrpgrvmjqXngrlcblxuICAgIHZhciBuZWlnaGJvcnMgPSBnZXROZWlnaGJvcnMobm9kZS5pZCwgZWRnZXMsICd0YXJnZXQnKS5maWx0ZXIoZnVuY3Rpb24gKG4pIHtcbiAgICAgIHJldHVybiBub2Rlcy5tYXAoZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUuaWQ7XG4gICAgICB9KS5pbmRleE9mKG4pID4gLTE7XG4gICAgfSk7XG5cbiAgICB2YXIgX2xvb3BfMiA9IGZ1bmN0aW9uIF9sb29wXzIoaSkge1xuICAgICAgdmFyIHRhcmdldE5vZGVJRCA9IG5laWdoYm9yc1tpXTtcblxuICAgICAgaWYgKCFpbmRpY2VzW3RhcmdldE5vZGVJRF0gJiYgaW5kaWNlc1t0YXJnZXROb2RlSURdICE9PSAwKSB7XG4gICAgICAgIHZhciB0YXJnZXROb2RlID0gbm9kZXMuZmlsdGVyKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgICAgcmV0dXJuIG5vZGUuaWQgPT09IHRhcmdldE5vZGVJRDtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHRhcmdldE5vZGUubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGdldENvbXBvbmVudCh0YXJnZXROb2RlWzBdKTtcbiAgICAgICAgfSAvLyB0cmVlIGVkZ2VcblxuXG4gICAgICAgIGxvd0xpbmtbbm9kZS5pZF0gPSBNYXRoLm1pbihsb3dMaW5rW25vZGUuaWRdLCBsb3dMaW5rW3RhcmdldE5vZGVJRF0pO1xuICAgICAgfSBlbHNlIGlmIChpblN0YWNrW3RhcmdldE5vZGVJRF0pIHtcbiAgICAgICAgLy8gYmFjayBlZGdlLCB0YXJnZXQgbm9kZSBpcyBpbiB0aGUgY3VycmVudCBTQ0NcbiAgICAgICAgbG93TGlua1tub2RlLmlkXSA9IE1hdGgubWluKGxvd0xpbmtbbm9kZS5pZF0sIGluZGljZXNbdGFyZ2V0Tm9kZUlEXSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmVpZ2hib3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBfbG9vcF8yKGkpO1xuICAgIH0gLy8gSWYgbm9kZSBpcyBhIHJvb3Qgbm9kZSwgZ2VuZXJhdGUgYW4gU0NDXG5cblxuICAgIGlmIChsb3dMaW5rW25vZGUuaWRdID09PSBpbmRpY2VzW25vZGUuaWRdKSB7XG4gICAgICB2YXIgY29tcG9uZW50ID0gW107XG5cbiAgICAgIHdoaWxlIChub2RlU3RhY2subGVuZ3RoID4gMCkge1xuICAgICAgICB2YXIgdG1wTm9kZSA9IG5vZGVTdGFjay5wb3AoKTtcbiAgICAgICAgaW5TdGFja1t0bXBOb2RlLmlkXSA9IGZhbHNlO1xuICAgICAgICBjb21wb25lbnQucHVzaCh0bXBOb2RlKTtcbiAgICAgICAgaWYgKHRtcE5vZGUgPT09IG5vZGUpIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29tcG9uZW50Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgYWxsQ29tcG9uZW50cy5wdXNoKGNvbXBvbmVudCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIGZvciAodmFyIF9pID0gMCwgbm9kZXNfMSA9IG5vZGVzOyBfaSA8IG5vZGVzXzEubGVuZ3RoOyBfaSsrKSB7XG4gICAgdmFyIG5vZGUgPSBub2Rlc18xW19pXTtcblxuICAgIGlmICghaW5kaWNlc1tub2RlLmlkXSAmJiBpbmRpY2VzW25vZGUuaWRdICE9PSAwKSB7XG4gICAgICBnZXRDb21wb25lbnQobm9kZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGFsbENvbXBvbmVudHM7XG59O1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0Q29ubmVjdGVkQ29tcG9uZW50cyhncmFwaERhdGEsIGRpcmVjdGVkKSB7XG4gIGlmIChkaXJlY3RlZCkgcmV0dXJuIGRldGVjdFN0cm9uZ0Nvbm5lY3RDb21wb25lbnRzKGdyYXBoRGF0YSk7XG4gIHJldHVybiBkZXRlY3RDb25uZWN0ZWRDb21wb25lbnRzKGdyYXBoRGF0YSk7XG59IiwidmFyIGRlZ3JlZSA9IGZ1bmN0aW9uIGRlZ3JlZShncmFwaERhdGEpIHtcbiAgdmFyIGRlZ3JlZXMgPSB7fTtcbiAgdmFyIF9hID0gZ3JhcGhEYXRhLm5vZGVzLFxuICAgICAgbm9kZXMgPSBfYSA9PT0gdm9pZCAwID8gW10gOiBfYSxcbiAgICAgIF9iID0gZ3JhcGhEYXRhLmVkZ2VzLFxuICAgICAgZWRnZXMgPSBfYiA9PT0gdm9pZCAwID8gW10gOiBfYjtcbiAgbm9kZXMuZm9yRWFjaChmdW5jdGlvbiAobm9kZSkge1xuICAgIGRlZ3JlZXNbbm9kZS5pZF0gPSB7XG4gICAgICBkZWdyZWU6IDAsXG4gICAgICBpbkRlZ3JlZTogMCxcbiAgICAgIG91dERlZ3JlZTogMFxuICAgIH07XG4gIH0pO1xuICBlZGdlcy5mb3JFYWNoKGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgZGVncmVlc1tlZGdlLnNvdXJjZV0uZGVncmVlKys7XG4gICAgZGVncmVlc1tlZGdlLnNvdXJjZV0ub3V0RGVncmVlKys7XG4gICAgZGVncmVlc1tlZGdlLnRhcmdldF0uZGVncmVlKys7XG4gICAgZGVncmVlc1tlZGdlLnRhcmdldF0uaW5EZWdyZWUrKztcbiAgfSk7XG4gIHJldHVybiBkZWdyZWVzO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgZGVncmVlO1xuLyoqXG4gKiDojrflj5bmjIflrproioLngrnnmoTlhaXluqZcbiAqIEBwYXJhbSBncmFwaERhdGEg5Zu+5pWw5o2uXG4gKiBAcGFyYW0gbm9kZUlkIOiKgueCuUlEXG4gKi9cblxuZXhwb3J0IHZhciBnZXRJbkRlZ3JlZSA9IGZ1bmN0aW9uIGdldEluRGVncmVlKGdyYXBoRGF0YSwgbm9kZUlkKSB7XG4gIHZhciBub2RlRGVncmVlID0gZGVncmVlKGdyYXBoRGF0YSk7XG5cbiAgaWYgKG5vZGVEZWdyZWVbbm9kZUlkXSkge1xuICAgIHJldHVybiBkZWdyZWUoZ3JhcGhEYXRhKVtub2RlSWRdLmluRGVncmVlO1xuICB9XG5cbiAgcmV0dXJuIDA7XG59O1xuLyoqXG4gKiDojrflj5bmjIflrproioLngrnnmoTlh7rluqZcbiAqIEBwYXJhbSBncmFwaERhdGEg5Zu+5pWw5o2uXG4gKiBAcGFyYW0gbm9kZUlkIOiKgueCuUlEXG4gKi9cblxuZXhwb3J0IHZhciBnZXRPdXREZWdyZWUgPSBmdW5jdGlvbiBnZXRPdXREZWdyZWUoZ3JhcGhEYXRhLCBub2RlSWQpIHtcbiAgdmFyIG5vZGVEZWdyZWUgPSBkZWdyZWUoZ3JhcGhEYXRhKTtcblxuICBpZiAobm9kZURlZ3JlZVtub2RlSWRdKSB7XG4gICAgcmV0dXJuIGRlZ3JlZShncmFwaERhdGEpW25vZGVJZF0ub3V0RGVncmVlO1xuICB9XG5cbiAgcmV0dXJuIDA7XG59OyIsImltcG9ydCB7IGdldE5laWdoYm9ycyB9IGZyb20gJy4vdXRpbCc7XG5cbmZ1bmN0aW9uIGluaXRDYWxsYmFja3MoY2FsbGJhY2tzKSB7XG4gIGlmIChjYWxsYmFja3MgPT09IHZvaWQgMCkge1xuICAgIGNhbGxiYWNrcyA9IHt9O1xuICB9XG5cbiAgdmFyIGluaXRpYXRlZENhbGxiYWNrID0gY2FsbGJhY2tzO1xuXG4gIHZhciBzdHViQ2FsbGJhY2sgPSBmdW5jdGlvbiBzdHViQ2FsbGJhY2soKSB7fTtcblxuICB2YXIgYWxsb3dUcmF2ZXJzYWxDYWxsYmFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2VlbiA9IHt9O1xuICAgIHJldHVybiBmdW5jdGlvbiAoX2EpIHtcbiAgICAgIHZhciBuZXh0ID0gX2EubmV4dDtcblxuICAgICAgaWYgKCFzZWVuW25leHRdKSB7XG4gICAgICAgIHNlZW5bbmV4dF0gPSB0cnVlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG4gIH0oKTtcblxuICBpbml0aWF0ZWRDYWxsYmFjay5hbGxvd1RyYXZlcnNhbCA9IGNhbGxiYWNrcy5hbGxvd1RyYXZlcnNhbCB8fCBhbGxvd1RyYXZlcnNhbENhbGxiYWNrO1xuICBpbml0aWF0ZWRDYWxsYmFjay5lbnRlciA9IGNhbGxiYWNrcy5lbnRlciB8fCBzdHViQ2FsbGJhY2s7XG4gIGluaXRpYXRlZENhbGxiYWNrLmxlYXZlID0gY2FsbGJhY2tzLmxlYXZlIHx8IHN0dWJDYWxsYmFjaztcbiAgcmV0dXJuIGluaXRpYXRlZENhbGxiYWNrO1xufVxuLyoqXG4gKiBAcGFyYW0ge0dyYXBofSBncmFwaFxuICogQHBhcmFtIHtHcmFwaE5vZGV9IGN1cnJlbnROb2RlXG4gKiBAcGFyYW0ge0dyYXBoTm9kZX0gcHJldmlvdXNOb2RlXG4gKiBAcGFyYW0ge0NhbGxiYWNrc30gY2FsbGJhY2tzXG4gKi9cblxuXG5mdW5jdGlvbiBkZXB0aEZpcnN0U2VhcmNoUmVjdXJzaXZlKGdyYXBoRGF0YSwgY3VycmVudE5vZGUsIHByZXZpb3VzTm9kZSwgY2FsbGJhY2tzKSB7XG4gIGNhbGxiYWNrcy5lbnRlcih7XG4gICAgY3VycmVudDogY3VycmVudE5vZGUsXG4gICAgcHJldmlvdXM6IHByZXZpb3VzTm9kZVxuICB9KTtcbiAgdmFyIF9hID0gZ3JhcGhEYXRhLmVkZ2VzLFxuICAgICAgZWRnZXMgPSBfYSA9PT0gdm9pZCAwID8gW10gOiBfYTtcbiAgZ2V0TmVpZ2hib3JzKGN1cnJlbnROb2RlLCBlZGdlcywgJ3RhcmdldCcpLmZvckVhY2goZnVuY3Rpb24gKG5leHROb2RlKSB7XG4gICAgaWYgKGNhbGxiYWNrcy5hbGxvd1RyYXZlcnNhbCh7XG4gICAgICBwcmV2aW91czogcHJldmlvdXNOb2RlLFxuICAgICAgY3VycmVudDogY3VycmVudE5vZGUsXG4gICAgICBuZXh0OiBuZXh0Tm9kZVxuICAgIH0pKSB7XG4gICAgICBkZXB0aEZpcnN0U2VhcmNoUmVjdXJzaXZlKGdyYXBoRGF0YSwgbmV4dE5vZGUsIGN1cnJlbnROb2RlLCBjYWxsYmFja3MpO1xuICAgIH1cbiAgfSk7XG4gIGNhbGxiYWNrcy5sZWF2ZSh7XG4gICAgY3VycmVudDogY3VycmVudE5vZGUsXG4gICAgcHJldmlvdXM6IHByZXZpb3VzTm9kZVxuICB9KTtcbn1cbi8qKlxuICog5rex5bqm5LyY5YWI6YGN5Y6G5Zu+XG4gKiBAcGFyYW0gZGF0YSBHcmFwaERhdGEg5Zu+5pWw5o2uXG4gKiBAcGFyYW0gc3RhcnROb2RlSWQg5byA5aeL6YGN5Y6G55qE6IqC54K555qEIElEXG4gKiBAcGFyYW0gb3JpZ2luYWxDYWxsYmFja3Mg5Zue6LCDXG4gKi9cblxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBkZXB0aEZpcnN0U2VhcmNoKGdyYXBoRGF0YSwgc3RhcnROb2RlSWQsIGNhbGxiYWNrcykge1xuICBkZXB0aEZpcnN0U2VhcmNoUmVjdXJzaXZlKGdyYXBoRGF0YSwgc3RhcnROb2RlSWQsICcnLCBpbml0Q2FsbGJhY2tzKGNhbGxiYWNrcykpO1xufSIsImltcG9ydCBkZnMgZnJvbSAnLi9kZnMnO1xuaW1wb3J0IGdldENvbm5lY3RlZENvbXBvbmVudHMsIHsgZGV0ZWN0U3Ryb25nQ29ubmVjdENvbXBvbmVudHMgfSBmcm9tICcuL2Nvbm5lY3RlZC1jb21wb25lbnQnO1xuaW1wb3J0IHsgZ2V0TmVpZ2hib3JzIH0gZnJvbSAnLi91dGlsJztcblxudmFyIGRldGVjdERpcmVjdGVkQ3ljbGUgPSBmdW5jdGlvbiBkZXRlY3REaXJlY3RlZEN5Y2xlKGdyYXBoRGF0YSkge1xuICB2YXIgY3ljbGUgPSBudWxsO1xuICB2YXIgX2EgPSBncmFwaERhdGEubm9kZXMsXG4gICAgICBub2RlcyA9IF9hID09PSB2b2lkIDAgPyBbXSA6IF9hO1xuICB2YXIgZGZzUGFyZW50TWFwID0ge307IC8vIOaJgOacieayoeacieiiq+iuv+mXrueahOiKgueCuembhuWQiFxuXG4gIHZhciB1bnZpc2l0ZWRTZXQgPSB7fTsgLy8g5q2j5Zyo6KKr6K6/6Zeu55qE6IqC54K56ZuG5ZCIXG5cbiAgdmFyIHZpc2l0aW5nU2V0ID0ge307IC8vIOaJgOacieW3sue7j+iiq+iuv+mXrui/h+eahOiKgueCuembhuWQiFxuXG4gIHZhciB2aXNpdGVkU2V0ID0ge307IC8vIOWIneWni+WMliB1bnZpc2l0ZWRTZXRcblxuICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgdW52aXNpdGVkU2V0W25vZGUuaWRdID0gbm9kZTtcbiAgfSk7XG4gIHZhciBjYWxsYmFja3MgPSB7XG4gICAgZW50ZXI6IGZ1bmN0aW9uIGVudGVyKF9hKSB7XG4gICAgICB2YXIgY3VycmVudE5vZGUgPSBfYS5jdXJyZW50LFxuICAgICAgICAgIHByZXZpb3VzTm9kZSA9IF9hLnByZXZpb3VzO1xuXG4gICAgICBpZiAodmlzaXRpbmdTZXRbY3VycmVudE5vZGVdKSB7XG4gICAgICAgIC8vIOWmguaenOW9k+WJjeiKgueCueato+WcqOiuv+mXruS4re+8jOWImeivtOaYjuajgOa1i+WIsOeOr+i3r+S6hlxuICAgICAgICBjeWNsZSA9IHt9O1xuICAgICAgICB2YXIgY3VycmVudEN5Y2xlTm9kZSA9IGN1cnJlbnROb2RlO1xuICAgICAgICB2YXIgcHJldmlvdXNDeWNsZU5vZGUgPSBwcmV2aW91c05vZGU7XG5cbiAgICAgICAgd2hpbGUgKHByZXZpb3VzQ3ljbGVOb2RlICE9PSBjdXJyZW50Tm9kZSkge1xuICAgICAgICAgIGN5Y2xlW2N1cnJlbnRDeWNsZU5vZGVdID0gcHJldmlvdXNDeWNsZU5vZGU7XG4gICAgICAgICAgY3VycmVudEN5Y2xlTm9kZSA9IHByZXZpb3VzQ3ljbGVOb2RlO1xuICAgICAgICAgIHByZXZpb3VzQ3ljbGVOb2RlID0gZGZzUGFyZW50TWFwW3ByZXZpb3VzQ3ljbGVOb2RlXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGN5Y2xlW2N1cnJlbnRDeWNsZU5vZGVdID0gcHJldmlvdXNDeWNsZU5vZGU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyDlpoLmnpzkuI3lrZjlnKjmraPlnKjorr/pl67pm4blkIjkuK3vvIzliJnlsIblhbbmlL7lhaXmraPlnKjorr/pl67pm4blkIjvvIzlubbku47mnKrorr/pl67pm4blkIjkuK3liKDpmaRcbiAgICAgICAgdmlzaXRpbmdTZXRbY3VycmVudE5vZGVdID0gY3VycmVudE5vZGU7XG4gICAgICAgIGRlbGV0ZSB1bnZpc2l0ZWRTZXRbY3VycmVudE5vZGVdOyAvLyDmm7TmlrAgRFNGIHBhcmVudHMg5YiX6KGoXG5cbiAgICAgICAgZGZzUGFyZW50TWFwW2N1cnJlbnROb2RlXSA9IHByZXZpb3VzTm9kZTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGxlYXZlOiBmdW5jdGlvbiBsZWF2ZShfYSkge1xuICAgICAgdmFyIGN1cnJlbnROb2RlID0gX2EuY3VycmVudDsgLy8g5aaC5p6c5omA5pyJ55qE6IqC54K555qE5a2Q6IqC54K56YO95bey57uP6K6/6Zeu6L+H5LqG77yM5YiZ5LuO5q2j5Zyo6K6/6Zeu6ZuG5ZCI5Lit5Yig6Zmk5o6J77yM5bm25bCG5YW256e75YWl5Yiw5bey6K6/6Zeu6ZuG5ZCI5Lit77yMXG4gICAgICAvLyDlkIzml7bkuZ/mhI/lkbPnnYDlvZPliY3oioLngrnnmoTmiYDmnInpgrvlsYXoioLngrnpg73ooqvorr/pl67ov4fkuoZcblxuICAgICAgdmlzaXRlZFNldFtjdXJyZW50Tm9kZV0gPSBjdXJyZW50Tm9kZTtcbiAgICAgIGRlbGV0ZSB2aXNpdGluZ1NldFtjdXJyZW50Tm9kZV07XG4gICAgfSxcbiAgICBhbGxvd1RyYXZlcnNhbDogZnVuY3Rpb24gYWxsb3dUcmF2ZXJzYWwoX2EpIHtcbiAgICAgIHZhciBuZXh0Tm9kZSA9IF9hLm5leHQ7IC8vIOWmguaenOajgOa1i+WIsOeOr+i3r+WImemcgOimgee7iOatouaJgOaciei/m+S4gOatpeeahOmBjeWOhu+8jOWQpuWImeS8muWvvOiHtOaXoOmZkOW+queOr+mBjeWOhlxuXG4gICAgICBpZiAoY3ljbGUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSAvLyDku4XlhYHorrjpgY3ljobmsqHmnInorr/pl67nmoToioLngrnvvIx2aXNpdGVkU2V0IOS4reeahOmDveW3sue7j+iuv+mXrui/h+S6hlxuXG5cbiAgICAgIHJldHVybiAhdmlzaXRlZFNldFtuZXh0Tm9kZV07XG4gICAgfVxuICB9OyAvLyDlvIDlp4vpgY3ljoboioLngrlcblxuICB3aGlsZSAoT2JqZWN0LmtleXModW52aXNpdGVkU2V0KS5sZW5ndGgpIHtcbiAgICAvLyDku47nrKzkuIDkuKroioLngrnlvIDlp4vov5vooYwgREZTIOmBjeWOhlxuICAgIHZhciBmaXJzZXRVblZpc2l0ZWRLZXkgPSBPYmplY3Qua2V5cyh1bnZpc2l0ZWRTZXQpWzBdO1xuICAgIGRmcyhncmFwaERhdGEsIGZpcnNldFVuVmlzaXRlZEtleSwgY2FsbGJhY2tzKTtcbiAgfVxuXG4gIHJldHVybiBjeWNsZTtcbn07XG4vKipcbiAqIOajgOa1i+aXoOWQkeWbvuS4reeahOaJgOaciUJhc2UgY3ljbGVzXG4gKiByZWZlcjogaHR0cHM6Ly93d3cuY29kZXByb2plY3QuY29tL0FydGljbGVzLzExNTgyMzIvRW51bWVyYXRpbmctQWxsLUN5Y2xlcy1pbi1hbi1VbmRpcmVjdGVkLUdyYXBoXG4gKiBAcGFyYW0gZ3JhcGhcbiAqIEBwYXJhbSBub2RlSWRzIOiKgueCuSBJRCDnmoTmlbDnu4RcbiAqIEBwYXJhbSBpbmNsdWRlIOWMheWQq+aIluaOkumZpOaMh+WumueahOiKgueCuVxuICogQHJldHVybiBbe1trZXk6IHN0cmluZ106IElOb2RlfV0g6L+U5Zue5LiA57uEYmFzZSBjeWNsZXNcbiAqL1xuXG5cbmV4cG9ydCB2YXIgZGV0ZWN0QWxsVW5kaXJlY3RlZEN5Y2xlID0gZnVuY3Rpb24gZGV0ZWN0QWxsVW5kaXJlY3RlZEN5Y2xlKGdyYXBoRGF0YSwgbm9kZUlkcywgaW5jbHVkZSkge1xuICB2YXIgX2EsIF9iO1xuXG4gIGlmIChpbmNsdWRlID09PSB2b2lkIDApIHtcbiAgICBpbmNsdWRlID0gdHJ1ZTtcbiAgfVxuXG4gIHZhciBhbGxDeWNsZXMgPSBbXTtcbiAgdmFyIGNvbXBvbmVudHMgPSBnZXRDb25uZWN0ZWRDb21wb25lbnRzKGdyYXBoRGF0YSwgZmFsc2UpOyAvLyBsb29wIHRocm91Z2ggYWxsIGNvbm5lY3RlZCBjb21wb25lbnRzXG5cbiAgZm9yICh2YXIgX2kgPSAwLCBjb21wb25lbnRzXzEgPSBjb21wb25lbnRzOyBfaSA8IGNvbXBvbmVudHNfMS5sZW5ndGg7IF9pKyspIHtcbiAgICB2YXIgY29tcG9uZW50ID0gY29tcG9uZW50c18xW19pXTtcbiAgICBpZiAoIWNvbXBvbmVudC5sZW5ndGgpIGNvbnRpbnVlO1xuICAgIHZhciByb290ID0gY29tcG9uZW50WzBdO1xuICAgIHZhciByb290SWQgPSByb290LmlkO1xuICAgIHZhciBzdGFjayA9IFtyb290XTtcbiAgICB2YXIgcGFyZW50XzEgPSAoX2EgPSB7fSwgX2Fbcm9vdElkXSA9IHJvb3QsIF9hKTtcbiAgICB2YXIgdXNlZCA9IChfYiA9IHt9LCBfYltyb290SWRdID0gbmV3IFNldCgpLCBfYik7IC8vIHdhbGsgYSBzcGFubmluZyB0cmVlIHRvIGZpbmQgY3ljbGVzXG5cbiAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCkge1xuICAgICAgdmFyIGN1ck5vZGUgPSBzdGFjay5wb3AoKTtcbiAgICAgIHZhciBjdXJOb2RlSWQgPSBjdXJOb2RlLmlkO1xuICAgICAgdmFyIG5laWdoYm9ycyA9IGdldE5laWdoYm9ycyhjdXJOb2RlSWQsIGdyYXBoRGF0YS5lZGdlcyk7XG5cbiAgICAgIHZhciBfbG9vcF8xID0gZnVuY3Rpb24gX2xvb3BfMShpKSB7XG4gICAgICAgIHZhciBfYztcblxuICAgICAgICB2YXIgbmVpZ2hib3JJZCA9IG5laWdoYm9yc1tpXTtcbiAgICAgICAgdmFyIG5laWdoYm9yID0gZ3JhcGhEYXRhLm5vZGVzLmZpbmQoZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgICByZXR1cm4gbm9kZS5pZCA9PT0gbmVpZ2hib3JJZDtcbiAgICAgICAgfSk7IC8vIGNvbnN0IG5laWdoYm9ySWQgPSBuZWlnaGJvci5nZXQoJ2lkJyk7XG5cbiAgICAgICAgaWYgKG5laWdoYm9ySWQgPT09IGN1ck5vZGVJZCkge1xuICAgICAgICAgIC8vIOiHqueOr1xuICAgICAgICAgIGFsbEN5Y2xlcy5wdXNoKChfYyA9IHt9LCBfY1tuZWlnaGJvcklkXSA9IGN1ck5vZGUsIF9jKSk7XG4gICAgICAgIH0gZWxzZSBpZiAoIShuZWlnaGJvcklkIGluIHVzZWQpKSB7XG4gICAgICAgICAgLy8gdmlzaXQgYSBuZXcgbm9kZVxuICAgICAgICAgIHBhcmVudF8xW25laWdoYm9ySWRdID0gY3VyTm9kZTtcbiAgICAgICAgICBzdGFjay5wdXNoKG5laWdoYm9yKTtcbiAgICAgICAgICB1c2VkW25laWdoYm9ySWRdID0gbmV3IFNldChbY3VyTm9kZV0pO1xuICAgICAgICB9IGVsc2UgaWYgKCF1c2VkW2N1ck5vZGVJZF0uaGFzKG5laWdoYm9yKSkge1xuICAgICAgICAgIC8vIGEgY3ljbGUgZm91bmRcbiAgICAgICAgICB2YXIgY3ljbGVWYWxpZCA9IHRydWU7XG4gICAgICAgICAgdmFyIGN5Y2xlUGF0aCA9IFtuZWlnaGJvciwgY3VyTm9kZV07XG4gICAgICAgICAgdmFyIHAgPSBwYXJlbnRfMVtjdXJOb2RlSWRdO1xuXG4gICAgICAgICAgd2hpbGUgKHVzZWRbbmVpZ2hib3JJZF0uc2l6ZSAmJiAhdXNlZFtuZWlnaGJvcklkXS5oYXMocCkpIHtcbiAgICAgICAgICAgIGN5Y2xlUGF0aC5wdXNoKHApO1xuICAgICAgICAgICAgaWYgKHAgPT09IHBhcmVudF8xW3AuaWRdKSBicmVhaztlbHNlIHAgPSBwYXJlbnRfMVtwLmlkXTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjeWNsZVBhdGgucHVzaChwKTtcblxuICAgICAgICAgIGlmIChub2RlSWRzICYmIGluY2x1ZGUpIHtcbiAgICAgICAgICAgIC8vIOWmguaenOacieaMh+WumuWMheWQq+eahOiKgueCuVxuICAgICAgICAgICAgY3ljbGVWYWxpZCA9IGZhbHNlO1xuXG4gICAgICAgICAgICBpZiAoY3ljbGVQYXRoLmZpbmRJbmRleChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICAgICAgICByZXR1cm4gbm9kZUlkcy5pbmRleE9mKG5vZGUuaWQpID4gLTE7XG4gICAgICAgICAgICB9KSA+IC0xKSB7XG4gICAgICAgICAgICAgIGN5Y2xlVmFsaWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAobm9kZUlkcyAmJiAhaW5jbHVkZSkge1xuICAgICAgICAgICAgLy8g5aaC5p6c5pyJ5oyH5a6a5LiN5YyF5ZCr55qE6IqC54K5XG4gICAgICAgICAgICBpZiAoY3ljbGVQYXRoLmZpbmRJbmRleChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICAgICAgICByZXR1cm4gbm9kZUlkcy5pbmRleE9mKG5vZGUuaWQpID4gLTE7XG4gICAgICAgICAgICB9KSA+IC0xKSB7XG4gICAgICAgICAgICAgIGN5Y2xlVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IC8vIOaKiiBub2RlIGxpc3Qg5b2i5byP6L2s5o2i5Li6IGN5Y2xlIOeahOagvOW8j1xuXG5cbiAgICAgICAgICBpZiAoY3ljbGVWYWxpZCkge1xuICAgICAgICAgICAgdmFyIGN5Y2xlID0ge307XG5cbiAgICAgICAgICAgIGZvciAodmFyIGluZGV4ID0gMTsgaW5kZXggPCBjeWNsZVBhdGgubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgICAgICAgICAgIGN5Y2xlW2N5Y2xlUGF0aFtpbmRleCAtIDFdLmlkXSA9IGN5Y2xlUGF0aFtpbmRleF07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjeWNsZVBhdGgubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIGN5Y2xlW2N5Y2xlUGF0aFtjeWNsZVBhdGgubGVuZ3RoIC0gMV0uaWRdID0gY3ljbGVQYXRoWzBdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBhbGxDeWNsZXMucHVzaChjeWNsZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdXNlZFtuZWlnaGJvcklkXS5hZGQoY3VyTm9kZSk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmVpZ2hib3JzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIF9sb29wXzEoaSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGFsbEN5Y2xlcztcbn07XG4vKipcbiAqIEpvaG5zb24ncyBhbGdvcml0aG0sIOaXtumXtOWkjeadguW6piBPKChWICsgRSkoQyArIDEpKSQgYW5kIHNwYWNlIGJvdW5kZWQgYnkgTyhWICsgRSlcbiAqIHJlZmVyOiBodHRwczovL3d3dy5jcy50dWZ0cy5lZHUvY29tcC8xNTBHQS9ob21ld29ya3MvaHcxL0pvaG5zb24lMjA3NS5QREZcbiAqIHJlZmVyOiBodHRwczovL25ldHdvcmt4LmdpdGh1Yi5pby9kb2N1bWVudGF0aW9uL3N0YWJsZS9fbW9kdWxlcy9uZXR3b3JreC9hbGdvcml0aG1zL2N5Y2xlcy5odG1sI3NpbXBsZV9jeWNsZXNcbiAqIEBwYXJhbSBncmFwaFxuICogQHBhcmFtIG5vZGVJZHMg6IqC54K5IElEIOeahOaVsOe7hFxuICogQHBhcmFtIGluY2x1ZGUg5YyF5ZCr5oiW5o6S6Zmk5oyH5a6a55qE6IqC54K5XG4gKiBAcmV0dXJuIFt7W2tleTogc3RyaW5nXTogSU5vZGV9XSDov5Tlm57miYDmnInnmoQgc2ltcGxlIGN5Y2xlc1xuICovXG5cbmV4cG9ydCB2YXIgZGV0ZWN0QWxsRGlyZWN0ZWRDeWNsZSA9IGZ1bmN0aW9uIGRldGVjdEFsbERpcmVjdGVkQ3ljbGUoZ3JhcGhEYXRhLCBub2RlSWRzLCBpbmNsdWRlKSB7XG4gIGlmIChpbmNsdWRlID09PSB2b2lkIDApIHtcbiAgICBpbmNsdWRlID0gdHJ1ZTtcbiAgfVxuXG4gIHZhciBwYXRoID0gW107IC8vIHN0YWNrIG9mIG5vZGVzIGluIGN1cnJlbnQgcGF0aFxuXG4gIHZhciBibG9ja2VkID0gbmV3IFNldCgpO1xuICB2YXIgQiA9IFtdOyAvLyByZW1lbWJlciBwb3J0aW9ucyBvZiB0aGUgZ3JhcGggdGhhdCB5aWVsZCBubyBlbGVtZW50YXJ5IGNpcmN1aXRcblxuICB2YXIgYWxsQ3ljbGVzID0gW107XG4gIHZhciBpZHgyTm9kZSA9IHt9O1xuICB2YXIgbm9kZTJJZHggPSB7fTsgLy8g6L6F5Yqp5Ye95pWw77yaIHVuYmxvY2sgYWxsIGJsb2NrZWQgbm9kZXNcblxuICB2YXIgdW5ibG9jayA9IGZ1bmN0aW9uIHVuYmxvY2sodGhpc05vZGUpIHtcbiAgICB2YXIgc3RhY2sgPSBbdGhpc05vZGVdO1xuXG4gICAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICAgIHZhciBub2RlID0gc3RhY2sucG9wKCk7XG5cbiAgICAgIGlmIChibG9ja2VkLmhhcyhub2RlKSkge1xuICAgICAgICBibG9ja2VkLmRlbGV0ZShub2RlKTtcbiAgICAgICAgQltub2RlLmlkXS5mb3JFYWNoKGZ1bmN0aW9uIChuKSB7XG4gICAgICAgICAgc3RhY2sucHVzaChuKTtcbiAgICAgICAgfSk7XG4gICAgICAgIEJbbm9kZS5pZF0uY2xlYXIoKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgdmFyIGNpcmN1aXQgPSBmdW5jdGlvbiBjaXJjdWl0KG5vZGUsIHN0YXJ0LCBhZGpMaXN0KSB7XG4gICAgdmFyIGNsb3NlZCA9IGZhbHNlOyAvLyB3aGV0aGVyIGEgcGF0aCBpcyBjbG9zZWRcblxuICAgIGlmIChub2RlSWRzICYmIGluY2x1ZGUgPT09IGZhbHNlICYmIG5vZGVJZHMuaW5kZXhPZihub2RlLmlkKSA+IC0xKSByZXR1cm4gY2xvc2VkO1xuICAgIHBhdGgucHVzaChub2RlKTtcbiAgICBibG9ja2VkLmFkZChub2RlKTtcbiAgICB2YXIgbmVpZ2hib3JzID0gYWRqTGlzdFtub2RlLmlkXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmVpZ2hib3JzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICB2YXIgbmVpZ2hib3IgPSBpZHgyTm9kZVtuZWlnaGJvcnNbaV1dO1xuXG4gICAgICBpZiAobmVpZ2hib3IgPT09IHN0YXJ0KSB7XG4gICAgICAgIHZhciBjeWNsZSA9IHt9O1xuXG4gICAgICAgIGZvciAodmFyIGluZGV4ID0gMTsgaW5kZXggPCBwYXRoLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgICAgIGN5Y2xlW3BhdGhbaW5kZXggLSAxXS5pZF0gPSBwYXRoW2luZGV4XTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXRoLmxlbmd0aCkge1xuICAgICAgICAgIGN5Y2xlW3BhdGhbcGF0aC5sZW5ndGggLSAxXS5pZF0gPSBwYXRoWzBdO1xuICAgICAgICB9XG5cbiAgICAgICAgYWxsQ3ljbGVzLnB1c2goY3ljbGUpO1xuICAgICAgICBjbG9zZWQgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmICghYmxvY2tlZC5oYXMobmVpZ2hib3IpKSB7XG4gICAgICAgIGlmIChjaXJjdWl0KG5laWdoYm9yLCBzdGFydCwgYWRqTGlzdCkpIHtcbiAgICAgICAgICBjbG9zZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNsb3NlZCkge1xuICAgICAgdW5ibG9jayhub2RlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuZWlnaGJvcnMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgdmFyIG5laWdoYm9yID0gaWR4Mk5vZGVbbmVpZ2hib3JzW2ldXTtcblxuICAgICAgICBpZiAoIUJbbmVpZ2hib3IuaWRdLmhhcyhub2RlKSkge1xuICAgICAgICAgIEJbbmVpZ2hib3IuaWRdLmFkZChub2RlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHBhdGgucG9wKCk7XG4gICAgcmV0dXJuIGNsb3NlZDtcbiAgfTtcblxuICB2YXIgX2EgPSBncmFwaERhdGEubm9kZXMsXG4gICAgICBub2RlcyA9IF9hID09PSB2b2lkIDAgPyBbXSA6IF9hOyAvLyBKb2huc29uJ3MgYWxnb3JpdGhtIOimgeaxgue7meiKgueCuei1i+mhuuW6j++8jOWFiOaMieiKgueCueWcqOaVsOe7hOS4reeahOmhuuW6j1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICB2YXIgbm9kZSA9IG5vZGVzW2ldO1xuICAgIHZhciBub2RlSWQgPSBub2RlLmlkO1xuICAgIG5vZGUySWR4W25vZGVJZF0gPSBpO1xuICAgIGlkeDJOb2RlW2ldID0gbm9kZTtcbiAgfSAvLyDlpoLmnpzmnInmjIflrprljIXlkKvnmoToioLngrnvvIzliJnmiormjIflrproioLngrnmjpLluo/lnKjliY3vvIzku6Xkvr/mj5Dml6nnu5PmnZ/mkJzntKJcblxuXG4gIGlmIChub2RlSWRzICYmIGluY2x1ZGUpIHtcbiAgICB2YXIgX2xvb3BfMiA9IGZ1bmN0aW9uIF9sb29wXzIoaSkge1xuICAgICAgdmFyIG5vZGVJZCA9IG5vZGVJZHNbaV07XG4gICAgICBub2RlMklkeFtub2Rlc1tpXS5pZF0gPSBub2RlMklkeFtub2RlSWRdO1xuICAgICAgbm9kZTJJZHhbbm9kZUlkXSA9IDA7XG4gICAgICBpZHgyTm9kZVswXSA9IG5vZGVzLmZpbmQoZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUuaWQgPT09IG5vZGVJZDtcbiAgICAgIH0pO1xuICAgICAgaWR4Mk5vZGVbbm9kZTJJZHhbbm9kZXNbaV0uaWRdXSA9IG5vZGVzW2ldO1xuICAgIH07XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVJZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIF9sb29wXzIoaSk7XG4gICAgfVxuICB9IC8vIOi/lOWbniDoioLngrnpobrluo8gPj0gbm9kZU9yZGVyIOeahOW8uui/numAmuWIhumHj+eahGFkakxpc3RcblxuXG4gIHZhciBnZXRNaW5Db21wb25lbnRBZGogPSBmdW5jdGlvbiBnZXRNaW5Db21wb25lbnRBZGooY29tcG9uZW50cykge1xuICAgIHZhciBfYTtcblxuICAgIHZhciBtaW5Db21wSWR4O1xuICAgIHZhciBtaW5JZHggPSBJbmZpbml0eTsgLy8gRmluZCBsZWFzdCBjb21wb25lbnQgYW5kIHRoZSBsb3dlc3Qgbm9kZVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb21wb25lbnRzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICB2YXIgY29tcCA9IGNvbXBvbmVudHNbaV07XG5cbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgY29tcC5sZW5ndGg7IGorKykge1xuICAgICAgICB2YXIgbm9kZUlkeF8xID0gbm9kZTJJZHhbY29tcFtqXS5pZF07XG5cbiAgICAgICAgaWYgKG5vZGVJZHhfMSA8IG1pbklkeCkge1xuICAgICAgICAgIG1pbklkeCA9IG5vZGVJZHhfMTtcbiAgICAgICAgICBtaW5Db21wSWR4ID0gaTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBjb21wb25lbnQgPSBjb21wb25lbnRzW21pbkNvbXBJZHhdO1xuICAgIHZhciBhZGpMaXN0ID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbXBvbmVudC5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgdmFyIG5vZGUgPSBjb21wb25lbnRbaV07XG4gICAgICBhZGpMaXN0W25vZGUuaWRdID0gW107XG5cbiAgICAgIGZvciAodmFyIF9pID0gMCwgX2IgPSBnZXROZWlnaGJvcnMobm9kZS5pZCwgZ3JhcGhEYXRhLmVkZ2VzLCAndGFyZ2V0JykuZmlsdGVyKGZ1bmN0aW9uIChuKSB7XG4gICAgICAgIHJldHVybiBjb21wb25lbnQubWFwKGZ1bmN0aW9uIChjKSB7XG4gICAgICAgICAgcmV0dXJuIGMuaWQ7XG4gICAgICAgIH0pLmluZGV4T2YobikgPiAtMTtcbiAgICAgIH0pOyBfaSA8IF9iLmxlbmd0aDsgX2krKykge1xuICAgICAgICB2YXIgbmVpZ2hib3IgPSBfYltfaV07IC8vIOWvueiHqueOr+aDheWGtSAo54K56L+e5ZCR6Ieq6LqrKSDnibnmrorlpITnkIbvvJrorrDlvZXoh6rnjq/vvIzkvYbkuI3liqDlhaVhZGpMaXN0XG5cbiAgICAgICAgaWYgKG5laWdoYm9yID09PSBub2RlLmlkICYmICEoaW5jbHVkZSA9PT0gZmFsc2UgJiYgbm9kZUlkcy5pbmRleE9mKG5vZGUuaWQpID4gLTEpKSB7XG4gICAgICAgICAgYWxsQ3ljbGVzLnB1c2goKF9hID0ge30sIF9hW25vZGUuaWRdID0gbm9kZSwgX2EpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhZGpMaXN0W25vZGUuaWRdLnB1c2gobm9kZTJJZHhbbmVpZ2hib3JdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBjb21wb25lbnQ6IGNvbXBvbmVudCxcbiAgICAgIGFkakxpc3Q6IGFkakxpc3QsXG4gICAgICBtaW5JZHg6IG1pbklkeFxuICAgIH07XG4gIH07XG5cbiAgdmFyIG5vZGVJZHggPSAwO1xuXG4gIHdoaWxlIChub2RlSWR4IDwgbm9kZXMubGVuZ3RoKSB7XG4gICAgdmFyIHN1YmdyYXBoTm9kZXMgPSBub2Rlcy5maWx0ZXIoZnVuY3Rpb24gKG4pIHtcbiAgICAgIHJldHVybiBub2RlMklkeFtuLmlkXSA+PSBub2RlSWR4O1xuICAgIH0pO1xuICAgIHZhciBzY2NzID0gZGV0ZWN0U3Ryb25nQ29ubmVjdENvbXBvbmVudHMoe1xuICAgICAgbm9kZXM6IHN1YmdyYXBoTm9kZXMsXG4gICAgICBlZGdlczogZ3JhcGhEYXRhLmVkZ2VzXG4gICAgfSkuZmlsdGVyKGZ1bmN0aW9uIChjb21wb25lbnQpIHtcbiAgICAgIHJldHVybiBjb21wb25lbnQubGVuZ3RoID4gMTtcbiAgICB9KTtcbiAgICBpZiAoc2Njcy5sZW5ndGggPT09IDApIGJyZWFrO1xuICAgIHZhciBzY2MgPSBnZXRNaW5Db21wb25lbnRBZGooc2Njcyk7XG4gICAgdmFyIG1pbklkeCA9IHNjYy5taW5JZHgsXG4gICAgICAgIGFkakxpc3QgPSBzY2MuYWRqTGlzdCxcbiAgICAgICAgY29tcG9uZW50ID0gc2NjLmNvbXBvbmVudDtcblxuICAgIGlmIChjb21wb25lbnQubGVuZ3RoID4gMSkge1xuICAgICAgY29tcG9uZW50LmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgQltub2RlLmlkXSA9IG5ldyBTZXQoKTtcbiAgICAgIH0pO1xuICAgICAgdmFyIHN0YXJ0Tm9kZSA9IGlkeDJOb2RlW21pbklkeF07IC8vIHN0YXJ0Tm9kZSDkuI3lnKjmjIflrpropoHljIXlkKvnmoToioLngrnkuK3vvIzmj5DliY3nu5PmnZ/mkJzntKJcblxuICAgICAgaWYgKG5vZGVJZHMgJiYgaW5jbHVkZSAmJiBub2RlSWRzLmluZGV4T2Yoc3RhcnROb2RlLmlkKSA9PT0gLTEpIHJldHVybiBhbGxDeWNsZXM7XG4gICAgICBjaXJjdWl0KHN0YXJ0Tm9kZSwgc3RhcnROb2RlLCBhZGpMaXN0KTtcbiAgICAgIG5vZGVJZHggPSBtaW5JZHggKyAxO1xuICAgIH0gZWxzZSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYWxsQ3ljbGVzO1xufTtcbi8qKlxuICog5p+l5om+5Zu+5Lit5omA5pyJ5ruh6Laz6KaB5rGC55qE5ZyIXG4gKiBAcGFyYW0gZ3JhcGhcbiAqIEBwYXJhbSBkaXJlY3RlZCDmmK/lkKbkuLrmnInlkJHlm75cbiAqIEBwYXJhbSBub2RlSWRzIOiKgueCuSBJRCDnmoTmlbDnu4TvvIzoi6XkuI3mjIflrprvvIzliJnov5Tlm57lm77kuK3miYDmnInnmoTlnIhcbiAqIEBwYXJhbSBpbmNsdWRlIOWMheWQq+aIluaOkumZpOaMh+WumueahOiKgueCuVxuICogQHJldHVybiBbe1trZXk6IHN0cmluZ106IE5vZGV9XSDljIXlkKvmiYDmnInnjq/nmoTmlbDnu4TvvIzmr4/kuKrnjq/nlKjkuIDkuKpPYmplY3TooajnpLrvvIzlhbbkuK1rZXnkuLroioLngrlpZO+8jHZhbHVl5Li66K+l6IqC54K55Zyo546v5Lit5oyH5ZCR55qE5LiL5LiA5Liq6IqC54K5XG4gKi9cblxuZXhwb3J0IHZhciBkZXRlY3RBbGxDeWNsZXMgPSBmdW5jdGlvbiBkZXRlY3RBbGxDeWNsZXMoZ3JhcGhEYXRhLCBkaXJlY3RlZCwgbm9kZUlkcywgaW5jbHVkZSkge1xuICBpZiAoaW5jbHVkZSA9PT0gdm9pZCAwKSB7XG4gICAgaW5jbHVkZSA9IHRydWU7XG4gIH1cblxuICBpZiAoZGlyZWN0ZWQpIHJldHVybiBkZXRlY3RBbGxEaXJlY3RlZEN5Y2xlKGdyYXBoRGF0YSwgbm9kZUlkcywgaW5jbHVkZSk7XG4gIHJldHVybiBkZXRlY3RBbGxVbmRpcmVjdGVkQ3ljbGUoZ3JhcGhEYXRhLCBub2RlSWRzLCBpbmNsdWRlKTtcbn07XG5leHBvcnQgZGVmYXVsdCBkZXRlY3REaXJlY3RlZEN5Y2xlOyIsImltcG9ydCB7IF9fc3ByZWFkQXJyYXkgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGlzQXJyYXkgfSBmcm9tICdAYW50di91dGlsJztcbmltcG9ydCB7IGdldE91dEVkZ2VzTm9kZUlkLCBnZXRFZGdlc0J5Tm9kZUlkIH0gZnJvbSAnLi91dGlsJztcblxudmFyIG1pblZlcnRleCA9IGZ1bmN0aW9uIG1pblZlcnRleChELCBub2RlcywgbWFya3MpIHtcbiAgLy8g5om+5Ye65pyA5bCP55qE54K5XG4gIHZhciBtaW5EaXMgPSBJbmZpbml0eTtcbiAgdmFyIG1pbk5vZGU7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBub2RlSWQgPSBub2Rlc1tpXS5pZDtcblxuICAgIGlmICghbWFya3Nbbm9kZUlkXSAmJiBEW25vZGVJZF0gPD0gbWluRGlzKSB7XG4gICAgICBtaW5EaXMgPSBEW25vZGVJZF07XG4gICAgICBtaW5Ob2RlID0gbm9kZXNbaV07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG1pbk5vZGU7XG59O1xuXG52YXIgZGlqa3N0cmEgPSBmdW5jdGlvbiBkaWprc3RyYShncmFwaERhdGEsIHNvdXJjZSwgZGlyZWN0ZWQsIHdlaWdodFByb3BlcnR5TmFtZSkge1xuICB2YXIgX2EgPSBncmFwaERhdGEubm9kZXMsXG4gICAgICBub2RlcyA9IF9hID09PSB2b2lkIDAgPyBbXSA6IF9hLFxuICAgICAgX2IgPSBncmFwaERhdGEuZWRnZXMsXG4gICAgICBlZGdlcyA9IF9iID09PSB2b2lkIDAgPyBbXSA6IF9iO1xuICB2YXIgbm9kZUlkcyA9IFtdO1xuICB2YXIgbWFya3MgPSB7fTtcbiAgdmFyIEQgPSB7fTtcbiAgdmFyIHByZXZzID0ge307IC8vIGtleTog6aG254K5LCB2YWx1ZTog6aG254K555qE5YmN6amx54K55pWw57uE77yI5Y+v6IO95pyJ5aSa5p2h562J6ZW/55qE5pyA55+t6Lev5b6E77yJXG5cbiAgbm9kZXMuZm9yRWFjaChmdW5jdGlvbiAobm9kZSwgaSkge1xuICAgIHZhciBpZCA9IG5vZGUuaWQ7XG4gICAgbm9kZUlkcy5wdXNoKGlkKTtcbiAgICBEW2lkXSA9IEluZmluaXR5O1xuICAgIGlmIChpZCA9PT0gc291cmNlKSBEW2lkXSA9IDA7XG4gIH0pO1xuICB2YXIgbm9kZU51bSA9IG5vZGVzLmxlbmd0aDtcblxuICB2YXIgX2xvb3BfMSA9IGZ1bmN0aW9uIF9sb29wXzEoaSkge1xuICAgIC8vIFByb2Nlc3MgdGhlIHZlcnRpY2VzXG4gICAgdmFyIG1pbk5vZGUgPSBtaW5WZXJ0ZXgoRCwgbm9kZXMsIG1hcmtzKTtcbiAgICB2YXIgbWluTm9kZUlkID0gbWluTm9kZS5pZDtcbiAgICBtYXJrc1ttaW5Ob2RlSWRdID0gdHJ1ZTtcbiAgICBpZiAoRFttaW5Ob2RlSWRdID09PSBJbmZpbml0eSkgcmV0dXJuIFwiY29udGludWVcIjsgLy8gVW5yZWFjaGFibGUgdmVydGljZXMgY2Fubm90IGJlIHRoZSBpbnRlcm1lZGlhdGUgcG9pbnRcblxuICAgIHZhciByZWxhdGVkRWRnZXMgPSBbXTtcbiAgICBpZiAoZGlyZWN0ZWQpIHJlbGF0ZWRFZGdlcyA9IGdldE91dEVkZ2VzTm9kZUlkKG1pbk5vZGVJZCwgZWRnZXMpO2Vsc2UgcmVsYXRlZEVkZ2VzID0gZ2V0RWRnZXNCeU5vZGVJZChtaW5Ob2RlSWQsIGVkZ2VzKTtcbiAgICByZWxhdGVkRWRnZXMuZm9yRWFjaChmdW5jdGlvbiAoZWRnZSkge1xuICAgICAgdmFyIGVkZ2VUYXJnZXQgPSBlZGdlLnRhcmdldDtcbiAgICAgIHZhciBlZGdlU291cmNlID0gZWRnZS5zb3VyY2U7XG4gICAgICB2YXIgdyA9IGVkZ2VUYXJnZXQgPT09IG1pbk5vZGVJZCA/IGVkZ2VTb3VyY2UgOiBlZGdlVGFyZ2V0O1xuICAgICAgdmFyIHdlaWdodCA9IHdlaWdodFByb3BlcnR5TmFtZSAmJiBlZGdlW3dlaWdodFByb3BlcnR5TmFtZV0gPyBlZGdlW3dlaWdodFByb3BlcnR5TmFtZV0gOiAxO1xuXG4gICAgICBpZiAoRFt3XSA+IERbbWluTm9kZS5pZF0gKyB3ZWlnaHQpIHtcbiAgICAgICAgRFt3XSA9IERbbWluTm9kZS5pZF0gKyB3ZWlnaHQ7XG4gICAgICAgIHByZXZzW3ddID0gW21pbk5vZGUuaWRdO1xuICAgICAgfSBlbHNlIGlmIChEW3ddID09PSBEW21pbk5vZGUuaWRdICsgd2VpZ2h0KSB7XG4gICAgICAgIHByZXZzW3ddLnB1c2gobWluTm9kZS5pZCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlTnVtOyBpKyspIHtcbiAgICBfbG9vcF8xKGkpO1xuICB9XG5cbiAgcHJldnNbc291cmNlXSA9IFtzb3VyY2VdOyAvLyDmr4/kuKroioLngrnlrZjlj6/og73lrZjlnKjlpJrmnaHmnIDnn63ot6/lvoRcblxuICB2YXIgcGF0aHMgPSB7fTtcblxuICBmb3IgKHZhciB0YXJnZXQgaW4gRCkge1xuICAgIGlmIChEW3RhcmdldF0gIT09IEluZmluaXR5KSB7XG4gICAgICBmaW5kQWxsUGF0aHMoc291cmNlLCB0YXJnZXQsIHByZXZzLCBwYXRocyk7XG4gICAgfVxuICB9IC8vIOWFvOWuueS5i+WJjeWNlei3r+W+hFxuXG5cbiAgdmFyIHBhdGggPSB7fTtcblxuICBmb3IgKHZhciB0YXJnZXQgaW4gcGF0aHMpIHtcbiAgICBwYXRoW3RhcmdldF0gPSBwYXRoc1t0YXJnZXRdWzBdO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBsZW5ndGg6IEQsXG4gICAgcGF0aDogcGF0aCxcbiAgICBhbGxQYXRoOiBwYXRoc1xuICB9O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgZGlqa3N0cmE7XG5cbmZ1bmN0aW9uIGZpbmRBbGxQYXRocyhzb3VyY2UsIHRhcmdldCwgcHJldnMsIGZvdW5kUGF0aHMpIHtcbiAgaWYgKHNvdXJjZSA9PT0gdGFyZ2V0KSB7XG4gICAgcmV0dXJuIFtzb3VyY2VdO1xuICB9XG5cbiAgaWYgKGZvdW5kUGF0aHNbdGFyZ2V0XSkge1xuICAgIHJldHVybiBmb3VuZFBhdGhzW3RhcmdldF07XG4gIH1cblxuICB2YXIgcGF0aHMgPSBbXTtcblxuICBmb3IgKHZhciBfaSA9IDAsIF9hID0gcHJldnNbdGFyZ2V0XTsgX2kgPCBfYS5sZW5ndGg7IF9pKyspIHtcbiAgICB2YXIgcHJldiA9IF9hW19pXTtcbiAgICB2YXIgcHJldlBhdGhzID0gZmluZEFsbFBhdGhzKHNvdXJjZSwgcHJldiwgcHJldnMsIGZvdW5kUGF0aHMpO1xuICAgIGlmICghcHJldlBhdGhzKSByZXR1cm47XG5cbiAgICBmb3IgKHZhciBfYiA9IDAsIHByZXZQYXRoc18xID0gcHJldlBhdGhzOyBfYiA8IHByZXZQYXRoc18xLmxlbmd0aDsgX2IrKykge1xuICAgICAgdmFyIHByZVBhdGggPSBwcmV2UGF0aHNfMVtfYl07XG4gICAgICBpZiAoaXNBcnJheShwcmVQYXRoKSkgcGF0aHMucHVzaChfX3NwcmVhZEFycmF5KF9fc3ByZWFkQXJyYXkoW10sIHByZVBhdGgpLCBbdGFyZ2V0XSkpO2Vsc2UgcGF0aHMucHVzaChbcHJlUGF0aCwgdGFyZ2V0XSk7XG4gICAgfVxuICB9XG5cbiAgZm91bmRQYXRoc1t0YXJnZXRdID0gcGF0aHM7XG4gIHJldHVybiBmb3VuZFBhdGhzW3RhcmdldF07XG59IiwiaW1wb3J0IGRpamtzdHJhIGZyb20gJy4vZGlqa3N0cmEnO1xuaW1wb3J0IHsgZ2V0TmVpZ2hib3JzIH0gZnJvbSAnLi91dGlsJztcbmV4cG9ydCB2YXIgZmluZFNob3J0ZXN0UGF0aCA9IGZ1bmN0aW9uIGZpbmRTaG9ydGVzdFBhdGgoZ3JhcGhEYXRhLCBzdGFydCwgZW5kLCBkaXJlY3RlZCwgd2VpZ2h0UHJvcGVydHlOYW1lKSB7XG4gIHZhciBfYSA9IGRpamtzdHJhKGdyYXBoRGF0YSwgc3RhcnQsIGRpcmVjdGVkLCB3ZWlnaHRQcm9wZXJ0eU5hbWUpLFxuICAgICAgbGVuZ3RoID0gX2EubGVuZ3RoLFxuICAgICAgcGF0aCA9IF9hLnBhdGgsXG4gICAgICBhbGxQYXRoID0gX2EuYWxsUGF0aDtcblxuICByZXR1cm4ge1xuICAgIGxlbmd0aDogbGVuZ3RoW2VuZF0sXG4gICAgcGF0aDogcGF0aFtlbmRdLFxuICAgIGFsbFBhdGg6IGFsbFBhdGhbZW5kXVxuICB9O1xufTtcbmV4cG9ydCB2YXIgZmluZEFsbFBhdGggPSBmdW5jdGlvbiBmaW5kQWxsUGF0aChncmFwaERhdGEsIHN0YXJ0LCBlbmQsIGRpcmVjdGVkKSB7XG4gIHZhciBfYTtcblxuICBpZiAoc3RhcnQgPT09IGVuZCkgcmV0dXJuIFtbc3RhcnRdXTtcbiAgdmFyIF9iID0gZ3JhcGhEYXRhLmVkZ2VzLFxuICAgICAgZWRnZXMgPSBfYiA9PT0gdm9pZCAwID8gW10gOiBfYjtcbiAgdmFyIHZpc2l0ZWQgPSBbc3RhcnRdO1xuICB2YXIgaXNWaXNpdGVkID0gKF9hID0ge30sIF9hW3N0YXJ0XSA9IHRydWUsIF9hKTtcbiAgdmFyIHN0YWNrID0gW107IC8vIOi+heWKqeagiO+8jOeUqOS6juWtmOWCqOiuv+mXrui/h+eahOiKgueCueeahOmCu+WxheiKgueCuVxuXG4gIHZhciBhbGxQYXRoID0gW107XG4gIHZhciBuZWlnaGJvcnMgPSBkaXJlY3RlZCA/IGdldE5laWdoYm9ycyhzdGFydCwgZWRnZXMsICd0YXJnZXQnKSA6IGdldE5laWdoYm9ycyhzdGFydCwgZWRnZXMpO1xuICBzdGFjay5wdXNoKG5laWdoYm9ycyk7XG5cbiAgd2hpbGUgKHZpc2l0ZWQubGVuZ3RoID4gMCAmJiBzdGFjay5sZW5ndGggPiAwKSB7XG4gICAgdmFyIGNoaWxkcmVuID0gc3RhY2tbc3RhY2subGVuZ3RoIC0gMV07XG5cbiAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICB2YXIgY2hpbGQgPSBjaGlsZHJlbi5zaGlmdCgpO1xuXG4gICAgICBpZiAoY2hpbGQpIHtcbiAgICAgICAgdmlzaXRlZC5wdXNoKGNoaWxkKTtcbiAgICAgICAgaXNWaXNpdGVkW2NoaWxkXSA9IHRydWU7XG4gICAgICAgIG5laWdoYm9ycyA9IGRpcmVjdGVkID8gZ2V0TmVpZ2hib3JzKGNoaWxkLCBlZGdlcywgJ3RhcmdldCcpIDogZ2V0TmVpZ2hib3JzKGNoaWxkLCBlZGdlcyk7XG4gICAgICAgIHN0YWNrLnB1c2gobmVpZ2hib3JzLmZpbHRlcihmdW5jdGlvbiAobmVpZ2hib3IpIHtcbiAgICAgICAgICByZXR1cm4gIWlzVmlzaXRlZFtuZWlnaGJvcl07XG4gICAgICAgIH0pKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIG5vZGUgPSB2aXNpdGVkLnBvcCgpO1xuICAgICAgaXNWaXNpdGVkW25vZGVdID0gZmFsc2U7XG4gICAgICBzdGFjay5wb3AoKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmICh2aXNpdGVkW3Zpc2l0ZWQubGVuZ3RoIC0gMV0gPT09IGVuZCkge1xuICAgICAgdmFyIHBhdGggPSB2aXNpdGVkLm1hcChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgIH0pO1xuICAgICAgYWxsUGF0aC5wdXNoKHBhdGgpO1xuICAgICAgdmFyIG5vZGUgPSB2aXNpdGVkLnBvcCgpO1xuICAgICAgaXNWaXNpdGVkW25vZGVdID0gZmFsc2U7XG4gICAgICBzdGFjay5wb3AoKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYWxsUGF0aDtcbn07IiwiaW1wb3J0IGdldEFkak1hdHJpeCBmcm9tIFwiLi9hZGphY2VudC1tYXRyaXhcIjtcblxudmFyIGZsb3lkV2Fyc2hhbGwgPSBmdW5jdGlvbiBmbG95ZFdhcnNoYWxsKGdyYXBoRGF0YSwgZGlyZWN0ZWQpIHtcbiAgdmFyIGFkamFjZW50TWF0cml4ID0gZ2V0QWRqTWF0cml4KGdyYXBoRGF0YSwgZGlyZWN0ZWQpO1xuICB2YXIgZGlzdCA9IFtdO1xuICB2YXIgc2l6ZSA9IGFkamFjZW50TWF0cml4Lmxlbmd0aDtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHNpemU7IGkgKz0gMSkge1xuICAgIGRpc3RbaV0gPSBbXTtcblxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgc2l6ZTsgaiArPSAxKSB7XG4gICAgICBpZiAoaSA9PT0gaikge1xuICAgICAgICBkaXN0W2ldW2pdID0gMDtcbiAgICAgIH0gZWxzZSBpZiAoYWRqYWNlbnRNYXRyaXhbaV1bal0gPT09IDAgfHwgIWFkamFjZW50TWF0cml4W2ldW2pdKSB7XG4gICAgICAgIGRpc3RbaV1bal0gPSBJbmZpbml0eTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRpc3RbaV1bal0gPSBhZGphY2VudE1hdHJpeFtpXVtqXTtcbiAgICAgIH1cbiAgICB9XG4gIH0gLy8gZmxveWRcblxuXG4gIGZvciAodmFyIGsgPSAwOyBrIDwgc2l6ZTsgayArPSAxKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaXplOyBpICs9IDEpIHtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgc2l6ZTsgaiArPSAxKSB7XG4gICAgICAgIGlmIChkaXN0W2ldW2pdID4gZGlzdFtpXVtrXSArIGRpc3Rba11bal0pIHtcbiAgICAgICAgICBkaXN0W2ldW2pdID0gZGlzdFtpXVtrXSArIGRpc3Rba11bal07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gZGlzdDtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGZsb3lkV2Fyc2hhbGw7IiwiaW1wb3J0IGdldEFkak1hdHJpeCBmcm9tICcuL2FkamFjZW50LW1hdHJpeCc7XG5pbXBvcnQgeyB1bmlxdWVJZCB9IGZyb20gJy4vdXRpbCc7XG4vKipcbiAqIOagh+etvuS8oOaSreeul+azlVxuICogQHBhcmFtIGdyYXBoRGF0YSDlm77mlbDmja5cbiAqIEBwYXJhbSBkaXJlY3RlZCDmmK/lkKbmnInlkJHlm77vvIzpu5jorqTkuLogZmFsc2VcbiAqIEBwYXJhbSB3ZWlnaHRQcm9wZXJ0eU5hbWUg5p2D6YeN55qE5bGe5oCn5a2X5q61XG4gKiBAcGFyYW0gbWF4SXRlcmF0aW9uIOacgOWkp+i/reS7o+asoeaVsFxuICovXG5cbnZhciBsYWJlbFByb3BhZ2F0aW9uID0gZnVuY3Rpb24gbGFiZWxQcm9wYWdhdGlvbihncmFwaERhdGEsIGRpcmVjdGVkLCB3ZWlnaHRQcm9wZXJ0eU5hbWUsIG1heEl0ZXJhdGlvbikge1xuICBpZiAoZGlyZWN0ZWQgPT09IHZvaWQgMCkge1xuICAgIGRpcmVjdGVkID0gZmFsc2U7XG4gIH1cblxuICBpZiAod2VpZ2h0UHJvcGVydHlOYW1lID09PSB2b2lkIDApIHtcbiAgICB3ZWlnaHRQcm9wZXJ0eU5hbWUgPSAnd2VpZ2h0JztcbiAgfVxuXG4gIGlmIChtYXhJdGVyYXRpb24gPT09IHZvaWQgMCkge1xuICAgIG1heEl0ZXJhdGlvbiA9IDEwMDA7XG4gIH0gLy8gdGhlIG9yaWdpbiBkYXRhXG5cblxuICB2YXIgX2EgPSBncmFwaERhdGEubm9kZXMsXG4gICAgICBub2RlcyA9IF9hID09PSB2b2lkIDAgPyBbXSA6IF9hLFxuICAgICAgX2IgPSBncmFwaERhdGEuZWRnZXMsXG4gICAgICBlZGdlcyA9IF9iID09PSB2b2lkIDAgPyBbXSA6IF9iO1xuICB2YXIgY2x1c3RlcnMgPSB7fTtcbiAgdmFyIG5vZGVNYXAgPSB7fTsgLy8gaW5pdCB0aGUgY2x1c3RlcnMgYW5kIG5vZGVNYXBcblxuICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChub2RlLCBpKSB7XG4gICAgdmFyIGNpZCA9IHVuaXF1ZUlkKCk7XG4gICAgbm9kZS5jbHVzdGVySWQgPSBjaWQ7XG4gICAgY2x1c3RlcnNbY2lkXSA9IHtcbiAgICAgIGlkOiBjaWQsXG4gICAgICBub2RlczogW25vZGVdXG4gICAgfTtcbiAgICBub2RlTWFwW25vZGUuaWRdID0ge1xuICAgICAgbm9kZTogbm9kZSxcbiAgICAgIGlkeDogaVxuICAgIH07XG4gIH0pOyAvLyB0aGUgYWRqYWNlbnQgbWF0cml4IG9mIGNhbE5vZGVzIGluc2lkZSBjbHVzdGVyc1xuXG4gIHZhciBhZGpNYXRyaXggPSBnZXRBZGpNYXRyaXgoZ3JhcGhEYXRhLCBkaXJlY3RlZCk7IC8vIHRoZSBzdW0gb2YgZWFjaCByb3cgaW4gYWRqYWNlbnQgbWF0cml4XG5cbiAgdmFyIGtzID0gW107XG4gIC8qKlxuICAgKiBuZWlnaGJvciBub2RlcyAoaWQgZm9yIGtleSBhbmQgd2VpZ2h0IGZvciB2YWx1ZSkgZm9yIGVhY2ggbm9kZVxuICAgKiBuZWlnaGJvcnMgPSB7XG4gICAqICBpZChub2RlX2lkKTogeyBpZChuZWlnaGJvcl8xX2lkKTogd2VpZ2h0KHdlaWdodCBvZiB0aGUgZWRnZSksIGlkKG5laWdoYm9yXzJfaWQpOiB3ZWlnaHQod2VpZ2h0IG9mIHRoZSBlZGdlKSwgLi4uIH0sXG4gICAqICAuLi5cbiAgICogfVxuICAgKi9cblxuICB2YXIgbmVpZ2hib3JzID0ge307XG4gIGFkak1hdHJpeC5mb3JFYWNoKGZ1bmN0aW9uIChyb3csIGkpIHtcbiAgICB2YXIgayA9IDA7XG4gICAgdmFyIGlpZCA9IG5vZGVzW2ldLmlkO1xuICAgIG5laWdoYm9yc1tpaWRdID0ge307XG4gICAgcm93LmZvckVhY2goZnVuY3Rpb24gKGVudHJ5LCBqKSB7XG4gICAgICBpZiAoIWVudHJ5KSByZXR1cm47XG4gICAgICBrICs9IGVudHJ5O1xuICAgICAgdmFyIGppZCA9IG5vZGVzW2pdLmlkO1xuICAgICAgbmVpZ2hib3JzW2lpZF1bamlkXSA9IGVudHJ5O1xuICAgIH0pO1xuICAgIGtzLnB1c2goayk7XG4gIH0pO1xuICB2YXIgaXRlciA9IDA7XG5cbiAgdmFyIF9sb29wXzEgPSBmdW5jdGlvbiBfbG9vcF8xKCkge1xuICAgIHZhciBjaGFuZ2VkID0gZmFsc2U7XG4gICAgbm9kZXMuZm9yRWFjaChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgdmFyIG5laWdoYm9yQ2x1c3RlcnMgPSB7fTtcbiAgICAgIE9iamVjdC5rZXlzKG5laWdoYm9yc1tub2RlLmlkXSkuZm9yRWFjaChmdW5jdGlvbiAobmVpZ2hib3JJZCkge1xuICAgICAgICB2YXIgbmVpZ2hib3JXZWlnaHQgPSBuZWlnaGJvcnNbbm9kZS5pZF1bbmVpZ2hib3JJZF07XG4gICAgICAgIHZhciBuZWlnaGJvck5vZGUgPSBub2RlTWFwW25laWdoYm9ySWRdLm5vZGU7XG4gICAgICAgIHZhciBuZWlnaGJvckNsdXN0ZXJJZCA9IG5laWdoYm9yTm9kZS5jbHVzdGVySWQ7XG4gICAgICAgIGlmICghbmVpZ2hib3JDbHVzdGVyc1tuZWlnaGJvckNsdXN0ZXJJZF0pIG5laWdoYm9yQ2x1c3RlcnNbbmVpZ2hib3JDbHVzdGVySWRdID0gMDtcbiAgICAgICAgbmVpZ2hib3JDbHVzdGVyc1tuZWlnaGJvckNsdXN0ZXJJZF0gKz0gbmVpZ2hib3JXZWlnaHQ7XG4gICAgICB9KTsgLy8gZmluZCB0aGUgY2x1c3RlciB3aXRoIG1heCB3ZWlnaHRcblxuICAgICAgdmFyIG1heFdlaWdodCA9IC1JbmZpbml0eTtcbiAgICAgIHZhciBiZXN0Q2x1c3RlcklkcyA9IFtdO1xuICAgICAgT2JqZWN0LmtleXMobmVpZ2hib3JDbHVzdGVycykuZm9yRWFjaChmdW5jdGlvbiAoY2x1c3RlcklkKSB7XG4gICAgICAgIGlmIChtYXhXZWlnaHQgPCBuZWlnaGJvckNsdXN0ZXJzW2NsdXN0ZXJJZF0pIHtcbiAgICAgICAgICBtYXhXZWlnaHQgPSBuZWlnaGJvckNsdXN0ZXJzW2NsdXN0ZXJJZF07XG4gICAgICAgICAgYmVzdENsdXN0ZXJJZHMgPSBbY2x1c3RlcklkXTtcbiAgICAgICAgfSBlbHNlIGlmIChtYXhXZWlnaHQgPT09IG5laWdoYm9yQ2x1c3RlcnNbY2x1c3RlcklkXSkge1xuICAgICAgICAgIGJlc3RDbHVzdGVySWRzLnB1c2goY2x1c3RlcklkKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBpZiAoYmVzdENsdXN0ZXJJZHMubGVuZ3RoID09PSAxICYmIGJlc3RDbHVzdGVySWRzWzBdID09PSBub2RlLmNsdXN0ZXJJZCkgcmV0dXJuO1xuICAgICAgdmFyIHNlbGZDbHVzdGVySWR4ID0gYmVzdENsdXN0ZXJJZHMuaW5kZXhPZihub2RlLmNsdXN0ZXJJZCk7XG4gICAgICBpZiAoc2VsZkNsdXN0ZXJJZHggPj0gMCkgYmVzdENsdXN0ZXJJZHMuc3BsaWNlKHNlbGZDbHVzdGVySWR4LCAxKTtcblxuICAgICAgaWYgKGJlc3RDbHVzdGVySWRzICYmIGJlc3RDbHVzdGVySWRzLmxlbmd0aCkge1xuICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsgLy8gcmVtb3ZlIGZyb20gb3JpZ2luIGNsdXN0ZXJcblxuICAgICAgICB2YXIgc2VsZkNsdXN0ZXIgPSBjbHVzdGVyc1tub2RlLmNsdXN0ZXJJZF07XG4gICAgICAgIHZhciBub2RlSW5TZWxmQ2x1c3RlcklkeCA9IHNlbGZDbHVzdGVyLm5vZGVzLmluZGV4T2Yobm9kZSk7XG4gICAgICAgIHNlbGZDbHVzdGVyLm5vZGVzLnNwbGljZShub2RlSW5TZWxmQ2x1c3RlcklkeCwgMSk7IC8vIG1vdmUgdGhlIG5vZGUgdG8gdGhlIGJlc3QgY2x1c3RlclxuXG4gICAgICAgIHZhciByYW5kb21JZHggPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBiZXN0Q2x1c3Rlcklkcy5sZW5ndGgpO1xuICAgICAgICB2YXIgYmVzdENsdXN0ZXIgPSBjbHVzdGVyc1tiZXN0Q2x1c3Rlcklkc1tyYW5kb21JZHhdXTtcbiAgICAgICAgYmVzdENsdXN0ZXIubm9kZXMucHVzaChub2RlKTtcbiAgICAgICAgbm9kZS5jbHVzdGVySWQgPSBiZXN0Q2x1c3Rlci5pZDtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoIWNoYW5nZWQpIHJldHVybiBcImJyZWFrXCI7XG4gICAgaXRlcisrO1xuICB9O1xuXG4gIHdoaWxlIChpdGVyIDwgbWF4SXRlcmF0aW9uKSB7XG4gICAgdmFyIHN0YXRlXzEgPSBfbG9vcF8xKCk7XG5cbiAgICBpZiAoc3RhdGVfMSA9PT0gXCJicmVha1wiKSBicmVhaztcbiAgfSAvLyBkZWxldGUgdGhlIGVtcHR5IGNsdXN0ZXJzXG5cblxuICBPYmplY3Qua2V5cyhjbHVzdGVycykuZm9yRWFjaChmdW5jdGlvbiAoY2x1c3RlcklkKSB7XG4gICAgdmFyIGNsdXN0ZXIgPSBjbHVzdGVyc1tjbHVzdGVySWRdO1xuXG4gICAgaWYgKCFjbHVzdGVyLm5vZGVzIHx8ICFjbHVzdGVyLm5vZGVzLmxlbmd0aCkge1xuICAgICAgZGVsZXRlIGNsdXN0ZXJzW2NsdXN0ZXJJZF07XG4gICAgfVxuICB9KTsgLy8gZ2V0IHRoZSBjbHVzdGVyIGVkZ2VzXG5cbiAgdmFyIGNsdXN0ZXJFZGdlcyA9IFtdO1xuICB2YXIgY2x1c3RlckVkZ2VNYXAgPSB7fTtcbiAgZWRnZXMuZm9yRWFjaChmdW5jdGlvbiAoZWRnZSkge1xuICAgIHZhciBzb3VyY2UgPSBlZGdlLnNvdXJjZSxcbiAgICAgICAgdGFyZ2V0ID0gZWRnZS50YXJnZXQ7XG4gICAgdmFyIHdlaWdodCA9IGVkZ2Vbd2VpZ2h0UHJvcGVydHlOYW1lXSB8fCAxO1xuICAgIHZhciBzb3VyY2VDbHVzdGVySWQgPSBub2RlTWFwW3NvdXJjZV0ubm9kZS5jbHVzdGVySWQ7XG4gICAgdmFyIHRhcmdldENsdXN0ZXJJZCA9IG5vZGVNYXBbdGFyZ2V0XS5ub2RlLmNsdXN0ZXJJZDtcbiAgICB2YXIgbmV3RWRnZUlkID0gc291cmNlQ2x1c3RlcklkICsgXCItLS1cIiArIHRhcmdldENsdXN0ZXJJZDtcblxuICAgIGlmIChjbHVzdGVyRWRnZU1hcFtuZXdFZGdlSWRdKSB7XG4gICAgICBjbHVzdGVyRWRnZU1hcFtuZXdFZGdlSWRdLndlaWdodCArPSB3ZWlnaHQ7XG4gICAgICBjbHVzdGVyRWRnZU1hcFtuZXdFZGdlSWRdLmNvdW50Kys7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBuZXdFZGdlID0ge1xuICAgICAgICBzb3VyY2U6IHNvdXJjZUNsdXN0ZXJJZCxcbiAgICAgICAgdGFyZ2V0OiB0YXJnZXRDbHVzdGVySWQsXG4gICAgICAgIHdlaWdodDogd2VpZ2h0LFxuICAgICAgICBjb3VudDogMVxuICAgICAgfTtcbiAgICAgIGNsdXN0ZXJFZGdlTWFwW25ld0VkZ2VJZF0gPSBuZXdFZGdlO1xuICAgICAgY2x1c3RlckVkZ2VzLnB1c2gobmV3RWRnZSk7XG4gICAgfVxuICB9KTtcbiAgdmFyIGNsdXN0ZXJzQXJyYXkgPSBbXTtcbiAgT2JqZWN0LmtleXMoY2x1c3RlcnMpLmZvckVhY2goZnVuY3Rpb24gKGNsdXN0ZXJJZCkge1xuICAgIGNsdXN0ZXJzQXJyYXkucHVzaChjbHVzdGVyc1tjbHVzdGVySWRdKTtcbiAgfSk7XG4gIHJldHVybiB7XG4gICAgY2x1c3RlcnM6IGNsdXN0ZXJzQXJyYXksXG4gICAgY2x1c3RlckVkZ2VzOiBjbHVzdGVyRWRnZXNcbiAgfTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGxhYmVsUHJvcGFnYXRpb247IiwiaW1wb3J0IGdldEFkak1hdHJpeCBmcm9tICcuL2FkamFjZW50LW1hdHJpeCc7XG5cbnZhciBnZXRNb2R1bGFyaXR5ID0gZnVuY3Rpb24gZ2V0TW9kdWxhcml0eShub2RlcywgYWRqTWF0cml4LCBrcywgbSkge1xuICB2YXIgbGVuZ3RoID0gYWRqTWF0cml4Lmxlbmd0aDtcbiAgdmFyIHBhcmFtID0gMiAqIG07XG4gIHZhciBtb2R1bGFyaXR5ID0gMDtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGNsdXN0ZXJpID0gbm9kZXNbaV0uY2x1c3RlcklkO1xuXG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBsZW5ndGg7IGorKykge1xuICAgICAgdmFyIGNsdXN0ZXJqID0gbm9kZXNbal0uY2x1c3RlcklkO1xuICAgICAgaWYgKGNsdXN0ZXJpICE9PSBjbHVzdGVyaikgY29udGludWU7XG4gICAgICB2YXIgZW50cnkgPSBhZGpNYXRyaXhbaV1bal0gfHwgMDtcbiAgICAgIHZhciBraSA9IGtzW2ldIHx8IDA7XG4gICAgICB2YXIga2ogPSBrc1tqXSB8fCAwO1xuICAgICAgbW9kdWxhcml0eSArPSBlbnRyeSAtIGtpICoga2ogLyBwYXJhbTtcbiAgICB9XG4gIH1cblxuICBtb2R1bGFyaXR5ICo9IDEgLyBwYXJhbTtcbiAgcmV0dXJuIG1vZHVsYXJpdHk7XG59O1xuLyoqXG4gKiDnpL7ljLrlj5HnjrAgbG91dmFpbiDnrpfms5VcbiAqIEBwYXJhbSBncmFwaERhdGEg5Zu+5pWw5o2uXG4gKiBAcGFyYW0gZGlyZWN0ZWQg5piv5ZCm5pyJ5ZCR5Zu+77yM6buY6K6k5Li6IGZhbHNlXG4gKiBAcGFyYW0gd2VpZ2h0UHJvcGVydHlOYW1lIOadg+mHjeeahOWxnuaAp+Wtl+autVxuICogQHBhcmFtIHRocmVzaG9sZFxuICovXG5cblxudmFyIGxvdXZhaW4gPSBmdW5jdGlvbiBsb3V2YWluKGdyYXBoRGF0YSwgZGlyZWN0ZWQsIHdlaWdodFByb3BlcnR5TmFtZSwgdGhyZXNob2xkKSB7XG4gIGlmIChkaXJlY3RlZCA9PT0gdm9pZCAwKSB7XG4gICAgZGlyZWN0ZWQgPSBmYWxzZTtcbiAgfVxuXG4gIGlmICh3ZWlnaHRQcm9wZXJ0eU5hbWUgPT09IHZvaWQgMCkge1xuICAgIHdlaWdodFByb3BlcnR5TmFtZSA9ICd3ZWlnaHQnO1xuICB9XG5cbiAgaWYgKHRocmVzaG9sZCA9PT0gdm9pZCAwKSB7XG4gICAgdGhyZXNob2xkID0gMC4wMDAxO1xuICB9IC8vIHRoZSBvcmlnaW4gZGF0YVxuXG5cbiAgdmFyIF9hID0gZ3JhcGhEYXRhLm5vZGVzLFxuICAgICAgbm9kZXMgPSBfYSA9PT0gdm9pZCAwID8gW10gOiBfYSxcbiAgICAgIF9iID0gZ3JhcGhEYXRhLmVkZ2VzLFxuICAgICAgZWRnZXMgPSBfYiA9PT0gdm9pZCAwID8gW10gOiBfYjtcbiAgdmFyIHVuaXF1ZUlkID0gMTtcbiAgdmFyIGNsdXN0ZXJzID0ge307XG4gIHZhciBub2RlTWFwID0ge307IC8vIGluaXQgdGhlIGNsdXN0ZXJzIGFuZCBub2RlTWFwXG5cbiAgbm9kZXMuZm9yRWFjaChmdW5jdGlvbiAobm9kZSwgaSkge1xuICAgIHZhciBjaWQgPSBTdHJpbmcodW5pcXVlSWQrKyk7XG4gICAgbm9kZS5jbHVzdGVySWQgPSBjaWQ7XG4gICAgY2x1c3RlcnNbY2lkXSA9IHtcbiAgICAgIGlkOiBjaWQsXG4gICAgICBub2RlczogW25vZGVdXG4gICAgfTtcbiAgICBub2RlTWFwW25vZGUuaWRdID0ge1xuICAgICAgbm9kZTogbm9kZSxcbiAgICAgIGlkeDogaVxuICAgIH07XG4gIH0pOyAvLyB0aGUgYWRqYWNlbnQgbWF0cml4IG9mIGNhbE5vZGVzIGluc2lkZSBjbHVzdGVyc1xuXG4gIHZhciBhZGpNYXRyaXggPSBnZXRBZGpNYXRyaXgoZ3JhcGhEYXRhLCBkaXJlY3RlZCk7IC8vIHRoZSBzdW0gb2YgZWFjaCByb3cgaW4gYWRqYWNlbnQgbWF0cml4XG5cbiAgdmFyIGtzID0gW107XG4gIC8qKlxuICAgKiBuZWlnaGJvciBub2RlcyAoaWQgZm9yIGtleSBhbmQgd2VpZ2h0IGZvciB2YWx1ZSkgZm9yIGVhY2ggbm9kZVxuICAgKiBuZWlnaGJvcnMgPSB7XG4gICAqICBpZChub2RlX2lkKTogeyBpZChuZWlnaGJvcl8xX2lkKTogd2VpZ2h0KHdlaWdodCBvZiB0aGUgZWRnZSksIGlkKG5laWdoYm9yXzJfaWQpOiB3ZWlnaHQod2VpZ2h0IG9mIHRoZSBlZGdlKSwgLi4uIH0sXG4gICAqICAuLi5cbiAgICogfVxuICAgKi9cblxuICB2YXIgbmVpZ2hib3JzID0ge307IC8vIHRoZSBzdW0gb2YgdGhlIHdlaWdodHMgb2YgYWxsIGVkZ2VzIGluIHRoZSBncmFwaFxuXG4gIHZhciBtID0gMDtcbiAgYWRqTWF0cml4LmZvckVhY2goZnVuY3Rpb24gKHJvdywgaSkge1xuICAgIHZhciBrID0gMDtcbiAgICB2YXIgaWlkID0gbm9kZXNbaV0uaWQ7XG4gICAgbmVpZ2hib3JzW2lpZF0gPSB7fTtcbiAgICByb3cuZm9yRWFjaChmdW5jdGlvbiAoZW50cnksIGopIHtcbiAgICAgIGlmICghZW50cnkpIHJldHVybjtcbiAgICAgIGsgKz0gZW50cnk7XG4gICAgICB2YXIgamlkID0gbm9kZXNbal0uaWQ7XG4gICAgICBuZWlnaGJvcnNbaWlkXVtqaWRdID0gZW50cnk7XG4gICAgICBtICs9IGVudHJ5O1xuICAgIH0pO1xuICAgIGtzLnB1c2goayk7XG4gIH0pO1xuICBtIC89IDI7XG4gIHZhciB0b3RhbE1vZHVsYXJpdHkgPSBJbmZpbml0eTtcbiAgdmFyIHByZXZpb3VzTW9kdWxhcml0eSA9IEluZmluaXR5O1xuICB2YXIgaXRlciA9IDA7XG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICAvLyB3aGV0aGVyIHRvIHRlcm1pbmF0ZSB0aGUgaXRlcmF0aW9uc1xuICAgIHRvdGFsTW9kdWxhcml0eSA9IGdldE1vZHVsYXJpdHkobm9kZXMsIGFkak1hdHJpeCwga3MsIG0pO1xuICAgIGlmIChNYXRoLmFicyh0b3RhbE1vZHVsYXJpdHkgLSBwcmV2aW91c01vZHVsYXJpdHkpIDwgdGhyZXNob2xkIHx8IGl0ZXIgPiAxMDApIGJyZWFrO1xuICAgIHByZXZpb3VzTW9kdWxhcml0eSA9IHRvdGFsTW9kdWxhcml0eTtcbiAgICBpdGVyKys7IC8vIHByZSBjb21wdXRlIHNvbWUgdmFsdWVzIGZvciBjdXJyZW50IGNsdXN0ZXJzXG5cbiAgICBPYmplY3Qua2V5cyhjbHVzdGVycykuZm9yRWFjaChmdW5jdGlvbiAoY2x1c3RlcklkKSB7XG4gICAgICAvLyBzdW0gb2Ygd2VpZ2h0cyBvZiBlZGdlcyB0byBub2RlcyBpbiBjbHVzdGVyXG4gICAgICB2YXIgc3VtVG90ID0gMDtcbiAgICAgIGVkZ2VzLmZvckVhY2goZnVuY3Rpb24gKGVkZ2UpIHtcbiAgICAgICAgdmFyIHNvdXJjZSA9IGVkZ2Uuc291cmNlLFxuICAgICAgICAgICAgdGFyZ2V0ID0gZWRnZS50YXJnZXQ7XG4gICAgICAgIHZhciBzb3VyY2VDbHVzdGVySWQgPSBub2RlTWFwW3NvdXJjZV0ubm9kZS5jbHVzdGVySWQ7XG4gICAgICAgIHZhciB0YXJnZXRDbHVzdGVySWQgPSBub2RlTWFwW3RhcmdldF0ubm9kZS5jbHVzdGVySWQ7XG5cbiAgICAgICAgaWYgKHNvdXJjZUNsdXN0ZXJJZCA9PT0gY2x1c3RlcklkICYmIHRhcmdldENsdXN0ZXJJZCAhPT0gY2x1c3RlcklkIHx8IHRhcmdldENsdXN0ZXJJZCA9PT0gY2x1c3RlcklkICYmIHNvdXJjZUNsdXN0ZXJJZCAhPT0gY2x1c3RlcklkKSB7XG4gICAgICAgICAgc3VtVG90ID0gc3VtVG90ICsgKGVkZ2Vbd2VpZ2h0UHJvcGVydHlOYW1lXSB8fCAxKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBjbHVzdGVyc1tjbHVzdGVySWRdLnN1bVRvdCA9IHN1bVRvdDtcbiAgICB9KTsgLy8gbW92ZSB0aGUgbm9kZXMgdG8gaW5jcmVhc2UgdGhlIGRlbHRhIG1vZHVsYXJpdHlcblxuICAgIG5vZGVzLmZvckVhY2goZnVuY3Rpb24gKG5vZGUsIGkpIHtcbiAgICAgIHZhciBzZWxmQ2x1c3RlciA9IGNsdXN0ZXJzW25vZGUuY2x1c3RlcklkXTtcbiAgICAgIHZhciBiZXN0SW5jcmVhc2UgPSAwO1xuICAgICAgdmFyIGJlc3RDbHVzdGVyO1xuICAgICAgdmFyIGNvbW1vblBhcmFtID0ga3NbaV0gLyAoMiAqIG0pOyAvLyBzdW0gb2Ygd2VpZ2h0cyBvZiBlZGdlcyBmcm9tIG5vZGUgdG8gbm9kZXMgaW4gY2x1c3RlclxuXG4gICAgICB2YXIga2lpbiA9IDA7XG4gICAgICB2YXIgc2VsZkNsdXN0ZXJOb2RlcyA9IHNlbGZDbHVzdGVyLm5vZGVzO1xuICAgICAgc2VsZkNsdXN0ZXJOb2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChzY05vZGUpIHtcbiAgICAgICAgdmFyIHNjTm9kZUlkeCA9IG5vZGVNYXBbc2NOb2RlLmlkXS5pZHg7XG4gICAgICAgIGtpaW4gKz0gYWRqTWF0cml4W2ldW3NjTm9kZUlkeF0gfHwgMDtcbiAgICAgIH0pOyAvLyB0aGUgbW9kdXJhcml0eSBmb3IgKipyZW1vdmluZyoqIHRoZSBub2RlIGkgZnJvbSB0aGUgb3JpZ2luIGNsdXN0ZXIgb2Ygbm9kZSBpXG5cbiAgICAgIHZhciByZW1vdmVNb2R1cmFyaXR5ID0ga2lpbiAtIHNlbGZDbHVzdGVyLnN1bVRvdCAqIGNvbW1vblBhcmFtOyAvLyB0aGUgbmVpZ2h0Ym9ycyBvZiB0aGUgbm9kZVxuXG4gICAgICB2YXIgbm9kZU5laWdoYm9ySWRzID0gbmVpZ2hib3JzW25vZGUuaWRdO1xuICAgICAgT2JqZWN0LmtleXMobm9kZU5laWdoYm9ySWRzKS5mb3JFYWNoKGZ1bmN0aW9uIChuZWlnaGJvck5vZGVJZCkge1xuICAgICAgICB2YXIgbmVpZ2hib3JOb2RlID0gbm9kZU1hcFtuZWlnaGJvck5vZGVJZF0ubm9kZTtcbiAgICAgICAgdmFyIG5laWdoYm9yQ2x1c3RlcklkID0gbmVpZ2hib3JOb2RlLmNsdXN0ZXJJZDsgLy8gaWYgdGhlIG5vZGUgYW5kIHRoZSBuZWlnaGJvciBvZiBub2RlIGFyZSBpbiB0aGUgc2FtZSBjbHVzdGVyLCByZXV0cm5cblxuICAgICAgICBpZiAobmVpZ2hib3JDbHVzdGVySWQgPT09IG5vZGUuY2x1c3RlcklkKSByZXR1cm47XG4gICAgICAgIHZhciBuZWlnaGJvckNsdXN0ZXIgPSBjbHVzdGVyc1tuZWlnaGJvckNsdXN0ZXJJZF07XG4gICAgICAgIHZhciBjbHVzdGVyTm9kZXMgPSBuZWlnaGJvckNsdXN0ZXIubm9kZXM7IC8vIGlmIHRoZSBjbHVzdGVyIGlzIGVtcHR5LCByZW1vdmUgdGhlIGNsdXN0ZXIgYW5kIHJldHVyblxuXG4gICAgICAgIGlmICghY2x1c3Rlck5vZGVzIHx8ICFjbHVzdGVyTm9kZXMubGVuZ3RoKSByZXR1cm47IC8vIHN1bSBvZiB3ZWlnaHRzIG9mIGVkZ2VzIGZyb20gbm9kZSB0byBub2RlcyBpbiBjbHVzdGVyXG5cbiAgICAgICAgdmFyIG5laWdoYm9yQ2x1c3RlcktpaW4gPSAwO1xuICAgICAgICBjbHVzdGVyTm9kZXMuZm9yRWFjaChmdW5jdGlvbiAoY05vZGUpIHtcbiAgICAgICAgICB2YXIgY05vZGVJZHggPSBub2RlTWFwW2NOb2RlLmlkXS5pZHg7XG4gICAgICAgICAgbmVpZ2hib3JDbHVzdGVyS2lpbiArPSBhZGpNYXRyaXhbaV1bY05vZGVJZHhdIHx8IDA7XG4gICAgICAgIH0pOyAvLyBtb2R1cmFyaXR5IGZvciAqKmFkZGluZyoqIG5vZGUgaSBpbnRvIHRoaXMgbmVpZ2hib3IgY2x1c3RlclxuXG4gICAgICAgIHZhciBhZGRNb2R1cmFyaXR5ID0gbmVpZ2hib3JDbHVzdGVyS2lpbiAtIG5laWdoYm9yQ2x1c3Rlci5zdW1Ub3QgKiBjb21tb25QYXJhbTsgLy8gdGhlIGluY3JlYXNlIG1vZHVyYXJpdHkgaXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhZGRNb2R1cmFyaXR5IGFuZCByZW1vdmVNb2R1cmFyaXR5XG5cbiAgICAgICAgdmFyIGluY3JlYXNlID0gYWRkTW9kdXJhcml0eSAtIHJlbW92ZU1vZHVyYXJpdHk7IC8vIGZpbmQgdGhlIGJlc3QgY2x1c3RlciB0byBtb3ZlIG5vZGUgaSBpbnRvXG5cbiAgICAgICAgaWYgKGluY3JlYXNlID4gYmVzdEluY3JlYXNlKSB7XG4gICAgICAgICAgYmVzdEluY3JlYXNlID0gaW5jcmVhc2U7XG4gICAgICAgICAgYmVzdENsdXN0ZXIgPSBuZWlnaGJvckNsdXN0ZXI7XG4gICAgICAgIH1cbiAgICAgIH0pOyAvLyBpZiBmb3VuZCBhIGJlc3QgY2x1c3RlciB0byBtb3ZlIGludG9cblxuICAgICAgaWYgKGJlc3RJbmNyZWFzZSA+IDApIHtcbiAgICAgICAgYmVzdENsdXN0ZXIubm9kZXMucHVzaChub2RlKTtcbiAgICAgICAgdmFyIHByZXZpb3VzQ2x1c3RlcklkXzEgPSBub2RlLmNsdXN0ZXJJZDtcbiAgICAgICAgbm9kZS5jbHVzdGVySWQgPSBiZXN0Q2x1c3Rlci5pZDsgLy8gbW92ZSB0aGUgbm9kZSB0byB0aGUgYmVzdCBjbHVzdGVyXG5cbiAgICAgICAgdmFyIG5vZGVJblNlbGZDbHVzdGVySWR4ID0gc2VsZkNsdXN0ZXIubm9kZXMuaW5kZXhPZihub2RlKTsgLy8gcmVtb3ZlIGZyb20gb3JpZ2luIGNsdXN0ZXJcblxuICAgICAgICBzZWxmQ2x1c3Rlci5ub2Rlcy5zcGxpY2Uobm9kZUluU2VsZkNsdXN0ZXJJZHgsIDEpOyAvLyB1cGRhdGUgc3VtVG90IGZvciBjbHVzdGVyc1xuICAgICAgICAvLyBzdW0gb2Ygd2VpZ2h0cyBvZiBlZGdlcyB0byBub2RlcyBpbiBjbHVzdGVyXG5cbiAgICAgICAgdmFyIG5laWdoYm9yQ2x1c3RlclN1bVRvdF8xID0gMDtcbiAgICAgICAgdmFyIHNlbGZDbHVzdGVyU3VtVG90XzEgPSAwO1xuICAgICAgICBlZGdlcy5mb3JFYWNoKGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgICAgICAgdmFyIHNvdXJjZSA9IGVkZ2Uuc291cmNlLFxuICAgICAgICAgICAgICB0YXJnZXQgPSBlZGdlLnRhcmdldDtcbiAgICAgICAgICB2YXIgc291cmNlQ2x1c3RlcklkID0gbm9kZU1hcFtzb3VyY2VdLm5vZGUuY2x1c3RlcklkO1xuICAgICAgICAgIHZhciB0YXJnZXRDbHVzdGVySWQgPSBub2RlTWFwW3RhcmdldF0ubm9kZS5jbHVzdGVySWQ7XG5cbiAgICAgICAgICBpZiAoc291cmNlQ2x1c3RlcklkID09PSBiZXN0Q2x1c3Rlci5pZCAmJiB0YXJnZXRDbHVzdGVySWQgIT09IGJlc3RDbHVzdGVyLmlkIHx8IHRhcmdldENsdXN0ZXJJZCA9PT0gYmVzdENsdXN0ZXIuaWQgJiYgc291cmNlQ2x1c3RlcklkICE9PSBiZXN0Q2x1c3Rlci5pZCkge1xuICAgICAgICAgICAgbmVpZ2hib3JDbHVzdGVyU3VtVG90XzEgPSBuZWlnaGJvckNsdXN0ZXJTdW1Ub3RfMSArIChlZGdlW3dlaWdodFByb3BlcnR5TmFtZV0gfHwgMSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHNvdXJjZUNsdXN0ZXJJZCA9PT0gcHJldmlvdXNDbHVzdGVySWRfMSAmJiB0YXJnZXRDbHVzdGVySWQgIT09IHByZXZpb3VzQ2x1c3RlcklkXzEgfHwgdGFyZ2V0Q2x1c3RlcklkID09PSBwcmV2aW91c0NsdXN0ZXJJZF8xICYmIHNvdXJjZUNsdXN0ZXJJZCAhPT0gcHJldmlvdXNDbHVzdGVySWRfMSkge1xuICAgICAgICAgICAgc2VsZkNsdXN0ZXJTdW1Ub3RfMSA9IHNlbGZDbHVzdGVyU3VtVG90XzEgKyAoZWRnZVt3ZWlnaHRQcm9wZXJ0eU5hbWVdIHx8IDEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7IC8vIHRoZSBub2RlcyBvZiB0aGUgY2x1c3RlcnMgdG8gbW92ZSBpbnRvIGFuZCByZW1vdmUgYXJlIGNoYW5nZWQsIHVwZGF0ZSB0aGVpciBzdW1Ub3RcblxuICAgICAgICBiZXN0Q2x1c3Rlci5zdW1Ub3QgPSBuZWlnaGJvckNsdXN0ZXJTdW1Ub3RfMTtcbiAgICAgICAgc2VsZkNsdXN0ZXIuc3VtVG90ID0gc2VsZkNsdXN0ZXJTdW1Ub3RfMTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSAvLyBkZWxldGUgdGhlIGVtcHR5IGNsdXN0ZXJzLCBhc3NpZ24gaW5jcmVhc2luZyBjbHVzdGVySWRcblxuXG4gIHZhciBuZXdDbHVzdGVySWRNYXAgPSB7fTtcbiAgdmFyIGNsdXN0ZXJJZHggPSAwO1xuICBPYmplY3Qua2V5cyhjbHVzdGVycykuZm9yRWFjaChmdW5jdGlvbiAoY2x1c3RlcklkKSB7XG4gICAgdmFyIGNsdXN0ZXIgPSBjbHVzdGVyc1tjbHVzdGVySWRdO1xuXG4gICAgaWYgKCFjbHVzdGVyLm5vZGVzIHx8ICFjbHVzdGVyLm5vZGVzLmxlbmd0aCkge1xuICAgICAgZGVsZXRlIGNsdXN0ZXJzW2NsdXN0ZXJJZF07XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIG5ld0lkID0gU3RyaW5nKGNsdXN0ZXJJZHggKyAxKTtcblxuICAgIGlmIChuZXdJZCA9PT0gY2x1c3RlcklkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY2x1c3Rlci5pZCA9IG5ld0lkO1xuICAgIGNsdXN0ZXIubm9kZXMgPSBjbHVzdGVyLm5vZGVzLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaWQ6IGl0ZW0uaWQsXG4gICAgICAgIGNsdXN0ZXJJZDogbmV3SWRcbiAgICAgIH07XG4gICAgfSk7XG4gICAgY2x1c3RlcnNbbmV3SWRdID0gY2x1c3RlcjtcbiAgICBuZXdDbHVzdGVySWRNYXBbY2x1c3RlcklkXSA9IG5ld0lkO1xuICAgIGRlbGV0ZSBjbHVzdGVyc1tjbHVzdGVySWRdO1xuICAgIGNsdXN0ZXJJZHgrKztcbiAgfSk7XG4gIG5vZGVzLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcbiAgICBpZiAobm9kZS5jbHVzdGVySWQgJiYgbmV3Q2x1c3RlcklkTWFwW25vZGUuY2x1c3RlcklkXSkgbm9kZS5jbHVzdGVySWQgPSBuZXdDbHVzdGVySWRNYXBbbm9kZS5jbHVzdGVySWRdO1xuICB9KTsgLy8gZ2V0IHRoZSBjbHVzdGVyIGVkZ2VzXG5cbiAgdmFyIGNsdXN0ZXJFZGdlcyA9IFtdO1xuICB2YXIgY2x1c3RlckVkZ2VNYXAgPSB7fTtcbiAgZWRnZXMuZm9yRWFjaChmdW5jdGlvbiAoZWRnZSkge1xuICAgIHZhciBzb3VyY2UgPSBlZGdlLnNvdXJjZSxcbiAgICAgICAgdGFyZ2V0ID0gZWRnZS50YXJnZXQ7XG4gICAgdmFyIHdlaWdodCA9IGVkZ2Vbd2VpZ2h0UHJvcGVydHlOYW1lXSB8fCAxO1xuICAgIHZhciBzb3VyY2VDbHVzdGVySWQgPSBub2RlTWFwW3NvdXJjZV0ubm9kZS5jbHVzdGVySWQ7XG4gICAgdmFyIHRhcmdldENsdXN0ZXJJZCA9IG5vZGVNYXBbdGFyZ2V0XS5ub2RlLmNsdXN0ZXJJZDtcbiAgICB2YXIgbmV3RWRnZUlkID0gc291cmNlQ2x1c3RlcklkICsgXCItLS1cIiArIHRhcmdldENsdXN0ZXJJZDtcblxuICAgIGlmIChjbHVzdGVyRWRnZU1hcFtuZXdFZGdlSWRdKSB7XG4gICAgICBjbHVzdGVyRWRnZU1hcFtuZXdFZGdlSWRdLndlaWdodCArPSB3ZWlnaHQ7XG4gICAgICBjbHVzdGVyRWRnZU1hcFtuZXdFZGdlSWRdLmNvdW50Kys7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBuZXdFZGdlID0ge1xuICAgICAgICBzb3VyY2U6IHNvdXJjZUNsdXN0ZXJJZCxcbiAgICAgICAgdGFyZ2V0OiB0YXJnZXRDbHVzdGVySWQsXG4gICAgICAgIHdlaWdodDogd2VpZ2h0LFxuICAgICAgICBjb3VudDogMVxuICAgICAgfTtcbiAgICAgIGNsdXN0ZXJFZGdlTWFwW25ld0VkZ2VJZF0gPSBuZXdFZGdlO1xuICAgICAgY2x1c3RlckVkZ2VzLnB1c2gobmV3RWRnZSk7XG4gICAgfVxuICB9KTtcbiAgdmFyIGNsdXN0ZXJzQXJyYXkgPSBbXTtcbiAgT2JqZWN0LmtleXMoY2x1c3RlcnMpLmZvckVhY2goZnVuY3Rpb24gKGNsdXN0ZXJJZCkge1xuICAgIGNsdXN0ZXJzQXJyYXkucHVzaChjbHVzdGVyc1tjbHVzdGVySWRdKTtcbiAgfSk7XG4gIHJldHVybiB7XG4gICAgY2x1c3RlcnM6IGNsdXN0ZXJzQXJyYXksXG4gICAgY2x1c3RlckVkZ2VzOiBjbHVzdGVyRWRnZXNcbiAgfTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGxvdXZhaW47IiwiLyoqXG4gKiDlubbmn6Xpm4YgRGlzam9pbnQgc2V0IHRvIHN1cHBvcnQgcXVpY2sgdW5pb25cbiAqL1xudmFyIFVuaW9uRmluZCA9XG4vKiogQGNsYXNzICovXG5mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFVuaW9uRmluZChpdGVtcykge1xuICAgIHRoaXMuY291bnQgPSBpdGVtcy5sZW5ndGg7XG4gICAgdGhpcy5wYXJlbnQgPSB7fTtcblxuICAgIGZvciAodmFyIF9pID0gMCwgaXRlbXNfMSA9IGl0ZW1zOyBfaSA8IGl0ZW1zXzEubGVuZ3RoOyBfaSsrKSB7XG4gICAgICB2YXIgaSA9IGl0ZW1zXzFbX2ldO1xuICAgICAgdGhpcy5wYXJlbnRbaV0gPSBpO1xuICAgIH1cbiAgfSAvLyBmaW5kIHRoZSByb290IG9mIHRoZSBpdGVtXG5cblxuICBVbmlvbkZpbmQucHJvdG90eXBlLmZpbmQgPSBmdW5jdGlvbiAoaXRlbSkge1xuICAgIHdoaWxlICh0aGlzLnBhcmVudFtpdGVtXSAhPT0gaXRlbSkge1xuICAgICAgaXRlbSA9IHRoaXMucGFyZW50W2l0ZW1dO1xuICAgIH1cblxuICAgIHJldHVybiBpdGVtO1xuICB9O1xuXG4gIFVuaW9uRmluZC5wcm90b3R5cGUudW5pb24gPSBmdW5jdGlvbiAoYSwgYikge1xuICAgIHZhciByb290QSA9IHRoaXMuZmluZChhKTtcbiAgICB2YXIgcm9vdEIgPSB0aGlzLmZpbmQoYik7XG4gICAgaWYgKHJvb3RBID09PSByb290QikgcmV0dXJuOyAvLyBtYWtlIHRoZSBlbGVtZW50IHdpdGggc21hbGxlciByb290IHRoZSBwYXJlbnRcblxuICAgIGlmIChyb290QSA8IHJvb3RCKSB7XG4gICAgICBpZiAodGhpcy5wYXJlbnRbYl0gIT09IGIpIHRoaXMudW5pb24odGhpcy5wYXJlbnRbYl0sIGEpO1xuICAgICAgdGhpcy5wYXJlbnRbYl0gPSB0aGlzLnBhcmVudFthXTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMucGFyZW50W2FdICE9PSBhKSB0aGlzLnVuaW9uKHRoaXMucGFyZW50W2FdLCBiKTtcbiAgICAgIHRoaXMucGFyZW50W2FdID0gdGhpcy5wYXJlbnRbYl07XG4gICAgfVxuICB9OyAvLyB3aGV0aGVyIGEgYW5kIGIgYXJlIGNvbm5lY3RlZCwgaS5lLiBhIGFuZCBiIGhhdmUgdGhlIHNhbWUgcm9vdFxuXG5cbiAgVW5pb25GaW5kLnByb3RvdHlwZS5jb25uZWN0ZWQgPSBmdW5jdGlvbiAoYSwgYikge1xuICAgIHJldHVybiB0aGlzLmZpbmQoYSkgPT09IHRoaXMuZmluZChiKTtcbiAgfTtcblxuICByZXR1cm4gVW5pb25GaW5kO1xufSgpO1xuXG5leHBvcnQgZGVmYXVsdCBVbmlvbkZpbmQ7IiwidmFyIGRlZmF1bHRDb21wYXJlID0gZnVuY3Rpb24gZGVmYXVsdENvbXBhcmUoYSwgYikge1xuICByZXR1cm4gYSAtIGI7XG59O1xuXG52YXIgTWluQmluYXJ5SGVhcCA9XG4vKiogQGNsYXNzICovXG5mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIE1pbkJpbmFyeUhlYXAoY29tcGFyZUZuKSB7XG4gICAgaWYgKGNvbXBhcmVGbiA9PT0gdm9pZCAwKSB7XG4gICAgICBjb21wYXJlRm4gPSBkZWZhdWx0Q29tcGFyZTtcbiAgICB9XG5cbiAgICB0aGlzLmNvbXBhcmVGbiA9IGNvbXBhcmVGbjtcbiAgICB0aGlzLmxpc3QgPSBbXTtcbiAgfVxuXG4gIE1pbkJpbmFyeUhlYXAucHJvdG90eXBlLmdldExlZnQgPSBmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICByZXR1cm4gMiAqIGluZGV4ICsgMTtcbiAgfTtcblxuICBNaW5CaW5hcnlIZWFwLnByb3RvdHlwZS5nZXRSaWdodCA9IGZ1bmN0aW9uIChpbmRleCkge1xuICAgIHJldHVybiAyICogaW5kZXggKyAyO1xuICB9O1xuXG4gIE1pbkJpbmFyeUhlYXAucHJvdG90eXBlLmdldFBhcmVudCA9IGZ1bmN0aW9uIChpbmRleCkge1xuICAgIGlmIChpbmRleCA9PT0gMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIE1hdGguZmxvb3IoKGluZGV4IC0gMSkgLyAyKTtcbiAgfTtcblxuICBNaW5CaW5hcnlIZWFwLnByb3RvdHlwZS5pc0VtcHR5ID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLmxpc3QubGVuZ3RoIDw9IDA7XG4gIH07XG5cbiAgTWluQmluYXJ5SGVhcC5wcm90b3R5cGUudG9wID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLmlzRW1wdHkoKSA/IHVuZGVmaW5lZCA6IHRoaXMubGlzdFswXTtcbiAgfTtcblxuICBNaW5CaW5hcnlIZWFwLnByb3RvdHlwZS5kZWxNaW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHRvcCA9IHRoaXMudG9wKCk7XG4gICAgdmFyIGJvdHRvbSA9IHRoaXMubGlzdC5wb3AoKTtcblxuICAgIGlmICh0aGlzLmxpc3QubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5saXN0WzBdID0gYm90dG9tO1xuICAgICAgdGhpcy5tb3ZlRG93bigwKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdG9wO1xuICB9O1xuXG4gIE1pbkJpbmFyeUhlYXAucHJvdG90eXBlLmluc2VydCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgdGhpcy5saXN0LnB1c2godmFsdWUpO1xuICAgICAgdmFyIGluZGV4ID0gdGhpcy5saXN0Lmxlbmd0aCAtIDE7XG4gICAgICB0aGlzLm1vdmVVcChpbmRleCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG5cbiAgTWluQmluYXJ5SGVhcC5wcm90b3R5cGUubW92ZVVwID0gZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgdmFyIHBhcmVudCA9IHRoaXMuZ2V0UGFyZW50KGluZGV4KTtcblxuICAgIHdoaWxlIChpbmRleCAmJiBpbmRleCA+IDAgJiYgdGhpcy5jb21wYXJlRm4odGhpcy5saXN0W3BhcmVudF0sIHRoaXMubGlzdFtpbmRleF0pID4gMCkge1xuICAgICAgLy8gc3dhcFxuICAgICAgdmFyIHRtcCA9IHRoaXMubGlzdFtwYXJlbnRdO1xuICAgICAgdGhpcy5saXN0W3BhcmVudF0gPSB0aGlzLmxpc3RbaW5kZXhdO1xuICAgICAgdGhpcy5saXN0W2luZGV4XSA9IHRtcDsgLy8gW3RoaXMubGlzdFtpbmRleF0sIHRoaXMubGlzdFtwYXJlbnRdXSA9IFt0aGlzLmxpc3RbcGFyZW50XSwgdGhpcy5saXN0W2luZGV4XV1cblxuICAgICAgaW5kZXggPSBwYXJlbnQ7XG4gICAgICBwYXJlbnQgPSB0aGlzLmdldFBhcmVudChpbmRleCk7XG4gICAgfVxuICB9O1xuXG4gIE1pbkJpbmFyeUhlYXAucHJvdG90eXBlLm1vdmVEb3duID0gZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgdmFyIF9hO1xuXG4gICAgdmFyIGVsZW1lbnQgPSBpbmRleDtcbiAgICB2YXIgbGVmdCA9IHRoaXMuZ2V0TGVmdChpbmRleCk7XG4gICAgdmFyIHJpZ2h0ID0gdGhpcy5nZXRSaWdodChpbmRleCk7XG4gICAgdmFyIHNpemUgPSB0aGlzLmxpc3QubGVuZ3RoO1xuXG4gICAgaWYgKGxlZnQgIT09IG51bGwgJiYgbGVmdCA8IHNpemUgJiYgdGhpcy5jb21wYXJlRm4odGhpcy5saXN0W2VsZW1lbnRdLCB0aGlzLmxpc3RbbGVmdF0pID4gMCkge1xuICAgICAgZWxlbWVudCA9IGxlZnQ7XG4gICAgfSBlbHNlIGlmIChyaWdodCAhPT0gbnVsbCAmJiByaWdodCA8IHNpemUgJiYgdGhpcy5jb21wYXJlRm4odGhpcy5saXN0W2VsZW1lbnRdLCB0aGlzLmxpc3RbcmlnaHRdKSA+IDApIHtcbiAgICAgIGVsZW1lbnQgPSByaWdodDtcbiAgICB9XG5cbiAgICBpZiAoaW5kZXggIT09IGVsZW1lbnQpIHtcbiAgICAgIF9hID0gW3RoaXMubGlzdFtlbGVtZW50XSwgdGhpcy5saXN0W2luZGV4XV0sIHRoaXMubGlzdFtpbmRleF0gPSBfYVswXSwgdGhpcy5saXN0W2VsZW1lbnRdID0gX2FbMV07XG4gICAgICB0aGlzLm1vdmVEb3duKGVsZW1lbnQpO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gTWluQmluYXJ5SGVhcDtcbn0oKTtcblxuZXhwb3J0IGRlZmF1bHQgTWluQmluYXJ5SGVhcDsiLCJpbXBvcnQgVW5pb25GaW5kIGZyb20gJy4vc3RydWN0cy91bmlvbi1maW5kJztcbmltcG9ydCBNaW5CaW5hcnlIZWFwIGZyb20gJy4vc3RydWN0cy9iaW5hcnktaGVhcCc7XG5pbXBvcnQgeyBnZXRFZGdlc0J5Tm9kZUlkIH0gZnJvbSAnLi91dGlsJztcbi8qKlxuICogUHJpbSBhbGdvcml0aG3vvIx1c2UgcHJpb3JpdHkgcXVldWXvvIzlpI3mnYLluqYgTyhFK1YqbG9nViksIFY6IOiKgueCueaVsOmHj++8jEU6IOi+ueeahOaVsOmHj1xuICogcmVmZXI6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1ByaW0lMjdzX2FsZ29yaXRobVxuICogQHBhcmFtIGdyYXBoXG4gKiBAcGFyYW0gd2VpZ2h0IOaMh+WumueUqOS6juS9nOS4uui+ueadg+mHjeeahOWxnuaAp++8jOiLpeS4jeaMh+Wumu+8jOWImeiupOS4uuaJgOaciei+ueadg+mHjeS4gOiHtFxuICovXG5cbnZhciBwcmltTVNUID0gZnVuY3Rpb24gcHJpbU1TVChncmFwaERhdGEsIHdlaWdodCkge1xuICB2YXIgc2VsZWN0ZWRFZGdlcyA9IFtdO1xuICB2YXIgX2EgPSBncmFwaERhdGEubm9kZXMsXG4gICAgICBub2RlcyA9IF9hID09PSB2b2lkIDAgPyBbXSA6IF9hLFxuICAgICAgX2IgPSBncmFwaERhdGEuZWRnZXMsXG4gICAgICBlZGdlcyA9IF9iID09PSB2b2lkIDAgPyBbXSA6IF9iO1xuXG4gIGlmIChub2Rlcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gc2VsZWN0ZWRFZGdlcztcbiAgfSAvLyDku45ub2Rlc1swXeW8gOWni1xuXG5cbiAgdmFyIGN1cnJOb2RlID0gbm9kZXNbMF07XG4gIHZhciB2aXNpdGVkID0gbmV3IFNldCgpO1xuICB2aXNpdGVkLmFkZChjdXJyTm9kZSk7IC8vIOeUqOS6jOWPieWghue7tOaKpOi3neW3suWKoOWFpeiKgueCueeahOWFtuS7luiKgueCueeahOi+ueeahOadg+WAvFxuXG4gIHZhciBjb21wYXJlV2VpZ2h0ID0gZnVuY3Rpb24gY29tcGFyZVdlaWdodChhLCBiKSB7XG4gICAgaWYgKHdlaWdodCkge1xuICAgICAgcmV0dXJuIGEud2VpZ2h0IC0gYi53ZWlnaHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIDA7XG4gIH07XG5cbiAgdmFyIGVkZ2VRdWV1ZSA9IG5ldyBNaW5CaW5hcnlIZWFwKGNvbXBhcmVXZWlnaHQpO1xuICBnZXRFZGdlc0J5Tm9kZUlkKGN1cnJOb2RlLmlkLCBlZGdlcykuZm9yRWFjaChmdW5jdGlvbiAoZWRnZSkge1xuICAgIGVkZ2VRdWV1ZS5pbnNlcnQoZWRnZSk7XG4gIH0pO1xuXG4gIHdoaWxlICghZWRnZVF1ZXVlLmlzRW1wdHkoKSkge1xuICAgIC8vIOmAieWPluS4juW3suWKoOWFpeeahOe7k+eCueS5i+mXtOi+ueadg+acgOWwj+eahOe7k+eCuVxuICAgIHZhciBjdXJyRWRnZSA9IGVkZ2VRdWV1ZS5kZWxNaW4oKTtcbiAgICB2YXIgc291cmNlID0gY3VyckVkZ2Uuc291cmNlO1xuICAgIHZhciB0YXJnZXQgPSBjdXJyRWRnZS50YXJnZXQ7XG4gICAgaWYgKHZpc2l0ZWQuaGFzKHNvdXJjZSkgJiYgdmlzaXRlZC5oYXModGFyZ2V0KSkgY29udGludWU7XG4gICAgc2VsZWN0ZWRFZGdlcy5wdXNoKGN1cnJFZGdlKTtcblxuICAgIGlmICghdmlzaXRlZC5oYXMoc291cmNlKSkge1xuICAgICAgdmlzaXRlZC5hZGQoc291cmNlKTtcbiAgICAgIGdldEVkZ2VzQnlOb2RlSWQoc291cmNlLCBlZGdlcykuZm9yRWFjaChmdW5jdGlvbiAoZWRnZSkge1xuICAgICAgICBlZGdlUXVldWUuaW5zZXJ0KGVkZ2UpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKCF2aXNpdGVkLmhhcyh0YXJnZXQpKSB7XG4gICAgICB2aXNpdGVkLmFkZCh0YXJnZXQpO1xuICAgICAgZ2V0RWRnZXNCeU5vZGVJZCh0YXJnZXQsIGVkZ2VzKS5mb3JFYWNoKGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgICAgIGVkZ2VRdWV1ZS5pbnNlcnQoZWRnZSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc2VsZWN0ZWRFZGdlcztcbn07XG4vKipcbiAqIEtydXNrYWwgYWxnb3JpdGht77yM5aSN5p2C5bqmIE8oRSpsb2dFKSwgRTog6L6555qE5pWw6YePXG4gKiByZWZlcjogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvS3J1c2thbCUyN3NfYWxnb3JpdGhtXG4gKiBAcGFyYW0gZ3JhcGhcbiAqIEBwYXJhbSB3ZWlnaHQg5oyH5a6a55So5LqO5L2c5Li66L655p2D6YeN55qE5bGe5oCn77yM6Iul5LiN5oyH5a6a77yM5YiZ6K6k5Li65omA5pyJ6L655p2D6YeN5LiA6Ie0XG4gKiBAcmV0dXJuIElFZGdlW10g6L+U5Zue5p6E5oiQTVNU55qE6L6555qE5pWw57uEXG4gKi9cblxuXG52YXIga3J1c2thbE1TVCA9IGZ1bmN0aW9uIGtydXNrYWxNU1QoZ3JhcGhEYXRhLCB3ZWlnaHQpIHtcbiAgdmFyIHNlbGVjdGVkRWRnZXMgPSBbXTtcbiAgdmFyIF9hID0gZ3JhcGhEYXRhLm5vZGVzLFxuICAgICAgbm9kZXMgPSBfYSA9PT0gdm9pZCAwID8gW10gOiBfYSxcbiAgICAgIF9iID0gZ3JhcGhEYXRhLmVkZ2VzLFxuICAgICAgZWRnZXMgPSBfYiA9PT0gdm9pZCAwID8gW10gOiBfYjtcblxuICBpZiAobm9kZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHNlbGVjdGVkRWRnZXM7XG4gIH0gLy8g6Iul5oyH5a6ad2VpZ2h077yM5YiZ5bCG5omA5pyJ55qE6L655oyJ5p2D5YC85LuO5bCP5Yiw5aSn5o6S5bqPXG5cblxuICB2YXIgd2VpZ2h0RWRnZXMgPSBlZGdlcy5tYXAoZnVuY3Rpb24gKGVkZ2UpIHtcbiAgICByZXR1cm4gZWRnZTtcbiAgfSk7XG5cbiAgaWYgKHdlaWdodCkge1xuICAgIHdlaWdodEVkZ2VzLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgIHJldHVybiBhLndlaWdodCAtIGIud2VpZ2h0O1xuICAgIH0pO1xuICB9XG5cbiAgdmFyIGRpc2pvaW50U2V0ID0gbmV3IFVuaW9uRmluZChub2Rlcy5tYXAoZnVuY3Rpb24gKG4pIHtcbiAgICByZXR1cm4gbi5pZDtcbiAgfSkpOyAvLyDku47mnYPlgLzmnIDlsI/nmoTovrnlvIDlp4vvvIzlpoLmnpzov5nmnaHovrnov57mjqXnmoTkuKTkuKroioLngrnkuo7lm75H5Lit5LiN5Zyo5ZCM5LiA5Liq6L+e6YCa5YiG6YeP5Lit77yM5YiZ5re75Yqg6L+Z5p2h6L65XG4gIC8vIOebtOWIsOmBjeWOhuWujOaJgOacieeCueaIlui+uVxuXG4gIHdoaWxlICh3ZWlnaHRFZGdlcy5sZW5ndGggPiAwKSB7XG4gICAgdmFyIGN1ckVkZ2UgPSB3ZWlnaHRFZGdlcy5zaGlmdCgpO1xuICAgIHZhciBzb3VyY2UgPSBjdXJFZGdlLnNvdXJjZTtcbiAgICB2YXIgdGFyZ2V0ID0gY3VyRWRnZS50YXJnZXQ7XG5cbiAgICBpZiAoIWRpc2pvaW50U2V0LmNvbm5lY3RlZChzb3VyY2UsIHRhcmdldCkpIHtcbiAgICAgIHNlbGVjdGVkRWRnZXMucHVzaChjdXJFZGdlKTtcbiAgICAgIGRpc2pvaW50U2V0LnVuaW9uKHNvdXJjZSwgdGFyZ2V0KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc2VsZWN0ZWRFZGdlcztcbn07XG4vKipcbiAqIOacgOWwj+eUn+aIkOagkVxuICogcmVmZXI6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0tydXNrYWwlMjdzX2FsZ29yaXRobVxuICogQHBhcmFtIGdyYXBoXG4gKiBAcGFyYW0gd2VpZ2h0IOaMh+WumueUqOS6juS9nOS4uui+ueadg+mHjeeahOWxnuaAp++8jOiLpeS4jeaMh+Wumu+8jOWImeiupOS4uuaJgOaciei+ueadg+mHjeS4gOiHtFxuICogQHBhcmFtIGFsZ28gJ3ByaW0nIHwgJ2tydXNrYWwnIOeul+azleexu+Wei1xuICogQHJldHVybiBFZGdlQ29uZmlnW10g6L+U5Zue5p6E5oiQTVNU55qE6L6555qE5pWw57uEXG4gKi9cblxuXG52YXIgbWluaW11bVNwYW5uaW5nVHJlZSA9IGZ1bmN0aW9uIG1pbmltdW1TcGFubmluZ1RyZWUoZ3JhcGhEYXRhLCB3ZWlnaHQsIGFsZ28pIHtcbiAgdmFyIGFsZ29zID0ge1xuICAgIHByaW06IHByaW1NU1QsXG4gICAga3J1c2thbDoga3J1c2thbE1TVFxuICB9O1xuICBpZiAoIWFsZ28pIHJldHVybiBrcnVza2FsTVNUKGdyYXBoRGF0YSwgd2VpZ2h0KTtcbiAgcmV0dXJuIGFsZ29zW2FsZ29dKGdyYXBoRGF0YSwgd2VpZ2h0KTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IG1pbmltdW1TcGFubmluZ1RyZWU7IiwiaW1wb3J0IGRlZ3JlZSBmcm9tICcuL2RlZ3JlZSc7XG5pbXBvcnQgeyBnZXROZWlnaGJvcnMgfSBmcm9tIFwiLi91dGlsXCI7XG4vKipcbiAqIFBhZ2VSYW5rIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1BhZ2VSYW5rXG4gKiByZWZlcjogaHR0cHM6Ly9naXRodWIuY29tL2FudmFrYS9uZ3JhcGgucGFnZXJhbmtcbiAqIEBwYXJhbSBncmFwaFxuICogQHBhcmFtIGVwc2lsb24g5Yik5pat5piv5ZCm5pS25pWb55qE57K+5bqm5YC877yM6buY6K6kIDAuMDAwMDAxXG4gKiBAcGFyYW0gbGlua1Byb2Ig6Zi75bC857O75pWw77yIZHVtcGluZyBmYWN0b3LvvInvvIzmjIfku7vmhI/ml7bliLvvvIznlKjmiLforr/pl67liLDmn5DoioLngrnlkI7nu6fnu63orr/pl67or6XoioLngrnpk77mjqXnmoTkuIvkuIDkuKroioLngrnnmoTmpoLnjofvvIznu4/pqozlgLwgMC44NVxuICovXG5cbnZhciBwYWdlUmFuayA9IGZ1bmN0aW9uIHBhZ2VSYW5rKGdyYXBoRGF0YSwgZXBzaWxvbiwgbGlua1Byb2IpIHtcbiAgaWYgKHR5cGVvZiBlcHNpbG9uICE9PSAnbnVtYmVyJykgZXBzaWxvbiA9IDAuMDAwMDAxO1xuICBpZiAodHlwZW9mIGxpbmtQcm9iICE9PSAnbnVtYmVyJykgbGlua1Byb2IgPSAwLjg1O1xuICB2YXIgZGlzdGFuY2UgPSAxO1xuICB2YXIgbGVha2VkUmFuayA9IDA7XG4gIHZhciBtYXhJdGVyYXRpb25zID0gMTAwMDtcbiAgdmFyIF9hID0gZ3JhcGhEYXRhLm5vZGVzLFxuICAgICAgbm9kZXMgPSBfYSA9PT0gdm9pZCAwID8gW10gOiBfYSxcbiAgICAgIF9iID0gZ3JhcGhEYXRhLmVkZ2VzLFxuICAgICAgZWRnZXMgPSBfYiA9PT0gdm9pZCAwID8gW10gOiBfYjtcbiAgdmFyIG5vZGVzQ291bnQgPSBub2Rlcy5sZW5ndGg7XG4gIHZhciBjdXJyZW50UmFuaztcbiAgdmFyIGN1clJhbmtzID0ge307XG4gIHZhciBwcmV2UmFua3MgPSB7fTsgLy8gSW5pdGlhbGl6ZSBwYWdlcmFua3Mg5Yid5aeL5YyWXG5cbiAgZm9yICh2YXIgaiA9IDA7IGogPCBub2Rlc0NvdW50OyArK2opIHtcbiAgICB2YXIgbm9kZSA9IG5vZGVzW2pdO1xuICAgIHZhciBub2RlSWQgPSBub2RlLmlkO1xuICAgIGN1clJhbmtzW25vZGVJZF0gPSAxIC8gbm9kZXNDb3VudDtcbiAgICBwcmV2UmFua3Nbbm9kZUlkXSA9IDEgLyBub2Rlc0NvdW50O1xuICB9XG5cbiAgdmFyIG5vZGVEZWdyZWUgPSBkZWdyZWUoZ3JhcGhEYXRhKTtcblxuICB3aGlsZSAobWF4SXRlcmF0aW9ucyA+IDAgJiYgZGlzdGFuY2UgPiBlcHNpbG9uKSB7XG4gICAgbGVha2VkUmFuayA9IDA7XG5cbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IG5vZGVzQ291bnQ7ICsraikge1xuICAgICAgdmFyIG5vZGUgPSBub2Rlc1tqXTtcbiAgICAgIHZhciBub2RlSWQgPSBub2RlLmlkO1xuICAgICAgY3VycmVudFJhbmsgPSAwO1xuXG4gICAgICBpZiAobm9kZURlZ3JlZVtub2RlLmlkXS5pbkRlZ3JlZSA9PT0gMCkge1xuICAgICAgICBjdXJSYW5rc1tub2RlSWRdID0gMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBuZWlnaGJvcnMgPSBnZXROZWlnaGJvcnMobm9kZUlkLCBlZGdlcywgJ3NvdXJjZScpO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmVpZ2hib3JzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgdmFyIG5laWdoYm9yID0gbmVpZ2hib3JzW2ldO1xuICAgICAgICAgIHZhciBvdXREZWdyZWUgPSBub2RlRGVncmVlW25laWdoYm9yXS5vdXREZWdyZWU7XG4gICAgICAgICAgaWYgKG91dERlZ3JlZSA+IDApIGN1cnJlbnRSYW5rICs9IHByZXZSYW5rc1tuZWlnaGJvcl0gLyBvdXREZWdyZWU7XG4gICAgICAgIH1cblxuICAgICAgICBjdXJSYW5rc1tub2RlSWRdID0gbGlua1Byb2IgKiBjdXJyZW50UmFuaztcbiAgICAgICAgbGVha2VkUmFuayArPSBjdXJSYW5rc1tub2RlSWRdO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxlYWtlZFJhbmsgPSAoMSAtIGxlYWtlZFJhbmspIC8gbm9kZXNDb3VudDtcbiAgICBkaXN0YW5jZSA9IDA7XG5cbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IG5vZGVzQ291bnQ7ICsraikge1xuICAgICAgdmFyIG5vZGUgPSBub2Rlc1tqXTtcbiAgICAgIHZhciBub2RlSWQgPSBub2RlLmlkO1xuICAgICAgY3VycmVudFJhbmsgPSBjdXJSYW5rc1tub2RlSWRdICsgbGVha2VkUmFuaztcbiAgICAgIGRpc3RhbmNlICs9IE1hdGguYWJzKGN1cnJlbnRSYW5rIC0gcHJldlJhbmtzW25vZGVJZF0pO1xuICAgICAgcHJldlJhbmtzW25vZGVJZF0gPSBjdXJyZW50UmFuaztcbiAgICB9XG5cbiAgICBtYXhJdGVyYXRpb25zIC09IDE7XG4gIH1cblxuICByZXR1cm4gcHJldlJhbmtzO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgcGFnZVJhbms7IiwiZXhwb3J0IHZhciBWQUNBTlRfRURHRV9JRCA9IC0xO1xuZXhwb3J0IHZhciBWQUNBTlRfTk9ERV9JRCA9IC0xO1xuZXhwb3J0IHZhciBWQUNBTlRfRURHRV9MQUJFTCA9IFwiLTFcIjtcbmV4cG9ydCB2YXIgVkFDQU5UX05PREVfTEFCRUwgPSBcIi0xXCI7XG5leHBvcnQgdmFyIFZBQ0FOVF9HUkFQSF9JRCA9IC0xO1xuZXhwb3J0IHZhciBBVVRPX0VER0VfSUQgPSBcIi0xXCI7XG5cbnZhciBFZGdlID1cbi8qKiBAY2xhc3MgKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gRWRnZShpZCwgZnJvbSwgdG8sIGxhYmVsKSB7XG4gICAgaWYgKGlkID09PSB2b2lkIDApIHtcbiAgICAgIGlkID0gVkFDQU5UX0VER0VfSUQ7XG4gICAgfVxuXG4gICAgaWYgKGZyb20gPT09IHZvaWQgMCkge1xuICAgICAgZnJvbSA9IFZBQ0FOVF9OT0RFX0lEO1xuICAgIH1cblxuICAgIGlmICh0byA9PT0gdm9pZCAwKSB7XG4gICAgICB0byA9IFZBQ0FOVF9OT0RFX0lEO1xuICAgIH1cblxuICAgIGlmIChsYWJlbCA9PT0gdm9pZCAwKSB7XG4gICAgICBsYWJlbCA9IFZBQ0FOVF9FREdFX0xBQkVMO1xuICAgIH1cblxuICAgIHRoaXMuaWQgPSBpZDtcbiAgICB0aGlzLmZyb20gPSBmcm9tO1xuICAgIHRoaXMudG8gPSB0bztcbiAgICB0aGlzLmxhYmVsID0gbGFiZWw7XG4gIH1cblxuICByZXR1cm4gRWRnZTtcbn0oKTtcblxuZXhwb3J0IHsgRWRnZSB9O1xuXG52YXIgTm9kZSA9XG4vKiogQGNsYXNzICovXG5mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIE5vZGUoaWQsIGxhYmVsKSB7XG4gICAgaWYgKGlkID09PSB2b2lkIDApIHtcbiAgICAgIGlkID0gVkFDQU5UX05PREVfSUQ7XG4gICAgfVxuXG4gICAgaWYgKGxhYmVsID09PSB2b2lkIDApIHtcbiAgICAgIGxhYmVsID0gVkFDQU5UX05PREVfTEFCRUw7XG4gICAgfVxuXG4gICAgdGhpcy5pZCA9IGlkO1xuICAgIHRoaXMubGFiZWwgPSBsYWJlbDtcbiAgICB0aGlzLmVkZ2VzID0gW107XG4gICAgdGhpcy5lZGdlTWFwID0ge307XG4gIH1cblxuICBOb2RlLnByb3RvdHlwZS5hZGRFZGdlID0gZnVuY3Rpb24gKGVkZ2UpIHtcbiAgICB0aGlzLmVkZ2VzLnB1c2goZWRnZSk7XG4gICAgdGhpcy5lZGdlTWFwW2VkZ2UuaWRdID0gZWRnZTtcbiAgfTtcblxuICByZXR1cm4gTm9kZTtcbn0oKTtcblxuZXhwb3J0IHsgTm9kZSB9O1xuXG52YXIgR3JhcGggPVxuLyoqIEBjbGFzcyAqL1xuZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBHcmFwaChpZCwgZWRnZUlkQXV0b0luY3JlYXNlLCBkaXJlY3RlZCkge1xuICAgIGlmIChpZCA9PT0gdm9pZCAwKSB7XG4gICAgICBpZCA9IFZBQ0FOVF9OT0RFX0lEO1xuICAgIH1cblxuICAgIGlmIChlZGdlSWRBdXRvSW5jcmVhc2UgPT09IHZvaWQgMCkge1xuICAgICAgZWRnZUlkQXV0b0luY3JlYXNlID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoZGlyZWN0ZWQgPT09IHZvaWQgMCkge1xuICAgICAgZGlyZWN0ZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICB0aGlzLmlkID0gaWQ7XG4gICAgdGhpcy5lZGdlSWRBdXRvSW5jcmVhc2UgPSBlZGdlSWRBdXRvSW5jcmVhc2U7XG4gICAgdGhpcy5lZGdlcyA9IFtdO1xuICAgIHRoaXMubm9kZXMgPSBbXTtcbiAgICB0aGlzLm5vZGVNYXAgPSB7fTtcbiAgICB0aGlzLmVkZ2VNYXAgPSB7fTtcbiAgICB0aGlzLm5vZGVMYWJlbE1hcCA9IHt9O1xuICAgIHRoaXMuZWRnZUxhYmVsTWFwID0ge307XG4gICAgdGhpcy5jb3VudGVyID0gMDtcbiAgICB0aGlzLmRpcmVjdGVkID0gZGlyZWN0ZWQ7XG4gIH1cblxuICBHcmFwaC5wcm90b3R5cGUuZ2V0Tm9kZU51bSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5ub2Rlcy5sZW5ndGg7XG4gIH07XG5cbiAgR3JhcGgucHJvdG90eXBlLmFkZE5vZGUgPSBmdW5jdGlvbiAoaWQsIGxhYmVsKSB7XG4gICAgaWYgKHRoaXMubm9kZU1hcFtpZF0pIHJldHVybjtcbiAgICB2YXIgbm9kZSA9IG5ldyBOb2RlKGlkLCBsYWJlbCk7XG4gICAgdGhpcy5ub2Rlcy5wdXNoKG5vZGUpO1xuICAgIHRoaXMubm9kZU1hcFtpZF0gPSBub2RlO1xuICAgIGlmICghdGhpcy5ub2RlTGFiZWxNYXBbbGFiZWxdKSB0aGlzLm5vZGVMYWJlbE1hcFtsYWJlbF0gPSBbXTtcbiAgICB0aGlzLm5vZGVMYWJlbE1hcFtsYWJlbF0ucHVzaChpZCk7XG4gIH07XG5cbiAgR3JhcGgucHJvdG90eXBlLmFkZEVkZ2UgPSBmdW5jdGlvbiAoaWQsIGZyb20sIHRvLCBsYWJlbCkge1xuICAgIGlmICh0aGlzLmVkZ2VJZEF1dG9JbmNyZWFzZSB8fCBpZCA9PT0gdW5kZWZpbmVkKSBpZCA9IHRoaXMuY291bnRlcisrO1xuICAgIGlmICh0aGlzLm5vZGVNYXBbZnJvbV0gJiYgdGhpcy5ub2RlTWFwW3RvXSAmJiB0aGlzLm5vZGVNYXBbdG9dLmVkZ2VNYXBbaWRdKSByZXR1cm47XG4gICAgdmFyIGVkZ2UgPSBuZXcgRWRnZShpZCwgZnJvbSwgdG8sIGxhYmVsKTtcbiAgICB0aGlzLmVkZ2VzLnB1c2goZWRnZSk7XG4gICAgdGhpcy5lZGdlTWFwW2lkXSA9IGVkZ2U7XG4gICAgdGhpcy5ub2RlTWFwW2Zyb21dLmFkZEVkZ2UoZWRnZSk7XG4gICAgaWYgKCF0aGlzLmVkZ2VMYWJlbE1hcFtsYWJlbF0pIHRoaXMuZWRnZUxhYmVsTWFwW2xhYmVsXSA9IFtdO1xuICAgIHRoaXMuZWRnZUxhYmVsTWFwW2xhYmVsXS5wdXNoKGVkZ2UpO1xuXG4gICAgaWYgKCF0aGlzLmRpcmVjdGVkKSB7XG4gICAgICB2YXIgckVkZ2UgPSBuZXcgRWRnZShpZCwgdG8sIGZyb20sIGxhYmVsKTtcbiAgICAgIHRoaXMubm9kZU1hcFt0b10uYWRkRWRnZShyRWRnZSk7XG4gICAgICB0aGlzLmVkZ2VMYWJlbE1hcFtsYWJlbF0ucHVzaChyRWRnZSk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBHcmFwaDtcbn0oKTtcblxuZXhwb3J0IHsgR3JhcGggfTsiLCJpbXBvcnQgeyBjbG9uZSB9IGZyb20gXCJAYW50di91dGlsXCI7XG5pbXBvcnQgeyBHcmFwaCwgVkFDQU5UX05PREVfTEFCRUwsIFZBQ0FOVF9HUkFQSF9JRCwgVkFDQU5UX0VER0VfTEFCRUwgfSBmcm9tIFwiLi9zdHJ1Y3RcIjtcblxudmFyIERGU2VkZ2UgPVxuLyoqIEBjbGFzcyAqL1xuZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBERlNlZGdlKGZyb21Ob2RlLCB0b05vZGUsIGZyb21Ob2RlTGFiZWwsIGVkZ2VMYWJlbCwgdG9Ob2RlTGFiZWwpIHtcbiAgICB0aGlzLmZyb21Ob2RlID0gZnJvbU5vZGU7XG4gICAgdGhpcy50b05vZGUgPSB0b05vZGU7XG4gICAgdGhpcy5ub2RlRWRnZU5vZGVMYWJlbCA9IHtcbiAgICAgIG5vZGVMYWJlbDE6IGZyb21Ob2RlTGFiZWwgfHwgVkFDQU5UX05PREVfTEFCRUwsXG4gICAgICBlZGdlTGFiZWw6IGVkZ2VMYWJlbCB8fCBWQUNBTlRfRURHRV9MQUJFTCxcbiAgICAgIG5vZGVMYWJlbDI6IHRvTm9kZUxhYmVsIHx8IFZBQ0FOVF9OT0RFX0xBQkVMXG4gICAgfTtcbiAgfVxuXG4gIERGU2VkZ2UucHJvdG90eXBlLmVxdWFsVG8gPSBmdW5jdGlvbiAob3RoZXIpIHtcbiAgICByZXR1cm4gdGhpcy5mcm9tTm9kZSA9PT0gb3RoZXIuZm9ybU5vZGUgJiYgdGhpcy50b05vZGUgPT09IG90aGVyLnRvTm9kZSAmJiB0aGlzLm5vZGVFZGdlTm9kZUxhYmVsID09PSBvdGhlci5ub2RlRWRnZU5vZGVMYWJlbDtcbiAgfTtcblxuICBERlNlZGdlLnByb3RvdHlwZS5ub3RFcXVhbFRvID0gZnVuY3Rpb24gKG90aGVyKSB7XG4gICAgcmV0dXJuICF0aGlzLmVxdWFsVG8ob3RoZXIpO1xuICB9O1xuXG4gIHJldHVybiBERlNlZGdlO1xufSgpOyAvLyBERlNjb2RlIOaYryBERVNlZGdlIOeahOaVsOe7hFxuXG5cbnZhciBERlNjb2RlID1cbi8qKiBAY2xhc3MgKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gREZTY29kZSgpIHtcbiAgICB0aGlzLnJtcGF0aCA9IFtdO1xuICAgIHRoaXMuZGZzRWRnZUxpc3QgPSBbXTtcbiAgfVxuXG4gIERGU2NvZGUucHJvdG90eXBlLmVxdWFsVG8gPSBmdW5jdGlvbiAob3RoZXIpIHtcbiAgICB2YXIgYUxlbmd0aCA9IHRoaXMuZGZzRWRnZUxpc3QubGVuZ3RoO1xuICAgIHZhciBiTGVuZ3RoID0gb3RoZXIubGVuZ3RoO1xuICAgIGlmIChhTGVuZ3RoICE9PSBiTGVuZ3RoKSByZXR1cm4gZmFsc2U7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFMZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMuZGZzRWRnZUxpc3RbaV0gIT09IG90aGVyW2ldKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG5cbiAgREZTY29kZS5wcm90b3R5cGUubm90RXF1YWxUbyA9IGZ1bmN0aW9uIChvdGhlcikge1xuICAgIHJldHVybiAhdGhpcy5lcXVhbFRvKG90aGVyKTtcbiAgfTtcbiAgLyoqIOWinuWKoOS4gOadoSBlZGdlIOWIsCBERlNjb2RlICovXG5cblxuICBERlNjb2RlLnByb3RvdHlwZS5wdXNoQmFjayA9IGZ1bmN0aW9uIChmcm9tTm9kZSwgdG9Ob2RlLCBmcm9tTm9kZUxhYmVsLCBlZGdlTGFiZWwsIHRvTm9kZUxhYmVsKSB7XG4gICAgdGhpcy5kZnNFZGdlTGlzdC5wdXNoKG5ldyBERlNlZGdlKGZyb21Ob2RlLCB0b05vZGUsIGZyb21Ob2RlTGFiZWwsIGVkZ2VMYWJlbCwgdG9Ob2RlTGFiZWwpKTtcbiAgICByZXR1cm4gdGhpcy5kZnNFZGdlTGlzdDtcbiAgfTtcbiAgLyoqIOagueaNriBkZnMg5p6E5bu65Zu+ICovXG5cblxuICBERlNjb2RlLnByb3RvdHlwZS50b0dyYXBoID0gZnVuY3Rpb24gKGdyYXBoSWQsIGRpcmVjdGVkKSB7XG4gICAgaWYgKGdyYXBoSWQgPT09IHZvaWQgMCkge1xuICAgICAgZ3JhcGhJZCA9IFZBQ0FOVF9HUkFQSF9JRDtcbiAgICB9XG5cbiAgICBpZiAoZGlyZWN0ZWQgPT09IHZvaWQgMCkge1xuICAgICAgZGlyZWN0ZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICB2YXIgZ3JhcGggPSBuZXcgR3JhcGgoZ3JhcGhJZCwgdHJ1ZSwgZGlyZWN0ZWQpO1xuICAgIHRoaXMuZGZzRWRnZUxpc3QuZm9yRWFjaChmdW5jdGlvbiAoZGZzRWRnZSkge1xuICAgICAgdmFyIGZyb21Ob2RlSWQgPSBkZnNFZGdlLmZyb21Ob2RlO1xuICAgICAgdmFyIHRvTm9kZUlkID0gZGZzRWRnZS50b05vZGU7XG4gICAgICB2YXIgX2EgPSBkZnNFZGdlLm5vZGVFZGdlTm9kZUxhYmVsLFxuICAgICAgICAgIG5vZGVMYWJlbDEgPSBfYS5ub2RlTGFiZWwxLFxuICAgICAgICAgIGVkZ2VMYWJlbCA9IF9hLmVkZ2VMYWJlbCxcbiAgICAgICAgICBub2RlTGFiZWwyID0gX2Eubm9kZUxhYmVsMjtcbiAgICAgIGlmIChub2RlTGFiZWwxICE9PSBWQUNBTlRfTk9ERV9MQUJFTCkgZ3JhcGguYWRkTm9kZShmcm9tTm9kZUlkLCBub2RlTGFiZWwxKTtcbiAgICAgIGlmIChub2RlTGFiZWwyICE9PSBWQUNBTlRfTk9ERV9MQUJFTCkgZ3JhcGguYWRkTm9kZSh0b05vZGVJZCwgbm9kZUxhYmVsMik7XG4gICAgICBpZiAobm9kZUxhYmVsMSAhPT0gVkFDQU5UX05PREVfTEFCRUwgJiYgbm9kZUxhYmVsMiAhPT0gbm9kZUxhYmVsMSkgZ3JhcGguYWRkRWRnZSh1bmRlZmluZWQsIGZyb21Ob2RlSWQsIHRvTm9kZUlkLCBlZGdlTGFiZWwpO1xuICAgIH0pO1xuICAgIHJldHVybiBncmFwaDtcbiAgfTsgLy8g5bu656uLIHJpZ2h0bW9zdCBwYXRoXG5cblxuICBERlNjb2RlLnByb3RvdHlwZS5idWlsZFJtcGF0aCA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLnJtcGF0aCA9IFtdO1xuICAgIHZhciBvbGRGcm9tID0gdW5kZWZpbmVkO1xuICAgIHZhciBzZWxmTGVuZ3RoID0gdGhpcy5kZnNFZGdlTGlzdC5sZW5ndGg7XG5cbiAgICBmb3IgKHZhciBpID0gc2VsZkxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgZGZzRWRnZSA9IHRoaXMuZGZzRWRnZUxpc3RbaV07XG4gICAgICB2YXIgZnJvbU5vZGVJZHggPSBkZnNFZGdlLmZyb21Ob2RlO1xuICAgICAgdmFyIHRvTm9kZUlkeCA9IGRmc0VkZ2UudG9Ob2RlO1xuXG4gICAgICBpZiAoZnJvbU5vZGVJZHggPCB0b05vZGVJZHggJiYgKG9sZEZyb20gPT09IHVuZGVmaW5lZCB8fCB0b05vZGVJZHggPT09IG9sZEZyb20pKSB7XG4gICAgICAgIHRoaXMucm1wYXRoLnB1c2goaSk7XG4gICAgICAgIG9sZEZyb20gPSBmcm9tTm9kZUlkeDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5ybXBhdGg7XG4gIH07XG5cbiAgREZTY29kZS5wcm90b3R5cGUuZ2V0Tm9kZU51bSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgbm9kZU1hcCA9IHt9O1xuICAgIHRoaXMuZGZzRWRnZUxpc3QuZm9yRWFjaChmdW5jdGlvbiAoZGZzRWRnZSkge1xuICAgICAgaWYgKCFub2RlTWFwW2Rmc0VkZ2UuZnJvbU5vZGVdKSBub2RlTWFwW2Rmc0VkZ2UuZnJvbU5vZGVdID0gdHJ1ZTtcbiAgICAgIGlmICghbm9kZU1hcFtkZnNFZGdlLnRvTm9kZV0pIG5vZGVNYXBbZGZzRWRnZS50b05vZGVdID0gdHJ1ZTtcbiAgICB9KTtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMobm9kZU1hcCkubGVuZ3RoO1xuICB9O1xuXG4gIHJldHVybiBERlNjb2RlO1xufSgpO1xuXG52YXIgSGlzdG9yeSA9XG4vKiogQGNsYXNzICovXG5mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEhpc3RvcnkocGRmcykge1xuICAgIHRoaXMuaGlzID0ge307XG4gICAgdGhpcy5ub2Rlc1VzZWQgPSB7fTtcbiAgICB0aGlzLmVkZ2VzVXNlZCA9IHt9O1xuICAgIHRoaXMuZWRnZXMgPSBbXTtcbiAgICBpZiAoIXBkZnMpIHJldHVybjtcblxuICAgIHdoaWxlIChwZGZzKSB7XG4gICAgICB2YXIgZSA9IHBkZnMuZWRnZTtcbiAgICAgIHRoaXMuZWRnZXMucHVzaChlKTtcbiAgICAgIHRoaXMubm9kZXNVc2VkW2UuZnJvbV0gPSAxO1xuICAgICAgdGhpcy5ub2Rlc1VzZWRbZS50b10gPSAxO1xuICAgICAgdGhpcy5lZGdlc1VzZWRbZS5pZF0gPSAxO1xuICAgICAgcGRmcyA9IHBkZnMucHJlTm9kZTtcbiAgICB9IC8vIOWAkuW6j1xuXG5cbiAgICB0aGlzLmVkZ2VzID0gdGhpcy5lZGdlcy5yZXZlcnNlKCk7XG4gIH1cblxuICBIaXN0b3J5LnByb3RvdHlwZS5oYXNOb2RlID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICByZXR1cm4gdGhpcy5ub2Rlc1VzZWRbbm9kZS5pZF0gPT09IDE7XG4gIH07XG5cbiAgSGlzdG9yeS5wcm90b3R5cGUuaGFzRWRnZSA9IGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgcmV0dXJuIHRoaXMuZWRnZXNVc2VkW2VkZ2UuaWRdID09PSAxO1xuICB9O1xuXG4gIHJldHVybiBIaXN0b3J5O1xufSgpO1xuXG52YXIgR1NwYW4gPVxuLyoqIEBjbGFzcyAqL1xuZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBHU3BhbihfYSkge1xuICAgIHZhciBncmFwaHMgPSBfYS5ncmFwaHMsXG4gICAgICAgIF9iID0gX2EubWluU3VwcG9ydCxcbiAgICAgICAgbWluU3VwcG9ydCA9IF9iID09PSB2b2lkIDAgPyAyIDogX2IsXG4gICAgICAgIF9jID0gX2EubWluTm9kZU51bSxcbiAgICAgICAgbWluTm9kZU51bSA9IF9jID09PSB2b2lkIDAgPyAxIDogX2MsXG4gICAgICAgIF9kID0gX2EubWF4Tm9kZU51bSxcbiAgICAgICAgbWF4Tm9kZU51bSA9IF9kID09PSB2b2lkIDAgPyA0IDogX2QsXG4gICAgICAgIF9lID0gX2EudG9wLFxuICAgICAgICB0b3AgPSBfZSA9PT0gdm9pZCAwID8gMTAgOiBfZSxcbiAgICAgICAgX2YgPSBfYS5kaXJlY3RlZCxcbiAgICAgICAgZGlyZWN0ZWQgPSBfZiA9PT0gdm9pZCAwID8gZmFsc2UgOiBfZixcbiAgICAgICAgX2cgPSBfYS52ZXJib3NlLFxuICAgICAgICB2ZXJib3NlID0gX2cgPT09IHZvaWQgMCA/IGZhbHNlIDogX2c7IC8vIC0tLS0tLS0tIOesrOmbtuatpe+8jOWIneWni+WMli0tLS0tLS1cblxuICAgIHRoaXMuZ3JhcGhzID0gZ3JhcGhzO1xuICAgIHRoaXMuZGZzQ29kZSA9IG5ldyBERlNjb2RlKCk7XG4gICAgdGhpcy5zdXBwb3J0ID0gMDtcbiAgICB0aGlzLmZyZXF1ZW50U2l6ZTFTdWJncmFwaHMgPSBbXTtcbiAgICB0aGlzLmZyZXF1ZW50U3ViZ3JhcGhzID0gW107XG4gICAgdGhpcy5taW5TdXBwb3J0ID0gbWluU3VwcG9ydDtcbiAgICB0aGlzLnRvcCA9IHRvcDtcbiAgICB0aGlzLmRpcmVjdGVkID0gZGlyZWN0ZWQ7XG4gICAgdGhpcy5jb3VudGVyID0gMDsgLy8gVE9ETz8gdGltZXN0YW1wID0ge31cblxuICAgIHRoaXMubWF4Tm9kZU51bSA9IG1heE5vZGVOdW07XG4gICAgdGhpcy5taW5Ob2RlTnVtID0gbWluTm9kZU51bTtcbiAgICB0aGlzLnZlcmJvc2UgPSB2ZXJib3NlO1xuICAgIGlmICh0aGlzLm1heE5vZGVOdW0gPCB0aGlzLm1pbk5vZGVOdW0pIHRoaXMubWF4Tm9kZU51bSA9IHRoaXMubWluTm9kZU51bTtcbiAgICB0aGlzLnJlcG9ydERGID0gW107IC8vIG1hdHJpeFxuICB9IC8vIExpbmUgMzUyXG5cblxuICBHU3Bhbi5wcm90b3R5cGUuZmluZEZvcndhcmRSb290RWRnZXMgPSBmdW5jdGlvbiAoZ3JhcGgsIGZyb21Ob2RlKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICB2YXIgbm9kZU1hcCA9IGdyYXBoLm5vZGVNYXA7XG4gICAgZnJvbU5vZGUuZWRnZXMuZm9yRWFjaChmdW5jdGlvbiAoZWRnZSkge1xuICAgICAgaWYgKF90aGlzLmRpcmVjdGVkIHx8IGZyb21Ob2RlLmxhYmVsIDw9IG5vZGVNYXBbZWRnZS50b10ubGFiZWwpIHJlc3VsdC5wdXNoKGVkZ2UpO1xuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgR1NwYW4ucHJvdG90eXBlLmZpbmRCYWNrd2FyZEVkZ2UgPSBmdW5jdGlvbiAoZ3JhcGgsIGVkZ2UxLCBlZGdlMiwgaGlzdG9yeSkge1xuICAgIGlmICghdGhpcy5kaXJlY3RlZCAmJiBlZGdlMSA9PT0gZWRnZTIpIHJldHVybiBudWxsO1xuICAgIHZhciBub2RlTWFwID0gZ3JhcGgubm9kZU1hcDtcbiAgICB2YXIgZWRnZTJUbyA9IG5vZGVNYXBbZWRnZTIudG9dO1xuICAgIHZhciBlZGdlMlRvRWRnZXMgPSBlZGdlMlRvLmVkZ2VzO1xuICAgIHZhciBlZGdlTGVuZ3RoID0gZWRnZTJUb0VkZ2VzLmxlbmd0aDtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWRnZUxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWRnZSA9IGVkZ2UyVG9FZGdlc1tpXTtcbiAgICAgIGlmIChoaXN0b3J5Lmhhc0VkZ2UoZWRnZSkgfHwgZWRnZS50byAhPT0gZWRnZTEuZnJvbSkgY29udGludWU7XG5cbiAgICAgIGlmICghdGhpcy5kaXJlY3RlZCkge1xuICAgICAgICBpZiAoZWRnZTEubGFiZWwgPCBlZGdlLmxhYmVsIHx8IGVkZ2UxLmxhYmVsID09PSBlZGdlLmxhYmVsICYmIG5vZGVNYXBbZWRnZTEudG9dLmxhYmVsIDw9IG5vZGVNYXBbZWRnZTIudG9dLmxhYmVsKSB7XG4gICAgICAgICAgcmV0dXJuIGVkZ2U7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChub2RlTWFwW2VkZ2UxLmZyb21dLmxhYmVsIDwgbm9kZU1hcFtlZGdlMi50b10ubGFiZWwgfHwgbm9kZU1hcFtlZGdlMS5mcm9tXS5sYWJlbCA9PT0gbm9kZU1hcFtlZGdlMi50b10ubGFiZWwgJiYgZWRnZTEubGFiZWwgPD0gZWRnZS5sYWJlbCkge1xuICAgICAgICAgIHJldHVybiBlZGdlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH07XG5cbiAgR1NwYW4ucHJvdG90eXBlLmZpbmRGb3J3YXJkUHVyZUVkZ2VzID0gZnVuY3Rpb24gKGdyYXBoLCByaWdodG1vc3RFZGdlLCBtaW5Ob2RlTGFiZWwsIGhpc3RvcnkpIHtcbiAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgdmFyIHJpZ2h0bW9zdEVkZ2VUb0lkID0gcmlnaHRtb3N0RWRnZS50bztcbiAgICB2YXIgZWRnZXMgPSBncmFwaC5ub2RlTWFwW3JpZ2h0bW9zdEVkZ2VUb0lkXS5lZGdlcztcbiAgICB2YXIgZWRnZUxlbmd0aCA9IGVkZ2VzLmxlbmd0aDtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWRnZUxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWRnZSA9IGVkZ2VzW2ldO1xuICAgICAgdmFyIHRvTm9kZSA9IGdyYXBoLm5vZGVNYXBbZWRnZS50b107XG5cbiAgICAgIGlmIChtaW5Ob2RlTGFiZWwgPD0gdG9Ob2RlLmxhYmVsICYmICFoaXN0b3J5Lmhhc05vZGUodG9Ob2RlKSkge1xuICAgICAgICByZXN1bHQucHVzaChlZGdlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG4gIEdTcGFuLnByb3RvdHlwZS5maW5kRm9yd2FyZFJtcGF0aEVkZ2VzID0gZnVuY3Rpb24gKGdyYXBoLCByaWdodG1vc3RFZGdlLCBtaW5Ob2RlTGFiZWwsIGhpc3RvcnkpIHtcbiAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgdmFyIG5vZGVNYXAgPSBncmFwaC5ub2RlTWFwO1xuICAgIHZhciB0b05vZGVMYWJlbCA9IG5vZGVNYXBbcmlnaHRtb3N0RWRnZS50b10ubGFiZWw7XG4gICAgdmFyIGZyb21Ob2RlID0gbm9kZU1hcFtyaWdodG1vc3RFZGdlLmZyb21dO1xuICAgIHZhciBlZGdlcyA9IGZyb21Ob2RlLmVkZ2VzO1xuICAgIHZhciBlZGdlTGVuZ3RoID0gZWRnZXMubGVuZ3RoO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlZGdlTGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBlZGdlID0gZWRnZXNbaV07XG4gICAgICB2YXIgbmV3VG9Ob2RlTGFiZWwgPSBub2RlTWFwW2VkZ2UudG9dLmxhYmVsO1xuXG4gICAgICBpZiAocmlnaHRtb3N0RWRnZS50byA9PT0gZWRnZS50byB8fCBtaW5Ob2RlTGFiZWwgPiBuZXdUb05vZGVMYWJlbCB8fCBoaXN0b3J5Lmhhc05vZGUobm9kZU1hcFtlZGdlLnRvXSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChyaWdodG1vc3RFZGdlLmxhYmVsIDwgZWRnZS5sYWJlbCB8fCByaWdodG1vc3RFZGdlLmxhYmVsID09PSBlZGdlLmxhYmVsICYmIHRvTm9kZUxhYmVsIDw9IG5ld1RvTm9kZUxhYmVsKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKGVkZ2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgR1NwYW4ucHJvdG90eXBlLmdldFN1cHBvcnQgPSBmdW5jdGlvbiAocHJvamVjdGVkKSB7XG4gICAgdmFyIGdyYXBoTWFwID0ge307XG4gICAgcHJvamVjdGVkLmZvckVhY2goZnVuY3Rpb24gKHBybykge1xuICAgICAgaWYgKCFncmFwaE1hcFtwcm8uZ3JhcGhJZF0pIGdyYXBoTWFwW3Byby5ncmFwaElkXSA9IHRydWU7XG4gICAgfSk7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKGdyYXBoTWFwKS5sZW5ndGg7XG4gIH07XG5cbiAgR1NwYW4ucHJvdG90eXBlLmZpbmRNaW5MYWJlbCA9IGZ1bmN0aW9uIChvYmopIHtcbiAgICB2YXIgbWluTGFiZWwgPSB1bmRlZmluZWQ7XG4gICAgT2JqZWN0LmtleXMob2JqKS5mb3JFYWNoKGZ1bmN0aW9uIChub2RlRWRnZU5vZGVMYWJlbCkge1xuICAgICAgdmFyIF9hID0gb2JqW25vZGVFZGdlTm9kZUxhYmVsXSxcbiAgICAgICAgICBub2RlTGFiZWwxID0gX2Eubm9kZUxhYmVsMSxcbiAgICAgICAgICBlZGdlTGFiZWwgPSBfYS5lZGdlTGFiZWwsXG4gICAgICAgICAgbm9kZUxhYmVsMiA9IF9hLm5vZGVMYWJlbDI7XG5cbiAgICAgIGlmICghbWluTGFiZWwpIHtcbiAgICAgICAgbWluTGFiZWwgPSB7XG4gICAgICAgICAgbm9kZUxhYmVsMTogbm9kZUxhYmVsMSxcbiAgICAgICAgICBlZGdlTGFiZWw6IGVkZ2VMYWJlbCxcbiAgICAgICAgICBub2RlTGFiZWwyOiBub2RlTGFiZWwyXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKG5vZGVMYWJlbDEgPCBtaW5MYWJlbC5ub2RlTGFiZWwxIHx8IG5vZGVMYWJlbDEgPT09IG1pbkxhYmVsLm5vZGVMYWJlbDEgJiYgZWRnZUxhYmVsIDwgbWluTGFiZWwuZWRnZUxhYmVsIHx8IG5vZGVMYWJlbDEgPT09IG1pbkxhYmVsLm5vZGVMYWJlbDEgJiYgZWRnZUxhYmVsID09PSBtaW5MYWJlbC5lZGdlTGFiZWwgJiYgbm9kZUxhYmVsMiA8IG1pbkxhYmVsLm5vZGVMYWJlbDIpIHtcbiAgICAgICAgbWluTGFiZWwgPSB7XG4gICAgICAgICAgbm9kZUxhYmVsMTogbm9kZUxhYmVsMSxcbiAgICAgICAgICBlZGdlTGFiZWw6IGVkZ2VMYWJlbCxcbiAgICAgICAgICBub2RlTGFiZWwyOiBub2RlTGFiZWwyXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIG1pbkxhYmVsO1xuICB9O1xuXG4gIEdTcGFuLnByb3RvdHlwZS5pc01pbiA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdmFyIGRmc0NvZGUgPSB0aGlzLmRmc0NvZGU7XG4gICAgaWYgKHRoaXMudmVyYm9zZSkgY29uc29sZS5sb2coXCJpc01pbiBjaGVja2luZ1wiLCBkZnNDb2RlKTtcbiAgICBpZiAoZGZzQ29kZS5kZnNFZGdlTGlzdC5sZW5ndGggPT09IDEpIHJldHVybiB0cnVlO1xuICAgIHZhciBkaXJlY3RlZCA9IHRoaXMuZGlyZWN0ZWQ7XG4gICAgdmFyIGdyYXBoID0gZGZzQ29kZS50b0dyYXBoKFZBQ0FOVF9HUkFQSF9JRCwgZGlyZWN0ZWQpO1xuICAgIHZhciBub2RlTWFwID0gZ3JhcGgubm9kZU1hcDtcbiAgICB2YXIgZGZzQ29kZU1pbiA9IG5ldyBERlNjb2RlKCk7XG4gICAgdmFyIHJvb3QgPSB7fTtcbiAgICBncmFwaC5ub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICB2YXIgZm9yd2FyZEVkZ2VzID0gX3RoaXMuZmluZEZvcndhcmRSb290RWRnZXMoZ3JhcGgsIG5vZGUpO1xuXG4gICAgICBmb3J3YXJkRWRnZXMuZm9yRWFjaChmdW5jdGlvbiAoZWRnZSkge1xuICAgICAgICB2YXIgb3RoZXJOb2RlID0gbm9kZU1hcFtlZGdlLnRvXTtcbiAgICAgICAgdmFyIG5vZGVFZGdlTm9kZUxhYmVsID0gbm9kZS5sYWJlbCArIFwiLVwiICsgZWRnZS5sYWJlbCArIFwiLVwiICsgb3RoZXJOb2RlLmxhYmVsO1xuICAgICAgICBpZiAoIXJvb3Rbbm9kZUVkZ2VOb2RlTGFiZWxdKSByb290W25vZGVFZGdlTm9kZUxhYmVsXSA9IHtcbiAgICAgICAgICBwcm9qZWN0ZWQ6IFtdLFxuICAgICAgICAgIG5vZGVMYWJlbDE6IG5vZGUubGFiZWwsXG4gICAgICAgICAgZWRnZUxhYmVsOiBlZGdlLmxhYmVsLFxuICAgICAgICAgIG5vZGVMYWJlbDI6IG90aGVyTm9kZS5sYWJlbFxuICAgICAgICB9O1xuICAgICAgICB2YXIgcGRmcyA9IHtcbiAgICAgICAgICBncmFwaElkOiBncmFwaC5pZCxcbiAgICAgICAgICBlZGdlOiBlZGdlLFxuICAgICAgICAgIHByZU5vZGU6IG51bGxcbiAgICAgICAgfTtcbiAgICAgICAgcm9vdFtub2RlRWRnZU5vZGVMYWJlbF0ucHJvamVjdGVkLnB1c2gocGRmcyk7XG4gICAgICB9KTtcbiAgICB9KTsgLy8g5q+U6L6DIHJvb3Qg5Lit5q+P5LiA6aG555qEIG5vZGVFZGdlTm9kZUxhYmVsIOWkp+Wwj++8jOaMieeFpyBub2RlTGFiZWwx44CBZWRnZUxhYmXjgIFub2RlTGFiZWwyIOeahOmhuuW6j+avlOi+g1xuXG4gICAgdmFyIG1pbkxhYmVsID0gdGhpcy5maW5kTWluTGFiZWwocm9vdCk7IC8vIGxpbmUgNDE5XG5cbiAgICBpZiAoIW1pbkxhYmVsKSByZXR1cm47XG4gICAgZGZzQ29kZU1pbi5kZnNFZGdlTGlzdC5wdXNoKG5ldyBERlNlZGdlKDAsIDEsIG1pbkxhYmVsLm5vZGVMYWJlbDEsIG1pbkxhYmVsLmVkZ2VMYWJlbCwgbWluTGFiZWwubm9kZUxhYmVsMikpOyAvLyBsaW5lIDQyM1xuXG4gICAgdmFyIHByb2plY3RJc01pbiA9IGZ1bmN0aW9uIHByb2plY3RJc01pbihwcm9qZWN0ZWQpIHtcbiAgICAgIC8vIHJpZ2h0IG1vc3QgcGF0aFxuICAgICAgdmFyIHJtcGF0aCA9IGRmc0NvZGVNaW4uYnVpbGRSbXBhdGgoKTtcbiAgICAgIHZhciBtaW5Ob2RlTGFiZWwgPSBkZnNDb2RlTWluLmRmc0VkZ2VMaXN0WzBdLm5vZGVFZGdlTm9kZUxhYmVsLm5vZGVMYWJlbDE7XG4gICAgICB2YXIgbWF4VG9DID0gZGZzQ29kZU1pbi5kZnNFZGdlTGlzdFtybXBhdGhbMF1dLnRvTm9kZTsgLy8gbm9kZSBpZFxuXG4gICAgICB2YXIgYmFja3dhcmRSb290ID0ge307XG4gICAgICB2YXIgZmxhZyA9IGZhbHNlLFxuICAgICAgICAgIG5ld1RvID0gMDtcbiAgICAgIHZhciBlbmQgPSBkaXJlY3RlZCA/IC0xIDogMDsgLy8g6YGN5Y6G5YiwIDEg6L+Y5piv5YiwIDBcblxuICAgICAgdmFyIF9sb29wXzEgPSBmdW5jdGlvbiBfbG9vcF8xKGkpIHtcbiAgICAgICAgaWYgKGZsYWcpIHJldHVybiBcImJyZWFrXCI7IC8vIGxpbmUgNDM1XG5cbiAgICAgICAgcHJvamVjdGVkLmZvckVhY2goZnVuY3Rpb24gKHApIHtcbiAgICAgICAgICB2YXIgaGlzdG9yeSA9IG5ldyBIaXN0b3J5KHApO1xuXG4gICAgICAgICAgdmFyIGJhY2t3YXJkRWRnZSA9IF90aGlzLmZpbmRCYWNrd2FyZEVkZ2UoZ3JhcGgsIGhpc3RvcnkuZWRnZXNbcm1wYXRoW2ldXSwgaGlzdG9yeS5lZGdlc1tybXBhdGhbMF1dLCBoaXN0b3J5KTtcblxuICAgICAgICAgIGlmIChiYWNrd2FyZEVkZ2UpIHtcbiAgICAgICAgICAgIC8vIExpbmUgNDQxXG4gICAgICAgICAgICBpZiAoIWJhY2t3YXJkUm9vdFtiYWNrd2FyZEVkZ2UubGFiZWxdKSB7XG4gICAgICAgICAgICAgIGJhY2t3YXJkUm9vdFtiYWNrd2FyZEVkZ2UubGFiZWxdID0ge1xuICAgICAgICAgICAgICAgIHByb2plY3RlZDogW10sXG4gICAgICAgICAgICAgICAgZWRnZUxhYmVsOiBiYWNrd2FyZEVkZ2UubGFiZWxcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYmFja3dhcmRSb290W2JhY2t3YXJkRWRnZS5sYWJlbF0ucHJvamVjdGVkLnB1c2goe1xuICAgICAgICAgICAgICBncmFwaElkOiBncmFwaC5pZCxcbiAgICAgICAgICAgICAgZWRnZTogYmFja3dhcmRSb290LFxuICAgICAgICAgICAgICBwcmVOb2RlOiBwXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIG5ld1RvID0gZGZzQ29kZU1pbi5kZnNFZGdlTGlzdFtybXBhdGhbaV1dLmZyb21Ob2RlO1xuICAgICAgICAgICAgZmxhZyA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH07XG5cbiAgICAgIGZvciAodmFyIGkgPSBybXBhdGgubGVuZ3RoIC0gMTsgaSA+IGVuZDsgaS0tKSB7XG4gICAgICAgIHZhciBzdGF0ZV8xID0gX2xvb3BfMShpKTtcblxuICAgICAgICBpZiAoc3RhdGVfMSA9PT0gXCJicmVha1wiKSBicmVhaztcbiAgICAgIH1cblxuICAgICAgaWYgKGZsYWcpIHtcbiAgICAgICAgdmFyIG1pbkJhY2t3YXJkRWRnZUxhYmVsID0gX3RoaXMuZmluZE1pbkxhYmVsKGJhY2t3YXJkUm9vdCk7XG5cbiAgICAgICAgZGZzQ29kZU1pbi5kZnNFZGdlTGlzdC5wdXNoKG5ldyBERlNlZGdlKG1heFRvQywgbmV3VG8sIFZBQ0FOVF9OT0RFX0xBQkVMLCBtaW5CYWNrd2FyZEVkZ2VMYWJlbC5lZGdlTGFiZWwsIFZBQ0FOVF9OT0RFX0xBQkVMKSk7XG4gICAgICAgIHZhciBpZHhfMSA9IGRmc0NvZGVNaW4uZGZzRWRnZUxpc3QubGVuZ3RoIC0gMTtcbiAgICAgICAgaWYgKF90aGlzLmRmc0NvZGUuZGZzRWRnZUxpc3RbaWR4XzFdICE9PSBkZnNDb2RlTWluLmRmc0VkZ2VMaXN0W2lkeF8xXSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gcHJvamVjdElzTWluKGJhY2t3YXJkUm9vdFttaW5CYWNrd2FyZEVkZ2VMYWJlbC5lZGdlTGFiZWxdLnByb2plY3RlZCk7XG4gICAgICB9XG5cbiAgICAgIHZhciBmb3J3YXJkUm9vdCA9IHt9O1xuICAgICAgZmxhZyA9IGZhbHNlO1xuICAgICAgdmFyIG5ld0Zyb20gPSAwO1xuICAgICAgcHJvamVjdGVkLmZvckVhY2goZnVuY3Rpb24gKHApIHtcbiAgICAgICAgdmFyIGhpc3RvcnkgPSBuZXcgSGlzdG9yeShwKTtcblxuICAgICAgICB2YXIgZm9yd2FyZFB1cmVFZGdlcyA9IF90aGlzLmZpbmRGb3J3YXJkUHVyZUVkZ2VzKGdyYXBoLCBoaXN0b3J5LmVkZ2VzW3JtcGF0aFswXV0sIG1pbk5vZGVMYWJlbCwgaGlzdG9yeSk7XG5cbiAgICAgICAgaWYgKGZvcndhcmRQdXJlRWRnZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGZsYWcgPSB0cnVlO1xuICAgICAgICAgIG5ld0Zyb20gPSBtYXhUb0M7XG4gICAgICAgICAgZm9yd2FyZFB1cmVFZGdlcy5mb3JFYWNoKGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgICAgICAgICB2YXIga2V5ID0gZWRnZS5sYWJlbCArIFwiLVwiICsgbm9kZU1hcFtlZGdlLnRvXS5sYWJlbDtcbiAgICAgICAgICAgIGlmICghZm9yd2FyZFJvb3Rba2V5XSkgZm9yd2FyZFJvb3Rba2V5XSA9IHtcbiAgICAgICAgICAgICAgcHJvamVjdGVkOiBbXSxcbiAgICAgICAgICAgICAgZWRnZUxhYmVsOiBlZGdlLmxhYmVsLFxuICAgICAgICAgICAgICBub2RlTGFiZWwyOiBub2RlTWFwW2VkZ2UudG9dLmxhYmVsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgZm9yd2FyZFJvb3Rba2V5XS5wcm9qZWN0ZWQucHVzaCh7XG4gICAgICAgICAgICAgIGdyYXBoSWQ6IGdyYXBoLmlkLFxuICAgICAgICAgICAgICBlZGdlOiBlZGdlLFxuICAgICAgICAgICAgICBwcmVOb2RlOiBwXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB2YXIgcGF0aExlbmd0aCA9IHJtcGF0aC5sZW5ndGg7XG5cbiAgICAgIHZhciBfbG9vcF8yID0gZnVuY3Rpb24gX2xvb3BfMihpKSB7XG4gICAgICAgIGlmIChmbGFnKSByZXR1cm4gXCJicmVha1wiO1xuICAgICAgICB2YXIgdmFsdWUgPSBybXBhdGhbaV07XG4gICAgICAgIHByb2plY3RlZC5mb3JFYWNoKGZ1bmN0aW9uIChwKSB7XG4gICAgICAgICAgdmFyIGhpc3RvcnkgPSBuZXcgSGlzdG9yeShwKTtcblxuICAgICAgICAgIHZhciBmb3J3YXJkUm1wYXRoRWRnZXMgPSBfdGhpcy5maW5kRm9yd2FyZFJtcGF0aEVkZ2VzKGdyYXBoLCBoaXN0b3J5LmVkZ2VzW3ZhbHVlXSwgbWluTm9kZUxhYmVsLCBoaXN0b3J5KTtcblxuICAgICAgICAgIGlmIChmb3J3YXJkUm1wYXRoRWRnZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZmxhZyA9IHRydWU7XG4gICAgICAgICAgICBuZXdGcm9tID0gZGZzQ29kZU1pbi5kZnNFZGdlTGlzdFt2YWx1ZV0uZnJvbU5vZGU7XG4gICAgICAgICAgICBmb3J3YXJkUm1wYXRoRWRnZXMuZm9yRWFjaChmdW5jdGlvbiAoZWRnZSkge1xuICAgICAgICAgICAgICB2YXIga2V5ID0gZWRnZS5sYWJlbCArIFwiLVwiICsgbm9kZU1hcFtlZGdlLnRvXS5sYWJlbDtcbiAgICAgICAgICAgICAgaWYgKCFmb3J3YXJkUm9vdFtrZXldKSBmb3J3YXJkUm9vdFtrZXldID0ge1xuICAgICAgICAgICAgICAgIHByb2plY3RlZDogW10sXG4gICAgICAgICAgICAgICAgZWRnZUxhYmVsOiBlZGdlLmxhYmVsLFxuICAgICAgICAgICAgICAgIG5vZGVMYWJlbDI6IG5vZGVNYXBbZWRnZS50b10ubGFiZWxcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgZm9yd2FyZFJvb3Rba2V5XS5wcm9qZWN0ZWQucHVzaCh7XG4gICAgICAgICAgICAgICAgZ3JhcGhJZDogZ3JhcGguaWQsXG4gICAgICAgICAgICAgICAgZWRnZTogZWRnZSxcbiAgICAgICAgICAgICAgICBwcmVOb2RlOiBwXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH07XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGF0aExlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBzdGF0ZV8yID0gX2xvb3BfMihpKTtcblxuICAgICAgICBpZiAoc3RhdGVfMiA9PT0gXCJicmVha1wiKSBicmVhaztcbiAgICAgIH1cblxuICAgICAgaWYgKCFmbGFnKSByZXR1cm4gdHJ1ZTtcblxuICAgICAgdmFyIGZvcndhcmRNaW5FZGdlTm9kZUxhYmVsID0gX3RoaXMuZmluZE1pbkxhYmVsKGZvcndhcmRSb290KTtcblxuICAgICAgZGZzQ29kZU1pbi5kZnNFZGdlTGlzdC5wdXNoKG5ldyBERlNlZGdlKG5ld0Zyb20sIG1heFRvQyArIDEsIFZBQ0FOVF9OT0RFX0xBQkVMLCBmb3J3YXJkTWluRWRnZU5vZGVMYWJlbC5lZGdlTGFiZWwsIGZvcndhcmRNaW5FZGdlTm9kZUxhYmVsLm5vZGVMYWJlbDIpKTtcbiAgICAgIHZhciBpZHggPSBkZnNDb2RlTWluLmRmc0VkZ2VMaXN0Lmxlbmd0aCAtIDE7XG4gICAgICBpZiAoZGZzQ29kZS5kZnNFZGdlTGlzdFtpZHhdICE9PSBkZnNDb2RlTWluLmRmc0VkZ2VMaXN0W2lkeF0pIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiBwcm9qZWN0SXNNaW4oZm9yd2FyZFJvb3RbZm9yd2FyZE1pbkVkZ2VOb2RlTGFiZWwuZWRnZUxhYmVsICsgXCItXCIgKyBmb3J3YXJkTWluRWRnZU5vZGVMYWJlbC5ub2RlTGFiZWwyXS5wcm9qZWN0ZWQpO1xuICAgIH07XG5cbiAgICB2YXIga2V5ID0gbWluTGFiZWwubm9kZUxhYmVsMSArIFwiLVwiICsgbWluTGFiZWwuZWRnZUxhYmVsICsgXCItXCIgKyBtaW5MYWJlbC5ub2RlTGFiZWwyO1xuICAgIHJldHVybiBwcm9qZWN0SXNNaW4ocm9vdFtrZXldLnByb2plY3RlZCk7XG4gIH07XG5cbiAgR1NwYW4ucHJvdG90eXBlLnJlcG9ydCA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodGhpcy5kZnNDb2RlLmdldE5vZGVOdW0oKSA8IHRoaXMubWluTm9kZU51bSkgcmV0dXJuO1xuICAgIHRoaXMuY291bnRlcisrO1xuICAgIHZhciBncmFwaCA9IHRoaXMuZGZzQ29kZS50b0dyYXBoKHRoaXMuY291bnRlciwgdGhpcy5kaXJlY3RlZCk7XG4gICAgdGhpcy5mcmVxdWVudFN1YmdyYXBocy5wdXNoKGNsb25lKGdyYXBoKSk7XG4gIH07XG5cbiAgR1NwYW4ucHJvdG90eXBlLnN1YkdyYXBoTWluaW5nID0gZnVuY3Rpb24gKHByb2plY3RlZCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICB2YXIgc3VwcG9ydCA9IHRoaXMuZ2V0U3VwcG9ydChwcm9qZWN0ZWQpO1xuICAgIGlmIChzdXBwb3J0IDwgdGhpcy5taW5TdXBwb3J0KSByZXR1cm47XG4gICAgaWYgKCF0aGlzLmlzTWluKCkpIHJldHVybjtcbiAgICB0aGlzLnJlcG9ydCgpO1xuICAgIHZhciBub2RlTnVtID0gdGhpcy5kZnNDb2RlLmdldE5vZGVOdW0oKTtcbiAgICB2YXIgcm1wYXRoID0gdGhpcy5kZnNDb2RlLmJ1aWxkUm1wYXRoKCk7XG4gICAgdmFyIG1heFRvQyA9IHRoaXMuZGZzQ29kZS5kZnNFZGdlTGlzdFtybXBhdGhbMF1dLnRvTm9kZTtcbiAgICB2YXIgbWluTm9kZUxhYmVsID0gdGhpcy5kZnNDb2RlLmRmc0VkZ2VMaXN0WzBdLm5vZGVFZGdlTm9kZUxhYmVsLm5vZGVMYWJlbDE7XG4gICAgdmFyIGZvcndhcmRSb290ID0ge307XG4gICAgdmFyIGJhY2t3YXJkUm9vdCA9IHt9O1xuICAgIHByb2plY3RlZC5mb3JFYWNoKGZ1bmN0aW9uIChwKSB7XG4gICAgICB2YXIgZ3JhcGggPSBfdGhpcy5ncmFwaHNbcC5ncmFwaElkXTtcbiAgICAgIHZhciBub2RlTWFwID0gZ3JhcGgubm9kZU1hcDtcbiAgICAgIHZhciBoaXN0b3J5ID0gbmV3IEhpc3RvcnkocCk7IC8vIGJhY2t3YXJkIExpbmUgNTI2XG5cbiAgICAgIGZvciAodmFyIGkgPSBybXBhdGgubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgdmFyIGJhY2t3YXJkRWRnZSA9IF90aGlzLmZpbmRCYWNrd2FyZEVkZ2UoZ3JhcGgsIGhpc3RvcnkuZWRnZXNbcm1wYXRoW2ldXSwgaGlzdG9yeS5lZGdlc1tybXBhdGhbMF1dLCBoaXN0b3J5KTtcblxuICAgICAgICBpZiAoYmFja3dhcmRFZGdlKSB7XG4gICAgICAgICAgdmFyIGtleSA9IF90aGlzLmRmc0NvZGUuZGZzRWRnZUxpc3Rbcm1wYXRoW2ldXS5mcm9tTm9kZSArIFwiLVwiICsgYmFja3dhcmRFZGdlLmxhYmVsO1xuICAgICAgICAgIGlmICghYmFja3dhcmRSb290W2tleV0pIGJhY2t3YXJkUm9vdFtrZXldID0ge1xuICAgICAgICAgICAgcHJvamVjdGVkOiBbXSxcbiAgICAgICAgICAgIHRvTm9kZUlkOiBfdGhpcy5kZnNDb2RlLmRmc0VkZ2VMaXN0W3JtcGF0aFtpXV0uZnJvbU5vZGUsXG4gICAgICAgICAgICBlZGdlTGFiZWw6IGJhY2t3YXJkRWRnZS5sYWJlbFxuICAgICAgICAgIH07XG4gICAgICAgICAgYmFja3dhcmRSb290W2tleV0ucHJvamVjdGVkLnB1c2goe1xuICAgICAgICAgICAgZ3JhcGhJZDogcC5ncmFwaElkLFxuICAgICAgICAgICAgZWRnZTogYmFja3dhcmRFZGdlLFxuICAgICAgICAgICAgcHJlTm9kZTogcFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IC8vIHB1cmUgZm9yd2FyZFxuXG5cbiAgICAgIGlmIChub2RlTnVtID49IF90aGlzLm1heE5vZGVOdW0pIHJldHVybjtcblxuICAgICAgdmFyIGZvcndhcmRQdXJlRWRnZXMgPSBfdGhpcy5maW5kRm9yd2FyZFB1cmVFZGdlcyhncmFwaCwgaGlzdG9yeS5lZGdlc1tybXBhdGhbMF1dLCBtaW5Ob2RlTGFiZWwsIGhpc3RvcnkpO1xuXG4gICAgICBmb3J3YXJkUHVyZUVkZ2VzLmZvckVhY2goZnVuY3Rpb24gKGVkZ2UpIHtcbiAgICAgICAgdmFyIGtleSA9IG1heFRvQyArIFwiLVwiICsgZWRnZS5sYWJlbCArIFwiLVwiICsgbm9kZU1hcFtlZGdlLnRvXS5sYWJlbDtcbiAgICAgICAgaWYgKCFmb3J3YXJkUm9vdFtrZXldKSBmb3J3YXJkUm9vdFtrZXldID0ge1xuICAgICAgICAgIHByb2plY3RlZDogW10sXG4gICAgICAgICAgZnJvbU5vZGVJZDogbWF4VG9DLFxuICAgICAgICAgIGVkZ2VMYWJlbDogZWRnZS5sYWJlbCxcbiAgICAgICAgICBub2RlTGFiZWwyOiBub2RlTWFwW2VkZ2UudG9dLmxhYmVsXG4gICAgICAgIH07XG4gICAgICAgIGZvcndhcmRSb290W2tleV0ucHJvamVjdGVkLnB1c2goe1xuICAgICAgICAgIGdyYXBoSWQ6IHAuZ3JhcGhJZCxcbiAgICAgICAgICBlZGdlOiBlZGdlLFxuICAgICAgICAgIHByZU5vZGU6IHBcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgdmFyIF9sb29wXzMgPSBmdW5jdGlvbiBfbG9vcF8zKGkpIHtcbiAgICAgICAgdmFyIGZvcndhcmRSbXBhdGhFZGdlcyA9IF90aGlzLmZpbmRGb3J3YXJkUm1wYXRoRWRnZXMoZ3JhcGgsIGhpc3RvcnkuZWRnZXNbcm1wYXRoW2ldXSwgbWluTm9kZUxhYmVsLCBoaXN0b3J5KTtcblxuICAgICAgICBmb3J3YXJkUm1wYXRoRWRnZXMuZm9yRWFjaChmdW5jdGlvbiAoZWRnZSkge1xuICAgICAgICAgIHZhciBrZXkgPSBfdGhpcy5kZnNDb2RlLmRmc0VkZ2VMaXN0W3JtcGF0aFtpXV0uZnJvbU5vZGUgKyBcIi1cIiArIGVkZ2UubGFiZWwgKyBcIi1cIiArIG5vZGVNYXBbZWRnZS50b10ubGFiZWw7XG4gICAgICAgICAgaWYgKCFmb3J3YXJkUm9vdFtrZXldKSBmb3J3YXJkUm9vdFtrZXldID0ge1xuICAgICAgICAgICAgcHJvamVjdGVkOiBbXSxcbiAgICAgICAgICAgIGZyb21Ob2RlSWQ6IF90aGlzLmRmc0NvZGUuZGZzRWRnZUxpc3Rbcm1wYXRoW2ldXS5mcm9tTm9kZSxcbiAgICAgICAgICAgIGVkZ2VMYWJlbDogZWRnZS5sYWJlbCxcbiAgICAgICAgICAgIG5vZGVMYWJlbDI6IG5vZGVNYXBbZWRnZS50b10ubGFiZWxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGZvcndhcmRSb290W2tleV0ucHJvamVjdGVkLnB1c2goe1xuICAgICAgICAgICAgZ3JhcGhJZDogcC5ncmFwaElkLFxuICAgICAgICAgICAgZWRnZTogZWRnZSxcbiAgICAgICAgICAgIHByZU5vZGU6IHBcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9OyAvLyBybXBhdGggZm9yd2FyZFxuXG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcm1wYXRoLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIF9sb29wXzMoaSk7XG4gICAgICB9XG4gICAgfSk7IC8vIGJhY2t3YXJkXG5cbiAgICBPYmplY3Qua2V5cyhiYWNrd2FyZFJvb3QpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgdmFyIF9hID0gYmFja3dhcmRSb290W2tleV0sXG4gICAgICAgICAgdG9Ob2RlSWQgPSBfYS50b05vZGVJZCxcbiAgICAgICAgICBlZGdlTGFiZWwgPSBfYS5lZGdlTGFiZWw7XG5cbiAgICAgIF90aGlzLmRmc0NvZGUuZGZzRWRnZUxpc3QucHVzaChuZXcgREZTZWRnZShtYXhUb0MsIHRvTm9kZUlkLCBcIi0xXCIsIGVkZ2VMYWJlbCwgXCItMVwiKSk7XG5cbiAgICAgIF90aGlzLnN1YkdyYXBoTWluaW5nKGJhY2t3YXJkUm9vdFtrZXldLnByb2plY3RlZCk7XG5cbiAgICAgIF90aGlzLmRmc0NvZGUuZGZzRWRnZUxpc3QucG9wKCk7XG4gICAgfSk7IC8vIGZvcndhcmRcblxuICAgIE9iamVjdC5rZXlzKGZvcndhcmRSb290KS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIHZhciBfYSA9IGZvcndhcmRSb290W2tleV0sXG4gICAgICAgICAgZnJvbU5vZGVJZCA9IF9hLmZyb21Ob2RlSWQsXG4gICAgICAgICAgZWRnZUxhYmVsID0gX2EuZWRnZUxhYmVsLFxuICAgICAgICAgIG5vZGVMYWJlbDIgPSBfYS5ub2RlTGFiZWwyO1xuXG4gICAgICBfdGhpcy5kZnNDb2RlLmRmc0VkZ2VMaXN0LnB1c2gobmV3IERGU2VkZ2UoZnJvbU5vZGVJZCwgbWF4VG9DICsgMSwgVkFDQU5UX05PREVfTEFCRUwsIGVkZ2VMYWJlbCwgbm9kZUxhYmVsMikpO1xuXG4gICAgICBfdGhpcy5zdWJHcmFwaE1pbmluZyhmb3J3YXJkUm9vdFtrZXldLnByb2plY3RlZCk7XG5cbiAgICAgIF90aGlzLmRmc0NvZGUuZGZzRWRnZUxpc3QucG9wKCk7XG4gICAgfSk7XG4gIH07XG5cbiAgR1NwYW4ucHJvdG90eXBlLmdlbmVyYXRlMUVkZ2VGcmVxdWVudFN1YkdyYXBocyA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZ3JhcGhzID0gdGhpcy5ncmFwaHM7XG4gICAgdmFyIGRpcmVjdGVkID0gdGhpcy5kaXJlY3RlZDtcbiAgICB2YXIgbWluU3VwcG9ydCA9IHRoaXMubWluU3VwcG9ydDtcbiAgICB2YXIgZnJlcXVlbnRTaXplMVN1YmdyYXBocyA9IHRoaXMuZnJlcXVlbnRTaXplMVN1YmdyYXBocztcbiAgICB2YXIgbm9kZUxhYmVsQ291bnRlciA9IHt9LFxuICAgICAgICBub2RlRWRnZU5vZGVDb3VudGVyID0ge307IC8vIOS/neWtmOWQhOS4quWbvuWSjOWQhOiHquiKgueCueeahOWFs+ezuyBtYXDvvIxrZXkg5qC85byP5Li6IGdyYXBoS2V5LW5vZGXnsbvlnotcblxuICAgIHZhciBub2RlTGFibGVDb3VudGVkID0ge307IC8vIOS/neWtmOWQhOS4quWbvuWSjOWQhOiHqui+ueeahOWFs+ezuyBtYXDvvIxrZXkg5qC85byP5Li6IGdyYXBoS2V5LWZyb21Ob2Rl57G75Z6LLWVkZ2XnsbvlnostdG9Ob2Rl57G75Z6LXG5cbiAgICB2YXIgbm9kZUVkZ2VOb2RlTGFiZWxDb3VudGVkID0ge307XG4gICAgT2JqZWN0LmtleXMoZ3JhcGhzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIC8vIExpbmUgMjcxXG4gICAgICB2YXIgZ3JhcGggPSBncmFwaHNba2V5XTtcbiAgICAgIHZhciBub2RlTWFwID0gZ3JhcGgubm9kZU1hcDsgLy8g6YGN5Y6G6IqC54K577yM6K6w5b2V5a+55bqU5Zu+IOS4jiDmr4/kuKroioLngrnnmoQgbGFiZWwg5YiwIG5vZGVMYWJsZUNvdW50ZWRcblxuICAgICAgZ3JhcGgubm9kZXMuZm9yRWFjaChmdW5jdGlvbiAobm9kZSwgaSkge1xuICAgICAgICAvLyBMaW5lIDI3MlxuICAgICAgICB2YXIgbm9kZUxhYmVsID0gbm9kZS5sYWJlbDtcbiAgICAgICAgdmFyIGdyYXBoTm9kZUtleSA9IGtleSArIFwiLVwiICsgbm9kZUxhYmVsO1xuXG4gICAgICAgIGlmICghbm9kZUxhYmxlQ291bnRlZFtncmFwaE5vZGVLZXldKSB7XG4gICAgICAgICAgdmFyIGNvdW50ZXIgPSBub2RlTGFiZWxDb3VudGVyW25vZGVMYWJlbF0gfHwgMDtcbiAgICAgICAgICBjb3VudGVyKys7XG4gICAgICAgICAgbm9kZUxhYmVsQ291bnRlcltub2RlTGFiZWxdID0gY291bnRlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIG5vZGVMYWJsZUNvdW50ZWRbZ3JhcGhOb2RlS2V5XSA9IHtcbiAgICAgICAgICBncmFwaEtleToga2V5LFxuICAgICAgICAgIGxhYmVsOiBub2RlTGFiZWxcbiAgICAgICAgfTsgLy8g6YGN5Y6G6K+l6IqC54K555qE5omA5pyJ6L6577yM6K6w5b2V5ZCE5Liq5Zu+5ZKM5ZCE6Ieq6L6555qE5YWz57O75YiwIG5vZGVFZGdlTm9kZUxhYmVsQ291bnRlZC4gTGluZSAyNzZcblxuICAgICAgICBub2RlLmVkZ2VzLmZvckVhY2goZnVuY3Rpb24gKGVkZ2UpIHtcbiAgICAgICAgICB2YXIgbm9kZUxhYmVsMSA9IG5vZGVMYWJlbDtcbiAgICAgICAgICB2YXIgbm9kZUxhYmVsMiA9IG5vZGVNYXBbZWRnZS50b10ubGFiZWw7XG5cbiAgICAgICAgICBpZiAoIWRpcmVjdGVkICYmIG5vZGVMYWJlbDEgPiBub2RlTGFiZWwyKSB7XG4gICAgICAgICAgICB2YXIgdG1wID0gbm9kZUxhYmVsMjtcbiAgICAgICAgICAgIG5vZGVMYWJlbDIgPSBub2RlTGFiZWwxO1xuICAgICAgICAgICAgbm9kZUxhYmVsMSA9IHRtcDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgZWRnZUxhYmVsID0gZWRnZS5sYWJlbDtcbiAgICAgICAgICB2YXIgZ3JhcGhOb2RlRWRnZU5vZGVLZXkgPSBrZXkgKyBcIi1cIiArIG5vZGVMYWJlbDEgKyBcIi1cIiArIGVkZ2VMYWJlbCArIFwiLVwiICsgbm9kZUxhYmVsMjtcbiAgICAgICAgICB2YXIgbm9kZUVkZ2VOb2RlS2V5ID0gbm9kZUxhYmVsMSArIFwiLVwiICsgZWRnZUxhYmVsICsgXCItXCIgKyBub2RlTGFiZWwyO1xuXG4gICAgICAgICAgaWYgKCFub2RlRWRnZU5vZGVDb3VudGVyW25vZGVFZGdlTm9kZUtleV0pIHtcbiAgICAgICAgICAgIHZhciBjb3VudGVyID0gbm9kZUVkZ2VOb2RlQ291bnRlcltub2RlRWRnZU5vZGVLZXldIHx8IDA7XG4gICAgICAgICAgICBjb3VudGVyKys7XG4gICAgICAgICAgICBub2RlRWRnZU5vZGVDb3VudGVyW25vZGVFZGdlTm9kZUtleV0gPSBjb3VudGVyOyAvLyBMaW5lMjgxXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbm9kZUVkZ2VOb2RlTGFiZWxDb3VudGVkW2dyYXBoTm9kZUVkZ2VOb2RlS2V5XSA9IHtcbiAgICAgICAgICAgIGdyYXBoSWQ6IGtleSxcbiAgICAgICAgICAgIG5vZGVMYWJlbDE6IG5vZGVMYWJlbDEsXG4gICAgICAgICAgICBlZGdlTGFiZWw6IGVkZ2VMYWJlbCxcbiAgICAgICAgICAgIG5vZGVMYWJlbDI6IG5vZGVMYWJlbDJcbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pOyAvLyDorqHnrpfpopHnuYHnmoToioLngrlcblxuICAgIE9iamVjdC5rZXlzKG5vZGVMYWJlbENvdW50ZXIpLmZvckVhY2goZnVuY3Rpb24gKGxhYmVsKSB7XG4gICAgICB2YXIgY291bnQgPSBub2RlTGFiZWxDb3VudGVyW2xhYmVsXTtcbiAgICAgIGlmIChjb3VudCA8IG1pblN1cHBvcnQpIHJldHVybjtcbiAgICAgIHZhciBnID0ge1xuICAgICAgICBub2RlczogW10sXG4gICAgICAgIGVkZ2VzOiBbXVxuICAgICAgfTtcbiAgICAgIGcubm9kZXMucHVzaCh7XG4gICAgICAgIGlkOiBcIjBcIixcbiAgICAgICAgbGFiZWw6IGxhYmVsXG4gICAgICB9KTtcbiAgICAgIGZyZXF1ZW50U2l6ZTFTdWJncmFwaHMucHVzaChnKTsgLy8gaWYgKG1pbk5vZGVOdW0gPD0gMSkgcmVwb3J0U2l6ZTEgVE9ET1xuICAgIH0pO1xuICAgIHJldHVybiBmcmVxdWVudFNpemUxU3ViZ3JhcGhzO1xuICB9O1xuXG4gIEdTcGFuLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIF90aGlzID0gdGhpczsgLy8gLS0tLS0tLS0g56ys5LiA5q2lLCBfZ2VuZXJhdGVfMWVkZ2VfZnJlcXVlbnRfc3ViZ3JhcGhz77ya6aKR57mB55qE5Y2V5Liq6IqC54K5LS0tLS0tLVxuXG5cbiAgICB0aGlzLmZyZXF1ZW50U2l6ZTFTdWJncmFwaHMgPSB0aGlzLmdlbmVyYXRlMUVkZ2VGcmVxdWVudFN1YkdyYXBocygpO1xuICAgIGlmICh0aGlzLm1heE5vZGVOdW0gPCAyKSByZXR1cm47XG4gICAgdmFyIGdyYXBocyA9IHRoaXMuZ3JhcGhzO1xuICAgIHZhciBkaXJlY3RlZCA9IHRoaXMuZGlyZWN0ZWQ7IC8vIFBERlMg5pWw57uE55qEIG1hcCBMaW5lIDMwNFxuXG4gICAgdmFyIHJvb3QgPSB7fTtcbiAgICBPYmplY3Qua2V5cyhncmFwaHMpLmZvckVhY2goZnVuY3Rpb24gKGdyYXBoSWQpIHtcbiAgICAgIHZhciBncmFwaCA9IGdyYXBoc1tncmFwaElkXTtcbiAgICAgIHZhciBub2RlTWFwID0gZ3JhcGgubm9kZU1hcDsgLy8gTGluZSAzMDZcblxuICAgICAgZ3JhcGgubm9kZXMuZm9yRWFjaChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICB2YXIgZm9yd2FyZFJvb3RFZGdlcyA9IF90aGlzLmZpbmRGb3J3YXJkUm9vdEVkZ2VzKGdyYXBoLCBub2RlKTsgLy8gTGluZSAzMDhcblxuXG4gICAgICAgIGZvcndhcmRSb290RWRnZXMuZm9yRWFjaChmdW5jdGlvbiAoZWRnZSkge1xuICAgICAgICAgIHZhciB0b05vZGUgPSBub2RlTWFwW2VkZ2UudG9dO1xuICAgICAgICAgIHZhciBub2RlRWRnZU5vZGVMYWJlbCA9IG5vZGUubGFiZWwgKyBcIi1cIiArIGVkZ2UubGFiZWwgKyBcIi1cIiArIHRvTm9kZS5sYWJlbDtcbiAgICAgICAgICBpZiAoIXJvb3Rbbm9kZUVkZ2VOb2RlTGFiZWxdKSByb290W25vZGVFZGdlTm9kZUxhYmVsXSA9IHtcbiAgICAgICAgICAgIHByb2plY3RlZDogW10sXG4gICAgICAgICAgICBub2RlTGFiZWwxOiBub2RlLmxhYmVsLFxuICAgICAgICAgICAgZWRnZUxhYmVsOiBlZGdlLmxhYmVsLFxuICAgICAgICAgICAgbm9kZUxhYmVsMjogdG9Ob2RlLmxhYmVsXG4gICAgICAgICAgfTtcbiAgICAgICAgICB2YXIgcGRmcyA9IHtcbiAgICAgICAgICAgIGdyYXBoSWQ6IGdyYXBoSWQsXG4gICAgICAgICAgICBlZGdlOiBlZGdlLFxuICAgICAgICAgICAgcHJlTm9kZTogbnVsbFxuICAgICAgICAgIH07XG4gICAgICAgICAgcm9vdFtub2RlRWRnZU5vZGVMYWJlbF0ucHJvamVjdGVkLnB1c2gocGRmcyk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7IC8vIExpbmUgMzEzXG5cbiAgICBPYmplY3Qua2V5cyhyb290KS5mb3JFYWNoKGZ1bmN0aW9uIChub2RlRWRnZU5vZGVMYWJlbCkge1xuICAgICAgdmFyIF9hID0gcm9vdFtub2RlRWRnZU5vZGVMYWJlbF0sXG4gICAgICAgICAgcHJvamVjdGVkID0gX2EucHJvamVjdGVkLFxuICAgICAgICAgIG5vZGVMYWJlbDEgPSBfYS5ub2RlTGFiZWwxLFxuICAgICAgICAgIGVkZ2VMYWJlbCA9IF9hLmVkZ2VMYWJlbCxcbiAgICAgICAgICBub2RlTGFiZWwyID0gX2Eubm9kZUxhYmVsMjtcblxuICAgICAgX3RoaXMuZGZzQ29kZS5kZnNFZGdlTGlzdC5wdXNoKG5ldyBERlNlZGdlKDAsIDEsIG5vZGVMYWJlbDEsIGVkZ2VMYWJlbCwgbm9kZUxhYmVsMikpO1xuXG4gICAgICBfdGhpcy5zdWJHcmFwaE1pbmluZyhwcm9qZWN0ZWQpO1xuXG4gICAgICBfdGhpcy5kZnNDb2RlLmRmc0VkZ2VMaXN0LnBvcCgpO1xuICAgIH0pO1xuICB9O1xuXG4gIHJldHVybiBHU3Bhbjtcbn0oKTtcblxudmFyIGZvcm1hdEdyYXBocyA9IGZ1bmN0aW9uIGZvcm1hdEdyYXBocyhncmFwaHMsIGRpcmVjdGVkLCBub2RlTGFiZWxQcm9wLCBlZGdlTGFiZWxQcm9wKSB7XG4gIHZhciByZXN1bHQgPSB7fTtcbiAgT2JqZWN0LmtleXMoZ3JhcGhzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXksIGkpIHtcbiAgICB2YXIgZ3JhcGggPSBncmFwaHNba2V5XTtcbiAgICB2YXIgZkdyYXBoID0gbmV3IEdyYXBoKGksIHRydWUsIGRpcmVjdGVkKTtcbiAgICB2YXIgbm9kZUlkeE1hcCA9IHt9O1xuICAgIGdyYXBoLm5vZGVzLmZvckVhY2goZnVuY3Rpb24gKG5vZGUsIGopIHtcbiAgICAgIGZHcmFwaC5hZGROb2RlKGosIG5vZGVbbm9kZUxhYmVsUHJvcF0pO1xuICAgICAgbm9kZUlkeE1hcFtub2RlLmlkXSA9IGo7XG4gICAgfSk7XG4gICAgZ3JhcGguZWRnZXMuZm9yRWFjaChmdW5jdGlvbiAoZWRnZSwgaykge1xuICAgICAgdmFyIHNvdXJjZUlkeCA9IG5vZGVJZHhNYXBbZWRnZS5zb3VyY2VdO1xuICAgICAgdmFyIHRhcmdldElkeCA9IG5vZGVJZHhNYXBbZWRnZS50YXJnZXRdO1xuICAgICAgZkdyYXBoLmFkZEVkZ2UoLTEsIHNvdXJjZUlkeCwgdGFyZ2V0SWR4LCBlZGdlW2VkZ2VMYWJlbFByb3BdKTtcbiAgICB9KTtcbiAgICBpZiAoZkdyYXBoICYmIGZHcmFwaC5nZXROb2RlTnVtKCkpIHJlc3VsdFtmR3JhcGguaWRdID0gZkdyYXBoO1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbnZhciB0b0dyYXBoRGF0YXMgPSBmdW5jdGlvbiB0b0dyYXBoRGF0YXMoZ3JhcGhzLCBub2RlTGFiZWxQcm9wLCBlZGdlTGFiZWxQcm9wKSB7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgZ3JhcGhzLmZvckVhY2goZnVuY3Rpb24gKGdyYXBoKSB7XG4gICAgdmFyIGdyYXBoRGF0YSA9IHtcbiAgICAgIG5vZGVzOiBbXSxcbiAgICAgIGVkZ2VzOiBbXVxuICAgIH07XG4gICAgZ3JhcGgubm9kZXMuZm9yRWFjaChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgdmFyIF9hO1xuXG4gICAgICBncmFwaERhdGEubm9kZXMucHVzaCgoX2EgPSB7XG4gICAgICAgIGlkOiBcIlwiICsgbm9kZS5pZFxuICAgICAgfSwgX2Fbbm9kZUxhYmVsUHJvcF0gPSBub2RlLmxhYmVsLCBfYSkpO1xuICAgIH0pO1xuICAgIGdyYXBoLmVkZ2VzLmZvckVhY2goZnVuY3Rpb24gKGVkZ2UpIHtcbiAgICAgIHZhciBfYTtcblxuICAgICAgZ3JhcGhEYXRhLmVkZ2VzLnB1c2goKF9hID0ge1xuICAgICAgICBzb3VyY2U6IFwiXCIgKyBlZGdlLmZyb20sXG4gICAgICAgIHRhcmdldDogXCJcIiArIGVkZ2UudG9cbiAgICAgIH0sIF9hW2VkZ2VMYWJlbFByb3BdID0gZWRnZS5sYWJlbCwgX2EpKTtcbiAgICB9KTtcbiAgICByZXN1bHQucHVzaChncmFwaERhdGEpO1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbnZhciBERUZBVUxUX0xBQkVMX05BTUUgPSBcImNsdXN0ZXJcIjtcbi8qKlxuICogZ1NwYW4g6aKR57mB5a2Q5Zu+6K6h566X566X5rOV77yIZnJlcXVlbnQgZ3JhcGggbWluaW5n77yJXG4gKiBAcGFyYW0gcGFyYW1zIOWPguaVsFxuICovXG5cbnZhciBnU3BhbiA9IGZ1bmN0aW9uIGdTcGFuKHBhcmFtcykge1xuICAvLyAtLS0tLS0tIOWwhuWbvuaVsOaNriBHcmFwaERhdGEg55qEIG1hcCDovazmjaLkuLrmoLzlvI8gLS0tLS0tLVxuICB2YXIgZ3JhcGhzID0gcGFyYW1zLmdyYXBocyxcbiAgICAgIF9hID0gcGFyYW1zLmRpcmVjdGVkLFxuICAgICAgZGlyZWN0ZWQgPSBfYSA9PT0gdm9pZCAwID8gZmFsc2UgOiBfYSxcbiAgICAgIF9iID0gcGFyYW1zLm5vZGVMYWJlbFByb3AsXG4gICAgICBub2RlTGFiZWxQcm9wID0gX2IgPT09IHZvaWQgMCA/IERFRkFVTFRfTEFCRUxfTkFNRSA6IF9iLFxuICAgICAgX2MgPSBwYXJhbXMuZWRnZUxhYmVsUHJvcCxcbiAgICAgIGVkZ2VMYWJlbFByb3AgPSBfYyA9PT0gdm9pZCAwID8gREVGQVVMVF9MQUJFTF9OQU1FIDogX2M7XG4gIHZhciBmb3JtYXR0ZWRHcmFwaHMgPSBmb3JtYXRHcmFwaHMoZ3JhcGhzLCBkaXJlY3RlZCwgbm9kZUxhYmVsUHJvcCwgZWRnZUxhYmVsUHJvcCk7XG4gIHZhciBtaW5TdXBwb3J0ID0gcGFyYW1zLm1pblN1cHBvcnQsXG4gICAgICBtYXhOb2RlTnVtID0gcGFyYW1zLm1heE5vZGVOdW0sXG4gICAgICBtaW5Ob2RlTnVtID0gcGFyYW1zLm1pbk5vZGVOdW0sXG4gICAgICB2ZXJib3NlID0gcGFyYW1zLnZlcmJvc2UsXG4gICAgICB0b3AgPSBwYXJhbXMudG9wOyAvLyAtLS0tLS0tIOWIneWni+WMluS4juaJp+ihjOeul+azlSAtLS0tLS0tXG5cbiAgdmFyIGFsZ29QYXJhbXMgPSB7XG4gICAgZ3JhcGhzOiBmb3JtYXR0ZWRHcmFwaHMsXG4gICAgbWluU3VwcG9ydDogbWluU3VwcG9ydCxcbiAgICBtYXhOb2RlTnVtOiBtYXhOb2RlTnVtLFxuICAgIG1pbk5vZGVOdW06IG1pbk5vZGVOdW0sXG4gICAgdG9wOiB0b3AsXG4gICAgdmVyYm9zZTogdmVyYm9zZSxcbiAgICBkaXJlY3RlZDogZGlyZWN0ZWRcbiAgfTtcbiAgdmFyIGNhbGN1bGF0b3IgPSBuZXcgR1NwYW4oYWxnb1BhcmFtcyk7XG4gIGNhbGN1bGF0b3IucnVuKCk7XG4gIHZhciByZXN1bHQgPSB0b0dyYXBoRGF0YXMoY2FsY3VsYXRvci5mcmVxdWVudFN1YmdyYXBocywgbm9kZUxhYmVsUHJvcCwgZWRnZUxhYmVsUHJvcCk7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBnU3BhbjsiLCJpbXBvcnQgeyBfX3NwcmVhZEFycmF5IH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgZmxveWRXYXJzaGFsbCBmcm9tICcuL2Zsb3lkV2Fyc2hhbGwnO1xuaW1wb3J0IGdTcGFuIGZyb20gJy4vZ1NwYW4vZ1NwYW4nO1xuaW1wb3J0IGRpamtzdHJhIGZyb20gJy4vZGlqa3N0cmEnO1xuaW1wb3J0IHsgdW5pcXVlSWQgfSBmcm9tICcuL3V0aWwnO1xuLyoqXG4gKiDkuLogZ3JhcGhEYXRhIOS4reavj+S4quiKgueCueeUn+aIkOmCu+WxheWNleWFg+aVsOe7hFxuICogQHBhcmFtIGdyYXBoRGF0YVxuICogQHBhcmFtIHNwbVxuICogQHBhcmFtIG5vZGVMYWJlbFByb3BcbiAqIEBwYXJhbSBrIGst6L+R6YK7XG4gKi9cblxudmFyIGZpbmRLTmVpZ2hib3JVbml0cyA9IGZ1bmN0aW9uIGZpbmRLTmVpZ2hib3JVbml0cyhncmFwaERhdGEsIHNwbSwgbm9kZUxhYmVsUHJvcCwgaykge1xuICBpZiAobm9kZUxhYmVsUHJvcCA9PT0gdm9pZCAwKSB7XG4gICAgbm9kZUxhYmVsUHJvcCA9ICdjbHVzdGVyJztcbiAgfVxuXG4gIGlmIChrID09PSB2b2lkIDApIHtcbiAgICBrID0gMjtcbiAgfVxuXG4gIHZhciB1bml0cyA9IFtdO1xuICB2YXIgbm9kZXMgPSBncmFwaERhdGEubm9kZXM7XG4gIHNwbS5mb3JFYWNoKGZ1bmN0aW9uIChyb3csIGkpIHtcbiAgICB1bml0cy5wdXNoKGZpbmRLTmVpZ2hib3JVbml0KG5vZGVzLCByb3csIGksIG5vZGVMYWJlbFByb3AsIGspKTtcbiAgfSk7XG4gIHJldHVybiB1bml0cztcbn07XG5cbnZhciBmaW5kS05laWdoYm9yVW5pdCA9IGZ1bmN0aW9uIGZpbmRLTmVpZ2hib3JVbml0KG5vZGVzLCByb3csIGksIG5vZGVMYWJlbFByb3AsIGspIHtcbiAgdmFyIHVuaXROb2RlSWR4cyA9IFtpXTtcbiAgdmFyIG5laWdoYm9ycyA9IFtdO1xuICB2YXIgbGFiZWxDb3VudE1hcCA9IHt9O1xuICByb3cuZm9yRWFjaChmdW5jdGlvbiAodiwgaikge1xuICAgIGlmICh2IDw9IGsgJiYgaSAhPT0gaikge1xuICAgICAgdW5pdE5vZGVJZHhzLnB1c2goaik7XG4gICAgICBuZWlnaGJvcnMucHVzaChub2Rlc1tqXSk7XG4gICAgICB2YXIgbGFiZWwgPSBub2Rlc1tqXVtub2RlTGFiZWxQcm9wXTtcbiAgICAgIGlmICghbGFiZWxDb3VudE1hcFtsYWJlbF0pIGxhYmVsQ291bnRNYXBbbGFiZWxdID0ge1xuICAgICAgICBjb3VudDogMSxcbiAgICAgICAgZGlzdHM6IFt2XVxuICAgICAgfTtlbHNlIHtcbiAgICAgICAgbGFiZWxDb3VudE1hcFtsYWJlbF0uY291bnQrKztcbiAgICAgICAgbGFiZWxDb3VudE1hcFtsYWJlbF0uZGlzdHMucHVzaCh2KTtcbiAgICAgIH1cbiAgICB9XG4gIH0pOyAvLyDlsIYgbGFiZWxDb3VudE1hcCDkuK3nmoQgZGlzdHMg5oyJ54Wn5LuO5bCP5Yiw5aSn5o6S5bqP77yM5pa55L6/5ZCO6Z2i5L2/55SoXG5cbiAgT2JqZWN0LmtleXMobGFiZWxDb3VudE1hcCkuZm9yRWFjaChmdW5jdGlvbiAobGFiZWwpIHtcbiAgICBsYWJlbENvdW50TWFwW2xhYmVsXS5kaXN0cyA9IGxhYmVsQ291bnRNYXBbbGFiZWxdLmRpc3RzLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgIHJldHVybiBhIC0gYjtcbiAgICB9KTtcbiAgfSk7XG4gIHJldHVybiB7XG4gICAgbm9kZUlkeDogaSxcbiAgICBub2RlSWQ6IG5vZGVzW2ldLmlkLFxuICAgIG5vZGVJZHhzOiB1bml0Tm9kZUlkeHMsXG4gICAgbmVpZ2hib3JzOiBuZWlnaGJvcnMsXG4gICAgbmVpZ2hib3JOdW06IHVuaXROb2RlSWR4cy5sZW5ndGggLSAxLFxuICAgIG5vZGVMYWJlbENvdW50TWFwOiBsYWJlbENvdW50TWFwXG4gIH07XG59O1xuLyoqXG4gKiDpmo/mnLrlr7vmib7ngrnlr7nvvIzmu6HotrPot53nprvlsI/kuo4ga1xuICogQHBhcmFtIGsg5Y+C5pWwIGvvvIzooajnpLogay3ov5HpgrtcbiAqIEBwYXJhbSBub2RlTnVtIOWPguaVsCBsZW5ndGhcbiAqIEBwYXJhbSBtYXhOb2RlUGFpck51bSDlr7vmib7ngrnlr7nnmoTmlbDph4/kuI3otoXov4cgbWF4Tm9kZVBhaXJOdW1cbiAqIEBwYXJhbSBzcG0g5pyA55+t6Lev5b6E55+p6Zi1XG4gKi9cblxuXG52YXIgZmluZE5vZGVQYWlyc1JhbmRvbWx5ID0gZnVuY3Rpb24gZmluZE5vZGVQYWlyc1JhbmRvbWx5KGssIG5vZGVOdW0sIG1heE5vZGVQYWlyTnVtLCBrTmVpZ2hib3JVbml0cywgc3BtKSB7XG4gIC8vIOavj+S4quiKgueCuemcgOimgemaj+acuuaJvuWHuueahOeCueWvueaVsFxuICB2YXIgbm9kZVBhaXJOdW1FYWNoTm9kZSA9IE1hdGguY2VpbChtYXhOb2RlUGFpck51bSAvIG5vZGVOdW0pO1xuICB2YXIgbm9kZVBhaXJNYXAgPSB7fTtcbiAgdmFyIGZvdW5kTm9kZVBhaXJDb3VudCA9IDA7IC8vIOmBjeWOhuiKgueCue+8jOS4uuavj+S4quiKgueCuemaj+acuuaJvuWHuiBub2RlUGFpck51bUVhY2hOb2RlIOS4queCueWvue+8jOa7oei2s+i3neemu+Wwj+S6jiBr44CC5om+5Yiw55qE54K55a+55pWw6YeP6LaF6L+HIG1heE5vZGVQYWlyTnVtIOaIluaJgOacieiKgueCuemBjeWOhue7k+adn+aXtue7iOatolxuXG4gIGtOZWlnaGJvclVuaXRzLmZvckVhY2goZnVuY3Rpb24gKHVuaXQsIGkpIHtcbiAgICAvLyDoi6XmnKrovr7liLAgbm9kZVBhaXJOdW1FYWNoTm9kZe+8jOaIluW+queOr+asoeaVsOWwj+S6juacgOWkp+W+queOr+asoeaVsCgyICogbm9kZU51bSnvvIznu6fnu63lvqrnjq9cbiAgICB2YXIgbm9kZVBhaXJGb3JJQ291bnQgPSAwO1xuICAgIHZhciBvdXRlckxvb3BDb3VudCA9IDA7XG4gICAgdmFyIG5laWdoYm9ycyA9IHVuaXQubm9kZUlkeHM7IC8vIHRoZSBmaXJzdCBvbmUgaXMgdGhlIGNlbnRlciBub2RlXG5cbiAgICB2YXIgbmVpZ2hib3JOdW0gPSB1bml0Lm5laWdoYm9yTnVtIC0gMTtcblxuICAgIHdoaWxlIChub2RlUGFpckZvcklDb3VudCA8IG5vZGVQYWlyTnVtRWFjaE5vZGUpIHtcbiAgICAgIC8vIOWPpuS4gOerr+iKgueCueWcqOiKgueCueaVsOe7hOS4reeahOeahCBpbmRleFxuICAgICAgdmFyIG9pZHggPSBuZWlnaGJvcnNbMSArIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIG5laWdoYm9yTnVtKV07XG4gICAgICB2YXIgaW5uZXJMb29wQ291bnQgPSAwOyAvLyDoi6Xpmo/mnLrlvpfliLDnmoTlj6bkuIDnq68gaWR4IOS4jeespuWQiOadoeS7tu+8jOWImee7p+e7rSByYW5kb23jgILmnaHku7bmmK/kuI3mmK/lkIzkuIDkuKroioLngrnjgIHov5nkuKrngrnlr7nmsqHmnInooqvorrDlvZXov4fjgIHot53nprvlsI/kuo4ga1xuXG4gICAgICB3aGlsZSAobm9kZVBhaXJNYXBbaSArIFwiLVwiICsgb2lkeF0gfHwgbm9kZVBhaXJNYXBbb2lkeCArIFwiLVwiICsgaV0pIHtcbiAgICAgICAgb2lkeCA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIG5vZGVOdW0pO1xuICAgICAgICBpbm5lckxvb3BDb3VudCsrO1xuICAgICAgICBpZiAoaW5uZXJMb29wQ291bnQgPiAyICogbm9kZU51bSkgYnJlYWs7IC8vIOW+queOr+asoeaVsOWkp+S6juacgOWkp+W+queOr+asoeaVsCgyICogbm9kZU51bSnot7Plh7rlvqrnjq/vvIzpgb/lhY3mrbvlvqrnjq9cbiAgICAgIH1cblxuICAgICAgaWYgKGlubmVyTG9vcENvdW50IDwgMiAqIG5vZGVOdW0pIHtcbiAgICAgICAgLy8g5pyq6L6+5Yiw5pyA5aSn5b6q546v5qyh5pWw77yM6K+05piO5om+5Yiw5LqG5ZCI6YCC55qE5Y+m5LiA56uvXG4gICAgICAgIG5vZGVQYWlyTWFwW2kgKyBcIi1cIiArIG9pZHhdID0ge1xuICAgICAgICAgIHN0YXJ0OiBpLFxuICAgICAgICAgIGVuZDogb2lkeCxcbiAgICAgICAgICBkaXN0YW5jZTogc3BtW2ldW29pZHhdXG4gICAgICAgIH07XG4gICAgICAgIG5vZGVQYWlyRm9ySUNvdW50Kys7XG4gICAgICAgIGZvdW5kTm9kZVBhaXJDb3VudCsrOyAvLyDlpoLmnpzlvZPliY3mib7liLDnmoTngrnlr7nmlbDph4/ovr7liLDkuobkuIrpmZDvvIzov5Tlm57nu5PmnpxcblxuICAgICAgICBpZiAoZm91bmROb2RlUGFpckNvdW50ID49IG1heE5vZGVQYWlyTnVtKSByZXR1cm4gbm9kZVBhaXJNYXA7XG4gICAgICB9XG5cbiAgICAgIG91dGVyTG9vcENvdW50Kys7XG4gICAgICBpZiAob3V0ZXJMb29wQ291bnQgPiAyICogbm9kZU51bSkgYnJlYWs7IC8vIOW+queOr+asoeaVsOWkp+S6juacgOWkp+W+queOr+asoeaVsCgyICogbm9kZU51bSnot7Plh7rlvqrnjq/vvIzpgb/lhY3mrbvlvqrnjq9cbiAgICB9IC8vIOi/meS4quiKgueCueayoeacieaJvuWIsOi2s+WknyBub2RlUGFpck51bUVhY2hOb2RlIOeahOeCueWvueOAguabtOaWsCBub2RlUGFpck51bUVhY2hOb2Rl77yM6K6p5ZCO57ut6IqC54K55om+5pu05aSa55qE54K55a+5XG5cblxuICAgIGlmIChub2RlUGFpckZvcklDb3VudCA8IG5vZGVQYWlyTnVtRWFjaE5vZGUpIHtcbiAgICAgIHZhciBnYXAgPSBub2RlUGFpck51bUVhY2hOb2RlIC0gbm9kZVBhaXJGb3JJQ291bnQ7XG4gICAgICBub2RlUGFpck51bUVhY2hOb2RlID0gKG5vZGVQYWlyTnVtRWFjaE5vZGUgKyBnYXApIC8gKG5vZGVOdW0gLSBpIC0gMSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIG5vZGVQYWlyTWFwO1xufTtcbi8qKlxuICog6K6h566X5omA5pyJIG5vZGVQYWlyTWFwIOS4reiKgueCueWvueeahOebuOS6pOmCu+WxheivseWvvOWtkOWbvlxuICogQHBhcmFtIG5vZGVQYWlyTWFwIOiKgueCueWvuSBtYXDvvIxrZXkg5Li6IG5vZGUxLmlkLW5vZGUyLmlk77yMdmFsdWUg5Li6IHsgc3RhcnROb2RlSWR4LCBlbmROb2RlSWR4LCBkaXN0YW5jZSB9XG4gKiBAcGFyYW0gbmVpZ2hib3JVbml0cyDmr4/kuKroioLngrnnmoTpgrvlsYXlhYPmlbDnu4RcbiAqIEBwYXJhbSBncmFwaERhdGEg5Y6f5Zu+5pWw5o2uXG4gKiBAcGFyYW0gZWRnZU1hcCDovrnnmoQgbWFw77yM5pa55L6/5qOA57SiXG4gKiBAcGFyYW0gY2FjaGVkSW5kdWNlZEdyYXBoTWFwIOe8k+WtmOeahOe7k+aenO+8jOS4i+asoei/m+WFpeivpeWHveaVsOWwhue7p+e7reabtOaWsOivpee8k+WtmO+8jOiLpSBrZXkg5Zyo57yT5a2Y5Lit5a2Y5Zyo5YiZ5LiN6ZyA6KaB6YeN5aSN6K6h566XXG4gKi9cblxuXG52YXIgZ2V0SW50ZXJzZWN0TmVpZ2hib3JJbmR1Y2VkR3JhcGggPSBmdW5jdGlvbiBnZXRJbnRlcnNlY3ROZWlnaGJvckluZHVjZWRHcmFwaChub2RlUGFpck1hcCwgbmVpZ2hib3JVbml0cywgZ3JhcGhEYXRhLCBjYWNoZWRJbmR1Y2VkR3JhcGhNYXApIHtcbiAgdmFyIG5vZGVzID0gZ3JhcGhEYXRhLm5vZGVzO1xuICBpZiAoIWNhY2hlZEluZHVjZWRHcmFwaE1hcCkgY2FjaGVkSW5kdWNlZEdyYXBoTWFwID0ge307XG4gIE9iamVjdC5rZXlzKG5vZGVQYWlyTWFwKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICB2YXIgX2EsIF9iO1xuXG4gICAgaWYgKGNhY2hlZEluZHVjZWRHcmFwaE1hcCAmJiBjYWNoZWRJbmR1Y2VkR3JhcGhNYXBba2V5XSkgcmV0dXJuO1xuICAgIGNhY2hlZEluZHVjZWRHcmFwaE1hcFtrZXldID0ge1xuICAgICAgbm9kZXM6IFtdLFxuICAgICAgZWRnZXM6IFtdXG4gICAgfTtcbiAgICB2YXIgcGFpciA9IG5vZGVQYWlyTWFwW2tleV07XG4gICAgdmFyIHN0YXJ0VW5pdE5vZGVJZHMgPSAoX2EgPSBuZWlnaGJvclVuaXRzW3BhaXIuc3RhcnRdKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Eubm9kZUlkeHM7XG4gICAgdmFyIGVuZFVuaXROb2RlSWRzID0gKF9iID0gbmVpZ2hib3JVbml0c1twYWlyLmVuZF0pID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5ub2RlSWR4cztcbiAgICBpZiAoIXN0YXJ0VW5pdE5vZGVJZHMgfHwgIWVuZFVuaXROb2RlSWRzKSByZXR1cm47IC8vIOS4jeWtmOWcqOmCu+WFg++8jOi/lOWbnuepuuWbvlxuXG4gICAgdmFyIGVuZFNldCA9IG5ldyBTZXQoZW5kVW5pdE5vZGVJZHMpO1xuICAgIHZhciBpbnRlcnNlY3QgPSBzdGFydFVuaXROb2RlSWRzLmZpbHRlcihmdW5jdGlvbiAoeCkge1xuICAgICAgcmV0dXJuIGVuZFNldC5oYXMoeCk7XG4gICAgfSk7IC8vIOWPr+iDveS8mueIhuagiO+8iOWcqCAxNTgwICsgNiBub2RlcyBmdWxsLWNvbm5lY3RlZCDml7blh7rnjrDvvIlcblxuICAgIGlmICghaW50ZXJzZWN0IHx8ICFpbnRlcnNlY3QubGVuZ3RoKSByZXR1cm47IC8vIOayoeacieS6pOmbhu+8jOi/lOWbnuepuuWbvlxuXG4gICAgdmFyIGludGVyc2VjdElkTWFwID0ge307XG4gICAgdmFyIGludGVyc2VjdExlbmd0aCA9IGludGVyc2VjdC5sZW5ndGg7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGludGVyc2VjdExlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgbm9kZSA9IG5vZGVzW2ludGVyc2VjdFtpXV07XG4gICAgICBjYWNoZWRJbmR1Y2VkR3JhcGhNYXBba2V5XS5ub2Rlcy5wdXNoKG5vZGUpOyAvLyDlsIbkuqTpm4bkuK3nmoTngrnliqDlhaXor7Hlr7zlrZDlm75cblxuICAgICAgaW50ZXJzZWN0SWRNYXBbbm9kZS5pZF0gPSB0cnVlO1xuICAgIH0gLy8g6YGN5Y6G5omA5pyJ6L655pWw5o2u77yM5aaC5p6c6L6555qE5Lik56uv6YO95Zyo5Lqk6ZuG5Lit77yM5bCG6K+l6L655Yqg5YWl6K+x5a+85a2Q5Zu+XG5cblxuICAgIGdyYXBoRGF0YS5lZGdlcy5mb3JFYWNoKGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgICBpZiAoaW50ZXJzZWN0SWRNYXBbZWRnZS5zb3VyY2VdICYmIGludGVyc2VjdElkTWFwW2VkZ2UudGFyZ2V0XSkgY2FjaGVkSW5kdWNlZEdyYXBoTWFwW2tleV0uZWRnZXMucHVzaChlZGdlKTtcbiAgICB9KTtcbiAgfSk7XG4gIHJldHVybiBjYWNoZWRJbmR1Y2VkR3JhcGhNYXA7XG59O1xuLyoqXG4gKiDorqHnrpcgc3RyY3V0cmUg5ZyoIGdyYXBoIOS4iueahOWMuemFjeaVsOmHj1xuICogQHBhcmFtIGdyYXBoIOWbvuaVsOaNrlxuICogQHBhcmFtIHN0cnVjdHVyZSDnm67liY3mlK/mjIHlj6rmnInkuKTkuKroioLngrnkuIDmnaHovrnnmoTmnIDnroDljZXnu5PmnoRcbiAqIEBwYXJhbSBub2RlTGFiZWxQcm9wIOiKgueCueexu+Wei+Wtl+auteWQjVxuICogQHBhcmFtIGVkZ2VMYWJlbFByb3Ag6L6557G75Z6L5a2X5q615ZCNXG4gKi9cblxuXG52YXIgZ2V0TWF0Y2hlZENvdW50ID0gZnVuY3Rpb24gZ2V0TWF0Y2hlZENvdW50KGdyYXBoLCBzdHJ1Y3R1cmUsIG5vZGVMYWJlbFByb3AsIGVkZ2VMYWJlbFByb3ApIHtcbiAgdmFyIF9hLCBfYjtcblxuICB2YXIgbm9kZU1hcCA9IHt9O1xuICBncmFwaC5ub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgbm9kZU1hcFtub2RlLmlkXSA9IG5vZGU7XG4gIH0pO1xuICB2YXIgY291bnQgPSAwO1xuICBpZiAoISgoX2EgPSBzdHJ1Y3R1cmUgPT09IG51bGwgfHwgc3RydWN0dXJlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzdHJ1Y3R1cmUuZWRnZXMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5sZW5ndGgpIHx8ICgoX2IgPSBzdHJ1Y3R1cmUgPT09IG51bGwgfHwgc3RydWN0dXJlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzdHJ1Y3R1cmUubm9kZXMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5sZW5ndGgpIDwgMikgcmV0dXJuIDA7XG4gIGdyYXBoLmVkZ2VzLmZvckVhY2goZnVuY3Rpb24gKGUpIHtcbiAgICB2YXIgc291cmNlTGFiZWwgPSBub2RlTWFwW2Uuc291cmNlXVtub2RlTGFiZWxQcm9wXTtcbiAgICB2YXIgdGFyZ2V0TGFiZWwgPSBub2RlTWFwW2UudGFyZ2V0XVtub2RlTGFiZWxQcm9wXTtcbiAgICB2YXIgc3RyTm9kZUxhYmVsMSA9IHN0cnVjdHVyZSA9PT0gbnVsbCB8fCBzdHJ1Y3R1cmUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHN0cnVjdHVyZS5ub2Rlc1swXVtub2RlTGFiZWxQcm9wXTtcbiAgICB2YXIgc3RyTm9kZUxhYmVsMiA9IHN0cnVjdHVyZSA9PT0gbnVsbCB8fCBzdHJ1Y3R1cmUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHN0cnVjdHVyZS5ub2Rlc1sxXVtub2RlTGFiZWxQcm9wXTtcbiAgICB2YXIgc3RyRWRnZUxhYmVsID0gc3RydWN0dXJlID09PSBudWxsIHx8IHN0cnVjdHVyZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc3RydWN0dXJlLmVkZ2VzWzBdW2VkZ2VMYWJlbFByb3BdO1xuICAgIGlmIChlW2VkZ2VMYWJlbFByb3BdICE9PSBzdHJFZGdlTGFiZWwpIHJldHVybjtcblxuICAgIGlmIChzb3VyY2VMYWJlbCA9PT0gc3RyTm9kZUxhYmVsMSAmJiB0YXJnZXRMYWJlbCA9PT0gc3RyTm9kZUxhYmVsMiB8fCBzb3VyY2VMYWJlbCA9PT0gc3RyTm9kZUxhYmVsMiAmJiB0YXJnZXRMYWJlbCA9PT0gc3RyTm9kZUxhYmVsMSkge1xuICAgICAgY291bnQrKztcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gY291bnQ7XG59O1xuLyoqXG4gKiBzdHJ1Y3R1cmVzIOS4reWvu+aJvuacgOWFt+acieS7o+ihqOaAp+eahOS4gOS4quOAgui/meS4que7k+aehOaYr+S9v+W+lyBtYXRjaGVkQ291bnRNYXAg55qE5YiG57uE5pa55byP57G75YaF6Ze06Led5pyA5bCP77yM57G76Ze06Ze06Led5pyA5aSnXG4gKiBAcGFyYW0gbWF0Y2hlZENvdW50TWFwIOavj+S4qiBzdHJ1Y3R1cmUg5YiG57G75ZCO55qE5ZCE5Zu+5Yy56YWN5pWw6YeP77yM5qC85byPIHsgW3N0cmN0dXJlLmlkeF06IHsgW2ludGVySW5kdWNlZEdyYXBoS2V5XTogY291bnQgfSB9XG4gKiBAcGFyYW0gc3RydWN0dXJlTnVtIHN0cmN1dHVyZSDkuKrmlbDvvIzkuI4gbWF0Y2hlZENvdW50TWFwLmxlbmd0aCDlr7nlupRcbiAqIEBwYXJhbSBzdHJ1Y3R1cmVzXG4gKi9cblxuXG52YXIgZmluZFJlcHJlc2VudFN0cnVjdHVyZSA9IGZ1bmN0aW9uIGZpbmRSZXByZXNlbnRTdHJ1Y3R1cmUobWF0Y2hlZENvdW50TWFwLCBzdHJ1Y3R1cmVOdW0sIHN0cnVjdHVyZXMpIHtcbiAgdmFyIG1heE9mZnNldCA9IEluZmluaXR5LFxuICAgICAgcmVwcmVzZW50Q2x1c3RlclR5cGUgPSAwO1xuXG4gIHZhciBfbG9vcF8xID0gZnVuY3Rpb24gX2xvb3BfMShpKSB7XG4gICAgLy8g5LiA56eN5YiG57uE55qEIG1hcO+8jGtleSDmmK8gaW50R3JhcGgg55qEIGtlee+8jHZhbHVlIOaYryBzdHJ1Y3R1cmVzW2ldIOeahOWMuemFjeS4quaVsFxuICAgIHZhciBjb3VudE1hcEkgPSBtYXRjaGVkQ291bnRNYXBbaV07IC8vIOaMieeFpyB2YWx1ZSDkuLror6Xnu4TmjpLluo/vvIznlJ/miJAga2V5cyDnmoTmlbDnu4TvvJpcblxuICAgIHZhciBzb3J0ZWRHcmFwaEtleXMgPSBPYmplY3Qua2V5cyhjb3VudE1hcEkpLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgIHJldHVybiBjb3VudE1hcElbYV0gLSBjb3VudE1hcElbYl07XG4gICAgfSk7IC8vIOWFsSAxMDAg5LiqIGdyYXBoS2V5c++8jOWwhiBncmFwaEtleXMg5oyJ6aG65bqP5YiG5Li6IGdyb3VwTnVtIOe7hFxuXG4gICAgdmFyIGdyb3VwTnVtID0gMTA7XG4gICAgdmFyIGNsdXN0ZXJzID0gW107IC8vIOaAu+WFseaciSBncm91cE51bSDkuKrpoblcblxuICAgIHNvcnRlZEdyYXBoS2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXksIGopIHtcbiAgICAgIGlmICghY2x1c3RlcnNbaiAlIGdyb3VwTnVtXSkgY2x1c3RlcnNbaiAlIGdyb3VwTnVtXSA9IHtcbiAgICAgICAgZ3JhcGhzOiBbXSxcbiAgICAgICAgdG90YWxDb3VudDogMCxcbiAgICAgICAgYXZlQ291bnQ6IDBcbiAgICAgIH07XG4gICAgICBjbHVzdGVyc1tqICUgZ3JvdXBOdW1dLmdyYXBocy5wdXNoKGtleSk7XG4gICAgICBjbHVzdGVyc1tqICUgZ3JvdXBOdW1dLnRvdGFsQ291bnQgKz0gY291bnRNYXBJW2tleV07XG4gICAgfSk7IC8vIOiuoeeulyBjbHVzdGVyIOS4jiBjbHVzdGVyIOS5i+mXtOeahOi3neemuyBpbm5lckRpc3TvvIzmr4/kuKogY2x1c3RlciDlhoXpg6jnmoTot53nprsgaW50cmFEaXN0XG5cbiAgICB2YXIgYXZlSW50cmFEaXN0ID0gMDsgLy8g6K+l57G755qE57G75YaF5bmz5Z2H5YC8XG5cbiAgICB2YXIgYXZlQ291bnRzID0gW107IC8vIOexu+WGheW5s+Wdh+WMuemFjeaVsOmHj++8jOWwhueUqOS6juiuoeeul+exu+mXtOi3neemu1xuXG4gICAgY2x1c3RlcnMuZm9yRWFjaChmdW5jdGlvbiAoZ3JhcGhzSW5DbHVzdGVyKSB7XG4gICAgICAvLyDnsbvlhoXlnYflgLxcbiAgICAgIHZhciBhdmVDb3VudCA9IGdyYXBoc0luQ2x1c3Rlci50b3RhbENvdW50IC8gZ3JhcGhzSW5DbHVzdGVyLmdyYXBocy5sZW5ndGg7XG4gICAgICBncmFwaHNJbkNsdXN0ZXIuYXZlQ291bnQgPSBhdmVDb3VudDtcbiAgICAgIGF2ZUNvdW50cy5wdXNoKGF2ZUNvdW50KTsgLy8g5a+55LqO5q+P57G777yM6K6h566X57G75YaF6Ze06Led5bmz5Z2H5YC8XG5cbiAgICAgIHZhciBhdmVJbnRyYVBlckNsdXN0ZXIgPSAwO1xuICAgICAgdmFyIGdyYXBoc051bSA9IGdyYXBoc0luQ2x1c3Rlci5sZW5ndGg7XG4gICAgICBncmFwaHNJbkNsdXN0ZXIuZ3JhcGhzLmZvckVhY2goZnVuY3Rpb24gKGdyYXBoS2V5MSwgaikge1xuICAgICAgICB2YXIgZ3JhcGgxQ291bnQgPSBjb3VudE1hcElbZ3JhcGhLZXkxXTtcbiAgICAgICAgZ3JhcGhzSW5DbHVzdGVyLmdyYXBocy5mb3JFYWNoKGZ1bmN0aW9uIChncmFwaEtleTIsIGspIHtcbiAgICAgICAgICBpZiAoaiA9PT0gaykgcmV0dXJuO1xuICAgICAgICAgIGF2ZUludHJhUGVyQ2x1c3RlciArPSBNYXRoLmFicyhncmFwaDFDb3VudCAtIGNvdW50TWFwSVtncmFwaEtleTJdKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIGF2ZUludHJhUGVyQ2x1c3RlciAvPSBncmFwaHNOdW0gKiAoZ3JhcGhzTnVtIC0gMSkgLyAyO1xuICAgICAgYXZlSW50cmFEaXN0ICs9IGF2ZUludHJhUGVyQ2x1c3RlcjtcbiAgICB9KTtcbiAgICBhdmVJbnRyYURpc3QgLz0gY2x1c3RlcnMubGVuZ3RoOyAvLyDnlKjnsbvlhoXlnYflgLzorqHnrpfnsbvpl7Tot51cblxuICAgIHZhciBhdmVJbnRlckRpc3QgPSAwOyAvLyDnsbvpl7Tpl7Tot53lubPlnYflgLxcblxuICAgIGF2ZUNvdW50cy5mb3JFYWNoKGZ1bmN0aW9uIChhdmVDb3VudDEsIGopIHtcbiAgICAgIGF2ZUNvdW50cy5mb3JFYWNoKGZ1bmN0aW9uIChhdmVDb3VudDIsIGspIHtcbiAgICAgICAgaWYgKGogPT09IGspIHJldHVybjtcbiAgICAgICAgYXZlSW50ZXJEaXN0ICs9IE1hdGguYWJzKGF2ZUNvdW50MSAtIGF2ZUNvdW50Mik7XG4gICAgICB9KTtcbiAgICAgIGF2ZUludGVyRGlzdCAvPSBhdmVDb3VudHMubGVuZ3RoICogKGF2ZUNvdW50cy5sZW5ndGggLSAxKSAvIDI7XG4gICAgfSk7IC8vIOWvu+aJviAo57G76Ze06Ze06Led5Z2H5YC8Leexu+WGhemXtOi3neWdh+WAvCkg5pyA5aSn55qE5LiA56eN5YiG57uE5pa55byP77yI5a+55bqU55qEIHN0cnVjdHVyZSDlsLHmmK/mnIDnu4jopoHmib7nmoTllK/kuIAgRFMoRynvvIlcblxuICAgIHZhciBvZmZzZXQgPSBhdmVJbnRlckRpc3QgLSBhdmVJbnRyYURpc3Q7XG5cbiAgICBpZiAobWF4T2Zmc2V0IDwgb2Zmc2V0KSB7XG4gICAgICBtYXhPZmZzZXQgPSBvZmZzZXQ7XG4gICAgICByZXByZXNlbnRDbHVzdGVyVHlwZSA9IGk7XG4gICAgfVxuICB9O1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3RydWN0dXJlTnVtOyBpKyspIHtcbiAgICBfbG9vcF8xKGkpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBzdHJ1Y3R1cmU6IHN0cnVjdHVyZXNbcmVwcmVzZW50Q2x1c3RlclR5cGVdLFxuICAgIHN0cnVjdHVyZUNvdW50TWFwOiBtYXRjaGVkQ291bnRNYXBbcmVwcmVzZW50Q2x1c3RlclR5cGVdXG4gIH07XG59O1xuXG52YXIgZ2V0Tm9kZU1hcHMgPSBmdW5jdGlvbiBnZXROb2RlTWFwcyhub2Rlcywgbm9kZUxhYmVsUHJvcCkge1xuICB2YXIgbm9kZU1hcCA9IHt9LFxuICAgICAgbm9kZUxhYmVsTWFwID0ge307XG4gIG5vZGVzLmZvckVhY2goZnVuY3Rpb24gKG5vZGUsIGkpIHtcbiAgICBub2RlTWFwW25vZGUuaWRdID0ge1xuICAgICAgaWR4OiBpLFxuICAgICAgbm9kZTogbm9kZSxcbiAgICAgIGRlZ3JlZTogMCxcbiAgICAgIGluRGVncmVlOiAwLFxuICAgICAgb3V0RGVncmVlOiAwXG4gICAgfTtcbiAgICB2YXIgbGFiZWwgPSBub2RlW25vZGVMYWJlbFByb3BdO1xuICAgIGlmICghbm9kZUxhYmVsTWFwW2xhYmVsXSkgbm9kZUxhYmVsTWFwW2xhYmVsXSA9IFtdO1xuICAgIG5vZGVMYWJlbE1hcFtsYWJlbF0ucHVzaChub2RlKTtcbiAgfSk7XG4gIHJldHVybiB7XG4gICAgbm9kZU1hcDogbm9kZU1hcCxcbiAgICBub2RlTGFiZWxNYXA6IG5vZGVMYWJlbE1hcFxuICB9O1xufTtcblxudmFyIGdldEVkZ2VNYXBzID0gZnVuY3Rpb24gZ2V0RWRnZU1hcHMoZWRnZXMsIGVkZ2VMYWJlbFByb3AsIG5vZGVNYXApIHtcbiAgdmFyIGVkZ2VNYXAgPSB7fSxcbiAgICAgIGVkZ2VMYWJlbE1hcCA9IHt9O1xuICBlZGdlcy5mb3JFYWNoKGZ1bmN0aW9uIChlZGdlLCBpKSB7XG4gICAgZWRnZU1hcFtcIlwiICsgdW5pcXVlSWRdID0ge1xuICAgICAgaWR4OiBpLFxuICAgICAgZWRnZTogZWRnZVxuICAgIH07XG4gICAgdmFyIGxhYmVsID0gZWRnZVtlZGdlTGFiZWxQcm9wXTtcbiAgICBpZiAoIWVkZ2VMYWJlbE1hcFtsYWJlbF0pIGVkZ2VMYWJlbE1hcFtsYWJlbF0gPSBbXTtcbiAgICBlZGdlTGFiZWxNYXBbbGFiZWxdLnB1c2goZWRnZSk7XG4gICAgdmFyIHNvdXJjZU5vZGUgPSBub2RlTWFwW2VkZ2Uuc291cmNlXTtcblxuICAgIGlmIChzb3VyY2VOb2RlKSB7XG4gICAgICBzb3VyY2VOb2RlLmRlZ3JlZSsrO1xuICAgICAgc291cmNlTm9kZS5vdXREZWdyZWUrKztcbiAgICB9XG5cbiAgICB2YXIgdGFyZ2V0Tm9kZSA9IG5vZGVNYXBbZWRnZS50YXJnZXRdO1xuXG4gICAgaWYgKHRhcmdldE5vZGUpIHtcbiAgICAgIHRhcmdldE5vZGUuZGVncmVlKys7XG4gICAgICB0YXJnZXROb2RlLmluRGVncmVlKys7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHtcbiAgICBlZGdlTWFwOiBlZGdlTWFwLFxuICAgIGVkZ2VMYWJlbE1hcDogZWRnZUxhYmVsTWFwXG4gIH07XG59O1xuLyoqXG4gKiDovpPlh7rmnIDnn63ot6/lvoTnmoQgbWFw77yMa2V5IOS4uiBzb3VyY2VOb2RlLmlkLXRhcmdldE5vZGUuaWTvvIx2YWx1ZSDkuLrov5nkuKTkuKroioLngrnnmoTmnIDnn63ot6/lvoTplb/luqZcbiAqIEBwYXJhbSBub2Rlc1xuICogQHBhcmFtIHNwbVxuICogQHBhcmFtIGRpcmVjdGVkXG4gKi9cblxuXG52YXIgZ2V0U3BtTWFwID0gZnVuY3Rpb24gZ2V0U3BtTWFwKG5vZGVzLCBzcG0sIGRpcmVjdGVkKSB7XG4gIHZhciBsZW5ndGggPSBzcG0ubGVuZ3RoO1xuICB2YXIgbWFwID0ge307XG4gIHNwbS5mb3JFYWNoKGZ1bmN0aW9uIChyb3csIGkpIHtcbiAgICB2YXIgc3RhcnQgPSBkaXJlY3RlZCA/IDAgOiBpICsgMTtcbiAgICB2YXIgaUlkID0gbm9kZXNbaV0uaWQ7XG5cbiAgICBmb3IgKHZhciBqID0gc3RhcnQ7IGogPCBsZW5ndGg7IGorKykge1xuICAgICAgaWYgKGkgPT09IGopIGNvbnRpbnVlO1xuICAgICAgdmFyIGpJZCA9IG5vZGVzW2pdLmlkO1xuICAgICAgdmFyIGRpc3QgPSByb3dbal07XG4gICAgICBtYXBbaUlkICsgXCItXCIgKyBqSWRdID0gZGlzdDtcbiAgICAgIGlmICghZGlyZWN0ZWQpIG1hcFtqSWQgKyBcIi1cIiArIGlJZF0gPSBkaXN0O1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBtYXA7XG59O1xuLyoqXG4gKiDorqHnrpfkuIDlr7noioLngrnvvIhub2RlMe+8jG5vZGUy77yJ55qEIE5EUyDot53nprtcbiAqIEBwYXJhbSBncmFwaCDljp/lm77mlbDmja5cbiAqIEBwYXJhbSBub2RlMVxuICogQHBhcmFtIG5vZGUyXG4gKi9cblxuXG52YXIgZ2V0TkRTRGlzdCA9IGZ1bmN0aW9uIGdldE5EU0Rpc3QoZ3JhcGgsIG5vZGUxLCBub2RlMiwgbm9kZU1hcCwgc3BEaXN0LCBrTmVpZ2hib3JVbml0cywgc3RydWN0dXJlLCBub2RlTGFiZWxQcm9wLCBlZGdlTGFiZWxQcm9wLCBjYWNoZWRORFNNYXAsIGNhY2hlZEludGVySW5kdWNlZEdyYXBoKSB7XG4gIHZhciBfYTtcblxuICB2YXIga2V5ID0gbm9kZTEuaWQgKyBcIi1cIiArIG5vZGUyLmlkO1xuICBpZiAoY2FjaGVkTkRTTWFwICYmIGNhY2hlZE5EU01hcFtrZXldKSByZXR1cm4gY2FjaGVkTkRTTWFwW2tleV07XG4gIHZhciBpbnRlckluZHVjZWRHcmFwaCA9IGNhY2hlZEludGVySW5kdWNlZEdyYXBoID8gY2FjaGVkSW50ZXJJbmR1Y2VkR3JhcGhba2V5XSA6IHVuZGVmaW5lZDsgLy8g6Iul5rKh5pyJ57yT5a2Y55u45Lqk6YK75bGF6K+x5a+85a2Q5Zu+77yM6K6h566XXG5cbiAgaWYgKCFpbnRlckluZHVjZWRHcmFwaCkge1xuICAgIHZhciBwYWlyTWFwID0gKF9hID0ge30sIF9hW2tleV0gPSB7XG4gICAgICBzdGFydDogbm9kZU1hcFtub2RlMS5pZF0uaWR4LFxuICAgICAgZW5kOiBub2RlTWFwW25vZGUyLmlkXS5pZHgsXG4gICAgICBkaXN0YW5jZTogc3BEaXN0XG4gICAgfSwgX2EpO1xuICAgIGNhY2hlZEludGVySW5kdWNlZEdyYXBoID0gZ2V0SW50ZXJzZWN0TmVpZ2hib3JJbmR1Y2VkR3JhcGgocGFpck1hcCwga05laWdoYm9yVW5pdHMsIGdyYXBoLCBjYWNoZWRJbnRlckluZHVjZWRHcmFwaCk7XG4gICAgaW50ZXJJbmR1Y2VkR3JhcGggPSBjYWNoZWRJbnRlckluZHVjZWRHcmFwaFtrZXldO1xuICB9XG5cbiAgcmV0dXJuIGdldE1hdGNoZWRDb3VudChpbnRlckluZHVjZWRHcmFwaCwgc3RydWN0dXJlLCBub2RlTGFiZWxQcm9wLCBlZGdlTGFiZWxQcm9wKTtcbn07XG4vKipcbiAqIOiuoeeulyBwYXR0ZXJuIOS4iue7qeeCueeahOW6puaVsOW5tuWtmOWCqOWIsCBtaW5QYXR0ZXJuTm9kZUxhYmVsRGVncmVlTWFwXG4gKi9cblxuXG52YXIgc3Rhc2hQYXR0ZXJuTm9kZUxhYmVsRGVncmVlTWFwID0gZnVuY3Rpb24gc3Rhc2hQYXR0ZXJuTm9kZUxhYmVsRGVncmVlTWFwKG1pblBhdHRlcm5Ob2RlTGFiZWxEZWdyZWVNYXAsIG5laWdoYm9yTGFiZWwsIHBhdHRlcm5Ob2RlTWFwLCBwYXR0ZXJuTm9kZUxhYmVsTWFwKSB7XG4gIHZhciBfYSwgX2IsIF9jO1xuXG4gIHZhciBtaW5QYXR0ZXJuTm9kZUxhYmVsRGVncmVlID0gKF9hID0gbWluUGF0dGVybk5vZGVMYWJlbERlZ3JlZU1hcFtuZWlnaGJvckxhYmVsXSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmRlZ3JlZTtcbiAgdmFyIG1pblBhdHRlcm5Ob2RlTGFiZWxJbkRlZ3JlZSA9IChfYiA9IG1pblBhdHRlcm5Ob2RlTGFiZWxEZWdyZWVNYXBbbmVpZ2hib3JMYWJlbF0pID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5pbkRlZ3JlZTtcbiAgdmFyIG1pblBhdHRlcm5Ob2RlTGFiZWxPdXREZWdyZWUgPSAoX2MgPSBtaW5QYXR0ZXJuTm9kZUxhYmVsRGVncmVlTWFwW25laWdoYm9yTGFiZWxdKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Mub3V0RGVncmVlO1xuXG4gIGlmIChtaW5QYXR0ZXJuTm9kZUxhYmVsRGVncmVlTWFwW25laWdoYm9yTGFiZWxdID09PSB1bmRlZmluZWQpIHtcbiAgICBtaW5QYXR0ZXJuTm9kZUxhYmVsRGVncmVlID0gSW5maW5pdHk7XG4gICAgbWluUGF0dGVybk5vZGVMYWJlbEluRGVncmVlID0gSW5maW5pdHk7XG4gICAgbWluUGF0dGVybk5vZGVMYWJlbE91dERlZ3JlZSA9IEluZmluaXR5O1xuICAgIHBhdHRlcm5Ob2RlTGFiZWxNYXBbbmVpZ2hib3JMYWJlbF0uZm9yRWFjaChmdW5jdGlvbiAocGF0dGVybk5vZGVXaXRoTGFiZWwpIHtcbiAgICAgIHZhciBwYXR0ZXJuTm9kZURlZ3JlZSA9IHBhdHRlcm5Ob2RlTWFwW3BhdHRlcm5Ob2RlV2l0aExhYmVsLmlkXS5kZWdyZWU7XG4gICAgICBpZiAobWluUGF0dGVybk5vZGVMYWJlbERlZ3JlZSA+IHBhdHRlcm5Ob2RlRGVncmVlKSBtaW5QYXR0ZXJuTm9kZUxhYmVsRGVncmVlID0gcGF0dGVybk5vZGVEZWdyZWU7XG4gICAgICB2YXIgcGF0dGVybk5vZGVJbkRlZ3JlZSA9IHBhdHRlcm5Ob2RlTWFwW3BhdHRlcm5Ob2RlV2l0aExhYmVsLmlkXS5pbkRlZ3JlZTtcbiAgICAgIGlmIChtaW5QYXR0ZXJuTm9kZUxhYmVsSW5EZWdyZWUgPiBwYXR0ZXJuTm9kZUluRGVncmVlKSBtaW5QYXR0ZXJuTm9kZUxhYmVsSW5EZWdyZWUgPSBwYXR0ZXJuTm9kZUluRGVncmVlO1xuICAgICAgdmFyIHBhdHRlcm5Ob2RlT3V0RGVncmVlID0gcGF0dGVybk5vZGVNYXBbcGF0dGVybk5vZGVXaXRoTGFiZWwuaWRdLm91dERlZ3JlZTtcbiAgICAgIGlmIChtaW5QYXR0ZXJuTm9kZUxhYmVsT3V0RGVncmVlID4gcGF0dGVybk5vZGVPdXREZWdyZWUpIG1pblBhdHRlcm5Ob2RlTGFiZWxPdXREZWdyZWUgPSBwYXR0ZXJuTm9kZU91dERlZ3JlZTtcbiAgICB9KTtcbiAgICBtaW5QYXR0ZXJuTm9kZUxhYmVsRGVncmVlTWFwW25laWdoYm9yTGFiZWxdID0ge1xuICAgICAgZGVncmVlOiBtaW5QYXR0ZXJuTm9kZUxhYmVsRGVncmVlLFxuICAgICAgaW5EZWdyZWU6IG1pblBhdHRlcm5Ob2RlTGFiZWxJbkRlZ3JlZSxcbiAgICAgIG91dERlZ3JlZTogbWluUGF0dGVybk5vZGVMYWJlbE91dERlZ3JlZVxuICAgIH07XG4gIH1cblxuICByZXR1cm4ge1xuICAgIG1pblBhdHRlcm5Ob2RlTGFiZWxEZWdyZWU6IG1pblBhdHRlcm5Ob2RlTGFiZWxEZWdyZWUsXG4gICAgbWluUGF0dGVybk5vZGVMYWJlbEluRGVncmVlOiBtaW5QYXR0ZXJuTm9kZUxhYmVsSW5EZWdyZWUsXG4gICAgbWluUGF0dGVybk5vZGVMYWJlbE91dERlZ3JlZTogbWluUGF0dGVybk5vZGVMYWJlbE91dERlZ3JlZVxuICB9O1xufTtcbi8qKlxuICogR0FEREkg5qih5byP5Yy56YWNXG4gKiBAcGFyYW0gZ3JhcGhEYXRhIOWOn+WbvuaVsOaNrlxuICogQHBhcmFtIHBhdHRlcm4g5pCc57Si5Zu+77yI6ZyA6KaB5Zyo5Y6f5Zu+5LiK5pCc57Si55qE5qih5byP77yJ5pWw5o2uXG4gKiBAcGFyYW0gZGlyZWN0ZWQg5piv5ZCm6K6h566X5pyJ5ZCR5Zu+77yM6buY6K6kIGZhbHNlXG4gKiBAcGFyYW0gayDlj4LmlbAga++8jOihqOekuiBrLei/kemCu1xuICogQHBhcmFtIGxlbmd0aCDlj4LmlbAgbGVuZ3RoXG4gKiBAcGFyYW0gbm9kZUxhYmVsUHJvcCDoioLngrnmlbDmja7kuK3ku6PooajoioLngrnmoIfnrb7vvIjliIbnsbvkv6Hmga/vvInnmoTlsZ7mgKflkI3jgILpu5jorqTkuLogY2x1c3RlclxuICogQHBhcmFtIGVkZ2VMYWJlbFByb3Ag6L655pWw5o2u5Lit5Luj6KGo6L655qCH562+77yI5YiG57G75L+h5oGv77yJ55qE5bGe5oCn5ZCN44CC6buY6K6k5Li6IGNsdXN0ZXJcbiAqL1xuXG5cbnZhciBHQURESSA9IGZ1bmN0aW9uIEdBRERJKGdyYXBoRGF0YSwgcGF0dGVybiwgZGlyZWN0ZWQsIGssIGxlbmd0aCwgbm9kZUxhYmVsUHJvcCwgZWRnZUxhYmVsUHJvcCkge1xuICBpZiAoZGlyZWN0ZWQgPT09IHZvaWQgMCkge1xuICAgIGRpcmVjdGVkID0gZmFsc2U7XG4gIH1cblxuICBpZiAobm9kZUxhYmVsUHJvcCA9PT0gdm9pZCAwKSB7XG4gICAgbm9kZUxhYmVsUHJvcCA9ICdjbHVzdGVyJztcbiAgfVxuXG4gIGlmIChlZGdlTGFiZWxQcm9wID09PSB2b2lkIDApIHtcbiAgICBlZGdlTGFiZWxQcm9wID0gJ2NsdXN0ZXInO1xuICB9XG5cbiAgaWYgKCFncmFwaERhdGEgfHwgIWdyYXBoRGF0YS5ub2RlcykgcmV0dXJuOyAvLyDliIbkuLrkuInmraXvvJpcbiAgLy8gMC4g6aKE6K6h566X77ya6IqC54K5L+i+ueaVsO+8jOmCu+aOpeefqemYteOAgeacgOefrei3r+W+hOefqemYtVxuICAvLyAxLiDlpITnkIbljp/lm74gZ3JhcGhEYXRh44CC5YaN5YiG5Li6IDF+NSDlsI/mraVcbiAgLy8gMi4g5Yy56YWNXG4gIC8vIGNvbnNvbGUubG9nKFwiLS0tLS0gc3RhZ2UtcHJlOiBwcmVwcm9jZXNzaW5nIC0tLS0tLS1cIik7XG4gIC8vIC0tLS0tLS0tIOesrOmbtuatpe+8jOmihOiuoeeul++8muiKgueCuS/ovrnmlbDvvIzpgrvmjqXnn6npmLXjgIHmnIDnn63ot6/lvoTnn6npmLUtLS0tLS0tXG5cbiAgdmFyIG5vZGVOdW0gPSBncmFwaERhdGEubm9kZXMubGVuZ3RoO1xuICBpZiAoIW5vZGVOdW0pIHJldHVybjsgLy8gY29uc29sZS5sb2coXCItLS0tLSBzdGFnZS1wcmUuMTogY2FsYyBzaG9ydGVzdCBwYXRoIG1hdHJpeCBmb3IgZ3JhcGggLS0tLS0tLVwiKTtcblxuICB2YXIgc3BtID0gZmxveWRXYXJzaGFsbChncmFwaERhdGEsIGRpcmVjdGVkKTsgLy8gY29uc29sZS5sb2coXG4gIC8vICAgXCItLS0tLSBzdGFnZS1wcmUuMjogY2FsYyBzaG9ydGVzdCBwYXRoIG1hdHJpeCBmb3IgcGF0dGVybiAtLS0tLS0tXCJcbiAgLy8gKTtcblxuICB2YXIgcGF0dGVyblNwbSA9IGZsb3lkV2Fyc2hhbGwocGF0dGVybiwgZGlyZWN0ZWQpOyAvLyBjb25zb2xlLmxvZyhcbiAgLy8gICBcIi0tLS0tIHN0YWdlLXByZS4zOiBjYWxjIHNob3J0ZXN0IHBhdGggbWF0cml4IG1hcCBmb3IgZ3JhcGggLS0tLS0tLVwiXG4gIC8vICk7XG5cbiAgdmFyIHNwbU1hcCA9IGdldFNwbU1hcChncmFwaERhdGEubm9kZXMsIHNwbSwgZGlyZWN0ZWQpOyAvLyBjb25zb2xlLmxvZyhcbiAgLy8gICBcIi0tLS0tIHN0YWdlLXByZS40OiBjYWxjIHNob3J0ZXN0IHBhdGggbWF0cml4IG1hcCBmb3IgcGF0dGVybiAtLS0tLS0tXCJcbiAgLy8gKTtcblxuICB2YXIgcGF0dGVyblNwbU1hcCA9IGdldFNwbU1hcChwYXR0ZXJuLm5vZGVzLCBwYXR0ZXJuU3BtLCBkaXJlY3RlZCk7IC8vIGNvbnNvbGUubG9nKFwiLS0tLS0gc3RhZ2UtcHJlLjU6IGVzdGFibGlzaCBtYXBzIC0tLS0tLS1cIik7XG4gIC8vIOiKgueCueeahCBtYXDvvIzku6UgaWQg5Li6IGlkIOaYoOWwhO+8jOaWueS+v+WQjue7reW/q+mAn+ajgOe0olxuXG4gIHZhciBfYSA9IGdldE5vZGVNYXBzKGdyYXBoRGF0YS5ub2Rlcywgbm9kZUxhYmVsUHJvcCksXG4gICAgICBub2RlTWFwID0gX2Eubm9kZU1hcCxcbiAgICAgIG5vZGVMYWJlbE1hcCA9IF9hLm5vZGVMYWJlbE1hcDtcblxuICB2YXIgX2IgPSBnZXROb2RlTWFwcyhwYXR0ZXJuLm5vZGVzLCBub2RlTGFiZWxQcm9wKSxcbiAgICAgIHBhdHRlcm5Ob2RlTWFwID0gX2Iubm9kZU1hcCxcbiAgICAgIHBhdHRlcm5Ob2RlTGFiZWxNYXAgPSBfYi5ub2RlTGFiZWxNYXA7IC8vIOiuoeeul+iKgueCueW6puaVsFxuXG5cbiAgZ2V0RWRnZU1hcHMoZ3JhcGhEYXRhLmVkZ2VzLCBlZGdlTGFiZWxQcm9wLCBub2RlTWFwKTtcbiAgdmFyIHBhdHRlcm5FZGdlTGFiZWxNYXAgPSBnZXRFZGdlTWFwcyhwYXR0ZXJuLmVkZ2VzLCBlZGdlTGFiZWxQcm9wLCBwYXR0ZXJuTm9kZU1hcCkuZWRnZUxhYmVsTWFwOyAvLyDoi6XmnKrmjIflrpogbGVuZ3Ro77yM6Ieq5Yqo6K6h566XIHBhdHRlcm4g5Y2K5b6E77yI5pyA55+t6Lev5b6E5pyA5aSn5YC877yJXG5cbiAgdmFyIHBhdHRlcm5TcG1TcHJlYWQgPSBbXTtcbiAgcGF0dGVyblNwbSA9PT0gbnVsbCB8fCBwYXR0ZXJuU3BtID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwYXR0ZXJuU3BtLmZvckVhY2goZnVuY3Rpb24gKHJvdykge1xuICAgIHBhdHRlcm5TcG1TcHJlYWQgPSBwYXR0ZXJuU3BtU3ByZWFkLmNvbmNhdChyb3cpO1xuICB9KTtcbiAgaWYgKCFsZW5ndGgpIGxlbmd0aCA9IE1hdGgubWF4LmFwcGx5KE1hdGgsIF9fc3ByZWFkQXJyYXkoX19zcHJlYWRBcnJheShbXSwgcGF0dGVyblNwbVNwcmVhZCksIFsyXSkpO1xuICBpZiAoIWspIGsgPSBsZW5ndGg7IC8vIGNvbnNvbGUubG9nKFwicGFyYW1zXCIsIGRpcmVjdGVkLCBsZW5ndGgsIGspO1xuICAvLyBjb25zb2xlLmxvZyhcIi0tLS0tIHN0YWdlLXByZS42OiBjYWxjIGsgbmVpZ2hib3IgdW5pdHMgLS0tLS0tLVwiKTtcbiAgLy8g6K6h566X5q+P5Liq6IqC54K555qEIGsg6YK75YWD6ZuG5ZCIXG5cbiAgdmFyIGtOZWlnaGJvclVuaXRzID0gZmluZEtOZWlnaGJvclVuaXRzKGdyYXBoRGF0YSwgc3BtLCBub2RlTGFiZWxQcm9wLCBrKTtcbiAgdmFyIHBhdHRlcm5LTmVpZ2hib3JVbml0cyA9IGZpbmRLTmVpZ2hib3JVbml0cyhwYXR0ZXJuLCBwYXR0ZXJuU3BtLCBub2RlTGFiZWxQcm9wLCBrKTsgLy8gY29uc29sZS5sb2coXG4gIC8vICAgXCItLS0tLSBzdGFnZTA6IGdvaW5nIHRvIHByb2Nlc3NpbmcgZ3JhcGggYW5kIGZpbmQgaW50ZXJzZWN0IG5laWdoYm9yIGluZHVjZWQgZ3JhcGhzIC0tLS0tLS1cIlxuICAvLyApO1xuICAvLyBjb25zb2xlLmxvZyhcIi0tLS0tIHN0YWdlMC4xOiBnb2luZyB0byBzZWxlY3QgcmFuZG9tIG5vZGUgcGFpcnMgLS0tLS0tLVwiKTtcbiAgLy8gLS0tLS0tLS0g56ys5LiA5q2l77yM5aSE55CG5Y6f5Zu+IGdyYXBoRGF0YS0tLS0tLS1cbiAgLy8gMS4xLiDpmo/mnLrpgInmi6nmnIDlpJogMTAwIOS4queCueWvue+8jOa7oei2s+i3neemu+Wwj+S6jiBMZW5ndGgg5ZKMIGtcbiAgLy8g5b2TIGdyYXBoRGF0YSDlsJHkuo4gMjAg5Liq6IqC54K577yM5YiZ5LiN6IO95om+5Ye6IDEwMCDkuKrngrnlr7nvvIzlj6rmib7lh7rkuI3lpJrkuo4gbihuLTEpLzIg5Liq54K55a+5XG5cbiAgdmFyIG1heE5vZGVQYWlyTnVtID0gTWF0aC5taW4oMTAwLCBub2RlTnVtICogKG5vZGVOdW0gLSAxKSAvIDIpO1xuICB2YXIgbm9kZVBhaXJzTWFwID0gZmluZE5vZGVQYWlyc1JhbmRvbWx5KGssIG5vZGVOdW0sIG1heE5vZGVQYWlyTnVtLCBwYXR0ZXJuS05laWdoYm9yVW5pdHMsIHNwbSk7IC8vIGNvbnNvbGUubG9nKFxuICAvLyAgIFwiLS0tLS0gc3RhZ2UwLjI6IGdvaW5nIHRvIGNhbGN1bGF0ZSBpbnRlcnNlY3QgbmVpZ2hib3IgaW5kdWNlZCBncmFwaHMgLS0tLS0tLVwiXG4gIC8vICk7XG4gIC8vIDEuMi4g55Sf5oiQ5LiK6Z2i6IqC54K55a+555qE55u45bqU55u45Lqk6YK75bGF6K+x5a+85a2Q5Zu+44CC5qC85byP5Li6IHsnYmVnaW5Ob2RlSWR4LWVuZE5vZGVJZHgnOiB7bm9kZXM6IFtdLCBlZGdlczogW119fVxuXG4gIHZhciBpbnRHTWFwID0gZ2V0SW50ZXJzZWN0TmVpZ2hib3JJbmR1Y2VkR3JhcGgobm9kZVBhaXJzTWFwLCBrTmVpZ2hib3JVbml0cywgZ3JhcGhEYXRhKTsgLy8gMS4zLiDkvb/nlKggZ1NwYW4g566X5rOV77yIZnJlcXVlbnQgZ3JhcGggbWluaW5n77yJ6K6h566XIElTSW50RyDnmoTliY0gMTAg5Liq6aKR546H5pyA6auY55qE5a2Q57uT5p6E77yIMy005p2h6L6577yJXG5cbiAgdmFyIHRvcCA9IDEwLFxuICAgICAgbWluU3VwcG9ydCA9IDEsXG4gICAgICBtaW5Ob2RlTnVtID0gMSxcbiAgICAgIG1heE5vZGVOdW0gPSA0O1xuICB2YXIgcGFyYW1zID0ge1xuICAgIGdyYXBoczogaW50R01hcCxcbiAgICBub2RlTGFiZWxQcm9wOiBub2RlTGFiZWxQcm9wLFxuICAgIGVkZ2VMYWJlbFByb3A6IGVkZ2VMYWJlbFByb3AsXG4gICAgbWluU3VwcG9ydDogbWluU3VwcG9ydCxcbiAgICBtaW5Ob2RlTnVtOiBtaW5Ob2RlTnVtLFxuICAgIG1heE5vZGVOdW06IG1heE5vZGVOdW0sXG4gICAgZGlyZWN0ZWQ6IGRpcmVjdGVkXG4gIH07IC8vIGNvbnNvbGUubG9nKFxuICAvLyAgIFwiLS0tLS0gc3RhZ2UxOiAoZ1NwYW4pIGdvaW5nIHRvIGZpbmQgZnJlcXVlbnQgc3RydWN0dXJlIGRzRyAtLS0tLS0tXCJcbiAgLy8gKTtcbiAgLy8gY29uc29sZS5sb2coXCItLS0tLSBzdGFnZTEuMTogZ29pbmcgdG8gcnVuIGdTcGFuIC0tLS0tLS1cIik7XG4gIC8vIOaaguaXtuWBh+iuvueUn+aIkOeahCBzdWIgc3RydWN0dXJlIOmDveWPquacieS4gOadoei+uVxuXG4gIHZhciBmcmVTdHJ1Y3R1cmVzID0gZ1NwYW4ocGFyYW1zKS5zbGljZSgwLCB0b3ApOyAvLyBzdHJ1Y3R1cmVOdW0g5Y+v6IO95bCP5LqOIHRvcFxuXG4gIHZhciBzdHJ1Y3R1cmVOdW0gPSBmcmVTdHJ1Y3R1cmVzLmxlbmd0aDsgLy8gMS40LiDorqHnrpfkuIrov7AgMTAg5Liq5a2Q57uT5p6E5ZyoIGludEdNYXAg5Lit5q+P5Liq6K+x5a+85a2Q5Zu+55qE5Yy56YWN5Liq5pWwXG5cbiAgdmFyIG1hdGNoZWRDb3VudE1hcCA9IFtdO1xuICBmcmVTdHJ1Y3R1cmVzLmZvckVhY2goZnVuY3Rpb24gKHN0cnVjdHVyZSwgaSkge1xuICAgIG1hdGNoZWRDb3VudE1hcFtpXSA9IHt9O1xuICAgIE9iamVjdC5rZXlzKGludEdNYXApLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgdmFyIGdyYXBoID0gaW50R01hcFtrZXldO1xuICAgICAgdmFyIHN1YlN0cnVjdHVyZUNvdW50ID0gZ2V0TWF0Y2hlZENvdW50KGdyYXBoLCBzdHJ1Y3R1cmUsIG5vZGVMYWJlbFByb3AsIGVkZ2VMYWJlbFByb3ApO1xuICAgICAgbWF0Y2hlZENvdW50TWFwW2ldW2tleV0gPSBzdWJTdHJ1Y3R1cmVDb3VudDtcbiAgICB9KTtcbiAgfSk7IC8vIGNvbnNvbGUubG9nKFxuICAvLyAgIFwiLS0tLS0gc3RhZ2UxLjE6IGdvaW5nIHRvIGZpbmQgdGhlIG1vc3QgcmVwcmVzZW50IHN0cnVjdXRyZSAtLS0tLS0tXCJcbiAgLy8gKTtcbiAgLy8gMS41LiDlr7nkuo7mr4/kuKrlrZDnu5PmnoTvvIzmoLnmja7ljLnphY3kuKrmlbDkuLogaW50R01hcCDkuK3nmoTor7Hlr7zlrZDlm77liIbnu4TvvIznlJ/miJAgc3RydWN0dXJlTnVtIOenjeWIhue7hFxuICAvLyDorqHnrpfmr4/np43liIbnu4TnmoTnsbvpl7Tot53lkoznsbvlhoXpl7Tot53vvIzmib7liLDnsbvpl7Tot53mnIDlpKfjgIHnsbvlhoXpl7Tot53mnIDlsI/nmoTkuIDnp43liIbnu4TvvIzov5nnp43liIbnu4Tlr7nlupTnmoTlrZDnu5PmnoTooqvpgInkuLrllK/kuIDku6PooajmgKflrZDnu5PmnoQgRFMoRylcblxuICB2YXIgX2MgPSBmaW5kUmVwcmVzZW50U3RydWN0dXJlKG1hdGNoZWRDb3VudE1hcCwgc3RydWN0dXJlTnVtLCBmcmVTdHJ1Y3R1cmVzKSxcbiAgICAgIGRzRyA9IF9jLnN0cnVjdHVyZSxcbiAgICAgIG5kc0Rpc3QgPSBfYy5zdHJ1Y3R1cmVDb3VudE1hcDsgLy8gLS0tLS0tLS0g56ys5LqM5q2l77yM5Yy56YWNLS0tLS0tLVxuICAvLyAyLjEg5LuOIFEg5Lit55qE56ys5LiA5Liq5qCH562+55qE56ys5LiA5Liq6IqC54K55byA5aeL77yM5a+75om+IEcg5Lit55qE5Yy56YWNXG5cblxuICB2YXIgYmVnaW5QTm9kZSA9IHBhdHRlcm4ubm9kZXNbMF07XG4gIHZhciBsYWJlbCA9IGJlZ2luUE5vZGVbbm9kZUxhYmVsUHJvcF07IC8vIDIuMS4xIOaJvuWIsCBHIOS4reagh+etvuS4juS5i+ebuOWQjOeahOiKgueCuVxuXG4gIHZhciBjYW5kaWRhdGVzID0gbm9kZUxhYmVsTWFwW2xhYmVsXTsgLy8gY29uc29sZS5sb2coXCItLS0tLSBzdGFnZTI6IGdvaW5nIHRvIGZpbmQgY2FuZGlkYXRlcyAtLS0tLS0tXCIpO1xuICAvLyDlhajlsYDnvJPlrZjvvIzpgb/lhY3ph43lpI3orqHnrpdcblxuICB2YXIgbWluUGF0dGVybk5vZGVMYWJlbERlZ3JlZU1hcCA9IHt9OyAvLyBrZXkg5pivIGxhYmVs77yMdmFsdWUg5piv6K+lIGxhYmVsIOiKgueCueeahOacgOWwj+W6puaVsFxuXG4gIHZhciBwYXR0ZXJuSW50R3JhcGhNYXAgPSB7fSxcbiAgICAgIHBhdHRlcm5ORFNEaXN0ID0ge30sXG4gICAgICAvLyBrZXkg5Li6IG5vZGUuaWQtbm9kZS5pZFxuICBwYXR0ZXJuTkRTRGlzdE1hcCA9IHt9OyAvLyBrZXkg5Li6IG5vZGUuaWQtbGFiZWwy77yMdmFsdWUgbmRz6Led56a75YC85pWw57uE77yI5oyJ5LuO5aSn5Yiw5bCP5o6S5bqP77yM5peg6ZyA5YWz5b+D5YW35L2T5a+55bqU5ZOq5LiqIG5vZGUy77yJXG4gIC8vIDIuMi4yIOWvueS6jiBRIOS4reeahOWPpuS4gOS4quagh+etvueahCBrIOS4quiKgueCue+8jOiuoeeul+Wug+S7rOWIsCBub2RlIOeahOacgOefrei3r+W+hOS7peWPiiBORFMg6Led56a7XG5cbiAgdmFyIHBhdHRlcm5TcERpc3QgPSB7fTtcbiAgdmFyIHBhdHRlcm5TcERpc3RCYWNrID0ge307XG4gIE9iamVjdC5rZXlzKHBhdHRlcm5Ob2RlTGFiZWxNYXApLmZvckVhY2goZnVuY3Rpb24gKGxhYmVsMiwgaikge1xuICAgIHBhdHRlcm5TcERpc3RbbGFiZWwyXSA9IFtdO1xuXG4gICAgaWYgKGRpcmVjdGVkKSB7XG4gICAgICBwYXR0ZXJuU3BEaXN0QmFja1tsYWJlbDJdID0gW107XG4gICAgfVxuXG4gICAgdmFyIG1heERpc3QgPSAtSW5maW5pdHk7XG4gICAgdmFyIHBhdHRlcm5Ob2Rlc1dpdGhMYWJlbDIgPSBwYXR0ZXJuTm9kZUxhYmVsTWFwW2xhYmVsMl07XG4gICAgdmFyIHBhdHRlcm5Ob2RlUGFpck1hcCA9IHt9O1xuICAgIHBhdHRlcm5Ob2Rlc1dpdGhMYWJlbDIuZm9yRWFjaChmdW5jdGlvbiAobm9kZVdpdGhMYWJlbDIpIHtcbiAgICAgIHZhciBkaXN0ID0gcGF0dGVyblNwbU1hcFtiZWdpblBOb2RlLmlkICsgXCItXCIgKyBub2RlV2l0aExhYmVsMi5pZF07XG4gICAgICBkaXN0ICYmIHBhdHRlcm5TcERpc3RbbGFiZWwyXS5wdXNoKGRpc3QpO1xuICAgICAgaWYgKG1heERpc3QgPCBkaXN0KSBtYXhEaXN0ID0gZGlzdDtcbiAgICAgIHBhdHRlcm5Ob2RlUGFpck1hcFtiZWdpblBOb2RlLmlkICsgXCItXCIgKyBub2RlV2l0aExhYmVsMi5pZF0gPSB7XG4gICAgICAgIHN0YXJ0OiAwLFxuICAgICAgICBlbmQ6IHBhdHRlcm5Ob2RlTWFwW25vZGVXaXRoTGFiZWwyLmlkXS5pZHgsXG4gICAgICAgIGRpc3RhbmNlOiBkaXN0XG4gICAgICB9O1xuXG4gICAgICBpZiAoZGlyZWN0ZWQpIHtcbiAgICAgICAgdmFyIGRpc3RCYWNrID0gcGF0dGVyblNwbU1hcFtub2RlV2l0aExhYmVsMi5pZCArIFwiLVwiICsgYmVnaW5QTm9kZS5pZF07XG4gICAgICAgIGRpc3RCYWNrICYmIHBhdHRlcm5TcERpc3RCYWNrW2xhYmVsMl0ucHVzaChkaXN0QmFjayk7XG4gICAgICB9XG4gICAgfSk7IC8vIHNwRGlzdFtsYWJlbDJdIOaMieeFp+S7juWwj+WIsOWkp+aOkuW6j1xuXG4gICAgcGF0dGVyblNwRGlzdFtsYWJlbDJdID0gcGF0dGVyblNwRGlzdFtsYWJlbDJdLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgIHJldHVybiBhIC0gYjtcbiAgICB9KTtcbiAgICBpZiAoZGlyZWN0ZWQpIHBhdHRlcm5TcERpc3RCYWNrW2xhYmVsMl0gPSBwYXR0ZXJuU3BEaXN0QmFja1tsYWJlbDJdLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgIHJldHVybiBhIC0gYjtcbiAgICB9KTsgLy8g6K6h566XIFEg5Lit5omA5pyJIGxhYmVsMiDoioLngrnliLAgYmVnaW5QTm9kZSDnmoQgTkRTIOi3neemu1xuICAgIC8vIOaJgOaciSBsYWJlbDIg6IqC54K55YiwIGJlZ2luUE5vZGUg55qE6YK75bGF55u45Lqk6K+x5a+85a2Q5Zu+77yaXG4gICAgLy8ga2V5OiBub2RlMS5pZC1ub2RlMi5pZFxuXG4gICAgcGF0dGVybkludEdyYXBoTWFwID0gZ2V0SW50ZXJzZWN0TmVpZ2hib3JJbmR1Y2VkR3JhcGgocGF0dGVybk5vZGVQYWlyTWFwLCBwYXR0ZXJuS05laWdoYm9yVW5pdHMsIHBhdHRlcm4sIHBhdHRlcm5JbnRHcmFwaE1hcCk7IC8vIHBhdHRlcm4g5LitIGJlZ2luTm9kZSDliLDlvZPliY0gbGFiZWwyIOiKgueCuSDnmoQgTkRTIOi3neemu++8iOaVsOe7hO+8jOaXoOmcgOWFs+W/g+WFt+S9k+WvueW6lOWIsOWTquS4quiKgueCue+8iVxuXG4gICAgdmFyIGN1cnJlbnRQYXR0ZXJuTkRTRGlzdEFycmF5ID0gW107XG4gICAgT2JqZWN0LmtleXMocGF0dGVybk5vZGVQYWlyTWFwKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIGlmIChwYXR0ZXJuTkRTRGlzdFtrZXldKSB7XG4gICAgICAgIGN1cnJlbnRQYXR0ZXJuTkRTRGlzdEFycmF5LnB1c2gocGF0dGVybk5EU0Rpc3Rba2V5XSk7XG4gICAgICAgIHJldHVybjsgLy8g57yT5a2Y6L+H5YiZ5LiN6ZyA6KaB5YaN5qyh6K6h566XXG4gICAgICB9XG5cbiAgICAgIHZhciBwYXR0ZXJuSW50R3JhcGggPSBwYXR0ZXJuSW50R3JhcGhNYXBba2V5XTtcbiAgICAgIHBhdHRlcm5ORFNEaXN0W2tleV0gPSBnZXRNYXRjaGVkQ291bnQocGF0dGVybkludEdyYXBoLCBkc0csIG5vZGVMYWJlbFByb3AsIGVkZ2VMYWJlbFByb3ApO1xuICAgICAgY3VycmVudFBhdHRlcm5ORFNEaXN0QXJyYXkucHVzaChwYXR0ZXJuTkRTRGlzdFtrZXldKTtcbiAgICB9KTsgLy8g5qC55o2u5YC85Li6IGN1cnJlbnRQYXR0ZXJuTkRTRGlzdCDku47lpKfliLDlsI/mjpLluo9cblxuICAgIGN1cnJlbnRQYXR0ZXJuTkRTRGlzdEFycmF5ID0gY3VycmVudFBhdHRlcm5ORFNEaXN0QXJyYXkuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgcmV0dXJuIGIgLSBhO1xuICAgIH0pO1xuICAgIHBhdHRlcm5ORFNEaXN0TWFwW2JlZ2luUE5vZGUuaWQgKyBcIi1cIiArIGxhYmVsMl0gPSBjdXJyZW50UGF0dGVybk5EU0Rpc3RBcnJheTtcbiAgICBpZiAobGFiZWwyID09PSBsYWJlbCkgcmV0dXJuO1xuICAgIHZhciBjYW5kaWRhdGVzTnVtID0gY2FuZGlkYXRlcy5sZW5ndGg7XG5cbiAgICB2YXIgX2xvb3BfNCA9IGZ1bmN0aW9uIF9sb29wXzQobSkge1xuICAgICAgdmFyIGNOb2RlID0gY2FuZGlkYXRlc1ttXTsgLy8gcHJ1bmUx77ya6IulIGNhbmRpZGF0ZXMg5Lit6IqC54K5IGNOb2RlIOeahCBrTmVpZ2hib3JVbml0cyDkuK3moIfnrb7kuLogbGFiZWwyIOeahOiKgueCueS4quaVsOWwkeS6jiBwYXR0ZXJuIOS4rSBsYWJlbDIg5Liq5pWw77yM5Yig5Y675a6DXG5cbiAgICAgIHZhciBncmFwaE5laWdoYm9yVW5pdCA9IGtOZWlnaGJvclVuaXRzW25vZGVNYXBbY05vZGUuaWRdLmlkeF07XG4gICAgICB2YXIgZ3JhcGhOZWlnaGJvclVuaXRDb3VudE1hcCA9IGdyYXBoTmVpZ2hib3JVbml0Lm5vZGVMYWJlbENvdW50TWFwW2xhYmVsMl07XG4gICAgICB2YXIgcGF0dGVybkxhYmVsMk51bSA9IHBhdHRlcm5Ob2RlTGFiZWxNYXBbbGFiZWwyXS5sZW5ndGg7XG5cbiAgICAgIGlmICghZ3JhcGhOZWlnaGJvclVuaXRDb3VudE1hcCB8fCBncmFwaE5laWdoYm9yVW5pdENvdW50TWFwLmNvdW50IDwgcGF0dGVybkxhYmVsMk51bSkge1xuICAgICAgICBjYW5kaWRhdGVzLnNwbGljZShtLCAxKTtcbiAgICAgICAgcmV0dXJuIFwiY29udGludWVcIjtcbiAgICAgIH0gLy8gcHJ1bmUy77ya6IulIGNhbmRpZGF0ZXMg5Lit6IqC54K5IGNOb2RlIOWIsCBrTmVpZ2hib3JVbml0cyDkuK3moIfnrb7kuLogbGFiZWwyIOeahOiKgueCueacgOefrei3r+W+hOWkp+S6jiBwYXR0ZXJuU3BEaXN0W2xhYmVsMl3vvIzliKDljrvlroNcbiAgICAgIC8vIChwcnVuZTIg6KeE5YiZ5Y2z77yaY2FuZGlkYXRlIOebuOWFs+eahOacgOefrei3r+W+hOeahOacgOWkpyBzcERpc3RbbGFiZWwyXS5sZW5ndGgg5Liq77yM5oyJ54Wn5aSn5bCP6aG65bqP5L6d5qyh5ZKMIHBhdHRlcm5TcERpc3RbbGFiZWwyXSDkuK3nmoTlgLzmr5TovoPvvIzlj6ropoHpgYfliLDkuIDkuKrmmK8gRyA+IFEg55qE77yM5bCx5Yig5Y676L+Z5LiqIGNhbmRpZGF0ZSlcblxuXG4gICAgICB2YXIgcHJ1bmUySW52YWxpZCA9IGZhbHNlO1xuXG4gICAgICBmb3IgKHZhciBuID0gMDsgbiA8IHBhdHRlcm5MYWJlbDJOdW07IG4rKykge1xuICAgICAgICBpZiAoZ3JhcGhOZWlnaGJvclVuaXRDb3VudE1hcC5kaXN0c1tuXSA+IHBhdHRlcm5TcERpc3RbbGFiZWwyXVtuXSkge1xuICAgICAgICAgIHBydW5lMkludmFsaWQgPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChwcnVuZTJJbnZhbGlkKSB7XG4gICAgICAgIGNhbmRpZGF0ZXMuc3BsaWNlKG0sIDEpO1xuICAgICAgICByZXR1cm4gXCJjb250aW51ZVwiO1xuICAgICAgfSAvLyBwcnVuZTPvvJroi6UgY2FuZGlkYXRlcyDkuK3oioLngrkgY05vZGUg5YiwIGtOZWlnaGJvclVuaXRzIOS4reagh+etvuS4uiBsYWJlbDIg55qE6IqC54K5IE5EUyDot53nprvlsI/kuo4gcGF0dGVybk5EU0Rpc3RbYmVnaW5Ob2RlLmlkLWxhYmVsMl3vvIzliKDljrvlroNcbiAgICAgIC8vIFRPRE/vvJpwcnVuZTPvvIxjdXJyZW50UGF0dGVybk5EU0Rpc3RBcnJheSDkuI4gY3VycmVudE5EU0Rpc3Qg55qE5q+U6L6DXG4gICAgICAvLyDorqHnrpcgRyDkuK3miYDmnIkgbGFiZWwyIOiKgueCueWIsCBjTm9kZSDnmoQgTkRTIOi3neemu1xuICAgICAgLy8g5omA5pyJIGxhYmVsMiDoioLngrnliLAgY05vZGUg55qE6YK75bGF55u45Lqk6K+x5a+85a2Q5Zu+77yaXG5cblxuICAgICAgdmFyIGNOb2RlUGFpck1hcCA9IHt9O1xuICAgICAgZ3JhcGhOZWlnaGJvclVuaXQubmVpZ2hib3JzLmZvckVhY2goZnVuY3Rpb24gKG5laWdoYm9yTm9kZSkge1xuICAgICAgICB2YXIgZGlzdCA9IHNwbU1hcFtjTm9kZS5pZCArIFwiLVwiICsgbmVpZ2hib3JOb2RlLmlkXTtcbiAgICAgICAgY05vZGVQYWlyTWFwW2NOb2RlLmlkICsgXCItXCIgKyBuZWlnaGJvck5vZGUuaWRdID0ge1xuICAgICAgICAgIHN0YXJ0OiBub2RlTWFwW2NOb2RlLmlkXS5pZHgsXG4gICAgICAgICAgZW5kOiBub2RlTWFwW25laWdoYm9yTm9kZS5pZF0uaWR4LFxuICAgICAgICAgIGRpc3RhbmNlOiBkaXN0XG4gICAgICAgIH07XG4gICAgICB9KTsgLy8g5pu05pawIGludEdNYXBcblxuICAgICAgaW50R01hcCA9IGdldEludGVyc2VjdE5laWdoYm9ySW5kdWNlZEdyYXBoKGNOb2RlUGFpck1hcCwga05laWdoYm9yVW5pdHMsIGdyYXBoRGF0YSwgaW50R01hcCk7IC8vIGNhbmRpZGF0ZSDliLDlroPlkajlm7QgbGFiZWwyIOiKgueCueeahCBORFMg6Led56a7LCBrZXkg5pivIG5vZGUuaWQtbm9kZS5pZFxuXG4gICAgICB2YXIgY3VycmVudE5EU0Rpc3RBcnJheSA9IFtdO1xuICAgICAgT2JqZWN0LmtleXMoY05vZGVQYWlyTWFwKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgaWYgKG5kc0Rpc3Rba2V5XSkge1xuICAgICAgICAgIGN1cnJlbnRORFNEaXN0QXJyYXkucHVzaChuZHNEaXN0W2tleV0pO1xuICAgICAgICAgIHJldHVybjsgLy8g57yT5a2Y6L+H5YiZ5LiN6ZyA6KaB5YaN5qyh6K6h566XXG4gICAgICAgIH1cblxuICAgICAgICB2YXIgaW50R3JhcGggPSBpbnRHTWFwW2tleV07XG4gICAgICAgIG5kc0Rpc3Rba2V5XSA9IGdldE1hdGNoZWRDb3VudChpbnRHcmFwaCwgZHNHLCBub2RlTGFiZWxQcm9wLCBlZGdlTGFiZWxQcm9wKTtcbiAgICAgICAgY3VycmVudE5EU0Rpc3RBcnJheS5wdXNoKG5kc0Rpc3Rba2V5XSk7XG4gICAgICB9KTsgLy8g5qC55o2u5YC85Li6IGN1cnJlbnRORFNEaXN0QXJyYXkg5LuO5aSn5Yiw5bCP5o6S5bqPXG5cbiAgICAgIGN1cnJlbnRORFNEaXN0QXJyYXkgPSBjdXJyZW50TkRTRGlzdEFycmF5LnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgcmV0dXJuIGIgLSBhO1xuICAgICAgfSk7XG4gICAgICB2YXIgcHJ1bmUzSW52YWxpZCA9IGZhbHNlO1xuXG4gICAgICBmb3IgKHZhciBuID0gMDsgbiA8IHBhdHRlcm5MYWJlbDJOdW07IG4rKykge1xuICAgICAgICBpZiAoY3VycmVudE5EU0Rpc3RBcnJheVtuXSA8IGN1cnJlbnRQYXR0ZXJuTkRTRGlzdEFycmF5W25dKSB7XG4gICAgICAgICAgcHJ1bmUzSW52YWxpZCA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHBydW5lM0ludmFsaWQpIHtcbiAgICAgICAgY2FuZGlkYXRlcy5zcGxpY2UobSwgMSk7XG4gICAgICAgIHJldHVybiBcImNvbnRpbnVlXCI7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGZvciAodmFyIG0gPSBjYW5kaWRhdGVzTnVtIC0gMTsgbSA+PSAwOyBtLS0pIHtcbiAgICAgIF9sb29wXzQobSk7XG4gICAgfVxuICB9KTtcbiAgdmFyIGNhbmRpZGF0ZUdyYXBocyA9IFtdOyAvLyBjb25zb2xlLmxvZyhcbiAgLy8gICBcIi0tLS0tIHN0YWdlMzogZ29pbmcgdG8gc3BsaWNlIG5laWdoYm9ycyBmb3IgZWFjaCBjYW5kaWRhdGUgZ3JhcGggLS0tLS0tLVwiXG4gIC8vICk7XG4gIC8vIGNhbmRpZGF0ZXMg57uP6L+H562b6YCJ5ZCO77yM5Lul5q+P5LiqIGNhbmRpZGF0ZSDkuLrkuK3lv4PvvIznlJ/miJAgTGVuZ3RoLW5laWdoYm9yIOeahOmCu+WxheivseWvvOWtkOWbvlxuICAvLyDlubblnKjor7Hlr7zlrZDlm77kuK3ljrvpmaTkuI3lj6/og73lnKggUSDkuIrmib7liLDljLnphY3nmoTngrnvvJrlnKggUSDkuIrkuI3lrZjlnKjnmoQgbGFiZWzvvIzlhbbku5YgbGFiZWwg5YiwIGNhbmRpZGF0ZSDnmoTmnIDlpKfmnIDnn63ot53nprvnrKblkIggUeOAgU5EUyDot53nprvnrKblkIggUVxuXG4gIGNhbmRpZGF0ZXMgPT09IG51bGwgfHwgY2FuZGlkYXRlcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogY2FuZGlkYXRlcy5mb3JFYWNoKGZ1bmN0aW9uIChjYW5kaWRhdGUpIHtcbiAgICB2YXIgbm9kZUlkeCA9IG5vZGVNYXBbY2FuZGlkYXRlLmlkXS5pZHg7XG4gICAgdmFyIGxlbmd0aE5laWdoYm9yVW5pdCA9IGZpbmRLTmVpZ2hib3JVbml0KGdyYXBoRGF0YS5ub2Rlcywgc3BtW25vZGVJZHhdLCBub2RlSWR4LCBub2RlTGFiZWxQcm9wLCBsZW5ndGgpO1xuICAgIHZhciBuZWlnaGJvck5vZGVzID0gbGVuZ3RoTmVpZ2hib3JVbml0Lm5laWdoYm9yczsgLy8g5Yig6Zmk5LiN5Y+v6IO95om+5Yiw5Yy56YWN55qE6YK75bGF54K5XG5cbiAgICB2YXIgbmVpZ2hib3JOdW0gPSBuZWlnaGJvck5vZGVzLmxlbmd0aDtcbiAgICB2YXIgdW5tYXRjaGVkID0gZmFsc2U7XG5cbiAgICBmb3IgKHZhciBpID0gbmVpZ2hib3JOdW0gLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgLy8g5aaC5p6c6YCa6L+H6KOB5Ymq77yM56ym5ZCI5p2h5Lu255qE6IqC54K55pWw6YeP5bey6L+H5bCR77yM6K+05piO5LiN6IO95Yy56YWN6L+Z5LiqIGNhbmRpZGF0ZSDnm7jlhbPnmoTlm75cbiAgICAgIGlmIChuZWlnaGJvck5vZGVzLmxlbmd0aCArIDEgPCBwYXR0ZXJuLm5vZGVzLmxlbmd0aCkge1xuICAgICAgICB1bm1hdGNoZWQgPSB0cnVlO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBuZWlnaGJvck5vZGUgPSBuZWlnaGJvck5vZGVzW2ldO1xuICAgICAgdmFyIG5laWdoYm9yTGFiZWwgPSBuZWlnaGJvck5vZGVbbm9kZUxhYmVsUHJvcF07IC8vIHBydW5lMTog6Iul6K+l6YK75bGF54K555qEIGxhYmVsIOS4jeWtmOWcqOS6jiBwYXR0ZXJuIOS4re+8jOenu+mZpOi/meS4queCuVxuXG4gICAgICBpZiAoIXBhdHRlcm5Ob2RlTGFiZWxNYXBbbmVpZ2hib3JMYWJlbF0gfHwgIXBhdHRlcm5Ob2RlTGFiZWxNYXBbbmVpZ2hib3JMYWJlbF0ubGVuZ3RoKSB7XG4gICAgICAgIG5laWdoYm9yTm9kZXMuc3BsaWNlKGksIDEpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH0gLy8gcHJ1bmUyOiDoi6Xor6XpgrvlsYXngrnliLAgY2FuZGlkYXRlIOeahOacgOefrei3r+W+hOavlOWSjOWug+acieebuOWQjCBsYWJlbCDnmoToioLngrnliLAgYmVnaW5QTm9kZSDnmoTmnIDlpKfmnIDnn63ot6/lvoTplb/luqbplb/vvIznp7vpmaTov5nkuKrngrlcbiAgICAgIC8vIHBydW5lMi4xOiDlpoLmnpzmsqHmnInov5nkuKrmoIfnrb7liLAgYmVnaW5QTm9kZSDnmoTot53nprvorrDlvZXvvIzor7TmmI4gcGF0dGVybiDkuIrvvIjlj6/og70gYmVnaW5QTm9kZSDmmK/ov5nkuKogbGFiZWzvvInmsqHmnInlhbbku5bov5nkuKogbGFiZWwg55qE6IqC54K5XG5cblxuICAgICAgaWYgKCFwYXR0ZXJuU3BEaXN0W25laWdoYm9yTGFiZWxdIHx8ICFwYXR0ZXJuU3BEaXN0W25laWdoYm9yTGFiZWxdLmxlbmd0aCkge1xuICAgICAgICBuZWlnaGJvck5vZGVzLnNwbGljZShpLCAxKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHZhciBrZXkgPSBjYW5kaWRhdGUuaWQgKyBcIi1cIiArIG5laWdoYm9yTm9kZS5pZDsgLy8gcHJ1bmUyLjJcblxuICAgICAgdmFyIGRpc3RUb0NhbmRpZGF0ZSA9IHNwbU1hcFtrZXldO1xuICAgICAgdmFyIGlkeCA9IHBhdHRlcm5TcERpc3RbbmVpZ2hib3JMYWJlbF0ubGVuZ3RoIC0gMTtcbiAgICAgIHZhciBtYXhEaXN0V2l0aExhYmVsSW5QYXR0ZXJuID0gcGF0dGVyblNwRGlzdFtuZWlnaGJvckxhYmVsXVtpZHhdOyAvLyBwYXR0ZXJuU3BEaXN0W25laWdoYm9yTGFiZWxdIOW3sue7j+aMieeFp+S7juWwj+WIsOWkp+aOkuW6j1xuXG4gICAgICBpZiAoZGlzdFRvQ2FuZGlkYXRlID4gbWF4RGlzdFdpdGhMYWJlbEluUGF0dGVybikge1xuICAgICAgICBuZWlnaGJvck5vZGVzLnNwbGljZShpLCAxKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChkaXJlY3RlZCkge1xuICAgICAgICB2YXIga2V5QmFjayA9IG5laWdoYm9yTm9kZS5pZCArIFwiLVwiICsgY2FuZGlkYXRlLmlkO1xuICAgICAgICB2YXIgZGlzdEZyb21DYW5kaWRhdGUgPSBzcG1NYXBba2V5QmFja107XG4gICAgICAgIGlkeCA9IHBhdHRlcm5TcERpc3RCYWNrW25laWdoYm9yTGFiZWxdLmxlbmd0aCAtIDE7XG4gICAgICAgIHZhciBtYXhCYWNrRGlzdFdpdGhMYWJlbEluUGF0dGVybiA9IHBhdHRlcm5TcERpc3RCYWNrW25laWdoYm9yTGFiZWxdW2lkeF07XG5cbiAgICAgICAgaWYgKGRpc3RGcm9tQ2FuZGlkYXRlID4gbWF4QmFja0Rpc3RXaXRoTGFiZWxJblBhdHRlcm4pIHtcbiAgICAgICAgICBuZWlnaGJvck5vZGVzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfSAvLyBwcnVuZTM6IOiLpeivpemCu+WxheeCueWIsCBjYW5kaWRhdGUg55qEIE5EUyDot53nprvmr5TlkozlroPmnInnm7jlkIwgbGFiZWwg55qE6IqC54K55YiwIGJlZ2luUE5vZGUg55qE5pyA5bCPIE5EUyDot53nprvlsI/vvIznp7vpmaTov5nkuKrngrlcblxuXG4gICAgICB2YXIgbmRzVG9DYW5kaWRhdGUgPSBuZHNEaXN0W2tleV0gPyBuZHNEaXN0W2tleV0gOiBnZXRORFNEaXN0KGdyYXBoRGF0YSwgY2FuZGlkYXRlLCBuZWlnaGJvck5vZGUsIG5vZGVNYXAsIGRpc3RUb0NhbmRpZGF0ZSwga05laWdoYm9yVW5pdHMsIGRzRywgbm9kZUxhYmVsUHJvcCwgZWRnZUxhYmVsUHJvcCwgbmRzRGlzdCwgaW50R01hcCk7XG4gICAgICB2YXIgcGF0dGVybktleSA9IGJlZ2luUE5vZGUuaWQgKyBcIi1cIiArIG5laWdoYm9yTGFiZWw7XG4gICAgICB2YXIgbWluTmRzV2l0aExhYmVsSW5QYXR0ZXJuID0gcGF0dGVybk5EU0Rpc3RNYXBbcGF0dGVybktleV1bcGF0dGVybk5EU0Rpc3RNYXBbcGF0dGVybktleV0ubGVuZ3RoIC0gMV07IC8vIHBhdHRlcm5ORFNEaXN0W2tleV0g5LiA5a6a5a2Y5ZyoXG5cbiAgICAgIGlmIChuZHNUb0NhbmRpZGF0ZSA8IG1pbk5kc1dpdGhMYWJlbEluUGF0dGVybikge1xuICAgICAgICBuZWlnaGJvck5vZGVzLnNwbGljZShpLCAxKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9IC8vIHBydW5lNDog6Iul6K+l6YK75bGF54K555qE5bqm5pWw5bCP5LqOIHBhdHRlcm4g5ZCMIGxhYmVsIOiKgueCueacgOWwj+W6puaVsO+8jOWIoOWOu+ivpeeCuVxuXG5cbiAgICAgIHZhciBfYSA9IHN0YXNoUGF0dGVybk5vZGVMYWJlbERlZ3JlZU1hcChtaW5QYXR0ZXJuTm9kZUxhYmVsRGVncmVlTWFwLCBuZWlnaGJvckxhYmVsLCBwYXR0ZXJuTm9kZU1hcCwgcGF0dGVybk5vZGVMYWJlbE1hcCksXG4gICAgICAgICAgbWluUGF0dGVybk5vZGVMYWJlbERlZ3JlZSA9IF9hLm1pblBhdHRlcm5Ob2RlTGFiZWxEZWdyZWUsXG4gICAgICAgICAgbWluUGF0dGVybk5vZGVMYWJlbEluRGVncmVlID0gX2EubWluUGF0dGVybk5vZGVMYWJlbEluRGVncmVlLFxuICAgICAgICAgIG1pblBhdHRlcm5Ob2RlTGFiZWxPdXREZWdyZWUgPSBfYS5taW5QYXR0ZXJuTm9kZUxhYmVsT3V0RGVncmVlO1xuXG4gICAgICBpZiAobm9kZU1hcFtuZWlnaGJvck5vZGUuaWRdLmRlZ3JlZSA8IG1pblBhdHRlcm5Ob2RlTGFiZWxEZWdyZWUpIHtcbiAgICAgICAgbmVpZ2hib3JOb2Rlcy5zcGxpY2UoaSwgMSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH0gLy8g6IqC54K55Zyo5Liq5pWw5LiK56ym5ZCI5Yy56YWN77yI5LiN5bCR5LqOIHBhdHRlcm4g55qE6IqC54K55Liq5pWw77yJ77yM546w5Zyo562b6YCJ55u45YWz6L65XG5cblxuICAgIGlmICghdW5tYXRjaGVkKSB7XG4gICAgICBjYW5kaWRhdGVHcmFwaHMucHVzaCh7XG4gICAgICAgIG5vZGVzOiBbY2FuZGlkYXRlXS5jb25jYXQobmVpZ2hib3JOb2RlcylcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7IC8vIGNvbnNvbGUubG9nKFxuICAvLyAgIFwiLS0tLS0gc3RhZ2U0OiBnb2luZyB0byBzcGxpY2UgZWRnZXMgYW5kIG5laWdoYm9ycyBmb3IgZWFjaCBjYW5kaWRhdGUgZ3JhcGggLS0tLS0tLVwiXG4gIC8vICk7XG5cbiAgdmFyIHVuZGlyZWN0ZWRMZW5ndGhzVG9CZWdpblBOb2RlID0gZGlqa3N0cmEocGF0dGVybiwgYmVnaW5QTm9kZS5pZCwgZmFsc2UpLmxlbmd0aDtcbiAgdmFyIHVuZGlyZWN0ZWRMZW5ndGhzVG9CZWdpblBOb2RlTGFiZWxNYXAgPSB7fTtcblxuICBpZiAoZGlyZWN0ZWQpIHtcbiAgICBPYmplY3Qua2V5cyh1bmRpcmVjdGVkTGVuZ3Roc1RvQmVnaW5QTm9kZSkuZm9yRWFjaChmdW5jdGlvbiAobm9kZUlkKSB7XG4gICAgICB2YXIgbm9kZUxhYmVsID0gcGF0dGVybk5vZGVNYXBbbm9kZUlkXS5ub2RlW25vZGVMYWJlbFByb3BdO1xuICAgICAgaWYgKCF1bmRpcmVjdGVkTGVuZ3Roc1RvQmVnaW5QTm9kZUxhYmVsTWFwW25vZGVMYWJlbF0pIHVuZGlyZWN0ZWRMZW5ndGhzVG9CZWdpblBOb2RlTGFiZWxNYXBbbm9kZUxhYmVsXSA9IFt1bmRpcmVjdGVkTGVuZ3Roc1RvQmVnaW5QTm9kZVtub2RlSWRdXTtlbHNlIHVuZGlyZWN0ZWRMZW5ndGhzVG9CZWdpblBOb2RlTGFiZWxNYXBbbm9kZUxhYmVsXS5wdXNoKHVuZGlyZWN0ZWRMZW5ndGhzVG9CZWdpblBOb2RlW25vZGVJZF0pO1xuICAgIH0pO1xuICAgIE9iamVjdC5rZXlzKHVuZGlyZWN0ZWRMZW5ndGhzVG9CZWdpblBOb2RlTGFiZWxNYXApLmZvckVhY2goZnVuY3Rpb24gKHBMYWJlbCkge1xuICAgICAgdW5kaXJlY3RlZExlbmd0aHNUb0JlZ2luUE5vZGVMYWJlbE1hcFtwTGFiZWxdLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgcmV0dXJuIGEgLSBiO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgdW5kaXJlY3RlZExlbmd0aHNUb0JlZ2luUE5vZGVMYWJlbE1hcCA9IHBhdHRlcm5TcERpc3Q7XG4gIH0gLy8g546w5ZyoIGNhbmRpZGF0ZUdyYXBocyDph4zpnaLlj6rmnInoioLngrnvvIzov5vooYzovrnnmoTnrZvpgIlcblxuXG4gIHZhciBjYW5kaWRhdGVHcmFwaE51bSA9IGNhbmRpZGF0ZUdyYXBocy5sZW5ndGg7XG5cbiAgdmFyIF9sb29wXzIgPSBmdW5jdGlvbiBfbG9vcF8yKGkpIHtcbiAgICB2YXIgY2FuZGlkYXRlR3JhcGggPSBjYW5kaWRhdGVHcmFwaHNbaV07XG4gICAgdmFyIGNhbmRpZGF0ZSA9IGNhbmRpZGF0ZUdyYXBoLm5vZGVzWzBdO1xuICAgIHZhciBjYW5kaWRhdGVOb2RlTGFiZWxDb3VudE1hcCA9IHt9O1xuICAgIHZhciBjYW5kaWRhdGVOb2RlTWFwID0ge307XG4gICAgY2FuZGlkYXRlR3JhcGgubm9kZXMuZm9yRWFjaChmdW5jdGlvbiAobm9kZSwgcSkge1xuICAgICAgY2FuZGlkYXRlTm9kZU1hcFtub2RlLmlkXSA9IHtcbiAgICAgICAgaWR4OiBxLFxuICAgICAgICBub2RlOiBub2RlLFxuICAgICAgICBkZWdyZWU6IDAsXG4gICAgICAgIGluRGVncmVlOiAwLFxuICAgICAgICBvdXREZWdyZWU6IDBcbiAgICAgIH07XG4gICAgICB2YXIgY05vZGVMYWJlbCA9IG5vZGVbbm9kZUxhYmVsUHJvcF07XG4gICAgICBpZiAoIWNhbmRpZGF0ZU5vZGVMYWJlbENvdW50TWFwW2NOb2RlTGFiZWxdKSBjYW5kaWRhdGVOb2RlTGFiZWxDb3VudE1hcFtjTm9kZUxhYmVsXSA9IDE7ZWxzZSBjYW5kaWRhdGVOb2RlTGFiZWxDb3VudE1hcFtjTm9kZUxhYmVsXSsrO1xuICAgIH0pOyAvLyDmoLnmja4gY2FuZGlkYXRlIOWSjCBuZWlnaGJvck5vZGVzIOS4reeahOiKgueCueeUn+aIkCBHIOeahOivseWvvOWtkOWbvlxuICAgIC8vIOWNs++8jOWwhiBncmFwaERhdGEg5LiK5Lik56uv6YO95ZyoIGNhbmRpZGF0ZUdyYXBoLm5vZGVzIOS4reeahOi+ueaUvuWFpSBjYW5kaWRhdGVFZGdlc1xuXG4gICAgdmFyIGNhbmRpZGF0ZUVkZ2VzID0gW107XG4gICAgdmFyIGVkZ2VMYWJlbENvdW50TWFwID0ge307XG4gICAgZ3JhcGhEYXRhLmVkZ2VzLmZvckVhY2goZnVuY3Rpb24gKGVkZ2UpIHtcbiAgICAgIGlmIChjYW5kaWRhdGVOb2RlTWFwW2VkZ2Uuc291cmNlXSAmJiBjYW5kaWRhdGVOb2RlTWFwW2VkZ2UudGFyZ2V0XSkge1xuICAgICAgICBjYW5kaWRhdGVFZGdlcy5wdXNoKGVkZ2UpO1xuICAgICAgICBpZiAoIWVkZ2VMYWJlbENvdW50TWFwW2VkZ2VbZWRnZUxhYmVsUHJvcF1dKSBlZGdlTGFiZWxDb3VudE1hcFtlZGdlW2VkZ2VMYWJlbFByb3BdXSA9IDE7ZWxzZSBlZGdlTGFiZWxDb3VudE1hcFtlZGdlW2VkZ2VMYWJlbFByb3BdXSsrO1xuICAgICAgICBjYW5kaWRhdGVOb2RlTWFwW2VkZ2Uuc291cmNlXS5kZWdyZWUrKztcbiAgICAgICAgY2FuZGlkYXRlTm9kZU1hcFtlZGdlLnRhcmdldF0uZGVncmVlKys7XG4gICAgICAgIGNhbmRpZGF0ZU5vZGVNYXBbZWRnZS5zb3VyY2VdLm91dERlZ3JlZSsrO1xuICAgICAgICBjYW5kaWRhdGVOb2RlTWFwW2VkZ2UudGFyZ2V0XS5pbkRlZ3JlZSsrO1xuICAgICAgfVxuICAgIH0pOyAvLyBwcnVuZe+8muiLpeacieS4gOS4qiBlZGdlTGFiZWwg5ZyoIGNhbmRpZGF0ZUdyYXBoIOS4iueahOS4quaVsOWwkeS6jiBwYXR0ZXJu77yM5Y676Zmk6K+l5Zu+XG5cbiAgICB2YXIgcGF0dGVuckVkZ2VMYWJlbE51bSA9IE9iamVjdC5rZXlzKHBhdHRlcm5FZGdlTGFiZWxNYXApLmxlbmd0aDtcbiAgICB2YXIgcHJ1bmVkQnlFZGdlTGFiZWwgPSBmYWxzZTtcblxuICAgIGZvciAodmFyIGUgPSAwOyBlIDwgcGF0dGVuckVkZ2VMYWJlbE51bTsgZSsrKSB7XG4gICAgICB2YXIgbGFiZWxfMSA9IE9iamVjdC5rZXlzKHBhdHRlcm5FZGdlTGFiZWxNYXApW2VdO1xuXG4gICAgICBpZiAoIWVkZ2VMYWJlbENvdW50TWFwW2xhYmVsXzFdIHx8IGVkZ2VMYWJlbENvdW50TWFwW2xhYmVsXzFdIDwgcGF0dGVybkVkZ2VMYWJlbE1hcFtsYWJlbF8xXS5sZW5ndGgpIHtcbiAgICAgICAgcHJ1bmVkQnlFZGdlTGFiZWwgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocHJ1bmVkQnlFZGdlTGFiZWwpIHtcbiAgICAgIGNhbmRpZGF0ZUdyYXBocy5zcGxpY2UoaSwgMSk7XG4gICAgICByZXR1cm4gXCJjb250aW51ZVwiO1xuICAgIH0gLy8g6YGN5Y6GIGNhbmRpZGF0ZUVkZ2Vz77yM6L+b6KGM6L6555qE562b6YCJXG5cblxuICAgIHZhciBjYW5kaWRhdGVFZGdlTnVtID0gY2FuZGlkYXRlRWRnZXMubGVuZ3RoOyAvLyBwcnVuZe+8muiLpei+ueaVsOi/h+Wwke+8jOWOu+mZpOivpeWbvlxuXG4gICAgaWYgKGNhbmRpZGF0ZUVkZ2VOdW0gPCBwYXR0ZXJuLmVkZ2VzLmxlbmd0aCkge1xuICAgICAgY2FuZGlkYXRlR3JhcGhzLnNwbGljZShpLCAxKTtcbiAgICAgIHJldHVybiBcImJyZWFrXCI7XG4gICAgfVxuXG4gICAgdmFyIGNhbmRpZGF0ZUdyYXBoSW52YWxpZCA9IGZhbHNlO1xuXG4gICAgdmFyIF9sb29wXzUgPSBmdW5jdGlvbiBfbG9vcF81KGUpIHtcbiAgICAgIHZhciBlZGdlID0gY2FuZGlkYXRlRWRnZXNbZV07XG4gICAgICB2YXIgZWRnZUxhYmVsID0gZWRnZVtlZGdlTGFiZWxQcm9wXTtcbiAgICAgIHZhciBwYXR0ZXJuRWRnZXNXaXRoTGFiZWwgPSBwYXR0ZXJuRWRnZUxhYmVsTWFwW2VkZ2VMYWJlbF07IC8vIHBydW5lIDE6IOiLpei+ueeahCBsYWJlbCDkuI3lrZjlnKjkuo4gcGF0dGVybiDovrkgbGFiZWwg5Lit77yM5Y676Zmk6K+l6L65XG5cbiAgICAgIGlmICghcGF0dGVybkVkZ2VzV2l0aExhYmVsIHx8ICFwYXR0ZXJuRWRnZXNXaXRoTGFiZWwubGVuZ3RoKSB7XG4gICAgICAgIGVkZ2VMYWJlbENvdW50TWFwW2VkZ2VMYWJlbF0tLTsgLy8g6Iul6L+Z5LiqIGxhYmVsIOeahCBjb3VudCDlh4/lsJHkuYvlkI7vvIzor6UgbGFiZWwg55qE6L655pWw5LiN6Laz77yM5Y676Zmk6K+l5Zu+XG5cbiAgICAgICAgaWYgKHBhdHRlcm5FZGdlc1dpdGhMYWJlbCAmJiBlZGdlTGFiZWxDb3VudE1hcFtlZGdlTGFiZWxdIDwgcGF0dGVybkVkZ2VzV2l0aExhYmVsLmxlbmd0aCkge1xuICAgICAgICAgIGNhbmRpZGF0ZUdyYXBoSW52YWxpZCA9IHRydWU7XG4gICAgICAgICAgcmV0dXJuIFwiYnJlYWtcIjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNhbmRpZGF0ZUVkZ2VzLnNwbGljZShlLCAxKTtcbiAgICAgICAgY2FuZGlkYXRlTm9kZU1hcFtlZGdlLnNvdXJjZV0uZGVncmVlLS07XG4gICAgICAgIGNhbmRpZGF0ZU5vZGVNYXBbZWRnZS50YXJnZXRdLmRlZ3JlZS0tO1xuICAgICAgICBjYW5kaWRhdGVOb2RlTWFwW2VkZ2Uuc291cmNlXS5vdXREZWdyZWUtLTtcbiAgICAgICAgY2FuZGlkYXRlTm9kZU1hcFtlZGdlLnRhcmdldF0uaW5EZWdyZWUtLTtcbiAgICAgICAgcmV0dXJuIFwiY29udGludWVcIjtcbiAgICAgIH0gLy8gcHJ1bmUgMjog6Iul6L6555qEIGxhYmVsICvkuKTnq68gbGFiZWwg55qE5LiJ5YWD57uE5YWz57O75LiN6IO95ZyoIHBhdHRlcm4g5Lit5om+5Yiw77yM5Y676Zmk6K+l6L65XG5cblxuICAgICAgdmFyIHNvdXJjZUxhYmVsID0gY2FuZGlkYXRlTm9kZU1hcFtlZGdlLnNvdXJjZV0ubm9kZVtub2RlTGFiZWxQcm9wXTtcbiAgICAgIHZhciB0YXJnZXRMYWJlbCA9IGNhbmRpZGF0ZU5vZGVNYXBbZWRnZS50YXJnZXRdLm5vZGVbbm9kZUxhYmVsUHJvcF07XG4gICAgICB2YXIgZWRnZU1hdGNoZWQgPSBmYWxzZTtcbiAgICAgIHBhdHRlcm5FZGdlc1dpdGhMYWJlbC5mb3JFYWNoKGZ1bmN0aW9uIChwYXR0ZXJuRWRnZSkge1xuICAgICAgICB2YXIgcGF0dGVyblNvdXJjZSA9IHBhdHRlcm5Ob2RlTWFwW3BhdHRlcm5FZGdlLnNvdXJjZV0ubm9kZTtcbiAgICAgICAgdmFyIHBhdHRlcm5UYXJnZXQgPSBwYXR0ZXJuTm9kZU1hcFtwYXR0ZXJuRWRnZS50YXJnZXRdLm5vZGU7XG4gICAgICAgIGlmIChwYXR0ZXJuU291cmNlW25vZGVMYWJlbFByb3BdID09PSBzb3VyY2VMYWJlbCAmJiBwYXR0ZXJuVGFyZ2V0W25vZGVMYWJlbFByb3BdID09PSB0YXJnZXRMYWJlbCkgZWRnZU1hdGNoZWQgPSB0cnVlO1xuICAgICAgICBpZiAoIWRpcmVjdGVkICYmIHBhdHRlcm5Tb3VyY2Vbbm9kZUxhYmVsUHJvcF0gPT09IHRhcmdldExhYmVsICYmIHBhdHRlcm5UYXJnZXRbbm9kZUxhYmVsUHJvcF0gPT09IHNvdXJjZUxhYmVsKSBlZGdlTWF0Y2hlZCA9IHRydWU7XG4gICAgICB9KTtcblxuICAgICAgaWYgKCFlZGdlTWF0Y2hlZCkge1xuICAgICAgICBlZGdlTGFiZWxDb3VudE1hcFtlZGdlTGFiZWxdLS07IC8vIOiLpei/meS4qiBsYWJlbCDnmoQgY291bnQg5YeP5bCR5LmL5ZCO77yM6K+lIGxhYmVsIOeahOi+ueaVsOS4jei2s++8jOWOu+mZpOivpeWbvlxuXG4gICAgICAgIGlmIChwYXR0ZXJuRWRnZXNXaXRoTGFiZWwgJiYgZWRnZUxhYmVsQ291bnRNYXBbZWRnZUxhYmVsXSA8IHBhdHRlcm5FZGdlc1dpdGhMYWJlbC5sZW5ndGgpIHtcbiAgICAgICAgICBjYW5kaWRhdGVHcmFwaEludmFsaWQgPSB0cnVlO1xuICAgICAgICAgIHJldHVybiBcImJyZWFrXCI7XG4gICAgICAgIH1cblxuICAgICAgICBjYW5kaWRhdGVFZGdlcy5zcGxpY2UoZSwgMSk7XG4gICAgICAgIGNhbmRpZGF0ZU5vZGVNYXBbZWRnZS5zb3VyY2VdLmRlZ3JlZS0tO1xuICAgICAgICBjYW5kaWRhdGVOb2RlTWFwW2VkZ2UudGFyZ2V0XS5kZWdyZWUtLTtcbiAgICAgICAgY2FuZGlkYXRlTm9kZU1hcFtlZGdlLnNvdXJjZV0ub3V0RGVncmVlLS07XG4gICAgICAgIGNhbmRpZGF0ZU5vZGVNYXBbZWRnZS50YXJnZXRdLmluRGVncmVlLS07XG4gICAgICAgIHJldHVybiBcImNvbnRpbnVlXCI7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGZvciAodmFyIGUgPSBjYW5kaWRhdGVFZGdlTnVtIC0gMTsgZSA+PSAwOyBlLS0pIHtcbiAgICAgIHZhciBzdGF0ZV8yID0gX2xvb3BfNShlKTtcblxuICAgICAgaWYgKHN0YXRlXzIgPT09IFwiYnJlYWtcIikgYnJlYWs7XG4gICAgfSAvLyBwcnVuZTI6IOWIoOmZpOi+ueeahOi/h+eoi+S4re+8jOWPkeeOsOi+ueaVsOi/h+WwkS/ovrkgbGFiZWwg5pWw6L+H5bCR5pe277yM5Y676Zmk6K+l5Zu+XG5cblxuICAgIGlmIChjYW5kaWRhdGVHcmFwaEludmFsaWQpIHtcbiAgICAgIGNhbmRpZGF0ZUdyYXBocy5zcGxpY2UoaSwgMSk7XG4gICAgICByZXR1cm4gXCJjb250aW51ZVwiO1xuICAgIH1cblxuICAgIGNhbmRpZGF0ZUdyYXBoLmVkZ2VzID0gY2FuZGlkYXRlRWRnZXM7XG4gICAgdmFyIGxlbmd0aHNUb0NhbmRpZGF0ZSA9IGRpamtzdHJhKGNhbmRpZGF0ZUdyYXBoLCBjYW5kaWRhdGVHcmFwaC5ub2Rlc1swXS5pZCwgZmFsc2UpLmxlbmd0aDtcbiAgICBPYmplY3Qua2V5cyhsZW5ndGhzVG9DYW5kaWRhdGUpLnJldmVyc2UoKS5mb3JFYWNoKGZ1bmN0aW9uICh0YXJnZXRJZCkge1xuICAgICAgaWYgKHRhcmdldElkID09PSBjYW5kaWRhdGVHcmFwaC5ub2Rlc1swXS5pZCB8fCBjYW5kaWRhdGVHcmFwaEludmFsaWQpIHJldHVybjsgLy8gcHJ1bmU0OiDpgJrov4fkuIrov7Doo4HliarvvIzlj6/og73lr7zoh7Tor6XpgrvlsYXlrZDlm77lj5jkuLrkuI3ov57pgJrjgILoo4Hliarmjonnm67liY3lnKjov5nkuKrpgrvlsYXlrZDlm77kuK3lkowgY2FuZGlkYXRl77yI56ys5LiA5Liq6IqC54K577yJ5LiN6L+e6YCa55qE6IqC54K5XG5cbiAgICAgIGlmIChsZW5ndGhzVG9DYW5kaWRhdGVbdGFyZ2V0SWRdID09PSBJbmZpbml0eSkge1xuICAgICAgICB2YXIgdGFyZ2V0Tm9kZUxhYmVsID0gY2FuZGlkYXRlTm9kZU1hcFt0YXJnZXRJZF0ubm9kZVtub2RlTGFiZWxQcm9wXTtcbiAgICAgICAgY2FuZGlkYXRlTm9kZUxhYmVsQ291bnRNYXBbdGFyZ2V0Tm9kZUxhYmVsXS0tO1xuXG4gICAgICAgIGlmIChjYW5kaWRhdGVOb2RlTGFiZWxDb3VudE1hcFt0YXJnZXROb2RlTGFiZWxdIDwgcGF0dGVybk5vZGVMYWJlbE1hcFt0YXJnZXROb2RlTGFiZWxdLmxlbmd0aCkge1xuICAgICAgICAgIGNhbmRpZGF0ZUdyYXBoSW52YWxpZCA9IHRydWU7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGlkeCA9IGNhbmRpZGF0ZUdyYXBoLm5vZGVzLmluZGV4T2YoY2FuZGlkYXRlTm9kZU1hcFt0YXJnZXRJZF0ubm9kZSk7XG4gICAgICAgIGNhbmRpZGF0ZUdyYXBoLm5vZGVzLnNwbGljZShpZHgsIDEpO1xuICAgICAgICBjYW5kaWRhdGVOb2RlTWFwW3RhcmdldElkXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSAvLyBwcnVuZTU6IOe7j+i/h+i+ueijgeWJquWQju+8jOWPr+iDveWPiOWHuueOsOS6huacgOefrei3r+W+hOi/h+mVv+eahOiKgueCuSDvvIjmr5QgcGF0dGVybiDkuK3lkIwgbGFiZWwg55qE6IqC54K55YiwIGJlZ2luTm9kZSDmnIDlpKfmnIDnn63ot53nprvov5zvvInvvIzliKDljrvov5nkupvoioLngrlcblxuXG4gICAgICB2YXIgbkxhYmVsID0gbm9kZU1hcFt0YXJnZXRJZF0ubm9kZVtub2RlTGFiZWxQcm9wXTtcblxuICAgICAgaWYgKCF1bmRpcmVjdGVkTGVuZ3Roc1RvQmVnaW5QTm9kZUxhYmVsTWFwW25MYWJlbF0gfHwgIXVuZGlyZWN0ZWRMZW5ndGhzVG9CZWdpblBOb2RlTGFiZWxNYXBbbkxhYmVsXS5sZW5ndGggfHwgbGVuZ3Roc1RvQ2FuZGlkYXRlW3RhcmdldElkXSA+IHVuZGlyZWN0ZWRMZW5ndGhzVG9CZWdpblBOb2RlTGFiZWxNYXBbbkxhYmVsXVt1bmRpcmVjdGVkTGVuZ3Roc1RvQmVnaW5QTm9kZUxhYmVsTWFwW25MYWJlbF0ubGVuZ3RoIC0gMV0pIHtcbiAgICAgICAgdmFyIHRhcmdldE5vZGVMYWJlbCA9IGNhbmRpZGF0ZU5vZGVNYXBbdGFyZ2V0SWRdLm5vZGVbbm9kZUxhYmVsUHJvcF07XG4gICAgICAgIGNhbmRpZGF0ZU5vZGVMYWJlbENvdW50TWFwW3RhcmdldE5vZGVMYWJlbF0tLTtcblxuICAgICAgICBpZiAoY2FuZGlkYXRlTm9kZUxhYmVsQ291bnRNYXBbdGFyZ2V0Tm9kZUxhYmVsXSA8IHBhdHRlcm5Ob2RlTGFiZWxNYXBbdGFyZ2V0Tm9kZUxhYmVsXS5sZW5ndGgpIHtcbiAgICAgICAgICBjYW5kaWRhdGVHcmFwaEludmFsaWQgPSB0cnVlO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBpZHggPSBjYW5kaWRhdGVHcmFwaC5ub2Rlcy5pbmRleE9mKGNhbmRpZGF0ZU5vZGVNYXBbdGFyZ2V0SWRdLm5vZGUpO1xuICAgICAgICBjYW5kaWRhdGVHcmFwaC5ub2Rlcy5zcGxpY2UoaWR4LCAxKTtcbiAgICAgICAgY2FuZGlkYXRlTm9kZU1hcFt0YXJnZXRJZF0gPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoY2FuZGlkYXRlR3JhcGhJbnZhbGlkKSB7XG4gICAgICBjYW5kaWRhdGVHcmFwaHMuc3BsaWNlKGksIDEpO1xuICAgICAgcmV0dXJuIFwiY29udGludWVcIjtcbiAgICB9XG5cbiAgICB2YXIgZGVncmVlQ2hhbmdlZCA9IHRydWU7XG4gICAgdmFyIGxvb3BDb3VudCA9IDA7XG5cbiAgICB3aGlsZSAoZGVncmVlQ2hhbmdlZCAmJiAhY2FuZGlkYXRlR3JhcGhJbnZhbGlkKSB7XG4gICAgICBkZWdyZWVDaGFuZ2VkID0gZmFsc2U7IC8vIGNhbmRpZGF0ZSDluqbmlbDkuI3otrPvvIzliKDljrvor6Xlm75cblxuICAgICAgdmFyIGNvbmRpdGlvbiA9IGRpcmVjdGVkID8gY2FuZGlkYXRlTm9kZU1hcFtjYW5kaWRhdGUuaWRdLmRlZ3JlZSA8IHBhdHRlcm5Ob2RlTWFwW2JlZ2luUE5vZGUuaWRdLmRlZ3JlZSB8fCBjYW5kaWRhdGVOb2RlTWFwW2NhbmRpZGF0ZS5pZF0uaW5EZWdyZWUgPCBwYXR0ZXJuTm9kZU1hcFtiZWdpblBOb2RlLmlkXS5pbkRlZ3JlZSB8fCBjYW5kaWRhdGVOb2RlTWFwW2NhbmRpZGF0ZS5pZF0ub3V0RGVncmVlIDwgcGF0dGVybk5vZGVNYXBbYmVnaW5QTm9kZS5pZF0ub3V0RGVncmVlIDogY2FuZGlkYXRlTm9kZU1hcFtjYW5kaWRhdGUuaWRdLmRlZ3JlZSA8IHBhdHRlcm5Ob2RlTWFwW2JlZ2luUE5vZGUuaWRdLmRlZ3JlZTtcblxuICAgICAgaWYgKGNvbmRpdGlvbikge1xuICAgICAgICBjYW5kaWRhdGVHcmFwaEludmFsaWQgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIH0gLy8gY2FuZGlkYXRlIGxhYmVsIOS4quaVsOS4jei2s++8jOWIoOWOu+ivpeWbvlxuXG5cbiAgICAgIGlmIChjYW5kaWRhdGVOb2RlTGFiZWxDb3VudE1hcFtjYW5kaWRhdGVbbm9kZUxhYmVsUHJvcF1dIDwgcGF0dGVybk5vZGVMYWJlbE1hcFtjYW5kaWRhdGVbbm9kZUxhYmVsUHJvcF1dLmxlbmd0aCkge1xuICAgICAgICBjYW5kaWRhdGVHcmFwaEludmFsaWQgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIH0gLy8gcHJ1bmU277ya5Y676Zmk5bqm5pWw6L+H5bCP55qE6IqC54K5XG5cblxuICAgICAgdmFyIGN1cnJlbnRDYW5kaWRhdGVOb2RlTnVtID0gY2FuZGlkYXRlR3JhcGgubm9kZXMubGVuZ3RoO1xuXG4gICAgICBmb3IgKHZhciBvID0gY3VycmVudENhbmRpZGF0ZU5vZGVOdW0gLSAxOyBvID49IDA7IG8tLSkge1xuICAgICAgICB2YXIgY2dOb2RlID0gY2FuZGlkYXRlR3JhcGgubm9kZXNbb107XG4gICAgICAgIHZhciBub2RlRGVncmVlID0gY2FuZGlkYXRlTm9kZU1hcFtjZ05vZGUuaWRdLmRlZ3JlZTtcbiAgICAgICAgdmFyIG5vZGVJbkRlZ3JlZSA9IGNhbmRpZGF0ZU5vZGVNYXBbY2dOb2RlLmlkXS5pbkRlZ3JlZTtcbiAgICAgICAgdmFyIG5vZGVPdXREZWdyZWUgPSBjYW5kaWRhdGVOb2RlTWFwW2NnTm9kZS5pZF0ub3V0RGVncmVlO1xuICAgICAgICB2YXIgY05vZGVMYWJlbCA9IGNnTm9kZVtub2RlTGFiZWxQcm9wXTtcblxuICAgICAgICB2YXIgX2QgPSBzdGFzaFBhdHRlcm5Ob2RlTGFiZWxEZWdyZWVNYXAobWluUGF0dGVybk5vZGVMYWJlbERlZ3JlZU1hcCwgY05vZGVMYWJlbCwgcGF0dGVybk5vZGVNYXAsIHBhdHRlcm5Ob2RlTGFiZWxNYXApLFxuICAgICAgICAgICAgbWluUGF0dGVybk5vZGVMYWJlbERlZ3JlZSA9IF9kLm1pblBhdHRlcm5Ob2RlTGFiZWxEZWdyZWUsXG4gICAgICAgICAgICBtaW5QYXR0ZXJuTm9kZUxhYmVsSW5EZWdyZWUgPSBfZC5taW5QYXR0ZXJuTm9kZUxhYmVsSW5EZWdyZWUsXG4gICAgICAgICAgICBtaW5QYXR0ZXJuTm9kZUxhYmVsT3V0RGVncmVlID0gX2QubWluUGF0dGVybk5vZGVMYWJlbE91dERlZ3JlZTtcblxuICAgICAgICB2YXIgZGVsZXRlQ29uZGl0aW9uID0gZGlyZWN0ZWQgPyBub2RlRGVncmVlIDwgbWluUGF0dGVybk5vZGVMYWJlbERlZ3JlZSB8fCBub2RlSW5EZWdyZWUgPCBtaW5QYXR0ZXJuTm9kZUxhYmVsSW5EZWdyZWUgfHwgbm9kZU91dERlZ3JlZSA8IG1pblBhdHRlcm5Ob2RlTGFiZWxPdXREZWdyZWUgOiBub2RlRGVncmVlIDwgbWluUGF0dGVybk5vZGVMYWJlbERlZ3JlZTtcblxuICAgICAgICBpZiAoZGVsZXRlQ29uZGl0aW9uKSB7XG4gICAgICAgICAgY2FuZGlkYXRlTm9kZUxhYmVsQ291bnRNYXBbY2dOb2RlW25vZGVMYWJlbFByb3BdXS0tOyAvLyDoioLngrkgbGFiZWwg5Liq5pWw5LiN6LazXG5cbiAgICAgICAgICBpZiAoY2FuZGlkYXRlTm9kZUxhYmVsQ291bnRNYXBbY2dOb2RlW25vZGVMYWJlbFByb3BdXSA8IHBhdHRlcm5Ob2RlTGFiZWxNYXBbY2dOb2RlW25vZGVMYWJlbFByb3BdXS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNhbmRpZGF0ZUdyYXBoSW52YWxpZCA9IHRydWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjYW5kaWRhdGVHcmFwaC5ub2Rlcy5zcGxpY2UobywgMSk7XG4gICAgICAgICAgY2FuZGlkYXRlTm9kZU1hcFtjZ05vZGUuaWRdID0gdW5kZWZpbmVkO1xuICAgICAgICAgIGRlZ3JlZUNoYW5nZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChjYW5kaWRhdGVHcmFwaEludmFsaWQgfHwgIWRlZ3JlZUNoYW5nZWQgJiYgbG9vcENvdW50ICE9PSAwKSBicmVhazsgLy8g57uP6L+HIHBydW5lNSDoioLngrnoo4HliarvvIzliKDljrvnq6/ngrnlt7Lnu4/kuI3lnKggY2FuZGlkYXRlR3JhcGgg5Lit55qE6L65XG5cbiAgICAgIGNhbmRpZGF0ZUVkZ2VOdW0gPSBjYW5kaWRhdGVFZGdlcy5sZW5ndGg7XG5cbiAgICAgIGZvciAodmFyIHkgPSBjYW5kaWRhdGVFZGdlTnVtIC0gMTsgeSA+PSAwOyB5LS0pIHtcbiAgICAgICAgdmFyIGNlZGdlID0gY2FuZGlkYXRlRWRnZXNbeV07XG5cbiAgICAgICAgaWYgKCFjYW5kaWRhdGVOb2RlTWFwW2NlZGdlLnNvdXJjZV0gfHwgIWNhbmRpZGF0ZU5vZGVNYXBbY2VkZ2UudGFyZ2V0XSkge1xuICAgICAgICAgIGNhbmRpZGF0ZUVkZ2VzLnNwbGljZSh5LCAxKTtcbiAgICAgICAgICB2YXIgZWRnZUxhYmVsID0gY2VkZ2VbZWRnZUxhYmVsUHJvcF07XG4gICAgICAgICAgZWRnZUxhYmVsQ291bnRNYXBbZWRnZUxhYmVsXS0tO1xuXG4gICAgICAgICAgaWYgKGNhbmRpZGF0ZU5vZGVNYXBbY2VkZ2Uuc291cmNlXSkge1xuICAgICAgICAgICAgY2FuZGlkYXRlTm9kZU1hcFtjZWRnZS5zb3VyY2VdLmRlZ3JlZS0tO1xuICAgICAgICAgICAgY2FuZGlkYXRlTm9kZU1hcFtjZWRnZS5zb3VyY2VdLm91dERlZ3JlZS0tO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChjYW5kaWRhdGVOb2RlTWFwW2NlZGdlLnRhcmdldF0pIHtcbiAgICAgICAgICAgIGNhbmRpZGF0ZU5vZGVNYXBbY2VkZ2UudGFyZ2V0XS5kZWdyZWUtLTtcbiAgICAgICAgICAgIGNhbmRpZGF0ZU5vZGVNYXBbY2VkZ2UudGFyZ2V0XS5pbkRlZ3JlZS0tO1xuICAgICAgICAgIH0gLy8g6L65IGxhYmVsIOaVsOmHj+S4jei2s1xuXG5cbiAgICAgICAgICBpZiAocGF0dGVybkVkZ2VMYWJlbE1hcFtlZGdlTGFiZWxdICYmIGVkZ2VMYWJlbENvdW50TWFwW2VkZ2VMYWJlbF0gPCBwYXR0ZXJuRWRnZUxhYmVsTWFwW2VkZ2VMYWJlbF0ubGVuZ3RoKSB7XG4gICAgICAgICAgICBjYW5kaWRhdGVHcmFwaEludmFsaWQgPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZGVncmVlQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbG9vcENvdW50Kys7XG4gICAgfVxuXG4gICAgaWYgKGNhbmRpZGF0ZUdyYXBoSW52YWxpZCkge1xuICAgICAgY2FuZGlkYXRlR3JhcGhzLnNwbGljZShpLCAxKTtcbiAgICAgIHJldHVybiBcImNvbnRpbnVlXCI7XG4gICAgfSAvLyBwcnVuZTog6Iul6IqC54K5L+i+ueaVsOi/h+Wwke+8jOiKgueCuS/ovrkgbGFiZWwg6L+H5bCR77yM5Y675o6J6L+Z5Liq5Zu+XG5cblxuICAgIGlmIChjYW5kaWRhdGVHcmFwaEludmFsaWQgfHwgY2FuZGlkYXRlR3JhcGgubm9kZXMubGVuZ3RoIDwgcGF0dGVybi5ub2Rlcy5sZW5ndGggfHwgY2FuZGlkYXRlRWRnZXMubGVuZ3RoIDwgcGF0dGVybi5lZGdlcy5sZW5ndGgpIHtcbiAgICAgIGNhbmRpZGF0ZUdyYXBocy5zcGxpY2UoaSwgMSk7XG4gICAgICByZXR1cm4gXCJjb250aW51ZVwiO1xuICAgIH1cbiAgfTtcblxuICBmb3IgKHZhciBpID0gY2FuZGlkYXRlR3JhcGhOdW0gLSAxOyBpID49IDA7IGktLSkge1xuICAgIHZhciBzdGF0ZV8xID0gX2xvb3BfMihpKTtcblxuICAgIGlmIChzdGF0ZV8xID09PSBcImJyZWFrXCIpIGJyZWFrO1xuICB9IC8vIOatpOaXtuW3sue7j+eUn+aIkOeahOWkmuS4qiBjYW5kaWRhdGVHcmFwaHPvvIzlj6/og73mnInph43lpI1cbiAgLy8gY29uc29sZS5sb2coXG4gIC8vICAgXCItLS0tLSBzdGFnZTU6IGdvaW5nIHRvIHNwbGljZSBkdWxwbGljYXRlZCBjYW5kaWRhdGUgZ3JhcGhzIC0tLS0tLS1cIlxuICAvLyApO1xuICAvLyDliKDljrsgY2FuZGlkYXRlR3JhcGhzIOS4reS4gOaooeS4gOagt+eahOWtkOWbvu+8jOmAmui/h+i+ueeahCBub2RlLW5vZGUtZWRnZUxhYmVsIOS9nOS4uiBrZXnvvIzov5nnsbvovrnkuKrmlbDkvZzkuLogdmFsdWXvvIzov5vooYzljLnphY1cblxuXG4gIHZhciBjdXJyZW50TGVuZ3RoID0gY2FuZGlkYXRlR3JhcGhzLmxlbmd0aDtcblxuICB2YXIgX2xvb3BfMyA9IGZ1bmN0aW9uIF9sb29wXzMoaSkge1xuICAgIHZhciBjZzEgPSBjYW5kaWRhdGVHcmFwaHNbaV07XG4gICAgdmFyIGNnMUVkZ2VNYXAgPSB7fTsgLy8gW25vZGUxLmlkLW5vZGUyLmlkLWVkZ2UubGFiZWxdOiBjb3VudFxuXG4gICAgY2cxLmVkZ2VzLmZvckVhY2goZnVuY3Rpb24gKGVkZ2UpIHtcbiAgICAgIHZhciBrZXkgPSBlZGdlLnNvdXJjZSArIFwiLVwiICsgZWRnZS50YXJnZXQgKyBcIi1cIiArIGVkZ2UubGFiZWw7XG4gICAgICBpZiAoIWNnMUVkZ2VNYXBba2V5XSkgY2cxRWRnZU1hcFtrZXldID0gMTtlbHNlIGNnMUVkZ2VNYXBba2V5XSsrO1xuICAgIH0pO1xuXG4gICAgdmFyIF9sb29wXzYgPSBmdW5jdGlvbiBfbG9vcF82KGopIHtcbiAgICAgIHZhciBjZzIgPSBjYW5kaWRhdGVHcmFwaHNbal07XG4gICAgICB2YXIgY2cyRWRnZU1hcCA9IHt9OyAvLyBbbm9kZTEuaWQtbm9kZTIuaWQtZWRnZS5sYWJlbF06IGNvdW50XG5cbiAgICAgIGNnMi5lZGdlcy5mb3JFYWNoKGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgICAgIHZhciBrZXkgPSBlZGdlLnNvdXJjZSArIFwiLVwiICsgZWRnZS50YXJnZXQgKyBcIi1cIiArIGVkZ2UubGFiZWw7XG4gICAgICAgIGlmICghY2cyRWRnZU1hcFtrZXldKSBjZzJFZGdlTWFwW2tleV0gPSAxO2Vsc2UgY2cyRWRnZU1hcFtrZXldKys7XG4gICAgICB9KTtcbiAgICAgIHZhciBzYW1lID0gdHJ1ZTtcblxuICAgICAgaWYgKE9iamVjdC5rZXlzKGNnMkVkZ2VNYXApLmxlbmd0aCAhPT0gT2JqZWN0LmtleXMoY2cxRWRnZU1hcCkubGVuZ3RoKSB7XG4gICAgICAgIHNhbWUgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIE9iamVjdC5rZXlzKGNnMUVkZ2VNYXApLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgIGlmIChjZzJFZGdlTWFwW2tleV0gIT09IGNnMUVkZ2VNYXBba2V5XSkgc2FtZSA9IGZhbHNlO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHNhbWUpIHtcbiAgICAgICAgY2FuZGlkYXRlR3JhcGhzLnNwbGljZShqLCAxKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZm9yICh2YXIgaiA9IGN1cnJlbnRMZW5ndGggLSAxOyBqID4gaTsgai0tKSB7XG4gICAgICBfbG9vcF82KGopO1xuICAgIH1cblxuICAgIGN1cnJlbnRMZW5ndGggPSBjYW5kaWRhdGVHcmFwaHMubGVuZ3RoO1xuICB9O1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDw9IGN1cnJlbnRMZW5ndGggLSAxOyBpKyspIHtcbiAgICBfbG9vcF8zKGkpO1xuICB9XG5cbiAgcmV0dXJuIGNhbmRpZGF0ZUdyYXBocztcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEdBRERJOyIsImltcG9ydCBMaW5rZWRMaXN0IGZyb20gJy4vbGlua2VkLWxpc3QnO1xuXG52YXIgU3RhY2sgPVxuLyoqIEBjbGFzcyAqL1xuZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBTdGFjayhtYXhTdGVwKSB7XG4gICAgaWYgKG1heFN0ZXAgPT09IHZvaWQgMCkge1xuICAgICAgbWF4U3RlcCA9IDEwO1xuICAgIH1cblxuICAgIHRoaXMubGlua2VkTGlzdCA9IG5ldyBMaW5rZWRMaXN0KCk7XG4gICAgdGhpcy5tYXhTdGVwID0gbWF4U3RlcDtcbiAgfVxuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTdGFjay5wcm90b3R5cGUsIFwibGVuZ3RoXCIsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmxpbmtlZExpc3QudG9BcnJheSgpLmxlbmd0aDtcbiAgICB9LFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KTtcbiAgLyoqXG4gICAqIOWIpOaWreagiOaYr+WQpuS4uuepuu+8jOWmguaenOmTvuihqOS4reayoeacieWktOmDqOWFg+e0oO+8jOWImeagiOS4uuepulxuICAgKi9cblxuICBTdGFjay5wcm90b3R5cGUuaXNFbXB0eSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gIXRoaXMubGlua2VkTGlzdC5oZWFkO1xuICB9O1xuICAvKipcbiAgICog5piv5ZCm5Yiw5a6a5LmJ55qE5qCI55qE5pyA5aSn6ZW/5bqm77yM5aaC5p6c6L6+5Yiw5pyA5aSn6ZW/5bqm5ZCO77yM5LiN5YaN5YWB6K645YWl5qCIXG4gICAqL1xuXG5cbiAgU3RhY2sucHJvdG90eXBlLmlzTWF4U3RhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMudG9BcnJheSgpLmxlbmd0aCA+PSB0aGlzLm1heFN0ZXA7XG4gIH07XG4gIC8qKlxuICAgKiDorr/pl67pobbnq6/lhYPntKBcbiAgICovXG5cblxuICBTdGFjay5wcm90b3R5cGUucGVlayA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodGhpcy5pc0VtcHR5KCkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gLy8g6L+U5Zue5aS06YOo5YWD57Sg77yM5LiN5Yig6Zmk5YWD57SgXG5cblxuICAgIHJldHVybiB0aGlzLmxpbmtlZExpc3QuaGVhZC52YWx1ZTtcbiAgfTtcblxuICBTdGFjay5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIHRoaXMubGlua2VkTGlzdC5wcmVwZW5kKHZhbHVlKTtcblxuICAgIGlmICh0aGlzLmxlbmd0aCA+IHRoaXMubWF4U3RlcCkge1xuICAgICAgdGhpcy5saW5rZWRMaXN0LmRlbGV0ZVRhaWwoKTtcbiAgICB9XG4gIH07XG5cbiAgU3RhY2sucHJvdG90eXBlLnBvcCA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcmVtb3ZlSGVhZCA9IHRoaXMubGlua2VkTGlzdC5kZWxldGVIZWFkKCk7XG4gICAgcmV0dXJuIHJlbW92ZUhlYWQgPyByZW1vdmVIZWFkLnZhbHVlIDogbnVsbDtcbiAgfTtcblxuICBTdGFjay5wcm90b3R5cGUudG9BcnJheSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5saW5rZWRMaXN0LnRvQXJyYXkoKS5tYXAoZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgIHJldHVybiBub2RlLnZhbHVlO1xuICAgIH0pO1xuICB9O1xuXG4gIFN0YWNrLnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uICgpIHtcbiAgICB3aGlsZSAoIXRoaXMuaXNFbXB0eSgpKSB7XG4gICAgICB0aGlzLnBvcCgpO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gU3RhY2s7XG59KCk7XG5cbmV4cG9ydCBkZWZhdWx0IFN0YWNrOyIsImltcG9ydCBnZXRBZGpNYXRyaXggZnJvbSAnLi9hZGphY2VudC1tYXRyaXgnO1xuaW1wb3J0IGJyZWFkdGhGaXJzdFNlYXJjaCBmcm9tICcuL2Jmcyc7XG5pbXBvcnQgY29ubmVjdGVkQ29tcG9uZW50IGZyb20gJy4vY29ubmVjdGVkLWNvbXBvbmVudCc7XG5pbXBvcnQgZ2V0RGVncmVlIGZyb20gJy4vZGVncmVlJztcbmltcG9ydCB7IGdldEluRGVncmVlLCBnZXRPdXREZWdyZWUgfSBmcm9tICcuL2RlZ3JlZSc7XG5pbXBvcnQgZGV0ZWN0Q3ljbGUsIHsgZGV0ZWN0QWxsQ3ljbGVzLCBkZXRlY3RBbGxEaXJlY3RlZEN5Y2xlLCBkZXRlY3RBbGxVbmRpcmVjdGVkQ3ljbGUgfSBmcm9tICcuL2RldGVjdC1jeWNsZSc7XG5pbXBvcnQgZGVwdGhGaXJzdFNlYXJjaCBmcm9tICcuL2Rmcyc7XG5pbXBvcnQgZGlqa3N0cmEgZnJvbSAnLi9kaWprc3RyYSc7XG5pbXBvcnQgeyBmaW5kQWxsUGF0aCwgZmluZFNob3J0ZXN0UGF0aCB9IGZyb20gJy4vZmluZC1wYXRoJztcbmltcG9ydCBmbG95ZFdhcnNoYWxsIGZyb20gJy4vZmxveWRXYXJzaGFsbCc7XG5pbXBvcnQgbGFiZWxQcm9wYWdhdGlvbiBmcm9tICcuL2xhYmVsLXByb3BhZ2F0aW9uJztcbmltcG9ydCBsb3V2YWluIGZyb20gJy4vbG91dmFpbic7XG5pbXBvcnQgbWluaW11bVNwYW5uaW5nVHJlZSBmcm9tICcuL210cyc7XG5pbXBvcnQgcGFnZVJhbmsgZnJvbSAnLi9wYWdlUmFuayc7XG5pbXBvcnQgR0FEREkgZnJvbSAnLi9nYWRkaSc7XG5pbXBvcnQgU3RhY2sgZnJvbSAnLi9zdHJ1Y3RzL3N0YWNrJztcbmltcG9ydCB7IGdldE5laWdoYm9ycyB9IGZyb20gJy4vdXRpbCc7XG52YXIgZGV0ZWN0RGlyZWN0ZWRDeWNsZSA9IGRldGVjdEN5Y2xlO1xuZXhwb3J0IHsgZ2V0QWRqTWF0cml4LCBicmVhZHRoRmlyc3RTZWFyY2gsIGNvbm5lY3RlZENvbXBvbmVudCwgZ2V0RGVncmVlLCBnZXRJbkRlZ3JlZSwgZ2V0T3V0RGVncmVlLCBkZXRlY3RDeWNsZSwgZGV0ZWN0RGlyZWN0ZWRDeWNsZSwgZGV0ZWN0QWxsQ3ljbGVzLCBkZXRlY3RBbGxEaXJlY3RlZEN5Y2xlLCBkZXRlY3RBbGxVbmRpcmVjdGVkQ3ljbGUsIGRlcHRoRmlyc3RTZWFyY2gsIGRpamtzdHJhLCBmaW5kQWxsUGF0aCwgZmluZFNob3J0ZXN0UGF0aCwgZmxveWRXYXJzaGFsbCwgbGFiZWxQcm9wYWdhdGlvbiwgbG91dmFpbiwgbWluaW11bVNwYW5uaW5nVHJlZSwgcGFnZVJhbmssIGdldE5laWdoYm9ycywgU3RhY2ssIEdBRERJIH07XG5leHBvcnQgZGVmYXVsdCB7XG4gIGdldEFkak1hdHJpeDogZ2V0QWRqTWF0cml4LFxuICBicmVhZHRoRmlyc3RTZWFyY2g6IGJyZWFkdGhGaXJzdFNlYXJjaCxcbiAgY29ubmVjdGVkQ29tcG9uZW50OiBjb25uZWN0ZWRDb21wb25lbnQsXG4gIGdldERlZ3JlZTogZ2V0RGVncmVlLFxuICBnZXRJbkRlZ3JlZTogZ2V0SW5EZWdyZWUsXG4gIGdldE91dERlZ3JlZTogZ2V0T3V0RGVncmVlLFxuICBkZXRlY3RDeWNsZTogZGV0ZWN0Q3ljbGUsXG4gIGRldGVjdERpcmVjdGVkQ3ljbGU6IGRldGVjdERpcmVjdGVkQ3ljbGUsXG4gIGRldGVjdEFsbEN5Y2xlczogZGV0ZWN0QWxsQ3ljbGVzLFxuICBkZXRlY3RBbGxEaXJlY3RlZEN5Y2xlOiBkZXRlY3RBbGxEaXJlY3RlZEN5Y2xlLFxuICBkZXRlY3RBbGxVbmRpcmVjdGVkQ3ljbGU6IGRldGVjdEFsbFVuZGlyZWN0ZWRDeWNsZSxcbiAgZGVwdGhGaXJzdFNlYXJjaDogZGVwdGhGaXJzdFNlYXJjaCxcbiAgZGlqa3N0cmE6IGRpamtzdHJhLFxuICBmaW5kQWxsUGF0aDogZmluZEFsbFBhdGgsXG4gIGZpbmRTaG9ydGVzdFBhdGg6IGZpbmRTaG9ydGVzdFBhdGgsXG4gIGZsb3lkV2Fyc2hhbGw6IGZsb3lkV2Fyc2hhbGwsXG4gIGxhYmVsUHJvcGFnYXRpb246IGxhYmVsUHJvcGFnYXRpb24sXG4gIGxvdXZhaW46IGxvdXZhaW4sXG4gIG1pbmltdW1TcGFubmluZ1RyZWU6IG1pbmltdW1TcGFubmluZ1RyZWUsXG4gIHBhZ2VSYW5rOiBwYWdlUmFuayxcbiAgZ2V0TmVpZ2hib3JzOiBnZXROZWlnaGJvcnMsXG4gIFN0YWNrOiBTdGFjayxcbiAgR0FEREk6IEdBRERJXG59OyIsImltcG9ydCB7IG1hdDMsIHZlYzMsIGV4dCwgdmVjMiB9IGZyb20gJ0BhbnR2L21hdHJpeC11dGlsJztcbmltcG9ydCB7IGlzQXJyYXksIGVhY2ggfSBmcm9tICdAYW50di91dGlsJztcbnZhciB0cmFuc2Zvcm0gPSBleHQudHJhbnNmb3JtO1xuLyoqXG4gKiDlr7nmr5Tlr7nosaHvvIznlKjkuo7lr7nosaHmlbDnu4TmjpLluo9cbiAqIEBwYXJhbSAgIHtzdHJpbmd9ICAgICAgIGF0dHJpYnV0ZU5hbWUgIOaOkuW6j+S+neaNrueahOWtl+auteWQjeensFxuICogQHBhcmFtICAge251bWJlcn0gICAgICAgbWluICAgIOacgOWwj+WAvFxuICogQHBhcmFtICAge251bWJlcn0gICAgICAgbWF4ICAgIOacgOWkp+WAvFxuICogQHJldHVybiAge2Jvb2xlYW59ICAgICAgYm9vbCAgIOW4g+WwlFxuICovXG5cbmV4cG9ydCB2YXIgY29tcGFyZSA9IGZ1bmN0aW9uIGNvbXBhcmUoYXR0cmlidXRlTmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24gKG0sIG4pIHtcbiAgICByZXR1cm4gbVthdHRyaWJ1dGVOYW1lXSAtIG5bYXR0cmlidXRlTmFtZV07XG4gIH07XG59O1xuLyoqXG4gKiDmmK/lkKblnKjljLrpl7TlhoVcbiAqIEBwYXJhbSAgIHtudW1iZXJ9ICAgICAgIHZhbHVlICDlgLxcbiAqIEBwYXJhbSAgIHtudW1iZXJ9ICAgICAgIG1pbiAgICDmnIDlsI/lgLxcbiAqIEBwYXJhbSAgIHtudW1iZXJ9ICAgICAgIG1heCAgICDmnIDlpKflgLxcbiAqIEByZXR1cm4gIHtib29sZWFufSAgICAgIGJvb2wgICDluIPlsJRcbiAqL1xuXG52YXIgaXNCZXR3ZWVuID0gZnVuY3Rpb24gaXNCZXR3ZWVuKHZhbHVlLCBtaW4sIG1heCkge1xuICByZXR1cm4gdmFsdWUgPj0gbWluICYmIHZhbHVlIDw9IG1heDtcbn07XG4vKipcbiAqIOiOt+WPluS4pOadoee6v+auteeahOS6pOeCuVxuICogQHBhcmFtICB7UG9pbnR9ICBwMCDnrKzkuIDmnaHnur/mrrXotbfngrlcbiAqIEBwYXJhbSAge1BvaW50fSAgcDEg56ys5LiA5p2h57q/5q6157uI54K5XG4gKiBAcGFyYW0gIHtQb2ludH0gIHAyIOesrOS6jOadoee6v+autei1t+eCuVxuICogQHBhcmFtICB7UG9pbnR9ICBwMyDnrKzkuozmnaHnur/mrrXnu4jngrlcbiAqIEByZXR1cm4ge1BvaW50fSAg5Lqk54K5XG4gKi9cblxuXG5leHBvcnQgdmFyIGdldExpbmVJbnRlcnNlY3QgPSBmdW5jdGlvbiBnZXRMaW5lSW50ZXJzZWN0KHAwLCBwMSwgcDIsIHAzKSB7XG4gIHZhciB0b2xlcmFuY2UgPSAwLjAwMDE7XG4gIHZhciBFID0ge1xuICAgIHg6IHAyLnggLSBwMC54LFxuICAgIHk6IHAyLnkgLSBwMC55XG4gIH07XG4gIHZhciBEMCA9IHtcbiAgICB4OiBwMS54IC0gcDAueCxcbiAgICB5OiBwMS55IC0gcDAueVxuICB9O1xuICB2YXIgRDEgPSB7XG4gICAgeDogcDMueCAtIHAyLngsXG4gICAgeTogcDMueSAtIHAyLnlcbiAgfTtcbiAgdmFyIGtyb3NzID0gRDAueCAqIEQxLnkgLSBEMC55ICogRDEueDtcbiAgdmFyIHNxcktyb3NzID0ga3Jvc3MgKiBrcm9zcztcbiAgdmFyIGludmVydEtyb3NzID0gMSAvIGtyb3NzO1xuICB2YXIgc3FyTGVuMCA9IEQwLnggKiBEMC54ICsgRDAueSAqIEQwLnk7XG4gIHZhciBzcXJMZW4xID0gRDEueCAqIEQxLnggKyBEMS55ICogRDEueTtcblxuICBpZiAoc3FyS3Jvc3MgPiB0b2xlcmFuY2UgKiBzcXJMZW4wICogc3FyTGVuMSkge1xuICAgIHZhciBzID0gKEUueCAqIEQxLnkgLSBFLnkgKiBEMS54KSAqIGludmVydEtyb3NzO1xuICAgIHZhciB0ID0gKEUueCAqIEQwLnkgLSBFLnkgKiBEMC54KSAqIGludmVydEtyb3NzO1xuICAgIGlmICghaXNCZXR3ZWVuKHMsIDAsIDEpIHx8ICFpc0JldHdlZW4odCwgMCwgMSkpIHJldHVybiBudWxsO1xuICAgIHJldHVybiB7XG4gICAgICB4OiBwMC54ICsgcyAqIEQwLngsXG4gICAgICB5OiBwMC55ICsgcyAqIEQwLnlcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59O1xuLyoqXG4gKiBwb2ludCBhbmQgcmVjdGFuZ3VsYXIgaW50ZXJzZWN0aW9uIHBvaW50XG4gKiBAcGFyYW0gIHtJUmVjdH0gcmVjdCAgcmVjdFxuICogQHBhcmFtICB7UG9pbnR9IHBvaW50IHBvaW50XG4gKiBAcmV0dXJuIHtQb2ludFBvaW50fSByc3Q7XG4gKi9cblxuZXhwb3J0IHZhciBnZXRSZWN0SW50ZXJzZWN0QnlQb2ludCA9IGZ1bmN0aW9uIGdldFJlY3RJbnRlcnNlY3RCeVBvaW50KHJlY3QsIHBvaW50KSB7XG4gIHZhciB4ID0gcmVjdC54LFxuICAgICAgeSA9IHJlY3QueSxcbiAgICAgIHdpZHRoID0gcmVjdC53aWR0aCxcbiAgICAgIGhlaWdodCA9IHJlY3QuaGVpZ2h0O1xuICB2YXIgY3ggPSB4ICsgd2lkdGggLyAyO1xuICB2YXIgY3kgPSB5ICsgaGVpZ2h0IC8gMjtcbiAgdmFyIHBvaW50cyA9IFtdO1xuICB2YXIgY2VudGVyID0ge1xuICAgIHg6IGN4LFxuICAgIHk6IGN5XG4gIH07XG4gIHBvaW50cy5wdXNoKHtcbiAgICB4OiB4LFxuICAgIHk6IHlcbiAgfSk7XG4gIHBvaW50cy5wdXNoKHtcbiAgICB4OiB4ICsgd2lkdGgsXG4gICAgeTogeVxuICB9KTtcbiAgcG9pbnRzLnB1c2goe1xuICAgIHg6IHggKyB3aWR0aCxcbiAgICB5OiB5ICsgaGVpZ2h0XG4gIH0pO1xuICBwb2ludHMucHVzaCh7XG4gICAgeDogeCxcbiAgICB5OiB5ICsgaGVpZ2h0XG4gIH0pO1xuICBwb2ludHMucHVzaCh7XG4gICAgeDogeCxcbiAgICB5OiB5XG4gIH0pO1xuICB2YXIgcnN0ID0gbnVsbDtcblxuICBmb3IgKHZhciBpID0gMTsgaSA8IHBvaW50cy5sZW5ndGg7IGkrKykge1xuICAgIHJzdCA9IGdldExpbmVJbnRlcnNlY3QocG9pbnRzW2kgLSAxXSwgcG9pbnRzW2ldLCBjZW50ZXIsIHBvaW50KTtcblxuICAgIGlmIChyc3QpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByc3Q7XG59O1xuLyoqXG4gKiBnZXQgcG9pbnQgYW5kIGNpcmNsZSBpbkludGVyc2VjdFxuICogQHBhcmFtIHtJQ2lyY2xlfSBjaXJjbGUg5ZyG54K577yMeCx5LHJcbiAqIEBwYXJhbSB7UG9pbnR9IHBvaW50IOeCuSB4LHlcbiAqIEByZXR1cm4ge1BvaW50fSBhcHBsaWVkIHBvaW50XG4gKi9cblxuZXhwb3J0IHZhciBnZXRDaXJjbGVJbnRlcnNlY3RCeVBvaW50ID0gZnVuY3Rpb24gZ2V0Q2lyY2xlSW50ZXJzZWN0QnlQb2ludChjaXJjbGUsIHBvaW50KSB7XG4gIHZhciBjeCA9IGNpcmNsZS54LFxuICAgICAgY3kgPSBjaXJjbGUueSxcbiAgICAgIHIgPSBjaXJjbGUucjtcbiAgdmFyIHggPSBwb2ludC54LFxuICAgICAgeSA9IHBvaW50Lnk7XG4gIHZhciBkeCA9IHggLSBjeDtcbiAgdmFyIGR5ID0geSAtIGN5O1xuXG4gIGlmIChkeCAqIGR4ICsgZHkgKiBkeSA8IHIgKiByKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YXIgYW5nbGUgPSBNYXRoLmF0YW4oZHkgLyBkeCk7XG4gIHJldHVybiB7XG4gICAgeDogY3ggKyBNYXRoLmFicyhyICogTWF0aC5jb3MoYW5nbGUpKSAqIE1hdGguc2lnbihkeCksXG4gICAgeTogY3kgKyBNYXRoLmFicyhyICogTWF0aC5zaW4oYW5nbGUpKSAqIE1hdGguc2lnbihkeSlcbiAgfTtcbn07XG4vKipcbiAqIGdldCBwb2ludCBhbmQgZWxsaXBzZSBpbkludGVyc2VjdFxuICogQHBhcmFtIHtPYmplY3R9IGVsbGlwc2Ug5qSt5ZyGIHgseSxyeCxyeVxuICogQHBhcmFtIHtPYmplY3R9IHBvaW50IOeCuSB4LHlcbiAqIEByZXR1cm4ge29iamVjdH0gYXBwbGllZCBwb2ludFxuICovXG5cbmV4cG9ydCB2YXIgZ2V0RWxsaXBzZUludGVyc2VjdEJ5UG9pbnQgPSBmdW5jdGlvbiBnZXRFbGxpcHNlSW50ZXJzZWN0QnlQb2ludChlbGxpcHNlLCBwb2ludCkge1xuICB2YXIgYSA9IGVsbGlwc2Uucng7XG4gIHZhciBiID0gZWxsaXBzZS5yeTtcbiAgdmFyIGN4ID0gZWxsaXBzZS54O1xuICB2YXIgY3kgPSBlbGxpcHNlLnk7XG4gIHZhciBkeCA9IHBvaW50LnggLSBjeDtcbiAgdmFyIGR5ID0gcG9pbnQueSAtIGN5OyAvLyDnm7TmjqXpgJrov4cgeCx5IOaxguWkueinku+8jOaxguWHuuadpeeahOiMg+WbtOaYryAtUEksIFBJXG5cbiAgdmFyIGFuZ2xlID0gTWF0aC5hdGFuMihkeSAvIGIsIGR4IC8gYSk7XG5cbiAgaWYgKGFuZ2xlIDwgMCkge1xuICAgIGFuZ2xlICs9IDIgKiBNYXRoLlBJOyAvLyDovazmjaLliLAgMO+8jDJQSVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB4OiBjeCArIGEgKiBNYXRoLmNvcyhhbmdsZSksXG4gICAgeTogY3kgKyBiICogTWF0aC5zaW4oYW5nbGUpXG4gIH07XG59O1xuLyoqXG4gKiBjb29yZGluYXRlIG1hdHJpeCB0cmFuc2Zvcm1hdGlvblxuICogQHBhcmFtICB7bnVtYmVyfSBwb2ludCAgIGNvb3JkaW5hdGVcbiAqIEBwYXJhbSAge01hdHJpeH0gbWF0cml4ICBtYXRyaXhcbiAqIEBwYXJhbSAge251bWJlcn0gdGFnICAgICBjb3VsZCBiZSAwIG9yIDFcbiAqIEByZXR1cm4ge1BvaW50fSB0cmFuc2Zvcm1lZCBwb2ludFxuICovXG5cbmV4cG9ydCB2YXIgYXBwbHlNYXRyaXggPSBmdW5jdGlvbiBhcHBseU1hdHJpeChwb2ludCwgbWF0cml4LCB0YWcpIHtcbiAgaWYgKHRhZyA9PT0gdm9pZCAwKSB7XG4gICAgdGFnID0gMTtcbiAgfVxuXG4gIHZhciB2ZWN0b3IgPSBbcG9pbnQueCwgcG9pbnQueSwgdGFnXTtcblxuICBpZiAoIW1hdHJpeCB8fCBpc05hTihtYXRyaXhbMF0pKSB7XG4gICAgbWF0cml4ID0gWzEsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDFdO1xuICB9XG5cbiAgdmVjMy50cmFuc2Zvcm1NYXQzKHZlY3RvciwgdmVjdG9yLCBtYXRyaXgpO1xuICByZXR1cm4ge1xuICAgIHg6IHZlY3RvclswXSxcbiAgICB5OiB2ZWN0b3JbMV1cbiAgfTtcbn07XG4vKipcbiAqIGNvb3JkaW5hdGUgbWF0cml4IGludmVydCB0cmFuc2Zvcm1hdGlvblxuICogQHBhcmFtICB7bnVtYmVyfSBwb2ludCAgIGNvb3JkaW5hdGVcbiAqIEBwYXJhbSAge251bWJlcn0gbWF0cml4ICBtYXRyaXhcbiAqIEBwYXJhbSAge251bWJlcn0gdGFnICAgICBjb3VsZCBiZSAwIG9yIDFcbiAqIEByZXR1cm4ge29iamVjdH0gdHJhbnNmb3JtZWQgcG9pbnRcbiAqL1xuXG5leHBvcnQgdmFyIGludmVydE1hdHJpeCA9IGZ1bmN0aW9uIGludmVydE1hdHJpeChwb2ludCwgbWF0cml4LCB0YWcpIHtcbiAgaWYgKHRhZyA9PT0gdm9pZCAwKSB7XG4gICAgdGFnID0gMTtcbiAgfVxuXG4gIGlmICghbWF0cml4IHx8IGlzTmFOKG1hdHJpeFswXSkpIHtcbiAgICBtYXRyaXggPSBbMSwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMV07XG4gIH1cblxuICB2YXIgaW52ZXJzZWRNYXRyaXggPSBtYXQzLmludmVydChbMSwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMV0sIG1hdHJpeCk7XG5cbiAgaWYgKCFpbnZlcnNlZE1hdHJpeCkge1xuICAgIGludmVyc2VkTWF0cml4ID0gWzEsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDFdO1xuICB9XG5cbiAgdmFyIHZlY3RvciA9IFtwb2ludC54LCBwb2ludC55LCB0YWddO1xuICB2ZWMzLnRyYW5zZm9ybU1hdDModmVjdG9yLCB2ZWN0b3IsIGludmVyc2VkTWF0cml4KTtcbiAgcmV0dXJuIHtcbiAgICB4OiB2ZWN0b3JbMF0sXG4gICAgeTogdmVjdG9yWzFdXG4gIH07XG59O1xuLyoqXG4gKlxuICogQHBhcmFtIHAxIEZpcnN0IGNvb3JkaW5hdGVcbiAqIEBwYXJhbSBwMiBzZWNvbmQgY29vcmRpbmF0ZVxuICogQHBhcmFtIHAzIHRocmVlIGNvb3JkaW5hdGVcbiAqL1xuXG5leHBvcnQgdmFyIGdldENpcmNsZUNlbnRlckJ5UG9pbnRzID0gZnVuY3Rpb24gZ2V0Q2lyY2xlQ2VudGVyQnlQb2ludHMocDEsIHAyLCBwMykge1xuICB2YXIgYSA9IHAxLnggLSBwMi54O1xuICB2YXIgYiA9IHAxLnkgLSBwMi55O1xuICB2YXIgYyA9IHAxLnggLSBwMy54O1xuICB2YXIgZCA9IHAxLnkgLSBwMy55O1xuICB2YXIgZSA9IChwMS54ICogcDEueCAtIHAyLnggKiBwMi54IC0gcDIueSAqIHAyLnkgKyBwMS55ICogcDEueSkgLyAyO1xuICB2YXIgZiA9IChwMS54ICogcDEueCAtIHAzLnggKiBwMy54IC0gcDMueSAqIHAzLnkgKyBwMS55ICogcDEueSkgLyAyO1xuICB2YXIgZGVub21pbmF0b3IgPSBiICogYyAtIGEgKiBkO1xuICByZXR1cm4ge1xuICAgIHg6IC0oZCAqIGUgLSBiICogZikgLyBkZW5vbWluYXRvcixcbiAgICB5OiAtKGEgKiBmIC0gYyAqIGUpIC8gZGVub21pbmF0b3JcbiAgfTtcbn07XG4vKipcbiAqIGdldCBkaXN0YW5jZSBieSB0d28gcG9pbnRzXG4gKiBAcGFyYW0gcDEgZmlyc3QgcG9pbnRcbiAqIEBwYXJhbSBwMiBzZWNvbmQgcG9pbnRcbiAqL1xuXG5leHBvcnQgdmFyIGRpc3RhbmNlID0gZnVuY3Rpb24gZGlzdGFuY2UocDEsIHAyKSB7XG4gIHZhciB2eCA9IHAxLnggLSBwMi54O1xuICB2YXIgdnkgPSBwMS55IC0gcDIueTtcbiAgcmV0dXJuIE1hdGguc3FydCh2eCAqIHZ4ICsgdnkgKiB2eSk7XG59O1xuLyoqXG4gKiBzY2FsZSBtYXRyaXhcbiAqIEBwYXJhbSBtYXRyaXggWyBbXSwgW10sIFtdIF1cbiAqIEBwYXJhbSByYXRpb1xuICovXG5cbmV4cG9ydCB2YXIgc2NhbGVNYXRyaXggPSBmdW5jdGlvbiBzY2FsZU1hdHJpeChtYXRyaXgsIHJhdGlvKSB7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgbWF0cml4LmZvckVhY2goZnVuY3Rpb24gKHJvdykge1xuICAgIHZhciBuZXdSb3cgPSBbXTtcbiAgICByb3cuZm9yRWFjaChmdW5jdGlvbiAodikge1xuICAgICAgbmV3Um93LnB1c2godiAqIHJhdGlvKTtcbiAgICB9KTtcbiAgICByZXN1bHQucHVzaChuZXdSb3cpO1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG4vKipcbiAqIEZsb3lkIFdhcnNoYWxsIGFsZ29yaXRobSBmb3Igc2hvcnRlc3QgcGF0aCBkaXN0YW5jZXMgbWF0cml4XG4gKiBAcGFyYW0gIHthcnJheX0gYWRqTWF0cml4ICAgYWRqYWNlbmN5IG1hdHJpeFxuICogQHJldHVybiB7YXJyYXl9IGRpc3RhbmNlcyAgIHNob3J0ZXN0IHBhdGggZGlzdGFuY2VzIG1hdHJpeFxuICovXG5cbmV4cG9ydCB2YXIgZmxveWRXYXJzaGFsbCA9IGZ1bmN0aW9uIGZsb3lkV2Fyc2hhbGwoYWRqTWF0cml4KSB7XG4gIC8vIGluaXRpYWxpemVcbiAgdmFyIGRpc3QgPSBbXTtcbiAgdmFyIHNpemUgPSBhZGpNYXRyaXgubGVuZ3RoO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc2l6ZTsgaSArPSAxKSB7XG4gICAgZGlzdFtpXSA9IFtdO1xuXG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBzaXplOyBqICs9IDEpIHtcbiAgICAgIGlmIChpID09PSBqKSB7XG4gICAgICAgIGRpc3RbaV1bal0gPSAwO1xuICAgICAgfSBlbHNlIGlmIChhZGpNYXRyaXhbaV1bal0gPT09IDAgfHwgIWFkak1hdHJpeFtpXVtqXSkge1xuICAgICAgICBkaXN0W2ldW2pdID0gSW5maW5pdHk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkaXN0W2ldW2pdID0gYWRqTWF0cml4W2ldW2pdO1xuICAgICAgfVxuICAgIH1cbiAgfSAvLyBmbG95ZFxuXG5cbiAgZm9yICh2YXIgayA9IDA7IGsgPCBzaXplOyBrICs9IDEpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNpemU7IGkgKz0gMSkge1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBzaXplOyBqICs9IDEpIHtcbiAgICAgICAgaWYgKGRpc3RbaV1bal0gPiBkaXN0W2ldW2tdICsgZGlzdFtrXVtqXSkge1xuICAgICAgICAgIGRpc3RbaV1bal0gPSBkaXN0W2ldW2tdICsgZGlzdFtrXVtqXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBkaXN0O1xufTtcbi8qKlxuICogZ2V0IGFkamFjZW5jeSBtYXRyaXhcbiAqIEBwYXJhbSBkYXRhIGdyYXBoIGRhdGFcbiAqIEBwYXJhbSBkaXJlY3RlZCB3aGV0aGVyIGl0J3MgYSBkaXJlY3RlZCBncmFwaFxuICovXG5cbmV4cG9ydCB2YXIgZ2V0QWRqTWF0cml4ID0gZnVuY3Rpb24gZ2V0QWRqTWF0cml4KGRhdGEsIGRpcmVjdGVkKSB7XG4gIHZhciBub2RlcyA9IGRhdGEubm9kZXMsXG4gICAgICBlZGdlcyA9IGRhdGEuZWRnZXM7XG4gIHZhciBtYXRyaXggPSBbXTsgLy8gbWFwIG5vZGUgd2l0aCBpbmRleCBpbiBkYXRhLm5vZGVzXG5cbiAgdmFyIG5vZGVNYXAgPSB7fTtcblxuICBpZiAoIW5vZGVzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIG5vZGVzIGRhdGEhJyk7XG4gIH1cblxuICBpZiAobm9kZXMpIHtcbiAgICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChub2RlLCBpKSB7XG4gICAgICBub2RlTWFwW25vZGUuaWRdID0gaTtcbiAgICAgIHZhciByb3cgPSBbXTtcbiAgICAgIG1hdHJpeC5wdXNoKHJvdyk7XG4gICAgfSk7XG4gIH1cblxuICBpZiAoZWRnZXMpIHtcbiAgICBlZGdlcy5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgc291cmNlID0gZS5zb3VyY2UsXG4gICAgICAgICAgdGFyZ2V0ID0gZS50YXJnZXQ7XG4gICAgICB2YXIgc0luZGV4ID0gbm9kZU1hcFtzb3VyY2VdO1xuICAgICAgdmFyIHRJbmRleCA9IG5vZGVNYXBbdGFyZ2V0XTtcbiAgICAgIG1hdHJpeFtzSW5kZXhdW3RJbmRleF0gPSAxO1xuXG4gICAgICBpZiAoIWRpcmVjdGVkKSB7XG4gICAgICAgIG1hdHJpeFt0SW5kZXhdW3NJbmRleF0gPSAxO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIG1hdHJpeDtcbn07XG4vKipcbiAqIOW5s+enu2dyb3VwXG4gKiBAcGFyYW0gZ3JvdXAgR3JvdXAg5a6e5L6LXG4gKiBAcGFyYW0gdmVjIOenu+WKqOWQkemHj1xuICovXG5cbmV4cG9ydCB2YXIgdHJhbnNsYXRlID0gZnVuY3Rpb24gdHJhbnNsYXRlKGdyb3VwLCB2ZWMpIHtcbiAgZ3JvdXAudHJhbnNsYXRlKHZlYy54LCB2ZWMueSk7XG59O1xuLyoqXG4gKiDnp7vliqjliLDmjIflrprlnZDmoIfngrlcbiAqIEBwYXJhbSBncm91cCBHcm91cCDlrp7kvotcbiAqIEBwYXJhbSBwb2ludCDnp7vliqjliLDnmoTlnZDmoIfngrlcbiAqL1xuXG5leHBvcnQgdmFyIG1vdmUgPSBmdW5jdGlvbiBtb3ZlKGdyb3VwLCBwb2ludCwgYW5pbWF0ZSwgYW5pbWF0ZUNmZykge1xuICBpZiAoYW5pbWF0ZUNmZyA9PT0gdm9pZCAwKSB7XG4gICAgYW5pbWF0ZUNmZyA9IHtcbiAgICAgIGR1cmF0aW9uOiA1MDBcbiAgICB9O1xuICB9XG5cbiAgdmFyIG1hdHJpeCA9IGdyb3VwLmdldE1hdHJpeCgpO1xuXG4gIGlmICghbWF0cml4KSB7XG4gICAgbWF0cml4ID0gWzEsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDFdO1xuICB9XG5cbiAgdmFyIGJib3ggPSBncm91cC5nZXRDYW52YXNCQm94KCk7XG4gIHZhciB2eCA9IHBvaW50LnggLSBiYm94Lm1pblg7XG4gIHZhciB2eSA9IHBvaW50LnkgLSBiYm94Lm1pblk7XG5cbiAgaWYgKGFuaW1hdGUpIHtcbiAgICB2YXIgZHhfMSA9IHZ4ICogbWF0cml4WzBdO1xuICAgIHZhciBkeV8xID0gdnkgKiBtYXRyaXhbNF07XG4gICAgdmFyIGxhc3RYXzEgPSAwO1xuICAgIHZhciBsYXN0WV8xID0gMDtcbiAgICB2YXIgbmV3WF8xID0gMDtcbiAgICB2YXIgbmV3WV8xID0gMDtcbiAgICBncm91cC5hbmltYXRlKGZ1bmN0aW9uIChyYXRpbykge1xuICAgICAgbmV3WF8xID0gZHhfMSAqIHJhdGlvO1xuICAgICAgbmV3WV8xID0gZHlfMSAqIHJhdGlvO1xuICAgICAgbWF0cml4ID0gdHJhbnNmb3JtKG1hdHJpeCwgW1sndCcsIG5ld1hfMSAtIGxhc3RYXzEsIG5ld1lfMSAtIGxhc3RZXzFdXSk7XG4gICAgICBsYXN0WF8xID0gbmV3WF8xO1xuICAgICAgbGFzdFlfMSA9IG5ld1lfMTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG1hdHJpeDogbWF0cml4XG4gICAgICB9O1xuICAgIH0sIGFuaW1hdGVDZmcpO1xuICB9IGVsc2Uge1xuICAgIHZhciBtb3ZlZE1hdHJpeCA9IHRyYW5zZm9ybShtYXRyaXgsIFtbJ3QnLCB2eCwgdnldXSk7XG4gICAgZ3JvdXAuc2V0TWF0cml4KG1vdmVkTWF0cml4KTtcbiAgfVxufTtcbi8qKlxuICog57yp5pS+IGdyb3VwXG4gKiBAcGFyYW0gZ3JvdXAgR3JvdXAg5a6e5L6LXG4gKiBAcGFyYW0gcG9pbnQg5ZyoeCDlkowgeSDmlrnlkJHkuIrnmoTnvKnmlL7mr5TkvotcbiAqL1xuXG5leHBvcnQgdmFyIHNjYWxlID0gZnVuY3Rpb24gc2NhbGUoZ3JvdXAsIHJhdGlvKSB7XG4gIHZhciBtYXRyaXggPSBncm91cC5nZXRNYXRyaXgoKTtcblxuICBpZiAoIW1hdHJpeCkge1xuICAgIG1hdHJpeCA9IFsxLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAxXTtcbiAgfVxuXG4gIHZhciBzY2FsZVhZID0gcmF0aW87XG5cbiAgaWYgKCFpc0FycmF5KHJhdGlvKSkge1xuICAgIHNjYWxlWFkgPSBbcmF0aW8sIHJhdGlvXTtcbiAgfVxuXG4gIGlmIChpc0FycmF5KHJhdGlvKSAmJiByYXRpby5sZW5ndGggPT09IDEpIHtcbiAgICBzY2FsZVhZID0gW3JhdGlvWzBdLCByYXRpb1swXV07XG4gIH1cblxuICBtYXRyaXggPSB0cmFuc2Zvcm0obWF0cml4LCBbWydzJywgc2NhbGVYWVswXSwgc2NhbGVYWVsxXV1dKTtcbiAgZ3JvdXAuc2V0TWF0cml4KG1hdHJpeCk7XG59O1xuLyoqXG4gKlxuICogQHBhcmFtIGdyb3VwIEdyb3VwIOWunuS+i1xuICogQHBhcmFtIHJhdGlvIOmAieaLqeinkuW6plxuICovXG5cbmV4cG9ydCB2YXIgcm90YXRlID0gZnVuY3Rpb24gcm90YXRlKGdyb3VwLCBhbmdsZSkge1xuICB2YXIgbWF0cml4ID0gZ3JvdXAuZ2V0TWF0cml4KCk7XG5cbiAgaWYgKCFtYXRyaXgpIHtcbiAgICBtYXRyaXggPSBbMSwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMV07XG4gIH1cblxuICBtYXRyaXggPSB0cmFuc2Zvcm0obWF0cml4LCBbWydyJywgYW5nbGVdXSk7XG4gIGdyb3VwLnNldE1hdHJpeChtYXRyaXgpO1xufTtcbmV4cG9ydCB2YXIgZ2V0RGVncmVlID0gZnVuY3Rpb24gZ2V0RGVncmVlKG4sIG5vZGVJZHhNYXAsIGVkZ2VzKSB7XG4gIHZhciBkZWdyZWVzID0gW107XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICBkZWdyZWVzW2ldID0gMDtcbiAgfVxuXG4gIGVkZ2VzLmZvckVhY2goZnVuY3Rpb24gKGUpIHtcbiAgICBpZiAoZS5zb3VyY2UpIHtcbiAgICAgIGRlZ3JlZXNbbm9kZUlkeE1hcFtlLnNvdXJjZV1dICs9IDE7XG4gICAgfVxuXG4gICAgaWYgKGUudGFyZ2V0KSB7XG4gICAgICBkZWdyZWVzW25vZGVJZHhNYXBbZS50YXJnZXRdXSArPSAxO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBkZWdyZWVzO1xufTsgLy8g5Yik5pat54K5UeaYr+WQpuWcqHAx5ZKMcDLnmoTnur/mrrXkuIpcblxuZnVuY3Rpb24gb25TZWdtZW50KHAxLCBwMiwgcSkge1xuICBpZiAoKHFbMF0gLSBwMVswXSkgKiAocDJbMV0gLSBwMVsxXSkgPT09IChwMlswXSAtIHAxWzBdKSAqIChxWzFdIC0gcDFbMV0pICYmIE1hdGgubWluKHAxWzBdLCBwMlswXSkgPD0gcVswXSAmJiBxWzBdIDw9IE1hdGgubWF4KHAxWzBdLCBwMlswXSkgJiYgTWF0aC5taW4ocDFbMV0sIHAyWzFdKSA8PSBxWzFdICYmIHFbMV0gPD0gTWF0aC5tYXgocDFbMV0sIHAyWzFdKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuLyoqXG4gKiDliKTmlq3ngrlQ5Zyo5aSa6L655b2i5YaFLeWwhOe6v+azlS4gQm9ycm93IGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2FudHZpcy91dGlsL2Jsb2IvbWFzdGVyL3BhY2thZ2VzL3BhdGgtdXRpbC9zcmMvcG9pbnQtaW4tcG9seWdvbi50c1xuICogQHBhcmFtIHBvaW50c1xuICogQHBhcmFtIHhcbiAqIEBwYXJhbSB5XG4gKi9cblxuXG5leHBvcnQgdmFyIGlzUG9pbnRJblBvbHlnb24gPSBmdW5jdGlvbiBpc1BvaW50SW5Qb2x5Z29uKHBvaW50cywgeCwgeSkge1xuICB2YXIgaXNIaXQgPSBmYWxzZTtcbiAgdmFyIG4gPSBwb2ludHMubGVuZ3RoOyAvLyDliKTmlq3kuKTkuKpkb3VibGXlnKhlcHPnsr7luqbkuIvnmoTlpKflsI/lhbPns7tcblxuICB2YXIgdG9sZXJhbmNlID0gMWUtNjtcblxuICBmdW5jdGlvbiBkY21wKHhWYWx1ZSkge1xuICAgIGlmIChNYXRoLmFicyh4VmFsdWUpIDwgdG9sZXJhbmNlKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICByZXR1cm4geFZhbHVlIDwgMCA/IC0xIDogMTtcbiAgfVxuXG4gIGlmIChuIDw9IDIpIHtcbiAgICAvLyBzdmcg5Lit54K55bCP5LqOIDMg5Liq5pe277yM5LiN5pi+56S677yM5Lmf5peg5rOV6KKr5ou+5Y+WXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICB2YXIgcDEgPSBwb2ludHNbaV07XG4gICAgdmFyIHAyID0gcG9pbnRzWyhpICsgMSkgJSBuXTtcblxuICAgIGlmIChvblNlZ21lbnQocDEsIHAyLCBbeCwgeV0pKSB7XG4gICAgICAvLyDngrnlnKjlpJrovrnlvaLkuIDmnaHovrnkuIpcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gLy8g5YmN5LiA5Liq5Yik5patbWluKHAxWzFdLHAyWzFdKTxQLnk8PW1heChwMVsxXSxwMlsxXSlcbiAgICAvLyDlkI7kuIDkuKrliKTmlq3ooqvmtYvngrkg5ZyoIOWwhOe6v+S4jui+ueS6pOeCuSDnmoTlt6bovrlcblxuXG4gICAgaWYgKGRjbXAocDFbMV0gLSB5KSA+IDAgIT09IGRjbXAocDJbMV0gLSB5KSA+IDAgJiYgZGNtcCh4IC0gKHkgLSBwMVsxXSkgKiAocDFbMF0gLSBwMlswXSkgLyAocDFbMV0gLSBwMlsxXSkgLSBwMVswXSkgPCAwKSB7XG4gICAgICBpc0hpdCA9ICFpc0hpdDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaXNIaXQ7XG59OyAvLyDliKTmlq3kuKTkuKpCQm945piv5ZCm55u45LqkXG5cbmV4cG9ydCB2YXIgaW50ZXJzZWN0QkJveCA9IGZ1bmN0aW9uIGludGVyc2VjdEJCb3goYm94MSwgYm94Mikge1xuICByZXR1cm4gIShib3gyLm1pblggPiBib3gxLm1heFggfHwgYm94Mi5tYXhYIDwgYm94MS5taW5YIHx8IGJveDIubWluWSA+IGJveDEubWF4WSB8fCBib3gyLm1heFkgPCBib3gxLm1pblkpO1xufTtcblxudmFyIGxpbmVJbnRlcnNlY3RQb2x5Z29uID0gZnVuY3Rpb24gbGluZUludGVyc2VjdFBvbHlnb24obGluZXMsIGxpbmUpIHtcbiAgdmFyIGlzSW50ZXJzZWN0ID0gZmFsc2U7XG4gIGVhY2gobGluZXMsIGZ1bmN0aW9uIChsKSB7XG4gICAgaWYgKGdldExpbmVJbnRlcnNlY3QobC5mcm9tLCBsLnRvLCBsaW5lLmZyb20sIGxpbmUudG8pKSB7XG4gICAgICBpc0ludGVyc2VjdCA9IHRydWU7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGlzSW50ZXJzZWN0O1xufTtcbi8qKlxuICog5Yik5pat5Lik5LiqcG9seWdvbuaYr+WQpuebuOS6pOOAglxuICogYm9ycm93IGZyb20gQGFudHYvcGF0aC11dGlsXG4gKiBAcGFyYW0gcG9pbnRzMSBwb2x5Z29uMeeahOmhtueCueaVsOe7hFxuICogQHBhcmFtIHBvaW50czIgcG9seWdvbjLnmoTpobbngrnmlbDnu4RcbiAqL1xuXG5cbmV4cG9ydCB2YXIgaXNQb2x5Z29uc0ludGVyc2VjdCA9IGZ1bmN0aW9uIGlzUG9seWdvbnNJbnRlcnNlY3QocG9pbnRzMSwgcG9pbnRzMikge1xuICB2YXIgZ2V0QkJveCA9IGZ1bmN0aW9uIGdldEJCb3gocG9pbnRzKSB7XG4gICAgdmFyIHhBcnIgPSBwb2ludHMubWFwKGZ1bmN0aW9uIChwKSB7XG4gICAgICByZXR1cm4gcFswXTtcbiAgICB9KTtcbiAgICB2YXIgeUFyciA9IHBvaW50cy5tYXAoZnVuY3Rpb24gKHApIHtcbiAgICAgIHJldHVybiBwWzFdO1xuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICBtaW5YOiBNYXRoLm1pbi5hcHBseShudWxsLCB4QXJyKSxcbiAgICAgIG1heFg6IE1hdGgubWF4LmFwcGx5KG51bGwsIHhBcnIpLFxuICAgICAgbWluWTogTWF0aC5taW4uYXBwbHkobnVsbCwgeUFyciksXG4gICAgICBtYXhZOiBNYXRoLm1heC5hcHBseShudWxsLCB5QXJyKVxuICAgIH07XG4gIH07XG5cbiAgdmFyIHBhcnNlVG9MaW5lcyA9IGZ1bmN0aW9uIHBhcnNlVG9MaW5lcyhwb2ludHMpIHtcbiAgICB2YXIgbGluZXMgPSBbXTtcbiAgICB2YXIgY291bnQgPSBwb2ludHMubGVuZ3RoO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb3VudCAtIDE7IGkrKykge1xuICAgICAgdmFyIHBvaW50ID0gcG9pbnRzW2ldO1xuICAgICAgdmFyIG5leHQgPSBwb2ludHNbaSArIDFdO1xuICAgICAgbGluZXMucHVzaCh7XG4gICAgICAgIGZyb206IHtcbiAgICAgICAgICB4OiBwb2ludFswXSxcbiAgICAgICAgICB5OiBwb2ludFsxXVxuICAgICAgICB9LFxuICAgICAgICB0bzoge1xuICAgICAgICAgIHg6IG5leHRbMF0sXG4gICAgICAgICAgeTogbmV4dFsxXVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAobGluZXMubGVuZ3RoID4gMSkge1xuICAgICAgdmFyIGZpcnN0ID0gcG9pbnRzWzBdO1xuICAgICAgdmFyIGxhc3QgPSBwb2ludHNbY291bnQgLSAxXTtcbiAgICAgIGxpbmVzLnB1c2goe1xuICAgICAgICBmcm9tOiB7XG4gICAgICAgICAgeDogbGFzdFswXSxcbiAgICAgICAgICB5OiBsYXN0WzFdXG4gICAgICAgIH0sXG4gICAgICAgIHRvOiB7XG4gICAgICAgICAgeDogZmlyc3RbMF0sXG4gICAgICAgICAgeTogZmlyc3RbMV1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpbmVzO1xuICB9OyAvLyDnqbrmlbDnu4TvvIzmiJbogIXkuIDkuKrngrnov5Tlm54gZmFsc2VcblxuXG4gIGlmIChwb2ludHMxLmxlbmd0aCA8IDIgfHwgcG9pbnRzMi5sZW5ndGggPCAyKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIGJib3gxID0gZ2V0QkJveChwb2ludHMxKTtcbiAgdmFyIGJib3gyID0gZ2V0QkJveChwb2ludHMyKTsgLy8g5Yik5a6a5YyF5Zu055uS5piv5ZCm55u45Lqk77yM5q+U5Yik5a6a54K55piv5ZCm5Zyo5aSa6L655b2i5YaF6KaB5b+r55qE5aSa77yM5Y+v5Lul562b6YCJ5o6J5aSn5aSa5pWw5oOF5Ya1XG5cbiAgaWYgKCFpbnRlcnNlY3RCQm94KGJib3gxLCBiYm94MikpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgaXNJbiA9IGZhbHNlOyAvLyDliKTlrprngrnmmK/lkKblnKjlpJrovrnlvaLlhoXpg6jvvIzkuIDml6bmnInkuIDkuKrngrnlnKjlj6bkuIDkuKrlpJrovrnlvaLlhoXvvIzliJnov5Tlm55cblxuICBlYWNoKHBvaW50czIsIGZ1bmN0aW9uIChwb2ludCkge1xuICAgIGlmIChpc1BvaW50SW5Qb2x5Z29uKHBvaW50czEsIHBvaW50WzBdLCBwb2ludFsxXSkpIHtcbiAgICAgIGlzSW4gPSB0cnVlO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSk7XG5cbiAgaWYgKGlzSW4pIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGVhY2gocG9pbnRzMSwgZnVuY3Rpb24gKHBvaW50KSB7XG4gICAgaWYgKGlzUG9pbnRJblBvbHlnb24ocG9pbnRzMiwgcG9pbnRbMF0sIHBvaW50WzFdKSkge1xuICAgICAgaXNJbiA9IHRydWU7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9KTtcblxuICBpZiAoaXNJbikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgdmFyIGxpbmVzMSA9IHBhcnNlVG9MaW5lcyhwb2ludHMxKTtcbiAgdmFyIGxpbmVzMiA9IHBhcnNlVG9MaW5lcyhwb2ludHMyKTtcbiAgdmFyIGlzSW50ZXJzZWN0ID0gZmFsc2U7XG4gIGVhY2gobGluZXMyLCBmdW5jdGlvbiAobGluZSkge1xuICAgIGlmIChsaW5lSW50ZXJzZWN0UG9seWdvbihsaW5lczEsIGxpbmUpKSB7XG4gICAgICBpc0ludGVyc2VjdCA9IHRydWU7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGlzSW50ZXJzZWN0O1xufTtcblxudmFyIExpbmUgPVxuLyoqIEBjbGFzcyAqL1xuZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBMaW5lKHgxLCB5MSwgeDIsIHkyKSB7XG4gICAgdGhpcy54MSA9IHgxO1xuICAgIHRoaXMueTEgPSB5MTtcbiAgICB0aGlzLngyID0geDI7XG4gICAgdGhpcy55MiA9IHkyO1xuICB9XG5cbiAgTGluZS5wcm90b3R5cGUuZ2V0QkJveCA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgbWluWCA9IE1hdGgubWluKHRoaXMueDEsIHRoaXMueDIpO1xuICAgIHZhciBtaW5ZID0gTWF0aC5taW4odGhpcy55MSwgdGhpcy55Mik7XG4gICAgdmFyIG1heFggPSBNYXRoLm1heCh0aGlzLngxLCB0aGlzLngyKTtcbiAgICB2YXIgbWF4WSA9IE1hdGgubWF4KHRoaXMueTEsIHRoaXMueTIpO1xuICAgIHZhciByZXMgPSB7XG4gICAgICB4OiBtaW5YLFxuICAgICAgeTogbWluWSxcbiAgICAgIG1pblg6IG1pblgsXG4gICAgICBtaW5ZOiBtaW5ZLFxuICAgICAgbWF4WDogbWF4WCxcbiAgICAgIG1heFk6IG1heFksXG4gICAgICB3aWR0aDogbWF4WCAtIG1pblgsXG4gICAgICBoZWlnaHQ6IG1heFkgLSBtaW5ZXG4gICAgfTtcbiAgICByZXR1cm4gcmVzO1xuICB9O1xuXG4gIHJldHVybiBMaW5lO1xufSgpO1xuXG5leHBvcnQgeyBMaW5lIH07XG5leHBvcnQgdmFyIGdldEJCb3hCb3VuZExpbmUgPSBmdW5jdGlvbiBnZXRCQm94Qm91bmRMaW5lKGJib3gsIGRpcmVjdGlvbikge1xuICB2YXIgYm91bmRzID0ge1xuICAgIHRvcDogW2Jib3gubWluWCwgYmJveC5taW5ZLCBiYm94Lm1heFgsIGJib3gubWluWV0sXG4gICAgbGVmdDogW2Jib3gubWluWCwgYmJveC5taW5ZLCBiYm94Lm1pblgsIGJib3gubWF4WV0sXG4gICAgYm90dG9tOiBbYmJveC5taW5YLCBiYm94Lm1heFksIGJib3gubWF4WCwgYmJveC5tYXhZXSxcbiAgICByaWdodDogW2Jib3gubWF4WCwgYmJveC5taW5ZLCBiYm94Lm1heFgsIGJib3gubWF4WV1cbiAgfTtcbiAgcmV0dXJuIGJvdW5kc1tkaXJlY3Rpb25dO1xufTtcbi8qKlxuICog6K6h566X5Lik5p2h57q/5q6155u45Lqk5pe277yM55u45Lqk54K55a+556ys5LiA5p2h57q/5q615LiK55qE5YiG5Ymy5q+U5L6LXG4gKi9cblxudmFyIGZyYWN0aW9uQWxvbmdMaW5lQSA9IGZ1bmN0aW9uIGZyYWN0aW9uQWxvbmdMaW5lQShsYSwgbGIpIHtcbiAgdmFyIHVhVCA9IChsYi54MiAtIGxiLngxKSAqIChsYS55MSAtIGxiLnkxKSAtIChsYi55MiAtIGxiLnkxKSAqIChsYS54MSAtIGxiLngxKTtcbiAgdmFyIHViVCA9IChsYS54MiAtIGxhLngxKSAqIChsYS55MSAtIGxiLnkxKSAtIChsYS55MiAtIGxhLnkxKSAqIChsYS54MSAtIGxiLngxKTtcbiAgdmFyIHVCID0gKGxiLnkyIC0gbGIueTEpICogKGxhLngyIC0gbGEueDEpIC0gKGxiLngyIC0gbGIueDEpICogKGxhLnkyIC0gbGEueTEpO1xuXG4gIGlmICh1Qikge1xuICAgIHZhciB1YSA9IHVhVCAvIHVCO1xuICAgIHZhciB1YiA9IHViVCAvIHVCO1xuXG4gICAgaWYgKHVhID49IDAgJiYgdWEgPD0gMSAmJiB1YiA+PSAwICYmIHViIDw9IDEpIHtcbiAgICAgIHJldHVybiB1YTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1xufTtcblxuZXhwb3J0IHZhciBpdGVtSW50ZXJzZWN0QnlMaW5lID0gZnVuY3Rpb24gaXRlbUludGVyc2VjdEJ5TGluZShpdGVtLCBsaW5lKSB7XG4gIHZhciBkaXJlY3Rpb25zID0gWyd0b3AnLCAnbGVmdCcsICdib3R0b20nLCAncmlnaHQnXTtcbiAgdmFyIGJib3ggPSBpdGVtLmdldEJCb3goKTtcbiAgdmFyIGNvdW50SW50ZXJzZWN0aW9ucyA9IDA7XG4gIHZhciBpbnRlcnNlY3Rpb25zID0gW107XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCA0OyBpKyspIHtcbiAgICB2YXIgX2EgPSBnZXRCQm94Qm91bmRMaW5lKGJib3gsIGRpcmVjdGlvbnNbaV0pLFxuICAgICAgICB4MSA9IF9hWzBdLFxuICAgICAgICB5MSA9IF9hWzFdLFxuICAgICAgICB4MiA9IF9hWzJdLFxuICAgICAgICB5MiA9IF9hWzNdO1xuXG4gICAgaW50ZXJzZWN0aW9uc1tpXSA9IGdldExpbmVJbnRlcnNlY3Qoe1xuICAgICAgeDogbGluZS54MSxcbiAgICAgIHk6IGxpbmUueTFcbiAgICB9LCB7XG4gICAgICB4OiBsaW5lLngyLFxuICAgICAgeTogbGluZS55MlxuICAgIH0sIHtcbiAgICAgIHg6IHgxLFxuICAgICAgeTogeTFcbiAgICB9LCB7XG4gICAgICB4OiB4MixcbiAgICAgIHk6IHkyXG4gICAgfSk7XG5cbiAgICBpZiAoaW50ZXJzZWN0aW9uc1tpXSkge1xuICAgICAgY291bnRJbnRlcnNlY3Rpb25zICs9IDE7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIFtpbnRlcnNlY3Rpb25zLCBjb3VudEludGVyc2VjdGlvbnNdO1xufTtcbmV4cG9ydCB2YXIgZnJhY3Rpb25Ub0xpbmUgPSBmdW5jdGlvbiBmcmFjdGlvblRvTGluZShpdGVtLCBsaW5lKSB7XG4gIHZhciBkaXJlY3Rpb25zID0gWyd0b3AnLCAnbGVmdCcsICdib3R0b20nLCAncmlnaHQnXTtcbiAgdmFyIGJib3ggPSBpdGVtLmdldEJCb3goKTtcbiAgdmFyIG1pbkRpc3RhbmNlID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1xuICB2YXIgY291bnRJbnRlcnNlY3Rpb25zID0gMDtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IDQ7IGkrKykge1xuICAgIHZhciBfYSA9IGdldEJCb3hCb3VuZExpbmUoYmJveCwgZGlyZWN0aW9uc1tpXSksXG4gICAgICAgIHgxID0gX2FbMF0sXG4gICAgICAgIHkxID0gX2FbMV0sXG4gICAgICAgIHgyID0gX2FbMl0sXG4gICAgICAgIHkyID0gX2FbM107XG5cbiAgICB2YXIgdGVzdERpc3RhbmNlID0gZnJhY3Rpb25BbG9uZ0xpbmVBKGxpbmUsIG5ldyBMaW5lKHgxLCB5MSwgeDIsIHkyKSk7XG4gICAgdGVzdERpc3RhbmNlID0gTWF0aC5hYnModGVzdERpc3RhbmNlIC0gMC41KTtcblxuICAgIGlmICh0ZXN0RGlzdGFuY2UgPj0gMCAmJiB0ZXN0RGlzdGFuY2UgPD0gMSkge1xuICAgICAgY291bnRJbnRlcnNlY3Rpb25zICs9IDE7XG4gICAgICBtaW5EaXN0YW5jZSA9IHRlc3REaXN0YW5jZSA8IG1pbkRpc3RhbmNlID8gdGVzdERpc3RhbmNlIDogbWluRGlzdGFuY2U7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvdW50SW50ZXJzZWN0aW9ucyA9PT0gMCkgcmV0dXJuIC0xO1xuICByZXR1cm4gbWluRGlzdGFuY2U7XG59O1xuZXhwb3J0IHZhciBnZXRQb2ludHNDZW50ZXIgPSBmdW5jdGlvbiBnZXRQb2ludHNDZW50ZXIocG9pbnRzKSB7XG4gIHZhciBjZW50ZXJYID0gMDtcbiAgdmFyIGNlbnRlclkgPSAwO1xuXG4gIGlmIChwb2ludHMubGVuZ3RoID4gMCkge1xuICAgIGZvciAodmFyIF9pID0gMCwgcG9pbnRzXzEgPSBwb2ludHM7IF9pIDwgcG9pbnRzXzEubGVuZ3RoOyBfaSsrKSB7XG4gICAgICB2YXIgcG9pbnQgPSBwb2ludHNfMVtfaV07XG4gICAgICBjZW50ZXJYICs9IHBvaW50Lng7XG4gICAgICBjZW50ZXJZICs9IHBvaW50Lnk7XG4gICAgfVxuXG4gICAgY2VudGVyWCAvPSBwb2ludHMubGVuZ3RoO1xuICAgIGNlbnRlclkgLz0gcG9pbnRzLmxlbmd0aDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgeDogY2VudGVyWCxcbiAgICB5OiBjZW50ZXJZXG4gIH07XG59O1xuZXhwb3J0IHZhciBzcXVhcmVEaXN0ID0gZnVuY3Rpb24gc3F1YXJlRGlzdChhLCBiKSB7XG4gIHJldHVybiBNYXRoLnBvdyhhLnggLSBiLngsIDIpICsgTWF0aC5wb3coYS55IC0gYi55LCAyKTtcbn07XG5leHBvcnQgdmFyIHBvaW50TGluZVNxdWFyZURpc3QgPSBmdW5jdGlvbiBwb2ludExpbmVTcXVhcmVEaXN0KHBvaW50LCBsaW5lKSB7XG4gIHZhciB4MSA9IGxpbmUueDE7XG4gIHZhciB5MSA9IGxpbmUueTE7XG4gIHZhciB4MiA9IGxpbmUueDIgLSB4MTtcbiAgdmFyIHkyID0gbGluZS55MiAtIHkxO1xuICB2YXIgcHggPSBwb2ludC54IC0geDE7XG4gIHZhciBweSA9IHBvaW50LnkgLSB5MTtcbiAgdmFyIGRvdHByb2QgPSBweCAqIHgyICsgcHkgKiB5MjtcbiAgdmFyIHByb2psZW5TcTtcblxuICBpZiAoZG90cHJvZCA8PSAwKSB7XG4gICAgcHJvamxlblNxID0gMDtcbiAgfSBlbHNlIHtcbiAgICBweCA9IHgyIC0gcHg7XG4gICAgcHkgPSB5MiAtIHB5O1xuICAgIGRvdHByb2QgPSBweCAqIHgyICsgcHkgKiB5MjtcblxuICAgIGlmIChkb3Rwcm9kIDw9IDApIHtcbiAgICAgIHByb2psZW5TcSA9IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb2psZW5TcSA9IGRvdHByb2QgKiBkb3Rwcm9kIC8gKHgyICogeDIgKyB5MiAqIHkyKTtcbiAgICB9XG4gIH1cblxuICB2YXIgbGVuU3EgPSBweCAqIHB4ICsgcHkgKiBweSAtIHByb2psZW5TcTtcblxuICBpZiAobGVuU3EgPCAwKSB7XG4gICAgbGVuU3EgPSAwO1xuICB9XG5cbiAgcmV0dXJuIGxlblNxO1xufTtcbmV4cG9ydCB2YXIgaXNQb2ludHNPdmVybGFwID0gZnVuY3Rpb24gaXNQb2ludHNPdmVybGFwKHAxLCBwMiwgZSkge1xuICBpZiAoZSA9PT0gdm9pZCAwKSB7XG4gICAgZSA9IDFlLTM7XG4gIH1cblxuICByZXR1cm4gTWF0aC5wb3cocDEueCAtIHAyLngsIDIpICsgTWF0aC5wb3cocDEueSAtIHAyLnksIDIpIDwgTWF0aC5wb3coZSwgMik7XG59O1xuLyoqXG4gKiDngrnliLDnn6nlvaLnmoTot53nprvnmoTlubPmlrnvvJrnn6nlvaLlhoXpg6jngrnop4bkvZzot53nprvkuLow77yM5aSW6YOo55qE54K56Iul5oqV5b2x6JC95Zyo55+p5b2i6L655LiK5YiZ5Li654K55Yiw55+p5b2i6L6555qE5pyA6L+R55qE5Z6C55u06Led56a777yM5ZCm5YiZ5Li654K55Yiw55+p5b2i6aG254K555qE6Led56a777yMXG4gKiBAcGFyYW0gcG9pbnQgSVBvaW50XG4gKiBAcGFyYW0gcmVjdCBJUmVjdFxuICovXG5cbmV4cG9ydCB2YXIgcG9pbnRSZWN0U3F1YXJlRGlzdCA9IGZ1bmN0aW9uIHBvaW50UmVjdFNxdWFyZURpc3QocG9pbnQsIHJlY3QpIHtcbiAgdmFyIGlzTGVmdCA9IHBvaW50LnggPCByZWN0Lng7XG4gIHZhciBpc1JpZ2h0ID0gcG9pbnQueCA+IHJlY3QueCArIHJlY3Qud2lkdGg7XG4gIHZhciBpc1RvcCA9IHBvaW50LnkgPiByZWN0LnkgKyByZWN0LmhlaWdodDtcbiAgdmFyIGlzQm90dG9tID0gcG9pbnQueSA8IHJlY3QueTtcbiAgdmFyIGlzUG9pbnRPdXRzaWRlID0gaXNMZWZ0IHx8IGlzUmlnaHQgfHwgaXNUb3AgfHwgaXNCb3R0b207XG5cbiAgaWYgKCFpc1BvaW50T3V0c2lkZSkge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgaWYgKGlzVG9wICYmICFpc0xlZnQgJiYgIWlzUmlnaHQpIHtcbiAgICByZXR1cm4gTWF0aC5wb3cocmVjdC55ICsgcmVjdC5oZWlnaHQgLSBwb2ludC55LCAyKTtcbiAgfVxuXG4gIGlmIChpc0JvdHRvbSAmJiAhaXNMZWZ0ICYmICFpc1JpZ2h0KSB7XG4gICAgcmV0dXJuIE1hdGgucG93KHBvaW50LnkgLSByZWN0LnksIDIpO1xuICB9XG5cbiAgaWYgKGlzTGVmdCAmJiAhaXNUb3AgJiYgIWlzQm90dG9tKSB7XG4gICAgcmV0dXJuIE1hdGgucG93KHJlY3QueCAtIHBvaW50LngsIDIpO1xuICB9XG5cbiAgaWYgKGlzUmlnaHQgJiYgIWlzVG9wICYmICFpc0JvdHRvbSkge1xuICAgIHJldHVybiBNYXRoLnBvdyhyZWN0LnggKyByZWN0LndpZHRoIC0gcG9pbnQueCwgMik7XG4gIH1cblxuICB2YXIgZHggPSBNYXRoLm1pbihNYXRoLmFicyhyZWN0LnggLSBwb2ludC54KSwgTWF0aC5hYnMocmVjdC54ICsgcmVjdC53aWR0aCAtIHBvaW50LngpKTtcbiAgdmFyIGR5ID0gTWF0aC5taW4oTWF0aC5hYnMocmVjdC55IC0gcG9pbnQueSksIE1hdGguYWJzKHJlY3QueSArIHJlY3QuaGVpZ2h0IC0gcG9pbnQueSkpO1xuICByZXR1cm4gZHggKiBkeCArIGR5ICogZHk7XG59O1xuLyoqXG4gKiBwb2ludCB0byBsaW5lIGRpc3RhbmNlXG4gKiBAcGFyYW0gIHthcnJheX0gbGluZSDnur/nmoTlm5vkuKrpobbngrkgW3gxLCB5MSwgeDIsIHkyXVxuICogQHBhcmFtICB7b2JqZWN0fSBwb2ludCDlnZDmoIfngrkge3gsIHl9XG4gKiBAcmV0dXJuIHtOdW1iZXJ8TmFOfSBkaXN0YW5jZVxuICovXG5cbmV4cG9ydCB2YXIgcG9pbnRMaW5lRGlzdGFuY2UgPSBmdW5jdGlvbiBwb2ludExpbmVEaXN0YW5jZShsaW5lLCBwb2ludCkge1xuICB2YXIgeDEgPSBsaW5lWzBdLFxuICAgICAgeTEgPSBsaW5lWzFdLFxuICAgICAgeDIgPSBsaW5lWzJdLFxuICAgICAgeTIgPSBsaW5lWzNdO1xuICB2YXIgeCA9IHBvaW50LngsXG4gICAgICB5ID0gcG9pbnQueTtcbiAgdmFyIGQgPSBbeDIgLSB4MSwgeTIgLSB5MV07XG5cbiAgaWYgKHZlYzIuZXhhY3RFcXVhbHMoZCwgWzAsIDBdKSkge1xuICAgIHJldHVybiBOYU47XG4gIH1cblxuICB2YXIgdSA9IFstZFsxXSwgZFswXV07IC8vIEB0cy1pZ25vcmVcblxuICB2ZWMyLm5vcm1hbGl6ZSh1LCB1KTtcbiAgdmFyIGEgPSBbeCAtIHgxLCB5IC0geTFdOyAvLyBAdHMtaWdub3JlXG5cbiAgcmV0dXJuIE1hdGguYWJzKHZlYzIuZG90KGEsIHUpKTtcbn07XG4vKipcbiAqIExpbmVhcmx5IGludGVycG9sYXRlIGJldHdlZW4gc3RhcnQgYW5kIGVuZCwgd2hlcmUgYWxwaGEgaXMgdGhlIHBlcmNlbnQgZGlzdGFuY2UgYWxvbmcgdGhlIGxpbmUuXG4gKiBhbHBoYSA9IDAgd2lsbCBiZSBzdGFydCwgYW5kIGFscGhhID0gMSB3aWxsIGJlIGVuZC5cbiAqIEBwYXJhbSB7TnVtYmVyfSBzdGFydFxuICogQHBhcmFtIHtOdW1iZXJ9IGVuZFxuICogQHBhcmFtIHtOdW1iZXJ9IGFscGhhIGludGVycG9sYXRpb24gZmFjdG9yLCB0eXBpY2FsbHkgaW4gdGhlIGNsb3NlZCBpbnRlcnZhbCBbMCwgMV1cbiAqIEByZXR1cm5zXG4gKi9cblxuZXhwb3J0IHZhciBsZXJwID0gZnVuY3Rpb24gbGVycChzdGFydCwgZW5kLCBhbHBoYSkge1xuICByZXR1cm4gc3RhcnQgKyAoZW5kIC0gc3RhcnQpICogYWxwaGE7XG59OyIsInZhciBzdWJqZWN0Q29sb3IgPSAncmdiKDk1LCAxNDksIDI1NSknO1xudmFyIGJhY2tDb2xvciA9ICdyZ2IoMjU1LCAyNTUsIDI1NSknO1xudmFyIHRleHRDb2xvciA9ICdyZ2IoMCwgMCwgMCknO1xudmFyIGFjdGl2ZUZpbGwgPSAncmdiKDI0NywgMjUwLCAyNTUpJztcbnZhciBub2RlTWFpbkZpbGwgPSAncmdiKDIzOSwgMjQ0LCAyNTUpJztcbnZhciBjb21ib0ZpbGwgPSAncmdiKDI1MywgMjUzLCAyNTMpJztcbnZhciBkaXNhYmxlZEZpbGwgPSAncmdiKDI1MCwgMjUwLCAyNTApJztcbnZhciBlZGdlTWFpblN0cm9rZSA9ICdyZ2IoMjI0LCAyMjQsIDIyNCknO1xudmFyIGVkZ2VJbmFjdGl2ZVN0cm9rZSA9ICdyZ2IoMjM0LCAyMzQsIDIzNCknO1xudmFyIGVkZ2VEaXNhYmxlc1N0cm9rZSA9ICdyZ2IoMjQ1LCAyNDUsIDI0NSknO1xudmFyIGluYWN0aXZlU3Ryb2tlID0gJ3JnYigxOTEsIDIxMywgMjU1KSc7XG52YXIgaGlnaGxpZ2h0U3Ryb2tlID0gJyM0NTcyZDknO1xudmFyIGhpZ2hsaWdodEZpbGwgPSAncmdiKDIyMywgMjM0LCAyNTUpJztcbnZhciBjb2xvclNldCA9IHtcbiAgLy8gZm9yIG5vZGVzXG4gIG1haW5TdHJva2U6IHN1YmplY3RDb2xvcixcbiAgbWFpbkZpbGw6IG5vZGVNYWluRmlsbCxcbiAgYWN0aXZlU3Ryb2tlOiBzdWJqZWN0Q29sb3IsXG4gIGFjdGl2ZUZpbGw6IGFjdGl2ZUZpbGwsXG4gIGluYWN0aXZlU3Ryb2tlOiBpbmFjdGl2ZVN0cm9rZSxcbiAgaW5hY3RpdmVGaWxsOiBhY3RpdmVGaWxsLFxuICBzZWxlY3RlZFN0cm9rZTogc3ViamVjdENvbG9yLFxuICBzZWxlY3RlZEZpbGw6IGJhY2tDb2xvcixcbiAgaGlnaGxpZ2h0U3Ryb2tlOiBoaWdobGlnaHRTdHJva2UsXG4gIGhpZ2hsaWdodEZpbGw6IGhpZ2hsaWdodEZpbGwsXG4gIGRpc2FibGVTdHJva2U6IGVkZ2VNYWluU3Ryb2tlLFxuICBkaXNhYmxlRmlsbDogZGlzYWJsZWRGaWxsLFxuICAvLyBmb3IgZWRnZXNcbiAgZWRnZU1haW5TdHJva2U6IGVkZ2VNYWluU3Ryb2tlLFxuICBlZGdlQWN0aXZlU3Ryb2tlOiBzdWJqZWN0Q29sb3IsXG4gIGVkZ2VJbmFjdGl2ZVN0cm9rZTogZWRnZUluYWN0aXZlU3Ryb2tlLFxuICBlZGdlU2VsZWN0ZWRTdHJva2U6IHN1YmplY3RDb2xvcixcbiAgZWRnZUhpZ2hsaWdodFN0cm9rZTogc3ViamVjdENvbG9yLFxuICBlZGdlRGlzYWJsZVN0cm9rZTogZWRnZURpc2FibGVzU3Ryb2tlLFxuICAvLyBmb3IgY29tYm9zXG4gIGNvbWJvTWFpblN0cm9rZTogZWRnZU1haW5TdHJva2UsXG4gIGNvbWJvTWFpbkZpbGw6IGNvbWJvRmlsbCxcbiAgY29tYm9BY3RpdmVTdHJva2U6IHN1YmplY3RDb2xvcixcbiAgY29tYm9BY3RpdmVGaWxsOiBhY3RpdmVGaWxsLFxuICBjb21ib0luYWN0aXZlU3Ryb2tlOiBlZGdlTWFpblN0cm9rZSxcbiAgY29tYm9JbmFjdGl2ZUZpbGw6IGNvbWJvRmlsbCxcbiAgY29tYm9TZWxlY3RlZFN0cm9rZTogc3ViamVjdENvbG9yLFxuICBjb21ib1NlbGVjdGVkRmlsbDogY29tYm9GaWxsLFxuICBjb21ib0hpZ2hsaWdodFN0cm9rZTogaGlnaGxpZ2h0U3Ryb2tlLFxuICBjb21ib0hpZ2hsaWdodEZpbGw6IGNvbWJvRmlsbCxcbiAgY29tYm9EaXNhYmxlU3Ryb2tlOiBlZGdlSW5hY3RpdmVTdHJva2UsXG4gIGNvbWJvRGlzYWJsZUZpbGw6IGRpc2FibGVkRmlsbFxufTtcbmV4cG9ydCBkZWZhdWx0IHtcbiAgdmVyc2lvbjogJzAuNC4xJyxcbiAgcm9vdENvbnRhaW5lckNsYXNzTmFtZTogJ3Jvb3QtY29udGFpbmVyJyxcbiAgbm9kZUNvbnRhaW5lckNsYXNzTmFtZTogJ25vZGUtY29udGFpbmVyJyxcbiAgZWRnZUNvbnRhaW5lckNsYXNzTmFtZTogJ2VkZ2UtY29udGFpbmVyJyxcbiAgY29tYm9Db250YWluZXJDbGFzc05hbWU6ICdjb21iby1jb250YWluZXInLFxuICBkZWxlZ2F0ZUNvbnRhaW5lckNsYXNzTmFtZTogJ2RlbGVnYXRlLWNvbnRhaW5lcicsXG4gIGRlZmF1bHRMb29wUG9zaXRpb246ICd0b3AnLFxuICBub2RlTGFiZWw6IHtcbiAgICBzdHlsZToge1xuICAgICAgZmlsbDogJyMwMDAnLFxuICAgICAgZm9udFNpemU6IDEyLFxuICAgICAgdGV4dEFsaWduOiAnY2VudGVyJyxcbiAgICAgIHRleHRCYXNlbGluZTogJ21pZGRsZSdcbiAgICB9LFxuICAgIG9mZnNldDogNCAvLyDoioLngrnnmoTpu5jorqTmlofmnKzkuI3lsYXkuK3ml7bnmoTlgY/np7vph49cblxuICB9LFxuICBkZWZhdWx0Tm9kZToge1xuICAgIHR5cGU6ICdjaXJjbGUnLFxuICAgIHN0eWxlOiB7XG4gICAgICBsaW5lV2lkdGg6IDEsXG4gICAgICBzdHJva2U6IGNvbG9yU2V0Lm1haW5TdHJva2UsXG4gICAgICBmaWxsOiBub2RlTWFpbkZpbGxcbiAgICB9LFxuICAgIHNpemU6IDIwLFxuICAgIGNvbG9yOiBjb2xvclNldC5tYWluU3Ryb2tlLFxuICAgIGxpbmtQb2ludHM6IHtcbiAgICAgIHNpemU6IDgsXG4gICAgICBsaW5lV2lkdGg6IDEsXG4gICAgICBmaWxsOiBjb2xvclNldC5hY3RpdmVGaWxsLFxuICAgICAgc3Ryb2tlOiBjb2xvclNldC5hY3RpdmVTdHJva2VcbiAgICB9XG4gIH0sXG4gIC8vIOiKgueCueW6lOeUqOeKtuaAgeWQjueahOagt+W8j++8jOm7mOiupOS7heaPkOS+myBhY3RpdmXjgIFzZWxlY3RlZOOAgWhpZ2hsaWdodOOAgWluYWN0aXZl44CBZGlzYWJsZe+8jOeUqOaIt+WPr+S7peiHquW3seaJqeWxlVxuICBub2RlU3RhdGVTdHlsZXM6IHtcbiAgICBhY3RpdmU6IHtcbiAgICAgIGZpbGw6IGNvbG9yU2V0LmFjdGl2ZUZpbGwsXG4gICAgICBzdHJva2U6IGNvbG9yU2V0LmFjdGl2ZVN0cm9rZSxcbiAgICAgIGxpbmVXaWR0aDogMixcbiAgICAgIHNoYWRvd0NvbG9yOiBjb2xvclNldC5tYWluU3Ryb2tlLFxuICAgICAgc2hhZG93Qmx1cjogMTBcbiAgICB9LFxuICAgIHNlbGVjdGVkOiB7XG4gICAgICBmaWxsOiBjb2xvclNldC5zZWxlY3RlZEZpbGwsXG4gICAgICBzdHJva2U6IGNvbG9yU2V0LnNlbGVjdGVkU3Ryb2tlLFxuICAgICAgbGluZVdpZHRoOiA0LFxuICAgICAgc2hhZG93Q29sb3I6IGNvbG9yU2V0LnNlbGVjdGVkU3Ryb2tlLFxuICAgICAgc2hhZG93Qmx1cjogMTAsXG4gICAgICAndGV4dC1zaGFwZSc6IHtcbiAgICAgICAgZm9udFdlaWdodDogNTAwXG4gICAgICB9XG4gICAgfSxcbiAgICBoaWdobGlnaHQ6IHtcbiAgICAgIGZpbGw6IGNvbG9yU2V0LmhpZ2hsaWdodEZpbGwsXG4gICAgICBzdHJva2U6IGNvbG9yU2V0LmhpZ2hsaWdodFN0cm9rZSxcbiAgICAgIGxpbmVXaWR0aDogMixcbiAgICAgICd0ZXh0LXNoYXBlJzoge1xuICAgICAgICBmb250V2VpZ2h0OiA1MDBcbiAgICAgIH1cbiAgICB9LFxuICAgIGluYWN0aXZlOiB7XG4gICAgICBmaWxsOiBjb2xvclNldC5pbmFjdGl2ZUZpbGwsXG4gICAgICBzdHJva2U6IGNvbG9yU2V0LmluYWN0aXZlU3Ryb2tlLFxuICAgICAgbGluZVdpZHRoOiAxXG4gICAgfSxcbiAgICBkaXNhYmxlOiB7XG4gICAgICBmaWxsOiBjb2xvclNldC5kaXNhYmxlRmlsbCxcbiAgICAgIHN0cm9rZTogY29sb3JTZXQuZGlzYWJsZVN0cm9rZSxcbiAgICAgIGxpbmVXaWR0aDogMVxuICAgIH1cbiAgfSxcbiAgZWRnZUxhYmVsOiB7XG4gICAgc3R5bGU6IHtcbiAgICAgIGZpbGw6IHRleHRDb2xvcixcbiAgICAgIHRleHRBbGlnbjogJ2NlbnRlcicsXG4gICAgICB0ZXh0QmFzZWxpbmU6ICdtaWRkbGUnLFxuICAgICAgZm9udFNpemU6IDEyXG4gICAgfVxuICB9LFxuICBkZWZhdWx0RWRnZToge1xuICAgIHR5cGU6ICdsaW5lJyxcbiAgICBzaXplOiAxLFxuICAgIHN0eWxlOiB7XG4gICAgICBzdHJva2U6IGNvbG9yU2V0LmVkZ2VNYWluU3Ryb2tlLFxuICAgICAgbGluZUFwcGVuZFdpZHRoOiAyXG4gICAgfSxcbiAgICBjb2xvcjogY29sb3JTZXQuZWRnZU1haW5TdHJva2VcbiAgfSxcbiAgLy8g6L655bqU55So54q25oCB5ZCO55qE5qC35byP77yM6buY6K6k5LuF5o+Q5L6bIGFjdGl2ZeOAgXNlbGVjdGVk44CBaGlnaGxpZ2h044CBaW5hY3RpdmXjgIFkaXNhYmxl77yM55So5oi35Y+v5Lul6Ieq5bex5omp5bGVXG4gIGVkZ2VTdGF0ZVN0eWxlczoge1xuICAgIGFjdGl2ZToge1xuICAgICAgc3Ryb2tlOiBjb2xvclNldC5lZGdlQWN0aXZlU3Ryb2tlLFxuICAgICAgbGluZVdpZHRoOiAxXG4gICAgfSxcbiAgICBzZWxlY3RlZDoge1xuICAgICAgc3Ryb2tlOiBjb2xvclNldC5lZGdlU2VsZWN0ZWRTdHJva2UsXG4gICAgICBsaW5lV2lkdGg6IDIsXG4gICAgICBzaGFkb3dDb2xvcjogY29sb3JTZXQuZWRnZVNlbGVjdGVkU3Ryb2tlLFxuICAgICAgc2hhZG93Qmx1cjogMTAsXG4gICAgICAndGV4dC1zaGFwZSc6IHtcbiAgICAgICAgZm9udFdlaWdodDogNTAwXG4gICAgICB9XG4gICAgfSxcbiAgICBoaWdobGlnaHQ6IHtcbiAgICAgIHN0cm9rZTogY29sb3JTZXQuZWRnZUhpZ2hsaWdodFN0cm9rZSxcbiAgICAgIGxpbmVXaWR0aDogMixcbiAgICAgICd0ZXh0LXNoYXBlJzoge1xuICAgICAgICBmb250V2VpZ2h0OiA1MDBcbiAgICAgIH1cbiAgICB9LFxuICAgIGluYWN0aXZlOiB7XG4gICAgICBzdHJva2U6IGNvbG9yU2V0LmVkZ2VJbmFjdGl2ZVN0cm9rZSxcbiAgICAgIGxpbmVXaWR0aDogMVxuICAgIH0sXG4gICAgZGlzYWJsZToge1xuICAgICAgc3Ryb2tlOiBjb2xvclNldC5lZGdlRGlzYWJsZVN0cm9rZSxcbiAgICAgIGxpbmVXaWR0aDogMVxuICAgIH1cbiAgfSxcbiAgY29tYm9MYWJlbDoge1xuICAgIHN0eWxlOiB7XG4gICAgICBmaWxsOiB0ZXh0Q29sb3IsXG4gICAgICAvLyB0ZXh0QWxpZ246ICdjZW50ZXInLFxuICAgICAgdGV4dEJhc2VsaW5lOiAnbWlkZGxlJyxcbiAgICAgIGZvbnRTaXplOiAxMlxuICAgIH0sXG4gICAgcmVmWTogMTAsXG4gICAgcmVmWDogMTAgLy8gQ29tYm8g55qE6buY6K6k5paH5pys5LiN5bGF5Lit5pe255qE5YGP56e76YePXG5cbiAgfSxcbiAgZGVmYXVsdENvbWJvOiB7XG4gICAgdHlwZTogJ2NpcmNsZScsXG4gICAgc3R5bGU6IHtcbiAgICAgIGZpbGw6IGNvbG9yU2V0LmNvbWJvTWFpbkZpbGwsXG4gICAgICBsaW5lV2lkdGg6IDEsXG4gICAgICBzdHJva2U6IGNvbG9yU2V0LmNvbWJvTWFpblN0cm9rZSxcbiAgICAgIHI6IDUsXG4gICAgICB3aWR0aDogMjAsXG4gICAgICBoZWlnaHQ6IDEwXG4gICAgfSxcbiAgICBzaXplOiBbMjAsIDVdLFxuICAgIGNvbG9yOiBjb2xvclNldC5jb21ib01haW5TdHJva2UsXG4gICAgcGFkZGluZzogWzI1LCAyMCwgMTUsIDIwXVxuICB9LFxuICAvLyBjb21ibyDlupTnlKjnirbmgIHlkI7nmoTmoLflvI/vvIzpu5jorqTku4Xmj5DkvpsgYWN0aXZl44CBc2VsZWN0ZWTjgIFoaWdobGlnaHTjgIFpbmFjdGl2ZeOAgWRpc2FibGXvvIznlKjmiLflj6/ku6Xoh6rlt7HmianlsZVcbiAgY29tYm9TdGF0ZVN0eWxlczoge1xuICAgIGFjdGl2ZToge1xuICAgICAgc3Ryb2tlOiBjb2xvclNldC5jb21ib0FjdGl2ZVN0cm9rZSxcbiAgICAgIGxpbmVXaWR0aDogMSxcbiAgICAgIGZpbGw6IGNvbG9yU2V0LmNvbWJvQWN0aXZlRmlsbFxuICAgIH0sXG4gICAgc2VsZWN0ZWQ6IHtcbiAgICAgIHN0cm9rZTogY29sb3JTZXQuY29tYm9TZWxlY3RlZFN0cm9rZSxcbiAgICAgIGxpbmVXaWR0aDogMixcbiAgICAgIGZpbGw6IGNvbG9yU2V0LmNvbWJvU2VsZWN0ZWRGaWxsLFxuICAgICAgc2hhZG93Q29sb3I6IGNvbG9yU2V0LmNvbWJvU2VsZWN0ZWRTdHJva2UsXG4gICAgICBzaGFkb3dCbHVyOiAxMCxcbiAgICAgICd0ZXh0LXNoYXBlJzoge1xuICAgICAgICBmb250V2VpZ2h0OiA1MDBcbiAgICAgIH1cbiAgICB9LFxuICAgIGhpZ2hsaWdodDoge1xuICAgICAgc3Ryb2tlOiBjb2xvclNldC5jb21ib0hpZ2hsaWdodFN0cm9rZSxcbiAgICAgIGxpbmVXaWR0aDogMixcbiAgICAgIGZpbGw6IGNvbG9yU2V0LmNvbWJvSGlnaGxpZ2h0RmlsbCxcbiAgICAgICd0ZXh0LXNoYXBlJzoge1xuICAgICAgICBmb250V2VpZ2h0OiA1MDBcbiAgICAgIH1cbiAgICB9LFxuICAgIGluYWN0aXZlOiB7XG4gICAgICBzdHJva2U6IGNvbG9yU2V0LmNvbWJvSW5hY3RpdmVTdHJva2UsXG4gICAgICBmaWxsOiBjb2xvclNldC5jb21ib0luYWN0aXZlRmlsbCxcbiAgICAgIGxpbmVXaWR0aDogMVxuICAgIH0sXG4gICAgZGlzYWJsZToge1xuICAgICAgc3Ryb2tlOiBjb2xvclNldC5jb21ib0Rpc2FibGVTdHJva2UsXG4gICAgICBmaWxsOiBjb2xvclNldC5jb21ib0Rpc2FibGVGaWxsLFxuICAgICAgbGluZVdpZHRoOiAxXG4gICAgfVxuICB9LFxuICBkZWxlZ2F0ZVN0eWxlOiB7XG4gICAgZmlsbDogJyNGM0Y5RkYnLFxuICAgIGZpbGxPcGFjaXR5OiAwLjUsXG4gICAgc3Ryb2tlOiAnIzE4OTBGRicsXG4gICAgc3Ryb2tlT3BhY2l0eTogMC45LFxuICAgIGxpbmVEYXNoOiBbNSwgNV1cbiAgfSxcbiAgd2luZG93Rm9udEZhbWlseTogdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LmdldENvbXB1dGVkU3R5bGUgPyB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5ib2R5LCBudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKCdmb250LWZhbWlseScpIHx8ICdBcmlhbCwgc2Fucy1zZXJpZicgOiAnQXJpYWwsIHNhbnMtc2VyaWYnXG59OyIsImV4cG9ydCBkZWZhdWx0IHtcbiAgJyAnOiAwLjMzMjk5ODY1NzIyNjU2MjUsXG4gIGE6IDAuNTU4OTk5NjMzNzg5MDYyNSxcbiAgQTogMC42NTY5OTkyMDY1NDI5Njg3LFxuICBiOiAwLjU4NTk5ODUzNTE1NjI1LFxuICBCOiAwLjY3Njk5ODkwMTM2NzE4NzUsXG4gIGM6IDAuNTQ2OTk4NTk2MTkxNDA2MixcbiAgQzogMC43Mjc5OTk4Nzc5Mjk2ODc1LFxuICBkOiAwLjU4NTk5ODUzNTE1NjI1LFxuICBEOiAwLjcwNTk5OTc1NTg1OTM3NSxcbiAgZTogMC41NTQ5OTg3NzkyOTY4NzUsXG4gIEU6IDAuNjM2OTk5NTExNzE4NzUsXG4gIGY6IDAuMzcyOTk5NTcyNzUzOTA2MjcsXG4gIEY6IDAuNTc2OTk4OTAxMzY3MTg3NSxcbiAgZzogMC41OTA5OTg4NDAzMzIwMzEyLFxuICBHOiAwLjc0Nzk5OTU3Mjc1MzkwNjMsXG4gIGg6IDAuNTU1OTk5NzU1ODU5Mzc1LFxuICBIOiAwLjcxOTk5OTY5NDgyNDIxODgsXG4gIGk6IDAuMjU1OTk5NzU1ODU5Mzc1LFxuICBJOiAwLjIzNjk5OTUxMTcxODc1LFxuICBqOiAwLjI2Njk5OTgxNjg5NDUzMTIzLFxuICBKOiAwLjUxNjk5OTgxNjg5NDUzMTIsXG4gIGs6IDAuNTI4OTk5MzI4NjEzMjgxMixcbiAgSzogMC42ODk5OTkzODk2NDg0Mzc1LFxuICBsOiAwLjIzNDk5OTA4NDQ3MjY1NjI0LFxuICBMOiAwLjU4Nzk5ODk2MjQwMjM0MzcsXG4gIG06IDAuODU0OTk4Nzc5Mjk2ODc1LFxuICBNOiAwLjg4MTk5OTIwNjU0Mjk2ODcsXG4gIG46IDAuNTU4OTk5NjMzNzg5MDYyNSxcbiAgTjogMC43MTg5OTg3MTgyNjE3MTg4LFxuICBvOiAwLjU4NTk5ODUzNTE1NjI1LFxuICBPOiAwLjc2Njk5OTgxNjg5NDUzMTIsXG4gIHA6IDAuNTg1OTk4NTM1MTU2MjUsXG4gIFA6IDAuNjQxOTk5ODE2ODk0NTMxMixcbiAgcTogMC41ODU5OTg1MzUxNTYyNSxcbiAgUTogMC43NjY5OTk4MTY4OTQ1MzEyLFxuICByOiAwLjM2NDk5OTM4OTY0ODQzNzUsXG4gIFI6IDAuNjc1OTk5NDUwNjgzNTkzOCxcbiAgczogMC41MDQ5OTg3NzkyOTY4NzUsXG4gIFM6IDAuNjMxOTk5MjA2NTQyOTY4NyxcbiAgdDogMC4zNTQ5OTg3NzkyOTY4NzUsXG4gIFQ6IDAuNjE4OTk4NzE4MjYxNzE4NyxcbiAgdTogMC41NTk5OTkwODQ0NzI2NTYyLFxuICBVOiAwLjcxMzk5OTkzODk2NDg0MzcsXG4gIHY6IDAuNDgxOTk5MjA2NTQyOTY4NzQsXG4gIFY6IDAuNjM4OTk5OTM4OTY0ODQzOCxcbiAgdzogMC43NTQ5OTg3NzkyOTY4NzUsXG4gIFc6IDAuOTI5OTk4Nzc5Mjk2ODc1LFxuICB4OiAwLjUwODk5OTYzMzc4OTA2MjUsXG4gIFg6IDAuNjM2OTk5NTExNzE4NzUsXG4gIHk6IDAuNDk1OTk5MTQ1NTA3ODEyNSxcbiAgWTogMC42NjE5OTk1MTE3MTg3NSxcbiAgejogMC40ODY5OTk1MTE3MTg3NSxcbiAgWjogMC42MjM5OTkwMjM0Mzc1LFxuICAnMCc6IDAuNixcbiAgJzEnOiAwLjQwMDk5OTQ1MDY4MzU5Mzc3LFxuICAnMic6IDAuNixcbiAgJzMnOiAwLjYsXG4gICc0JzogMC42LFxuICAnNSc6IDAuNixcbiAgJzYnOiAwLjYsXG4gICc3JzogMC41NDY5OTg1OTYxOTE0MDYyLFxuICAnOCc6IDAuNixcbiAgJzknOiAwLjYsXG4gICdbJzogMC4zMzI5OTg2NTcyMjY1NjI1LFxuICAnXSc6IDAuMzMyOTk4NjU3MjI2NTYyNSxcbiAgJywnOiAwLjI2Mzk5OTkzODk2NDg0Mzc1LFxuICAnLic6IDAuMjYzOTk5OTM4OTY0ODQzNzUsXG4gICc7JzogMC4yNjM5OTk5Mzg5NjQ4NDM3NSxcbiAgJzonOiAwLjI2Mzk5OTkzODk2NDg0Mzc1LFxuICAneyc6IDAuMzMyOTk4NjU3MjI2NTYyNSxcbiAgJ30nOiAwLjMzMjk5ODY1NzIyNjU2MjUsXG4gICdcXFxcJzogMC41LFxuICAnfCc6IDAuMTk0OTk5Njk0ODI0MjE4NzUsXG4gICc9JzogMC42MDQ5OTg3NzkyOTY4NzUsXG4gICcrJzogMC42MDQ5OTg3NzkyOTY4NzUsXG4gICctJzogMC42MDQ5OTg3NzkyOTY4NzUsXG4gIF86IDAuNSxcbiAgJ2AnOiAwLjMzMjk5ODY1NzIyNjU2MjUsXG4gICcgfic6IDAuODMyOTk4NjU3MjI2NTYyNSxcbiAgJyEnOiAwLjMzMjk5ODY1NzIyNjU2MjUsXG4gICdAJzogMC44NTc5OTg2NTcyMjY1NjI1LFxuICAnIyc6IDAuNixcbiAgJDogMC42LFxuICAnJSc6IDAuOTY5OTk5Njk0ODI0MjE4OCxcbiAgJ14nOiAwLjUxNzk5OTI2NzU3ODEyNSxcbiAgJyYnOiAwLjcyNTk5OTQ1MDY4MzU5MzcsXG4gICcqJzogMC41MDU5OTk3NTU4NTkzNzUsXG4gICcoJzogMC4zMzI5OTg2NTcyMjY1NjI1LFxuICAnKSc6IDAuMzMyOTk4NjU3MjI2NTYyNSxcbiAgJzwnOiAwLjYwNDk5ODc3OTI5Njg3NSxcbiAgJz4nOiAwLjYwNDk5ODc3OTI5Njg3NSxcbiAgJy8nOiAwLjUsXG4gICc/JzogMC41MzY5OTk1MTE3MTg3NVxufTsiLCJpbXBvcnQgeyBfX2Fzc2lnbiB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgdmVjMiB9IGZyb20gJ0BhbnR2L21hdHJpeC11dGlsJztcbmltcG9ydCBHbG9iYWwgZnJvbSAnLi4vZ2xvYmFsJztcbmltcG9ydCB7IGFwcGx5TWF0cml4IH0gZnJvbSAnLi9tYXRoJztcbmltcG9ydCBsZXR0ZXJBc3BlY3RSYXRpbyBmcm9tICcuL2xldHRlckFzcGVjdFJhdGlvJztcbmltcG9ydCB7IGlzU3RyaW5nLCBjbG9uZSwgaXNOdW1iZXIsIGlzT2JqZWN0LCBpc0FycmF5IH0gZnJvbSAnQGFudHYvdXRpbCc7XG52YXIgUEkgPSBNYXRoLlBJLFxuICAgIHNpbiA9IE1hdGguc2luLFxuICAgIGNvcyA9IE1hdGguY29zOyAvLyDkuIDlhbHmlK/mjIE45Liq5pa55ZCR55qE6Ieq546v77yM5q+P5Liq546v5Y2g55qE6KeS5bqm5pivNDXluqbvvIzlnKjorqHnrpfml7blho3kuozliIbvvIzkuLoyMi415bqmXG5cbnZhciBTRUxGX0xJTktfU0lOID0gc2luKFBJIC8gOCk7XG52YXIgU0VMRl9MSU5LX0NPUyA9IGNvcyhQSSAvIDgpO1xuZXhwb3J0IHZhciBnZXRCQm94ID0gZnVuY3Rpb24gZ2V0QkJveChlbGVtZW50LCBncm91cCkge1xuICB2YXIgYmJveCA9IGVsZW1lbnQuZ2V0QkJveCgpO1xuICB2YXIgbGVmdFRvcCA9IHtcbiAgICB4OiBiYm94Lm1pblgsXG4gICAgeTogYmJveC5taW5ZXG4gIH07XG4gIHZhciByaWdodEJvdHRvbSA9IHtcbiAgICB4OiBiYm94Lm1heFgsXG4gICAgeTogYmJveC5tYXhZXG4gIH07IC8vIOagueaNrueItuWFg+e0oOWPmOaNouefqemYtVxuXG4gIGlmIChncm91cCkge1xuICAgIHZhciBtYXRyaXggPSBncm91cC5nZXRNYXRyaXgoKTtcblxuICAgIGlmICghbWF0cml4KSB7XG4gICAgICBtYXRyaXggPSBbMSwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMV07XG4gICAgfVxuXG4gICAgbGVmdFRvcCA9IGFwcGx5TWF0cml4KGxlZnRUb3AsIG1hdHJpeCk7XG4gICAgcmlnaHRCb3R0b20gPSBhcHBseU1hdHJpeChyaWdodEJvdHRvbSwgbWF0cml4KTtcbiAgfVxuXG4gIHZhciBseCA9IGxlZnRUb3AueCxcbiAgICAgIGx5ID0gbGVmdFRvcC55O1xuICB2YXIgcnggPSByaWdodEJvdHRvbS54LFxuICAgICAgcnkgPSByaWdodEJvdHRvbS55O1xuICByZXR1cm4ge1xuICAgIHg6IGx4LFxuICAgIHk6IGx5LFxuICAgIG1pblg6IGx4LFxuICAgIG1pblk6IGx5LFxuICAgIG1heFg6IHJ4LFxuICAgIG1heFk6IHJ5LFxuICAgIHdpZHRoOiByeCAtIGx4LFxuICAgIGhlaWdodDogcnkgLSBseVxuICB9O1xufTtcbi8qKlxuICogZ2V0IGxvb3AgZWRnZSBjb25maWdcbiAqIEBwYXJhbSBjZmcgZWRnZSBjb25maWdcbiAqL1xuXG5leHBvcnQgdmFyIGdldExvb3BDZmdzID0gZnVuY3Rpb24gZ2V0TG9vcENmZ3MoY2ZnKSB7XG4gIHZhciBpdGVtID0gY2ZnLnNvdXJjZU5vZGUgfHwgY2ZnLnRhcmdldE5vZGU7XG4gIHZhciBjb250YWluZXIgPSBpdGVtLmdldCgnZ3JvdXAnKTtcbiAgdmFyIGNvbnRhaW5lck1hdHJpeCA9IGNvbnRhaW5lci5nZXRNYXRyaXgoKTtcbiAgaWYgKCFjb250YWluZXJNYXRyaXgpIGNvbnRhaW5lck1hdHJpeCA9IFsxLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAxXTtcbiAgdmFyIGtleVNoYXBlID0gaXRlbS5nZXRLZXlTaGFwZSgpO1xuICB2YXIgYmJveCA9IGtleVNoYXBlLmdldEJCb3goKTtcbiAgdmFyIGxvb3BDZmcgPSBjZmcubG9vcENmZyB8fCB7fTsgLy8g6Led56a7a2V5U2hhcGXovrnnmoTmnIDpq5jot53nprtcblxuICB2YXIgZGlzdCA9IGxvb3BDZmcuZGlzdCB8fCBNYXRoLm1heChiYm94LndpZHRoLCBiYm94LmhlaWdodCkgKiAyOyAvLyDoh6rnjq/ovrnkuI5rZXlTaGFwZeeahOebuOWvueS9jee9ruWFs+ezu1xuXG4gIHZhciBwb3NpdGlvbiA9IGxvb3BDZmcucG9zaXRpb24gfHwgR2xvYmFsLmRlZmF1bHRMb29wUG9zaXRpb247IC8vIOS4reW/g+WPlmdyb3Vw5LiK55yf5a6e5L2N572uXG5cbiAgdmFyIGNlbnRlciA9IFtjb250YWluZXJNYXRyaXhbNl0sIGNvbnRhaW5lck1hdHJpeFs3XV07XG4gIHZhciBzdGFydFBvaW50ID0gW2NmZy5zdGFydFBvaW50LngsIGNmZy5zdGFydFBvaW50LnldO1xuICB2YXIgZW5kUG9pbnQgPSBbY2ZnLmVuZFBvaW50LngsIGNmZy5lbmRQb2ludC55XTtcbiAgdmFyIHJzdGFydCA9IGJib3guaGVpZ2h0IC8gMjtcbiAgdmFyIHJlbmQgPSBiYm94LmhlaWdodCAvIDI7XG4gIHZhciBzaW5EZWx0YVN0YXJ0ID0gcnN0YXJ0ICogU0VMRl9MSU5LX1NJTjtcbiAgdmFyIGNvc0RlbHRhU3RhcnQgPSByc3RhcnQgKiBTRUxGX0xJTktfQ09TO1xuICB2YXIgc2luRGVsdGFFbmQgPSByZW5kICogU0VMRl9MSU5LX1NJTjtcbiAgdmFyIGNvc0RlbHRhRW5kID0gcmVuZCAqIFNFTEZfTElOS19DT1M7IC8vIOWmguaenOWumuS5ieS6humUmueCueeahO+8jOebtOaOpeeUqOmUmueCueWdkOagh++8jOWQpuWIme+8jOagueaNruiHqueOr+eahCBjZmcg6K6h566XXG5cbiAgaWYgKHN0YXJ0UG9pbnRbMF0gPT09IGVuZFBvaW50WzBdICYmIHN0YXJ0UG9pbnRbMV0gPT09IGVuZFBvaW50WzFdKSB7XG4gICAgc3dpdGNoIChwb3NpdGlvbikge1xuICAgICAgY2FzZSAndG9wJzpcbiAgICAgICAgc3RhcnRQb2ludCA9IFtjZW50ZXJbMF0gLSBzaW5EZWx0YVN0YXJ0LCBjZW50ZXJbMV0gLSBjb3NEZWx0YVN0YXJ0XTtcbiAgICAgICAgZW5kUG9pbnQgPSBbY2VudGVyWzBdICsgc2luRGVsdGFFbmQsIGNlbnRlclsxXSAtIGNvc0RlbHRhRW5kXTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ3RvcC1yaWdodCc6XG4gICAgICAgIHJzdGFydCA9IGJib3guaGVpZ2h0IC8gMjtcbiAgICAgICAgcmVuZCA9IGJib3gud2lkdGggLyAyO1xuICAgICAgICBzaW5EZWx0YVN0YXJ0ID0gcnN0YXJ0ICogU0VMRl9MSU5LX1NJTjtcbiAgICAgICAgY29zRGVsdGFTdGFydCA9IHJzdGFydCAqIFNFTEZfTElOS19DT1M7XG4gICAgICAgIHNpbkRlbHRhRW5kID0gcmVuZCAqIFNFTEZfTElOS19TSU47XG4gICAgICAgIGNvc0RlbHRhRW5kID0gcmVuZCAqIFNFTEZfTElOS19DT1M7XG4gICAgICAgIHN0YXJ0UG9pbnQgPSBbY2VudGVyWzBdICsgc2luRGVsdGFTdGFydCwgY2VudGVyWzFdIC0gY29zRGVsdGFTdGFydF07XG4gICAgICAgIGVuZFBvaW50ID0gW2NlbnRlclswXSArIGNvc0RlbHRhRW5kLCBjZW50ZXJbMV0gLSBzaW5EZWx0YUVuZF07XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdyaWdodCc6XG4gICAgICAgIHJzdGFydCA9IGJib3gud2lkdGggLyAyO1xuICAgICAgICByZW5kID0gYmJveC53aWR0aCAvIDI7XG4gICAgICAgIHNpbkRlbHRhU3RhcnQgPSByc3RhcnQgKiBTRUxGX0xJTktfU0lOO1xuICAgICAgICBjb3NEZWx0YVN0YXJ0ID0gcnN0YXJ0ICogU0VMRl9MSU5LX0NPUztcbiAgICAgICAgc2luRGVsdGFFbmQgPSByZW5kICogU0VMRl9MSU5LX1NJTjtcbiAgICAgICAgY29zRGVsdGFFbmQgPSByZW5kICogU0VMRl9MSU5LX0NPUztcbiAgICAgICAgc3RhcnRQb2ludCA9IFtjZW50ZXJbMF0gKyBjb3NEZWx0YVN0YXJ0LCBjZW50ZXJbMV0gLSBzaW5EZWx0YVN0YXJ0XTtcbiAgICAgICAgZW5kUG9pbnQgPSBbY2VudGVyWzBdICsgY29zRGVsdGFFbmQsIGNlbnRlclsxXSArIHNpbkRlbHRhRW5kXTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ2JvdHRvbS1yaWdodCc6XG4gICAgICAgIHJzdGFydCA9IGJib3gud2lkdGggLyAyO1xuICAgICAgICByZW5kID0gYmJveC5oZWlnaHQgLyAyO1xuICAgICAgICBzaW5EZWx0YVN0YXJ0ID0gcnN0YXJ0ICogU0VMRl9MSU5LX1NJTjtcbiAgICAgICAgY29zRGVsdGFTdGFydCA9IHJzdGFydCAqIFNFTEZfTElOS19DT1M7XG4gICAgICAgIHNpbkRlbHRhRW5kID0gcmVuZCAqIFNFTEZfTElOS19TSU47XG4gICAgICAgIGNvc0RlbHRhRW5kID0gcmVuZCAqIFNFTEZfTElOS19DT1M7XG4gICAgICAgIHN0YXJ0UG9pbnQgPSBbY2VudGVyWzBdICsgY29zRGVsdGFTdGFydCwgY2VudGVyWzFdICsgc2luRGVsdGFTdGFydF07XG4gICAgICAgIGVuZFBvaW50ID0gW2NlbnRlclswXSArIHNpbkRlbHRhRW5kLCBjZW50ZXJbMV0gKyBjb3NEZWx0YUVuZF07XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdib3R0b20nOlxuICAgICAgICByc3RhcnQgPSBiYm94LmhlaWdodCAvIDI7XG4gICAgICAgIHJlbmQgPSBiYm94LmhlaWdodCAvIDI7XG4gICAgICAgIHNpbkRlbHRhU3RhcnQgPSByc3RhcnQgKiBTRUxGX0xJTktfU0lOO1xuICAgICAgICBjb3NEZWx0YVN0YXJ0ID0gcnN0YXJ0ICogU0VMRl9MSU5LX0NPUztcbiAgICAgICAgc2luRGVsdGFFbmQgPSByZW5kICogU0VMRl9MSU5LX1NJTjtcbiAgICAgICAgY29zRGVsdGFFbmQgPSByZW5kICogU0VMRl9MSU5LX0NPUztcbiAgICAgICAgc3RhcnRQb2ludCA9IFtjZW50ZXJbMF0gKyBzaW5EZWx0YVN0YXJ0LCBjZW50ZXJbMV0gKyBjb3NEZWx0YVN0YXJ0XTtcbiAgICAgICAgZW5kUG9pbnQgPSBbY2VudGVyWzBdIC0gc2luRGVsdGFFbmQsIGNlbnRlclsxXSArIGNvc0RlbHRhRW5kXTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ2JvdHRvbS1sZWZ0JzpcbiAgICAgICAgcnN0YXJ0ID0gYmJveC5oZWlnaHQgLyAyO1xuICAgICAgICByZW5kID0gYmJveC53aWR0aCAvIDI7XG4gICAgICAgIHNpbkRlbHRhU3RhcnQgPSByc3RhcnQgKiBTRUxGX0xJTktfU0lOO1xuICAgICAgICBjb3NEZWx0YVN0YXJ0ID0gcnN0YXJ0ICogU0VMRl9MSU5LX0NPUztcbiAgICAgICAgc2luRGVsdGFFbmQgPSByZW5kICogU0VMRl9MSU5LX1NJTjtcbiAgICAgICAgY29zRGVsdGFFbmQgPSByZW5kICogU0VMRl9MSU5LX0NPUztcbiAgICAgICAgc3RhcnRQb2ludCA9IFtjZW50ZXJbMF0gLSBzaW5EZWx0YVN0YXJ0LCBjZW50ZXJbMV0gKyBjb3NEZWx0YVN0YXJ0XTtcbiAgICAgICAgZW5kUG9pbnQgPSBbY2VudGVyWzBdIC0gY29zRGVsdGFFbmQsIGNlbnRlclsxXSArIHNpbkRlbHRhRW5kXTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ2xlZnQnOlxuICAgICAgICByc3RhcnQgPSBiYm94LndpZHRoIC8gMjtcbiAgICAgICAgcmVuZCA9IGJib3gud2lkdGggLyAyO1xuICAgICAgICBzaW5EZWx0YVN0YXJ0ID0gcnN0YXJ0ICogU0VMRl9MSU5LX1NJTjtcbiAgICAgICAgY29zRGVsdGFTdGFydCA9IHJzdGFydCAqIFNFTEZfTElOS19DT1M7XG4gICAgICAgIHNpbkRlbHRhRW5kID0gcmVuZCAqIFNFTEZfTElOS19TSU47XG4gICAgICAgIGNvc0RlbHRhRW5kID0gcmVuZCAqIFNFTEZfTElOS19DT1M7XG4gICAgICAgIHN0YXJ0UG9pbnQgPSBbY2VudGVyWzBdIC0gY29zRGVsdGFTdGFydCwgY2VudGVyWzFdICsgc2luRGVsdGFTdGFydF07XG4gICAgICAgIGVuZFBvaW50ID0gW2NlbnRlclswXSAtIGNvc0RlbHRhRW5kLCBjZW50ZXJbMV0gLSBzaW5EZWx0YUVuZF07XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICd0b3AtbGVmdCc6XG4gICAgICAgIHJzdGFydCA9IGJib3gud2lkdGggLyAyO1xuICAgICAgICByZW5kID0gYmJveC5oZWlnaHQgLyAyO1xuICAgICAgICBzaW5EZWx0YVN0YXJ0ID0gcnN0YXJ0ICogU0VMRl9MSU5LX1NJTjtcbiAgICAgICAgY29zRGVsdGFTdGFydCA9IHJzdGFydCAqIFNFTEZfTElOS19DT1M7XG4gICAgICAgIHNpbkRlbHRhRW5kID0gcmVuZCAqIFNFTEZfTElOS19TSU47XG4gICAgICAgIGNvc0RlbHRhRW5kID0gcmVuZCAqIFNFTEZfTElOS19DT1M7XG4gICAgICAgIHN0YXJ0UG9pbnQgPSBbY2VudGVyWzBdIC0gY29zRGVsdGFTdGFydCwgY2VudGVyWzFdIC0gc2luRGVsdGFTdGFydF07XG4gICAgICAgIGVuZFBvaW50ID0gW2NlbnRlclswXSAtIHNpbkRlbHRhRW5kLCBjZW50ZXJbMV0gLSBjb3NEZWx0YUVuZF07XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByc3RhcnQgPSBiYm94LndpZHRoIC8gMjtcbiAgICAgICAgcmVuZCA9IGJib3gud2lkdGggLyAyO1xuICAgICAgICBzaW5EZWx0YVN0YXJ0ID0gcnN0YXJ0ICogU0VMRl9MSU5LX1NJTjtcbiAgICAgICAgY29zRGVsdGFTdGFydCA9IHJzdGFydCAqIFNFTEZfTElOS19DT1M7XG4gICAgICAgIHNpbkRlbHRhRW5kID0gcmVuZCAqIFNFTEZfTElOS19TSU47XG4gICAgICAgIGNvc0RlbHRhRW5kID0gcmVuZCAqIFNFTEZfTElOS19DT1M7XG4gICAgICAgIHN0YXJ0UG9pbnQgPSBbY2VudGVyWzBdIC0gc2luRGVsdGFTdGFydCwgY2VudGVyWzFdIC0gY29zRGVsdGFTdGFydF07XG4gICAgICAgIGVuZFBvaW50ID0gW2NlbnRlclswXSArIHNpbkRlbHRhRW5kLCBjZW50ZXJbMV0gLSBjb3NEZWx0YUVuZF07XG4gICAgfSAvLyDlpoLmnpzpgIbml7bpkojnlLvvvIzkuqTmjaLotbfngrnlkoznu4jngrlcblxuXG4gICAgaWYgKGxvb3BDZmcuY2xvY2t3aXNlID09PSBmYWxzZSkge1xuICAgICAgdmFyIHN3YXAgPSBbc3RhcnRQb2ludFswXSwgc3RhcnRQb2ludFsxXV07XG4gICAgICBzdGFydFBvaW50ID0gW2VuZFBvaW50WzBdLCBlbmRQb2ludFsxXV07XG4gICAgICBlbmRQb2ludCA9IFtzd2FwWzBdLCBzd2FwWzFdXTtcbiAgICB9XG4gIH1cblxuICB2YXIgc3RhcnRWZWMgPSBbc3RhcnRQb2ludFswXSAtIGNlbnRlclswXSwgc3RhcnRQb2ludFsxXSAtIGNlbnRlclsxXV07XG4gIHZhciBzY2FsZVJhdGVTdGFydCA9IChyc3RhcnQgKyBkaXN0KSAvIHJzdGFydDtcbiAgdmFyIHNjYWxlUmF0ZUVuZCA9IChyZW5kICsgZGlzdCkgLyByZW5kO1xuXG4gIGlmIChsb29wQ2ZnLmNsb2Nrd2lzZSA9PT0gZmFsc2UpIHtcbiAgICBzY2FsZVJhdGVTdGFydCA9IChyZW5kICsgZGlzdCkgLyByZW5kO1xuICAgIHNjYWxlUmF0ZUVuZCA9IChyc3RhcnQgKyBkaXN0KSAvIHJzdGFydDtcbiAgfVxuXG4gIHZhciBzdGFydEV4dGVuZFZlYyA9IHZlYzIuc2NhbGUoWzAsIDBdLCBzdGFydFZlYywgc2NhbGVSYXRlU3RhcnQpO1xuICB2YXIgY29udHJvbFBvaW50MSA9IFtjZW50ZXJbMF0gKyBzdGFydEV4dGVuZFZlY1swXSwgY2VudGVyWzFdICsgc3RhcnRFeHRlbmRWZWNbMV1dO1xuICB2YXIgZW5kVmVjID0gW2VuZFBvaW50WzBdIC0gY2VudGVyWzBdLCBlbmRQb2ludFsxXSAtIGNlbnRlclsxXV07XG4gIHZhciBlbmRFeHRlbmRWZWMgPSB2ZWMyLnNjYWxlKFswLCAwXSwgZW5kVmVjLCBzY2FsZVJhdGVFbmQpO1xuICB2YXIgY29udHJvbFBvaW50MiA9IFtjZW50ZXJbMF0gKyBlbmRFeHRlbmRWZWNbMF0sIGNlbnRlclsxXSArIGVuZEV4dGVuZFZlY1sxXV07XG4gIGNmZy5zdGFydFBvaW50ID0ge1xuICAgIHg6IHN0YXJ0UG9pbnRbMF0sXG4gICAgeTogc3RhcnRQb2ludFsxXVxuICB9O1xuICBjZmcuZW5kUG9pbnQgPSB7XG4gICAgeDogZW5kUG9pbnRbMF0sXG4gICAgeTogZW5kUG9pbnRbMV1cbiAgfTtcbiAgY2ZnLmNvbnRyb2xQb2ludHMgPSBbe1xuICAgIHg6IGNvbnRyb2xQb2ludDFbMF0sXG4gICAgeTogY29udHJvbFBvaW50MVsxXVxuICB9LCB7XG4gICAgeDogY29udHJvbFBvaW50MlswXSxcbiAgICB5OiBjb250cm9sUG9pbnQyWzFdXG4gIH1dO1xuICByZXR1cm4gY2ZnO1xufTtcbi8qKlxuICog5qC55o2uIGxhYmVsIOaJgOWcqOe6v+adoeeahOS9jee9rueZvuWIhuavlO+8jOiuoeeulyBsYWJlbCDlnZDmoIdcbiAqIEBwYXJhbSB7b2JqZWN0fSAgcGF0aFNoYXBlICBHIOeahCBwYXRoIOWunuS+i++8jOS4gOiIrOaYryBFZGdlIOWunuS+i+eahCBrZXlTaGFwZVxuICogQHBhcmFtIHtudW1iZXJ9ICBwZXJjZW50ICAgIOiMg+WbtCAwIC0gMSDnmoTnur/mnaHnmb7liIbmr5RcbiAqIEBwYXJhbSB7bnVtYmVyfSAgcmVmWCAgICAgeCDovbTmraPmlrnlkJHkuLrln7rlh4bnmoQgbGFiZWwg5YGP56e7XG4gKiBAcGFyYW0ge251bWJlcn0gIHJlZlkgICAgIHkg6L205q2j5pa55ZCR5Li65Z+65YeG55qEIGxhYmVsIOWBj+enu1xuICogQHBhcmFtIHtib29sZWFufSByb3RhdGUgICAgIOaYr+WQpuagueaNrue6v+adoeaWnOeOh+aXi+i9rOaWh+acrFxuICogQHJldHVybiB7b2JqZWN0fSDmlofmnKznmoQgeCwgeSwg5paH5pys55qE5peL6L2s6KeS5bqmXG4gKi9cblxuZXhwb3J0IHZhciBnZXRMYWJlbFBvc2l0aW9uID0gZnVuY3Rpb24gZ2V0TGFiZWxQb3NpdGlvbihwYXRoU2hhcGUsIHBlcmNlbnQsIHJlZlgsIHJlZlksIHJvdGF0ZSkge1xuICB2YXIgVEFOX09GRlNFVCA9IDAuMDAwMTtcbiAgdmFyIHZlY3RvciA9IFtdO1xuICB2YXIgcG9pbnQgPSBwYXRoU2hhcGUgPT09IG51bGwgfHwgcGF0aFNoYXBlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwYXRoU2hhcGUuZ2V0UG9pbnQocGVyY2VudCk7XG5cbiAgaWYgKCFwb2ludCkge1xuICAgIHJldHVybiB7XG4gICAgICB4OiAwLFxuICAgICAgeTogMCxcbiAgICAgIGFuZ2xlOiAwXG4gICAgfTtcbiAgfSAvLyDlpLTlsL7mnIDlj6/og73vvIzmlL7lnKjmnIDliY3pnaLvvIzkvb/nlKggZyBwYXRoIOS4iuWwgeijheeahOaWueazlVxuXG5cbiAgaWYgKHBlcmNlbnQgPCBUQU5fT0ZGU0VUKSB7XG4gICAgdmVjdG9yID0gcGF0aFNoYXBlLmdldFN0YXJ0VGFuZ2VudCgpLnJldmVyc2UoKTtcbiAgfSBlbHNlIGlmIChwZXJjZW50ID4gMSAtIFRBTl9PRkZTRVQpIHtcbiAgICB2ZWN0b3IgPSBwYXRoU2hhcGUuZ2V0RW5kVGFuZ2VudCgpO1xuICB9IGVsc2Uge1xuICAgIC8vIOWQpuWImeWPluaMh+WumuS9jee9rueahOeCuSzkuI7lsJHph4/lgY/np7vnmoTngrnvvIzlgZrlvq7liIblkJHph49cbiAgICB2YXIgb2Zmc2V0UG9pbnQgPSBwYXRoU2hhcGUgPT09IG51bGwgfHwgcGF0aFNoYXBlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwYXRoU2hhcGUuZ2V0UG9pbnQocGVyY2VudCArIFRBTl9PRkZTRVQpO1xuICAgIHZlY3Rvci5wdXNoKFtwb2ludC54LCBwb2ludC55XSk7XG4gICAgdmVjdG9yLnB1c2goW29mZnNldFBvaW50LngsIG9mZnNldFBvaW50LnldKTtcbiAgfVxuXG4gIHZhciByYWQgPSBNYXRoLmF0YW4yKHZlY3RvclsxXVsxXSAtIHZlY3RvclswXVsxXSwgdmVjdG9yWzFdWzBdIC0gdmVjdG9yWzBdWzBdKTtcblxuICBpZiAocmFkIDwgMCkge1xuICAgIHJhZCArPSBQSSAqIDI7XG4gIH1cblxuICBpZiAocmVmWCkge1xuICAgIHBvaW50LnggKz0gY29zKHJhZCkgKiByZWZYO1xuICAgIHBvaW50LnkgKz0gc2luKHJhZCkgKiByZWZYO1xuICB9XG5cbiAgaWYgKHJlZlkpIHtcbiAgICAvLyDpu5jorqTmlrnlkJHmmK8geCDovbTmraPmlrnlkJHvvIzms5Xnur/mmK8g5rGC5Ye66KeS5bqmIC0gOTDCsFxuICAgIHZhciBub3JtYWwgPSByYWQgLSBQSSAvIDI7IC8vIOiLpeazlee6v+inkuW6puWcqCB5IOi9tOi0n+aWueWQke+8jOWIh+WIsOato+aWueWQke+8jOS/neivgSByZWZZIOebuOWvueS6jiB5IOi9tOato+aWueWQkVxuXG4gICAgaWYgKHJhZCA+IDEgLyAyICogUEkgJiYgcmFkIDwgMyAqIDEgLyAyICogUEkpIHtcbiAgICAgIG5vcm1hbCAtPSBQSTtcbiAgICB9XG5cbiAgICBwb2ludC54ICs9IGNvcyhub3JtYWwpICogcmVmWTtcbiAgICBwb2ludC55ICs9IHNpbihub3JtYWwpICogcmVmWTtcbiAgfVxuXG4gIHZhciByZXN1bHQgPSB7XG4gICAgeDogcG9pbnQueCxcbiAgICB5OiBwb2ludC55LFxuICAgIGFuZ2xlOiByYWRcbiAgfTtcblxuICBpZiAocm90YXRlKSB7XG4gICAgaWYgKHJhZCA+IDAuNSAqIFBJICYmIHJhZCA8IDEuNSAqIFBJKSB7XG4gICAgICByYWQgLT0gUEk7XG4gICAgfVxuXG4gICAgcmV0dXJuIF9fYXNzaWduKHtcbiAgICAgIHJvdGF0ZTogcmFkXG4gICAgfSwgcmVzdWx0KTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuLyoqXG4gKiBkZXB0aCBmaXJzdCB0cmF2ZXJzZSwgZnJvbSByb290IHRvIGxlYXZlcywgY2hpbGRyZW4gaW4gaW52ZXJzZSBvcmRlclxuICogIGlmIHRoZSBmbiByZXR1cm5zIGZhbHNlLCB0ZXJtaW5hdGUgdGhlIHRyYXZlcnNlXG4gKi9cblxudmFyIHRyYXZlcnNlID0gZnVuY3Rpb24gdHJhdmVyc2UoZGF0YSwgZm4pIHtcbiAgaWYgKGZuKGRhdGEpID09PSBmYWxzZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChkYXRhICYmIGRhdGEuY2hpbGRyZW4pIHtcbiAgICBmb3IgKHZhciBpID0gZGF0YS5jaGlsZHJlbi5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgaWYgKCF0cmF2ZXJzZShkYXRhLmNoaWxkcmVuW2ldLCBmbikpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG4vKipcbiAqIGRlcHRoIGZpcnN0IHRyYXZlcnNlLCBmcm9tIGxlYXZlcyB0byByb290LCBjaGlsZHJlbiBpbiBpbnZlcnNlIG9yZGVyXG4gKiAgaWYgdGhlIGZuIHJldHVybnMgZmFsc2UsIHRlcm1pbmF0ZSB0aGUgdHJhdmVyc2VcbiAqL1xuXG5cbnZhciB0cmF2ZXJzZVVwID0gZnVuY3Rpb24gdHJhdmVyc2VVcChkYXRhLCBmbikge1xuICBpZiAoZGF0YSAmJiBkYXRhLmNoaWxkcmVuKSB7XG4gICAgZm9yICh2YXIgaSA9IGRhdGEuY2hpbGRyZW4ubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGlmICghdHJhdmVyc2VVcChkYXRhLmNoaWxkcmVuW2ldLCBmbikpIHJldHVybjtcbiAgICB9XG4gIH1cblxuICBpZiAoZm4oZGF0YSkgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuLyoqXG4gKiBkZXB0aCBmaXJzdCB0cmF2ZXJzZSwgZnJvbSByb290IHRvIGxlYXZlcywgY2hpbGRyZW4gaW4gaW52ZXJzZSBvcmRlclxuICogIGlmIHRoZSBmbiByZXR1cm5zIGZhbHNlLCB0ZXJtaW5hdGUgdGhlIHRyYXZlcnNlXG4gKi9cblxuXG5leHBvcnQgdmFyIHRyYXZlcnNlVHJlZSA9IGZ1bmN0aW9uIHRyYXZlcnNlVHJlZShkYXRhLCBmbikge1xuICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdHJhdmVyc2UoZGF0YSwgZm4pO1xufTtcbi8qKlxuICogZGVwdGggZmlyc3QgdHJhdmVyc2UsIGZyb20gbGVhdmVzIHRvIHJvb3QsIGNoaWxkcmVuIGluIGludmVyc2Ugb3JkZXJcbiAqIGlmIHRoZSBmbiByZXR1cm5zIGZhbHNlLCB0ZXJtaW5hdGUgdGhlIHRyYXZlcnNlXG4gKi9cblxuZXhwb3J0IHZhciB0cmF2ZXJzZVRyZWVVcCA9IGZ1bmN0aW9uIHRyYXZlcnNlVHJlZVVwKGRhdGEsIGZuKSB7XG4gIGlmICh0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB0cmF2ZXJzZVVwKGRhdGEsIGZuKTtcbn07XG4vKipcbiAqXG4gKiBAcGFyYW0gbGV0dGVyIHRoZSBsZXR0ZXJcbiAqIEBwYXJhbSBmb250U2l6ZVxuICogQHJldHVybiB0aGUgbGV0dGVyJ3Mgd2lkdGhcbiAqL1xuXG5leHBvcnQgdmFyIGdldExldHRlcldpZHRoID0gZnVuY3Rpb24gZ2V0TGV0dGVyV2lkdGgobGV0dGVyLCBmb250U2l6ZSkge1xuICByZXR1cm4gZm9udFNpemUgKiAobGV0dGVyQXNwZWN0UmF0aW9bbGV0dGVyXSB8fCAxKTtcbn07XG4vKipcbiAqXG4gKiBAcGFyYW0gdGV4dCB0aGUgdGV4dFxuICogQHBhcmFtIGZvbnRTaXplXG4gKiBAcmV0dXJuIHRoZSB0ZXh0J3Mgc2l6ZVxuICovXG5cbmV4cG9ydCB2YXIgZ2V0VGV4dFNpemUgPSBmdW5jdGlvbiBnZXRUZXh0U2l6ZSh0ZXh0LCBmb250U2l6ZSkge1xuICB2YXIgd2lkdGggPSAwO1xuICB2YXIgcGF0dGVybiA9IG5ldyBSZWdFeHAoXCJbXFx1NEUwMC1cXHU5RkE1XStcIik7XG4gIHRleHQuc3BsaXQoJycpLmZvckVhY2goZnVuY3Rpb24gKGxldHRlcikge1xuICAgIGlmIChwYXR0ZXJuLnRlc3QobGV0dGVyKSkge1xuICAgICAgLy8g5Lit5paH5a2X56ymXG4gICAgICB3aWR0aCArPSBmb250U2l6ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgd2lkdGggKz0gZ2V0TGV0dGVyV2lkdGgobGV0dGVyLCBmb250U2l6ZSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIFt3aWR0aCwgZm9udFNpemVdO1xufTtcbi8qKlxuICogY29uc3RydWN0IHRoZSB0cmVlcyBmcm9tIGNvbWJvcyBkYXRhXG4gKiBAcGFyYW0gYXJyYXkgdGhlIGNvbWJvcyBhcnJheVxuICogQHBhcmFtIG5vZGVzIHRoZSBub2RlcyBhcnJheVxuICogQHJldHVybiB0aGUgdHJlZVxuICovXG5cbmV4cG9ydCB2YXIgcGxhaW5Db21ib3NUb1RyZWVzID0gZnVuY3Rpb24gcGxhaW5Db21ib3NUb1RyZWVzKGFycmF5LCBub2Rlcykge1xuICB2YXIgcmVzdWx0ID0gW107XG4gIHZhciBhZGRlZE1hcCA9IHt9O1xuICB2YXIgbW9kZWxNYXAgPSB7fTtcbiAgYXJyYXkuZm9yRWFjaChmdW5jdGlvbiAoZCkge1xuICAgIG1vZGVsTWFwW2QuaWRdID0gZDtcbiAgfSk7XG4gIGFycmF5LmZvckVhY2goZnVuY3Rpb24gKGQsIGkpIHtcbiAgICB2YXIgY2QgPSBjbG9uZShkKTtcbiAgICBjZC5pdGVtVHlwZSA9ICdjb21ibyc7XG4gICAgY2QuY2hpbGRyZW4gPSB1bmRlZmluZWQ7XG5cbiAgICBpZiAoY2QucGFyZW50SWQgPT09IGNkLmlkKSB7XG4gICAgICBjb25zb2xlLndhcm4oXCJUaGUgcGFyZW50SWQgZm9yIGNvbWJvIFwiICsgY2QuaWQgKyBcIiBjYW4gbm90IGJlIHRoZSBzYW1lIGFzIHRoZSBjb21ibydzIGlkXCIpO1xuICAgICAgZGVsZXRlIGNkLnBhcmVudElkO1xuICAgIH0gZWxzZSBpZiAoY2QucGFyZW50SWQgJiYgIW1vZGVsTWFwW2NkLnBhcmVudElkXSkge1xuICAgICAgY29uc29sZS53YXJuKFwiVGhlIHBhcmVudCBjb21ibyBmb3IgY29tYm8gXCIgKyBjZC5pZCArIFwiIGRvZXMgbm90IGV4aXN0IVwiKTtcbiAgICAgIGRlbGV0ZSBjZC5wYXJlbnRJZDtcbiAgICB9XG5cbiAgICB2YXIgbWFwcGVkT2JqID0gYWRkZWRNYXBbY2QuaWRdO1xuXG4gICAgaWYgKG1hcHBlZE9iaikge1xuICAgICAgY2QuY2hpbGRyZW4gPSBtYXBwZWRPYmouY2hpbGRyZW47XG4gICAgICBhZGRlZE1hcFtjZC5pZF0gPSBjZDtcbiAgICAgIG1hcHBlZE9iaiA9IGNkO1xuXG4gICAgICBpZiAoIW1hcHBlZE9iai5wYXJlbnRJZCkge1xuICAgICAgICByZXN1bHQucHVzaChtYXBwZWRPYmopO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBtYXBwZWRQYXJlbnQgPSBhZGRlZE1hcFttYXBwZWRPYmoucGFyZW50SWRdO1xuXG4gICAgICBpZiAobWFwcGVkUGFyZW50KSB7XG4gICAgICAgIGlmIChtYXBwZWRQYXJlbnQuY2hpbGRyZW4pIG1hcHBlZFBhcmVudC5jaGlsZHJlbi5wdXNoKGNkKTtlbHNlIG1hcHBlZFBhcmVudC5jaGlsZHJlbiA9IFtjZF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgcGFyZW50XzEgPSB7XG4gICAgICAgICAgaWQ6IG1hcHBlZE9iai5wYXJlbnRJZCxcbiAgICAgICAgICBjaGlsZHJlbjogW21hcHBlZE9ial1cbiAgICAgICAgfTtcbiAgICAgICAgYWRkZWRNYXBbbWFwcGVkT2JqLnBhcmVudElkXSA9IHBhcmVudF8xO1xuICAgICAgICBhZGRlZE1hcFtjZC5pZF0gPSBjZDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChpc1N0cmluZyhkLnBhcmVudElkKSkge1xuICAgICAgdmFyIHBhcmVudF8yID0gYWRkZWRNYXBbZC5wYXJlbnRJZF07XG5cbiAgICAgIGlmIChwYXJlbnRfMikge1xuICAgICAgICBpZiAocGFyZW50XzIuY2hpbGRyZW4pIHBhcmVudF8yLmNoaWxkcmVuLnB1c2goY2QpO2Vsc2UgcGFyZW50XzIuY2hpbGRyZW4gPSBbY2RdO1xuICAgICAgICBhZGRlZE1hcFtjZC5pZF0gPSBjZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBwYSA9IHtcbiAgICAgICAgICBpZDogZC5wYXJlbnRJZCxcbiAgICAgICAgICBjaGlsZHJlbjogW2NkXVxuICAgICAgICB9O1xuICAgICAgICBhZGRlZE1hcFtwYS5pZF0gPSBwYTtcbiAgICAgICAgYWRkZWRNYXBbY2QuaWRdID0gY2Q7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdC5wdXNoKGNkKTtcbiAgICAgIGFkZGVkTWFwW2NkLmlkXSA9IGNkO1xuICAgIH1cbiAgfSk7IC8vIHByb2NjZXNzIHRoZSBub2Rlc1xuXG4gIHZhciBub2RlTWFwID0ge307XG4gIChub2RlcyB8fCBbXSkuZm9yRWFjaChmdW5jdGlvbiAobm9kZSkge1xuICAgIG5vZGVNYXBbbm9kZS5pZF0gPSBub2RlO1xuICAgIHZhciBjb21ibyA9IGFkZGVkTWFwW25vZGUuY29tYm9JZF07XG5cbiAgICBpZiAoY29tYm8pIHtcbiAgICAgIHZhciBjbm9kZSA9IHtcbiAgICAgICAgaWQ6IG5vZGUuaWQsXG4gICAgICAgIGNvbWJvSWQ6IG5vZGUuY29tYm9JZFxuICAgICAgfTtcbiAgICAgIGlmIChjb21iby5jaGlsZHJlbikgY29tYm8uY2hpbGRyZW4ucHVzaChjbm9kZSk7ZWxzZSBjb21iby5jaGlsZHJlbiA9IFtjbm9kZV07XG4gICAgICBjbm9kZS5pdGVtVHlwZSA9ICdub2RlJztcbiAgICAgIGFkZGVkTWFwW25vZGUuaWRdID0gY25vZGU7XG4gICAgfVxuICB9KTsgLy8gYXNzaWduIHRoZSBkZXB0aCBmb3IgZWFjaCBlbGVtZW50XG5cbiAgdmFyIG1heERlcHRoID0gMDtcbiAgcmVzdWx0LmZvckVhY2goZnVuY3Rpb24gKHRyZWUpIHtcbiAgICB0cmVlLmRlcHRoID0gbWF4RGVwdGggKyAxMDtcbiAgICB0cmF2ZXJzZSh0cmVlLCBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgIHZhciBwYXJlbnQ7XG4gICAgICB2YXIgaXRlbVR5cGUgPSBhZGRlZE1hcFtjaGlsZC5pZF0uaXRlbVR5cGU7XG5cbiAgICAgIGlmIChpdGVtVHlwZSA9PT0gJ25vZGUnKSB7XG4gICAgICAgIHBhcmVudCA9IGFkZGVkTWFwW2NoaWxkLmNvbWJvSWRdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGFyZW50ID0gYWRkZWRNYXBbY2hpbGQucGFyZW50SWRdO1xuICAgICAgfVxuXG4gICAgICBpZiAocGFyZW50KSB7XG4gICAgICAgIGlmIChpdGVtVHlwZSA9PT0gJ25vZGUnKSBjaGlsZC5kZXB0aCA9IG1heERlcHRoICsgMTtlbHNlIGNoaWxkLmRlcHRoID0gbWF4RGVwdGggKyAxMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNoaWxkLmRlcHRoID0gbWF4RGVwdGggKyAxMDtcbiAgICAgIH1cblxuICAgICAgaWYgKG1heERlcHRoIDwgY2hpbGQuZGVwdGgpIG1heERlcHRoID0gY2hpbGQuZGVwdGg7XG4gICAgICB2YXIgb3JpTm9kZU1vZGVsID0gbm9kZU1hcFtjaGlsZC5pZF07XG5cbiAgICAgIGlmIChvcmlOb2RlTW9kZWwpIHtcbiAgICAgICAgb3JpTm9kZU1vZGVsLmRlcHRoID0gY2hpbGQuZGVwdGg7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5leHBvcnQgdmFyIHJlY29uc3RydWN0VHJlZSA9IGZ1bmN0aW9uIHJlY29uc3RydWN0VHJlZSh0cmVlcywgc3VidHJlZUlkLCBuZXdQYXJlbnRJZCkge1xuICB2YXIgYnJvdGhlcnMgPSB0cmVlcztcbiAgdmFyIHN1YnRyZWU7XG4gIHZhciBjb21ib0NoaWxkc01hcCA9IHtcbiAgICByb290OiB7XG4gICAgICBjaGlsZHJlbjogdHJlZXNcbiAgICB9XG4gIH07XG4gIHZhciBmb3VuZFN1YlRyZWUgPSBmYWxzZTtcbiAgdmFyIG9sZFBhcmVudElkID0gJ3Jvb3QnO1xuICAodHJlZXMgfHwgW10pLmZvckVhY2goZnVuY3Rpb24gKHRyZWUpIHtcbiAgICBpZiAoZm91bmRTdWJUcmVlKSByZXR1cm47XG5cbiAgICBpZiAodHJlZS5pZCA9PT0gc3VidHJlZUlkKSB7XG4gICAgICBzdWJ0cmVlID0gdHJlZTtcblxuICAgICAgaWYgKHRyZWUuaXRlbVR5cGUgPT09ICdjb21ibycpIHtcbiAgICAgICAgc3VidHJlZS5wYXJlbnRJZCA9IG5ld1BhcmVudElkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3VidHJlZS5jb21ib0lkID0gbmV3UGFyZW50SWQ7XG4gICAgICB9XG5cbiAgICAgIGZvdW5kU3ViVHJlZSA9IHRydWU7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdHJhdmVyc2VUcmVlKHRyZWUsIGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgY29tYm9DaGlsZHNNYXBbY2hpbGQuaWRdID0ge1xuICAgICAgICBjaGlsZHJlbjogY2hpbGQuY2hpbGRyZW5cbiAgICAgIH07IC8vIHN0b3JlIHRoZSBvbGQgcGFyZW50IGlkIHRvIGRlbGV0ZSB0aGUgc3VidHJlZSBmcm9tIHRoZSBvbGQgcGFyZW50J3MgY2hpbGRyZW4gaW4gbmV4dCByZWN1cnNpb25cblxuICAgICAgYnJvdGhlcnMgPSBjb21ib0NoaWxkc01hcFtjaGlsZC5wYXJlbnRJZCB8fCBjaGlsZC5jb21ib0lkIHx8ICdyb290J10uY2hpbGRyZW47XG5cbiAgICAgIGlmIChjaGlsZCAmJiAoY2hpbGQucmVtb3ZlZCB8fCBzdWJ0cmVlSWQgPT09IGNoaWxkLmlkKSAmJiBicm90aGVycykge1xuICAgICAgICBvbGRQYXJlbnRJZCA9IGNoaWxkLnBhcmVudElkIHx8IGNoaWxkLmNvbWJvSWQgfHwgJ3Jvb3QnO1xuICAgICAgICBzdWJ0cmVlID0gY2hpbGQ7IC8vIHJlLWFzc2lnbiB0aGUgcGFyZW50SWQgb3IgY29tYm9JZCBmb3IgdGhlIG1vdmVkIHN1YnRyZWVcblxuICAgICAgICBpZiAoY2hpbGQuaXRlbVR5cGUgPT09ICdjb21ibycpIHtcbiAgICAgICAgICBzdWJ0cmVlLnBhcmVudElkID0gbmV3UGFyZW50SWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3VidHJlZS5jb21ib0lkID0gbmV3UGFyZW50SWQ7XG4gICAgICAgIH1cblxuICAgICAgICBmb3VuZFN1YlRyZWUgPSB0cnVlO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuICB9KTtcbiAgYnJvdGhlcnMgPSBjb21ib0NoaWxkc01hcFtvbGRQYXJlbnRJZF0uY2hpbGRyZW47XG4gIHZhciBpbmRleCA9IGJyb3RoZXJzID8gYnJvdGhlcnMuaW5kZXhPZihzdWJ0cmVlKSA6IC0xO1xuICBpZiAoaW5kZXggPiAtMSkgYnJvdGhlcnMuc3BsaWNlKGluZGV4LCAxKTsgLy8g5aaC5p6c6YGN5Y6G5a6M5pW05qO15qCR6L+Y5rKh5pyJ5om+5Yiw77yM6K+05piO5LmL5YmN5bCx5LiN5Zyo5qCR5LitXG5cbiAgaWYgKCFmb3VuZFN1YlRyZWUpIHtcbiAgICBzdWJ0cmVlID0ge1xuICAgICAgaWQ6IHN1YnRyZWVJZCxcbiAgICAgIGl0ZW1UeXBlOiAnbm9kZScsXG4gICAgICBjb21ib0lkOiBuZXdQYXJlbnRJZFxuICAgIH07XG4gICAgY29tYm9DaGlsZHNNYXBbc3VidHJlZUlkXSA9IHtcbiAgICAgIGNoaWxkcmVuOiB1bmRlZmluZWRcbiAgICB9O1xuICB9IC8vIGFwcGVuZCB0byBuZXcgcGFyZW50XG5cblxuICBpZiAoc3VidHJlZUlkKSB7XG4gICAgdmFyIGZvdW5kXzEgPSBmYWxzZTsgLy8gbmV3UGFyZW50SWQgaXMgdW5kZWZpbmVkIG1lYW5zIHRoZSBzdWJ0cmVlIHdpbGwgaGF2ZSBubyBwYXJlbnRcblxuICAgIGlmIChuZXdQYXJlbnRJZCkge1xuICAgICAgdmFyIG5ld1BhcmVudERlcHRoXzEgPSAwO1xuICAgICAgKHRyZWVzIHx8IFtdKS5mb3JFYWNoKGZ1bmN0aW9uICh0cmVlKSB7XG4gICAgICAgIGlmIChmb3VuZF8xKSByZXR1cm47IC8vIHRlcm1pbmF0ZVxuXG4gICAgICAgIHRyYXZlcnNlVHJlZSh0cmVlLCBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgICAvLyBhcHBlbmQgc3VidHJlZSB0byB0aGUgbmV3IHBhcmVudCBhbnMgYXNzaWduIHRoZSBkZXB0aCB0byB0aGUgc3VidHJlZVxuICAgICAgICAgIGlmIChuZXdQYXJlbnRJZCA9PT0gY2hpbGQuaWQpIHtcbiAgICAgICAgICAgIGZvdW5kXzEgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKGNoaWxkLmNoaWxkcmVuKSBjaGlsZC5jaGlsZHJlbi5wdXNoKHN1YnRyZWUpO2Vsc2UgY2hpbGQuY2hpbGRyZW4gPSBbc3VidHJlZV07XG4gICAgICAgICAgICBuZXdQYXJlbnREZXB0aF8xID0gY2hpbGQuZGVwdGg7XG4gICAgICAgICAgICBpZiAoc3VidHJlZS5pdGVtVHlwZSA9PT0gJ25vZGUnKSBzdWJ0cmVlLmRlcHRoID0gbmV3UGFyZW50RGVwdGhfMSArIDI7ZWxzZSBzdWJ0cmVlLmRlcHRoID0gbmV3UGFyZW50RGVwdGhfMSArIDE7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIHRlcm1pbmF0ZVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoKCFuZXdQYXJlbnRJZCB8fCAhZm91bmRfMSkgJiYgc3VidHJlZS5pdGVtVHlwZSAhPT0gJ25vZGUnKSB7XG4gICAgICAvLyBpZiB0aGUgbmV3UGFyZW50SWQgaXMgdW5kZWZpbmVkIG9yIGl0IGlzIG5vdCBmb3VuZCBpbiB0aGUgdHJlZSwgYWRkIHRoZSBzdWJUcmVlIHRvIHRoZSByb290XG4gICAgICB0cmVlcy5wdXNoKHN1YnRyZWUpO1xuICAgIH0gLy8gdXBkYXRlIHRoZSBkZXB0aCBvZiB0aGUgc3VidHJlZSBhbmQgaXRzIGNoaWxkcmVuIGZyb20gdGhlIHN1YnRyZWVcblxuXG4gICAgdmFyIGN1cnJlbnREZXB0aF8xID0gc3VidHJlZS5kZXB0aDtcbiAgICB0cmF2ZXJzZVRyZWUoc3VidHJlZSwgZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICBpZiAoY2hpbGQuaXRlbVR5cGUgPT09ICdub2RlJykgY3VycmVudERlcHRoXzEgKz0gMjtlbHNlIGN1cnJlbnREZXB0aF8xICs9IDE7XG4gICAgICBjaGlsZC5kZXB0aCA9IGN1cnJlbnREZXB0aF8xO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gdHJlZXM7XG59O1xuZXhwb3J0IHZhciBnZXRDb21ib0JCb3ggPSBmdW5jdGlvbiBnZXRDb21ib0JCb3goY2hpbGRyZW4sIGdyYXBoKSB7XG4gIHZhciBjb21ib0JCb3ggPSB7XG4gICAgbWluWDogSW5maW5pdHksXG4gICAgbWluWTogSW5maW5pdHksXG4gICAgbWF4WDogLUluZmluaXR5LFxuICAgIG1heFk6IC1JbmZpbml0eSxcbiAgICB4OiB1bmRlZmluZWQsXG4gICAgeTogdW5kZWZpbmVkLFxuICAgIHdpZHRoOiB1bmRlZmluZWQsXG4gICAgaGVpZ2h0OiB1bmRlZmluZWQsXG4gICAgY2VudGVyWDogdW5kZWZpbmVkLFxuICAgIGNlbnRlclk6IHVuZGVmaW5lZFxuICB9O1xuXG4gIGlmICghY2hpbGRyZW4gfHwgY2hpbGRyZW4ubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIGNvbWJvQkJveDtcbiAgfVxuXG4gIGNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgdmFyIGNoaWxkSXRlbSA9IGdyYXBoLmZpbmRCeUlkKGNoaWxkLmlkKTtcbiAgICBpZiAoIWNoaWxkSXRlbSB8fCAhY2hpbGRJdGVtLmlzVmlzaWJsZSgpKSByZXR1cm47IC8vIGlnbm9yZSBoaWRkZW4gY2hpbGRyZW5cblxuICAgIGNoaWxkSXRlbS5zZXQoJ2Jib3hDYW52YXNDYWNoZScsIHVuZGVmaW5lZCk7XG4gICAgdmFyIGNoaWxkQkJveCA9IGNoaWxkSXRlbS5nZXRDYW52YXNCQm94KCk7XG4gICAgaWYgKGNoaWxkQkJveC54ICYmIGNvbWJvQkJveC5taW5YID4gY2hpbGRCQm94Lm1pblgpIGNvbWJvQkJveC5taW5YID0gY2hpbGRCQm94Lm1pblg7XG4gICAgaWYgKGNoaWxkQkJveC55ICYmIGNvbWJvQkJveC5taW5ZID4gY2hpbGRCQm94Lm1pblkpIGNvbWJvQkJveC5taW5ZID0gY2hpbGRCQm94Lm1pblk7XG4gICAgaWYgKGNoaWxkQkJveC54ICYmIGNvbWJvQkJveC5tYXhYIDwgY2hpbGRCQm94Lm1heFgpIGNvbWJvQkJveC5tYXhYID0gY2hpbGRCQm94Lm1heFg7XG4gICAgaWYgKGNoaWxkQkJveC55ICYmIGNvbWJvQkJveC5tYXhZIDwgY2hpbGRCQm94Lm1heFkpIGNvbWJvQkJveC5tYXhZID0gY2hpbGRCQm94Lm1heFk7XG4gIH0pO1xuICBjb21ib0JCb3gueCA9IChjb21ib0JCb3gubWluWCArIGNvbWJvQkJveC5tYXhYKSAvIDI7XG4gIGNvbWJvQkJveC55ID0gKGNvbWJvQkJveC5taW5ZICsgY29tYm9CQm94Lm1heFkpIC8gMjtcbiAgY29tYm9CQm94LndpZHRoID0gY29tYm9CQm94Lm1heFggLSBjb21ib0JCb3gubWluWDtcbiAgY29tYm9CQm94LmhlaWdodCA9IGNvbWJvQkJveC5tYXhZIC0gY29tYm9CQm94Lm1pblk7XG4gIGNvbWJvQkJveC5jZW50ZXJYID0gKGNvbWJvQkJveC5taW5YICsgY29tYm9CQm94Lm1heFgpIC8gMjtcbiAgY29tYm9CQm94LmNlbnRlclkgPSAoY29tYm9CQm94Lm1pblkgKyBjb21ib0JCb3gubWF4WSkgLyAyO1xuICBPYmplY3Qua2V5cyhjb21ib0JCb3gpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgIGlmIChjb21ib0JCb3hba2V5XSA9PT0gSW5maW5pdHkgfHwgY29tYm9CQm94W2tleV0gPT09IC1JbmZpbml0eSkge1xuICAgICAgY29tYm9CQm94W2tleV0gPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGNvbWJvQkJveDtcbn07XG5leHBvcnQgdmFyIHNob3VsZFJlZnJlc2hFZGdlID0gZnVuY3Rpb24gc2hvdWxkUmVmcmVzaEVkZ2UoY2ZnKSB7XG4gIHZhciByZWZyZXNoRWRnZSA9IGlzTnVtYmVyKGNmZy54KSB8fCBpc051bWJlcihjZmcueSkgfHwgY2ZnLnR5cGUgfHwgY2ZnLmFuY2hvclBvaW50cyB8fCBjZmcuc2l6ZTtcbiAgaWYgKGNmZy5zdHlsZSkgcmVmcmVzaEVkZ2UgPSByZWZyZXNoRWRnZSB8fCBpc051bWJlcihjZmcuc3R5bGUucikgfHwgaXNOdW1iZXIoY2ZnLnN0eWxlLndpZHRoKSB8fCBpc051bWJlcihjZmcuc3R5bGUuaGVpZ2h0KSB8fCBpc051bWJlcihjZmcuc3R5bGUucngpIHx8IGlzTnVtYmVyKGNmZy5zdHlsZS5yeSk7XG4gIHJldHVybiByZWZyZXNoRWRnZTtcbn07XG5leHBvcnQgdmFyIGNsb25lQmVzaWRlc0ltZyA9IGZ1bmN0aW9uIGNsb25lQmVzaWRlc0ltZyhvYmopIHtcbiAgdmFyIGNsb25lZE9iaiA9IHt9O1xuICBPYmplY3Qua2V5cyhvYmopLmZvckVhY2goZnVuY3Rpb24gKGtleTEpIHtcbiAgICB2YXIgb2JqMiA9IG9ialtrZXkxXTtcblxuICAgIGlmIChpc09iamVjdChvYmoyKSAmJiAhaXNBcnJheShvYmoyKSkge1xuICAgICAgdmFyIGNsb25lZE9iajJfMSA9IHt9O1xuICAgICAgT2JqZWN0LmtleXMob2JqMikuZm9yRWFjaChmdW5jdGlvbiAoa2V5Mikge1xuICAgICAgICB2YXIgdiA9IG9iajJba2V5Ml07XG4gICAgICAgIGlmIChrZXkyID09PSAnaW1nJyAmJiAhaXNTdHJpbmcodikpIHJldHVybjtcbiAgICAgICAgY2xvbmVkT2JqMl8xW2tleTJdID0gY2xvbmUodik7XG4gICAgICB9KTtcbiAgICAgIGNsb25lZE9ialtrZXkxXSA9IGNsb25lZE9iajJfMTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2xvbmVkT2JqW2tleTFdID0gY2xvbmUob2JqMik7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGNsb25lZE9iajtcbn07IiwiaW1wb3J0IHsgX19zcHJlYWRBcnJheSB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgaXNTdHJpbmcgfSBmcm9tICdAYW50di91dGlsJztcbmltcG9ydCB7IHRyYXZlcnNlVHJlZSB9IGZyb20gJy4vZ3JhcGhpYyc7XG4vKipcbiAqIOmqjOivgeWFs+ezu+WbvuaIluagkeWbvuaVsOaNrueahOWQiOazleaAp++8jOW/hemhu+espuWQiOS7peS4i+inhOWImeaJjeS8mua4suafk+Wbvu+8mlxuICogMS4g5b+F6aG75Lyg5YWl5pWw5o2uXG4gKiAyLiDoioLngrnnmoQgSUQg5b+F6aG75Li65a2X56ym5Liy77yM5pqC5LiN5pSv5oyB5pWw5a2X57G75Z6L77yM5aaC5p6c5pSv5oyB5pWw5a2X57G75Z6L77yM5Lya5Ye6546w57G75Ly8IDEyMyDkuI4gJzEyMycg5piv5ZCm55u4562J55qE6Zeu6aKYXG4gKiAzLiDovrnnmoQgc291cmNlIOWSjCB0YXJnZXQg5YC85b+F6aG75Zyo6IqC54K5IElEIOS4reWtmOWcqFxuICogQHBhcmFtIGRhdGEg5YWz57O75Zu+5oiW5qCR5Zu+5pWw5o2uXG4gKiBAcmV0dXJuIGJvb2xlYW4g5YWo6YOo6aqM6K+B6YCa6L+H6L+U5ZueIHRydWXvvIzlkKbliJnov5Tlm54gZmFsc2VcbiAqL1xuXG5leHBvcnQgdmFyIGRhdGFWYWxpZGF0aW9uID0gZnVuY3Rpb24gZGF0YVZhbGlkYXRpb24oZGF0YSkge1xuICB2YXIgX2E7IC8vIDEuIOW/hemhu+S8oOWFpeaVsOaNrlxuXG5cbiAgaWYgKCFkYXRhKSB7XG4gICAgY29uc29sZS5lcnJvcignRzYgRXJyb3IgVGlwczogdGhlIGRhdGEgbXVzdCBiZSBkZWZpbmVkJyk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IC8vIDIuIOiKgueCueeahCBJRCDlv4XpobvkuLrlrZfnrKbkuLLmiJbmlbDlrZfnsbvlnotcblxuXG4gIHZhciBub2RlcyA9IGRhdGEubm9kZXMsXG4gICAgICBlZGdlcyA9IGRhdGEuZWRnZXMsXG4gICAgICBfYiA9IGRhdGEuY29tYm9zLFxuICAgICAgY29tYm9zID0gX2IgPT09IHZvaWQgMCA/IFtdIDogX2I7XG5cbiAgaWYgKCFub2RlcyAmJiAhZWRnZXMpIHtcbiAgICB2YXIgdmFsaWRhdGVkXzEgPSB0cnVlOyAvLyDkuI3lrZjlnKggbm9kZXMg5ZKMIGVkZ2Vz77yM5YiZ6K+05piO5pivIFRyZWVHcmFwaERhdGHvvIzmjIkgVHJlZUdyYXBoRGF0YSDop4TliJnpqozor4FcblxuICAgIHRyYXZlcnNlVHJlZShkYXRhLCBmdW5jdGlvbiAocGFyYW0pIHtcbiAgICAgIGlmICghaXNTdHJpbmcocGFyYW0uaWQpKSB7XG4gICAgICAgIHZhbGlkYXRlZF8xID0gZmFsc2U7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG4gICAgcmV0dXJuIHZhbGlkYXRlZF8xO1xuICB9XG5cbiAgdmFyIG5vbk5vZGUgPSAobm9kZXMgfHwgW10pLmZpbmQoZnVuY3Rpb24gKG5vZGUpIHtcbiAgICByZXR1cm4gIWlzU3RyaW5nKG5vZGUuaWQpO1xuICB9KTtcblxuICBpZiAobm9uTm9kZSkge1xuICAgIGNvbnNvbGUud2FybihcIkc2IFdhcm5pbmcgVGlwczogbWlzc2luZyAnaWQnIHByb3BlcnR5LCBvciAlY1wiICsgbm9uTm9kZS5pZCArIFwiJWMgaXMgbm90IGEgc3RyaW5nLlwiLCAnZm9udC1zaXplOiAyMHB4OyBjb2xvcjogcmVkOycsICcnKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gLy8gMy4g6L6555qEIHNvdXJjZSDlkowgdGFyZ2V0IOW/hemhu+WtmOWcqOS6juiKgueCuSDmiJYgQ29tYm/kuK1cblxuXG4gIHZhciBub2RlSWRzID0gKG5vZGVzIHx8IFtdKS5tYXAoZnVuY3Rpb24gKG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS5pZDtcbiAgfSk7XG4gIHZhciBjb21ib0lkcyA9IChfYSA9IGNvbWJvcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLm1hcChmdW5jdGlvbiAoY29tYm8pIHtcbiAgICByZXR1cm4gY29tYm8uaWQ7XG4gIH0pO1xuXG4gIHZhciBpZHMgPSBfX3NwcmVhZEFycmF5KF9fc3ByZWFkQXJyYXkoW10sIG5vZGVJZHMsIHRydWUpLCBjb21ib0lkcywgdHJ1ZSk7XG5cbiAgdmFyIG5vbkVkZ2VzID0gKGVkZ2VzIHx8IFtdKS5maW5kKGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgcmV0dXJuICFpZHMuaW5jbHVkZXMoZWRnZS5zb3VyY2UpIHx8ICFpZHMuaW5jbHVkZXMoZWRnZS50YXJnZXQpO1xuICB9KTtcblxuICBpZiAobm9uRWRnZXMpIHtcbiAgICBjb25zb2xlLndhcm4oXCJHNiBXYXJuaW5nIFRpcHM6IFRoZSBzb3VyY2UgJWNcIiArIG5vbkVkZ2VzLnNvdXJjZSArIFwiJWMgb3IgdGhlIHRhcmdldCAlY1wiICsgbm9uRWRnZXMudGFyZ2V0ICsgXCIlYyBvZiB0aGUgZWRnZSBkbyBub3QgZXhpc3QgaW4gdGhlIG5vZGVzIG9yIGNvbWJvcy5cIiwgJ2ZvbnQtc2l6ZTogMjBweDsgY29sb3I6IHJlZDsnLCAnJywgJ2ZvbnQtc2l6ZTogMjBweDsgY29sb3I6IHJlZDsnLCAnJyk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuLyoqXG4gKiDpqozor4Hmt7vliqDoioLngrnjgIHovrnmiJbku45jb21ib+aXtueahOaVsOaNrlxuICogQHBhcmFtIHR5cGUg6IqC54K544CB6L655oiW5LuOY29tYm9cbiAqIEBwYXJhbSBkYXRhIOa3u+WKoOeahOWNleadoeaVsOaNrlxuICogQHJldHVybiBib29sZWFuIOWFqOmDqOmqjOivgemAmui/h+i/lOWbniB0cnVl77yM5ZCm5YiZ6L+U5ZueIGZhbHNlXG4gKi9cblxuZXhwb3J0IHZhciBzaW5nbGVEYXRhVmFsaWRhdGlvbiA9IGZ1bmN0aW9uIHNpbmdsZURhdGFWYWxpZGF0aW9uKHR5cGUsIGRhdGEpIHtcbiAgaWYgKHR5cGUgPT09ICdub2RlJyB8fCB0eXBlID09PSAnY29tYm8nKSB7XG4gICAgLy8g5b+F6aG75pyJIGlkIOWtl+aute+8jOS4lGlk5b+F6aG75Li65a2X56ym5Liy57G75Z6LXG4gICAgaWYgKGRhdGEuaWQgJiYgIWlzU3RyaW5nKGRhdGEuaWQpKSB7XG4gICAgICBjb25zb2xlLndhcm4oXCJHNiBXYXJuaW5nIFRpcHM6IG1pc3NpbmcgJ2lkJyBwcm9wZXJ0eSwgb3IgdGhlICdpZCcgJWNcIiArIGRhdGEuaWQgKyBcIiVjIGlzIG5vdCBhIHN0cmluZy5cIiwgJ2ZvbnQtc2l6ZTogMjBweDsgY29sb3I6IHJlZDsnLCAnJyk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGUgPT09ICdlZGdlJykge1xuICAgIC8vIOW/hemhu+aciSBzb3VyY2Ug5ZKMIHRhcmdldCDlrZfmrrVcbiAgICBpZiAoIWRhdGEuc291cmNlIHx8ICFkYXRhLnRhcmdldCkge1xuICAgICAgY29uc29sZS53YXJuKFwiRzYgV2FybmluZyBUaXBzOiBtaXNzaW5nICdzb3VyY2UnIG9yICd0YXJnZXQnIGZvciB0aGUgZWRnZS5cIik7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59OyIsImltcG9ydCB7IGVhY2gsIGlzQXJyYXksIGlzU3RyaW5nIH0gZnJvbSAnQGFudHYvdXRpbCc7XG5pbXBvcnQgQmVoYXZpb3IgZnJvbSAnLi4vLi4vYmVoYXZpb3IvYmVoYXZpb3InO1xuXG52YXIgTW9kZUNvbnRyb2xsZXIgPVxuLyoqIEBjbGFzcyAqL1xuZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBNb2RlQ29udHJvbGxlcihncmFwaCkge1xuICAgIHRoaXMuZ3JhcGggPSBncmFwaDtcbiAgICB0aGlzLmRlc3Ryb3llZCA9IGZhbHNlO1xuICAgIHRoaXMubW9kZXMgPSBncmFwaC5nZXQoJ21vZGVzJykgfHwge1xuICAgICAgZGVmYXVsdDogW11cbiAgICB9O1xuICAgIHRoaXMuZm9ybWF0TW9kZXMoKTtcbiAgICB0aGlzLm1vZGUgPSBncmFwaC5nZXQoJ2RlZmF1bHRNb2RlJykgfHwgJ2RlZmF1bHQnO1xuICAgIHRoaXMuY3VycmVudEJlaGF2ZXMgPSBbXTtcbiAgICB0aGlzLnNldE1vZGUodGhpcy5tb2RlKTtcbiAgfVxuXG4gIE1vZGVDb250cm9sbGVyLnByb3RvdHlwZS5mb3JtYXRNb2RlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgbW9kZXMgPSB0aGlzLm1vZGVzO1xuICAgIGVhY2gobW9kZXMsIGZ1bmN0aW9uIChtb2RlKSB7XG4gICAgICBlYWNoKG1vZGUsIGZ1bmN0aW9uIChiZWhhdmlvciwgaSkge1xuICAgICAgICBpZiAoaXNTdHJpbmcoYmVoYXZpb3IpKSB7XG4gICAgICAgICAgbW9kZVtpXSA9IHtcbiAgICAgICAgICAgIHR5cGU6IGJlaGF2aW9yXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG5cbiAgTW9kZUNvbnRyb2xsZXIucHJvdG90eXBlLnNldEJlaGF2aW9ycyA9IGZ1bmN0aW9uIChtb2RlKSB7XG4gICAgdmFyIGdyYXBoID0gdGhpcy5ncmFwaDtcbiAgICB2YXIgYmVoYXZpb3JzID0gdGhpcy5tb2Rlc1ttb2RlXTtcbiAgICB2YXIgYmVoYXZlcyA9IFtdO1xuICAgIHZhciBiZWhhdmU7XG4gICAgZWFjaChiZWhhdmlvcnMgfHwgW10sIGZ1bmN0aW9uIChiZWhhdmlvcikge1xuICAgICAgdmFyIEJlaGF2aW9ySW5zdGFuY2UgPSBCZWhhdmlvci5nZXRCZWhhdmlvcihiZWhhdmlvci50eXBlIHx8IGJlaGF2aW9yKTtcblxuICAgICAgaWYgKCFCZWhhdmlvckluc3RhbmNlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgYmVoYXZlID0gbmV3IEJlaGF2aW9ySW5zdGFuY2UoYmVoYXZpb3IpO1xuXG4gICAgICBpZiAoYmVoYXZlKSB7XG4gICAgICAgIGJlaGF2ZS5iaW5kKGdyYXBoKTtcbiAgICAgICAgYmVoYXZlcy5wdXNoKGJlaGF2ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5jdXJyZW50QmVoYXZlcyA9IGJlaGF2ZXM7XG4gIH07XG5cbiAgTW9kZUNvbnRyb2xsZXIubWVyZ2VCZWhhdmlvcnMgPSBmdW5jdGlvbiAobW9kZUJlaGF2aW9ycywgYmVoYXZpb3JzKSB7XG4gICAgZWFjaChiZWhhdmlvcnMsIGZ1bmN0aW9uIChiZWhhdmlvcikge1xuICAgICAgaWYgKG1vZGVCZWhhdmlvcnMuaW5kZXhPZihiZWhhdmlvcikgPCAwKSB7XG4gICAgICAgIGlmIChpc1N0cmluZyhiZWhhdmlvcikpIHtcbiAgICAgICAgICBiZWhhdmlvciA9IHtcbiAgICAgICAgICAgIHR5cGU6IGJlaGF2aW9yXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIG1vZGVCZWhhdmlvcnMucHVzaChiZWhhdmlvcik7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIG1vZGVCZWhhdmlvcnM7XG4gIH07XG5cbiAgTW9kZUNvbnRyb2xsZXIuZmlsdGVyQmVoYXZpb3JzID0gZnVuY3Rpb24gKG1vZGVCZWhhdmlvcnMsIGJlaGF2aW9ycykge1xuICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICBtb2RlQmVoYXZpb3JzLmZvckVhY2goZnVuY3Rpb24gKGJlaGF2aW9yKSB7XG4gICAgICB2YXIgdHlwZSA9ICcnO1xuXG4gICAgICBpZiAoaXNTdHJpbmcoYmVoYXZpb3IpKSB7XG4gICAgICAgIHR5cGUgPSBiZWhhdmlvcjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItZGVzdHJ1Y3R1cmluZ1xuICAgICAgICB0eXBlID0gYmVoYXZpb3IudHlwZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGJlaGF2aW9ycy5pbmRleE9mKHR5cGUpIDwgMCkge1xuICAgICAgICByZXN1bHQucHVzaChiZWhhdmlvcik7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICBNb2RlQ29udHJvbGxlci5wcm90b3R5cGUuc2V0TW9kZSA9IGZ1bmN0aW9uIChtb2RlKSB7XG4gICAgdmFyIF9hID0gdGhpcyxcbiAgICAgICAgbW9kZXMgPSBfYS5tb2RlcyxcbiAgICAgICAgZ3JhcGggPSBfYS5ncmFwaDtcblxuICAgIHZhciBjdXJyZW50ID0gbW9kZTtcbiAgICB2YXIgYmVoYXZpb3JzID0gbW9kZXNbY3VycmVudF07XG5cbiAgICBpZiAoIWJlaGF2aW9ycykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGdyYXBoLmVtaXQoJ2JlZm9yZW1vZGVjaGFuZ2UnLCB7XG4gICAgICBtb2RlOiBtb2RlXG4gICAgfSk7XG4gICAgZWFjaCh0aGlzLmN1cnJlbnRCZWhhdmVzLCBmdW5jdGlvbiAoYmVoYXZlKSB7XG4gICAgICBpZiAoYmVoYXZlLmRlbGVnYXRlKSBiZWhhdmUuZGVsZWdhdGUucmVtb3ZlKCk7XG4gICAgICBiZWhhdmUudW5iaW5kKGdyYXBoKTtcbiAgICB9KTtcbiAgICB0aGlzLnNldEJlaGF2aW9ycyhjdXJyZW50KTtcbiAgICBncmFwaC5lbWl0KCdhZnRlcm1vZGVjaGFuZ2UnLCB7XG4gICAgICBtb2RlOiBtb2RlXG4gICAgfSk7XG4gICAgdGhpcy5tb2RlID0gbW9kZTtcbiAgfTtcblxuICBNb2RlQ29udHJvbGxlci5wcm90b3R5cGUuZ2V0TW9kZSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5tb2RlO1xuICB9O1xuICAvKipcbiAgICog5Yqo5oCB5aKe5Yqg5oiW5Yig6ZmkIEJlaGF2aW9yXG4gICAqXG4gICAqIEBwYXJhbSB7TW9kZVR5cGVbXX0gYmVoYXZpb3JzXG4gICAqIEBwYXJhbSB7KE1vZGVUeXBlW10gfCBNb2RlVHlwZSl9IG1vZGVzXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNBZGRcbiAgICogQHJldHVybnMge01vZGV9XG4gICAqIEBtZW1iZXJvZiBNb2RlXG4gICAqL1xuXG5cbiAgTW9kZUNvbnRyb2xsZXIucHJvdG90eXBlLm1hbmlwdWxhdGVCZWhhdmlvcnMgPSBmdW5jdGlvbiAoYmVoYXZpb3JzLCBtb2RlcywgaXNBZGQpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdmFyIGJlaGF2ZXM7XG5cbiAgICBpZiAoIWlzQXJyYXkoYmVoYXZpb3JzKSkge1xuICAgICAgYmVoYXZlcyA9IFtiZWhhdmlvcnNdO1xuICAgIH0gZWxzZSB7XG4gICAgICBiZWhhdmVzID0gYmVoYXZpb3JzO1xuICAgIH1cblxuICAgIGlmIChpc0FycmF5KG1vZGVzKSkge1xuICAgICAgZWFjaChtb2RlcywgZnVuY3Rpb24gKG1vZGUpIHtcbiAgICAgICAgaWYgKCFfdGhpcy5tb2Rlc1ttb2RlXSkge1xuICAgICAgICAgIGlmIChpc0FkZCkge1xuICAgICAgICAgICAgX3RoaXMubW9kZXNbbW9kZV0gPSBiZWhhdmVzO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChpc0FkZCkge1xuICAgICAgICAgIF90aGlzLm1vZGVzW21vZGVdID0gTW9kZUNvbnRyb2xsZXIubWVyZ2VCZWhhdmlvcnMoX3RoaXMubW9kZXNbbW9kZV0gfHwgW10sIGJlaGF2ZXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIF90aGlzLm1vZGVzW21vZGVdID0gTW9kZUNvbnRyb2xsZXIuZmlsdGVyQmVoYXZpb3JzKF90aGlzLm1vZGVzW21vZGVdIHx8IFtdLCBiZWhhdmVzKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICB2YXIgY3VycmVudE1vZGUgPSBtb2RlcztcblxuICAgIGlmICghbW9kZXMpIHtcbiAgICAgIGN1cnJlbnRNb2RlID0gdGhpcy5tb2RlOyAvLyBpc1N0cmluZyh0aGlzLm1vZGUpID8gdGhpcy5tb2RlIDogdGhpcy5tb2RlLnR5cGVcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMubW9kZXNbY3VycmVudE1vZGVdKSB7XG4gICAgICBpZiAoaXNBZGQpIHtcbiAgICAgICAgdGhpcy5tb2Rlc1tjdXJyZW50TW9kZV0gPSBiZWhhdmVzO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpc0FkZCkge1xuICAgICAgdGhpcy5tb2Rlc1tjdXJyZW50TW9kZV0gPSBNb2RlQ29udHJvbGxlci5tZXJnZUJlaGF2aW9ycyh0aGlzLm1vZGVzW2N1cnJlbnRNb2RlXSB8fCBbXSwgYmVoYXZlcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubW9kZXNbY3VycmVudE1vZGVdID0gTW9kZUNvbnRyb2xsZXIuZmlsdGVyQmVoYXZpb3JzKHRoaXMubW9kZXNbY3VycmVudE1vZGVdIHx8IFtdLCBiZWhhdmVzKTtcbiAgICB9XG5cbiAgICB0aGlzLmZvcm1hdE1vZGVzKCk7XG4gICAgdGhpcy5zZXRNb2RlKHRoaXMubW9kZSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG4gIC8qKlxuICAgKiDmm7TmlrDooYzkuLrlj4LmlbBcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBNb2RlT3B0aW9uIHwgTW9kZVR5cGV9IGJlaGF2aW9yIOmcgOimgeabtOaWsOeahOihjOS4ulxuICAgKiBAcGFyYW0ge3N0cmluZyB8IHN0cmluZ1tdfSBtb2RlcyDmjIflrprnmoTmqKHlvI/kuK3nmoTooYzkuLrvvIzkuI3mjIflrprliJnkuLogZGVmYXVsdFxuICAgKiBAcmV0dXJuIHtHcmFwaH0gR3JhcGhcbiAgICovXG5cblxuICBNb2RlQ29udHJvbGxlci5wcm90b3R5cGUudXBkYXRlQmVoYXZpb3IgPSBmdW5jdGlvbiAoYmVoYXZpb3IsIG5ld0NmZywgbW9kZSkge1xuICAgIGlmIChpc1N0cmluZyhiZWhhdmlvcikpIHtcbiAgICAgIGJlaGF2aW9yID0ge1xuICAgICAgICB0eXBlOiBiZWhhdmlvclxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgYmVoYXZpb3JTZXQgPSBbXTtcblxuICAgIGlmICghbW9kZSB8fCBtb2RlID09PSB0aGlzLm1vZGUgfHwgbW9kZSA9PT0gJ2RlZmF1bHQnKSB7XG4gICAgICBiZWhhdmlvclNldCA9IHRoaXMuY3VycmVudEJlaGF2ZXM7XG5cbiAgICAgIGlmICghYmVoYXZpb3JTZXQgfHwgIWJlaGF2aW9yU2V0Lmxlbmd0aCkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1VwZGF0ZSBiZWhhdmlvciBmYWlsZWQhIFRoZXJlIGlzIG5vIGJlaGF2aW9ycyBpbiB0aGlzIG1vZGUgb24gdGhlIGdyYXBoLicpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgdmFyIGxlbmd0aF8xID0gYmVoYXZpb3JTZXQubGVuZ3RoO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aF8xOyBpKyspIHtcbiAgICAgICAgdmFyIGJlaGF2ZSA9IGJlaGF2aW9yU2V0W2ldO1xuXG4gICAgICAgIGlmIChiZWhhdmUudHlwZSA9PT0gYmVoYXZpb3IudHlwZSkge1xuICAgICAgICAgIGJlaGF2ZS51cGRhdGVDZmcobmV3Q2ZnKTtcbiAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpID09PSBsZW5ndGhfMSAtIDEpIGNvbnNvbGUud2FybignVXBkYXRlIGJlaGF2aW9yIGZhaWxlZCEgVGhlcmUgaXMgbm8gc3VjaCBiZWhhdmlvciBpbiB0aGUgbW9kZScpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBiZWhhdmlvclNldCA9IHRoaXMubW9kZXNbbW9kZV07XG5cbiAgICAgIGlmICghYmVoYXZpb3JTZXQgfHwgIWJlaGF2aW9yU2V0Lmxlbmd0aCkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1VwZGF0ZSBiZWhhdmlvciBmYWlsZWQhIFRoZXJlIGlzIG5vIGJlaGF2aW9ycyBpbiB0aGlzIG1vZGUgb24gdGhlIGdyYXBoLicpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgdmFyIGxlbmd0aF8yID0gYmVoYXZpb3JTZXQubGVuZ3RoO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aF8yOyBpKyspIHtcbiAgICAgICAgdmFyIGJlaGF2ZSA9IGJlaGF2aW9yU2V0W2ldO1xuXG4gICAgICAgIGlmIChiZWhhdmUudHlwZSA9PT0gYmVoYXZpb3IudHlwZSB8fCBiZWhhdmUgPT09IGJlaGF2aW9yLnR5cGUpIHtcbiAgICAgICAgICBpZiAoYmVoYXZlID09PSBiZWhhdmlvci50eXBlKSBiZWhhdmUgPSB7XG4gICAgICAgICAgICB0eXBlOiBiZWhhdmVcbiAgICAgICAgICB9O1xuICAgICAgICAgIE9iamVjdC5hc3NpZ24oYmVoYXZlLCBuZXdDZmcpO1xuICAgICAgICAgIGJlaGF2aW9yU2V0W2ldID0gYmVoYXZlO1xuICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGkgPT09IGxlbmd0aF8yIC0gMSkgY29uc29sZS53YXJuKCdVcGRhdGUgYmVoYXZpb3IgZmFpbGVkISBUaGVyZSBpcyBubyBzdWNoIGJlaGF2aW9yIGluIHRoZSBtb2RlJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgTW9kZUNvbnRyb2xsZXIucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5ncmFwaCA9IG51bGw7XG4gICAgdGhpcy5tb2RlcyA9IG51bGw7XG4gICAgdGhpcy5jdXJyZW50QmVoYXZlcyA9IG51bGw7XG4gICAgdGhpcy5kZXN0cm95ZWQgPSB0cnVlO1xuICB9O1xuXG4gIHJldHVybiBNb2RlQ29udHJvbGxlcjtcbn0oKTtcblxuZXhwb3J0IGRlZmF1bHQgTW9kZUNvbnRyb2xsZXI7IiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBFdmVudCBhcyBHcmFwaEV2ZW50IH0gZnJvbSAnQGFudHYvZy1iYXNlJztcblxudmFyIEc2R3JhcGhFdmVudCA9XG4vKiogQGNsYXNzICovXG5mdW5jdGlvbiAoX3N1cGVyKSB7XG4gIF9fZXh0ZW5kcyhHNkdyYXBoRXZlbnQsIF9zdXBlcik7XG5cbiAgZnVuY3Rpb24gRzZHcmFwaEV2ZW50KHR5cGUsIGV2ZW50KSB7XG4gICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgdHlwZSwgZXZlbnQpIHx8IHRoaXM7XG5cbiAgICBfdGhpcy5pdGVtID0gZXZlbnQuaXRlbTtcbiAgICBfdGhpcy5jYW52YXNYID0gZXZlbnQuY2FudmFzWDtcbiAgICBfdGhpcy5jYW52YXNZID0gZXZlbnQuY2FudmFzWTtcbiAgICBfdGhpcy53aGVlbERlbHRhID0gZXZlbnQud2hlZWxEZWx0YTtcbiAgICBfdGhpcy5kZXRhaWwgPSBldmVudC5kZXRhaWw7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgcmV0dXJuIEc2R3JhcGhFdmVudDtcbn0oR3JhcGhFdmVudCk7XG5cbmV4cG9ydCB7IEc2R3JhcGhFdmVudCB9OyIsImltcG9ydCB7IGlzU3RyaW5nLCBpc051bWJlciwgaXNBcnJheSB9IGZyb20gJ0BhbnR2L3V0aWwnO1xuaW1wb3J0IHsgRzZHcmFwaEV2ZW50IH0gZnJvbSAnLi4vaW50ZXJmYWNlL2JlaGF2aW9yJztcbmV4cG9ydCB2YXIgdW5pcXVlSWQgPSBmdW5jdGlvbiB1bmlxdWVJZCh0eXBlKSB7XG4gIHJldHVybiB0eXBlICsgXCItXCIgKyBNYXRoLnJhbmRvbSgpICsgRGF0ZS5ub3coKTtcbn07XG4vKipcbiAqIHR1cm4gcGFkZGluZyBpbnRvIFt0b3AsIHJpZ2h0LCBib3R0b20sIHJpZ2h0XVxuICogQHBhcmFtICB7TnVtYmVyfEFycmF5fSBwYWRkaW5nIGlucHV0IHBhZGRpbmdcbiAqIEByZXR1cm4ge2FycmF5fSBvdXRwdXRcbiAqL1xuXG5leHBvcnQgdmFyIGZvcm1hdFBhZGRpbmcgPSBmdW5jdGlvbiBmb3JtYXRQYWRkaW5nKHBhZGRpbmcpIHtcbiAgaWYgKGlzQXJyYXkocGFkZGluZykpIHtcbiAgICBzd2l0Y2ggKHBhZGRpbmcubGVuZ3RoKSB7XG4gICAgICBjYXNlIDQ6XG4gICAgICAgIHJldHVybiBwYWRkaW5nO1xuXG4gICAgICBjYXNlIDM6XG4gICAgICAgIHBhZGRpbmcucHVzaChwYWRkaW5nWzFdKTtcbiAgICAgICAgcmV0dXJuIHBhZGRpbmc7XG5cbiAgICAgIGNhc2UgMjpcbiAgICAgICAgcmV0dXJuIHBhZGRpbmcuY29uY2F0KHBhZGRpbmcpO1xuXG4gICAgICBjYXNlIDE6XG4gICAgICAgIHJldHVybiBbcGFkZGluZ1swXSwgcGFkZGluZ1swXSwgcGFkZGluZ1swXSwgcGFkZGluZ1swXV07XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBbMCwgMCwgMCwgMF07XG4gICAgfVxuICB9XG5cbiAgaWYgKGlzTnVtYmVyKHBhZGRpbmcpKSB7XG4gICAgcmV0dXJuIFtwYWRkaW5nLCBwYWRkaW5nLCBwYWRkaW5nLCBwYWRkaW5nXTtcbiAgfSBlbHNlIGlmIChpc1N0cmluZyhwYWRkaW5nKSkge1xuICAgIHZhciBpbnRQYWRkaW5nID0gcGFyc2VJbnQocGFkZGluZywgMTApO1xuICAgIHJldHVybiBbaW50UGFkZGluZywgaW50UGFkZGluZywgaW50UGFkZGluZywgaW50UGFkZGluZ107XG4gIH1cblxuICByZXR1cm4gWzAsIDAsIDAsIDBdO1xufTtcbi8qKlxuICogY2xvbmUgZXZlbnRcbiAqIEBwYXJhbSBlXG4gKi9cblxuZXhwb3J0IHZhciBjbG9uZUV2ZW50ID0gZnVuY3Rpb24gY2xvbmVFdmVudChlKSB7XG4gIHZhciBldmVudCA9IG5ldyBHNkdyYXBoRXZlbnQoZS50eXBlLCBlKTtcbiAgZXZlbnQuY2xpZW50WCA9IGUuY2xpZW50WDtcbiAgZXZlbnQuY2xpZW50WSA9IGUuY2xpZW50WTtcbiAgZXZlbnQueCA9IGUueDtcbiAgZXZlbnQueSA9IGUueTtcbiAgZXZlbnQudGFyZ2V0ID0gZS50YXJnZXQ7XG4gIGV2ZW50LmN1cnJlbnRUYXJnZXQgPSBlLmN1cnJlbnRUYXJnZXQ7XG4gIGV2ZW50LmJ1YmJsZXMgPSB0cnVlO1xuICBldmVudC5pdGVtID0gZS5pdGVtO1xuICByZXR1cm4gZXZlbnQ7XG59O1xuLyoqXG4gKiDliKTmlq0gdmlld3BvcnQg5piv5ZCm5pS55Y+Y77yM6YCa6L+H5ZKM5Y2V5L2N55+p6Zi15a+55q+UXG4gKiBAcGFyYW0gbWF0cml4IFZpZXdwb3J0IOeahCBNYXRyaXhcbiAqL1xuXG5leHBvcnQgdmFyIGlzVmlld3BvcnRDaGFuZ2VkID0gZnVuY3Rpb24gaXNWaWV3cG9ydENoYW5nZWQobWF0cml4KSB7XG4gIC8vIG1hdHJpeCDkuLogbnVsbO+8jCDliJnor7TmmI7msqHmnInlj5jljJZcbiAgaWYgKCFtYXRyaXgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgTUFUUklYX0xFTiA9IDk7XG4gIHZhciBPUklHSU5fTUFUUklYID0gWzEsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDFdO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgTUFUUklYX0xFTjsgaSsrKSB7XG4gICAgaWYgKG1hdHJpeFtpXSAhPT0gT1JJR0lOX01BVFJJWFtpXSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufTtcbmV4cG9ydCB2YXIgaXNOYU4gPSBmdW5jdGlvbiBpc05hTihpbnB1dCkge1xuICByZXR1cm4gTnVtYmVyLmlzTmFOKE51bWJlcihpbnB1dCkpO1xufTtcbi8qKlxuICog6K6h566X5LiA57uEIEl0ZW0g55qEIEJCb3hcbiAqIEBwYXJhbSBpdGVtcyDpgInkuK3nmoTkuIDnu4RJdGVt77yM5Y+v5Lul5pivIG5vZGUg5oiWIGNvbWJvXG4gKi9cblxuZXhwb3J0IHZhciBjYWxjdWxhdGlvbkl0ZW1zQkJveCA9IGZ1bmN0aW9uIGNhbGN1bGF0aW9uSXRlbXNCQm94KGl0ZW1zKSB7XG4gIHZhciBtaW54ID0gSW5maW5pdHk7XG4gIHZhciBtYXh4ID0gLUluZmluaXR5O1xuICB2YXIgbWlueSA9IEluZmluaXR5O1xuICB2YXIgbWF4eSA9IC1JbmZpbml0eTsgLy8g6I635Y+W5bey6IqC54K555qE5omA5pyJ5pyA5aSn5pyA5bCPeCB55YC8XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBlbGVtZW50ID0gaXRlbXNbaV07XG4gICAgdmFyIGJib3ggPSBlbGVtZW50LmdldEJCb3goKTtcbiAgICB2YXIgbWluWCA9IGJib3gubWluWCxcbiAgICAgICAgbWluWSA9IGJib3gubWluWSxcbiAgICAgICAgbWF4WCA9IGJib3gubWF4WCxcbiAgICAgICAgbWF4WSA9IGJib3gubWF4WTtcblxuICAgIGlmIChtaW5YIDwgbWlueCkge1xuICAgICAgbWlueCA9IG1pblg7XG4gICAgfVxuXG4gICAgaWYgKG1pblkgPCBtaW55KSB7XG4gICAgICBtaW55ID0gbWluWTtcbiAgICB9XG5cbiAgICBpZiAobWF4WCA+IG1heHgpIHtcbiAgICAgIG1heHggPSBtYXhYO1xuICAgIH1cblxuICAgIGlmIChtYXhZID4gbWF4eSkge1xuICAgICAgbWF4eSA9IG1heFk7XG4gICAgfVxuICB9XG5cbiAgdmFyIHggPSBNYXRoLmZsb29yKG1pbngpO1xuICB2YXIgeSA9IE1hdGguZmxvb3IobWlueSk7XG4gIHZhciB3aWR0aCA9IE1hdGguY2VpbChtYXh4KSAtIE1hdGguZmxvb3IobWlueCk7XG4gIHZhciBoZWlnaHQgPSBNYXRoLmNlaWwobWF4eSkgLSBNYXRoLmZsb29yKG1pbnkpO1xuICByZXR1cm4ge1xuICAgIHg6IHgsXG4gICAgeTogeSxcbiAgICB3aWR0aDogd2lkdGgsXG4gICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgbWluWDogbWlueCxcbiAgICBtaW5ZOiBtaW55LFxuICAgIG1heFg6IG1heHgsXG4gICAgbWF4WTogbWF4eVxuICB9O1xufTtcbi8qKlxuICog6IulIGVkZ2VzIOS4reWtmOWcqOS4pOerr+eCueebuOWQjOeahOi+ue+8jOS9v+eUqCBxdWFkcmF0aWMg6L655bm26Ieq5Yqo6K6h566XIGN1cnZlT2Zmc2V0IOS9v+Wug+S7rOS4jeebuOS6kumHjeWPoFxuICog5paH5qGjOiBodHRwczovL2c2LmFudHYudmlzaW9uL2VuL2RvY3MvYXBpL1V0aWxcbiAqIEBwYXJhbSBlZGdlcyDovrnmlbDmja7pm4blkIhcbiAqIEBwYXJhbSBvZmZzZXREaWZmIOebuOmCu+S4pOi+ueeahCBvZmZzZXQg5LmL5beuXG4gKiBAcGFyYW0gbXVsdGlFZGdlVHlwZVxuICogQHBhcmFtIHNpbmdsZUVkZ2VUeXBlXG4gKiBAcGFyYW0gbG9vcEVkZ2VUeXBlXG4gKi9cblxuZXhwb3J0IHZhciBwcm9jZXNzUGFyYWxsZWxFZGdlcyA9IGZ1bmN0aW9uIHByb2Nlc3NQYXJhbGxlbEVkZ2VzKGVkZ2VzLCBvZmZzZXREaWZmLCBtdWx0aUVkZ2VUeXBlLCBzaW5nbGVFZGdlVHlwZSwgbG9vcEVkZ2VUeXBlKSB7XG4gIGlmIChvZmZzZXREaWZmID09PSB2b2lkIDApIHtcbiAgICBvZmZzZXREaWZmID0gMTU7XG4gIH1cblxuICBpZiAobXVsdGlFZGdlVHlwZSA9PT0gdm9pZCAwKSB7XG4gICAgbXVsdGlFZGdlVHlwZSA9ICdxdWFkcmF0aWMnO1xuICB9XG5cbiAgaWYgKHNpbmdsZUVkZ2VUeXBlID09PSB2b2lkIDApIHtcbiAgICBzaW5nbGVFZGdlVHlwZSA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGlmIChsb29wRWRnZVR5cGUgPT09IHZvaWQgMCkge1xuICAgIGxvb3BFZGdlVHlwZSA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHZhciBsZW4gPSBlZGdlcy5sZW5ndGg7XG4gIHZhciBjb2QgPSBvZmZzZXREaWZmICogMjtcbiAgdmFyIGxvb3BQb3NpdGlvbiA9IFsndG9wJywgJ3RvcC1yaWdodCcsICdyaWdodCcsICdib3R0b20tcmlnaHQnLCAnYm90dG9tJywgJ2JvdHRvbS1sZWZ0JywgJ2xlZnQnLCAndG9wLWxlZnQnXTtcbiAgdmFyIGVkZ2VNYXAgPSB7fTtcbiAgdmFyIHRhZ3MgPSBbXTtcbiAgdmFyIHJldmVyc2VzID0ge307XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIHZhciBlZGdlID0gZWRnZXNbaV07XG4gICAgdmFyIHNvdXJjZSA9IGVkZ2Uuc291cmNlLFxuICAgICAgICB0YXJnZXQgPSBlZGdlLnRhcmdldDtcbiAgICB2YXIgc291cmNlVGFyZ2V0ID0gc291cmNlICsgXCItXCIgKyB0YXJnZXQ7XG4gICAgaWYgKHRhZ3NbaV0pIGNvbnRpbnVlO1xuXG4gICAgaWYgKCFlZGdlTWFwW3NvdXJjZVRhcmdldF0pIHtcbiAgICAgIGVkZ2VNYXBbc291cmNlVGFyZ2V0XSA9IFtdO1xuICAgIH1cblxuICAgIHRhZ3NbaV0gPSB0cnVlO1xuICAgIGVkZ2VNYXBbc291cmNlVGFyZ2V0XS5wdXNoKGVkZ2UpO1xuXG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBsZW47IGorKykge1xuICAgICAgaWYgKGkgPT09IGopIGNvbnRpbnVlO1xuICAgICAgdmFyIHNlZGdlID0gZWRnZXNbal07XG4gICAgICB2YXIgc3JjID0gc2VkZ2Uuc291cmNlO1xuICAgICAgdmFyIGRzdCA9IHNlZGdlLnRhcmdldDsgLy8g5Lik5Liq6IqC54K55LmL6Ze05YWx5ZCM55qE6L65XG4gICAgICAvLyDnrKzkuIDmnaHnmoRzb3VyY2UgPSDnrKzkuozmnaHnmoR0YXJnZXRcbiAgICAgIC8vIOesrOS4gOadoeeahHRhcmdldCA9IOesrOS6jOadoeeahHNvdXJjZVxuXG4gICAgICBpZiAoIXRhZ3Nbal0pIHtcbiAgICAgICAgaWYgKHNvdXJjZSA9PT0gZHN0ICYmIHRhcmdldCA9PT0gc3JjKSB7XG4gICAgICAgICAgZWRnZU1hcFtzb3VyY2VUYXJnZXRdLnB1c2goc2VkZ2UpO1xuICAgICAgICAgIHRhZ3Nbal0gPSB0cnVlO1xuICAgICAgICAgIHJldmVyc2VzW3NyYyArIFwifFwiICsgZHN0ICsgXCJ8XCIgKyAoZWRnZU1hcFtzb3VyY2VUYXJnZXRdLmxlbmd0aCAtIDEpXSA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAoc291cmNlID09PSBzcmMgJiYgdGFyZ2V0ID09PSBkc3QpIHtcbiAgICAgICAgICBlZGdlTWFwW3NvdXJjZVRhcmdldF0ucHVzaChzZWRnZSk7XG4gICAgICAgICAgdGFnc1tqXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmb3IgKHZhciBrZXkgaW4gZWRnZU1hcCkge1xuICAgIHZhciBhcmNFZGdlcyA9IGVkZ2VNYXBba2V5XTtcbiAgICB2YXIgbGVuZ3RoXzEgPSBhcmNFZGdlcy5sZW5ndGg7XG5cbiAgICBmb3IgKHZhciBrID0gMDsgayA8IGxlbmd0aF8xOyBrKyspIHtcbiAgICAgIHZhciBjdXJyZW50ID0gYXJjRWRnZXNba107XG5cbiAgICAgIGlmIChjdXJyZW50LnNvdXJjZSA9PT0gY3VycmVudC50YXJnZXQpIHtcbiAgICAgICAgaWYgKGxvb3BFZGdlVHlwZSkgY3VycmVudC50eXBlID0gbG9vcEVkZ2VUeXBlOyAvLyDotoXov4c45p2h6Ieq546v6L6577yM5YiZ6ZyA6KaB6YeN5paw5aSE55CGXG5cbiAgICAgICAgY3VycmVudC5sb29wQ2ZnID0ge1xuICAgICAgICAgIHBvc2l0aW9uOiBsb29wUG9zaXRpb25bayAlIDhdLFxuICAgICAgICAgIGRpc3Q6IE1hdGguZmxvb3IoayAvIDgpICogMjAgKyA1MFxuICAgICAgICB9O1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGxlbmd0aF8xID09PSAxICYmIHNpbmdsZUVkZ2VUeXBlICYmIGN1cnJlbnQuc291cmNlICE9PSBjdXJyZW50LnRhcmdldCkge1xuICAgICAgICBjdXJyZW50LnR5cGUgPSBzaW5nbGVFZGdlVHlwZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGN1cnJlbnQudHlwZSA9IG11bHRpRWRnZVR5cGU7XG4gICAgICB2YXIgc2lnbiA9IChrICUgMiA9PT0gMCA/IDEgOiAtMSkgKiAocmV2ZXJzZXNbY3VycmVudC5zb3VyY2UgKyBcInxcIiArIGN1cnJlbnQudGFyZ2V0ICsgXCJ8XCIgKyBrXSA/IC0xIDogMSk7XG5cbiAgICAgIGlmIChsZW5ndGhfMSAlIDIgPT09IDEpIHtcbiAgICAgICAgY3VycmVudC5jdXJ2ZU9mZnNldCA9IHNpZ24gKiBNYXRoLmNlaWwoayAvIDIpICogY29kO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3VycmVudC5jdXJ2ZU9mZnNldCA9IHNpZ24gKiAoTWF0aC5mbG9vcihrIC8gMikgKiBjb2QgKyBvZmZzZXREaWZmKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gZWRnZXM7XG59OyIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBpc051bWJlciwgaXNTdHJpbmcgfSBmcm9tICdAYW50di91dGlsJztcbmltcG9ydCB7IGZvcm1hdFBhZGRpbmcgfSBmcm9tICcuLi8uLi91dGlsL2Jhc2UnO1xuaW1wb3J0IHsgYXBwbHlNYXRyaXgsIGludmVydE1hdHJpeCB9IGZyb20gJy4uLy4uL3V0aWwvbWF0aCc7XG5cbnZhciBWaWV3Q29udHJvbGxlciA9XG4vKiogQGNsYXNzICovXG5mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFZpZXdDb250cm9sbGVyKGdyYXBoKSB7XG4gICAgdGhpcy5kZXN0cm95ZWQgPSBmYWxzZTtcbiAgICB0aGlzLmdyYXBoID0gZ3JhcGg7XG4gICAgdGhpcy5kZXN0cm95ZWQgPSBmYWxzZTtcbiAgfSAvLyBnZXQgdmlldyBjZW50ZXIgY29vcmRpbmF0ZVxuXG5cbiAgVmlld0NvbnRyb2xsZXIucHJvdG90eXBlLmdldFZpZXdDZW50ZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHBhZGRpbmcgPSB0aGlzLmdldEZvcm1hdFBhZGRpbmcoKTtcbiAgICB2YXIgZ3JhcGggPSB0aGlzLmdyYXBoO1xuICAgIHZhciB3aWR0aCA9IHRoaXMuZ3JhcGguZ2V0KCd3aWR0aCcpO1xuICAgIHZhciBoZWlnaHQgPSBncmFwaC5nZXQoJ2hlaWdodCcpO1xuICAgIHJldHVybiB7XG4gICAgICB4OiAod2lkdGggLSBwYWRkaW5nWzFdIC0gcGFkZGluZ1szXSkgLyAyICsgcGFkZGluZ1szXSxcbiAgICAgIHk6IChoZWlnaHQgLSBwYWRkaW5nWzBdIC0gcGFkZGluZ1syXSkgLyAyICsgcGFkZGluZ1swXVxuICAgIH07XG4gIH07XG5cbiAgVmlld0NvbnRyb2xsZXIucHJvdG90eXBlLmZpdENlbnRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZ3JhcGggPSB0aGlzLmdyYXBoO1xuICAgIHZhciBncm91cCA9IGdyYXBoLmdldCgnZ3JvdXAnKTtcbiAgICBncm91cC5yZXNldE1hdHJpeCgpO1xuICAgIHZhciBiYm94ID0gZ3JvdXAuZ2V0Q2FudmFzQkJveCgpO1xuICAgIGlmIChiYm94LndpZHRoID09PSAwIHx8IGJib3guaGVpZ2h0ID09PSAwKSByZXR1cm47XG4gICAgdmFyIHZpZXdDZW50ZXIgPSB0aGlzLmdldFZpZXdDZW50ZXIoKTtcbiAgICB2YXIgZ3JvdXBDZW50ZXIgPSB7XG4gICAgICB4OiBiYm94LnggKyBiYm94LndpZHRoIC8gMixcbiAgICAgIHk6IGJib3gueSArIGJib3guaGVpZ2h0IC8gMlxuICAgIH07XG4gICAgZ3JhcGgudHJhbnNsYXRlKHZpZXdDZW50ZXIueCAtIGdyb3VwQ2VudGVyLngsIHZpZXdDZW50ZXIueSAtIGdyb3VwQ2VudGVyLnkpO1xuICB9OyAvLyBmaXQgdmlldyBncmFwaFxuXG5cbiAgVmlld0NvbnRyb2xsZXIucHJvdG90eXBlLmZpdFZpZXcgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGdyYXBoID0gdGhpcy5ncmFwaDtcbiAgICB2YXIgcGFkZGluZyA9IHRoaXMuZ2V0Rm9ybWF0UGFkZGluZygpO1xuICAgIHZhciB3aWR0aCA9IGdyYXBoLmdldCgnd2lkdGgnKTtcbiAgICB2YXIgaGVpZ2h0ID0gZ3JhcGguZ2V0KCdoZWlnaHQnKTtcbiAgICB2YXIgZ3JvdXAgPSBncmFwaC5nZXQoJ2dyb3VwJyk7XG4gICAgZ3JvdXAucmVzZXRNYXRyaXgoKTtcbiAgICB2YXIgYmJveCA9IGdyb3VwLmdldENhbnZhc0JCb3goKTtcbiAgICBpZiAoYmJveC53aWR0aCA9PT0gMCB8fCBiYm94LmhlaWdodCA9PT0gMCkgcmV0dXJuO1xuICAgIHZhciB2aWV3Q2VudGVyID0gdGhpcy5nZXRWaWV3Q2VudGVyKCk7XG4gICAgdmFyIGdyb3VwQ2VudGVyID0ge1xuICAgICAgeDogYmJveC54ICsgYmJveC53aWR0aCAvIDIsXG4gICAgICB5OiBiYm94LnkgKyBiYm94LmhlaWdodCAvIDJcbiAgICB9O1xuICAgIGdyYXBoLnRyYW5zbGF0ZSh2aWV3Q2VudGVyLnggLSBncm91cENlbnRlci54LCB2aWV3Q2VudGVyLnkgLSBncm91cENlbnRlci55KTtcbiAgICB2YXIgdyA9ICh3aWR0aCAtIHBhZGRpbmdbMV0gLSBwYWRkaW5nWzNdKSAvIGJib3gud2lkdGg7XG4gICAgdmFyIGggPSAoaGVpZ2h0IC0gcGFkZGluZ1swXSAtIHBhZGRpbmdbMl0pIC8gYmJveC5oZWlnaHQ7XG4gICAgdmFyIHJhdGlvID0gdztcblxuICAgIGlmICh3ID4gaCkge1xuICAgICAgcmF0aW8gPSBoO1xuICAgIH1cblxuICAgIGlmICghZ3JhcGguem9vbShyYXRpbywgdmlld0NlbnRlcikpIHtcbiAgICAgIGNvbnNvbGUud2Fybignem9vbSBmYWlsZWQsIHJhdGlvIG91dCBvZiByYW5nZSwgcmF0aW86ICVmJywgcmF0aW8pO1xuICAgIH1cbiAgfTsgLy8gZml0IHZpZXcgZ3JhcGggYnkgcnVsZVxuXG5cbiAgVmlld0NvbnRyb2xsZXIucHJvdG90eXBlLmZpdFZpZXdCeVJ1bGVzID0gZnVuY3Rpb24gKHJ1bGVzKSB7XG4gICAgdmFyIF9hID0gcnVsZXMub25seU91dE9mVmlld1BvcnQsXG4gICAgICAgIG9ubHlPdXRPZlZpZXdQb3J0ID0gX2EgPT09IHZvaWQgMCA/IGZhbHNlIDogX2EsXG4gICAgICAgIF9iID0gcnVsZXMuZGlyZWN0aW9uLFxuICAgICAgICBkaXJlY3Rpb24gPSBfYiA9PT0gdm9pZCAwID8gJ2JvdGgnIDogX2IsXG4gICAgICAgIF9jID0gcnVsZXMucmF0aW9SdWxlLFxuICAgICAgICByYXRpb1J1bGUgPSBfYyA9PT0gdm9pZCAwID8gJ21pbicgOiBfYztcbiAgICB2YXIgZ3JhcGggPSB0aGlzLmdyYXBoO1xuICAgIHZhciBwYWRkaW5nID0gdGhpcy5nZXRGb3JtYXRQYWRkaW5nKCk7XG4gICAgdmFyIHdpZHRoID0gZ3JhcGguZ2V0KCd3aWR0aCcpO1xuICAgIHZhciBoZWlnaHQgPSBncmFwaC5nZXQoJ2hlaWdodCcpO1xuICAgIHZhciBncm91cCA9IGdyYXBoLmdldCgnZ3JvdXAnKTtcbiAgICBncm91cC5yZXNldE1hdHJpeCgpO1xuICAgIHZhciBiYm94ID0gZ3JvdXAuZ2V0Q2FudmFzQkJveCgpO1xuICAgIGlmIChiYm94LndpZHRoID09PSAwIHx8IGJib3guaGVpZ2h0ID09PSAwKSByZXR1cm47XG4gICAgdmFyIHZpZXdDZW50ZXIgPSB0aGlzLmdldFZpZXdDZW50ZXIoKTtcbiAgICB2YXIgZ3JvdXBDZW50ZXIgPSB7XG4gICAgICB4OiBiYm94LnggKyBiYm94LndpZHRoIC8gMixcbiAgICAgIHk6IGJib3gueSArIGJib3guaGVpZ2h0IC8gMlxuICAgIH07XG4gICAgZ3JhcGgudHJhbnNsYXRlKHZpZXdDZW50ZXIueCAtIGdyb3VwQ2VudGVyLngsIHZpZXdDZW50ZXIueSAtIGdyb3VwQ2VudGVyLnkpO1xuICAgIHZhciB3UmF0aW8gPSAod2lkdGggLSBwYWRkaW5nWzFdIC0gcGFkZGluZ1szXSkgLyBiYm94LndpZHRoO1xuICAgIHZhciBoUmF0aW8gPSAoaGVpZ2h0IC0gcGFkZGluZ1swXSAtIHBhZGRpbmdbMl0pIC8gYmJveC5oZWlnaHQ7XG4gICAgdmFyIHJhdGlvO1xuXG4gICAgaWYgKGRpcmVjdGlvbiA9PT0gJ3gnKSB7XG4gICAgICByYXRpbyA9IHdSYXRpbztcbiAgICB9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PT0gJ3knKSB7XG4gICAgICByYXRpbyA9IGhSYXRpbztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gcmF0aW9SdWxlXG4gICAgICByYXRpbyA9IHJhdGlvUnVsZSA9PT0gJ21heCcgPyBNYXRoLm1heCh3UmF0aW8sIGhSYXRpbykgOiBNYXRoLm1pbih3UmF0aW8sIGhSYXRpbyk7XG4gICAgfSAvLyDlpoLmnpzorr7nva7kuobku4Xlr7notoXlh7rop4blj6Plrr3pq5jnmoTlnLrmma/ov5vooYxmaXR2aWV377yM5YiZ5rKh6LaF5Ye655qE5Zy65pmvem9vbeWPljFcblxuXG4gICAgaWYgKG9ubHlPdXRPZlZpZXdQb3J0KSB7XG4gICAgICByYXRpbyA9IHJhdGlvIDwgMSA/IHJhdGlvIDogMTtcbiAgICB9XG5cbiAgICB2YXIgaW5pdFpvb21SYXRpbyA9IGdyYXBoLmdldFpvb20oKTtcbiAgICB2YXIgZW5kWm9vbSA9IGluaXRab29tUmF0aW8gKiByYXRpbztcbiAgICB2YXIgbWluWm9vbSA9IGdyYXBoLmdldCgnbWluWm9vbScpOyAvLyDlpoLmnpx6b29t5bCP5LqO5pyA5bCPem9vbSwg5YiZ5Lul5pyA5bCPem9vbeS4uuWHhlxuXG4gICAgaWYgKGVuZFpvb20gPCBtaW5ab29tKSB7XG4gICAgICBlbmRab29tID0gbWluWm9vbTtcbiAgICAgIGNvbnNvbGUud2FybignZml0dmlldyBmYWlsZWQsIHJhdGlvIG91dCBvZiByYW5nZSwgcmF0aW86ICVmJywgcmF0aW8sICdncmFwaCBtaW56b29tIGhhcyBiZWVuIHVzZWQgaW5zdGVhZCcpO1xuICAgIH1cblxuICAgIGdyYXBoLnpvb21UbyhlbmRab29tLCB2aWV3Q2VudGVyKTtcbiAgfTtcblxuICBWaWV3Q29udHJvbGxlci5wcm90b3R5cGUuZ2V0Rm9ybWF0UGFkZGluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcGFkZGluZyA9IHRoaXMuZ3JhcGguZ2V0KCdmaXRWaWV3UGFkZGluZycpO1xuICAgIHJldHVybiBmb3JtYXRQYWRkaW5nKHBhZGRpbmcpO1xuICB9O1xuXG4gIFZpZXdDb250cm9sbGVyLnByb3RvdHlwZS5mb2N1c1BvaW50ID0gZnVuY3Rpb24gKHBvaW50LCBhbmltYXRlLCBhbmltYXRlQ2ZnKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHZhciB2aWV3Q2VudGVyID0gdGhpcy5nZXRWaWV3Q2VudGVyKCk7XG4gICAgdmFyIG1vZGVsQ2VudGVyID0gdGhpcy5nZXRQb2ludEJ5Q2FudmFzKHZpZXdDZW50ZXIueCwgdmlld0NlbnRlci55KTtcbiAgICB2YXIgdmlld3BvcnRNYXRyaXggPSB0aGlzLmdyYXBoLmdldCgnZ3JvdXAnKS5nZXRNYXRyaXgoKTtcbiAgICBpZiAoIXZpZXdwb3J0TWF0cml4KSB2aWV3cG9ydE1hdHJpeCA9IFsxLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAxXTtcblxuICAgIGlmIChhbmltYXRlKSB7XG4gICAgICB2YXIgZHhfMSA9IChtb2RlbENlbnRlci54IC0gcG9pbnQueCkgKiB2aWV3cG9ydE1hdHJpeFswXTtcbiAgICAgIHZhciBkeV8xID0gKG1vZGVsQ2VudGVyLnkgLSBwb2ludC55KSAqIHZpZXdwb3J0TWF0cml4WzRdO1xuICAgICAgdmFyIGxhc3RYXzEgPSAwO1xuICAgICAgdmFyIGxhc3RZXzEgPSAwO1xuICAgICAgdmFyIG5ld1hfMSA9IDA7XG4gICAgICB2YXIgbmV3WV8xID0gMDsgLy8g5Yqo55S75q+P5qyh5bmz56e75LiA54K577yM55u05Yiw55uu5qCH5L2N572uXG5cbiAgICAgIHRoaXMuZ3JhcGguZ2V0KCdjYW52YXMnKS5hbmltYXRlKGZ1bmN0aW9uIChyYXRpbykge1xuICAgICAgICBuZXdYXzEgPSBkeF8xICogcmF0aW87XG4gICAgICAgIG5ld1lfMSA9IGR5XzEgKiByYXRpbztcblxuICAgICAgICBfdGhpcy5ncmFwaC50cmFuc2xhdGUobmV3WF8xIC0gbGFzdFhfMSwgbmV3WV8xIC0gbGFzdFlfMSk7XG5cbiAgICAgICAgbGFzdFhfMSA9IG5ld1hfMTtcbiAgICAgICAgbGFzdFlfMSA9IG5ld1lfMTtcbiAgICAgIH0sIF9fYXNzaWduKHt9LCBhbmltYXRlQ2ZnKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZ3JhcGgudHJhbnNsYXRlKChtb2RlbENlbnRlci54IC0gcG9pbnQueCkgKiB2aWV3cG9ydE1hdHJpeFswXSwgKG1vZGVsQ2VudGVyLnkgLSBwb2ludC55KSAqIHZpZXdwb3J0TWF0cml4WzRdKTtcbiAgICB9XG4gIH07XG4gIC8qKlxuICAgKiDlsIYgQ2FudmFzIOWdkOagh+i9rOaIkOinhuWPo+WdkOagh1xuICAgKiBAcGFyYW0gY2FudmFzWCBjYW52YXMgeCDlnZDmoIdcbiAgICogQHBhcmFtIGNhbnZhc1kgY2FudmFzIHkg5Z2Q5qCHXG4gICAqL1xuXG5cbiAgVmlld0NvbnRyb2xsZXIucHJvdG90eXBlLmdldFBvaW50QnlDYW52YXMgPSBmdW5jdGlvbiAoY2FudmFzWCwgY2FudmFzWSkge1xuICAgIHZhciB2aWV3cG9ydE1hdHJpeCA9IHRoaXMuZ3JhcGguZ2V0KCdncm91cCcpLmdldE1hdHJpeCgpO1xuXG4gICAgaWYgKCF2aWV3cG9ydE1hdHJpeCkge1xuICAgICAgdmlld3BvcnRNYXRyaXggPSBbMSwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMV07XG4gICAgfVxuXG4gICAgdmFyIHBvaW50ID0gaW52ZXJ0TWF0cml4KHtcbiAgICAgIHg6IGNhbnZhc1gsXG4gICAgICB5OiBjYW52YXNZXG4gICAgfSwgdmlld3BvcnRNYXRyaXgpO1xuICAgIHJldHVybiBwb2ludDtcbiAgfTtcbiAgLyoqXG4gICAqIOWwhumhtemdouWdkOagh+i9rOaIkOinhuWPo+WdkOagh1xuICAgKiBAcGFyYW0gY2xpZW50WCDpobXpnaIgeCDlnZDmoIdcbiAgICogQHBhcmFtIGNsaWVudFkg6aG16Z2iIHkg5Z2Q5qCHXG4gICAqL1xuXG5cbiAgVmlld0NvbnRyb2xsZXIucHJvdG90eXBlLmdldFBvaW50QnlDbGllbnQgPSBmdW5jdGlvbiAoY2xpZW50WCwgY2xpZW50WSkge1xuICAgIHZhciBjYW52YXMgPSB0aGlzLmdyYXBoLmdldCgnY2FudmFzJyk7XG4gICAgdmFyIGNhbnZhc1BvaW50ID0gY2FudmFzLmdldFBvaW50QnlDbGllbnQoY2xpZW50WCwgY2xpZW50WSk7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UG9pbnRCeUNhbnZhcyhjYW52YXNQb2ludC54LCBjYW52YXNQb2ludC55KTtcbiAgfTtcbiAgLyoqXG4gICAqIOWwhuinhuWPo+WdkOagh+i9rOaIkOmhtemdouWdkOagh1xuICAgKiBAcGFyYW0geCDop4blj6MgeCDlnZDmoIdcbiAgICogQHBhcmFtIHkg6KeG5Y+jIHkg5Z2Q5qCHXG4gICAqL1xuXG5cbiAgVmlld0NvbnRyb2xsZXIucHJvdG90eXBlLmdldENsaWVudEJ5UG9pbnQgPSBmdW5jdGlvbiAoeCwgeSkge1xuICAgIHZhciBjYW52YXMgPSB0aGlzLmdyYXBoLmdldCgnY2FudmFzJyk7XG4gICAgdmFyIGNhbnZhc1BvaW50ID0gdGhpcy5nZXRDYW52YXNCeVBvaW50KHgsIHkpO1xuICAgIHZhciBwb2ludCA9IGNhbnZhcy5nZXRDbGllbnRCeVBvaW50KGNhbnZhc1BvaW50LngsIGNhbnZhc1BvaW50LnkpO1xuICAgIHJldHVybiB7XG4gICAgICB4OiBwb2ludC54LFxuICAgICAgeTogcG9pbnQueVxuICAgIH07XG4gIH07XG4gIC8qKlxuICAgKiDlsIbop4blj6PlnZDmoIfovazmiJAgQ2FudmFzIOWdkOagh1xuICAgKiBAcGFyYW0geCDop4blj6MgeCDlnZDmoIdcbiAgICogQHBhcmFtIHkg6KeG5Y+jIHkg5Z2Q5qCHXG4gICAqL1xuXG5cbiAgVmlld0NvbnRyb2xsZXIucHJvdG90eXBlLmdldENhbnZhc0J5UG9pbnQgPSBmdW5jdGlvbiAoeCwgeSkge1xuICAgIHZhciB2aWV3cG9ydE1hdHJpeCA9IHRoaXMuZ3JhcGguZ2V0KCdncm91cCcpLmdldE1hdHJpeCgpO1xuXG4gICAgaWYgKCF2aWV3cG9ydE1hdHJpeCkge1xuICAgICAgdmlld3BvcnRNYXRyaXggPSBbMSwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMV07XG4gICAgfVxuXG4gICAgcmV0dXJuIGFwcGx5TWF0cml4KHtcbiAgICAgIHg6IHgsXG4gICAgICB5OiB5XG4gICAgfSwgdmlld3BvcnRNYXRyaXgpO1xuICB9O1xuICAvKipcbiAgICog5bCG5YWD57Sg56e75Yqo5Yiw55S75biD5Lit5b+DXG4gICAqIEBwYXJhbSBpdGVtIEl0ZW0g5a6e5L6L5oiWIGlkXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gYW5pbWF0ZSDmmK/lkKbluKbmnInliqjnlLvlnLDnp7vliqhcbiAgICogQHBhcmFtIHtHcmFwaEFuaW1hdGVDb25maWd9IGFuaW1hdGVDZmcg6Iul5bim5pyJ5Yqo55S777yM5Yqo55S755qE6YWN572u6aG5XG4gICAqL1xuXG5cbiAgVmlld0NvbnRyb2xsZXIucHJvdG90eXBlLmZvY3VzID0gZnVuY3Rpb24gKGl0ZW0sIGFuaW1hdGUsIGFuaW1hdGVDZmcpIHtcbiAgICBpZiAoaXNTdHJpbmcoaXRlbSkpIHtcbiAgICAgIGl0ZW0gPSB0aGlzLmdyYXBoLmZpbmRCeUlkKGl0ZW0pO1xuICAgIH1cblxuICAgIGlmIChpdGVtKSB7XG4gICAgICB2YXIgeCA9IDAsXG4gICAgICAgICAgeSA9IDA7XG5cbiAgICAgIGlmIChpdGVtLmdldFR5cGUgJiYgaXRlbS5nZXRUeXBlKCkgPT09ICdlZGdlJykge1xuICAgICAgICB2YXIgc291cmNlTWF0cml4ID0gaXRlbS5nZXRTb3VyY2UoKS5nZXQoJ2dyb3VwJykuZ2V0TWF0cml4KCk7XG4gICAgICAgIHZhciB0YXJnZXRNYXRyaXggPSBpdGVtLmdldFRhcmdldCgpLmdldCgnZ3JvdXAnKS5nZXRNYXRyaXgoKTtcblxuICAgICAgICBpZiAoc291cmNlTWF0cml4ICYmIHRhcmdldE1hdHJpeCkge1xuICAgICAgICAgIHggPSAoc291cmNlTWF0cml4WzZdICsgdGFyZ2V0TWF0cml4WzZdKSAvIDI7XG4gICAgICAgICAgeSA9IChzb3VyY2VNYXRyaXhbN10gKyB0YXJnZXRNYXRyaXhbN10pIC8gMjtcbiAgICAgICAgfSBlbHNlIGlmIChzb3VyY2VNYXRyaXggfHwgdGFyZ2V0TWF0cml4KSB7XG4gICAgICAgICAgeCA9IHNvdXJjZU1hdHJpeCA/IHNvdXJjZU1hdHJpeFs2XSA6IHRhcmdldE1hdHJpeFs2XTtcbiAgICAgICAgICB5ID0gc291cmNlTWF0cml4ID8gc291cmNlTWF0cml4WzddIDogdGFyZ2V0TWF0cml4WzddO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgZ3JvdXAgPSBpdGVtLmdldCgnZ3JvdXAnKTtcbiAgICAgICAgdmFyIG1hdHJpeCA9IGdyb3VwLmdldE1hdHJpeCgpO1xuICAgICAgICBpZiAoIW1hdHJpeCkgbWF0cml4ID0gWzEsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDFdO1xuICAgICAgICB4ID0gbWF0cml4WzZdO1xuICAgICAgICB5ID0gbWF0cml4WzddO1xuICAgICAgfSAvLyDnlKjlrp7pmYXkvY3nva7ogIzkuI3mmK9tb2RlbOS4reeahHgseSzpmLLmraLnlLHkuo7mi5bmi73nrYnnmoTkuqTkupLlr7zoh7Rtb2RlbOeahHgseeW5tuS4jeaYr+W9k+WJjeeahHgseVxuXG5cbiAgICAgIHRoaXMuZm9jdXNQb2ludCh7XG4gICAgICAgIHg6IHgsXG4gICAgICAgIHk6IHlcbiAgICAgIH0sIGFuaW1hdGUsIGFuaW1hdGVDZmcpO1xuICAgIH1cbiAgfTtcbiAgLyoqXG4gICAqIOaUueWPmCBjYW52YXMg55S75biD55qE5a695bqm5ZKM6auY5bqmXG4gICAqIEBwYXJhbSB3aWR0aCBjYW52YXMg5a695bqmXG4gICAqIEBwYXJhbSBoZWlnaHQgY2FudmFzIOmrmOW6plxuICAgKi9cblxuXG4gIFZpZXdDb250cm9sbGVyLnByb3RvdHlwZS5jaGFuZ2VTaXplID0gZnVuY3Rpb24gKHdpZHRoLCBoZWlnaHQpIHtcbiAgICB2YXIgZ3JhcGggPSB0aGlzLmdyYXBoO1xuXG4gICAgaWYgKCFpc051bWJlcih3aWR0aCkgfHwgIWlzTnVtYmVyKGhlaWdodCkpIHtcbiAgICAgIHRocm93IEVycm9yKCdpbnZhbGlkIGNhbnZhcyB3aWR0aCAmIGhlaWdodCwgcGxlYXNlIG1ha2Ugc3VyZSB3aWR0aCAmIGhlaWdodCB0eXBlIGlzIG51bWJlcicpO1xuICAgIH1cblxuICAgIGdyYXBoLnNldCh7XG4gICAgICB3aWR0aDogd2lkdGgsXG4gICAgICBoZWlnaHQ6IGhlaWdodFxuICAgIH0pO1xuICAgIHZhciBjYW52YXMgPSBncmFwaC5nZXQoJ2NhbnZhcycpO1xuICAgIGNhbnZhcy5jaGFuZ2VTaXplKHdpZHRoLCBoZWlnaHQpOyAvLyBjaGFuZ2UgdGhlIHNpemUgb2YgZ3JpZCBwbHVnaW4gaWYgaXQgZXhpc3RzIG9uIGdyYXBoXG5cbiAgICB2YXIgcGx1Z2lucyA9IGdyYXBoLmdldCgncGx1Z2lucycpO1xuICAgIHBsdWdpbnMuZm9yRWFjaChmdW5jdGlvbiAocGx1Z2luKSB7XG4gICAgICBpZiAocGx1Z2luLmdldCgnZ3JpZENvbnRhaW5lcicpKSB7XG4gICAgICAgIC8vIOe9keagvOWumuS9jeS/oeaBr+WIneWni+WMllxuICAgICAgICBwbHVnaW4ucG9zaXRpb25Jbml0KCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgVmlld0NvbnRyb2xsZXIucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5ncmFwaCA9IG51bGw7XG4gICAgdGhpcy5kZXN0cm95ZWQgPSBmYWxzZTtcbiAgfTtcblxuICByZXR1cm4gVmlld0NvbnRyb2xsZXI7XG59KCk7XG5cbmV4cG9ydCBkZWZhdWx0IFZpZXdDb250cm9sbGVyOyIsImZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiKSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfTsgfSBlbHNlIHsgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9OyB9IHJldHVybiBfdHlwZW9mKG9iaik7IH1cblxuLyoqXG4gKiBAZmlsZU92ZXJ2aWV3IOS7jnhtbOW7uueri+iHquWumuS5iU5vZGXvvIzljIXlkKt1cGRhdGVcbiAqIEBhdXRob3IgeHV6aGkubXh6QGFudGZpbi5jb21cbiAqL1xuaW1wb3J0IHsgX19hc3NpZ24sIF9fcmVzdCB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgZ2V0IH0gZnJvbSAnQGFudHYvdXRpbCc7XG5pbXBvcnQgeyBnZXRUZXh0U2l6ZSB9IGZyb20gJy4uL3V0aWwvZ3JhcGhpYyc7XG4vKipcbiAqIOS4gOenjeabtOWuveadvueahEpTT04g6Kej5p6Q77yM5aaC5p6c6YGH5Yiw5LiN56ym5ZCI6KeE6IyD55qE5a2X5q615Lya55u05o6l6L2s5Li65a2X56ym5LiyXG4gKiBAcGFyYW0gdGV4dCBqc29uIOWGheWuuVxuICovXG5cbmZ1bmN0aW9uIGxvb3NlSlNPTlBhcnNlKHRleHQpIHtcbiAgaWYgKHR5cGVvZiB0ZXh0ICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB0ZXh0O1xuICB9XG5cbiAgdmFyIHNhZmVQYXJzZSA9IGZ1bmN0aW9uIHNhZmVQYXJzZShzdHIpIHtcbiAgICBpZiAodHlwZW9mIHN0ciAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKHN0ci50cmltKCkpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBzdHIudHJpbSgpO1xuICAgIH1cbiAgfTtcblxuICB2YXIgZmlyc3RBdHRlbXB0ID0gc2FmZVBhcnNlKHRleHQpO1xuXG4gIGlmICh0eXBlb2YgZmlyc3RBdHRlbXB0ICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBmaXJzdEF0dGVtcHQ7XG4gIH1cblxuICB2YXIgdGFpbCA9IGZ1bmN0aW9uIHRhaWwoYXJyKSB7XG4gICAgcmV0dXJuIGFyclthcnIubGVuZ3RoIC0gMV07XG4gIH07XG5cbiAgdmFyIHN0ciA9IHRleHQudHJpbSgpO1xuICB2YXIgb2JqZWN0U3RhY2sgPSBbXTtcbiAgdmFyIHN5bnRheFN0YWNrID0gW107XG5cbiAgdmFyIGlzTGFzdFBhaXIgPSBmdW5jdGlvbiBpc0xhc3RQYWlyKCkge1xuICAgIHZhciBzeW50YXhlcyA9IFtdO1xuXG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHN5bnRheGVzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgfVxuXG4gICAgcmV0dXJuIHN5bnRheGVzLnNvbWUoZnVuY3Rpb24gKHN5bnRheCkge1xuICAgICAgcmV0dXJuIHRhaWwoc3ludGF4U3RhY2spID09PSBzeW50YXg7XG4gICAgfSk7XG4gIH07XG5cbiAgdmFyIGdldFZhbHVlU3RvcmUgPSBmdW5jdGlvbiBnZXRWYWx1ZVN0b3JlKCkge1xuICAgIHJldHVybiB0YWlsKG9iamVjdFN0YWNrKTtcbiAgfTtcblxuICB2YXIgcnN0ID0gbnVsbDtcbiAgdmFyIGkgPSAwO1xuICB2YXIgdGVtcCA9ICcnO1xuXG4gIHdoaWxlIChpIDwgc3RyLmxlbmd0aCkge1xuICAgIHZhciBub3dDaGFyID0gc3RyW2ldO1xuICAgIHZhciBpc0luU3RyaW5nID0gaXNMYXN0UGFpcignXCInLCBcIidcIik7XG5cbiAgICBpZiAoIWlzSW5TdHJpbmcgJiYgIW5vd0NoYXIudHJpbSgpKSB7XG4gICAgICBpICs9IDE7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICB2YXIgaXNMYXN0VHJhbnNsYXRlID0gc3RyW2kgLSAxXSA9PT0gJ1xcXFwnO1xuICAgIHZhciBpc0luT2JqZWN0ID0gaXNMYXN0UGFpcignfScpO1xuICAgIHZhciBpc0luQXJyYXkgPSBpc0xhc3RQYWlyKCddJyk7XG4gICAgdmFyIGlzV2FpdGluZ1ZhbHVlID0gaXNMYXN0UGFpcignLCcpO1xuICAgIHZhciB0ZW1wQXJyID0gZ2V0VmFsdWVTdG9yZSgpO1xuXG4gICAgaWYgKGlzSW5TdHJpbmcpIHtcbiAgICAgIGlmICh0YWlsKHN5bnRheFN0YWNrKSA9PT0gbm93Q2hhciAmJiAhaXNMYXN0VHJhbnNsYXRlKSB7XG4gICAgICAgIHN5bnRheFN0YWNrLnBvcCgpO1xuICAgICAgICB2YXIgdmFsdWUgPSBzYWZlUGFyc2UodGVtcCk7XG4gICAgICAgIHRlbXBBcnIucHVzaCh2YWx1ZSk7XG4gICAgICAgIHJzdCA9IHZhbHVlO1xuICAgICAgICB0ZW1wID0gJyc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0ZW1wICs9IG5vd0NoYXI7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc0luQXJyYXkgJiYgbm93Q2hhciA9PT0gJywnKSB7XG4gICAgICBpZiAodGVtcCkge1xuICAgICAgICB0ZW1wQXJyLnB1c2goc2FmZVBhcnNlKHRlbXApKTtcbiAgICAgICAgdGVtcCA9ICcnO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXNJbk9iamVjdCAmJiBub3dDaGFyID09PSAnOicpIHtcbiAgICAgIHN5bnRheFN0YWNrLnB1c2goJywnKTtcblxuICAgICAgaWYgKHRlbXApIHtcbiAgICAgICAgdGVtcEFyci5wdXNoKHRlbXApO1xuICAgICAgICB0ZW1wID0gJyc7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc1dhaXRpbmdWYWx1ZSAmJiBub3dDaGFyID09PSAnLCcpIHtcbiAgICAgIGlmICh0ZW1wKSB7XG4gICAgICAgIHRlbXBBcnIucHVzaChzYWZlUGFyc2UodGVtcCkpO1xuICAgICAgICB0ZW1wID0gJyc7XG4gICAgICB9XG5cbiAgICAgIHN5bnRheFN0YWNrLnBvcCgpO1xuICAgIH0gZWxzZSBpZiAobm93Q2hhciA9PT0gJ30nICYmIChpc0luT2JqZWN0IHx8IGlzV2FpdGluZ1ZhbHVlKSkge1xuICAgICAgaWYgKHRlbXApIHtcbiAgICAgICAgdGVtcEFyci5wdXNoKHNhZmVQYXJzZSh0ZW1wKSk7XG4gICAgICAgIHRlbXAgPSAnJztcbiAgICAgIH1cblxuICAgICAgaWYgKGlzV2FpdGluZ1ZhbHVlKSB7XG4gICAgICAgIHN5bnRheFN0YWNrLnBvcCgpO1xuICAgICAgfVxuXG4gICAgICB2YXIgb2JqID0ge307XG5cbiAgICAgIGZvciAodmFyIGMgPSAxOyBjIDwgdGVtcEFyci5sZW5ndGg7IGMgKz0gMikge1xuICAgICAgICBvYmpbdGVtcEFycltjIC0gMV1dID0gdGVtcEFycltjXTtcbiAgICAgIH1cblxuICAgICAgb2JqZWN0U3RhY2sucG9wKCk7XG5cbiAgICAgIGlmIChvYmplY3RTdGFjay5sZW5ndGgpIHtcbiAgICAgICAgdGFpbChvYmplY3RTdGFjaykucHVzaChvYmopO1xuICAgICAgfVxuXG4gICAgICBzeW50YXhTdGFjay5wb3AoKTtcbiAgICAgIHJzdCA9IG9iajtcbiAgICB9IGVsc2UgaWYgKG5vd0NoYXIgPT09ICddJyAmJiBpc0luQXJyYXkpIHtcbiAgICAgIGlmICh0ZW1wKSB7XG4gICAgICAgIHRlbXBBcnIucHVzaChzYWZlUGFyc2UodGVtcCkpO1xuICAgICAgICB0ZW1wID0gJyc7XG4gICAgICB9XG5cbiAgICAgIG9iamVjdFN0YWNrLnBvcCgpO1xuXG4gICAgICBpZiAob2JqZWN0U3RhY2subGVuZ3RoKSB7XG4gICAgICAgIHRhaWwob2JqZWN0U3RhY2spLnB1c2godGVtcEFycik7XG4gICAgICB9XG5cbiAgICAgIHN5bnRheFN0YWNrLnBvcCgpO1xuICAgICAgcnN0ID0gdGVtcEFycjtcbiAgICB9IGVsc2UgaWYgKG5vd0NoYXIgPT09ICd7Jykge1xuICAgICAgb2JqZWN0U3RhY2sucHVzaChbXSk7XG4gICAgICBzeW50YXhTdGFjay5wdXNoKCd9Jyk7XG4gICAgfSBlbHNlIGlmIChub3dDaGFyID09PSAnWycpIHtcbiAgICAgIG9iamVjdFN0YWNrLnB1c2goW10pO1xuICAgICAgc3ludGF4U3RhY2sucHVzaCgnXScpO1xuICAgIH0gZWxzZSBpZiAobm93Q2hhciA9PT0gJ1wiJykge1xuICAgICAgc3ludGF4U3RhY2sucHVzaCgnXCInKTtcbiAgICB9IGVsc2UgaWYgKG5vd0NoYXIgPT09IFwiJ1wiKSB7XG4gICAgICBzeW50YXhTdGFjay5wdXNoKFwiJ1wiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGVtcCArPSBub3dDaGFyO1xuICAgIH1cblxuICAgIGkgKz0gMTtcbiAgfVxuXG4gIHJldHVybiByc3QgfHwgdGVtcDtcbn1cblxudmFyIGtleUNvbnZlcnQgPSBmdW5jdGlvbiBrZXlDb252ZXJ0KHN0cikge1xuICByZXR1cm4gc3RyLnNwbGl0KCctJykucmVkdWNlKGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgcmV0dXJuIGEgKyBiLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgYi5zbGljZSgxKTtcbiAgfSk7XG59O1xuLyoqXG4gKiDnroDljZXnmoTkuIDkuKp7e3195qih5p2/5riy5p+T77yM5LiN5YyF5ZCr5Lu75L2V5aSN5p2C6K+t5rOVXG4gKiBAcGFyYW0geG1sXG4gKi9cblxuXG5leHBvcnQgdmFyIHhtbERhdGFSZW5kZXJlciA9IGZ1bmN0aW9uIHhtbERhdGFSZW5kZXJlcih4bWwpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgdmFyIGxlbiA9IHhtbC5sZW5ndGg7XG4gICAgdmFyIGFyciA9IFtdO1xuICAgIHZhciBpID0gMDtcbiAgICB2YXIgdG1wID0gJyc7XG5cbiAgICB3aGlsZSAoaSA8IGxlbikge1xuICAgICAgaWYgKHhtbFtpXSA9PT0gJ3snICYmIHhtbFtpICsgMV0gPT09ICd7Jykge1xuICAgICAgICBhcnIucHVzaCh0bXApO1xuICAgICAgICB0bXAgPSAnJztcbiAgICAgICAgaSArPSAyO1xuICAgICAgfSBlbHNlIGlmICh4bWxbaV0gPT09ICd9JyAmJiB4bWxbaSArIDFdID09PSAnfScpIHtcbiAgICAgICAgaWYgKGFyci5sZW5ndGgpIHtcbiAgICAgICAgICB2YXIgbGFzdCA9IGFyci5wb3AoKTtcbiAgICAgICAgICB0bXAgPSBnZXQoZGF0YSwgdG1wLCBsYXN0LmVuZHNXaXRoKCc9JykgPyBcIlxcXCJ7XCIgKyB0bXAgKyBcIn1cXFwiXCIgOiB0bXApO1xuICAgICAgICAgIGFyci5wdXNoKGxhc3QgKyB0bXApO1xuICAgICAgICB9XG5cbiAgICAgICAgaSArPSAyO1xuICAgICAgICB0bXAgPSAnJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRtcCArPSB4bWxbaV07XG4gICAgICAgIGkgKz0gMTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhcnIucHVzaCh0bXApO1xuICAgIHJldHVybiBhcnIubWFwKGZ1bmN0aW9uIChlLCBpbmRleCkge1xuICAgICAgcmV0dXJuIGFycltpbmRleCAtIDFdICYmIGFycltpbmRleCAtIDFdLmVuZHNXaXRoKCc9JykgPyBcIlxcXCJ7XCIgKyBlICsgXCJ9XFxcIlwiIDogZTtcbiAgICB9KS5qb2luKCcnKTtcbiAgfTtcbn07XG4vKipcbiAqIOino+aekFhNTO+8jOW5tui9rOWMluS4uuebuOW6lOeahEpTT07nu5PmnoRcbiAqIEBwYXJhbSB4bWwgeG1s6Kej5p6Q5ZCO55qE6IqC54K5XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlWE1MKHhtbCwgY2ZnKSB7XG4gIHZhciBhdHRycyA9IHt9O1xuICB2YXIga2V5cyA9IHhtbC5nZXRBdHRyaWJ1dGVOYW1lcyAmJiB4bWwuZ2V0QXR0cmlidXRlTmFtZXMoKSB8fCBbXTtcbiAgdmFyIGNoaWxkcmVuID0geG1sLmNoaWxkcmVuICYmIEFycmF5LmZyb20oeG1sLmNoaWxkcmVuKS5tYXAoZnVuY3Rpb24gKGUpIHtcbiAgICByZXR1cm4gcGFyc2VYTUwoZSwgY2ZnKTtcbiAgfSk7XG4gIHZhciByc3QgPSB7fTtcbiAgdmFyIHRhZ05hbWUgPSB4bWwudGFnTmFtZSA/IHhtbC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgOiAnZ3JvdXAnO1xuXG4gIGlmICh0YWdOYW1lID09PSAndGV4dCcpIHtcbiAgICBhdHRycy50ZXh0ID0geG1sLmlubmVyVGV4dDtcbiAgfVxuXG4gIHJzdC50eXBlID0gdGFnTmFtZTtcblxuICBpZiAodGFnTmFtZSA9PT0gJ2ltZycpIHtcbiAgICByc3QudHlwZSA9ICdpbWFnZSc7XG4gIH1cblxuICBBcnJheS5mcm9tKGtleXMpLmZvckVhY2goZnVuY3Rpb24gKGspIHtcbiAgICB2YXIga2V5ID0ga2V5Q29udmVydChrKTtcbiAgICB2YXIgdmFsID0geG1sLmdldEF0dHJpYnV0ZShrKTtcblxuICAgIHRyeSB7XG4gICAgICBpZiAoa2V5ID09PSAnc3R5bGUnIHx8IGtleSA9PT0gJ2F0dHJzJykge1xuICAgICAgICB2YXIgc3R5bGUgPSBsb29zZUpTT05QYXJzZSh2YWwpO1xuICAgICAgICBhdHRycyA9IF9fYXNzaWduKF9fYXNzaWduKHt9LCBhdHRycyksIHN0eWxlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJzdFtrZXldID0gbG9vc2VKU09OUGFyc2UodmFsKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoa2V5ID09PSAnc3R5bGUnKSB7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG5cbiAgICAgIHJzdFtrZXldID0gdmFsO1xuICAgIH1cbiAgfSk7XG4gIHJzdC5hdHRycyA9IGF0dHJzO1xuXG4gIGlmIChjZmcgJiYgY2ZnLnN0eWxlICYmIHJzdC5uYW1lICYmIF90eXBlb2YoY2ZnLnN0eWxlW3JzdC5uYW1lXSkgPT09ICdvYmplY3QnKSB7XG4gICAgcnN0LmF0dHJzID0gX19hc3NpZ24oX19hc3NpZ24oe30sIHJzdC5hdHRycyksIGNmZy5zdHlsZVtyc3QubmFtZV0pO1xuICB9XG5cbiAgaWYgKGNmZyAmJiBjZmcuc3R5bGUgJiYgcnN0LmtleXNoYXBlKSB7XG4gICAgcnN0LmF0dHJzID0gX19hc3NpZ24oX19hc3NpZ24oe30sIHJzdC5hdHRycyksIGNmZy5zdHlsZSk7XG4gIH1cblxuICBpZiAoY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgcnN0LmNoaWxkcmVuID0gY2hpbGRyZW47XG4gIH1cblxuICByZXR1cm4gcnN0O1xufVxuLyoqXG4gKiDmoLnmja7lgY/np7vph4/lkozlhoXpg6joioLngrnmnIDnu4jnmoRib3VuZGluZyBib3jmnaXlvpflh7ror6VzaGFwZeacgOe7iOeahGJib3hcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QkJveChub2RlLCBvZmZzZXQsIGNoaWxyZW5CQm94KSB7XG4gIHZhciBfYSA9IG5vZGUuYXR0cnMsXG4gICAgICBhdHRycyA9IF9hID09PSB2b2lkIDAgPyB7fSA6IF9hO1xuICB2YXIgYmJveCA9IHtcbiAgICB4OiBvZmZzZXQueCB8fCAwLFxuICAgIHk6IG9mZnNldC55IHx8IDAsXG4gICAgd2lkdGg6IGNoaWxyZW5CQm94LndpZHRoIHx8IDAsXG4gICAgaGVpZ2h0OiBjaGlscmVuQkJveC5oZWlnaHQgfHwgMFxuICB9O1xuICB2YXIgc2hhcGVIZWlnaHQsIHNoYXBlV2lkdGg7XG5cbiAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICBjYXNlICdtYWtlcic6XG4gICAgY2FzZSAnY2lyY2xlJzpcbiAgICAgIGlmIChhdHRycy5yKSB7XG4gICAgICAgIHNoYXBlV2lkdGggPSAyICogYXR0cnMucjtcbiAgICAgICAgc2hhcGVIZWlnaHQgPSAyICogYXR0cnMucjtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICd0ZXh0JzpcbiAgICAgIGlmIChhdHRycy50ZXh0KSB7XG4gICAgICAgIHNoYXBlV2lkdGggPSBnZXRUZXh0U2l6ZShhdHRycy50ZXh0LCBhdHRycy5mb250U2l6ZSB8fCAxMilbMF07XG4gICAgICAgIHNoYXBlSGVpZ2h0ID0gMTY7XG4gICAgICAgIGJib3gueSArPSBzaGFwZUhlaWdodDtcbiAgICAgICAgYmJveC5oZWlnaHQgPSBzaGFwZUhlaWdodDtcbiAgICAgICAgYmJveC53aWR0aCA9IHNoYXBlV2lkdGg7XG4gICAgICAgIG5vZGUuYXR0cnMgPSBfX2Fzc2lnbih7XG4gICAgICAgICAgZm9udFNpemU6IDEyLFxuICAgICAgICAgIGZpbGw6ICcjMDAwJ1xuICAgICAgICB9LCBhdHRycyk7XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIGlmIChhdHRycy53aWR0aCkge1xuICAgICAgICBzaGFwZVdpZHRoID0gYXR0cnMud2lkdGg7XG4gICAgICB9XG5cbiAgICAgIGlmIChhdHRycy5oZWlnaHQpIHtcbiAgICAgICAgc2hhcGVIZWlnaHQgPSBhdHRycy5oZWlnaHQ7XG4gICAgICB9XG5cbiAgfVxuXG4gIGlmIChzaGFwZUhlaWdodCA+PSAwKSB7XG4gICAgYmJveC5oZWlnaHQgPSBzaGFwZUhlaWdodDtcbiAgfVxuXG4gIGlmIChzaGFwZVdpZHRoID49IDApIHtcbiAgICBiYm94LndpZHRoID0gc2hhcGVXaWR0aDtcbiAgfVxuXG4gIGlmIChhdHRycy5tYXJnaW5Ub3ApIHtcbiAgICBiYm94LnkgKz0gYXR0cnMubWFyZ2luVG9wO1xuICB9XG5cbiAgaWYgKGF0dHJzLm1hcmdpbkxlZnQpIHtcbiAgICBiYm94LnggKz0gYXR0cnMubWFyZ2luTGVmdDtcbiAgfVxuXG4gIHJldHVybiBiYm94O1xufVxuLyoqXG4gKiDmiorku454bWzorqHnrpflh7rnmoTnu5PmnoTloavkuIrkvY3nva7kv6Hmga/vvIzooaXlhahhdHRyc1xuICogQHBhcmFtIHRhcmdldFxuICogQHBhcmFtIGxhc3RPZmZzZXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVUYXJnZXQodGFyZ2V0LCBsYXN0T2Zmc2V0KSB7XG4gIHZhciBfYTtcblxuICBpZiAobGFzdE9mZnNldCA9PT0gdm9pZCAwKSB7XG4gICAgbGFzdE9mZnNldCA9IHtcbiAgICAgIHg6IDAsXG4gICAgICB5OiAwXG4gICAgfTtcbiAgfVxuXG4gIHZhciBkZWZhdWx0QmJveCA9IF9fYXNzaWduKHtcbiAgICB4OiAwLFxuICAgIHk6IDAsXG4gICAgd2lkdGg6IDAsXG4gICAgaGVpZ2h0OiAwXG4gIH0sIGxhc3RPZmZzZXQpO1xuXG4gIGlmICgoX2EgPSB0YXJnZXQuY2hpbGRyZW4pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5sZW5ndGgpIHtcbiAgICB2YXIgX2IgPSB0YXJnZXQuYXR0cnMsXG4gICAgICAgIGF0dHJzID0gX2IgPT09IHZvaWQgMCA/IHt9IDogX2I7XG4gICAgdmFyIG1hcmdpblRvcCA9IGF0dHJzLm1hcmdpblRvcDtcblxuICAgIHZhciBvZmZzZXQgPSBfX2Fzc2lnbih7fSwgbGFzdE9mZnNldCk7XG5cbiAgICBpZiAobWFyZ2luVG9wKSB7XG4gICAgICBvZmZzZXQueSArPSBtYXJnaW5Ub3A7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IHRhcmdldC5jaGlsZHJlbi5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIHRhcmdldC5jaGlsZHJlbltpbmRleF0uYXR0cnMua2V5ID0gKGF0dHJzLmtleSB8fCAncm9vdCcpICsgXCIgLVwiICsgaW5kZXggKyBcIiBcIjtcbiAgICAgIHZhciBub2RlID0gZ2VuZXJhdGVUYXJnZXQodGFyZ2V0LmNoaWxkcmVuW2luZGV4XSwgb2Zmc2V0KTtcblxuICAgICAgaWYgKG5vZGUuYmJveCkge1xuICAgICAgICB2YXIgYmJveCA9IG5vZGUuYmJveDtcblxuICAgICAgICBpZiAobm9kZS5hdHRycy5uZXh0ID09PSAnaW5saW5lJykge1xuICAgICAgICAgIG9mZnNldC54ICs9IG5vZGUuYmJveC53aWR0aDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvZmZzZXQueSArPSBub2RlLmJib3guaGVpZ2h0O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGJib3gud2lkdGggKyBiYm94LnggPiBkZWZhdWx0QmJveC53aWR0aCkge1xuICAgICAgICAgIGRlZmF1bHRCYm94LndpZHRoID0gYmJveC53aWR0aCArIGJib3gueDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChiYm94LmhlaWdodCArIGJib3gueSA+IGRlZmF1bHRCYm94LmhlaWdodCkge1xuICAgICAgICAgIGRlZmF1bHRCYm94LmhlaWdodCA9IGJib3guaGVpZ2h0ICsgYmJveC55O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdGFyZ2V0LmJib3ggPSBnZXRCQm94KHRhcmdldCwgbGFzdE9mZnNldCwgZGVmYXVsdEJib3gpO1xuICB0YXJnZXQuYXR0cnMgPSBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgdGFyZ2V0LmF0dHJzKSwgdGFyZ2V0LmJib3gpO1xuICByZXR1cm4gdGFyZ2V0O1xufVxuLyoqXG4gKiDlr7nmr5TliY3lkI7kuKTkuKrmnIDnu4jorqHnrpflh7rmnaXnmoRub2Rl77yM5bm25a+55q+U5Ye65pyA5bCP5pS55YqoLFxuICog5Yqo5L2c77yaICdhZGQnIOa3u+WKoOiKgueCuSDvvZwg4oCZZGVsZXRl4oCYIOWIoOmZpOiKgueCuSDvvZwg4oCZY2hhbmdl4oCYIOaUueWPmOiKgueCuWF0dHJzIO+9nCAncmVzdHJ1Y3R1cmUnIOmHjeaehOiKgueCuVxuICogQHBhcmFtIG5vd1RhcmdldFxuICogQHBhcmFtIGZvcm1lclRhcmdldFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wYXJlVHdvVGFyZ2V0KG5vd1RhcmdldCwgZm9ybWVyVGFyZ2V0KSB7XG4gIHZhciBfYSwgX2IsIF9jLCBfZDtcblxuICB2YXIgdHlwZSA9IChub3dUYXJnZXQgfHwge30pLnR5cGU7XG4gIHZhciBrZXkgPSAoKGZvcm1lclRhcmdldCA9PT0gbnVsbCB8fCBmb3JtZXJUYXJnZXQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGZvcm1lclRhcmdldC5hdHRycykgfHwge30pLmtleTtcblxuICBpZiAoa2V5ICYmIG5vd1RhcmdldCkge1xuICAgIG5vd1RhcmdldC5hdHRycy5rZXkgPSBrZXk7XG4gIH1cblxuICBpZiAoIW5vd1RhcmdldCAmJiBmb3JtZXJUYXJnZXQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgYWN0aW9uOiAnZGVsZXRlJyxcbiAgICAgIHZhbDogZm9ybWVyVGFyZ2V0LFxuICAgICAgdHlwZTogdHlwZSxcbiAgICAgIGtleToga2V5XG4gICAgfTtcbiAgfVxuXG4gIGlmIChub3dUYXJnZXQgJiYgIWZvcm1lclRhcmdldCkge1xuICAgIHJldHVybiB7XG4gICAgICBhY3Rpb246ICdhZGQnLFxuICAgICAgdmFsOiBub3dUYXJnZXQsXG4gICAgICB0eXBlOiB0eXBlXG4gICAgfTtcbiAgfVxuXG4gIGlmICghbm93VGFyZ2V0ICYmICFmb3JtZXJUYXJnZXQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgYWN0aW9uOiAnc2FtZScsXG4gICAgICB0eXBlOiB0eXBlXG4gICAgfTtcbiAgfVxuXG4gIHZhciBjaGlsZHJlbiA9IFtdO1xuXG4gIGlmICgoKF9hID0gbm93VGFyZ2V0LmNoaWxkcmVuKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EubGVuZ3RoKSA+IDAgfHwgKChfYiA9IGZvcm1lclRhcmdldC5jaGlsZHJlbikgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmxlbmd0aCkgPiAwKSB7XG4gICAgdmFyIGxlbmd0aF8xID0gTWF0aC5tYXgoKF9jID0gbm93VGFyZ2V0LmNoaWxkcmVuKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MubGVuZ3RoLCAoX2QgPSBmb3JtZXJUYXJnZXQuY2hpbGRyZW4pID09PSBudWxsIHx8IF9kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZC5sZW5ndGgpO1xuICAgIHZhciBmb3JtZXJDaGlscmVuID0gZm9ybWVyVGFyZ2V0LmNoaWxkcmVuIHx8IFtdO1xuICAgIHZhciBub3dDaGlscmVuID0gbm93VGFyZ2V0LmNoaWxkcmVuIHx8IFtdO1xuXG4gICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aF8xOyBpbmRleCArPSAxKSB7XG4gICAgICBjaGlsZHJlbi5wdXNoKGNvbXBhcmVUd29UYXJnZXQobm93Q2hpbHJlbltpbmRleF0sIGZvcm1lckNoaWxyZW5baW5kZXhdKSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGZvcm1lcktleXMgPSBPYmplY3Qua2V5cyhmb3JtZXJUYXJnZXQuYXR0cnMpO1xuICB2YXIgbm93S2V5cyA9IE9iamVjdC5rZXlzKG5vd1RhcmdldC5hdHRycyk7XG5cbiAgaWYgKGZvcm1lclRhcmdldC50eXBlICE9PSBub3dUYXJnZXQudHlwZSkge1xuICAgIHJldHVybiB7XG4gICAgICBhY3Rpb246ICdyZXN0cnVjdHVyZScsXG4gICAgICBub3dUYXJnZXQ6IG5vd1RhcmdldCxcbiAgICAgIGZvcm1lclRhcmdldDogZm9ybWVyVGFyZ2V0LFxuICAgICAga2V5OiBrZXksXG4gICAgICBjaGlsZHJlbjogY2hpbGRyZW5cbiAgICB9O1xuICB9XG5cbiAgaWYgKGZvcm1lcktleXMuZmlsdGVyKGZ1bmN0aW9uIChlKSB7XG4gICAgcmV0dXJuIGUgIT09ICdjaGlsZHJlbic7XG4gIH0pLnNvbWUoZnVuY3Rpb24gKGUpIHtcbiAgICByZXR1cm4gbm93VGFyZ2V0LmF0dHJzW2VdICE9PSBmb3JtZXJUYXJnZXQuYXR0cnNbZV0gfHwgIW5vd0tleXMuaW5jbHVkZXMoZSk7XG4gIH0pKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFjdGlvbjogJ2NoYW5nZScsXG4gICAgICB2YWw6IG5vd1RhcmdldCxcbiAgICAgIGNoaWxkcmVuOiBjaGlsZHJlbixcbiAgICAgIHR5cGU6IHR5cGUsXG4gICAgICBrZXk6IGtleVxuICAgIH07XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGFjdGlvbjogJ3NhbWUnLFxuICAgIGNoaWxkcmVuOiBjaGlsZHJlbixcbiAgICB0eXBlOiB0eXBlLFxuICAgIGtleToga2V5XG4gIH07XG59XG4vKipcbiAqIOagueaNrnhtbOaIluiAhei/lOWbnnhtbOeahOWHveaVsOaehOW7uuiHquWumuS5ieiKgueCueeahOe7k+aehFxuICogQHBhcmFtIGdlblxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVOb2RlRnJvbVhNTChnZW4pIHtcbiAgdmFyIHN0cnVjdHVyZXMgPSB7fTtcblxuICB2YXIgY29tcGlsZVhNTCA9IGZ1bmN0aW9uIGNvbXBpbGVYTUwoY2ZnKSB7XG4gICAgdmFyIHJhd1N0ciA9IHR5cGVvZiBnZW4gPT09ICdmdW5jdGlvbicgPyBnZW4oY2ZnKSA6IGdlbjtcbiAgICB2YXIgdGFyZ2V0ID0geG1sRGF0YVJlbmRlcmVyKHJhd1N0cikoY2ZnKTtcbiAgICB2YXIgeG1sUGFyc2VyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgeG1sUGFyc2VyLmlubmVySFRNTCA9IHRhcmdldDtcbiAgICB2YXIgeG1sID0geG1sUGFyc2VyLmNoaWxkcmVuWzBdO1xuICAgIHZhciByZXN1bHQgPSBnZW5lcmF0ZVRhcmdldChwYXJzZVhNTCh4bWwsIGNmZykpO1xuICAgIHhtbFBhcnNlci5yZW1vdmUoKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG4gIHJldHVybiB7XG4gICAgZHJhdzogZnVuY3Rpb24gZHJhdyhjZmcsIGdyb3VwKSB7XG4gICAgICB2YXIgcmVzdWx0VGFyZ2V0ID0gY29tcGlsZVhNTChjZmcpO1xuICAgICAgdmFyIGtleXNoYXBlID0gZ3JvdXA7XG5cbiAgICAgIHZhciByZW5kZXJUYXJnZXQgPSBmdW5jdGlvbiByZW5kZXJUYXJnZXQodGFyZ2V0KSB7XG4gICAgICAgIHZhciBfYSA9IHRhcmdldC5hdHRycyxcbiAgICAgICAgICAgIGF0dHJzID0gX2EgPT09IHZvaWQgMCA/IHt9IDogX2EsXG4gICAgICAgICAgICBiYm94ID0gdGFyZ2V0LmJib3gsXG4gICAgICAgICAgICB0eXBlID0gdGFyZ2V0LnR5cGUsXG4gICAgICAgICAgICBjaGlsZHJlbiA9IHRhcmdldC5jaGlsZHJlbixcbiAgICAgICAgICAgIHJlc3QgPSBfX3Jlc3QodGFyZ2V0LCBbXCJhdHRyc1wiLCBcImJib3hcIiwgXCJ0eXBlXCIsIFwiY2hpbGRyZW5cIl0pO1xuXG4gICAgICAgIGlmICh0YXJnZXQudHlwZSAhPT0gJ2dyb3VwJykge1xuICAgICAgICAgIHZhciBzaGFwZSA9IGdyb3VwLmFkZFNoYXBlKHRhcmdldC50eXBlLCBfX2Fzc2lnbih7XG4gICAgICAgICAgICBhdHRyczogYXR0cnMsXG4gICAgICAgICAgICBvcmlnaW46IHtcbiAgICAgICAgICAgICAgYmJveDogYmJveCxcbiAgICAgICAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgICAgICAgY2hpbGRyZW46IGNoaWxkcmVuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSwgcmVzdCkpO1xuXG4gICAgICAgICAgaWYgKHRhcmdldC5rZXlzaGFwZSkge1xuICAgICAgICAgICAga2V5c2hhcGUgPSBzaGFwZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGFyZ2V0LmNoaWxkcmVuKSB7XG4gICAgICAgICAgdGFyZ2V0LmNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24gKG4pIHtcbiAgICAgICAgICAgIHJldHVybiByZW5kZXJUYXJnZXQobik7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHJlbmRlclRhcmdldChyZXN1bHRUYXJnZXQpO1xuICAgICAgc3RydWN0dXJlc1tjZmcuaWRdID0gW3Jlc3VsdFRhcmdldF07XG4gICAgICByZXR1cm4ga2V5c2hhcGU7XG4gICAgfSxcbiAgICB1cGRhdGU6IGZ1bmN0aW9uIHVwZGF0ZShjZmcsIG5vZGUpIHtcbiAgICAgIGlmICghc3RydWN0dXJlc1tjZmcuaWRdKSB7XG4gICAgICAgIHN0cnVjdHVyZXNbY2ZnLmlkXSA9IFtdO1xuICAgICAgfVxuXG4gICAgICB2YXIgY29udGFpbmVyID0gbm9kZS5nZXRDb250YWluZXIoKTtcbiAgICAgIHZhciBjaGlsZHJlbiA9IGNvbnRhaW5lci5nZXQoJ2NoaWxkcmVuJyk7XG4gICAgICB2YXIgbmV3VGFyZ2V0ID0gY29tcGlsZVhNTChjZmcpO1xuICAgICAgdmFyIGxhc3RUYXJnZXQgPSBzdHJ1Y3R1cmVzW2NmZy5pZF0ucG9wKCk7XG4gICAgICB2YXIgZGlmZlJlc3VsdCA9IGNvbXBhcmVUd29UYXJnZXQobmV3VGFyZ2V0LCBsYXN0VGFyZ2V0KTtcblxuICAgICAgdmFyIGFkZFNoYXBlID0gZnVuY3Rpb24gYWRkU2hhcGUoc2hhcGUpIHtcbiAgICAgICAgdmFyIF9hO1xuXG4gICAgICAgIGlmIChzaGFwZS50eXBlICE9PSAnZ3JvdXAnKSB7XG4gICAgICAgICAgY29udGFpbmVyLmFkZFNoYXBlKHNoYXBlLnR5cGUsIHtcbiAgICAgICAgICAgIGF0dHJzOiBzaGFwZS5hdHRyc1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKChfYSA9IHNoYXBlLmNoaWxkcmVuKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EubGVuZ3RoKSB7XG4gICAgICAgICAgc2hhcGUuY2hpbGRyZW4ubWFwKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICByZXR1cm4gYWRkU2hhcGUoZSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHZhciBkZWxTaGFwZSA9IGZ1bmN0aW9uIGRlbFNoYXBlKHNoYXBlKSB7XG4gICAgICAgIHZhciBfYTtcblxuICAgICAgICB2YXIgdGFyZ2V0U2hhcGUgPSBjaGlsZHJlbi5maW5kKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgcmV0dXJuIGUuYXR0cnMua2V5ID09PSBzaGFwZS5hdHRycy5rZXk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICh0YXJnZXRTaGFwZSkge1xuICAgICAgICAgIGNvbnRhaW5lci5yZW1vdmVDaGlsZCh0YXJnZXRTaGFwZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoKF9hID0gc2hhcGUuY2hpbGRyZW4pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5sZW5ndGgpIHtcbiAgICAgICAgICBzaGFwZS5jaGlsZHJlbi5tYXAoZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgIHJldHVybiBkZWxTaGFwZShlKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgdmFyIHVwZGF0ZVRhcmdldCA9IGZ1bmN0aW9uIHVwZGF0ZVRhcmdldCh0YXJnZXQpIHtcbiAgICAgICAgdmFyIGtleSA9IHRhcmdldC5rZXk7XG5cbiAgICAgICAgaWYgKHRhcmdldC50eXBlICE9PSAnZ3JvdXAnKSB7XG4gICAgICAgICAgdmFyIHRhcmdldFNoYXBlID0gY2hpbGRyZW4uZmluZChmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgcmV0dXJuIGUuYXR0cnMua2V5ID09PSBrZXk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBzd2l0Y2ggKHRhcmdldC5hY3Rpb24pIHtcbiAgICAgICAgICAgIGNhc2UgJ2NoYW5nZSc6XG4gICAgICAgICAgICAgIGlmICh0YXJnZXRTaGFwZSkge1xuICAgICAgICAgICAgICAgIHZhciBvcmlnaW5BdHRyID0gdGFyZ2V0LnZhbC5rZXlzaGFwZSA/IG5vZGUuZ2V0T3JpZ2luU3R5bGUoKSA6IHt9O1xuICAgICAgICAgICAgICAgIHRhcmdldFNoYXBlLmF0dHIoX19hc3NpZ24oX19hc3NpZ24oe30sIG9yaWdpbkF0dHIpLCB0YXJnZXQudmFsLmF0dHJzKSk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSAnYWRkJzpcbiAgICAgICAgICAgICAgYWRkU2hhcGUodGFyZ2V0LnZhbCk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlICdkZWxldGUnOlxuICAgICAgICAgICAgICBkZWxTaGFwZSh0YXJnZXQudmFsKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgJ3Jlc3RydWN0dXJlJzpcbiAgICAgICAgICAgICAgZGVsU2hhcGUodGFyZ2V0LmZvcm1lclRhcmdldCk7XG4gICAgICAgICAgICAgIGFkZFNoYXBlKHRhcmdldC5ub3dUYXJnZXQpO1xuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRhcmdldC5jaGlsZHJlbikge1xuICAgICAgICAgIHRhcmdldC5jaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChuKSB7XG4gICAgICAgICAgICByZXR1cm4gdXBkYXRlVGFyZ2V0KG4pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICB1cGRhdGVUYXJnZXQoZGlmZlJlc3VsdCk7XG4gICAgICBzdHJ1Y3R1cmVzW2NmZy5pZF0ucHVzaChuZXdUYXJnZXQpO1xuICAgIH0sXG4gICAgZ2V0QW5jaG9yUG9pbnRzOiBmdW5jdGlvbiBnZXRBbmNob3JQb2ludHMoKSB7XG4gICAgICByZXR1cm4gW1swLCAwLjVdLCBbMSwgMC41XSwgWzAuNSwgMV0sIFswLjUsIDBdXTtcbiAgICB9XG4gIH07XG59IiwiaW1wb3J0IHsgX19hc3NpZ24gfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IHVwcGVyRmlyc3QgfSBmcm9tICdAYW50di91dGlsJztcbmltcG9ydCB7IGNyZWF0ZU5vZGVGcm9tWE1MIH0gZnJvbSAnLi94bWwnO1xudmFyIGNhY2hlID0ge307IC8vIHVjZmlyc3Qg5byA6ZSA6L+H5aSn77yM6L+b6KGM57yT5a2YXG4vLyDpppblrZfmr43lpKflhplcblxuZnVuY3Rpb24gdWNmaXJzdChzdHIpIHtcbiAgaWYgKCFjYWNoZVtzdHJdKSB7XG4gICAgY2FjaGVbc3RyXSA9IHVwcGVyRmlyc3Qoc3RyKTtcbiAgfVxuXG4gIHJldHVybiBjYWNoZVtzdHJdO1xufVxuLyoqXG4gKiDlt6XljoLmlrnms5XnmoTln7rnsbtcbiAqIEB0eXBlIFNoYXBlLkZhY3RvcnlCYXNlXG4gKi9cblxuXG5leHBvcnQgdmFyIFNoYXBlRmFjdG9yeUJhc2UgPSB7XG4gIC8qKlxuICAgKiDpu5jorqTnmoTlvaLnirbvvIzlvZPmsqHmnInmjIflrpov5Yy56YWNIHNoYXBlVHlwZSDml7bvvIzkvb/nlKjpu5jorqTnmoRcbiAgICogQHR5cGUge1N0cmluZ31cbiAgICovXG4gIGRlZmF1bHRTaGFwZVR5cGU6ICdkZWZhdWx0VHlwZScsXG5cbiAgLyoqXG4gICAqIOW9oueKtueahCBjbGFzc05hbWXvvIznlKjkuo7mkJzntKJcbiAgICogQHR5cGUge1N0cmluZ31cbiAgICovXG4gIGNsYXNzTmFtZTogbnVsbCxcblxuICAvKipcbiAgICog6I635Y+W57uY5Yi2IFNoYXBlIOeahOW3peWFt+exu++8jOaXoOeKtuaAgVxuICAgKiBAcGFyYW0gIHtTdHJpbmd9IHR5cGUg57G75Z6LXG4gICAqIEByZXR1cm4ge1NoYXBlfSDlt6XlhbfnsbtcbiAgICovXG4gIGdldFNoYXBlOiBmdW5jdGlvbiBnZXRTaGFwZSh0eXBlKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBzaGFwZSA9IHNlbGZbdHlwZV0gfHwgc2VsZltzZWxmLmRlZmF1bHRTaGFwZVR5cGVdIHx8IHNlbGZbJ3NpbXBsZS1jaXJjbGUnXTtcbiAgICByZXR1cm4gc2hhcGU7XG4gIH0sXG5cbiAgLyoqXG4gICAqIOe7mOWItuWbvuW9olxuICAgKiBAcGFyYW0gIHtTdHJpbmd9IHR5cGUgIOexu+Wei1xuICAgKiBAcGFyYW0gIHtPYmplY3R9IGNmZyDphY3nva7poblcbiAgICogQHBhcmFtICB7Ry5Hcm91cH0gZ3JvdXAg5Zu+5b2i55qE5YiG57uEXG4gICAqIEByZXR1cm4ge0lTaGFwZX0g5Zu+5b2i5a+56LGhXG4gICAqL1xuICBkcmF3OiBmdW5jdGlvbiBkcmF3KHR5cGUsIGNmZywgZ3JvdXApIHtcbiAgICB2YXIgc2hhcGUgPSB0aGlzLmdldFNoYXBlKHR5cGUpO1xuICAgIGdyb3VwWydzaGFwZU1hcCddID0ge307XG4gICAgdmFyIHJzdCA9IHNoYXBlLmRyYXcoY2ZnLCBncm91cCk7XG5cbiAgICBpZiAoc2hhcGUuYWZ0ZXJEcmF3KSB7XG4gICAgICBzaGFwZS5hZnRlckRyYXcoY2ZnLCBncm91cCwgcnN0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcnN0O1xuICB9LFxuXG4gIC8qKlxuICAgKiDmm7TmlrBcbiAgICogQHBhcmFtICB7U3RyaW5nfSB0eXBlICDnsbvlnotcbiAgICogQHBhcmFtICB7T2JqZWN0fSBjZmcg6YWN572u6aG5XG4gICAqIEBwYXJhbSAge0c2Lkl0ZW19IGl0ZW0g6IqC54K544CB6L6544CB5YiG57uE562JXG4gICAqL1xuICBiYXNlVXBkYXRlOiBmdW5jdGlvbiBiYXNlVXBkYXRlKHR5cGUsIGNmZywgaXRlbSwgdXBkYXRlVHlwZSkge1xuICAgIHZhciBfYSwgX2I7XG5cbiAgICB2YXIgc2hhcGUgPSB0aGlzLmdldFNoYXBlKHR5cGUpOyAvLyDpmLLmraLmsqHlrprkuYkgdXBkYXRlIOWHveaVsFxuXG4gICAgaWYgKHNoYXBlLnVwZGF0ZSkge1xuICAgICAgLy8gc2hhcGUubWVyZ2VTdHlsZSA9IHVwZGF0ZVR5cGUgPT09ICdtb3ZlJyB8fCB1cGRhdGVUeXBlID09PSAnYmJveCcgPyB7fSA6IHNoYXBlLmdldE9wdGlvbnM/LihjZmcpO1xuICAgICAgc2hhcGUubWVyZ2VTdHlsZSA9IChfYSA9IHNoYXBlLmdldE9wdGlvbnMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jYWxsKHNoYXBlLCBjZmcsIHVwZGF0ZVR5cGUpO1xuICAgICAgKF9iID0gc2hhcGUudXBkYXRlKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuY2FsbChzaGFwZSwgY2ZnLCBpdGVtLCB1cGRhdGVUeXBlKTtcbiAgICB9XG5cbiAgICBpZiAoc2hhcGUuYWZ0ZXJVcGRhdGUpIHtcbiAgICAgIHNoYXBlLmFmdGVyVXBkYXRlKGNmZywgaXRlbSk7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiDorr7nva7nirbmgIFcbiAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgIOexu+Wei1xuICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZSAg54q25oCB5ZCNXG4gICAqIEBwYXJhbSB7U3RyaW5nIHwgQm9vbGVhbn0gdmFsdWUg54q25oCB5YC8XG4gICAqIEBwYXJhbSB7RzYuSXRlbX0gaXRlbSAg6IqC54K544CB6L6544CB5YiG57uE562JXG4gICAqL1xuICBzZXRTdGF0ZTogZnVuY3Rpb24gc2V0U3RhdGUodHlwZSwgbmFtZSwgdmFsdWUsIGl0ZW0pIHtcbiAgICB2YXIgc2hhcGUgPSB0aGlzLmdldFNoYXBlKHR5cGUpOyAvLyDosIPnlKggc2hhcGUvc2hhcGVCYXNlLnRzIOS4reeahCBzZXRTdGF0ZSDmlrnms5VcblxuICAgIHNoYXBlLnNldFN0YXRlKG5hbWUsIHZhbHVlLCBpdGVtKTtcbiAgfSxcblxuICAvKipcbiAgICog5piv5ZCm5YWB6K645pu05paw77yM5LiN6YeN5paw57uY5Yi25Zu+5b2iXG4gICAqIEBwYXJhbSAge1N0cmluZ30gdHlwZSDnsbvlnotcbiAgICogQHJldHVybiB7Qm9vbGVhbn0g5piv5ZCm5YWB6K645L2/55So5pu05pawXG4gICAqL1xuICBzaG91bGRVcGRhdGU6IGZ1bmN0aW9uIHNob3VsZFVwZGF0ZSh0eXBlKSB7XG4gICAgdmFyIHNoYXBlID0gdGhpcy5nZXRTaGFwZSh0eXBlKTtcbiAgICByZXR1cm4gISFzaGFwZS51cGRhdGU7XG4gIH0sXG4gIGdldENvbnRyb2xQb2ludHM6IGZ1bmN0aW9uIGdldENvbnRyb2xQb2ludHModHlwZSwgY2ZnKSB7XG4gICAgdmFyIHNoYXBlID0gdGhpcy5nZXRTaGFwZSh0eXBlKTtcbiAgICByZXR1cm4gc2hhcGUuZ2V0Q29udHJvbFBvaW50cyhjZmcpO1xuICB9LFxuXG4gIC8qKlxuICAgKiDojrflj5bmjqfliLbngrlcbiAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGUg6IqC54K544CB6L6557G75Z6LXG4gICAqIEBwYXJhbSAge09iamVjdH0gY2ZnIOiKgueCueOAgei+ueeahOmFjee9rumhuVxuICAgKiBAcmV0dXJuIHtBcnJheXxudWxsfSDmjqfliLbngrnnmoTmlbDnu4Qs5aaC5p6c5Li6IG51bGzvvIzliJnmsqHmnInmjqfliLbngrlcbiAgICovXG4gIGdldEFuY2hvclBvaW50czogZnVuY3Rpb24gZ2V0QW5jaG9yUG9pbnRzKHR5cGUsIGNmZykge1xuICAgIHZhciBzaGFwZSA9IHRoaXMuZ2V0U2hhcGUodHlwZSk7XG4gICAgcmV0dXJuIHNoYXBlLmdldEFuY2hvclBvaW50cyhjZmcpO1xuICB9XG59O1xuLyoqXG4gKiDlhYPntKDnmoTmoYbmnrZcbiAqL1xuXG52YXIgU2hhcGVGcmFtZXdvcmsgPSB7XG4gIC8vIOm7mOiupOagt+W8j+WPiumFjee9rlxuICBvcHRpb25zOiB7fSxcblxuICAvKipcbiAgICog57uY5Yi2XG4gICAqL1xuICBkcmF3OiBmdW5jdGlvbiBkcmF3KGNmZywgZ3JvdXApIHtcbiAgICByZXR1cm4gdGhpcy5kcmF3U2hhcGUoY2ZnLCBncm91cCk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIOe7mOWItlxuICAgKi9cbiAgZHJhd1NoYXBlOiBmdW5jdGlvbiBkcmF3U2hhcGUoKSB7fSxcblxuICAvKipcbiAgICog57uY5Yi25a6M5oiQ5ZCO55qE5pON5L2c77yM5L6/5LqO55So5oi357un5om/546w5pyJ55qE6IqC54K544CB6L65XG4gICAqL1xuICBhZnRlckRyYXc6IGZ1bmN0aW9uIGFmdGVyRHJhdygpIHt9LFxuICAvLyB1cGRhdGUoY2ZnLCBpdGVtKSAvLyDpu5jorqTkuI3lrprkuYlcbiAgYWZ0ZXJVcGRhdGU6IGZ1bmN0aW9uIGFmdGVyVXBkYXRlKCkge30sXG5cbiAgLyoqXG4gICAqIOiuvue9ruiKgueCueOAgei+ueeKtuaAgVxuICAgKi9cbiAgc2V0U3RhdGU6IGZ1bmN0aW9uIHNldFN0YXRlKCkge30sXG5cbiAgLyoqXG4gICAqIOiOt+WPluaOp+WItueCuVxuICAgKiBAcGFyYW0gIHtPYmplY3R9IGNmZyDoioLngrnjgIHovrnnmoTphY3nva7poblcbiAgICogQHJldHVybiB7QXJyYXl8bnVsbH0g5o6n5Yi254K555qE5pWw57uELOWmguaenOS4uiBudWxs77yM5YiZ5rKh5pyJ5o6n5Yi254K5XG4gICAqL1xuICBnZXRDb250cm9sUG9pbnRzOiBmdW5jdGlvbiBnZXRDb250cm9sUG9pbnRzKGNmZykge1xuICAgIHJldHVybiBjZmcuY29udHJvbFBvaW50cztcbiAgfSxcblxuICAvKipcbiAgICog6I635Y+W5o6n5Yi254K5XG4gICAqIEBwYXJhbSAge09iamVjdH0gY2ZnIOiKgueCueOAgei+ueeahOmFjee9rumhuVxuICAgKiBAcmV0dXJuIHtBcnJheXxudWxsfSDmjqfliLbngrnnmoTmlbDnu4Qs5aaC5p6c5Li6IG51bGzvvIzliJnmsqHmnInmjqfliLbngrlcbiAgICovXG4gIGdldEFuY2hvclBvaW50czogZnVuY3Rpb24gZ2V0QW5jaG9yUG9pbnRzKGNmZykge1xuICAgIHZhciBkZWZhdWx0QW5jaG9yUG9pbnRzID0gdGhpcy5vcHRpb25zLmFuY2hvclBvaW50cztcbiAgICB2YXIgYW5jaG9yUG9pbnRzID0gY2ZnLmFuY2hvclBvaW50cyB8fCBkZWZhdWx0QW5jaG9yUG9pbnRzO1xuICAgIHJldHVybiBhbmNob3JQb2ludHM7XG4gIH1cbiAgLyog5aaC5p6c5rKh5a6a5LmJIHVwZGF0ZSDmlrnms5XvvIzmr4/mrKHpg73osIPnlKggZHJhdyDmlrnms5VcbiAgdXBkYXRlKGNmZywgaXRlbSkge1xuICAgICB9XG4gICovXG5cbn07XG5cbnZhciBTaGFwZSA9XG4vKiogQGNsYXNzICovXG5mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFNoYXBlKCkge31cblxuICBTaGFwZS5yZWdpc3RlckZhY3RvcnkgPSBmdW5jdGlvbiAoZmFjdG9yeVR5cGUsIGNmZykge1xuICAgIHZhciBjbGFzc05hbWUgPSB1Y2ZpcnN0KGZhY3RvcnlUeXBlKTtcbiAgICB2YXIgZmFjdG9yeUJhc2UgPSBTaGFwZUZhY3RvcnlCYXNlO1xuXG4gICAgdmFyIHNoYXBlRmFjdG9yeSA9IF9fYXNzaWduKF9fYXNzaWduKHt9LCBmYWN0b3J5QmFzZSksIGNmZyk7XG5cbiAgICBTaGFwZVtjbGFzc05hbWVdID0gc2hhcGVGYWN0b3J5O1xuICAgIHNoYXBlRmFjdG9yeS5jbGFzc05hbWUgPSBjbGFzc05hbWU7XG4gICAgcmV0dXJuIHNoYXBlRmFjdG9yeTtcbiAgfTtcblxuICBTaGFwZS5nZXRGYWN0b3J5ID0gZnVuY3Rpb24gKGZhY3RvcnlUeXBlKSB7XG4gICAgdmFyIGNsYXNzTmFtZSA9IHVjZmlyc3QoZmFjdG9yeVR5cGUpO1xuICAgIHJldHVybiBTaGFwZVtjbGFzc05hbWVdO1xuICB9O1xuXG4gIFNoYXBlLnJlZ2lzdGVyTm9kZSA9IGZ1bmN0aW9uIChzaGFwZVR5cGUsIG5vZGVEZWZpbml0aW9uLCBleHRlbmRTaGFwZVR5cGUpIHtcbiAgICB2YXIgc2hhcGVGYWN0b3J5ID0gU2hhcGUuTm9kZTtcbiAgICB2YXIgc2hhcGVPYmo7XG5cbiAgICBpZiAodHlwZW9mIG5vZGVEZWZpbml0aW9uID09PSAnc3RyaW5nJyB8fCB0eXBlb2Ygbm9kZURlZmluaXRpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciBhdXRvTm9kZURlZmluaXRpb24gPSBjcmVhdGVOb2RlRnJvbVhNTChub2RlRGVmaW5pdGlvbik7XG4gICAgICBzaGFwZU9iaiA9IF9fYXNzaWduKF9fYXNzaWduKHt9LCBzaGFwZUZhY3RvcnkuZ2V0U2hhcGUoJ3NpbmdsZS1ub2RlJykpLCBhdXRvTm9kZURlZmluaXRpb24pO1xuICAgIH0gZWxzZSBpZiAobm9kZURlZmluaXRpb24uanN4KSB7XG4gICAgICB2YXIganN4ID0gbm9kZURlZmluaXRpb24uanN4O1xuICAgICAgdmFyIGF1dG9Ob2RlRGVmaW5pdGlvbiA9IGNyZWF0ZU5vZGVGcm9tWE1MKGpzeCk7XG4gICAgICBzaGFwZU9iaiA9IF9fYXNzaWduKF9fYXNzaWduKF9fYXNzaWduKHt9LCBzaGFwZUZhY3RvcnkuZ2V0U2hhcGUoJ3NpbmdsZS1ub2RlJykpLCBhdXRvTm9kZURlZmluaXRpb24pLCBub2RlRGVmaW5pdGlvbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNoYXBlRmFjdG9yeS5nZXRTaGFwZShleHRlbmRTaGFwZVR5cGUpO1xuICAgICAgdmFyIGV4dGVuZFNoYXBlID0gZXh0ZW5kU2hhcGVUeXBlID8gc2hhcGVGYWN0b3J5LmdldFNoYXBlKGV4dGVuZFNoYXBlVHlwZSkgOiBTaGFwZUZyYW1ld29yaztcbiAgICAgIHNoYXBlT2JqID0gX19hc3NpZ24oX19hc3NpZ24oe30sIGV4dGVuZFNoYXBlKSwgbm9kZURlZmluaXRpb24pO1xuICAgIH1cblxuICAgIHNoYXBlT2JqLnR5cGUgPSBzaGFwZVR5cGU7XG4gICAgc2hhcGVPYmouaXRlbVR5cGUgPSAnbm9kZSc7XG4gICAgc2hhcGVGYWN0b3J5W3NoYXBlVHlwZV0gPSBzaGFwZU9iajtcbiAgICByZXR1cm4gc2hhcGVPYmo7XG4gIH07XG5cbiAgU2hhcGUucmVnaXN0ZXJFZGdlID0gZnVuY3Rpb24gKHNoYXBlVHlwZSwgZWRnZURlZmluaXRpb24sIGV4dGVuZFNoYXBlVHlwZSkge1xuICAgIHZhciBzaGFwZUZhY3RvcnkgPSBTaGFwZS5FZGdlO1xuICAgIHZhciBleHRlbmRTaGFwZSA9IGV4dGVuZFNoYXBlVHlwZSA/IHNoYXBlRmFjdG9yeS5nZXRTaGFwZShleHRlbmRTaGFwZVR5cGUpIDogU2hhcGVGcmFtZXdvcms7XG5cbiAgICB2YXIgc2hhcGVPYmogPSBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgZXh0ZW5kU2hhcGUpLCBlZGdlRGVmaW5pdGlvbik7XG5cbiAgICBzaGFwZU9iai50eXBlID0gc2hhcGVUeXBlO1xuICAgIHNoYXBlT2JqLml0ZW1UeXBlID0gJ2VkZ2UnO1xuICAgIHNoYXBlRmFjdG9yeVtzaGFwZVR5cGVdID0gc2hhcGVPYmo7XG4gICAgcmV0dXJuIHNoYXBlT2JqO1xuICB9O1xuXG4gIFNoYXBlLnJlZ2lzdGVyQ29tYm8gPSBmdW5jdGlvbiAoc2hhcGVUeXBlLCBjb21ib0RlZmluaXRpb24sIGV4dGVuZFNoYXBlVHlwZSkge1xuICAgIHZhciBzaGFwZUZhY3RvcnkgPSBTaGFwZS5Db21ibztcbiAgICB2YXIgZXh0ZW5kU2hhcGUgPSBleHRlbmRTaGFwZVR5cGUgPyBzaGFwZUZhY3RvcnkuZ2V0U2hhcGUoZXh0ZW5kU2hhcGVUeXBlKSA6IFNoYXBlRnJhbWV3b3JrO1xuXG4gICAgdmFyIHNoYXBlT2JqID0gX19hc3NpZ24oX19hc3NpZ24oe30sIGV4dGVuZFNoYXBlKSwgY29tYm9EZWZpbml0aW9uKTtcblxuICAgIHNoYXBlT2JqLnR5cGUgPSBzaGFwZVR5cGU7XG4gICAgc2hhcGVPYmouaXRlbVR5cGUgPSAnY29tYm8nO1xuICAgIHNoYXBlRmFjdG9yeVtzaGFwZVR5cGVdID0gc2hhcGVPYmo7XG4gICAgcmV0dXJuIHNoYXBlT2JqO1xuICB9O1xuXG4gIHJldHVybiBTaGFwZTtcbn0oKTtcblxuZXhwb3J0IGRlZmF1bHQgU2hhcGU7IC8vIOazqOWGjCBOb2RlIOeahOW3peWOguaWueazlVxuXG5TaGFwZS5yZWdpc3RlckZhY3RvcnkoJ25vZGUnLCB7XG4gIGRlZmF1bHRTaGFwZVR5cGU6ICdjaXJjbGUnXG59KTsgLy8g5rOo5YaMIEVkZ2Ug55qE5bel5Y6C5pa55rOVXG5cblNoYXBlLnJlZ2lzdGVyRmFjdG9yeSgnZWRnZScsIHtcbiAgZGVmYXVsdFNoYXBlVHlwZTogJ2xpbmUnXG59KTsgLy8g5rOo5YaMIENvbWJvIOeahOW3peWOguaWueazlVxuXG5TaGFwZS5yZWdpc3RlckZhY3RvcnkoJ2NvbWJvJywge1xuICBkZWZhdWx0U2hhcGVUeXBlOiAnY2lyY2xlJ1xufSk7IiwiaW1wb3J0IHsgX19hc3NpZ24gfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGVhY2gsIGlzUGxhaW5PYmplY3QsIGlzU3RyaW5nLCBpc0Jvb2xlYW4sIG1peCwgZGVlcE1peCwgY2xvbmUgfSBmcm9tICdAYW50di91dGlsJztcbmltcG9ydCBTaGFwZSBmcm9tICcuLi9lbGVtZW50L3NoYXBlJztcbmltcG9ydCB7IGdldEJCb3ggfSBmcm9tICcuLi91dGlsL2dyYXBoaWMnO1xuaW1wb3J0IHsgdHJhbnNsYXRlIH0gZnJvbSAnLi4vdXRpbC9tYXRoJztcbmltcG9ydCB7IHVuaXF1ZUlkIH0gZnJvbSAnLi4vdXRpbC9iYXNlJztcbnZhciBDQUNIRV9CQk9YID0gJ2Jib3hDYWNoZSc7XG52YXIgQ0FDSEVfQ0FOVkFTX0JCT1ggPSAnYmJveENhbnZhc0NhY2hlJztcbnZhciBBUlJPV1MgPSBbJ3N0YXJ0QXJyb3cnLCAnZW5kQXJyb3cnXTtcblxudmFyIEl0ZW1CYXNlID1cbi8qKiBAY2xhc3MgKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gSXRlbUJhc2UoY2ZnKSB7XG4gICAgdGhpcy5fY2ZnID0ge307XG4gICAgdGhpcy5kZXN0cm95ZWQgPSBmYWxzZTtcbiAgICB2YXIgZGVmYXVsdENmZyA9IHtcbiAgICAgIC8qKlxuICAgICAgICogaWRcbiAgICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICAgKi9cbiAgICAgIGlkOiB1bmRlZmluZWQsXG5cbiAgICAgIC8qKlxuICAgICAgICog57G75Z6LXG4gICAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAgICovXG4gICAgICB0eXBlOiAnaXRlbScsXG5cbiAgICAgIC8qKlxuICAgICAgICogZGF0YSBtb2RlbFxuICAgICAgICogQHR5cGUge29iamVjdH1cbiAgICAgICAqL1xuICAgICAgbW9kZWw6IHt9LFxuXG4gICAgICAvKipcbiAgICAgICAqIGcgZ3JvdXBcbiAgICAgICAqIEB0eXBlIHtHLkdyb3VwfVxuICAgICAgICovXG4gICAgICBncm91cDogdW5kZWZpbmVkLFxuXG4gICAgICAvKipcbiAgICAgICAqIGlzIG9wZW4gYW5pbWF0ZVxuICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgKi9cbiAgICAgIGFuaW1hdGU6IGZhbHNlLFxuXG4gICAgICAvKipcbiAgICAgICAqIHZpc2libGUgLSBub3QgZ3JvdXAgdmlzaWJsZVxuICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgKi9cbiAgICAgIHZpc2libGU6IHRydWUsXG5cbiAgICAgIC8qKlxuICAgICAgICogbG9ja2VkIC0gbG9jayBub2RlXG4gICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAqL1xuICAgICAgbG9ja2VkOiBmYWxzZSxcblxuICAgICAgLyoqXG4gICAgICAgKiBjYXB0dXJlIGV2ZW50XG4gICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAqL1xuICAgICAgZXZlbnQ6IHRydWUsXG5cbiAgICAgIC8qKlxuICAgICAgICoga2V5IHNoYXBlIHRvIGNhbGN1bGF0ZSBpdGVtJ3MgYmJveFxuICAgICAgICogQHR5cGUgb2JqZWN0XG4gICAgICAgKi9cbiAgICAgIGtleVNoYXBlOiB1bmRlZmluZWQsXG5cbiAgICAgIC8qKlxuICAgICAgICogaXRlbSdzIHN0YXRlcywgc3VjaCBhcyBzZWxlY3RlZCBvciBhY3RpdmVcbiAgICAgICAqIEB0eXBlIEFycmF5XG4gICAgICAgKi9cbiAgICAgIHN0YXRlczogW11cbiAgICB9O1xuICAgIHRoaXMuX2NmZyA9IE9iamVjdC5hc3NpZ24oZGVmYXVsdENmZywgdGhpcy5nZXREZWZhdWx0Q2ZnKCksIGNmZyk7XG4gICAgdmFyIG1vZGVsID0gdGhpcy5nZXQoJ21vZGVsJyk7XG4gICAgdmFyIGlkID0gbW9kZWwuaWQ7XG4gICAgdmFyIGl0ZW1UeXBlID0gdGhpcy5nZXQoJ3R5cGUnKTtcblxuICAgIGlmICghaWQpIHtcbiAgICAgIGlkID0gdW5pcXVlSWQoaXRlbVR5cGUpO1xuICAgICAgdGhpcy5nZXQoJ21vZGVsJykuaWQgPSBpZDtcbiAgICB9XG5cbiAgICB0aGlzLnNldCgnaWQnLCBpZCk7XG4gICAgdmFyIGdyb3VwID0gY2ZnLmdyb3VwO1xuXG4gICAgaWYgKGdyb3VwKSB7XG4gICAgICBncm91cC5zZXQoJ2l0ZW0nLCB0aGlzKTtcbiAgICAgIGdyb3VwLnNldCgnaWQnLCBpZCk7XG4gICAgfVxuXG4gICAgdGhpcy5pbml0KCk7XG4gICAgdGhpcy5kcmF3KCk7XG4gICAgdmFyIHNoYXBlVHlwZSA9IG1vZGVsLnNoYXBlIHx8IG1vZGVsLnR5cGUgfHwgKGl0ZW1UeXBlID09PSAnZWRnZScgPyAnbGluZScgOiAnY2lyY2xlJyk7XG4gICAgdmFyIHNoYXBlRmFjdG9yeSA9IHRoaXMuZ2V0KCdzaGFwZUZhY3RvcnknKTtcblxuICAgIGlmIChzaGFwZUZhY3RvcnkgJiYgc2hhcGVGYWN0b3J5W3NoYXBlVHlwZV0pIHtcbiAgICAgIHZhciBvcHRpb25zID0gc2hhcGVGYWN0b3J5W3NoYXBlVHlwZV0ub3B0aW9uczsgLy8gbWVyZ2UgdGhlIHN0YXRlU3R5bGVzIGZyb20gaXRlbSBhbmQgc2hhcGVcblxuICAgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5zdGF0ZVN0eWxlcykge1xuICAgICAgICB2YXIgc3R5bGVzID0gdGhpcy5nZXQoJ3N0eWxlcycpIHx8IG1vZGVsLnN0YXRlU3R5bGVzO1xuICAgICAgICBzdHlsZXMgPSBkZWVwTWl4KHt9LCBvcHRpb25zLnN0YXRlU3R5bGVzLCBzdHlsZXMpO1xuICAgICAgICB0aGlzLnNldCgnc3R5bGVzJywgc3R5bGVzKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIOagueaNriBrZXlzaGFwZSDorqHnrpfljIXlm7Tnm5JcbiAgICovXG5cblxuICBJdGVtQmFzZS5wcm90b3R5cGUuY2FsY3VsYXRlQkJveCA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIga2V5U2hhcGUgPSB0aGlzLmdldCgna2V5U2hhcGUnKTtcbiAgICB2YXIgZ3JvdXAgPSB0aGlzLmdldCgnZ3JvdXAnKTsgLy8g5Zug5Li6IGdyb3VwIOWPr+iDveS8muenu+WKqO+8jOaJgOS7peW/hemhu+mAmui/h+eItuWFg+e0oOiuoeeul+aJjeiDveiuoeeul+WHuuato+ehrueahOWMheWbtOebklxuXG4gICAgdmFyIGJib3ggPSBnZXRCQm94KGtleVNoYXBlLCBncm91cCk7XG4gICAgYmJveC54ID0gYmJveC5taW5YO1xuICAgIGJib3gueSA9IGJib3gubWluWTtcbiAgICBiYm94LndpZHRoID0gYmJveC5tYXhYIC0gYmJveC5taW5YO1xuICAgIGJib3guaGVpZ2h0ID0gYmJveC5tYXhZIC0gYmJveC5taW5ZO1xuICAgIGJib3guY2VudGVyWCA9IChiYm94Lm1pblggKyBiYm94Lm1heFgpIC8gMjtcbiAgICBiYm94LmNlbnRlclkgPSAoYmJveC5taW5ZICsgYmJveC5tYXhZKSAvIDI7XG4gICAgcmV0dXJuIGJib3g7XG4gIH07XG4gIC8qKlxuICAgKiDmoLnmja4ga2V5c2hhcGUg6K6h566X5YyF5Zu055uSXG4gICAqL1xuXG5cbiAgSXRlbUJhc2UucHJvdG90eXBlLmNhbGN1bGF0ZUNhbnZhc0JCb3ggPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGtleVNoYXBlID0gdGhpcy5nZXQoJ2tleVNoYXBlJyk7XG4gICAgdmFyIGdyb3VwID0gdGhpcy5nZXQoJ2dyb3VwJyk7IC8vIOWboOS4uiBncm91cCDlj6/og73kvJrnp7vliqjvvIzmiYDku6Xlv4XpobvpgJrov4fniLblhYPntKDorqHnrpfmiY3og73orqHnrpflh7rmraPnoa7nmoTljIXlm7Tnm5JcblxuICAgIHZhciBiYm94ID0gZ2V0QkJveChrZXlTaGFwZSwgZ3JvdXApO1xuICAgIGJib3gueCA9IGJib3gubWluWDtcbiAgICBiYm94LnkgPSBiYm94Lm1pblk7XG4gICAgYmJveC53aWR0aCA9IGJib3gubWF4WCAtIGJib3gubWluWDtcbiAgICBiYm94LmhlaWdodCA9IGJib3gubWF4WSAtIGJib3gubWluWTtcbiAgICBiYm94LmNlbnRlclggPSAoYmJveC5taW5YICsgYmJveC5tYXhYKSAvIDI7XG4gICAgYmJveC5jZW50ZXJZID0gKGJib3gubWluWSArIGJib3gubWF4WSkgLyAyO1xuICAgIHJldHVybiBiYm94O1xuICB9O1xuICAvKipcbiAgICogZHJhdyBzaGFwZVxuICAgKi9cblxuXG4gIEl0ZW1CYXNlLnByb3RvdHlwZS5kcmF3SW5uZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBzaGFwZUZhY3RvcnkgPSBzZWxmLmdldCgnc2hhcGVGYWN0b3J5Jyk7XG4gICAgdmFyIGdyb3VwID0gc2VsZi5nZXQoJ2dyb3VwJyk7XG4gICAgdmFyIG1vZGVsID0gc2VsZi5nZXQoJ21vZGVsJyk7XG4gICAgZ3JvdXAuY2xlYXIoKTtcbiAgICB2YXIgdmlzaWJsZSA9IG1vZGVsLnZpc2libGU7XG4gICAgaWYgKHZpc2libGUgIT09IHVuZGVmaW5lZCAmJiAhdmlzaWJsZSkgc2VsZi5jaGFuZ2VWaXNpYmlsaXR5KHZpc2libGUpO1xuXG4gICAgaWYgKCFzaGFwZUZhY3RvcnkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzZWxmLnVwZGF0ZVBvc2l0aW9uKG1vZGVsKTtcbiAgICB2YXIgY2ZnID0gc2VsZi5nZXRTaGFwZUNmZyhtb2RlbCk7IC8vIOWPr+iDveS8mumZhOWKoOmineWkluS/oeaBr1xuXG4gICAgdmFyIHNoYXBlVHlwZSA9IGNmZy50eXBlO1xuICAgIHZhciBrZXlTaGFwZSA9IHNoYXBlRmFjdG9yeS5kcmF3KHNoYXBlVHlwZSwgY2ZnLCBncm91cCk7XG5cbiAgICBpZiAoa2V5U2hhcGUpIHtcbiAgICAgIHNlbGYuc2V0KCdrZXlTaGFwZScsIGtleVNoYXBlKTtcbiAgICAgIGtleVNoYXBlLnNldCgnaXNLZXlTaGFwZScsIHRydWUpO1xuICAgICAga2V5U2hhcGUuc2V0KCdkcmFnZ2FibGUnLCB0cnVlKTtcbiAgICB9XG5cbiAgICB0aGlzLnNldE9yaWdpblN0eWxlKCk7IC8vIOmYsuatoueUseS6jueUqOaIt+WklumDqOS/ruaUuSBtb2RlbCDkuK3nmoQgc2hhcGUg5a+86Ie0IHNoYXBlIOS4jeabtOaWsFxuXG4gICAgdGhpcy5zZXQoJ2N1cnJlbnRTaGFwZScsIHNoYXBlVHlwZSk7XG4gICAgdGhpcy5yZXN0b3JlU3RhdGVzKHNoYXBlRmFjdG9yeSwgc2hhcGVUeXBlKTtcbiAgfTtcbiAgLyoqXG4gICAqIOiuvue9ruWbvuWFg+e0oOWOn+Wni+agt+W8j1xuICAgKiBAcGFyYW0ga2V5U2hhcGUg5Zu+5YWD57SgIGtleVNoYXBlXG4gICAqIEBwYXJhbSBncm91cCBHcm91cCDlrrnlmahcbiAgICovXG5cblxuICBJdGVtQmFzZS5wcm90b3R5cGUuc2V0T3JpZ2luU3R5bGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGdyb3VwID0gdGhpcy5nZXQoJ2dyb3VwJyk7XG4gICAgdmFyIGNoaWxkcmVuID0gZ3JvdXAuZ2V0KCdjaGlsZHJlbicpO1xuICAgIHZhciBrZXlTaGFwZSA9IHRoaXMuZ2V0S2V5U2hhcGUoKTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIGtleVNoYXBlTmFtZSA9IGtleVNoYXBlLmdldCgnbmFtZScpO1xuXG4gICAgaWYgKCF0aGlzLmdldCgnb3JpZ2luU3R5bGUnKSkge1xuICAgICAgLy8g56ys5LiA5qyhIHNldCBvcmlnaW5TdHlsZe+8jOebtOaOpeaLv+mmluasoea4suafk+aJgOacieWbvuW9oueahCBhdHRyc1xuICAgICAgdmFyIG9yaWdpblN0eWxlcyA9IHt9O1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBjaGlsZCA9IGNoaWxkcmVuW2ldO1xuICAgICAgICB2YXIgc2hhcGVUeXBlID0gY2hpbGQuZ2V0KCd0eXBlJyk7XG4gICAgICAgIHZhciBuYW1lXzEgPSBjaGlsZC5nZXQoJ25hbWUnKTtcblxuICAgICAgICBpZiAobmFtZV8xICYmIG5hbWVfMSAhPT0ga2V5U2hhcGVOYW1lKSB7XG4gICAgICAgICAgb3JpZ2luU3R5bGVzW25hbWVfMV0gPSBzaGFwZVR5cGUgIT09ICdpbWFnZScgPyBjbG9uZShjaGlsZC5hdHRyKCkpIDogc2VsZi5nZXRTaGFwZVN0eWxlQnlOYW1lKG5hbWVfMSk7IC8vIFRoZSB0ZXh0J3MgcG9zaXRpb24gYW5kIG1hdHJpeCBpcyBub3QgYWxsb3dlZCB0byBiZSBhZmZlY3RlZCBieSBzdGF0ZXNcblxuICAgICAgICAgIGlmIChzaGFwZVR5cGUgPT09ICd0ZXh0JyAmJiBvcmlnaW5TdHlsZXNbbmFtZV8xXSkge1xuICAgICAgICAgICAgZGVsZXRlIG9yaWdpblN0eWxlc1tuYW1lXzFdLng7XG4gICAgICAgICAgICBkZWxldGUgb3JpZ2luU3R5bGVzW25hbWVfMV0ueTtcbiAgICAgICAgICAgIGRlbGV0ZSBvcmlnaW5TdHlsZXNbbmFtZV8xXS5tYXRyaXg7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBrZXlTaGFwZVN0eWxlID0gc2VsZi5nZXRTaGFwZVN0eWxlQnlOYW1lKCk7IC8vIOWPr+S8mOWMlu+8jOmcgOimgeWOu+mZpCBjaGlsZC5hdHRyIOS4reWFtuS7liBzaGFwZSDlkI3nmoTlr7nosaFcblxuICAgICAgICAgIGRlbGV0ZSBrZXlTaGFwZVN0eWxlLnBhdGg7XG4gICAgICAgICAgZGVsZXRlIGtleVNoYXBlU3R5bGUubWF0cml4O1xuXG4gICAgICAgICAgaWYgKCFrZXlTaGFwZU5hbWUpIHtcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24ob3JpZ2luU3R5bGVzLCBrZXlTaGFwZVN0eWxlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8g6IulIGtleVNoYXBlIOaciSBuYW1lIOS4lCAhbmFtZe+8jOi/meS4quWbvuW9ouS4jeaYryBrZXlTaGFwZe+8jOe7mei/meS4quWbvuW9ouS4gOS4qiBuYW1lXG4gICAgICAgICAgICBpZiAoIW5hbWVfMSkge1xuICAgICAgICAgICAgICB2YXIgc2hhcGVOYW1lID0gdW5pcXVlSWQoJ3NoYXBlJyk7XG4gICAgICAgICAgICAgIGNoaWxkLnNldCgnbmFtZScsIHNoYXBlTmFtZSk7XG4gICAgICAgICAgICAgIGdyb3VwWydzaGFwZU1hcCddW3NoYXBlTmFtZV0gPSBjaGlsZDtcbiAgICAgICAgICAgICAgb3JpZ2luU3R5bGVzW3NoYXBlTmFtZV0gPSBzaGFwZVR5cGUgIT09ICdpbWFnZScgPyBjbG9uZShjaGlsZC5hdHRyKCkpIDogc2VsZi5nZXRTaGFwZVN0eWxlQnlOYW1lKG5hbWVfMSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBvcmlnaW5TdHlsZXNba2V5U2hhcGVOYW1lXSA9IGtleVNoYXBlU3R5bGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHNlbGYuc2V0KCdvcmlnaW5TdHlsZScsIG9yaWdpblN0eWxlcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIOesrOS6jOasoSBzZXQgb3JpZ2luU3R5bGVz77yM6ZyA6KaB5om+5Yiw5LiN5pivIHN0YXRlU3R5bGVzIOeahOagt+W8j++8jOabtOaWsOWIsCBvcmlnaW5TdHlsZXMg5LitXG4gICAgICAvLyDkuIrkuIDmrKHorr7nva7nmoQgb3JpZ2luU3R5bGXvvIzmmK/liJ3lp4vnmoQgc2hhcGUgYXR0cnNcbiAgICAgIHZhciBzdHlsZXNfMSA9IHRoaXMuZ2V0KCdvcmlnaW5TdHlsZScpOyAvLyBsZXQgc3R5bGVzOiBTaGFwZVN0eWxlID0ge307XG5cbiAgICAgIGlmIChrZXlTaGFwZU5hbWUgJiYgIXN0eWxlc18xW2tleVNoYXBlTmFtZV0pIHN0eWxlc18xW2tleVNoYXBlTmFtZV0gPSB7fTsgLy8g6I635Y+W5b2T5YmN54q25oCB5qC35byPXG5cbiAgICAgIHZhciBjdXJyZW50U3RhdGVzU3R5bGVfMSA9IHRoaXMuZ2V0Q3VycmVudFN0YXRlc1N0eWxlKCk7XG5cbiAgICAgIHZhciBfbG9vcF8xID0gZnVuY3Rpb24gX2xvb3BfMShpKSB7XG4gICAgICAgIHZhciBjaGlsZCA9IGNoaWxkcmVuW2ldO1xuICAgICAgICB2YXIgbmFtZV8yID0gY2hpbGQuZ2V0KCduYW1lJyk7XG4gICAgICAgIHZhciBzaGFwZUF0dHJzID0gY2hpbGQuYXR0cigpO1xuXG4gICAgICAgIGlmIChuYW1lXzIgJiYgbmFtZV8yICE9PSBrZXlTaGFwZU5hbWUpIHtcbiAgICAgICAgICAvLyDmnIkgbmFtZSDnmoTpnZ4ga2V5U2hhcGUg5Zu+5b2iXG4gICAgICAgICAgdmFyIHNoYXBlU3RhdGVTdHlsZV8xID0gY3VycmVudFN0YXRlc1N0eWxlXzFbbmFtZV8yXTtcbiAgICAgICAgICBpZiAoIXN0eWxlc18xW25hbWVfMl0pIHN0eWxlc18xW25hbWVfMl0gPSB7fTtcblxuICAgICAgICAgIGlmIChzaGFwZVN0YXRlU3R5bGVfMSkge1xuICAgICAgICAgICAgT2JqZWN0LmtleXMoc2hhcGVBdHRycykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAgIHZhciB2YWx1ZSA9IHNoYXBlQXR0cnNba2V5XTtcbiAgICAgICAgICAgICAgaWYgKHZhbHVlICE9PSBzaGFwZVN0YXRlU3R5bGVfMVtrZXldKSBzdHlsZXNfMVtuYW1lXzJdW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdHlsZXNfMVtuYW1lXzJdID0gY2hpbGQuZ2V0KCd0eXBlJykgIT09ICdpbWFnZScgPyBjbG9uZShzaGFwZUF0dHJzKSA6IHNlbGYuZ2V0U2hhcGVTdHlsZUJ5TmFtZShuYW1lXzIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgc2hhcGVBdHRyc18xID0gY2hpbGQuYXR0cigpO1xuICAgICAgICAgIHZhciBrZXlTaGFwZVN0YXRlU3R5bGVzXzEgPSB7fTtcbiAgICAgICAgICBPYmplY3Qua2V5cyhjdXJyZW50U3RhdGVzU3R5bGVfMSkuZm9yRWFjaChmdW5jdGlvbiAoc3R5bGVLZXkpIHtcbiAgICAgICAgICAgIHZhciBzdWJTdHlsZSA9IGN1cnJlbnRTdGF0ZXNTdHlsZV8xW3N0eWxlS2V5XTtcblxuICAgICAgICAgICAgaWYgKHN0eWxlS2V5ID09PSBrZXlTaGFwZU5hbWUgfHwgIWlzUGxhaW5PYmplY3Qoc3ViU3R5bGUpKSB7XG4gICAgICAgICAgICAgIGtleVNoYXBlU3RhdGVTdHlsZXNfMVtzdHlsZUtleV0gPSBzdWJTdHlsZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBPYmplY3Qua2V5cyhzaGFwZUF0dHJzXzEpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgdmFyIHZhbHVlID0gc2hhcGVBdHRyc18xW2tleV07IC8vIOWmguaenOaYr+WvueixoeS4lOS4jeaYryBhcnJvd++8jOWImeaYr+WFtuS7liBzaGFwZSDnmoTmoLflvI9cbiAgICAgICAgICAgIC8vIGlmIChpc1BsYWluT2JqZWN0KHZhbHVlKSAmJiBBUlJPV1MuaW5kZXhPZihuYW1lKSA9PT0gLTEpIHJldHVybjtcblxuICAgICAgICAgICAgaWYgKGtleVNoYXBlU3RhdGVTdHlsZXNfMVtrZXldICE9PSB2YWx1ZSkge1xuICAgICAgICAgICAgICBpZiAoa2V5U2hhcGVOYW1lKSBzdHlsZXNfMVtrZXlTaGFwZU5hbWVdW2tleV0gPSB2YWx1ZTtlbHNlIHN0eWxlc18xW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfTsgLy8g6YGN5Y6G5b2T5YmN5omA5pyJ5Zu+5b2i55qEIGF0dHJz77yM5om+5Yiw5LiN5pivIHN0YXRlU3R5bGVzIOeahOagt+W8j+abtOaWsOWIsCBvcmlnaW5TdHlsZXMg5LitXG5cblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICBfbG9vcF8xKGkpO1xuICAgICAgfVxuXG4gICAgICBkZWxldGUgc3R5bGVzXzEucGF0aDtcbiAgICAgIGRlbGV0ZSBzdHlsZXNfMS5tYXRyaXg7XG4gICAgICBkZWxldGUgc3R5bGVzXzEueDtcbiAgICAgIGRlbGV0ZSBzdHlsZXNfMS55O1xuXG4gICAgICBpZiAoc3R5bGVzXzFba2V5U2hhcGVOYW1lXSkge1xuICAgICAgICBkZWxldGUgc3R5bGVzXzFba2V5U2hhcGVOYW1lXS54O1xuICAgICAgICBkZWxldGUgc3R5bGVzXzFba2V5U2hhcGVOYW1lXS55O1xuICAgICAgICBkZWxldGUgc3R5bGVzXzFba2V5U2hhcGVOYW1lXS5tYXRyaXg7XG4gICAgICAgIGRlbGV0ZSBzdHlsZXNfMVtrZXlTaGFwZU5hbWVdLnBhdGg7XG4gICAgICB9XG5cbiAgICAgIHNlbGYuc2V0KCdvcmlnaW5TdHlsZScsIHN0eWxlc18xKTtcbiAgICB9XG4gIH07XG4gIC8qKlxuICAgKiByZXN0b3JlIHNoYXBlIHN0YXRlc1xuICAgKiBAcGFyYW0gc2hhcGVGYWN0b3J5XG4gICAqIEBwYXJhbSBzaGFwZVR5cGVcbiAgICovXG5cblxuICBJdGVtQmFzZS5wcm90b3R5cGUucmVzdG9yZVN0YXRlcyA9IGZ1bmN0aW9uIChzaGFwZUZhY3RvcnksIHNoYXBlVHlwZSkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgc3RhdGVzID0gc2VsZi5nZXQoJ3N0YXRlcycpO1xuICAgIGVhY2goc3RhdGVzLCBmdW5jdGlvbiAoc3RhdGUpIHtcbiAgICAgIHNoYXBlRmFjdG9yeS5zZXRTdGF0ZShzaGFwZVR5cGUsIHN0YXRlLCB0cnVlLCBzZWxmKTtcbiAgICB9KTtcbiAgfTtcblxuICBJdGVtQmFzZS5wcm90b3R5cGUuaW5pdCA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2hhcGVGYWN0b3J5ID0gU2hhcGUuZ2V0RmFjdG9yeSh0aGlzLmdldCgndHlwZScpKTtcbiAgICB0aGlzLnNldCgnc2hhcGVGYWN0b3J5Jywgc2hhcGVGYWN0b3J5KTtcbiAgfTtcbiAgLyoqXG4gICAqIOiOt+WPluWxnuaAp1xuICAgKiBAaW50ZXJuYWwg5LuF5YaF6YOo57G75L2/55SoXG4gICAqIEBwYXJhbSAge1N0cmluZ30ga2V5IOWxnuaAp+WQjVxuICAgKiBAcmV0dXJuIHtvYmplY3QgfCBzdHJpbmcgfCBudW1iZXJ9IOWxnuaAp+WAvFxuICAgKi9cblxuXG4gIEl0ZW1CYXNlLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgcmV0dXJuIHRoaXMuX2NmZ1trZXldO1xuICB9O1xuICAvKipcbiAgICog6K6+572u5bGe5oCnXG4gICAqIEBpbnRlcm5hbCDku4XlhoXpg6jnsbvkvb/nlKhcbiAgICogQHBhcmFtIHtTdHJpbmd8T2JqZWN0fSBrZXkg5bGe5oCn5ZCN77yM5Lmf5Y+v5Lul5piv5a+56LGhXG4gICAqIEBwYXJhbSB7b2JqZWN0IHwgc3RyaW5nIHwgbnVtYmVyfSB2YWwg5bGe5oCn5YC8XG4gICAqL1xuXG5cbiAgSXRlbUJhc2UucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uIChrZXksIHZhbCkge1xuICAgIGlmIChpc1BsYWluT2JqZWN0KGtleSkpIHtcbiAgICAgIHRoaXMuX2NmZyA9IF9fYXNzaWduKF9fYXNzaWduKHt9LCB0aGlzLl9jZmcpLCBrZXkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9jZmdba2V5XSA9IHZhbDtcbiAgICB9XG4gIH07XG5cbiAgSXRlbUJhc2UucHJvdG90eXBlLmdldERlZmF1bHRDZmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9O1xuICAvKipcbiAgICog5pu05pawL+WIt+aWsOetieaTjeS9nOWQju+8jOa4hemZpCBjYWNoZVxuICAgKi9cblxuXG4gIEl0ZW1CYXNlLnByb3RvdHlwZS5jbGVhckNhY2hlID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuc2V0KENBQ0hFX0JCT1gsIG51bGwpO1xuICAgIHRoaXMuc2V0KENBQ0hFX0NBTlZBU19CQk9YLCBudWxsKTtcbiAgfTtcbiAgLyoqXG4gICAqIOa4suafk+WJjeeahOmAu+i+ke+8jOaPkOS+m+e7meWtkOexu+WkjeWGmVxuICAgKi9cblxuXG4gIEl0ZW1CYXNlLnByb3RvdHlwZS5iZWZvcmVEcmF3ID0gZnVuY3Rpb24gKCkge307XG4gIC8qKlxuICAgKiDmuLLmn5PlkI7nmoTpgLvovpHvvIzmj5Dkvpvnu5nlrZDnsbvlpI3lhplcbiAgICovXG5cblxuICBJdGVtQmFzZS5wcm90b3R5cGUuYWZ0ZXJEcmF3ID0gZnVuY3Rpb24gKCkge307XG4gIC8qKlxuICAgKiDmm7TmlrDlkI7lgZrkuIDkupvlt6XkvZxcbiAgICovXG5cblxuICBJdGVtQmFzZS5wcm90b3R5cGUuYWZ0ZXJVcGRhdGUgPSBmdW5jdGlvbiAoKSB7fTtcbiAgLyoqXG4gICAqIGRyYXcgc2hhcGVcbiAgICovXG5cblxuICBJdGVtQmFzZS5wcm90b3R5cGUuZHJhdyA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmJlZm9yZURyYXcoKTtcbiAgICB0aGlzLmRyYXdJbm5lcigpO1xuICAgIHRoaXMuYWZ0ZXJEcmF3KCk7XG4gIH07XG5cbiAgSXRlbUJhc2UucHJvdG90eXBlLmdldFNoYXBlU3R5bGVCeU5hbWUgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIHZhciBncm91cCA9IHRoaXMuZ2V0KCdncm91cCcpO1xuICAgIHZhciBjdXJyZW50U2hhcGU7XG5cbiAgICBpZiAobmFtZSkge1xuICAgICAgY3VycmVudFNoYXBlID0gZ3JvdXBbJ3NoYXBlTWFwJ11bbmFtZV07IC8vIGdyb3VwLmZpbmQoKGVsZW1lbnQpID0+IGVsZW1lbnQuZ2V0KCduYW1lJykgPT09IG5hbWUpIGFzIElTaGFwZUJhc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIGN1cnJlbnRTaGFwZSA9IHRoaXMuZ2V0S2V5U2hhcGUoKTtcbiAgICB9XG5cbiAgICBpZiAoY3VycmVudFNoYXBlKSB7XG4gICAgICB2YXIgc3R5bGVzXzIgPSB7fTtcbiAgICAgIGVhY2goY3VycmVudFNoYXBlLmF0dHIoKSwgZnVuY3Rpb24gKHZhbCwga2V5KSB7XG4gICAgICAgIC8vIOS/ruaUuSBpbWcg6YCa6L+HIHVwZGF0ZUl0ZW0g5a6e546wXG4gICAgICAgIGlmIChrZXkgIT09ICdpbWcnIHx8IGlzU3RyaW5nKHZhbCkpIHtcbiAgICAgICAgICBzdHlsZXNfMltrZXldID0gdmFsO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBzdHlsZXNfMjtcbiAgICB9XG5cbiAgICByZXR1cm4ge307XG4gIH07XG5cbiAgSXRlbUJhc2UucHJvdG90eXBlLmdldFNoYXBlQ2ZnID0gZnVuY3Rpb24gKG1vZGVsLCB1cGRhdGVUeXBlKSB7XG4gICAgdmFyIHN0eWxlcyA9IHRoaXMuZ2V0KCdzdHlsZXMnKTtcblxuICAgIGlmIChzdHlsZXMpIHtcbiAgICAgIC8vIG1lcmdlIGdyYXBo55qEaXRlbeagt+W8j+S4juaVsOaNruaooeWei+S4reeahOagt+W8j1xuICAgICAgdmFyIG5ld01vZGVsID0gbW9kZWw7XG4gICAgICBuZXdNb2RlbC5zdHlsZSA9IF9fYXNzaWduKF9fYXNzaWduKHt9LCBzdHlsZXMpLCBtb2RlbC5zdHlsZSk7XG4gICAgICByZXR1cm4gbmV3TW9kZWw7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1vZGVsO1xuICB9O1xuICAvKipcbiAgICog6I635Y+W5oyH5a6a54q25oCB55qE5qC35byP77yM5Y676Zmk5LqG5YWo5bGA5qC35byPXG4gICAqIEBwYXJhbSBzdGF0ZSDnirbmgIHlkI3np7BcbiAgICovXG5cblxuICBJdGVtQmFzZS5wcm90b3R5cGUuZ2V0U3RhdGVTdHlsZSA9IGZ1bmN0aW9uIChzdGF0ZSkge1xuICAgIHZhciBzdHlsZXMgPSB0aGlzLmdldCgnc3R5bGVzJyk7XG4gICAgdmFyIHN0YXRlU3R5bGUgPSBzdHlsZXMgJiYgc3R5bGVzW3N0YXRlXTtcbiAgICByZXR1cm4gc3RhdGVTdHlsZTtcbiAgfTtcbiAgLyoqXG4gICAqIGdldCBrZXlzaGFwZSBzdHlsZVxuICAgKi9cblxuXG4gIEl0ZW1CYXNlLnByb3RvdHlwZS5nZXRPcmlnaW5TdHlsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXQoJ29yaWdpblN0eWxlJyk7XG4gIH07XG5cbiAgSXRlbUJhc2UucHJvdG90eXBlLmdldEN1cnJlbnRTdGF0ZXNTdHlsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIHN0eWxlcyA9IHt9O1xuICAgIHZhciBzdGF0ZXMgPSBzZWxmLmdldFN0YXRlcygpO1xuXG4gICAgaWYgKCFzdGF0ZXMgfHwgIXN0YXRlcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldCgnb3JpZ2luU3R5bGUnKTtcbiAgICB9XG5cbiAgICBlYWNoKHNlbGYuZ2V0U3RhdGVzKCksIGZ1bmN0aW9uIChzdGF0ZSkge1xuICAgICAgc3R5bGVzID0gT2JqZWN0LmFzc2lnbihzdHlsZXMsIHNlbGYuZ2V0U3RhdGVTdHlsZShzdGF0ZSkpO1xuICAgIH0pO1xuICAgIHJldHVybiBzdHlsZXM7XG4gIH07XG4gIC8qKlxuICAgKiDmm7TmlLnlhYPntKDnirbmgIHvvIwgdmlzaWJsZSDkuI3lsZ7kuo7ov5nkuKrojIPnlbRcbiAgICogQGludGVybmFsIOS7heaPkOS+m+WGhemDqOexuyBncmFwaCDkvb/nlKhcbiAgICogQHBhcmFtIHtTdHJpbmd9IHN0YXRlIOeKtuaAgeWQjVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHZhbHVlIOiKgueCueeKtuaAgeWAvFxuICAgKi9cblxuXG4gIEl0ZW1CYXNlLnByb3RvdHlwZS5zZXRTdGF0ZSA9IGZ1bmN0aW9uIChzdGF0ZSwgdmFsdWUpIHtcbiAgICB2YXIgc3RhdGVzID0gdGhpcy5nZXQoJ3N0YXRlcycpO1xuICAgIHZhciBzaGFwZUZhY3RvcnkgPSB0aGlzLmdldCgnc2hhcGVGYWN0b3J5Jyk7XG4gICAgdmFyIHN0YXRlTmFtZSA9IHN0YXRlO1xuICAgIHZhciBmaWx0ZXJTdGF0ZU5hbWUgPSBzdGF0ZTtcblxuICAgIGlmIChpc1N0cmluZyh2YWx1ZSkpIHtcbiAgICAgIHN0YXRlTmFtZSA9IHN0YXRlICsgXCI6XCIgKyB2YWx1ZTtcbiAgICAgIGZpbHRlclN0YXRlTmFtZSA9IHN0YXRlICsgXCI6XCI7XG4gICAgfVxuXG4gICAgdmFyIG5ld1N0YXRlcyA9IHN0YXRlcztcblxuICAgIGlmIChpc0Jvb2xlYW4odmFsdWUpKSB7XG4gICAgICB2YXIgaW5kZXggPSBzdGF0ZXMuaW5kZXhPZihmaWx0ZXJTdGF0ZU5hbWUpO1xuXG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBzdGF0ZXMucHVzaChzdGF0ZU5hbWUpO1xuICAgICAgfSBlbHNlIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgIHN0YXRlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXNTdHJpbmcodmFsdWUpKSB7XG4gICAgICAvLyDov4fmu6Tmjokgc3RhdGVzIOS4rSBmaWx0ZXJTdGF0ZU5hbWUg55u45YWz55qE54q25oCBXG4gICAgICB2YXIgZmlsdGVyU3RhdGVzID0gc3RhdGVzLmZpbHRlcihmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICByZXR1cm4gbmFtZS5pbmNsdWRlcyhmaWx0ZXJTdGF0ZU5hbWUpO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChmaWx0ZXJTdGF0ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLmNsZWFyU3RhdGVzKGZpbHRlclN0YXRlcyk7XG4gICAgICB9XG5cbiAgICAgIG5ld1N0YXRlcyA9IG5ld1N0YXRlcy5maWx0ZXIoZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuICFuYW1lLmluY2x1ZGVzKGZpbHRlclN0YXRlTmFtZSk7XG4gICAgICB9KTtcbiAgICAgIG5ld1N0YXRlcy5wdXNoKHN0YXRlTmFtZSk7XG4gICAgICB0aGlzLnNldCgnc3RhdGVzJywgbmV3U3RhdGVzKTtcbiAgICB9XG5cbiAgICBpZiAoc2hhcGVGYWN0b3J5KSB7XG4gICAgICB2YXIgbW9kZWwgPSB0aGlzLmdldCgnbW9kZWwnKTtcbiAgICAgIHZhciB0eXBlID0gbW9kZWwudHlwZTsgLy8g6LCD55SoIHNoYXBlL3NoYXBlLnRzIOS4reeahCBzZXRTdGF0ZVxuXG4gICAgICBzaGFwZUZhY3Rvcnkuc2V0U3RhdGUodHlwZSwgc3RhdGUsIHZhbHVlLCB0aGlzKTtcbiAgICB9XG4gIH07XG4gIC8qKlxuICAgKiDmuIXpmaTmjIflrprnmoTnirbmgIHvvIzlpoLmnpzlj4LmlbDkuLrnqbrvvIzliJnkuI3lgZrku7vliqHlpITnkIZcbiAgICogQHBhcmFtIHN0YXRlcyDnirbmgIHlkI3np7BcbiAgICovXG5cblxuICBJdGVtQmFzZS5wcm90b3R5cGUuY2xlYXJTdGF0ZXMgPSBmdW5jdGlvbiAoc3RhdGVzKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBvcmlnaW5TdGF0ZXMgPSBzZWxmLmdldFN0YXRlcygpO1xuICAgIHZhciBzaGFwZUZhY3RvcnkgPSBzZWxmLmdldCgnc2hhcGVGYWN0b3J5Jyk7XG4gICAgdmFyIG1vZGVsID0gc2VsZi5nZXQoJ21vZGVsJyk7XG4gICAgdmFyIHNoYXBlID0gbW9kZWwudHlwZTtcblxuICAgIGlmICghc3RhdGVzKSB7XG4gICAgICBzdGF0ZXMgPSBvcmlnaW5TdGF0ZXM7XG4gICAgfVxuXG4gICAgaWYgKGlzU3RyaW5nKHN0YXRlcykpIHtcbiAgICAgIHN0YXRlcyA9IFtzdGF0ZXNdO1xuICAgIH1cblxuICAgIHZhciBuZXdTdGF0ZXMgPSBvcmlnaW5TdGF0ZXMuZmlsdGVyKGZ1bmN0aW9uIChzdGF0ZSkge1xuICAgICAgcmV0dXJuIHN0YXRlcy5pbmRleE9mKHN0YXRlKSA9PT0gLTE7XG4gICAgfSk7XG4gICAgc2VsZi5zZXQoJ3N0YXRlcycsIG5ld1N0YXRlcyk7XG4gICAgc3RhdGVzLmZvckVhY2goZnVuY3Rpb24gKHN0YXRlKSB7XG4gICAgICBzaGFwZUZhY3Rvcnkuc2V0U3RhdGUoc2hhcGUsIHN0YXRlLCBmYWxzZSwgc2VsZik7XG4gICAgfSk7XG4gIH07XG4gIC8qKlxuICAgKiDoioLngrnnmoTlm77lvaLlrrnlmahcbiAgICogQHJldHVybiB7Ry5Hcm91cH0g5Zu+5b2i5a655ZmoXG4gICAqL1xuXG5cbiAgSXRlbUJhc2UucHJvdG90eXBlLmdldENvbnRhaW5lciA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXQoJ2dyb3VwJyk7XG4gIH07XG4gIC8qKlxuICAgKiDoioLngrnnmoTlhbPplK7lvaLnirbvvIznlKjkuo7orqHnrpfoioLngrnlpKflsI/vvIzov57nur/miKrot53nrYlcbiAgICogQHJldHVybiB7SVNoYXBlQmFzZX0g5YWz6ZSu5b2i54q2XG4gICAqL1xuXG5cbiAgSXRlbUJhc2UucHJvdG90eXBlLmdldEtleVNoYXBlID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLmdldCgna2V5U2hhcGUnKTtcbiAgfTtcbiAgLyoqXG4gICAqIOiKgueCueaVsOaNruaooeWei1xuICAgKiBAcmV0dXJuIHtPYmplY3R9IOaVsOaNruaooeWei1xuICAgKi9cblxuXG4gIEl0ZW1CYXNlLnByb3RvdHlwZS5nZXRNb2RlbCA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXQoJ21vZGVsJyk7XG4gIH07XG4gIC8qKlxuICAgKiDoioLngrnnsbvlnotcbiAgICogQHJldHVybiB7c3RyaW5nfSDoioLngrnnmoTnsbvlnotcbiAgICovXG5cblxuICBJdGVtQmFzZS5wcm90b3R5cGUuZ2V0VHlwZSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXQoJ3R5cGUnKTtcbiAgfTtcbiAgLyoqXG4gICAqIOiOt+WPliBJdGVtIOeahElEXG4gICAqL1xuXG5cbiAgSXRlbUJhc2UucHJvdG90eXBlLmdldElEID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLmdldCgnaWQnKTtcbiAgfTtcbiAgLyoqXG4gICAqIOaYr+WQpuaYryBJdGVtIOWvueixoe+8jOaCrOepuui+ueaDheWGteS4i+i/m+ihjOWIpOWumlxuICAgKi9cblxuXG4gIEl0ZW1CYXNlLnByb3RvdHlwZS5pc0l0ZW0gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG4gIC8qKlxuICAgKiDojrflj5blvZPliY3lhYPntKDnmoTmiYDmnInnirbmgIFcbiAgICogQHJldHVybiB7QXJyYXl9IOWFg+e0oOeahOaJgOacieeKtuaAgVxuICAgKi9cblxuXG4gIEl0ZW1CYXNlLnByb3RvdHlwZS5nZXRTdGF0ZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KCdzdGF0ZXMnKTtcbiAgfTtcbiAgLyoqXG4gICAqIOW9k+WJjeWFg+e0oOaYr+WQpuWkhOS6juafkOeKtuaAgVxuICAgKiBAcGFyYW0ge1N0cmluZ30gc3RhdGUg54q25oCB5ZCNXG4gICAqIEByZXR1cm4ge0Jvb2xlYW59IOaYr+WQpuWkhOS6juafkOeKtuaAgVxuICAgKi9cblxuXG4gIEl0ZW1CYXNlLnByb3RvdHlwZS5oYXNTdGF0ZSA9IGZ1bmN0aW9uIChzdGF0ZSkge1xuICAgIHZhciBzdGF0ZXMgPSB0aGlzLmdldFN0YXRlcygpO1xuICAgIHJldHVybiBzdGF0ZXMuaW5kZXhPZihzdGF0ZSkgPj0gMDtcbiAgfTtcbiAgLyoqXG4gICAqIOWIt+aWsOS4gOiIrOeUqOS6juWkhOeQhuWHoOenjeaDheWGtVxuICAgKiAxLiBpdGVtIG1vZGVsIOWcqOWklumDqOiiq+aUueWPmFxuICAgKiAyLiDovrnnmoToioLngrnkvY3nva7lj5HnlJ/mlLnlj5jvvIzpnIDopoHph43mlrDorqHnrpfovrlcbiAgICpcbiAgICog5Zug5Li65pWw5o2u5LuO5aSW6YOo6KKr5L+u5pS55peg5rOV5Yik5pat5LiA5Lqb5bGe5oCn5piv5ZCm6KKr5L+u5pS577yM55u05o6l6LWw5L2N572u5ZKMIHNoYXBlIOeahOabtOaWsFxuICAgKi9cblxuXG4gIEl0ZW1CYXNlLnByb3RvdHlwZS5yZWZyZXNoID0gZnVuY3Rpb24gKHVwZGF0ZVR5cGUpIHtcbiAgICB2YXIgbW9kZWwgPSB0aGlzLmdldCgnbW9kZWwnKTsgLy8g5pu05paw5YWD57Sg5L2N572uXG5cbiAgICB0aGlzLnVwZGF0ZVBvc2l0aW9uKG1vZGVsKTsgLy8g5pu05paw5YWD57Sg5YaF5a6577yM5qC35byPXG5cbiAgICB0aGlzLnVwZGF0ZVNoYXBlKHVwZGF0ZVR5cGUpOyAvLyDlgZrkuIDkupvmm7TmlrDkuYvlkI7nmoTmk43kvZxcblxuICAgIHRoaXMuYWZ0ZXJVcGRhdGUoKTsgLy8g5riF6Zmk57yT5a2YXG5cbiAgICB0aGlzLmNsZWFyQ2FjaGUoKTtcbiAgfTtcblxuICBJdGVtQmFzZS5wcm90b3R5cGUuZ2V0VXBkYXRlVHlwZSA9IGZ1bmN0aW9uIChjZmcpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9O1xuICAvKipcbiAgICog5bCG5pu05paw5bqU55So5YiwIG1vZGVsIOS4iu+8jOWIt+aWsOWxnuaAp1xuICAgKiBAaW50ZXJuYWwg5LuF5o+Q5L6b57uZIEdyYXBoIOS9v+eUqO+8jOWklumDqOebtOaOpeiwg+eUqCBncmFwaC51cGRhdGUg5o6l5Y+jXG4gICAqIEBwYXJhbSAge09iamVjdH0gY2ZnICAgICAgIOmFjee9rumhue+8jOWPr+S7peaYr+WinumHj+S/oeaBr1xuICAgKi9cblxuXG4gIEl0ZW1CYXNlLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAoY2ZnLCB1cGRhdGVUeXBlKSB7XG4gICAgaWYgKHVwZGF0ZVR5cGUgPT09IHZvaWQgMCkge1xuICAgICAgdXBkYXRlVHlwZSA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICB2YXIgbW9kZWwgPSB0aGlzLmdldCgnbW9kZWwnKTsgLy8g5LuF5LuF56e75Yqo5L2N572u5pe277yM5pei5LiN5pu05paw77yM5Lmf5LiN6YeN57uYXG5cbiAgICBpZiAodXBkYXRlVHlwZSA9PT0gJ21vdmUnKSB7XG4gICAgICB0aGlzLnVwZGF0ZVBvc2l0aW9uKGNmZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBvcmlWaXNpYmxlID0gbW9kZWwudmlzaWJsZTtcbiAgICAgIHZhciBjZmdWaXNpYmxlID0gY2ZnLnZpc2libGU7XG4gICAgICBpZiAob3JpVmlzaWJsZSAhPT0gY2ZnVmlzaWJsZSAmJiBjZmdWaXNpYmxlICE9PSB1bmRlZmluZWQpIHRoaXMuY2hhbmdlVmlzaWJpbGl0eShjZmdWaXNpYmxlKTtcbiAgICAgIHZhciBvcmlnaW5Qb3NpdGlvbiA9IHtcbiAgICAgICAgeDogbW9kZWwueCxcbiAgICAgICAgeTogbW9kZWwueVxuICAgICAgfTtcbiAgICAgIGNmZy54ID0gaXNOYU4oK2NmZy54KSA/IG1vZGVsLnggOiArY2ZnLng7XG4gICAgICBjZmcueSA9IGlzTmFOKCtjZmcueSkgPyBtb2RlbC55IDogK2NmZy55O1xuICAgICAgdmFyIHN0eWxlcyA9IHRoaXMuZ2V0KCdzdHlsZXMnKTtcblxuICAgICAgaWYgKGNmZy5zdGF0ZVN0eWxlcykge1xuICAgICAgICAvLyDmm7TmlrAgaXRlbSDml7bmm7TmlrAgdGhpcy5nZXQoJ3N0eWxlcycpIOS4reeahOWAvFxuICAgICAgICB2YXIgc3RhdGVTdHlsZXMgPSBjZmcuc3RhdGVTdHlsZXM7XG4gICAgICAgIG1peChzdHlsZXMsIHN0YXRlU3R5bGVzKTtcbiAgICAgICAgZGVsZXRlIGNmZy5zdGF0ZVN0eWxlcztcbiAgICAgIH0gLy8g55u05o6l5bCG5pu05paw5ZCI5Yiw5Y6f5pWw5o2u5qih5Z6L5LiK77yM5Y+v5Lul5L+d6K+B55So5oi35Zyo5aSW6YOo5L+u5pS55rqQ5pWw5o2u54S25ZCO5Yi35paw5pe255qE5qC35byP56ym5ZCI5pyf5b6F44CCXG5cblxuICAgICAgT2JqZWN0LmFzc2lnbihtb2RlbCwgY2ZnKTsgLy8g5aaC5p6cIHgseSDmnInlj5jljJbvvIzlhYjph43nva7kvY3nva5cblxuICAgICAgaWYgKG9yaWdpblBvc2l0aW9uLnggIT09IGNmZy54IHx8IG9yaWdpblBvc2l0aW9uLnkgIT09IGNmZy55KSB7XG4gICAgICAgIHRoaXMudXBkYXRlUG9zaXRpb24oY2ZnKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy51cGRhdGVTaGFwZSh1cGRhdGVUeXBlKTtcbiAgICB9XG5cbiAgICB0aGlzLmFmdGVyVXBkYXRlKCk7XG4gICAgdGhpcy5jbGVhckNhY2hlKCk7XG4gIH07XG4gIC8qKlxuICAgKiDmm7TmlrDlhYPntKDlhoXlrrnvvIzmoLflvI9cbiAgICovXG5cblxuICBJdGVtQmFzZS5wcm90b3R5cGUudXBkYXRlU2hhcGUgPSBmdW5jdGlvbiAodXBkYXRlVHlwZSkge1xuICAgIHZhciBzaGFwZUZhY3RvcnkgPSB0aGlzLmdldCgnc2hhcGVGYWN0b3J5Jyk7XG4gICAgdmFyIG1vZGVsID0gdGhpcy5nZXQoJ21vZGVsJyk7XG4gICAgdmFyIHNoYXBlID0gbW9kZWwudHlwZTsgLy8g5Yik5a6a5piv5ZCm5YWB6K645pu05pawXG4gICAgLy8gMS4g5rOo5YaM55qE6IqC54K55YWB6K645pu05pawXG4gICAgLy8gMi4g5pu05paw5ZCO55qEIHNoYXBlIOetieS6juWOn+WFiOeahCBzaGFwZVxuXG4gICAgaWYgKHNoYXBlRmFjdG9yeS5zaG91bGRVcGRhdGUoc2hhcGUpICYmIHNoYXBlID09PSB0aGlzLmdldCgnY3VycmVudFNoYXBlJykpIHtcbiAgICAgIHZhciB1cGRhdGVDZmcgPSB0aGlzLmdldFNoYXBlQ2ZnKG1vZGVsLCB1cGRhdGVUeXBlKTtcbiAgICAgIHNoYXBlRmFjdG9yeS5iYXNlVXBkYXRlKHNoYXBlLCB1cGRhdGVDZmcsIHRoaXMsIHVwZGF0ZVR5cGUpOyAvLyDmm7TmlrDlrozku6XlkI7ph43mlrDorr7nva7ljp/lp4vmoLflvI9cblxuICAgICAgaWYgKHVwZGF0ZVR5cGUgIT09ICdtb3ZlJykgdGhpcy5zZXRPcmlnaW5TdHlsZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyDlpoLmnpzkuI3mu6HotrPkuIrpnaLkuKTnp43nirbmgIHvvIzph43mlrDnu5jliLZcbiAgICAgIHRoaXMuZHJhdygpO1xuICAgIH0gLy8g5pu05paw5ZCO6YeN572u6IqC54K554q25oCBXG5cblxuICAgIHRoaXMucmVzdG9yZVN0YXRlcyhzaGFwZUZhY3RvcnksIHNoYXBlKTtcbiAgfTtcbiAgLyoqXG4gICAqIOabtOaWsOS9jee9ru+8jOmBv+WFjeaVtOS9k+mHjee7mFxuICAgKiBAcGFyYW0ge29iamVjdH0gY2ZnIOW+heabtOaWsOaVsOaNrlxuICAgKi9cblxuXG4gIEl0ZW1CYXNlLnByb3RvdHlwZS51cGRhdGVQb3NpdGlvbiA9IGZ1bmN0aW9uIChjZmcpIHtcbiAgICB2YXIgbW9kZWwgPSB0aGlzLmdldCgnbW9kZWwnKTtcbiAgICB2YXIgeCA9IGlzTmFOKCtjZmcueCkgPyArbW9kZWwueCA6ICtjZmcueDtcbiAgICB2YXIgeSA9IGlzTmFOKCtjZmcueSkgPyArbW9kZWwueSA6ICtjZmcueTtcbiAgICB2YXIgZ3JvdXAgPSB0aGlzLmdldCgnZ3JvdXAnKTtcblxuICAgIGlmIChpc05hTih4KSB8fCBpc05hTih5KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIG1vZGVsLnggPSB4O1xuICAgIG1vZGVsLnkgPSB5O1xuICAgIHZhciBtYXRyaXggPSBncm91cC5nZXRNYXRyaXgoKTtcbiAgICBpZiAobWF0cml4ICYmIG1hdHJpeFs2XSA9PT0geCAmJiBtYXRyaXhbN10gPT09IHkpIHJldHVybiBmYWxzZTtcbiAgICBncm91cC5yZXNldE1hdHJpeCgpOyAvLyBHIDQuMCBlbGVtZW50IOS4reenu+mZpOS6huefqemYteebuOWFs+aWueazle+8jOivpuingWh0dHBzOi8vd3d3Lnl1cXVlLmNvbS9hbnR2L2Jsb2cva3h6azlnIzRyTU1WXG5cbiAgICB0cmFuc2xhdGUoZ3JvdXAsIHtcbiAgICAgIHg6IHgsXG4gICAgICB5OiB5XG4gICAgfSk7XG4gICAgdGhpcy5jbGVhckNhY2hlKCk7IC8vIOS9jee9ruabtOaWsOWQjumcgOimgea4hemZpOe8k+WtmFxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG4gIC8qKlxuICAgKiDojrflj5YgaXRlbSDnmoTljIXlm7Tnm5LvvIzov5nkuKrljIXlm7Tnm5LmmK/nm7jlr7nkuo4gaXRlbSDoh6rlt7HvvIzkuI3kvJrlsIYgbWF0cml4IOiuoeeul+WcqOWGhVxuICAgKiBAcmV0dXJuIHtPYmplY3R9IOWMheWQqyB4LHksd2lkdGgsaGVpZ2h0LCBjZW50ZXJYLCBjZW50ZXJZXG4gICAqL1xuXG5cbiAgSXRlbUJhc2UucHJvdG90eXBlLmdldEJCb3ggPSBmdW5jdGlvbiAoKSB7XG4gICAgLy8g6K6h566XIGJib3gg5byA6ZSA5pyJ5Lqb5aSn77yM57yT5a2YXG4gICAgdmFyIGJib3ggPSB0aGlzLmdldChDQUNIRV9CQk9YKTtcblxuICAgIGlmICghYmJveCkge1xuICAgICAgYmJveCA9IHRoaXMuY2FsY3VsYXRlQkJveCgpO1xuICAgICAgdGhpcy5zZXQoQ0FDSEVfQkJPWCwgYmJveCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJib3g7XG4gIH07XG4gIC8qKlxuICAgKiDojrflj5YgaXRlbSDnm7jlr7nkuo7nlLvluIPnmoTljIXlm7Tnm5LvvIzkvJrlsIbku47pobblsYLliLDlvZPliY3lhYPntKDnmoQgbWF0cml4IOmDveiuoeeul+WcqOWGhVxuICAgKiBAcmV0dXJuIHtPYmplY3R9IOWMheWQqyB4LHksd2lkdGgsaGVpZ2h0LCBjZW50ZXJYLCBjZW50ZXJZXG4gICAqL1xuXG5cbiAgSXRlbUJhc2UucHJvdG90eXBlLmdldENhbnZhc0JCb3ggPSBmdW5jdGlvbiAoKSB7XG4gICAgLy8g6K6h566XIGJib3gg5byA6ZSA5pyJ5Lqb5aSn77yM57yT5a2YXG4gICAgdmFyIGJib3ggPSB0aGlzLmdldChDQUNIRV9DQU5WQVNfQkJPWCk7XG5cbiAgICBpZiAoIWJib3gpIHtcbiAgICAgIGJib3ggPSB0aGlzLmNhbGN1bGF0ZUNhbnZhc0JCb3goKTtcbiAgICAgIHRoaXMuc2V0KENBQ0hFX0NBTlZBU19CQk9YLCBiYm94KTtcbiAgICB9XG5cbiAgICByZXR1cm4gYmJveDtcbiAgfTtcbiAgLyoqXG4gICAqIOWwhuWFg+e0oOaUvuWIsOacgOWJjemdolxuICAgKi9cblxuXG4gIEl0ZW1CYXNlLnByb3RvdHlwZS50b0Zyb250ID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBncm91cCA9IHRoaXMuZ2V0KCdncm91cCcpO1xuICAgIGdyb3VwLnRvRnJvbnQoKTtcbiAgfTtcbiAgLyoqXG4gICAqIOWwhuWFg+e0oOaUvuWIsOacgOWQjumdolxuICAgKi9cblxuXG4gIEl0ZW1CYXNlLnByb3RvdHlwZS50b0JhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGdyb3VwID0gdGhpcy5nZXQoJ2dyb3VwJyk7XG4gICAgZ3JvdXAudG9CYWNrKCk7XG4gIH07XG4gIC8qKlxuICAgKiDmmL7npLrlhYPntKBcbiAgICovXG5cblxuICBJdGVtQmFzZS5wcm90b3R5cGUuc2hvdyA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmNoYW5nZVZpc2liaWxpdHkodHJ1ZSk7XG4gIH07XG4gIC8qKlxuICAgKiDpmpDol4/lhYPntKBcbiAgICovXG5cblxuICBJdGVtQmFzZS5wcm90b3R5cGUuaGlkZSA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmNoYW5nZVZpc2liaWxpdHkoZmFsc2UpO1xuICB9O1xuICAvKipcbiAgICog5pu05pS55piv5ZCm5pi+56S6XG4gICAqIEBwYXJhbSAge0Jvb2xlYW59IHZpc2libGUg5piv5ZCm5pi+56S6XG4gICAqL1xuXG5cbiAgSXRlbUJhc2UucHJvdG90eXBlLmNoYW5nZVZpc2liaWxpdHkgPSBmdW5jdGlvbiAodmlzaWJsZSkge1xuICAgIHZhciBncm91cCA9IHRoaXMuZ2V0KCdncm91cCcpO1xuXG4gICAgaWYgKHZpc2libGUpIHtcbiAgICAgIGdyb3VwLnNob3coKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZ3JvdXAuaGlkZSgpO1xuICAgIH1cblxuICAgIHRoaXMuc2V0KCd2aXNpYmxlJywgdmlzaWJsZSk7XG4gIH07XG4gIC8qKlxuICAgKiDlhYPntKDmmK/lkKblj6/op4FcbiAgICogQHJldHVybiB7Qm9vbGVhbn0g6L+U5Zue6K+l5YWD57Sg5piv5ZCm5Y+v6KeBXG4gICAqL1xuXG5cbiAgSXRlbUJhc2UucHJvdG90eXBlLmlzVmlzaWJsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXQoJ3Zpc2libGUnKTtcbiAgfTtcbiAgLyoqXG4gICAqIOaYr+WQpuaLvuWPluWPiuWHuuWPkeivpeWFg+e0oOeahOS6pOS6kuS6i+S7tlxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IGVuYWJsZSDmoIfor4bkvY1cbiAgICovXG5cblxuICBJdGVtQmFzZS5wcm90b3R5cGUuZW5hYmxlQ2FwdHVyZSA9IGZ1bmN0aW9uIChlbmFibGUpIHtcbiAgICB2YXIgZ3JvdXAgPSB0aGlzLmdldCgnZ3JvdXAnKTtcblxuICAgIGlmIChncm91cCkge1xuICAgICAgZ3JvdXAuc2V0KCdjYXB0dXJlJywgZW5hYmxlKTtcbiAgICB9XG4gIH07XG5cbiAgSXRlbUJhc2UucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCF0aGlzLmRlc3Ryb3llZCkge1xuICAgICAgdmFyIGFuaW1hdGUgPSB0aGlzLmdldCgnYW5pbWF0ZScpO1xuICAgICAgdmFyIGdyb3VwID0gdGhpcy5nZXQoJ2dyb3VwJyk7XG5cbiAgICAgIGlmIChhbmltYXRlKSB7XG4gICAgICAgIGdyb3VwLnN0b3BBbmltYXRlKCk7XG4gICAgICB9XG5cbiAgICAgIGdyb3VwWydzaGFwZU1hcCddID0ge307XG4gICAgICB0aGlzLmNsZWFyQ2FjaGUoKTtcbiAgICAgIGdyb3VwLnJlbW92ZSgpO1xuICAgICAgdGhpcy5fY2ZnID0gbnVsbDtcbiAgICAgIHRoaXMuZGVzdHJveWVkID0gdHJ1ZTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIEl0ZW1CYXNlO1xufSgpO1xuXG5leHBvcnQgZGVmYXVsdCBJdGVtQmFzZTsiLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGlzU3RyaW5nLCBpc1BsYWluT2JqZWN0LCBpc05pbCwgbWl4IH0gZnJvbSAnQGFudHYvdXRpbCc7XG5pbXBvcnQgSXRlbSBmcm9tICcuL2l0ZW0nO1xudmFyIEVORF9NQVAgPSB7XG4gIHNvdXJjZTogJ3N0YXJ0JyxcbiAgdGFyZ2V0OiAnZW5kJ1xufTtcbnZhciBJVEVNX05BTUVfU1VGRklYID0gJ05vZGUnOyAvLyDnq6/ngrnnmoTlkI7nvIDvvIzlpoIgc291cmNlTm9kZSwgdGFyZ2V0Tm9kZVxuXG52YXIgUE9JTlRfTkFNRV9TVUZGSVggPSAnUG9pbnQnOyAvLyDotbfngrnmiJbogIXnu5PmnZ/ngrnnmoTlkI7nvIDvvIzlpoIgc3RhcnRQb2ludCwgZW5kUG9pbnRcblxudmFyIEFOQ0hPUl9OQU1FX1NVRkZJWCA9ICdBbmNob3InO1xuXG52YXIgRWRnZSA9XG4vKiogQGNsYXNzICovXG5mdW5jdGlvbiAoX3N1cGVyKSB7XG4gIF9fZXh0ZW5kcyhFZGdlLCBfc3VwZXIpO1xuXG4gIGZ1bmN0aW9uIEVkZ2UoKSB7XG4gICAgcmV0dXJuIF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICB9XG5cbiAgRWRnZS5wcm90b3R5cGUuZ2V0RGVmYXVsdENmZyA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ2VkZ2UnLFxuICAgICAgc291cmNlTm9kZTogbnVsbCxcbiAgICAgIHRhcmdldE5vZGU6IG51bGwsXG4gICAgICBzdGFydFBvaW50OiBudWxsLFxuICAgICAgZW5kUG9pbnQ6IG51bGwsXG4gICAgICBsaW5rQ2VudGVyOiBmYWxzZVxuICAgIH07XG4gIH07XG5cbiAgRWRnZS5wcm90b3R5cGUuc2V0RW5kID0gZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7XG4gICAgdmFyIHBvaW50TmFtZSA9IEVORF9NQVBbbmFtZV0gKyBQT0lOVF9OQU1FX1NVRkZJWDtcbiAgICB2YXIgaXRlbU5hbWUgPSBuYW1lICsgSVRFTV9OQU1FX1NVRkZJWDtcbiAgICB2YXIgcHJlSXRlbSA9IHRoaXMuZ2V0KGl0ZW1OYW1lKTtcblxuICAgIGlmIChwcmVJdGVtICYmICFwcmVJdGVtLmRlc3Ryb3llZCkge1xuICAgICAgLy8g5aaC5p6c5LmL5YmN5a2Y5Zyo6IqC54K577yM5YiZ56e76Zmk5o6J6L65XG4gICAgICBwcmVJdGVtLnJlbW92ZUVkZ2UodGhpcyk7XG4gICAgfVxuXG4gICAgaWYgKGlzUGxhaW5PYmplY3QodmFsdWUpKSB7XG4gICAgICAvLyDlpoLmnpzorr7nva7miJDlhbfkvZPnmoTngrnvvIzliJnmuIXnkIboioLngrlcbiAgICAgIHRoaXMuc2V0KHBvaW50TmFtZSwgdmFsdWUpO1xuICAgICAgdGhpcy5zZXQoaXRlbU5hbWUsIG51bGwpO1xuICAgIH0gZWxzZSBpZiAodmFsdWUpIHtcbiAgICAgIHZhbHVlLmFkZEVkZ2UodGhpcyk7XG4gICAgICB0aGlzLnNldChpdGVtTmFtZSwgdmFsdWUpO1xuICAgICAgdGhpcy5zZXQocG9pbnROYW1lLCBudWxsKTtcbiAgICB9XG4gIH07XG4gIC8qKlxuICAgKiDojrflj5bov57mjqXngrnnmoTlnZDmoIdcbiAgICogQHBhcmFtIG5hbWUgc291cmNlIHwgdGFyZ2V0XG4gICAqIEBwYXJhbSBtb2RlbCDovrnnmoTmlbDmja7mqKHlnotcbiAgICogQHBhcmFtIGNvbnRyb2xQb2ludHMg5o6n5Yi254K5XG4gICAqL1xuXG5cbiAgRWRnZS5wcm90b3R5cGUuZ2V0TGlua1BvaW50ID0gZnVuY3Rpb24gKG5hbWUsIG1vZGVsLCBjb250cm9sUG9pbnRzKSB7XG4gICAgdmFyIHBvaW50TmFtZSA9IEVORF9NQVBbbmFtZV0gKyBQT0lOVF9OQU1FX1NVRkZJWDtcbiAgICB2YXIgaXRlbU5hbWUgPSBuYW1lICsgSVRFTV9OQU1FX1NVRkZJWDtcbiAgICB2YXIgcG9pbnQgPSB0aGlzLmdldChwb2ludE5hbWUpO1xuXG4gICAgaWYgKCFwb2ludCkge1xuICAgICAgdmFyIGl0ZW0gPSB0aGlzLmdldChpdGVtTmFtZSk7XG4gICAgICB2YXIgYW5jaG9yTmFtZSA9IG5hbWUgKyBBTkNIT1JfTkFNRV9TVUZGSVg7XG4gICAgICB2YXIgcHJlUG9pbnQgPSB0aGlzLmdldFByZVBvaW50KG5hbWUsIGNvbnRyb2xQb2ludHMpO1xuICAgICAgdmFyIGFuY2hvckluZGV4ID0gbW9kZWxbYW5jaG9yTmFtZV07XG5cbiAgICAgIGlmICghaXNOaWwoYW5jaG9ySW5kZXgpKSB7XG4gICAgICAgIC8vIOWmguaenOaciemUmueCue+8jOWImeS9v+eUqOmUmueCuee0ouW8leiOt+WPlui/nuaOpeeCuVxuICAgICAgICBwb2ludCA9IGl0ZW0uZ2V0TGlua1BvaW50QnlBbmNob3IoYW5jaG9ySW5kZXgpO1xuICAgICAgfSAvLyDlpoLmnpzplJrngrnmsqHmnInlr7nlupTnmoTngrnmiJbogIXmsqHmnInplJrngrnvvIzliJnnm7TmjqXorqHnrpfov57mjqXngrlcblxuXG4gICAgICBwb2ludCA9IHBvaW50IHx8IGl0ZW0uZ2V0TGlua1BvaW50KHByZVBvaW50KTtcblxuICAgICAgaWYgKCFpc05pbChwb2ludC5pbmRleCkpIHtcbiAgICAgICAgdGhpcy5zZXQobmFtZSArIFwiQW5jaG9ySW5kZXhcIiwgcG9pbnQuaW5kZXgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBwb2ludDtcbiAgfTtcbiAgLyoqXG4gICAqIOiOt+WPluWQjOerr+eCuei/m+ihjOi/nuaOpeeahOeCue+8jOiuoeeul+S6pOaxh+eCuVxuICAgKiBAcGFyYW0gbmFtZVxuICAgKiBAcGFyYW0gY29udHJvbFBvaW50c1xuICAgKi9cblxuXG4gIEVkZ2UucHJvdG90eXBlLmdldFByZVBvaW50ID0gZnVuY3Rpb24gKG5hbWUsIGNvbnRyb2xQb2ludHMpIHtcbiAgICBpZiAoY29udHJvbFBvaW50cyAmJiBjb250cm9sUG9pbnRzLmxlbmd0aCkge1xuICAgICAgdmFyIGluZGV4ID0gbmFtZSA9PT0gJ3NvdXJjZScgPyAwIDogY29udHJvbFBvaW50cy5sZW5ndGggLSAxO1xuICAgICAgcmV0dXJuIGNvbnRyb2xQb2ludHNbaW5kZXhdO1xuICAgIH1cblxuICAgIHZhciBvcHBvc2l0ZU5hbWUgPSBuYW1lID09PSAnc291cmNlJyA/ICd0YXJnZXQnIDogJ3NvdXJjZSc7IC8vIOWPluWPpuS4gOS4quiKgueCueeahOS9jee9rlxuXG4gICAgcmV0dXJuIHRoaXMuZ2V0RW5kUG9pbnQob3Bwb3NpdGVOYW1lKTtcbiAgfTtcbiAgLyoqXG4gICAqIOiOt+WPluerr+eCueeahOS9jee9rlxuICAgKiBAcGFyYW0gbmFtZVxuICAgKi9cblxuXG4gIEVkZ2UucHJvdG90eXBlLmdldEVuZFBvaW50ID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICB2YXIgaXRlbU5hbWUgPSBuYW1lICsgSVRFTV9OQU1FX1NVRkZJWDtcbiAgICB2YXIgcG9pbnROYW1lID0gRU5EX01BUFtuYW1lXSArIFBPSU5UX05BTUVfU1VGRklYO1xuICAgIHZhciBpdGVtID0gdGhpcy5nZXQoaXRlbU5hbWUpOyAvLyDlpoLmnpzmnInnq6/ngrnvvIznm7TmjqXkvb/nlKggbW9kZWxcblxuICAgIGlmIChpdGVtKSB7XG4gICAgICByZXR1cm4gaXRlbS5nZXQoJ21vZGVsJyk7XG4gICAgfSAvLyDlkKbliJnnm7TmjqXkvb/nlKjngrlcblxuXG4gICAgcmV0dXJuIHRoaXMuZ2V0KHBvaW50TmFtZSk7XG4gIH07XG4gIC8qKlxuICAgKiDpgJrov4fnq6/ngrnnmoTkuK3lv4Pojrflj5bmjqfliLbngrlcbiAgICogQHBhcmFtIG1vZGVsXG4gICAqL1xuXG5cbiAgRWRnZS5wcm90b3R5cGUuZ2V0Q29udHJvbFBvaW50c0J5Q2VudGVyID0gZnVuY3Rpb24gKG1vZGVsKSB7XG4gICAgdmFyIHNvdXJjZVBvaW50ID0gdGhpcy5nZXRFbmRQb2ludCgnc291cmNlJyk7XG4gICAgdmFyIHRhcmdldFBvaW50ID0gdGhpcy5nZXRFbmRQb2ludCgndGFyZ2V0Jyk7XG4gICAgdmFyIHNoYXBlRmFjdG9yeSA9IHRoaXMuZ2V0KCdzaGFwZUZhY3RvcnknKTtcbiAgICB2YXIgdHlwZSA9IG1vZGVsLnR5cGU7XG4gICAgcmV0dXJuIHNoYXBlRmFjdG9yeS5nZXRDb250cm9sUG9pbnRzKHR5cGUsIHtcbiAgICAgIHN0YXJ0UG9pbnQ6IHNvdXJjZVBvaW50LFxuICAgICAgZW5kUG9pbnQ6IHRhcmdldFBvaW50XG4gICAgfSk7XG4gIH07XG5cbiAgRWRnZS5wcm90b3R5cGUuZ2V0RW5kQ2VudGVyID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICB2YXIgaXRlbU5hbWUgPSBuYW1lICsgSVRFTV9OQU1FX1NVRkZJWDtcbiAgICB2YXIgcG9pbnROYW1lID0gRU5EX01BUFtuYW1lXSArIFBPSU5UX05BTUVfU1VGRklYO1xuICAgIHZhciBpdGVtID0gdGhpcy5nZXQoaXRlbU5hbWUpOyAvLyDlpoLmnpzmnInnq6/ngrnvvIznm7TmjqXkvb/nlKggbW9kZWxcblxuICAgIGlmIChpdGVtKSB7XG4gICAgICB2YXIgYmJveCA9IGl0ZW0uZ2V0QkJveCgpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgeDogYmJveC5jZW50ZXJYLFxuICAgICAgICB5OiBiYm94LmNlbnRlcllcbiAgICAgIH07XG4gICAgfSAvLyDlkKbliJnnm7TmjqXkvb/nlKjngrlcblxuXG4gICAgcmV0dXJuIHRoaXMuZ2V0KHBvaW50TmFtZSk7XG4gIH07XG5cbiAgRWRnZS5wcm90b3R5cGUuaW5pdCA9IGZ1bmN0aW9uICgpIHtcbiAgICBfc3VwZXIucHJvdG90eXBlLmluaXQuY2FsbCh0aGlzKTsgLy8g5Yid5aeL5YyW5Lik5Liq56uv54K5XG5cblxuICAgIHRoaXMuc2V0U291cmNlKHRoaXMuZ2V0KCdzb3VyY2UnKSk7XG4gICAgdGhpcy5zZXRUYXJnZXQodGhpcy5nZXQoJ3RhcmdldCcpKTtcbiAgfTtcblxuICBFZGdlLnByb3RvdHlwZS5nZXRTaGFwZUNmZyA9IGZ1bmN0aW9uIChtb2RlbCwgdXBkYXRlVHlwZSkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgbGlua0NlbnRlciA9IHNlbGYuZ2V0KCdsaW5rQ2VudGVyJyk7IC8vIOWmguaenOi/nuaOpeWIsOS4reW/g++8jOW/veinhumUmueCueOAgeW/veinhuaOp+WItueCuVxuXG4gICAgdmFyIGNmZyA9ICh1cGRhdGVUeXBlID09PSBudWxsIHx8IHVwZGF0ZVR5cGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHVwZGF0ZVR5cGUuaW5jbHVkZXMoJ21vdmUnKSkgPyBtb2RlbCA6IF9zdXBlci5wcm90b3R5cGUuZ2V0U2hhcGVDZmcuY2FsbCh0aGlzLCBtb2RlbCk7XG5cbiAgICBpZiAobGlua0NlbnRlcikge1xuICAgICAgY2ZnLnN0YXJ0UG9pbnQgPSBzZWxmLmdldEVuZENlbnRlcignc291cmNlJyk7XG4gICAgICBjZmcuZW5kUG9pbnQgPSBzZWxmLmdldEVuZENlbnRlcigndGFyZ2V0Jyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBjb250cm9sUG9pbnRzID0gY2ZnLmNvbnRyb2xQb2ludHMgfHwgc2VsZi5nZXRDb250cm9sUG9pbnRzQnlDZW50ZXIoY2ZnKTtcbiAgICAgIGNmZy5zdGFydFBvaW50ID0gc2VsZi5nZXRMaW5rUG9pbnQoJ3NvdXJjZScsIG1vZGVsLCBjb250cm9sUG9pbnRzKTtcbiAgICAgIGNmZy5lbmRQb2ludCA9IHNlbGYuZ2V0TGlua1BvaW50KCd0YXJnZXQnLCBtb2RlbCwgY29udHJvbFBvaW50cyk7XG4gICAgfVxuXG4gICAgY2ZnLnNvdXJjZU5vZGUgPSBzZWxmLmdldCgnc291cmNlTm9kZScpO1xuICAgIGNmZy50YXJnZXROb2RlID0gc2VsZi5nZXQoJ3RhcmdldE5vZGUnKTtcbiAgICByZXR1cm4gY2ZnO1xuICB9O1xuICAvKipcbiAgICog6I635Y+W6L6555qE5pWw5o2u5qih5Z6LXG4gICAqL1xuXG5cbiAgRWRnZS5wcm90b3R5cGUuZ2V0TW9kZWwgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIG91dCA9IHRoaXMuZ2V0KCdtb2RlbCcpO1xuICAgIHZhciBzb3VyY2VJdGVtID0gdGhpcy5nZXQoXCJzb3VyY2VcIiArIElURU1fTkFNRV9TVUZGSVgpO1xuICAgIHZhciB0YXJnZXRJdGVtID0gdGhpcy5nZXQoXCJ0YXJnZXRcIiArIElURU1fTkFNRV9TVUZGSVgpO1xuXG4gICAgaWYgKHNvdXJjZUl0ZW0pIHtcbiAgICAgIGRlbGV0ZSBvdXRbXCJzb3VyY2VcIiArIElURU1fTkFNRV9TVUZGSVhdO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXQuc291cmNlID0gdGhpcy5nZXQoXCJzdGFydFwiICsgUE9JTlRfTkFNRV9TVUZGSVgpO1xuICAgIH1cblxuICAgIGlmICh0YXJnZXRJdGVtKSB7XG4gICAgICBkZWxldGUgb3V0W1widGFyZ2V0XCIgKyBJVEVNX05BTUVfU1VGRklYXTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0LnRhcmdldCA9IHRoaXMuZ2V0KFwiZW5kXCIgKyBQT0lOVF9OQU1FX1NVRkZJWCk7XG4gICAgfVxuXG4gICAgaWYgKCFpc1N0cmluZyhvdXQuc291cmNlKSAmJiAhaXNQbGFpbk9iamVjdChvdXQuc291cmNlKSkge1xuICAgICAgb3V0LnNvdXJjZSA9IG91dC5zb3VyY2UuZ2V0SUQoKTtcbiAgICB9XG5cbiAgICBpZiAoIWlzU3RyaW5nKG91dC50YXJnZXQpICYmICFpc1BsYWluT2JqZWN0KG91dC50YXJnZXQpKSB7XG4gICAgICBvdXQudGFyZ2V0ID0gb3V0LnRhcmdldC5nZXRJRCgpO1xuICAgIH1cblxuICAgIHJldHVybiBvdXQ7XG4gIH07XG5cbiAgRWRnZS5wcm90b3R5cGUuc2V0U291cmNlID0gZnVuY3Rpb24gKHNvdXJjZSkge1xuICAgIHRoaXMuc2V0RW5kKCdzb3VyY2UnLCBzb3VyY2UpO1xuICAgIHRoaXMuc2V0KCdzb3VyY2UnLCBzb3VyY2UpO1xuICB9O1xuXG4gIEVkZ2UucHJvdG90eXBlLnNldFRhcmdldCA9IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICB0aGlzLnNldEVuZCgndGFyZ2V0JywgdGFyZ2V0KTtcbiAgICB0aGlzLnNldCgndGFyZ2V0JywgdGFyZ2V0KTtcbiAgfTtcblxuICBFZGdlLnByb3RvdHlwZS5nZXRTb3VyY2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KCdzb3VyY2UnKTtcbiAgfTtcblxuICBFZGdlLnByb3RvdHlwZS5nZXRUYXJnZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KCd0YXJnZXQnKTtcbiAgfTtcblxuICBFZGdlLnByb3RvdHlwZS51cGRhdGVQb3NpdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG4gIC8qKlxuICAgKiDovrnkuI3pnIDopoHph43orqHnrpflrrnlmajkvY3nva7vvIznm7TmjqXph43mlrDorqHnrpcgcGF0aCDkvY3nva5cbiAgICogQHBhcmFtIHtvYmplY3R9IGNmZyDlvoXmm7TmlrDmlbDmja5cbiAgICovXG5cblxuICBFZGdlLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAoY2ZnLCB1cGRhdGVUeXBlKSB7XG4gICAgaWYgKHVwZGF0ZVR5cGUgPT09IHZvaWQgMCkge1xuICAgICAgdXBkYXRlVHlwZSA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICB2YXIgbW9kZWwgPSB0aGlzLmdldCgnbW9kZWwnKTtcbiAgICB2YXIgb3JpVmlzaWJsZSA9IG1vZGVsLnZpc2libGU7XG4gICAgdmFyIGNmZ1Zpc2libGUgPSBjZmcudmlzaWJsZTtcbiAgICBpZiAob3JpVmlzaWJsZSAhPT0gY2ZnVmlzaWJsZSAmJiBjZmdWaXNpYmxlICE9PSB1bmRlZmluZWQpIHRoaXMuY2hhbmdlVmlzaWJpbGl0eShjZmdWaXNpYmxlKTtcbiAgICB2YXIgc3R5bGVzID0gdGhpcy5nZXQoJ3N0eWxlcycpO1xuXG4gICAgaWYgKGNmZy5zdGF0ZVN0eWxlcykge1xuICAgICAgLy8g5pu05pawIGl0ZW0g5pe25pu05pawIHRoaXMuZ2V0KCdzdHlsZXMnKSDkuK3nmoTlgLxcbiAgICAgIHZhciBzdGF0ZVN0eWxlcyA9IGNmZy5zdGF0ZVN0eWxlcztcbiAgICAgIG1peChzdHlsZXMsIHN0YXRlU3R5bGVzKTtcbiAgICAgIGRlbGV0ZSBjZmcuc3RhdGVTdHlsZXM7XG4gICAgfVxuXG4gICAgT2JqZWN0LmFzc2lnbihtb2RlbCwgY2ZnKTtcbiAgICB0aGlzLnVwZGF0ZVNoYXBlKHVwZGF0ZVR5cGUpO1xuICAgIHRoaXMuYWZ0ZXJVcGRhdGUoKTtcbiAgICB0aGlzLmNsZWFyQ2FjaGUoKTtcbiAgfTtcblxuICBFZGdlLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBzb3VyY2VJdGVtID0gdGhpcy5nZXQoXCJzb3VyY2VcIiArIElURU1fTkFNRV9TVUZGSVgpO1xuICAgIHZhciB0YXJnZXRJdGVtID0gdGhpcy5nZXQoXCJ0YXJnZXRcIiArIElURU1fTkFNRV9TVUZGSVgpO1xuXG4gICAgaWYgKHNvdXJjZUl0ZW0gJiYgIXNvdXJjZUl0ZW0uZGVzdHJveWVkKSB7XG4gICAgICBzb3VyY2VJdGVtLnJlbW92ZUVkZ2UodGhpcyk7XG4gICAgfVxuXG4gICAgaWYgKHRhcmdldEl0ZW0gJiYgIXRhcmdldEl0ZW0uZGVzdHJveWVkKSB7XG4gICAgICB0YXJnZXRJdGVtLnJlbW92ZUVkZ2UodGhpcyk7XG4gICAgfVxuXG4gICAgX3N1cGVyLnByb3RvdHlwZS5kZXN0cm95LmNhbGwodGhpcyk7XG4gIH07XG5cbiAgcmV0dXJuIEVkZ2U7XG59KEl0ZW0pO1xuXG5leHBvcnQgZGVmYXVsdCBFZGdlOyIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgZWFjaCwgaXNOaWwsIGlzTnVtYmVyIH0gZnJvbSAnQGFudHYvdXRpbCc7XG5pbXBvcnQgeyBkaXN0YW5jZSwgZ2V0Q2lyY2xlSW50ZXJzZWN0QnlQb2ludCwgZ2V0RWxsaXBzZUludGVyc2VjdEJ5UG9pbnQsIGdldFJlY3RJbnRlcnNlY3RCeVBvaW50IH0gZnJvbSAnLi4vdXRpbC9tYXRoJztcbmltcG9ydCBJdGVtIGZyb20gJy4vaXRlbSc7XG52YXIgQ0FDSEVfQU5DSE9SX1BPSU5UUyA9ICdhbmNob3JQb2ludHNDYWNoZSc7XG52YXIgQ0FDSEVfQkJPWCA9ICdiYm94Q2FjaGUnO1xuXG52YXIgTm9kZSA9XG4vKiogQGNsYXNzICovXG5mdW5jdGlvbiAoX3N1cGVyKSB7XG4gIF9fZXh0ZW5kcyhOb2RlLCBfc3VwZXIpO1xuXG4gIGZ1bmN0aW9uIE5vZGUoKSB7XG4gICAgcmV0dXJuIF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICB9XG5cbiAgTm9kZS5wcm90b3R5cGUuZ2V0TmVhcmVzdFBvaW50ID0gZnVuY3Rpb24gKHBvaW50cywgY3VyUG9pbnQpIHtcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIHZhciBuZWFyZXN0UG9pbnQgPSBwb2ludHNbMF07XG4gICAgdmFyIG1pbkRpc3RhbmNlID0gZGlzdGFuY2UocG9pbnRzWzBdLCBjdXJQb2ludCk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHBvaW50ID0gcG9pbnRzW2ldO1xuICAgICAgdmFyIGRpcyA9IGRpc3RhbmNlKHBvaW50LCBjdXJQb2ludCk7XG5cbiAgICAgIGlmIChkaXMgPCBtaW5EaXN0YW5jZSkge1xuICAgICAgICBuZWFyZXN0UG9pbnQgPSBwb2ludDtcbiAgICAgICAgbWluRGlzdGFuY2UgPSBkaXM7XG4gICAgICAgIGluZGV4ID0gaTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBuZWFyZXN0UG9pbnQuYW5jaG9ySW5kZXggPSBpbmRleDtcbiAgICByZXR1cm4gbmVhcmVzdFBvaW50O1xuICB9O1xuXG4gIE5vZGUucHJvdG90eXBlLmdldERlZmF1bHRDZmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdub2RlJyxcbiAgICAgIGVkZ2VzOiBbXVxuICAgIH07XG4gIH07XG4gIC8qKlxuICAgKiDojrflj5bku47oioLngrnlhbPogZTnmoTmiYDmnInovrlcbiAgICovXG5cblxuICBOb2RlLnByb3RvdHlwZS5nZXRFZGdlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXQoJ2VkZ2VzJyk7XG4gIH07XG4gIC8qKlxuICAgKiDojrflj5bmiYDmnInnmoTlhaXovrlcbiAgICovXG5cblxuICBOb2RlLnByb3RvdHlwZS5nZXRJbkVkZ2VzID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICByZXR1cm4gdGhpcy5nZXQoJ2VkZ2VzJykuZmlsdGVyKGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgICByZXR1cm4gZWRnZS5nZXQoJ3RhcmdldCcpID09PSBzZWxmO1xuICAgIH0pO1xuICB9O1xuICAvKipcbiAgICog6I635Y+W5omA5pyJ55qE5Ye66L65XG4gICAqL1xuXG5cbiAgTm9kZS5wcm90b3R5cGUuZ2V0T3V0RWRnZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHJldHVybiB0aGlzLmdldCgnZWRnZXMnKS5maWx0ZXIoZnVuY3Rpb24gKGVkZ2UpIHtcbiAgICAgIHJldHVybiBlZGdlLmdldCgnc291cmNlJykgPT09IHNlbGY7XG4gICAgfSk7XG4gIH07XG4gIC8qKlxuICAgKiDojrflj5boioLngrnnmoTpgrvlsYXoioLngrlcbiAgICpcbiAgICogQHJldHVybnMge0lOb2RlW119XG4gICAqIEBtZW1iZXJvZiBOb2RlXG4gICAqL1xuXG5cbiAgTm9kZS5wcm90b3R5cGUuZ2V0TmVpZ2hib3JzID0gZnVuY3Rpb24gKHR5cGUpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdmFyIGVkZ2VzID0gdGhpcy5nZXQoJ2VkZ2VzJyk7XG5cbiAgICBpZiAodHlwZSA9PT0gJ3RhcmdldCcpIHtcbiAgICAgIC8vIOW9k+WJjeiKgueCueS4uiBzb3VyY2XvvIzlroPmiYDmjIflkJHnmoTnm67moIfoioLngrlcbiAgICAgIHZhciBuZWlnaGhib3JzQ29udmVydGVyXzEgPSBmdW5jdGlvbiBuZWlnaGhib3JzQ29udmVydGVyXzEoZWRnZSkge1xuICAgICAgICByZXR1cm4gZWRnZS5nZXRTb3VyY2UoKSA9PT0gX3RoaXM7XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gZWRnZXMuZmlsdGVyKG5laWdoaGJvcnNDb252ZXJ0ZXJfMSkubWFwKGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgICAgIHJldHVybiBlZGdlLmdldFRhcmdldCgpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGUgPT09ICdzb3VyY2UnKSB7XG4gICAgICAvLyDlvZPliY3oioLngrnkuLogdGFyZ2V077yM5a6D5omA5oyH5ZCR55qE5rqQ6IqC54K5XG4gICAgICB2YXIgbmVpZ2hoYm9yc0NvbnZlcnRlcl8yID0gZnVuY3Rpb24gbmVpZ2hoYm9yc0NvbnZlcnRlcl8yKGVkZ2UpIHtcbiAgICAgICAgcmV0dXJuIGVkZ2UuZ2V0VGFyZ2V0KCkgPT09IF90aGlzO1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuIGVkZ2VzLmZpbHRlcihuZWlnaGhib3JzQ29udmVydGVyXzIpLm1hcChmdW5jdGlvbiAoZWRnZSkge1xuICAgICAgICByZXR1cm4gZWRnZS5nZXRTb3VyY2UoKTtcbiAgICAgIH0pO1xuICAgIH0gLy8g6Iul5pyq5oyH5a6aIHR5cGUg77yM5YiZ6L+U5Zue5omA5pyJ6YK75bGFXG5cblxuICAgIHZhciBuZWlnaGhib3JzQ29udmVydGVyID0gZnVuY3Rpb24gbmVpZ2hoYm9yc0NvbnZlcnRlcihlZGdlKSB7XG4gICAgICByZXR1cm4gZWRnZS5nZXRTb3VyY2UoKSA9PT0gX3RoaXMgPyBlZGdlLmdldFRhcmdldCgpIDogZWRnZS5nZXRTb3VyY2UoKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIGVkZ2VzLm1hcChuZWlnaGhib3JzQ29udmVydGVyKTtcbiAgfTtcbiAgLyoqXG4gICAqIOagueaNrumUmueCueeahOe0ouW8leiOt+WPlui/nuaOpeeCuVxuICAgKiBAcGFyYW0gIHtOdW1iZXJ9IGluZGV4IOe0ouW8lVxuICAgKi9cblxuXG4gIE5vZGUucHJvdG90eXBlLmdldExpbmtQb2ludEJ5QW5jaG9yID0gZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgdmFyIGFuY2hvclBvaW50cyA9IHRoaXMuZ2V0QW5jaG9yUG9pbnRzKCk7XG4gICAgcmV0dXJuIGFuY2hvclBvaW50c1tpbmRleF07XG4gIH07XG4gIC8qKlxuICAgKiDojrflj5bov57mjqXngrlcbiAgICogQHBhcmFtIHBvaW50XG4gICAqL1xuXG5cbiAgTm9kZS5wcm90b3R5cGUuZ2V0TGlua1BvaW50ID0gZnVuY3Rpb24gKHBvaW50KSB7XG4gICAgdmFyIGtleVNoYXBlID0gdGhpcy5nZXQoJ2tleVNoYXBlJyk7XG4gICAgdmFyIHR5cGUgPSBrZXlTaGFwZS5nZXQoJ3R5cGUnKTtcbiAgICB2YXIgaXRlbVR5cGUgPSB0aGlzLmdldCgndHlwZScpO1xuICAgIHZhciBjZW50ZXJYO1xuICAgIHZhciBjZW50ZXJZO1xuICAgIHZhciBiYm94ID0gdGhpcy5nZXRCQm94KCk7XG5cbiAgICBpZiAoaXRlbVR5cGUgPT09ICdjb21ibycpIHtcbiAgICAgIGNlbnRlclggPSBiYm94LmNlbnRlclggfHwgKGJib3gubWF4WCArIGJib3gubWluWCkgLyAyO1xuICAgICAgY2VudGVyWSA9IGJib3guY2VudGVyWSB8fCAoYmJveC5tYXhZICsgYmJveC5taW5ZKSAvIDI7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNlbnRlclggPSBiYm94LmNlbnRlclg7XG4gICAgICBjZW50ZXJZID0gYmJveC5jZW50ZXJZO1xuICAgIH1cblxuICAgIHZhciBhbmNob3JQb2ludHMgPSB0aGlzLmdldEFuY2hvclBvaW50cygpO1xuICAgIHZhciBpbnRlcnNlY3RQb2ludDtcblxuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSAnY2lyY2xlJzpcbiAgICAgICAgaW50ZXJzZWN0UG9pbnQgPSBnZXRDaXJjbGVJbnRlcnNlY3RCeVBvaW50KHtcbiAgICAgICAgICB4OiBjZW50ZXJYLFxuICAgICAgICAgIHk6IGNlbnRlclksXG4gICAgICAgICAgcjogYmJveC53aWR0aCAvIDJcbiAgICAgICAgfSwgcG9pbnQpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnZWxsaXBzZSc6XG4gICAgICAgIGludGVyc2VjdFBvaW50ID0gZ2V0RWxsaXBzZUludGVyc2VjdEJ5UG9pbnQoe1xuICAgICAgICAgIHg6IGNlbnRlclgsXG4gICAgICAgICAgeTogY2VudGVyWSxcbiAgICAgICAgICByeDogYmJveC53aWR0aCAvIDIsXG4gICAgICAgICAgcnk6IGJib3guaGVpZ2h0IC8gMlxuICAgICAgICB9LCBwb2ludCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpbnRlcnNlY3RQb2ludCA9IGdldFJlY3RJbnRlcnNlY3RCeVBvaW50KGJib3gsIHBvaW50KTtcbiAgICB9XG5cbiAgICB2YXIgbGlua1BvaW50ID0gaW50ZXJzZWN0UG9pbnQ7IC8vIOWmguaenOWtmOWcqOmUmueCue+8jOWImeS9v+eUqOS6pOeCueiuoeeul+acgOi/keeahOmUmueCuVxuXG4gICAgaWYgKGFuY2hvclBvaW50cy5sZW5ndGgpIHtcbiAgICAgIGlmICghbGlua1BvaW50KSB7XG4gICAgICAgIC8vIOWmguaenOiuoeeul+S4jeWHuuS6pOeCuVxuICAgICAgICBsaW5rUG9pbnQgPSBwb2ludDtcbiAgICAgIH1cblxuICAgICAgbGlua1BvaW50ID0gdGhpcy5nZXROZWFyZXN0UG9pbnQoYW5jaG9yUG9pbnRzLCBsaW5rUG9pbnQpO1xuICAgIH1cblxuICAgIGlmICghbGlua1BvaW50KSB7XG4gICAgICAvLyDlpoLmnpzmnIDnu4jkvp3nhLbmsqHms5Xmib7liLDplJrngrnlkozov57mjqXngrnvvIznm7TmjqXov5Tlm57kuK3lv4PngrlcbiAgICAgIGxpbmtQb2ludCA9IHtcbiAgICAgICAgeDogY2VudGVyWCxcbiAgICAgICAgeTogY2VudGVyWVxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gbGlua1BvaW50O1xuICB9O1xuICAvKipcbiAgICog6I635Y+W6ZSa54K555qE5a6a5LmJXG4gICAqIEByZXR1cm4ge2FycmF5fSBhbmNob3JQb2ludHNcbiAgICovXG5cblxuICBOb2RlLnByb3RvdHlwZS5nZXRBbmNob3JQb2ludHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGFuY2hvclBvaW50cyA9IHRoaXMuZ2V0KENBQ0hFX0FOQ0hPUl9QT0lOVFMpO1xuXG4gICAgaWYgKCFhbmNob3JQb2ludHMpIHtcbiAgICAgIGFuY2hvclBvaW50cyA9IFtdO1xuICAgICAgdmFyIHNoYXBlRmFjdG9yeSA9IHRoaXMuZ2V0KCdzaGFwZUZhY3RvcnknKTtcbiAgICAgIHZhciBiYm94XzEgPSB0aGlzLmdldEJCb3goKTtcbiAgICAgIHZhciBtb2RlbCA9IHRoaXMuZ2V0KCdtb2RlbCcpO1xuICAgICAgdmFyIHNoYXBlQ2ZnID0gdGhpcy5nZXRTaGFwZUNmZyhtb2RlbCk7XG4gICAgICB2YXIgdHlwZSA9IG1vZGVsLnR5cGU7XG4gICAgICB2YXIgcG9pbnRzID0gc2hhcGVGYWN0b3J5LmdldEFuY2hvclBvaW50cyh0eXBlLCBzaGFwZUNmZykgfHwgW107XG4gICAgICBlYWNoKHBvaW50cywgZnVuY3Rpb24gKHBvaW50QXJyLCBpbmRleCkge1xuICAgICAgICB2YXIgcG9pbnQgPSB7XG4gICAgICAgICAgeDogYmJveF8xLm1pblggKyBwb2ludEFyclswXSAqIGJib3hfMS53aWR0aCxcbiAgICAgICAgICB5OiBiYm94XzEubWluWSArIHBvaW50QXJyWzFdICogYmJveF8xLmhlaWdodCxcbiAgICAgICAgICBhbmNob3JJbmRleDogaW5kZXhcbiAgICAgICAgfTtcbiAgICAgICAgYW5jaG9yUG9pbnRzLnB1c2gocG9pbnQpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLnNldChDQUNIRV9BTkNIT1JfUE9JTlRTLCBhbmNob3JQb2ludHMpO1xuICAgIH1cblxuICAgIHJldHVybiBhbmNob3JQb2ludHM7XG4gIH07XG4gIC8qKlxuICAgKiBhZGQgZWRnZVxuICAgKiBAcGFyYW0gZWRnZSBFZGdlIGluc3RhbmNlXG4gICAqL1xuXG5cbiAgTm9kZS5wcm90b3R5cGUuYWRkRWRnZSA9IGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgdGhpcy5nZXQoJ2VkZ2VzJykucHVzaChlZGdlKTtcbiAgfTtcbiAgLyoqXG4gICAqIOmUgeWumuiKgueCuVxuICAgKi9cblxuXG4gIE5vZGUucHJvdG90eXBlLmxvY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5zZXQoJ2xvY2tlZCcsIHRydWUpO1xuICB9O1xuICAvKipcbiAgICog6Kej6ZSB6ZSB5a6a55qE6IqC54K5XG4gICAqL1xuXG5cbiAgTm9kZS5wcm90b3R5cGUudW5sb2NrID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuc2V0KCdsb2NrZWQnLCBmYWxzZSk7XG4gIH07XG5cbiAgTm9kZS5wcm90b3R5cGUuaGFzTG9ja2VkID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLmdldCgnbG9ja2VkJyk7XG4gIH07XG4gIC8qKlxuICAgKiDnp7vpmaTovrlcbiAgICogQHBhcmFtIHtFZGdlfSBlZGdlIOi+uVxuICAgKi9cblxuXG4gIE5vZGUucHJvdG90eXBlLnJlbW92ZUVkZ2UgPSBmdW5jdGlvbiAoZWRnZSkge1xuICAgIHZhciBlZGdlcyA9IHRoaXMuZ2V0RWRnZXMoKTtcbiAgICB2YXIgaW5kZXggPSBlZGdlcy5pbmRleE9mKGVkZ2UpO1xuICAgIGlmIChpbmRleCA+IC0xKSBlZGdlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICB9O1xuXG4gIE5vZGUucHJvdG90eXBlLmNsZWFyQ2FjaGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5zZXQoQ0FDSEVfQkJPWCwgbnVsbCk7IC8vIOa4heeQhue8k+WtmOeahCBiYm94XG5cbiAgICB0aGlzLnNldChDQUNIRV9BTkNIT1JfUE9JTlRTLCBudWxsKTtcbiAgfTtcbiAgLyoqXG4gICAqIOWIpOaWreabtOaWsOeahOenjeexu++8jG1vdmUg6KGo56S65LuF56e75Yqo77yMYmJveCDooajnpLrlpKflsI/mnInlj5jljJbvvIxzdHlsZSDooajnpLrku4XkuI7lpKflsI/ml6DlhbPnmoTlj4LmlbDlj5jljJZcbiAgICogQHBhcmFtIGNmZyDoioLngrnmlbDmja7mqKHlnotcbiAgICovXG5cblxuICBOb2RlLnByb3RvdHlwZS5nZXRVcGRhdGVUeXBlID0gZnVuY3Rpb24gKGNmZykge1xuICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2U7XG5cbiAgICBpZiAoIWNmZykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB2YXIgZXhpc3RYID0gIWlzTmlsKGNmZy54KTtcbiAgICB2YXIgZXhpc3RZID0gIWlzTmlsKGNmZy55KTtcbiAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGNmZyk7IC8vIOS7heacieS4gOS4quWtl+aute+8jOWMheWQqyB4IOaIluiAhSDljIXlkKsgeVxuICAgIC8vIOS4pOS4quWtl+aute+8jOWQjOaXtuaciSB477yM5ZCM5pe25pyJIHlcblxuICAgIGlmIChrZXlzLmxlbmd0aCA9PT0gMSAmJiAoZXhpc3RYIHx8IGV4aXN0WSkgfHwga2V5cy5sZW5ndGggPT09IDIgJiYgZXhpc3RYICYmIGV4aXN0WSkgcmV0dXJuICdtb3ZlJztcbiAgICBpZiAoaXNOdW1iZXIoY2ZnLngpIHx8IGlzTnVtYmVyKGNmZy55KSB8fCBjZmcudHlwZSB8fCBjZmcuYW5jaG9yUG9pbnRzIHx8IGNmZy5zaXplIHx8IChjZmcgPT09IG51bGwgfHwgY2ZnID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjZmcuc3R5bGUpICYmICgoKF9hID0gY2ZnID09PSBudWxsIHx8IGNmZyA9PT0gdm9pZCAwID8gdm9pZCAwIDogY2ZnLnN0eWxlKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EucikgfHwgKChfYiA9IGNmZyA9PT0gbnVsbCB8fCBjZmcgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNmZy5zdHlsZSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLndpZHRoKSB8fCAoKF9jID0gY2ZnID09PSBudWxsIHx8IGNmZyA9PT0gdm9pZCAwID8gdm9pZCAwIDogY2ZnLnN0eWxlKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MuaGVpZ2h0KSB8fCAoKF9kID0gY2ZnID09PSBudWxsIHx8IGNmZyA9PT0gdm9pZCAwID8gdm9pZCAwIDogY2ZnLnN0eWxlKSA9PT0gbnVsbCB8fCBfZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2QucngpIHx8ICgoX2UgPSBjZmcgPT09IG51bGwgfHwgY2ZnID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjZmcuc3R5bGUpID09PSBudWxsIHx8IF9lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZS5yeSkpKSByZXR1cm4gJ2Jib3h8bGFiZWwnO1xuICAgIHZhciB1cGRhdGVMYWJlbCA9IGtleXMuaW5jbHVkZXMoJ2xhYmVsJykgfHwga2V5cy5pbmNsdWRlcygnbGFiZWxDZmcnKTtcbiAgICByZXR1cm4gdXBkYXRlTGFiZWwgPyAnc3R5bGV8bGFiZWwnIDogJ3N0eWxlJztcbiAgfTtcblxuICByZXR1cm4gTm9kZTtcbn0oSXRlbSk7XG5cbmV4cG9ydCBkZWZhdWx0IE5vZGU7IiwiaW1wb3J0IHsgX19hc3NpZ24sIF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IE5vZGUgZnJvbSAnLi9ub2RlJztcbmltcG9ydCBHbG9iYWwgZnJvbSAnLi4vZ2xvYmFsJztcbmltcG9ydCB7IGdldEJCb3ggfSBmcm9tICcuLi91dGlsL2dyYXBoaWMnO1xuaW1wb3J0IHsgaXNOdW1iZXIgfSBmcm9tICdAYW50di91dGlsJztcbnZhciBDQUNIRV9CQk9YID0gJ2Jib3hDYWNoZSc7XG52YXIgQ0FDSEVfQ0FOVkFTX0JCT1ggPSAnYmJveENhbnZhc0NhY2hlJztcbnZhciBDQUNIRV9TSVpFID0gJ3NpemVDYWNoZSc7XG52YXIgQ0FDSEVfQU5DSE9SX1BPSU5UUyA9ICdhbmNob3JQb2ludHNDYWNoZSc7XG5cbnZhciBDb21ibyA9XG4vKiogQGNsYXNzICovXG5mdW5jdGlvbiAoX3N1cGVyKSB7XG4gIF9fZXh0ZW5kcyhDb21ibywgX3N1cGVyKTtcblxuICBmdW5jdGlvbiBDb21ibygpIHtcbiAgICByZXR1cm4gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gIH1cblxuICBDb21iby5wcm90b3R5cGUuZ2V0RGVmYXVsdENmZyA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ2NvbWJvJyxcbiAgICAgIG5vZGVzOiBbXSxcbiAgICAgIGVkZ2VzOiBbXSxcbiAgICAgIGNvbWJvczogW11cbiAgICB9O1xuICB9O1xuXG4gIENvbWJvLnByb3RvdHlwZS5nZXRTaGFwZUNmZyA9IGZ1bmN0aW9uIChtb2RlbCkge1xuICAgIHZhciBzdHlsZXMgPSB0aGlzLmdldCgnc3R5bGVzJyk7XG4gICAgdmFyIGJib3ggPSB0aGlzLmdldCgnYmJveCcpO1xuXG4gICAgaWYgKHN0eWxlcyAmJiBiYm94KSB7XG4gICAgICAvLyBtZXJnZSBncmFwaOeahGl0ZW3moLflvI/kuI7mlbDmja7mqKHlnovkuK3nmoTmoLflvI9cbiAgICAgIHZhciBuZXdNb2RlbCA9IG1vZGVsO1xuICAgICAgdmFyIHNpemUgPSB7XG4gICAgICAgIHI6IE1hdGguaHlwb3QoYmJveC5oZWlnaHQsIGJib3gud2lkdGgpIC8gMiB8fCBHbG9iYWwuZGVmYXVsdENvbWJvLnNpemVbMF0gLyAyLFxuICAgICAgICB3aWR0aDogYmJveC53aWR0aCB8fCBHbG9iYWwuZGVmYXVsdENvbWJvLnNpemVbMF0sXG4gICAgICAgIGhlaWdodDogYmJveC5oZWlnaHQgfHwgR2xvYmFsLmRlZmF1bHRDb21iby5zaXplWzFdXG4gICAgICB9O1xuICAgICAgbmV3TW9kZWwuc3R5bGUgPSBfX2Fzc2lnbihfX2Fzc2lnbihfX2Fzc2lnbih7fSwgc3R5bGVzKSwgbW9kZWwuc3R5bGUpLCBzaXplKTtcbiAgICAgIHZhciBwYWRkaW5nID0gbW9kZWwucGFkZGluZyB8fCBHbG9iYWwuZGVmYXVsdENvbWJvLnBhZGRpbmc7XG5cbiAgICAgIGlmIChpc051bWJlcihwYWRkaW5nKSkge1xuICAgICAgICBzaXplLnIgKz0gcGFkZGluZztcbiAgICAgICAgc2l6ZS53aWR0aCArPSBwYWRkaW5nICogMjtcbiAgICAgICAgc2l6ZS5oZWlnaHQgKz0gcGFkZGluZyAqIDI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzaXplLnIgKz0gcGFkZGluZ1swXTtcbiAgICAgICAgc2l6ZS53aWR0aCArPSBwYWRkaW5nWzFdICsgcGFkZGluZ1szXSB8fCBwYWRkaW5nWzFdICogMjtcbiAgICAgICAgc2l6ZS5oZWlnaHQgKz0gcGFkZGluZ1swXSArIHBhZGRpbmdbMl0gfHwgcGFkZGluZ1swXSAqIDI7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc2V0KENBQ0hFX1NJWkUsIHNpemUpO1xuICAgICAgcmV0dXJuIG5ld01vZGVsO1xuICAgIH1cblxuICAgIHJldHVybiBtb2RlbDtcbiAgfTtcbiAgLyoqXG4gICAqIOagueaNriBrZXlzaGFwZSDorqHnrpfljIXlm7Tnm5JcbiAgICovXG5cblxuICBDb21iby5wcm90b3R5cGUuY2FsY3VsYXRlQ2FudmFzQkJveCA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHJldHVybjtcbiAgICB2YXIga2V5U2hhcGUgPSB0aGlzLmdldCgna2V5U2hhcGUnKTtcbiAgICB2YXIgZ3JvdXAgPSB0aGlzLmdldCgnZ3JvdXAnKTsgLy8g5Zug5Li6IGdyb3VwIOWPr+iDveS8muenu+WKqO+8jOaJgOS7peW/hemhu+mAmui/h+eItuWFg+e0oOiuoeeul+aJjeiDveiuoeeul+WHuuato+ehrueahOWMheWbtOebklxuXG4gICAgdmFyIGJib3ggPSBnZXRCQm94KGtleVNoYXBlLCBncm91cCk7XG4gICAgYmJveC5jZW50ZXJYID0gKGJib3gubWluWCArIGJib3gubWF4WCkgLyAyO1xuICAgIGJib3guY2VudGVyWSA9IChiYm94Lm1pblkgKyBiYm94Lm1heFkpIC8gMjtcbiAgICB2YXIgY2FjaGVTaXplID0gdGhpcy5nZXQoQ0FDSEVfU0laRSk7XG4gICAgdmFyIGNhY2hlQkJveCA9IHRoaXMuZ2V0KENBQ0hFX0JCT1gpIHx8IHt9O1xuICAgIHZhciBvcmlYID0gY2FjaGVCQm94Lng7XG4gICAgdmFyIG9yaVkgPSBjYWNoZUJCb3gueDtcblxuICAgIGlmIChjYWNoZVNpemUpIHtcbiAgICAgIGNhY2hlU2l6ZS53aWR0aCA9IE1hdGgubWF4KGNhY2hlU2l6ZS53aWR0aCwgYmJveC53aWR0aCk7XG4gICAgICBjYWNoZVNpemUuaGVpZ2h0ID0gTWF0aC5tYXgoY2FjaGVTaXplLmhlaWdodCwgYmJveC5oZWlnaHQpO1xuICAgICAgdmFyIHR5cGUgPSBrZXlTaGFwZS5nZXQoJ3R5cGUnKTtcblxuICAgICAgaWYgKHR5cGUgPT09ICdjaXJjbGUnKSB7XG4gICAgICAgIGJib3gud2lkdGggPSBjYWNoZVNpemUuciAqIDI7XG4gICAgICAgIGJib3guaGVpZ2h0ID0gY2FjaGVTaXplLnIgKiAyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYmJveC53aWR0aCA9IGNhY2hlU2l6ZS53aWR0aDtcbiAgICAgICAgYmJveC5oZWlnaHQgPSBjYWNoZVNpemUuaGVpZ2h0O1xuICAgICAgfVxuXG4gICAgICBiYm94Lm1pblggPSBiYm94LmNlbnRlclggLSBiYm94LndpZHRoIC8gMjtcbiAgICAgIGJib3gubWluWSA9IGJib3guY2VudGVyWSAtIGJib3guaGVpZ2h0IC8gMjtcbiAgICAgIGJib3gubWF4WCA9IGJib3guY2VudGVyWCArIGJib3gud2lkdGggLyAyO1xuICAgICAgYmJveC5tYXhZID0gYmJveC5jZW50ZXJZICsgYmJveC5oZWlnaHQgLyAyO1xuICAgIH0gZWxzZSB7XG4gICAgICBiYm94LndpZHRoID0gYmJveC5tYXhYIC0gYmJveC5taW5YO1xuICAgICAgYmJveC5oZWlnaHQgPSBiYm94Lm1heFkgLSBiYm94Lm1pblk7XG4gICAgICBiYm94LmNlbnRlclggPSAoYmJveC5taW5YICsgYmJveC5tYXhYKSAvIDI7XG4gICAgICBiYm94LmNlbnRlclkgPSAoYmJveC5taW5ZICsgYmJveC5tYXhZKSAvIDI7XG4gICAgfVxuXG4gICAgYmJveC54ID0gYmJveC5taW5YO1xuICAgIGJib3gueSA9IGJib3gubWluWTtcbiAgICBpZiAoYmJveC54ICE9PSBvcmlYIHx8IGJib3gueSAhPT0gb3JpWSkgdGhpcy5zZXQoQ0FDSEVfQU5DSE9SX1BPSU5UUywgbnVsbCk7XG4gICAgcmV0dXJuIGJib3g7XG4gIH07XG4gIC8qKlxuICAgKiDojrflj5YgQ29tYm8g5Lit5omA5pyJ55qE5a2Q5YWD57Sg77yM5YyF5ousIENvbWJv44CBTm9kZSDlj4ogRWRnZVxuICAgKi9cblxuXG4gIENvbWJvLnByb3RvdHlwZS5nZXRDaGlsZHJlbiA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5vZGVzOiBzZWxmLmdldE5vZGVzKCksXG4gICAgICBjb21ib3M6IHNlbGYuZ2V0Q29tYm9zKClcbiAgICB9O1xuICB9O1xuICAvKipcbiAgICog6I635Y+WIENvbWJvIOS4reaJgOacieWtkOiKgueCuVxuICAgKi9cblxuXG4gIENvbWJvLnByb3RvdHlwZS5nZXROb2RlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgcmV0dXJuIHNlbGYuZ2V0KCdub2RlcycpO1xuICB9O1xuICAvKipcbiAgICog6I635Y+WIENvbWJvIOS4reaJgOacieWtkCBjb21ib1xuICAgKi9cblxuXG4gIENvbWJvLnByb3RvdHlwZS5nZXRDb21ib3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHJldHVybiBzZWxmLmdldCgnY29tYm9zJyk7XG4gIH07XG4gIC8qKlxuICAgKiDlkJEgQ29tYm8g5Lit5aKe5Yqg5a2QIGNvbWJvIOaIliBub2RlXG4gICAqIEBwYXJhbSBpdGVtIENvbWJvIOaIluiKgueCueWunuS+i1xuICAgKiBAcmV0dXJuIGJvb2xlYW4g5re75Yqg5oiQ5Yqf6L+U5ZueIHRydWXvvIzlkKbliJnov5Tlm54gZmFsc2VcbiAgICovXG5cblxuICBDb21iby5wcm90b3R5cGUuYWRkQ2hpbGQgPSBmdW5jdGlvbiAoaXRlbSkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgaXRlbVR5cGUgPSBpdGVtLmdldFR5cGUoKTtcblxuICAgIHN3aXRjaCAoaXRlbVR5cGUpIHtcbiAgICAgIGNhc2UgJ25vZGUnOlxuICAgICAgICBzZWxmLmFkZE5vZGUoaXRlbSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdjb21ibyc6XG4gICAgICAgIHNlbGYuYWRkQ29tYm8oaXRlbSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBjb25zb2xlLndhcm4oJ09ubHkgbm9kZSBvciBjb21ibyBpdGVtcyBhcmUgYWxsb3dlZCB0byBiZSBhZGRlZCBpbnRvIGEgY29tYm8nKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9O1xuICAvKipcbiAgICog5ZCRIENvbWJvIOS4reWinuWKoCBjb21ib1xuICAgKiBAcGFyYW0gY29tYm8gQ29tYm8g5a6e5L6LXG4gICAqIEByZXR1cm4gYm9vbGVhbiDmt7vliqDmiJDlip/ov5Tlm54gdHJ1Ze+8jOWQpuWImei/lOWbniBmYWxzZVxuICAgKi9cblxuXG4gIENvbWJvLnByb3RvdHlwZS5hZGRDb21ibyA9IGZ1bmN0aW9uIChjb21ibykge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBzZWxmLmdldCgnY29tYm9zJykucHVzaChjb21ibyk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG4gIC8qKlxuICAgKiDlkJEgQ29tYm8g5Lit5re75Yqg6IqC54K5XG4gICAqIEBwYXJhbSBub2RlIOiKgueCueWunuS+i1xuICAgKiBAcmV0dXJuIGJvb2xlYW4g5re75Yqg5oiQ5Yqf6L+U5ZueIHRydWXvvIzlkKbliJnov5Tlm54gZmFsc2VcbiAgICovXG5cblxuICBDb21iby5wcm90b3R5cGUuYWRkTm9kZSA9IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHNlbGYuZ2V0KCdub2RlcycpLnB1c2gobm9kZSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG4gIC8qKlxuICAgKiDlkJEgQ29tYm8g5Lit5aKe5Yqg5a2QIGNvbWJvIOaIliBub2RlXG4gICAqIEBwYXJhbSBpdGVtIENvbWJvIOaIluiKgueCueWunuS+i1xuICAgKiBAcmV0dXJuIGJvb2xlYW4g5re75Yqg5oiQ5Yqf6L+U5ZueIHRydWXvvIzlkKbliJnov5Tlm54gZmFsc2VcbiAgICovXG5cblxuICBDb21iby5wcm90b3R5cGUucmVtb3ZlQ2hpbGQgPSBmdW5jdGlvbiAoaXRlbSkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgaXRlbVR5cGUgPSBpdGVtLmdldFR5cGUoKTtcblxuICAgIHN3aXRjaCAoaXRlbVR5cGUpIHtcbiAgICAgIGNhc2UgJ25vZGUnOlxuICAgICAgICBzZWxmLnJlbW92ZU5vZGUoaXRlbSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdjb21ibyc6XG4gICAgICAgIHNlbGYucmVtb3ZlQ29tYm8oaXRlbSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBjb25zb2xlLndhcm4oJ09ubHkgbm9kZSBvciBjb21ibyBpdGVtcyBhcmUgYWxsb3dlZCB0byBiZSBhZGRlZCBpbnRvIGEgY29tYm8nKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9O1xuICAvKipcbiAgICog5LuOIENvbWJvIOS4reenu+mZpOaMh+WumueahCBjb21ib1xuICAgKiBAcGFyYW0gY29tYm8gQ29tYm8g5a6e5L6LXG4gICAqIEByZXR1cm4gYm9vbGVhbiDnp7vpmaTmiJDlip/ov5Tlm54gdHJ1Ze+8jOWQpuWImei/lOWbniBmYWxzZVxuICAgKi9cblxuXG4gIENvbWJvLnByb3RvdHlwZS5yZW1vdmVDb21ibyA9IGZ1bmN0aW9uIChjb21ibykge1xuICAgIGlmICghY29tYm8pIHJldHVybjtcbiAgICB2YXIgY29tYm9zID0gdGhpcy5nZXRDb21ib3MoKTtcbiAgICB2YXIgaW5kZXggPSBjb21ib3MuaW5kZXhPZihjb21ibyk7XG5cbiAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgY29tYm9zLnNwbGljZShpbmRleCwgMSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG4gIC8qKlxuICAgKiDlkJEgQ29tYm8g5Lit56e76Zmk5oyH5a6a55qE6IqC54K5XG4gICAqIEBwYXJhbSBub2RlIOiKgueCueWunuS+i1xuICAgKiBAcmV0dXJuIGJvb2xlYW4g56e76Zmk5oiQ5Yqf6L+U5ZueIHRydWXvvIzlkKbliJnov5Tlm54gZmFsc2VcbiAgICovXG5cblxuICBDb21iby5wcm90b3R5cGUucmVtb3ZlTm9kZSA9IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgaWYgKCFub2RlKSByZXR1cm47XG4gICAgdmFyIG5vZGVzID0gdGhpcy5nZXROb2RlcygpO1xuICAgIHZhciBpbmRleCA9IG5vZGVzLmluZGV4T2Yobm9kZSk7XG5cbiAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgbm9kZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICBDb21iby5wcm90b3R5cGUuZ2V0VXBkYXRlVHlwZSA9IGZ1bmN0aW9uIChjZmcpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9O1xuICAvKipcbiAgICog6I635Y+WIGl0ZW0g55qE5YyF5Zu055uS77yM6L+Z5Liq5YyF5Zu055uS5piv55u45a+55LqOIGl0ZW0g6Ieq5bex77yM5LiN5Lya5bCGIG1hdHJpeCDorqHnrpflnKjlhoVcbiAgICogQHJldHVybiB7T2JqZWN0fSDljIXlkKsgeCx5LHdpZHRoLGhlaWdodCwgY2VudGVyWCwgY2VudGVyWVxuICAgKi9cblxuXG4gIENvbWJvLnByb3RvdHlwZS5nZXRCQm94ID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuc2V0KENBQ0hFX0NBTlZBU19CQk9YLCBudWxsKTtcbiAgICB2YXIgYmJveCA9IHRoaXMuY2FsY3VsYXRlQ2FudmFzQkJveCgpO1xuICAgIHJldHVybiBiYm94O1xuICB9O1xuXG4gIENvbWJvLnByb3RvdHlwZS5jbGVhckNhY2hlID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuc2V0KENBQ0hFX0JCT1gsIG51bGwpOyAvLyDmuIXnkIbnvJPlrZjnmoQgYmJveFxuXG4gICAgdGhpcy5zZXQoQ0FDSEVfQ0FOVkFTX0JCT1gsIG51bGwpO1xuICAgIHRoaXMuc2V0KENBQ0hFX0FOQ0hPUl9QT0lOVFMsIG51bGwpO1xuICB9O1xuXG4gIENvbWJvLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuICAgIGlmICghdGhpcy5kZXN0cm95ZWQpIHtcbiAgICAgIHZhciBhbmltYXRlID0gdGhpcy5nZXQoJ2FuaW1hdGUnKTtcbiAgICAgIHZhciBncm91cCA9IHRoaXMuZ2V0KCdncm91cCcpO1xuXG4gICAgICBpZiAoYW5pbWF0ZSkge1xuICAgICAgICBncm91cC5zdG9wQW5pbWF0ZSgpO1xuICAgICAgfVxuXG4gICAgICBncm91cFsnc2hhcGVNYXAnXSA9IHt9O1xuICAgICAgdGhpcy5jbGVhckNhY2hlKCk7XG4gICAgICB0aGlzLnNldChDQUNIRV9TSVpFLCBudWxsKTtcbiAgICAgIHRoaXMuc2V0KCdiYm94JywgbnVsbCk7XG4gICAgICBncm91cC5yZW1vdmUoKTtcbiAgICAgIHRoaXMuX2NmZyA9IG51bGw7XG4gICAgICB0aGlzLmRlc3Ryb3llZCA9IHRydWU7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBDb21ibztcbn0oTm9kZSk7XG5cbmV4cG9ydCBkZWZhdWx0IENvbWJvOyIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBjbG9uZSwgZGVlcE1peCwgZWFjaCwgaXNBcnJheSwgaXNPYmplY3QsIGlzU3RyaW5nLCB1cHBlckZpcnN0LCB0aHJvdHRsZSB9IGZyb20gJ0BhbnR2L3V0aWwnO1xuaW1wb3J0IEVkZ2UgZnJvbSAnLi4vLi4vaXRlbS9lZGdlJztcbmltcG9ydCBOb2RlIGZyb20gJy4uLy4uL2l0ZW0vbm9kZSc7XG5pbXBvcnQgQ29tYm8gZnJvbSAnLi4vLi4vaXRlbS9jb21ibyc7XG5pbXBvcnQgeyB0cmF2ZXJzZVRyZWVVcCwgdHJhdmVyc2VUcmVlLCBnZXRDb21ib0JCb3ggfSBmcm9tICcuLi8uLi91dGlsL2dyYXBoaWMnO1xudmFyIE5PREUgPSAnbm9kZSc7XG52YXIgRURHRSA9ICdlZGdlJztcbnZhciBWRURHRSA9ICd2ZWRnZSc7XG52YXIgQ09NQk8gPSAnY29tYm8nO1xudmFyIENGR19QUkVGSVggPSAnZGVmYXVsdCc7XG52YXIgTUFQUEVSX1NVRkZJWCA9ICdNYXBwZXInO1xudmFyIFNUQVRFX1NVRkZJWCA9ICdzdGF0ZVN0eWxlcyc7XG5cbnZhciBJdGVtQ29udHJvbGxlciA9XG4vKiogQGNsYXNzICovXG5mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEl0ZW1Db250cm9sbGVyKGdyYXBoKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHRoaXMuZWRnZVRvQmVVcGRhdGVNYXAgPSB7fTtcbiAgICAvKipcbiAgICAgKiDmm7TmlrDovrnpmZDmtYHvvIzlkIzml7blj6/ku6XpmLLmraLnm7jlkIznmoTovrnpopHnuYHph43lpI3mm7TmlrBcbiAgICAgKiAqL1xuXG4gICAgdGhpcy50aHJvdHRsZVJlZnJlc2ggPSB0aHJvdHRsZShmdW5jdGlvbiAoXykge1xuICAgICAgdmFyIF9hO1xuXG4gICAgICB2YXIgZ3JhcGggPSBfdGhpcy5ncmFwaDtcbiAgICAgIGlmICghZ3JhcGggfHwgZ3JhcGguZ2V0KCdkZXN0cm95ZWQnKSkgcmV0dXJuO1xuICAgICAgdmFyIGVkZ2VUb0JlVXBkYXRlTWFwID0gX3RoaXMuZWRnZVRvQmVVcGRhdGVNYXA7XG4gICAgICBpZiAoIWVkZ2VUb0JlVXBkYXRlTWFwIHx8ICEoKF9hID0gT2JqZWN0LmtleXMoZWRnZVRvQmVVcGRhdGVNYXApKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EubGVuZ3RoKSkgcmV0dXJuO1xuICAgICAgT2JqZWN0LmtleXMoZWRnZVRvQmVVcGRhdGVNYXApLmZvckVhY2goZnVuY3Rpb24gKGVpZCkge1xuICAgICAgICB2YXIgZWRnZSA9IGVkZ2VUb0JlVXBkYXRlTWFwW2VpZF0uZWRnZTtcbiAgICAgICAgaWYgKCFlZGdlIHx8IGVkZ2UuZGVzdHJveWVkKSByZXR1cm47XG4gICAgICAgIGVkZ2UucmVmcmVzaChlZGdlVG9CZVVwZGF0ZU1hcFtlaWRdLnVwZGF0ZVR5cGUpO1xuICAgICAgfSk7XG4gICAgICBfdGhpcy5lZGdlVG9CZVVwZGF0ZU1hcCA9IHt9O1xuICAgIH0sIDE2LCB7XG4gICAgICB0cmFpbGluZzogdHJ1ZSxcbiAgICAgIGxlYWRpbmc6IHRydWVcbiAgICB9KTtcbiAgICB0aGlzLmdyYXBoID0gZ3JhcGg7XG4gICAgdGhpcy5kZXN0cm95ZWQgPSBmYWxzZTtcbiAgfVxuICAvKipcbiAgICog5aKe5YqgIEl0ZW0g5a6e5L6LXG4gICAqXG4gICAqIEBwYXJhbSB7SVRFTV9UWVBFfSB0eXBlIOWunuS+i+exu+Wei++8jG5vZGUg5oiWIGVkZ2VcbiAgICogQHBhcmFtIHsoTm9kZUNvbmZpZyAmIEVkZ2VDb25maWcpfSBtb2RlbCDmlbDmja7mqKHlnotcbiAgICogQHJldHVybnMgeyhJdGVtKX1cbiAgICogQG1lbWJlcm9mIEl0ZW1Db250cm9sbGVyXG4gICAqL1xuXG5cbiAgSXRlbUNvbnRyb2xsZXIucHJvdG90eXBlLmFkZEl0ZW0gPSBmdW5jdGlvbiAodHlwZSwgbW9kZWwpIHtcbiAgICB2YXIgZ3JhcGggPSB0aGlzLmdyYXBoO1xuICAgIHZhciB2VHlwZSA9IHR5cGUgPT09IFZFREdFID8gRURHRSA6IHR5cGU7XG4gICAgdmFyIHBhcmVudCA9IGdyYXBoLmdldCh2VHlwZSArIFwiR3JvdXBcIikgfHwgZ3JhcGguZ2V0KCdncm91cCcpO1xuICAgIHZhciB1cHBlclR5cGUgPSB1cHBlckZpcnN0KHZUeXBlKTtcbiAgICB2YXIgaXRlbSA9IG51bGw7IC8vIOiOt+WPliB0aGlzLmdldCgnc3R5bGVzJykg5Lit55qE5YC8XG5cbiAgICB2YXIgc3R5bGVzID0gZ3JhcGguZ2V0KHZUeXBlICsgdXBwZXJGaXJzdChTVEFURV9TVUZGSVgpKSB8fCB7fTtcbiAgICB2YXIgZGVmYXVsdE1vZGVsID0gZ3JhcGguZ2V0KENGR19QUkVGSVggKyB1cHBlclR5cGUpO1xuXG4gICAgaWYgKG1vZGVsW1NUQVRFX1NVRkZJWF0pIHtcbiAgICAgIC8vIOiuvue9riB0aGlzLmdldCgnc3R5bGVzJykg5Lit55qE5YC8XG4gICAgICBzdHlsZXMgPSBtb2RlbFtTVEFURV9TVUZGSVhdO1xuICAgIH1cblxuICAgIGlmIChkZWZhdWx0TW9kZWwpIHtcbiAgICAgIC8vIOW+iOWkmuW4g+WxgOS8muebtOaOpeS/ruaUueWOn+aVsOaNruaooeWei++8jOaJgOS7peS4jeiDveeUqCBtZXJnZSDnmoTlvaLlvI/vvIzpgJDkuKrlhpnlhaXljp8gbW9kZWwg5LitXG4gICAgICBlYWNoKGRlZmF1bHRNb2RlbCwgZnVuY3Rpb24gKHZhbCwgY2ZnKSB7XG4gICAgICAgIGlmIChpc09iamVjdCh2YWwpICYmICFpc0FycmF5KHZhbCkpIHtcbiAgICAgICAgICBtb2RlbFtjZmddID0gZGVlcE1peCh7fSwgdmFsLCBtb2RlbFtjZmddKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc0FycmF5KHZhbCkpIHtcbiAgICAgICAgICBtb2RlbFtjZmddID0gbW9kZWxbY2ZnXSB8fCBjbG9uZShkZWZhdWx0TW9kZWxbY2ZnXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbW9kZWxbY2ZnXSA9IG1vZGVsW2NmZ10gfHwgZGVmYXVsdE1vZGVsW2NmZ107XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHZhciBtYXBwZXIgPSBncmFwaC5nZXQodlR5cGUgKyBNQVBQRVJfU1VGRklYKTtcblxuICAgIGlmIChtYXBwZXIpIHtcbiAgICAgIHZhciBtYXBwZWRNb2RlbF8xID0gbWFwcGVyKG1vZGVsKTtcblxuICAgICAgaWYgKG1hcHBlZE1vZGVsXzFbU1RBVEVfU1VGRklYXSkge1xuICAgICAgICAvLyDorr7nva4gdGhpcy5nZXQoJ3N0eWxlcycpIOS4reeahOWAvFxuICAgICAgICBzdHlsZXMgPSBtYXBwZWRNb2RlbF8xW1NUQVRFX1NVRkZJWF07XG4gICAgICAgIGRlbGV0ZSBtYXBwZWRNb2RlbF8xW1NUQVRFX1NVRkZJWF07XG4gICAgICB9IC8vIOWmguaenOmFjee9ruS6hiBkZWZhdWx0RWRnZSDmiJYgZGVmYXVsdE5vZGXvvIzliJnlsIbpu5jorqTphY3nva7nmoTmlbDmja7kuZ/lkIjlubbov5vljrtcblxuXG4gICAgICBlYWNoKG1hcHBlZE1vZGVsXzEsIGZ1bmN0aW9uICh2YWwsIGNmZykge1xuICAgICAgICBpZiAoaXNPYmplY3QodmFsKSAmJiAhaXNBcnJheSh2YWwpKSB7XG4gICAgICAgICAgbW9kZWxbY2ZnXSA9IGRlZXBNaXgoe30sIG1vZGVsW2NmZ10sIHZhbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbW9kZWxbY2ZnXSA9IG1hcHBlZE1vZGVsXzFbY2ZnXSB8fCBtb2RlbFtjZmddO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBncmFwaC5lbWl0KCdiZWZvcmVhZGRpdGVtJywge1xuICAgICAgdHlwZTogdHlwZSxcbiAgICAgIG1vZGVsOiBtb2RlbFxuICAgIH0pO1xuXG4gICAgaWYgKHR5cGUgPT09IEVER0UgfHwgdHlwZSA9PT0gVkVER0UpIHtcbiAgICAgIHZhciBzb3VyY2UgPSB2b2lkIDA7XG4gICAgICB2YXIgdGFyZ2V0ID0gdm9pZCAwO1xuICAgICAgc291cmNlID0gbW9kZWwuc291cmNlOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHByZWZlci1kZXN0cnVjdHVyaW5nXG5cbiAgICAgIHRhcmdldCA9IG1vZGVsLnRhcmdldDsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBwcmVmZXItZGVzdHJ1Y3R1cmluZ1xuXG4gICAgICBpZiAoc291cmNlICYmIGlzU3RyaW5nKHNvdXJjZSkpIHtcbiAgICAgICAgc291cmNlID0gZ3JhcGguZmluZEJ5SWQoc291cmNlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRhcmdldCAmJiBpc1N0cmluZyh0YXJnZXQpKSB7XG4gICAgICAgIHRhcmdldCA9IGdyYXBoLmZpbmRCeUlkKHRhcmdldCk7XG4gICAgICB9XG5cbiAgICAgIGlmICghc291cmNlIHx8ICF0YXJnZXQpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFwiVGhlIHNvdXJjZSBvciB0YXJnZXQgbm9kZSBvZiBlZGdlIFwiICsgbW9kZWwuaWQgKyBcIiBkb2VzIG5vdCBleGlzdCFcIik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHNvdXJjZS5nZXRUeXBlICYmIHNvdXJjZS5nZXRUeXBlKCkgPT09ICdjb21ibycpIHtcbiAgICAgICAgbW9kZWwuaXNDb21ib0VkZ2UgPSB0cnVlOyAvLyBncmFwaC51cGRhdGVDb21ibyhzb3VyY2UgYXMgSUNvbWJvKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRhcmdldC5nZXRUeXBlICYmIHRhcmdldC5nZXRUeXBlKCkgPT09ICdjb21ibycpIHtcbiAgICAgICAgbW9kZWwuaXNDb21ib0VkZ2UgPSB0cnVlOyAvLyBncmFwaC51cGRhdGVDb21ibyh0YXJnZXQgYXMgSUNvbWJvKTtcbiAgICAgIH1cblxuICAgICAgaXRlbSA9IG5ldyBFZGdlKHtcbiAgICAgICAgbW9kZWw6IG1vZGVsLFxuICAgICAgICBzb3VyY2U6IHNvdXJjZSxcbiAgICAgICAgdGFyZ2V0OiB0YXJnZXQsXG4gICAgICAgIHN0eWxlczogc3R5bGVzLFxuICAgICAgICBsaW5rQ2VudGVyOiBncmFwaC5nZXQoJ2xpbmtDZW50ZXInKSxcbiAgICAgICAgZ3JvdXA6IHBhcmVudC5hZGRHcm91cCgpXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09IE5PREUpIHtcbiAgICAgIGl0ZW0gPSBuZXcgTm9kZSh7XG4gICAgICAgIG1vZGVsOiBtb2RlbCxcbiAgICAgICAgc3R5bGVzOiBzdHlsZXMsXG4gICAgICAgIGdyb3VwOiBwYXJlbnQuYWRkR3JvdXAoKVxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSBDT01CTykge1xuICAgICAgdmFyIGNoaWxkcmVuID0gbW9kZWwuY2hpbGRyZW47XG4gICAgICB2YXIgY29tYm9CQm94ID0gZ2V0Q29tYm9CQm94KGNoaWxkcmVuLCBncmFwaCk7XG4gICAgICBpZiAoIWlzTmFOKGNvbWJvQkJveC54KSkgbW9kZWwueCA9IGNvbWJvQkJveC54O2Vsc2UgaWYgKGlzTmFOKG1vZGVsLngpKSBtb2RlbC54ID0gTWF0aC5yYW5kb20oKSAqIDEwMDtcbiAgICAgIGlmICghaXNOYU4oY29tYm9CQm94LnkpKSBtb2RlbC55ID0gY29tYm9CQm94Lnk7ZWxzZSBpZiAoaXNOYU4obW9kZWwueSkpIG1vZGVsLnkgPSBNYXRoLnJhbmRvbSgpICogMTAwO1xuICAgICAgdmFyIGNvbWJvR3JvdXAgPSBwYXJlbnQuYWRkR3JvdXAoKTtcbiAgICAgIGNvbWJvR3JvdXAuc2V0WkluZGV4KG1vZGVsLmRlcHRoKTtcbiAgICAgIGl0ZW0gPSBuZXcgQ29tYm8oe1xuICAgICAgICBtb2RlbDogbW9kZWwsXG4gICAgICAgIHN0eWxlczogc3R5bGVzLFxuICAgICAgICBiYm94OiBtb2RlbC5jb2xsYXBzZWQgPyBnZXRDb21ib0JCb3goW10sIGdyYXBoKSA6IGNvbWJvQkJveCxcbiAgICAgICAgZ3JvdXA6IGNvbWJvR3JvdXBcbiAgICAgIH0pO1xuICAgICAgdmFyIGNvbWJvTW9kZWxfMSA9IGl0ZW0uZ2V0TW9kZWwoKTtcbiAgICAgIChjaGlsZHJlbiB8fCBbXSkuZm9yRWFjaChmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgdmFyIGNoaWxkSXRlbSA9IGdyYXBoLmZpbmRCeUlkKGNoaWxkLmlkKTtcbiAgICAgICAgaXRlbS5hZGRDaGlsZChjaGlsZEl0ZW0pO1xuICAgICAgICBjaGlsZC5kZXB0aCA9IGNvbWJvTW9kZWxfMS5kZXB0aCArIDI7XG4gICAgICB9KTsgLy8gY29sbGFwc2UgdGhlIGNvbWJvIGlmIHRoZSBjb2xsYXBzZWQgaXMgdHJ1ZSBpbiB0aGUgbW9kZWxcblxuICAgICAgaWYgKG1vZGVsLmNvbGxhcHNlZCkge1xuICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAoIWl0ZW0uZGVzdHJveWVkKSB7XG4gICAgICAgICAgICBncmFwaC5jb2xsYXBzZUNvbWJvKGl0ZW0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgMCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGl0ZW0pIHtcbiAgICAgIGdyYXBoLmdldCh0eXBlICsgXCJzXCIpLnB1c2goaXRlbSk7XG4gICAgICBncmFwaC5nZXQoJ2l0ZW1NYXAnKVtpdGVtLmdldCgnaWQnKV0gPSBpdGVtO1xuICAgICAgZ3JhcGguZW1pdCgnYWZ0ZXJhZGRpdGVtJywge1xuICAgICAgICBpdGVtOiBpdGVtLFxuICAgICAgICBtb2RlbDogbW9kZWxcbiAgICAgIH0pOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29uc2lzdGVudC1yZXR1cm5cblxuICAgICAgcmV0dXJuIGl0ZW07XG4gICAgfVxuICB9O1xuICAvKipcbiAgICog5pu05paw6IqC54K55oiW6L65XG4gICAqXG4gICAqIEBwYXJhbSB7SXRlbX0gaXRlbSBJRCDmiJYg5a6e5L6LXG4gICAqIEBwYXJhbSB7KEVkZ2VDb25maWcgfCBQYXJ0aWFsPE5vZGVDb25maWc+KX0gY2ZnIOaVsOaNruaooeWei1xuICAgKiBAcmV0dXJuc1xuICAgKiBAbWVtYmVyb2YgSXRlbUNvbnRyb2xsZXJcbiAgICovXG5cblxuICBJdGVtQ29udHJvbGxlci5wcm90b3R5cGUudXBkYXRlSXRlbSA9IGZ1bmN0aW9uIChpdGVtLCBjZmcpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdmFyIF9hLCBfYjtcblxuICAgIHZhciBncmFwaCA9IHRoaXMuZ3JhcGg7XG5cbiAgICBpZiAoaXNTdHJpbmcoaXRlbSkpIHtcbiAgICAgIGl0ZW0gPSBncmFwaC5maW5kQnlJZChpdGVtKTtcbiAgICB9XG5cbiAgICBpZiAoIWl0ZW0gfHwgaXRlbS5kZXN0cm95ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIOabtOaWsOeahCBpdGVtIOeahOexu+Wei1xuXG5cbiAgICB2YXIgdHlwZSA9ICcnO1xuICAgIGlmIChpdGVtLmdldFR5cGUpIHR5cGUgPSBpdGVtLmdldFR5cGUoKTtcbiAgICB2YXIgbWFwcGVyID0gZ3JhcGguZ2V0KHR5cGUgKyBNQVBQRVJfU1VGRklYKTtcbiAgICB2YXIgbW9kZWwgPSBpdGVtLmdldE1vZGVsKCk7XG4gICAgdmFyIHVwZGF0ZVR5cGUgPSBpdGVtLmdldFVwZGF0ZVR5cGUoY2ZnKTtcblxuICAgIGlmIChtYXBwZXIpIHtcbiAgICAgIHZhciByZXN1bHQgPSBkZWVwTWl4KHt9LCBtb2RlbCwgY2ZnKTtcbiAgICAgIHZhciBtYXBwZWRNb2RlbCA9IG1hcHBlcihyZXN1bHQpOyAvLyDlsIYgdXBkYXRlIOaXtuWAmeeUqOaIt+S8oOWFpeeahOWPguaVsOS4jm1hcHBlck1vZGVs5YGaZGVlcE1peO+8jOS7peS+v+WkjeeUqOS5i+WJjeiuvue9rueahOWPguaVsOWAvFxuXG4gICAgICB2YXIgbmV3TW9kZWwgPSBkZWVwTWl4KHt9LCBtb2RlbCwgbWFwcGVkTW9kZWwsIGNmZyk7XG5cbiAgICAgIGlmIChtYXBwZWRNb2RlbFtTVEFURV9TVUZGSVhdKSB7XG4gICAgICAgIGl0ZW0uc2V0KCdzdHlsZXMnLCBuZXdNb2RlbFtTVEFURV9TVUZGSVhdKTtcbiAgICAgICAgZGVsZXRlIG5ld01vZGVsW1NUQVRFX1NVRkZJWF07XG4gICAgICB9XG5cbiAgICAgIGVhY2gobmV3TW9kZWwsIGZ1bmN0aW9uICh2YWwsIGtleSkge1xuICAgICAgICBjZmdba2V5XSA9IHZhbDtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBtZXJnZSB1cGRhdGXkvKDov5vmnaXnmoTlr7nosaHlj4LmlbDvvIxtb2RlbOS4reayoeacieeahOaVsOaNruS4jeWBmuWkhOeQhu+8jOWvueixoeWSjOWtl+espuS4suWAvOS5n+S4jeWBmuWkhOeQhu+8jOebtOaOpeabv+aNouWOn+adpeeahFxuICAgICAgZWFjaChjZmcsIGZ1bmN0aW9uICh2YWwsIGtleSkge1xuICAgICAgICBpZiAobW9kZWxba2V5XSkge1xuICAgICAgICAgIGlmIChpc09iamVjdCh2YWwpICYmICFpc0FycmF5KHZhbCkpIHtcbiAgICAgICAgICAgIGNmZ1trZXldID0gX19hc3NpZ24oX19hc3NpZ24oe30sIG1vZGVsW2tleV0pLCBjZmdba2V5XSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IC8vIGVtaXQgYmVmb3JldXBkYXRlaXRlbSDkuovku7ZcblxuXG4gICAgZ3JhcGguZW1pdCgnYmVmb3JldXBkYXRlaXRlbScsIHtcbiAgICAgIGl0ZW06IGl0ZW0sXG4gICAgICBjZmc6IGNmZ1xuICAgIH0pO1xuXG4gICAgaWYgKHR5cGUgPT09IEVER0UpIHtcbiAgICAgIC8vIOiLpeaYr+i+ueimgeabtOaWsHNvdXJjZSB8fCB0YXJnZXQsIOS4uuS6huS4jeW9seWTjeekuuS+i+WGhemDqG1vZGVs77yM5bm25LiU6YeN5paw6K6h566Xc3RhcnRQb2ludOWSjGVuZFBvaW5077yM5omL5Yqo6K6+572uXG4gICAgICBpZiAoY2ZnLnNvdXJjZSkge1xuICAgICAgICB2YXIgc291cmNlID0gY2ZnLnNvdXJjZTtcblxuICAgICAgICBpZiAoaXNTdHJpbmcoc291cmNlKSkge1xuICAgICAgICAgIHNvdXJjZSA9IGdyYXBoLmZpbmRCeUlkKHNvdXJjZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpdGVtLnNldFNvdXJjZShzb3VyY2UpO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2ZnLnRhcmdldCkge1xuICAgICAgICB2YXIgdGFyZ2V0ID0gY2ZnLnRhcmdldDtcblxuICAgICAgICBpZiAoaXNTdHJpbmcodGFyZ2V0KSkge1xuICAgICAgICAgIHRhcmdldCA9IGdyYXBoLmZpbmRCeUlkKHRhcmdldCk7XG4gICAgICAgIH1cblxuICAgICAgICBpdGVtLnNldFRhcmdldCh0YXJnZXQpO1xuICAgICAgfVxuXG4gICAgICBpdGVtLnVwZGF0ZShjZmcpO1xuICAgIH0gLy8gaXRlbS51cGRhdGUoY2ZnKTtcblxuXG4gICAgaWYgKHR5cGUgPT09IE5PREUgfHwgdHlwZSA9PT0gQ09NQk8pIHtcbiAgICAgIGl0ZW0udXBkYXRlKGNmZywgdXBkYXRlVHlwZSk7XG4gICAgICB2YXIgZWRnZXNfMSA9IGl0ZW0uZ2V0RWRnZXMoKTtcbiAgICAgIHZhciByZWZyZXNoRWRnZSA9ICh1cGRhdGVUeXBlID09PSBudWxsIHx8IHVwZGF0ZVR5cGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHVwZGF0ZVR5cGUuaW5jbHVkZXMoJ2Jib3gnKSkgfHwgdXBkYXRlVHlwZSA9PT0gJ21vdmUnO1xuXG4gICAgICBpZiAodHlwZSA9PT0gTk9ERSkge1xuICAgICAgICBpZiAodXBkYXRlVHlwZSA9PT0gJ21vdmUnKSB7XG4gICAgICAgICAgZWFjaChlZGdlc18xLCBmdW5jdGlvbiAoZWRnZSkge1xuICAgICAgICAgICAgX3RoaXMuZWRnZVRvQmVVcGRhdGVNYXBbZWRnZS5nZXRJRCgpXSA9IHtcbiAgICAgICAgICAgICAgZWRnZTogZWRnZSxcbiAgICAgICAgICAgICAgdXBkYXRlVHlwZTogdXBkYXRlVHlwZVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgX3RoaXMudGhyb3R0bGVSZWZyZXNoKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAocmVmcmVzaEVkZ2UpIHtcbiAgICAgICAgICBlYWNoKGVkZ2VzXzEsIGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgICAgICAgICBlZGdlLnJlZnJlc2godXBkYXRlVHlwZSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAocmVmcmVzaEVkZ2UgJiYgdHlwZSA9PT0gQ09NQk8pIHtcbiAgICAgICAgdmFyIHNoYXBlRmFjdG9yeSA9IGl0ZW0uZ2V0KCdzaGFwZUZhY3RvcnknKTtcbiAgICAgICAgdmFyIHNoYXBlVHlwZSA9IG1vZGVsLnR5cGUgfHwgJ2NpcmNsZSc7XG4gICAgICAgIHZhciBjb21ib0FuaW1hdGUgPSBtb2RlbC5hbmltYXRlID09PSB1bmRlZmluZWQgfHwgY2ZnLmFuaW1hdGUgPT09IHVuZGVmaW5lZCA/IChfYiA9IChfYSA9IHNoYXBlRmFjdG9yeVtzaGFwZVR5cGVdKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Eub3B0aW9ucykgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmFuaW1hdGUgOiBtb2RlbC5hbmltYXRlIHx8IGNmZy5hbmltYXRlO1xuXG4gICAgICAgIGlmIChjb21ib0FuaW1hdGUpIHtcbiAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICghaXRlbSB8fCBpdGVtLmRlc3Ryb3llZCkgcmV0dXJuO1xuICAgICAgICAgICAgdmFyIGtleVNoYXBlID0gaXRlbS5nZXRLZXlTaGFwZSgpO1xuICAgICAgICAgICAgaWYgKCFrZXlTaGFwZSB8fCBrZXlTaGFwZS5kZXN0cm95ZWQpIHJldHVybjtcbiAgICAgICAgICAgIGVhY2goZWRnZXNfMSwgZnVuY3Rpb24gKGVkZ2UpIHtcbiAgICAgICAgICAgICAgaWYgKGVkZ2UgJiYgIWVkZ2UuZGVzdHJveWVkKSBlZGdlLnJlZnJlc2goKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0sIDIwMSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZWFjaChlZGdlc18xLCBmdW5jdGlvbiAoZWRnZSkge1xuICAgICAgICAgICAgZWRnZS5yZWZyZXNoKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBncmFwaC5lbWl0KCdhZnRlcnVwZGF0ZWl0ZW0nLCB7XG4gICAgICBpdGVtOiBpdGVtLFxuICAgICAgY2ZnOiBjZmdcbiAgICB9KTtcbiAgfTtcbiAgLyoqXG4gICAqIOagueaNriBjb21ibyDnmoTlrZDlhYPntKDmm7TmlrAgY29tYm8g55qE5L2N572u5Y+K5aSn5bCPXG4gICAqXG4gICAqIEBwYXJhbSB7SUNvbWJvfSBjb21ibyBJRCDmiJYg5a6e5L6LXG4gICAqIEByZXR1cm5zXG4gICAqIEBtZW1iZXJvZiBJdGVtQ29udHJvbGxlclxuICAgKi9cblxuXG4gIEl0ZW1Db250cm9sbGVyLnByb3RvdHlwZS51cGRhdGVDb21ibyA9IGZ1bmN0aW9uIChjb21ibywgY2hpbGRyZW4pIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdmFyIF9hLCBfYjtcblxuICAgIHZhciBncmFwaCA9IHRoaXMuZ3JhcGg7XG5cbiAgICBpZiAoaXNTdHJpbmcoY29tYm8pKSB7XG4gICAgICBjb21ibyA9IGdyYXBoLmZpbmRCeUlkKGNvbWJvKTtcbiAgICB9XG5cbiAgICBpZiAoIWNvbWJvIHx8IGNvbWJvLmRlc3Ryb3llZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBtb2RlbCA9IGNvbWJvLmdldE1vZGVsKCk7XG4gICAgdmFyIGNvbWJvQkJveCA9IGdldENvbWJvQkJveChtb2RlbC5jb2xsYXBzZWQgPyBbXSA6IGNoaWxkcmVuLCBncmFwaCk7XG5cbiAgICB2YXIgX2MgPSBtb2RlbC5jb2xsYXBzZWQgPyBnZXRDb21ib0JCb3goY2hpbGRyZW4sIGdyYXBoKSA6IGNvbWJvQkJveCxcbiAgICAgICAgY29tYm9YID0gX2MueCxcbiAgICAgICAgY29tYm9ZID0gX2MueTtcblxuICAgIGNvbWJvLnNldCgnYmJveCcsIGNvbWJvQkJveCk7XG4gICAgY29tYm8udXBkYXRlKHtcbiAgICAgIHg6IGNvbWJvWCxcbiAgICAgIHk6IGNvbWJvWVxuICAgIH0pO1xuICAgIHZhciBzaGFwZUZhY3RvcnkgPSBjb21iby5nZXQoJ3NoYXBlRmFjdG9yeScpO1xuICAgIHZhciBzaGFwZVR5cGUgPSBtb2RlbC50eXBlIHx8ICdjaXJjbGUnO1xuICAgIHZhciBjb21ib0FuaW1hdGUgPSBtb2RlbC5hbmltYXRlID09PSB1bmRlZmluZWQgPyAoX2IgPSAoX2EgPSBzaGFwZUZhY3Rvcnlbc2hhcGVUeXBlXSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLm9wdGlvbnMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5hbmltYXRlIDogbW9kZWwuYW5pbWF0ZTtcblxuICAgIGlmIChjb21ib0FuaW1hdGUpIHtcbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIWNvbWJvIHx8IGNvbWJvLmRlc3Ryb3llZCkgcmV0dXJuO1xuICAgICAgICB2YXIga2V5U2hhcGUgPSBjb21iby5nZXRLZXlTaGFwZSgpO1xuICAgICAgICBpZiAoIWtleVNoYXBlIHx8IGtleVNoYXBlLmRlc3Ryb3llZCkgcmV0dXJuO1xuICAgICAgICBjb21iby5nZXRTaGFwZUNmZyhtb2RlbCk7IC8vIOabtOaWsCBjb21ibyDnvJPlrZjnmoQgc2l6ZVxuXG4gICAgICAgIF90aGlzLnVwZGF0ZUNvbWJvRWRnZXMoY29tYm8pO1xuICAgICAgfSwgMjAxKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy51cGRhdGVDb21ib0VkZ2VzKGNvbWJvKTtcbiAgICB9XG4gIH07XG5cbiAgSXRlbUNvbnRyb2xsZXIucHJvdG90eXBlLnVwZGF0ZUNvbWJvRWRnZXMgPSBmdW5jdGlvbiAoY29tYm8pIHtcbiAgICB2YXIgY29tYkVkZ2VzID0gY29tYm8uZ2V0RWRnZXMoKSB8fCBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29tYkVkZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWRnZSA9IGNvbWJFZGdlc1tpXTtcblxuICAgICAgaWYgKGVkZ2UgJiYgIWVkZ2UuZGVzdHJveWVkKSB7XG4gICAgICAgIHZhciBlZGdlU0YgPSBlZGdlLmdldCgnc2hhcGVGYWN0b3J5Jyk7XG4gICAgICAgIHZhciBlZGdlQ2ZnID0gZWRnZS5nZXRTaGFwZUNmZyhlZGdlLmdldE1vZGVsKCkpO1xuICAgICAgICB2YXIgZWRnZUdyb3VwID0gZWRnZS5nZXRDb250YWluZXIoKTtcbiAgICAgICAgZWRnZUdyb3VwLmNsZWFyKCk7XG4gICAgICAgIHZhciBrZXlTaGFwZSA9IGVkZ2VTRi5kcmF3KGVkZ2VDZmcudHlwZSwgZWRnZUNmZywgZWRnZUdyb3VwKTtcbiAgICAgICAgZWRnZS5zZXQoJ2tleVNoYXBlJywga2V5U2hhcGUpO1xuICAgICAgICBrZXlTaGFwZS5zZXQoJ2lzS2V5U2hhcGUnLCB0cnVlKTtcbiAgICAgICAga2V5U2hhcGUuc2V0KCdkcmFnZ2FibGUnLCB0cnVlKTtcbiAgICAgICAgZWRnZS5zZXRPcmlnaW5TdHlsZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgLyoqXG4gICAqIOaUtui1tyBjb21ib++8jOmakOiXj+ebuOWFs+WFg+e0oFxuICAgKi9cblxuXG4gIEl0ZW1Db250cm9sbGVyLnByb3RvdHlwZS5jb2xsYXBzZUNvbWJvID0gZnVuY3Rpb24gKGNvbWJvKSB7XG4gICAgdmFyIGdyYXBoID0gdGhpcy5ncmFwaDtcblxuICAgIGlmIChpc1N0cmluZyhjb21ibykpIHtcbiAgICAgIGNvbWJvID0gZ3JhcGguZmluZEJ5SWQoY29tYm8pO1xuICAgIH1cblxuICAgIHZhciBjaGlsZHJlbiA9IGNvbWJvLmdldENoaWxkcmVuKCk7XG4gICAgY2hpbGRyZW4ubm9kZXMuZm9yRWFjaChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgZ3JhcGguaGlkZUl0ZW0obm9kZSk7XG4gICAgfSk7XG4gICAgY2hpbGRyZW4uY29tYm9zLmZvckVhY2goZnVuY3Rpb24gKGMpIHtcbiAgICAgIGdyYXBoLmhpZGVJdGVtKGMpO1xuICAgIH0pO1xuICB9O1xuICAvKipcbiAgICog5bGV5byAIGNvbWJv77yM55u45YWz5YWD57Sg5Ye6546wXG4gICAqIOiLpeWtkCBjb21ibyDljp/lhYjmmK/mlLbotbfnirbmgIHvvIzliJnkv53mjIHlroPnmoTmlLbotbfnirbmgIFcbiAgICovXG5cblxuICBJdGVtQ29udHJvbGxlci5wcm90b3R5cGUuZXhwYW5kQ29tYm8gPSBmdW5jdGlvbiAoY29tYm8pIHtcbiAgICB2YXIgZ3JhcGggPSB0aGlzLmdyYXBoO1xuXG4gICAgaWYgKGlzU3RyaW5nKGNvbWJvKSkge1xuICAgICAgY29tYm8gPSBncmFwaC5maW5kQnlJZChjb21ibyk7XG4gICAgfVxuXG4gICAgdmFyIGNoaWxkcmVuID0gY29tYm8uZ2V0Q2hpbGRyZW4oKTtcbiAgICBjaGlsZHJlbi5ub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICBncmFwaC5zaG93SXRlbShub2RlKTtcbiAgICB9KTtcbiAgICBjaGlsZHJlbi5jb21ib3MuZm9yRWFjaChmdW5jdGlvbiAoYykge1xuICAgICAgaWYgKGMuZ2V0TW9kZWwoKS5jb2xsYXBzZWQpIHtcbiAgICAgICAgYy5zaG93KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBncmFwaC5zaG93SXRlbShjKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcbiAgLyoqXG4gICAqIOWIoOmZpOaMh+WumueahOiKgueCueaIlui+uVxuICAgKlxuICAgKiBAcGFyYW0ge0l0ZW19IGl0ZW0gaXRlbSBJRCDmiJblrp7kvotcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqIEBtZW1iZXJvZiBJdGVtQ29udHJvbGxlclxuICAgKi9cblxuXG4gIEl0ZW1Db250cm9sbGVyLnByb3RvdHlwZS5yZW1vdmVJdGVtID0gZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdmFyIGdyYXBoID0gdGhpcy5ncmFwaDtcblxuICAgIGlmIChpc1N0cmluZyhpdGVtKSkge1xuICAgICAgaXRlbSA9IGdyYXBoLmZpbmRCeUlkKGl0ZW0pO1xuICAgIH1cblxuICAgIGlmICghaXRlbSB8fCBpdGVtLmRlc3Ryb3llZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBpdGVtTW9kZWwgPSBjbG9uZShpdGVtLmdldE1vZGVsKCkpO1xuICAgIGdyYXBoLmVtaXQoJ2JlZm9yZXJlbW92ZWl0ZW0nLCB7XG4gICAgICBpdGVtOiBpdGVtTW9kZWxcbiAgICB9KTtcbiAgICB2YXIgdHlwZSA9ICcnO1xuICAgIGlmIChpdGVtLmdldFR5cGUpIHR5cGUgPSBpdGVtLmdldFR5cGUoKTtcbiAgICB2YXIgaXRlbXMgPSBncmFwaC5nZXQodHlwZSArIFwic1wiKTtcbiAgICB2YXIgaW5kZXggPSBpdGVtcy5pbmRleE9mKGl0ZW0pO1xuICAgIGlmIChpbmRleCA+IC0xKSBpdGVtcy5zcGxpY2UoaW5kZXgsIDEpO1xuXG4gICAgaWYgKHR5cGUgPT09IEVER0UpIHtcbiAgICAgIHZhciB2aXRlbXMgPSBncmFwaC5nZXQoXCJ2XCIgKyB0eXBlICsgXCJzXCIpO1xuICAgICAgdmFyIHZpbmRleCA9IHZpdGVtcy5pbmRleE9mKGl0ZW0pO1xuICAgICAgaWYgKHZpbmRleCA+IC0xKSB2aXRlbXMuc3BsaWNlKHZpbmRleCwgMSk7XG4gICAgfVxuXG4gICAgdmFyIGl0ZW1JZCA9IGl0ZW0uZ2V0KCdpZCcpO1xuICAgIHZhciBpdGVtTWFwID0gZ3JhcGguZ2V0KCdpdGVtTWFwJyk7XG4gICAgZGVsZXRlIGl0ZW1NYXBbaXRlbUlkXTtcbiAgICB2YXIgY29tYm9UcmVlcyA9IGdyYXBoLmdldCgnY29tYm9UcmVlcycpO1xuICAgIHZhciBpZCA9IGl0ZW0uZ2V0KCdpZCcpO1xuXG4gICAgaWYgKHR5cGUgPT09IE5PREUpIHtcbiAgICAgIHZhciBjb21ib0lkID0gaXRlbS5nZXRNb2RlbCgpLmNvbWJvSWQ7XG5cbiAgICAgIGlmIChjb21ib1RyZWVzICYmIGNvbWJvSWQpIHtcbiAgICAgICAgdmFyIGJyb3RoZXJzXzEgPSBjb21ib1RyZWVzO1xuICAgICAgICB2YXIgZm91bmRfMSA9IGZhbHNlOyAvLyB0aGUgZmxhZyB0byB0ZXJtaW5hdGUgdGhlIGZvckVhY2ggY2lyY3VsYXRpb25cbiAgICAgICAgLy8gcmVtb3ZlIHRoZSBub2RlIGZyb20gdGhlIGNoaWxkcmVuIGFycmF5IG9mIGl0cyBwYXJlbnQgZnJvbXQgaGUgdHJlZVxuXG4gICAgICAgIGNvbWJvVHJlZXMuZm9yRWFjaChmdW5jdGlvbiAoY3RyZWUpIHtcbiAgICAgICAgICBpZiAoZm91bmRfMSkgcmV0dXJuO1xuICAgICAgICAgIHRyYXZlcnNlVHJlZShjdHJlZSwgZnVuY3Rpb24gKGNvbWJvKSB7XG4gICAgICAgICAgICBpZiAoY29tYm8uaWQgPT09IGlkICYmIGJyb3RoZXJzXzEpIHtcbiAgICAgICAgICAgICAgdmFyIGJpZHggPSBicm90aGVyc18xLmluZGV4T2YoY29tYm8pO1xuICAgICAgICAgICAgICBicm90aGVyc18xLnNwbGljZShiaWR4LCAxKTtcbiAgICAgICAgICAgICAgZm91bmRfMSA9IHRydWU7XG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gdGVybWluYXRlIHRoZSB0cmF2ZXJzZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBicm90aGVyc18xID0gY29tYm8uY2hpbGRyZW47XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9IC8vIOiLpeenu+mZpOeahOaYr+iKgueCue+8jOmcgOimgeWwhuS4juS5i+ebuOi/nueahOi+ueS4gOWQjOWIoOmZpFxuXG5cbiAgICAgIHZhciBlZGdlcyA9IGl0ZW0uZ2V0RWRnZXMoKTtcblxuICAgICAgZm9yICh2YXIgaSA9IGVkZ2VzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGdyYXBoLnJlbW92ZUl0ZW0oZWRnZXNbaV0sIGZhbHNlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbWJvSWQpIGdyYXBoLnVwZGF0ZUNvbWJvKGNvbWJvSWQpO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gQ09NQk8pIHtcbiAgICAgIHZhciBwYXJlbnRJZCA9IGl0ZW0uZ2V0TW9kZWwoKS5wYXJlbnRJZDtcbiAgICAgIHZhciBjb21ib0luVHJlZV8xOyAvLyBmaW5kIHRoZSBzdWJ0cmVlIHJvb3RlZCBhdCB0aGUgaXRlbSB0byBiZSByZW1vdmVkXG5cbiAgICAgIHZhciBmb3VuZF8yID0gZmFsc2U7IC8vIHRoZSBmbGFnIHRvIHRlcm1pbmF0ZSB0aGUgZm9yRWFjaCBjaXJjdWxhdGlvblxuXG4gICAgICAoY29tYm9UcmVlcyB8fCBbXSkuZm9yRWFjaChmdW5jdGlvbiAoY3RyZWUpIHtcbiAgICAgICAgaWYgKGZvdW5kXzIpIHJldHVybjtcbiAgICAgICAgdHJhdmVyc2VUcmVlKGN0cmVlLCBmdW5jdGlvbiAoY29tYm8pIHtcbiAgICAgICAgICBpZiAoY29tYm8uaWQgPT09IGlkKSB7XG4gICAgICAgICAgICBjb21ib0luVHJlZV8xID0gY29tYm87XG4gICAgICAgICAgICBmb3VuZF8yID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gdGVybWluYXRlIHRoZSB0cmF2ZXJzZVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgY29tYm9JblRyZWVfMS5yZW1vdmVkID0gdHJ1ZTtcblxuICAgICAgaWYgKGNvbWJvSW5UcmVlXzEgJiYgY29tYm9JblRyZWVfMS5jaGlsZHJlbikge1xuICAgICAgICBjb21ib0luVHJlZV8xLmNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgICAgX3RoaXMucmVtb3ZlSXRlbShjaGlsZC5pZCk7XG4gICAgICAgIH0pO1xuICAgICAgfSAvLyDoi6Xnp7vpmaTnmoTmmK8gY29tYm/vvIzpnIDopoHlsIbkuI7kuYvnm7jov57nmoTovrnkuIDlkIzliKDpmaRcblxuXG4gICAgICB2YXIgZWRnZXMgPSBpdGVtLmdldEVkZ2VzKCk7XG5cbiAgICAgIGZvciAodmFyIGkgPSBlZGdlcy5sZW5ndGg7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGdyYXBoLnJlbW92ZUl0ZW0oZWRnZXNbaV0sIGZhbHNlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHBhcmVudElkKSBncmFwaC51cGRhdGVDb21ibyhwYXJlbnRJZCk7XG4gICAgfVxuXG4gICAgaXRlbS5kZXN0cm95KCk7XG4gICAgZ3JhcGguZW1pdCgnYWZ0ZXJyZW1vdmVpdGVtJywge1xuICAgICAgaXRlbTogaXRlbU1vZGVsXG4gICAgfSk7XG4gIH07XG4gIC8qKlxuICAgKiDmm7TmlrAgaXRlbSDnirbmgIFcbiAgICpcbiAgICogQHBhcmFtIHtJdGVtfSBpdGVtIEl0ZW0g5a6e5L6LXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdGF0ZSDnirbmgIHlkI3np7BcbiAgICogQHBhcmFtIHtib29sZWFufSB2YWx1ZSDmmK/lkKblkK/nlKjnirbmgIHmiJbnirbmgIHlgLxcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqIEBtZW1iZXJvZiBJdGVtQ29udHJvbGxlclxuICAgKi9cblxuXG4gIEl0ZW1Db250cm9sbGVyLnByb3RvdHlwZS5zZXRJdGVtU3RhdGUgPSBmdW5jdGlvbiAoaXRlbSwgc3RhdGUsIHZhbHVlKSB7XG4gICAgdmFyIGdyYXBoID0gdGhpcy5ncmFwaDtcbiAgICB2YXIgc3RhdGVOYW1lID0gc3RhdGU7XG5cbiAgICBpZiAoaXNTdHJpbmcodmFsdWUpKSB7XG4gICAgICBzdGF0ZU5hbWUgPSBzdGF0ZSArIFwiOlwiICsgdmFsdWU7XG4gICAgfSAvLyDlt7Lnu4/lrZjlnKjopoHorr7nva7nmoQgc3RhdGXvvIzmiJbkuI3lrZjlnKggc3RhdGUg55qE5qC35byP5Li6IHVuZGVmaW5lZFxuXG5cbiAgICBpZiAoaXRlbS5oYXNTdGF0ZShzdGF0ZU5hbWUpID09PSB2YWx1ZSAmJiB2YWx1ZSB8fCAvLyDlvZPor6XnirbmgIHlt7Lnu4/lrZjlnKjkuJTnjrDlnKjpnIDopoHorr7nva7kuLogdHJ1ZSDml7bvvIzkuI3pnIDopoHnu6fnu63jgILlvZPor6XnirbmgIHkuI3lrZjlnKjvvIzkuJTorr7nva7kuLogZmFsc2Ug5pe277yM6ZyA6KaB57un57utXG4gICAgaXNTdHJpbmcodmFsdWUpICYmIGl0ZW0uaGFzU3RhdGUoc3RhdGVOYW1lKSkge1xuICAgICAgLy8g5b2T6K+l54q25oCBIHZhbHVlIOaYr+Wtl+espuS4su+8jOS4lOW3sue7j+WtmOWcqOivpeeKtuaAge+8jOS4jemcgOimgee7p+e7rVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGdyYXBoLmVtaXQoJ2JlZm9yZWl0ZW1zdGF0ZWNoYW5nZScsIHtcbiAgICAgIGl0ZW06IGl0ZW0sXG4gICAgICBzdGF0ZTogc3RhdGVOYW1lLFxuICAgICAgZW5hYmxlZDogdmFsdWVcbiAgICB9KTtcbiAgICBpdGVtLnNldFN0YXRlKHN0YXRlLCB2YWx1ZSk7XG4gICAgZ3JhcGguYXV0b1BhaW50KCk7XG4gICAgZ3JhcGguZW1pdCgnYWZ0ZXJpdGVtc3RhdGVjaGFuZ2UnLCB7XG4gICAgICBpdGVtOiBpdGVtLFxuICAgICAgc3RhdGU6IHN0YXRlTmFtZSxcbiAgICAgIGVuYWJsZWQ6IHZhbHVlXG4gICAgfSk7XG4gIH07XG4gIC8qKlxuICAgKiDlsIbmjIflrprnirbmgIHnmoTkvJjlhYjnuqfmj5DljYfkuLrmnIDpq5jkvJjlhYjnuqdcbiAgICogQHBhcmFtIHtJdGVtfSBpdGVtIOWFg+e0oGlk5oiW5YWD57Sg5a6e5L6LXG4gICAqIEBwYXJhbSBzdGF0ZSDnirbmgIHlkI3np7BcbiAgICovXG5cblxuICBJdGVtQ29udHJvbGxlci5wcm90b3R5cGUucHJpb3JpdHlTdGF0ZSA9IGZ1bmN0aW9uIChpdGVtLCBzdGF0ZSkge1xuICAgIHZhciBncmFwaCA9IHRoaXMuZ3JhcGg7XG4gICAgdmFyIGN1cnJlbnRJdGVtID0gaXRlbTtcblxuICAgIGlmIChpc1N0cmluZyhpdGVtKSkge1xuICAgICAgY3VycmVudEl0ZW0gPSBncmFwaC5maW5kQnlJZChpdGVtKTtcbiAgICB9IC8vIOWFiOWPlua2iOW3suacieeahCBzdGF0ZVxuXG5cbiAgICB0aGlzLnNldEl0ZW1TdGF0ZShjdXJyZW50SXRlbSwgc3RhdGUsIGZhbHNlKTsgLy8g5YaN6K6+572uc3RhdGXvvIzliJnmraTml7bor6XkvJjlhYjnuqfkuLrmnIDpq5hcblxuICAgIHRoaXMuc2V0SXRlbVN0YXRlKGN1cnJlbnRJdGVtLCBzdGF0ZSwgdHJ1ZSk7XG4gIH07XG4gIC8qKlxuICAgKiDmuIXpmaTmiYDmnInmjIflrprnmoTnirbmgIFcbiAgICpcbiAgICogQHBhcmFtIHtJdGVtfSBpdGVtIEl0ZW0g5a6e5L6LXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IHN0YXRlcyDnirbmgIHlkI3np7Dpm4blkIhcbiAgICogQG1lbWJlcm9mIEl0ZW1Db250cm9sbGVyXG4gICAqL1xuXG5cbiAgSXRlbUNvbnRyb2xsZXIucHJvdG90eXBlLmNsZWFySXRlbVN0YXRlcyA9IGZ1bmN0aW9uIChpdGVtLCBzdGF0ZXMpIHtcbiAgICB2YXIgZ3JhcGggPSB0aGlzLmdyYXBoO1xuXG4gICAgaWYgKGlzU3RyaW5nKGl0ZW0pKSB7XG4gICAgICBpdGVtID0gZ3JhcGguZmluZEJ5SWQoaXRlbSk7XG4gICAgfVxuXG4gICAgZ3JhcGguZW1pdCgnYmVmb3JlaXRlbXN0YXRlc2NsZWFyJywge1xuICAgICAgaXRlbTogaXRlbSxcbiAgICAgIHN0YXRlczogc3RhdGVzXG4gICAgfSk7XG4gICAgaXRlbS5jbGVhclN0YXRlcyhzdGF0ZXMpO1xuICAgIGdyYXBoLmVtaXQoJ2FmdGVyaXRlbXN0YXRlc2NsZWFyJywge1xuICAgICAgaXRlbTogaXRlbSxcbiAgICAgIHN0YXRlczogc3RhdGVzXG4gICAgfSk7XG4gIH07XG4gIC8qKlxuICAgKiDliLfmlrDmjIflrprnmoQgSXRlbVxuICAgKlxuICAgKiBAcGFyYW0ge0l0ZW19IGl0ZW0gSXRlbSBJRCDmiJYg5a6e5L6LXG4gICAqIEBtZW1iZXJvZiBJdGVtQ29udHJvbGxlclxuICAgKi9cblxuXG4gIEl0ZW1Db250cm9sbGVyLnByb3RvdHlwZS5yZWZyZXNoSXRlbSA9IGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgdmFyIGdyYXBoID0gdGhpcy5ncmFwaDtcblxuICAgIGlmIChpc1N0cmluZyhpdGVtKSkge1xuICAgICAgaXRlbSA9IGdyYXBoLmZpbmRCeUlkKGl0ZW0pO1xuICAgIH1cblxuICAgIGdyYXBoLmVtaXQoJ2JlZm9yZWl0ZW1yZWZyZXNoJywge1xuICAgICAgaXRlbTogaXRlbVxuICAgIH0pOyAvLyDosIPnlKggSXRlbSDnmoQgcmVmcmVzaCDmlrnms5XvvIzlrp7njrDliLfmlrDlip/og71cblxuICAgIGl0ZW0ucmVmcmVzaCgpO1xuICAgIGdyYXBoLmVtaXQoJ2FmdGVyaXRlbXJlZnJlc2gnLCB7XG4gICAgICBpdGVtOiBpdGVtXG4gICAgfSk7XG4gIH07XG4gIC8qKlxuICAgKiDmoLnmja4gZ3JhcGgg5LiK55SoIGNvbWJvcyDmlbDmja7nlJ/miJDnmoQgY29tYm9UcmVlIOadpeWinuWKoOaJgOaciSBjb21ib3NcbiAgICpcbiAgICogQHBhcmFtIHtDb21ib1RyZWVbXX0gY29tYm9UcmVlcyBncmFwaCDkuIrnlKggY29tYm9zIOaVsOaNrueUn+aIkOeahCBjb21ib1RyZWVcbiAgICogQHBhcmFtIHtDb21ib0NvbmZpZ1tdfSBjb21ib01vZGVscyBjb21ib3Mg5pWw5o2uXG4gICAqIEBtZW1iZXJvZiBJdGVtQ29udHJvbGxlclxuICAgKi9cblxuXG4gIEl0ZW1Db250cm9sbGVyLnByb3RvdHlwZS5hZGRDb21ib3MgPSBmdW5jdGlvbiAoY29tYm9UcmVlcywgY29tYm9Nb2RlbHMpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdmFyIGdyYXBoID0gdGhpcy5ncmFwaDtcbiAgICAoY29tYm9UcmVlcyB8fCBbXSkuZm9yRWFjaChmdW5jdGlvbiAoY3RyZWUpIHtcbiAgICAgIHRyYXZlcnNlVHJlZVVwKGN0cmVlLCBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgdmFyIGNvbWJvTW9kZWw7XG4gICAgICAgIGNvbWJvTW9kZWxzLmZvckVhY2goZnVuY3Rpb24gKG1vZGVsKSB7XG4gICAgICAgICAgaWYgKG1vZGVsLmlkID09PSBjaGlsZC5pZCkge1xuICAgICAgICAgICAgbW9kZWwuY2hpbGRyZW4gPSBjaGlsZC5jaGlsZHJlbjtcbiAgICAgICAgICAgIG1vZGVsLmRlcHRoID0gY2hpbGQuZGVwdGg7XG4gICAgICAgICAgICBjb21ib01vZGVsID0gbW9kZWw7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoY29tYm9Nb2RlbCkge1xuICAgICAgICAgIF90aGlzLmFkZEl0ZW0oJ2NvbWJvJywgY29tYm9Nb2RlbCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHZhciBjb21ib0dyb3VwID0gZ3JhcGguZ2V0KCdjb21ib0dyb3VwJyk7XG4gICAgaWYgKGNvbWJvR3JvdXApIGNvbWJvR3JvdXAuc29ydCgpO1xuICB9O1xuICAvKipcbiAgICog5pS55Y+YSXRlbeeahOaYvuekuueKtuaAgVxuICAgKlxuICAgKiBAcGFyYW0ge0l0ZW19IGl0ZW0gSXRlbSBJRCDmiJYg5a6e5L6LXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gdmlzaWJsZSDmmK/lkKbmmL7npLpcbiAgICogQG1lbWJlcm9mIEl0ZW1Db250cm9sbGVyXG4gICAqL1xuXG5cbiAgSXRlbUNvbnRyb2xsZXIucHJvdG90eXBlLmNoYW5nZUl0ZW1WaXNpYmlsaXR5ID0gZnVuY3Rpb24gKGl0ZW0sIHZpc2libGUpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdmFyIGdyYXBoID0gdGhpcy5ncmFwaDtcblxuICAgIGlmIChpc1N0cmluZyhpdGVtKSkge1xuICAgICAgaXRlbSA9IGdyYXBoLmZpbmRCeUlkKGl0ZW0pO1xuICAgIH1cblxuICAgIGlmICghaXRlbSkge1xuICAgICAgY29uc29sZS53YXJuKCdUaGUgaXRlbSB0byBiZSBzaG93biBvciBoaWRkZW4gZG9lcyBub3QgZXhpc3QhJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZ3JhcGguZW1pdCgnYmVmb3JlaXRlbXZpc2liaWxpdHljaGFuZ2UnLCB7XG4gICAgICBpdGVtOiBpdGVtLFxuICAgICAgdmlzaWJsZTogdmlzaWJsZVxuICAgIH0pO1xuICAgIGl0ZW0uY2hhbmdlVmlzaWJpbGl0eSh2aXNpYmxlKTtcblxuICAgIGlmIChpdGVtLmdldFR5cGUgJiYgaXRlbS5nZXRUeXBlKCkgPT09IE5PREUpIHtcbiAgICAgIHZhciBlZGdlcyA9IGl0ZW0uZ2V0RWRnZXMoKTtcbiAgICAgIGVhY2goZWRnZXMsIGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgICAgIC8vIOiLpemakOiXj+iKgueCue+8jOWImeWwhuS4juS5i+WFs+iBlOeahOi+ueS5n+makOiXj1xuICAgICAgICAvLyDoi6XmmL7npLroioLngrnvvIzliJnlsIbkuI7kuYvlhbPogZTnmoTovrnkuZ/mmL7npLrvvIzkvYbmmK/pnIDopoHliKTmlq3ovrnkuKTnq6/nmoToioLngrnpg73mmK/lj6/op4HnmoRcbiAgICAgICAgaWYgKHZpc2libGUgJiYgIShlZGdlLmdldCgnc291cmNlJykuaXNWaXNpYmxlKCkgJiYgZWRnZS5nZXQoJ3RhcmdldCcpLmlzVmlzaWJsZSgpKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIF90aGlzLmNoYW5nZUl0ZW1WaXNpYmlsaXR5KGVkZ2UsIHZpc2libGUpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChpdGVtLmdldFR5cGUgJiYgaXRlbS5nZXRUeXBlKCkgPT09IENPTUJPKSB7XG4gICAgICB2YXIgY29tYm9UcmVlcyA9IGdyYXBoLmdldCgnY29tYm9UcmVlcycpO1xuICAgICAgdmFyIGlkXzEgPSBpdGVtLmdldCgnaWQnKTtcbiAgICAgIHZhciBjaGlsZHJlbl8xID0gW107XG4gICAgICB2YXIgZm91bmRfMyA9IGZhbHNlOyAvLyBmbGFnIHRoZSB0ZXJtaW5hdGUgdGhlIGZvckVhY2hcblxuICAgICAgKGNvbWJvVHJlZXMgfHwgW10pLmZvckVhY2goZnVuY3Rpb24gKGN0cmVlKSB7XG4gICAgICAgIGlmIChmb3VuZF8zKSByZXR1cm47XG4gICAgICAgIGlmICghY3RyZWUuY2hpbGRyZW4gfHwgY3RyZWUuY2hpbGRyZW4ubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgICAgIHRyYXZlcnNlVHJlZShjdHJlZSwgZnVuY3Rpb24gKGNvbWJvKSB7XG4gICAgICAgICAgaWYgKGNvbWJvLmlkID09PSBpZF8xKSB7XG4gICAgICAgICAgICBjaGlsZHJlbl8xID0gY29tYm8uY2hpbGRyZW47XG4gICAgICAgICAgICBmb3VuZF8zID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gdGVybWluYXRlIHRoZSB0cmF2ZXJzZVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoY2hpbGRyZW5fMSAmJiAoIXZpc2libGUgfHwgdmlzaWJsZSAmJiAhaXRlbS5nZXRNb2RlbCgpLmNvbGxhcHNlZCkpIHtcbiAgICAgICAgY2hpbGRyZW5fMS5mb3JFYWNoKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICAgIHZhciBjaGlsZEl0ZW0gPSBncmFwaC5maW5kQnlJZChjaGlsZC5pZCk7XG5cbiAgICAgICAgICBfdGhpcy5jaGFuZ2VJdGVtVmlzaWJpbGl0eShjaGlsZEl0ZW0sIHZpc2libGUpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgdmFyIGVkZ2VzID0gaXRlbS5nZXRFZGdlcygpO1xuICAgICAgZWFjaChlZGdlcywgZnVuY3Rpb24gKGVkZ2UpIHtcbiAgICAgICAgLy8g6Iul6ZqQ6JePIGNvbWJv77yM5YiZ5bCG5LiOIGNvbWJvIOacrOi6q+WFs+iBlOeahOi+ueS5n+makOiXj1xuICAgICAgICAvLyDoi6XmmL7npLogY29tYm/vvIzliJnlsIbkuI4gY29tYm8g5pys6Lqr5YWz6IGU55qE6L655Lmf5pi+56S677yM5L2G5piv6ZyA6KaB5Yik5pat6L655Lik56uv55qE6IqC54K56YO95piv5Y+v6KeB55qEXG4gICAgICAgIGlmICh2aXNpYmxlICYmICEoZWRnZS5nZXQoJ3NvdXJjZScpLmlzVmlzaWJsZSgpICYmIGVkZ2UuZ2V0KCd0YXJnZXQnKS5pc1Zpc2libGUoKSkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBfdGhpcy5jaGFuZ2VJdGVtVmlzaWJpbGl0eShlZGdlLCB2aXNpYmxlKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGdyYXBoLmVtaXQoJ2FmdGVyaXRlbXZpc2liaWxpdHljaGFuZ2UnLCB7XG4gICAgICBpdGVtOiBpdGVtLFxuICAgICAgdmlzaWJsZTogdmlzaWJsZVxuICAgIH0pO1xuICAgIHJldHVybiBpdGVtO1xuICB9O1xuXG4gIEl0ZW1Db250cm9sbGVyLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuZ3JhcGggPSBudWxsO1xuICAgIHRoaXMuZGVzdHJveWVkID0gdHJ1ZTtcbiAgfTtcblxuICByZXR1cm4gSXRlbUNvbnRyb2xsZXI7XG59KCk7XG5cbmV4cG9ydCBkZWZhdWx0IEl0ZW1Db250cm9sbGVyOyIsImltcG9ydCB7IGVhY2gsIGlzU3RyaW5nIH0gZnJvbSAnQGFudHYvdXRpbCc7XG52YXIgdGltZXIgPSBudWxsO1xuXG52YXIgU3RhdGVDb250cm9sbGVyID1cbi8qKiBAY2xhc3MgKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gU3RhdGVDb250cm9sbGVyKGdyYXBoKSB7XG4gICAgdGhpcy5ncmFwaCA9IGdyYXBoO1xuICAgIC8qKlxuICAgICAqIHRoaXMuY2FjaGVkU3RhdGVzID0ge1xuICAgICAqICAgIGVuYWJsZWQ6IHtcbiAgICAgKiAgICAgICAgaG92ZXI6IFtOb2RlXVxuICAgICAqICAgIH0sXG4gICAgICogICAgIGRpc2FibGVkOiB7fVxuICAgICAqICB9XG4gICAgICovXG5cbiAgICB0aGlzLmNhY2hlZFN0YXRlcyA9IHtcbiAgICAgIGVuYWJsZWQ6IHt9LFxuICAgICAgZGlzYWJsZWQ6IHt9XG4gICAgfTtcbiAgICB0aGlzLmRlc3Ryb3llZCA9IGZhbHNlO1xuICB9XG4gIC8qKlxuICAgKiDmo4Dmn6UgY2FjaGUg55qE5Y+v55So5oCnXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7SXRlbX0gaXRlbVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RhdGVcbiAgICogQHBhcmFtIHtvYmplY3R9IGNhY2hlXG4gICAqIEByZXR1cm5zXG4gICAqIEBtZW1iZXJvZiBTdGF0ZVxuICAgKi9cblxuXG4gIFN0YXRlQ29udHJvbGxlci5jaGVja0NhY2hlID0gZnVuY3Rpb24gKGl0ZW0sIHN0YXRlLCBjYWNoZSkge1xuICAgIGlmICghY2FjaGVbc3RhdGVdKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGluZGV4ID0gY2FjaGVbc3RhdGVdLmluZGV4T2YoaXRlbSk7XG5cbiAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgY2FjaGVbc3RhdGVdLnNwbGljZShpbmRleCwgMSk7XG4gICAgfVxuICB9O1xuICAvKipcbiAgICog57yT5a2YIHN0YXRlXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7SXRlbX0gaXRlbSBJdGVtIOWunuS+i1xuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RhdGUg54q25oCB5ZCN56ewXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBzdGF0ZXNcbiAgICogQG1lbWJlcm9mIFN0YXRlXG4gICAqL1xuXG5cbiAgU3RhdGVDb250cm9sbGVyLmNhY2hlU3RhdGUgPSBmdW5jdGlvbiAoaXRlbSwgc3RhdGUsIHN0YXRlcykge1xuICAgIGlmICghc3RhdGVzW3N0YXRlXSkge1xuICAgICAgc3RhdGVzW3N0YXRlXSA9IFtdO1xuICAgIH1cblxuICAgIHN0YXRlc1tzdGF0ZV0ucHVzaChpdGVtKTtcbiAgfTtcbiAgLyoqXG4gICAqIOabtOaWsCBJdGVtIOeahOeKtuaAgVxuICAgKlxuICAgKiBAcGFyYW0ge0l0ZW19IGl0ZW0gSXRlbeWunuS+i1xuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RhdGUg54q25oCB5ZCN56ewXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZW5hYmxlZCDnirbmgIHmmK/lkKblj6/nlKhcbiAgICogQG1lbWJlcm9mIFN0YXRlXG4gICAqL1xuXG5cbiAgU3RhdGVDb250cm9sbGVyLnByb3RvdHlwZS51cGRhdGVTdGF0ZSA9IGZ1bmN0aW9uIChpdGVtLCBzdGF0ZSwgZW5hYmxlZCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICB2YXIgY2hlY2tDYWNoZSA9IFN0YXRlQ29udHJvbGxlci5jaGVja0NhY2hlLFxuICAgICAgICBjYWNoZVN0YXRlID0gU3RhdGVDb250cm9sbGVyLmNhY2hlU3RhdGU7XG5cbiAgICBpZiAoaXRlbS5kZXN0cm95ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgY2FjaGVkU3RhdGVzID0gdGhpcy5jYWNoZWRTdGF0ZXM7XG4gICAgdmFyIGVuYWJsZWRTdGF0ZXMgPSBjYWNoZWRTdGF0ZXMuZW5hYmxlZDtcbiAgICB2YXIgZGlzYWJsZWRTdGF0ZXMgPSBjYWNoZWRTdGF0ZXMuZGlzYWJsZWQ7XG5cbiAgICBpZiAoZW5hYmxlZCkge1xuICAgICAgY2hlY2tDYWNoZShpdGVtLCBzdGF0ZSwgZGlzYWJsZWRTdGF0ZXMpO1xuICAgICAgY2FjaGVTdGF0ZShpdGVtLCBzdGF0ZSwgZW5hYmxlZFN0YXRlcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNoZWNrQ2FjaGUoaXRlbSwgc3RhdGUsIGVuYWJsZWRTdGF0ZXMpO1xuICAgICAgY2FjaGVTdGF0ZShpdGVtLCBzdGF0ZSwgZGlzYWJsZWRTdGF0ZXMpO1xuICAgIH1cblxuICAgIGlmICh0aW1lcikge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICB9XG5cbiAgICB0aW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgdGltZXIgPSBudWxsO1xuXG4gICAgICBfdGhpcy51cGRhdGVHcmFwaFN0YXRlcygpO1xuICAgIH0sIDE2KTtcbiAgfTtcbiAgLyoqXG4gICAqIOaJuemHj+abtOaWsCBzdGF0ZXPvvIzlhbzlrrkgdXBkYXRlU3RhdGXvvIzmlK/mjIHmm7TmlrDkuIDkuKogc3RhdGVcbiAgICpcbiAgICogQHBhcmFtIHtJdGVtfSBpdGVtXG4gICAqIEBwYXJhbSB7KHN0cmluZyB8IHN0cmluZ1tdKX0gc3RhdGVzXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZW5hYmxlZFxuICAgKiBAbWVtYmVyb2YgU3RhdGVcbiAgICovXG5cblxuICBTdGF0ZUNvbnRyb2xsZXIucHJvdG90eXBlLnVwZGF0ZVN0YXRlcyA9IGZ1bmN0aW9uIChpdGVtLCBzdGF0ZXMsIGVuYWJsZWQpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgaWYgKGlzU3RyaW5nKHN0YXRlcykpIHtcbiAgICAgIHRoaXMudXBkYXRlU3RhdGUoaXRlbSwgc3RhdGVzLCBlbmFibGVkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGVzLmZvckVhY2goZnVuY3Rpb24gKHN0YXRlKSB7XG4gICAgICAgIF90aGlzLnVwZGF0ZVN0YXRlKGl0ZW0sIHN0YXRlLCBlbmFibGVkKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcbiAgLyoqXG4gICAqIOabtOaWsCBzdGF0ZXNcbiAgICpcbiAgICogQG1lbWJlcm9mIFN0YXRlXG4gICAqL1xuXG5cbiAgU3RhdGVDb250cm9sbGVyLnByb3RvdHlwZS51cGRhdGVHcmFwaFN0YXRlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc3RhdGVzID0gdGhpcy5ncmFwaC5nZXQoJ3N0YXRlcycpO1xuICAgIHZhciBjYWNoZWRTdGF0ZXMgPSB0aGlzLmNhY2hlZFN0YXRlcztcbiAgICBlYWNoKGNhY2hlZFN0YXRlcy5kaXNhYmxlZCwgZnVuY3Rpb24gKHZhbCwga2V5KSB7XG4gICAgICBpZiAoc3RhdGVzW2tleV0pIHtcbiAgICAgICAgc3RhdGVzW2tleV0gPSBzdGF0ZXNba2V5XS5maWx0ZXIoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgICByZXR1cm4gdmFsLmluZGV4T2YoaXRlbSkgPCAwICYmICF2YWwuZGVzdHJveWVkO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBlYWNoKGNhY2hlZFN0YXRlcy5lbmFibGVkLCBmdW5jdGlvbiAodmFsLCBrZXkpIHtcbiAgICAgIGlmICghc3RhdGVzW2tleV0pIHtcbiAgICAgICAgc3RhdGVzW2tleV0gPSB2YWw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgbWFwXzEgPSB7fTtcbiAgICAgICAgc3RhdGVzW2tleV0uZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICAgIGlmICghaXRlbS5kZXN0cm95ZWQpIHtcbiAgICAgICAgICAgIG1hcF8xW2l0ZW0uZ2V0KCdpZCcpXSA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdmFsLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgICBpZiAoIWl0ZW0uZGVzdHJveWVkKSB7XG4gICAgICAgICAgICB2YXIgaWQgPSBpdGVtLmdldCgnaWQnKTtcblxuICAgICAgICAgICAgaWYgKCFtYXBfMVtpZF0pIHtcbiAgICAgICAgICAgICAgbWFwXzFbaWRdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgc3RhdGVzW2tleV0ucHVzaChpdGVtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuZ3JhcGguZW1pdCgnZ3JhcGhzdGF0ZWNoYW5nZScsIHtcbiAgICAgIHN0YXRlczogc3RhdGVzXG4gICAgfSk7XG4gICAgdGhpcy5jYWNoZWRTdGF0ZXMgPSB7XG4gICAgICBlbmFibGVkOiB7fSxcbiAgICAgIGRpc2FibGVkOiB7fVxuICAgIH07XG4gIH07XG5cbiAgU3RhdGVDb250cm9sbGVyLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuZ3JhcGggPSBudWxsO1xuICAgIHRoaXMuY2FjaGVkU3RhdGVzID0gbnVsbDtcblxuICAgIGlmICh0aW1lcikge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICB9XG5cbiAgICB0aW1lciA9IG51bGw7XG4gICAgdGhpcy5kZXN0cm95ZWQgPSB0cnVlO1xuICB9O1xuXG4gIHJldHVybiBTdGF0ZUNvbnRyb2xsZXI7XG59KCk7XG5cbmV4cG9ydCBkZWZhdWx0IFN0YXRlQ29udHJvbGxlcjsiLCJleHBvcnQgeyBkZWZhdWx0IGFzIE1vZGVDb250cm9sbGVyIH0gZnJvbSAnLi9tb2RlJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgVmlld0NvbnRyb2xsZXIgfSBmcm9tICcuL3ZpZXcnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBJdGVtQ29udHJvbGxlciB9IGZyb20gJy4vaXRlbSc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFN0YXRlQ29udHJvbGxlciB9IGZyb20gJy4vc3RhdGUnOyIsImltcG9ydCB7IHZlYzIgfSBmcm9tICdAYW50di9tYXRyaXgtdXRpbCc7XG5pbXBvcnQgeyBjYXRtdWxsUm9tMkJlemllciB9IGZyb20gJ0BhbnR2L3BhdGgtdXRpbCc7XG4vKipcbiAqIOabv+aNouWtl+espuS4suS4reeahOWtl+autVxuICogQHBhcmFtIHtTdHJpbmd9IHN0ciDmqKHniYjlrZfnrKbkuLJcbiAqIEBwYXJhbSB7T2JqZWN0fSBvIGpzb24gZGF0YVxuICovXG5cbnZhciBzdWJzdGl0dXRlID0gZnVuY3Rpb24gc3Vic3RpdHV0ZShzdHIsIG8pIHtcbiAgaWYgKCFzdHIgfHwgIW8pIHtcbiAgICByZXR1cm4gc3RyO1xuICB9XG5cbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC9cXFxcP1xceyhbXnt9XSspXFx9L2csIGZ1bmN0aW9uIChtYXRjaCwgbmFtZSkge1xuICAgIGlmIChtYXRjaC5jaGFyQXQoMCkgPT09ICdcXFxcJykge1xuICAgICAgcmV0dXJuIG1hdGNoLnNsaWNlKDEpO1xuICAgIH1cblxuICAgIHZhciByZXMgPSBvW25hbWVdO1xuICAgIGlmIChyZXMgPT09IDApIHJlcyA9ICcwJztcbiAgICByZXR1cm4gcmVzIHx8ICcnO1xuICB9KTtcbn07XG4vKipcbiAqIOe7meWumuWdkOagh+iOt+WPluS4ieasoei0neWhnuWwlOabsue6v+eahCBNIOWPiiBDIOWAvFxuICogQHBhcmFtIHBvaW50cyBjb29yZGluYXRlIHNldFxuICovXG5cblxuZXhwb3J0IHZhciBnZXRTcGxpbmUgPSBmdW5jdGlvbiBnZXRTcGxpbmUocG9pbnRzKSB7XG4gIHZhciBkYXRhID0gW107XG5cbiAgaWYgKHBvaW50cy5sZW5ndGggPCAyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwicG9pbnQgbGVuZ3RoIG11c3QgbGFyZ24gdGhhbiAyLCBub3cgaXQncyBcIiArIHBvaW50cy5sZW5ndGgpO1xuICB9XG5cbiAgZm9yICh2YXIgX2kgPSAwLCBwb2ludHNfMSA9IHBvaW50czsgX2kgPCBwb2ludHNfMS5sZW5ndGg7IF9pKyspIHtcbiAgICB2YXIgcG9pbnQgPSBwb2ludHNfMVtfaV07XG4gICAgdmFyIHggPSBwb2ludC54LFxuICAgICAgICB5ID0gcG9pbnQueTtcbiAgICBkYXRhLnB1c2goeCk7XG4gICAgZGF0YS5wdXNoKHkpO1xuICB9XG5cbiAgdmFyIHNwbGllUGF0aCA9IGNhdG11bGxSb20yQmV6aWVyKGRhdGEpO1xuICBzcGxpZVBhdGgudW5zaGlmdChbJ00nLCBwb2ludHNbMF0ueCwgcG9pbnRzWzBdLnldKTtcbiAgcmV0dXJuIHNwbGllUGF0aDtcbn07XG4vKipcbiAqIOagueaNrui1t+Wni+eCueOAgeebuOWvueS9jee9ruOAgeWBj+enu+mHj+iuoeeul+aOp+WItueCuVxuICogQHBhcmFtICB7SVBvaW50fSBzdGFydFBvaW50IOi1t+Wni+eCue+8jOWMheWQqyB4LHlcbiAqIEBwYXJhbSAge0lQb2ludH0gZW5kUG9pbnQgIOe7k+adn+eCuSwg5YyF5ZCrIHgseVxuICogQHBhcmFtICB7TnVtYmVyfSBwZXJjZW50ICAg55u45a+55L2N572uLOiMg+WbtCAwLTFcbiAqIEBwYXJhbSAge051bWJlcn0gb2Zmc2V0ICAgIOWBj+enu+mHj1xuICogQHJldHVybiB7SVBvaW50fSDmjqfliLbngrnvvIzljIXlkKsgeCx5XG4gKi9cblxuZXhwb3J0IHZhciBnZXRDb250cm9sUG9pbnQgPSBmdW5jdGlvbiBnZXRDb250cm9sUG9pbnQoc3RhcnRQb2ludCwgZW5kUG9pbnQsIHBlcmNlbnQsIG9mZnNldCkge1xuICBpZiAocGVyY2VudCA9PT0gdm9pZCAwKSB7XG4gICAgcGVyY2VudCA9IDA7XG4gIH1cblxuICBpZiAob2Zmc2V0ID09PSB2b2lkIDApIHtcbiAgICBvZmZzZXQgPSAwO1xuICB9XG5cbiAgdmFyIHBvaW50ID0ge1xuICAgIHg6ICgxIC0gcGVyY2VudCkgKiBzdGFydFBvaW50LnggKyBwZXJjZW50ICogZW5kUG9pbnQueCxcbiAgICB5OiAoMSAtIHBlcmNlbnQpICogc3RhcnRQb2ludC55ICsgcGVyY2VudCAqIGVuZFBvaW50LnlcbiAgfTtcbiAgdmFyIHRhbmdlbnQgPSBbMCwgMF07XG4gIHZlYzIubm9ybWFsaXplKHRhbmdlbnQsIFtlbmRQb2ludC54IC0gc3RhcnRQb2ludC54LCBlbmRQb2ludC55IC0gc3RhcnRQb2ludC55XSk7XG5cbiAgaWYgKCF0YW5nZW50IHx8ICF0YW5nZW50WzBdICYmICF0YW5nZW50WzFdKSB7XG4gICAgdGFuZ2VudCA9IFswLCAwXTtcbiAgfVxuXG4gIHZhciBwZXJwZW5kaWN1bGFyID0gWy10YW5nZW50WzFdICogb2Zmc2V0LCB0YW5nZW50WzBdICogb2Zmc2V0XTsgLy8g5Z6C55u05ZCR6YePXG5cbiAgcG9pbnQueCArPSBwZXJwZW5kaWN1bGFyWzBdO1xuICBwb2ludC55ICs9IHBlcnBlbmRpY3VsYXJbMV07XG4gIHJldHVybiBwb2ludDtcbn07XG4vKipcbiAqIOeCuembhui9rOWMluS4ulBhdGjlpJrovrnlvaJcbiAqIEBwYXJhbSB7QXJyYXl9IHBvaW50cyDngrnpm4ZcbiAqIEBwYXJhbSB7Qm9vbGVufSB6IOaYr+WQpuWwgemXrVxuICogQHJldHVybiB7QXJyYXl9IFBhdGhcbiAqL1xuXG5leHBvcnQgdmFyIHBvaW50c1RvUG9seWdvbiA9IGZ1bmN0aW9uIHBvaW50c1RvUG9seWdvbihwb2ludHMsIHopIHtcbiAgdmFyIGxlbmd0aCA9IHBvaW50cy5sZW5ndGg7XG5cbiAgaWYgKCFsZW5ndGgpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICB2YXIgcGF0aCA9ICcnO1xuICB2YXIgc3RyID0gJyc7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgIHZhciBpdGVtID0gcG9pbnRzW2ldO1xuXG4gICAgaWYgKGkgPT09IDApIHtcbiAgICAgIHN0ciA9ICdNe3h9IHt5fSc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ciA9ICdMe3h9IHt5fSc7XG4gICAgfVxuXG4gICAgcGF0aCArPSBzdWJzdGl0dXRlKHN0ciwgaXRlbSk7XG4gIH1cblxuICBpZiAoeikge1xuICAgIHBhdGggKz0gJ1onO1xuICB9XG5cbiAgcmV0dXJuIHBhdGg7XG59O1xuZXhwb3J0IHZhciBwYXRoVG9Qb2ludHMgPSBmdW5jdGlvbiBwYXRoVG9Qb2ludHMocGF0aCkge1xuICB2YXIgcG9pbnRzID0gW107XG4gIHBhdGguZm9yRWFjaChmdW5jdGlvbiAoc2VnKSB7XG4gICAgdmFyIGNvbW1hbmQgPSBzZWdbMF07XG5cbiAgICBpZiAoY29tbWFuZCAhPT0gJ0EnKSB7XG4gICAgICBmb3IgKHZhciBpID0gMTsgaSA8IHNlZy5sZW5ndGg7IGkgPSBpICsgMikge1xuICAgICAgICBwb2ludHMucHVzaChbc2VnW2ldLCBzZWdbaSArIDFdXSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBsZW5ndGhfMSA9IHNlZy5sZW5ndGg7XG4gICAgICBwb2ludHMucHVzaChbc2VnW2xlbmd0aF8xIC0gMl0sIHNlZ1tsZW5ndGhfMSAtIDFdXSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHBvaW50cztcbn07XG4vKipcbiAqIOeUn+aIkOW5s+a7keeahOmXreWQiOabsue6v1xuICogQHBhcmFtIHBvaW50c1xuICovXG5cbmV4cG9ydCB2YXIgZ2V0Q2xvc2VkU3BsaW5lID0gZnVuY3Rpb24gZ2V0Q2xvc2VkU3BsaW5lKHBvaW50cykge1xuICBpZiAocG9pbnRzLmxlbmd0aCA8IDIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJwb2ludCBsZW5ndGggbXVzdCBsYXJnbiB0aGFuIDIsIG5vdyBpdCdzIFwiICsgcG9pbnRzLmxlbmd0aCk7XG4gIH1cblxuICB2YXIgZmlyc3QgPSBwb2ludHNbMF07XG4gIHZhciBzZWNvbmQgPSBwb2ludHNbMV07XG4gIHZhciBsYXN0ID0gcG9pbnRzW3BvaW50cy5sZW5ndGggLSAxXTtcbiAgdmFyIGxhc3RTZWNvbmQgPSBwb2ludHNbcG9pbnRzLmxlbmd0aCAtIDJdO1xuICBwb2ludHMudW5zaGlmdChsYXN0KTtcbiAgcG9pbnRzLnVuc2hpZnQobGFzdFNlY29uZCk7XG4gIHBvaW50cy5wdXNoKGZpcnN0KTtcbiAgcG9pbnRzLnB1c2goc2Vjb25kKTtcbiAgdmFyIGNsb3NlZFBhdGggPSBbXTtcblxuICBmb3IgKHZhciBpID0gMTsgaSA8IHBvaW50cy5sZW5ndGggLSAyOyBpICs9IDEpIHtcbiAgICB2YXIgeDAgPSBwb2ludHNbaSAtIDFdLng7XG4gICAgdmFyIHkwID0gcG9pbnRzW2kgLSAxXS55O1xuICAgIHZhciB4MSA9IHBvaW50c1tpXS54O1xuICAgIHZhciB5MSA9IHBvaW50c1tpXS55O1xuICAgIHZhciB4MiA9IHBvaW50c1tpICsgMV0ueDtcbiAgICB2YXIgeTIgPSBwb2ludHNbaSArIDFdLnk7XG4gICAgdmFyIHgzID0gaSAhPT0gcG9pbnRzLmxlbmd0aCAtIDIgPyBwb2ludHNbaSArIDJdLnggOiB4MjtcbiAgICB2YXIgeTMgPSBpICE9PSBwb2ludHMubGVuZ3RoIC0gMiA/IHBvaW50c1tpICsgMl0ueSA6IHkyO1xuICAgIHZhciBjcDF4ID0geDEgKyAoeDIgLSB4MCkgLyA2O1xuICAgIHZhciBjcDF5ID0geTEgKyAoeTIgLSB5MCkgLyA2O1xuICAgIHZhciBjcDJ4ID0geDIgLSAoeDMgLSB4MSkgLyA2O1xuICAgIHZhciBjcDJ5ID0geTIgLSAoeTMgLSB5MSkgLyA2O1xuICAgIGNsb3NlZFBhdGgucHVzaChbJ0MnLCBjcDF4LCBjcDF5LCBjcDJ4LCBjcDJ5LCB4MiwgeTJdKTtcbiAgfVxuXG4gIGNsb3NlZFBhdGgudW5zaGlmdChbJ00nLCBsYXN0LngsIGxhc3QueV0pO1xuICByZXR1cm4gY2xvc2VkUGF0aDtcbn07XG5cbnZhciB2ZWNTY2FsZVRvID0gZnVuY3Rpb24gdmVjU2NhbGVUbyh2LCBsZW5ndGgpIHtcbiAgLy8gVmVjdG9yIHdpdGggZGlyZWN0aW9uIG9mIHYgd2l0aCBzcGVjaWZpZWQgbGVuZ3RoXG4gIHJldHVybiB2ZWMyLnNjYWxlKFswLCAwXSwgdmVjMi5ub3JtYWxpemUoWzAsIDBdLCB2KSwgbGVuZ3RoKTtcbn07XG5cbnZhciB1bml0Tm9ybWFsID0gZnVuY3Rpb24gdW5pdE5vcm1hbChwMCwgcDEpIHtcbiAgLy8gUmV0dXJucyB0aGUgdW5pdCBub3JtYWwgdG8gdGhlIGxpbmUgc2VnbWVudCBmcm9tIHAwIHRvIHAxLlxuICB2YXIgbiA9IFtwMFsxXSAtIHAxWzFdLCBwMVswXSAtIHAwWzBdXTtcbiAgdmFyIG5MZW5ndGggPSBNYXRoLnNxcnQoblswXSAqIG5bMF0gKyBuWzFdICogblsxXSk7XG5cbiAgaWYgKG5MZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3AwIHNob3VsZCBub3QgYmUgZXF1YWwgdG8gcDEnKTtcbiAgfVxuXG4gIHJldHVybiBbblswXSAvIG5MZW5ndGgsIG5bMV0gLyBuTGVuZ3RoXTtcbn07XG5cbnZhciB2ZWNGcm9tID0gZnVuY3Rpb24gdmVjRnJvbShwMCwgcDEpIHtcbiAgLy8gVmVjdG9yIGZyb20gcDAgdG8gcDFcbiAgcmV0dXJuIFtwMVswXSAtIHAwWzBdLCBwMVsxXSAtIHAwWzFdXTtcbn07XG4vKipcbiAqIOS8oOWFpeeahOiKgueCueS9nOS4uuWkmui+ueW9oumhtueCue+8jOeUn+aIkOacieWchuinkueahOWkmui+ueW9olxuICogQHBhcmFtIHBvbHlQb2ludHMg5aSa6L655b2i6aG254K5XG4gKiBAcGFyYW0gcGFkZGluZyDlnKjljp/lpJrovrnlvaLln7rnoYDkuIrlop7liqDmnIDnu4jova7lu5Plkozljp/lpJrovrnlvaLnmoTnqbrnmb3pl7TpmpRcbiAqL1xuXG5cbmV4cG9ydCBmdW5jdGlvbiByb3VuZGVkSHVsbChwb2x5UG9pbnRzLCBwYWRkaW5nKSB7XG4gIC8vIFRoZSByb3VuZGVkIGh1bGwgcGF0aCBhcm91bmQgYSBzaW5nbGUgcG9pbnRcbiAgdmFyIHJvdW5kZWRIdWxsMSA9IGZ1bmN0aW9uIHJvdW5kZWRIdWxsMShwb2ludHMpIHtcbiAgICB2YXIgcDEgPSBbcG9pbnRzWzBdWzBdLCBwb2ludHNbMF1bMV0gLSBwYWRkaW5nXTtcbiAgICB2YXIgcDIgPSBbcG9pbnRzWzBdWzBdLCBwb2ludHNbMF1bMV0gKyBwYWRkaW5nXTtcbiAgICByZXR1cm4gXCJNIFwiICsgcDEgKyBcIiBBIFwiICsgcGFkZGluZyArIFwiLFwiICsgcGFkZGluZyArIFwiLDAsMCwwLFwiICsgcDIgKyBcIiBBIFwiICsgcGFkZGluZyArIFwiLFwiICsgcGFkZGluZyArIFwiLDAsMCwwLFwiICsgcDE7XG4gIH07IC8vIFRoZSByb3VuZGVkIGh1bGwgcGF0aCBhcm91bmQgdHdvIHBvaW50c1xuXG5cbiAgdmFyIHJvdW5kZWRIdWxsMiA9IGZ1bmN0aW9uIHJvdW5kZWRIdWxsMihwb2ludHMpIHtcbiAgICB2YXIgb2Zmc2V0VmVjdG9yID0gdmVjMi5zY2FsZShbMCwgMF0sIHVuaXROb3JtYWwocG9pbnRzWzBdLCBwb2ludHNbMV0pLCBwYWRkaW5nKTtcbiAgICB2YXIgaW52T2Zmc2V0VmVjdG9yID0gdmVjMi5zY2FsZShbMCwgMF0sIG9mZnNldFZlY3RvciwgLTEpO1xuICAgIHZhciBwMCA9IHZlYzIuYWRkKFswLCAwXSwgcG9pbnRzWzBdLCBvZmZzZXRWZWN0b3IpO1xuICAgIHZhciBwMSA9IHZlYzIuYWRkKFswLCAwXSwgcG9pbnRzWzFdLCBvZmZzZXRWZWN0b3IpO1xuICAgIHZhciBwMiA9IHZlYzIuYWRkKFswLCAwXSwgcG9pbnRzWzFdLCBpbnZPZmZzZXRWZWN0b3IpO1xuICAgIHZhciBwMyA9IHZlYzIuYWRkKFswLCAwXSwgcG9pbnRzWzBdLCBpbnZPZmZzZXRWZWN0b3IpO1xuICAgIHJldHVybiBcIk0gXCIgKyBwMCArIFwiIEwgXCIgKyBwMSArIFwiIEEgXCIgKyBbcGFkZGluZywgcGFkZGluZywgJzAsMCwwJywgcDJdLmpvaW4oJywnKSArIFwiIEwgXCIgKyBwMyArIFwiIEEgXCIgKyBbcGFkZGluZywgcGFkZGluZywgJzAsMCwwJywgcDBdLmpvaW4oJywnKTtcbiAgfTsgLy8g54m55q6K5oOF5Ya15aSE55CG77ya6IqC54K55pWw5bCP5LqO562J5LqOMlxuXG5cbiAgaWYgKCFwb2x5UG9pbnRzIHx8IHBvbHlQb2ludHMubGVuZ3RoIDwgMSkgcmV0dXJuICcnO1xuICBpZiAocG9seVBvaW50cy5sZW5ndGggPT09IDEpIHJldHVybiByb3VuZGVkSHVsbDEocG9seVBvaW50cyk7XG4gIGlmIChwb2x5UG9pbnRzLmxlbmd0aCA9PT0gMikgcmV0dXJuIHJvdW5kZWRIdWxsMihwb2x5UG9pbnRzKTtcbiAgdmFyIHNlZ21lbnRzID0gbmV3IEFycmF5KHBvbHlQb2ludHMubGVuZ3RoKTsgLy8gQ2FsY3VsYXRlIGVhY2ggb2Zmc2V0IChvdXR3YXJkcykgc2VnbWVudCBvZiB0aGUgY29udmV4IGh1bGwuXG5cbiAgZm9yICh2YXIgc2VnbWVudEluZGV4ID0gMDsgc2VnbWVudEluZGV4IDwgc2VnbWVudHMubGVuZ3RoOyArK3NlZ21lbnRJbmRleCkge1xuICAgIHZhciBwMCA9IHNlZ21lbnRJbmRleCA9PT0gMCA/IHBvbHlQb2ludHNbcG9seVBvaW50cy5sZW5ndGggLSAxXSA6IHBvbHlQb2ludHNbc2VnbWVudEluZGV4IC0gMV07XG4gICAgdmFyIHAxID0gcG9seVBvaW50c1tzZWdtZW50SW5kZXhdOyAvLyBDb21wdXRlIHRoZSBvZmZzZXQgdmVjdG9yIGZvciB0aGUgbGluZSBzZWdtZW50LCB3aXRoIGxlbmd0aCA9IHBhZGRpbmcuXG5cbiAgICB2YXIgb2Zmc2V0ID0gdmVjMi5zY2FsZShbMCwgMF0sIHVuaXROb3JtYWwocDAsIHAxKSwgcGFkZGluZyk7XG4gICAgc2VnbWVudHNbc2VnbWVudEluZGV4XSA9IFt2ZWMyLmFkZChbMCwgMF0sIHAwLCBvZmZzZXQpLCB2ZWMyLmFkZChbMCwgMF0sIHAxLCBvZmZzZXQpXTtcbiAgfVxuXG4gIHZhciBhcmNEYXRhID0gXCJBIFwiICsgW3BhZGRpbmcsIHBhZGRpbmcsICcwLDAsMCwnXS5qb2luKCcsJyk7XG4gIHNlZ21lbnRzID0gc2VnbWVudHMubWFwKGZ1bmN0aW9uIChzZWdtZW50LCBpbmRleCkge1xuICAgIHZhciBwYXRoRnJhZ21lbnQgPSAnJztcblxuICAgIGlmIChpbmRleCA9PT0gMCkge1xuICAgICAgcGF0aEZyYWdtZW50ID0gXCJNIFwiICsgc2VnbWVudHNbc2VnbWVudHMubGVuZ3RoIC0gMV1bMV0gKyBcIiBcIjtcbiAgICB9XG5cbiAgICBwYXRoRnJhZ21lbnQgKz0gYXJjRGF0YSArIHNlZ21lbnRbMF0gKyBcIiBMIFwiICsgc2VnbWVudFsxXTtcbiAgICByZXR1cm4gcGF0aEZyYWdtZW50O1xuICB9KTtcbiAgcmV0dXJuIHNlZ21lbnRzLmpvaW4oJyAnKTtcbn1cbi8qKlxuICog5Lyg5YWl55qE6IqC54K55L2c5Li65aSa6L655b2i6aG254K577yM55Sf5oiQ5bmz5ruR55qE6Zet5ZCI5aSa6L655b2iXG4gKiBAcGFyYW0gcG9seVBvaW50c1xuICogQHBhcmFtIHBhZGRpbmdcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcGFkZGVkSHVsbChwb2x5UG9pbnRzLCBwYWRkaW5nKSB7XG4gIHZhciBwb2ludENvdW50ID0gcG9seVBvaW50cy5sZW5ndGg7XG5cbiAgdmFyIHNtb290aEh1bGwxID0gZnVuY3Rpb24gc21vb3RoSHVsbDEocG9pbnRzKSB7XG4gICAgLy8gUmV0dXJucyB0aGUgcGF0aCBmb3IgYSBjaXJjdWxhciBodWxsIGFyb3VuZCBhIHNpbmdsZSBwb2ludC5cbiAgICB2YXIgcDEgPSBbcG9pbnRzWzBdWzBdLCBwb2ludHNbMF1bMV0gLSBwYWRkaW5nXTtcbiAgICB2YXIgcDIgPSBbcG9pbnRzWzBdWzBdLCBwb2ludHNbMF1bMV0gKyBwYWRkaW5nXTtcbiAgICByZXR1cm4gXCJNIFwiICsgcDEgKyBcIiBBIFwiICsgW3BhZGRpbmcsIHBhZGRpbmcsICcwLDAsMCcsIHAyXS5qb2luKCcsJykgKyBcIiBBIFwiICsgW3BhZGRpbmcsIHBhZGRpbmcsICcwLDAsMCcsIHAxXS5qb2luKCcsJyk7XG4gIH07IC8vIFJldHVybnMgdGhlIHBhdGggZm9yIGEgcm91bmRlZCBodWxsIGFyb3VuZCB0d28gcG9pbnRzLlxuXG5cbiAgdmFyIHNtb290aEh1bGwyID0gZnVuY3Rpb24gc21vb3RoSHVsbDIocG9pbnRzKSB7XG4gICAgdmFyIHYgPSB2ZWNGcm9tKHBvaW50c1swXSwgcG9pbnRzWzFdKTtcbiAgICB2YXIgZXh0ZW5zaW9uVmVjID0gdmVjU2NhbGVUbyh2LCBwYWRkaW5nKTtcbiAgICB2YXIgZXh0ZW5zaW9uMCA9IHZlYzIuYWRkKFswLCAwXSwgcG9pbnRzWzBdLCB2ZWMyLnNjYWxlKFswLCAwXSwgZXh0ZW5zaW9uVmVjLCAtMSkpO1xuICAgIHZhciBleHRlbnNpb24xID0gdmVjMi5hZGQoWzAsIDBdLCBwb2ludHNbMV0sIGV4dGVuc2lvblZlYyk7XG4gICAgdmFyIHRhbmdlbnRIYWxmTGVuZ3RoID0gMS4yICogcGFkZGluZztcbiAgICB2YXIgY29udHJvbERlbHRhID0gdmVjU2NhbGVUbyh2ZWMyLm5vcm1hbGl6ZShbMCwgMF0sIHYpLCB0YW5nZW50SGFsZkxlbmd0aCk7XG4gICAgdmFyIGludkNvbnRyb2xEZWx0YSA9IHZlYzIuc2NhbGUoWzAsIDBdLCBjb250cm9sRGVsdGEsIC0xKTtcbiAgICB2YXIgY29udHJvbDAgPSB2ZWMyLmFkZChbMCwgMF0sIGV4dGVuc2lvbjAsIGludkNvbnRyb2xEZWx0YSk7XG4gICAgdmFyIGNvbnRyb2wxID0gdmVjMi5hZGQoWzAsIDBdLCBleHRlbnNpb24xLCBpbnZDb250cm9sRGVsdGEpO1xuICAgIHZhciBjb250cm9sMyA9IHZlYzIuYWRkKFswLCAwXSwgZXh0ZW5zaW9uMCwgY29udHJvbERlbHRhKTsgLy8gcmV0dXJuIFtcbiAgICAvLyAgIFsnTScsIGV4dGVuc2lvbjBbMF0sIGV4dGVuc2lvbjBbMV1dLFxuICAgIC8vICAgWydDJywgY29udHJvbDAsIGNvbnRyb2wxLCBleHRlbnNpb24xXSxcbiAgICAvLyAgIFsnUycsIGNvbnRyb2wzLCBleHRlbnNpb24wXSxcbiAgICAvLyAgICdaJyxcbiAgICAvLyBdO1xuXG4gICAgcmV0dXJuIFwiTSBcIiArIGV4dGVuc2lvbjAgKyBcIiBDIFwiICsgW2NvbnRyb2wwLCBjb250cm9sMSwgZXh0ZW5zaW9uMV0uam9pbignLCcpICsgXCIgUyBcIiArIFtjb250cm9sMywgZXh0ZW5zaW9uMF0uam9pbignLCcpICsgXCIgWlwiO1xuICB9OyAvLyBIYW5kbGUgc3BlY2lhbCBjYXNlc1xuXG5cbiAgaWYgKCFwb2x5UG9pbnRzIHx8IHBvaW50Q291bnQgPCAxKSByZXR1cm4gJyc7XG4gIGlmIChwb2ludENvdW50ID09PSAxKSByZXR1cm4gc21vb3RoSHVsbDEocG9seVBvaW50cyk7XG4gIGlmIChwb2ludENvdW50ID09PSAyKSByZXR1cm4gc21vb3RoSHVsbDIocG9seVBvaW50cyk7XG4gIHZhciBodWxsUG9pbnRzID0gcG9seVBvaW50cy5tYXAoZnVuY3Rpb24gKHBvaW50LCBpbmRleCkge1xuICAgIHZhciBwTmV4dCA9IHBvbHlQb2ludHNbKGluZGV4ICsgMSkgJSBwb2ludENvdW50XTtcbiAgICByZXR1cm4ge1xuICAgICAgcDogcG9pbnQsXG4gICAgICB2OiB2ZWMyLm5vcm1hbGl6ZShbMCwgMF0sIHZlY0Zyb20ocG9pbnQsIHBOZXh0KSlcbiAgICB9O1xuICB9KTsgLy8gQ29tcHV0ZSB0aGUgZXhwYW5kZWQgaHVsbCBwb2ludHMsIGFuZCB0aGUgbmVhcmVzdCBwcmlvciBjb250cm9sIHBvaW50IGZvciBlYWNoLlxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgaHVsbFBvaW50cy5sZW5ndGg7ICsraSkge1xuICAgIHZhciBwcmlvckluZGV4ID0gaSA+IDAgPyBpIC0gMSA6IHBvaW50Q291bnQgLSAxO1xuICAgIHZhciBleHRlbnNpb25WZWMgPSB2ZWMyLm5vcm1hbGl6ZShbMCwgMF0sIHZlYzIuYWRkKFswLCAwXSwgaHVsbFBvaW50c1twcmlvckluZGV4XS52LCB2ZWMyLnNjYWxlKFswLCAwXSwgaHVsbFBvaW50c1tpXS52LCAtMSkpKTtcbiAgICBodWxsUG9pbnRzW2ldLnAgPSB2ZWMyLmFkZChbMCwgMF0sIGh1bGxQb2ludHNbaV0ucCwgdmVjMi5zY2FsZShbMCwgMF0sIGV4dGVuc2lvblZlYywgcGFkZGluZykpO1xuICB9XG5cbiAgcmV0dXJuIGh1bGxQb2ludHMubWFwKGZ1bmN0aW9uIChvYmopIHtcbiAgICB2YXIgcG9pbnQgPSBvYmoucDtcbiAgICByZXR1cm4ge1xuICAgICAgeDogcG9pbnRbMF0sXG4gICAgICB5OiBwb2ludFsxXVxuICAgIH07XG4gIH0pO1xufSIsIi8qKlxuICogVXNlIGNyb3NzIHByb2R1Y3QgdG8ganVkZ2UgdGhlIGRpcmVjdGlvbiBvZiB0aGUgdHVybi5cbiAqIFJldHVybnMgYSBwb3NpdGl2ZSB2YWx1ZSwgaWYgT0FCIG1ha2VzIGEgY2xvY2t3aXNlIHR1cm4sXG4gKiBuZWdhdGl2ZSBmb3IgY291bnRlci1jbG9ja3dpc2UgdHVybiwgYW5kIHplcm8gaWYgdGhlIHBvaW50cyBhcmUgY29sbGluZWFyLlxuICovXG5leHBvcnQgdmFyIGNyb3NzID0gZnVuY3Rpb24gY3Jvc3MoYSwgYiwgbykge1xuICByZXR1cm4gKGEueSAtIG8ueSkgKiAoYi54IC0gby54KSAtIChhLnggLSBvLngpICogKGIueSAtIG8ueSk7XG59O1xuLyoqXG4gKiBHZW5lcmF0ZSBhIGNvbnZleCBodWxsIG9mIGdpdmVuIHBvaW50cy4gQW5kcmV3J3MgbW9ub3RvbmUgY2hhaW4gYWxnb3JpdGhtLlxuICogQHBhcmFtIHBvaW50cyBBbiBhcnJheSBvZiBbeCwgeV0gcmVwcmVzZW50aW5nIHRoZSBjb29yZGluYXRlcyBvZiBwb2ludHMuXG4gKiBAcmV0dXJuIGEgbGlzdCBvZiB2ZXJ0aWNlcyBvZiB0aGUgY29udmV4IGh1bGwgaW4gY291bnRlci1jbG9ja3dpc2Ugb3JkZXIsXG4gKi9cblxuZXhwb3J0IHZhciBnZW5Db252ZXhIdWxsID0gZnVuY3Rpb24gZ2VuQ29udmV4SHVsbChpdGVtcykge1xuICB2YXIgcG9pbnRzID0gaXRlbXMubWFwKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IGl0ZW0uZ2V0TW9kZWwoKS54LFxuICAgICAgeTogaXRlbS5nZXRNb2RlbCgpLnlcbiAgICB9O1xuICB9KTtcbiAgcG9pbnRzLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICByZXR1cm4gYS54ID09PSBiLnggPyBhLnkgLSBiLnkgOiBhLnggLSBiLng7XG4gIH0pO1xuXG4gIGlmIChwb2ludHMubGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIHBvaW50cztcbiAgfSAvLyBidWlsZCB0aGUgbG93ZXIgaHVsbFxuXG5cbiAgdmFyIGxvd2VyID0gW107XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb2ludHMubGVuZ3RoOyBpKyspIHtcbiAgICB3aGlsZSAobG93ZXIubGVuZ3RoID49IDIgJiYgY3Jvc3MobG93ZXJbbG93ZXIubGVuZ3RoIC0gMl0sIGxvd2VyW2xvd2VyLmxlbmd0aCAtIDFdLCBwb2ludHNbaV0pIDw9IDApIHtcbiAgICAgIGxvd2VyLnBvcCgpO1xuICAgIH1cblxuICAgIGxvd2VyLnB1c2gocG9pbnRzW2ldKTtcbiAgfSAvLyBidWlsZCB0aGUgdXBwZXIgaHVsbFxuXG5cbiAgdmFyIHVwcGVyID0gW107XG5cbiAgZm9yICh2YXIgaSA9IHBvaW50cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIHdoaWxlICh1cHBlci5sZW5ndGggPj0gMiAmJiBjcm9zcyh1cHBlclt1cHBlci5sZW5ndGggLSAyXSwgdXBwZXJbdXBwZXIubGVuZ3RoIC0gMV0sIHBvaW50c1tpXSkgPD0gMCkge1xuICAgICAgdXBwZXIucG9wKCk7XG4gICAgfVxuXG4gICAgdXBwZXIucHVzaChwb2ludHNbaV0pO1xuICB9XG5cbiAgdXBwZXIucG9wKCk7XG4gIGxvd2VyLnBvcCgpO1xuICB2YXIgc3RyaWN0SHVsbCA9IGxvd2VyLmNvbmNhdCh1cHBlcik7XG4gIHJldHVybiBzdHJpY3RIdWxsO1xufTsiLCJpbXBvcnQgeyBzcXVhcmVEaXN0LCBwb2ludExpbmVTcXVhcmVEaXN0LCBpdGVtSW50ZXJzZWN0QnlMaW5lLCBnZXRQb2ludHNDZW50ZXIsIGZyYWN0aW9uVG9MaW5lLCBpc1BvaW50c092ZXJsYXAsIHBvaW50UmVjdFNxdWFyZURpc3QsIExpbmUsIGlzUG9pbnRJblBvbHlnb24gfSBmcm9tICcuLi8uLi91dGlsL21hdGgnO1xudmFyIGRlZmF1bHRPcHMgPSB7XG4gIG1heFJvdXRpbmdJdGVyYXRpb25zOiAxMDAsXG4gIG1heE1hcmNoaW5nSXRlcmF0aW9uczogMTAwLFxuICBwaXhlbEdyb3VwU2l6ZTogMixcbiAgZWRnZVIwOiAxMCxcbiAgZWRnZVIxOiAxMCxcbiAgbm9kZVIwOiA1LFxuICBub2RlUjE6IDEwLFxuICBtb3JwaEJ1ZmZlcjogNSxcbiAgdGhyZXNob2xkOiAwLjAwMSxcbiAgc2tpcDogMTYsXG4gIG5vZGVJbmZsdWVuY2VGYWN0b3I6IDEsXG4gIGVkZ2VJbmZsdWVuY2VGYWN0b3I6IDEsXG4gIG5lZ2F0aXZlTm9kZUluZmx1ZW5jZUZhY3RvcjogLTAuNVxufTtcbi8qKlxuICogTWFyY2hpbmcgc3F1YXJlIGFsZ29yaXRobSBmb3IgdHJhY2hpbmcgdGhlIGNvbnRvdXIgb2YgYSBwaXhlbCBncm91cFxuICogaHR0cHM6Ly93d3cuZW1hbnVlbGVmZXJvbmF0by5jb20vMjAxMy8wMy8wMS91c2luZy1tYXJjaGluZy1zcXVhcmVzLWFsZ29yaXRobS10by10cmFjZS10aGUtY29udG91ci1vZi1hbi1pbWFnZS9cbiAqIEBwYXJhbSBwb3RlbnRpYWxBcmVhXG4gKiBAcGFyYW0gdGhyZXNob2xkXG4gKi9cblxuZnVuY3Rpb24gTWFyY2hpbmdTcXVhcmVzKGNvbnRvdXIsIHBvdGVudGlhbEFyZWEsIHRocmVzaG9sZCkge1xuICB2YXIgbWFyY2hlZCA9IGZhbHNlO1xuXG4gIHZhciBnZXRWYWwgPSBmdW5jdGlvbiBnZXRWYWwoeCwgeSkge1xuICAgIHJldHVybiBwb3RlbnRpYWxBcmVhLmNlbGxzW3ggKyB5ICogcG90ZW50aWFsQXJlYS53aWR0aF07XG4gIH07XG5cbiAgdmFyIGdldFN0YXRlID0gZnVuY3Rpb24gZ2V0U3RhdGUoeCwgeSkge1xuICAgIHZhciBzcXVhcmVWYWwgPSAwO1xuXG4gICAgaWYgKGdldFZhbCh4IC0gMSwgeSAtIDEpID49IHRocmVzaG9sZCkge1xuICAgICAgc3F1YXJlVmFsICs9IDE7XG4gICAgfVxuXG4gICAgaWYgKGdldFZhbCh4LCB5IC0gMSkgPiB0aHJlc2hvbGQpIHtcbiAgICAgIHNxdWFyZVZhbCArPSAyO1xuICAgIH1cblxuICAgIGlmIChnZXRWYWwoeCAtIDEsIHkpID4gdGhyZXNob2xkKSB7XG4gICAgICBzcXVhcmVWYWwgKz0gNDtcbiAgICB9XG5cbiAgICBpZiAoZ2V0VmFsKHgsIHkpID4gdGhyZXNob2xkKSB7XG4gICAgICBzcXVhcmVWYWwgKz0gODtcbiAgICB9XG5cbiAgICByZXR1cm4gc3F1YXJlVmFsO1xuICB9O1xuXG4gIHZhciBkb01hcmNoID0gZnVuY3Rpb24gZG9NYXJjaCh4UG9zLCB5UG9zKSB7XG4gICAgdmFyIHggPSB4UG9zO1xuICAgIHZhciB5ID0geVBvcztcbiAgICB2YXIgcHJldlg7XG4gICAgdmFyIHByZXZZO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb3RlbnRpYWxBcmVhLndpZHRoICogcG90ZW50aWFsQXJlYS5oZWlnaHQ7IGkrKykge1xuICAgICAgcHJldlggPSB4O1xuICAgICAgcHJldlkgPSB5O1xuXG4gICAgICBpZiAoY29udG91ci5maW5kSW5kZXgoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgcmV0dXJuIGl0ZW0ueCA9PT0geCAmJiBpdGVtLnkgPT09IHk7XG4gICAgICB9KSA+IC0xKSB7XG4gICAgICAgIGlmIChjb250b3VyWzBdLnggIT09IHggfHwgY29udG91clswXS55ICE9PSB5KSB7Ly8gZW5jb3VudGVyZWQgYSBsb29wIGJ1dCBoYXZlbid0IHJldHVybmVkIHRvIHN0YXJ0OiBjaGFuZ2UgZGlyZWN0aW9uIHVzaW5nIGNvbmRpdGlvbmFscyBhbmQgY29udGludWUgYmFjayB0byBzdGFydFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb250b3VyLnB1c2goe1xuICAgICAgICAgIHg6IHgsXG4gICAgICAgICAgeTogeVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgdmFyIHN0YXRlID0gZ2V0U3RhdGUoeCwgeSk7IC8vIGFzc2lnbiB0aGUgbW92ZSBkaXJlY3Rpb24gYWNjb3JkaW5nIHRvIHN0YXRlIG9mIHRoZSBzcXVhcmVcblxuICAgICAgc3dpdGNoIChzdGF0ZSkge1xuICAgICAgICBjYXNlIC0xOlxuICAgICAgICAgIGNvbnNvbGUud2FybignTWFyY2hlZCBvdXQgb2YgYm91bmRzJyk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICAgICAgY2FzZSAwOlxuICAgICAgICBjYXNlIDM6XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgY2FzZSA3OlxuICAgICAgICAgIHgrKzsgLy8gZ28gcmlnaHRcblxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgMTI6XG4gICAgICAgIGNhc2UgMTQ6XG4gICAgICAgIGNhc2UgNDpcbiAgICAgICAgICB4LS07IC8vIGdvIGxlZnRcblxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAvLyBnbyBsZWZ0IGlmIGNvbWUgZnJvbSB1cCBlbHNlIGdvIHJpZ2h0XG4gICAgICAgICAgaWYgKHByZXZYID09PSAwKSB7XG4gICAgICAgICAgICBpZiAocHJldlkgPT09IC0xKSB7XG4gICAgICAgICAgICAgIHggLT0gMTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHggKz0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDE6XG4gICAgICAgIGNhc2UgMTM6XG4gICAgICAgIGNhc2UgNTpcbiAgICAgICAgICB5LS07IC8vIGdvIHVwXG5cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgLy8gZ28gdXAgaWYgY29tZSBmcm9tIHJpZ2h0IGVsc2UgZ28gZG93blxuICAgICAgICAgIGlmIChwcmV2WCA9PT0gMSkge1xuICAgICAgICAgICAgaWYgKHByZXZZID09PSAwKSB7XG4gICAgICAgICAgICAgIHkgLT0gMTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHkgKz0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDEwOlxuICAgICAgICBjYXNlIDg6XG4gICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgeSsrOyAvLyBnbyBkb3duXG5cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGNvbnNvbGUud2FybihcIk1hcmNoaW5nIHNxdWFyZXMgaW52YWxpZCBzdGF0ZTogXCIgKyBzdGF0ZSk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHRoaXMubWFyY2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgZm9yICh2YXIgeCA9IDA7IHggPCBwb3RlbnRpYWxBcmVhLndpZHRoICYmICFtYXJjaGVkOyB4ICs9IDEpIHtcbiAgICAgIGZvciAodmFyIHkgPSAwOyB5IDwgcG90ZW50aWFsQXJlYS5oZWlnaHQgJiYgIW1hcmNoZWQ7IHkgKz0gMSkge1xuICAgICAgICBpZiAoZ2V0VmFsKHgsIHkpID4gdGhyZXNob2xkICYmIGdldFN0YXRlKHgsIHkpICE9PSAxNSkge1xuICAgICAgICAgIG1hcmNoZWQgPSBkb01hcmNoKHgsIHkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hcmNoZWQ7XG4gIH07XG59XG4vKipcbiAqIFNwYWNlIHBhcnRpdGlvbiAmIGFzc2lnbiB2YWx1ZSB0byBlYWNoIGNlbGxcbiAqIEBwYXJhbSBwb2ludHNcbiAqL1xuXG5cbnZhciBpbml0R3JpZENlbGxzID0gZnVuY3Rpb24gaW5pdEdyaWRDZWxscyh3aWR0aCwgaGVpZ2h0LCBwaXhlbEdyb3VwU2l6ZSkge1xuICB2YXIgc2NhbGVXaWR0aCA9IE1hdGguY2VpbCh3aWR0aCAvIHBpeGVsR3JvdXBTaXplKTtcbiAgdmFyIHNjYWxlSGVpZ2h0ID0gTWF0aC5jZWlsKGhlaWdodCAvIHBpeGVsR3JvdXBTaXplKTtcbiAgdmFyIGdyaWRDZWxscyA9IG5ldyBGbG9hdDMyQXJyYXkoTWF0aC5tYXgoMCwgc2NhbGVXaWR0aCAqIHNjYWxlSGVpZ2h0KSkuZmlsbCgwKTtcbiAgcmV0dXJuIHtcbiAgICBjZWxsczogZ3JpZENlbGxzLFxuICAgIHdpZHRoOiBzY2FsZVdpZHRoLFxuICAgIGhlaWdodDogc2NhbGVIZWlnaHRcbiAgfTtcbn07XG4vKipcbiAqIEZpbmQgdGhlIG9wdGltYWwgYWxyZWFkeSB2aXNpdGVkIG1lbWJlciB0byBpdGVtO1xuICAgT3B0aW1hbDogbWluaW1pemUgY29zdChqKSA9IGRpc3RhbmNlKGksaikg4oiXIGNvdW50T2JzdGFjbGVzKGksailcbiAqIEBwYXJhbSBpdGVtXG4gKiBAcGFyYW0gdmlzaXRlZFxuICovXG5cblxudmFyIHBpY2tCZXN0TmVpZ2hib3IgPSBmdW5jdGlvbiBwaWNrQmVzdE5laWdoYm9yKGl0ZW0sIHZpc2l0ZWQsIG5vbk1lbWJlcnMpIHtcbiAgdmFyIGNsb3Nlc3ROZWlnaGJvdXIgPSBudWxsO1xuICB2YXIgbWluQ29zdCA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcbiAgdmlzaXRlZC5mb3JFYWNoKGZ1bmN0aW9uIChuZWlnaGJvdXJJdGVtKSB7XG4gICAgdmFyIGl0ZW1QID0ge1xuICAgICAgeDogaXRlbS5nZXRNb2RlbCgpLngsXG4gICAgICB5OiBpdGVtLmdldE1vZGVsKCkueVxuICAgIH07XG4gICAgdmFyIG5laWdoYm91ckl0ZW1QID0ge1xuICAgICAgeDogbmVpZ2hib3VySXRlbS5nZXRNb2RlbCgpLngsXG4gICAgICB5OiBuZWlnaGJvdXJJdGVtLmdldE1vZGVsKCkueVxuICAgIH07XG4gICAgdmFyIGRpc3QgPSBzcXVhcmVEaXN0KGl0ZW1QLCBuZWlnaGJvdXJJdGVtUCk7XG4gICAgdmFyIGRpcmVjdExpbmUgPSBuZXcgTGluZShpdGVtUC54LCBpdGVtUC55LCBuZWlnaGJvdXJJdGVtUC54LCBuZWlnaGJvdXJJdGVtUC55KTtcbiAgICB2YXIgbnVtYmVyT2JzdGFjbGVzID0gbm9uTWVtYmVycy5yZWR1Y2UoZnVuY3Rpb24gKGNvdW50LCBfaXRlbSkge1xuICAgICAgaWYgKGZyYWN0aW9uVG9MaW5lKF9pdGVtLCBkaXJlY3RMaW5lKSA+IDApIHtcbiAgICAgICAgcmV0dXJuIGNvdW50ICsgMTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNvdW50O1xuICAgIH0sIDApO1xuXG4gICAgaWYgKGRpc3QgKiBNYXRoLnBvdyhudW1iZXJPYnN0YWNsZXMgKyAxLCAyKSA8IG1pbkNvc3QpIHtcbiAgICAgIGNsb3Nlc3ROZWlnaGJvdXIgPSBuZWlnaGJvdXJJdGVtO1xuICAgICAgbWluQ29zdCA9IGRpc3QgKiBNYXRoLnBvdyhudW1iZXJPYnN0YWNsZXMgKyAxLCAyKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gY2xvc2VzdE5laWdoYm91cjtcbn07XG4vKipcbiAqIOi/lOWbnuWSjOe6v+ebuOS6pOeahGl0ZW3kuK3vvIznprvovrnnmoTotbfngrnmnIDov5HnmoRpdGVtXG4gKiBAcGFyYW0gaXRlbXNcbiAqIEBwYXJhbSBsaW5lXG4gKi9cblxuXG52YXIgZ2V0SW50ZXJzZWN0SXRlbSA9IGZ1bmN0aW9uIGdldEludGVyc2VjdEl0ZW0oaXRlbXMsIGxpbmUpIHtcbiAgdmFyIG1pbkRpc3RhbmNlID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1xuICB2YXIgY2xvc2VzdEl0ZW0gPSBudWxsO1xuICBpdGVtcy5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgdmFyIGRpc3RhbmNlID0gZnJhY3Rpb25Ub0xpbmUoaXRlbSwgbGluZSk7IC8vIGZpbmQgY2xvc2VzdCBpbnRlcnNlY3Rpb25cblxuICAgIGlmIChkaXN0YW5jZSA+PSAwICYmIGRpc3RhbmNlIDwgbWluRGlzdGFuY2UpIHtcbiAgICAgIGNsb3Nlc3RJdGVtID0gaXRlbTtcbiAgICAgIG1pbkRpc3RhbmNlID0gZGlzdGFuY2U7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGNsb3Nlc3RJdGVtO1xufTtcbi8qKlxuICogTW9kaWZ5IHRoZSBkaXJlY3RMaW5lIGFuZCBSb3V0ZSB2aXJ0dWFsIGVkZ2VzIGFyb3VuZCBvYnN0YWNsZXNcbiAqL1xuXG5cbnZhciBjb21wdXRlUm91dGUgPSBmdW5jdGlvbiBjb21wdXRlUm91dGUoZGlyZWN0TGluZSwgbm9uTWVtYmVycywgbWF4Um91dGluZ0l0ZXJhdGlvbnMsIG1vcnBoQnVmZmVyKSB7XG4gIHZhciBjaGVja2VkTGluZXMgPSBbXTtcbiAgdmFyIGxpbmVzVG9DaGVjayA9IFtdO1xuICBsaW5lc1RvQ2hlY2sucHVzaChkaXJlY3RMaW5lKTtcbiAgdmFyIGhhc0ludGVyc2VjdGlvbiA9IHRydWU7XG4gIHZhciBpdGVyYXRpb25zID0gMDtcblxuICB2YXIgcG9pbnRFeGlzdHMgPSBmdW5jdGlvbiBwb2ludEV4aXN0cyhwb2ludCwgbGluZXMpIHtcbiAgICB2YXIgZmxhZyA9IGZhbHNlO1xuICAgIGxpbmVzLmZvckVhY2goZnVuY3Rpb24gKGxpbmUpIHtcbiAgICAgIGlmIChmbGFnKSByZXR1cm47XG5cbiAgICAgIGlmIChpc1BvaW50c092ZXJsYXAocG9pbnQsIHtcbiAgICAgICAgeDogbGluZS54MSxcbiAgICAgICAgeTogbGluZS55MVxuICAgICAgfSkgfHwgaXNQb2ludHNPdmVybGFwKHBvaW50LCB7XG4gICAgICAgIHg6IGxpbmUueDIsXG4gICAgICAgIHk6IGxpbmUueTJcbiAgICAgIH0pKSB7XG4gICAgICAgIGZsYWcgPSB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBmbGFnO1xuICB9O1xuXG4gIHZhciBpc1BvaW50SW5Ob25NZW1iZXJzID0gZnVuY3Rpb24gaXNQb2ludEluTm9uTWVtYmVycyhwb2ludCwgX25vbk1lbWJlcnMpIHtcbiAgICBmb3IgKHZhciBfaSA9IDAsIF9ub25NZW1iZXJzXzEgPSBfbm9uTWVtYmVyczsgX2kgPCBfbm9uTWVtYmVyc18xLmxlbmd0aDsgX2krKykge1xuICAgICAgdmFyIGl0ZW0gPSBfbm9uTWVtYmVyc18xW19pXTtcbiAgICAgIHZhciBiYm94ID0gaXRlbS5nZXRCQm94KCk7XG4gICAgICB2YXIgaXRlbUNvbnRvdXIgPSBbW2Jib3gueCwgYmJveC55XSwgW2Jib3gueCArIGJib3gud2lkdGgsIGJib3gueV0sIFtiYm94LngsIGJib3gueSArIGJib3guaGVpZ2h0XSwgW2Jib3gueCArIGJib3gud2lkdGgsIGJib3gueSArIGJib3guaGVpZ2h0XV07XG5cbiAgICAgIGlmIChpc1BvaW50SW5Qb2x5Z29uKGl0ZW1Db250b3VyLCBwb2ludC54LCBwb2ludC55KSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH07IC8vIG91dGVyIGxvb3AgZW5kIHdoZW4gbm8gbW9yZSBpbnRlcnNlY3Rpb25zIG9yIG91dCBvZiBpdGVyYXRpb25zXG5cblxuICB3aGlsZSAoaGFzSW50ZXJzZWN0aW9uICYmIGl0ZXJhdGlvbnMgPCBtYXhSb3V0aW5nSXRlcmF0aW9ucykge1xuICAgIGhhc0ludGVyc2VjdGlvbiA9IGZhbHNlO1xuXG4gICAgdmFyIF9sb29wXzEgPSBmdW5jdGlvbiBfbG9vcF8xKCkge1xuICAgICAgdmFyIGxpbmUgPSBsaW5lc1RvQ2hlY2sucG9wKCk7XG4gICAgICB2YXIgY2xvc2VzdEl0ZW0gPSBnZXRJbnRlcnNlY3RJdGVtKG5vbk1lbWJlcnMsIGxpbmUpO1xuXG4gICAgICBpZiAoY2xvc2VzdEl0ZW0pIHtcbiAgICAgICAgdmFyIF9hID0gaXRlbUludGVyc2VjdEJ5TGluZShjbG9zZXN0SXRlbSwgbGluZSksXG4gICAgICAgICAgICBpbnRlcnNlY3Rpb25zXzEgPSBfYVswXSxcbiAgICAgICAgICAgIGNvdW50SW50ZXJzZWN0aW9ucyA9IF9hWzFdOyAvLyBpZiBsaW5lIHBhc3NlcyB0aHJvdWdoIGl0ZW1cblxuXG4gICAgICAgIGlmIChjb3VudEludGVyc2VjdGlvbnMgPT09IDIpIHtcbiAgICAgICAgICB2YXIgdGVzdFJlcm91dGUgPSBmdW5jdGlvbiB0ZXN0UmVyb3V0ZShpc0ZpcnN0KSB7XG4gICAgICAgICAgICB2YXIgdGVtcE1vcnBoQnVmZmVyID0gbW9ycGhCdWZmZXI7XG4gICAgICAgICAgICB2YXIgdmlydHVhbE5vZGUgPSByZXJvdXRlTGluZShjbG9zZXN0SXRlbSwgdGVtcE1vcnBoQnVmZmVyLCBpbnRlcnNlY3Rpb25zXzEsIGlzRmlyc3QpOyAvLyB0ZXN0IHRoZSB2aXJ0dWFsTm9kZSBhbHJlYWR5IGV4aXN0c1xuXG4gICAgICAgICAgICB2YXIgZXhpc3QgPSBwb2ludEV4aXN0cyh2aXJ0dWFsTm9kZSwgbGluZXNUb0NoZWNrKSB8fCBwb2ludEV4aXN0cyh2aXJ0dWFsTm9kZSwgY2hlY2tlZExpbmVzKTtcbiAgICAgICAgICAgIHZhciBwb2ludEluc2lkZSA9IGlzUG9pbnRJbk5vbk1lbWJlcnModmlydHVhbE5vZGUsIG5vbk1lbWJlcnMpO1xuXG4gICAgICAgICAgICB3aGlsZSAoIWV4aXN0ICYmIHBvaW50SW5zaWRlICYmIHRlbXBNb3JwaEJ1ZmZlciA+PSAxKSB7XG4gICAgICAgICAgICAgIC8vIHRyeSBhIHNtYWxsZXIgYnVmZmVyXG4gICAgICAgICAgICAgIHRlbXBNb3JwaEJ1ZmZlciAvPSAxLjU7XG4gICAgICAgICAgICAgIHZpcnR1YWxOb2RlID0gcmVyb3V0ZUxpbmUoY2xvc2VzdEl0ZW0sIHRlbXBNb3JwaEJ1ZmZlciwgaW50ZXJzZWN0aW9uc18xLCBpc0ZpcnN0KTtcbiAgICAgICAgICAgICAgZXhpc3QgPSBwb2ludEV4aXN0cyh2aXJ0dWFsTm9kZSwgbGluZXNUb0NoZWNrKSB8fCBwb2ludEV4aXN0cyh2aXJ0dWFsTm9kZSwgY2hlY2tlZExpbmVzKTtcbiAgICAgICAgICAgICAgcG9pbnRJbnNpZGUgPSBpc1BvaW50SW5Ob25NZW1iZXJzKHZpcnR1YWxOb2RlLCBub25NZW1iZXJzKTtcbiAgICAgICAgICAgIH0gLy8g56ys5LqM5qyhcm91dGXml7bkuI3opoHmsYJwb2ludEluc2lkZVxuXG5cbiAgICAgICAgICAgIGlmICh2aXJ0dWFsTm9kZSAmJiAhZXhpc3QgJiYgKCFpc0ZpcnN0IHx8ICFwb2ludEluc2lkZSkpIHtcbiAgICAgICAgICAgICAgLy8gYWRkIDIgcmVyb3V0ZWQgbGluZXMgdG8gY2hlY2tcbiAgICAgICAgICAgICAgbGluZXNUb0NoZWNrLnB1c2gobmV3IExpbmUobGluZS54MSwgbGluZS55MSwgdmlydHVhbE5vZGUueCwgdmlydHVhbE5vZGUueSkpO1xuICAgICAgICAgICAgICBsaW5lc1RvQ2hlY2sucHVzaChuZXcgTGluZSh2aXJ0dWFsTm9kZS54LCB2aXJ0dWFsTm9kZS55LCBsaW5lLngyLCBsaW5lLnkyKSk7XG4gICAgICAgICAgICAgIGhhc0ludGVyc2VjdGlvbiA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcblxuICAgICAgICAgIHRlc3RSZXJvdXRlKHRydWUpO1xuXG4gICAgICAgICAgaWYgKCFoYXNJbnRlcnNlY3Rpb24pIHtcbiAgICAgICAgICAgIC8vIGlmIHdlIGRpZG4ndCBmaW5kIGEgdmFsaWQgcG9pbnQgYXJvdW5kIHRoZSBmaXJzdCBjb3JuZXIsIHRyeSB0aGUgc2Vjb25kXG4gICAgICAgICAgICB0ZXN0UmVyb3V0ZShmYWxzZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IC8vIG5vIGludGVyc2VjdGlvbiBmb3VuZCwgbWFyayB0aGlzIGxpbmUgYXMgY29tcGxldGVkXG5cblxuICAgICAgaWYgKCFoYXNJbnRlcnNlY3Rpb24pIHtcbiAgICAgICAgY2hlY2tlZExpbmVzLnB1c2gobGluZSk7XG4gICAgICB9XG5cbiAgICAgIGl0ZXJhdGlvbnMgKz0gMTtcbiAgICB9OyAvLyBpbm5lciBsb29wIGVuZCB3aGVuIG91dCBvZiBsaW5lcyBvciBmb3VuZCBhbiBpbnRlcnNlY3Rpb25cblxuXG4gICAgd2hpbGUgKCFoYXNJbnRlcnNlY3Rpb24gJiYgbGluZXNUb0NoZWNrLmxlbmd0aCkge1xuICAgICAgX2xvb3BfMSgpO1xuICAgIH1cbiAgfSAvLyDliqDlhaXliankvZnnmoTnur9cblxuXG4gIHdoaWxlIChsaW5lc1RvQ2hlY2subGVuZ3RoKSB7XG4gICAgY2hlY2tlZExpbmVzLnB1c2gobGluZXNUb0NoZWNrLnBvcCgpKTtcbiAgfVxuXG4gIHJldHVybiBjaGVja2VkTGluZXM7XG59O1xuLyoqXG4gKiAgQ29ubmVjdCBpdGVtIHdpdGggdmlzaXRlZCBtZW1iZXJzIHVzaW5nIGRpcmVjdCBsaW5lIG9yIHZpcnR1YWwgZWRnZXNcbiAqL1xuXG5cbmZ1bmN0aW9uIGdldFJvdXRlKGl0ZW0sIG5vbk1lbWJlcnMsIHZpc2l0ZWQsIG1heFJvdXRpbmdJdGVyYXRpb25zLCBtb3JwaEJ1ZmZlcikge1xuICB2YXIgb3B0aW1hbE5laWdoYm9yID0gcGlja0Jlc3ROZWlnaGJvcihpdGVtLCB2aXNpdGVkLCBub25NZW1iZXJzKTtcblxuICBpZiAob3B0aW1hbE5laWdoYm9yID09PSBudWxsKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9IC8vICBtZXJnZSB0aGUgY29uc2VjdXRpdmUgbGluZXNcblxuXG4gIHZhciBtZXJnZUxpbmVzID0gZnVuY3Rpb24gbWVyZ2VMaW5lcyhjaGVja2VkTGluZXMpIHtcbiAgICB2YXIgZmluYWxSb3V0ZSA9IFtdO1xuXG4gICAgd2hpbGUgKGNoZWNrZWRMaW5lcy5sZW5ndGggPiAwKSB7XG4gICAgICB2YXIgbGluZTEgPSBjaGVja2VkTGluZXMucG9wKCk7XG5cbiAgICAgIGlmIChjaGVja2VkTGluZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGZpbmFsUm91dGUucHVzaChsaW5lMSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICB2YXIgbGluZTIgPSBjaGVja2VkTGluZXMucG9wKCk7XG4gICAgICB2YXIgbWVyZ2VMaW5lID0gbmV3IExpbmUobGluZTEueDEsIGxpbmUxLnkxLCBsaW5lMi54MiwgbGluZTIueTIpO1xuICAgICAgdmFyIGNsb3Nlc3RJdGVtID0gZ2V0SW50ZXJzZWN0SXRlbShub25NZW1iZXJzLCBtZXJnZUxpbmUpOyAvLyBtZXJnZSBtb3N0IHJlY2VudCBsaW5lIGFuZCBwcmV2aW91cyBsaW5lXG5cbiAgICAgIGlmICghY2xvc2VzdEl0ZW0pIHtcbiAgICAgICAgY2hlY2tlZExpbmVzLnB1c2gobWVyZ2VMaW5lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZpbmFsUm91dGUucHVzaChsaW5lMSk7XG4gICAgICAgIGNoZWNrZWRMaW5lcy5wdXNoKGxpbmUyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmluYWxSb3V0ZTtcbiAgfTtcblxuICB2YXIgZGlyZWN0TGluZSA9IG5ldyBMaW5lKGl0ZW0uZ2V0TW9kZWwoKS54LCBpdGVtLmdldE1vZGVsKCkueSwgb3B0aW1hbE5laWdoYm9yLmdldE1vZGVsKCkueCwgb3B0aW1hbE5laWdoYm9yLmdldE1vZGVsKCkueSk7XG4gIHZhciBjaGVja2VkTGluZXMgPSBjb21wdXRlUm91dGUoZGlyZWN0TGluZSwgbm9uTWVtYmVycywgbWF4Um91dGluZ0l0ZXJhdGlvbnMsIG1vcnBoQnVmZmVyKTtcbiAgdmFyIGZpbmFsUm91dGUgPSBtZXJnZUxpbmVzKGNoZWNrZWRMaW5lcyk7XG4gIHJldHVybiBmaW5hbFJvdXRlO1xufVxuLyoqXG4gKiBDYWxjdWxhdGUgdGhlIGNvdW50b3IgdGhhdCBpbmNsdWRlcyB0aGUgIHNlbGVjdGVkIGl0ZW1zIGFuZCBleGNsdWVzIHRoZSBub24tc2VsZWN0ZWQgaXRlbXNcbiAqIEBwYXJhbSBncmFwaFxuICogQHBhcmFtIG1lbWJlcnNcbiAqIEBwYXJhbSBub25NZW1iZXJzXG4gKiBAcGFyYW0gb3B0aW9uc1xuICovXG5cblxuZXhwb3J0IHZhciBnZW5CdWJibGVTZXQgPSBmdW5jdGlvbiBnZW5CdWJibGVTZXQobWVtYmVycywgbm9uTWVtYmVycywgb3BzKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZWRlY2xhcmVcbiAgdmFyIG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKGRlZmF1bHRPcHMsIG9wcyk7XG4gIHZhciBjZW50cm9pZCA9IGdldFBvaW50c0NlbnRlcihtZW1iZXJzLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgIHJldHVybiB7XG4gICAgICB4OiBpdGVtLmdldE1vZGVsKCkueCxcbiAgICAgIHk6IGl0ZW0uZ2V0TW9kZWwoKS55XG4gICAgfTtcbiAgfSkpOyAvLyDmjInnhafliLDkuK3lv4Pot53nprvov5zov5HmjpLluo9cblxuICBtZW1iZXJzID0gbWVtYmVycy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgcmV0dXJuIHNxdWFyZURpc3Qoe1xuICAgICAgeDogYS5nZXRNb2RlbCgpLngsXG4gICAgICB5OiBhLmdldE1vZGVsKCkueVxuICAgIH0sIGNlbnRyb2lkKSAtIHNxdWFyZURpc3Qoe1xuICAgICAgeDogYi5nZXRNb2RlbCgpLngsXG4gICAgICB5OiBiLmdldE1vZGVsKCkueVxuICAgIH0sIGNlbnRyb2lkKTtcbiAgfSk7XG4gIHZhciB2aXNpdGVkID0gW107XG4gIHZhciB2aXJ0dWFsRWRnZXMgPSBbXTtcbiAgbWVtYmVycy5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgdmFyIGxpbmVzID0gZ2V0Um91dGUoaXRlbSwgbm9uTWVtYmVycywgdmlzaXRlZCwgb3B0aW9ucy5tYXhSb3V0aW5nSXRlcmF0aW9ucywgb3B0aW9ucy5tb3JwaEJ1ZmZlcik7XG4gICAgbGluZXMuZm9yRWFjaChmdW5jdGlvbiAobCkge1xuICAgICAgdmlydHVhbEVkZ2VzLnB1c2gobCk7XG4gICAgfSk7XG4gICAgdmlzaXRlZC5wdXNoKGl0ZW0pO1xuICB9KTsgLy8g55Sx5LqOZWRnZeS5n+WPr+S7peS9nOS4um1lbWJlcuWSjG5vbk1lbWJlcuS8oOWFpe+8jOaaguaXtuS4jeiAg+iZkeaKimVkZ2Vz5L2c5Li65Y+C5pWw5Lyg5YWlZ2VuQnViYmxlU2V0XG4gIC8vIGVkZ2VzICYmIGVkZ2VzLmZvckVhY2goZSA9PiB7XG4gIC8vICAgdmlydHVhbEVkZ2VzLnB1c2gobmV3IExpbmUoZS5nZXRTb3VyY2UoKS5nZXRNb2RlbCgpLngsIGUuZ2V0U291cmNlKCkuZ2V0TW9kZWwoKS55LCBlLmdldFRhcmdldCgpLmdldE1vZGVsKCkueCwgZS5nZXRUYXJnZXQoKS5nZXRNb2RlbCgpLnkpKTtcbiAgLy8gfSk7XG5cbiAgdmFyIGFjdGl2ZVJlZ2lvbiA9IGdldEFjdGl2ZVJyZWdpb24obWVtYmVycywgdmlydHVhbEVkZ2VzLCBvcHRpb25zLm5vZGVSMCk7XG4gIHZhciBwb3RlbnRpYWxBcmVhID0gaW5pdEdyaWRDZWxscyhhY3RpdmVSZWdpb24ud2lkdGgsIGFjdGl2ZVJlZ2lvbi5oZWlnaHQsIG9wdGlvbnMucGl4ZWxHcm91cFNpemUpOyAvLyBVc2UgbWFyY2ggc3F1YXJlcyB0byBnZW5lcmF0ZSBjb250b3VyXG5cbiAgdmFyIGNvbnRvdXIgPSBbXTtcbiAgdmFyIGh1bGwgPSBbXTtcblxuICBmb3IgKHZhciBpdGVyYXRpb25zID0gMDsgaXRlcmF0aW9ucyA8IG9wdGlvbnMubWF4TWFyY2hpbmdJdGVyYXRpb25zOyBpdGVyYXRpb25zKyspIHtcbiAgICBmaWxsUG90ZW50aWFsQXJlYShtZW1iZXJzLCBub25NZW1iZXJzLCB2aXJ0dWFsRWRnZXMsIGFjdGl2ZVJlZ2lvbiwgcG90ZW50aWFsQXJlYSwgb3B0aW9ucyk7XG4gICAgY29udG91ciA9IFtdO1xuICAgIGh1bGwgPSBbXTtcbiAgICBpZiAoIW5ldyBNYXJjaGluZ1NxdWFyZXMoY29udG91ciwgcG90ZW50aWFsQXJlYSwgb3B0aW9ucy50aHJlc2hvbGQpLm1hcmNoKCkpIGNvbnRpbnVlO1xuICAgIHZhciBtYXJjaGVkUGF0aCA9IGNvbnRvdXIubWFwKGZ1bmN0aW9uIChwb2ludCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgeDogTWF0aC5yb3VuZChwb2ludC54ICogb3B0aW9ucy5waXhlbEdyb3VwU2l6ZSArIGFjdGl2ZVJlZ2lvbi5taW5YKSxcbiAgICAgICAgeTogTWF0aC5yb3VuZChwb2ludC55ICogb3B0aW9ucy5waXhlbEdyb3VwU2l6ZSArIGFjdGl2ZVJlZ2lvbi5taW5ZKVxuICAgICAgfTtcbiAgICB9KTsgLy8gY29uc3QgbWFyY2hlZFBhdGggPSBtYXJjaGluZ1NxdWFyZXMocG90ZW50aWFsQXJlYSwgb3B0aW9ucy50aHJlc2hvbGQpLm1hcChwb2ludCA9PiAoeyB4OiBNYXRoLnJvdW5kKHBvaW50LnggKiBvcHRpb25zLnBpeGVsR3JvdXBTaXplICsgYWN0aXZlUmVnaW9uLm1pblgpLCB5OiBNYXRoLnJvdW5kKHBvaW50LnkgKiBvcHRpb25zLnBpeGVsR3JvdXBTaXplICsgYWN0aXZlUmVnaW9uLm1pblkpIH0pKVxuXG4gICAgaWYgKG1hcmNoZWRQYXRoKSB7XG4gICAgICB2YXIgc2l6ZSA9IG1hcmNoZWRQYXRoLmxlbmd0aDtcblxuICAgICAgaWYgKG9wdGlvbnMuc2tpcCA+IDEpIHtcbiAgICAgICAgc2l6ZSA9IE1hdGguZmxvb3IobWFyY2hlZFBhdGgubGVuZ3RoIC8gb3B0aW9ucy5za2lwKTsgLy8gaWYgd2UgcmVkdWNlZCB0b28gbXVjaCAoZmV3ZXIgdGhhbiB0aHJlZSBwb2ludHMgaW4gcmVkdWNlZCBzdXJmYWNlKSByZWR1Y2Ugc2tpcCBhbmQgdHJ5IGFnYWluXG5cbiAgICAgICAgd2hpbGUgKHNpemUgPCAzICYmIG9wdGlvbnMuc2tpcCA+IDEpIHtcbiAgICAgICAgICBvcHRpb25zLnNraXAgLT0gMTtcbiAgICAgICAgICBzaXplID0gTWF0aC5mbG9vcihtYXJjaGVkUGF0aC5sZW5ndGggLyBvcHRpb25zLnNraXApO1xuICAgICAgICB9XG4gICAgICB9IC8vIGNvcHkgaHVsbCB2YWx1ZXNcblxuXG4gICAgICBmb3IgKHZhciBpID0gMCwgaiA9IDA7IGogPCBzaXplOyBqICs9IDEsIGkgKz0gb3B0aW9ucy5za2lwKSB7XG4gICAgICAgIGh1bGwucHVzaCh7XG4gICAgICAgICAgeDogbWFyY2hlZFBhdGhbaV0ueCxcbiAgICAgICAgICB5OiBtYXJjaGVkUGF0aFtpXS55XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBpc0NvbnRvdXJWYWxpZCA9IGZ1bmN0aW9uIGlzQ29udG91clZhbGlkKCkge1xuICAgICAgZm9yICh2YXIgX2kgPSAwLCBtZW1iZXJzXzEgPSBtZW1iZXJzOyBfaSA8IG1lbWJlcnNfMS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgdmFyIGl0ZW0gPSBtZW1iZXJzXzFbX2ldO1xuICAgICAgICB2YXIgaHVsbFBvaW50cyA9IGh1bGwubWFwKGZ1bmN0aW9uIChwb2ludCkge1xuICAgICAgICAgIHJldHVybiBbcG9pbnQueCwgcG9pbnQueV07XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIWlzUG9pbnRJblBvbHlnb24oaHVsbFBvaW50cywgaXRlbS5nZXRCQm94KCkuY2VudGVyWCwgaXRlbS5nZXRCQm94KCkuY2VudGVyWSkpIHJldHVybiBmYWxzZTtcbiAgICAgIH0gLy8g5LiN5by65Yi26KaB5rGC5omA5pyJbm9uTWVtYmVyc+mDveayoeacieWMheWQq+WcqOWGhVxuICAgICAgLy8gZm9yIChjb25zdCBpdGVtIG9mIG5vbk1lbWJlcnMpIHtcbiAgICAgIC8vICAgaWYgKGlzUG9pbnRJblBvbHlnb24oeyB4OiBpdGVtLmdldEJCb3goKS5jZW50ZXJYLCB5OiBpdGVtLmdldEJCb3goKS5jZW50ZXJZIH0sIGNvbnRvdXIpKSByZXR1cm4gZmFsc2VcbiAgICAgIC8vIH1cblxuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuXG4gICAgaWYgKGh1bGwgJiYgaXNDb250b3VyVmFsaWQoKSkge1xuICAgICAgcmV0dXJuIGh1bGw7XG4gICAgfSAvLyB1cGRhdGUgcGFyYW1ldGVycyBmb3IgbmV4dCBpdGVyYWN0aW9uXG5cblxuICAgIG9wdGlvbnMudGhyZXNob2xkICo9IDAuOTtcblxuICAgIGlmIChpdGVyYXRpb25zIDw9IG9wdGlvbnMubWF4TWFyY2hpbmdJdGVyYXRpb25zICogMC41KSB7XG4gICAgICBvcHRpb25zLm1lbWJlckluZmx1ZW5jZUZhY3RvciAqPSAxLjI7XG4gICAgICBvcHRpb25zLmVkZ2VJbmZsdWVuY2VGYWN0b3IgKj0gMS4yO1xuICAgIH0gZWxzZSBpZiAob3B0aW9ucy5ub25NZW1iZXJJbmZsdWVuY2VGYWN0b3IgIT09IDAgJiYgbm9uTWVtYmVycy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBhZnRlciBoYWxmIHRoZSBpdGVyYXRpb25zLCBzdGFydCBpbmNyZWFzaW5nIHBvc2l0aXZlIGVuZXJneSBhbmQgbG93ZXJpbmcgdGhlIHRocmVzaG9sZFxuICAgICAgb3B0aW9ucy5ub25NZW1iZXJJbmZsdWVuY2VGYWN0b3IgKj0gMC44O1xuICAgIH0gZWxzZSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaHVsbDtcbn07XG4vKipcbiAqIHVuaW9uYm91bmRpbmdib3hcbiAqIEBwYXJhbSBtZW1iZXJzXG4gKiBAcGFyYW0gZWRnZXNcbiAqL1xuXG5mdW5jdGlvbiBnZXRBY3RpdmVScmVnaW9uKG1lbWJlcnMsIGVkZ2VzLCBvZmZzZXQpIHtcbiAgdmFyIGFjdGl2ZVJlZ2lvbiA9IHtcbiAgICBtaW5YOiBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksXG4gICAgbWluWTogTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLFxuICAgIG1heFg6IE51bWJlci5ORUdBVElWRV9JTkZJTklUWSxcbiAgICBtYXhZOiBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFksXG4gICAgd2lkdGg6IDAsXG4gICAgaGVpZ2h0OiAwLFxuICAgIHg6IDAsXG4gICAgeTogMFxuICB9O1xuICB2YXIgYmJveGVzID0gW107XG4gIG1lbWJlcnMuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xuICAgIGJib3hlcy5wdXNoKGl0ZW0uZ2V0QkJveCgpKTtcbiAgfSk7XG4gIGVkZ2VzLmZvckVhY2goZnVuY3Rpb24gKGwpIHtcbiAgICBiYm94ZXMucHVzaChsLmdldEJCb3goKSk7XG4gIH0pO1xuXG4gIGZvciAodmFyIF9pID0gMCwgYmJveGVzXzEgPSBiYm94ZXM7IF9pIDwgYmJveGVzXzEubGVuZ3RoOyBfaSsrKSB7XG4gICAgdmFyIGJib3ggPSBiYm94ZXNfMVtfaV07XG4gICAgYWN0aXZlUmVnaW9uLm1pblggPSAoYmJveC5taW5YIDwgYWN0aXZlUmVnaW9uLm1pblggPyBiYm94Lm1pblggOiBhY3RpdmVSZWdpb24ubWluWCkgLSBvZmZzZXQ7XG4gICAgYWN0aXZlUmVnaW9uLm1pblkgPSAoYmJveC5taW5ZIDwgYWN0aXZlUmVnaW9uLm1pblkgPyBiYm94Lm1pblkgOiBhY3RpdmVSZWdpb24ubWluWSkgLSBvZmZzZXQ7XG4gICAgYWN0aXZlUmVnaW9uLm1heFggPSAoYmJveC5tYXhYID4gYWN0aXZlUmVnaW9uLm1heFggPyBiYm94Lm1heFggOiBhY3RpdmVSZWdpb24ubWF4WCkgKyBvZmZzZXQ7XG4gICAgYWN0aXZlUmVnaW9uLm1heFkgPSAoYmJveC5tYXhZID4gYWN0aXZlUmVnaW9uLm1heFkgPyBiYm94Lm1heFkgOiBhY3RpdmVSZWdpb24ubWF4WSkgKyBvZmZzZXQ7XG4gIH1cblxuICBhY3RpdmVSZWdpb24ud2lkdGggPSBhY3RpdmVSZWdpb24ubWF4WCAtIGFjdGl2ZVJlZ2lvbi5taW5YO1xuICBhY3RpdmVSZWdpb24uaGVpZ2h0ID0gYWN0aXZlUmVnaW9uLm1heFkgLSBhY3RpdmVSZWdpb24ubWluWTtcbiAgYWN0aXZlUmVnaW9uLnggPSBhY3RpdmVSZWdpb24ubWluWDtcbiAgYWN0aXZlUmVnaW9uLnkgPSBhY3RpdmVSZWdpb24ubWluWTtcbiAgcmV0dXJuIGFjdGl2ZVJlZ2lvbjtcbn1cblxuZnVuY3Rpb24gZmlsbFBvdGVudGlhbEFyZWEobWVtYmVycywgbm9uTWVtYmVycywgZWRnZXMsIGFjdGl2ZVJlZ2lvbiwgcG90ZW50aWFsQXJlYSwgb3B0aW9ucykge1xuICBmdW5jdGlvbiBwb3MyR3JpZEl4KHgsIG9mZnNldCkge1xuICAgIHZhciBncmlkSXggPSBNYXRoLmZsb29yKCh4IC0gb2Zmc2V0KSAvIG9wdGlvbnMucGl4ZWxHcm91cFNpemUpO1xuICAgIHJldHVybiBncmlkSXggPCAwID8gMCA6IGdyaWRJeDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdyaWRJeDJQb3MoeCwgb2Zmc2V0KSB7XG4gICAgcmV0dXJuIHggKiBvcHRpb25zLnBpeGVsR3JvdXBTaXplICsgb2Zmc2V0O1xuICB9IC8vIHVzaW5nIGludmVyc2UgYSBmb3IgbnVtZXJpY2FsIHN0YWJpbGl0eVxuXG5cbiAgdmFyIG5vZGVJbmZBID0gKG9wdGlvbnMubm9kZVIwIC0gb3B0aW9ucy5ub2RlUjEpICogKG9wdGlvbnMubm9kZVIwIC0gb3B0aW9ucy5ub2RlUjEpO1xuICB2YXIgZWRnZUluZkEgPSAob3B0aW9ucy5lZGdlUjAgLSBvcHRpb25zLmVkZ2VSMSkgKiAob3B0aW9ucy5lZGdlUjAgLSBvcHRpb25zLmVkZ2VSMSk7XG5cbiAgdmFyIGdldEFmZmVjdGVkUmVnaW9uID0gZnVuY3Rpb24gZ2V0QWZmZWN0ZWRSZWdpb24oYmJveCwgdGhyZXNob2xkUikge1xuICAgIHZhciBzdGFydFggPSBNYXRoLm1pbihwb3MyR3JpZEl4KGJib3gubWluWCwgdGhyZXNob2xkUiArIGFjdGl2ZVJlZ2lvbi5taW5YKSwgcG90ZW50aWFsQXJlYS53aWR0aCk7XG4gICAgdmFyIHN0YXJ0WSA9IE1hdGgubWluKHBvczJHcmlkSXgoYmJveC5taW5ZLCB0aHJlc2hvbGRSICsgYWN0aXZlUmVnaW9uLm1pblkpLCBwb3RlbnRpYWxBcmVhLmhlaWdodCk7XG4gICAgdmFyIGVuZFggPSBNYXRoLm1pbihwb3MyR3JpZEl4KGJib3gubWF4WCwgLXRocmVzaG9sZFIgKyBhY3RpdmVSZWdpb24ubWluWCksIHBvdGVudGlhbEFyZWEud2lkdGgpO1xuICAgIHZhciBlbmRZID0gTWF0aC5taW4ocG9zMkdyaWRJeChiYm94Lm1heFksIC10aHJlc2hvbGRSICsgYWN0aXZlUmVnaW9uLm1pblkpLCBwb3RlbnRpYWxBcmVhLmhlaWdodCk7XG4gICAgcmV0dXJuIFtzdGFydFgsIHN0YXJ0WSwgZW5kWCwgZW5kWV07XG4gIH07XG5cbiAgdmFyIGFkZEl0ZW1JbmZsdWVuY2UgPSBmdW5jdGlvbiBhZGRJdGVtSW5mbHVlbmNlKGl0ZW0sIGluZmx1ZW5jZUZhY3Rvcikge1xuICAgIHZhciBiYm94ID0gaXRlbS5nZXRCQm94KCk7XG5cbiAgICB2YXIgX2EgPSBnZXRBZmZlY3RlZFJlZ2lvbihiYm94LCBvcHRpb25zLm5vZGVSMSksXG4gICAgICAgIHN0YXJ0WCA9IF9hWzBdLFxuICAgICAgICBzdGFydFkgPSBfYVsxXSxcbiAgICAgICAgZW5kWCA9IF9hWzJdLFxuICAgICAgICBlbmRZID0gX2FbM107IC8vIGNhbGN1bGF0ZSBpdGVtIGluZmx1ZW5jZSBmb3IgZWFjaCBjZWxsXG5cblxuICAgIGZvciAodmFyIHkgPSBzdGFydFk7IHkgPCBlbmRZOyB5ICs9IDEpIHtcbiAgICAgIGZvciAodmFyIHggPSBzdGFydFg7IHggPCBlbmRYOyB4ICs9IDEpIHtcbiAgICAgICAgaWYgKGluZmx1ZW5jZUZhY3RvciA8IDAgJiYgcG90ZW50aWFsQXJlYVt4ICsgeSAqIHBvdGVudGlhbEFyZWEud2lkdGhdIDw9IDApIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB0ZW1wWCA9IGdyaWRJeDJQb3MoeCwgYWN0aXZlUmVnaW9uLm1pblgpO1xuICAgICAgICB2YXIgdGVtcFkgPSBncmlkSXgyUG9zKHksIGFjdGl2ZVJlZ2lvbi5taW5ZKTtcbiAgICAgICAgdmFyIGRpc3RhbmNlU3EgPSBwb2ludFJlY3RTcXVhcmVEaXN0KHtcbiAgICAgICAgICB4OiB0ZW1wWCxcbiAgICAgICAgICB5OiB0ZW1wWVxuICAgICAgICB9LCB7XG4gICAgICAgICAgeDogYmJveC5taW5YLFxuICAgICAgICAgIHk6IGJib3gubWluWSxcbiAgICAgICAgICB3aWR0aDogYmJveC53aWR0aCxcbiAgICAgICAgICBoZWlnaHQ6IGJib3guaGVpZ2h0XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChkaXN0YW5jZVNxIDwgTWF0aC5wb3cob3B0aW9ucy5ub2RlUjEsIDIpKSB7XG4gICAgICAgICAgdmFyIGRyID0gTWF0aC5zcXJ0KGRpc3RhbmNlU3EpIC0gb3B0aW9ucy5ub2RlUjE7XG4gICAgICAgICAgcG90ZW50aWFsQXJlYS5jZWxsc1t4ICsgeSAqIHBvdGVudGlhbEFyZWEud2lkdGhdICs9IGluZmx1ZW5jZUZhY3RvciAqIGRyICogZHI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgdmFyIGFkZEVkZ2VJbmZsdWVuY2UgPSBmdW5jdGlvbiBhZGRFZGdlSW5mbHVlbmNlKGxpbmUsIGluZmx1ZW5jZUZhY3Rvcikge1xuICAgIHZhciBiYm94ID0gbGluZS5nZXRCQm94KCk7XG5cbiAgICB2YXIgX2EgPSBnZXRBZmZlY3RlZFJlZ2lvbihiYm94LCBvcHRpb25zLmVkZ2VSMSksXG4gICAgICAgIHN0YXJ0WCA9IF9hWzBdLFxuICAgICAgICBzdGFydFkgPSBfYVsxXSxcbiAgICAgICAgZW5kWCA9IF9hWzJdLFxuICAgICAgICBlbmRZID0gX2FbM107IC8vIGZvciBldmVyeSBwb2ludCBpbiBhY3RpdmUgcGFydCBvZiBwb3RlbnRpYWxBcmVhLCBjYWxjdWxhdGUgZGlzdGFuY2UgdG8gbmVhcmVzdCBwb2ludCBvbiBsaW5lIGFuZCBhZGQgaW5mbHVlbmNlXG5cblxuICAgIGZvciAodmFyIHkgPSBzdGFydFk7IHkgPCBlbmRZOyB5ICs9IDEpIHtcbiAgICAgIGZvciAodmFyIHggPSBzdGFydFg7IHggPCBlbmRYOyB4ICs9IDEpIHtcbiAgICAgICAgaWYgKGluZmx1ZW5jZUZhY3RvciA8IDAgJiYgcG90ZW50aWFsQXJlYS5jZWxsc1t4ICsgeSAqIHBvdGVudGlhbEFyZWEud2lkdGhdIDw9IDApIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB0ZW1wWCA9IGdyaWRJeDJQb3MoeCwgYWN0aXZlUmVnaW9uLm1pblgpO1xuICAgICAgICB2YXIgdGVtcFkgPSBncmlkSXgyUG9zKHksIGFjdGl2ZVJlZ2lvbi5taW5ZKTtcbiAgICAgICAgdmFyIG1pbkRpc3RhbmNlU3EgPSBwb2ludExpbmVTcXVhcmVEaXN0KHtcbiAgICAgICAgICB4OiB0ZW1wWCxcbiAgICAgICAgICB5OiB0ZW1wWVxuICAgICAgICB9LCBsaW5lKTsgLy8gb25seSBpbmZsdWVuY2UgaWYgbGVzcyB0aGFuIHIxXG5cbiAgICAgICAgaWYgKG1pbkRpc3RhbmNlU3EgPCBNYXRoLnBvdyhvcHRpb25zLmVkZ2VSMSwgMikpIHtcbiAgICAgICAgICB2YXIgbWRyID0gTWF0aC5zcXJ0KG1pbkRpc3RhbmNlU3EpIC0gb3B0aW9ucy5lZGdlUjE7XG4gICAgICAgICAgcG90ZW50aWFsQXJlYS5jZWxsc1t4ICsgeSAqIHBvdGVudGlhbEFyZWEud2lkdGhdICs9IGluZmx1ZW5jZUZhY3RvciAqIG1kciAqIG1kcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBpZiAob3B0aW9ucy5ub2RlSW5mbHVlbmNlRmFjdG9yKSB7XG4gICAgbWVtYmVycy5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICBhZGRJdGVtSW5mbHVlbmNlKGl0ZW0sIG9wdGlvbnMubm9kZUluZmx1ZW5jZUZhY3RvciAvIG5vZGVJbmZBKTtcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChvcHRpb25zLmVkZ2VJbmZsdWVuY2VGYWN0b3IpIHtcbiAgICBlZGdlcy5mb3JFYWNoKGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgICBhZGRFZGdlSW5mbHVlbmNlKGVkZ2UsIG9wdGlvbnMuZWRnZUluZmx1ZW5jZUZhY3RvciAvIGVkZ2VJbmZBKTtcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChvcHRpb25zLm5lZ2F0aXZlTm9kZUluZmx1ZW5jZUZhY3Rvcikge1xuICAgIG5vbk1lbWJlcnMuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgYWRkSXRlbUluZmx1ZW5jZShpdGVtLCBvcHRpb25zLm5lZ2F0aXZlTm9kZUluZmx1ZW5jZUZhY3RvciAvIG5vZGVJbmZBKTtcbiAgICB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXJvdXRlTGluZShpdGVtLCBidWZmZXIsIGludGVyc2VjdGlvbnMsIHdyYXBOb3JtYWwpIHtcbiAgdmFyIGJib3ggPSBpdGVtLmdldEJCb3goKTtcbiAgdmFyIHRvcEludGVyc2VjdCA9IGludGVyc2VjdGlvbnNbMF0sXG4gICAgICBsZWZ0SW50ZXJzZWN0ID0gaW50ZXJzZWN0aW9uc1sxXSxcbiAgICAgIGJvdHRvbUludGVyc2VjdCA9IGludGVyc2VjdGlvbnNbMl0sXG4gICAgICByaWdodEludGVyc2VjdCA9IGludGVyc2VjdGlvbnNbM107XG4gIHZhciBjb3JuZXJQb3MgPSB7XG4gICAgdG9wTGVmdDoge1xuICAgICAgeDogYmJveC5taW5YIC0gYnVmZmVyLFxuICAgICAgeTogYmJveC5taW5ZIC0gYnVmZmVyXG4gICAgfSxcbiAgICB0b3BSaWdodDoge1xuICAgICAgeDogYmJveC5tYXhYICsgYnVmZmVyLFxuICAgICAgeTogYmJveC5taW5ZIC0gYnVmZmVyXG4gICAgfSxcbiAgICBib3R0b21MZWZ0OiB7XG4gICAgICB4OiBiYm94Lm1pblggLSBidWZmZXIsXG4gICAgICB5OiBiYm94Lm1heFkgKyBidWZmZXJcbiAgICB9LFxuICAgIGJvdHRvbVJpZ2h0OiB7XG4gICAgICB4OiBiYm94Lm1heFggKyBidWZmZXIsXG4gICAgICB5OiBiYm94Lm1heFkgKyBidWZmZXJcbiAgICB9XG4gIH07XG4gIHZhciB0b3RhbEFyZWEgPSBiYm94LmhlaWdodCAqIGJib3gud2lkdGg7XG5cbiAgZnVuY3Rpb24gY2FsY0hhbGZBcmVhKGludGVyc2VjdDEsIGludGVyc2VjdDIpIHtcbiAgICByZXR1cm4gYmJveC53aWR0aCAqICgoaW50ZXJzZWN0MS55IC0gYmJveC5taW5ZICsgKGludGVyc2VjdDIueSAtIGJib3gubWluWSkpICogMC41KTtcbiAgfSAvLyDmoLnmja7nur/lkoxib3VuZGluZ2JveOebuOS6pOeahOaDheWGte+8jOehruWummNvbnRyb2wgcG9pbnTnmoTkvY3nva5cblxuXG4gIGlmIChsZWZ0SW50ZXJzZWN0KSB7XG4gICAgLy8g55u45Lqk5Yy65Z+f5pyJ5LiJ6KeS5b2iXG4gICAgaWYgKHRvcEludGVyc2VjdCkgcmV0dXJuIHdyYXBOb3JtYWwgPyBjb3JuZXJQb3MudG9wTGVmdCA6IGNvcm5lclBvcy5ib3R0b21SaWdodDtcbiAgICBpZiAoYm90dG9tSW50ZXJzZWN0KSByZXR1cm4gd3JhcE5vcm1hbCA/IGNvcm5lclBvcy5ib3R0b21MZWZ0IDogY29ybmVyUG9zLnRvcFJpZ2h0OyAvLyDnm7jkuqTljLrln5/liIbmiJDkuIrkuIvkuKTkuKrmoq/lvaLvvIzmr5TovoPpnaLnp69cblxuICAgIHZhciB0b3BBcmVhID0gY2FsY0hhbGZBcmVhKGxlZnRJbnRlcnNlY3QsIHJpZ2h0SW50ZXJzZWN0KTtcblxuICAgIGlmICh0b3BBcmVhIDwgdG90YWxBcmVhICogMC41KSB7XG4gICAgICBpZiAobGVmdEludGVyc2VjdC55ID4gcmlnaHRJbnRlcnNlY3QueSkgcmV0dXJuIHdyYXBOb3JtYWwgPyBjb3JuZXJQb3MudG9wTGVmdCA6IGNvcm5lclBvcy5ib3R0b21SaWdodDtcbiAgICAgIHJldHVybiB3cmFwTm9ybWFsID8gY29ybmVyUG9zLnRvcFJpZ2h0IDogY29ybmVyUG9zLmJvdHRvbUxlZnQ7XG4gICAgfVxuXG4gICAgaWYgKGxlZnRJbnRlcnNlY3QueSA8IHJpZ2h0SW50ZXJzZWN0LnkpIHJldHVybiB3cmFwTm9ybWFsID8gY29ybmVyUG9zLmJvdHRvbUxlZnQgOiBjb3JuZXJQb3MudG9wUmlnaHQ7XG4gICAgcmV0dXJuIHdyYXBOb3JtYWwgPyBjb3JuZXJQb3MuYm90dG9tUmlnaHQgOiBjb3JuZXJQb3MudG9wTGVmdDtcbiAgfVxuXG4gIGlmIChyaWdodEludGVyc2VjdCkge1xuICAgIGlmICh0b3BJbnRlcnNlY3QpIHJldHVybiB3cmFwTm9ybWFsID8gY29ybmVyUG9zLnRvcFJpZ2h0IDogY29ybmVyUG9zLmJvdHRvbUxlZnQ7XG4gICAgaWYgKGJvdHRvbUludGVyc2VjdCkgcmV0dXJuIHdyYXBOb3JtYWwgPyBjb3JuZXJQb3MuYm90dG9tUmlnaHQgOiBjb3JuZXJQb3MudG9wTGVmdDtcbiAgfSAvLyDnm7jkuqTljLrln5/liIbmiJDlt6blj7PkuKTkuKrmoq/lvaJcblxuXG4gIHZhciBsZWZ0QXJlYSA9IGNhbGNIYWxmQXJlYSh0b3BJbnRlcnNlY3QsIGJvdHRvbUludGVyc2VjdCk7XG5cbiAgaWYgKGxlZnRBcmVhIDwgdG90YWxBcmVhICogMC41KSB7XG4gICAgaWYgKHRvcEludGVyc2VjdC54ID4gYm90dG9tSW50ZXJzZWN0LngpIHJldHVybiB3cmFwTm9ybWFsID8gY29ybmVyUG9zLnRvcExlZnQgOiBjb3JuZXJQb3MuYm90dG9tUmlnaHQ7XG4gICAgcmV0dXJuIHdyYXBOb3JtYWwgPyBjb3JuZXJQb3MuYm90dG9tTGVmdCA6IGNvcm5lclBvcy50b3BSaWdodDtcbiAgfVxuXG4gIGlmICh0b3BJbnRlcnNlY3QueCA8IGJvdHRvbUludGVyc2VjdC54KSByZXR1cm4gd3JhcE5vcm1hbCA/IGNvcm5lclBvcy50b3BSaWdodCA6IGNvcm5lclBvcy5ib3R0b21MZWZ0O1xuICByZXR1cm4gd3JhcE5vcm1hbCA/IGNvcm5lclBvcy5ib3R0b21SaWdodCA6IGNvcm5lclBvcy50b3BMZWZ0O1xufSIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBkZWVwTWl4LCBpc1N0cmluZyB9IGZyb20gJ0BhbnR2L3V0aWwnO1xuaW1wb3J0IHsgcGFyc2VQYXRoU3RyaW5nIH0gZnJvbSAnQGFudHYvcGF0aC11dGlsJztcbmltcG9ydCB7IHBhdGhUb1BvaW50cywgZ2V0Q2xvc2VkU3BsaW5lLCByb3VuZGVkSHVsbCwgcGFkZGVkSHVsbCB9IGZyb20gJy4uL3V0aWwvcGF0aCc7XG5pbXBvcnQgeyBpc1BvbHlnb25zSW50ZXJzZWN0IH0gZnJvbSAnLi4vdXRpbC9tYXRoJztcbmltcG9ydCB7IGdlbkNvbnZleEh1bGwgfSBmcm9tICcuLi9lbGVtZW50L2h1bGwvY29udmV4SHVsbCc7XG5pbXBvcnQgeyBnZW5CdWJibGVTZXQgfSBmcm9tICcuLi9lbGVtZW50L2h1bGwvYnViYmxlc2V0Jztcbi8qKlxuICog55So5LqO5YyF6KO55YaF6YOo55qE5oiQ5ZGY55qE6L2u5buT44CCXG4gKiBjb252ZXggaHVsbCjlh7jljIUp77yaaHR0cDovL2dlb21hbGdvcml0aG1zLmNvbS9hMTAtX2h1bGwtMS5odG1sI01vbm90b25lJTIwQ2hhaW5cbiAqIGJ1YmJsZTog5L2/55SoIGJ1YmJsZXNldOeul+azle+8jHJlZmVyOiBodHRwOi8vdmlhbGFiLnNjaWVuY2UudW9pdC5jYS93cC1jb250ZW50L3BhcGVyY2l0ZS1kYXRhL3BkZi9jb2wyMDA5Yy5wZGZcbiAqIOmAmui/h+mFjee9riBwYWRkaW5nIOWPr+S7peiwg+iKguWMheijuei9ruW7k+WvueiKgueCueeahOadvue0p+eoi+W6plxuICovXG5cbnZhciBIdWxsID1cbi8qKiBAY2xhc3MgKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gSHVsbChncmFwaCwgY2ZnKSB7XG4gICAgdGhpcy5jZmcgPSBkZWVwTWl4KHRoaXMuZ2V0RGVmYXVsdENmZygpLCBjZmcpO1xuICAgIHRoaXMuZ3JhcGggPSBncmFwaDtcbiAgICB0aGlzLmlkID0gdGhpcy5jZmcuaWQ7XG4gICAgdGhpcy5ncm91cCA9IHRoaXMuY2ZnLmdyb3VwO1xuICAgIHRoaXMubWVtYmVycyA9IHRoaXMuY2ZnLm1lbWJlcnMubWFwKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICByZXR1cm4gaXNTdHJpbmcoaXRlbSkgPyBncmFwaC5maW5kQnlJZChpdGVtKSA6IGl0ZW07XG4gICAgfSk7XG4gICAgdGhpcy5ub25NZW1iZXJzID0gdGhpcy5jZmcubm9uTWVtYmVycy5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIHJldHVybiBpc1N0cmluZyhpdGVtKSA/IGdyYXBoLmZpbmRCeUlkKGl0ZW0pIDogaXRlbTtcbiAgICB9KTtcbiAgICB0aGlzLnNldFBhZGRpbmcoKTtcbiAgICB0aGlzLnNldFR5cGUoKTtcbiAgICB0aGlzLnBhdGggPSB0aGlzLmNhbGNQYXRoKHRoaXMubWVtYmVycywgdGhpcy5ub25NZW1iZXJzKTtcbiAgICB0aGlzLnJlbmRlcigpO1xuICB9XG5cbiAgSHVsbC5wcm90b3R5cGUuZ2V0RGVmYXVsdENmZyA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6ICdnNi1odWxsJyxcbiAgICAgIHR5cGU6ICdyb3VuZC1jb252ZXgnLFxuICAgICAgbWVtYmVyczogW10sXG4gICAgICBub25NZW1iZXJzOiBbXSxcbiAgICAgIHN0eWxlOiB7XG4gICAgICAgIGZpbGw6ICdsaWdodGJsdWUnLFxuICAgICAgICBzdHJva2U6ICdibHVlJyxcbiAgICAgICAgb3BhY2l0eTogMC4yXG4gICAgICB9LFxuICAgICAgcGFkZGluZzogMTBcbiAgICB9O1xuICB9O1xuXG4gIEh1bGwucHJvdG90eXBlLnNldFBhZGRpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIG5vZGVTaXplID0gdGhpcy5tZW1iZXJzLmxlbmd0aCAmJiB0aGlzLm1lbWJlcnNbMF0uZ2V0S2V5U2hhcGUoKS5nZXRDYW52YXNCQm94KCkud2lkdGggLyAyO1xuICAgIHRoaXMucGFkZGluZyA9IHRoaXMuY2ZnLnBhZGRpbmcgPiAwID8gdGhpcy5jZmcucGFkZGluZyArIG5vZGVTaXplIDogMTAgKyBub2RlU2l6ZTtcbiAgICB0aGlzLmNmZy5idWJibGVDZmcgPSB7XG4gICAgICBub2RlUjA6IHRoaXMucGFkZGluZyAtIG5vZGVTaXplLFxuICAgICAgbm9kZVIxOiB0aGlzLnBhZGRpbmcgLSBub2RlU2l6ZSxcbiAgICAgIG1vcnBoQnVmZmVyOiB0aGlzLnBhZGRpbmcgLSBub2RlU2l6ZVxuICAgIH07XG4gIH07XG5cbiAgSHVsbC5wcm90b3R5cGUuc2V0VHlwZSA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLnR5cGUgPSB0aGlzLmNmZy50eXBlO1xuXG4gICAgaWYgKHRoaXMubWVtYmVycy5sZW5ndGggPCAzKSB7XG4gICAgICB0aGlzLnR5cGUgPSAncm91bmQtY29udmV4JztcbiAgICB9XG5cbiAgICBpZiAodGhpcy50eXBlICE9PSAncm91bmQtY29udmV4JyAmJiB0aGlzLnR5cGUgIT09ICdzbW9vdGgtY29udmV4JyAmJiB0aGlzLnR5cGUgIT09ICdidWJibGUnKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1RoZSBodWxsIHR5cGUgc2hvdWxkIGJlIGVpdGhlciByb3VuZC1jb252ZXgsIHNtb290aC1jb252ZXggb3IgYnViYmxlLCByb3VuZC1jb252ZXggaXMgdXNlZCBieSBkZWZhdWx0LicpO1xuICAgICAgdGhpcy50eXBlID0gJ3JvdW5kLWNvbnZleCc7XG4gICAgfVxuICB9O1xuXG4gIEh1bGwucHJvdG90eXBlLmNhbGNQYXRoID0gZnVuY3Rpb24gKG1lbWJlcnMsIG5vbk1lbWJlcnMpIHtcbiAgICB2YXIgY29udG91ciwgcGF0aCwgaHVsbDtcblxuICAgIHN3aXRjaCAodGhpcy50eXBlKSB7XG4gICAgICBjYXNlICdyb3VuZC1jb252ZXgnOlxuICAgICAgICBjb250b3VyID0gZ2VuQ29udmV4SHVsbChtZW1iZXJzKTtcbiAgICAgICAgaHVsbCA9IHJvdW5kZWRIdWxsKGNvbnRvdXIubWFwKGZ1bmN0aW9uIChwKSB7XG4gICAgICAgICAgcmV0dXJuIFtwLngsIHAueV07XG4gICAgICAgIH0pLCB0aGlzLnBhZGRpbmcpO1xuICAgICAgICBwYXRoID0gcGFyc2VQYXRoU3RyaW5nKGh1bGwpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnc21vb3RoLWNvbnZleCc6XG4gICAgICAgIGNvbnRvdXIgPSBnZW5Db252ZXhIdWxsKG1lbWJlcnMpO1xuXG4gICAgICAgIGlmIChjb250b3VyLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgIGh1bGwgPSByb3VuZGVkSHVsbChjb250b3VyLm1hcChmdW5jdGlvbiAocCkge1xuICAgICAgICAgICAgcmV0dXJuIFtwLngsIHAueV07XG4gICAgICAgICAgfSksIHRoaXMucGFkZGluZyk7XG4gICAgICAgICAgcGF0aCA9IHBhcnNlUGF0aFN0cmluZyhodWxsKTtcbiAgICAgICAgfSBlbHNlIGlmIChjb250b3VyLmxlbmd0aCA+IDIpIHtcbiAgICAgICAgICBodWxsID0gcGFkZGVkSHVsbChjb250b3VyLm1hcChmdW5jdGlvbiAocCkge1xuICAgICAgICAgICAgcmV0dXJuIFtwLngsIHAueV07XG4gICAgICAgICAgfSksIHRoaXMucGFkZGluZyk7XG4gICAgICAgICAgcGF0aCA9IGdldENsb3NlZFNwbGluZShodWxsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdidWJibGUnOlxuICAgICAgICBjb250b3VyID0gZ2VuQnViYmxlU2V0KG1lbWJlcnMsIG5vbk1lbWJlcnMsIHRoaXMuY2ZnLmJ1YmJsZUNmZyk7XG4gICAgICAgIHBhdGggPSBjb250b3VyLmxlbmd0aCA+PSAyICYmIGdldENsb3NlZFNwbGluZShjb250b3VyKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhdGg7XG4gIH07XG5cbiAgSHVsbC5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuZ3JvdXAuYWRkU2hhcGUoJ3BhdGgnLCB7XG4gICAgICBhdHRyczogX19hc3NpZ24oe1xuICAgICAgICBwYXRoOiB0aGlzLnBhdGhcbiAgICAgIH0sIHRoaXMuY2ZnLnN0eWxlKSxcbiAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgbmFtZTogdGhpcy5jZmcuaWQsXG4gICAgICBjYXB0dXJlOiBmYWxzZVxuICAgIH0pO1xuICAgIHRoaXMuZ3JvdXAudG9CYWNrKCk7XG4gIH07XG4gIC8qKlxuICAgKiDlop7liqBodWxs55qE5oiQ5ZGY77yM5ZCM5pe25aaC5p6c6K+l5oiQ5ZGY5Y6f5YWI5Zyobm9uTWVtYmVyc+S4re+8jOWImeS7jm5vbk1lbWJlcnPkuK3ljrvmjolcbiAgICogQHBhcmFtIGl0ZW0g6IqC54K55a6e5L6LXG4gICAqIEByZXR1cm4gYm9vbGVhbiDmt7vliqDmiJDlip/ov5Tlm54gdHJ1Ze+8jOWQpuWImei/lOWbniBmYWxzZVxuICAgKi9cblxuXG4gIEh1bGwucHJvdG90eXBlLmFkZE1lbWJlciA9IGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgaWYgKCFpdGVtKSByZXR1cm47XG4gICAgaWYgKGlzU3RyaW5nKGl0ZW0pKSBpdGVtID0gdGhpcy5ncmFwaC5maW5kQnlJZChpdGVtKTtcbiAgICB0aGlzLm1lbWJlcnMucHVzaChpdGVtKTtcbiAgICB2YXIgaW5kZXggPSB0aGlzLm5vbk1lbWJlcnMuaW5kZXhPZihpdGVtKTtcblxuICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICB0aGlzLm5vbk1lbWJlcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZURhdGEodGhpcy5tZW1iZXJzLCB0aGlzLm5vbk1lbWJlcnMpO1xuICAgIHJldHVybiB0cnVlO1xuICB9O1xuICAvKipcbiAgICog5aKe5YqgaHVsbOmcgOimgeaOkumZpOeahOiKgueCue+8jOWQjOaXtuWmguaenOivpeaIkOWRmOWOn+WFiOWcqG1lbWJlcnPkuK3vvIzliJnku45tZW1iZXJz5Lit5Y675o6JXG4gICAqIEBwYXJhbSBpdGVtIOiKgueCueWunuS+i1xuICAgKiBAcmV0dXJuIGJvb2xlYW4g5re75Yqg5oiQ5Yqf6L+U5ZueIHRydWXvvIzlkKbliJnov5Tlm54gZmFsc2VcbiAgICovXG5cblxuICBIdWxsLnByb3RvdHlwZS5hZGROb25NZW1iZXIgPSBmdW5jdGlvbiAoaXRlbSkge1xuICAgIGlmICghaXRlbSkgcmV0dXJuO1xuICAgIGlmIChpc1N0cmluZyhpdGVtKSkgaXRlbSA9IHRoaXMuZ3JhcGguZmluZEJ5SWQoaXRlbSk7XG4gICAgdGhpcy5ub25NZW1iZXJzLnB1c2goaXRlbSk7XG4gICAgdmFyIGluZGV4ID0gdGhpcy5tZW1iZXJzLmluZGV4T2YoaXRlbSk7XG5cbiAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgdGhpcy5tZW1iZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgfVxuXG4gICAgdGhpcy51cGRhdGVEYXRhKHRoaXMubWVtYmVycywgdGhpcy5ub25NZW1iZXJzKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcbiAgLyoqXG4gICAqIOenu+mZpGh1bGzkuK3nmoTmiJDlkZhcbiAgICogQHBhcmFtIG5vZGUg6IqC54K55a6e5L6LXG4gICAqIEByZXR1cm4gYm9vbGVhbiDnp7vpmaTmiJDlip/ov5Tlm54gdHJ1Ze+8jOWQpuWImei/lOWbniBmYWxzZVxuICAgKi9cblxuXG4gIEh1bGwucHJvdG90eXBlLnJlbW92ZU1lbWJlciA9IGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgaWYgKCFpdGVtKSByZXR1cm47XG4gICAgaWYgKGlzU3RyaW5nKGl0ZW0pKSBpdGVtID0gdGhpcy5ncmFwaC5maW5kQnlJZChpdGVtKTtcbiAgICB2YXIgaW5kZXggPSB0aGlzLm1lbWJlcnMuaW5kZXhPZihpdGVtKTtcblxuICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICB0aGlzLm1lbWJlcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIHRoaXMudXBkYXRlRGF0YSh0aGlzLm1lbWJlcnMsIHRoaXMubm9uTWVtYmVycyk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG4gIC8qKlxuICAgKiBAcGFyYW0gbm9kZSDoioLngrnlrp7kvotcbiAgICogQHJldHVybiBib29sZWFuIOenu+mZpOaIkOWKn+i/lOWbniB0cnVl77yM5ZCm5YiZ6L+U5ZueIGZhbHNlXG4gICAqL1xuXG5cbiAgSHVsbC5wcm90b3R5cGUucmVtb3ZlTm9uTWVtYmVyID0gZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICBpZiAoIWl0ZW0pIHJldHVybjtcbiAgICBpZiAoaXNTdHJpbmcoaXRlbSkpIGl0ZW0gPSB0aGlzLmdyYXBoLmZpbmRCeUlkKGl0ZW0pO1xuICAgIHZhciBpbmRleCA9IHRoaXMubm9uTWVtYmVycy5pbmRleE9mKGl0ZW0pO1xuXG4gICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgIHRoaXMubm9uTWVtYmVycy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgdGhpcy51cGRhdGVEYXRhKHRoaXMubWVtYmVycywgdGhpcy5ub25NZW1iZXJzKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICBIdWxsLnByb3RvdHlwZS51cGRhdGVEYXRhID0gZnVuY3Rpb24gKG1lbWJlcnMsIG5vbk1lbWJlcnMpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdGhpcy5ncm91cC5maW5kQnlJZCh0aGlzLmlkKS5yZW1vdmUoKTtcbiAgICBpZiAobWVtYmVycykgdGhpcy5tZW1iZXJzID0gbWVtYmVycy5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIHJldHVybiBpc1N0cmluZyhpdGVtKSA/IF90aGlzLmdyYXBoLmZpbmRCeUlkKGl0ZW0pIDogaXRlbTtcbiAgICB9KTtcbiAgICBpZiAobm9uTWVtYmVycykgdGhpcy5ub25NZW1iZXJzID0gbm9uTWVtYmVycy5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIHJldHVybiBpc1N0cmluZyhpdGVtKSA/IF90aGlzLmdyYXBoLmZpbmRCeUlkKGl0ZW0pIDogaXRlbTtcbiAgICB9KTtcbiAgICB0aGlzLnBhdGggPSB0aGlzLmNhbGNQYXRoKHRoaXMubWVtYmVycywgdGhpcy5ub25NZW1iZXJzKTtcbiAgICB0aGlzLnJlbmRlcigpO1xuICB9O1xuXG4gIEh1bGwucHJvdG90eXBlLnVwZGF0ZVN0eWxlID0gZnVuY3Rpb24gKGNmZykge1xuICAgIHZhciBwYXRoID0gdGhpcy5ncm91cC5maW5kQnlJZCh0aGlzLmlkKTtcbiAgICBwYXRoLmF0dHIoX19hc3NpZ24oe30sIGNmZykpO1xuICB9O1xuICAvKipcbiAgICog5pu05pawIGh1bGxcbiAgICogQHBhcmFtIGNmZyBodWxsIOmFjee9rumhuVxuICAgKi9cblxuXG4gIEh1bGwucHJvdG90eXBlLnVwZGF0ZUNmZyA9IGZ1bmN0aW9uIChjZmcpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdGhpcy5jZmcgPSBkZWVwTWl4KHRoaXMuY2ZnLCBjZmcpO1xuICAgIHRoaXMuaWQgPSB0aGlzLmNmZy5pZDtcbiAgICB0aGlzLmdyb3VwID0gdGhpcy5jZmcuZ3JvdXA7XG5cbiAgICBpZiAoY2ZnLm1lbWJlcnMpIHtcbiAgICAgIHRoaXMubWVtYmVycyA9IHRoaXMuY2ZnLm1lbWJlcnMubWFwKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgIHJldHVybiBpc1N0cmluZyhpdGVtKSA/IF90aGlzLmdyYXBoLmZpbmRCeUlkKGl0ZW0pIDogaXRlbTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChjZmcubm9uTWVtYmVycykge1xuICAgICAgdGhpcy5ub25NZW1iZXJzID0gdGhpcy5jZmcubm9uTWVtYmVycy5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgcmV0dXJuIGlzU3RyaW5nKGl0ZW0pID8gX3RoaXMuZ3JhcGguZmluZEJ5SWQoaXRlbSkgOiBpdGVtO1xuICAgICAgfSk7XG4gICAgfSAvLyBUT0RPIHBhZGRpbmcg6K6+572u5aSq5aSn77yM5Lya5b2x5ZON5YiwIGNvbnRhaW4g57uT5p6cXG5cblxuICAgIHRoaXMuc2V0UGFkZGluZygpO1xuICAgIHRoaXMuc2V0VHlwZSgpO1xuICAgIHRoaXMucGF0aCA9IHRoaXMuY2FsY1BhdGgodGhpcy5tZW1iZXJzLCB0aGlzLm5vbk1lbWJlcnMpO1xuICAgIHRoaXMucmVuZGVyKCk7XG4gIH07XG4gIC8qKlxuICAgKiDliKTmlq3mmK/lkKblnKhodWxs5YaF6YOoXG4gICAqIEBwYXJhbSBpdGVtXG4gICAqL1xuXG5cbiAgSHVsbC5wcm90b3R5cGUuY29udGFpbiA9IGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHZhciBub2RlSXRlbTtcblxuICAgIGlmIChpc1N0cmluZyhpdGVtKSkge1xuICAgICAgbm9kZUl0ZW0gPSB0aGlzLmdyYXBoLmZpbmRCeUlkKGl0ZW0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBub2RlSXRlbSA9IGl0ZW07XG4gICAgfVxuXG4gICAgdmFyIHNoYXBlUG9pbnRzO1xuICAgIHZhciBzaGFwZSA9IG5vZGVJdGVtLmdldEtleVNoYXBlKCk7XG5cbiAgICBpZiAobm9kZUl0ZW0uZ2V0KCd0eXBlJykgPT09ICdwYXRoJykge1xuICAgICAgc2hhcGVQb2ludHMgPSBwYXRoVG9Qb2ludHMoc2hhcGUuYXR0cigncGF0aCcpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHNoYXBlQkJveCA9IHNoYXBlLmdldENhbnZhc0JCb3goKTtcbiAgICAgIHNoYXBlUG9pbnRzID0gW1tzaGFwZUJCb3gubWluWCwgc2hhcGVCQm94Lm1pblldLCBbc2hhcGVCQm94Lm1heFgsIHNoYXBlQkJveC5taW5ZXSwgW3NoYXBlQkJveC5tYXhYLCBzaGFwZUJCb3gubWF4WV0sIFtzaGFwZUJCb3gubWluWCwgc2hhcGVCQm94Lm1heFldXTtcbiAgICB9XG5cbiAgICBzaGFwZVBvaW50cyA9IHNoYXBlUG9pbnRzLm1hcChmdW5jdGlvbiAoY2FudmFzUG9pbnQpIHtcbiAgICAgIHZhciBwb2ludCA9IF90aGlzLmdyYXBoLmdldFBvaW50QnlDYW52YXMoY2FudmFzUG9pbnRbMF0sIGNhbnZhc1BvaW50WzFdKTtcblxuICAgICAgcmV0dXJuIFtwb2ludC54LCBwb2ludC55XTtcbiAgICB9KTtcbiAgICByZXR1cm4gaXNQb2x5Z29uc0ludGVyc2VjdChzaGFwZVBvaW50cywgcGF0aFRvUG9pbnRzKHRoaXMucGF0aCkpO1xuICB9O1xuXG4gIEh1bGwucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5ncm91cC5yZW1vdmUoKTtcbiAgICB0aGlzLmNmZyA9IG51bGw7XG4gIH07XG5cbiAgcmV0dXJuIEh1bGw7XG59KCk7XG5cbmV4cG9ydCBkZWZhdWx0IEh1bGw7IiwiaW1wb3J0IHsgX19hc3NpZ24sIF9fZXh0ZW5kcywgX19zcHJlYWRBcnJheSB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IEV2ZW50RW1pdHRlciBmcm9tICdAYW50di9ldmVudC1lbWl0dGVyJztcbmltcG9ydCB7IGV4dCB9IGZyb20gJ0BhbnR2L21hdHJpeC11dGlsJztcbmltcG9ydCB7IGNsb25lLCBkZWVwTWl4LCBlYWNoLCBpc1BsYWluT2JqZWN0LCBpc1N0cmluZyB9IGZyb20gJ0BhbnR2L3V0aWwnO1xuaW1wb3J0IHsgZ2V0RGVncmVlLCBnZXRBZGpNYXRyaXggYXMgZ2V0QWRqYWNlbnRNYXRyaXgsIFN0YWNrLCBmbG95ZFdhcnNoYWxsIH0gZnJvbSAnQGFudHYvYWxnb3JpdGhtJztcbmltcG9ydCB7IGxlcnAsIG1vdmUgfSBmcm9tICcuLi91dGlsL21hdGgnO1xuaW1wb3J0IHsgZGF0YVZhbGlkYXRpb24sIHNpbmdsZURhdGFWYWxpZGF0aW9uIH0gZnJvbSAnLi4vdXRpbC92YWxpZGF0aW9uJztcbmltcG9ydCBHbG9iYWwgZnJvbSAnLi4vZ2xvYmFsJztcbmltcG9ydCB7IEl0ZW1Db250cm9sbGVyLCBNb2RlQ29udHJvbGxlciwgU3RhdGVDb250cm9sbGVyLCBWaWV3Q29udHJvbGxlciB9IGZyb20gJy4vY29udHJvbGxlcic7XG5pbXBvcnQgeyBwbGFpbkNvbWJvc1RvVHJlZXMsIHRyYXZlcnNlVHJlZSwgcmVjb25zdHJ1Y3RUcmVlLCB0cmF2ZXJzZVRyZWVVcCB9IGZyb20gJy4uL3V0aWwvZ3JhcGhpYyc7XG5pbXBvcnQgSHVsbCBmcm9tICcuLi9pdGVtL2h1bGwnO1xudmFyIHRyYW5zZm9ybSA9IGV4dC50cmFuc2Zvcm07XG52YXIgTk9ERSA9ICdub2RlJztcblxudmFyIEFic3RyYWN0R3JhcGggPVxuLyoqIEBjbGFzcyAqL1xuZnVuY3Rpb24gKF9zdXBlcikge1xuICBfX2V4dGVuZHMoQWJzdHJhY3RHcmFwaCwgX3N1cGVyKTtcblxuICBmdW5jdGlvbiBBYnN0cmFjdEdyYXBoKGNmZykge1xuICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7XG5cbiAgICBfdGhpcy5jZmcgPSBkZWVwTWl4KF90aGlzLmdldERlZmF1bHRDZmcoKSwgY2ZnKTtcblxuICAgIF90aGlzLmluaXQoKTtcblxuICAgIF90aGlzLmFuaW1hdGluZyA9IGZhbHNlO1xuICAgIF90aGlzLmRlc3Ryb3llZCA9IGZhbHNlOyAvLyDlkK/nlKggc3RhY2sg5ZCO77yM5a6e5L6L5YyWIHVuZG9TdGFjayDlkowgcmVkb1N0YWNrXG5cbiAgICBpZiAoX3RoaXMuY2ZnLmVuYWJsZWRTdGFjaykge1xuICAgICAgLy8g5a6e5L6L5YyWIHVuZG8g5ZKMIHJlZG8g5qCIXG4gICAgICBfdGhpcy51bmRvU3RhY2sgPSBuZXcgU3RhY2soX3RoaXMuY2ZnLm1heFN0ZXApO1xuICAgICAgX3RoaXMucmVkb1N0YWNrID0gbmV3IFN0YWNrKF90aGlzLmNmZy5tYXhTdGVwKTtcbiAgICB9XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBBYnN0cmFjdEdyYXBoLnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuaW5pdENhbnZhcygpOyAvLyBpbnN0YW5jZSBjb250cm9sbGVyXG5cbiAgICB2YXIgdmlld0NvbnRyb2xsZXIgPSBuZXcgVmlld0NvbnRyb2xsZXIodGhpcyk7XG4gICAgdmFyIG1vZGVDb250cm9sbGVyID0gbmV3IE1vZGVDb250cm9sbGVyKHRoaXMpO1xuICAgIHZhciBpdGVtQ29udHJvbGxlciA9IG5ldyBJdGVtQ29udHJvbGxlcih0aGlzKTtcbiAgICB2YXIgc3RhdGVDb250cm9sbGVyID0gbmV3IFN0YXRlQ29udHJvbGxlcih0aGlzKTtcbiAgICB0aGlzLnNldCh7XG4gICAgICB2aWV3Q29udHJvbGxlcjogdmlld0NvbnRyb2xsZXIsXG4gICAgICBtb2RlQ29udHJvbGxlcjogbW9kZUNvbnRyb2xsZXIsXG4gICAgICBpdGVtQ29udHJvbGxlcjogaXRlbUNvbnRyb2xsZXIsXG4gICAgICBzdGF0ZUNvbnRyb2xsZXI6IHN0YXRlQ29udHJvbGxlclxuICAgIH0pOyAvLyDliJ3lp4vljJbluIPlsYDmnLrliLZcblxuICAgIHRoaXMuaW5pdExheW91dENvbnRyb2xsZXIoKTsgLy8g5Yid5aeL5YyW5LqL5Lu25py65Yi2XG5cbiAgICB0aGlzLmluaXRFdmVudENvbnRyb2xsZXIoKTtcbiAgICB0aGlzLmluaXRHcm91cHMoKTtcbiAgICAvKiog5Yid5aeL5YyW5o+S5Lu2ICovXG5cbiAgICB0aGlzLmluaXRQbHVnaW5zKCk7XG4gIH07IC8vIOWIneWni+WMluaJgOaciSBHcm91cFxuXG5cbiAgQWJzdHJhY3RHcmFwaC5wcm90b3R5cGUuaW5pdEdyb3VwcyA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgY2FudmFzID0gdGhpcy5nZXQoJ2NhbnZhcycpO1xuICAgIGlmICghY2FudmFzKSByZXR1cm47XG4gICAgdmFyIGVsID0gY2FudmFzLmdldCgnZWwnKTtcbiAgICB2YXIgX2EgPSAoZWwgfHwge30pLmlkLFxuICAgICAgICBpZCA9IF9hID09PSB2b2lkIDAgPyAnZzYnIDogX2E7XG4gICAgdmFyIGdyb3VwID0gY2FudmFzLmFkZEdyb3VwKHtcbiAgICAgIGlkOiBpZCArIFwiLXJvb3RcIixcbiAgICAgIGNsYXNzTmFtZTogR2xvYmFsLnJvb3RDb250YWluZXJDbGFzc05hbWVcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLmdldCgnZ3JvdXBCeVR5cGVzJykpIHtcbiAgICAgIHZhciBlZGdlR3JvdXAgPSBncm91cC5hZGRHcm91cCh7XG4gICAgICAgIGlkOiBpZCArIFwiLWVkZ2VcIixcbiAgICAgICAgY2xhc3NOYW1lOiBHbG9iYWwuZWRnZUNvbnRhaW5lckNsYXNzTmFtZVxuICAgICAgfSk7XG4gICAgICB2YXIgbm9kZUdyb3VwID0gZ3JvdXAuYWRkR3JvdXAoe1xuICAgICAgICBpZDogaWQgKyBcIi1ub2RlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogR2xvYmFsLm5vZGVDb250YWluZXJDbGFzc05hbWVcbiAgICAgIH0pO1xuICAgICAgdmFyIGNvbWJvR3JvdXAgPSBncm91cC5hZGRHcm91cCh7XG4gICAgICAgIGlkOiBpZCArIFwiLWNvbWJvXCIsXG4gICAgICAgIGNsYXNzTmFtZTogR2xvYmFsLmNvbWJvQ29udGFpbmVyQ2xhc3NOYW1lXG4gICAgICB9KTsgLy8g55So5LqO5a2Y5YKo6Ieq5a6a5LmJ55qE576k57uEXG5cbiAgICAgIGNvbWJvR3JvdXAudG9CYWNrKCk7XG4gICAgICB0aGlzLnNldCh7XG4gICAgICAgIG5vZGVHcm91cDogbm9kZUdyb3VwLFxuICAgICAgICBlZGdlR3JvdXA6IGVkZ2VHcm91cCxcbiAgICAgICAgY29tYm9Hcm91cDogY29tYm9Hcm91cFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdmFyIGRlbGVnYXRlR3JvdXAgPSBncm91cC5hZGRHcm91cCh7XG4gICAgICBpZDogaWQgKyBcIi1kZWxlZ2F0ZVwiLFxuICAgICAgY2xhc3NOYW1lOiBHbG9iYWwuZGVsZWdhdGVDb250YWluZXJDbGFzc05hbWVcbiAgICB9KTtcbiAgICB0aGlzLnNldCh7XG4gICAgICBkZWxlZ2F0ZUdyb3VwOiBkZWxlZ2F0ZUdyb3VwXG4gICAgfSk7XG4gICAgdGhpcy5zZXQoJ2dyb3VwJywgZ3JvdXApO1xuICB9OyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY2xhc3MtbWV0aG9kcy11c2UtdGhpc1xuXG5cbiAgQWJzdHJhY3RHcmFwaC5wcm90b3R5cGUuZ2V0RGVmYXVsdENmZyA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLyoqXG4gICAgICAgKiBDb250YWluZXIgY291bGQgYmUgZG9tIG9iamVjdCBvciBkb20gaWRcbiAgICAgICAqL1xuICAgICAgY29udGFpbmVyOiB1bmRlZmluZWQsXG5cbiAgICAgIC8qKlxuICAgICAgICogQ2FudmFzIHdpZHRoXG4gICAgICAgKiB1bml0IHBpeGVsIGlmIHVuZGVmaW5lZCBmb3JjZSBmaXQgd2lkdGhcbiAgICAgICAqL1xuICAgICAgd2lkdGg6IHVuZGVmaW5lZCxcblxuICAgICAgLyoqXG4gICAgICAgKiBDYW52YXMgaGVpZ2h0XG4gICAgICAgKiB1bml0IHBpeGVsIGlmIHVuZGVmaW5lZCBmb3JjZSBmaXQgaGVpZ2h0XG4gICAgICAgKi9cbiAgICAgIGhlaWdodDogdW5kZWZpbmVkLFxuXG4gICAgICAvKipcbiAgICAgICAqIHJlbmRlcmVyIGNhbnZhcyBvciBzdmdcbiAgICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICAgKi9cbiAgICAgIHJlbmRlcmVyOiAnY2FudmFzJyxcblxuICAgICAgLyoqXG4gICAgICAgKiBjb250cm9sIGdyYXBoIGJlaGF2aW9yc1xuICAgICAgICovXG4gICAgICBtb2Rlczoge30sXG5cbiAgICAgIC8qKlxuICAgICAgICog5rOo5YaM5o+S5Lu2XG4gICAgICAgKi9cbiAgICAgIHBsdWdpbnM6IFtdLFxuXG4gICAgICAvKipcbiAgICAgICAqIHNvdXJjZSBkYXRhXG4gICAgICAgKi9cbiAgICAgIGRhdGE6IHt9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEZpdCB2aWV3IHBhZGRpbmcgKGNsaWVudCBzY2FsZSlcbiAgICAgICAqL1xuICAgICAgZml0Vmlld1BhZGRpbmc6IDEwLFxuXG4gICAgICAvKipcbiAgICAgICAqIE1pbmltdW0gc2NhbGUgc2l6ZVxuICAgICAgICovXG4gICAgICBtaW5ab29tOiAwLjIsXG5cbiAgICAgIC8qKlxuICAgICAgICogTWF4bXVtIHNjYWxlIHNpemVcbiAgICAgICAqL1xuICAgICAgbWF4Wm9vbTogMTAsXG5cbiAgICAgIC8qKlxuICAgICAgICogIGNhcHR1cmUgZXZlbnRzXG4gICAgICAgKi9cbiAgICAgIGV2ZW50OiB0cnVlLFxuXG4gICAgICAvKipcbiAgICAgICAqIGdyb3VwIG5vZGUgJiBlZGdlcyBpbnRvIGRpZmZlcmVudCBncmFwaGljIGdyb3Vwc1xuICAgICAgICovXG4gICAgICBncm91cEJ5VHlwZXM6IHRydWUsXG5cbiAgICAgIC8qKlxuICAgICAgICogZGV0ZXJtaW5lIGlmIGl0J3MgYSBkaXJlY3RlZCBncmFwaFxuICAgICAgICovXG4gICAgICBkaXJlY3RlZDogZmFsc2UsXG5cbiAgICAgIC8qKlxuICAgICAgICogd2hlbiBkYXRhIG9yIHNoYXBlIGNoYW5nZWQsIHNob3VsZCBjYW52YXMgZHJhdyBhdXRvbWF0aWNhbGx5XG4gICAgICAgKi9cbiAgICAgIGF1dG9QYWludDogdHJ1ZSxcblxuICAgICAgLyoqXG4gICAgICAgKiBzdG9yZSBhbGwgdGhlIG5vZGUgaW5zdGFuY2VzXG4gICAgICAgKi9cbiAgICAgIG5vZGVzOiBbXSxcblxuICAgICAgLyoqXG4gICAgICAgKiBzdG9yZSBhbGwgdGhlIGVkZ2UgaW5zdGFuY2VzXG4gICAgICAgKi9cbiAgICAgIGVkZ2VzOiBbXSxcblxuICAgICAgLyoqXG4gICAgICAgKiBzdG9yZSBhbGwgdGhlIGNvbWJvIGluc3RhbmNlc1xuICAgICAgICovXG4gICAgICBjb21ib3M6IFtdLFxuXG4gICAgICAvKipcbiAgICAgICAqIHN0b3JlIGFsbCB0aGUgZWRnZSBpbnN0YW5jZXMgd2hpY2ggYXJlIHZpcnR1YWwgZWRnZXMgcmVsYXRlZCB0byBjb2xsYXBzZWQgY29tYm9cbiAgICAgICAqL1xuICAgICAgdmVkZ2VzOiBbXSxcblxuICAgICAgLyoqXG4gICAgICAgKiBhbGwgdGhlIGluc3RhbmNlcyBpbmRleGVkIGJ5IGlkXG4gICAgICAgKi9cbiAgICAgIGl0ZW1NYXA6IHt9LFxuXG4gICAgICAvKipcbiAgICAgICAqIOi+ueebtOaOpei/nuaOpeWIsOiKgueCueeahOS4reW/g++8jOS4jeWGjeiAg+iZkemUmueCuVxuICAgICAgICovXG4gICAgICBsaW5rQ2VudGVyOiBmYWxzZSxcblxuICAgICAgLyoqXG4gICAgICAgKiDpu5jorqTnmoToioLngrnphY3nva7vvIxkYXRhIOS4iuWumuS5ieeahOmFjee9ruS8muimhueblui/meS6m+mFjee9ruOAguS+i+Wmgu+8mlxuICAgICAgICogZGVmYXVsdE5vZGU6IHtcbiAgICAgICAqICB0eXBlOiAncmVjdCcsXG4gICAgICAgKiAgc2l6ZTogWzYwLCA0MF0sXG4gICAgICAgKiAgc3R5bGU6IHtcbiAgICAgICAqICAgIC8vLi4uIOagt+W8j+mFjee9rumhuVxuICAgICAgICogIH1cbiAgICAgICAqIH1cbiAgICAgICAqIOiLpeaVsOaNrumhueS4uiB7IGlkOiAnbm9kZScsIHg6IDEwMCwgeTogMTAwIH1cbiAgICAgICAqIOWunumZheWIm+W7uueahOiKgueCueaooeWei+aYryB7IGlkOiAnbm9kZScsIHg6IDEwMCwgeTogMTAw77yMIHR5cGU6ICdyZWN0Jywgc2l6ZTogWzYwLCA0MF0gfVxuICAgICAgICog6Iul5pWw5o2u6aG55Li6IHsgaWQ6ICdub2RlJywgeDogMTAwLCB5OiAxMDAsIHR5cGU6ICdjaXJjbGUnIH1cbiAgICAgICAqIOWunumZheWIm+W7uueahOiKgueCueaooeWei+aYryB7IGlkOiAnbm9kZScsIHg6IDEwMCwgeTogMTAw77yMIHR5cGU6ICdjaXJjbGUnLCBzaXplOiBbNjAsIDQwXSB9XG4gICAgICAgKi9cbiAgICAgIGRlZmF1bHROb2RlOiB7fSxcblxuICAgICAgLyoqXG4gICAgICAgKiDpu5jorqTovrnphY3nva7vvIxkYXRhIOS4iuWumuS5ieeahOmFjee9ruS8muimhueblui/meS6m+mFjee9ruOAgueUqOazleWQjCBkZWZhdWx0Tm9kZVxuICAgICAgICovXG4gICAgICBkZWZhdWx0RWRnZToge30sXG5cbiAgICAgIC8qKlxuICAgICAgICog6IqC54K56buY6K6k5qC35byP77yM5Lmf5Y+v5Lul5re75Yqg54q25oCB5qC35byPXG4gICAgICAgKiDkvovlpoLvvJpcbiAgICAgICAqIGNvbnN0IGdyYXBoID0gbmV3IEc2LkdyYXBoKHtcbiAgICAgICAqICBub2RlU3RhdGVTdHlsZXM6IHtcbiAgICAgICAqICAgIHNlbGVjdGVkOiB7IGZpbGw6ICcjY2NjJywgc3Ryb2tlOiAnIzY2NicgfSxcbiAgICAgICAqICAgIGFjdGl2ZTogeyBsaW5lV2lkdGg6IDIgfVxuICAgICAgICogIH0sXG4gICAgICAgKiAgLi4uXG4gICAgICAgKiB9KTtcbiAgICAgICAqXG4gICAgICAgKi9cbiAgICAgIG5vZGVTdGF0ZVN0eWxlczoge30sXG5cbiAgICAgIC8qKlxuICAgICAgICog6L656buY6K6k5qC35byP77yM55So5rOV5ZCMbm9kZVN0YXRlU3R5bGVcbiAgICAgICAqL1xuICAgICAgZWRnZVN0YXRlU3R5bGVzOiB7fSxcblxuICAgICAgLyoqXG4gICAgICAgKiBncmFwaCDnirbmgIFcbiAgICAgICAqL1xuICAgICAgc3RhdGVzOiB7fSxcblxuICAgICAgLyoqXG4gICAgICAgKiDmmK/lkKblkK/nlKjlhajlsYDliqjnlLtcbiAgICAgICAqL1xuICAgICAgYW5pbWF0ZTogZmFsc2UsXG5cbiAgICAgIC8qKlxuICAgICAgICog5Yqo55S76K6+572uLOS7heWcqCBhbmltYXRlIOS4uiB0cnVlIOaXtuacieaViFxuICAgICAgICovXG4gICAgICBhbmltYXRlQ2ZnOiB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiDluKflm57osIPlh73mlbDvvIznlKjkuo7oh6rlrprkuYnoioLngrnov5Dliqjot6/lvoTvvIzkuLrnqbrml7bnur/mgKfov5DliqhcbiAgICAgICAgICovXG4gICAgICAgIG9uRnJhbWU6IHVuZGVmaW5lZCxcblxuICAgICAgICAvKipcbiAgICAgICAgICog5Yqo55S75pe26ZW/KG1zKVxuICAgICAgICAgKi9cbiAgICAgICAgZHVyYXRpb246IDUwMCxcblxuICAgICAgICAvKipcbiAgICAgICAgICog5oyH5a6a5Yqo55S75Yqo5pWIXG4gICAgICAgICAqL1xuICAgICAgICBlYXNpbmc6ICdlYXNlTGluZWFyJ1xuICAgICAgfSxcbiAgICAgIGNhbGxiYWNrOiB1bmRlZmluZWQsXG4gICAgICAvLyDpu5jorqTkuI3lkK/nlKggdW5kbyAmIHJlZG8g5Yqf6IO9XG4gICAgICBlbmFibGVkU3RhY2s6IGZhbHNlLFxuICAgICAgLy8g5Y+q5pyJ5b2TIGVuYWJsZWRTdGFjayDkuLogdHJ1ZSDml7bmiY3otbfkvZznlKhcbiAgICAgIG1heFN0ZXA6IDEwLFxuICAgICAgLy8g5a2Y5YKo5Zu+5LiK55qEIHRvb2x0aXAgZG9t77yM5pa55L6/6ZSA5q+BXG4gICAgICB0b29sdGlwczogW11cbiAgICB9O1xuICB9O1xuICAvKipcbiAgICog5bCG5YC86K6+572u5YiwIHRoaXMuY2ZnIOWPmOmHj+S4iumdolxuICAgKiBAcGFyYW0ga2V5IOmUriDmiJYg5a+56LGh5YC8XG4gICAqIEBwYXJhbSB2YWwg5YC8XG4gICAqL1xuXG5cbiAgQWJzdHJhY3RHcmFwaC5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKGtleSwgdmFsKSB7XG4gICAgaWYgKGlzUGxhaW5PYmplY3Qoa2V5KSkge1xuICAgICAgdGhpcy5jZmcgPSBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgdGhpcy5jZmcpLCBrZXkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNmZ1trZXldID0gdmFsO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuICAvKipcbiAgICog6I635Y+WIHRoaXMuY2ZnIOS4reeahOWAvFxuICAgKiBAcGFyYW0ga2V5IOmUrlxuICAgKi9cblxuXG4gIEFic3RyYWN0R3JhcGgucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICB2YXIgX2E7XG5cbiAgICByZXR1cm4gKF9hID0gdGhpcy5jZmcpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYVtrZXldO1xuICB9O1xuICAvKipcbiAgICog6I635Y+WIGdyYXBoIOeahOagueWbvuW9ouWIhue7hFxuICAgKiBAcmV0dXJuIOaguSBncm91cFxuICAgKi9cblxuXG4gIEFic3RyYWN0R3JhcGgucHJvdG90eXBlLmdldEdyb3VwID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLmdldCgnZ3JvdXAnKTtcbiAgfTtcbiAgLyoqXG4gICAqIOiOt+WPliBncmFwaCDnmoQgRE9NIOWuueWZqFxuICAgKiBAcmV0dXJuIERPTSDlrrnlmahcbiAgICovXG5cblxuICBBYnN0cmFjdEdyYXBoLnByb3RvdHlwZS5nZXRDb250YWluZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KCdjb250YWluZXInKTtcbiAgfTtcbiAgLyoqXG4gICAqIOiOt+WPliBncmFwaCDnmoTmnIDlsI/nvKnmlL7mr5TkvotcbiAgICogQHJldHVybiBtaW5ab29tXG4gICAqL1xuXG5cbiAgQWJzdHJhY3RHcmFwaC5wcm90b3R5cGUuZ2V0TWluWm9vbSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXQoJ21pblpvb20nKTtcbiAgfTtcbiAgLyoqXG4gICAqIOiuvue9riBncmFwaCDnmoTmnIDlsI/nvKnmlL7mr5TkvotcbiAgICogQHJldHVybiBtaW5ab29tXG4gICAqL1xuXG5cbiAgQWJzdHJhY3RHcmFwaC5wcm90b3R5cGUuc2V0TWluWm9vbSA9IGZ1bmN0aW9uIChyYXRpbykge1xuICAgIHJldHVybiB0aGlzLnNldCgnbWluWm9vbScsIHJhdGlvKTtcbiAgfTtcbiAgLyoqXG4gICAqIOiOt+WPliBncmFwaCDnmoTmnIDlpKfnvKnmlL7mr5TkvotcbiAgICogQHBhcmFtIG1heFpvb21cbiAgICovXG5cblxuICBBYnN0cmFjdEdyYXBoLnByb3RvdHlwZS5nZXRNYXhab29tID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLmdldCgnbWF4Wm9vbScpO1xuICB9O1xuICAvKipcbiAgICog6K6+572uIGdyYXBoIOeahOacgOWkp+e8qeaUvuavlOS+i1xuICAgKiBAcGFyYW0gbWF4Wm9vbVxuICAgKi9cblxuXG4gIEFic3RyYWN0R3JhcGgucHJvdG90eXBlLnNldE1heFpvb20gPSBmdW5jdGlvbiAocmF0aW8pIHtcbiAgICByZXR1cm4gdGhpcy5zZXQoJ21heFpvb20nLCByYXRpbyk7XG4gIH07XG4gIC8qKlxuICAgKiDojrflj5YgZ3JhcGgg55qE5a695bqmXG4gICAqIEByZXR1cm4gd2lkdGhcbiAgICovXG5cblxuICBBYnN0cmFjdEdyYXBoLnByb3RvdHlwZS5nZXRXaWR0aCA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXQoJ3dpZHRoJyk7XG4gIH07XG4gIC8qKlxuICAgKiDojrflj5YgZ3JhcGgg55qE6auY5bqmXG4gICAqIEByZXR1cm4gd2lkdGhcbiAgICovXG5cblxuICBBYnN0cmFjdEdyYXBoLnByb3RvdHlwZS5nZXRIZWlnaHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KCdoZWlnaHQnKTtcbiAgfTtcbiAgLyoqXG4gICAqIOa4heeQhuWFg+e0oOWkmuS4queKtuaAgVxuICAgKiBAcGFyYW0ge3N0cmluZ3xJdGVtfSBpdGVtIOWFg+e0oGlk5oiW5YWD57Sg5a6e5L6LXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IHN0YXRlcyDnirbmgIFcbiAgICovXG5cblxuICBBYnN0cmFjdEdyYXBoLnByb3RvdHlwZS5jbGVhckl0ZW1TdGF0ZXMgPSBmdW5jdGlvbiAoaXRlbSwgc3RhdGVzKSB7XG4gICAgaWYgKGlzU3RyaW5nKGl0ZW0pKSB7XG4gICAgICBpdGVtID0gdGhpcy5maW5kQnlJZChpdGVtKTtcbiAgICB9XG5cbiAgICB2YXIgaXRlbUNvbnRyb2xsZXIgPSB0aGlzLmdldCgnaXRlbUNvbnRyb2xsZXInKTtcblxuICAgIGlmICghc3RhdGVzKSB7XG4gICAgICBzdGF0ZXMgPSBpdGVtLmdldCgnc3RhdGVzJyk7XG4gICAgfVxuXG4gICAgaXRlbUNvbnRyb2xsZXIuY2xlYXJJdGVtU3RhdGVzKGl0ZW0sIHN0YXRlcyk7XG4gICAgdmFyIHN0YXRlQ29udHJvbGxlciA9IHRoaXMuZ2V0KCdzdGF0ZUNvbnRyb2xsZXInKTtcbiAgICBzdGF0ZUNvbnRyb2xsZXIudXBkYXRlU3RhdGVzKGl0ZW0sIHN0YXRlcywgZmFsc2UpO1xuICB9O1xuICAvKipcbiAgICog6K6+572u5ZCE5Liq6IqC54K55qC35byP77yM5Lul5Y+K5Zyo5ZCE56eN54q25oCB5LiL6IqC54K5IGtleVNoYXBlIOeahOagt+W8j+OAglxuICAgKiDoi6XmmK/oh6rlrprkuYnoioLngrnliIflnKjlkITnp43nirbmgIHkuItcbiAgICogZ3JhcGgubm9kZShub2RlID0+IHtcbiAgICogIHJldHVybiB7XG4gICAqICAgIHR5cGU6ICdyZWN0JyxcbiAgICogICAgbGFiZWw6IG5vZGUuaWQsXG4gICAqICAgIHN0eWxlOiB7IGZpbGw6ICcjNjY2JyB9LFxuICAgKiAgICBzdGF0ZVN0eWxlczoge1xuICAgKiAgICAgICBzZWxlY3RlZDogeyBmaWxsOiAnYmx1ZScgfSxcbiAgICogICAgICAgY3VzdG9tOiB7IGZpbGw6ICdncmVlbicgfVxuICAgKiAgICAgfVxuICAgKiAgIH1cbiAgICogfSk7XG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IG5vZGVGbiDmjIflrprmr4/kuKroioLngrnmoLflvI9cbiAgICovXG5cblxuICBBYnN0cmFjdEdyYXBoLnByb3RvdHlwZS5ub2RlID0gZnVuY3Rpb24gKG5vZGVGbikge1xuICAgIGlmICh0eXBlb2Ygbm9kZUZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzLnNldCgnbm9kZU1hcHBlcicsIG5vZGVGbik7XG4gICAgfVxuICB9O1xuICAvKipcbiAgICog6K6+572u5ZCE5Liq6L655qC35byPXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IGVkZ2VGbiDmjIflrprmr4/kuKrovrnnmoTmoLflvI8s55So5rOV5ZCMIG5vZGVcbiAgICovXG5cblxuICBBYnN0cmFjdEdyYXBoLnByb3RvdHlwZS5lZGdlID0gZnVuY3Rpb24gKGVkZ2VGbikge1xuICAgIGlmICh0eXBlb2YgZWRnZUZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzLnNldCgnZWRnZU1hcHBlcicsIGVkZ2VGbik7XG4gICAgfVxuICB9O1xuICAvKipcbiAgICog6K6+572u5ZCE5LiqIGNvbWJvIOeahOmFjee9rlxuICAgKiBAcGFyYW0gY29tYm9GblxuICAgKi9cblxuXG4gIEFic3RyYWN0R3JhcGgucHJvdG90eXBlLmNvbWJvID0gZnVuY3Rpb24gKGNvbWJvRm4pIHtcbiAgICBpZiAodHlwZW9mIGNvbWJvRm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRoaXMuc2V0KCdjb21ib01hcHBlcicsIGNvbWJvRm4pO1xuICAgIH1cbiAgfTtcbiAgLyoqXG4gICAqIOagueaNriBJRCDmn6Xor6Llm77lhYPntKDlrp7kvotcbiAgICogQHBhcmFtIGlkIOWbvuWFg+e0oCBJRFxuICAgKi9cblxuXG4gIEFic3RyYWN0R3JhcGgucHJvdG90eXBlLmZpbmRCeUlkID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KCdpdGVtTWFwJylbaWRdO1xuICB9O1xuICAvKipcbiAgICog5qC55o2u5a+55bqU6KeE5YiZ5p+l5om+5Y2V5Liq5YWD57SgXG4gICAqIEBwYXJhbSB7SVRFTV9UWVBFfSB0eXBlIOWFg+e0oOexu+Weiyhub2RlIHwgZWRnZSB8IGdyb3VwKVxuICAgKiBAcGFyYW0geyhpdGVtOiBULCBpbmRleDogbnVtYmVyKSA9PiBUfSBmbiDmjIflrprop4TliJlcbiAgICogQHJldHVybiB7VH0g5YWD57Sg5a6e5L6LXG4gICAqL1xuXG5cbiAgQWJzdHJhY3RHcmFwaC5wcm90b3R5cGUuZmluZCA9IGZ1bmN0aW9uICh0eXBlLCBmbikge1xuICAgIHZhciByZXN1bHQ7XG4gICAgdmFyIGl0ZW1zID0gdGhpcy5nZXQodHlwZSArIFwic1wiKTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbnNpc3RlbnQtcmV0dXJuXG5cbiAgICBlYWNoKGl0ZW1zLCBmdW5jdGlvbiAoaXRlbSwgaSkge1xuICAgICAgaWYgKGZuKGl0ZW0sIGkpKSB7XG4gICAgICAgIHJlc3VsdCA9IGl0ZW07XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbiAgLyoqXG4gICAqIOafpeaJvuaJgOaciea7oei2s+inhOWImeeahOWFg+e0oFxuICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSDlhYPntKDnsbvlnosobm9kZXxlZGdlKVxuICAgKiBAcGFyYW0ge3N0cmluZ30gZm4g5oyH5a6a6KeE5YiZXG4gICAqIEByZXR1cm4ge2FycmF5fSDlhYPntKDlrp7kvotcbiAgICovXG5cblxuICBBYnN0cmFjdEdyYXBoLnByb3RvdHlwZS5maW5kQWxsID0gZnVuY3Rpb24gKHR5cGUsIGZuKSB7XG4gICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgIGVhY2godGhpcy5nZXQodHlwZSArIFwic1wiKSwgZnVuY3Rpb24gKGl0ZW0sIGkpIHtcbiAgICAgIGlmIChmbihpdGVtLCBpKSkge1xuICAgICAgICByZXN1bHQucHVzaChpdGVtKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuICAvKipcbiAgICog5p+l5om+5omA5pyJ5aSE5LqO5oyH5a6a54q25oCB55qE5YWD57SgXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIOWFg+e0oOexu+Weiyhub2RlfGVkZ2UpXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdGF0ZSDnirbmgIFcbiAgICogQHJldHVybiB7b2JqZWN0fSDlhYPntKDlrp7kvotcbiAgICovXG5cblxuICBBYnN0cmFjdEdyYXBoLnByb3RvdHlwZS5maW5kQWxsQnlTdGF0ZSA9IGZ1bmN0aW9uICh0eXBlLCBzdGF0ZSkge1xuICAgIHJldHVybiB0aGlzLmZpbmRBbGwodHlwZSwgZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIHJldHVybiBpdGVtLmhhc1N0YXRlKHN0YXRlKTtcbiAgICB9KTtcbiAgfTtcbiAgLyoqXG4gICAqIOW5s+enu+eUu+W4g1xuICAgKiBAcGFyYW0gZHgg5rC05bmz5pa55ZCR5L2N56e7XG4gICAqIEBwYXJhbSBkeSDlnoLnm7TmlrnlkJHkvY3np7tcbiAgICovXG5cblxuICBBYnN0cmFjdEdyYXBoLnByb3RvdHlwZS50cmFuc2xhdGUgPSBmdW5jdGlvbiAoZHgsIGR5KSB7XG4gICAgdmFyIGdyb3VwID0gdGhpcy5nZXQoJ2dyb3VwJyk7XG4gICAgdmFyIG1hdHJpeCA9IGNsb25lKGdyb3VwLmdldE1hdHJpeCgpKTtcblxuICAgIGlmICghbWF0cml4KSB7XG4gICAgICBtYXRyaXggPSBbMSwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMV07XG4gICAgfVxuXG4gICAgbWF0cml4ID0gdHJhbnNmb3JtKG1hdHJpeCwgW1sndCcsIGR4LCBkeV1dKTtcbiAgICBncm91cC5zZXRNYXRyaXgobWF0cml4KTtcbiAgICB0aGlzLmVtaXQoJ3ZpZXdwb3J0Y2hhbmdlJywge1xuICAgICAgYWN0aW9uOiAndHJhbnNsYXRlJyxcbiAgICAgIG1hdHJpeDogZ3JvdXAuZ2V0TWF0cml4KClcbiAgICB9KTtcbiAgICB0aGlzLmF1dG9QYWludCgpO1xuICB9O1xuICAvKipcbiAgICog5bmz56e755S75biD5Yiw5p+Q54K5XG4gICAqIEBwYXJhbSB7bnVtYmVyfSB4IOawtOW5s+WdkOagh1xuICAgKiBAcGFyYW0ge251bWJlcn0geSDlnoLnm7TlnZDmoIdcbiAgICovXG5cblxuICBBYnN0cmFjdEdyYXBoLnByb3RvdHlwZS5tb3ZlVG8gPSBmdW5jdGlvbiAoeCwgeSwgYW5pbWF0ZSwgYW5pbWF0ZUNmZykge1xuICAgIHZhciBncm91cCA9IHRoaXMuZ2V0KCdncm91cCcpO1xuICAgIG1vdmUoZ3JvdXAsIHtcbiAgICAgIHg6IHgsXG4gICAgICB5OiB5XG4gICAgfSwgYW5pbWF0ZSwgYW5pbWF0ZUNmZyB8fCB7XG4gICAgICBkdXJhdGlvbjogNTAwLFxuICAgICAgZWFzaW5nOiAnZWFzZUN1YmljJ1xuICAgIH0pO1xuICAgIHRoaXMuZW1pdCgndmlld3BvcnRjaGFuZ2UnLCB7XG4gICAgICBhY3Rpb246ICdtb3ZlJyxcbiAgICAgIG1hdHJpeDogZ3JvdXAuZ2V0TWF0cml4KClcbiAgICB9KTtcbiAgfTtcbiAgLyoqXG4gICAqIOiwg+aVtOinhuWPo+mAguW6lOinhuWbvlxuICAgKiBAcGFyYW0ge29iamVjdH0gcGFkZGluZyDlm5vlkajlm7Tovrnot51cbiAgICogQHBhcmFtIHtGaXRWaWV3UnVsZXN9IHJ1bGVzIGZpdFZpZXfnmoTop4TliJlcbiAgICovXG5cblxuICBBYnN0cmFjdEdyYXBoLnByb3RvdHlwZS5maXRWaWV3ID0gZnVuY3Rpb24gKHBhZGRpbmcsIHJ1bGVzKSB7XG4gICAgaWYgKHBhZGRpbmcpIHtcbiAgICAgIHRoaXMuc2V0KCdmaXRWaWV3UGFkZGluZycsIHBhZGRpbmcpO1xuICAgIH1cblxuICAgIHZhciB2aWV3Q29udHJvbGxlciA9IHRoaXMuZ2V0KCd2aWV3Q29udHJvbGxlcicpO1xuXG4gICAgaWYgKHJ1bGVzKSB7XG4gICAgICB2aWV3Q29udHJvbGxlci5maXRWaWV3QnlSdWxlcyhydWxlcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZpZXdDb250cm9sbGVyLmZpdFZpZXcoKTtcbiAgICB9XG5cbiAgICB0aGlzLmF1dG9QYWludCgpO1xuICB9O1xuICAvKipcbiAgICog6LCD5pW06KeG5Y+j6YCC5bqU6KeG5Zu+77yM5LiN57yp5pS+77yM5LuF5bCG5Zu+IGJib3gg5Lit5b+D5a+56b2Q5Yiw55S75biD5Lit5b+DXG4gICAqL1xuXG5cbiAgQWJzdHJhY3RHcmFwaC5wcm90b3R5cGUuZml0Q2VudGVyID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciB2aWV3Q29udHJvbGxlciA9IHRoaXMuZ2V0KCd2aWV3Q29udHJvbGxlcicpO1xuICAgIHZpZXdDb250cm9sbGVyLmZpdENlbnRlcigpO1xuICAgIHRoaXMuYXV0b1BhaW50KCk7XG4gIH07XG4gIC8qKlxuICAgKiDmlrDlop7ooYzkuLpcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBNb2RlT3B0aW9uIHwgTW9kZVR5cGVbXX0gYmVoYXZpb3JzIOa3u+WKoOeahOihjOS4ulxuICAgKiBAcGFyYW0ge3N0cmluZyB8IHN0cmluZ1tdfSBtb2RlcyDmt7vliqDliLDlr7nlupTnmoTmqKHlvI9cbiAgICogQHJldHVybiB7R3JhcGh9IEdyYXBoXG4gICAqL1xuXG5cbiAgQWJzdHJhY3RHcmFwaC5wcm90b3R5cGUuYWRkQmVoYXZpb3JzID0gZnVuY3Rpb24gKGJlaGF2aW9ycywgbW9kZXMpIHtcbiAgICB2YXIgbW9kZUNvbnRyb2xsZXIgPSB0aGlzLmdldCgnbW9kZUNvbnRyb2xsZXInKTtcbiAgICBtb2RlQ29udHJvbGxlci5tYW5pcHVsYXRlQmVoYXZpb3JzKGJlaGF2aW9ycywgbW9kZXMsIHRydWUpO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuICAvKipcbiAgICog56e76Zmk6KGM5Li6XG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgTW9kZU9wdGlvbiB8IE1vZGVUeXBlW119IGJlaGF2aW9ycyDnp7vpmaTnmoTooYzkuLpcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBzdHJpbmdbXX0gbW9kZXMg5LuO5oyH5a6a55qE5qih5byP5Lit56e76ZmkXG4gICAqIEByZXR1cm4ge0dyYXBofSBHcmFwaFxuICAgKi9cblxuXG4gIEFic3RyYWN0R3JhcGgucHJvdG90eXBlLnJlbW92ZUJlaGF2aW9ycyA9IGZ1bmN0aW9uIChiZWhhdmlvcnMsIG1vZGVzKSB7XG4gICAgdmFyIG1vZGVDb250cm9sbGVyID0gdGhpcy5nZXQoJ21vZGVDb250cm9sbGVyJyk7XG4gICAgbW9kZUNvbnRyb2xsZXIubWFuaXB1bGF0ZUJlaGF2aW9ycyhiZWhhdmlvcnMsIG1vZGVzLCBmYWxzZSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG4gIC8qKlxuICAgKiDmm7TmlrDooYzkuLrlj4LmlbBcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBNb2RlT3B0aW9uIHwgTW9kZVR5cGV9IGJlaGF2aW9yIOmcgOimgeabtOaWsOeahOihjOS4ulxuICAgKiBAcGFyYW0ge3N0cmluZyB8IHN0cmluZ1tdfSBtb2RlcyDmjIflrprnmoTmqKHlvI/kuK3nmoTooYzkuLrvvIzkuI3mjIflrprliJnkuLogZGVmYXVsdFxuICAgKiBAcmV0dXJuIHtHcmFwaH0gR3JhcGhcbiAgICovXG5cblxuICBBYnN0cmFjdEdyYXBoLnByb3RvdHlwZS51cGRhdGVCZWhhdmlvciA9IGZ1bmN0aW9uIChiZWhhdmlvciwgbmV3Q2ZnLCBtb2RlKSB7XG4gICAgdmFyIG1vZGVDb250cm9sbGVyID0gdGhpcy5nZXQoJ21vZGVDb250cm9sbGVyJyk7XG4gICAgbW9kZUNvbnRyb2xsZXIudXBkYXRlQmVoYXZpb3IoYmVoYXZpb3IsIG5ld0NmZywgbW9kZSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG4gIC8qKlxuICAgKiDkvLjnvKnnqpflj6NcbiAgICogQHBhcmFtIHJhdGlvIOS8uOe8qeavlOS+i1xuICAgKiBAcGFyYW0gY2VudGVyIOS7pWNlbnRlcueahHgsIHnlnZDmoIfkuLrkuK3lv4PnvKnmlL5cbiAgICogQHBhcmFtIHtib29sZWFufSBhbmltYXRlIOaYr+WQpuW4puacieWKqOeUu+WcsOenu+WKqFxuICAgKiBAcGFyYW0ge0dyYXBoQW5pbWF0ZUNvbmZpZ30gYW5pbWF0ZUNmZyDoi6XluKbmnInliqjnlLvvvIzliqjnlLvnmoTphY3nva7poblcbiAgICogQHJldHVybiB7Ym9vbGVhbn0g57yp5pS+5piv5ZCm5oiQ5YqfXG4gICAqL1xuXG5cbiAgQWJzdHJhY3RHcmFwaC5wcm90b3R5cGUuem9vbSA9IGZ1bmN0aW9uIChyYXRpbywgY2VudGVyLCBhbmltYXRlLCBhbmltYXRlQ2ZnKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHZhciBncm91cCA9IHRoaXMuZ2V0KCdncm91cCcpO1xuICAgIHZhciBtYXRyaXggPSBjbG9uZShncm91cC5nZXRNYXRyaXgoKSk7XG4gICAgdmFyIG1pblpvb20gPSB0aGlzLmdldCgnbWluWm9vbScpO1xuICAgIHZhciBtYXhab29tID0gdGhpcy5nZXQoJ21heFpvb20nKTtcblxuICAgIGlmICghbWF0cml4KSB7XG4gICAgICBtYXRyaXggPSBbMSwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMV07XG4gICAgfVxuXG4gICAgaWYgKGNlbnRlcikge1xuICAgICAgbWF0cml4ID0gdHJhbnNmb3JtKG1hdHJpeCwgW1sndCcsIC1jZW50ZXIueCwgLWNlbnRlci55XSwgWydzJywgcmF0aW8sIHJhdGlvXSwgWyd0JywgY2VudGVyLngsIGNlbnRlci55XV0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBtYXRyaXggPSB0cmFuc2Zvcm0obWF0cml4LCBbWydzJywgcmF0aW8sIHJhdGlvXV0pO1xuICAgIH1cblxuICAgIGlmIChtaW5ab29tICYmIG1hdHJpeFswXSA8IG1pblpvb20gfHwgbWF4Wm9vbSAmJiBtYXRyaXhbMF0gPiBtYXhab29tKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSAvLyBtYXRyaXggPSBbMiwgMCwgMCwgMCwgMiwgMCwgLTEyNSwgLTEyNSwgMV07XG5cblxuICAgIGlmIChhbmltYXRlKSB7XG4gICAgICAvLyBDbG9uZSB0aGUgb3JpZ2luYWwgbWF0cml4IHRvIHBlcmZvcm0gdGhlIGFuaW1hdGlvblxuICAgICAgdmFyIGFuaU1hdHJpeF8xID0gY2xvbmUoZ3JvdXAuZ2V0TWF0cml4KCkpO1xuXG4gICAgICBpZiAoIWFuaU1hdHJpeF8xKSB7XG4gICAgICAgIGFuaU1hdHJpeF8xID0gWzEsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDFdO1xuICAgICAgfVxuXG4gICAgICB2YXIgaW5pdGlhbFJhdGlvXzEgPSBhbmlNYXRyaXhfMVswXTtcbiAgICAgIHZhciB0YXJnZXRSYXRpb18xID0gaW5pdGlhbFJhdGlvXzEgKiByYXRpbztcbiAgICAgIHZhciBhbmltYXRlQ29uZmlnID0gdm9pZCAwO1xuXG4gICAgICBpZiAoIWFuaW1hdGVDZmcpIHtcbiAgICAgICAgYW5pbWF0ZUNvbmZpZyA9IHtcbiAgICAgICAgICBkdXJhdGlvbjogNTAwLFxuICAgICAgICAgIGNhbGxiYWNrOiBmdW5jdGlvbiBjYWxsYmFjaygpIHtcbiAgICAgICAgICAgIF90aGlzLmVtaXQoJ3ZpZXdwb3J0Y2hhbmdlJywge1xuICAgICAgICAgICAgICBhY3Rpb246ICd6b29tJyxcbiAgICAgICAgICAgICAgbWF0cml4OiBhbmlNYXRyaXhfMVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIGlmIChhbmltYXRlQ2ZnLmNhbGxiYWNrKSB7XG4gICAgICAgIC8vIFRoaXMgaXMgdG8gcHJldmVudCBtb2RpZnlpbmcgdGhlIG9yaWdpbmFsIGFuaW1hdGVDZmcuY2FsbGJhY2tcbiAgICAgICAgdmFyIGNhbGxiYWNrXzEgPSBhbmltYXRlQ2ZnLmNhbGxiYWNrO1xuICAgICAgICBhbmltYXRlQ29uZmlnID0gY2xvbmUoYW5pbWF0ZUNmZyk7XG5cbiAgICAgICAgYW5pbWF0ZUNvbmZpZy5jYWxsYmFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBfdGhpcy5lbWl0KCd2aWV3cG9ydGNoYW5nZScsIHtcbiAgICAgICAgICAgIGFjdGlvbjogJ3pvb20nLFxuICAgICAgICAgICAgbWF0cml4OiBhbmlNYXRyaXhfMVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY2FsbGJhY2tfMSgpO1xuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYW5pbWF0ZUNvbmZpZyA9IGFuaW1hdGVDZmc7XG4gICAgICB9XG5cbiAgICAgIGdyb3VwLmFuaW1hdGUoZnVuY3Rpb24gKHJhdGlvKSB7XG4gICAgICAgIGlmIChyYXRpbyA9PT0gMSkge1xuICAgICAgICAgIC8vIFJldXNlIHRoZSBmaXJzdCB0cmFuc2Zvcm1hdGlvblxuICAgICAgICAgIGFuaU1hdHJpeF8xID0gbWF0cml4O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBzY2FsZSA9IGxlcnAoaW5pdGlhbFJhdGlvXzEsIHRhcmdldFJhdGlvXzEsIHJhdGlvKSAvIGFuaU1hdHJpeF8xWzBdO1xuXG4gICAgICAgICAgaWYgKGNlbnRlcikge1xuICAgICAgICAgICAgYW5pTWF0cml4XzEgPSB0cmFuc2Zvcm0oYW5pTWF0cml4XzEsIFtbJ3QnLCAtY2VudGVyLngsIC1jZW50ZXIueV0sIFsncycsIHNjYWxlLCBzY2FsZV0sIFsndCcsIGNlbnRlci54LCBjZW50ZXIueV1dKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYW5pTWF0cml4XzEgPSB0cmFuc2Zvcm0oYW5pTWF0cml4XzEsIFtbJ3MnLCBzY2FsZSwgc2NhbGVdXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBtYXRyaXg6IGFuaU1hdHJpeF8xXG4gICAgICAgIH07XG4gICAgICB9LCBhbmltYXRlQ29uZmlnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZ3JvdXAuc2V0TWF0cml4KG1hdHJpeCk7XG4gICAgICB0aGlzLmVtaXQoJ3ZpZXdwb3J0Y2hhbmdlJywge1xuICAgICAgICBhY3Rpb246ICd6b29tJyxcbiAgICAgICAgbWF0cml4OiBtYXRyaXhcbiAgICAgIH0pO1xuICAgICAgdGhpcy5hdXRvUGFpbnQoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcbiAgLyoqXG4gICAqIOS8uOe8qeinhuWPo+WIsOS4gOWbuuWumuavlOS+i1xuICAgKiBAcGFyYW0ge251bWJlcn0gdG9SYXRpbyDkvLjnvKnmr5TkvotcbiAgICogQHBhcmFtIHtQb2ludH0gY2VudGVyIOS7pWNlbnRlcueahHgsIHnlnZDmoIfkuLrkuK3lv4PnvKnmlL5cbiAgICogQHJldHVybiB7Ym9vbGVhbn0g57yp5pS+5piv5ZCm5oiQ5YqfXG4gICAqL1xuXG5cbiAgQWJzdHJhY3RHcmFwaC5wcm90b3R5cGUuem9vbVRvID0gZnVuY3Rpb24gKHRvUmF0aW8sIGNlbnRlcikge1xuICAgIHZhciByYXRpbyA9IHRvUmF0aW8gLyB0aGlzLmdldFpvb20oKTtcbiAgICByZXR1cm4gdGhpcy56b29tKHJhdGlvLCBjZW50ZXIpO1xuICB9O1xuICAvKipcbiAgICog5bCG5YWD57Sg56e75Yqo5Yiw6KeG5Y+j5Lit5b+DXG4gICAqIEBwYXJhbSB7SXRlbX0gaXRlbSDmjIflrprlhYPntKBcbiAgICogQHBhcmFtIHtib29sZWFufSBhbmltYXRlIOaYr+WQpuW4puacieWKqOeUu+WcsOenu+WKqFxuICAgKiBAcGFyYW0ge0dyYXBoQW5pbWF0ZUNvbmZpZ30gYW5pbWF0ZUNmZyDoi6XluKbmnInliqjnlLvvvIzliqjnlLvnmoTphY3nva7poblcbiAgICovXG5cblxuICBBYnN0cmFjdEdyYXBoLnByb3RvdHlwZS5mb2N1c0l0ZW0gPSBmdW5jdGlvbiAoaXRlbSwgYW5pbWF0ZSwgYW5pbWF0ZUNmZykge1xuICAgIHZhciB2aWV3Q29udHJvbGxlciA9IHRoaXMuZ2V0KCd2aWV3Q29udHJvbGxlcicpO1xuICAgIHZhciBpc0FuaW1hdGUgPSBmYWxzZTtcbiAgICBpZiAoYW5pbWF0ZSkgaXNBbmltYXRlID0gdHJ1ZTtlbHNlIGlmIChhbmltYXRlID09PSB1bmRlZmluZWQpIGlzQW5pbWF0ZSA9IHRoaXMuZ2V0KCdhbmltYXRlJyk7XG4gICAgdmFyIGN1ckFuaWFtdGVDZmcgPSB7fTtcbiAgICBpZiAoYW5pbWF0ZUNmZykgY3VyQW5pYW10ZUNmZyA9IGFuaW1hdGVDZmc7ZWxzZSBpZiAoYW5pbWF0ZUNmZyA9PT0gdW5kZWZpbmVkKSBjdXJBbmlhbXRlQ2ZnID0gdGhpcy5nZXQoJ2FuaW1hdGVDZmcnKTtcbiAgICB2aWV3Q29udHJvbGxlci5mb2N1cyhpdGVtLCBpc0FuaW1hdGUsIGN1ckFuaWFtdGVDZmcpO1xuICAgIHRoaXMuYXV0b1BhaW50KCk7XG4gIH07XG4gIC8qKlxuICAgKiDoh6rliqjph43nu5hcbiAgICogQGludGVybmFsIOS7heS+m+WGhemDqOabtOaWsOacuuWItuiwg+eUqO+8jOWklumDqOagueaNrumcgOaxguiwg+eUqCByZW5kZXIg5oiWIHBhaW50IOaOpeWPo1xuICAgKi9cblxuXG4gIEFic3RyYWN0R3JhcGgucHJvdG90eXBlLmF1dG9QYWludCA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodGhpcy5nZXQoJ2F1dG9QYWludCcpKSB7XG4gICAgICB0aGlzLnBhaW50KCk7XG4gICAgfVxuICB9O1xuICAvKipcbiAgICog5LuF55S75biD6YeN5paw57uY5Yi2XG4gICAqL1xuXG5cbiAgQWJzdHJhY3RHcmFwaC5wcm90b3R5cGUucGFpbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5lbWl0KCdiZWZvcmVwYWludCcpO1xuICAgIHRoaXMuZ2V0KCdjYW52YXMnKS5kcmF3KCk7XG4gICAgdGhpcy5lbWl0KCdhZnRlcnBhaW50Jyk7XG4gIH07XG4gIC8qKlxuICAgKiDlsIblsY/luZXlnZDmoIfovazmjaLkuLrop4blj6PlnZDmoIdcbiAgICogQHBhcmFtIHtudW1iZXJ9IGNsaWVudFgg5bGP5bmVeOWdkOagh1xuICAgKiBAcGFyYW0ge251bWJlcn0gY2xpZW50WSDlsY/luZV55Z2Q5qCHXG4gICAqIEByZXR1cm4ge1BvaW50fSDop4blj6PlnZDmoIdcbiAgICovXG5cblxuICBBYnN0cmFjdEdyYXBoLnByb3RvdHlwZS5nZXRQb2ludEJ5Q2xpZW50ID0gZnVuY3Rpb24gKGNsaWVudFgsIGNsaWVudFkpIHtcbiAgICB2YXIgdmlld0NvbnRyb2xsZXIgPSB0aGlzLmdldCgndmlld0NvbnRyb2xsZXInKTtcbiAgICByZXR1cm4gdmlld0NvbnRyb2xsZXIuZ2V0UG9pbnRCeUNsaWVudChjbGllbnRYLCBjbGllbnRZKTtcbiAgfTtcbiAgLyoqXG4gICAqIOWwhue7mOWItuWdkOagh+i9rOaNouS4uuWxj+W5leWdkOagh1xuICAgKiBAcGFyYW0ge251bWJlcn0geCDnu5jliLblnZDmoIcgeFxuICAgKiBAcGFyYW0ge251bWJlcn0geSDnu5jliLblnZDmoIcgeVxuICAgKiBAcmV0dXJuIHtQb2ludH0g57uY5Yi25Z2Q5qCHXG4gICAqL1xuXG5cbiAgQWJzdHJhY3RHcmFwaC5wcm90b3R5cGUuZ2V0Q2xpZW50QnlQb2ludCA9IGZ1bmN0aW9uICh4LCB5KSB7XG4gICAgdmFyIHZpZXdDb250cm9sbGVyID0gdGhpcy5nZXQoJ3ZpZXdDb250cm9sbGVyJyk7XG4gICAgcmV0dXJuIHZpZXdDb250cm9sbGVyLmdldENsaWVudEJ5UG9pbnQoeCwgeSk7XG4gIH07XG4gIC8qKlxuICAgKiDlsIbnlLvluIPlnZDmoIfovazmjaLkuLrnu5jliLblnZDmoIdcbiAgICogQHBhcmFtIHtudW1iZXJ9IGNhbnZhc1gg55S75biDIHgg5Z2Q5qCHXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBjYW52YXNZIOeUu+W4gyB5IOWdkOagh1xuICAgKiBAcmV0dXJuIHtvYmplY3R9IOe7mOWItuWdkOagh1xuICAgKi9cblxuXG4gIEFic3RyYWN0R3JhcGgucHJvdG90eXBlLmdldFBvaW50QnlDYW52YXMgPSBmdW5jdGlvbiAoY2FudmFzWCwgY2FudmFzWSkge1xuICAgIHZhciB2aWV3Q29udHJvbGxlciA9IHRoaXMuZ2V0KCd2aWV3Q29udHJvbGxlcicpO1xuICAgIHJldHVybiB2aWV3Q29udHJvbGxlci5nZXRQb2ludEJ5Q2FudmFzKGNhbnZhc1gsIGNhbnZhc1kpO1xuICB9O1xuICAvKipcbiAgICog5bCG57uY5Yi25Z2Q5qCH6L2s5o2i5Li655S75biD5Z2Q5qCHXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB4IOe7mOWItuWdkOaghyB4XG4gICAqIEBwYXJhbSB7bnVtYmVyfSB5IOe7mOWItuWdkOaghyB5XG4gICAqIEByZXR1cm4ge29iamVjdH0g55S75biD5Z2Q5qCHXG4gICAqL1xuXG5cbiAgQWJzdHJhY3RHcmFwaC5wcm90b3R5cGUuZ2V0Q2FudmFzQnlQb2ludCA9IGZ1bmN0aW9uICh4LCB5KSB7XG4gICAgdmFyIHZpZXdDb250cm9sbGVyID0gdGhpcy5nZXQoJ3ZpZXdDb250cm9sbGVyJyk7XG4gICAgcmV0dXJuIHZpZXdDb250cm9sbGVyLmdldENhbnZhc0J5UG9pbnQoeCwgeSk7XG4gIH07XG4gIC8qKlxuICAgKiDojrflj5blm77lhoXlrrnnmoTkuK3lv4Pnu5jliLblnZDmoIdcbiAgICogQHJldHVybiB7b2JqZWN0fSDkuK3lv4Pnu5jliLblnZDmoIdcbiAgICovXG5cblxuICBBYnN0cmFjdEdyYXBoLnByb3RvdHlwZS5nZXRHcmFwaENlbnRlclBvaW50ID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBiYm94ID0gdGhpcy5nZXQoJ2dyb3VwJykuZ2V0Q2FudmFzQkJveCgpO1xuICAgIHJldHVybiB7XG4gICAgICB4OiAoYmJveC5taW5YICsgYmJveC5tYXhYKSAvIDIsXG4gICAgICB5OiAoYmJveC5taW5ZICsgYmJveC5tYXhZKSAvIDJcbiAgICB9O1xuICB9O1xuICAvKipcbiAgICog6I635Y+W6KeG5Y+j5Lit5b+D57uY5Yi25Z2Q5qCHXG4gICAqIEByZXR1cm4ge29iamVjdH0g6KeG5Y+j5Lit5b+D57uY5Yi25Z2Q5qCHXG4gICAqL1xuXG5cbiAgQWJzdHJhY3RHcmFwaC5wcm90b3R5cGUuZ2V0Vmlld1BvcnRDZW50ZXJQb2ludCA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQb2ludEJ5Q2FudmFzKHRoaXMuZ2V0KCd3aWR0aCcpIC8gMiwgdGhpcy5nZXQoJ2hlaWdodCcpIC8gMik7XG4gIH07XG4gIC8qKlxuICAgKiDmmL7npLrlhYPntKBcbiAgICogQHBhcmFtIHtJdGVtfSBpdGVtIOaMh+WumuWFg+e0oFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHN0YWNrIOacrOasoeaTjeS9nOaYr+WQpuWFpeagiO+8jOm7mOiupOS4uiB0cnVlXG4gICAqL1xuXG5cbiAgQWJzdHJhY3RHcmFwaC5wcm90b3R5cGUuc2hvd0l0ZW0gPSBmdW5jdGlvbiAoaXRlbSwgc3RhY2spIHtcbiAgICBpZiAoc3RhY2sgPT09IHZvaWQgMCkge1xuICAgICAgc3RhY2sgPSB0cnVlO1xuICAgIH1cblxuICAgIHZhciBpdGVtQ29udHJvbGxlciA9IHRoaXMuZ2V0KCdpdGVtQ29udHJvbGxlcicpO1xuICAgIHZhciBvYmplY3QgPSBpdGVtQ29udHJvbGxlci5jaGFuZ2VJdGVtVmlzaWJpbGl0eShpdGVtLCB0cnVlKTtcblxuICAgIGlmIChzdGFjayAmJiB0aGlzLmdldCgnZW5hYmxlZFN0YWNrJykpIHtcbiAgICAgIHZhciBpZCA9IG9iamVjdC5nZXRJRCgpO1xuICAgICAgdmFyIHR5cGUgPSBvYmplY3QuZ2V0VHlwZSgpO1xuICAgICAgdmFyIGJlZm9yZSA9IHt9O1xuICAgICAgdmFyIGFmdGVyID0ge307XG5cbiAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlICdub2RlJzpcbiAgICAgICAgICBiZWZvcmUubm9kZXMgPSBbe1xuICAgICAgICAgICAgaWQ6IGlkLFxuICAgICAgICAgICAgdmlzaWJsZTogZmFsc2VcbiAgICAgICAgICB9XTtcbiAgICAgICAgICBhZnRlci5ub2RlcyA9IFt7XG4gICAgICAgICAgICBpZDogaWQsXG4gICAgICAgICAgICB2aXNpYmxlOiB0cnVlXG4gICAgICAgICAgfV07XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnZWRnZSc6XG4gICAgICAgICAgYmVmb3JlLm5vZGVzID0gW3tcbiAgICAgICAgICAgIGlkOiBpZCxcbiAgICAgICAgICAgIHZpc2libGU6IGZhbHNlXG4gICAgICAgICAgfV07XG4gICAgICAgICAgYWZ0ZXIuZWRnZXMgPSBbe1xuICAgICAgICAgICAgaWQ6IGlkLFxuICAgICAgICAgICAgdmlzaWJsZTogdHJ1ZVxuICAgICAgICAgIH1dO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ2NvbWJvJzpcbiAgICAgICAgICBiZWZvcmUubm9kZXMgPSBbe1xuICAgICAgICAgICAgaWQ6IGlkLFxuICAgICAgICAgICAgdmlzaWJsZTogZmFsc2VcbiAgICAgICAgICB9XTtcbiAgICAgICAgICBhZnRlci5jb21ib3MgPSBbe1xuICAgICAgICAgICAgaWQ6IGlkLFxuICAgICAgICAgICAgdmlzaWJsZTogdHJ1ZVxuICAgICAgICAgIH1dO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIHRoaXMucHVzaFN0YWNrKCd2aXNpYmxlJywge1xuICAgICAgICBiZWZvcmU6IGJlZm9yZSxcbiAgICAgICAgYWZ0ZXI6IGFmdGVyXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG4gIC8qKlxuICAgKiDpmpDol4/lhYPntKBcbiAgICogQHBhcmFtIHtJdGVtfSBpdGVtIOaMh+WumuWFg+e0oFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHN0YWNrIOacrOasoeaTjeS9nOaYr+WQpuWFpeagiO+8jOm7mOiupOS4uiB0cnVlXG4gICAqL1xuXG5cbiAgQWJzdHJhY3RHcmFwaC5wcm90b3R5cGUuaGlkZUl0ZW0gPSBmdW5jdGlvbiAoaXRlbSwgc3RhY2spIHtcbiAgICBpZiAoc3RhY2sgPT09IHZvaWQgMCkge1xuICAgICAgc3RhY2sgPSB0cnVlO1xuICAgIH1cblxuICAgIHZhciBpdGVtQ29udHJvbGxlciA9IHRoaXMuZ2V0KCdpdGVtQ29udHJvbGxlcicpO1xuICAgIHZhciBvYmplY3QgPSBpdGVtQ29udHJvbGxlci5jaGFuZ2VJdGVtVmlzaWJpbGl0eShpdGVtLCBmYWxzZSk7XG5cbiAgICBpZiAoc3RhY2sgJiYgdGhpcy5nZXQoJ2VuYWJsZWRTdGFjaycpKSB7XG4gICAgICB2YXIgaWQgPSBvYmplY3QuZ2V0SUQoKTtcbiAgICAgIHZhciB0eXBlID0gb2JqZWN0LmdldFR5cGUoKTtcbiAgICAgIHZhciBiZWZvcmUgPSB7fTtcbiAgICAgIHZhciBhZnRlciA9IHt9O1xuXG4gICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgY2FzZSAnbm9kZSc6XG4gICAgICAgICAgYmVmb3JlLm5vZGVzID0gW3tcbiAgICAgICAgICAgIGlkOiBpZCxcbiAgICAgICAgICAgIHZpc2libGU6IHRydWVcbiAgICAgICAgICB9XTtcbiAgICAgICAgICBhZnRlci5ub2RlcyA9IFt7XG4gICAgICAgICAgICBpZDogaWQsXG4gICAgICAgICAgICB2aXNpYmxlOiBmYWxzZVxuICAgICAgICAgIH1dO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ2VkZ2UnOlxuICAgICAgICAgIGJlZm9yZS5ub2RlcyA9IFt7XG4gICAgICAgICAgICBpZDogaWQsXG4gICAgICAgICAgICB2aXNpYmxlOiB0cnVlXG4gICAgICAgICAgfV07XG4gICAgICAgICAgYWZ0ZXIuZWRnZXMgPSBbe1xuICAgICAgICAgICAgaWQ6IGlkLFxuICAgICAgICAgICAgdmlzaWJsZTogZmFsc2VcbiAgICAgICAgICB9XTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdjb21ibyc6XG4gICAgICAgICAgYmVmb3JlLm5vZGVzID0gW3tcbiAgICAgICAgICAgIGlkOiBpZCxcbiAgICAgICAgICAgIHZpc2libGU6IHRydWVcbiAgICAgICAgICB9XTtcbiAgICAgICAgICBhZnRlci5jb21ib3MgPSBbe1xuICAgICAgICAgICAgaWQ6IGlkLFxuICAgICAgICAgICAgdmlzaWJsZTogZmFsc2VcbiAgICAgICAgICB9XTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnB1c2hTdGFjaygndmlzaWJsZScsIHtcbiAgICAgICAgYmVmb3JlOiBiZWZvcmUsXG4gICAgICAgIGFmdGVyOiBhZnRlclxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuICAvKipcbiAgICog5Yi35paw5YWD57SgXG4gICAqIEBwYXJhbSB7c3RyaW5nfG9iamVjdH0gaXRlbSDlhYPntKBpZOaIluWFg+e0oOWunuS+i1xuICAgKi9cblxuXG4gIEFic3RyYWN0R3JhcGgucHJvdG90eXBlLnJlZnJlc2hJdGVtID0gZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICB2YXIgaXRlbUNvbnRyb2xsZXIgPSB0aGlzLmdldCgnaXRlbUNvbnRyb2xsZXInKTtcbiAgICBpdGVtQ29udHJvbGxlci5yZWZyZXNoSXRlbShpdGVtKTtcbiAgfTtcbiAgLyoqXG4gICAqIOiuvue9ruaYr+WQpuWcqOabtOaWsC/liLfmlrDlkI7oh6rliqjph43nu5hcbiAgICogQHBhcmFtIHtib29sZWFufSBhdXRvIOiHquWKqOmHjee7mFxuICAgKi9cblxuXG4gIEFic3RyYWN0R3JhcGgucHJvdG90eXBlLnNldEF1dG9QYWludCA9IGZ1bmN0aW9uIChhdXRvKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHNlbGYuc2V0KCdhdXRvUGFpbnQnLCBhdXRvKTtcbiAgICB2YXIgY2FudmFzID0gc2VsZi5nZXQoJ2NhbnZhcycpO1xuICAgIGNhbnZhcy5zZXQoJ2F1dG9EcmF3JywgYXV0byk7XG4gIH07XG4gIC8qKlxuICAgKiDliKDpmaTlhYPntKBcbiAgICogQHBhcmFtIHtJdGVtfSBpdGVtIOWFg+e0oGlk5oiW5YWD57Sg5a6e5L6LXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gc3RhY2sg5pys5qyh5pON5L2c5piv5ZCm5YWl5qCI77yM6buY6K6k5Li6IHRydWVcbiAgICovXG5cblxuICBBYnN0cmFjdEdyYXBoLnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiAoaXRlbSwgc3RhY2spIHtcbiAgICBpZiAoc3RhY2sgPT09IHZvaWQgMCkge1xuICAgICAgc3RhY2sgPSB0cnVlO1xuICAgIH1cblxuICAgIHRoaXMucmVtb3ZlSXRlbShpdGVtLCBzdGFjayk7XG4gIH07XG4gIC8qKlxuICAgKiDliKDpmaTlhYPntKBcbiAgICogQHBhcmFtIHtJdGVtfSBpdGVtIOWFg+e0oGlk5oiW5YWD57Sg5a6e5L6LXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gc3RhY2sg5pys5qyh5pON5L2c5piv5ZCm5YWl5qCI77yM6buY6K6k5Li6IHRydWVcbiAgICovXG5cblxuICBBYnN0cmFjdEdyYXBoLnByb3RvdHlwZS5yZW1vdmVJdGVtID0gZnVuY3Rpb24gKGl0ZW0sIHN0YWNrKSB7XG4gICAgaWYgKHN0YWNrID09PSB2b2lkIDApIHtcbiAgICAgIHN0YWNrID0gdHJ1ZTtcbiAgICB9XG5cbiAgICB2YXIgbm9kZUl0ZW0gPSBpdGVtO1xuICAgIGlmIChpc1N0cmluZyhpdGVtKSkgbm9kZUl0ZW0gPSB0aGlzLmZpbmRCeUlkKGl0ZW0pO1xuXG4gICAgaWYgKCFub2RlSXRlbSAmJiBpc1N0cmluZyhpdGVtKSkge1xuICAgICAgY29uc29sZS53YXJuKCdUaGUgaXRlbSB0byBiZSByZW1vdmVkIGRvZXMgbm90IGV4aXN0IScpO1xuICAgIH0gZWxzZSBpZiAobm9kZUl0ZW0pIHtcbiAgICAgIHZhciB0eXBlID0gJyc7XG4gICAgICBpZiAobm9kZUl0ZW0uZ2V0VHlwZSkgdHlwZSA9IG5vZGVJdGVtLmdldFR5cGUoKTsgLy8g5bCG5Yig6Zmk55qE5YWD57Sg5YWl5qCIXG5cbiAgICAgIGlmIChzdGFjayAmJiB0aGlzLmdldCgnZW5hYmxlZFN0YWNrJykpIHtcbiAgICAgICAgdmFyIGRlbGV0ZWRNb2RlbCA9IF9fYXNzaWduKF9fYXNzaWduKHt9LCBub2RlSXRlbS5nZXRNb2RlbCgpKSwge1xuICAgICAgICAgIGl0ZW1UeXBlOiB0eXBlXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBiZWZvcmUgPSB7fTtcblxuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICBjYXNlICdub2RlJzpcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgYmVmb3JlLm5vZGVzID0gW2RlbGV0ZWRNb2RlbF07XG4gICAgICAgICAgICAgIGJlZm9yZS5lZGdlcyA9IFtdO1xuICAgICAgICAgICAgICB2YXIgZWRnZXMgPSBub2RlSXRlbS5nZXRFZGdlcygpO1xuXG4gICAgICAgICAgICAgIGZvciAodmFyIGkgPSBlZGdlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgICAgIGJlZm9yZS5lZGdlcy5wdXNoKF9fYXNzaWduKF9fYXNzaWduKHt9LCBlZGdlc1tpXS5nZXRNb2RlbCgpKSwge1xuICAgICAgICAgICAgICAgICAgaXRlbVR5cGU6ICdlZGdlJ1xuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgY2FzZSAnZWRnZSc6XG4gICAgICAgICAgICBiZWZvcmUuZWRnZXMgPSBbZGVsZXRlZE1vZGVsXTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAnY29tYm8nOlxuICAgICAgICAgICAgYmVmb3JlLmNvbWJvcyA9IFtkZWxldGVkTW9kZWxdO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnB1c2hTdGFjaygnZGVsZXRlJywge1xuICAgICAgICAgIGJlZm9yZTogYmVmb3JlLFxuICAgICAgICAgIGFmdGVyOiB7fVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGUgPT09ICdub2RlJykge1xuICAgICAgICB2YXIgbW9kZWwgPSBub2RlSXRlbS5nZXRNb2RlbCgpOyAvLyDlpoLmnpzliKDpmaTnmoTmmK/oioLngrnvvIzkuJTor6XoioLngrnlrZjlnKjkuo7mn5DkuKogQ29tYm8g5Lit77yM5YiZ6ZyA6KaB5YWI5bCGIG5vZGUg5LuOIGNvbWJvIOS4reenu+mZpO+8jOWQpuWImeWIoOmZpOiKgueCueWQju+8jOaTjeS9nCBjb21ibyDkvJrlh7rplJlcblxuICAgICAgICBpZiAobW9kZWwuY29tYm9JZCkge1xuICAgICAgICAgIHRoaXMudXBkYXRlQ29tYm9UcmVlKG5vZGVJdGVtLCB1bmRlZmluZWQsIGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgaXRlbUNvbnRyb2xsZXIgPSB0aGlzLmdldCgnaXRlbUNvbnRyb2xsZXInKTtcbiAgICAgIGl0ZW1Db250cm9sbGVyLnJlbW92ZUl0ZW0obm9kZUl0ZW0pO1xuXG4gICAgICBpZiAodHlwZSA9PT0gJ2NvbWJvJykge1xuICAgICAgICB2YXIgbmV3Q29tYm9UcmVlcyA9IHJlY29uc3RydWN0VHJlZSh0aGlzLmdldCgnY29tYm9UcmVlcycpKTtcbiAgICAgICAgdGhpcy5zZXQoJ2NvbWJvVHJlZXMnLCBuZXdDb21ib1RyZWVzKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIC8qKlxuICAgKiDmlrDlop7lhYPntKBcbiAgICogQHBhcmFtIHtJVEVNX1RZUEV9IHR5cGUg5YWD57Sg57G75Z6LKG5vZGUgfCBlZGdlKVxuICAgKiBAcGFyYW0ge01vZGVsQ29uZmlnfSBtb2RlbCDlhYPntKDmlbDmja7mqKHlnotcbiAgICogQHBhcmFtIHtib29sZWFufSBzdGFjayDmnKzmrKHmk43kvZzmmK/lkKblhaXmoIjvvIzpu5jorqTkuLogdHJ1ZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHNvcnRDb21ibyDmnKzmrKHmk43kvZzmmK/lkKbpnIDopoHmm7TmlrAgY29tYm8g5bGC57qn6aG65bqP77yM5YaF6YOo5Y+C5pWw77yM55So5oi35Zyo5aSW6YOo5L2/55SoIGFkZEl0ZW0g5pe25aeL57uI5pe26ZyA6KaB5pu05pawXG4gICAqIEByZXR1cm4ge0l0ZW19IOWFg+e0oOWunuS+i1xuICAgKi9cblxuXG4gIEFic3RyYWN0R3JhcGgucHJvdG90eXBlLmFkZEl0ZW0gPSBmdW5jdGlvbiAodHlwZSwgbW9kZWwsIHN0YWNrLCBzb3J0Q29tYm8pIHtcbiAgICBpZiAoc3RhY2sgPT09IHZvaWQgMCkge1xuICAgICAgc3RhY2sgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChzb3J0Q29tYm8gPT09IHZvaWQgMCkge1xuICAgICAgc29ydENvbWJvID0gdHJ1ZTtcbiAgICB9XG5cbiAgICB2YXIgY3VycmVudENvbWJvU29ydGVkID0gdGhpcy5nZXQoJ2NvbWJvU29ydGVkJyk7XG4gICAgdGhpcy5zZXQoJ2NvbWJvU29ydGVkJywgY3VycmVudENvbWJvU29ydGVkICYmICFzb3J0Q29tYm8pO1xuICAgIHZhciBpdGVtQ29udHJvbGxlciA9IHRoaXMuZ2V0KCdpdGVtQ29udHJvbGxlcicpOyAvLyDmt7vliqDoioLngrnjgIHovrnmiJZjb21ib+S5i+WJje+8jOWFiOmqjOivgeaVsOaNruaYr+WQpuespuWQiOinhOiMg1xuXG4gICAgaWYgKCFzaW5nbGVEYXRhVmFsaWRhdGlvbih0eXBlLCBtb2RlbCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAobW9kZWwuaWQgJiYgdGhpcy5maW5kQnlJZChtb2RlbC5pZCkpIHtcbiAgICAgIGNvbnNvbGUud2FybihcIlRoaXMgaXRlbSBleGlzdHMgYWxyZWFkeS4gQmUgc3VyZSB0aGUgaWQgJWNcIiArIG1vZGVsLmlkICsgXCIlYyBpcyB1bmlxdWUuXCIsICdmb250LXNpemU6IDIwcHg7IGNvbG9yOiByZWQ7JywgJycpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBpdGVtO1xuICAgIHZhciBjb21ib1RyZWVzID0gdGhpcy5nZXQoJ2NvbWJvVHJlZXMnKTtcbiAgICBpZiAoIWNvbWJvVHJlZXMpIGNvbWJvVHJlZXMgPSBbXTtcblxuICAgIGlmICh0eXBlID09PSAnY29tYm8nKSB7XG4gICAgICB2YXIgaXRlbU1hcF8xID0gdGhpcy5nZXQoJ2l0ZW1NYXAnKTtcbiAgICAgIHZhciBmb3VuZFBhcmVudF8xID0gZmFsc2U7XG4gICAgICBjb21ib1RyZWVzLmZvckVhY2goZnVuY3Rpb24gKGN0cmVlKSB7XG4gICAgICAgIGlmIChmb3VuZFBhcmVudF8xKSByZXR1cm47IC8vIHRlcm1pbmF0ZSB0aGUgZm9yRWFjaCBhZnRlciB0aGUgdHJlZSBjb250YWluaW5nIHRoZSBpdGVtIGlzIGRvbmVcblxuICAgICAgICB0cmF2ZXJzZVRyZWVVcChjdHJlZSwgZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgICAgLy8gZmluZCB0aGUgcGFyZW50XG4gICAgICAgICAgaWYgKG1vZGVsLnBhcmVudElkID09PSBjaGlsZC5pZCkge1xuICAgICAgICAgICAgZm91bmRQYXJlbnRfMSA9IHRydWU7XG5cbiAgICAgICAgICAgIHZhciBuZXdDb21ibyA9IF9fYXNzaWduKHtcbiAgICAgICAgICAgICAgaWQ6IG1vZGVsLmlkLFxuICAgICAgICAgICAgICBkZXB0aDogY2hpbGQuZGVwdGggKyAyXG4gICAgICAgICAgICB9LCBtb2RlbCk7XG5cbiAgICAgICAgICAgIGlmIChjaGlsZC5jaGlsZHJlbikgY2hpbGQuY2hpbGRyZW4ucHVzaChuZXdDb21ibyk7ZWxzZSBjaGlsZC5jaGlsZHJlbiA9IFtuZXdDb21ib107XG4gICAgICAgICAgICBtb2RlbC5kZXB0aCA9IG5ld0NvbWJvLmRlcHRoO1xuICAgICAgICAgICAgaXRlbSA9IGl0ZW1Db250cm9sbGVyLmFkZEl0ZW0odHlwZSwgbW9kZWwpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBjaGlsZEl0ZW0gPSBpdGVtTWFwXzFbY2hpbGQuaWRdOyAvLyBhZnRlciB0aGUgcGFyZW50IGlzIGZvdW5kLCB1cGRhdGUgYWxsIHRoZSBhbmNlc3RvcnNcblxuICAgICAgICAgIGlmIChmb3VuZFBhcmVudF8xICYmIGNoaWxkSXRlbSAmJiBjaGlsZEl0ZW0uZ2V0VHlwZSAmJiBjaGlsZEl0ZW0uZ2V0VHlwZSgpID09PSAnY29tYm8nKSB7XG4gICAgICAgICAgICBpdGVtQ29udHJvbGxlci51cGRhdGVDb21ibyhjaGlsZEl0ZW0sIGNoaWxkLmNoaWxkcmVuKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgICB9KTsgLy8gaWYgdGhlIHBhcmVudCBpcyBub3QgZm91bmQsIGFkZCBpdCB0byB0aGUgcm9vdFxuXG4gICAgICBpZiAoIWZvdW5kUGFyZW50XzEpIHtcbiAgICAgICAgdmFyIG5ld0NvbWJvID0gX19hc3NpZ24oe1xuICAgICAgICAgIGlkOiBtb2RlbC5pZCxcbiAgICAgICAgICBkZXB0aDogMFxuICAgICAgICB9LCBtb2RlbCk7XG5cbiAgICAgICAgbW9kZWwuZGVwdGggPSBuZXdDb21iby5kZXB0aDtcbiAgICAgICAgY29tYm9UcmVlcy5wdXNoKG5ld0NvbWJvKTtcbiAgICAgICAgaXRlbSA9IGl0ZW1Db250cm9sbGVyLmFkZEl0ZW0odHlwZSwgbW9kZWwpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnNldCgnY29tYm9UcmVlcycsIGNvbWJvVHJlZXMpO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ25vZGUnICYmIGlzU3RyaW5nKG1vZGVsLmNvbWJvSWQpICYmIGNvbWJvVHJlZXMpIHtcbiAgICAgIHZhciBwYXJlbnRDb21ibyA9IHRoaXMuZmluZEJ5SWQobW9kZWwuY29tYm9JZCk7XG5cbiAgICAgIGlmIChwYXJlbnRDb21ibyAmJiBwYXJlbnRDb21iby5nZXRUeXBlICYmIHBhcmVudENvbWJvLmdldFR5cGUoKSAhPT0gJ2NvbWJvJykge1xuICAgICAgICBjb25zb2xlLndhcm4oXCInXCIgKyBtb2RlbC5jb21ib0lkICsgXCInIGlzIG5vdCBhIGlkIG9mIGEgY29tYm8gaW4gdGhlIGdyYXBoLCB0aGUgbm9kZSB3aWxsIGJlIGFkZGVkIHdpdGhvdXQgY29tYm8uXCIpO1xuICAgICAgfVxuXG4gICAgICBpdGVtID0gaXRlbUNvbnRyb2xsZXIuYWRkSXRlbSh0eXBlLCBtb2RlbCk7XG4gICAgICB2YXIgaXRlbU1hcF8yID0gdGhpcy5nZXQoJ2l0ZW1NYXAnKTtcbiAgICAgIHZhciBmb3VuZFBhcmVudF8yID0gZmFsc2UsXG4gICAgICAgICAgZm91bmROb2RlXzEgPSBmYWxzZTtcbiAgICAgIChjb21ib1RyZWVzIHx8IFtdKS5mb3JFYWNoKGZ1bmN0aW9uIChjdHJlZSkge1xuICAgICAgICBpZiAoZm91bmROb2RlXzEgfHwgZm91bmRQYXJlbnRfMikgcmV0dXJuOyAvLyB0ZXJtaW5hdGUgdGhlIGZvckVhY2hcblxuICAgICAgICB0cmF2ZXJzZVRyZWVVcChjdHJlZSwgZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgICAgaWYgKGNoaWxkLmlkID09PSBtb2RlbC5pZCkge1xuICAgICAgICAgICAgLy8gaWYgdGhlIGl0ZW0gZXhpc3RzIGluIHRoZSB0cmVlIGFscmVhZHksIHRlcm1pbmF0ZVxuICAgICAgICAgICAgZm91bmROb2RlXzEgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChtb2RlbC5jb21ib0lkID09PSBjaGlsZC5pZCAmJiAhZm91bmROb2RlXzEpIHtcbiAgICAgICAgICAgIC8vIGZvdW5kIHRoZSBwYXJlbnQsIGFkZCB0aGUgaXRlbSB0byB0aGUgY2hpbGRyZW4gb2YgaXRzIHBhcmVudCBpbiB0aGUgdHJlZVxuICAgICAgICAgICAgZm91bmRQYXJlbnRfMiA9IHRydWU7XG4gICAgICAgICAgICB2YXIgY2xvbmVOb2RlID0gY2xvbmUobW9kZWwpO1xuICAgICAgICAgICAgY2xvbmVOb2RlLml0ZW1UeXBlID0gJ25vZGUnO1xuICAgICAgICAgICAgaWYgKGNoaWxkLmNoaWxkcmVuKSBjaGlsZC5jaGlsZHJlbi5wdXNoKGNsb25lTm9kZSk7ZWxzZSBjaGlsZC5jaGlsZHJlbiA9IFtjbG9uZU5vZGVdO1xuICAgICAgICAgICAgY2xvbmVOb2RlLmRlcHRoID0gY2hpbGQuZGVwdGggKyAxO1xuICAgICAgICAgIH0gLy8gdXBkYXRlIHRoZSBzaXplIG9mIGFsbCB0aGUgYW5jZXN0b3JzXG5cblxuICAgICAgICAgIGlmIChmb3VuZFBhcmVudF8yICYmIGl0ZW1NYXBfMltjaGlsZC5pZF0uZ2V0VHlwZSAmJiBpdGVtTWFwXzJbY2hpbGQuaWRdLmdldFR5cGUoKSA9PT0gJ2NvbWJvJykge1xuICAgICAgICAgICAgaXRlbUNvbnRyb2xsZXIudXBkYXRlQ29tYm8oaXRlbU1hcF8yW2NoaWxkLmlkXSwgY2hpbGQuY2hpbGRyZW4pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBpdGVtID0gaXRlbUNvbnRyb2xsZXIuYWRkSXRlbSh0eXBlLCBtb2RlbCk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGUgPT09ICdub2RlJyAmJiBtb2RlbC5jb21ib0lkIHx8IHR5cGUgPT09ICdjb21ibycgJiYgbW9kZWwucGFyZW50SWQpIHtcbiAgICAgIC8vIGFkZCB0aGUgY29tYm8gdG8gdGhlIHBhcmVudCdzIGNoaWxkcmVuIGFycmF5XG4gICAgICB2YXIgcGFyZW50Q29tYm8gPSB0aGlzLmZpbmRCeUlkKG1vZGVsLmNvbWJvSWQgfHwgbW9kZWwucGFyZW50SWQpO1xuICAgICAgaWYgKHBhcmVudENvbWJvICYmIHBhcmVudENvbWJvLmdldFR5cGUgJiYgcGFyZW50Q29tYm8uZ2V0VHlwZSgpID09PSAnY29tYm8nKSBwYXJlbnRDb21iby5hZGRDaGlsZChpdGVtKTtcbiAgICB9XG5cbiAgICB2YXIgY29tYm9zID0gdGhpcy5nZXQoJ2NvbWJvcycpO1xuXG4gICAgaWYgKGNvbWJvcyAmJiBjb21ib3MubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5zb3J0Q29tYm9zKCk7XG4gICAgfVxuXG4gICAgdGhpcy5hdXRvUGFpbnQoKTtcblxuICAgIGlmIChzdGFjayAmJiB0aGlzLmdldCgnZW5hYmxlZFN0YWNrJykpIHtcbiAgICAgIHZhciBhZGRlZE1vZGVsID0gX19hc3NpZ24oX19hc3NpZ24oe30sIGl0ZW0uZ2V0TW9kZWwoKSksIHtcbiAgICAgICAgaXRlbVR5cGU6IHR5cGVcbiAgICAgIH0pO1xuXG4gICAgICB2YXIgYWZ0ZXIgPSB7fTtcblxuICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgJ25vZGUnOlxuICAgICAgICAgIGFmdGVyLm5vZGVzID0gW2FkZGVkTW9kZWxdO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ2VkZ2UnOlxuICAgICAgICAgIGFmdGVyLmVkZ2VzID0gW2FkZGVkTW9kZWxdO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ2NvbWJvJzpcbiAgICAgICAgICBhZnRlci5jb21ib3MgPSBbYWRkZWRNb2RlbF07XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgdGhpcy5wdXNoU3RhY2soJ2FkZCcsIHtcbiAgICAgICAgYmVmb3JlOiB7fSxcbiAgICAgICAgYWZ0ZXI6IGFmdGVyXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gaXRlbTtcbiAgfTtcbiAgLyoqXG4gICAqIOaWsOWinuWFg+e0oFxuICAgKiBAcGFyYW0ge0lURU1fVFlQRX0gdHlwZSDlhYPntKDnsbvlnosobm9kZSB8IGVkZ2UpXG4gICAqIEBwYXJhbSB7TW9kZWxDb25maWd9IG1vZGVsIOWFg+e0oOaVsOaNruaooeWei1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHN0YWNrIOacrOasoeaTjeS9nOaYr+WQpuWFpeagiO+8jOm7mOiupOS4uiB0cnVlXG4gICAqIEByZXR1cm4ge0l0ZW19IOWFg+e0oOWunuS+i1xuICAgKi9cblxuXG4gIEFic3RyYWN0R3JhcGgucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uICh0eXBlLCBtb2RlbCwgc3RhY2ssIHNvcnRDb21ibykge1xuICAgIGlmIChzdGFjayA9PT0gdm9pZCAwKSB7XG4gICAgICBzdGFjayA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHNvcnRDb21ibyA9PT0gdm9pZCAwKSB7XG4gICAgICBzb3J0Q29tYm8gPSB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmFkZEl0ZW0odHlwZSwgbW9kZWwsIHN0YWNrLCBzb3J0Q29tYm8pO1xuICB9O1xuICAvKipcbiAgICog5pu05paw5YWD57SgXG4gICAqIEBwYXJhbSB7SXRlbX0gaXRlbSDlhYPntKBpZOaIluWFg+e0oOWunuS+i1xuICAgKiBAcGFyYW0ge1BhcnRpYWw8Tm9kZUNvbmZpZz4gfCBFZGdlQ29uZmlnfSBjZmcg6ZyA6KaB5pu05paw55qE5pWw5o2uXG4gICAqL1xuXG5cbiAgQWJzdHJhY3RHcmFwaC5wcm90b3R5cGUudXBkYXRlSXRlbSA9IGZ1bmN0aW9uIChpdGVtLCBjZmcsIHN0YWNrKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIGlmIChzdGFjayA9PT0gdm9pZCAwKSB7XG4gICAgICBzdGFjayA9IHRydWU7XG4gICAgfVxuXG4gICAgdmFyIGl0ZW1Db250cm9sbGVyID0gdGhpcy5nZXQoJ2l0ZW1Db250cm9sbGVyJyk7XG4gICAgdmFyIGN1cnJlbnRJdGVtO1xuXG4gICAgaWYgKGlzU3RyaW5nKGl0ZW0pKSB7XG4gICAgICBjdXJyZW50SXRlbSA9IHRoaXMuZmluZEJ5SWQoaXRlbSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGN1cnJlbnRJdGVtID0gaXRlbTtcbiAgICB9XG5cbiAgICB2YXIgVW51cGRhdGVNb2RlbCA9IGNsb25lKGN1cnJlbnRJdGVtLmdldE1vZGVsKCkpO1xuICAgIHZhciB0eXBlID0gJyc7XG4gICAgaWYgKGN1cnJlbnRJdGVtLmdldFR5cGUpIHR5cGUgPSBjdXJyZW50SXRlbS5nZXRUeXBlKCk7XG5cbiAgICB2YXIgc3RhdGVzID0gX19zcHJlYWRBcnJheShbXSwgY3VycmVudEl0ZW0uZ2V0U3RhdGVzKCksIHRydWUpO1xuXG4gICAgaWYgKHR5cGUgPT09ICdjb21ibycpIHtcbiAgICAgIGVhY2goc3RhdGVzLCBmdW5jdGlvbiAoc3RhdGUpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzLnNldEl0ZW1TdGF0ZShjdXJyZW50SXRlbSwgc3RhdGUsIGZhbHNlKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGl0ZW1Db250cm9sbGVyLnVwZGF0ZUl0ZW0oY3VycmVudEl0ZW0sIGNmZyk7XG5cbiAgICBpZiAodHlwZSA9PT0gJ2NvbWJvJykge1xuICAgICAgZWFjaChzdGF0ZXMsIGZ1bmN0aW9uIChzdGF0ZSkge1xuICAgICAgICByZXR1cm4gX3RoaXMuc2V0SXRlbVN0YXRlKGN1cnJlbnRJdGVtLCBzdGF0ZSwgdHJ1ZSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoc3RhY2sgJiYgdGhpcy5nZXQoJ2VuYWJsZWRTdGFjaycpKSB7XG4gICAgICB2YXIgYmVmb3JlID0ge1xuICAgICAgICBub2RlczogW10sXG4gICAgICAgIGVkZ2VzOiBbXSxcbiAgICAgICAgY29tYm9zOiBbXVxuICAgICAgfTtcbiAgICAgIHZhciBhZnRlciA9IHtcbiAgICAgICAgbm9kZXM6IFtdLFxuICAgICAgICBlZGdlczogW10sXG4gICAgICAgIGNvbWJvczogW11cbiAgICAgIH07XG5cbiAgICAgIHZhciBhZnRlck1vZGVsID0gX19hc3NpZ24oe1xuICAgICAgICBpZDogVW51cGRhdGVNb2RlbC5pZFxuICAgICAgfSwgY2ZnKTtcblxuICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgJ25vZGUnOlxuICAgICAgICAgIGJlZm9yZS5ub2Rlcy5wdXNoKFVudXBkYXRlTW9kZWwpO1xuICAgICAgICAgIGFmdGVyLm5vZGVzLnB1c2goYWZ0ZXJNb2RlbCk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnZWRnZSc6XG4gICAgICAgICAgYmVmb3JlLmVkZ2VzLnB1c2goVW51cGRhdGVNb2RlbCk7XG4gICAgICAgICAgYWZ0ZXIuZWRnZXMucHVzaChhZnRlck1vZGVsKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdjb21ibyc6XG4gICAgICAgICAgYmVmb3JlLmNvbWJvcy5wdXNoKFVudXBkYXRlTW9kZWwpO1xuICAgICAgICAgIGFmdGVyLmNvbWJvcy5wdXNoKGFmdGVyTW9kZWwpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlID09PSAnbm9kZScpIHtcbiAgICAgICAgYmVmb3JlLm5vZGVzLnB1c2goVW51cGRhdGVNb2RlbCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMucHVzaFN0YWNrKCd1cGRhdGUnLCB7XG4gICAgICAgIGJlZm9yZTogYmVmb3JlLFxuICAgICAgICBhZnRlcjogYWZ0ZXJcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcbiAgLyoqXG4gICAqIOabtOaWsOWFg+e0oFxuICAgKiBAcGFyYW0ge0l0ZW19IGl0ZW0g5YWD57SgaWTmiJblhYPntKDlrp7kvotcbiAgICogQHBhcmFtIHtQYXJ0aWFsPE5vZGVDb25maWc+IHwgRWRnZUNvbmZpZ30gY2ZnIOmcgOimgeabtOaWsOeahOaVsOaNrlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHN0YWNrIOacrOasoeaTjeS9nOaYr+WQpuWFpeagiO+8jOm7mOiupOS4uiB0cnVlXG4gICAqL1xuXG5cbiAgQWJzdHJhY3RHcmFwaC5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gKGl0ZW0sIGNmZywgc3RhY2spIHtcbiAgICBpZiAoc3RhY2sgPT09IHZvaWQgMCkge1xuICAgICAgc3RhY2sgPSB0cnVlO1xuICAgIH1cblxuICAgIHRoaXMudXBkYXRlSXRlbShpdGVtLCBjZmcsIHN0YWNrKTtcbiAgfTtcbiAgLyoqXG4gICAqIOiuvue9ruWFg+e0oOeKtuaAgVxuICAgKiBAcGFyYW0ge0l0ZW19IGl0ZW0g5YWD57SgaWTmiJblhYPntKDlrp7kvotcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0YXRlIOeKtuaAgeWQjeensFxuICAgKiBAcGFyYW0ge3N0cmluZyB8IGJvb2xlYW59IHZhbHVlIOaYr+WQpuWQr+eUqOeKtuaAgSDmiJYg54q25oCB5YC8XG4gICAqL1xuXG5cbiAgQWJzdHJhY3RHcmFwaC5wcm90b3R5cGUuc2V0SXRlbVN0YXRlID0gZnVuY3Rpb24gKGl0ZW0sIHN0YXRlLCB2YWx1ZSkge1xuICAgIGlmIChpc1N0cmluZyhpdGVtKSkge1xuICAgICAgaXRlbSA9IHRoaXMuZmluZEJ5SWQoaXRlbSk7XG4gICAgfVxuXG4gICAgdmFyIGl0ZW1Db250cm9sbGVyID0gdGhpcy5nZXQoJ2l0ZW1Db250cm9sbGVyJyk7XG4gICAgaXRlbUNvbnRyb2xsZXIuc2V0SXRlbVN0YXRlKGl0ZW0sIHN0YXRlLCB2YWx1ZSk7XG4gICAgdmFyIHN0YXRlQ29udHJvbGxlciA9IHRoaXMuZ2V0KCdzdGF0ZUNvbnRyb2xsZXInKTtcblxuICAgIGlmIChpc1N0cmluZyh2YWx1ZSkpIHtcbiAgICAgIHN0YXRlQ29udHJvbGxlci51cGRhdGVTdGF0ZShpdGVtLCBzdGF0ZSArIFwiOlwiICsgdmFsdWUsIHRydWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0ZUNvbnRyb2xsZXIudXBkYXRlU3RhdGUoaXRlbSwgc3RhdGUsIHZhbHVlKTtcbiAgICB9XG4gIH07XG4gIC8qKlxuICAgKiDlsIbmjIflrprnirbmgIHnmoTkvJjlhYjnuqfmj5DljYfkuLrmnIDpq5jkvJjlhYjnuqdcbiAgICogQHBhcmFtIHtJdGVtfSBpdGVtIOWFg+e0oGlk5oiW5YWD57Sg5a6e5L6LXG4gICAqIEBwYXJhbSBzdGF0ZSDnirbmgIHlkI3np7BcbiAgICovXG5cblxuICBBYnN0cmFjdEdyYXBoLnByb3RvdHlwZS5wcmlvcml0eVN0YXRlID0gZnVuY3Rpb24gKGl0ZW0sIHN0YXRlKSB7XG4gICAgdmFyIGl0ZW1Db250cm9sbGVyID0gdGhpcy5nZXQoJ2l0ZW1Db250cm9sbGVyJyk7XG4gICAgaXRlbUNvbnRyb2xsZXIucHJpb3JpdHlTdGF0ZShpdGVtLCBzdGF0ZSk7XG4gIH07XG4gIC8qKlxuICAgKiDorr7nva7op4blm77liJ3lp4vljJbmlbDmja5cbiAgICogQHBhcmFtIHtHcmFwaERhdGF9IGRhdGEg5Yid5aeL5YyW5pWw5o2uXG4gICAqL1xuXG5cbiAgQWJzdHJhY3RHcmFwaC5wcm90b3R5cGUuZGF0YSA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgZGF0YVZhbGlkYXRpb24oZGF0YSk7XG4gICAgdGhpcy5zZXQoJ2RhdGEnLCBkYXRhKTtcbiAgfTtcbiAgLyoqXG4gICAqIOagueaNrmRhdGHmjqXlj6PnmoTmlbDmja7muLLmn5Pop4blm75cbiAgICovXG5cblxuICBBYnN0cmFjdEdyYXBoLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMuc2V0KCdjb21ib1NvcnRlZCcsIGZhbHNlKTtcbiAgICB2YXIgZGF0YSA9IHRoaXMuZ2V0KCdkYXRhJyk7XG5cbiAgICBpZiAodGhpcy5nZXQoJ2VuYWJsZWRTdGFjaycpKSB7XG4gICAgICAvLyByZW5kZXIg5LmL5YmN5riF56m6IHJlZG8g5ZKMIHVuZG8g5qCIXG4gICAgICB0aGlzLmNsZWFyU3RhY2soKTtcbiAgICB9XG5cbiAgICBpZiAoIWRhdGEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZGF0YSBtdXN0IGJlIGRlZmluZWQgZmlyc3QnKTtcbiAgICB9XG5cbiAgICB2YXIgX2EgPSBkYXRhLm5vZGVzLFxuICAgICAgICBub2RlcyA9IF9hID09PSB2b2lkIDAgPyBbXSA6IF9hLFxuICAgICAgICBfYiA9IGRhdGEuZWRnZXMsXG4gICAgICAgIGVkZ2VzID0gX2IgPT09IHZvaWQgMCA/IFtdIDogX2IsXG4gICAgICAgIF9jID0gZGF0YS5jb21ib3MsXG4gICAgICAgIGNvbWJvcyA9IF9jID09PSB2b2lkIDAgPyBbXSA6IF9jO1xuICAgIHRoaXMuY2xlYXIodHJ1ZSk7XG4gICAgdGhpcy5lbWl0KCdiZWZvcmVyZW5kZXInKTtcbiAgICBlYWNoKG5vZGVzLCBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgc2VsZi5hZGQoJ25vZGUnLCBub2RlLCBmYWxzZSwgZmFsc2UpO1xuICAgIH0pOyAvLyBwcm9jZXNzIHRoZSBkYXRhIHRvIHRyZWUgc3RydWN0dXJlXG5cbiAgICBpZiAoY29tYm9zICYmIGNvbWJvcy5sZW5ndGggIT09IDApIHtcbiAgICAgIHZhciBjb21ib1RyZWVzID0gcGxhaW5Db21ib3NUb1RyZWVzKGNvbWJvcywgbm9kZXMpO1xuICAgICAgdGhpcy5zZXQoJ2NvbWJvVHJlZXMnLCBjb21ib1RyZWVzKTsgLy8gYWRkIGNvbWJvc1xuXG4gICAgICBzZWxmLmFkZENvbWJvcyhjb21ib3MpO1xuICAgIH1cblxuICAgIGVhY2goZWRnZXMsIGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgICBzZWxmLmFkZCgnZWRnZScsIGVkZ2UsIGZhbHNlLCBmYWxzZSk7XG4gICAgfSk7XG4gICAgdmFyIGFuaW1hdGUgPSBzZWxmLmdldCgnYW5pbWF0ZScpO1xuXG4gICAgaWYgKHNlbGYuZ2V0KCdmaXRWaWV3JykgfHwgc2VsZi5nZXQoJ2ZpdENlbnRlcicpKSB7XG4gICAgICBzZWxmLnNldCgnYW5pbWF0ZScsIGZhbHNlKTtcbiAgICB9IC8vIGxheW91dFxuXG5cbiAgICB2YXIgbGF5b3V0Q29udHJvbGxlciA9IHNlbGYuZ2V0KCdsYXlvdXRDb250cm9sbGVyJyk7XG5cbiAgICBpZiAobGF5b3V0Q29udHJvbGxlcikge1xuICAgICAgbGF5b3V0Q29udHJvbGxlci5sYXlvdXQoc3VjY2Vzcyk7XG4gICAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHJldHVybjtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHNlbGYuZ2V0KCdmaXRWaWV3JykpIHtcbiAgICAgICAgc2VsZi5maXRWaWV3KCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChzZWxmLmdldCgnZml0Q2VudGVyJykpIHtcbiAgICAgICAgc2VsZi5maXRDZW50ZXIoKTtcbiAgICAgIH1cblxuICAgICAgc2VsZi5lbWl0KCdhZnRlcnJlbmRlcicpO1xuICAgICAgc2VsZi5zZXQoJ2FuaW1hdGUnLCBhbmltYXRlKTtcbiAgICB9IC8vIOWwhuWcqCBvbkxheW91dEVuZCDkuK3ooqvosIPnlKhcblxuXG4gICAgZnVuY3Rpb24gc3VjY2VzcygpIHtcbiAgICAgIC8vIGZpdFZpZXcg5LiOIGZpdENlbnRlciDlhbHlrZjml7bvvIxmaXRWaWV3IOS8mOWFiO+8jGZpdENlbnRlciDkuI3lho3miafooYxcbiAgICAgIGlmIChzZWxmLmdldCgnZml0VmlldycpKSB7XG4gICAgICAgIHNlbGYuZml0VmlldygpO1xuICAgICAgfSBlbHNlIGlmIChzZWxmLmdldCgnZml0Q2VudGVyJykpIHtcbiAgICAgICAgc2VsZi5maXRDZW50ZXIoKTtcbiAgICAgIH1cblxuICAgICAgc2VsZi5hdXRvUGFpbnQoKTtcbiAgICAgIHNlbGYuZW1pdCgnYWZ0ZXJyZW5kZXInKTtcblxuICAgICAgaWYgKHNlbGYuZ2V0KCdmaXRWaWV3JykgfHwgc2VsZi5nZXQoJ2ZpdENlbnRlcicpKSB7XG4gICAgICAgIHNlbGYuc2V0KCdhbmltYXRlJywgYW5pbWF0ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmdldCgnZ3JvdXBCeVR5cGVzJykpIHtcbiAgICAgIGlmIChjb21ib3MgJiYgY29tYm9zLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICB0aGlzLnNvcnRDb21ib3MoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIOS4uuaPkOWNh+aAp+iDve+8jOmAieaLqeaVsOmHj+WwkeeahOi/m+ihjOaTjeS9nFxuICAgICAgICBpZiAoZGF0YS5ub2RlcyAmJiBkYXRhLmVkZ2VzICYmIGRhdGEubm9kZXMubGVuZ3RoIDwgZGF0YS5lZGdlcy5sZW5ndGgpIHtcbiAgICAgICAgICB2YXIgbm9kZXNBcnIgPSB0aGlzLmdldE5vZGVzKCk7IC8vIOmBjeWOhuiKgueCueWunuS+i++8jOWwhuaJgOacieiKgueCueaPkOWJjeOAglxuXG4gICAgICAgICAgbm9kZXNBcnIuZm9yRWFjaChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICAgICAgbm9kZS50b0Zyb250KCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIGVkZ2VzQXJyID0gdGhpcy5nZXRFZGdlcygpOyAvLyDpgY3ljoboioLngrnlrp7kvovvvIzlsIbmiYDmnInoioLngrnmj5DliY3jgIJcblxuICAgICAgICAgIGVkZ2VzQXJyLmZvckVhY2goZnVuY3Rpb24gKGVkZ2UpIHtcbiAgICAgICAgICAgIGVkZ2UudG9CYWNrKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5nZXQoJ2VuYWJsZWRTdGFjaycpKSB7XG4gICAgICB0aGlzLnB1c2hTdGFjaygncmVuZGVyJyk7XG4gICAgfVxuICB9O1xuICAvKipcbiAgICog5o6l5pS25pWw5o2u6L+b6KGM5riy5p+TXG4gICAqIEBQYXJhbSB7T2JqZWN0fSBkYXRhIOWIneWni+WMluaVsOaNrlxuICAgKi9cblxuXG4gIEFic3RyYWN0R3JhcGgucHJvdG90eXBlLnJlYWQgPSBmdW5jdGlvbiAoZGF0YSkge1xuICAgIHRoaXMuZGF0YShkYXRhKTtcbiAgICB0aGlzLnJlbmRlcigpO1xuICB9OyAvLyDmr5TovoNpdGVtXG5cblxuICBBYnN0cmFjdEdyYXBoLnByb3RvdHlwZS5kaWZmSXRlbXMgPSBmdW5jdGlvbiAodHlwZSwgaXRlbXMsIG1vZGVscykge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgaXRlbTtcbiAgICB2YXIgaXRlbU1hcCA9IHRoaXMuZ2V0KCdpdGVtTWFwJyk7XG4gICAgZWFjaChtb2RlbHMsIGZ1bmN0aW9uIChtb2RlbCkge1xuICAgICAgaXRlbSA9IGl0ZW1NYXBbbW9kZWwuaWRdO1xuXG4gICAgICBpZiAoaXRlbSkge1xuICAgICAgICBpZiAoc2VsZi5nZXQoJ2FuaW1hdGUnKSAmJiB0eXBlID09PSBOT0RFKSB7XG4gICAgICAgICAgdmFyIGNvbnRhaW5lck1hdHJpeCA9IGl0ZW0uZ2V0Q29udGFpbmVyKCkuZ2V0TWF0cml4KCk7XG4gICAgICAgICAgaWYgKCFjb250YWluZXJNYXRyaXgpIGNvbnRhaW5lck1hdHJpeCA9IFsxLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAxXTtcbiAgICAgICAgICBpdGVtLnNldCgnb3JpZ2luQXR0cnMnLCB7XG4gICAgICAgICAgICB4OiBjb250YWluZXJNYXRyaXhbNl0sXG4gICAgICAgICAgICB5OiBjb250YWluZXJNYXRyaXhbN11cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNlbGYudXBkYXRlSXRlbShpdGVtLCBtb2RlbCwgZmFsc2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaXRlbSA9IHNlbGYuYWRkSXRlbSh0eXBlLCBtb2RlbCwgZmFsc2UpO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXRlbSkgaXRlbXNbdHlwZSArIFwic1wiXS5wdXNoKGl0ZW0pO1xuICAgIH0pO1xuICB9O1xuICAvKipcbiAgICog5pu05pS55rqQ5pWw5o2u77yM5qC55o2u5paw5pWw5o2u6YeN5paw5riy5p+T6KeG5Zu+XG4gICAqIEBwYXJhbSB7R3JhcGhEYXRhIHwgVHJlZUdyYXBoRGF0YX0gZGF0YSDmupDmlbDmja5cbiAgICogQHBhcmFtIHtib29sZWFufSDmmK/lkKblhaXmoIjvvIzpu5jorqTkuLp0cnVlXG4gICAqIEByZXR1cm4ge29iamVjdH0gdGhpc1xuICAgKi9cblxuXG4gIEFic3RyYWN0R3JhcGgucHJvdG90eXBlLmNoYW5nZURhdGEgPSBmdW5jdGlvbiAoZGF0YSwgc3RhY2spIHtcbiAgICBpZiAoc3RhY2sgPT09IHZvaWQgMCkge1xuICAgICAgc3RhY2sgPSB0cnVlO1xuICAgIH1cblxuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgIGlmICghZGF0YVZhbGlkYXRpb24oZGF0YSkpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGlmIChzdGFjayAmJiB0aGlzLmdldCgnZW5hYmxlZFN0YWNrJykpIHtcbiAgICAgIHRoaXMucHVzaFN0YWNrKCdjaGFuZ2VkYXRhJywge1xuICAgICAgICBiZWZvcmU6IHNlbGYuc2F2ZSgpLFxuICAgICAgICBhZnRlcjogZGF0YVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5zZXQoJ2NvbWJvU29ydGVkJywgZmFsc2UpOyAvLyDliKDpmaQgaHVsbHNcblxuICAgIHRoaXMucmVtb3ZlSHVsbHMoKTsgLy8g5pu05pS55pWw5o2u5rqQ5ZCO77yM5Y+W5raI5omA5pyJ54q25oCBXG5cbiAgICB0aGlzLmdldE5vZGVzKCkubWFwKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICByZXR1cm4gc2VsZi5jbGVhckl0ZW1TdGF0ZXMobm9kZSk7XG4gICAgfSk7XG4gICAgdGhpcy5nZXRFZGdlcygpLm1hcChmdW5jdGlvbiAoZWRnZSkge1xuICAgICAgcmV0dXJuIHNlbGYuY2xlYXJJdGVtU3RhdGVzKGVkZ2UpO1xuICAgIH0pO1xuICAgIHZhciBjYW52YXMgPSB0aGlzLmdldCgnY2FudmFzJyk7XG4gICAgdmFyIGxvY2FsUmVmcmVzaCA9IGNhbnZhcy5nZXQoJ2xvY2FsUmVmcmVzaCcpO1xuICAgIGNhbnZhcy5zZXQoJ2xvY2FsUmVmcmVzaCcsIGZhbHNlKTtcblxuICAgIGlmICghc2VsZi5nZXQoJ2RhdGEnKSkge1xuICAgICAgc2VsZi5kYXRhKGRhdGEpO1xuICAgICAgc2VsZi5yZW5kZXIoKTtcbiAgICB9XG5cbiAgICB2YXIgaXRlbU1hcCA9IHRoaXMuZ2V0KCdpdGVtTWFwJyk7XG4gICAgdmFyIGl0ZW1zID0ge1xuICAgICAgbm9kZXM6IFtdLFxuICAgICAgZWRnZXM6IFtdXG4gICAgfTtcbiAgICB2YXIgY29tYm9zRGF0YSA9IGRhdGEuY29tYm9zO1xuXG4gICAgaWYgKGNvbWJvc0RhdGEpIHtcbiAgICAgIHZhciBjb21ib1RyZWVzID0gcGxhaW5Db21ib3NUb1RyZWVzKGNvbWJvc0RhdGEsIGRhdGEubm9kZXMpO1xuICAgICAgdGhpcy5zZXQoJ2NvbWJvVHJlZXMnLCBjb21ib1RyZWVzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXQoJ2NvbWJvVHJlZXMnLCBbXSk7XG4gICAgfVxuXG4gICAgdGhpcy5kaWZmSXRlbXMoJ25vZGUnLCBpdGVtcywgZGF0YS5ub2Rlcyk7XG4gICAgZWFjaChpdGVtTWFwLCBmdW5jdGlvbiAoaXRlbSwgaWQpIHtcbiAgICAgIGl0ZW1NYXBbaWRdLmdldE1vZGVsKCkuZGVwdGggPSAwO1xuICAgICAgaWYgKGl0ZW0uZ2V0VHlwZSAmJiBpdGVtLmdldFR5cGUoKSA9PT0gJ2VkZ2UnKSByZXR1cm47XG5cbiAgICAgIGlmIChpdGVtLmdldFR5cGUgJiYgaXRlbS5nZXRUeXBlKCkgPT09ICdjb21ibycpIHtcbiAgICAgICAgZGVsZXRlIGl0ZW1NYXBbaWRdO1xuICAgICAgICBpdGVtLmRlc3Ryb3koKTtcbiAgICAgIH0gZWxzZSBpZiAoaXRlbXMubm9kZXMuaW5kZXhPZihpdGVtKSA8IDApIHtcbiAgICAgICAgZGVsZXRlIGl0ZW1NYXBbaWRdO1xuICAgICAgICBzZWxmLnJlbW92ZShpdGVtLCBmYWxzZSk7XG4gICAgICB9XG4gICAgfSk7IC8vIGNsZWFyIHRoZSBkZXN0cm95ZWQgY29tYm9zIGhlcmUgdG8gYXZvaWQgcmVtb3Zpbmcgc3ViIG5vZGVzIGJlZm9yZSByZW1vdmluZyB0aGUgcGFyZW50IGNvbWJvXG5cbiAgICB2YXIgY29tYm9JdGVtcyA9IHRoaXMuZ2V0Q29tYm9zKCk7XG4gICAgdmFyIGNvbWJvc0xlbmd0aCA9IGNvbWJvSXRlbXMubGVuZ3RoO1xuXG4gICAgZm9yICh2YXIgaSA9IGNvbWJvc0xlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBpZiAoY29tYm9JdGVtc1tpXS5kZXN0cm95ZWQpIHtcbiAgICAgICAgY29tYm9JdGVtcy5zcGxpY2UoaSwgMSk7XG4gICAgICB9XG4gICAgfSAvLyBwcm9jZXNzIHRoZSBkYXRhIHRvIHRyZWUgc3RydWN0dXJlXG5cblxuICAgIGlmIChjb21ib3NEYXRhKSB7XG4gICAgICAvLyBhZGQgY29tYm9zXG4gICAgICBzZWxmLmFkZENvbWJvcyhjb21ib3NEYXRhKTtcblxuICAgICAgaWYgKCF0aGlzLmdldCgnZ3JvdXBCeVR5cGVzJykpIHtcbiAgICAgICAgdGhpcy5zb3J0Q29tYm9zKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5kaWZmSXRlbXMoJ2VkZ2UnLCBpdGVtcywgZGF0YS5lZGdlcyk7XG4gICAgZWFjaChpdGVtTWFwLCBmdW5jdGlvbiAoaXRlbSwgaWQpIHtcbiAgICAgIGlmIChpdGVtLmdldFR5cGUgJiYgKGl0ZW0uZ2V0VHlwZSgpID09PSAnbm9kZScgfHwgaXRlbS5nZXRUeXBlKCkgPT09ICdjb21ibycpKSByZXR1cm47XG5cbiAgICAgIGlmIChpdGVtcy5lZGdlcy5pbmRleE9mKGl0ZW0pIDwgMCkge1xuICAgICAgICBkZWxldGUgaXRlbU1hcFtpZF07XG4gICAgICAgIHNlbGYucmVtb3ZlKGl0ZW0sIGZhbHNlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnNldCh7XG4gICAgICBub2RlczogaXRlbXMubm9kZXMsXG4gICAgICBlZGdlczogaXRlbXMuZWRnZXNcbiAgICB9KTtcbiAgICB2YXIgbGF5b3V0Q29udHJvbGxlciA9IHRoaXMuZ2V0KCdsYXlvdXRDb250cm9sbGVyJyk7XG5cbiAgICBpZiAobGF5b3V0Q29udHJvbGxlcikge1xuICAgICAgbGF5b3V0Q29udHJvbGxlci5jaGFuZ2VEYXRhKCk7XG5cbiAgICAgIGlmIChzZWxmLmdldCgnYW5pbWF0ZScpICYmICFsYXlvdXRDb250cm9sbGVyLmdldExheW91dFR5cGUoKSkge1xuICAgICAgICAvLyDlpoLmnpzmsqHmnInmjIflrprluIPlsYBcbiAgICAgICAgc2VsZi5wb3NpdGlvbnNBbmltYXRlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZWxmLmF1dG9QYWludCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgY2FudmFzLnNldCgnbG9jYWxSZWZyZXNoJywgbG9jYWxSZWZyZXNoKTtcbiAgICB9LCAxNik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG4gIC8qKlxuICAgKiDnp4HmnInmlrnms5XvvIzlnKggcmVuZGVyIOWSjCBjaGFuZ2VEYXRhIOeahOaXtuWAmeaJuemHj+a3u+WKoOaVsOaNruS4reaJgOacieW5s+mTuueahCBjb21ib3NcbiAgICogQHBhcmFtIHtDb21ib0NvbmZpZ1tdfSBjb21ib3Mg5bmz6ZO655qEIGNvbWJvcyDmlbDmja5cbiAgICovXG5cblxuICBBYnN0cmFjdEdyYXBoLnByb3RvdHlwZS5hZGRDb21ib3MgPSBmdW5jdGlvbiAoY29tYm9zKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBjb21ib1RyZWVzID0gc2VsZi5nZXQoJ2NvbWJvVHJlZXMnKTtcbiAgICB2YXIgaXRlbUNvbnRyb2xsZXIgPSB0aGlzLmdldCgnaXRlbUNvbnRyb2xsZXInKTtcbiAgICBpdGVtQ29udHJvbGxlci5hZGRDb21ib3MoY29tYm9UcmVlcywgY29tYm9zKTtcbiAgfTtcbiAgLyoqXG4gICAqIOagueaNruW3sue7j+WtmOWcqOeahOiKgueCueaIliBjb21ibyDliJvlu7rmlrDnmoQgY29tYm9cbiAgICogQHBhcmFtIGNvbWJvIGNvbWJvIElEIOaIliBDb21ibyDphY3nva5cbiAgICogQHBhcmFtIGNoaWxkcmVuIOa3u+WKoOWIsCBDb21ibyDkuK3nmoTlhYPntKDvvIzljIXmi6zoioLngrnlkowgY29tYm9cbiAgICovXG5cblxuICBBYnN0cmFjdEdyYXBoLnByb3RvdHlwZS5jcmVhdGVDb21ibyA9IGZ1bmN0aW9uIChjb21ibywgY2hpbGRyZW4pIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdGhpcy5zZXQoJ2NvbWJvU29ydGVkJywgZmFsc2UpOyAvLyBzdGVwIDE6IOWIm+W7uuaWsOeahCBDb21ib1xuXG4gICAgdmFyIGNvbWJvSWQgPSAnJztcbiAgICB2YXIgY29tYm9Db25maWc7XG4gICAgaWYgKCFjb21ibykgcmV0dXJuO1xuXG4gICAgaWYgKGlzU3RyaW5nKGNvbWJvKSkge1xuICAgICAgY29tYm9JZCA9IGNvbWJvO1xuICAgICAgY29tYm9Db25maWcgPSB7XG4gICAgICAgIGlkOiBjb21ib1xuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29tYm9JZCA9IGNvbWJvLmlkO1xuXG4gICAgICBpZiAoIWNvbWJvSWQpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdDcmVhdGUgY29tYm8gZmFpbGVkLiBQbGVhc2UgYXNzaWduIGEgdW5pcXVlIHN0cmluZyBpZCBmb3IgdGhlIGFkZGluZyBjb21iby4nKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb21ib0NvbmZpZyA9IGNvbWJvO1xuICAgIH0gLy8gc3RlcDI6IOabtOaWsCBjaGlsZHJlbu+8jOagueaNruexu+Wei+a3u+WKoCBjb21ib0lkIOaIliBwYXJlbnRJZFxuXG5cbiAgICB2YXIgdHJlZXMgPSBjaGlsZHJlbi5tYXAoZnVuY3Rpb24gKGVsZW1lbnRJZCkge1xuICAgICAgdmFyIGl0ZW0gPSBfdGhpcy5maW5kQnlJZChlbGVtZW50SWQpO1xuXG4gICAgICB2YXIgbW9kZWwgPSBpdGVtLmdldE1vZGVsKCk7XG4gICAgICB2YXIgdHlwZSA9ICcnO1xuICAgICAgaWYgKGl0ZW0uZ2V0VHlwZSkgdHlwZSA9IGl0ZW0uZ2V0VHlwZSgpO1xuICAgICAgdmFyIGNJdGVtID0ge1xuICAgICAgICBpZDogaXRlbS5nZXRJRCgpLFxuICAgICAgICBpdGVtVHlwZTogdHlwZVxuICAgICAgfTtcblxuICAgICAgaWYgKHR5cGUgPT09ICdjb21ibycpIHtcbiAgICAgICAgY0l0ZW0ucGFyZW50SWQgPSBjb21ib0lkO1xuICAgICAgICBtb2RlbC5wYXJlbnRJZCA9IGNvbWJvSWQ7XG4gICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdub2RlJykge1xuICAgICAgICBjSXRlbS5jb21ib0lkID0gY29tYm9JZDtcbiAgICAgICAgbW9kZWwuY29tYm9JZCA9IGNvbWJvSWQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjSXRlbTtcbiAgICB9KTtcbiAgICBjb21ib0NvbmZpZy5jaGlsZHJlbiA9IHRyZWVzOyAvLyBzdGVwIDM6IOa3u+WKoCBDb21ib++8jGFkZEl0ZW0g5pe25Lya5bCG5a2Q5bCG5YWD57Sg5re75Yqg5YiwIENvbWJvIOS4rVxuXG4gICAgdGhpcy5hZGRJdGVtKCdjb21ibycsIGNvbWJvQ29uZmlnLCBmYWxzZSk7XG4gICAgdGhpcy5zZXQoJ2NvbWJvU29ydGVkJywgZmFsc2UpOyAvLyBzdGVwNDog5pu05pawIGNvbWJvVHJlZXMg57uT5p6EXG5cbiAgICB2YXIgY29tYm9UcmVlcyA9IHRoaXMuZ2V0KCdjb21ib1RyZWVzJyk7XG4gICAgKGNvbWJvVHJlZXMgfHwgW10pLmZvckVhY2goZnVuY3Rpb24gKGN0cmVlKSB7XG4gICAgICB0cmF2ZXJzZVRyZWVVcChjdHJlZSwgZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgIGlmIChjaGlsZC5pZCA9PT0gY29tYm9JZCkge1xuICAgICAgICAgIGNoaWxkLml0ZW1UeXBlID0gJ2NvbWJvJztcbiAgICAgICAgICBjaGlsZC5jaGlsZHJlbiA9IHRyZWVzO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpZiAoY29tYm9UcmVlcykge1xuICAgICAgdGhpcy5zb3J0Q29tYm9zKCk7XG4gICAgfVxuICB9O1xuICAvKipcbiAgICog6Kej5pWjIGNvbWJvXG4gICAqIEBwYXJhbSB7U3RyaW5nIHwgSU5vZGUgfCBJQ29tYm99IGNvbWJvIOmcgOimgeiiq+ino+aVo+eahCBDb21ibyBpdGVtIOaIliBpZFxuICAgKi9cblxuXG4gIEFic3RyYWN0R3JhcGgucHJvdG90eXBlLnVuY29tYm8gPSBmdW5jdGlvbiAoY29tYm8pIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdmFyIF9hO1xuXG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBjb21ib0l0ZW0gPSBjb21ibztcblxuICAgIGlmIChpc1N0cmluZyhjb21ibykpIHtcbiAgICAgIGNvbWJvSXRlbSA9IHRoaXMuZmluZEJ5SWQoY29tYm8pO1xuICAgIH1cblxuICAgIGlmICghY29tYm9JdGVtIHx8IGNvbWJvSXRlbS5nZXRUeXBlICYmIGNvbWJvSXRlbS5nZXRUeXBlKCkgIT09ICdjb21ibycpIHtcbiAgICAgIGNvbnNvbGUud2FybignVGhlIGl0ZW0gaXMgbm90IGEgY29tYm8hJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHBhcmVudElkID0gY29tYm9JdGVtLmdldE1vZGVsKCkucGFyZW50SWQ7XG4gICAgdmFyIGNvbWJvVHJlZXMgPSBzZWxmLmdldCgnY29tYm9UcmVlcycpO1xuICAgIGlmICghY29tYm9UcmVlcykgY29tYm9UcmVlcyA9IFtdO1xuICAgIHZhciBpdGVtTWFwID0gdGhpcy5nZXQoJ2l0ZW1NYXAnKTtcbiAgICB2YXIgY29tYm9JZCA9IGNvbWJvSXRlbS5nZXQoJ2lkJyk7XG4gICAgdmFyIHRyZWVUb0JlVW5jb21ibztcbiAgICB2YXIgYnJvdGhlcnMgPSBbXTtcbiAgICB2YXIgY29tYm9JdGVtcyA9IHRoaXMuZ2V0KCdjb21ib3MnKTtcbiAgICB2YXIgcGFyZW50SXRlbSA9IHRoaXMuZmluZEJ5SWQocGFyZW50SWQpO1xuICAgIGNvbWJvVHJlZXMuZm9yRWFjaChmdW5jdGlvbiAoY3RyZWUpIHtcbiAgICAgIGlmICh0cmVlVG9CZVVuY29tYm8pIHJldHVybjsgLy8gdGVybWluYXRlIHRoZSBmb3JFYWNoXG5cbiAgICAgIHRyYXZlcnNlVHJlZVVwKGN0cmVlLCBmdW5jdGlvbiAoc3VidHJlZSkge1xuICAgICAgICB2YXIgX2E7IC8vIGZpbmQgdGhlIGNvbWJvIHRvIGJlIHVuY29tYm9lZCwgZGVsZXRlIHRoZSBjb21ibyBmcm9tIG1hcCBhbmQgY2FjaGVcblxuXG4gICAgICAgIGlmIChzdWJ0cmVlLmlkID09PSBjb21ib0lkKSB7XG4gICAgICAgICAgdHJlZVRvQmVVbmNvbWJvID0gc3VidHJlZTsgLy8gZGVsZXRlIHRoZSByZWxhdGVkIGVkZ2VzXG5cbiAgICAgICAgICB2YXIgZWRnZXMgPSBjb21ib0l0ZW0uZ2V0RWRnZXMoKTtcbiAgICAgICAgICBlZGdlcy5mb3JFYWNoKGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgICAgICAgICBfdGhpcy5yZW1vdmVJdGVtKGVkZ2UsIGZhbHNlKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB2YXIgaW5kZXggPSBjb21ib0l0ZW1zLmluZGV4T2YoY29tYm9JdGVtKTtcbiAgICAgICAgICBjb21ib0l0ZW1zLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgZGVsZXRlIGl0ZW1NYXBbY29tYm9JZF07XG4gICAgICAgICAgY29tYm9JdGVtLmRlc3Ryb3koKTtcblxuICAgICAgICAgIF90aGlzLmVtaXQoJ2FmdGVycmVtb3ZlaXRlbScsIHtcbiAgICAgICAgICAgIGl0ZW06IGNvbWJvSXRlbVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IC8vIGZpbmQgdGhlIHBhcmVudCB0byByZW1vdmUgdGhlIGNvbWJvIGZyb20gdGhlIGNvbWJvJ3MgYnJvdGhlcnMgYXJyYXkgYW5kIGFkZCB0aGUgY29tYm8ncyBjaGlsZHJlbiB0byB0aGUgY29tYm8ncyBicm90aGVycyBhcnJheSBpbiB0aGUgdHJlZVxuXG5cbiAgICAgICAgaWYgKHBhcmVudElkICYmIHRyZWVUb0JlVW5jb21ibyAmJiBzdWJ0cmVlLmlkID09PSBwYXJlbnRJZCkge1xuICAgICAgICAgIHBhcmVudEl0ZW0ucmVtb3ZlQ29tYm8oY29tYm9JdGVtKTtcbiAgICAgICAgICBicm90aGVycyA9IHN1YnRyZWUuY2hpbGRyZW47IC8vIHRoZSBjb21ibydzIGJyb3RoZXJzXG4gICAgICAgICAgLy8gcmVtb3ZlIHRoZSBjb21ibyBmcm9tIGl0cyBicm90aGVycyBhcnJheVxuXG4gICAgICAgICAgdmFyIGluZGV4ID0gYnJvdGhlcnMuaW5kZXhPZih0cmVlVG9CZVVuY29tYm8pO1xuXG4gICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgYnJvdGhlcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICB9IC8vIGFwcGVuZCB0aGUgY29tYm8ncyBjaGlsZHJlbiB0byB0aGUgY29tYm8ncyBicm90aGVycyBhcnJheVxuXG5cbiAgICAgICAgICAoX2EgPSB0cmVlVG9CZVVuY29tYm8uY2hpbGRyZW4pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5mb3JFYWNoKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICAgICAgdmFyIGl0ZW0gPSBfdGhpcy5maW5kQnlJZChjaGlsZC5pZCk7XG5cbiAgICAgICAgICAgIHZhciBjaGlsZE1vZGVsID0gaXRlbS5nZXRNb2RlbCgpO1xuXG4gICAgICAgICAgICBpZiAoaXRlbS5nZXRUeXBlICYmIGl0ZW0uZ2V0VHlwZSgpID09PSAnY29tYm8nKSB7XG4gICAgICAgICAgICAgIGNoaWxkLnBhcmVudElkID0gcGFyZW50SWQ7XG4gICAgICAgICAgICAgIGRlbGV0ZSBjaGlsZC5jb21ib0lkO1xuICAgICAgICAgICAgICBjaGlsZE1vZGVsLnBhcmVudElkID0gcGFyZW50SWQ7IC8vIHVwZGF0ZSB0aGUgcGFyZW50SWQgb2YgdGhlIG1vZGVsXG5cbiAgICAgICAgICAgICAgZGVsZXRlIGNoaWxkTW9kZWwuY29tYm9JZDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXRlbS5nZXRUeXBlICYmIGl0ZW0uZ2V0VHlwZSgpID09PSAnbm9kZScpIHtcbiAgICAgICAgICAgICAgY2hpbGQuY29tYm9JZCA9IHBhcmVudElkO1xuICAgICAgICAgICAgICBjaGlsZE1vZGVsLmNvbWJvSWQgPSBwYXJlbnRJZDsgLy8gdXBkYXRlIHRoZSBwYXJlbnRJZCBvZiB0aGUgbW9kZWxcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcGFyZW50SXRlbS5hZGRDaGlsZChpdGVtKTtcbiAgICAgICAgICAgIGJyb3RoZXJzLnB1c2goY2hpbGQpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSk7XG4gICAgfSk7IC8vIGlmIHRoZSBwYXJlbnRJZCBpcyBub3QgZm91bmQsIHJlbW92ZSB0aGUgY29tYm8gZnJvbSB0aGUgcm9vdHNcblxuICAgIGlmICghcGFyZW50SWQgJiYgdHJlZVRvQmVVbmNvbWJvKSB7XG4gICAgICB2YXIgaW5kZXggPSBjb21ib1RyZWVzLmluZGV4T2YodHJlZVRvQmVVbmNvbWJvKTtcbiAgICAgIGNvbWJvVHJlZXMuc3BsaWNlKGluZGV4LCAxKTsgLy8gbW9kaWZ5IHRoZSBwYXJlbnRJZCBvZiB0aGUgY2hpbGRyZW5cblxuICAgICAgKF9hID0gdHJlZVRvQmVVbmNvbWJvLmNoaWxkcmVuKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZm9yRWFjaChmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgY2hpbGQucGFyZW50SWQgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgdmFyIGNoaWxkTW9kZWwgPSBfdGhpcy5maW5kQnlJZChjaGlsZC5pZCkuZ2V0TW9kZWwoKTtcblxuICAgICAgICBkZWxldGUgY2hpbGRNb2RlbC5wYXJlbnRJZDsgLy8gdXBkYXRlIHRoZSBwYXJlbnRJZCBvZiB0aGUgbW9kZWxcblxuICAgICAgICBkZWxldGUgY2hpbGRNb2RlbC5jb21ib0lkOyAvLyB1cGRhdGUgdGhlIGNvbWJvSWQgb2YgdGhlIG1vZGVsXG5cbiAgICAgICAgaWYgKGNoaWxkLml0ZW1UeXBlICE9PSAnbm9kZScpIGNvbWJvVHJlZXMucHVzaChjaGlsZCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH07XG4gIC8qKlxuICAgKiDmoLnmja7oioLngrnnmoQgYmJveCDmm7TmlrDmiYDmnIkgY29tYm9zIOeahOe7mOWItu+8jOWMheaLrCBjb21ib3Mg55qE5L2N572u5ZKM6IyD5Zu0XG4gICAqL1xuXG5cbiAgQWJzdHJhY3RHcmFwaC5wcm90b3R5cGUudXBkYXRlQ29tYm9zID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIGNvbWJvVHJlZXMgPSB0aGlzLmdldCgnY29tYm9UcmVlcycpO1xuICAgIHZhciBpdGVtQ29udHJvbGxlciA9IHNlbGYuZ2V0KCdpdGVtQ29udHJvbGxlcicpO1xuICAgIHZhciBpdGVtTWFwID0gc2VsZi5nZXQoJ2l0ZW1NYXAnKTtcbiAgICAoY29tYm9UcmVlcyB8fCBbXSkuZm9yRWFjaChmdW5jdGlvbiAoY3RyZWUpIHtcbiAgICAgIHRyYXZlcnNlVHJlZVVwKGN0cmVlLCBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgaWYgKCFjaGlsZCkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGNoaWxkSXRlbSA9IGl0ZW1NYXBbY2hpbGQuaWRdO1xuXG4gICAgICAgIGlmIChjaGlsZEl0ZW0gJiYgY2hpbGRJdGVtLmdldFR5cGUgJiYgY2hpbGRJdGVtLmdldFR5cGUoKSA9PT0gJ2NvbWJvJykge1xuICAgICAgICAgIC8vIOabtOaWsOWFt+S9k+eahCBDb21ibyDkuYvliY3lhYjmuIXpmaTmiYDmnInnmoTlt7LmnInnirbmgIHvvIzku6XlhY3lsIYgc3RhdGUg5Lit55qE5qC35byP5pu05paw5Li6IENvbWJvIOeahOagt+W8j1xuICAgICAgICAgIHZhciBzdGF0ZXMgPSBfX3NwcmVhZEFycmF5KFtdLCBjaGlsZEl0ZW0uZ2V0U3RhdGVzKCksIHRydWUpO1xuXG4gICAgICAgICAgZWFjaChzdGF0ZXMsIGZ1bmN0aW9uIChzdGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzLnNldEl0ZW1TdGF0ZShjaGlsZEl0ZW0sIHN0YXRlLCBmYWxzZSk7XG4gICAgICAgICAgfSk7IC8vIOabtOaWsOWFt+S9k+eahCBDb21ib1xuXG4gICAgICAgICAgaXRlbUNvbnRyb2xsZXIudXBkYXRlQ29tYm8oY2hpbGRJdGVtLCBjaGlsZC5jaGlsZHJlbik7IC8vIOabtOaWsCBDb21ibyDlkI7vvIzov5jljp/lt7LmnInnmoTnirbmgIFcblxuICAgICAgICAgIGVhY2goc3RhdGVzLCBmdW5jdGlvbiAoc3RhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5zZXRJdGVtU3RhdGUoY2hpbGRJdGVtLCBzdGF0ZSwgdHJ1ZSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHNlbGYuc29ydENvbWJvcygpO1xuICB9O1xuICAvKipcbiAgICog5qC55o2u6IqC54K555qEIGJib3gg5pu05pawIGNvbWJvIOWPiuWFtuelluWFiCBjb21ib3Mg55qE57uY5Yi277yM5YyF5ousIGNvbWJvcyDnmoTkvY3nva7lkozojIPlm7RcbiAgICogQHBhcmFtIHtTdHJpbmcgfCBJQ29tYm99IGNvbWJvIOmcgOimgeiiq+abtOaWsOeahCBDb21ibyDmiJYgaWTvvIzoi6XmjIflrprvvIzliJnor6UgQ29tYm8g5Y+K5omA5pyJ56WW5YWIIENvbWJvZCDpg73kvJrooqvmm7TmlrBcbiAgICovXG5cblxuICBBYnN0cmFjdEdyYXBoLnByb3RvdHlwZS51cGRhdGVDb21ibyA9IGZ1bmN0aW9uIChjb21ibykge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIGNvbWJvSXRlbSA9IGNvbWJvO1xuICAgIHZhciBjb21ib0lkO1xuXG4gICAgaWYgKGlzU3RyaW5nKGNvbWJvKSkge1xuICAgICAgY29tYm9JdGVtID0gdGhpcy5maW5kQnlJZChjb21ibyk7XG4gICAgfVxuXG4gICAgaWYgKCFjb21ib0l0ZW0gfHwgY29tYm9JdGVtLmdldFR5cGUgJiYgY29tYm9JdGVtLmdldFR5cGUoKSAhPT0gJ2NvbWJvJykge1xuICAgICAgY29uc29sZS53YXJuKCdUaGUgaXRlbSB0byBiZSB1cGRhdGVkIGlzIG5vdCBhIGNvbWJvIScpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbWJvSWQgPSBjb21ib0l0ZW0uZ2V0KCdpZCcpO1xuICAgIHZhciBjb21ib1RyZWVzID0gdGhpcy5nZXQoJ2NvbWJvVHJlZXMnKTtcbiAgICB2YXIgaXRlbUNvbnRyb2xsZXIgPSBzZWxmLmdldCgnaXRlbUNvbnRyb2xsZXInKTtcbiAgICB2YXIgaXRlbU1hcCA9IHNlbGYuZ2V0KCdpdGVtTWFwJyk7XG4gICAgKGNvbWJvVHJlZXMgfHwgW10pLmZvckVhY2goZnVuY3Rpb24gKGN0cmVlKSB7XG4gICAgICB0cmF2ZXJzZVRyZWVVcChjdHJlZSwgZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgIGlmICghY2hpbGQpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBjaGlsZEl0ZW0gPSBpdGVtTWFwW2NoaWxkLmlkXTtcblxuICAgICAgICBpZiAoY29tYm9JZCA9PT0gY2hpbGQuaWQgJiYgY2hpbGRJdGVtICYmIGNoaWxkSXRlbS5nZXRUeXBlICYmIGNoaWxkSXRlbS5nZXRUeXBlKCkgPT09ICdjb21ibycpIHtcbiAgICAgICAgICAvLyDmm7TmlrDlhbfkvZPnmoQgQ29tYm8g5LmL5YmN5YWI5riF6Zmk5omA5pyJ55qE5bey5pyJ54q25oCB77yM5Lul5YWN5bCGIHN0YXRlIOS4reeahOagt+W8j+abtOaWsOS4uiBDb21ibyDnmoTmoLflvI9cbiAgICAgICAgICB2YXIgc3RhdGVzID0gX19zcHJlYWRBcnJheShbXSwgY2hpbGRJdGVtLmdldFN0YXRlcygpLCB0cnVlKTsgLy8gfHwgIWl0ZW0uZ2V0U3RhdGVTdHlsZShzdGF0ZU5hbWUpXG5cblxuICAgICAgICAgIGVhY2goc3RhdGVzLCBmdW5jdGlvbiAoc3RhdGUpIHtcbiAgICAgICAgICAgIGlmIChjaGlsZEl0ZW0uZ2V0U3RhdGVTdHlsZShzdGF0ZSkpIHtcbiAgICAgICAgICAgICAgX3RoaXMuc2V0SXRlbVN0YXRlKGNoaWxkSXRlbSwgc3RhdGUsIGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTsgLy8g5pu05paw5YW35L2T55qEIENvbWJvXG5cbiAgICAgICAgICBpdGVtQ29udHJvbGxlci51cGRhdGVDb21ibyhjaGlsZEl0ZW0sIGNoaWxkLmNoaWxkcmVuKTsgLy8g5pu05pawIENvbWJvIOWQju+8jOi/mOWOn+W3suacieeahOeKtuaAgVxuXG4gICAgICAgICAgZWFjaChzdGF0ZXMsIGZ1bmN0aW9uIChzdGF0ZSkge1xuICAgICAgICAgICAgaWYgKGNoaWxkSXRlbS5nZXRTdGF0ZVN0eWxlKHN0YXRlKSkge1xuICAgICAgICAgICAgICBfdGhpcy5zZXRJdGVtU3RhdGUoY2hpbGRJdGVtLCBzdGF0ZSwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKGNvbWJvSWQpIGNvbWJvSWQgPSBjaGlsZC5wYXJlbnRJZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG4gIC8qKlxuICAgKiDmm7TmlrDmoJHnu5PmnoTvvIzkvovlpoLnp7vliqjlrZDmoJHnrYlcbiAgICogQHBhcmFtIHtTdHJpbmcgfCBJTm9kZSB8IElDb21ib30gaXRlbSDpnIDopoHooqvmm7TmlrDnmoQgQ29tYm8g5oiWIOiKgueCuSBpZFxuICAgKiBAcGFyYW0ge3N0cmluZyB8IHVuZGVmaW5lZH0gcGFyZW50SWQg5paw55qE54i2IGNvbWJvIGlk77yMdW5kZWZpbmVkIOS7o+ihqOayoeacieeItiBjb21ib1xuICAgKi9cblxuXG4gIEFic3RyYWN0R3JhcGgucHJvdG90eXBlLnVwZGF0ZUNvbWJvVHJlZSA9IGZ1bmN0aW9uIChpdGVtLCBwYXJlbnRJZCwgc3RhY2spIHtcbiAgICBpZiAoc3RhY2sgPT09IHZvaWQgMCkge1xuICAgICAgc3RhY2sgPSB0cnVlO1xuICAgIH1cblxuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLnNldCgnY29tYm9Tb3J0ZWQnLCBmYWxzZSk7XG4gICAgdmFyIHVJdGVtO1xuXG4gICAgaWYgKGlzU3RyaW5nKGl0ZW0pKSB7XG4gICAgICB1SXRlbSA9IHNlbGYuZmluZEJ5SWQoaXRlbSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHVJdGVtID0gaXRlbTtcbiAgICB9XG5cbiAgICB2YXIgbW9kZWwgPSB1SXRlbS5nZXRNb2RlbCgpO1xuICAgIHZhciBvbGRQYXJlbnRJZCA9IG1vZGVsLmNvbWJvSWQgfHwgbW9kZWwucGFyZW50SWQ7XG4gICAgdmFyIHR5cGUgPSAnJztcbiAgICBpZiAodUl0ZW0uZ2V0VHlwZSkgdHlwZSA9IHVJdGVtLmdldFR5cGUoKTsgLy8g6IulIGl0ZW0g5pivIENvbWJv77yM5LiUIHBhcmVudElkIOaYr+WFtuWtkOWtmSBjb21ibyDnmoQgaWTvvIzliJnorablkYrlubbnu4jmraJcblxuICAgIGlmIChwYXJlbnRJZCAmJiB0eXBlID09PSAnY29tYm8nKSB7XG4gICAgICB2YXIgY29tYm9UcmVlcyA9IHRoaXMuZ2V0KCdjb21ib1RyZWVzJyk7XG4gICAgICB2YXIgdmFsaWRfMSA9IHRydWU7XG4gICAgICB2YXIgaXRlbVN1YlRyZWVfMTtcbiAgICAgIChjb21ib1RyZWVzIHx8IFtdKS5mb3JFYWNoKGZ1bmN0aW9uIChjdHJlZSkge1xuICAgICAgICBpZiAoaXRlbVN1YlRyZWVfMSkgcmV0dXJuO1xuICAgICAgICB0cmF2ZXJzZVRyZWUoY3RyZWUsIGZ1bmN0aW9uIChzdWJUcmVlKSB7XG4gICAgICAgICAgaWYgKGl0ZW1TdWJUcmVlXzEpIHJldHVybjsgLy8g5om+5Yiw5LuOIGl0ZW0g5byA5aeL55qE5a2Q5qCRXG5cbiAgICAgICAgICBpZiAoc3ViVHJlZS5pZCA9PT0gdUl0ZW0uZ2V0SUQoKSkge1xuICAgICAgICAgICAgaXRlbVN1YlRyZWVfMSA9IHN1YlRyZWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0pO1xuICAgICAgfSk7IC8vIOWcqOS7pSBpdGVtIOS4uuagueeahOWtkOagkeS4reWvu+aJvuS4jiBwYXJlbnRJZCDnm7jlkIznmoTlkI7nu6flhYPntKBcblxuICAgICAgdHJhdmVyc2VUcmVlKGl0ZW1TdWJUcmVlXzEsIGZ1bmN0aW9uIChzdWJUcmVlKSB7XG4gICAgICAgIGlmIChzdWJUcmVlLmlkID09PSBwYXJlbnRJZCkge1xuICAgICAgICAgIHZhbGlkXzEgPSBmYWxzZTtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0pOyAvLyBwYXJlbnRJZCDmmK8gaXRlbSDnmoTkuIDkuKrlkI7nu6flhYPntKDvvIzkuI3og73ov5vooYzmm7TmlrBcblxuICAgICAgaWYgKCF2YWxpZF8xKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignRmFpbGVkIHRvIHVwZGF0ZSB0aGUgY29tYm8gdHJlZSEgVGhlIHBhcmVudElkIHBvaW50cyB0byBhIGRlc2NlbmRhbnQgb2YgdGhlIGNvbWJvIScpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHN0YWNrICYmIHRoaXMuZ2V0KCdlbmFibGVkU3RhY2snKSkge1xuICAgICAgdmFyIGJlZm9yZURhdGEgPSB7fSxcbiAgICAgICAgICBhZnRlckRhdGEgPSB7fTtcblxuICAgICAgaWYgKHR5cGUgPT09ICdjb21ibycpIHtcbiAgICAgICAgYmVmb3JlRGF0YS5jb21ib3MgPSBbe1xuICAgICAgICAgIGlkOiBtb2RlbC5pZCxcbiAgICAgICAgICBwYXJlbnRJZDogbW9kZWwucGFyZW50SWRcbiAgICAgICAgfV07XG4gICAgICAgIGFmdGVyRGF0YS5jb21ib3MgPSBbe1xuICAgICAgICAgIGlkOiBtb2RlbC5pZCxcbiAgICAgICAgICBwYXJlbnRJZDogcGFyZW50SWRcbiAgICAgICAgfV07XG4gICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdub2RlJykge1xuICAgICAgICBiZWZvcmVEYXRhLm5vZGVzID0gW3tcbiAgICAgICAgICBpZDogbW9kZWwuaWQsXG4gICAgICAgICAgcGFyZW50SWQ6IG1vZGVsLmNvbWJvSWRcbiAgICAgICAgfV07XG4gICAgICAgIGFmdGVyRGF0YS5ub2RlcyA9IFt7XG4gICAgICAgICAgaWQ6IG1vZGVsLmlkLFxuICAgICAgICAgIHBhcmVudElkOiBwYXJlbnRJZFxuICAgICAgICB9XTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5wdXNoU3RhY2soJ3VwZGF0ZUNvbWJvVHJlZScsIHtcbiAgICAgICAgYmVmb3JlOiBiZWZvcmVEYXRhLFxuICAgICAgICBhZnRlcjogYWZ0ZXJEYXRhXG4gICAgICB9KTtcbiAgICB9IC8vIOW9kyBjb21ibyDlrZjlnKggcGFyZW50SWQg5oiWIGNvbWJvSWQg5pe277yM5omN5bCG5YW256e76ZmkXG5cblxuICAgIGlmIChtb2RlbC5wYXJlbnRJZCB8fCBtb2RlbC5jb21ib0lkKSB7XG4gICAgICB2YXIgY29tYm8gPSB0aGlzLmZpbmRCeUlkKG1vZGVsLnBhcmVudElkIHx8IG1vZGVsLmNvbWJvSWQpO1xuXG4gICAgICBpZiAoY29tYm8pIHtcbiAgICAgICAgY29tYm8ucmVtb3ZlQ2hpbGQodUl0ZW0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlID09PSAnY29tYm8nKSB7XG4gICAgICBtb2RlbC5wYXJlbnRJZCA9IHBhcmVudElkO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ25vZGUnKSB7XG4gICAgICBtb2RlbC5jb21ib0lkID0gcGFyZW50SWQ7XG4gICAgfSAvLyDlj6rmnInlvZPnp7vlhaXliLDmjIflrpogY29tYm8g5pe25omN5re75YqgXG5cblxuICAgIGlmIChwYXJlbnRJZCkge1xuICAgICAgdmFyIHBhcmVudENvbWJvID0gdGhpcy5maW5kQnlJZChwYXJlbnRJZCk7XG5cbiAgICAgIGlmIChwYXJlbnRDb21ibykge1xuICAgICAgICAvLyDlsIblhYPntKDmt7vliqDliLAgcGFyZW50Q29tYm8g5LitXG4gICAgICAgIHBhcmVudENvbWJvLmFkZENoaWxkKHVJdGVtKTtcbiAgICAgIH1cbiAgICB9IC8vIOWmguaenOWOn+WFiOacieeItuS6siBjb21ib++8jOWImeS7juWOn+eItiBjb21ibyDnmoTlrZDlhYPntKDmlbDnu4TkuK3liKDpmaRcblxuXG4gICAgaWYgKG9sZFBhcmVudElkKSB7XG4gICAgICB2YXIgcGFyZW50Q29tYm8gPSB0aGlzLmZpbmRCeUlkKG9sZFBhcmVudElkKTtcblxuICAgICAgaWYgKHBhcmVudENvbWJvKSB7XG4gICAgICAgIC8vIOWwhuWFg+e0oOS7jiBwYXJlbnRDb21ibyDkuK3np7vpmaRcbiAgICAgICAgcGFyZW50Q29tYm8ucmVtb3ZlQ2hpbGQodUl0ZW0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBuZXdDb21ib1RyZWVzID0gcmVjb25zdHJ1Y3RUcmVlKHRoaXMuZ2V0KCdjb21ib1RyZWVzJyksIG1vZGVsLmlkLCBwYXJlbnRJZCk7XG4gICAgdGhpcy5zZXQoJ2NvbWJvVHJlZXMnLCBuZXdDb21ib1RyZWVzKTtcbiAgICB0aGlzLnVwZGF0ZUNvbWJvcygpO1xuICB9O1xuICAvKipcbiAgICog5a+85Ye65Zu+5pWw5o2uXG4gICAqIEByZXR1cm4ge29iamVjdH0gZGF0YVxuICAgKi9cblxuXG4gIEFic3RyYWN0R3JhcGgucHJvdG90eXBlLnNhdmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIG5vZGVzID0gW107XG4gICAgdmFyIGVkZ2VzID0gW107XG4gICAgdmFyIGNvbWJvcyA9IFtdO1xuICAgIGVhY2godGhpcy5nZXQoJ25vZGVzJyksIGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICBub2Rlcy5wdXNoKG5vZGUuZ2V0TW9kZWwoKSk7XG4gICAgfSk7XG4gICAgZWFjaCh0aGlzLmdldCgnZWRnZXMnKSwgZnVuY3Rpb24gKGVkZ2UpIHtcbiAgICAgIGVkZ2VzLnB1c2goZWRnZS5nZXRNb2RlbCgpKTtcbiAgICB9KTtcbiAgICBlYWNoKHRoaXMuZ2V0KCdjb21ib3MnKSwgZnVuY3Rpb24gKGNvbWJvKSB7XG4gICAgICBjb21ib3MucHVzaChjb21iby5nZXRNb2RlbCgpKTtcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgbm9kZXM6IG5vZGVzLFxuICAgICAgZWRnZXM6IGVkZ2VzLFxuICAgICAgY29tYm9zOiBjb21ib3NcbiAgICB9O1xuICB9O1xuICAvKipcbiAgICog5pS55Y+Y55S75biD5aSn5bCPXG4gICAqIEBwYXJhbSAge251bWJlcn0gd2lkdGggIOeUu+W4g+WuveW6plxuICAgKiBAcGFyYW0gIHtudW1iZXJ9IGhlaWdodCDnlLvluIPpq5jluqZcbiAgICogQHJldHVybiB7b2JqZWN0fSB0aGlzXG4gICAqL1xuXG5cbiAgQWJzdHJhY3RHcmFwaC5wcm90b3R5cGUuY2hhbmdlU2l6ZSA9IGZ1bmN0aW9uICh3aWR0aCwgaGVpZ2h0KSB7XG4gICAgdmFyIHZpZXdDb250cm9sbGVyID0gdGhpcy5nZXQoJ3ZpZXdDb250cm9sbGVyJyk7XG4gICAgdmlld0NvbnRyb2xsZXIuY2hhbmdlU2l6ZSh3aWR0aCwgaGVpZ2h0KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcbiAgLyoqXG4gICAqIOW9k+a6kOaVsOaNruWcqOWklumDqOWPkeeUn+WPmOabtOaXtu+8jOagueaNruaWsOaVsOaNruWIt+aWsOinhuWbvuOAguS9huaYr+S4jeWIt+aWsOiKgueCueS9jee9rlxuICAgKi9cblxuXG4gIEFic3RyYWN0R3JhcGgucHJvdG90eXBlLnJlZnJlc2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHNlbGYuZW1pdCgnYmVmb3JlZ3JhcGhyZWZyZXNoJyk7XG5cbiAgICBpZiAoc2VsZi5nZXQoJ2FuaW1hdGUnKSkge1xuICAgICAgc2VsZi5wb3NpdGlvbnNBbmltYXRlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBub2RlcyA9IHNlbGYuZ2V0KCdub2RlcycpO1xuICAgICAgdmFyIGVkZ2VzID0gc2VsZi5nZXQoJ2VkZ2VzJyk7XG4gICAgICB2YXIgdmVkZ2VzID0gc2VsZi5nZXQoJ2VkZ2VzJyk7XG4gICAgICBlYWNoKG5vZGVzLCBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICBub2RlLnJlZnJlc2goKTtcbiAgICAgIH0pO1xuICAgICAgZWFjaChlZGdlcywgZnVuY3Rpb24gKGVkZ2UpIHtcbiAgICAgICAgZWRnZS5yZWZyZXNoKCk7XG4gICAgICB9KTtcbiAgICAgIGVhY2godmVkZ2VzLCBmdW5jdGlvbiAodmVkZ2UpIHtcbiAgICAgICAgdmVkZ2UucmVmcmVzaCgpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2VsZi5lbWl0KCdhZnRlcmdyYXBocmVmcmVzaCcpO1xuICAgIHNlbGYuYXV0b1BhaW50KCk7XG4gIH07XG4gIC8qKlxuICAgKiDojrflj5blvZPliY3lm77kuK3miYDmnInoioLngrnnmoRpdGVt5a6e5L6LXG4gICAqIEByZXR1cm4ge0lOb2RlfSBpdGVt5pWw57uEXG4gICAqL1xuXG5cbiAgQWJzdHJhY3RHcmFwaC5wcm90b3R5cGUuZ2V0Tm9kZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KCdub2RlcycpO1xuICB9O1xuICAvKipcbiAgICog6I635Y+W5b2T5YmN5Zu+5Lit5omA5pyJ6L6555qEaXRlbeWunuS+i1xuICAgKiBAcmV0dXJuIHtJRWRnZX0gaXRlbeaVsOe7hFxuICAgKi9cblxuXG4gIEFic3RyYWN0R3JhcGgucHJvdG90eXBlLmdldEVkZ2VzID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLmdldCgnZWRnZXMnKTtcbiAgfTtcbiAgLyoqXG4gICAqIOiOt+WPluWbvuS4reaJgOacieeahCBjb21ibyDlrp7kvotcbiAgICovXG5cblxuICBBYnN0cmFjdEdyYXBoLnByb3RvdHlwZS5nZXRDb21ib3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KCdjb21ib3MnKTtcbiAgfTtcbiAgLyoqXG4gICAqIOiOt+WPluaMh+WumiBDb21ibyDkuK3miYDmnInnmoToioLngrlcbiAgICogQHBhcmFtIGNvbWJvSWQgY29tYm8gSURcbiAgICovXG5cblxuICBBYnN0cmFjdEdyYXBoLnByb3RvdHlwZS5nZXRDb21ib0NoaWxkcmVuID0gZnVuY3Rpb24gKGNvbWJvKSB7XG4gICAgaWYgKGlzU3RyaW5nKGNvbWJvKSkge1xuICAgICAgY29tYm8gPSB0aGlzLmZpbmRCeUlkKGNvbWJvKTtcbiAgICB9XG5cbiAgICBpZiAoIWNvbWJvIHx8IGNvbWJvLmdldFR5cGUgJiYgY29tYm8uZ2V0VHlwZSgpICE9PSAnY29tYm8nKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1RoZSBjb21ibyBkb2VzIG5vdCBleGlzdCEnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4gY29tYm8uZ2V0Q2hpbGRyZW4oKTtcbiAgfTtcbiAgLyoqXG4gICAqIOagueaNriBncmFwaCDkuIrnmoQgYW5pbWF0ZUNmZyDov5vooYzop4blm77kuK3oioLngrnkvY3nva7liqjnlLvmjqXlj6NcbiAgICovXG5cblxuICBBYnN0cmFjdEdyYXBoLnByb3RvdHlwZS5wb3NpdGlvbnNBbmltYXRlID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBzZWxmLmVtaXQoJ2JlZm9yZWFuaW1hdGUnKTtcbiAgICB2YXIgYW5pbWF0ZUNmZyA9IHNlbGYuZ2V0KCdhbmltYXRlQ2ZnJyk7XG4gICAgdmFyIG9uRnJhbWUgPSBhbmltYXRlQ2ZnLm9uRnJhbWU7XG4gICAgdmFyIG5vZGVzID0gc2VsZi5nZXROb2RlcygpO1xuICAgIHZhciB0b05vZGVzID0gbm9kZXMubWFwKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICB2YXIgbW9kZWwgPSBub2RlLmdldE1vZGVsKCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBpZDogbW9kZWwuaWQsXG4gICAgICAgIHg6IG1vZGVsLngsXG4gICAgICAgIHk6IG1vZGVsLnlcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICBpZiAoc2VsZi5pc0FuaW1hdGluZygpKSB7XG4gICAgICBzZWxmLnN0b3BBbmltYXRlKCk7XG4gICAgfVxuXG4gICAgdmFyIGNhbnZhcyA9IHNlbGYuZ2V0KCdjYW52YXMnKTtcbiAgICBjYW52YXMuYW5pbWF0ZShmdW5jdGlvbiAocmF0aW8pIHtcbiAgICAgIGVhY2godG9Ob2RlcywgZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgdmFyIG5vZGUgPSBzZWxmLmZpbmRCeUlkKGRhdGEuaWQpO1xuXG4gICAgICAgIGlmICghbm9kZSB8fCBub2RlLmRlc3Ryb3llZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBvcmlnaW5BdHRycyA9IG5vZGUuZ2V0KCdvcmlnaW5BdHRycycpO1xuICAgICAgICB2YXIgbW9kZWwgPSBub2RlLmdldCgnbW9kZWwnKTtcblxuICAgICAgICBpZiAoIW9yaWdpbkF0dHJzKSB7XG4gICAgICAgICAgdmFyIGNvbnRhaW5lck1hdHJpeCA9IG5vZGUuZ2V0Q29udGFpbmVyKCkuZ2V0TWF0cml4KCk7XG4gICAgICAgICAgaWYgKCFjb250YWluZXJNYXRyaXgpIGNvbnRhaW5lck1hdHJpeCA9IFsxLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAxXTtcbiAgICAgICAgICBvcmlnaW5BdHRycyA9IHtcbiAgICAgICAgICAgIHg6IGNvbnRhaW5lck1hdHJpeFs2XSxcbiAgICAgICAgICAgIHk6IGNvbnRhaW5lck1hdHJpeFs3XVxuICAgICAgICAgIH07XG4gICAgICAgICAgbm9kZS5zZXQoJ29yaWdpbkF0dHJzJywgb3JpZ2luQXR0cnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9uRnJhbWUpIHtcbiAgICAgICAgICB2YXIgYXR0cnMgPSBvbkZyYW1lKG5vZGUsIHJhdGlvLCBkYXRhLCBvcmlnaW5BdHRycyk7XG4gICAgICAgICAgbm9kZS5zZXQoJ21vZGVsJywgT2JqZWN0LmFzc2lnbihtb2RlbCwgYXR0cnMpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBtb2RlbC54ID0gb3JpZ2luQXR0cnMueCArIChkYXRhLnggLSBvcmlnaW5BdHRycy54KSAqIHJhdGlvO1xuICAgICAgICAgIG1vZGVsLnkgPSBvcmlnaW5BdHRycy55ICsgKGRhdGEueSAtIG9yaWdpbkF0dHJzLnkpICogcmF0aW87XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgc2VsZi5yZWZyZXNoUG9zaXRpb25zKCk7XG4gICAgfSwge1xuICAgICAgZHVyYXRpb246IGFuaW1hdGVDZmcuZHVyYXRpb24sXG4gICAgICBlYXNpbmc6IGFuaW1hdGVDZmcuZWFzaW5nLFxuICAgICAgY2FsbGJhY2s6IGZ1bmN0aW9uIGNhbGxiYWNrKCkge1xuICAgICAgICBlYWNoKG5vZGVzLCBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICAgIG5vZGUuc2V0KCdvcmlnaW5BdHRycycsIG51bGwpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoYW5pbWF0ZUNmZy5jYWxsYmFjaykge1xuICAgICAgICAgIGFuaW1hdGVDZmcuY2FsbGJhY2soKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNlbGYuZW1pdCgnYWZ0ZXJhbmltYXRlJyk7XG4gICAgICAgIHNlbGYuYW5pbWF0aW5nID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG4gIC8qKlxuICAgKiDlvZPoioLngrnkvY3nva7lnKjlpJbpg6jlj5HnlJ/mlLnlj5jml7bvvIzliLfmlrDmiYDmnInoioLngrnkvY3nva7vvIzph43orqHnrpfovrlcbiAgICovXG5cblxuICBBYnN0cmFjdEdyYXBoLnByb3RvdHlwZS5yZWZyZXNoUG9zaXRpb25zID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBzZWxmLmVtaXQoJ2JlZm9yZWdyYXBocmVmcmVzaHBvc2l0aW9uJyk7XG4gICAgdmFyIG5vZGVzID0gc2VsZi5nZXQoJ25vZGVzJyk7XG4gICAgdmFyIGVkZ2VzID0gc2VsZi5nZXQoJ2VkZ2VzJyk7XG4gICAgdmFyIHZlZGdlcyA9IHNlbGYuZ2V0KCd2ZWRnZXMnKTtcbiAgICB2YXIgY29tYm9zID0gc2VsZi5nZXQoJ2NvbWJvcycpO1xuICAgIHZhciBtb2RlbDtcbiAgICB2YXIgdXBkYXRlZE5vZGVzID0ge307XG4gICAgZWFjaChub2RlcywgZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgIG1vZGVsID0gbm9kZS5nZXRNb2RlbCgpO1xuICAgICAgdmFyIG9yaWdpbkF0dHJzID0gbm9kZS5nZXQoJ29yaWdpbkF0dHJzJyk7XG5cbiAgICAgIGlmIChvcmlnaW5BdHRycyAmJiBtb2RlbC54ID09PSBvcmlnaW5BdHRycy54ICYmIG1vZGVsLnkgPT09IG9yaWdpbkF0dHJzLnkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgY2hhbmdlZCA9IG5vZGUudXBkYXRlUG9zaXRpb24oe1xuICAgICAgICB4OiBtb2RlbC54LFxuICAgICAgICB5OiBtb2RlbC55XG4gICAgICB9KTtcbiAgICAgIHVwZGF0ZWROb2Rlc1ttb2RlbC5pZF0gPSBjaGFuZ2VkO1xuICAgICAgaWYgKG1vZGVsLmNvbWJvSWQpIHVwZGF0ZWROb2Rlc1ttb2RlbC5jb21ib0lkXSA9IHVwZGF0ZWROb2Rlc1ttb2RlbC5jb21ib0lkXSB8fCBjaGFuZ2VkO1xuICAgIH0pO1xuXG4gICAgaWYgKGNvbWJvcyAmJiBjb21ib3MubGVuZ3RoICE9PSAwKSB7XG4gICAgICBzZWxmLnVwZGF0ZUNvbWJvcygpO1xuICAgIH1cblxuICAgIGVhY2goZWRnZXMsIGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgICB2YXIgc291cmNlTW9kZWwgPSBlZGdlLmdldFNvdXJjZSgpLmdldE1vZGVsKCk7XG4gICAgICB2YXIgdGFyZ2V0ID0gZWRnZS5nZXRUYXJnZXQoKTsgLy8g6YG/5YWNIHRhcmdldCDmmK/nuq/lr7nosaHnmoTmg4XlhrXkuIvosIPnlKggZ2V0TW9kZWwg5pa55rOVXG4gICAgICAvLyDmi5bliqjnlJ/miJDovrnnmoTml7blgJkgdGFyZ2V0IOS8muaYr+e6r+WvueixoVxuXG4gICAgICBpZiAoIWlzUGxhaW5PYmplY3QodGFyZ2V0KSkge1xuICAgICAgICB2YXIgdGFyZ2V0TW9kZWwgPSB0YXJnZXQuZ2V0TW9kZWwoKTtcblxuICAgICAgICBpZiAodXBkYXRlZE5vZGVzW3NvdXJjZU1vZGVsLmlkXSB8fCB1cGRhdGVkTm9kZXNbdGFyZ2V0TW9kZWwuaWRdIHx8IGVkZ2UuZ2V0TW9kZWwoKS5pc0NvbWJvRWRnZSkge1xuICAgICAgICAgIGVkZ2UucmVmcmVzaCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgZWFjaCh2ZWRnZXMsIGZ1bmN0aW9uICh2ZWRnZSkge1xuICAgICAgdmVkZ2UucmVmcmVzaCgpO1xuICAgIH0pO1xuICAgIHNlbGYuZW1pdCgnYWZ0ZXJncmFwaHJlZnJlc2hwb3NpdGlvbicpO1xuICAgIHNlbGYuYXV0b1BhaW50KCk7XG4gIH07XG5cbiAgQWJzdHJhY3RHcmFwaC5wcm90b3R5cGUuc3RvcEFuaW1hdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5nZXQoJ2NhbnZhcycpLnN0b3BBbmltYXRlKCk7XG4gIH07XG5cbiAgQWJzdHJhY3RHcmFwaC5wcm90b3R5cGUuaXNBbmltYXRpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuYW5pbWF0aW5nO1xuICB9O1xuICAvKipcbiAgICog6I635Y+W5b2T5YmN6KeG5Y+j5Ly457yp5q+U5L6LXG4gICAqIEByZXR1cm4ge251bWJlcn0g5q+U5L6LXG4gICAqL1xuXG5cbiAgQWJzdHJhY3RHcmFwaC5wcm90b3R5cGUuZ2V0Wm9vbSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgbWF0cml4ID0gdGhpcy5nZXQoJ2dyb3VwJykuZ2V0TWF0cml4KCk7XG4gICAgcmV0dXJuIG1hdHJpeCA/IG1hdHJpeFswXSA6IDE7XG4gIH07XG4gIC8qKlxuICAgKiDojrflj5blvZPliY3nmoTooYzkuLrmqKHlvI9cbiAgICogQHJldHVybiB7c3RyaW5nfSDlvZPliY3ooYzkuLrmqKHlvI9cbiAgICovXG5cblxuICBBYnN0cmFjdEdyYXBoLnByb3RvdHlwZS5nZXRDdXJyZW50TW9kZSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgbW9kZUNvbnRyb2xsZXIgPSB0aGlzLmdldCgnbW9kZUNvbnRyb2xsZXInKTtcbiAgICByZXR1cm4gbW9kZUNvbnRyb2xsZXIuZ2V0TW9kZSgpO1xuICB9O1xuICAvKipcbiAgICog5YiH5o2i6KGM5Li65qih5byPXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlIOaMh+WumuaooeW8j1xuICAgKiBAcmV0dXJuIHtvYmplY3R9IHRoaXNcbiAgICovXG5cblxuICBBYnN0cmFjdEdyYXBoLnByb3RvdHlwZS5zZXRNb2RlID0gZnVuY3Rpb24gKG1vZGUpIHtcbiAgICB2YXIgbW9kZUNvbnRyb2xsZXIgPSB0aGlzLmdldCgnbW9kZUNvbnRyb2xsZXInKTtcbiAgICBtb2RlQ29udHJvbGxlci5zZXRNb2RlKG1vZGUpO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuICAvKipcbiAgICog5riF6Zmk55S75biD5YWD57SgXG4gICAqIEByZXR1cm4ge29iamVjdH0gdGhpc1xuICAgKi9cblxuXG4gIEFic3RyYWN0R3JhcGgucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gKGF2b2lkRW1pdCkge1xuICAgIHZhciBfYTtcblxuICAgIGlmIChhdm9pZEVtaXQgPT09IHZvaWQgMCkge1xuICAgICAgYXZvaWRFbWl0ID0gZmFsc2U7XG4gICAgfVxuXG4gICAgKF9hID0gdGhpcy5nZXQoJ2NhbnZhcycpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2xlYXIoKTtcbiAgICB0aGlzLmluaXRHcm91cHMoKTsgLy8g5riF56m655S75biD5pe25ZCM5pe25riF6Zmk5pWw5o2uXG5cbiAgICB0aGlzLnNldCh7XG4gICAgICBpdGVtTWFwOiB7fSxcbiAgICAgIG5vZGVzOiBbXSxcbiAgICAgIGVkZ2VzOiBbXSxcbiAgICAgIGdyb3VwczogW10sXG4gICAgICBjb21ib3M6IFtdLFxuICAgICAgY29tYm9UcmVlczogW11cbiAgICB9KTtcbiAgICBpZiAoIWF2b2lkRW1pdCkgdGhpcy5lbWl0KCdhZnRlcnJlbmRlcicpO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuICAvKipcbiAgICog5pu05o2i5biD5bGA6YWN572u6aG5XG4gICAqIEBwYXJhbSB7b2JqZWN0fSBjZmcg5paw5biD5bGA6YWN572u6aG5XG4gICAqIEBwYXJhbSB7J2NlbnRlcicgfCAnYmVnaW4nfSBhbGlnbiDlr7npvZDmlrnlvI/vvIzlj6/pgInkuK3lv4PvvIhjZW50ZXLvvInlr7npvZDliLDlr7npvZDngrnvvIzmiJblt6bkuIrop5LvvIhiZWdpbu+8ieWvuem9kOWIsOWvuem9kOeCuVxuICAgKiBAcGFyYW0ge0lQb2ludH0gYWxpZ25Qb2ludCDnlLvluIPkuIrnmoTlr7npvZDngrnvvIzkuLogQ2FudmFzIOWdkOagh+ezu++8iENhbnZhcyBET03vvIlcbiAgICog6IulIGNmZyDlkKvmnIkgdHlwZSDlrZfmrrXmiJbkuLogU3RyaW5nIOexu+Wei++8jOS4lOS4jueOsOacieW4g+WxgOaWueazleS4jeWQjO+8jOWImeabtOaNouW4g+WxgFxuICAgKiDoi6UgY2ZnIOS4jeWMheaLrCB0eXBlIO+8jOWImeS/neaMgeWOn+acieW4g+WxgOaWueazle+8jOS7heabtOaWsOW4g+WxgOmFjee9rumhuVxuICAgKi9cblxuXG4gIEFic3RyYWN0R3JhcGgucHJvdG90eXBlLnVwZGF0ZUxheW91dCA9IGZ1bmN0aW9uIChjZmcsIGFsaWduLCBhbGlnblBvaW50KSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHZhciBsYXlvdXRDb250cm9sbGVyID0gdGhpcy5nZXQoJ2xheW91dENvbnRyb2xsZXInKTtcblxuICAgIGlmIChpc1N0cmluZyhjZmcpKSB7XG4gICAgICBjZmcgPSB7XG4gICAgICAgIHR5cGU6IGNmZ1xuICAgICAgfTtcbiAgICB9IC8vIGFsaWduIHRoZSBncmFwaCBhZnRlciBsYXlvdXRcblxuXG4gICAgaWYgKGFsaWduKSB7XG4gICAgICB2YXIgdG9Qb2ludF8xID0gYWxpZ25Qb2ludDtcblxuICAgICAgaWYgKCF0b1BvaW50XzEpIHtcbiAgICAgICAgaWYgKGFsaWduID09PSAnYmVnaW4nKSB0b1BvaW50XzEgPSB7XG4gICAgICAgICAgeDogMCxcbiAgICAgICAgICB5OiAwXG4gICAgICAgIH07ZWxzZSB0b1BvaW50XzEgPSB7XG4gICAgICAgICAgeDogdGhpcy5nZXRXaWR0aCgpIC8gMixcbiAgICAgICAgICB5OiB0aGlzLmdldEhlaWdodCgpIC8gMlxuICAgICAgICB9O1xuICAgICAgfSAvLyB0cmFuc2xhdGUgdG8gcG9pbnQgY29vcmRpbmF0ZSBzeXN0ZW1cblxuXG4gICAgICB0b1BvaW50XzEgPSB0aGlzLmdldFBvaW50QnlDYW52YXModG9Qb2ludF8xLngsIHRvUG9pbnRfMS55KTtcbiAgICAgIHZhciBmb3JjZVR5cGVzID0gWydmb3JjZScsICdnRm9yY2UnLCAnZnJ1Y2h0ZXJtYW4nXTsgLy8gaWYgaXQgaXMgZm9yY2UgbGF5b3V0LCBvbmx5IGNlbnRlciB0YWtlcyBlZmZlY3QsIGFuZCBhc3NpZ24gY2VudGVyIGZvcmNlXG5cbiAgICAgIGlmIChmb3JjZVR5cGVzLmluY2x1ZGVzKGNmZy50eXBlKSB8fCAhY2ZnLnR5cGUgJiYgZm9yY2VUeXBlcy5pbmNsdWRlcyhsYXlvdXRDb250cm9sbGVyID09PSBudWxsIHx8IGxheW91dENvbnRyb2xsZXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxheW91dENvbnRyb2xsZXIubGF5b3V0VHlwZSkpIHtcbiAgICAgICAgY2ZnLmNlbnRlciA9IFt0b1BvaW50XzEueCwgdG9Qb2ludF8xLnldO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5vbmNlKCdhZnRlcmxheW91dCcsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgdmFyIG1hdHJpeCA9IF90aGlzLmdldEdyb3VwKCkuZ2V0TWF0cml4KCkgfHwgWzEsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDFdO1xuICAgICAgICAgIHRvUG9pbnRfMS54ID0gdG9Qb2ludF8xLnggKiBtYXRyaXhbMF0gKyBtYXRyaXhbNl07XG4gICAgICAgICAgdG9Qb2ludF8xLnkgPSB0b1BvaW50XzEueSAqIG1hdHJpeFswXSArIG1hdHJpeFs3XTtcblxuICAgICAgICAgIHZhciBfYSA9IF90aGlzLmdldEdyb3VwKCkuZ2V0Q2FudmFzQkJveCgpLFxuICAgICAgICAgICAgICBtaW5YID0gX2EubWluWCxcbiAgICAgICAgICAgICAgbWF4WCA9IF9hLm1heFgsXG4gICAgICAgICAgICAgIG1pblkgPSBfYS5taW5ZLFxuICAgICAgICAgICAgICBtYXhZID0gX2EubWF4WTtcblxuICAgICAgICAgIHZhciBiYm94UG9pbnQgPSB7XG4gICAgICAgICAgICB4OiAobWluWCArIG1heFgpIC8gMixcbiAgICAgICAgICAgIHk6IChtaW5ZICsgbWF4WSkgLyAyXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGlmIChhbGlnbiA9PT0gJ2JlZ2luJykge1xuICAgICAgICAgICAgYmJveFBvaW50LnggPSBtaW5YO1xuICAgICAgICAgICAgYmJveFBvaW50LnkgPSBtaW5ZO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIF90aGlzLnRyYW5zbGF0ZSh0b1BvaW50XzEueCAtIGJib3hQb2ludC54LCB0b1BvaW50XzEueSAtIGJib3hQb2ludC55KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIG9yaUxheW91dENmZyA9IHRoaXMuZ2V0KCdsYXlvdXQnKTtcbiAgICB2YXIgbGF5b3V0Q2ZnID0ge307XG4gICAgT2JqZWN0LmFzc2lnbihsYXlvdXRDZmcsIG9yaUxheW91dENmZywgY2ZnKTtcbiAgICB0aGlzLnNldCgnbGF5b3V0JywgbGF5b3V0Q2ZnKTtcblxuICAgIGlmIChsYXlvdXRDb250cm9sbGVyLmlzTGF5b3V0VHlwZVNhbWUobGF5b3V0Q2ZnKSAmJiBsYXlvdXRDZmcuZ3B1RW5hYmxlZCA9PT0gb3JpTGF5b3V0Q2ZnLmdwdUVuYWJsZWQpIHtcbiAgICAgIC8vIG5vIHR5cGUgb3Igc2FtZSB0eXBlLCBvciBzd2l0Y2ggdGhlIGdwdSBhbmQgY3B1LCB1cGRhdGUgbGF5b3V0XG4gICAgICBsYXlvdXRDb250cm9sbGVyLnVwZGF0ZUxheW91dENmZyhsYXlvdXRDZmcpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBoYXMgZGlmZmVyZW50IHR5cGUsIGNoYW5nZSBsYXlvdXRcbiAgICAgIGxheW91dENvbnRyb2xsZXIuY2hhbmdlTGF5b3V0KGxheW91dENmZyk7XG4gICAgfVxuICB9O1xuICAvKipcbiAgICog6ZSA5q+B5biD5bGA77yMY2hhbmdlRGF0YSDml7bkuI3kvJrlho3kvb/nlKjljp/mnaXnmoTluIPlsYDmlrnms5Xlr7nmlrDmlbDmja7ov5vooYzluIPlsYBcbiAgICovXG5cblxuICBBYnN0cmFjdEdyYXBoLnByb3RvdHlwZS5kZXN0cm95TGF5b3V0ID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBsYXlvdXRDb250cm9sbGVyID0gdGhpcy5nZXQoJ2xheW91dENvbnRyb2xsZXInKTtcbiAgICBsYXlvdXRDb250cm9sbGVyLmRlc3Ryb3lMYXlvdXQoKTtcbiAgfTtcbiAgLyoqXG4gICAqIOmHjeaWsOS7peW9k+WJjeekuuS+i+S4remFjee9rueahOWxnuaAp+i/m+ihjOS4gOasoeW4g+WxgFxuICAgKi9cblxuXG4gIEFic3RyYWN0R3JhcGgucHJvdG90eXBlLmxheW91dCA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgbGF5b3V0Q29udHJvbGxlciA9IHRoaXMuZ2V0KCdsYXlvdXRDb250cm9sbGVyJyk7XG4gICAgdmFyIGxheW91dENmZyA9IHRoaXMuZ2V0KCdsYXlvdXQnKTtcbiAgICBpZiAoIWxheW91dENmZyB8fCAhbGF5b3V0Q29udHJvbGxlcikgcmV0dXJuO1xuXG4gICAgaWYgKGxheW91dENmZy53b3JrZXJFbmFibGVkKSB7XG4gICAgICAvLyDlpoLmnpzkvb/nlKh3ZWIgd29ya2Vy5biD5bGAXG4gICAgICBsYXlvdXRDb250cm9sbGVyLmxheW91dCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChsYXlvdXRDb250cm9sbGVyLmxheW91dE1ldGhvZCkge1xuICAgICAgbGF5b3V0Q29udHJvbGxlci5yZWxheW91dCh0cnVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGF5b3V0Q29udHJvbGxlci5sYXlvdXQoKTtcbiAgICB9XG4gIH07XG4gIC8qKlxuICAgKiDmlLbotbfmjIflrprnmoQgY29tYm9cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBJQ29tYm99IGNvbWJvIGNvbWJvIElEIOaIliBjb21ibyBpdGVtXG4gICAqL1xuXG5cbiAgQWJzdHJhY3RHcmFwaC5wcm90b3R5cGUuY29sbGFwc2VDb21ibyA9IGZ1bmN0aW9uIChjb21ibykge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICBpZiAoaXNTdHJpbmcoY29tYm8pKSB7XG4gICAgICBjb21ibyA9IHRoaXMuZmluZEJ5SWQoY29tYm8pO1xuICAgIH1cblxuICAgIGlmICghY29tYm8pIHtcbiAgICAgIGNvbnNvbGUud2FybignVGhlIGNvbWJvIHRvIGJlIGNvbGxhcHNlZCBkb2VzIG5vdCBleGlzdCEnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmVtaXQoJ2JlZm9yZWNvbGxhcHNlZXhwYW5kY29tYm8nLCB7XG4gICAgICBhY3Rpb246ICdleHBhbmQnLFxuICAgICAgaXRlbTogY29tYm9cbiAgICB9KTtcbiAgICB2YXIgY29tYm9Nb2RlbCA9IGNvbWJvLmdldE1vZGVsKCk7XG4gICAgdmFyIGl0ZW1Db250cm9sbGVyID0gdGhpcy5nZXQoJ2l0ZW1Db250cm9sbGVyJyk7XG4gICAgaXRlbUNvbnRyb2xsZXIuY29sbGFwc2VDb21ibyhjb21ibyk7XG4gICAgY29tYm9Nb2RlbC5jb2xsYXBzZWQgPSB0cnVlOyAvLyBhZGQgdmlydHVhbCBlZGdlc1xuXG4gICAgdmFyIGVkZ2VzID0gdGhpcy5nZXRFZGdlcygpLmNvbmNhdCh0aGlzLmdldCgndmVkZ2VzJykpOyAvLyBmaW5kIGFsbCB0aGUgZGVzY2VuZGFudCBub2RlcyBhbmQgY29tYm9zXG5cbiAgICB2YXIgY25vZGVzID0gW107XG4gICAgdmFyIGNjb21ib3MgPSBbXTtcbiAgICB2YXIgY29tYm9UcmVlcyA9IHRoaXMuZ2V0KCdjb21ib1RyZWVzJyk7XG4gICAgdmFyIGZvdW5kID0gZmFsc2U7XG4gICAgKGNvbWJvVHJlZXMgfHwgW10pLmZvckVhY2goZnVuY3Rpb24gKGN0cmVlKSB7XG4gICAgICBpZiAoZm91bmQpIHJldHVybjsgLy8gaWYgdGhlIGNvbWJvIGlzIGZvdW5kLCB0ZXJtaW5hdGUgdGhlIGZvckVhY2hcblxuICAgICAgdHJhdmVyc2VUcmVlKGN0cmVlLCBmdW5jdGlvbiAoc3ViVHJlZSkge1xuICAgICAgICAvLyBpZiB0aGUgY29tYm8gaXMgZm91bmQgYW5kIGl0IGlzIHRyYXZlcnNpbmcgdGhlIG90aGVyIGJyYW5jaGVzLCB0ZXJtaW5hdGVcbiAgICAgICAgaWYgKGZvdW5kICYmIHN1YlRyZWUuZGVwdGggPD0gY29tYm9Nb2RlbC5kZXB0aCkgcmV0dXJuIGZhbHNlOyAvLyBpZiB0aGUgY29tYm8gaXMgZm91bmRcblxuICAgICAgICBpZiAoY29tYm9Nb2RlbC5pZCA9PT0gc3ViVHJlZS5pZCkgZm91bmQgPSB0cnVlO1xuXG4gICAgICAgIGlmIChmb3VuZCkge1xuICAgICAgICAgIC8vIGlmIHRoZSBjb21ibyBpcyBmb3VuZCwgY29uY2F0IHRoZSBkZXNjZW5kYW50IG5vZGVzIGFuZCBjb21ib3NcbiAgICAgICAgICB2YXIgaXRlbSA9IF90aGlzLmZpbmRCeUlkKHN1YlRyZWUuaWQpO1xuXG4gICAgICAgICAgaWYgKGl0ZW0gJiYgaXRlbS5nZXRUeXBlICYmIGl0ZW0uZ2V0VHlwZSgpID09PSAnY29tYm8nKSB7XG4gICAgICAgICAgICBjbm9kZXMgPSBjbm9kZXMuY29uY2F0KGl0ZW0uZ2V0Tm9kZXMoKSk7XG4gICAgICAgICAgICBjY29tYm9zID0gY2NvbWJvcy5jb25jYXQoaXRlbS5nZXRDb21ib3MoKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICB2YXIgZWRnZVdlaWdodE1hcCA9IHt9O1xuICAgIHZhciBhZGRlZFZFZGdlcyA9IFtdO1xuICAgIGVkZ2VzLmZvckVhY2goZnVuY3Rpb24gKGVkZ2UpIHtcbiAgICAgIGlmIChlZGdlLmlzVmlzaWJsZSgpICYmICFlZGdlLmdldE1vZGVsKCkuaXNWRWRnZSkgcmV0dXJuO1xuICAgICAgdmFyIHNvdXJjZSA9IGVkZ2UuZ2V0U291cmNlKCk7XG4gICAgICB2YXIgdGFyZ2V0ID0gZWRnZS5nZXRUYXJnZXQoKTtcblxuICAgICAgaWYgKChjbm9kZXMuaW5jbHVkZXMoc291cmNlKSB8fCBjY29tYm9zLmluY2x1ZGVzKHNvdXJjZSkpICYmICFjbm9kZXMuaW5jbHVkZXModGFyZ2V0KSAmJiAhY2NvbWJvcy5pbmNsdWRlcyh0YXJnZXQpIHx8IHNvdXJjZS5nZXRNb2RlbCgpLmlkID09PSBjb21ib01vZGVsLmlkKSB7XG4gICAgICAgIHZhciBlZGdlTW9kZWwgPSBlZGdlLmdldE1vZGVsKCk7XG5cbiAgICAgICAgaWYgKGVkZ2VNb2RlbC5pc1ZFZGdlKSB7XG4gICAgICAgICAgX3RoaXMucmVtb3ZlSXRlbShlZGdlLCBmYWxzZSk7XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgdGFyZ2V0TW9kZWwgPSB0YXJnZXQuZ2V0TW9kZWwoKTtcblxuICAgICAgICB3aGlsZSAoIXRhcmdldC5pc1Zpc2libGUoKSkge1xuICAgICAgICAgIHRhcmdldCA9IF90aGlzLmZpbmRCeUlkKHRhcmdldE1vZGVsLnBhcmVudElkIHx8IHRhcmdldE1vZGVsLmNvbWJvSWQpO1xuICAgICAgICAgIGlmICghdGFyZ2V0IHx8ICF0YXJnZXRNb2RlbC5wYXJlbnRJZCAmJiAhdGFyZ2V0TW9kZWwuY29tYm9JZCkgcmV0dXJuOyAvLyBhbGwgdGhlIGFuY2VzdG9ycyBhcmUgaGlkZGVuLCB0aGVuIGlnbm9yZSB0aGUgZWRnZVxuXG4gICAgICAgICAgdGFyZ2V0TW9kZWwgPSB0YXJnZXQuZ2V0TW9kZWwoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB0YXJnZXRJZCA9IHRhcmdldE1vZGVsLmlkO1xuXG4gICAgICAgIGlmIChlZGdlV2VpZ2h0TWFwW2NvbWJvTW9kZWwuaWQgKyBcIi1cIiArIHRhcmdldElkXSkge1xuICAgICAgICAgIGVkZ2VXZWlnaHRNYXBbY29tYm9Nb2RlbC5pZCArIFwiLVwiICsgdGFyZ2V0SWRdICs9IGVkZ2VNb2RlbC5zaXplIHx8IDE7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IC8vIHRoZSBzb3VyY2UgaXMgaW4gdGhlIGNvbWJvLCB0aGUgdGFyZ2V0IGlzIG5vdFxuXG5cbiAgICAgICAgdmFyIHZlZGdlID0gX3RoaXMuYWRkSXRlbSgndmVkZ2UnLCB7XG4gICAgICAgICAgc291cmNlOiBjb21ib01vZGVsLmlkLFxuICAgICAgICAgIHRhcmdldDogdGFyZ2V0SWQsXG4gICAgICAgICAgaXNWRWRnZTogdHJ1ZVxuICAgICAgICB9LCBmYWxzZSk7XG5cbiAgICAgICAgZWRnZVdlaWdodE1hcFtjb21ib01vZGVsLmlkICsgXCItXCIgKyB0YXJnZXRJZF0gPSBlZGdlTW9kZWwuc2l6ZSB8fCAxO1xuICAgICAgICBhZGRlZFZFZGdlcy5wdXNoKHZlZGdlKTtcbiAgICAgIH0gZWxzZSBpZiAoIWNub2Rlcy5pbmNsdWRlcyhzb3VyY2UpICYmICFjY29tYm9zLmluY2x1ZGVzKHNvdXJjZSkgJiYgKGNub2Rlcy5pbmNsdWRlcyh0YXJnZXQpIHx8IGNjb21ib3MuaW5jbHVkZXModGFyZ2V0KSkgfHwgdGFyZ2V0LmdldE1vZGVsKCkuaWQgPT09IGNvbWJvTW9kZWwuaWQpIHtcbiAgICAgICAgdmFyIGVkZ2VNb2RlbCA9IGVkZ2UuZ2V0TW9kZWwoKTtcblxuICAgICAgICBpZiAoZWRnZU1vZGVsLmlzVkVkZ2UpIHtcbiAgICAgICAgICBfdGhpcy5yZW1vdmVJdGVtKGVkZ2UsIGZhbHNlKTtcblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBzb3VyY2VNb2RlbCA9IHNvdXJjZS5nZXRNb2RlbCgpO1xuXG4gICAgICAgIHdoaWxlICghc291cmNlLmlzVmlzaWJsZSgpKSB7XG4gICAgICAgICAgc291cmNlID0gX3RoaXMuZmluZEJ5SWQoc291cmNlTW9kZWwucGFyZW50SWQgfHwgc291cmNlTW9kZWwuY29tYm9JZCk7XG4gICAgICAgICAgaWYgKCFzb3VyY2UgfHwgIXNvdXJjZU1vZGVsLnBhcmVudElkICYmICFzb3VyY2VNb2RlbC5jb21ib0lkKSByZXR1cm47IC8vIGFsbCB0aGUgYW5jZXN0b3JzIGFyZSBoaWRkZW4sIHRoZW4gaWdub3JlIHRoZSBlZGdlXG5cbiAgICAgICAgICBzb3VyY2VNb2RlbCA9IHNvdXJjZS5nZXRNb2RlbCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHNvdXJjZUlkID0gc291cmNlTW9kZWwuaWQ7XG5cbiAgICAgICAgaWYgKGVkZ2VXZWlnaHRNYXBbc291cmNlSWQgKyBcIi1cIiArIGNvbWJvTW9kZWwuaWRdKSB7XG4gICAgICAgICAgZWRnZVdlaWdodE1hcFtzb3VyY2VJZCArIFwiLVwiICsgY29tYm9Nb2RlbC5pZF0gKz0gZWRnZU1vZGVsLnNpemUgfHwgMTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gLy8gdGhlIHRhcmdldCBpcyBpbiB0aGUgY29tYm8sIHRoZSBzb3VyY2UgaXMgbm90XG5cblxuICAgICAgICB2YXIgdmVkZ2UgPSBfdGhpcy5hZGRJdGVtKCd2ZWRnZScsIHtcbiAgICAgICAgICB0YXJnZXQ6IGNvbWJvTW9kZWwuaWQsXG4gICAgICAgICAgc291cmNlOiBzb3VyY2VJZCxcbiAgICAgICAgICBpc1ZFZGdlOiB0cnVlXG4gICAgICAgIH0sIGZhbHNlKTtcblxuICAgICAgICBlZGdlV2VpZ2h0TWFwW3NvdXJjZUlkICsgXCItXCIgKyBjb21ib01vZGVsLmlkXSA9IGVkZ2VNb2RlbC5zaXplIHx8IDE7XG4gICAgICAgIGFkZGVkVkVkZ2VzLnB1c2godmVkZ2UpO1xuICAgICAgfVxuICAgIH0pOyAvLyB1cGRhdGUgdGhlIHdpZHRoIG9mIHRoZSB2aXJ0dWFsIGVkZ2VzLCB3aGljaCBpcyB0aGUgc3VtIG9mIG1lcmdlZCBhY3R1YWwgZWRnZXNcbiAgICAvLyBiZSBhdHRlbnRpb24gdGhhdCB0aGUgYWN0dWFsIGVkZ2VzIHdpdGggc2FtZSBlbmRwb2ludHMgYnV0IGRpZmZlcmVudCBkaXJlY3Rpb25zIHdpbGwgYmUgcmVwcmVzZW50ZWQgYnkgdHdvIGRpZmZlcmVudCB2aXJ0dWFsIGVkZ2VzXG5cbiAgICBhZGRlZFZFZGdlcy5mb3JFYWNoKGZ1bmN0aW9uICh2ZWRnZSkge1xuICAgICAgdmFyIHZlZGdlTW9kZWwgPSB2ZWRnZS5nZXRNb2RlbCgpO1xuXG4gICAgICBfdGhpcy51cGRhdGVJdGVtKHZlZGdlLCB7XG4gICAgICAgIHNpemU6IGVkZ2VXZWlnaHRNYXBbdmVkZ2VNb2RlbC5zb3VyY2UgKyBcIi1cIiArIHZlZGdlTW9kZWwudGFyZ2V0XVxuICAgICAgfSwgZmFsc2UpO1xuICAgIH0pO1xuICAgIHRoaXMuZW1pdCgnYWZ0ZXJjb2xsYXBzZWV4cGFuZGNvbWJvJywge1xuICAgICAgYWN0aW9uOiAnY29sbGFwc2UnLFxuICAgICAgaXRlbTogY29tYm9cbiAgICB9KTtcbiAgfTtcbiAgLyoqXG4gICAqIOWxleW8gOaMh+WumueahCBjb21ib1xuICAgKiBAcGFyYW0ge3N0cmluZyB8IElDb21ib30gY29tYm8gY29tYm8gSUQg5oiWIGNvbWJvIGl0ZW1cbiAgICovXG5cblxuICBBYnN0cmFjdEdyYXBoLnByb3RvdHlwZS5leHBhbmRDb21ibyA9IGZ1bmN0aW9uIChjb21ibykge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICBpZiAoaXNTdHJpbmcoY29tYm8pKSB7XG4gICAgICBjb21ibyA9IHRoaXMuZmluZEJ5SWQoY29tYm8pO1xuICAgIH1cblxuICAgIGlmICghY29tYm8gfHwgY29tYm8uZ2V0VHlwZSAmJiBjb21iby5nZXRUeXBlKCkgIT09ICdjb21ibycpIHtcbiAgICAgIGNvbnNvbGUud2FybignVGhlIGNvbWJvIHRvIGJlIGNvbGxhcHNlZCBkb2VzIG5vdCBleGlzdCEnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmVtaXQoJ2JlZm9yZWNvbGxhcHNlZXhwYW5kY29tYm8nLCB7XG4gICAgICBhY3Rpb246ICdleHBhbmQnLFxuICAgICAgaXRlbTogY29tYm9cbiAgICB9KTtcbiAgICB2YXIgY29tYm9Nb2RlbCA9IGNvbWJvLmdldE1vZGVsKCk7XG4gICAgdmFyIGl0ZW1Db250cm9sbGVyID0gdGhpcy5nZXQoJ2l0ZW1Db250cm9sbGVyJyk7XG4gICAgaXRlbUNvbnRyb2xsZXIuZXhwYW5kQ29tYm8oY29tYm8pO1xuICAgIGNvbWJvTW9kZWwuY29sbGFwc2VkID0gZmFsc2U7IC8vIGFkZCB2aXJ0dWFsIGVkZ2VzXG5cbiAgICB2YXIgZWRnZXMgPSB0aGlzLmdldEVkZ2VzKCkuY29uY2F0KHRoaXMuZ2V0KCd2ZWRnZXMnKSk7IC8vIGZpbmQgYWxsIHRoZSBkZXNjZW5kYW50IG5vZGVzIGFuZCBjb21ib3NcblxuICAgIHZhciBjbm9kZXMgPSBbXTtcbiAgICB2YXIgY2NvbWJvcyA9IFtdO1xuICAgIHZhciBjb21ib1RyZWVzID0gdGhpcy5nZXQoJ2NvbWJvVHJlZXMnKTtcbiAgICB2YXIgZm91bmQgPSBmYWxzZTtcbiAgICAoY29tYm9UcmVlcyB8fCBbXSkuZm9yRWFjaChmdW5jdGlvbiAoY3RyZWUpIHtcbiAgICAgIGlmIChmb3VuZCkgcmV0dXJuOyAvLyBpZiB0aGUgY29tYm8gaXMgZm91bmQsIHRlcm1pbmF0ZVxuXG4gICAgICB0cmF2ZXJzZVRyZWUoY3RyZWUsIGZ1bmN0aW9uIChzdWJUcmVlKSB7XG4gICAgICAgIC8vIGlmIHRoZSBjb21ibyBpcyBmb3VuZCBhbmQgaXQgaXMgdHJhdmVyc2luZyB0aGUgb3RoZXIgYnJhbmNoZXMsIHRlcm1pbmF0ZVxuICAgICAgICBpZiAoZm91bmQgJiYgc3ViVHJlZS5kZXB0aCA8PSBjb21ib01vZGVsLmRlcHRoKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChjb21ib01vZGVsLmlkID09PSBzdWJUcmVlLmlkKSBmb3VuZCA9IHRydWU7XG5cbiAgICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgICAgdmFyIGl0ZW0gPSBfdGhpcy5maW5kQnlJZChzdWJUcmVlLmlkKTtcblxuICAgICAgICAgIGlmIChpdGVtICYmIGl0ZW0uZ2V0VHlwZSAmJiBpdGVtLmdldFR5cGUoKSA9PT0gJ2NvbWJvJykge1xuICAgICAgICAgICAgY25vZGVzID0gY25vZGVzLmNvbmNhdChpdGVtLmdldE5vZGVzKCkpO1xuICAgICAgICAgICAgY2NvbWJvcyA9IGNjb21ib3MuY29uY2F0KGl0ZW0uZ2V0Q29tYm9zKCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgdmFyIGVkZ2VXZWlnaHRNYXAgPSB7fTtcbiAgICB2YXIgYWRkZWRWRWRnZXMgPSB7fTtcbiAgICBlZGdlcy5mb3JFYWNoKGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgICBpZiAoZWRnZS5pc1Zpc2libGUoKSAmJiAhZWRnZS5nZXRNb2RlbCgpLmlzVkVkZ2UpIHJldHVybjtcbiAgICAgIHZhciBzb3VyY2UgPSBlZGdlLmdldFNvdXJjZSgpO1xuICAgICAgdmFyIHRhcmdldCA9IGVkZ2UuZ2V0VGFyZ2V0KCk7XG4gICAgICB2YXIgc291cmNlSWQgPSBzb3VyY2UuZ2V0KCdpZCcpO1xuICAgICAgdmFyIHRhcmdldElkID0gdGFyZ2V0LmdldCgnaWQnKTtcblxuICAgICAgaWYgKChjbm9kZXMuaW5jbHVkZXMoc291cmNlKSB8fCBjY29tYm9zLmluY2x1ZGVzKHNvdXJjZSkpICYmICFjbm9kZXMuaW5jbHVkZXModGFyZ2V0KSAmJiAhY2NvbWJvcy5pbmNsdWRlcyh0YXJnZXQpIHx8IHNvdXJjZUlkID09PSBjb21ib01vZGVsLmlkKSB7XG4gICAgICAgIC8vIHRoZSBzb3VyY2UgaXMgaW4gdGhlIGNvbWJvLCB0aGUgdGFyZ2V0IGlzIG5vdFxuICAgICAgICAvLyBpZ25vcmUgdGhlIHZpcnR1YWwgZWRnZXNcbiAgICAgICAgaWYgKGVkZ2UuZ2V0TW9kZWwoKS5pc1ZFZGdlKSB7XG4gICAgICAgICAgX3RoaXMucmVtb3ZlSXRlbShlZGdlLCBmYWxzZSk7XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgdGFyZ2V0TW9kZWwgPSB0YXJnZXQuZ2V0TW9kZWwoKTsgLy8gZmluZCB0aGUgbmVhcmVzdCB2aXNpYmxlIGFuY2VzdG9yXG5cbiAgICAgICAgd2hpbGUgKCF0YXJnZXQuaXNWaXNpYmxlKCkpIHtcbiAgICAgICAgICB0YXJnZXQgPSBfdGhpcy5maW5kQnlJZCh0YXJnZXRNb2RlbC5jb21ib0lkIHx8IHRhcmdldE1vZGVsLnBhcmVudElkKTtcblxuICAgICAgICAgIGlmICghdGFyZ2V0IHx8ICF0YXJnZXRNb2RlbC5wYXJlbnRJZCAmJiAhdGFyZ2V0TW9kZWwuY29tYm9JZCkge1xuICAgICAgICAgICAgcmV0dXJuOyAvLyBpZiBhbGwgdGhlIGFuY2VzdG9ycyBvZiB0aGUgb3Bwc2l0ZSBhcmUgYWxsIGhpZGRlbiwgaWdub3JlIHRoZSBlZGdlXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGFyZ2V0TW9kZWwgPSB0YXJnZXQuZ2V0TW9kZWwoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRhcmdldElkID0gdGFyZ2V0TW9kZWwuaWQ7XG4gICAgICAgIHZhciBzb3VyY2VNb2RlbCA9IHNvdXJjZS5nZXRNb2RlbCgpOyAvLyBmaW5kIHRoZSBuZWFyZXN0IHZpc2libGUgYW5jZXN0b3JcblxuICAgICAgICB3aGlsZSAoIXNvdXJjZS5pc1Zpc2libGUoKSkge1xuICAgICAgICAgIHNvdXJjZSA9IF90aGlzLmZpbmRCeUlkKHNvdXJjZU1vZGVsLmNvbWJvSWQgfHwgc291cmNlTW9kZWwucGFyZW50SWQpO1xuXG4gICAgICAgICAgaWYgKCFzb3VyY2UgfHwgIXNvdXJjZU1vZGVsLnBhcmVudElkICYmICFzb3VyY2VNb2RlbC5jb21ib0lkKSB7XG4gICAgICAgICAgICByZXR1cm47IC8vIGlmIGFsbCB0aGUgYW5jZXN0b3JzIG9mIHRoZSBvcHBzaXRlIGFyZSBhbGwgaGlkZGVuLCBpZ25vcmUgdGhlIGVkZ2VcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoc291cmNlTW9kZWwuY29tYm9JZCA9PT0gY29tYm9Nb2RlbC5pZCB8fCBzb3VyY2VNb2RlbC5wYXJlbnRJZCA9PT0gY29tYm9Nb2RlbC5pZCkge1xuICAgICAgICAgICAgYnJlYWs7IC8vIGlmIHRoZSBuZXh0IGFuY2VzdG9yIGlzIHRoZSBjb21ibywgYnJlYWsgdGhlIHdoaWxlXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc291cmNlTW9kZWwgPSBzb3VyY2UuZ2V0TW9kZWwoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNvdXJjZUlkID0gc291cmNlTW9kZWwuaWQ7XG5cbiAgICAgICAgaWYgKHRhcmdldElkKSB7XG4gICAgICAgICAgdmFyIHZlZGdlSWQgPSBzb3VyY2VJZCArIFwiLVwiICsgdGFyZ2V0SWQ7IC8vIHVwZGF0ZSB0aGUgd2lkdGggb2YgdGhlIHZpcnR1YWwgZWRnZXMsIHdoaWNoIGlzIHRoZSBzdW0gb2YgbWVyZ2VkIGFjdHVhbCBlZGdlc1xuICAgICAgICAgIC8vIGJlIGF0dGVudGlvbiB0aGF0IHRoZSBhY3R1YWwgZWRnZXMgd2l0aCBzYW1lIGVuZHBvaW50cyBidXQgZGlmZmVyZW50IGRpcmVjdGlvbnMgd2lsbCBiZSByZXByZXNlbnRlZCBieSB0d28gZGlmZmVyZW50IHZpcnR1YWwgZWRnZXNcblxuICAgICAgICAgIGlmIChlZGdlV2VpZ2h0TWFwW3ZlZGdlSWRdKSB7XG4gICAgICAgICAgICBlZGdlV2VpZ2h0TWFwW3ZlZGdlSWRdICs9IGVkZ2UuZ2V0TW9kZWwoKS5zaXplIHx8IDE7XG5cbiAgICAgICAgICAgIF90aGlzLnVwZGF0ZUl0ZW0oYWRkZWRWRWRnZXNbdmVkZ2VJZF0sIHtcbiAgICAgICAgICAgICAgc2l6ZTogZWRnZVdlaWdodE1hcFt2ZWRnZUlkXVxuICAgICAgICAgICAgfSwgZmFsc2UpO1xuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIHZlZGdlID0gX3RoaXMuYWRkSXRlbSgndmVkZ2UnLCB7XG4gICAgICAgICAgICBzb3VyY2U6IHNvdXJjZUlkLFxuICAgICAgICAgICAgdGFyZ2V0OiB0YXJnZXRJZCxcbiAgICAgICAgICAgIGlzVkVkZ2U6IHRydWVcbiAgICAgICAgICB9LCBmYWxzZSk7XG5cbiAgICAgICAgICBlZGdlV2VpZ2h0TWFwW3ZlZGdlSWRdID0gZWRnZS5nZXRNb2RlbCgpLnNpemUgfHwgMTtcbiAgICAgICAgICBhZGRlZFZFZGdlc1t2ZWRnZUlkXSA9IHZlZGdlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKCFjbm9kZXMuaW5jbHVkZXMoc291cmNlKSAmJiAhY2NvbWJvcy5pbmNsdWRlcyhzb3VyY2UpICYmIChjbm9kZXMuaW5jbHVkZXModGFyZ2V0KSB8fCBjY29tYm9zLmluY2x1ZGVzKHRhcmdldCkpIHx8IHRhcmdldElkID09PSBjb21ib01vZGVsLmlkKSB7XG4gICAgICAgIC8vIHRoZSB0YXJnZXQgaXMgaW4gdGhlIGNvbWJvLCB0aGUgc291cmNlIGlzIG5vdFxuICAgICAgICAvLyBpZ25vcmUgdGhlIHZpcnR1YWwgZWRnZXNcbiAgICAgICAgaWYgKGVkZ2UuZ2V0TW9kZWwoKS5pc1ZFZGdlKSB7XG4gICAgICAgICAgX3RoaXMucmVtb3ZlSXRlbShlZGdlLCBmYWxzZSk7XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgc291cmNlTW9kZWwgPSBzb3VyY2UuZ2V0TW9kZWwoKTsgLy8gZmluZCB0aGUgbmVhcmVzdCB2aXNpYmxlIGFuY2VzdG9yXG5cbiAgICAgICAgd2hpbGUgKCFzb3VyY2UuaXNWaXNpYmxlKCkpIHtcbiAgICAgICAgICBzb3VyY2UgPSBfdGhpcy5maW5kQnlJZChzb3VyY2VNb2RlbC5jb21ib0lkIHx8IHNvdXJjZU1vZGVsLnBhcmVudElkKTtcblxuICAgICAgICAgIGlmICghc291cmNlIHx8ICFzb3VyY2VNb2RlbC5wYXJlbnRJZCAmJiAhc291cmNlTW9kZWwuY29tYm9JZCkge1xuICAgICAgICAgICAgcmV0dXJuOyAvLyBpZiBhbGwgdGhlIGFuY2VzdG9ycyBvZiB0aGUgb3Bwc2l0ZSBhcmUgYWxsIGhpZGRlbiwgaWdub3JlIHRoZSBlZGdlXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc291cmNlTW9kZWwgPSBzb3VyY2UuZ2V0TW9kZWwoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNvdXJjZUlkID0gc291cmNlTW9kZWwuaWQ7XG4gICAgICAgIHZhciB0YXJnZXRNb2RlbCA9IHRhcmdldC5nZXRNb2RlbCgpOyAvLyBmaW5kIHRoZSBuZWFyZXN0IHZpc2libGUgYW5jZXN0b3JcblxuICAgICAgICB3aGlsZSAoIXRhcmdldC5pc1Zpc2libGUoKSkge1xuICAgICAgICAgIHRhcmdldCA9IF90aGlzLmZpbmRCeUlkKHRhcmdldE1vZGVsLmNvbWJvSWQgfHwgdGFyZ2V0TW9kZWwucGFyZW50SWQpO1xuXG4gICAgICAgICAgaWYgKCF0YXJnZXQgfHwgIXRhcmdldE1vZGVsLnBhcmVudElkICYmICF0YXJnZXRNb2RlbC5jb21ib0lkKSB7XG4gICAgICAgICAgICByZXR1cm47IC8vIGlmIGFsbCB0aGUgYW5jZXN0b3JzIG9mIHRoZSBvcHBzaXRlIGFyZSBhbGwgaGlkZGVuLCBpZ25vcmUgdGhlIGVkZ2VcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodGFyZ2V0TW9kZWwuY29tYm9JZCA9PT0gY29tYm9Nb2RlbC5pZCB8fCB0YXJnZXRNb2RlbC5wYXJlbnRJZCA9PT0gY29tYm9Nb2RlbC5pZCkge1xuICAgICAgICAgICAgYnJlYWs7IC8vIGlmIHRoZSBuZXh0IGFuY2VzdG9yIGlzIHRoZSBjb21ibywgYnJlYWsgdGhlIHdoaWxlXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGFyZ2V0TW9kZWwgPSB0YXJnZXQuZ2V0TW9kZWwoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRhcmdldElkID0gdGFyZ2V0TW9kZWwuaWQ7XG5cbiAgICAgICAgaWYgKHNvdXJjZUlkKSB7XG4gICAgICAgICAgdmFyIHZlZGdlSWQgPSBzb3VyY2VJZCArIFwiLVwiICsgdGFyZ2V0SWQ7IC8vIHVwZGF0ZSB0aGUgd2lkdGggb2YgdGhlIHZpcnR1YWwgZWRnZXMsIHdoaWNoIGlzIHRoZSBzdW0gb2YgbWVyZ2VkIGFjdHVhbCBlZGdlc1xuICAgICAgICAgIC8vIGJlIGF0dGVudGlvbiB0aGF0IHRoZSBhY3R1YWwgZWRnZXMgd2l0aCBzYW1lIGVuZHBvaW50cyBidXQgZGlmZmVyZW50IGRpcmVjdGlvbnMgd2lsbCBiZSByZXByZXNlbnRlZCBieSB0d28gZGlmZmVyZW50IHZpcnR1YWwgZWRnZXNcblxuICAgICAgICAgIGlmIChlZGdlV2VpZ2h0TWFwW3ZlZGdlSWRdKSB7XG4gICAgICAgICAgICBlZGdlV2VpZ2h0TWFwW3ZlZGdlSWRdICs9IGVkZ2UuZ2V0TW9kZWwoKS5zaXplIHx8IDE7XG5cbiAgICAgICAgICAgIF90aGlzLnVwZGF0ZUl0ZW0oYWRkZWRWRWRnZXNbdmVkZ2VJZF0sIHtcbiAgICAgICAgICAgICAgc2l6ZTogZWRnZVdlaWdodE1hcFt2ZWRnZUlkXVxuICAgICAgICAgICAgfSwgZmFsc2UpO1xuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIHZlZGdlID0gX3RoaXMuYWRkSXRlbSgndmVkZ2UnLCB7XG4gICAgICAgICAgICB0YXJnZXQ6IHRhcmdldElkLFxuICAgICAgICAgICAgc291cmNlOiBzb3VyY2VJZCxcbiAgICAgICAgICAgIGlzVkVkZ2U6IHRydWVcbiAgICAgICAgICB9LCBmYWxzZSk7XG5cbiAgICAgICAgICBlZGdlV2VpZ2h0TWFwW3ZlZGdlSWRdID0gZWRnZS5nZXRNb2RlbCgpLnNpemUgfHwgMTtcbiAgICAgICAgICBhZGRlZFZFZGdlc1t2ZWRnZUlkXSA9IHZlZGdlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKChjbm9kZXMuaW5jbHVkZXMoc291cmNlKSB8fCBjY29tYm9zLmluY2x1ZGVzKHNvdXJjZSkpICYmIChjbm9kZXMuaW5jbHVkZXModGFyZ2V0KSB8fCBjY29tYm9zLmluY2x1ZGVzKHRhcmdldCkpKSB7XG4gICAgICAgIC8vIGJvdGggc291cmNlIGFuZCB0YXJnZXQgYXJlIGluIHRoZSBjb21ibywgaWYgdGhlIHRhcmdldCBhbmQgc291cmNlIGFyZSBib3RoIHZpc2libGUsIHNob3cgdGhlIGVkZ2VcbiAgICAgICAgaWYgKHNvdXJjZS5pc1Zpc2libGUoKSAmJiB0YXJnZXQuaXNWaXNpYmxlKCkpIHtcbiAgICAgICAgICBlZGdlLnNob3coKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuZW1pdCgnYWZ0ZXJjb2xsYXBzZWV4cGFuZGNvbWJvJywge1xuICAgICAgYWN0aW9uOiAnZXhwYW5kJyxcbiAgICAgIGl0ZW06IGNvbWJvXG4gICAgfSk7XG4gIH07XG5cbiAgQWJzdHJhY3RHcmFwaC5wcm90b3R5cGUuY29sbGFwc2VFeHBhbmRDb21ibyA9IGZ1bmN0aW9uIChjb21ibykge1xuICAgIGlmIChpc1N0cmluZyhjb21ibykpIHtcbiAgICAgIGNvbWJvID0gdGhpcy5maW5kQnlJZChjb21ibyk7XG4gICAgfVxuXG4gICAgaWYgKCFjb21ibyB8fCBjb21iby5nZXRUeXBlICYmIGNvbWJvLmdldFR5cGUoKSAhPT0gJ2NvbWJvJykgcmV0dXJuO1xuICAgIHZhciBjb21ib01vZGVsID0gY29tYm8uZ2V0TW9kZWwoKTsgLy8gaWYgb25lIGFuY2VzdG9yIGNvbWJvIG9mIHRoZSBjb21ibyBpcyBjb2xsYXBzZWQsIGl0IHNob3VsZCBub3QgYmUgY29sbGFwc2VkIG9yIGV4cGFuZGVkXG5cbiAgICB2YXIgcGFyZW50SXRlbSA9IHRoaXMuZmluZEJ5SWQoY29tYm9Nb2RlbC5wYXJlbnRJZCk7XG5cbiAgICB3aGlsZSAocGFyZW50SXRlbSkge1xuICAgICAgdmFyIHBhcmVudE1vZGVsID0gcGFyZW50SXRlbS5nZXRNb2RlbCgpO1xuXG4gICAgICBpZiAocGFyZW50TW9kZWwuY29sbGFwc2VkKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcIkZhaWwgdG8gZXhwYW5kIHRoZSBjb21ibyBzaW5jZSBpdCdzIGFuY2VzdG9yIGNvbWJvIGlzIGNvbGxhcHNlZC5cIik7XG4gICAgICAgIHBhcmVudEl0ZW0gPSB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgcGFyZW50SXRlbSA9IHRoaXMuZmluZEJ5SWQocGFyZW50TW9kZWwucGFyZW50SWQpO1xuICAgIH1cblxuICAgIHZhciBjb2xsYXBzZWQgPSBjb21ib01vZGVsLmNvbGxhcHNlZDsgLy8g6K+l576k57uE5bey57uP5aSE5LqO5pS26LW354q25oCB77yM6ZyA6KaB5bGV5byAXG5cbiAgICBpZiAoY29sbGFwc2VkKSB7XG4gICAgICB0aGlzLmV4cGFuZENvbWJvKGNvbWJvKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb2xsYXBzZUNvbWJvKGNvbWJvKTtcbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZUNvbWJvKGNvbWJvKTtcbiAgfTtcbiAgLyoqXG4gICAqIOagueaNriBjb21ib1RyZWUg57uT5p6E5pW055CGIENvbWJvIOebuOWFs+eahOWbvuW9oue7mOWItuWxgue6p++8jOWMheaLrCBDb21ibyDmnKzouqvjgIHoioLngrnjgIHovrlcbiAgICogQHBhcmFtIHtHcmFwaERhdGF9IGRhdGEg5pWw5o2uXG4gICAqL1xuXG5cbiAgQWJzdHJhY3RHcmFwaC5wcm90b3R5cGUuc29ydENvbWJvcyA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdmFyIGNvbWJvU29ydGVkID0gdGhpcy5nZXQoJ2NvbWJvU29ydGVkJyk7XG4gICAgaWYgKGNvbWJvU29ydGVkKSByZXR1cm47XG4gICAgdGhpcy5zZXQoJ2NvbWJvU29ydGVkJywgdHJ1ZSk7XG4gICAgdmFyIGRlcHRoTWFwID0gW107XG4gICAgdmFyIGRhdGFEZXB0aE1hcCA9IHt9O1xuICAgIHZhciBjb21ib1RyZWVzID0gdGhpcy5nZXQoJ2NvbWJvVHJlZXMnKTtcbiAgICAoY29tYm9UcmVlcyB8fCBbXSkuZm9yRWFjaChmdW5jdGlvbiAoY1RyZWUpIHtcbiAgICAgIHRyYXZlcnNlVHJlZShjVHJlZSwgZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgIGlmIChkZXB0aE1hcFtjaGlsZC5kZXB0aF0pIGRlcHRoTWFwW2NoaWxkLmRlcHRoXS5wdXNoKGNoaWxkLmlkKTtlbHNlIGRlcHRoTWFwW2NoaWxkLmRlcHRoXSA9IFtjaGlsZC5pZF07XG4gICAgICAgIGRhdGFEZXB0aE1hcFtjaGlsZC5pZF0gPSBjaGlsZC5kZXB0aDtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICB2YXIgZWRnZXMgPSB0aGlzLmdldEVkZ2VzKCkuY29uY2F0KHRoaXMuZ2V0KCd2ZWRnZXMnKSk7XG4gICAgKGVkZ2VzIHx8IFtdKS5mb3JFYWNoKGZ1bmN0aW9uIChlZGdlSXRlbSkge1xuICAgICAgdmFyIGVkZ2UgPSBlZGdlSXRlbS5nZXRNb2RlbCgpO1xuICAgICAgdmFyIHNvdXJjZURlcHRoID0gZGF0YURlcHRoTWFwW2VkZ2Uuc291cmNlXSB8fCAwO1xuICAgICAgdmFyIHRhcmdldERlcHRoID0gZGF0YURlcHRoTWFwW2VkZ2UudGFyZ2V0XSB8fCAwO1xuICAgICAgdmFyIGRlcHRoID0gTWF0aC5tYXgoc291cmNlRGVwdGgsIHRhcmdldERlcHRoKTtcbiAgICAgIGlmIChkZXB0aE1hcFtkZXB0aF0pIGRlcHRoTWFwW2RlcHRoXS5wdXNoKGVkZ2UuaWQpO2Vsc2UgZGVwdGhNYXBbZGVwdGhdID0gW2VkZ2UuaWRdO1xuICAgIH0pO1xuICAgIGRlcHRoTWFwLmZvckVhY2goZnVuY3Rpb24gKGFycmF5KSB7XG4gICAgICBpZiAoIWFycmF5IHx8ICFhcnJheS5sZW5ndGgpIHJldHVybjtcblxuICAgICAgZm9yICh2YXIgaSA9IGFycmF5Lmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIHZhciBpdGVtID0gX3RoaXMuZmluZEJ5SWQoYXJyYXlbaV0pO1xuXG4gICAgICAgIGlmIChpdGVtKSBpdGVtLnRvRnJvbnQoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcbiAgLyoqXG4gICAqIOiOt+WPluiKgueCueaJgOacieeahOmCu+WxheiKgueCuVxuICAgKlxuICAgKiBAcGFyYW0geyhzdHJpbmcgfCBJTm9kZSl9IG5vZGUg6IqC54K5IElEIOaIluWunuS+i1xuICAgKiBAcmV0dXJucyB7SU5vZGVbXX1cbiAgICogQG1lbWJlcm9mIElBYnN0cmFjdEdyYXBoXG4gICAqL1xuXG5cbiAgQWJzdHJhY3RHcmFwaC5wcm90b3R5cGUuZ2V0TmVpZ2hib3JzID0gZnVuY3Rpb24gKG5vZGUsIHR5cGUpIHtcbiAgICB2YXIgaXRlbSA9IG5vZGU7XG5cbiAgICBpZiAoaXNTdHJpbmcobm9kZSkpIHtcbiAgICAgIGl0ZW0gPSB0aGlzLmZpbmRCeUlkKG5vZGUpO1xuICAgIH1cblxuICAgIHJldHVybiBpdGVtLmdldE5laWdoYm9ycyh0eXBlKTtcbiAgfTtcbiAgLyoqXG4gICAqIOiOt+WPliBub2RlIOeahOW6puaVsFxuICAgKlxuICAgKiBAcGFyYW0geyhzdHJpbmcgfCBJTm9kZSl9IG5vZGUg6IqC54K5IElEIOaIluWunuS+i1xuICAgKiBAcGFyYW0geygnaW4nIHwgJ291dCcgfCAndG90YWwnIHwgJ2FsbCcgfCB1bmRlZmluZWQpfSDluqbmlbDnsbvlnovvvIxpbiDlhaXluqbvvIxvdXQg5Ye65bqm77yMdG90YWwg5oC75bqm5pWw77yMYWxsIOi/lOWbnuS4ieenjeexu+Wei+W6puaVsOeahOWvueixoVxuICAgKiBAcmV0dXJucyB7TnVtYmVyIHwgT2JqZWN0fSDor6XoioLngrnnmoTluqbmlbBcbiAgICogQG1lbWJlcm9mIElBYnN0cmFjdEdyYXBoXG4gICAqL1xuXG5cbiAgQWJzdHJhY3RHcmFwaC5wcm90b3R5cGUuZ2V0Tm9kZURlZ3JlZSA9IGZ1bmN0aW9uIChub2RlLCB0eXBlLCByZWZyZXNoKSB7XG4gICAgaWYgKHR5cGUgPT09IHZvaWQgMCkge1xuICAgICAgdHlwZSA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAocmVmcmVzaCA9PT0gdm9pZCAwKSB7XG4gICAgICByZWZyZXNoID0gZmFsc2U7XG4gICAgfVxuXG4gICAgdmFyIGl0ZW0gPSBub2RlO1xuXG4gICAgaWYgKGlzU3RyaW5nKG5vZGUpKSB7XG4gICAgICBpdGVtID0gdGhpcy5maW5kQnlJZChub2RlKTtcbiAgICB9XG5cbiAgICB2YXIgZGVncmVlcyA9IHRoaXMuZ2V0KCdkZWdyZWVzJyk7XG5cbiAgICBpZiAoIWRlZ3JlZXMgfHwgcmVmcmVzaCkge1xuICAgICAgZGVncmVlcyA9IGdldERlZ3JlZSh0aGlzLnNhdmUoKSk7XG4gICAgICB0aGlzLnNldCgnZGVncmVlcycsIGRlZ3JlZXMpO1xuICAgIH1cblxuICAgIHZhciBub2RlRGVncmVlcyA9IGRlZ3JlZXNbaXRlbS5nZXRJRCgpXTtcbiAgICB2YXIgcmVzID0gMDsgLy8g5aaC5p6c5piv6YCa6L+HIGFkZEl0ZW0g5ZCO6Z2i5paw5aKe5Yqg55qE6IqC54K577yM5q2k5pe25a6D55qE5omA5pyJ5bqm5pWw6YO95Li6IDBcblxuICAgIGlmICghbm9kZURlZ3JlZXMpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSAnaW4nOlxuICAgICAgICByZXMgPSBub2RlRGVncmVlcy5pbkRlZ3JlZTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ291dCc6XG4gICAgICAgIHJlcyA9IG5vZGVEZWdyZWVzLm91dERlZ3JlZTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ2FsbCc6XG4gICAgICAgIHJlcyA9IG5vZGVEZWdyZWVzO1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmVzID0gbm9kZURlZ3JlZXMuZGVncmVlO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzO1xuICB9O1xuXG4gIEFic3RyYWN0R3JhcGgucHJvdG90eXBlLmdldFVuZG9TdGFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy51bmRvU3RhY2s7XG4gIH07XG5cbiAgQWJzdHJhY3RHcmFwaC5wcm90b3R5cGUuZ2V0UmVkb1N0YWNrID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLnJlZG9TdGFjaztcbiAgfTtcbiAgLyoqXG4gICAqIOiOt+WPliB1bmRvIOWSjCByZWRvIOagiOeahOaVsOaNrlxuICAgKi9cblxuXG4gIEFic3RyYWN0R3JhcGgucHJvdG90eXBlLmdldFN0YWNrRGF0YSA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXRoaXMuZ2V0KCdlbmFibGVkU3RhY2snKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHVuZG9TdGFjazogdGhpcy51bmRvU3RhY2sudG9BcnJheSgpLFxuICAgICAgcmVkb1N0YWNrOiB0aGlzLnJlZG9TdGFjay50b0FycmF5KClcbiAgICB9O1xuICB9O1xuICAvKipcbiAgICog5riF56m6IHVuZG8gc3RhY2sgJiByZWRvIHN0YWNrXG4gICAqL1xuXG5cbiAgQWJzdHJhY3RHcmFwaC5wcm90b3R5cGUuY2xlYXJTdGFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodGhpcy5nZXQoJ2VuYWJsZWRTdGFjaycpKSB7XG4gICAgICB0aGlzLnVuZG9TdGFjay5jbGVhcigpO1xuICAgICAgdGhpcy5yZWRvU3RhY2suY2xlYXIoKTtcbiAgICB9XG4gIH07XG4gIC8qKlxuICAgKiDlsIbmk43kvZznsbvlnovlkozmk43kvZzmlbDmja7lhaXmoIhcbiAgICogQHBhcmFtIGFjdGlvbiDmk43kvZznsbvlnotcbiAgICogQHBhcmFtIGRhdGEg5YWl5qCI55qE5pWw5o2uXG4gICAqIEBwYXJhbSBzdGFja1R5cGUg5qCI55qE57G75Z6LXG4gICAqL1xuXG5cbiAgQWJzdHJhY3RHcmFwaC5wcm90b3R5cGUucHVzaFN0YWNrID0gZnVuY3Rpb24gKGFjdGlvbiwgZGF0YSwgc3RhY2tUeXBlKSB7XG4gICAgaWYgKGFjdGlvbiA9PT0gdm9pZCAwKSB7XG4gICAgICBhY3Rpb24gPSAndXBkYXRlJztcbiAgICB9XG5cbiAgICBpZiAoc3RhY2tUeXBlID09PSB2b2lkIDApIHtcbiAgICAgIHN0YWNrVHlwZSA9ICd1bmRvJztcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuZ2V0KCdlbmFibGVkU3RhY2snKSkge1xuICAgICAgY29uc29sZS53YXJuKCfor7flhYjlkK/nlKggdW5kbyAmIHJlZG8g5Yqf6IO977yM5Zyo5a6e5L6L5YyWIEdyYXBoIOaXtuWAmemFjee9riBlbmFibGVkU3RhY2s6IHRydWUgIScpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBzdGFja0RhdGEgPSBkYXRhID8gY2xvbmUoZGF0YSkgOiB7XG4gICAgICBiZWZvcmU6IHt9LFxuICAgICAgYWZ0ZXI6IGNsb25lKHRoaXMuc2F2ZSgpKVxuICAgIH07XG5cbiAgICBpZiAoc3RhY2tUeXBlID09PSAncmVkbycpIHtcbiAgICAgIHRoaXMucmVkb1N0YWNrLnB1c2goe1xuICAgICAgICBhY3Rpb246IGFjdGlvbixcbiAgICAgICAgZGF0YTogc3RhY2tEYXRhXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy51bmRvU3RhY2sucHVzaCh7XG4gICAgICAgIGFjdGlvbjogYWN0aW9uLFxuICAgICAgICBkYXRhOiBzdGFja0RhdGFcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuZW1pdCgnc3RhY2tjaGFuZ2UnLCB7XG4gICAgICB1bmRvU3RhY2s6IHRoaXMudW5kb1N0YWNrLFxuICAgICAgcmVkb1N0YWNrOiB0aGlzLnJlZG9TdGFja1xuICAgIH0pO1xuICB9O1xuICAvKipcbiAgICog6I635Y+W6YK75o6l55+p6Zi1XG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gY2FjaGUg5piv5ZCm5L2/55So57yT5a2Y55qEXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZGlyZWN0ZWQg5piv5ZCm5piv5pyJ5ZCR5Zu+77yM6buY6K6k5Y+WIGdyYXBoLmRpcmVjdGVkXG4gICAqIEByZXR1cm5zIHtNYXRyaXh9IOmCu+aOpeefqemYtVxuICAgKiBAbWVtYmVyb2YgSUFic3RyYWN0R3JhcGhcbiAgICovXG5cblxuICBBYnN0cmFjdEdyYXBoLnByb3RvdHlwZS5nZXRBZGpNYXRyaXggPSBmdW5jdGlvbiAoY2FjaGUsIGRpcmVjdGVkKSB7XG4gICAgaWYgKGNhY2hlID09PSB2b2lkIDApIHtcbiAgICAgIGNhY2hlID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoZGlyZWN0ZWQgPT09IHVuZGVmaW5lZCkgZGlyZWN0ZWQgPSB0aGlzLmdldCgnZGlyZWN0ZWQnKTtcbiAgICB2YXIgY3VycmVudEFkak1hdHJpeCA9IHRoaXMuZ2V0KCdhZGpNYXRyaXgnKTtcblxuICAgIGlmICghY3VycmVudEFkak1hdHJpeCB8fCAhY2FjaGUpIHtcbiAgICAgIGN1cnJlbnRBZGpNYXRyaXggPSBnZXRBZGphY2VudE1hdHJpeCh0aGlzLnNhdmUoKSwgZGlyZWN0ZWQpO1xuICAgICAgdGhpcy5zZXQoJ2Fkak1hdHJpeCcsIGN1cnJlbnRBZGpNYXRyaXgpO1xuICAgIH1cblxuICAgIHJldHVybiBjdXJyZW50QWRqTWF0cml4O1xuICB9O1xuICAvKipcbiAgICog6I635Y+W5pyA55+t6Lev5b6E55+p6Zi1XG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gY2FjaGUg5piv5ZCm5L2/55So57yT5a2Y55qEXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZGlyZWN0ZWQg5piv5ZCm5piv5pyJ5ZCR5Zu+77yM6buY6K6k5Y+WIGdyYXBoLmRpcmVjdGVkXG4gICAqIEByZXR1cm5zIHtNYXRyaXh9IOacgOefrei3r+W+hOefqemYtVxuICAgKiBAbWVtYmVyb2YgSUFic3RyYWN0R3JhcGhcbiAgICovXG5cblxuICBBYnN0cmFjdEdyYXBoLnByb3RvdHlwZS5nZXRTaG9ydGVzdFBhdGhNYXRyaXggPSBmdW5jdGlvbiAoY2FjaGUsIGRpcmVjdGVkKSB7XG4gICAgaWYgKGNhY2hlID09PSB2b2lkIDApIHtcbiAgICAgIGNhY2hlID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoZGlyZWN0ZWQgPT09IHVuZGVmaW5lZCkgZGlyZWN0ZWQgPSB0aGlzLmdldCgnZGlyZWN0ZWQnKTtcbiAgICB2YXIgY3VycmVudEFkak1hdHJpeCA9IHRoaXMuZ2V0KCdhZGpNYXRyaXgnKTtcbiAgICB2YXIgY3VycmVudFNob3VydGVzdFBhdGhNYXRyaXggPSB0aGlzLmdldCgnc2hvcnRlc3RQYXRoTWF0cml4Jyk7XG5cbiAgICBpZiAoIWN1cnJlbnRBZGpNYXRyaXggfHwgIWNhY2hlKSB7XG4gICAgICBjdXJyZW50QWRqTWF0cml4ID0gZ2V0QWRqYWNlbnRNYXRyaXgodGhpcy5zYXZlKCksIGRpcmVjdGVkKTtcbiAgICAgIHRoaXMuc2V0KCdhZGpNYXRyaXgnLCBjdXJyZW50QWRqTWF0cml4KTtcbiAgICB9XG5cbiAgICBpZiAoIWN1cnJlbnRTaG91cnRlc3RQYXRoTWF0cml4IHx8ICFjYWNoZSkge1xuICAgICAgY3VycmVudFNob3VydGVzdFBhdGhNYXRyaXggPSBmbG95ZFdhcnNoYWxsKHRoaXMuc2F2ZSgpLCBkaXJlY3RlZCk7XG4gICAgICB0aGlzLnNldCgnc2hvcnRlc3RQYXRoTWF0cml4JywgY3VycmVudFNob3VydGVzdFBhdGhNYXRyaXgpO1xuICAgIH1cblxuICAgIHJldHVybiBjdXJyZW50U2hvdXJ0ZXN0UGF0aE1hdHJpeDtcbiAgfTtcbiAgLyoqXG4gICAqIOmHjeaWsOWumuS5ieebkeWQrOWHveaVsO+8jOWkjeWGmeWPguaVsOexu+Wei1xuICAgKi9cblxuXG4gIEFic3RyYWN0R3JhcGgucHJvdG90eXBlLm9uID0gZnVuY3Rpb24gKGV2ZW50TmFtZSwgY2FsbGJhY2ssIG9uY2UpIHtcbiAgICByZXR1cm4gX3N1cGVyLnByb3RvdHlwZS5vbi5jYWxsKHRoaXMsIGV2ZW50TmFtZSwgY2FsbGJhY2ssIG9uY2UpO1xuICB9O1xuICAvKipcbiAgICog6ZSA5q+B55S75biDXG4gICAqL1xuXG5cbiAgQWJzdHJhY3RHcmFwaC5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmNsZWFyKCk7IC8vIOa4heepuuagiOaVsOaNrlxuXG4gICAgdGhpcy5jbGVhclN0YWNrKCk7XG4gICAgdGhpcy5nZXQoJ2l0ZW1Db250cm9sbGVyJykuZGVzdHJveSgpO1xuICAgIHRoaXMuZ2V0KCdtb2RlQ29udHJvbGxlcicpLmRlc3Ryb3koKTtcbiAgICB0aGlzLmdldCgndmlld0NvbnRyb2xsZXInKS5kZXN0cm95KCk7XG4gICAgdGhpcy5nZXQoJ3N0YXRlQ29udHJvbGxlcicpLmRlc3Ryb3koKTtcbiAgICB0aGlzLmdldCgnY2FudmFzJykuZGVzdHJveSgpO1xuICAgIHRoaXMuY2ZnID0gbnVsbDtcbiAgICB0aGlzLmRlc3Ryb3llZCA9IHRydWU7XG4gICAgdGhpcy5yZWRvU3RhY2sgPSBudWxsO1xuICAgIHRoaXMudW5kb1N0YWNrID0gbnVsbDtcbiAgfTtcbiAgLyoqXG4gICAqIOWIm+W7uuWHuOWMheaIluWHueWMhei9ruW7k1xuICAgKiBAcGFyYW0gY2ZnIEh1bGxDZmcg6L2u5buT6YWN572u6aG5XG4gICAqL1xuXG5cbiAgQWJzdHJhY3RHcmFwaC5wcm90b3R5cGUuY3JlYXRlSHVsbCA9IGZ1bmN0aW9uIChjZmcpIHtcbiAgICBpZiAoIWNmZy5tZW1iZXJzIHx8IGNmZy5tZW1iZXJzLmxlbmd0aCA8IDEpIHtcbiAgICAgIGNvbnNvbGUud2FybignQ3JlYXRlIGh1bGwgZmFpbGVkISBUaGUgbWVtYmVycyBpcyBlbXB0eS4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgcGFyZW50ID0gdGhpcy5nZXQoJ2h1bGxHcm91cCcpO1xuICAgIHZhciBodWxsTWFwID0gdGhpcy5nZXQoJ2h1bGxNYXAnKTtcblxuICAgIGlmICghaHVsbE1hcCkge1xuICAgICAgaHVsbE1hcCA9IHt9O1xuICAgICAgdGhpcy5zZXQoJ2h1bGxNYXAnLCBodWxsTWFwKTtcbiAgICB9XG5cbiAgICBpZiAoIXBhcmVudCB8fCBwYXJlbnQuZ2V0KCdkZXN0cm95ZWQnKSkge1xuICAgICAgcGFyZW50ID0gdGhpcy5nZXQoJ2dyb3VwJykuYWRkR3JvdXAoe1xuICAgICAgICBpZDogJ2h1bGxHcm91cCdcbiAgICAgIH0pO1xuICAgICAgcGFyZW50LnRvQmFjaygpO1xuICAgICAgdGhpcy5zZXQoJ2h1bGxHcm91cCcsIHBhcmVudCk7XG4gICAgfVxuXG4gICAgaWYgKGh1bGxNYXBbY2ZnLmlkXSkge1xuICAgICAgY29uc29sZS53YXJuKCdFeGlzdGVkIGh1bGwgaWQuJyk7XG4gICAgICByZXR1cm4gaHVsbE1hcFtjZmcuaWRdO1xuICAgIH1cblxuICAgIHZhciBncm91cCA9IHBhcmVudC5hZGRHcm91cCh7XG4gICAgICBpZDogY2ZnLmlkICsgXCItY29udGFpbmVyXCJcbiAgICB9KTtcbiAgICB2YXIgaHVsbCA9IG5ldyBIdWxsKHRoaXMsIF9fYXNzaWduKF9fYXNzaWduKHt9LCBjZmcpLCB7XG4gICAgICBncm91cDogZ3JvdXBcbiAgICB9KSk7XG4gICAgdmFyIGh1bGxJZCA9IGh1bGwuaWQ7XG4gICAgaHVsbE1hcFtodWxsSWRdID0gaHVsbDtcbiAgICByZXR1cm4gaHVsbDtcbiAgfTtcbiAgLyoqXG4gICAqIOiOt+WPluW9k+WJjSBncmFwaCDkuK3lrZjlnKjnmoTljIXoo7nova7lu5NcbiAgICogQHJldHVybiB7W2tleTogc3RyaW5nXTogSHVsbH0gSHVsbCDnmoQgbWFw77yMaHVsbElkIOWvueW6lOeahCBodWxsIOWunuS+i1xuICAgKi9cblxuXG4gIEFic3RyYWN0R3JhcGgucHJvdG90eXBlLmdldEh1bGxzID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLmdldCgnaHVsbE1hcCcpO1xuICB9O1xuICAvKipcbiAgICog5qC55o2uIGh1bGxJZCDojrflj5blr7nlupTnmoQgaHVsbFxuICAgKiBAcmV0dXJuIEh1bGxcbiAgICovXG5cblxuICBBYnN0cmFjdEdyYXBoLnByb3RvdHlwZS5nZXRIdWxsQnlJZCA9IGZ1bmN0aW9uIChodWxsSWQpIHtcbiAgICByZXR1cm4gdGhpcy5nZXQoJ2h1bGxNYXAnKVtodWxsSWRdO1xuICB9O1xuXG4gIEFic3RyYWN0R3JhcGgucHJvdG90eXBlLnJlbW92ZUh1bGwgPSBmdW5jdGlvbiAoaHVsbCkge1xuICAgIHZhciBfYTtcblxuICAgIHZhciBodWxsSW5zdGFuY2U7XG5cbiAgICBpZiAoaXNTdHJpbmcoaHVsbCkpIHtcbiAgICAgIGh1bGxJbnN0YW5jZSA9IHRoaXMuZ2V0SHVsbEJ5SWQoaHVsbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGh1bGxJbnN0YW5jZSA9IGh1bGw7XG4gICAgfVxuXG4gICAgKF9hID0gdGhpcy5nZXQoJ2h1bGxNYXAnKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHRydWUgOiBkZWxldGUgX2FbaHVsbEluc3RhbmNlLmlkXTtcbiAgICBodWxsSW5zdGFuY2UuZGVzdHJveSgpO1xuICB9O1xuXG4gIEFic3RyYWN0R3JhcGgucHJvdG90eXBlLnJlbW92ZUh1bGxzID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBodWxscyA9IHRoaXMuZ2V0SHVsbHMoKTtcbiAgICBpZiAoIWh1bGxzIHx8ICFPYmplY3Qua2V5cyhodWxscykubGVuZ3RoKSByZXR1cm47XG4gICAgT2JqZWN0LmtleXMoaHVsbHMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgdmFyIGh1bGwgPSBodWxsc1trZXldO1xuICAgICAgaHVsbC5kZXN0cm95KCk7XG4gICAgfSk7XG4gICAgdGhpcy5zZXQoJ2h1bGxNYXAnLCB7fSk7XG4gIH07XG5cbiAgcmV0dXJuIEFic3RyYWN0R3JhcGg7XG59KEV2ZW50RW1pdHRlcik7XG5cbmV4cG9ydCBkZWZhdWx0IEFic3RyYWN0R3JhcGg7IiwiZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiOyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIpIHsgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9OyB9IGVsc2UgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07IH0gcmV0dXJuIF90eXBlb2Yob2JqKTsgfVxuXG5pbXBvcnQgeyBfX2Fzc2lnbiB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IEdsb2JhbCBmcm9tICcuLi9nbG9iYWwnO1xuaW1wb3J0IHsgZXh0IH0gZnJvbSAnQGFudHYvbWF0cml4LXV0aWwnO1xuaW1wb3J0IHsgZGVlcE1peCwgZWFjaCwgbWl4LCBpc0Jvb2xlYW4sIGlzUGxhaW5PYmplY3QsIGNsb25lIH0gZnJvbSAnQGFudHYvdXRpbCc7XG5pbXBvcnQgeyBjbG9uZUJlc2lkZXNJbWcgfSBmcm9tICcuLi91dGlsL2dyYXBoaWMnO1xudmFyIHRyYW5zZm9ybSA9IGV4dC50cmFuc2Zvcm07XG52YXIgQ0xTX1NIQVBFX1NVRkZJWCA9ICctc2hhcGUnO1xudmFyIENMU19MQUJFTF9TVUZGSVggPSAnLWxhYmVsJztcbnZhciBBUlJPV1MgPSBbJ3N0YXJ0QXJyb3cnLCAnZW5kQXJyb3cnXTtcbnZhciBTSEFQRV9ERUZBVUxUX0FUVFJTID0ge1xuICBsaW5lV2lkdGg6IDEsXG4gIHN0cm9rZTogdW5kZWZpbmVkLFxuICBmaWxsOiB1bmRlZmluZWQsXG4gIGxpbmVBcHBlbmRXaWR0aDogMSxcbiAgb3BhY2l0eTogdW5kZWZpbmVkLFxuICBzdHJva2VPcGFjaXR5OiB1bmRlZmluZWQsXG4gIGZpbGxPcGFjaXR5OiB1bmRlZmluZWQsXG4gIHg6IDAsXG4gIHk6IDAsXG4gIHI6IDEwLFxuICB3aWR0aDogMjAsXG4gIGhlaWdodDogMjAsXG4gIHNoYWRvd0NvbG9yOiB1bmRlZmluZWQsXG4gIHNoYWRvd0JsdXI6IDAsXG4gIHNoYWRvd09mZnNldFg6IDAsXG4gIHNoYWRvd09mZnNldFk6IDBcbn07XG52YXIgUEFUSF9TSEFQRV9ERUZBVUxUX0FUVFJTID0ge1xuICBsaW5lV2lkdGg6IDEsXG4gIHN0cm9rZTogJyMwMDAnLFxuICBsaW5lRGFzaDogdW5kZWZpbmVkLFxuICBzdGFydEFycm93OiBmYWxzZSxcbiAgZW5kQXJyb3c6IGZhbHNlLFxuICBvcGFjaXR5OiB1bmRlZmluZWQsXG4gIHN0cm9rZU9wYWNpdHk6IHVuZGVmaW5lZCxcbiAgZmlsbE9wYWNpdHk6IHVuZGVmaW5lZCxcbiAgc2hhZG93Q29sb3I6IHVuZGVmaW5lZCxcbiAgc2hhZG93Qmx1cjogMCxcbiAgc2hhZG93T2Zmc2V0WDogMCxcbiAgc2hhZG93T2Zmc2V0WTogMFxufTtcbnZhciBTSEFQRVNfREVGQVVMVF9BVFRSUyA9IHtcbiAgZWRnZTogUEFUSF9TSEFQRV9ERUZBVUxUX0FUVFJTLFxuICBub2RlOiBTSEFQRV9ERUZBVUxUX0FUVFJTLFxuICBjb21ibzogU0hBUEVfREVGQVVMVF9BVFRSU1xufTtcbmV4cG9ydCB2YXIgQ0xTX0xBQkVMX0JHX1NVRkZJWCA9ICctbGFiZWwtYmcnOyAvLyDljZXkuKogc2hhcGUg5bim5pyJ5LiA5LiqIGxhYmVs77yM5YWx55So6L+Z5q615Luj56CBXG5cbmV4cG9ydCB2YXIgc2hhcGVCYXNlID0ge1xuICAvLyDpu5jorqTmoLflvI/lj4rphY3nva5cbiAgb3B0aW9uczoge1xuICAgIGxhYmVsQ2ZnOiB7XG4gICAgICBzdHlsZToge1xuICAgICAgICBmb250RmFtaWx5OiBHbG9iYWwud2luZG93Rm9udEZhbWlseVxuICAgICAgfVxuICAgIH0sXG4gICAgZGVzY3JpcHRpb25DZmc6IHtcbiAgICAgIHN0eWxlOiB7XG4gICAgICAgIGZvbnRGYW1pbHk6IEdsb2JhbC53aW5kb3dGb250RmFtaWx5XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBpdGVtVHlwZTogJycsXG5cbiAgLyoqXG4gICAqIOW9oueKtueahOexu+Wei++8jOS+i+WmgiBjaXJjbGXvvIxlbGxpcHNl77yMcG9seWxpbmUuLi5cbiAgICovXG4gIHR5cGU6ICcnLFxuICBnZXRDdXN0b21Db25maWc6IGZ1bmN0aW9uIGdldEN1c3RvbUNvbmZpZyhjZmcpIHtcbiAgICByZXR1cm4ge307XG4gIH0sXG4gIGdldE9wdGlvbnM6IGZ1bmN0aW9uIGdldE9wdGlvbnMoY2ZnLCB1cGRhdGVUeXBlKSB7XG4gICAgaWYgKHVwZGF0ZVR5cGUgPT09ICdtb3ZlJyB8fCAodXBkYXRlVHlwZSA9PT0gbnVsbCB8fCB1cGRhdGVUeXBlID09PSB2b2lkIDAgPyB2b2lkIDAgOiB1cGRhdGVUeXBlLmluY2x1ZGVzKCdiYm94JykpKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlZXBNaXgoe30sIHRoaXMub3B0aW9ucywgdGhpcy5nZXRDdXN0b21Db25maWcoY2ZnKSB8fCB7fSwgY2ZnKTtcbiAgfSxcblxuICAvKipcbiAgICog57uY5Yi26IqC54K5L+i+ue+8jOWMheWQq+aWh+acrFxuICAgKiBAb3ZlcnJpZGVcbiAgICogQHBhcmFtICB7T2JqZWN0fSBjZmcg6IqC54K555qE6YWN572u6aG5XG4gICAqIEBwYXJhbSAge0cuR3JvdXB9IGdyb3VwIOiKgueCueeahOWuueWZqFxuICAgKiBAcmV0dXJuIHtJU2hhcGV9IOe7mOWItueahOWbvuW9olxuICAgKi9cbiAgZHJhdzogZnVuY3Rpb24gZHJhdyhjZmcsIGdyb3VwKSB7XG4gICAgZ3JvdXBbJ3NoYXBlTWFwJ10gPSB7fTtcbiAgICB0aGlzLm1lcmdlU3R5bGUgPSB0aGlzLmdldE9wdGlvbnMoY2ZnKTtcbiAgICB2YXIgc2hhcGUgPSB0aGlzLmRyYXdTaGFwZShjZmcsIGdyb3VwKTtcbiAgICBzaGFwZS5zZXQoJ2NsYXNzTmFtZScsIHRoaXMuaXRlbVR5cGUgKyBDTFNfU0hBUEVfU1VGRklYKTtcbiAgICBncm91cFsnc2hhcGVNYXAnXVt0aGlzLml0ZW1UeXBlICsgQ0xTX1NIQVBFX1NVRkZJWF0gPSBzaGFwZTtcblxuICAgIGlmIChjZmcubGFiZWwpIHtcbiAgICAgIHZhciBsYWJlbCA9IHRoaXMuZHJhd0xhYmVsKGNmZywgZ3JvdXApO1xuICAgICAgbGFiZWwuc2V0KCdjbGFzc05hbWUnLCB0aGlzLml0ZW1UeXBlICsgQ0xTX0xBQkVMX1NVRkZJWCk7XG4gICAgICBncm91cFsnc2hhcGVNYXAnXVt0aGlzLml0ZW1UeXBlICsgQ0xTX0xBQkVMX1NVRkZJWF0gPSBsYWJlbDtcbiAgICB9XG5cbiAgICByZXR1cm4gc2hhcGU7XG4gIH0sXG5cbiAgLyoqXG4gICAqIOe7mOWItuWujOaIkOWQjueahOaTjeS9nO+8jOS+v+S6jueUqOaIt+e7p+aJv+eOsOacieeahOiKgueCueOAgei+uVxuICAgKiBAcGFyYW0gY2ZnXG4gICAqIEBwYXJhbSBncm91cFxuICAgKiBAcGFyYW0ga2V5U2hhcGVcbiAgICovXG4gIGFmdGVyRHJhdzogZnVuY3Rpb24gYWZ0ZXJEcmF3KGNmZywgZ3JvdXAsIGtleVNoYXBlKSB7fSxcbiAgZHJhd1NoYXBlOiBmdW5jdGlvbiBkcmF3U2hhcGUoY2ZnLCBncm91cCkge1xuICAgIHJldHVybiBudWxsO1xuICB9LFxuICBkcmF3TGFiZWw6IGZ1bmN0aW9uIGRyYXdMYWJlbChjZmcsIGdyb3VwKSB7XG4gICAgdmFyIGRlZmF1bHRMYWJlbENmZyA9ICh0aGlzLm1lcmdlU3R5bGUgfHwgdGhpcy5nZXRPcHRpb25zKGNmZykgfHwge30pLmxhYmVsQ2ZnOyAvLyBpbWFnZeeahOaDheWGteS4i+acieWPr+iDveS4um51bGxcblxuICAgIHZhciBsYWJlbENmZyA9IGRlZmF1bHRMYWJlbENmZyB8fCB7fTtcbiAgICB2YXIgbGFiZWxTdHlsZSA9IHRoaXMuZ2V0TGFiZWxTdHlsZShjZmcsIGxhYmVsQ2ZnLCBncm91cCk7XG4gICAgdmFyIHJvdGF0ZSA9IGxhYmVsU3R5bGUucm90YXRlO1xuICAgIGRlbGV0ZSBsYWJlbFN0eWxlLnJvdGF0ZTtcbiAgICB2YXIgbGFiZWwgPSBncm91cC5hZGRTaGFwZSgndGV4dCcsIHtcbiAgICAgIGF0dHJzOiBsYWJlbFN0eWxlLFxuICAgICAgZHJhZ2dhYmxlOiB0cnVlLFxuICAgICAgY2xhc3NOYW1lOiAndGV4dC1zaGFwZScsXG4gICAgICBuYW1lOiAndGV4dC1zaGFwZSdcbiAgICB9KTtcbiAgICBncm91cFsnc2hhcGVNYXAnXVsndGV4dC1zaGFwZSddID0gbGFiZWw7XG5cbiAgICBpZiAoIWlzTmFOKHJvdGF0ZSkgJiYgcm90YXRlICE9PSAnJykge1xuICAgICAgdmFyIGxhYmVsQkJveCA9IGxhYmVsLmdldEJCb3goKTtcbiAgICAgIHZhciBsYWJlbE1hdHJpeCA9IFsxLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAxXTtcblxuICAgICAgaWYgKGxhYmVsU3R5bGUucm90YXRlQ2VudGVyKSB7XG4gICAgICAgIHN3aXRjaCAobGFiZWxTdHlsZS5yb3RhdGVDZW50ZXIpIHtcbiAgICAgICAgICBjYXNlICdjZW50ZXInOlxuICAgICAgICAgICAgbGFiZWxNYXRyaXggPSB0cmFuc2Zvcm0obGFiZWxNYXRyaXgsIFtbJ3QnLCAtbGFiZWxCQm94LndpZHRoIC8gMiwgLWxhYmVsQkJveC5oZWlnaHQgLyAyXSwgWydyJywgcm90YXRlXSwgWyd0JywgbGFiZWxCQm94LndpZHRoIC8gMiwgbGFiZWxCQm94LmhlaWdodCAvIDJdXSk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgJ2xlZnR0b3AnOlxuICAgICAgICAgICAgbGFiZWxNYXRyaXggPSB0cmFuc2Zvcm0obGFiZWxNYXRyaXgsIFtbJ3QnLCAtbGFiZWxTdHlsZS54LCAtbGFiZWxTdHlsZS55XSwgWydyJywgcm90YXRlXSwgWyd0JywgbGFiZWxTdHlsZS54LCBsYWJlbFN0eWxlLnldXSk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgJ2xlZnRjZW50ZXInOlxuICAgICAgICAgICAgbGFiZWxNYXRyaXggPSB0cmFuc2Zvcm0obGFiZWxNYXRyaXgsIFtbJ3QnLCAtbGFiZWxTdHlsZS54LCAtbGFiZWxTdHlsZS55IC0gbGFiZWxCQm94LmhlaWdodCAvIDJdLCBbJ3InLCByb3RhdGVdLCBbJ3QnLCBsYWJlbFN0eWxlLngsIGxhYmVsU3R5bGUueSArIGxhYmVsQkJveC5oZWlnaHQgLyAyXV0pO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgbGFiZWxNYXRyaXggPSB0cmFuc2Zvcm0obGFiZWxNYXRyaXgsIFtbJ3QnLCAtbGFiZWxCQm94LndpZHRoIC8gMiwgLWxhYmVsQkJveC5oZWlnaHQgLyAyXSwgWydyJywgcm90YXRlXSwgWyd0JywgbGFiZWxCQm94LndpZHRoIC8gMiwgbGFiZWxCQm94LmhlaWdodCAvIDJdXSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGFiZWxNYXRyaXggPSB0cmFuc2Zvcm0obGFiZWxNYXRyaXgsIFtbJ3QnLCAtbGFiZWxTdHlsZS54LCAtbGFiZWxTdHlsZS55IC0gbGFiZWxCQm94LmhlaWdodCAvIDJdLCBbJ3InLCByb3RhdGVdLCBbJ3QnLCBsYWJlbFN0eWxlLngsIGxhYmVsU3R5bGUueSArIGxhYmVsQkJveC5oZWlnaHQgLyAyXV0pO1xuICAgICAgfVxuXG4gICAgICBsYWJlbC5zZXRNYXRyaXgobGFiZWxNYXRyaXgpO1xuICAgIH1cblxuICAgIGlmIChsYWJlbFN0eWxlLmJhY2tncm91bmQpIHtcbiAgICAgIHZhciByZWN0ID0gdGhpcy5kcmF3TGFiZWxCZyhjZmcsIGdyb3VwLCBsYWJlbCk7XG4gICAgICB2YXIgbGFiZWxCZ0NsYXNzbmFtZSA9IHRoaXMuaXRlbVR5cGUgKyBDTFNfTEFCRUxfQkdfU1VGRklYO1xuICAgICAgcmVjdC5zZXQoJ2NsYXNzbmFtZScsIGxhYmVsQmdDbGFzc25hbWUpO1xuICAgICAgZ3JvdXBbJ3NoYXBlTWFwJ11bbGFiZWxCZ0NsYXNzbmFtZV0gPSByZWN0O1xuICAgICAgbGFiZWwudG9Gcm9udCgpO1xuICAgIH1cblxuICAgIHJldHVybiBsYWJlbDtcbiAgfSxcbiAgZHJhd0xhYmVsQmc6IGZ1bmN0aW9uIGRyYXdMYWJlbEJnKGNmZywgZ3JvdXAsIGxhYmVsKSB7XG4gICAgdmFyIGRlZmF1bHRMYWJlbENmZyA9IHRoaXMub3B0aW9ucy5sYWJlbENmZztcbiAgICB2YXIgbGFiZWxDZmcgPSBtaXgoe30sIGRlZmF1bHRMYWJlbENmZywgY2ZnLmxhYmVsQ2ZnKTtcbiAgICB2YXIgc3R5bGUgPSB0aGlzLmdldExhYmVsQmdTdHlsZUJ5UG9zaXRpb24obGFiZWwsIGNmZywgbGFiZWxDZmcsIGdyb3VwKTtcbiAgICB2YXIgcmVjdCA9IGdyb3VwLmFkZFNoYXBlKCdyZWN0Jywge1xuICAgICAgbmFtZTogJ3RleHQtYmctc2hhcGUnLFxuICAgICAgYXR0cnM6IHN0eWxlXG4gICAgfSk7XG4gICAgZ3JvdXBbJ3NoYXBlTWFwJ11bJ3RleHQtYmctc2hhcGUnXSA9IHJlY3Q7XG4gICAgcmV0dXJuIHJlY3Q7XG4gIH0sXG4gIGdldExhYmVsU3R5bGVCeVBvc2l0aW9uOiBmdW5jdGlvbiBnZXRMYWJlbFN0eWxlQnlQb3NpdGlvbihjZmcsIGxhYmVsQ2ZnLCBncm91cCkge1xuICAgIHJldHVybiB7XG4gICAgICB0ZXh0OiBjZmcubGFiZWxcbiAgICB9O1xuICB9LFxuICBnZXRMYWJlbEJnU3R5bGVCeVBvc2l0aW9uOiBmdW5jdGlvbiBnZXRMYWJlbEJnU3R5bGVCeVBvc2l0aW9uKGxhYmVsLCBjZmcsIGxhYmVsQ2ZnLCBncm91cCkge1xuICAgIHJldHVybiB7fTtcbiAgfSxcblxuICAvKipcbiAgICog6I635Y+W5paH5pys55qE6YWN572u6aG5XG4gICAqIEBwYXJhbSBjZmcg6IqC54K555qE6YWN572u6aG5XG4gICAqIEBwYXJhbSBsYWJlbENmZyDmlofmnKznmoTphY3nva7poblcbiAgICogQHBhcmFtIGdyb3VwIOeItuWuueWZqO+8jGxhYmVsIOeahOWumuS9jeWPr+iDveS4juWbvuW9ouebuOWFs1xuICAgKi9cbiAgZ2V0TGFiZWxTdHlsZTogZnVuY3Rpb24gZ2V0TGFiZWxTdHlsZShjZmcsIGxhYmVsQ2ZnLCBncm91cCkge1xuICAgIHZhciBjYWxjdWxhdGVTdHlsZSA9IHRoaXMuZ2V0TGFiZWxTdHlsZUJ5UG9zaXRpb24oY2ZnLCBsYWJlbENmZywgZ3JvdXApO1xuICAgIHZhciBhdHRyTmFtZSA9IHRoaXMuaXRlbVR5cGUgKyBcIkxhYmVsXCI7IC8vIOWPliBub2RlTGFiZWzvvIxlZGdlTGFiZWwg55qE6YWN572u6aG5XG5cbiAgICB2YXIgZGVmYXVsdFN0eWxlID0gR2xvYmFsW2F0dHJOYW1lXSA/IEdsb2JhbFthdHRyTmFtZV0uc3R5bGUgOiBudWxsO1xuICAgIHJldHVybiBfX2Fzc2lnbihfX2Fzc2lnbihfX2Fzc2lnbih7fSwgZGVmYXVsdFN0eWxlKSwgY2FsY3VsYXRlU3R5bGUpLCBsYWJlbENmZy5zdHlsZSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIOiOt+WPluWbvuW9oueahOmFjee9rumhuVxuICAgKiBAcGFyYW0gY2ZnXG4gICAqL1xuICBnZXRTaGFwZVN0eWxlOiBmdW5jdGlvbiBnZXRTaGFwZVN0eWxlKGNmZykge1xuICAgIHJldHVybiBjZmcuc3R5bGU7XG4gIH0sXG5cbiAgLyoqXG4gICAqIOabtOaWsOiKgueCue+8jOWMheWQq+aWh+acrFxuICAgKiBAb3ZlcnJpZGVcbiAgICogQHBhcmFtICB7T2JqZWN0fSBjZmcg6IqC54K5L+i+ueeahOmFjee9rumhuVxuICAgKiBAcGFyYW0gIHtHNi5JdGVtfSBpdGVtIOiKgueCuS/ovrlcbiAgICovXG4gIHVwZGF0ZTogZnVuY3Rpb24gdXBkYXRlKGNmZywgaXRlbSwgdXBkYXRlVHlwZSkge1xuICAgIHRoaXMudXBkYXRlU2hhcGVTdHlsZShjZmcsIGl0ZW0sIHVwZGF0ZVR5cGUpO1xuICAgIHRoaXMudXBkYXRlTGFiZWwoY2ZnLCBpdGVtLCB1cGRhdGVUeXBlKTtcbiAgfSxcbiAgdXBkYXRlU2hhcGVTdHlsZTogZnVuY3Rpb24gdXBkYXRlU2hhcGVTdHlsZShjZmcsIGl0ZW0sIHVwZGF0ZVR5cGUpIHtcbiAgICB2YXIgX2E7XG5cbiAgICB2YXIgZ3JvdXAgPSBpdGVtLmdldENvbnRhaW5lcigpO1xuICAgIHZhciBzaGFwZSA9IGl0ZW0uZ2V0S2V5U2hhcGUoKTtcbiAgICB2YXIgc2hhcGVTdHlsZSA9IG1peCh7fSwgc2hhcGUuYXR0cigpLCBjZmcuc3R5bGUpO1xuXG4gICAgdmFyIF9sb29wXzEgPSBmdW5jdGlvbiBfbG9vcF8xKGtleSkge1xuICAgICAgdmFyIF9iO1xuXG4gICAgICB2YXIgc3R5bGUgPSBzaGFwZVN0eWxlW2tleV07XG5cbiAgICAgIGlmIChpc1BsYWluT2JqZWN0KHN0eWxlKSkge1xuICAgICAgICAvLyDmm7TmlrDlm77lhYPntKDmoLflvI/vvIzmlK/mjIHmm7TmlrDlrZDlhYPntKBcbiAgICAgICAgdmFyIHN1YlNoYXBlID0gKChfYSA9IGdyb3VwWydzaGFwZU1hcCddKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Fba2V5XSkgfHwgZ3JvdXAuZmluZChmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICAgIHJldHVybiBlbGVtZW50LmdldCgnbmFtZScpID09PSBrZXk7XG4gICAgICAgIH0pO1xuICAgICAgICBzdWJTaGFwZSA9PT0gbnVsbCB8fCBzdWJTaGFwZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc3ViU2hhcGUuYXR0cihzdHlsZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzaGFwZS5hdHRyKChfYiA9IHt9LCBfYltrZXldID0gc3R5bGUsIF9iKSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGZvciAodmFyIGtleSBpbiBzaGFwZVN0eWxlKSB7XG4gICAgICBfbG9vcF8xKGtleSk7XG4gICAgfVxuICB9LFxuICB1cGRhdGVMYWJlbDogZnVuY3Rpb24gdXBkYXRlTGFiZWwoY2ZnLCBpdGVtLCB1cGRhdGVUeXBlKSB7XG4gICAgdmFyIF9hLCBfYjsgLy8g6Ziy5q2iIGNmZy5sYWJlbCA9IFwiXCIg55qE5oOF5Ya1XG5cblxuICAgIGlmIChjZmcubGFiZWwgfHwgY2ZnLmxhYmVsID09PSAnJykge1xuICAgICAgdmFyIGdyb3VwID0gaXRlbS5nZXRDb250YWluZXIoKTtcbiAgICAgIHZhciBfYyA9ICh0aGlzLm1lcmdlU3R5bGUgfHwgdGhpcy5nZXRPcHRpb25zKHt9LCB1cGRhdGVUeXBlKSB8fCB7fSkubGFiZWxDZmcsXG4gICAgICAgICAgbGFiZWxDZmcgPSBfYyA9PT0gdm9pZCAwID8ge30gOiBfYztcbiAgICAgIHZhciBsYWJlbENsYXNzTmFtZV8xID0gdGhpcy5pdGVtVHlwZSArIENMU19MQUJFTF9TVUZGSVg7XG4gICAgICB2YXIgbGFiZWwgPSBncm91cFsnc2hhcGVNYXAnXVtsYWJlbENsYXNzTmFtZV8xXSB8fCBncm91cC5maW5kKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgICAgcmV0dXJuIGVsZS5nZXQoJ2NsYXNzTmFtZScpID09PSBsYWJlbENsYXNzTmFtZV8xO1xuICAgICAgfSk7XG4gICAgICB2YXIgbGFiZWxCZ0NsYXNzbmFtZV8xID0gdGhpcy5pdGVtVHlwZSArIENMU19MQUJFTF9CR19TVUZGSVg7XG4gICAgICB2YXIgbGFiZWxCZyA9IGdyb3VwWydzaGFwZU1hcCddW2xhYmVsQmdDbGFzc25hbWVfMV0gfHwgZ3JvdXAuZmluZChmdW5jdGlvbiAoZWxlKSB7XG4gICAgICAgIHJldHVybiBlbGUuZ2V0KCdjbGFzc05hbWUnKSA9PT0gbGFiZWxCZ0NsYXNzbmFtZV8xO1xuICAgICAgfSk7IC8vIOiLpeS8oOWFpeeahOaWsOmFjee9ruS4reaciSBsYWJlbO+8jO+8iOeUqOaIt+ayoeS8oOWFpeS9huWOn+WFiOaciSBsYWJlbO+8jGxhYmVsIOS5n+S8muacieWAvO+8iVxuXG4gICAgICBpZiAoIWxhYmVsKSB7XG4gICAgICAgIC8vIOiLpeWOn+WFiOS4jeWtmOWcqCBsYWJlbO+8jOWImee7mOWItuS4gOS4quaWsOeahCBsYWJlbFxuICAgICAgICB2YXIgbmV3TGFiZWwgPSB0aGlzLmRyYXdMYWJlbChjZmcsIGdyb3VwKTtcbiAgICAgICAgbmV3TGFiZWwuc2V0KCdjbGFzc05hbWUnLCBsYWJlbENsYXNzTmFtZV8xKTtcbiAgICAgICAgZ3JvdXBbJ3NoYXBlTWFwJ11bbGFiZWxDbGFzc05hbWVfMV0gPSBuZXdMYWJlbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIOiLpeWOn+WFiOWtmOWcqCBsYWJlbO+8jOWImeabtOaWsOagt+W8j+OAguS4jiBnZXRMYWJlbFN0eWxlIOS4jeWQjOWcqOS6jui/memHjOmcgOimgeiejeWQiOW9k+WJjSBsYWJlbCDnmoTmoLflvI9cbiAgICAgICAgLy8g6J6N5ZCIIHN0eWxlIOS7peWklueahOWxnuaAp++8mnBvc2l0aW9uLCBvZmZzZXQsIC4uLlxuICAgICAgICBpZiAoIXVwZGF0ZVR5cGUgfHwgdXBkYXRlVHlwZSA9PT0gJ2Jib3h8bGFiZWwnIHx8IHRoaXMuaXRlbVR5cGUgPT09ICdlZGdlJyAmJiB1cGRhdGVUeXBlICE9PSAnc3R5bGUnKSB7XG4gICAgICAgICAgbGFiZWxDZmcgPSBkZWVwTWl4KGxhYmVsQ2ZnLCBjZmcubGFiZWxDZmcpO1xuICAgICAgICB9IC8vIOiOt+WPluS9jee9ruS/oeaBr1xuXG5cbiAgICAgICAgdmFyIGNhbGN1bGF0ZVN0eWxlID0gdGhpcy5nZXRMYWJlbFN0eWxlQnlQb3NpdGlvbihjZmcsIGxhYmVsQ2ZnLCBncm91cCk7IC8vIOWPliBub2RlTGFiZWzvvIxlZGdlTGFiZWwg55qE6YWN572u6aG5XG5cbiAgICAgICAgdmFyIGNmZ1N0eWxlID0gKF9hID0gY2ZnLmxhYmVsQ2ZnKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Euc3R5bGU7IC8vIGNvbnN0IGNmZ0JnU3R5bGUgPSBsYWJlbENmZy5zdHlsZT8uYmFja2dyb3VuZDtcbiAgICAgICAgLy8g6ZyA6KaB6J6N5ZCI5b2T5YmNXGIgbGFiZWwg55qE5qC35byPIGxhYmVsLmF0dHIoKeOAguS4jeWGjemcgOimgeWFqOWxgC/pu5jorqTmoLflvI/vvIzlm6DkuLrlt7Lnu4/lupTnlKjlnKjlvZPliY3nmoQgbGFiZWwg5LiKXG5cbiAgICAgICAgdmFyIGxhYmVsU3R5bGUgPSBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgY2FsY3VsYXRlU3R5bGUpLCBjZmdTdHlsZSk7XG5cbiAgICAgICAgdmFyIHJvdGF0ZSA9IGxhYmVsU3R5bGUucm90YXRlO1xuICAgICAgICBkZWxldGUgbGFiZWxTdHlsZS5yb3RhdGU7IC8vIOiuoeeulyBsYWJlbCDnmoTml4vovaznn6npmLVcblxuICAgICAgICBpZiAoIWlzTmFOKHJvdGF0ZSkgJiYgcm90YXRlICE9PSAnJykge1xuICAgICAgICAgIC8vIGlmIEcgNC54IGRlZmluZSB0aGUgcm90YXRlQXRTdGFydCwgdXNlIGl0IGRpcmVjdGx5IGluc3RlYWQgb2YgdXNpbmcgdGhlIGZvbGxvd2luZyBjb2Rlc1xuICAgICAgICAgIHZhciByb3RhdGVNYXRyaXggPSBbMSwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMV07XG4gICAgICAgICAgcm90YXRlTWF0cml4ID0gdHJhbnNmb3JtKHJvdGF0ZU1hdHJpeCwgW1sndCcsIC1sYWJlbFN0eWxlLngsIC1sYWJlbFN0eWxlLnldLCBbJ3InLCByb3RhdGVdLCBbJ3QnLCBsYWJlbFN0eWxlLngsIGxhYmVsU3R5bGUueV1dKTtcbiAgICAgICAgICBsYWJlbFN0eWxlLm1hdHJpeCA9IHJvdGF0ZU1hdHJpeDtcbiAgICAgICAgICBsYWJlbC5hdHRyKGxhYmVsU3R5bGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICgoKF9iID0gbGFiZWwuZ2V0TWF0cml4KCkpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYls0XSkgIT09IDEpIHtcbiAgICAgICAgICAgIGxhYmVsLnJlc2V0TWF0cml4KCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbGFiZWwuYXR0cihsYWJlbFN0eWxlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghbGFiZWxCZykge1xuICAgICAgICAgIGlmIChsYWJlbFN0eWxlLmJhY2tncm91bmQpIHtcbiAgICAgICAgICAgIGxhYmVsQmcgPSB0aGlzLmRyYXdMYWJlbEJnKGNmZywgZ3JvdXAsIGxhYmVsKTtcbiAgICAgICAgICAgIGxhYmVsQmcuc2V0KCdjbGFzc25hbWUnLCBsYWJlbEJnQ2xhc3NuYW1lXzEpO1xuICAgICAgICAgICAgZ3JvdXBbJ3NoYXBlTWFwJ11bbGFiZWxCZ0NsYXNzbmFtZV8xXSA9IGxhYmVsQmc7XG4gICAgICAgICAgICBsYWJlbC50b0Zyb250KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGxhYmVsU3R5bGUuYmFja2dyb3VuZCkge1xuICAgICAgICAgIHZhciBjYWxjdWxhdGVCZ1N0eWxlID0gdGhpcy5nZXRMYWJlbEJnU3R5bGVCeVBvc2l0aW9uKGxhYmVsLCBjZmcsIGxhYmVsQ2ZnLCBncm91cCk7XG4gICAgICAgICAgdmFyIGxhYmVsQmdTdHlsZSA9IGNhbGN1bGF0ZUJnU3R5bGU7XG5cbiAgICAgICAgICBpZiAoIWlzTmFOKHJvdGF0ZSkgJiYgcm90YXRlICE9PSAnJykge1xuICAgICAgICAgICAgdmFyIGJnUm90YXRlTWF0cml4ID0gWzEsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDFdO1xuICAgICAgICAgICAgYmdSb3RhdGVNYXRyaXggPSB0cmFuc2Zvcm0oYmdSb3RhdGVNYXRyaXgsIFtbJ3QnLCAtbGFiZWxCZ1N0eWxlLngsIC1sYWJlbEJnU3R5bGUueV0sIFsncicsIHJvdGF0ZV0sIFsndCcsIGxhYmVsQmdTdHlsZS54LCBsYWJlbEJnU3R5bGUueV1dKTtcbiAgICAgICAgICAgIGxhYmVsQmdTdHlsZS5tYXRyaXggPSBiZ1JvdGF0ZU1hdHJpeDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGFiZWxCZy5yZXNldE1hdHJpeCgpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGxhYmVsQmcuYXR0cihsYWJlbEJnU3R5bGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGdyb3VwLnJlbW92ZUNoaWxkKGxhYmVsQmcpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LFxuICAvLyB1cGRhdGUoY2ZnLCBpdGVtKSAvLyDpu5jorqTkuI3lrprkuYlcbiAgYWZ0ZXJVcGRhdGU6IGZ1bmN0aW9uIGFmdGVyVXBkYXRlKGNmZywgaXRlbSkge30sXG5cbiAgLyoqXG4gICAqIOiuvue9ruiKgueCueeahOeKtuaAge+8jOS4u+imgeaYr+S6pOS6kueKtuaAge+8jOS4muWKoeeKtuaAgeivt+WcqCBkcmF3IOaWueazleS4reWunueOsFxuICAgKiDljZXlm77lvaLnmoToioLngrnku4XogIPomZEgc2VsZWN0ZWTjgIFhY3RpdmUg54q25oCB77yM5pyJ5YW25LuW54q25oCB6ZyA5rGC55qE55So5oi36Ieq5bex5aSN5YaZ6L+Z5Liq5pa55rOVXG4gICAqIEBvdmVycmlkZVxuICAgKiBAcGFyYW0gIHtTdHJpbmd9IG5hbWUg54q25oCB5ZCN56ewXG4gICAqIEBwYXJhbSAge1N0cmluZyB8IEJvb2xlYW59IHZhbHVlIOeKtuaAgeWAvFxuICAgKiBAcGFyYW0gIHtHNi5JdGVtfSBpdGVtIOiKgueCuVxuICAgKi9cbiAgc2V0U3RhdGU6IGZ1bmN0aW9uIHNldFN0YXRlKG5hbWUsIHZhbHVlLCBpdGVtKSB7XG4gICAgdmFyIF9hLCBfYjtcblxuICAgIHZhciBfYztcblxuICAgIHZhciBzaGFwZSA9IGl0ZW0uZ2V0KCdrZXlTaGFwZScpO1xuICAgIGlmICghc2hhcGUgfHwgc2hhcGUuZGVzdHJveWVkKSByZXR1cm47XG4gICAgdmFyIHR5cGUgPSBpdGVtLmdldFR5cGUoKTtcbiAgICB2YXIgc3RhdGVOYW1lID0gaXNCb29sZWFuKHZhbHVlKSA/IG5hbWUgOiBuYW1lICsgXCI6XCIgKyB2YWx1ZTtcbiAgICB2YXIgc2hhcGVTdGF0ZVN0eWxlID0gdGhpcy5nZXRTdGF0ZVN0eWxlKHN0YXRlTmFtZSwgaXRlbSk7XG4gICAgdmFyIGl0ZW1TdGF0ZVN0eWxlID0gaXRlbS5nZXRTdGF0ZVN0eWxlKHN0YXRlTmFtZSk7IC8vIGNvbnN0IG9yaWdpblN0eWxlID0gaXRlbS5nZXRPcmlnaW5TdHlsZSgpO1xuICAgIC8vIOS4jeWFgeiuuOiuvue9ruS4gOS4quS4jeWtmOWcqOeahOeKtuaAgVxuXG4gICAgaWYgKCFpdGVtU3RhdGVTdHlsZSAmJiAhc2hhcGVTdGF0ZVN0eWxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyDopoHorr7nva7miJblj5bmtojnmoTnirbmgIHnmoTmoLflvI9cbiAgICAvLyDlvZPmsqHmnIkgc3RhdGUg54q25oCB5pe277yM6buY6K6k5L2/55SoIG1vZGVsLnN0YXRlU3R5bGVzIOS4reeahOagt+W8j1xuXG5cbiAgICB2YXIgc3R5bGVzID0gbWl4KHt9LCBpdGVtU3RhdGVTdHlsZSB8fCBzaGFwZVN0YXRlU3R5bGUpO1xuICAgIHZhciBncm91cCA9IGl0ZW0uZ2V0Q29udGFpbmVyKCk7IC8vIOS7juWbvuWFg+e0oOeOsOacieeahOagt+W8j+S4reWIoOmZpOacrOasoeimgeWPlua2iOeahCBzdGF0ZXMg5Lit5a2Y5Zyo55qE5bGe5oCn5YC844CC5L2/55So5a+56LGh5qOA57Si5pu05b+rXG5cbiAgICB2YXIga2VwdEF0dHJzID0ge1xuICAgICAgeDogMSxcbiAgICAgIHk6IDEsXG4gICAgICBjeDogMSxcbiAgICAgIGN5OiAxXG4gICAgfTtcblxuICAgIGlmICh0eXBlID09PSAnY29tYm8nKSB7XG4gICAgICBrZXB0QXR0cnMuciA9IDE7XG4gICAgICBrZXB0QXR0cnMud2lkdGggPSAxO1xuICAgICAga2VwdEF0dHJzLmhlaWdodCA9IDE7XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICB2YXIgX2xvb3BfMiA9IGZ1bmN0aW9uIF9sb29wXzIoa2V5KSB7XG4gICAgICAgIHZhciBfZDtcblxuICAgICAgICB2YXIgc3R5bGUgPSBzdHlsZXNba2V5XTtcblxuICAgICAgICBpZiAoaXNQbGFpbk9iamVjdChzdHlsZSkgJiYgIUFSUk9XUy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgICAgdmFyIHN1YlNoYXBlID0gKChfYyA9IGdyb3VwWydzaGFwZU1hcCddKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Nba2V5XSkgfHwgZ3JvdXAuZmluZChmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuZ2V0KCduYW1lJykgPT09IGtleTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBzdWJTaGFwZSA9PT0gbnVsbCB8fCBzdWJTaGFwZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc3ViU2hhcGUuYXR0cihzdHlsZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8g6Z2e57qv5a+56LGh77yM5YiZ6K6k5Li65piv6K6+572u5YiwIGtleVNoYXBlIOS4iumdoueahFxuICAgICAgICAgIHNoYXBlLmF0dHIoKF9kID0ge30sIF9kW2tleV0gPSBzdHlsZSwgX2QpKTtcbiAgICAgICAgfVxuICAgICAgfTsgLy8gc3R5bGUg5Li66KaB6K6+572u55qE54q25oCB55qE5qC35byPXG5cblxuICAgICAgZm9yICh2YXIga2V5IGluIHN0eWxlcykge1xuICAgICAgICBfbG9vcF8yKGtleSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIOaJgOacieeUn+aViOeahCBzdGF0ZSDnmoTmoLflvI9cbiAgICAgIHZhciBlbmFibGVTdGF0ZXNTdHlsZSA9IGNsb25lQmVzaWRlc0ltZyhpdGVtLmdldEN1cnJlbnRTdGF0ZXNTdHlsZSgpKTtcbiAgICAgIHZhciBtb2RlbCA9IGl0ZW0uZ2V0TW9kZWwoKTsgLy8g5Y6f5aeL5qC35byPXG5cbiAgICAgIHZhciBvcmlnaW5TdHlsZV8xID0gbWl4KHt9LCBtb2RlbC5zdHlsZSwgY2xvbmVCZXNpZGVzSW1nKGl0ZW0uZ2V0T3JpZ2luU3R5bGUoKSkpO1xuICAgICAgdmFyIGtleVNoYXBlTmFtZV8xID0gc2hhcGUuZ2V0KCduYW1lJyk7IC8vIGNsb25pbmcgIHNoYXBlLmF0dHIoKSwga2V5cy5mb3JFYWNoIHRvIGF2b2lkIGNsb25pbmcgdGhlIGltZyBhdHRyLCB3aGljaCBsZWFkcyB0byBtYXhpbXVtIGNsb25lIGhlYXAgIzIzODNcbiAgICAgIC8vIGNvbnN0IGtleVNoYXBlU3R5bGVzID0gY2xvbmUoc2hhcGUuYXR0cigpKVxuXG4gICAgICB2YXIgc2hhcGVBdHRyc18xID0gc2hhcGUuYXR0cigpO1xuICAgICAgdmFyIGtleVNoYXBlU3R5bGVzXzEgPSB7fTtcbiAgICAgIE9iamVjdC5rZXlzKHNoYXBlQXR0cnNfMSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIGlmIChrZXkgPT09ICdpbWcnKSByZXR1cm47XG4gICAgICAgIHZhciBhdHRyID0gc2hhcGVBdHRyc18xW2tleV07XG5cbiAgICAgICAgaWYgKGF0dHIgJiYgX3R5cGVvZihhdHRyKSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICBrZXlTaGFwZVN0eWxlc18xW2tleV0gPSBjbG9uZShhdHRyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBrZXlTaGFwZVN0eWxlc18xW2tleV0gPSBhdHRyO1xuICAgICAgICB9XG4gICAgICB9KTsgLy8g5bey5pyJ5qC35byPIC0g6KaB5Y+W5raI55qE54q25oCB55qE5qC35byPXG5cbiAgICAgIHZhciBmaWx0ZXREaXNhYmxlU3RhdGVzU3R5bGUgPSB7fTtcblxuICAgICAgdmFyIF9sb29wXzMgPSBmdW5jdGlvbiBfbG9vcF8zKHApIHtcbiAgICAgICAgdmFyIHN0eWxlID0gc3R5bGVzW3BdO1xuXG4gICAgICAgIGlmIChpc1BsYWluT2JqZWN0KHN0eWxlKSAmJiAhQVJST1dTLmluY2x1ZGVzKHApKSB7XG4gICAgICAgICAgdmFyIHN1YlNoYXBlXzEgPSBncm91cFsnc2hhcGVNYXAnXVtwXSB8fCBncm91cC5maW5kKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgICAgICAgIHJldHVybiBlbGUuZ2V0KCduYW1lJykgPT09IHA7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBpZiAoc3ViU2hhcGVfMSkge1xuICAgICAgICAgICAgdmFyIHN1YlNoYXBlU3R5bGVzXzEgPSBjbG9uZUJlc2lkZXNJbWcoc3ViU2hhcGVfMS5hdHRyKCkpO1xuICAgICAgICAgICAgZWFjaChzdHlsZSwgZnVuY3Rpb24gKHYsIGtleSkge1xuICAgICAgICAgICAgICBpZiAocCA9PT0ga2V5U2hhcGVOYW1lXzEgJiYga2V5U2hhcGVTdHlsZXNfMVtrZXldICYmICFrZXB0QXR0cnNba2V5XSkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBrZXlTaGFwZVN0eWxlc18xW2tleV07XG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlXzEgPSBvcmlnaW5TdHlsZV8xW3BdW2tleV0gfHwgU0hBUEVTX0RFRkFVTFRfQVRUUlNbdHlwZV1ba2V5XTtcbiAgICAgICAgICAgICAgICBzaGFwZS5hdHRyKGtleSwgdmFsdWVfMSk7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3ViU2hhcGVTdHlsZXNfMVtrZXldIHx8IHN1YlNoYXBlU3R5bGVzXzFba2V5XSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBzdWJTaGFwZVN0eWxlc18xW2tleV07XG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlXzIgPSBvcmlnaW5TdHlsZV8xW3BdW2tleV0gfHwgU0hBUEVTX0RFRkFVTFRfQVRUUlNbdHlwZV1ba2V5XTtcbiAgICAgICAgICAgICAgICBzdWJTaGFwZV8xLmF0dHIoa2V5LCB2YWx1ZV8yKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBmaWx0ZXREaXNhYmxlU3RhdGVzU3R5bGVbcF0gPSBzdWJTaGFwZVN0eWxlc18xO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoa2V5U2hhcGVTdHlsZXNfMVtwXSAmJiAha2VwdEF0dHJzW3BdKSB7XG4gICAgICAgICAgICBkZWxldGUga2V5U2hhcGVTdHlsZXNfMVtwXTtcbiAgICAgICAgICAgIHZhciB2YWx1ZV8zID0gb3JpZ2luU3R5bGVfMVtwXSB8fCAob3JpZ2luU3R5bGVfMVtrZXlTaGFwZU5hbWVfMV0gPyBvcmlnaW5TdHlsZV8xW2tleVNoYXBlTmFtZV8xXVtwXSA6IHVuZGVmaW5lZCkgfHwgU0hBUEVTX0RFRkFVTFRfQVRUUlNbdHlwZV1bcF07XG4gICAgICAgICAgICBzaGFwZS5hdHRyKHAsIHZhbHVlXzMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTsgLy8gc3R5bGVzIOS4uuimgeWPlua2iOeahOeKtuaAgeeahOagt+W8j1xuXG5cbiAgICAgIGZvciAodmFyIHAgaW4gc3R5bGVzKSB7XG4gICAgICAgIF9sb29wXzMocCk7XG4gICAgICB9IC8vIOS7juWbvuWFg+e0oOeOsOacieeahOagt+W8j+S4reWIoOmZpOacrOasoeimgeWPlua2iOeahCBzdGF0ZXMg5Lit5a2Y5Zyo55qE5bGe5oCn5YC85ZCO77yMXG4gICAgICAvLyDlpoLmnpwga2V5U2hhcGUg5pyJIG5hbWUg5bGe5oCn77yM5YiZIGZpbHRldERpc2FibGVTdGF0ZXNTdHlsZSDnmoTmoLzlvI/kuLogeyBrZXlTaGFwZU5hbWU6IHt9IH1cbiAgICAgIC8vIOWQpuWImeS4uuaZrumAmuWvueixoVxuXG5cbiAgICAgIGlmICgha2V5U2hhcGVOYW1lXzEpIHtcbiAgICAgICAgbWl4KGZpbHRldERpc2FibGVTdGF0ZXNTdHlsZSwga2V5U2hhcGVTdHlsZXNfMSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmaWx0ZXREaXNhYmxlU3RhdGVzU3R5bGVba2V5U2hhcGVOYW1lXzFdID0ga2V5U2hhcGVTdHlsZXNfMTtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIga2V5IGluIGVuYWJsZVN0YXRlc1N0eWxlKSB7XG4gICAgICAgIGlmIChrZXB0QXR0cnNba2V5XSkgY29udGludWU7XG4gICAgICAgIHZhciBlbmFibGVTdHlsZSA9IGVuYWJsZVN0YXRlc1N0eWxlW2tleV07XG5cbiAgICAgICAgaWYgKCFpc1BsYWluT2JqZWN0KGVuYWJsZVN0eWxlKSB8fCBBUlJPV1MuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICAgIC8vIOaKiuagt+W8j+WxnuaAp21lcmdl5Yiwa2V5U2hhcGXkuK1cbiAgICAgICAgICBpZiAoIWtleVNoYXBlTmFtZV8xKSB7XG4gICAgICAgICAgICBtaXgob3JpZ2luU3R5bGVfMSwgKF9hID0ge30sIF9hW2tleV0gPSBlbmFibGVTdHlsZSwgX2EpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbWl4KG9yaWdpblN0eWxlXzFba2V5U2hhcGVOYW1lXzFdLCAoX2IgPSB7fSwgX2Jba2V5XSA9IGVuYWJsZVN0eWxlLCBfYikpO1xuICAgICAgICAgICAgZGVsZXRlIG9yaWdpblN0eWxlXzFba2V5XTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBkZWxldGUgZW5hYmxlU3RhdGVzU3R5bGVba2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgb3JpZ2luc3R5bGVzID0ge307XG4gICAgICBkZWVwTWl4KG9yaWdpbnN0eWxlcywgb3JpZ2luU3R5bGVfMSwgZmlsdGV0RGlzYWJsZVN0YXRlc1N0eWxlLCBlbmFibGVTdGF0ZXNTdHlsZSk7XG4gICAgICB2YXIga2V5U2hhcGVTZXR0ZWQgPSBmYWxzZTtcblxuICAgICAgdmFyIF9sb29wXzQgPSBmdW5jdGlvbiBfbG9vcF80KG9yaWdpbktleSkge1xuICAgICAgICB2YXIgX2UsIF9mO1xuXG4gICAgICAgIHZhciBzdHlsZSA9IG9yaWdpbnN0eWxlc1tvcmlnaW5LZXldO1xuXG4gICAgICAgIGlmIChpc1BsYWluT2JqZWN0KHN0eWxlKSAmJiAhQVJST1dTLmluY2x1ZGVzKG9yaWdpbktleSkpIHtcbiAgICAgICAgICB2YXIgc3ViU2hhcGUgPSBncm91cFsnc2hhcGVNYXAnXVtvcmlnaW5LZXldIHx8IGdyb3VwLmZpbmQoZnVuY3Rpb24gKGVsZSkge1xuICAgICAgICAgICAgcmV0dXJuIGVsZS5nZXQoJ25hbWUnKSA9PT0gb3JpZ2luS2V5O1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaWYgKHN1YlNoYXBlKSB7XG4gICAgICAgICAgICAvLyBUaGUgdGV4dCdzIHBvc2l0aW9uIGFuZCBtYXRyaXggaXMgbm90IGFsbG93ZWQgdG8gYmUgYWZmZWN0ZWQgYnkgc3RhdGVzXG4gICAgICAgICAgICBpZiAoc3ViU2hhcGUuZ2V0KCd0eXBlJykgPT09ICd0ZXh0Jykge1xuICAgICAgICAgICAgICBkZWxldGUgc3R5bGUueDtcbiAgICAgICAgICAgICAgZGVsZXRlIHN0eWxlLnk7XG4gICAgICAgICAgICAgIGRlbGV0ZSBzdHlsZS5tYXRyaXg7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChvcmlnaW5LZXkgPT09IGtleVNoYXBlTmFtZV8xKSB7XG4gICAgICAgICAgICAgIGlmICh0eXBlID09PSAnY29tYm8nKSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHN0eWxlLnI7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHN0eWxlLndpZHRoO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBzdHlsZS5oZWlnaHQ7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBrZXlTaGFwZVNldHRlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHN1YlNoYXBlLmF0dHIoc3R5bGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICgha2V5U2hhcGVTZXR0ZWQpIHtcbiAgICAgICAgICB2YXIgdmFsdWVfNCA9IHN0eWxlIHx8IFNIQVBFU19ERUZBVUxUX0FUVFJTW3R5cGVdW29yaWdpbktleV07IC8vIOW9k+abtOaWsCBjb21ibyDnirbmgIHml7bvvIzlvZPkuI3lrZjlnKgga2V5U2hhcGVOYW1lIOaXtuWAme+8jOWImeiupOS4uuaYr+iuvue9ruWIsCBrZXlTaGFwZSDkuIrpnaLnmoRcblxuICAgICAgICAgIGlmICh0eXBlID09PSAnY29tYm8nKSB7XG4gICAgICAgICAgICBpZiAoIWtleVNoYXBlTmFtZV8xKSB7XG4gICAgICAgICAgICAgIHNoYXBlLmF0dHIoKF9lID0ge30sIF9lW29yaWdpbktleV0gPSB2YWx1ZV80LCBfZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzaGFwZS5hdHRyKChfZiA9IHt9LCBfZltvcmlnaW5LZXldID0gdmFsdWVfNCwgX2YpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGZvciAodmFyIG9yaWdpbktleSBpbiBvcmlnaW5zdHlsZXMpIHtcbiAgICAgICAgX2xvb3BfNChvcmlnaW5LZXkpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICog6I635Y+W5LiN5ZCM54q25oCB5LiL55qE5qC35byPXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIOeKtuaAgeWQjeensFxuICAgKiBAcGFyYW0ge0l0ZW19IGl0ZW0gTm9kZeaIlkVkZ2XnmoTlrp7kvotcbiAgICogQHJldHVybiB7b2JqZWN0fSDmoLflvI9cbiAgICovXG4gIGdldFN0YXRlU3R5bGU6IGZ1bmN0aW9uIGdldFN0YXRlU3R5bGUobmFtZSwgaXRlbSkge1xuICAgIHZhciBtb2RlbCA9IGl0ZW0uZ2V0TW9kZWwoKTtcbiAgICB2YXIgdHlwZSA9IGl0ZW0uZ2V0VHlwZSgpO1xuXG4gICAgdmFyIF9hID0gdGhpcy5nZXRPcHRpb25zKG1vZGVsKSxcbiAgICAgICAgc3RhdGVTdHlsZXMgPSBfYS5zdGF0ZVN0eWxlcyxcbiAgICAgICAgX2IgPSBfYS5zdHlsZSxcbiAgICAgICAgc3R5bGUgPSBfYiA9PT0gdm9pZCAwID8ge30gOiBfYjtcblxuICAgIHZhciBtb2RlbFN0YXRlU3R5bGUgPSBtb2RlbC5zdGF0ZVN0eWxlcyA/IG1vZGVsLnN0YXRlU3R5bGVzW25hbWVdIDogc3RhdGVTdHlsZXMgJiYgc3RhdGVTdHlsZXNbbmFtZV07XG5cbiAgICBpZiAodHlwZSA9PT0gJ2NvbWJvJykge1xuICAgICAgcmV0dXJuIGNsb25lKG1vZGVsU3RhdGVTdHlsZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1peCh7fSwgc3R5bGUsIG1vZGVsU3RhdGVTdHlsZSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIOiOt+WPluaOp+WItueCuVxuICAgKiBAcGFyYW0gIHtPYmplY3R9IGNmZyDoioLngrnjgIHovrnnmoTphY3nva7poblcbiAgICogQHJldHVybiB7QXJyYXl8bnVsbH0g5o6n5Yi254K555qE5pWw57uELOWmguaenOS4uiBudWxs77yM5YiZ5rKh5pyJ5o6n5Yi254K5XG4gICAqL1xuICBnZXRDb250cm9sUG9pbnRzOiBmdW5jdGlvbiBnZXRDb250cm9sUG9pbnRzKGNmZykge1xuICAgIHJldHVybiBjZmcuY29udHJvbFBvaW50cztcbiAgfSxcblxuICAvKipcbiAgICog6I635Y+W5o6n5Yi254K5XG4gICAqIEBwYXJhbSAge09iamVjdH0gY2ZnIOiKgueCueOAgei+ueeahOmFjee9rumhuVxuICAgKiBAcmV0dXJuIHtBcnJheXxudWxsfSDplJrngrnnmoTmlbDnu4Qs5aaC5p6c5Li6IG51bGzvvIzliJnmsqHmnInplJrngrlcbiAgICovXG4gIGdldEFuY2hvclBvaW50czogZnVuY3Rpb24gZ2V0QW5jaG9yUG9pbnRzKGNmZykge1xuICAgIHZhciBfYSwgX2I7XG5cbiAgICB2YXIgYW5jaG9yUG9pbnRzID0gKGNmZyA9PT0gbnVsbCB8fCBjZmcgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNmZy5hbmNob3JQb2ludHMpIHx8ICgoX2EgPSB0aGlzLmdldEN1c3RvbUNvbmZpZyhjZmcpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuYW5jaG9yUG9pbnRzKSB8fCAoKF9iID0gdGhpcy5vcHRpb25zKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuYW5jaG9yUG9pbnRzKTtcbiAgICByZXR1cm4gYW5jaG9yUG9pbnRzO1xuICB9XG59OyIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBpc0FycmF5LCBpc05pbCwgbWl4IH0gZnJvbSAnQGFudHYvdXRpbCc7XG5pbXBvcnQgeyBmb3JtYXRQYWRkaW5nIH0gZnJvbSAnLi4vdXRpbC9iYXNlJztcbmltcG9ydCBHbG9iYWwgZnJvbSAnLi4vZ2xvYmFsJztcbmltcG9ydCBTaGFwZSBmcm9tICcuL3NoYXBlJztcbmltcG9ydCB7IHNoYXBlQmFzZSB9IGZyb20gJy4vc2hhcGVCYXNlJztcbnZhciBzaW5nbGVOb2RlID0ge1xuICBpdGVtVHlwZTogJ25vZGUnLFxuICAvLyDljZXkuKrlm77lvaLnmoTnsbvlnotcbiAgc2hhcGVUeXBlOiAnc2luZ2xlLW5vZGUnLFxuXG4gIC8qKlxuICAgKiDmlofmnKznm7jlr7nlm77lvaLnmoTkvY3nva7vvIzpu5jorqTku6XkuK3lv4PngrlcbiAgICog5L2N572u5YyF5ous77yaIHRvcCwgYm90dG9tLCBsZWZ0LCByaWdodCwgY2VudGVyXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqL1xuICBsYWJlbFBvc2l0aW9uOiAnY2VudGVyJyxcblxuICAvKipcbiAgICog5paH5pys55u45a+55YGP56e777yM5b2TIGxhYmVsUG9zaXRpb24g5LiN5Li6IGNlbnRlciDml7bmnInmlYhcbiAgICogQHR5cGUge051bWJlcn1cbiAgICovXG4gIG9mZnNldDogR2xvYmFsLm5vZGVMYWJlbC5vZmZzZXQsXG5cbiAgLyoqXG4gICAqIOiOt+WPluiKgueCueWuvemrmFxuICAgKiBAaW50ZXJuYWwg6L+U5Zue6IqC54K555qE5aSn5bCP77yM5LulIFt3aWR0aCwgaGVpZ2h0XSDnmoTmlrnlvI/nu7TmiqRcbiAgICogQHBhcmFtICB7T2JqZWN0fSBjZmcg6IqC54K555qE6YWN572u6aG5XG4gICAqIEByZXR1cm4ge0FycmF5fSDlrr3pq5hcbiAgICovXG4gIGdldFNpemU6IGZ1bmN0aW9uIGdldFNpemUoY2ZnKSB7XG4gICAgdmFyIF9hO1xuXG4gICAgdmFyIHNpemUgPSAoKF9hID0gdGhpcy5tZXJnZVN0eWxlKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Euc2l6ZSkgfHwgY2ZnLnNpemUgfHwgdGhpcy5nZXRPcHRpb25zKHt9KS5zaXplIHx8IEdsb2JhbC5kZWZhdWx0Tm9kZS5zaXplOyAvLyBHbG9iYWwuZGVmYXVsdE5vZGUuc2l6ZTsgLy8gIFxuICAgIC8vIHNpemUg5piv5pWw57uE77yM5L2G6ZW/5bqm5Li6Me+8jOWImeihpemVv+W6puS4ujJcblxuICAgIGlmIChpc0FycmF5KHNpemUpICYmIHNpemUubGVuZ3RoID09PSAxKSB7XG4gICAgICBzaXplID0gW3NpemVbMF0sIHNpemVbMF1dO1xuICAgIH0gLy8gc2l6ZSDkuLrmlbDlrZfvvIzliJnovazmjaLkuLrmlbDnu4RcblxuXG4gICAgaWYgKCFpc0FycmF5KHNpemUpKSB7XG4gICAgICBzaXplID0gW3NpemUsIHNpemVdO1xuICAgIH1cblxuICAgIHJldHVybiBzaXplO1xuICB9LFxuICAvLyDnp4HmnInmlrnms5XvvIzkuI3luIzmnJvmianlsZXnmoToioLngrnlpI3lhpnov5nkuKrmlrnms5VcbiAgZ2V0TGFiZWxTdHlsZUJ5UG9zaXRpb246IGZ1bmN0aW9uIGdldExhYmVsU3R5bGVCeVBvc2l0aW9uKGNmZywgbGFiZWxDZmcpIHtcbiAgICB2YXIgbGFiZWxQb3NpdGlvbiA9IGxhYmVsQ2ZnLnBvc2l0aW9uIHx8IHRoaXMubGFiZWxQb3NpdGlvbjsgLy8g6buY6K6k55qE5L2N572u77yI5pyA5Y+v6IO955qE5oOF5b2i77yJ77yM5omA5Lul5pS+5Zyo5pyA5LiK6Z2iXG5cbiAgICBpZiAobGFiZWxQb3NpdGlvbiA9PT0gJ2NlbnRlcicpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHg6IDAsXG4gICAgICAgIHk6IDAsXG4gICAgICAgIHRleHQ6IGNmZy5sYWJlbFxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgb2Zmc2V0ID0gbGFiZWxDZmcub2Zmc2V0O1xuXG4gICAgaWYgKGlzTmlsKG9mZnNldCkpIHtcbiAgICAgIC8vIOiAg+iZkSBvZmZzZXQgPSAwIOeahOWcuuaZr++8jOS4jeeUqOeUqCBsYWJlbENmZy5vZmZzZXQgfHwgR2xvYmFsLm5vZGVMYWJlbC5vZmZzZXRcbiAgICAgIG9mZnNldCA9IHRoaXMub2Zmc2V0OyAvLyDkuI3lsYXkuK3ml7bnmoTlgY/np7vph49cbiAgICB9XG5cbiAgICB2YXIgc2l6ZSA9IHRoaXMuZ2V0U2l6ZShjZmcpO1xuICAgIHZhciBzdHlsZTtcblxuICAgIHN3aXRjaCAobGFiZWxQb3NpdGlvbikge1xuICAgICAgY2FzZSAndG9wJzpcbiAgICAgICAgc3R5bGUgPSB7XG4gICAgICAgICAgeDogMCxcbiAgICAgICAgICB5OiAtc2l6ZVsxXSAvIDIgLSBvZmZzZXQsXG4gICAgICAgICAgdGV4dEJhc2VsaW5lOiAnYm90dG9tJyAvLyDmlofmnKzlnKjlm77lvaLnmoTkuIrpnaJcblxuICAgICAgICB9O1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnYm90dG9tJzpcbiAgICAgICAgc3R5bGUgPSB7XG4gICAgICAgICAgeDogMCxcbiAgICAgICAgICB5OiBzaXplWzFdIC8gMiArIG9mZnNldCxcbiAgICAgICAgICB0ZXh0QmFzZWxpbmU6ICd0b3AnXG4gICAgICAgIH07XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdsZWZ0JzpcbiAgICAgICAgc3R5bGUgPSB7XG4gICAgICAgICAgeDogLXNpemVbMF0gLyAyIC0gb2Zmc2V0LFxuICAgICAgICAgIHk6IDAsXG4gICAgICAgICAgdGV4dEFsaWduOiAncmlnaHQnXG4gICAgICAgIH07XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBzdHlsZSA9IHtcbiAgICAgICAgICB4OiBzaXplWzBdIC8gMiArIG9mZnNldCxcbiAgICAgICAgICB5OiAwLFxuICAgICAgICAgIHRleHRBbGlnbjogJ2xlZnQnXG4gICAgICAgIH07XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHN0eWxlLnRleHQgPSBjZmcubGFiZWw7XG4gICAgcmV0dXJuIHN0eWxlO1xuICB9LFxuICBnZXRMYWJlbEJnU3R5bGVCeVBvc2l0aW9uOiBmdW5jdGlvbiBnZXRMYWJlbEJnU3R5bGVCeVBvc2l0aW9uKGxhYmVsLCBjZmcsIGxhYmVsQ2ZnLCBncm91cCkge1xuICAgIHZhciBfYTtcblxuICAgIGlmICghbGFiZWwpIHJldHVybiB7fTtcbiAgICB2YXIgYmFja2dyb3VuZFN0eWxlID0gKF9hID0gbGFiZWxDZmcuc3R5bGUpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5iYWNrZ3JvdW5kO1xuICAgIGlmICghYmFja2dyb3VuZFN0eWxlKSByZXR1cm4ge307XG4gICAgdmFyIGJib3ggPSBsYWJlbC5nZXRCQm94KCk7XG4gICAgdmFyIHBhZGRpbmcgPSBmb3JtYXRQYWRkaW5nKGJhY2tncm91bmRTdHlsZS5wYWRkaW5nKTtcbiAgICB2YXIgYmFja2dyb3VuZFdpZHRoID0gYmJveC53aWR0aCArIHBhZGRpbmdbMV0gKyBwYWRkaW5nWzNdO1xuICAgIHZhciBiYWNrZ3JvdW5kSGVpZ2h0ID0gYmJveC5oZWlnaHQgKyBwYWRkaW5nWzBdICsgcGFkZGluZ1syXTtcbiAgICByZXR1cm4gX19hc3NpZ24oX19hc3NpZ24oe1xuICAgICAgeDogYmJveC5taW5YIC0gcGFkZGluZ1szXSxcbiAgICAgIHk6IGJib3gubWluWSAtIHBhZGRpbmdbMF1cbiAgICB9LCBiYWNrZ3JvdW5kU3R5bGUpLCB7XG4gICAgICB3aWR0aDogYmFja2dyb3VuZFdpZHRoLFxuICAgICAgaGVpZ2h0OiBiYWNrZ3JvdW5kSGVpZ2h0XG4gICAgfSk7XG4gIH0sXG4gIGRyYXdTaGFwZTogZnVuY3Rpb24gZHJhd1NoYXBlKGNmZywgZ3JvdXApIHtcbiAgICB2YXIgc2hhcGVUeXBlID0gdGhpcy5zaGFwZVR5cGU7IC8vIHx8IHRoaXMudHlwZe+8jOmDveW3sue7j+WKoOS6hiBzaGFwZVR5cGVcblxuICAgIHZhciBzdHlsZSA9IHRoaXMuZ2V0U2hhcGVTdHlsZShjZmcpO1xuICAgIHZhciBzaGFwZSA9IGdyb3VwLmFkZFNoYXBlKHNoYXBlVHlwZSwge1xuICAgICAgYXR0cnM6IHN0eWxlLFxuICAgICAgZHJhZ2dhYmxlOiB0cnVlLFxuICAgICAgbmFtZTogJ25vZGUtc2hhcGUnXG4gICAgfSk7XG4gICAgZ3JvdXBbJ3NoYXBlTWFwJ11bJ25vZGUtc2hhcGUnXSA9IHNoYXBlO1xuICAgIHJldHVybiBzaGFwZTtcbiAgfSxcblxuICAvKipcbiAgICog5pu05pawbGlua1BvaW50c1xuICAgKiBAcGFyYW0ge09iamVjdH0gY2ZnIOiKgueCueaVsOaNrumFjee9rumhuVxuICAgKiBAcGFyYW0ge0dyb3VwfSBncm91cCBJdGVt5omA5Zyo55qEZ3JvdXBcbiAgICovXG4gIHVwZGF0ZUxpbmtQb2ludHM6IGZ1bmN0aW9uIHVwZGF0ZUxpbmtQb2ludHMoY2ZnLCBncm91cCkge1xuICAgIHZhciBkZWZhdWx0TGlua1BvaW50cyA9ICh0aGlzLm1lcmdlU3R5bGUgfHwgdGhpcy5nZXRPcHRpb25zKGNmZykpLmxpbmtQb2ludHM7XG4gICAgdmFyIG1hcmtMZWZ0ID0gZ3JvdXBbJ3NoYXBlTWFwJ11bJ2xpbmstcG9pbnQtbGVmdCddIHx8IGdyb3VwLmZpbmQoZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBlbGVtZW50LmdldCgnY2xhc3NOYW1lJykgPT09ICdsaW5rLXBvaW50LWxlZnQnO1xuICAgIH0pO1xuICAgIHZhciBtYXJrUmlnaHQgPSBncm91cFsnc2hhcGVNYXAnXVsnbGluay1wb2ludC1yaWdodCddIHx8IGdyb3VwLmZpbmQoZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBlbGVtZW50LmdldCgnY2xhc3NOYW1lJykgPT09ICdsaW5rLXBvaW50LXJpZ2h0JztcbiAgICB9KTtcbiAgICB2YXIgbWFya1RvcCA9IGdyb3VwWydzaGFwZU1hcCddWydsaW5rLXBvaW50LXRvcCddIHx8IGdyb3VwLmZpbmQoZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBlbGVtZW50LmdldCgnY2xhc3NOYW1lJykgPT09ICdsaW5rLXBvaW50LXRvcCc7XG4gICAgfSk7XG4gICAgdmFyIG1hcmtCb3R0b20gPSBncm91cFsnc2hhcGVNYXAnXVsnbGluay1wb2ludC1ib3R0b20nXSB8fCBncm91cC5maW5kKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICByZXR1cm4gZWxlbWVudC5nZXQoJ2NsYXNzTmFtZScpID09PSAnbGluay1wb2ludC1ib3R0b20nO1xuICAgIH0pO1xuICAgIHZhciBjdXJyZW50TGlua1BvaW50cztcblxuICAgIGlmIChtYXJrTGVmdCkge1xuICAgICAgY3VycmVudExpbmtQb2ludHMgPSBtYXJrTGVmdC5hdHRyKCk7XG4gICAgfVxuXG4gICAgaWYgKG1hcmtSaWdodCAmJiAhY3VycmVudExpbmtQb2ludHMpIHtcbiAgICAgIGN1cnJlbnRMaW5rUG9pbnRzID0gbWFya1JpZ2h0LmF0dHIoKTtcbiAgICB9XG5cbiAgICBpZiAobWFya1RvcCAmJiAhY3VycmVudExpbmtQb2ludHMpIHtcbiAgICAgIGN1cnJlbnRMaW5rUG9pbnRzID0gbWFya1RvcC5hdHRyKCk7XG4gICAgfVxuXG4gICAgaWYgKG1hcmtCb3R0b20gJiYgIWN1cnJlbnRMaW5rUG9pbnRzKSB7XG4gICAgICBjdXJyZW50TGlua1BvaW50cyA9IG1hcmtCb3R0b20uYXR0cigpO1xuICAgIH1cblxuICAgIGlmICghY3VycmVudExpbmtQb2ludHMpIGN1cnJlbnRMaW5rUG9pbnRzID0gZGVmYXVsdExpbmtQb2ludHM7XG4gICAgdmFyIGxpbmtQb2ludHMgPSBtaXgoe30sIGN1cnJlbnRMaW5rUG9pbnRzLCBjZmcubGlua1BvaW50cyk7XG4gICAgdmFyIG1hcmtGaWxsID0gbGlua1BvaW50cy5maWxsLFxuICAgICAgICBtYXJrU3Ryb2tlID0gbGlua1BvaW50cy5zdHJva2UsXG4gICAgICAgIGJvcmRlcldpZHRoID0gbGlua1BvaW50cy5saW5lV2lkdGg7XG4gICAgdmFyIG1hcmtTaXplID0gbGlua1BvaW50cy5zaXplIC8gMjtcbiAgICBpZiAoIW1hcmtTaXplKSBtYXJrU2l6ZSA9IGxpbmtQb2ludHMucjtcblxuICAgIHZhciBfYSA9IGNmZy5saW5rUG9pbnRzID8gY2ZnLmxpbmtQb2ludHMgOiB7XG4gICAgICBsZWZ0OiB1bmRlZmluZWQsXG4gICAgICByaWdodDogdW5kZWZpbmVkLFxuICAgICAgdG9wOiB1bmRlZmluZWQsXG4gICAgICBib3R0b206IHVuZGVmaW5lZFxuICAgIH0sXG4gICAgICAgIGxlZnQgPSBfYS5sZWZ0LFxuICAgICAgICByaWdodCA9IF9hLnJpZ2h0LFxuICAgICAgICB0b3AgPSBfYS50b3AsXG4gICAgICAgIGJvdHRvbSA9IF9hLmJvdHRvbTtcblxuICAgIHZhciBzaXplID0gdGhpcy5nZXRTaXplKGNmZyk7XG4gICAgdmFyIHdpZHRoID0gc2l6ZVswXTtcbiAgICB2YXIgaGVpZ2h0ID0gc2l6ZVsxXTtcbiAgICB2YXIgc3R5bGVzID0ge1xuICAgICAgcjogbWFya1NpemUsXG4gICAgICBmaWxsOiBtYXJrRmlsbCxcbiAgICAgIHN0cm9rZTogbWFya1N0cm9rZSxcbiAgICAgIGxpbmVXaWR0aDogYm9yZGVyV2lkdGhcbiAgICB9O1xuXG4gICAgaWYgKG1hcmtMZWZ0KSB7XG4gICAgICBpZiAoIWxlZnQgJiYgbGVmdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG1hcmtMZWZ0LnJlbW92ZSgpO1xuICAgICAgICBkZWxldGUgZ3JvdXBbJ3NoYXBlTWFwJ11bJ2xpbmstcG9pbnQtbGVmdCddO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWFya0xlZnQuYXR0cihfX2Fzc2lnbihfX2Fzc2lnbih7fSwgc3R5bGVzKSwge1xuICAgICAgICAgIHg6IC13aWR0aCAvIDIsXG4gICAgICAgICAgeTogMFxuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChsZWZ0KSB7XG4gICAgICB2YXIgbmFtZV8xID0gJ2xpbmstcG9pbnQtbGVmdCc7XG4gICAgICBncm91cFsnc2hhcGVNYXAnXVtuYW1lXzFdID0gZ3JvdXAuYWRkU2hhcGUoJ2NpcmNsZScsIHtcbiAgICAgICAgYXR0cnM6IF9fYXNzaWduKF9fYXNzaWduKHt9LCBzdHlsZXMpLCB7XG4gICAgICAgICAgeDogLXdpZHRoIC8gMixcbiAgICAgICAgICB5OiAwXG4gICAgICAgIH0pLFxuICAgICAgICBjbGFzc05hbWU6IG5hbWVfMSxcbiAgICAgICAgbmFtZTogbmFtZV8xLFxuICAgICAgICBpc0FuY2hvclBvaW50OiB0cnVlXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAobWFya1JpZ2h0KSB7XG4gICAgICBpZiAoIXJpZ2h0ICYmIHJpZ2h0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbWFya1JpZ2h0LnJlbW92ZSgpO1xuICAgICAgICBkZWxldGUgZ3JvdXBbJ3NoYXBlTWFwJ11bJ2xpbmstcG9pbnQtcmlnaHQnXTtcbiAgICAgIH1cblxuICAgICAgbWFya1JpZ2h0LmF0dHIoX19hc3NpZ24oX19hc3NpZ24oe30sIHN0eWxlcyksIHtcbiAgICAgICAgeDogd2lkdGggLyAyLFxuICAgICAgICB5OiAwXG4gICAgICB9KSk7XG4gICAgfSBlbHNlIGlmIChyaWdodCkge1xuICAgICAgdmFyIG5hbWVfMiA9ICdsaW5rLXBvaW50LXJpZ2h0JztcbiAgICAgIGdyb3VwWydzaGFwZU1hcCddW25hbWVfMl0gPSBncm91cC5hZGRTaGFwZSgnY2lyY2xlJywge1xuICAgICAgICBhdHRyczogX19hc3NpZ24oX19hc3NpZ24oe30sIHN0eWxlcyksIHtcbiAgICAgICAgICB4OiB3aWR0aCAvIDIsXG4gICAgICAgICAgeTogMFxuICAgICAgICB9KSxcbiAgICAgICAgY2xhc3NOYW1lOiBuYW1lXzIsXG4gICAgICAgIG5hbWU6IG5hbWVfMixcbiAgICAgICAgaXNBbmNob3JQb2ludDogdHJ1ZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKG1hcmtUb3ApIHtcbiAgICAgIGlmICghdG9wICYmIHRvcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG1hcmtUb3AucmVtb3ZlKCk7XG4gICAgICAgIGRlbGV0ZSBncm91cFsnc2hhcGVNYXAnXVsnbGluay1wb2ludC10b3AnXTtcbiAgICAgIH1cblxuICAgICAgbWFya1RvcC5hdHRyKF9fYXNzaWduKF9fYXNzaWduKHt9LCBzdHlsZXMpLCB7XG4gICAgICAgIHg6IDAsXG4gICAgICAgIHk6IC1oZWlnaHQgLyAyXG4gICAgICB9KSk7XG4gICAgfSBlbHNlIGlmICh0b3ApIHtcbiAgICAgIHZhciBuYW1lXzMgPSAnbGluay1wb2ludC10b3AnO1xuICAgICAgZ3JvdXBbJ3NoYXBlTWFwJ11bbmFtZV8zXSA9IGdyb3VwLmFkZFNoYXBlKCdjaXJjbGUnLCB7XG4gICAgICAgIGF0dHJzOiBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgc3R5bGVzKSwge1xuICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgeTogLWhlaWdodCAvIDJcbiAgICAgICAgfSksXG4gICAgICAgIGNsYXNzTmFtZTogbmFtZV8zLFxuICAgICAgICBuYW1lOiBuYW1lXzMsXG4gICAgICAgIGlzQW5jaG9yUG9pbnQ6IHRydWVcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChtYXJrQm90dG9tKSB7XG4gICAgICBpZiAoIWJvdHRvbSAmJiBib3R0b20gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBtYXJrQm90dG9tLnJlbW92ZSgpO1xuICAgICAgICBkZWxldGUgZ3JvdXBbJ3NoYXBlTWFwJ11bJ2xpbmstcG9pbnQtYm90dG9tJ107XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtYXJrQm90dG9tLmF0dHIoX19hc3NpZ24oX19hc3NpZ24oe30sIHN0eWxlcyksIHtcbiAgICAgICAgICB4OiAwLFxuICAgICAgICAgIHk6IGhlaWdodCAvIDJcbiAgICAgICAgfSkpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoYm90dG9tKSB7XG4gICAgICB2YXIgbmFtZV80ID0gJ2xpbmstcG9pbnQtYm90dG9tJztcbiAgICAgIGdyb3VwWydzaGFwZU1hcCddW25hbWVfNF0gPSBncm91cC5hZGRTaGFwZSgnY2lyY2xlJywge1xuICAgICAgICBhdHRyczogX19hc3NpZ24oX19hc3NpZ24oe30sIHN0eWxlcyksIHtcbiAgICAgICAgICB4OiAwLFxuICAgICAgICAgIHk6IGhlaWdodCAvIDJcbiAgICAgICAgfSksXG4gICAgICAgIGNsYXNzTmFtZTogbmFtZV80LFxuICAgICAgICBuYW1lOiBuYW1lXzQsXG4gICAgICAgIGlzQW5jaG9yUG9pbnQ6IHRydWVcbiAgICAgIH0pO1xuICAgIH1cbiAgfSxcbiAgdXBkYXRlU2hhcGU6IGZ1bmN0aW9uIHVwZGF0ZVNoYXBlKGNmZywgaXRlbSwga2V5U2hhcGVTdHlsZSwgaGFzSWNvbiwgdXBkYXRlVHlwZSkge1xuICAgIHZhciBrZXlTaGFwZSA9IGl0ZW0uZ2V0KCdrZXlTaGFwZScpO1xuICAgIGtleVNoYXBlLmF0dHIoX19hc3NpZ24oe30sIGtleVNoYXBlU3R5bGUpKTtcblxuICAgIGlmICghdW5kZWZpbmVkIHx8ICh1cGRhdGVUeXBlID09PSBudWxsIHx8IHVwZGF0ZVR5cGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHVwZGF0ZVR5cGUuaW5jbHVkZXMoJ2xhYmVsJykpKSB7XG4gICAgICB0aGlzLnVwZGF0ZUxhYmVsKGNmZywgaXRlbSwgdXBkYXRlVHlwZSk7XG4gICAgfVxuXG4gICAgaWYgKGhhc0ljb24pIHtcbiAgICAgIHRoaXMudXBkYXRlSWNvbihjZmcsIGl0ZW0pO1xuICAgIH1cbiAgfSxcbiAgdXBkYXRlSWNvbjogZnVuY3Rpb24gdXBkYXRlSWNvbihjZmcsIGl0ZW0pIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdmFyIGdyb3VwID0gaXRlbS5nZXRDb250YWluZXIoKTtcbiAgICB2YXIgaWNvbiA9ICh0aGlzLm1lcmdlU3R5bGUgfHwgdGhpcy5nZXRPcHRpb25zKGNmZykpLmljb247XG4gICAgdmFyIHNob3cgPSAoY2ZnLmljb24gPyBjZmcuaWNvbiA6IHtcbiAgICAgIHNob3c6IHVuZGVmaW5lZFxuICAgIH0pLnNob3c7XG4gICAgdmFyIGljb25TaGFwZSA9IGdyb3VwWydzaGFwZU1hcCddW3RoaXMudHlwZSArIFwiLWljb25cIl0gfHwgZ3JvdXAuZmluZChmdW5jdGlvbiAoZWxlKSB7XG4gICAgICByZXR1cm4gZWxlLmdldCgnbmFtZScpID09PSBfdGhpcy50eXBlICsgXCItaWNvblwiO1xuICAgIH0pO1xuXG4gICAgaWYgKGljb25TaGFwZSkge1xuICAgICAgLy8g6Iul5Y6f5YWI5a2Y5ZyoIGljb25cbiAgICAgIGlmIChzaG93IHx8IHNob3cgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyDoi6XkvKDlhaUgc2hvdzogdHJ1ZSwg5oiW5rKh5pyJ6K6+572u77yM5YiZ5pu05paw5Y6f5pyJ55qEIGljb24g5qC35byPXG4gICAgICAgIHZhciBpY29uQ29uZmlnID0gbWl4KHt9LCBpY29uU2hhcGUuYXR0cigpLCBpY29uKTtcbiAgICAgICAgdmFyIF9hID0gaWNvbkNvbmZpZy53aWR0aCxcbiAgICAgICAgICAgIHcgPSBfYSA9PT0gdm9pZCAwID8gMjAgOiBfYSxcbiAgICAgICAgICAgIF9iID0gaWNvbkNvbmZpZy5oZWlnaHQsXG4gICAgICAgICAgICBoID0gX2IgPT09IHZvaWQgMCA/IDIwIDogX2I7XG4gICAgICAgIGljb25TaGFwZS5hdHRyKF9fYXNzaWduKF9fYXNzaWduKHt9LCBpY29uQ29uZmlnKSwge1xuICAgICAgICAgIHg6IC13IC8gMixcbiAgICAgICAgICB5OiAtaCAvIDJcbiAgICAgICAgfSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8g6Iul5Lyg5YWl5LqGIHNob3c6IGZhbHNlIOWImeWIoOmZpOWOn+WFiOeahCBpY29uXG4gICAgICAgIGljb25TaGFwZS5yZW1vdmUoKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHNob3cpIHtcbiAgICAgIC8vIOWmguaenOWOn+WFiOS4jeWtmOWcqCBpY29u77yM5L2G5Lyg5YWl5LqGIHNob3c6IHRydWXvvIzliJnmlrDlop4gaWNvblxuICAgICAgdmFyIHcgPSBpY29uLndpZHRoLFxuICAgICAgICAgIGggPSBpY29uLmhlaWdodDtcbiAgICAgIHZhciBuYW1lXzUgPSB0aGlzLnR5cGUgKyBcIi1pY29uXCI7XG4gICAgICBncm91cFsnc2hhcGVNYXAnXVtuYW1lXzVdID0gZ3JvdXAuYWRkU2hhcGUoJ2ltYWdlJywge1xuICAgICAgICBhdHRyczogX19hc3NpZ24oX19hc3NpZ24oe30sIGljb24pLCB7XG4gICAgICAgICAgeDogLXcgLyAyLFxuICAgICAgICAgIHk6IC1oIC8gMlxuICAgICAgICB9KSxcbiAgICAgICAgY2xhc3NOYW1lOiBuYW1lXzUsXG4gICAgICAgIG5hbWU6IG5hbWVfNVxuICAgICAgfSk7IC8vIHRvIGVuc3VyZSB0aGUgbGFiZWwgaXMgb24gdGhlIHRvcCBvZiBhbGwgdGhlIHNoYXBlc1xuXG4gICAgICB2YXIgbGFiZWxTaGFwZSA9IGdyb3VwWydzaGFwZU1hcCddWydub2RlLWxhYmVsJ10gfHwgZ3JvdXAuZmluZChmdW5jdGlvbiAoZWxlKSB7XG4gICAgICAgIHJldHVybiBlbGUuZ2V0KCduYW1lJykgPT09ICdub2RlLWxhYmVsJztcbiAgICAgIH0pO1xuXG4gICAgICBpZiAobGFiZWxTaGFwZSkge1xuICAgICAgICBsYWJlbFNoYXBlLnRvRnJvbnQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5cbnZhciBzaW5nbGVOb2RlRGVmID0gX19hc3NpZ24oX19hc3NpZ24oe30sIHNoYXBlQmFzZSksIHNpbmdsZU5vZGUpO1xuXG5TaGFwZS5yZWdpc3Rlck5vZGUoJ3NpbmdsZS1ub2RlJywgc2luZ2xlTm9kZURlZik7IiwiLyoqXG4gKiBAZmlsZU92ZXJ2aWV3IOiHquWumuS5iei+uVxuICogQGRlc2NyaXB0aW9uIOiHquWumuS5iei+ueS4reacieWkp+mHj+mAu+i+keWQjOiHquWumuS5ieiKgueCuemHjeWkje+8jOiZveeEtuWPr+S7peaPkOWPluaIkOS4uiBtaXhpbiDvvIzkvYbmmK/ogIPomZHliLDku6PnoIHnmoTlj6/or7vmgKfvvIzov5jmmK/ljZXni6zlrp7njrDjgIJcbiAqL1xuaW1wb3J0IHsgX19hc3NpZ24gfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGRlZXBNaXgsIG1peCwgZWFjaCwgaXNOaWwsIGlzTnVtYmVyLCBpc0FycmF5IH0gZnJvbSAnQGFudHYvdXRpbCc7XG5pbXBvcnQgeyBnZXRMYWJlbFBvc2l0aW9uLCBnZXRMb29wQ2ZncyB9IGZyb20gJy4uL3V0aWwvZ3JhcGhpYyc7XG5pbXBvcnQgeyBkaXN0YW5jZSwgZ2V0Q2lyY2xlQ2VudGVyQnlQb2ludHMgfSBmcm9tICcuLi91dGlsL21hdGgnO1xuaW1wb3J0IHsgZ2V0Q29udHJvbFBvaW50LCBnZXRTcGxpbmUgfSBmcm9tICcuLi91dGlsL3BhdGgnO1xuaW1wb3J0IEdsb2JhbCBmcm9tICcuLi9nbG9iYWwnO1xuaW1wb3J0IFNoYXBlIGZyb20gJy4vc2hhcGUnO1xuaW1wb3J0IHsgc2hhcGVCYXNlLCBDTFNfTEFCRUxfQkdfU1VGRklYIH0gZnJvbSAnLi9zaGFwZUJhc2UnO1xudmFyIENMU19TSEFQRSA9ICdlZGdlLXNoYXBlJzsgLy8gc3RhcnQsZW5kIOWAkue9ru+8jGNlbnRlciDkuI3lj5hcblxuZnVuY3Rpb24gcmV2ZXJ0QWxpZ24obGFiZWxQb3NpdGlvbikge1xuICB2YXIgdGV4dEFsaWduID0gbGFiZWxQb3NpdGlvbjtcblxuICBpZiAobGFiZWxQb3NpdGlvbiA9PT0gJ3N0YXJ0Jykge1xuICAgIHRleHRBbGlnbiA9ICdlbmQnO1xuICB9IGVsc2UgaWYgKGxhYmVsUG9zaXRpb24gPT09ICdlbmQnKSB7XG4gICAgdGV4dEFsaWduID0gJ3N0YXJ0JztcbiAgfVxuXG4gIHJldHVybiB0ZXh0QWxpZ247XG59XG5cbnZhciBzaW5nbGVFZGdlID0ge1xuICBpdGVtVHlwZTogJ2VkZ2UnLFxuXG4gIC8qKlxuICAgKiDmlofmnKznmoTkvY3nva5cbiAgICogQHR5cGUge1N0cmluZ31cbiAgICovXG4gIGxhYmVsUG9zaXRpb246ICdjZW50ZXInLFxuXG4gIC8qKlxuICAgKiDmlofmnKznmoQgeCDlgY/np7tcbiAgICogQHR5cGUge051bWJlcn1cbiAgICovXG4gIHJlZlg6IDAsXG5cbiAgLyoqXG4gICAqIOaWh+acrOeahCB5IOWBj+enu1xuICAgKiBAdHlwZSB7TnVtYmVyfVxuICAgKi9cbiAgcmVmWTogMCxcblxuICAvKipcbiAgICog5paH5pys5piv5ZCm6Lef552A57q/6Ieq5Yqo5peL6L2s77yM6buY6K6kIGZhbHNlXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKi9cbiAgbGFiZWxBdXRvUm90YXRlOiBmYWxzZSxcbiAgLy8g6Ieq5a6a5LmJ6L655pe255qE6YWN572uXG4gIG9wdGlvbnM6IHtcbiAgICBzaXplOiBHbG9iYWwuZGVmYXVsdEVkZ2Uuc2l6ZSxcbiAgICBzdHlsZToge1xuICAgICAgeDogMCxcbiAgICAgIHk6IDAsXG4gICAgICBzdHJva2U6IEdsb2JhbC5kZWZhdWx0RWRnZS5zdHlsZS5zdHJva2UsXG4gICAgICBsaW5lQXBwZW5kV2lkdGg6IEdsb2JhbC5kZWZhdWx0RWRnZS5zdHlsZS5saW5lQXBwZW5kV2lkdGhcbiAgICB9LFxuICAgIGxhYmVsQ2ZnOiB7XG4gICAgICBzdHlsZToge1xuICAgICAgICBmaWxsOiBHbG9iYWwuZWRnZUxhYmVsLnN0eWxlLmZpbGwsXG4gICAgICAgIGZvbnRTaXplOiBHbG9iYWwuZWRnZUxhYmVsLnN0eWxlLmZvbnRTaXplLFxuICAgICAgICBmb250RmFtaWx5OiBHbG9iYWwud2luZG93Rm9udEZhbWlseVxuICAgICAgfVxuICAgIH0sXG4gICAgc3RhdGVTdHlsZXM6IF9fYXNzaWduKHt9LCBHbG9iYWwuZWRnZVN0YXRlU3R5bGVzKVxuICB9LFxuXG4gIC8qKlxuICAgKiDojrflj5bovrnnmoQgcGF0aFxuICAgKiBAaW50ZXJuYWwg5L6b5omp5bGV55qE6L656KaG55uWXG4gICAqIEBwYXJhbSAge0FycmF5fSBwb2ludHMg5p6E5oiQ6L6555qE54K555qE6ZuG5ZCIXG4gICAqIEByZXR1cm4ge0FycmF5fSDmnoTmiJAgcGF0aCDnmoTmlbDnu4RcbiAgICovXG4gIGdldFBhdGg6IGZ1bmN0aW9uIGdldFBhdGgocG9pbnRzKSB7XG4gICAgdmFyIHBhdGggPSBbXTtcbiAgICBlYWNoKHBvaW50cywgZnVuY3Rpb24gKHBvaW50LCBpbmRleCkge1xuICAgICAgaWYgKGluZGV4ID09PSAwKSB7XG4gICAgICAgIHBhdGgucHVzaChbJ00nLCBwb2ludC54LCBwb2ludC55XSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYXRoLnB1c2goWydMJywgcG9pbnQueCwgcG9pbnQueV0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBwYXRoO1xuICB9LFxuICBnZXRTaGFwZVN0eWxlOiBmdW5jdGlvbiBnZXRTaGFwZVN0eWxlKGNmZykge1xuICAgIHZhciBkZWZhdWx0U3R5bGUgPSB0aGlzLm9wdGlvbnMuc3R5bGU7XG4gICAgdmFyIHN0cm9rZVN0eWxlID0ge1xuICAgICAgc3Ryb2tlOiBjZmcuY29sb3JcbiAgICB9OyAvLyDlpoLmnpzorr7nva7kuoZjb2xvcu+8jOWImeimhueblum7mOiupOeahHN0cm9rZeWxnuaAp1xuXG4gICAgdmFyIHN0eWxlID0gbWl4KHt9LCBkZWZhdWx0U3R5bGUsIHN0cm9rZVN0eWxlLCBjZmcuc3R5bGUpO1xuICAgIHZhciBzaXplID0gY2ZnLnNpemUgfHwgR2xvYmFsLmRlZmF1bHRFZGdlLnNpemU7XG4gICAgY2ZnID0gdGhpcy5nZXRQYXRoUG9pbnRzKGNmZyk7XG4gICAgdmFyIHN0YXJ0UG9pbnQgPSBjZmcuc3RhcnRQb2ludCxcbiAgICAgICAgZW5kUG9pbnQgPSBjZmcuZW5kUG9pbnQ7XG4gICAgdmFyIGNvbnRyb2xQb2ludHMgPSB0aGlzLmdldENvbnRyb2xQb2ludHMoY2ZnKTtcbiAgICB2YXIgcG9pbnRzID0gW3N0YXJ0UG9pbnRdOyAvLyDmt7vliqDotbflp4vngrlcbiAgICAvLyDmt7vliqDmjqfliLbngrlcblxuICAgIGlmIChjb250cm9sUG9pbnRzKSB7XG4gICAgICBwb2ludHMgPSBwb2ludHMuY29uY2F0KGNvbnRyb2xQb2ludHMpO1xuICAgIH0gLy8g5re75Yqg57uT5p2f54K5XG5cblxuICAgIHBvaW50cy5wdXNoKGVuZFBvaW50KTtcbiAgICB2YXIgcGF0aCA9IHRoaXMuZ2V0UGF0aChwb2ludHMpO1xuICAgIHZhciBzdHlsZXMgPSBtaXgoe30sIEdsb2JhbC5kZWZhdWx0RWRnZS5zdHlsZSwge1xuICAgICAgc3Ryb2tlOiBHbG9iYWwuZGVmYXVsdEVkZ2UuY29sb3IsXG4gICAgICBsaW5lV2lkdGg6IHNpemUsXG4gICAgICBwYXRoOiBwYXRoXG4gICAgfSwgc3R5bGUpO1xuICAgIHJldHVybiBzdHlsZXM7XG4gIH0sXG4gIHVwZGF0ZVNoYXBlU3R5bGU6IGZ1bmN0aW9uIHVwZGF0ZVNoYXBlU3R5bGUoY2ZnLCBpdGVtLCB1cGRhdGVUeXBlKSB7XG4gICAgdmFyIF9hO1xuXG4gICAgdmFyIGdyb3VwID0gaXRlbS5nZXRDb250YWluZXIoKTsgLy8gY29uc3Qgc3Ryb2tlU3R5bGU6IFNoYXBlU3R5bGUgPSB7XG4gICAgLy8gICBzdHJva2U6IGNmZy5jb2xvcixcbiAgICAvLyB9O1xuXG4gICAgdmFyIHNoYXBlID0gKChfYSA9IGl0ZW0uZ2V0S2V5U2hhcGUpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jYWxsKGl0ZW0pKSB8fCBncm91cFsnc2hhcGVNYXAnXVsnZWRnZS1zaGFwZSddOyAvLyBncm91cC5maW5kKChlbGVtZW50KSA9PiBlbGVtZW50LmdldCgnY2xhc3NOYW1lJykgPT09ICdlZGdlLXNoYXBlJyk7XG5cbiAgICB2YXIgc2l6ZSA9IGNmZy5zaXplO1xuICAgIGNmZyA9IHRoaXMuZ2V0UGF0aFBvaW50cyhjZmcpO1xuICAgIHZhciBzdGFydFBvaW50ID0gY2ZnLnN0YXJ0UG9pbnQsXG4gICAgICAgIGVuZFBvaW50ID0gY2ZnLmVuZFBvaW50O1xuICAgIHZhciBjb250cm9sUG9pbnRzID0gdGhpcy5nZXRDb250cm9sUG9pbnRzKGNmZyk7IC8vIHx8IGNmZy5jb250cm9sUG9pbnRzO1xuXG4gICAgdmFyIHBvaW50cyA9IFtzdGFydFBvaW50XTsgLy8g5re75Yqg6LW35aeL54K5XG4gICAgLy8g5re75Yqg5o6n5Yi254K5XG5cbiAgICBpZiAoY29udHJvbFBvaW50cykge1xuICAgICAgcG9pbnRzID0gcG9pbnRzLmNvbmNhdChjb250cm9sUG9pbnRzKTtcbiAgICB9IC8vIOa3u+WKoOe7k+adn+eCuVxuXG5cbiAgICBwb2ludHMucHVzaChlbmRQb2ludCk7XG4gICAgdmFyIGN1cnJlbnRBdHRyID0gc2hhcGUuYXR0cigpOyAvLyBjb25zdCBwcmV2aW91c1N0eWxlID0gbWl4KHt9LCBzdHJva2VTdHlsZSwgY3VycmVudEF0dHIsIGNmZy5zdHlsZSk7XG5cbiAgICB2YXIgcHJldmlvdXNTdHlsZSA9IGNmZy5zdHlsZSB8fCB7fTtcblxuICAgIGlmIChwcmV2aW91c1N0eWxlLnN0cm9rZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBwcmV2aW91c1N0eWxlLnN0cm9rZSA9IGNmZy5jb2xvcjtcbiAgICB9XG5cbiAgICB2YXIgc291cmNlID0gY2ZnLnNvdXJjZU5vZGU7XG4gICAgdmFyIHRhcmdldCA9IGNmZy50YXJnZXROb2RlO1xuICAgIHZhciByb3V0ZUNmZyA9IHtcbiAgICAgIHJhZGl1czogcHJldmlvdXNTdHlsZS5yYWRpdXNcbiAgICB9O1xuXG4gICAgaWYgKCFjb250cm9sUG9pbnRzKSB7XG4gICAgICByb3V0ZUNmZyA9IHtcbiAgICAgICAgc291cmNlOiBzb3VyY2UsXG4gICAgICAgIHRhcmdldDogdGFyZ2V0LFxuICAgICAgICBvZmZzZXQ6IHByZXZpb3VzU3R5bGUub2Zmc2V0LFxuICAgICAgICByYWRpdXM6IHByZXZpb3VzU3R5bGUucmFkaXVzXG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBwYXRoID0gdGhpcy5nZXRQYXRoKHBvaW50cywgcm91dGVDZmcpO1xuICAgIHZhciBzdHlsZSA9IHt9O1xuXG4gICAgaWYgKHVwZGF0ZVR5cGUgPT09ICdtb3ZlJykge1xuICAgICAgc3R5bGUgPSB7XG4gICAgICAgIHBhdGg6IHBhdGhcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChjdXJyZW50QXR0ci5lbmRBcnJvdyAmJiBwcmV2aW91c1N0eWxlLmVuZEFycm93ID09PSBmYWxzZSkge1xuICAgICAgICBjZmcuc3R5bGUuZW5kQXJyb3cgPSB7XG4gICAgICAgICAgcGF0aDogJydcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgaWYgKGN1cnJlbnRBdHRyLnN0YXJ0QXJyb3cgJiYgcHJldmlvdXNTdHlsZS5zdGFydEFycm93ID09PSBmYWxzZSkge1xuICAgICAgICBjZmcuc3R5bGUuc3RhcnRBcnJvdyA9IHtcbiAgICAgICAgICBwYXRoOiAnJ1xuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBzdHlsZSA9IF9fYXNzaWduKHt9LCBjZmcuc3R5bGUpO1xuICAgICAgaWYgKHN0eWxlLmxpbmVXaWR0aCA9PT0gdW5kZWZpbmVkKSBzdHlsZS5saW5lV2RpdGggPSAoaXNOdW1iZXIoc2l6ZSkgPyBzaXplIDogc2l6ZSA9PT0gbnVsbCB8fCBzaXplID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzaXplWzBdKSB8fCBjdXJyZW50QXR0ci5saW5lV2lkdGg7XG4gICAgICBpZiAoc3R5bGUucGF0aCA9PT0gdW5kZWZpbmVkKSBzdHlsZS5wYXRoID0gcGF0aDtcbiAgICAgIGlmIChzdHlsZS5zdHJva2UgPT09IHVuZGVmaW5lZCkgc3R5bGUuc3Ryb2tlID0gY3VycmVudEF0dHIuc3Ryb2tlIHx8IGNmZy5jb2xvcjtcbiAgICB9XG5cbiAgICBpZiAoc2hhcGUpIHtcbiAgICAgIHNoYXBlLmF0dHIoc3R5bGUpO1xuICAgIH1cbiAgfSxcbiAgZ2V0TGFiZWxTdHlsZUJ5UG9zaXRpb246IGZ1bmN0aW9uIGdldExhYmVsU3R5bGVCeVBvc2l0aW9uKGNmZywgbGFiZWxDZmcsIGdyb3VwKSB7XG4gICAgdmFyIGxhYmVsUG9zaXRpb24gPSBsYWJlbENmZy5wb3NpdGlvbiB8fCB0aGlzLmxhYmVsUG9zaXRpb247IC8vIOaWh+acrOeahOS9jee9rueUqOaIt+WPr+S7peS8oOWFpVxuXG4gICAgdmFyIHN0eWxlID0ge307XG4gICAgdmFyIHBhdGhTaGFwZSA9IGdyb3VwID09PSBudWxsIHx8IGdyb3VwID09PSB2b2lkIDAgPyB2b2lkIDAgOiBncm91cFsnc2hhcGVNYXAnXVtDTFNfU0hBUEVdOyAvLyBncm91cD8uZmluZCgoZWxlbWVudCkgPT4gZWxlbWVudC5nZXQoJ2NsYXNzTmFtZScpID09PSBDTFNfU0hBUEUpO1xuICAgIC8vIOS4jeWvuSBwYXRoU2hhcGUg6L+b6KGM5Yik56m677yM5aaC5p6c57q/5LiN5a2Y5Zyo77yM6K+05piO5pyJ6Zeu6aKY5LqGXG5cbiAgICB2YXIgcG9pbnRQZXJjZW50O1xuXG4gICAgaWYgKGxhYmVsUG9zaXRpb24gPT09ICdzdGFydCcpIHtcbiAgICAgIHBvaW50UGVyY2VudCA9IDA7XG4gICAgfSBlbHNlIGlmIChsYWJlbFBvc2l0aW9uID09PSAnZW5kJykge1xuICAgICAgcG9pbnRQZXJjZW50ID0gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgcG9pbnRQZXJjZW50ID0gMC41O1xuICAgIH0gLy8g5YGP56e76YePXG5cblxuICAgIHZhciBvZmZzZXRYID0gbGFiZWxDZmcucmVmWCB8fCB0aGlzLnJlZlg7XG4gICAgdmFyIG9mZnNldFkgPSBsYWJlbENmZy5yZWZZIHx8IHRoaXMucmVmWTsgLy8g5aaC5p6c5Lik5Liq6IqC54K56YeN5Y+g77yM57q/5bCx5Y+Y5oiQ5LqG5LiA5Liq54K577yM6L+Z5pe25YCZbGFiZWznmoTkvY3nva7vvIzlsLHmmK/ov5nkuKrngrkgKyDnu53lr7nlgY/np7tcblxuICAgIGlmIChjZmcuc3RhcnRQb2ludC54ID09PSBjZmcuZW5kUG9pbnQueCAmJiBjZmcuc3RhcnRQb2ludC55ID09PSBjZmcuZW5kUG9pbnQueSkge1xuICAgICAgc3R5bGUueCA9IGNmZy5zdGFydFBvaW50LnggKyBvZmZzZXRYO1xuICAgICAgc3R5bGUueSA9IGNmZy5zdGFydFBvaW50LnkgKyBvZmZzZXRZO1xuICAgICAgc3R5bGUudGV4dCA9IGNmZy5sYWJlbDtcbiAgICAgIHJldHVybiBzdHlsZTtcbiAgICB9XG5cbiAgICB2YXIgYXV0b1JvdGF0ZTtcbiAgICBpZiAoaXNOaWwobGFiZWxDZmcuYXV0b1JvdGF0ZSkpIGF1dG9Sb3RhdGUgPSB0aGlzLmxhYmVsQXV0b1JvdGF0ZTtlbHNlIGF1dG9Sb3RhdGUgPSBsYWJlbENmZy5hdXRvUm90YXRlO1xuICAgIHZhciBvZmZzZXRTdHlsZSA9IGdldExhYmVsUG9zaXRpb24ocGF0aFNoYXBlLCBwb2ludFBlcmNlbnQsIG9mZnNldFgsIG9mZnNldFksIGF1dG9Sb3RhdGUpO1xuICAgIHN0eWxlLnggPSBvZmZzZXRTdHlsZS54O1xuICAgIHN0eWxlLnkgPSBvZmZzZXRTdHlsZS55O1xuICAgIHN0eWxlLnJvdGF0ZSA9IG9mZnNldFN0eWxlLnJvdGF0ZTtcbiAgICBzdHlsZS50ZXh0QWxpZ24gPSB0aGlzLl9nZXRUZXh0QWxpZ24obGFiZWxQb3NpdGlvbiwgb2Zmc2V0U3R5bGUuYW5nbGUpO1xuICAgIHN0eWxlLnRleHQgPSBjZmcubGFiZWw7XG4gICAgcmV0dXJuIHN0eWxlO1xuICB9LFxuICBnZXRMYWJlbEJnU3R5bGVCeVBvc2l0aW9uOiBmdW5jdGlvbiBnZXRMYWJlbEJnU3R5bGVCeVBvc2l0aW9uKGxhYmVsLCBjZmcsIGxhYmVsQ2ZnLCBncm91cCkge1xuICAgIGlmICghbGFiZWwpIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG5cbiAgICB2YXIgYmJveCA9IGxhYmVsLmdldEJCb3goKTtcbiAgICB2YXIgYmFja2dyb3VuZFN0eWxlID0gbGFiZWxDZmcuc3R5bGUgJiYgbGFiZWxDZmcuc3R5bGUuYmFja2dyb3VuZDtcblxuICAgIGlmICghYmFja2dyb3VuZFN0eWxlKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gICAgdmFyIHBhZGRpbmcgPSBiYWNrZ3JvdW5kU3R5bGUucGFkZGluZztcbiAgICB2YXIgYmFja2dyb3VuZFdpZHRoID0gYmJveC53aWR0aCArIHBhZGRpbmdbMV0gKyBwYWRkaW5nWzNdO1xuICAgIHZhciBiYWNrZ3JvdW5kSGVpZ2h0ID0gYmJveC5oZWlnaHQgKyBwYWRkaW5nWzBdICsgcGFkZGluZ1syXTtcbiAgICB2YXIgbGFiZWxQb3NpdGlvbiA9IGxhYmVsQ2ZnLnBvc2l0aW9uIHx8IHRoaXMubGFiZWxQb3NpdGlvbjtcblxuICAgIHZhciBzdHlsZSA9IF9fYXNzaWduKF9fYXNzaWduKHt9LCBiYWNrZ3JvdW5kU3R5bGUpLCB7XG4gICAgICB3aWR0aDogYmFja2dyb3VuZFdpZHRoLFxuICAgICAgaGVpZ2h0OiBiYWNrZ3JvdW5kSGVpZ2h0LFxuICAgICAgeDogYmJveC5taW5YIC0gcGFkZGluZ1syXSxcbiAgICAgIHk6IGJib3gubWluWSAtIHBhZGRpbmdbMF0sXG4gICAgICByb3RhdGU6IDBcbiAgICB9KTtcblxuICAgIHZhciBhdXRvUm90YXRlO1xuICAgIGlmIChpc05pbChsYWJlbENmZy5hdXRvUm90YXRlKSkgYXV0b1JvdGF0ZSA9IHRoaXMubGFiZWxBdXRvUm90YXRlO2Vsc2UgYXV0b1JvdGF0ZSA9IGxhYmVsQ2ZnLmF1dG9Sb3RhdGU7XG4gICAgdmFyIHBhdGhTaGFwZSA9IGdyb3VwID09PSBudWxsIHx8IGdyb3VwID09PSB2b2lkIDAgPyB2b2lkIDAgOiBncm91cFsnc2hhcGVNYXAnXVtDTFNfU0hBUEVdOyAvLyBncm91cD8uZmluZCgoZWxlbWVudCkgPT4gZWxlbWVudC5nZXQoJ2NsYXNzTmFtZScpID09PSBDTFNfU0hBUEUpO1xuICAgIC8vIOS4jeWvuSBwYXRoU2hhcGUg6L+b6KGM5Yik56m677yM5aaC5p6c57q/5LiN5a2Y5Zyo77yM6K+05piO5pyJ6Zeu6aKY5LqGXG5cbiAgICB2YXIgcG9pbnRQZXJjZW50O1xuXG4gICAgaWYgKGxhYmVsUG9zaXRpb24gPT09ICdzdGFydCcpIHtcbiAgICAgIHBvaW50UGVyY2VudCA9IDA7XG4gICAgfSBlbHNlIGlmIChsYWJlbFBvc2l0aW9uID09PSAnZW5kJykge1xuICAgICAgcG9pbnRQZXJjZW50ID0gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgcG9pbnRQZXJjZW50ID0gMC41O1xuICAgIH0gLy8g5YGP56e76YePXG5cblxuICAgIHZhciBvZmZzZXRYID0gbGFiZWxDZmcucmVmWCB8fCB0aGlzLnJlZlg7XG4gICAgdmFyIG9mZnNldFkgPSBsYWJlbENmZy5yZWZZIHx8IHRoaXMucmVmWTsgLy8gLy8g5aaC5p6c5Lik5Liq6IqC54K56YeN5Y+g77yM57q/5bCx5Y+Y5oiQ5LqG5LiA5Liq54K577yM6L+Z5pe25YCZbGFiZWznmoTkvY3nva7vvIzlsLHmmK/ov5nkuKrngrkgKyDnu53lr7nlgY/np7tcblxuICAgIGlmIChjZmcuc3RhcnRQb2ludC54ID09PSBjZmcuZW5kUG9pbnQueCAmJiBjZmcuc3RhcnRQb2ludC55ID09PSBjZmcuZW5kUG9pbnQueSkge1xuICAgICAgc3R5bGUueCA9IGNmZy5zdGFydFBvaW50LnggKyBvZmZzZXRYIC0gYmFja2dyb3VuZFdpZHRoIC8gMjtcbiAgICAgIHN0eWxlLnkgPSBjZmcuc3RhcnRQb2ludC55ICsgb2Zmc2V0WSAtIGJhY2tncm91bmRIZWlnaHQgLyAyO1xuICAgICAgcmV0dXJuIHN0eWxlO1xuICAgIH1cblxuICAgIHZhciBiZ09mZnNldFggPSBvZmZzZXRYIC0gYmFja2dyb3VuZFdpZHRoIC8gMjtcblxuICAgIGlmIChsYWJlbENmZy5wb3NpdGlvbiA9PT0gJ3N0YXJ0Jykge1xuICAgICAgYmdPZmZzZXRYID0gb2Zmc2V0WCAtIHBhZGRpbmdbMl07XG4gICAgfSBlbHNlIGlmIChsYWJlbENmZy5wb3NpdGlvbiA9PT0gJ2VuZCcpIHtcbiAgICAgIGJnT2Zmc2V0WCA9IG9mZnNldFggLSBiYWNrZ3JvdW5kV2lkdGg7XG4gICAgfVxuXG4gICAgdmFyIG9mZnNldFN0eWxlID0gZ2V0TGFiZWxQb3NpdGlvbihwYXRoU2hhcGUsIHBvaW50UGVyY2VudCwgYmdPZmZzZXRYLCBvZmZzZXRZICsgYmFja2dyb3VuZEhlaWdodCAvIDIsIGF1dG9Sb3RhdGUpO1xuXG4gICAgaWYgKGF1dG9Sb3RhdGUpIHtcbiAgICAgIHN0eWxlLnggPSBvZmZzZXRTdHlsZS54O1xuICAgICAgc3R5bGUueSA9IG9mZnNldFN0eWxlLnk7XG4gICAgfVxuXG4gICAgc3R5bGUucm90YXRlID0gb2Zmc2V0U3R5bGUucm90YXRlO1xuICAgIHJldHVybiBzdHlsZTtcbiAgfSxcbiAgLy8g6I635Y+W5paH5pys5a+56b2Q5pa55byPXG4gIF9nZXRUZXh0QWxpZ246IGZ1bmN0aW9uIF9nZXRUZXh0QWxpZ24obGFiZWxQb3NpdGlvbiwgYW5nbGUpIHtcbiAgICB2YXIgdGV4dEFsaWduID0gJ2NlbnRlcic7XG5cbiAgICBpZiAoIWFuZ2xlKSB7XG4gICAgICByZXR1cm4gbGFiZWxQb3NpdGlvbjtcbiAgICB9XG5cbiAgICBhbmdsZSA9IGFuZ2xlICUgKE1hdGguUEkgKiAyKTsgLy8g5Y+W5qihXG5cbiAgICBpZiAobGFiZWxQb3NpdGlvbiAhPT0gJ2NlbnRlcicpIHtcbiAgICAgIGlmIChhbmdsZSA+PSAwICYmIGFuZ2xlIDw9IE1hdGguUEkgLyAyIHx8IGFuZ2xlID49IDMgLyAyICogTWF0aC5QSSAmJiBhbmdsZSA8IDIgKiBNYXRoLlBJKSB7XG4gICAgICAgIHRleHRBbGlnbiA9IGxhYmVsUG9zaXRpb247XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0ZXh0QWxpZ24gPSByZXZlcnRBbGlnbihsYWJlbFBvc2l0aW9uKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGV4dEFsaWduO1xuICB9LFxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWwg6I635Y+W6L6555qE5o6n5Yi254K5XG4gICAqIEBwYXJhbSAge09iamVjdH0gY2ZnIOi+ueeahOmFjee9rumhuVxuICAgKiBAcmV0dXJuIHtBcnJheX0g5o6n5Yi254K555qE5pWw57uEXG4gICAqL1xuICBnZXRDb250cm9sUG9pbnRzOiBmdW5jdGlvbiBnZXRDb250cm9sUG9pbnRzKGNmZykge1xuICAgIHJldHVybiBjZmcuY29udHJvbFBvaW50cztcbiAgfSxcblxuICAvKipcbiAgICogQGludGVybmFsIOWkhOeQhumcgOimgemHjeiuoeeul+eCueWSjOi+ueeahOaDheWGtVxuICAgKiBAcGFyYW0ge09iamVjdH0gY2ZnIOi+ueeahOmFjee9rumhuVxuICAgKiBAcmV0dXJuIHtPYmplY3R9IOi+ueeahOmFjee9rumhuVxuICAgKi9cbiAgZ2V0UGF0aFBvaW50czogZnVuY3Rpb24gZ2V0UGF0aFBvaW50cyhjZmcpIHtcbiAgICByZXR1cm4gY2ZnO1xuICB9LFxuXG4gIC8qKlxuICAgKiDnu5jliLbovrlcbiAgICogQG92ZXJyaWRlXG4gICAqIEBwYXJhbSAge09iamVjdH0gY2ZnICAg6L6555qE6YWN572u6aG5XG4gICAqIEBwYXJhbSAge0cuR3JvdXB9IGdyb3VwIOi+ueeahOWuueWZqFxuICAgKiBAcmV0dXJuIHtJU2hhcGV9IOWbvuW9olxuICAgKi9cbiAgZHJhd1NoYXBlOiBmdW5jdGlvbiBkcmF3U2hhcGUoY2ZnLCBncm91cCkge1xuICAgIHZhciBzaGFwZVN0eWxlID0gdGhpcy5nZXRTaGFwZVN0eWxlKGNmZyk7XG4gICAgdmFyIHNoYXBlID0gZ3JvdXAuYWRkU2hhcGUoJ3BhdGgnLCB7XG4gICAgICBjbGFzc05hbWU6IENMU19TSEFQRSxcbiAgICAgIG5hbWU6IENMU19TSEFQRSxcbiAgICAgIGF0dHJzOiBzaGFwZVN0eWxlXG4gICAgfSk7XG4gICAgZ3JvdXBbJ3NoYXBlTWFwJ11bQ0xTX1NIQVBFXSA9IHNoYXBlO1xuICAgIHJldHVybiBzaGFwZTtcbiAgfSxcbiAgZHJhd0xhYmVsOiBmdW5jdGlvbiBkcmF3TGFiZWwoY2ZnLCBncm91cCkge1xuICAgIHZhciBkZWZhdWx0TGFiZWxDZmcgPSB0aGlzLm9wdGlvbnMubGFiZWxDZmc7XG4gICAgdmFyIGxhYmVsQ2ZnID0gZGVlcE1peCh7fSwgZGVmYXVsdExhYmVsQ2ZnLCBjZmcubGFiZWxDZmcpO1xuICAgIHZhciBsYWJlbFN0eWxlID0gdGhpcy5nZXRMYWJlbFN0eWxlKGNmZywgbGFiZWxDZmcsIGdyb3VwKTtcbiAgICB2YXIgcm90YXRlID0gbGFiZWxTdHlsZS5yb3RhdGU7XG4gICAgZGVsZXRlIGxhYmVsU3R5bGUucm90YXRlO1xuICAgIHZhciBsYWJlbCA9IGdyb3VwLmFkZFNoYXBlKCd0ZXh0Jywge1xuICAgICAgYXR0cnM6IGxhYmVsU3R5bGUsXG4gICAgICBuYW1lOiAndGV4dC1zaGFwZSdcbiAgICB9KTtcbiAgICBncm91cFsnc2hhcGVNYXAnXVsndGV4dC1zaGFwZSddID0gbGFiZWw7XG5cbiAgICBpZiAoIWlzTmFOKHJvdGF0ZSkgJiYgcm90YXRlICE9PSAnJykge1xuICAgICAgbGFiZWwucm90YXRlQXRTdGFydChyb3RhdGUpO1xuICAgIH1cblxuICAgIGlmIChsYWJlbFN0eWxlLmJhY2tncm91bmQpIHtcbiAgICAgIHZhciByZWN0ID0gdGhpcy5kcmF3TGFiZWxCZyhjZmcsIGdyb3VwLCBsYWJlbCwgbGFiZWxTdHlsZSwgcm90YXRlKTtcbiAgICAgIHZhciBsYWJlbEJnQ2xhc3NuYW1lID0gdGhpcy5pdGVtVHlwZSArIENMU19MQUJFTF9CR19TVUZGSVg7XG4gICAgICByZWN0LnNldCgnY2xhc3NuYW1lJywgbGFiZWxCZ0NsYXNzbmFtZSk7XG4gICAgICBncm91cFsnc2hhcGVNYXAnXVtsYWJlbEJnQ2xhc3NuYW1lXSA9IHJlY3Q7XG4gICAgICBsYWJlbC50b0Zyb250KCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxhYmVsO1xuICB9LFxuICBkcmF3TGFiZWxCZzogZnVuY3Rpb24gZHJhd0xhYmVsQmcoY2ZnLCBncm91cCwgbGFiZWwsIGxhYmVsU3R5bGUsIHJvdGF0ZSkge1xuICAgIHZhciBkZWZhdWx0TGFiZWxDZmcgPSB0aGlzLm9wdGlvbnMubGFiZWxDZmc7XG4gICAgdmFyIGxhYmVsQ2ZnID0gZGVlcE1peCh7fSwgZGVmYXVsdExhYmVsQ2ZnLCBjZmcubGFiZWxDZmcpO1xuICAgIHZhciBzdHlsZSA9IHRoaXMuZ2V0TGFiZWxCZ1N0eWxlQnlQb3NpdGlvbihsYWJlbCwgY2ZnLCBsYWJlbENmZywgZ3JvdXApO1xuICAgIGRlbGV0ZSBzdHlsZS5yb3RhdGU7XG4gICAgdmFyIHJlY3QgPSBncm91cC5hZGRTaGFwZSgncmVjdCcsIHtcbiAgICAgIG5hbWU6ICd0ZXh0LWJnLXNoYXBlJyxcbiAgICAgIGF0dHJzOiBzdHlsZVxuICAgIH0pO1xuICAgIGdyb3VwWydzaGFwZU1hcCddWyd0ZXh0LWJnLXNoYXBlJ10gPSByZWN0O1xuICAgIGlmICghaXNOYU4ocm90YXRlKSkgcmVjdC5yb3RhdGVBdFN0YXJ0KHJvdGF0ZSk7XG4gICAgcmV0dXJuIHJlY3Q7XG4gIH1cbn07XG5cbnZhciBzaW5nbGVFZGdlRGVmID0gX19hc3NpZ24oX19hc3NpZ24oe30sIHNoYXBlQmFzZSksIHNpbmdsZUVkZ2UpO1xuXG5TaGFwZS5yZWdpc3RlckVkZ2UoJ3NpbmdsZS1lZGdlJywgc2luZ2xlRWRnZURlZik7IC8vIOebtOe6vywg5LiN5pSv5oyB5o6n5Yi254K5XG5cblNoYXBlLnJlZ2lzdGVyRWRnZSgnbGluZScsIHtcbiAgLy8g5o6n5Yi254K55LiN55Sf5pWIXG4gIGdldENvbnRyb2xQb2ludHM6IGZ1bmN0aW9uIGdldENvbnRyb2xQb2ludHMoKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufSwgJ3NpbmdsZS1lZGdlJyk7IC8vIOebtOe6v1xuXG5TaGFwZS5yZWdpc3RlckVkZ2UoJ3NwbGluZScsIHtcbiAgZ2V0UGF0aDogZnVuY3Rpb24gZ2V0UGF0aChwb2ludHMpIHtcbiAgICB2YXIgcGF0aCA9IGdldFNwbGluZShwb2ludHMpO1xuICAgIHJldHVybiBwYXRoO1xuICB9XG59LCAnc2luZ2xlLWVkZ2UnKTtcblNoYXBlLnJlZ2lzdGVyRWRnZSgnYXJjJywge1xuICBjdXJ2ZU9mZnNldDogMjAsXG4gIGNsb2Nrd2lzZTogMSxcbiAgZ2V0Q29udHJvbFBvaW50czogZnVuY3Rpb24gZ2V0Q29udHJvbFBvaW50cyhjZmcpIHtcbiAgICB2YXIgc3RhcnRQb2ludCA9IGNmZy5zdGFydFBvaW50LFxuICAgICAgICBlbmRQb2ludCA9IGNmZy5lbmRQb2ludDtcbiAgICB2YXIgbWlkUG9pbnQgPSB7XG4gICAgICB4OiAoc3RhcnRQb2ludC54ICsgZW5kUG9pbnQueCkgLyAyLFxuICAgICAgeTogKHN0YXJ0UG9pbnQueSArIGVuZFBvaW50LnkpIC8gMlxuICAgIH07XG4gICAgdmFyIGNlbnRlcjtcbiAgICB2YXIgYXJjUG9pbnQ7IC8vIOagueaNrue7meWumueCueiuoeeul+WchuW8p1xuXG4gICAgaWYgKGNmZy5jb250cm9sUG9pbnRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGFyY1BvaW50ID0gY2ZnLmNvbnRyb2xQb2ludHNbMF07XG4gICAgICBjZW50ZXIgPSBnZXRDaXJjbGVDZW50ZXJCeVBvaW50cyhzdGFydFBvaW50LCBhcmNQb2ludCwgZW5kUG9pbnQpOyAvLyDmoLnmja7mjqfliLbngrnlkoznm7Tnur/lhbPns7vlhrPlrpogY2xvY2t3aXNl5YC8XG5cbiAgICAgIGlmIChzdGFydFBvaW50LnggPD0gZW5kUG9pbnQueCAmJiBzdGFydFBvaW50LnkgPiBlbmRQb2ludC55KSB7XG4gICAgICAgIHRoaXMuY2xvY2t3aXNlID0gY2VudGVyLnggPiBhcmNQb2ludC54ID8gMCA6IDE7XG4gICAgICB9IGVsc2UgaWYgKHN0YXJ0UG9pbnQueCA8PSBlbmRQb2ludC54ICYmIHN0YXJ0UG9pbnQueSA8IGVuZFBvaW50LnkpIHtcbiAgICAgICAgdGhpcy5jbG9ja3dpc2UgPSBjZW50ZXIueCA+IGFyY1BvaW50LnggPyAxIDogMDtcbiAgICAgIH0gZWxzZSBpZiAoc3RhcnRQb2ludC54ID4gZW5kUG9pbnQueCAmJiBzdGFydFBvaW50LnkgPD0gZW5kUG9pbnQueSkge1xuICAgICAgICB0aGlzLmNsb2Nrd2lzZSA9IGNlbnRlci55IDwgYXJjUG9pbnQueSA/IDAgOiAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jbG9ja3dpc2UgPSBjZW50ZXIueSA8IGFyY1BvaW50LnkgPyAxIDogMDtcbiAgICAgIH0gLy8g6Iul57uZ5a6a54K55ZKM5Lik56uv54K55YWx57q/77yM5peg5rOV55Sf5oiQ5ZyG5byn77yM57uY5Yi255u057q/XG5cblxuICAgICAgaWYgKChhcmNQb2ludC54IC0gc3RhcnRQb2ludC54KSAvIChhcmNQb2ludC55IC0gc3RhcnRQb2ludC55KSA9PT0gKGVuZFBvaW50LnggLSBzdGFydFBvaW50LngpIC8gKGVuZFBvaW50LnkgLSBzdGFydFBvaW50LnkpKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8g5qC55o2u55u057q/6L+e57q/5Lit54K555qE55qE5YGP56e76K6h566X5ZyG5bynXG4gICAgICAvLyDoi6XnlKjmiLfnu5nlrprlgY/np7vph4/liJnmoLnmja7lhbborqHnrpfvvIzlkKbliJnmjInnhafpu5jorqTlgY/np7vlgLzorqHnrpdcbiAgICAgIGlmIChjZmcuY3VydmVPZmZzZXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjZmcuY3VydmVPZmZzZXQgPSB0aGlzLmN1cnZlT2Zmc2V0O1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNBcnJheShjZmcuY3VydmVPZmZzZXQpKSB7XG4gICAgICAgIGNmZy5jdXJ2ZU9mZnNldCA9IGNmZy5jdXJ2ZU9mZnNldFswXTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNmZy5jdXJ2ZU9mZnNldCA8IDApIHtcbiAgICAgICAgdGhpcy5jbG9ja3dpc2UgPSAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jbG9ja3dpc2UgPSAxO1xuICAgICAgfVxuXG4gICAgICB2YXIgdmVjID0ge1xuICAgICAgICB4OiBlbmRQb2ludC54IC0gc3RhcnRQb2ludC54LFxuICAgICAgICB5OiBlbmRQb2ludC55IC0gc3RhcnRQb2ludC55XG4gICAgICB9O1xuICAgICAgdmFyIGVkZ2VBbmdsZSA9IE1hdGguYXRhbjIodmVjLnksIHZlYy54KTtcbiAgICAgIGFyY1BvaW50ID0ge1xuICAgICAgICB4OiBjZmcuY3VydmVPZmZzZXQgKiBNYXRoLmNvcygtTWF0aC5QSSAvIDIgKyBlZGdlQW5nbGUpICsgbWlkUG9pbnQueCxcbiAgICAgICAgeTogY2ZnLmN1cnZlT2Zmc2V0ICogTWF0aC5zaW4oLU1hdGguUEkgLyAyICsgZWRnZUFuZ2xlKSArIG1pZFBvaW50LnlcbiAgICAgIH07XG4gICAgICBjZW50ZXIgPSBnZXRDaXJjbGVDZW50ZXJCeVBvaW50cyhzdGFydFBvaW50LCBhcmNQb2ludCwgZW5kUG9pbnQpO1xuICAgIH1cblxuICAgIHZhciByYWRpdXMgPSBkaXN0YW5jZShzdGFydFBvaW50LCBjZW50ZXIpO1xuICAgIHZhciBjb250cm9sUG9pbnRzID0gW3tcbiAgICAgIHg6IHJhZGl1cyxcbiAgICAgIHk6IHJhZGl1c1xuICAgIH1dO1xuICAgIHJldHVybiBjb250cm9sUG9pbnRzO1xuICB9LFxuICBnZXRQYXRoOiBmdW5jdGlvbiBnZXRQYXRoKHBvaW50cykge1xuICAgIHZhciBwYXRoID0gW107XG4gICAgcGF0aC5wdXNoKFsnTScsIHBvaW50c1swXS54LCBwb2ludHNbMF0ueV0pOyAvLyDmjqfliLbngrnkuI7nq6/ngrnlhbHnur9cblxuICAgIGlmIChwb2ludHMubGVuZ3RoID09PSAyKSB7XG4gICAgICBwYXRoLnB1c2goWydMJywgcG9pbnRzWzFdLngsIHBvaW50c1sxXS55XSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhdGgucHVzaChbJ0EnLCBwb2ludHNbMV0ueCwgcG9pbnRzWzFdLnksIDAsIDAsIHRoaXMuY2xvY2t3aXNlLCBwb2ludHNbMl0ueCwgcG9pbnRzWzJdLnldKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGF0aDtcbiAgfVxufSwgJ3NpbmdsZS1lZGdlJyk7XG5TaGFwZS5yZWdpc3RlckVkZ2UoJ3F1YWRyYXRpYycsIHtcbiAgY3VydmVQb3NpdGlvbjogMC41LFxuICBjdXJ2ZU9mZnNldDogLTIwLFxuICBnZXRDb250cm9sUG9pbnRzOiBmdW5jdGlvbiBnZXRDb250cm9sUG9pbnRzKGNmZykge1xuICAgIHZhciBjb250cm9sUG9pbnRzID0gY2ZnLmNvbnRyb2xQb2ludHM7IC8vIOaMh+WummNvbnRyb2xQb2ludHNcblxuICAgIGlmICghY29udHJvbFBvaW50cyB8fCAhY29udHJvbFBvaW50cy5sZW5ndGgpIHtcbiAgICAgIHZhciBzdGFydFBvaW50ID0gY2ZnLnN0YXJ0UG9pbnQsXG4gICAgICAgICAgZW5kUG9pbnQgPSBjZmcuZW5kUG9pbnQ7XG4gICAgICBpZiAoY2ZnLmN1cnZlT2Zmc2V0ID09PSB1bmRlZmluZWQpIGNmZy5jdXJ2ZU9mZnNldCA9IHRoaXMuY3VydmVPZmZzZXQ7XG4gICAgICBpZiAoY2ZnLmN1cnZlUG9zaXRpb24gPT09IHVuZGVmaW5lZCkgY2ZnLmN1cnZlUG9zaXRpb24gPSB0aGlzLmN1cnZlUG9zaXRpb247XG4gICAgICBpZiAoaXNBcnJheSh0aGlzLmN1cnZlT2Zmc2V0KSkgY2ZnLmN1cnZlT2Zmc2V0ID0gY2ZnLmN1cnZlT2Zmc2V0WzBdO1xuICAgICAgaWYgKGlzQXJyYXkodGhpcy5jdXJ2ZVBvc2l0aW9uKSkgY2ZnLmN1cnZlUG9zaXRpb24gPSBjZmcuY3VydmVPZmZzZXRbMF07XG4gICAgICB2YXIgaW5uZXJQb2ludCA9IGdldENvbnRyb2xQb2ludChzdGFydFBvaW50LCBlbmRQb2ludCwgY2ZnLmN1cnZlUG9zaXRpb24sIGNmZy5jdXJ2ZU9mZnNldCk7XG4gICAgICBjb250cm9sUG9pbnRzID0gW2lubmVyUG9pbnRdO1xuICAgIH1cblxuICAgIHJldHVybiBjb250cm9sUG9pbnRzO1xuICB9LFxuICBnZXRQYXRoOiBmdW5jdGlvbiBnZXRQYXRoKHBvaW50cykge1xuICAgIHZhciBwYXRoID0gW107XG4gICAgcGF0aC5wdXNoKFsnTScsIHBvaW50c1swXS54LCBwb2ludHNbMF0ueV0pO1xuICAgIHBhdGgucHVzaChbJ1EnLCBwb2ludHNbMV0ueCwgcG9pbnRzWzFdLnksIHBvaW50c1syXS54LCBwb2ludHNbMl0ueV0pO1xuICAgIHJldHVybiBwYXRoO1xuICB9XG59LCAnc2luZ2xlLWVkZ2UnKTtcblNoYXBlLnJlZ2lzdGVyRWRnZSgnY3ViaWMnLCB7XG4gIGN1cnZlUG9zaXRpb246IFsxIC8gMiwgMSAvIDJdLFxuICBjdXJ2ZU9mZnNldDogWy0yMCwgMjBdLFxuICBnZXRDb250cm9sUG9pbnRzOiBmdW5jdGlvbiBnZXRDb250cm9sUG9pbnRzKGNmZykge1xuICAgIHZhciBjb250cm9sUG9pbnRzID0gY2ZnLmNvbnRyb2xQb2ludHM7IC8vIOaMh+WumiBjb250cm9sUG9pbnRzXG5cbiAgICBpZiAoY2ZnLmN1cnZlT2Zmc2V0ID09PSB1bmRlZmluZWQpIGNmZy5jdXJ2ZU9mZnNldCA9IHRoaXMuY3VydmVPZmZzZXQ7XG4gICAgaWYgKGNmZy5jdXJ2ZVBvc2l0aW9uID09PSB1bmRlZmluZWQpIGNmZy5jdXJ2ZVBvc2l0aW9uID0gdGhpcy5jdXJ2ZVBvc2l0aW9uO1xuICAgIGlmIChpc051bWJlcihjZmcuY3VydmVPZmZzZXQpKSBjZmcuY3VydmVPZmZzZXQgPSBbY2ZnLmN1cnZlT2Zmc2V0LCAtY2ZnLmN1cnZlT2Zmc2V0XTtcbiAgICBpZiAoaXNOdW1iZXIoY2ZnLmN1cnZlUG9zaXRpb24pKSBjZmcuY3VydmVQb3NpdGlvbiA9IFtjZmcuY3VydmVQb3NpdGlvbiwgMSAtIGNmZy5jdXJ2ZVBvc2l0aW9uXTtcblxuICAgIGlmICghY29udHJvbFBvaW50cyB8fCAhY29udHJvbFBvaW50cy5sZW5ndGggfHwgY29udHJvbFBvaW50cy5sZW5ndGggPCAyKSB7XG4gICAgICB2YXIgc3RhcnRQb2ludCA9IGNmZy5zdGFydFBvaW50LFxuICAgICAgICAgIGVuZFBvaW50ID0gY2ZnLmVuZFBvaW50O1xuICAgICAgdmFyIGlubmVyUG9pbnQxID0gZ2V0Q29udHJvbFBvaW50KHN0YXJ0UG9pbnQsIGVuZFBvaW50LCBjZmcuY3VydmVQb3NpdGlvblswXSwgY2ZnLmN1cnZlT2Zmc2V0WzBdKTtcbiAgICAgIHZhciBpbm5lclBvaW50MiA9IGdldENvbnRyb2xQb2ludChzdGFydFBvaW50LCBlbmRQb2ludCwgY2ZnLmN1cnZlUG9zaXRpb25bMV0sIGNmZy5jdXJ2ZU9mZnNldFsxXSk7XG4gICAgICBjb250cm9sUG9pbnRzID0gW2lubmVyUG9pbnQxLCBpbm5lclBvaW50Ml07XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbnRyb2xQb2ludHM7XG4gIH0sXG4gIGdldFBhdGg6IGZ1bmN0aW9uIGdldFBhdGgocG9pbnRzKSB7XG4gICAgdmFyIHBhdGggPSBbXTtcbiAgICBwYXRoLnB1c2goWydNJywgcG9pbnRzWzBdLngsIHBvaW50c1swXS55XSk7XG4gICAgcGF0aC5wdXNoKFsnQycsIHBvaW50c1sxXS54LCBwb2ludHNbMV0ueSwgcG9pbnRzWzJdLngsIHBvaW50c1syXS55LCBwb2ludHNbM10ueCwgcG9pbnRzWzNdLnldKTtcbiAgICByZXR1cm4gcGF0aDtcbiAgfVxufSwgJ3NpbmdsZS1lZGdlJyk7IC8vIOWeguebtOaWueWQkeeahOS4iemYtui0neWhnuWwlOabsue6v++8jOS4jeWGjeiAg+iZkeeUqOaIt+WklumDqOS8oOWFpeeahOaOp+WItueCuVxuXG5TaGFwZS5yZWdpc3RlckVkZ2UoJ2N1YmljLXZlcnRpY2FsJywge1xuICBjdXJ2ZVBvc2l0aW9uOiBbMSAvIDIsIDEgLyAyXSxcbiAgbWluQ3VydmVPZmZzZXQ6IFswLCAwXSxcbiAgY3VydmVPZmZzZXQ6IHVuZGVmaW5lZCxcbiAgZ2V0Q29udHJvbFBvaW50czogZnVuY3Rpb24gZ2V0Q29udHJvbFBvaW50cyhjZmcpIHtcbiAgICB2YXIgc3RhcnRQb2ludCA9IGNmZy5zdGFydFBvaW50LFxuICAgICAgICBlbmRQb2ludCA9IGNmZy5lbmRQb2ludDtcbiAgICBpZiAoY2ZnLmN1cnZlUG9zaXRpb24gPT09IHVuZGVmaW5lZCkgY2ZnLmN1cnZlUG9zaXRpb24gPSB0aGlzLmN1cnZlUG9zaXRpb247XG4gICAgaWYgKGNmZy5jdXJ2ZU9mZnNldCA9PT0gdW5kZWZpbmVkKSBjZmcuY3VydmVPZmZzZXQgPSB0aGlzLmN1cnZlT2Zmc2V0O1xuICAgIGlmIChjZmcubWluQ3VydmVPZmZzZXQgPT09IHVuZGVmaW5lZCkgY2ZnLm1pbkN1cnZlT2Zmc2V0ID0gdGhpcy5taW5DdXJ2ZU9mZnNldDtcbiAgICBpZiAoaXNOdW1iZXIoY2ZnLmN1cnZlT2Zmc2V0KSkgY2ZnLmN1cnZlT2Zmc2V0ID0gW2NmZy5jdXJ2ZU9mZnNldCwgLWNmZy5jdXJ2ZU9mZnNldF07XG4gICAgaWYgKGlzTnVtYmVyKGNmZy5taW5DdXJ2ZU9mZnNldCkpIGNmZy5taW5DdXJ2ZU9mZnNldCA9IFtjZmcubWluQ3VydmVPZmZzZXQsIC1jZmcubWluQ3VydmVPZmZzZXRdO1xuICAgIGlmIChpc051bWJlcihjZmcuY3VydmVQb3NpdGlvbikpIGNmZy5jdXJ2ZVBvc2l0aW9uID0gW2NmZy5jdXJ2ZVBvc2l0aW9uLCAxIC0gY2ZnLmN1cnZlUG9zaXRpb25dO1xuICAgIHZhciB5RGlzdCA9IGVuZFBvaW50LnkgLSBzdGFydFBvaW50Lnk7XG4gICAgdmFyIGN1cnZlT2Zmc2V0ID0gWzAsIDBdO1xuXG4gICAgaWYgKGNmZy5jdXJ2ZU9mZnNldCkge1xuICAgICAgY3VydmVPZmZzZXQgPSBjZmcuY3VydmVPZmZzZXQ7XG4gICAgfSBlbHNlIGlmIChNYXRoLmFicyh5RGlzdCkgPCBNYXRoLmFicyhjZmcubWluQ3VydmVPZmZzZXRbMF0pKSB7XG4gICAgICBjdXJ2ZU9mZnNldCA9IGNmZy5taW5DdXJ2ZU9mZnNldDtcbiAgICB9XG5cbiAgICB2YXIgaW5uZXJQb2ludDEgPSB7XG4gICAgICB4OiBzdGFydFBvaW50LngsXG4gICAgICB5OiBzdGFydFBvaW50LnkgKyB5RGlzdCAqIHRoaXMuY3VydmVQb3NpdGlvblswXSArIGN1cnZlT2Zmc2V0WzBdXG4gICAgfTtcbiAgICB2YXIgaW5uZXJQb2ludDIgPSB7XG4gICAgICB4OiBlbmRQb2ludC54LFxuICAgICAgeTogZW5kUG9pbnQueSAtIHlEaXN0ICogdGhpcy5jdXJ2ZVBvc2l0aW9uWzFdICsgY3VydmVPZmZzZXRbMV1cbiAgICB9O1xuICAgIHJldHVybiBbaW5uZXJQb2ludDEsIGlubmVyUG9pbnQyXTtcbiAgfVxufSwgJ2N1YmljJyk7IC8vIOawtOW5s+aWueWQkeeahOS4iemYtui0neWhnuWwlOabsue6v++8jOS4jeWGjeiAg+iZkeeUqOaIt+WklumDqOS8oOWFpeeahOaOp+WItueCuVxuXG5TaGFwZS5yZWdpc3RlckVkZ2UoJ2N1YmljLWhvcml6b250YWwnLCB7XG4gIGN1cnZlUG9zaXRpb246IFsxIC8gMiwgMSAvIDJdLFxuICBtaW5DdXJ2ZU9mZnNldDogWzAsIDBdLFxuICBjdXJ2ZU9mZnNldDogdW5kZWZpbmVkLFxuICBnZXRDb250cm9sUG9pbnRzOiBmdW5jdGlvbiBnZXRDb250cm9sUG9pbnRzKGNmZykge1xuICAgIHZhciBzdGFydFBvaW50ID0gY2ZnLnN0YXJ0UG9pbnQsXG4gICAgICAgIGVuZFBvaW50ID0gY2ZnLmVuZFBvaW50O1xuICAgIGlmIChjZmcuY3VydmVQb3NpdGlvbiA9PT0gdW5kZWZpbmVkKSBjZmcuY3VydmVQb3NpdGlvbiA9IHRoaXMuY3VydmVQb3NpdGlvbjtcbiAgICBpZiAoY2ZnLmN1cnZlT2Zmc2V0ID09PSB1bmRlZmluZWQpIGNmZy5jdXJ2ZU9mZnNldCA9IHRoaXMuY3VydmVPZmZzZXQ7XG4gICAgaWYgKGNmZy5taW5DdXJ2ZU9mZnNldCA9PT0gdW5kZWZpbmVkKSBjZmcubWluQ3VydmVPZmZzZXQgPSB0aGlzLm1pbkN1cnZlT2Zmc2V0O1xuICAgIGlmIChpc051bWJlcihjZmcuY3VydmVPZmZzZXQpKSBjZmcuY3VydmVPZmZzZXQgPSBbY2ZnLmN1cnZlT2Zmc2V0LCAtY2ZnLmN1cnZlT2Zmc2V0XTtcbiAgICBpZiAoaXNOdW1iZXIoY2ZnLm1pbkN1cnZlT2Zmc2V0KSkgY2ZnLm1pbkN1cnZlT2Zmc2V0ID0gW2NmZy5taW5DdXJ2ZU9mZnNldCwgLWNmZy5taW5DdXJ2ZU9mZnNldF07XG4gICAgaWYgKGlzTnVtYmVyKGNmZy5jdXJ2ZVBvc2l0aW9uKSkgY2ZnLmN1cnZlUG9zaXRpb24gPSBbY2ZnLmN1cnZlUG9zaXRpb24sIDEgLSBjZmcuY3VydmVQb3NpdGlvbl07XG4gICAgdmFyIHhEaXN0ID0gZW5kUG9pbnQueCAtIHN0YXJ0UG9pbnQueDtcbiAgICB2YXIgY3VydmVPZmZzZXQgPSBbMCwgMF07XG5cbiAgICBpZiAoY2ZnLmN1cnZlT2Zmc2V0KSB7XG4gICAgICBjdXJ2ZU9mZnNldCA9IGNmZy5jdXJ2ZU9mZnNldDtcbiAgICB9IGVsc2UgaWYgKE1hdGguYWJzKHhEaXN0KSA8IE1hdGguYWJzKGNmZy5taW5DdXJ2ZU9mZnNldFswXSkpIHtcbiAgICAgIGN1cnZlT2Zmc2V0ID0gY2ZnLm1pbkN1cnZlT2Zmc2V0O1xuICAgIH1cblxuICAgIHZhciBpbm5lclBvaW50MSA9IHtcbiAgICAgIHg6IHN0YXJ0UG9pbnQueCArIHhEaXN0ICogdGhpcy5jdXJ2ZVBvc2l0aW9uWzBdICsgY3VydmVPZmZzZXRbMF0sXG4gICAgICB5OiBzdGFydFBvaW50LnlcbiAgICB9O1xuICAgIHZhciBpbm5lclBvaW50MiA9IHtcbiAgICAgIHg6IGVuZFBvaW50LnggLSB4RGlzdCAqIHRoaXMuY3VydmVQb3NpdGlvblsxXSArIGN1cnZlT2Zmc2V0WzFdLFxuICAgICAgeTogZW5kUG9pbnQueVxuICAgIH07XG4gICAgdmFyIGNvbnRyb2xQb2ludHMgPSBbaW5uZXJQb2ludDEsIGlubmVyUG9pbnQyXTtcbiAgICByZXR1cm4gY29udHJvbFBvaW50cztcbiAgfVxufSwgJ2N1YmljJyk7XG5TaGFwZS5yZWdpc3RlckVkZ2UoJ2xvb3AnLCB7XG4gIGdldFBhdGhQb2ludHM6IGZ1bmN0aW9uIGdldFBhdGhQb2ludHMoY2ZnKSB7XG4gICAgcmV0dXJuIGdldExvb3BDZmdzKGNmZyk7XG4gIH0sXG4gIGdldENvbnRyb2xQb2ludHM6IGZ1bmN0aW9uIGdldENvbnRyb2xQb2ludHMoY2ZnKSB7XG4gICAgcmV0dXJuIGNmZy5jb250cm9sUG9pbnRzO1xuICB9LFxuICBhZnRlckRyYXc6IGZ1bmN0aW9uIGFmdGVyRHJhdyhjZmcpIHtcbiAgICBjZmcuY29udHJvbFBvaW50cyA9IHVuZGVmaW5lZDtcbiAgfSxcbiAgYWZ0ZXJVcGRhdGU6IGZ1bmN0aW9uIGFmdGVyVXBkYXRlKGNmZykge1xuICAgIGNmZy5jb250cm9sUG9pbnRzID0gdW5kZWZpbmVkO1xuICB9XG59LCAnY3ViaWMnKTsiLCJpbXBvcnQgeyBfX2Fzc2lnbiB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgaXNBcnJheSwgaXNOaWwsIGNsb25lIH0gZnJvbSAnQGFudHYvdXRpbCc7XG5pbXBvcnQgR2xvYmFsIGZyb20gJy4uL2dsb2JhbCc7XG5pbXBvcnQgU2hhcGUgZnJvbSAnLi9zaGFwZSc7XG5pbXBvcnQgeyBzaGFwZUJhc2UgfSBmcm9tICcuL3NoYXBlQmFzZSc7XG52YXIgc2luZ2xlQ29tYm8gPSB7XG4gIGl0ZW1UeXBlOiAnY29tYm8nLFxuICAvLyDljZXkuKrlm77lvaLnmoTnsbvlnotcbiAgc2hhcGVUeXBlOiAnc2luZ2xlLWNvbWJvJyxcblxuICAvKipcbiAgICogQ29tYm8g5qCH6aKY5paH5pys55u45a+55Zu+5b2i55qE5L2N572u77yM6buY6K6k5Li6IHRvcFxuICAgKiDkvY3nva7ljIXmi6zvvJogdG9wLCBib3R0b20sIGxlZnQsIHJpZ2h0LCBjZW50ZXJcbiAgICogQHR5cGUge1N0cmluZ31cbiAgICovXG4gIGxhYmVsUG9zaXRpb246ICd0b3AnLFxuXG4gIC8qKlxuICAgKiDmoIfpopjmlofmnKznm7jlr7nlgY/np7vvvIzlvZMgbGFiZWxQb3NpdGlvbiDkuI3kuLogY2VudGVyIOaXtuacieaViFxuICAgKiBAdHlwZSB7TnVtYmVyfVxuICAgKi9cbiAgcmVmWDogR2xvYmFsLmNvbWJvTGFiZWwucmVmWCxcbiAgcmVmWTogR2xvYmFsLmNvbWJvTGFiZWwucmVmWSxcbiAgb3B0aW9uczoge1xuICAgIHN0eWxlOiB7XG4gICAgICBzdHJva2U6IEdsb2JhbC5kZWZhdWx0Q29tYm8uc3R5bGUuc3Ryb2tlLFxuICAgICAgZmlsbDogR2xvYmFsLmRlZmF1bHRDb21iby5zdHlsZS5maWxsLFxuICAgICAgbGluZVdpZHRoOiBHbG9iYWwuZGVmYXVsdENvbWJvLnN0eWxlLmxpbmVXaWR0aFxuICAgIH0sXG4gICAgbGFiZWxDZmc6IHtcbiAgICAgIHN0eWxlOiB7XG4gICAgICAgIGZpbGw6IEdsb2JhbC5jb21ib0xhYmVsLnN0eWxlLmZpbGwsXG4gICAgICAgIGZvbnRTaXplOiBHbG9iYWwuY29tYm9MYWJlbC5zdHlsZS5mb250U2l6ZSxcbiAgICAgICAgZm9udEZhbWlseTogR2xvYmFsLndpbmRvd0ZvbnRGYW1pbHlcbiAgICAgIH1cbiAgICB9LFxuICAgIHN0YXRlU3R5bGVzOiBfX2Fzc2lnbih7fSwgR2xvYmFsLmNvbWJvU3RhdGVTdHlsZXMpXG4gIH0sXG5cbiAgLyoqXG4gICAqIOiOt+WPliBDb21ibyDlrr3pq5hcbiAgICogQGludGVybmFsIOi/lOWbniBDb21ibyDnmoTlpKflsI/vvIzku6UgW3dpZHRoLCBoZWlnaHRdIOeahOaWueW8j+e7tOaKpFxuICAgKiBAcGFyYW0gIHtPYmplY3R9IGNmZyBDb21ibyDnmoTphY3nva7poblcbiAgICogQHJldHVybiB7QXJyYXl9IOWuvemrmFxuICAgKi9cbiAgZ2V0U2l6ZTogZnVuY3Rpb24gZ2V0U2l6ZShjZmcpIHtcbiAgICB2YXIgc2l6ZSA9IGNsb25lKGNmZy5zaXplIHx8IHRoaXMub3B0aW9ucy5zaXplIHx8IEdsb2JhbC5kZWZhdWx0Q29tYm8uc2l6ZSk7IC8vIHNpemUg5piv5pWw57uE77yM6Iul6ZW/5bqm5Li6IDHvvIzliJnooaXplb/luqbkuLogMlxuXG4gICAgaWYgKGlzQXJyYXkoc2l6ZSkgJiYgc2l6ZS5sZW5ndGggPT09IDEpIHtcbiAgICAgIHNpemUgPSBbc2l6ZVswXSwgc2l6ZVswXV07XG4gICAgfSAvLyBzaXplIOS4uuaVsOWtl++8jOWImei9rOaNouS4uuaVsOe7hFxuXG5cbiAgICBpZiAoIWlzQXJyYXkoc2l6ZSkpIHtcbiAgICAgIHNpemUgPSBbc2l6ZSwgc2l6ZV07XG4gICAgfVxuXG4gICAgcmV0dXJuIHNpemU7XG4gIH0sXG4gIC8vIOengeacieaWueazle+8jOS4jeW4jOacm+aJqeWxleeahCBDb21ibyDlpI3lhpnov5nkuKrmlrnms5VcbiAgZ2V0TGFiZWxTdHlsZUJ5UG9zaXRpb246IGZ1bmN0aW9uIGdldExhYmVsU3R5bGVCeVBvc2l0aW9uKGNmZywgbGFiZWxDZmcpIHtcbiAgICB2YXIgbGFiZWxQb3NpdGlvbiA9IGxhYmVsQ2ZnLnBvc2l0aW9uIHx8IHRoaXMubGFiZWxQb3NpdGlvbjtcbiAgICB2YXIgY2ZnU3R5bGUgPSBjZmcuc3R5bGU7XG4gICAgdmFyIHBhZGRpbmcgPSBjZmcucGFkZGluZyB8fCB0aGlzLm9wdGlvbnMucGFkZGluZztcbiAgICBpZiAoaXNBcnJheShwYWRkaW5nKSkgcGFkZGluZyA9IHBhZGRpbmdbMF07XG4gICAgdmFyIHJlZlggPSBsYWJlbENmZy5yZWZYLFxuICAgICAgICByZWZZID0gbGFiZWxDZmcucmVmWTsgLy8g6ICD6JmRIHJlZlgg5ZKMIHJlZlkgPSAwIOeahOWcuuaZr++8jOS4jeeUqOeUqCBsYWJlbENmZy5yZWZYIHx8IEdsb2JhbC5ub2RlTGFiZWwucmVmWFxuXG4gICAgaWYgKGlzTmlsKHJlZlgpKSB7XG4gICAgICByZWZYID0gdGhpcy5yZWZYOyAvLyDkuI3lsYXkuK3ml7bnmoTlgY/np7vph49cbiAgICB9XG5cbiAgICBpZiAoaXNOaWwocmVmWSkpIHtcbiAgICAgIHJlZlkgPSB0aGlzLnJlZlk7IC8vIOS4jeWxheS4reaXtueahOWBj+enu+mHj1xuICAgIH1cblxuICAgIHZhciBzaXplID0gdGhpcy5nZXRTaXplKGNmZyk7XG4gICAgdmFyIHIgPSBNYXRoLm1heChjZmdTdHlsZS5yLCBzaXplWzBdIC8gMikgfHwgc2l6ZVswXSAvIDI7XG4gICAgdmFyIGRpcyA9IHIgKyBwYWRkaW5nO1xuICAgIHZhciBzdHlsZTtcblxuICAgIHN3aXRjaCAobGFiZWxQb3NpdGlvbikge1xuICAgICAgY2FzZSAndG9wJzpcbiAgICAgICAgc3R5bGUgPSB7XG4gICAgICAgICAgeDogMCxcbiAgICAgICAgICB5OiAtZGlzIC0gcmVmWSxcbiAgICAgICAgICB0ZXh0QmFzZWxpbmU6ICdib3R0b20nLFxuICAgICAgICAgIHRleHRBbGlnbjogJ2NlbnRlcidcbiAgICAgICAgfTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICAgIHN0eWxlID0ge1xuICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgeTogZGlzICsgcmVmWSxcbiAgICAgICAgICB0ZXh0QmFzZWxpbmU6ICdib3R0b20nLFxuICAgICAgICAgIHRleHRBbGlnbjogJ2NlbnRlcidcbiAgICAgICAgfTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ2xlZnQnOlxuICAgICAgICBzdHlsZSA9IHtcbiAgICAgICAgICB4OiAtZGlzICsgcmVmWCxcbiAgICAgICAgICB5OiAwLFxuICAgICAgICAgIHRleHRBbGlnbjogJ2xlZnQnXG4gICAgICAgIH07XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdjZW50ZXInOlxuICAgICAgICBzdHlsZSA9IHtcbiAgICAgICAgICB4OiAwLFxuICAgICAgICAgIHk6IDAsXG4gICAgICAgICAgdGV4dDogY2ZnLmxhYmVsLFxuICAgICAgICAgIHRleHRBbGlnbjogJ2NlbnRlcidcbiAgICAgICAgfTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHN0eWxlID0ge1xuICAgICAgICAgIHg6IGRpcyArIHJlZlgsXG4gICAgICAgICAgeTogMCxcbiAgICAgICAgICB0ZXh0QWxpZ246ICdyaWdodCdcbiAgICAgICAgfTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgc3R5bGUudGV4dCA9IGNmZy5sYWJlbDtcbiAgICByZXR1cm4gc3R5bGU7XG4gIH0sXG4gIGRyYXdTaGFwZTogZnVuY3Rpb24gZHJhd1NoYXBlKGNmZywgZ3JvdXApIHtcbiAgICB2YXIgc2hhcGVUeXBlID0gdGhpcy5zaGFwZVR5cGU7IC8vIHx8IHRoaXMudHlwZe+8jOmDveW3sue7j+WKoOS6hiBzaGFwZVR5cGVcblxuICAgIHZhciBzdHlsZSA9IHRoaXMuZ2V0U2hhcGVTdHlsZShjZmcpO1xuICAgIHZhciBzaGFwZSA9IGdyb3VwLmFkZFNoYXBlKHNoYXBlVHlwZSwge1xuICAgICAgYXR0cnM6IHN0eWxlLFxuICAgICAgZHJhZ2dhYmxlOiB0cnVlLFxuICAgICAgbmFtZTogJ2NvbWJvLXNoYXBlJ1xuICAgIH0pO1xuICAgIHJldHVybiBzaGFwZTtcbiAgfSxcbiAgdXBkYXRlU2hhcGU6IGZ1bmN0aW9uIHVwZGF0ZVNoYXBlKGNmZywgaXRlbSwga2V5U2hhcGVTdHlsZSkge1xuICAgIHZhciBrZXlTaGFwZSA9IGl0ZW0uZ2V0KCdrZXlTaGFwZScpO1xuICAgIHZhciBhbmltYXRlID0gY2ZnLmFuaW1hdGUgPT09IHVuZGVmaW5lZCA/IHRoaXMub3B0aW9ucy5hbmltYXRlIDogY2ZnLmFuaW1hdGU7XG5cbiAgICBpZiAoYW5pbWF0ZSAmJiBrZXlTaGFwZS5hbmltYXRlKSB7XG4gICAgICBrZXlTaGFwZS5hbmltYXRlKGtleVNoYXBlU3R5bGUsIHtcbiAgICAgICAgZHVyYXRpb246IDIwMCxcbiAgICAgICAgZWFzaW5nOiAnZWFzZUxpbmVhcidcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBrZXlTaGFwZS5hdHRyKF9fYXNzaWduKHt9LCBrZXlTaGFwZVN0eWxlKSk7XG4gICAgfVxuXG4gICAgdGhpcy51cGRhdGVMYWJlbChjZmcsIGl0ZW0pOyAvLyBzcGVjaWFsIGZvciBzb21lIHR5cGVzIG9mIG5vZGVzXG4gIH1cbn07XG5cbnZhciBzaW5nbGVDb21ib0RlZiA9IF9fYXNzaWduKF9fYXNzaWduKHt9LCBzaGFwZUJhc2UpLCBzaW5nbGVDb21ibyk7XG5cblNoYXBlLnJlZ2lzdGVyQ29tYm8oJ3NpbmdsZS1jb21ibycsIHNpbmdsZUNvbWJvRGVmKTsiLCJpbXBvcnQgeyBfX2Fzc2lnbiB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IEdsb2JhbCBmcm9tICcuLi8uLi9nbG9iYWwnO1xuaW1wb3J0IFNoYXBlIGZyb20gJy4uL3NoYXBlJztcbmltcG9ydCB7IGlzTnVtYmVyLCBjbG9uZSwgbWl4LCBpc0FycmF5IH0gZnJvbSAnQGFudHYvdXRpbCc7IC8vIOWchuW9oiBDb21ib1xuXG5TaGFwZS5yZWdpc3RlckNvbWJvKCdjaXJjbGUnLCB7XG4gIC8vIOiHquWumuS5ieiKgueCueaXtueahOmFjee9rlxuICBvcHRpb25zOiB7XG4gICAgc2l6ZTogW0dsb2JhbC5kZWZhdWx0Q29tYm8uc2l6ZVswXSwgR2xvYmFsLmRlZmF1bHRDb21iby5zaXplWzBdXSxcbiAgICBwYWRkaW5nOiBHbG9iYWwuZGVmYXVsdENvbWJvLnBhZGRpbmdbMF0sXG4gICAgYW5pbWF0ZTogdHJ1ZSxcbiAgICBzdHlsZToge1xuICAgICAgc3Ryb2tlOiBHbG9iYWwuZGVmYXVsdENvbWJvLnN0eWxlLnN0cm9rZSxcbiAgICAgIGZpbGw6IEdsb2JhbC5kZWZhdWx0Q29tYm8uc3R5bGUuZmlsbCxcbiAgICAgIGxpbmVXaWR0aDogR2xvYmFsLmRlZmF1bHRDb21iby5zdHlsZS5saW5lV2lkdGhcbiAgICB9LFxuICAgIGxhYmVsQ2ZnOiB7XG4gICAgICBzdHlsZToge1xuICAgICAgICBmaWxsOiBHbG9iYWwuY29tYm9MYWJlbC5zdHlsZS5maWxsLFxuICAgICAgICBmb250U2l6ZTogR2xvYmFsLmNvbWJvTGFiZWwuc3R5bGUuZm9udFNpemVcbiAgICAgIH0sXG4gICAgICByZWZYOiAwLFxuICAgICAgcmVmWTogMFxuICAgIH0sXG4gICAgc3RhdGVTdHlsZXM6IF9fYXNzaWduKHt9LCBHbG9iYWwuY29tYm9TdGF0ZVN0eWxlcylcbiAgfSxcbiAgc2hhcGVUeXBlOiAnY2lyY2xlJyxcbiAgLy8g5paH5pys5L2N572uXG4gIGxhYmVsUG9zaXRpb246ICd0b3AnLFxuICBkcmF3U2hhcGU6IGZ1bmN0aW9uIGRyYXdTaGFwZShjZmcsIGdyb3VwKSB7XG4gICAgdmFyIHN0eWxlID0gdGhpcy5nZXRTaGFwZVN0eWxlKGNmZyk7XG4gICAgZGVsZXRlIHN0eWxlLmhlaWdodDtcbiAgICBkZWxldGUgc3R5bGUud2lkdGg7XG4gICAgdmFyIGtleVNoYXBlID0gZ3JvdXAuYWRkU2hhcGUoJ2NpcmNsZScsIHtcbiAgICAgIGF0dHJzOiBzdHlsZSxcbiAgICAgIGNsYXNzTmFtZTogJ2NpcmNsZS1jb21ibycsXG4gICAgICBuYW1lOiAnY2lyY2xlLWNvbWJvJyxcbiAgICAgIGRyYWdnYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIHJldHVybiBrZXlTaGFwZTtcbiAgfSxcblxuICAvKipcbiAgICog6I635Y+WIENvbWJvIOeahOagt+W8j++8jOS+m+WfuuS6juivpSBDb21ibyDoh6rlrprkuYnml7bkvb/nlKhcbiAgICogQHBhcmFtIHtPYmplY3R9IGNmZyBDb21ibyDmlbDmja7mqKHlnotcbiAgICogQHJldHVybiB7T2JqZWN0fSBDb21ibyDnmoTmoLflvI9cbiAgICovXG4gIGdldFNoYXBlU3R5bGU6IGZ1bmN0aW9uIGdldFNoYXBlU3R5bGUoY2ZnKSB7XG4gICAgdmFyIGRlZmF1bHRTdHlsZSA9IHRoaXMub3B0aW9ucy5zdHlsZTtcbiAgICB2YXIgcGFkZGluZyA9IGNmZy5wYWRkaW5nIHx8IHRoaXMub3B0aW9ucy5wYWRkaW5nO1xuICAgIGlmIChpc0FycmF5KHBhZGRpbmcpKSBwYWRkaW5nID0gcGFkZGluZ1swXTtcbiAgICB2YXIgc3Ryb2tlU3R5bGUgPSB7XG4gICAgICBzdHJva2U6IGNmZy5jb2xvclxuICAgIH07IC8vIOWmguaenOiuvue9ruS6hmNvbG9y77yM5YiZ6KaG55uW6buY6K6k55qEc3Ryb2tl5bGe5oCnXG5cbiAgICB2YXIgc3R5bGUgPSBtaXgoe30sIGRlZmF1bHRTdHlsZSwgc3Ryb2tlU3R5bGUsIGNmZy5zdHlsZSk7XG4gICAgdmFyIHI7XG5cbiAgICBpZiAoY2ZnLmZpeFNpemUpIHtcbiAgICAgIHIgPSBpc051bWJlcihjZmcuZml4U2l6ZSkgPyBjZmcuZml4U2l6ZSA6IGNmZy5maXhTaXplWzBdO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgc2l6ZSA9IHRoaXMuZ2V0U2l6ZShjZmcpO1xuICAgICAgaWYgKCFpc051bWJlcihzdHlsZS5yKSB8fCBpc05hTihzdHlsZS5yKSkgciA9IHNpemVbMF0gLyAyIHx8IEdsb2JhbC5kZWZhdWx0Q29tYm8uc3R5bGUucjtlbHNlIHIgPSBNYXRoLm1heChzdHlsZS5yLCBzaXplWzBdIC8gMikgfHwgc2l6ZVswXSAvIDI7XG4gICAgfVxuXG4gICAgc3R5bGUuciA9IHIgKyBwYWRkaW5nO1xuXG4gICAgdmFyIHN0eWxlcyA9IF9fYXNzaWduKHtcbiAgICAgIHg6IDAsXG4gICAgICB5OiAwXG4gICAgfSwgc3R5bGUpO1xuXG4gICAgaWYgKGNmZy5zdHlsZSkgY2ZnLnN0eWxlLnIgPSByO2Vsc2Uge1xuICAgICAgY2ZnLnN0eWxlID0ge1xuICAgICAgICByOiByXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gc3R5bGVzO1xuICB9LFxuICB1cGRhdGU6IGZ1bmN0aW9uIHVwZGF0ZShjZmcsIGl0ZW0pIHtcbiAgICB2YXIgc2l6ZSA9IHRoaXMuZ2V0U2l6ZShjZmcpO1xuICAgIHZhciBwYWRkaW5nID0gY2ZnLnBhZGRpbmcgfHwgdGhpcy5vcHRpb25zLnBhZGRpbmc7XG4gICAgaWYgKGlzQXJyYXkocGFkZGluZykpIHBhZGRpbmcgPSBwYWRkaW5nWzBdO1xuICAgIHZhciBjZmdTdHlsZSA9IGNsb25lKGNmZy5zdHlsZSk7XG4gICAgdmFyIHI7XG5cbiAgICBpZiAoY2ZnLmZpeFNpemUpIHtcbiAgICAgIHIgPSBpc051bWJlcihjZmcuZml4U2l6ZSkgPyBjZmcuZml4U2l6ZSA6IGNmZy5maXhTaXplWzBdO1xuICAgIH0gZWxzZSB7XG4gICAgICByID0gTWF0aC5tYXgoY2ZnU3R5bGUuciwgc2l6ZVswXSAvIDIpIHx8IHNpemVbMF0gLyAyO1xuICAgIH1cblxuICAgIGNmZ1N0eWxlLnIgPSByICsgcGFkZGluZztcbiAgICB2YXIgaXRlbUNhY2hlU2l6ZSA9IGl0ZW0uZ2V0KCdzaXplQ2FjaGUnKTtcblxuICAgIGlmIChpdGVtQ2FjaGVTaXplKSB7XG4gICAgICBpdGVtQ2FjaGVTaXplLnIgPSBjZmdTdHlsZS5yO1xuICAgIH0gLy8g5LiL6Z2i6L+Z5Lqb5bGe5oCn6ZyA6KaB6KaG55uW6buY6K6k5qC35byP5LiO55uu5YmN5qC35byP77yM5L2G6Iul5ZyoIGNmZyDkuK3mnInmjIflrprliJnlupTor6XooqsgY2ZnIOeahOebuOW6lOmFjee9ruimhuebluOAglxuXG5cbiAgICB2YXIgc3Ryb2tlU3R5bGUgPSB7XG4gICAgICBzdHJva2U6IGNmZy5jb2xvclxuICAgIH07IC8vIOS4jiBnZXRTaGFwZVN0eWxlIOS4jeWQjOWcqOS6ju+8jHVwZGF0ZSDml7bpnIDopoHojrflj5bliLDlvZPliY3nmoQgc3R5bGUg6L+b6KGM6J6N5ZCI44CC5Y2z5paw5Lyg5YWl55qE6YWN572u6aG55Lit5rKh5pyJ5raJ5Y+K55qE5bGe5oCn77yM5L+d55WZ5b2T5YmN55qE6YWN572u44CCXG5cbiAgICB2YXIga2V5U2hhcGUgPSBpdGVtLmdldCgna2V5U2hhcGUnKTtcbiAgICB2YXIgc3R5bGUgPSBtaXgoe30sIGtleVNoYXBlLmF0dHIoKSwgc3Ryb2tlU3R5bGUsIGNmZ1N0eWxlKTtcbiAgICBpZiAoY2ZnLnN0eWxlKSBjZmcuc3R5bGUuciA9IHI7ZWxzZSB7XG4gICAgICBjZmcuc3R5bGUgPSB7XG4gICAgICAgIHI6IHJcbiAgICAgIH07XG4gICAgfVxuICAgIHRoaXMudXBkYXRlU2hhcGUoY2ZnLCBpdGVtLCBzdHlsZSwgdHJ1ZSk7XG4gIH1cbn0sICdzaW5nbGUtY29tYm8nKTsiLCJpbXBvcnQgeyBfX2Fzc2lnbiB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgbWl4LCBpc051bWJlciwgY2xvbmUsIGlzTmlsIH0gZnJvbSAnQGFudHYvdXRpbCc7XG5pbXBvcnQgR2xvYmFsIGZyb20gJy4uLy4uL2dsb2JhbCc7XG5pbXBvcnQgU2hhcGUgZnJvbSAnLi4vc2hhcGUnO1xuU2hhcGUucmVnaXN0ZXJDb21ibygncmVjdCcsIHtcbiAgLy8g6Ieq5a6a5LmJIENvbWJvIOaXtueahOmFjee9rlxuICBvcHRpb25zOiB7XG4gICAgc2l6ZTogWzQwLCA1XSxcbiAgICBwYWRkaW5nOiBbMjUsIDIwLCAxNSwgMjBdLFxuICAgIGFuaW1hdGU6IHRydWUsXG4gICAgc3R5bGU6IHtcbiAgICAgIHJhZGl1czogMCxcbiAgICAgIHN0cm9rZTogR2xvYmFsLmRlZmF1bHRDb21iby5zdHlsZS5zdHJva2UsXG4gICAgICBmaWxsOiBHbG9iYWwuZGVmYXVsdENvbWJvLnN0eWxlLmZpbGwsXG4gICAgICBsaW5lV2lkdGg6IEdsb2JhbC5kZWZhdWx0Q29tYm8uc3R5bGUubGluZVdpZHRoXG4gICAgfSxcbiAgICAvLyDmlofmnKzmoLflvI/phY3nva5cbiAgICBsYWJlbENmZzoge1xuICAgICAgc3R5bGU6IHtcbiAgICAgICAgZmlsbDogR2xvYmFsLmNvbWJvTGFiZWwuc3R5bGUuZmlsbCxcbiAgICAgICAgZm9udFNpemU6IEdsb2JhbC5jb21ib0xhYmVsLnN0eWxlLmZvbnRTaXplLFxuICAgICAgICBmb250RmFtaWx5OiBHbG9iYWwud2luZG93Rm9udEZhbWlseVxuICAgICAgfVxuICAgIH0sXG4gICAgLy8g6L+e5o6l54K577yM6buY6K6k5Li65bem5Y+zXG4gICAgYW5jaG9yUG9pbnRzOiBbWzAsIDAuNV0sIFsxLCAwLjVdXSxcbiAgICBzdGF0ZVN0eWxlczogX19hc3NpZ24oe30sIEdsb2JhbC5jb21ib1N0YXRlU3R5bGVzKVxuICB9LFxuICBzaGFwZVR5cGU6ICdyZWN0JyxcbiAgbGFiZWxQb3NpdGlvbjogJ3RvcCcsXG4gIGRyYXdTaGFwZTogZnVuY3Rpb24gZHJhd1NoYXBlKGNmZywgZ3JvdXApIHtcbiAgICB2YXIgc3R5bGUgPSB0aGlzLmdldFNoYXBlU3R5bGUoY2ZnKTtcbiAgICB2YXIga2V5U2hhcGUgPSBncm91cC5hZGRTaGFwZSgncmVjdCcsIHtcbiAgICAgIGF0dHJzOiBzdHlsZSxcbiAgICAgIGNsYXNzTmFtZTogJ3JlY3QtY29tYm8nLFxuICAgICAgbmFtZTogJ3JlY3QtY29tYm8nLFxuICAgICAgZHJhZ2dhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgcmV0dXJuIGtleVNoYXBlO1xuICB9LFxuICAvLyDnp4HmnInmlrnms5XvvIzkuI3luIzmnJvmianlsZXnmoQgQ29tYm8g5aSN5YaZ6L+Z5Liq5pa55rOVXG4gIGdldExhYmVsU3R5bGVCeVBvc2l0aW9uOiBmdW5jdGlvbiBnZXRMYWJlbFN0eWxlQnlQb3NpdGlvbihjZmcsIGxhYmVsQ2ZnKSB7XG4gICAgdmFyIGxhYmVsUG9zaXRpb24gPSBsYWJlbENmZy5wb3NpdGlvbiB8fCB0aGlzLmxhYmVsUG9zaXRpb247XG4gICAgdmFyIGNmZ1N0eWxlID0gY2ZnLnN0eWxlO1xuICAgIHZhciBwYWRkaW5nID0gY2ZnLnBhZGRpbmcgfHwgdGhpcy5vcHRpb25zLnBhZGRpbmc7XG4gICAgaWYgKGlzTnVtYmVyKHBhZGRpbmcpKSBwYWRkaW5nID0gW3BhZGRpbmcsIHBhZGRpbmcsIHBhZGRpbmcsIHBhZGRpbmddO1xuICAgIHZhciByZWZYID0gbGFiZWxDZmcucmVmWCxcbiAgICAgICAgcmVmWSA9IGxhYmVsQ2ZnLnJlZlk7IC8vIOiAg+iZkSByZWZYIOWSjCByZWZZID0gMCDnmoTlnLrmma/vvIzkuI3nlKjnlKggbGFiZWxDZmcucmVmWCB8fCBHbG9iYWwubm9kZUxhYmVsLnJlZllcblxuICAgIGlmIChpc05pbChyZWZYKSkge1xuICAgICAgcmVmWCA9IHRoaXMucmVmWDsgLy8g5LiN5bGF5Lit5pe255qE5YGP56e76YePXG4gICAgfVxuXG4gICAgaWYgKGlzTmlsKHJlZlkpKSB7XG4gICAgICByZWZZID0gdGhpcy5yZWZZOyAvLyDkuI3lsYXkuK3ml7bnmoTlgY/np7vph49cbiAgICB9XG5cbiAgICB2YXIgbGVmdERpcyA9IGNmZ1N0eWxlLndpZHRoIC8gMiArIHBhZGRpbmdbM107XG4gICAgdmFyIHRvcERpcyA9IGNmZ1N0eWxlLmhlaWdodCAvIDIgKyBwYWRkaW5nWzBdO1xuICAgIHZhciBzdHlsZTtcblxuICAgIHN3aXRjaCAobGFiZWxQb3NpdGlvbikge1xuICAgICAgY2FzZSAndG9wJzpcbiAgICAgICAgc3R5bGUgPSB7XG4gICAgICAgICAgeDogMCAtIGxlZnREaXMgKyByZWZYLFxuICAgICAgICAgIHk6IDAgLSB0b3BEaXMgKyByZWZZLFxuICAgICAgICAgIHRleHRCYXNlbGluZTogJ3RvcCcsXG4gICAgICAgICAgdGV4dEFsaWduOiAnbGVmdCdcbiAgICAgICAgfTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICAgIHN0eWxlID0ge1xuICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgeTogdG9wRGlzICsgcmVmWSxcbiAgICAgICAgICB0ZXh0QmFzZWxpbmU6ICdib3R0b20nLFxuICAgICAgICAgIHRleHRBbGlnbjogJ2NlbnRlcidcbiAgICAgICAgfTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ2xlZnQnOlxuICAgICAgICBzdHlsZSA9IHtcbiAgICAgICAgICB4OiAwIC0gbGVmdERpcyArIHJlZlksXG4gICAgICAgICAgeTogMCxcbiAgICAgICAgICB0ZXh0QWxpZ246ICdsZWZ0J1xuICAgICAgICB9O1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnY2VudGVyJzpcbiAgICAgICAgc3R5bGUgPSB7XG4gICAgICAgICAgeDogMCxcbiAgICAgICAgICB5OiAwLFxuICAgICAgICAgIHRleHQ6IGNmZy5sYWJlbCxcbiAgICAgICAgICB0ZXh0QWxpZ246ICdjZW50ZXInXG4gICAgICAgIH07XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBzdHlsZSA9IHtcbiAgICAgICAgICB4OiBsZWZ0RGlzICsgcmVmWCxcbiAgICAgICAgICB5OiAwLFxuICAgICAgICAgIHRleHRBbGlnbjogJ3JpZ2h0J1xuICAgICAgICB9O1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICBzdHlsZS50ZXh0ID0gY2ZnLmxhYmVsO1xuICAgIHJldHVybiBzdHlsZTtcbiAgfSxcblxuICAvKipcbiAgICog6I635Y+W6IqC54K555qE5qC35byP77yM5L6b5Z+65LqO6K+l6IqC54K56Ieq5a6a5LmJ5pe25L2/55SoXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBjZmcg6IqC54K55pWw5o2u5qih5Z6LXG4gICAqIEByZXR1cm4ge09iamVjdH0g6IqC54K555qE5qC35byPXG4gICAqL1xuICBnZXRTaGFwZVN0eWxlOiBmdW5jdGlvbiBnZXRTaGFwZVN0eWxlKGNmZykge1xuICAgIHZhciBkZWZhdWx0U3R5bGUgPSB0aGlzLm9wdGlvbnMuc3R5bGU7XG4gICAgdmFyIHBhZGRpbmcgPSBjZmcucGFkZGluZyB8fCB0aGlzLm9wdGlvbnMucGFkZGluZztcbiAgICBpZiAoaXNOdW1iZXIocGFkZGluZykpIHBhZGRpbmcgPSBbcGFkZGluZywgcGFkZGluZywgcGFkZGluZywgcGFkZGluZ107XG4gICAgdmFyIHN0cm9rZVN0eWxlID0ge1xuICAgICAgc3Ryb2tlOiBjZmcuY29sb3JcbiAgICB9OyAvLyDlpoLmnpzorr7nva7kuoZjb2xvcu+8jOWImeimhueblum7mOiupOeahHN0cm9rZeWxnuaAp1xuXG4gICAgdmFyIHN0eWxlID0gbWl4KHt9LCBkZWZhdWx0U3R5bGUsIHN0cm9rZVN0eWxlLCBjZmcuc3R5bGUpO1xuICAgIHZhciBzaXplID0gdGhpcy5nZXRTaXplKGNmZyk7XG4gICAgdmFyIHdpZHRoO1xuICAgIHZhciBoZWlnaHQ7XG4gICAgdmFyIGZpeFNpemUgPSBjZmcuY29sbGFwc2VkICYmIGNmZy5maXhDb2xsYXBzZVNpemUgPyBjZmcuZml4Q29sbGFwc2VTaXplIDogY2ZnLmZpeFNpemU7XG5cbiAgICBpZiAoZml4U2l6ZSkge1xuICAgICAgaWYgKGlzTnVtYmVyKGZpeFNpemUpKSB7XG4gICAgICAgIHdpZHRoID0gZml4U2l6ZTtcbiAgICAgICAgaGVpZ2h0ID0gZml4U2l6ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdpZHRoID0gZml4U2l6ZVswXTtcbiAgICAgICAgaGVpZ2h0ID0gZml4U2l6ZVsxXTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFpc051bWJlcihzdHlsZS53aWR0aCkgfHwgaXNOYU4oc3R5bGUud2lkdGgpKSB3aWR0aCA9IHNpemVbMF0gfHwgR2xvYmFsLmRlZmF1bHRDb21iby5zdHlsZS53aWR0aDtlbHNlIHdpZHRoID0gTWF0aC5tYXgoc3R5bGUud2lkdGgsIHNpemVbMF0pIHx8IHNpemVbMF07XG4gICAgICBpZiAoIWlzTnVtYmVyKHN0eWxlLmhlaWdodCkgfHwgaXNOYU4oc3R5bGUuaGVpZ2h0KSkgaGVpZ2h0ID0gc2l6ZVsxXSB8fCBHbG9iYWwuZGVmYXVsdENvbWJvLnN0eWxlLmhlaWdodDtlbHNlIGhlaWdodCA9IE1hdGgubWF4KHN0eWxlLmhlaWdodCwgc2l6ZVsxXSkgfHwgc2l6ZVsxXTtcbiAgICB9XG5cbiAgICB2YXIgeCA9IC13aWR0aCAvIDIgLSBwYWRkaW5nWzNdO1xuICAgIHZhciB5ID0gLWhlaWdodCAvIDIgLSBwYWRkaW5nWzBdO1xuICAgIHN0eWxlLndpZHRoID0gd2lkdGggKyBwYWRkaW5nWzFdICsgcGFkZGluZ1szXTtcbiAgICBzdHlsZS5oZWlnaHQgPSBoZWlnaHQgKyBwYWRkaW5nWzBdICsgcGFkZGluZ1syXTtcblxuICAgIHZhciBzdHlsZXMgPSBfX2Fzc2lnbih7XG4gICAgICB4OiB4LFxuICAgICAgeTogeVxuICAgIH0sIHN0eWxlKTtcblxuICAgIGlmICghY2ZnLnN0eWxlKSB7XG4gICAgICBjZmcuc3R5bGUgPSB7XG4gICAgICAgIHdpZHRoOiB3aWR0aCxcbiAgICAgICAgaGVpZ2h0OiBoZWlnaHRcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGNmZy5zdHlsZS53aWR0aCA9IHdpZHRoO1xuICAgICAgY2ZnLnN0eWxlLmhlaWdodCA9IGhlaWdodDtcbiAgICB9XG5cbiAgICByZXR1cm4gc3R5bGVzO1xuICB9LFxuICB1cGRhdGU6IGZ1bmN0aW9uIHVwZGF0ZShjZmcsIGl0ZW0pIHtcbiAgICB2YXIgc2l6ZSA9IHRoaXMuZ2V0U2l6ZShjZmcpO1xuICAgIHZhciBwYWRkaW5nID0gY2ZnLnBhZGRpbmcgfHwgdGhpcy5vcHRpb25zLnBhZGRpbmc7XG4gICAgaWYgKGlzTnVtYmVyKHBhZGRpbmcpKSBwYWRkaW5nID0gW3BhZGRpbmcsIHBhZGRpbmcsIHBhZGRpbmcsIHBhZGRpbmddO1xuICAgIHZhciBjZmdTdHlsZSA9IGNsb25lKGNmZy5zdHlsZSk7XG4gICAgdmFyIHdpZHRoLCBoZWlnaHQ7XG4gICAgdmFyIGZpeFNpemUgPSBjZmcuY29sbGFwc2VkICYmIGNmZy5maXhDb2xsYXBzZVNpemUgPyBjZmcuZml4Q29sbGFwc2VTaXplIDogY2ZnLmZpeFNpemU7XG5cbiAgICBpZiAoZml4U2l6ZSkge1xuICAgICAgaWYgKGlzTnVtYmVyKGZpeFNpemUpKSB7XG4gICAgICAgIHdpZHRoID0gZml4U2l6ZTtcbiAgICAgICAgaGVpZ2h0ID0gZml4U2l6ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdpZHRoID0gZml4U2l6ZVswXTtcbiAgICAgICAgaGVpZ2h0ID0gZml4U2l6ZVsxXTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgd2lkdGggPSBNYXRoLm1heChjZmdTdHlsZS53aWR0aCwgc2l6ZVswXSkgfHwgc2l6ZVswXTtcbiAgICAgIGhlaWdodCA9IE1hdGgubWF4KGNmZ1N0eWxlLmhlaWdodCwgc2l6ZVsxXSkgfHwgc2l6ZVsxXTtcbiAgICB9XG5cbiAgICBjZmdTdHlsZS53aWR0aCA9IHdpZHRoICsgcGFkZGluZ1sxXSArIHBhZGRpbmdbM107XG4gICAgY2ZnU3R5bGUuaGVpZ2h0ID0gaGVpZ2h0ICsgcGFkZGluZ1swXSArIHBhZGRpbmdbMl07XG4gICAgdmFyIGl0ZW1DYWNoZVNpemUgPSBpdGVtLmdldCgnc2l6ZUNhY2hlJyk7XG5cbiAgICBpZiAoaXRlbUNhY2hlU2l6ZSkge1xuICAgICAgaXRlbUNhY2hlU2l6ZS53aWR0aCA9IGNmZ1N0eWxlLndpZHRoO1xuICAgICAgaXRlbUNhY2hlU2l6ZS5oZWlnaHQgPSBjZmdTdHlsZS5oZWlnaHQ7XG4gICAgfVxuXG4gICAgY2ZnU3R5bGUueCA9IC13aWR0aCAvIDIgLSBwYWRkaW5nWzNdO1xuICAgIGNmZ1N0eWxlLnkgPSAtaGVpZ2h0IC8gMiAtIHBhZGRpbmdbMF07IC8vIOS4i+mdoui/meS6m+WxnuaAp+mcgOimgeimhueblum7mOiupOagt+W8j+S4juebruWJjeagt+W8j++8jOS9huiLpeWcqCBjZmcg5Lit5pyJ5oyH5a6a5YiZ5bqU6K+l6KKrIGNmZyDnmoTnm7jlupTphY3nva7opobnm5bjgIJcblxuICAgIHZhciBzdHJva2VTdHlsZSA9IHtcbiAgICAgIHN0cm9rZTogY2ZnLmNvbG9yXG4gICAgfTsgLy8g5LiOIGdldFNoYXBlU3R5bGUg5LiN5ZCM5Zyo5LqO77yMdXBkYXRlIOaXtumcgOimgeiOt+WPluWIsOW9k+WJjeeahCBzdHlsZSDov5vooYzono3lkIjjgILljbPmlrDkvKDlhaXnmoTphY3nva7pobnkuK3msqHmnInmtonlj4rnmoTlsZ7mgKfvvIzkv53nlZnlvZPliY3nmoTphY3nva7jgIJcblxuICAgIHZhciBrZXlTaGFwZSA9IGl0ZW0uZ2V0KCdrZXlTaGFwZScpO1xuICAgIHZhciBzdHlsZSA9IG1peCh7fSwga2V5U2hhcGUuYXR0cigpLCBzdHJva2VTdHlsZSwgY2ZnU3R5bGUpO1xuXG4gICAgaWYgKGNmZy5zdHlsZSkge1xuICAgICAgY2ZnLnN0eWxlLndpZHRoID0gd2lkdGg7XG4gICAgICBjZmcuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgIH0gZWxzZSB7XG4gICAgICBjZmcuc3R5bGUgPSB7XG4gICAgICAgIHdpZHRoOiB3aWR0aCxcbiAgICAgICAgaGVpZ2h0OiBoZWlnaHRcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdGhpcy51cGRhdGVTaGFwZShjZmcsIGl0ZW0sIHN0eWxlLCBmYWxzZSk7XG4gIH0sXG4gIHVwZGF0ZVNoYXBlOiBmdW5jdGlvbiB1cGRhdGVTaGFwZShjZmcsIGl0ZW0sIGtleVNoYXBlU3R5bGUpIHtcbiAgICB2YXIga2V5U2hhcGUgPSBpdGVtLmdldCgna2V5U2hhcGUnKTtcbiAgICB2YXIgYW5pbWF0ZSA9IGNmZy5hbmltYXRlID09PSB1bmRlZmluZWQgPyB0aGlzLm9wdGlvbnMuYW5pbWF0ZSA6IGNmZy5hbmltYXRlO1xuXG4gICAgaWYgKGFuaW1hdGUgJiYga2V5U2hhcGUuYW5pbWF0ZSkge1xuICAgICAga2V5U2hhcGUuYW5pbWF0ZShrZXlTaGFwZVN0eWxlLCB7XG4gICAgICAgIGR1cmF0aW9uOiAyMDAsXG4gICAgICAgIGVhc2luZzogJ2Vhc2VMaW5lYXInXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAga2V5U2hhcGUuYXR0cihfX2Fzc2lnbih7fSwga2V5U2hhcGVTdHlsZSkpO1xuICAgIH1cblxuICAgIHRoaXMudXBkYXRlTGFiZWwoY2ZnLCBpdGVtKTtcbiAgfVxufSwgJ3NpbmdsZS1jb21ibycpOyIsImltcG9ydCAnLi9jaXJjbGUnO1xuaW1wb3J0ICcuL3JlY3QnOyIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBkZWVwTWl4IH0gZnJvbSAnQGFudHYvdXRpbCc7XG5pbXBvcnQgR2xvYmFsIGZyb20gJy4uLy4uL2dsb2JhbCc7XG5pbXBvcnQgU2hhcGUgZnJvbSAnLi4vc2hhcGUnOyAvLyDluKbmnInlm77moIfnmoTlnIbvvIzlj6/nlKjkuo7mi5PmiZHlm77kuK1cblxuU2hhcGUucmVnaXN0ZXJOb2RlKCdzaW1wbGUtY2lyY2xlJywge1xuICAvLyDoh6rlrprkuYnoioLngrnml7bnmoTphY3nva5cbiAgb3B0aW9uczoge1xuICAgIHNpemU6IEdsb2JhbC5kZWZhdWx0Tm9kZS5zaXplLFxuICAgIHN0eWxlOiB7XG4gICAgICB4OiAwLFxuICAgICAgeTogMCxcbiAgICAgIHN0cm9rZTogR2xvYmFsLmRlZmF1bHROb2RlLnN0eWxlLnN0cm9rZSxcbiAgICAgIGZpbGw6IEdsb2JhbC5kZWZhdWx0Tm9kZS5zdHlsZS5maWxsLFxuICAgICAgbGluZVdpZHRoOiBHbG9iYWwuZGVmYXVsdE5vZGUuc3R5bGUubGluZVdpZHRoXG4gICAgfSxcbiAgICBsYWJlbENmZzoge1xuICAgICAgc3R5bGU6IHtcbiAgICAgICAgZmlsbDogR2xvYmFsLm5vZGVMYWJlbC5zdHlsZS5maWxsLFxuICAgICAgICBmb250U2l6ZTogR2xvYmFsLm5vZGVMYWJlbC5zdHlsZS5mb250U2l6ZSxcbiAgICAgICAgZm9udEZhbWlseTogR2xvYmFsLndpbmRvd0ZvbnRGYW1pbHlcbiAgICAgIH1cbiAgICB9LFxuICAgIHN0YXRlU3R5bGVzOiBfX2Fzc2lnbih7fSwgR2xvYmFsLm5vZGVTdGF0ZVN0eWxlcylcbiAgfSxcbiAgc2hhcGVUeXBlOiAnc2ltcGxlLWNpcmNsZScsXG4gIC8vIOaWh+acrOS9jee9rlxuICBsYWJlbFBvc2l0aW9uOiAnY2VudGVyJyxcbiAgc2hhcGVNYXA6IHt9LFxuICBkcmF3U2hhcGU6IGZ1bmN0aW9uIGRyYXdTaGFwZShjZmcsIGdyb3VwKSB7XG4gICAgdmFyIHN0eWxlID0gdGhpcy5nZXRTaGFwZVN0eWxlKGNmZyk7XG4gICAgdmFyIG5hbWUgPSB0aGlzLnR5cGUgKyBcIi1rZXlTaGFwZVwiO1xuICAgIHZhciBrZXlTaGFwZSA9IGdyb3VwLmFkZFNoYXBlKCdjaXJjbGUnLCB7XG4gICAgICBhdHRyczogc3R5bGUsXG4gICAgICBjbGFzc05hbWU6IHRoaXMudHlwZSArIFwiLWtleVNoYXBlXCIsXG4gICAgICBuYW1lOiBuYW1lLFxuICAgICAgZHJhZ2dhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgZ3JvdXBbJ3NoYXBlTWFwJ11bbmFtZV0gPSBrZXlTaGFwZTtcbiAgICByZXR1cm4ga2V5U2hhcGU7XG4gIH0sXG5cbiAgLyoqXG4gICAqIOiOt+WPluiKgueCueeahOagt+W8j++8jOS+m+WfuuS6juivpeiKgueCueiHquWumuS5ieaXtuS9v+eUqFxuICAgKiBAcGFyYW0ge09iamVjdH0gY2ZnIOiKgueCueaVsOaNruaooeWei1xuICAgKiBAcmV0dXJuIHtPYmplY3R9IOiKgueCueeahOagt+W8j1xuICAgKi9cbiAgZ2V0U2hhcGVTdHlsZTogZnVuY3Rpb24gZ2V0U2hhcGVTdHlsZShjZmcpIHtcbiAgICB2YXIgZGVmYXVsdFN0eWxlID0gKHRoaXMubWVyZ2VTdHlsZSB8fCB0aGlzLmdldE9wdGlvbnMoY2ZnKSkuc3R5bGU7XG4gICAgdmFyIHN0cm9rZVN0eWxlID0ge1xuICAgICAgc3Ryb2tlOiBjZmcuY29sb3JcbiAgICB9OyAvLyDlpoLmnpzorr7nva7kuoZjb2xvcu+8jOWImeimhueblum7mOiupOeahHN0cm9rZeWxnuaAp1xuXG4gICAgdmFyIHN0eWxlID0gZGVlcE1peCh7fSwgZGVmYXVsdFN0eWxlLCBzdHJva2VTdHlsZSk7XG4gICAgdmFyIHNpemUgPSB0aGlzLmdldFNpemUoY2ZnKTtcbiAgICB2YXIgciA9IHNpemVbMF0gLyAyO1xuXG4gICAgdmFyIHN0eWxlcyA9IF9fYXNzaWduKHtcbiAgICAgIHg6IDAsXG4gICAgICB5OiAwLFxuICAgICAgcjogclxuICAgIH0sIHN0eWxlKTtcblxuICAgIHJldHVybiBzdHlsZXM7XG4gIH0sXG4gIHVwZGF0ZTogZnVuY3Rpb24gdXBkYXRlKGNmZywgaXRlbSwgdXBkYXRlVHlwZSkge1xuICAgIHZhciBzaXplID0gdGhpcy5nZXRTaXplKGNmZyk7IC8vIOS4i+mdoui/meS6m+WxnuaAp+mcgOimgeimhueblum7mOiupOagt+W8j+S4juebruWJjeagt+W8j++8jOS9huiLpeWcqCBjZmcg5Lit5pyJ5oyH5a6a5YiZ5bqU6K+l6KKrIGNmZyDnmoTnm7jlupTphY3nva7opobnm5bjgIJcblxuICAgIHZhciBzdHJva2VTdHlsZSA9IHtcbiAgICAgIHN0cm9rZTogY2ZnLmNvbG9yLFxuICAgICAgcjogc2l6ZVswXSAvIDJcbiAgICB9OyAvLyDkuI4gZ2V0U2hhcGVTdHlsZSDkuI3lkIzlnKjkuo7vvIx1cGRhdGUg5pe26ZyA6KaB6I635Y+W5Yiw5b2T5YmN55qEIHN0eWxlIOi/m+ihjOiejeWQiOOAguWNs+aWsOS8oOWFpeeahOmFjee9rumhueS4reayoeaciea2ieWPiueahOWxnuaAp++8jOS/neeVmeW9k+WJjeeahOmFjee9ruOAglxuXG4gICAgdmFyIGtleVNoYXBlID0gaXRlbS5nZXQoJ2tleVNoYXBlJyk7XG4gICAgdmFyIHN0eWxlID0gZGVlcE1peCh7fSwga2V5U2hhcGUuYXR0cigpLCBzdHJva2VTdHlsZSwgY2ZnLnN0eWxlKTtcbiAgICB0aGlzLnVwZGF0ZVNoYXBlKGNmZywgaXRlbSwgc3R5bGUsIHRydWUsIHVwZGF0ZVR5cGUpO1xuICB9XG59LCAnc2luZ2xlLW5vZGUnKTsiLCJpbXBvcnQgeyBfX2Fzc2lnbiB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgbWl4IH0gZnJvbSAnQGFudHYvdXRpbCc7XG5pbXBvcnQgR2xvYmFsIGZyb20gJy4uLy4uL2dsb2JhbCc7XG5pbXBvcnQgU2hhcGUgZnJvbSAnLi4vc2hhcGUnO1xuU2hhcGUucmVnaXN0ZXJOb2RlKCdzaW1wbGUtcmVjdCcsIHtcbiAgLy8g6Ieq5a6a5LmJ6IqC54K55pe255qE6YWN572uXG4gIG9wdGlvbnM6IHtcbiAgICBzaXplOiBbMTAwLCAzMF0sXG4gICAgc3R5bGU6IHtcbiAgICAgIHJhZGl1czogMCxcbiAgICAgIHN0cm9rZTogR2xvYmFsLmRlZmF1bHROb2RlLnN0eWxlLnN0cm9rZSxcbiAgICAgIGZpbGw6IEdsb2JhbC5kZWZhdWx0Tm9kZS5zdHlsZS5maWxsLFxuICAgICAgbGluZVdpZHRoOiBHbG9iYWwuZGVmYXVsdE5vZGUuc3R5bGUubGluZVdpZHRoXG4gICAgfSxcbiAgICAvLyDmlofmnKzmoLflvI/phY3nva5cbiAgICBsYWJlbENmZzoge1xuICAgICAgc3R5bGU6IHtcbiAgICAgICAgZmlsbDogR2xvYmFsLm5vZGVMYWJlbC5zdHlsZS5maWxsLFxuICAgICAgICBmb250U2l6ZTogR2xvYmFsLm5vZGVMYWJlbC5zdHlsZS5mb250U2l6ZSxcbiAgICAgICAgZm9udEZhbWlseTogR2xvYmFsLndpbmRvd0ZvbnRGYW1pbHlcbiAgICAgIH1cbiAgICB9LFxuICAgIC8vIOi/nuaOpeeCue+8jOm7mOiupOS4uuW3puWPs1xuICAgIC8vIGFuY2hvclBvaW50czogW3sgeDogMCwgeTogMC41IH0sIHsgeDogMSwgeTogMC41IH1dXG4gICAgYW5jaG9yUG9pbnRzOiBbWzAsIDAuNV0sIFsxLCAwLjVdXSxcbiAgICBzdGF0ZVN0eWxlczogX19hc3NpZ24oe30sIEdsb2JhbC5ub2RlU3RhdGVTdHlsZXMpXG4gIH0sXG4gIHNoYXBlVHlwZTogJ3NpbXBsZS1yZWN0JyxcbiAgbGFiZWxQb3NpdGlvbjogJ2NlbnRlcicsXG4gIGRyYXdTaGFwZTogZnVuY3Rpb24gZHJhd1NoYXBlKGNmZywgZ3JvdXApIHtcbiAgICB2YXIgc3R5bGUgPSB0aGlzLmdldFNoYXBlU3R5bGUoY2ZnKTtcbiAgICB2YXIga2V5U2hhcGUgPSBncm91cC5hZGRTaGFwZSgncmVjdCcsIHtcbiAgICAgIGF0dHJzOiBzdHlsZSxcbiAgICAgIGNsYXNzTmFtZTogdGhpcy50eXBlICsgXCIta2V5U2hhcGVcIixcbiAgICAgIG5hbWU6IHRoaXMudHlwZSArIFwiLWtleVNoYXBlXCIsXG4gICAgICBkcmFnZ2FibGU6IHRydWVcbiAgICB9KTtcbiAgICByZXR1cm4ga2V5U2hhcGU7XG4gIH0sXG5cbiAgLyoqXG4gICAqIOiOt+WPluiKgueCueeahOagt+W8j++8jOS+m+WfuuS6juivpeiKgueCueiHquWumuS5ieaXtuS9v+eUqFxuICAgKiBAcGFyYW0ge09iamVjdH0gY2ZnIOiKgueCueaVsOaNruaooeWei1xuICAgKiBAcmV0dXJuIHtPYmplY3R9IOiKgueCueeahOagt+W8j1xuICAgKi9cbiAgZ2V0U2hhcGVTdHlsZTogZnVuY3Rpb24gZ2V0U2hhcGVTdHlsZShjZmcpIHtcbiAgICB2YXIgZGVmYXVsdFN0eWxlID0gKHRoaXMubWVyZ2VTdHlsZSB8fCB0aGlzLmdldE9wdGlvbnMoY2ZnKSkuc3R5bGU7XG4gICAgdmFyIHN0cm9rZVN0eWxlID0ge1xuICAgICAgc3Ryb2tlOiBjZmcuY29sb3JcbiAgICB9OyAvLyDlpoLmnpzorr7nva7kuoZjb2xvcu+8jOWImeimhueblum7mOiupOeahHN0cm9rZeWxnuaAp1xuXG4gICAgdmFyIHN0eWxlID0gbWl4KHt9LCBkZWZhdWx0U3R5bGUsIHN0cm9rZVN0eWxlKTtcbiAgICB2YXIgc2l6ZSA9IHRoaXMuZ2V0U2l6ZShjZmcpO1xuICAgIHZhciB3aWR0aCA9IHN0eWxlLndpZHRoIHx8IHNpemVbMF07XG4gICAgdmFyIGhlaWdodCA9IHN0eWxlLmhlaWdodCB8fCBzaXplWzFdO1xuXG4gICAgdmFyIHN0eWxlcyA9IF9fYXNzaWduKHtcbiAgICAgIHg6IC13aWR0aCAvIDIsXG4gICAgICB5OiAtaGVpZ2h0IC8gMixcbiAgICAgIHdpZHRoOiB3aWR0aCxcbiAgICAgIGhlaWdodDogaGVpZ2h0XG4gICAgfSwgc3R5bGUpO1xuXG4gICAgcmV0dXJuIHN0eWxlcztcbiAgfSxcbiAgdXBkYXRlOiBmdW5jdGlvbiB1cGRhdGUoY2ZnLCBpdGVtLCB1cGRhdGVUeXBlKSB7XG4gICAgdmFyIGdyb3VwID0gaXRlbS5nZXRDb250YWluZXIoKTsgLy8g6L+Z6YeM5LiN5LygIGNmZyDlj4LmlbDmmK/lm6DkuLogY2ZnLnN0eWxlIOmcgOimgeacgOWQjuimhuebluagt+W8j1xuXG4gICAgdmFyIGRlZmF1bHRTdHlsZSA9ICh0aGlzLm1lcmdlU3R5bGUgfHwgdGhpcy5nZXRPcHRpb25zKGNmZykpLnN0eWxlO1xuICAgIHZhciBzaXplID0gdGhpcy5nZXRTaXplKGNmZyk7XG4gICAgdmFyIGtleVNoYXBlID0gaXRlbS5nZXQoJ2tleVNoYXBlJyk7XG5cbiAgICBpZiAoIWNmZy5zaXplKSB7XG4gICAgICBzaXplWzBdID0ga2V5U2hhcGUuYXR0cignd2lkdGgnKSB8fCBkZWZhdWx0U3R5bGUud2lkdGg7XG4gICAgICBzaXplWzFdID0ga2V5U2hhcGUuYXR0cignaGVpZ2h0JykgfHwgZGVmYXVsdFN0eWxlLmhlaWdodDtcbiAgICB9IC8vIOS4i+mdoui/meS6m+WxnuaAp+mcgOimgeimhueblum7mOiupOagt+W8j+S4juebruWJjeagt+W8j++8jOS9huiLpeWcqCBjZmcg5Lit5pyJ5oyH5a6a5YiZ5bqU6K+l6KKrIGNmZyDnmoTnm7jlupTphY3nva7opobnm5bjgIJcblxuXG4gICAgdmFyIHN0cm9rZVN0eWxlID0ge1xuICAgICAgc3Ryb2tlOiBjZmcuY29sb3IsXG4gICAgICB4OiAtc2l6ZVswXSAvIDIsXG4gICAgICB5OiAtc2l6ZVsxXSAvIDIsXG4gICAgICB3aWR0aDogc2l6ZVswXSxcbiAgICAgIGhlaWdodDogc2l6ZVsxXVxuICAgIH07IC8vIOS4jiBnZXRTaGFwZVN0eWxlIOS4jeWQjOWcqOS6ju+8jHVwZGF0ZSDml7bpnIDopoHojrflj5bliLDlvZPliY3nmoQgc3R5bGUg6L+b6KGM6J6N5ZCI44CC5Y2z5paw5Lyg5YWl55qE6YWN572u6aG55Lit5rKh5pyJ5raJ5Y+K55qE5bGe5oCn77yM5L+d55WZ5b2T5YmN55qE6YWN572u44CCXG5cbiAgICB2YXIgc3R5bGUgPSBtaXgoe30sIGRlZmF1bHRTdHlsZSwga2V5U2hhcGUuYXR0cigpLCBzdHJva2VTdHlsZSk7XG4gICAgc3R5bGUgPSBtaXgoc3R5bGUsIGNmZy5zdHlsZSk7XG4gICAgdGhpcy51cGRhdGVTaGFwZShjZmcsIGl0ZW0sIHN0eWxlLCBmYWxzZSwgdXBkYXRlVHlwZSk7XG4gIH1cbn0sICdzaW5nbGUtbm9kZScpOyIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgU2hhcGUgZnJvbSAnLi4vc2hhcGUnO1xuaW1wb3J0IEdsb2JhbCBmcm9tICcuLi8uLi9nbG9iYWwnO1xuLyoqXG4gKiDln7rmnKznmoTlm77niYfvvIzlj6/ku6Xmt7vliqDmlofmnKzvvIzpu5jorqTmlofmnKzlnKjlm77niYfnmoTkuIvpnaJcbiAqL1xuXG5TaGFwZS5yZWdpc3Rlck5vZGUoJ2ltYWdlJywge1xuICBvcHRpb25zOiB7XG4gICAgaW1nOiAnaHR0cHM6Ly9ndy5hbGlwYXlvYmplY3RzLmNvbS9tZG4vcm1zX2Y4YzZhMC9hZnRzL2ltZy9BKmVEN25UNnRtWWdBQUFBQUFBQUFBQUFCa0FSUW5BUScsXG4gICAgc2l6ZTogMjAwLFxuICAgIGxhYmVsQ2ZnOiB7XG4gICAgICBzdHlsZToge1xuICAgICAgICBmb250RmFtaWx5OiBHbG9iYWwud2luZG93Rm9udEZhbWlseVxuICAgICAgfVxuICAgIH0sXG4gICAgY2xpcENmZzoge1xuICAgICAgc2hvdzogZmFsc2UsXG4gICAgICB0eXBlOiAnY2lyY2xlJyxcbiAgICAgIC8vIGNpcmNsZVxuICAgICAgcjogNTAsXG4gICAgICAvLyBlbGxpcHNlXG4gICAgICByeDogNTAsXG4gICAgICByeTogMzUsXG4gICAgICAvLyByZWN0XG4gICAgICB3aWR0aDogNTAsXG4gICAgICBoZWlnaHQ6IDM1LFxuICAgICAgLy8gcG9seWdvblxuICAgICAgcG9pbnRzOiBbWzMwLCAxMl0sIFsxMiwgMzBdLCBbMzAsIDQ4XSwgWzQ4LCAzMF1dLFxuICAgICAgLy8gcGF0aFxuICAgICAgcGF0aDogW1snTScsIDI1LCAyNV0sIFsnTCcsIDUwLCAyNV0sIFsnQScsIDEyLjUsIDEyLjUsIDAsIDEsIDEsIDUwLCA1MF0sIFsnQScsIDEyLjUsIDEyLjUsIDAsIDEsIDAsIDUwLCA1MF0sIFsnTCcsIDI1LCA3NV0sIFsnWiddXSxcbiAgICAgIC8vIOWdkOagh1xuICAgICAgeDogMCxcbiAgICAgIHk6IDAgLy8gY2xpcCDnmoTlsZ7mgKfmoLflvI9cbiAgICAgIC8vIHN0eWxlOiB7XG4gICAgICAvLyAgIGxpbmVXaWR0aDogMVxuICAgICAgLy8gfSxcblxuICAgIH1cbiAgfSxcbiAgc2hhcGVUeXBlOiAnaW1hZ2UnLFxuICBsYWJlbFBvc2l0aW9uOiAnYm90dG9tJyxcbiAgZHJhd1NoYXBlOiBmdW5jdGlvbiBkcmF3U2hhcGUoY2ZnLCBncm91cCkge1xuICAgIHZhciBzaGFwZVR5cGUgPSB0aGlzLnNoYXBlVHlwZTtcbiAgICB2YXIgc3R5bGUgPSB0aGlzLmdldFNoYXBlU3R5bGUoY2ZnKTtcbiAgICBkZWxldGUgc3R5bGUuZmlsbDtcbiAgICB2YXIgc2hhcGUgPSBncm91cC5hZGRTaGFwZShzaGFwZVR5cGUsIHtcbiAgICAgIGF0dHJzOiBzdHlsZSxcbiAgICAgIGNsYXNzTmFtZTogdGhpcy50eXBlICsgXCIta2V5U2hhcGVcIixcbiAgICAgIG5hbWU6IHRoaXMudHlwZSArIFwiLWtleVNoYXBlXCIsXG4gICAgICBkcmFnZ2FibGU6IHRydWVcbiAgICB9KTtcbiAgICB0aGlzLmRyYXdDbGlwKGNmZywgc2hhcGUpO1xuICAgIHJldHVybiBzaGFwZTtcbiAgfSxcbiAgZHJhd0NsaXA6IGZ1bmN0aW9uIGRyYXdDbGlwKGNmZywgc2hhcGUpIHtcbiAgICB2YXIgY2xpcCA9ICh0aGlzLm1lcmdlU3R5bGUgfHwgdGhpcy5nZXRPcHRpb25zKGNmZykpLmNsaXBDZmc7XG5cbiAgICBpZiAoIWNsaXAuc2hvdykge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8g5pSv5oyBIGNpcmNsZeOAgXJlY3TjgIFlbGxpcHNl44CBUG9seWdvbiDlj4roh6rlrprkuYkgcGF0aCBjbGlwXG5cblxuICAgIHZhciB0eXBlID0gY2xpcC50eXBlLFxuICAgICAgICB4ID0gY2xpcC54LFxuICAgICAgICB5ID0gY2xpcC55LFxuICAgICAgICBzdHlsZSA9IGNsaXAuc3R5bGU7XG5cbiAgICBpZiAodHlwZSA9PT0gJ2NpcmNsZScpIHtcbiAgICAgIHZhciByID0gY2xpcC5yO1xuICAgICAgc2hhcGUuc2V0Q2xpcCh7XG4gICAgICAgIHR5cGU6ICdjaXJjbGUnLFxuICAgICAgICBhdHRyczogX19hc3NpZ24oe1xuICAgICAgICAgIHI6IHIsXG4gICAgICAgICAgeDogeCxcbiAgICAgICAgICB5OiB5XG4gICAgICAgIH0sIHN0eWxlKVxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAncmVjdCcpIHtcbiAgICAgIHZhciB3aWR0aCA9IGNsaXAud2lkdGgsXG4gICAgICAgICAgaGVpZ2h0ID0gY2xpcC5oZWlnaHQ7XG4gICAgICB2YXIgcmVjdFggPSB4IC0gd2lkdGggLyAyO1xuICAgICAgdmFyIHJlY3RZID0geSAtIGhlaWdodCAvIDI7XG4gICAgICBzaGFwZS5zZXRDbGlwKHtcbiAgICAgICAgdHlwZTogJ3JlY3QnLFxuICAgICAgICBhdHRyczogX19hc3NpZ24oe1xuICAgICAgICAgIHg6IHJlY3RYLFxuICAgICAgICAgIHk6IHJlY3RZLFxuICAgICAgICAgIHdpZHRoOiB3aWR0aCxcbiAgICAgICAgICBoZWlnaHQ6IGhlaWdodFxuICAgICAgICB9LCBzdHlsZSlcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2VsbGlwc2UnKSB7XG4gICAgICB2YXIgcnggPSBjbGlwLnJ4LFxuICAgICAgICAgIHJ5ID0gY2xpcC5yeTtcbiAgICAgIHNoYXBlLnNldENsaXAoe1xuICAgICAgICB0eXBlOiAnZWxsaXBzZScsXG4gICAgICAgIGF0dHJzOiBfX2Fzc2lnbih7XG4gICAgICAgICAgeDogeCxcbiAgICAgICAgICB5OiB5LFxuICAgICAgICAgIHJ4OiByeCxcbiAgICAgICAgICByeTogcnlcbiAgICAgICAgfSwgc3R5bGUpXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdwb2x5Z29uJykge1xuICAgICAgdmFyIHBvaW50cyA9IGNsaXAucG9pbnRzO1xuICAgICAgc2hhcGUuc2V0Q2xpcCh7XG4gICAgICAgIHR5cGU6ICdwb2x5Z29uJyxcbiAgICAgICAgYXR0cnM6IF9fYXNzaWduKHtcbiAgICAgICAgICBwb2ludHM6IHBvaW50c1xuICAgICAgICB9LCBzdHlsZSlcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3BhdGgnKSB7XG4gICAgICB2YXIgcGF0aCA9IGNsaXAucGF0aDtcbiAgICAgIHNoYXBlLnNldENsaXAoe1xuICAgICAgICB0eXBlOiAncGF0aCcsXG4gICAgICAgIGF0dHJzOiBfX2Fzc2lnbih7XG4gICAgICAgICAgcGF0aDogcGF0aFxuICAgICAgICB9LCBzdHlsZSlcbiAgICAgIH0pO1xuICAgIH1cbiAgfSxcbiAgZ2V0U2hhcGVTdHlsZTogZnVuY3Rpb24gZ2V0U2hhcGVTdHlsZShjZmcpIHtcbiAgICB2YXIgX2EgPSB0aGlzLm1lcmdlU3R5bGUgfHwgdGhpcy5nZXRPcHRpb25zKGNmZyksXG4gICAgICAgIGRlZmF1bHRTdHlsZSA9IF9hLnN0eWxlLFxuICAgICAgICBpbWcgPSBfYS5pbWc7XG5cbiAgICB2YXIgc2l6ZSA9IHRoaXMuZ2V0U2l6ZShjZmcpO1xuICAgIHZhciB3aWR0aCA9IHNpemVbMF07XG4gICAgdmFyIGhlaWdodCA9IHNpemVbMV07XG5cbiAgICBpZiAoZGVmYXVsdFN0eWxlKSB7XG4gICAgICB3aWR0aCA9IGRlZmF1bHRTdHlsZS53aWR0aCB8fCBzaXplWzBdO1xuICAgICAgaGVpZ2h0ID0gZGVmYXVsdFN0eWxlLmhlaWdodCB8fCBzaXplWzFdO1xuICAgIH1cblxuICAgIHZhciBzdHlsZSA9IF9fYXNzaWduKHtcbiAgICAgIHg6IC13aWR0aCAvIDIsXG4gICAgICB5OiAtaGVpZ2h0IC8gMixcbiAgICAgIHdpZHRoOiB3aWR0aCxcbiAgICAgIGhlaWdodDogaGVpZ2h0LFxuICAgICAgaW1nOiBpbWdcbiAgICB9LCBkZWZhdWx0U3R5bGUpO1xuXG4gICAgcmV0dXJuIHN0eWxlO1xuICB9LFxuICB1cGRhdGVTaGFwZVN0eWxlOiBmdW5jdGlvbiB1cGRhdGVTaGFwZVN0eWxlKGNmZywgaXRlbSkge1xuICAgIHZhciBncm91cCA9IGl0ZW0uZ2V0Q29udGFpbmVyKCk7XG4gICAgdmFyIHNoYXBlQ2xhc3NOYW1lID0gdGhpcy5pdGVtVHlwZSArIFwiLXNoYXBlXCI7XG4gICAgdmFyIHNoYXBlID0gZ3JvdXBbJ3NoYXBlTWFwJ11bc2hhcGVDbGFzc05hbWVdIHx8IGdyb3VwLmZpbmQoZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBlbGVtZW50LmdldCgnY2xhc3NOYW1lJykgPT09IHNoYXBlQ2xhc3NOYW1lO1xuICAgIH0pIHx8IGl0ZW0uZ2V0S2V5U2hhcGUoKTtcbiAgICB2YXIgc2hhcGVTdHlsZSA9IHRoaXMuZ2V0U2hhcGVTdHlsZShjZmcpO1xuXG4gICAgaWYgKHNoYXBlICYmICFzaGFwZS5kZXN0cm95ZWQpIHtcbiAgICAgIHNoYXBlLmF0dHIoc2hhcGVTdHlsZSk7XG4gICAgfVxuICB9XG59LCAnc2luZ2xlLW5vZGUnKTsiLCJpbXBvcnQgJy4vc2ltcGxlLWNpcmNsZSc7XG5pbXBvcnQgJy4vc2ltcGxlLXJlY3QnO1xuaW1wb3J0ICcuL2ltYWdlJzsiLCJleHBvcnQgZGVmYXVsdCB7XG4gIHRyaWFuZ2xlOiBmdW5jdGlvbiB0cmlhbmdsZSh3aWR0aCwgbGVuZ3RoLCBkKSB7XG4gICAgaWYgKHdpZHRoID09PSB2b2lkIDApIHtcbiAgICAgIHdpZHRoID0gMTA7XG4gICAgfVxuXG4gICAgaWYgKGxlbmd0aCA9PT0gdm9pZCAwKSB7XG4gICAgICBsZW5ndGggPSAxNTtcbiAgICB9XG5cbiAgICBpZiAoZCA9PT0gdm9pZCAwKSB7XG4gICAgICBkID0gMDtcbiAgICB9XG5cbiAgICB2YXIgYmVnaW4gPSBkICogMjtcbiAgICB2YXIgcGF0aCA9IFwiTSBcIiArIGJlZ2luICsgXCIsMCBMIFwiICsgKGJlZ2luICsgbGVuZ3RoKSArIFwiLC1cIiArIHdpZHRoIC8gMiArIFwiIEwgXCIgKyAoYmVnaW4gKyBsZW5ndGgpICsgXCIsXCIgKyB3aWR0aCAvIDIgKyBcIiBaXCI7XG4gICAgcmV0dXJuIHBhdGg7XG4gIH0sXG4gIHZlZTogZnVuY3Rpb24gdmVlKHdpZHRoLCBsZW5ndGgsIGQpIHtcbiAgICBpZiAod2lkdGggPT09IHZvaWQgMCkge1xuICAgICAgd2lkdGggPSAxNTtcbiAgICB9XG5cbiAgICBpZiAobGVuZ3RoID09PSB2b2lkIDApIHtcbiAgICAgIGxlbmd0aCA9IDIwO1xuICAgIH1cblxuICAgIGlmIChkID09PSB2b2lkIDApIHtcbiAgICAgIGQgPSAwO1xuICAgIH1cblxuICAgIHZhciBiZWdpbiA9IGQgKiAyO1xuICAgIHZhciBwYXRoID0gXCJNIFwiICsgYmVnaW4gKyBcIiwwIEwgXCIgKyAoYmVnaW4gKyBsZW5ndGgpICsgXCIsLVwiICsgd2lkdGggLyAyICsgXCJcXG4gICAgICAgIEwgXCIgKyAoYmVnaW4gKyAyICogbGVuZ3RoIC8gMykgKyBcIiwwIEwgXCIgKyAoYmVnaW4gKyBsZW5ndGgpICsgXCIsXCIgKyB3aWR0aCAvIDIgKyBcIiBaXCI7XG4gICAgcmV0dXJuIHBhdGg7XG4gIH0sXG4gIGNpcmNsZTogZnVuY3Rpb24gY2lyY2xlKHIsIGQpIHtcbiAgICBpZiAociA9PT0gdm9pZCAwKSB7XG4gICAgICByID0gNTtcbiAgICB9XG5cbiAgICBpZiAoZCA9PT0gdm9pZCAwKSB7XG4gICAgICBkID0gMDtcbiAgICB9XG5cbiAgICB2YXIgYmVnaW4gPSBkICogMjtcbiAgICB2YXIgcGF0aCA9IFwiTSBcIiArIGJlZ2luICsgXCIsIDBcXG4gICAgICAgICAgICBhIFwiICsgciArIFwiLFwiICsgciArIFwiIDAgMSwwIFwiICsgciAqIDIgKyBcIiwwXFxuICAgICAgICAgICAgYSBcIiArIHIgKyBcIixcIiArIHIgKyBcIiAwIDEsMCBcIiArIC1yICogMiArIFwiLDBcIjtcbiAgICByZXR1cm4gcGF0aDtcbiAgfSxcbiAgcmVjdDogZnVuY3Rpb24gcmVjdCh3aWR0aCwgbGVuZ3RoLCBkKSB7XG4gICAgaWYgKHdpZHRoID09PSB2b2lkIDApIHtcbiAgICAgIHdpZHRoID0gMTA7XG4gICAgfVxuXG4gICAgaWYgKGxlbmd0aCA9PT0gdm9pZCAwKSB7XG4gICAgICBsZW5ndGggPSAxMDtcbiAgICB9XG5cbiAgICBpZiAoZCA9PT0gdm9pZCAwKSB7XG4gICAgICBkID0gMDtcbiAgICB9XG5cbiAgICB2YXIgYmVnaW4gPSBkICogMjtcbiAgICB2YXIgcGF0aCA9IFwiTSBcIiArIGJlZ2luICsgXCIsXCIgKyAtd2lkdGggLyAyICsgXCIgXFxuICAgICAgICBMIFwiICsgKGJlZ2luICsgbGVuZ3RoKSArIFwiLFwiICsgLXdpZHRoIC8gMiArIFwiIFxcbiAgICAgICAgTCBcIiArIChiZWdpbiArIGxlbmd0aCkgKyBcIixcIiArIHdpZHRoIC8gMiArIFwiIFxcbiAgICAgICAgTCBcIiArIGJlZ2luICsgXCIsXCIgKyB3aWR0aCAvIDIgKyBcIiBaXCI7XG4gICAgcmV0dXJuIHBhdGg7XG4gIH0sXG4gIGRpYW1vbmQ6IGZ1bmN0aW9uIGRpYW1vbmQod2lkdGgsIGxlbmd0aCwgZCkge1xuICAgIGlmICh3aWR0aCA9PT0gdm9pZCAwKSB7XG4gICAgICB3aWR0aCA9IDE1O1xuICAgIH1cblxuICAgIGlmIChsZW5ndGggPT09IHZvaWQgMCkge1xuICAgICAgbGVuZ3RoID0gMTU7XG4gICAgfVxuXG4gICAgaWYgKGQgPT09IHZvaWQgMCkge1xuICAgICAgZCA9IDA7XG4gICAgfVxuXG4gICAgdmFyIGJlZ2luID0gZCAqIDI7XG4gICAgdmFyIHBhdGggPSBcIk0gXCIgKyBiZWdpbiArIFwiLDAgXFxuICAgICAgICBMIFwiICsgKGJlZ2luICsgbGVuZ3RoIC8gMikgKyBcIixcIiArIC13aWR0aCAvIDIgKyBcIiBcXG4gICAgICAgIEwgXCIgKyAoYmVnaW4gKyBsZW5ndGgpICsgXCIsMCBcXG4gICAgICAgIEwgXCIgKyAoYmVnaW4gKyBsZW5ndGggLyAyKSArIFwiLFwiICsgd2lkdGggLyAyICsgXCIgWlwiO1xuICAgIHJldHVybiBwYXRoO1xuICB9LFxuICB0cmlhbmdsZVJlY3Q6IGZ1bmN0aW9uIHRyaWFuZ2xlUmVjdCh0V2lkdGgsIHRMZW5ndGgsIHJXaWR0aCwgckxlbmd0aCwgZ2FwLCBkKSB7XG4gICAgaWYgKHRXaWR0aCA9PT0gdm9pZCAwKSB7XG4gICAgICB0V2lkdGggPSAxNTtcbiAgICB9XG5cbiAgICBpZiAodExlbmd0aCA9PT0gdm9pZCAwKSB7XG4gICAgICB0TGVuZ3RoID0gMTU7XG4gICAgfVxuXG4gICAgaWYgKHJXaWR0aCA9PT0gdm9pZCAwKSB7XG4gICAgICByV2lkdGggPSAxNTtcbiAgICB9XG5cbiAgICBpZiAockxlbmd0aCA9PT0gdm9pZCAwKSB7XG4gICAgICByTGVuZ3RoID0gMztcbiAgICB9XG5cbiAgICBpZiAoZ2FwID09PSB2b2lkIDApIHtcbiAgICAgIGdhcCA9IDU7XG4gICAgfVxuXG4gICAgaWYgKGQgPT09IHZvaWQgMCkge1xuICAgICAgZCA9IDA7XG4gICAgfVxuXG4gICAgdmFyIGJlZ2luID0gZCAqIDI7XG4gICAgdmFyIHJlY3RCZWdpbiA9IGJlZ2luICsgdExlbmd0aCArIGdhcDtcbiAgICB2YXIgcGF0aCA9IFwiTSBcIiArIGJlZ2luICsgXCIsMCBMIFwiICsgKGJlZ2luICsgdExlbmd0aCkgKyBcIiwtXCIgKyB0V2lkdGggLyAyICsgXCIgTCBcIiArIChiZWdpbiArIHRMZW5ndGgpICsgXCIsXCIgKyB0V2lkdGggLyAyICsgXCIgWlxcbiAgICAgICAgICAgIE0gXCIgKyByZWN0QmVnaW4gKyBcIiwgLVwiICsgcldpZHRoIC8gMiArIFwiXFxuICAgICAgICAgICAgTCBcIiArIChyZWN0QmVnaW4gKyByTGVuZ3RoKSArIFwiIC1cIiArIHJXaWR0aCAvIDIgKyBcIlxcbiAgICAgICAgICAgIEwgXCIgKyAocmVjdEJlZ2luICsgckxlbmd0aCkgKyBcIiBcIiArIHJXaWR0aCAvIDIgKyBcIlxcbiAgICAgICAgICAgIEwgXCIgKyByZWN0QmVnaW4gKyBcIiBcIiArIHJXaWR0aCAvIDIgKyBcIlxcbiAgICAgICAgICAgIFpcIjtcbiAgICByZXR1cm4gcGF0aDtcbiAgfVxufTsiLCJleHBvcnQgZGVmYXVsdCB7XG4gIGNvbGxhcHNlOiBmdW5jdGlvbiBjb2xsYXBzZSh4LCB5LCByKSB7XG4gICAgcmV0dXJuIFtbJ00nLCB4IC0gciwgeV0sIFsnYScsIHIsIHIsIDAsIDEsIDAsIHIgKiAyLCAwXSwgWydhJywgciwgciwgMCwgMSwgMCwgLXIgKiAyLCAwXSwgWydNJywgeCAtIHIgKyA0LCB5XSwgWydMJywgeCArIHIgLSA0LCB5XV07XG4gIH0sXG4gIGV4cGFuZDogZnVuY3Rpb24gZXhwYW5kKHgsIHksIHIpIHtcbiAgICByZXR1cm4gW1snTScsIHggLSByLCB5XSwgWydhJywgciwgciwgMCwgMSwgMCwgciAqIDIsIDBdLCBbJ2EnLCByLCByLCAwLCAxLCAwLCAtciAqIDIsIDBdLCBbJ00nLCB4IC0gciArIDQsIHldLCBbJ0wnLCB4IC0gciArIDIgKiByIC0gNCwgeV0sIFsnTScsIHggLSByICsgciwgeSAtIHIgKyA0XSwgWydMJywgeCwgeSArIHIgLSA0XV07XG4gIH0sXG4gIHVwVHJpYW5nbGU6IGZ1bmN0aW9uIHVwVHJpYW5nbGUoeCwgeSwgcikge1xuICAgIHZhciBsMSA9IHIgKiBNYXRoLmNvcyhNYXRoLlBJIC8gNik7XG4gICAgdmFyIGwyID0gciAqIE1hdGguc2luKE1hdGguUEkgLyA2KTtcbiAgICByZXR1cm4gW1snTScsIHggLSBsMSwgeSArIGwyXSwgWydMJywgeCArIGwxLCB5ICsgbDJdLCBbJ0wnLCB4LCB5IC0gcl0sIFsnWiddXTtcbiAgfSxcbiAgZG93blRyaWFuZ2xlOiBmdW5jdGlvbiBkb3duVHJpYW5nbGUoeCwgeSwgcikge1xuICAgIHZhciBsMSA9IHIgKiBNYXRoLmNvcyhNYXRoLlBJIC8gNik7XG4gICAgdmFyIGwyID0gciAqIE1hdGguc2luKE1hdGguUEkgLyA2KTtcbiAgICByZXR1cm4gW1snTScsIHggLSBsMSwgeSAtIGwyXSwgWydMJywgeCArIGwxLCB5IC0gbDJdLCBbJ0wnLCB4LCB5ICsgcl0sIFsnWiddXTtcbiAgfVxufTsiLCJpbXBvcnQgU2hhcGUgZnJvbSAnLi9zaGFwZSc7XG5pbXBvcnQgJy4vbm9kZSc7XG5pbXBvcnQgJy4vZWRnZSc7XG5pbXBvcnQgJy4vY29tYm8nO1xuaW1wb3J0ICcuL2NvbWJvcyc7XG5pbXBvcnQgJy4vbm9kZXMnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBBcnJvdyB9IGZyb20gJy4vYXJyb3cnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBNYXJrZXIgfSBmcm9tICcuL21hcmtlcic7XG5leHBvcnQgZGVmYXVsdCBTaGFwZTsiLCJleHBvcnQgdmFyIGRlZmF1bHRTdWJqZWN0Q29sb3JzID0gWycjNUY5NUZGJywgJyM2MUREQUEnLCAnIzY1Nzg5QicsICcjRjZCRDE2JywgJyM3MjYyRkQnLCAnIzc4RDNGOCcsICcjOTY2MUJDJywgJyNGNjkwM0QnLCAnIzAwODY4NScsICcjRjA4QkI0J107IiwiaW1wb3J0IHsgX19hc3NpZ24gfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCAqIGFzIE1hdGhVdGlsIGZyb20gJy4vbWF0aCc7XG5pbXBvcnQgKiBhcyBHcmFwaGljVXRpbCBmcm9tICcuL2dyYXBoaWMnO1xuaW1wb3J0ICogYXMgUGF0aFV0aWwgZnJvbSAnLi9wYXRoJztcbmltcG9ydCAqIGFzIEJhc2VVdGlsIGZyb20gJy4vYmFzZSc7XG5pbXBvcnQgKiBhcyBDb2xvclV0aWwgZnJvbSAnLi9jb2xvcic7XG5pbXBvcnQgeyBleHQsIG1hdDMgfSBmcm9tICdAYW50di9tYXRyaXgtdXRpbCc7XG52YXIgdHJhbnNmb3JtID0gZXh0LnRyYW5zZm9ybTtcblxudmFyIFV0aWwgPSBfX2Fzc2lnbihfX2Fzc2lnbihfX2Fzc2lnbihfX2Fzc2lnbihfX2Fzc2lnbihfX2Fzc2lnbih7fSwgQmFzZVV0aWwpLCBHcmFwaGljVXRpbCksIFBhdGhVdGlsKSwgTWF0aFV0aWwpLCBDb2xvclV0aWwpLCB7XG4gIHRyYW5zZm9ybTogdHJhbnNmb3JtLFxuICBtYXQzOiBtYXQzXG59KTtcblxuZXhwb3J0IGRlZmF1bHQgVXRpbDsiLCJpbXBvcnQgeyBfX2Fzc2lnbiwgX19yZXN0IH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBpc0Z1bmN0aW9uLCBncm91cEJ5IH0gZnJvbSAnQGFudHYvdXRpbCc7XG5pbXBvcnQgeyBpc05hTiwgY2FsY3VsYXRpb25JdGVtc0JCb3ggfSBmcm9tICcuLi8uLi91dGlsL2Jhc2UnO1xuXG52YXIgTGF5b3V0Q29udHJvbGxlciA9XG4vKiogQGNsYXNzICovXG5mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIExheW91dENvbnRyb2xsZXIoZ3JhcGgpIHtcbiAgICB0aGlzLmdyYXBoID0gZ3JhcGg7XG4gICAgdGhpcy5sYXlvdXRDZmcgPSBncmFwaC5nZXQoJ2xheW91dCcpIHx8IHt9O1xuICAgIHRoaXMubGF5b3V0VHlwZSA9IHRoaXMuZ2V0TGF5b3V0VHlwZSgpO1xuICAgIHRoaXMubGF5b3V0TWV0aG9kcyA9IFtdO1xuICAgIHRoaXMuaW5pdExheW91dCgpO1xuICB9IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjbGFzcy1tZXRob2RzLXVzZS10aGlzXG5cblxuICBMYXlvdXRDb250cm9sbGVyLnByb3RvdHlwZS5pbml0TGF5b3V0ID0gZnVuY3Rpb24gKCkgey8vIG5vIGRhdGEgYmVmb3JlIHJlbmRlcmluZ1xuICB9O1xuXG4gIExheW91dENvbnRyb2xsZXIucHJvdG90eXBlLmdldExheW91dFR5cGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TGF5b3V0Q2ZnVHlwZSh0aGlzLmxheW91dENmZyk7XG4gIH07XG5cbiAgTGF5b3V0Q29udHJvbGxlci5wcm90b3R5cGUuZ2V0TGF5b3V0Q2ZnVHlwZSA9IGZ1bmN0aW9uIChsYXlvdXRDZmcpIHtcbiAgICB2YXIgdHlwZSA9IGxheW91dENmZy50eXBlOyAvLyB0eXBlIHNob3VsZCBiZSB0b3AgcHJpb3JpdHlcblxuICAgIGlmICh0eXBlKSB7XG4gICAgICByZXR1cm4gdHlwZTtcbiAgICB9XG5cbiAgICB2YXIgcGlwZXMgPSBsYXlvdXRDZmcucGlwZXM7XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShwaXBlcykpIHtcbiAgICAgIHJldHVybiBwaXBlcy5tYXAoZnVuY3Rpb24gKHBpcGUpIHtcbiAgICAgICAgcmV0dXJuIChwaXBlID09PSBudWxsIHx8IHBpcGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHBpcGUudHlwZSkgfHwgJyc7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfTtcblxuICBMYXlvdXRDb250cm9sbGVyLnByb3RvdHlwZS5pc0xheW91dFR5cGVTYW1lID0gZnVuY3Rpb24gKGNmZykge1xuICAgIHZhciBjdXJyZW50ID0gdGhpcy5nZXRMYXlvdXRDZmdUeXBlKGNmZyk7IC8vIGFscmVhZHkgaGFzIHBpcGVzXG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLmxheW91dFR5cGUpKSB7XG4gICAgICByZXR1cm4gdGhpcy5sYXlvdXRUeXBlLmV2ZXJ5KGZ1bmN0aW9uICh0eXBlLCBpbmRleCkge1xuICAgICAgICByZXR1cm4gdHlwZSA9PT0gY3VycmVudFtpbmRleF07XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gKGNmZyA9PT0gbnVsbCB8fCBjZmcgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNmZy50eXBlKSA9PT0gdGhpcy5sYXlvdXRUeXBlO1xuICB9OyAvLyDnu5jliLZcblxuXG4gIExheW91dENvbnRyb2xsZXIucHJvdG90eXBlLnJlZnJlc2hMYXlvdXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGdyYXBoID0gdGhpcy5ncmFwaDtcbiAgICBpZiAoIWdyYXBoKSByZXR1cm47XG5cbiAgICBpZiAoZ3JhcGguZ2V0KCdhbmltYXRlJykpIHtcbiAgICAgIGdyYXBoLnBvc2l0aW9uc0FuaW1hdGUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZ3JhcGgucmVmcmVzaFBvc2l0aW9ucygpO1xuICAgIH1cbiAgfTsgLy8g5pu05o2i5biD5bGAXG5cblxuICBMYXlvdXRDb250cm9sbGVyLnByb3RvdHlwZS5jaGFuZ2VMYXlvdXQgPSBmdW5jdGlvbiAoY2ZnKSB7XG4gICAgdGhpcy5sYXlvdXRDZmcgPSBjZmc7XG4gICAgdGhpcy5kZXN0b3J5TGF5b3V0TWV0aG9kcygpO1xuICAgIHRoaXMubGF5b3V0KCk7XG4gIH07IC8vIOabtOaNouaVsOaNrlxuXG5cbiAgTGF5b3V0Q29udHJvbGxlci5wcm90b3R5cGUuY2hhbmdlRGF0YSA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmRlc3RvcnlMYXlvdXRNZXRob2RzKCk7XG4gICAgdGhpcy5sYXlvdXQoKTtcbiAgfTtcblxuICBMYXlvdXRDb250cm9sbGVyLnByb3RvdHlwZS5kZXN0b3J5TGF5b3V0TWV0aG9kcyA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgbGF5b3V0TWV0aG9kcyA9IHRoaXMubGF5b3V0TWV0aG9kcztcbiAgICBsYXlvdXRNZXRob2RzID09PSBudWxsIHx8IGxheW91dE1ldGhvZHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxheW91dE1ldGhvZHMuZm9yRWFjaChmdW5jdGlvbiAobGF5b3V0TWV0aG9kKSB7XG4gICAgICBsYXlvdXRNZXRob2QuZGVzdHJveSgpO1xuICAgIH0pO1xuICAgIHRoaXMubGF5b3V0TWV0aG9kcyA9IFtdO1xuICB9OyAvLyDplIDmr4HluIPlsYDvvIzkuI3og73kvb/nlKggdGhpcy5kZXN0cm9577yM5Zug5Li6IGNvbnRyb2xsZXIg6L+Y6ZyA6KaB6KKr5L2/55So77yM5Y+q5piv5oqK5biD5bGA566X5rOV6ZSA5q+BXG5cblxuICBMYXlvdXRDb250cm9sbGVyLnByb3RvdHlwZS5kZXN0cm95TGF5b3V0ID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBncmFwaCA9IHRoaXMuZ3JhcGg7XG4gICAgdGhpcy5kZXN0b3J5TGF5b3V0TWV0aG9kcygpO1xuICAgIGdyYXBoLnNldCgnbGF5b3V0JywgdW5kZWZpbmVkKTtcbiAgICB0aGlzLmxheW91dENmZyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmxheW91dFR5cGUgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5sYXlvdXRNZXRob2RzID0gdW5kZWZpbmVkO1xuICB9OyAvLyDku44gdGhpcy5ncmFwaCDojrflj5bmlbDmja5cblxuXG4gIExheW91dENvbnRyb2xsZXIucHJvdG90eXBlLnNldERhdGFGcm9tR3JhcGggPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIG5vZGVzID0gW107XG4gICAgdmFyIGhpZGRlbk5vZGVzID0gW107XG4gICAgdmFyIGVkZ2VzID0gW107XG4gICAgdmFyIGhpZGRlbkVkZ2VzID0gW107XG4gICAgdmFyIGNvbWJvRWRnZXMgPSBbXTtcbiAgICB2YXIgY29tYm9zID0gW107XG4gICAgdmFyIGhpZGRlbkNvbWJvcyA9IFtdO1xuICAgIHZhciBub2RlSXRlbXMgPSB0aGlzLmdyYXBoLmdldE5vZGVzKCk7XG4gICAgdmFyIGVkZ2VJdGVtcyA9IHRoaXMuZ3JhcGguZ2V0RWRnZXMoKTtcbiAgICB2YXIgY29tYm9JdGVtcyA9IHRoaXMuZ3JhcGguZ2V0Q29tYm9zKCk7XG4gICAgdmFyIG5vZGVMZW5ndGggPSBub2RlSXRlbXMubGVuZ3RoO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlTGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBub2RlSXRlbSA9IG5vZGVJdGVtc1tpXTtcbiAgICAgIGlmICghbm9kZUl0ZW0gfHwgbm9kZUl0ZW0uZGVzdHJveWVkKSBjb250aW51ZTtcbiAgICAgIHZhciBtb2RlbCA9IG5vZGVJdGVtLmdldE1vZGVsKCk7XG5cbiAgICAgIGlmICghbm9kZUl0ZW0uaXNWaXNpYmxlKCkpIHtcbiAgICAgICAgaGlkZGVuTm9kZXMucHVzaChtb2RlbCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBub2Rlcy5wdXNoKG1vZGVsKTtcbiAgICB9XG5cbiAgICB2YXIgZWRnZUxlbmd0aCA9IGVkZ2VJdGVtcy5sZW5ndGg7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVkZ2VMZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVkZ2VJdGVtID0gZWRnZUl0ZW1zW2ldO1xuICAgICAgaWYgKCFlZGdlSXRlbSB8fCBlZGdlSXRlbS5kZXN0cm95ZWQpIGNvbnRpbnVlO1xuICAgICAgdmFyIG1vZGVsID0gZWRnZUl0ZW0uZ2V0TW9kZWwoKTtcblxuICAgICAgaWYgKCFlZGdlSXRlbS5pc1Zpc2libGUoKSkge1xuICAgICAgICBoaWRkZW5FZGdlcy5wdXNoKG1vZGVsKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmICghbW9kZWwuaXNDb21ib0VkZ2UpIGVkZ2VzLnB1c2gobW9kZWwpO2Vsc2UgY29tYm9FZGdlcy5wdXNoKG1vZGVsKTtcbiAgICB9XG5cbiAgICB2YXIgY29tYm9MZW5ndGggPSBjb21ib0l0ZW1zLmxlbmd0aDtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29tYm9MZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGNvbWJvSXRlbSA9IGNvbWJvSXRlbXNbaV07XG4gICAgICBpZiAoY29tYm9JdGVtLmRlc3Ryb3llZCkgY29udGludWU7XG4gICAgICB2YXIgbW9kZWwgPSBjb21ib0l0ZW0uZ2V0TW9kZWwoKTtcblxuICAgICAgaWYgKCFjb21ib0l0ZW0uaXNWaXNpYmxlKCkpIHtcbiAgICAgICAgaGlkZGVuRWRnZXMucHVzaChtb2RlbCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb21ib3MucHVzaChtb2RlbCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIG5vZGVzOiBub2RlcyxcbiAgICAgIGhpZGRlbk5vZGVzOiBoaWRkZW5Ob2RlcyxcbiAgICAgIGVkZ2VzOiBlZGdlcyxcbiAgICAgIGhpZGRlbkVkZ2VzOiBoaWRkZW5FZGdlcyxcbiAgICAgIGNvbWJvczogY29tYm9zLFxuICAgICAgaGlkZGVuQ29tYm9zOiBoaWRkZW5Db21ib3MsXG4gICAgICBjb21ib0VkZ2VzOiBjb21ib0VkZ2VzXG4gICAgfTtcbiAgfTtcblxuICBMYXlvdXRDb250cm9sbGVyLnByb3RvdHlwZS5yZUxheW91dE1ldGhvZCA9IGZ1bmN0aW9uIChsYXlvdXRNZXRob2QsIGxheW91dENmZykge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc2xvdmUsIHJlamVjdCkge1xuICAgICAgdmFyIGdyYXBoID0gX3RoaXMuZ3JhcGg7XG4gICAgICB2YXIgbGF5b3V0VHlwZSA9IGxheW91dENmZyA9PT0gbnVsbCB8fCBsYXlvdXRDZmcgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxheW91dENmZy50eXBlOyAvLyDmr4/kuKrluIPlsYDmlrnms5Xpg73pnIDopoHms6jlhoxcblxuICAgICAgbGF5b3V0Q2ZnLm9uTGF5b3V0RW5kID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBncmFwaC5lbWl0KCdhZnRlcnN1YmxheW91dCcsIHtcbiAgICAgICAgICB0eXBlOiBsYXlvdXRUeXBlXG4gICAgICAgIH0pO1xuICAgICAgICByZXNsb3ZlKCk7XG4gICAgICB9O1xuXG4gICAgICBsYXlvdXRNZXRob2QuaW5pdChfdGhpcy5kYXRhKTtcblxuICAgICAgaWYgKGxheW91dFR5cGUgPT09ICdmb3JjZScpIHtcbiAgICAgICAgbGF5b3V0TWV0aG9kLnRpY2tpbmcgPSBmYWxzZTtcbiAgICAgICAgbGF5b3V0TWV0aG9kLmZvcmNlU2ltdWxhdGlvbi5zdG9wKCk7XG4gICAgICB9XG5cbiAgICAgIGdyYXBoLmVtaXQoJ2JlZm9yZXN1YmxheW91dCcsIHtcbiAgICAgICAgdHlwZTogbGF5b3V0VHlwZVxuICAgICAgfSk7XG4gICAgICBsYXlvdXRNZXRob2QuZXhlY3V0ZSgpO1xuICAgICAgaWYgKGxheW91dE1ldGhvZC5pc0N1c3RvbUxheW91dCAmJiBsYXlvdXRDZmcub25MYXlvdXRFbmQpIGxheW91dENmZy5vbkxheW91dEVuZCgpO1xuICAgIH0pO1xuICB9OyAvLyDph43mlrDluIPlsYBcblxuXG4gIExheW91dENvbnRyb2xsZXIucHJvdG90eXBlLnJlbGF5b3V0ID0gZnVuY3Rpb24gKHJlbG9hZERhdGEpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdmFyIF9hID0gdGhpcyxcbiAgICAgICAgZ3JhcGggPSBfYS5ncmFwaCxcbiAgICAgICAgbGF5b3V0TWV0aG9kcyA9IF9hLmxheW91dE1ldGhvZHMsXG4gICAgICAgIGxheW91dENmZyA9IF9hLmxheW91dENmZztcblxuICAgIGlmIChyZWxvYWREYXRhKSB7XG4gICAgICB0aGlzLmRhdGEgPSB0aGlzLnNldERhdGFGcm9tR3JhcGgoKTtcbiAgICAgIHZhciBub2RlcyA9IHRoaXMuZGF0YS5ub2RlcztcblxuICAgICAgaWYgKCFub2Rlcykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuaW5pdFBvc2l0aW9ucyhsYXlvdXRDZmcuY2VudGVyLCBub2Rlcyk7XG4gICAgfVxuXG4gICAgZ3JhcGguZW1pdCgnYmVmb3JlbGF5b3V0Jyk7XG4gICAgdmFyIHN0YXJ0ID0gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgbGF5b3V0TWV0aG9kcyA9PT0gbnVsbCB8fCBsYXlvdXRNZXRob2RzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBsYXlvdXRNZXRob2RzLmZvckVhY2goZnVuY3Rpb24gKGxheW91dE1ldGhvZCwgaW5kZXgpIHtcbiAgICAgIHZhciBjdXJyZW50Q2ZnID0gbGF5b3V0Q2ZnW2luZGV4XTtcbiAgICAgIHN0YXJ0ID0gc3RhcnQudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfdGhpcy5yZUxheW91dE1ldGhvZChsYXlvdXRNZXRob2QsIGN1cnJlbnRDZmcpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgc3RhcnQudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAobGF5b3V0Q2ZnLm9uQWxsTGF5b3V0RW5kKSBsYXlvdXRDZmcub25BbGxMYXlvdXRFbmQoKTtcbiAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybigncmVsYXlvdXQgZmFpbGVkJywgZXJyb3IpO1xuICAgIH0pO1xuICB9OyAvLyDnrZvpgInlj4LkuI7luIPlsYDnmoRub2Rlc+WSjGVkZ2VzXG5cblxuICBMYXlvdXRDb250cm9sbGVyLnByb3RvdHlwZS5maWx0ZXJMYXlvdXREYXRhID0gZnVuY3Rpb24gKGRhdGEsIGNmZykge1xuICAgIHZhciBub2RlcyA9IGRhdGEubm9kZXMsXG4gICAgICAgIGVkZ2VzID0gZGF0YS5lZGdlcyxcbiAgICAgICAgcmVzdCA9IF9fcmVzdChkYXRhLCBbXCJub2Rlc1wiLCBcImVkZ2VzXCJdKTtcblxuICAgIGlmICghbm9kZXMpIHtcbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cblxuICAgIHZhciBub2Rlc0ZpbHRlcjtcbiAgICB2YXIgZWRlZ3NGaWx0ZXI7XG5cbiAgICBpZiAoaXNGdW5jdGlvbihjZmcgPT09IG51bGwgfHwgY2ZnID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjZmcubm9kZXNGaWx0ZXIpKSB7XG4gICAgICBub2Rlc0ZpbHRlciA9IGNmZy5ub2Rlc0ZpbHRlcjtcbiAgICB9IGVsc2Uge1xuICAgICAgbm9kZXNGaWx0ZXIgPSBmdW5jdGlvbiBub2Rlc0ZpbHRlcigpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBmTm9kZXMgPSBub2Rlcy5maWx0ZXIobm9kZXNGaWx0ZXIpO1xuXG4gICAgaWYgKGlzRnVuY3Rpb24oY2ZnID09PSBudWxsIHx8IGNmZyA9PT0gdm9pZCAwID8gdm9pZCAwIDogY2ZnLmVkZ2VzRmlsdGVyKSkge1xuICAgICAgZWRlZ3NGaWx0ZXIgPSBjZmcuZWRnZXNGaWx0ZXI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBub2Rlc01hcF8xID0gZk5vZGVzLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBjdXIpIHtcbiAgICAgICAgYWNjW2N1ci5pZF0gPSB0cnVlO1xuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfSwge30pO1xuXG4gICAgICBlZGVnc0ZpbHRlciA9IGZ1bmN0aW9uIGVkZWdzRmlsdGVyKGVkZ2UpIHtcbiAgICAgICAgcmV0dXJuIG5vZGVzTWFwXzFbZWRnZS5zb3VyY2VdICYmIG5vZGVzTWFwXzFbZWRnZS50YXJnZXRdO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gX19hc3NpZ24oe1xuICAgICAgbm9kZXM6IGZOb2RlcyxcbiAgICAgIGVkZ2VzOiBlZGdlcy5maWx0ZXIoZWRlZ3NGaWx0ZXIpXG4gICAgfSwgcmVzdCk7XG4gIH07XG5cbiAgTGF5b3V0Q29udHJvbGxlci5wcm90b3R5cGUuZ2V0TGF5b3V0QkJveCA9IGZ1bmN0aW9uIChub2Rlcykge1xuICAgIHZhciBncmFwaCA9IHRoaXMuZ3JhcGg7XG4gICAgdmFyIGdyYXBoR3JvdXBOb2RlcyA9IGdyb3VwQnkoZ3JhcGguZ2V0Tm9kZXMoKSwgZnVuY3Rpb24gKG4pIHtcbiAgICAgIHJldHVybiBuLmdldE1vZGVsKCkubGF5b3V0T3JkZXI7XG4gICAgfSk7XG4gICAgdmFyIGxheW91dE5vZGVzID0gT2JqZWN0LnZhbHVlcyhncmFwaEdyb3VwTm9kZXMpLm1hcChmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIHZhciBiYm94ID0gY2FsY3VsYXRpb25JdGVtc0JCb3godmFsdWUpO1xuICAgICAgYmJveC5zaXplID0gW2Jib3gud2lkdGgsIGJib3guaGVpZ2h0XTtcbiAgICAgIHJldHVybiBiYm94O1xuICAgIH0pO1xuICAgIHZhciBncm91cE5vZGVzID0gT2JqZWN0LnZhbHVlcyhncm91cEJ5KG5vZGVzLCAnbGF5b3V0T3JkZXInKSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGdyb3VwTm9kZXM6IGdyb3VwTm9kZXMsXG4gICAgICBsYXlvdXROb2RlczogbGF5b3V0Tm9kZXNcbiAgICB9O1xuICB9OyAvLyDmjqfliLbluIPlsYDliqjnlLtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNsYXNzLW1ldGhvZHMtdXNlLXRoaXNcblxuXG4gIExheW91dENvbnRyb2xsZXIucHJvdG90eXBlLmxheW91dEFuaW1hdGUgPSBmdW5jdGlvbiAoKSB7fTsgLy8g5bCG5b2T5YmN6IqC54K555qE5bmz5Z2H5Lit5b+D56e75Yqo5Yiw5Y6f54K5XG5cblxuICBMYXlvdXRDb250cm9sbGVyLnByb3RvdHlwZS5tb3ZlVG9aZXJvID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBncmFwaCA9IHRoaXMuZ3JhcGg7XG4gICAgdmFyIGRhdGEgPSBncmFwaC5nZXQoJ2RhdGEnKTtcbiAgICB2YXIgbm9kZXMgPSBkYXRhLm5vZGVzO1xuXG4gICAgaWYgKG5vZGVzWzBdLnggPT09IHVuZGVmaW5lZCB8fCBub2Rlc1swXS54ID09PSBudWxsIHx8IGlzTmFOKG5vZGVzWzBdLngpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIG1lYW5DZW50ZXIgPSBbMCwgMF07XG4gICAgdmFyIG5vZGVMZW5ndGggPSBub2Rlcy5sZW5ndGg7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVMZW5ndGg7IGkrKykge1xuICAgICAgdmFyIG5vZGUgPSBub2Rlc1tpXTtcbiAgICAgIG1lYW5DZW50ZXJbMF0gKz0gbm9kZS54O1xuICAgICAgbWVhbkNlbnRlclsxXSArPSBub2RlLnk7XG4gICAgfVxuXG4gICAgbWVhbkNlbnRlclswXSAvPSBub2Rlcy5sZW5ndGg7XG4gICAgbWVhbkNlbnRlclsxXSAvPSBub2Rlcy5sZW5ndGg7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVMZW5ndGg7IGkrKykge1xuICAgICAgdmFyIG5vZGUgPSBub2Rlc1tpXTtcbiAgICAgIG5vZGUueCAtPSBtZWFuQ2VudGVyWzBdO1xuICAgICAgbm9kZS55IC09IG1lYW5DZW50ZXJbMV07XG4gICAgfVxuICB9OyAvLyDliJ3lp4vljJboioLngrnliLAgY2VudGVyIOmZhOi/kVxuXG5cbiAgTGF5b3V0Q29udHJvbGxlci5wcm90b3R5cGUuaW5pdFBvc2l0aW9ucyA9IGZ1bmN0aW9uIChjZW50ZXIsIG5vZGVzKSB7XG4gICAgdmFyIGdyYXBoID0gdGhpcy5ncmFwaDtcblxuICAgIGlmICghbm9kZXMpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB2YXIgbm9kZUxlbmd0aCA9IG5vZGVzID8gbm9kZXMubGVuZ3RoIDogMDtcbiAgICBpZiAoIW5vZGVMZW5ndGgpIHJldHVybjtcbiAgICB2YXIgd2lkdGggPSBncmFwaC5nZXQoJ3dpZHRoJykgKiAwLjg1O1xuICAgIHZhciBoZWlnaHQgPSBncmFwaC5nZXQoJ2hlaWdodCcpICogMC44NTtcbiAgICB2YXIgaG9yaU51bSA9IE1hdGguY2VpbChNYXRoLnNxcnQobm9kZUxlbmd0aCkgKiAod2lkdGggLyBoZWlnaHQpKTtcbiAgICB2YXIgdmVydGlOdW0gPSBNYXRoLmNlaWwobm9kZUxlbmd0aCAvIGhvcmlOdW0pO1xuICAgIHZhciBob3JpR2FwID0gd2lkdGggLyAoaG9yaU51bSAtIDEpO1xuICAgIHZhciB2ZXJ0aUdhcCA9IGhlaWdodCAvICh2ZXJ0aU51bSAtIDEpO1xuICAgIGlmICghaXNGaW5pdGUoaG9yaUdhcCkgfHwgIWhvcmlHYXApIGhvcmlHYXAgPSAwO1xuICAgIGlmICghaXNGaW5pdGUodmVydGlHYXApIHx8ICFob3JpR2FwKSB2ZXJ0aUdhcCA9IDA7XG4gICAgdmFyIGJlZ2luWCA9IGNlbnRlclswXSAtIHdpZHRoIC8gMjtcbiAgICB2YXIgYmVnaW5ZID0gY2VudGVyWzFdIC0gaGVpZ2h0IC8gMjtcbiAgICB2YXIgYWxsSGF2ZVBvcyA9IHRydWU7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVMZW5ndGg7IGkrKykge1xuICAgICAgdmFyIG5vZGUgPSBub2Rlc1tpXTtcblxuICAgICAgaWYgKGlzTmFOKCtub2RlLngpKSB7XG4gICAgICAgIGFsbEhhdmVQb3MgPSBmYWxzZTtcbiAgICAgICAgbm9kZS54ID0gaSAlIGhvcmlOdW0gKiBob3JpR2FwICsgYmVnaW5YO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNOYU4oK25vZGUueSkpIHtcbiAgICAgICAgYWxsSGF2ZVBvcyA9IGZhbHNlO1xuICAgICAgICBub2RlLnkgPSBNYXRoLmZsb29yKGkgLyBob3JpTnVtKSAqIHZlcnRpR2FwICsgYmVnaW5ZO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBhbGxIYXZlUG9zO1xuICB9O1xuXG4gIExheW91dENvbnRyb2xsZXIucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5ncmFwaCA9IG51bGw7XG4gICAgdGhpcy5kZXN0b3J5TGF5b3V0TWV0aG9kcygpO1xuICAgIHRoaXMuZGVzdHJveWVkID0gdHJ1ZTtcbiAgfTtcblxuICByZXR1cm4gTGF5b3V0Q29udHJvbGxlcjtcbn0oKTtcblxuZXhwb3J0IGRlZmF1bHQgTGF5b3V0Q29udHJvbGxlcjsiLCJ2YXIgRXZlbnRDb250cm9sbGVyID1cbi8qKiBAY2xhc3MgKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gRXZlbnRDb250cm9sbGVyKGdyYXBoKSB7XG4gICAgdGhpcy5ncmFwaCA9IGdyYXBoO1xuICAgIHRoaXMuZGVzdHJveWVkID0gZmFsc2U7XG4gICAgdGhpcy5pbml0RXZlbnRzKCk7XG4gIH1cblxuICByZXR1cm4gRXZlbnRDb250cm9sbGVyO1xufSgpO1xuXG5leHBvcnQgZGVmYXVsdCBFdmVudENvbnRyb2xsZXI7IiwiZXhwb3J0ICogZnJvbSAnLi9ncmFwaCc7XG5leHBvcnQgKiBmcm9tICcuL2JlaGF2aW9yJztcbmV4cG9ydCAqIGZyb20gJy4vaXRlbSc7XG5leHBvcnQgKiBmcm9tICcuL3NoYXBlJzsiLCJleHBvcnQgKiBmcm9tICcuLi9pbnRlcmZhY2UnOyAvLyBCZWhhdmlvciB0eXBlIGZpbGVcblxuZXhwb3J0IHZhciBHNkV2ZW50O1xuXG4oZnVuY3Rpb24gKEc2RXZlbnQpIHtcbiAgLy8gY29tbW9uIGV2ZW50c1xuICBHNkV2ZW50W1wiQ0xJQ0tcIl0gPSBcImNsaWNrXCI7XG4gIEc2RXZlbnRbXCJEQkxDTElDS1wiXSA9IFwiZGJsY2xpY2tcIjtcbiAgRzZFdmVudFtcIk1PVVNFRE9XTlwiXSA9IFwibW91c2Vkb3duXCI7XG4gIEc2RXZlbnRbXCJNT1VERVVQXCJdID0gXCJtb3VzZXVwXCI7XG4gIEc2RXZlbnRbXCJDT05URVhUTUVOVVwiXSA9IFwiY29udGV4dG1lbnVcIjtcbiAgRzZFdmVudFtcIk1PVVNFRU5URVJcIl0gPSBcIm1vdXNlZW50ZXJcIjtcbiAgRzZFdmVudFtcIk1PVVNFT1VUXCJdID0gXCJtb3VzZW91dFwiO1xuICBHNkV2ZW50W1wiTU9VU0VPVkVSXCJdID0gXCJtb3VzZW92ZXJcIjtcbiAgRzZFdmVudFtcIk1PVVNFTU9WRVwiXSA9IFwibW91c2Vtb3ZlXCI7XG4gIEc2RXZlbnRbXCJNT1VTRUxFQVZFXCJdID0gXCJtb3VzZWxlYXZlXCI7XG4gIEc2RXZlbnRbXCJEUkFHU1RBUlRcIl0gPSBcImRyYWdzdGFydFwiO1xuICBHNkV2ZW50W1wiRFJBR0VORFwiXSA9IFwiZHJhZ2VuZFwiO1xuICBHNkV2ZW50W1wiRFJBR1wiXSA9IFwiZHJhZ1wiO1xuICBHNkV2ZW50W1wiRFJBR0VOVEVSXCJdID0gXCJkcmFnZW50ZXJcIjtcbiAgRzZFdmVudFtcIkRSQUdMRUFWRVwiXSA9IFwiZHJhZ2xlYXZlXCI7XG4gIEc2RXZlbnRbXCJEUkFHT1ZFUlwiXSA9IFwiZHJhZ292ZXJcIjtcbiAgRzZFdmVudFtcIkRSQUdPVVRcIl0gPSBcImRyYWdvdXRcIjtcbiAgRzZFdmVudFtcIkREUk9QXCJdID0gXCJkcm9wXCI7XG4gIEc2RXZlbnRbXCJLRVlVUFwiXSA9IFwia2V5dXBcIjtcbiAgRzZFdmVudFtcIktFWURPV05cIl0gPSBcImtleWRvd25cIjtcbiAgRzZFdmVudFtcIldIRUVMXCJdID0gXCJ3aGVlbFwiO1xuICBHNkV2ZW50W1wiRk9DVVNcIl0gPSBcImZvY3VzXCI7XG4gIEc2RXZlbnRbXCJCTFVSXCJdID0gXCJibHVyXCI7IC8vIHRvdWNoIGV2ZW50c1xuXG4gIEc2RXZlbnRbXCJUT1VDSFNUQVJUXCJdID0gXCJ0b3VjaHN0YXJ0XCI7XG4gIEc2RXZlbnRbXCJUT1VDSE1PVkVcIl0gPSBcInRvdWNobW92ZVwiO1xuICBHNkV2ZW50W1wiVE9VQ0hFTkRcIl0gPSBcInRvdWNoZW5kXCI7XG4gIEc2RXZlbnRbXCJDQU5WQVNfVE9VQ0hTVEFSVFwiXSA9IFwiY2FudmFzOnRvdWNoc3RhcnRcIjtcbiAgRzZFdmVudFtcIkNBTlZBU19UT1VDSE1PVkVcIl0gPSBcImNhbnZhczp0b3VjaG1vdmVcIjtcbiAgRzZFdmVudFtcIkNBTlZBU19UT1VDSEVORFwiXSA9IFwiY2FudmFzOnRvdWNoZW5kXCI7XG4gIEc2RXZlbnRbXCJOT0RFX1RPVUNIU1RBUlRcIl0gPSBcIm5vZGU6dG91Y2hzdGFydFwiO1xuICBHNkV2ZW50W1wiTk9ERV9UT1VDSE1PVkVcIl0gPSBcIm5vZGU6dG91Y2htb3ZlXCI7XG4gIEc2RXZlbnRbXCJOT0RFX1RPVUNIRU5EXCJdID0gXCJub2RlOnRvdWNoZW5kXCI7XG4gIEc2RXZlbnRbXCJDT01CT19UT1VDSFNUQVJUXCJdID0gXCJjb21ibzp0b3VjaHN0YXJ0XCI7XG4gIEc2RXZlbnRbXCJDT01CT19UT1VDSE1PVkVcIl0gPSBcImNvbWJvOnRvdWNobW92ZVwiO1xuICBHNkV2ZW50W1wiQ09NQk9fVE9VQ0hFTkRcIl0gPSBcImNvbWJvOnRvdWNoZW5kXCI7XG4gIEc2RXZlbnRbXCJFREdFX1RPVUNIU1RBUlRcIl0gPSBcImVkZ2U6dG91Y2hzdGFydFwiO1xuICBHNkV2ZW50W1wiRURHRV9UT1VDSE1PVkVcIl0gPSBcImVkZ2U6dG91Y2htb3ZlXCI7XG4gIEc2RXZlbnRbXCJFREdFX1RPVUNIRU5EXCJdID0gXCJlZGdlOnRvdWNoZW5kXCI7IC8vIG5vZGUgZXZlbnRzXG5cbiAgRzZFdmVudFtcIk5PREVfQ09OVEVYVE1FTlVcIl0gPSBcIm5vZGU6Y29udGV4dG1lbnVcIjtcbiAgRzZFdmVudFtcIk5PREVfQ0xJQ0tcIl0gPSBcIm5vZGU6Y2xpY2tcIjtcbiAgRzZFdmVudFtcIk5PREVfREJMQ0xJQ0tcIl0gPSBcIm5vZGU6ZGJsY2xpY2tcIjtcbiAgRzZFdmVudFtcIk5PREVfTU9VU0VET1dOXCJdID0gXCJub2RlOm1vdXNlZG93blwiO1xuICBHNkV2ZW50W1wiTk9ERV9NT1VTRVVQXCJdID0gXCJub2RlOm1vdXNldXBcIjtcbiAgRzZFdmVudFtcIk5PREVfTU9VU0VFTlRFUlwiXSA9IFwibm9kZTptb3VzZWVudGVyXCI7XG4gIEc2RXZlbnRbXCJOT0RFX01PVVNFTEVBVkVcIl0gPSBcIm5vZGU6bW91c2VsZWF2ZVwiO1xuICBHNkV2ZW50W1wiTk9ERV9NT1VTRU1PVkVcIl0gPSBcIm5vZGU6bW91c2Vtb3ZlXCI7XG4gIEc2RXZlbnRbXCJOT0RFX01PVVNFT1VUXCJdID0gXCJub2RlOm1vdXNlb3V0XCI7XG4gIEc2RXZlbnRbXCJOT0RFX01PVVNFT1ZFUlwiXSA9IFwibm9kZTptb3VzZW92ZXJcIjtcbiAgRzZFdmVudFtcIk5PREVfRFJPUFwiXSA9IFwibm9kZTpkcm9wXCI7XG4gIEc2RXZlbnRbXCJOT0RFX0RSQUdPVkVSXCJdID0gXCJub2RlOmRyYWdvdmVyXCI7XG4gIEc2RXZlbnRbXCJOT0RFX0RSQUdFTlRFUlwiXSA9IFwibm9kZTpkcmFnZW50ZXJcIjtcbiAgRzZFdmVudFtcIk5PREVfRFJBR0xFQVZFXCJdID0gXCJub2RlOmRyYWdsZWF2ZVwiO1xuICBHNkV2ZW50W1wiTk9ERV9EUkFHU1RBUlRcIl0gPSBcIm5vZGU6ZHJhZ3N0YXJ0XCI7XG4gIEc2RXZlbnRbXCJOT0RFX0RSQUdcIl0gPSBcIm5vZGU6ZHJhZ1wiO1xuICBHNkV2ZW50W1wiTk9ERV9EUkFHRU5EXCJdID0gXCJub2RlOmRyYWdlbmRcIjtcbiAgRzZFdmVudFtcIk5PREVfVEFQXCJdID0gXCJub2RlOnRhcFwiO1xuICBHNkV2ZW50W1wiTk9ERV9QQU5TVEFSVFwiXSA9IFwibm9kZTpwYW5zdGFydFwiO1xuICBHNkV2ZW50W1wiTk9ERV9QQU5NT1ZFXCJdID0gXCJub2RlOnBhbm1vdmVcIjtcbiAgRzZFdmVudFtcIk5PREVfUEFORU5EXCJdID0gXCJub2RlOnBhbmVuZFwiOyAvLyBjb21ibywgZXh0ZW5kcyBmcm9tIG5vZGVzXG5cbiAgRzZFdmVudFtcIkNPTUJPX0NPTlRFWFRNRU5VXCJdID0gXCJjb21ibzpjb250ZXh0bWVudVwiO1xuICBHNkV2ZW50W1wiQ09NQk9fQ0xJQ0tcIl0gPSBcImNvbWJvOmNsaWNrXCI7XG4gIEc2RXZlbnRbXCJDT01CT19EQkxDTElDS1wiXSA9IFwiY29tYm86ZGJsY2xpY2tcIjtcbiAgRzZFdmVudFtcIkNPTUJPX01PVVNFRE9XTlwiXSA9IFwiY29tYm86bW91c2Vkb3duXCI7XG4gIEc2RXZlbnRbXCJDT01CT19NT1VTRVVQXCJdID0gXCJjb21ibzptb3VzZXVwXCI7XG4gIEc2RXZlbnRbXCJDT01CT19NT1VTRUVOVEVSXCJdID0gXCJjb21ibzptb3VzZWVudGVyXCI7XG4gIEc2RXZlbnRbXCJDT01CT19NT1VTRUxFQVZFXCJdID0gXCJjb21ibzptb3VzZWxlYXZlXCI7XG4gIEc2RXZlbnRbXCJDT01CT19NT1VTRU1PVkVcIl0gPSBcImNvbWJvOm1vdXNlbW92ZVwiO1xuICBHNkV2ZW50W1wiQ09NQk9fTU9VU0VPVVRcIl0gPSBcImNvbWJvOm1vdXNlb3V0XCI7XG4gIEc2RXZlbnRbXCJDT01CT19NT1VTRU9WRVJcIl0gPSBcImNvbWJvOm1vdXNlb3ZlclwiO1xuICBHNkV2ZW50W1wiQ09NQk9fRFJPUFwiXSA9IFwiY29tYm86ZHJvcFwiO1xuICBHNkV2ZW50W1wiQ09NQk9fRFJBR09WRVJcIl0gPSBcImNvbWJvOmRyYWdvdmVyXCI7XG4gIEc2RXZlbnRbXCJDT01CT19EUkFHRU5URVJcIl0gPSBcImNvbWJvOmRyYWdlbnRlclwiO1xuICBHNkV2ZW50W1wiQ09NQk9fRFJBR0xFQVZFXCJdID0gXCJjb21ibzpkcmFnbGVhdmVcIjtcbiAgRzZFdmVudFtcIkNPTUJPX0RSQUdTVEFSVFwiXSA9IFwiY29tYm86ZHJhZ3N0YXJ0XCI7XG4gIEc2RXZlbnRbXCJDT01CT19EUkFHXCJdID0gXCJjb21ibzpkcmFnXCI7XG4gIEc2RXZlbnRbXCJDT01CT19EUkFHRU5EXCJdID0gXCJjb21ibzpkcmFnZW5kXCI7XG4gIEc2RXZlbnRbXCJDT01CT19UQVBcIl0gPSBcImNvbWJvOnRhcFwiO1xuICBHNkV2ZW50W1wiQ09NQk9fUEFOU1RBUlRcIl0gPSBcImNvbWJvOnBhbnN0YXJ0XCI7XG4gIEc2RXZlbnRbXCJDT01CT19QQU5NT1ZFXCJdID0gXCJjb21ibzpwYW5tb3ZlXCI7XG4gIEc2RXZlbnRbXCJDT01CT19QQU5FTkRcIl0gPSBcImNvbWJvOnBhbmVuZFwiOyAvLyBlZGdlIGV2ZW50c1xuXG4gIEc2RXZlbnRbXCJFREdFX0NPTlRFWFRNRU5VXCJdID0gXCJlZGdlOmNvbnRleHRtZW51XCI7XG4gIEc2RXZlbnRbXCJFREdFX0NMSUNLXCJdID0gXCJlZGdlOmNsaWNrXCI7XG4gIEc2RXZlbnRbXCJFREdFX0RCTENMSUNLXCJdID0gXCJlZGdlOmRibGNsaWNrXCI7XG4gIEc2RXZlbnRbXCJFREdFX01PVVNFRE9XTlwiXSA9IFwiZWRnZTptb3VzZWRvd25cIjtcbiAgRzZFdmVudFtcIkVER0VfTU9VU0VVUFwiXSA9IFwiZWRnZTptb3VzZXVwXCI7XG4gIEc2RXZlbnRbXCJFREdFX01PVVNFRU5URVJcIl0gPSBcImVkZ2U6bW91c2VlbnRlclwiO1xuICBHNkV2ZW50W1wiRURHRV9NT1VTRUxFQVZFXCJdID0gXCJlZGdlOm1vdXNlbGVhdmVcIjtcbiAgRzZFdmVudFtcIkVER0VfTU9VU0VNT1ZFXCJdID0gXCJlZGdlOm1vdXNlbW92ZVwiO1xuICBHNkV2ZW50W1wiRURHRV9NT1VTRU9VVFwiXSA9IFwiZWRnZTptb3VzZW91dFwiO1xuICBHNkV2ZW50W1wiRURHRV9NT1VTRU9WRVJcIl0gPSBcImVkZ2U6bW91c2VvdmVyXCI7XG4gIEc2RXZlbnRbXCJFREdFX0RST1BcIl0gPSBcImVkZ2U6ZHJvcFwiO1xuICBHNkV2ZW50W1wiRURHRV9EUkFHT1ZFUlwiXSA9IFwiZWRnZTpkcmFnb3ZlclwiO1xuICBHNkV2ZW50W1wiRURHRV9EUkFHRU5URVJcIl0gPSBcImVkZ2U6ZHJhZ2VudGVyXCI7XG4gIEc2RXZlbnRbXCJFREdFX0RSQUdMRUFWRVwiXSA9IFwiZWRnZTpkcmFnbGVhdmVcIjsgLy8gY2FudmFzIGV2ZW50c1xuXG4gIEc2RXZlbnRbXCJDQU5WQVNfQ09OVEVYVE1FTlVcIl0gPSBcImNhbnZhczpjb250ZXh0bWVudVwiO1xuICBHNkV2ZW50W1wiQ0FOVkFTX0NMSUNLXCJdID0gXCJjYW52YXM6Y2xpY2tcIjtcbiAgRzZFdmVudFtcIkNBTlZBU19EQkxDTElDS1wiXSA9IFwiY2FudmFzOmRibGNsaWNrXCI7XG4gIEc2RXZlbnRbXCJDQU5WQVNfTU9VU0VET1dOXCJdID0gXCJjYW52YXM6bW91c2Vkb3duXCI7XG4gIEc2RXZlbnRbXCJDQU5WQVNfTU9VU0VVUFwiXSA9IFwiY2FudmFzOm1vdXNldXBcIjtcbiAgRzZFdmVudFtcIkNBTlZBU19NT1VTRUVOVEVSXCJdID0gXCJjYW52YXM6bW91c2VlbnRlclwiO1xuICBHNkV2ZW50W1wiQ0FOVkFTX01PVVNFTEVBVkVcIl0gPSBcImNhbnZhczptb3VzZWxlYXZlXCI7XG4gIEc2RXZlbnRbXCJDQU5WQVNfTU9VU0VNT1ZFXCJdID0gXCJjYW52YXM6bW91c2Vtb3ZlXCI7XG4gIEc2RXZlbnRbXCJDQU5WQVNfTU9VU0VPVVRcIl0gPSBcImNhbnZhczptb3VzZW91dFwiO1xuICBHNkV2ZW50W1wiQ0FOVkFTX01PVVNFT1ZFUlwiXSA9IFwiY2FudmFzOm1vdXNlb3ZlclwiO1xuICBHNkV2ZW50W1wiQ0FOVkFTX0RST1BcIl0gPSBcImNhbnZhczpkcm9wXCI7XG4gIEc2RXZlbnRbXCJDQU5WQVNfRFJBR0VOVEVSXCJdID0gXCJjYW52YXM6ZHJhZ2VudGVyXCI7XG4gIEc2RXZlbnRbXCJDQU5WQVNfRFJBR0xFQVZFXCJdID0gXCJjYW52YXM6ZHJhZ2xlYXZlXCI7XG4gIEc2RXZlbnRbXCJDQU5WQVNfRFJBR1NUQVJUXCJdID0gXCJjYW52YXM6ZHJhZ3N0YXJ0XCI7XG4gIEc2RXZlbnRbXCJDQU5WQVNfRFJBR1wiXSA9IFwiY2FudmFzOmRyYWdcIjtcbiAgRzZFdmVudFtcIkNBTlZBU19EUkFHRU5EXCJdID0gXCJjYW52YXM6ZHJhZ2VuZFwiO1xuICBHNkV2ZW50W1wiQ0FOVkFTX1RBUFwiXSA9IFwiY2FudmFzOnRhcFwiO1xuICBHNkV2ZW50W1wiQ0FOVkFTX1BBTlNUQVJUXCJdID0gXCJjYW52YXM6cGFuc3RhcnRcIjtcbiAgRzZFdmVudFtcIkNBTlZBU19QQU5NT1ZFXCJdID0gXCJjYW52YXM6cGFubW92ZVwiO1xuICBHNkV2ZW50W1wiQ0FOVkFTX1BBTkVORFwiXSA9IFwiY2FudmFzOnBhbmVuZFwiOyAvLyB0aW1pbmcgZXZlbnRzXG5cbiAgRzZFdmVudFtcIkJFRk9SRVJFTkRFUlwiXSA9IFwiYmVmb3JlcmVuZGVyXCI7XG4gIEc2RXZlbnRbXCJBRlRFUlJFTkRFUlwiXSA9IFwiYWZ0ZXJyZW5kZXJcIjtcbiAgRzZFdmVudFtcIkJFRk9SRUFERElURU1cIl0gPSBcImJlZm9yZWFkZGl0ZW1cIjtcbiAgRzZFdmVudFtcIkFGVEVSQURESVRFTVwiXSA9IFwiYWZ0ZXJhZGRpdGVtXCI7XG4gIEc2RXZlbnRbXCJCRUZPUkVSRU1PVkVJVEVNXCJdID0gXCJiZWZvcmVyZW1vdmVpdGVtXCI7XG4gIEc2RXZlbnRbXCJBRlRFUlJFTU9WRUlURU1cIl0gPSBcImFmdGVycmVtb3ZlaXRlbVwiO1xuICBHNkV2ZW50W1wiQkVGT1JFVVBEQVRFSVRFTVwiXSA9IFwiYmVmb3JldXBkYXRlaXRlbVwiO1xuICBHNkV2ZW50W1wiQUZURVJVUERBVEVJVEVNXCJdID0gXCJhZnRlcnVwZGF0ZWl0ZW1cIjtcbiAgRzZFdmVudFtcIkJFRk9SRUlURU1WSVNJQklMSVRZQ0hBTkdFXCJdID0gXCJiZWZvcmVpdGVtdmlzaWJpbGl0eWNoYW5nZVwiO1xuICBHNkV2ZW50W1wiQUZURVJJVEVNVklTSUJJTElUWUNIQU5HRVwiXSA9IFwiYWZ0ZXJpdGVtdmlzaWJpbGl0eWNoYW5nZVwiO1xuICBHNkV2ZW50W1wiQkVGT1JFSVRFTVNUQVRFQ0hBTkdFXCJdID0gXCJiZWZvcmVpdGVtc3RhdGVjaGFuZ2VcIjtcbiAgRzZFdmVudFtcIkFGVEVSSVRFTVNUQVRFQ0hBTkdFXCJdID0gXCJhZnRlcml0ZW1zdGF0ZWNoYW5nZVwiO1xuICBHNkV2ZW50W1wiQkVGT1JFSVRFTVJFRlJFU0hcIl0gPSBcImJlZm9yZWl0ZW1yZWZyZXNoXCI7XG4gIEc2RXZlbnRbXCJBRlRFUklURU1SRUZSRVNIXCJdID0gXCJhZnRlcml0ZW1yZWZyZXNoXCI7XG4gIEc2RXZlbnRbXCJCRUZPUkVJVEVNU1RBVEVTQ0xFQVJcIl0gPSBcImJlZm9yZWl0ZW1zdGF0ZXNjbGVhclwiO1xuICBHNkV2ZW50W1wiQUZURVJJVEVNU1RBVEVTQ0xFQVJcIl0gPSBcImFmdGVyaXRlbXN0YXRlc2NsZWFyXCI7XG4gIEc2RXZlbnRbXCJCRUZPUkVNT0RFQ0hBTkdFXCJdID0gXCJiZWZvcmVtb2RlY2hhbmdlXCI7XG4gIEc2RXZlbnRbXCJBRlRFUk1PREVDSEFOR0VcIl0gPSBcImFmdGVybW9kZWNoYW5nZVwiO1xuICBHNkV2ZW50W1wiQkVGT1JFTEFZT1VUXCJdID0gXCJiZWZvcmVsYXlvdXRcIjtcbiAgRzZFdmVudFtcIkFGVEVSTEFZT1VUXCJdID0gXCJhZnRlcmxheW91dFwiO1xuICBHNkV2ZW50W1wiQkVGT1JFQ1JFQVRFRURHRVwiXSA9IFwiYmVmb3JlY3JlYXRlZWRnZVwiO1xuICBHNkV2ZW50W1wiQUZURVJDUkVBVEVFREdFXCJdID0gXCJhZnRlcmNyZWF0ZWVkZ2VcIjtcbiAgRzZFdmVudFtcIkJFRk9SRUdSQVBIUkVGUkVTSFBPU0lUSU9OXCJdID0gXCJiZWZvcmVncmFwaHJlZnJlc2hwb3NpdGlvblwiO1xuICBHNkV2ZW50W1wiQUZURVJHUkFQSFJFRlJFU0hQT1NJVElPTlwiXSA9IFwiYWZ0ZXJncmFwaHJlZnJlc2hwb3NpdGlvblwiO1xuICBHNkV2ZW50W1wiQkVGT1JFR1JBUEhSRUZSRVNIXCJdID0gXCJiZWZvcmVncmFwaHJlZnJlc2hcIjtcbiAgRzZFdmVudFtcIkFGVEVSR1JBUEhSRUZSRVNIXCJdID0gXCJhZnRlcmdyYXBocmVmcmVzaFwiO1xuICBHNkV2ZW50W1wiQkVGT1JFQU5JTUFURVwiXSA9IFwiYmVmb3JlYW5pbWF0ZVwiO1xuICBHNkV2ZW50W1wiQUZURVJBTklNQVRFXCJdID0gXCJhZnRlcmFuaW1hdGVcIjtcbiAgRzZFdmVudFtcIkJFRk9SRVBBSU5UXCJdID0gXCJiZWZvcmVwYWludFwiO1xuICBHNkV2ZW50W1wiQUZURVJQQUlOVFwiXSA9IFwiYWZ0ZXJwYWludFwiO1xuICBHNkV2ZW50W1wiQkVGT1JFQ09MTEFQU0VFWFBBTkRDT01CT1wiXSA9IFwiYmVmb3JlY29sbGFwc2VleHBhbmRjb21ib1wiO1xuICBHNkV2ZW50W1wiQUZURVJDT0xMQVBTRUVYUEFORENPTUJPXCJdID0gXCJhZnRlcmNvbGxhcHNlZXhwYW5kY29tYm9cIjtcbiAgRzZFdmVudFtcIkdSQVBIU1RBVEVDSEFOR0VcIl0gPSBcImdyYXBoc3RhdGVjaGFuZ2VcIjtcbiAgRzZFdmVudFtcIkFGVEVSQUNUSVZBVEVSRUxBVElPTlNcIl0gPSBcImFmdGVyYWN0aXZhdGVyZWxhdGlvbnNcIjtcbiAgRzZFdmVudFtcIk5PREVTRUxFQ1RDSEFOR0VcIl0gPSBcIm5vZGVzZWxlY3RjaGFuZ2VcIjtcbiAgRzZFdmVudFtcIlRPT0xUSVBDSEFOR0VcIl0gPSBcInRvb2x0aXBjaGFuZ2VcIjtcbiAgRzZFdmVudFtcIldIRUVMWk9PTVwiXSA9IFwid2hlZWx6b29tXCI7XG4gIEc2RXZlbnRbXCJWSUVXUE9SVENIQU5HRVwiXSA9IFwidmlld3BvcnRjaGFuZ2VcIjtcbiAgRzZFdmVudFtcIkRSQUdOT0RFRU5EXCJdID0gXCJkcmFnbm9kZWVuZFwiO1xuICBHNkV2ZW50W1wiU1RBQ0tDSEFOR0VcIl0gPSBcInN0YWNrY2hhbmdlXCI7IC8vIE1vYmlsZSBldmVudCBzdXBwb3J0XG5cbiAgRzZFdmVudFtcIlRBUFwiXSA9IFwidGFwXCI7XG4gIEc2RXZlbnRbXCJQSU5DSFNUQVJUXCJdID0gXCJwaW5jaHN0YXJ0XCI7XG4gIEc2RXZlbnRbXCJQSU5DSE1PVkVcIl0gPSBcInBpbmNobW92ZVwiO1xuICBHNkV2ZW50W1wiUEFOU1RBUlRcIl0gPSBcInBhbnN0YXJ0XCI7XG4gIEc2RXZlbnRbXCJQQU5NT1ZFXCJdID0gXCJwYW5tb3ZlXCI7XG4gIEc2RXZlbnRbXCJQQU5FTkRcIl0gPSBcInBhbmVuZFwiO1xufSkoRzZFdmVudCB8fCAoRzZFdmVudCA9IHt9KSk7IiwiaW1wb3J0IEJlaGF2aW9yIGZyb20gJy4vYmVoYXZpb3InO1xuaW1wb3J0IEFic3RyYWN0R3JhcGggZnJvbSAnLi9ncmFwaC9ncmFwaCc7XG5pbXBvcnQgU2hhcGUsIHsgQXJyb3csIE1hcmtlciB9IGZyb20gJy4vZWxlbWVudCc7XG5pbXBvcnQgR2xvYmFsIGZyb20gJy4vZ2xvYmFsJztcbmltcG9ydCBVdGlsIGZyb20gJy4vdXRpbCc7IC8vIOeUqOS6jiBQQyDlkowgTW9iaWxlIOerr+WIhuWIq+WunueOsCBsYXlvdXQg5ZKMIHVwZGF0ZUxheW91dENmZyDmlrnms5VcblxuaW1wb3J0IEFic3RyYWN0TGF5b3V0IGZyb20gJy4vZ3JhcGgvY29udHJvbGxlci9sYXlvdXQnO1xuaW1wb3J0IEFic3RyYWN0RXZlbnQgZnJvbSAnLi9ncmFwaC9jb250cm9sbGVyL2V2ZW50JztcbmltcG9ydCBOb2RlIGZyb20gJy4vaXRlbS9ub2RlJztcbmltcG9ydCBFZGdlIGZyb20gJy4vaXRlbS9lZGdlJztcbmltcG9ydCBIdWxsIGZyb20gJy4vaXRlbS9odWxsJztcbmltcG9ydCBDb21ibyBmcm9tICcuL2l0ZW0vY29tYm8nO1xudmFyIHJlZ2lzdGVyTm9kZSA9IFNoYXBlLnJlZ2lzdGVyTm9kZTtcbnZhciByZWdpc3RlckVkZ2UgPSBTaGFwZS5yZWdpc3RlckVkZ2U7XG52YXIgcmVnaXN0ZXJDb21ibyA9IFNoYXBlLnJlZ2lzdGVyQ29tYm87XG52YXIgcmVnaXN0ZXJCZWhhdmlvciA9IEJlaGF2aW9yLnJlZ2lzdGVyQmVoYXZpb3I7XG52YXIgQmFzZUdsb2JhbCA9IEdsb2JhbDtcbmV4cG9ydCAqIGZyb20gJy4vdHlwZXMnO1xuZXhwb3J0IHsgQXJyb3csIFNoYXBlLCBOb2RlLCBFZGdlLCBDb21ibywgSHVsbCwgTWFya2VyLCByZWdpc3Rlck5vZGUsIHJlZ2lzdGVyQ29tYm8sIEFic3RyYWN0R3JhcGgsIFV0aWwsIHJlZ2lzdGVyRWRnZSwgcmVnaXN0ZXJCZWhhdmlvciwgQWJzdHJhY3RMYXlvdXQsIEFic3RyYWN0RXZlbnQsIEJhc2VHbG9iYWwgfTtcbmV4cG9ydCBkZWZhdWx0IHtcbiAgdmVyc2lvbjogR2xvYmFsLnZlcnNpb24sXG4gIEFic3RyYWN0R3JhcGg6IEFic3RyYWN0R3JhcGgsXG4gIEJhc2VHbG9iYWw6IEJhc2VHbG9iYWwsXG4gIFV0aWw6IFV0aWwsXG4gIFNoYXBlOiBTaGFwZSxcbiAgTm9kZTogTm9kZSxcbiAgRWRnZTogRWRnZSxcbiAgQ29tYm86IENvbWJvLFxuICBIdWxsOiBIdWxsLFxuICByZWdpc3Rlck5vZGU6IFNoYXBlLnJlZ2lzdGVyTm9kZSxcbiAgcmVnaXN0ZXJFZGdlOiBTaGFwZS5yZWdpc3RlckVkZ2UsXG4gIHJlZ2lzdGVyQ29tYm86IFNoYXBlLnJlZ2lzdGVyQ29tYm8sXG4gIHJlZ2lzdGVyQmVoYXZpb3I6IEJlaGF2aW9yLnJlZ2lzdGVyQmVoYXZpb3IsXG4gIEFycm93OiBBcnJvdyxcbiAgTWFya2VyOiBNYXJrZXIsXG4gIEFic3RyYWN0TGF5b3V0OiBBYnN0cmFjdExheW91dCxcbiAgQWJzdHJhY3RFdmVudDogQWJzdHJhY3RFdmVudFxufTsiLCJpbXBvcnQgdGlueWNvbG9yIGZyb20gJ3Rpbnljb2xvcjInO1xuXG52YXIgaHVlU3RlcCA9IDI7IC8vIOiJsuebuOmYtuair1xuXG52YXIgc2F0dXJhdGlvblN0ZXAgPSAwLjE2OyAvLyDppbHlkozluqbpmLbmoq/vvIzmtYXoibLpg6jliIZcblxudmFyIHNhdHVyYXRpb25TdGVwMiA9IDAuMDU7IC8vIOmlseWSjOW6pumYtuair++8jOa3seiJsumDqOWIhlxuXG52YXIgYnJpZ2h0bmVzc1N0ZXAxID0gMC4wNTsgLy8g5Lqu5bqm6Zi25qKv77yM5rWF6Imy6YOo5YiGXG5cbnZhciBicmlnaHRuZXNzU3RlcDIgPSAwLjE1OyAvLyDkuq7luqbpmLbmoq/vvIzmt7HoibLpg6jliIZcblxudmFyIGxpZ2h0Q29sb3JDb3VudCA9IDU7IC8vIOa1heiJsuaVsOmHj++8jOS4u+iJsuS4ilxuXG52YXIgZGFya0NvbG9yQ291bnQgPSA0OyAvLyDmt7HoibLmlbDph4/vvIzkuLvoibLkuItcbi8vIOaal+iJsuS4u+mimOminOiJsuaYoOWwhOWFs+ezu+ihqFxuXG52YXIgZGFya0NvbG9yTWFwID0gW3tcbiAgaW5kZXg6IDcsXG4gIG9wYWNpdHk6IDAuMTVcbn0sIHtcbiAgaW5kZXg6IDYsXG4gIG9wYWNpdHk6IDAuMjVcbn0sIHtcbiAgaW5kZXg6IDUsXG4gIG9wYWNpdHk6IDAuM1xufSwge1xuICBpbmRleDogNSxcbiAgb3BhY2l0eTogMC40NVxufSwge1xuICBpbmRleDogNSxcbiAgb3BhY2l0eTogMC42NVxufSwge1xuICBpbmRleDogNSxcbiAgb3BhY2l0eTogMC44NVxufSwge1xuICBpbmRleDogNCxcbiAgb3BhY2l0eTogMC45XG59LCB7XG4gIGluZGV4OiAzLFxuICBvcGFjaXR5OiAwLjk1XG59LCB7XG4gIGluZGV4OiAyLFxuICBvcGFjaXR5OiAwLjk3XG59LCB7XG4gIGluZGV4OiAxLFxuICBvcGFjaXR5OiAwLjk4XG59XTtcblxuZnVuY3Rpb24gZ2V0SHVlKGhzdiwgaSwgbGlnaHQpIHtcbiAgdmFyIGh1ZTsgLy8g5qC55o2u6Imy55u45LiN5ZCM77yM6Imy55u46L2s5ZCR5LiN5ZCMXG5cbiAgaWYgKE1hdGgucm91bmQoaHN2LmgpID49IDYwICYmIE1hdGgucm91bmQoaHN2LmgpIDw9IDI0MCkge1xuICAgIGh1ZSA9IGxpZ2h0ID8gTWF0aC5yb3VuZChoc3YuaCkgLSBodWVTdGVwICogaSA6IE1hdGgucm91bmQoaHN2LmgpICsgaHVlU3RlcCAqIGk7XG4gIH0gZWxzZSB7XG4gICAgaHVlID0gbGlnaHQgPyBNYXRoLnJvdW5kKGhzdi5oKSArIGh1ZVN0ZXAgKiBpIDogTWF0aC5yb3VuZChoc3YuaCkgLSBodWVTdGVwICogaTtcbiAgfVxuXG4gIGlmIChodWUgPCAwKSB7XG4gICAgaHVlICs9IDM2MDtcbiAgfSBlbHNlIGlmIChodWUgPj0gMzYwKSB7XG4gICAgaHVlIC09IDM2MDtcbiAgfVxuXG4gIHJldHVybiBodWU7XG59XG5cbmZ1bmN0aW9uIGdldFNhdHVyYXRpb24oaHN2LCBpLCBsaWdodCkge1xuICAvLyBncmV5IGNvbG9yIGRvbid0IGNoYW5nZSBzYXR1cmF0aW9uXG4gIGlmIChoc3YuaCA9PT0gMCAmJiBoc3YucyA9PT0gMCkge1xuICAgIHJldHVybiBoc3YucztcbiAgfVxuXG4gIHZhciBzYXR1cmF0aW9uO1xuXG4gIGlmIChsaWdodCkge1xuICAgIHNhdHVyYXRpb24gPSBoc3YucyAtIHNhdHVyYXRpb25TdGVwICogaTtcbiAgfSBlbHNlIGlmIChpID09PSBkYXJrQ29sb3JDb3VudCkge1xuICAgIHNhdHVyYXRpb24gPSBoc3YucyArIHNhdHVyYXRpb25TdGVwO1xuICB9IGVsc2Uge1xuICAgIHNhdHVyYXRpb24gPSBoc3YucyArIHNhdHVyYXRpb25TdGVwMiAqIGk7XG4gIH0gLy8g6L6555WM5YC85L+u5q2jXG5cblxuICBpZiAoc2F0dXJhdGlvbiA+IDEpIHtcbiAgICBzYXR1cmF0aW9uID0gMTtcbiAgfSAvLyDnrKzkuIDmoLznmoQgcyDpmZDliLblnKggMC4wNi0wLjEg5LmL6Ze0XG5cblxuICBpZiAobGlnaHQgJiYgaSA9PT0gbGlnaHRDb2xvckNvdW50ICYmIHNhdHVyYXRpb24gPiAwLjEpIHtcbiAgICBzYXR1cmF0aW9uID0gMC4xO1xuICB9XG5cbiAgaWYgKHNhdHVyYXRpb24gPCAwLjA2KSB7XG4gICAgc2F0dXJhdGlvbiA9IDAuMDY7XG4gIH1cblxuICByZXR1cm4gTnVtYmVyKHNhdHVyYXRpb24udG9GaXhlZCgyKSk7XG59XG5cbmZ1bmN0aW9uIGdldFZhbHVlKGhzdiwgaSwgbGlnaHQpIHtcbiAgdmFyIHZhbHVlO1xuXG4gIGlmIChsaWdodCkge1xuICAgIHZhbHVlID0gaHN2LnYgKyBicmlnaHRuZXNzU3RlcDEgKiBpO1xuICB9IGVsc2Uge1xuICAgIHZhbHVlID0gaHN2LnYgLSBicmlnaHRuZXNzU3RlcDIgKiBpO1xuICB9XG5cbiAgaWYgKHZhbHVlID4gMSkge1xuICAgIHZhbHVlID0gMTtcbiAgfVxuXG4gIHJldHVybiBOdW1iZXIodmFsdWUudG9GaXhlZCgyKSk7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlKGNvbG9yKSB7XG4gIHZhciBvcHRzID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgdmFyIHBhdHRlcm5zID0gW107XG4gIHZhciBwQ29sb3IgPSB0aW55Y29sb3IoY29sb3IpO1xuXG4gIGZvciAodmFyIGkgPSBsaWdodENvbG9yQ291bnQ7IGkgPiAwOyBpIC09IDEpIHtcbiAgICB2YXIgaHN2ID0gcENvbG9yLnRvSHN2KCk7XG4gICAgdmFyIGNvbG9yU3RyaW5nID0gdGlueWNvbG9yKHtcbiAgICAgIGg6IGdldEh1ZShoc3YsIGksIHRydWUpLFxuICAgICAgczogZ2V0U2F0dXJhdGlvbihoc3YsIGksIHRydWUpLFxuICAgICAgdjogZ2V0VmFsdWUoaHN2LCBpLCB0cnVlKVxuICAgIH0pLnRvSGV4U3RyaW5nKCk7XG4gICAgcGF0dGVybnMucHVzaChjb2xvclN0cmluZyk7XG4gIH1cblxuICBwYXR0ZXJucy5wdXNoKHBDb2xvci50b0hleFN0cmluZygpKTtcblxuICBmb3IgKHZhciBfaSA9IDE7IF9pIDw9IGRhcmtDb2xvckNvdW50OyBfaSArPSAxKSB7XG4gICAgdmFyIF9oc3YgPSBwQ29sb3IudG9Ic3YoKTtcblxuICAgIHZhciBfY29sb3JTdHJpbmcgPSB0aW55Y29sb3Ioe1xuICAgICAgaDogZ2V0SHVlKF9oc3YsIF9pKSxcbiAgICAgIHM6IGdldFNhdHVyYXRpb24oX2hzdiwgX2kpLFxuICAgICAgdjogZ2V0VmFsdWUoX2hzdiwgX2kpXG4gICAgfSkudG9IZXhTdHJpbmcoKTtcblxuICAgIHBhdHRlcm5zLnB1c2goX2NvbG9yU3RyaW5nKTtcbiAgfSAvLyBkYXJrIHRoZW1lIHBhdHRlcm5zXG5cblxuICBpZiAob3B0cy50aGVtZSA9PT0gJ2RhcmsnKSB7XG4gICAgcmV0dXJuIGRhcmtDb2xvck1hcC5tYXAoZnVuY3Rpb24gKF9yZWYpIHtcbiAgICAgIHZhciBpbmRleCA9IF9yZWYuaW5kZXgsXG4gICAgICAgICAgb3BhY2l0eSA9IF9yZWYub3BhY2l0eTtcbiAgICAgIHZhciBkYXJrQ29sb3JTdHJpbmcgPSB0aW55Y29sb3IubWl4KG9wdHMuYmFja2dyb3VuZENvbG9yIHx8ICcjMTQxNDE0JywgcGF0dGVybnNbaW5kZXhdLCBvcGFjaXR5ICogMTAwKS50b0hleFN0cmluZygpO1xuICAgICAgcmV0dXJuIGRhcmtDb2xvclN0cmluZztcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBwYXR0ZXJucztcbn1cblxudmFyIHByZXNldFByaW1hcnlDb2xvcnMgPSB7XG4gIHJlZDogJyNGNTIyMkQnLFxuICB2b2xjYW5vOiAnI0ZBNTQxQycsXG4gIG9yYW5nZTogJyNGQThDMTYnLFxuICBnb2xkOiAnI0ZBQUQxNCcsXG4gIHllbGxvdzogJyNGQURCMTQnLFxuICBsaW1lOiAnI0EwRDkxMScsXG4gIGdyZWVuOiAnIzUyQzQxQScsXG4gIGN5YW46ICcjMTNDMkMyJyxcbiAgYmx1ZTogJyMxODkwRkYnLFxuICBnZWVrYmx1ZTogJyMyRjU0RUInLFxuICBwdXJwbGU6ICcjNzIyRUQxJyxcbiAgbWFnZW50YTogJyNFQjJGOTYnLFxuICBncmV5OiAnIzY2NjY2Nidcbn07XG52YXIgcHJlc2V0UGFsZXR0ZXMgPSB7fTtcbnZhciBwcmVzZXREYXJrUGFsZXR0ZXMgPSB7fTtcbk9iamVjdC5rZXlzKHByZXNldFByaW1hcnlDb2xvcnMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICBwcmVzZXRQYWxldHRlc1trZXldID0gZ2VuZXJhdGUocHJlc2V0UHJpbWFyeUNvbG9yc1trZXldKTtcbiAgcHJlc2V0UGFsZXR0ZXNba2V5XS5wcmltYXJ5ID0gcHJlc2V0UGFsZXR0ZXNba2V5XVs1XTsgLy8gZGFyayBwcmVzZXRQYWxldHRlc1xuXG4gIHByZXNldERhcmtQYWxldHRlc1trZXldID0gZ2VuZXJhdGUocHJlc2V0UHJpbWFyeUNvbG9yc1trZXldLCB7XG4gICAgdGhlbWU6ICdkYXJrJyxcbiAgICBiYWNrZ3JvdW5kQ29sb3I6ICcjMTQxNDE0J1xuICB9KTtcbiAgcHJlc2V0RGFya1BhbGV0dGVzW2tleV0ucHJpbWFyeSA9IHByZXNldERhcmtQYWxldHRlc1trZXldWzVdO1xufSk7XG52YXIgcmVkID0gcHJlc2V0UGFsZXR0ZXMucmVkO1xudmFyIHZvbGNhbm8gPSBwcmVzZXRQYWxldHRlcy52b2xjYW5vO1xudmFyIGdvbGQgPSBwcmVzZXRQYWxldHRlcy5nb2xkO1xudmFyIG9yYW5nZSA9IHByZXNldFBhbGV0dGVzLm9yYW5nZTtcbnZhciB5ZWxsb3cgPSBwcmVzZXRQYWxldHRlcy55ZWxsb3c7XG52YXIgbGltZSA9IHByZXNldFBhbGV0dGVzLmxpbWU7XG52YXIgZ3JlZW4gPSBwcmVzZXRQYWxldHRlcy5ncmVlbjtcbnZhciBjeWFuID0gcHJlc2V0UGFsZXR0ZXMuY3lhbjtcbnZhciBibHVlID0gcHJlc2V0UGFsZXR0ZXMuYmx1ZTtcbnZhciBnZWVrYmx1ZSA9IHByZXNldFBhbGV0dGVzLmdlZWtibHVlO1xudmFyIHB1cnBsZSA9IHByZXNldFBhbGV0dGVzLnB1cnBsZTtcbnZhciBtYWdlbnRhID0gcHJlc2V0UGFsZXR0ZXMubWFnZW50YTtcbnZhciBncmV5ID0gcHJlc2V0UGFsZXR0ZXMuZ3JleTtcblxuZXhwb3J0IHsgYmx1ZSwgY3lhbiwgZ2Vla2JsdWUsIGdlbmVyYXRlLCBnb2xkLCBncmVlbiwgZ3JleSwgbGltZSwgbWFnZW50YSwgb3JhbmdlLCBwcmVzZXREYXJrUGFsZXR0ZXMsIHByZXNldFBhbGV0dGVzLCBwcmVzZXRQcmltYXJ5Q29sb3JzLCBwdXJwbGUsIHJlZCwgdm9sY2FubywgeWVsbG93IH07XG4iLCJpbXBvcnQgY29sb3IgZnJvbSAnY29sb3InO1xuaW1wb3J0IHsgZ2VuZXJhdGUgfSBmcm9tICdAYW50LWRlc2lnbi9jb2xvcnMnO1xuLyoqXG4gKiBnZXQgdGhlIG1peCBjb2xvciBvZiBiYWNrQ29sb3IgYW5kIGZyb250Q29sb3Igd2l0aCBhbHBhaFxuICogQHBhcmFtIGJhY2tDb2xvciBiYWNrZ3JvdW5kIGNvbG9yXG4gKiBAcGFyYW0gZnJvbnRDb2xvciBmb3JlZ3JvdW5kIGNvbG9yXG4gKiBAcGFyYW0gZnJvbnRBbHBoYSB0aGUgb3BhY2l0eSBvZiBmb3JlZ3JvdW5kIGNvbG9yXG4gKi9cblxuZXhwb3J0IHZhciBtaXhDb2xvciA9IGZ1bmN0aW9uIG1peENvbG9yKGJhY2tDb2xvciwgZnJvbnRDb2xvciwgZnJvbnRBbHBoYSkge1xuICB2YXIgYmMgPSBjb2xvcihiYWNrQ29sb3IpO1xuICB2YXIgZmMgPSBjb2xvcihmcm9udENvbG9yKTtcbiAgcmV0dXJuIGNvbG9yKFsoMSAtIGZyb250QWxwaGEpICogYmMucmVkKCkgKyBmcm9udEFscGhhICogZmMucmVkKCksICgxIC0gZnJvbnRBbHBoYSkgKiBiYy5ncmVlbigpICsgZnJvbnRBbHBoYSAqIGZjLmdyZWVuKCksICgxIC0gZnJvbnRBbHBoYSkgKiBiYy5ibHVlKCkgKyBmcm9udEFscGhhICogZmMuYmx1ZSgpXSkucmdiKCk7XG59O1xuXG52YXIgZ2V0Q29sb3JzV2l0aERlZmF1bHRUaGVtZSA9IGZ1bmN0aW9uIGdldENvbG9yc1dpdGhEZWZhdWx0VGhlbWUoc3ViamVjdENvbG9yLCBiYWNrQ29sb3IsIGRpc2FibGVDb2xvcikge1xuICBpZiAoYmFja0NvbG9yID09PSB2b2lkIDApIHtcbiAgICBiYWNrQ29sb3IgPSAnI2ZmZic7XG4gIH1cblxuICBpZiAoZGlzYWJsZUNvbG9yID09PSB2b2lkIDApIHtcbiAgICBkaXNhYmxlQ29sb3IgPSAncmdiKDE1MCwgMTUwLCAxNTApJztcbiAgfVxuXG4gIHZhciBzdWJqZWN0Q29sb3IwMDUgPSBtaXhDb2xvcihiYWNrQ29sb3IsIHN1YmplY3RDb2xvciwgMC4wNSkucmdiKCkudG9TdHJpbmcoKTtcbiAgdmFyIHN1YmplY3RDb2xvcjAxID0gbWl4Q29sb3IoYmFja0NvbG9yLCBzdWJqZWN0Q29sb3IsIDAuMSkucmdiKCkudG9TdHJpbmcoKTtcbiAgdmFyIHN1YmplY3RDb2xvcjAyID0gbWl4Q29sb3IoYmFja0NvbG9yLCBzdWJqZWN0Q29sb3IsIDAuMikucmdiKCkudG9TdHJpbmcoKTtcbiAgdmFyIHN1YmplY3RDb2xvcjA0ID0gbWl4Q29sb3IoYmFja0NvbG9yLCBzdWJqZWN0Q29sb3IsIDAuNCkucmdiKCkudG9TdHJpbmcoKTtcbiAgdmFyIGRpc2FibGVDb2xvcjAwMiA9IG1peENvbG9yKGJhY2tDb2xvciwgZGlzYWJsZUNvbG9yLCAwLjAyKS5yZ2IoKS50b1N0cmluZygpO1xuICB2YXIgZGlzYWJsZUNvbG9yMDA1ID0gbWl4Q29sb3IoYmFja0NvbG9yLCBkaXNhYmxlQ29sb3IsIDAuMDUpLnJnYigpLnRvU3RyaW5nKCk7XG4gIHZhciBkaXNhYmxlQ29sb3IwMSA9IG1peENvbG9yKGJhY2tDb2xvciwgZGlzYWJsZUNvbG9yLCAwLjEpLnJnYigpLnRvU3RyaW5nKCk7XG4gIHZhciBkaXNhYmxlQ29sb3IwMiA9IG1peENvbG9yKGJhY2tDb2xvciwgZGlzYWJsZUNvbG9yLCAwLjIpLnJnYigpLnRvU3RyaW5nKCk7XG4gIHZhciBkaXNhYmxlQ29sb3IwMyA9IG1peENvbG9yKGJhY2tDb2xvciwgZGlzYWJsZUNvbG9yLCAwLjMpLnJnYigpLnRvU3RyaW5nKCk7XG4gIHZhciBwYWxldHRlRnJvbVN1YmplY3QgPSBnZW5lcmF0ZShzdWJqZWN0Q29sb3IsIHtcbiAgICB0aGVtZTogJ2RlZmF1bHQnLFxuICAgIGJhY2tncm91bmRDb2xvcjogYmFja0NvbG9yXG4gIH0pO1xuICB2YXIgc3ViamVjdEhleCA9IGNvbG9yKHN1YmplY3RDb2xvcikuaGV4KCkudG9Mb3dlckNhc2UoKTtcbiAgdmFyIHN1YmplY3RJZHggPSBwYWxldHRlRnJvbVN1YmplY3QuaW5kZXhPZihzdWJqZWN0SGV4KTtcbiAgdmFyIGRlZXBlclN1YmplY3QgPSBzdWJqZWN0Q29sb3I7XG5cbiAgaWYgKHN1YmplY3RJZHggIT09IC0xKSB7XG4gICAgZGVlcGVyU3ViamVjdCA9IHBhbGV0dGVGcm9tU3ViamVjdFtzdWJqZWN0SWR4ICsgMV07XG4gIH1cblxuICByZXR1cm4ge1xuICAgIC8vIGZvciBub2Rlc1xuICAgIG1haW5TdHJva2U6IHN1YmplY3RDb2xvcixcbiAgICBtYWluRmlsbDogc3ViamVjdENvbG9yMDEsXG4gICAgYWN0aXZlU3Ryb2tlOiBzdWJqZWN0Q29sb3IsXG4gICAgYWN0aXZlRmlsbDogc3ViamVjdENvbG9yMDA1LFxuICAgIGluYWN0aXZlU3Ryb2tlOiBzdWJqZWN0Q29sb3IwNCxcbiAgICBpbmFjdGl2ZUZpbGw6IHN1YmplY3RDb2xvcjAwNSxcbiAgICBzZWxlY3RlZFN0cm9rZTogc3ViamVjdENvbG9yLFxuICAgIHNlbGVjdGVkRmlsbDogYmFja0NvbG9yLFxuICAgIGhpZ2hsaWdodFN0cm9rZTogZGVlcGVyU3ViamVjdCxcbiAgICBoaWdobGlnaHRGaWxsOiBzdWJqZWN0Q29sb3IwMixcbiAgICBkaXNhYmxlU3Ryb2tlOiBkaXNhYmxlQ29sb3IwMyxcbiAgICBkaXNhYmxlRmlsbDogZGlzYWJsZUNvbG9yMDA1LFxuICAgIC8vIGZvciBlZGdlc1xuICAgIGVkZ2VNYWluU3Ryb2tlOiBkaXNhYmxlQ29sb3IwMyxcbiAgICBlZGdlQWN0aXZlU3Ryb2tlOiBzdWJqZWN0Q29sb3IsXG4gICAgZWRnZUluYWN0aXZlU3Ryb2tlOiBkaXNhYmxlQ29sb3IwMixcbiAgICBlZGdlU2VsZWN0ZWRTdHJva2U6IHN1YmplY3RDb2xvcixcbiAgICBlZGdlSGlnaGxpZ2h0U3Ryb2tlOiBzdWJqZWN0Q29sb3IsXG4gICAgZWRnZURpc2FibGVTdHJva2U6IGRpc2FibGVDb2xvcjAxLFxuICAgIC8vIGZvciBjb21ib3NcbiAgICBjb21ib01haW5TdHJva2U6IGRpc2FibGVDb2xvcjAzLFxuICAgIGNvbWJvTWFpbkZpbGw6IGRpc2FibGVDb2xvcjAwMixcbiAgICBjb21ib0FjdGl2ZVN0cm9rZTogc3ViamVjdENvbG9yLFxuICAgIGNvbWJvQWN0aXZlRmlsbDogc3ViamVjdENvbG9yMDA1LFxuICAgIGNvbWJvSW5hY3RpdmVTdHJva2U6IGRpc2FibGVDb2xvcjAzLFxuICAgIGNvbWJvSW5hY3RpdmVGaWxsOiBkaXNhYmxlQ29sb3IwMDIsXG4gICAgY29tYm9TZWxlY3RlZFN0cm9rZTogc3ViamVjdENvbG9yLFxuICAgIGNvbWJvU2VsZWN0ZWRGaWxsOiBkaXNhYmxlQ29sb3IwMDIsXG4gICAgY29tYm9IaWdobGlnaHRTdHJva2U6IGRlZXBlclN1YmplY3QsXG4gICAgY29tYm9IaWdobGlnaHRGaWxsOiBkaXNhYmxlQ29sb3IwMDIsXG4gICAgY29tYm9EaXNhYmxlU3Ryb2tlOiBkaXNhYmxlQ29sb3IwMixcbiAgICBjb21ib0Rpc2FibGVGaWxsOiBkaXNhYmxlQ29sb3IwMDVcbiAgfTtcbn07XG5cbnZhciBnZXRDb2xvcnNXaXRoRGFya1RoZW1lID0gZnVuY3Rpb24gZ2V0Q29sb3JzV2l0aERhcmtUaGVtZShzdWJqZWN0Q29sb3IsIGJhY2tDb2xvciwgZGlzYWJsZUNvbG9yKSB7XG4gIGlmIChiYWNrQ29sb3IgPT09IHZvaWQgMCkge1xuICAgIGJhY2tDb2xvciA9ICcjZmZmJztcbiAgfVxuXG4gIGlmIChkaXNhYmxlQ29sb3IgPT09IHZvaWQgMCkge1xuICAgIGRpc2FibGVDb2xvciA9ICcjNzc3JztcbiAgfVxuXG4gIHZhciBzdWJqZWN0Q29sb3IwMiA9IG1peENvbG9yKGJhY2tDb2xvciwgc3ViamVjdENvbG9yLCAwLjIpLnJnYigpLnRvU3RyaW5nKCk7XG4gIHZhciBzdWJqZWN0Q29sb3IwMyA9IG1peENvbG9yKGJhY2tDb2xvciwgc3ViamVjdENvbG9yLCAwLjMpLnJnYigpLnRvU3RyaW5nKCk7XG4gIHZhciBzdWJqZWN0Q29sb3IwNiA9IG1peENvbG9yKGJhY2tDb2xvciwgc3ViamVjdENvbG9yLCAwLjYpLnJnYigpLnRvU3RyaW5nKCk7XG4gIHZhciBzdWJqZWN0Q29sb3IwOCA9IG1peENvbG9yKGJhY2tDb2xvciwgc3ViamVjdENvbG9yLCAwLjgpLnJnYigpLnRvU3RyaW5nKCk7XG4gIHZhciBkaXNhYmxlQ29sb3IwMiA9IG1peENvbG9yKGJhY2tDb2xvciwgZGlzYWJsZUNvbG9yLCAwLjIpLnJnYigpLnRvU3RyaW5nKCk7XG4gIHZhciBkaXNhYmxlQ29sb3IwMjUgPSBtaXhDb2xvcihiYWNrQ29sb3IsIGRpc2FibGVDb2xvciwgMC4yNSkucmdiKCkudG9TdHJpbmcoKTtcbiAgdmFyIGRpc2FibGVDb2xvcjAzID0gbWl4Q29sb3IoYmFja0NvbG9yLCBkaXNhYmxlQ29sb3IsIDAuMykucmdiKCkudG9TdHJpbmcoKTtcbiAgdmFyIGRpc2FibGVDb2xvcjA0ID0gbWl4Q29sb3IoYmFja0NvbG9yLCBkaXNhYmxlQ29sb3IsIDAuNCkucmdiKCkudG9TdHJpbmcoKTtcbiAgdmFyIGRpc2FibGVDb2xvcjA1ID0gbWl4Q29sb3IoYmFja0NvbG9yLCBkaXNhYmxlQ29sb3IsIDAuNSkucmdiKCkudG9TdHJpbmcoKTtcbiAgdmFyIHBhbGV0dGVGcm9tU3ViamVjdCA9IGdlbmVyYXRlKHN1YmplY3RDb2xvciwge1xuICAgIHRoZW1lOiAnZGFyaycsXG4gICAgYmFja2dyb3VuZENvbG9yOiBiYWNrQ29sb3JcbiAgfSk7XG4gIHZhciBzdWJqZWN0SGV4ID0gY29sb3Ioc3ViamVjdENvbG9yKS5oZXgoKS50b0xvd2VyQ2FzZSgpO1xuICB2YXIgc3ViamVjdElkeCA9IHBhbGV0dGVGcm9tU3ViamVjdC5pbmRleE9mKHN1YmplY3RIZXgpO1xuICB2YXIgZGVlcGVyU3ViamVjdCA9IHN1YmplY3RDb2xvcjtcblxuICBpZiAoc3ViamVjdElkeCAhPT0gLTEpIHtcbiAgICBkZWVwZXJTdWJqZWN0ID0gcGFsZXR0ZUZyb21TdWJqZWN0W3N1YmplY3RJZHggKyAxXTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLy8gZm9yIG5vZGVzXG4gICAgbWFpblN0cm9rZTogc3ViamVjdENvbG9yMDgsXG4gICAgbWFpbkZpbGw6IHN1YmplY3RDb2xvcjAyLFxuICAgIGFjdGl2ZVN0cm9rZTogc3ViamVjdENvbG9yLFxuICAgIGFjdGl2ZUZpbGw6IHN1YmplY3RDb2xvcjAzLFxuICAgIGluYWN0aXZlU3Ryb2tlOiBzdWJqZWN0Q29sb3IwOCxcbiAgICBpbmFjdGl2ZUZpbGw6IHN1YmplY3RDb2xvcjAyLFxuICAgIHNlbGVjdGVkU3Ryb2tlOiBzdWJqZWN0Q29sb3IsXG4gICAgc2VsZWN0ZWRGaWxsOiBzdWJqZWN0Q29sb3IwMixcbiAgICBoaWdobGlnaHRTdHJva2U6IHN1YmplY3RDb2xvcixcbiAgICBoaWdobGlnaHRGaWxsOiBzdWJqZWN0Q29sb3IwNixcbiAgICBkaXNhYmxlU3Ryb2tlOiBkaXNhYmxlQ29sb3IwNSxcbiAgICBkaXNhYmxlRmlsbDogZGlzYWJsZUNvbG9yMDI1LFxuICAgIC8vIGZvciBlZGdlc1xuICAgIGVkZ2VNYWluU3Ryb2tlOiBkaXNhYmxlQ29sb3IsXG4gICAgZWRnZUFjdGl2ZVN0cm9rZTogc3ViamVjdENvbG9yLFxuICAgIGVkZ2VJbmFjdGl2ZVN0cm9rZTogZGlzYWJsZUNvbG9yLFxuICAgIGVkZ2VTZWxlY3RlZFN0cm9rZTogc3ViamVjdENvbG9yLFxuICAgIGVkZ2VIaWdobGlnaHRTdHJva2U6IHN1YmplY3RDb2xvcixcbiAgICBlZGdlRGlzYWJsZVN0cm9rZTogZGlzYWJsZUNvbG9yMDMsXG4gICAgLy8gZm9yIGNvbWJvc1xuICAgIGNvbWJvTWFpblN0cm9rZTogZGlzYWJsZUNvbG9yMDQsXG4gICAgY29tYm9NYWluRmlsbDogZGlzYWJsZUNvbG9yMDI1LFxuICAgIGNvbWJvQWN0aXZlU3Ryb2tlOiBzdWJqZWN0Q29sb3IsXG4gICAgY29tYm9BY3RpdmVGaWxsOiBkaXNhYmxlQ29sb3IwMixcbiAgICBjb21ib0luYWN0aXZlU3Ryb2tlOiBkaXNhYmxlQ29sb3IwNCxcbiAgICBjb21ib0luYWN0aXZlRmlsbDogZGlzYWJsZUNvbG9yMDI1LFxuICAgIGNvbWJvU2VsZWN0ZWRTdHJva2U6IHN1YmplY3RDb2xvcixcbiAgICBjb21ib1NlbGVjdGVkRmlsbDogZGlzYWJsZUNvbG9yMDIsXG4gICAgY29tYm9IaWdobGlnaHRTdHJva2U6IGRlZXBlclN1YmplY3QsXG4gICAgY29tYm9IaWdobGlnaHRGaWxsOiBkaXNhYmxlQ29sb3IwMjUsXG4gICAgY29tYm9EaXNhYmxlU3Ryb2tlOiBkaXNhYmxlQ29sb3IwNCxcbiAgICBjb21ib0Rpc2FibGVGaWxsOiBkaXNhYmxlQ29sb3IwMlxuICB9O1xufTtcbi8qKlxuICogZ2V0IHRoZSBzZXQgb2YgY29sb3JzIGFjY29yZGluZyB0byB0aGUgc3ViamVjdCBjb2xvciBhbmQgYmFja2dyb3VuZCBjb2xvclxuICogQHBhcmFtIHN1YmplY3RDb2xvciB0aGUgc3ViamVjdCBjb2xvclxuICogQHBhcmFtIGJhY2tDb2xvciBiYWNrZ3JvdW5kIGNvbG9yXG4gKiBAcGFyYW0gZGlzYWJsZUNvbG9yIHRoZSBjb2xvciBmb3IgZGlzYWJsZSBzdGF0ZVxuICovXG5cblxuZXhwb3J0IHZhciBnZXRDb2xvcnNXaXRoU3ViamVjdENvbG9yID0gZnVuY3Rpb24gZ2V0Q29sb3JzV2l0aFN1YmplY3RDb2xvcihzdWJqZWN0Q29sb3IsIGJhY2tDb2xvciwgdGhlbWUsIGRpc2FibGVDb2xvcikge1xuICBpZiAoYmFja0NvbG9yID09PSB2b2lkIDApIHtcbiAgICBiYWNrQ29sb3IgPSAnI2ZmZic7XG4gIH1cblxuICBpZiAodGhlbWUgPT09IHZvaWQgMCkge1xuICAgIHRoZW1lID0gJ2RlZmF1bHQnO1xuICB9XG5cbiAgaWYgKGRpc2FibGVDb2xvciA9PT0gdm9pZCAwKSB7XG4gICAgZGlzYWJsZUNvbG9yID0gJ3JnYigxNTAsIDE1MCwgMTUwKSc7XG4gIH1cblxuICBpZiAodGhlbWUgPT09ICdkZWZhdWx0JykgcmV0dXJuIGdldENvbG9yc1dpdGhEZWZhdWx0VGhlbWUoc3ViamVjdENvbG9yLCBiYWNrQ29sb3IsICdyZ2IoMTUwLCAxNTAsIDE1MCknKTtcbiAgcmV0dXJuIGdldENvbG9yc1dpdGhEYXJrVGhlbWUoc3ViamVjdENvbG9yLCBiYWNrQ29sb3IsICcjNzc3Jyk7XG59O1xuZXhwb3J0IHZhciBnZXRDb2xvclNldHNCeVN1YmplY3RDb2xvcnMgPSBmdW5jdGlvbiBnZXRDb2xvclNldHNCeVN1YmplY3RDb2xvcnMoc3ViamVjdENvbG9ycywgYmFja0NvbG9yLCB0aGVtZSwgZGlzYWJsZUNvbG9yKSB7XG4gIGlmIChiYWNrQ29sb3IgPT09IHZvaWQgMCkge1xuICAgIGJhY2tDb2xvciA9ICcjZmZmJztcbiAgfVxuXG4gIGlmICh0aGVtZSA9PT0gdm9pZCAwKSB7XG4gICAgdGhlbWUgPSAnZGVmYXVsdCc7XG4gIH1cblxuICBpZiAoZGlzYWJsZUNvbG9yID09PSB2b2lkIDApIHtcbiAgICBkaXNhYmxlQ29sb3IgPSAncmdiKDE1MCwgMTUwLCAxNTApJztcbiAgfVxuXG4gIHZhciBzZXRzID0gW107XG4gIHN1YmplY3RDb2xvcnMuZm9yRWFjaChmdW5jdGlvbiAoc0NvbG9yKSB7XG4gICAgc2V0cy5wdXNoKGdldENvbG9yc1dpdGhTdWJqZWN0Q29sb3Ioc0NvbG9yLCBiYWNrQ29sb3IsIHRoZW1lLCBkaXNhYmxlQ29sb3IpKTtcbiAgfSk7XG4gIHJldHVybiBzZXRzO1xufTsiLCJpbXBvcnQgeyBnZXRDb2xvcnNXaXRoU3ViamVjdENvbG9yIH0gZnJvbSAnLi91dGlsL2NvbG9yJztcbnZhciBzdWJqZWN0Q29sb3IgPSAncmdiKDk1LCAxNDksIDI1NSknO1xudmFyIGJhY2tDb2xvciA9ICdyZ2IoMjU1LCAyNTUsIDI1NSknO1xudmFyIHRleHRDb2xvciA9ICdyZ2IoMCwgMCwgMCknO1xudmFyIGNvbG9yU2V0ID0gZ2V0Q29sb3JzV2l0aFN1YmplY3RDb2xvcihzdWJqZWN0Q29sb3IsIGJhY2tDb2xvcik7XG5leHBvcnQgZGVmYXVsdCB7XG4gIHZlcnNpb246ICcwLjQuMScsXG4gIHJvb3RDb250YWluZXJDbGFzc05hbWU6ICdyb290LWNvbnRhaW5lcicsXG4gIG5vZGVDb250YWluZXJDbGFzc05hbWU6ICdub2RlLWNvbnRhaW5lcicsXG4gIGVkZ2VDb250YWluZXJDbGFzc05hbWU6ICdlZGdlLWNvbnRhaW5lcicsXG4gIGNvbWJvQ29udGFpbmVyQ2xhc3NOYW1lOiAnY29tYm8tY29udGFpbmVyJyxcbiAgZGVsZWdhdGVDb250YWluZXJDbGFzc05hbWU6ICdkZWxlZ2F0ZS1jb250YWluZXInLFxuICBkZWZhdWx0TG9vcFBvc2l0aW9uOiAndG9wJyxcbiAgbm9kZUxhYmVsOiB7XG4gICAgc3R5bGU6IHtcbiAgICAgIGZpbGw6ICcjMDAwJyxcbiAgICAgIGZvbnRTaXplOiAxMixcbiAgICAgIHRleHRBbGlnbjogJ2NlbnRlcicsXG4gICAgICB0ZXh0QmFzZWxpbmU6ICdtaWRkbGUnXG4gICAgfSxcbiAgICBvZmZzZXQ6IDQgLy8g6IqC54K555qE6buY6K6k5paH5pys5LiN5bGF5Lit5pe255qE5YGP56e76YePXG5cbiAgfSxcbiAgZGVmYXVsdE5vZGU6IHtcbiAgICB0eXBlOiAnY2lyY2xlJyxcbiAgICBzdHlsZToge1xuICAgICAgbGluZVdpZHRoOiAxLFxuICAgICAgc3Ryb2tlOiBjb2xvclNldC5tYWluU3Ryb2tlLFxuICAgICAgZmlsbDogY29sb3JTZXQubWFpbkZpbGxcbiAgICB9LFxuICAgIHNpemU6IDIwLFxuICAgIGNvbG9yOiBjb2xvclNldC5tYWluU3Ryb2tlLFxuICAgIGxpbmtQb2ludHM6IHtcbiAgICAgIHNpemU6IDgsXG4gICAgICBsaW5lV2lkdGg6IDEsXG4gICAgICBmaWxsOiBjb2xvclNldC5hY3RpdmVGaWxsLFxuICAgICAgc3Ryb2tlOiBjb2xvclNldC5hY3RpdmVTdHJva2VcbiAgICB9XG4gIH0sXG4gIC8vIOiKgueCueW6lOeUqOeKtuaAgeWQjueahOagt+W8j++8jOm7mOiupOS7heaPkOS+myBhY3RpdmXjgIFzZWxlY3RlZOOAgWhpZ2hsaWdodOOAgWluYWN0aXZl44CBZGlzYWJsZe+8jOeUqOaIt+WPr+S7peiHquW3seaJqeWxlVxuICBub2RlU3RhdGVTdHlsZXM6IHtcbiAgICBhY3RpdmU6IHtcbiAgICAgIGZpbGw6IGNvbG9yU2V0LmFjdGl2ZUZpbGwsXG4gICAgICBzdHJva2U6IGNvbG9yU2V0LmFjdGl2ZVN0cm9rZSxcbiAgICAgIGxpbmVXaWR0aDogMixcbiAgICAgIHNoYWRvd0NvbG9yOiBjb2xvclNldC5tYWluU3Ryb2tlLFxuICAgICAgc2hhZG93Qmx1cjogMTBcbiAgICB9LFxuICAgIHNlbGVjdGVkOiB7XG4gICAgICBmaWxsOiBjb2xvclNldC5zZWxlY3RlZEZpbGwsXG4gICAgICBzdHJva2U6IGNvbG9yU2V0LnNlbGVjdGVkU3Ryb2tlLFxuICAgICAgbGluZVdpZHRoOiA0LFxuICAgICAgc2hhZG93Q29sb3I6IGNvbG9yU2V0LnNlbGVjdGVkU3Ryb2tlLFxuICAgICAgc2hhZG93Qmx1cjogMTAsXG4gICAgICAndGV4dC1zaGFwZSc6IHtcbiAgICAgICAgZm9udFdlaWdodDogNTAwXG4gICAgICB9XG4gICAgfSxcbiAgICBoaWdobGlnaHQ6IHtcbiAgICAgIGZpbGw6IGNvbG9yU2V0LmhpZ2hsaWdodEZpbGwsXG4gICAgICBzdHJva2U6IGNvbG9yU2V0LmhpZ2hsaWdodFN0cm9rZSxcbiAgICAgIGxpbmVXaWR0aDogMixcbiAgICAgICd0ZXh0LXNoYXBlJzoge1xuICAgICAgICBmb250V2VpZ2h0OiA1MDBcbiAgICAgIH1cbiAgICB9LFxuICAgIGluYWN0aXZlOiB7XG4gICAgICBmaWxsOiBjb2xvclNldC5pbmFjdGl2ZUZpbGwsXG4gICAgICBzdHJva2U6IGNvbG9yU2V0LmluYWN0aXZlU3Ryb2tlLFxuICAgICAgbGluZVdpZHRoOiAxXG4gICAgfSxcbiAgICBkaXNhYmxlOiB7XG4gICAgICBmaWxsOiBjb2xvclNldC5kaXNhYmxlRmlsbCxcbiAgICAgIHN0cm9rZTogY29sb3JTZXQuZGlzYWJsZVN0cm9rZSxcbiAgICAgIGxpbmVXaWR0aDogMVxuICAgIH1cbiAgfSxcbiAgZWRnZUxhYmVsOiB7XG4gICAgc3R5bGU6IHtcbiAgICAgIGZpbGw6IHRleHRDb2xvcixcbiAgICAgIHRleHRBbGlnbjogJ2NlbnRlcicsXG4gICAgICB0ZXh0QmFzZWxpbmU6ICdtaWRkbGUnLFxuICAgICAgZm9udFNpemU6IDEyXG4gICAgfVxuICB9LFxuICBkZWZhdWx0RWRnZToge1xuICAgIHR5cGU6ICdsaW5lJyxcbiAgICBzaXplOiAxLFxuICAgIHN0eWxlOiB7XG4gICAgICBzdHJva2U6IGNvbG9yU2V0LmVkZ2VNYWluU3Ryb2tlLFxuICAgICAgbGluZUFwcGVuZFdpZHRoOiAyXG4gICAgfSxcbiAgICBjb2xvcjogY29sb3JTZXQuZWRnZU1haW5TdHJva2VcbiAgfSxcbiAgLy8g6L655bqU55So54q25oCB5ZCO55qE5qC35byP77yM6buY6K6k5LuF5o+Q5L6bIGFjdGl2ZeOAgXNlbGVjdGVk44CBaGlnaGxpZ2h044CBaW5hY3RpdmXjgIFkaXNhYmxl77yM55So5oi35Y+v5Lul6Ieq5bex5omp5bGVXG4gIGVkZ2VTdGF0ZVN0eWxlczoge1xuICAgIGFjdGl2ZToge1xuICAgICAgc3Ryb2tlOiBjb2xvclNldC5lZGdlQWN0aXZlU3Ryb2tlLFxuICAgICAgbGluZVdpZHRoOiAxXG4gICAgfSxcbiAgICBzZWxlY3RlZDoge1xuICAgICAgc3Ryb2tlOiBjb2xvclNldC5lZGdlU2VsZWN0ZWRTdHJva2UsXG4gICAgICBsaW5lV2lkdGg6IDIsXG4gICAgICBzaGFkb3dDb2xvcjogY29sb3JTZXQuZWRnZVNlbGVjdGVkU3Ryb2tlLFxuICAgICAgc2hhZG93Qmx1cjogMTAsXG4gICAgICAndGV4dC1zaGFwZSc6IHtcbiAgICAgICAgZm9udFdlaWdodDogNTAwXG4gICAgICB9XG4gICAgfSxcbiAgICBoaWdobGlnaHQ6IHtcbiAgICAgIHN0cm9rZTogY29sb3JTZXQuZWRnZUhpZ2hsaWdodFN0cm9rZSxcbiAgICAgIGxpbmVXaWR0aDogMixcbiAgICAgICd0ZXh0LXNoYXBlJzoge1xuICAgICAgICBmb250V2VpZ2h0OiA1MDBcbiAgICAgIH1cbiAgICB9LFxuICAgIGluYWN0aXZlOiB7XG4gICAgICBzdHJva2U6IGNvbG9yU2V0LmVkZ2VJbmFjdGl2ZVN0cm9rZSxcbiAgICAgIGxpbmVXaWR0aDogMVxuICAgIH0sXG4gICAgZGlzYWJsZToge1xuICAgICAgc3Ryb2tlOiBjb2xvclNldC5lZGdlRGlzYWJsZVN0cm9rZSxcbiAgICAgIGxpbmVXaWR0aDogMVxuICAgIH1cbiAgfSxcbiAgY29tYm9MYWJlbDoge1xuICAgIHN0eWxlOiB7XG4gICAgICBmaWxsOiB0ZXh0Q29sb3IsXG4gICAgICAvLyB0ZXh0QWxpZ246ICdjZW50ZXInLFxuICAgICAgdGV4dEJhc2VsaW5lOiAnbWlkZGxlJyxcbiAgICAgIGZvbnRTaXplOiAxMlxuICAgIH0sXG4gICAgcmVmWTogMTAsXG4gICAgcmVmWDogMTAgLy8gQ29tYm8g55qE6buY6K6k5paH5pys5LiN5bGF5Lit5pe255qE5YGP56e76YePXG5cbiAgfSxcbiAgZGVmYXVsdENvbWJvOiB7XG4gICAgdHlwZTogJ2NpcmNsZScsXG4gICAgc3R5bGU6IHtcbiAgICAgIGZpbGw6IGNvbG9yU2V0LmNvbWJvTWFpbkZpbGwsXG4gICAgICBsaW5lV2lkdGg6IDEsXG4gICAgICBzdHJva2U6IGNvbG9yU2V0LmNvbWJvTWFpblN0cm9rZSxcbiAgICAgIHI6IDUsXG4gICAgICB3aWR0aDogMjAsXG4gICAgICBoZWlnaHQ6IDEwXG4gICAgfSxcbiAgICBzaXplOiBbMjAsIDVdLFxuICAgIGNvbG9yOiBjb2xvclNldC5jb21ib01haW5TdHJva2UsXG4gICAgcGFkZGluZzogWzI1LCAyMCwgMTUsIDIwXVxuICB9LFxuICAvLyBjb21ibyDlupTnlKjnirbmgIHlkI7nmoTmoLflvI/vvIzpu5jorqTku4Xmj5DkvpsgYWN0aXZl44CBc2VsZWN0ZWTjgIFoaWdobGlnaHTjgIFpbmFjdGl2ZeOAgWRpc2FibGXvvIznlKjmiLflj6/ku6Xoh6rlt7HmianlsZVcbiAgY29tYm9TdGF0ZVN0eWxlczoge1xuICAgIGFjdGl2ZToge1xuICAgICAgc3Ryb2tlOiBjb2xvclNldC5jb21ib0FjdGl2ZVN0cm9rZSxcbiAgICAgIGxpbmVXaWR0aDogMSxcbiAgICAgIGZpbGw6IGNvbG9yU2V0LmNvbWJvQWN0aXZlRmlsbFxuICAgIH0sXG4gICAgc2VsZWN0ZWQ6IHtcbiAgICAgIHN0cm9rZTogY29sb3JTZXQuY29tYm9TZWxlY3RlZFN0cm9rZSxcbiAgICAgIGxpbmVXaWR0aDogMixcbiAgICAgIGZpbGw6IGNvbG9yU2V0LmNvbWJvU2VsZWN0ZWRGaWxsLFxuICAgICAgc2hhZG93Q29sb3I6IGNvbG9yU2V0LmNvbWJvU2VsZWN0ZWRTdHJva2UsXG4gICAgICBzaGFkb3dCbHVyOiAxMCxcbiAgICAgICd0ZXh0LXNoYXBlJzoge1xuICAgICAgICBmb250V2VpZ2h0OiA1MDBcbiAgICAgIH1cbiAgICB9LFxuICAgIGhpZ2hsaWdodDoge1xuICAgICAgc3Ryb2tlOiBjb2xvclNldC5jb21ib0hpZ2hsaWdodFN0cm9rZSxcbiAgICAgIGxpbmVXaWR0aDogMixcbiAgICAgIGZpbGw6IGNvbG9yU2V0LmNvbWJvSGlnaGxpZ2h0RmlsbCxcbiAgICAgICd0ZXh0LXNoYXBlJzoge1xuICAgICAgICBmb250V2VpZ2h0OiA1MDBcbiAgICAgIH1cbiAgICB9LFxuICAgIGluYWN0aXZlOiB7XG4gICAgICBzdHJva2U6IGNvbG9yU2V0LmNvbWJvSW5hY3RpdmVTdHJva2UsXG4gICAgICBmaWxsOiBjb2xvclNldC5jb21ib0luYWN0aXZlRmlsbCxcbiAgICAgIGxpbmVXaWR0aDogMVxuICAgIH0sXG4gICAgZGlzYWJsZToge1xuICAgICAgc3Ryb2tlOiBjb2xvclNldC5jb21ib0Rpc2FibGVTdHJva2UsXG4gICAgICBmaWxsOiBjb2xvclNldC5jb21ib0Rpc2FibGVGaWxsLFxuICAgICAgbGluZVdpZHRoOiAxXG4gICAgfVxuICB9LFxuICBkZWxlZ2F0ZVN0eWxlOiB7XG4gICAgZmlsbDogJyNGM0Y5RkYnLFxuICAgIGZpbGxPcGFjaXR5OiAwLjUsXG4gICAgc3Ryb2tlOiAnIzE4OTBGRicsXG4gICAgc3Ryb2tlT3BhY2l0eTogMC45LFxuICAgIGxpbmVEYXNoOiBbNSwgNV1cbiAgfSxcbiAgLy8g5paH5pys5rC05Y2w6buY6K6k6YWN572uXG4gIHRleHRXYXRlck1hcmtlckNvbmZpZzoge1xuICAgIHdpZHRoOiAxNTAsXG4gICAgaGVpZ2h0OiAxMDAsXG4gICAgY29tcGF0aWJsZTogZmFsc2UsXG4gICAgdGV4dDoge1xuICAgICAgeDogMCxcbiAgICAgIHk6IDYwLFxuICAgICAgbGluZUhlaWdodDogMjAsXG4gICAgICByb3RhdGU6IDIwLFxuICAgICAgZm9udFNpemU6IDE0LFxuICAgICAgZm9udEZhbWlseTogJ01pY3Jvc29mdCBZYUhlaScsXG4gICAgICBmaWxsOiAncmdiYSgwLCAwLCAwLCAwLjEpJyxcbiAgICAgIGJhc2VsaW5lOiAnTWlkZGxlJ1xuICAgIH1cbiAgfSxcbiAgaW1hZ2VXYXRlck1hcmtlckNvbmZpZzoge1xuICAgIHdpZHRoOiAxNTAsXG4gICAgaGVpZ2h0OiAxMzAsXG4gICAgY29tcGF0aWJsZTogZmFsc2UsXG4gICAgaW1hZ2U6IHtcbiAgICAgIHg6IDAsXG4gICAgICB5OiAwLFxuICAgICAgd2lkdGg6IDMwLFxuICAgICAgaGVpZ2h0OiAyMCxcbiAgICAgIHJvdGF0ZTogMFxuICAgIH1cbiAgfSxcbiAgd2F0ZXJNYXJrZXJJbWFnZTogJ2h0dHBzOi8vZ3cuYWxpcGF5b2JqZWN0cy5jb20vb3Mvcy9wcm9kL2FudHYvYXNzZXRzL2ltYWdlL2xvZ28td2l0aC10ZXh0LTczYjhhLnN2Zydcbn07IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYWRkRXZlbnRMaXN0ZW5lcih0YXJnZXQsIGV2ZW50VHlwZSwgY2FsbGJhY2spIHtcbiAgICBpZiAodGFyZ2V0KSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgY2FsbGJhY2ssIGZhbHNlKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgcmVtb3ZlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgY2FsbGJhY2ssIGZhbHNlKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHRhcmdldC5hdHRhY2hFdmVudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgdGFyZ2V0LmF0dGFjaEV2ZW50KCdvbicgKyBldmVudFR5cGUsIGNhbGxiYWNrKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgcmVtb3ZlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LmRldGFjaEV2ZW50KCdvbicgKyBldmVudFR5cGUsIGNhbGxiYWNrKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFkZC1ldmVudC1saXN0ZW5lci5qcy5tYXAiLCIvKipcbiAqIOWIm+W7ukRPTSDoioLngrlcbiAqIEBwYXJhbSAge1N0cmluZ30gc3RyIERvbSDlrZfnrKbkuLJcbiAqIEByZXR1cm4ge0hUTUxFbGVtZW50fSAgRE9NIOiKgueCuVxuICovXG52YXIgVEFCTEU7XG52YXIgVEFCTEVfVFI7XG52YXIgRlJBR01FTlRfUkVHO1xudmFyIENPTlRBSU5FUlM7XG5mdW5jdGlvbiBpbml0Q29uc3RhbnRzKCkge1xuICAgIFRBQkxFID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGFibGUnKTtcbiAgICBUQUJMRV9UUiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7XG4gICAgRlJBR01FTlRfUkVHID0gL15cXHMqPChcXHcrfCEpW14+XSo+LztcbiAgICBDT05UQUlORVJTID0ge1xuICAgICAgICB0cjogZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGJvZHknKSxcbiAgICAgICAgdGJvZHk6IFRBQkxFLFxuICAgICAgICB0aGVhZDogVEFCTEUsXG4gICAgICAgIHRmb290OiBUQUJMRSxcbiAgICAgICAgdGQ6IFRBQkxFX1RSLFxuICAgICAgICB0aDogVEFCTEVfVFIsXG4gICAgICAgICcqJzogZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JyksXG4gICAgfTtcbn1cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNyZWF0ZURvbShzdHIpIHtcbiAgICBpZiAoIVRBQkxFKSB7XG4gICAgICAgIGluaXRDb25zdGFudHMoKTtcbiAgICB9XG4gICAgdmFyIG5hbWUgPSBGUkFHTUVOVF9SRUcudGVzdChzdHIpICYmIFJlZ0V4cC4kMTtcbiAgICBpZiAoIW5hbWUgfHwgIShuYW1lIGluIENPTlRBSU5FUlMpKSB7XG4gICAgICAgIG5hbWUgPSAnKic7XG4gICAgfVxuICAgIHZhciBjb250YWluZXIgPSBDT05UQUlORVJTW25hbWVdO1xuICAgIHN0ciA9IHN0ci5yZXBsYWNlKC8oXlxccyopfChcXHMqJCkvZywgJycpO1xuICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnJyArIHN0cjtcbiAgICB2YXIgZG9tID0gY29udGFpbmVyLmNoaWxkTm9kZXNbMF07XG4gICAgY29udGFpbmVyLnJlbW92ZUNoaWxkKGRvbSk7XG4gICAgcmV0dXJuIGRvbTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNyZWF0ZS1kb20uanMubWFwIiwiLyoqXG4gKiDojrflj5bmoLflvI9cbiAqIEBwYXJhbSAge09iamVjdH0gZG9tIERPTeiKgueCuVxuICogQHBhcmFtICB7U3RyaW5nfSBuYW1lIOagt+W8j+WQjVxuICogQHBhcmFtICB7QW55fSBkZWZhdWx0VmFsdWUg6buY6K6k5YC8XG4gKiBAcmV0dXJuIHtTdHJpbmd9IOWxnuaAp+WAvFxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRTdHlsZShkb20sIG5hbWUsIGRlZmF1bHRWYWx1ZSkge1xuICAgIHZhciB2O1xuICAgIHRyeSB7XG4gICAgICAgIHYgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSA/XG4gICAgICAgICAgICB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShkb20sIG51bGwpW25hbWVdIDpcbiAgICAgICAgICAgIGRvbS5zdHlsZVtuYW1lXTsgLy8g5LiA6Iis5LiN5Lya6LWw5Yiw6L+Z5Liq6YC76L6R77yMZG9tLnN0eWxlIOiOt+WPlueahOaYr+agh+etviBzdHlsZSDlsZ7mgKfvvIzkuZ/kuI3lh4bnoa5cbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgICBmaW5hbGx5IHtcbiAgICAgICAgdiA9IHYgPT09IHVuZGVmaW5lZCA/IGRlZmF1bHRWYWx1ZSA6IHY7XG4gICAgfVxuICAgIHJldHVybiB2O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z2V0LXN0eWxlLmpzLm1hcCIsImltcG9ydCBnZXRTdHlsZSBmcm9tICcuL2dldC1zdHlsZSc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRIZWlnaHQoZWwsIGRlZmF1bHRWYWx1ZSkge1xuICAgIHZhciBoZWlnaHQgPSBnZXRTdHlsZShlbCwgJ2hlaWdodCcsIGRlZmF1bHRWYWx1ZSk7XG4gICAgaWYgKGhlaWdodCA9PT0gJ2F1dG8nKSB7XG4gICAgICAgIGhlaWdodCA9IGVsLm9mZnNldEhlaWdodDtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnNlRmxvYXQoaGVpZ2h0KTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdldC1oZWlnaHQuanMubWFwIiwiaW1wb3J0IGdldFN0eWxlIGZyb20gJy4vZ2V0LXN0eWxlJztcbmltcG9ydCBnZXRIZWlnaHQgZnJvbSAnLi9nZXQtaGVpZ2h0JztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldE91dGVySGVpZ2h0KGVsLCBkZWZhdWx0VmFsdWUpIHtcbiAgICB2YXIgaGVpZ2h0ID0gZ2V0SGVpZ2h0KGVsLCBkZWZhdWx0VmFsdWUpO1xuICAgIHZhciBiVG9wID0gcGFyc2VGbG9hdChnZXRTdHlsZShlbCwgJ2JvcmRlclRvcFdpZHRoJykpIHx8IDA7XG4gICAgdmFyIHBUb3AgPSBwYXJzZUZsb2F0KGdldFN0eWxlKGVsLCAncGFkZGluZ1RvcCcpKSB8fCAwO1xuICAgIHZhciBwQm90dG9tID0gcGFyc2VGbG9hdChnZXRTdHlsZShlbCwgJ3BhZGRpbmdCb3R0b20nKSkgfHwgMDtcbiAgICB2YXIgYkJvdHRvbSA9IHBhcnNlRmxvYXQoZ2V0U3R5bGUoZWwsICdib3JkZXJCb3R0b21XaWR0aCcpKSB8fCAwO1xuICAgIHZhciBtVG9wID0gcGFyc2VGbG9hdChnZXRTdHlsZShlbCwgJ21hcmdpblRvcCcpKSB8fCAwO1xuICAgIHZhciBtQm90dG9tID0gcGFyc2VGbG9hdChnZXRTdHlsZShlbCwgJ21hcmdpbkJvdHRvbScpKSB8fCAwO1xuICAgIHJldHVybiBoZWlnaHQgKyBiVG9wICsgYkJvdHRvbSArIHBUb3AgKyBwQm90dG9tICsgbVRvcCArIG1Cb3R0b207XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1nZXQtb3V0ZXItaGVpZ2h0LmpzLm1hcCIsImltcG9ydCBnZXRTdHlsZSBmcm9tICcuL2dldC1zdHlsZSc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRIZWlnaHQoZWwsIGRlZmF1bHRWYWx1ZSkge1xuICAgIHZhciB3aWR0aCA9IGdldFN0eWxlKGVsLCAnd2lkdGgnLCBkZWZhdWx0VmFsdWUpO1xuICAgIGlmICh3aWR0aCA9PT0gJ2F1dG8nKSB7XG4gICAgICAgIHdpZHRoID0gZWwub2Zmc2V0V2lkdGg7XG4gICAgfVxuICAgIHJldHVybiBwYXJzZUZsb2F0KHdpZHRoKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdldC13aWR0aC5qcy5tYXAiLCJpbXBvcnQgZ2V0U3R5bGUgZnJvbSAnLi9nZXQtc3R5bGUnO1xuaW1wb3J0IGdldFdpZHRoIGZyb20gJy4vZ2V0LXdpZHRoJztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldE91dGVyV2lkdGgoZWwsIGRlZmF1bHRWYWx1ZSkge1xuICAgIHZhciB3aWR0aCA9IGdldFdpZHRoKGVsLCBkZWZhdWx0VmFsdWUpO1xuICAgIHZhciBiTGVmdCA9IHBhcnNlRmxvYXQoZ2V0U3R5bGUoZWwsICdib3JkZXJMZWZ0V2lkdGgnKSkgfHwgMDtcbiAgICB2YXIgcExlZnQgPSBwYXJzZUZsb2F0KGdldFN0eWxlKGVsLCAncGFkZGluZ0xlZnQnKSkgfHwgMDtcbiAgICB2YXIgcFJpZ2h0ID0gcGFyc2VGbG9hdChnZXRTdHlsZShlbCwgJ3BhZGRpbmdSaWdodCcpKSB8fCAwO1xuICAgIHZhciBiUmlnaHQgPSBwYXJzZUZsb2F0KGdldFN0eWxlKGVsLCAnYm9yZGVyUmlnaHRXaWR0aCcpKSB8fCAwO1xuICAgIHZhciBtUmlnaHQgPSBwYXJzZUZsb2F0KGdldFN0eWxlKGVsLCAnbWFyZ2luUmlnaHQnKSkgfHwgMDtcbiAgICB2YXIgbUxlZnQgPSBwYXJzZUZsb2F0KGdldFN0eWxlKGVsLCAnbWFyZ2luTGVmdCcpKSB8fCAwO1xuICAgIHJldHVybiB3aWR0aCArIGJMZWZ0ICsgYlJpZ2h0ICsgcExlZnQgKyBwUmlnaHQgKyBtTGVmdCArIG1SaWdodDtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdldC1vdXRlci13aWR0aC5qcy5tYXAiLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRSYXRpbygpIHtcbiAgICByZXR1cm4gd2luZG93LmRldmljZVBpeGVsUmF0aW8gPyB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyA6IDI7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1nZXQtcmF0aW8uanMubWFwIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbW9kaWZ5Q1NTKGRvbSwgY3NzKSB7XG4gICAgaWYgKGRvbSkge1xuICAgICAgICBmb3IgKHZhciBrZXkgaW4gY3NzKSB7XG4gICAgICAgICAgICBpZiAoY3NzLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgICAgICBkb20uc3R5bGVba2V5XSA9IGNzc1trZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkb207XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tb2RpZnktY3NzLmpzLm1hcCIsIi8vIGRvbVxuZXhwb3J0IHsgZGVmYXVsdCBhcyBhZGRFdmVudExpc3RlbmVyIH0gZnJvbSAnLi9hZGQtZXZlbnQtbGlzdGVuZXInO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBjcmVhdGVEb20gfSBmcm9tICcuL2NyZWF0ZS1kb20nO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBnZXRIZWlnaHQgfSBmcm9tICcuL2dldC1oZWlnaHQnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBnZXRPdXRlckhlaWdodCB9IGZyb20gJy4vZ2V0LW91dGVyLWhlaWdodCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGdldE91dGVyV2lkdGggfSBmcm9tICcuL2dldC1vdXRlci13aWR0aCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGdldFJhdGlvIH0gZnJvbSAnLi9nZXQtcmF0aW8nO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBnZXRTdHlsZSB9IGZyb20gJy4vZ2V0LXN0eWxlJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgZ2V0V2lkdGggfSBmcm9tICcuL2dldC13aWR0aCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIG1vZGlmeUNTUyB9IGZyb20gJy4vbW9kaWZ5LWNzcyc7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGFkZEV2ZW50TGlzdGVuZXIgfSBmcm9tICdAYW50di9kb20tdXRpbCc7XG5pbXBvcnQgeyBlYWNoLCBpc05pbCwgd3JhcEJlaGF2aW9yIH0gZnJvbSAnQGFudHYvdXRpbCc7XG5pbXBvcnQgeyBBYnN0cmFjdEV2ZW50LCBVdGlsIH0gZnJvbSAnQGFudHYvZzYtY29yZSc7XG52YXIgY2xvbmVFdmVudCA9IFV0aWwuY2xvbmVFdmVudCxcbiAgICBpc1ZpZXdwb3J0Q2hhbmdlZCA9IFV0aWwuaXNWaWV3cG9ydENoYW5nZWQ7XG5cbnZhciBFdmVudENvbnRyb2xsZXIgPVxuLyoqIEBjbGFzcyAqL1xuZnVuY3Rpb24gKF9zdXBlcikge1xuICBfX2V4dGVuZHMoRXZlbnRDb250cm9sbGVyLCBfc3VwZXIpO1xuXG4gIGZ1bmN0aW9uIEV2ZW50Q29udHJvbGxlcihncmFwaCkge1xuICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIGdyYXBoKSB8fCB0aGlzO1xuXG4gICAgX3RoaXMuZXh0ZW5kRXZlbnRzID0gW107XG4gICAgX3RoaXMuZHJhZ2dpbmcgPSBmYWxzZTtcbiAgICBfdGhpcy5wcmVJdGVtID0gbnVsbDtcbiAgICBfdGhpcy5ncmFwaCA9IGdyYXBoO1xuICAgIF90aGlzLmRlc3Ryb3llZCA9IGZhbHNlO1xuXG4gICAgX3RoaXMuaW5pdEV2ZW50cygpO1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9IC8vIOWIneWni+WMliBHNiDkuK3nmoTkuovku7ZcblxuXG4gIEV2ZW50Q29udHJvbGxlci5wcm90b3R5cGUuaW5pdEV2ZW50cyA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgX2EgPSB0aGlzLFxuICAgICAgICBncmFwaCA9IF9hLmdyYXBoLFxuICAgICAgICBfYiA9IF9hLmV4dGVuZEV2ZW50cyxcbiAgICAgICAgZXh0ZW5kRXZlbnRzID0gX2IgPT09IHZvaWQgMCA/IFtdIDogX2I7XG5cbiAgICB2YXIgY2FudmFzID0gZ3JhcGguZ2V0KCdjYW52YXMnKTsgLy8gY2FudmFzLnNldCgnZHJhZ2dhYmxlJywgdHJ1ZSk7XG5cbiAgICB2YXIgZWwgPSBjYW52YXMuZ2V0KCdlbCcpO1xuICAgIHZhciBjYW52YXNIYW5kbGVyID0gd3JhcEJlaGF2aW9yKHRoaXMsICdvbkNhbnZhc0V2ZW50cycpO1xuICAgIHZhciBvcmlnaW5IYW5kbGVyID0gd3JhcEJlaGF2aW9yKHRoaXMsICdvbkV4dGVuZEV2ZW50cycpO1xuICAgIHZhciB3aGVlbEhhbmRsZXIgPSB3cmFwQmVoYXZpb3IodGhpcywgJ29uV2hlZWxFdmVudCcpOyAvLyBlYWNoKEVWRU5UUywgZXZlbnQgPT4ge1xuICAgIC8vICAgY2FudmFzLm9mZihldmVudCkub24oZXZlbnQsIGNhbnZhc0hhbmRsZXIpO1xuICAgIC8vIH0pO1xuXG4gICAgY2FudmFzLm9mZignKicpLm9uKCcqJywgY2FudmFzSGFuZGxlcik7XG4gICAgdGhpcy5jYW52YXNIYW5kbGVyID0gY2FudmFzSGFuZGxlcjtcbiAgICBleHRlbmRFdmVudHMucHVzaChhZGRFdmVudExpc3RlbmVyKGVsLCAnRE9NTW91c2VTY3JvbGwnLCB3aGVlbEhhbmRsZXIpKTtcbiAgICBleHRlbmRFdmVudHMucHVzaChhZGRFdmVudExpc3RlbmVyKGVsLCAnbW91c2V3aGVlbCcsIHdoZWVsSGFuZGxlcikpO1xuXG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBleHRlbmRFdmVudHMucHVzaChhZGRFdmVudExpc3RlbmVyKHdpbmRvdywgJ2tleWRvd24nLCBvcmlnaW5IYW5kbGVyKSk7XG4gICAgICBleHRlbmRFdmVudHMucHVzaChhZGRFdmVudExpc3RlbmVyKHdpbmRvdywgJ2tleXVwJywgb3JpZ2luSGFuZGxlcikpO1xuICAgICAgZXh0ZW5kRXZlbnRzLnB1c2goYWRkRXZlbnRMaXN0ZW5lcih3aW5kb3csICdmb2N1cycsIG9yaWdpbkhhbmRsZXIpKTtcbiAgICB9XG4gIH07IC8vIOiOt+WPliBzaGFwZSDnmoQgaXRlbSDlr7nosaFcblxuXG4gIEV2ZW50Q29udHJvbGxlci5nZXRJdGVtUm9vdCA9IGZ1bmN0aW9uIChzaGFwZSkge1xuICAgIHdoaWxlIChzaGFwZSAmJiAhc2hhcGUuZ2V0KCdpdGVtJykpIHtcbiAgICAgIHNoYXBlID0gc2hhcGUuZ2V0KCdwYXJlbnQnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2hhcGU7XG4gIH07XG4gIC8qKlxuICAgKiDlpITnkIYgY2FudmFzIOS6i+S7tlxuICAgKiBAcGFyYW0gZXZ0IOS6i+S7tuWPpeafhFxuICAgKi9cblxuXG4gIEV2ZW50Q29udHJvbGxlci5wcm90b3R5cGUub25DYW52YXNFdmVudHMgPSBmdW5jdGlvbiAoZXZ0KSB7XG4gICAgdmFyIGdyYXBoID0gdGhpcy5ncmFwaDtcbiAgICB2YXIgY2FudmFzID0gZ3JhcGguZ2V0KCdjYW52YXMnKTtcbiAgICB2YXIgdGFyZ2V0ID0gZXZ0LnRhcmdldDtcbiAgICB2YXIgZXZlbnRUeXBlID0gZXZ0LnR5cGU7XG4gICAgLyoqXG4gICAgICogKGNsaWVudFgsIGNsaWVudFkpOiDnm7jlr7nkuo7pobXpnaLnmoTlnZDmoIfvvJtcbiAgICAgKiAoY2FudmFzWCwgY2FudmFzWSk6IOebuOWvueS6jiA8Y2FudmFzPiDlt6bkuIrop5LnmoTlnZDmoIfvvJtcbiAgICAgKiAoeCwgeSk6IOebuOWvueS6juaVtOS4queUu+W4g+eahOWdkOaghywg5LiOIG1vZGVsIOeahCB4LCB5IOaYr+WQjOS4gOe7tOW6pueahOOAglxuICAgICAqL1xuXG4gICAgZXZ0LmNhbnZhc1ggPSBldnQueDtcbiAgICBldnQuY2FudmFzWSA9IGV2dC55O1xuICAgIHZhciBwb2ludCA9IHtcbiAgICAgIHg6IGV2dC5jYW52YXNYLFxuICAgICAgeTogZXZ0LmNhbnZhc1lcbiAgICB9O1xuICAgIHZhciBncm91cCA9IGdyYXBoLmdldCgnZ3JvdXAnKTtcbiAgICB2YXIgbWF0cml4ID0gZ3JvdXAuZ2V0TWF0cml4KCk7XG5cbiAgICBpZiAoIW1hdHJpeCkge1xuICAgICAgbWF0cml4ID0gWzEsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDFdO1xuICAgIH1cblxuICAgIGlmIChpc1ZpZXdwb3J0Q2hhbmdlZChtYXRyaXgpKSB7XG4gICAgICBwb2ludCA9IGdyYXBoLmdldFBvaW50QnlDbGllbnQoZXZ0LmNsaWVudFgsIGV2dC5jbGllbnRZKTtcbiAgICB9XG5cbiAgICBldnQueCA9IHBvaW50Lng7XG4gICAgZXZ0LnkgPSBwb2ludC55O1xuICAgIGV2dC5jdXJyZW50VGFyZ2V0ID0gZ3JhcGg7XG5cbiAgICBpZiAodGFyZ2V0ID09PSBjYW52YXMpIHtcbiAgICAgIGlmIChldmVudFR5cGUgPT09ICdtb3VzZW1vdmUnIHx8IGV2ZW50VHlwZSA9PT0gJ21vdXNlbGVhdmUnKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlTW91c2VNb3ZlKGV2dCwgJ2NhbnZhcycpO1xuICAgICAgfVxuXG4gICAgICBldnQudGFyZ2V0ID0gY2FudmFzO1xuICAgICAgZXZ0Lml0ZW0gPSBudWxsO1xuICAgICAgZ3JhcGguZW1pdChldmVudFR5cGUsIGV2dCk7XG4gICAgICBncmFwaC5lbWl0KFwiY2FudmFzOlwiICsgZXZlbnRUeXBlLCBldnQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBpdGVtU2hhcGUgPSBFdmVudENvbnRyb2xsZXIuZ2V0SXRlbVJvb3QodGFyZ2V0KTtcblxuICAgIGlmICghaXRlbVNoYXBlKSB7XG4gICAgICBncmFwaC5lbWl0KGV2ZW50VHlwZSwgZXZ0KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgaXRlbSA9IGl0ZW1TaGFwZS5nZXQoJ2l0ZW0nKTtcblxuICAgIGlmIChpdGVtLmRlc3Ryb3llZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciB0eXBlID0gaXRlbS5nZXRUeXBlKCk7IC8vIOS6i+S7tnRhcmdldOaYr+inpuWPkeS6i+S7tueahFNoYXBl5a6e5L6L77yMaXRlbeaYr+inpuWPkeS6i+S7tueahGl0ZW3lrp7kvotcblxuICAgIGV2dC50YXJnZXQgPSB0YXJnZXQ7XG4gICAgZXZ0Lml0ZW0gPSBpdGVtO1xuXG4gICAgaWYgKGV2dC5jYW52YXNYID09PSBldnQueCAmJiBldnQuY2FudmFzWSA9PT0gZXZ0LnkpIHtcbiAgICAgIHZhciBjYW52YXNQb2ludCA9IGdyYXBoLmdldENhbnZhc0J5UG9pbnQoZXZ0LngsIGV2dC55KTtcbiAgICAgIGV2dC5jYW52YXNYID0gY2FudmFzUG9pbnQueDtcbiAgICAgIGV2dC5jYW52YXNZID0gY2FudmFzUG9pbnQueTtcbiAgICB9IC8vIGVtaXQoJ2NsaWNrJywgZXZ0KTtcblxuXG4gICAgZ3JhcGguZW1pdChldmVudFR5cGUsIGV2dCk7XG4gICAgaWYgKGV2dC5uYW1lICYmICFldnQubmFtZS5pbmNsdWRlcygnOicpKSBncmFwaC5lbWl0KHR5cGUgKyBcIjpcIiArIGV2ZW50VHlwZSwgZXZ0KTsgLy8gZW1pdCgnbm9kZTpjbGljaycsIGV2dClcbiAgICBlbHNlIGdyYXBoLmVtaXQoZXZ0Lm5hbWUsIGV2dCk7IC8vIGVtaXQoJ3RleHQtc2hhcGU6Y2xpY2snLCBldnQpXG5cbiAgICBpZiAoZXZlbnRUeXBlID09PSAnZHJhZ3N0YXJ0Jykge1xuICAgICAgdGhpcy5kcmFnZ2luZyA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50VHlwZSA9PT0gJ2RyYWdlbmQnKSB7XG4gICAgICB0aGlzLmRyYWdnaW5nID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50VHlwZSA9PT0gJ21vdXNlbW92ZScpIHtcbiAgICAgIHRoaXMuaGFuZGxlTW91c2VNb3ZlKGV2dCwgdHlwZSk7XG4gICAgfVxuICB9O1xuICAvKipcbiAgICog5aSE55CG5omp5bGV5LqL5Lu2XG4gICAqIEBwYXJhbSBldnQg5LqL5Lu25Y+l5p+EXG4gICAqL1xuXG5cbiAgRXZlbnRDb250cm9sbGVyLnByb3RvdHlwZS5vbkV4dGVuZEV2ZW50cyA9IGZ1bmN0aW9uIChldnQpIHtcbiAgICB0aGlzLmdyYXBoLmVtaXQoZXZ0LnR5cGUsIGV2dCk7XG4gIH07XG4gIC8qKlxuICAgKiDlpITnkIbmu5rova7kuovku7ZcbiAgICogQHBhcmFtIGV2dCDkuovku7blj6Xmn4RcbiAgICovXG5cblxuICBFdmVudENvbnRyb2xsZXIucHJvdG90eXBlLm9uV2hlZWxFdmVudCA9IGZ1bmN0aW9uIChldnQpIHtcbiAgICBpZiAoaXNOaWwoZXZ0LndoZWVsRGVsdGEpKSB7XG4gICAgICBldnQud2hlZWxEZWx0YSA9IC1ldnQuZGV0YWlsO1xuICAgIH1cblxuICAgIHRoaXMuZ3JhcGguZW1pdCgnd2hlZWwnLCBldnQpO1xuICB9O1xuICAvKipcbiAgICog5aSE55CG6byg5qCH56e75Yqo55qE5LqL5Lu2XG4gICAqIEBwYXJhbSBldnQg5LqL5Lu25Y+l5p+EXG4gICAqIEBwYXJhbSB0eXBlIGl0ZW0g57G75Z6LXG4gICAqL1xuXG5cbiAgRXZlbnRDb250cm9sbGVyLnByb3RvdHlwZS5oYW5kbGVNb3VzZU1vdmUgPSBmdW5jdGlvbiAoZXZ0LCB0eXBlKSB7XG4gICAgdmFyIF9hID0gdGhpcyxcbiAgICAgICAgZ3JhcGggPSBfYS5ncmFwaCxcbiAgICAgICAgcHJlSXRlbSA9IF9hLnByZUl0ZW07XG5cbiAgICB2YXIgY2FudmFzID0gZ3JhcGguZ2V0KCdjYW52YXMnKTtcbiAgICB2YXIgaXRlbSA9IGV2dC50YXJnZXQgPT09IGNhbnZhcyA/IG51bGwgOiBldnQuaXRlbTtcbiAgICBldnQgPSBjbG9uZUV2ZW50KGV2dCk7IC8vIOS7juWJjeS4gOS4qml0ZW3nm7TmjqXnp7vliqjliLDlvZPliY1pdGVt77yM6Kem5Y+R5YmN5LiA5LiqaXRlbeeahGxlYXZl5LqL5Lu2XG5cbiAgICBpZiAocHJlSXRlbSAmJiBwcmVJdGVtICE9PSBpdGVtICYmICFwcmVJdGVtLmRlc3Ryb3llZCkge1xuICAgICAgZXZ0Lml0ZW0gPSBwcmVJdGVtO1xuICAgICAgdGhpcy5lbWl0Q3VzdG9tRXZlbnQocHJlSXRlbS5nZXRUeXBlKCksICdtb3VzZWxlYXZlJywgZXZ0KTtcblxuICAgICAgaWYgKHRoaXMuZHJhZ2dpbmcpIHtcbiAgICAgICAgdGhpcy5lbWl0Q3VzdG9tRXZlbnQocHJlSXRlbS5nZXRUeXBlKCksICdkcmFnbGVhdmUnLCBldnQpO1xuICAgICAgfVxuICAgIH0gLy8g5LuO5LiA5LiqaXRlbeaIlmNhbnZhc+enu+WKqOWIsOW9k+WJjWl0ZW3vvIzop6blj5HlvZPliY1pdGVt55qEZW50ZXLkuovku7ZcblxuXG4gICAgaWYgKGl0ZW0gJiYgcHJlSXRlbSAhPT0gaXRlbSkge1xuICAgICAgZXZ0Lml0ZW0gPSBpdGVtO1xuICAgICAgdGhpcy5lbWl0Q3VzdG9tRXZlbnQodHlwZSwgJ21vdXNlZW50ZXInLCBldnQpO1xuXG4gICAgICBpZiAodGhpcy5kcmFnZ2luZykge1xuICAgICAgICB0aGlzLmVtaXRDdXN0b21FdmVudCh0eXBlLCAnZHJhZ2VudGVyJywgZXZ0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnByZUl0ZW0gPSBpdGVtO1xuICB9O1xuICAvKipcbiAgICog5ZyoIGdyYXBoIOS4iumdoiBlbWl0IOS6i+S7tlxuICAgKiBAcGFyYW0gaXRlbVR5cGUgaXRlbSDnsbvlnotcbiAgICogQHBhcmFtIGV2ZW50VHlwZSDkuovku7bnsbvlnotcbiAgICogQHBhcmFtIGV2dCDkuovku7blj6Xmn4RcbiAgICovXG5cblxuICBFdmVudENvbnRyb2xsZXIucHJvdG90eXBlLmVtaXRDdXN0b21FdmVudCA9IGZ1bmN0aW9uIChpdGVtVHlwZSwgZXZlbnRUeXBlLCBldnQpIHtcbiAgICBldnQudHlwZSA9IGV2ZW50VHlwZTtcbiAgICB0aGlzLmdyYXBoLmVtaXQoaXRlbVR5cGUgKyBcIjpcIiArIGV2ZW50VHlwZSwgZXZ0KTtcbiAgfTtcblxuICBFdmVudENvbnRyb2xsZXIucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIF9hID0gdGhpcyxcbiAgICAgICAgZ3JhcGggPSBfYS5ncmFwaCxcbiAgICAgICAgY2FudmFzSGFuZGxlciA9IF9hLmNhbnZhc0hhbmRsZXIsXG4gICAgICAgIGV4dGVuZEV2ZW50cyA9IF9hLmV4dGVuZEV2ZW50cztcblxuICAgIHZhciBjYW52YXMgPSBncmFwaC5nZXQoJ2NhbnZhcycpOyAvLyBlYWNoKEVWRU5UUywgZXZlbnQgPT4ge1xuICAgIC8vICAgY2FudmFzLm9mZihldmVudCwgY2FudmFzSGFuZGxlcik7XG4gICAgLy8gfSk7XG5cbiAgICBjYW52YXMub2ZmKCcqJywgY2FudmFzSGFuZGxlcik7XG4gICAgZWFjaChleHRlbmRFdmVudHMsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgZXZlbnQucmVtb3ZlKCk7XG4gICAgfSk7XG4gICAgdGhpcy5kcmFnZ2luZyA9IGZhbHNlO1xuICAgIHRoaXMucHJlSXRlbSA9IG51bGw7XG4gICAgdGhpcy5leHRlbmRFdmVudHMubGVuZ3RoID0gMDtcbiAgICB0aGlzLmNhbnZhc0hhbmRsZXIgPSBudWxsO1xuICAgIHRoaXMuZGVzdHJveWVkID0gdHJ1ZTtcbiAgfTtcblxuICByZXR1cm4gRXZlbnRDb250cm9sbGVyO1xufShBYnN0cmFjdEV2ZW50KTtcblxuZXhwb3J0IGRlZmF1bHQgRXZlbnRDb250cm9sbGVyOyIsImV4cG9ydCBjbGFzcyBCYXNlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5ub2RlcyA9IFtdO1xuICAgICAgICB0aGlzLmVkZ2VzID0gW107XG4gICAgICAgIHRoaXMuY29tYm9zID0gW107XG4gICAgICAgIHRoaXMucG9zaXRpb25zID0gW107XG4gICAgICAgIHRoaXMuZGVzdHJveWVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMub25MYXlvdXRFbmQgPSAoKSA9PiB7IH07XG4gICAgfVxuICAgIGxheW91dChkYXRhKSB7XG4gICAgICAgIHRoaXMuaW5pdChkYXRhKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh0cnVlKTtcbiAgICB9XG4gICAgaW5pdChkYXRhKSB7XG4gICAgICAgIHRoaXMubm9kZXMgPSBkYXRhLm5vZGVzIHx8IFtdO1xuICAgICAgICB0aGlzLmVkZ2VzID0gZGF0YS5lZGdlcyB8fCBbXTtcbiAgICAgICAgdGhpcy5jb21ib3MgPSBkYXRhLmNvbWJvcyB8fCBbXTtcbiAgICB9XG4gICAgZXhlY3V0ZShyZWxvYWREYXRhKSB7IH1cbiAgICBleGVjdXRlV2l0aFdvcmtlcigpIHsgfVxuICAgIGdldERlZmF1bHRDZmcoKSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgdXBkYXRlQ2ZnKGNmZykge1xuICAgICAgICBpZiAoY2ZnKSB7XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGNmZyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0VHlwZSgpIHtcbiAgICAgICAgcmV0dXJuICdiYXNlJztcbiAgICB9XG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5ub2RlcyA9IG51bGw7XG4gICAgICAgIHRoaXMuZWRnZXMgPSBudWxsO1xuICAgICAgICB0aGlzLmNvbWJvcyA9IG51bGw7XG4gICAgICAgIHRoaXMucG9zaXRpb25zID0gbnVsbDtcbiAgICAgICAgdGhpcy5kZXN0cm95ZWQgPSB0cnVlO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJhc2UuanMubWFwIiwiZXhwb3J0IGNvbnN0IGlzU3RyaW5nID0gKHZhbCkgPT4gdHlwZW9mIHZhbCA9PT0gJ3N0cmluZyc7XG5jb25zdCBjYWNoZVN0cmluZ0Z1bmN0aW9uID0gKGZuKSA9PiB7XG4gICAgY29uc3QgY2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHJldHVybiAoKHN0cikgPT4ge1xuICAgICAgICBjb25zdCBoaXQgPSBjYWNoZVtzdHJdO1xuICAgICAgICByZXR1cm4gaGl0IHx8IChjYWNoZVtzdHJdID0gZm4oc3RyKSk7XG4gICAgfSk7XG59O1xuY29uc3QgY2FtZWxpemVSRSA9IC8tKFxcdykvZztcbmV4cG9ydCBjb25zdCBjYW1lbGl6ZSA9IGNhY2hlU3RyaW5nRnVuY3Rpb24oKHN0cikgPT4ge1xuICAgIHJldHVybiBzdHIucmVwbGFjZShjYW1lbGl6ZVJFLCAoXywgYykgPT4gKGMgPyBjLnRvVXBwZXJDYXNlKCkgOiAnJykpO1xufSk7XG4vLyBleHBvcnQgY29uc3QgY2FwaXRhbGl6ZSA9IGNhY2hlU3RyaW5nRnVuY3Rpb24oXG4vLyAgIChzdHI6IHN0cmluZykgPT4gc3RyLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgc3RyLnNsaWNlKDEpLFxuLy8gKVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3RyaW5nLmpzLm1hcCIsImV4cG9ydCBjb25zdCBpc0FycmF5ID0gQXJyYXkuaXNBcnJheTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFycmF5LmpzLm1hcCIsImV4cG9ydCBjb25zdCBpc051bWJlciA9ICh2YWwpID0+IHR5cGVvZiB2YWwgPT09ICdudW1iZXInO1xuZXhwb3J0IGNvbnN0IGlzTmFOID0gKG51bSkgPT4gTnVtYmVyLmlzTmFOKE51bWJlcihudW0pKTtcbmV4cG9ydCBjb25zdCB0b051bWJlciA9ICh2YWwpID0+IHtcbiAgICBjb25zdCBuID0gcGFyc2VGbG9hdCh2YWwpO1xuICAgIHJldHVybiBpc05hTihuKSA/IHZhbCA6IG47XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bnVtYmVyLmpzLm1hcCIsImV4cG9ydCBjb25zdCBpc09iamVjdCA9ICh2YWwpID0+IHZhbCAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsID09PSAnb2JqZWN0JztcbmV4cG9ydCBjb25zdCBjbG9uZSA9ICh0YXJnZXQpID0+IHtcbiAgICBpZiAodGFyZ2V0ID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfVxuICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgIHJldHVybiBuZXcgRGF0ZSh0YXJnZXQuZ2V0VGltZSgpKTtcbiAgICB9XG4gICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICAgIGNvbnN0IGNwID0gW107XG4gICAgICAgIHRhcmdldC5mb3JFYWNoKCh2KSA9PiB7XG4gICAgICAgICAgICBjcC5wdXNoKHYpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGNwLm1hcCgobikgPT4gY2xvbmUobikpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHRhcmdldCA9PT0gJ29iamVjdCcgJiYgdGFyZ2V0ICE9PSB7fSkge1xuICAgICAgICBjb25zdCBjcCA9IE9iamVjdC5hc3NpZ24oe30sIHRhcmdldCk7XG4gICAgICAgIE9iamVjdC5rZXlzKGNwKS5mb3JFYWNoKChrKSA9PiB7XG4gICAgICAgICAgICBjcFtrXSA9IGNsb25lKGNwW2tdKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBjcDtcbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldDtcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1vYmplY3QuanMubWFwIiwiaW1wb3J0IHsgaXNPYmplY3QgfSBmcm9tICcuL29iamVjdCc7XG5leHBvcnQgY29uc3QgZ2V0RWRnZVRlcm1pbmFsID0gKGVkZ2UsIHR5cGUpID0+IHtcbiAgICBjb25zdCB0ZXJtaW5hbCA9IGVkZ2VbdHlwZV07XG4gICAgaWYgKGlzT2JqZWN0KHRlcm1pbmFsKSkge1xuICAgICAgICByZXR1cm4gdGVybWluYWwuY2VsbDtcbiAgICB9XG4gICAgcmV0dXJuIHRlcm1pbmFsO1xufTtcbmV4cG9ydCBjb25zdCBnZXREZWdyZWUgPSAobiwgbm9kZUlkeE1hcCwgZWRnZXMpID0+IHtcbiAgICBjb25zdCBkZWdyZWVzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgZGVncmVlc1tpXSA9IDA7XG4gICAgfVxuICAgIGlmICghZWRnZXMpXG4gICAgICAgIHJldHVybiBkZWdyZWVzO1xuICAgIGVkZ2VzLmZvckVhY2goKGUpID0+IHtcbiAgICAgICAgY29uc3Qgc291cmNlID0gZ2V0RWRnZVRlcm1pbmFsKGUsICdzb3VyY2UnKTtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZ2V0RWRnZVRlcm1pbmFsKGUsICd0YXJnZXQnKTtcbiAgICAgICAgaWYgKHNvdXJjZSkge1xuICAgICAgICAgICAgZGVncmVlc1tub2RlSWR4TWFwW3NvdXJjZV1dICs9IDE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICAgICAgZGVncmVlc1tub2RlSWR4TWFwW3RhcmdldF1dICs9IDE7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gZGVncmVlcztcbn07XG5leHBvcnQgY29uc3QgZmxveWRXYXJzaGFsbCA9IChhZGpNYXRyaXgpID0+IHtcbiAgICAvLyBpbml0aWFsaXplXG4gICAgY29uc3QgZGlzdCA9IFtdO1xuICAgIGNvbnN0IHNpemUgPSBhZGpNYXRyaXgubGVuZ3RoO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2l6ZTsgaSArPSAxKSB7XG4gICAgICAgIGRpc3RbaV0gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBzaXplOyBqICs9IDEpIHtcbiAgICAgICAgICAgIGlmIChpID09PSBqKSB7XG4gICAgICAgICAgICAgICAgZGlzdFtpXVtqXSA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChhZGpNYXRyaXhbaV1bal0gPT09IDAgfHwgIWFkak1hdHJpeFtpXVtqXSkge1xuICAgICAgICAgICAgICAgIGRpc3RbaV1bal0gPSBJbmZpbml0eTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGRpc3RbaV1bal0gPSBhZGpNYXRyaXhbaV1bal07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gZmxveWRcbiAgICBmb3IgKGxldCBrID0gMDsgayA8IHNpemU7IGsgKz0gMSkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNpemU7IGkgKz0gMSkge1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBzaXplOyBqICs9IDEpIHtcbiAgICAgICAgICAgICAgICBpZiAoZGlzdFtpXVtqXSA+IGRpc3RbaV1ba10gKyBkaXN0W2tdW2pdKSB7XG4gICAgICAgICAgICAgICAgICAgIGRpc3RbaV1bal0gPSBkaXN0W2ldW2tdICsgZGlzdFtrXVtqXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRpc3Q7XG59O1xuZXhwb3J0IGNvbnN0IGdldEFkak1hdHJpeCA9IChkYXRhLCBkaXJlY3RlZCkgPT4ge1xuICAgIGNvbnN0IHsgbm9kZXMsIGVkZ2VzIH0gPSBkYXRhO1xuICAgIGNvbnN0IG1hdHJpeCA9IFtdO1xuICAgIC8vIG1hcCBub2RlIHdpdGggaW5kZXggaW4gZGF0YS5ub2Rlc1xuICAgIGNvbnN0IG5vZGVNYXAgPSB7fTtcbiAgICBpZiAoIW5vZGVzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBub2RlcyBkYXRhIScpO1xuICAgIH1cbiAgICBpZiAobm9kZXMpIHtcbiAgICAgICAgbm9kZXMuZm9yRWFjaCgobm9kZSwgaSkgPT4ge1xuICAgICAgICAgICAgbm9kZU1hcFtub2RlLmlkXSA9IGk7XG4gICAgICAgICAgICBjb25zdCByb3cgPSBbXTtcbiAgICAgICAgICAgIG1hdHJpeC5wdXNoKHJvdyk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoZWRnZXMpIHtcbiAgICAgICAgZWRnZXMuZm9yRWFjaCgoZSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc291cmNlID0gZ2V0RWRnZVRlcm1pbmFsKGUsICdzb3VyY2UnKTtcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGdldEVkZ2VUZXJtaW5hbChlLCAndGFyZ2V0Jyk7XG4gICAgICAgICAgICBjb25zdCBzSW5kZXggPSBub2RlTWFwW3NvdXJjZV07XG4gICAgICAgICAgICBjb25zdCB0SW5kZXggPSBub2RlTWFwW3RhcmdldF07XG4gICAgICAgICAgICBtYXRyaXhbc0luZGV4XVt0SW5kZXhdID0gMTtcbiAgICAgICAgICAgIGlmICghZGlyZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICBtYXRyaXhbdEluZGV4XVtzSW5kZXhdID0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBtYXRyaXg7XG59O1xuLyoqXG4gKiBzY2FsZSBtYXRyaXhcbiAqIEBwYXJhbSBtYXRyaXggWyBbXSwgW10sIFtdIF1cbiAqIEBwYXJhbSByYXRpb1xuICovXG5leHBvcnQgY29uc3Qgc2NhbGVNYXRyaXggPSAobWF0cml4LCByYXRpbykgPT4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgIG1hdHJpeC5mb3JFYWNoKChyb3cpID0+IHtcbiAgICAgICAgY29uc3QgbmV3Um93ID0gW107XG4gICAgICAgIHJvdy5mb3JFYWNoKCh2KSA9PiB7XG4gICAgICAgICAgICBuZXdSb3cucHVzaCh2ICogcmF0aW8pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmVzdWx0LnB1c2gobmV3Um93KTtcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbi8qKlxuICogZGVwdGggZmlyc3QgdHJhdmVyc2UsIGZyb20gbGVhdmVzIHRvIHJvb3QsIGNoaWxkcmVuIGluIGludmVyc2Ugb3JkZXJcbiAqICBpZiB0aGUgZm4gcmV0dXJucyBmYWxzZSwgdGVybWluYXRlIHRoZSB0cmF2ZXJzZVxuICovXG5jb25zdCB0cmF2ZXJzZVVwID0gKGRhdGEsIGZuKSA9PiB7XG4gICAgaWYgKGRhdGEgJiYgZGF0YS5jaGlsZHJlbikge1xuICAgICAgICBmb3IgKGxldCBpID0gZGF0YS5jaGlsZHJlbi5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgaWYgKCF0cmF2ZXJzZVVwKGRhdGEuY2hpbGRyZW5baV0sIGZuKSlcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFmbihkYXRhKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufTtcbi8qKlxuICogZGVwdGggZmlyc3QgdHJhdmVyc2UsIGZyb20gbGVhdmVzIHRvIHJvb3QsIGNoaWxkcmVuIGluIGludmVyc2Ugb3JkZXJcbiAqIGlmIHRoZSBmbiByZXR1cm5zIGZhbHNlLCB0ZXJtaW5hdGUgdGhlIHRyYXZlcnNlXG4gKi9cbmV4cG9ydCBjb25zdCB0cmF2ZXJzZVRyZWVVcCA9IChkYXRhLCBmbikgPT4ge1xuICAgIGlmICh0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0cmF2ZXJzZVVwKGRhdGEsIGZuKTtcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tYXRoLmpzLm1hcCIsImV4cG9ydCBjb25zdCBpc0Z1bmN0aW9uID0gKHZhbCkgPT4gdHlwZW9mIHZhbCA9PT0gJ2Z1bmN0aW9uJztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWZ1bmN0aW9uLmpzLm1hcCIsImV4cG9ydCAqIGZyb20gJy4vc3RyaW5nJztcbmV4cG9ydCAqIGZyb20gJy4vYXJyYXknO1xuZXhwb3J0ICogZnJvbSAnLi9udW1iZXInO1xuZXhwb3J0ICogZnJvbSAnLi9tYXRoJztcbmV4cG9ydCAqIGZyb20gJy4vb2JqZWN0JztcbmV4cG9ydCAqIGZyb20gJy4vZnVuY3Rpb24nO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiaW1wb3J0IHsgQmFzZSB9IGZyb20gXCIuLi9sYXlvdXQvYmFzZVwiO1xuaW1wb3J0IHsgaXNPYmplY3QgfSBmcm9tIFwiLi4vdXRpbFwiO1xuY29uc3QgbWFwID0gbmV3IE1hcCgpO1xuZXhwb3J0IGNvbnN0IHJlZ2lzdGVyTGF5b3V0ID0gKG5hbWUsIGxheW91dE92ZXJyaWRlKSA9PiB7XG4gICAgaWYgKG1hcC5nZXQobmFtZSkpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBUaGUgbGF5b3V0IHdpdGggdGhlIG5hbWUgJHtuYW1lfSBleGlzdHMgYWxyZWFkeSwgaXQgd2lsbCBiZSBvdmVycmlkZGVuYCk7XG4gICAgfVxuICAgIGlmIChpc09iamVjdChsYXlvdXRPdmVycmlkZSkpIHtcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtYXgtY2xhc3Nlcy1wZXItZmlsZVxuICAgICAgICBjbGFzcyBHTGF5b3V0IGV4dGVuZHMgQmFzZSB7XG4gICAgICAgICAgICBjb25zdHJ1Y3RvcihjZmcpIHtcbiAgICAgICAgICAgICAgICBzdXBlcigpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgICAgICAgICAgICAgIGNvbnN0IHByb3BzID0ge307XG4gICAgICAgICAgICAgICAgY29uc3QgZGVmYXVsdENmZyA9IHNlbGYuZ2V0RGVmYXVsdENmZygpO1xuICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24ocHJvcHMsIGRlZmF1bHRDZmcsIGxheW91dE92ZXJyaWRlLCBjZmcpO1xuICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKHByb3BzKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBwcm9wc1trZXldO1xuICAgICAgICAgICAgICAgICAgICBzZWxmW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBtYXAuc2V0KG5hbWUsIEdMYXlvdXQpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgbWFwLnNldChuYW1lLCBsYXlvdXRPdmVycmlkZSk7XG4gICAgfVxuICAgIHJldHVybiBtYXAuZ2V0KG5hbWUpO1xufTtcbmV4cG9ydCBjb25zdCB1blJlZ2lzdGVyTGF5b3V0ID0gKG5hbWUpID0+IHtcbiAgICBpZiAobWFwLmhhcyhuYW1lKSkge1xuICAgICAgICBtYXAuZGVsZXRlKG5hbWUpO1xuICAgIH1cbn07XG5leHBvcnQgY29uc3QgZ2V0TGF5b3V0QnlOYW1lID0gKG5hbWUpID0+IHtcbiAgICBpZiAobWFwLmhhcyhuYW1lKSkge1xuICAgICAgICByZXR1cm4gbWFwLmdldChuYW1lKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiLyoqXG4gKiBAZmlsZU92ZXJ2aWV3IGdyaWQgbGF5b3V0XG4gKiBAYXV0aG9yIHNoaXd1Lnd5eUBhbnRmaW4uY29tXG4gKiB0aGlzIGFsZ29yaXRobSByZWZlcnMgdG8gPGN5dG9zY2FwZS5qcz4gLSBodHRwczovL2dpdGh1Yi5jb20vY3l0b3NjYXBlL2N5dG9zY2FwZS5qcy9cbiAqL1xuaW1wb3J0IHsgaXNTdHJpbmcsIGlzQXJyYXksIGlzTnVtYmVyLCBnZXREZWdyZWUsIGlzTmFOLCBpc09iamVjdCB9IGZyb20gXCIuLi91dGlsXCI7XG5pbXBvcnQgeyBCYXNlIH0gZnJvbSBcIi4vYmFzZVwiO1xuLyoqXG4gKiDnvZHmoLzluIPlsYBcbiAqL1xuZXhwb3J0IGNsYXNzIEdyaWRMYXlvdXQgZXh0ZW5kcyBCYXNlIHtcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIC8qKiDluIPlsYDotbflp4vngrkgKi9cbiAgICAgICAgdGhpcy5iZWdpbiA9IFswLCAwXTtcbiAgICAgICAgLyoqIHByZXZlbnRzIG5vZGUgb3ZlcmxhcCwgbWF5IG92ZXJmbG93IGJvdW5kaW5nQm94IGlmIG5vdCBlbm91Z2ggc3BhY2UgKi9cbiAgICAgICAgdGhpcy5wcmV2ZW50T3ZlcmxhcCA9IHRydWU7XG4gICAgICAgIC8qKiBleHRyYSBzcGFjaW5nIGFyb3VuZCBub2RlcyB3aGVuIHByZXZlbnRPdmVybGFwOiB0cnVlICovXG4gICAgICAgIHRoaXMucHJldmVudE92ZXJsYXBQYWRkaW5nID0gMTA7XG4gICAgICAgIC8qKiB1c2VzIGFsbCBhdmFpbGFibGUgc3BhY2Ugb24gZmFsc2UsIHVzZXMgbWluaW1hbCBzcGFjZSBvbiB0cnVlICovXG4gICAgICAgIHRoaXMuY29uZGVuc2UgPSBmYWxzZTtcbiAgICAgICAgLyoqIGEgc29ydGluZyBmdW5jdGlvbiB0byBvcmRlciB0aGUgbm9kZXM7IGUuZy4gZnVuY3Rpb24oYSwgYil7IHJldHVybiBhLmRhdGFwdWJsaWMgKCd3ZWlnaHQnKSAtIGIuZGF0YSgnd2VpZ2h0JykgfSAqL1xuICAgICAgICB0aGlzLnNvcnRCeSA9IFwiZGVncmVlXCI7XG4gICAgICAgIHRoaXMubm9kZVNpemUgPSAzMDtcbiAgICAgICAgdGhpcy5ub2RlcyA9IFtdO1xuICAgICAgICB0aGlzLmVkZ2VzID0gW107XG4gICAgICAgIHRoaXMud2lkdGggPSAzMDA7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gMzAwO1xuICAgICAgICB0aGlzLnJvdyA9IDA7XG4gICAgICAgIHRoaXMuY29sID0gMDtcbiAgICAgICAgdGhpcy5jZWxsV2lkdGggPSAwO1xuICAgICAgICB0aGlzLmNlbGxIZWlnaHQgPSAwO1xuICAgICAgICB0aGlzLmNlbGxVc2VkID0ge307XG4gICAgICAgIHRoaXMuaWQybWFuUG9zID0ge307XG4gICAgICAgIC8qKiDov63ku6Pnu5PmnZ/nmoTlm57osIPlh73mlbAgKi9cbiAgICAgICAgdGhpcy5vbkxheW91dEVuZCA9ICgpID0+IHsgfTtcbiAgICAgICAgdGhpcy51cGRhdGVDZmcob3B0aW9ucyk7XG4gICAgfVxuICAgIGdldERlZmF1bHRDZmcoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBiZWdpbjogWzAsIDBdLFxuICAgICAgICAgICAgcHJldmVudE92ZXJsYXA6IHRydWUsXG4gICAgICAgICAgICBwcmV2ZW50T3ZlcmxhcFBhZGRpbmc6IDEwLFxuICAgICAgICAgICAgY29uZGVuc2U6IGZhbHNlLFxuICAgICAgICAgICAgcm93czogdW5kZWZpbmVkLFxuICAgICAgICAgICAgY29sczogdW5kZWZpbmVkLFxuICAgICAgICAgICAgcG9zaXRpb246IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHNvcnRCeTogXCJkZWdyZWVcIixcbiAgICAgICAgICAgIG5vZGVTaXplOiAzMFxuICAgICAgICB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiDmiafooYzluIPlsYBcbiAgICAgKi9cbiAgICBleGVjdXRlKCkge1xuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAgICAgY29uc3Qgbm9kZXMgPSBzZWxmLm5vZGVzO1xuICAgICAgICBjb25zdCBlZGdlcyA9IHNlbGYuZWRnZXM7XG4gICAgICAgIGNvbnN0IG4gPSBub2Rlcy5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGJlZ2luID0gc2VsZi5iZWdpbjtcbiAgICAgICAgaWYgKG4gPT09IDApIHtcbiAgICAgICAgICAgIGlmIChzZWxmLm9uTGF5b3V0RW5kKVxuICAgICAgICAgICAgICAgIHNlbGYub25MYXlvdXRFbmQoKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbm9kZXMsXG4gICAgICAgICAgICAgICAgZWRnZXNcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG4gPT09IDEpIHtcbiAgICAgICAgICAgIG5vZGVzWzBdLnggPSBiZWdpblswXTtcbiAgICAgICAgICAgIG5vZGVzWzBdLnkgPSBiZWdpblsxXTtcbiAgICAgICAgICAgIGlmIChzZWxmLm9uTGF5b3V0RW5kKVxuICAgICAgICAgICAgICAgIHNlbGYub25MYXlvdXRFbmQoKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbm9kZXMsXG4gICAgICAgICAgICAgICAgZWRnZXMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxheW91dE5vZGVzID0gW107XG4gICAgICAgIG5vZGVzLmZvckVhY2goKG5vZGUpID0+IHtcbiAgICAgICAgICAgIGxheW91dE5vZGVzLnB1c2gobm9kZSk7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBub2RlSWR4TWFwID0ge307XG4gICAgICAgIGxheW91dE5vZGVzLmZvckVhY2goKG5vZGUsIGkpID0+IHtcbiAgICAgICAgICAgIG5vZGVJZHhNYXBbbm9kZS5pZF0gPSBpO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHNlbGYuc29ydEJ5ID09PSBcImRlZ3JlZVwiIHx8XG4gICAgICAgICAgICAhaXNTdHJpbmcoc2VsZi5zb3J0QnkpIHx8XG4gICAgICAgICAgICBsYXlvdXROb2Rlc1swXVtzZWxmLnNvcnRCeV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgc2VsZi5zb3J0QnkgPSBcImRlZ3JlZVwiO1xuICAgICAgICAgICAgaWYgKGlzTmFOKG5vZGVzWzBdLmRlZ3JlZSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZXMgPSBnZXREZWdyZWUobGF5b3V0Tm9kZXMubGVuZ3RoLCBub2RlSWR4TWFwLCBlZGdlcyk7XG4gICAgICAgICAgICAgICAgbGF5b3V0Tm9kZXMuZm9yRWFjaCgobm9kZSwgaSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBub2RlLmRlZ3JlZSA9IHZhbHVlc1tpXTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBzb3J0IG5vZGVzIGJ5IHZhbHVlXG4gICAgICAgIGxheW91dE5vZGVzLnNvcnQoKG4xLCBuMikgPT4gbjJbc2VsZi5zb3J0QnldIC0gbjFbc2VsZi5zb3J0QnldKTtcbiAgICAgICAgaWYgKCFzZWxmLndpZHRoICYmIHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIHNlbGYud2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXNlbGYuaGVpZ2h0ICYmIHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIHNlbGYuaGVpZ2h0ID0gd2luZG93LmlubmVySGVpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG9Sb3dzID0gc2VsZi5yb3dzO1xuICAgICAgICBjb25zdCBvQ29scyA9IHNlbGYuY29scyAhPSBudWxsID8gc2VsZi5jb2xzIDogc2VsZi5jb2x1bW5zO1xuICAgICAgICBzZWxmLmNlbGxzID0gbjtcbiAgICAgICAgLy8gaWYgcm93cyBvciBjb2x1bW5zIHdlcmUgc2V0IGluIHNlbGYsIHVzZSB0aG9zZSB2YWx1ZXNcbiAgICAgICAgaWYgKG9Sb3dzICE9IG51bGwgJiYgb0NvbHMgIT0gbnVsbCkge1xuICAgICAgICAgICAgc2VsZi5yb3dzID0gb1Jvd3M7XG4gICAgICAgICAgICBzZWxmLmNvbHMgPSBvQ29scztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChvUm93cyAhPSBudWxsICYmIG9Db2xzID09IG51bGwpIHtcbiAgICAgICAgICAgIHNlbGYucm93cyA9IG9Sb3dzO1xuICAgICAgICAgICAgc2VsZi5jb2xzID0gTWF0aC5jZWlsKHNlbGYuY2VsbHMgLyBzZWxmLnJvd3MpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG9Sb3dzID09IG51bGwgJiYgb0NvbHMgIT0gbnVsbCkge1xuICAgICAgICAgICAgc2VsZi5jb2xzID0gb0NvbHM7XG4gICAgICAgICAgICBzZWxmLnJvd3MgPSBNYXRoLmNlaWwoc2VsZi5jZWxscyAvIHNlbGYuY29scyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBvdGhlcndpc2UgdXNlIHRoZSBhdXRvbWF0aWMgdmFsdWVzIGFuZCBhZGp1c3QgYWNjb3JkaW5nbHlcdCAgICAgIC8vIG90aGVyd2lzZSB1c2UgdGhlIGF1dG9tYXRpYyB2YWx1ZXMgYW5kIGFkanVzdCBhY2NvcmRpbmdseVxuICAgICAgICAgICAgLy8gd2lkdGgvaGVpZ2h0ICogc3BsaXRzXjIgPSBjZWxscyB3aGVyZSBzcGxpdHMgaXMgbnVtYmVyIG9mIHRpbWVzIHRvIHNwbGl0IHdpZHRoXG4gICAgICAgICAgICBzZWxmLnNwbGl0cyA9IE1hdGguc3FydCgoc2VsZi5jZWxscyAqIHNlbGYuaGVpZ2h0KSAvIHNlbGYud2lkdGgpO1xuICAgICAgICAgICAgc2VsZi5yb3dzID0gTWF0aC5yb3VuZChzZWxmLnNwbGl0cyk7XG4gICAgICAgICAgICBzZWxmLmNvbHMgPSBNYXRoLnJvdW5kKChzZWxmLndpZHRoIC8gc2VsZi5oZWlnaHQpICogc2VsZi5zcGxpdHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzZWxmLmNvbHMgKiBzZWxmLnJvd3MgPiBzZWxmLmNlbGxzKSB7XG4gICAgICAgICAgICAvLyBvdGhlcndpc2UgdXNlIHRoZSBhdXRvbWF0aWMgdmFsdWVzIGFuZCBhZGp1c3QgYWNjb3JkaW5nbHlcbiAgICAgICAgICAgIC8vIGlmIHJvdW5kaW5nIHdhcyB1cCwgc2VlIGlmIHdlIGNhbiByZWR1Y2Ugcm93cyBvciBjb2x1bW5zXG4gICAgICAgICAgICBjb25zdCBzbSA9IHNlbGYuc21hbGwoKTtcbiAgICAgICAgICAgIGNvbnN0IGxnID0gc2VsZi5sYXJnZSgpO1xuICAgICAgICAgICAgLy8gcmVkdWNpbmcgdGhlIHNtYWxsIHNpZGUgdGFrZXMgYXdheSB0aGUgbW9zdCBjZWxscywgc28gdHJ5IGl0IGZpcnN0XG4gICAgICAgICAgICBpZiAoKHNtIC0gMSkgKiBsZyA+PSBzZWxmLmNlbGxzKSB7XG4gICAgICAgICAgICAgICAgc2VsZi5zbWFsbChzbSAtIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoKGxnIC0gMSkgKiBzbSA+PSBzZWxmLmNlbGxzKSB7XG4gICAgICAgICAgICAgICAgc2VsZi5sYXJnZShsZyAtIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gaWYgcm91bmRpbmcgd2FzIHRvbyBsb3csIGFkZCByb3dzIG9yIGNvbHVtbnNcbiAgICAgICAgICAgIHdoaWxlIChzZWxmLmNvbHMgKiBzZWxmLnJvd3MgPCBzZWxmLmNlbGxzKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc20gPSBzZWxmLnNtYWxsKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgbGcgPSBzZWxmLmxhcmdlKCk7XG4gICAgICAgICAgICAgICAgLy8gdHJ5IHRvIGFkZCB0byBsYXJnZXIgc2lkZSBmaXJzdCAoYWRkcyBsZXNzIGluIG11bHRpcGxpY2F0aW9uKVxuICAgICAgICAgICAgICAgIGlmICgobGcgKyAxKSAqIHNtID49IHNlbGYuY2VsbHMpIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5sYXJnZShsZyArIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5zbWFsbChzbSArIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzZWxmLmNlbGxXaWR0aCA9IHNlbGYud2lkdGggLyBzZWxmLmNvbHM7XG4gICAgICAgIHNlbGYuY2VsbEhlaWdodCA9IHNlbGYuaGVpZ2h0IC8gc2VsZi5yb3dzO1xuICAgICAgICBpZiAoc2VsZi5jb25kZW5zZSkge1xuICAgICAgICAgICAgc2VsZi5jZWxsV2lkdGggPSAwO1xuICAgICAgICAgICAgc2VsZi5jZWxsSGVpZ2h0ID0gMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2VsZi5wcmV2ZW50T3ZlcmxhcCkge1xuICAgICAgICAgICAgbGF5b3V0Tm9kZXMuZm9yRWFjaCgobm9kZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghbm9kZS54IHx8ICFub2RlLnkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZm9yIGJiXG4gICAgICAgICAgICAgICAgICAgIG5vZGUueCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIG5vZGUueSA9IDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBub2RldztcbiAgICAgICAgICAgICAgICBsZXQgbm9kZWg7XG4gICAgICAgICAgICAgICAgaWYgKGlzQXJyYXkobm9kZS5zaXplKSkge1xuICAgICAgICAgICAgICAgICAgICBub2RldyA9IG5vZGUuc2l6ZVswXTtcbiAgICAgICAgICAgICAgICAgICAgbm9kZWggPSBub2RlLnNpemVbMV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlzTnVtYmVyKG5vZGUuc2l6ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZXcgPSBub2RlLnNpemU7XG4gICAgICAgICAgICAgICAgICAgIG5vZGVoID0gbm9kZS5zaXplO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChpc09iamVjdChub2RlLnNpemUpKSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGV3ID0gbm9kZS5zaXplLndpZHRoO1xuICAgICAgICAgICAgICAgICAgICBub2RlaCA9IG5vZGUuc2l6ZS5oZWlnaHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChub2RldyA9PT0gdW5kZWZpbmVkIHx8IG5vZGVoID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzQXJyYXkoc2VsZi5ub2RlU2l6ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGV3ID0gc2VsZi5ub2RlU2l6ZVswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVoID0gc2VsZi5ub2RlU2l6ZVsxXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpc051bWJlcihzZWxmLm5vZGVTaXplKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZXcgPSBzZWxmLm5vZGVTaXplO1xuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZWggPSBzZWxmLm5vZGVTaXplO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZXcgPSAzMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVoID0gMzA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcCA9IHNlbGYucHJldmVudE92ZXJsYXBQYWRkaW5nO1xuICAgICAgICAgICAgICAgIGNvbnN0IHcgPSBub2RldyArIHA7XG4gICAgICAgICAgICAgICAgY29uc3QgaCA9IG5vZGVoICsgcDtcbiAgICAgICAgICAgICAgICBzZWxmLmNlbGxXaWR0aCA9IE1hdGgubWF4KHNlbGYuY2VsbFdpZHRoLCB3KTtcbiAgICAgICAgICAgICAgICBzZWxmLmNlbGxIZWlnaHQgPSBNYXRoLm1heChzZWxmLmNlbGxIZWlnaHQsIGgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgc2VsZi5jZWxsVXNlZCA9IHt9OyAvLyBlLmcuICdjLTAtMicgPT4gdHJ1ZVxuICAgICAgICAvLyB0byBrZWVwIHRyYWNrIG9mIGN1cnJlbnQgY2VsbCBwb3NpdGlvblxuICAgICAgICBzZWxmLnJvdyA9IDA7XG4gICAgICAgIHNlbGYuY29sID0gMDtcbiAgICAgICAgLy8gZ2V0IGEgY2FjaGUgb2YgYWxsIHRoZSBtYW51YWwgcG9zaXRpb25zXG4gICAgICAgIHNlbGYuaWQybWFuUG9zID0ge307XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGF5b3V0Tm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBsYXlvdXROb2Rlc1tpXTtcbiAgICAgICAgICAgIGxldCByY1BvcztcbiAgICAgICAgICAgIGlmIChzZWxmLnBvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgcmNQb3MgPSBzZWxmLnBvc2l0aW9uKG5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJjUG9zICYmIChyY1Bvcy5yb3cgIT09IHVuZGVmaW5lZCB8fCByY1Bvcy5jb2wgIT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgICAgICAgICAvLyBtdXN0IGhhdmUgYXQgbGVhc3Qgcm93IG9yIGNvbCBkZWYnZFxuICAgICAgICAgICAgICAgIGNvbnN0IHBvcyA9IHtcbiAgICAgICAgICAgICAgICAgICAgcm93OiByY1Bvcy5yb3csXG4gICAgICAgICAgICAgICAgICAgIGNvbDogcmNQb3MuY29sXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBpZiAocG9zLmNvbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgdW51c2VkIGNvbFxuICAgICAgICAgICAgICAgICAgICBwb3MuY29sID0gMDtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHNlbGYudXNlZChwb3Mucm93LCBwb3MuY29sKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcG9zLmNvbCsrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBvcy5yb3cgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBmaW5kIHVudXNlZCByb3dcbiAgICAgICAgICAgICAgICAgICAgcG9zLnJvdyA9IDA7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChzZWxmLnVzZWQocG9zLnJvdywgcG9zLmNvbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvcy5yb3crKztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzZWxmLmlkMm1hblBvc1tub2RlLmlkXSA9IHBvcztcbiAgICAgICAgICAgICAgICBzZWxmLnVzZShwb3Mucm93LCBwb3MuY29sKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNlbGYuZ2V0UG9zKG5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzZWxmLm9uTGF5b3V0RW5kKVxuICAgICAgICAgICAgc2VsZi5vbkxheW91dEVuZCgpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZWRnZXMsXG4gICAgICAgICAgICBub2RlczogbGF5b3V0Tm9kZXNcbiAgICAgICAgfTtcbiAgICB9XG4gICAgc21hbGwodmFsKSB7XG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgICAgICBsZXQgcmVzO1xuICAgICAgICBjb25zdCByb3dzID0gc2VsZi5yb3dzIHx8IDU7XG4gICAgICAgIGNvbnN0IGNvbHMgPSBzZWxmLmNvbHMgfHwgNTtcbiAgICAgICAgaWYgKHZhbCA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXMgPSBNYXRoLm1pbihyb3dzLCBjb2xzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IG1pbiA9IE1hdGgubWluKHJvd3MsIGNvbHMpO1xuICAgICAgICAgICAgaWYgKG1pbiA9PT0gc2VsZi5yb3dzKSB7XG4gICAgICAgICAgICAgICAgc2VsZi5yb3dzID0gdmFsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgc2VsZi5jb2xzID0gdmFsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuICAgIGxhcmdlKHZhbCkge1xuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAgICAgbGV0IHJlcztcbiAgICAgICAgY29uc3Qgcm93cyA9IHNlbGYucm93cyB8fCA1O1xuICAgICAgICBjb25zdCBjb2xzID0gc2VsZi5jb2xzIHx8IDU7XG4gICAgICAgIGlmICh2YWwgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmVzID0gTWF0aC5tYXgocm93cywgY29scyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBtYXggPSBNYXRoLm1heChyb3dzLCBjb2xzKTtcbiAgICAgICAgICAgIGlmIChtYXggPT09IHNlbGYucm93cykge1xuICAgICAgICAgICAgICAgIHNlbGYucm93cyA9IHZhbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHNlbGYuY29scyA9IHZhbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cbiAgICB1c2VkKHJvdywgY29sKSB7XG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgICAgICByZXR1cm4gc2VsZi5jZWxsVXNlZFtgYy0ke3Jvd30tJHtjb2x9YF0gfHwgZmFsc2U7XG4gICAgfVxuICAgIHVzZShyb3csIGNvbCkge1xuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAgICAgc2VsZi5jZWxsVXNlZFtgYy0ke3Jvd30tJHtjb2x9YF0gPSB0cnVlO1xuICAgIH1cbiAgICBtb3ZlVG9OZXh0Q2VsbCgpIHtcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICAgIGNvbnN0IGNvbHMgPSBzZWxmLmNvbHMgfHwgNTtcbiAgICAgICAgc2VsZi5jb2wrKztcbiAgICAgICAgaWYgKHNlbGYuY29sID49IGNvbHMpIHtcbiAgICAgICAgICAgIHNlbGYuY29sID0gMDtcbiAgICAgICAgICAgIHNlbGYucm93Kys7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0UG9zKG5vZGUpIHtcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICAgIGNvbnN0IGJlZ2luID0gc2VsZi5iZWdpbjtcbiAgICAgICAgY29uc3QgY2VsbFdpZHRoID0gc2VsZi5jZWxsV2lkdGg7XG4gICAgICAgIGNvbnN0IGNlbGxIZWlnaHQgPSBzZWxmLmNlbGxIZWlnaHQ7XG4gICAgICAgIGxldCB4O1xuICAgICAgICBsZXQgeTtcbiAgICAgICAgLy8gc2VlIGlmIHdlIGhhdmUgYSBtYW51YWwgcG9zaXRpb24gc2V0XG4gICAgICAgIGNvbnN0IHJjUG9zID0gc2VsZi5pZDJtYW5Qb3Nbbm9kZS5pZF07XG4gICAgICAgIGlmIChyY1Bvcykge1xuICAgICAgICAgICAgeCA9IHJjUG9zLmNvbCAqIGNlbGxXaWR0aCArIGNlbGxXaWR0aCAvIDIgKyBiZWdpblswXTtcbiAgICAgICAgICAgIHkgPSByY1Bvcy5yb3cgKiBjZWxsSGVpZ2h0ICsgY2VsbEhlaWdodCAvIDIgKyBiZWdpblsxXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIG90aGVyd2lzZSBzZXQgYXV0b21hdGljYWxseVxuICAgICAgICAgICAgd2hpbGUgKHNlbGYudXNlZChzZWxmLnJvdywgc2VsZi5jb2wpKSB7XG4gICAgICAgICAgICAgICAgc2VsZi5tb3ZlVG9OZXh0Q2VsbCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgeCA9IHNlbGYuY29sICogY2VsbFdpZHRoICsgY2VsbFdpZHRoIC8gMiArIGJlZ2luWzBdO1xuICAgICAgICAgICAgeSA9IHNlbGYucm93ICogY2VsbEhlaWdodCArIGNlbGxIZWlnaHQgLyAyICsgYmVnaW5bMV07XG4gICAgICAgICAgICBzZWxmLnVzZShzZWxmLnJvdywgc2VsZi5jb2wpO1xuICAgICAgICAgICAgc2VsZi5tb3ZlVG9OZXh0Q2VsbCgpO1xuICAgICAgICB9XG4gICAgICAgIG5vZGUueCA9IHg7XG4gICAgICAgIG5vZGUueSA9IHk7XG4gICAgfVxuICAgIGdldFR5cGUoKSB7XG4gICAgICAgIHJldHVybiBcImdyaWRcIjtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1ncmlkLmpzLm1hcCIsIi8qKlxuICogQGZpbGVPdmVydmlldyByYW5kb20gbGF5b3V0XG4gKiBAYXV0aG9yIHNoaXd1Lnd5eUBhbnRmaW4uY29tXG4gKi9cbmltcG9ydCB7IEJhc2UgfSBmcm9tIFwiLi9iYXNlXCI7XG4vKipcbiAqIOmaj+acuuW4g+WxgFxuICovXG5leHBvcnQgY2xhc3MgUmFuZG9tTGF5b3V0IGV4dGVuZHMgQmFzZSB7XG4gICAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICAvKiog5biD5bGA5Lit5b+DICovXG4gICAgICAgIHRoaXMuY2VudGVyID0gWzAsIDBdO1xuICAgICAgICAvKiog5a695bqmICovXG4gICAgICAgIHRoaXMud2lkdGggPSAzMDA7XG4gICAgICAgIC8qKiDpq5jluqYgKi9cbiAgICAgICAgdGhpcy5oZWlnaHQgPSAzMDA7XG4gICAgICAgIHRoaXMubm9kZXMgPSBbXTtcbiAgICAgICAgdGhpcy5lZGdlcyA9IFtdO1xuICAgICAgICAvKiog6L+t5Luj57uT5p2f55qE5Zue6LCD5Ye95pWwICovXG4gICAgICAgIHRoaXMub25MYXlvdXRFbmQgPSAoKSA9PiB7IH07XG4gICAgICAgIHRoaXMudXBkYXRlQ2ZnKG9wdGlvbnMpO1xuICAgIH1cbiAgICBnZXREZWZhdWx0Q2ZnKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY2VudGVyOiBbMCwgMF0sXG4gICAgICAgICAgICB3aWR0aDogMzAwLFxuICAgICAgICAgICAgaGVpZ2h0OiAzMDBcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICog5omn6KGM5biD5bGAXG4gICAgICovXG4gICAgZXhlY3V0ZSgpIHtcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICAgIGNvbnN0IG5vZGVzID0gc2VsZi5ub2RlcztcbiAgICAgICAgY29uc3QgbGF5b3V0U2NhbGUgPSAwLjk7XG4gICAgICAgIGNvbnN0IGNlbnRlciA9IHNlbGYuY2VudGVyO1xuICAgICAgICBpZiAoIXNlbGYud2lkdGggJiYgdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgc2VsZi53aWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoO1xuICAgICAgICB9XG4gICAgICAgIGlmICghc2VsZi5oZWlnaHQgJiYgdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgc2VsZi5oZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGVzKSB7XG4gICAgICAgICAgICBub2Rlcy5mb3JFYWNoKChub2RlKSA9PiB7XG4gICAgICAgICAgICAgICAgbm9kZS54ID0gKE1hdGgucmFuZG9tKCkgLSAwLjUpICogbGF5b3V0U2NhbGUgKiBzZWxmLndpZHRoICsgY2VudGVyWzBdO1xuICAgICAgICAgICAgICAgIG5vZGUueSA9IChNYXRoLnJhbmRvbSgpIC0gMC41KSAqIGxheW91dFNjYWxlICogc2VsZi5oZWlnaHQgKyBjZW50ZXJbMV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2VsZi5vbkxheW91dEVuZClcbiAgICAgICAgICAgIHNlbGYub25MYXlvdXRFbmQoKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5vZGVzLFxuICAgICAgICAgICAgZWRnZXM6IHRoaXMuZWRnZXNcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZ2V0VHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIFwicmFuZG9tXCI7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmFuZG9tLmpzLm1hcCIsIi8qKlxuICogQGZpbGVPdmVydmlldyBmcnVjaHRlcm1hbiBsYXlvdXRcbiAqIEBhdXRob3Igc2hpd3Uud3l5QGFudGZpbi5jb21cbiAqL1xuaW1wb3J0IHsgQmFzZSB9IGZyb20gXCIuL2Jhc2VcIjtcbmltcG9ydCB7IGlzTnVtYmVyLCBpc0Z1bmN0aW9uLCBpc0FycmF5LCBnZXREZWdyZWUsIGlzT2JqZWN0LCBnZXRFZGdlVGVybWluYWwgfSBmcm9tIFwiLi4vdXRpbFwiO1xuY29uc3QgcHJvY2Nlc3NUb0Z1bmMgPSAodmFsdWUsIGRlZmF1bHRWKSA9PiB7XG4gICAgbGV0IGZ1bmM7XG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICBmdW5jID0gKGQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBkZWZhdWx0ViB8fCAxO1xuICAgICAgICB9O1xuICAgIH1cbiAgICBlbHNlIGlmIChpc051bWJlcih2YWx1ZSkpIHtcbiAgICAgICAgZnVuYyA9IChkKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBmdW5jID0gdmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBmdW5jO1xufTtcbi8qKlxuICogZ3JhcGhpbiDkuK3nmoQgZm9yY2Ug5biD5bGAXG4gKi9cbmV4cG9ydCBjbGFzcyBHRm9yY2VMYXlvdXQgZXh0ZW5kcyBCYXNlIHtcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIC8qKiDlgZzmraLov63ku6PnmoTmnIDlpKfov63ku6PmlbAgKi9cbiAgICAgICAgdGhpcy5tYXhJdGVyYXRpb24gPSAxMDAwO1xuICAgICAgICAvKiog5piv5ZCm5ZCv5YqoIHdvcmtlciAqL1xuICAgICAgICB0aGlzLndvcmtlckVuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgLyoqIOW8ueewp+W8leWKm+ezu+aVsCAqL1xuICAgICAgICB0aGlzLmVkZ2VTdHJlbmd0aCA9IDIwMDtcbiAgICAgICAgLyoqIOaWpeWKm+ezu+aVsCAqL1xuICAgICAgICB0aGlzLm5vZGVTdHJlbmd0aCA9IDEwMDA7XG4gICAgICAgIC8qKiDlupPkvKbns7vmlbAgKi9cbiAgICAgICAgdGhpcy5jb3Vsb21iRGlzU2NhbGUgPSAwLjAwNTtcbiAgICAgICAgLyoqIOmYu+WwvOezu+aVsCAqL1xuICAgICAgICB0aGlzLmRhbXBpbmcgPSAwLjk7XG4gICAgICAgIC8qKiDmnIDlpKfpgJ/luqYgKi9cbiAgICAgICAgdGhpcy5tYXhTcGVlZCA9IDEwMDA7XG4gICAgICAgIC8qKiDkuIDmrKHov63ku6PnmoTlubPlnYfnp7vliqjot53nprvlsI/kuo7or6XlgLzml7blgZzmraLov63ku6MgKi9cbiAgICAgICAgdGhpcy5taW5Nb3ZlbWVudCA9IDAuNTtcbiAgICAgICAgLyoqIOi/reS7o+S4reihsOWHjyAqL1xuICAgICAgICB0aGlzLmludGVydmFsID0gMC4wMjtcbiAgICAgICAgLyoqIOaWpeWKm+eahOS4gOS4quezu+aVsCAqL1xuICAgICAgICB0aGlzLmZhY3RvciA9IDE7XG4gICAgICAgIC8qKiDnkIbmg7Povrnplb8gKi9cbiAgICAgICAgdGhpcy5saW5rRGlzdGFuY2UgPSAxO1xuICAgICAgICAvKiog6YeN5Yqb5aSn5bCPICovXG4gICAgICAgIHRoaXMuZ3Jhdml0eSA9IDEwO1xuICAgICAgICAvKiog5piv5ZCm6Ziy5q2i6YeN5Y+gICovXG4gICAgICAgIHRoaXMucHJldmVudE92ZXJsYXAgPSB0cnVlO1xuICAgICAgICAvKiog5q+P5qyh6L+t5Luj57uT5p2f55qE5Zue6LCD5Ye95pWwICovXG4gICAgICAgIHRoaXMudGljayA9ICgpID0+IHsgfTtcbiAgICAgICAgdGhpcy5ub2RlcyA9IFtdO1xuICAgICAgICB0aGlzLmVkZ2VzID0gW107XG4gICAgICAgIHRoaXMud2lkdGggPSAzMDA7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gMzAwO1xuICAgICAgICB0aGlzLm5vZGVNYXAgPSB7fTtcbiAgICAgICAgdGhpcy5ub2RlSWR4TWFwID0ge307XG4gICAgICAgIHRoaXMudXBkYXRlQ2ZnKG9wdGlvbnMpO1xuICAgIH1cbiAgICBnZXREZWZhdWx0Q2ZnKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbWF4SXRlcmF0aW9uOiA1MDAsXG4gICAgICAgICAgICBncmF2aXR5OiAxMCxcbiAgICAgICAgICAgIGVuYWJsZVRpY2s6IHRydWVcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICog5omn6KGM5biD5bGAXG4gICAgICovXG4gICAgZXhlY3V0ZSgpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICAgIGNvbnN0IG5vZGVzID0gc2VsZi5ub2RlcztcbiAgICAgICAgaWYgKHNlbGYudGltZUludGVydmFsICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgd2luZG93LmNsZWFySW50ZXJ2YWwoc2VsZi50aW1lSW50ZXJ2YWwpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghbm9kZXMgfHwgbm9kZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAoX2EgPSBzZWxmLm9uTGF5b3V0RW5kKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2FsbChzZWxmKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXNlbGYud2lkdGggJiYgdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgc2VsZi53aWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoO1xuICAgICAgICB9XG4gICAgICAgIGlmICghc2VsZi5oZWlnaHQgJiYgdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgc2VsZi5oZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzZWxmLmNlbnRlcikge1xuICAgICAgICAgICAgc2VsZi5jZW50ZXIgPSBbc2VsZi53aWR0aCAvIDIsIHNlbGYuaGVpZ2h0IC8gMl07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2VudGVyID0gc2VsZi5jZW50ZXI7XG4gICAgICAgIGlmIChub2Rlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIG5vZGVzWzBdLnggPSBjZW50ZXJbMF07XG4gICAgICAgICAgICBub2Rlc1swXS55ID0gY2VudGVyWzFdO1xuICAgICAgICAgICAgKF9iID0gc2VsZi5vbkxheW91dEVuZCkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmNhbGwoc2VsZik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgbm9kZU1hcCA9IHt9O1xuICAgICAgICBjb25zdCBub2RlSWR4TWFwID0ge307XG4gICAgICAgIG5vZGVzLmZvckVhY2goKG5vZGUsIGkpID0+IHtcbiAgICAgICAgICAgIGlmICghaXNOdW1iZXIobm9kZS54KSlcbiAgICAgICAgICAgICAgICBub2RlLnggPSBNYXRoLnJhbmRvbSgpICogc2VsZi53aWR0aDtcbiAgICAgICAgICAgIGlmICghaXNOdW1iZXIobm9kZS55KSlcbiAgICAgICAgICAgICAgICBub2RlLnkgPSBNYXRoLnJhbmRvbSgpICogc2VsZi5oZWlnaHQ7XG4gICAgICAgICAgICBub2RlTWFwW25vZGUuaWRdID0gbm9kZTtcbiAgICAgICAgICAgIG5vZGVJZHhNYXBbbm9kZS5pZF0gPSBpO1xuICAgICAgICB9KTtcbiAgICAgICAgc2VsZi5ub2RlTWFwID0gbm9kZU1hcDtcbiAgICAgICAgc2VsZi5ub2RlSWR4TWFwID0gbm9kZUlkeE1hcDtcbiAgICAgICAgc2VsZi5saW5rRGlzdGFuY2UgPSBwcm9jY2Vzc1RvRnVuYyhzZWxmLmxpbmtEaXN0YW5jZSwgMSk7XG4gICAgICAgIHNlbGYubm9kZVN0cmVuZ3RoID0gcHJvY2Nlc3NUb0Z1bmMoc2VsZi5ub2RlU3RyZW5ndGgsIDEpO1xuICAgICAgICBzZWxmLmVkZ2VTdHJlbmd0aCA9IHByb2NjZXNzVG9GdW5jKHNlbGYuZWRnZVN0cmVuZ3RoLCAxKTtcbiAgICAgICAgLy8gbm9kZSBzaXplIGZ1bmN0aW9uXG4gICAgICAgIGNvbnN0IG5vZGVTaXplID0gc2VsZi5ub2RlU2l6ZTtcbiAgICAgICAgbGV0IG5vZGVTaXplRnVuYztcbiAgICAgICAgaWYgKHNlbGYucHJldmVudE92ZXJsYXApIHtcbiAgICAgICAgICAgIGNvbnN0IG5vZGVTcGFjaW5nID0gc2VsZi5ub2RlU3BhY2luZztcbiAgICAgICAgICAgIGxldCBub2RlU3BhY2luZ0Z1bmM7XG4gICAgICAgICAgICBpZiAoaXNOdW1iZXIobm9kZVNwYWNpbmcpKSB7XG4gICAgICAgICAgICAgICAgbm9kZVNwYWNpbmdGdW5jID0gKCkgPT4gbm9kZVNwYWNpbmc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpc0Z1bmN0aW9uKG5vZGVTcGFjaW5nKSkge1xuICAgICAgICAgICAgICAgIG5vZGVTcGFjaW5nRnVuYyA9IG5vZGVTcGFjaW5nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbm9kZVNwYWNpbmdGdW5jID0gKCkgPT4gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghbm9kZVNpemUpIHtcbiAgICAgICAgICAgICAgICBub2RlU2l6ZUZ1bmMgPSAoZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZC5zaXplKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNBcnJheShkLnNpemUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzID0gZC5zaXplWzBdID4gZC5zaXplWzFdID8gZC5zaXplWzBdIDogZC5zaXplWzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXMgKyBub2RlU3BhY2luZ0Z1bmMoZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNPYmplY3QoZC5zaXplKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcyA9IGQuc2l6ZS53aWR0aCA+IGQuc2l6ZS5oZWlnaHQgPyBkLnNpemUud2lkdGggOiBkLnNpemUuaGVpZ2h0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXMgKyBub2RlU3BhY2luZ0Z1bmMoZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZC5zaXplICsgbm9kZVNwYWNpbmdGdW5jKGQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAxMCArIG5vZGVTcGFjaW5nRnVuYyhkKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaXNBcnJheShub2RlU2l6ZSkpIHtcbiAgICAgICAgICAgICAgICBub2RlU2l6ZUZ1bmMgPSAoZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXMgPSBub2RlU2l6ZVswXSA+IG5vZGVTaXplWzFdID8gbm9kZVNpemVbMF0gOiBub2RlU2l6ZVsxXTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlcyArIG5vZGVTcGFjaW5nRnVuYyhkKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbm9kZVNpemVGdW5jID0gKGQpID0+IG5vZGVTaXplICsgbm9kZVNwYWNpbmdGdW5jKGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHNlbGYubm9kZVNpemUgPSBub2RlU2l6ZUZ1bmM7XG4gICAgICAgIGNvbnN0IGVkZ2VzID0gc2VsZi5lZGdlcztcbiAgICAgICAgc2VsZi5kZWdyZWVzID0gZ2V0RGVncmVlKG5vZGVzLmxlbmd0aCwgc2VsZi5ub2RlSWR4TWFwLCBlZGdlcyk7XG4gICAgICAgIGlmICghc2VsZi5nZXRNYXNzKSB7XG4gICAgICAgICAgICBzZWxmLmdldE1hc3MgPSAoZCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hc3MgPSBzZWxmLmRlZ3JlZXNbc2VsZi5ub2RlSWR4TWFwW2QuaWRdXSB8fCAxO1xuICAgICAgICAgICAgICAgIHJldHVybiBtYXNzO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICAvLyBsYXlvdXRcbiAgICAgICAgc2VsZi5ydW4oKTtcbiAgICB9XG4gICAgcnVuKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgICAgICBjb25zdCB7IG1heEl0ZXJhdGlvbiwgbm9kZXMsIHdvcmtlckVuYWJsZWQsIG1pbk1vdmVtZW50IH0gPSBzZWxmO1xuICAgICAgICBpZiAoIW5vZGVzKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBpZiAod29ya2VyRW5hYmxlZCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXhJdGVyYXRpb247IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzUG9zID0gc2VsZi5ydW5PbmVTdGVwKGkpO1xuICAgICAgICAgICAgICAgIGlmIChzZWxmLnJlYWNoTW92ZVRocmVzaG9sZChub2RlcywgcHJldmlvdXNQb3MsIG1pbk1vdmVtZW50KSkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAoX2EgPSBzZWxmLm9uTGF5b3V0RW5kKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2FsbChzZWxmKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSBcInVuZGVmaW5lZFwiKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGxldCBpdGVyID0gMDtcbiAgICAgICAgICAgIC8vIGludGVydmFsIGZvciByZW5kZXIgdGhlIHJlc3VsdCBhZnRlciBlYWNoIGl0ZXJhdGlvblxuICAgICAgICAgICAgdGhpcy50aW1lSW50ZXJ2YWwgPSB3aW5kb3cuc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgICAgICAgICAgaWYgKCFub2RlcylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzUG9zID0gc2VsZi5ydW5PbmVTdGVwKGl0ZXIpIHx8IFtdO1xuICAgICAgICAgICAgICAgIGlmIChzZWxmLnJlYWNoTW92ZVRocmVzaG9sZChub2RlcywgcHJldmlvdXNQb3MsIG1pbk1vdmVtZW50KSkge1xuICAgICAgICAgICAgICAgICAgICAoX2EgPSBzZWxmLm9uTGF5b3V0RW5kKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2FsbChzZWxmKTtcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LmNsZWFySW50ZXJ2YWwoc2VsZi50aW1lSW50ZXJ2YWwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpdGVyKys7XG4gICAgICAgICAgICAgICAgaWYgKGl0ZXIgPj0gbWF4SXRlcmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIChfYiA9IHNlbGYub25MYXlvdXRFbmQpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5jYWxsKHNlbGYpO1xuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuY2xlYXJJbnRlcnZhbChzZWxmLnRpbWVJbnRlcnZhbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVhY2hNb3ZlVGhyZXNob2xkKG5vZGVzLCBwcmV2aW91c1BvcywgbWluTW92ZW1lbnQpIHtcbiAgICAgICAgLy8gd2hldGhlciB0byBzdG9wIHRoZSBpdGVyYXRpb25cbiAgICAgICAgbGV0IG1vdmVtZW50ID0gMDtcbiAgICAgICAgbm9kZXMuZm9yRWFjaCgobm9kZSwgaikgPT4ge1xuICAgICAgICAgICAgY29uc3QgdnggPSBub2RlLnggLSBwcmV2aW91c1Bvc1tqXS54O1xuICAgICAgICAgICAgY29uc3QgdnkgPSBub2RlLnkgLSBwcmV2aW91c1Bvc1tqXS55O1xuICAgICAgICAgICAgbW92ZW1lbnQgKz0gTWF0aC5zcXJ0KHZ4ICogdnggKyB2eSAqIHZ5KTtcbiAgICAgICAgfSk7XG4gICAgICAgIG1vdmVtZW50IC89IG5vZGVzLmxlbmd0aDtcbiAgICAgICAgcmV0dXJuIG1vdmVtZW50IDwgbWluTW92ZW1lbnQ7XG4gICAgfVxuICAgIHJ1bk9uZVN0ZXAoaXRlcikge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgICAgICBjb25zdCB7IG5vZGVzLCBlZGdlcyB9ID0gc2VsZjtcbiAgICAgICAgY29uc3QgYWNjQXJyYXkgPSBbXTtcbiAgICAgICAgY29uc3QgdmVsQXJyYXkgPSBbXTtcbiAgICAgICAgaWYgKCFub2RlcylcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgbm9kZXMuZm9yRWFjaCgoXywgaSkgPT4ge1xuICAgICAgICAgICAgYWNjQXJyYXlbMiAqIGldID0gMDtcbiAgICAgICAgICAgIGFjY0FycmF5WzIgKiBpICsgMV0gPSAwO1xuICAgICAgICAgICAgdmVsQXJyYXlbMiAqIGldID0gMDtcbiAgICAgICAgICAgIHZlbEFycmF5WzIgKiBpICsgMV0gPSAwO1xuICAgICAgICB9KTtcbiAgICAgICAgc2VsZi5jYWxSZXB1bHNpdmUoYWNjQXJyYXksIG5vZGVzKTtcbiAgICAgICAgaWYgKGVkZ2VzKVxuICAgICAgICAgICAgc2VsZi5jYWxBdHRyYWN0aXZlKGFjY0FycmF5LCBlZGdlcyk7XG4gICAgICAgIHNlbGYuY2FsR3Jhdml0eShhY2NBcnJheSwgbm9kZXMpO1xuICAgICAgICBjb25zdCBzdGVwSW50ZXJ2YWwgPSBNYXRoLm1heCgwLjAyLCBzZWxmLmludGVydmFsIC0gaXRlciAqIDAuMDAyKTtcbiAgICAgICAgc2VsZi51cGRhdGVWZWxvY2l0eShhY2NBcnJheSwgdmVsQXJyYXksIHN0ZXBJbnRlcnZhbCwgbm9kZXMpO1xuICAgICAgICBjb25zdCBwcmV2aW91c1BvcyA9IFtdO1xuICAgICAgICBub2Rlcy5mb3JFYWNoKChub2RlKSA9PiB7XG4gICAgICAgICAgICBwcmV2aW91c1Bvcy5wdXNoKHtcbiAgICAgICAgICAgICAgICB4OiBub2RlLngsXG4gICAgICAgICAgICAgICAgeTogbm9kZS55XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHNlbGYudXBkYXRlUG9zaXRpb24odmVsQXJyYXksIHN0ZXBJbnRlcnZhbCwgbm9kZXMpO1xuICAgICAgICAoX2EgPSBzZWxmLnRpY2spID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jYWxsKHNlbGYpO1xuICAgICAgICByZXR1cm4gcHJldmlvdXNQb3M7XG4gICAgfVxuICAgIGNhbFJlcHVsc2l2ZShhY2NBcnJheSwgbm9kZXMpIHtcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICAgIC8vIGNvbnN0IG5vZGVzID0gc2VsZi5ub2RlcztcbiAgICAgICAgY29uc3QgZ2V0TWFzcyA9IHNlbGYuZ2V0TWFzcztcbiAgICAgICAgY29uc3Qgbm9kZVN0cmVuZ3RoID0gc2VsZi5ub2RlU3RyZW5ndGg7XG4gICAgICAgIGNvbnN0IGZhY3RvciA9IHNlbGYuZmFjdG9yO1xuICAgICAgICBjb25zdCBjb3Vsb21iRGlzU2NhbGUgPSBzZWxmLmNvdWxvbWJEaXNTY2FsZTtcbiAgICAgICAgY29uc3QgcHJldmVudE92ZXJsYXAgPSBzZWxmLnByZXZlbnRPdmVybGFwO1xuICAgICAgICBjb25zdCBub2RlU2l6ZSA9IHNlbGYubm9kZVNpemU7XG4gICAgICAgIG5vZGVzLmZvckVhY2goKG5pLCBpKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBtYXNzaSA9IGdldE1hc3MgPyBnZXRNYXNzKG5pKSA6IDE7XG4gICAgICAgICAgICBub2Rlcy5mb3JFYWNoKChuaiwgaikgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChpID49IGopXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAvLyBpZiAoIWFjY0FycmF5W2pdKSBhY2NBcnJheVtqXSA9IDA7XG4gICAgICAgICAgICAgICAgY29uc3QgdmVjWCA9IG5pLnggLSBuai54O1xuICAgICAgICAgICAgICAgIGNvbnN0IHZlY1kgPSBuaS55IC0gbmoueTtcbiAgICAgICAgICAgICAgICBjb25zdCB2ZWNMZW5ndGggPSBNYXRoLnNxcnQodmVjWCAqIHZlY1ggKyB2ZWNZICogdmVjWSkgKyAwLjAxO1xuICAgICAgICAgICAgICAgIGNvbnN0IG5WZWNMZW5ndGggPSAodmVjTGVuZ3RoICsgMC4xKSAqIGNvdWxvbWJEaXNTY2FsZTtcbiAgICAgICAgICAgICAgICBjb25zdCBkaXJlWCA9IHZlY1ggLyB2ZWNMZW5ndGg7XG4gICAgICAgICAgICAgICAgY29uc3QgZGlyZVkgPSB2ZWNZIC8gdmVjTGVuZ3RoO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmFtID0gKCgobm9kZVN0cmVuZ3RoKG5pKSArIG5vZGVTdHJlbmd0aChuaikpIC8gMikgKiBmYWN0b3IpIC9cbiAgICAgICAgICAgICAgICAgICAgKG5WZWNMZW5ndGggKiBuVmVjTGVuZ3RoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBtYXNzaiA9IGdldE1hc3MgPyBnZXRNYXNzKG5qKSA6IDE7XG4gICAgICAgICAgICAgICAgYWNjQXJyYXlbMiAqIGldICs9IChkaXJlWCAqIHBhcmFtKTtcbiAgICAgICAgICAgICAgICBhY2NBcnJheVsyICogaSArIDFdICs9IChkaXJlWSAqIHBhcmFtKTtcbiAgICAgICAgICAgICAgICBhY2NBcnJheVsyICogal0gLT0gKGRpcmVYICogcGFyYW0pO1xuICAgICAgICAgICAgICAgIGFjY0FycmF5WzIgKiBqICsgMV0gLT0gKGRpcmVZICogcGFyYW0pO1xuICAgICAgICAgICAgICAgIGlmIChwcmV2ZW50T3ZlcmxhcCAmJiB2ZWNMZW5ndGggPCAobm9kZVNpemUobmkpICsgbm9kZVNpemUobmopKSAvIDIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyYW1PdmVybGFwID0gKG5vZGVTdHJlbmd0aChuaSkgKyBub2RlU3RyZW5ndGgobmopKSAvIDIgLyAodmVjTGVuZ3RoICogdmVjTGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgYWNjQXJyYXlbMiAqIGldICs9IChkaXJlWCAqIHBhcmFtT3ZlcmxhcCkgLyBtYXNzaTtcbiAgICAgICAgICAgICAgICAgICAgYWNjQXJyYXlbMiAqIGkgKyAxXSArPSAoZGlyZVkgKiBwYXJhbU92ZXJsYXApIC8gbWFzc2k7XG4gICAgICAgICAgICAgICAgICAgIGFjY0FycmF5WzIgKiBqXSAtPSAoZGlyZVggKiBwYXJhbU92ZXJsYXApIC8gbWFzc2o7XG4gICAgICAgICAgICAgICAgICAgIGFjY0FycmF5WzIgKiBqICsgMV0gLT0gKGRpcmVZICogcGFyYW1PdmVybGFwKSAvIG1hc3NqO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgY2FsQXR0cmFjdGl2ZShhY2NBcnJheSwgZWRnZXMpIHtcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICAgIC8vIGNvbnN0IGVkZ2VzID0gc2VsZi5lZGdlcztcbiAgICAgICAgY29uc3Qgbm9kZU1hcCA9IHNlbGYubm9kZU1hcDtcbiAgICAgICAgY29uc3Qgbm9kZUlkeE1hcCA9IHNlbGYubm9kZUlkeE1hcDtcbiAgICAgICAgY29uc3QgbGlua0Rpc3RhbmNlID0gc2VsZi5saW5rRGlzdGFuY2U7XG4gICAgICAgIGNvbnN0IGVkZ2VTdHJlbmd0aCA9IHNlbGYuZWRnZVN0cmVuZ3RoO1xuICAgICAgICBjb25zdCBnZXRNYXNzID0gc2VsZi5nZXRNYXNzO1xuICAgICAgICBlZGdlcy5mb3JFYWNoKChlZGdlLCBpKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2UgPSBnZXRFZGdlVGVybWluYWwoZWRnZSwgJ3NvdXJjZScpO1xuICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gZ2V0RWRnZVRlcm1pbmFsKGVkZ2UsICd0YXJnZXQnKTtcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZU5vZGUgPSBub2RlTWFwW3NvdXJjZV07XG4gICAgICAgICAgICBjb25zdCB0YXJnZXROb2RlID0gbm9kZU1hcFt0YXJnZXRdO1xuICAgICAgICAgICAgY29uc3QgdmVjWCA9IHRhcmdldE5vZGUueCAtIHNvdXJjZU5vZGUueDtcbiAgICAgICAgICAgIGNvbnN0IHZlY1kgPSB0YXJnZXROb2RlLnkgLSBzb3VyY2VOb2RlLnk7XG4gICAgICAgICAgICBjb25zdCB2ZWNMZW5ndGggPSBNYXRoLnNxcnQodmVjWCAqIHZlY1ggKyB2ZWNZICogdmVjWSkgKyAwLjAxO1xuICAgICAgICAgICAgY29uc3QgZGlyZVggPSB2ZWNYIC8gdmVjTGVuZ3RoO1xuICAgICAgICAgICAgY29uc3QgZGlyZVkgPSB2ZWNZIC8gdmVjTGVuZ3RoO1xuICAgICAgICAgICAgY29uc3QgbGVuZ3RoID0gbGlua0Rpc3RhbmNlKGVkZ2UpIHx8IDE7XG4gICAgICAgICAgICBjb25zdCBkaWZmID0gbGVuZ3RoIC0gdmVjTGVuZ3RoO1xuICAgICAgICAgICAgY29uc3QgcGFyYW0gPSBkaWZmICogZWRnZVN0cmVuZ3RoKGVkZ2UpO1xuICAgICAgICAgICAgY29uc3Qgc291cmNlSWR4ID0gbm9kZUlkeE1hcFtzb3VyY2VdO1xuICAgICAgICAgICAgY29uc3QgdGFyZ2V0SWR4ID0gbm9kZUlkeE1hcFt0YXJnZXRdO1xuICAgICAgICAgICAgY29uc3QgbWFzc1NvdXJjZSA9IGdldE1hc3MgPyBnZXRNYXNzKHNvdXJjZU5vZGUpIDogMTtcbiAgICAgICAgICAgIGNvbnN0IG1hc3NUYXJnZXQgPSBnZXRNYXNzID8gZ2V0TWFzcyh0YXJnZXROb2RlKSA6IDE7XG4gICAgICAgICAgICBhY2NBcnJheVsyICogc291cmNlSWR4XSAtPSAoZGlyZVggKiBwYXJhbSkgLyBtYXNzU291cmNlO1xuICAgICAgICAgICAgYWNjQXJyYXlbMiAqIHNvdXJjZUlkeCArIDFdIC09IChkaXJlWSAqIHBhcmFtKSAvIG1hc3NTb3VyY2U7XG4gICAgICAgICAgICBhY2NBcnJheVsyICogdGFyZ2V0SWR4XSArPSAoZGlyZVggKiBwYXJhbSkgLyBtYXNzVGFyZ2V0O1xuICAgICAgICAgICAgYWNjQXJyYXlbMiAqIHRhcmdldElkeCArIDFdICs9IChkaXJlWSAqIHBhcmFtKSAvIG1hc3NUYXJnZXQ7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBjYWxHcmF2aXR5KGFjY0FycmF5LCBub2Rlcykge1xuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAgICAgLy8gY29uc3Qgbm9kZXMgPSBzZWxmLm5vZGVzO1xuICAgICAgICBjb25zdCBjZW50ZXIgPSBzZWxmLmNlbnRlcjtcbiAgICAgICAgY29uc3QgZGVmYXVsdEdyYXZpdHkgPSBzZWxmLmdyYXZpdHk7XG4gICAgICAgIGNvbnN0IGRlZ3JlZXMgPSBzZWxmLmRlZ3JlZXM7XG4gICAgICAgIGNvbnN0IG5vZGVMZW5ndGggPSBub2Rlcy5sZW5ndGg7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZUxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBub2RlID0gbm9kZXNbaV07XG4gICAgICAgICAgICBsZXQgdmVjWCA9IG5vZGUueCAtIGNlbnRlclswXTtcbiAgICAgICAgICAgIGxldCB2ZWNZID0gbm9kZS55IC0gY2VudGVyWzFdO1xuICAgICAgICAgICAgbGV0IGdyYXZpdHkgPSBkZWZhdWx0R3Jhdml0eTtcbiAgICAgICAgICAgIGlmIChzZWxmLmdldENlbnRlcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1c3RvbUNlbnRlck9wdCA9IHNlbGYuZ2V0Q2VudGVyKG5vZGUsIGRlZ3JlZXNbaV0pO1xuICAgICAgICAgICAgICAgIGlmIChjdXN0b21DZW50ZXJPcHQgJiZcbiAgICAgICAgICAgICAgICAgICAgaXNOdW1iZXIoY3VzdG9tQ2VudGVyT3B0WzBdKSAmJlxuICAgICAgICAgICAgICAgICAgICBpc051bWJlcihjdXN0b21DZW50ZXJPcHRbMV0pICYmXG4gICAgICAgICAgICAgICAgICAgIGlzTnVtYmVyKGN1c3RvbUNlbnRlck9wdFsyXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmVjWCA9IG5vZGUueCAtIGN1c3RvbUNlbnRlck9wdFswXTtcbiAgICAgICAgICAgICAgICAgICAgdmVjWSA9IG5vZGUueSAtIGN1c3RvbUNlbnRlck9wdFsxXTtcbiAgICAgICAgICAgICAgICAgICAgZ3Jhdml0eSA9IGN1c3RvbUNlbnRlck9wdFsyXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWdyYXZpdHkpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBhY2NBcnJheVsyICogaV0gLT0gZ3Jhdml0eSAqIHZlY1g7XG4gICAgICAgICAgICBhY2NBcnJheVsyICogaSArIDFdIC09IGdyYXZpdHkgKiB2ZWNZO1xuICAgICAgICB9XG4gICAgfVxuICAgIHVwZGF0ZVZlbG9jaXR5KGFjY0FycmF5LCB2ZWxBcnJheSwgc3RlcEludGVydmFsLCBub2Rlcykge1xuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAgICAgY29uc3QgcGFyYW0gPSBzdGVwSW50ZXJ2YWwgKiBzZWxmLmRhbXBpbmc7XG4gICAgICAgIC8vIGNvbnN0IG5vZGVzID0gc2VsZi5ub2RlcztcbiAgICAgICAgbm9kZXMuZm9yRWFjaCgobm9kZSwgaSkgPT4ge1xuICAgICAgICAgICAgbGV0IHZ4ID0gYWNjQXJyYXlbMiAqIGldICogcGFyYW0gfHwgMC4wMTtcbiAgICAgICAgICAgIGxldCB2eSA9IGFjY0FycmF5WzIgKiBpICsgMV0gKiBwYXJhbSB8fCAwLjAxO1xuICAgICAgICAgICAgY29uc3Qgdkxlbmd0aCA9IE1hdGguc3FydCh2eCAqIHZ4ICsgdnkgKiB2eSk7XG4gICAgICAgICAgICBpZiAodkxlbmd0aCA+IHNlbGYubWF4U3BlZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJhbTIgPSBzZWxmLm1heFNwZWVkIC8gdkxlbmd0aDtcbiAgICAgICAgICAgICAgICB2eCA9IHBhcmFtMiAqIHZ4O1xuICAgICAgICAgICAgICAgIHZ5ID0gcGFyYW0yICogdnk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2ZWxBcnJheVsyICogaV0gPSB2eDtcbiAgICAgICAgICAgIHZlbEFycmF5WzIgKiBpICsgMV0gPSB2eTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHVwZGF0ZVBvc2l0aW9uKHZlbEFycmF5LCBzdGVwSW50ZXJ2YWwsIG5vZGVzKSB7XG4gICAgICAgIG5vZGVzLmZvckVhY2goKG5vZGUsIGkpID0+IHtcbiAgICAgICAgICAgIGlmIChpc051bWJlcihub2RlLmZ4KSAmJiBpc051bWJlcihub2RlLmZ5KSkge1xuICAgICAgICAgICAgICAgIG5vZGUueCA9IG5vZGUuZng7XG4gICAgICAgICAgICAgICAgbm9kZS55ID0gbm9kZS5meTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBkaXN0WCA9IHZlbEFycmF5WzIgKiBpXSAqIHN0ZXBJbnRlcnZhbDtcbiAgICAgICAgICAgIGNvbnN0IGRpc3RZID0gdmVsQXJyYXlbMiAqIGkgKyAxXSAqIHN0ZXBJbnRlcnZhbDtcbiAgICAgICAgICAgIG5vZGUueCArPSBkaXN0WDtcbiAgICAgICAgICAgIG5vZGUueSArPSBkaXN0WTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN0b3AoKSB7XG4gICAgICAgIGlmICh0aGlzLnRpbWVJbnRlcnZhbCAmJiB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICB3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLnRpbWVJbnRlcnZhbCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICAgIHNlbGYuc3RvcCgpO1xuICAgICAgICBzZWxmLnRpY2sgPSBudWxsO1xuICAgICAgICBzZWxmLm5vZGVzID0gbnVsbDtcbiAgICAgICAgc2VsZi5lZGdlcyA9IG51bGw7XG4gICAgICAgIHNlbGYuZGVzdHJveWVkID0gdHJ1ZTtcbiAgICB9XG4gICAgZ2V0VHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIFwiZ0ZvcmNlXCI7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z0ZvcmNlLmpzLm1hcCIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGQpIHtcbiAgY29uc3QgeCA9ICt0aGlzLl94LmNhbGwobnVsbCwgZCksXG4gICAgICB5ID0gK3RoaXMuX3kuY2FsbChudWxsLCBkKTtcbiAgcmV0dXJuIGFkZCh0aGlzLmNvdmVyKHgsIHkpLCB4LCB5LCBkKTtcbn1cblxuZnVuY3Rpb24gYWRkKHRyZWUsIHgsIHksIGQpIHtcbiAgaWYgKGlzTmFOKHgpIHx8IGlzTmFOKHkpKSByZXR1cm4gdHJlZTsgLy8gaWdub3JlIGludmFsaWQgcG9pbnRzXG5cbiAgdmFyIHBhcmVudCxcbiAgICAgIG5vZGUgPSB0cmVlLl9yb290LFxuICAgICAgbGVhZiA9IHtkYXRhOiBkfSxcbiAgICAgIHgwID0gdHJlZS5feDAsXG4gICAgICB5MCA9IHRyZWUuX3kwLFxuICAgICAgeDEgPSB0cmVlLl94MSxcbiAgICAgIHkxID0gdHJlZS5feTEsXG4gICAgICB4bSxcbiAgICAgIHltLFxuICAgICAgeHAsXG4gICAgICB5cCxcbiAgICAgIHJpZ2h0LFxuICAgICAgYm90dG9tLFxuICAgICAgaSxcbiAgICAgIGo7XG5cbiAgLy8gSWYgdGhlIHRyZWUgaXMgZW1wdHksIGluaXRpYWxpemUgdGhlIHJvb3QgYXMgYSBsZWFmLlxuICBpZiAoIW5vZGUpIHJldHVybiB0cmVlLl9yb290ID0gbGVhZiwgdHJlZTtcblxuICAvLyBGaW5kIHRoZSBleGlzdGluZyBsZWFmIGZvciB0aGUgbmV3IHBvaW50LCBvciBhZGQgaXQuXG4gIHdoaWxlIChub2RlLmxlbmd0aCkge1xuICAgIGlmIChyaWdodCA9IHggPj0gKHhtID0gKHgwICsgeDEpIC8gMikpIHgwID0geG07IGVsc2UgeDEgPSB4bTtcbiAgICBpZiAoYm90dG9tID0geSA+PSAoeW0gPSAoeTAgKyB5MSkgLyAyKSkgeTAgPSB5bTsgZWxzZSB5MSA9IHltO1xuICAgIGlmIChwYXJlbnQgPSBub2RlLCAhKG5vZGUgPSBub2RlW2kgPSBib3R0b20gPDwgMSB8IHJpZ2h0XSkpIHJldHVybiBwYXJlbnRbaV0gPSBsZWFmLCB0cmVlO1xuICB9XG5cbiAgLy8gSXMgdGhlIG5ldyBwb2ludCBpcyBleGFjdGx5IGNvaW5jaWRlbnQgd2l0aCB0aGUgZXhpc3RpbmcgcG9pbnQ/XG4gIHhwID0gK3RyZWUuX3guY2FsbChudWxsLCBub2RlLmRhdGEpO1xuICB5cCA9ICt0cmVlLl95LmNhbGwobnVsbCwgbm9kZS5kYXRhKTtcbiAgaWYgKHggPT09IHhwICYmIHkgPT09IHlwKSByZXR1cm4gbGVhZi5uZXh0ID0gbm9kZSwgcGFyZW50ID8gcGFyZW50W2ldID0gbGVhZiA6IHRyZWUuX3Jvb3QgPSBsZWFmLCB0cmVlO1xuXG4gIC8vIE90aGVyd2lzZSwgc3BsaXQgdGhlIGxlYWYgbm9kZSB1bnRpbCB0aGUgb2xkIGFuZCBuZXcgcG9pbnQgYXJlIHNlcGFyYXRlZC5cbiAgZG8ge1xuICAgIHBhcmVudCA9IHBhcmVudCA/IHBhcmVudFtpXSA9IG5ldyBBcnJheSg0KSA6IHRyZWUuX3Jvb3QgPSBuZXcgQXJyYXkoNCk7XG4gICAgaWYgKHJpZ2h0ID0geCA+PSAoeG0gPSAoeDAgKyB4MSkgLyAyKSkgeDAgPSB4bTsgZWxzZSB4MSA9IHhtO1xuICAgIGlmIChib3R0b20gPSB5ID49ICh5bSA9ICh5MCArIHkxKSAvIDIpKSB5MCA9IHltOyBlbHNlIHkxID0geW07XG4gIH0gd2hpbGUgKChpID0gYm90dG9tIDw8IDEgfCByaWdodCkgPT09IChqID0gKHlwID49IHltKSA8PCAxIHwgKHhwID49IHhtKSkpO1xuICByZXR1cm4gcGFyZW50W2pdID0gbm9kZSwgcGFyZW50W2ldID0gbGVhZiwgdHJlZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFkZEFsbChkYXRhKSB7XG4gIHZhciBkLCBpLCBuID0gZGF0YS5sZW5ndGgsXG4gICAgICB4LFxuICAgICAgeSxcbiAgICAgIHh6ID0gbmV3IEFycmF5KG4pLFxuICAgICAgeXogPSBuZXcgQXJyYXkobiksXG4gICAgICB4MCA9IEluZmluaXR5LFxuICAgICAgeTAgPSBJbmZpbml0eSxcbiAgICAgIHgxID0gLUluZmluaXR5LFxuICAgICAgeTEgPSAtSW5maW5pdHk7XG5cbiAgLy8gQ29tcHV0ZSB0aGUgcG9pbnRzIGFuZCB0aGVpciBleHRlbnQuXG4gIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICBpZiAoaXNOYU4oeCA9ICt0aGlzLl94LmNhbGwobnVsbCwgZCA9IGRhdGFbaV0pKSB8fCBpc05hTih5ID0gK3RoaXMuX3kuY2FsbChudWxsLCBkKSkpIGNvbnRpbnVlO1xuICAgIHh6W2ldID0geDtcbiAgICB5eltpXSA9IHk7XG4gICAgaWYgKHggPCB4MCkgeDAgPSB4O1xuICAgIGlmICh4ID4geDEpIHgxID0geDtcbiAgICBpZiAoeSA8IHkwKSB5MCA9IHk7XG4gICAgaWYgKHkgPiB5MSkgeTEgPSB5O1xuICB9XG5cbiAgLy8gSWYgdGhlcmUgd2VyZSBubyAodmFsaWQpIHBvaW50cywgYWJvcnQuXG4gIGlmICh4MCA+IHgxIHx8IHkwID4geTEpIHJldHVybiB0aGlzO1xuXG4gIC8vIEV4cGFuZCB0aGUgdHJlZSB0byBjb3ZlciB0aGUgbmV3IHBvaW50cy5cbiAgdGhpcy5jb3Zlcih4MCwgeTApLmNvdmVyKHgxLCB5MSk7XG5cbiAgLy8gQWRkIHRoZSBuZXcgcG9pbnRzLlxuICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgYWRkKHRoaXMsIHh6W2ldLCB5eltpXSwgZGF0YVtpXSk7XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHgsIHkpIHtcbiAgaWYgKGlzTmFOKHggPSAreCkgfHwgaXNOYU4oeSA9ICt5KSkgcmV0dXJuIHRoaXM7IC8vIGlnbm9yZSBpbnZhbGlkIHBvaW50c1xuXG4gIHZhciB4MCA9IHRoaXMuX3gwLFxuICAgICAgeTAgPSB0aGlzLl95MCxcbiAgICAgIHgxID0gdGhpcy5feDEsXG4gICAgICB5MSA9IHRoaXMuX3kxO1xuXG4gIC8vIElmIHRoZSBxdWFkdHJlZSBoYXMgbm8gZXh0ZW50LCBpbml0aWFsaXplIHRoZW0uXG4gIC8vIEludGVnZXIgZXh0ZW50IGFyZSBuZWNlc3Nhcnkgc28gdGhhdCBpZiB3ZSBsYXRlciBkb3VibGUgdGhlIGV4dGVudCxcbiAgLy8gdGhlIGV4aXN0aW5nIHF1YWRyYW50IGJvdW5kYXJpZXMgZG9u4oCZdCBjaGFuZ2UgZHVlIHRvIGZsb2F0aW5nIHBvaW50IGVycm9yIVxuICBpZiAoaXNOYU4oeDApKSB7XG4gICAgeDEgPSAoeDAgPSBNYXRoLmZsb29yKHgpKSArIDE7XG4gICAgeTEgPSAoeTAgPSBNYXRoLmZsb29yKHkpKSArIDE7XG4gIH1cblxuICAvLyBPdGhlcndpc2UsIGRvdWJsZSByZXBlYXRlZGx5IHRvIGNvdmVyLlxuICBlbHNlIHtcbiAgICB2YXIgeiA9IHgxIC0geDAgfHwgMSxcbiAgICAgICAgbm9kZSA9IHRoaXMuX3Jvb3QsXG4gICAgICAgIHBhcmVudCxcbiAgICAgICAgaTtcblxuICAgIHdoaWxlICh4MCA+IHggfHwgeCA+PSB4MSB8fCB5MCA+IHkgfHwgeSA+PSB5MSkge1xuICAgICAgaSA9ICh5IDwgeTApIDw8IDEgfCAoeCA8IHgwKTtcbiAgICAgIHBhcmVudCA9IG5ldyBBcnJheSg0KSwgcGFyZW50W2ldID0gbm9kZSwgbm9kZSA9IHBhcmVudCwgeiAqPSAyO1xuICAgICAgc3dpdGNoIChpKSB7XG4gICAgICAgIGNhc2UgMDogeDEgPSB4MCArIHosIHkxID0geTAgKyB6OyBicmVhaztcbiAgICAgICAgY2FzZSAxOiB4MCA9IHgxIC0geiwgeTEgPSB5MCArIHo7IGJyZWFrO1xuICAgICAgICBjYXNlIDI6IHgxID0geDAgKyB6LCB5MCA9IHkxIC0gejsgYnJlYWs7XG4gICAgICAgIGNhc2UgMzogeDAgPSB4MSAtIHosIHkwID0geTEgLSB6OyBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5fcm9vdCAmJiB0aGlzLl9yb290Lmxlbmd0aCkgdGhpcy5fcm9vdCA9IG5vZGU7XG4gIH1cblxuICB0aGlzLl94MCA9IHgwO1xuICB0aGlzLl95MCA9IHkwO1xuICB0aGlzLl94MSA9IHgxO1xuICB0aGlzLl95MSA9IHkxO1xuICByZXR1cm4gdGhpcztcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICB2YXIgZGF0YSA9IFtdO1xuICB0aGlzLnZpc2l0KGZ1bmN0aW9uKG5vZGUpIHtcbiAgICBpZiAoIW5vZGUubGVuZ3RoKSBkbyBkYXRhLnB1c2gobm9kZS5kYXRhKTsgd2hpbGUgKG5vZGUgPSBub2RlLm5leHQpXG4gIH0pO1xuICByZXR1cm4gZGF0YTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKF8pIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGhcbiAgICAgID8gdGhpcy5jb3ZlcigrX1swXVswXSwgK19bMF1bMV0pLmNvdmVyKCtfWzFdWzBdLCArX1sxXVsxXSlcbiAgICAgIDogaXNOYU4odGhpcy5feDApID8gdW5kZWZpbmVkIDogW1t0aGlzLl94MCwgdGhpcy5feTBdLCBbdGhpcy5feDEsIHRoaXMuX3kxXV07XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihub2RlLCB4MCwgeTAsIHgxLCB5MSkge1xuICB0aGlzLm5vZGUgPSBub2RlO1xuICB0aGlzLngwID0geDA7XG4gIHRoaXMueTAgPSB5MDtcbiAgdGhpcy54MSA9IHgxO1xuICB0aGlzLnkxID0geTE7XG59XG4iLCJpbXBvcnQgUXVhZCBmcm9tIFwiLi9xdWFkLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHgsIHksIHJhZGl1cykge1xuICB2YXIgZGF0YSxcbiAgICAgIHgwID0gdGhpcy5feDAsXG4gICAgICB5MCA9IHRoaXMuX3kwLFxuICAgICAgeDEsXG4gICAgICB5MSxcbiAgICAgIHgyLFxuICAgICAgeTIsXG4gICAgICB4MyA9IHRoaXMuX3gxLFxuICAgICAgeTMgPSB0aGlzLl95MSxcbiAgICAgIHF1YWRzID0gW10sXG4gICAgICBub2RlID0gdGhpcy5fcm9vdCxcbiAgICAgIHEsXG4gICAgICBpO1xuXG4gIGlmIChub2RlKSBxdWFkcy5wdXNoKG5ldyBRdWFkKG5vZGUsIHgwLCB5MCwgeDMsIHkzKSk7XG4gIGlmIChyYWRpdXMgPT0gbnVsbCkgcmFkaXVzID0gSW5maW5pdHk7XG4gIGVsc2Uge1xuICAgIHgwID0geCAtIHJhZGl1cywgeTAgPSB5IC0gcmFkaXVzO1xuICAgIHgzID0geCArIHJhZGl1cywgeTMgPSB5ICsgcmFkaXVzO1xuICAgIHJhZGl1cyAqPSByYWRpdXM7XG4gIH1cblxuICB3aGlsZSAocSA9IHF1YWRzLnBvcCgpKSB7XG5cbiAgICAvLyBTdG9wIHNlYXJjaGluZyBpZiB0aGlzIHF1YWRyYW50IGNhbuKAmXQgY29udGFpbiBhIGNsb3NlciBub2RlLlxuICAgIGlmICghKG5vZGUgPSBxLm5vZGUpXG4gICAgICAgIHx8ICh4MSA9IHEueDApID4geDNcbiAgICAgICAgfHwgKHkxID0gcS55MCkgPiB5M1xuICAgICAgICB8fCAoeDIgPSBxLngxKSA8IHgwXG4gICAgICAgIHx8ICh5MiA9IHEueTEpIDwgeTApIGNvbnRpbnVlO1xuXG4gICAgLy8gQmlzZWN0IHRoZSBjdXJyZW50IHF1YWRyYW50LlxuICAgIGlmIChub2RlLmxlbmd0aCkge1xuICAgICAgdmFyIHhtID0gKHgxICsgeDIpIC8gMixcbiAgICAgICAgICB5bSA9ICh5MSArIHkyKSAvIDI7XG5cbiAgICAgIHF1YWRzLnB1c2goXG4gICAgICAgIG5ldyBRdWFkKG5vZGVbM10sIHhtLCB5bSwgeDIsIHkyKSxcbiAgICAgICAgbmV3IFF1YWQobm9kZVsyXSwgeDEsIHltLCB4bSwgeTIpLFxuICAgICAgICBuZXcgUXVhZChub2RlWzFdLCB4bSwgeTEsIHgyLCB5bSksXG4gICAgICAgIG5ldyBRdWFkKG5vZGVbMF0sIHgxLCB5MSwgeG0sIHltKVxuICAgICAgKTtcblxuICAgICAgLy8gVmlzaXQgdGhlIGNsb3Nlc3QgcXVhZHJhbnQgZmlyc3QuXG4gICAgICBpZiAoaSA9ICh5ID49IHltKSA8PCAxIHwgKHggPj0geG0pKSB7XG4gICAgICAgIHEgPSBxdWFkc1txdWFkcy5sZW5ndGggLSAxXTtcbiAgICAgICAgcXVhZHNbcXVhZHMubGVuZ3RoIC0gMV0gPSBxdWFkc1txdWFkcy5sZW5ndGggLSAxIC0gaV07XG4gICAgICAgIHF1YWRzW3F1YWRzLmxlbmd0aCAtIDEgLSBpXSA9IHE7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVmlzaXQgdGhpcyBwb2ludC4gKFZpc2l0aW5nIGNvaW5jaWRlbnQgcG9pbnRzIGlzbuKAmXQgbmVjZXNzYXJ5ISlcbiAgICBlbHNlIHtcbiAgICAgIHZhciBkeCA9IHggLSArdGhpcy5feC5jYWxsKG51bGwsIG5vZGUuZGF0YSksXG4gICAgICAgICAgZHkgPSB5IC0gK3RoaXMuX3kuY2FsbChudWxsLCBub2RlLmRhdGEpLFxuICAgICAgICAgIGQyID0gZHggKiBkeCArIGR5ICogZHk7XG4gICAgICBpZiAoZDIgPCByYWRpdXMpIHtcbiAgICAgICAgdmFyIGQgPSBNYXRoLnNxcnQocmFkaXVzID0gZDIpO1xuICAgICAgICB4MCA9IHggLSBkLCB5MCA9IHkgLSBkO1xuICAgICAgICB4MyA9IHggKyBkLCB5MyA9IHkgKyBkO1xuICAgICAgICBkYXRhID0gbm9kZS5kYXRhO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBkYXRhO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZCkge1xuICBpZiAoaXNOYU4oeCA9ICt0aGlzLl94LmNhbGwobnVsbCwgZCkpIHx8IGlzTmFOKHkgPSArdGhpcy5feS5jYWxsKG51bGwsIGQpKSkgcmV0dXJuIHRoaXM7IC8vIGlnbm9yZSBpbnZhbGlkIHBvaW50c1xuXG4gIHZhciBwYXJlbnQsXG4gICAgICBub2RlID0gdGhpcy5fcm9vdCxcbiAgICAgIHJldGFpbmVyLFxuICAgICAgcHJldmlvdXMsXG4gICAgICBuZXh0LFxuICAgICAgeDAgPSB0aGlzLl94MCxcbiAgICAgIHkwID0gdGhpcy5feTAsXG4gICAgICB4MSA9IHRoaXMuX3gxLFxuICAgICAgeTEgPSB0aGlzLl95MSxcbiAgICAgIHgsXG4gICAgICB5LFxuICAgICAgeG0sXG4gICAgICB5bSxcbiAgICAgIHJpZ2h0LFxuICAgICAgYm90dG9tLFxuICAgICAgaSxcbiAgICAgIGo7XG5cbiAgLy8gSWYgdGhlIHRyZWUgaXMgZW1wdHksIGluaXRpYWxpemUgdGhlIHJvb3QgYXMgYSBsZWFmLlxuICBpZiAoIW5vZGUpIHJldHVybiB0aGlzO1xuXG4gIC8vIEZpbmQgdGhlIGxlYWYgbm9kZSBmb3IgdGhlIHBvaW50LlxuICAvLyBXaGlsZSBkZXNjZW5kaW5nLCBhbHNvIHJldGFpbiB0aGUgZGVlcGVzdCBwYXJlbnQgd2l0aCBhIG5vbi1yZW1vdmVkIHNpYmxpbmcuXG4gIGlmIChub2RlLmxlbmd0aCkgd2hpbGUgKHRydWUpIHtcbiAgICBpZiAocmlnaHQgPSB4ID49ICh4bSA9ICh4MCArIHgxKSAvIDIpKSB4MCA9IHhtOyBlbHNlIHgxID0geG07XG4gICAgaWYgKGJvdHRvbSA9IHkgPj0gKHltID0gKHkwICsgeTEpIC8gMikpIHkwID0geW07IGVsc2UgeTEgPSB5bTtcbiAgICBpZiAoIShwYXJlbnQgPSBub2RlLCBub2RlID0gbm9kZVtpID0gYm90dG9tIDw8IDEgfCByaWdodF0pKSByZXR1cm4gdGhpcztcbiAgICBpZiAoIW5vZGUubGVuZ3RoKSBicmVhaztcbiAgICBpZiAocGFyZW50WyhpICsgMSkgJiAzXSB8fCBwYXJlbnRbKGkgKyAyKSAmIDNdIHx8IHBhcmVudFsoaSArIDMpICYgM10pIHJldGFpbmVyID0gcGFyZW50LCBqID0gaTtcbiAgfVxuXG4gIC8vIEZpbmQgdGhlIHBvaW50IHRvIHJlbW92ZS5cbiAgd2hpbGUgKG5vZGUuZGF0YSAhPT0gZCkgaWYgKCEocHJldmlvdXMgPSBub2RlLCBub2RlID0gbm9kZS5uZXh0KSkgcmV0dXJuIHRoaXM7XG4gIGlmIChuZXh0ID0gbm9kZS5uZXh0KSBkZWxldGUgbm9kZS5uZXh0O1xuXG4gIC8vIElmIHRoZXJlIGFyZSBtdWx0aXBsZSBjb2luY2lkZW50IHBvaW50cywgcmVtb3ZlIGp1c3QgdGhlIHBvaW50LlxuICBpZiAocHJldmlvdXMpIHJldHVybiAobmV4dCA/IHByZXZpb3VzLm5leHQgPSBuZXh0IDogZGVsZXRlIHByZXZpb3VzLm5leHQpLCB0aGlzO1xuXG4gIC8vIElmIHRoaXMgaXMgdGhlIHJvb3QgcG9pbnQsIHJlbW92ZSBpdC5cbiAgaWYgKCFwYXJlbnQpIHJldHVybiB0aGlzLl9yb290ID0gbmV4dCwgdGhpcztcblxuICAvLyBSZW1vdmUgdGhpcyBsZWFmLlxuICBuZXh0ID8gcGFyZW50W2ldID0gbmV4dCA6IGRlbGV0ZSBwYXJlbnRbaV07XG5cbiAgLy8gSWYgdGhlIHBhcmVudCBub3cgY29udGFpbnMgZXhhY3RseSBvbmUgbGVhZiwgY29sbGFwc2Ugc3VwZXJmbHVvdXMgcGFyZW50cy5cbiAgaWYgKChub2RlID0gcGFyZW50WzBdIHx8IHBhcmVudFsxXSB8fCBwYXJlbnRbMl0gfHwgcGFyZW50WzNdKVxuICAgICAgJiYgbm9kZSA9PT0gKHBhcmVudFszXSB8fCBwYXJlbnRbMl0gfHwgcGFyZW50WzFdIHx8IHBhcmVudFswXSlcbiAgICAgICYmICFub2RlLmxlbmd0aCkge1xuICAgIGlmIChyZXRhaW5lcikgcmV0YWluZXJbal0gPSBub2RlO1xuICAgIGVsc2UgdGhpcy5fcm9vdCA9IG5vZGU7XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUFsbChkYXRhKSB7XG4gIGZvciAodmFyIGkgPSAwLCBuID0gZGF0YS5sZW5ndGg7IGkgPCBuOyArK2kpIHRoaXMucmVtb3ZlKGRhdGFbaV0pO1xuICByZXR1cm4gdGhpcztcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5fcm9vdDtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICB2YXIgc2l6ZSA9IDA7XG4gIHRoaXMudmlzaXQoZnVuY3Rpb24obm9kZSkge1xuICAgIGlmICghbm9kZS5sZW5ndGgpIGRvICsrc2l6ZTsgd2hpbGUgKG5vZGUgPSBub2RlLm5leHQpXG4gIH0pO1xuICByZXR1cm4gc2l6ZTtcbn1cbiIsImltcG9ydCBRdWFkIGZyb20gXCIuL3F1YWQuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgdmFyIHF1YWRzID0gW10sIHEsIG5vZGUgPSB0aGlzLl9yb290LCBjaGlsZCwgeDAsIHkwLCB4MSwgeTE7XG4gIGlmIChub2RlKSBxdWFkcy5wdXNoKG5ldyBRdWFkKG5vZGUsIHRoaXMuX3gwLCB0aGlzLl95MCwgdGhpcy5feDEsIHRoaXMuX3kxKSk7XG4gIHdoaWxlIChxID0gcXVhZHMucG9wKCkpIHtcbiAgICBpZiAoIWNhbGxiYWNrKG5vZGUgPSBxLm5vZGUsIHgwID0gcS54MCwgeTAgPSBxLnkwLCB4MSA9IHEueDEsIHkxID0gcS55MSkgJiYgbm9kZS5sZW5ndGgpIHtcbiAgICAgIHZhciB4bSA9ICh4MCArIHgxKSAvIDIsIHltID0gKHkwICsgeTEpIC8gMjtcbiAgICAgIGlmIChjaGlsZCA9IG5vZGVbM10pIHF1YWRzLnB1c2gobmV3IFF1YWQoY2hpbGQsIHhtLCB5bSwgeDEsIHkxKSk7XG4gICAgICBpZiAoY2hpbGQgPSBub2RlWzJdKSBxdWFkcy5wdXNoKG5ldyBRdWFkKGNoaWxkLCB4MCwgeW0sIHhtLCB5MSkpO1xuICAgICAgaWYgKGNoaWxkID0gbm9kZVsxXSkgcXVhZHMucHVzaChuZXcgUXVhZChjaGlsZCwgeG0sIHkwLCB4MSwgeW0pKTtcbiAgICAgIGlmIChjaGlsZCA9IG5vZGVbMF0pIHF1YWRzLnB1c2gobmV3IFF1YWQoY2hpbGQsIHgwLCB5MCwgeG0sIHltKSk7XG4gICAgfVxuICB9XG4gIHJldHVybiB0aGlzO1xufVxuIiwiaW1wb3J0IFF1YWQgZnJvbSBcIi4vcXVhZC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihjYWxsYmFjaykge1xuICB2YXIgcXVhZHMgPSBbXSwgbmV4dCA9IFtdLCBxO1xuICBpZiAodGhpcy5fcm9vdCkgcXVhZHMucHVzaChuZXcgUXVhZCh0aGlzLl9yb290LCB0aGlzLl94MCwgdGhpcy5feTAsIHRoaXMuX3gxLCB0aGlzLl95MSkpO1xuICB3aGlsZSAocSA9IHF1YWRzLnBvcCgpKSB7XG4gICAgdmFyIG5vZGUgPSBxLm5vZGU7XG4gICAgaWYgKG5vZGUubGVuZ3RoKSB7XG4gICAgICB2YXIgY2hpbGQsIHgwID0gcS54MCwgeTAgPSBxLnkwLCB4MSA9IHEueDEsIHkxID0gcS55MSwgeG0gPSAoeDAgKyB4MSkgLyAyLCB5bSA9ICh5MCArIHkxKSAvIDI7XG4gICAgICBpZiAoY2hpbGQgPSBub2RlWzBdKSBxdWFkcy5wdXNoKG5ldyBRdWFkKGNoaWxkLCB4MCwgeTAsIHhtLCB5bSkpO1xuICAgICAgaWYgKGNoaWxkID0gbm9kZVsxXSkgcXVhZHMucHVzaChuZXcgUXVhZChjaGlsZCwgeG0sIHkwLCB4MSwgeW0pKTtcbiAgICAgIGlmIChjaGlsZCA9IG5vZGVbMl0pIHF1YWRzLnB1c2gobmV3IFF1YWQoY2hpbGQsIHgwLCB5bSwgeG0sIHkxKSk7XG4gICAgICBpZiAoY2hpbGQgPSBub2RlWzNdKSBxdWFkcy5wdXNoKG5ldyBRdWFkKGNoaWxkLCB4bSwgeW0sIHgxLCB5MSkpO1xuICAgIH1cbiAgICBuZXh0LnB1c2gocSk7XG4gIH1cbiAgd2hpbGUgKHEgPSBuZXh0LnBvcCgpKSB7XG4gICAgY2FsbGJhY2socS5ub2RlLCBxLngwLCBxLnkwLCBxLngxLCBxLnkxKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBkZWZhdWx0WChkKSB7XG4gIHJldHVybiBkWzBdO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihfKSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRoaXMuX3ggPSBfLCB0aGlzKSA6IHRoaXMuX3g7XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gZGVmYXVsdFkoZCkge1xuICByZXR1cm4gZFsxXTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oXykge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0aGlzLl95ID0gXywgdGhpcykgOiB0aGlzLl95O1xufVxuIiwiaW1wb3J0IHRyZWVfYWRkLCB7YWRkQWxsIGFzIHRyZWVfYWRkQWxsfSBmcm9tIFwiLi9hZGQuanNcIjtcbmltcG9ydCB0cmVlX2NvdmVyIGZyb20gXCIuL2NvdmVyLmpzXCI7XG5pbXBvcnQgdHJlZV9kYXRhIGZyb20gXCIuL2RhdGEuanNcIjtcbmltcG9ydCB0cmVlX2V4dGVudCBmcm9tIFwiLi9leHRlbnQuanNcIjtcbmltcG9ydCB0cmVlX2ZpbmQgZnJvbSBcIi4vZmluZC5qc1wiO1xuaW1wb3J0IHRyZWVfcmVtb3ZlLCB7cmVtb3ZlQWxsIGFzIHRyZWVfcmVtb3ZlQWxsfSBmcm9tIFwiLi9yZW1vdmUuanNcIjtcbmltcG9ydCB0cmVlX3Jvb3QgZnJvbSBcIi4vcm9vdC5qc1wiO1xuaW1wb3J0IHRyZWVfc2l6ZSBmcm9tIFwiLi9zaXplLmpzXCI7XG5pbXBvcnQgdHJlZV92aXNpdCBmcm9tIFwiLi92aXNpdC5qc1wiO1xuaW1wb3J0IHRyZWVfdmlzaXRBZnRlciBmcm9tIFwiLi92aXNpdEFmdGVyLmpzXCI7XG5pbXBvcnQgdHJlZV94LCB7ZGVmYXVsdFh9IGZyb20gXCIuL3guanNcIjtcbmltcG9ydCB0cmVlX3ksIHtkZWZhdWx0WX0gZnJvbSBcIi4veS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBxdWFkdHJlZShub2RlcywgeCwgeSkge1xuICB2YXIgdHJlZSA9IG5ldyBRdWFkdHJlZSh4ID09IG51bGwgPyBkZWZhdWx0WCA6IHgsIHkgPT0gbnVsbCA/IGRlZmF1bHRZIDogeSwgTmFOLCBOYU4sIE5hTiwgTmFOKTtcbiAgcmV0dXJuIG5vZGVzID09IG51bGwgPyB0cmVlIDogdHJlZS5hZGRBbGwobm9kZXMpO1xufVxuXG5mdW5jdGlvbiBRdWFkdHJlZSh4LCB5LCB4MCwgeTAsIHgxLCB5MSkge1xuICB0aGlzLl94ID0geDtcbiAgdGhpcy5feSA9IHk7XG4gIHRoaXMuX3gwID0geDA7XG4gIHRoaXMuX3kwID0geTA7XG4gIHRoaXMuX3gxID0geDE7XG4gIHRoaXMuX3kxID0geTE7XG4gIHRoaXMuX3Jvb3QgPSB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGxlYWZfY29weShsZWFmKSB7XG4gIHZhciBjb3B5ID0ge2RhdGE6IGxlYWYuZGF0YX0sIG5leHQgPSBjb3B5O1xuICB3aGlsZSAobGVhZiA9IGxlYWYubmV4dCkgbmV4dCA9IG5leHQubmV4dCA9IHtkYXRhOiBsZWFmLmRhdGF9O1xuICByZXR1cm4gY29weTtcbn1cblxudmFyIHRyZWVQcm90byA9IHF1YWR0cmVlLnByb3RvdHlwZSA9IFF1YWR0cmVlLnByb3RvdHlwZTtcblxudHJlZVByb3RvLmNvcHkgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGNvcHkgPSBuZXcgUXVhZHRyZWUodGhpcy5feCwgdGhpcy5feSwgdGhpcy5feDAsIHRoaXMuX3kwLCB0aGlzLl94MSwgdGhpcy5feTEpLFxuICAgICAgbm9kZSA9IHRoaXMuX3Jvb3QsXG4gICAgICBub2RlcyxcbiAgICAgIGNoaWxkO1xuXG4gIGlmICghbm9kZSkgcmV0dXJuIGNvcHk7XG5cbiAgaWYgKCFub2RlLmxlbmd0aCkgcmV0dXJuIGNvcHkuX3Jvb3QgPSBsZWFmX2NvcHkobm9kZSksIGNvcHk7XG5cbiAgbm9kZXMgPSBbe3NvdXJjZTogbm9kZSwgdGFyZ2V0OiBjb3B5Ll9yb290ID0gbmV3IEFycmF5KDQpfV07XG4gIHdoaWxlIChub2RlID0gbm9kZXMucG9wKCkpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IDQ7ICsraSkge1xuICAgICAgaWYgKGNoaWxkID0gbm9kZS5zb3VyY2VbaV0pIHtcbiAgICAgICAgaWYgKGNoaWxkLmxlbmd0aCkgbm9kZXMucHVzaCh7c291cmNlOiBjaGlsZCwgdGFyZ2V0OiBub2RlLnRhcmdldFtpXSA9IG5ldyBBcnJheSg0KX0pO1xuICAgICAgICBlbHNlIG5vZGUudGFyZ2V0W2ldID0gbGVhZl9jb3B5KGNoaWxkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gY29weTtcbn07XG5cbnRyZWVQcm90by5hZGQgPSB0cmVlX2FkZDtcbnRyZWVQcm90by5hZGRBbGwgPSB0cmVlX2FkZEFsbDtcbnRyZWVQcm90by5jb3ZlciA9IHRyZWVfY292ZXI7XG50cmVlUHJvdG8uZGF0YSA9IHRyZWVfZGF0YTtcbnRyZWVQcm90by5leHRlbnQgPSB0cmVlX2V4dGVudDtcbnRyZWVQcm90by5maW5kID0gdHJlZV9maW5kO1xudHJlZVByb3RvLnJlbW92ZSA9IHRyZWVfcmVtb3ZlO1xudHJlZVByb3RvLnJlbW92ZUFsbCA9IHRyZWVfcmVtb3ZlQWxsO1xudHJlZVByb3RvLnJvb3QgPSB0cmVlX3Jvb3Q7XG50cmVlUHJvdG8uc2l6ZSA9IHRyZWVfc2l6ZTtcbnRyZWVQcm90by52aXNpdCA9IHRyZWVfdmlzaXQ7XG50cmVlUHJvdG8udmlzaXRBZnRlciA9IHRyZWVfdmlzaXRBZnRlcjtcbnRyZWVQcm90by54ID0gdHJlZV94O1xudHJlZVByb3RvLnkgPSB0cmVlX3k7XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbih4KSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4geDtcbiAgfTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHJhbmRvbSkge1xuICByZXR1cm4gKHJhbmRvbSgpIC0gMC41KSAqIDFlLTY7XG59XG4iLCJ2YXIgbm9vcCA9IHt2YWx1ZTogKCkgPT4ge319O1xuXG5mdW5jdGlvbiBkaXNwYXRjaCgpIHtcbiAgZm9yICh2YXIgaSA9IDAsIG4gPSBhcmd1bWVudHMubGVuZ3RoLCBfID0ge30sIHQ7IGkgPCBuOyArK2kpIHtcbiAgICBpZiAoISh0ID0gYXJndW1lbnRzW2ldICsgXCJcIikgfHwgKHQgaW4gXykgfHwgL1tcXHMuXS8udGVzdCh0KSkgdGhyb3cgbmV3IEVycm9yKFwiaWxsZWdhbCB0eXBlOiBcIiArIHQpO1xuICAgIF9bdF0gPSBbXTtcbiAgfVxuICByZXR1cm4gbmV3IERpc3BhdGNoKF8pO1xufVxuXG5mdW5jdGlvbiBEaXNwYXRjaChfKSB7XG4gIHRoaXMuXyA9IF87XG59XG5cbmZ1bmN0aW9uIHBhcnNlVHlwZW5hbWVzKHR5cGVuYW1lcywgdHlwZXMpIHtcbiAgcmV0dXJuIHR5cGVuYW1lcy50cmltKCkuc3BsaXQoL158XFxzKy8pLm1hcChmdW5jdGlvbih0KSB7XG4gICAgdmFyIG5hbWUgPSBcIlwiLCBpID0gdC5pbmRleE9mKFwiLlwiKTtcbiAgICBpZiAoaSA+PSAwKSBuYW1lID0gdC5zbGljZShpICsgMSksIHQgPSB0LnNsaWNlKDAsIGkpO1xuICAgIGlmICh0ICYmICF0eXBlcy5oYXNPd25Qcm9wZXJ0eSh0KSkgdGhyb3cgbmV3IEVycm9yKFwidW5rbm93biB0eXBlOiBcIiArIHQpO1xuICAgIHJldHVybiB7dHlwZTogdCwgbmFtZTogbmFtZX07XG4gIH0pO1xufVxuXG5EaXNwYXRjaC5wcm90b3R5cGUgPSBkaXNwYXRjaC5wcm90b3R5cGUgPSB7XG4gIGNvbnN0cnVjdG9yOiBEaXNwYXRjaCxcbiAgb246IGZ1bmN0aW9uKHR5cGVuYW1lLCBjYWxsYmFjaykge1xuICAgIHZhciBfID0gdGhpcy5fLFxuICAgICAgICBUID0gcGFyc2VUeXBlbmFtZXModHlwZW5hbWUgKyBcIlwiLCBfKSxcbiAgICAgICAgdCxcbiAgICAgICAgaSA9IC0xLFxuICAgICAgICBuID0gVC5sZW5ndGg7XG5cbiAgICAvLyBJZiBubyBjYWxsYmFjayB3YXMgc3BlY2lmaWVkLCByZXR1cm4gdGhlIGNhbGxiYWNrIG9mIHRoZSBnaXZlbiB0eXBlIGFuZCBuYW1lLlxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikge1xuICAgICAgd2hpbGUgKCsraSA8IG4pIGlmICgodCA9ICh0eXBlbmFtZSA9IFRbaV0pLnR5cGUpICYmICh0ID0gZ2V0KF9bdF0sIHR5cGVuYW1lLm5hbWUpKSkgcmV0dXJuIHQ7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSWYgYSB0eXBlIHdhcyBzcGVjaWZpZWQsIHNldCB0aGUgY2FsbGJhY2sgZm9yIHRoZSBnaXZlbiB0eXBlIGFuZCBuYW1lLlxuICAgIC8vIE90aGVyd2lzZSwgaWYgYSBudWxsIGNhbGxiYWNrIHdhcyBzcGVjaWZpZWQsIHJlbW92ZSBjYWxsYmFja3Mgb2YgdGhlIGdpdmVuIG5hbWUuXG4gICAgaWYgKGNhbGxiYWNrICE9IG51bGwgJiYgdHlwZW9mIGNhbGxiYWNrICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBFcnJvcihcImludmFsaWQgY2FsbGJhY2s6IFwiICsgY2FsbGJhY2spO1xuICAgIHdoaWxlICgrK2kgPCBuKSB7XG4gICAgICBpZiAodCA9ICh0eXBlbmFtZSA9IFRbaV0pLnR5cGUpIF9bdF0gPSBzZXQoX1t0XSwgdHlwZW5hbWUubmFtZSwgY2FsbGJhY2spO1xuICAgICAgZWxzZSBpZiAoY2FsbGJhY2sgPT0gbnVsbCkgZm9yICh0IGluIF8pIF9bdF0gPSBzZXQoX1t0XSwgdHlwZW5hbWUubmFtZSwgbnVsbCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIGNvcHk6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBjb3B5ID0ge30sIF8gPSB0aGlzLl87XG4gICAgZm9yICh2YXIgdCBpbiBfKSBjb3B5W3RdID0gX1t0XS5zbGljZSgpO1xuICAgIHJldHVybiBuZXcgRGlzcGF0Y2goY29weSk7XG4gIH0sXG4gIGNhbGw6IGZ1bmN0aW9uKHR5cGUsIHRoYXQpIHtcbiAgICBpZiAoKG4gPSBhcmd1bWVudHMubGVuZ3RoIC0gMikgPiAwKSBmb3IgKHZhciBhcmdzID0gbmV3IEFycmF5KG4pLCBpID0gMCwgbiwgdDsgaSA8IG47ICsraSkgYXJnc1tpXSA9IGFyZ3VtZW50c1tpICsgMl07XG4gICAgaWYgKCF0aGlzLl8uaGFzT3duUHJvcGVydHkodHlwZSkpIHRocm93IG5ldyBFcnJvcihcInVua25vd24gdHlwZTogXCIgKyB0eXBlKTtcbiAgICBmb3IgKHQgPSB0aGlzLl9bdHlwZV0sIGkgPSAwLCBuID0gdC5sZW5ndGg7IGkgPCBuOyArK2kpIHRbaV0udmFsdWUuYXBwbHkodGhhdCwgYXJncyk7XG4gIH0sXG4gIGFwcGx5OiBmdW5jdGlvbih0eXBlLCB0aGF0LCBhcmdzKSB7XG4gICAgaWYgKCF0aGlzLl8uaGFzT3duUHJvcGVydHkodHlwZSkpIHRocm93IG5ldyBFcnJvcihcInVua25vd24gdHlwZTogXCIgKyB0eXBlKTtcbiAgICBmb3IgKHZhciB0ID0gdGhpcy5fW3R5cGVdLCBpID0gMCwgbiA9IHQubGVuZ3RoOyBpIDwgbjsgKytpKSB0W2ldLnZhbHVlLmFwcGx5KHRoYXQsIGFyZ3MpO1xuICB9XG59O1xuXG5mdW5jdGlvbiBnZXQodHlwZSwgbmFtZSkge1xuICBmb3IgKHZhciBpID0gMCwgbiA9IHR5cGUubGVuZ3RoLCBjOyBpIDwgbjsgKytpKSB7XG4gICAgaWYgKChjID0gdHlwZVtpXSkubmFtZSA9PT0gbmFtZSkge1xuICAgICAgcmV0dXJuIGMudmFsdWU7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNldCh0eXBlLCBuYW1lLCBjYWxsYmFjaykge1xuICBmb3IgKHZhciBpID0gMCwgbiA9IHR5cGUubGVuZ3RoOyBpIDwgbjsgKytpKSB7XG4gICAgaWYgKHR5cGVbaV0ubmFtZSA9PT0gbmFtZSkge1xuICAgICAgdHlwZVtpXSA9IG5vb3AsIHR5cGUgPSB0eXBlLnNsaWNlKDAsIGkpLmNvbmNhdCh0eXBlLnNsaWNlKGkgKyAxKSk7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgaWYgKGNhbGxiYWNrICE9IG51bGwpIHR5cGUucHVzaCh7bmFtZTogbmFtZSwgdmFsdWU6IGNhbGxiYWNrfSk7XG4gIHJldHVybiB0eXBlO1xufVxuXG5leHBvcnQgZGVmYXVsdCBkaXNwYXRjaDtcbiIsInZhciBmcmFtZSA9IDAsIC8vIGlzIGFuIGFuaW1hdGlvbiBmcmFtZSBwZW5kaW5nP1xuICAgIHRpbWVvdXQgPSAwLCAvLyBpcyBhIHRpbWVvdXQgcGVuZGluZz9cbiAgICBpbnRlcnZhbCA9IDAsIC8vIGFyZSBhbnkgdGltZXJzIGFjdGl2ZT9cbiAgICBwb2tlRGVsYXkgPSAxMDAwLCAvLyBob3cgZnJlcXVlbnRseSB3ZSBjaGVjayBmb3IgY2xvY2sgc2tld1xuICAgIHRhc2tIZWFkLFxuICAgIHRhc2tUYWlsLFxuICAgIGNsb2NrTGFzdCA9IDAsXG4gICAgY2xvY2tOb3cgPSAwLFxuICAgIGNsb2NrU2tldyA9IDAsXG4gICAgY2xvY2sgPSB0eXBlb2YgcGVyZm9ybWFuY2UgPT09IFwib2JqZWN0XCIgJiYgcGVyZm9ybWFuY2Uubm93ID8gcGVyZm9ybWFuY2UgOiBEYXRlLFxuICAgIHNldEZyYW1lID0gdHlwZW9mIHdpbmRvdyA9PT0gXCJvYmplY3RcIiAmJiB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lID8gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZS5iaW5kKHdpbmRvdykgOiBmdW5jdGlvbihmKSB7IHNldFRpbWVvdXQoZiwgMTcpOyB9O1xuXG5leHBvcnQgZnVuY3Rpb24gbm93KCkge1xuICByZXR1cm4gY2xvY2tOb3cgfHwgKHNldEZyYW1lKGNsZWFyTm93KSwgY2xvY2tOb3cgPSBjbG9jay5ub3coKSArIGNsb2NrU2tldyk7XG59XG5cbmZ1bmN0aW9uIGNsZWFyTm93KCkge1xuICBjbG9ja05vdyA9IDA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBUaW1lcigpIHtcbiAgdGhpcy5fY2FsbCA9XG4gIHRoaXMuX3RpbWUgPVxuICB0aGlzLl9uZXh0ID0gbnVsbDtcbn1cblxuVGltZXIucHJvdG90eXBlID0gdGltZXIucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogVGltZXIsXG4gIHJlc3RhcnQ6IGZ1bmN0aW9uKGNhbGxiYWNrLCBkZWxheSwgdGltZSkge1xuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcImNhbGxiYWNrIGlzIG5vdCBhIGZ1bmN0aW9uXCIpO1xuICAgIHRpbWUgPSAodGltZSA9PSBudWxsID8gbm93KCkgOiArdGltZSkgKyAoZGVsYXkgPT0gbnVsbCA/IDAgOiArZGVsYXkpO1xuICAgIGlmICghdGhpcy5fbmV4dCAmJiB0YXNrVGFpbCAhPT0gdGhpcykge1xuICAgICAgaWYgKHRhc2tUYWlsKSB0YXNrVGFpbC5fbmV4dCA9IHRoaXM7XG4gICAgICBlbHNlIHRhc2tIZWFkID0gdGhpcztcbiAgICAgIHRhc2tUYWlsID0gdGhpcztcbiAgICB9XG4gICAgdGhpcy5fY2FsbCA9IGNhbGxiYWNrO1xuICAgIHRoaXMuX3RpbWUgPSB0aW1lO1xuICAgIHNsZWVwKCk7XG4gIH0sXG4gIHN0b3A6IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLl9jYWxsKSB7XG4gICAgICB0aGlzLl9jYWxsID0gbnVsbDtcbiAgICAgIHRoaXMuX3RpbWUgPSBJbmZpbml0eTtcbiAgICAgIHNsZWVwKCk7XG4gICAgfVxuICB9XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gdGltZXIoY2FsbGJhY2ssIGRlbGF5LCB0aW1lKSB7XG4gIHZhciB0ID0gbmV3IFRpbWVyO1xuICB0LnJlc3RhcnQoY2FsbGJhY2ssIGRlbGF5LCB0aW1lKTtcbiAgcmV0dXJuIHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0aW1lckZsdXNoKCkge1xuICBub3coKTsgLy8gR2V0IHRoZSBjdXJyZW50IHRpbWUsIGlmIG5vdCBhbHJlYWR5IHNldC5cbiAgKytmcmFtZTsgLy8gUHJldGVuZCB3ZeKAmXZlIHNldCBhbiBhbGFybSwgaWYgd2UgaGF2ZW7igJl0IGFscmVhZHkuXG4gIHZhciB0ID0gdGFza0hlYWQsIGU7XG4gIHdoaWxlICh0KSB7XG4gICAgaWYgKChlID0gY2xvY2tOb3cgLSB0Ll90aW1lKSA+PSAwKSB0Ll9jYWxsLmNhbGwobnVsbCwgZSk7XG4gICAgdCA9IHQuX25leHQ7XG4gIH1cbiAgLS1mcmFtZTtcbn1cblxuZnVuY3Rpb24gd2FrZSgpIHtcbiAgY2xvY2tOb3cgPSAoY2xvY2tMYXN0ID0gY2xvY2subm93KCkpICsgY2xvY2tTa2V3O1xuICBmcmFtZSA9IHRpbWVvdXQgPSAwO1xuICB0cnkge1xuICAgIHRpbWVyRmx1c2goKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBmcmFtZSA9IDA7XG4gICAgbmFwKCk7XG4gICAgY2xvY2tOb3cgPSAwO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBva2UoKSB7XG4gIHZhciBub3cgPSBjbG9jay5ub3coKSwgZGVsYXkgPSBub3cgLSBjbG9ja0xhc3Q7XG4gIGlmIChkZWxheSA+IHBva2VEZWxheSkgY2xvY2tTa2V3IC09IGRlbGF5LCBjbG9ja0xhc3QgPSBub3c7XG59XG5cbmZ1bmN0aW9uIG5hcCgpIHtcbiAgdmFyIHQwLCB0MSA9IHRhc2tIZWFkLCB0MiwgdGltZSA9IEluZmluaXR5O1xuICB3aGlsZSAodDEpIHtcbiAgICBpZiAodDEuX2NhbGwpIHtcbiAgICAgIGlmICh0aW1lID4gdDEuX3RpbWUpIHRpbWUgPSB0MS5fdGltZTtcbiAgICAgIHQwID0gdDEsIHQxID0gdDEuX25leHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHQyID0gdDEuX25leHQsIHQxLl9uZXh0ID0gbnVsbDtcbiAgICAgIHQxID0gdDAgPyB0MC5fbmV4dCA9IHQyIDogdGFza0hlYWQgPSB0MjtcbiAgICB9XG4gIH1cbiAgdGFza1RhaWwgPSB0MDtcbiAgc2xlZXAodGltZSk7XG59XG5cbmZ1bmN0aW9uIHNsZWVwKHRpbWUpIHtcbiAgaWYgKGZyYW1lKSByZXR1cm47IC8vIFNvb25lc3QgYWxhcm0gYWxyZWFkeSBzZXQsIG9yIHdpbGwgYmUuXG4gIGlmICh0aW1lb3V0KSB0aW1lb3V0ID0gY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICB2YXIgZGVsYXkgPSB0aW1lIC0gY2xvY2tOb3c7IC8vIFN0cmljdGx5IGxlc3MgdGhhbiBpZiB3ZSByZWNvbXB1dGVkIGNsb2NrTm93LlxuICBpZiAoZGVsYXkgPiAyNCkge1xuICAgIGlmICh0aW1lIDwgSW5maW5pdHkpIHRpbWVvdXQgPSBzZXRUaW1lb3V0KHdha2UsIHRpbWUgLSBjbG9jay5ub3coKSAtIGNsb2NrU2tldyk7XG4gICAgaWYgKGludGVydmFsKSBpbnRlcnZhbCA9IGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICB9IGVsc2Uge1xuICAgIGlmICghaW50ZXJ2YWwpIGNsb2NrTGFzdCA9IGNsb2NrLm5vdygpLCBpbnRlcnZhbCA9IHNldEludGVydmFsKHBva2UsIHBva2VEZWxheSk7XG4gICAgZnJhbWUgPSAxLCBzZXRGcmFtZSh3YWtlKTtcbiAgfVxufVxuIiwiLy8gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTGluZWFyX2NvbmdydWVudGlhbF9nZW5lcmF0b3IjUGFyYW1ldGVyc19pbl9jb21tb25fdXNlXG5jb25zdCBhID0gMTY2NDUyNTtcbmNvbnN0IGMgPSAxMDEzOTA0MjIzO1xuY29uc3QgbSA9IDQyOTQ5NjcyOTY7IC8vIDJeMzJcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIGxldCBzID0gMTtcbiAgcmV0dXJuICgpID0+IChzID0gKGEgKiBzICsgYykgJSBtKSAvIG07XG59XG4iLCJpbXBvcnQge2Rpc3BhdGNofSBmcm9tIFwiZDMtZGlzcGF0Y2hcIjtcbmltcG9ydCB7dGltZXJ9IGZyb20gXCJkMy10aW1lclwiO1xuaW1wb3J0IGxjZyBmcm9tIFwiLi9sY2cuanNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIHgoZCkge1xuICByZXR1cm4gZC54O1xufVxuXG5leHBvcnQgZnVuY3Rpb24geShkKSB7XG4gIHJldHVybiBkLnk7XG59XG5cbnZhciBpbml0aWFsUmFkaXVzID0gMTAsXG4gICAgaW5pdGlhbEFuZ2xlID0gTWF0aC5QSSAqICgzIC0gTWF0aC5zcXJ0KDUpKTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obm9kZXMpIHtcbiAgdmFyIHNpbXVsYXRpb24sXG4gICAgICBhbHBoYSA9IDEsXG4gICAgICBhbHBoYU1pbiA9IDAuMDAxLFxuICAgICAgYWxwaGFEZWNheSA9IDEgLSBNYXRoLnBvdyhhbHBoYU1pbiwgMSAvIDMwMCksXG4gICAgICBhbHBoYVRhcmdldCA9IDAsXG4gICAgICB2ZWxvY2l0eURlY2F5ID0gMC42LFxuICAgICAgZm9yY2VzID0gbmV3IE1hcCgpLFxuICAgICAgc3RlcHBlciA9IHRpbWVyKHN0ZXApLFxuICAgICAgZXZlbnQgPSBkaXNwYXRjaChcInRpY2tcIiwgXCJlbmRcIiksXG4gICAgICByYW5kb20gPSBsY2coKTtcblxuICBpZiAobm9kZXMgPT0gbnVsbCkgbm9kZXMgPSBbXTtcblxuICBmdW5jdGlvbiBzdGVwKCkge1xuICAgIHRpY2soKTtcbiAgICBldmVudC5jYWxsKFwidGlja1wiLCBzaW11bGF0aW9uKTtcbiAgICBpZiAoYWxwaGEgPCBhbHBoYU1pbikge1xuICAgICAgc3RlcHBlci5zdG9wKCk7XG4gICAgICBldmVudC5jYWxsKFwiZW5kXCIsIHNpbXVsYXRpb24pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHRpY2soaXRlcmF0aW9ucykge1xuICAgIHZhciBpLCBuID0gbm9kZXMubGVuZ3RoLCBub2RlO1xuXG4gICAgaWYgKGl0ZXJhdGlvbnMgPT09IHVuZGVmaW5lZCkgaXRlcmF0aW9ucyA9IDE7XG5cbiAgICBmb3IgKHZhciBrID0gMDsgayA8IGl0ZXJhdGlvbnM7ICsraykge1xuICAgICAgYWxwaGEgKz0gKGFscGhhVGFyZ2V0IC0gYWxwaGEpICogYWxwaGFEZWNheTtcblxuICAgICAgZm9yY2VzLmZvckVhY2goZnVuY3Rpb24oZm9yY2UpIHtcbiAgICAgICAgZm9yY2UoYWxwaGEpO1xuICAgICAgfSk7XG5cbiAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgICAgbm9kZSA9IG5vZGVzW2ldO1xuICAgICAgICBpZiAobm9kZS5meCA9PSBudWxsKSBub2RlLnggKz0gbm9kZS52eCAqPSB2ZWxvY2l0eURlY2F5O1xuICAgICAgICBlbHNlIG5vZGUueCA9IG5vZGUuZngsIG5vZGUudnggPSAwO1xuICAgICAgICBpZiAobm9kZS5meSA9PSBudWxsKSBub2RlLnkgKz0gbm9kZS52eSAqPSB2ZWxvY2l0eURlY2F5O1xuICAgICAgICBlbHNlIG5vZGUueSA9IG5vZGUuZnksIG5vZGUudnkgPSAwO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzaW11bGF0aW9uO1xuICB9XG5cbiAgZnVuY3Rpb24gaW5pdGlhbGl6ZU5vZGVzKCkge1xuICAgIGZvciAodmFyIGkgPSAwLCBuID0gbm9kZXMubGVuZ3RoLCBub2RlOyBpIDwgbjsgKytpKSB7XG4gICAgICBub2RlID0gbm9kZXNbaV0sIG5vZGUuaW5kZXggPSBpO1xuICAgICAgaWYgKG5vZGUuZnggIT0gbnVsbCkgbm9kZS54ID0gbm9kZS5meDtcbiAgICAgIGlmIChub2RlLmZ5ICE9IG51bGwpIG5vZGUueSA9IG5vZGUuZnk7XG4gICAgICBpZiAoaXNOYU4obm9kZS54KSB8fCBpc05hTihub2RlLnkpKSB7XG4gICAgICAgIHZhciByYWRpdXMgPSBpbml0aWFsUmFkaXVzICogTWF0aC5zcXJ0KDAuNSArIGkpLCBhbmdsZSA9IGkgKiBpbml0aWFsQW5nbGU7XG4gICAgICAgIG5vZGUueCA9IHJhZGl1cyAqIE1hdGguY29zKGFuZ2xlKTtcbiAgICAgICAgbm9kZS55ID0gcmFkaXVzICogTWF0aC5zaW4oYW5nbGUpO1xuICAgICAgfVxuICAgICAgaWYgKGlzTmFOKG5vZGUudngpIHx8IGlzTmFOKG5vZGUudnkpKSB7XG4gICAgICAgIG5vZGUudnggPSBub2RlLnZ5ID0gMDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBpbml0aWFsaXplRm9yY2UoZm9yY2UpIHtcbiAgICBpZiAoZm9yY2UuaW5pdGlhbGl6ZSkgZm9yY2UuaW5pdGlhbGl6ZShub2RlcywgcmFuZG9tKTtcbiAgICByZXR1cm4gZm9yY2U7XG4gIH1cblxuICBpbml0aWFsaXplTm9kZXMoKTtcblxuICByZXR1cm4gc2ltdWxhdGlvbiA9IHtcbiAgICB0aWNrOiB0aWNrLFxuXG4gICAgcmVzdGFydDogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gc3RlcHBlci5yZXN0YXJ0KHN0ZXApLCBzaW11bGF0aW9uO1xuICAgIH0sXG5cbiAgICBzdG9wOiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBzdGVwcGVyLnN0b3AoKSwgc2ltdWxhdGlvbjtcbiAgICB9LFxuXG4gICAgbm9kZXM6IGZ1bmN0aW9uKF8pIHtcbiAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG5vZGVzID0gXywgaW5pdGlhbGl6ZU5vZGVzKCksIGZvcmNlcy5mb3JFYWNoKGluaXRpYWxpemVGb3JjZSksIHNpbXVsYXRpb24pIDogbm9kZXM7XG4gICAgfSxcblxuICAgIGFscGhhOiBmdW5jdGlvbihfKSB7XG4gICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChhbHBoYSA9ICtfLCBzaW11bGF0aW9uKSA6IGFscGhhO1xuICAgIH0sXG5cbiAgICBhbHBoYU1pbjogZnVuY3Rpb24oXykge1xuICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoYWxwaGFNaW4gPSArXywgc2ltdWxhdGlvbikgOiBhbHBoYU1pbjtcbiAgICB9LFxuXG4gICAgYWxwaGFEZWNheTogZnVuY3Rpb24oXykge1xuICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoYWxwaGFEZWNheSA9ICtfLCBzaW11bGF0aW9uKSA6ICthbHBoYURlY2F5O1xuICAgIH0sXG5cbiAgICBhbHBoYVRhcmdldDogZnVuY3Rpb24oXykge1xuICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoYWxwaGFUYXJnZXQgPSArXywgc2ltdWxhdGlvbikgOiBhbHBoYVRhcmdldDtcbiAgICB9LFxuXG4gICAgdmVsb2NpdHlEZWNheTogZnVuY3Rpb24oXykge1xuICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodmVsb2NpdHlEZWNheSA9IDEgLSBfLCBzaW11bGF0aW9uKSA6IDEgLSB2ZWxvY2l0eURlY2F5O1xuICAgIH0sXG5cbiAgICByYW5kb21Tb3VyY2U6IGZ1bmN0aW9uKF8pIHtcbiAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHJhbmRvbSA9IF8sIGZvcmNlcy5mb3JFYWNoKGluaXRpYWxpemVGb3JjZSksIHNpbXVsYXRpb24pIDogcmFuZG9tO1xuICAgIH0sXG5cbiAgICBmb3JjZTogZnVuY3Rpb24obmFtZSwgXykge1xuICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gKChfID09IG51bGwgPyBmb3JjZXMuZGVsZXRlKG5hbWUpIDogZm9yY2VzLnNldChuYW1lLCBpbml0aWFsaXplRm9yY2UoXykpKSwgc2ltdWxhdGlvbikgOiBmb3JjZXMuZ2V0KG5hbWUpO1xuICAgIH0sXG5cbiAgICBmaW5kOiBmdW5jdGlvbih4LCB5LCByYWRpdXMpIHtcbiAgICAgIHZhciBpID0gMCxcbiAgICAgICAgICBuID0gbm9kZXMubGVuZ3RoLFxuICAgICAgICAgIGR4LFxuICAgICAgICAgIGR5LFxuICAgICAgICAgIGQyLFxuICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgY2xvc2VzdDtcblxuICAgICAgaWYgKHJhZGl1cyA9PSBudWxsKSByYWRpdXMgPSBJbmZpbml0eTtcbiAgICAgIGVsc2UgcmFkaXVzICo9IHJhZGl1cztcblxuICAgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgICBub2RlID0gbm9kZXNbaV07XG4gICAgICAgIGR4ID0geCAtIG5vZGUueDtcbiAgICAgICAgZHkgPSB5IC0gbm9kZS55O1xuICAgICAgICBkMiA9IGR4ICogZHggKyBkeSAqIGR5O1xuICAgICAgICBpZiAoZDIgPCByYWRpdXMpIGNsb3Nlc3QgPSBub2RlLCByYWRpdXMgPSBkMjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNsb3Nlc3Q7XG4gICAgfSxcblxuICAgIG9uOiBmdW5jdGlvbihuYW1lLCBfKSB7XG4gICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyAoZXZlbnQub24obmFtZSwgXyksIHNpbXVsYXRpb24pIDogZXZlbnQub24obmFtZSk7XG4gICAgfVxuICB9O1xufVxuIiwiaW1wb3J0IHtxdWFkdHJlZX0gZnJvbSBcImQzLXF1YWR0cmVlXCI7XG5pbXBvcnQgY29uc3RhbnQgZnJvbSBcIi4vY29uc3RhbnQuanNcIjtcbmltcG9ydCBqaWdnbGUgZnJvbSBcIi4vamlnZ2xlLmpzXCI7XG5pbXBvcnQge3gsIHl9IGZyb20gXCIuL3NpbXVsYXRpb24uanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHZhciBub2RlcyxcbiAgICAgIG5vZGUsXG4gICAgICByYW5kb20sXG4gICAgICBhbHBoYSxcbiAgICAgIHN0cmVuZ3RoID0gY29uc3RhbnQoLTMwKSxcbiAgICAgIHN0cmVuZ3RocyxcbiAgICAgIGRpc3RhbmNlTWluMiA9IDEsXG4gICAgICBkaXN0YW5jZU1heDIgPSBJbmZpbml0eSxcbiAgICAgIHRoZXRhMiA9IDAuODE7XG5cbiAgZnVuY3Rpb24gZm9yY2UoXykge1xuICAgIHZhciBpLCBuID0gbm9kZXMubGVuZ3RoLCB0cmVlID0gcXVhZHRyZWUobm9kZXMsIHgsIHkpLnZpc2l0QWZ0ZXIoYWNjdW11bGF0ZSk7XG4gICAgZm9yIChhbHBoYSA9IF8sIGkgPSAwOyBpIDwgbjsgKytpKSBub2RlID0gbm9kZXNbaV0sIHRyZWUudmlzaXQoYXBwbHkpO1xuICB9XG5cbiAgZnVuY3Rpb24gaW5pdGlhbGl6ZSgpIHtcbiAgICBpZiAoIW5vZGVzKSByZXR1cm47XG4gICAgdmFyIGksIG4gPSBub2Rlcy5sZW5ndGgsIG5vZGU7XG4gICAgc3RyZW5ndGhzID0gbmV3IEFycmF5KG4pO1xuICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIG5vZGUgPSBub2Rlc1tpXSwgc3RyZW5ndGhzW25vZGUuaW5kZXhdID0gK3N0cmVuZ3RoKG5vZGUsIGksIG5vZGVzKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFjY3VtdWxhdGUocXVhZCkge1xuICAgIHZhciBzdHJlbmd0aCA9IDAsIHEsIGMsIHdlaWdodCA9IDAsIHgsIHksIGk7XG5cbiAgICAvLyBGb3IgaW50ZXJuYWwgbm9kZXMsIGFjY3VtdWxhdGUgZm9yY2VzIGZyb20gY2hpbGQgcXVhZHJhbnRzLlxuICAgIGlmIChxdWFkLmxlbmd0aCkge1xuICAgICAgZm9yICh4ID0geSA9IGkgPSAwOyBpIDwgNDsgKytpKSB7XG4gICAgICAgIGlmICgocSA9IHF1YWRbaV0pICYmIChjID0gTWF0aC5hYnMocS52YWx1ZSkpKSB7XG4gICAgICAgICAgc3RyZW5ndGggKz0gcS52YWx1ZSwgd2VpZ2h0ICs9IGMsIHggKz0gYyAqIHEueCwgeSArPSBjICogcS55O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBxdWFkLnggPSB4IC8gd2VpZ2h0O1xuICAgICAgcXVhZC55ID0geSAvIHdlaWdodDtcbiAgICB9XG5cbiAgICAvLyBGb3IgbGVhZiBub2RlcywgYWNjdW11bGF0ZSBmb3JjZXMgZnJvbSBjb2luY2lkZW50IHF1YWRyYW50cy5cbiAgICBlbHNlIHtcbiAgICAgIHEgPSBxdWFkO1xuICAgICAgcS54ID0gcS5kYXRhLng7XG4gICAgICBxLnkgPSBxLmRhdGEueTtcbiAgICAgIGRvIHN0cmVuZ3RoICs9IHN0cmVuZ3Roc1txLmRhdGEuaW5kZXhdO1xuICAgICAgd2hpbGUgKHEgPSBxLm5leHQpO1xuICAgIH1cblxuICAgIHF1YWQudmFsdWUgPSBzdHJlbmd0aDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFwcGx5KHF1YWQsIHgxLCBfLCB4Mikge1xuICAgIGlmICghcXVhZC52YWx1ZSkgcmV0dXJuIHRydWU7XG5cbiAgICB2YXIgeCA9IHF1YWQueCAtIG5vZGUueCxcbiAgICAgICAgeSA9IHF1YWQueSAtIG5vZGUueSxcbiAgICAgICAgdyA9IHgyIC0geDEsXG4gICAgICAgIGwgPSB4ICogeCArIHkgKiB5O1xuXG4gICAgLy8gQXBwbHkgdGhlIEJhcm5lcy1IdXQgYXBwcm94aW1hdGlvbiBpZiBwb3NzaWJsZS5cbiAgICAvLyBMaW1pdCBmb3JjZXMgZm9yIHZlcnkgY2xvc2Ugbm9kZXM7IHJhbmRvbWl6ZSBkaXJlY3Rpb24gaWYgY29pbmNpZGVudC5cbiAgICBpZiAodyAqIHcgLyB0aGV0YTIgPCBsKSB7XG4gICAgICBpZiAobCA8IGRpc3RhbmNlTWF4Mikge1xuICAgICAgICBpZiAoeCA9PT0gMCkgeCA9IGppZ2dsZShyYW5kb20pLCBsICs9IHggKiB4O1xuICAgICAgICBpZiAoeSA9PT0gMCkgeSA9IGppZ2dsZShyYW5kb20pLCBsICs9IHkgKiB5O1xuICAgICAgICBpZiAobCA8IGRpc3RhbmNlTWluMikgbCA9IE1hdGguc3FydChkaXN0YW5jZU1pbjIgKiBsKTtcbiAgICAgICAgbm9kZS52eCArPSB4ICogcXVhZC52YWx1ZSAqIGFscGhhIC8gbDtcbiAgICAgICAgbm9kZS52eSArPSB5ICogcXVhZC52YWx1ZSAqIGFscGhhIC8gbDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIE90aGVyd2lzZSwgcHJvY2VzcyBwb2ludHMgZGlyZWN0bHkuXG4gICAgZWxzZSBpZiAocXVhZC5sZW5ndGggfHwgbCA+PSBkaXN0YW5jZU1heDIpIHJldHVybjtcblxuICAgIC8vIExpbWl0IGZvcmNlcyBmb3IgdmVyeSBjbG9zZSBub2RlczsgcmFuZG9taXplIGRpcmVjdGlvbiBpZiBjb2luY2lkZW50LlxuICAgIGlmIChxdWFkLmRhdGEgIT09IG5vZGUgfHwgcXVhZC5uZXh0KSB7XG4gICAgICBpZiAoeCA9PT0gMCkgeCA9IGppZ2dsZShyYW5kb20pLCBsICs9IHggKiB4O1xuICAgICAgaWYgKHkgPT09IDApIHkgPSBqaWdnbGUocmFuZG9tKSwgbCArPSB5ICogeTtcbiAgICAgIGlmIChsIDwgZGlzdGFuY2VNaW4yKSBsID0gTWF0aC5zcXJ0KGRpc3RhbmNlTWluMiAqIGwpO1xuICAgIH1cblxuICAgIGRvIGlmIChxdWFkLmRhdGEgIT09IG5vZGUpIHtcbiAgICAgIHcgPSBzdHJlbmd0aHNbcXVhZC5kYXRhLmluZGV4XSAqIGFscGhhIC8gbDtcbiAgICAgIG5vZGUudnggKz0geCAqIHc7XG4gICAgICBub2RlLnZ5ICs9IHkgKiB3O1xuICAgIH0gd2hpbGUgKHF1YWQgPSBxdWFkLm5leHQpO1xuICB9XG5cbiAgZm9yY2UuaW5pdGlhbGl6ZSA9IGZ1bmN0aW9uKF9ub2RlcywgX3JhbmRvbSkge1xuICAgIG5vZGVzID0gX25vZGVzO1xuICAgIHJhbmRvbSA9IF9yYW5kb207XG4gICAgaW5pdGlhbGl6ZSgpO1xuICB9O1xuXG4gIGZvcmNlLnN0cmVuZ3RoID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHN0cmVuZ3RoID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCgrXyksIGluaXRpYWxpemUoKSwgZm9yY2UpIDogc3RyZW5ndGg7XG4gIH07XG5cbiAgZm9yY2UuZGlzdGFuY2VNaW4gPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZGlzdGFuY2VNaW4yID0gXyAqIF8sIGZvcmNlKSA6IE1hdGguc3FydChkaXN0YW5jZU1pbjIpO1xuICB9O1xuXG4gIGZvcmNlLmRpc3RhbmNlTWF4ID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGRpc3RhbmNlTWF4MiA9IF8gKiBfLCBmb3JjZSkgOiBNYXRoLnNxcnQoZGlzdGFuY2VNYXgyKTtcbiAgfTtcblxuICBmb3JjZS50aGV0YSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0aGV0YTIgPSBfICogXywgZm9yY2UpIDogTWF0aC5zcXJ0KHRoZXRhMik7XG4gIH07XG5cbiAgcmV0dXJuIGZvcmNlO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oeCwgeSkge1xuICB2YXIgbm9kZXMsIHN0cmVuZ3RoID0gMTtcblxuICBpZiAoeCA9PSBudWxsKSB4ID0gMDtcbiAgaWYgKHkgPT0gbnVsbCkgeSA9IDA7XG5cbiAgZnVuY3Rpb24gZm9yY2UoKSB7XG4gICAgdmFyIGksXG4gICAgICAgIG4gPSBub2Rlcy5sZW5ndGgsXG4gICAgICAgIG5vZGUsXG4gICAgICAgIHN4ID0gMCxcbiAgICAgICAgc3kgPSAwO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgbm9kZSA9IG5vZGVzW2ldLCBzeCArPSBub2RlLngsIHN5ICs9IG5vZGUueTtcbiAgICB9XG5cbiAgICBmb3IgKHN4ID0gKHN4IC8gbiAtIHgpICogc3RyZW5ndGgsIHN5ID0gKHN5IC8gbiAtIHkpICogc3RyZW5ndGgsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBub2RlID0gbm9kZXNbaV0sIG5vZGUueCAtPSBzeCwgbm9kZS55IC09IHN5O1xuICAgIH1cbiAgfVxuXG4gIGZvcmNlLmluaXRpYWxpemUgPSBmdW5jdGlvbihfKSB7XG4gICAgbm9kZXMgPSBfO1xuICB9O1xuXG4gIGZvcmNlLnggPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeCA9ICtfLCBmb3JjZSkgOiB4O1xuICB9O1xuXG4gIGZvcmNlLnkgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeSA9ICtfLCBmb3JjZSkgOiB5O1xuICB9O1xuXG4gIGZvcmNlLnN0cmVuZ3RoID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHN0cmVuZ3RoID0gK18sIGZvcmNlKSA6IHN0cmVuZ3RoO1xuICB9O1xuXG4gIHJldHVybiBmb3JjZTtcbn1cbiIsImltcG9ydCBjb25zdGFudCBmcm9tIFwiLi9jb25zdGFudC5qc1wiO1xuaW1wb3J0IGppZ2dsZSBmcm9tIFwiLi9qaWdnbGUuanNcIjtcblxuZnVuY3Rpb24gaW5kZXgoZCkge1xuICByZXR1cm4gZC5pbmRleDtcbn1cblxuZnVuY3Rpb24gZmluZChub2RlQnlJZCwgbm9kZUlkKSB7XG4gIHZhciBub2RlID0gbm9kZUJ5SWQuZ2V0KG5vZGVJZCk7XG4gIGlmICghbm9kZSkgdGhyb3cgbmV3IEVycm9yKFwibm9kZSBub3QgZm91bmQ6IFwiICsgbm9kZUlkKTtcbiAgcmV0dXJuIG5vZGU7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGxpbmtzKSB7XG4gIHZhciBpZCA9IGluZGV4LFxuICAgICAgc3RyZW5ndGggPSBkZWZhdWx0U3RyZW5ndGgsXG4gICAgICBzdHJlbmd0aHMsXG4gICAgICBkaXN0YW5jZSA9IGNvbnN0YW50KDMwKSxcbiAgICAgIGRpc3RhbmNlcyxcbiAgICAgIG5vZGVzLFxuICAgICAgY291bnQsXG4gICAgICBiaWFzLFxuICAgICAgcmFuZG9tLFxuICAgICAgaXRlcmF0aW9ucyA9IDE7XG5cbiAgaWYgKGxpbmtzID09IG51bGwpIGxpbmtzID0gW107XG5cbiAgZnVuY3Rpb24gZGVmYXVsdFN0cmVuZ3RoKGxpbmspIHtcbiAgICByZXR1cm4gMSAvIE1hdGgubWluKGNvdW50W2xpbmsuc291cmNlLmluZGV4XSwgY291bnRbbGluay50YXJnZXQuaW5kZXhdKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZvcmNlKGFscGhhKSB7XG4gICAgZm9yICh2YXIgayA9IDAsIG4gPSBsaW5rcy5sZW5ndGg7IGsgPCBpdGVyYXRpb25zOyArK2spIHtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsaW5rLCBzb3VyY2UsIHRhcmdldCwgeCwgeSwgbCwgYjsgaSA8IG47ICsraSkge1xuICAgICAgICBsaW5rID0gbGlua3NbaV0sIHNvdXJjZSA9IGxpbmsuc291cmNlLCB0YXJnZXQgPSBsaW5rLnRhcmdldDtcbiAgICAgICAgeCA9IHRhcmdldC54ICsgdGFyZ2V0LnZ4IC0gc291cmNlLnggLSBzb3VyY2UudnggfHwgamlnZ2xlKHJhbmRvbSk7XG4gICAgICAgIHkgPSB0YXJnZXQueSArIHRhcmdldC52eSAtIHNvdXJjZS55IC0gc291cmNlLnZ5IHx8IGppZ2dsZShyYW5kb20pO1xuICAgICAgICBsID0gTWF0aC5zcXJ0KHggKiB4ICsgeSAqIHkpO1xuICAgICAgICBsID0gKGwgLSBkaXN0YW5jZXNbaV0pIC8gbCAqIGFscGhhICogc3RyZW5ndGhzW2ldO1xuICAgICAgICB4ICo9IGwsIHkgKj0gbDtcbiAgICAgICAgdGFyZ2V0LnZ4IC09IHggKiAoYiA9IGJpYXNbaV0pO1xuICAgICAgICB0YXJnZXQudnkgLT0geSAqIGI7XG4gICAgICAgIHNvdXJjZS52eCArPSB4ICogKGIgPSAxIC0gYik7XG4gICAgICAgIHNvdXJjZS52eSArPSB5ICogYjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBpbml0aWFsaXplKCkge1xuICAgIGlmICghbm9kZXMpIHJldHVybjtcblxuICAgIHZhciBpLFxuICAgICAgICBuID0gbm9kZXMubGVuZ3RoLFxuICAgICAgICBtID0gbGlua3MubGVuZ3RoLFxuICAgICAgICBub2RlQnlJZCA9IG5ldyBNYXAobm9kZXMubWFwKChkLCBpKSA9PiBbaWQoZCwgaSwgbm9kZXMpLCBkXSkpLFxuICAgICAgICBsaW5rO1xuXG4gICAgZm9yIChpID0gMCwgY291bnQgPSBuZXcgQXJyYXkobik7IGkgPCBtOyArK2kpIHtcbiAgICAgIGxpbmsgPSBsaW5rc1tpXSwgbGluay5pbmRleCA9IGk7XG4gICAgICBpZiAodHlwZW9mIGxpbmsuc291cmNlICE9PSBcIm9iamVjdFwiKSBsaW5rLnNvdXJjZSA9IGZpbmQobm9kZUJ5SWQsIGxpbmsuc291cmNlKTtcbiAgICAgIGlmICh0eXBlb2YgbGluay50YXJnZXQgIT09IFwib2JqZWN0XCIpIGxpbmsudGFyZ2V0ID0gZmluZChub2RlQnlJZCwgbGluay50YXJnZXQpO1xuICAgICAgY291bnRbbGluay5zb3VyY2UuaW5kZXhdID0gKGNvdW50W2xpbmsuc291cmNlLmluZGV4XSB8fCAwKSArIDE7XG4gICAgICBjb3VudFtsaW5rLnRhcmdldC5pbmRleF0gPSAoY291bnRbbGluay50YXJnZXQuaW5kZXhdIHx8IDApICsgMTtcbiAgICB9XG5cbiAgICBmb3IgKGkgPSAwLCBiaWFzID0gbmV3IEFycmF5KG0pOyBpIDwgbTsgKytpKSB7XG4gICAgICBsaW5rID0gbGlua3NbaV0sIGJpYXNbaV0gPSBjb3VudFtsaW5rLnNvdXJjZS5pbmRleF0gLyAoY291bnRbbGluay5zb3VyY2UuaW5kZXhdICsgY291bnRbbGluay50YXJnZXQuaW5kZXhdKTtcbiAgICB9XG5cbiAgICBzdHJlbmd0aHMgPSBuZXcgQXJyYXkobSksIGluaXRpYWxpemVTdHJlbmd0aCgpO1xuICAgIGRpc3RhbmNlcyA9IG5ldyBBcnJheShtKSwgaW5pdGlhbGl6ZURpc3RhbmNlKCk7XG4gIH1cblxuICBmdW5jdGlvbiBpbml0aWFsaXplU3RyZW5ndGgoKSB7XG4gICAgaWYgKCFub2RlcykgcmV0dXJuO1xuXG4gICAgZm9yICh2YXIgaSA9IDAsIG4gPSBsaW5rcy5sZW5ndGg7IGkgPCBuOyArK2kpIHtcbiAgICAgIHN0cmVuZ3Roc1tpXSA9ICtzdHJlbmd0aChsaW5rc1tpXSwgaSwgbGlua3MpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGluaXRpYWxpemVEaXN0YW5jZSgpIHtcbiAgICBpZiAoIW5vZGVzKSByZXR1cm47XG5cbiAgICBmb3IgKHZhciBpID0gMCwgbiA9IGxpbmtzLmxlbmd0aDsgaSA8IG47ICsraSkge1xuICAgICAgZGlzdGFuY2VzW2ldID0gK2Rpc3RhbmNlKGxpbmtzW2ldLCBpLCBsaW5rcyk7XG4gICAgfVxuICB9XG5cbiAgZm9yY2UuaW5pdGlhbGl6ZSA9IGZ1bmN0aW9uKF9ub2RlcywgX3JhbmRvbSkge1xuICAgIG5vZGVzID0gX25vZGVzO1xuICAgIHJhbmRvbSA9IF9yYW5kb207XG4gICAgaW5pdGlhbGl6ZSgpO1xuICB9O1xuXG4gIGZvcmNlLmxpbmtzID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGxpbmtzID0gXywgaW5pdGlhbGl6ZSgpLCBmb3JjZSkgOiBsaW5rcztcbiAgfTtcblxuICBmb3JjZS5pZCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChpZCA9IF8sIGZvcmNlKSA6IGlkO1xuICB9O1xuXG4gIGZvcmNlLml0ZXJhdGlvbnMgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoaXRlcmF0aW9ucyA9ICtfLCBmb3JjZSkgOiBpdGVyYXRpb25zO1xuICB9O1xuXG4gIGZvcmNlLnN0cmVuZ3RoID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHN0cmVuZ3RoID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCgrXyksIGluaXRpYWxpemVTdHJlbmd0aCgpLCBmb3JjZSkgOiBzdHJlbmd0aDtcbiAgfTtcblxuICBmb3JjZS5kaXN0YW5jZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkaXN0YW5jZSA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoK18pLCBpbml0aWFsaXplRGlzdGFuY2UoKSwgZm9yY2UpIDogZGlzdGFuY2U7XG4gIH07XG5cbiAgcmV0dXJuIGZvcmNlO1xufVxuIiwiaW1wb3J0IHtxdWFkdHJlZX0gZnJvbSBcImQzLXF1YWR0cmVlXCI7XG5pbXBvcnQgY29uc3RhbnQgZnJvbSBcIi4vY29uc3RhbnQuanNcIjtcbmltcG9ydCBqaWdnbGUgZnJvbSBcIi4vamlnZ2xlLmpzXCI7XG5cbmZ1bmN0aW9uIHgoZCkge1xuICByZXR1cm4gZC54ICsgZC52eDtcbn1cblxuZnVuY3Rpb24geShkKSB7XG4gIHJldHVybiBkLnkgKyBkLnZ5O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihyYWRpdXMpIHtcbiAgdmFyIG5vZGVzLFxuICAgICAgcmFkaWksXG4gICAgICByYW5kb20sXG4gICAgICBzdHJlbmd0aCA9IDEsXG4gICAgICBpdGVyYXRpb25zID0gMTtcblxuICBpZiAodHlwZW9mIHJhZGl1cyAhPT0gXCJmdW5jdGlvblwiKSByYWRpdXMgPSBjb25zdGFudChyYWRpdXMgPT0gbnVsbCA/IDEgOiArcmFkaXVzKTtcblxuICBmdW5jdGlvbiBmb3JjZSgpIHtcbiAgICB2YXIgaSwgbiA9IG5vZGVzLmxlbmd0aCxcbiAgICAgICAgdHJlZSxcbiAgICAgICAgbm9kZSxcbiAgICAgICAgeGksXG4gICAgICAgIHlpLFxuICAgICAgICByaSxcbiAgICAgICAgcmkyO1xuXG4gICAgZm9yICh2YXIgayA9IDA7IGsgPCBpdGVyYXRpb25zOyArK2spIHtcbiAgICAgIHRyZWUgPSBxdWFkdHJlZShub2RlcywgeCwgeSkudmlzaXRBZnRlcihwcmVwYXJlKTtcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgICAgbm9kZSA9IG5vZGVzW2ldO1xuICAgICAgICByaSA9IHJhZGlpW25vZGUuaW5kZXhdLCByaTIgPSByaSAqIHJpO1xuICAgICAgICB4aSA9IG5vZGUueCArIG5vZGUudng7XG4gICAgICAgIHlpID0gbm9kZS55ICsgbm9kZS52eTtcbiAgICAgICAgdHJlZS52aXNpdChhcHBseSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYXBwbHkocXVhZCwgeDAsIHkwLCB4MSwgeTEpIHtcbiAgICAgIHZhciBkYXRhID0gcXVhZC5kYXRhLCByaiA9IHF1YWQuciwgciA9IHJpICsgcmo7XG4gICAgICBpZiAoZGF0YSkge1xuICAgICAgICBpZiAoZGF0YS5pbmRleCA+IG5vZGUuaW5kZXgpIHtcbiAgICAgICAgICB2YXIgeCA9IHhpIC0gZGF0YS54IC0gZGF0YS52eCxcbiAgICAgICAgICAgICAgeSA9IHlpIC0gZGF0YS55IC0gZGF0YS52eSxcbiAgICAgICAgICAgICAgbCA9IHggKiB4ICsgeSAqIHk7XG4gICAgICAgICAgaWYgKGwgPCByICogcikge1xuICAgICAgICAgICAgaWYgKHggPT09IDApIHggPSBqaWdnbGUocmFuZG9tKSwgbCArPSB4ICogeDtcbiAgICAgICAgICAgIGlmICh5ID09PSAwKSB5ID0gamlnZ2xlKHJhbmRvbSksIGwgKz0geSAqIHk7XG4gICAgICAgICAgICBsID0gKHIgLSAobCA9IE1hdGguc3FydChsKSkpIC8gbCAqIHN0cmVuZ3RoO1xuICAgICAgICAgICAgbm9kZS52eCArPSAoeCAqPSBsKSAqIChyID0gKHJqICo9IHJqKSAvIChyaTIgKyByaikpO1xuICAgICAgICAgICAgbm9kZS52eSArPSAoeSAqPSBsKSAqIHI7XG4gICAgICAgICAgICBkYXRhLnZ4IC09IHggKiAociA9IDEgLSByKTtcbiAgICAgICAgICAgIGRhdGEudnkgLT0geSAqIHI7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHJldHVybiB4MCA+IHhpICsgciB8fCB4MSA8IHhpIC0gciB8fCB5MCA+IHlpICsgciB8fCB5MSA8IHlpIC0gcjtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBwcmVwYXJlKHF1YWQpIHtcbiAgICBpZiAocXVhZC5kYXRhKSByZXR1cm4gcXVhZC5yID0gcmFkaWlbcXVhZC5kYXRhLmluZGV4XTtcbiAgICBmb3IgKHZhciBpID0gcXVhZC5yID0gMDsgaSA8IDQ7ICsraSkge1xuICAgICAgaWYgKHF1YWRbaV0gJiYgcXVhZFtpXS5yID4gcXVhZC5yKSB7XG4gICAgICAgIHF1YWQuciA9IHF1YWRbaV0ucjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBpbml0aWFsaXplKCkge1xuICAgIGlmICghbm9kZXMpIHJldHVybjtcbiAgICB2YXIgaSwgbiA9IG5vZGVzLmxlbmd0aCwgbm9kZTtcbiAgICByYWRpaSA9IG5ldyBBcnJheShuKTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSBub2RlID0gbm9kZXNbaV0sIHJhZGlpW25vZGUuaW5kZXhdID0gK3JhZGl1cyhub2RlLCBpLCBub2Rlcyk7XG4gIH1cblxuICBmb3JjZS5pbml0aWFsaXplID0gZnVuY3Rpb24oX25vZGVzLCBfcmFuZG9tKSB7XG4gICAgbm9kZXMgPSBfbm9kZXM7XG4gICAgcmFuZG9tID0gX3JhbmRvbTtcbiAgICBpbml0aWFsaXplKCk7XG4gIH07XG5cbiAgZm9yY2UuaXRlcmF0aW9ucyA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChpdGVyYXRpb25zID0gK18sIGZvcmNlKSA6IGl0ZXJhdGlvbnM7XG4gIH07XG5cbiAgZm9yY2Uuc3RyZW5ndGggPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc3RyZW5ndGggPSArXywgZm9yY2UpIDogc3RyZW5ndGg7XG4gIH07XG5cbiAgZm9yY2UucmFkaXVzID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHJhZGl1cyA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoK18pLCBpbml0aWFsaXplKCksIGZvcmNlKSA6IHJhZGl1cztcbiAgfTtcblxuICByZXR1cm4gZm9yY2U7XG59XG4iLCJpbXBvcnQgY29uc3RhbnQgZnJvbSBcIi4vY29uc3RhbnQuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oeCkge1xuICB2YXIgc3RyZW5ndGggPSBjb25zdGFudCgwLjEpLFxuICAgICAgbm9kZXMsXG4gICAgICBzdHJlbmd0aHMsXG4gICAgICB4ejtcblxuICBpZiAodHlwZW9mIHggIT09IFwiZnVuY3Rpb25cIikgeCA9IGNvbnN0YW50KHggPT0gbnVsbCA/IDAgOiAreCk7XG5cbiAgZnVuY3Rpb24gZm9yY2UoYWxwaGEpIHtcbiAgICBmb3IgKHZhciBpID0gMCwgbiA9IG5vZGVzLmxlbmd0aCwgbm9kZTsgaSA8IG47ICsraSkge1xuICAgICAgbm9kZSA9IG5vZGVzW2ldLCBub2RlLnZ4ICs9ICh4eltpXSAtIG5vZGUueCkgKiBzdHJlbmd0aHNbaV0gKiBhbHBoYTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBpbml0aWFsaXplKCkge1xuICAgIGlmICghbm9kZXMpIHJldHVybjtcbiAgICB2YXIgaSwgbiA9IG5vZGVzLmxlbmd0aDtcbiAgICBzdHJlbmd0aHMgPSBuZXcgQXJyYXkobik7XG4gICAgeHogPSBuZXcgQXJyYXkobik7XG4gICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgc3RyZW5ndGhzW2ldID0gaXNOYU4oeHpbaV0gPSAreChub2Rlc1tpXSwgaSwgbm9kZXMpKSA/IDAgOiArc3RyZW5ndGgobm9kZXNbaV0sIGksIG5vZGVzKTtcbiAgICB9XG4gIH1cblxuICBmb3JjZS5pbml0aWFsaXplID0gZnVuY3Rpb24oXykge1xuICAgIG5vZGVzID0gXztcbiAgICBpbml0aWFsaXplKCk7XG4gIH07XG5cbiAgZm9yY2Uuc3RyZW5ndGggPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc3RyZW5ndGggPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCtfKSwgaW5pdGlhbGl6ZSgpLCBmb3JjZSkgOiBzdHJlbmd0aDtcbiAgfTtcblxuICBmb3JjZS54ID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHggPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCtfKSwgaW5pdGlhbGl6ZSgpLCBmb3JjZSkgOiB4O1xuICB9O1xuXG4gIHJldHVybiBmb3JjZTtcbn1cbiIsImltcG9ydCBjb25zdGFudCBmcm9tIFwiLi9jb25zdGFudC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih5KSB7XG4gIHZhciBzdHJlbmd0aCA9IGNvbnN0YW50KDAuMSksXG4gICAgICBub2RlcyxcbiAgICAgIHN0cmVuZ3RocyxcbiAgICAgIHl6O1xuXG4gIGlmICh0eXBlb2YgeSAhPT0gXCJmdW5jdGlvblwiKSB5ID0gY29uc3RhbnQoeSA9PSBudWxsID8gMCA6ICt5KTtcblxuICBmdW5jdGlvbiBmb3JjZShhbHBoYSkge1xuICAgIGZvciAodmFyIGkgPSAwLCBuID0gbm9kZXMubGVuZ3RoLCBub2RlOyBpIDwgbjsgKytpKSB7XG4gICAgICBub2RlID0gbm9kZXNbaV0sIG5vZGUudnkgKz0gKHl6W2ldIC0gbm9kZS55KSAqIHN0cmVuZ3Roc1tpXSAqIGFscGhhO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGluaXRpYWxpemUoKSB7XG4gICAgaWYgKCFub2RlcykgcmV0dXJuO1xuICAgIHZhciBpLCBuID0gbm9kZXMubGVuZ3RoO1xuICAgIHN0cmVuZ3RocyA9IG5ldyBBcnJheShuKTtcbiAgICB5eiA9IG5ldyBBcnJheShuKTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBzdHJlbmd0aHNbaV0gPSBpc05hTih5eltpXSA9ICt5KG5vZGVzW2ldLCBpLCBub2RlcykpID8gMCA6ICtzdHJlbmd0aChub2Rlc1tpXSwgaSwgbm9kZXMpO1xuICAgIH1cbiAgfVxuXG4gIGZvcmNlLmluaXRpYWxpemUgPSBmdW5jdGlvbihfKSB7XG4gICAgbm9kZXMgPSBfO1xuICAgIGluaXRpYWxpemUoKTtcbiAgfTtcblxuICBmb3JjZS5zdHJlbmd0aCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzdHJlbmd0aCA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoK18pLCBpbml0aWFsaXplKCksIGZvcmNlKSA6IHN0cmVuZ3RoO1xuICB9O1xuXG4gIGZvcmNlLnkgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeSA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoK18pLCBpbml0aWFsaXplKCksIGZvcmNlKSA6IHk7XG4gIH07XG5cbiAgcmV0dXJuIGZvcmNlO1xufVxuIiwiaW1wb3J0ICogYXMgZDNGb3JjZSBmcm9tICdkMy1mb3JjZSc7XG5pbXBvcnQgeyBnZXRFZGdlVGVybWluYWwgfSBmcm9tICcuLi8uLi91dGlsJztcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9qb2huLWd1ZXJyYS9mb3JjZUluQUJveC9ibG9iL21hc3Rlci9zcmMvZm9yY2VJbkFCb3guanNcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGZvcmNlSW5BQm94KCkge1xuICAgIGZ1bmN0aW9uIGNvbnN0YW50KF8pIHtcbiAgICAgICAgcmV0dXJuICgpID0+IF87XG4gICAgfVxuICAgIGxldCBncm91cEJ5ID0gKGQpID0+IHtcbiAgICAgICAgcmV0dXJuIGQuY2x1c3RlcjtcbiAgICB9O1xuICAgIGxldCBmb3JjZU5vZGVTaXplID0gY29uc3RhbnQoMSk7XG4gICAgbGV0IGZvcmNlQ2hhcmdlID0gY29uc3RhbnQoLTEpO1xuICAgIGxldCBmb3JjZUxpbmtEaXN0YW5jZSA9IGNvbnN0YW50KDEwMCk7XG4gICAgbGV0IGZvcmNlTGlua1N0cmVuZ3RoID0gY29uc3RhbnQoMC4xKTtcbiAgICBsZXQgb2Zmc2V0ID0gWzAsIDBdO1xuICAgIGxldCBub2RlcyA9IFtdO1xuICAgIGxldCBub2Rlc01hcCA9IHt9O1xuICAgIGxldCBsaW5rcyA9IFtdO1xuICAgIGxldCBjZW50ZXJYID0gMTAwO1xuICAgIGxldCBjZW50ZXJZID0gMTAwO1xuICAgIGxldCBmb2NpID0ge1xuICAgICAgICBub25lOiB7XG4gICAgICAgICAgICB4OiAwLFxuICAgICAgICAgICAgeTogMCxcbiAgICAgICAgfSxcbiAgICB9O1xuICAgIGxldCB0ZW1wbGF0ZU5vZGVzID0gW107XG4gICAgbGV0IHRlbXBsYXRlRm9yY2U7XG4gICAgbGV0IHRlbXBsYXRlID0gJ2ZvcmNlJztcbiAgICBsZXQgZW5hYmxlR3JvdXBpbmcgPSB0cnVlO1xuICAgIGxldCBzdHJlbmd0aCA9IDAuMTtcbiAgICBmdW5jdGlvbiBmb3JjZShhbHBoYSkge1xuICAgICAgICBpZiAoIWVuYWJsZUdyb3VwaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gZm9yY2U7XG4gICAgICAgIH1cbiAgICAgICAgdGVtcGxhdGVGb3JjZS50aWNrKCk7XG4gICAgICAgIGdldEZvY2lzRnJvbVRlbXBsYXRlKCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBuID0gbm9kZXMubGVuZ3RoLCBub2RlLCBrID0gYWxwaGEgKiBzdHJlbmd0aDsgaSA8IG47ICsraSkge1xuICAgICAgICAgICAgbm9kZSA9IG5vZGVzW2ldO1xuICAgICAgICAgICAgbm9kZS52eCArPSAoZm9jaVtncm91cEJ5KG5vZGUpXS54IC0gbm9kZS54KSAqIGs7XG4gICAgICAgICAgICBub2RlLnZ5ICs9IChmb2NpW2dyb3VwQnkobm9kZSldLnkgLSBub2RlLnkpICogaztcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBpbml0aWFsaXplKCkge1xuICAgICAgICBpZiAoIW5vZGVzKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBpbml0aWFsaXplV2l0aEZvcmNlKCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGluaXRpYWxpemVXaXRoRm9yY2UoKSB7XG4gICAgICAgIGlmICghbm9kZXMgfHwgIW5vZGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChncm91cEJ5KG5vZGVzWzBdKSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcihcIkNvdWxkbnQgZmluZCB0aGUgZ3JvdXBpbmcgYXR0cmlidXRlIGZvciB0aGUgbm9kZXMuIE1ha2Ugc3VyZSB0byBzZXQgaXQgdXAgd2l0aCBmb3JjZUluQUJveC5ncm91cEJ5KCdjbHVzdGVyQXR0cicpIGJlZm9yZSBjYWxsaW5nIC5saW5rcygpXCIpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGNoZWNrTGlua3NBc09iamVjdHMoKTtcbiAgICAgICAgY29uc3QgbmV0ID0gZ2V0R3JvdXBzR3JhcGgoKTtcbiAgICAgICAgdGVtcGxhdGVGb3JjZSA9IGQzRm9yY2VcbiAgICAgICAgICAgIC5mb3JjZVNpbXVsYXRpb24obmV0Lm5vZGVzKVxuICAgICAgICAgICAgLmZvcmNlKCd4JywgZDNGb3JjZS5mb3JjZVgoY2VudGVyWCkuc3RyZW5ndGgoMC4xKSlcbiAgICAgICAgICAgIC5mb3JjZSgneScsIGQzRm9yY2UuZm9yY2VZKGNlbnRlclkpLnN0cmVuZ3RoKDAuMSkpXG4gICAgICAgICAgICAuZm9yY2UoJ2NvbGxpZGUnLCBkM0ZvcmNlLmZvcmNlQ29sbGlkZSgoZCkgPT4gZC5yKS5pdGVyYXRpb25zKDQpKVxuICAgICAgICAgICAgLmZvcmNlKCdjaGFyZ2UnLCBkM0ZvcmNlLmZvcmNlTWFueUJvZHkoKS5zdHJlbmd0aChmb3JjZUNoYXJnZSkpXG4gICAgICAgICAgICAuZm9yY2UoJ2xpbmtzJywgZDNGb3JjZVxuICAgICAgICAgICAgLmZvcmNlTGluayhuZXQubm9kZXMubGVuZ3RoID8gbmV0LmxpbmtzIDogW10pXG4gICAgICAgICAgICAuZGlzdGFuY2UoZm9yY2VMaW5rRGlzdGFuY2UpXG4gICAgICAgICAgICAuc3RyZW5ndGgoZm9yY2VMaW5rU3RyZW5ndGgpKTtcbiAgICAgICAgdGVtcGxhdGVOb2RlcyA9IHRlbXBsYXRlRm9yY2Uubm9kZXMoKTtcbiAgICAgICAgZ2V0Rm9jaXNGcm9tVGVtcGxhdGUoKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0R3JvdXBzR3JhcGgoKSB7XG4gICAgICAgIGNvbnN0IGdub2RlcyA9IFtdO1xuICAgICAgICBjb25zdCBnbGlua3MgPSBbXTtcbiAgICAgICAgY29uc3QgZE5vZGVzID0ge307XG4gICAgICAgIGxldCBjbHVzdGVyc0xpc3QgPSBbXTtcbiAgICAgICAgbGV0IGNsdXN0ZXJzQ291bnRzID0ge307XG4gICAgICAgIGxldCBjbHVzdGVyc0xpbmtzID0gW107XG4gICAgICAgIGNsdXN0ZXJzQ291bnRzID0gY29tcHV0ZUNsdXN0ZXJzTm9kZUNvdW50cyhub2Rlcyk7XG4gICAgICAgIGNsdXN0ZXJzTGlua3MgPSBjb21wdXRlQ2x1c3RlcnNMaW5rQ291bnRzKGxpbmtzKTtcbiAgICAgICAgY2x1c3RlcnNMaXN0ID0gT2JqZWN0LmtleXMoY2x1c3RlcnNDb3VudHMpO1xuICAgICAgICBjbHVzdGVyc0xpc3QuZm9yRWFjaCgoa2V5LCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdmFsID0gY2x1c3RlcnNDb3VudHNba2V5XTtcbiAgICAgICAgICAgIC8vIFVzZXMgYXBwcm94IG1ldGEtbm9kZSBzaXplXG4gICAgICAgICAgICBnbm9kZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgaWQ6IGtleSxcbiAgICAgICAgICAgICAgICBzaXplOiB2YWwuY291bnQsXG4gICAgICAgICAgICAgICAgcjogTWF0aC5zcXJ0KHZhbC5zdW1mb3JjZU5vZGVTaXplIC8gTWF0aC5QSSksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGROb2Rlc1trZXldID0gaW5kZXg7XG4gICAgICAgIH0pO1xuICAgICAgICBjbHVzdGVyc0xpbmtzLmZvckVhY2goKGwpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZVRlcm1pbmFsID0gZ2V0RWRnZVRlcm1pbmFsKGwsICdzb3VyY2UnKTtcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldFRlcm1pbmFsID0gZ2V0RWRnZVRlcm1pbmFsKGwsICd0YXJnZXQnKTtcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZSA9IGROb2Rlc1tzb3VyY2VUZXJtaW5hbF07XG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBkTm9kZXNbdGFyZ2V0VGVybWluYWxdO1xuICAgICAgICAgICAgaWYgKHNvdXJjZSAhPT0gdW5kZWZpbmVkICYmIHRhcmdldCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgZ2xpbmtzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBzb3VyY2UsXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICAgICAgICAgICAgY291bnQ6IGwuY291bnQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbm9kZXM6IGdub2RlcyxcbiAgICAgICAgICAgIGxpbmtzOiBnbGlua3MsXG4gICAgICAgIH07XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbXB1dGVDbHVzdGVyc05vZGVDb3VudHMobm9kZXMpIHtcbiAgICAgICAgY29uc3QgY2x1c3RlcnNDb3VudHMgPSB7fTtcbiAgICAgICAgbm9kZXMuZm9yRWFjaCgoZCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gZ3JvdXBCeShkKTtcbiAgICAgICAgICAgIGlmICghY2x1c3RlcnNDb3VudHNba2V5XSkge1xuICAgICAgICAgICAgICAgIGNsdXN0ZXJzQ291bnRzW2tleV0gPSB7XG4gICAgICAgICAgICAgICAgICAgIGNvdW50OiAwLFxuICAgICAgICAgICAgICAgICAgICBzdW1mb3JjZU5vZGVTaXplOiAwLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBub2Rlcy5mb3JFYWNoKChkKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSBncm91cEJ5KGQpO1xuICAgICAgICAgICAgY29uc3Qgbm9kZVNpemUgPSBmb3JjZU5vZGVTaXplKGQpO1xuICAgICAgICAgICAgY29uc3QgdG1wQ291bnQgPSBjbHVzdGVyc0NvdW50c1trZXldO1xuICAgICAgICAgICAgdG1wQ291bnQuY291bnQgPSB0bXBDb3VudC5jb3VudCArIDE7XG4gICAgICAgICAgICB0bXBDb3VudC5zdW1mb3JjZU5vZGVTaXplID1cbiAgICAgICAgICAgICAgICB0bXBDb3VudC5zdW1mb3JjZU5vZGVTaXplICsgTWF0aC5QSSAqIChub2RlU2l6ZSAqIG5vZGVTaXplKSAqIDEuMztcbiAgICAgICAgICAgIGNsdXN0ZXJzQ291bnRzW2tleV0gPSB0bXBDb3VudDtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBjbHVzdGVyc0NvdW50cztcbiAgICB9XG4gICAgZnVuY3Rpb24gY29tcHV0ZUNsdXN0ZXJzTGlua0NvdW50cyhsaW5rcykge1xuICAgICAgICBjb25zdCBkQ2x1c3RlckxpbmtzID0ge307XG4gICAgICAgIGNvbnN0IGNsdXN0ZXJMaW5rcyA9IFtdO1xuICAgICAgICBsaW5rcy5mb3JFYWNoKChsKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSBnZXRMaW5rS2V5KGwpO1xuICAgICAgICAgICAgbGV0IGNvdW50ID0gMDtcbiAgICAgICAgICAgIGlmIChkQ2x1c3RlckxpbmtzW2tleV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGNvdW50ID0gZENsdXN0ZXJMaW5rc1trZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY291bnQgKz0gMTtcbiAgICAgICAgICAgIGRDbHVzdGVyTGlua3Nba2V5XSA9IGNvdW50O1xuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgZW50cmllcyA9IE9iamVjdC5lbnRyaWVzKGRDbHVzdGVyTGlua3MpO1xuICAgICAgICBlbnRyaWVzLmZvckVhY2goKFtrZXksIGNvdW50XSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc291cmNlID0ga2V5LnNwbGl0KCd+JylbMF07XG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBrZXkuc3BsaXQoJ34nKVsxXTtcbiAgICAgICAgICAgIGlmIChzb3VyY2UgIT09IHVuZGVmaW5lZCAmJiB0YXJnZXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGNsdXN0ZXJMaW5rcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgc291cmNlLFxuICAgICAgICAgICAgICAgICAgICB0YXJnZXQsXG4gICAgICAgICAgICAgICAgICAgIGNvdW50LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGNsdXN0ZXJMaW5rcztcbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0Rm9jaXNGcm9tVGVtcGxhdGUoKSB7XG4gICAgICAgIGZvY2kgPSB7XG4gICAgICAgICAgICBub25lOiB7XG4gICAgICAgICAgICAgICAgeDogMCxcbiAgICAgICAgICAgICAgICB5OiAwLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgdGVtcGxhdGVOb2Rlcy5mb3JFYWNoKChkKSA9PiB7XG4gICAgICAgICAgICBmb2NpW2QuaWRdID0ge1xuICAgICAgICAgICAgICAgIHg6IGQueCAtIG9mZnNldFswXSxcbiAgICAgICAgICAgICAgICB5OiBkLnkgLSBvZmZzZXRbMV0sXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGZvY2k7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdldExpbmtLZXkobCkge1xuICAgICAgICBjb25zdCBzb3VyY2UgPSBnZXRFZGdlVGVybWluYWwobCwgJ3NvdXJjZScpO1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBnZXRFZGdlVGVybWluYWwobCwgJ3RhcmdldCcpO1xuICAgICAgICBjb25zdCBzb3VyY2VJRCA9IGdyb3VwQnkobm9kZXNNYXBbc291cmNlXSk7XG4gICAgICAgIGNvbnN0IHRhcmdldElEID0gZ3JvdXBCeShub2Rlc01hcFt0YXJnZXRdKTtcbiAgICAgICAgcmV0dXJuIHNvdXJjZUlEIDw9IHRhcmdldElEXG4gICAgICAgICAgICA/IGAke3NvdXJjZUlEfX4ke3RhcmdldElEfWBcbiAgICAgICAgICAgIDogYCR7dGFyZ2V0SUR9fiR7c291cmNlSUR9YDtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ2VuTm9kZXNNYXAobm9kZXMpIHtcbiAgICAgICAgbm9kZXNNYXAgPSB7fTtcbiAgICAgICAgbm9kZXMuZm9yRWFjaCgobm9kZSkgPT4ge1xuICAgICAgICAgICAgbm9kZXNNYXBbbm9kZS5pZF0gPSBub2RlO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gc2V0VGVtcGxhdGUoeCkge1xuICAgICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gdGVtcGxhdGU7XG4gICAgICAgIHRlbXBsYXRlID0geDtcbiAgICAgICAgaW5pdGlhbGl6ZSgpO1xuICAgICAgICByZXR1cm4gZm9yY2U7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHNldEdyb3VwQnkoeCkge1xuICAgICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gZ3JvdXBCeTtcbiAgICAgICAgaWYgKHR5cGVvZiB4ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgZ3JvdXBCeSA9IChkKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRbeF07XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIGZvcmNlO1xuICAgICAgICB9XG4gICAgICAgIGdyb3VwQnkgPSB4O1xuICAgICAgICByZXR1cm4gZm9yY2U7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHNldEVuYWJsZUdyb3VwaW5nKHgpIHtcbiAgICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIGVuYWJsZUdyb3VwaW5nO1xuICAgICAgICBlbmFibGVHcm91cGluZyA9IHg7XG4gICAgICAgIHJldHVybiBmb3JjZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gc2V0U3RyZW5ndGgoeCkge1xuICAgICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gc3RyZW5ndGg7XG4gICAgICAgIHN0cmVuZ3RoID0geDtcbiAgICAgICAgcmV0dXJuIGZvcmNlO1xuICAgIH1cbiAgICBmdW5jdGlvbiBzZXRDZW50ZXJYKF8pIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNlbnRlclggPSBfO1xuICAgICAgICAgICAgcmV0dXJuIGZvcmNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjZW50ZXJYO1xuICAgIH1cbiAgICBmdW5jdGlvbiBzZXRDZW50ZXJZKF8pIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNlbnRlclkgPSBfO1xuICAgICAgICAgICAgcmV0dXJuIGZvcmNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjZW50ZXJZO1xuICAgIH1cbiAgICBmdW5jdGlvbiBzZXROb2RlcyhfKSB7XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgICBnZW5Ob2Rlc01hcChfIHx8IFtdKTtcbiAgICAgICAgICAgIG5vZGVzID0gXyB8fCBbXTtcbiAgICAgICAgICAgIHJldHVybiBmb3JjZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbm9kZXM7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHNldExpbmtzKF8pIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxpbmtzID0gXyB8fCBbXTtcbiAgICAgICAgICAgIGluaXRpYWxpemUoKTtcbiAgICAgICAgICAgIHJldHVybiBmb3JjZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbGlua3M7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHNldEZvcmNlTm9kZVNpemUoXykge1xuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBfID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgZm9yY2VOb2RlU2l6ZSA9IF87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb3JjZU5vZGVTaXplID0gY29uc3RhbnQoK18pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaW5pdGlhbGl6ZSgpO1xuICAgICAgICAgICAgcmV0dXJuIGZvcmNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmb3JjZU5vZGVTaXplO1xuICAgIH1cbiAgICBmdW5jdGlvbiBzZXRGb3JjZUNoYXJnZShfKSB7XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIF8gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBmb3JjZUNoYXJnZSA9IF87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb3JjZUNoYXJnZSA9IGNvbnN0YW50KCtfKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGluaXRpYWxpemUoKTtcbiAgICAgICAgICAgIHJldHVybiBmb3JjZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZm9yY2VDaGFyZ2U7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHNldEZvcmNlTGlua0Rpc3RhbmNlKF8pIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgXyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIGZvcmNlTGlua0Rpc3RhbmNlID0gXztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvcmNlTGlua0Rpc3RhbmNlID0gY29uc3RhbnQoK18pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaW5pdGlhbGl6ZSgpO1xuICAgICAgICAgICAgcmV0dXJuIGZvcmNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmb3JjZUxpbmtEaXN0YW5jZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gc2V0Rm9yY2VMaW5rU3RyZW5ndGgoXykge1xuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBfID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgZm9yY2VMaW5rU3RyZW5ndGggPSBfO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZm9yY2VMaW5rU3RyZW5ndGggPSBjb25zdGFudCgrXyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpbml0aWFsaXplKCk7XG4gICAgICAgICAgICByZXR1cm4gZm9yY2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZvcmNlTGlua1N0cmVuZ3RoO1xuICAgIH1cbiAgICBmdW5jdGlvbiBzZXRPZmZzZXQoXykge1xuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgb2Zmc2V0ID0gXztcbiAgICAgICAgICAgIHJldHVybiBmb3JjZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2Zmc2V0O1xuICAgIH1cbiAgICBmb3JjZS5pbml0aWFsaXplID0gKF8pID0+IHtcbiAgICAgICAgbm9kZXMgPSBfO1xuICAgICAgICBpbml0aWFsaXplKCk7XG4gICAgfTtcbiAgICBmb3JjZS50ZW1wbGF0ZSA9IHNldFRlbXBsYXRlO1xuICAgIGZvcmNlLmdyb3VwQnkgPSBzZXRHcm91cEJ5O1xuICAgIGZvcmNlLmVuYWJsZUdyb3VwaW5nID0gc2V0RW5hYmxlR3JvdXBpbmc7XG4gICAgZm9yY2Uuc3RyZW5ndGggPSBzZXRTdHJlbmd0aDtcbiAgICBmb3JjZS5jZW50ZXJYID0gc2V0Q2VudGVyWDtcbiAgICBmb3JjZS5jZW50ZXJZID0gc2V0Q2VudGVyWTtcbiAgICBmb3JjZS5ub2RlcyA9IHNldE5vZGVzO1xuICAgIGZvcmNlLmxpbmtzID0gc2V0TGlua3M7XG4gICAgZm9yY2UuZm9yY2VOb2RlU2l6ZSA9IHNldEZvcmNlTm9kZVNpemU7XG4gICAgLy8gTGVnYWN5IHN1cHBvcnRcbiAgICBmb3JjZS5ub2RlU2l6ZSA9IGZvcmNlLmZvcmNlTm9kZVNpemU7XG4gICAgZm9yY2UuZm9yY2VDaGFyZ2UgPSBzZXRGb3JjZUNoYXJnZTtcbiAgICBmb3JjZS5mb3JjZUxpbmtEaXN0YW5jZSA9IHNldEZvcmNlTGlua0Rpc3RhbmNlO1xuICAgIGZvcmNlLmZvcmNlTGlua1N0cmVuZ3RoID0gc2V0Rm9yY2VMaW5rU3RyZW5ndGg7XG4gICAgZm9yY2Uub2Zmc2V0ID0gc2V0T2Zmc2V0O1xuICAgIGZvcmNlLmdldEZvY2lzID0gZ2V0Rm9jaXNGcm9tVGVtcGxhdGU7XG4gICAgcmV0dXJuIGZvcmNlO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Zm9yY2UtaW4tYS1ib3guanMubWFwIiwiLyoqIGxheW91dCBtZXNzYWdlIHR5cGUgKi9cbmV4cG9ydCBjb25zdCBMQVlPVVRfTUVTU0FHRSA9IHtcbiAgICAvLyBydW4gbGF5b3V0XG4gICAgUlVOOiBcIkxBWU9VVF9SVU5cIixcbiAgICAvLyBsYXlvdXQgZW5kZWQgd2l0aCBzdWNjZXNzXG4gICAgRU5EOiBcIkxBWU9VVF9FTkRcIixcbiAgICAvLyBsYXlvdXQgZXJyb3JcbiAgICBFUlJPUjogXCJMQVlPVVRfRVJST1JcIixcbiAgICAvLyBsYXlvdXQgdGljaywgdXNlZCBpbiBmb3JjZSBkaXJlY3RlZCBsYXlvdXRcbiAgICBUSUNLOiBcIkxBWU9VVF9USUNLXCIsXG4gICAgR1BVUlVOOiBcIkdQVV9MQVlPVVRfUlVOXCIsXG4gICAgR1BVRU5EOiBcIkdQVV9MQVlPVVRfRU5EXCJcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb25zdGFudHMuanMubWFwIiwiLyoqXG4gKiBAZmlsZU92ZXJ2aWV3IHJhbmRvbSBsYXlvdXRcbiAqIEBhdXRob3Igc2hpd3Uud3l5QGFudGZpbi5jb21cbiAqL1xuaW1wb3J0ICogYXMgZDNGb3JjZSBmcm9tIFwiZDMtZm9yY2VcIjtcbmltcG9ydCBmb3JjZUluQUJveCBmcm9tIFwiLi9mb3JjZS1pbi1hLWJveFwiO1xuaW1wb3J0IHsgaXNBcnJheSwgaXNGdW5jdGlvbiwgaXNOdW1iZXIsIGlzT2JqZWN0IH0gZnJvbSBcIi4uLy4uL3V0aWxcIjtcbmltcG9ydCB7IEJhc2UgfSBmcm9tIFwiLi4vYmFzZVwiO1xuaW1wb3J0IHsgTEFZT1VUX01FU1NBR0UgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG4vKipcbiAqIOe7j+WFuOWKm+WvvOW4g+WxgCBmb3JjZS1kaXJlY3RlZFxuICovXG5leHBvcnQgY2xhc3MgRm9yY2VMYXlvdXQgZXh0ZW5kcyBCYXNlIHtcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIC8qKiDlkJHlv4PlipvkvZznlKjngrkgKi9cbiAgICAgICAgdGhpcy5jZW50ZXIgPSBbMCwgMF07XG4gICAgICAgIC8qKiDoioLngrnkvZznlKjlipsgKi9cbiAgICAgICAgdGhpcy5ub2RlU3RyZW5ndGggPSBudWxsO1xuICAgICAgICAvKiog6L6555qE5L2c55So5YqbLCDpu5jorqTkuLrmoLnmja7oioLngrnnmoTlhaXluqblh7rluqboh6rpgILlupQgKi9cbiAgICAgICAgdGhpcy5lZGdlU3RyZW5ndGggPSBudWxsO1xuICAgICAgICAvKiog5piv5ZCm6Ziy5q2i6IqC54K555u45LqS6KaG55uWICovXG4gICAgICAgIHRoaXMucHJldmVudE92ZXJsYXAgPSBmYWxzZTtcbiAgICAgICAgLyoqIOiBmuexu+iKgueCueS9nOeUqOWKmyAqL1xuICAgICAgICB0aGlzLmNsdXN0ZXJOb2RlU3RyZW5ndGggPSBudWxsO1xuICAgICAgICAvKiog6IGa57G76L655L2c55So5YqbICovXG4gICAgICAgIHRoaXMuY2x1c3RlckVkZ2VTdHJlbmd0aCA9IG51bGw7XG4gICAgICAgIC8qKiDogZrnsbvovrnplb/luqYgKi9cbiAgICAgICAgdGhpcy5jbHVzdGVyRWRnZURpc3RhbmNlID0gbnVsbDtcbiAgICAgICAgLyoqIOiBmuexu+iKgueCueWkp+WwjyAvIOebtOW+hO+8jOebtOW+hOi2iuWkp++8jOi2iuWIhuaVoyAqL1xuICAgICAgICB0aGlzLmNsdXN0ZXJOb2RlU2l6ZSA9IG51bGw7XG4gICAgICAgIC8qKiDnlKjkuo4gZm9jaSDnmoTlipsgKi9cbiAgICAgICAgdGhpcy5jbHVzdGVyRm9jaVN0cmVuZ3RoID0gbnVsbDtcbiAgICAgICAgLyoqIOm7mOiupOi+uemVv+W6piAqL1xuICAgICAgICB0aGlzLmxpbmtEaXN0YW5jZSA9IDUwO1xuICAgICAgICAvKiog6L+t5Luj6ZiI5YC855qE6KGw5YeP546HIFswLCAxXe+8jDAuMDI4IOWvueW6lOacgOWkp+i/reS7o+aVsOS4uiAzMDAgKi9cbiAgICAgICAgdGhpcy5hbHBoYURlY2F5ID0gMC4wMjg7XG4gICAgICAgIC8qKiDlgZzmraLov63ku6PnmoTpmIjlgLwgKi9cbiAgICAgICAgdGhpcy5hbHBoYU1pbiA9IDAuMDAxO1xuICAgICAgICAvKiog5b2T5YmN6ZiI5YC8ICovXG4gICAgICAgIHRoaXMuYWxwaGEgPSAwLjM7XG4gICAgICAgIC8qKiDpmLLmraLph43lj6DnmoTlipvlvLrluqYgKi9cbiAgICAgICAgdGhpcy5jb2xsaWRlU3RyZW5ndGggPSAxO1xuICAgICAgICAvKiog5piv5ZCm5ZCv55Sod2ViIHdvcmtlcuOAguWJjeaPkOaYr+WcqHdlYiB3b3JrZXLph4zmiafooYzluIPlsYDvvIzlkKbliJnml6DmlYhcdCovXG4gICAgICAgIHRoaXMud29ya2VyRW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnRpY2sgPSAoKSA9PiB7IH07XG4gICAgICAgIC8qKiDluIPlsYDlrozmiJDlm57osIMgKi9cbiAgICAgICAgdGhpcy5vbkxheW91dEVuZCA9ICgpID0+IHsgfTtcbiAgICAgICAgLyoqIOaYr+WQpuato+WcqOW4g+WxgCAqL1xuICAgICAgICB0aGlzLnRpY2tpbmcgPSB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChvcHRpb25zKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNmZyhvcHRpb25zKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXREZWZhdWx0Q2ZnKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY2VudGVyOiBbMCwgMF0sXG4gICAgICAgICAgICBub2RlU3RyZW5ndGg6IG51bGwsXG4gICAgICAgICAgICBlZGdlU3RyZW5ndGg6IG51bGwsXG4gICAgICAgICAgICBwcmV2ZW50T3ZlcmxhcDogZmFsc2UsXG4gICAgICAgICAgICBub2RlU2l6ZTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgbm9kZVNwYWNpbmc6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGxpbmtEaXN0YW5jZTogNTAsXG4gICAgICAgICAgICBmb3JjZVNpbXVsYXRpb246IG51bGwsXG4gICAgICAgICAgICBhbHBoYURlY2F5OiAwLjAyOCxcbiAgICAgICAgICAgIGFscGhhTWluOiAwLjAwMSxcbiAgICAgICAgICAgIGFscGhhOiAwLjMsXG4gICAgICAgICAgICBjb2xsaWRlU3RyZW5ndGg6IDEsXG4gICAgICAgICAgICBjbHVzdGVyaW5nOiBmYWxzZSxcbiAgICAgICAgICAgIGNsdXN0ZXJOb2RlU3RyZW5ndGg6IC0xLFxuICAgICAgICAgICAgY2x1c3RlckVkZ2VTdHJlbmd0aDogMC4xLFxuICAgICAgICAgICAgY2x1c3RlckVkZ2VEaXN0YW5jZTogMTAwLFxuICAgICAgICAgICAgY2x1c3RlckZvY2lTdHJlbmd0aDogMC44LFxuICAgICAgICAgICAgY2x1c3Rlck5vZGVTaXplOiAxMCxcbiAgICAgICAgICAgIHRpY2soKSB7IH0sXG4gICAgICAgICAgICBvbkxheW91dEVuZCgpIHsgfSxcbiAgICAgICAgICAgIC8vIOaYr+WQpuWQr+eUqHdlYiB3b3JrZXLjgILliY3mj5DmmK/lnKh3ZWIgd29ya2Vy6YeM5omn6KGM5biD5bGA77yM5ZCm5YiZ5peg5pWIXG4gICAgICAgICAgICB3b3JrZXJFbmFibGVkOiBmYWxzZVxuICAgICAgICB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiDliJ3lp4vljJZcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZGF0YSDmlbDmja5cbiAgICAgKi9cbiAgICBpbml0KGRhdGEpIHtcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICAgIHNlbGYubm9kZXMgPSBkYXRhLm5vZGVzIHx8IFtdO1xuICAgICAgICBjb25zdCBlZGdlcyA9IGRhdGEuZWRnZXMgfHwgW107XG4gICAgICAgIHNlbGYuZWRnZXMgPSBlZGdlcy5tYXAoKGVkZ2UpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlcyA9IHt9O1xuICAgICAgICAgICAgY29uc3QgZXhwZWN0S2V5cyA9IFtcInRhcmdldE5vZGVcIiwgXCJzb3VyY2VOb2RlXCIsIFwic3RhcnRQb2ludFwiLCBcImVuZFBvaW50XCJdO1xuICAgICAgICAgICAgT2JqZWN0LmtleXMoZWRnZSkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCEoZXhwZWN0S2V5cy5pbmRleE9mKGtleSkgPiAtMSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzW2tleV0gPSBlZGdlW2tleV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICB9KTtcbiAgICAgICAgc2VsZi50aWNraW5nID0gZmFsc2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIOaJp+ihjOW4g+WxgFxuICAgICAqL1xuICAgIGV4ZWN1dGUocmVsb2FkRGF0YSkge1xuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAgICAgY29uc3Qgbm9kZXMgPSBzZWxmLm5vZGVzO1xuICAgICAgICBjb25zdCBlZGdlcyA9IHNlbGYuZWRnZXM7XG4gICAgICAgIC8vIOWmguaenOato+WcqOW4g+WxgO+8jOW/veeVpeW4g+WxgOivt+axglxuICAgICAgICBpZiAoc2VsZi50aWNraW5nKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHNpbXVsYXRpb24gPSBzZWxmLmZvcmNlU2ltdWxhdGlvbjtcbiAgICAgICAgY29uc3QgYWxwaGFNaW4gPSBzZWxmLmFscGhhTWluO1xuICAgICAgICBjb25zdCBhbHBoYURlY2F5ID0gc2VsZi5hbHBoYURlY2F5O1xuICAgICAgICBjb25zdCBhbHBoYSA9IHNlbGYuYWxwaGE7XG4gICAgICAgIGlmICghc2ltdWxhdGlvbikge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAvLyDlrprkuYnoioLngrnnmoTliptcbiAgICAgICAgICAgICAgICBjb25zdCBub2RlRm9yY2UgPSBkM0ZvcmNlLmZvcmNlTWFueUJvZHkoKTtcbiAgICAgICAgICAgICAgICBpZiAoc2VsZi5ub2RlU3RyZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZUZvcmNlLnN0cmVuZ3RoKHNlbGYubm9kZVN0cmVuZ3RoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc2ltdWxhdGlvbiA9IGQzRm9yY2UuZm9yY2VTaW11bGF0aW9uKCkubm9kZXMobm9kZXMpO1xuICAgICAgICAgICAgICAgIGlmIChzZWxmLmNsdXN0ZXJpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2x1c3RlckZvcmNlID0gZm9yY2VJbkFCb3goKTtcbiAgICAgICAgICAgICAgICAgICAgY2x1c3RlckZvcmNlXG4gICAgICAgICAgICAgICAgICAgICAgICAuY2VudGVyWChzZWxmLmNlbnRlclswXSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5jZW50ZXJZKHNlbGYuY2VudGVyWzFdKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnRlbXBsYXRlKFwiZm9yY2VcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIC5zdHJlbmd0aChzZWxmLmNsdXN0ZXJGb2NpU3RyZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZWRnZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJGb3JjZS5saW5rcyhlZGdlcyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbHVzdGVyRm9yY2Uubm9kZXMobm9kZXMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJGb3JjZVxuICAgICAgICAgICAgICAgICAgICAgICAgLmZvcmNlTGlua0Rpc3RhbmNlKHNlbGYuY2x1c3RlckVkZ2VEaXN0YW5jZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5mb3JjZUxpbmtTdHJlbmd0aChzZWxmLmNsdXN0ZXJFZGdlU3RyZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgICAgICAuZm9yY2VDaGFyZ2Uoc2VsZi5jbHVzdGVyTm9kZVN0cmVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmZvcmNlTm9kZVNpemUoc2VsZi5jbHVzdGVyTm9kZVNpemUpO1xuICAgICAgICAgICAgICAgICAgICBzZWxmLmNsdXN0ZXJGb3JjZSA9IGNsdXN0ZXJGb3JjZTtcbiAgICAgICAgICAgICAgICAgICAgc2ltdWxhdGlvbi5mb3JjZShcImdyb3VwXCIsIGNsdXN0ZXJGb3JjZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNpbXVsYXRpb25cbiAgICAgICAgICAgICAgICAgICAgLmZvcmNlKFwiY2VudGVyXCIsIGQzRm9yY2UuZm9yY2VDZW50ZXIoc2VsZi5jZW50ZXJbMF0sIHNlbGYuY2VudGVyWzFdKSlcbiAgICAgICAgICAgICAgICAgICAgLmZvcmNlKFwiY2hhcmdlXCIsIG5vZGVGb3JjZSlcbiAgICAgICAgICAgICAgICAgICAgLmFscGhhKGFscGhhKVxuICAgICAgICAgICAgICAgICAgICAuYWxwaGFEZWNheShhbHBoYURlY2F5KVxuICAgICAgICAgICAgICAgICAgICAuYWxwaGFNaW4oYWxwaGFNaW4pO1xuICAgICAgICAgICAgICAgIGlmIChzZWxmLnByZXZlbnRPdmVybGFwKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYub3ZlcmxhcFByb2Nlc3Moc2ltdWxhdGlvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIOWmguaenOaciei+ue+8jOWumuS5iei+ueeahOWKm1xuICAgICAgICAgICAgICAgIGlmIChlZGdlcykge1xuICAgICAgICAgICAgICAgICAgICAvLyBkMyDnmoQgZm9yY2VMYXlvdXQg5Lya6YeN5paw55Sf5oiQ6L6555qE5pWw5o2u5qih5Z6L77yM5Li65LqG6YG/5YWN5rGh5p+T5rqQ5pWw5o2uXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVkZ2VGb3JjZSA9IGQzRm9yY2VcbiAgICAgICAgICAgICAgICAgICAgICAgIC5mb3JjZUxpbmsoKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmlkKChkKSA9PiBkLmlkKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmxpbmtzKGVkZ2VzKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuZWRnZVN0cmVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlZGdlRm9yY2Uuc3RyZW5ndGgoc2VsZi5lZGdlU3RyZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmxpbmtEaXN0YW5jZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZWRnZUZvcmNlLmRpc3RhbmNlKHNlbGYubGlua0Rpc3RhbmNlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBzZWxmLmVkZ2VGb3JjZSA9IGVkZ2VGb3JjZTtcbiAgICAgICAgICAgICAgICAgICAgc2ltdWxhdGlvbi5mb3JjZShcImxpbmtcIiwgZWRnZUZvcmNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHNlbGYud29ya2VyRW5hYmxlZCAmJiAhaXNJbldvcmtlcigpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIOWmguaenOS4jeaYr+i/kOihjOWcqHdlYiB3b3JrZXLph4zvvIzkuI3nlKh3ZWIgd29ya2Vy5biD5bGAXG4gICAgICAgICAgICAgICAgICAgIHNlbGYud29ya2VyRW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXCJ3b3JrZXJFbmFibGVkIG9wdGlvbiBpcyBvbmx5IHN1cHBvcnRlZCB3aGVuIHJ1bm5pbmcgaW4gd2ViIHdvcmtlci5cIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghc2VsZi53b3JrZXJFbmFibGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHNpbXVsYXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIC5vbihcInRpY2tcIiwgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50aWNrKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAub24oXCJlbmRcIiwgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50aWNraW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vbkxheW91dEVuZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uTGF5b3V0RW5kKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzZWxmLnRpY2tpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gd29ya2VyIGlzIGVuYWJsZWRcbiAgICAgICAgICAgICAgICAgICAgc2ltdWxhdGlvbi5zdG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRvdGFsVGlja3MgPSBnZXRTaW11bGF0aW9uVGlja3Moc2ltdWxhdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGN1cnJlbnRUaWNrID0gMTsgY3VycmVudFRpY2sgPD0gdG90YWxUaWNrczsgY3VycmVudFRpY2srKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2ltdWxhdGlvbi50aWNrKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjdXJyZW50VGljayBzdGFydHMgZnJvbSAxLlxuICAgICAgICAgICAgICAgICAgICAgICAgcG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUaWNrLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsVGlja3MsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogTEFZT1VUX01FU1NBR0UuVElDS1xuICAgICAgICAgICAgICAgICAgICAgICAgfSwgdW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBzZWxmLnRpY2tpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc2VsZi5mb3JjZVNpbXVsYXRpb24gPSBzaW11bGF0aW9uO1xuICAgICAgICAgICAgICAgIHNlbGYudGlja2luZyA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHNlbGYudGlja2luZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChyZWxvYWREYXRhKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNlbGYuY2x1c3RlcmluZyAmJiBzZWxmLmNsdXN0ZXJGb3JjZSkge1xuICAgICAgICAgICAgICAgICAgICBzZWxmLmNsdXN0ZXJGb3JjZS5ub2Rlcyhub2Rlcyk7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYuY2x1c3RlckZvcmNlLmxpbmtzKGVkZ2VzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc2ltdWxhdGlvbi5ub2Rlcyhub2Rlcyk7XG4gICAgICAgICAgICAgICAgaWYgKGVkZ2VzICYmIHNlbGYuZWRnZUZvcmNlKVxuICAgICAgICAgICAgICAgICAgICBzZWxmLmVkZ2VGb3JjZS5saW5rcyhlZGdlcyk7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZWRnZXMgJiYgIXNlbGYuZWRnZUZvcmNlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGQzIOeahCBmb3JjZUxheW91dCDkvJrph43mlrDnlJ/miJDovrnnmoTmlbDmja7mqKHlnovvvIzkuLrkuobpgb/lhY3msaHmn5PmupDmlbDmja5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZWRnZUZvcmNlID0gZDNGb3JjZVxuICAgICAgICAgICAgICAgICAgICAgICAgLmZvcmNlTGluaygpXG4gICAgICAgICAgICAgICAgICAgICAgICAuaWQoKGQpID0+IGQuaWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAubGlua3MoZWRnZXMpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5lZGdlU3RyZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVkZ2VGb3JjZS5zdHJlbmd0aChzZWxmLmVkZ2VTdHJlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYubGlua0Rpc3RhbmNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlZGdlRm9yY2UuZGlzdGFuY2Uoc2VsZi5saW5rRGlzdGFuY2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHNlbGYuZWRnZUZvcmNlID0gZWRnZUZvcmNlO1xuICAgICAgICAgICAgICAgICAgICBzaW11bGF0aW9uLmZvcmNlKFwibGlua1wiLCBlZGdlRm9yY2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzZWxmLnByZXZlbnRPdmVybGFwKSB7XG4gICAgICAgICAgICAgICAgc2VsZi5vdmVybGFwUHJvY2VzcyhzaW11bGF0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNpbXVsYXRpb24uYWxwaGEoYWxwaGEpLnJlc3RhcnQoKTtcbiAgICAgICAgICAgIHRoaXMudGlja2luZyA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICog6Ziy5q2i6YeN5Y+gXG4gICAgICogQHBhcmFtIHtvYmplY3R9IHNpbXVsYXRpb24g5Yqb5qih5ouf5qih5Z6LXG4gICAgICovXG4gICAgb3ZlcmxhcFByb2Nlc3Moc2ltdWxhdGlvbikge1xuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAgICAgY29uc3Qgbm9kZVNpemUgPSBzZWxmLm5vZGVTaXplO1xuICAgICAgICBjb25zdCBub2RlU3BhY2luZyA9IHNlbGYubm9kZVNwYWNpbmc7XG4gICAgICAgIGxldCBub2RlU2l6ZUZ1bmM7XG4gICAgICAgIGxldCBub2RlU3BhY2luZ0Z1bmM7XG4gICAgICAgIGNvbnN0IGNvbGxpZGVTdHJlbmd0aCA9IHNlbGYuY29sbGlkZVN0cmVuZ3RoO1xuICAgICAgICBpZiAoaXNOdW1iZXIobm9kZVNwYWNpbmcpKSB7XG4gICAgICAgICAgICBub2RlU3BhY2luZ0Z1bmMgPSAoKSA9PiBub2RlU3BhY2luZztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc0Z1bmN0aW9uKG5vZGVTcGFjaW5nKSkge1xuICAgICAgICAgICAgbm9kZVNwYWNpbmdGdW5jID0gbm9kZVNwYWNpbmc7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBub2RlU3BhY2luZ0Z1bmMgPSAoKSA9PiAwO1xuICAgICAgICB9XG4gICAgICAgIGlmICghbm9kZVNpemUpIHtcbiAgICAgICAgICAgIG5vZGVTaXplRnVuYyA9IChkKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGQuc2l6ZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNBcnJheShkLnNpemUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXMgPSBkLnNpemVbMF0gPiBkLnNpemVbMV0gPyBkLnNpemVbMF0gOiBkLnNpemVbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzIC8gMiArIG5vZGVTcGFjaW5nRnVuYyhkKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoaXNPYmplY3QoZC5zaXplKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzID0gZC5zaXplLndpZHRoID4gZC5zaXplLmhlaWdodCA/IGQuc2l6ZS53aWR0aCA6IGQuc2l6ZS5oZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzIC8gMiArIG5vZGVTcGFjaW5nRnVuYyhkKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZC5zaXplIC8gMiArIG5vZGVTcGFjaW5nRnVuYyhkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIDEwICsgbm9kZVNwYWNpbmdGdW5jKGQpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc0Z1bmN0aW9uKG5vZGVTaXplKSkge1xuICAgICAgICAgICAgbm9kZVNpemVGdW5jID0gKGQpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzaXplID0gbm9kZVNpemUoZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNpemUgKyBub2RlU3BhY2luZ0Z1bmMoZCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzQXJyYXkobm9kZVNpemUpKSB7XG4gICAgICAgICAgICBjb25zdCBsYXJnZXIgPSBub2RlU2l6ZVswXSA+IG5vZGVTaXplWzFdID8gbm9kZVNpemVbMF0gOiBub2RlU2l6ZVsxXTtcbiAgICAgICAgICAgIGNvbnN0IHJhZGl1cyA9IGxhcmdlciAvIDI7XG4gICAgICAgICAgICBub2RlU2l6ZUZ1bmMgPSAoZCkgPT4gcmFkaXVzICsgbm9kZVNwYWNpbmdGdW5jKGQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzTnVtYmVyKG5vZGVTaXplKSkge1xuICAgICAgICAgICAgY29uc3QgcmFkaXVzID0gbm9kZVNpemUgLyAyO1xuICAgICAgICAgICAgbm9kZVNpemVGdW5jID0gKGQpID0+IHJhZGl1cyArIG5vZGVTcGFjaW5nRnVuYyhkKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG5vZGVTaXplRnVuYyA9ICgpID0+IDEwO1xuICAgICAgICB9XG4gICAgICAgIC8vIGZvcmNlQ29sbGlkZSdzIHBhcmFtZXRlciBpcyBhIHJhZGl1c1xuICAgICAgICBzaW11bGF0aW9uLmZvcmNlKFwiY29sbGlzaW9uRm9yY2VcIiwgZDNGb3JjZS5mb3JjZUNvbGxpZGUobm9kZVNpemVGdW5jKS5zdHJlbmd0aChjb2xsaWRlU3RyZW5ndGgpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICog5pu05paw5biD5bGA6YWN572u77yM5L2G5LiN5omn6KGM5biD5bGAXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGNmZyDpnIDopoHmm7TmlrDnmoTphY3nva7poblcbiAgICAgKi9cbiAgICB1cGRhdGVDZmcoY2ZnKSB7XG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgICAgICBpZiAoc2VsZi50aWNraW5nKSB7XG4gICAgICAgICAgICBzZWxmLmZvcmNlU2ltdWxhdGlvbi5zdG9wKCk7XG4gICAgICAgICAgICBzZWxmLnRpY2tpbmcgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBzZWxmLmZvcmNlU2ltdWxhdGlvbiA9IG51bGw7XG4gICAgICAgIE9iamVjdC5hc3NpZ24oc2VsZiwgY2ZnKTtcbiAgICB9XG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICAgIGlmIChzZWxmLnRpY2tpbmcpIHtcbiAgICAgICAgICAgIHNlbGYuZm9yY2VTaW11bGF0aW9uLnN0b3AoKTtcbiAgICAgICAgICAgIHNlbGYudGlja2luZyA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHNlbGYubm9kZXMgPSBudWxsO1xuICAgICAgICBzZWxmLmVkZ2VzID0gbnVsbDtcbiAgICAgICAgc2VsZi5kZXN0cm95ZWQgPSB0cnVlO1xuICAgIH1cbn1cbi8vIFJldHVybiB0b3RhbCB0aWNrcyBvZiBkMy1mb3JjZSBzaW11bGF0aW9uXG5mdW5jdGlvbiBnZXRTaW11bGF0aW9uVGlja3Moc2ltdWxhdGlvbikge1xuICAgIGNvbnN0IGFscGhhTWluID0gc2ltdWxhdGlvbi5hbHBoYU1pbigpO1xuICAgIGNvbnN0IGFscGhhVGFyZ2V0ID0gc2ltdWxhdGlvbi5hbHBoYVRhcmdldCgpO1xuICAgIGNvbnN0IGFscGhhID0gc2ltdWxhdGlvbi5hbHBoYSgpO1xuICAgIGNvbnN0IHRvdGFsVGlja3NGbG9hdCA9IE1hdGgubG9nKChhbHBoYU1pbiAtIGFscGhhVGFyZ2V0KSAvIChhbHBoYSAtIGFscGhhVGFyZ2V0KSkgL1xuICAgICAgICBNYXRoLmxvZygxIC0gc2ltdWxhdGlvbi5hbHBoYURlY2F5KCkpO1xuICAgIGNvbnN0IHRvdGFsVGlja3MgPSBNYXRoLmNlaWwodG90YWxUaWNrc0Zsb2F0KTtcbiAgICByZXR1cm4gdG90YWxUaWNrcztcbn1cbi8vIOWIpOaWreaYr+WQpui/kOihjOWcqHdlYiB3b3JrZXLph4xcbmZ1bmN0aW9uIGlzSW5Xb3JrZXIoKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gICAgcmV0dXJuICh0eXBlb2YgV29ya2VyR2xvYmFsU2NvcGUgIT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgc2VsZiBpbnN0YW5jZW9mIFdvcmtlckdsb2JhbFNjb3BlKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWZvcmNlLmpzLm1hcCIsImV4cG9ydCAqIGZyb20gJy4vZm9yY2UnO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiLyoqXG4gKiBAZmlsZU92ZXJ2aWV3IHJhbmRvbSBsYXlvdXRcbiAqIEBhdXRob3Igc2hpd3Uud3l5QGFudGZpbi5jb21cbiAqL1xuaW1wb3J0IHsgQmFzZSB9IGZyb20gXCIuL2Jhc2VcIjtcbmltcG9ydCB7IGdldERlZ3JlZSwgY2xvbmUsIGdldEVkZ2VUZXJtaW5hbCB9IGZyb20gXCIuLi91dGlsXCI7XG5mdW5jdGlvbiBpbml0SGllcmFyY2h5KG5vZGVzLCBlZGdlcywgbm9kZU1hcCwgZGlyZWN0ZWQpIHtcbiAgICBub2Rlcy5mb3JFYWNoKChfLCBpKSA9PiB7XG4gICAgICAgIG5vZGVzW2ldLmNoaWxkcmVuID0gW107XG4gICAgICAgIG5vZGVzW2ldLnBhcmVudCA9IFtdO1xuICAgIH0pO1xuICAgIGlmIChkaXJlY3RlZCkge1xuICAgICAgICBlZGdlcy5mb3JFYWNoKChlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2UgPSBnZXRFZGdlVGVybWluYWwoZSwgJ3NvdXJjZScpO1xuICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gZ2V0RWRnZVRlcm1pbmFsKGUsICd0YXJnZXQnKTtcbiAgICAgICAgICAgIGxldCBzb3VyY2VJZHggPSAwO1xuICAgICAgICAgICAgaWYgKHNvdXJjZSkge1xuICAgICAgICAgICAgICAgIHNvdXJjZUlkeCA9IG5vZGVNYXBbc291cmNlXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCB0YXJnZXRJZHggPSAwO1xuICAgICAgICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICAgICAgICAgIHRhcmdldElkeCA9IG5vZGVNYXBbdGFyZ2V0XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGNoaWxkID0gbm9kZXNbc291cmNlSWR4XS5jaGlsZHJlbjtcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9IG5vZGVzW3RhcmdldElkeF0ucGFyZW50O1xuICAgICAgICAgICAgY2hpbGQucHVzaChub2Rlc1t0YXJnZXRJZHhdLmlkKTtcbiAgICAgICAgICAgIHBhcmVudC5wdXNoKG5vZGVzW3NvdXJjZUlkeF0uaWQpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGVkZ2VzLmZvckVhY2goKGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZSA9IGdldEVkZ2VUZXJtaW5hbChlLCAnc291cmNlJyk7XG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBnZXRFZGdlVGVybWluYWwoZSwgJ3RhcmdldCcpO1xuICAgICAgICAgICAgbGV0IHNvdXJjZUlkeCA9IDA7XG4gICAgICAgICAgICBpZiAoc291cmNlKSB7XG4gICAgICAgICAgICAgICAgc291cmNlSWR4ID0gbm9kZU1hcFtzb3VyY2VdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHRhcmdldElkeCA9IDA7XG4gICAgICAgICAgICBpZiAodGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0SWR4ID0gbm9kZU1hcFt0YXJnZXRdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgc291cmNlQ2hpbGRyZW4gPSBub2Rlc1tzb3VyY2VJZHhdLmNoaWxkcmVuO1xuICAgICAgICAgICAgY29uc3QgdGFyZ2V0Q2hpbGRyZW4gPSBub2Rlc1t0YXJnZXRJZHhdLmNoaWxkcmVuO1xuICAgICAgICAgICAgc291cmNlQ2hpbGRyZW4ucHVzaChub2Rlc1t0YXJnZXRJZHhdLmlkKTtcbiAgICAgICAgICAgIHRhcmdldENoaWxkcmVuLnB1c2gobm9kZXNbc291cmNlSWR4XS5pZCk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGNvbm5lY3QoYSwgYiwgZWRnZXMpIHtcbiAgICBjb25zdCBtID0gZWRnZXMubGVuZ3RoO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbTsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IGdldEVkZ2VUZXJtaW5hbChlZGdlc1tpXSwgJ3NvdXJjZScpO1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBnZXRFZGdlVGVybWluYWwoZWRnZXNbaV0sICd0YXJnZXQnKTtcbiAgICAgICAgaWYgKChhLmlkID09PSBzb3VyY2UgJiYgYi5pZCA9PT0gdGFyZ2V0KSB8fFxuICAgICAgICAgICAgKGIuaWQgPT09IHNvdXJjZSAmJiBhLmlkID09PSB0YXJnZXQpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBjb21wYXJlRGVncmVlKGEsIGIpIHtcbiAgICBjb25zdCBhRGVncmVlID0gYS5kZWdyZWU7XG4gICAgY29uc3QgYkRlZ3JlZSA9IGIuZGVncmVlO1xuICAgIGlmIChhRGVncmVlIDwgYkRlZ3JlZSkge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgfVxuICAgIGlmIChhRGVncmVlID4gYkRlZ3JlZSkge1xuICAgICAgICByZXR1cm4gMTtcbiAgICB9XG4gICAgcmV0dXJuIDA7XG59XG4vKipcbiAqIOWchuW9ouW4g+WxgFxuICovXG5leHBvcnQgY2xhc3MgQ2lyY3VsYXJMYXlvdXQgZXh0ZW5kcyBCYXNlIHtcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIC8qKiDlm7rlrprljYrlvoTvvIzoi6Xorr7nva7kuoYgcmFkaXVz77yM5YiZIHN0YXJ0UmFkaXVzIOS4jiBlbmRSYWRpdXMg5LiN6LW35pWIICovXG4gICAgICAgIHRoaXMucmFkaXVzID0gbnVsbDtcbiAgICAgICAgLyoqIOi1t+Wni+WNiuW+hCAqL1xuICAgICAgICB0aGlzLnN0YXJ0UmFkaXVzID0gbnVsbDtcbiAgICAgICAgLyoqIOe7iOatouWNiuW+hCAqL1xuICAgICAgICB0aGlzLmVuZFJhZGl1cyA9IG51bGw7XG4gICAgICAgIC8qKiDotbflp4vop5LluqYgKi9cbiAgICAgICAgdGhpcy5zdGFydEFuZ2xlID0gMDtcbiAgICAgICAgLyoqIOe7iOatouinkuW6piAqL1xuICAgICAgICB0aGlzLmVuZEFuZ2xlID0gMiAqIE1hdGguUEk7XG4gICAgICAgIC8qKiDmmK/lkKbpobrml7bpkoggKi9cbiAgICAgICAgdGhpcy5jbG9ja3dpc2UgPSB0cnVlO1xuICAgICAgICAvKiog6IqC54K55Zyo546v5LiK5YiG5oiQ5q615pWw77yI5Yeg5Liq5q615bCG5Z2H5YyA5YiG5biD77yJ77yM5ZyoIGVuZFJhZGl1cyAtIHN0YXJ0UmFkaXVzICE9IDAg5pe255Sf5pWIICovXG4gICAgICAgIHRoaXMuZGl2aXNpb25zID0gMTtcbiAgICAgICAgLyoqIOiKgueCueWcqOeOr+S4iuaOkuW6j+eahOS+neaNru+8jOWPr+mAiTogJ3RvcG9sb2d5JywgJ2RlZ3JlZScsICdudWxsJyAqL1xuICAgICAgICB0aGlzLm9yZGVyaW5nID0gbnVsbDtcbiAgICAgICAgLyoqIGhvdyBtYW55IDIqcGkgZnJvbSBmaXJzdCB0byBsYXN0IG5vZGVzICovXG4gICAgICAgIHRoaXMuYW5nbGVSYXRpbyA9IDE7XG4gICAgICAgIHRoaXMubm9kZXMgPSBbXTtcbiAgICAgICAgdGhpcy5lZGdlcyA9IFtdO1xuICAgICAgICB0aGlzLm5vZGVNYXAgPSB7fTtcbiAgICAgICAgdGhpcy5kZWdyZWVzID0gW107XG4gICAgICAgIHRoaXMud2lkdGggPSAzMDA7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gMzAwO1xuICAgICAgICB0aGlzLnVwZGF0ZUNmZyhvcHRpb25zKTtcbiAgICB9XG4gICAgZ2V0RGVmYXVsdENmZygpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHJhZGl1czogbnVsbCxcbiAgICAgICAgICAgIHN0YXJ0UmFkaXVzOiBudWxsLFxuICAgICAgICAgICAgZW5kUmFkaXVzOiBudWxsLFxuICAgICAgICAgICAgc3RhcnRBbmdsZTogMCxcbiAgICAgICAgICAgIGVuZEFuZ2xlOiAyICogTWF0aC5QSSxcbiAgICAgICAgICAgIGNsb2Nrd2lzZTogdHJ1ZSxcbiAgICAgICAgICAgIGRpdmlzaW9uczogMSxcbiAgICAgICAgICAgIG9yZGVyaW5nOiBudWxsLFxuICAgICAgICAgICAgYW5nbGVSYXRpbzogMVxuICAgICAgICB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiDmiafooYzluIPlsYBcbiAgICAgKi9cbiAgICBleGVjdXRlKCkge1xuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAgICAgY29uc3Qgbm9kZXMgPSBzZWxmLm5vZGVzO1xuICAgICAgICBjb25zdCBlZGdlcyA9IHNlbGYuZWRnZXM7XG4gICAgICAgIGNvbnN0IG4gPSBub2Rlcy5sZW5ndGg7XG4gICAgICAgIGlmIChuID09PSAwKSB7XG4gICAgICAgICAgICBpZiAoc2VsZi5vbkxheW91dEVuZClcbiAgICAgICAgICAgICAgICBzZWxmLm9uTGF5b3V0RW5kKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzZWxmLndpZHRoICYmIHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIHNlbGYud2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXNlbGYuaGVpZ2h0ICYmIHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIHNlbGYuaGVpZ2h0ID0gd2luZG93LmlubmVySGVpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIGlmICghc2VsZi5jZW50ZXIpIHtcbiAgICAgICAgICAgIHNlbGYuY2VudGVyID0gW3NlbGYud2lkdGggLyAyLCBzZWxmLmhlaWdodCAvIDJdO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNlbnRlciA9IHNlbGYuY2VudGVyO1xuICAgICAgICBpZiAobiA9PT0gMSkge1xuICAgICAgICAgICAgbm9kZXNbMF0ueCA9IGNlbnRlclswXTtcbiAgICAgICAgICAgIG5vZGVzWzBdLnkgPSBjZW50ZXJbMV07XG4gICAgICAgICAgICBpZiAoc2VsZi5vbkxheW91dEVuZClcbiAgICAgICAgICAgICAgICBzZWxmLm9uTGF5b3V0RW5kKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJhZGl1cyA9IHNlbGYucmFkaXVzO1xuICAgICAgICBsZXQgc3RhcnRSYWRpdXMgPSBzZWxmLnN0YXJ0UmFkaXVzO1xuICAgICAgICBsZXQgZW5kUmFkaXVzID0gc2VsZi5lbmRSYWRpdXM7XG4gICAgICAgIGNvbnN0IGRpdmlzaW9ucyA9IHNlbGYuZGl2aXNpb25zO1xuICAgICAgICBjb25zdCBzdGFydEFuZ2xlID0gc2VsZi5zdGFydEFuZ2xlO1xuICAgICAgICBjb25zdCBlbmRBbmdsZSA9IHNlbGYuZW5kQW5nbGU7XG4gICAgICAgIGNvbnN0IGFuZ2xlU3RlcCA9IChlbmRBbmdsZSAtIHN0YXJ0QW5nbGUpIC8gbjtcbiAgICAgICAgLy8gbGF5b3V0XG4gICAgICAgIGNvbnN0IG5vZGVNYXAgPSB7fTtcbiAgICAgICAgbm9kZXMuZm9yRWFjaCgobm9kZSwgaSkgPT4ge1xuICAgICAgICAgICAgbm9kZU1hcFtub2RlLmlkXSA9IGk7XG4gICAgICAgIH0pO1xuICAgICAgICBzZWxmLm5vZGVNYXAgPSBub2RlTWFwO1xuICAgICAgICBjb25zdCBkZWdyZWVzID0gZ2V0RGVncmVlKG5vZGVzLmxlbmd0aCwgbm9kZU1hcCwgZWRnZXMpO1xuICAgICAgICBzZWxmLmRlZ3JlZXMgPSBkZWdyZWVzO1xuICAgICAgICBpZiAoIXJhZGl1cyAmJiAhc3RhcnRSYWRpdXMgJiYgIWVuZFJhZGl1cykge1xuICAgICAgICAgICAgcmFkaXVzID0gc2VsZi5oZWlnaHQgPiBzZWxmLndpZHRoID8gc2VsZi53aWR0aCAvIDIgOiBzZWxmLmhlaWdodCAvIDI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIXN0YXJ0UmFkaXVzICYmIGVuZFJhZGl1cykge1xuICAgICAgICAgICAgc3RhcnRSYWRpdXMgPSBlbmRSYWRpdXM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc3RhcnRSYWRpdXMgJiYgIWVuZFJhZGl1cykge1xuICAgICAgICAgICAgZW5kUmFkaXVzID0gc3RhcnRSYWRpdXM7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYW5nbGVSYXRpbyA9IHNlbGYuYW5nbGVSYXRpbztcbiAgICAgICAgY29uc3QgYXN0ZXAgPSBhbmdsZVN0ZXAgKiBhbmdsZVJhdGlvO1xuICAgICAgICBjb25zdCBvcmRlcmluZyA9IHNlbGYub3JkZXJpbmc7XG4gICAgICAgIGxldCBsYXlvdXROb2RlcyA9IFtdO1xuICAgICAgICBpZiAob3JkZXJpbmcgPT09IFwidG9wb2xvZ3lcIikge1xuICAgICAgICAgICAgLy8gbGF5b3V0IGFjY29yZGluZyB0byB0aGUgdG9wb2xvZ3lcbiAgICAgICAgICAgIGxheW91dE5vZGVzID0gc2VsZi50b3BvbG9neU9yZGVyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAob3JkZXJpbmcgPT09IFwidG9wb2xvZ3ktZGlyZWN0ZWRcIikge1xuICAgICAgICAgICAgLy8gbGF5b3V0IGFjY29yZGluZyB0byB0aGUgdG9wb2xvZ3lcbiAgICAgICAgICAgIGxheW91dE5vZGVzID0gc2VsZi50b3BvbG9neU9yZGVyaW5nKHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG9yZGVyaW5nID09PSBcImRlZ3JlZVwiKSB7XG4gICAgICAgICAgICAvLyBsYXlvdXQgYWNjb3JkaW5nIHRvIHRoZSBkZXNjZW50IG9yZGVyIG9mIGRlZ3JlZXNcbiAgICAgICAgICAgIGxheW91dE5vZGVzID0gc2VsZi5kZWdyZWVPcmRlcmluZygpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gbGF5b3V0IGFjY29yZGluZyB0byB0aGUgb3JpZ2luYWwgb3JkZXIgaW4gdGhlIGRhdGEubm9kZXNcbiAgICAgICAgICAgIGxheW91dE5vZGVzID0gbm9kZXM7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2xvY2t3aXNlID0gc2VsZi5jbG9ja3dpc2U7XG4gICAgICAgIGNvbnN0IGRpdk4gPSBNYXRoLmNlaWwobiAvIGRpdmlzaW9ucyk7IC8vIG5vZGUgbnVtYmVyIGluIGVhY2ggZGl2aXNpb25cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgICAgICAgIGxldCByID0gcmFkaXVzO1xuICAgICAgICAgICAgaWYgKCFyICYmIHN0YXJ0UmFkaXVzICE9PSBudWxsICYmIGVuZFJhZGl1cyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHIgPSBzdGFydFJhZGl1cyArIChpICogKGVuZFJhZGl1cyAtIHN0YXJ0UmFkaXVzKSkgLyAobiAtIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFyKSB7XG4gICAgICAgICAgICAgICAgciA9IDEwICsgKGkgKiAxMDApIC8gKG4gLSAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBhbmdsZSA9IHN0YXJ0QW5nbGUgK1xuICAgICAgICAgICAgICAgIChpICUgZGl2TikgKiBhc3RlcCArXG4gICAgICAgICAgICAgICAgKCgyICogTWF0aC5QSSkgLyBkaXZpc2lvbnMpICogTWF0aC5mbG9vcihpIC8gZGl2Tik7XG4gICAgICAgICAgICBpZiAoIWNsb2Nrd2lzZSkge1xuICAgICAgICAgICAgICAgIGFuZ2xlID1cbiAgICAgICAgICAgICAgICAgICAgZW5kQW5nbGUgLVxuICAgICAgICAgICAgICAgICAgICAgICAgKGkgJSBkaXZOKSAqIGFzdGVwIC1cbiAgICAgICAgICAgICAgICAgICAgICAgICgoMiAqIE1hdGguUEkpIC8gZGl2aXNpb25zKSAqIE1hdGguZmxvb3IoaSAvIGRpdk4pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGF5b3V0Tm9kZXNbaV0ueCA9IGNlbnRlclswXSArIE1hdGguY29zKGFuZ2xlKSAqIHI7XG4gICAgICAgICAgICBsYXlvdXROb2Rlc1tpXS55ID0gY2VudGVyWzFdICsgTWF0aC5zaW4oYW5nbGUpICogcjtcbiAgICAgICAgICAgIGxheW91dE5vZGVzW2ldLndlaWdodCA9IGRlZ3JlZXNbaV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNlbGYub25MYXlvdXRFbmQpXG4gICAgICAgICAgICBzZWxmLm9uTGF5b3V0RW5kKCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBub2RlczogbGF5b3V0Tm9kZXMsXG4gICAgICAgICAgICBlZGdlczogdGhpcy5lZGdlc1xuICAgICAgICB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiDmoLnmja7oioLngrnnmoTmi5PmiZHnu5PmnoTmjpLluo9cbiAgICAgKiBAcmV0dXJuIHthcnJheX0gb3JkZXJlZE5vZGVzIOaOkuW6j+WQjueahOe7k+aenFxuICAgICAqL1xuICAgIHRvcG9sb2d5T3JkZXJpbmcoZGlyZWN0ZWQgPSBmYWxzZSkge1xuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAgICAgY29uc3QgZGVncmVlcyA9IHNlbGYuZGVncmVlcztcbiAgICAgICAgY29uc3QgZWRnZXMgPSBzZWxmLmVkZ2VzO1xuICAgICAgICBjb25zdCBub2RlcyA9IHNlbGYubm9kZXM7XG4gICAgICAgIGNvbnN0IGNub2RlcyA9IGNsb25lKG5vZGVzKTtcbiAgICAgICAgY29uc3Qgbm9kZU1hcCA9IHNlbGYubm9kZU1hcDtcbiAgICAgICAgY29uc3Qgb3JkZXJlZENOb2RlcyA9IFtjbm9kZXNbMF1dO1xuICAgICAgICBjb25zdCByZXNOb2RlcyA9IFtub2Rlc1swXV07XG4gICAgICAgIGNvbnN0IHBpY2tGbGFncyA9IFtdO1xuICAgICAgICBjb25zdCBuID0gbm9kZXMubGVuZ3RoO1xuICAgICAgICBwaWNrRmxhZ3NbMF0gPSB0cnVlO1xuICAgICAgICBpbml0SGllcmFyY2h5KGNub2RlcywgZWRnZXMsIG5vZGVNYXAsIGRpcmVjdGVkKTtcbiAgICAgICAgbGV0IGsgPSAwO1xuICAgICAgICBjbm9kZXMuZm9yRWFjaCgoY25vZGUsIGkpID0+IHtcbiAgICAgICAgICAgIGlmIChpICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKChpID09PSBuIC0gMSB8fFxuICAgICAgICAgICAgICAgICAgICBkZWdyZWVzW2ldICE9PSBkZWdyZWVzW2kgKyAxXSB8fFxuICAgICAgICAgICAgICAgICAgICBjb25uZWN0KG9yZGVyZWRDTm9kZXNba10sIGNub2RlLCBlZGdlcykpICYmXG4gICAgICAgICAgICAgICAgICAgICFwaWNrRmxhZ3NbaV0pIHtcbiAgICAgICAgICAgICAgICAgICAgb3JkZXJlZENOb2Rlcy5wdXNoKGNub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzTm9kZXMucHVzaChub2Rlc1tub2RlTWFwW2Nub2RlLmlkXV0pO1xuICAgICAgICAgICAgICAgICAgICBwaWNrRmxhZ3NbaV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBrKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZHJlbiA9IG9yZGVyZWRDTm9kZXNba10uY2hpbGRyZW47XG4gICAgICAgICAgICAgICAgICAgIGxldCBmb3VuZENoaWxkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgY2hpbGRyZW4ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkSWR4ID0gbm9kZU1hcFtjaGlsZHJlbltqXV07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVncmVlc1tjaGlsZElkeF0gPT09IGRlZ3JlZXNbaV0gJiYgIXBpY2tGbGFnc1tjaGlsZElkeF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmRlcmVkQ05vZGVzLnB1c2goY25vZGVzW2NoaWxkSWR4XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzTm9kZXMucHVzaChub2Rlc1tub2RlTWFwW2Nub2Rlc1tjaGlsZElkeF0uaWRdXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlja0ZsYWdzW2NoaWxkSWR4XSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRDaGlsZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbGV0IGlpID0gMDtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCFmb3VuZENoaWxkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBpY2tGbGFnc1tpaV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmRlcmVkQ05vZGVzLnB1c2goY25vZGVzW2lpXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzTm9kZXMucHVzaChub2Rlc1tub2RlTWFwW2Nub2Rlc1tpaV0uaWRdXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlja0ZsYWdzW2lpXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRDaGlsZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpaSsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlpID09PSBuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcmVzTm9kZXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIOagueaNruiKgueCueW6puaVsOWkp+Wwj+aOkuW6j1xuICAgICAqIEByZXR1cm4ge2FycmF5fSBvcmRlcmVkTm9kZXMg5o6S5bqP5ZCO55qE57uT5p6cXG4gICAgICovXG4gICAgZGVncmVlT3JkZXJpbmcoKSB7XG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgICAgICBjb25zdCBub2RlcyA9IHNlbGYubm9kZXM7XG4gICAgICAgIGNvbnN0IG9yZGVyZWROb2RlcyA9IFtdO1xuICAgICAgICBjb25zdCBkZWdyZWVzID0gc2VsZi5kZWdyZWVzO1xuICAgICAgICBub2Rlcy5mb3JFYWNoKChub2RlLCBpKSA9PiB7XG4gICAgICAgICAgICBub2RlLmRlZ3JlZSA9IGRlZ3JlZXNbaV07XG4gICAgICAgICAgICBvcmRlcmVkTm9kZXMucHVzaChub2RlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIG9yZGVyZWROb2Rlcy5zb3J0KGNvbXBhcmVEZWdyZWUpO1xuICAgICAgICByZXR1cm4gb3JkZXJlZE5vZGVzO1xuICAgIH1cbiAgICBnZXRUeXBlKCkge1xuICAgICAgICByZXR1cm4gXCJjaXJjdWxhclwiO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNpcmN1bGFyLmpzLm1hcCIsIi8qKlxuICogQGZpbGVPdmVydmlldyByYW5kb20gbGF5b3V0XG4gKiBAYXV0aG9yIHNoaXd1Lnd5eUBhbnRmaW4uY29tXG4gKi9cbmltcG9ydCBkYWdyZSBmcm9tIFwiZGFncmVqc1wiO1xuaW1wb3J0IHsgaXNBcnJheSwgaXNOdW1iZXIsIGlzT2JqZWN0LCBnZXRFZGdlVGVybWluYWwgfSBmcm9tIFwiLi4vdXRpbFwiO1xuaW1wb3J0IHsgQmFzZSB9IGZyb20gXCIuL2Jhc2VcIjtcbi8qKlxuICog5bGC5qyh5biD5bGAXG4gKi9cbmV4cG9ydCBjbGFzcyBEYWdyZUxheW91dCBleHRlbmRzIEJhc2Uge1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgLyoqIGxheW91dCDmlrnlkJEsIOWPr+mAiSBUQiwgQlQsIExSLCBSTCAqL1xuICAgICAgICB0aGlzLnJhbmtkaXIgPSBcIlRCXCI7XG4gICAgICAgIC8qKiDoioLngrnmsLTlubPpl7Tot50ocHgpICovXG4gICAgICAgIHRoaXMubm9kZXNlcCA9IDUwO1xuICAgICAgICAvKiog5q+P5LiA5bGC6IqC54K55LmL6Ze06Ze06LedICovXG4gICAgICAgIHRoaXMucmFua3NlcCA9IDUwO1xuICAgICAgICAvKiog5piv5ZCm5L+d55WZ5biD5bGA6L+e57q/55qE5o6n5Yi254K5ICovXG4gICAgICAgIHRoaXMuY29udHJvbFBvaW50cyA9IGZhbHNlO1xuICAgICAgICAvKiog5q+P5bGC6IqC54K55piv5ZCm5qC55o2u6IqC54K55pWw5o2u5Lit55qEIGNvbWJvSWQg6L+b6KGM5o6S5bqP77yM5Lul6Ziy5q2i5ZCM5bGCIGNvbWJvIOmHjeWPoCAqL1xuICAgICAgICB0aGlzLnNvcnRCeUNvbWJvID0gZmFsc2U7XG4gICAgICAgIC8qKiDmmK/lkKbkv53nlZnmr4/mnaHovrnkuIrnmoRkdW1teSBub2RlICovXG4gICAgICAgIHRoaXMuZWRnZUxhYmVsU3BhY2UgPSB0cnVlO1xuICAgICAgICAvKiog5piv5ZCm5oyJ54Wn57uZ5a6a55qE6IqC54K56aG65bqP5o6S5bqPICovXG4gICAgICAgIHRoaXMua2VlcE5vZGVPcmRlciA9IGZhbHNlO1xuICAgICAgICB0aGlzLm5vZGVzID0gW107XG4gICAgICAgIHRoaXMuZWRnZXMgPSBbXTtcbiAgICAgICAgLyoqIOi/reS7o+e7k+adn+eahOWbnuiwg+WHveaVsCAqL1xuICAgICAgICB0aGlzLm9uTGF5b3V0RW5kID0gKCkgPT4geyB9O1xuICAgICAgICB0aGlzLmxheW91dE5vZGUgPSAobm9kZUlkKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAgICAgICAgIGNvbnN0IHsgbm9kZXMgfSA9IHNlbGY7XG4gICAgICAgICAgICBjb25zdCBub2RlID0gbm9kZXMuZmluZChub2RlID0+IG5vZGUuaWQgPT09IG5vZGVJZCk7XG4gICAgICAgICAgICBpZiAobm9kZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxheW91dCA9IG5vZGUubGF5b3V0ICE9PSBmYWxzZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbGF5b3V0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMudXBkYXRlQ2ZnKG9wdGlvbnMpO1xuICAgIH1cbiAgICBnZXREZWZhdWx0Q2ZnKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcmFua2RpcjogXCJUQlwiLFxuICAgICAgICAgICAgYWxpZ246IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIG5vZGVTaXplOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBub2Rlc2VwRnVuYzogdW5kZWZpbmVkLFxuICAgICAgICAgICAgcmFua3NlcEZ1bmM6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIG5vZGVzZXA6IDUwLFxuICAgICAgICAgICAgcmFua3NlcDogNTAsXG4gICAgICAgICAgICBjb250cm9sUG9pbnRzOiBmYWxzZSwgLy8g5piv5ZCm5L+d55WZ5biD5bGA6L+e57q/55qE5o6n5Yi254K5XG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIOaJp+ihjOW4g+WxgFxuICAgICAqL1xuICAgIGV4ZWN1dGUoKSB7XG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgICAgICBjb25zdCB7IG5vZGVzLCBub2RlU2l6ZSwgcmFua2RpciwgY29tYm9zIH0gPSBzZWxmO1xuICAgICAgICBpZiAoIW5vZGVzKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBjb25zdCBlZGdlcyA9IHNlbGYuZWRnZXMgfHwgW107XG4gICAgICAgIGNvbnN0IGcgPSBuZXcgZGFncmUuZ3JhcGhsaWIuR3JhcGgoe1xuICAgICAgICAgICAgbXVsdGlncmFwaDogdHJ1ZSxcbiAgICAgICAgICAgIGNvbXBvdW5kOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgICAgbGV0IG5vZGVTaXplRnVuYztcbiAgICAgICAgaWYgKCFub2RlU2l6ZSkge1xuICAgICAgICAgICAgbm9kZVNpemVGdW5jID0gKGQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZC5zaXplKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0FycmF5KGQuc2l6ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkLnNpemU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzT2JqZWN0KGQuc2l6ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbZC5zaXplLndpZHRoIHx8IDQwLCBkLnNpemUuaGVpZ2h0IHx8IDQwXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW2Quc2l6ZSwgZC5zaXplXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIFs0MCwgNDBdO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc0FycmF5KG5vZGVTaXplKSkge1xuICAgICAgICAgICAgbm9kZVNpemVGdW5jID0gKCkgPT4gbm9kZVNpemU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBub2RlU2l6ZUZ1bmMgPSAoKSA9PiBbbm9kZVNpemUsIG5vZGVTaXplXTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgaG9yaXNlcCA9IGdldEZ1bmMoc2VsZi5ub2Rlc2VwRnVuYywgc2VsZi5ub2Rlc2VwLCA1MCk7XG4gICAgICAgIGxldCB2ZXJ0aXNlcCA9IGdldEZ1bmMoc2VsZi5yYW5rc2VwRnVuYywgc2VsZi5yYW5rc2VwLCA1MCk7XG4gICAgICAgIGlmIChyYW5rZGlyID09PSBcIkxSXCIgfHwgcmFua2RpciA9PT0gXCJSTFwiKSB7XG4gICAgICAgICAgICBob3Jpc2VwID0gZ2V0RnVuYyhzZWxmLnJhbmtzZXBGdW5jLCBzZWxmLnJhbmtzZXAsIDUwKTtcbiAgICAgICAgICAgIHZlcnRpc2VwID0gZ2V0RnVuYyhzZWxmLm5vZGVzZXBGdW5jLCBzZWxmLm5vZGVzZXAsIDUwKTtcbiAgICAgICAgfVxuICAgICAgICBnLnNldERlZmF1bHRFZGdlTGFiZWwoKCkgPT4gKHt9KSk7XG4gICAgICAgIGcuc2V0R3JhcGgoc2VsZik7XG4gICAgICAgIGNvbnN0IGNvbWJvTWFwID0ge307XG4gICAgICAgIG5vZGVzLmZpbHRlcigobm9kZSkgPT4gbm9kZS5sYXlvdXQgIT09IGZhbHNlKS5mb3JFYWNoKChub2RlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzaXplID0gbm9kZVNpemVGdW5jKG5vZGUpO1xuICAgICAgICAgICAgY29uc3QgdmVydGkgPSB2ZXJ0aXNlcChub2RlKTtcbiAgICAgICAgICAgIGNvbnN0IGhvcmkgPSBob3Jpc2VwKG5vZGUpO1xuICAgICAgICAgICAgY29uc3Qgd2lkdGggPSBzaXplWzBdICsgMiAqIGhvcmk7XG4gICAgICAgICAgICBjb25zdCBoZWlnaHQgPSBzaXplWzFdICsgMiAqIHZlcnRpO1xuICAgICAgICAgICAgY29uc3QgbGF5ZXIgPSBub2RlLmxheWVyO1xuICAgICAgICAgICAgaWYgKGlzTnVtYmVyKGxheWVyKSkge1xuICAgICAgICAgICAgICAgIC8vIOWmguaenOaciWxheWVy5bGe5oCn77yM5Yqg5YWl5Yiwbm9kZeeahGxhYmVs5LitXG4gICAgICAgICAgICAgICAgZy5zZXROb2RlKG5vZGUuaWQsIHsgd2lkdGgsIGhlaWdodCwgbGF5ZXIgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBnLnNldE5vZGUobm9kZS5pZCwgeyB3aWR0aCwgaGVpZ2h0IH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuc29ydEJ5Q29tYm8gJiYgbm9kZS5jb21ib0lkKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFjb21ib01hcFtub2RlLmNvbWJvSWRdKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbWJvTWFwW25vZGUuY29tYm9JZF0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBnLnNldE5vZGUobm9kZS5jb21ib0lkLCB7fSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGcuc2V0UGFyZW50KG5vZGUuaWQsIG5vZGUuY29tYm9JZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAodGhpcy5zb3J0QnlDb21ibyAmJiBjb21ib3MpIHtcbiAgICAgICAgICAgIGNvbWJvcy5mb3JFYWNoKChjb21ibykgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghY29tYm8ucGFyZW50SWQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICBpZiAoIWNvbWJvTWFwW2NvbWJvLnBhcmVudElkXSkge1xuICAgICAgICAgICAgICAgICAgICBjb21ib01hcFtjb21iby5wYXJlbnRJZF0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBnLnNldE5vZGUoY29tYm8ucGFyZW50SWQsIHt9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZy5zZXRQYXJlbnQoY29tYm8uaWQsIGNvbWJvLnBhcmVudElkKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVkZ2VzLmZvckVhY2goKGVkZ2UpID0+IHtcbiAgICAgICAgICAgIC8vIGRhZ3JlanMgV2lraSBodHRwczovL2dpdGh1Yi5jb20vZGFncmVqcy9kYWdyZS93aWtpI2NvbmZpZ3VyaW5nLXRoZS1sYXlvdXRcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZSA9IGdldEVkZ2VUZXJtaW5hbChlZGdlLCAnc291cmNlJyk7XG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBnZXRFZGdlVGVybWluYWwoZWRnZSwgJ3RhcmdldCcpO1xuICAgICAgICAgICAgaWYgKHRoaXMubGF5b3V0Tm9kZShzb3VyY2UpICYmIHRoaXMubGF5b3V0Tm9kZSh0YXJnZXQpKSB7XG4gICAgICAgICAgICAgICAgZy5zZXRFZGdlKHNvdXJjZSwgdGFyZ2V0LCB7XG4gICAgICAgICAgICAgICAgICAgIHdlaWdodDogZWRnZS53ZWlnaHQgfHwgMSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIC8vIOiAg+iZkeWinumHj+WbvuS4reeahOWOn+Wni+WbvlxuICAgICAgICBsZXQgcHJldkdyYXBoID0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAoc2VsZi5wcmVzZXQpIHtcbiAgICAgICAgICAgIHByZXZHcmFwaCA9IG5ldyBkYWdyZS5ncmFwaGxpYi5HcmFwaCh7XG4gICAgICAgICAgICAgICAgbXVsdGlncmFwaDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBjb21wb3VuZDogdHJ1ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc2VsZi5wcmVzZXQubm9kZXMuZm9yRWFjaCgobm9kZSkgPT4ge1xuICAgICAgICAgICAgICAgIHByZXZHcmFwaCA9PT0gbnVsbCB8fCBwcmV2R3JhcGggPT09IHZvaWQgMCA/IHZvaWQgMCA6IHByZXZHcmFwaC5zZXROb2RlKG5vZGUuaWQsIG5vZGUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZGFncmUubGF5b3V0KGcsIHtcbiAgICAgICAgICAgIHByZXZHcmFwaCxcbiAgICAgICAgICAgIGVkZ2VMYWJlbFNwYWNlOiBzZWxmLmVkZ2VMYWJlbFNwYWNlLFxuICAgICAgICAgICAga2VlcE5vZGVPcmRlcjogc2VsZi5rZWVwTm9kZU9yZGVyLFxuICAgICAgICAgICAgbm9kZU9yZGVyOiBzZWxmLm5vZGVPcmRlcixcbiAgICAgICAgfSk7XG4gICAgICAgIGxldCBjb29yZDtcbiAgICAgICAgZy5ub2RlcygpLmZvckVhY2goKG5vZGUpID0+IHtcbiAgICAgICAgICAgIGNvb3JkID0gZy5ub2RlKG5vZGUpO1xuICAgICAgICAgICAgY29uc3QgaSA9IG5vZGVzLmZpbmRJbmRleCgoaXQpID0+IGl0LmlkID09PSBub2RlKTtcbiAgICAgICAgICAgIGlmICghbm9kZXNbaV0pXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgbm9kZXNbaV0ueCA9IGNvb3JkLng7XG4gICAgICAgICAgICBub2Rlc1tpXS55ID0gY29vcmQueTtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmU6IHBhc3MgbGF5ZXIgb3JkZXIgdG8gZGF0YSBmb3IgaW5jcmVtZW50IGxheW91dCB1c2VcbiAgICAgICAgICAgIG5vZGVzW2ldLl9vcmRlciA9IGNvb3JkLl9vcmRlcjtcbiAgICAgICAgfSk7XG4gICAgICAgIGcuZWRnZXMoKS5mb3JFYWNoKChlZGdlKSA9PiB7XG4gICAgICAgICAgICBjb29yZCA9IGcuZWRnZShlZGdlKTtcbiAgICAgICAgICAgIGNvbnN0IGkgPSBlZGdlcy5maW5kSW5kZXgoKGl0KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc291cmNlID0gZ2V0RWRnZVRlcm1pbmFsKGl0LCAnc291cmNlJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gZ2V0RWRnZVRlcm1pbmFsKGl0LCAndGFyZ2V0Jyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNvdXJjZSA9PT0gZWRnZS52ICYmIHRhcmdldCA9PT0gZWRnZS53O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoKHNlbGYuZWRnZUxhYmVsU3BhY2UpICYmIHNlbGYuY29udHJvbFBvaW50cyAmJiBlZGdlc1tpXS50eXBlICE9PSBcImxvb3BcIikge1xuICAgICAgICAgICAgICAgIGVkZ2VzW2ldLmNvbnRyb2xQb2ludHMgPSBjb29yZC5wb2ludHMuc2xpY2UoMSwgY29vcmQucG9pbnRzLmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHNlbGYub25MYXlvdXRFbmQpXG4gICAgICAgICAgICBzZWxmLm9uTGF5b3V0RW5kKCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBub2RlcyxcbiAgICAgICAgICAgIGVkZ2VzLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBnZXRUeXBlKCkge1xuICAgICAgICByZXR1cm4gXCJkYWdyZVwiO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGdldEZ1bmMoZnVuYywgdmFsdWUsIGRlZmF1bHRWYWx1ZSkge1xuICAgIGxldCByZXN1bHRGdW5jO1xuICAgIGlmIChmdW5jKSB7XG4gICAgICAgIHJlc3VsdEZ1bmMgPSBmdW5jO1xuICAgIH1cbiAgICBlbHNlIGlmIChpc051bWJlcih2YWx1ZSkpIHtcbiAgICAgICAgcmVzdWx0RnVuYyA9ICgpID0+IHZhbHVlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmVzdWx0RnVuYyA9ICgpID0+IGRlZmF1bHRWYWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdEZ1bmM7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYWdyZS5qcy5tYXAiLCJjb25zdCB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlzQW55QXJyYXkob2JqZWN0KSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKG9iamVjdCkuZW5kc1dpdGgoJ0FycmF5XScpO1xufVxuIiwiaW1wb3J0IGlzQXJyYXkgZnJvbSAnaXMtYW55LWFycmF5JztcblxuZnVuY3Rpb24gbWF4KGlucHV0KSB7XG4gIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcblxuICBpZiAoIWlzQXJyYXkoaW5wdXQpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignaW5wdXQgbXVzdCBiZSBhbiBhcnJheScpO1xuICB9XG5cbiAgaWYgKGlucHV0Lmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2lucHV0IG11c3Qgbm90IGJlIGVtcHR5Jyk7XG4gIH1cblxuICB2YXIgX29wdGlvbnMkZnJvbUluZGV4ID0gb3B0aW9ucy5mcm9tSW5kZXgsXG4gICAgICBmcm9tSW5kZXggPSBfb3B0aW9ucyRmcm9tSW5kZXggPT09IHZvaWQgMCA/IDAgOiBfb3B0aW9ucyRmcm9tSW5kZXgsXG4gICAgICBfb3B0aW9ucyR0b0luZGV4ID0gb3B0aW9ucy50b0luZGV4LFxuICAgICAgdG9JbmRleCA9IF9vcHRpb25zJHRvSW5kZXggPT09IHZvaWQgMCA/IGlucHV0Lmxlbmd0aCA6IF9vcHRpb25zJHRvSW5kZXg7XG5cbiAgaWYgKGZyb21JbmRleCA8IDAgfHwgZnJvbUluZGV4ID49IGlucHV0Lmxlbmd0aCB8fCAhTnVtYmVyLmlzSW50ZWdlcihmcm9tSW5kZXgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdmcm9tSW5kZXggbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIgc21hbGxlciB0aGFuIGxlbmd0aCcpO1xuICB9XG5cbiAgaWYgKHRvSW5kZXggPD0gZnJvbUluZGV4IHx8IHRvSW5kZXggPiBpbnB1dC5sZW5ndGggfHwgIU51bWJlci5pc0ludGVnZXIodG9JbmRleCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3RvSW5kZXggbXVzdCBiZSBhbiBpbnRlZ2VyIGdyZWF0ZXIgdGhhbiBmcm9tSW5kZXggYW5kIGF0IG1vc3QgZXF1YWwgdG8gbGVuZ3RoJyk7XG4gIH1cblxuICB2YXIgbWF4VmFsdWUgPSBpbnB1dFtmcm9tSW5kZXhdO1xuXG4gIGZvciAodmFyIGkgPSBmcm9tSW5kZXggKyAxOyBpIDwgdG9JbmRleDsgaSsrKSB7XG4gICAgaWYgKGlucHV0W2ldID4gbWF4VmFsdWUpIG1heFZhbHVlID0gaW5wdXRbaV07XG4gIH1cblxuICByZXR1cm4gbWF4VmFsdWU7XG59XG5cbmV4cG9ydCBkZWZhdWx0IG1heDtcbiIsImltcG9ydCBpc0FycmF5IGZyb20gJ2lzLWFueS1hcnJheSc7XG5cbmZ1bmN0aW9uIG1pbihpbnB1dCkge1xuICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG5cbiAgaWYgKCFpc0FycmF5KGlucHV0KSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2lucHV0IG11c3QgYmUgYW4gYXJyYXknKTtcbiAgfVxuXG4gIGlmIChpbnB1dC5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdpbnB1dCBtdXN0IG5vdCBiZSBlbXB0eScpO1xuICB9XG5cbiAgdmFyIF9vcHRpb25zJGZyb21JbmRleCA9IG9wdGlvbnMuZnJvbUluZGV4LFxuICAgICAgZnJvbUluZGV4ID0gX29wdGlvbnMkZnJvbUluZGV4ID09PSB2b2lkIDAgPyAwIDogX29wdGlvbnMkZnJvbUluZGV4LFxuICAgICAgX29wdGlvbnMkdG9JbmRleCA9IG9wdGlvbnMudG9JbmRleCxcbiAgICAgIHRvSW5kZXggPSBfb3B0aW9ucyR0b0luZGV4ID09PSB2b2lkIDAgPyBpbnB1dC5sZW5ndGggOiBfb3B0aW9ucyR0b0luZGV4O1xuXG4gIGlmIChmcm9tSW5kZXggPCAwIHx8IGZyb21JbmRleCA+PSBpbnB1dC5sZW5ndGggfHwgIU51bWJlci5pc0ludGVnZXIoZnJvbUluZGV4KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignZnJvbUluZGV4IG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIHNtYWxsZXIgdGhhbiBsZW5ndGgnKTtcbiAgfVxuXG4gIGlmICh0b0luZGV4IDw9IGZyb21JbmRleCB8fCB0b0luZGV4ID4gaW5wdXQubGVuZ3RoIHx8ICFOdW1iZXIuaXNJbnRlZ2VyKHRvSW5kZXgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd0b0luZGV4IG11c3QgYmUgYW4gaW50ZWdlciBncmVhdGVyIHRoYW4gZnJvbUluZGV4IGFuZCBhdCBtb3N0IGVxdWFsIHRvIGxlbmd0aCcpO1xuICB9XG5cbiAgdmFyIG1pblZhbHVlID0gaW5wdXRbZnJvbUluZGV4XTtcblxuICBmb3IgKHZhciBpID0gZnJvbUluZGV4ICsgMTsgaSA8IHRvSW5kZXg7IGkrKykge1xuICAgIGlmIChpbnB1dFtpXSA8IG1pblZhbHVlKSBtaW5WYWx1ZSA9IGlucHV0W2ldO1xuICB9XG5cbiAgcmV0dXJuIG1pblZhbHVlO1xufVxuXG5leHBvcnQgZGVmYXVsdCBtaW47XG4iLCJpbXBvcnQgaXNBcnJheSBmcm9tICdpcy1hbnktYXJyYXknO1xuaW1wb3J0IG1heCBmcm9tICdtbC1hcnJheS1tYXgnO1xuaW1wb3J0IG1pbiBmcm9tICdtbC1hcnJheS1taW4nO1xuXG5mdW5jdGlvbiByZXNjYWxlKGlucHV0KSB7XG4gIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcblxuICBpZiAoIWlzQXJyYXkoaW5wdXQpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignaW5wdXQgbXVzdCBiZSBhbiBhcnJheScpO1xuICB9IGVsc2UgaWYgKGlucHV0Lmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2lucHV0IG11c3Qgbm90IGJlIGVtcHR5Jyk7XG4gIH1cblxuICB2YXIgb3V0cHV0O1xuXG4gIGlmIChvcHRpb25zLm91dHB1dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKCFpc0FycmF5KG9wdGlvbnMub3V0cHV0KSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb3V0cHV0IG9wdGlvbiBtdXN0IGJlIGFuIGFycmF5IGlmIHNwZWNpZmllZCcpO1xuICAgIH1cblxuICAgIG91dHB1dCA9IG9wdGlvbnMub3V0cHV0O1xuICB9IGVsc2Uge1xuICAgIG91dHB1dCA9IG5ldyBBcnJheShpbnB1dC5sZW5ndGgpO1xuICB9XG5cbiAgdmFyIGN1cnJlbnRNaW4gPSBtaW4oaW5wdXQpO1xuICB2YXIgY3VycmVudE1heCA9IG1heChpbnB1dCk7XG5cbiAgaWYgKGN1cnJlbnRNaW4gPT09IGN1cnJlbnRNYXgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignbWluaW11bSBhbmQgbWF4aW11bSBpbnB1dCB2YWx1ZXMgYXJlIGVxdWFsLiBDYW5ub3QgcmVzY2FsZSBhIGNvbnN0YW50IGFycmF5Jyk7XG4gIH1cblxuICB2YXIgX29wdGlvbnMkbWluID0gb3B0aW9ucy5taW4sXG4gICAgICBtaW5WYWx1ZSA9IF9vcHRpb25zJG1pbiA9PT0gdm9pZCAwID8gb3B0aW9ucy5hdXRvTWluTWF4ID8gY3VycmVudE1pbiA6IDAgOiBfb3B0aW9ucyRtaW4sXG4gICAgICBfb3B0aW9ucyRtYXggPSBvcHRpb25zLm1heCxcbiAgICAgIG1heFZhbHVlID0gX29wdGlvbnMkbWF4ID09PSB2b2lkIDAgPyBvcHRpb25zLmF1dG9NaW5NYXggPyBjdXJyZW50TWF4IDogMSA6IF9vcHRpb25zJG1heDtcblxuICBpZiAobWluVmFsdWUgPj0gbWF4VmFsdWUpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignbWluIG9wdGlvbiBtdXN0IGJlIHNtYWxsZXIgdGhhbiBtYXggb3B0aW9uJyk7XG4gIH1cblxuICB2YXIgZmFjdG9yID0gKG1heFZhbHVlIC0gbWluVmFsdWUpIC8gKGN1cnJlbnRNYXggLSBjdXJyZW50TWluKTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGlucHV0Lmxlbmd0aDsgaSsrKSB7XG4gICAgb3V0cHV0W2ldID0gKGlucHV0W2ldIC0gY3VycmVudE1pbikgKiBmYWN0b3IgKyBtaW5WYWx1ZTtcbiAgfVxuXG4gIHJldHVybiBvdXRwdXQ7XG59XG5cbmV4cG9ydCB7IHJlc2NhbGUgYXMgZGVmYXVsdCB9O1xuIiwiY29uc3QgaW5kZW50ID0gJyAnLnJlcGVhdCgyKTtcbmNvbnN0IGluZGVudERhdGEgPSAnICcucmVwZWF0KDQpO1xuXG5leHBvcnQgZnVuY3Rpb24gaW5zcGVjdE1hdHJpeCgpIHtcbiAgcmV0dXJuIGluc3BlY3RNYXRyaXhXaXRoT3B0aW9ucyh0aGlzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluc3BlY3RNYXRyaXhXaXRoT3B0aW9ucyhtYXRyaXgsIG9wdGlvbnMgPSB7fSkge1xuICBjb25zdCB7IG1heFJvd3MgPSAxNSwgbWF4Q29sdW1ucyA9IDEwLCBtYXhOdW1TaXplID0gOCB9ID0gb3B0aW9ucztcbiAgcmV0dXJuIGAke21hdHJpeC5jb25zdHJ1Y3Rvci5uYW1lfSB7XG4ke2luZGVudH1bXG4ke2luZGVudERhdGF9JHtpbnNwZWN0RGF0YShtYXRyaXgsIG1heFJvd3MsIG1heENvbHVtbnMsIG1heE51bVNpemUpfVxuJHtpbmRlbnR9XVxuJHtpbmRlbnR9cm93czogJHttYXRyaXgucm93c31cbiR7aW5kZW50fWNvbHVtbnM6ICR7bWF0cml4LmNvbHVtbnN9XG59YDtcbn1cblxuZnVuY3Rpb24gaW5zcGVjdERhdGEobWF0cml4LCBtYXhSb3dzLCBtYXhDb2x1bW5zLCBtYXhOdW1TaXplKSB7XG4gIGNvbnN0IHsgcm93cywgY29sdW1ucyB9ID0gbWF0cml4O1xuICBjb25zdCBtYXhJID0gTWF0aC5taW4ocm93cywgbWF4Um93cyk7XG4gIGNvbnN0IG1heEogPSBNYXRoLm1pbihjb2x1bW5zLCBtYXhDb2x1bW5zKTtcbiAgY29uc3QgcmVzdWx0ID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbWF4STsgaSsrKSB7XG4gICAgbGV0IGxpbmUgPSBbXTtcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IG1heEo7IGorKykge1xuICAgICAgbGluZS5wdXNoKGZvcm1hdE51bWJlcihtYXRyaXguZ2V0KGksIGopLCBtYXhOdW1TaXplKSk7XG4gICAgfVxuICAgIHJlc3VsdC5wdXNoKGAke2xpbmUuam9pbignICcpfWApO1xuICB9XG4gIGlmIChtYXhKICE9PSBjb2x1bW5zKSB7XG4gICAgcmVzdWx0W3Jlc3VsdC5sZW5ndGggLSAxXSArPSBgIC4uLiAke2NvbHVtbnMgLSBtYXhDb2x1bW5zfSBtb3JlIGNvbHVtbnNgO1xuICB9XG4gIGlmIChtYXhJICE9PSByb3dzKSB7XG4gICAgcmVzdWx0LnB1c2goYC4uLiAke3Jvd3MgLSBtYXhSb3dzfSBtb3JlIHJvd3NgKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0LmpvaW4oYFxcbiR7aW5kZW50RGF0YX1gKTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0TnVtYmVyKG51bSwgbWF4TnVtU2l6ZSkge1xuICBjb25zdCBudW1TdHIgPSBTdHJpbmcobnVtKTtcbiAgaWYgKG51bVN0ci5sZW5ndGggPD0gbWF4TnVtU2l6ZSkge1xuICAgIHJldHVybiBudW1TdHIucGFkRW5kKG1heE51bVNpemUsICcgJyk7XG4gIH1cbiAgY29uc3QgcHJlY2lzZSA9IG51bS50b1ByZWNpc2lvbihtYXhOdW1TaXplIC0gMik7XG4gIGlmIChwcmVjaXNlLmxlbmd0aCA8PSBtYXhOdW1TaXplKSB7XG4gICAgcmV0dXJuIHByZWNpc2U7XG4gIH1cbiAgY29uc3QgZXhwb25lbnRpYWwgPSBudW0udG9FeHBvbmVudGlhbChtYXhOdW1TaXplIC0gMik7XG4gIGNvbnN0IGVJbmRleCA9IGV4cG9uZW50aWFsLmluZGV4T2YoJ2UnKTtcbiAgY29uc3QgZSA9IGV4cG9uZW50aWFsLnNsaWNlKGVJbmRleCk7XG4gIHJldHVybiBleHBvbmVudGlhbC5zbGljZSgwLCBtYXhOdW1TaXplIC0gZS5sZW5ndGgpICsgZTtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBpbnN0YWxsTWF0aE9wZXJhdGlvbnMoQWJzdHJhY3RNYXRyaXgsIE1hdHJpeCkge1xuICBBYnN0cmFjdE1hdHJpeC5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gYWRkKHZhbHVlKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHJldHVybiB0aGlzLmFkZFModmFsdWUpO1xuICAgIHJldHVybiB0aGlzLmFkZE0odmFsdWUpO1xuICB9O1xuXG4gIEFic3RyYWN0TWF0cml4LnByb3RvdHlwZS5hZGRTID0gZnVuY3Rpb24gYWRkUyh2YWx1ZSkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5yb3dzOyBpKyspIHtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5jb2x1bW5zOyBqKyspIHtcbiAgICAgICAgdGhpcy5zZXQoaSwgaiwgdGhpcy5nZXQoaSwgaikgKyB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIEFic3RyYWN0TWF0cml4LnByb3RvdHlwZS5hZGRNID0gZnVuY3Rpb24gYWRkTShtYXRyaXgpIHtcbiAgICBtYXRyaXggPSBNYXRyaXguY2hlY2tNYXRyaXgobWF0cml4KTtcbiAgICBpZiAodGhpcy5yb3dzICE9PSBtYXRyaXgucm93cyB8fFxuICAgICAgdGhpcy5jb2x1bW5zICE9PSBtYXRyaXguY29sdW1ucykge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ01hdHJpY2VzIGRpbWVuc2lvbnMgbXVzdCBiZSBlcXVhbCcpO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucm93czsgaSsrKSB7XG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRoaXMuY29sdW1uczsgaisrKSB7XG4gICAgICAgIHRoaXMuc2V0KGksIGosIHRoaXMuZ2V0KGksIGopICsgbWF0cml4LmdldChpLCBqKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIEFic3RyYWN0TWF0cml4LmFkZCA9IGZ1bmN0aW9uIGFkZChtYXRyaXgsIHZhbHVlKSB7XG4gICAgY29uc3QgbmV3TWF0cml4ID0gbmV3IE1hdHJpeChtYXRyaXgpO1xuICAgIHJldHVybiBuZXdNYXRyaXguYWRkKHZhbHVlKTtcbiAgfTtcblxuICBBYnN0cmFjdE1hdHJpeC5wcm90b3R5cGUuc3ViID0gZnVuY3Rpb24gc3ViKHZhbHVlKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHJldHVybiB0aGlzLnN1YlModmFsdWUpO1xuICAgIHJldHVybiB0aGlzLnN1Yk0odmFsdWUpO1xuICB9O1xuXG4gIEFic3RyYWN0TWF0cml4LnByb3RvdHlwZS5zdWJTID0gZnVuY3Rpb24gc3ViUyh2YWx1ZSkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5yb3dzOyBpKyspIHtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5jb2x1bW5zOyBqKyspIHtcbiAgICAgICAgdGhpcy5zZXQoaSwgaiwgdGhpcy5nZXQoaSwgaikgLSB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIEFic3RyYWN0TWF0cml4LnByb3RvdHlwZS5zdWJNID0gZnVuY3Rpb24gc3ViTShtYXRyaXgpIHtcbiAgICBtYXRyaXggPSBNYXRyaXguY2hlY2tNYXRyaXgobWF0cml4KTtcbiAgICBpZiAodGhpcy5yb3dzICE9PSBtYXRyaXgucm93cyB8fFxuICAgICAgdGhpcy5jb2x1bW5zICE9PSBtYXRyaXguY29sdW1ucykge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ01hdHJpY2VzIGRpbWVuc2lvbnMgbXVzdCBiZSBlcXVhbCcpO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucm93czsgaSsrKSB7XG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRoaXMuY29sdW1uczsgaisrKSB7XG4gICAgICAgIHRoaXMuc2V0KGksIGosIHRoaXMuZ2V0KGksIGopIC0gbWF0cml4LmdldChpLCBqKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIEFic3RyYWN0TWF0cml4LnN1YiA9IGZ1bmN0aW9uIHN1YihtYXRyaXgsIHZhbHVlKSB7XG4gICAgY29uc3QgbmV3TWF0cml4ID0gbmV3IE1hdHJpeChtYXRyaXgpO1xuICAgIHJldHVybiBuZXdNYXRyaXguc3ViKHZhbHVlKTtcbiAgfTtcbiAgQWJzdHJhY3RNYXRyaXgucHJvdG90eXBlLnN1YnRyYWN0ID0gQWJzdHJhY3RNYXRyaXgucHJvdG90eXBlLnN1YjtcbiAgQWJzdHJhY3RNYXRyaXgucHJvdG90eXBlLnN1YnRyYWN0UyA9IEFic3RyYWN0TWF0cml4LnByb3RvdHlwZS5zdWJTO1xuICBBYnN0cmFjdE1hdHJpeC5wcm90b3R5cGUuc3VidHJhY3RNID0gQWJzdHJhY3RNYXRyaXgucHJvdG90eXBlLnN1Yk07XG4gIEFic3RyYWN0TWF0cml4LnN1YnRyYWN0ID0gQWJzdHJhY3RNYXRyaXguc3ViO1xuXG4gIEFic3RyYWN0TWF0cml4LnByb3RvdHlwZS5tdWwgPSBmdW5jdGlvbiBtdWwodmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykgcmV0dXJuIHRoaXMubXVsUyh2YWx1ZSk7XG4gICAgcmV0dXJuIHRoaXMubXVsTSh2YWx1ZSk7XG4gIH07XG5cbiAgQWJzdHJhY3RNYXRyaXgucHJvdG90eXBlLm11bFMgPSBmdW5jdGlvbiBtdWxTKHZhbHVlKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnJvd3M7IGkrKykge1xuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB0aGlzLmNvbHVtbnM7IGorKykge1xuICAgICAgICB0aGlzLnNldChpLCBqLCB0aGlzLmdldChpLCBqKSAqIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgQWJzdHJhY3RNYXRyaXgucHJvdG90eXBlLm11bE0gPSBmdW5jdGlvbiBtdWxNKG1hdHJpeCkge1xuICAgIG1hdHJpeCA9IE1hdHJpeC5jaGVja01hdHJpeChtYXRyaXgpO1xuICAgIGlmICh0aGlzLnJvd3MgIT09IG1hdHJpeC5yb3dzIHx8XG4gICAgICB0aGlzLmNvbHVtbnMgIT09IG1hdHJpeC5jb2x1bW5zKSB7XG4gICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignTWF0cmljZXMgZGltZW5zaW9ucyBtdXN0IGJlIGVxdWFsJyk7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5yb3dzOyBpKyspIHtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5jb2x1bW5zOyBqKyspIHtcbiAgICAgICAgdGhpcy5zZXQoaSwgaiwgdGhpcy5nZXQoaSwgaikgKiBtYXRyaXguZ2V0KGksIGopKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgQWJzdHJhY3RNYXRyaXgubXVsID0gZnVuY3Rpb24gbXVsKG1hdHJpeCwgdmFsdWUpIHtcbiAgICBjb25zdCBuZXdNYXRyaXggPSBuZXcgTWF0cml4KG1hdHJpeCk7XG4gICAgcmV0dXJuIG5ld01hdHJpeC5tdWwodmFsdWUpO1xuICB9O1xuICBBYnN0cmFjdE1hdHJpeC5wcm90b3R5cGUubXVsdGlwbHkgPSBBYnN0cmFjdE1hdHJpeC5wcm90b3R5cGUubXVsO1xuICBBYnN0cmFjdE1hdHJpeC5wcm90b3R5cGUubXVsdGlwbHlTID0gQWJzdHJhY3RNYXRyaXgucHJvdG90eXBlLm11bFM7XG4gIEFic3RyYWN0TWF0cml4LnByb3RvdHlwZS5tdWx0aXBseU0gPSBBYnN0cmFjdE1hdHJpeC5wcm90b3R5cGUubXVsTTtcbiAgQWJzdHJhY3RNYXRyaXgubXVsdGlwbHkgPSBBYnN0cmFjdE1hdHJpeC5tdWw7XG5cbiAgQWJzdHJhY3RNYXRyaXgucHJvdG90eXBlLmRpdiA9IGZ1bmN0aW9uIGRpdih2YWx1ZSkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSByZXR1cm4gdGhpcy5kaXZTKHZhbHVlKTtcbiAgICByZXR1cm4gdGhpcy5kaXZNKHZhbHVlKTtcbiAgfTtcblxuICBBYnN0cmFjdE1hdHJpeC5wcm90b3R5cGUuZGl2UyA9IGZ1bmN0aW9uIGRpdlModmFsdWUpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucm93czsgaSsrKSB7XG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRoaXMuY29sdW1uczsgaisrKSB7XG4gICAgICAgIHRoaXMuc2V0KGksIGosIHRoaXMuZ2V0KGksIGopIC8gdmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBBYnN0cmFjdE1hdHJpeC5wcm90b3R5cGUuZGl2TSA9IGZ1bmN0aW9uIGRpdk0obWF0cml4KSB7XG4gICAgbWF0cml4ID0gTWF0cml4LmNoZWNrTWF0cml4KG1hdHJpeCk7XG4gICAgaWYgKHRoaXMucm93cyAhPT0gbWF0cml4LnJvd3MgfHxcbiAgICAgIHRoaXMuY29sdW1ucyAhPT0gbWF0cml4LmNvbHVtbnMpIHtcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWwnKTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnJvd3M7IGkrKykge1xuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB0aGlzLmNvbHVtbnM7IGorKykge1xuICAgICAgICB0aGlzLnNldChpLCBqLCB0aGlzLmdldChpLCBqKSAvIG1hdHJpeC5nZXQoaSwgaikpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBBYnN0cmFjdE1hdHJpeC5kaXYgPSBmdW5jdGlvbiBkaXYobWF0cml4LCB2YWx1ZSkge1xuICAgIGNvbnN0IG5ld01hdHJpeCA9IG5ldyBNYXRyaXgobWF0cml4KTtcbiAgICByZXR1cm4gbmV3TWF0cml4LmRpdih2YWx1ZSk7XG4gIH07XG4gIEFic3RyYWN0TWF0cml4LnByb3RvdHlwZS5kaXZpZGUgPSBBYnN0cmFjdE1hdHJpeC5wcm90b3R5cGUuZGl2O1xuICBBYnN0cmFjdE1hdHJpeC5wcm90b3R5cGUuZGl2aWRlUyA9IEFic3RyYWN0TWF0cml4LnByb3RvdHlwZS5kaXZTO1xuICBBYnN0cmFjdE1hdHJpeC5wcm90b3R5cGUuZGl2aWRlTSA9IEFic3RyYWN0TWF0cml4LnByb3RvdHlwZS5kaXZNO1xuICBBYnN0cmFjdE1hdHJpeC5kaXZpZGUgPSBBYnN0cmFjdE1hdHJpeC5kaXY7XG5cbiAgQWJzdHJhY3RNYXRyaXgucHJvdG90eXBlLm1vZCA9IGZ1bmN0aW9uIG1vZCh2YWx1ZSkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSByZXR1cm4gdGhpcy5tb2RTKHZhbHVlKTtcbiAgICByZXR1cm4gdGhpcy5tb2RNKHZhbHVlKTtcbiAgfTtcblxuICBBYnN0cmFjdE1hdHJpeC5wcm90b3R5cGUubW9kUyA9IGZ1bmN0aW9uIG1vZFModmFsdWUpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucm93czsgaSsrKSB7XG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRoaXMuY29sdW1uczsgaisrKSB7XG4gICAgICAgIHRoaXMuc2V0KGksIGosIHRoaXMuZ2V0KGksIGopICUgdmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBBYnN0cmFjdE1hdHJpeC5wcm90b3R5cGUubW9kTSA9IGZ1bmN0aW9uIG1vZE0obWF0cml4KSB7XG4gICAgbWF0cml4ID0gTWF0cml4LmNoZWNrTWF0cml4KG1hdHJpeCk7XG4gICAgaWYgKHRoaXMucm93cyAhPT0gbWF0cml4LnJvd3MgfHxcbiAgICAgIHRoaXMuY29sdW1ucyAhPT0gbWF0cml4LmNvbHVtbnMpIHtcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWwnKTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnJvd3M7IGkrKykge1xuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB0aGlzLmNvbHVtbnM7IGorKykge1xuICAgICAgICB0aGlzLnNldChpLCBqLCB0aGlzLmdldChpLCBqKSAlIG1hdHJpeC5nZXQoaSwgaikpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBBYnN0cmFjdE1hdHJpeC5tb2QgPSBmdW5jdGlvbiBtb2QobWF0cml4LCB2YWx1ZSkge1xuICAgIGNvbnN0IG5ld01hdHJpeCA9IG5ldyBNYXRyaXgobWF0cml4KTtcbiAgICByZXR1cm4gbmV3TWF0cml4Lm1vZCh2YWx1ZSk7XG4gIH07XG4gIEFic3RyYWN0TWF0cml4LnByb3RvdHlwZS5tb2R1bHVzID0gQWJzdHJhY3RNYXRyaXgucHJvdG90eXBlLm1vZDtcbiAgQWJzdHJhY3RNYXRyaXgucHJvdG90eXBlLm1vZHVsdXNTID0gQWJzdHJhY3RNYXRyaXgucHJvdG90eXBlLm1vZFM7XG4gIEFic3RyYWN0TWF0cml4LnByb3RvdHlwZS5tb2R1bHVzTSA9IEFic3RyYWN0TWF0cml4LnByb3RvdHlwZS5tb2RNO1xuICBBYnN0cmFjdE1hdHJpeC5tb2R1bHVzID0gQWJzdHJhY3RNYXRyaXgubW9kO1xuXG4gIEFic3RyYWN0TWF0cml4LnByb3RvdHlwZS5hbmQgPSBmdW5jdGlvbiBhbmQodmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykgcmV0dXJuIHRoaXMuYW5kUyh2YWx1ZSk7XG4gICAgcmV0dXJuIHRoaXMuYW5kTSh2YWx1ZSk7XG4gIH07XG5cbiAgQWJzdHJhY3RNYXRyaXgucHJvdG90eXBlLmFuZFMgPSBmdW5jdGlvbiBhbmRTKHZhbHVlKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnJvd3M7IGkrKykge1xuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB0aGlzLmNvbHVtbnM7IGorKykge1xuICAgICAgICB0aGlzLnNldChpLCBqLCB0aGlzLmdldChpLCBqKSAmIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgQWJzdHJhY3RNYXRyaXgucHJvdG90eXBlLmFuZE0gPSBmdW5jdGlvbiBhbmRNKG1hdHJpeCkge1xuICAgIG1hdHJpeCA9IE1hdHJpeC5jaGVja01hdHJpeChtYXRyaXgpO1xuICAgIGlmICh0aGlzLnJvd3MgIT09IG1hdHJpeC5yb3dzIHx8XG4gICAgICB0aGlzLmNvbHVtbnMgIT09IG1hdHJpeC5jb2x1bW5zKSB7XG4gICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignTWF0cmljZXMgZGltZW5zaW9ucyBtdXN0IGJlIGVxdWFsJyk7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5yb3dzOyBpKyspIHtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5jb2x1bW5zOyBqKyspIHtcbiAgICAgICAgdGhpcy5zZXQoaSwgaiwgdGhpcy5nZXQoaSwgaikgJiBtYXRyaXguZ2V0KGksIGopKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgQWJzdHJhY3RNYXRyaXguYW5kID0gZnVuY3Rpb24gYW5kKG1hdHJpeCwgdmFsdWUpIHtcbiAgICBjb25zdCBuZXdNYXRyaXggPSBuZXcgTWF0cml4KG1hdHJpeCk7XG4gICAgcmV0dXJuIG5ld01hdHJpeC5hbmQodmFsdWUpO1xuICB9O1xuXG4gIEFic3RyYWN0TWF0cml4LnByb3RvdHlwZS5vciA9IGZ1bmN0aW9uIG9yKHZhbHVlKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHJldHVybiB0aGlzLm9yUyh2YWx1ZSk7XG4gICAgcmV0dXJuIHRoaXMub3JNKHZhbHVlKTtcbiAgfTtcblxuICBBYnN0cmFjdE1hdHJpeC5wcm90b3R5cGUub3JTID0gZnVuY3Rpb24gb3JTKHZhbHVlKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnJvd3M7IGkrKykge1xuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB0aGlzLmNvbHVtbnM7IGorKykge1xuICAgICAgICB0aGlzLnNldChpLCBqLCB0aGlzLmdldChpLCBqKSB8IHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgQWJzdHJhY3RNYXRyaXgucHJvdG90eXBlLm9yTSA9IGZ1bmN0aW9uIG9yTShtYXRyaXgpIHtcbiAgICBtYXRyaXggPSBNYXRyaXguY2hlY2tNYXRyaXgobWF0cml4KTtcbiAgICBpZiAodGhpcy5yb3dzICE9PSBtYXRyaXgucm93cyB8fFxuICAgICAgdGhpcy5jb2x1bW5zICE9PSBtYXRyaXguY29sdW1ucykge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ01hdHJpY2VzIGRpbWVuc2lvbnMgbXVzdCBiZSBlcXVhbCcpO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucm93czsgaSsrKSB7XG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRoaXMuY29sdW1uczsgaisrKSB7XG4gICAgICAgIHRoaXMuc2V0KGksIGosIHRoaXMuZ2V0KGksIGopIHwgbWF0cml4LmdldChpLCBqKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIEFic3RyYWN0TWF0cml4Lm9yID0gZnVuY3Rpb24gb3IobWF0cml4LCB2YWx1ZSkge1xuICAgIGNvbnN0IG5ld01hdHJpeCA9IG5ldyBNYXRyaXgobWF0cml4KTtcbiAgICByZXR1cm4gbmV3TWF0cml4Lm9yKHZhbHVlKTtcbiAgfTtcblxuICBBYnN0cmFjdE1hdHJpeC5wcm90b3R5cGUueG9yID0gZnVuY3Rpb24geG9yKHZhbHVlKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHJldHVybiB0aGlzLnhvclModmFsdWUpO1xuICAgIHJldHVybiB0aGlzLnhvck0odmFsdWUpO1xuICB9O1xuXG4gIEFic3RyYWN0TWF0cml4LnByb3RvdHlwZS54b3JTID0gZnVuY3Rpb24geG9yUyh2YWx1ZSkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5yb3dzOyBpKyspIHtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5jb2x1bW5zOyBqKyspIHtcbiAgICAgICAgdGhpcy5zZXQoaSwgaiwgdGhpcy5nZXQoaSwgaikgXiB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIEFic3RyYWN0TWF0cml4LnByb3RvdHlwZS54b3JNID0gZnVuY3Rpb24geG9yTShtYXRyaXgpIHtcbiAgICBtYXRyaXggPSBNYXRyaXguY2hlY2tNYXRyaXgobWF0cml4KTtcbiAgICBpZiAodGhpcy5yb3dzICE9PSBtYXRyaXgucm93cyB8fFxuICAgICAgdGhpcy5jb2x1bW5zICE9PSBtYXRyaXguY29sdW1ucykge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ01hdHJpY2VzIGRpbWVuc2lvbnMgbXVzdCBiZSBlcXVhbCcpO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucm93czsgaSsrKSB7XG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRoaXMuY29sdW1uczsgaisrKSB7XG4gICAgICAgIHRoaXMuc2V0KGksIGosIHRoaXMuZ2V0KGksIGopIF4gbWF0cml4LmdldChpLCBqKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIEFic3RyYWN0TWF0cml4LnhvciA9IGZ1bmN0aW9uIHhvcihtYXRyaXgsIHZhbHVlKSB7XG4gICAgY29uc3QgbmV3TWF0cml4ID0gbmV3IE1hdHJpeChtYXRyaXgpO1xuICAgIHJldHVybiBuZXdNYXRyaXgueG9yKHZhbHVlKTtcbiAgfTtcblxuICBBYnN0cmFjdE1hdHJpeC5wcm90b3R5cGUubGVmdFNoaWZ0ID0gZnVuY3Rpb24gbGVmdFNoaWZ0KHZhbHVlKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHJldHVybiB0aGlzLmxlZnRTaGlmdFModmFsdWUpO1xuICAgIHJldHVybiB0aGlzLmxlZnRTaGlmdE0odmFsdWUpO1xuICB9O1xuXG4gIEFic3RyYWN0TWF0cml4LnByb3RvdHlwZS5sZWZ0U2hpZnRTID0gZnVuY3Rpb24gbGVmdFNoaWZ0Uyh2YWx1ZSkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5yb3dzOyBpKyspIHtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5jb2x1bW5zOyBqKyspIHtcbiAgICAgICAgdGhpcy5zZXQoaSwgaiwgdGhpcy5nZXQoaSwgaikgPDwgdmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBBYnN0cmFjdE1hdHJpeC5wcm90b3R5cGUubGVmdFNoaWZ0TSA9IGZ1bmN0aW9uIGxlZnRTaGlmdE0obWF0cml4KSB7XG4gICAgbWF0cml4ID0gTWF0cml4LmNoZWNrTWF0cml4KG1hdHJpeCk7XG4gICAgaWYgKHRoaXMucm93cyAhPT0gbWF0cml4LnJvd3MgfHxcbiAgICAgIHRoaXMuY29sdW1ucyAhPT0gbWF0cml4LmNvbHVtbnMpIHtcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWwnKTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnJvd3M7IGkrKykge1xuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB0aGlzLmNvbHVtbnM7IGorKykge1xuICAgICAgICB0aGlzLnNldChpLCBqLCB0aGlzLmdldChpLCBqKSA8PCBtYXRyaXguZ2V0KGksIGopKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgQWJzdHJhY3RNYXRyaXgubGVmdFNoaWZ0ID0gZnVuY3Rpb24gbGVmdFNoaWZ0KG1hdHJpeCwgdmFsdWUpIHtcbiAgICBjb25zdCBuZXdNYXRyaXggPSBuZXcgTWF0cml4KG1hdHJpeCk7XG4gICAgcmV0dXJuIG5ld01hdHJpeC5sZWZ0U2hpZnQodmFsdWUpO1xuICB9O1xuXG4gIEFic3RyYWN0TWF0cml4LnByb3RvdHlwZS5zaWduUHJvcGFnYXRpbmdSaWdodFNoaWZ0ID0gZnVuY3Rpb24gc2lnblByb3BhZ2F0aW5nUmlnaHRTaGlmdCh2YWx1ZSkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSByZXR1cm4gdGhpcy5zaWduUHJvcGFnYXRpbmdSaWdodFNoaWZ0Uyh2YWx1ZSk7XG4gICAgcmV0dXJuIHRoaXMuc2lnblByb3BhZ2F0aW5nUmlnaHRTaGlmdE0odmFsdWUpO1xuICB9O1xuXG4gIEFic3RyYWN0TWF0cml4LnByb3RvdHlwZS5zaWduUHJvcGFnYXRpbmdSaWdodFNoaWZ0UyA9IGZ1bmN0aW9uIHNpZ25Qcm9wYWdhdGluZ1JpZ2h0U2hpZnRTKHZhbHVlKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnJvd3M7IGkrKykge1xuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB0aGlzLmNvbHVtbnM7IGorKykge1xuICAgICAgICB0aGlzLnNldChpLCBqLCB0aGlzLmdldChpLCBqKSA+PiB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIEFic3RyYWN0TWF0cml4LnByb3RvdHlwZS5zaWduUHJvcGFnYXRpbmdSaWdodFNoaWZ0TSA9IGZ1bmN0aW9uIHNpZ25Qcm9wYWdhdGluZ1JpZ2h0U2hpZnRNKG1hdHJpeCkge1xuICAgIG1hdHJpeCA9IE1hdHJpeC5jaGVja01hdHJpeChtYXRyaXgpO1xuICAgIGlmICh0aGlzLnJvd3MgIT09IG1hdHJpeC5yb3dzIHx8XG4gICAgICB0aGlzLmNvbHVtbnMgIT09IG1hdHJpeC5jb2x1bW5zKSB7XG4gICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignTWF0cmljZXMgZGltZW5zaW9ucyBtdXN0IGJlIGVxdWFsJyk7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5yb3dzOyBpKyspIHtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5jb2x1bW5zOyBqKyspIHtcbiAgICAgICAgdGhpcy5zZXQoaSwgaiwgdGhpcy5nZXQoaSwgaikgPj4gbWF0cml4LmdldChpLCBqKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIEFic3RyYWN0TWF0cml4LnNpZ25Qcm9wYWdhdGluZ1JpZ2h0U2hpZnQgPSBmdW5jdGlvbiBzaWduUHJvcGFnYXRpbmdSaWdodFNoaWZ0KG1hdHJpeCwgdmFsdWUpIHtcbiAgICBjb25zdCBuZXdNYXRyaXggPSBuZXcgTWF0cml4KG1hdHJpeCk7XG4gICAgcmV0dXJuIG5ld01hdHJpeC5zaWduUHJvcGFnYXRpbmdSaWdodFNoaWZ0KHZhbHVlKTtcbiAgfTtcblxuICBBYnN0cmFjdE1hdHJpeC5wcm90b3R5cGUucmlnaHRTaGlmdCA9IGZ1bmN0aW9uIHJpZ2h0U2hpZnQodmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykgcmV0dXJuIHRoaXMucmlnaHRTaGlmdFModmFsdWUpO1xuICAgIHJldHVybiB0aGlzLnJpZ2h0U2hpZnRNKHZhbHVlKTtcbiAgfTtcblxuICBBYnN0cmFjdE1hdHJpeC5wcm90b3R5cGUucmlnaHRTaGlmdFMgPSBmdW5jdGlvbiByaWdodFNoaWZ0Uyh2YWx1ZSkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5yb3dzOyBpKyspIHtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5jb2x1bW5zOyBqKyspIHtcbiAgICAgICAgdGhpcy5zZXQoaSwgaiwgdGhpcy5nZXQoaSwgaikgPj4+IHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgQWJzdHJhY3RNYXRyaXgucHJvdG90eXBlLnJpZ2h0U2hpZnRNID0gZnVuY3Rpb24gcmlnaHRTaGlmdE0obWF0cml4KSB7XG4gICAgbWF0cml4ID0gTWF0cml4LmNoZWNrTWF0cml4KG1hdHJpeCk7XG4gICAgaWYgKHRoaXMucm93cyAhPT0gbWF0cml4LnJvd3MgfHxcbiAgICAgIHRoaXMuY29sdW1ucyAhPT0gbWF0cml4LmNvbHVtbnMpIHtcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWwnKTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnJvd3M7IGkrKykge1xuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB0aGlzLmNvbHVtbnM7IGorKykge1xuICAgICAgICB0aGlzLnNldChpLCBqLCB0aGlzLmdldChpLCBqKSA+Pj4gbWF0cml4LmdldChpLCBqKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIEFic3RyYWN0TWF0cml4LnJpZ2h0U2hpZnQgPSBmdW5jdGlvbiByaWdodFNoaWZ0KG1hdHJpeCwgdmFsdWUpIHtcbiAgICBjb25zdCBuZXdNYXRyaXggPSBuZXcgTWF0cml4KG1hdHJpeCk7XG4gICAgcmV0dXJuIG5ld01hdHJpeC5yaWdodFNoaWZ0KHZhbHVlKTtcbiAgfTtcbiAgQWJzdHJhY3RNYXRyaXgucHJvdG90eXBlLnplcm9GaWxsUmlnaHRTaGlmdCA9IEFic3RyYWN0TWF0cml4LnByb3RvdHlwZS5yaWdodFNoaWZ0O1xuICBBYnN0cmFjdE1hdHJpeC5wcm90b3R5cGUuemVyb0ZpbGxSaWdodFNoaWZ0UyA9IEFic3RyYWN0TWF0cml4LnByb3RvdHlwZS5yaWdodFNoaWZ0UztcbiAgQWJzdHJhY3RNYXRyaXgucHJvdG90eXBlLnplcm9GaWxsUmlnaHRTaGlmdE0gPSBBYnN0cmFjdE1hdHJpeC5wcm90b3R5cGUucmlnaHRTaGlmdE07XG4gIEFic3RyYWN0TWF0cml4Lnplcm9GaWxsUmlnaHRTaGlmdCA9IEFic3RyYWN0TWF0cml4LnJpZ2h0U2hpZnQ7XG5cbiAgQWJzdHJhY3RNYXRyaXgucHJvdG90eXBlLm5vdCA9IGZ1bmN0aW9uIG5vdCgpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucm93czsgaSsrKSB7XG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRoaXMuY29sdW1uczsgaisrKSB7XG4gICAgICAgIHRoaXMuc2V0KGksIGosIH4odGhpcy5nZXQoaSwgaikpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgQWJzdHJhY3RNYXRyaXgubm90ID0gZnVuY3Rpb24gbm90KG1hdHJpeCkge1xuICAgIGNvbnN0IG5ld01hdHJpeCA9IG5ldyBNYXRyaXgobWF0cml4KTtcbiAgICByZXR1cm4gbmV3TWF0cml4Lm5vdCgpO1xuICB9O1xuXG4gIEFic3RyYWN0TWF0cml4LnByb3RvdHlwZS5hYnMgPSBmdW5jdGlvbiBhYnMoKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnJvd3M7IGkrKykge1xuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB0aGlzLmNvbHVtbnM7IGorKykge1xuICAgICAgICB0aGlzLnNldChpLCBqLCBNYXRoLmFicyh0aGlzLmdldChpLCBqKSkpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBBYnN0cmFjdE1hdHJpeC5hYnMgPSBmdW5jdGlvbiBhYnMobWF0cml4KSB7XG4gICAgY29uc3QgbmV3TWF0cml4ID0gbmV3IE1hdHJpeChtYXRyaXgpO1xuICAgIHJldHVybiBuZXdNYXRyaXguYWJzKCk7XG4gIH07XG5cbiAgQWJzdHJhY3RNYXRyaXgucHJvdG90eXBlLmFjb3MgPSBmdW5jdGlvbiBhY29zKCkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5yb3dzOyBpKyspIHtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5jb2x1bW5zOyBqKyspIHtcbiAgICAgICAgdGhpcy5zZXQoaSwgaiwgTWF0aC5hY29zKHRoaXMuZ2V0KGksIGopKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIEFic3RyYWN0TWF0cml4LmFjb3MgPSBmdW5jdGlvbiBhY29zKG1hdHJpeCkge1xuICAgIGNvbnN0IG5ld01hdHJpeCA9IG5ldyBNYXRyaXgobWF0cml4KTtcbiAgICByZXR1cm4gbmV3TWF0cml4LmFjb3MoKTtcbiAgfTtcblxuICBBYnN0cmFjdE1hdHJpeC5wcm90b3R5cGUuYWNvc2ggPSBmdW5jdGlvbiBhY29zaCgpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucm93czsgaSsrKSB7XG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRoaXMuY29sdW1uczsgaisrKSB7XG4gICAgICAgIHRoaXMuc2V0KGksIGosIE1hdGguYWNvc2godGhpcy5nZXQoaSwgaikpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgQWJzdHJhY3RNYXRyaXguYWNvc2ggPSBmdW5jdGlvbiBhY29zaChtYXRyaXgpIHtcbiAgICBjb25zdCBuZXdNYXRyaXggPSBuZXcgTWF0cml4KG1hdHJpeCk7XG4gICAgcmV0dXJuIG5ld01hdHJpeC5hY29zaCgpO1xuICB9O1xuXG4gIEFic3RyYWN0TWF0cml4LnByb3RvdHlwZS5hc2luID0gZnVuY3Rpb24gYXNpbigpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucm93czsgaSsrKSB7XG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRoaXMuY29sdW1uczsgaisrKSB7XG4gICAgICAgIHRoaXMuc2V0KGksIGosIE1hdGguYXNpbih0aGlzLmdldChpLCBqKSkpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBBYnN0cmFjdE1hdHJpeC5hc2luID0gZnVuY3Rpb24gYXNpbihtYXRyaXgpIHtcbiAgICBjb25zdCBuZXdNYXRyaXggPSBuZXcgTWF0cml4KG1hdHJpeCk7XG4gICAgcmV0dXJuIG5ld01hdHJpeC5hc2luKCk7XG4gIH07XG5cbiAgQWJzdHJhY3RNYXRyaXgucHJvdG90eXBlLmFzaW5oID0gZnVuY3Rpb24gYXNpbmgoKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnJvd3M7IGkrKykge1xuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB0aGlzLmNvbHVtbnM7IGorKykge1xuICAgICAgICB0aGlzLnNldChpLCBqLCBNYXRoLmFzaW5oKHRoaXMuZ2V0KGksIGopKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIEFic3RyYWN0TWF0cml4LmFzaW5oID0gZnVuY3Rpb24gYXNpbmgobWF0cml4KSB7XG4gICAgY29uc3QgbmV3TWF0cml4ID0gbmV3IE1hdHJpeChtYXRyaXgpO1xuICAgIHJldHVybiBuZXdNYXRyaXguYXNpbmgoKTtcbiAgfTtcblxuICBBYnN0cmFjdE1hdHJpeC5wcm90b3R5cGUuYXRhbiA9IGZ1bmN0aW9uIGF0YW4oKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnJvd3M7IGkrKykge1xuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB0aGlzLmNvbHVtbnM7IGorKykge1xuICAgICAgICB0aGlzLnNldChpLCBqLCBNYXRoLmF0YW4odGhpcy5nZXQoaSwgaikpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgQWJzdHJhY3RNYXRyaXguYXRhbiA9IGZ1bmN0aW9uIGF0YW4obWF0cml4KSB7XG4gICAgY29uc3QgbmV3TWF0cml4ID0gbmV3IE1hdHJpeChtYXRyaXgpO1xuICAgIHJldHVybiBuZXdNYXRyaXguYXRhbigpO1xuICB9O1xuXG4gIEFic3RyYWN0TWF0cml4LnByb3RvdHlwZS5hdGFuaCA9IGZ1bmN0aW9uIGF0YW5oKCkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5yb3dzOyBpKyspIHtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5jb2x1bW5zOyBqKyspIHtcbiAgICAgICAgdGhpcy5zZXQoaSwgaiwgTWF0aC5hdGFuaCh0aGlzLmdldChpLCBqKSkpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBBYnN0cmFjdE1hdHJpeC5hdGFuaCA9IGZ1bmN0aW9uIGF0YW5oKG1hdHJpeCkge1xuICAgIGNvbnN0IG5ld01hdHJpeCA9IG5ldyBNYXRyaXgobWF0cml4KTtcbiAgICByZXR1cm4gbmV3TWF0cml4LmF0YW5oKCk7XG4gIH07XG5cbiAgQWJzdHJhY3RNYXRyaXgucHJvdG90eXBlLmNicnQgPSBmdW5jdGlvbiBjYnJ0KCkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5yb3dzOyBpKyspIHtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5jb2x1bW5zOyBqKyspIHtcbiAgICAgICAgdGhpcy5zZXQoaSwgaiwgTWF0aC5jYnJ0KHRoaXMuZ2V0KGksIGopKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIEFic3RyYWN0TWF0cml4LmNicnQgPSBmdW5jdGlvbiBjYnJ0KG1hdHJpeCkge1xuICAgIGNvbnN0IG5ld01hdHJpeCA9IG5ldyBNYXRyaXgobWF0cml4KTtcbiAgICByZXR1cm4gbmV3TWF0cml4LmNicnQoKTtcbiAgfTtcblxuICBBYnN0cmFjdE1hdHJpeC5wcm90b3R5cGUuY2VpbCA9IGZ1bmN0aW9uIGNlaWwoKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnJvd3M7IGkrKykge1xuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB0aGlzLmNvbHVtbnM7IGorKykge1xuICAgICAgICB0aGlzLnNldChpLCBqLCBNYXRoLmNlaWwodGhpcy5nZXQoaSwgaikpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgQWJzdHJhY3RNYXRyaXguY2VpbCA9IGZ1bmN0aW9uIGNlaWwobWF0cml4KSB7XG4gICAgY29uc3QgbmV3TWF0cml4ID0gbmV3IE1hdHJpeChtYXRyaXgpO1xuICAgIHJldHVybiBuZXdNYXRyaXguY2VpbCgpO1xuICB9O1xuXG4gIEFic3RyYWN0TWF0cml4LnByb3RvdHlwZS5jbHozMiA9IGZ1bmN0aW9uIGNsejMyKCkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5yb3dzOyBpKyspIHtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5jb2x1bW5zOyBqKyspIHtcbiAgICAgICAgdGhpcy5zZXQoaSwgaiwgTWF0aC5jbHozMih0aGlzLmdldChpLCBqKSkpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBBYnN0cmFjdE1hdHJpeC5jbHozMiA9IGZ1bmN0aW9uIGNsejMyKG1hdHJpeCkge1xuICAgIGNvbnN0IG5ld01hdHJpeCA9IG5ldyBNYXRyaXgobWF0cml4KTtcbiAgICByZXR1cm4gbmV3TWF0cml4LmNsejMyKCk7XG4gIH07XG5cbiAgQWJzdHJhY3RNYXRyaXgucHJvdG90eXBlLmNvcyA9IGZ1bmN0aW9uIGNvcygpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucm93czsgaSsrKSB7XG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRoaXMuY29sdW1uczsgaisrKSB7XG4gICAgICAgIHRoaXMuc2V0KGksIGosIE1hdGguY29zKHRoaXMuZ2V0KGksIGopKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIEFic3RyYWN0TWF0cml4LmNvcyA9IGZ1bmN0aW9uIGNvcyhtYXRyaXgpIHtcbiAgICBjb25zdCBuZXdNYXRyaXggPSBuZXcgTWF0cml4KG1hdHJpeCk7XG4gICAgcmV0dXJuIG5ld01hdHJpeC5jb3MoKTtcbiAgfTtcblxuICBBYnN0cmFjdE1hdHJpeC5wcm90b3R5cGUuY29zaCA9IGZ1bmN0aW9uIGNvc2goKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnJvd3M7IGkrKykge1xuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB0aGlzLmNvbHVtbnM7IGorKykge1xuICAgICAgICB0aGlzLnNldChpLCBqLCBNYXRoLmNvc2godGhpcy5nZXQoaSwgaikpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgQWJzdHJhY3RNYXRyaXguY29zaCA9IGZ1bmN0aW9uIGNvc2gobWF0cml4KSB7XG4gICAgY29uc3QgbmV3TWF0cml4ID0gbmV3IE1hdHJpeChtYXRyaXgpO1xuICAgIHJldHVybiBuZXdNYXRyaXguY29zaCgpO1xuICB9O1xuXG4gIEFic3RyYWN0TWF0cml4LnByb3RvdHlwZS5leHAgPSBmdW5jdGlvbiBleHAoKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnJvd3M7IGkrKykge1xuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB0aGlzLmNvbHVtbnM7IGorKykge1xuICAgICAgICB0aGlzLnNldChpLCBqLCBNYXRoLmV4cCh0aGlzLmdldChpLCBqKSkpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBBYnN0cmFjdE1hdHJpeC5leHAgPSBmdW5jdGlvbiBleHAobWF0cml4KSB7XG4gICAgY29uc3QgbmV3TWF0cml4ID0gbmV3IE1hdHJpeChtYXRyaXgpO1xuICAgIHJldHVybiBuZXdNYXRyaXguZXhwKCk7XG4gIH07XG5cbiAgQWJzdHJhY3RNYXRyaXgucHJvdG90eXBlLmV4cG0xID0gZnVuY3Rpb24gZXhwbTEoKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnJvd3M7IGkrKykge1xuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB0aGlzLmNvbHVtbnM7IGorKykge1xuICAgICAgICB0aGlzLnNldChpLCBqLCBNYXRoLmV4cG0xKHRoaXMuZ2V0KGksIGopKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIEFic3RyYWN0TWF0cml4LmV4cG0xID0gZnVuY3Rpb24gZXhwbTEobWF0cml4KSB7XG4gICAgY29uc3QgbmV3TWF0cml4ID0gbmV3IE1hdHJpeChtYXRyaXgpO1xuICAgIHJldHVybiBuZXdNYXRyaXguZXhwbTEoKTtcbiAgfTtcblxuICBBYnN0cmFjdE1hdHJpeC5wcm90b3R5cGUuZmxvb3IgPSBmdW5jdGlvbiBmbG9vcigpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucm93czsgaSsrKSB7XG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRoaXMuY29sdW1uczsgaisrKSB7XG4gICAgICAgIHRoaXMuc2V0KGksIGosIE1hdGguZmxvb3IodGhpcy5nZXQoaSwgaikpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgQWJzdHJhY3RNYXRyaXguZmxvb3IgPSBmdW5jdGlvbiBmbG9vcihtYXRyaXgpIHtcbiAgICBjb25zdCBuZXdNYXRyaXggPSBuZXcgTWF0cml4KG1hdHJpeCk7XG4gICAgcmV0dXJuIG5ld01hdHJpeC5mbG9vcigpO1xuICB9O1xuXG4gIEFic3RyYWN0TWF0cml4LnByb3RvdHlwZS5mcm91bmQgPSBmdW5jdGlvbiBmcm91bmQoKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnJvd3M7IGkrKykge1xuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB0aGlzLmNvbHVtbnM7IGorKykge1xuICAgICAgICB0aGlzLnNldChpLCBqLCBNYXRoLmZyb3VuZCh0aGlzLmdldChpLCBqKSkpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBBYnN0cmFjdE1hdHJpeC5mcm91bmQgPSBmdW5jdGlvbiBmcm91bmQobWF0cml4KSB7XG4gICAgY29uc3QgbmV3TWF0cml4ID0gbmV3IE1hdHJpeChtYXRyaXgpO1xuICAgIHJldHVybiBuZXdNYXRyaXguZnJvdW5kKCk7XG4gIH07XG5cbiAgQWJzdHJhY3RNYXRyaXgucHJvdG90eXBlLmxvZyA9IGZ1bmN0aW9uIGxvZygpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucm93czsgaSsrKSB7XG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRoaXMuY29sdW1uczsgaisrKSB7XG4gICAgICAgIHRoaXMuc2V0KGksIGosIE1hdGgubG9nKHRoaXMuZ2V0KGksIGopKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIEFic3RyYWN0TWF0cml4LmxvZyA9IGZ1bmN0aW9uIGxvZyhtYXRyaXgpIHtcbiAgICBjb25zdCBuZXdNYXRyaXggPSBuZXcgTWF0cml4KG1hdHJpeCk7XG4gICAgcmV0dXJuIG5ld01hdHJpeC5sb2coKTtcbiAgfTtcblxuICBBYnN0cmFjdE1hdHJpeC5wcm90b3R5cGUubG9nMXAgPSBmdW5jdGlvbiBsb2cxcCgpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucm93czsgaSsrKSB7XG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRoaXMuY29sdW1uczsgaisrKSB7XG4gICAgICAgIHRoaXMuc2V0KGksIGosIE1hdGgubG9nMXAodGhpcy5nZXQoaSwgaikpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgQWJzdHJhY3RNYXRyaXgubG9nMXAgPSBmdW5jdGlvbiBsb2cxcChtYXRyaXgpIHtcbiAgICBjb25zdCBuZXdNYXRyaXggPSBuZXcgTWF0cml4KG1hdHJpeCk7XG4gICAgcmV0dXJuIG5ld01hdHJpeC5sb2cxcCgpO1xuICB9O1xuXG4gIEFic3RyYWN0TWF0cml4LnByb3RvdHlwZS5sb2cxMCA9IGZ1bmN0aW9uIGxvZzEwKCkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5yb3dzOyBpKyspIHtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5jb2x1bW5zOyBqKyspIHtcbiAgICAgICAgdGhpcy5zZXQoaSwgaiwgTWF0aC5sb2cxMCh0aGlzLmdldChpLCBqKSkpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBBYnN0cmFjdE1hdHJpeC5sb2cxMCA9IGZ1bmN0aW9uIGxvZzEwKG1hdHJpeCkge1xuICAgIGNvbnN0IG5ld01hdHJpeCA9IG5ldyBNYXRyaXgobWF0cml4KTtcbiAgICByZXR1cm4gbmV3TWF0cml4LmxvZzEwKCk7XG4gIH07XG5cbiAgQWJzdHJhY3RNYXRyaXgucHJvdG90eXBlLmxvZzIgPSBmdW5jdGlvbiBsb2cyKCkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5yb3dzOyBpKyspIHtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5jb2x1bW5zOyBqKyspIHtcbiAgICAgICAgdGhpcy5zZXQoaSwgaiwgTWF0aC5sb2cyKHRoaXMuZ2V0KGksIGopKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIEFic3RyYWN0TWF0cml4LmxvZzIgPSBmdW5jdGlvbiBsb2cyKG1hdHJpeCkge1xuICAgIGNvbnN0IG5ld01hdHJpeCA9IG5ldyBNYXRyaXgobWF0cml4KTtcbiAgICByZXR1cm4gbmV3TWF0cml4LmxvZzIoKTtcbiAgfTtcblxuICBBYnN0cmFjdE1hdHJpeC5wcm90b3R5cGUucm91bmQgPSBmdW5jdGlvbiByb3VuZCgpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucm93czsgaSsrKSB7XG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRoaXMuY29sdW1uczsgaisrKSB7XG4gICAgICAgIHRoaXMuc2V0KGksIGosIE1hdGgucm91bmQodGhpcy5nZXQoaSwgaikpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgQWJzdHJhY3RNYXRyaXgucm91bmQgPSBmdW5jdGlvbiByb3VuZChtYXRyaXgpIHtcbiAgICBjb25zdCBuZXdNYXRyaXggPSBuZXcgTWF0cml4KG1hdHJpeCk7XG4gICAgcmV0dXJuIG5ld01hdHJpeC5yb3VuZCgpO1xuICB9O1xuXG4gIEFic3RyYWN0TWF0cml4LnByb3RvdHlwZS5zaWduID0gZnVuY3Rpb24gc2lnbigpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucm93czsgaSsrKSB7XG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRoaXMuY29sdW1uczsgaisrKSB7XG4gICAgICAgIHRoaXMuc2V0KGksIGosIE1hdGguc2lnbih0aGlzLmdldChpLCBqKSkpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBBYnN0cmFjdE1hdHJpeC5zaWduID0gZnVuY3Rpb24gc2lnbihtYXRyaXgpIHtcbiAgICBjb25zdCBuZXdNYXRyaXggPSBuZXcgTWF0cml4KG1hdHJpeCk7XG4gICAgcmV0dXJuIG5ld01hdHJpeC5zaWduKCk7XG4gIH07XG5cbiAgQWJzdHJhY3RNYXRyaXgucHJvdG90eXBlLnNpbiA9IGZ1bmN0aW9uIHNpbigpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucm93czsgaSsrKSB7XG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRoaXMuY29sdW1uczsgaisrKSB7XG4gICAgICAgIHRoaXMuc2V0KGksIGosIE1hdGguc2luKHRoaXMuZ2V0KGksIGopKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIEFic3RyYWN0TWF0cml4LnNpbiA9IGZ1bmN0aW9uIHNpbihtYXRyaXgpIHtcbiAgICBjb25zdCBuZXdNYXRyaXggPSBuZXcgTWF0cml4KG1hdHJpeCk7XG4gICAgcmV0dXJuIG5ld01hdHJpeC5zaW4oKTtcbiAgfTtcblxuICBBYnN0cmFjdE1hdHJpeC5wcm90b3R5cGUuc2luaCA9IGZ1bmN0aW9uIHNpbmgoKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnJvd3M7IGkrKykge1xuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB0aGlzLmNvbHVtbnM7IGorKykge1xuICAgICAgICB0aGlzLnNldChpLCBqLCBNYXRoLnNpbmgodGhpcy5nZXQoaSwgaikpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgQWJzdHJhY3RNYXRyaXguc2luaCA9IGZ1bmN0aW9uIHNpbmgobWF0cml4KSB7XG4gICAgY29uc3QgbmV3TWF0cml4ID0gbmV3IE1hdHJpeChtYXRyaXgpO1xuICAgIHJldHVybiBuZXdNYXRyaXguc2luaCgpO1xuICB9O1xuXG4gIEFic3RyYWN0TWF0cml4LnByb3RvdHlwZS5zcXJ0ID0gZnVuY3Rpb24gc3FydCgpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucm93czsgaSsrKSB7XG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRoaXMuY29sdW1uczsgaisrKSB7XG4gICAgICAgIHRoaXMuc2V0KGksIGosIE1hdGguc3FydCh0aGlzLmdldChpLCBqKSkpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBBYnN0cmFjdE1hdHJpeC5zcXJ0ID0gZnVuY3Rpb24gc3FydChtYXRyaXgpIHtcbiAgICBjb25zdCBuZXdNYXRyaXggPSBuZXcgTWF0cml4KG1hdHJpeCk7XG4gICAgcmV0dXJuIG5ld01hdHJpeC5zcXJ0KCk7XG4gIH07XG5cbiAgQWJzdHJhY3RNYXRyaXgucHJvdG90eXBlLnRhbiA9IGZ1bmN0aW9uIHRhbigpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucm93czsgaSsrKSB7XG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRoaXMuY29sdW1uczsgaisrKSB7XG4gICAgICAgIHRoaXMuc2V0KGksIGosIE1hdGgudGFuKHRoaXMuZ2V0KGksIGopKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIEFic3RyYWN0TWF0cml4LnRhbiA9IGZ1bmN0aW9uIHRhbihtYXRyaXgpIHtcbiAgICBjb25zdCBuZXdNYXRyaXggPSBuZXcgTWF0cml4KG1hdHJpeCk7XG4gICAgcmV0dXJuIG5ld01hdHJpeC50YW4oKTtcbiAgfTtcblxuICBBYnN0cmFjdE1hdHJpeC5wcm90b3R5cGUudGFuaCA9IGZ1bmN0aW9uIHRhbmgoKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnJvd3M7IGkrKykge1xuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB0aGlzLmNvbHVtbnM7IGorKykge1xuICAgICAgICB0aGlzLnNldChpLCBqLCBNYXRoLnRhbmgodGhpcy5nZXQoaSwgaikpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgQWJzdHJhY3RNYXRyaXgudGFuaCA9IGZ1bmN0aW9uIHRhbmgobWF0cml4KSB7XG4gICAgY29uc3QgbmV3TWF0cml4ID0gbmV3IE1hdHJpeChtYXRyaXgpO1xuICAgIHJldHVybiBuZXdNYXRyaXgudGFuaCgpO1xuICB9O1xuXG4gIEFic3RyYWN0TWF0cml4LnByb3RvdHlwZS50cnVuYyA9IGZ1bmN0aW9uIHRydW5jKCkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5yb3dzOyBpKyspIHtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5jb2x1bW5zOyBqKyspIHtcbiAgICAgICAgdGhpcy5zZXQoaSwgaiwgTWF0aC50cnVuYyh0aGlzLmdldChpLCBqKSkpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBBYnN0cmFjdE1hdHJpeC50cnVuYyA9IGZ1bmN0aW9uIHRydW5jKG1hdHJpeCkge1xuICAgIGNvbnN0IG5ld01hdHJpeCA9IG5ldyBNYXRyaXgobWF0cml4KTtcbiAgICByZXR1cm4gbmV3TWF0cml4LnRydW5jKCk7XG4gIH07XG5cbiAgQWJzdHJhY3RNYXRyaXgucG93ID0gZnVuY3Rpb24gcG93KG1hdHJpeCwgYXJnMCkge1xuICAgIGNvbnN0IG5ld01hdHJpeCA9IG5ldyBNYXRyaXgobWF0cml4KTtcbiAgICByZXR1cm4gbmV3TWF0cml4LnBvdyhhcmcwKTtcbiAgfTtcblxuICBBYnN0cmFjdE1hdHJpeC5wcm90b3R5cGUucG93ID0gZnVuY3Rpb24gcG93KHZhbHVlKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHJldHVybiB0aGlzLnBvd1ModmFsdWUpO1xuICAgIHJldHVybiB0aGlzLnBvd00odmFsdWUpO1xuICB9O1xuXG4gIEFic3RyYWN0TWF0cml4LnByb3RvdHlwZS5wb3dTID0gZnVuY3Rpb24gcG93Uyh2YWx1ZSkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5yb3dzOyBpKyspIHtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5jb2x1bW5zOyBqKyspIHtcbiAgICAgICAgdGhpcy5zZXQoaSwgaiwgTWF0aC5wb3codGhpcy5nZXQoaSwgaiksIHZhbHVlKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIEFic3RyYWN0TWF0cml4LnByb3RvdHlwZS5wb3dNID0gZnVuY3Rpb24gcG93TShtYXRyaXgpIHtcbiAgICBtYXRyaXggPSBNYXRyaXguY2hlY2tNYXRyaXgobWF0cml4KTtcbiAgICBpZiAodGhpcy5yb3dzICE9PSBtYXRyaXgucm93cyB8fFxuICAgICAgdGhpcy5jb2x1bW5zICE9PSBtYXRyaXguY29sdW1ucykge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ01hdHJpY2VzIGRpbWVuc2lvbnMgbXVzdCBiZSBlcXVhbCcpO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucm93czsgaSsrKSB7XG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRoaXMuY29sdW1uczsgaisrKSB7XG4gICAgICAgIHRoaXMuc2V0KGksIGosIE1hdGgucG93KHRoaXMuZ2V0KGksIGopLCBtYXRyaXguZ2V0KGksIGopKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9O1xufVxuIiwiLyoqXG4gKiBAcHJpdmF0ZVxuICogQ2hlY2sgdGhhdCBhIHJvdyBpbmRleCBpcyBub3Qgb3V0IG9mIGJvdW5kc1xuICogQHBhcmFtIHtNYXRyaXh9IG1hdHJpeFxuICogQHBhcmFtIHtudW1iZXJ9IGluZGV4XG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvdXRlcl1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrUm93SW5kZXgobWF0cml4LCBpbmRleCwgb3V0ZXIpIHtcbiAgbGV0IG1heCA9IG91dGVyID8gbWF0cml4LnJvd3MgOiBtYXRyaXgucm93cyAtIDE7XG4gIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPiBtYXgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignUm93IGluZGV4IG91dCBvZiByYW5nZScpO1xuICB9XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIENoZWNrIHRoYXQgYSBjb2x1bW4gaW5kZXggaXMgbm90IG91dCBvZiBib3VuZHNcbiAqIEBwYXJhbSB7TWF0cml4fSBtYXRyaXhcbiAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleFxuICogQHBhcmFtIHtib29sZWFufSBbb3V0ZXJdXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGVja0NvbHVtbkluZGV4KG1hdHJpeCwgaW5kZXgsIG91dGVyKSB7XG4gIGxldCBtYXggPSBvdXRlciA/IG1hdHJpeC5jb2x1bW5zIDogbWF0cml4LmNvbHVtbnMgLSAxO1xuICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID4gbWF4KSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0NvbHVtbiBpbmRleCBvdXQgb2YgcmFuZ2UnKTtcbiAgfVxufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBDaGVjayB0aGF0IHRoZSBwcm92aWRlZCB2ZWN0b3IgaXMgYW4gYXJyYXkgd2l0aCB0aGUgcmlnaHQgbGVuZ3RoXG4gKiBAcGFyYW0ge01hdHJpeH0gbWF0cml4XG4gKiBAcGFyYW0ge0FycmF5fE1hdHJpeH0gdmVjdG9yXG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqIEB0aHJvd3Mge1JhbmdlRXJyb3J9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGVja1Jvd1ZlY3RvcihtYXRyaXgsIHZlY3Rvcikge1xuICBpZiAodmVjdG9yLnRvMURBcnJheSkge1xuICAgIHZlY3RvciA9IHZlY3Rvci50bzFEQXJyYXkoKTtcbiAgfVxuICBpZiAodmVjdG9yLmxlbmd0aCAhPT0gbWF0cml4LmNvbHVtbnMpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcbiAgICAgICd2ZWN0b3Igc2l6ZSBtdXN0IGJlIHRoZSBzYW1lIGFzIHRoZSBudW1iZXIgb2YgY29sdW1ucycsXG4gICAgKTtcbiAgfVxuICByZXR1cm4gdmVjdG9yO1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBDaGVjayB0aGF0IHRoZSBwcm92aWRlZCB2ZWN0b3IgaXMgYW4gYXJyYXkgd2l0aCB0aGUgcmlnaHQgbGVuZ3RoXG4gKiBAcGFyYW0ge01hdHJpeH0gbWF0cml4XG4gKiBAcGFyYW0ge0FycmF5fE1hdHJpeH0gdmVjdG9yXG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqIEB0aHJvd3Mge1JhbmdlRXJyb3J9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGVja0NvbHVtblZlY3RvcihtYXRyaXgsIHZlY3Rvcikge1xuICBpZiAodmVjdG9yLnRvMURBcnJheSkge1xuICAgIHZlY3RvciA9IHZlY3Rvci50bzFEQXJyYXkoKTtcbiAgfVxuICBpZiAodmVjdG9yLmxlbmd0aCAhPT0gbWF0cml4LnJvd3MpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcigndmVjdG9yIHNpemUgbXVzdCBiZSB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mIHJvd3MnKTtcbiAgfVxuICByZXR1cm4gdmVjdG9yO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tJbmRpY2VzKG1hdHJpeCwgcm93SW5kaWNlcywgY29sdW1uSW5kaWNlcykge1xuICByZXR1cm4ge1xuICAgIHJvdzogY2hlY2tSb3dJbmRpY2VzKG1hdHJpeCwgcm93SW5kaWNlcyksXG4gICAgY29sdW1uOiBjaGVja0NvbHVtbkluZGljZXMobWF0cml4LCBjb2x1bW5JbmRpY2VzKSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrUm93SW5kaWNlcyhtYXRyaXgsIHJvd0luZGljZXMpIHtcbiAgaWYgKHR5cGVvZiByb3dJbmRpY2VzICE9PSAnb2JqZWN0Jykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3VuZXhwZWN0ZWQgdHlwZSBmb3Igcm93IGluZGljZXMnKTtcbiAgfVxuXG4gIGxldCByb3dPdXQgPSByb3dJbmRpY2VzLnNvbWUoKHIpID0+IHtcbiAgICByZXR1cm4gciA8IDAgfHwgciA+PSBtYXRyaXgucm93cztcbiAgfSk7XG5cbiAgaWYgKHJvd091dCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdyb3cgaW5kaWNlcyBhcmUgb3V0IG9mIHJhbmdlJyk7XG4gIH1cblxuICBpZiAoIUFycmF5LmlzQXJyYXkocm93SW5kaWNlcykpIHJvd0luZGljZXMgPSBBcnJheS5mcm9tKHJvd0luZGljZXMpO1xuXG4gIHJldHVybiByb3dJbmRpY2VzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tDb2x1bW5JbmRpY2VzKG1hdHJpeCwgY29sdW1uSW5kaWNlcykge1xuICBpZiAodHlwZW9mIGNvbHVtbkluZGljZXMgIT09ICdvYmplY3QnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndW5leHBlY3RlZCB0eXBlIGZvciBjb2x1bW4gaW5kaWNlcycpO1xuICB9XG5cbiAgbGV0IGNvbHVtbk91dCA9IGNvbHVtbkluZGljZXMuc29tZSgoYykgPT4ge1xuICAgIHJldHVybiBjIDwgMCB8fCBjID49IG1hdHJpeC5jb2x1bW5zO1xuICB9KTtcblxuICBpZiAoY29sdW1uT3V0KSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ2NvbHVtbiBpbmRpY2VzIGFyZSBvdXQgb2YgcmFuZ2UnKTtcbiAgfVxuICBpZiAoIUFycmF5LmlzQXJyYXkoY29sdW1uSW5kaWNlcykpIGNvbHVtbkluZGljZXMgPSBBcnJheS5mcm9tKGNvbHVtbkluZGljZXMpO1xuXG4gIHJldHVybiBjb2x1bW5JbmRpY2VzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tSYW5nZShtYXRyaXgsIHN0YXJ0Um93LCBlbmRSb3csIHN0YXJ0Q29sdW1uLCBlbmRDb2x1bW4pIHtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggIT09IDUpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignZXhwZWN0ZWQgNCBhcmd1bWVudHMnKTtcbiAgfVxuICBjaGVja051bWJlcignc3RhcnRSb3cnLCBzdGFydFJvdyk7XG4gIGNoZWNrTnVtYmVyKCdlbmRSb3cnLCBlbmRSb3cpO1xuICBjaGVja051bWJlcignc3RhcnRDb2x1bW4nLCBzdGFydENvbHVtbik7XG4gIGNoZWNrTnVtYmVyKCdlbmRDb2x1bW4nLCBlbmRDb2x1bW4pO1xuICBpZiAoXG4gICAgc3RhcnRSb3cgPiBlbmRSb3cgfHxcbiAgICBzdGFydENvbHVtbiA+IGVuZENvbHVtbiB8fFxuICAgIHN0YXJ0Um93IDwgMCB8fFxuICAgIHN0YXJ0Um93ID49IG1hdHJpeC5yb3dzIHx8XG4gICAgZW5kUm93IDwgMCB8fFxuICAgIGVuZFJvdyA+PSBtYXRyaXgucm93cyB8fFxuICAgIHN0YXJ0Q29sdW1uIDwgMCB8fFxuICAgIHN0YXJ0Q29sdW1uID49IG1hdHJpeC5jb2x1bW5zIHx8XG4gICAgZW5kQ29sdW1uIDwgMCB8fFxuICAgIGVuZENvbHVtbiA+PSBtYXRyaXguY29sdW1uc1xuICApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignU3VibWF0cml4IGluZGljZXMgYXJlIG91dCBvZiByYW5nZScpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBuZXdBcnJheShsZW5ndGgsIHZhbHVlID0gMCkge1xuICBsZXQgYXJyYXkgPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgIGFycmF5LnB1c2godmFsdWUpO1xuICB9XG4gIHJldHVybiBhcnJheTtcbn1cblxuZnVuY3Rpb24gY2hlY2tOdW1iZXIobmFtZSwgdmFsdWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGAke25hbWV9IG11c3QgYmUgYSBudW1iZXJgKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tOb25FbXB0eShtYXRyaXgpIHtcbiAgaWYgKG1hdHJpeC5pc0VtcHR5KCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0VtcHR5IG1hdHJpeCBoYXMgbm8gZWxlbWVudHMgdG8gaW5kZXgnKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgbmV3QXJyYXkgfSBmcm9tICcuL3V0aWwnO1xuXG5leHBvcnQgZnVuY3Rpb24gc3VtQnlSb3cobWF0cml4KSB7XG4gIGxldCBzdW0gPSBuZXdBcnJheShtYXRyaXgucm93cyk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbWF0cml4LnJvd3M7ICsraSkge1xuICAgIGZvciAobGV0IGogPSAwOyBqIDwgbWF0cml4LmNvbHVtbnM7ICsraikge1xuICAgICAgc3VtW2ldICs9IG1hdHJpeC5nZXQoaSwgaik7XG4gICAgfVxuICB9XG4gIHJldHVybiBzdW07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdW1CeUNvbHVtbihtYXRyaXgpIHtcbiAgbGV0IHN1bSA9IG5ld0FycmF5KG1hdHJpeC5jb2x1bW5zKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXRyaXgucm93czsgKytpKSB7XG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBtYXRyaXguY29sdW1uczsgKytqKSB7XG4gICAgICBzdW1bal0gKz0gbWF0cml4LmdldChpLCBqKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHN1bTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN1bUFsbChtYXRyaXgpIHtcbiAgbGV0IHYgPSAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG1hdHJpeC5yb3dzOyBpKyspIHtcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IG1hdHJpeC5jb2x1bW5zOyBqKyspIHtcbiAgICAgIHYgKz0gbWF0cml4LmdldChpLCBqKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHY7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcm9kdWN0QnlSb3cobWF0cml4KSB7XG4gIGxldCBzdW0gPSBuZXdBcnJheShtYXRyaXgucm93cywgMSk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbWF0cml4LnJvd3M7ICsraSkge1xuICAgIGZvciAobGV0IGogPSAwOyBqIDwgbWF0cml4LmNvbHVtbnM7ICsraikge1xuICAgICAgc3VtW2ldICo9IG1hdHJpeC5nZXQoaSwgaik7XG4gICAgfVxuICB9XG4gIHJldHVybiBzdW07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcm9kdWN0QnlDb2x1bW4obWF0cml4KSB7XG4gIGxldCBzdW0gPSBuZXdBcnJheShtYXRyaXguY29sdW1ucywgMSk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbWF0cml4LnJvd3M7ICsraSkge1xuICAgIGZvciAobGV0IGogPSAwOyBqIDwgbWF0cml4LmNvbHVtbnM7ICsraikge1xuICAgICAgc3VtW2pdICo9IG1hdHJpeC5nZXQoaSwgaik7XG4gICAgfVxuICB9XG4gIHJldHVybiBzdW07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcm9kdWN0QWxsKG1hdHJpeCkge1xuICBsZXQgdiA9IDE7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbWF0cml4LnJvd3M7IGkrKykge1xuICAgIGZvciAobGV0IGogPSAwOyBqIDwgbWF0cml4LmNvbHVtbnM7IGorKykge1xuICAgICAgdiAqPSBtYXRyaXguZ2V0KGksIGopO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZhcmlhbmNlQnlSb3cobWF0cml4LCB1bmJpYXNlZCwgbWVhbikge1xuICBjb25zdCByb3dzID0gbWF0cml4LnJvd3M7XG4gIGNvbnN0IGNvbHMgPSBtYXRyaXguY29sdW1ucztcbiAgY29uc3QgdmFyaWFuY2UgPSBbXTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHJvd3M7IGkrKykge1xuICAgIGxldCBzdW0xID0gMDtcbiAgICBsZXQgc3VtMiA9IDA7XG4gICAgbGV0IHggPSAwO1xuICAgIGZvciAobGV0IGogPSAwOyBqIDwgY29sczsgaisrKSB7XG4gICAgICB4ID0gbWF0cml4LmdldChpLCBqKSAtIG1lYW5baV07XG4gICAgICBzdW0xICs9IHg7XG4gICAgICBzdW0yICs9IHggKiB4O1xuICAgIH1cbiAgICBpZiAodW5iaWFzZWQpIHtcbiAgICAgIHZhcmlhbmNlLnB1c2goKHN1bTIgLSAoc3VtMSAqIHN1bTEpIC8gY29scykgLyAoY29scyAtIDEpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyaWFuY2UucHVzaCgoc3VtMiAtIChzdW0xICogc3VtMSkgLyBjb2xzKSAvIGNvbHMpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdmFyaWFuY2U7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YXJpYW5jZUJ5Q29sdW1uKG1hdHJpeCwgdW5iaWFzZWQsIG1lYW4pIHtcbiAgY29uc3Qgcm93cyA9IG1hdHJpeC5yb3dzO1xuICBjb25zdCBjb2xzID0gbWF0cml4LmNvbHVtbnM7XG4gIGNvbnN0IHZhcmlhbmNlID0gW107XG5cbiAgZm9yIChsZXQgaiA9IDA7IGogPCBjb2xzOyBqKyspIHtcbiAgICBsZXQgc3VtMSA9IDA7XG4gICAgbGV0IHN1bTIgPSAwO1xuICAgIGxldCB4ID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJvd3M7IGkrKykge1xuICAgICAgeCA9IG1hdHJpeC5nZXQoaSwgaikgLSBtZWFuW2pdO1xuICAgICAgc3VtMSArPSB4O1xuICAgICAgc3VtMiArPSB4ICogeDtcbiAgICB9XG4gICAgaWYgKHVuYmlhc2VkKSB7XG4gICAgICB2YXJpYW5jZS5wdXNoKChzdW0yIC0gKHN1bTEgKiBzdW0xKSAvIHJvd3MpIC8gKHJvd3MgLSAxKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhcmlhbmNlLnB1c2goKHN1bTIgLSAoc3VtMSAqIHN1bTEpIC8gcm93cykgLyByb3dzKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHZhcmlhbmNlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdmFyaWFuY2VBbGwobWF0cml4LCB1bmJpYXNlZCwgbWVhbikge1xuICBjb25zdCByb3dzID0gbWF0cml4LnJvd3M7XG4gIGNvbnN0IGNvbHMgPSBtYXRyaXguY29sdW1ucztcbiAgY29uc3Qgc2l6ZSA9IHJvd3MgKiBjb2xzO1xuXG4gIGxldCBzdW0xID0gMDtcbiAgbGV0IHN1bTIgPSAwO1xuICBsZXQgeCA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcm93czsgaSsrKSB7XG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBjb2xzOyBqKyspIHtcbiAgICAgIHggPSBtYXRyaXguZ2V0KGksIGopIC0gbWVhbjtcbiAgICAgIHN1bTEgKz0geDtcbiAgICAgIHN1bTIgKz0geCAqIHg7XG4gICAgfVxuICB9XG4gIGlmICh1bmJpYXNlZCkge1xuICAgIHJldHVybiAoc3VtMiAtIChzdW0xICogc3VtMSkgLyBzaXplKSAvIChzaXplIC0gMSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIChzdW0yIC0gKHN1bTEgKiBzdW0xKSAvIHNpemUpIC8gc2l6ZTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY2VudGVyQnlSb3cobWF0cml4LCBtZWFuKSB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbWF0cml4LnJvd3M7IGkrKykge1xuICAgIGZvciAobGV0IGogPSAwOyBqIDwgbWF0cml4LmNvbHVtbnM7IGorKykge1xuICAgICAgbWF0cml4LnNldChpLCBqLCBtYXRyaXguZ2V0KGksIGopIC0gbWVhbltpXSk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjZW50ZXJCeUNvbHVtbihtYXRyaXgsIG1lYW4pIHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXRyaXgucm93czsgaSsrKSB7XG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBtYXRyaXguY29sdW1uczsgaisrKSB7XG4gICAgICBtYXRyaXguc2V0KGksIGosIG1hdHJpeC5nZXQoaSwgaikgLSBtZWFuW2pdKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNlbnRlckFsbChtYXRyaXgsIG1lYW4pIHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXRyaXgucm93czsgaSsrKSB7XG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBtYXRyaXguY29sdW1uczsgaisrKSB7XG4gICAgICBtYXRyaXguc2V0KGksIGosIG1hdHJpeC5nZXQoaSwgaikgLSBtZWFuKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNjYWxlQnlSb3cobWF0cml4KSB7XG4gIGNvbnN0IHNjYWxlID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbWF0cml4LnJvd3M7IGkrKykge1xuICAgIGxldCBzdW0gPSAwO1xuICAgIGZvciAobGV0IGogPSAwOyBqIDwgbWF0cml4LmNvbHVtbnM7IGorKykge1xuICAgICAgc3VtICs9IE1hdGgucG93KG1hdHJpeC5nZXQoaSwgaiksIDIpIC8gKG1hdHJpeC5jb2x1bW5zIC0gMSk7XG4gICAgfVxuICAgIHNjYWxlLnB1c2goTWF0aC5zcXJ0KHN1bSkpO1xuICB9XG4gIHJldHVybiBzY2FsZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNjYWxlQnlSb3cobWF0cml4LCBzY2FsZSkge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG1hdHJpeC5yb3dzOyBpKyspIHtcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IG1hdHJpeC5jb2x1bW5zOyBqKyspIHtcbiAgICAgIG1hdHJpeC5zZXQoaSwgaiwgbWF0cml4LmdldChpLCBqKSAvIHNjYWxlW2ldKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNjYWxlQnlDb2x1bW4obWF0cml4KSB7XG4gIGNvbnN0IHNjYWxlID0gW107XG4gIGZvciAobGV0IGogPSAwOyBqIDwgbWF0cml4LmNvbHVtbnM7IGorKykge1xuICAgIGxldCBzdW0gPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWF0cml4LnJvd3M7IGkrKykge1xuICAgICAgc3VtICs9IE1hdGgucG93KG1hdHJpeC5nZXQoaSwgaiksIDIpIC8gKG1hdHJpeC5yb3dzIC0gMSk7XG4gICAgfVxuICAgIHNjYWxlLnB1c2goTWF0aC5zcXJ0KHN1bSkpO1xuICB9XG4gIHJldHVybiBzY2FsZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNjYWxlQnlDb2x1bW4obWF0cml4LCBzY2FsZSkge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG1hdHJpeC5yb3dzOyBpKyspIHtcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IG1hdHJpeC5jb2x1bW5zOyBqKyspIHtcbiAgICAgIG1hdHJpeC5zZXQoaSwgaiwgbWF0cml4LmdldChpLCBqKSAvIHNjYWxlW2pdKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNjYWxlQWxsKG1hdHJpeCkge1xuICBjb25zdCBkaXZpZGVyID0gbWF0cml4LnNpemUgLSAxO1xuICBsZXQgc3VtID0gMDtcbiAgZm9yIChsZXQgaiA9IDA7IGogPCBtYXRyaXguY29sdW1uczsgaisrKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXRyaXgucm93czsgaSsrKSB7XG4gICAgICBzdW0gKz0gTWF0aC5wb3cobWF0cml4LmdldChpLCBqKSwgMikgLyBkaXZpZGVyO1xuICAgIH1cbiAgfVxuICByZXR1cm4gTWF0aC5zcXJ0KHN1bSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzY2FsZUFsbChtYXRyaXgsIHNjYWxlKSB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbWF0cml4LnJvd3M7IGkrKykge1xuICAgIGZvciAobGV0IGogPSAwOyBqIDwgbWF0cml4LmNvbHVtbnM7IGorKykge1xuICAgICAgbWF0cml4LnNldChpLCBqLCBtYXRyaXguZ2V0KGksIGopIC8gc2NhbGUpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHJlc2NhbGUgZnJvbSAnbWwtYXJyYXktcmVzY2FsZSc7XG5cbmltcG9ydCB7IGluc3BlY3RNYXRyaXgsIGluc3BlY3RNYXRyaXhXaXRoT3B0aW9ucyB9IGZyb20gJy4vaW5zcGVjdCc7XG5pbXBvcnQgeyBpbnN0YWxsTWF0aE9wZXJhdGlvbnMgfSBmcm9tICcuL21hdGhPcGVyYXRpb25zJztcbmltcG9ydCB7XG4gIHN1bUJ5Um93LFxuICBzdW1CeUNvbHVtbixcbiAgc3VtQWxsLFxuICBwcm9kdWN0QnlSb3csXG4gIHByb2R1Y3RCeUNvbHVtbixcbiAgcHJvZHVjdEFsbCxcbiAgdmFyaWFuY2VCeVJvdyxcbiAgdmFyaWFuY2VCeUNvbHVtbixcbiAgdmFyaWFuY2VBbGwsXG4gIGNlbnRlckJ5Um93LFxuICBjZW50ZXJCeUNvbHVtbixcbiAgY2VudGVyQWxsLFxuICBzY2FsZUJ5Um93LFxuICBzY2FsZUJ5Q29sdW1uLFxuICBzY2FsZUFsbCxcbiAgZ2V0U2NhbGVCeVJvdyxcbiAgZ2V0U2NhbGVCeUNvbHVtbixcbiAgZ2V0U2NhbGVBbGwsXG59IGZyb20gJy4vc3RhdCc7XG5pbXBvcnQge1xuICBjaGVja1Jvd1ZlY3RvcixcbiAgY2hlY2tSb3dJbmRleCxcbiAgY2hlY2tDb2x1bW5JbmRleCxcbiAgY2hlY2tDb2x1bW5WZWN0b3IsXG4gIGNoZWNrUmFuZ2UsXG4gIGNoZWNrSW5kaWNlcyxcbiAgY2hlY2tOb25FbXB0eSxcbn0gZnJvbSAnLi91dGlsJztcblxuZXhwb3J0IGNsYXNzIEFic3RyYWN0TWF0cml4IHtcbiAgc3RhdGljIGZyb20xREFycmF5KG5ld1Jvd3MsIG5ld0NvbHVtbnMsIG5ld0RhdGEpIHtcbiAgICBsZXQgbGVuZ3RoID0gbmV3Um93cyAqIG5ld0NvbHVtbnM7XG4gICAgaWYgKGxlbmd0aCAhPT0gbmV3RGF0YS5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdkYXRhIGxlbmd0aCBkb2VzIG5vdCBtYXRjaCBnaXZlbiBkaW1lbnNpb25zJyk7XG4gICAgfVxuICAgIGxldCBuZXdNYXRyaXggPSBuZXcgTWF0cml4KG5ld1Jvd3MsIG5ld0NvbHVtbnMpO1xuICAgIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IG5ld1Jvd3M7IHJvdysrKSB7XG4gICAgICBmb3IgKGxldCBjb2x1bW4gPSAwOyBjb2x1bW4gPCBuZXdDb2x1bW5zOyBjb2x1bW4rKykge1xuICAgICAgICBuZXdNYXRyaXguc2V0KHJvdywgY29sdW1uLCBuZXdEYXRhW3JvdyAqIG5ld0NvbHVtbnMgKyBjb2x1bW5dKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5ld01hdHJpeDtcbiAgfVxuXG4gIHN0YXRpYyByb3dWZWN0b3IobmV3RGF0YSkge1xuICAgIGxldCB2ZWN0b3IgPSBuZXcgTWF0cml4KDEsIG5ld0RhdGEubGVuZ3RoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5ld0RhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZlY3Rvci5zZXQoMCwgaSwgbmV3RGF0YVtpXSk7XG4gICAgfVxuICAgIHJldHVybiB2ZWN0b3I7XG4gIH1cblxuICBzdGF0aWMgY29sdW1uVmVjdG9yKG5ld0RhdGEpIHtcbiAgICBsZXQgdmVjdG9yID0gbmV3IE1hdHJpeChuZXdEYXRhLmxlbmd0aCwgMSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuZXdEYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2ZWN0b3Iuc2V0KGksIDAsIG5ld0RhdGFbaV0pO1xuICAgIH1cbiAgICByZXR1cm4gdmVjdG9yO1xuICB9XG5cbiAgc3RhdGljIHplcm9zKHJvd3MsIGNvbHVtbnMpIHtcbiAgICByZXR1cm4gbmV3IE1hdHJpeChyb3dzLCBjb2x1bW5zKTtcbiAgfVxuXG4gIHN0YXRpYyBvbmVzKHJvd3MsIGNvbHVtbnMpIHtcbiAgICByZXR1cm4gbmV3IE1hdHJpeChyb3dzLCBjb2x1bW5zKS5maWxsKDEpO1xuICB9XG5cbiAgc3RhdGljIHJhbmQocm93cywgY29sdW1ucywgb3B0aW9ucyA9IHt9KSB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCcpO1xuICAgIH1cbiAgICBjb25zdCB7IHJhbmRvbSA9IE1hdGgucmFuZG9tIH0gPSBvcHRpb25zO1xuICAgIGxldCBtYXRyaXggPSBuZXcgTWF0cml4KHJvd3MsIGNvbHVtbnMpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm93czsgaSsrKSB7XG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGNvbHVtbnM7IGorKykge1xuICAgICAgICBtYXRyaXguc2V0KGksIGosIHJhbmRvbSgpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1hdHJpeDtcbiAgfVxuXG4gIHN0YXRpYyByYW5kSW50KHJvd3MsIGNvbHVtbnMsIG9wdGlvbnMgPSB7fSkge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucyAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QnKTtcbiAgICB9XG4gICAgY29uc3QgeyBtaW4gPSAwLCBtYXggPSAxMDAwLCByYW5kb20gPSBNYXRoLnJhbmRvbSB9ID0gb3B0aW9ucztcbiAgICBpZiAoIU51bWJlci5pc0ludGVnZXIobWluKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignbWluIG11c3QgYmUgYW4gaW50ZWdlcicpO1xuICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihtYXgpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdtYXggbXVzdCBiZSBhbiBpbnRlZ2VyJyk7XG4gICAgaWYgKG1pbiA+PSBtYXgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdtaW4gbXVzdCBiZSBzbWFsbGVyIHRoYW4gbWF4Jyk7XG4gICAgbGV0IGludGVydmFsID0gbWF4IC0gbWluO1xuICAgIGxldCBtYXRyaXggPSBuZXcgTWF0cml4KHJvd3MsIGNvbHVtbnMpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm93czsgaSsrKSB7XG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGNvbHVtbnM7IGorKykge1xuICAgICAgICBsZXQgdmFsdWUgPSBtaW4gKyBNYXRoLnJvdW5kKHJhbmRvbSgpICogaW50ZXJ2YWwpO1xuICAgICAgICBtYXRyaXguc2V0KGksIGosIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1hdHJpeDtcbiAgfVxuXG4gIHN0YXRpYyBleWUocm93cywgY29sdW1ucywgdmFsdWUpIHtcbiAgICBpZiAoY29sdW1ucyA9PT0gdW5kZWZpbmVkKSBjb2x1bW5zID0gcm93cztcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgdmFsdWUgPSAxO1xuICAgIGxldCBtaW4gPSBNYXRoLm1pbihyb3dzLCBjb2x1bW5zKTtcbiAgICBsZXQgbWF0cml4ID0gdGhpcy56ZXJvcyhyb3dzLCBjb2x1bW5zKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1pbjsgaSsrKSB7XG4gICAgICBtYXRyaXguc2V0KGksIGksIHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIG1hdHJpeDtcbiAgfVxuXG4gIHN0YXRpYyBkaWFnKGRhdGEsIHJvd3MsIGNvbHVtbnMpIHtcbiAgICBsZXQgbCA9IGRhdGEubGVuZ3RoO1xuICAgIGlmIChyb3dzID09PSB1bmRlZmluZWQpIHJvd3MgPSBsO1xuICAgIGlmIChjb2x1bW5zID09PSB1bmRlZmluZWQpIGNvbHVtbnMgPSByb3dzO1xuICAgIGxldCBtaW4gPSBNYXRoLm1pbihsLCByb3dzLCBjb2x1bW5zKTtcbiAgICBsZXQgbWF0cml4ID0gdGhpcy56ZXJvcyhyb3dzLCBjb2x1bW5zKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1pbjsgaSsrKSB7XG4gICAgICBtYXRyaXguc2V0KGksIGksIGRhdGFbaV0pO1xuICAgIH1cbiAgICByZXR1cm4gbWF0cml4O1xuICB9XG5cbiAgc3RhdGljIG1pbihtYXRyaXgxLCBtYXRyaXgyKSB7XG4gICAgbWF0cml4MSA9IHRoaXMuY2hlY2tNYXRyaXgobWF0cml4MSk7XG4gICAgbWF0cml4MiA9IHRoaXMuY2hlY2tNYXRyaXgobWF0cml4Mik7XG4gICAgbGV0IHJvd3MgPSBtYXRyaXgxLnJvd3M7XG4gICAgbGV0IGNvbHVtbnMgPSBtYXRyaXgxLmNvbHVtbnM7XG4gICAgbGV0IHJlc3VsdCA9IG5ldyBNYXRyaXgocm93cywgY29sdW1ucyk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByb3dzOyBpKyspIHtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgY29sdW1uczsgaisrKSB7XG4gICAgICAgIHJlc3VsdC5zZXQoaSwgaiwgTWF0aC5taW4obWF0cml4MS5nZXQoaSwgaiksIG1hdHJpeDIuZ2V0KGksIGopKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBzdGF0aWMgbWF4KG1hdHJpeDEsIG1hdHJpeDIpIHtcbiAgICBtYXRyaXgxID0gdGhpcy5jaGVja01hdHJpeChtYXRyaXgxKTtcbiAgICBtYXRyaXgyID0gdGhpcy5jaGVja01hdHJpeChtYXRyaXgyKTtcbiAgICBsZXQgcm93cyA9IG1hdHJpeDEucm93cztcbiAgICBsZXQgY29sdW1ucyA9IG1hdHJpeDEuY29sdW1ucztcbiAgICBsZXQgcmVzdWx0ID0gbmV3IHRoaXMocm93cywgY29sdW1ucyk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByb3dzOyBpKyspIHtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgY29sdW1uczsgaisrKSB7XG4gICAgICAgIHJlc3VsdC5zZXQoaSwgaiwgTWF0aC5tYXgobWF0cml4MS5nZXQoaSwgaiksIG1hdHJpeDIuZ2V0KGksIGopKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBzdGF0aWMgY2hlY2tNYXRyaXgodmFsdWUpIHtcbiAgICByZXR1cm4gQWJzdHJhY3RNYXRyaXguaXNNYXRyaXgodmFsdWUpID8gdmFsdWUgOiBuZXcgTWF0cml4KHZhbHVlKTtcbiAgfVxuXG4gIHN0YXRpYyBpc01hdHJpeCh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmtsYXNzID09PSAnTWF0cml4JztcbiAgfVxuXG4gIGdldCBzaXplKCkge1xuICAgIHJldHVybiB0aGlzLnJvd3MgKiB0aGlzLmNvbHVtbnM7XG4gIH1cblxuICBhcHBseShjYWxsYmFjaykge1xuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2NhbGxiYWNrIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucm93czsgaSsrKSB7XG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRoaXMuY29sdW1uczsgaisrKSB7XG4gICAgICAgIGNhbGxiYWNrLmNhbGwodGhpcywgaSwgaik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgdG8xREFycmF5KCkge1xuICAgIGxldCBhcnJheSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5yb3dzOyBpKyspIHtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5jb2x1bW5zOyBqKyspIHtcbiAgICAgICAgYXJyYXkucHVzaCh0aGlzLmdldChpLCBqKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhcnJheTtcbiAgfVxuXG4gIHRvMkRBcnJheSgpIHtcbiAgICBsZXQgY29weSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5yb3dzOyBpKyspIHtcbiAgICAgIGNvcHkucHVzaChbXSk7XG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRoaXMuY29sdW1uczsgaisrKSB7XG4gICAgICAgIGNvcHlbaV0ucHVzaCh0aGlzLmdldChpLCBqKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb3B5O1xuICB9XG5cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiB0aGlzLnRvMkRBcnJheSgpO1xuICB9XG5cbiAgaXNSb3dWZWN0b3IoKSB7XG4gICAgcmV0dXJuIHRoaXMucm93cyA9PT0gMTtcbiAgfVxuXG4gIGlzQ29sdW1uVmVjdG9yKCkge1xuICAgIHJldHVybiB0aGlzLmNvbHVtbnMgPT09IDE7XG4gIH1cblxuICBpc1ZlY3RvcigpIHtcbiAgICByZXR1cm4gdGhpcy5yb3dzID09PSAxIHx8IHRoaXMuY29sdW1ucyA9PT0gMTtcbiAgfVxuXG4gIGlzU3F1YXJlKCkge1xuICAgIHJldHVybiB0aGlzLnJvd3MgPT09IHRoaXMuY29sdW1ucztcbiAgfVxuXG4gIGlzRW1wdHkoKSB7XG4gICAgcmV0dXJuIHRoaXMucm93cyA9PT0gMCB8fCB0aGlzLmNvbHVtbnMgPT09IDA7XG4gIH1cblxuICBpc1N5bW1ldHJpYygpIHtcbiAgICBpZiAodGhpcy5pc1NxdWFyZSgpKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucm93czsgaSsrKSB7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDw9IGk7IGorKykge1xuICAgICAgICAgIGlmICh0aGlzLmdldChpLCBqKSAhPT0gdGhpcy5nZXQoaiwgaSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpc0VjaGVsb25Gb3JtKCkge1xuICAgIGxldCBpID0gMDtcbiAgICBsZXQgaiA9IDA7XG4gICAgbGV0IHByZXZpb3VzQ29sdW1uID0gLTE7XG4gICAgbGV0IGlzRWNoZWxvbkZvcm0gPSB0cnVlO1xuICAgIGxldCBjaGVja2VkID0gZmFsc2U7XG4gICAgd2hpbGUgKGkgPCB0aGlzLnJvd3MgJiYgaXNFY2hlbG9uRm9ybSkge1xuICAgICAgaiA9IDA7XG4gICAgICBjaGVja2VkID0gZmFsc2U7XG4gICAgICB3aGlsZSAoaiA8IHRoaXMuY29sdW1ucyAmJiBjaGVja2VkID09PSBmYWxzZSkge1xuICAgICAgICBpZiAodGhpcy5nZXQoaSwgaikgPT09IDApIHtcbiAgICAgICAgICBqKys7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5nZXQoaSwgaikgPT09IDEgJiYgaiA+IHByZXZpb3VzQ29sdW1uKSB7XG4gICAgICAgICAgY2hlY2tlZCA9IHRydWU7XG4gICAgICAgICAgcHJldmlvdXNDb2x1bW4gPSBqO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlzRWNoZWxvbkZvcm0gPSBmYWxzZTtcbiAgICAgICAgICBjaGVja2VkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaSsrO1xuICAgIH1cbiAgICByZXR1cm4gaXNFY2hlbG9uRm9ybTtcbiAgfVxuXG4gIGlzUmVkdWNlZEVjaGVsb25Gb3JtKCkge1xuICAgIGxldCBpID0gMDtcbiAgICBsZXQgaiA9IDA7XG4gICAgbGV0IHByZXZpb3VzQ29sdW1uID0gLTE7XG4gICAgbGV0IGlzUmVkdWNlZEVjaGVsb25Gb3JtID0gdHJ1ZTtcbiAgICBsZXQgY2hlY2tlZCA9IGZhbHNlO1xuICAgIHdoaWxlIChpIDwgdGhpcy5yb3dzICYmIGlzUmVkdWNlZEVjaGVsb25Gb3JtKSB7XG4gICAgICBqID0gMDtcbiAgICAgIGNoZWNrZWQgPSBmYWxzZTtcbiAgICAgIHdoaWxlIChqIDwgdGhpcy5jb2x1bW5zICYmIGNoZWNrZWQgPT09IGZhbHNlKSB7XG4gICAgICAgIGlmICh0aGlzLmdldChpLCBqKSA9PT0gMCkge1xuICAgICAgICAgIGorKztcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmdldChpLCBqKSA9PT0gMSAmJiBqID4gcHJldmlvdXNDb2x1bW4pIHtcbiAgICAgICAgICBjaGVja2VkID0gdHJ1ZTtcbiAgICAgICAgICBwcmV2aW91c0NvbHVtbiA9IGo7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaXNSZWR1Y2VkRWNoZWxvbkZvcm0gPSBmYWxzZTtcbiAgICAgICAgICBjaGVja2VkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZm9yIChsZXQgayA9IGogKyAxOyBrIDwgdGhpcy5yb3dzOyBrKyspIHtcbiAgICAgICAgaWYgKHRoaXMuZ2V0KGksIGspICE9PSAwKSB7XG4gICAgICAgICAgaXNSZWR1Y2VkRWNoZWxvbkZvcm0gPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaSsrO1xuICAgIH1cbiAgICByZXR1cm4gaXNSZWR1Y2VkRWNoZWxvbkZvcm07XG4gIH1cblxuICBlY2hlbG9uRm9ybSgpIHtcbiAgICBsZXQgcmVzdWx0ID0gdGhpcy5jbG9uZSgpO1xuICAgIGxldCBoID0gMDtcbiAgICBsZXQgayA9IDA7XG4gICAgd2hpbGUgKGggPCByZXN1bHQucm93cyAmJiBrIDwgcmVzdWx0LmNvbHVtbnMpIHtcbiAgICAgIGxldCBpTWF4ID0gaDtcbiAgICAgIGZvciAobGV0IGkgPSBoOyBpIDwgcmVzdWx0LnJvd3M7IGkrKykge1xuICAgICAgICBpZiAocmVzdWx0LmdldChpLCBrKSA+IHJlc3VsdC5nZXQoaU1heCwgaykpIHtcbiAgICAgICAgICBpTWF4ID0gaTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHJlc3VsdC5nZXQoaU1heCwgaykgPT09IDApIHtcbiAgICAgICAgaysrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0LnN3YXBSb3dzKGgsIGlNYXgpO1xuICAgICAgICBsZXQgdG1wID0gcmVzdWx0LmdldChoLCBrKTtcbiAgICAgICAgZm9yIChsZXQgaiA9IGs7IGogPCByZXN1bHQuY29sdW1uczsgaisrKSB7XG4gICAgICAgICAgcmVzdWx0LnNldChoLCBqLCByZXN1bHQuZ2V0KGgsIGopIC8gdG1wKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gaCArIDE7IGkgPCByZXN1bHQucm93czsgaSsrKSB7XG4gICAgICAgICAgbGV0IGZhY3RvciA9IHJlc3VsdC5nZXQoaSwgaykgLyByZXN1bHQuZ2V0KGgsIGspO1xuICAgICAgICAgIHJlc3VsdC5zZXQoaSwgaywgMCk7XG4gICAgICAgICAgZm9yIChsZXQgaiA9IGsgKyAxOyBqIDwgcmVzdWx0LmNvbHVtbnM7IGorKykge1xuICAgICAgICAgICAgcmVzdWx0LnNldChpLCBqLCByZXN1bHQuZ2V0KGksIGopIC0gcmVzdWx0LmdldChoLCBqKSAqIGZhY3Rvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGgrKztcbiAgICAgICAgaysrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcmVkdWNlZEVjaGVsb25Gb3JtKCkge1xuICAgIGxldCByZXN1bHQgPSB0aGlzLmVjaGVsb25Gb3JtKCk7XG4gICAgbGV0IG0gPSByZXN1bHQuY29sdW1ucztcbiAgICBsZXQgbiA9IHJlc3VsdC5yb3dzO1xuICAgIGxldCBoID0gbiAtIDE7XG4gICAgd2hpbGUgKGggPj0gMCkge1xuICAgICAgaWYgKHJlc3VsdC5tYXhSb3coaCkgPT09IDApIHtcbiAgICAgICAgaC0tO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IHAgPSAwO1xuICAgICAgICBsZXQgcGl2b3QgPSBmYWxzZTtcbiAgICAgICAgd2hpbGUgKHAgPCBuICYmIHBpdm90ID09PSBmYWxzZSkge1xuICAgICAgICAgIGlmIChyZXN1bHQuZ2V0KGgsIHApID09PSAxKSB7XG4gICAgICAgICAgICBwaXZvdCA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHArKztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoOyBpKyspIHtcbiAgICAgICAgICBsZXQgZmFjdG9yID0gcmVzdWx0LmdldChpLCBwKTtcbiAgICAgICAgICBmb3IgKGxldCBqID0gcDsgaiA8IG07IGorKykge1xuICAgICAgICAgICAgbGV0IHRtcCA9IHJlc3VsdC5nZXQoaSwgaikgLSBmYWN0b3IgKiByZXN1bHQuZ2V0KGgsIGopO1xuICAgICAgICAgICAgcmVzdWx0LnNldChpLCBqLCB0bXApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBoLS07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBzZXQoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzZXQgbWV0aG9kIGlzIHVuaW1wbGVtZW50ZWQnKTtcbiAgfVxuXG4gIGdldCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2dldCBtZXRob2QgaXMgdW5pbXBsZW1lbnRlZCcpO1xuICB9XG5cbiAgcmVwZWF0KG9wdGlvbnMgPSB7fSkge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucyAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QnKTtcbiAgICB9XG4gICAgY29uc3QgeyByb3dzID0gMSwgY29sdW1ucyA9IDEgfSA9IG9wdGlvbnM7XG4gICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHJvd3MpIHx8IHJvd3MgPD0gMCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncm93cyBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlcicpO1xuICAgIH1cbiAgICBpZiAoIU51bWJlci5pc0ludGVnZXIoY29sdW1ucykgfHwgY29sdW1ucyA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdjb2x1bW5zIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyJyk7XG4gICAgfVxuICAgIGxldCBtYXRyaXggPSBuZXcgTWF0cml4KHRoaXMucm93cyAqIHJvd3MsIHRoaXMuY29sdW1ucyAqIGNvbHVtbnMpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm93czsgaSsrKSB7XG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGNvbHVtbnM7IGorKykge1xuICAgICAgICBtYXRyaXguc2V0U3ViTWF0cml4KHRoaXMsIHRoaXMucm93cyAqIGksIHRoaXMuY29sdW1ucyAqIGopO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbWF0cml4O1xuICB9XG5cbiAgZmlsbCh2YWx1ZSkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5yb3dzOyBpKyspIHtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5jb2x1bW5zOyBqKyspIHtcbiAgICAgICAgdGhpcy5zZXQoaSwgaiwgdmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIG5lZygpIHtcbiAgICByZXR1cm4gdGhpcy5tdWxTKC0xKTtcbiAgfVxuXG4gIGdldFJvdyhpbmRleCkge1xuICAgIGNoZWNrUm93SW5kZXgodGhpcywgaW5kZXgpO1xuICAgIGxldCByb3cgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY29sdW1uczsgaSsrKSB7XG4gICAgICByb3cucHVzaCh0aGlzLmdldChpbmRleCwgaSkpO1xuICAgIH1cbiAgICByZXR1cm4gcm93O1xuICB9XG5cbiAgZ2V0Um93VmVjdG9yKGluZGV4KSB7XG4gICAgcmV0dXJuIE1hdHJpeC5yb3dWZWN0b3IodGhpcy5nZXRSb3coaW5kZXgpKTtcbiAgfVxuXG4gIHNldFJvdyhpbmRleCwgYXJyYXkpIHtcbiAgICBjaGVja1Jvd0luZGV4KHRoaXMsIGluZGV4KTtcbiAgICBhcnJheSA9IGNoZWNrUm93VmVjdG9yKHRoaXMsIGFycmF5KTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY29sdW1uczsgaSsrKSB7XG4gICAgICB0aGlzLnNldChpbmRleCwgaSwgYXJyYXlbaV0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHN3YXBSb3dzKHJvdzEsIHJvdzIpIHtcbiAgICBjaGVja1Jvd0luZGV4KHRoaXMsIHJvdzEpO1xuICAgIGNoZWNrUm93SW5kZXgodGhpcywgcm93Mik7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNvbHVtbnM7IGkrKykge1xuICAgICAgbGV0IHRlbXAgPSB0aGlzLmdldChyb3cxLCBpKTtcbiAgICAgIHRoaXMuc2V0KHJvdzEsIGksIHRoaXMuZ2V0KHJvdzIsIGkpKTtcbiAgICAgIHRoaXMuc2V0KHJvdzIsIGksIHRlbXApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGdldENvbHVtbihpbmRleCkge1xuICAgIGNoZWNrQ29sdW1uSW5kZXgodGhpcywgaW5kZXgpO1xuICAgIGxldCBjb2x1bW4gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucm93czsgaSsrKSB7XG4gICAgICBjb2x1bW4ucHVzaCh0aGlzLmdldChpLCBpbmRleCkpO1xuICAgIH1cbiAgICByZXR1cm4gY29sdW1uO1xuICB9XG5cbiAgZ2V0Q29sdW1uVmVjdG9yKGluZGV4KSB7XG4gICAgcmV0dXJuIE1hdHJpeC5jb2x1bW5WZWN0b3IodGhpcy5nZXRDb2x1bW4oaW5kZXgpKTtcbiAgfVxuXG4gIHNldENvbHVtbihpbmRleCwgYXJyYXkpIHtcbiAgICBjaGVja0NvbHVtbkluZGV4KHRoaXMsIGluZGV4KTtcbiAgICBhcnJheSA9IGNoZWNrQ29sdW1uVmVjdG9yKHRoaXMsIGFycmF5KTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucm93czsgaSsrKSB7XG4gICAgICB0aGlzLnNldChpLCBpbmRleCwgYXJyYXlbaV0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHN3YXBDb2x1bW5zKGNvbHVtbjEsIGNvbHVtbjIpIHtcbiAgICBjaGVja0NvbHVtbkluZGV4KHRoaXMsIGNvbHVtbjEpO1xuICAgIGNoZWNrQ29sdW1uSW5kZXgodGhpcywgY29sdW1uMik7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnJvd3M7IGkrKykge1xuICAgICAgbGV0IHRlbXAgPSB0aGlzLmdldChpLCBjb2x1bW4xKTtcbiAgICAgIHRoaXMuc2V0KGksIGNvbHVtbjEsIHRoaXMuZ2V0KGksIGNvbHVtbjIpKTtcbiAgICAgIHRoaXMuc2V0KGksIGNvbHVtbjIsIHRlbXApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGFkZFJvd1ZlY3Rvcih2ZWN0b3IpIHtcbiAgICB2ZWN0b3IgPSBjaGVja1Jvd1ZlY3Rvcih0aGlzLCB2ZWN0b3IpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5yb3dzOyBpKyspIHtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5jb2x1bW5zOyBqKyspIHtcbiAgICAgICAgdGhpcy5zZXQoaSwgaiwgdGhpcy5nZXQoaSwgaikgKyB2ZWN0b3Jbal0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHN1YlJvd1ZlY3Rvcih2ZWN0b3IpIHtcbiAgICB2ZWN0b3IgPSBjaGVja1Jvd1ZlY3Rvcih0aGlzLCB2ZWN0b3IpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5yb3dzOyBpKyspIHtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5jb2x1bW5zOyBqKyspIHtcbiAgICAgICAgdGhpcy5zZXQoaSwgaiwgdGhpcy5nZXQoaSwgaikgLSB2ZWN0b3Jbal0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIG11bFJvd1ZlY3Rvcih2ZWN0b3IpIHtcbiAgICB2ZWN0b3IgPSBjaGVja1Jvd1ZlY3Rvcih0aGlzLCB2ZWN0b3IpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5yb3dzOyBpKyspIHtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5jb2x1bW5zOyBqKyspIHtcbiAgICAgICAgdGhpcy5zZXQoaSwgaiwgdGhpcy5nZXQoaSwgaikgKiB2ZWN0b3Jbal0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGRpdlJvd1ZlY3Rvcih2ZWN0b3IpIHtcbiAgICB2ZWN0b3IgPSBjaGVja1Jvd1ZlY3Rvcih0aGlzLCB2ZWN0b3IpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5yb3dzOyBpKyspIHtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5jb2x1bW5zOyBqKyspIHtcbiAgICAgICAgdGhpcy5zZXQoaSwgaiwgdGhpcy5nZXQoaSwgaikgLyB2ZWN0b3Jbal0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGFkZENvbHVtblZlY3Rvcih2ZWN0b3IpIHtcbiAgICB2ZWN0b3IgPSBjaGVja0NvbHVtblZlY3Rvcih0aGlzLCB2ZWN0b3IpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5yb3dzOyBpKyspIHtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5jb2x1bW5zOyBqKyspIHtcbiAgICAgICAgdGhpcy5zZXQoaSwgaiwgdGhpcy5nZXQoaSwgaikgKyB2ZWN0b3JbaV0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHN1YkNvbHVtblZlY3Rvcih2ZWN0b3IpIHtcbiAgICB2ZWN0b3IgPSBjaGVja0NvbHVtblZlY3Rvcih0aGlzLCB2ZWN0b3IpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5yb3dzOyBpKyspIHtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5jb2x1bW5zOyBqKyspIHtcbiAgICAgICAgdGhpcy5zZXQoaSwgaiwgdGhpcy5nZXQoaSwgaikgLSB2ZWN0b3JbaV0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIG11bENvbHVtblZlY3Rvcih2ZWN0b3IpIHtcbiAgICB2ZWN0b3IgPSBjaGVja0NvbHVtblZlY3Rvcih0aGlzLCB2ZWN0b3IpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5yb3dzOyBpKyspIHtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5jb2x1bW5zOyBqKyspIHtcbiAgICAgICAgdGhpcy5zZXQoaSwgaiwgdGhpcy5nZXQoaSwgaikgKiB2ZWN0b3JbaV0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGRpdkNvbHVtblZlY3Rvcih2ZWN0b3IpIHtcbiAgICB2ZWN0b3IgPSBjaGVja0NvbHVtblZlY3Rvcih0aGlzLCB2ZWN0b3IpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5yb3dzOyBpKyspIHtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5jb2x1bW5zOyBqKyspIHtcbiAgICAgICAgdGhpcy5zZXQoaSwgaiwgdGhpcy5nZXQoaSwgaikgLyB2ZWN0b3JbaV0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIG11bFJvdyhpbmRleCwgdmFsdWUpIHtcbiAgICBjaGVja1Jvd0luZGV4KHRoaXMsIGluZGV4KTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY29sdW1uczsgaSsrKSB7XG4gICAgICB0aGlzLnNldChpbmRleCwgaSwgdGhpcy5nZXQoaW5kZXgsIGkpICogdmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIG11bENvbHVtbihpbmRleCwgdmFsdWUpIHtcbiAgICBjaGVja0NvbHVtbkluZGV4KHRoaXMsIGluZGV4KTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucm93czsgaSsrKSB7XG4gICAgICB0aGlzLnNldChpLCBpbmRleCwgdGhpcy5nZXQoaSwgaW5kZXgpICogdmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIG1heCgpIHtcbiAgICBpZiAodGhpcy5pc0VtcHR5KCkpIHtcbiAgICAgIHJldHVybiBOYU47XG4gICAgfVxuICAgIGxldCB2ID0gdGhpcy5nZXQoMCwgMCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnJvd3M7IGkrKykge1xuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB0aGlzLmNvbHVtbnM7IGorKykge1xuICAgICAgICBpZiAodGhpcy5nZXQoaSwgaikgPiB2KSB7XG4gICAgICAgICAgdiA9IHRoaXMuZ2V0KGksIGopO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2O1xuICB9XG5cbiAgbWF4SW5kZXgoKSB7XG4gICAgY2hlY2tOb25FbXB0eSh0aGlzKTtcbiAgICBsZXQgdiA9IHRoaXMuZ2V0KDAsIDApO1xuICAgIGxldCBpZHggPSBbMCwgMF07XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnJvd3M7IGkrKykge1xuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB0aGlzLmNvbHVtbnM7IGorKykge1xuICAgICAgICBpZiAodGhpcy5nZXQoaSwgaikgPiB2KSB7XG4gICAgICAgICAgdiA9IHRoaXMuZ2V0KGksIGopO1xuICAgICAgICAgIGlkeFswXSA9IGk7XG4gICAgICAgICAgaWR4WzFdID0gajtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaWR4O1xuICB9XG5cbiAgbWluKCkge1xuICAgIGlmICh0aGlzLmlzRW1wdHkoKSkge1xuICAgICAgcmV0dXJuIE5hTjtcbiAgICB9XG4gICAgbGV0IHYgPSB0aGlzLmdldCgwLCAwKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucm93czsgaSsrKSB7XG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRoaXMuY29sdW1uczsgaisrKSB7XG4gICAgICAgIGlmICh0aGlzLmdldChpLCBqKSA8IHYpIHtcbiAgICAgICAgICB2ID0gdGhpcy5nZXQoaSwgaik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHY7XG4gIH1cblxuICBtaW5JbmRleCgpIHtcbiAgICBjaGVja05vbkVtcHR5KHRoaXMpO1xuICAgIGxldCB2ID0gdGhpcy5nZXQoMCwgMCk7XG4gICAgbGV0IGlkeCA9IFswLCAwXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucm93czsgaSsrKSB7XG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRoaXMuY29sdW1uczsgaisrKSB7XG4gICAgICAgIGlmICh0aGlzLmdldChpLCBqKSA8IHYpIHtcbiAgICAgICAgICB2ID0gdGhpcy5nZXQoaSwgaik7XG4gICAgICAgICAgaWR4WzBdID0gaTtcbiAgICAgICAgICBpZHhbMV0gPSBqO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBpZHg7XG4gIH1cblxuICBtYXhSb3cocm93KSB7XG4gICAgY2hlY2tSb3dJbmRleCh0aGlzLCByb3cpO1xuICAgIGlmICh0aGlzLmlzRW1wdHkoKSkge1xuICAgICAgcmV0dXJuIE5hTjtcbiAgICB9XG4gICAgbGV0IHYgPSB0aGlzLmdldChyb3csIDApO1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgdGhpcy5jb2x1bW5zOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLmdldChyb3csIGkpID4gdikge1xuICAgICAgICB2ID0gdGhpcy5nZXQocm93LCBpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHY7XG4gIH1cblxuICBtYXhSb3dJbmRleChyb3cpIHtcbiAgICBjaGVja1Jvd0luZGV4KHRoaXMsIHJvdyk7XG4gICAgY2hlY2tOb25FbXB0eSh0aGlzKTtcbiAgICBsZXQgdiA9IHRoaXMuZ2V0KHJvdywgMCk7XG4gICAgbGV0IGlkeCA9IFtyb3csIDBdO1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgdGhpcy5jb2x1bW5zOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLmdldChyb3csIGkpID4gdikge1xuICAgICAgICB2ID0gdGhpcy5nZXQocm93LCBpKTtcbiAgICAgICAgaWR4WzFdID0gaTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGlkeDtcbiAgfVxuXG4gIG1pblJvdyhyb3cpIHtcbiAgICBjaGVja1Jvd0luZGV4KHRoaXMsIHJvdyk7XG4gICAgaWYgKHRoaXMuaXNFbXB0eSgpKSB7XG4gICAgICByZXR1cm4gTmFOO1xuICAgIH1cbiAgICBsZXQgdiA9IHRoaXMuZ2V0KHJvdywgMCk7XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCB0aGlzLmNvbHVtbnM7IGkrKykge1xuICAgICAgaWYgKHRoaXMuZ2V0KHJvdywgaSkgPCB2KSB7XG4gICAgICAgIHYgPSB0aGlzLmdldChyb3csIGkpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdjtcbiAgfVxuXG4gIG1pblJvd0luZGV4KHJvdykge1xuICAgIGNoZWNrUm93SW5kZXgodGhpcywgcm93KTtcbiAgICBjaGVja05vbkVtcHR5KHRoaXMpO1xuICAgIGxldCB2ID0gdGhpcy5nZXQocm93LCAwKTtcbiAgICBsZXQgaWR4ID0gW3JvdywgMF07XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCB0aGlzLmNvbHVtbnM7IGkrKykge1xuICAgICAgaWYgKHRoaXMuZ2V0KHJvdywgaSkgPCB2KSB7XG4gICAgICAgIHYgPSB0aGlzLmdldChyb3csIGkpO1xuICAgICAgICBpZHhbMV0gPSBpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaWR4O1xuICB9XG5cbiAgbWF4Q29sdW1uKGNvbHVtbikge1xuICAgIGNoZWNrQ29sdW1uSW5kZXgodGhpcywgY29sdW1uKTtcbiAgICBpZiAodGhpcy5pc0VtcHR5KCkpIHtcbiAgICAgIHJldHVybiBOYU47XG4gICAgfVxuICAgIGxldCB2ID0gdGhpcy5nZXQoMCwgY29sdW1uKTtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IHRoaXMucm93czsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5nZXQoaSwgY29sdW1uKSA+IHYpIHtcbiAgICAgICAgdiA9IHRoaXMuZ2V0KGksIGNvbHVtbik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2O1xuICB9XG5cbiAgbWF4Q29sdW1uSW5kZXgoY29sdW1uKSB7XG4gICAgY2hlY2tDb2x1bW5JbmRleCh0aGlzLCBjb2x1bW4pO1xuICAgIGNoZWNrTm9uRW1wdHkodGhpcyk7XG4gICAgbGV0IHYgPSB0aGlzLmdldCgwLCBjb2x1bW4pO1xuICAgIGxldCBpZHggPSBbMCwgY29sdW1uXTtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IHRoaXMucm93czsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5nZXQoaSwgY29sdW1uKSA+IHYpIHtcbiAgICAgICAgdiA9IHRoaXMuZ2V0KGksIGNvbHVtbik7XG4gICAgICAgIGlkeFswXSA9IGk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBpZHg7XG4gIH1cblxuICBtaW5Db2x1bW4oY29sdW1uKSB7XG4gICAgY2hlY2tDb2x1bW5JbmRleCh0aGlzLCBjb2x1bW4pO1xuICAgIGlmICh0aGlzLmlzRW1wdHkoKSkge1xuICAgICAgcmV0dXJuIE5hTjtcbiAgICB9XG4gICAgbGV0IHYgPSB0aGlzLmdldCgwLCBjb2x1bW4pO1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgdGhpcy5yb3dzOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLmdldChpLCBjb2x1bW4pIDwgdikge1xuICAgICAgICB2ID0gdGhpcy5nZXQoaSwgY29sdW1uKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHY7XG4gIH1cblxuICBtaW5Db2x1bW5JbmRleChjb2x1bW4pIHtcbiAgICBjaGVja0NvbHVtbkluZGV4KHRoaXMsIGNvbHVtbik7XG4gICAgY2hlY2tOb25FbXB0eSh0aGlzKTtcbiAgICBsZXQgdiA9IHRoaXMuZ2V0KDAsIGNvbHVtbik7XG4gICAgbGV0IGlkeCA9IFswLCBjb2x1bW5dO1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgdGhpcy5yb3dzOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLmdldChpLCBjb2x1bW4pIDwgdikge1xuICAgICAgICB2ID0gdGhpcy5nZXQoaSwgY29sdW1uKTtcbiAgICAgICAgaWR4WzBdID0gaTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGlkeDtcbiAgfVxuXG4gIGRpYWcoKSB7XG4gICAgbGV0IG1pbiA9IE1hdGgubWluKHRoaXMucm93cywgdGhpcy5jb2x1bW5zKTtcbiAgICBsZXQgZGlhZyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWluOyBpKyspIHtcbiAgICAgIGRpYWcucHVzaCh0aGlzLmdldChpLCBpKSk7XG4gICAgfVxuICAgIHJldHVybiBkaWFnO1xuICB9XG5cbiAgbm9ybSh0eXBlID0gJ2Zyb2Jlbml1cycpIHtcbiAgICBsZXQgcmVzdWx0ID0gMDtcbiAgICBpZiAodHlwZSA9PT0gJ21heCcpIHtcbiAgICAgIHJldHVybiB0aGlzLm1heCgpO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2Zyb2Jlbml1cycpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5yb3dzOyBpKyspIHtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB0aGlzLmNvbHVtbnM7IGorKykge1xuICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIHRoaXMuZ2V0KGksIGopICogdGhpcy5nZXQoaSwgaik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBNYXRoLnNxcnQocmVzdWx0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYHVua25vd24gbm9ybSB0eXBlOiAke3R5cGV9YCk7XG4gICAgfVxuICB9XG5cbiAgY3VtdWxhdGl2ZVN1bSgpIHtcbiAgICBsZXQgc3VtID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucm93czsgaSsrKSB7XG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRoaXMuY29sdW1uczsgaisrKSB7XG4gICAgICAgIHN1bSArPSB0aGlzLmdldChpLCBqKTtcbiAgICAgICAgdGhpcy5zZXQoaSwgaiwgc3VtKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBkb3QodmVjdG9yMikge1xuICAgIGlmIChBYnN0cmFjdE1hdHJpeC5pc01hdHJpeCh2ZWN0b3IyKSkgdmVjdG9yMiA9IHZlY3RvcjIudG8xREFycmF5KCk7XG4gICAgbGV0IHZlY3RvcjEgPSB0aGlzLnRvMURBcnJheSgpO1xuICAgIGlmICh2ZWN0b3IxLmxlbmd0aCAhPT0gdmVjdG9yMi5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCd2ZWN0b3JzIGRvIG5vdCBoYXZlIHRoZSBzYW1lIHNpemUnKTtcbiAgICB9XG4gICAgbGV0IGRvdCA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2ZWN0b3IxLmxlbmd0aDsgaSsrKSB7XG4gICAgICBkb3QgKz0gdmVjdG9yMVtpXSAqIHZlY3RvcjJbaV07XG4gICAgfVxuICAgIHJldHVybiBkb3Q7XG4gIH1cblxuICBtbXVsKG90aGVyKSB7XG4gICAgb3RoZXIgPSBNYXRyaXguY2hlY2tNYXRyaXgob3RoZXIpO1xuXG4gICAgbGV0IG0gPSB0aGlzLnJvd3M7XG4gICAgbGV0IG4gPSB0aGlzLmNvbHVtbnM7XG4gICAgbGV0IHAgPSBvdGhlci5jb2x1bW5zO1xuXG4gICAgbGV0IHJlc3VsdCA9IG5ldyBNYXRyaXgobSwgcCk7XG5cbiAgICBsZXQgQmNvbGogPSBuZXcgRmxvYXQ2NEFycmF5KG4pO1xuICAgIGZvciAobGV0IGogPSAwOyBqIDwgcDsgaisrKSB7XG4gICAgICBmb3IgKGxldCBrID0gMDsgayA8IG47IGsrKykge1xuICAgICAgICBCY29saltrXSA9IG90aGVyLmdldChrLCBqKTtcbiAgICAgIH1cblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtOyBpKyspIHtcbiAgICAgICAgbGV0IHMgPSAwO1xuICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IG47IGsrKykge1xuICAgICAgICAgIHMgKz0gdGhpcy5nZXQoaSwgaykgKiBCY29saltrXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlc3VsdC5zZXQoaSwgaiwgcyk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBzdHJhc3NlbjJ4MihvdGhlcikge1xuICAgIG90aGVyID0gTWF0cml4LmNoZWNrTWF0cml4KG90aGVyKTtcbiAgICBsZXQgcmVzdWx0ID0gbmV3IE1hdHJpeCgyLCAyKTtcbiAgICBjb25zdCBhMTEgPSB0aGlzLmdldCgwLCAwKTtcbiAgICBjb25zdCBiMTEgPSBvdGhlci5nZXQoMCwgMCk7XG4gICAgY29uc3QgYTEyID0gdGhpcy5nZXQoMCwgMSk7XG4gICAgY29uc3QgYjEyID0gb3RoZXIuZ2V0KDAsIDEpO1xuICAgIGNvbnN0IGEyMSA9IHRoaXMuZ2V0KDEsIDApO1xuICAgIGNvbnN0IGIyMSA9IG90aGVyLmdldCgxLCAwKTtcbiAgICBjb25zdCBhMjIgPSB0aGlzLmdldCgxLCAxKTtcbiAgICBjb25zdCBiMjIgPSBvdGhlci5nZXQoMSwgMSk7XG5cbiAgICAvLyBDb21wdXRlIGludGVybWVkaWF0ZSB2YWx1ZXMuXG4gICAgY29uc3QgbTEgPSAoYTExICsgYTIyKSAqIChiMTEgKyBiMjIpO1xuICAgIGNvbnN0IG0yID0gKGEyMSArIGEyMikgKiBiMTE7XG4gICAgY29uc3QgbTMgPSBhMTEgKiAoYjEyIC0gYjIyKTtcbiAgICBjb25zdCBtNCA9IGEyMiAqIChiMjEgLSBiMTEpO1xuICAgIGNvbnN0IG01ID0gKGExMSArIGExMikgKiBiMjI7XG4gICAgY29uc3QgbTYgPSAoYTIxIC0gYTExKSAqIChiMTEgKyBiMTIpO1xuICAgIGNvbnN0IG03ID0gKGExMiAtIGEyMikgKiAoYjIxICsgYjIyKTtcblxuICAgIC8vIENvbWJpbmUgaW50ZXJtZWRpYXRlIHZhbHVlcyBpbnRvIHRoZSBvdXRwdXQuXG4gICAgY29uc3QgYzAwID0gbTEgKyBtNCAtIG01ICsgbTc7XG4gICAgY29uc3QgYzAxID0gbTMgKyBtNTtcbiAgICBjb25zdCBjMTAgPSBtMiArIG00O1xuICAgIGNvbnN0IGMxMSA9IG0xIC0gbTIgKyBtMyArIG02O1xuXG4gICAgcmVzdWx0LnNldCgwLCAwLCBjMDApO1xuICAgIHJlc3VsdC5zZXQoMCwgMSwgYzAxKTtcbiAgICByZXN1bHQuc2V0KDEsIDAsIGMxMCk7XG4gICAgcmVzdWx0LnNldCgxLCAxLCBjMTEpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBzdHJhc3NlbjN4MyhvdGhlcikge1xuICAgIG90aGVyID0gTWF0cml4LmNoZWNrTWF0cml4KG90aGVyKTtcbiAgICBsZXQgcmVzdWx0ID0gbmV3IE1hdHJpeCgzLCAzKTtcblxuICAgIGNvbnN0IGEwMCA9IHRoaXMuZ2V0KDAsIDApO1xuICAgIGNvbnN0IGEwMSA9IHRoaXMuZ2V0KDAsIDEpO1xuICAgIGNvbnN0IGEwMiA9IHRoaXMuZ2V0KDAsIDIpO1xuICAgIGNvbnN0IGExMCA9IHRoaXMuZ2V0KDEsIDApO1xuICAgIGNvbnN0IGExMSA9IHRoaXMuZ2V0KDEsIDEpO1xuICAgIGNvbnN0IGExMiA9IHRoaXMuZ2V0KDEsIDIpO1xuICAgIGNvbnN0IGEyMCA9IHRoaXMuZ2V0KDIsIDApO1xuICAgIGNvbnN0IGEyMSA9IHRoaXMuZ2V0KDIsIDEpO1xuICAgIGNvbnN0IGEyMiA9IHRoaXMuZ2V0KDIsIDIpO1xuXG4gICAgY29uc3QgYjAwID0gb3RoZXIuZ2V0KDAsIDApO1xuICAgIGNvbnN0IGIwMSA9IG90aGVyLmdldCgwLCAxKTtcbiAgICBjb25zdCBiMDIgPSBvdGhlci5nZXQoMCwgMik7XG4gICAgY29uc3QgYjEwID0gb3RoZXIuZ2V0KDEsIDApO1xuICAgIGNvbnN0IGIxMSA9IG90aGVyLmdldCgxLCAxKTtcbiAgICBjb25zdCBiMTIgPSBvdGhlci5nZXQoMSwgMik7XG4gICAgY29uc3QgYjIwID0gb3RoZXIuZ2V0KDIsIDApO1xuICAgIGNvbnN0IGIyMSA9IG90aGVyLmdldCgyLCAxKTtcbiAgICBjb25zdCBiMjIgPSBvdGhlci5nZXQoMiwgMik7XG5cbiAgICBjb25zdCBtMSA9IChhMDAgKyBhMDEgKyBhMDIgLSBhMTAgLSBhMTEgLSBhMjEgLSBhMjIpICogYjExO1xuICAgIGNvbnN0IG0yID0gKGEwMCAtIGExMCkgKiAoLWIwMSArIGIxMSk7XG4gICAgY29uc3QgbTMgPSBhMTEgKiAoLWIwMCArIGIwMSArIGIxMCAtIGIxMSAtIGIxMiAtIGIyMCArIGIyMik7XG4gICAgY29uc3QgbTQgPSAoLWEwMCArIGExMCArIGExMSkgKiAoYjAwIC0gYjAxICsgYjExKTtcbiAgICBjb25zdCBtNSA9IChhMTAgKyBhMTEpICogKC1iMDAgKyBiMDEpO1xuICAgIGNvbnN0IG02ID0gYTAwICogYjAwO1xuICAgIGNvbnN0IG03ID0gKC1hMDAgKyBhMjAgKyBhMjEpICogKGIwMCAtIGIwMiArIGIxMik7XG4gICAgY29uc3QgbTggPSAoLWEwMCArIGEyMCkgKiAoYjAyIC0gYjEyKTtcbiAgICBjb25zdCBtOSA9IChhMjAgKyBhMjEpICogKC1iMDAgKyBiMDIpO1xuICAgIGNvbnN0IG0xMCA9IChhMDAgKyBhMDEgKyBhMDIgLSBhMTEgLSBhMTIgLSBhMjAgLSBhMjEpICogYjEyO1xuICAgIGNvbnN0IG0xMSA9IGEyMSAqICgtYjAwICsgYjAyICsgYjEwIC0gYjExIC0gYjEyIC0gYjIwICsgYjIxKTtcbiAgICBjb25zdCBtMTIgPSAoLWEwMiArIGEyMSArIGEyMikgKiAoYjExICsgYjIwIC0gYjIxKTtcbiAgICBjb25zdCBtMTMgPSAoYTAyIC0gYTIyKSAqIChiMTEgLSBiMjEpO1xuICAgIGNvbnN0IG0xNCA9IGEwMiAqIGIyMDtcbiAgICBjb25zdCBtMTUgPSAoYTIxICsgYTIyKSAqICgtYjIwICsgYjIxKTtcbiAgICBjb25zdCBtMTYgPSAoLWEwMiArIGExMSArIGExMikgKiAoYjEyICsgYjIwIC0gYjIyKTtcbiAgICBjb25zdCBtMTcgPSAoYTAyIC0gYTEyKSAqIChiMTIgLSBiMjIpO1xuICAgIGNvbnN0IG0xOCA9IChhMTEgKyBhMTIpICogKC1iMjAgKyBiMjIpO1xuICAgIGNvbnN0IG0xOSA9IGEwMSAqIGIxMDtcbiAgICBjb25zdCBtMjAgPSBhMTIgKiBiMjE7XG4gICAgY29uc3QgbTIxID0gYTEwICogYjAyO1xuICAgIGNvbnN0IG0yMiA9IGEyMCAqIGIwMTtcbiAgICBjb25zdCBtMjMgPSBhMjIgKiBiMjI7XG5cbiAgICBjb25zdCBjMDAgPSBtNiArIG0xNCArIG0xOTtcbiAgICBjb25zdCBjMDEgPSBtMSArIG00ICsgbTUgKyBtNiArIG0xMiArIG0xNCArIG0xNTtcbiAgICBjb25zdCBjMDIgPSBtNiArIG03ICsgbTkgKyBtMTAgKyBtMTQgKyBtMTYgKyBtMTg7XG4gICAgY29uc3QgYzEwID0gbTIgKyBtMyArIG00ICsgbTYgKyBtMTQgKyBtMTYgKyBtMTc7XG4gICAgY29uc3QgYzExID0gbTIgKyBtNCArIG01ICsgbTYgKyBtMjA7XG4gICAgY29uc3QgYzEyID0gbTE0ICsgbTE2ICsgbTE3ICsgbTE4ICsgbTIxO1xuICAgIGNvbnN0IGMyMCA9IG02ICsgbTcgKyBtOCArIG0xMSArIG0xMiArIG0xMyArIG0xNDtcbiAgICBjb25zdCBjMjEgPSBtMTIgKyBtMTMgKyBtMTQgKyBtMTUgKyBtMjI7XG4gICAgY29uc3QgYzIyID0gbTYgKyBtNyArIG04ICsgbTkgKyBtMjM7XG5cbiAgICByZXN1bHQuc2V0KDAsIDAsIGMwMCk7XG4gICAgcmVzdWx0LnNldCgwLCAxLCBjMDEpO1xuICAgIHJlc3VsdC5zZXQoMCwgMiwgYzAyKTtcbiAgICByZXN1bHQuc2V0KDEsIDAsIGMxMCk7XG4gICAgcmVzdWx0LnNldCgxLCAxLCBjMTEpO1xuICAgIHJlc3VsdC5zZXQoMSwgMiwgYzEyKTtcbiAgICByZXN1bHQuc2V0KDIsIDAsIGMyMCk7XG4gICAgcmVzdWx0LnNldCgyLCAxLCBjMjEpO1xuICAgIHJlc3VsdC5zZXQoMiwgMiwgYzIyKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgbW11bFN0cmFzc2VuKHkpIHtcbiAgICB5ID0gTWF0cml4LmNoZWNrTWF0cml4KHkpO1xuICAgIGxldCB4ID0gdGhpcy5jbG9uZSgpO1xuICAgIGxldCByMSA9IHgucm93cztcbiAgICBsZXQgYzEgPSB4LmNvbHVtbnM7XG4gICAgbGV0IHIyID0geS5yb3dzO1xuICAgIGxldCBjMiA9IHkuY29sdW1ucztcbiAgICBpZiAoYzEgIT09IHIyKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgTXVsdGlwbHlpbmcgJHtyMX0geCAke2MxfSBhbmQgJHtyMn0geCAke2MyfSBtYXRyaXg6IGRpbWVuc2lvbnMgZG8gbm90IG1hdGNoLmAsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFB1dCBhIG1hdHJpeCBpbnRvIHRoZSB0b3AgbGVmdCBvZiBhIG1hdHJpeCBvZiB6ZXJvcy5cbiAgICAvLyBgcm93c2AgYW5kIGBjb2xzYCBhcmUgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIG91dHB1dCBtYXRyaXguXG4gICAgZnVuY3Rpb24gZW1iZWQobWF0LCByb3dzLCBjb2xzKSB7XG4gICAgICBsZXQgciA9IG1hdC5yb3dzO1xuICAgICAgbGV0IGMgPSBtYXQuY29sdW1ucztcbiAgICAgIGlmIChyID09PSByb3dzICYmIGMgPT09IGNvbHMpIHtcbiAgICAgICAgcmV0dXJuIG1hdDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCByZXN1bHRhdCA9IEFic3RyYWN0TWF0cml4Lnplcm9zKHJvd3MsIGNvbHMpO1xuICAgICAgICByZXN1bHRhdCA9IHJlc3VsdGF0LnNldFN1Yk1hdHJpeChtYXQsIDAsIDApO1xuICAgICAgICByZXR1cm4gcmVzdWx0YXQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTWFrZSBzdXJlIGJvdGggbWF0cmljZXMgYXJlIHRoZSBzYW1lIHNpemUuXG4gICAgLy8gVGhpcyBpcyBleGNsdXNpdmVseSBmb3Igc2ltcGxpY2l0eTpcbiAgICAvLyB0aGlzIGFsZ29yaXRobSBjYW4gYmUgaW1wbGVtZW50ZWQgd2l0aCBtYXRyaWNlcyBvZiBkaWZmZXJlbnQgc2l6ZXMuXG5cbiAgICBsZXQgciA9IE1hdGgubWF4KHIxLCByMik7XG4gICAgbGV0IGMgPSBNYXRoLm1heChjMSwgYzIpO1xuICAgIHggPSBlbWJlZCh4LCByLCBjKTtcbiAgICB5ID0gZW1iZWQoeSwgciwgYyk7XG5cbiAgICAvLyBPdXIgcmVjdXJzaXZlIG11bHRpcGxpY2F0aW9uIGZ1bmN0aW9uLlxuICAgIGZ1bmN0aW9uIGJsb2NrTXVsdChhLCBiLCByb3dzLCBjb2xzKSB7XG4gICAgICAvLyBGb3Igc21hbGwgbWF0cmljZXMsIHJlc29ydCB0byBuYWl2ZSBtdWx0aXBsaWNhdGlvbi5cbiAgICAgIGlmIChyb3dzIDw9IDUxMiB8fCBjb2xzIDw9IDUxMikge1xuICAgICAgICByZXR1cm4gYS5tbXVsKGIpOyAvLyBhIGlzIGVxdWl2YWxlbnQgdG8gdGhpc1xuICAgICAgfVxuXG4gICAgICAvLyBBcHBseSBkeW5hbWljIHBhZGRpbmcuXG4gICAgICBpZiAocm93cyAlIDIgPT09IDEgJiYgY29scyAlIDIgPT09IDEpIHtcbiAgICAgICAgYSA9IGVtYmVkKGEsIHJvd3MgKyAxLCBjb2xzICsgMSk7XG4gICAgICAgIGIgPSBlbWJlZChiLCByb3dzICsgMSwgY29scyArIDEpO1xuICAgICAgfSBlbHNlIGlmIChyb3dzICUgMiA9PT0gMSkge1xuICAgICAgICBhID0gZW1iZWQoYSwgcm93cyArIDEsIGNvbHMpO1xuICAgICAgICBiID0gZW1iZWQoYiwgcm93cyArIDEsIGNvbHMpO1xuICAgICAgfSBlbHNlIGlmIChjb2xzICUgMiA9PT0gMSkge1xuICAgICAgICBhID0gZW1iZWQoYSwgcm93cywgY29scyArIDEpO1xuICAgICAgICBiID0gZW1iZWQoYiwgcm93cywgY29scyArIDEpO1xuICAgICAgfVxuXG4gICAgICBsZXQgaGFsZlJvd3MgPSBwYXJzZUludChhLnJvd3MgLyAyLCAxMCk7XG4gICAgICBsZXQgaGFsZkNvbHMgPSBwYXJzZUludChhLmNvbHVtbnMgLyAyLCAxMCk7XG4gICAgICAvLyBTdWJkaXZpZGUgaW5wdXQgbWF0cmljZXMuXG4gICAgICBsZXQgYTExID0gYS5zdWJNYXRyaXgoMCwgaGFsZlJvd3MgLSAxLCAwLCBoYWxmQ29scyAtIDEpO1xuICAgICAgbGV0IGIxMSA9IGIuc3ViTWF0cml4KDAsIGhhbGZSb3dzIC0gMSwgMCwgaGFsZkNvbHMgLSAxKTtcblxuICAgICAgbGV0IGExMiA9IGEuc3ViTWF0cml4KDAsIGhhbGZSb3dzIC0gMSwgaGFsZkNvbHMsIGEuY29sdW1ucyAtIDEpO1xuICAgICAgbGV0IGIxMiA9IGIuc3ViTWF0cml4KDAsIGhhbGZSb3dzIC0gMSwgaGFsZkNvbHMsIGIuY29sdW1ucyAtIDEpO1xuXG4gICAgICBsZXQgYTIxID0gYS5zdWJNYXRyaXgoaGFsZlJvd3MsIGEucm93cyAtIDEsIDAsIGhhbGZDb2xzIC0gMSk7XG4gICAgICBsZXQgYjIxID0gYi5zdWJNYXRyaXgoaGFsZlJvd3MsIGIucm93cyAtIDEsIDAsIGhhbGZDb2xzIC0gMSk7XG5cbiAgICAgIGxldCBhMjIgPSBhLnN1Yk1hdHJpeChoYWxmUm93cywgYS5yb3dzIC0gMSwgaGFsZkNvbHMsIGEuY29sdW1ucyAtIDEpO1xuICAgICAgbGV0IGIyMiA9IGIuc3ViTWF0cml4KGhhbGZSb3dzLCBiLnJvd3MgLSAxLCBoYWxmQ29scywgYi5jb2x1bW5zIC0gMSk7XG5cbiAgICAgIC8vIENvbXB1dGUgaW50ZXJtZWRpYXRlIHZhbHVlcy5cbiAgICAgIGxldCBtMSA9IGJsb2NrTXVsdChcbiAgICAgICAgQWJzdHJhY3RNYXRyaXguYWRkKGExMSwgYTIyKSxcbiAgICAgICAgQWJzdHJhY3RNYXRyaXguYWRkKGIxMSwgYjIyKSxcbiAgICAgICAgaGFsZlJvd3MsXG4gICAgICAgIGhhbGZDb2xzLFxuICAgICAgKTtcbiAgICAgIGxldCBtMiA9IGJsb2NrTXVsdChBYnN0cmFjdE1hdHJpeC5hZGQoYTIxLCBhMjIpLCBiMTEsIGhhbGZSb3dzLCBoYWxmQ29scyk7XG4gICAgICBsZXQgbTMgPSBibG9ja011bHQoYTExLCBBYnN0cmFjdE1hdHJpeC5zdWIoYjEyLCBiMjIpLCBoYWxmUm93cywgaGFsZkNvbHMpO1xuICAgICAgbGV0IG00ID0gYmxvY2tNdWx0KGEyMiwgQWJzdHJhY3RNYXRyaXguc3ViKGIyMSwgYjExKSwgaGFsZlJvd3MsIGhhbGZDb2xzKTtcbiAgICAgIGxldCBtNSA9IGJsb2NrTXVsdChBYnN0cmFjdE1hdHJpeC5hZGQoYTExLCBhMTIpLCBiMjIsIGhhbGZSb3dzLCBoYWxmQ29scyk7XG4gICAgICBsZXQgbTYgPSBibG9ja011bHQoXG4gICAgICAgIEFic3RyYWN0TWF0cml4LnN1YihhMjEsIGExMSksXG4gICAgICAgIEFic3RyYWN0TWF0cml4LmFkZChiMTEsIGIxMiksXG4gICAgICAgIGhhbGZSb3dzLFxuICAgICAgICBoYWxmQ29scyxcbiAgICAgICk7XG4gICAgICBsZXQgbTcgPSBibG9ja011bHQoXG4gICAgICAgIEFic3RyYWN0TWF0cml4LnN1YihhMTIsIGEyMiksXG4gICAgICAgIEFic3RyYWN0TWF0cml4LmFkZChiMjEsIGIyMiksXG4gICAgICAgIGhhbGZSb3dzLFxuICAgICAgICBoYWxmQ29scyxcbiAgICAgICk7XG5cbiAgICAgIC8vIENvbWJpbmUgaW50ZXJtZWRpYXRlIHZhbHVlcyBpbnRvIHRoZSBvdXRwdXQuXG4gICAgICBsZXQgYzExID0gQWJzdHJhY3RNYXRyaXguYWRkKG0xLCBtNCk7XG4gICAgICBjMTEuc3ViKG01KTtcbiAgICAgIGMxMS5hZGQobTcpO1xuICAgICAgbGV0IGMxMiA9IEFic3RyYWN0TWF0cml4LmFkZChtMywgbTUpO1xuICAgICAgbGV0IGMyMSA9IEFic3RyYWN0TWF0cml4LmFkZChtMiwgbTQpO1xuICAgICAgbGV0IGMyMiA9IEFic3RyYWN0TWF0cml4LnN1YihtMSwgbTIpO1xuICAgICAgYzIyLmFkZChtMyk7XG4gICAgICBjMjIuYWRkKG02KTtcblxuICAgICAgLy8gQ3JvcCBvdXRwdXQgdG8gdGhlIGRlc2lyZWQgc2l6ZSAodW5kbyBkeW5hbWljIHBhZGRpbmcpLlxuICAgICAgbGV0IHJlc3VsdGF0ID0gQWJzdHJhY3RNYXRyaXguemVyb3MoMiAqIGMxMS5yb3dzLCAyICogYzExLmNvbHVtbnMpO1xuICAgICAgcmVzdWx0YXQgPSByZXN1bHRhdC5zZXRTdWJNYXRyaXgoYzExLCAwLCAwKTtcbiAgICAgIHJlc3VsdGF0ID0gcmVzdWx0YXQuc2V0U3ViTWF0cml4KGMxMiwgYzExLnJvd3MsIDApO1xuICAgICAgcmVzdWx0YXQgPSByZXN1bHRhdC5zZXRTdWJNYXRyaXgoYzIxLCAwLCBjMTEuY29sdW1ucyk7XG4gICAgICByZXN1bHRhdCA9IHJlc3VsdGF0LnNldFN1Yk1hdHJpeChjMjIsIGMxMS5yb3dzLCBjMTEuY29sdW1ucyk7XG4gICAgICByZXR1cm4gcmVzdWx0YXQuc3ViTWF0cml4KDAsIHJvd3MgLSAxLCAwLCBjb2xzIC0gMSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJsb2NrTXVsdCh4LCB5LCByLCBjKTtcbiAgfVxuXG4gIHNjYWxlUm93cyhvcHRpb25zID0ge30pIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0Jyk7XG4gICAgfVxuICAgIGNvbnN0IHsgbWluID0gMCwgbWF4ID0gMSB9ID0gb3B0aW9ucztcbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShtaW4pKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdtaW4gbXVzdCBiZSBhIG51bWJlcicpO1xuICAgIGlmICghTnVtYmVyLmlzRmluaXRlKG1heCkpIHRocm93IG5ldyBUeXBlRXJyb3IoJ21heCBtdXN0IGJlIGEgbnVtYmVyJyk7XG4gICAgaWYgKG1pbiA+PSBtYXgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdtaW4gbXVzdCBiZSBzbWFsbGVyIHRoYW4gbWF4Jyk7XG4gICAgbGV0IG5ld01hdHJpeCA9IG5ldyBNYXRyaXgodGhpcy5yb3dzLCB0aGlzLmNvbHVtbnMpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5yb3dzOyBpKyspIHtcbiAgICAgIGNvbnN0IHJvdyA9IHRoaXMuZ2V0Um93KGkpO1xuICAgICAgaWYgKHJvdy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJlc2NhbGUocm93LCB7IG1pbiwgbWF4LCBvdXRwdXQ6IHJvdyB9KTtcbiAgICAgIH1cbiAgICAgIG5ld01hdHJpeC5zZXRSb3coaSwgcm93KTtcbiAgICB9XG4gICAgcmV0dXJuIG5ld01hdHJpeDtcbiAgfVxuXG4gIHNjYWxlQ29sdW1ucyhvcHRpb25zID0ge30pIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0Jyk7XG4gICAgfVxuICAgIGNvbnN0IHsgbWluID0gMCwgbWF4ID0gMSB9ID0gb3B0aW9ucztcbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShtaW4pKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdtaW4gbXVzdCBiZSBhIG51bWJlcicpO1xuICAgIGlmICghTnVtYmVyLmlzRmluaXRlKG1heCkpIHRocm93IG5ldyBUeXBlRXJyb3IoJ21heCBtdXN0IGJlIGEgbnVtYmVyJyk7XG4gICAgaWYgKG1pbiA+PSBtYXgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdtaW4gbXVzdCBiZSBzbWFsbGVyIHRoYW4gbWF4Jyk7XG4gICAgbGV0IG5ld01hdHJpeCA9IG5ldyBNYXRyaXgodGhpcy5yb3dzLCB0aGlzLmNvbHVtbnMpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jb2x1bW5zOyBpKyspIHtcbiAgICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuZ2V0Q29sdW1uKGkpO1xuICAgICAgaWYgKGNvbHVtbi5sZW5ndGgpIHtcbiAgICAgICAgcmVzY2FsZShjb2x1bW4sIHtcbiAgICAgICAgICBtaW46IG1pbixcbiAgICAgICAgICBtYXg6IG1heCxcbiAgICAgICAgICBvdXRwdXQ6IGNvbHVtbixcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBuZXdNYXRyaXguc2V0Q29sdW1uKGksIGNvbHVtbik7XG4gICAgfVxuICAgIHJldHVybiBuZXdNYXRyaXg7XG4gIH1cblxuICBmbGlwUm93cygpIHtcbiAgICBjb25zdCBtaWRkbGUgPSBNYXRoLmNlaWwodGhpcy5jb2x1bW5zIC8gMik7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnJvd3M7IGkrKykge1xuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBtaWRkbGU7IGorKykge1xuICAgICAgICBsZXQgZmlyc3QgPSB0aGlzLmdldChpLCBqKTtcbiAgICAgICAgbGV0IGxhc3QgPSB0aGlzLmdldChpLCB0aGlzLmNvbHVtbnMgLSAxIC0gaik7XG4gICAgICAgIHRoaXMuc2V0KGksIGosIGxhc3QpO1xuICAgICAgICB0aGlzLnNldChpLCB0aGlzLmNvbHVtbnMgLSAxIC0gaiwgZmlyc3QpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGZsaXBDb2x1bW5zKCkge1xuICAgIGNvbnN0IG1pZGRsZSA9IE1hdGguY2VpbCh0aGlzLnJvd3MgLyAyKTtcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRoaXMuY29sdW1uczsgaisrKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1pZGRsZTsgaSsrKSB7XG4gICAgICAgIGxldCBmaXJzdCA9IHRoaXMuZ2V0KGksIGopO1xuICAgICAgICBsZXQgbGFzdCA9IHRoaXMuZ2V0KHRoaXMucm93cyAtIDEgLSBpLCBqKTtcbiAgICAgICAgdGhpcy5zZXQoaSwgaiwgbGFzdCk7XG4gICAgICAgIHRoaXMuc2V0KHRoaXMucm93cyAtIDEgLSBpLCBqLCBmaXJzdCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAga3JvbmVja2VyUHJvZHVjdChvdGhlcikge1xuICAgIG90aGVyID0gTWF0cml4LmNoZWNrTWF0cml4KG90aGVyKTtcblxuICAgIGxldCBtID0gdGhpcy5yb3dzO1xuICAgIGxldCBuID0gdGhpcy5jb2x1bW5zO1xuICAgIGxldCBwID0gb3RoZXIucm93cztcbiAgICBsZXQgcSA9IG90aGVyLmNvbHVtbnM7XG5cbiAgICBsZXQgcmVzdWx0ID0gbmV3IE1hdHJpeChtICogcCwgbiAqIHEpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbTsgaSsrKSB7XG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG47IGorKykge1xuICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IHA7IGsrKykge1xuICAgICAgICAgIGZvciAobGV0IGwgPSAwOyBsIDwgcTsgbCsrKSB7XG4gICAgICAgICAgICByZXN1bHQuc2V0KHAgKiBpICsgaywgcSAqIGogKyBsLCB0aGlzLmdldChpLCBqKSAqIG90aGVyLmdldChrLCBsKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBrcm9uZWNrZXJTdW0ob3RoZXIpIHtcbiAgICBvdGhlciA9IE1hdHJpeC5jaGVja01hdHJpeChvdGhlcik7XG4gICAgaWYgKCF0aGlzLmlzU3F1YXJlKCkgfHwgIW90aGVyLmlzU3F1YXJlKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignS3JvbmVja2VyIFN1bSBuZWVkcyB0d28gU3F1YXJlIE1hdHJpY2VzJyk7XG4gICAgfVxuICAgIGxldCBtID0gdGhpcy5yb3dzO1xuICAgIGxldCBuID0gb3RoZXIucm93cztcbiAgICBsZXQgQXhJID0gdGhpcy5rcm9uZWNrZXJQcm9kdWN0KE1hdHJpeC5leWUobiwgbikpO1xuICAgIGxldCBJeEIgPSBNYXRyaXguZXllKG0sIG0pLmtyb25lY2tlclByb2R1Y3Qob3RoZXIpO1xuICAgIHJldHVybiBBeEkuYWRkKEl4Qik7XG4gIH1cblxuICB0cmFuc3Bvc2UoKSB7XG4gICAgbGV0IHJlc3VsdCA9IG5ldyBNYXRyaXgodGhpcy5jb2x1bW5zLCB0aGlzLnJvd3MpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5yb3dzOyBpKyspIHtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5jb2x1bW5zOyBqKyspIHtcbiAgICAgICAgcmVzdWx0LnNldChqLCBpLCB0aGlzLmdldChpLCBqKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBzb3J0Um93cyhjb21wYXJlRnVuY3Rpb24gPSBjb21wYXJlTnVtYmVycykge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5yb3dzOyBpKyspIHtcbiAgICAgIHRoaXMuc2V0Um93KGksIHRoaXMuZ2V0Um93KGkpLnNvcnQoY29tcGFyZUZ1bmN0aW9uKSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc29ydENvbHVtbnMoY29tcGFyZUZ1bmN0aW9uID0gY29tcGFyZU51bWJlcnMpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY29sdW1uczsgaSsrKSB7XG4gICAgICB0aGlzLnNldENvbHVtbihpLCB0aGlzLmdldENvbHVtbihpKS5zb3J0KGNvbXBhcmVGdW5jdGlvbikpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHN1Yk1hdHJpeChzdGFydFJvdywgZW5kUm93LCBzdGFydENvbHVtbiwgZW5kQ29sdW1uKSB7XG4gICAgY2hlY2tSYW5nZSh0aGlzLCBzdGFydFJvdywgZW5kUm93LCBzdGFydENvbHVtbiwgZW5kQ29sdW1uKTtcbiAgICBsZXQgbmV3TWF0cml4ID0gbmV3IE1hdHJpeChcbiAgICAgIGVuZFJvdyAtIHN0YXJ0Um93ICsgMSxcbiAgICAgIGVuZENvbHVtbiAtIHN0YXJ0Q29sdW1uICsgMSxcbiAgICApO1xuICAgIGZvciAobGV0IGkgPSBzdGFydFJvdzsgaSA8PSBlbmRSb3c7IGkrKykge1xuICAgICAgZm9yIChsZXQgaiA9IHN0YXJ0Q29sdW1uOyBqIDw9IGVuZENvbHVtbjsgaisrKSB7XG4gICAgICAgIG5ld01hdHJpeC5zZXQoaSAtIHN0YXJ0Um93LCBqIC0gc3RhcnRDb2x1bW4sIHRoaXMuZ2V0KGksIGopKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5ld01hdHJpeDtcbiAgfVxuXG4gIHN1Yk1hdHJpeFJvdyhpbmRpY2VzLCBzdGFydENvbHVtbiwgZW5kQ29sdW1uKSB7XG4gICAgaWYgKHN0YXJ0Q29sdW1uID09PSB1bmRlZmluZWQpIHN0YXJ0Q29sdW1uID0gMDtcbiAgICBpZiAoZW5kQ29sdW1uID09PSB1bmRlZmluZWQpIGVuZENvbHVtbiA9IHRoaXMuY29sdW1ucyAtIDE7XG4gICAgaWYgKFxuICAgICAgc3RhcnRDb2x1bW4gPiBlbmRDb2x1bW4gfHxcbiAgICAgIHN0YXJ0Q29sdW1uIDwgMCB8fFxuICAgICAgc3RhcnRDb2x1bW4gPj0gdGhpcy5jb2x1bW5zIHx8XG4gICAgICBlbmRDb2x1bW4gPCAwIHx8XG4gICAgICBlbmRDb2x1bW4gPj0gdGhpcy5jb2x1bW5zXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQXJndW1lbnQgb3V0IG9mIHJhbmdlJyk7XG4gICAgfVxuXG4gICAgbGV0IG5ld01hdHJpeCA9IG5ldyBNYXRyaXgoaW5kaWNlcy5sZW5ndGgsIGVuZENvbHVtbiAtIHN0YXJ0Q29sdW1uICsgMSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbmRpY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBmb3IgKGxldCBqID0gc3RhcnRDb2x1bW47IGogPD0gZW5kQ29sdW1uOyBqKyspIHtcbiAgICAgICAgaWYgKGluZGljZXNbaV0gPCAwIHx8IGluZGljZXNbaV0gPj0gdGhpcy5yb3dzKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYFJvdyBpbmRleCBvdXQgb2YgcmFuZ2U6ICR7aW5kaWNlc1tpXX1gKTtcbiAgICAgICAgfVxuICAgICAgICBuZXdNYXRyaXguc2V0KGksIGogLSBzdGFydENvbHVtbiwgdGhpcy5nZXQoaW5kaWNlc1tpXSwgaikpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbmV3TWF0cml4O1xuICB9XG5cbiAgc3ViTWF0cml4Q29sdW1uKGluZGljZXMsIHN0YXJ0Um93LCBlbmRSb3cpIHtcbiAgICBpZiAoc3RhcnRSb3cgPT09IHVuZGVmaW5lZCkgc3RhcnRSb3cgPSAwO1xuICAgIGlmIChlbmRSb3cgPT09IHVuZGVmaW5lZCkgZW5kUm93ID0gdGhpcy5yb3dzIC0gMTtcbiAgICBpZiAoXG4gICAgICBzdGFydFJvdyA+IGVuZFJvdyB8fFxuICAgICAgc3RhcnRSb3cgPCAwIHx8XG4gICAgICBzdGFydFJvdyA+PSB0aGlzLnJvd3MgfHxcbiAgICAgIGVuZFJvdyA8IDAgfHxcbiAgICAgIGVuZFJvdyA+PSB0aGlzLnJvd3NcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdBcmd1bWVudCBvdXQgb2YgcmFuZ2UnKTtcbiAgICB9XG5cbiAgICBsZXQgbmV3TWF0cml4ID0gbmV3IE1hdHJpeChlbmRSb3cgLSBzdGFydFJvdyArIDEsIGluZGljZXMubGVuZ3RoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGluZGljZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGZvciAobGV0IGogPSBzdGFydFJvdzsgaiA8PSBlbmRSb3c7IGorKykge1xuICAgICAgICBpZiAoaW5kaWNlc1tpXSA8IDAgfHwgaW5kaWNlc1tpXSA+PSB0aGlzLmNvbHVtbnMpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgQ29sdW1uIGluZGV4IG91dCBvZiByYW5nZTogJHtpbmRpY2VzW2ldfWApO1xuICAgICAgICB9XG4gICAgICAgIG5ld01hdHJpeC5zZXQoaiAtIHN0YXJ0Um93LCBpLCB0aGlzLmdldChqLCBpbmRpY2VzW2ldKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuZXdNYXRyaXg7XG4gIH1cblxuICBzZXRTdWJNYXRyaXgobWF0cml4LCBzdGFydFJvdywgc3RhcnRDb2x1bW4pIHtcbiAgICBtYXRyaXggPSBNYXRyaXguY2hlY2tNYXRyaXgobWF0cml4KTtcbiAgICBpZiAobWF0cml4LmlzRW1wdHkoKSkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGxldCBlbmRSb3cgPSBzdGFydFJvdyArIG1hdHJpeC5yb3dzIC0gMTtcbiAgICBsZXQgZW5kQ29sdW1uID0gc3RhcnRDb2x1bW4gKyBtYXRyaXguY29sdW1ucyAtIDE7XG4gICAgY2hlY2tSYW5nZSh0aGlzLCBzdGFydFJvdywgZW5kUm93LCBzdGFydENvbHVtbiwgZW5kQ29sdW1uKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1hdHJpeC5yb3dzOyBpKyspIHtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbWF0cml4LmNvbHVtbnM7IGorKykge1xuICAgICAgICB0aGlzLnNldChzdGFydFJvdyArIGksIHN0YXJ0Q29sdW1uICsgaiwgbWF0cml4LmdldChpLCBqKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2VsZWN0aW9uKHJvd0luZGljZXMsIGNvbHVtbkluZGljZXMpIHtcbiAgICBsZXQgaW5kaWNlcyA9IGNoZWNrSW5kaWNlcyh0aGlzLCByb3dJbmRpY2VzLCBjb2x1bW5JbmRpY2VzKTtcbiAgICBsZXQgbmV3TWF0cml4ID0gbmV3IE1hdHJpeChyb3dJbmRpY2VzLmxlbmd0aCwgY29sdW1uSW5kaWNlcy5sZW5ndGgpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5kaWNlcy5yb3cubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxldCByb3dJbmRleCA9IGluZGljZXMucm93W2ldO1xuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBpbmRpY2VzLmNvbHVtbi5sZW5ndGg7IGorKykge1xuICAgICAgICBsZXQgY29sdW1uSW5kZXggPSBpbmRpY2VzLmNvbHVtbltqXTtcbiAgICAgICAgbmV3TWF0cml4LnNldChpLCBqLCB0aGlzLmdldChyb3dJbmRleCwgY29sdW1uSW5kZXgpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5ld01hdHJpeDtcbiAgfVxuXG4gIHRyYWNlKCkge1xuICAgIGxldCBtaW4gPSBNYXRoLm1pbih0aGlzLnJvd3MsIHRoaXMuY29sdW1ucyk7XG4gICAgbGV0IHRyYWNlID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1pbjsgaSsrKSB7XG4gICAgICB0cmFjZSArPSB0aGlzLmdldChpLCBpKTtcbiAgICB9XG4gICAgcmV0dXJuIHRyYWNlO1xuICB9XG5cbiAgY2xvbmUoKSB7XG4gICAgbGV0IG5ld01hdHJpeCA9IG5ldyBNYXRyaXgodGhpcy5yb3dzLCB0aGlzLmNvbHVtbnMpO1xuICAgIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IHRoaXMucm93czsgcm93KyspIHtcbiAgICAgIGZvciAobGV0IGNvbHVtbiA9IDA7IGNvbHVtbiA8IHRoaXMuY29sdW1uczsgY29sdW1uKyspIHtcbiAgICAgICAgbmV3TWF0cml4LnNldChyb3csIGNvbHVtbiwgdGhpcy5nZXQocm93LCBjb2x1bW4pKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5ld01hdHJpeDtcbiAgfVxuXG4gIHN1bShieSkge1xuICAgIHN3aXRjaCAoYnkpIHtcbiAgICAgIGNhc2UgJ3Jvdyc6XG4gICAgICAgIHJldHVybiBzdW1CeVJvdyh0aGlzKTtcbiAgICAgIGNhc2UgJ2NvbHVtbic6XG4gICAgICAgIHJldHVybiBzdW1CeUNvbHVtbih0aGlzKTtcbiAgICAgIGNhc2UgdW5kZWZpbmVkOlxuICAgICAgICByZXR1cm4gc3VtQWxsKHRoaXMpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIG9wdGlvbjogJHtieX1gKTtcbiAgICB9XG4gIH1cblxuICBwcm9kdWN0KGJ5KSB7XG4gICAgc3dpdGNoIChieSkge1xuICAgICAgY2FzZSAncm93JzpcbiAgICAgICAgcmV0dXJuIHByb2R1Y3RCeVJvdyh0aGlzKTtcbiAgICAgIGNhc2UgJ2NvbHVtbic6XG4gICAgICAgIHJldHVybiBwcm9kdWN0QnlDb2x1bW4odGhpcyk7XG4gICAgICBjYXNlIHVuZGVmaW5lZDpcbiAgICAgICAgcmV0dXJuIHByb2R1Y3RBbGwodGhpcyk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgb3B0aW9uOiAke2J5fWApO1xuICAgIH1cbiAgfVxuXG4gIG1lYW4oYnkpIHtcbiAgICBjb25zdCBzdW0gPSB0aGlzLnN1bShieSk7XG4gICAgc3dpdGNoIChieSkge1xuICAgICAgY2FzZSAncm93Jzoge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucm93czsgaSsrKSB7XG4gICAgICAgICAgc3VtW2ldIC89IHRoaXMuY29sdW1ucztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3VtO1xuICAgICAgfVxuICAgICAgY2FzZSAnY29sdW1uJzoge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY29sdW1uczsgaSsrKSB7XG4gICAgICAgICAgc3VtW2ldIC89IHRoaXMucm93cztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3VtO1xuICAgICAgfVxuICAgICAgY2FzZSB1bmRlZmluZWQ6XG4gICAgICAgIHJldHVybiBzdW0gLyB0aGlzLnNpemU7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgb3B0aW9uOiAke2J5fWApO1xuICAgIH1cbiAgfVxuXG4gIHZhcmlhbmNlKGJ5LCBvcHRpb25zID0ge30pIHtcbiAgICBpZiAodHlwZW9mIGJ5ID09PSAnb2JqZWN0Jykge1xuICAgICAgb3B0aW9ucyA9IGJ5O1xuICAgICAgYnkgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucyAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QnKTtcbiAgICB9XG4gICAgY29uc3QgeyB1bmJpYXNlZCA9IHRydWUsIG1lYW4gPSB0aGlzLm1lYW4oYnkpIH0gPSBvcHRpb25zO1xuICAgIGlmICh0eXBlb2YgdW5iaWFzZWQgIT09ICdib29sZWFuJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndW5iaWFzZWQgbXVzdCBiZSBhIGJvb2xlYW4nKTtcbiAgICB9XG4gICAgc3dpdGNoIChieSkge1xuICAgICAgY2FzZSAncm93Jzoge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkobWVhbikpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdtZWFuIG11c3QgYmUgYW4gYXJyYXknKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFyaWFuY2VCeVJvdyh0aGlzLCB1bmJpYXNlZCwgbWVhbik7XG4gICAgICB9XG4gICAgICBjYXNlICdjb2x1bW4nOiB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShtZWFuKSkge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ21lYW4gbXVzdCBiZSBhbiBhcnJheScpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YXJpYW5jZUJ5Q29sdW1uKHRoaXMsIHVuYmlhc2VkLCBtZWFuKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgdW5kZWZpbmVkOiB7XG4gICAgICAgIGlmICh0eXBlb2YgbWVhbiAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdtZWFuIG11c3QgYmUgYSBudW1iZXInKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFyaWFuY2VBbGwodGhpcywgdW5iaWFzZWQsIG1lYW4pO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIG9wdGlvbjogJHtieX1gKTtcbiAgICB9XG4gIH1cblxuICBzdGFuZGFyZERldmlhdGlvbihieSwgb3B0aW9ucykge1xuICAgIGlmICh0eXBlb2YgYnkgPT09ICdvYmplY3QnKSB7XG4gICAgICBvcHRpb25zID0gYnk7XG4gICAgICBieSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgdmFyaWFuY2UgPSB0aGlzLnZhcmlhbmNlKGJ5LCBvcHRpb25zKTtcbiAgICBpZiAoYnkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIE1hdGguc3FydCh2YXJpYW5jZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFyaWFuY2UubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyaWFuY2VbaV0gPSBNYXRoLnNxcnQodmFyaWFuY2VbaV0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhcmlhbmNlO1xuICAgIH1cbiAgfVxuXG4gIGNlbnRlcihieSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgaWYgKHR5cGVvZiBieSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIG9wdGlvbnMgPSBieTtcbiAgICAgIGJ5ID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIG9wdGlvbnMgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0Jyk7XG4gICAgfVxuICAgIGNvbnN0IHsgY2VudGVyID0gdGhpcy5tZWFuKGJ5KSB9ID0gb3B0aW9ucztcbiAgICBzd2l0Y2ggKGJ5KSB7XG4gICAgICBjYXNlICdyb3cnOiB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShjZW50ZXIpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignY2VudGVyIG11c3QgYmUgYW4gYXJyYXknKTtcbiAgICAgICAgfVxuICAgICAgICBjZW50ZXJCeVJvdyh0aGlzLCBjZW50ZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvbHVtbic6IHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGNlbnRlcikpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdjZW50ZXIgbXVzdCBiZSBhbiBhcnJheScpO1xuICAgICAgICB9XG4gICAgICAgIGNlbnRlckJ5Q29sdW1uKHRoaXMsIGNlbnRlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgICAgY2FzZSB1bmRlZmluZWQ6IHtcbiAgICAgICAgaWYgKHR5cGVvZiBjZW50ZXIgIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignY2VudGVyIG11c3QgYmUgYSBudW1iZXInKTtcbiAgICAgICAgfVxuICAgICAgICBjZW50ZXJBbGwodGhpcywgY2VudGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgb3B0aW9uOiAke2J5fWApO1xuICAgIH1cbiAgfVxuXG4gIHNjYWxlKGJ5LCBvcHRpb25zID0ge30pIHtcbiAgICBpZiAodHlwZW9mIGJ5ID09PSAnb2JqZWN0Jykge1xuICAgICAgb3B0aW9ucyA9IGJ5O1xuICAgICAgYnkgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucyAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QnKTtcbiAgICB9XG4gICAgbGV0IHNjYWxlID0gb3B0aW9ucy5zY2FsZTtcbiAgICBzd2l0Y2ggKGJ5KSB7XG4gICAgICBjYXNlICdyb3cnOiB7XG4gICAgICAgIGlmIChzY2FsZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgc2NhbGUgPSBnZXRTY2FsZUJ5Um93KHRoaXMpO1xuICAgICAgICB9IGVsc2UgaWYgKCFBcnJheS5pc0FycmF5KHNjYWxlKSkge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3NjYWxlIG11c3QgYmUgYW4gYXJyYXknKTtcbiAgICAgICAgfVxuICAgICAgICBzY2FsZUJ5Um93KHRoaXMsIHNjYWxlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgICBjYXNlICdjb2x1bW4nOiB7XG4gICAgICAgIGlmIChzY2FsZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgc2NhbGUgPSBnZXRTY2FsZUJ5Q29sdW1uKHRoaXMpO1xuICAgICAgICB9IGVsc2UgaWYgKCFBcnJheS5pc0FycmF5KHNjYWxlKSkge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3NjYWxlIG11c3QgYmUgYW4gYXJyYXknKTtcbiAgICAgICAgfVxuICAgICAgICBzY2FsZUJ5Q29sdW1uKHRoaXMsIHNjYWxlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgICBjYXNlIHVuZGVmaW5lZDoge1xuICAgICAgICBpZiAoc2NhbGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHNjYWxlID0gZ2V0U2NhbGVBbGwodGhpcyk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHNjYWxlICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3NjYWxlIG11c3QgYmUgYSBudW1iZXInKTtcbiAgICAgICAgfVxuICAgICAgICBzY2FsZUFsbCh0aGlzLCBzY2FsZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIG9wdGlvbjogJHtieX1gKTtcbiAgICB9XG4gIH1cblxuICB0b1N0cmluZyhvcHRpb25zKSB7XG4gICAgcmV0dXJuIGluc3BlY3RNYXRyaXhXaXRoT3B0aW9ucyh0aGlzLCBvcHRpb25zKTtcbiAgfVxufVxuXG5BYnN0cmFjdE1hdHJpeC5wcm90b3R5cGUua2xhc3MgPSAnTWF0cml4JztcbmlmICh0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJykge1xuICBBYnN0cmFjdE1hdHJpeC5wcm90b3R5cGVbU3ltYm9sLmZvcignbm9kZWpzLnV0aWwuaW5zcGVjdC5jdXN0b20nKV0gPVxuICAgIGluc3BlY3RNYXRyaXg7XG59XG5cbmZ1bmN0aW9uIGNvbXBhcmVOdW1iZXJzKGEsIGIpIHtcbiAgcmV0dXJuIGEgLSBiO1xufVxuXG4vLyBTeW5vbnltc1xuQWJzdHJhY3RNYXRyaXgucmFuZG9tID0gQWJzdHJhY3RNYXRyaXgucmFuZDtcbkFic3RyYWN0TWF0cml4LnJhbmRvbUludCA9IEFic3RyYWN0TWF0cml4LnJhbmRJbnQ7XG5BYnN0cmFjdE1hdHJpeC5kaWFnb25hbCA9IEFic3RyYWN0TWF0cml4LmRpYWc7XG5BYnN0cmFjdE1hdHJpeC5wcm90b3R5cGUuZGlhZ29uYWwgPSBBYnN0cmFjdE1hdHJpeC5wcm90b3R5cGUuZGlhZztcbkFic3RyYWN0TWF0cml4LmlkZW50aXR5ID0gQWJzdHJhY3RNYXRyaXguZXllO1xuQWJzdHJhY3RNYXRyaXgucHJvdG90eXBlLm5lZ2F0ZSA9IEFic3RyYWN0TWF0cml4LnByb3RvdHlwZS5uZWc7XG5BYnN0cmFjdE1hdHJpeC5wcm90b3R5cGUudGVuc29yUHJvZHVjdCA9XG4gIEFic3RyYWN0TWF0cml4LnByb3RvdHlwZS5rcm9uZWNrZXJQcm9kdWN0O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNYXRyaXggZXh0ZW5kcyBBYnN0cmFjdE1hdHJpeCB7XG4gIGNvbnN0cnVjdG9yKG5Sb3dzLCBuQ29sdW1ucykge1xuICAgIHN1cGVyKCk7XG4gICAgaWYgKE1hdHJpeC5pc01hdHJpeChuUm93cykpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zdHJ1Y3Rvci1yZXR1cm5cbiAgICAgIHJldHVybiBuUm93cy5jbG9uZSgpO1xuICAgIH0gZWxzZSBpZiAoTnVtYmVyLmlzSW50ZWdlcihuUm93cykgJiYgblJvd3MgPj0gMCkge1xuICAgICAgLy8gQ3JlYXRlIGFuIGVtcHR5IG1hdHJpeFxuICAgICAgdGhpcy5kYXRhID0gW107XG4gICAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihuQ29sdW1ucykgJiYgbkNvbHVtbnMgPj0gMCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5Sb3dzOyBpKyspIHtcbiAgICAgICAgICB0aGlzLmRhdGEucHVzaChuZXcgRmxvYXQ2NEFycmF5KG5Db2x1bW5zKSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ25Db2x1bW5zIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyJyk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KG5Sb3dzKSkge1xuICAgICAgLy8gQ29weSB0aGUgdmFsdWVzIGZyb20gdGhlIDJEIGFycmF5XG4gICAgICBjb25zdCBhcnJheURhdGEgPSBuUm93cztcbiAgICAgIG5Sb3dzID0gYXJyYXlEYXRhLmxlbmd0aDtcbiAgICAgIG5Db2x1bW5zID0gblJvd3MgPyBhcnJheURhdGFbMF0ubGVuZ3RoIDogMDtcbiAgICAgIGlmICh0eXBlb2YgbkNvbHVtbnMgIT09ICdudW1iZXInKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgJ0RhdGEgbXVzdCBiZSBhIDJEIGFycmF5IHdpdGggYXQgbGVhc3Qgb25lIGVsZW1lbnQnLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdGhpcy5kYXRhID0gW107XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5Sb3dzOyBpKyspIHtcbiAgICAgICAgaWYgKGFycmF5RGF0YVtpXS5sZW5ndGggIT09IG5Db2x1bW5zKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0luY29uc2lzdGVudCBhcnJheSBkaW1lbnNpb25zJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kYXRhLnB1c2goRmxvYXQ2NEFycmF5LmZyb20oYXJyYXlEYXRhW2ldKSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICdGaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyIG9yIGFuIGFycmF5JyxcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMucm93cyA9IG5Sb3dzO1xuICAgIHRoaXMuY29sdW1ucyA9IG5Db2x1bW5zO1xuICB9XG5cbiAgc2V0KHJvd0luZGV4LCBjb2x1bW5JbmRleCwgdmFsdWUpIHtcbiAgICB0aGlzLmRhdGFbcm93SW5kZXhdW2NvbHVtbkluZGV4XSA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgZ2V0KHJvd0luZGV4LCBjb2x1bW5JbmRleCkge1xuICAgIHJldHVybiB0aGlzLmRhdGFbcm93SW5kZXhdW2NvbHVtbkluZGV4XTtcbiAgfVxuXG4gIHJlbW92ZVJvdyhpbmRleCkge1xuICAgIGNoZWNrUm93SW5kZXgodGhpcywgaW5kZXgpO1xuICAgIHRoaXMuZGF0YS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIHRoaXMucm93cyAtPSAxO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgYWRkUm93KGluZGV4LCBhcnJheSkge1xuICAgIGlmIChhcnJheSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBhcnJheSA9IGluZGV4O1xuICAgICAgaW5kZXggPSB0aGlzLnJvd3M7XG4gICAgfVxuICAgIGNoZWNrUm93SW5kZXgodGhpcywgaW5kZXgsIHRydWUpO1xuICAgIGFycmF5ID0gRmxvYXQ2NEFycmF5LmZyb20oY2hlY2tSb3dWZWN0b3IodGhpcywgYXJyYXkpKTtcbiAgICB0aGlzLmRhdGEuc3BsaWNlKGluZGV4LCAwLCBhcnJheSk7XG4gICAgdGhpcy5yb3dzICs9IDE7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICByZW1vdmVDb2x1bW4oaW5kZXgpIHtcbiAgICBjaGVja0NvbHVtbkluZGV4KHRoaXMsIGluZGV4KTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucm93czsgaSsrKSB7XG4gICAgICBjb25zdCBuZXdSb3cgPSBuZXcgRmxvYXQ2NEFycmF5KHRoaXMuY29sdW1ucyAtIDEpO1xuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBpbmRleDsgaisrKSB7XG4gICAgICAgIG5ld1Jvd1tqXSA9IHRoaXMuZGF0YVtpXVtqXTtcbiAgICAgIH1cbiAgICAgIGZvciAobGV0IGogPSBpbmRleCArIDE7IGogPCB0aGlzLmNvbHVtbnM7IGorKykge1xuICAgICAgICBuZXdSb3dbaiAtIDFdID0gdGhpcy5kYXRhW2ldW2pdO1xuICAgICAgfVxuICAgICAgdGhpcy5kYXRhW2ldID0gbmV3Um93O1xuICAgIH1cbiAgICB0aGlzLmNvbHVtbnMgLT0gMTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGFkZENvbHVtbihpbmRleCwgYXJyYXkpIHtcbiAgICBpZiAodHlwZW9mIGFycmF5ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgYXJyYXkgPSBpbmRleDtcbiAgICAgIGluZGV4ID0gdGhpcy5jb2x1bW5zO1xuICAgIH1cbiAgICBjaGVja0NvbHVtbkluZGV4KHRoaXMsIGluZGV4LCB0cnVlKTtcbiAgICBhcnJheSA9IGNoZWNrQ29sdW1uVmVjdG9yKHRoaXMsIGFycmF5KTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucm93czsgaSsrKSB7XG4gICAgICBjb25zdCBuZXdSb3cgPSBuZXcgRmxvYXQ2NEFycmF5KHRoaXMuY29sdW1ucyArIDEpO1xuICAgICAgbGV0IGogPSAwO1xuICAgICAgZm9yICg7IGogPCBpbmRleDsgaisrKSB7XG4gICAgICAgIG5ld1Jvd1tqXSA9IHRoaXMuZGF0YVtpXVtqXTtcbiAgICAgIH1cbiAgICAgIG5ld1Jvd1tqKytdID0gYXJyYXlbaV07XG4gICAgICBmb3IgKDsgaiA8IHRoaXMuY29sdW1ucyArIDE7IGorKykge1xuICAgICAgICBuZXdSb3dbal0gPSB0aGlzLmRhdGFbaV1baiAtIDFdO1xuICAgICAgfVxuICAgICAgdGhpcy5kYXRhW2ldID0gbmV3Um93O1xuICAgIH1cbiAgICB0aGlzLmNvbHVtbnMgKz0gMTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuXG5pbnN0YWxsTWF0aE9wZXJhdGlvbnMoQWJzdHJhY3RNYXRyaXgsIE1hdHJpeCk7XG4iLCJpbXBvcnQgeyBBYnN0cmFjdE1hdHJpeCB9IGZyb20gJy4uL21hdHJpeCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFdyYXBwZXJNYXRyaXgyRCBleHRlbmRzIEFic3RyYWN0TWF0cml4IHtcbiAgY29uc3RydWN0b3IoZGF0YSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICB0aGlzLnJvd3MgPSBkYXRhLmxlbmd0aDtcbiAgICB0aGlzLmNvbHVtbnMgPSBkYXRhWzBdLmxlbmd0aDtcbiAgfVxuXG4gIHNldChyb3dJbmRleCwgY29sdW1uSW5kZXgsIHZhbHVlKSB7XG4gICAgdGhpcy5kYXRhW3Jvd0luZGV4XVtjb2x1bW5JbmRleF0gPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGdldChyb3dJbmRleCwgY29sdW1uSW5kZXgpIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhW3Jvd0luZGV4XVtjb2x1bW5JbmRleF07XG4gIH1cbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBoeXBvdGVudXNlKGEsIGIpIHtcbiAgbGV0IHIgPSAwO1xuICBpZiAoTWF0aC5hYnMoYSkgPiBNYXRoLmFicyhiKSkge1xuICAgIHIgPSBiIC8gYTtcbiAgICByZXR1cm4gTWF0aC5hYnMoYSkgKiBNYXRoLnNxcnQoMSArIHIgKiByKTtcbiAgfVxuICBpZiAoYiAhPT0gMCkge1xuICAgIHIgPSBhIC8gYjtcbiAgICByZXR1cm4gTWF0aC5hYnMoYikgKiBNYXRoLnNxcnQoMSArIHIgKiByKTtcbiAgfVxuICByZXR1cm4gMDtcbn1cbiIsImltcG9ydCBNYXRyaXggZnJvbSAnLi4vbWF0cml4JztcbmltcG9ydCBXcmFwcGVyTWF0cml4MkQgZnJvbSAnLi4vd3JhcC9XcmFwcGVyTWF0cml4MkQnO1xuXG5pbXBvcnQgeyBoeXBvdGVudXNlIH0gZnJvbSAnLi91dGlsJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2luZ3VsYXJWYWx1ZURlY29tcG9zaXRpb24ge1xuICBjb25zdHJ1Y3Rvcih2YWx1ZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgdmFsdWUgPSBXcmFwcGVyTWF0cml4MkQuY2hlY2tNYXRyaXgodmFsdWUpO1xuXG4gICAgaWYgKHZhbHVlLmlzRW1wdHkoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNYXRyaXggbXVzdCBiZSBub24tZW1wdHknKTtcbiAgICB9XG5cbiAgICBsZXQgbSA9IHZhbHVlLnJvd3M7XG4gICAgbGV0IG4gPSB2YWx1ZS5jb2x1bW5zO1xuXG4gICAgY29uc3Qge1xuICAgICAgY29tcHV0ZUxlZnRTaW5ndWxhclZlY3RvcnMgPSB0cnVlLFxuICAgICAgY29tcHV0ZVJpZ2h0U2luZ3VsYXJWZWN0b3JzID0gdHJ1ZSxcbiAgICAgIGF1dG9UcmFuc3Bvc2UgPSBmYWxzZSxcbiAgICB9ID0gb3B0aW9ucztcblxuICAgIGxldCB3YW50dSA9IEJvb2xlYW4oY29tcHV0ZUxlZnRTaW5ndWxhclZlY3RvcnMpO1xuICAgIGxldCB3YW50diA9IEJvb2xlYW4oY29tcHV0ZVJpZ2h0U2luZ3VsYXJWZWN0b3JzKTtcblxuICAgIGxldCBzd2FwcGVkID0gZmFsc2U7XG4gICAgbGV0IGE7XG4gICAgaWYgKG0gPCBuKSB7XG4gICAgICBpZiAoIWF1dG9UcmFuc3Bvc2UpIHtcbiAgICAgICAgYSA9IHZhbHVlLmNsb25lKCk7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAnQ29tcHV0aW5nIFNWRCBvbiBhIG1hdHJpeCB3aXRoIG1vcmUgY29sdW1ucyB0aGFuIHJvd3MuIENvbnNpZGVyIGVuYWJsaW5nIGF1dG9UcmFuc3Bvc2UnLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYSA9IHZhbHVlLnRyYW5zcG9zZSgpO1xuICAgICAgICBtID0gYS5yb3dzO1xuICAgICAgICBuID0gYS5jb2x1bW5zO1xuICAgICAgICBzd2FwcGVkID0gdHJ1ZTtcbiAgICAgICAgbGV0IGF1eCA9IHdhbnR1O1xuICAgICAgICB3YW50dSA9IHdhbnR2O1xuICAgICAgICB3YW50diA9IGF1eDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgYSA9IHZhbHVlLmNsb25lKCk7XG4gICAgfVxuXG4gICAgbGV0IG51ID0gTWF0aC5taW4obSwgbik7XG4gICAgbGV0IG5pID0gTWF0aC5taW4obSArIDEsIG4pO1xuICAgIGxldCBzID0gbmV3IEZsb2F0NjRBcnJheShuaSk7XG4gICAgbGV0IFUgPSBuZXcgTWF0cml4KG0sIG51KTtcbiAgICBsZXQgViA9IG5ldyBNYXRyaXgobiwgbik7XG5cbiAgICBsZXQgZSA9IG5ldyBGbG9hdDY0QXJyYXkobik7XG4gICAgbGV0IHdvcmsgPSBuZXcgRmxvYXQ2NEFycmF5KG0pO1xuXG4gICAgbGV0IHNpID0gbmV3IEZsb2F0NjRBcnJheShuaSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuaTsgaSsrKSBzaVtpXSA9IGk7XG5cbiAgICBsZXQgbmN0ID0gTWF0aC5taW4obSAtIDEsIG4pO1xuICAgIGxldCBucnQgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihuIC0gMiwgbSkpO1xuICAgIGxldCBtcmMgPSBNYXRoLm1heChuY3QsIG5ydCk7XG5cbiAgICBmb3IgKGxldCBrID0gMDsgayA8IG1yYzsgaysrKSB7XG4gICAgICBpZiAoayA8IG5jdCkge1xuICAgICAgICBzW2tdID0gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IGs7IGkgPCBtOyBpKyspIHtcbiAgICAgICAgICBzW2tdID0gaHlwb3RlbnVzZShzW2tdLCBhLmdldChpLCBrKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNba10gIT09IDApIHtcbiAgICAgICAgICBpZiAoYS5nZXQoaywgaykgPCAwKSB7XG4gICAgICAgICAgICBzW2tdID0gLXNba107XG4gICAgICAgICAgfVxuICAgICAgICAgIGZvciAobGV0IGkgPSBrOyBpIDwgbTsgaSsrKSB7XG4gICAgICAgICAgICBhLnNldChpLCBrLCBhLmdldChpLCBrKSAvIHNba10pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBhLnNldChrLCBrLCBhLmdldChrLCBrKSArIDEpO1xuICAgICAgICB9XG4gICAgICAgIHNba10gPSAtc1trXTtcbiAgICAgIH1cblxuICAgICAgZm9yIChsZXQgaiA9IGsgKyAxOyBqIDwgbjsgaisrKSB7XG4gICAgICAgIGlmIChrIDwgbmN0ICYmIHNba10gIT09IDApIHtcbiAgICAgICAgICBsZXQgdCA9IDA7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IGs7IGkgPCBtOyBpKyspIHtcbiAgICAgICAgICAgIHQgKz0gYS5nZXQoaSwgaykgKiBhLmdldChpLCBqKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdCA9IC10IC8gYS5nZXQoaywgayk7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IGs7IGkgPCBtOyBpKyspIHtcbiAgICAgICAgICAgIGEuc2V0KGksIGosIGEuZ2V0KGksIGopICsgdCAqIGEuZ2V0KGksIGspKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZVtqXSA9IGEuZ2V0KGssIGopO1xuICAgICAgfVxuXG4gICAgICBpZiAod2FudHUgJiYgayA8IG5jdCkge1xuICAgICAgICBmb3IgKGxldCBpID0gazsgaSA8IG07IGkrKykge1xuICAgICAgICAgIFUuc2V0KGksIGssIGEuZ2V0KGksIGspKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoayA8IG5ydCkge1xuICAgICAgICBlW2tdID0gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IGsgKyAxOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgICAgZVtrXSA9IGh5cG90ZW51c2UoZVtrXSwgZVtpXSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVba10gIT09IDApIHtcbiAgICAgICAgICBpZiAoZVtrICsgMV0gPCAwKSB7XG4gICAgICAgICAgICBlW2tdID0gMCAtIGVba107XG4gICAgICAgICAgfVxuICAgICAgICAgIGZvciAobGV0IGkgPSBrICsgMTsgaSA8IG47IGkrKykge1xuICAgICAgICAgICAgZVtpXSAvPSBlW2tdO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlW2sgKyAxXSArPSAxO1xuICAgICAgICB9XG4gICAgICAgIGVba10gPSAtZVtrXTtcbiAgICAgICAgaWYgKGsgKyAxIDwgbSAmJiBlW2tdICE9PSAwKSB7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IGsgKyAxOyBpIDwgbTsgaSsrKSB7XG4gICAgICAgICAgICB3b3JrW2ldID0gMDtcbiAgICAgICAgICB9XG4gICAgICAgICAgZm9yIChsZXQgaSA9IGsgKyAxOyBpIDwgbTsgaSsrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gayArIDE7IGogPCBuOyBqKyspIHtcbiAgICAgICAgICAgICAgd29ya1tpXSArPSBlW2pdICogYS5nZXQoaSwgaik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGZvciAobGV0IGogPSBrICsgMTsgaiA8IG47IGorKykge1xuICAgICAgICAgICAgbGV0IHQgPSAtZVtqXSAvIGVbayArIDFdO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IGsgKyAxOyBpIDwgbTsgaSsrKSB7XG4gICAgICAgICAgICAgIGEuc2V0KGksIGosIGEuZ2V0KGksIGopICsgdCAqIHdvcmtbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAod2FudHYpIHtcbiAgICAgICAgICBmb3IgKGxldCBpID0gayArIDE7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICAgIFYuc2V0KGksIGssIGVbaV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBwID0gTWF0aC5taW4obiwgbSArIDEpO1xuICAgIGlmIChuY3QgPCBuKSB7XG4gICAgICBzW25jdF0gPSBhLmdldChuY3QsIG5jdCk7XG4gICAgfVxuICAgIGlmIChtIDwgcCkge1xuICAgICAgc1twIC0gMV0gPSAwO1xuICAgIH1cbiAgICBpZiAobnJ0ICsgMSA8IHApIHtcbiAgICAgIGVbbnJ0XSA9IGEuZ2V0KG5ydCwgcCAtIDEpO1xuICAgIH1cbiAgICBlW3AgLSAxXSA9IDA7XG5cbiAgICBpZiAod2FudHUpIHtcbiAgICAgIGZvciAobGV0IGogPSBuY3Q7IGogPCBudTsgaisrKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbTsgaSsrKSB7XG4gICAgICAgICAgVS5zZXQoaSwgaiwgMCk7XG4gICAgICAgIH1cbiAgICAgICAgVS5zZXQoaiwgaiwgMSk7XG4gICAgICB9XG4gICAgICBmb3IgKGxldCBrID0gbmN0IC0gMTsgayA+PSAwOyBrLS0pIHtcbiAgICAgICAgaWYgKHNba10gIT09IDApIHtcbiAgICAgICAgICBmb3IgKGxldCBqID0gayArIDE7IGogPCBudTsgaisrKSB7XG4gICAgICAgICAgICBsZXQgdCA9IDA7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gazsgaSA8IG07IGkrKykge1xuICAgICAgICAgICAgICB0ICs9IFUuZ2V0KGksIGspICogVS5nZXQoaSwgaik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0ID0gLXQgLyBVLmdldChrLCBrKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBrOyBpIDwgbTsgaSsrKSB7XG4gICAgICAgICAgICAgIFUuc2V0KGksIGosIFUuZ2V0KGksIGopICsgdCAqIFUuZ2V0KGksIGspKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgZm9yIChsZXQgaSA9IGs7IGkgPCBtOyBpKyspIHtcbiAgICAgICAgICAgIFUuc2V0KGksIGssIC1VLmdldChpLCBrKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIFUuc2V0KGssIGssIDEgKyBVLmdldChrLCBrKSk7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrIC0gMTsgaSsrKSB7XG4gICAgICAgICAgICBVLnNldChpLCBrLCAwKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtOyBpKyspIHtcbiAgICAgICAgICAgIFUuc2V0KGksIGssIDApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBVLnNldChrLCBrLCAxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh3YW50dikge1xuICAgICAgZm9yIChsZXQgayA9IG4gLSAxOyBrID49IDA7IGstLSkge1xuICAgICAgICBpZiAoayA8IG5ydCAmJiBlW2tdICE9PSAwKSB7XG4gICAgICAgICAgZm9yIChsZXQgaiA9IGsgKyAxOyBqIDwgbjsgaisrKSB7XG4gICAgICAgICAgICBsZXQgdCA9IDA7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gayArIDE7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICAgICAgdCArPSBWLmdldChpLCBrKSAqIFYuZ2V0KGksIGopO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdCA9IC10IC8gVi5nZXQoayArIDEsIGspO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IGsgKyAxOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgICAgICAgIFYuc2V0KGksIGosIFYuZ2V0KGksIGopICsgdCAqIFYuZ2V0KGksIGspKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICBWLnNldChpLCBrLCAwKTtcbiAgICAgICAgfVxuICAgICAgICBWLnNldChrLCBrLCAxKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgcHAgPSBwIC0gMTtcbiAgICBsZXQgaXRlciA9IDA7XG4gICAgbGV0IGVwcyA9IE51bWJlci5FUFNJTE9OO1xuICAgIHdoaWxlIChwID4gMCkge1xuICAgICAgbGV0IGssIGthc2U7XG4gICAgICBmb3IgKGsgPSBwIC0gMjsgayA+PSAtMTsgay0tKSB7XG4gICAgICAgIGlmIChrID09PSAtMSkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFscGhhID1cbiAgICAgICAgICBOdW1iZXIuTUlOX1ZBTFVFICsgZXBzICogTWF0aC5hYnMoc1trXSArIE1hdGguYWJzKHNbayArIDFdKSk7XG4gICAgICAgIGlmIChNYXRoLmFicyhlW2tdKSA8PSBhbHBoYSB8fCBOdW1iZXIuaXNOYU4oZVtrXSkpIHtcbiAgICAgICAgICBlW2tdID0gMDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGsgPT09IHAgLSAyKSB7XG4gICAgICAgIGthc2UgPSA0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IGtzO1xuICAgICAgICBmb3IgKGtzID0gcCAtIDE7IGtzID49IGs7IGtzLS0pIHtcbiAgICAgICAgICBpZiAoa3MgPT09IGspIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBsZXQgdCA9XG4gICAgICAgICAgICAoa3MgIT09IHAgPyBNYXRoLmFicyhlW2tzXSkgOiAwKSArXG4gICAgICAgICAgICAoa3MgIT09IGsgKyAxID8gTWF0aC5hYnMoZVtrcyAtIDFdKSA6IDApO1xuICAgICAgICAgIGlmIChNYXRoLmFicyhzW2tzXSkgPD0gZXBzICogdCkge1xuICAgICAgICAgICAgc1trc10gPSAwO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChrcyA9PT0gaykge1xuICAgICAgICAgIGthc2UgPSAzO1xuICAgICAgICB9IGVsc2UgaWYgKGtzID09PSBwIC0gMSkge1xuICAgICAgICAgIGthc2UgPSAxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGthc2UgPSAyO1xuICAgICAgICAgIGsgPSBrcztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBrKys7XG5cbiAgICAgIHN3aXRjaCAoa2FzZSkge1xuICAgICAgICBjYXNlIDE6IHtcbiAgICAgICAgICBsZXQgZiA9IGVbcCAtIDJdO1xuICAgICAgICAgIGVbcCAtIDJdID0gMDtcbiAgICAgICAgICBmb3IgKGxldCBqID0gcCAtIDI7IGogPj0gazsgai0tKSB7XG4gICAgICAgICAgICBsZXQgdCA9IGh5cG90ZW51c2Uoc1tqXSwgZik7XG4gICAgICAgICAgICBsZXQgY3MgPSBzW2pdIC8gdDtcbiAgICAgICAgICAgIGxldCBzbiA9IGYgLyB0O1xuICAgICAgICAgICAgc1tqXSA9IHQ7XG4gICAgICAgICAgICBpZiAoaiAhPT0gaykge1xuICAgICAgICAgICAgICBmID0gLXNuICogZVtqIC0gMV07XG4gICAgICAgICAgICAgIGVbaiAtIDFdID0gY3MgKiBlW2ogLSAxXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh3YW50dikge1xuICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykge1xuICAgICAgICAgICAgICAgIHQgPSBjcyAqIFYuZ2V0KGksIGopICsgc24gKiBWLmdldChpLCBwIC0gMSk7XG4gICAgICAgICAgICAgICAgVi5zZXQoaSwgcCAtIDEsIC1zbiAqIFYuZ2V0KGksIGopICsgY3MgKiBWLmdldChpLCBwIC0gMSkpO1xuICAgICAgICAgICAgICAgIFYuc2V0KGksIGosIHQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgMjoge1xuICAgICAgICAgIGxldCBmID0gZVtrIC0gMV07XG4gICAgICAgICAgZVtrIC0gMV0gPSAwO1xuICAgICAgICAgIGZvciAobGV0IGogPSBrOyBqIDwgcDsgaisrKSB7XG4gICAgICAgICAgICBsZXQgdCA9IGh5cG90ZW51c2Uoc1tqXSwgZik7XG4gICAgICAgICAgICBsZXQgY3MgPSBzW2pdIC8gdDtcbiAgICAgICAgICAgIGxldCBzbiA9IGYgLyB0O1xuICAgICAgICAgICAgc1tqXSA9IHQ7XG4gICAgICAgICAgICBmID0gLXNuICogZVtqXTtcbiAgICAgICAgICAgIGVbal0gPSBjcyAqIGVbal07XG4gICAgICAgICAgICBpZiAod2FudHUpIHtcbiAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtOyBpKyspIHtcbiAgICAgICAgICAgICAgICB0ID0gY3MgKiBVLmdldChpLCBqKSArIHNuICogVS5nZXQoaSwgayAtIDEpO1xuICAgICAgICAgICAgICAgIFUuc2V0KGksIGsgLSAxLCAtc24gKiBVLmdldChpLCBqKSArIGNzICogVS5nZXQoaSwgayAtIDEpKTtcbiAgICAgICAgICAgICAgICBVLnNldChpLCBqLCB0KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIDM6IHtcbiAgICAgICAgICBjb25zdCBzY2FsZSA9IE1hdGgubWF4KFxuICAgICAgICAgICAgTWF0aC5hYnMoc1twIC0gMV0pLFxuICAgICAgICAgICAgTWF0aC5hYnMoc1twIC0gMl0pLFxuICAgICAgICAgICAgTWF0aC5hYnMoZVtwIC0gMl0pLFxuICAgICAgICAgICAgTWF0aC5hYnMoc1trXSksXG4gICAgICAgICAgICBNYXRoLmFicyhlW2tdKSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IHNwID0gc1twIC0gMV0gLyBzY2FsZTtcbiAgICAgICAgICBjb25zdCBzcG0xID0gc1twIC0gMl0gLyBzY2FsZTtcbiAgICAgICAgICBjb25zdCBlcG0xID0gZVtwIC0gMl0gLyBzY2FsZTtcbiAgICAgICAgICBjb25zdCBzayA9IHNba10gLyBzY2FsZTtcbiAgICAgICAgICBjb25zdCBlayA9IGVba10gLyBzY2FsZTtcbiAgICAgICAgICBjb25zdCBiID0gKChzcG0xICsgc3ApICogKHNwbTEgLSBzcCkgKyBlcG0xICogZXBtMSkgLyAyO1xuICAgICAgICAgIGNvbnN0IGMgPSBzcCAqIGVwbTEgKiAoc3AgKiBlcG0xKTtcbiAgICAgICAgICBsZXQgc2hpZnQgPSAwO1xuICAgICAgICAgIGlmIChiICE9PSAwIHx8IGMgIT09IDApIHtcbiAgICAgICAgICAgIGlmIChiIDwgMCkge1xuICAgICAgICAgICAgICBzaGlmdCA9IDAgLSBNYXRoLnNxcnQoYiAqIGIgKyBjKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHNoaWZ0ID0gTWF0aC5zcXJ0KGIgKiBiICsgYyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzaGlmdCA9IGMgLyAoYiArIHNoaWZ0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbGV0IGYgPSAoc2sgKyBzcCkgKiAoc2sgLSBzcCkgKyBzaGlmdDtcbiAgICAgICAgICBsZXQgZyA9IHNrICogZWs7XG4gICAgICAgICAgZm9yIChsZXQgaiA9IGs7IGogPCBwIC0gMTsgaisrKSB7XG4gICAgICAgICAgICBsZXQgdCA9IGh5cG90ZW51c2UoZiwgZyk7XG4gICAgICAgICAgICBpZiAodCA9PT0gMCkgdCA9IE51bWJlci5NSU5fVkFMVUU7XG4gICAgICAgICAgICBsZXQgY3MgPSBmIC8gdDtcbiAgICAgICAgICAgIGxldCBzbiA9IGcgLyB0O1xuICAgICAgICAgICAgaWYgKGogIT09IGspIHtcbiAgICAgICAgICAgICAgZVtqIC0gMV0gPSB0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZiA9IGNzICogc1tqXSArIHNuICogZVtqXTtcbiAgICAgICAgICAgIGVbal0gPSBjcyAqIGVbal0gLSBzbiAqIHNbal07XG4gICAgICAgICAgICBnID0gc24gKiBzW2ogKyAxXTtcbiAgICAgICAgICAgIHNbaiArIDFdID0gY3MgKiBzW2ogKyAxXTtcbiAgICAgICAgICAgIGlmICh3YW50dikge1xuICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykge1xuICAgICAgICAgICAgICAgIHQgPSBjcyAqIFYuZ2V0KGksIGopICsgc24gKiBWLmdldChpLCBqICsgMSk7XG4gICAgICAgICAgICAgICAgVi5zZXQoaSwgaiArIDEsIC1zbiAqIFYuZ2V0KGksIGopICsgY3MgKiBWLmdldChpLCBqICsgMSkpO1xuICAgICAgICAgICAgICAgIFYuc2V0KGksIGosIHQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0ID0gaHlwb3RlbnVzZShmLCBnKTtcbiAgICAgICAgICAgIGlmICh0ID09PSAwKSB0ID0gTnVtYmVyLk1JTl9WQUxVRTtcbiAgICAgICAgICAgIGNzID0gZiAvIHQ7XG4gICAgICAgICAgICBzbiA9IGcgLyB0O1xuICAgICAgICAgICAgc1tqXSA9IHQ7XG4gICAgICAgICAgICBmID0gY3MgKiBlW2pdICsgc24gKiBzW2ogKyAxXTtcbiAgICAgICAgICAgIHNbaiArIDFdID0gLXNuICogZVtqXSArIGNzICogc1tqICsgMV07XG4gICAgICAgICAgICBnID0gc24gKiBlW2ogKyAxXTtcbiAgICAgICAgICAgIGVbaiArIDFdID0gY3MgKiBlW2ogKyAxXTtcbiAgICAgICAgICAgIGlmICh3YW50dSAmJiBqIDwgbSAtIDEpIHtcbiAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtOyBpKyspIHtcbiAgICAgICAgICAgICAgICB0ID0gY3MgKiBVLmdldChpLCBqKSArIHNuICogVS5nZXQoaSwgaiArIDEpO1xuICAgICAgICAgICAgICAgIFUuc2V0KGksIGogKyAxLCAtc24gKiBVLmdldChpLCBqKSArIGNzICogVS5nZXQoaSwgaiArIDEpKTtcbiAgICAgICAgICAgICAgICBVLnNldChpLCBqLCB0KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBlW3AgLSAyXSA9IGY7XG4gICAgICAgICAgaXRlciA9IGl0ZXIgKyAxO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgNDoge1xuICAgICAgICAgIGlmIChzW2tdIDw9IDApIHtcbiAgICAgICAgICAgIHNba10gPSBzW2tdIDwgMCA/IC1zW2tdIDogMDtcbiAgICAgICAgICAgIGlmICh3YW50dikge1xuICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8PSBwcDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgVi5zZXQoaSwgaywgLVYuZ2V0KGksIGspKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB3aGlsZSAoayA8IHBwKSB7XG4gICAgICAgICAgICBpZiAoc1trXSA+PSBzW2sgKyAxXSkge1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCB0ID0gc1trXTtcbiAgICAgICAgICAgIHNba10gPSBzW2sgKyAxXTtcbiAgICAgICAgICAgIHNbayArIDFdID0gdDtcbiAgICAgICAgICAgIGlmICh3YW50diAmJiBrIDwgbiAtIDEpIHtcbiAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICAgICAgICB0ID0gVi5nZXQoaSwgayArIDEpO1xuICAgICAgICAgICAgICAgIFYuc2V0KGksIGsgKyAxLCBWLmdldChpLCBrKSk7XG4gICAgICAgICAgICAgICAgVi5zZXQoaSwgaywgdCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh3YW50dSAmJiBrIDwgbSAtIDEpIHtcbiAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtOyBpKyspIHtcbiAgICAgICAgICAgICAgICB0ID0gVS5nZXQoaSwgayArIDEpO1xuICAgICAgICAgICAgICAgIFUuc2V0KGksIGsgKyAxLCBVLmdldChpLCBrKSk7XG4gICAgICAgICAgICAgICAgVS5zZXQoaSwgaywgdCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGsrKztcbiAgICAgICAgICB9XG4gICAgICAgICAgaXRlciA9IDA7XG4gICAgICAgICAgcC0tO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIC8vIG5vIGRlZmF1bHRcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc3dhcHBlZCkge1xuICAgICAgbGV0IHRtcCA9IFY7XG4gICAgICBWID0gVTtcbiAgICAgIFUgPSB0bXA7XG4gICAgfVxuXG4gICAgdGhpcy5tID0gbTtcbiAgICB0aGlzLm4gPSBuO1xuICAgIHRoaXMucyA9IHM7XG4gICAgdGhpcy5VID0gVTtcbiAgICB0aGlzLlYgPSBWO1xuICB9XG5cbiAgc29sdmUodmFsdWUpIHtcbiAgICBsZXQgWSA9IHZhbHVlO1xuICAgIGxldCBlID0gdGhpcy50aHJlc2hvbGQ7XG4gICAgbGV0IHNjb2xzID0gdGhpcy5zLmxlbmd0aDtcbiAgICBsZXQgTHMgPSBNYXRyaXguemVyb3Moc2NvbHMsIHNjb2xzKTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2NvbHM7IGkrKykge1xuICAgICAgaWYgKE1hdGguYWJzKHRoaXMuc1tpXSkgPD0gZSkge1xuICAgICAgICBMcy5zZXQoaSwgaSwgMCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBMcy5zZXQoaSwgaSwgMSAvIHRoaXMuc1tpXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IFUgPSB0aGlzLlU7XG4gICAgbGV0IFYgPSB0aGlzLnJpZ2h0U2luZ3VsYXJWZWN0b3JzO1xuXG4gICAgbGV0IFZMID0gVi5tbXVsKExzKTtcbiAgICBsZXQgdnJvd3MgPSBWLnJvd3M7XG4gICAgbGV0IHVyb3dzID0gVS5yb3dzO1xuICAgIGxldCBWTFUgPSBNYXRyaXguemVyb3ModnJvd3MsIHVyb3dzKTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdnJvd3M7IGkrKykge1xuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB1cm93czsgaisrKSB7XG4gICAgICAgIGxldCBzdW0gPSAwO1xuICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IHNjb2xzOyBrKyspIHtcbiAgICAgICAgICBzdW0gKz0gVkwuZ2V0KGksIGspICogVS5nZXQoaiwgayk7XG4gICAgICAgIH1cbiAgICAgICAgVkxVLnNldChpLCBqLCBzdW0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBWTFUubW11bChZKTtcbiAgfVxuXG4gIHNvbHZlRm9yRGlhZ29uYWwodmFsdWUpIHtcbiAgICByZXR1cm4gdGhpcy5zb2x2ZShNYXRyaXguZGlhZyh2YWx1ZSkpO1xuICB9XG5cbiAgaW52ZXJzZSgpIHtcbiAgICBsZXQgViA9IHRoaXMuVjtcbiAgICBsZXQgZSA9IHRoaXMudGhyZXNob2xkO1xuICAgIGxldCB2cm93cyA9IFYucm93cztcbiAgICBsZXQgdmNvbHMgPSBWLmNvbHVtbnM7XG4gICAgbGV0IFggPSBuZXcgTWF0cml4KHZyb3dzLCB0aGlzLnMubGVuZ3RoKTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdnJvd3M7IGkrKykge1xuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB2Y29sczsgaisrKSB7XG4gICAgICAgIGlmIChNYXRoLmFicyh0aGlzLnNbal0pID4gZSkge1xuICAgICAgICAgIFguc2V0KGksIGosIFYuZ2V0KGksIGopIC8gdGhpcy5zW2pdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBVID0gdGhpcy5VO1xuXG4gICAgbGV0IHVyb3dzID0gVS5yb3dzO1xuICAgIGxldCB1Y29scyA9IFUuY29sdW1ucztcbiAgICBsZXQgWSA9IG5ldyBNYXRyaXgodnJvd3MsIHVyb3dzKTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdnJvd3M7IGkrKykge1xuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB1cm93czsgaisrKSB7XG4gICAgICAgIGxldCBzdW0gPSAwO1xuICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IHVjb2xzOyBrKyspIHtcbiAgICAgICAgICBzdW0gKz0gWC5nZXQoaSwgaykgKiBVLmdldChqLCBrKTtcbiAgICAgICAgfVxuICAgICAgICBZLnNldChpLCBqLCBzdW0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBZO1xuICB9XG5cbiAgZ2V0IGNvbmRpdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5zWzBdIC8gdGhpcy5zW01hdGgubWluKHRoaXMubSwgdGhpcy5uKSAtIDFdO1xuICB9XG5cbiAgZ2V0IG5vcm0yKCkge1xuICAgIHJldHVybiB0aGlzLnNbMF07XG4gIH1cblxuICBnZXQgcmFuaygpIHtcbiAgICBsZXQgdG9sID0gTWF0aC5tYXgodGhpcy5tLCB0aGlzLm4pICogdGhpcy5zWzBdICogTnVtYmVyLkVQU0lMT047XG4gICAgbGV0IHIgPSAwO1xuICAgIGxldCBzID0gdGhpcy5zO1xuICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHMubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgaWYgKHNbaV0gPiB0b2wpIHtcbiAgICAgICAgcisrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcjtcbiAgfVxuXG4gIGdldCBkaWFnb25hbCgpIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLnMpO1xuICB9XG5cbiAgZ2V0IHRocmVzaG9sZCgpIHtcbiAgICByZXR1cm4gKE51bWJlci5FUFNJTE9OIC8gMikgKiBNYXRoLm1heCh0aGlzLm0sIHRoaXMubikgKiB0aGlzLnNbMF07XG4gIH1cblxuICBnZXQgbGVmdFNpbmd1bGFyVmVjdG9ycygpIHtcbiAgICByZXR1cm4gdGhpcy5VO1xuICB9XG5cbiAgZ2V0IHJpZ2h0U2luZ3VsYXJWZWN0b3JzKCkge1xuICAgIHJldHVybiB0aGlzLlY7XG4gIH1cblxuICBnZXQgZGlhZ29uYWxNYXRyaXgoKSB7XG4gICAgcmV0dXJuIE1hdHJpeC5kaWFnKHRoaXMucyk7XG4gIH1cbn1cbiIsImltcG9ydCB7IE1hdHJpeCBhcyBNTE1hdHJpeCwgU2luZ3VsYXJWYWx1ZURlY29tcG9zaXRpb24gfSBmcm9tICdtbC1tYXRyaXgnO1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTURTIHtcbiAgICBjb25zdHJ1Y3RvcihwYXJhbXMpIHtcbiAgICAgICAgdGhpcy5kaXN0YW5jZXMgPSBwYXJhbXMuZGlzdGFuY2VzO1xuICAgICAgICB0aGlzLmRpbWVuc2lvbiA9IHBhcmFtcy5kaW1lbnNpb24gfHwgMjtcbiAgICAgICAgdGhpcy5saW5rRGlzdGFuY2UgPSBwYXJhbXMubGlua0Rpc3RhbmNlO1xuICAgIH1cbiAgICBsYXlvdXQoKSB7XG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgICAgICBjb25zdCB7IGRpbWVuc2lvbiwgZGlzdGFuY2VzLCBsaW5rRGlzdGFuY2UgfSA9IHNlbGY7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBzcXVhcmUgZGlzdGFuY2VzXG4gICAgICAgICAgICBjb25zdCBNID0gTUxNYXRyaXgubXVsKE1MTWF0cml4LnBvdyhkaXN0YW5jZXMsIDIpLCAtMC41KTtcbiAgICAgICAgICAgIC8vIGRvdWJsZSBjZW50cmUgdGhlIHJvd3MvY29sdW1uc1xuICAgICAgICAgICAgY29uc3Qgcm93TWVhbnMgPSBNLm1lYW4oJ3JvdycpO1xuICAgICAgICAgICAgY29uc3QgY29sTWVhbnMgPSBNLm1lYW4oJ2NvbHVtbicpO1xuICAgICAgICAgICAgY29uc3QgdG90YWxNZWFuID0gTS5tZWFuKCk7XG4gICAgICAgICAgICBNLmFkZCh0b3RhbE1lYW4pLnN1YlJvd1ZlY3Rvcihyb3dNZWFucykuc3ViQ29sdW1uVmVjdG9yKGNvbE1lYW5zKTtcbiAgICAgICAgICAgIC8vIHRha2UgdGhlIFNWRCBvZiB0aGUgZG91YmxlIGNlbnRyZWQgbWF0cml4LCBhbmQgcmV0dXJuIHRoZVxuICAgICAgICAgICAgLy8gcG9pbnRzIGZyb20gaXRcbiAgICAgICAgICAgIGNvbnN0IHJldCA9IG5ldyBTaW5ndWxhclZhbHVlRGVjb21wb3NpdGlvbihNKTtcbiAgICAgICAgICAgIGNvbnN0IGVpZ2VuVmFsdWVzID0gTUxNYXRyaXguc3FydChyZXQuZGlhZ29uYWxNYXRyaXgpLmRpYWdvbmFsKCk7XG4gICAgICAgICAgICByZXR1cm4gcmV0LmxlZnRTaW5ndWxhclZlY3RvcnMudG9KU09OKCkubWFwKChyb3cpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gTUxNYXRyaXgubXVsKFtyb3ddLCBbZWlnZW5WYWx1ZXNdKS50b0pTT04oKVswXS5zcGxpY2UoMCwgZGltZW5zaW9uKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChfYSkge1xuICAgICAgICAgICAgY29uc3QgcmVzID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRpc3RhbmNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHggPSBNYXRoLnJhbmRvbSgpICogbGlua0Rpc3RhbmNlO1xuICAgICAgICAgICAgICAgIGNvbnN0IHkgPSBNYXRoLnJhbmRvbSgpICogbGlua0Rpc3RhbmNlO1xuICAgICAgICAgICAgICAgIHJlcy5wdXNoKFt4LCB5XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICB9XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWRzLmpzLm1hcCIsImNvbnN0IFNQRUVEX0RJVklTT1IgPSA4MDA7XG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSYWRpYWxOb25vdmVybGFwRm9yY2Uge1xuICAgIGNvbnN0cnVjdG9yKHBhcmFtcykge1xuICAgICAgICB0aGlzLmRpc3AgPSBbXTtcbiAgICAgICAgdGhpcy5wb3NpdGlvbnMgPSBwYXJhbXMucG9zaXRpb25zO1xuICAgICAgICB0aGlzLmFkak1hdHJpeCA9IHBhcmFtcy5hZGpNYXRyaXg7XG4gICAgICAgIHRoaXMuZm9jdXNJRCA9IHBhcmFtcy5mb2N1c0lEO1xuICAgICAgICB0aGlzLnJhZGlpID0gcGFyYW1zLnJhZGlpO1xuICAgICAgICB0aGlzLml0ZXJhdGlvbnMgPSBwYXJhbXMuaXRlcmF0aW9ucyB8fCAxMDtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBwYXJhbXMuaGVpZ2h0IHx8IDEwO1xuICAgICAgICB0aGlzLndpZHRoID0gcGFyYW1zLndpZHRoIHx8IDEwO1xuICAgICAgICB0aGlzLnNwZWVkID0gcGFyYW1zLnNwZWVkIHx8IDEwMDtcbiAgICAgICAgdGhpcy5ncmF2aXR5ID0gcGFyYW1zLmdyYXZpdHkgfHwgMTA7XG4gICAgICAgIHRoaXMubm9kZVNpemVGdW5jID0gcGFyYW1zLm5vZGVTaXplRnVuYztcbiAgICAgICAgdGhpcy5rID0gcGFyYW1zLmsgfHwgNTtcbiAgICAgICAgdGhpcy5zdHJpY3RSYWRpYWwgPSBwYXJhbXMuc3RyaWN0UmFkaWFsO1xuICAgICAgICB0aGlzLm5vZGVzID0gcGFyYW1zLm5vZGVzO1xuICAgIH1cbiAgICBsYXlvdXQoKSB7XG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgICAgICBjb25zdCBwb3NpdGlvbnMgPSBzZWxmLnBvc2l0aW9ucztcbiAgICAgICAgY29uc3QgZGlzcCA9IFtdO1xuICAgICAgICBjb25zdCBpdGVyYXRpb25zID0gc2VsZi5pdGVyYXRpb25zO1xuICAgICAgICBjb25zdCBtYXhEaXNwbGFjZSA9IHNlbGYud2lkdGggLyAxMDtcbiAgICAgICAgc2VsZi5tYXhEaXNwbGFjZSA9IG1heERpc3BsYWNlO1xuICAgICAgICBzZWxmLmRpc3AgPSBkaXNwO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZXJhdGlvbnM7IGkrKykge1xuICAgICAgICAgICAgcG9zaXRpb25zLmZvckVhY2goKF8sIGspID0+IHtcbiAgICAgICAgICAgICAgICBkaXNwW2tdID0geyB4OiAwLCB5OiAwIH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIOe7memHjeWPoOeahOiKgueCueWinuWKoOaWpeWKm1xuICAgICAgICAgICAgc2VsZi5nZXRSZXB1bHNpb24oKTtcbiAgICAgICAgICAgIHNlbGYudXBkYXRlUG9zaXRpb25zKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBvc2l0aW9ucztcbiAgICB9XG4gICAgZ2V0UmVwdWxzaW9uKCkge1xuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAgICAgY29uc3QgcG9zaXRpb25zID0gc2VsZi5wb3NpdGlvbnM7XG4gICAgICAgIGNvbnN0IG5vZGVzID0gc2VsZi5ub2RlcztcbiAgICAgICAgY29uc3QgZGlzcCA9IHNlbGYuZGlzcDtcbiAgICAgICAgY29uc3QgayA9IHNlbGYuaztcbiAgICAgICAgY29uc3QgcmFkaWkgPSBzZWxmLnJhZGlpIHx8IFtdO1xuICAgICAgICBwb3NpdGlvbnMuZm9yRWFjaCgodiwgaSkgPT4ge1xuICAgICAgICAgICAgZGlzcFtpXSA9IHsgeDogMCwgeTogMCB9O1xuICAgICAgICAgICAgcG9zaXRpb25zLmZvckVhY2goKHUsIGopID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaSA9PT0gaikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIHYgYW5kIHUgYXJlIG5vdCBvbiB0aGUgc2FtZSBjaXJjbGUsIHJldHVyblxuICAgICAgICAgICAgICAgIGlmIChyYWRpaVtpXSAhPT0gcmFkaWlbal0pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgdmVjeCA9IHZbMF0gLSB1WzBdO1xuICAgICAgICAgICAgICAgIGxldCB2ZWN5ID0gdlsxXSAtIHVbMV07XG4gICAgICAgICAgICAgICAgbGV0IHZlY0xlbmd0aCA9IE1hdGguc3FydCh2ZWN4ICogdmVjeCArIHZlY3kgKiB2ZWN5KTtcbiAgICAgICAgICAgICAgICBpZiAodmVjTGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHZlY0xlbmd0aCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpZ24gPSBpID4gaiA/IDEgOiAtMTtcbiAgICAgICAgICAgICAgICAgICAgdmVjeCA9IDAuMDEgKiBzaWduO1xuICAgICAgICAgICAgICAgICAgICB2ZWN5ID0gMC4wMSAqIHNpZ247XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIHRoZXNlIHR3byBub2RlcyBvdmVybGFwXG4gICAgICAgICAgICAgICAgaWYgKHZlY0xlbmd0aCA8IHNlbGYubm9kZVNpemVGdW5jKG5vZGVzW2ldKSAvIDIgKyBzZWxmLm5vZGVTaXplRnVuYyhub2Rlc1tqXSkgLyAyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbW1vbiA9IChrICogaykgLyB2ZWNMZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIGRpc3BbaV0ueCArPSAodmVjeCAvIHZlY0xlbmd0aCkgKiBjb21tb247XG4gICAgICAgICAgICAgICAgICAgIGRpc3BbaV0ueSArPSAodmVjeSAvIHZlY0xlbmd0aCkgKiBjb21tb247XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB1cGRhdGVQb3NpdGlvbnMoKSB7XG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgICAgICBjb25zdCBwb3NpdGlvbnMgPSBzZWxmLnBvc2l0aW9ucztcbiAgICAgICAgY29uc3QgZGlzcCA9IHNlbGYuZGlzcDtcbiAgICAgICAgY29uc3Qgc3BlZWQgPSBzZWxmLnNwZWVkO1xuICAgICAgICBjb25zdCBzdHJpY3RSYWRpYWwgPSBzZWxmLnN0cmljdFJhZGlhbDtcbiAgICAgICAgY29uc3QgZiA9IHNlbGYuZm9jdXNJRDtcbiAgICAgICAgY29uc3QgbWF4RGlzcGxhY2UgPSBzZWxmLm1heERpc3BsYWNlIHx8IHNlbGYud2lkdGggLyAxMDtcbiAgICAgICAgaWYgKHN0cmljdFJhZGlhbCkge1xuICAgICAgICAgICAgZGlzcC5mb3JFYWNoKChkaSwgaSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZ4ID0gcG9zaXRpb25zW2ldWzBdIC0gcG9zaXRpb25zW2ZdWzBdO1xuICAgICAgICAgICAgICAgIGNvbnN0IHZ5ID0gcG9zaXRpb25zW2ldWzFdIC0gcG9zaXRpb25zW2ZdWzFdO1xuICAgICAgICAgICAgICAgIGNvbnN0IHZMZW5ndGggPSBNYXRoLnNxcnQodnggKiB2eCArIHZ5ICogdnkpO1xuICAgICAgICAgICAgICAgIGxldCB2cHggPSB2eSAvIHZMZW5ndGg7XG4gICAgICAgICAgICAgICAgbGV0IHZweSA9IC12eCAvIHZMZW5ndGg7XG4gICAgICAgICAgICAgICAgY29uc3QgZGlMZW5ndGggPSBNYXRoLnNxcnQoZGkueCAqIGRpLnggKyBkaS55ICogZGkueSk7XG4gICAgICAgICAgICAgICAgbGV0IGFscGhhID0gTWF0aC5hY29zKCh2cHggKiBkaS54ICsgdnB5ICogZGkueSkgLyBkaUxlbmd0aCk7XG4gICAgICAgICAgICAgICAgaWYgKGFscGhhID4gTWF0aC5QSSAvIDIpIHtcbiAgICAgICAgICAgICAgICAgICAgYWxwaGEgLT0gTWF0aC5QSSAvIDI7XG4gICAgICAgICAgICAgICAgICAgIHZweCAqPSAtMTtcbiAgICAgICAgICAgICAgICAgICAgdnB5ICo9IC0xO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCB0ZGlzcExlbmd0aCA9IE1hdGguY29zKGFscGhhKSAqIGRpTGVuZ3RoO1xuICAgICAgICAgICAgICAgIGRpLnggPSB2cHggKiB0ZGlzcExlbmd0aDtcbiAgICAgICAgICAgICAgICBkaS55ID0gdnB5ICogdGRpc3BMZW5ndGg7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBtb3ZlXG4gICAgICAgIGNvbnN0IHJhZGlpID0gc2VsZi5yYWRpaTtcbiAgICAgICAgcG9zaXRpb25zLmZvckVhY2goKG4sIGkpID0+IHtcbiAgICAgICAgICAgIGlmIChpID09PSBmKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZGlzdExlbmd0aCA9IE1hdGguc3FydChkaXNwW2ldLnggKiBkaXNwW2ldLnggKyBkaXNwW2ldLnkgKiBkaXNwW2ldLnkpO1xuICAgICAgICAgICAgaWYgKGRpc3RMZW5ndGggPiAwICYmIGkgIT09IGYpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsaW1pdGVkRGlzdCA9IE1hdGgubWluKG1heERpc3BsYWNlICogKHNwZWVkIC8gU1BFRURfRElWSVNPUiksIGRpc3RMZW5ndGgpO1xuICAgICAgICAgICAgICAgIG5bMF0gKz0gKGRpc3BbaV0ueCAvIGRpc3RMZW5ndGgpICogbGltaXRlZERpc3Q7XG4gICAgICAgICAgICAgICAgblsxXSArPSAoZGlzcFtpXS55IC8gZGlzdExlbmd0aCkgKiBsaW1pdGVkRGlzdDtcbiAgICAgICAgICAgICAgICBpZiAoc3RyaWN0UmFkaWFsKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB2eCA9IG5bMF0gLSBwb3NpdGlvbnNbZl1bMF07XG4gICAgICAgICAgICAgICAgICAgIGxldCB2eSA9IG5bMV0gLSBwb3NpdGlvbnNbZl1bMV07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5mRGlzID0gTWF0aC5zcXJ0KHZ4ICogdnggKyB2eSAqIHZ5KTtcbiAgICAgICAgICAgICAgICAgICAgdnggPSAodnggLyBuZkRpcykgKiByYWRpaVtpXTtcbiAgICAgICAgICAgICAgICAgICAgdnkgPSAodnkgLyBuZkRpcykgKiByYWRpaVtpXTtcbiAgICAgICAgICAgICAgICAgICAgblswXSA9IHBvc2l0aW9uc1tmXVswXSArIHZ4O1xuICAgICAgICAgICAgICAgICAgICBuWzFdID0gcG9zaXRpb25zW2ZdWzFdICsgdnk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yYWRpYWxOb25vdmVybGFwRm9yY2UuanMubWFwIiwiLyoqXG4gKiBAZmlsZU92ZXJ2aWV3IHJhbmRvbSBsYXlvdXRcbiAqIEBhdXRob3Igc2hpd3Uud3l5QGFudGZpbi5jb21cbiAqL1xuaW1wb3J0IHsgaXNOYU4sIGlzQXJyYXksIGlzRnVuY3Rpb24sIGlzTnVtYmVyLCBpc1N0cmluZywgZmxveWRXYXJzaGFsbCwgZ2V0QWRqTWF0cml4LCBpc09iamVjdCB9IGZyb20gXCIuLi8uLi91dGlsXCI7XG5pbXBvcnQgeyBCYXNlIH0gZnJvbSBcIi4uL2Jhc2VcIjtcbmltcG9ydCBNRFMgZnJvbSBcIi4vbWRzXCI7XG5pbXBvcnQgUmFkaWFsTm9ub3ZlcmxhcEZvcmNlIGZyb20gXCIuL3JhZGlhbE5vbm92ZXJsYXBGb3JjZVwiO1xuZnVuY3Rpb24gZ2V0V2VpZ2h0TWF0cml4KE0pIHtcbiAgICBjb25zdCByb3dzID0gTS5sZW5ndGg7XG4gICAgY29uc3QgY29scyA9IE1bMF0ubGVuZ3RoO1xuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm93czsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHJvdyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGNvbHM7IGorKykge1xuICAgICAgICAgICAgaWYgKE1baV1bal0gIT09IDApIHtcbiAgICAgICAgICAgICAgICByb3cucHVzaCgxIC8gKE1baV1bal0gKiBNW2ldW2pdKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByb3cucHVzaCgwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXN1bHQucHVzaChyb3cpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gZ2V0SW5kZXhCeUlkKGFycmF5LCBpZCkge1xuICAgIGxldCBpbmRleCA9IC0xO1xuICAgIGFycmF5LmZvckVhY2goKGEsIGkpID0+IHtcbiAgICAgICAgaWYgKGEuaWQgPT09IGlkKSB7XG4gICAgICAgICAgICBpbmRleCA9IGk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gaW5kZXg7XG59XG5mdW5jdGlvbiBnZXRFRGlzdGFuY2UocDEsIHAyKSB7XG4gICAgcmV0dXJuIE1hdGguc3FydCgocDFbMF0gLSBwMlswXSkgKiAocDFbMF0gLSBwMlswXSkgKyAocDFbMV0gLSBwMlsxXSkgKiAocDFbMV0gLSBwMlsxXSkpO1xufVxuLyoqXG4gKiDovpDlsITnirbluIPlsYBcbiAqL1xuZXhwb3J0IGNsYXNzIFJhZGlhbExheW91dCBleHRlbmRzIEJhc2Uge1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgLyoqIOWBnOatoui/reS7o+eahOacgOWkp+i/reS7o+aVsCAqL1xuICAgICAgICB0aGlzLm1heEl0ZXJhdGlvbiA9IDEwMDA7XG4gICAgICAgIC8qKiDkuK3lv4PngrnvvIzpu5jorqTkuLrmlbDmja7kuK3nrKzkuIDkuKrngrkgKi9cbiAgICAgICAgdGhpcy5mb2N1c05vZGUgPSBudWxsO1xuICAgICAgICAvKiog5q+P5LiA5ZyI5Y2K5b6EICovXG4gICAgICAgIHRoaXMudW5pdFJhZGl1cyA9IG51bGw7XG4gICAgICAgIC8qKiDpu5jorqTovrnplb/luqYgKi9cbiAgICAgICAgdGhpcy5saW5rRGlzdGFuY2UgPSA1MDtcbiAgICAgICAgLyoqIOaYr+WQpumYsuatoumHjeWPoCAqL1xuICAgICAgICB0aGlzLnByZXZlbnRPdmVybGFwID0gZmFsc2U7XG4gICAgICAgIC8qKiDmmK/lkKblv4XpobvmmK/kuKXmoLznmoQgcmFkaWFsIOW4g+WxgO+8jOWNs+avj+S4gOWxgueahOiKgueCueS4peagvOW4g+WxgOWcqOS4gOS4queOr+S4iuOAgnByZXZlbnRPdmVybGFwIOS4uiB0cnVlIOaXtueUn+aViCAqL1xuICAgICAgICB0aGlzLnN0cmljdFJhZGlhbCA9IHRydWU7XG4gICAgICAgIC8qKiDpmLLmraLph43lj6DmraXpqqTnmoTmnIDlpKfov63ku6PmrKHmlbAgKi9cbiAgICAgICAgdGhpcy5tYXhQcmV2ZW50T3ZlcmxhcEl0ZXJhdGlvbiA9IDIwMDtcbiAgICAgICAgdGhpcy5zb3J0U3RyZW5ndGggPSAxMDtcbiAgICAgICAgdGhpcy5ub2RlcyA9IFtdO1xuICAgICAgICB0aGlzLmVkZ2VzID0gW107XG4gICAgICAgIHRoaXMudXBkYXRlQ2ZnKG9wdGlvbnMpO1xuICAgIH1cbiAgICBnZXREZWZhdWx0Q2ZnKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbWF4SXRlcmF0aW9uOiAxMDAwLFxuICAgICAgICAgICAgZm9jdXNOb2RlOiBudWxsLFxuICAgICAgICAgICAgdW5pdFJhZGl1czogbnVsbCxcbiAgICAgICAgICAgIGxpbmtEaXN0YW5jZTogNTAsXG4gICAgICAgICAgICBwcmV2ZW50T3ZlcmxhcDogZmFsc2UsXG4gICAgICAgICAgICBub2RlU2l6ZTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgbm9kZVNwYWNpbmc6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHN0cmljdFJhZGlhbDogdHJ1ZSxcbiAgICAgICAgICAgIG1heFByZXZlbnRPdmVybGFwSXRlcmF0aW9uOiAyMDAsXG4gICAgICAgICAgICBzb3J0Qnk6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHNvcnRTdHJlbmd0aDogMTBcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICog5omn6KGM5biD5bGAXG4gICAgICovXG4gICAgZXhlY3V0ZSgpIHtcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICAgIGNvbnN0IG5vZGVzID0gc2VsZi5ub2RlcztcbiAgICAgICAgY29uc3QgZWRnZXMgPSBzZWxmLmVkZ2VzIHx8IFtdO1xuICAgICAgICBpZiAoIW5vZGVzIHx8IG5vZGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgaWYgKHNlbGYub25MYXlvdXRFbmQpXG4gICAgICAgICAgICAgICAgc2VsZi5vbkxheW91dEVuZCgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghc2VsZi53aWR0aCAmJiB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICBzZWxmLndpZHRoID0gd2luZG93LmlubmVyV2lkdGg7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzZWxmLmhlaWdodCAmJiB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICBzZWxmLmhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXNlbGYuY2VudGVyKSB7XG4gICAgICAgICAgICBzZWxmLmNlbnRlciA9IFtzZWxmLndpZHRoIC8gMiwgc2VsZi5oZWlnaHQgLyAyXTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjZW50ZXIgPSBzZWxmLmNlbnRlcjtcbiAgICAgICAgaWYgKG5vZGVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgbm9kZXNbMF0ueCA9IGNlbnRlclswXTtcbiAgICAgICAgICAgIG5vZGVzWzBdLnkgPSBjZW50ZXJbMV07XG4gICAgICAgICAgICBpZiAoc2VsZi5vbkxheW91dEVuZClcbiAgICAgICAgICAgICAgICBzZWxmLm9uTGF5b3V0RW5kKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbGlua0Rpc3RhbmNlID0gc2VsZi5saW5rRGlzdGFuY2U7XG4gICAgICAgIC8vIGxheW91dFxuICAgICAgICBsZXQgZm9jdXNOb2RlID0gbnVsbDtcbiAgICAgICAgaWYgKGlzU3RyaW5nKHNlbGYuZm9jdXNOb2RlKSkge1xuICAgICAgICAgICAgbGV0IGZvdW5kID0gZmFsc2U7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGVzW2ldLmlkID09PSBzZWxmLmZvY3VzTm9kZSkge1xuICAgICAgICAgICAgICAgICAgICBmb2N1c05vZGUgPSBub2Rlc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5mb2N1c05vZGUgPSBmb2N1c05vZGU7XG4gICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgaSA9IG5vZGVzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWZvdW5kKSB7XG4gICAgICAgICAgICAgICAgZm9jdXNOb2RlID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGZvY3VzTm9kZSA9IHNlbGYuZm9jdXNOb2RlO1xuICAgICAgICB9XG4gICAgICAgIC8vIGRlZmF1bHQgZm9jdXMgbm9kZVxuICAgICAgICBpZiAoIWZvY3VzTm9kZSkge1xuICAgICAgICAgICAgZm9jdXNOb2RlID0gbm9kZXNbMF07XG4gICAgICAgICAgICBzZWxmLmZvY3VzTm9kZSA9IGZvY3VzTm9kZTtcbiAgICAgICAgfVxuICAgICAgICAvLyB0aGUgaW5kZXggb2YgdGhlIGZvY3VzTm9kZSBpbiBkYXRhXG4gICAgICAgIGNvbnN0IGZvY3VzSW5kZXggPSBnZXRJbmRleEJ5SWQobm9kZXMsIGZvY3VzTm9kZS5pZCk7XG4gICAgICAgIHNlbGYuZm9jdXNJbmRleCA9IGZvY3VzSW5kZXg7XG4gICAgICAgIC8vIHRoZSBncmFwaC10aGVvcmV0aWMgZGlzdGFuY2UgKHNob3J0ZXN0IHBhdGggZGlzdGFuY2UpIG1hdHJpeFxuICAgICAgICBjb25zdCBhZGpNYXRyaXggPSBnZXRBZGpNYXRyaXgoeyBub2RlcywgZWRnZXMgfSwgZmFsc2UpO1xuICAgICAgICBjb25zdCBEID0gZmxveWRXYXJzaGFsbChhZGpNYXRyaXgpO1xuICAgICAgICBjb25zdCBtYXhEaXN0YW5jZSA9IHNlbGYubWF4VG9Gb2N1cyhELCBmb2N1c0luZGV4KTtcbiAgICAgICAgLy8gcmVwbGFjZSBmaXJzdCBub2RlIGluIHVuY29ubmVjdGVkIGNvbXBvbmVudCB0byB0aGUgY2lyY2xlIGF0IChtYXhEaXN0YW5jZSArIDEpXG4gICAgICAgIHNlbGYuaGFuZGxlSW5maW5pdHkoRCwgZm9jdXNJbmRleCwgbWF4RGlzdGFuY2UgKyAxKTtcbiAgICAgICAgc2VsZi5kaXN0YW5jZXMgPSBEO1xuICAgICAgICAvLyB0aGUgc2hvcnRlc3QgcGF0aCBkaXN0YW5jZSBmcm9tIGVhY2ggbm9kZSB0byBmb2N1c05vZGVcbiAgICAgICAgY29uc3QgZm9jdXNOb2RlRCA9IERbZm9jdXNJbmRleF07XG4gICAgICAgIGNvbnN0IHdpZHRoID0gc2VsZi53aWR0aCB8fCA1MDA7XG4gICAgICAgIGNvbnN0IGhlaWdodCA9IHNlbGYuaGVpZ2h0IHx8IDUwMDtcbiAgICAgICAgbGV0IHNlbWlXaWR0aCA9IHdpZHRoIC0gY2VudGVyWzBdID4gY2VudGVyWzBdID8gY2VudGVyWzBdIDogd2lkdGggLSBjZW50ZXJbMF07XG4gICAgICAgIGxldCBzZW1pSGVpZ2h0ID0gaGVpZ2h0IC0gY2VudGVyWzFdID4gY2VudGVyWzFdID8gY2VudGVyWzFdIDogaGVpZ2h0IC0gY2VudGVyWzFdO1xuICAgICAgICBpZiAoc2VtaVdpZHRoID09PSAwKSB7XG4gICAgICAgICAgICBzZW1pV2lkdGggPSB3aWR0aCAvIDI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNlbWlIZWlnaHQgPT09IDApIHtcbiAgICAgICAgICAgIHNlbWlIZWlnaHQgPSBoZWlnaHQgLyAyO1xuICAgICAgICB9XG4gICAgICAgIC8vIHRoZSBtYXhSYWRpdXMgb2YgdGhlIGdyYXBoXG4gICAgICAgIGNvbnN0IG1heFJhZGl1cyA9IHNlbWlIZWlnaHQgPiBzZW1pV2lkdGggPyBzZW1pV2lkdGggOiBzZW1pSGVpZ2h0O1xuICAgICAgICBjb25zdCBtYXhEID0gTWF0aC5tYXgoLi4uZm9jdXNOb2RlRCk7XG4gICAgICAgIC8vIHRoZSByYWRpdXMgZm9yIGVhY2ggbm9kZXMgYXdheSBmcm9tIGZvY3VzTm9kZVxuICAgICAgICBjb25zdCByYWRpaSA9IFtdO1xuICAgICAgICBmb2N1c05vZGVELmZvckVhY2goKHZhbHVlLCBpKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXNlbGYudW5pdFJhZGl1cykge1xuICAgICAgICAgICAgICAgIHNlbGYudW5pdFJhZGl1cyA9IG1heFJhZGl1cyAvIG1heEQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByYWRpaVtpXSA9IHZhbHVlICogc2VsZi51bml0UmFkaXVzO1xuICAgICAgICB9KTtcbiAgICAgICAgc2VsZi5yYWRpaSA9IHJhZGlpO1xuICAgICAgICBjb25zdCBlSWRlYWxEID0gc2VsZi5lSWRlYWxEaXNNYXRyaXgoKTtcbiAgICAgICAgLy8gY29uc3QgZUlkZWFsRCA9IHNjYWxlTWF0cml4KEQsIGxpbmtEaXN0YW5jZSk7XG4gICAgICAgIHNlbGYuZUlkZWFsRGlzdGFuY2VzID0gZUlkZWFsRDtcbiAgICAgICAgLy8gdGhlIHdlaWdodCBtYXRyaXgsIFdpaiA9IDEgLyBkaWpeKC0yKVxuICAgICAgICBjb25zdCBXID0gZ2V0V2VpZ2h0TWF0cml4KGVJZGVhbEQpO1xuICAgICAgICBzZWxmLndlaWdodHMgPSBXO1xuICAgICAgICAvLyB0aGUgaW5pdGlhbCBwb3NpdGlvbnMgZnJvbSBtZHNcbiAgICAgICAgY29uc3QgbWRzID0gbmV3IE1EUyh7IGxpbmtEaXN0YW5jZSwgZGlzdGFuY2VzOiBlSWRlYWxEIH0pO1xuICAgICAgICBsZXQgcG9zaXRpb25zID0gbWRzLmxheW91dCgpO1xuICAgICAgICBwb3NpdGlvbnMuZm9yRWFjaCgocCkgPT4ge1xuICAgICAgICAgICAgaWYgKGlzTmFOKHBbMF0pKSB7XG4gICAgICAgICAgICAgICAgcFswXSA9IE1hdGgucmFuZG9tKCkgKiBsaW5rRGlzdGFuY2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNOYU4ocFsxXSkpIHtcbiAgICAgICAgICAgICAgICBwWzFdID0gTWF0aC5yYW5kb20oKSAqIGxpbmtEaXN0YW5jZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHNlbGYucG9zaXRpb25zID0gcG9zaXRpb25zO1xuICAgICAgICBwb3NpdGlvbnMuZm9yRWFjaCgocCwgaSkgPT4ge1xuICAgICAgICAgICAgbm9kZXNbaV0ueCA9IHBbMF0gKyBjZW50ZXJbMF07XG4gICAgICAgICAgICBub2Rlc1tpXS55ID0gcFsxXSArIGNlbnRlclsxXTtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIG1vdmUgdGhlIGdyYXBoIHRvIG9yaWdpbiwgY2VudGVyZWQgYXQgZm9jdXNOb2RlXG4gICAgICAgIHBvc2l0aW9ucy5mb3JFYWNoKChwKSA9PiB7XG4gICAgICAgICAgICBwWzBdIC09IHBvc2l0aW9uc1tmb2N1c0luZGV4XVswXTtcbiAgICAgICAgICAgIHBbMV0gLT0gcG9zaXRpb25zW2ZvY3VzSW5kZXhdWzFdO1xuICAgICAgICB9KTtcbiAgICAgICAgc2VsZi5ydW4oKTtcbiAgICAgICAgY29uc3QgcHJldmVudE92ZXJsYXAgPSBzZWxmLnByZXZlbnRPdmVybGFwO1xuICAgICAgICBjb25zdCBub2RlU2l6ZSA9IHNlbGYubm9kZVNpemU7XG4gICAgICAgIGxldCBub2RlU2l6ZUZ1bmM7XG4gICAgICAgIGNvbnN0IHN0cmljdFJhZGlhbCA9IHNlbGYuc3RyaWN0UmFkaWFsO1xuICAgICAgICAvLyBzdGFnZ2VyIHRoZSBvdmVybGFwcGVkIG5vZGVzXG4gICAgICAgIGlmIChwcmV2ZW50T3ZlcmxhcCkge1xuICAgICAgICAgICAgY29uc3Qgbm9kZVNwYWNpbmcgPSBzZWxmLm5vZGVTcGFjaW5nO1xuICAgICAgICAgICAgbGV0IG5vZGVTcGFjaW5nRnVuYztcbiAgICAgICAgICAgIGlmIChpc051bWJlcihub2RlU3BhY2luZykpIHtcbiAgICAgICAgICAgICAgICBub2RlU3BhY2luZ0Z1bmMgPSAoKSA9PiBub2RlU3BhY2luZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGlzRnVuY3Rpb24obm9kZVNwYWNpbmcpKSB7XG4gICAgICAgICAgICAgICAgbm9kZVNwYWNpbmdGdW5jID0gbm9kZVNwYWNpbmc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBub2RlU3BhY2luZ0Z1bmMgPSAoKSA9PiAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFub2RlU2l6ZSkge1xuICAgICAgICAgICAgICAgIG5vZGVTaXplRnVuYyA9IChkKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkLnNpemUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0FycmF5KGQuc2l6ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXMgPSBkLnNpemVbMF0gPiBkLnNpemVbMV0gPyBkLnNpemVbMF0gOiBkLnNpemVbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlcyArIG5vZGVTcGFjaW5nRnVuYyhkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc09iamVjdChkLnNpemUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzID0gZC5zaXplLndpZHRoID4gZC5zaXplLmhlaWdodCA/IGQuc2l6ZS53aWR0aCA6IGQuc2l6ZS5oZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlcyArIG5vZGVTcGFjaW5nRnVuYyhkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkLnNpemUgKyBub2RlU3BhY2luZ0Z1bmMoZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDEwICsgbm9kZVNwYWNpbmdGdW5jKGQpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpc0FycmF5KG5vZGVTaXplKSkge1xuICAgICAgICAgICAgICAgIG5vZGVTaXplRnVuYyA9IChkKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcyA9IG5vZGVTaXplWzBdID4gbm9kZVNpemVbMV0gPyBub2RlU2l6ZVswXSA6IG5vZGVTaXplWzFdO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzICsgbm9kZVNwYWNpbmdGdW5jKGQpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBub2RlU2l6ZUZ1bmMgPSAoZCkgPT4gbm9kZVNpemUgKyBub2RlU3BhY2luZ0Z1bmMoZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBub25vdmVybGFwRm9yY2VQYXJhbXMgPSB7XG4gICAgICAgICAgICAgICAgbm9kZXMsXG4gICAgICAgICAgICAgICAgbm9kZVNpemVGdW5jLFxuICAgICAgICAgICAgICAgIGFkak1hdHJpeCxcbiAgICAgICAgICAgICAgICBwb3NpdGlvbnMsXG4gICAgICAgICAgICAgICAgcmFkaWksXG4gICAgICAgICAgICAgICAgaGVpZ2h0LFxuICAgICAgICAgICAgICAgIHdpZHRoLFxuICAgICAgICAgICAgICAgIHN0cmljdFJhZGlhbCxcbiAgICAgICAgICAgICAgICBmb2N1c0lEOiBmb2N1c0luZGV4LFxuICAgICAgICAgICAgICAgIGl0ZXJhdGlvbnM6IHNlbGYubWF4UHJldmVudE92ZXJsYXBJdGVyYXRpb24gfHwgMjAwLFxuICAgICAgICAgICAgICAgIGs6IHBvc2l0aW9ucy5sZW5ndGggLyA0LjVcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCBub25vdmVybGFwRm9yY2UgPSBuZXcgUmFkaWFsTm9ub3ZlcmxhcEZvcmNlKG5vbm92ZXJsYXBGb3JjZVBhcmFtcyk7XG4gICAgICAgICAgICBwb3NpdGlvbnMgPSBub25vdmVybGFwRm9yY2UubGF5b3V0KCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gbW92ZSB0aGUgZ3JhcGggdG8gY2VudGVyXG4gICAgICAgIHBvc2l0aW9ucy5mb3JFYWNoKChwLCBpKSA9PiB7XG4gICAgICAgICAgICBub2Rlc1tpXS54ID0gcFswXSArIGNlbnRlclswXTtcbiAgICAgICAgICAgIG5vZGVzW2ldLnkgPSBwWzFdICsgY2VudGVyWzFdO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHNlbGYub25MYXlvdXRFbmQpXG4gICAgICAgICAgICBzZWxmLm9uTGF5b3V0RW5kKCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBub2RlcyxcbiAgICAgICAgICAgIGVkZ2VzXG4gICAgICAgIH07XG4gICAgfVxuICAgIHJ1bigpIHtcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICAgIGNvbnN0IG1heEl0ZXJhdGlvbiA9IHNlbGYubWF4SXRlcmF0aW9uO1xuICAgICAgICBjb25zdCBwb3NpdGlvbnMgPSBzZWxmLnBvc2l0aW9ucyB8fCBbXTtcbiAgICAgICAgY29uc3QgVyA9IHNlbGYud2VpZ2h0cyB8fCBbXTtcbiAgICAgICAgY29uc3QgZUlkZWFsRGlzID0gc2VsZi5lSWRlYWxEaXN0YW5jZXMgfHwgW107XG4gICAgICAgIGNvbnN0IHJhZGlpID0gc2VsZi5yYWRpaSB8fCBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gbWF4SXRlcmF0aW9uOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmFtID0gaSAvIG1heEl0ZXJhdGlvbjtcbiAgICAgICAgICAgIHNlbGYub25lSXRlcmF0aW9uKHBhcmFtLCBwb3NpdGlvbnMsIHJhZGlpLCBlSWRlYWxEaXMsIFcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIG9uZUl0ZXJhdGlvbihwYXJhbSwgcG9zaXRpb25zLCByYWRpaSwgRCwgVykge1xuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAgICAgY29uc3QgdnBhcmFtID0gMSAtIHBhcmFtO1xuICAgICAgICBjb25zdCBmb2N1c0luZGV4ID0gc2VsZi5mb2N1c0luZGV4O1xuICAgICAgICBwb3NpdGlvbnMuZm9yRWFjaCgodiwgaSkgPT4ge1xuICAgICAgICAgICAgLy8gdlxuICAgICAgICAgICAgY29uc3Qgb3JpZ2luRGlzID0gZ2V0RURpc3RhbmNlKHYsIFswLCAwXSk7XG4gICAgICAgICAgICBjb25zdCByZWNpT0RpcyA9IG9yaWdpbkRpcyA9PT0gMCA/IDAgOiAxIC8gb3JpZ2luRGlzO1xuICAgICAgICAgICAgaWYgKGkgPT09IGZvY3VzSW5kZXgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgeE1vbGVjdWxlID0gMDtcbiAgICAgICAgICAgIGxldCB5TW9sZWN1bGUgPSAwO1xuICAgICAgICAgICAgbGV0IGRlbm9taW5hdG9yID0gMDtcbiAgICAgICAgICAgIHBvc2l0aW9ucy5mb3JFYWNoKCh1LCBqKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gdVxuICAgICAgICAgICAgICAgIGlmIChpID09PSBqKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gdGhlIGV1Y2xpZGVhbiBkaXN0YW5jZSBiZXR3ZWVuIHYgYW5kIHVcbiAgICAgICAgICAgICAgICBjb25zdCBlZGlzID0gZ2V0RURpc3RhbmNlKHYsIHUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlY2lFZGlzID0gZWRpcyA9PT0gMCA/IDAgOiAxIC8gZWRpcztcbiAgICAgICAgICAgICAgICBjb25zdCBpZGVhbERpcyA9IERbal1baV07XG4gICAgICAgICAgICAgICAgLy8gc2FtZSBmb3IgeCBhbmQgeVxuICAgICAgICAgICAgICAgIGRlbm9taW5hdG9yICs9IFdbaV1bal07XG4gICAgICAgICAgICAgICAgLy8geFxuICAgICAgICAgICAgICAgIHhNb2xlY3VsZSArPSBXW2ldW2pdICogKHVbMF0gKyBpZGVhbERpcyAqICh2WzBdIC0gdVswXSkgKiByZWNpRWRpcyk7XG4gICAgICAgICAgICAgICAgLy8geVxuICAgICAgICAgICAgICAgIHlNb2xlY3VsZSArPSBXW2ldW2pdICogKHVbMV0gKyBpZGVhbERpcyAqICh2WzFdIC0gdVsxXSkgKiByZWNpRWRpcyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IHJlY2lSID0gcmFkaWlbaV0gPT09IDAgPyAwIDogMSAvIHJhZGlpW2ldO1xuICAgICAgICAgICAgZGVub21pbmF0b3IgKj0gdnBhcmFtO1xuICAgICAgICAgICAgZGVub21pbmF0b3IgKz0gcGFyYW0gKiByZWNpUiAqIHJlY2lSO1xuICAgICAgICAgICAgLy8geFxuICAgICAgICAgICAgeE1vbGVjdWxlICo9IHZwYXJhbTtcbiAgICAgICAgICAgIHhNb2xlY3VsZSArPSBwYXJhbSAqIHJlY2lSICogdlswXSAqIHJlY2lPRGlzO1xuICAgICAgICAgICAgdlswXSA9IHhNb2xlY3VsZSAvIGRlbm9taW5hdG9yO1xuICAgICAgICAgICAgLy8geVxuICAgICAgICAgICAgeU1vbGVjdWxlICo9IHZwYXJhbTtcbiAgICAgICAgICAgIHlNb2xlY3VsZSArPSBwYXJhbSAqIHJlY2lSICogdlsxXSAqIHJlY2lPRGlzO1xuICAgICAgICAgICAgdlsxXSA9IHlNb2xlY3VsZSAvIGRlbm9taW5hdG9yO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZUlkZWFsRGlzTWF0cml4KCkge1xuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAgICAgY29uc3Qgbm9kZXMgPSBzZWxmLm5vZGVzO1xuICAgICAgICBpZiAoIW5vZGVzKVxuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICBjb25zdCBEID0gc2VsZi5kaXN0YW5jZXM7XG4gICAgICAgIGNvbnN0IGxpbmtEaXMgPSBzZWxmLmxpbmtEaXN0YW5jZTtcbiAgICAgICAgY29uc3QgcmFkaWkgPSBzZWxmLnJhZGlpIHx8IFtdO1xuICAgICAgICBjb25zdCB1bml0UmFkaXVzID0gc2VsZi51bml0UmFkaXVzIHx8IDUwO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICAgICAgaWYgKEQpIHtcbiAgICAgICAgICAgIEQuZm9yRWFjaCgocm93LCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3Um93ID0gW107XG4gICAgICAgICAgICAgICAgcm93LmZvckVhY2goKHYsIGopID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT09IGopIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1Jvdy5wdXNoKDApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJhZGlpW2ldID09PSByYWRpaVtqXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaSBhbmQgaiBhcmUgb24gdGhlIHNhbWUgY2lyY2xlXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5zb3J0QnkgPT09IFwiZGF0YVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc29ydCB0aGUgbm9kZXMgb24gdGhlIHNhbWUgY2lyY2xlIGFjY29yZGluZyB0byB0aGUgb3JkZXJpbmcgb2YgdGhlIGRhdGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdSb3cucHVzaCgodiAqIChNYXRoLmFicyhpIC0gaikgKiBzZWxmLnNvcnRTdHJlbmd0aCkpIC9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJhZGlpW2ldIC8gdW5pdFJhZGl1cykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc2VsZi5zb3J0QnkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzb3J0IHRoZSBub2RlcyBvbiB0aGUgc2FtZSBjaXJjbGUgYWNjb3JkaW5nIHRvIHRoZSBhdHRyaWJ1dGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGlWYWx1ZSA9IG5vZGVzW2ldW3NlbGYuc29ydEJ5XSB8fCAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBqVmFsdWUgPSBub2Rlc1tqXVtzZWxmLnNvcnRCeV0gfHwgMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNTdHJpbmcoaVZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpVmFsdWUgPSBpVmFsdWUuY2hhckNvZGVBdCgwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzU3RyaW5nKGpWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbHVlID0galZhbHVlLmNoYXJDb2RlQXQoMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1Jvdy5wdXNoKCh2ICogKE1hdGguYWJzKGlWYWx1ZSAtIGpWYWx1ZSkgKiBzZWxmLnNvcnRTdHJlbmd0aCkpIC9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJhZGlpW2ldIC8gdW5pdFJhZGl1cykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Um93LnB1c2goKHYgKiBsaW5rRGlzKSAvIChyYWRpaVtpXSAvIHVuaXRSYWRpdXMpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGkgYW5kIGogYXJlIG9uIGRpZmZlcmVudCBjaXJjbGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGkgYW5kIGogYXJlIG9uIGRpZmZlcmVudCBjaXJjbGVcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpbmsgPSAobGlua0RpcyArIHVuaXRSYWRpdXMpIC8gMjtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1Jvdy5wdXNoKHYgKiBsaW5rKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5ld1Jvdyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBoYW5kbGVJbmZpbml0eShtYXRyaXgsIGZvY3VzSW5kZXgsIHN0ZXApIHtcbiAgICAgICAgY29uc3QgbGVuZ3RoID0gbWF0cml4Lmxlbmd0aDtcbiAgICAgICAgLy8g6YGN5Y6GIG1hdHJpeCDkuK3pgY3ljoYgZm9jdXMg5a+55bqU6KGMXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIC8vIG1hdHJpeCDlhbPms6jngrnlr7nlupTooYznmoQgSW5mIOmhuVxuICAgICAgICAgICAgaWYgKG1hdHJpeFtmb2N1c0luZGV4XVtpXSA9PT0gSW5maW5pdHkpIHtcbiAgICAgICAgICAgICAgICBtYXRyaXhbZm9jdXNJbmRleF1baV0gPSBzdGVwO1xuICAgICAgICAgICAgICAgIG1hdHJpeFtpXVtmb2N1c0luZGV4XSA9IHN0ZXA7XG4gICAgICAgICAgICAgICAgLy8g6YGN5Y6GIG1hdHJpeCDkuK3nmoQgaSDooYzvvIxpIOihjOS4remdniBJbmYg6aG56Iul5ZyoIGZvY3VzIOihjOS4uiBJbmbvvIzliJnmm7/mjaIgZm9jdXMg6KGM55qE6YKj5LiqIEluZlxuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1hdHJpeFtpXVtqXSAhPT0gSW5maW5pdHkgJiYgbWF0cml4W2ZvY3VzSW5kZXhdW2pdID09PSBJbmZpbml0eSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWF0cml4W2ZvY3VzSW5kZXhdW2pdID0gc3RlcCArIG1hdHJpeFtpXVtqXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdHJpeFtqXVtmb2N1c0luZGV4XSA9IHN0ZXAgKyBtYXRyaXhbaV1bal07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8g5aSE55CG5YW25LuW6KGM55qEIEluZuOAguagueaNruivpeihjOWvueW6lOeCueS4jiBmb2N1cyDot53nprvku6Xlj4ogSW5mIOmhueeCuSDkuI4gZm9jdXMg6Led56a777yM5Yaz5a6a5pu/5o2i5YC8XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChpID09PSBmb2N1c0luZGV4KSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1hdHJpeFtpXVtqXSA9PT0gSW5maW5pdHkpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1pbnVzID0gTWF0aC5hYnMobWF0cml4W2ZvY3VzSW5kZXhdW2ldIC0gbWF0cml4W2ZvY3VzSW5kZXhdW2pdKTtcbiAgICAgICAgICAgICAgICAgICAgbWludXMgPSBtaW51cyA9PT0gMCA/IDEgOiBtaW51cztcbiAgICAgICAgICAgICAgICAgICAgbWF0cml4W2ldW2pdID0gbWludXM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIG1heFRvRm9jdXMobWF0cml4LCBmb2N1c0luZGV4KSB7XG4gICAgICAgIGxldCBtYXggPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1hdHJpeFtmb2N1c0luZGV4XS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKG1hdHJpeFtmb2N1c0luZGV4XVtpXSA9PT0gSW5maW5pdHkpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG1heCA9IG1hdHJpeFtmb2N1c0luZGV4XVtpXSA+IG1heCA/IG1hdHJpeFtmb2N1c0luZGV4XVtpXSA6IG1heDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWF4O1xuICAgIH1cbiAgICBnZXRUeXBlKCkge1xuICAgICAgICByZXR1cm4gXCJyYWRpYWxcIjtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yYWRpYWwuanMubWFwIiwiZXhwb3J0ICogZnJvbSAnLi9yYWRpYWwnO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiLyoqXG4gKiBAZmlsZU92ZXJ2aWV3IGNvbmNlbnRyaWMgbGF5b3V0XG4gKiBAYXV0aG9yIHNoaXd1Lnd5eUBhbnRmaW4uY29tXG4gKiB0aGlzIGFsZ29yaXRobSByZWZlcnMgdG8gPGN5dG9zY2FwZS5qcz4gLSBodHRwczovL2dpdGh1Yi5jb20vY3l0b3NjYXBlL2N5dG9zY2FwZS5qcy9cbiAqL1xuaW1wb3J0IHsgaXNTdHJpbmcsIGlzQXJyYXksIGlzTnVtYmVyLCBnZXREZWdyZWUsIGlzT2JqZWN0IH0gZnJvbSBcIi4uL3V0aWxcIjtcbmltcG9ydCB7IEJhc2UgfSBmcm9tIFwiLi9iYXNlXCI7XG4vKipcbiAqIOWQjOW/g+WchuW4g+WxgFxuICovXG5leHBvcnQgY2xhc3MgQ29uY2VudHJpY0xheW91dCBleHRlbmRzIEJhc2Uge1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5ub2RlU2l6ZSA9IDMwO1xuICAgICAgICAvKiogbWluIHNwYWNpbmcgYmV0d2VlbiBvdXRzaWRlIG9mIG5vZGVzICh1c2VkIGZvciByYWRpdXMgYWRqdXN0bWVudCkgKi9cbiAgICAgICAgdGhpcy5taW5Ob2RlU3BhY2luZyA9IDEwO1xuICAgICAgICAvKiogcHJldmVudHMgbm9kZSBvdmVybGFwLCBtYXkgb3ZlcmZsb3cgYm91bmRpbmdCb3ggaWYgbm90IGVub3VnaCBzcGFjZSAqL1xuICAgICAgICB0aGlzLnByZXZlbnRPdmVybGFwID0gZmFsc2U7XG4gICAgICAgIC8qKiB3aGV0aGVyIGxldmVscyBoYXZlIGFuIGVxdWFsIHJhZGlhbCBkaXN0YW5jZSBiZXR3ZW4gdGhlbSwgbWF5IGNhdXNlIGJvdW5kaW5nIGJveCBvdmVyZmxvdyAqL1xuICAgICAgICB0aGlzLmVxdWlkaXN0YW50ID0gZmFsc2U7XG4gICAgICAgIC8qKiB3aGVyZSBub2RlcyBzdGFydCBpbiByYWRpYW5zICovXG4gICAgICAgIHRoaXMuc3RhcnRBbmdsZSA9ICgzIC8gMikgKiBNYXRoLlBJO1xuICAgICAgICAvKiogd2hldGhlciB0aGUgbGF5b3V0IHNob3VsZCBnbyBjbG9ja3dpc2UgKHRydWUpIG9yIGNvdW50ZXJjbG9ja3dpc2UvYW50aWNsb2Nrd2lzZSAoZmFsc2UpICovXG4gICAgICAgIHRoaXMuY2xvY2t3aXNlID0gdHJ1ZTtcbiAgICAgICAgLyoqIOagueaNriBzb3J0Qnkg5oyH5a6a55qE5bGe5oCn6L+b6KGM5o6S5biD77yM5pWw5YC86auY55qE5pS+5Zyo5Lit5b+D77yM5aaC5p6c5pivIHNvcnRCeSDliJnkvJrorqHnrpfoioLngrnluqbmlbDvvIzluqbmlbDmnIDpq5jnmoTmlL7lnKjkuK3lv4MgKi9cbiAgICAgICAgdGhpcy5zb3J0QnkgPSBcImRlZ3JlZVwiO1xuICAgICAgICB0aGlzLm5vZGVzID0gW107XG4gICAgICAgIHRoaXMuZWRnZXMgPSBbXTtcbiAgICAgICAgdGhpcy53aWR0aCA9IDMwMDtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSAzMDA7XG4gICAgICAgIC8qKiDov63ku6Pnu5PmnZ/nmoTlm57osIPlh73mlbAgKi9cbiAgICAgICAgdGhpcy5vbkxheW91dEVuZCA9ICgpID0+IHsgfTtcbiAgICAgICAgdGhpcy51cGRhdGVDZmcob3B0aW9ucyk7XG4gICAgfVxuICAgIGdldERlZmF1bHRDZmcoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBub2RlU2l6ZTogMzAsXG4gICAgICAgICAgICBtaW5Ob2RlU3BhY2luZzogMTAsXG4gICAgICAgICAgICBwcmV2ZW50T3ZlcmxhcDogZmFsc2UsXG4gICAgICAgICAgICBzd2VlcDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgZXF1aWRpc3RhbnQ6IGZhbHNlLFxuICAgICAgICAgICAgc3RhcnRBbmdsZTogKDMgLyAyKSAqIE1hdGguUEksXG4gICAgICAgICAgICBjbG9ja3dpc2U6IHRydWUsXG4gICAgICAgICAgICBtYXhMZXZlbERpZmY6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHNvcnRCeTogXCJkZWdyZWVcIlxuICAgICAgICB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiDmiafooYzluIPlsYBcbiAgICAgKi9cbiAgICBleGVjdXRlKCkge1xuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAgICAgY29uc3Qgbm9kZXMgPSBzZWxmLm5vZGVzO1xuICAgICAgICBjb25zdCBlZGdlcyA9IHNlbGYuZWRnZXM7XG4gICAgICAgIGNvbnN0IG4gPSBub2Rlcy5sZW5ndGg7XG4gICAgICAgIGlmIChuID09PSAwKSB7XG4gICAgICAgICAgICBpZiAoc2VsZi5vbkxheW91dEVuZClcbiAgICAgICAgICAgICAgICBzZWxmLm9uTGF5b3V0RW5kKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzZWxmLndpZHRoICYmIHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIHNlbGYud2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXNlbGYuaGVpZ2h0ICYmIHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIHNlbGYuaGVpZ2h0ID0gd2luZG93LmlubmVySGVpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIGlmICghc2VsZi5jZW50ZXIpIHtcbiAgICAgICAgICAgIHNlbGYuY2VudGVyID0gW3NlbGYud2lkdGggLyAyLCBzZWxmLmhlaWdodCAvIDJdO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNlbnRlciA9IHNlbGYuY2VudGVyO1xuICAgICAgICBpZiAobiA9PT0gMSkge1xuICAgICAgICAgICAgbm9kZXNbMF0ueCA9IGNlbnRlclswXTtcbiAgICAgICAgICAgIG5vZGVzWzBdLnkgPSBjZW50ZXJbMV07XG4gICAgICAgICAgICBpZiAoc2VsZi5vbkxheW91dEVuZClcbiAgICAgICAgICAgICAgICBzZWxmLm9uTGF5b3V0RW5kKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbGF5b3V0Tm9kZXMgPSBbXTtcbiAgICAgICAgbGV0IG1heE5vZGVTaXplO1xuICAgICAgICBpZiAoaXNBcnJheShzZWxmLm5vZGVTaXplKSkge1xuICAgICAgICAgICAgbWF4Tm9kZVNpemUgPSBNYXRoLm1heChzZWxmLm5vZGVTaXplWzBdLCBzZWxmLm5vZGVTaXplWzFdKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG1heE5vZGVTaXplID0gc2VsZi5ub2RlU2l6ZTtcbiAgICAgICAgfVxuICAgICAgICBub2Rlcy5mb3JFYWNoKChub2RlKSA9PiB7XG4gICAgICAgICAgICBsYXlvdXROb2Rlcy5wdXNoKG5vZGUpO1xuICAgICAgICAgICAgbGV0IG5vZGVTaXplID0gbWF4Tm9kZVNpemU7XG4gICAgICAgICAgICBpZiAoaXNBcnJheShub2RlLnNpemUpKSB7XG4gICAgICAgICAgICAgICAgbm9kZVNpemUgPSBNYXRoLm1heChub2RlLnNpemVbMF0sIG5vZGUuc2l6ZVsxXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpc051bWJlcihub2RlLnNpemUpKSB7XG4gICAgICAgICAgICAgICAgbm9kZVNpemUgPSBub2RlLnNpemU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpc09iamVjdChub2RlLnNpemUpKSB7XG4gICAgICAgICAgICAgICAgbm9kZVNpemUgPSBNYXRoLm1heChub2RlLnNpemUud2lkdGgsIG5vZGUuc2l6ZS5oZWlnaHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbWF4Tm9kZVNpemUgPSBNYXRoLm1heChtYXhOb2RlU2l6ZSwgbm9kZVNpemUpO1xuICAgICAgICB9KTtcbiAgICAgICAgc2VsZi5jbG9ja3dpc2UgPVxuICAgICAgICAgICAgc2VsZi5jb3VudGVyY2xvY2t3aXNlICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICA/ICFzZWxmLmNvdW50ZXJjbG9ja3dpc2VcbiAgICAgICAgICAgICAgICA6IHNlbGYuY2xvY2t3aXNlO1xuICAgICAgICAvLyBsYXlvdXRcbiAgICAgICAgY29uc3Qgbm9kZU1hcCA9IHt9O1xuICAgICAgICBjb25zdCBpbmRleE1hcCA9IHt9O1xuICAgICAgICBsYXlvdXROb2Rlcy5mb3JFYWNoKChub2RlLCBpKSA9PiB7XG4gICAgICAgICAgICBub2RlTWFwW25vZGUuaWRdID0gbm9kZTtcbiAgICAgICAgICAgIGluZGV4TWFwW25vZGUuaWRdID0gaTtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGdldCB0aGUgbm9kZSBkZWdyZWVzXG4gICAgICAgIGlmIChzZWxmLnNvcnRCeSA9PT0gXCJkZWdyZWVcIiB8fFxuICAgICAgICAgICAgIWlzU3RyaW5nKHNlbGYuc29ydEJ5KSB8fFxuICAgICAgICAgICAgbGF5b3V0Tm9kZXNbMF1bc2VsZi5zb3J0QnldID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHNlbGYuc29ydEJ5ID0gXCJkZWdyZWVcIjtcbiAgICAgICAgICAgIGlmICghaXNOdW1iZXIobm9kZXNbMF0uZGVncmVlKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IGdldERlZ3JlZShub2Rlcy5sZW5ndGgsIGluZGV4TWFwLCBlZGdlcyk7XG4gICAgICAgICAgICAgICAgbGF5b3V0Tm9kZXMuZm9yRWFjaCgobm9kZSwgaSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBub2RlLmRlZ3JlZSA9IHZhbHVlc1tpXTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBzb3J0IG5vZGVzIGJ5IHZhbHVlXG4gICAgICAgIGxheW91dE5vZGVzLnNvcnQoKG4xLCBuMikgPT4gbjJbc2VsZi5zb3J0QnldIC0gbjFbc2VsZi5zb3J0QnldKTtcbiAgICAgICAgc2VsZi5tYXhWYWx1ZU5vZGUgPSBsYXlvdXROb2Rlc1swXTtcbiAgICAgICAgc2VsZi5tYXhMZXZlbERpZmYgPVxuICAgICAgICAgICAgc2VsZi5tYXhMZXZlbERpZmYgfHwgc2VsZi5tYXhWYWx1ZU5vZGVbc2VsZi5zb3J0QnldIC8gNDtcbiAgICAgICAgLy8gcHV0IHRoZSB2YWx1ZXMgaW50byBsZXZlbHNcbiAgICAgICAgY29uc3QgbGV2ZWxzID0gW1tdXTtcbiAgICAgICAgbGV0IGN1cnJlbnRMZXZlbCA9IGxldmVsc1swXTtcbiAgICAgICAgbGF5b3V0Tm9kZXMuZm9yRWFjaCgobm9kZSkgPT4ge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRMZXZlbC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGlmZiA9IE1hdGguYWJzKGN1cnJlbnRMZXZlbFswXVtzZWxmLnNvcnRCeV0gLSBub2RlW3NlbGYuc29ydEJ5XSk7XG4gICAgICAgICAgICAgICAgaWYgKHNlbGYubWF4TGV2ZWxEaWZmICYmIGRpZmYgPj0gc2VsZi5tYXhMZXZlbERpZmYpIHtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudExldmVsID0gW107XG4gICAgICAgICAgICAgICAgICAgIGxldmVscy5wdXNoKGN1cnJlbnRMZXZlbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY3VycmVudExldmVsLnB1c2gobm9kZSk7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBjcmVhdGUgcG9zaXRpb25zIGZvciBsZXZlbHNcbiAgICAgICAgbGV0IG1pbkRpc3QgPSBtYXhOb2RlU2l6ZSArIHNlbGYubWluTm9kZVNwYWNpbmc7IC8vIG1pbiBkaXN0IGJldHdlZW4gbm9kZXNcbiAgICAgICAgaWYgKCFzZWxmLnByZXZlbnRPdmVybGFwKSB7XG4gICAgICAgICAgICAvLyB0aGVuIHN0cmljdGx5IGNvbnN0cmFpbiB0byBiYlxuICAgICAgICAgICAgY29uc3QgZmlyc3RMdmxIYXNNdWx0aSA9IGxldmVscy5sZW5ndGggPiAwICYmIGxldmVsc1swXS5sZW5ndGggPiAxO1xuICAgICAgICAgICAgY29uc3QgbWF4UiA9IE1hdGgubWluKHNlbGYud2lkdGgsIHNlbGYuaGVpZ2h0KSAvIDIgLSBtaW5EaXN0O1xuICAgICAgICAgICAgY29uc3QgclN0ZXAgPSBtYXhSIC8gKGxldmVscy5sZW5ndGggKyAoZmlyc3RMdmxIYXNNdWx0aSA/IDEgOiAwKSk7XG4gICAgICAgICAgICBtaW5EaXN0ID0gTWF0aC5taW4obWluRGlzdCwgclN0ZXApO1xuICAgICAgICB9XG4gICAgICAgIC8vIGZpbmQgdGhlIG1ldHJpY3MgZm9yIGVhY2ggbGV2ZWxcbiAgICAgICAgbGV0IHIgPSAwO1xuICAgICAgICBsZXZlbHMuZm9yRWFjaCgobGV2ZWwpID0+IHtcbiAgICAgICAgICAgIGxldCBzd2VlcCA9IHNlbGYuc3dlZXA7XG4gICAgICAgICAgICBpZiAoc3dlZXAgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHN3ZWVwID0gMiAqIE1hdGguUEkgLSAoMiAqIE1hdGguUEkpIC8gbGV2ZWwubGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZFRoZXRhID0gKGxldmVsLmRUaGV0YSA9IHN3ZWVwIC8gTWF0aC5tYXgoMSwgbGV2ZWwubGVuZ3RoIC0gMSkpO1xuICAgICAgICAgICAgLy8gY2FsY3VsYXRlIHRoZSByYWRpdXNcbiAgICAgICAgICAgIGlmIChsZXZlbC5sZW5ndGggPiAxICYmIHNlbGYucHJldmVudE92ZXJsYXApIHtcbiAgICAgICAgICAgICAgICAvLyBidXQgb25seSBpZiBtb3JlIHRoYW4gb25lIG5vZGUgKGNhbid0IG92ZXJsYXApXG4gICAgICAgICAgICAgICAgY29uc3QgZGNvcyA9IE1hdGguY29zKGRUaGV0YSkgLSBNYXRoLmNvcygwKTtcbiAgICAgICAgICAgICAgICBjb25zdCBkc2luID0gTWF0aC5zaW4oZFRoZXRhKSAtIE1hdGguc2luKDApO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJNaW4gPSBNYXRoLnNxcnQoKG1pbkRpc3QgKiBtaW5EaXN0KSAvIChkY29zICogZGNvcyArIGRzaW4gKiBkc2luKSk7IC8vIHMudC4gbm8gbm9kZXMgb3ZlcmxhcHBpbmdcbiAgICAgICAgICAgICAgICByID0gTWF0aC5tYXgock1pbiwgcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXZlbC5yID0gcjtcbiAgICAgICAgICAgIHIgKz0gbWluRGlzdDtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChzZWxmLmVxdWlkaXN0YW50KSB7XG4gICAgICAgICAgICBsZXQgckRlbHRhTWF4ID0gMDtcbiAgICAgICAgICAgIGxldCByciA9IDA7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxldmVscy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxldmVsID0gbGV2ZWxzW2ldO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJEZWx0YSA9IGxldmVsLnIgLSBycjtcbiAgICAgICAgICAgICAgICByRGVsdGFNYXggPSBNYXRoLm1heChyRGVsdGFNYXgsIHJEZWx0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByciA9IDA7XG4gICAgICAgICAgICBsZXZlbHMuZm9yRWFjaCgobGV2ZWwsIGkpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICByciA9IGxldmVsLnI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldmVsLnIgPSBycjtcbiAgICAgICAgICAgICAgICByciArPSByRGVsdGFNYXg7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBjYWxjdWxhdGUgdGhlIG5vZGUgcG9zaXRpb25zXG4gICAgICAgIGxldmVscy5mb3JFYWNoKChsZXZlbCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZFRoZXRhID0gbGV2ZWwuZFRoZXRhO1xuICAgICAgICAgICAgY29uc3QgcnIgPSBsZXZlbC5yO1xuICAgICAgICAgICAgbGV2ZWwuZm9yRWFjaCgobm9kZSwgaikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRoZXRhID0gc2VsZi5zdGFydEFuZ2xlICsgKHNlbGYuY2xvY2t3aXNlID8gMSA6IC0xKSAqIGRUaGV0YSAqIGo7XG4gICAgICAgICAgICAgICAgbm9kZS54ID0gY2VudGVyWzBdICsgcnIgKiBNYXRoLmNvcyh0aGV0YSk7XG4gICAgICAgICAgICAgICAgbm9kZS55ID0gY2VudGVyWzFdICsgcnIgKiBNYXRoLnNpbih0aGV0YSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChzZWxmLm9uTGF5b3V0RW5kKVxuICAgICAgICAgICAgc2VsZi5vbkxheW91dEVuZCgpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbm9kZXMsXG4gICAgICAgICAgICBlZGdlc1xuICAgICAgICB9O1xuICAgIH1cbiAgICBnZXRUeXBlKCkge1xuICAgICAgICByZXR1cm4gXCJjb25jZW50cmljXCI7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29uY2VudHJpYy5qcy5tYXAiLCIvKipcbiAqIEBmaWxlT3ZlcnZpZXcgTURTIGxheW91dFxuICogQGF1dGhvciBzaGl3dS53eXlAYW50ZmluLmNvbVxuICovXG5pbXBvcnQgeyBNYXRyaXggYXMgTUxNYXRyaXgsIFNpbmd1bGFyVmFsdWVEZWNvbXBvc2l0aW9uIH0gZnJvbSBcIm1sLW1hdHJpeFwiO1xuaW1wb3J0IHsgZmxveWRXYXJzaGFsbCwgZ2V0QWRqTWF0cml4LCBzY2FsZU1hdHJpeCB9IGZyb20gXCIuLi91dGlsXCI7XG5pbXBvcnQgeyBCYXNlIH0gZnJvbSBcIi4vYmFzZVwiO1xuLyoqXG4gKiBtZHMg5biD5bGAXG4gKi9cbmV4cG9ydCBjbGFzcyBNRFNMYXlvdXQgZXh0ZW5kcyBCYXNlIHtcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIC8qKiDluIPlsYDkuK3lv4MgKi9cbiAgICAgICAgdGhpcy5jZW50ZXIgPSBbMCwgMF07XG4gICAgICAgIC8qKiDovrnplb/luqYgKi9cbiAgICAgICAgdGhpcy5saW5rRGlzdGFuY2UgPSA1MDtcbiAgICAgICAgdGhpcy5ub2RlcyA9IFtdO1xuICAgICAgICB0aGlzLmVkZ2VzID0gW107XG4gICAgICAgIC8qKiDov63ku6Pnu5PmnZ/nmoTlm57osIPlh73mlbAgKi9cbiAgICAgICAgdGhpcy5vbkxheW91dEVuZCA9ICgpID0+IHsgfTtcbiAgICAgICAgdGhpcy51cGRhdGVDZmcob3B0aW9ucyk7XG4gICAgfVxuICAgIGdldERlZmF1bHRDZmcoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjZW50ZXI6IFswLCAwXSxcbiAgICAgICAgICAgIGxpbmtEaXN0YW5jZTogNTBcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICog5omn6KGM5biD5bGAXG4gICAgICovXG4gICAgZXhlY3V0ZSgpIHtcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICAgIGNvbnN0IHsgbm9kZXMsIGVkZ2VzID0gW10gfSA9IHNlbGY7XG4gICAgICAgIGNvbnN0IGNlbnRlciA9IHNlbGYuY2VudGVyO1xuICAgICAgICBpZiAoIW5vZGVzIHx8IG5vZGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgaWYgKHNlbGYub25MYXlvdXRFbmQpXG4gICAgICAgICAgICAgICAgc2VsZi5vbkxheW91dEVuZCgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2Rlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIG5vZGVzWzBdLnggPSBjZW50ZXJbMF07XG4gICAgICAgICAgICBub2Rlc1swXS55ID0gY2VudGVyWzFdO1xuICAgICAgICAgICAgaWYgKHNlbGYub25MYXlvdXRFbmQpXG4gICAgICAgICAgICAgICAgc2VsZi5vbkxheW91dEVuZCgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxpbmtEaXN0YW5jZSA9IHNlbGYubGlua0Rpc3RhbmNlO1xuICAgICAgICAvLyB0aGUgZ3JhcGgtdGhlb3JldGljIGRpc3RhbmNlIChzaG9ydGVzdCBwYXRoIGRpc3RhbmNlKSBtYXRyaXhcbiAgICAgICAgY29uc3QgYWRqTWF0cml4ID0gZ2V0QWRqTWF0cml4KHsgbm9kZXMsIGVkZ2VzIH0sIGZhbHNlKTtcbiAgICAgICAgY29uc3QgZGlzdGFuY2VzID0gZmxveWRXYXJzaGFsbChhZGpNYXRyaXgpO1xuICAgICAgICBzZWxmLmhhbmRsZUluZmluaXR5KGRpc3RhbmNlcyk7XG4gICAgICAgIC8vIHNjYWxlIHRoZSBpZGVhbCBlZGdlIGxlbmd0aCBhY29vcmRpbmcgdG8gbGlua0Rpc3RhbmNlXG4gICAgICAgIGNvbnN0IHNjYWxlZEQgPSBzY2FsZU1hdHJpeChkaXN0YW5jZXMsIGxpbmtEaXN0YW5jZSk7XG4gICAgICAgIHNlbGYuc2NhbGVkRGlzdGFuY2VzID0gc2NhbGVkRDtcbiAgICAgICAgLy8gZ2V0IHBvc2l0aW9ucyBieSBNRFNcbiAgICAgICAgY29uc3QgcG9zaXRpb25zID0gc2VsZi5ydW5NRFMoKTtcbiAgICAgICAgc2VsZi5wb3NpdGlvbnMgPSBwb3NpdGlvbnM7XG4gICAgICAgIHBvc2l0aW9ucy5mb3JFYWNoKChwLCBpKSA9PiB7XG4gICAgICAgICAgICBub2Rlc1tpXS54ID0gcFswXSArIGNlbnRlclswXTtcbiAgICAgICAgICAgIG5vZGVzW2ldLnkgPSBwWzFdICsgY2VudGVyWzFdO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHNlbGYub25MYXlvdXRFbmQpXG4gICAgICAgICAgICBzZWxmLm9uTGF5b3V0RW5kKCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBub2RlcyxcbiAgICAgICAgICAgIGVkZ2VzXG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIG1kcyDnrpfms5VcbiAgICAgKiBAcmV0dXJuIHthcnJheX0gcG9zaXRpb25zIOiuoeeul+WQjueahOiKgueCueS9jee9ruaVsOe7hFxuICAgICAqL1xuICAgIHJ1bk1EUygpIHtcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICAgIGNvbnN0IGRpbWVuc2lvbiA9IDI7XG4gICAgICAgIGNvbnN0IGRpc3RhbmNlcyA9IHNlbGYuc2NhbGVkRGlzdGFuY2VzO1xuICAgICAgICAvLyBzcXVhcmUgZGlzdGFuY2VzXG4gICAgICAgIGNvbnN0IE0gPSBNTE1hdHJpeC5tdWwoTUxNYXRyaXgucG93KGRpc3RhbmNlcywgMiksIC0wLjUpO1xuICAgICAgICAvLyBkb3VibGUgY2VudHJlIHRoZSByb3dzL2NvbHVtbnNcbiAgICAgICAgY29uc3Qgcm93TWVhbnMgPSBNLm1lYW4oXCJyb3dcIik7XG4gICAgICAgIGNvbnN0IGNvbE1lYW5zID0gTS5tZWFuKFwiY29sdW1uXCIpO1xuICAgICAgICBjb25zdCB0b3RhbE1lYW4gPSBNLm1lYW4oKTtcbiAgICAgICAgTS5hZGQodG90YWxNZWFuKVxuICAgICAgICAgICAgLnN1YlJvd1ZlY3Rvcihyb3dNZWFucylcbiAgICAgICAgICAgIC5zdWJDb2x1bW5WZWN0b3IoY29sTWVhbnMpO1xuICAgICAgICAvLyB0YWtlIHRoZSBTVkQgb2YgdGhlIGRvdWJsZSBjZW50cmVkIG1hdHJpeCwgYW5kIHJldHVybiB0aGVcbiAgICAgICAgLy8gcG9pbnRzIGZyb20gaXRcbiAgICAgICAgY29uc3QgcmV0ID0gbmV3IFNpbmd1bGFyVmFsdWVEZWNvbXBvc2l0aW9uKE0pO1xuICAgICAgICBjb25zdCBlaWdlblZhbHVlcyA9IE1MTWF0cml4LnNxcnQocmV0LmRpYWdvbmFsTWF0cml4KS5kaWFnb25hbCgpO1xuICAgICAgICByZXR1cm4gcmV0LmxlZnRTaW5ndWxhclZlY3RvcnMudG9KU09OKCkubWFwKChyb3cpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBNTE1hdHJpeC5tdWwoW3Jvd10sIFtlaWdlblZhbHVlc10pXG4gICAgICAgICAgICAgICAgLnRvSlNPTigpWzBdXG4gICAgICAgICAgICAgICAgLnNwbGljZSgwLCBkaW1lbnNpb24pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgaGFuZGxlSW5maW5pdHkoZGlzdGFuY2VzKSB7XG4gICAgICAgIGxldCBtYXhEaXN0YW5jZSA9IC05OTk5OTk7XG4gICAgICAgIGRpc3RhbmNlcy5mb3JFYWNoKChyb3cpID0+IHtcbiAgICAgICAgICAgIHJvdy5mb3JFYWNoKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gSW5maW5pdHkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobWF4RGlzdGFuY2UgPCB2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBtYXhEaXN0YW5jZSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgZGlzdGFuY2VzLmZvckVhY2goKHJvdywgaSkgPT4ge1xuICAgICAgICAgICAgcm93LmZvckVhY2goKHZhbHVlLCBqKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSBJbmZpbml0eSkge1xuICAgICAgICAgICAgICAgICAgICBkaXN0YW5jZXNbaV1bal0gPSBtYXhEaXN0YW5jZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGdldFR5cGUoKSB7XG4gICAgICAgIHJldHVybiBcIm1kc1wiO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1kcy5qcy5tYXAiLCIvKipcbiAqIEBmaWxlT3ZlcnZpZXcgZnJ1Y2h0ZXJtYW4gbGF5b3V0XG4gKiBAYXV0aG9yIHNoaXd1Lnd5eUBhbnRmaW4uY29tXG4gKi9cbmltcG9ydCB7IEJhc2UgfSBmcm9tIFwiLi9iYXNlXCI7XG5pbXBvcnQgeyBnZXRFZGdlVGVybWluYWwsIGlzTnVtYmVyIH0gZnJvbSBcIi4uL3V0aWxcIjtcbmNvbnN0IFNQRUVEX0RJVklTT1IgPSA4MDA7XG4vKipcbiAqIGZydWNodGVybWFuIOW4g+WxgFxuICovXG5leHBvcnQgY2xhc3MgRnJ1Y2h0ZXJtYW5MYXlvdXQgZXh0ZW5kcyBCYXNlIHtcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIC8qKiDlgZzmraLov63ku6PnmoTmnIDlpKfov63ku6PmlbAgKi9cbiAgICAgICAgdGhpcy5tYXhJdGVyYXRpb24gPSAxMDAwO1xuICAgICAgICAvKiog5piv5ZCm5ZCv5YqoIHdvcmtlciAqL1xuICAgICAgICB0aGlzLndvcmtlckVuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgLyoqIOmHjeWKm+Wkp+Wwj++8jOW9seWTjeWbvueahOe0p+WHkeeoi+W6piAqL1xuICAgICAgICB0aGlzLmdyYXZpdHkgPSAxMDtcbiAgICAgICAgLyoqIOmAn+W6piAqL1xuICAgICAgICB0aGlzLnNwZWVkID0gNTtcbiAgICAgICAgLyoqIOaYr+WQpuS6p+eUn+iBmuexu+WKmyAqL1xuICAgICAgICB0aGlzLmNsdXN0ZXJpbmcgPSBmYWxzZTtcbiAgICAgICAgLyoqIOiBmuexu+WKm+Wkp+WwjyAqL1xuICAgICAgICB0aGlzLmNsdXN0ZXJHcmF2aXR5ID0gMTA7XG4gICAgICAgIHRoaXMubm9kZXMgPSBbXTtcbiAgICAgICAgdGhpcy5lZGdlcyA9IFtdO1xuICAgICAgICB0aGlzLndpZHRoID0gMzAwO1xuICAgICAgICB0aGlzLmhlaWdodCA9IDMwMDtcbiAgICAgICAgdGhpcy5ub2RlTWFwID0ge307XG4gICAgICAgIHRoaXMubm9kZUlkeE1hcCA9IHt9O1xuICAgICAgICAvKiog6L+t5Luj57uT5p2f55qE5Zue6LCD5Ye95pWwICovXG4gICAgICAgIHRoaXMub25MYXlvdXRFbmQgPSAoKSA9PiB7IH07XG4gICAgICAgIC8qKiDmr4/mrKHov63ku6Pnu5PmnZ/nmoTlm57osIPlh73mlbAgKi9cbiAgICAgICAgdGhpcy50aWNrID0gKCkgPT4geyB9O1xuICAgICAgICB0aGlzLnVwZGF0ZUNmZyhvcHRpb25zKTtcbiAgICB9XG4gICAgZ2V0RGVmYXVsdENmZygpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG1heEl0ZXJhdGlvbjogMTAwMCxcbiAgICAgICAgICAgIGdyYXZpdHk6IDEwLFxuICAgICAgICAgICAgc3BlZWQ6IDEsXG4gICAgICAgICAgICBjbHVzdGVyaW5nOiBmYWxzZSxcbiAgICAgICAgICAgIGNsdXN0ZXJHcmF2aXR5OiAxMFxuICAgICAgICB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiDmiafooYzluIPlsYBcbiAgICAgKi9cbiAgICBleGVjdXRlKCkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAgICAgY29uc3Qgbm9kZXMgPSBzZWxmLm5vZGVzO1xuICAgICAgICBpZiAoc2VsZi50aW1lSW50ZXJ2YWwgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICB3aW5kb3cuY2xlYXJJbnRlcnZhbChzZWxmLnRpbWVJbnRlcnZhbCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFub2RlcyB8fCBub2Rlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIChfYSA9IHNlbGYub25MYXlvdXRFbmQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jYWxsKHNlbGYpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghc2VsZi53aWR0aCAmJiB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICBzZWxmLndpZHRoID0gd2luZG93LmlubmVyV2lkdGg7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzZWxmLmhlaWdodCAmJiB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICBzZWxmLmhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXNlbGYuY2VudGVyKSB7XG4gICAgICAgICAgICBzZWxmLmNlbnRlciA9IFtzZWxmLndpZHRoIC8gMiwgc2VsZi5oZWlnaHQgLyAyXTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjZW50ZXIgPSBzZWxmLmNlbnRlcjtcbiAgICAgICAgaWYgKG5vZGVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgbm9kZXNbMF0ueCA9IGNlbnRlclswXTtcbiAgICAgICAgICAgIG5vZGVzWzBdLnkgPSBjZW50ZXJbMV07XG4gICAgICAgICAgICAoX2IgPSBzZWxmLm9uTGF5b3V0RW5kKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuY2FsbChzZWxmKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBub2RlTWFwID0ge307XG4gICAgICAgIGNvbnN0IG5vZGVJZHhNYXAgPSB7fTtcbiAgICAgICAgbm9kZXMuZm9yRWFjaCgobm9kZSwgaSkgPT4ge1xuICAgICAgICAgICAgaWYgKCFpc051bWJlcihub2RlLngpKVxuICAgICAgICAgICAgICAgIG5vZGUueCA9IE1hdGgucmFuZG9tKCkgKiB0aGlzLndpZHRoO1xuICAgICAgICAgICAgaWYgKCFpc051bWJlcihub2RlLnkpKVxuICAgICAgICAgICAgICAgIG5vZGUueSA9IE1hdGgucmFuZG9tKCkgKiB0aGlzLmhlaWdodDtcbiAgICAgICAgICAgIG5vZGVNYXBbbm9kZS5pZF0gPSBub2RlO1xuICAgICAgICAgICAgbm9kZUlkeE1hcFtub2RlLmlkXSA9IGk7XG4gICAgICAgIH0pO1xuICAgICAgICBzZWxmLm5vZGVNYXAgPSBub2RlTWFwO1xuICAgICAgICBzZWxmLm5vZGVJZHhNYXAgPSBub2RlSWR4TWFwO1xuICAgICAgICAvLyBsYXlvdXRcbiAgICAgICAgcmV0dXJuIHNlbGYucnVuKCk7XG4gICAgfVxuICAgIHJ1bigpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAgICAgY29uc3Qgbm9kZXMgPSBzZWxmLm5vZGVzO1xuICAgICAgICBpZiAoIW5vZGVzKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBjb25zdCB7IGVkZ2VzLCBtYXhJdGVyYXRpb24sIHdvcmtlckVuYWJsZWQgfSA9IHNlbGY7XG4gICAgICAgIGNvbnN0IGNsdXN0ZXJpbmcgPSBzZWxmLmNsdXN0ZXJpbmc7XG4gICAgICAgIGNvbnN0IGNsdXN0ZXJNYXAgPSB7fTtcbiAgICAgICAgaWYgKGNsdXN0ZXJpbmcpIHtcbiAgICAgICAgICAgIG5vZGVzLmZvckVhY2goKG4pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY2x1c3Rlck1hcFtuLmNsdXN0ZXJdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2x1c3RlciA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IG4uY2x1c3RlcixcbiAgICAgICAgICAgICAgICAgICAgICAgIGN4OiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgY3k6IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb3VudDogMFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBjbHVzdGVyTWFwW24uY2x1c3Rlcl0gPSBjbHVzdGVyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBjID0gY2x1c3Rlck1hcFtuLmNsdXN0ZXJdO1xuICAgICAgICAgICAgICAgIGlmIChpc051bWJlcihuLngpKSB7XG4gICAgICAgICAgICAgICAgICAgIGMuY3ggKz0gbi54O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaXNOdW1iZXIobi55KSkge1xuICAgICAgICAgICAgICAgICAgICBjLmN5ICs9IG4ueTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYy5jb3VudCsrO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBjbHVzdGVyTWFwKSB7XG4gICAgICAgICAgICAgICAgY2x1c3Rlck1hcFtrZXldLmN4IC89IGNsdXN0ZXJNYXBba2V5XS5jb3VudDtcbiAgICAgICAgICAgICAgICBjbHVzdGVyTWFwW2tleV0uY3kgLz0gY2x1c3Rlck1hcFtrZXldLmNvdW50O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh3b3JrZXJFbmFibGVkKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1heEl0ZXJhdGlvbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgc2VsZi5ydW5PbmVTdGVwKGNsdXN0ZXJNYXApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgKF9hID0gc2VsZi5vbkxheW91dEVuZCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNhbGwoc2VsZik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJ1bmRlZmluZWRcIilcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBsZXQgaXRlciA9IDA7XG4gICAgICAgICAgICAvLyBpbnRlcnZhbCBmb3IgcmVuZGVyIHRoZSByZXN1bHQgYWZ0ZXIgZWFjaCBpdGVyYXRpb25cbiAgICAgICAgICAgIHRoaXMudGltZUludGVydmFsID0gd2luZG93LnNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICAgICAgc2VsZi5ydW5PbmVTdGVwKGNsdXN0ZXJNYXApO1xuICAgICAgICAgICAgICAgIGl0ZXIrKztcbiAgICAgICAgICAgICAgICBpZiAoaXRlciA+PSBtYXhJdGVyYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgKF9hID0gc2VsZi5vbkxheW91dEVuZCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNhbGwoc2VsZik7XG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5jbGVhckludGVydmFsKHNlbGYudGltZUludGVydmFsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCAwKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbm9kZXMsXG4gICAgICAgICAgICBlZGdlc1xuICAgICAgICB9O1xuICAgIH1cbiAgICBydW5PbmVTdGVwKGNsdXN0ZXJNYXApIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAgICAgY29uc3Qgbm9kZXMgPSBzZWxmLm5vZGVzO1xuICAgICAgICBpZiAoIW5vZGVzKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBjb25zdCB7IGVkZ2VzLCBjZW50ZXIsIGdyYXZpdHksIHNwZWVkLCBjbHVzdGVyaW5nIH0gPSBzZWxmO1xuICAgICAgICBjb25zdCBhcmVhID0gc2VsZi5oZWlnaHQgKiBzZWxmLndpZHRoO1xuICAgICAgICBjb25zdCBtYXhEaXNwbGFjZSA9IE1hdGguc3FydChhcmVhKSAvIDEwO1xuICAgICAgICBjb25zdCBrMiA9IGFyZWEgLyAobm9kZXMubGVuZ3RoICsgMSk7XG4gICAgICAgIGNvbnN0IGsgPSBNYXRoLnNxcnQoazIpO1xuICAgICAgICBjb25zdCBkaXNwbGFjZW1lbnRzID0gW107XG4gICAgICAgIG5vZGVzLmZvckVhY2goKF8sIGopID0+IHtcbiAgICAgICAgICAgIGRpc3BsYWNlbWVudHNbal0gPSB7IHg6IDAsIHk6IDAgfTtcbiAgICAgICAgfSk7XG4gICAgICAgIHNlbGYuYXBwbHlDYWxjdWxhdGUobm9kZXMsIGVkZ2VzLCBkaXNwbGFjZW1lbnRzLCBrLCBrMik7XG4gICAgICAgIC8vIGdyYXZpdHkgZm9yIGNsdXN0ZXJzXG4gICAgICAgIGlmIChjbHVzdGVyaW5nKSB7XG4gICAgICAgICAgICBjb25zdCBjbHVzdGVyR3Jhdml0eSA9IHNlbGYuY2x1c3RlckdyYXZpdHkgfHwgZ3Jhdml0eTtcbiAgICAgICAgICAgIG5vZGVzLmZvckVhY2goKG4sIGopID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWlzTnVtYmVyKG4ueCkgfHwgIWlzTnVtYmVyKG4ueSkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICBjb25zdCBjID0gY2x1c3Rlck1hcFtuLmNsdXN0ZXJdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRpc3RMZW5ndGggPSBNYXRoLnNxcnQoKG4ueCAtIGMuY3gpICogKG4ueCAtIGMuY3gpICsgKG4ueSAtIGMuY3kpICogKG4ueSAtIGMuY3kpKTtcbiAgICAgICAgICAgICAgICBjb25zdCBncmF2aXR5Rm9yY2UgPSBrICogY2x1c3RlckdyYXZpdHk7XG4gICAgICAgICAgICAgICAgZGlzcGxhY2VtZW50c1tqXS54IC09IChncmF2aXR5Rm9yY2UgKiAobi54IC0gYy5jeCkpIC8gZGlzdExlbmd0aDtcbiAgICAgICAgICAgICAgICBkaXNwbGFjZW1lbnRzW2pdLnkgLT0gKGdyYXZpdHlGb3JjZSAqIChuLnkgLSBjLmN5KSkgLyBkaXN0TGVuZ3RoO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBjbHVzdGVyTWFwKSB7XG4gICAgICAgICAgICAgICAgY2x1c3Rlck1hcFtrZXldLmN4ID0gMDtcbiAgICAgICAgICAgICAgICBjbHVzdGVyTWFwW2tleV0uY3kgPSAwO1xuICAgICAgICAgICAgICAgIGNsdXN0ZXJNYXBba2V5XS5jb3VudCA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBub2Rlcy5mb3JFYWNoKChuKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgYyA9IGNsdXN0ZXJNYXBbbi5jbHVzdGVyXTtcbiAgICAgICAgICAgICAgICBpZiAoaXNOdW1iZXIobi54KSkge1xuICAgICAgICAgICAgICAgICAgICBjLmN4ICs9IG4ueDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGlzTnVtYmVyKG4ueSkpIHtcbiAgICAgICAgICAgICAgICAgICAgYy5jeSArPSBuLnk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGMuY291bnQrKztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gY2x1c3Rlck1hcCkge1xuICAgICAgICAgICAgICAgIGNsdXN0ZXJNYXBba2V5XS5jeCAvPSBjbHVzdGVyTWFwW2tleV0uY291bnQ7XG4gICAgICAgICAgICAgICAgY2x1c3Rlck1hcFtrZXldLmN5IC89IGNsdXN0ZXJNYXBba2V5XS5jb3VudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBncmF2aXR5XG4gICAgICAgIG5vZGVzLmZvckVhY2goKG4sIGopID0+IHtcbiAgICAgICAgICAgIGlmICghaXNOdW1iZXIobi54KSB8fCAhaXNOdW1iZXIobi55KSlcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBjb25zdCBncmF2aXR5Rm9yY2UgPSAwLjAxICogayAqIGdyYXZpdHk7XG4gICAgICAgICAgICBkaXNwbGFjZW1lbnRzW2pdLnggLT0gZ3Jhdml0eUZvcmNlICogKG4ueCAtIGNlbnRlclswXSk7XG4gICAgICAgICAgICBkaXNwbGFjZW1lbnRzW2pdLnkgLT0gZ3Jhdml0eUZvcmNlICogKG4ueSAtIGNlbnRlclsxXSk7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBtb3ZlXG4gICAgICAgIG5vZGVzLmZvckVhY2goKG4sIGopID0+IHtcbiAgICAgICAgICAgIGlmIChpc051bWJlcihuLmZ4KSAmJiBpc051bWJlcihuLmZ5KSkge1xuICAgICAgICAgICAgICAgIG4ueCA9IG4uZng7XG4gICAgICAgICAgICAgICAgbi55ID0gbi5meTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWlzTnVtYmVyKG4ueCkgfHwgIWlzTnVtYmVyKG4ueSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgY29uc3QgZGlzdExlbmd0aCA9IE1hdGguc3FydChkaXNwbGFjZW1lbnRzW2pdLnggKiBkaXNwbGFjZW1lbnRzW2pdLnggK1xuICAgICAgICAgICAgICAgIGRpc3BsYWNlbWVudHNbal0ueSAqIGRpc3BsYWNlbWVudHNbal0ueSk7XG4gICAgICAgICAgICBpZiAoZGlzdExlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAvLyAmJiAhbi5pc0ZpeGVkKClcbiAgICAgICAgICAgICAgICBjb25zdCBsaW1pdGVkRGlzdCA9IE1hdGgubWluKG1heERpc3BsYWNlICogKHNwZWVkIC8gU1BFRURfRElWSVNPUiksIGRpc3RMZW5ndGgpO1xuICAgICAgICAgICAgICAgIG4ueCArPSAoZGlzcGxhY2VtZW50c1tqXS54IC8gZGlzdExlbmd0aCkgKiBsaW1pdGVkRGlzdDtcbiAgICAgICAgICAgICAgICBuLnkgKz0gKGRpc3BsYWNlbWVudHNbal0ueSAvIGRpc3RMZW5ndGgpICogbGltaXRlZERpc3Q7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAoX2EgPSBzZWxmLnRpY2spID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jYWxsKHNlbGYpO1xuICAgIH1cbiAgICBhcHBseUNhbGN1bGF0ZShub2RlcywgZWRnZXMsIGRpc3BsYWNlbWVudHMsIGssIGsyKSB7XG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgICAgICBzZWxmLmNhbFJlcHVsc2l2ZShub2RlcywgZGlzcGxhY2VtZW50cywgazIpO1xuICAgICAgICBpZiAoZWRnZXMpXG4gICAgICAgICAgICBzZWxmLmNhbEF0dHJhY3RpdmUoZWRnZXMsIGRpc3BsYWNlbWVudHMsIGspO1xuICAgIH1cbiAgICBjYWxSZXB1bHNpdmUobm9kZXMsIGRpc3BsYWNlbWVudHMsIGsyKSB7XG4gICAgICAgIG5vZGVzLmZvckVhY2goKHYsIGkpID0+IHtcbiAgICAgICAgICAgIGRpc3BsYWNlbWVudHNbaV0gPSB7IHg6IDAsIHk6IDAgfTtcbiAgICAgICAgICAgIG5vZGVzLmZvckVhY2goKHUsIGopID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaSA9PT0gaikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghaXNOdW1iZXIodi54KSB8fFxuICAgICAgICAgICAgICAgICAgICAhaXNOdW1iZXIodS54KSB8fFxuICAgICAgICAgICAgICAgICAgICAhaXNOdW1iZXIodi55KSB8fFxuICAgICAgICAgICAgICAgICAgICAhaXNOdW1iZXIodS55KSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCB2ZWNYID0gdi54IC0gdS54O1xuICAgICAgICAgICAgICAgIGxldCB2ZWNZID0gdi55IC0gdS55O1xuICAgICAgICAgICAgICAgIGxldCB2ZWNMZW5ndGhTcXIgPSB2ZWNYICogdmVjWCArIHZlY1kgKiB2ZWNZO1xuICAgICAgICAgICAgICAgIGlmICh2ZWNMZW5ndGhTcXIgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdmVjTGVuZ3RoU3FyID0gMTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2lnbiA9IGkgPiBqID8gMSA6IC0xO1xuICAgICAgICAgICAgICAgICAgICB2ZWNYID0gMC4wMSAqIHNpZ247XG4gICAgICAgICAgICAgICAgICAgIHZlY1kgPSAwLjAxICogc2lnbjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgY29tbW9uID0gazIgLyB2ZWNMZW5ndGhTcXI7XG4gICAgICAgICAgICAgICAgZGlzcGxhY2VtZW50c1tpXS54ICs9IHZlY1ggKiBjb21tb247XG4gICAgICAgICAgICAgICAgZGlzcGxhY2VtZW50c1tpXS55ICs9IHZlY1kgKiBjb21tb247XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGNhbEF0dHJhY3RpdmUoZWRnZXMsIGRpc3BsYWNlbWVudHMsIGspIHtcbiAgICAgICAgZWRnZXMuZm9yRWFjaCgoZSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc291cmNlID0gZ2V0RWRnZVRlcm1pbmFsKGUsICdzb3VyY2UnKTtcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGdldEVkZ2VUZXJtaW5hbChlLCAndGFyZ2V0Jyk7XG4gICAgICAgICAgICBpZiAoIXNvdXJjZSB8fCAhdGFyZ2V0KVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGNvbnN0IHVJbmRleCA9IHRoaXMubm9kZUlkeE1hcFtzb3VyY2VdO1xuICAgICAgICAgICAgY29uc3QgdkluZGV4ID0gdGhpcy5ub2RlSWR4TWFwW3RhcmdldF07XG4gICAgICAgICAgICBpZiAodUluZGV4ID09PSB2SW5kZXgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB1ID0gdGhpcy5ub2RlTWFwW3NvdXJjZV07XG4gICAgICAgICAgICBjb25zdCB2ID0gdGhpcy5ub2RlTWFwW3RhcmdldF07XG4gICAgICAgICAgICBpZiAoIWlzTnVtYmVyKHYueCkgfHwgIWlzTnVtYmVyKHUueCkgfHwgIWlzTnVtYmVyKHYueSkgfHwgIWlzTnVtYmVyKHUueSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB2ZWNYID0gdi54IC0gdS54O1xuICAgICAgICAgICAgY29uc3QgdmVjWSA9IHYueSAtIHUueTtcbiAgICAgICAgICAgIGNvbnN0IHZlY0xlbmd0aCA9IE1hdGguc3FydCh2ZWNYICogdmVjWCArIHZlY1kgKiB2ZWNZKTtcbiAgICAgICAgICAgIGNvbnN0IGNvbW1vbiA9ICh2ZWNMZW5ndGggKiB2ZWNMZW5ndGgpIC8gaztcbiAgICAgICAgICAgIGRpc3BsYWNlbWVudHNbdkluZGV4XS54IC09ICh2ZWNYIC8gdmVjTGVuZ3RoKSAqIGNvbW1vbjtcbiAgICAgICAgICAgIGRpc3BsYWNlbWVudHNbdkluZGV4XS55IC09ICh2ZWNZIC8gdmVjTGVuZ3RoKSAqIGNvbW1vbjtcbiAgICAgICAgICAgIGRpc3BsYWNlbWVudHNbdUluZGV4XS54ICs9ICh2ZWNYIC8gdmVjTGVuZ3RoKSAqIGNvbW1vbjtcbiAgICAgICAgICAgIGRpc3BsYWNlbWVudHNbdUluZGV4XS55ICs9ICh2ZWNZIC8gdmVjTGVuZ3RoKSAqIGNvbW1vbjtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN0b3AoKSB7XG4gICAgICAgIGlmICh0aGlzLnRpbWVJbnRlcnZhbCAmJiB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICB3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLnRpbWVJbnRlcnZhbCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICAgIHNlbGYuc3RvcCgpO1xuICAgICAgICBzZWxmLnRpY2sgPSBudWxsO1xuICAgICAgICBzZWxmLm5vZGVzID0gbnVsbDtcbiAgICAgICAgc2VsZi5lZGdlcyA9IG51bGw7XG4gICAgICAgIHNlbGYuZGVzdHJveWVkID0gdHJ1ZTtcbiAgICB9XG4gICAgZ2V0VHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIFwiZnJ1Y2h0ZXJtYW5cIjtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1mcnVjaHRlcm1hbi5qcy5tYXAiLCJleHBvcnQgZnVuY3Rpb24gaXNOdW1iZXIodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcic7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pcy1udW1iZXIuanMubWFwIiwiaW1wb3J0IHsgdmVjMyB9IGZyb20gJ2dsLW1hdHJpeCc7XG5pbXBvcnQgeyBpc051bWJlciB9IGZyb20gJy4vaXMtbnVtYmVyJztcbmV4cG9ydCBmdW5jdGlvbiBnZXRBbmdsZShhbmdsZSkge1xuICBpZiAoYW5nbGUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiAwO1xuICB9IGVsc2UgaWYgKGFuZ2xlID4gMzYwIHx8IGFuZ2xlIDwgLTM2MCkge1xuICAgIHJldHVybiBhbmdsZSAlIDM2MDtcbiAgfVxuXG4gIHJldHVybiBhbmdsZTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVWZWMzKHgsIHksIHopIHtcbiAgaWYgKGlzTnVtYmVyKHgpKSB7XG4gICAgcmV0dXJuIHZlYzMuZnJvbVZhbHVlcyh4LCB5LCB6KTtcbiAgfVxuXG4gIGlmICh4Lmxlbmd0aCA9PT0gMykge1xuICAgIHJldHVybiB2ZWMzLmNsb25lKHgpO1xuICB9IC8vIEB0cy1pZ25vcmVcblxuXG4gIHJldHVybiB2ZWMzLmZyb21WYWx1ZXMoeFswXSwgeFsxXSwgeFsyXSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tYXRoLmpzLm1hcCIsImltcG9ydCBfY2xhc3NDYWxsQ2hlY2sgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2tcIjtcbmltcG9ydCBfY3JlYXRlQ2xhc3MgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlQ2xhc3NcIjtcbmltcG9ydCB7IG1hdDQsIHZlYzMgfSBmcm9tICdnbC1tYXRyaXgnO1xuXG4vKipcbiAqIOS/neWtmOebuOacuueKtuaAge+8jOS+v+S6juWQjue7reWcqOWkmuS4qiBMYW5kbWFyayDpl7Tnp7vliqhcbiAqL1xudmFyIExhbmRtYXJrID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gTGFuZG1hcmsobmFtZSwgYykge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBMYW5kbWFyayk7XG5cbiAgICB0aGlzLm5hbWUgPSB2b2lkIDA7XG4gICAgdGhpcy5tYXRyaXggPSB2b2lkIDA7XG4gICAgdGhpcy5yaWdodCA9IHZvaWQgMDtcbiAgICB0aGlzLnVwID0gdm9pZCAwO1xuICAgIHRoaXMuZm9yd2FyZCA9IHZvaWQgMDtcbiAgICB0aGlzLnBvc2l0aW9uID0gdm9pZCAwO1xuICAgIHRoaXMuZm9jYWxQb2ludCA9IHZvaWQgMDtcbiAgICB0aGlzLmRpc3RhbmNlVmVjdG9yID0gdm9pZCAwO1xuICAgIHRoaXMuZGlzdGFuY2UgPSB2b2lkIDA7XG4gICAgdGhpcy5kb2xseWluZ1N0ZXAgPSB2b2lkIDA7XG4gICAgdGhpcy5hemltdXRoID0gMDtcbiAgICB0aGlzLmVsZXZhdGlvbiA9IDA7XG4gICAgdGhpcy5yb2xsID0gMDtcbiAgICB0aGlzLnJlbEF6aW11dGggPSAwO1xuICAgIHRoaXMucmVsRWxldmF0aW9uID0gMDtcbiAgICB0aGlzLnJlbFJvbGwgPSAwO1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy5tYXRyaXggPSBtYXQ0LmNsb25lKGMubWF0cml4KTtcbiAgICB0aGlzLnJpZ2h0ID0gdmVjMy5jbG9uZShjLnJpZ2h0KTtcbiAgICB0aGlzLnVwID0gdmVjMy5jbG9uZShjLnVwKTtcbiAgICB0aGlzLmZvcndhcmQgPSB2ZWMzLmNsb25lKGMuZm9yd2FyZCk7XG4gICAgdGhpcy5wb3NpdGlvbiA9IHZlYzMuY2xvbmUoYy5wb3NpdGlvbik7XG4gICAgdGhpcy5mb2NhbFBvaW50ID0gdmVjMy5jbG9uZShjLmZvY2FsUG9pbnQpO1xuICAgIHRoaXMuZGlzdGFuY2VWZWN0b3IgPSB2ZWMzLmNsb25lKGMuZGlzdGFuY2VWZWN0b3IpO1xuICAgIHRoaXMuYXppbXV0aCA9IGMuYXppbXV0aDtcbiAgICB0aGlzLmVsZXZhdGlvbiA9IGMuZWxldmF0aW9uO1xuICAgIHRoaXMucm9sbCA9IGMucm9sbDtcbiAgICB0aGlzLnJlbEF6aW11dGggPSBjLnJlbEF6aW11dGg7XG4gICAgdGhpcy5yZWxFbGV2YXRpb24gPSBjLnJlbEVsZXZhdGlvbjtcbiAgICB0aGlzLnJlbFJvbGwgPSBjLnJlbFJvbGw7XG4gICAgdGhpcy5kb2xseWluZ1N0ZXAgPSBjLmRvbGx5aW5nU3RlcDtcbiAgICB0aGlzLmRpc3RhbmNlID0gYy5kaXN0YW5jZTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhMYW5kbWFyaywgW3tcbiAgICBrZXk6IFwiZ2V0UG9zaXRpb25cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0UG9zaXRpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5wb3NpdGlvbjtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0Rm9jYWxQb2ludFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRGb2NhbFBvaW50KCkge1xuICAgICAgcmV0dXJuIHRoaXMuZm9jYWxQb2ludDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0Um9sbFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRSb2xsKCkge1xuICAgICAgcmV0dXJuIHRoaXMucm9sbDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmV0cmlldmVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmV0cmlldmUoYykge1xuICAgICAgYy5tYXRyaXggPSBtYXQ0LmNvcHkoYy5tYXRyaXgsIHRoaXMubWF0cml4KTtcbiAgICAgIGMucmlnaHQgPSB2ZWMzLmNvcHkoYy5yaWdodCwgdGhpcy5yaWdodCk7XG4gICAgICBjLnVwID0gdmVjMy5jb3B5KGMudXAsIHRoaXMudXApO1xuICAgICAgYy5mb3J3YXJkID0gdmVjMy5jb3B5KGMuZm9yd2FyZCwgdGhpcy5mb3J3YXJkKTtcbiAgICAgIGMucG9zaXRpb24gPSB2ZWMzLmNvcHkoYy5wb3NpdGlvbiwgdGhpcy5wb3NpdGlvbik7XG4gICAgICBjLmZvY2FsUG9pbnQgPSB2ZWMzLmNvcHkoYy5mb2NhbFBvaW50LCB0aGlzLmZvY2FsUG9pbnQpO1xuICAgICAgYy5kaXN0YW5jZVZlY3RvciA9IHZlYzMuY29weShjLmRpc3RhbmNlVmVjdG9yLCB0aGlzLmRpc3RhbmNlVmVjdG9yKTtcbiAgICAgIGMuYXppbXV0aCA9IHRoaXMuYXppbXV0aDtcbiAgICAgIGMuZWxldmF0aW9uID0gdGhpcy5lbGV2YXRpb247XG4gICAgICBjLnJvbGwgPSB0aGlzLnJvbGw7XG4gICAgICBjLnJlbEF6aW11dGggPSB0aGlzLnJlbEF6aW11dGg7XG4gICAgICBjLnJlbEVsZXZhdGlvbiA9IHRoaXMucmVsRWxldmF0aW9uO1xuICAgICAgYy5yZWxSb2xsID0gdGhpcy5yZWxSb2xsO1xuICAgICAgYy5kb2xseWluZ1N0ZXAgPSB0aGlzLmRvbGx5aW5nU3RlcDtcbiAgICAgIGMuZGlzdGFuY2UgPSB0aGlzLmRpc3RhbmNlO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBMYW5kbWFyaztcbn0oKTtcblxuZXhwb3J0IHsgTGFuZG1hcmsgYXMgZGVmYXVsdCB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TGFuZG1hcmsuanMubWFwIiwiaW1wb3J0IF9pbml0aWFsaXplckRlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2luaXRpYWxpemVyRGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfY2xhc3NDYWxsQ2hlY2sgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2tcIjtcbmltcG9ydCBfY3JlYXRlQ2xhc3MgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlQ2xhc3NcIjtcbmltcG9ydCBfYXBwbHlEZWNvcmF0ZWREZXNjcmlwdG9yIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2FwcGx5RGVjb3JhdGVkRGVzY3JpcHRvclwiO1xuaW1wb3J0IF9pbml0aWFsaXplcldhcm5pbmdIZWxwZXIgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW5pdGlhbGl6ZXJXYXJuaW5nSGVscGVyXCI7XG5cbnZhciBfZGVjLCBfZGVjMiwgX2NsYXNzLCBfY2xhc3MyLCBfZGVzY3JpcHRvciwgX2NsYXNzMywgX3RlbXA7XG5cbmltcG9ydCB7IEZydXN0dW0sIElERU5USUZJRVIgfSBmcm9tICdAYW50di9nLXdlYmdwdS1jb3JlJztcbmltcG9ydCB7IG1hdDMsIG1hdDQsIHF1YXQsIHZlYzMsIHZlYzQgfSBmcm9tICdnbC1tYXRyaXgnO1xuaW1wb3J0IHsgaW5qZWN0LCBpbmplY3RhYmxlIH0gZnJvbSAnaW52ZXJzaWZ5JztcbmltcG9ydCB7IGNyZWF0ZVZlYzMsIGdldEFuZ2xlIH0gZnJvbSAnLi4vdXRpbHMvbWF0aCc7XG5pbXBvcnQgTGFuZG1hcmsgZnJvbSAnLi9MYW5kbWFyayc7XG5leHBvcnQgdmFyIENBTUVSQV9UWVBFO1xuXG4oZnVuY3Rpb24gKENBTUVSQV9UWVBFKSB7XG4gIENBTUVSQV9UWVBFW1wiT1JCSVRJTkdcIl0gPSBcIk9SQklUSU5HXCI7XG4gIENBTUVSQV9UWVBFW1wiRVhQTE9SSU5HXCJdID0gXCJFWFBMT1JJTkdcIjtcbiAgQ0FNRVJBX1RZUEVbXCJUUkFDS0lOR1wiXSA9IFwiVFJBQ0tJTkdcIjtcbn0pKENBTUVSQV9UWVBFIHx8IChDQU1FUkFfVFlQRSA9IHt9KSk7XG5cbmV4cG9ydCB2YXIgQ0FNRVJBX1RSQUNLSU5HX01PREU7XG5cbihmdW5jdGlvbiAoQ0FNRVJBX1RSQUNLSU5HX01PREUpIHtcbiAgQ0FNRVJBX1RSQUNLSU5HX01PREVbXCJERUZBVUxUXCJdID0gXCJERUZBVUxUXCI7XG4gIENBTUVSQV9UUkFDS0lOR19NT0RFW1wiUk9UQVRJT05BTFwiXSA9IFwiUk9UQVRJT05BTFwiO1xuICBDQU1FUkFfVFJBQ0tJTkdfTU9ERVtcIlRSQU5TTEFUSU9OQUxcIl0gPSBcIlRSQU5TTEFUSU9OQUxcIjtcbiAgQ0FNRVJBX1RSQUNLSU5HX01PREVbXCJDSU5FTUFUSUNcIl0gPSBcIkNJTkVNQVRJQ1wiO1xufSkoQ0FNRVJBX1RSQUNLSU5HX01PREUgfHwgKENBTUVSQV9UUkFDS0lOR19NT0RFID0ge30pKTtcblxuZXhwb3J0IHZhciBDQU1FUkFfUFJPSkVDVElPTl9NT0RFO1xuXG4oZnVuY3Rpb24gKENBTUVSQV9QUk9KRUNUSU9OX01PREUpIHtcbiAgQ0FNRVJBX1BST0pFQ1RJT05fTU9ERVtcIk9SVEhPR1JBUEhJQ1wiXSA9IFwiT1JUSE9HUkFQSElDXCI7XG4gIENBTUVSQV9QUk9KRUNUSU9OX01PREVbXCJQRVJTUEVDVElWRVwiXSA9IFwiUEVSU1BFQ1RJVkVcIjtcbn0pKENBTUVSQV9QUk9KRUNUSU9OX01PREUgfHwgKENBTUVSQV9QUk9KRUNUSU9OX01PREUgPSB7fSkpO1xuXG52YXIgREVHXzJfUkFEID0gTWF0aC5QSSAvIDE4MDtcbnZhciBSQURfMl9ERUcgPSAxODAgLyBNYXRoLlBJO1xuLyoqXG4gKiDlj4LogIPjgIxXZWJHTCBJbnNpZ2h0cyAtIDIzLkRlc2lnbmluZyBDYW1lcmFzIGZvciBXZWJHTCBBcHBsaWNhdGlvbnPjgI3vvIzln7rkuo4gUmVzcG9uc2libGUgQ2FtZXJhIOaAnei3r+iuvuiuoVxuICog5L+d5a2Y55u45py65Y+C5pWw77yM5a6a5LmJ55u45py65Yqo5L2c77yaXG4gKiAxLiBkb2xseSDmsr8gbiDovbTnp7vliqhcbiAqIDIuIHBhbiDmsr8gdSB2IOi9tOenu+WKqFxuICogMy4gcm90YXRlIOS7peaWueS9jeinkuaXi+i9rFxuICogNC4g56e75Yqo5YiwIExhbmRtYXJr77yM5YW35pyJ5bmz5ruR55qE5Yqo55S75pWI5p6c77yM5YW26Ze056aB5q2i5YW25LuW55So5oi35Lqk5LqSXG4gKi9cblxuZXhwb3J0IHZhciBDYW1lcmEgPSAoX2RlYyA9IGluamVjdGFibGUoKSwgX2RlYzIgPSBpbmplY3QoSURFTlRJRklFUi5JbnRlcmFjdG9yU2VydmljZSksIF9kZWMoX2NsYXNzID0gKF9jbGFzczIgPSAoX3RlbXAgPSBfY2xhc3MzID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gQ2FtZXJhKCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBDYW1lcmEpO1xuXG4gICAgdGhpcy5tYXRyaXggPSBtYXQ0LmNyZWF0ZSgpO1xuICAgIHRoaXMucmlnaHQgPSB2ZWMzLmZyb21WYWx1ZXMoMSwgMCwgMCk7XG4gICAgdGhpcy51cCA9IHZlYzMuZnJvbVZhbHVlcygwLCAxLCAwKTtcbiAgICB0aGlzLmZvcndhcmQgPSB2ZWMzLmZyb21WYWx1ZXMoMCwgMCwgMSk7XG4gICAgdGhpcy5wb3NpdGlvbiA9IHZlYzMuZnJvbVZhbHVlcygwLCAwLCAxKTtcbiAgICB0aGlzLmZvY2FsUG9pbnQgPSB2ZWMzLmZyb21WYWx1ZXMoMCwgMCwgMCk7XG4gICAgdGhpcy5kaXN0YW5jZVZlY3RvciA9IHZlYzMuZnJvbVZhbHVlcygwLCAwLCAwKTtcbiAgICB0aGlzLmRpc3RhbmNlID0gMTtcbiAgICB0aGlzLmF6aW11dGggPSAwO1xuICAgIHRoaXMuZWxldmF0aW9uID0gMDtcbiAgICB0aGlzLnJvbGwgPSAwO1xuICAgIHRoaXMucmVsQXppbXV0aCA9IDA7XG4gICAgdGhpcy5yZWxFbGV2YXRpb24gPSAwO1xuICAgIHRoaXMucmVsUm9sbCA9IDA7XG4gICAgdGhpcy5kb2xseWluZ1N0ZXAgPSAwO1xuICAgIHRoaXMubWF4RGlzdGFuY2UgPSBJbmZpbml0eTtcbiAgICB0aGlzLm1pbkRpc3RhbmNlID0gLUluZmluaXR5O1xuICAgIHRoaXMucm90YXRlV29ybGQgPSBmYWxzZTtcblxuICAgIF9pbml0aWFsaXplckRlZmluZVByb3BlcnR5KHRoaXMsIFwiaW50ZXJhY3RvclwiLCBfZGVzY3JpcHRvciwgdGhpcyk7XG5cbiAgICB0aGlzLmZvdiA9IDMwO1xuICAgIHRoaXMubmVhciA9IDAuMTtcbiAgICB0aGlzLmZhciA9IDEwMDAwO1xuICAgIHRoaXMuYXNwZWN0ID0gMTtcbiAgICB0aGlzLmxlZnQgPSB2b2lkIDA7XG4gICAgdGhpcy5ycmlnaHQgPSB2b2lkIDA7XG4gICAgdGhpcy50b3AgPSB2b2lkIDA7XG4gICAgdGhpcy5ib3R0b20gPSB2b2lkIDA7XG4gICAgdGhpcy56b29tID0gMTtcbiAgICB0aGlzLnBlcnNwZWN0aXZlID0gbWF0NC5jcmVhdGUoKTtcbiAgICB0aGlzLnZpZXcgPSB2b2lkIDA7XG4gICAgdGhpcy5mb2xsb3dpbmcgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy50eXBlID0gQ0FNRVJBX1RZUEUuRVhQTE9SSU5HO1xuICAgIHRoaXMudHJhY2tpbmdNb2RlID0gQ0FNRVJBX1RSQUNLSU5HX01PREUuREVGQVVMVDtcbiAgICB0aGlzLnByb2plY3Rpb25Nb2RlID0gQ0FNRVJBX1BST0pFQ1RJT05fTU9ERS5QRVJTUEVDVElWRTtcbiAgICB0aGlzLmZydXN0dW0gPSBuZXcgRnJ1c3R1bSgpO1xuICAgIHRoaXMubGFuZG1hcmtzID0gW107XG4gICAgdGhpcy5sYW5kbWFya0FuaW1hdGlvbklEID0gdm9pZCAwO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKENhbWVyYSwgW3tcbiAgICBrZXk6IFwiY2xvbmVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY2xvbmUoKSB7XG4gICAgICB2YXIgY2FtZXJhID0gbmV3IENhbWVyYSgpO1xuICAgICAgY2FtZXJhLnNldFR5cGUodGhpcy50eXBlLCB1bmRlZmluZWQpO1xuICAgICAgY2FtZXJhLmludGVyYWN0b3IgPSB0aGlzLmludGVyYWN0b3I7XG4gICAgICByZXR1cm4gY2FtZXJhO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRQcm9qZWN0aW9uTW9kZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRQcm9qZWN0aW9uTW9kZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLnByb2plY3Rpb25Nb2RlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRQZXJzcGVjdGl2ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRQZXJzcGVjdGl2ZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLnBlcnNwZWN0aXZlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRGcnVzdHVtXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldEZydXN0dW0oKSB7XG4gICAgICByZXR1cm4gdGhpcy5mcnVzdHVtO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRQb3NpdGlvblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRQb3NpdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLnBvc2l0aW9uO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzZXRUeXBlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldFR5cGUodHlwZSwgdHJhY2tpbmdNb2RlKSB7XG4gICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuXG4gICAgICBpZiAodGhpcy50eXBlID09PSBDQU1FUkFfVFlQRS5FWFBMT1JJTkcpIHtcbiAgICAgICAgdGhpcy5zZXRXb3JsZFJvdGF0aW9uKHRydWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZXRXb3JsZFJvdGF0aW9uKGZhbHNlKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fZ2V0QW5nbGVzKCk7XG5cbiAgICAgIGlmICh0aGlzLnR5cGUgPT09IENBTUVSQV9UWVBFLlRSQUNLSU5HICYmIHRyYWNraW5nTW9kZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuc2V0VHJhY2tpbmdNb2RlKHRyYWNraW5nTW9kZSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzZXRQcm9qZWN0aW9uTW9kZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRQcm9qZWN0aW9uTW9kZShwcm9qZWN0aW9uTW9kZSkge1xuICAgICAgdGhpcy5wcm9qZWN0aW9uTW9kZSA9IHByb2plY3Rpb25Nb2RlO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNldFRyYWNraW5nTW9kZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRUcmFja2luZ01vZGUodHJhY2tpbmdNb2RlKSB7XG4gICAgICBpZiAodGhpcy50eXBlICE9PSBDQU1FUkFfVFlQRS5UUkFDS0lORykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ltcG9zc2libGUgdG8gc2V0IGEgdHJhY2tpbmcgbW9kZSBpZiB0aGUgY2FtZXJhIGlzIG5vdCBvZiB0cmFja2luZyB0eXBlJyk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMudHJhY2tpbmdNb2RlID0gdHJhY2tpbmdNb2RlO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIElmIGZsYWcgaXMgdHJ1ZSwgaXQgcmV2ZXJzZXMgdGhlIGF6aW11dGggYW5kIGVsZXZhdGlvbiBhbmdsZXMuXG4gICAgICogU3Vic2VxdWVudCBjYWxscyB0byByb3RhdGUsIHNldEF6aW11dGgsIHNldEVsZXZhdGlvbixcbiAgICAgKiBjaGFuZ2VBemltdXRoIG9yIGNoYW5nZUVsZXZhdGlvbiB3aWxsIGNhdXNlIHRoZSBpbnZlcnRlZCBlZmZlY3QuXG4gICAgICogc2V0Um9sbCBvciBjaGFuZ2VSb2xsIGlzIG5vdCBhZmZlY3RlZCBieSB0aGlzIG1ldGhvZC5cbiAgICAgKlxuICAgICAqIFRoaXMgaW52ZXJzaW9uIGlzIHVzZWZ1bCB3aGVuIG9uZSB3YW50cyB0byBzaW11bGF0ZSB0aGF0IHRoZSB3b3JsZFxuICAgICAqIGlzIG1vdmluZywgaW5zdGVhZCBvZiB0aGUgY2FtZXJhLlxuICAgICAqXG4gICAgICogQnkgZGVmYXVsdCB0aGUgY2FtZXJhIGFuZ2xlcyBhcmUgbm90IHJldmVyc2VkLlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gZmxhZyB0aGUgYm9vbGVhbiBmbGFnIHRvIHJldmVyc2UgdGhlIGFuZ2xlcy5cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInNldFdvcmxkUm90YXRpb25cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0V29ybGRSb3RhdGlvbihmbGFnKSB7XG4gICAgICB0aGlzLnJvdGF0ZVdvcmxkID0gZmxhZztcblxuICAgICAgdGhpcy5fZ2V0QW5nbGVzKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIOiuoeeulyBNViDnn6npmLXvvIzkuLrnm7jmnLrnn6npmLXnmoTpgIbnn6npmLVcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImdldFZpZXdUcmFuc2Zvcm1cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0Vmlld1RyYW5zZm9ybSgpIHtcbiAgICAgIHJldHVybiBtYXQ0LmludmVydChtYXQ0LmNyZWF0ZSgpLCB0aGlzLm1hdHJpeCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldFdvcmxkVHJhbnNmb3JtXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFdvcmxkVHJhbnNmb3JtKCkge1xuICAgICAgcmV0dXJuIHRoaXMubWF0cml4O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiDorr7nva7nm7jmnLrnn6npmLVcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInNldE1hdHJpeFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRNYXRyaXgobWF0cml4KSB7XG4gICAgICB0aGlzLm1hdHJpeCA9IG1hdHJpeDtcblxuICAgICAgdGhpcy5fdXBkYXRlKCk7XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzZXRBc3BlY3RcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0QXNwZWN0KGFzcGVjdCkge1xuICAgICAgdGhpcy5zZXRQZXJzcGVjdGl2ZSh0aGlzLm5lYXIsIHRoaXMuZmFyLCB0aGlzLmZvdiwgYXNwZWN0KTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIGFuIG9mZnNldCBpbiBhIGxhcmdlciBmcnVzdHVtLCB1c2VkIGluIFBpeGVsUGlja2luZ1xuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwic2V0Vmlld09mZnNldFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRWaWV3T2Zmc2V0KGZ1bGxXaWR0aCwgZnVsbEhlaWdodCwgeCwgeSwgd2lkdGgsIGhlaWdodCkge1xuICAgICAgdGhpcy5hc3BlY3QgPSBmdWxsV2lkdGggLyBmdWxsSGVpZ2h0O1xuXG4gICAgICBpZiAodGhpcy52aWV3ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy52aWV3ID0ge1xuICAgICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgZnVsbFdpZHRoOiAxLFxuICAgICAgICAgIGZ1bGxIZWlnaHQ6IDEsXG4gICAgICAgICAgb2Zmc2V0WDogMCxcbiAgICAgICAgICBvZmZzZXRZOiAwLFxuICAgICAgICAgIHdpZHRoOiAxLFxuICAgICAgICAgIGhlaWdodDogMVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICB0aGlzLnZpZXcuZW5hYmxlZCA9IHRydWU7XG4gICAgICB0aGlzLnZpZXcuZnVsbFdpZHRoID0gZnVsbFdpZHRoO1xuICAgICAgdGhpcy52aWV3LmZ1bGxIZWlnaHQgPSBmdWxsSGVpZ2h0O1xuICAgICAgdGhpcy52aWV3Lm9mZnNldFggPSB4O1xuICAgICAgdGhpcy52aWV3Lm9mZnNldFkgPSB5O1xuICAgICAgdGhpcy52aWV3LndpZHRoID0gd2lkdGg7XG4gICAgICB0aGlzLnZpZXcuaGVpZ2h0ID0gaGVpZ2h0O1xuXG4gICAgICBpZiAodGhpcy5wcm9qZWN0aW9uTW9kZSA9PT0gQ0FNRVJBX1BST0pFQ1RJT05fTU9ERS5QRVJTUEVDVElWRSkge1xuICAgICAgICB0aGlzLnNldFBlcnNwZWN0aXZlKHRoaXMubmVhciwgdGhpcy5mYXIsIHRoaXMuZm92LCB0aGlzLmFzcGVjdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNldE9ydGhvZ3JhcGhpYyh0aGlzLmxlZnQsIHRoaXMucnJpZ2h0LCB0aGlzLnRvcCwgdGhpcy5ib3R0b20sIHRoaXMubmVhciwgdGhpcy5mYXIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY2xlYXJWaWV3T2Zmc2V0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNsZWFyVmlld09mZnNldCgpIHtcbiAgICAgIGlmICh0aGlzLnZpZXcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLnZpZXcuZW5hYmxlZCA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5wcm9qZWN0aW9uTW9kZSA9PT0gQ0FNRVJBX1BST0pFQ1RJT05fTU9ERS5QRVJTUEVDVElWRSkge1xuICAgICAgICB0aGlzLnNldFBlcnNwZWN0aXZlKHRoaXMubmVhciwgdGhpcy5mYXIsIHRoaXMuZm92LCB0aGlzLmFzcGVjdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNldE9ydGhvZ3JhcGhpYyh0aGlzLmxlZnQsIHRoaXMucnJpZ2h0LCB0aGlzLnRvcCwgdGhpcy5ib3R0b20sIHRoaXMubmVhciwgdGhpcy5mYXIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2V0UGVyc3BlY3RpdmVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0UGVyc3BlY3RpdmUobmVhciwgZmFyLCBmb3YsIGFzcGVjdCkge1xuICAgICAgdGhpcy5wcm9qZWN0aW9uTW9kZSA9IENBTUVSQV9QUk9KRUNUSU9OX01PREUuUEVSU1BFQ1RJVkU7XG4gICAgICB0aGlzLmZvdiA9IGZvdjtcbiAgICAgIHRoaXMubmVhciA9IG5lYXI7XG4gICAgICB0aGlzLmZhciA9IGZhcjtcbiAgICAgIHRoaXMuYXNwZWN0ID0gYXNwZWN0O1xuICAgICAgbWF0NC5wZXJzcGVjdGl2ZSh0aGlzLnBlcnNwZWN0aXZlLCB0aGlzLmZvdiAqIERFR18yX1JBRCwgdGhpcy5hc3BlY3QsIHRoaXMubmVhciwgdGhpcy5mYXIpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNldE9ydGhvZ3JhcGhpY1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRPcnRob2dyYXBoaWMobCwgciwgdCwgYiwgbmVhciwgZmFyKSB7XG4gICAgICB0aGlzLnByb2plY3Rpb25Nb2RlID0gQ0FNRVJBX1BST0pFQ1RJT05fTU9ERS5PUlRIT0dSQVBISUM7XG4gICAgICB0aGlzLnJyaWdodCA9IHI7XG4gICAgICB0aGlzLmxlZnQgPSBsO1xuICAgICAgdGhpcy50b3AgPSB0O1xuICAgICAgdGhpcy5ib3R0b20gPSBiO1xuICAgICAgdGhpcy5uZWFyID0gbmVhcjtcbiAgICAgIHRoaXMuZmFyID0gZmFyO1xuICAgICAgdmFyIGR4ID0gKHRoaXMucnJpZ2h0IC0gdGhpcy5sZWZ0KSAvICgyICogdGhpcy56b29tKTtcbiAgICAgIHZhciBkeSA9ICh0aGlzLnRvcCAtIHRoaXMuYm90dG9tKSAvICgyICogdGhpcy56b29tKTtcbiAgICAgIHZhciBjeCA9ICh0aGlzLnJyaWdodCArIHRoaXMubGVmdCkgLyAyO1xuICAgICAgdmFyIGN5ID0gKHRoaXMudG9wICsgdGhpcy5ib3R0b20pIC8gMjtcbiAgICAgIHZhciBsZWZ0ID0gY3ggLSBkeDtcbiAgICAgIHZhciByaWdodCA9IGN4ICsgZHg7XG4gICAgICB2YXIgdG9wID0gY3kgKyBkeTtcbiAgICAgIHZhciBib3R0b20gPSBjeSAtIGR5O1xuXG4gICAgICBpZiAodGhpcy52aWV3ICE9PSB1bmRlZmluZWQgJiYgdGhpcy52aWV3LmVuYWJsZWQpIHtcbiAgICAgICAgdmFyIHNjYWxlVyA9ICh0aGlzLnJyaWdodCAtIHRoaXMubGVmdCkgLyB0aGlzLnZpZXcuZnVsbFdpZHRoIC8gdGhpcy56b29tO1xuICAgICAgICB2YXIgc2NhbGVIID0gKHRoaXMudG9wIC0gdGhpcy5ib3R0b20pIC8gdGhpcy52aWV3LmZ1bGxIZWlnaHQgLyB0aGlzLnpvb207XG4gICAgICAgIGxlZnQgKz0gc2NhbGVXICogdGhpcy52aWV3Lm9mZnNldFg7XG4gICAgICAgIHJpZ2h0ID0gbGVmdCArIHNjYWxlVyAqIHRoaXMudmlldy53aWR0aDtcbiAgICAgICAgdG9wIC09IHNjYWxlSCAqIHRoaXMudmlldy5vZmZzZXRZO1xuICAgICAgICBib3R0b20gPSB0b3AgLSBzY2FsZUggKiB0aGlzLnZpZXcuaGVpZ2h0O1xuICAgICAgfVxuXG4gICAgICBtYXQ0Lm9ydGhvKHRoaXMucGVyc3BlY3RpdmUsIGxlZnQsIHJpZ2h0LCB0b3AsIGJvdHRvbSwgbmVhciwgZmFyKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiDorr7nva7nm7jmnLrkvY3nva5cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInNldFBvc2l0aW9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldFBvc2l0aW9uKHgsIHksIHopIHtcbiAgICAgIHRoaXMuX3NldFBvc2l0aW9uKHgsIHksIHopO1xuXG4gICAgICB0aGlzLnNldEZvY2FsUG9pbnQodGhpcy5mb2NhbFBvaW50KTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiDorr7nva7op4bngrnkvY3nva5cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInNldEZvY2FsUG9pbnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0Rm9jYWxQb2ludCh4LCB5LCB6KSB7XG4gICAgICB2YXIgdXAgPSB2ZWMzLmZyb21WYWx1ZXMoMCwgMSwgMCk7XG4gICAgICB0aGlzLmZvY2FsUG9pbnQgPSBjcmVhdGVWZWMzKHgsIHksIHopO1xuXG4gICAgICBpZiAodGhpcy50cmFja2luZ01vZGUgPT09IENBTUVSQV9UUkFDS0lOR19NT0RFLkNJTkVNQVRJQykge1xuICAgICAgICB2YXIgZCA9IHZlYzMuc3VidHJhY3QodmVjMy5jcmVhdGUoKSwgdGhpcy5mb2NhbFBvaW50LCB0aGlzLnBvc2l0aW9uKTtcbiAgICAgICAgeCA9IGRbMF07XG4gICAgICAgIHkgPSBkWzFdO1xuICAgICAgICB6ID0gZFsyXTtcbiAgICAgICAgdmFyIHIgPSB2ZWMzLmxlbmd0aChkKTtcbiAgICAgICAgdmFyIGVsID0gTWF0aC5hc2luKHkgLyByKSAqIFJBRF8yX0RFRztcbiAgICAgICAgdmFyIGF6ID0gOTAgKyBNYXRoLmF0YW4yKHosIHgpICogUkFEXzJfREVHO1xuICAgICAgICB2YXIgbSA9IG1hdDQuY3JlYXRlKCk7XG4gICAgICAgIG1hdDQucm90YXRlWShtLCBtLCBheiAqIERFR18yX1JBRCk7XG4gICAgICAgIG1hdDQucm90YXRlWChtLCBtLCBlbCAqIERFR18yX1JBRCk7XG4gICAgICAgIHVwID0gdmVjMy50cmFuc2Zvcm1NYXQ0KHZlYzMuY3JlYXRlKCksIFswLCAxLCAwXSwgbSk7XG4gICAgICB9XG5cbiAgICAgIG1hdDQuaW52ZXJ0KHRoaXMubWF0cml4LCBtYXQ0Lmxvb2tBdChtYXQ0LmNyZWF0ZSgpLCB0aGlzLnBvc2l0aW9uLCB0aGlzLmZvY2FsUG9pbnQsIHVwKSk7XG5cbiAgICAgIHRoaXMuX2dldEF4ZXMoKTtcblxuICAgICAgdGhpcy5fZ2V0RGlzdGFuY2UoKTtcblxuICAgICAgdGhpcy5fZ2V0QW5nbGVzKCk7XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiDlm7rlrprlvZPliY3op4bngrnvvIzmjInmjIflrprot53nprvmlL7nva7nm7jmnLpcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInNldERpc3RhbmNlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldERpc3RhbmNlKGQpIHtcbiAgICAgIGlmICh0aGlzLmRpc3RhbmNlID09PSBkIHx8IGQgPCAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5kaXN0YW5jZSA9IGQ7XG5cbiAgICAgIGlmICh0aGlzLmRpc3RhbmNlIDwgMC4wMDAyKSB7XG4gICAgICAgIHRoaXMuZGlzdGFuY2UgPSAwLjAwMDI7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZG9sbHlpbmdTdGVwID0gdGhpcy5kaXN0YW5jZSAvIDEwMDtcbiAgICAgIHZhciBwb3MgPSB2ZWMzLmNyZWF0ZSgpO1xuICAgICAgZCA9IHRoaXMuZGlzdGFuY2U7XG4gICAgICB2YXIgbiA9IHRoaXMuZm9yd2FyZDtcbiAgICAgIHZhciBmID0gdGhpcy5mb2NhbFBvaW50O1xuICAgICAgcG9zWzBdID0gZCAqIG5bMF0gKyBmWzBdO1xuICAgICAgcG9zWzFdID0gZCAqIG5bMV0gKyBmWzFdO1xuICAgICAgcG9zWzJdID0gZCAqIG5bMl0gKyBmWzJdO1xuXG4gICAgICB0aGlzLl9zZXRQb3NpdGlvbihwb3MpO1xuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2V0TWF4RGlzdGFuY2VcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0TWF4RGlzdGFuY2UoZCkge1xuICAgICAgdGhpcy5tYXhEaXN0YW5jZSA9IGQ7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2V0TWluRGlzdGFuY2VcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0TWluRGlzdGFuY2UoZCkge1xuICAgICAgdGhpcy5taW5EaXN0YW5jZSA9IGQ7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2hhbmdlcyB0aGUgaW5pdGlhbCBhemltdXRoIG9mIHRoZSBjYW1lcmFcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImNoYW5nZUF6aW11dGhcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY2hhbmdlQXppbXV0aChheikge1xuICAgICAgdGhpcy5zZXRBemltdXRoKHRoaXMuYXppbXV0aCArIGF6KTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGFuZ2VzIHRoZSBpbml0aWFsIGVsZXZhdGlvbiBvZiB0aGUgY2FtZXJhXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJjaGFuZ2VFbGV2YXRpb25cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY2hhbmdlRWxldmF0aW9uKGVsKSB7XG4gICAgICB0aGlzLnNldEVsZXZhdGlvbih0aGlzLmVsZXZhdGlvbiArIGVsKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGFuZ2VzIHRoZSBpbml0aWFsIHJvbGwgb2YgdGhlIGNhbWVyYVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiY2hhbmdlUm9sbFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjaGFuZ2VSb2xsKHJsKSB7XG4gICAgICB0aGlzLnNldFJvbGwodGhpcy5yb2xsICsgcmwpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIOiuvue9ruebuOacuuaWueS9jeinku+8jOS4jeWQjOebuOacuuaooeW8j+S4i+mcgOimgemHjeaWsOiuoeeul+ebuOacuuS9jee9ruaIluiAheaYr+inhueCueS9jee9rlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBlbCB0aGUgYXppbXV0aCBpbiBkZWdyZWVzXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJzZXRBemltdXRoXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldEF6aW11dGgoYXopIHtcbiAgICAgIHRoaXMuYXppbXV0aCA9IGdldEFuZ2xlKGF6KTtcbiAgICAgIHRoaXMuY29tcHV0ZU1hdHJpeCgpO1xuXG4gICAgICB0aGlzLl9nZXRBeGVzKCk7XG5cbiAgICAgIGlmICh0aGlzLnR5cGUgPT09IENBTUVSQV9UWVBFLk9SQklUSU5HIHx8IHRoaXMudHlwZSA9PT0gQ0FNRVJBX1RZUEUuRVhQTE9SSU5HKSB7XG4gICAgICAgIHRoaXMuX2dldFBvc2l0aW9uKCk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMudHlwZSA9PT0gQ0FNRVJBX1RZUEUuVFJBQ0tJTkcpIHtcbiAgICAgICAgdGhpcy5fZ2V0Rm9jYWxQb2ludCgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0QXppbXV0aFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRBemltdXRoKCkge1xuICAgICAgcmV0dXJuIHRoaXMuYXppbXV0aDtcbiAgICB9XG4gICAgLyoqXG4gICAgICog6K6+572u55u45py65pa55L2N6KeS77yM5LiN5ZCM55u45py65qih5byP5LiL6ZyA6KaB6YeN5paw6K6h566X55u45py65L2N572u5oiW6ICF5piv6KeG54K55L2N572uXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGVsIHRoZSBlbGV2YXRpb24gaW4gZGVncmVlc1xuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwic2V0RWxldmF0aW9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldEVsZXZhdGlvbihlbCkge1xuICAgICAgdGhpcy5lbGV2YXRpb24gPSBnZXRBbmdsZShlbCk7XG4gICAgICB0aGlzLmNvbXB1dGVNYXRyaXgoKTtcblxuICAgICAgdGhpcy5fZ2V0QXhlcygpO1xuXG4gICAgICBpZiAodGhpcy50eXBlID09PSBDQU1FUkFfVFlQRS5PUkJJVElORyB8fCB0aGlzLnR5cGUgPT09IENBTUVSQV9UWVBFLkVYUExPUklORykge1xuICAgICAgICB0aGlzLl9nZXRQb3NpdGlvbigpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnR5cGUgPT09IENBTUVSQV9UWVBFLlRSQUNLSU5HKSB7XG4gICAgICAgIHRoaXMuX2dldEZvY2FsUG9pbnQoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIOiuvue9ruebuOacuuaWueS9jeinku+8jOS4jeWQjOebuOacuuaooeW8j+S4i+mcgOimgemHjeaWsOiuoeeul+ebuOacuuS9jee9ruaIluiAheaYr+inhueCueS9jee9rlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBhbmdsZSB0aGUgcm9sbCBhbmdsZVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwic2V0Um9sbFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRSb2xsKGFuZ2xlKSB7XG4gICAgICB0aGlzLnJvbGwgPSBnZXRBbmdsZShhbmdsZSk7XG4gICAgICB0aGlzLmNvbXB1dGVNYXRyaXgoKTtcblxuICAgICAgdGhpcy5fZ2V0QXhlcygpO1xuXG4gICAgICBpZiAodGhpcy50eXBlID09PSBDQU1FUkFfVFlQRS5PUkJJVElORyB8fCB0aGlzLnR5cGUgPT09IENBTUVSQV9UWVBFLkVYUExPUklORykge1xuICAgICAgICB0aGlzLl9nZXRQb3NpdGlvbigpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnR5cGUgPT09IENBTUVSQV9UWVBFLlRSQUNLSU5HKSB7XG4gICAgICAgIHRoaXMuX2dldEZvY2FsUG9pbnQoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoYW5nZXMgdGhlIGF6aW11dGggYW5kIGVsZXZhdGlvbiB3aXRoIHJlc3BlY3QgdG8gdGhlIGN1cnJlbnQgY2FtZXJhIGF4ZXNcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gYXppbXV0aCB0aGUgcmVsYXRpdmUgYXppbXV0aFxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBlbGV2YXRpb24gdGhlIHJlbGF0aXZlIGVsZXZhdGlvblxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSByb2xsIHRoZSByZWxhdGl2ZSByb2xsXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJyb3RhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcm90YXRlKGF6aW11dGgsIGVsZXZhdGlvbiwgcm9sbCkge1xuICAgICAgaWYgKHRoaXMudHlwZSA9PT0gQ0FNRVJBX1RZUEUuRVhQTE9SSU5HKSB7XG4gICAgICAgIGF6aW11dGggPSBnZXRBbmdsZShhemltdXRoKTtcbiAgICAgICAgZWxldmF0aW9uID0gZ2V0QW5nbGUoZWxldmF0aW9uKTtcbiAgICAgICAgcm9sbCA9IGdldEFuZ2xlKHJvbGwpO1xuICAgICAgICB2YXIgcm90WCA9IHF1YXQuc2V0QXhpc0FuZ2xlKHF1YXQuY3JlYXRlKCksIFsxLCAwLCAwXSwgKHRoaXMucm90YXRlV29ybGQgPyAxIDogLTEpICogZWxldmF0aW9uICogREVHXzJfUkFEKTtcbiAgICAgICAgdmFyIHJvdFkgPSBxdWF0LnNldEF4aXNBbmdsZShxdWF0LmNyZWF0ZSgpLCBbMCwgMSwgMF0sICh0aGlzLnJvdGF0ZVdvcmxkID8gMSA6IC0xKSAqIGF6aW11dGggKiBERUdfMl9SQUQpO1xuICAgICAgICB2YXIgcm90WiA9IHF1YXQuc2V0QXhpc0FuZ2xlKHF1YXQuY3JlYXRlKCksIFswLCAwLCAxXSwgcm9sbCAqIERFR18yX1JBRCk7XG4gICAgICAgIHZhciByb3RRID0gcXVhdC5tdWx0aXBseShxdWF0LmNyZWF0ZSgpLCByb3RZLCByb3RYKTtcbiAgICAgICAgcm90USA9IHF1YXQubXVsdGlwbHkocXVhdC5jcmVhdGUoKSwgcm90USwgcm90Wik7XG4gICAgICAgIHZhciByb3RNYXRyaXggPSBtYXQ0LmZyb21RdWF0KG1hdDQuY3JlYXRlKCksIHJvdFEpO1xuICAgICAgICBtYXQ0LnRyYW5zbGF0ZSh0aGlzLm1hdHJpeCwgdGhpcy5tYXRyaXgsIFswLCAwLCAtdGhpcy5kaXN0YW5jZV0pO1xuICAgICAgICBtYXQ0Lm11bHRpcGx5KHRoaXMubWF0cml4LCB0aGlzLm1hdHJpeCwgcm90TWF0cml4KTtcbiAgICAgICAgbWF0NC50cmFuc2xhdGUodGhpcy5tYXRyaXgsIHRoaXMubWF0cml4LCBbMCwgMCwgdGhpcy5kaXN0YW5jZV0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKE1hdGguYWJzKHRoaXMuZWxldmF0aW9uICsgZWxldmF0aW9uKSA+IDkwKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZWxFbGV2YXRpb24gPSBnZXRBbmdsZShlbGV2YXRpb24pO1xuICAgICAgICB0aGlzLnJlbEF6aW11dGggPSBnZXRBbmdsZShhemltdXRoKTtcbiAgICAgICAgdGhpcy5yZWxSb2xsID0gZ2V0QW5nbGUocm9sbCk7XG4gICAgICAgIHRoaXMuZWxldmF0aW9uICs9IHRoaXMucmVsRWxldmF0aW9uO1xuICAgICAgICB0aGlzLmF6aW11dGggKz0gdGhpcy5yZWxBemltdXRoO1xuICAgICAgICB0aGlzLnJvbGwgKz0gdGhpcy5yZWxSb2xsO1xuICAgICAgICB0aGlzLmNvbXB1dGVNYXRyaXgoKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fZ2V0QXhlcygpO1xuXG4gICAgICBpZiAodGhpcy50eXBlID09PSBDQU1FUkFfVFlQRS5PUkJJVElORyB8fCB0aGlzLnR5cGUgPT09IENBTUVSQV9UWVBFLkVYUExPUklORykge1xuICAgICAgICB0aGlzLl9nZXRQb3NpdGlvbigpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnR5cGUgPT09IENBTUVSQV9UWVBFLlRSQUNLSU5HKSB7XG4gICAgICAgIHRoaXMuX2dldEZvY2FsUG9pbnQoKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fdXBkYXRlKCk7XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiDmsr/msLTlubMocmlnaHQpICYg5Z6C55u0KHVwKeW5s+enu+ebuOaculxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwicGFuXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHBhbih0eCwgdHkpIHtcbiAgICAgIHZhciBjb29yZHMgPSBjcmVhdGVWZWMzKHR4LCB0eSwgMCk7XG4gICAgICB2YXIgcG9zID0gdmVjMy5jbG9uZSh0aGlzLnBvc2l0aW9uKTtcbiAgICAgIHZlYzMuYWRkKHBvcywgcG9zLCB2ZWMzLnNjYWxlKHZlYzMuY3JlYXRlKCksIHRoaXMucmlnaHQsIGNvb3Jkc1swXSkpO1xuICAgICAgdmVjMy5hZGQocG9zLCBwb3MsIHZlYzMuc2NhbGUodmVjMy5jcmVhdGUoKSwgdGhpcy51cCwgY29vcmRzWzFdKSk7XG5cbiAgICAgIHRoaXMuX3NldFBvc2l0aW9uKHBvcyk7XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiDmsr8gbiDovbTnp7vliqjvvIzlvZPot53nprvop4bngrnov5zml7bnp7vliqjpgJ/luqbovoPlv6vvvIznprvop4bngrnotorov5HpgJ/luqbotormhaJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImRvbGx5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRvbGx5KHZhbHVlKSB7XG4gICAgICB2YXIgbiA9IHRoaXMuZm9yd2FyZDtcbiAgICAgIHZhciBwb3MgPSB2ZWMzLmNsb25lKHRoaXMucG9zaXRpb24pO1xuICAgICAgdmFyIHN0ZXAgPSB2YWx1ZSAqIHRoaXMuZG9sbHlpbmdTdGVwO1xuICAgICAgdmFyIHVwZGF0ZWREaXN0YW5jZSA9IHRoaXMuZGlzdGFuY2UgKyB2YWx1ZSAqIHRoaXMuZG9sbHlpbmdTdGVwOyAvLyDpmZDliLbop4bngrnot53nprvojIPlm7RcblxuICAgICAgc3RlcCA9IE1hdGgubWF4KE1hdGgubWluKHVwZGF0ZWREaXN0YW5jZSwgdGhpcy5tYXhEaXN0YW5jZSksIHRoaXMubWluRGlzdGFuY2UpIC0gdGhpcy5kaXN0YW5jZTtcbiAgICAgIHBvc1swXSArPSBzdGVwICogblswXTtcbiAgICAgIHBvc1sxXSArPSBzdGVwICogblsxXTtcbiAgICAgIHBvc1syXSArPSBzdGVwICogblsyXTtcblxuICAgICAgdGhpcy5fc2V0UG9zaXRpb24ocG9zKTtcblxuICAgICAgaWYgKHRoaXMudHlwZSA9PT0gQ0FNRVJBX1RZUEUuT1JCSVRJTkcgfHwgdGhpcy50eXBlID09PSBDQU1FUkFfVFlQRS5FWFBMT1JJTkcpIHtcbiAgICAgICAgLy8g6YeN5paw6K6h566X6KeG54K56Led56a7XG4gICAgICAgIHRoaXMuX2dldERpc3RhbmNlKCk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMudHlwZSA9PT0gQ0FNRVJBX1RZUEUuVFJBQ0tJTkcpIHtcbiAgICAgICAgLy8g5L+d5oyB6KeG6Led77yM56e75Yqo6KeG54K55L2N572uXG4gICAgICAgIHZlYzMuYWRkKHRoaXMuZm9jYWxQb2ludCwgcG9zLCB0aGlzLmRpc3RhbmNlVmVjdG9yKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNyZWF0ZUxhbmRtYXJrXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNyZWF0ZUxhbmRtYXJrKG5hbWUsIHBhcmFtcykge1xuICAgICAgdmFyIGNhbWVyYSA9IHRoaXMuY2xvbmUoKTtcbiAgICAgIGNhbWVyYS5zZXRQb3NpdGlvbihwYXJhbXMucG9zaXRpb24pO1xuICAgICAgY2FtZXJhLnNldEZvY2FsUG9pbnQocGFyYW1zLmZvY2FsUG9pbnQpO1xuXG4gICAgICBpZiAocGFyYW1zLnJvbGwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjYW1lcmEuc2V0Um9sbChwYXJhbXMucm9sbCk7XG4gICAgICB9XG5cbiAgICAgIHZhciBsYW5kbWFyayA9IG5ldyBMYW5kbWFyayhuYW1lLCBjYW1lcmEpO1xuICAgICAgdGhpcy5sYW5kbWFya3MucHVzaChsYW5kbWFyayk7XG4gICAgICByZXR1cm4gbGFuZG1hcms7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNldExhbmRtYXJrXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldExhbmRtYXJrKG5hbWUpIHtcbiAgICAgIHZhciBsYW5kbWFyayA9IG5ldyBMYW5kbWFyayhuYW1lLCB0aGlzKTtcbiAgICAgIHRoaXMubGFuZG1hcmtzLnB1c2gobGFuZG1hcmspO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdvdG9MYW5kbWFya1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnb3RvTGFuZG1hcmsobmFtZSkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgdmFyIGR1cmF0aW9uID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiAxMDAwO1xuICAgICAgdmFyIGxhbmRtYXJrID0gdGhpcy5sYW5kbWFya3MuZmluZChmdW5jdGlvbiAobCkge1xuICAgICAgICByZXR1cm4gbC5uYW1lID09PSBuYW1lO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChsYW5kbWFyaykge1xuICAgICAgICBpZiAoZHVyYXRpb24gPT09IDApIHtcbiAgICAgICAgICBsYW5kbWFyay5yZXRyaWV2ZSh0aGlzKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5sYW5kbWFya0FuaW1hdGlvbklEICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5sYW5kbWFya0FuaW1hdGlvbklEKTtcbiAgICAgICAgfSAvLyBUT0RPOiBkbyBub3QgcHJvY2VzcyBldmVudHMgZHVyaW5nIGFuaW1hdGlvblxuXG5cbiAgICAgICAgdGhpcy5pbnRlcmFjdG9yLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgdmFyIGRlc3RQb3NpdGlvbiA9IGxhbmRtYXJrLmdldFBvc2l0aW9uKCk7XG4gICAgICAgIHZhciBkZXN0Rm9jYWxQb2ludCA9IGxhbmRtYXJrLmdldEZvY2FsUG9pbnQoKTtcbiAgICAgICAgdmFyIGRlc3RSb2xsID0gbGFuZG1hcmsuZ2V0Um9sbCgpO1xuICAgICAgICB2YXIgdGltZVN0YXJ0O1xuXG4gICAgICAgIHZhciBhbmltYXRlID0gZnVuY3Rpb24gYW5pbWF0ZSh0aW1lc3RhbXApIHtcbiAgICAgICAgICBpZiAodGltZVN0YXJ0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRpbWVTdGFydCA9IHRpbWVzdGFtcDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgZWxhcHNlZCA9IHRpbWVzdGFtcCAtIHRpbWVTdGFydDsgLy8gVE9ETzogdXNlIGJldHRlciBlYXNlIGZ1bmN0aW9uXG5cbiAgICAgICAgICB2YXIgdCA9ICgxIC0gTWF0aC5jb3MoZWxhcHNlZCAvIGR1cmF0aW9uICogTWF0aC5QSSkpIC8gMjtcbiAgICAgICAgICB2YXIgaW50ZXJGb2NhbFBvaW50ID0gdmVjMy5jcmVhdGUoKTtcbiAgICAgICAgICB2YXIgaW50ZXJQb3NpdGlvbiA9IHZlYzMuY3JlYXRlKCk7XG4gICAgICAgICAgdmFyIGludGVyUm9sbCA9IDA7XG4gICAgICAgICAgdmVjMy5sZXJwKGludGVyRm9jYWxQb2ludCwgX3RoaXMuZm9jYWxQb2ludCwgZGVzdEZvY2FsUG9pbnQsIHQpO1xuICAgICAgICAgIHZlYzMubGVycChpbnRlclBvc2l0aW9uLCBfdGhpcy5wb3NpdGlvbiwgZGVzdFBvc2l0aW9uLCB0KTtcbiAgICAgICAgICBpbnRlclJvbGwgPSBfdGhpcy5yb2xsICogKDEgLSB0KSArIGRlc3RSb2xsICogdDtcblxuICAgICAgICAgIF90aGlzLnNldEZvY2FsUG9pbnQoaW50ZXJGb2NhbFBvaW50KTtcblxuICAgICAgICAgIF90aGlzLnNldFBvc2l0aW9uKGludGVyUG9zaXRpb24pO1xuXG4gICAgICAgICAgX3RoaXMuc2V0Um9sbChpbnRlclJvbGwpO1xuXG4gICAgICAgICAgX3RoaXMuY29tcHV0ZU1hdHJpeCgpO1xuXG4gICAgICAgICAgdmFyIGRpc3QgPSB2ZWMzLmRpc3QoaW50ZXJGb2NhbFBvaW50LCBkZXN0Rm9jYWxQb2ludCkgKyB2ZWMzLmRpc3QoaW50ZXJQb3NpdGlvbiwgZGVzdFBvc2l0aW9uKTtcblxuICAgICAgICAgIGlmIChkaXN0ID4gMC4wMSkgey8vXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIF90aGlzLnNldEZvY2FsUG9pbnQoaW50ZXJGb2NhbFBvaW50KTtcblxuICAgICAgICAgICAgX3RoaXMuc2V0UG9zaXRpb24oaW50ZXJQb3NpdGlvbik7XG5cbiAgICAgICAgICAgIF90aGlzLnNldFJvbGwoaW50ZXJSb2xsKTtcblxuICAgICAgICAgICAgX3RoaXMuY29tcHV0ZU1hdHJpeCgpO1xuXG4gICAgICAgICAgICBfdGhpcy5pbnRlcmFjdG9yLmNvbm5lY3QoKTtcblxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChlbGFwc2VkIDwgZHVyYXRpb24pIHtcbiAgICAgICAgICAgIF90aGlzLmxhbmRtYXJrQW5pbWF0aW9uSUQgPSB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGFuaW1hdGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGFuaW1hdGUpO1xuICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiDmoLnmja7nm7jmnLrnn6npmLXph43mlrDorqHnrpflkITnp43nm7jmnLrlj4LmlbBcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIl91cGRhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX3VwZGF0ZSgpIHtcbiAgICAgIHRoaXMuX2dldEF4ZXMoKTtcblxuICAgICAgdGhpcy5fZ2V0UG9zaXRpb24oKTtcblxuICAgICAgdGhpcy5fZ2V0RGlzdGFuY2UoKTtcblxuICAgICAgdGhpcy5fZ2V0QW5nbGVzKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIOiuoeeul+ebuOacuuefqemYtVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiY29tcHV0ZU1hdHJpeFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wdXRlTWF0cml4KCkge1xuICAgICAgdmFyIHJvdFg7XG4gICAgICB2YXIgcm90WTsgLy8g5L2/55So5Zub5YWD5pWw5o+P6L+wIDNEIOaXi+i9rFxuICAgICAgLy8gQHNlZSBodHRwczovL3hpYW9pdmVyLmdpdGh1Yi5pby9jb2RpbmcvMjAxOC8xMi8yOC9DYW1lcmEtJUU4JUFFJUJFJUU4JUFFJUExLSVFNCVCOCU4MC5odG1sXG5cbiAgICAgIHZhciByb3RaID0gcXVhdC5zZXRBeGlzQW5nbGUocXVhdC5jcmVhdGUoKSwgWzAsIDAsIDFdLCB0aGlzLnJvbGwgKiBERUdfMl9SQUQpO1xuICAgICAgbWF0NC5pZGVudGl0eSh0aGlzLm1hdHJpeCk7IC8vIG9ubHkgY29uc2lkZXIgSENTIGZvciBFWFBMT1JJTkcgYW5kIE9SQklUSU5HIGNhbWVyYXNcblxuICAgICAgcm90WCA9IHF1YXQuc2V0QXhpc0FuZ2xlKHF1YXQuY3JlYXRlKCksIFsxLCAwLCAwXSwgKHRoaXMucm90YXRlV29ybGQgJiYgdGhpcy50eXBlICE9PSBDQU1FUkFfVFlQRS5UUkFDS0lORyB8fCB0aGlzLnR5cGUgPT09IENBTUVSQV9UWVBFLlRSQUNLSU5HID8gMSA6IC0xKSAqIHRoaXMuZWxldmF0aW9uICogREVHXzJfUkFEKTtcbiAgICAgIHJvdFkgPSBxdWF0LnNldEF4aXNBbmdsZShxdWF0LmNyZWF0ZSgpLCBbMCwgMSwgMF0sICh0aGlzLnJvdGF0ZVdvcmxkICYmIHRoaXMudHlwZSAhPT0gQ0FNRVJBX1RZUEUuVFJBQ0tJTkcgfHwgdGhpcy50eXBlID09PSBDQU1FUkFfVFlQRS5UUkFDS0lORyA/IDEgOiAtMSkgKiB0aGlzLmF6aW11dGggKiBERUdfMl9SQUQpO1xuICAgICAgdmFyIHJvdFEgPSBxdWF0Lm11bHRpcGx5KHF1YXQuY3JlYXRlKCksIHJvdFksIHJvdFgpO1xuICAgICAgcm90USA9IHF1YXQubXVsdGlwbHkocXVhdC5jcmVhdGUoKSwgcm90USwgcm90Wik7XG4gICAgICB2YXIgcm90TWF0cml4ID0gbWF0NC5mcm9tUXVhdChtYXQ0LmNyZWF0ZSgpLCByb3RRKTtcblxuICAgICAgaWYgKHRoaXMudHlwZSA9PT0gQ0FNRVJBX1RZUEUuT1JCSVRJTkcgfHwgdGhpcy50eXBlID09PSBDQU1FUkFfVFlQRS5FWFBMT1JJTkcpIHtcbiAgICAgICAgbWF0NC50cmFuc2xhdGUodGhpcy5tYXRyaXgsIHRoaXMubWF0cml4LCB0aGlzLmZvY2FsUG9pbnQpO1xuICAgICAgICBtYXQ0Lm11bHRpcGx5KHRoaXMubWF0cml4LCB0aGlzLm1hdHJpeCwgcm90TWF0cml4KTtcbiAgICAgICAgbWF0NC50cmFuc2xhdGUodGhpcy5tYXRyaXgsIHRoaXMubWF0cml4LCBbMCwgMCwgdGhpcy5kaXN0YW5jZV0pO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnR5cGUgPT09IENBTUVSQV9UWVBFLlRSQUNLSU5HKSB7XG4gICAgICAgIG1hdDQudHJhbnNsYXRlKHRoaXMubWF0cml4LCB0aGlzLm1hdHJpeCwgdGhpcy5wb3NpdGlvbik7XG4gICAgICAgIG1hdDQubXVsdGlwbHkodGhpcy5tYXRyaXgsIHRoaXMubWF0cml4LCByb3RNYXRyaXgpO1xuICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBjYW1lcmEgcG9zaXRpb24gaW4gdGhlIGNhbWVyYSBtYXRyaXhcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIl9zZXRQb3NpdGlvblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfc2V0UG9zaXRpb24oeCwgeSwgeikge1xuICAgICAgdGhpcy5wb3NpdGlvbiA9IGNyZWF0ZVZlYzMoeCwgeSwgeik7XG4gICAgICB2YXIgbSA9IHRoaXMubWF0cml4O1xuICAgICAgbVsxMl0gPSB0aGlzLnBvc2l0aW9uWzBdO1xuICAgICAgbVsxM10gPSB0aGlzLnBvc2l0aW9uWzFdO1xuICAgICAgbVsxNF0gPSB0aGlzLnBvc2l0aW9uWzJdO1xuICAgICAgbVsxNV0gPSAxO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWNhbGN1bGF0ZXMgYXhlcyBiYXNlZCBvbiB0aGUgY3VycmVudCBtYXRyaXhcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIl9nZXRBeGVzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9nZXRBeGVzKCkge1xuICAgICAgdmVjMy5jb3B5KHRoaXMucmlnaHQsIGNyZWF0ZVZlYzModmVjNC50cmFuc2Zvcm1NYXQ0KHZlYzQuY3JlYXRlKCksIFsxLCAwLCAwLCAwXSwgdGhpcy5tYXRyaXgpKSk7XG4gICAgICB2ZWMzLmNvcHkodGhpcy51cCwgY3JlYXRlVmVjMyh2ZWM0LnRyYW5zZm9ybU1hdDQodmVjNC5jcmVhdGUoKSwgWzAsIDEsIDAsIDBdLCB0aGlzLm1hdHJpeCkpKTtcbiAgICAgIHZlYzMuY29weSh0aGlzLmZvcndhcmQsIGNyZWF0ZVZlYzModmVjNC50cmFuc2Zvcm1NYXQ0KHZlYzQuY3JlYXRlKCksIFswLCAwLCAxLCAwXSwgdGhpcy5tYXRyaXgpKSk7XG4gICAgICB2ZWMzLm5vcm1hbGl6ZSh0aGlzLnJpZ2h0LCB0aGlzLnJpZ2h0KTtcbiAgICAgIHZlYzMubm9ybWFsaXplKHRoaXMudXAsIHRoaXMudXApO1xuICAgICAgdmVjMy5ub3JtYWxpemUodGhpcy5mb3J3YXJkLCB0aGlzLmZvcndhcmQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWNhbGN1bGF0ZXMgZXVsZXIgYW5nbGVzIGJhc2VkIG9uIHRoZSBjdXJyZW50IHN0YXRlXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJfZ2V0QW5nbGVzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9nZXRBbmdsZXMoKSB7XG4gICAgICAvLyBSZWNhbGN1bGF0ZXMgYW5nbGVzXG4gICAgICB2YXIgeCA9IHRoaXMuZGlzdGFuY2VWZWN0b3JbMF07XG4gICAgICB2YXIgeSA9IHRoaXMuZGlzdGFuY2VWZWN0b3JbMV07XG4gICAgICB2YXIgeiA9IHRoaXMuZGlzdGFuY2VWZWN0b3JbMl07XG4gICAgICB2YXIgciA9IHZlYzMubGVuZ3RoKHRoaXMuZGlzdGFuY2VWZWN0b3IpOyAvLyBGQVNUIEZBSUw6IElmIHRoZXJlIGlzIG5vIGRpc3RhbmNlIHdlIGNhbm5vdCBjb21wdXRlIGFuZ2xlc1xuXG4gICAgICBpZiAociA9PT0gMCkge1xuICAgICAgICB0aGlzLmVsZXZhdGlvbiA9IDA7XG4gICAgICAgIHRoaXMuYXppbXV0aCA9IDA7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMudHlwZSA9PT0gQ0FNRVJBX1RZUEUuVFJBQ0tJTkcpIHtcbiAgICAgICAgdGhpcy5lbGV2YXRpb24gPSBNYXRoLmFzaW4oeSAvIHIpICogUkFEXzJfREVHO1xuICAgICAgICB0aGlzLmF6aW11dGggPSBNYXRoLmF0YW4yKC14LCAteikgKiBSQURfMl9ERUc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodGhpcy5yb3RhdGVXb3JsZCkge1xuICAgICAgICAgIHRoaXMuZWxldmF0aW9uID0gTWF0aC5hc2luKHkgLyByKSAqIFJBRF8yX0RFRztcbiAgICAgICAgICB0aGlzLmF6aW11dGggPSBNYXRoLmF0YW4yKC14LCAteikgKiBSQURfMl9ERUc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5lbGV2YXRpb24gPSAtTWF0aC5hc2luKHkgLyByKSAqIFJBRF8yX0RFRztcbiAgICAgICAgICB0aGlzLmF6aW11dGggPSAtTWF0aC5hdGFuMigteCwgLXopICogUkFEXzJfREVHO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIOmHjeaWsOiuoeeul+ebuOacuuS9jee9ru+8jOWPquaciSBPUkJJVElORyDmqKHlvI/nm7jmnLrkvY3nva7miY3kvJrlj5HnlJ/lj5jljJZcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIl9nZXRQb3NpdGlvblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfZ2V0UG9zaXRpb24oKSB7XG4gICAgICB2ZWMzLmNvcHkodGhpcy5wb3NpdGlvbiwgY3JlYXRlVmVjMyh2ZWM0LnRyYW5zZm9ybU1hdDQodmVjNC5jcmVhdGUoKSwgWzAsIDAsIDAsIDFdLCB0aGlzLm1hdHJpeCkpKTsgLy8g55u45py65L2N572u5Y+Y5YyW77yM6ZyA6KaB6YeN5paw6K6h566X6KeG6LedXG5cbiAgICAgIHRoaXMuX2dldERpc3RhbmNlKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIOmHjeaWsOiuoeeul+inhueCue+8jOWPquaciSBUUkFDS0lORyDmqKHlvI/op4bngrnmiY3kvJrlj5HnlJ/lj5jljJZcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIl9nZXRGb2NhbFBvaW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9nZXRGb2NhbFBvaW50KCkge1xuICAgICAgdmVjMy50cmFuc2Zvcm1NYXQzKHRoaXMuZGlzdGFuY2VWZWN0b3IsIFswLCAwLCAtdGhpcy5kaXN0YW5jZV0sIG1hdDMuZnJvbU1hdDQobWF0My5jcmVhdGUoKSwgdGhpcy5tYXRyaXgpKTtcbiAgICAgIHZlYzMuYWRkKHRoaXMuZm9jYWxQb2ludCwgdGhpcy5wb3NpdGlvbiwgdGhpcy5kaXN0YW5jZVZlY3Rvcik7IC8vIOinhueCueWPmOWMlu+8jOmcgOimgemHjeaWsOiuoeeul+inhui3nVxuXG4gICAgICB0aGlzLl9nZXREaXN0YW5jZSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiDph43mlrDorqHnrpfop4bot51cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIl9nZXREaXN0YW5jZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfZ2V0RGlzdGFuY2UoKSB7XG4gICAgICB0aGlzLmRpc3RhbmNlVmVjdG9yID0gdmVjMy5zdWJ0cmFjdCh2ZWMzLmNyZWF0ZSgpLCB0aGlzLmZvY2FsUG9pbnQsIHRoaXMucG9zaXRpb24pO1xuICAgICAgdGhpcy5kaXN0YW5jZSA9IHZlYzMubGVuZ3RoKHRoaXMuZGlzdGFuY2VWZWN0b3IpO1xuICAgICAgdGhpcy5kb2xseWluZ1N0ZXAgPSB0aGlzLmRpc3RhbmNlIC8gMTAwO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBDYW1lcmE7XG59KCksIF9jbGFzczMuUHJvamVjdGlvbk1vZGUgPSB7XG4gIE9SVEhPR1JBUEhJQzogJ09SVEhPR1JBUEhJQycsXG4gIFBFUlNQRUNUSVZFOiAnUEVSU1BFQ1RJVkUnXG59LCBfdGVtcCksIChfZGVzY3JpcHRvciA9IF9hcHBseURlY29yYXRlZERlc2NyaXB0b3IoX2NsYXNzMi5wcm90b3R5cGUsIFwiaW50ZXJhY3RvclwiLCBbX2RlYzJdLCB7XG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgd3JpdGFibGU6IHRydWUsXG4gIGluaXRpYWxpemVyOiBudWxsXG59KSksIF9jbGFzczIpKSB8fCBfY2xhc3MpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q2FtZXJhLmpzLm1hcCIsImltcG9ydCBfaW5pdGlhbGl6ZXJEZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbml0aWFsaXplckRlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrXCI7XG5pbXBvcnQgX2NyZWF0ZUNsYXNzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzXCI7XG5pbXBvcnQgX2FwcGx5RGVjb3JhdGVkRGVzY3JpcHRvciBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hcHBseURlY29yYXRlZERlc2NyaXB0b3JcIjtcbmltcG9ydCBfaW5pdGlhbGl6ZXJXYXJuaW5nSGVscGVyIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2luaXRpYWxpemVyV2FybmluZ0hlbHBlclwiO1xuXG52YXIgX2RlYywgX2RlYzIsIF9jbGFzcywgX2NsYXNzMiwgX2Rlc2NyaXB0b3IsIF9jbGFzczMsIF90ZW1wO1xuXG5pbXBvcnQgeyBJREVOVElGSUVSIH0gZnJvbSAnQGFudHYvZy13ZWJncHUtY29yZSc7XG5pbXBvcnQgeyBpbmplY3QsIGluamVjdGFibGUgfSBmcm9tICdpbnZlcnNpZnknO1xuZXhwb3J0IHZhciBHZW9tZXRyeSA9IChfZGVjID0gaW5qZWN0YWJsZSgpLCBfZGVjMiA9IGluamVjdChJREVOVElGSUVSLkdlb21ldHJ5Q29tcG9uZW50TWFuYWdlciksIF9kZWMoX2NsYXNzID0gKF9jbGFzczIgPSAoX3RlbXAgPSBfY2xhc3MzID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gR2VvbWV0cnkoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEdlb21ldHJ5KTtcblxuICAgIHRoaXMuY29uZmlnID0gdm9pZCAwO1xuXG4gICAgX2luaXRpYWxpemVyRGVmaW5lUHJvcGVydHkodGhpcywgXCJnZW9tZXRyeVwiLCBfZGVzY3JpcHRvciwgdGhpcyk7XG5cbiAgICB0aGlzLmVudGl0eSA9IHZvaWQgMDtcbiAgICB0aGlzLmNvbXBvbmVudCA9IHZvaWQgMDtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhHZW9tZXRyeSwgW3tcbiAgICBrZXk6IFwiZ2V0RW50aXR5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldEVudGl0eSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmVudGl0eTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0Q29tcG9uZW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldENvbXBvbmVudCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbXBvbmVudDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2V0Q29uZmlnXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldENvbmZpZyhjb25maWcpIHtcbiAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzZXRFbnRpdHlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0RW50aXR5KGVudGl0eSkge1xuICAgICAgdGhpcy5lbnRpdHkgPSBlbnRpdHk7XG4gICAgICB0aGlzLmNvbXBvbmVudCA9IHRoaXMuZ2VvbWV0cnkuY3JlYXRlKGVudGl0eSk7XG4gICAgICB0aGlzLmNvbXBvbmVudC5lbnRpdHkgPSBlbnRpdHk7XG4gICAgICB0aGlzLm9uRW50aXR5Q3JlYXRlZCgpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJvbkVudGl0eUNyZWF0ZWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gb25FbnRpdHlDcmVhdGVkKCkgey8vXG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEdlb21ldHJ5O1xufSgpLCBfY2xhc3MzLkJPWCA9ICdib3gnLCBfY2xhc3MzLlNQSEVSRSA9ICdzcGhlcmUnLCBfY2xhc3MzLlBMQU5FID0gJ3BsYW5lJywgX2NsYXNzMy5NRVJHRUQgPSAnbWVyZ2VkJywgX3RlbXApLCAoX2Rlc2NyaXB0b3IgPSBfYXBwbHlEZWNvcmF0ZWREZXNjcmlwdG9yKF9jbGFzczIucHJvdG90eXBlLCBcImdlb21ldHJ5XCIsIFtfZGVjMl0sIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICB3cml0YWJsZTogdHJ1ZSxcbiAgaW5pdGlhbGl6ZXI6IG51bGxcbn0pKSwgX2NsYXNzMikpIHx8IF9jbGFzcyk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJleHBvcnQgZnVuY3Rpb24gY3JlYXRlQ2FudmFzKCkge1xuICBpZiAodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBjcmVhdGUgYSBjYW52YXMgaW4gdGhpcyBjb250ZXh0Jyk7XG4gIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNhbnZhcy5qcy5tYXAiLCJ2YXIgdG9TdHJpbmcgPSB7fS50b1N0cmluZztcblxudmFyIGlzVHlwZSA9IGZ1bmN0aW9uIGlzVHlwZSh2YWx1ZSwgdHlwZSkge1xuICByZXR1cm4gdG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0ICcgKyB0eXBlICsgJ10nO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgaXNUeXBlO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aXMtdHlwZS5qcy5tYXAiLCJpbXBvcnQgaXNUeXBlIGZyb20gJy4vaXMtdHlwZSc7XG5leHBvcnQgZGVmYXVsdCAoZnVuY3Rpb24gKHZhbHVlKSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5ID8gQXJyYXkuaXNBcnJheSh2YWx1ZSkgOiBpc1R5cGUodmFsdWUsICdBcnJheScpO1xufSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pcy1hcnJheS5qcy5tYXAiLCJpbXBvcnQgX3R5cGVvZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy90eXBlb2ZcIjtcblxuLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgTUFYX1NBRkVfSU5URUdFUiA9IDkwMDcxOTkyNTQ3NDA5OTE7XG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG5cbnZhciBhcmdzVGFnID0gJ1tvYmplY3QgQXJndW1lbnRzXSc7XG52YXIgYXJyYXlUYWcgPSAnW29iamVjdCBBcnJheV0nO1xudmFyIGJvb2xUYWcgPSAnW29iamVjdCBCb29sZWFuXSc7XG52YXIgZGF0ZVRhZyA9ICdbb2JqZWN0IERhdGVdJztcbnZhciBlcnJvclRhZyA9ICdbb2JqZWN0IEVycm9yXSc7XG52YXIgZnVuY1RhZyA9ICdbb2JqZWN0IEZ1bmN0aW9uXSc7XG52YXIgbWFwVGFnID0gJ1tvYmplY3QgTWFwXSc7XG52YXIgbnVtYmVyVGFnID0gJ1tvYmplY3QgTnVtYmVyXSc7XG52YXIgb2JqZWN0VGFnID0gJ1tvYmplY3QgT2JqZWN0XSc7XG52YXIgcmVnZXhwVGFnID0gJ1tvYmplY3QgUmVnRXhwXSc7XG52YXIgc2V0VGFnID0gJ1tvYmplY3QgU2V0XSc7XG52YXIgc3RyaW5nVGFnID0gJ1tvYmplY3QgU3RyaW5nXSc7XG52YXIgd2Vha01hcFRhZyA9ICdbb2JqZWN0IFdlYWtNYXBdJztcbnZhciBhcnJheUJ1ZmZlclRhZyA9ICdbb2JqZWN0IEFycmF5QnVmZmVyXSc7XG52YXIgZGF0YVZpZXdUYWcgPSAnW29iamVjdCBEYXRhVmlld10nO1xudmFyIGZsb2F0MzJUYWcgPSAnW29iamVjdCBGbG9hdDMyQXJyYXldJztcbnZhciBmbG9hdDY0VGFnID0gJ1tvYmplY3QgRmxvYXQ2NEFycmF5XSc7XG52YXIgaW50OFRhZyA9ICdbb2JqZWN0IEludDhBcnJheV0nO1xudmFyIGludDE2VGFnID0gJ1tvYmplY3QgSW50MTZBcnJheV0nO1xudmFyIGludDMyVGFnID0gJ1tvYmplY3QgSW50MzJBcnJheV0nO1xudmFyIHVpbnQ4VGFnID0gJ1tvYmplY3QgVWludDhBcnJheV0nO1xudmFyIHVpbnQ4Q2xhbXBlZFRhZyA9ICdbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XSc7XG52YXIgdWludDE2VGFnID0gJ1tvYmplY3QgVWludDE2QXJyYXldJztcbnZhciB1aW50MzJUYWcgPSAnW29iamVjdCBVaW50MzJBcnJheV0nO1xuLyoqIFVzZWQgdG8gaWRlbnRpZnkgYHRvU3RyaW5nVGFnYCB2YWx1ZXMgb2YgdHlwZWQgYXJyYXlzLiAqL1xuXG52YXIgdHlwZWRBcnJheVRhZ3MgPSB7fTtcbnR5cGVkQXJyYXlUYWdzW2Zsb2F0MzJUYWddID0gdHlwZWRBcnJheVRhZ3NbZmxvYXQ2NFRhZ10gPSB0eXBlZEFycmF5VGFnc1tpbnQ4VGFnXSA9IHR5cGVkQXJyYXlUYWdzW2ludDE2VGFnXSA9IHR5cGVkQXJyYXlUYWdzW2ludDMyVGFnXSA9IHR5cGVkQXJyYXlUYWdzW3VpbnQ4VGFnXSA9IHR5cGVkQXJyYXlUYWdzW3VpbnQ4Q2xhbXBlZFRhZ10gPSB0eXBlZEFycmF5VGFnc1t1aW50MTZUYWddID0gdHlwZWRBcnJheVRhZ3NbdWludDMyVGFnXSA9IHRydWU7XG50eXBlZEFycmF5VGFnc1thcmdzVGFnXSA9IHR5cGVkQXJyYXlUYWdzW2FycmF5VGFnXSA9IHR5cGVkQXJyYXlUYWdzW2FycmF5QnVmZmVyVGFnXSA9IHR5cGVkQXJyYXlUYWdzW2Jvb2xUYWddID0gdHlwZWRBcnJheVRhZ3NbZGF0YVZpZXdUYWddID0gdHlwZWRBcnJheVRhZ3NbZGF0ZVRhZ10gPSB0eXBlZEFycmF5VGFnc1tlcnJvclRhZ10gPSB0eXBlZEFycmF5VGFnc1tmdW5jVGFnXSA9IHR5cGVkQXJyYXlUYWdzW21hcFRhZ10gPSB0eXBlZEFycmF5VGFnc1tudW1iZXJUYWddID0gdHlwZWRBcnJheVRhZ3Nbb2JqZWN0VGFnXSA9IHR5cGVkQXJyYXlUYWdzW3JlZ2V4cFRhZ10gPSB0eXBlZEFycmF5VGFnc1tzZXRUYWddID0gdHlwZWRBcnJheVRhZ3Nbc3RyaW5nVGFnXSA9IHR5cGVkQXJyYXlUYWdzW3dlYWtNYXBUYWddID0gZmFsc2U7XG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnVuYXJ5YCB3aXRob3V0IHN1cHBvcnQgZm9yIHN0b3JpbmcgbWV0YWRhdGEuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNhcCBhcmd1bWVudHMgZm9yLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY2FwcGVkIGZ1bmN0aW9uLlxuICovXG5cbmZ1bmN0aW9uIGJhc2VVbmFyeShmdW5jKSB7XG4gIHJldHVybiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICByZXR1cm4gZnVuYyh2YWx1ZSk7XG4gIH07XG59XG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG5cblxudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcbi8qKlxuICogVXNlZCB0byByZXNvbHZlIHRoZVxuICogW2B0b1N0cmluZ1RhZ2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmcpXG4gKiBvZiB2YWx1ZXMuXG4gKi9cblxudmFyIG9iamVjdFRvU3RyaW5nID0gb2JqZWN0UHJvdG8udG9TdHJpbmc7XG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzVHlwZWRBcnJheWAgd2l0aG91dCBOb2RlLmpzIG9wdGltaXphdGlvbnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB0eXBlZCBhcnJheSwgZWxzZSBgZmFsc2VgLlxuICovXG5cbmZ1bmN0aW9uIGJhc2VJc1R5cGVkQXJyYXkodmFsdWUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgaXNMZW5ndGgodmFsdWUubGVuZ3RoKSAmJiAhIXR5cGVkQXJyYXlUYWdzW29iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpXTtcbn1cblxuZnVuY3Rpb24gaXNMZW5ndGgodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgdmFsdWUgPiAtMSAmJiB2YWx1ZSAlIDEgPT09IDAgJiYgdmFsdWUgPD0gTUFYX1NBRkVfSU5URUdFUjtcbn1cblxuZnVuY3Rpb24gaXNPYmplY3RMaWtlKHZhbHVlKSB7XG4gIHJldHVybiAhIXZhbHVlICYmIF90eXBlb2YodmFsdWUpID09PSAnb2JqZWN0Jztcbn1cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIHR5cGVkIGFycmF5LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMy4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgdHlwZWQgYXJyYXksIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc1R5cGVkQXJyYXkobmV3IFVpbnQ4QXJyYXkpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNUeXBlZEFycmF5KFtdKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cblxuXG5leHBvcnQgdmFyIGlzVHlwZWRBcnJheSA9IGJhc2VJc1R5cGVkQXJyYXk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pcy10eXBlZGFycmF5LmpzLm1hcCIsImltcG9ydCBfcmVnZW5lcmF0b3JSdW50aW1lIGZyb20gXCJAYmFiZWwvcnVudGltZS9yZWdlbmVyYXRvclwiO1xuaW1wb3J0IF9hc3luY1RvR2VuZXJhdG9yIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2FzeW5jVG9HZW5lcmF0b3JcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfaW5pdGlhbGl6ZXJEZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbml0aWFsaXplckRlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrXCI7XG5pbXBvcnQgX2NyZWF0ZUNsYXNzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzXCI7XG5pbXBvcnQgX2FwcGx5RGVjb3JhdGVkRGVzY3JpcHRvciBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hcHBseURlY29yYXRlZERlc2NyaXB0b3JcIjtcbmltcG9ydCBfaW5pdGlhbGl6ZXJXYXJuaW5nSGVscGVyIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2luaXRpYWxpemVyV2FybmluZ0hlbHBlclwiO1xuXG52YXIgX2RlYywgX2RlYzIsIF9kZWMzLCBfY2xhc3MsIF9jbGFzczIsIF9kZXNjcmlwdG9yLCBfZGVzY3JpcHRvcjIsIF90ZW1wO1xuXG5mdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHsgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTsgaWYgKGVudW1lcmFibGVPbmx5KSBzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTsgfSk7IGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsgfSByZXR1cm4ga2V5czsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldICE9IG51bGwgPyBhcmd1bWVudHNbaV0gOiB7fTsgaWYgKGkgJSAyKSB7IG93bktleXMoT2JqZWN0KHNvdXJjZSksIHRydWUpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSk7IH0gZWxzZSBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMpIHsgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKTsgfSBlbHNlIHsgb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpOyB9KTsgfSB9IHJldHVybiB0YXJnZXQ7IH1cblxuaW1wb3J0IHsgQVNUX1RPS0VOX1RZUEVTLCBjcmVhdGVFbnRpdHksIERlZmluZVZhbHVlUGxhY2Vob2xkZXIsIElERU5USUZJRVIsIFNUT1JBR0VfQ0xBU1MsIFRhcmdldCB9IGZyb20gJ0BhbnR2L2ctd2ViZ3B1LWNvcmUnOyAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tc3VibW9kdWxlLWltcG9ydHNcblxuaW1wb3J0ICogYXMgV2ViR1BVQ29uc3RhbnRzIGZyb20gJ0B3ZWJncHUvdHlwZXMvZGlzdC9jb25zdGFudHMnO1xuaW1wb3J0IHsgaW5qZWN0LCBpbmplY3RhYmxlIH0gZnJvbSAnaW52ZXJzaWZ5JztcbmltcG9ydCB7IGNyZWF0ZUNhbnZhcyB9IGZyb20gJy4vdXRpbHMvY2FudmFzJztcbmltcG9ydCBpc0FycmF5IGZyb20gJy4vdXRpbHMvaXMtYXJyYXknO1xuaW1wb3J0IHsgaXNOdW1iZXIgfSBmcm9tICcuL3V0aWxzL2lzLW51bWJlcic7XG5pbXBvcnQgeyBpc1R5cGVkQXJyYXkgfSBmcm9tICcuL3V0aWxzL2lzLXR5cGVkYXJyYXknO1xuZXhwb3J0IHZhciBLZXJuZWwgPSAoX2RlYyA9IGluamVjdGFibGUoKSwgX2RlYzIgPSBpbmplY3QoSURFTlRJRklFUi5SZW5kZXJFbmdpbmUpLCBfZGVjMyA9IGluamVjdChJREVOVElGSUVSLkNvbmZpZ1NlcnZpY2UpLCBfZGVjKF9jbGFzcyA9IChfY2xhc3MyID0gKF90ZW1wID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gS2VybmVsKCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBLZXJuZWwpO1xuXG4gICAgX2luaXRpYWxpemVyRGVmaW5lUHJvcGVydHkodGhpcywgXCJlbmdpbmVcIiwgX2Rlc2NyaXB0b3IsIHRoaXMpO1xuXG4gICAgX2luaXRpYWxpemVyRGVmaW5lUHJvcGVydHkodGhpcywgXCJjb25maWdTZXJ2aWNlXCIsIF9kZXNjcmlwdG9yMiwgdGhpcyk7XG5cbiAgICB0aGlzLmVudGl0eSA9IGNyZWF0ZUVudGl0eSgpO1xuICAgIHRoaXMubW9kZWwgPSB2b2lkIDA7XG4gICAgdGhpcy5kaXJ0eSA9IHRydWU7XG4gICAgdGhpcy5jb21waWxlZEJ1bmRsZSA9IHZvaWQgMDtcbiAgICB0aGlzLmluaXRQcm9taXNlID0gdm9pZCAwO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKEtlcm5lbCwgW3tcbiAgICBrZXk6IFwiaW5pdFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpbml0KCkge1xuICAgICAgdmFyIF90aGlzJGNvbmZpZ1NlcnZpY2UkZyA9IHRoaXMuY29uZmlnU2VydmljZS5nZXQoKSxcbiAgICAgICAgICBjYW52YXMgPSBfdGhpcyRjb25maWdTZXJ2aWNlJGcuY2FudmFzLFxuICAgICAgICAgIGVuZ2luZU9wdGlvbnMgPSBfdGhpcyRjb25maWdTZXJ2aWNlJGcuZW5naW5lT3B0aW9ucztcblxuICAgICAgdGhpcy5pbml0UHJvbWlzZSA9IHRoaXMuZW5naW5lLmluaXQoX29iamVjdFNwcmVhZCh7XG4gICAgICAgIGNhbnZhczogY2FudmFzIHx8IGNyZWF0ZUNhbnZhcygpLFxuICAgICAgICBzd2FwQ2hhaW5Gb3JtYXQ6IFdlYkdQVUNvbnN0YW50cy5UZXh0dXJlRm9ybWF0LkJHUkE4VW5vcm0sXG4gICAgICAgIGFudGlhbGlhc2luZzogZmFsc2VcbiAgICAgIH0sIGVuZ2luZU9wdGlvbnMpKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2V0QnVuZGxlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldEJ1bmRsZShidW5kbGUpIHtcbiAgICAgIC8vIGRlZXAgY2xvbmVcbiAgICAgIHRoaXMuY29tcGlsZWRCdW5kbGUgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGJ1bmRsZSkpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzZXREaXNwYXRjaFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXREaXNwYXRjaChkaXNwYXRjaCkge1xuICAgICAgaWYgKHRoaXMuY29tcGlsZWRCdW5kbGUuY29udGV4dCkge1xuICAgICAgICB0aGlzLmNvbXBpbGVkQnVuZGxlLmNvbnRleHQuZGlzcGF0Y2ggPSBkaXNwYXRjaDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNldE1heEl0ZXJhdGlvblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRNYXhJdGVyYXRpb24obWF4SXRlcmF0aW9uKSB7XG4gICAgICBpZiAodGhpcy5jb21waWxlZEJ1bmRsZS5jb250ZXh0KSB7XG4gICAgICAgIHRoaXMuY29tcGlsZWRCdW5kbGUuY29udGV4dC5tYXhJdGVyYXRpb24gPSBtYXhJdGVyYXRpb247XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzZXRCaW5kaW5nXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldEJpbmRpbmcobmFtZSwgZGF0YSkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgaWYgKHR5cGVvZiBuYW1lID09PSAnc3RyaW5nJykge1xuICAgICAgICB2YXIgaXNOdW1iZXJMaWtlRGF0YSA9IGlzTnVtYmVyKGRhdGEpIHx8IGlzVHlwZWRBcnJheShkYXRhKSB8fCBpc0FycmF5KGRhdGEpO1xuXG4gICAgICAgIGlmICh0aGlzLmNvbXBpbGVkQnVuZGxlICYmIHRoaXMuY29tcGlsZWRCdW5kbGUuY29udGV4dCkge1xuICAgICAgICAgIC8vIHNldCBkZWZpbmUsIGVnLiBzZXRCaW5kaW5nKCdNQVhfTEVOR1RIJywgMTApXG4gICAgICAgICAgdmFyIGV4aXN0ZWREZWZpbmUgPSB0aGlzLmNvbXBpbGVkQnVuZGxlLmNvbnRleHQuZGVmaW5lcy5maW5kKGZ1bmN0aW9uIChiKSB7XG4gICAgICAgICAgICByZXR1cm4gYi5uYW1lID09PSBuYW1lO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaWYgKGV4aXN0ZWREZWZpbmUpIHtcbiAgICAgICAgICAgIGV4aXN0ZWREZWZpbmUudmFsdWUgPSBkYXRhO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgfSAvLyBzZXQgdW5pZm9ybVxuXG5cbiAgICAgICAgICB2YXIgZXhpc3RlZEJpbmRpbmcgPSB0aGlzLmNvbXBpbGVkQnVuZGxlLmNvbnRleHQudW5pZm9ybXMuZmluZChmdW5jdGlvbiAoYikge1xuICAgICAgICAgICAgcmV0dXJuIGIubmFtZSA9PT0gbmFtZTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGlmIChleGlzdGVkQmluZGluZykge1xuICAgICAgICAgICAgLy8gdXBkYXRlIHVuaWZvcm0gb3IgYnVmZmVyXG4gICAgICAgICAgICBpZiAoaXNOdW1iZXJMaWtlRGF0YSkge1xuICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgIGV4aXN0ZWRCaW5kaW5nLmRhdGEgPSBkYXRhO1xuICAgICAgICAgICAgICBleGlzdGVkQmluZGluZy5pc1JlZmVyZXIgPSBmYWxzZTtcblxuICAgICAgICAgICAgICBpZiAoZXhpc3RlZEJpbmRpbmcuc3RvcmFnZUNsYXNzID09PSBTVE9SQUdFX0NMQVNTLlVuaWZvcm0pIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5tb2RlbCkge1xuICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgdGhpcy5tb2RlbC51cGRhdGVVbmlmb3JtKG5hbWUsIGRhdGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5tb2RlbCkge1xuICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgdGhpcy5tb2RlbC51cGRhdGVCdWZmZXIobmFtZSwgZGF0YSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyB1cGRhdGUgd2l0aCBhbm90aGVyIGtlcm5lbFxuICAgICAgICAgICAgICBleGlzdGVkQmluZGluZy5pc1JlZmVyZXIgPSB0cnVlOyAvLyBAdHMtaWdub3JlXG5cbiAgICAgICAgICAgICAgZXhpc3RlZEJpbmRpbmcuZGF0YSA9IGRhdGE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBPYmplY3Qua2V5cyhuYW1lKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICBfdGhpcy5zZXRCaW5kaW5nKGtleSwgbmFtZVtrZXldKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJleGVjdXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfZXhlY3V0ZSA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUoKSB7XG4gICAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICAgIHZhciBpdGVyYXRpb24sXG4gICAgICAgICAgICBpLFxuICAgICAgICAgICAgX2FyZ3MgPSBhcmd1bWVudHM7XG4gICAgICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoZnVuY3Rpb24gX2NhbGxlZSQoX2NvbnRleHQpIHtcbiAgICAgICAgICB3aGlsZSAoMSkge1xuICAgICAgICAgICAgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkge1xuICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgaXRlcmF0aW9uID0gX2FyZ3MubGVuZ3RoID4gMCAmJiBfYXJnc1swXSAhPT0gdW5kZWZpbmVkID8gX2FyZ3NbMF0gOiAxO1xuXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmRpcnR5KSB7XG4gICAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gNjtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbXBpbGVkQnVuZGxlLmNvbnRleHQpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChpdGVyYXRpb24gPiAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29tcGlsZWRCdW5kbGUuY29udGV4dC5tYXhJdGVyYXRpb24gPSBpdGVyYXRpb247XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXBpbGVkQnVuZGxlLmNvbnRleHQubWF4SXRlcmF0aW9uKys7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29tcGlsZSgpO1xuXG4gICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICB0aGlzLmRpcnR5ID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgIHRoaXMuZW5naW5lLmJlZ2luRnJhbWUoKTsgLy8g6aaW5YWI5byA5ZCv5b2T5YmNIGZyYW1lIOeahCBjb21wdXRlIHBhc3NcblxuICAgICAgICAgICAgICAgIHRoaXMuZW5naW5lLmNsZWFyKHt9KTtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbXBpbGVkQnVuZGxlLmNvbnRleHQpIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuY29tcGlsZWRCdW5kbGUuY29udGV4dC51bmlmb3Jtcy5maWx0ZXIoZnVuY3Rpb24gKF9yZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGlzUmVmZXJlciA9IF9yZWYuaXNSZWZlcmVyO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXNSZWZlcmVyO1xuICAgICAgICAgICAgICAgICAgfSkuZm9yRWFjaChmdW5jdGlvbiAoX3JlZjIpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGEgPSBfcmVmMi5kYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IF9yZWYyLm5hbWU7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICBfdGhpczIubW9kZWwuY29uZmlybUlucHV0KGRhdGEubW9kZWwsIG5hbWUpO1xuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGl0ZXJhdGlvbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLnJ1bigpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuZW5naW5lLmVuZEZyYW1lKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmFicnVwdChcInJldHVyblwiLCB0aGlzKTtcblxuICAgICAgICAgICAgICBjYXNlIDEyOlxuICAgICAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LnN0b3AoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sIF9jYWxsZWUsIHRoaXMpO1xuICAgICAgfSkpO1xuXG4gICAgICBmdW5jdGlvbiBleGVjdXRlKCkge1xuICAgICAgICByZXR1cm4gX2V4ZWN1dGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGV4ZWN1dGU7XG4gICAgfSgpXG4gICAgLyoqXG4gICAgICogcmVhZCBvdXRwdXQgZnJvbSBHUFVCdWZmZXJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImdldE91dHB1dFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX2dldE91dHB1dCA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUyKCkge1xuICAgICAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUyJChfY29udGV4dDIpIHtcbiAgICAgICAgICB3aGlsZSAoMSkge1xuICAgICAgICAgICAgc3dpdGNoIChfY29udGV4dDIucHJldiA9IF9jb250ZXh0Mi5uZXh0KSB7XG4gICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLmFicnVwdChcInJldHVyblwiLCB0aGlzLm1vZGVsLnJlYWREYXRhKCkpO1xuXG4gICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIuc3RvcCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSwgX2NhbGxlZTIsIHRoaXMpO1xuICAgICAgfSkpO1xuXG4gICAgICBmdW5jdGlvbiBnZXRPdXRwdXQoKSB7XG4gICAgICAgIHJldHVybiBfZ2V0T3V0cHV0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBnZXRPdXRwdXQ7XG4gICAgfSgpXG4gIH0sIHtcbiAgICBrZXk6IFwiY29tcGlsZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX2NvbXBpbGUgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUubWFyayhmdW5jdGlvbiBfY2FsbGVlMygpIHtcbiAgICAgICAgdmFyIGNvbnRleHQsIHRhcmdldCwgc2hhZGVyO1xuICAgICAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUzJChfY29udGV4dDMpIHtcbiAgICAgICAgICB3aGlsZSAoMSkge1xuICAgICAgICAgICAgc3dpdGNoIChfY29udGV4dDMucHJldiA9IF9jb250ZXh0My5uZXh0KSB7XG4gICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICBfY29udGV4dDMubmV4dCA9IDI7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5pdFByb21pc2U7XG5cbiAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgIGNvbnRleHQgPSBfb2JqZWN0U3ByZWFkKHt9LCB0aGlzLmNvbXBpbGVkQnVuZGxlLmNvbnRleHQpO1xuICAgICAgICAgICAgICAgIHRhcmdldCA9IHRoaXMuZW5naW5lLnN1cHBvcnRXZWJHUFUgPyB0aGlzLmVuZ2luZS51c2VXR1NMID8gVGFyZ2V0LldHU0wgOiBUYXJnZXQuR0xTTDQ1MCA6IFRhcmdldC5HTFNMMTAwO1xuICAgICAgICAgICAgICAgIHNoYWRlciA9IHRoaXMuY29tcGlsZWRCdW5kbGUuc2hhZGVyc1t0YXJnZXRdOyAvLyB0aGlzLmJpbmRpbmdzPy5mb3JFYWNoKCh7IG5hbWUsIGRhdGEgfSkgPT4ge1xuICAgICAgICAgICAgICAgIC8vICAgaWYgKG5hbWUgPT09IG5hbWUudG9VcHBlckNhc2UoKSkge1xuICAgICAgICAgICAgICAgIC8vICAgICBjb25zdCBkZWZpbmUgPSBjb250ZXh0LmRlZmluZXMuZmluZCgoZCkgPT4gZC5uYW1lID09PSBuYW1lKTtcbiAgICAgICAgICAgICAgICAvLyAgICAgaWYgKGRlZmluZSkge1xuICAgICAgICAgICAgICAgIC8vICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAvLyAgICAgICBkZWZpbmUudmFsdWUgPSBkYXRhO1xuICAgICAgICAgICAgICAgIC8vICAgICB9XG4gICAgICAgICAgICAgICAgLy8gICB9XG4gICAgICAgICAgICAgICAgLy8gfSk7XG4gICAgICAgICAgICAgICAgLy8g55Sf5oiQ6L+Q6KGM5pe2IGRlZmluZVxuXG4gICAgICAgICAgICAgICAgY29udGV4dC5kZWZpbmVzLmZpbHRlcihmdW5jdGlvbiAoZGVmaW5lKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gZGVmaW5lLnJ1bnRpbWU7XG4gICAgICAgICAgICAgICAgfSkuZm9yRWFjaChmdW5jdGlvbiAoZGVmaW5lKSB7XG4gICAgICAgICAgICAgICAgICB2YXIgdmFsdWVQbGFjZUhvbGRlciA9IFwiXCIuY29uY2F0KERlZmluZVZhbHVlUGxhY2Vob2xkZXIpLmNvbmNhdChkZWZpbmUubmFtZSk7XG4gICAgICAgICAgICAgICAgICBzaGFkZXIgPSBzaGFkZXIucmVwbGFjZSh2YWx1ZVBsYWNlSG9sZGVyLCBcIlwiLmNvbmNhdChkZWZpbmUudmFsdWUpKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjb250ZXh0LnNoYWRlciA9IHNoYWRlcjsgLy8g5re75YqgIHVuaWZvcm0g57uR5a6a55qE5pWw5o2uXG5cbiAgICAgICAgICAgICAgICBjb250ZXh0LnVuaWZvcm1zLmZvckVhY2goZnVuY3Rpb24gKHVuaWZvcm0pIHtcbiAgICAgICAgICAgICAgICAgIC8vIGNvbnN0IGJpbmRpbmcgPSB0aGlzLmJpbmRpbmdzLmZpbmQoKGIpID0+IGIubmFtZSA9PT0gdW5pZm9ybS5uYW1lKTtcbiAgICAgICAgICAgICAgICAgIC8vIGlmIChiaW5kaW5nKSB7XG4gICAgICAgICAgICAgICAgICAvLyAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgIC8vICAgdW5pZm9ybS5kYXRhID0gYmluZGluZy5yZWZlcmVyIHx8IGJpbmRpbmcuZGF0YTtcbiAgICAgICAgICAgICAgICAgIC8vICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgLy8gICB1bmlmb3JtLmlzUmVmZXJlciA9ICEhYmluZGluZy5yZWZlcmVyO1xuICAgICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgICAgICAgLy8g5pyq5oyH5a6a5pWw5o2u77yM5bCd6K+V5qC55o2uIHVuaWZvcm0g57G75Z6L5Yid5aeL5YyWXG4gICAgICAgICAgICAgICAgICBpZiAoIXVuaWZvcm0uZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodW5pZm9ybS5zdG9yYWdlQ2xhc3MgPT09IFNUT1JBR0VfQ0xBU1MuU3RvcmFnZUJ1ZmZlcikge1xuICAgICAgICAgICAgICAgICAgICAgIHZhciBzaXplUGVyRWxlbWVudCA9IDE7XG5cbiAgICAgICAgICAgICAgICAgICAgICBpZiAodW5pZm9ybS50eXBlID09PSBBU1RfVE9LRU5fVFlQRVMuRmxvYXRBcnJheSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZVBlckVsZW1lbnQgPSAxO1xuICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodW5pZm9ybS50eXBlID09PSBBU1RfVE9LRU5fVFlQRVMuVmVjdG9yNEZsb2F0QXJyYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpemVQZXJFbGVtZW50ID0gNDtcbiAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICB1bmlmb3JtLmRhdGEgPSBuZXcgRmxvYXQzMkFycmF5KGNvbnRleHQub3V0cHV0Lmxlbmd0aCAqIHNpemVQZXJFbGVtZW50KS5maWxsKDApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7IC8vIH0gZWxzZSBpZiAodW5pZm9ybS50eXBlID09PSAnaW1hZ2UyRCcpIHtcbiAgICAgICAgICAgICAgICAvLyAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAvLyAgIGJ1ZmZlci5kYXRhID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGNvbnRleHQub3V0cHV0Lmxlbmd0aCEpLmZpbGwoMCk7XG4gICAgICAgICAgICAgICAgLy8gfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5jb21waWxlZEJ1bmRsZS5jb250ZXh0ID0gY29udGV4dDtcbiAgICAgICAgICAgICAgICBfY29udGV4dDMubmV4dCA9IDExO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmVuZ2luZS5jcmVhdGVDb21wdXRlTW9kZWwodGhpcy5jb21waWxlZEJ1bmRsZS5jb250ZXh0KTtcblxuICAgICAgICAgICAgICBjYXNlIDExOlxuICAgICAgICAgICAgICAgIHRoaXMubW9kZWwgPSBfY29udGV4dDMuc2VudDtcblxuICAgICAgICAgICAgICBjYXNlIDEyOlxuICAgICAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0My5zdG9wKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LCBfY2FsbGVlMywgdGhpcyk7XG4gICAgICB9KSk7XG5cbiAgICAgIGZ1bmN0aW9uIGNvbXBpbGUoKSB7XG4gICAgICAgIHJldHVybiBfY29tcGlsZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY29tcGlsZTtcbiAgICB9KClcbiAgfV0pO1xuXG4gIHJldHVybiBLZXJuZWw7XG59KCksIF90ZW1wKSwgKF9kZXNjcmlwdG9yID0gX2FwcGx5RGVjb3JhdGVkRGVzY3JpcHRvcihfY2xhc3MyLnByb3RvdHlwZSwgXCJlbmdpbmVcIiwgW19kZWMyXSwge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHdyaXRhYmxlOiB0cnVlLFxuICBpbml0aWFsaXplcjogbnVsbFxufSksIF9kZXNjcmlwdG9yMiA9IF9hcHBseURlY29yYXRlZERlc2NyaXB0b3IoX2NsYXNzMi5wcm90b3R5cGUsIFwiY29uZmlnU2VydmljZVwiLCBbX2RlYzNdLCB7XG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgd3JpdGFibGU6IHRydWUsXG4gIGluaXRpYWxpemVyOiBudWxsXG59KSksIF9jbGFzczIpKSB8fCBfY2xhc3MpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9S2VybmVsLmpzLm1hcCIsImltcG9ydCBfaW5pdGlhbGl6ZXJEZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbml0aWFsaXplckRlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrXCI7XG5pbXBvcnQgX2NyZWF0ZUNsYXNzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzXCI7XG5pbXBvcnQgX2FwcGx5RGVjb3JhdGVkRGVzY3JpcHRvciBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hcHBseURlY29yYXRlZERlc2NyaXB0b3JcIjtcbmltcG9ydCBfaW5pdGlhbGl6ZXJXYXJuaW5nSGVscGVyIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2luaXRpYWxpemVyV2FybmluZ0hlbHBlclwiO1xuXG52YXIgX2RlYywgX2RlYzIsIF9jbGFzcywgX2NsYXNzMiwgX2Rlc2NyaXB0b3IsIF9jbGFzczMsIF90ZW1wO1xuXG5pbXBvcnQgeyBJREVOVElGSUVSIH0gZnJvbSAnQGFudHYvZy13ZWJncHUtY29yZSc7XG5pbXBvcnQgeyBpbmplY3QsIGluamVjdGFibGUgfSBmcm9tICdpbnZlcnNpZnknO1xuZXhwb3J0IHZhciBNYXRlcmlhbCA9IChfZGVjID0gaW5qZWN0YWJsZSgpLCBfZGVjMiA9IGluamVjdChJREVOVElGSUVSLk1hdGVyaWFsQ29tcG9uZW50TWFuYWdlciksIF9kZWMoX2NsYXNzID0gKF9jbGFzczIgPSAoX3RlbXAgPSBfY2xhc3MzID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gTWF0ZXJpYWwoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIE1hdGVyaWFsKTtcblxuICAgIHRoaXMuY29uZmlnID0gdm9pZCAwO1xuXG4gICAgX2luaXRpYWxpemVyRGVmaW5lUHJvcGVydHkodGhpcywgXCJtYXRlcmlhbFwiLCBfZGVzY3JpcHRvciwgdGhpcyk7XG5cbiAgICB0aGlzLmVudGl0eSA9IHZvaWQgMDtcbiAgICB0aGlzLmNvbXBvbmVudCA9IHZvaWQgMDtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhNYXRlcmlhbCwgW3tcbiAgICBrZXk6IFwiZ2V0RW50aXR5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldEVudGl0eSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmVudGl0eTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0Q29tcG9uZW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldENvbXBvbmVudCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbXBvbmVudDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2V0Q29uZmlnXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldENvbmZpZyhjb25maWcpIHtcbiAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzZXRFbnRpdHlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0RW50aXR5KGVudGl0eSwgdHlwZSkge1xuICAgICAgdGhpcy5lbnRpdHkgPSBlbnRpdHk7XG4gICAgICB0aGlzLmNvbXBvbmVudCA9IHRoaXMubWF0ZXJpYWwuY3JlYXRlKGVudGl0eSk7XG4gICAgICB0aGlzLmNvbXBvbmVudC5lbnRpdHkgPSBlbnRpdHk7XG4gICAgICB0aGlzLmNvbXBvbmVudC50eXBlID0gdHlwZTtcbiAgICAgIHRoaXMub25FbnRpdHlDcmVhdGVkKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIm9uRW50aXR5Q3JlYXRlZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvbkVudGl0eUNyZWF0ZWQoKSB7Ly9cbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gTWF0ZXJpYWw7XG59KCksIF9jbGFzczMuQkFTSUMgPSAnYmFzaWMnLCBfdGVtcCksIChfZGVzY3JpcHRvciA9IF9hcHBseURlY29yYXRlZERlc2NyaXB0b3IoX2NsYXNzMi5wcm90b3R5cGUsIFwibWF0ZXJpYWxcIiwgW19kZWMyXSwge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHdyaXRhYmxlOiB0cnVlLFxuICBpbml0aWFsaXplcjogbnVsbFxufSkpLCBfY2xhc3MyKSkgfHwgX2NsYXNzKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsImltcG9ydCBfaW5pdGlhbGl6ZXJEZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbml0aWFsaXplckRlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrXCI7XG5pbXBvcnQgX2NyZWF0ZUNsYXNzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzXCI7XG5pbXBvcnQgX2FwcGx5RGVjb3JhdGVkRGVzY3JpcHRvciBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hcHBseURlY29yYXRlZERlc2NyaXB0b3JcIjtcbmltcG9ydCBfaW5pdGlhbGl6ZXJXYXJuaW5nSGVscGVyIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2luaXRpYWxpemVyV2FybmluZ0hlbHBlclwiO1xuXG52YXIgX2RlYywgX2RlYzIsIF9kZWMzLCBfZGVjNCwgX2RlYzUsIF9kZWM2LCBfY2xhc3MsIF9jbGFzczIsIF9kZXNjcmlwdG9yLCBfZGVzY3JpcHRvcjIsIF9kZXNjcmlwdG9yMywgX2Rlc2NyaXB0b3I0LCBfY2xhc3MzLCBfdGVtcDtcblxuaW1wb3J0IHsgSURFTlRJRklFUiB9IGZyb20gJ0BhbnR2L2ctd2ViZ3B1LWNvcmUnO1xuaW1wb3J0IHsgaW5qZWN0LCBpbmplY3RhYmxlLCBuYW1lZCB9IGZyb20gJ2ludmVyc2lmeSc7XG5leHBvcnQgdmFyIFJlbmRlcmFibGUgPSAoX2RlYyA9IGluamVjdGFibGUoKSwgX2RlYzIgPSBpbmplY3QoSURFTlRJRklFUi5NZXNoQ29tcG9uZW50TWFuYWdlciksIF9kZWMzID0gaW5qZWN0KElERU5USUZJRVIuQ3VsbGFibGVDb21wb25lbnRNYW5hZ2VyKSwgX2RlYzQgPSBpbmplY3QoSURFTlRJRklFUi5UcmFuc2Zvcm1Db21wb25lbnRNYW5hZ2VyKSwgX2RlYzUgPSBpbmplY3QoSURFTlRJRklFUi5TeXN0ZW1zKSwgX2RlYzYgPSBuYW1lZChJREVOVElGSUVSLlNjZW5lR3JhcGhTeXN0ZW0pLCBfZGVjKF9jbGFzcyA9IChfY2xhc3MyID0gKF90ZW1wID0gX2NsYXNzMyA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFJlbmRlcmFibGUoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFJlbmRlcmFibGUpO1xuXG4gICAgdGhpcy5hdHRyaWJ1dGVzID0ge307XG4gICAgdGhpcy5jb25maWcgPSB2b2lkIDA7XG5cbiAgICBfaW5pdGlhbGl6ZXJEZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIm1lc2hcIiwgX2Rlc2NyaXB0b3IsIHRoaXMpO1xuXG4gICAgX2luaXRpYWxpemVyRGVmaW5lUHJvcGVydHkodGhpcywgXCJjdWxsYWJsZVwiLCBfZGVzY3JpcHRvcjIsIHRoaXMpO1xuXG4gICAgX2luaXRpYWxpemVyRGVmaW5lUHJvcGVydHkodGhpcywgXCJ0cmFuc2Zvcm1cIiwgX2Rlc2NyaXB0b3IzLCB0aGlzKTtcblxuICAgIF9pbml0aWFsaXplckRlZmluZVByb3BlcnR5KHRoaXMsIFwic2NlbmVHcmFwaFN5c3RlbVwiLCBfZGVzY3JpcHRvcjQsIHRoaXMpO1xuXG4gICAgdGhpcy5tZXNoQ29tcG9uZW50ID0gdm9pZCAwO1xuICAgIHRoaXMudHJhbnNmb3JtQ29tcG9uZW50ID0gdm9pZCAwO1xuICAgIHRoaXMuZW50aXR5ID0gdm9pZCAwO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKFJlbmRlcmFibGUsIFt7XG4gICAga2V5OiBcImdldEVudGl0eVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRFbnRpdHkoKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbnRpdHk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldFRyYW5zZm9ybUNvbXBvbmVudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRUcmFuc2Zvcm1Db21wb25lbnQoKSB7XG4gICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1Db21wb25lbnQ7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldE1lc2hDb21wb25lbnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0TWVzaENvbXBvbmVudCgpIHtcbiAgICAgIHJldHVybiB0aGlzLm1lc2hDb21wb25lbnQ7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNldENvbmZpZ1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRDb25maWcoY29uZmlnKSB7XG4gICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2V0RW50aXR5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldEVudGl0eShlbnRpdHkpIHtcbiAgICAgIHRoaXMuZW50aXR5ID0gZW50aXR5O1xuICAgICAgdGhpcy5jdWxsYWJsZS5jcmVhdGUoZW50aXR5KTtcbiAgICAgIHRoaXMubWVzaENvbXBvbmVudCA9IHRoaXMubWVzaC5jcmVhdGUoZW50aXR5KTtcbiAgICAgIHRoaXMudHJhbnNmb3JtQ29tcG9uZW50ID0gdGhpcy50cmFuc2Zvcm0uY3JlYXRlKGVudGl0eSk7XG4gICAgICB0aGlzLm9uRW50aXR5Q3JlYXRlZCgpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzZXRNYXRlcmlhbFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRNYXRlcmlhbChtYXRlcmlhbCkge1xuICAgICAgdGhpcy5tZXNoQ29tcG9uZW50Lm1hdGVyaWFsID0gbWF0ZXJpYWw7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2V0R2VvbWV0cnlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0R2VvbWV0cnkoZ2VvbWV0cnkpIHtcbiAgICAgIHRoaXMubWVzaENvbXBvbmVudC5nZW9tZXRyeSA9IGdlb21ldHJ5O1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNldEF0dHJpYnV0ZXNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0QXR0cmlidXRlcyhhdHRyaWJ1dGVzKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICBPYmplY3Qua2V5cyhhdHRyaWJ1dGVzKS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIGlmIChhdHRyaWJ1dGVzW25hbWVdICE9PSB1bmRlZmluZWQgJiYgYXR0cmlidXRlc1tuYW1lXSAhPT0gX3RoaXMuYXR0cmlidXRlc1tuYW1lXSkge1xuICAgICAgICAgIF90aGlzLm9uQXR0cmlidXRlQ2hhbmdlZCh7XG4gICAgICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICAgICAgZGF0YTogYXR0cmlidXRlc1tuYW1lXVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgX3RoaXMuYXR0cmlidXRlc1tuYW1lXSA9IGF0dHJpYnV0ZXNbbmFtZV07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzZXRWaXNpYmxlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldFZpc2libGUodmlzaWJsZSkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIHRoaXMubWVzaENvbXBvbmVudC52aXNpYmxlID0gdmlzaWJsZTtcbiAgICAgIHRoaXMubWVzaENvbXBvbmVudC5jaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChjaGlsZEVudGl0eSkge1xuICAgICAgICB2YXIgY2hpbGQgPSBfdGhpczIubWVzaC5nZXRDb21wb25lbnRCeUVudGl0eShjaGlsZEVudGl0eSk7XG5cbiAgICAgICAgaWYgKGNoaWxkKSB7XG4gICAgICAgICAgY2hpbGQudmlzaWJsZSA9IHZpc2libGU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImlzVmlzaWJsZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpc1Zpc2libGUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5tZXNoQ29tcG9uZW50LnZpc2libGU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImF0dGFjaFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhdHRhY2gocGFyZW50UmVuZGVyYWJsZSkge1xuICAgICAgdGhpcy5zY2VuZUdyYXBoU3lzdGVtLmF0dGFjaCh0aGlzLmVudGl0eSwgcGFyZW50UmVuZGVyYWJsZS5lbnRpdHkpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImRldGFjaFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkZXRhY2goKSB7XG4gICAgICB0aGlzLnNjZW5lR3JhcGhTeXN0ZW0uZGV0YWNoKHRoaXMuZW50aXR5KTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJkZXRhY2hDaGlsZHJlblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkZXRhY2hDaGlsZHJlbigpIHtcbiAgICAgIHRoaXMuc2NlbmVHcmFwaFN5c3RlbS5kZXRhY2hDaGlsZHJlbih0aGlzLmVudGl0eSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwib25FbnRpdHlDcmVhdGVkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG9uRW50aXR5Q3JlYXRlZCgpIHsvL1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJvbkF0dHJpYnV0ZUNoYW5nZWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gb25BdHRyaWJ1dGVDaGFuZ2VkKF9yZWYpIHtcbiAgICAgIHZhciBuYW1lID0gX3JlZi5uYW1lLFxuICAgICAgICAgIGRhdGEgPSBfcmVmLmRhdGE7XG5cbiAgICAgIGlmICh0aGlzLm1lc2hDb21wb25lbnQgJiYgdGhpcy5tZXNoQ29tcG9uZW50Lm1hdGVyaWFsKSB7XG4gICAgICAgIHRoaXMubWVzaENvbXBvbmVudC5tYXRlcmlhbC5zZXRVbmlmb3JtKHRoaXMuY29udmVydEF0dHJpYnV0ZU5hbWUyVW5pZm9ybU5hbWUobmFtZSksIGRhdGEpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjb252ZXJ0QXR0cmlidXRlTmFtZTJVbmlmb3JtTmFtZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb252ZXJ0QXR0cmlidXRlTmFtZTJVbmlmb3JtTmFtZShhdHRyaWJ1dGVOYW1lKSB7XG4gICAgICByZXR1cm4gYXR0cmlidXRlTmFtZTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gUmVuZGVyYWJsZTtcbn0oKSwgX2NsYXNzMy5QT0lOVCA9ICdwb2ludCcsIF9jbGFzczMuTElORSA9ICdsaW5lJywgX2NsYXNzMy5HUklEID0gJ2dyaWQnLCBfdGVtcCksIChfZGVzY3JpcHRvciA9IF9hcHBseURlY29yYXRlZERlc2NyaXB0b3IoX2NsYXNzMi5wcm90b3R5cGUsIFwibWVzaFwiLCBbX2RlYzJdLCB7XG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgd3JpdGFibGU6IHRydWUsXG4gIGluaXRpYWxpemVyOiBudWxsXG59KSwgX2Rlc2NyaXB0b3IyID0gX2FwcGx5RGVjb3JhdGVkRGVzY3JpcHRvcihfY2xhc3MyLnByb3RvdHlwZSwgXCJjdWxsYWJsZVwiLCBbX2RlYzNdLCB7XG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgd3JpdGFibGU6IHRydWUsXG4gIGluaXRpYWxpemVyOiBudWxsXG59KSwgX2Rlc2NyaXB0b3IzID0gX2FwcGx5RGVjb3JhdGVkRGVzY3JpcHRvcihfY2xhc3MyLnByb3RvdHlwZSwgXCJ0cmFuc2Zvcm1cIiwgW19kZWM0XSwge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHdyaXRhYmxlOiB0cnVlLFxuICBpbml0aWFsaXplcjogbnVsbFxufSksIF9kZXNjcmlwdG9yNCA9IF9hcHBseURlY29yYXRlZERlc2NyaXB0b3IoX2NsYXNzMi5wcm90b3R5cGUsIFwic2NlbmVHcmFwaFN5c3RlbVwiLCBbX2RlYzUsIF9kZWM2XSwge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHdyaXRhYmxlOiB0cnVlLFxuICBpbml0aWFsaXplcjogbnVsbFxufSkpLCBfY2xhc3MyKSkgfHwgX2NsYXNzKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJlbmRlcmFibGUuanMubWFwIiwiaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzc1wiO1xuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3JlZ2wtcHJvamVjdC9yZWdsL2Jsb2IvZ2gtcGFnZXMvQVBJLm1kI2F0dHJpYnV0ZXNcbiAqL1xudmFyIFJlZ2xBdHRyaWJ1dGUgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBSZWdsQXR0cmlidXRlKGdsLCBvcHRpb25zKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFJlZ2xBdHRyaWJ1dGUpO1xuXG4gICAgdGhpcy5hdHRyaWJ1dGUgPSB2b2lkIDA7XG4gICAgdGhpcy5idWZmZXIgPSB2b2lkIDA7XG4gICAgdmFyIGJ1ZmZlciA9IG9wdGlvbnMuYnVmZmVyLFxuICAgICAgICBvZmZzZXQgPSBvcHRpb25zLm9mZnNldCxcbiAgICAgICAgc3RyaWRlID0gb3B0aW9ucy5zdHJpZGUsXG4gICAgICAgIG5vcm1hbGl6ZWQgPSBvcHRpb25zLm5vcm1hbGl6ZWQsXG4gICAgICAgIHNpemUgPSBvcHRpb25zLnNpemUsXG4gICAgICAgIGRpdmlzb3IgPSBvcHRpb25zLmRpdmlzb3I7XG4gICAgdGhpcy5idWZmZXIgPSBidWZmZXI7XG4gICAgdGhpcy5hdHRyaWJ1dGUgPSB7XG4gICAgICBidWZmZXI6IGJ1ZmZlci5nZXQoKSxcbiAgICAgIG9mZnNldDogb2Zmc2V0IHx8IDAsXG4gICAgICBzdHJpZGU6IHN0cmlkZSB8fCAwLFxuICAgICAgbm9ybWFsaXplZDogbm9ybWFsaXplZCB8fCBmYWxzZSxcbiAgICAgIGRpdmlzb3I6IGRpdmlzb3IgfHwgMFxuICAgIH07XG5cbiAgICBpZiAoc2l6ZSkge1xuICAgICAgdGhpcy5hdHRyaWJ1dGUuc2l6ZSA9IHNpemU7XG4gICAgfVxuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKFJlZ2xBdHRyaWJ1dGUsIFt7XG4gICAga2V5OiBcImdldFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5hdHRyaWJ1dGU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInVwZGF0ZUJ1ZmZlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB1cGRhdGVCdWZmZXIob3B0aW9ucykge1xuICAgICAgdGhpcy5idWZmZXIuc3ViRGF0YShvcHRpb25zKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZGVzdHJveVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkZXN0cm95KCkge1xuICAgICAgdGhpcy5idWZmZXIuZGVzdHJveSgpO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBSZWdsQXR0cmlidXRlO1xufSgpO1xuXG5leHBvcnQgeyBSZWdsQXR0cmlidXRlIGFzIGRlZmF1bHQgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJlZ2xBdHRyaWJ1dGUuanMubWFwIiwiaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiO1xuXG52YXIgX3ByaW1pdGl2ZU1hcCwgX3VzYWdlTWFwLCBfZGF0YVR5cGVNYXAsIF9mb3JtYXRNYXAsIF9taXBtYXBNYXAsIF9maWx0ZXJNYXAsIF93cmFwTW9kZU1hcCwgX2NvbG9yU3BhY2VNYXAsIF9kZXB0aEZ1bmNNYXAsIF9ibGVuZEVxdWF0aW9uTWFwLCBfYmxlbmRGdW5jTWFwLCBfc3RlbmNpbEZ1bmNNYXAsIF9zdGVuY2lsT3BNYXAsIF9jdWxsRmFjZU1hcDtcblxuLyoqXG4gKiBAZGVzYyDnlLHkuo4gcmVnbCDkvb/nlKjlpKfph4/lrZfnrKbkuLLogIzpnZ4gV2ViR0wg5bi46YeP77yM5Zug5q2k6ZyA6KaB5pig5bCEXG4gKi9cbmltcG9ydCB7IGdsIH0gZnJvbSAnQGFudHYvZy13ZWJncHUtY29yZSc7XG4vLyBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9yZWdsLXByb2plY3QvcmVnbC9ibG9iL2doLXBhZ2VzL2xpYi9jb25zdGFudHMvcHJpbWl0aXZlcy5qc29uXG5leHBvcnQgdmFyIHByaW1pdGl2ZU1hcCA9IChfcHJpbWl0aXZlTWFwID0ge30sIF9kZWZpbmVQcm9wZXJ0eShfcHJpbWl0aXZlTWFwLCBnbC5QT0lOVFMsICdwb2ludHMnKSwgX2RlZmluZVByb3BlcnR5KF9wcmltaXRpdmVNYXAsIGdsLkxJTkVTLCAnbGluZXMnKSwgX2RlZmluZVByb3BlcnR5KF9wcmltaXRpdmVNYXAsIGdsLkxJTkVfTE9PUCwgJ2xpbmUgbG9vcCcpLCBfZGVmaW5lUHJvcGVydHkoX3ByaW1pdGl2ZU1hcCwgZ2wuTElORV9TVFJJUCwgJ2xpbmUgc3RyaXAnKSwgX2RlZmluZVByb3BlcnR5KF9wcmltaXRpdmVNYXAsIGdsLlRSSUFOR0xFUywgJ3RyaWFuZ2xlcycpLCBfZGVmaW5lUHJvcGVydHkoX3ByaW1pdGl2ZU1hcCwgZ2wuVFJJQU5HTEVfRkFOLCAndHJpYW5nbGUgZmFuJyksIF9kZWZpbmVQcm9wZXJ0eShfcHJpbWl0aXZlTWFwLCBnbC5UUklBTkdMRV9TVFJJUCwgJ3RyaWFuZ2xlIHN0cmlwJyksIF9wcmltaXRpdmVNYXApO1xuZXhwb3J0IHZhciB1c2FnZU1hcCA9IChfdXNhZ2VNYXAgPSB7fSwgX2RlZmluZVByb3BlcnR5KF91c2FnZU1hcCwgZ2wuU1RBVElDX0RSQVcsICdzdGF0aWMnKSwgX2RlZmluZVByb3BlcnR5KF91c2FnZU1hcCwgZ2wuRFlOQU1JQ19EUkFXLCAnZHluYW1pYycpLCBfZGVmaW5lUHJvcGVydHkoX3VzYWdlTWFwLCBnbC5TVFJFQU1fRFJBVywgJ3N0cmVhbScpLCBfdXNhZ2VNYXApO1xuZXhwb3J0IHZhciBkYXRhVHlwZU1hcCA9IChfZGF0YVR5cGVNYXAgPSB7fSwgX2RlZmluZVByb3BlcnR5KF9kYXRhVHlwZU1hcCwgZ2wuQllURSwgJ2ludDgnKSwgX2RlZmluZVByb3BlcnR5KF9kYXRhVHlwZU1hcCwgZ2wuVU5TSUdORURfSU5ULCAnaW50MTYnKSwgX2RlZmluZVByb3BlcnR5KF9kYXRhVHlwZU1hcCwgZ2wuSU5ULCAnaW50MzInKSwgX2RlZmluZVByb3BlcnR5KF9kYXRhVHlwZU1hcCwgZ2wuVU5TSUdORURfQllURSwgJ3VpbnQ4JyksIF9kZWZpbmVQcm9wZXJ0eShfZGF0YVR5cGVNYXAsIGdsLlVOU0lHTkVEX1NIT1JULCAndWludDE2JyksIF9kZWZpbmVQcm9wZXJ0eShfZGF0YVR5cGVNYXAsIGdsLlVOU0lHTkVEX0lOVCwgJ3VpbnQzMicpLCBfZGVmaW5lUHJvcGVydHkoX2RhdGFUeXBlTWFwLCBnbC5GTE9BVCwgJ2Zsb2F0JyksIF9kYXRhVHlwZU1hcCk7XG5leHBvcnQgdmFyIGZvcm1hdE1hcCA9IChfZm9ybWF0TWFwID0ge30sIF9kZWZpbmVQcm9wZXJ0eShfZm9ybWF0TWFwLCBnbC5BTFBIQSwgJ2FscGhhJyksIF9kZWZpbmVQcm9wZXJ0eShfZm9ybWF0TWFwLCBnbC5MVU1JTkFOQ0UsICdsdW1pbmFuY2UnKSwgX2RlZmluZVByb3BlcnR5KF9mb3JtYXRNYXAsIGdsLkxVTUlOQU5DRV9BTFBIQSwgJ2x1bWluYW5jZSBhbHBoYScpLCBfZGVmaW5lUHJvcGVydHkoX2Zvcm1hdE1hcCwgZ2wuUkdCLCAncmdiJyksIF9kZWZpbmVQcm9wZXJ0eShfZm9ybWF0TWFwLCBnbC5SR0JBLCAncmdiYScpLCBfZGVmaW5lUHJvcGVydHkoX2Zvcm1hdE1hcCwgZ2wuUkdCQTQsICdyZ2JhNCcpLCBfZGVmaW5lUHJvcGVydHkoX2Zvcm1hdE1hcCwgZ2wuUkdCNV9BMSwgJ3JnYjUgYTEnKSwgX2RlZmluZVByb3BlcnR5KF9mb3JtYXRNYXAsIGdsLlJHQjU2NSwgJ3JnYjU2NScpLCBfZGVmaW5lUHJvcGVydHkoX2Zvcm1hdE1hcCwgZ2wuREVQVEhfQ09NUE9ORU5ULCAnZGVwdGgnKSwgX2RlZmluZVByb3BlcnR5KF9mb3JtYXRNYXAsIGdsLkRFUFRIX1NURU5DSUwsICdkZXB0aCBzdGVuY2lsJyksIF9mb3JtYXRNYXApO1xuZXhwb3J0IHZhciBtaXBtYXBNYXAgPSAoX21pcG1hcE1hcCA9IHt9LCBfZGVmaW5lUHJvcGVydHkoX21pcG1hcE1hcCwgZ2wuRE9OVF9DQVJFLCAnZG9udCBjYXJlJyksIF9kZWZpbmVQcm9wZXJ0eShfbWlwbWFwTWFwLCBnbC5OSUNFU1QsICduaWNlJyksIF9kZWZpbmVQcm9wZXJ0eShfbWlwbWFwTWFwLCBnbC5GQVNURVNULCAnZmFzdCcpLCBfbWlwbWFwTWFwKTtcbmV4cG9ydCB2YXIgZmlsdGVyTWFwID0gKF9maWx0ZXJNYXAgPSB7fSwgX2RlZmluZVByb3BlcnR5KF9maWx0ZXJNYXAsIGdsLk5FQVJFU1QsICduZWFyZXN0JyksIF9kZWZpbmVQcm9wZXJ0eShfZmlsdGVyTWFwLCBnbC5MSU5FQVIsICdsaW5lYXInKSwgX2RlZmluZVByb3BlcnR5KF9maWx0ZXJNYXAsIGdsLkxJTkVBUl9NSVBNQVBfTElORUFSLCAnbWlwbWFwJyksIF9kZWZpbmVQcm9wZXJ0eShfZmlsdGVyTWFwLCBnbC5ORUFSRVNUX01JUE1BUF9MSU5FQVIsICduZWFyZXN0IG1pcG1hcCBsaW5lYXInKSwgX2RlZmluZVByb3BlcnR5KF9maWx0ZXJNYXAsIGdsLkxJTkVBUl9NSVBNQVBfTkVBUkVTVCwgJ2xpbmVhciBtaXBtYXAgbmVhcmVzdCcpLCBfZGVmaW5lUHJvcGVydHkoX2ZpbHRlck1hcCwgZ2wuTkVBUkVTVF9NSVBNQVBfTkVBUkVTVCwgJ25lYXJlc3QgbWlwbWFwIG5lYXJlc3QnKSwgX2ZpbHRlck1hcCk7XG5leHBvcnQgdmFyIHdyYXBNb2RlTWFwID0gKF93cmFwTW9kZU1hcCA9IHt9LCBfZGVmaW5lUHJvcGVydHkoX3dyYXBNb2RlTWFwLCBnbC5SRVBFQVQsICdyZXBlYXQnKSwgX2RlZmluZVByb3BlcnR5KF93cmFwTW9kZU1hcCwgZ2wuQ0xBTVBfVE9fRURHRSwgJ2NsYW1wJyksIF9kZWZpbmVQcm9wZXJ0eShfd3JhcE1vZGVNYXAsIGdsLk1JUlJPUkVEX1JFUEVBVCwgJ21pcnJvcicpLCBfd3JhcE1vZGVNYXApO1xuZXhwb3J0IHZhciBjb2xvclNwYWNlTWFwID0gKF9jb2xvclNwYWNlTWFwID0ge30sIF9kZWZpbmVQcm9wZXJ0eShfY29sb3JTcGFjZU1hcCwgZ2wuTk9ORSwgJ25vbmUnKSwgX2RlZmluZVByb3BlcnR5KF9jb2xvclNwYWNlTWFwLCBnbC5CUk9XU0VSX0RFRkFVTFRfV0VCR0wsICdicm93c2VyJyksIF9jb2xvclNwYWNlTWFwKTtcbmV4cG9ydCB2YXIgZGVwdGhGdW5jTWFwID0gKF9kZXB0aEZ1bmNNYXAgPSB7fSwgX2RlZmluZVByb3BlcnR5KF9kZXB0aEZ1bmNNYXAsIGdsLk5FVkVSLCAnbmV2ZXInKSwgX2RlZmluZVByb3BlcnR5KF9kZXB0aEZ1bmNNYXAsIGdsLkFMV0FZUywgJ2Fsd2F5cycpLCBfZGVmaW5lUHJvcGVydHkoX2RlcHRoRnVuY01hcCwgZ2wuTEVTUywgJ2xlc3MnKSwgX2RlZmluZVByb3BlcnR5KF9kZXB0aEZ1bmNNYXAsIGdsLkxFUVVBTCwgJ2xlcXVhbCcpLCBfZGVmaW5lUHJvcGVydHkoX2RlcHRoRnVuY01hcCwgZ2wuR1JFQVRFUiwgJ2dyZWF0ZXInKSwgX2RlZmluZVByb3BlcnR5KF9kZXB0aEZ1bmNNYXAsIGdsLkdFUVVBTCwgJ2dlcXVhbCcpLCBfZGVmaW5lUHJvcGVydHkoX2RlcHRoRnVuY01hcCwgZ2wuRVFVQUwsICdlcXVhbCcpLCBfZGVmaW5lUHJvcGVydHkoX2RlcHRoRnVuY01hcCwgZ2wuTk9URVFVQUwsICdub3RlcXVhbCcpLCBfZGVwdGhGdW5jTWFwKTtcbmV4cG9ydCB2YXIgYmxlbmRFcXVhdGlvbk1hcCA9IChfYmxlbmRFcXVhdGlvbk1hcCA9IHt9LCBfZGVmaW5lUHJvcGVydHkoX2JsZW5kRXF1YXRpb25NYXAsIGdsLkZVTkNfQURELCAnYWRkJyksIF9kZWZpbmVQcm9wZXJ0eShfYmxlbmRFcXVhdGlvbk1hcCwgZ2wuTUlOX0VYVCwgJ21pbicpLCBfZGVmaW5lUHJvcGVydHkoX2JsZW5kRXF1YXRpb25NYXAsIGdsLk1BWF9FWFQsICdtYXgnKSwgX2RlZmluZVByb3BlcnR5KF9ibGVuZEVxdWF0aW9uTWFwLCBnbC5GVU5DX1NVQlRSQUNULCAnc3VidHJhY3QnKSwgX2RlZmluZVByb3BlcnR5KF9ibGVuZEVxdWF0aW9uTWFwLCBnbC5GVU5DX1JFVkVSU0VfU1VCVFJBQ1QsICdyZXZlcnNlIHN1YnRyYWN0JyksIF9ibGVuZEVxdWF0aW9uTWFwKTtcbmV4cG9ydCB2YXIgYmxlbmRGdW5jTWFwID0gKF9ibGVuZEZ1bmNNYXAgPSB7fSwgX2RlZmluZVByb3BlcnR5KF9ibGVuZEZ1bmNNYXAsIGdsLlpFUk8sICd6ZXJvJyksIF9kZWZpbmVQcm9wZXJ0eShfYmxlbmRGdW5jTWFwLCBnbC5PTkUsICdvbmUnKSwgX2RlZmluZVByb3BlcnR5KF9ibGVuZEZ1bmNNYXAsIGdsLlNSQ19DT0xPUiwgJ3NyYyBjb2xvcicpLCBfZGVmaW5lUHJvcGVydHkoX2JsZW5kRnVuY01hcCwgZ2wuT05FX01JTlVTX1NSQ19DT0xPUiwgJ29uZSBtaW51cyBzcmMgY29sb3InKSwgX2RlZmluZVByb3BlcnR5KF9ibGVuZEZ1bmNNYXAsIGdsLlNSQ19BTFBIQSwgJ3NyYyBhbHBoYScpLCBfZGVmaW5lUHJvcGVydHkoX2JsZW5kRnVuY01hcCwgZ2wuT05FX01JTlVTX1NSQ19BTFBIQSwgJ29uZSBtaW51cyBzcmMgYWxwaGEnKSwgX2RlZmluZVByb3BlcnR5KF9ibGVuZEZ1bmNNYXAsIGdsLkRTVF9DT0xPUiwgJ2RzdCBjb2xvcicpLCBfZGVmaW5lUHJvcGVydHkoX2JsZW5kRnVuY01hcCwgZ2wuT05FX01JTlVTX0RTVF9DT0xPUiwgJ29uZSBtaW51cyBkc3QgY29sb3InKSwgX2RlZmluZVByb3BlcnR5KF9ibGVuZEZ1bmNNYXAsIGdsLkRTVF9BTFBIQSwgJ2RzdCBhbHBoYScpLCBfZGVmaW5lUHJvcGVydHkoX2JsZW5kRnVuY01hcCwgZ2wuT05FX01JTlVTX0RTVF9BTFBIQSwgJ29uZSBtaW51cyBkc3QgYWxwaGEnKSwgX2RlZmluZVByb3BlcnR5KF9ibGVuZEZ1bmNNYXAsIGdsLkNPTlNUQU5UX0NPTE9SLCAnY29uc3RhbnQgY29sb3InKSwgX2RlZmluZVByb3BlcnR5KF9ibGVuZEZ1bmNNYXAsIGdsLk9ORV9NSU5VU19DT05TVEFOVF9DT0xPUiwgJ29uZSBtaW51cyBjb25zdGFudCBjb2xvcicpLCBfZGVmaW5lUHJvcGVydHkoX2JsZW5kRnVuY01hcCwgZ2wuQ09OU1RBTlRfQUxQSEEsICdjb25zdGFudCBhbHBoYScpLCBfZGVmaW5lUHJvcGVydHkoX2JsZW5kRnVuY01hcCwgZ2wuT05FX01JTlVTX0NPTlNUQU5UX0FMUEhBLCAnb25lIG1pbnVzIGNvbnN0YW50IGFscGhhJyksIF9kZWZpbmVQcm9wZXJ0eShfYmxlbmRGdW5jTWFwLCBnbC5TUkNfQUxQSEFfU0FUVVJBVEUsICdzcmMgYWxwaGEgc2F0dXJhdGUnKSwgX2JsZW5kRnVuY01hcCk7XG5leHBvcnQgdmFyIHN0ZW5jaWxGdW5jTWFwID0gKF9zdGVuY2lsRnVuY01hcCA9IHt9LCBfZGVmaW5lUHJvcGVydHkoX3N0ZW5jaWxGdW5jTWFwLCBnbC5ORVZFUiwgJ25ldmVyJyksIF9kZWZpbmVQcm9wZXJ0eShfc3RlbmNpbEZ1bmNNYXAsIGdsLkFMV0FZUywgJ2Fsd2F5cycpLCBfZGVmaW5lUHJvcGVydHkoX3N0ZW5jaWxGdW5jTWFwLCBnbC5MRVNTLCAnbGVzcycpLCBfZGVmaW5lUHJvcGVydHkoX3N0ZW5jaWxGdW5jTWFwLCBnbC5MRVFVQUwsICdsZXF1YWwnKSwgX2RlZmluZVByb3BlcnR5KF9zdGVuY2lsRnVuY01hcCwgZ2wuR1JFQVRFUiwgJ2dyZWF0ZXInKSwgX2RlZmluZVByb3BlcnR5KF9zdGVuY2lsRnVuY01hcCwgZ2wuR0VRVUFMLCAnZ2VxdWFsJyksIF9kZWZpbmVQcm9wZXJ0eShfc3RlbmNpbEZ1bmNNYXAsIGdsLkVRVUFMLCAnZXF1YWwnKSwgX2RlZmluZVByb3BlcnR5KF9zdGVuY2lsRnVuY01hcCwgZ2wuTk9URVFVQUwsICdub3RlcXVhbCcpLCBfc3RlbmNpbEZ1bmNNYXApO1xuZXhwb3J0IHZhciBzdGVuY2lsT3BNYXAgPSAoX3N0ZW5jaWxPcE1hcCA9IHt9LCBfZGVmaW5lUHJvcGVydHkoX3N0ZW5jaWxPcE1hcCwgZ2wuWkVSTywgJ3plcm8nKSwgX2RlZmluZVByb3BlcnR5KF9zdGVuY2lsT3BNYXAsIGdsLktFRVAsICdrZWVwJyksIF9kZWZpbmVQcm9wZXJ0eShfc3RlbmNpbE9wTWFwLCBnbC5SRVBMQUNFLCAncmVwbGFjZScpLCBfZGVmaW5lUHJvcGVydHkoX3N0ZW5jaWxPcE1hcCwgZ2wuSU5WRVJULCAnaW52ZXJ0JyksIF9kZWZpbmVQcm9wZXJ0eShfc3RlbmNpbE9wTWFwLCBnbC5JTkNSLCAnaW5jcmVtZW50JyksIF9kZWZpbmVQcm9wZXJ0eShfc3RlbmNpbE9wTWFwLCBnbC5ERUNSLCAnZGVjcmVtZW50JyksIF9kZWZpbmVQcm9wZXJ0eShfc3RlbmNpbE9wTWFwLCBnbC5JTkNSX1dSQVAsICdpbmNyZW1lbnQgd3JhcCcpLCBfZGVmaW5lUHJvcGVydHkoX3N0ZW5jaWxPcE1hcCwgZ2wuREVDUl9XUkFQLCAnZGVjcmVtZW50IHdyYXAnKSwgX3N0ZW5jaWxPcE1hcCk7XG5leHBvcnQgdmFyIGN1bGxGYWNlTWFwID0gKF9jdWxsRmFjZU1hcCA9IHt9LCBfZGVmaW5lUHJvcGVydHkoX2N1bGxGYWNlTWFwLCBnbC5GUk9OVCwgJ2Zyb250JyksIF9kZWZpbmVQcm9wZXJ0eShfY3VsbEZhY2VNYXAsIGdsLkJBQ0ssICdiYWNrJyksIF9jdWxsRmFjZU1hcCk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb25zdGFudHMuanMubWFwIiwiaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzc1wiO1xuaW1wb3J0IHsgZ2wgfSBmcm9tICdAYW50di9nLXdlYmdwdS1jb3JlJztcbmltcG9ydCB7IGRhdGFUeXBlTWFwLCB1c2FnZU1hcCB9IGZyb20gJy4vY29uc3RhbnRzJztcbi8qKlxuICogYWRhcHRvciBmb3IgcmVnbC5CdWZmZXJcbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3JlZ2wtcHJvamVjdC9yZWdsL2Jsb2IvZ2gtcGFnZXMvQVBJLm1kI2J1ZmZlcnNcbiAqL1xuXG52YXIgUmVnbEJ1ZmZlciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFJlZ2xCdWZmZXIocmVHbCwgb3B0aW9ucykge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBSZWdsQnVmZmVyKTtcblxuICAgIHRoaXMuYnVmZmVyID0gdm9pZCAwO1xuICAgIHZhciBkYXRhID0gb3B0aW9ucy5kYXRhLFxuICAgICAgICB1c2FnZSA9IG9wdGlvbnMudXNhZ2UsXG4gICAgICAgIHR5cGUgPSBvcHRpb25zLnR5cGU7IC8vIEB0cy1pZ25vcmVcblxuICAgIHRoaXMuYnVmZmVyID0gcmVHbC5idWZmZXIoe1xuICAgICAgZGF0YTogZGF0YSxcbiAgICAgIHVzYWdlOiB1c2FnZU1hcFt1c2FnZSB8fCBnbC5TVEFUSUNfRFJBV10sXG4gICAgICB0eXBlOiBkYXRhVHlwZU1hcFt0eXBlIHx8IGdsLlVOU0lHTkVEX0JZVEVdIC8vIGxlbmd0aDogMCxcblxuICAgIH0pO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKFJlZ2xCdWZmZXIsIFt7XG4gICAga2V5OiBcImdldFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5idWZmZXI7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImRlc3Ryb3lcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZGVzdHJveSgpIHsvLyB0aGlzLmJ1ZmZlci5kZXN0cm95KCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInN1YkRhdGFcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc3ViRGF0YShfcmVmKSB7XG4gICAgICB2YXIgZGF0YSA9IF9yZWYuZGF0YSxcbiAgICAgICAgICBvZmZzZXQgPSBfcmVmLm9mZnNldDtcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIHRoaXMuYnVmZmVyLnN1YmRhdGEoZGF0YSwgb2Zmc2V0KTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gUmVnbEJ1ZmZlcjtcbn0oKTtcblxuZXhwb3J0IHsgUmVnbEJ1ZmZlciBhcyBkZWZhdWx0IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1SZWdsQnVmZmVyLmpzLm1hcCIsImltcG9ydCBfdHlwZW9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3R5cGVvZlwiO1xuXG4vKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi9cbnZhciBNQVhfU0FGRV9JTlRFR0VSID0gOTAwNzE5OTI1NDc0MDk5MTtcbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cblxudmFyIGFyZ3NUYWcgPSAnW29iamVjdCBBcmd1bWVudHNdJztcbnZhciBhcnJheVRhZyA9ICdbb2JqZWN0IEFycmF5XSc7XG52YXIgYm9vbFRhZyA9ICdbb2JqZWN0IEJvb2xlYW5dJztcbnZhciBkYXRlVGFnID0gJ1tvYmplY3QgRGF0ZV0nO1xudmFyIGVycm9yVGFnID0gJ1tvYmplY3QgRXJyb3JdJztcbnZhciBmdW5jVGFnID0gJ1tvYmplY3QgRnVuY3Rpb25dJztcbnZhciBtYXBUYWcgPSAnW29iamVjdCBNYXBdJztcbnZhciBudW1iZXJUYWcgPSAnW29iamVjdCBOdW1iZXJdJztcbnZhciBvYmplY3RUYWcgPSAnW29iamVjdCBPYmplY3RdJztcbnZhciByZWdleHBUYWcgPSAnW29iamVjdCBSZWdFeHBdJztcbnZhciBzZXRUYWcgPSAnW29iamVjdCBTZXRdJztcbnZhciBzdHJpbmdUYWcgPSAnW29iamVjdCBTdHJpbmddJztcbnZhciB3ZWFrTWFwVGFnID0gJ1tvYmplY3QgV2Vha01hcF0nO1xudmFyIGFycmF5QnVmZmVyVGFnID0gJ1tvYmplY3QgQXJyYXlCdWZmZXJdJztcbnZhciBkYXRhVmlld1RhZyA9ICdbb2JqZWN0IERhdGFWaWV3XSc7XG52YXIgZmxvYXQzMlRhZyA9ICdbb2JqZWN0IEZsb2F0MzJBcnJheV0nO1xudmFyIGZsb2F0NjRUYWcgPSAnW29iamVjdCBGbG9hdDY0QXJyYXldJztcbnZhciBpbnQ4VGFnID0gJ1tvYmplY3QgSW50OEFycmF5XSc7XG52YXIgaW50MTZUYWcgPSAnW29iamVjdCBJbnQxNkFycmF5XSc7XG52YXIgaW50MzJUYWcgPSAnW29iamVjdCBJbnQzMkFycmF5XSc7XG52YXIgdWludDhUYWcgPSAnW29iamVjdCBVaW50OEFycmF5XSc7XG52YXIgdWludDhDbGFtcGVkVGFnID0gJ1tvYmplY3QgVWludDhDbGFtcGVkQXJyYXldJztcbnZhciB1aW50MTZUYWcgPSAnW29iamVjdCBVaW50MTZBcnJheV0nO1xudmFyIHVpbnQzMlRhZyA9ICdbb2JqZWN0IFVpbnQzMkFycmF5XSc7XG4vKiogVXNlZCB0byBpZGVudGlmeSBgdG9TdHJpbmdUYWdgIHZhbHVlcyBvZiB0eXBlZCBhcnJheXMuICovXG5cbnZhciB0eXBlZEFycmF5VGFncyA9IHt9O1xudHlwZWRBcnJheVRhZ3NbZmxvYXQzMlRhZ10gPSB0eXBlZEFycmF5VGFnc1tmbG9hdDY0VGFnXSA9IHR5cGVkQXJyYXlUYWdzW2ludDhUYWddID0gdHlwZWRBcnJheVRhZ3NbaW50MTZUYWddID0gdHlwZWRBcnJheVRhZ3NbaW50MzJUYWddID0gdHlwZWRBcnJheVRhZ3NbdWludDhUYWddID0gdHlwZWRBcnJheVRhZ3NbdWludDhDbGFtcGVkVGFnXSA9IHR5cGVkQXJyYXlUYWdzW3VpbnQxNlRhZ10gPSB0eXBlZEFycmF5VGFnc1t1aW50MzJUYWddID0gdHJ1ZTtcbnR5cGVkQXJyYXlUYWdzW2FyZ3NUYWddID0gdHlwZWRBcnJheVRhZ3NbYXJyYXlUYWddID0gdHlwZWRBcnJheVRhZ3NbYXJyYXlCdWZmZXJUYWddID0gdHlwZWRBcnJheVRhZ3NbYm9vbFRhZ10gPSB0eXBlZEFycmF5VGFnc1tkYXRhVmlld1RhZ10gPSB0eXBlZEFycmF5VGFnc1tkYXRlVGFnXSA9IHR5cGVkQXJyYXlUYWdzW2Vycm9yVGFnXSA9IHR5cGVkQXJyYXlUYWdzW2Z1bmNUYWddID0gdHlwZWRBcnJheVRhZ3NbbWFwVGFnXSA9IHR5cGVkQXJyYXlUYWdzW251bWJlclRhZ10gPSB0eXBlZEFycmF5VGFnc1tvYmplY3RUYWddID0gdHlwZWRBcnJheVRhZ3NbcmVnZXhwVGFnXSA9IHR5cGVkQXJyYXlUYWdzW3NldFRhZ10gPSB0eXBlZEFycmF5VGFnc1tzdHJpbmdUYWddID0gdHlwZWRBcnJheVRhZ3Nbd2Vha01hcFRhZ10gPSBmYWxzZTtcbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udW5hcnlgIHdpdGhvdXQgc3VwcG9ydCBmb3Igc3RvcmluZyBtZXRhZGF0YS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY2FwIGFyZ3VtZW50cyBmb3IuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjYXBwZWQgZnVuY3Rpb24uXG4gKi9cblxuZnVuY3Rpb24gYmFzZVVuYXJ5KGZ1bmMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIHJldHVybiBmdW5jKHZhbHVlKTtcbiAgfTtcbn1cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cblxuXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuLyoqXG4gKiBVc2VkIHRvIHJlc29sdmUgdGhlXG4gKiBbYHRvU3RyaW5nVGFnYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZylcbiAqIG9mIHZhbHVlcy5cbiAqL1xuXG52YXIgb2JqZWN0VG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZztcbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNUeXBlZEFycmF5YCB3aXRob3V0IE5vZGUuanMgb3B0aW1pemF0aW9ucy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHR5cGVkIGFycmF5LCBlbHNlIGBmYWxzZWAuXG4gKi9cblxuZnVuY3Rpb24gYmFzZUlzVHlwZWRBcnJheSh2YWx1ZSkge1xuICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBpc0xlbmd0aCh2YWx1ZS5sZW5ndGgpICYmICEhdHlwZWRBcnJheVRhZ3Nbb2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSldO1xufVxuXG5mdW5jdGlvbiBpc0xlbmd0aCh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiB2YWx1ZSA+IC0xICYmIHZhbHVlICUgMSA9PT0gMCAmJiB2YWx1ZSA8PSBNQVhfU0FGRV9JTlRFR0VSO1xufVxuXG5mdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpIHtcbiAgcmV0dXJuICEhdmFsdWUgJiYgX3R5cGVvZih2YWx1ZSkgPT09ICdvYmplY3QnO1xufVxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgdHlwZWQgYXJyYXkuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAzLjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB0eXBlZCBhcnJheSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzVHlwZWRBcnJheShuZXcgVWludDhBcnJheSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc1R5cGVkQXJyYXkoW10pO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuXG5cbmV4cG9ydCB2YXIgaXNUeXBlZEFycmF5ID0gYmFzZUlzVHlwZWRBcnJheTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWlzLXR5cGVkYXJyYXkuanMubWFwIiwiaW1wb3J0IF90b0NvbnN1bWFibGVBcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy90b0NvbnN1bWFibGVBcnJheVwiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9yZWdlbmVyYXRvclJ1bnRpbWUgZnJvbSBcIkBiYWJlbC9ydW50aW1lL3JlZ2VuZXJhdG9yXCI7XG5pbXBvcnQgX2FzeW5jVG9HZW5lcmF0b3IgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXN5bmNUb0dlbmVyYXRvclwiO1xuaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzc1wiO1xuXG5mdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHsgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTsgaWYgKGVudW1lcmFibGVPbmx5KSBzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTsgfSk7IGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsgfSByZXR1cm4ga2V5czsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldICE9IG51bGwgPyBhcmd1bWVudHNbaV0gOiB7fTsgaWYgKGkgJSAyKSB7IG93bktleXMoT2JqZWN0KHNvdXJjZSksIHRydWUpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSk7IH0gZWxzZSBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMpIHsgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKTsgfSBlbHNlIHsgb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpOyB9KTsgfSB9IHJldHVybiB0YXJnZXQ7IH1cblxuaW1wb3J0IHsgQVNUX1RPS0VOX1RZUEVTLCBjcmVhdGVFbnRpdHksIFNUT1JBR0VfQ0xBU1MgfSBmcm9tICdAYW50di9nLXdlYmdwdS1jb3JlJztcbmltcG9ydCB7IGlzVHlwZWRBcnJheSB9IGZyb20gJy4uL3V0aWxzL2lzLXR5cGVkYXJyYXknO1xuXG4vKiBiYWJlbC1wbHVnaW4taW5saW5lLWltcG9ydCAnLi9zaGFkZXJzL3F1YWQudmVydC5nbHNsJyAqL1xudmFyIHF1YWRWZXJ0ID0gXCJhdHRyaWJ1dGUgdmVjMyBhX1Bvc2l0aW9uO1xcbmF0dHJpYnV0ZSB2ZWMyIGFfVGV4Q29vcmQ7XFxuXFxudmFyeWluZyB2ZWMyIHZfVGV4Q29vcmQ7XFxuXFxudm9pZCBtYWluKCkge1xcbiAgZ2xfUG9zaXRpb24gPSB2ZWM0KGFfUG9zaXRpb24sIDEuMCk7XFxuICB2X1RleENvb3JkID0gYV9UZXhDb29yZDtcXG59XCI7XG52YXIgdGV4dHVyZUlkID0gMDtcbnZhciBkZWJ1ZyA9IGZhbHNlO1xuLyoqXG4gKiBhZGFwdG9yIGZvciByZWdsLkRyYXdDb21tYW5kXG4gKi9cblxudmFyIFJlZ2xDb21wdXRlTW9kZWwgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBSZWdsQ29tcHV0ZU1vZGVsKHJlR2wsIGNvbnRleHQpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFJlZ2xDb21wdXRlTW9kZWwpO1xuXG4gICAgdGhpcy5yZUdsID0gcmVHbDtcbiAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICAgIHRoaXMuZW50aXR5ID0gY3JlYXRlRW50aXR5KCk7XG4gICAgdGhpcy50ZXhGQk8gPSB2b2lkIDA7XG4gICAgdGhpcy5jb21wdXRlQ29tbWFuZCA9IHZvaWQgMDtcbiAgICB0aGlzLnRleHR1cmVDYWNoZSA9IHt9O1xuICAgIHRoaXMub3V0cHV0VGV4dHVyZU5hbWUgPSB2b2lkIDA7XG4gICAgdGhpcy5zd2FwT3V0cHV0VGV4dHVyZU5hbWUgPSB2b2lkIDA7XG4gICAgdGhpcy5jb21waWxlZFBpbmdwb25nID0gdm9pZCAwO1xuICAgIHRoaXMuZHluYW1pY1Bpbmdwb25nID0gdm9pZCAwO1xuICAgIHZhciB1bmlmb3JtcyA9IHt9O1xuICAgIHRoaXMuY29udGV4dC51bmlmb3Jtcy5mb3JFYWNoKGZ1bmN0aW9uICh1bmlmb3JtKSB7XG4gICAgICB2YXIgbmFtZSA9IHVuaWZvcm0ubmFtZSxcbiAgICAgICAgICB0eXBlID0gdW5pZm9ybS50eXBlLFxuICAgICAgICAgIGRhdGEgPSB1bmlmb3JtLmRhdGEsXG4gICAgICAgICAgaXNSZWZlcmVyID0gdW5pZm9ybS5pc1JlZmVyZXIsXG4gICAgICAgICAgc3RvcmFnZUNsYXNzID0gdW5pZm9ybS5zdG9yYWdlQ2xhc3M7IC8vIHN0b3JlIGRhdGEgd2l0aCBhIDJEIHRleHR1cmVcblxuICAgICAgaWYgKHN0b3JhZ2VDbGFzcyA9PT0gU1RPUkFHRV9DTEFTUy5TdG9yYWdlQnVmZmVyKSB7XG4gICAgICAgIGlmICghaXNSZWZlcmVyKSB7XG4gICAgICAgICAgX3RoaXMudGV4dHVyZUNhY2hlW25hbWVdID0gX3RoaXMuY2FsY0RhdGFUZXh0dXJlKG5hbWUsIHR5cGUsIGRhdGEpO1xuICAgICAgICAgIHZhciBfdGhpcyR0ZXh0dXJlQ2FjaGUkbmEgPSBfdGhpcy50ZXh0dXJlQ2FjaGVbbmFtZV0sXG4gICAgICAgICAgICAgIHdpZHRoID0gX3RoaXMkdGV4dHVyZUNhY2hlJG5hLnRleHR1cmVXaWR0aCxcbiAgICAgICAgICAgICAgaXNPdXRwdXQgPSBfdGhpcyR0ZXh0dXJlQ2FjaGUkbmEuaXNPdXRwdXQ7XG4gICAgICAgICAgdW5pZm9ybXNbXCJcIi5jb25jYXQobmFtZSwgXCJTaXplXCIpXSA9IFt3aWR0aCwgd2lkdGhdO1xuXG4gICAgICAgICAgaWYgKGlzT3V0cHV0KSB7XG4gICAgICAgICAgICBfdGhpcy5vdXRwdXRUZXh0dXJlTmFtZSA9IG5hbWU7XG5cbiAgICAgICAgICAgIGlmIChfdGhpcy5jb250ZXh0Lm5lZWRQaW5ncG9uZykge1xuICAgICAgICAgICAgICBfdGhpcy5vdXRwdXRUZXh0dXJlTmFtZSA9IFwiXCIuY29uY2F0KG5hbWUsIFwiT3V0cHV0XCIpO1xuICAgICAgICAgICAgICBfdGhpcy50ZXh0dXJlQ2FjaGVbX3RoaXMub3V0cHV0VGV4dHVyZU5hbWVdID0gX3RoaXMuY2FsY0RhdGFUZXh0dXJlKG5hbWUsIHR5cGUsIGRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgX3RoaXMudGV4dHVyZUNhY2hlW25hbWVdID0ge1xuICAgICAgICAgICAgZGF0YTogdW5kZWZpbmVkXG4gICAgICAgICAgfTsgLy8gcmVmZXIgdG8gYW5vdGhlciBrZXJuZWwncyBvdXRwdXQsXG4gICAgICAgICAgLy8gdGhlIHJlZmVycmVkIGtlcm5lbCBtYXkgbm90IGhhdmUgYmVlbiBpbml0aWFsaXplZCwgc28gd2UgdXNlIGR5bmFtaWMgd2F5IGhlcmVcblxuICAgICAgICAgIHVuaWZvcm1zW1wiXCIuY29uY2F0KG5hbWUsIFwiU2l6ZVwiKV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gKC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgZGF0YS5jb21waWxlZEJ1bmRsZS5jb250ZXh0Lm91dHB1dC50ZXh0dXJlU2l6ZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgdW5pZm9ybXNbbmFtZV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKGRlYnVnKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIltcIi5jb25jYXQoX3RoaXMuZW50aXR5LCBcIl06IFwiKS5jb25jYXQobmFtZSwgXCIgXCIpLmNvbmNhdChfdGhpcy50ZXh0dXJlQ2FjaGVbbmFtZV0uaWQpKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gX3RoaXMudGV4dHVyZUNhY2hlW25hbWVdLnRleHR1cmU7XG4gICAgICAgIH07XG4gICAgICB9IGVsc2UgaWYgKHN0b3JhZ2VDbGFzcyA9PT0gU1RPUkFHRV9DTEFTUy5Vbmlmb3JtKSB7XG4gICAgICAgIGlmIChkYXRhICYmIChBcnJheS5pc0FycmF5KGRhdGEpIHx8IGlzVHlwZWRBcnJheShkYXRhKSkgJiYgZGF0YS5sZW5ndGggPiAxNikge1xuICAgICAgICAgIC8vIHVwIHRvIG1hdDQgd2hpY2ggaW5jbHVkZXMgMTYgZWxlbWVudHNcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIGRhdGEgdHlwZSBcIi5jb25jYXQodHlwZSkpO1xuICAgICAgICB9IC8vIGdldCB1bmlmb3JtIGR5bmFtaWNhbGx5XG5cblxuICAgICAgICB1bmlmb3Jtc1tuYW1lXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gdW5pZm9ybS5kYXRhO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdmFyIF90aGlzJGdldE91cHV0RGF0YVRleCA9IHRoaXMuZ2V0T3VwdXREYXRhVGV4dHVyZSgpLFxuICAgICAgICB0ZXh0dXJlV2lkdGggPSBfdGhpcyRnZXRPdXB1dERhdGFUZXgudGV4dHVyZVdpZHRoLFxuICAgICAgICB0ZXhlbENvdW50ID0gX3RoaXMkZ2V0T3VwdXREYXRhVGV4LnRleGVsQ291bnQ7IC8vIOS8oOWFpSBvdXRwdXQg57q555CG5bC65a+45ZKM5pWw5o2u6ZW/5bqm77yM5L6/5LqO5aSa5L2Z55qEIHRleGVsIOaPkOWJjemAgOWHulxuXG5cbiAgICB1bmlmb3Jtcy51X091dHB1dFRleHR1cmVTaXplID0gW3RleHR1cmVXaWR0aCwgdGV4dHVyZVdpZHRoXTtcbiAgICB1bmlmb3Jtcy51X091dHB1dFRleGVsQ291bnQgPSB0ZXhlbENvdW50OyAvLyDkv53lrZjlnKggS2VybmVsIOeahOS4iuS4i+aWh+S4re+8jOS+m+WFtuS7liBLZXJuZWwg5byV55SoXG5cbiAgICB0aGlzLmNvbnRleHQub3V0cHV0LnRleHR1cmVTaXplID0gW3RleHR1cmVXaWR0aCwgdGV4dHVyZVdpZHRoXTtcbiAgICB2YXIgZHJhd1BhcmFtcyA9IHtcbiAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgYV9Qb3NpdGlvbjogW1stMSwgMSwgMF0sIFstMSwgLTEsIDBdLCBbMSwgMSwgMF0sIFsxLCAtMSwgMF1dLFxuICAgICAgICBhX1RleENvb3JkOiBbWzAsIDFdLCBbMCwgMF0sIFsxLCAxXSwgWzEsIDBdXVxuICAgICAgfSxcbiAgICAgIGZyYWc6IFwiI2lmZGVmIEdMX0ZSQUdNRU5UX1BSRUNJU0lPTl9ISUdIXFxuICBwcmVjaXNpb24gaGlnaHAgZmxvYXQ7XFxuI2Vsc2VcXG4gIHByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xcbiNlbmRpZlxcblwiLmNvbmNhdCh0aGlzLmNvbnRleHQuc2hhZGVyKSxcbiAgICAgIHVuaWZvcm1zOiB1bmlmb3JtcyxcbiAgICAgIHZlcnQ6IHF1YWRWZXJ0LFxuICAgICAgLy8gVE9ETzogdXNlIGEgZnVsbHNjcmVlbiB0cmlhbmdsZSBpbnN0ZWFkLlxuICAgICAgcHJpbWl0aXZlOiAndHJpYW5nbGUgc3RyaXAnLFxuICAgICAgY291bnQ6IDRcbiAgICB9O1xuICAgIHRoaXMuY29tcHV0ZUNvbW1hbmQgPSB0aGlzLnJlR2woZHJhd1BhcmFtcyk7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoUmVnbENvbXB1dGVNb2RlbCwgW3tcbiAgICBrZXk6IFwicnVuXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJ1bigpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICBpZiAodGhpcy5jb250ZXh0Lm1heEl0ZXJhdGlvbiA+IDEgJiYgdGhpcy5jb250ZXh0Lm5lZWRQaW5ncG9uZykge1xuICAgICAgICB0aGlzLmNvbXBpbGVkUGluZ3BvbmcgPSB0cnVlO1xuICAgICAgfSAvLyBuZWVkIHBpbmdwb25nIHdoZW4gKEBpbkBvdXQgYW5kIGV4ZWN1dGUoMTApKSBvciB1c2UgYHNldEJpbmRpbmcoJ291dCcsIHNlbGYpYFxuICAgICAgLy8gdGhpcy5uZWVkUGluZ3BvbmcgPVxuICAgICAgLy8gICAhISh0aGlzLmNvbnRleHQubWF4SXRlcmF0aW9uID4gMSAmJiB0aGlzLmNvbnRleHQubmVlZFBpbmdwb25nKTtcbiAgICAgIC8vIGlmICh0aGlzLnJlbGF0aXZlT3V0cHV0VGV4dHVyZU5hbWVzLmxlbmd0aCkge1xuICAgICAgLy8gICBjb25zdCB7IGlkLCB0ZXh0dXJlIH0gPSB0aGlzLmdldE91cHV0RGF0YVRleHR1cmUoKTtcbiAgICAgIC8vICAgdGhpcy5yZWxhdGl2ZU91dHB1dFRleHR1cmVOYW1lcy5mb3JFYWNoKChuYW1lKSA9PiB7XG4gICAgICAvLyAgICAgdGhpcy50ZXh0dXJlQ2FjaGVbbmFtZV0uaWQgPSBpZDtcbiAgICAgIC8vICAgICB0aGlzLnRleHR1cmVDYWNoZVtuYW1lXS50ZXh0dXJlID0gdGV4dHVyZTtcbiAgICAgIC8vICAgfSk7XG4gICAgICAvLyAgIHRoaXMuc3dhcCgpO1xuICAgICAgLy8gfVxuXG5cbiAgICAgIGlmICh0aGlzLmNvbXBpbGVkUGluZ3BvbmcgfHwgdGhpcy5keW5hbWljUGluZ3BvbmcpIHtcbiAgICAgICAgdGhpcy5zd2FwKCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMudGV4RkJPID0gdGhpcy5yZUdsLmZyYW1lYnVmZmVyKHtcbiAgICAgICAgY29sb3I6IHRoaXMuZ2V0T3VwdXREYXRhVGV4dHVyZSgpLnRleHR1cmVcbiAgICAgIH0pO1xuICAgICAgdGhpcy50ZXhGQk8udXNlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgX3RoaXMyLmNvbXB1dGVDb21tYW5kKCk7XG4gICAgICB9KTtcblxuICAgICAgaWYgKGRlYnVnKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiW1wiLmNvbmNhdCh0aGlzLmVudGl0eSwgXCJdOiBvdXRwdXQgXCIpLmNvbmNhdCh0aGlzLmdldE91cHV0RGF0YVRleHR1cmUoKS5pZCkpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZWFkRGF0YVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX3JlYWREYXRhID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoZnVuY3Rpb24gX2NhbGxlZSgpIHtcbiAgICAgICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgICAgICAgdmFyIHBpeGVscywgX3RoaXMkZ2V0T3VwdXREYXRhVGV4Miwgb3JpZ2luYWxEYXRhTGVuZ3RoLCBlbGVtZW50c1BlclRleGVsLCBfdGhpcyRnZXRPdXB1dERhdGFUZXgzLCB0eXBlZEFycmF5Q29uc3RydWN0b3IsIGZvcm1hdHRlZFBpeGVscywgaTtcblxuICAgICAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7XG4gICAgICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHtcbiAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgIHRoaXMucmVHbCh7XG4gICAgICAgICAgICAgICAgICBmcmFtZWJ1ZmZlcjogdGhpcy50ZXhGQk9cbiAgICAgICAgICAgICAgICB9KShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICBwaXhlbHMgPSBfdGhpczMucmVHbC5yZWFkKCk7XG4gICAgICAgICAgICAgICAgfSk7IC8vIEB0cy1pZ25vcmVcblxuICAgICAgICAgICAgICAgIGlmICghcGl4ZWxzKSB7XG4gICAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gNjtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIF90aGlzJGdldE91cHV0RGF0YVRleDIgPSB0aGlzLmdldE91cHV0RGF0YVRleHR1cmUoKSwgb3JpZ2luYWxEYXRhTGVuZ3RoID0gX3RoaXMkZ2V0T3VwdXREYXRhVGV4Mi5vcmlnaW5hbERhdGFMZW5ndGgsIGVsZW1lbnRzUGVyVGV4ZWwgPSBfdGhpcyRnZXRPdXB1dERhdGFUZXgyLmVsZW1lbnRzUGVyVGV4ZWwsIF90aGlzJGdldE91cHV0RGF0YVRleDMgPSBfdGhpcyRnZXRPdXB1dERhdGFUZXgyLnR5cGVkQXJyYXlDb25zdHJ1Y3RvciwgdHlwZWRBcnJheUNvbnN0cnVjdG9yID0gX3RoaXMkZ2V0T3VwdXREYXRhVGV4MyA9PT0gdm9pZCAwID8gRmxvYXQzMkFycmF5IDogX3RoaXMkZ2V0T3VwdXREYXRhVGV4MztcbiAgICAgICAgICAgICAgICBmb3JtYXR0ZWRQaXhlbHMgPSBbXTtcblxuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50c1BlclRleGVsICE9PSA0KSB7XG4gICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcGl4ZWxzLmxlbmd0aDsgaSArPSA0KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50c1BlclRleGVsID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGVkUGl4ZWxzLnB1c2gocGl4ZWxzW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50c1BlclRleGVsID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGVkUGl4ZWxzLnB1c2gocGl4ZWxzW2ldLCBwaXhlbHNbaSArIDFdKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICBmb3JtYXR0ZWRQaXhlbHMucHVzaChwaXhlbHNbaV0sIHBpeGVsc1tpICsgMV0sIHBpeGVsc1tpICsgMl0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgIGZvcm1hdHRlZFBpeGVscyA9IHBpeGVscztcbiAgICAgICAgICAgICAgICB9IC8vIOaIquWPluWkmuS9meeahOmDqOWIhlxuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcblxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmFicnVwdChcInJldHVyblwiLCBuZXcgdHlwZWRBcnJheUNvbnN0cnVjdG9yKGZvcm1hdHRlZFBpeGVscy5zbGljZSgwLCBvcmlnaW5hbERhdGFMZW5ndGgpKSk7XG5cbiAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5hYnJ1cHQoXCJyZXR1cm5cIiwgbmV3IEZsb2F0MzJBcnJheSgpKTtcblxuICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSwgX2NhbGxlZSwgdGhpcyk7XG4gICAgICB9KSk7XG5cbiAgICAgIGZ1bmN0aW9uIHJlYWREYXRhKCkge1xuICAgICAgICByZXR1cm4gX3JlYWREYXRhLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZWFkRGF0YTtcbiAgICB9KClcbiAgfSwge1xuICAgIGtleTogXCJjb25maXJtSW5wdXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29uZmlybUlucHV0KG1vZGVsLCBpbnB1dE5hbWUpIHtcbiAgICAgIHZhciBpbnB1dE1vZGVsOyAvLyByZWZlciB0byBzZWxmLCBzYW1lIGFzIHBpbmdwb25nXG5cbiAgICAgIGlmICh0aGlzLmVudGl0eSA9PT0gbW9kZWwuZW50aXR5KSB7XG4gICAgICAgIHRoaXMuZHluYW1pY1Bpbmdwb25nID0gdHJ1ZTtcbiAgICAgICAgaW5wdXRNb2RlbCA9IHRoaXM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbnB1dE1vZGVsID0gbW9kZWw7XG4gICAgICB9XG5cbiAgICAgIHRoaXMudGV4dHVyZUNhY2hlW2lucHV0TmFtZV0uaWQgPSBpbnB1dE1vZGVsLmdldE91cHV0RGF0YVRleHR1cmUoKS5pZDtcbiAgICAgIHRoaXMudGV4dHVyZUNhY2hlW2lucHV0TmFtZV0udGV4dHVyZSA9IGlucHV0TW9kZWwuZ2V0T3VwdXREYXRhVGV4dHVyZSgpLnRleHR1cmU7XG5cbiAgICAgIGlmIChkZWJ1Zykge1xuICAgICAgICBjb25zb2xlLmxvZyhcIltcIi5jb25jYXQodGhpcy5lbnRpdHksIFwiXTogY29uZmlybSBpbnB1dCBcIikuY29uY2F0KGlucHV0TmFtZSwgXCIgZnJvbSBtb2RlbCBcIikuY29uY2F0KGlucHV0TW9kZWwuZW50aXR5LCBcIiwgXCIpLmNvbmNhdChpbnB1dE1vZGVsLmdldE91cHV0RGF0YVRleHR1cmUoKS5pZCkpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ1cGRhdGVVbmlmb3JtXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHVwZGF0ZVVuaWZvcm0oKSB7Ly8gYWxyZWFkeSBnZXQgdW5pZm9ybSdzIGRhdGEgZHluYW1pY2FsbHkgd2hlbiBjcmVhdGVkLCBkbyBub3RoaW5nIGhlcmVcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidXBkYXRlQnVmZmVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHVwZGF0ZUJ1ZmZlcihidWZmZXJOYW1lLCBkYXRhKSB7XG4gICAgICB2YXIgb2Zmc2V0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiAwO1xuICAgICAgLy8gcmVnZW5lcmF0ZSBkYXRhIHRleHR1cmVcbiAgICAgIHZhciBidWZmZXIgPSB0aGlzLmNvbnRleHQudW5pZm9ybXMuZmluZChmdW5jdGlvbiAoX3JlZikge1xuICAgICAgICB2YXIgbmFtZSA9IF9yZWYubmFtZTtcbiAgICAgICAgcmV0dXJuIG5hbWUgPT09IGJ1ZmZlck5hbWU7XG4gICAgICB9KTtcblxuICAgICAgaWYgKGJ1ZmZlcikge1xuICAgICAgICB2YXIgX3RoaXMkY2FsY0RhdGFUZXh0dXJlID0gdGhpcy5jYWxjRGF0YVRleHR1cmUoYnVmZmVyTmFtZSwgYnVmZmVyLnR5cGUsIGRhdGEpLFxuICAgICAgICAgICAgdGV4dHVyZSA9IF90aGlzJGNhbGNEYXRhVGV4dHVyZS50ZXh0dXJlLFxuICAgICAgICAgICAgcGFkZGluZ0RhdGEgPSBfdGhpcyRjYWxjRGF0YVRleHR1cmUuZGF0YTsgLy8gVE9ETzogZGVzdHJveSBvdXRkYXRlZCB0ZXh0dXJlXG5cblxuICAgICAgICB0aGlzLnRleHR1cmVDYWNoZVtidWZmZXJOYW1lXS5kYXRhID0gcGFkZGluZ0RhdGE7XG4gICAgICAgIHRoaXMudGV4dHVyZUNhY2hlW2J1ZmZlck5hbWVdLnRleHR1cmUgPSB0ZXh0dXJlO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJkZXN0cm95XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRlc3Ryb3koKSB7Ly8gcmVnbCB3aWxsIGRlc3Ryb3kgYWxsIHJlc291cmNlc1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzd2FwXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHN3YXAoKSB7XG4gICAgICBpZiAoIXRoaXMuc3dhcE91dHB1dFRleHR1cmVOYW1lKSB7XG4gICAgICAgIHRoaXMuY3JlYXRlU3dhcE91dHB1dERhdGFUZXh0dXJlKCk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmNvbXBpbGVkUGluZ3BvbmcpIHtcbiAgICAgICAgdmFyIG91dHB1dFRleHR1cmVVbmlmb3JtTmFtZSA9IHRoaXMuY29udGV4dC5vdXRwdXQubmFtZTtcbiAgICAgICAgdGhpcy50ZXh0dXJlQ2FjaGVbb3V0cHV0VGV4dHVyZVVuaWZvcm1OYW1lXS5pZCA9IHRoaXMuZ2V0T3VwdXREYXRhVGV4dHVyZSgpLmlkO1xuICAgICAgICB0aGlzLnRleHR1cmVDYWNoZVtvdXRwdXRUZXh0dXJlVW5pZm9ybU5hbWVdLnRleHR1cmUgPSB0aGlzLmdldE91cHV0RGF0YVRleHR1cmUoKS50ZXh0dXJlO1xuICAgICAgfVxuXG4gICAgICB2YXIgdG1wID0gdGhpcy5vdXRwdXRUZXh0dXJlTmFtZTtcbiAgICAgIHRoaXMub3V0cHV0VGV4dHVyZU5hbWUgPSB0aGlzLnN3YXBPdXRwdXRUZXh0dXJlTmFtZTtcbiAgICAgIHRoaXMuc3dhcE91dHB1dFRleHR1cmVOYW1lID0gdG1wO1xuXG4gICAgICBpZiAoZGVidWcpIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJbXCIuY29uY2F0KHRoaXMuZW50aXR5LCBcIl06IGFmdGVyIHN3YXAsIG91dHB1dCBcIikuY29uY2F0KHRoaXMuZ2V0T3VwdXREYXRhVGV4dHVyZSgpLmlkKSk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldE91cHV0RGF0YVRleHR1cmVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0T3VwdXREYXRhVGV4dHVyZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLnRleHR1cmVDYWNoZVt0aGlzLm91dHB1dFRleHR1cmVOYW1lXTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY3JlYXRlU3dhcE91dHB1dERhdGFUZXh0dXJlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNyZWF0ZVN3YXBPdXRwdXREYXRhVGV4dHVyZSgpIHtcbiAgICAgIHZhciB0ZXh0dXJlID0gdGhpcy5jbG9uZURhdGFUZXh0dXJlKHRoaXMuZ2V0T3VwdXREYXRhVGV4dHVyZSgpKTtcbiAgICAgIHRoaXMuc3dhcE91dHB1dFRleHR1cmVOYW1lID0gXCJcIi5jb25jYXQodGhpcy5lbnRpdHksIFwiLXN3YXBcIik7XG4gICAgICB0aGlzLnRleHR1cmVDYWNoZVt0aGlzLnN3YXBPdXRwdXRUZXh0dXJlTmFtZV0gPSB0ZXh0dXJlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjbG9uZURhdGFUZXh0dXJlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNsb25lRGF0YVRleHR1cmUodGV4dHVyZSkge1xuICAgICAgdmFyIGRhdGEgPSB0ZXh0dXJlLmRhdGEsXG4gICAgICAgICAgdGV4dHVyZVdpZHRoID0gdGV4dHVyZS50ZXh0dXJlV2lkdGg7XG4gICAgICByZXR1cm4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCB0ZXh0dXJlKSwge30sIHtcbiAgICAgICAgaWQ6IHRleHR1cmVJZCsrLFxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHRleHR1cmU6IHRoaXMucmVHbC50ZXh0dXJlKHtcbiAgICAgICAgICB3aWR0aDogdGV4dHVyZVdpZHRoLFxuICAgICAgICAgIGhlaWdodDogdGV4dHVyZVdpZHRoLFxuICAgICAgICAgIGRhdGE6IGRhdGEsXG4gICAgICAgICAgdHlwZTogJ2Zsb2F0J1xuICAgICAgICB9KVxuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNhbGNEYXRhVGV4dHVyZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjYWxjRGF0YVRleHR1cmUobmFtZSwgdHlwZSwgZGF0YSkge1xuICAgICAgdmFyIGVsZW1lbnRzUGVyVGV4ZWwgPSAxO1xuXG4gICAgICBpZiAodHlwZSA9PT0gQVNUX1RPS0VOX1RZUEVTLlZlY3RvcjRGbG9hdEFycmF5KSB7XG4gICAgICAgIGVsZW1lbnRzUGVyVGV4ZWwgPSA0O1xuICAgICAgfSAvLyDnlKggMCDooaXlhajkuI3otrMgdmVjNCDnmoTpg6jliIZcblxuXG4gICAgICB2YXIgcGFkZGluZ0RhdGEgPSBbXTtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSArPSBlbGVtZW50c1BlclRleGVsKSB7XG4gICAgICAgIGlmIChlbGVtZW50c1BlclRleGVsID09PSAxKSB7XG4gICAgICAgICAgcGFkZGluZ0RhdGEucHVzaChkYXRhW2ldLCAwLCAwLCAwKTtcbiAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50c1BlclRleGVsID09PSAyKSB7XG4gICAgICAgICAgcGFkZGluZ0RhdGEucHVzaChkYXRhW2ldLCBkYXRhW2kgKyAxXSwgMCwgMCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudHNQZXJUZXhlbCA9PT0gMykge1xuICAgICAgICAgIHBhZGRpbmdEYXRhLnB1c2goZGF0YVtpXSwgZGF0YVtpICsgMV0sIGRhdGFbaSArIDJdLCAwKTtcbiAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50c1BlclRleGVsID09PSA0KSB7XG4gICAgICAgICAgcGFkZGluZ0RhdGEucHVzaChkYXRhW2ldLCBkYXRhW2kgKyAxXSwgZGF0YVtpICsgMl0sIGRhdGFbaSArIDNdKTtcbiAgICAgICAgfVxuICAgICAgfSAvLyDkvb/nlKjnurnnkIblrZjlgqjvvIzkvovlpoIgQXJyYXkoOCkg5L2/55SoIDMgKiAzIOe6ueeQhu+8jOacq+WwvuepuueZveS9v+eUqCAwIOWhq+WFhVxuXG5cbiAgICAgIHZhciBvcmlnaW5hbERhdGFMZW5ndGggPSBkYXRhLmxlbmd0aDtcbiAgICAgIHZhciB0ZXhlbENvdW50ID0gTWF0aC5jZWlsKG9yaWdpbmFsRGF0YUxlbmd0aCAvIGVsZW1lbnRzUGVyVGV4ZWwpO1xuICAgICAgdmFyIHdpZHRoID0gTWF0aC5jZWlsKE1hdGguc3FydCh0ZXhlbENvdW50KSk7XG4gICAgICB2YXIgcGFkZGluZ1RleGVsQ291bnQgPSB3aWR0aCAqIHdpZHRoO1xuXG4gICAgICBpZiAodGV4ZWxDb3VudCA8IHBhZGRpbmdUZXhlbENvdW50KSB7XG4gICAgICAgIHBhZGRpbmdEYXRhLnB1c2guYXBwbHkocGFkZGluZ0RhdGEsIF90b0NvbnN1bWFibGVBcnJheShuZXcgQXJyYXkoKHBhZGRpbmdUZXhlbENvdW50IC0gdGV4ZWxDb3VudCkgKiA0KS5maWxsKDApKSk7XG4gICAgICB9XG5cbiAgICAgIHZhciB0ZXh0dXJlID0gdGhpcy5yZUdsLnRleHR1cmUoe1xuICAgICAgICB3aWR0aDogd2lkdGgsXG4gICAgICAgIGhlaWdodDogd2lkdGgsXG4gICAgICAgIGRhdGE6IHBhZGRpbmdEYXRhLFxuICAgICAgICB0eXBlOiAnZmxvYXQnXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlkOiB0ZXh0dXJlSWQrKyxcbiAgICAgICAgZGF0YTogcGFkZGluZ0RhdGEsXG4gICAgICAgIG9yaWdpbmFsRGF0YUxlbmd0aDogb3JpZ2luYWxEYXRhTGVuZ3RoLFxuICAgICAgICB0eXBlZEFycmF5Q29uc3RydWN0b3I6IGlzVHlwZWRBcnJheShkYXRhKSA/IGRhdGEuY29uc3RydWN0b3IgOiB1bmRlZmluZWQsXG4gICAgICAgIHRleHR1cmVXaWR0aDogd2lkdGgsXG4gICAgICAgIHRleHR1cmU6IHRleHR1cmUsXG4gICAgICAgIHRleGVsQ291bnQ6IHRleGVsQ291bnQsXG4gICAgICAgIGVsZW1lbnRzUGVyVGV4ZWw6IGVsZW1lbnRzUGVyVGV4ZWwsXG4gICAgICAgIGlzT3V0cHV0OiBuYW1lID09PSB0aGlzLmNvbnRleHQub3V0cHV0Lm5hbWVcbiAgICAgIH07XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFJlZ2xDb21wdXRlTW9kZWw7XG59KCk7XG5cbmV4cG9ydCB7IFJlZ2xDb21wdXRlTW9kZWwgYXMgZGVmYXVsdCB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UmVnbENvbXB1dGVNb2RlbC5qcy5tYXAiLCJpbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrXCI7XG5pbXBvcnQgX2NyZWF0ZUNsYXNzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzXCI7XG5pbXBvcnQgeyBnbCB9IGZyb20gJ0BhbnR2L2ctd2ViZ3B1LWNvcmUnO1xuaW1wb3J0IHsgZGF0YVR5cGVNYXAsIHVzYWdlTWFwIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuLyoqXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9yZWdsLXByb2plY3QvcmVnbC9ibG9iL2doLXBhZ2VzL0FQSS5tZCNlbGVtZW50c1xuICovXG5cbnZhciBSZWdsRWxlbWVudHMgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBSZWdsRWxlbWVudHMocmVHbCwgb3B0aW9ucykge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBSZWdsRWxlbWVudHMpO1xuXG4gICAgdGhpcy5lbGVtZW50cyA9IHZvaWQgMDtcbiAgICB2YXIgZGF0YSA9IG9wdGlvbnMuZGF0YSxcbiAgICAgICAgdXNhZ2UgPSBvcHRpb25zLnVzYWdlLFxuICAgICAgICB0eXBlID0gb3B0aW9ucy50eXBlLFxuICAgICAgICBjb3VudCA9IG9wdGlvbnMuY291bnQ7XG4gICAgdGhpcy5lbGVtZW50cyA9IHJlR2wuZWxlbWVudHMoe1xuICAgICAgZGF0YTogZGF0YSxcbiAgICAgIHVzYWdlOiB1c2FnZU1hcFt1c2FnZSB8fCBnbC5TVEFUSUNfRFJBV10sXG4gICAgICB0eXBlOiBkYXRhVHlwZU1hcFt0eXBlIHx8IGdsLlVOU0lHTkVEX0JZVEVdLFxuICAgICAgY291bnQ6IGNvdW50XG4gICAgfSk7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoUmVnbEVsZW1lbnRzLCBbe1xuICAgIGtleTogXCJnZXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudHM7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInN1YkRhdGFcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc3ViRGF0YShfcmVmKSB7XG4gICAgICB2YXIgZGF0YSA9IF9yZWYuZGF0YTtcbiAgICAgIHRoaXMuZWxlbWVudHMuc3ViZGF0YShkYXRhKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZGVzdHJveVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkZXN0cm95KCkge1xuICAgICAgdGhpcy5lbGVtZW50cy5kZXN0cm95KCk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFJlZ2xFbGVtZW50cztcbn0oKTtcblxuZXhwb3J0IHsgUmVnbEVsZW1lbnRzIGFzIGRlZmF1bHQgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJlZ2xFbGVtZW50cy5qcy5tYXAiLCJpbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrXCI7XG5pbXBvcnQgX2NyZWF0ZUNsYXNzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzXCI7XG5cbi8qKlxuICogYWRhcHRvciBmb3IgcmVnbC5GcmFtZWJ1ZmZlclxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vcmVnbC1wcm9qZWN0L3JlZ2wvYmxvYi9naC1wYWdlcy9BUEkubWQjZnJhbWVidWZmZXJzXG4gKi9cbnZhciBSZWdsRnJhbWVidWZmZXIgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBSZWdsRnJhbWVidWZmZXIocmVHbCwgb3B0aW9ucykge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBSZWdsRnJhbWVidWZmZXIpO1xuXG4gICAgdGhpcy5mcmFtZWJ1ZmZlciA9IHZvaWQgMDtcbiAgICB2YXIgd2lkdGggPSBvcHRpb25zLndpZHRoLFxuICAgICAgICBoZWlnaHQgPSBvcHRpb25zLmhlaWdodCxcbiAgICAgICAgY29sb3IgPSBvcHRpb25zLmNvbG9yLFxuICAgICAgICBjb2xvcnMgPSBvcHRpb25zLmNvbG9ycyxcbiAgICAgICAgZGVwdGggPSBvcHRpb25zLmRlcHRoLFxuICAgICAgICBzdGVuY2lsID0gb3B0aW9ucy5zdGVuY2lsO1xuICAgIHZhciBmcmFtZWJ1ZmZlck9wdGlvbnMgPSB7XG4gICAgICB3aWR0aDogd2lkdGgsXG4gICAgICBoZWlnaHQ6IGhlaWdodFxuICAgIH07XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShjb2xvcnMpKSB7XG4gICAgICBmcmFtZWJ1ZmZlck9wdGlvbnMuY29sb3JzID0gY29sb3JzLm1hcChmdW5jdGlvbiAoYykge1xuICAgICAgICByZXR1cm4gYy5nZXQoKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChjb2xvciAmJiB0eXBlb2YgY29sb3IgIT09ICdib29sZWFuJykge1xuICAgICAgZnJhbWVidWZmZXJPcHRpb25zLmNvbG9yID0gY29sb3IuZ2V0KCk7XG4gICAgfSAvLyBUT0RPOiBkZXB0aCAmIHN0ZW5jaWxcblxuXG4gICAgdGhpcy5mcmFtZWJ1ZmZlciA9IHJlR2wuZnJhbWVidWZmZXIoZnJhbWVidWZmZXJPcHRpb25zKTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhSZWdsRnJhbWVidWZmZXIsIFt7XG4gICAga2V5OiBcImdldFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5mcmFtZWJ1ZmZlcjtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZGVzdHJveVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkZXN0cm95KCkge1xuICAgICAgdGhpcy5mcmFtZWJ1ZmZlci5kZXN0cm95KCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlc2l6ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZXNpemUoX3JlZikge1xuICAgICAgdmFyIHdpZHRoID0gX3JlZi53aWR0aCxcbiAgICAgICAgICBoZWlnaHQgPSBfcmVmLmhlaWdodDtcbiAgICAgIHRoaXMuZnJhbWVidWZmZXIucmVzaXplKHdpZHRoLCBoZWlnaHQpO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBSZWdsRnJhbWVidWZmZXI7XG59KCk7XG5cbmV4cG9ydCB7IFJlZ2xGcmFtZWJ1ZmZlciBhcyBkZWZhdWx0IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1SZWdsRnJhbWVidWZmZXIuanMubWFwIiwiaW1wb3J0IF90eXBlb2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvdHlwZW9mXCI7XG5leHBvcnQgZnVuY3Rpb24gaXNPYmplY3QodmFsdWUpIHtcbiAgdmFyIHR5cGUgPSBfdHlwZW9mKHZhbHVlKTtcblxuICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiAodHlwZSA9PT0gJ29iamVjdCcgfHwgdHlwZSA9PT0gJ2Z1bmN0aW9uJyk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pcy1vYmplY3QuanMubWFwIiwiaW1wb3J0IHsgaXNPYmplY3QgfSBmcm9tICcuL2lzLW9iamVjdCc7XG5pbXBvcnQgeyBpc1R5cGVkQXJyYXkgfSBmcm9tICcuL2lzLXR5cGVkYXJyYXknO1xuLyoqXG4gKiDogIPomZHnu5PmnoTkvZPlkb3lkI0sIGVnOlxuICogYTogeyBiOiAxIH0gIC0+ICAnYS5iJ1xuICogYTogWyB7IGI6IDEgfSBdIC0+ICdhWzBdLmInXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RVbmlmb3Jtcyh1bmlmb3Jtcykge1xuICB2YXIgZXh0cmFjdGVkVW5pZm9ybXMgPSB7fTtcbiAgT2JqZWN0LmtleXModW5pZm9ybXMpLmZvckVhY2goZnVuY3Rpb24gKHVuaWZvcm1OYW1lKSB7XG4gICAgZXh0cmFjdFVuaWZvcm1zUmVjdXJzaXZlbHkodW5pZm9ybU5hbWUsIHVuaWZvcm1zW3VuaWZvcm1OYW1lXSwgZXh0cmFjdGVkVW5pZm9ybXMsICcnKTtcbiAgfSk7XG4gIHJldHVybiBleHRyYWN0ZWRVbmlmb3Jtcztcbn1cblxuZnVuY3Rpb24gZXh0cmFjdFVuaWZvcm1zUmVjdXJzaXZlbHkodW5pZm9ybU5hbWUsIHVuaWZvcm1WYWx1ZSwgdW5pZm9ybXMsIHByZWZpeCkge1xuICBpZiAodW5pZm9ybVZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB1bmlmb3JtVmFsdWUgPT09ICdudW1iZXInIHx8IC8vIHVfQTogMVxuICB0eXBlb2YgdW5pZm9ybVZhbHVlID09PSAnYm9vbGVhbicgfHwgLy8gdV9BOiBmYWxzZVxuICBBcnJheS5pc0FycmF5KHVuaWZvcm1WYWx1ZSkgJiYgdHlwZW9mIHVuaWZvcm1WYWx1ZVswXSA9PT0gJ251bWJlcicgfHwgLy8gdV9BOiBbMSwgMiwgM11cbiAgaXNUeXBlZEFycmF5KHVuaWZvcm1WYWx1ZSkgfHwgLy8gdV9BOiBGbG9hdDMyQXJyYXlcbiAgLy8gQHRzLWlnbm9yZVxuICB1bmlmb3JtVmFsdWUgPT09ICcnIHx8IC8vIEB0cy1pZ25vcmVcbiAgdW5pZm9ybVZhbHVlLnJlc2l6ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdW5pZm9ybXNbXCJcIi5jb25jYXQocHJlZml4ICYmIHByZWZpeCArICcuJykuY29uY2F0KHVuaWZvcm1OYW1lKV0gPSB1bmlmb3JtVmFsdWU7XG4gICAgcmV0dXJuO1xuICB9IC8vIHVfU3RydWN0LmEuYi5jXG5cblxuICBpZiAoaXNPYmplY3QodW5pZm9ybVZhbHVlKSkge1xuICAgIE9iamVjdC5rZXlzKHVuaWZvcm1WYWx1ZSkuZm9yRWFjaChmdW5jdGlvbiAoY2hpbGROYW1lKSB7XG4gICAgICBleHRyYWN0VW5pZm9ybXNSZWN1cnNpdmVseShjaGlsZE5hbWUsIC8vIEB0cy1pZ25vcmVcbiAgICAgIHVuaWZvcm1WYWx1ZVtjaGlsZE5hbWVdLCB1bmlmb3JtcywgXCJcIi5jb25jYXQocHJlZml4ICYmIHByZWZpeCArICcuJykuY29uY2F0KHVuaWZvcm1OYW1lKSk7XG4gICAgfSk7XG4gIH0gLy8gdV9TdHJ1Y3RbMF0uYVxuXG5cbiAgaWYgKEFycmF5LmlzQXJyYXkodW5pZm9ybVZhbHVlKSkge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB1bmlmb3JtVmFsdWUuZm9yRWFjaChmdW5jdGlvbiAoY2hpbGQsIGlkeCkge1xuICAgICAgT2JqZWN0LmtleXMoY2hpbGQpLmZvckVhY2goZnVuY3Rpb24gKGNoaWxkTmFtZSkge1xuICAgICAgICBleHRyYWN0VW5pZm9ybXNSZWN1cnNpdmVseShjaGlsZE5hbWUsIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgY2hpbGRbY2hpbGROYW1lXSwgdW5pZm9ybXMsIFwiXCIuY29uY2F0KHByZWZpeCAmJiBwcmVmaXggKyAnLicpLmNvbmNhdCh1bmlmb3JtTmFtZSwgXCJbXCIpLmNvbmNhdChpZHgsIFwiXVwiKSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dW5pZm9ybS5qcy5tYXAiLCJpbXBvcnQgX3R5cGVvZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy90eXBlb2ZcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfY2xhc3NDYWxsQ2hlY2sgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2tcIjtcbmltcG9ydCBfY3JlYXRlQ2xhc3MgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlQ2xhc3NcIjtcblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7IHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7IGlmIChlbnVtZXJhYmxlT25seSkgc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7IH0pOyBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7IH0gcmV0dXJuIGtleXM7IH1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXSAhPSBudWxsID8gYXJndW1lbnRzW2ldIDoge307IGlmIChpICUgMikgeyBvd25LZXlzKE9iamVjdChzb3VyY2UpLCB0cnVlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pOyB9IGVsc2UgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSk7IH0gZWxzZSB7IG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsgfSk7IH0gfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmltcG9ydCB7IGdsIH0gZnJvbSAnQGFudHYvZy13ZWJncHUtY29yZSc7XG5pbXBvcnQgeyBleHRyYWN0VW5pZm9ybXMgfSBmcm9tICcuLi91dGlscy91bmlmb3JtJztcbmltcG9ydCB7IGJsZW5kRXF1YXRpb25NYXAsIGJsZW5kRnVuY01hcCwgY3VsbEZhY2VNYXAsIGRlcHRoRnVuY01hcCwgcHJpbWl0aXZlTWFwLCBzdGVuY2lsRnVuY01hcCwgc3RlbmNpbE9wTWFwIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuXG4vKipcbiAqIGFkYXB0b3IgZm9yIHJlZ2wuRHJhd0NvbW1hbmRcbiAqL1xudmFyIFJlZ2xNb2RlbCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFJlZ2xNb2RlbChyZUdsLCBvcHRpb25zKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFJlZ2xNb2RlbCk7XG5cbiAgICB0aGlzLnJlR2wgPSB2b2lkIDA7XG4gICAgdGhpcy5kcmF3Q29tbWFuZCA9IHZvaWQgMDtcbiAgICB0aGlzLnVuaWZvcm1zID0ge307XG4gICAgdGhpcy5yZUdsID0gcmVHbDtcbiAgICB2YXIgdnMgPSBvcHRpb25zLnZzLFxuICAgICAgICBmcyA9IG9wdGlvbnMuZnMsXG4gICAgICAgIGRlZmluZXMgPSBvcHRpb25zLmRlZmluZXMsXG4gICAgICAgIGF0dHJpYnV0ZXMgPSBvcHRpb25zLmF0dHJpYnV0ZXMsXG4gICAgICAgIHVuaWZvcm1zID0gb3B0aW9ucy51bmlmb3JtcyxcbiAgICAgICAgcHJpbWl0aXZlID0gb3B0aW9ucy5wcmltaXRpdmUsXG4gICAgICAgIGNvdW50ID0gb3B0aW9ucy5jb3VudCxcbiAgICAgICAgZWxlbWVudHMgPSBvcHRpb25zLmVsZW1lbnRzLFxuICAgICAgICBkZXB0aCA9IG9wdGlvbnMuZGVwdGgsXG4gICAgICAgIGJsZW5kID0gb3B0aW9ucy5ibGVuZCxcbiAgICAgICAgc3RlbmNpbCA9IG9wdGlvbnMuc3RlbmNpbCxcbiAgICAgICAgY3VsbCA9IG9wdGlvbnMuY3VsbCxcbiAgICAgICAgaW5zdGFuY2VzID0gb3B0aW9ucy5pbnN0YW5jZXMsXG4gICAgICAgIHNjaXNzb3IgPSBvcHRpb25zLnNjaXNzb3IsXG4gICAgICAgIHZpZXdwb3J0ID0gb3B0aW9ucy52aWV3cG9ydDtcbiAgICB2YXIgcmVnbFVuaWZvcm1zID0ge307XG5cbiAgICBpZiAodW5pZm9ybXMpIHtcbiAgICAgIHRoaXMudW5pZm9ybXMgPSBleHRyYWN0VW5pZm9ybXModW5pZm9ybXMpO1xuICAgICAgT2JqZWN0LmtleXModW5pZm9ybXMpLmZvckVhY2goZnVuY3Rpb24gKHVuaWZvcm1OYW1lKSB7XG4gICAgICAgIC8vIHVzZSByZWdsIHByb3AgQVBJXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgcmVnbFVuaWZvcm1zW3VuaWZvcm1OYW1lXSA9IHJlR2wucHJvcCh1bmlmb3JtTmFtZSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB2YXIgcmVnbEF0dHJpYnV0ZXMgPSB7fTtcbiAgICBPYmplY3Qua2V5cyhhdHRyaWJ1dGVzKS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICByZWdsQXR0cmlidXRlc1tuYW1lXSA9IGF0dHJpYnV0ZXNbbmFtZV0uZ2V0KCk7XG4gICAgfSk7XG4gICAgdmFyIGRlZmluZVN0bXRzID0gZGVmaW5lcyAmJiB0aGlzLmdlbmVyYXRlRGVmaW5lcyhkZWZpbmVzKSB8fCAnJztcbiAgICB2YXIgZHJhd1BhcmFtcyA9IHtcbiAgICAgIGF0dHJpYnV0ZXM6IHJlZ2xBdHRyaWJ1dGVzLFxuICAgICAgZnJhZzogXCIjaWZkZWYgR0xfRlJBR01FTlRfUFJFQ0lTSU9OX0hJR0hcXG4gIHByZWNpc2lvbiBoaWdocCBmbG9hdDtcXG4jZWxzZVxcbiAgcHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XFxuI2VuZGlmXFxuXCIuY29uY2F0KGRlZmluZVN0bXRzLCBcIlxcblwiKS5jb25jYXQoZnMpLFxuICAgICAgdW5pZm9ybXM6IHJlZ2xVbmlmb3JtcyxcbiAgICAgIHZlcnQ6IFwiXFxuXCIuY29uY2F0KGRlZmluZVN0bXRzLCBcIlxcblwiKS5jb25jYXQodnMpLFxuICAgICAgcHJpbWl0aXZlOiBwcmltaXRpdmVNYXBbcHJpbWl0aXZlID09PSB1bmRlZmluZWQgPyBnbC5UUklBTkdMRVMgOiBwcmltaXRpdmVdXG4gICAgfTtcblxuICAgIGlmIChpbnN0YW5jZXMpIHtcbiAgICAgIGRyYXdQYXJhbXMuaW5zdGFuY2VzID0gaW5zdGFuY2VzO1xuICAgIH0gLy8gZWxlbWVudHMg5Lit5Y+v6IO95YyF5ZCrIGNvdW5077yM5q2k5pe25LiN5bqU5Lyg5YWlXG5cblxuICAgIGlmIChjb3VudCkge1xuICAgICAgZHJhd1BhcmFtcy5jb3VudCA9IGNvdW50O1xuICAgIH1cblxuICAgIGlmIChlbGVtZW50cykge1xuICAgICAgZHJhd1BhcmFtcy5lbGVtZW50cyA9IGVsZW1lbnRzLmdldCgpO1xuICAgIH1cblxuICAgIGlmIChzY2lzc29yKSB7XG4gICAgICBkcmF3UGFyYW1zLnNjaXNzb3IgPSBzY2lzc29yO1xuICAgIH1cblxuICAgIGlmICh2aWV3cG9ydCkge1xuICAgICAgZHJhd1BhcmFtcy52aWV3cG9ydCA9IHZpZXdwb3J0O1xuICAgIH1cblxuICAgIHRoaXMuaW5pdERlcHRoRHJhd1BhcmFtcyh7XG4gICAgICBkZXB0aDogZGVwdGhcbiAgICB9LCBkcmF3UGFyYW1zKTtcbiAgICB0aGlzLmluaXRCbGVuZERyYXdQYXJhbXMoe1xuICAgICAgYmxlbmQ6IGJsZW5kXG4gICAgfSwgZHJhd1BhcmFtcyk7XG4gICAgdGhpcy5pbml0U3RlbmNpbERyYXdQYXJhbXMoe1xuICAgICAgc3RlbmNpbDogc3RlbmNpbFxuICAgIH0sIGRyYXdQYXJhbXMpO1xuICAgIHRoaXMuaW5pdEN1bGxEcmF3UGFyYW1zKHtcbiAgICAgIGN1bGw6IGN1bGxcbiAgICB9LCBkcmF3UGFyYW1zKTtcbiAgICB0aGlzLmRyYXdDb21tYW5kID0gcmVHbChkcmF3UGFyYW1zKTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhSZWdsTW9kZWwsIFt7XG4gICAga2V5OiBcImFkZFVuaWZvcm1zXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFkZFVuaWZvcm1zKHVuaWZvcm1zKSB7XG4gICAgICB0aGlzLnVuaWZvcm1zID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCB0aGlzLnVuaWZvcm1zKSwgZXh0cmFjdFVuaWZvcm1zKHVuaWZvcm1zKSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImRyYXdcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZHJhdyhvcHRpb25zKSB7XG4gICAgICB2YXIgdW5pZm9ybXMgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHRoaXMudW5pZm9ybXMpLCBleHRyYWN0VW5pZm9ybXMob3B0aW9ucy51bmlmb3JtcyB8fCB7fSkpO1xuXG4gICAgICB2YXIgcmVnbERyYXdQcm9wcyA9IHt9O1xuICAgICAgT2JqZWN0LmtleXModW5pZm9ybXMpLmZvckVhY2goZnVuY3Rpb24gKHVuaWZvcm1OYW1lKSB7XG4gICAgICAgIHZhciB0eXBlID0gX3R5cGVvZih1bmlmb3Jtc1t1bmlmb3JtTmFtZV0pO1xuXG4gICAgICAgIGlmICh0eXBlID09PSAnYm9vbGVhbicgfHwgdHlwZSA9PT0gJ251bWJlcicgfHwgQXJyYXkuaXNBcnJheSh1bmlmb3Jtc1t1bmlmb3JtTmFtZV0pIHx8IC8vIEB0cy1pZ25vcmVcbiAgICAgICAgdW5pZm9ybXNbdW5pZm9ybU5hbWVdLkJZVEVTX1BFUl9FTEVNRU5UKSB7XG4gICAgICAgICAgcmVnbERyYXdQcm9wc1t1bmlmb3JtTmFtZV0gPSB1bmlmb3Jtc1t1bmlmb3JtTmFtZV07XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3N0cmluZycpIHsvLyBUT0RPOiBpbWFnZSB1cmxcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWdsRHJhd1Byb3BzW3VuaWZvcm1OYW1lXSA9IHVuaWZvcm1zW3VuaWZvcm1OYW1lXS5nZXQoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLmRyYXdDb21tYW5kKHJlZ2xEcmF3UHJvcHMpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJkZXN0cm95XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRlc3Ryb3koKSB7Ly8gZG9uJ3QgbmVlZCBkbyBhbnl0aGluZyBzaW5jZSB3ZSB3aWxsIGNhbGwgYHJlbmRlcmVyU2VydmljZS5jbGVhbnVwKClgXG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3JlZ2wtcHJvamVjdC9yZWdsL2Jsb2IvZ2gtcGFnZXMvQVBJLm1kI2RlcHRoLWJ1ZmZlclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiaW5pdERlcHRoRHJhd1BhcmFtc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpbml0RGVwdGhEcmF3UGFyYW1zKF9yZWYsIGRyYXdQYXJhbXMpIHtcbiAgICAgIHZhciBkZXB0aCA9IF9yZWYuZGVwdGg7XG5cbiAgICAgIGlmIChkZXB0aCkge1xuICAgICAgICBkcmF3UGFyYW1zLmRlcHRoID0ge1xuICAgICAgICAgIGVuYWJsZTogZGVwdGguZW5hYmxlID09PSB1bmRlZmluZWQgPyB0cnVlIDogISFkZXB0aC5lbmFibGUsXG4gICAgICAgICAgbWFzazogZGVwdGgubWFzayA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6ICEhZGVwdGgubWFzayxcbiAgICAgICAgICBmdW5jOiBkZXB0aEZ1bmNNYXBbZGVwdGguZnVuYyB8fCBnbC5MRVNTXSxcbiAgICAgICAgICByYW5nZTogZGVwdGgucmFuZ2UgfHwgWzAsIDFdXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3JlZ2wtcHJvamVjdC9yZWdsL2Jsb2IvZ2gtcGFnZXMvQVBJLm1kI2JsZW5kaW5nXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJpbml0QmxlbmREcmF3UGFyYW1zXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGluaXRCbGVuZERyYXdQYXJhbXMoX3JlZjIsIGRyYXdQYXJhbXMpIHtcbiAgICAgIHZhciBibGVuZCA9IF9yZWYyLmJsZW5kO1xuXG4gICAgICBpZiAoYmxlbmQpIHtcbiAgICAgICAgdmFyIGVuYWJsZSA9IGJsZW5kLmVuYWJsZSxcbiAgICAgICAgICAgIGZ1bmMgPSBibGVuZC5mdW5jLFxuICAgICAgICAgICAgZXF1YXRpb24gPSBibGVuZC5lcXVhdGlvbixcbiAgICAgICAgICAgIF9ibGVuZCRjb2xvciA9IGJsZW5kLmNvbG9yLFxuICAgICAgICAgICAgY29sb3IgPSBfYmxlbmQkY29sb3IgPT09IHZvaWQgMCA/IFswLCAwLCAwLCAwXSA6IF9ibGVuZCRjb2xvcjsgLy8gQHRzLWlnbm9yZVxuXG4gICAgICAgIGRyYXdQYXJhbXMuYmxlbmQgPSB7XG4gICAgICAgICAgZW5hYmxlOiAhIWVuYWJsZSxcbiAgICAgICAgICBmdW5jOiB7XG4gICAgICAgICAgICBzcmNSR0I6IGJsZW5kRnVuY01hcFtmdW5jICYmIGZ1bmMuc3JjUkdCIHx8IGdsLlNSQ19BTFBIQV0sXG4gICAgICAgICAgICBzcmNBbHBoYTogYmxlbmRGdW5jTWFwW2Z1bmMgJiYgZnVuYy5zcmNBbHBoYSB8fCBnbC5TUkNfQUxQSEFdLFxuICAgICAgICAgICAgZHN0UkdCOiBibGVuZEZ1bmNNYXBbZnVuYyAmJiBmdW5jLmRzdFJHQiB8fCBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBXSxcbiAgICAgICAgICAgIGRzdEFscGhhOiBibGVuZEZ1bmNNYXBbZnVuYyAmJiBmdW5jLmRzdEFscGhhIHx8IGdsLk9ORV9NSU5VU19TUkNfQUxQSEFdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBlcXVhdGlvbjoge1xuICAgICAgICAgICAgcmdiOiBibGVuZEVxdWF0aW9uTWFwW2VxdWF0aW9uICYmIGVxdWF0aW9uLnJnYiB8fCBnbC5GVU5DX0FERF0sXG4gICAgICAgICAgICBhbHBoYTogYmxlbmRFcXVhdGlvbk1hcFtlcXVhdGlvbiAmJiBlcXVhdGlvbi5hbHBoYSB8fCBnbC5GVU5DX0FERF1cbiAgICAgICAgICB9LFxuICAgICAgICAgIGNvbG9yOiBjb2xvclxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9yZWdsLXByb2plY3QvcmVnbC9ibG9iL2doLXBhZ2VzL0FQSS5tZCNzdGVuY2lsXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJpbml0U3RlbmNpbERyYXdQYXJhbXNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaW5pdFN0ZW5jaWxEcmF3UGFyYW1zKF9yZWYzLCBkcmF3UGFyYW1zKSB7XG4gICAgICB2YXIgc3RlbmNpbCA9IF9yZWYzLnN0ZW5jaWw7XG5cbiAgICAgIGlmIChzdGVuY2lsKSB7XG4gICAgICAgIHZhciBlbmFibGUgPSBzdGVuY2lsLmVuYWJsZSxcbiAgICAgICAgICAgIF9zdGVuY2lsJG1hc2sgPSBzdGVuY2lsLm1hc2ssXG4gICAgICAgICAgICBtYXNrID0gX3N0ZW5jaWwkbWFzayA9PT0gdm9pZCAwID8gLTEgOiBfc3RlbmNpbCRtYXNrLFxuICAgICAgICAgICAgX3N0ZW5jaWwkZnVuYyA9IHN0ZW5jaWwuZnVuYyxcbiAgICAgICAgICAgIGZ1bmMgPSBfc3RlbmNpbCRmdW5jID09PSB2b2lkIDAgPyB7XG4gICAgICAgICAgY21wOiBnbC5BTFdBWVMsXG4gICAgICAgICAgcmVmOiAwLFxuICAgICAgICAgIG1hc2s6IC0xXG4gICAgICAgIH0gOiBfc3RlbmNpbCRmdW5jLFxuICAgICAgICAgICAgX3N0ZW5jaWwkb3BGcm9udCA9IHN0ZW5jaWwub3BGcm9udCxcbiAgICAgICAgICAgIG9wRnJvbnQgPSBfc3RlbmNpbCRvcEZyb250ID09PSB2b2lkIDAgPyB7XG4gICAgICAgICAgZmFpbDogZ2wuS0VFUCxcbiAgICAgICAgICB6ZmFpbDogZ2wuS0VFUCxcbiAgICAgICAgICB6cGFzczogZ2wuS0VFUFxuICAgICAgICB9IDogX3N0ZW5jaWwkb3BGcm9udCxcbiAgICAgICAgICAgIF9zdGVuY2lsJG9wQmFjayA9IHN0ZW5jaWwub3BCYWNrLFxuICAgICAgICAgICAgb3BCYWNrID0gX3N0ZW5jaWwkb3BCYWNrID09PSB2b2lkIDAgPyB7XG4gICAgICAgICAgZmFpbDogZ2wuS0VFUCxcbiAgICAgICAgICB6ZmFpbDogZ2wuS0VFUCxcbiAgICAgICAgICB6cGFzczogZ2wuS0VFUFxuICAgICAgICB9IDogX3N0ZW5jaWwkb3BCYWNrO1xuICAgICAgICBkcmF3UGFyYW1zLnN0ZW5jaWwgPSB7XG4gICAgICAgICAgZW5hYmxlOiAhIWVuYWJsZSxcbiAgICAgICAgICBtYXNrOiBtYXNrLFxuICAgICAgICAgIGZ1bmM6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgZnVuYyksIHt9LCB7XG4gICAgICAgICAgICBjbXA6IHN0ZW5jaWxGdW5jTWFwW2Z1bmMuY21wXVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIG9wRnJvbnQ6IHtcbiAgICAgICAgICAgIGZhaWw6IHN0ZW5jaWxPcE1hcFtvcEZyb250LmZhaWxdLFxuICAgICAgICAgICAgemZhaWw6IHN0ZW5jaWxPcE1hcFtvcEZyb250LnpmYWlsXSxcbiAgICAgICAgICAgIHpwYXNzOiBzdGVuY2lsT3BNYXBbb3BGcm9udC56cGFzc11cbiAgICAgICAgICB9LFxuICAgICAgICAgIG9wQmFjazoge1xuICAgICAgICAgICAgZmFpbDogc3RlbmNpbE9wTWFwW29wQmFjay5mYWlsXSxcbiAgICAgICAgICAgIHpmYWlsOiBzdGVuY2lsT3BNYXBbb3BCYWNrLnpmYWlsXSxcbiAgICAgICAgICAgIHpwYXNzOiBzdGVuY2lsT3BNYXBbb3BCYWNrLnpwYXNzXVxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vcmVnbC1wcm9qZWN0L3JlZ2wvYmxvYi9naC1wYWdlcy9BUEkubWQjY3VsbGluZ1xuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiaW5pdEN1bGxEcmF3UGFyYW1zXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGluaXRDdWxsRHJhd1BhcmFtcyhfcmVmNCwgZHJhd1BhcmFtcykge1xuICAgICAgdmFyIGN1bGwgPSBfcmVmNC5jdWxsO1xuXG4gICAgICBpZiAoY3VsbCkge1xuICAgICAgICB2YXIgZW5hYmxlID0gY3VsbC5lbmFibGUsXG4gICAgICAgICAgICBfY3VsbCRmYWNlID0gY3VsbC5mYWNlLFxuICAgICAgICAgICAgZmFjZSA9IF9jdWxsJGZhY2UgPT09IHZvaWQgMCA/IGdsLkJBQ0sgOiBfY3VsbCRmYWNlO1xuICAgICAgICBkcmF3UGFyYW1zLmN1bGwgPSB7XG4gICAgICAgICAgZW5hYmxlOiAhIWVuYWJsZSxcbiAgICAgICAgICBmYWNlOiBjdWxsRmFjZU1hcFtmYWNlXVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZW5lcmF0ZURlZmluZXNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2VuZXJhdGVEZWZpbmVzKGRlZmluZXMpIHtcbiAgICAgIHJldHVybiBPYmplY3Qua2V5cyhkZWZpbmVzKS5tYXAoZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIFwiI2RlZmluZSBcIi5jb25jYXQobmFtZSwgXCIgXCIpLmNvbmNhdChOdW1iZXIoZGVmaW5lc1tuYW1lXSkpO1xuICAgICAgfSkuam9pbignXFxuJyk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFJlZ2xNb2RlbDtcbn0oKTtcblxuZXhwb3J0IHsgUmVnbE1vZGVsIGFzIGRlZmF1bHQgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJlZ2xNb2RlbC5qcy5tYXAiLCJpbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrXCI7XG5pbXBvcnQgX2NyZWF0ZUNsYXNzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzXCI7XG5pbXBvcnQgeyBnbCB9IGZyb20gJ0BhbnR2L2ctd2ViZ3B1LWNvcmUnO1xuaW1wb3J0IHsgY29sb3JTcGFjZU1hcCwgZGF0YVR5cGVNYXAsIGZpbHRlck1hcCwgZm9ybWF0TWFwLCBtaXBtYXBNYXAsIHdyYXBNb2RlTWFwIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuLyoqXG4gKiBhZGFwdG9yIGZvciByZWdsLkJ1ZmZlclxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vcmVnbC1wcm9qZWN0L3JlZ2wvYmxvYi9naC1wYWdlcy9BUEkubWQjYnVmZmVyc1xuICovXG5cbnZhciBSZWdsVGV4dHVyZTJEID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gUmVnbFRleHR1cmUyRChyZUdsLCBvcHRpb25zKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFJlZ2xUZXh0dXJlMkQpO1xuXG4gICAgdGhpcy50ZXh0dXJlID0gdm9pZCAwO1xuICAgIHRoaXMud2lkdGggPSB2b2lkIDA7XG4gICAgdGhpcy5oZWlnaHQgPSB2b2lkIDA7XG4gICAgdmFyIGRhdGEgPSBvcHRpb25zLmRhdGEsXG4gICAgICAgIF9vcHRpb25zJHR5cGUgPSBvcHRpb25zLnR5cGUsXG4gICAgICAgIHR5cGUgPSBfb3B0aW9ucyR0eXBlID09PSB2b2lkIDAgPyBnbC5VTlNJR05FRF9CWVRFIDogX29wdGlvbnMkdHlwZSxcbiAgICAgICAgd2lkdGggPSBvcHRpb25zLndpZHRoLFxuICAgICAgICBoZWlnaHQgPSBvcHRpb25zLmhlaWdodCxcbiAgICAgICAgX29wdGlvbnMkZmxpcFkgPSBvcHRpb25zLmZsaXBZLFxuICAgICAgICBmbGlwWSA9IF9vcHRpb25zJGZsaXBZID09PSB2b2lkIDAgPyBmYWxzZSA6IF9vcHRpb25zJGZsaXBZLFxuICAgICAgICBfb3B0aW9ucyRmb3JtYXQgPSBvcHRpb25zLmZvcm1hdCxcbiAgICAgICAgZm9ybWF0ID0gX29wdGlvbnMkZm9ybWF0ID09PSB2b2lkIDAgPyBnbC5SR0JBIDogX29wdGlvbnMkZm9ybWF0LFxuICAgICAgICBfb3B0aW9ucyRtaXBtYXAgPSBvcHRpb25zLm1pcG1hcCxcbiAgICAgICAgbWlwbWFwID0gX29wdGlvbnMkbWlwbWFwID09PSB2b2lkIDAgPyBmYWxzZSA6IF9vcHRpb25zJG1pcG1hcCxcbiAgICAgICAgX29wdGlvbnMkd3JhcFMgPSBvcHRpb25zLndyYXBTLFxuICAgICAgICB3cmFwUyA9IF9vcHRpb25zJHdyYXBTID09PSB2b2lkIDAgPyBnbC5DTEFNUF9UT19FREdFIDogX29wdGlvbnMkd3JhcFMsXG4gICAgICAgIF9vcHRpb25zJHdyYXBUID0gb3B0aW9ucy53cmFwVCxcbiAgICAgICAgd3JhcFQgPSBfb3B0aW9ucyR3cmFwVCA9PT0gdm9pZCAwID8gZ2wuQ0xBTVBfVE9fRURHRSA6IF9vcHRpb25zJHdyYXBULFxuICAgICAgICBfb3B0aW9ucyRhbmlzbyA9IG9wdGlvbnMuYW5pc28sXG4gICAgICAgIGFuaXNvID0gX29wdGlvbnMkYW5pc28gPT09IHZvaWQgMCA/IDAgOiBfb3B0aW9ucyRhbmlzbyxcbiAgICAgICAgX29wdGlvbnMkYWxpZ25tZW50ID0gb3B0aW9ucy5hbGlnbm1lbnQsXG4gICAgICAgIGFsaWdubWVudCA9IF9vcHRpb25zJGFsaWdubWVudCA9PT0gdm9pZCAwID8gMSA6IF9vcHRpb25zJGFsaWdubWVudCxcbiAgICAgICAgX29wdGlvbnMkcHJlbXVsdGlwbHlBID0gb3B0aW9ucy5wcmVtdWx0aXBseUFscGhhLFxuICAgICAgICBwcmVtdWx0aXBseUFscGhhID0gX29wdGlvbnMkcHJlbXVsdGlwbHlBID09PSB2b2lkIDAgPyBmYWxzZSA6IF9vcHRpb25zJHByZW11bHRpcGx5QSxcbiAgICAgICAgX29wdGlvbnMkbWFnID0gb3B0aW9ucy5tYWcsXG4gICAgICAgIG1hZyA9IF9vcHRpb25zJG1hZyA9PT0gdm9pZCAwID8gZ2wuTkVBUkVTVCA6IF9vcHRpb25zJG1hZyxcbiAgICAgICAgX29wdGlvbnMkbWluID0gb3B0aW9ucy5taW4sXG4gICAgICAgIG1pbiA9IF9vcHRpb25zJG1pbiA9PT0gdm9pZCAwID8gZ2wuTkVBUkVTVCA6IF9vcHRpb25zJG1pbixcbiAgICAgICAgX29wdGlvbnMkY29sb3JTcGFjZSA9IG9wdGlvbnMuY29sb3JTcGFjZSxcbiAgICAgICAgY29sb3JTcGFjZSA9IF9vcHRpb25zJGNvbG9yU3BhY2UgPT09IHZvaWQgMCA/IGdsLkJST1dTRVJfREVGQVVMVF9XRUJHTCA6IF9vcHRpb25zJGNvbG9yU3BhY2U7XG4gICAgdGhpcy53aWR0aCA9IHdpZHRoO1xuICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgIHZhciB0ZXh0dXJlT3B0aW9ucyA9IHtcbiAgICAgIHdpZHRoOiB3aWR0aCxcbiAgICAgIGhlaWdodDogaGVpZ2h0LFxuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgdHlwZTogZGF0YVR5cGVNYXBbdHlwZV0sXG4gICAgICBmb3JtYXQ6IGZvcm1hdE1hcFtmb3JtYXRdLFxuICAgICAgd3JhcFM6IHdyYXBNb2RlTWFwW3dyYXBTXSxcbiAgICAgIHdyYXBUOiB3cmFwTW9kZU1hcFt3cmFwVF0sXG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBtYWc6IGZpbHRlck1hcFttYWddLFxuICAgICAgbWluOiBmaWx0ZXJNYXBbbWluXSxcbiAgICAgIGFsaWdubWVudDogYWxpZ25tZW50LFxuICAgICAgZmxpcFk6IGZsaXBZLFxuICAgICAgY29sb3JTcGFjZTogY29sb3JTcGFjZU1hcFtjb2xvclNwYWNlXSxcbiAgICAgIHByZW11bHRpcGx5QWxwaGE6IHByZW11bHRpcGx5QWxwaGEsXG4gICAgICBhbmlzbzogYW5pc29cbiAgICB9O1xuXG4gICAgaWYgKGRhdGEpIHtcbiAgICAgIHRleHR1cmVPcHRpb25zLmRhdGEgPSBkYXRhO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgbWlwbWFwID09PSAnbnVtYmVyJykge1xuICAgICAgdGV4dHVyZU9wdGlvbnMubWlwbWFwID0gbWlwbWFwTWFwW21pcG1hcF07XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgbWlwbWFwID09PSAnYm9vbGVhbicpIHtcbiAgICAgIHRleHR1cmVPcHRpb25zLm1pcG1hcCA9IG1pcG1hcDtcbiAgICB9XG5cbiAgICB0aGlzLnRleHR1cmUgPSByZUdsLnRleHR1cmUodGV4dHVyZU9wdGlvbnMpO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKFJlZ2xUZXh0dXJlMkQsIFt7XG4gICAga2V5OiBcImdldFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy50ZXh0dXJlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ1cGRhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdXBkYXRlKCkge1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgdGhpcy50ZXh0dXJlLl90ZXh0dXJlLmJpbmQoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVzaXplXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlc2l6ZShfcmVmKSB7XG4gICAgICB2YXIgd2lkdGggPSBfcmVmLndpZHRoLFxuICAgICAgICAgIGhlaWdodCA9IF9yZWYuaGVpZ2h0O1xuICAgICAgdGhpcy50ZXh0dXJlLnJlc2l6ZSh3aWR0aCwgaGVpZ2h0KTtcbiAgICAgIHRoaXMud2lkdGggPSB3aWR0aDtcbiAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJkZXN0cm95XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG4gICAgICB0aGlzLnRleHR1cmUuZGVzdHJveSgpO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBSZWdsVGV4dHVyZTJEO1xufSgpO1xuXG5leHBvcnQgeyBSZWdsVGV4dHVyZTJEIGFzIGRlZmF1bHQgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJlZ2xUZXh0dXJlMkQuanMubWFwIiwiaW1wb3J0IF9yZWdlbmVyYXRvclJ1bnRpbWUgZnJvbSBcIkBiYWJlbC9ydW50aW1lL3JlZ2VuZXJhdG9yXCI7XG5pbXBvcnQgX2FzeW5jVG9HZW5lcmF0b3IgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXN5bmNUb0dlbmVyYXRvclwiO1xuaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzc1wiO1xuXG52YXIgX2RlYywgX2NsYXNzLCBfdGVtcDtcblxuLyoqXG4gKiByZW5kZXIgdy8gcmVnbFxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vcmVnbC1wcm9qZWN0L3JlZ2wvYmxvYi9naC1wYWdlcy9BUEkubWRcbiAqL1xuaW1wb3J0IHsgZ2wgfSBmcm9tICdAYW50di9nLXdlYmdwdS1jb3JlJztcbmltcG9ydCB7IGluamVjdGFibGUgfSBmcm9tICdpbnZlcnNpZnknO1xuaW1wb3J0IHJlZ2wgZnJvbSAncmVnbCc7XG5pbXBvcnQgUmVnbEF0dHJpYnV0ZSBmcm9tICcuL1JlZ2xBdHRyaWJ1dGUnO1xuaW1wb3J0IFJlZ2xCdWZmZXIgZnJvbSAnLi9SZWdsQnVmZmVyJztcbmltcG9ydCBSZWdsQ29tcHV0ZU1vZGVsIGZyb20gJy4vUmVnbENvbXB1dGVNb2RlbCc7XG5pbXBvcnQgUmVnbEVsZW1lbnRzIGZyb20gJy4vUmVnbEVsZW1lbnRzJztcbmltcG9ydCBSZWdsRnJhbWVidWZmZXIgZnJvbSAnLi9SZWdsRnJhbWVidWZmZXInO1xuaW1wb3J0IFJlZ2xNb2RlbCBmcm9tICcuL1JlZ2xNb2RlbCc7XG5pbXBvcnQgUmVnbFRleHR1cmUyRCBmcm9tICcuL1JlZ2xUZXh0dXJlMkQnO1xuLyoqXG4gKiByZWdsIHJlbmRlcmVyXG4gKi9cblxuZXhwb3J0IHZhciBXZWJHTEVuZ2luZSA9IChfZGVjID0gaW5qZWN0YWJsZSgpLCBfZGVjKF9jbGFzcyA9IChfdGVtcCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFdlYkdMRW5naW5lKCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgV2ViR0xFbmdpbmUpO1xuXG4gICAgdGhpcy5zdXBwb3J0V2ViR1BVID0gZmFsc2U7XG4gICAgdGhpcy51c2VXR1NMID0gZmFsc2U7XG4gICAgdGhpcy4kY2FudmFzID0gdm9pZCAwO1xuICAgIHRoaXMuZ2wgPSB2b2lkIDA7XG4gICAgdGhpcy5pbml0ZWQgPSB2b2lkIDA7XG5cbiAgICB0aGlzLmNyZWF0ZU1vZGVsID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfcmVmID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTIob3B0aW9ucykge1xuICAgICAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUyJChfY29udGV4dDIpIHtcbiAgICAgICAgICB3aGlsZSAoMSkge1xuICAgICAgICAgICAgc3dpdGNoIChfY29udGV4dDIucHJldiA9IF9jb250ZXh0Mi5uZXh0KSB7XG4gICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbnMudW5pZm9ybXMpIHtcbiAgICAgICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMztcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMztcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoT2JqZWN0LmtleXMob3B0aW9ucy51bmlmb3JtcykubWFwKCAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgdmFyIF9yZWYyID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoZnVuY3Rpb24gX2NhbGxlZShuYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0ZXh0dXJlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKG9wdGlvbnMudW5pZm9ybXNbbmFtZV0gJiYgb3B0aW9ucy51bmlmb3Jtc1tuYW1lXS5sb2FkICE9PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gNTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvcHRpb25zLnVuaWZvcm1zW25hbWVdLmxvYWQoKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dHVyZSA9IF9jb250ZXh0LnNlbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMudW5pZm9ybXNbbmFtZV0gPSB0ZXh0dXJlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9LCBfY2FsbGVlKTtcbiAgICAgICAgICAgICAgICAgIH0pKTtcblxuICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChfeDIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9yZWYyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH0oKSkpO1xuXG4gICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLmFicnVwdChcInJldHVyblwiLCBuZXcgUmVnbE1vZGVsKF90aGlzLmdsLCBvcHRpb25zKSk7XG5cbiAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5zdG9wKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LCBfY2FsbGVlMik7XG4gICAgICB9KSk7XG5cbiAgICAgIHJldHVybiBmdW5jdGlvbiAoX3gpIHtcbiAgICAgICAgcmV0dXJuIF9yZWYuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH07XG4gICAgfSgpO1xuXG4gICAgdGhpcy5jcmVhdGVBdHRyaWJ1dGUgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgcmV0dXJuIG5ldyBSZWdsQXR0cmlidXRlKF90aGlzLmdsLCBvcHRpb25zKTtcbiAgICB9O1xuXG4gICAgdGhpcy5jcmVhdGVCdWZmZXIgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgcmV0dXJuIG5ldyBSZWdsQnVmZmVyKF90aGlzLmdsLCBvcHRpb25zKTtcbiAgICB9O1xuXG4gICAgdGhpcy5jcmVhdGVFbGVtZW50cyA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICByZXR1cm4gbmV3IFJlZ2xFbGVtZW50cyhfdGhpcy5nbCwgb3B0aW9ucyk7XG4gICAgfTtcblxuICAgIHRoaXMuY3JlYXRlVGV4dHVyZTJEID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBuZXcgUmVnbFRleHR1cmUyRChfdGhpcy5nbCwgb3B0aW9ucyk7XG4gICAgfTtcblxuICAgIHRoaXMuY3JlYXRlRnJhbWVidWZmZXIgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgcmV0dXJuIG5ldyBSZWdsRnJhbWVidWZmZXIoX3RoaXMuZ2wsIG9wdGlvbnMpO1xuICAgIH07XG5cbiAgICB0aGlzLnVzZUZyYW1lYnVmZmVyID0gZnVuY3Rpb24gKGZyYW1lYnVmZmVyLCBkcmF3Q29tbWFuZHMpIHtcbiAgICAgIF90aGlzLmdsKHtcbiAgICAgICAgZnJhbWVidWZmZXI6IGZyYW1lYnVmZmVyID8gZnJhbWVidWZmZXIuZ2V0KCkgOiBudWxsXG4gICAgICB9KShkcmF3Q29tbWFuZHMpO1xuICAgIH07XG5cbiAgICB0aGlzLmNyZWF0ZUNvbXB1dGVNb2RlbCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX3JlZjMgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUubWFyayhmdW5jdGlvbiBfY2FsbGVlMyhjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoZnVuY3Rpb24gX2NhbGxlZTMkKF9jb250ZXh0Mykge1xuICAgICAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKF9jb250ZXh0My5wcmV2ID0gX2NvbnRleHQzLm5leHQpIHtcbiAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDMuYWJydXB0KFwicmV0dXJuXCIsIG5ldyBSZWdsQ29tcHV0ZU1vZGVsKF90aGlzLmdsLCBjb250ZXh0KSk7XG5cbiAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0My5zdG9wKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LCBfY2FsbGVlMyk7XG4gICAgICB9KSk7XG5cbiAgICAgIHJldHVybiBmdW5jdGlvbiAoX3gzKSB7XG4gICAgICAgIHJldHVybiBfcmVmMy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfTtcbiAgICB9KCk7XG5cbiAgICB0aGlzLmNsZWFyID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgIC8vIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3JlZ2wtcHJvamVjdC9yZWdsL2Jsb2IvZ2gtcGFnZXMvQVBJLm1kI2NsZWFyLXRoZS1kcmF3LWJ1ZmZlclxuICAgICAgdmFyIGNvbG9yID0gb3B0aW9ucy5jb2xvcixcbiAgICAgICAgICBkZXB0aCA9IG9wdGlvbnMuZGVwdGgsXG4gICAgICAgICAgc3RlbmNpbCA9IG9wdGlvbnMuc3RlbmNpbCxcbiAgICAgICAgICBfb3B0aW9ucyRmcmFtZWJ1ZmZlciA9IG9wdGlvbnMuZnJhbWVidWZmZXIsXG4gICAgICAgICAgZnJhbWVidWZmZXIgPSBfb3B0aW9ucyRmcmFtZWJ1ZmZlciA9PT0gdm9pZCAwID8gbnVsbCA6IF9vcHRpb25zJGZyYW1lYnVmZmVyO1xuICAgICAgdmFyIHJlZ2xDbGVhck9wdGlvbnMgPSB7XG4gICAgICAgIGNvbG9yOiBjb2xvcixcbiAgICAgICAgZGVwdGg6IGRlcHRoLFxuICAgICAgICBzdGVuY2lsOiBzdGVuY2lsXG4gICAgICB9O1xuICAgICAgcmVnbENsZWFyT3B0aW9ucy5mcmFtZWJ1ZmZlciA9IGZyYW1lYnVmZmVyID09PSBudWxsID8gZnJhbWVidWZmZXIgOiBmcmFtZWJ1ZmZlci5nZXQoKTtcblxuICAgICAgX3RoaXMuZ2wuY2xlYXIocmVnbENsZWFyT3B0aW9ucyk7XG4gICAgfTtcblxuICAgIHRoaXMuc2V0U2Npc3NvciA9IGZ1bmN0aW9uIChzY2lzc29yKSB7XG4gICAgICBpZiAoX3RoaXMuZ2wgJiYgX3RoaXMuZ2wuX2dsKSB7XG4gICAgICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL3poLUNOL2RvY3MvV2ViL0FQSS9XZWJHTFJlbmRlcmluZ0NvbnRleHQvc2Npc3NvclxuICAgICAgICBpZiAoc2Npc3Nvci5lbmFibGUgJiYgc2Npc3Nvci5ib3gpIHtcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZyhzY2lzc29yLmJveCk7XG4gICAgICAgICAgX3RoaXMuZ2wuX2dsLmVuYWJsZShnbC5TQ0lTU09SX1RFU1QpO1xuXG4gICAgICAgICAgX3RoaXMuZ2wuX2dsLnNjaXNzb3Ioc2Npc3Nvci5ib3gueCwgc2Npc3Nvci5ib3gueSwgc2Npc3Nvci5ib3gud2lkdGgsIHNjaXNzb3IuYm94LmhlaWdodCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgX3RoaXMuZ2wuX2dsLmRpc2FibGUoZ2wuU0NJU1NPUl9URVNUKTtcbiAgICAgICAgfVxuXG4gICAgICAgIF90aGlzLmdsLl9yZWZyZXNoKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMudmlld3BvcnQgPSBmdW5jdGlvbiAoX3JlZjQpIHtcbiAgICAgIHZhciB4ID0gX3JlZjQueCxcbiAgICAgICAgICB5ID0gX3JlZjQueSxcbiAgICAgICAgICB3aWR0aCA9IF9yZWY0LndpZHRoLFxuICAgICAgICAgIGhlaWdodCA9IF9yZWY0LmhlaWdodDtcblxuICAgICAgaWYgKF90aGlzLmdsICYmIF90aGlzLmdsLl9nbCkge1xuICAgICAgICAvLyB1c2UgV2ViR0wgY29udGV4dCBkaXJlY3RseVxuICAgICAgICAvLyBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9yZWdsLXByb2plY3QvcmVnbC9ibG9iL2doLXBhZ2VzL0FQSS5tZCN1bnNhZmUtZXNjYXBlLWhhdGNoXG4gICAgICAgIF90aGlzLmdsLl9nbC52aWV3cG9ydCh4LCB5LCB3aWR0aCwgaGVpZ2h0KTtcblxuICAgICAgICBfdGhpcy5nbC5fcmVmcmVzaCgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLnJlYWRQaXhlbHMgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgdmFyIGZyYW1lYnVmZmVyID0gb3B0aW9ucy5mcmFtZWJ1ZmZlcixcbiAgICAgICAgICB4ID0gb3B0aW9ucy54LFxuICAgICAgICAgIHkgPSBvcHRpb25zLnksXG4gICAgICAgICAgd2lkdGggPSBvcHRpb25zLndpZHRoLFxuICAgICAgICAgIGhlaWdodCA9IG9wdGlvbnMuaGVpZ2h0O1xuICAgICAgdmFyIHJlYWRQaXhlbHNPcHRpb25zID0ge1xuICAgICAgICB4OiB4LFxuICAgICAgICB5OiB5LFxuICAgICAgICB3aWR0aDogd2lkdGgsXG4gICAgICAgIGhlaWdodDogaGVpZ2h0XG4gICAgICB9O1xuXG4gICAgICBpZiAoZnJhbWVidWZmZXIpIHtcbiAgICAgICAgcmVhZFBpeGVsc09wdGlvbnMuZnJhbWVidWZmZXIgPSBmcmFtZWJ1ZmZlci5nZXQoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIF90aGlzLmdsLnJlYWQocmVhZFBpeGVsc09wdGlvbnMpO1xuICAgIH07XG5cbiAgICB0aGlzLmdldENhbnZhcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBfdGhpcy4kY2FudmFzO1xuICAgIH07XG5cbiAgICB0aGlzLmdldEdMQ29udGV4dCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBfdGhpcy5nbC5fZ2w7XG4gICAgfTtcblxuICAgIHRoaXMuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChfdGhpcy5nbCkge1xuICAgICAgICAvLyBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9yZWdsLXByb2plY3QvcmVnbC9ibG9iL2doLXBhZ2VzL0FQSS5tZCNjbGVhbi11cFxuICAgICAgICBfdGhpcy5nbC5kZXN0cm95KCk7XG5cbiAgICAgICAgX3RoaXMuaW5pdGVkID0gZmFsc2U7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhXZWJHTEVuZ2luZSwgW3tcbiAgICBrZXk6IFwiaW5pdFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX2luaXQgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUubWFyayhmdW5jdGlvbiBfY2FsbGVlNChjZmcpIHtcbiAgICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUud3JhcChmdW5jdGlvbiBfY2FsbGVlNCQoX2NvbnRleHQ0KSB7XG4gICAgICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQ0LnByZXYgPSBfY29udGV4dDQubmV4dCkge1xuICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmluaXRlZCkge1xuICAgICAgICAgICAgICAgICAgX2NvbnRleHQ0Lm5leHQgPSAyO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0NC5hYnJ1cHQoXCJyZXR1cm5cIik7XG5cbiAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgIHRoaXMuJGNhbnZhcyA9IGNmZy5jYW52YXM7IC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp0eXBlZGVmXG5cbiAgICAgICAgICAgICAgICBfY29udGV4dDQubmV4dCA9IDU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgICAgICAgIHJlZ2woe1xuICAgICAgICAgICAgICAgICAgICBjYW52YXM6IGNmZy5jYW52YXMsXG4gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICAgICAgICAgICAgICBhbHBoYTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAvLyB1c2UgVEFBIGluc3RlYWQgb2YgTVNBQVxuICAgICAgICAgICAgICAgICAgICAgIC8vIEBzZWUgaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvd2ViZ2wvc3BlY3MvMS4wLyM1LjIuMVxuICAgICAgICAgICAgICAgICAgICAgIGFudGlhbGlhczogY2ZnLmFudGlhbGlhcyxcbiAgICAgICAgICAgICAgICAgICAgICBwcmVtdWx0aXBsaWVkQWxwaGE6IHRydWUgLy8gcHJlc2VydmVEcmF3aW5nQnVmZmVyOiBmYWxzZSxcblxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBwaXhlbFJhdGlvOiAxLFxuICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiB1c2UgZXh0ZW5zaW9uc1xuICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25zOiBbJ09FU19lbGVtZW50X2luZGV4X3VpbnQnLCAnT0VTX3RleHR1cmVfZmxvYXQnLCAnT0VTX3N0YW5kYXJkX2Rlcml2YXRpdmVzJywgLy8gd2lyZWZyYW1lXG4gICAgICAgICAgICAgICAgICAgICdhbmdsZV9pbnN0YW5jZWRfYXJyYXlzJyAvLyBWU00gc2hhZG93IG1hcFxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBvcHRpb25hbEV4dGVuc2lvbnM6IFsnRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljJywgJ0VYVF9ibGVuZF9taW5tYXgnLCAnV0VCR0xfZGVwdGhfdGV4dHVyZSddLFxuICAgICAgICAgICAgICAgICAgICBwcm9maWxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBvbkRvbmU6IGZ1bmN0aW9uIG9uRG9uZShlcnIsIHIpIHtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyIHx8ICFyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgICB9IC8vIEB0cy1pZ25vcmVcblxuXG4gICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgIHRoaXMuZ2wgPSBfY29udGV4dDQuc2VudDtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRlZCA9IHRydWU7XG5cbiAgICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0NC5zdG9wKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LCBfY2FsbGVlNCwgdGhpcyk7XG4gICAgICB9KSk7XG5cbiAgICAgIGZ1bmN0aW9uIGluaXQoX3g0KSB7XG4gICAgICAgIHJldHVybiBfaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gaW5pdDtcbiAgICB9KClcbiAgfSwge1xuICAgIGtleTogXCJpc0Zsb2F0U3VwcG9ydGVkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGlzRmxvYXRTdXBwb3J0ZWQoKSB7XG4gICAgICAvLyBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnR2aXMvR1dlYkdQVUVuZ2luZS9pc3N1ZXMvMjZcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIHJldHVybiB0aGlzLmdsLmxpbWl0cy5yZWFkRmxvYXQ7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImJlZ2luRnJhbWVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYmVnaW5GcmFtZSgpIHsvL1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJlbmRGcmFtZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBlbmRGcmFtZSgpIHsvL1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBXZWJHTEVuZ2luZTtcbn0oKSwgX3RlbXApKSB8fCBfY2xhc3MpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiZXhwb3J0IGZ1bmN0aW9uIGlzV2luZG93T2JqZWN0RXhpc3QoKSB7XG4gIHJldHVybiB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJztcbn1cbmV4cG9ydCBmdW5jdGlvbiBsb2FkU2NyaXB0KHNjcmlwdFVybCwgb25TdWNjZXNzLCBvbkVycm9yLCBzY3JpcHRJZCkge1xuICBpZiAoIWlzV2luZG93T2JqZWN0RXhpc3QoKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBoZWFkID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXTtcbiAgdmFyIHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuICBzY3JpcHQuc2V0QXR0cmlidXRlKCd0eXBlJywgJ3RleHQvamF2YXNjcmlwdCcpO1xuICBzY3JpcHQuc2V0QXR0cmlidXRlKCdzcmMnLCBzY3JpcHRVcmwpO1xuXG4gIGlmIChzY3JpcHRJZCkge1xuICAgIHNjcmlwdC5pZCA9IHNjcmlwdElkO1xuICB9XG5cbiAgc2NyaXB0Lm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAob25TdWNjZXNzKSB7XG4gICAgICBvblN1Y2Nlc3MoKTtcbiAgICB9XG4gIH07XG5cbiAgc2NyaXB0Lm9uZXJyb3IgPSBmdW5jdGlvbiAoZSkge1xuICAgIGlmIChvbkVycm9yKSB7XG4gICAgICBvbkVycm9yKFwiVW5hYmxlIHRvIGxvYWQgc2NyaXB0ICdcIi5jb25jYXQoc2NyaXB0VXJsLCBcIidcIiksIGUpO1xuICAgIH1cbiAgfTtcblxuICBoZWFkLmFwcGVuZENoaWxkKHNjcmlwdCk7XG59XG5leHBvcnQgZnVuY3Rpb24gbG9hZFNjcmlwdEFzeW5jKHNjcmlwdFVybCwgc2NyaXB0SWQpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICBsb2FkU2NyaXB0KHNjcmlwdFVybCwgZnVuY3Rpb24gKCkge1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH0sIGZ1bmN0aW9uIChtZXNzYWdlLCBleGNlcHRpb24pIHtcbiAgICAgIHJlamVjdChleGNlcHRpb24pO1xuICAgIH0pO1xuICB9KTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRvbS5qcy5tYXAiLCJpbXBvcnQgX3JlZ2VuZXJhdG9yUnVudGltZSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvcmVnZW5lcmF0b3JcIjtcbmltcG9ydCBfYXN5bmNUb0dlbmVyYXRvciBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hc3luY1RvR2VuZXJhdG9yXCI7XG5pbXBvcnQgeyBsb2FkU2NyaXB0QXN5bmMgfSBmcm9tICcuLi91dGlscy9kb20nO1xudmFyIGdsc2xhbmc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBfcmVmLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmZ1bmN0aW9uIF9yZWYoKSB7XG4gIF9yZWYgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUubWFyayhmdW5jdGlvbiBfY2FsbGVlKCkge1xuICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoZnVuY3Rpb24gX2NhbGxlZSQoX2NvbnRleHQpIHtcbiAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICBpZiAoIWdsc2xhbmcpIHtcbiAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDI7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KFwicmV0dXJuXCIsIGdsc2xhbmcpO1xuXG4gICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDQ7XG4gICAgICAgICAgICByZXR1cm4gbG9hZFNjcmlwdEFzeW5jKCdodHRwczovL3ByZXZpZXcuYmFieWxvbmpzLmNvbS9nbHNsYW5nL2dsc2xhbmcuanMnKTtcblxuICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgIGdsc2xhbmcgPSB3aW5kb3cuZ2xzbGFuZygnaHR0cHM6Ly9wcmV2aWV3LmJhYnlsb25qcy5jb20vZ2xzbGFuZy9nbHNsYW5nLndhc20nKTtcbiAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5hYnJ1cHQoXCJyZXR1cm5cIiwgZ2xzbGFuZyk7XG5cbiAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LnN0b3AoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIF9jYWxsZWUpO1xuICB9KSk7XG4gIHJldHVybiBfcmVmLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1nbHNsYW5nLmpzLm1hcCIsImltcG9ydCBfY2xhc3NDYWxsQ2hlY2sgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2tcIjtcbmltcG9ydCBfY3JlYXRlQ2xhc3MgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlQ2xhc3NcIjtcblxudmFyIFdlYkdQVUF0dHJpYnV0ZSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFdlYkdQVUF0dHJpYnV0ZShlbmdpbmUsIG9wdGlvbnMpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgV2ViR1BVQXR0cmlidXRlKTtcblxuICAgIHRoaXMuZW5naW5lID0gZW5naW5lO1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgdGhpcy5hdHRyaWJ1dGUgPSB2b2lkIDA7XG4gICAgdGhpcy5idWZmZXIgPSB2b2lkIDA7XG4gICAgdmFyIF9vcHRpb25zID0gb3B0aW9ucyxcbiAgICAgICAgYnVmZmVyID0gX29wdGlvbnMuYnVmZmVyLFxuICAgICAgICBvZmZzZXQgPSBfb3B0aW9ucy5vZmZzZXQsXG4gICAgICAgIHN0cmlkZSA9IF9vcHRpb25zLnN0cmlkZSxcbiAgICAgICAgbm9ybWFsaXplZCA9IF9vcHRpb25zLm5vcm1hbGl6ZWQsXG4gICAgICAgIHNpemUgPSBfb3B0aW9ucy5zaXplLFxuICAgICAgICBkaXZpc29yID0gX29wdGlvbnMuZGl2aXNvcixcbiAgICAgICAgYXJyYXlTdHJpZGUgPSBfb3B0aW9ucy5hcnJheVN0cmlkZSxcbiAgICAgICAgYXR0cmlidXRlcyA9IF9vcHRpb25zLmF0dHJpYnV0ZXMsXG4gICAgICAgIHN0ZXBNb2RlID0gX29wdGlvbnMuc3RlcE1vZGU7XG4gICAgdGhpcy5idWZmZXIgPSBidWZmZXI7XG4gICAgdGhpcy5hdHRyaWJ1dGUgPSB7XG4gICAgICBidWZmZXI6IGJ1ZmZlci5nZXQoKSxcbiAgICAgIG9mZnNldDogb2Zmc2V0IHx8IDAsXG4gICAgICBzdHJpZGU6IHN0cmlkZSB8fCAwLFxuICAgICAgbm9ybWFsaXplZDogbm9ybWFsaXplZCB8fCBmYWxzZSxcbiAgICAgIGRpdmlzb3I6IGRpdmlzb3IgfHwgMCxcbiAgICAgIGFycmF5U3RyaWRlOiBhcnJheVN0cmlkZSB8fCAwLFxuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgYXR0cmlidXRlczogYXR0cmlidXRlcyxcbiAgICAgIHN0ZXBNb2RlOiBzdGVwTW9kZSB8fCAndmVydGV4J1xuICAgIH07XG5cbiAgICBpZiAoc2l6ZSkge1xuICAgICAgdGhpcy5hdHRyaWJ1dGUuc2l6ZSA9IHNpemU7XG4gICAgfVxuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKFdlYkdQVUF0dHJpYnV0ZSwgW3tcbiAgICBrZXk6IFwiZ2V0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmF0dHJpYnV0ZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidXBkYXRlQnVmZmVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHVwZGF0ZUJ1ZmZlcihvcHRpb25zKSB7XG4gICAgICB0aGlzLmJ1ZmZlci5zdWJEYXRhKG9wdGlvbnMpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJkZXN0cm95XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG4gICAgICB0aGlzLmJ1ZmZlci5kZXN0cm95KCk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFdlYkdQVUF0dHJpYnV0ZTtcbn0oKTtcblxuZXhwb3J0IHsgV2ViR1BVQXR0cmlidXRlIGFzIGRlZmF1bHQgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVdlYkdQVUF0dHJpYnV0ZS5qcy5tYXAiLCJpbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrXCI7XG5pbXBvcnQgX2NyZWF0ZUNsYXNzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzXCI7XG5pbXBvcnQgeyBpc1NhZmFyaSB9IGZyb20gJ0BhbnR2L2ctd2ViZ3B1LWNvcmUnO1xuaW1wb3J0ICogYXMgV2ViR1BVQ29uc3RhbnRzIGZyb20gJ0B3ZWJncHUvdHlwZXMvZGlzdC9jb25zdGFudHMnO1xuXG52YXIgV2ViR1BVQnVmZmVyID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gV2ViR1BVQnVmZmVyKGVuZ2luZSwgb3B0aW9ucykge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBXZWJHUFVCdWZmZXIpO1xuXG4gICAgdGhpcy5lbmdpbmUgPSBlbmdpbmU7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB0aGlzLmJ1ZmZlciA9IHZvaWQgMDtcbiAgICB2YXIgX29wdGlvbnMgPSBvcHRpb25zLFxuICAgICAgICBkYXRhID0gX29wdGlvbnMuZGF0YSxcbiAgICAgICAgdXNhZ2UgPSBfb3B0aW9ucy51c2FnZSxcbiAgICAgICAgdHlwZSA9IF9vcHRpb25zLnR5cGU7XG4gICAgdGhpcy5idWZmZXIgPSB0aGlzLmNyZWF0ZUJ1ZmZlcihkYXRhIGluc3RhbmNlb2YgQXJyYXkgPyBuZXcgRmxvYXQzMkFycmF5KGRhdGEpIDogZGF0YSwgLy8gVE9ETzogV2ViR0wg5ZKMIFdlYkdQVSBidWZmZXIgdXNhZ2Ug5pig5bCE5YWz57O7XG4gICAgdXNhZ2UgfHwgV2ViR1BVQ29uc3RhbnRzLkJ1ZmZlclVzYWdlLlZlcnRleCB8IFdlYkdQVUNvbnN0YW50cy5CdWZmZXJVc2FnZS5Db3B5RHN0KTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhXZWJHUFVCdWZmZXIsIFt7XG4gICAga2V5OiBcImdldFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5idWZmZXI7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImRlc3Ryb3lcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICAgIHRoaXMuYnVmZmVyLmRlc3Ryb3koKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic3ViRGF0YVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzdWJEYXRhKF9yZWYpIHtcbiAgICAgIHZhciBkYXRhID0gX3JlZi5kYXRhLFxuICAgICAgICAgIG9mZnNldCA9IF9yZWYub2Zmc2V0O1xuICAgICAgdGhpcy5zZXRTdWJEYXRhKHRoaXMuYnVmZmVyLCBvZmZzZXQsIGRhdGEgaW5zdGFuY2VvZiBBcnJheSA/IG5ldyBGbG9hdDMyQXJyYXkoZGF0YSkgOiBkYXRhKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY3JlYXRlQnVmZmVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNyZWF0ZUJ1ZmZlcih2aWV3LCBmbGFncykge1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgdmFyIHBhZGRpbmcgPSB2aWV3LmJ5dGVMZW5ndGggJSA0O1xuICAgICAgdmFyIHZlcnRpY2VzQnVmZmVyRGVzY3JpcHRvciA9IHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBzaXplOiB2aWV3LmJ5dGVMZW5ndGggKyBwYWRkaW5nLFxuICAgICAgICB1c2FnZTogZmxhZ3NcbiAgICAgIH07XG4gICAgICB2YXIgYnVmZmVyID0gdGhpcy5lbmdpbmUuZGV2aWNlLmNyZWF0ZUJ1ZmZlcih2ZXJ0aWNlc0J1ZmZlckRlc2NyaXB0b3IpO1xuICAgICAgdGhpcy5zZXRTdWJEYXRhKGJ1ZmZlciwgMCwgdmlldyk7XG4gICAgICByZXR1cm4gYnVmZmVyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiDkuI3lkIzkuo4gQmFieWxvbi5qcyDnmoTniYjmnKzvvIzkvb/nlKjmnIDmlrDnmoQgR1BVUXVldWUud3JpdGVCdWZmZXIg5pa55rOVXG4gICAgICogQHNlZSBodHRwczovL2dwdXdlYi5naXRodWIuaW8vZ3B1d2ViLyNkb20tZ3B1cXVldWUtd3JpdGVidWZmZXJcbiAgICAgKiDlt7Llup/lvIPliJvlu7rkuIDkuKrkuLTml7bnmoQgbWFwcGVkIGJ1ZmZlciDnlKjkuo7mi7fotJ3mlbDmja4gQHNlZSBodHRwczovL2dwdXdlYi5naXRodWIuaW8vZ3B1d2ViLyNHUFVEZXZpY2UtY3JlYXRlQnVmZmVyTWFwcGVkXG4gICAgICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vZ3B1d2ViL2dwdXdlYi9ibG9iL21hc3Rlci9kZXNpZ24vQnVmZmVyT3BlcmF0aW9ucy5tZCN1cGRhdGluZy1kYXRhLXRvLWFuLWV4aXN0aW5nLWJ1ZmZlci1saWtlLXdlYmdscy1idWZmZXJzdWJkYXRhXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJzZXRTdWJEYXRhXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldFN1YkRhdGEoZGVzdEJ1ZmZlciwgZGVzdE9mZnNldCwgc3JjQXJyYXlCdWZmZXIpIHtcbiAgICAgIC8vIGRlcHJlY2F0ZWQgQVBJIHNldFN1YkRhdGFcbiAgICAgIC8vIGRlc3RCdWZmZXIuc2V0U3ViRGF0YSgwLCBzcmNBcnJheUJ1ZmZlcik7XG4gICAgICAvLyBkZXByZWNhdGVkIEFQSSBjcmVhdGVCdWZmZXJNYXBwZWRcbiAgICAgIC8vIHVzZSBjcmVhdGVCdWZmZXIgJiBnZXRNYXBwZWRSYW5nZSBpbnN0ZWFkXG4gICAgICAvLyBjb25zdCBbc3JjQnVmZmVyLCBhcnJheUJ1ZmZlcl0gPSB0aGlzLmVuZ2luZS5kZXZpY2UuY3JlYXRlQnVmZmVyTWFwcGVkKHtcbiAgICAgIC8vICAgc2l6ZTogYnl0ZUNvdW50LFxuICAgICAgLy8gICB1c2FnZTogV2ViR1BVQ29uc3RhbnRzLkJ1ZmZlclVzYWdlLkNvcHlTcmMsXG4gICAgICAvLyB9KTtcbiAgICAgIHZhciBxdWV1ZSA9IGlzU2FmYXJpID8gLy8gQHRzLWlnbm9yZVxuICAgICAgdGhpcy5lbmdpbmUuZGV2aWNlLmdldFF1ZXVlKCkgOiB0aGlzLmVuZ2luZS5kZXZpY2UuZGVmYXVsdFF1ZXVlOyAvLyBAdHMtaWdub3JlXG5cbiAgICAgIHF1ZXVlLndyaXRlQnVmZmVyKGRlc3RCdWZmZXIsIGRlc3RPZmZzZXQsIHNyY0FycmF5QnVmZmVyKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gV2ViR1BVQnVmZmVyO1xufSgpO1xuXG5leHBvcnQgeyBXZWJHUFVCdWZmZXIgYXMgZGVmYXVsdCB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9V2ViR1BVQnVmZmVyLmpzLm1hcCIsImV4cG9ydCBmdW5jdGlvbiBpc051bWJlcih2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJztcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWlzLW51bWJlci5qcy5tYXAiLCJpbXBvcnQgX3JlZ2VuZXJhdG9yUnVudGltZSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvcmVnZW5lcmF0b3JcIjtcbmltcG9ydCBfdG9Db25zdW1hYmxlQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvdG9Db25zdW1hYmxlQXJyYXlcIjtcbmltcG9ydCBfYXN5bmNUb0dlbmVyYXRvciBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hc3luY1RvR2VuZXJhdG9yXCI7XG5pbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrXCI7XG5pbXBvcnQgX2NyZWF0ZUNsYXNzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzXCI7XG5pbXBvcnQgeyBBU1RfVE9LRU5fVFlQRVMsIGNyZWF0ZUVudGl0eSwgaXNTYWZhcmksIFNUT1JBR0VfQ0xBU1MgfSBmcm9tICdAYW50di9nLXdlYmdwdS1jb3JlJztcbmltcG9ydCAqIGFzIFdlYkdQVUNvbnN0YW50cyBmcm9tICdAd2ViZ3B1L3R5cGVzL2Rpc3QvY29uc3RhbnRzJztcbmltcG9ydCB7IGlzTnVtYmVyIH0gZnJvbSAnLi4vdXRpbHMvaXMtbnVtYmVyJztcbmltcG9ydCBXZWJHUFVCdWZmZXIgZnJvbSAnLi9XZWJHUFVCdWZmZXInO1xuXG52YXIgV2ViR1BVQ29tcHV0ZU1vZGVsID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgLyoqXG4gICAqIOeUqOS6juWQjue7rea4suafk+aXtuWKqOaAgeabtOaWsFxuICAgKi9cbiAgZnVuY3Rpb24gV2ViR1BVQ29tcHV0ZU1vZGVsKGVuZ2luZSwgY29udGV4dCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBXZWJHUFVDb21wdXRlTW9kZWwpO1xuXG4gICAgdGhpcy5lbmdpbmUgPSBlbmdpbmU7XG4gICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgICB0aGlzLmVudGl0eSA9IGNyZWF0ZUVudGl0eSgpO1xuICAgIHRoaXMudW5pZm9ybUdQVUJ1ZmZlckxheW91dCA9IFtdO1xuICAgIHRoaXMudW5pZm9ybUJ1ZmZlciA9IHZvaWQgMDtcbiAgICB0aGlzLnZlcnRleEJ1ZmZlcnMgPSB7fTtcbiAgICB0aGlzLm91dHB1dEJ1ZmZlciA9IHZvaWQgMDtcbiAgICB0aGlzLmJpbmRHcm91cEVudHJpZXMgPSB2b2lkIDA7XG4gICAgdGhpcy5iaW5kR3JvdXAgPSB2b2lkIDA7XG4gICAgdGhpcy5jb21wdXRlUGlwZWxpbmUgPSB2b2lkIDA7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoV2ViR1BVQ29tcHV0ZU1vZGVsLCBbe1xuICAgIGtleTogXCJpbml0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfaW5pdCA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgICAgdmFyIF95aWVsZCR0aGlzJGNvbXBpbGVDbywgY29tcHV0ZVN0YWdlLCBidWZmZXJzLCB1bmlmb3JtcywgYnVmZmVyQmluZGluZ0luZGV4LCBvZmZzZXQsIG1lcmdlZFVuaWZvcm1EYXRhO1xuXG4gICAgICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoZnVuY3Rpb24gX2NhbGxlZSQoX2NvbnRleHQpIHtcbiAgICAgICAgICB3aGlsZSAoMSkge1xuICAgICAgICAgICAgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkge1xuICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDI7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29tcGlsZUNvbXB1dGVQaXBlbGluZVN0YWdlRGVzY3JpcHRvcih0aGlzLmNvbnRleHQuc2hhZGVyKTtcblxuICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgX3lpZWxkJHRoaXMkY29tcGlsZUNvID0gX2NvbnRleHQuc2VudDtcbiAgICAgICAgICAgICAgICBjb21wdXRlU3RhZ2UgPSBfeWllbGQkdGhpcyRjb21waWxlQ28uY29tcHV0ZVN0YWdlO1xuICAgICAgICAgICAgICAgIGJ1ZmZlcnMgPSB0aGlzLmNvbnRleHQudW5pZm9ybXMuZmlsdGVyKGZ1bmN0aW9uICh1bmlmb3JtKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gdW5pZm9ybS5zdG9yYWdlQ2xhc3MgPT09IFNUT1JBR0VfQ0xBU1MuU3RvcmFnZUJ1ZmZlcjtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB1bmlmb3JtcyA9IHRoaXMuY29udGV4dC51bmlmb3Jtcy5maWx0ZXIoZnVuY3Rpb24gKHVuaWZvcm0pIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiB1bmlmb3JtLnN0b3JhZ2VDbGFzcyA9PT0gU1RPUkFHRV9DTEFTUy5Vbmlmb3JtO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGJ1ZmZlckJpbmRpbmdJbmRleCA9IHVuaWZvcm1zLmxlbmd0aCA/IDEgOiAwO1xuICAgICAgICAgICAgICAgIHRoaXMuYmluZEdyb3VwRW50cmllcyA9IFtdO1xuXG4gICAgICAgICAgICAgICAgaWYgKGJ1ZmZlckJpbmRpbmdJbmRleCkge1xuICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gMDsgLy8gRklYTUU6IOaJgOaciSB1bmlmb3JtIOWQiOW5tuaIkOS4gOS4qiBidWZmZXLvvIzlm7rlrprkvb/nlKggRmxvYXQzMkFycmF5IOWtmOWCqO+8jOehruWunuS8mumAoOaIkOS4gOS6m+WGheWtmOeahOa1qui0uVxuICAgICAgICAgICAgICAgICAgLy8gd2UgdXNlIHN0ZDE0MCBsYXlvdXQgQHNlZSBodHRwczovL3d3dy5raHJvbm9zLm9yZy9vcGVuZ2wvd2lraS9JbnRlcmZhY2VfQmxvY2tfKEdMU0wpXG5cbiAgICAgICAgICAgICAgICAgIG1lcmdlZFVuaWZvcm1EYXRhID0gW107XG4gICAgICAgICAgICAgICAgICB1bmlmb3Jtcy5mb3JFYWNoKGZ1bmN0aW9uICh1bmlmb3JtKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc051bWJlcih1bmlmb3JtLmRhdGEpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgX3RoaXMudW5pZm9ybUdQVUJ1ZmZlckxheW91dC5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHVuaWZvcm0ubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldDogb2Zmc2V0XG4gICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gNDsgLy8gQHRzLWlnbm9yZVxuXG4gICAgICAgICAgICAgICAgICAgICAgbWVyZ2VkVW5pZm9ybURhdGEucHVzaCh1bmlmb3JtLmRhdGEpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIHZhciBfdW5pZm9ybSRkYXRhO1xuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgIHZhciBvcmlnaW5EYXRhTGVuZ3RoID0gKChfdW5pZm9ybSRkYXRhID0gdW5pZm9ybS5kYXRhKSA9PT0gbnVsbCB8fCBfdW5pZm9ybSRkYXRhID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdW5pZm9ybSRkYXRhLmxlbmd0aCkgfHwgMTtcblxuICAgICAgICAgICAgICAgICAgICAgIGlmIChvcmlnaW5EYXRhTGVuZ3RoID09PSAzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB2ZWMzIC0+IHZlYzRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEBzZWUgaHR0cDovL3B0Z21lZGlhLnBlYXJzb25jbWcuY29tL2ltYWdlcy85NzgwMzIxNTUyNjI0L2Rvd25sb2Fkcy8wMzIxNTUyNjI4X0FwcEwucGRmXG4gICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5EYXRhTGVuZ3RoID0gNDsgLy8gQHRzLWlnbm9yZVxuXG4gICAgICAgICAgICAgICAgICAgICAgICB1bmlmb3JtLmRhdGEucHVzaCgwKTtcbiAgICAgICAgICAgICAgICAgICAgICB9IC8vIDQgZWxlbWVudHMgcGVyIGJsb2NrL2xpbmVcblxuXG4gICAgICAgICAgICAgICAgICAgICAgdmFyIHBhZGRpbmcgPSBvZmZzZXQgLyA0ICUgNDtcblxuICAgICAgICAgICAgICAgICAgICAgIGlmIChwYWRkaW5nID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNwYWNlID0gNCAtIHBhZGRpbmc7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcmlnaW5EYXRhTGVuZ3RoID4gMSAmJiBvcmlnaW5EYXRhTGVuZ3RoIDw9IHNwYWNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcmlnaW5EYXRhTGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNwYWNlID09PSAzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gNDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lcmdlZFVuaWZvcm1EYXRhLnB1c2goMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAvLyBAdHMtaWdub3JlXG5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lcmdlZFVuaWZvcm1EYXRhLnB1c2guYXBwbHkobWVyZ2VkVW5pZm9ybURhdGEsIF90b0NvbnN1bWFibGVBcnJheSh1bmlmb3JtLmRhdGEpKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLnVuaWZvcm1HUFVCdWZmZXJMYXlvdXQucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiB1bmlmb3JtLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQ6IG9mZnNldFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNwYWNlOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gNDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXJnZWRVbmlmb3JtRGF0YS5wdXNoKDApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9IC8vIEB0cy1pZ25vcmVcblxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG1lcmdlZFVuaWZvcm1EYXRhLnB1c2guYXBwbHkobWVyZ2VkVW5pZm9ybURhdGEsIF90b0NvbnN1bWFibGVBcnJheSh1bmlmb3JtLmRhdGEpKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy51bmlmb3JtR1BVQnVmZmVyTGF5b3V0LnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHVuaWZvcm0ubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQ6IG9mZnNldFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gNCAqIG9yaWdpbkRhdGFMZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgdGhpcy51bmlmb3JtQnVmZmVyID0gbmV3IFdlYkdQVUJ1ZmZlcih0aGlzLmVuZ2luZSwge1xuICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiDlpITnkIYgU3RydWN0IOWSjCBib29sZWFuXG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogbWVyZ2VkVW5pZm9ybURhdGEgaW5zdGFuY2VvZiBBcnJheSA/IC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgbmV3IEZsb2F0MzJBcnJheShtZXJnZWRVbmlmb3JtRGF0YSkgOiBtZXJnZWRVbmlmb3JtRGF0YSxcbiAgICAgICAgICAgICAgICAgICAgdXNhZ2U6IFdlYkdQVUNvbnN0YW50cy5CdWZmZXJVc2FnZS5Vbmlmb3JtIHwgV2ViR1BVQ29uc3RhbnRzLkJ1ZmZlclVzYWdlLkNvcHlEc3RcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgdGhpcy5iaW5kR3JvdXBFbnRyaWVzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBiaW5kaW5nOiAwLFxuICAgICAgICAgICAgICAgICAgICByZXNvdXJjZToge1xuICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcjogdGhpcy51bmlmb3JtQnVmZmVyLmdldCgpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0gLy8gY3JlYXRlIEdQVUJ1ZmZlcnMgZm9yIHN0b3JlYWdlIGJ1ZmZlcnNcblxuXG4gICAgICAgICAgICAgICAgYnVmZmVycy5mb3JFYWNoKGZ1bmN0aW9uIChidWZmZXIpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChidWZmZXIuZGF0YSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoYnVmZmVyLnR5cGUgPT09IEFTVF9UT0tFTl9UWVBFUy5WZWN0b3I0RmxvYXRBcnJheSB8fCBidWZmZXIudHlwZSA9PT0gQVNUX1RPS0VOX1RZUEVTLkZsb2F0QXJyYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICB2YXIgZ3B1QnVmZmVyO1xuXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlci5uYW1lID09PSBfdGhpcy5jb250ZXh0Lm91dHB1dC5uYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBncHVCdWZmZXIgPSBuZXcgV2ViR1BVQnVmZmVyKF90aGlzLmVuZ2luZSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IGlzRmluaXRlKE51bWJlcihidWZmZXIuZGF0YSkpID8gW2J1ZmZlci5kYXRhXSA6IGJ1ZmZlci5kYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB1c2FnZTogV2ViR1BVQ29uc3RhbnRzLkJ1ZmZlclVzYWdlLlN0b3JhZ2UgfCBXZWJHUFVDb25zdGFudHMuQnVmZmVyVXNhZ2UuQ29weURzdCB8IFdlYkdQVUNvbnN0YW50cy5CdWZmZXJVc2FnZS5Db3B5U3JjXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLm91dHB1dEJ1ZmZlciA9IGdwdUJ1ZmZlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLmNvbnRleHQub3V0cHV0ID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBidWZmZXIubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGg6IGlzRmluaXRlKE51bWJlcihidWZmZXIuZGF0YSkpID8gMSA6IGJ1ZmZlci5kYXRhLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZWRBcnJheUNvbnN0cnVjdG9yOiBGbG9hdDMyQXJyYXksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGdwdUJ1ZmZlcjogZ3B1QnVmZmVyLmdldCgpXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnVmZmVyLmlzUmVmZXJlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChidWZmZXIuZGF0YS5tb2RlbCAmJiBidWZmZXIuZGF0YS5tb2RlbC5vdXRwdXRCdWZmZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3B1QnVmZmVyID0gYnVmZmVyLmRhdGEubW9kZWwub3V0cHV0QnVmZmVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugey8vIHJlZmVycmVkIGtlcm5lbCBoYXZlbid0IGJlZW4gZXhlY3V0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZ3B1QnVmZmVyID0gbmV3IFdlYkdQVUJ1ZmZlcihfdGhpcy5lbmdpbmUsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogaXNGaW5pdGUoTnVtYmVyKGJ1ZmZlci5kYXRhKSkgPyBbYnVmZmVyLmRhdGFdIDogYnVmZmVyLmRhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNhZ2U6IFdlYkdQVUNvbnN0YW50cy5CdWZmZXJVc2FnZS5TdG9yYWdlIHwgV2ViR1BVQ29uc3RhbnRzLkJ1ZmZlclVzYWdlLkNvcHlEc3QgfCBXZWJHUFVDb25zdGFudHMuQnVmZmVyVXNhZ2UuQ29weVNyY1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9IC8vIEB0cy1pZ25vcmVcblxuXG4gICAgICAgICAgICAgICAgICAgICAgX3RoaXMudmVydGV4QnVmZmVyc1tidWZmZXIubmFtZV0gPSBncHVCdWZmZXI7XG5cbiAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5iaW5kR3JvdXBFbnRyaWVzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgYmluZGluZzogYnVmZmVyQmluZGluZ0luZGV4LFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2U6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogYnVmZmVyLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyOiBncHVCdWZmZXIgPyB1bmRlZmluZWQgOiBidWZmZXIuZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXI6IGdwdUJ1ZmZlciA/IGdwdUJ1ZmZlci5nZXQoKSA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgYnVmZmVyQmluZGluZ0luZGV4Kys7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTsgLy8gY3JlYXRlIGNvbXB1dGUgcGlwZWxpbmUgbGF5b3V0XG5cbiAgICAgICAgICAgICAgICB0aGlzLmNvbXB1dGVQaXBlbGluZSA9IHRoaXMuZW5naW5lLmRldmljZS5jcmVhdGVDb21wdXRlUGlwZWxpbmUoe1xuICAgICAgICAgICAgICAgICAgY29tcHV0ZVN0YWdlOiBjb21wdXRlU3RhZ2VcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyh0aGlzLmJpbmRHcm91cEVudHJpZXMpO1xuICAgICAgICAgICAgICAgIHRoaXMuYmluZEdyb3VwID0gdGhpcy5lbmdpbmUuZGV2aWNlLmNyZWF0ZUJpbmRHcm91cCh7XG4gICAgICAgICAgICAgICAgICBsYXlvdXQ6IHRoaXMuY29tcHV0ZVBpcGVsaW5lLmdldEJpbmRHcm91cExheW91dCgwKSxcbiAgICAgICAgICAgICAgICAgIGVudHJpZXM6IHRoaXMuYmluZEdyb3VwRW50cmllc1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgIGNhc2UgMTM6XG4gICAgICAgICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSwgX2NhbGxlZSwgdGhpcyk7XG4gICAgICB9KSk7XG5cbiAgICAgIGZ1bmN0aW9uIGluaXQoKSB7XG4gICAgICAgIHJldHVybiBfaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gaW5pdDtcbiAgICB9KClcbiAgfSwge1xuICAgIGtleTogXCJkZXN0cm95XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgaWYgKHRoaXMudW5pZm9ybUJ1ZmZlcikge1xuICAgICAgICB0aGlzLnVuaWZvcm1CdWZmZXIuZGVzdHJveSgpO1xuICAgICAgfVxuXG4gICAgICBPYmplY3Qua2V5cyh0aGlzLnZlcnRleEJ1ZmZlcnMpLmZvckVhY2goZnVuY3Rpb24gKGJ1ZmZlck5hbWUpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzMi52ZXJ0ZXhCdWZmZXJzW2J1ZmZlck5hbWVdLmRlc3Ryb3koKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZWFkRGF0YVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX3JlYWREYXRhID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTIoKSB7XG4gICAgICAgIHZhciBvdXRwdXQsIGxlbmd0aCwgdHlwZWRBcnJheUNvbnN0cnVjdG9yLCBncHVCdWZmZXIsIGJ5dGVDb3VudCwgZ3B1UmVhZEJ1ZmZlciwgZW5jb2RlciwgcXVldWUsIGFycmF5YnVmZmVyLCB0eXBlZEFycmF5O1xuICAgICAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUyJChfY29udGV4dDIpIHtcbiAgICAgICAgICB3aGlsZSAoMSkge1xuICAgICAgICAgICAgc3dpdGNoIChfY29udGV4dDIucHJldiA9IF9jb250ZXh0Mi5uZXh0KSB7XG4gICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICBvdXRwdXQgPSB0aGlzLmNvbnRleHQub3V0cHV0O1xuXG4gICAgICAgICAgICAgICAgaWYgKCFvdXRwdXQpIHtcbiAgICAgICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMTY7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZW5ndGggPSBvdXRwdXQubGVuZ3RoLCB0eXBlZEFycmF5Q29uc3RydWN0b3IgPSBvdXRwdXQudHlwZWRBcnJheUNvbnN0cnVjdG9yLCBncHVCdWZmZXIgPSBvdXRwdXQuZ3B1QnVmZmVyO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFncHVCdWZmZXIpIHtcbiAgICAgICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMTY7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBhd2FpdCBncHVCdWZmZXIubWFwQXN5bmMoV2ViR1BVQ29uc3RhbnRzLk1hcE1vZGUuUmVhZCk7XG4gICAgICAgICAgICAgICAgLy8gY29uc3QgYXJyYXlidWZmZXIgPSBncHVCdWZmZXIuZ2V0TWFwcGVkUmFuZ2UoKTtcbiAgICAgICAgICAgICAgICAvLyBsZXQgYXJyYXlidWZmZXI7XG4gICAgICAgICAgICAgICAgLy8gaWYgKGlzU2FmYXJpKSB7XG4gICAgICAgICAgICAgICAgLy8gICBhcnJheWJ1ZmZlciA9IGF3YWl0IGdwdUJ1ZmZlci5tYXBSZWFkQXN5bmMoKTtcbiAgICAgICAgICAgICAgICAvLyB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGJ5dGVDb3VudCA9IGxlbmd0aCAqIHR5cGVkQXJyYXlDb25zdHJ1Y3Rvci5CWVRFU19QRVJfRUxFTUVOVDsgLy8gQHNlZSBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS93ZWIvdXBkYXRlcy8yMDE5LzA4L2dldC1zdGFydGVkLXdpdGgtZ3B1LWNvbXB1dGUtb24tdGhlLXdlYlxuXG4gICAgICAgICAgICAgICAgZ3B1UmVhZEJ1ZmZlciA9IHRoaXMuZW5naW5lLmRldmljZS5jcmVhdGVCdWZmZXIoe1xuICAgICAgICAgICAgICAgICAgc2l6ZTogYnl0ZUNvdW50LFxuICAgICAgICAgICAgICAgICAgdXNhZ2U6IEdQVUJ1ZmZlclVzYWdlLkNPUFlfRFNUIHwgR1BVQnVmZmVyVXNhZ2UuTUFQX1JFQURcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBlbmNvZGVyID0gdGhpcy5lbmdpbmUuZGV2aWNlLmNyZWF0ZUNvbW1hbmRFbmNvZGVyKCk7XG4gICAgICAgICAgICAgICAgZW5jb2Rlci5jb3B5QnVmZmVyVG9CdWZmZXIoZ3B1QnVmZmVyLCAwLCBncHVSZWFkQnVmZmVyLCAwLCBieXRlQ291bnQpO1xuICAgICAgICAgICAgICAgIHF1ZXVlID0gaXNTYWZhcmkgPyAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgdGhpcy5lbmdpbmUuZGV2aWNlLmdldFF1ZXVlKCkgOiB0aGlzLmVuZ2luZS5kZXZpY2UuZGVmYXVsdFF1ZXVlO1xuICAgICAgICAgICAgICAgIHF1ZXVlLnN1Ym1pdChbZW5jb2Rlci5maW5pc2goKV0pO1xuICAgICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMTI7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGdwdVJlYWRCdWZmZXIubWFwQXN5bmMoV2ViR1BVQ29uc3RhbnRzLk1hcE1vZGUuUmVhZCk7XG5cbiAgICAgICAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICAgICAgICBhcnJheWJ1ZmZlciA9IGdwdVJlYWRCdWZmZXIuZ2V0TWFwcGVkUmFuZ2UoKTtcbiAgICAgICAgICAgICAgICB0eXBlZEFycmF5ID0gbmV3IHR5cGVkQXJyYXlDb25zdHJ1Y3RvcihhcnJheWJ1ZmZlci5zbGljZSgwKSk7XG4gICAgICAgICAgICAgICAgZ3B1UmVhZEJ1ZmZlci51bm1hcCgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIuYWJydXB0KFwicmV0dXJuXCIsIHR5cGVkQXJyYXkpO1xuXG4gICAgICAgICAgICAgIGNhc2UgMTY6XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5hYnJ1cHQoXCJyZXR1cm5cIiwgbmV3IEZsb2F0MzJBcnJheSgpKTtcblxuICAgICAgICAgICAgICBjYXNlIDE3OlxuICAgICAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5zdG9wKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LCBfY2FsbGVlMiwgdGhpcyk7XG4gICAgICB9KSk7XG5cbiAgICAgIGZ1bmN0aW9uIHJlYWREYXRhKCkge1xuICAgICAgICByZXR1cm4gX3JlYWREYXRhLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZWFkRGF0YTtcbiAgICB9KClcbiAgfSwge1xuICAgIGtleTogXCJydW5cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcnVuKCkge1xuICAgICAgaWYgKHRoaXMuZW5naW5lLmN1cnJlbnRDb21wdXRlUGFzcykge1xuICAgICAgICB2YXIgX3RoaXMkZW5naW5lJGN1cnJlbnRDO1xuXG4gICAgICAgIHRoaXMuZW5naW5lLmN1cnJlbnRDb21wdXRlUGFzcy5zZXRQaXBlbGluZSh0aGlzLmNvbXB1dGVQaXBlbGluZSk7IC8vIHRoaXMuYmluZEdyb3VwRW50cmllcy5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgICAgICAvLyAgIGlmICghZW50cnkucmVzb3VyY2UuYnVmZmVyKSB7XG4gICAgICAgIC8vICAgICAvLyBnZXQgcmVmZXJyZWQga2VybmVsJ3Mgb3V0cHV0XG4gICAgICAgIC8vICAgICBjb25zdCBncHVCdWZmZXIgPSAoZW50cnkucmVzb3VyY2UucmVmZXIubW9kZWwgYXMgV2ViR1BVQ29tcHV0ZU1vZGVsKVxuICAgICAgICAvLyAgICAgICAub3V0cHV0QnVmZmVyO1xuICAgICAgICAvLyAgICAgdGhpcy52ZXJ0ZXhCdWZmZXJzW2VudHJ5LnJlc291cmNlLm5hbWVdID0gZ3B1QnVmZmVyO1xuICAgICAgICAvLyAgICAgZW50cnkucmVzb3VyY2UuYnVmZmVyID0gZ3B1QnVmZmVyLmdldCgpO1xuICAgICAgICAvLyAgIH1cbiAgICAgICAgLy8gfSk7XG4gICAgICAgIC8vIGNvbnN0IGJpbmRHcm91cCA9IHRoaXMuZW5naW5lLmRldmljZS5jcmVhdGVCaW5kR3JvdXAoe1xuICAgICAgICAvLyAgIGxheW91dDogdGhpcy5jb21wdXRlUGlwZWxpbmUuZ2V0QmluZEdyb3VwTGF5b3V0KDApLFxuICAgICAgICAvLyAgIGVudHJpZXM6IHRoaXMuYmluZEdyb3VwRW50cmllcyxcbiAgICAgICAgLy8gfSk7XG5cbiAgICAgICAgdGhpcy5lbmdpbmUuY3VycmVudENvbXB1dGVQYXNzLnNldEJpbmRHcm91cCgwLCB0aGlzLmJpbmRHcm91cCk7XG5cbiAgICAgICAgKF90aGlzJGVuZ2luZSRjdXJyZW50QyA9IHRoaXMuZW5naW5lLmN1cnJlbnRDb21wdXRlUGFzcykuZGlzcGF0Y2guYXBwbHkoX3RoaXMkZW5naW5lJGN1cnJlbnRDLCBfdG9Db25zdW1hYmxlQXJyYXkodGhpcy5jb250ZXh0LmRpc3BhdGNoKSk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInVwZGF0ZUJ1ZmZlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB1cGRhdGVCdWZmZXIoYnVmZmVyTmFtZSwgZGF0YSkge1xuICAgICAgdmFyIG9mZnNldCA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogMDtcbiAgICAgIHZhciBidWZmZXIgPSB0aGlzLnZlcnRleEJ1ZmZlcnNbYnVmZmVyTmFtZV07XG5cbiAgICAgIGlmIChidWZmZXIpIHtcbiAgICAgICAgYnVmZmVyLnN1YkRhdGEoe1xuICAgICAgICAgIGRhdGE6IGRhdGEsXG4gICAgICAgICAgb2Zmc2V0OiBvZmZzZXRcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInVwZGF0ZVVuaWZvcm1cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdXBkYXRlVW5pZm9ybSh1bmlmb3JtTmFtZSwgZGF0YSkge1xuICAgICAgdmFyIGxheW91dCA9IHRoaXMudW5pZm9ybUdQVUJ1ZmZlckxheW91dC5maW5kKGZ1bmN0aW9uIChsKSB7XG4gICAgICAgIHJldHVybiBsLm5hbWUgPT09IHVuaWZvcm1OYW1lO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChsYXlvdXQpIHtcbiAgICAgICAgdGhpcy51bmlmb3JtQnVmZmVyLnN1YkRhdGEoe1xuICAgICAgICAgIGRhdGE6IE51bWJlci5pc0Zpbml0ZShkYXRhKSA/IG5ldyBGbG9hdDMyQXJyYXkoW2RhdGFdKSA6IG5ldyBGbG9hdDMyQXJyYXkoZGF0YSksXG4gICAgICAgICAgb2Zmc2V0OiBsYXlvdXQub2Zmc2V0XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjb25maXJtSW5wdXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29uZmlybUlucHV0KG1vZGVsLCBpbnB1dE5hbWUpIHtcbiAgICAgIC8vIGNvcHkgb3V0cHV0IEdQVUJ1ZmZlciBvZiBrZXJuZWxcbiAgICAgIHZhciBpbnB1dEJ1ZmZlciA9IHRoaXMudmVydGV4QnVmZmVyc1tpbnB1dE5hbWVdO1xuICAgICAgdmFyIG91dHB1dEJ1ZmZlciA9IG1vZGVsLm91dHB1dEJ1ZmZlcjtcblxuICAgICAgaWYgKGlucHV0QnVmZmVyICYmIG91dHB1dEJ1ZmZlciAmJiBpbnB1dEJ1ZmZlciAhPT0gb3V0cHV0QnVmZmVyKSB7XG4gICAgICAgIHZhciBlbmNvZGVyID0gdGhpcy5lbmdpbmUuZGV2aWNlLmNyZWF0ZUNvbW1hbmRFbmNvZGVyKCk7XG4gICAgICAgIHZhciBfY29udGV4dCRvdXRwdXQgPSBtb2RlbC5jb250ZXh0Lm91dHB1dCxcbiAgICAgICAgICAgIGxlbmd0aCA9IF9jb250ZXh0JG91dHB1dC5sZW5ndGgsXG4gICAgICAgICAgICB0eXBlZEFycmF5Q29uc3RydWN0b3IgPSBfY29udGV4dCRvdXRwdXQudHlwZWRBcnJheUNvbnN0cnVjdG9yO1xuICAgICAgICB2YXIgYnl0ZUNvdW50ID0gbGVuZ3RoICogdHlwZWRBcnJheUNvbnN0cnVjdG9yLkJZVEVTX1BFUl9FTEVNRU5UO1xuICAgICAgICBlbmNvZGVyLmNvcHlCdWZmZXJUb0J1ZmZlcihvdXRwdXRCdWZmZXIuZ2V0KCksIDAsIGlucHV0QnVmZmVyLmdldCgpLCAwLCBieXRlQ291bnQpO1xuICAgICAgICB2YXIgcXVldWUgPSBpc1NhZmFyaSA/IC8vIEB0cy1pZ25vcmVcbiAgICAgICAgdGhpcy5lbmdpbmUuZGV2aWNlLmdldFF1ZXVlKCkgOiB0aGlzLmVuZ2luZS5kZXZpY2UuZGVmYXVsdFF1ZXVlO1xuICAgICAgICBxdWV1ZS5zdWJtaXQoW2VuY29kZXIuZmluaXNoKCldKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY29tcGlsZVNoYWRlclRvU3BpclZcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcGlsZVNoYWRlclRvU3BpclYoc291cmNlLCB0eXBlLCBzaGFkZXJWZXJzaW9uKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb21waWxlUmF3U2hhZGVyVG9TcGlyVihzaGFkZXJWZXJzaW9uICsgc291cmNlLCB0eXBlKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY29tcGlsZVJhd1NoYWRlclRvU3BpclZcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcGlsZVJhd1NoYWRlclRvU3BpclYoc291cmNlLCB0eXBlKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbmdpbmUuZ2xzbGFuZy5jb21waWxlR0xTTChzb3VyY2UsIHR5cGUpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjb21waWxlQ29tcHV0ZVBpcGVsaW5lU3RhZ2VEZXNjcmlwdG9yXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfY29tcGlsZUNvbXB1dGVQaXBlbGluZVN0YWdlRGVzY3JpcHRvciA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUzKGNvbXB1dGVDb2RlKSB7XG4gICAgICAgIHZhciBjb21wdXRlU2hhZGVyLCBzaGFkZXJWZXJzaW9uO1xuICAgICAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUzJChfY29udGV4dDMpIHtcbiAgICAgICAgICB3aGlsZSAoMSkge1xuICAgICAgICAgICAgc3dpdGNoIChfY29udGV4dDMucHJldiA9IF9jb250ZXh0My5uZXh0KSB7XG4gICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICBjb21wdXRlU2hhZGVyID0gY29tcHV0ZUNvZGU7XG4gICAgICAgICAgICAgICAgc2hhZGVyVmVyc2lvbiA9ICcjdmVyc2lvbiA0NTBcXG4nO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZW5naW5lLm9wdGlvbnMudXNlV0dTTCkge1xuICAgICAgICAgICAgICAgICAgX2NvbnRleHQzLm5leHQgPSA2O1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgX2NvbnRleHQzLm5leHQgPSA1O1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbXBpbGVTaGFkZXJUb1NwaXJWKGNvbXB1dGVDb2RlLCAnY29tcHV0ZScsIHNoYWRlclZlcnNpb24pO1xuXG4gICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICBjb21wdXRlU2hhZGVyID0gX2NvbnRleHQzLnNlbnQ7XG5cbiAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDMuYWJydXB0KFwicmV0dXJuXCIsIHtcbiAgICAgICAgICAgICAgICAgIGNvbXB1dGVTdGFnZToge1xuICAgICAgICAgICAgICAgICAgICBtb2R1bGU6IHRoaXMuZW5naW5lLmRldmljZS5jcmVhdGVTaGFkZXJNb2R1bGUoe1xuICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IGNvbXB1dGVTaGFkZXIsXG4gICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgIGlzV0hMU0w6IGlzU2FmYXJpXG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICBlbnRyeVBvaW50OiAnbWFpbidcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQzLnN0b3AoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sIF9jYWxsZWUzLCB0aGlzKTtcbiAgICAgIH0pKTtcblxuICAgICAgZnVuY3Rpb24gY29tcGlsZUNvbXB1dGVQaXBlbGluZVN0YWdlRGVzY3JpcHRvcihfeCkge1xuICAgICAgICByZXR1cm4gX2NvbXBpbGVDb21wdXRlUGlwZWxpbmVTdGFnZURlc2NyaXB0b3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNvbXBpbGVDb21wdXRlUGlwZWxpbmVTdGFnZURlc2NyaXB0b3I7XG4gICAgfSgpXG4gIH1dKTtcblxuICByZXR1cm4gV2ViR1BVQ29tcHV0ZU1vZGVsO1xufSgpO1xuXG5leHBvcnQgeyBXZWJHUFVDb21wdXRlTW9kZWwgYXMgZGVmYXVsdCB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9V2ViR1BVQ29tcHV0ZU1vZGVsLmpzLm1hcCIsImltcG9ydCBfY2xhc3NDYWxsQ2hlY2sgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2tcIjtcbmltcG9ydCBfY3JlYXRlQ2xhc3MgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlQ2xhc3NcIjtcbmltcG9ydCAqIGFzIFdlYkdQVUNvbnN0YW50cyBmcm9tICdAd2ViZ3B1L3R5cGVzL2Rpc3QvY29uc3RhbnRzJztcbmltcG9ydCBXZWJHUFVCdWZmZXIgZnJvbSAnLi9XZWJHUFVCdWZmZXInO1xuXG52YXIgV2ViR1BVRWxlbWVudHMgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBXZWJHUFVFbGVtZW50cyhlbmdpbmUsIG9wdGlvbnMpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgV2ViR1BVRWxlbWVudHMpO1xuXG4gICAgdGhpcy5lbmdpbmUgPSBlbmdpbmU7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB0aGlzLmluZGV4Q291bnQgPSB2b2lkIDA7XG4gICAgdGhpcy5idWZmZXIgPSB2b2lkIDA7XG4gICAgdmFyIF9vcHRpb25zID0gb3B0aW9ucyxcbiAgICAgICAgZGF0YSA9IF9vcHRpb25zLmRhdGEsXG4gICAgICAgIHVzYWdlID0gX29wdGlvbnMudXNhZ2UsXG4gICAgICAgIHR5cGUgPSBfb3B0aW9ucy50eXBlLFxuICAgICAgICBjb3VudCA9IF9vcHRpb25zLmNvdW50O1xuICAgIHRoaXMuaW5kZXhDb3VudCA9IGNvdW50IHx8IDA7XG4gICAgdGhpcy5idWZmZXIgPSBuZXcgV2ViR1BVQnVmZmVyKGVuZ2luZSwge1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgZGF0YTogZGF0YSBpbnN0YW5jZW9mIEFycmF5ID8gbmV3IFVpbnQxNkFycmF5KGRhdGEpIDogZGF0YSxcbiAgICAgIHVzYWdlOiBXZWJHUFVDb25zdGFudHMuQnVmZmVyVXNhZ2UuSW5kZXggfCBXZWJHUFVDb25zdGFudHMuQnVmZmVyVXNhZ2UuQ29weURzdFxuICAgIH0pO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKFdlYkdQVUVsZW1lbnRzLCBbe1xuICAgIGtleTogXCJnZXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzdWJEYXRhXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHN1YkRhdGEob3B0aW9ucykge1xuICAgICAgdGhpcy5idWZmZXIuc3ViRGF0YShvcHRpb25zKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZGVzdHJveVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkZXN0cm95KCkge1xuICAgICAgdGhpcy5idWZmZXIuZGVzdHJveSgpO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBXZWJHUFVFbGVtZW50cztcbn0oKTtcblxuZXhwb3J0IHsgV2ViR1BVRWxlbWVudHMgYXMgZGVmYXVsdCB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9V2ViR1BVRWxlbWVudHMuanMubWFwIiwiaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzc1wiO1xuXG52YXIgV2ViR1BVRnJhbWVidWZmZXIgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBXZWJHUFVGcmFtZWJ1ZmZlcihlbmdpbmUsIG9wdGlvbnMpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgV2ViR1BVRnJhbWVidWZmZXIpO1xuXG4gICAgdGhpcy5lbmdpbmUgPSBlbmdpbmU7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB0aGlzLmNvbG9yVGV4dHVyZSA9IHZvaWQgMDtcbiAgICB0aGlzLmRlcHRoVGV4dHVyZSA9IHZvaWQgMDtcbiAgICB0aGlzLndpZHRoID0gMDtcbiAgICB0aGlzLmhlaWdodCA9IDA7XG4gICAgdmFyIF9vcHRpb25zID0gb3B0aW9ucyxcbiAgICAgICAgd2lkdGggPSBfb3B0aW9ucy53aWR0aCxcbiAgICAgICAgaGVpZ2h0ID0gX29wdGlvbnMuaGVpZ2h0LFxuICAgICAgICBjb2xvciA9IF9vcHRpb25zLmNvbG9yLFxuICAgICAgICBjb2xvcnMgPSBfb3B0aW9ucy5jb2xvcnMsXG4gICAgICAgIGRlcHRoID0gX29wdGlvbnMuZGVwdGgsXG4gICAgICAgIHN0ZW5jaWwgPSBfb3B0aW9ucy5zdGVuY2lsO1xuXG4gICAgaWYgKGNvbG9yKSB7XG4gICAgICB0aGlzLmNvbG9yVGV4dHVyZSA9IGNvbG9yO1xuICAgIH1cblxuICAgIGlmIChkZXB0aCkge1xuICAgICAgdGhpcy5kZXB0aFRleHR1cmUgPSBkZXB0aDtcbiAgICB9IC8vIFRPRE86IGRlcHRoICYgc3RlbmNpbFxuXG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoV2ViR1BVRnJhbWVidWZmZXIsIFt7XG4gICAga2V5OiBcImdldFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICB2YXIgX3RoaXMkY29sb3JUZXh0dXJlLCBfdGhpcyRkZXB0aFRleHR1cmU7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbG9yOiAoX3RoaXMkY29sb3JUZXh0dXJlID0gdGhpcy5jb2xvclRleHR1cmUpID09PSBudWxsIHx8IF90aGlzJGNvbG9yVGV4dHVyZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RoaXMkY29sb3JUZXh0dXJlLmdldCgpLFxuICAgICAgICBkZXB0aDogKF90aGlzJGRlcHRoVGV4dHVyZSA9IHRoaXMuZGVwdGhUZXh0dXJlKSA9PT0gbnVsbCB8fCBfdGhpcyRkZXB0aFRleHR1cmUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJGRlcHRoVGV4dHVyZS5nZXQoKVxuICAgICAgfTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZGVzdHJveVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkZXN0cm95KCkge1xuICAgICAgdmFyIF90aGlzJGNvbG9yVGV4dHVyZTIsIF90aGlzJGRlcHRoVGV4dHVyZTI7XG5cbiAgICAgIChfdGhpcyRjb2xvclRleHR1cmUyID0gdGhpcy5jb2xvclRleHR1cmUpID09PSBudWxsIHx8IF90aGlzJGNvbG9yVGV4dHVyZTIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJGNvbG9yVGV4dHVyZTIuZGVzdHJveSgpO1xuICAgICAgKF90aGlzJGRlcHRoVGV4dHVyZTIgPSB0aGlzLmRlcHRoVGV4dHVyZSkgPT09IG51bGwgfHwgX3RoaXMkZGVwdGhUZXh0dXJlMiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RoaXMkZGVwdGhUZXh0dXJlMi5kZXN0cm95KCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlc2l6ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZXNpemUoX3JlZikge1xuICAgICAgdmFyIHdpZHRoID0gX3JlZi53aWR0aCxcbiAgICAgICAgICBoZWlnaHQgPSBfcmVmLmhlaWdodDtcblxuICAgICAgaWYgKHdpZHRoICE9PSB0aGlzLndpZHRoIHx8IGhlaWdodCAhPT0gdGhpcy5oZWlnaHQpIHtcbiAgICAgICAgdmFyIF90aGlzJGNvbG9yVGV4dHVyZTMsIF90aGlzJGRlcHRoVGV4dHVyZTM7XG5cbiAgICAgICAgKF90aGlzJGNvbG9yVGV4dHVyZTMgPSB0aGlzLmNvbG9yVGV4dHVyZSkgPT09IG51bGwgfHwgX3RoaXMkY29sb3JUZXh0dXJlMyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RoaXMkY29sb3JUZXh0dXJlMy5yZXNpemUoe1xuICAgICAgICAgIHdpZHRoOiB3aWR0aCxcbiAgICAgICAgICBoZWlnaHQ6IGhlaWdodFxuICAgICAgICB9KTtcbiAgICAgICAgKF90aGlzJGRlcHRoVGV4dHVyZTMgPSB0aGlzLmRlcHRoVGV4dHVyZSkgPT09IG51bGwgfHwgX3RoaXMkZGVwdGhUZXh0dXJlMyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RoaXMkZGVwdGhUZXh0dXJlMy5yZXNpemUoe1xuICAgICAgICAgIHdpZHRoOiB3aWR0aCxcbiAgICAgICAgICBoZWlnaHQ6IGhlaWdodFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgdGhpcy53aWR0aCA9IHdpZHRoO1xuICAgICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFdlYkdQVUZyYW1lYnVmZmVyO1xufSgpO1xuXG5leHBvcnQgeyBXZWJHUFVGcmFtZWJ1ZmZlciBhcyBkZWZhdWx0IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1XZWJHUFVGcmFtZWJ1ZmZlci5qcy5tYXAiLCJpbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCI7XG5cbnZhciBfcHJpbWl0aXZlTWFwLCBfZGVwdGhGdW5jTWFwLCBfYmxlbmRFcXVhdGlvbk1hcCwgX2JsZW5kRnVuY01hcCwgX2Zvcm1hdE1hcCwgX2ZpbHRlck1hcCwgX3dyYXBNb2RlTWFwO1xuXG5pbXBvcnQgeyBnbCB9IGZyb20gJ0BhbnR2L2ctd2ViZ3B1LWNvcmUnO1xuaW1wb3J0ICogYXMgV2ViR1BVQ29uc3RhbnRzIGZyb20gJ0B3ZWJncHUvdHlwZXMvZGlzdC9jb25zdGFudHMnOyAvLyBXZWJHUFUg5LiN5pSv5oyBIExJTkVfTE9PUCAmIFRSSUFOR0xFX0ZBTlxuXG5leHBvcnQgdmFyIHByaW1pdGl2ZU1hcCA9IChfcHJpbWl0aXZlTWFwID0ge30sIF9kZWZpbmVQcm9wZXJ0eShfcHJpbWl0aXZlTWFwLCBnbC5QT0lOVFMsIFdlYkdQVUNvbnN0YW50cy5QcmltaXRpdmVUb3BvbG9neS5Qb2ludExpc3QpLCBfZGVmaW5lUHJvcGVydHkoX3ByaW1pdGl2ZU1hcCwgZ2wuTElORVMsIFdlYkdQVUNvbnN0YW50cy5QcmltaXRpdmVUb3BvbG9neS5MaW5lTGlzdCksIF9kZWZpbmVQcm9wZXJ0eShfcHJpbWl0aXZlTWFwLCBnbC5MSU5FX0xPT1AsIFdlYkdQVUNvbnN0YW50cy5QcmltaXRpdmVUb3BvbG9neS5MaW5lTGlzdCksIF9kZWZpbmVQcm9wZXJ0eShfcHJpbWl0aXZlTWFwLCBnbC5MSU5FX1NUUklQLCBXZWJHUFVDb25zdGFudHMuUHJpbWl0aXZlVG9wb2xvZ3kuTGluZVN0cmlwKSwgX2RlZmluZVByb3BlcnR5KF9wcmltaXRpdmVNYXAsIGdsLlRSSUFOR0xFUywgV2ViR1BVQ29uc3RhbnRzLlByaW1pdGl2ZVRvcG9sb2d5LlRyaWFuZ2xlTGlzdCksIF9kZWZpbmVQcm9wZXJ0eShfcHJpbWl0aXZlTWFwLCBnbC5UUklBTkdMRV9GQU4sIFdlYkdQVUNvbnN0YW50cy5QcmltaXRpdmVUb3BvbG9neS5UcmlhbmdsZUxpc3QpLCBfZGVmaW5lUHJvcGVydHkoX3ByaW1pdGl2ZU1hcCwgZ2wuVFJJQU5HTEVfU1RSSVAsIFdlYkdQVUNvbnN0YW50cy5QcmltaXRpdmVUb3BvbG9neS5UcmlhbmdsZVN0cmlwKSwgX3ByaW1pdGl2ZU1hcCk7XG5leHBvcnQgdmFyIGRlcHRoRnVuY01hcCA9IChfZGVwdGhGdW5jTWFwID0ge30sIF9kZWZpbmVQcm9wZXJ0eShfZGVwdGhGdW5jTWFwLCBnbC5ORVZFUiwgV2ViR1BVQ29uc3RhbnRzLkNvbXBhcmVGdW5jdGlvbi5OZXZlciksIF9kZWZpbmVQcm9wZXJ0eShfZGVwdGhGdW5jTWFwLCBnbC5BTFdBWVMsIFdlYkdQVUNvbnN0YW50cy5Db21wYXJlRnVuY3Rpb24uQWx3YXlzKSwgX2RlZmluZVByb3BlcnR5KF9kZXB0aEZ1bmNNYXAsIGdsLkxFU1MsIFdlYkdQVUNvbnN0YW50cy5Db21wYXJlRnVuY3Rpb24uTGVzcyksIF9kZWZpbmVQcm9wZXJ0eShfZGVwdGhGdW5jTWFwLCBnbC5MRVFVQUwsIFdlYkdQVUNvbnN0YW50cy5Db21wYXJlRnVuY3Rpb24uTGVzc0VxdWFsKSwgX2RlZmluZVByb3BlcnR5KF9kZXB0aEZ1bmNNYXAsIGdsLkdSRUFURVIsIFdlYkdQVUNvbnN0YW50cy5Db21wYXJlRnVuY3Rpb24uR3JlYXRlciksIF9kZWZpbmVQcm9wZXJ0eShfZGVwdGhGdW5jTWFwLCBnbC5HRVFVQUwsIFdlYkdQVUNvbnN0YW50cy5Db21wYXJlRnVuY3Rpb24uR3JlYXRlckVxdWFsKSwgX2RlZmluZVByb3BlcnR5KF9kZXB0aEZ1bmNNYXAsIGdsLkVRVUFMLCBXZWJHUFVDb25zdGFudHMuQ29tcGFyZUZ1bmN0aW9uLkVxdWFsKSwgX2RlZmluZVByb3BlcnR5KF9kZXB0aEZ1bmNNYXAsIGdsLk5PVEVRVUFMLCBXZWJHUFVDb25zdGFudHMuQ29tcGFyZUZ1bmN0aW9uLk5vdEVxdWFsKSwgX2RlcHRoRnVuY01hcCk7XG5leHBvcnQgdmFyIGJsZW5kRXF1YXRpb25NYXAgPSAoX2JsZW5kRXF1YXRpb25NYXAgPSB7fSwgX2RlZmluZVByb3BlcnR5KF9ibGVuZEVxdWF0aW9uTWFwLCBnbC5GVU5DX0FERCwgV2ViR1BVQ29uc3RhbnRzLkJsZW5kT3BlcmF0aW9uLkFkZCksIF9kZWZpbmVQcm9wZXJ0eShfYmxlbmRFcXVhdGlvbk1hcCwgZ2wuTUlOX0VYVCwgV2ViR1BVQ29uc3RhbnRzLkJsZW5kT3BlcmF0aW9uLk1pbiksIF9kZWZpbmVQcm9wZXJ0eShfYmxlbmRFcXVhdGlvbk1hcCwgZ2wuTUFYX0VYVCwgV2ViR1BVQ29uc3RhbnRzLkJsZW5kT3BlcmF0aW9uLk1heCksIF9kZWZpbmVQcm9wZXJ0eShfYmxlbmRFcXVhdGlvbk1hcCwgZ2wuRlVOQ19TVUJUUkFDVCwgV2ViR1BVQ29uc3RhbnRzLkJsZW5kT3BlcmF0aW9uLlN1YnRyYWN0KSwgX2RlZmluZVByb3BlcnR5KF9ibGVuZEVxdWF0aW9uTWFwLCBnbC5GVU5DX1JFVkVSU0VfU1VCVFJBQ1QsIFdlYkdQVUNvbnN0YW50cy5CbGVuZE9wZXJhdGlvbi5SZXZlcnNlU3VidHJhY3QpLCBfYmxlbmRFcXVhdGlvbk1hcCk7IC8vIEBzZWUgaHR0cHM6Ly9ncHV3ZWIuZ2l0aHViLmlvL2dwdXdlYi8jYmxlbmQtc3RhdGVcbi8vIOS4jeaUr+aMgSAnY29uc3RhbnQgYWxwaGEnIOWSjCAnb25lIG1pbnVzIGNvbnN0YW50IGFscGhhJ1xuXG5leHBvcnQgdmFyIGJsZW5kRnVuY01hcCA9IChfYmxlbmRGdW5jTWFwID0ge30sIF9kZWZpbmVQcm9wZXJ0eShfYmxlbmRGdW5jTWFwLCBnbC5aRVJPLCBXZWJHUFVDb25zdGFudHMuQmxlbmRGYWN0b3IuWmVybyksIF9kZWZpbmVQcm9wZXJ0eShfYmxlbmRGdW5jTWFwLCBnbC5PTkUsIFdlYkdQVUNvbnN0YW50cy5CbGVuZEZhY3Rvci5PbmUpLCBfZGVmaW5lUHJvcGVydHkoX2JsZW5kRnVuY01hcCwgZ2wuU1JDX0NPTE9SLCBXZWJHUFVDb25zdGFudHMuQmxlbmRGYWN0b3IuU3JjQ29sb3IpLCBfZGVmaW5lUHJvcGVydHkoX2JsZW5kRnVuY01hcCwgZ2wuT05FX01JTlVTX1NSQ19DT0xPUiwgV2ViR1BVQ29uc3RhbnRzLkJsZW5kRmFjdG9yLk9uZU1pbnVzU3JjQ29sb3IpLCBfZGVmaW5lUHJvcGVydHkoX2JsZW5kRnVuY01hcCwgZ2wuU1JDX0FMUEhBLCBXZWJHUFVDb25zdGFudHMuQmxlbmRGYWN0b3IuU3JjQWxwaGEpLCBfZGVmaW5lUHJvcGVydHkoX2JsZW5kRnVuY01hcCwgZ2wuT05FX01JTlVTX1NSQ19BTFBIQSwgV2ViR1BVQ29uc3RhbnRzLkJsZW5kRmFjdG9yLk9uZU1pbnVzU3JjQWxwaGEpLCBfZGVmaW5lUHJvcGVydHkoX2JsZW5kRnVuY01hcCwgZ2wuRFNUX0NPTE9SLCBXZWJHUFVDb25zdGFudHMuQmxlbmRGYWN0b3IuRHN0Q29sb3IpLCBfZGVmaW5lUHJvcGVydHkoX2JsZW5kRnVuY01hcCwgZ2wuT05FX01JTlVTX0RTVF9DT0xPUiwgV2ViR1BVQ29uc3RhbnRzLkJsZW5kRmFjdG9yLk9uZU1pbnVzRHN0Q29sb3IpLCBfZGVmaW5lUHJvcGVydHkoX2JsZW5kRnVuY01hcCwgZ2wuRFNUX0FMUEhBLCBXZWJHUFVDb25zdGFudHMuQmxlbmRGYWN0b3IuRHN0QWxwaGEpLCBfZGVmaW5lUHJvcGVydHkoX2JsZW5kRnVuY01hcCwgZ2wuT05FX01JTlVTX0RTVF9BTFBIQSwgV2ViR1BVQ29uc3RhbnRzLkJsZW5kRmFjdG9yLk9uZU1pbnVzRHN0QWxwaGEpLCBfZGVmaW5lUHJvcGVydHkoX2JsZW5kRnVuY01hcCwgZ2wuQ09OU1RBTlRfQ09MT1IsIFdlYkdQVUNvbnN0YW50cy5CbGVuZEZhY3Rvci5CbGVuZENvbG9yKSwgX2RlZmluZVByb3BlcnR5KF9ibGVuZEZ1bmNNYXAsIGdsLk9ORV9NSU5VU19DT05TVEFOVF9DT0xPUiwgV2ViR1BVQ29uc3RhbnRzLkJsZW5kRmFjdG9yLk9uZU1pbnVzQmxlbmRDb2xvciksIF9kZWZpbmVQcm9wZXJ0eShfYmxlbmRGdW5jTWFwLCBnbC5TUkNfQUxQSEFfU0FUVVJBVEUsIFdlYkdQVUNvbnN0YW50cy5CbGVuZEZhY3Rvci5TcmNBbHBoYVNhdHVyYXRlZCksIF9ibGVuZEZ1bmNNYXApOyAvLyBAc2VlIGh0dHBzOi8vZ3B1d2ViLmdpdGh1Yi5pby9ncHV3ZWIvI3RleHR1cmUtZm9ybWF0c1xuXG5leHBvcnQgdmFyIGZvcm1hdE1hcCA9IChfZm9ybWF0TWFwID0ge30sIF9kZWZpbmVQcm9wZXJ0eShfZm9ybWF0TWFwLCBnbC5BTFBIQSwgJ3I4dW5vcm0nKSwgX2RlZmluZVByb3BlcnR5KF9mb3JtYXRNYXAsIGdsLlJHQkEsICdyZ2JhOHVub3JtJyksIF9kZWZpbmVQcm9wZXJ0eShfZm9ybWF0TWFwLCBnbC5ERVBUSF9DT01QT05FTlQsICdkZXB0aDMyZmxvYXQnKSwgX2RlZmluZVByb3BlcnR5KF9mb3JtYXRNYXAsIGdsLkRFUFRIX1NURU5DSUwsICdkZXB0aDI0cGx1cy1zdGVuY2lsOCcpLCBfZm9ybWF0TWFwKTsgLy8gQHNlZSBodHRwczovL2dwdXdlYi5naXRodWIuaW8vZ3B1d2ViLyNlbnVtZGVmLWdwdWZpbHRlcm1vZGVcblxuZXhwb3J0IHZhciBmaWx0ZXJNYXAgPSAoX2ZpbHRlck1hcCA9IHt9LCBfZGVmaW5lUHJvcGVydHkoX2ZpbHRlck1hcCwgZ2wuTkVBUkVTVCwgJ25lYXJlc3QnKSwgX2RlZmluZVByb3BlcnR5KF9maWx0ZXJNYXAsIGdsLkxJTkVBUiwgJ2xpbmVhcicpLCBfZmlsdGVyTWFwKTsgLy8gQHNlZSBodHRwczovL2dwdXdlYi5naXRodWIuaW8vZ3B1d2ViLyNlbnVtZGVmLWdwdWFkZHJlc3Ntb2RlXG5cbmV4cG9ydCB2YXIgd3JhcE1vZGVNYXAgPSAoX3dyYXBNb2RlTWFwID0ge30sIF9kZWZpbmVQcm9wZXJ0eShfd3JhcE1vZGVNYXAsIGdsLlJFUEVBVCwgJ3JlcGVhdCcpLCBfZGVmaW5lUHJvcGVydHkoX3dyYXBNb2RlTWFwLCBnbC5DTEFNUF9UT19FREdFLCAnY2xhbXAtdG8tZWRnZScpLCBfZGVmaW5lUHJvcGVydHkoX3dyYXBNb2RlTWFwLCBnbC5NSVJST1JFRF9SRVBFQVQsICdtaXJyb3ItcmVwZWF0JyksIF93cmFwTW9kZU1hcCk7XG5leHBvcnQgZnVuY3Rpb24gZ2V0Q3VsbE1vZGUoX3JlZikge1xuICB2YXIgY3VsbCA9IF9yZWYuY3VsbDtcblxuICBpZiAoIWN1bGwgfHwgIWN1bGwuZW5hYmxlKSB7XG4gICAgcmV0dXJuIFdlYkdQVUNvbnN0YW50cy5DdWxsTW9kZS5Ob25lO1xuICB9XG5cbiAgaWYgKGN1bGwuZmFjZSkge1xuICAgIHJldHVybiBjdWxsLmZhY2UgPT09IGdsLkZST05UID8gV2ViR1BVQ29uc3RhbnRzLkN1bGxNb2RlLkZyb250IDogV2ViR1BVQ29uc3RhbnRzLkN1bGxNb2RlLkJhY2s7XG4gIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXREZXB0aFN0ZW5jaWxTdGF0ZURlc2NyaXB0b3IoX3JlZjIpIHtcbiAgdmFyIGRlcHRoID0gX3JlZjIuZGVwdGgsXG4gICAgICBzdGVuY2lsID0gX3JlZjIuc3RlbmNpbDtcbiAgLy8gVE9ETzogc3RlbmNpbFxuICB2YXIgc3RlbmNpbEZyb250QmFjayA9IHtcbiAgICBjb21wYXJlOiBXZWJHUFVDb25zdGFudHMuQ29tcGFyZUZ1bmN0aW9uLkFsd2F5cyxcbiAgICBkZXB0aEZhaWxPcDogV2ViR1BVQ29uc3RhbnRzLlN0ZW5jaWxPcGVyYXRpb24uS2VlcCxcbiAgICBmYWlsT3A6IFdlYkdQVUNvbnN0YW50cy5TdGVuY2lsT3BlcmF0aW9uLktlZXAsXG4gICAgcGFzc09wOiBXZWJHUFVDb25zdGFudHMuU3RlbmNpbE9wZXJhdGlvbi5LZWVwXG4gIH07XG4gIHJldHVybiB7XG4gICAgZGVwdGhXcml0ZUVuYWJsZWQ6IGRlcHRoICYmIGRlcHRoLmVuYWJsZSxcbiAgICBkZXB0aENvbXBhcmU6IGRlcHRoRnVuY01hcFsoZGVwdGggPT09IG51bGwgfHwgZGVwdGggPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRlcHRoLmZ1bmMpIHx8IGdsLkFMV0FZU10sXG4gICAgZm9ybWF0OiBXZWJHUFVDb25zdGFudHMuVGV4dHVyZUZvcm1hdC5EZXB0aDI0UGx1c1N0ZW5jaWw4LFxuICAgIHN0ZW5jaWxGcm9udDogc3RlbmNpbEZyb250QmFjayxcbiAgICBzdGVuY2lsQmFjazogc3RlbmNpbEZyb250QmFjayxcbiAgICBzdGVuY2lsUmVhZE1hc2s6IDB4ZmZmZmZmZmYsXG4gICAgc3RlbmNpbFdyaXRlTWFzazogMHhmZmZmZmZmZlxuICB9O1xufVxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vZ3B1d2ViLmdpdGh1Yi5pby9ncHV3ZWIvI2NvbG9yLXN0YXRlXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbG9yU3RhdGVEZXNjcmlwdG9ycyhfcmVmMywgc3dhcENoYWluRm9ybWF0KSB7XG4gIHZhciBibGVuZCA9IF9yZWYzLmJsZW5kO1xuICByZXR1cm4gW3tcbiAgICBmb3JtYXQ6IHN3YXBDaGFpbkZvcm1hdCxcbiAgICAvLyBodHRwczovL2dwdXdlYi5naXRodWIuaW8vZ3B1d2ViLyNibGVuZC1zdGF0ZVxuICAgIGFscGhhQmxlbmQ6IHtcbiAgICAgIHNyY0ZhY3RvcjogYmxlbmRGdW5jTWFwW2JsZW5kICYmIGJsZW5kLmZ1bmMgJiYgYmxlbmQuZnVuYy5zcmNBbHBoYSB8fCBnbC5PTkVdLFxuICAgICAgZHN0RmFjdG9yOiBibGVuZEZ1bmNNYXBbYmxlbmQgJiYgYmxlbmQuZnVuYyAmJiBibGVuZC5mdW5jLmRzdEFscGhhIHx8IGdsLlpFUk9dLFxuICAgICAgb3BlcmF0aW9uOiBibGVuZEVxdWF0aW9uTWFwW2JsZW5kICYmIGJsZW5kLmVxdWF0aW9uICYmIGJsZW5kLmVxdWF0aW9uLmFscGhhIHx8IGdsLkZVTkNfQUREXVxuICAgIH0sXG4gICAgY29sb3JCbGVuZDoge1xuICAgICAgc3JjRmFjdG9yOiBibGVuZEZ1bmNNYXBbYmxlbmQgJiYgYmxlbmQuZnVuYyAmJiBibGVuZC5mdW5jLnNyY1JHQiB8fCBnbC5PTkVdLFxuICAgICAgZHN0RmFjdG9yOiBibGVuZEZ1bmNNYXBbYmxlbmQgJiYgYmxlbmQuZnVuYyAmJiBibGVuZC5mdW5jLmRzdFJHQiB8fCBnbC5aRVJPXSxcbiAgICAgIG9wZXJhdGlvbjogYmxlbmRFcXVhdGlvbk1hcFtibGVuZCAmJiBibGVuZC5lcXVhdGlvbiAmJiBibGVuZC5lcXVhdGlvbi5yZ2IgfHwgZ2wuRlVOQ19BRERdXG4gICAgfSxcbiAgICB3cml0ZU1hc2s6IFdlYkdQVUNvbnN0YW50cy5Db2xvcldyaXRlLkFsbFxuICB9XTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbnN0YW50cy5qcy5tYXAiLCJpbXBvcnQgX3RvQ29uc3VtYWJsZUFycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3RvQ29uc3VtYWJsZUFycmF5XCI7XG5pbXBvcnQgX3R5cGVvZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy90eXBlb2ZcIjtcbmltcG9ydCBfcmVnZW5lcmF0b3JSdW50aW1lIGZyb20gXCJAYmFiZWwvcnVudGltZS9yZWdlbmVyYXRvclwiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9hc3luY1RvR2VuZXJhdG9yIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2FzeW5jVG9HZW5lcmF0b3JcIjtcbmltcG9ydCBfY2xhc3NDYWxsQ2hlY2sgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2tcIjtcbmltcG9ydCBfY3JlYXRlQ2xhc3MgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlQ2xhc3NcIjtcblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7IHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7IGlmIChlbnVtZXJhYmxlT25seSkgc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7IH0pOyBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7IH0gcmV0dXJuIGtleXM7IH1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXSAhPSBudWxsID8gYXJndW1lbnRzW2ldIDoge307IGlmIChpICUgMikgeyBvd25LZXlzKE9iamVjdChzb3VyY2UpLCB0cnVlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pOyB9IGVsc2UgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSk7IH0gZWxzZSB7IG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsgfSk7IH0gfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmltcG9ydCB7IGdsLCBpc1NhZmFyaSB9IGZyb20gJ0BhbnR2L2ctd2ViZ3B1LWNvcmUnO1xuaW1wb3J0ICogYXMgV2ViR1BVQ29uc3RhbnRzIGZyb20gJ0B3ZWJncHUvdHlwZXMvZGlzdC9jb25zdGFudHMnO1xuaW1wb3J0IHsgZXh0cmFjdFVuaWZvcm1zIH0gZnJvbSAnLi4vdXRpbHMvdW5pZm9ybSc7XG5pbXBvcnQgeyBnZXRDb2xvclN0YXRlRGVzY3JpcHRvcnMsIGdldEN1bGxNb2RlLCBnZXREZXB0aFN0ZW5jaWxTdGF0ZURlc2NyaXB0b3IsIHByaW1pdGl2ZU1hcCB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCBXZWJHUFVCdWZmZXIgZnJvbSAnLi9XZWJHUFVCdWZmZXInO1xuXG4vLyBAdHMtaWdub3JlXG5mdW5jdGlvbiBjb25jYXRlbmF0ZShyZXN1bHRDb25zdHJ1Y3Rvcikge1xuICB2YXIgdG90YWxMZW5ndGggPSAwO1xuXG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcnJheXMgPSBuZXcgQXJyYXkoX2xlbiA+IDEgPyBfbGVuIC0gMSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgIGFycmF5c1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cblxuICBmb3IgKHZhciBfaSA9IDAsIF9hcnJheXMgPSBhcnJheXM7IF9pIDwgX2FycmF5cy5sZW5ndGg7IF9pKyspIHtcbiAgICB2YXIgYXJyID0gX2FycmF5c1tfaV07XG4gICAgdG90YWxMZW5ndGggKz0gYXJyLmxlbmd0aDtcbiAgfVxuXG4gIHZhciByZXN1bHQgPSBuZXcgcmVzdWx0Q29uc3RydWN0b3IodG90YWxMZW5ndGgpO1xuICB2YXIgb2Zmc2V0ID0gMDtcblxuICBmb3IgKHZhciBfaTIgPSAwLCBfYXJyYXlzMiA9IGFycmF5czsgX2kyIDwgX2FycmF5czIubGVuZ3RoOyBfaTIrKykge1xuICAgIHZhciBfYXJyID0gX2FycmF5czJbX2kyXTtcbiAgICByZXN1bHQuc2V0KF9hcnIsIG9mZnNldCk7XG4gICAgb2Zmc2V0ICs9IF9hcnIubGVuZ3RoO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxudmFyIFdlYkdQVU1vZGVsID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgLyoqXG4gICAqIOeUqOS6juWQjue7rea4suafk+aXtuWKqOaAgeabtOaWsFxuICAgKi9cblxuICAvKipcbiAgICogdmVydGV4XG4gICAqL1xuXG4gIC8qKlxuICAgKiBpbmRpY2VzJ3MgYnVmZmVyXG4gICAqL1xuICBmdW5jdGlvbiBXZWJHUFVNb2RlbChlbmdpbmUsIG9wdGlvbnMpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgV2ViR1BVTW9kZWwpO1xuXG4gICAgdGhpcy5lbmdpbmUgPSBlbmdpbmU7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB0aGlzLnBpcGVsaW5lTGF5b3V0ID0gdm9pZCAwO1xuICAgIHRoaXMucmVuZGVyUGlwZWxpbmUgPSB2b2lkIDA7XG4gICAgdGhpcy51bmlmb3Jtc0JpbmRHcm91cExheW91dCA9IHZvaWQgMDtcbiAgICB0aGlzLnVuaWZvcm1CaW5kR3JvdXAgPSB2b2lkIDA7XG4gICAgdGhpcy51bmlmb3JtQnVmZmVyID0gdm9pZCAwO1xuICAgIHRoaXMudW5pZm9ybXMgPSB7fTtcbiAgICB0aGlzLnVuaWZvcm1HUFVCdWZmZXJMYXlvdXQgPSBbXTtcbiAgICB0aGlzLmF0dHJpYnV0ZUNhY2hlID0ge307XG4gICAgdGhpcy5pbmRleEJ1ZmZlciA9IHZvaWQgMDtcbiAgICB0aGlzLmluZGV4Q291bnQgPSB2b2lkIDA7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoV2ViR1BVTW9kZWwsIFt7XG4gICAga2V5OiBcImluaXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF9pbml0ID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoZnVuY3Rpb24gX2NhbGxlZSgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgICB2YXIgX3RoaXMkb3B0aW9ucywgdnMsIGZzLCBhdHRyaWJ1dGVzLCB1bmlmb3JtcywgcHJpbWl0aXZlLCBjb3VudCwgZWxlbWVudHMsIGRlcHRoLCBibGVuZCwgc3RlbmNpbCwgY3VsbCwgaW5zdGFuY2VzLCBfeWllbGQkdGhpcyRjb21waWxlUGksIHZlcnRleFN0YWdlLCBmcmFnbWVudFN0YWdlLCB2ZXJ0ZXhTdGF0ZSwgZGVzY3JpcHRvcjtcblxuICAgICAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7XG4gICAgICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHtcbiAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgIF90aGlzJG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMsIHZzID0gX3RoaXMkb3B0aW9ucy52cywgZnMgPSBfdGhpcyRvcHRpb25zLmZzLCBhdHRyaWJ1dGVzID0gX3RoaXMkb3B0aW9ucy5hdHRyaWJ1dGVzLCB1bmlmb3JtcyA9IF90aGlzJG9wdGlvbnMudW5pZm9ybXMsIHByaW1pdGl2ZSA9IF90aGlzJG9wdGlvbnMucHJpbWl0aXZlLCBjb3VudCA9IF90aGlzJG9wdGlvbnMuY291bnQsIGVsZW1lbnRzID0gX3RoaXMkb3B0aW9ucy5lbGVtZW50cywgZGVwdGggPSBfdGhpcyRvcHRpb25zLmRlcHRoLCBibGVuZCA9IF90aGlzJG9wdGlvbnMuYmxlbmQsIHN0ZW5jaWwgPSBfdGhpcyRvcHRpb25zLnN0ZW5jaWwsIGN1bGwgPSBfdGhpcyRvcHRpb25zLmN1bGwsIGluc3RhbmNlcyA9IF90aGlzJG9wdGlvbnMuaW5zdGFuY2VzOyAvLyBidWlsZCBzaGFkZXJzIGZpcnN0XG5cbiAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMztcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb21waWxlUGlwZWxpbmVTdGFnZURlc2NyaXB0b3IodnMsIGZzLCBudWxsKTtcblxuICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgX3lpZWxkJHRoaXMkY29tcGlsZVBpID0gX2NvbnRleHQuc2VudDtcbiAgICAgICAgICAgICAgICB2ZXJ0ZXhTdGFnZSA9IF95aWVsZCR0aGlzJGNvbXBpbGVQaS52ZXJ0ZXhTdGFnZTtcbiAgICAgICAgICAgICAgICBmcmFnbWVudFN0YWdlID0gX3lpZWxkJHRoaXMkY29tcGlsZVBpLmZyYWdtZW50U3RhZ2U7XG5cbiAgICAgICAgICAgICAgICBpZiAodW5pZm9ybXMpIHtcbiAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSB1bmlmb3JtIGJpbmQgZ3JvdXBzICYgbGF5b3V0XG4gICAgICAgICAgICAgICAgICB0aGlzLmJ1aWxkVW5pZm9ybUJpbmRHcm91cCh1bmlmb3Jtcyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnRzKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLmluZGV4QnVmZmVyID0gZWxlbWVudHMuZ2V0KCk7XG4gICAgICAgICAgICAgICAgICB0aGlzLmluZGV4Q291bnQgPSBlbGVtZW50cy5pbmRleENvdW50O1xuICAgICAgICAgICAgICAgIH0gLy8gVE9ETzogaW5zdGFuY2VkIGFycmF5XG5cblxuICAgICAgICAgICAgICAgIHZlcnRleFN0YXRlID0ge1xuICAgICAgICAgICAgICAgICAgdmVydGV4QnVmZmVyczogT2JqZWN0LmtleXMoYXR0cmlidXRlcykubWFwKGZ1bmN0aW9uIChhdHRyaWJ1dGVOYW1lLCBpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzW2F0dHJpYnV0ZU5hbWVdO1xuXG4gICAgICAgICAgICAgICAgICAgIHZhciBfYXR0cmlidXRlJGdldCA9IGF0dHJpYnV0ZS5nZXQoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5U3RyaWRlID0gX2F0dHJpYnV0ZSRnZXQuYXJyYXlTdHJpZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGVwTW9kZSA9IF9hdHRyaWJ1dGUkZ2V0LnN0ZXBNb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgYXRzID0gX2F0dHJpYnV0ZSRnZXQuYXR0cmlidXRlcztcblxuICAgICAgICAgICAgICAgICAgICBfdGhpcy5hdHRyaWJ1dGVDYWNoZVthdHRyaWJ1dGVOYW1lXSA9IGF0dHJpYnV0ZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICBhcnJheVN0cmlkZTogYXJyYXlTdHJpZGUsXG4gICAgICAgICAgICAgICAgICAgICAgc3RlcE1vZGU6IHN0ZXBNb2RlLFxuICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IGF0c1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IgPSB7XG4gICAgICAgICAgICAgICAgICBzYW1wbGVDb3VudDogdGhpcy5lbmdpbmUubWFpblBhc3NTYW1wbGVDb3VudCxcbiAgICAgICAgICAgICAgICAgIHByaW1pdGl2ZVRvcG9sb2d5OiBwcmltaXRpdmVNYXBbcHJpbWl0aXZlIHx8IGdsLlRSSUFOR0xFU10sXG4gICAgICAgICAgICAgICAgICByYXN0ZXJpemF0aW9uU3RhdGU6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgdGhpcy5nZXREZWZhdWx0UmFzdGVyaXphdGlvblN0YXRlRGVzY3JpcHRvcigpKSwge30sIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogc3VwcG9ydCBmcm9udGZhY2VcbiAgICAgICAgICAgICAgICAgICAgY3VsbE1vZGU6IGdldEN1bGxNb2RlKHtcbiAgICAgICAgICAgICAgICAgICAgICBjdWxsOiBjdWxsXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgIGRlcHRoU3RlbmNpbFN0YXRlOiBnZXREZXB0aFN0ZW5jaWxTdGF0ZURlc2NyaXB0b3Ioe1xuICAgICAgICAgICAgICAgICAgICBkZXB0aDogZGVwdGgsXG4gICAgICAgICAgICAgICAgICAgIHN0ZW5jaWw6IHN0ZW5jaWxcbiAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgY29sb3JTdGF0ZXM6IGdldENvbG9yU3RhdGVEZXNjcmlwdG9ycyh7XG4gICAgICAgICAgICAgICAgICAgIGJsZW5kOiBibGVuZFxuICAgICAgICAgICAgICAgICAgfSwgdGhpcy5lbmdpbmUub3B0aW9ucy5zd2FwQ2hhaW5Gb3JtYXQpLFxuICAgICAgICAgICAgICAgICAgbGF5b3V0OiB0aGlzLnBpcGVsaW5lTGF5b3V0LFxuICAgICAgICAgICAgICAgICAgdmVydGV4U3RhZ2U6IHZlcnRleFN0YWdlLFxuICAgICAgICAgICAgICAgICAgZnJhZ21lbnRTdGFnZTogZnJhZ21lbnRTdGFnZSxcbiAgICAgICAgICAgICAgICAgIHZlcnRleFN0YXRlOiB2ZXJ0ZXhTdGF0ZVxuICAgICAgICAgICAgICAgIH07IC8vIGNyZWF0ZSBwaXBlbGluZVxuXG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJQaXBlbGluZSA9IHRoaXMuZW5naW5lLmRldmljZS5jcmVhdGVSZW5kZXJQaXBlbGluZShkZXNjcmlwdG9yKTtcblxuICAgICAgICAgICAgICBjYXNlIDExOlxuICAgICAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LnN0b3AoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sIF9jYWxsZWUsIHRoaXMpO1xuICAgICAgfSkpO1xuXG4gICAgICBmdW5jdGlvbiBpbml0KCkge1xuICAgICAgICByZXR1cm4gX2luaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGluaXQ7XG4gICAgfSgpXG4gIH0sIHtcbiAgICBrZXk6IFwiYWRkVW5pZm9ybXNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWRkVW5pZm9ybXModW5pZm9ybXMpIHtcbiAgICAgIHRoaXMudW5pZm9ybXMgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHRoaXMudW5pZm9ybXMpLCBleHRyYWN0VW5pZm9ybXModW5pZm9ybXMpKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZHJhd1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkcmF3KG9wdGlvbnMpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICB2YXIgcmVuZGVyUGFzcyA9IHRoaXMuZW5naW5lLmdldEN1cnJlbnRSZW5kZXJQYXNzKCk7XG5cbiAgICAgIHZhciB1bmlmb3JtcyA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgdGhpcy51bmlmb3JtcyksIGV4dHJhY3RVbmlmb3JtcyhvcHRpb25zLnVuaWZvcm1zIHx8IHt9KSk7XG5cbiAgICAgIHZhciBiaW5kR3JvdXBCaW5kaW5ncyA9IFtdOyAvLyBUT0RPOiB1bmlmb3JtIOWPkeeUn+S/ruaUuVxuXG4gICAgICBPYmplY3Qua2V5cyh1bmlmb3JtcykuZm9yRWFjaChmdW5jdGlvbiAodW5pZm9ybU5hbWUpIHtcbiAgICAgICAgdmFyIHR5cGUgPSBfdHlwZW9mKHVuaWZvcm1zW3VuaWZvcm1OYW1lXSk7XG5cbiAgICAgICAgaWYgKHR5cGUgPT09ICdib29sZWFuJyB8fCB0eXBlID09PSAnbnVtYmVyJyB8fCBBcnJheS5pc0FycmF5KHVuaWZvcm1zW3VuaWZvcm1OYW1lXSkgfHwgLy8gQHRzLWlnbm9yZVxuICAgICAgICB1bmlmb3Jtc1t1bmlmb3JtTmFtZV0uQllURVNfUEVSX0VMRU1FTlQpIHtcbiAgICAgICAgICB2YXIgX3RoaXMyJHVuaWZvcm1HUFVCdWZmO1xuXG4gICAgICAgICAgdmFyIG9mZnNldCA9IChfdGhpczIkdW5pZm9ybUdQVUJ1ZmYgPSBfdGhpczIudW5pZm9ybUdQVUJ1ZmZlckxheW91dC5maW5kKGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgICAgICAgICB2YXIgbmFtZSA9IF9yZWYubmFtZTtcbiAgICAgICAgICAgIHJldHVybiBuYW1lID09PSB1bmlmb3JtTmFtZTtcbiAgICAgICAgICB9KSkgPT09IG51bGwgfHwgX3RoaXMyJHVuaWZvcm1HUFVCdWZmID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGhpczIkdW5pZm9ybUdQVUJ1ZmYub2Zmc2V0O1xuXG4gICAgICAgICAgaWYgKG9mZnNldCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgX3RoaXMyLnVuaWZvcm1CdWZmZXIuc3ViRGF0YSh7XG4gICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgZGF0YTogdW5pZm9ybXNbdW5pZm9ybU5hbWVdLFxuICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgIG9mZnNldDogb2Zmc2V0XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIF90aGlzMiR1bmlmb3JtR1BVQnVmZjI7XG5cbiAgICAgICAgICB2YXIgX29mZnNldCA9IChfdGhpczIkdW5pZm9ybUdQVUJ1ZmYyID0gX3RoaXMyLnVuaWZvcm1HUFVCdWZmZXJMYXlvdXQuZmluZChmdW5jdGlvbiAoX3JlZjIpIHtcbiAgICAgICAgICAgIHZhciBuYW1lID0gX3JlZjIubmFtZTtcbiAgICAgICAgICAgIHJldHVybiBuYW1lID09PSB1bmlmb3JtTmFtZTtcbiAgICAgICAgICB9KSkgPT09IG51bGwgfHwgX3RoaXMyJHVuaWZvcm1HUFVCdWZmMiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RoaXMyJHVuaWZvcm1HUFVCdWZmMi5vZmZzZXQ7XG5cbiAgICAgICAgICBpZiAoX29mZnNldCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyIHRleHR1cmVPckZyYW1lYnVmZmVyID0gdW5pZm9ybXNbdW5pZm9ybU5hbWVdLmdldCgpO1xuXG4gICAgICAgICAgICB2YXIgX3JlZjMgPSAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICB0ZXh0dXJlT3JGcmFtZWJ1ZmZlci5jb2xvciB8fCB0ZXh0dXJlT3JGcmFtZWJ1ZmZlcixcbiAgICAgICAgICAgICAgICB0ZXh0dXJlID0gX3JlZjMudGV4dHVyZSxcbiAgICAgICAgICAgICAgICBzYW1wbGVyID0gX3JlZjMuc2FtcGxlcjtcblxuICAgICAgICAgICAgaWYgKHNhbXBsZXIpIHtcbiAgICAgICAgICAgICAgYmluZEdyb3VwQmluZGluZ3MucHVzaCh7XG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIGJpbmRpbmc6IF9vZmZzZXQsXG4gICAgICAgICAgICAgICAgcmVzb3VyY2U6IHNhbXBsZXJcbiAgICAgICAgICAgICAgfSk7IC8vIEB0cy1pZ25vcmVcblxuICAgICAgICAgICAgICBfb2Zmc2V0Kys7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJpbmRHcm91cEJpbmRpbmdzLnB1c2goe1xuICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgIGJpbmRpbmc6IF9vZmZzZXQsXG4gICAgICAgICAgICAgIHJlc291cmNlOiB0ZXh0dXJlLmNyZWF0ZVZpZXcoKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaWYgKHRoaXMudW5pZm9ybUJ1ZmZlcikge1xuICAgICAgICBiaW5kR3JvdXBCaW5kaW5nc1swXSA9IHtcbiAgICAgICAgICBiaW5kaW5nOiAwLFxuICAgICAgICAgIHJlc291cmNlOiB7XG4gICAgICAgICAgICBidWZmZXI6IHRoaXMudW5pZm9ybUJ1ZmZlci5nZXQoKSAvLyDov5Tlm54gR1BVQnVmZmVyIOWOn+eUn+WvueixoVxuXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICB0aGlzLnVuaWZvcm1CaW5kR3JvdXAgPSB0aGlzLmVuZ2luZS5kZXZpY2UuY3JlYXRlQmluZEdyb3VwKHtcbiAgICAgICAgbGF5b3V0OiB0aGlzLnVuaWZvcm1zQmluZEdyb3VwTGF5b3V0LFxuICAgICAgICBlbnRyaWVzOiBiaW5kR3JvdXBCaW5kaW5nc1xuICAgICAgfSk7XG5cbiAgICAgIGlmICh0aGlzLnJlbmRlclBpcGVsaW5lKSB7XG4gICAgICAgIHJlbmRlclBhc3Muc2V0UGlwZWxpbmUodGhpcy5yZW5kZXJQaXBlbGluZSk7XG4gICAgICB9XG5cbiAgICAgIHJlbmRlclBhc3Muc2V0QmluZEdyb3VwKDAsIHRoaXMudW5pZm9ybUJpbmRHcm91cCk7XG5cbiAgICAgIGlmICh0aGlzLmluZGV4QnVmZmVyKSB7XG4gICAgICAgIHJlbmRlclBhc3Muc2V0SW5kZXhCdWZmZXIodGhpcy5pbmRleEJ1ZmZlci5nZXQoKSwgV2ViR1BVQ29uc3RhbnRzLkluZGV4Rm9ybWF0LlVpbnQzMiwgMCk7XG4gICAgICB9XG5cbiAgICAgIE9iamVjdC5rZXlzKHRoaXMuYXR0cmlidXRlQ2FjaGUpLmZvckVhY2goZnVuY3Rpb24gKGF0dHJpYnV0ZU5hbWUsIGkpIHtcbiAgICAgICAgcmVuZGVyUGFzcy5zZXRWZXJ0ZXhCdWZmZXIoMCArIGksIF90aGlzMi5hdHRyaWJ1dGVDYWNoZVthdHRyaWJ1dGVOYW1lXS5nZXQoKS5idWZmZXIsIDApO1xuICAgICAgfSk7IC8vIHJlbmRlclBhc3MuZHJhdyh2ZXJ0aWNlc0NvdW50LCBpbnN0YW5jZXNDb3VudCwgdmVydGljZXNTdGFydCwgMCk7XG5cbiAgICAgIGlmICh0aGlzLmluZGV4QnVmZmVyKSB7XG4gICAgICAgIHJlbmRlclBhc3MuZHJhd0luZGV4ZWQodGhpcy5pbmRleENvdW50LCB0aGlzLm9wdGlvbnMuaW5zdGFuY2VzIHx8IDEsIDAsIDAsIDApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVuZGVyUGFzcy5kcmF3KHRoaXMub3B0aW9ucy5jb3VudCB8fCAwLCB0aGlzLm9wdGlvbnMuaW5zdGFuY2VzIHx8IDAsIDAsIDApO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJkZXN0cm95XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNvbXBpbGVQaXBlbGluZVN0YWdlRGVzY3JpcHRvclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX2NvbXBpbGVQaXBlbGluZVN0YWdlRGVzY3JpcHRvciA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUyKHZlcnRleENvZGUsIGZyYWdtZW50Q29kZSwgZGVmaW5lcykge1xuICAgICAgICB2YXIgc2hhZGVyVmVyc2lvbiwgdmVydGV4U2hhZGVyLCBmcmFnbWVudFNoYWRlcjtcbiAgICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUud3JhcChmdW5jdGlvbiBfY2FsbGVlMiQoX2NvbnRleHQyKSB7XG4gICAgICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQyLnByZXYgPSBfY29udGV4dDIubmV4dCkge1xuICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgc2hhZGVyVmVyc2lvbiA9ICcjdmVyc2lvbiA0NTBcXG4nO1xuICAgICAgICAgICAgICAgIHZlcnRleFNoYWRlciA9IHZlcnRleENvZGU7XG4gICAgICAgICAgICAgICAgZnJhZ21lbnRTaGFkZXIgPSBmcmFnbWVudENvZGU7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5lbmdpbmUub3B0aW9ucy51c2VXR1NMKSB7XG4gICAgICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDEwO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSA2O1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbXBpbGVTaGFkZXJUb1NwaXJWKHZlcnRleENvZGUsICd2ZXJ0ZXgnLCBzaGFkZXJWZXJzaW9uKTtcblxuICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgdmVydGV4U2hhZGVyID0gX2NvbnRleHQyLnNlbnQ7XG4gICAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSA5O1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbXBpbGVTaGFkZXJUb1NwaXJWKGZyYWdtZW50Q29kZSwgJ2ZyYWdtZW50Jywgc2hhZGVyVmVyc2lvbik7XG5cbiAgICAgICAgICAgICAgY2FzZSA5OlxuICAgICAgICAgICAgICAgIGZyYWdtZW50U2hhZGVyID0gX2NvbnRleHQyLnNlbnQ7XG5cbiAgICAgICAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLmFicnVwdChcInJldHVyblwiLCB0aGlzLmNyZWF0ZVBpcGVsaW5lU3RhZ2VEZXNjcmlwdG9yKHZlcnRleFNoYWRlciwgZnJhZ21lbnRTaGFkZXIpKTtcblxuICAgICAgICAgICAgICBjYXNlIDExOlxuICAgICAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5zdG9wKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LCBfY2FsbGVlMiwgdGhpcyk7XG4gICAgICB9KSk7XG5cbiAgICAgIGZ1bmN0aW9uIGNvbXBpbGVQaXBlbGluZVN0YWdlRGVzY3JpcHRvcihfeCwgX3gyLCBfeDMpIHtcbiAgICAgICAgcmV0dXJuIF9jb21waWxlUGlwZWxpbmVTdGFnZURlc2NyaXB0b3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNvbXBpbGVQaXBlbGluZVN0YWdlRGVzY3JpcHRvcjtcbiAgICB9KClcbiAgfSwge1xuICAgIGtleTogXCJjb21waWxlU2hhZGVyVG9TcGlyVlwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21waWxlU2hhZGVyVG9TcGlyVihzb3VyY2UsIHR5cGUsIHNoYWRlclZlcnNpb24pIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbXBpbGVSYXdTaGFkZXJUb1NwaXJWKHNoYWRlclZlcnNpb24gKyBzb3VyY2UsIHR5cGUpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjb21waWxlUmF3U2hhZGVyVG9TcGlyVlwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21waWxlUmF3U2hhZGVyVG9TcGlyVihzb3VyY2UsIHR5cGUpIHtcbiAgICAgIHJldHVybiB0aGlzLmVuZ2luZS5nbHNsYW5nLmNvbXBpbGVHTFNMKHNvdXJjZSwgdHlwZSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNyZWF0ZVBpcGVsaW5lU3RhZ2VEZXNjcmlwdG9yXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNyZWF0ZVBpcGVsaW5lU3RhZ2VEZXNjcmlwdG9yKHZlcnRleFNoYWRlciwgZnJhZ21lbnRTaGFkZXIpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZlcnRleFN0YWdlOiB7XG4gICAgICAgICAgbW9kdWxlOiB0aGlzLmVuZ2luZS5kZXZpY2UuY3JlYXRlU2hhZGVyTW9kdWxlKHtcbiAgICAgICAgICAgIGNvZGU6IHZlcnRleFNoYWRlcixcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGlzV0hMU0w6IGlzU2FmYXJpXG4gICAgICAgICAgfSksXG4gICAgICAgICAgZW50cnlQb2ludDogJ21haW4nXG4gICAgICAgIH0sXG4gICAgICAgIGZyYWdtZW50U3RhZ2U6IHtcbiAgICAgICAgICBtb2R1bGU6IHRoaXMuZW5naW5lLmRldmljZS5jcmVhdGVTaGFkZXJNb2R1bGUoe1xuICAgICAgICAgICAgY29kZTogZnJhZ21lbnRTaGFkZXIsXG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBpc1dITFNMOiBpc1NhZmFyaVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIGVudHJ5UG9pbnQ6ICdtYWluJ1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAc2VlIGh0dHBzOi8vZ3B1d2ViLmdpdGh1Yi5pby9ncHV3ZWIvI3Jhc3Rlcml6YXRpb24tc3RhdGVcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImdldERlZmF1bHRSYXN0ZXJpemF0aW9uU3RhdGVEZXNjcmlwdG9yXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldERlZmF1bHRSYXN0ZXJpemF0aW9uU3RhdGVEZXNjcmlwdG9yKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZnJvbnRGYWNlOiBXZWJHUFVDb25zdGFudHMuRnJvbnRGYWNlLkNDVyxcbiAgICAgICAgY3VsbE1vZGU6IFdlYkdQVUNvbnN0YW50cy5DdWxsTW9kZS5Ob25lLFxuICAgICAgICBkZXB0aEJpYXM6IDAsXG4gICAgICAgIGRlcHRoQmlhc1Nsb3BlU2NhbGU6IDAsXG4gICAgICAgIGRlcHRoQmlhc0NsYW1wOiAwXG4gICAgICB9O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJidWlsZFVuaWZvcm1CaW5kR3JvdXBcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYnVpbGRVbmlmb3JtQmluZEdyb3VwKHVuaWZvcm1zKSB7XG4gICAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgICAgdmFyIG9mZnNldCA9IDA7IC8vIEZJWE1FOiDmiYDmnIkgdW5pZm9ybSDlkIjlubbmiJDkuIDkuKogYnVmZmVy77yM5Zu65a6a5L2/55SoIEZsb2F0MzJBcnJheSDlrZjlgqjvvIznoa7lrp7kvJrpgKDmiJDkuIDkupvlhoXlrZjnmoTmtarotLlcblxuICAgICAgdmFyIG1lcmdlZFVuaWZvcm1EYXRhID0gY29uY2F0ZW5hdGUuYXBwbHkodm9pZCAwLCBbRmxvYXQzMkFycmF5XS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KE9iamVjdC5rZXlzKHVuaWZvcm1zKS5tYXAoZnVuY3Rpb24gKHVuaWZvcm1OYW1lKSB7XG4gICAgICAgIGlmICh1bmlmb3Jtc1t1bmlmb3JtTmFtZV0pIHtcbiAgICAgICAgICBfdGhpczMudW5pZm9ybUdQVUJ1ZmZlckxheW91dC5wdXNoKHtcbiAgICAgICAgICAgIG5hbWU6IHVuaWZvcm1OYW1lLFxuICAgICAgICAgICAgb2Zmc2V0OiBvZmZzZXRcbiAgICAgICAgICB9KTsgLy8gQHRzLWlnbm9yZVxuXG5cbiAgICAgICAgICBvZmZzZXQgKz0gKHVuaWZvcm1zW3VuaWZvcm1OYW1lXS5sZW5ndGggfHwgMSkgKiA0O1xuICAgICAgICAgIHJldHVybiB1bmlmb3Jtc1t1bmlmb3JtTmFtZV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gdGV4dHVyZSAmIGZyYW1lYnVmZmVyXG4gICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICB9KSkpKTtcbiAgICAgIHZhciBlbnRyaWVzID0gW107XG4gICAgICB2YXIgaGFzVW5pZm9ybSA9IGZhbHNlO1xuXG4gICAgICBpZiAobWVyZ2VkVW5pZm9ybURhdGEubGVuZ3RoKSB7XG4gICAgICAgIGhhc1VuaWZvcm0gPSB0cnVlOyAvLyBUT0RPOiDmiYDmnIkgdW5pZm9ybSDnu5HlrprliLAgc2xvdCAw77yM6YCa6L+H6Kej5p6QIFNoYWRlciDku6PnoIHliKTlrprlj6/op4HmgKdcblxuICAgICAgICBlbnRyaWVzLnB1c2goe1xuICAgICAgICAgIC8vIFRPRE86IOaaguaXtumDvee7keWumuWIsCBzbG90IDBcbiAgICAgICAgICBiaW5kaW5nOiAwLFxuICAgICAgICAgIHZpc2liaWxpdHk6IFdlYkdQVUNvbnN0YW50cy5TaGFkZXJTdGFnZS5GcmFnbWVudCB8IFdlYkdQVUNvbnN0YW50cy5TaGFkZXJTdGFnZS5WZXJ0ZXgsXG4gICAgICAgICAgLy8gVE9ETzog5pqC5pe2IFZTIOWSjCBGUyDpg73lj6/op4FcbiAgICAgICAgICB0eXBlOiBXZWJHUFVDb25zdGFudHMuQmluZGluZ1R5cGUuVW5pZm9ybUJ1ZmZlclxuICAgICAgICB9KTtcbiAgICAgIH0gLy8g5aOw5piOIHRleHR1cmUgJiBzYW1wbGVyXG5cblxuICAgICAgT2JqZWN0LmtleXModW5pZm9ybXMpLmZpbHRlcihmdW5jdGlvbiAodW5pZm9ybU5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHVuaWZvcm1zW3VuaWZvcm1OYW1lXSA9PT0gbnVsbDtcbiAgICAgIH0pLmZvckVhY2goZnVuY3Rpb24gKHVuaWZvcm1OYW1lLCBpKSB7XG4gICAgICAgIF90aGlzMy51bmlmb3JtR1BVQnVmZmVyTGF5b3V0LnB1c2goe1xuICAgICAgICAgIG5hbWU6IHVuaWZvcm1OYW1lLFxuICAgICAgICAgIG9mZnNldDogaSAqIDIgKyAoaGFzVW5pZm9ybSA/IDEgOiAwKVxuICAgICAgICB9KTtcblxuICAgICAgICBlbnRyaWVzLnB1c2goe1xuICAgICAgICAgIC8vIFNhbXBsZXJcbiAgICAgICAgICBiaW5kaW5nOiBpICogMiArIChoYXNVbmlmb3JtID8gMSA6IDApLFxuICAgICAgICAgIHZpc2liaWxpdHk6IFdlYkdQVUNvbnN0YW50cy5TaGFkZXJTdGFnZS5GcmFnbWVudCxcbiAgICAgICAgICB0eXBlOiBXZWJHUFVDb25zdGFudHMuQmluZGluZ1R5cGUuU2FtcGxlclxuICAgICAgICB9LCB7XG4gICAgICAgICAgLy8gVGV4dHVyZSB2aWV3XG4gICAgICAgICAgYmluZGluZzogaSAqIDIgKyAoaGFzVW5pZm9ybSA/IDEgOiAwKSArIDEsXG4gICAgICAgICAgdmlzaWJpbGl0eTogV2ViR1BVQ29uc3RhbnRzLlNoYWRlclN0YWdlLkZyYWdtZW50LFxuICAgICAgICAgIHR5cGU6IFdlYkdQVUNvbnN0YW50cy5CaW5kaW5nVHlwZS5TYW1wbGVkVGV4dHVyZVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy51bmlmb3Jtc0JpbmRHcm91cExheW91dCA9IHRoaXMuZW5naW5lLmRldmljZS5jcmVhdGVCaW5kR3JvdXBMYXlvdXQoe1xuICAgICAgICAvLyDmnIDmlrAgQVBJIDAuMC4yMiDniYjmnKzkvb/nlKggZW50cmllc+OAgkNocm9tZSBDYW5hcnkgODQuMC40MTEwLjAg5bey5a6e546w44CCXG4gICAgICAgIC8vIOS9v+eUqCBiaW5kaW5ncyDkvJrmiqUgV2FybmluZzogR1BVQmluZEdyb3VwTGF5b3V0RGVzY3JpcHRvci5iaW5kaW5ncyBpcyBkZXByZWNhdGVkOiByZW5hbWVkIHRvIGVudHJpZXNcbiAgICAgICAgLy8gQHNlZSBodHRwczovL2dpdGh1Yi5jb20vYW50dmlzL0dXZWJHUFVFbmdpbmUvaXNzdWVzLzVcbiAgICAgICAgZW50cmllczogZW50cmllc1xuICAgICAgfSk7XG4gICAgICB0aGlzLnBpcGVsaW5lTGF5b3V0ID0gdGhpcy5lbmdpbmUuZGV2aWNlLmNyZWF0ZVBpcGVsaW5lTGF5b3V0KHtcbiAgICAgICAgYmluZEdyb3VwTGF5b3V0czogW3RoaXMudW5pZm9ybXNCaW5kR3JvdXBMYXlvdXRdXG4gICAgICB9KTtcblxuICAgICAgaWYgKGhhc1VuaWZvcm0pIHtcbiAgICAgICAgdGhpcy51bmlmb3JtQnVmZmVyID0gbmV3IFdlYkdQVUJ1ZmZlcih0aGlzLmVuZ2luZSwge1xuICAgICAgICAgIC8vIFRPRE86IOWkhOeQhiBTdHJ1Y3Qg5ZKMIGJvb2xlYW5cbiAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgZGF0YTogbWVyZ2VkVW5pZm9ybURhdGEgaW5zdGFuY2VvZiBBcnJheSA/IC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICBuZXcgRmxvYXQzMkFycmF5KG1lcmdlZFVuaWZvcm1EYXRhKSA6IG1lcmdlZFVuaWZvcm1EYXRhLFxuICAgICAgICAgIHVzYWdlOiBXZWJHUFVDb25zdGFudHMuQnVmZmVyVXNhZ2UuVW5pZm9ybSB8IFdlYkdQVUNvbnN0YW50cy5CdWZmZXJVc2FnZS5Db3B5RHN0XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBXZWJHUFVNb2RlbDtcbn0oKTtcblxuZXhwb3J0IHsgV2ViR1BVTW9kZWwgYXMgZGVmYXVsdCB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9V2ViR1BVTW9kZWwuanMubWFwIiwiaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzc1wiO1xuaW1wb3J0IHsgZ2wgfSBmcm9tICdAYW50di9nLXdlYmdwdS1jb3JlJztcbmltcG9ydCAqIGFzIFdlYkdQVUNvbnN0YW50cyBmcm9tICdAd2ViZ3B1L3R5cGVzL2Rpc3QvY29uc3RhbnRzJztcbmltcG9ydCB7IGZpbHRlck1hcCwgZm9ybWF0TWFwLCB3cmFwTW9kZU1hcCB9IGZyb20gJy4vY29uc3RhbnRzJztcbi8qKlxuICogYWRhcHRvciBmb3IgcmVnbC5CdWZmZXJcbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3JlZ2wtcHJvamVjdC9yZWdsL2Jsb2IvZ2gtcGFnZXMvQVBJLm1kI2J1ZmZlcnNcbiAqL1xuXG52YXIgV2ViR1BVVGV4dHVyZTJEID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gV2ViR1BVVGV4dHVyZTJEKGVuZ2luZSwgb3B0aW9ucykge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBXZWJHUFVUZXh0dXJlMkQpO1xuXG4gICAgdGhpcy5lbmdpbmUgPSBlbmdpbmU7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB0aGlzLnRleHR1cmUgPSB2b2lkIDA7XG4gICAgdGhpcy5zYW1wbGVyID0gdm9pZCAwO1xuICAgIHRoaXMud2lkdGggPSB2b2lkIDA7XG4gICAgdGhpcy5oZWlnaHQgPSB2b2lkIDA7XG4gICAgdGhpcy5jcmVhdGVUZXh0dXJlKCk7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoV2ViR1BVVGV4dHVyZTJELCBbe1xuICAgIGtleTogXCJnZXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGV4dHVyZTogdGhpcy50ZXh0dXJlLFxuICAgICAgICBzYW1wbGVyOiB0aGlzLnNhbXBsZXJcbiAgICAgIH07XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInVwZGF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB1cGRhdGUoKSB7Ly8gVE9ET1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZXNpemVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVzaXplKF9yZWYpIHtcbiAgICAgIHZhciB3aWR0aCA9IF9yZWYud2lkdGgsXG4gICAgICAgICAgaGVpZ2h0ID0gX3JlZi5oZWlnaHQ7XG5cbiAgICAgIC8vIFRPRE86IGl0IHNlZW1zIHRoYXQgVGV4dHVyZSBkb2Vzbid0IHN1cHBvcnQgYHJlc2l6ZWBcbiAgICAgIGlmICh3aWR0aCAhPT0gdGhpcy53aWR0aCB8fCBoZWlnaHQgIT09IHRoaXMuaGVpZ2h0KSB7XG4gICAgICAgIHRoaXMuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLmNyZWF0ZVRleHR1cmUoKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy53aWR0aCA9IHdpZHRoO1xuICAgICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImRlc3Ryb3lcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICAgIGlmICh0aGlzLnRleHR1cmUpIHtcbiAgICAgICAgdGhpcy50ZXh0dXJlLmRlc3Ryb3koKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY3JlYXRlVGV4dHVyZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjcmVhdGVUZXh0dXJlKCkge1xuICAgICAgdmFyIF90aGlzJG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMsXG4gICAgICAgICAgZGF0YSA9IF90aGlzJG9wdGlvbnMuZGF0YSxcbiAgICAgICAgICBfdGhpcyRvcHRpb25zJHR5cGUgPSBfdGhpcyRvcHRpb25zLnR5cGUsXG4gICAgICAgICAgdHlwZSA9IF90aGlzJG9wdGlvbnMkdHlwZSA9PT0gdm9pZCAwID8gZ2wuVU5TSUdORURfQllURSA6IF90aGlzJG9wdGlvbnMkdHlwZSxcbiAgICAgICAgICB3aWR0aCA9IF90aGlzJG9wdGlvbnMud2lkdGgsXG4gICAgICAgICAgaGVpZ2h0ID0gX3RoaXMkb3B0aW9ucy5oZWlnaHQsXG4gICAgICAgICAgX3RoaXMkb3B0aW9ucyRmbGlwWSA9IF90aGlzJG9wdGlvbnMuZmxpcFksXG4gICAgICAgICAgZmxpcFkgPSBfdGhpcyRvcHRpb25zJGZsaXBZID09PSB2b2lkIDAgPyBmYWxzZSA6IF90aGlzJG9wdGlvbnMkZmxpcFksXG4gICAgICAgICAgX3RoaXMkb3B0aW9ucyRmb3JtYXQgPSBfdGhpcyRvcHRpb25zLmZvcm1hdCxcbiAgICAgICAgICBmb3JtYXQgPSBfdGhpcyRvcHRpb25zJGZvcm1hdCA9PT0gdm9pZCAwID8gZ2wuUkdCQSA6IF90aGlzJG9wdGlvbnMkZm9ybWF0LFxuICAgICAgICAgIF90aGlzJG9wdGlvbnMkbWlwbWFwID0gX3RoaXMkb3B0aW9ucy5taXBtYXAsXG4gICAgICAgICAgbWlwbWFwID0gX3RoaXMkb3B0aW9ucyRtaXBtYXAgPT09IHZvaWQgMCA/IGZhbHNlIDogX3RoaXMkb3B0aW9ucyRtaXBtYXAsXG4gICAgICAgICAgX3RoaXMkb3B0aW9ucyR3cmFwUyA9IF90aGlzJG9wdGlvbnMud3JhcFMsXG4gICAgICAgICAgd3JhcFMgPSBfdGhpcyRvcHRpb25zJHdyYXBTID09PSB2b2lkIDAgPyBnbC5DTEFNUF9UT19FREdFIDogX3RoaXMkb3B0aW9ucyR3cmFwUyxcbiAgICAgICAgICBfdGhpcyRvcHRpb25zJHdyYXBUID0gX3RoaXMkb3B0aW9ucy53cmFwVCxcbiAgICAgICAgICB3cmFwVCA9IF90aGlzJG9wdGlvbnMkd3JhcFQgPT09IHZvaWQgMCA/IGdsLkNMQU1QX1RPX0VER0UgOiBfdGhpcyRvcHRpb25zJHdyYXBULFxuICAgICAgICAgIF90aGlzJG9wdGlvbnMkYW5pc28gPSBfdGhpcyRvcHRpb25zLmFuaXNvLFxuICAgICAgICAgIGFuaXNvID0gX3RoaXMkb3B0aW9ucyRhbmlzbyA9PT0gdm9pZCAwID8gMCA6IF90aGlzJG9wdGlvbnMkYW5pc28sXG4gICAgICAgICAgX3RoaXMkb3B0aW9ucyRhbGlnbm1lID0gX3RoaXMkb3B0aW9ucy5hbGlnbm1lbnQsXG4gICAgICAgICAgYWxpZ25tZW50ID0gX3RoaXMkb3B0aW9ucyRhbGlnbm1lID09PSB2b2lkIDAgPyAxIDogX3RoaXMkb3B0aW9ucyRhbGlnbm1lLFxuICAgICAgICAgIF90aGlzJG9wdGlvbnMkcHJlbXVsdCA9IF90aGlzJG9wdGlvbnMucHJlbXVsdGlwbHlBbHBoYSxcbiAgICAgICAgICBwcmVtdWx0aXBseUFscGhhID0gX3RoaXMkb3B0aW9ucyRwcmVtdWx0ID09PSB2b2lkIDAgPyBmYWxzZSA6IF90aGlzJG9wdGlvbnMkcHJlbXVsdCxcbiAgICAgICAgICBfdGhpcyRvcHRpb25zJG1hZyA9IF90aGlzJG9wdGlvbnMubWFnLFxuICAgICAgICAgIG1hZyA9IF90aGlzJG9wdGlvbnMkbWFnID09PSB2b2lkIDAgPyBnbC5ORUFSRVNUIDogX3RoaXMkb3B0aW9ucyRtYWcsXG4gICAgICAgICAgX3RoaXMkb3B0aW9ucyRtaW4gPSBfdGhpcyRvcHRpb25zLm1pbixcbiAgICAgICAgICBtaW4gPSBfdGhpcyRvcHRpb25zJG1pbiA9PT0gdm9pZCAwID8gZ2wuTkVBUkVTVCA6IF90aGlzJG9wdGlvbnMkbWluLFxuICAgICAgICAgIF90aGlzJG9wdGlvbnMkY29sb3JTcCA9IF90aGlzJG9wdGlvbnMuY29sb3JTcGFjZSxcbiAgICAgICAgICBjb2xvclNwYWNlID0gX3RoaXMkb3B0aW9ucyRjb2xvclNwID09PSB2b2lkIDAgPyBnbC5CUk9XU0VSX0RFRkFVTFRfV0VCR0wgOiBfdGhpcyRvcHRpb25zJGNvbG9yU3AsXG4gICAgICAgICAgdXNhZ2UgPSBfdGhpcyRvcHRpb25zLnVzYWdlO1xuICAgICAgdGhpcy53aWR0aCA9IHdpZHRoO1xuICAgICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgICB0aGlzLnRleHR1cmUgPSB0aGlzLmVuZ2luZS5kZXZpY2UuY3JlYXRlVGV4dHVyZSh7XG4gICAgICAgIHNpemU6IFt3aWR0aCwgaGVpZ2h0LCAxXSxcbiAgICAgICAgLy8gVE9ETzogYXJyYXlMYXllckNvdW50IGlzIGRlcHJlY2F0ZWQ6IHVzZSBzaXplLmRlcHRoXG4gICAgICAgIC8vIGFycmF5TGF5ZXJDb3VudDogMSxcbiAgICAgICAgbWlwTGV2ZWxDb3VudDogMSxcbiAgICAgICAgLy8gVE9ETzogaHR0cHM6Ly9ncHV3ZWIuZ2l0aHViLmlvL2dwdXdlYi8jZG9tLWdwdXRleHR1cmV2aWV3ZGVzY3JpcHRvci1taXBsZXZlbGNvdW50XG4gICAgICAgIHNhbXBsZUNvdW50OiAxLFxuICAgICAgICBkaW1lbnNpb246IFdlYkdQVUNvbnN0YW50cy5UZXh0dXJlRGltZW5zaW9uLkUyZCxcbiAgICAgICAgZm9ybWF0OiBmb3JtYXRNYXBbZm9ybWF0XSxcbiAgICAgICAgLy8gY291bGQgdGhyb3cgdGV4dHVyZSBiaW5kaW5nIHVzYWdlIG1pc21hdGNoXG4gICAgICAgIHVzYWdlOiB1c2FnZSB8fCBXZWJHUFVDb25zdGFudHMuVGV4dHVyZVVzYWdlLlNhbXBsZWQgfCBXZWJHUFVDb25zdGFudHMuVGV4dHVyZVVzYWdlLkNvcHlEc3RcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoIXVzYWdlIHx8IHVzYWdlICYgV2ViR1BVQ29uc3RhbnRzLlRleHR1cmVVc2FnZS5TYW1wbGVkKSB7XG4gICAgICAgIHRoaXMuc2FtcGxlciA9IHRoaXMuZW5naW5lLmRldmljZS5jcmVhdGVTYW1wbGVyKHtcbiAgICAgICAgICBhZGRyZXNzTW9kZVU6IHdyYXBNb2RlTWFwW3dyYXBTXSxcbiAgICAgICAgICBhZGRyZXNzTW9kZVY6IHdyYXBNb2RlTWFwW3dyYXBUXSxcbiAgICAgICAgICBhZGRyZXNzTW9kZVc6IHdyYXBNb2RlTWFwW3dyYXBTXSxcbiAgICAgICAgICAvLyBUT0RPOiBzYW1lIGFzIGFkZHJlc3NNb2RlVVxuICAgICAgICAgIG1hZ0ZpbHRlcjogZmlsdGVyTWFwW21hZ10sXG4gICAgICAgICAgbWluRmlsdGVyOiBmaWx0ZXJNYXBbbWluXSxcbiAgICAgICAgICBtYXhBbmlzb3Ryb3B5OiBhbmlzbyAvLyBAc2VlIGh0dHBzOi8vZ3B1d2ViLmdpdGh1Yi5pby9ncHV3ZWIvI2RvbS1ncHVzYW1wbGVyZGVzY3JpcHRvci1tYXhhbmlzb3Ryb3B5XG5cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFdlYkdQVVRleHR1cmUyRDtcbn0oKTtcblxuZXhwb3J0IHsgV2ViR1BVVGV4dHVyZTJEIGFzIGRlZmF1bHQgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVdlYkdQVVRleHR1cmUyRC5qcy5tYXAiLCJpbXBvcnQgX3JlZ2VuZXJhdG9yUnVudGltZSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvcmVnZW5lcmF0b3JcIjtcbmltcG9ydCBfYXN5bmNUb0dlbmVyYXRvciBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hc3luY1RvR2VuZXJhdG9yXCI7XG5pbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrXCI7XG5pbXBvcnQgX2NyZWF0ZUNsYXNzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzXCI7XG5cbnZhciBfZGVjLCBfY2xhc3MsIF90ZW1wO1xuXG4vKipcbiAqIGltcGxlbWVudHMgcmVuZGVyU2VydmljZSB3aXRoIFdlYkdQVSBBUElcbiAqIEBzZWUgaHR0cHM6Ly93ZWJncHUuaW8vXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9CYWJ5bG9uSlMvQmFieWxvbi5qcy9ibG9iL1dlYkdQVS9zcmMvRW5naW5lcy93ZWJncHVFbmdpbmUudHNcbiAqL1xuaW1wb3J0IHsgaXNTYWZhcmkgfSBmcm9tICdAYW50di9nLXdlYmdwdS1jb3JlJzsgLy8gaW1wb3J0IHsgR2xzbGFuZyB9IGZyb20gJ0B3ZWJncHUvZ2xzbGFuZy9kaXN0L3dlYi1kZXZlbC9nbHNsYW5nLm9uZWZpbGUnO1xuXG5pbXBvcnQgKiBhcyBXZWJHUFVDb25zdGFudHMgZnJvbSAnQHdlYmdwdS90eXBlcy9kaXN0L2NvbnN0YW50cyc7XG5pbXBvcnQgeyBpbmplY3RhYmxlIH0gZnJvbSAnaW52ZXJzaWZ5JztcbmltcG9ydCBnbHNsYW5nIGZyb20gJy4vZ2xzbGFuZyc7XG5pbXBvcnQgV2ViR1BVQXR0cmlidXRlIGZyb20gJy4vV2ViR1BVQXR0cmlidXRlJztcbmltcG9ydCBXZWJHUFVCdWZmZXIgZnJvbSAnLi9XZWJHUFVCdWZmZXInO1xuaW1wb3J0IFdlYkdQVUNvbXB1dGVNb2RlbCBmcm9tICcuL1dlYkdQVUNvbXB1dGVNb2RlbCc7XG5pbXBvcnQgV2ViR1BVRWxlbWVudHMgZnJvbSAnLi9XZWJHUFVFbGVtZW50cyc7XG5pbXBvcnQgV2ViR1BVRnJhbWVidWZmZXIgZnJvbSAnLi9XZWJHUFVGcmFtZWJ1ZmZlcic7XG5pbXBvcnQgV2ViR1BVTW9kZWwgZnJvbSAnLi9XZWJHUFVNb2RlbCc7XG5pbXBvcnQgV2ViR1BVVGV4dHVyZTJEIGZyb20gJy4vV2ViR1BVVGV4dHVyZTJEJztcbmV4cG9ydFxuLyoqXG4gKiByZWdsIHJlbmRlcmVyXG4gKi9cbnZhciBXZWJHUFVFbmdpbmUgPSAoX2RlYyA9IGluamVjdGFibGUoKSwgX2RlYyhfY2xhc3MgPSAoX3RlbXAgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBXZWJHUFVFbmdpbmUoKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBXZWJHUFVFbmdpbmUpO1xuXG4gICAgdGhpcy5zdXBwb3J0V2ViR1BVID0gdHJ1ZTtcbiAgICB0aGlzLnVzZVdHU0wgPSBmYWxzZTtcbiAgICB0aGlzLm9wdGlvbnMgPSB2b2lkIDA7XG4gICAgdGhpcy5jYW52YXMgPSB2b2lkIDA7XG4gICAgdGhpcy5jb250ZXh0ID0gdm9pZCAwO1xuICAgIHRoaXMuZ2xzbGFuZyA9IHZvaWQgMDtcbiAgICB0aGlzLmFkYXB0ZXIgPSB2b2lkIDA7XG4gICAgdGhpcy5kZXZpY2UgPSB2b2lkIDA7XG4gICAgdGhpcy5zd2FwQ2hhaW4gPSB2b2lkIDA7XG4gICAgdGhpcy5tYWluUGFzc1NhbXBsZUNvdW50ID0gdm9pZCAwO1xuICAgIHRoaXMubWFpblRleHR1cmUgPSB2b2lkIDA7XG4gICAgdGhpcy5kZXB0aFRleHR1cmUgPSB2b2lkIDA7XG4gICAgdGhpcy5tYWluQ29sb3JBdHRhY2htZW50cyA9IHZvaWQgMDtcbiAgICB0aGlzLm1haW5UZXh0dXJlRXh0ZW5kcyA9IHZvaWQgMDtcbiAgICB0aGlzLm1haW5EZXB0aEF0dGFjaG1lbnQgPSB2b2lkIDA7XG4gICAgdGhpcy51cGxvYWRFbmNvZGVyID0gdm9pZCAwO1xuICAgIHRoaXMucmVuZGVyRW5jb2RlciA9IHZvaWQgMDtcbiAgICB0aGlzLmNvbXB1dGVFbmNvZGVyID0gdm9pZCAwO1xuICAgIHRoaXMucmVuZGVyVGFyZ2V0RW5jb2RlciA9IHZvaWQgMDtcbiAgICB0aGlzLmNvbW1hbmRCdWZmZXJzID0gbmV3IEFycmF5KDQpLmZpbGwodW5kZWZpbmVkKTtcbiAgICB0aGlzLmN1cnJlbnRSZW5kZXJQYXNzID0gbnVsbDtcbiAgICB0aGlzLm1haW5SZW5kZXJQYXNzID0gbnVsbDtcbiAgICB0aGlzLmN1cnJlbnRSZW5kZXJUYXJnZXRWaWV3RGVzY3JpcHRvciA9IHZvaWQgMDtcbiAgICB0aGlzLmN1cnJlbnRDb21wdXRlUGFzcyA9IG51bGw7XG4gICAgdGhpcy5idW5kbGVFbmNvZGVyID0gdm9pZCAwO1xuICAgIHRoaXMudGVtcEJ1ZmZlcnMgPSBbXTtcbiAgICB0aGlzLmN1cnJlbnRSZW5kZXJUYXJnZXQgPSBudWxsO1xuICAgIHRoaXMudXBsb2FkRW5jb2RlckRlc2NyaXB0b3IgPSB7XG4gICAgICBsYWJlbDogJ3VwbG9hZCdcbiAgICB9O1xuICAgIHRoaXMucmVuZGVyRW5jb2RlckRlc2NyaXB0b3IgPSB7XG4gICAgICBsYWJlbDogJ3JlbmRlcidcbiAgICB9O1xuICAgIHRoaXMucmVuZGVyVGFyZ2V0RW5jb2RlckRlc2NyaXB0b3IgPSB7XG4gICAgICBsYWJlbDogJ3JlbmRlclRhcmdldCdcbiAgICB9O1xuICAgIHRoaXMuY29tcHV0ZUVuY29kZXJEZXNjcmlwdG9yID0ge1xuICAgICAgbGFiZWw6ICdjb21wdXRlJ1xuICAgIH07XG4gICAgdGhpcy5waXBlbGluZXMgPSB7fTtcbiAgICB0aGlzLmNvbXB1dGVQaXBlbGluZXMgPSB7fTtcbiAgICB0aGlzLmRlZmF1bHRTYW1wbGVDb3VudCA9IDQ7XG4gICAgdGhpcy5jbGVhckRlcHRoVmFsdWUgPSAxO1xuICAgIHRoaXMuY2xlYXJTdGVuY2lsVmFsdWUgPSAwO1xuICAgIHRoaXMudHJhbnNpZW50Vmlld3BvcnQgPSB7XG4gICAgICB4OiBJbmZpbml0eSxcbiAgICAgIHk6IDAsXG4gICAgICB3aWR0aDogMCxcbiAgICAgIGhlaWdodDogMFxuICAgIH07XG4gICAgdGhpcy5jYWNoZWRWaWV3cG9ydCA9IHtcbiAgICAgIHg6IDAsXG4gICAgICB5OiAwLFxuICAgICAgd2lkdGg6IDAsXG4gICAgICBoZWlnaHQ6IDBcbiAgICB9O1xuXG4gICAgdGhpcy5jbGVhciA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICB2YXIgZnJhbWVidWZmZXIgPSBvcHRpb25zLmZyYW1lYnVmZmVyLFxuICAgICAgICAgIGNvbG9yID0gb3B0aW9ucy5jb2xvcixcbiAgICAgICAgICBkZXB0aCA9IG9wdGlvbnMuZGVwdGgsXG4gICAgICAgICAgc3RlbmNpbCA9IG9wdGlvbnMuc3RlbmNpbDtcblxuICAgICAgaWYgKF90aGlzLm9wdGlvbnMuc3VwcG9ydENvbXB1dGUpIHtcbiAgICAgICAgX3RoaXMuc3RhcnRDb21wdXRlUGFzcygpO1xuICAgICAgfSAvLyBXZSBuZWVkIHRvIHJlY3JlYXRlIHRoZSByZW5kZXIgcGFzcyBzbyB0aGF0IHRoZSBuZXcgcGFyYW1ldGVycyBmb3IgY2xlYXIgY29sb3IgLyBkZXB0aCAvIHN0ZW5jaWwgYXJlIHRha2VuIGludG8gYWNjb3VudFxuXG5cbiAgICAgIGlmIChfdGhpcy5jdXJyZW50UmVuZGVyVGFyZ2V0KSB7XG4gICAgICAgIGlmIChfdGhpcy5jdXJyZW50UmVuZGVyUGFzcykge1xuICAgICAgICAgIF90aGlzLmVuZFJlbmRlclRhcmdldFJlbmRlclBhc3MoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIF90aGlzLnN0YXJ0UmVuZGVyVGFyZ2V0UmVuZGVyUGFzcyhfdGhpcy5jdXJyZW50UmVuZGVyVGFyZ2V0LCBjb2xvciA/IGNvbG9yIDogbnVsbCwgISFkZXB0aCwgISFzdGVuY2lsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGlmICh0aGlzLnVzZVJldmVyc2VEZXB0aEJ1ZmZlcikge1xuICAgICAgICAvLyAgICAgdGhpcy5fZGVwdGhDdWxsaW5nU3RhdGUuZGVwdGhGdW5jID0gQ29uc3RhbnRzLkdSRUFURVI7XG4gICAgICAgIC8vIH1cbiAgICAgICAgX3RoaXMubWFpbkNvbG9yQXR0YWNobWVudHNbMF0ubG9hZFZhbHVlID0gY29sb3IgPyBjb2xvciA6IFdlYkdQVUNvbnN0YW50cy5Mb2FkT3AuTG9hZDtcbiAgICAgICAgX3RoaXMubWFpbkRlcHRoQXR0YWNobWVudC5kZXB0aExvYWRWYWx1ZSA9IGRlcHRoID8gZGVwdGggOiBXZWJHUFVDb25zdGFudHMuTG9hZE9wLkxvYWQ7XG4gICAgICAgIF90aGlzLm1haW5EZXB0aEF0dGFjaG1lbnQuc3RlbmNpbExvYWRWYWx1ZSA9IHN0ZW5jaWwgPyBfdGhpcy5jbGVhclN0ZW5jaWxWYWx1ZSA6IFdlYkdQVUNvbnN0YW50cy5Mb2FkT3AuTG9hZDtcblxuICAgICAgICBpZiAoX3RoaXMubWFpblJlbmRlclBhc3MpIHtcbiAgICAgICAgICBfdGhpcy5lbmRNYWluUmVuZGVyUGFzcygpO1xuICAgICAgICB9XG5cbiAgICAgICAgX3RoaXMuc3RhcnRNYWluUmVuZGVyUGFzcygpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLmNyZWF0ZU1vZGVsID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfcmVmID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoZnVuY3Rpb24gX2NhbGxlZShvcHRpb25zKSB7XG4gICAgICAgIHZhciBtb2RlbDtcbiAgICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUud3JhcChmdW5jdGlvbiBfY2FsbGVlJChfY29udGV4dCkge1xuICAgICAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7XG4gICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICBtb2RlbCA9IG5ldyBXZWJHUFVNb2RlbChfdGhpcywgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDM7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1vZGVsLmluaXQoKTtcblxuICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmFicnVwdChcInJldHVyblwiLCBtb2RlbCk7XG5cbiAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LnN0b3AoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sIF9jYWxsZWUpO1xuICAgICAgfSkpO1xuXG4gICAgICByZXR1cm4gZnVuY3Rpb24gKF94KSB7XG4gICAgICAgIHJldHVybiBfcmVmLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9O1xuICAgIH0oKTtcblxuICAgIHRoaXMuY3JlYXRlQXR0cmlidXRlID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBuZXcgV2ViR1BVQXR0cmlidXRlKF90aGlzLCBvcHRpb25zKTtcbiAgICB9O1xuXG4gICAgdGhpcy5jcmVhdGVCdWZmZXIgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgcmV0dXJuIG5ldyBXZWJHUFVCdWZmZXIoX3RoaXMsIG9wdGlvbnMpO1xuICAgIH07XG5cbiAgICB0aGlzLmNyZWF0ZUVsZW1lbnRzID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBuZXcgV2ViR1BVRWxlbWVudHMoX3RoaXMsIG9wdGlvbnMpO1xuICAgIH07XG5cbiAgICB0aGlzLmNyZWF0ZVRleHR1cmUyRCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICByZXR1cm4gbmV3IFdlYkdQVVRleHR1cmUyRChfdGhpcywgb3B0aW9ucyk7XG4gICAgfTtcblxuICAgIHRoaXMuY3JlYXRlRnJhbWVidWZmZXIgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgcmV0dXJuIG5ldyBXZWJHUFVGcmFtZWJ1ZmZlcihfdGhpcywgb3B0aW9ucyk7XG4gICAgfTtcblxuICAgIHRoaXMudXNlRnJhbWVidWZmZXIgPSBmdW5jdGlvbiAoZnJhbWVidWZmZXIsIGRyYXdDb21tYW5kcykge1xuICAgICAgLy8gYmluZFxuICAgICAgaWYgKF90aGlzLmN1cnJlbnRSZW5kZXJUYXJnZXQpIHtcbiAgICAgICAgX3RoaXMudW5iaW5kRnJhbWVidWZmZXIoX3RoaXMuY3VycmVudFJlbmRlclRhcmdldCk7XG4gICAgICB9XG5cbiAgICAgIF90aGlzLmN1cnJlbnRSZW5kZXJUYXJnZXQgPSBmcmFtZWJ1ZmZlcjsgLy8gVE9ETzogdXNlIG1pcG1hcCBvcHRpb25zIGluIGZyYW1lYnVmZmVyXG5cbiAgICAgIF90aGlzLmN1cnJlbnRSZW5kZXJUYXJnZXRWaWV3RGVzY3JpcHRvciA9IHtcbiAgICAgICAgZGltZW5zaW9uOiBXZWJHUFVDb25zdGFudHMuVGV4dHVyZVZpZXdEaW1lbnNpb24uRTJkLFxuICAgICAgICAvLyBtaXBMZXZlbENvdW50OiBiaW5kV2l0aE1pcE1hcHMgPyBXZWJHUFVUZXh0dXJlSGVscGVyLmNvbXB1dGVOdW1NaXBtYXBMZXZlbHModGV4dHVyZS53aWR0aCwgdGV4dHVyZS5oZWlnaHQpIC0gbG9kTGV2ZWwgOiAxLFxuICAgICAgICAvLyBiYXNlQXJyYXlMYXllcjogZmFjZUluZGV4LFxuICAgICAgICAvLyBiYXNlTWlwTGV2ZWw6IGxvZExldmVsLFxuICAgICAgICBhcnJheUxheWVyQ291bnQ6IDEsXG4gICAgICAgIGFzcGVjdDogV2ViR1BVQ29uc3RhbnRzLlRleHR1cmVBc3BlY3QuQWxsXG4gICAgICB9O1xuICAgICAgX3RoaXMuY3VycmVudFJlbmRlclBhc3MgPSBudWxsO1xuICAgICAgZHJhd0NvbW1hbmRzKCk7XG4gICAgfTtcblxuICAgIHRoaXMuY3JlYXRlQ29tcHV0ZU1vZGVsID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfcmVmMiA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUyKGNvbnRleHQpIHtcbiAgICAgICAgdmFyIG1vZGVsO1xuICAgICAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUyJChfY29udGV4dDIpIHtcbiAgICAgICAgICB3aGlsZSAoMSkge1xuICAgICAgICAgICAgc3dpdGNoIChfY29udGV4dDIucHJldiA9IF9jb250ZXh0Mi5uZXh0KSB7XG4gICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICBtb2RlbCA9IG5ldyBXZWJHUFVDb21wdXRlTW9kZWwoX3RoaXMsIGNvbnRleHQpO1xuICAgICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMztcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9kZWwuaW5pdCgpO1xuXG4gICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLmFicnVwdChcInJldHVyblwiLCBtb2RlbCk7XG5cbiAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5zdG9wKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LCBfY2FsbGVlMik7XG4gICAgICB9KSk7XG5cbiAgICAgIHJldHVybiBmdW5jdGlvbiAoX3gyKSB7XG4gICAgICAgIHJldHVybiBfcmVmMi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfTtcbiAgICB9KCk7XG5cbiAgICB0aGlzLmdldENhbnZhcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBfdGhpcy5jYW52YXM7XG4gICAgfTtcblxuICAgIHRoaXMuZ2V0R0xDb250ZXh0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpO1xuICAgIH07XG5cbiAgICB0aGlzLnZpZXdwb3J0ID0gZnVuY3Rpb24gKF9yZWYzKSB7XG4gICAgICB2YXIgeCA9IF9yZWYzLngsXG4gICAgICAgICAgeSA9IF9yZWYzLnksXG4gICAgICAgICAgd2lkdGggPSBfcmVmMy53aWR0aCxcbiAgICAgICAgICBoZWlnaHQgPSBfcmVmMy5oZWlnaHQ7XG5cbiAgICAgIGlmICghX3RoaXMuY3VycmVudFJlbmRlclBhc3MpIHtcbiAgICAgICAgLy8gY2FsbCB2aWV3cG9ydCgpIGJlZm9yZSBjdXJyZW50IHJlbmRlciBwYXNzIGNyZWF0ZWRcbiAgICAgICAgX3RoaXMudHJhbnNpZW50Vmlld3BvcnQgPSB7XG4gICAgICAgICAgeDogeCxcbiAgICAgICAgICB5OiB5LFxuICAgICAgICAgIHdpZHRoOiB3aWR0aCxcbiAgICAgICAgICBoZWlnaHQ6IGhlaWdodFxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIGlmIChfdGhpcy50cmFuc2llbnRWaWV3cG9ydC54ICE9PSBJbmZpbml0eSkge1xuICAgICAgICB2YXIgcmVuZGVyUGFzcyA9IF90aGlzLmdldEN1cnJlbnRSZW5kZXJQYXNzKCk7IC8vIEBzZWUgaHR0cHM6Ly9ncHV3ZWIuZ2l0aHViLmlvL2dwdXdlYi8jZG9tLWdwdXJlbmRlcnBhc3NlbmNvZGVyLXNldHZpZXdwb3J0XG5cblxuICAgICAgICByZW5kZXJQYXNzLnNldFZpZXdwb3J0KF90aGlzLnRyYW5zaWVudFZpZXdwb3J0LngsIF90aGlzLnRyYW5zaWVudFZpZXdwb3J0LnksIF90aGlzLnRyYW5zaWVudFZpZXdwb3J0LndpZHRoLCBfdGhpcy50cmFuc2llbnRWaWV3cG9ydC5oZWlnaHQsIDAsIDEpO1xuICAgICAgfSBlbHNlIGlmICh4ICE9PSBfdGhpcy5jYWNoZWRWaWV3cG9ydC54IHx8IHkgIT09IF90aGlzLmNhY2hlZFZpZXdwb3J0LnkgfHwgd2lkdGggIT09IF90aGlzLmNhY2hlZFZpZXdwb3J0LndpZHRoIHx8IGhlaWdodCAhPT0gX3RoaXMuY2FjaGVkVmlld3BvcnQuaGVpZ2h0KSB7XG4gICAgICAgIF90aGlzLmNhY2hlZFZpZXdwb3J0ID0ge1xuICAgICAgICAgIHg6IHgsXG4gICAgICAgICAgeTogeSxcbiAgICAgICAgICB3aWR0aDogd2lkdGgsXG4gICAgICAgICAgaGVpZ2h0OiBoZWlnaHRcbiAgICAgICAgfTtcblxuICAgICAgICB2YXIgX3JlbmRlclBhc3MgPSBfdGhpcy5nZXRDdXJyZW50UmVuZGVyUGFzcygpO1xuXG4gICAgICAgIF9yZW5kZXJQYXNzLnNldFZpZXdwb3J0KHgsIHksIHdpZHRoLCBoZWlnaHQsIDAsIDEpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLnJlYWRQaXhlbHMgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpO1xuICAgIH07XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoV2ViR1BVRW5naW5lLCBbe1xuICAgIGtleTogXCJpc0Zsb2F0U3VwcG9ydGVkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGlzRmxvYXRTdXBwb3J0ZWQoKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaW5pdFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX2luaXQgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUubWFyayhmdW5jdGlvbiBfY2FsbGVlMyhjb25maWcpIHtcbiAgICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUud3JhcChmdW5jdGlvbiBfY2FsbGVlMyQoX2NvbnRleHQzKSB7XG4gICAgICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQzLnByZXYgPSBfY29udGV4dDMubmV4dCkge1xuICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgdGhpcy5jYW52YXMgPSBjb25maWcuY2FudmFzO1xuICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucyA9IGNvbmZpZztcbiAgICAgICAgICAgICAgICB0aGlzLnVzZVdHU0wgPSAhIWNvbmZpZy51c2VXR1NMO1xuICAgICAgICAgICAgICAgIHRoaXMubWFpblBhc3NTYW1wbGVDb3VudCA9IGNvbmZpZy5hbnRpYWxpYXNpbmcgPyB0aGlzLmRlZmF1bHRTYW1wbGVDb3VudCA6IDE7XG4gICAgICAgICAgICAgICAgX2NvbnRleHQzLm5leHQgPSA2O1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmluaXRHbHNsYW5nKCk7XG5cbiAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgIHRoaXMuaW5pdENvbnRleHRBbmRTd2FwQ2hhaW4oKTtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRNYWluQXR0YWNobWVudHMoKTtcblxuICAgICAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQzLnN0b3AoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sIF9jYWxsZWUzLCB0aGlzKTtcbiAgICAgIH0pKTtcblxuICAgICAgZnVuY3Rpb24gaW5pdChfeDMpIHtcbiAgICAgICAgcmV0dXJuIF9pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBpbml0O1xuICAgIH0oKVxuICB9LCB7XG4gICAga2V5OiBcInNldFNjaXNzb3JcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0U2Npc3NvcihzY2lzc29yKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImRlc3Ryb3lcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICAgIGlmICh0aGlzLm1haW5UZXh0dXJlKSB7XG4gICAgICAgIHRoaXMubWFpblRleHR1cmUuZGVzdHJveSgpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5kZXB0aFRleHR1cmUpIHtcbiAgICAgICAgdGhpcy5kZXB0aFRleHR1cmUuZGVzdHJveSgpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnRlbXBCdWZmZXJzLmZvckVhY2goZnVuY3Rpb24gKGJ1ZmZlcikge1xuICAgICAgICByZXR1cm4gYnVmZmVyLmRlc3Ryb3koKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy50ZW1wQnVmZmVycyA9IFtdO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJiZWdpbkZyYW1lXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGJlZ2luRnJhbWUoKSB7XG4gICAgICB0aGlzLnVwbG9hZEVuY29kZXIgPSB0aGlzLmRldmljZS5jcmVhdGVDb21tYW5kRW5jb2Rlcih0aGlzLnVwbG9hZEVuY29kZXJEZXNjcmlwdG9yKTtcbiAgICAgIHRoaXMucmVuZGVyRW5jb2RlciA9IHRoaXMuZGV2aWNlLmNyZWF0ZUNvbW1hbmRFbmNvZGVyKHRoaXMucmVuZGVyRW5jb2RlckRlc2NyaXB0b3IpO1xuICAgICAgdGhpcy5yZW5kZXJUYXJnZXRFbmNvZGVyID0gdGhpcy5kZXZpY2UuY3JlYXRlQ29tbWFuZEVuY29kZXIodGhpcy5yZW5kZXJUYXJnZXRFbmNvZGVyRGVzY3JpcHRvcik7XG5cbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuc3VwcG9ydENvbXB1dGUpIHtcbiAgICAgICAgdGhpcy5jb21wdXRlRW5jb2RlciA9IHRoaXMuZGV2aWNlLmNyZWF0ZUNvbW1hbmRFbmNvZGVyKHRoaXMuY29tcHV0ZUVuY29kZXJEZXNjcmlwdG9yKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZW5kRnJhbWVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZW5kRnJhbWUoKSB7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLnN1cHBvcnRDb21wdXRlKSB7XG4gICAgICAgIHRoaXMuZW5kQ29tcHV0ZVBhc3MoKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5lbmRNYWluUmVuZGVyUGFzcygpO1xuICAgICAgdGhpcy5jb21tYW5kQnVmZmVyc1swXSA9IHRoaXMudXBsb2FkRW5jb2Rlci5maW5pc2goKTtcbiAgICAgIHRoaXMuY29tbWFuZEJ1ZmZlcnNbMV0gPSB0aGlzLnJlbmRlckVuY29kZXIuZmluaXNoKCk7XG5cbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuc3VwcG9ydENvbXB1dGUpIHtcbiAgICAgICAgdGhpcy5jb21tYW5kQnVmZmVyc1syXSA9IHRoaXMuY29tcHV0ZUVuY29kZXIuZmluaXNoKCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuY29tbWFuZEJ1ZmZlcnNbM10gPSB0aGlzLnJlbmRlclRhcmdldEVuY29kZXIuZmluaXNoKCk7XG5cbiAgICAgIGlmIChpc1NhZmFyaSkge1xuICAgICAgICB0aGlzLmRldmljZSAvLyBAdHMtaWdub3JlXG4gICAgICAgIC5nZXRRdWV1ZSgpLnN1Ym1pdCh0aGlzLmNvbW1hbmRCdWZmZXJzLmZpbHRlcihmdW5jdGlvbiAoYnVmZmVyKSB7XG4gICAgICAgICAgcmV0dXJuIGJ1ZmZlcjtcbiAgICAgICAgfSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5kZXZpY2UuZGVmYXVsdFF1ZXVlLnN1Ym1pdCh0aGlzLmNvbW1hbmRCdWZmZXJzLmZpbHRlcihmdW5jdGlvbiAoYnVmZmVyKSB7XG4gICAgICAgICAgcmV0dXJuIGJ1ZmZlcjtcbiAgICAgICAgfSkpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRDdXJyZW50UmVuZGVyUGFzc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRDdXJyZW50UmVuZGVyUGFzcygpIHtcbiAgICAgIGlmICh0aGlzLmN1cnJlbnRSZW5kZXJUYXJnZXQgJiYgIXRoaXMuY3VycmVudFJlbmRlclBhc3MpIHtcbiAgICAgICAgdGhpcy5zdGFydFJlbmRlclRhcmdldFJlbmRlclBhc3ModGhpcy5jdXJyZW50UmVuZGVyVGFyZ2V0LCBudWxsLCBmYWxzZSwgZmFsc2UpO1xuICAgICAgfSBlbHNlIGlmICghdGhpcy5jdXJyZW50UmVuZGVyUGFzcykge1xuICAgICAgICB0aGlzLnN0YXJ0TWFpblJlbmRlclBhc3MoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuY3VycmVudFJlbmRlclBhc3M7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImluaXRHbHNsYW5nXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfaW5pdEdsc2xhbmcgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUubWFyayhmdW5jdGlvbiBfY2FsbGVlNCgpIHtcbiAgICAgICAgdmFyIF9uYXZpZ2F0b3IsIF9uYXZpZ2F0b3IkZ3B1O1xuXG4gICAgICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoZnVuY3Rpb24gX2NhbGxlZTQkKF9jb250ZXh0NCkge1xuICAgICAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKF9jb250ZXh0NC5wcmV2ID0gX2NvbnRleHQ0Lm5leHQpIHtcbiAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgIF9jb250ZXh0NC5uZXh0ID0gMjtcbiAgICAgICAgICAgICAgICByZXR1cm4gZ2xzbGFuZygpO1xuXG4gICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICB0aGlzLmdsc2xhbmcgPSBfY29udGV4dDQuc2VudDtcbiAgICAgICAgICAgICAgICBfY29udGV4dDQubmV4dCA9IDU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChfbmF2aWdhdG9yID0gbmF2aWdhdG9yKSA9PT0gbnVsbCB8fCBfbmF2aWdhdG9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiAoX25hdmlnYXRvciRncHUgPSBfbmF2aWdhdG9yLmdwdSkgPT09IG51bGwgfHwgX25hdmlnYXRvciRncHUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9uYXZpZ2F0b3IkZ3B1LnJlcXVlc3RBZGFwdGVyKCk7XG5cbiAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgIHRoaXMuYWRhcHRlciA9IF9jb250ZXh0NC5zZW50O1xuICAgICAgICAgICAgICAgIF9jb250ZXh0NC5uZXh0ID0gODtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5hZGFwdGVyLnJlcXVlc3REZXZpY2UoKTtcblxuICAgICAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICAgICAgdGhpcy5kZXZpY2UgPSBfY29udGV4dDQuc2VudDtcblxuICAgICAgICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ0LnN0b3AoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sIF9jYWxsZWU0LCB0aGlzKTtcbiAgICAgIH0pKTtcblxuICAgICAgZnVuY3Rpb24gaW5pdEdsc2xhbmcoKSB7XG4gICAgICAgIHJldHVybiBfaW5pdEdsc2xhbmcuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGluaXRHbHNsYW5nO1xuICAgIH0oKVxuICB9LCB7XG4gICAga2V5OiBcImluaXRDb250ZXh0QW5kU3dhcENoYWluXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGluaXRDb250ZXh0QW5kU3dhcENoYWluKCkge1xuICAgICAgdGhpcy5jb250ZXh0ID0gdGhpcy5jYW52YXMuZ2V0Q29udGV4dChpc1NhZmFyaSA/ICdncHUnIDogJ2dwdXByZXNlbnQnKTtcbiAgICAgIHRoaXMuc3dhcENoYWluID0gdGhpcy5jb250ZXh0LmNvbmZpZ3VyZVN3YXBDaGFpbih7XG4gICAgICAgIGRldmljZTogdGhpcy5kZXZpY2UsXG4gICAgICAgIGZvcm1hdDogdGhpcy5vcHRpb25zLnN3YXBDaGFpbkZvcm1hdCxcbiAgICAgICAgdXNhZ2U6IFdlYkdQVUNvbnN0YW50cy5UZXh0dXJlVXNhZ2UuT3V0cHV0QXR0YWNobWVudCB8IFdlYkdQVUNvbnN0YW50cy5UZXh0dXJlVXNhZ2UuQ29weVNyY1xuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImluaXRNYWluQXR0YWNobWVudHNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaW5pdE1haW5BdHRhY2htZW50cygpIHtcbiAgICAgIHRoaXMubWFpblRleHR1cmVFeHRlbmRzID0ge1xuICAgICAgICB3aWR0aDogdGhpcy5jYW52YXMud2lkdGgsXG4gICAgICAgIGhlaWdodDogdGhpcy5jYW52YXMuaGVpZ2h0LFxuICAgICAgICBkZXB0aDogMVxuICAgICAgfTtcblxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5hbnRpYWxpYXNpbmcpIHtcbiAgICAgICAgdmFyIG1haW5UZXh0dXJlRGVzY3JpcHRvciA9IHtcbiAgICAgICAgICBzaXplOiB0aGlzLm1haW5UZXh0dXJlRXh0ZW5kcyxcbiAgICAgICAgICAvLyBUT0RPOiBhcnJheUxheWVyQ291bnQgaXMgZGVwcmVjYXRlZDogdXNlIHNpemUuZGVwdGhcbiAgICAgICAgICAvLyBhcnJheUxheWVyQ291bnQ6IDEsXG4gICAgICAgICAgbWlwTGV2ZWxDb3VudDogMSxcbiAgICAgICAgICBzYW1wbGVDb3VudDogdGhpcy5tYWluUGFzc1NhbXBsZUNvdW50LFxuICAgICAgICAgIGRpbWVuc2lvbjogV2ViR1BVQ29uc3RhbnRzLlRleHR1cmVEaW1lbnNpb24uRTJkLFxuICAgICAgICAgIGZvcm1hdDogV2ViR1BVQ29uc3RhbnRzLlRleHR1cmVGb3JtYXQuQkdSQThVbm9ybSxcbiAgICAgICAgICB1c2FnZTogV2ViR1BVQ29uc3RhbnRzLlRleHR1cmVVc2FnZS5PdXRwdXRBdHRhY2htZW50XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHRoaXMubWFpblRleHR1cmUpIHtcbiAgICAgICAgICB0aGlzLm1haW5UZXh0dXJlLmRlc3Ryb3koKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubWFpblRleHR1cmUgPSB0aGlzLmRldmljZS5jcmVhdGVUZXh0dXJlKG1haW5UZXh0dXJlRGVzY3JpcHRvcik7XG4gICAgICAgIHRoaXMubWFpbkNvbG9yQXR0YWNobWVudHMgPSBbe1xuICAgICAgICAgIGF0dGFjaG1lbnQ6IGlzU2FmYXJpID8gLy8gQHRzLWlnbm9yZVxuICAgICAgICAgIHRoaXMubWFpblRleHR1cmUuY3JlYXRlRGVmYXVsdFZpZXcoKSA6IHRoaXMubWFpblRleHR1cmUuY3JlYXRlVmlldygpLFxuICAgICAgICAgIGxvYWRWYWx1ZTogWzAsIDAsIDAsIDFdLFxuICAgICAgICAgIHN0b3JlT3A6IFdlYkdQVUNvbnN0YW50cy5TdG9yZU9wLlN0b3JlXG4gICAgICAgIH1dO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5tYWluQ29sb3JBdHRhY2htZW50cyA9IFt7XG4gICAgICAgICAgYXR0YWNobWVudDogaXNTYWZhcmkgPyAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgdGhpcy5zd2FwQ2hhaW4uZ2V0Q3VycmVudFRleHR1cmUoKS5jcmVhdGVEZWZhdWx0VmlldygpIDogdGhpcy5zd2FwQ2hhaW4uZ2V0Q3VycmVudFRleHR1cmUoKS5jcmVhdGVWaWV3KCksXG4gICAgICAgICAgbG9hZFZhbHVlOiBbMCwgMCwgMCwgMV0sXG4gICAgICAgICAgc3RvcmVPcDogV2ViR1BVQ29uc3RhbnRzLlN0b3JlT3AuU3RvcmVcbiAgICAgICAgfV07XG4gICAgICB9XG5cbiAgICAgIHZhciBkZXB0aFRleHR1cmVEZXNjcmlwdG9yID0ge1xuICAgICAgICBzaXplOiB0aGlzLm1haW5UZXh0dXJlRXh0ZW5kcyxcbiAgICAgICAgLy8gYXJyYXlMYXllckNvdW50OiAxLFxuICAgICAgICBtaXBMZXZlbENvdW50OiAxLFxuICAgICAgICBzYW1wbGVDb3VudDogdGhpcy5tYWluUGFzc1NhbXBsZUNvdW50LFxuICAgICAgICBkaW1lbnNpb246IFdlYkdQVUNvbnN0YW50cy5UZXh0dXJlRGltZW5zaW9uLkUyZCxcbiAgICAgICAgZm9ybWF0OiBpc1NhZmFyaSA/ICdkZXB0aDMyZmxvYXQtc3RlbmNpbDgnIDogV2ViR1BVQ29uc3RhbnRzLlRleHR1cmVGb3JtYXQuRGVwdGgyNFBsdXNTdGVuY2lsOCxcbiAgICAgICAgdXNhZ2U6IFdlYkdQVUNvbnN0YW50cy5UZXh0dXJlVXNhZ2UuT3V0cHV0QXR0YWNobWVudFxuICAgICAgfTtcblxuICAgICAgaWYgKHRoaXMuZGVwdGhUZXh0dXJlKSB7XG4gICAgICAgIHRoaXMuZGVwdGhUZXh0dXJlLmRlc3Ryb3koKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5kZXB0aFRleHR1cmUgPSB0aGlzLmRldmljZS5jcmVhdGVUZXh0dXJlKCAvLyBAdHMtaWdub3JlXG4gICAgICBkZXB0aFRleHR1cmVEZXNjcmlwdG9yKTtcbiAgICAgIHRoaXMubWFpbkRlcHRoQXR0YWNobWVudCA9IHtcbiAgICAgICAgYXR0YWNobWVudDogaXNTYWZhcmkgPyAvLyBAdHMtaWdub3JlXG4gICAgICAgIHRoaXMuZGVwdGhUZXh0dXJlLmNyZWF0ZURlZmF1bHRWaWV3KCkgOiB0aGlzLmRlcHRoVGV4dHVyZS5jcmVhdGVWaWV3KCksXG4gICAgICAgIGRlcHRoTG9hZFZhbHVlOiB0aGlzLmNsZWFyRGVwdGhWYWx1ZSxcbiAgICAgICAgZGVwdGhTdG9yZU9wOiBXZWJHUFVDb25zdGFudHMuU3RvcmVPcC5TdG9yZSxcbiAgICAgICAgc3RlbmNpbExvYWRWYWx1ZTogdGhpcy5jbGVhclN0ZW5jaWxWYWx1ZSxcbiAgICAgICAgc3RlbmNpbFN0b3JlT3A6IFdlYkdQVUNvbnN0YW50cy5TdG9yZU9wLlN0b3JlXG4gICAgICB9O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzdGFydENvbXB1dGVQYXNzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHN0YXJ0Q29tcHV0ZVBhc3MoKSB7XG4gICAgICBpZiAodGhpcy5jdXJyZW50Q29tcHV0ZVBhc3MpIHtcbiAgICAgICAgdGhpcy5lbmRDb21wdXRlUGFzcygpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmN1cnJlbnRDb21wdXRlUGFzcyA9IHRoaXMuY29tcHV0ZUVuY29kZXIuYmVnaW5Db21wdXRlUGFzcygpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzdGFydE1haW5SZW5kZXJQYXNzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHN0YXJ0TWFpblJlbmRlclBhc3MoKSB7XG4gICAgICBpZiAodGhpcy5jdXJyZW50UmVuZGVyUGFzcyAmJiAhdGhpcy5jdXJyZW50UmVuZGVyVGFyZ2V0KSB7XG4gICAgICAgIHRoaXMuZW5kTWFpblJlbmRlclBhc3MoKTtcbiAgICAgIH0gLy8gUmVzb2x2ZSBpbiBjYXNlIG9mIE1TQUFcblxuXG4gICAgICBpZiAodGhpcy5vcHRpb25zLmFudGlhbGlhc2luZykge1xuICAgICAgICB0aGlzLm1haW5Db2xvckF0dGFjaG1lbnRzWzBdLnJlc29sdmVUYXJnZXQgPSBpc1NhZmFyaSA/IC8vIEB0cy1pZ25vcmVcbiAgICAgICAgdGhpcy5zd2FwQ2hhaW4uZ2V0Q3VycmVudFRleHR1cmUoKS5jcmVhdGVEZWZhdWx0VmlldygpIDogdGhpcy5zd2FwQ2hhaW4uZ2V0Q3VycmVudFRleHR1cmUoKS5jcmVhdGVWaWV3KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm1haW5Db2xvckF0dGFjaG1lbnRzWzBdLmF0dGFjaG1lbnQgPSBpc1NhZmFyaSA/IC8vIEB0cy1pZ25vcmVcbiAgICAgICAgdGhpcy5zd2FwQ2hhaW4uZ2V0Q3VycmVudFRleHR1cmUoKS5jcmVhdGVEZWZhdWx0VmlldygpIDogdGhpcy5zd2FwQ2hhaW4uZ2V0Q3VycmVudFRleHR1cmUoKS5jcmVhdGVWaWV3KCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuY3VycmVudFJlbmRlclBhc3MgPSB0aGlzLnJlbmRlckVuY29kZXIuYmVnaW5SZW5kZXJQYXNzKHtcbiAgICAgICAgY29sb3JBdHRhY2htZW50czogdGhpcy5tYWluQ29sb3JBdHRhY2htZW50cyxcbiAgICAgICAgZGVwdGhTdGVuY2lsQXR0YWNobWVudDogdGhpcy5tYWluRGVwdGhBdHRhY2htZW50IC8vIFRPRE86IHVzZSBmcmFtZWJ1ZmZlcidzIGRlcHRoICYgc3RlbmNpbFxuXG4gICAgICB9KTtcbiAgICAgIHRoaXMubWFpblJlbmRlclBhc3MgPSB0aGlzLmN1cnJlbnRSZW5kZXJQYXNzO1xuXG4gICAgICBpZiAodGhpcy5jYWNoZWRWaWV3cG9ydCkge1xuICAgICAgICB0aGlzLnZpZXdwb3J0KHRoaXMuY2FjaGVkVmlld3BvcnQpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzdGFydFJlbmRlclRhcmdldFJlbmRlclBhc3NcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc3RhcnRSZW5kZXJUYXJnZXRSZW5kZXJQYXNzKHJlbmRlclRhcmdldCwgY2xlYXJDb2xvciwgY2xlYXJEZXB0aCkge1xuICAgICAgdmFyIF9yZW5kZXJUYXJnZXQkZ2V0JGNvbCwgX3JlbmRlclRhcmdldCRnZXQkZGVwO1xuXG4gICAgICB2YXIgY2xlYXJTdGVuY2lsID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgYXJndW1lbnRzWzNdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbM10gOiBmYWxzZTtcbiAgICAgIHZhciBncHVUZXh0dXJlID0gKF9yZW5kZXJUYXJnZXQkZ2V0JGNvbCA9IHJlbmRlclRhcmdldC5nZXQoKS5jb2xvcikgPT09IG51bGwgfHwgX3JlbmRlclRhcmdldCRnZXQkY29sID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfcmVuZGVyVGFyZ2V0JGdldCRjb2wudGV4dHVyZTtcbiAgICAgIHZhciBjb2xvclRleHR1cmVWaWV3O1xuXG4gICAgICBpZiAoZ3B1VGV4dHVyZSkge1xuICAgICAgICBjb2xvclRleHR1cmVWaWV3ID0gZ3B1VGV4dHVyZS5jcmVhdGVWaWV3KHRoaXMuY3VycmVudFJlbmRlclRhcmdldFZpZXdEZXNjcmlwdG9yKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGRlcHRoU3RlbmNpbFRleHR1cmUgPSAoX3JlbmRlclRhcmdldCRnZXQkZGVwID0gcmVuZGVyVGFyZ2V0LmdldCgpLmRlcHRoKSA9PT0gbnVsbCB8fCBfcmVuZGVyVGFyZ2V0JGdldCRkZXAgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9yZW5kZXJUYXJnZXQkZ2V0JGRlcC50ZXh0dXJlO1xuICAgICAgdmFyIGRlcHRoU3RlbmNpbFRleHR1cmVWaWV3O1xuXG4gICAgICBpZiAoZGVwdGhTdGVuY2lsVGV4dHVyZSkge1xuICAgICAgICBkZXB0aFN0ZW5jaWxUZXh0dXJlVmlldyA9IGRlcHRoU3RlbmNpbFRleHR1cmUuY3JlYXRlVmlldygpO1xuICAgICAgfVxuXG4gICAgICB2YXIgcmVuZGVyUGFzcyA9IHRoaXMucmVuZGVyVGFyZ2V0RW5jb2Rlci5iZWdpblJlbmRlclBhc3Moe1xuICAgICAgICBjb2xvckF0dGFjaG1lbnRzOiBbe1xuICAgICAgICAgIGF0dGFjaG1lbnQ6IGNvbG9yVGV4dHVyZVZpZXcsXG4gICAgICAgICAgbG9hZFZhbHVlOiBjbGVhckNvbG9yICE9PSBudWxsID8gY2xlYXJDb2xvciA6IFdlYkdQVUNvbnN0YW50cy5Mb2FkT3AuTG9hZCxcbiAgICAgICAgICBzdG9yZU9wOiBXZWJHUFVDb25zdGFudHMuU3RvcmVPcC5TdG9yZVxuICAgICAgICB9XSxcbiAgICAgICAgZGVwdGhTdGVuY2lsQXR0YWNobWVudDogZGVwdGhTdGVuY2lsVGV4dHVyZSAmJiBkZXB0aFN0ZW5jaWxUZXh0dXJlVmlldyA/IHtcbiAgICAgICAgICBhdHRhY2htZW50OiBkZXB0aFN0ZW5jaWxUZXh0dXJlVmlldyxcbiAgICAgICAgICBkZXB0aExvYWRWYWx1ZTogY2xlYXJEZXB0aCA/IHRoaXMuY2xlYXJEZXB0aFZhbHVlIDogV2ViR1BVQ29uc3RhbnRzLkxvYWRPcC5Mb2FkLFxuICAgICAgICAgIGRlcHRoU3RvcmVPcDogV2ViR1BVQ29uc3RhbnRzLlN0b3JlT3AuU3RvcmUsXG4gICAgICAgICAgc3RlbmNpbExvYWRWYWx1ZTogY2xlYXJTdGVuY2lsID8gdGhpcy5jbGVhclN0ZW5jaWxWYWx1ZSA6IFdlYkdQVUNvbnN0YW50cy5Mb2FkT3AuTG9hZCxcbiAgICAgICAgICBzdGVuY2lsU3RvcmVPcDogV2ViR1BVQ29uc3RhbnRzLlN0b3JlT3AuU3RvcmVcbiAgICAgICAgfSA6IHVuZGVmaW5lZFxuICAgICAgfSk7XG4gICAgICB0aGlzLmN1cnJlbnRSZW5kZXJQYXNzID0gcmVuZGVyUGFzcztcblxuICAgICAgaWYgKHRoaXMuY2FjaGVkVmlld3BvcnQpIHtcbiAgICAgICAgdGhpcy52aWV3cG9ydCh0aGlzLmNhY2hlZFZpZXdwb3J0KTtcbiAgICAgIH0gLy8gVE9ETyBXRUJHUFUgc2V0IHRoZSBzY2lzc29yIHJlY3QgYW5kIHRoZSBzdGVuY2lsIHJlZmVyZW5jZSB2YWx1ZVxuXG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImVuZE1haW5SZW5kZXJQYXNzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGVuZE1haW5SZW5kZXJQYXNzKCkge1xuICAgICAgaWYgKHRoaXMuY3VycmVudFJlbmRlclBhc3MgPT09IHRoaXMubWFpblJlbmRlclBhc3MgJiYgdGhpcy5jdXJyZW50UmVuZGVyUGFzcyAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLmN1cnJlbnRSZW5kZXJQYXNzLmVuZFBhc3MoKTtcbiAgICAgICAgdGhpcy5yZXNldENhY2hlZFZpZXdwb3J0KCk7XG4gICAgICAgIHRoaXMuY3VycmVudFJlbmRlclBhc3MgPSBudWxsO1xuICAgICAgICB0aGlzLm1haW5SZW5kZXJQYXNzID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZW5kQ29tcHV0ZVBhc3NcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZW5kQ29tcHV0ZVBhc3MoKSB7XG4gICAgICBpZiAodGhpcy5jdXJyZW50Q29tcHV0ZVBhc3MpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50Q29tcHV0ZVBhc3MuZW5kUGFzcygpO1xuICAgICAgICB0aGlzLmN1cnJlbnRDb21wdXRlUGFzcyA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImVuZFJlbmRlclRhcmdldFJlbmRlclBhc3NcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZW5kUmVuZGVyVGFyZ2V0UmVuZGVyUGFzcygpIHtcbiAgICAgIGlmICh0aGlzLmN1cnJlbnRSZW5kZXJQYXNzKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFJlbmRlclBhc3MuZW5kUGFzcygpO1xuICAgICAgICB0aGlzLnJlc2V0Q2FjaGVkVmlld3BvcnQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVzZXRDYWNoZWRWaWV3cG9ydFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZXNldENhY2hlZFZpZXdwb3J0KCkge1xuICAgICAgdGhpcy5jYWNoZWRWaWV3cG9ydCA9IHtcbiAgICAgICAgeDogMCxcbiAgICAgICAgeTogMCxcbiAgICAgICAgd2lkdGg6IDAsXG4gICAgICAgIGhlaWdodDogMFxuICAgICAgfTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidW5iaW5kRnJhbWVidWZmZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdW5iaW5kRnJhbWVidWZmZXIoZnJhbWVidWZmZXIpIHtcbiAgICAgIC8vIHVuYmluZFxuICAgICAgaWYgKHRoaXMuY3VycmVudFJlbmRlclBhc3MgJiYgdGhpcy5jdXJyZW50UmVuZGVyUGFzcyAhPT0gdGhpcy5tYWluUmVuZGVyUGFzcykge1xuICAgICAgICB0aGlzLmVuZFJlbmRlclRhcmdldFJlbmRlclBhc3MoKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy50cmFuc2llbnRWaWV3cG9ydC54ID0gSW5maW5pdHk7XG4gICAgICB0aGlzLmN1cnJlbnRSZW5kZXJUYXJnZXQgPSBudWxsOyAvLyBpZiAodGV4dHVyZS5nZW5lcmF0ZU1pcE1hcHMgJiYgIWRpc2FibGVHZW5lcmF0ZU1pcE1hcHMgJiYgIXRleHR1cmUuaXNDdWJlKSB7XG4gICAgICAvLyAgIHRoaXMuX2dlbmVyYXRlTWlwbWFwcyh0ZXh0dXJlKTtcbiAgICAgIC8vIH1cblxuICAgICAgdGhpcy5jdXJyZW50UmVuZGVyUGFzcyA9IHRoaXMubWFpblJlbmRlclBhc3M7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFdlYkdQVUVuZ2luZTtcbn0oKSwgX3RlbXApKSB8fCBfY2xhc3MpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiaW1wb3J0IHsgV2ViR0xFbmdpbmUgfSBmcm9tICcuL3dlYmdsJztcbmltcG9ydCB7IFdlYkdQVUVuZ2luZSB9IGZyb20gJy4vd2ViZ3B1JztcbmV4cG9ydCB7IFdlYkdMRW5naW5lLCBXZWJHUFVFbmdpbmUgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsImltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrXCI7XG5pbXBvcnQgX2NyZWF0ZUNsYXNzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzXCI7XG5pbXBvcnQgX2luaGVyaXRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2luaGVyaXRzXCI7XG5pbXBvcnQgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4gZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVyblwiO1xuaW1wb3J0IF9nZXRQcm90b3R5cGVPZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9nZXRQcm90b3R5cGVPZlwiO1xuXG52YXIgX2RlYywgX2NsYXNzO1xuXG5mdW5jdGlvbiBfY3JlYXRlU3VwZXIoRGVyaXZlZCkgeyB2YXIgaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCA9IF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKTsgcmV0dXJuIGZ1bmN0aW9uIF9jcmVhdGVTdXBlckludGVybmFsKCkgeyB2YXIgU3VwZXIgPSBfZ2V0UHJvdG90eXBlT2YoRGVyaXZlZCksIHJlc3VsdDsgaWYgKGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QpIHsgdmFyIE5ld1RhcmdldCA9IF9nZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3RvcjsgcmVzdWx0ID0gUmVmbGVjdC5jb25zdHJ1Y3QoU3VwZXIsIGFyZ3VtZW50cywgTmV3VGFyZ2V0KTsgfSBlbHNlIHsgcmVzdWx0ID0gU3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfSByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgcmVzdWx0KTsgfTsgfVxuXG5mdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkgeyBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwidW5kZWZpbmVkXCIgfHwgIVJlZmxlY3QuY29uc3RydWN0KSByZXR1cm4gZmFsc2U7IGlmIChSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKSByZXR1cm4gZmFsc2U7IGlmICh0eXBlb2YgUHJveHkgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHRydWU7IHRyeSB7IERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoRGF0ZSwgW10sIGZ1bmN0aW9uICgpIHt9KSk7IHJldHVybiB0cnVlOyB9IGNhdGNoIChlKSB7IHJldHVybiBmYWxzZTsgfSB9XG5cbmltcG9ydCB7IGdlbmVyYXRlQUFCQkZyb21WZXJ0aWNlcyB9IGZyb20gJ0BhbnR2L2ctd2ViZ3B1LWNvcmUnO1xuaW1wb3J0IHsgdmVjMyB9IGZyb20gJ2dsLW1hdHJpeCc7XG5pbXBvcnQgeyBpbmplY3RhYmxlIH0gZnJvbSAnaW52ZXJzaWZ5JztcbmltcG9ydCB7IEdlb21ldHJ5IH0gZnJvbSAnLic7XG52YXIgcHJpbWl0aXZlVXYxUGFkZGluZyA9IDQuMCAvIDY0O1xudmFyIHByaW1pdGl2ZVV2MVBhZGRpbmdTY2FsZSA9IDEuMCAtIHByaW1pdGl2ZVV2MVBhZGRpbmcgKiAyO1xuZXhwb3J0IHZhclxuLyoqXG4gKiBib3Jyb3cgZnJvbSBwbGF5Y2FudmFzOlxuICogQ3JlYXRlcyBhIHByb2NlZHVyYWwgYm94LXNoYXBlZCBtZXNoXG4gKi9cbkJveCA9IChfZGVjID0gaW5qZWN0YWJsZSgpLCBfZGVjKF9jbGFzcyA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0dlb21ldHJ5KSB7XG4gIF9pbmhlcml0cyhCb3gsIF9HZW9tZXRyeSk7XG5cbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlcihCb3gpO1xuXG4gIGZ1bmN0aW9uIEJveCgpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQm94KTtcblxuICAgIHJldHVybiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhCb3gsIFt7XG4gICAga2V5OiBcIm9uRW50aXR5Q3JlYXRlZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvbkVudGl0eUNyZWF0ZWQoKSB7XG4gICAgICB2YXIgX3RoaXMkY29uZmlnID0gdGhpcy5jb25maWcsXG4gICAgICAgICAgX3RoaXMkY29uZmlnJHdpZHRoU2VnID0gX3RoaXMkY29uZmlnLndpZHRoU2VnbWVudHMsXG4gICAgICAgICAgd2lkdGhTZWdtZW50cyA9IF90aGlzJGNvbmZpZyR3aWR0aFNlZyA9PT0gdm9pZCAwID8gMSA6IF90aGlzJGNvbmZpZyR3aWR0aFNlZyxcbiAgICAgICAgICBfdGhpcyRjb25maWckaGVpZ2h0U2UgPSBfdGhpcyRjb25maWcuaGVpZ2h0U2VnbWVudHMsXG4gICAgICAgICAgaGVpZ2h0U2VnbWVudHMgPSBfdGhpcyRjb25maWckaGVpZ2h0U2UgPT09IHZvaWQgMCA/IDEgOiBfdGhpcyRjb25maWckaGVpZ2h0U2UsXG4gICAgICAgICAgX3RoaXMkY29uZmlnJGRlcHRoU2VnID0gX3RoaXMkY29uZmlnLmRlcHRoU2VnbWVudHMsXG4gICAgICAgICAgZGVwdGhTZWdtZW50cyA9IF90aGlzJGNvbmZpZyRkZXB0aFNlZyA9PT0gdm9pZCAwID8gMSA6IF90aGlzJGNvbmZpZyRkZXB0aFNlZyxcbiAgICAgICAgICBfdGhpcyRjb25maWckaGFsZkV4dGUgPSBfdGhpcyRjb25maWcuaGFsZkV4dGVudHMsXG4gICAgICAgICAgaGFsZkV4dGVudHMgPSBfdGhpcyRjb25maWckaGFsZkV4dGUgPT09IHZvaWQgMCA/IHZlYzMuZnJvbVZhbHVlcygwLjUsIDAuNSwgMC41KSA6IF90aGlzJGNvbmZpZyRoYWxmRXh0ZTtcbiAgICAgIHZhciB3cyA9IHdpZHRoU2VnbWVudHM7XG4gICAgICB2YXIgaHMgPSBoZWlnaHRTZWdtZW50cztcbiAgICAgIHZhciBkcyA9IGRlcHRoU2VnbWVudHM7XG5cbiAgICAgIHZhciBfaGFsZkV4dGVudHMgPSBfc2xpY2VkVG9BcnJheShoYWxmRXh0ZW50cywgMyksXG4gICAgICAgICAgaGV4ID0gX2hhbGZFeHRlbnRzWzBdLFxuICAgICAgICAgIGhleSA9IF9oYWxmRXh0ZW50c1sxXSxcbiAgICAgICAgICBoZXogPSBfaGFsZkV4dGVudHNbMl07XG5cbiAgICAgIHZhciBjb3JuZXJzID0gW3ZlYzMuZnJvbVZhbHVlcygtaGV4LCAtaGV5LCBoZXopLCB2ZWMzLmZyb21WYWx1ZXMoaGV4LCAtaGV5LCBoZXopLCB2ZWMzLmZyb21WYWx1ZXMoaGV4LCBoZXksIGhleiksIHZlYzMuZnJvbVZhbHVlcygtaGV4LCBoZXksIGhleiksIHZlYzMuZnJvbVZhbHVlcyhoZXgsIC1oZXksIC1oZXopLCB2ZWMzLmZyb21WYWx1ZXMoLWhleCwgLWhleSwgLWhleiksIHZlYzMuZnJvbVZhbHVlcygtaGV4LCBoZXksIC1oZXopLCB2ZWMzLmZyb21WYWx1ZXMoaGV4LCBoZXksIC1oZXopXTtcbiAgICAgIHZhciBmYWNlQXhlcyA9IFtbMCwgMSwgM10sIC8vIEZST05UXG4gICAgICBbNCwgNSwgN10sIC8vIEJBQ0tcbiAgICAgIFszLCAyLCA2XSwgLy8gVE9QXG4gICAgICBbMSwgMCwgNF0sIC8vIEJPVFRPTVxuICAgICAgWzEsIDQsIDJdLCAvLyBSSUdIVFxuICAgICAgWzUsIDAsIDZdIC8vIExFRlRcbiAgICAgIF07XG4gICAgICB2YXIgZmFjZU5vcm1hbHMgPSBbWzAsIDAsIDFdLCAvLyBGUk9OVFxuICAgICAgWzAsIDAsIC0xXSwgLy8gQkFDS1xuICAgICAgWzAsIDEsIDBdLCAvLyBUT1BcbiAgICAgIFswLCAtMSwgMF0sIC8vIEJPVFRPTVxuICAgICAgWzEsIDAsIDBdLCAvLyBSSUdIVFxuICAgICAgWy0xLCAwLCAwXSAvLyBMRUZUXG4gICAgICBdO1xuICAgICAgdmFyIHNpZGVzID0ge1xuICAgICAgICBGUk9OVDogMCxcbiAgICAgICAgQkFDSzogMSxcbiAgICAgICAgVE9QOiAyLFxuICAgICAgICBCT1RUT006IDMsXG4gICAgICAgIFJJR0hUOiA0LFxuICAgICAgICBMRUZUOiA1XG4gICAgICB9O1xuICAgICAgdmFyIHBvc2l0aW9ucyA9IFtdO1xuICAgICAgdmFyIG5vcm1hbHMgPSBbXTtcbiAgICAgIHZhciB1dnMgPSBbXTtcbiAgICAgIHZhciB1dnMxID0gW107XG4gICAgICB2YXIgaW5kaWNlcyA9IFtdO1xuICAgICAgdmFyIHZjb3VudGVyID0gMDtcblxuICAgICAgdmFyIGdlbmVyYXRlRmFjZSA9IGZ1bmN0aW9uIGdlbmVyYXRlRmFjZShzaWRlLCB1U2VnbWVudHMsIHZTZWdtZW50cykge1xuICAgICAgICB2YXIgdTtcbiAgICAgICAgdmFyIHY7XG4gICAgICAgIHZhciBpO1xuICAgICAgICB2YXIgajtcblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDw9IHVTZWdtZW50czsgaSsrKSB7XG4gICAgICAgICAgZm9yIChqID0gMDsgaiA8PSB2U2VnbWVudHM7IGorKykge1xuICAgICAgICAgICAgdmFyIHRlbXAxID0gdmVjMy5jcmVhdGUoKTtcbiAgICAgICAgICAgIHZhciB0ZW1wMiA9IHZlYzMuY3JlYXRlKCk7XG4gICAgICAgICAgICB2YXIgdGVtcDMgPSB2ZWMzLmNyZWF0ZSgpO1xuICAgICAgICAgICAgdmFyIHIgPSB2ZWMzLmNyZWF0ZSgpO1xuICAgICAgICAgICAgdmVjMy5sZXJwKHRlbXAxLCBjb3JuZXJzW2ZhY2VBeGVzW3NpZGVdWzBdXSwgY29ybmVyc1tmYWNlQXhlc1tzaWRlXVsxXV0sIGkgLyB1U2VnbWVudHMpO1xuICAgICAgICAgICAgdmVjMy5sZXJwKHRlbXAyLCBjb3JuZXJzW2ZhY2VBeGVzW3NpZGVdWzBdXSwgY29ybmVyc1tmYWNlQXhlc1tzaWRlXVsyXV0sIGogLyB2U2VnbWVudHMpO1xuICAgICAgICAgICAgdmVjMy5zdWIodGVtcDMsIHRlbXAyLCBjb3JuZXJzW2ZhY2VBeGVzW3NpZGVdWzBdXSk7XG4gICAgICAgICAgICB2ZWMzLmFkZChyLCB0ZW1wMSwgdGVtcDMpO1xuICAgICAgICAgICAgdSA9IGkgLyB1U2VnbWVudHM7XG4gICAgICAgICAgICB2ID0gaiAvIHZTZWdtZW50cztcbiAgICAgICAgICAgIHBvc2l0aW9ucy5wdXNoKHJbMF0sIHJbMV0sIHJbMl0pO1xuICAgICAgICAgICAgbm9ybWFscy5wdXNoKGZhY2VOb3JtYWxzW3NpZGVdWzBdLCBmYWNlTm9ybWFsc1tzaWRlXVsxXSwgZmFjZU5vcm1hbHNbc2lkZV1bMl0pO1xuICAgICAgICAgICAgdXZzLnB1c2godSwgdik7IC8vIHBhY2sgYXMgM3gyXG4gICAgICAgICAgICAvLyAxLzMgd2lsbCBiZSBlbXB0eSwgYnV0IGl0J3MgZWl0aGVyIHRoYXQgb3Igc3RyZXRjaGVkIHBpeGVsc1xuICAgICAgICAgICAgLy8gVE9ETzogZ2VuZXJhdGUgbm9uLXJlY3Rhbmd1bGFyIGxpZ2h0TWFwcywgc28gd2UgY291bGQgdXNlIHNwYWNlIHdpdGhvdXQgc3RyZXRjaGluZ1xuXG4gICAgICAgICAgICB1IC89IDM7XG4gICAgICAgICAgICB2IC89IDM7XG4gICAgICAgICAgICB1ID0gdSAqIHByaW1pdGl2ZVV2MVBhZGRpbmdTY2FsZSArIHByaW1pdGl2ZVV2MVBhZGRpbmc7XG4gICAgICAgICAgICB2ID0gdiAqIHByaW1pdGl2ZVV2MVBhZGRpbmdTY2FsZSArIHByaW1pdGl2ZVV2MVBhZGRpbmc7XG4gICAgICAgICAgICB1ICs9IHNpZGUgJSAzIC8gMztcbiAgICAgICAgICAgIHYgKz0gTWF0aC5mbG9vcihzaWRlIC8gMykgLyAzO1xuICAgICAgICAgICAgdXZzMS5wdXNoKHUsIHYpO1xuXG4gICAgICAgICAgICBpZiAoaSA8IHVTZWdtZW50cyAmJiBqIDwgdlNlZ21lbnRzKSB7XG4gICAgICAgICAgICAgIGluZGljZXMucHVzaCh2Y291bnRlciArIHZTZWdtZW50cyArIDEsIHZjb3VudGVyICsgMSwgdmNvdW50ZXIpO1xuICAgICAgICAgICAgICBpbmRpY2VzLnB1c2godmNvdW50ZXIgKyB2U2VnbWVudHMgKyAxLCB2Y291bnRlciArIHZTZWdtZW50cyArIDIsIHZjb3VudGVyICsgMSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZjb3VudGVyKys7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBnZW5lcmF0ZUZhY2Uoc2lkZXMuRlJPTlQsIHdzLCBocyk7XG4gICAgICBnZW5lcmF0ZUZhY2Uoc2lkZXMuQkFDSywgd3MsIGhzKTtcbiAgICAgIGdlbmVyYXRlRmFjZShzaWRlcy5UT1AsIHdzLCBkcyk7XG4gICAgICBnZW5lcmF0ZUZhY2Uoc2lkZXMuQk9UVE9NLCB3cywgZHMpO1xuICAgICAgZ2VuZXJhdGVGYWNlKHNpZGVzLlJJR0hULCBkcywgaHMpO1xuICAgICAgZ2VuZXJhdGVGYWNlKHNpZGVzLkxFRlQsIGRzLCBocyk7IC8vIGdlbmVyYXRlIEFBQkJcblxuICAgICAgdmFyIGFhYmIgPSBnZW5lcmF0ZUFBQkJGcm9tVmVydGljZXMocG9zaXRpb25zKTtcbiAgICAgIHZhciBjb21wb25lbnQgPSB0aGlzLmdldENvbXBvbmVudCgpO1xuICAgICAgY29tcG9uZW50LmluZGljZXMgPSBVaW50MzJBcnJheS5mcm9tKGluZGljZXMpO1xuICAgICAgY29tcG9uZW50LmFhYmIgPSBhYWJiO1xuICAgICAgY29tcG9uZW50LnZlcnRleENvdW50ID0gdmNvdW50ZXI7XG4gICAgICBjb21wb25lbnQuYXR0cmlidXRlcyA9IFt7XG4gICAgICAgIGRpcnR5OiB0cnVlLFxuICAgICAgICBuYW1lOiAncG9zaXRpb24nLFxuICAgICAgICBkYXRhOiBGbG9hdDMyQXJyYXkuZnJvbShwb3NpdGlvbnMpLFxuICAgICAgICBhcnJheVN0cmlkZTogNCAqIDMsXG4gICAgICAgIHN0ZXBNb2RlOiAndmVydGV4JyxcbiAgICAgICAgYXR0cmlidXRlczogW3tcbiAgICAgICAgICBzaGFkZXJMb2NhdGlvbjogMCxcbiAgICAgICAgICBvZmZzZXQ6IDAsXG4gICAgICAgICAgZm9ybWF0OiAnZmxvYXQzJ1xuICAgICAgICB9XVxuICAgICAgfSwge1xuICAgICAgICBkaXJ0eTogdHJ1ZSxcbiAgICAgICAgbmFtZTogJ25vcm1hbCcsXG4gICAgICAgIGRhdGE6IEZsb2F0MzJBcnJheS5mcm9tKG5vcm1hbHMpLFxuICAgICAgICBhcnJheVN0cmlkZTogNCAqIDMsXG4gICAgICAgIHN0ZXBNb2RlOiAndmVydGV4JyxcbiAgICAgICAgYXR0cmlidXRlczogW3tcbiAgICAgICAgICBzaGFkZXJMb2NhdGlvbjogMSxcbiAgICAgICAgICBvZmZzZXQ6IDAsXG4gICAgICAgICAgZm9ybWF0OiAnZmxvYXQzJ1xuICAgICAgICB9XVxuICAgICAgfSwge1xuICAgICAgICBkaXJ0eTogdHJ1ZSxcbiAgICAgICAgbmFtZTogJ3V2JyxcbiAgICAgICAgZGF0YTogRmxvYXQzMkFycmF5LmZyb20odXZzKSxcbiAgICAgICAgYXJyYXlTdHJpZGU6IDQgKiAyLFxuICAgICAgICBzdGVwTW9kZTogJ3ZlcnRleCcsXG4gICAgICAgIGF0dHJpYnV0ZXM6IFt7XG4gICAgICAgICAgc2hhZGVyTG9jYXRpb246IDIsXG4gICAgICAgICAgb2Zmc2V0OiAwLFxuICAgICAgICAgIGZvcm1hdDogJ2Zsb2F0MidcbiAgICAgICAgfV1cbiAgICAgIH1dOyAvLyBUT0RPOiBiYXJ5Y2VudHJpYyAmIHRhbmdlbnRcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gQm94O1xufShHZW9tZXRyeSkpIHx8IF9jbGFzcyk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Cb3guanMubWFwIiwiZXhwb3J0IGZ1bmN0aW9uIG1lcmdlKGEsIGIpIHtcbiAgLy8gQ2hlY2tzIGZvciB0cnV0aHkgdmFsdWVzIG9uIGJvdGggYXJyYXlzXG4gIGlmICghYSAmJiAhYikge1xuICAgIHRocm93IG5ldyBFcnJvcignUGxlYXNlIHNwZWNpZnkgdmFsaWQgYXJndW1lbnRzIGZvciBwYXJhbWV0ZXJzIGEgYW5kIGIuJyk7XG4gIH0gLy8gQ2hlY2tzIGZvciB0cnV0aHkgdmFsdWVzIG9yIGVtcHR5IGFycmF5cyBvbiBlYWNoIGFyZ3VtZW50XG4gIC8vIHRvIGF2b2lkIHRoZSB1bm5lY2Vzc2FyeSBjb25zdHJ1Y3Rpb24gb2YgYSBuZXcgYXJyYXkgYW5kXG4gIC8vIHRoZSB0eXBlIGNvbXBhcmlzb25cblxuXG4gIGlmICghYiB8fCBiLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBhO1xuICB9XG5cbiAgaWYgKCFhIHx8IGEubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIGI7XG4gIH0gLy8gTWFrZSBzdXJlIHRoYXQgYm90aCB0eXBlZCBhcnJheXMgYXJlIG9mIHRoZSBzYW1lIHR5cGVcblxuXG4gIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYSkgIT09IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChiKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignVGhlIHR5cGVzIG9mIHRoZSB0d28gYXJndW1lbnRzIHBhc3NlZCBmb3IgcGFyYW1ldGVycyBhIGFuZCBiIGRvIG5vdCBtYXRjaC4nKTtcbiAgfSAvLyBAdHMtaWdub3JlXG5cblxuICB2YXIgYyA9IG5ldyBhLmNvbnN0cnVjdG9yKGEubGVuZ3RoICsgYi5sZW5ndGgpO1xuICBjLnNldChhKTtcbiAgYy5zZXQoYiwgYS5sZW5ndGgpO1xuICByZXR1cm4gYztcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXR5cGVkYXJyYXkuanMubWFwIiwiaW1wb3J0IF90b0NvbnN1bWFibGVBcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy90b0NvbnN1bWFibGVBcnJheVwiO1xuaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzc1wiO1xuaW1wb3J0IF9pbmhlcml0cyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbmhlcml0c1wiO1xuaW1wb3J0IF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm5cIjtcbmltcG9ydCBfZ2V0UHJvdG90eXBlT2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZ2V0UHJvdG90eXBlT2ZcIjtcblxudmFyIF9kZWMsIF9jbGFzcztcblxuZnVuY3Rpb24gX2NyZWF0ZVN1cGVyKERlcml2ZWQpIHsgdmFyIGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QgPSBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCk7IHJldHVybiBmdW5jdGlvbiBfY3JlYXRlU3VwZXJJbnRlcm5hbCgpIHsgdmFyIFN1cGVyID0gX2dldFByb3RvdHlwZU9mKERlcml2ZWQpLCByZXN1bHQ7IGlmIChoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KSB7IHZhciBOZXdUYXJnZXQgPSBfZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3I7IHJlc3VsdCA9IFJlZmxlY3QuY29uc3RydWN0KFN1cGVyLCBhcmd1bWVudHMsIE5ld1RhcmdldCk7IH0gZWxzZSB7IHJlc3VsdCA9IFN1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH0gcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIHJlc3VsdCk7IH07IH1cblxuZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpIHsgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcInVuZGVmaW5lZFwiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlOyBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlOyBpZiAodHlwZW9mIFByb3h5ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiB0cnVlOyB0cnkgeyBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfVxuXG5pbXBvcnQgeyBBQUJCIH0gZnJvbSAnQGFudHYvZy13ZWJncHUtY29yZSc7XG5pbXBvcnQgeyBpbmplY3RhYmxlIH0gZnJvbSAnaW52ZXJzaWZ5JztcbmltcG9ydCB7IEdlb21ldHJ5IH0gZnJvbSAnLic7XG5pbXBvcnQgeyBpc051bWJlciB9IGZyb20gJy4uL3V0aWxzL2lzLW51bWJlcic7XG5pbXBvcnQgeyBpc1R5cGVkQXJyYXkgfSBmcm9tICcuLi91dGlscy9pcy10eXBlZGFycmF5JztcbmltcG9ydCB7IG1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvdHlwZWRhcnJheSc7XG5leHBvcnQgdmFyXG4vKipcbiAqIG1lcmdlIG1hbnkgZ2VvbWV0cmllcyBpbnRvIG9uZSwgdXNlIGEgYmF0Y2ggb2YgZHJhdyBjYWxsc1xuICovXG5NZXJnZWQgPSAoX2RlYyA9IGluamVjdGFibGUoKSwgX2RlYyhfY2xhc3MgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9HZW9tZXRyeSkge1xuICBfaW5oZXJpdHMoTWVyZ2VkLCBfR2VvbWV0cnkpO1xuXG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoTWVyZ2VkKTtcblxuICBmdW5jdGlvbiBNZXJnZWQoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIE1lcmdlZCk7XG5cbiAgICByZXR1cm4gX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoTWVyZ2VkLCBbe1xuICAgIGtleTogXCJvbkVudGl0eUNyZWF0ZWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gb25FbnRpdHlDcmVhdGVkKCkge1xuICAgICAgdmFyIF90aGlzJGNvbmZpZyRnZW9tZXRyaSA9IHRoaXMuY29uZmlnLmdlb21ldHJpZXMsXG4gICAgICAgICAgZ2VvbWV0cmllcyA9IF90aGlzJGNvbmZpZyRnZW9tZXRyaSA9PT0gdm9pZCAwID8gW10gOiBfdGhpcyRjb25maWckZ2VvbWV0cmk7XG4gICAgICB2YXIgbWVyZ2VkQ29tcG9uZW50ID0gdGhpcy5nZXRDb21wb25lbnQoKTtcbiAgICAgIG1lcmdlZENvbXBvbmVudC5hYWJiID0gbmV3IEFBQkIoKTtcbiAgICAgIHZhciBtZXJnZWRBdHRyaWJ1dGVzID0gW107XG4gICAgICB2YXIgbWVyZ2VkSW5kaWNlcyA9IFtdO1xuICAgICAgdmFyIGluZGV4T2Zmc2V0ID0gMDtcbiAgICAgIGdlb21ldHJpZXMuZm9yRWFjaChmdW5jdGlvbiAoZ2VvbWV0cnkpIHtcbiAgICAgICAgdmFyIGFhYmIgPSBnZW9tZXRyeS5hYWJiLFxuICAgICAgICAgICAgaW5kaWNlcyA9IGdlb21ldHJ5LmluZGljZXMsXG4gICAgICAgICAgICB2ZXJ0ZXhDb3VudCA9IGdlb21ldHJ5LnZlcnRleENvdW50LFxuICAgICAgICAgICAgYXR0cmlidXRlcyA9IGdlb21ldHJ5LmF0dHJpYnV0ZXM7IC8vIG1lcmdlIGFhYmJcblxuICAgICAgICBtZXJnZWRDb21wb25lbnQuYWFiYi5hZGQoYWFiYik7XG4gICAgICAgIG1lcmdlZENvbXBvbmVudC52ZXJ0ZXhDb3VudCArPSB2ZXJ0ZXhDb3VudDsgLy8gbWVyZ2UgaW5kaWNlc1xuXG4gICAgICAgIGlmIChpbmRpY2VzKSB7XG4gICAgICAgICAgbWVyZ2VkSW5kaWNlcy5wdXNoLmFwcGx5KG1lcmdlZEluZGljZXMsIF90b0NvbnN1bWFibGVBcnJheShpbmRpY2VzLm1hcChmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICAgICAgICAgIHJldHVybiBpbmRleCArIGluZGV4T2Zmc2V0O1xuICAgICAgICAgIH0pKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpbmRleE9mZnNldCArPSB2ZXJ0ZXhDb3VudDsgLy8gbWVyZ2UgYXR0cmlidXRlc1xuXG4gICAgICAgIGF0dHJpYnV0ZXMuZm9yRWFjaChmdW5jdGlvbiAoYXR0cmlidXRlLCBpKSB7XG4gICAgICAgICAgaWYgKCFtZXJnZWRBdHRyaWJ1dGVzW2ldKSB7XG4gICAgICAgICAgICBtZXJnZWRBdHRyaWJ1dGVzW2ldID0gYXR0cmlidXRlO1xuICAgICAgICAgICAgbWVyZ2VkQXR0cmlidXRlc1tpXS5kaXJ0eSA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChhdHRyaWJ1dGUuZGF0YSkge1xuICAgICAgICAgICAgICBpZiAoaXNOdW1iZXIoYXR0cmlidXRlLmRhdGEpKSB7XG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIG1lcmdlZEF0dHJpYnV0ZXNbaV0ucHVzaChhdHRyaWJ1dGUuZGF0YSk7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNUeXBlZEFycmF5KGF0dHJpYnV0ZS5kYXRhKSkge1xuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICBtZXJnZWRBdHRyaWJ1dGVzW2ldLmRhdGEgPSBtZXJnZSggLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIG1lcmdlZEF0dHJpYnV0ZXNbaV0uZGF0YSwgYXR0cmlidXRlLmRhdGEpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICBtZXJnZWRBdHRyaWJ1dGVzW2ldLmRhdGEgPSBtZXJnZWRBdHRyaWJ1dGVzW2ldLmRhdGEuY29uY2F0KGF0dHJpYnV0ZS5kYXRhKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIG1lcmdlZENvbXBvbmVudC5hdHRyaWJ1dGVzID0gbWVyZ2VkQXR0cmlidXRlcztcbiAgICAgIG1lcmdlZENvbXBvbmVudC5pbmRpY2VzID0gVWludDMyQXJyYXkuZnJvbShtZXJnZWRJbmRpY2VzKTtcbiAgICAgIG1lcmdlZENvbXBvbmVudC5kaXJ0eSA9IHRydWU7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIE1lcmdlZDtcbn0oR2VvbWV0cnkpKSB8fCBfY2xhc3MpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TWVyZ2VkLmpzLm1hcCIsImltcG9ydCBfY2xhc3NDYWxsQ2hlY2sgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2tcIjtcbmltcG9ydCBfY3JlYXRlQ2xhc3MgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlQ2xhc3NcIjtcbmltcG9ydCBfaW5oZXJpdHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHNcIjtcbmltcG9ydCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuXCI7XG5pbXBvcnQgX2dldFByb3RvdHlwZU9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2dldFByb3RvdHlwZU9mXCI7XG5cbnZhciBfZGVjLCBfY2xhc3M7XG5cbmZ1bmN0aW9uIF9jcmVhdGVTdXBlcihEZXJpdmVkKSB7IHZhciBoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0ID0gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpOyByZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKSB7IHZhciBTdXBlciA9IF9nZXRQcm90b3R5cGVPZihEZXJpdmVkKSwgcmVzdWx0OyBpZiAoaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCkgeyB2YXIgTmV3VGFyZ2V0ID0gX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yOyByZXN1bHQgPSBSZWZsZWN0LmNvbnN0cnVjdChTdXBlciwgYXJndW1lbnRzLCBOZXdUYXJnZXQpOyB9IGVsc2UgeyByZXN1bHQgPSBTdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9IHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCByZXN1bHQpOyB9OyB9XG5cbmZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7IGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpIHJldHVybiBmYWxzZTsgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTsgaWYgKHR5cGVvZiBQcm94eSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdHJ1ZTsgdHJ5IHsgRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLCBbXSwgZnVuY3Rpb24gKCkge30pKTsgcmV0dXJuIHRydWU7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9IH1cblxuaW1wb3J0IHsgZ2VuZXJhdGVBQUJCRnJvbVZlcnRpY2VzIH0gZnJvbSAnQGFudHYvZy13ZWJncHUtY29yZSc7XG5pbXBvcnQgeyBpbmplY3RhYmxlIH0gZnJvbSAnaW52ZXJzaWZ5JztcbmltcG9ydCB7IEdlb21ldHJ5IH0gZnJvbSAnLic7XG5leHBvcnQgdmFyXG4vKipcbiAqIGJvcnJvdyBmcm9tIHBsYXljYW52YXNcbiAqL1xuUGxhbmUgPSAoX2RlYyA9IGluamVjdGFibGUoKSwgX2RlYyhfY2xhc3MgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9HZW9tZXRyeSkge1xuICBfaW5oZXJpdHMoUGxhbmUsIF9HZW9tZXRyeSk7XG5cbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlcihQbGFuZSk7XG5cbiAgZnVuY3Rpb24gUGxhbmUoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFBsYW5lKTtcblxuICAgIHJldHVybiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhQbGFuZSwgW3tcbiAgICBrZXk6IFwib25FbnRpdHlDcmVhdGVkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG9uRW50aXR5Q3JlYXRlZCgpIHtcbiAgICAgIHZhciBfdGhpcyRjb25maWcgPSB0aGlzLmNvbmZpZyxcbiAgICAgICAgICBfdGhpcyRjb25maWckaGFsZkV4dGUgPSBfdGhpcyRjb25maWcuaGFsZkV4dGVudHMsXG4gICAgICAgICAgaGFsZkV4dGVudHMgPSBfdGhpcyRjb25maWckaGFsZkV4dGUgPT09IHZvaWQgMCA/IFswLjUsIDAuNV0gOiBfdGhpcyRjb25maWckaGFsZkV4dGUsXG4gICAgICAgICAgX3RoaXMkY29uZmlnJHdpZHRoU2VnID0gX3RoaXMkY29uZmlnLndpZHRoU2VnbWVudHMsXG4gICAgICAgICAgd2lkdGhTZWdtZW50cyA9IF90aGlzJGNvbmZpZyR3aWR0aFNlZyA9PT0gdm9pZCAwID8gNSA6IF90aGlzJGNvbmZpZyR3aWR0aFNlZyxcbiAgICAgICAgICBfdGhpcyRjb25maWckbGVuZ3RoU2UgPSBfdGhpcyRjb25maWcubGVuZ3RoU2VnbWVudHMsXG4gICAgICAgICAgbGVuZ3RoU2VnbWVudHMgPSBfdGhpcyRjb25maWckbGVuZ3RoU2UgPT09IHZvaWQgMCA/IDUgOiBfdGhpcyRjb25maWckbGVuZ3RoU2U7XG4gICAgICB2YXIgcG9zaXRpb25zID0gW107XG4gICAgICB2YXIgbm9ybWFscyA9IFtdO1xuICAgICAgdmFyIHV2cyA9IFtdO1xuICAgICAgdmFyIGluZGljZXMgPSBbXTtcbiAgICAgIHZhciB2Y291bnRlciA9IDA7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDw9IHdpZHRoU2VnbWVudHM7IGkrKykge1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8PSBsZW5ndGhTZWdtZW50czsgaisrKSB7XG4gICAgICAgICAgdmFyIHggPSAtaGFsZkV4dGVudHNbMF0gKyAyLjAgKiBoYWxmRXh0ZW50c1swXSAqIGkgLyB3aWR0aFNlZ21lbnRzO1xuICAgICAgICAgIHZhciB5ID0gMC4wO1xuICAgICAgICAgIHZhciB6ID0gLSgtaGFsZkV4dGVudHNbMV0gKyAyLjAgKiBoYWxmRXh0ZW50c1sxXSAqIGogLyBsZW5ndGhTZWdtZW50cyk7XG4gICAgICAgICAgdmFyIHUgPSBpIC8gd2lkdGhTZWdtZW50cztcbiAgICAgICAgICB2YXIgdiA9IGogLyBsZW5ndGhTZWdtZW50cztcbiAgICAgICAgICBwb3NpdGlvbnMucHVzaCh4LCB5LCB6KTtcbiAgICAgICAgICBub3JtYWxzLnB1c2goMC4wLCAxLjAsIDAuMCk7XG4gICAgICAgICAgdXZzLnB1c2godSwgdik7XG5cbiAgICAgICAgICBpZiAoaSA8IHdpZHRoU2VnbWVudHMgJiYgaiA8IGxlbmd0aFNlZ21lbnRzKSB7XG4gICAgICAgICAgICBpbmRpY2VzLnB1c2godmNvdW50ZXIgKyBsZW5ndGhTZWdtZW50cyArIDEsIHZjb3VudGVyICsgMSwgdmNvdW50ZXIpO1xuICAgICAgICAgICAgaW5kaWNlcy5wdXNoKHZjb3VudGVyICsgbGVuZ3RoU2VnbWVudHMgKyAxLCB2Y291bnRlciArIGxlbmd0aFNlZ21lbnRzICsgMiwgdmNvdW50ZXIgKyAxKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2Y291bnRlcisrO1xuICAgICAgICB9XG4gICAgICB9IC8vIGdlbmVyYXRlIEFBQkJcblxuXG4gICAgICB2YXIgYWFiYiA9IGdlbmVyYXRlQUFCQkZyb21WZXJ0aWNlcyhwb3NpdGlvbnMpO1xuICAgICAgdmFyIGNvbXBvbmVudCA9IHRoaXMuZ2V0Q29tcG9uZW50KCk7XG4gICAgICBjb21wb25lbnQuaW5kaWNlcyA9IFVpbnQzMkFycmF5LmZyb20oaW5kaWNlcyk7XG4gICAgICBjb21wb25lbnQuYWFiYiA9IGFhYmI7XG4gICAgICBjb21wb25lbnQudmVydGV4Q291bnQgPSB2Y291bnRlcjtcbiAgICAgIGNvbXBvbmVudC5hdHRyaWJ1dGVzID0gW3tcbiAgICAgICAgZGlydHk6IHRydWUsXG4gICAgICAgIG5hbWU6ICdwb3NpdGlvbicsXG4gICAgICAgIGRhdGE6IEZsb2F0MzJBcnJheS5mcm9tKHBvc2l0aW9ucyksXG4gICAgICAgIGFycmF5U3RyaWRlOiA0ICogMyxcbiAgICAgICAgc3RlcE1vZGU6ICd2ZXJ0ZXgnLFxuICAgICAgICBhdHRyaWJ1dGVzOiBbe1xuICAgICAgICAgIHNoYWRlckxvY2F0aW9uOiAwLFxuICAgICAgICAgIG9mZnNldDogMCxcbiAgICAgICAgICBmb3JtYXQ6ICdmbG9hdDMnXG4gICAgICAgIH1dXG4gICAgICB9LCB7XG4gICAgICAgIGRpcnR5OiB0cnVlLFxuICAgICAgICBuYW1lOiAnbm9ybWFsJyxcbiAgICAgICAgZGF0YTogRmxvYXQzMkFycmF5LmZyb20obm9ybWFscyksXG4gICAgICAgIGFycmF5U3RyaWRlOiA0ICogMyxcbiAgICAgICAgc3RlcE1vZGU6ICd2ZXJ0ZXgnLFxuICAgICAgICBhdHRyaWJ1dGVzOiBbe1xuICAgICAgICAgIHNoYWRlckxvY2F0aW9uOiAxLFxuICAgICAgICAgIG9mZnNldDogMCxcbiAgICAgICAgICBmb3JtYXQ6ICdmbG9hdDMnXG4gICAgICAgIH1dXG4gICAgICB9LCB7XG4gICAgICAgIGRpcnR5OiB0cnVlLFxuICAgICAgICBuYW1lOiAndXYnLFxuICAgICAgICBkYXRhOiBGbG9hdDMyQXJyYXkuZnJvbSh1dnMpLFxuICAgICAgICBhcnJheVN0cmlkZTogNCAqIDIsXG4gICAgICAgIHN0ZXBNb2RlOiAndmVydGV4JyxcbiAgICAgICAgYXR0cmlidXRlczogW3tcbiAgICAgICAgICBzaGFkZXJMb2NhdGlvbjogMixcbiAgICAgICAgICBvZmZzZXQ6IDAsXG4gICAgICAgICAgZm9ybWF0OiAnZmxvYXQyJ1xuICAgICAgICB9XVxuICAgICAgfV07IC8vIFRPRE86IGJhcnljZW50cmljICYgdGFuZ2VudFxuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBQbGFuZTtcbn0oR2VvbWV0cnkpKSB8fCBfY2xhc3MpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UGxhbmUuanMubWFwIiwiaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzc1wiO1xuaW1wb3J0IF9pbmhlcml0cyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbmhlcml0c1wiO1xuaW1wb3J0IF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm5cIjtcbmltcG9ydCBfZ2V0UHJvdG90eXBlT2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZ2V0UHJvdG90eXBlT2ZcIjtcblxudmFyIF9kZWMsIF9jbGFzcztcblxuZnVuY3Rpb24gX2NyZWF0ZVN1cGVyKERlcml2ZWQpIHsgdmFyIGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QgPSBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCk7IHJldHVybiBmdW5jdGlvbiBfY3JlYXRlU3VwZXJJbnRlcm5hbCgpIHsgdmFyIFN1cGVyID0gX2dldFByb3RvdHlwZU9mKERlcml2ZWQpLCByZXN1bHQ7IGlmIChoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KSB7IHZhciBOZXdUYXJnZXQgPSBfZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3I7IHJlc3VsdCA9IFJlZmxlY3QuY29uc3RydWN0KFN1cGVyLCBhcmd1bWVudHMsIE5ld1RhcmdldCk7IH0gZWxzZSB7IHJlc3VsdCA9IFN1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH0gcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIHJlc3VsdCk7IH07IH1cblxuZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpIHsgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcInVuZGVmaW5lZFwiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlOyBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlOyBpZiAodHlwZW9mIFByb3h5ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiB0cnVlOyB0cnkgeyBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfVxuXG5pbXBvcnQgeyBnZW5lcmF0ZUFBQkJGcm9tVmVydGljZXMgfSBmcm9tICdAYW50di9nLXdlYmdwdS1jb3JlJztcbmltcG9ydCB7IGluamVjdGFibGUgfSBmcm9tICdpbnZlcnNpZnknO1xuaW1wb3J0IHsgR2VvbWV0cnkgfSBmcm9tICcuJztcbmV4cG9ydCB2YXJcbi8qKlxuICogYm9ycm93IGZyb20gcGxheWNhbnZhc1xuICovXG5TcGhlcmUgPSAoX2RlYyA9IGluamVjdGFibGUoKSwgX2RlYyhfY2xhc3MgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9HZW9tZXRyeSkge1xuICBfaW5oZXJpdHMoU3BoZXJlLCBfR2VvbWV0cnkpO1xuXG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoU3BoZXJlKTtcblxuICBmdW5jdGlvbiBTcGhlcmUoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFNwaGVyZSk7XG5cbiAgICByZXR1cm4gX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoU3BoZXJlLCBbe1xuICAgIGtleTogXCJvbkVudGl0eUNyZWF0ZWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gb25FbnRpdHlDcmVhdGVkKCkge1xuICAgICAgdmFyIF90aGlzJGNvbmZpZyA9IHRoaXMuY29uZmlnLFxuICAgICAgICAgIF90aGlzJGNvbmZpZyRyYWRpdXMgPSBfdGhpcyRjb25maWcucmFkaXVzLFxuICAgICAgICAgIHJhZGl1cyA9IF90aGlzJGNvbmZpZyRyYWRpdXMgPT09IHZvaWQgMCA/IDAuNSA6IF90aGlzJGNvbmZpZyRyYWRpdXMsXG4gICAgICAgICAgX3RoaXMkY29uZmlnJGxhdGl0dWRlID0gX3RoaXMkY29uZmlnLmxhdGl0dWRlQmFuZHMsXG4gICAgICAgICAgbGF0aXR1ZGVCYW5kcyA9IF90aGlzJGNvbmZpZyRsYXRpdHVkZSA9PT0gdm9pZCAwID8gMTYgOiBfdGhpcyRjb25maWckbGF0aXR1ZGUsXG4gICAgICAgICAgX3RoaXMkY29uZmlnJGxvbmdpdHVkID0gX3RoaXMkY29uZmlnLmxvbmdpdHVkZUJhbmRzLFxuICAgICAgICAgIGxvbmdpdHVkZUJhbmRzID0gX3RoaXMkY29uZmlnJGxvbmdpdHVkID09PSB2b2lkIDAgPyAxNiA6IF90aGlzJGNvbmZpZyRsb25naXR1ZDtcbiAgICAgIHZhciBwb3NpdGlvbnMgPSBbXTtcbiAgICAgIHZhciBub3JtYWxzID0gW107XG4gICAgICB2YXIgdXZzID0gW107XG4gICAgICB2YXIgaW5kaWNlcyA9IFtdO1xuXG4gICAgICBmb3IgKHZhciBsYXQgPSAwOyBsYXQgPD0gbGF0aXR1ZGVCYW5kczsgbGF0KyspIHtcbiAgICAgICAgdmFyIHRoZXRhID0gbGF0ICogTWF0aC5QSSAvIGxhdGl0dWRlQmFuZHM7XG4gICAgICAgIHZhciBzaW5UaGV0YSA9IE1hdGguc2luKHRoZXRhKTtcbiAgICAgICAgdmFyIGNvc1RoZXRhID0gTWF0aC5jb3ModGhldGEpO1xuXG4gICAgICAgIGZvciAodmFyIGxvbiA9IDA7IGxvbiA8PSBsb25naXR1ZGVCYW5kczsgbG9uKyspIHtcbiAgICAgICAgICAvLyBTd2VlcCB0aGUgc3BoZXJlIGZyb20gdGhlIHBvc2l0aXZlIFogYXhpcyB0byBtYXRjaCBhIDNEUyBNYXggc3BoZXJlXG4gICAgICAgICAgdmFyIHBoaSA9IGxvbiAqIDIgKiBNYXRoLlBJIC8gbG9uZ2l0dWRlQmFuZHMgLSBNYXRoLlBJIC8gMi4wO1xuICAgICAgICAgIHZhciBzaW5QaGkgPSBNYXRoLnNpbihwaGkpO1xuICAgICAgICAgIHZhciBjb3NQaGkgPSBNYXRoLmNvcyhwaGkpO1xuICAgICAgICAgIHZhciB4ID0gY29zUGhpICogc2luVGhldGE7XG4gICAgICAgICAgdmFyIHkgPSBjb3NUaGV0YTtcbiAgICAgICAgICB2YXIgeiA9IHNpblBoaSAqIHNpblRoZXRhO1xuICAgICAgICAgIHZhciB1ID0gMS4wIC0gbG9uIC8gbG9uZ2l0dWRlQmFuZHM7XG4gICAgICAgICAgdmFyIHYgPSAxLjAgLSBsYXQgLyBsYXRpdHVkZUJhbmRzO1xuICAgICAgICAgIHBvc2l0aW9ucy5wdXNoKHggKiByYWRpdXMsIHkgKiByYWRpdXMsIHogKiByYWRpdXMpO1xuICAgICAgICAgIG5vcm1hbHMucHVzaCh4LCB5LCB6KTtcbiAgICAgICAgICB1dnMucHVzaCh1LCB2KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBfbGF0ID0gMDsgX2xhdCA8IGxhdGl0dWRlQmFuZHM7ICsrX2xhdCkge1xuICAgICAgICBmb3IgKHZhciBfbG9uID0gMDsgX2xvbiA8IGxvbmdpdHVkZUJhbmRzOyArK19sb24pIHtcbiAgICAgICAgICB2YXIgZmlyc3QgPSBfbGF0ICogKGxvbmdpdHVkZUJhbmRzICsgMSkgKyBfbG9uO1xuICAgICAgICAgIHZhciBzZWNvbmQgPSBmaXJzdCArIGxvbmdpdHVkZUJhbmRzICsgMTtcbiAgICAgICAgICBpbmRpY2VzLnB1c2goZmlyc3QgKyAxLCBzZWNvbmQsIGZpcnN0KTtcbiAgICAgICAgICBpbmRpY2VzLnB1c2goZmlyc3QgKyAxLCBzZWNvbmQgKyAxLCBzZWNvbmQpO1xuICAgICAgICB9XG4gICAgICB9IC8vIGdlbmVyYXRlIEFBQkJcblxuXG4gICAgICB2YXIgYWFiYiA9IGdlbmVyYXRlQUFCQkZyb21WZXJ0aWNlcyhwb3NpdGlvbnMpO1xuICAgICAgdmFyIGNvbXBvbmVudCA9IHRoaXMuZ2V0Q29tcG9uZW50KCk7XG4gICAgICBjb21wb25lbnQuaW5kaWNlcyA9IFVpbnQzMkFycmF5LmZyb20oaW5kaWNlcyk7XG4gICAgICBjb21wb25lbnQuYWFiYiA9IGFhYmI7XG4gICAgICBjb21wb25lbnQudmVydGV4Q291bnQgPSBwb3NpdGlvbnMubGVuZ3RoIC8gMztcbiAgICAgIGNvbXBvbmVudC5hdHRyaWJ1dGVzID0gW3tcbiAgICAgICAgZGlydHk6IHRydWUsXG4gICAgICAgIG5hbWU6ICdwb3NpdGlvbicsXG4gICAgICAgIGRhdGE6IEZsb2F0MzJBcnJheS5mcm9tKHBvc2l0aW9ucyksXG4gICAgICAgIGFycmF5U3RyaWRlOiA0ICogMyxcbiAgICAgICAgc3RlcE1vZGU6ICd2ZXJ0ZXgnLFxuICAgICAgICBhdHRyaWJ1dGVzOiBbe1xuICAgICAgICAgIHNoYWRlckxvY2F0aW9uOiAwLFxuICAgICAgICAgIG9mZnNldDogMCxcbiAgICAgICAgICBmb3JtYXQ6ICdmbG9hdDMnXG4gICAgICAgIH1dXG4gICAgICB9LCB7XG4gICAgICAgIGRpcnR5OiB0cnVlLFxuICAgICAgICBuYW1lOiAnbm9ybWFsJyxcbiAgICAgICAgZGF0YTogRmxvYXQzMkFycmF5LmZyb20obm9ybWFscyksXG4gICAgICAgIGFycmF5U3RyaWRlOiA0ICogMyxcbiAgICAgICAgc3RlcE1vZGU6ICd2ZXJ0ZXgnLFxuICAgICAgICBhdHRyaWJ1dGVzOiBbe1xuICAgICAgICAgIHNoYWRlckxvY2F0aW9uOiAxLFxuICAgICAgICAgIG9mZnNldDogMCxcbiAgICAgICAgICBmb3JtYXQ6ICdmbG9hdDMnXG4gICAgICAgIH1dXG4gICAgICB9LCB7XG4gICAgICAgIGRpcnR5OiB0cnVlLFxuICAgICAgICBuYW1lOiAndXYnLFxuICAgICAgICBkYXRhOiBGbG9hdDMyQXJyYXkuZnJvbSh1dnMpLFxuICAgICAgICBhcnJheVN0cmlkZTogNCAqIDIsXG4gICAgICAgIHN0ZXBNb2RlOiAndmVydGV4JyxcbiAgICAgICAgYXR0cmlidXRlczogW3tcbiAgICAgICAgICBzaGFkZXJMb2NhdGlvbjogMixcbiAgICAgICAgICBvZmZzZXQ6IDAsXG4gICAgICAgICAgZm9ybWF0OiAnZmxvYXQyJ1xuICAgICAgICB9XVxuICAgICAgfV07IC8vIFRPRE86IGJhcnljZW50cmljICYgdGFuZ2VudFxuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBTcGhlcmU7XG59KEdlb21ldHJ5KSkgfHwgX2NsYXNzKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNwaGVyZS5qcy5tYXAiLCJpbXBvcnQgX2luaXRpYWxpemVyRGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW5pdGlhbGl6ZXJEZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzc1wiO1xuaW1wb3J0IF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXNzZXJ0VGhpc0luaXRpYWxpemVkXCI7XG5pbXBvcnQgX2luaGVyaXRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2luaGVyaXRzXCI7XG5pbXBvcnQgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4gZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVyblwiO1xuaW1wb3J0IF9nZXRQcm90b3R5cGVPZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9nZXRQcm90b3R5cGVPZlwiO1xuaW1wb3J0IF9hcHBseURlY29yYXRlZERlc2NyaXB0b3IgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXBwbHlEZWNvcmF0ZWREZXNjcmlwdG9yXCI7XG5pbXBvcnQgX2luaXRpYWxpemVyV2FybmluZ0hlbHBlciBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbml0aWFsaXplcldhcm5pbmdIZWxwZXJcIjtcblxudmFyIF9kZWMsIF9kZWMyLCBfZGVjMywgX2NsYXNzLCBfY2xhc3MyLCBfZGVzY3JpcHRvciwgX2Rlc2NyaXB0b3IyLCBfdGVtcDtcblxuZnVuY3Rpb24gX2NyZWF0ZVN1cGVyKERlcml2ZWQpIHsgdmFyIGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QgPSBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCk7IHJldHVybiBmdW5jdGlvbiBfY3JlYXRlU3VwZXJJbnRlcm5hbCgpIHsgdmFyIFN1cGVyID0gX2dldFByb3RvdHlwZU9mKERlcml2ZWQpLCByZXN1bHQ7IGlmIChoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KSB7IHZhciBOZXdUYXJnZXQgPSBfZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3I7IHJlc3VsdCA9IFJlZmxlY3QuY29uc3RydWN0KFN1cGVyLCBhcmd1bWVudHMsIE5ld1RhcmdldCk7IH0gZWxzZSB7IHJlc3VsdCA9IFN1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH0gcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIHJlc3VsdCk7IH07IH1cblxuZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpIHsgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcInVuZGVmaW5lZFwiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlOyBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlOyBpZiAodHlwZW9mIFByb3h5ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiB0cnVlOyB0cnkgeyBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfVxuXG5pbXBvcnQgeyBJREVOVElGSUVSIH0gZnJvbSAnQGFudHYvZy13ZWJncHUtY29yZSc7XG5pbXBvcnQgeyBtYXQzIH0gZnJvbSAnZ2wtbWF0cml4JztcbmltcG9ydCB7IGluamVjdCwgaW5qZWN0YWJsZSB9IGZyb20gJ2ludmVyc2lmeSc7XG5pbXBvcnQgeyBNYXRlcmlhbCB9IGZyb20gJy4uJztcblxuLyogYmFiZWwtcGx1Z2luLWlubGluZS1pbXBvcnQgJy4vc2hhZGVycy93ZWJnbC5iYXNpYy5mcmFnLmdsc2wnICovXG52YXIgd2ViZ2xGcmFnbWVudFNoYWRlckdMU0wgPSBcInZhcnlpbmcgdmVjNCBmcmFnQ29sb3I7XFxuXFxuI3ByYWdtYSBpbmNsdWRlIFxcXCJ1di5mcmFnLmRlY2xhcmF0aW9uXFxcIlxcbiNwcmFnbWEgaW5jbHVkZSBcXFwibWFwLmZyYWcuZGVjbGFyYXRpb25cXFwiXFxuXFxudm9pZCBtYWluKCkge1xcbiAgdmVjNCBkaWZmdXNlQ29sb3IgPSBmcmFnQ29sb3I7XFxuXFxuICAjcHJhZ21hIGluY2x1ZGUgXFxcIm1hcC5mcmFnLm1haW5cXFwiXFxuXFxuICBnbF9GcmFnQ29sb3IgPSBkaWZmdXNlQ29sb3I7XFxufVwiO1xuXG4vKiBiYWJlbC1wbHVnaW4taW5saW5lLWltcG9ydCAnLi9zaGFkZXJzL3dlYmdsLmJhc2ljLnZlcnQuZ2xzbCcgKi9cbnZhciB3ZWJnbFZlcnRleFNoYWRlckdMU0wgPSBcImF0dHJpYnV0ZSB2ZWMzIHBvc2l0aW9uO1xcbmF0dHJpYnV0ZSB2ZWMzIG5vcm1hbDtcXG5cXG51bmlmb3JtIG1hdDQgcHJvamVjdGlvbk1hdHJpeDtcXG51bmlmb3JtIG1hdDQgbW9kZWxWaWV3TWF0cml4O1xcbnVuaWZvcm0gdmVjNCBjb2xvcjtcXG5cXG52YXJ5aW5nIHZlYzQgZnJhZ0NvbG9yO1xcblxcbiNwcmFnbWEgaW5jbHVkZSBcXFwidXYudmVydC5kZWNsYXJhdGlvblxcXCJcXG5cXG52b2lkIG1haW4oKSB7XFxuICBnbF9Qb3NpdGlvbiA9IHByb2plY3Rpb25NYXRyaXggKiBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KHBvc2l0aW9uLCAxLjApO1xcbiAgZnJhZ0NvbG9yID0gY29sb3I7XFxuXFxuICAjcHJhZ21hIGluY2x1ZGUgXFxcInV2LnZlcnQubWFpblxcXCJcXG59XCI7XG5cbi8qIGJhYmVsLXBsdWdpbi1pbmxpbmUtaW1wb3J0ICcuL3NoYWRlcnMvd2ViZ3B1LmJhc2ljLmZyYWcuZ2xzbCcgKi9cbnZhciB3ZWJncHVGcmFnbWVudFNoYWRlckdMU0wgPSBcIi8vIGxheW91dChzZXQgPSAwLCBiaW5kaW5nID0gMSkgdW5pZm9ybSBXaXJlZnJhbWVVbmlmb3JtcyB7XFxuLy8gICBmbG9hdCBsaW5lV2lkdGg7XFxuLy8gICB2ZWM0IGxpbmVDb2xvcjtcXG4vLyB9IHdpcmVmcmFtZTtcXG5cXG5sYXlvdXQobG9jYXRpb24gPSAwKSBpbiB2ZWM0IGZyYWdDb2xvcjtcXG4vLyBsYXlvdXQobG9jYXRpb24gPSAxKSBpbiB2ZWMzIHZfQmFyeWNlbnRyaWM7XFxuXFxubGF5b3V0KGxvY2F0aW9uID0gMCkgb3V0IHZlYzQgb3V0Q29sb3I7XFxuXFxuLy8gd2lyZWZyYW1lXFxuLy8gZmxvYXQgZWRnZUZhY3RvcigpIHtcXG4vLyAgIHZlYzMgZCA9IGZ3aWR0aCh2X0JhcnljZW50cmljKTtcXG4vLyAgIHZlYzMgYTMgPSBzbW9vdGhzdGVwKHZlYzMoMC4wKSwgZCAqIHdpcmVmcmFtZS5saW5lV2lkdGgsIHZfQmFyeWNlbnRyaWMpO1xcbi8vICAgcmV0dXJuIG1pbihtaW4oYTMueCwgYTMueSksIGEzLnopO1xcbi8vIH1cXG5cXG52b2lkIG1haW4oKSB7XFxuICAvLyBvdXRDb2xvciA9IG1peChmcmFnQ29sb3IsIHdpcmVmcmFtZS5saW5lQ29sb3IsICgxLjAgLSBlZGdlRmFjdG9yKCkpKTtcXG4gIG91dENvbG9yID0gZnJhZ0NvbG9yO1xcbn1cIjtcblxuLyogYmFiZWwtcGx1Z2luLWlubGluZS1pbXBvcnQgJy4vc2hhZGVycy93ZWJncHUuYmFzaWMudmVydC5nbHNsJyAqL1xudmFyIHdlYmdwdVZlcnRleFNoYWRlckdMU0wgPSBcImxheW91dChzZXQgPSAwLCBiaW5kaW5nID0gMCkgdW5pZm9ybSBVbmlmb3JtcyB7XFxuICB2ZWM0IGNvbG9yO1xcbiAgbWF0NCBwcm9qZWN0aW9uTWF0cml4O1xcbiAgbWF0NCBtb2RlbFZpZXdNYXRyaXg7XFxufSB1bmlmb3JtcztcXG5cXG5sYXlvdXQobG9jYXRpb24gPSAwKSBpbiB2ZWMzIHBvc2l0aW9uO1xcbi8vIGxheW91dChsb2NhdGlvbiA9IDEpIGluIHZlYzMgYmFyeWNlbnRyaWM7XFxuXFxubGF5b3V0KGxvY2F0aW9uID0gMCkgb3V0IHZlYzQgZnJhZ0NvbG9yO1xcbi8vIGxheW91dChsb2NhdGlvbiA9IDEpIG91dCB2ZWMzIHZfQmFyeWNlbnRyaWM7XFxuXFxudm9pZCBtYWluKCkge1xcbiAgZ2xfUG9zaXRpb24gPSB1bmlmb3Jtcy5wcm9qZWN0aW9uTWF0cml4ICogdW5pZm9ybXMubW9kZWxWaWV3TWF0cml4ICogdmVjNChwb3NpdGlvbiwgMS4wKTtcXG4gIGZyYWdDb2xvciA9IHVuaWZvcm1zLmNvbG9yO1xcbiAgLy8gdl9CYXJ5Y2VudHJpYyA9IGJhcnljZW50cmljO1xcbn1cIjtcbmV4cG9ydCB2YXJcbi8qKlxuICogVGhpcyBtYXRlcmlhbCBpcyBub3QgYWZmZWN0ZWQgYnkgbGlnaHRzLlxuICogQHNlZSBodHRwczovL3RocmVlanMub3JnL2RvY3MvI2FwaS9lbi9tYXRlcmlhbHMvTWVzaEJhc2ljTWF0ZXJpYWxcbiAqL1xuQmFzaWMgPSAoX2RlYyA9IGluamVjdGFibGUoKSwgX2RlYzIgPSBpbmplY3QoSURFTlRJRklFUi5SZW5kZXJFbmdpbmUpLCBfZGVjMyA9IGluamVjdChJREVOVElGSUVSLlNoYWRlck1vZHVsZVNlcnZpY2UpLCBfZGVjKF9jbGFzcyA9IChfY2xhc3MyID0gKF90ZW1wID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfTWF0ZXJpYWwpIHtcbiAgX2luaGVyaXRzKEJhc2ljLCBfTWF0ZXJpYWwpO1xuXG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoQmFzaWMpO1xuXG4gIGZ1bmN0aW9uIEJhc2ljKCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBCYXNpYyk7XG5cbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgX3RoaXMgPSBfc3VwZXIuY2FsbC5hcHBseShfc3VwZXIsIFt0aGlzXS5jb25jYXQoYXJncykpO1xuXG4gICAgX2luaXRpYWxpemVyRGVmaW5lUHJvcGVydHkoX3RoaXMsIFwiZW5naW5lXCIsIF9kZXNjcmlwdG9yLCBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSk7XG5cbiAgICBfaW5pdGlhbGl6ZXJEZWZpbmVQcm9wZXJ0eShfdGhpcywgXCJzaGFkZXJNb2R1bGVTZXJ2aWNlXCIsIF9kZXNjcmlwdG9yMiwgX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcykpO1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKEJhc2ljLCBbe1xuICAgIGtleTogXCJvbkVudGl0eUNyZWF0ZWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gb25FbnRpdHlDcmVhdGVkKCkge1xuICAgICAgdmFyIGNvbXBvbmVudCA9IHRoaXMuZ2V0Q29tcG9uZW50KCk7XG4gICAgICB2YXIgdmVydGV4U2hhZGVyR0xTTCA9IHRoaXMuZW5naW5lLnN1cHBvcnRXZWJHUFUgPyB3ZWJncHVWZXJ0ZXhTaGFkZXJHTFNMIDogd2ViZ2xWZXJ0ZXhTaGFkZXJHTFNMO1xuICAgICAgdmFyIGZyYWdtZW50U2hhZGVyR0xTTCA9IHRoaXMuZW5naW5lLnN1cHBvcnRXZWJHUFUgPyB3ZWJncHVGcmFnbWVudFNoYWRlckdMU0wgOiB3ZWJnbEZyYWdtZW50U2hhZGVyR0xTTDtcbiAgICAgIHRoaXMuc2hhZGVyTW9kdWxlU2VydmljZS5yZWdpc3Rlck1vZHVsZSgnbWF0ZXJpYWwtYmFzaWMnLCB7XG4gICAgICAgIHZzOiB2ZXJ0ZXhTaGFkZXJHTFNMLFxuICAgICAgICBmczogZnJhZ21lbnRTaGFkZXJHTFNMXG4gICAgICB9KTtcblxuICAgICAgdmFyIF90aGlzJHNoYWRlck1vZHVsZVNlciA9IHRoaXMuc2hhZGVyTW9kdWxlU2VydmljZS5nZXRNb2R1bGUoJ21hdGVyaWFsLWJhc2ljJyksXG4gICAgICAgICAgdnMgPSBfdGhpcyRzaGFkZXJNb2R1bGVTZXIudnMsXG4gICAgICAgICAgZnMgPSBfdGhpcyRzaGFkZXJNb2R1bGVTZXIuZnMsXG4gICAgICAgICAgZXh0cmFjdGVkVW5pZm9ybXMgPSBfdGhpcyRzaGFkZXJNb2R1bGVTZXIudW5pZm9ybXM7XG5cbiAgICAgIGNvbXBvbmVudC52ZXJ0ZXhTaGFkZXJHTFNMID0gdnM7XG4gICAgICBjb21wb25lbnQuZnJhZ21lbnRTaGFkZXJHTFNMID0gZnM7IC8vIEB0cy1pZ25vcmVcblxuICAgICAgY29tcG9uZW50LnNldFVuaWZvcm0oZXh0cmFjdGVkVW5pZm9ybXMpO1xuXG4gICAgICBpZiAodGhpcy5jb25maWcubWFwKSB7XG4gICAgICAgIGNvbXBvbmVudC5zZXREZWZpbmVzKHtcbiAgICAgICAgICBVU0VfVVY6IDEsXG4gICAgICAgICAgVVNFX01BUDogMVxuICAgICAgICB9KTtcbiAgICAgICAgY29tcG9uZW50LnNldFVuaWZvcm0oe1xuICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICBtYXA6IHRoaXMuY29uZmlnLm1hcCxcbiAgICAgICAgICB1dlRyYW5zZm9ybTogbWF0My5jcmVhdGUoKVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gQmFzaWM7XG59KE1hdGVyaWFsKSwgX3RlbXApLCAoX2Rlc2NyaXB0b3IgPSBfYXBwbHlEZWNvcmF0ZWREZXNjcmlwdG9yKF9jbGFzczIucHJvdG90eXBlLCBcImVuZ2luZVwiLCBbX2RlYzJdLCB7XG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgd3JpdGFibGU6IHRydWUsXG4gIGluaXRpYWxpemVyOiBudWxsXG59KSwgX2Rlc2NyaXB0b3IyID0gX2FwcGx5RGVjb3JhdGVkRGVzY3JpcHRvcihfY2xhc3MyLnByb3RvdHlwZSwgXCJzaGFkZXJNb2R1bGVTZXJ2aWNlXCIsIFtfZGVjM10sIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICB3cml0YWJsZTogdHJ1ZSxcbiAgaW5pdGlhbGl6ZXI6IG51bGxcbn0pKSwgX2NsYXNzMikpIHx8IF9jbGFzcyk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJpbXBvcnQgX2luaXRpYWxpemVyRGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW5pdGlhbGl6ZXJEZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzc1wiO1xuaW1wb3J0IF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXNzZXJ0VGhpc0luaXRpYWxpemVkXCI7XG5pbXBvcnQgX2luaGVyaXRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2luaGVyaXRzXCI7XG5pbXBvcnQgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4gZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVyblwiO1xuaW1wb3J0IF9nZXRQcm90b3R5cGVPZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9nZXRQcm90b3R5cGVPZlwiO1xuaW1wb3J0IF9hcHBseURlY29yYXRlZERlc2NyaXB0b3IgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXBwbHlEZWNvcmF0ZWREZXNjcmlwdG9yXCI7XG5pbXBvcnQgX2luaXRpYWxpemVyV2FybmluZ0hlbHBlciBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbml0aWFsaXplcldhcm5pbmdIZWxwZXJcIjtcblxudmFyIF9kZWMsIF9kZWMyLCBfZGVjMywgX2RlYzQsIF9kZWM1LCBfZGVjNiwgX2NsYXNzLCBfY2xhc3MyLCBfZGVzY3JpcHRvciwgX2Rlc2NyaXB0b3IyLCBfZGVzY3JpcHRvcjMsIF90ZW1wO1xuXG5mdW5jdGlvbiBfY3JlYXRlU3VwZXIoRGVyaXZlZCkgeyB2YXIgaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCA9IF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKTsgcmV0dXJuIGZ1bmN0aW9uIF9jcmVhdGVTdXBlckludGVybmFsKCkgeyB2YXIgU3VwZXIgPSBfZ2V0UHJvdG90eXBlT2YoRGVyaXZlZCksIHJlc3VsdDsgaWYgKGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QpIHsgdmFyIE5ld1RhcmdldCA9IF9nZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3RvcjsgcmVzdWx0ID0gUmVmbGVjdC5jb25zdHJ1Y3QoU3VwZXIsIGFyZ3VtZW50cywgTmV3VGFyZ2V0KTsgfSBlbHNlIHsgcmVzdWx0ID0gU3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfSByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgcmVzdWx0KTsgfTsgfVxuXG5mdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkgeyBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwidW5kZWZpbmVkXCIgfHwgIVJlZmxlY3QuY29uc3RydWN0KSByZXR1cm4gZmFsc2U7IGlmIChSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKSByZXR1cm4gZmFsc2U7IGlmICh0eXBlb2YgUHJveHkgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHRydWU7IHRyeSB7IERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoRGF0ZSwgW10sIGZ1bmN0aW9uICgpIHt9KSk7IHJldHVybiB0cnVlOyB9IGNhdGNoIChlKSB7IHJldHVybiBmYWxzZTsgfSB9XG5cbmltcG9ydCB7IGdsLCBJREVOVElGSUVSIH0gZnJvbSAnQGFudHYvZy13ZWJncHUtY29yZSc7XG5pbXBvcnQgeyBpbmplY3QsIGluamVjdGFibGUsIG5hbWVkIH0gZnJvbSAnaW52ZXJzaWZ5JztcbmltcG9ydCB7IFJlbmRlcmFibGUgfSBmcm9tICcuLi9SZW5kZXJhYmxlJztcblxuLyogYmFiZWwtcGx1Z2luLWlubGluZS1pbXBvcnQgJy4vc2hhZGVycy93ZWJnbC5ncmlkLmZyYWcuZ2xzbCcgKi9cbnZhciBncmlkRnJhZyA9IFwiLy8gZ2VuZXJhdGUgZ3JpZCwgYm9ycm93IGZyb20gY2xheS5nbCB2aWV3ZXJcXG4vLyBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9waXNzYW5nL2NsYXktdmlld2VyL2Jsb2IvbWFzdGVyL3NyYy9ncmFwaGljL2dyb3VuZC5nbHNsXFxuI2V4dGVuc2lvbiBHTF9PRVNfc3RhbmRhcmRfZGVyaXZhdGl2ZXMgOiBlbmFibGVcXG5cXG52YXJ5aW5nIHZlYzMgdl9Qb3NpdGlvbjtcXG4vLyB2YXJ5aW5nIHZlYzMgdl9Ob3JtYWw7XFxuXFxudW5pZm9ybSBmbG9hdCB1X0dyaWRTaXplIDogNTtcXG51bmlmb3JtIGZsb2F0IHVfR3JpZFNpemUyIDogLjU7XFxudW5pZm9ybSB2ZWM0IHVfR3JpZENvbG9yIDogWzAsIDAsIDAsIDFdO1xcbnVuaWZvcm0gdmVjNCB1X0dyaWRDb2xvcjIgOiBbMC4zLCAwLjMsIDAuMywgMV07XFxudW5pZm9ybSBib29sIHVfR3JpZEVuYWJsZWQgOiB0cnVlO1xcblxcbi8vIHVuaWZvcm0gdmVjMyB1X0xpZ2h0RGlyZWN0aW9uO1xcbi8vIHVuaWZvcm0gdmVjMyB1X0xpZ2h0Q29sb3I7XFxuLy8gdW5pZm9ybSB2ZWMzIHVfQ2FtZXJhO1xcblxcbnZvaWQgbWFpbigpIHtcXG4gIC8vIHZlYzMgbiA9IHZfTm9ybWFsO1xcbiAgLy8gdmVjMyBsID0gbm9ybWFsaXplKHVfTGlnaHREaXJlY3Rpb24pO1xcbiAgLy8gZmxvYXQgTmRvdEwgPSBjbGFtcChkb3QobiwgbCksIDAuMDAxLCAxLjApO1xcblxcbiAgZ2xfRnJhZ0NvbG9yID0gdmVjNCgxLik7XFxuXFxuICBpZiAodV9HcmlkRW5hYmxlZCkge1xcbiAgICBmbG9hdCB3eCA9IHZfUG9zaXRpb24ueDtcXG4gICAgZmxvYXQgd3ogPSB2X1Bvc2l0aW9uLno7XFxuICAgIC8vIGZsb2F0IHgwID0gYWJzKGZyYWN0KHd4IC8gdV9HcmlkU2l6ZSAtIDAuNSkgLSAwLjUpIC8gZndpZHRoKHd4KSAqIHVfR3JpZFNpemUgLyAyLjA7XFxuICAgIC8vIGZsb2F0IHowID0gYWJzKGZyYWN0KHd6IC8gdV9HcmlkU2l6ZSAtIDAuNSkgLSAwLjUpIC8gZndpZHRoKHd6KSAqIHVfR3JpZFNpemUgLyAyLjA7XFxuXFxuICAgIGZsb2F0IHgxID0gYWJzKGZyYWN0KHd4IC8gdV9HcmlkU2l6ZTIgLSAwLjUpIC0gMC41KSAvIGZ3aWR0aCh3eCkgKiB1X0dyaWRTaXplMjtcXG4gICAgZmxvYXQgejEgPSBhYnMoZnJhY3Qod3ogLyB1X0dyaWRTaXplMiAtIDAuNSkgLSAwLjUpIC8gZndpZHRoKHd6KSAqIHVfR3JpZFNpemUyO1xcblxcbiAgICAvLyBmbG9hdCB2MCA9IDEuMCAtIGNsYW1wKG1pbih4MCwgejApLCAwLjAsIDEuMCk7XFxuICAgIGZsb2F0IHYxID0gMS4wIC0gY2xhbXAobWluKHgxLCB6MSksIDAuMCwgMS4wKTtcXG4gICAgLy8gaWYgKHYwID4gMC4xKSB7XFxuICAgICAgICAvLyBnbF9GcmFnQ29sb3IgPSBtaXgoZ2xfRnJhZ0NvbG9yLCB1X0dyaWRDb2xvciwgdjApO1xcbiAgICAvLyB9XFxuICAgIC8vIGVsc2Uge1xcbiAgICAgICAgZ2xfRnJhZ0NvbG9yID0gbWl4KGdsX0ZyYWdDb2xvciwgdV9HcmlkQ29sb3IyLCB2MSk7XFxuICAgIC8vIH1cXG4gIH1cXG5cXG4gIC8vIGZsb2F0IHNoYWRvd0ZhY3RvciA9IGNhbGNTaGFkb3codV9TaGFkb3dNYXAsIHZfUG9zaXRpb25Gcm9tTGlnaHQsIGwsIG4pO1xcbiAgLy8gdmVjMyBkaWZmdXNlQ29sb3IgPSB1X0xpZ2h0Q29sb3IgKiBOZG90TCAqIHNoYWRvd0ZhY3RvcjtcXG5cXG4gIC8vIGdsX0ZyYWdDb2xvci5yZ2IgKj0gZGlmZnVzZUNvbG9yO1xcbn1cIjtcblxuLyogYmFiZWwtcGx1Z2luLWlubGluZS1pbXBvcnQgJy4vc2hhZGVycy93ZWJnbC5ncmlkLnZlcnQuZ2xzbCcgKi9cbnZhciBncmlkVmVydCA9IFwiYXR0cmlidXRlIHZlYzMgYV9Qb3NpdGlvbjtcXG5cXG52YXJ5aW5nIHZlYzMgdl9Qb3NpdGlvbjtcXG5cXG51bmlmb3JtIG1hdDQgcHJvamVjdGlvbk1hdHJpeDtcXG51bmlmb3JtIG1hdDQgbW9kZWxWaWV3TWF0cml4O1xcblxcbnZvaWQgbWFpbigpIHtcXG4gIHZfUG9zaXRpb24gPSBhX1Bvc2l0aW9uO1xcbiAgZ2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbW9kZWxWaWV3TWF0cml4ICogdmVjNChhX1Bvc2l0aW9uLCAxLik7XFxufVwiO1xuZXhwb3J0IHZhciBHcmlkID0gKF9kZWMgPSBpbmplY3RhYmxlKCksIF9kZWMyID0gaW5qZWN0KElERU5USUZJRVIuU3lzdGVtcyksIF9kZWMzID0gbmFtZWQoSURFTlRJRklFUi5NYXRlcmlhbFN5c3RlbSksIF9kZWM0ID0gaW5qZWN0KElERU5USUZJRVIuU3lzdGVtcyksIF9kZWM1ID0gbmFtZWQoSURFTlRJRklFUi5HZW9tZXRyeVN5c3RlbSksIF9kZWM2ID0gaW5qZWN0KElERU5USUZJRVIuU2hhZGVyTW9kdWxlU2VydmljZSksIF9kZWMoX2NsYXNzID0gKF9jbGFzczIgPSAoX3RlbXAgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9SZW5kZXJhYmxlKSB7XG4gIF9pbmhlcml0cyhHcmlkLCBfUmVuZGVyYWJsZSk7XG5cbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlcihHcmlkKTtcblxuICBmdW5jdGlvbiBHcmlkKCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBHcmlkKTtcblxuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICBfdGhpcyA9IF9zdXBlci5jYWxsLmFwcGx5KF9zdXBlciwgW3RoaXNdLmNvbmNhdChhcmdzKSk7XG5cbiAgICBfaW5pdGlhbGl6ZXJEZWZpbmVQcm9wZXJ0eShfdGhpcywgXCJtYXRlcmlhbFN5c3RlbVwiLCBfZGVzY3JpcHRvciwgX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcykpO1xuXG4gICAgX2luaXRpYWxpemVyRGVmaW5lUHJvcGVydHkoX3RoaXMsIFwiZ2VvbWV0cnlTeXN0ZW1cIiwgX2Rlc2NyaXB0b3IyLCBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSk7XG5cbiAgICBfaW5pdGlhbGl6ZXJEZWZpbmVQcm9wZXJ0eShfdGhpcywgXCJzaGFkZXJNb2R1bGVTZXJ2aWNlXCIsIF9kZXNjcmlwdG9yMywgX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcykpO1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKEdyaWQsIFt7XG4gICAga2V5OiBcIm9uQXR0cmlidXRlQ2hhbmdlZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvbkF0dHJpYnV0ZUNoYW5nZWQoX3JlZikge1xuICAgICAgdmFyIG5hbWUgPSBfcmVmLm5hbWUsXG4gICAgICAgICAgZGF0YSA9IF9yZWYuZGF0YTtcbiAgICAgIHZhciBtZXNoID0gdGhpcy5nZXRNZXNoQ29tcG9uZW50KCk7XG5cbiAgICAgIGlmIChtZXNoICYmIG1lc2gubWF0ZXJpYWwpIHtcbiAgICAgICAgaWYgKG5hbWUgPT09ICdncmlkQ29sb3InKSB7XG4gICAgICAgICAgbWVzaC5tYXRlcmlhbC5zZXRVbmlmb3JtKCd1X0dyaWRDb2xvcicsIGRhdGEpO1xuICAgICAgICAgIG1lc2gubWF0ZXJpYWwuc2V0VW5pZm9ybSgndV9HcmlkQ29sb3IyJywgZGF0YSk7XG4gICAgICAgIH0gZWxzZSBpZiAobmFtZSA9PT0gJ2dyaWRTaXplJykge1xuICAgICAgICAgIG1lc2gubWF0ZXJpYWwuc2V0VW5pZm9ybSgndV9HcmlkU2l6ZScsIGRhdGEpO1xuICAgICAgICAgIG1lc2gubWF0ZXJpYWwuc2V0VW5pZm9ybSgndV9HcmlkU2l6ZTInLCBkYXRhKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJvbkVudGl0eUNyZWF0ZWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gb25FbnRpdHlDcmVhdGVkKCkge1xuICAgICAgdGhpcy5zaGFkZXJNb2R1bGVTZXJ2aWNlLnJlZ2lzdGVyTW9kdWxlKCdncmlkJywge1xuICAgICAgICB2czogZ3JpZFZlcnQsXG4gICAgICAgIGZzOiBncmlkRnJhZ1xuICAgICAgfSk7XG5cbiAgICAgIHZhciBfdGhpcyRzaGFkZXJNb2R1bGVTZXIgPSB0aGlzLnNoYWRlck1vZHVsZVNlcnZpY2UuZ2V0TW9kdWxlKCdncmlkJyksXG4gICAgICAgICAgdnMgPSBfdGhpcyRzaGFkZXJNb2R1bGVTZXIudnMsXG4gICAgICAgICAgZnMgPSBfdGhpcyRzaGFkZXJNb2R1bGVTZXIuZnMsXG4gICAgICAgICAgZXh0cmFjdGVkVW5pZm9ybXMgPSBfdGhpcyRzaGFkZXJNb2R1bGVTZXIudW5pZm9ybXM7XG5cbiAgICAgIHZhciBtYXRlcmlhbCA9IHRoaXMubWF0ZXJpYWxTeXN0ZW0uY3JlYXRlU2hhZGVyTWF0ZXJpYWwoe1xuICAgICAgICB2ZXJ0ZXhTaGFkZXI6IHZzLFxuICAgICAgICBmcmFnbWVudFNoYWRlcjogZnNcbiAgICAgIH0pO1xuICAgICAgdGhpcy5zZXRNYXRlcmlhbChtYXRlcmlhbCk7XG4gICAgICB2YXIgZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5U3lzdGVtLmNyZWF0ZUJ1ZmZlckdlb21ldHJ5KHtcbiAgICAgICAgdmVydGV4Q291bnQ6IDRcbiAgICAgIH0pO1xuICAgICAgdGhpcy5zZXRHZW9tZXRyeShnZW9tZXRyeSk7XG4gICAgICBtYXRlcmlhbC5zZXRDdWxsKHtcbiAgICAgICAgZW5hYmxlOiBmYWxzZSxcbiAgICAgICAgZmFjZTogZ2wuQkFDS1xuICAgICAgfSkuc2V0RGVwdGgoe1xuICAgICAgICBlbmFibGU6IHRydWUsXG4gICAgICAgIGZ1bmM6IGdsLkxFU1NcbiAgICAgIH0pOyAvLyBAdHMtaWdub3JlXG5cbiAgICAgIG1hdGVyaWFsLnNldFVuaWZvcm0oZXh0cmFjdGVkVW5pZm9ybXMpO1xuICAgICAgdGhpcy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgZ3JpZENvbG9yOiB0aGlzLmNvbmZpZy5ncmlkQ29sb3IsXG4gICAgICAgIGdyaWRTaXplOiB0aGlzLmNvbmZpZy5ncmlkU2l6ZVxuICAgICAgfSk7XG4gICAgICBnZW9tZXRyeS5zZXRJbmRleChbMCwgMywgMiwgMiwgMSwgMF0pO1xuICAgICAgZ2VvbWV0cnkuc2V0QXR0cmlidXRlKCdhX1Bvc2l0aW9uJywgRmxvYXQzMkFycmF5LmZyb20oWy00LCAtMSwgLTQsIDQsIC0xLCAtNCwgNCwgLTEsIDQsIC00LCAtMSwgNF0pLCB7XG4gICAgICAgIGFycmF5U3RyaWRlOiA0ICogMixcbiAgICAgICAgc3RlcE1vZGU6ICd2ZXJ0ZXgnLFxuICAgICAgICBhdHRyaWJ1dGVzOiBbe1xuICAgICAgICAgIHNoYWRlckxvY2F0aW9uOiAwLFxuICAgICAgICAgIG9mZnNldDogMCxcbiAgICAgICAgICBmb3JtYXQ6ICdmbG9hdDInXG4gICAgICAgIH1dXG4gICAgICB9KTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gR3JpZDtcbn0oUmVuZGVyYWJsZSksIF90ZW1wKSwgKF9kZXNjcmlwdG9yID0gX2FwcGx5RGVjb3JhdGVkRGVzY3JpcHRvcihfY2xhc3MyLnByb3RvdHlwZSwgXCJtYXRlcmlhbFN5c3RlbVwiLCBbX2RlYzIsIF9kZWMzXSwge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHdyaXRhYmxlOiB0cnVlLFxuICBpbml0aWFsaXplcjogbnVsbFxufSksIF9kZXNjcmlwdG9yMiA9IF9hcHBseURlY29yYXRlZERlc2NyaXB0b3IoX2NsYXNzMi5wcm90b3R5cGUsIFwiZ2VvbWV0cnlTeXN0ZW1cIiwgW19kZWM0LCBfZGVjNV0sIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICB3cml0YWJsZTogdHJ1ZSxcbiAgaW5pdGlhbGl6ZXI6IG51bGxcbn0pLCBfZGVzY3JpcHRvcjMgPSBfYXBwbHlEZWNvcmF0ZWREZXNjcmlwdG9yKF9jbGFzczIucHJvdG90eXBlLCBcInNoYWRlck1vZHVsZVNlcnZpY2VcIiwgW19kZWM2XSwge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHdyaXRhYmxlOiB0cnVlLFxuICBpbml0aWFsaXplcjogbnVsbFxufSkpLCBfY2xhc3MyKSkgfHwgX2NsYXNzKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsIi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IGNvcHksIGNyZWF0ZSwgZG90IH0gZnJvbSAnZ2wtdmVjMic7IC8vIEB0cy1pZ25vcmVcblxuaW1wb3J0IHsgY29tcHV0ZU1pdGVyLCBkaXJlY3Rpb24sIG5vcm1hbCB9IGZyb20gJ3BvbHlsaW5lLW1pdGVyLXV0aWwnO1xuXG5mdW5jdGlvbiBleHRydXNpb25zKHBvc2l0aW9ucywgb3V0LCBwb2ludCwgbm9ybWFsLCBzY2FsZSkge1xuICBhZGROZXh0KG91dCwgbm9ybWFsLCAtc2NhbGUpO1xuICBhZGROZXh0KG91dCwgbm9ybWFsLCBzY2FsZSk7XG4gIHBvc2l0aW9ucy5wdXNoKHBvaW50KTtcbiAgcG9zaXRpb25zLnB1c2gocG9pbnQpO1xufVxuXG5mdW5jdGlvbiBhZGROZXh0KG91dCwgbm9ybWFsLCBsZW5ndGgpIHtcbiAgb3V0LnB1c2goW1tub3JtYWxbMF0sIG5vcm1hbFsxXV0sIGxlbmd0aF0pO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAocG9pbnRzLCBjbG9zZWQsIGluZGV4T2Zmc2V0KSB7XG4gIHZhciBsaW5lQSA9IFswLCAwXTtcbiAgdmFyIGxpbmVCID0gWzAsIDBdO1xuICB2YXIgdGFuZ2VudCA9IFswLCAwXTtcbiAgdmFyIG1pdGVyID0gWzAsIDBdO1xuXG4gIHZhciBfbGFzdEZsaXAgPSAtMTtcblxuICB2YXIgX3N0YXJ0ZWQgPSBmYWxzZTtcbiAgdmFyIF9ub3JtYWwgPSBudWxsO1xuICB2YXIgdG1wID0gY3JlYXRlKCk7XG4gIHZhciBjb3VudCA9IGluZGV4T2Zmc2V0IHx8IDA7XG4gIHZhciBtaXRlckxpbWl0ID0gMztcbiAgdmFyIG91dCA9IFtdO1xuICB2YXIgYXR0clBvcyA9IFtdO1xuICB2YXIgYXR0ckluZGV4ID0gW107XG4gIHZhciBhdHRyQ291bnRlcnMgPSBbMCwgMF07XG5cbiAgaWYgKGNsb3NlZCkge1xuICAgIHBvaW50cyA9IHBvaW50cy5zbGljZSgpO1xuICAgIHBvaW50cy5wdXNoKHBvaW50c1swXSk7XG4gIH1cblxuICB2YXIgdG90YWwgPSBwb2ludHMubGVuZ3RoO1xuXG4gIGZvciAodmFyIGkgPSAxOyBpIDwgdG90YWw7IGkrKykge1xuICAgIHZhciBpbmRleCA9IGNvdW50O1xuICAgIHZhciBsYXN0ID0gcG9pbnRzW2kgLSAxXTtcbiAgICB2YXIgY3VyID0gcG9pbnRzW2ldO1xuICAgIHZhciBuZXh0ID0gaSA8IHBvaW50cy5sZW5ndGggLSAxID8gcG9pbnRzW2kgKyAxXSA6IG51bGw7XG4gICAgYXR0ckNvdW50ZXJzLnB1c2goaSAvIHRvdGFsLCBpIC8gdG90YWwpO1xuICAgIGRpcmVjdGlvbihsaW5lQSwgY3VyLCBsYXN0KTtcblxuICAgIGlmICghX25vcm1hbCkge1xuICAgICAgX25vcm1hbCA9IFswLCAwXTtcbiAgICAgIG5vcm1hbChfbm9ybWFsLCBsaW5lQSk7XG4gICAgfVxuXG4gICAgaWYgKCFfc3RhcnRlZCkge1xuICAgICAgX3N0YXJ0ZWQgPSB0cnVlO1xuICAgICAgZXh0cnVzaW9ucyhhdHRyUG9zLCBvdXQsIGxhc3QsIF9ub3JtYWwsIDEpO1xuICAgIH1cblxuICAgIGF0dHJJbmRleC5wdXNoKFtpbmRleCArIDAsIGluZGV4ICsgMSwgaW5kZXggKyAyXSk7XG5cbiAgICBpZiAoIW5leHQpIHtcbiAgICAgIC8vIG5vIG1pdGVyLCBzaW1wbGUgc2VnbWVudFxuICAgICAgbm9ybWFsKF9ub3JtYWwsIGxpbmVBKTsgLy8gcmVzZXQgbm9ybWFsXG5cbiAgICAgIGV4dHJ1c2lvbnMoYXR0clBvcywgb3V0LCBjdXIsIF9ub3JtYWwsIDEpO1xuICAgICAgYXR0ckluZGV4LnB1c2goX2xhc3RGbGlwID09PSAxID8gW2luZGV4LCBpbmRleCArIDIsIGluZGV4ICsgM10gOiBbaW5kZXggKyAyLCBpbmRleCArIDEsIGluZGV4ICsgM10pO1xuICAgICAgY291bnQgKz0gMjtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gbWl0ZXIgd2l0aCBsYXN0XG4gICAgICAvLyBnZXQgdW5pdCBkaXIgb2YgbmV4dCBsaW5lXG4gICAgICBkaXJlY3Rpb24obGluZUIsIG5leHQsIGN1cik7IC8vIHN0b3JlcyB0YW5nZW50ICYgbWl0ZXJcblxuICAgICAgdmFyIG1pdGVyTGVuID0gY29tcHV0ZU1pdGVyKHRhbmdlbnQsIG1pdGVyLCBsaW5lQSwgbGluZUIsIDEpOyAvLyBnZXQgb3JpZW50YXRpb25cblxuICAgICAgdmFyIGZsaXAgPSBkb3QodGFuZ2VudCwgX25vcm1hbCkgPCAwID8gLTEgOiAxO1xuICAgICAgdmFyIGJldmVsID0gbWl0ZXJMZW4gPiBtaXRlckxpbWl0OyAvLyDlpITnkIbnm7jpgrvnur/mrrXph43lj6DnmoTmg4XlhrVcblxuICAgICAgaWYgKCFpc0Zpbml0ZShtaXRlckxlbikpIHtcbiAgICAgICAgbm9ybWFsKF9ub3JtYWwsIGxpbmVBKTsgLy8gcmVzZXQgbm9ybWFsXG5cbiAgICAgICAgZXh0cnVzaW9ucyhhdHRyUG9zLCBvdXQsIGN1ciwgX25vcm1hbCwgMSk7XG4gICAgICAgIGF0dHJJbmRleC5wdXNoKF9sYXN0RmxpcCA9PT0gMSA/IFtpbmRleCwgaW5kZXggKyAyLCBpbmRleCArIDNdIDogW2luZGV4ICsgMiwgaW5kZXggKyAxLCBpbmRleCArIDNdKTtcbiAgICAgICAgY291bnQgKz0gMjtcbiAgICAgICAgX2xhc3RGbGlwID0gZmxpcDtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChiZXZlbCkge1xuICAgICAgICBtaXRlckxlbiA9IG1pdGVyTGltaXQ7XG4gICAgICAgIGF0dHJDb3VudGVycy5wdXNoKGkgLyB0b3RhbCk7IC8vIG5leHQgdHdvIHBvaW50cyBpbiBvdXIgZmlyc3Qgc2VnbWVudFxuXG4gICAgICAgIGFkZE5leHQob3V0LCBfbm9ybWFsLCAtZmxpcCk7XG4gICAgICAgIGF0dHJQb3MucHVzaChjdXIpO1xuICAgICAgICBhZGROZXh0KG91dCwgbWl0ZXIsIG1pdGVyTGVuICogZmxpcCk7XG4gICAgICAgIGF0dHJQb3MucHVzaChjdXIpO1xuICAgICAgICBhdHRySW5kZXgucHVzaChfbGFzdEZsaXAgIT09IC1mbGlwID8gW2luZGV4LCBpbmRleCArIDIsIGluZGV4ICsgM10gOiBbaW5kZXggKyAyLCBpbmRleCArIDEsIGluZGV4ICsgM10pOyAvLyBub3cgYWRkIHRoZSBiZXZlbCB0cmlhbmdsZVxuXG4gICAgICAgIGF0dHJJbmRleC5wdXNoKFtpbmRleCArIDIsIGluZGV4ICsgMywgaW5kZXggKyA0XSk7XG4gICAgICAgIG5vcm1hbCh0bXAsIGxpbmVCKTtcbiAgICAgICAgY29weShfbm9ybWFsLCB0bXApOyAvLyBzdG9yZSBub3JtYWwgZm9yIG5leHQgcm91bmRcblxuICAgICAgICBhZGROZXh0KG91dCwgX25vcm1hbCwgLWZsaXApO1xuICAgICAgICBhdHRyUG9zLnB1c2goY3VyKTsgLy8gdGhlIG1pdGVyIGlzIG5vdyB0aGUgbm9ybWFsIGZvciBvdXIgbmV4dCBqb2luXG5cbiAgICAgICAgY291bnQgKz0gMztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIG1pdGVyXG4gICAgICAgIC8vIG5leHQgdHdvIHBvaW50cyBmb3Igb3VyIG1pdGVyIGpvaW5cbiAgICAgICAgZXh0cnVzaW9ucyhhdHRyUG9zLCBvdXQsIGN1ciwgbWl0ZXIsIG1pdGVyTGVuKTtcbiAgICAgICAgYXR0ckluZGV4LnB1c2goX2xhc3RGbGlwID09PSAxID8gW2luZGV4LCBpbmRleCArIDIsIGluZGV4ICsgM10gOiBbaW5kZXggKyAyLCBpbmRleCArIDEsIGluZGV4ICsgM10pO1xuICAgICAgICBmbGlwID0gLTE7IC8vIHRoZSBtaXRlciBpcyBub3cgdGhlIG5vcm1hbCBmb3Igb3VyIG5leHQgam9pblxuXG4gICAgICAgIGNvcHkoX25vcm1hbCwgbWl0ZXIpO1xuICAgICAgICBjb3VudCArPSAyO1xuICAgICAgfVxuXG4gICAgICBfbGFzdEZsaXAgPSBmbGlwO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbm9ybWFsczogb3V0LFxuICAgIGF0dHJJbmRleDogYXR0ckluZGV4LFxuICAgIGF0dHJQb3M6IGF0dHJQb3MsXG4gICAgYXR0ckNvdW50ZXJzOiBhdHRyQ291bnRlcnNcbiAgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBvbHlsaW5lLW5vcm1hbHMuanMubWFwIiwiaW1wb3J0IF90b0NvbnN1bWFibGVBcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy90b0NvbnN1bWFibGVBcnJheVwiO1xuaW1wb3J0IF9pbml0aWFsaXplckRlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2luaXRpYWxpemVyRGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfY2xhc3NDYWxsQ2hlY2sgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2tcIjtcbmltcG9ydCBfY3JlYXRlQ2xhc3MgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlQ2xhc3NcIjtcbmltcG9ydCBfYXNzZXJ0VGhpc0luaXRpYWxpemVkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2Fzc2VydFRoaXNJbml0aWFsaXplZFwiO1xuaW1wb3J0IF9pbmhlcml0cyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbmhlcml0c1wiO1xuaW1wb3J0IF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm5cIjtcbmltcG9ydCBfZ2V0UHJvdG90eXBlT2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZ2V0UHJvdG90eXBlT2ZcIjtcbmltcG9ydCBfYXBwbHlEZWNvcmF0ZWREZXNjcmlwdG9yIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2FwcGx5RGVjb3JhdGVkRGVzY3JpcHRvclwiO1xuaW1wb3J0IF9pbml0aWFsaXplcldhcm5pbmdIZWxwZXIgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW5pdGlhbGl6ZXJXYXJuaW5nSGVscGVyXCI7XG5cbnZhciBfZGVjLCBfZGVjMiwgX2RlYzMsIF9kZWM0LCBfZGVjNSwgX2RlYzYsIF9jbGFzcywgX2NsYXNzMiwgX2Rlc2NyaXB0b3IsIF9kZXNjcmlwdG9yMiwgX2Rlc2NyaXB0b3IzLCBfdGVtcDtcblxuZnVuY3Rpb24gX2NyZWF0ZVN1cGVyKERlcml2ZWQpIHsgdmFyIGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QgPSBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCk7IHJldHVybiBmdW5jdGlvbiBfY3JlYXRlU3VwZXJJbnRlcm5hbCgpIHsgdmFyIFN1cGVyID0gX2dldFByb3RvdHlwZU9mKERlcml2ZWQpLCByZXN1bHQ7IGlmIChoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KSB7IHZhciBOZXdUYXJnZXQgPSBfZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3I7IHJlc3VsdCA9IFJlZmxlY3QuY29uc3RydWN0KFN1cGVyLCBhcmd1bWVudHMsIE5ld1RhcmdldCk7IH0gZWxzZSB7IHJlc3VsdCA9IFN1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH0gcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIHJlc3VsdCk7IH07IH1cblxuZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpIHsgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcInVuZGVmaW5lZFwiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlOyBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlOyBpZiAodHlwZW9mIFByb3h5ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiB0cnVlOyB0cnkgeyBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfVxuXG5pbXBvcnQgeyBnbCwgSURFTlRJRklFUiB9IGZyb20gJ0BhbnR2L2ctd2ViZ3B1LWNvcmUnO1xuaW1wb3J0IHsgaW5qZWN0LCBpbmplY3RhYmxlLCBuYW1lZCB9IGZyb20gJ2ludmVyc2lmeSc7XG5pbXBvcnQgZ2V0Tm9ybWFscyBmcm9tICcuLi8uLi91dGlscy9wb2x5bGluZS1ub3JtYWxzJztcbmltcG9ydCB7IFJlbmRlcmFibGUgfSBmcm9tICcuLi9SZW5kZXJhYmxlJztcblxuLyogYmFiZWwtcGx1Z2luLWlubGluZS1pbXBvcnQgJy4vc2hhZGVycy93ZWJnbC5saW5lLmZyYWcuZ2xzbCcgKi9cbnZhciBsaW5lRnJhZyA9IFwidW5pZm9ybSBmbG9hdCB1X2Rhc2hfYXJyYXkgOiAwLjAyO1xcbnVuaWZvcm0gZmxvYXQgdV9kYXNoX29mZnNldCA6IDA7XFxudW5pZm9ybSBmbG9hdCB1X2Rhc2hfcmF0aW8gOiAwO1xcbnVuaWZvcm0gZmxvYXQgdV90aGlja25lc3MgOiAwLjAyO1xcblxcbnZhcnlpbmcgdmVjNCB2X2NvbG9yO1xcbnZhcnlpbmcgdmVjMiB2X25vcm1hbDtcXG52YXJ5aW5nIGZsb2F0IHZfY291bnRlcnM7XFxuXFxudm9pZCBtYWluKCkge1xcbiAgICBmbG9hdCBibHVyID0gMS4gLSBzbW9vdGhzdGVwKDAuOTgsIDEuLCBsZW5ndGgodl9ub3JtYWwpKTtcXG5cXG4gICAgZ2xfRnJhZ0NvbG9yID0gdl9jb2xvcjtcXG4gICAgZ2xfRnJhZ0NvbG9yLmEgKj0gYmx1ciAqIGNlaWwobW9kKHZfY291bnRlcnMgKyB1X2Rhc2hfb2Zmc2V0LCB1X2Rhc2hfYXJyYXkpIC0gKHVfZGFzaF9hcnJheSAqIHVfZGFzaF9yYXRpbykpO1xcbn1cIjtcblxuLyogYmFiZWwtcGx1Z2luLWlubGluZS1pbXBvcnQgJy4vc2hhZGVycy93ZWJnbC5saW5lLnZlcnQuZ2xzbCcgKi9cbnZhciBsaW5lVmVydCA9IFwiYXR0cmlidXRlIHZlYzIgYV9wb3M7XFxuYXR0cmlidXRlIHZlYzQgYV9jb2xvcjtcXG5hdHRyaWJ1dGUgZmxvYXQgYV9saW5lX21pdGVyO1xcbmF0dHJpYnV0ZSB2ZWMyIGFfbGluZV9ub3JtYWw7XFxuYXR0cmlidXRlIGZsb2F0IGFfY291bnRlcnM7XFxuXFxudW5pZm9ybSBtYXQ0IHByb2plY3Rpb25NYXRyaXg7XFxudW5pZm9ybSBtYXQ0IG1vZGVsVmlld01hdHJpeDtcXG51bmlmb3JtIGZsb2F0IHVfdGhpY2tuZXNzIDogMC4wMjtcXG51bmlmb3JtIHZlYzIgdV92aWV3cG9ydDtcXG5cXG52YXJ5aW5nIHZlYzQgdl9jb2xvcjtcXG52YXJ5aW5nIHZlYzIgdl9ub3JtYWw7XFxudmFyeWluZyBmbG9hdCB2X2NvdW50ZXJzO1xcblxcbnZvaWQgbWFpbigpIHtcXG4gIHZfY29sb3IgPSBhX2NvbG9yO1xcbiAgdl9jb3VudGVycyA9IGFfY291bnRlcnM7XFxuXFxuICB2ZWMzIG5vcm1hbCA9IG5vcm1hbGl6ZSh2ZWMzKGFfbGluZV9ub3JtYWwsIDAuMCkpO1xcblxcbiAgdmVjNCBvZmZzZXQgPSB2ZWM0KG5vcm1hbCAqIHVfdGhpY2tuZXNzIC8gMi4wICogYV9saW5lX21pdGVyLCAwLjApO1xcblxcbiAgdl9ub3JtYWwgPSB2ZWMyKG5vcm1hbCAqIHNpZ24oYV9saW5lX21pdGVyKSk7XFxuXFxuICBnbF9Qb3NpdGlvbiA9IHByb2plY3Rpb25NYXRyaXggKiBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KGFfcG9zLCAwLjAsIDEuMCkgKyBvZmZzZXQ7XFxufVxcblwiO1xuZXhwb3J0IHZhciBMaW5lID0gKF9kZWMgPSBpbmplY3RhYmxlKCksIF9kZWMyID0gaW5qZWN0KElERU5USUZJRVIuU3lzdGVtcyksIF9kZWMzID0gbmFtZWQoSURFTlRJRklFUi5NYXRlcmlhbFN5c3RlbSksIF9kZWM0ID0gaW5qZWN0KElERU5USUZJRVIuU3lzdGVtcyksIF9kZWM1ID0gbmFtZWQoSURFTlRJRklFUi5HZW9tZXRyeVN5c3RlbSksIF9kZWM2ID0gaW5qZWN0KElERU5USUZJRVIuU2hhZGVyTW9kdWxlU2VydmljZSksIF9kZWMoX2NsYXNzID0gKF9jbGFzczIgPSAoX3RlbXAgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9SZW5kZXJhYmxlKSB7XG4gIF9pbmhlcml0cyhMaW5lLCBfUmVuZGVyYWJsZSk7XG5cbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlcihMaW5lKTtcblxuICBmdW5jdGlvbiBMaW5lKCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBMaW5lKTtcblxuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICBfdGhpcyA9IF9zdXBlci5jYWxsLmFwcGx5KF9zdXBlciwgW3RoaXNdLmNvbmNhdChhcmdzKSk7XG5cbiAgICBfaW5pdGlhbGl6ZXJEZWZpbmVQcm9wZXJ0eShfdGhpcywgXCJtYXRlcmlhbFN5c3RlbVwiLCBfZGVzY3JpcHRvciwgX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcykpO1xuXG4gICAgX2luaXRpYWxpemVyRGVmaW5lUHJvcGVydHkoX3RoaXMsIFwiZ2VvbWV0cnlTeXN0ZW1cIiwgX2Rlc2NyaXB0b3IyLCBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSk7XG5cbiAgICBfaW5pdGlhbGl6ZXJEZWZpbmVQcm9wZXJ0eShfdGhpcywgXCJzaGFkZXJNb2R1bGVTZXJ2aWNlXCIsIF9kZXNjcmlwdG9yMywgX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcykpO1xuXG4gICAgX3RoaXMudmVydGV4Q291bnQgPSB2b2lkIDA7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKExpbmUsIFt7XG4gICAga2V5OiBcIm9uQXR0cmlidXRlQ2hhbmdlZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvbkF0dHJpYnV0ZUNoYW5nZWQoX3JlZikge1xuICAgICAgdmFyIG5hbWUgPSBfcmVmLm5hbWUsXG4gICAgICAgICAgZGF0YSA9IF9yZWYuZGF0YTtcbiAgICAgIHZhciBtZXNoID0gdGhpcy5nZXRNZXNoQ29tcG9uZW50KCk7XG5cbiAgICAgIGlmIChtZXNoICYmIG1lc2gubWF0ZXJpYWwpIHtcbiAgICAgICAgc3dpdGNoIChuYW1lKSB7XG4gICAgICAgICAgY2FzZSAnZGFzaEFycmF5JzpcbiAgICAgICAgICAgIG1lc2gubWF0ZXJpYWwuc2V0VW5pZm9ybSgndV9kYXNoX2FycmF5JywgZGF0YSk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgJ2Rhc2hPZmZzZXQnOlxuICAgICAgICAgICAgbWVzaC5tYXRlcmlhbC5zZXRVbmlmb3JtKCd1X2Rhc2hfb2Zmc2V0JywgZGF0YSk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgJ2Rhc2hSYXRpbyc6XG4gICAgICAgICAgICBtZXNoLm1hdGVyaWFsLnNldFVuaWZvcm0oJ3VfZGFzaF9yYXRpbycsIGRhdGEpO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlICd0aGlja25lc3MnOlxuICAgICAgICAgICAgbWVzaC5tYXRlcmlhbC5zZXRVbmlmb3JtKCd1X3RoaWNrbmVzcycsIGRhdGEpO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlICdjb2xvcic6XG4gICAgICAgICAgICB2YXIgY29sb3JzID0gbmV3IEFycmF5KHRoaXMudmVydGV4Q291bnQpLmZpbGwodW5kZWZpbmVkKS5tYXAoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgICAgIH0pLnJlZHVjZShmdW5jdGlvbiAocHJldiwgY3VyKSB7XG4gICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgcmV0dXJuIFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkocHJldiksIF90b0NvbnN1bWFibGVBcnJheShjdXIpKTtcbiAgICAgICAgICAgIH0sIFtdKTsgLy8gQHRzLWlnbm9yZVxuXG4gICAgICAgICAgICBtZXNoLmdlb21ldHJ5LnNldEF0dHJpYnV0ZSgnYV9jb2xvcicsIEZsb2F0MzJBcnJheS5mcm9tKGNvbG9ycyksIHtcbiAgICAgICAgICAgICAgYXJyYXlTdHJpZGU6IDQgKiA0LFxuICAgICAgICAgICAgICBzdGVwTW9kZTogJ3ZlcnRleCcsXG4gICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IFt7XG4gICAgICAgICAgICAgICAgc2hhZGVyTG9jYXRpb246IDEsXG4gICAgICAgICAgICAgICAgb2Zmc2V0OiAwLFxuICAgICAgICAgICAgICAgIGZvcm1hdDogJ2Zsb2F0NCdcbiAgICAgICAgICAgICAgfV1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwib25FbnRpdHlDcmVhdGVkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG9uRW50aXR5Q3JlYXRlZCgpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICB0aGlzLnNoYWRlck1vZHVsZVNlcnZpY2UucmVnaXN0ZXJNb2R1bGUoJ2xpbmUnLCB7XG4gICAgICAgIHZzOiBsaW5lVmVydCxcbiAgICAgICAgZnM6IGxpbmVGcmFnXG4gICAgICB9KTtcblxuICAgICAgdmFyIF90aGlzJHNoYWRlck1vZHVsZVNlciA9IHRoaXMuc2hhZGVyTW9kdWxlU2VydmljZS5nZXRNb2R1bGUoJ2xpbmUnKSxcbiAgICAgICAgICB2cyA9IF90aGlzJHNoYWRlck1vZHVsZVNlci52cyxcbiAgICAgICAgICBmcyA9IF90aGlzJHNoYWRlck1vZHVsZVNlci5mcyxcbiAgICAgICAgICBleHRyYWN0ZWRVbmlmb3JtcyA9IF90aGlzJHNoYWRlck1vZHVsZVNlci51bmlmb3JtcztcblxuICAgICAgdmFyIG1hdGVyaWFsID0gdGhpcy5tYXRlcmlhbFN5c3RlbS5jcmVhdGVTaGFkZXJNYXRlcmlhbCh7XG4gICAgICAgIHZlcnRleFNoYWRlcjogdnMsXG4gICAgICAgIGZyYWdtZW50U2hhZGVyOiBmc1xuICAgICAgfSk7XG5cbiAgICAgIHZhciBfZ2V0Tm9ybWFscyA9IGdldE5vcm1hbHModGhpcy5jb25maWcucG9pbnRzLCBmYWxzZSksXG4gICAgICAgICAgbm9ybWFscyA9IF9nZXROb3JtYWxzLm5vcm1hbHMsXG4gICAgICAgICAgYXR0ckluZGV4ID0gX2dldE5vcm1hbHMuYXR0ckluZGV4LFxuICAgICAgICAgIGF0dHJQb3MgPSBfZ2V0Tm9ybWFscy5hdHRyUG9zLFxuICAgICAgICAgIGF0dHJDb3VudGVycyA9IF9nZXROb3JtYWxzLmF0dHJDb3VudGVycztcblxuICAgICAgdmFyIHZlcnRleENvdW50ID0gYXR0clBvcy5sZW5ndGg7XG4gICAgICB0aGlzLnZlcnRleENvdW50ID0gdmVydGV4Q291bnQ7XG4gICAgICB2YXIgZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5U3lzdGVtLmNyZWF0ZUJ1ZmZlckdlb21ldHJ5KHtcbiAgICAgICAgdmVydGV4Q291bnQ6IHZlcnRleENvdW50XG4gICAgICB9KTtcbiAgICAgIHRoaXMuc2V0TWF0ZXJpYWwobWF0ZXJpYWwpO1xuICAgICAgdGhpcy5zZXRHZW9tZXRyeShnZW9tZXRyeSk7XG4gICAgICBtYXRlcmlhbC5zZXRDdWxsKHtcbiAgICAgICAgZW5hYmxlOiBmYWxzZSxcbiAgICAgICAgZmFjZTogZ2wuQkFDS1xuICAgICAgfSkgLy8gQHRzLWlnbm9yZVxuICAgICAgLnNldFVuaWZvcm0oZXh0cmFjdGVkVW5pZm9ybXMpO1xuICAgICAgdGhpcy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgZGFzaEFycmF5OiB0aGlzLmNvbmZpZy5kYXNoQXJyYXksXG4gICAgICAgIGRhc2hPZmZzZXQ6IHRoaXMuY29uZmlnLmRhc2hPZmZzZXQsXG4gICAgICAgIGRhc2hSYXRpbzogdGhpcy5jb25maWcuZGFzaFJhdGlvLFxuICAgICAgICB0aGlja25lc3M6IHRoaXMuY29uZmlnLnRoaWNrbmVzc1xuICAgICAgfSk7XG4gICAgICB2YXIgYXR0ck5vcm1hbCA9IFtdO1xuICAgICAgdmFyIGF0dHJNaXRlciA9IFtdO1xuICAgICAgbm9ybWFscy5mb3JFYWNoKGZ1bmN0aW9uIChuKSB7XG4gICAgICAgIHZhciBub3JtID0gblswXTtcbiAgICAgICAgdmFyIG1pdGVyID0gblsxXTtcbiAgICAgICAgYXR0ck5vcm1hbC5wdXNoKFtub3JtWzBdLCBub3JtWzFdXSk7IC8vIEB0cy1pZ25vcmVcblxuICAgICAgICBhdHRyTWl0ZXIucHVzaChtaXRlcik7XG4gICAgICB9KTsgLy8gW1swLDEsMl0sIFsyLDEsM11dXG5cbiAgICAgIGdlb21ldHJ5LnNldEluZGV4KGF0dHJJbmRleC5yZWR1Y2UoZnVuY3Rpb24gKHByZXYsIGN1cikge1xuICAgICAgICByZXR1cm4gW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShwcmV2KSwgX3RvQ29uc3VtYWJsZUFycmF5KGN1cikpO1xuICAgICAgfSwgW10pKTtcbiAgICAgIGdlb21ldHJ5LnNldEF0dHJpYnV0ZSgnYV9wb3MnLCBGbG9hdDMyQXJyYXkuZnJvbShhdHRyUG9zLnJlZHVjZShmdW5jdGlvbiAocHJldiwgY3VyKSB7XG4gICAgICAgIHJldHVybiBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KHByZXYpLCBfdG9Db25zdW1hYmxlQXJyYXkoY3VyKSk7XG4gICAgICB9LCBbXSkpLCB7XG4gICAgICAgIGFycmF5U3RyaWRlOiA0ICogMixcbiAgICAgICAgc3RlcE1vZGU6ICd2ZXJ0ZXgnLFxuICAgICAgICBhdHRyaWJ1dGVzOiBbe1xuICAgICAgICAgIHNoYWRlckxvY2F0aW9uOiAwLFxuICAgICAgICAgIG9mZnNldDogMCxcbiAgICAgICAgICBmb3JtYXQ6ICdmbG9hdDInXG4gICAgICAgIH1dXG4gICAgICB9KTtcbiAgICAgIHZhciBjb2xvcnMgPSBuZXcgQXJyYXkodmVydGV4Q291bnQpLmZpbGwodW5kZWZpbmVkKS5tYXAoZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX3RvQ29uc3VtYWJsZUFycmF5KF90aGlzMi5jb25maWcuY29sb3IpO1xuICAgICAgfSkucmVkdWNlKGZ1bmN0aW9uIChwcmV2LCBjdXIpIHtcbiAgICAgICAgcmV0dXJuIFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkocHJldiksIF90b0NvbnN1bWFibGVBcnJheShjdXIpKTtcbiAgICAgIH0sIFtdKTtcbiAgICAgIGdlb21ldHJ5LnNldEF0dHJpYnV0ZSgnYV9jb2xvcicsIEZsb2F0MzJBcnJheS5mcm9tKGNvbG9ycyksIHtcbiAgICAgICAgYXJyYXlTdHJpZGU6IDQgKiA0LFxuICAgICAgICBzdGVwTW9kZTogJ3ZlcnRleCcsXG4gICAgICAgIGF0dHJpYnV0ZXM6IFt7XG4gICAgICAgICAgc2hhZGVyTG9jYXRpb246IDEsXG4gICAgICAgICAgb2Zmc2V0OiAwLFxuICAgICAgICAgIGZvcm1hdDogJ2Zsb2F0NCdcbiAgICAgICAgfV1cbiAgICAgIH0pO1xuICAgICAgZ2VvbWV0cnkuc2V0QXR0cmlidXRlKCdhX2xpbmVfbWl0ZXInLCBGbG9hdDMyQXJyYXkuZnJvbShhdHRyTWl0ZXIpLCB7XG4gICAgICAgIGFycmF5U3RyaWRlOiA0ICogMSxcbiAgICAgICAgc3RlcE1vZGU6ICd2ZXJ0ZXgnLFxuICAgICAgICBhdHRyaWJ1dGVzOiBbe1xuICAgICAgICAgIHNoYWRlckxvY2F0aW9uOiAyLFxuICAgICAgICAgIG9mZnNldDogMCxcbiAgICAgICAgICBmb3JtYXQ6ICdmbG9hdCdcbiAgICAgICAgfV1cbiAgICAgIH0pO1xuICAgICAgZ2VvbWV0cnkuc2V0QXR0cmlidXRlKCdhX2xpbmVfbm9ybWFsJywgRmxvYXQzMkFycmF5LmZyb20oYXR0ck5vcm1hbC5yZWR1Y2UoZnVuY3Rpb24gKHByZXYsIGN1cikge1xuICAgICAgICByZXR1cm4gW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShwcmV2KSwgX3RvQ29uc3VtYWJsZUFycmF5KGN1cikpO1xuICAgICAgfSwgW10pKSwge1xuICAgICAgICBhcnJheVN0cmlkZTogNCAqIDIsXG4gICAgICAgIHN0ZXBNb2RlOiAndmVydGV4JyxcbiAgICAgICAgYXR0cmlidXRlczogW3tcbiAgICAgICAgICBzaGFkZXJMb2NhdGlvbjogMyxcbiAgICAgICAgICBvZmZzZXQ6IDAsXG4gICAgICAgICAgZm9ybWF0OiAnZmxvYXQyJ1xuICAgICAgICB9XVxuICAgICAgfSk7XG4gICAgICBnZW9tZXRyeS5zZXRBdHRyaWJ1dGUoJ2FfY291bnRlcnMnLCBGbG9hdDMyQXJyYXkuZnJvbShhdHRyQ291bnRlcnMpLCB7XG4gICAgICAgIGFycmF5U3RyaWRlOiA0ICogMSxcbiAgICAgICAgc3RlcE1vZGU6ICd2ZXJ0ZXgnLFxuICAgICAgICBhdHRyaWJ1dGVzOiBbe1xuICAgICAgICAgIHNoYWRlckxvY2F0aW9uOiA0LFxuICAgICAgICAgIG9mZnNldDogMCxcbiAgICAgICAgICBmb3JtYXQ6ICdmbG9hdCdcbiAgICAgICAgfV1cbiAgICAgIH0pO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBMaW5lO1xufShSZW5kZXJhYmxlKSwgX3RlbXApLCAoX2Rlc2NyaXB0b3IgPSBfYXBwbHlEZWNvcmF0ZWREZXNjcmlwdG9yKF9jbGFzczIucHJvdG90eXBlLCBcIm1hdGVyaWFsU3lzdGVtXCIsIFtfZGVjMiwgX2RlYzNdLCB7XG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgd3JpdGFibGU6IHRydWUsXG4gIGluaXRpYWxpemVyOiBudWxsXG59KSwgX2Rlc2NyaXB0b3IyID0gX2FwcGx5RGVjb3JhdGVkRGVzY3JpcHRvcihfY2xhc3MyLnByb3RvdHlwZSwgXCJnZW9tZXRyeVN5c3RlbVwiLCBbX2RlYzQsIF9kZWM1XSwge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHdyaXRhYmxlOiB0cnVlLFxuICBpbml0aWFsaXplcjogbnVsbFxufSksIF9kZXNjcmlwdG9yMyA9IF9hcHBseURlY29yYXRlZERlc2NyaXB0b3IoX2NsYXNzMi5wcm90b3R5cGUsIFwic2hhZGVyTW9kdWxlU2VydmljZVwiLCBbX2RlYzZdLCB7XG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgd3JpdGFibGU6IHRydWUsXG4gIGluaXRpYWxpemVyOiBudWxsXG59KSksIF9jbGFzczIpKSB8fCBfY2xhc3MpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiZXhwb3J0IGZ1bmN0aW9uIGVuY29kZVBpY2tpbmdDb2xvcihmZWF0dXJlSWR4KSB7XG4gIHJldHVybiBbZmVhdHVyZUlkeCArIDEgJiAyNTUsIGZlYXR1cmVJZHggKyAxID4+IDggJiAyNTUsIGZlYXR1cmVJZHggKyAxID4+IDggPj4gOCAmIDI1NV07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1waWNraW5nLmpzLm1hcCIsImltcG9ydCBfdG9Db25zdW1hYmxlQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvdG9Db25zdW1hYmxlQXJyYXlcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfaW5pdGlhbGl6ZXJEZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbml0aWFsaXplckRlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrXCI7XG5pbXBvcnQgX2NyZWF0ZUNsYXNzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzXCI7XG5pbXBvcnQgX2Fzc2VydFRoaXNJbml0aWFsaXplZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hc3NlcnRUaGlzSW5pdGlhbGl6ZWRcIjtcbmltcG9ydCBfaW5oZXJpdHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHNcIjtcbmltcG9ydCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuXCI7XG5pbXBvcnQgX2dldFByb3RvdHlwZU9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2dldFByb3RvdHlwZU9mXCI7XG5pbXBvcnQgX2FwcGx5RGVjb3JhdGVkRGVzY3JpcHRvciBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hcHBseURlY29yYXRlZERlc2NyaXB0b3JcIjtcbmltcG9ydCBfaW5pdGlhbGl6ZXJXYXJuaW5nSGVscGVyIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2luaXRpYWxpemVyV2FybmluZ0hlbHBlclwiO1xuXG52YXIgX2RlYywgX2RlYzIsIF9kZWMzLCBfZGVjNCwgX2RlYzUsIF9kZWM2LCBfY2xhc3MsIF9jbGFzczIsIF9kZXNjcmlwdG9yLCBfZGVzY3JpcHRvcjIsIF9kZXNjcmlwdG9yMywgX3RlbXA7XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBpZiAoZW51bWVyYWJsZU9ubHkpIHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlOyB9KTsga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9OyBpZiAoaSAlIDIpIHsgb3duS2V5cyhPYmplY3Qoc291cmNlKSwgdHJ1ZSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KTsgfSBlbHNlIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycykgeyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpOyB9IGVsc2UgeyBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7IH0pOyB9IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfY3JlYXRlU3VwZXIoRGVyaXZlZCkgeyB2YXIgaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCA9IF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKTsgcmV0dXJuIGZ1bmN0aW9uIF9jcmVhdGVTdXBlckludGVybmFsKCkgeyB2YXIgU3VwZXIgPSBfZ2V0UHJvdG90eXBlT2YoRGVyaXZlZCksIHJlc3VsdDsgaWYgKGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QpIHsgdmFyIE5ld1RhcmdldCA9IF9nZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3RvcjsgcmVzdWx0ID0gUmVmbGVjdC5jb25zdHJ1Y3QoU3VwZXIsIGFyZ3VtZW50cywgTmV3VGFyZ2V0KTsgfSBlbHNlIHsgcmVzdWx0ID0gU3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfSByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgcmVzdWx0KTsgfTsgfVxuXG5mdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkgeyBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwidW5kZWZpbmVkXCIgfHwgIVJlZmxlY3QuY29uc3RydWN0KSByZXR1cm4gZmFsc2U7IGlmIChSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKSByZXR1cm4gZmFsc2U7IGlmICh0eXBlb2YgUHJveHkgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHRydWU7IHRyeSB7IERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoRGF0ZSwgW10sIGZ1bmN0aW9uICgpIHt9KSk7IHJldHVybiB0cnVlOyB9IGNhdGNoIChlKSB7IHJldHVybiBmYWxzZTsgfSB9XG5cbmltcG9ydCB7IGdsLCBJREVOVElGSUVSIH0gZnJvbSAnQGFudHYvZy13ZWJncHUtY29yZSc7XG5pbXBvcnQgeyBpbmplY3QsIGluamVjdGFibGUsIG5hbWVkIH0gZnJvbSAnaW52ZXJzaWZ5JztcbmltcG9ydCB7IGVuY29kZVBpY2tpbmdDb2xvciB9IGZyb20gJy4uLy4uL3V0aWxzL3BpY2tpbmcnO1xuaW1wb3J0IHsgUmVuZGVyYWJsZSB9IGZyb20gJy4uL1JlbmRlcmFibGUnO1xuXG4vKiBiYWJlbC1wbHVnaW4taW5saW5lLWltcG9ydCAnLi9zaGFkZXJzL3dlYmdsLnBvaW50LmZyYWcuZ2xzbCcgKi9cbnZhciBwb2ludEZyYWcgPSBcInVuaWZvcm0gZmxvYXQgdV9ibHVyIDogMC4wNTtcXG51bmlmb3JtIGZsb2F0IHVfb3BhY2l0eSA6IDAuNztcXG51bmlmb3JtIGZsb2F0IHVfc3Ryb2tlX3dpZHRoIDogMC4wMTtcXG51bmlmb3JtIHZlYzQgdV9zdHJva2VfY29sb3IgOiBbMCwgMCwgMCwgMF07XFxudW5pZm9ybSBmbG9hdCB1X3N0cm9rZV9vcGFjaXR5IDogMTtcXG5cXG52YXJ5aW5nIHZlYzQgdl9jb2xvcjtcXG52YXJ5aW5nIHZlYzQgdl9kYXRhO1xcbnZhcnlpbmcgZmxvYXQgdl9yYWRpdXM7XFxuXFxuI3ByYWdtYSBpbmNsdWRlIFxcXCJzZGYyZFxcXCJcXG4jcHJhZ21hIGluY2x1ZGUgXFxcInBpY2tpbmdcXFwiXFxuXFxudm9pZCBtYWluKCkge1xcbiAgaW50IHNoYXBlID0gaW50KGZsb29yKHZfZGF0YS53ICsgMC41KSk7XFxuXFxuICBmbG9hdCBhbnRpYWxpYXNibHVyID0gdl9kYXRhLno7XFxuICBmbG9hdCBhbnRpYWxpYXNlZF9ibHVyID0gLW1heCh1X2JsdXIsIGFudGlhbGlhc2JsdXIpO1xcbiAgZmxvYXQgciA9IHZfcmFkaXVzIC8gKHZfcmFkaXVzICsgdV9zdHJva2Vfd2lkdGgpO1xcblxcbiAgZmxvYXQgb3V0ZXJfZGY7XFxuICBmbG9hdCBpbm5lcl9kZjtcXG4gIC8vICdjaXJjbGUnLCAndHJpYW5nbGUnLCAnc3F1YXJlJywgJ3BlbnRhZ29uJywgJ2hleGFnb24nLCAnb2N0b2dvbicsICdoZXhhZ3JhbScsICdyaG9tYnVzJywgJ3Zlc2ljYSdcXG4gIC8vIGlmIChzaGFwZSA9PSAwKSB7XFxuICAgIG91dGVyX2RmID0gc2RDaXJjbGUodl9kYXRhLnh5LCAxLjApO1xcbiAgICBpbm5lcl9kZiA9IHNkQ2lyY2xlKHZfZGF0YS54eSwgcik7XFxuICAvLyB9IGVsc2UgaWYgKHNoYXBlID09IDEpIHtcXG4gIC8vICAgb3V0ZXJfZGYgPSBzZEVxdWlsYXRlcmFsVHJpYW5nbGUoMS4xICogdl9kYXRhLnh5KTtcXG4gIC8vICAgaW5uZXJfZGYgPSBzZEVxdWlsYXRlcmFsVHJpYW5nbGUoMS4xIC8gciAqIHZfZGF0YS54eSk7XFxuICAvLyB9IGVsc2UgaWYgKHNoYXBlID09IDIpIHtcXG4gIC8vICAgb3V0ZXJfZGYgPSBzZEJveCh2X2RhdGEueHksIHZlYzIoMS4pKTtcXG4gIC8vICAgaW5uZXJfZGYgPSBzZEJveCh2X2RhdGEueHksIHZlYzIocikpO1xcbiAgLy8gfSBlbHNlIGlmIChzaGFwZSA9PSAzKSB7XFxuICAvLyAgIG91dGVyX2RmID0gc2RQZW50YWdvbih2X2RhdGEueHksIDAuOCk7XFxuICAvLyAgIGlubmVyX2RmID0gc2RQZW50YWdvbih2X2RhdGEueHksIHIgKiAwLjgpO1xcbiAgLy8gfSBlbHNlIGlmIChzaGFwZSA9PSA0KSB7XFxuICAvLyAgIG91dGVyX2RmID0gc2RIZXhhZ29uKHZfZGF0YS54eSwgMC44KTtcXG4gIC8vICAgaW5uZXJfZGYgPSBzZEhleGFnb24odl9kYXRhLnh5LCByICogMC44KTtcXG4gIC8vIH0gZWxzZSBpZiAoc2hhcGUgPT0gNSkge1xcbiAgLy8gICBvdXRlcl9kZiA9IHNkT2N0b2dvbih2X2RhdGEueHksIDEuMCk7XFxuICAvLyAgIGlubmVyX2RmID0gc2RPY3RvZ29uKHZfZGF0YS54eSwgcik7XFxuICAvLyB9IGVsc2UgaWYgKHNoYXBlID09IDYpIHtcXG4gIC8vICAgb3V0ZXJfZGYgPSBzZEhleGFncmFtKHZfZGF0YS54eSwgMC41Mik7XFxuICAvLyAgIGlubmVyX2RmID0gc2RIZXhhZ3JhbSh2X2RhdGEueHksIHIgKiAwLjUyKTtcXG4gIC8vIH0gZWxzZSBpZiAoc2hhcGUgPT0gNykge1xcbiAgLy8gICBvdXRlcl9kZiA9IHNkUmhvbWJ1cyh2X2RhdGEueHksIHZlYzIoMS4wKSk7XFxuICAvLyAgIGlubmVyX2RmID0gc2RSaG9tYnVzKHZfZGF0YS54eSwgdmVjMihyKSk7XFxuICAvLyB9IGVsc2UgaWYgKHNoYXBlID09IDgpIHtcXG4gIC8vICAgb3V0ZXJfZGYgPSBzZFZlc2ljYSh2X2RhdGEueHksIDEuMSwgMC44KTtcXG4gIC8vICAgaW5uZXJfZGYgPSBzZFZlc2ljYSh2X2RhdGEueHksIHIgKiAxLjEsIHIgKiAwLjgpO1xcbiAgLy8gfVxcblxcbiAgZmxvYXQgb3BhY2l0eV90ID0gc21vb3Roc3RlcCgwLjAsIGFudGlhbGlhc2VkX2JsdXIsIG91dGVyX2RmKTtcXG5cXG4gIGZsb2F0IGNvbG9yX3QgPSB1X3N0cm9rZV93aWR0aCA8IDAuMDEgPyAwLjAgOiBzbW9vdGhzdGVwKFxcbiAgICBhbnRpYWxpYXNlZF9ibHVyLFxcbiAgICAwLjAsXFxuICAgIGlubmVyX2RmXFxuICApO1xcbiAgdmVjNCBzdHJva2VDb2xvciA9IHVfc3Ryb2tlX2NvbG9yID09IHZlYzQoMCkgPyB2X2NvbG9yIDogdV9zdHJva2VfY29sb3I7XFxuXFxuICBnbF9GcmFnQ29sb3IgPSBtaXgodmVjNCh2X2NvbG9yLnJnYiwgdl9jb2xvci5hICogdV9vcGFjaXR5KSwgc3Ryb2tlQ29sb3IgKiB1X3N0cm9rZV9vcGFjaXR5LCBjb2xvcl90KTtcXG4gIGdsX0ZyYWdDb2xvci5hID0gZ2xfRnJhZ0NvbG9yLmEgKiBvcGFjaXR5X3Q7XFxuXFxuICBnbF9GcmFnQ29sb3IgPSBmaWx0ZXJDb2xvcihnbF9GcmFnQ29sb3IpO1xcbn1cIjtcblxuLyogYmFiZWwtcGx1Z2luLWlubGluZS1pbXBvcnQgJy4vc2hhZGVycy93ZWJnbC5wb2ludC52ZXJ0Lmdsc2wnICovXG52YXIgcG9pbnRWZXJ0ID0gXCJhdHRyaWJ1dGUgdmVjMiBwb3NpdGlvbjtcXG5hdHRyaWJ1dGUgdmVjNCBjb2xvcjtcXG5hdHRyaWJ1dGUgZmxvYXQgc2hhcGU7XFxuYXR0cmlidXRlIHZlYzIgb2Zmc2V0O1xcbmF0dHJpYnV0ZSBmbG9hdCBzaXplO1xcblxcbnVuaWZvcm0gbWF0NCBwcm9qZWN0aW9uTWF0cml4O1xcbnVuaWZvcm0gbWF0NCBtb2RlbFZpZXdNYXRyaXg7XFxuXFxudW5pZm9ybSBmbG9hdCB1X3N0cm9rZV93aWR0aCA6IDAuMDE7XFxudW5pZm9ybSBmbG9hdCB1X2RldmljZV9waXhlbF9yYXRpbztcXG51bmlmb3JtIHZlYzIgdV92aWV3cG9ydDtcXG5cXG52YXJ5aW5nIHZlYzQgdl9jb2xvcjtcXG52YXJ5aW5nIHZlYzQgdl9kYXRhO1xcbnZhcnlpbmcgZmxvYXQgdl9yYWRpdXM7XFxuXFxuI3ByYWdtYSBpbmNsdWRlIFxcXCJwaWNraW5nXFxcIlxcblxcbnZvaWQgbWFpbigpIHtcXG4gIHZfY29sb3IgPSBjb2xvcjtcXG4gIHZfcmFkaXVzID0gc2l6ZTtcXG5cXG4gIGxvd3AgZmxvYXQgYW50aWFsaWFzYmx1ciA9IDEuMCAvIHVfZGV2aWNlX3BpeGVsX3JhdGlvICogKHNpemUgKyB1X3N0cm9rZV93aWR0aCk7XFxuXFxuICAvLyBjb25zdHJ1Y3QgcG9pbnQgY29vcmRzXFxuICB2X2RhdGEgPSB2ZWM0KHBvc2l0aW9uLCBhbnRpYWxpYXNibHVyLCBzaGFwZSk7XFxuXFxuICBnbF9Qb3NpdGlvbiA9IHByb2plY3Rpb25NYXRyaXggKiBtb2RlbFZpZXdNYXRyaXhcXG4gICAgKiB2ZWM0KHBvc2l0aW9uICogc2l6ZSArIG9mZnNldCwgMC4wLCAxLjApO1xcblxcbiAgc2V0UGlja2luZ0NvbG9yKGFfUGlja2luZ0NvbG9yKTtcXG59XCI7XG52YXIgcG9pbnRTaGFwZXMgPSBbJ2NpcmNsZScsICd0cmlhbmdsZScsICdzcXVhcmUnLCAncGVudGFnb24nLCAnaGV4YWdvbicsICdvY3RvZ29uJywgJ2hleGFncmFtJywgJ3Job21idXMnLCAndmVzaWNhJ107XG5leHBvcnRcbi8qKlxuICogVXNlIFNERiB0byBkcmF3IDJEIHBvaW50IHdpdGggc3Ryb2tlLlxuICovXG52YXIgUG9pbnQgPSAoX2RlYyA9IGluamVjdGFibGUoKSwgX2RlYzIgPSBpbmplY3QoSURFTlRJRklFUi5TeXN0ZW1zKSwgX2RlYzMgPSBuYW1lZChJREVOVElGSUVSLk1hdGVyaWFsU3lzdGVtKSwgX2RlYzQgPSBpbmplY3QoSURFTlRJRklFUi5TeXN0ZW1zKSwgX2RlYzUgPSBuYW1lZChJREVOVElGSUVSLkdlb21ldHJ5U3lzdGVtKSwgX2RlYzYgPSBpbmplY3QoSURFTlRJRklFUi5TaGFkZXJNb2R1bGVTZXJ2aWNlKSwgX2RlYyhfY2xhc3MgPSAoX2NsYXNzMiA9IChfdGVtcCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1JlbmRlcmFibGUpIHtcbiAgX2luaGVyaXRzKFBvaW50LCBfUmVuZGVyYWJsZSk7XG5cbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlcihQb2ludCk7XG5cbiAgZnVuY3Rpb24gUG9pbnQoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFBvaW50KTtcblxuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICBfdGhpcyA9IF9zdXBlci5jYWxsLmFwcGx5KF9zdXBlciwgW3RoaXNdLmNvbmNhdChhcmdzKSk7XG5cbiAgICBfaW5pdGlhbGl6ZXJEZWZpbmVQcm9wZXJ0eShfdGhpcywgXCJtYXRlcmlhbFN5c3RlbVwiLCBfZGVzY3JpcHRvciwgX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcykpO1xuXG4gICAgX2luaXRpYWxpemVyRGVmaW5lUHJvcGVydHkoX3RoaXMsIFwiZ2VvbWV0cnlTeXN0ZW1cIiwgX2Rlc2NyaXB0b3IyLCBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSk7XG5cbiAgICBfaW5pdGlhbGl6ZXJEZWZpbmVQcm9wZXJ0eShfdGhpcywgXCJzaGFkZXJNb2R1bGVTZXJ2aWNlXCIsIF9kZXNjcmlwdG9yMywgX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcykpO1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKFBvaW50LCBbe1xuICAgIGtleTogXCJvbkF0dHJpYnV0ZUNoYW5nZWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gb25BdHRyaWJ1dGVDaGFuZ2VkKF9yZWYpIHtcbiAgICAgIHZhciBuYW1lID0gX3JlZi5uYW1lLFxuICAgICAgICAgIGRhdGEgPSBfcmVmLmRhdGE7XG4gICAgICB2YXIgbWVzaCA9IHRoaXMuZ2V0TWVzaENvbXBvbmVudCgpO1xuXG4gICAgICBpZiAobWVzaCAmJiBtZXNoLm1hdGVyaWFsKSB7XG4gICAgICAgIGlmIChuYW1lID09PSAnc3Ryb2tlV2lkdGgnKSB7XG4gICAgICAgICAgbWVzaC5tYXRlcmlhbC5zZXRVbmlmb3JtKCd1X3N0cm9rZV93aWR0aCcsIGRhdGEpO1xuICAgICAgICB9IGVsc2UgaWYgKG5hbWUgPT09ICdzdHJva2VDb2xvcicpIHtcbiAgICAgICAgICBtZXNoLm1hdGVyaWFsLnNldFVuaWZvcm0oJ3Vfc3Ryb2tlX2NvbG9yJywgZGF0YSk7XG4gICAgICAgIH0gZWxzZSBpZiAobmFtZSA9PT0gJ3N0cm9rZU9wYWNpdHknKSB7XG4gICAgICAgICAgbWVzaC5tYXRlcmlhbC5zZXRVbmlmb3JtKCd1X3N0cm9rZV9vcGFjaXR5JywgZGF0YSk7XG4gICAgICAgIH0gZWxzZSBpZiAobmFtZSA9PT0gJ29wYWNpdHknKSB7XG4gICAgICAgICAgbWVzaC5tYXRlcmlhbC5zZXRVbmlmb3JtKCd1X29wYWNpdHknLCBkYXRhKTtcbiAgICAgICAgfSBlbHNlIGlmIChuYW1lID09PSAnYmx1cicpIHtcbiAgICAgICAgICBtZXNoLm1hdGVyaWFsLnNldFVuaWZvcm0oJ3VfYmx1cicsIGRhdGEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIm9uRW50aXR5Q3JlYXRlZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvbkVudGl0eUNyZWF0ZWQoKSB7XG4gICAgICB0aGlzLnNoYWRlck1vZHVsZVNlcnZpY2UucmVnaXN0ZXJNb2R1bGUoJ2dyaWQnLCB7XG4gICAgICAgIHZzOiBwb2ludFZlcnQsXG4gICAgICAgIGZzOiBwb2ludEZyYWdcbiAgICAgIH0pO1xuXG4gICAgICB2YXIgX3RoaXMkc2hhZGVyTW9kdWxlU2VyID0gdGhpcy5zaGFkZXJNb2R1bGVTZXJ2aWNlLmdldE1vZHVsZSgnZ3JpZCcpLFxuICAgICAgICAgIHZzID0gX3RoaXMkc2hhZGVyTW9kdWxlU2VyLnZzLFxuICAgICAgICAgIGZzID0gX3RoaXMkc2hhZGVyTW9kdWxlU2VyLmZzLFxuICAgICAgICAgIGV4dHJhY3RlZFVuaWZvcm1zID0gX3RoaXMkc2hhZGVyTW9kdWxlU2VyLnVuaWZvcm1zO1xuXG4gICAgICB2YXIgbWF0ZXJpYWwgPSB0aGlzLm1hdGVyaWFsU3lzdGVtLmNyZWF0ZVNoYWRlck1hdGVyaWFsKHtcbiAgICAgICAgdmVydGV4U2hhZGVyOiB2cyxcbiAgICAgICAgZnJhZ21lbnRTaGFkZXI6IGZzLFxuICAgICAgICBjdWxsOiB7XG4gICAgICAgICAgZW5hYmxlOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBkZXB0aDoge1xuICAgICAgICAgIGVuYWJsZTogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgYmxlbmQ6IHtcbiAgICAgICAgICBlbmFibGU6IHRydWUsXG4gICAgICAgICAgZnVuYzoge1xuICAgICAgICAgICAgc3JjUkdCOiBnbC5TUkNfQUxQSEEsXG4gICAgICAgICAgICBkc3RSR0I6IGdsLk9ORV9NSU5VU19TUkNfQUxQSEEsXG4gICAgICAgICAgICBzcmNBbHBoYTogMSxcbiAgICAgICAgICAgIGRzdEFscGhhOiAxXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTsgLy8gVE9ETzogc3VwcG9ydCBkZWZpbmUgc3Ryb2tlLXJlbGF0aXZlIHByb3BzIHBlciBwb2ludFxuXG4gICAgICBtYXRlcmlhbC5zZXRVbmlmb3JtKF9vYmplY3RTcHJlYWQoe1xuICAgICAgICB1X2RldmljZV9waXhlbF9yYXRpbzogd2luZG93LmRldmljZVBpeGVsUmF0aW9cbiAgICAgIH0sIGV4dHJhY3RlZFVuaWZvcm1zKSk7XG4gICAgICB2YXIgYXR0cmlidXRlcyA9IHRoaXMuYnVpbGRBdHRyaWJ1dGVzKCk7XG4gICAgICB2YXIgZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5U3lzdGVtLmNyZWF0ZUluc3RhbmNlZEJ1ZmZlckdlb21ldHJ5KHtcbiAgICAgICAgbWF4SW5zdGFuY2VkQ291bnQ6IGF0dHJpYnV0ZXMuaW5zdGFuY2VkT2Zmc2V0cy5sZW5ndGggLyAyLFxuICAgICAgICB2ZXJ0ZXhDb3VudDogNlxuICAgICAgfSk7XG4gICAgICBnZW9tZXRyeS5zZXRJbmRleChbMCwgMiwgMSwgMCwgMywgMl0pO1xuICAgICAgZ2VvbWV0cnkuc2V0QXR0cmlidXRlKCdwb3NpdGlvbicsIEZsb2F0MzJBcnJheS5mcm9tKGF0dHJpYnV0ZXMucG9zaXRpb25zKSwge1xuICAgICAgICBhcnJheVN0cmlkZTogNCAqIDIsXG4gICAgICAgIHN0ZXBNb2RlOiAndmVydGV4JyxcbiAgICAgICAgYXR0cmlidXRlczogW3tcbiAgICAgICAgICBzaGFkZXJMb2NhdGlvbjogMCxcbiAgICAgICAgICBvZmZzZXQ6IDAsXG4gICAgICAgICAgZm9ybWF0OiAnZmxvYXQyJ1xuICAgICAgICB9XVxuICAgICAgfSk7XG4gICAgICBnZW9tZXRyeS5zZXRBdHRyaWJ1dGUoJ29mZnNldCcsIEZsb2F0MzJBcnJheS5mcm9tKGF0dHJpYnV0ZXMuaW5zdGFuY2VkT2Zmc2V0cyksIHtcbiAgICAgICAgYXJyYXlTdHJpZGU6IDQgKiAyLFxuICAgICAgICBzdGVwTW9kZTogJ2luc3RhbmNlJyxcbiAgICAgICAgYXR0cmlidXRlczogW3tcbiAgICAgICAgICBzaGFkZXJMb2NhdGlvbjogMSxcbiAgICAgICAgICBvZmZzZXQ6IDAsXG4gICAgICAgICAgZm9ybWF0OiAnZmxvYXQyJ1xuICAgICAgICB9XVxuICAgICAgfSk7XG4gICAgICBnZW9tZXRyeS5zZXRBdHRyaWJ1dGUoJ2NvbG9yJywgRmxvYXQzMkFycmF5LmZyb20oYXR0cmlidXRlcy5pbnN0YW5jZWRDb2xvcnMpLCB7XG4gICAgICAgIGFycmF5U3RyaWRlOiA0ICogNCxcbiAgICAgICAgc3RlcE1vZGU6ICdpbnN0YW5jZScsXG4gICAgICAgIGF0dHJpYnV0ZXM6IFt7XG4gICAgICAgICAgc2hhZGVyTG9jYXRpb246IDIsXG4gICAgICAgICAgb2Zmc2V0OiAwLFxuICAgICAgICAgIGZvcm1hdDogJ2Zsb2F0NCdcbiAgICAgICAgfV1cbiAgICAgIH0pO1xuICAgICAgZ2VvbWV0cnkuc2V0QXR0cmlidXRlKCdzaXplJywgRmxvYXQzMkFycmF5LmZyb20oYXR0cmlidXRlcy5pbnN0YW5jZWRTaXplcyksIHtcbiAgICAgICAgYXJyYXlTdHJpZGU6IDQsXG4gICAgICAgIHN0ZXBNb2RlOiAnaW5zdGFuY2UnLFxuICAgICAgICBhdHRyaWJ1dGVzOiBbe1xuICAgICAgICAgIHNoYWRlckxvY2F0aW9uOiAzLFxuICAgICAgICAgIG9mZnNldDogMCxcbiAgICAgICAgICBmb3JtYXQ6ICdmbG9hdCdcbiAgICAgICAgfV1cbiAgICAgIH0pO1xuICAgICAgZ2VvbWV0cnkuc2V0QXR0cmlidXRlKCdzaGFwZScsIEZsb2F0MzJBcnJheS5mcm9tKGF0dHJpYnV0ZXMuaW5zdGFuY2VkU2hhcGVzKSwge1xuICAgICAgICBhcnJheVN0cmlkZTogNCxcbiAgICAgICAgc3RlcE1vZGU6ICdpbnN0YW5jZScsXG4gICAgICAgIGF0dHJpYnV0ZXM6IFt7XG4gICAgICAgICAgc2hhZGVyTG9jYXRpb246IDQsXG4gICAgICAgICAgb2Zmc2V0OiAwLFxuICAgICAgICAgIGZvcm1hdDogJ2Zsb2F0J1xuICAgICAgICB9XVxuICAgICAgfSk7XG4gICAgICBnZW9tZXRyeS5zZXRBdHRyaWJ1dGUoJ2FfUGlja2luZ0NvbG9yJywgRmxvYXQzMkFycmF5LmZyb20oYXR0cmlidXRlcy5pbnN0YW5jZWRQaWNraW5nQ29sb3JzKSwge1xuICAgICAgICBhcnJheVN0cmlkZTogNCAqIDMsXG4gICAgICAgIHN0ZXBNb2RlOiAnaW5zdGFuY2UnLFxuICAgICAgICBhdHRyaWJ1dGVzOiBbe1xuICAgICAgICAgIHNoYWRlckxvY2F0aW9uOiA2LFxuICAgICAgICAgIG9mZnNldDogMCxcbiAgICAgICAgICBmb3JtYXQ6ICdmbG9hdDMnXG4gICAgICAgIH1dXG4gICAgICB9KTtcbiAgICAgIHRoaXMuc2V0TWF0ZXJpYWwobWF0ZXJpYWwpO1xuICAgICAgdGhpcy5zZXRHZW9tZXRyeShnZW9tZXRyeSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImJ1aWxkQXR0cmlidXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGJ1aWxkQXR0cmlidXRlKGNvbmZpZywgYXR0cmlidXRlcywgaW5kZXgpIHtcbiAgICAgIHZhciBfYXR0cmlidXRlcyRpbnN0YW5jZWQsIF9hdHRyaWJ1dGVzJGluc3RhbmNlZDIsIF9hdHRyaWJ1dGVzJGluc3RhbmNlZDMsIF9hdHRyaWJ1dGVzJGluc3RhbmNlZDQ7XG5cbiAgICAgIChfYXR0cmlidXRlcyRpbnN0YW5jZWQgPSBhdHRyaWJ1dGVzLmluc3RhbmNlZFBpY2tpbmdDb2xvcnMpLnB1c2guYXBwbHkoX2F0dHJpYnV0ZXMkaW5zdGFuY2VkLCBfdG9Db25zdW1hYmxlQXJyYXkoZW5jb2RlUGlja2luZ0NvbG9yKGNvbmZpZy5pZCB8fCBpbmRleCkpKTtcblxuICAgICAgYXR0cmlidXRlcy5pbnN0YW5jZWRTaGFwZXMucHVzaChwb2ludFNoYXBlcy5pbmRleE9mKGNvbmZpZy5zaGFwZSB8fCAnY2lyY2xlJykpO1xuXG4gICAgICAoX2F0dHJpYnV0ZXMkaW5zdGFuY2VkMiA9IGF0dHJpYnV0ZXMuaW5zdGFuY2VkQ29sb3JzKS5wdXNoLmFwcGx5KF9hdHRyaWJ1dGVzJGluc3RhbmNlZDIsIF90b0NvbnN1bWFibGVBcnJheShjb25maWcuY29sb3IgfHwgWzEsIDAsIDAsIDFdKSk7XG5cbiAgICAgIChfYXR0cmlidXRlcyRpbnN0YW5jZWQzID0gYXR0cmlidXRlcy5pbnN0YW5jZWRPZmZzZXRzKS5wdXNoLmFwcGx5KF9hdHRyaWJ1dGVzJGluc3RhbmNlZDMsIF90b0NvbnN1bWFibGVBcnJheShjb25maWcucG9zaXRpb24gfHwgWzAsIDBdKSk7XG5cbiAgICAgIChfYXR0cmlidXRlcyRpbnN0YW5jZWQ0ID0gYXR0cmlidXRlcy5pbnN0YW5jZWRTaXplcykucHVzaC5hcHBseShfYXR0cmlidXRlcyRpbnN0YW5jZWQ0LCBfdG9Db25zdW1hYmxlQXJyYXkoY29uZmlnLnNpemUgfHwgWzAuMiwgMC4yXSkpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJidWlsZEF0dHJpYnV0ZXNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYnVpbGRBdHRyaWJ1dGVzKCkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIHZhciBhdHRyaWJ1dGVzID0ge1xuICAgICAgICBwb3NpdGlvbnM6IFsxLCAxLCAxLCAtMSwgLTEsIC0xLCAtMSwgMV0sXG4gICAgICAgIGluc3RhbmNlZE9mZnNldHM6IFtdLFxuICAgICAgICBpbnN0YW5jZWRDb2xvcnM6IFtdLFxuICAgICAgICBpbnN0YW5jZWRTaXplczogW10sXG4gICAgICAgIGluc3RhbmNlZFNoYXBlczogW10sXG4gICAgICAgIGluc3RhbmNlZFBpY2tpbmdDb2xvcnM6IFtdXG4gICAgICB9O1xuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLmNvbmZpZykpIHtcbiAgICAgICAgdGhpcy5jb25maWcuZm9yRWFjaChmdW5jdGlvbiAoY29uZmlnLCBpKSB7XG4gICAgICAgICAgX3RoaXMyLmJ1aWxkQXR0cmlidXRlKGNvbmZpZywgYXR0cmlidXRlcywgaSk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5idWlsZEF0dHJpYnV0ZSh0aGlzLmNvbmZpZywgYXR0cmlidXRlcywgMCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhdHRyaWJ1dGVzO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBQb2ludDtcbn0oUmVuZGVyYWJsZSksIF90ZW1wKSwgKF9kZXNjcmlwdG9yID0gX2FwcGx5RGVjb3JhdGVkRGVzY3JpcHRvcihfY2xhc3MyLnByb3RvdHlwZSwgXCJtYXRlcmlhbFN5c3RlbVwiLCBbX2RlYzIsIF9kZWMzXSwge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHdyaXRhYmxlOiB0cnVlLFxuICBpbml0aWFsaXplcjogbnVsbFxufSksIF9kZXNjcmlwdG9yMiA9IF9hcHBseURlY29yYXRlZERlc2NyaXB0b3IoX2NsYXNzMi5wcm90b3R5cGUsIFwiZ2VvbWV0cnlTeXN0ZW1cIiwgW19kZWM0LCBfZGVjNV0sIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICB3cml0YWJsZTogdHJ1ZSxcbiAgaW5pdGlhbGl6ZXI6IG51bGxcbn0pLCBfZGVzY3JpcHRvcjMgPSBfYXBwbHlEZWNvcmF0ZWREZXNjcmlwdG9yKF9jbGFzczIucHJvdG90eXBlLCBcInNoYWRlck1vZHVsZVNlcnZpY2VcIiwgW19kZWM2XSwge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHdyaXRhYmxlOiB0cnVlLFxuICBpbml0aWFsaXplcjogbnVsbFxufSkpLCBfY2xhc3MyKSkgfHwgX2NsYXNzKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsImltcG9ydCBfcmVnZW5lcmF0b3JSdW50aW1lIGZyb20gXCJAYmFiZWwvcnVudGltZS9yZWdlbmVyYXRvclwiO1xuaW1wb3J0IF9hc3luY1RvR2VuZXJhdG9yIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2FzeW5jVG9HZW5lcmF0b3JcIjtcbmltcG9ydCBfaW5pdGlhbGl6ZXJEZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbml0aWFsaXplckRlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrXCI7XG5pbXBvcnQgX2NyZWF0ZUNsYXNzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzXCI7XG5pbXBvcnQgX2FwcGx5RGVjb3JhdGVkRGVzY3JpcHRvciBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hcHBseURlY29yYXRlZERlc2NyaXB0b3JcIjtcbmltcG9ydCBfaW5pdGlhbGl6ZXJXYXJuaW5nSGVscGVyIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2luaXRpYWxpemVyV2FybmluZ0hlbHBlclwiO1xuXG52YXIgX2RlYywgX2RlYzIsIF9kZWMzLCBfZGVjNCwgX2NsYXNzLCBfY2xhc3MyLCBfZGVzY3JpcHRvciwgX2Rlc2NyaXB0b3IyLCBfZGVzY3JpcHRvcjMsIF90ZW1wO1xuXG5mdW5jdGlvbiBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihvLCBhbGxvd0FycmF5TGlrZSkgeyB2YXIgaXQ7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcInVuZGVmaW5lZFwiIHx8IG9bU3ltYm9sLml0ZXJhdG9yXSA9PSBudWxsKSB7IGlmIChBcnJheS5pc0FycmF5KG8pIHx8IChpdCA9IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvKSkgfHwgYWxsb3dBcnJheUxpa2UgJiYgbyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHsgaWYgKGl0KSBvID0gaXQ7IHZhciBpID0gMDsgdmFyIEYgPSBmdW5jdGlvbiBGKCkge307IHJldHVybiB7IHM6IEYsIG46IGZ1bmN0aW9uIG4oKSB7IGlmIChpID49IG8ubGVuZ3RoKSByZXR1cm4geyBkb25lOiB0cnVlIH07IHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogb1tpKytdIH07IH0sIGU6IGZ1bmN0aW9uIGUoX2UpIHsgdGhyb3cgX2U7IH0sIGY6IEYgfTsgfSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH0gdmFyIG5vcm1hbENvbXBsZXRpb24gPSB0cnVlLCBkaWRFcnIgPSBmYWxzZSwgZXJyOyByZXR1cm4geyBzOiBmdW5jdGlvbiBzKCkgeyBpdCA9IG9bU3ltYm9sLml0ZXJhdG9yXSgpOyB9LCBuOiBmdW5jdGlvbiBuKCkgeyB2YXIgc3RlcCA9IGl0Lm5leHQoKTsgbm9ybWFsQ29tcGxldGlvbiA9IHN0ZXAuZG9uZTsgcmV0dXJuIHN0ZXA7IH0sIGU6IGZ1bmN0aW9uIGUoX2UyKSB7IGRpZEVyciA9IHRydWU7IGVyciA9IF9lMjsgfSwgZjogZnVuY3Rpb24gZigpIHsgdHJ5IHsgaWYgKCFub3JtYWxDb21wbGV0aW9uICYmIGl0LnJldHVybiAhPSBudWxsKSBpdC5yZXR1cm4oKTsgfSBmaW5hbGx5IHsgaWYgKGRpZEVycikgdGhyb3cgZXJyOyB9IH0gfTsgfVxuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IH1cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9XG5cbmltcG9ydCB7IElERU5USUZJRVIgfSBmcm9tICdAYW50di9nLXdlYmdwdS1jb3JlJzsgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLXN1Ym1vZHVsZS1pbXBvcnRzXG5cbmltcG9ydCAqIGFzIFdlYkdQVUNvbnN0YW50cyBmcm9tICdAd2ViZ3B1L3R5cGVzL2Rpc3QvY29uc3RhbnRzJztcbmltcG9ydCB7IGluamVjdCwgaW5qZWN0YWJsZSB9IGZyb20gJ2ludmVyc2lmeSc7XG5cbi8qIGJhYmVsLXBsdWdpbi1pbmxpbmUtaW1wb3J0ICcuL21hdGVyaWFsL3NoYWRlcnMvbWFwLmZyYWcuZGVjbGFyYXRpb24uZ2xzbCcgKi9cbnZhciBtYXBGcmFnRGVjbGFyYXRpb24gPSBcIiNpZmRlZiBVU0VfTUFQXFxuICB1bmlmb3JtIHNhbXBsZXIyRCBtYXA7XFxuI2VuZGlmXCI7XG5cbi8qIGJhYmVsLXBsdWdpbi1pbmxpbmUtaW1wb3J0ICcuL21hdGVyaWFsL3NoYWRlcnMvbWFwLmZyYWcubWFpbi5nbHNsJyAqL1xudmFyIG1hcEZyYWdNYWluID0gXCIjaWZkZWYgVVNFX01BUFxcbiAgdmVjNCB0ZXhlbENvbG9yID0gdGV4dHVyZTJEKG1hcCwgdlV2KTtcXG4gIC8vIHRleGVsQ29sb3IgPSBtYXBUZXhlbFRvTGluZWFyKHRleGVsQ29sb3IpO1xcbiAgZGlmZnVzZUNvbG9yICo9IHRleGVsQ29sb3I7XFxuI2VuZGlmXCI7XG5cbi8qIGJhYmVsLXBsdWdpbi1pbmxpbmUtaW1wb3J0ICcuL21hdGVyaWFsL3NoYWRlcnMvdXYuZnJhZy5kZWNsYXJhdGlvbi5nbHNsJyAqL1xudmFyIHV2RnJhZ0RlY2xhcmF0aW9uID0gXCIjaWYgKGRlZmluZWQoIFVTRV9VViApICYmICEgZGVmaW5lZCggVVZTX1ZFUlRFWF9PTkxZICkpXFxuICB2YXJ5aW5nIHZlYzIgdlV2O1xcbiNlbmRpZlwiO1xuXG4vKiBiYWJlbC1wbHVnaW4taW5saW5lLWltcG9ydCAnLi9tYXRlcmlhbC9zaGFkZXJzL3V2LnZlcnQuZGVjbGFyYXRpb24uZ2xzbCcgKi9cbnZhciB1dlZlcnREZWNsYXJhdGlvbiA9IFwiI2lmZGVmIFVTRV9VVlxcbiAgYXR0cmlidXRlIHZlYzIgdXY7XFxuXFx0I2lmZGVmIFVWU19WRVJURVhfT05MWVxcbiAgICB2ZWMyIHZVdjtcXG5cXHQjZWxzZVxcblxcdFxcdHZhcnlpbmcgdmVjMiB2VXY7XFxuXFx0I2VuZGlmXFxuXFx0dW5pZm9ybSBtYXQzIHV2VHJhbnNmb3JtO1xcbiNlbmRpZlwiO1xuXG4vKiBiYWJlbC1wbHVnaW4taW5saW5lLWltcG9ydCAnLi9tYXRlcmlhbC9zaGFkZXJzL3V2LnZlcnQubWFpbi5nbHNsJyAqL1xudmFyIHV2VmVydE1haW4gPSBcIiNpZmRlZiBVU0VfVVZcXG4gIHZVdiA9ICh1dlRyYW5zZm9ybSAqIHZlYzModXYsIDEpKS54eTtcXG4jZW5kaWZcIjtcbmV4cG9ydCB2YXIgUmVuZGVyZXIgPSAoX2RlYyA9IGluamVjdGFibGUoKSwgX2RlYzIgPSBpbmplY3QoSURFTlRJRklFUi5SZW5kZXJFbmdpbmUpLCBfZGVjMyA9IGluamVjdChJREVOVElGSUVSLlNoYWRlck1vZHVsZVNlcnZpY2UpLCBfZGVjNCA9IGluamVjdChJREVOVElGSUVSLkNvbmZpZ1NlcnZpY2UpLCBfZGVjKF9jbGFzcyA9IChfY2xhc3MyID0gKF90ZW1wID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gUmVuZGVyZXIoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFJlbmRlcmVyKTtcblxuICAgIHRoaXMuY29udGFpbmVyID0gdm9pZCAwO1xuXG4gICAgX2luaXRpYWxpemVyRGVmaW5lUHJvcGVydHkodGhpcywgXCJlbmdpbmVcIiwgX2Rlc2NyaXB0b3IsIHRoaXMpO1xuXG4gICAgX2luaXRpYWxpemVyRGVmaW5lUHJvcGVydHkodGhpcywgXCJzaGFkZXJNb2R1bGVcIiwgX2Rlc2NyaXB0b3IyLCB0aGlzKTtcblxuICAgIF9pbml0aWFsaXplckRlZmluZVByb3BlcnR5KHRoaXMsIFwiY29uZmlnU2VydmljZVwiLCBfZGVzY3JpcHRvcjMsIHRoaXMpO1xuXG4gICAgdGhpcy5pbml0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLnJlbmRlcmluZyA9IGZhbHNlO1xuICAgIHRoaXMucGVuZGluZ3MgPSBbXTtcbiAgICB0aGlzLnZpZXdzID0gW107XG4gICAgdGhpcy5zaXplID0gdm9pZCAwO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKFJlbmRlcmVyLCBbe1xuICAgIGtleTogXCJpbml0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfaW5pdCA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUoKSB7XG4gICAgICAgIHZhciBzeXN0ZW1zLCBjb25maWcsIF9pdGVyYXRvciwgX3N0ZXAsIHN5c3RlbTtcblxuICAgICAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7XG4gICAgICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHtcbiAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgIC8vIOaooeWdl+WMluWkhOeQhlxuICAgICAgICAgICAgICAgIHRoaXMuc2hhZGVyTW9kdWxlLnJlZ2lzdGVyQnVpbHRpbk1vZHVsZXMoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNoYWRlck1vZHVsZS5yZWdpc3Rlck1vZHVsZSgndXYudmVydC5kZWNsYXJhdGlvbicsIHtcbiAgICAgICAgICAgICAgICAgIHZzOiB1dlZlcnREZWNsYXJhdGlvblxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuc2hhZGVyTW9kdWxlLnJlZ2lzdGVyTW9kdWxlKCd1di52ZXJ0Lm1haW4nLCB7XG4gICAgICAgICAgICAgICAgICB2czogdXZWZXJ0TWFpblxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuc2hhZGVyTW9kdWxlLnJlZ2lzdGVyTW9kdWxlKCd1di5mcmFnLmRlY2xhcmF0aW9uJywge1xuICAgICAgICAgICAgICAgICAgZnM6IHV2RnJhZ0RlY2xhcmF0aW9uXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zaGFkZXJNb2R1bGUucmVnaXN0ZXJNb2R1bGUoJ21hcC5mcmFnLmRlY2xhcmF0aW9uJywge1xuICAgICAgICAgICAgICAgICAgZnM6IG1hcEZyYWdEZWNsYXJhdGlvblxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuc2hhZGVyTW9kdWxlLnJlZ2lzdGVyTW9kdWxlKCdtYXAuZnJhZy5tYWluJywge1xuICAgICAgICAgICAgICAgICAgZnM6IG1hcEZyYWdNYWluXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgc3lzdGVtcyA9IHRoaXMuY29udGFpbmVyLmdldEFsbChJREVOVElGSUVSLlN5c3RlbXMpO1xuICAgICAgICAgICAgICAgIGNvbmZpZyA9IHRoaXMuY29uZmlnU2VydmljZS5nZXQoKTtcblxuICAgICAgICAgICAgICAgIGlmICghY29uZmlnLmNhbnZhcykge1xuICAgICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDMwO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDExO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmVuZ2luZS5pbml0KHtcbiAgICAgICAgICAgICAgICAgIGNhbnZhczogY29uZmlnLmNhbnZhcyxcbiAgICAgICAgICAgICAgICAgIHN3YXBDaGFpbkZvcm1hdDogV2ViR1BVQ29uc3RhbnRzLlRleHR1cmVGb3JtYXQuQkdSQThVbm9ybSxcbiAgICAgICAgICAgICAgICAgIGFudGlhbGlhc2luZzogZmFsc2VcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICBjYXNlIDExOlxuICAgICAgICAgICAgICAgIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKHN5c3RlbXMpO1xuICAgICAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAxMjtcblxuICAgICAgICAgICAgICAgIF9pdGVyYXRvci5zKCk7XG5cbiAgICAgICAgICAgICAgY2FzZSAxNDpcbiAgICAgICAgICAgICAgICBpZiAoKF9zdGVwID0gX2l0ZXJhdG9yLm4oKSkuZG9uZSkge1xuICAgICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDIxO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgc3lzdGVtID0gX3N0ZXAudmFsdWU7XG5cbiAgICAgICAgICAgICAgICBpZiAoIXN5c3RlbS5pbml0aWFsaXplKSB7XG4gICAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTk7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN5c3RlbS5pbml0aWFsaXplKCk7XG5cbiAgICAgICAgICAgICAgY2FzZSAxOTpcbiAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgY2FzZSAyMTpcbiAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMjY7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgY2FzZSAyMzpcbiAgICAgICAgICAgICAgICBfY29udGV4dC5wcmV2ID0gMjM7XG4gICAgICAgICAgICAgICAgX2NvbnRleHQudDAgPSBfY29udGV4dFtcImNhdGNoXCJdKDEyKTtcblxuICAgICAgICAgICAgICAgIF9pdGVyYXRvci5lKF9jb250ZXh0LnQwKTtcblxuICAgICAgICAgICAgICBjYXNlIDI2OlxuICAgICAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAyNjtcblxuICAgICAgICAgICAgICAgIF9pdGVyYXRvci5mKCk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuZmluaXNoKDI2KTtcblxuICAgICAgICAgICAgICBjYXNlIDI5OlxuICAgICAgICAgICAgICAgIHRoaXMuaW5pdGVkID0gdHJ1ZTtcblxuICAgICAgICAgICAgICBjYXNlIDMwOlxuICAgICAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LnN0b3AoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sIF9jYWxsZWUsIHRoaXMsIFtbMTIsIDIzLCAyNiwgMjldXSk7XG4gICAgICB9KSk7XG5cbiAgICAgIGZ1bmN0aW9uIGluaXQoKSB7XG4gICAgICAgIHJldHVybiBfaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gaW5pdDtcbiAgICB9KClcbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF9yZW5kZXIgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUubWFyayhmdW5jdGlvbiBfY2FsbGVlMigpIHtcbiAgICAgICAgdmFyIHN5c3RlbXMsXG4gICAgICAgICAgICBfbGVuLFxuICAgICAgICAgICAgdmlld3MsXG4gICAgICAgICAgICBfa2V5LFxuICAgICAgICAgICAgX2l0ZXJhdG9yMixcbiAgICAgICAgICAgIF9zdGVwMixcbiAgICAgICAgICAgIHN5c3RlbSxcbiAgICAgICAgICAgIF9hcmdzMiA9IGFyZ3VtZW50cztcblxuICAgICAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUyJChfY29udGV4dDIpIHtcbiAgICAgICAgICB3aGlsZSAoMSkge1xuICAgICAgICAgICAgc3dpdGNoIChfY29udGV4dDIucHJldiA9IF9jb250ZXh0Mi5uZXh0KSB7XG4gICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICBpZiAoISghdGhpcy5pbml0ZWQgfHwgdGhpcy5yZW5kZXJpbmcpKSB7XG4gICAgICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDI7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLmFicnVwdChcInJldHVyblwiKTtcblxuICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucGVuZGluZ3MubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLnBlbmRpbmdzLmZvckVhY2goZnVuY3Rpb24gKHBlbmRpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgcGVuZGluZygpO1xuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuZW5naW5lLmJlZ2luRnJhbWUoKTtcbiAgICAgICAgICAgICAgICBzeXN0ZW1zID0gdGhpcy5jb250YWluZXIuZ2V0QWxsKElERU5USUZJRVIuU3lzdGVtcyk7XG5cbiAgICAgICAgICAgICAgICBmb3IgKF9sZW4gPSBfYXJnczIubGVuZ3RoLCB2aWV3cyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgICAgICAgICAgICAgIHZpZXdzW19rZXldID0gX2FyZ3MyW19rZXldO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIF9pdGVyYXRvcjIgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihzeXN0ZW1zKTtcbiAgICAgICAgICAgICAgICBfY29udGV4dDIucHJldiA9IDg7XG5cbiAgICAgICAgICAgICAgICBfaXRlcmF0b3IyLnMoKTtcblxuICAgICAgICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgICAgICAgIGlmICgoX3N0ZXAyID0gX2l0ZXJhdG9yMi5uKCkpLmRvbmUpIHtcbiAgICAgICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMTc7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBzeXN0ZW0gPSBfc3RlcDIudmFsdWU7XG5cbiAgICAgICAgICAgICAgICBpZiAoIXN5c3RlbS5leGVjdXRlKSB7XG4gICAgICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDE1O1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAxNTtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3lzdGVtLmV4ZWN1dGUodmlld3MpO1xuXG4gICAgICAgICAgICAgIGNhc2UgMTU6XG4gICAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAxMDtcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICBjYXNlIDE3OlxuICAgICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMjI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgY2FzZSAxOTpcbiAgICAgICAgICAgICAgICBfY29udGV4dDIucHJldiA9IDE5O1xuICAgICAgICAgICAgICAgIF9jb250ZXh0Mi50MCA9IF9jb250ZXh0MltcImNhdGNoXCJdKDgpO1xuXG4gICAgICAgICAgICAgICAgX2l0ZXJhdG9yMi5lKF9jb250ZXh0Mi50MCk7XG5cbiAgICAgICAgICAgICAgY2FzZSAyMjpcbiAgICAgICAgICAgICAgICBfY29udGV4dDIucHJldiA9IDIyO1xuXG4gICAgICAgICAgICAgICAgX2l0ZXJhdG9yMi5mKCk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLmZpbmlzaCgyMik7XG5cbiAgICAgICAgICAgICAgY2FzZSAyNTpcbiAgICAgICAgICAgICAgICAvLyDlvZXliLbkuIDpgY3nu5jliLblkb3ku6TvvIzlkI7nu63nm7TmjqXmkq3mlL5cbiAgICAgICAgICAgICAgICAvLyBpZiAodGhpcy51c2VSZW5kZXJCdW5kbGUpIHtcbiAgICAgICAgICAgICAgICAvLyAgIGlmICghdGhpcy5yZW5kZXJCdW5kbGVSZWNvcmRlZCkge1xuICAgICAgICAgICAgICAgIC8vICAgICB0aGlzLmVuZ2luZS5zdGFydFJlY29yZEJ1bmRsZSgpO1xuICAgICAgICAgICAgICAgIC8vICAgICBpZiAodGhpcy5vblVwZGF0ZSkge1xuICAgICAgICAgICAgICAgIC8vICAgICAgIGF3YWl0IHRoaXMub25VcGRhdGUodGhpcy5lbmdpbmUpO1xuICAgICAgICAgICAgICAgIC8vICAgICB9XG4gICAgICAgICAgICAgICAgLy8gICAgIHRoaXMucmVuZGVyQnVuZGxlID0gdGhpcy5lbmdpbmUuc3RvcFJlY29yZEJ1bmRsZSgpO1xuICAgICAgICAgICAgICAgIC8vICAgICB0aGlzLnJlbmRlckJ1bmRsZVJlY29yZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAvLyAgIH1cbiAgICAgICAgICAgICAgICAvLyAgIHRoaXMuZW5naW5lLmV4ZWN1dGVCdW5kbGVzKFt0aGlzLnJlbmRlckJ1bmRsZV0pO1xuICAgICAgICAgICAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gICBpZiAodGhpcy5vblVwZGF0ZSkge1xuICAgICAgICAgICAgICAgIC8vICAgICBhd2FpdCB0aGlzLm9uVXBkYXRlKHRoaXMuZW5naW5lKTtcbiAgICAgICAgICAgICAgICAvLyAgIH1cbiAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAgICAgdGhpcy5lbmdpbmUuZW5kRnJhbWUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmluZyA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgIGNhc2UgMjc6XG4gICAgICAgICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLnN0b3AoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sIF9jYWxsZWUyLCB0aGlzLCBbWzgsIDE5LCAyMiwgMjVdXSk7XG4gICAgICB9KSk7XG5cbiAgICAgIGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgICAgcmV0dXJuIF9yZW5kZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlbmRlcjtcbiAgICB9KClcbiAgfSwge1xuICAgIGtleTogXCJjbGVhclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjbGVhcihvcHRpb25zKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICBpZiAodGhpcy5pbml0ZWQpIHtcbiAgICAgICAgdGhpcy5lbmdpbmUuY2xlYXIob3B0aW9ucyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnBlbmRpbmdzLnVuc2hpZnQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIF90aGlzLmVuZ2luZS5jbGVhcihvcHRpb25zKTtcblxuICAgICAgICAgIF90aGlzLnBlbmRpbmdzLnNoaWZ0KCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9IC8vIHB1YmxpYyBzZXRTY2lzc29yKFxuICAgIC8vICAgc2Npc3NvcjogUGFydGlhbDx7XG4gICAgLy8gICAgIGVuYWJsZTogYm9vbGVhbjtcbiAgICAvLyAgICAgYm94OiB7XG4gICAgLy8gICAgICAgeDogbnVtYmVyO1xuICAgIC8vICAgICAgIHk6IG51bWJlcjtcbiAgICAvLyAgICAgICB3aWR0aDogbnVtYmVyO1xuICAgIC8vICAgICAgIGhlaWdodDogbnVtYmVyO1xuICAgIC8vICAgICB9O1xuICAgIC8vICAgfT4sXG4gICAgLy8gKSB7XG4gICAgLy8gICB0aGlzLmVuZ2luZS5zZXRTY2lzc29yKHNjaXNzb3IpO1xuICAgIC8vICAgcmV0dXJuIHRoaXM7XG4gICAgLy8gfVxuXG4gIH0sIHtcbiAgICBrZXk6IFwic2V0U2l6ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRTaXplKF9yZWYpIHtcbiAgICAgIHZhciB3aWR0aCA9IF9yZWYud2lkdGgsXG4gICAgICAgICAgaGVpZ2h0ID0gX3JlZi5oZWlnaHQ7XG4gICAgICB2YXIgY2FudmFzID0gdGhpcy5lbmdpbmUuZ2V0Q2FudmFzKCk7XG4gICAgICB0aGlzLnNpemUgPSB7XG4gICAgICAgIHdpZHRoOiB3aWR0aCxcbiAgICAgICAgaGVpZ2h0OiBoZWlnaHRcbiAgICAgIH07XG4gICAgICBjYW52YXMud2lkdGggPSB3aWR0aDtcbiAgICAgIGNhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0U2l6ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRTaXplKCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2l6ZTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gUmVuZGVyZXI7XG59KCksIF90ZW1wKSwgKF9kZXNjcmlwdG9yID0gX2FwcGx5RGVjb3JhdGVkRGVzY3JpcHRvcihfY2xhc3MyLnByb3RvdHlwZSwgXCJlbmdpbmVcIiwgW19kZWMyXSwge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHdyaXRhYmxlOiB0cnVlLFxuICBpbml0aWFsaXplcjogbnVsbFxufSksIF9kZXNjcmlwdG9yMiA9IF9hcHBseURlY29yYXRlZERlc2NyaXB0b3IoX2NsYXNzMi5wcm90b3R5cGUsIFwic2hhZGVyTW9kdWxlXCIsIFtfZGVjM10sIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICB3cml0YWJsZTogdHJ1ZSxcbiAgaW5pdGlhbGl6ZXI6IG51bGxcbn0pLCBfZGVzY3JpcHRvcjMgPSBfYXBwbHlEZWNvcmF0ZWREZXNjcmlwdG9yKF9jbGFzczIucHJvdG90eXBlLCBcImNvbmZpZ1NlcnZpY2VcIiwgW19kZWM0XSwge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHdyaXRhYmxlOiB0cnVlLFxuICBpbml0aWFsaXplcjogbnVsbFxufSkpLCBfY2xhc3MyKSkgfHwgX2NsYXNzKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJlbmRlcmVyLmpzLm1hcCIsImltcG9ydCBfY2xhc3NDYWxsQ2hlY2sgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2tcIjtcbmltcG9ydCBfY3JlYXRlQ2xhc3MgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlQ2xhc3NcIjtcblxudmFyIF9kZWMsIF9jbGFzcywgX3RlbXA7XG5cbmltcG9ydCB7IGluamVjdGFibGUgfSBmcm9tICdpbnZlcnNpZnknO1xuZXhwb3J0IHZhciBTY2VuZSA9IChfZGVjID0gaW5qZWN0YWJsZSgpLCBfZGVjKF9jbGFzcyA9IChfdGVtcCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFNjZW5lKCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBTY2VuZSk7XG5cbiAgICB0aGlzLmVudGl0aWVzID0gW107XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoU2NlbmUsIFt7XG4gICAga2V5OiBcImdldEVudGl0aWVzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldEVudGl0aWVzKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZW50aXRpZXM7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImFkZFJlbmRlcmFibGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWRkUmVuZGVyYWJsZShyZW5kZXJhYmxlKSB7XG4gICAgICB0aGlzLmFkZEVudGl0eShyZW5kZXJhYmxlLmdldEVudGl0eSgpKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW1vdmVSZW5kZXJhYmxlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbW92ZVJlbmRlcmFibGUocmVuZGVyYWJsZSkge1xuICAgICAgdGhpcy5yZW1vdmVFbnRpdHkocmVuZGVyYWJsZS5nZXRFbnRpdHkoKSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYWRkTGlnaHRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWRkTGlnaHQoKSB7fVxuICB9LCB7XG4gICAga2V5OiBcImFkZEVudGl0eVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhZGRFbnRpdHkoZW50aXR5KSB7XG4gICAgICBpZiAodGhpcy5lbnRpdGllcy5pbmRleE9mKGVudGl0eSkgPT09IC0xKSB7XG4gICAgICAgIHRoaXMuZW50aXRpZXMucHVzaChlbnRpdHkpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVtb3ZlRW50aXR5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbW92ZUVudGl0eShlbnRpdHkpIHtcbiAgICAgIHZhciBpbmRleCA9IHRoaXMuZW50aXRpZXMuaW5kZXhPZihlbnRpdHkpO1xuICAgICAgdGhpcy5lbnRpdGllcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFNjZW5lO1xufSgpLCBfdGVtcCkpIHx8IF9jbGFzcyk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TY2VuZS5qcy5tYXAiLCJpbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrXCI7XG5pbXBvcnQgX2NyZWF0ZUNsYXNzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzXCI7XG5cbnZhciBfZGVjLCBfY2xhc3MsIF90ZW1wO1xuXG5pbXBvcnQgeyBpbmplY3RhYmxlIH0gZnJvbSAnaW52ZXJzaWZ5JztcbmV4cG9ydCB2YXIgVGV4dHVyZUNhY2hlID0gKF9kZWMgPSBpbmplY3RhYmxlKCksIF9kZWMoX2NsYXNzID0gKF90ZW1wID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gVGV4dHVyZUNhY2hlKCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBUZXh0dXJlQ2FjaGUpO1xuXG4gICAgdGhpcy5jYWNoZSA9IHt9O1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKFRleHR1cmVDYWNoZSwgW3tcbiAgICBrZXk6IFwiZ2V0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldChuYW1lKSB7XG4gICAgICByZXR1cm4gdGhpcy5jYWNoZVtuYW1lXTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2V0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldChuYW1lLCB0ZXh0dXJlKSB7XG4gICAgICB0aGlzLmNhY2hlW25hbWVdID0gdGV4dHVyZTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gVGV4dHVyZUNhY2hlO1xufSgpLCBfdGVtcCkpIHx8IF9jbGFzcyk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1DYWNoZS5qcy5tYXAiLCJpbXBvcnQgX3JlZ2VuZXJhdG9yUnVudGltZSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvcmVnZW5lcmF0b3JcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfYXN5bmNUb0dlbmVyYXRvciBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hc3luY1RvR2VuZXJhdG9yXCI7XG5pbXBvcnQgX2luaXRpYWxpemVyRGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW5pdGlhbGl6ZXJEZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzc1wiO1xuaW1wb3J0IF9hcHBseURlY29yYXRlZERlc2NyaXB0b3IgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXBwbHlEZWNvcmF0ZWREZXNjcmlwdG9yXCI7XG5pbXBvcnQgX2luaXRpYWxpemVyV2FybmluZ0hlbHBlciBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbml0aWFsaXplcldhcm5pbmdIZWxwZXJcIjtcblxudmFyIF9kZWMsIF9kZWMyLCBfZGVjMywgX2NsYXNzLCBfY2xhc3MyLCBfZGVzY3JpcHRvciwgX2Rlc2NyaXB0b3IyLCBfdGVtcDtcblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7IHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7IGlmIChlbnVtZXJhYmxlT25seSkgc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7IH0pOyBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7IH0gcmV0dXJuIGtleXM7IH1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXSAhPSBudWxsID8gYXJndW1lbnRzW2ldIDoge307IGlmIChpICUgMikgeyBvd25LZXlzKE9iamVjdChzb3VyY2UpLCB0cnVlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pOyB9IGVsc2UgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSk7IH0gZWxzZSB7IG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsgfSk7IH0gfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmltcG9ydCB7IElERU5USUZJRVIgfSBmcm9tICdAYW50di9nLXdlYmdwdS1jb3JlJztcbmltcG9ydCB7IGluamVjdCwgaW5qZWN0YWJsZSB9IGZyb20gJ2ludmVyc2lmeSc7XG5pbXBvcnQgeyBUZXh0dXJlQ2FjaGUgfSBmcm9tICcuL0NhY2hlJztcbmV4cG9ydCB2YXIgVGV4dHVyZTJEID0gKF9kZWMgPSBpbmplY3RhYmxlKCksIF9kZWMyID0gaW5qZWN0KFRleHR1cmVDYWNoZSksIF9kZWMzID0gaW5qZWN0KElERU5USUZJRVIuUmVuZGVyRW5naW5lKSwgX2RlYyhfY2xhc3MgPSAoX2NsYXNzMiA9IChfdGVtcCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFRleHR1cmUyRCgpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgVGV4dHVyZTJEKTtcblxuICAgIF9pbml0aWFsaXplckRlZmluZVByb3BlcnR5KHRoaXMsIFwidGV4dHVyZUNhY2hlXCIsIF9kZXNjcmlwdG9yLCB0aGlzKTtcblxuICAgIF9pbml0aWFsaXplckRlZmluZVByb3BlcnR5KHRoaXMsIFwiZW5naW5lXCIsIF9kZXNjcmlwdG9yMiwgdGhpcyk7XG5cbiAgICB0aGlzLmNvbmZpZyA9IHZvaWQgMDtcbiAgICB0aGlzLmxvYWRlZCA9IGZhbHNlO1xuICAgIHRoaXMudGV4dHVyZSA9IHZvaWQgMDtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhUZXh0dXJlMkQsIFt7XG4gICAga2V5OiBcInNldENvbmZpZ1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRDb25maWcoY29uZmlnKSB7XG4gICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaXNMb2FkZWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaXNMb2FkZWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5sb2FkZWQ7XG4gICAgfSAvLyBwdWJsaWMgdXBkYXRlKGNvbmZpZzogSVRleHR1cmUyREluaXRpYWxpemF0aW9uT3B0aW9ucykge1xuICAgIC8vICAgaWYgKHRoaXMubG9hZGVkICYmIHRoaXMudGV4dHVyZSkge1xuICAgIC8vICAgICBjb25zdCB0ID0gdGhpcy50ZXh0dXJlLmdldCgpO1xuICAgIC8vICAgfVxuICAgIC8vIH1cblxuICB9LCB7XG4gICAga2V5OiBcImxvYWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF9sb2FkID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoZnVuY3Rpb24gX2NhbGxlZSgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7XG4gICAgICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHtcbiAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5jb25maWcudXJsKSB7XG4gICAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gNDtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5hYnJ1cHQoXCJyZXR1cm5cIiwgbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgICAgICAgdmFyIGV4aXN0ZWQgPSBfdGhpcy50ZXh0dXJlQ2FjaGUuZ2V0KF90aGlzLmNvbmZpZy51cmwpO1xuXG4gICAgICAgICAgICAgICAgICBpZiAoZXhpc3RlZCkge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGV4aXN0ZWQpO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGltYWdlID0gbmV3IEltYWdlKCk7XG4gICAgICAgICAgICAgICAgICAgIGltYWdlLmNyb3NzT3JpZ2luID0gJ0Fub255bW91cyc7XG4gICAgICAgICAgICAgICAgICAgIGltYWdlLnNyYyA9IF90aGlzLmNvbmZpZy51cmw7XG5cbiAgICAgICAgICAgICAgICAgICAgaW1hZ2Uub25sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgIHZhciB0ZXh0dXJlID0gX3RoaXMuZW5naW5lLmNyZWF0ZVRleHR1cmUyRChfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIF90aGlzLmNvbmZpZyksIHt9LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBpbWFnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiBpbWFnZS53aWR0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogaW1hZ2UuaGVpZ2h0LFxuICAgICAgICAgICAgICAgICAgICAgICAgZmxpcFk6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICB9KSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICBfdGhpcy50ZXh0dXJlQ2FjaGUuc2V0KF90aGlzLmNvbmZpZy51cmwsIHRleHR1cmUpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgX3RoaXMudGV4dHVyZSA9IHRleHR1cmU7XG4gICAgICAgICAgICAgICAgICAgICAgX3RoaXMubG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRleHR1cmUpO1xuICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgIGltYWdlLm9uZXJyb3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KCk7XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy50ZXh0dXJlID0gdGhpcy5lbmdpbmUuY3JlYXRlVGV4dHVyZTJEKHRoaXMuY29uZmlnKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KFwicmV0dXJuXCIsIHRoaXMudGV4dHVyZSk7XG5cbiAgICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LnN0b3AoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sIF9jYWxsZWUsIHRoaXMpO1xuICAgICAgfSkpO1xuXG4gICAgICBmdW5jdGlvbiBsb2FkKCkge1xuICAgICAgICByZXR1cm4gX2xvYWQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGxvYWQ7XG4gICAgfSgpXG4gIH1dKTtcblxuICByZXR1cm4gVGV4dHVyZTJEO1xufSgpLCBfdGVtcCksIChfZGVzY3JpcHRvciA9IF9hcHBseURlY29yYXRlZERlc2NyaXB0b3IoX2NsYXNzMi5wcm90b3R5cGUsIFwidGV4dHVyZUNhY2hlXCIsIFtfZGVjMl0sIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICB3cml0YWJsZTogdHJ1ZSxcbiAgaW5pdGlhbGl6ZXI6IG51bGxcbn0pLCBfZGVzY3JpcHRvcjIgPSBfYXBwbHlEZWNvcmF0ZWREZXNjcmlwdG9yKF9jbGFzczIucHJvdG90eXBlLCBcImVuZ2luZVwiLCBbX2RlYzNdLCB7XG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgd3JpdGFibGU6IHRydWUsXG4gIGluaXRpYWxpemVyOiBudWxsXG59KSksIF9jbGFzczIpKSB8fCBfY2xhc3MpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VGV4dHVyZTJELmpzLm1hcCIsImltcG9ydCBfaW5pdGlhbGl6ZXJEZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbml0aWFsaXplckRlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrXCI7XG5pbXBvcnQgX2NyZWF0ZUNsYXNzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzXCI7XG5pbXBvcnQgX2FwcGx5RGVjb3JhdGVkRGVzY3JpcHRvciBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hcHBseURlY29yYXRlZERlc2NyaXB0b3JcIjtcbmltcG9ydCBfaW5pdGlhbGl6ZXJXYXJuaW5nSGVscGVyIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2luaXRpYWxpemVyV2FybmluZ0hlbHBlclwiO1xuXG52YXIgX2RlYywgX2RlYzIsIF9kZWMzLCBfY2xhc3MsIF9jbGFzczIsIF9kZXNjcmlwdG9yLCBfdGVtcDtcblxuaW1wb3J0IHsgSURFTlRJRklFUiB9IGZyb20gJ0BhbnR2L2ctd2ViZ3B1LWNvcmUnO1xuaW1wb3J0IHsgaW5qZWN0LCBpbmplY3RhYmxlLCBuYW1lZCB9IGZyb20gJ2ludmVyc2lmeSc7XG5leHBvcnQgdmFyIFZpZXcgPSAoX2RlYyA9IGluamVjdGFibGUoKSwgX2RlYzIgPSBpbmplY3QoSURFTlRJRklFUi5TeXN0ZW1zKSwgX2RlYzMgPSBuYW1lZChJREVOVElGSUVSLlJlbmRlcmVyU3lzdGVtKSwgX2RlYyhfY2xhc3MgPSAoX2NsYXNzMiA9IChfdGVtcCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFZpZXcoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFZpZXcpO1xuXG4gICAgX2luaXRpYWxpemVyRGVmaW5lUHJvcGVydHkodGhpcywgXCJyZW5kZXJlclN5c3RlbVwiLCBfZGVzY3JpcHRvciwgdGhpcyk7XG5cbiAgICB0aGlzLmNhbWVyYSA9IHZvaWQgMDtcbiAgICB0aGlzLnNjZW5lID0gdm9pZCAwO1xuICAgIHRoaXMudmlld3BvcnQgPSB7XG4gICAgICB4OiAwLFxuICAgICAgeTogMCxcbiAgICAgIHdpZHRoOiAwLFxuICAgICAgaGVpZ2h0OiAwXG4gICAgfTtcbiAgICB0aGlzLmNsZWFyQ29sb3IgPSBbMSwgMSwgMSwgMV07XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoVmlldywgW3tcbiAgICBrZXk6IFwiZ2V0Q2FtZXJhXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldENhbWVyYSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmNhbWVyYTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0U2NlbmVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0U2NlbmUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zY2VuZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0Vmlld3BvcnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0Vmlld3BvcnQoKSB7XG4gICAgICByZXR1cm4gdGhpcy52aWV3cG9ydDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0Q2xlYXJDb2xvclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRDbGVhckNvbG9yKCkge1xuICAgICAgcmV0dXJuIHRoaXMuY2xlYXJDb2xvcjtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2V0Q2FtZXJhXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldENhbWVyYShjYW1lcmEpIHtcbiAgICAgIHRoaXMuY2FtZXJhID0gY2FtZXJhO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNldFNjZW5lXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldFNjZW5lKHNjZW5lKSB7XG4gICAgICB0aGlzLnNjZW5lID0gc2NlbmU7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2V0Vmlld3BvcnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0Vmlld3BvcnQodmlld3BvcnQpIHtcbiAgICAgIHRoaXMudmlld3BvcnQgPSB2aWV3cG9ydDtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzZXRDbGVhckNvbG9yXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldENsZWFyQ29sb3IoY2xlYXJDb2xvcikge1xuICAgICAgdGhpcy5jbGVhckNvbG9yID0gY2xlYXJDb2xvcjtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJwaWNrXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHBpY2socG9zaXRpb24pIHtcbiAgICAgIHJldHVybiB0aGlzLnJlbmRlcmVyU3lzdGVtLnBpY2socG9zaXRpb24sIHRoaXMpO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBWaWV3O1xufSgpLCBfdGVtcCksIChfZGVzY3JpcHRvciA9IF9hcHBseURlY29yYXRlZERlc2NyaXB0b3IoX2NsYXNzMi5wcm90b3R5cGUsIFwicmVuZGVyZXJTeXN0ZW1cIiwgW19kZWMyLCBfZGVjM10sIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICB3cml0YWJsZTogdHJ1ZSxcbiAgaW5pdGlhbGl6ZXI6IG51bGxcbn0pKSwgX2NsYXNzMikpIHx8IF9jbGFzcyk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1WaWV3LmpzLm1hcCIsImltcG9ydCBfcmVnZW5lcmF0b3JSdW50aW1lIGZyb20gXCJAYmFiZWwvcnVudGltZS9yZWdlbmVyYXRvclwiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9hc3luY1RvR2VuZXJhdG9yIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2FzeW5jVG9HZW5lcmF0b3JcIjtcbmltcG9ydCBfaW5pdGlhbGl6ZXJEZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbml0aWFsaXplckRlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrXCI7XG5pbXBvcnQgX2NyZWF0ZUNsYXNzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzXCI7XG5pbXBvcnQgX2FwcGx5RGVjb3JhdGVkRGVzY3JpcHRvciBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hcHBseURlY29yYXRlZERlc2NyaXB0b3JcIjtcbmltcG9ydCBfaW5pdGlhbGl6ZXJXYXJuaW5nSGVscGVyIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2luaXRpYWxpemVyV2FybmluZ0hlbHBlclwiO1xuXG52YXIgX2RlYywgX2RlYzIsIF9jbGFzcywgX2NsYXNzMiwgX2Rlc2NyaXB0b3IsIF90ZW1wO1xuXG5mdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHsgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTsgaWYgKGVudW1lcmFibGVPbmx5KSBzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTsgfSk7IGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsgfSByZXR1cm4ga2V5czsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldICE9IG51bGwgPyBhcmd1bWVudHNbaV0gOiB7fTsgaWYgKGkgJSAyKSB7IG93bktleXMoT2JqZWN0KHNvdXJjZSksIHRydWUpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSk7IH0gZWxzZSBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMpIHsgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKTsgfSBlbHNlIHsgb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpOyB9KTsgfSB9IHJldHVybiB0YXJnZXQ7IH1cblxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLXJlZmVyZW5jZVxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9Ad2ViZ3B1L3R5cGVzL2Rpc3QvaW5kZXguZC50c1wiIC8+XG5pbXBvcnQgeyBjcmVhdGVFbnRpdHkgYXMgX2NyZWF0ZUVudGl0eSwgY3JlYXRlV29ybGRDb250YWluZXIsIElERU5USUZJRVIgfSBmcm9tICdAYW50di9nLXdlYmdwdS1jb3JlJztcbmltcG9ydCB7IFdlYkdMRW5naW5lLCBXZWJHUFVFbmdpbmUgfSBmcm9tICdAYW50di9nLXdlYmdwdS1lbmdpbmUnOyAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tc3VibW9kdWxlLWltcG9ydHNcblxuaW1wb3J0ICogYXMgV2ViR1BVQ29uc3RhbnRzIGZyb20gJ0B3ZWJncHUvdHlwZXMvZGlzdC9jb25zdGFudHMnO1xuaW1wb3J0IHsgaW5qZWN0LCBpbmplY3RhYmxlIH0gZnJvbSAnaW52ZXJzaWZ5JztcbmltcG9ydCB7IENhbWVyYSB9IGZyb20gJy4vY2FtZXJhL0NhbWVyYSc7XG5pbXBvcnQgeyBHZW9tZXRyeSB9IGZyb20gJy4vZ2VvbWV0cnknO1xuaW1wb3J0IHsgQm94IH0gZnJvbSAnLi9nZW9tZXRyeS9Cb3gnO1xuaW1wb3J0IHsgTWVyZ2VkIH0gZnJvbSAnLi9nZW9tZXRyeS9NZXJnZWQnO1xuaW1wb3J0IHsgUGxhbmUgfSBmcm9tICcuL2dlb21ldHJ5L1BsYW5lJztcbmltcG9ydCB7IFNwaGVyZSB9IGZyb20gJy4vZ2VvbWV0cnkvU3BoZXJlJztcbmltcG9ydCB7IEtlcm5lbCB9IGZyb20gJy4vS2VybmVsJztcbmltcG9ydCB7IE1hdGVyaWFsIH0gZnJvbSAnLi9tYXRlcmlhbCc7XG5pbXBvcnQgeyBCYXNpYyB9IGZyb20gJy4vbWF0ZXJpYWwvYmFzaWMnO1xuaW1wb3J0IHsgR3JpZCB9IGZyb20gJy4vcmVuZGVyYWJsZS9ncmlkJztcbmltcG9ydCB7IExpbmUgfSBmcm9tICcuL3JlbmRlcmFibGUvbGluZSc7XG5pbXBvcnQgeyBQb2ludCB9IGZyb20gJy4vcmVuZGVyYWJsZS9wb2ludCc7XG5pbXBvcnQgeyBSZW5kZXJhYmxlIH0gZnJvbSAnLi9yZW5kZXJhYmxlL1JlbmRlcmFibGUnO1xuaW1wb3J0IHsgUmVuZGVyZXIgfSBmcm9tICcuL1JlbmRlcmVyJztcbmltcG9ydCB7IFNjZW5lIH0gZnJvbSAnLi9TY2VuZSc7XG5pbXBvcnQgeyBUZXh0dXJlQ2FjaGUgfSBmcm9tICcuL3RleHR1cmUvQ2FjaGUnO1xuaW1wb3J0IHsgVGV4dHVyZTJEIH0gZnJvbSAnLi90ZXh0dXJlL1RleHR1cmUyRCc7XG5pbXBvcnQgeyBjcmVhdGVDYW52YXMgfSBmcm9tICcuL3V0aWxzL2NhbnZhcyc7XG5pbXBvcnQgeyBWaWV3IH0gZnJvbSAnLi9WaWV3JztcbmV4cG9ydCB2YXIgV29ybGQgPSAoX2RlYyA9IGluamVjdGFibGUoKSwgX2RlYzIgPSBpbmplY3QoSURFTlRJRklFUi5Db25maWdTZXJ2aWNlKSwgX2RlYyhfY2xhc3MgPSAoX2NsYXNzMiA9IChfdGVtcCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFdvcmxkKCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBXb3JsZCk7XG5cbiAgICBfaW5pdGlhbGl6ZXJEZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImNvbmZpZ1NlcnZpY2VcIiwgX2Rlc2NyaXB0b3IsIHRoaXMpO1xuXG4gICAgdGhpcy5jb250YWluZXIgPSB2b2lkIDA7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoV29ybGQsIFt7XG4gICAga2V5OiBcImdldEVuZ2luZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX2dldEVuZ2luZSA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUoKSB7XG4gICAgICAgIHZhciBlbmdpbmUsIF90aGlzJGNvbmZpZ1NlcnZpY2UkZywgY2FudmFzLCBlbmdpbmVPcHRpb25zO1xuXG4gICAgICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoZnVuY3Rpb24gX2NhbGxlZSQoX2NvbnRleHQpIHtcbiAgICAgICAgICB3aGlsZSAoMSkge1xuICAgICAgICAgICAgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkge1xuICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgZW5naW5lID0gdGhpcy5jb250YWluZXIuZ2V0KElERU5USUZJRVIuUmVuZGVyRW5naW5lKTtcbiAgICAgICAgICAgICAgICBfdGhpcyRjb25maWdTZXJ2aWNlJGcgPSB0aGlzLmNvbmZpZ1NlcnZpY2UuZ2V0KCksIGNhbnZhcyA9IF90aGlzJGNvbmZpZ1NlcnZpY2UkZy5jYW52YXMsIGVuZ2luZU9wdGlvbnMgPSBfdGhpcyRjb25maWdTZXJ2aWNlJGcuZW5naW5lT3B0aW9ucztcbiAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gNDtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW5naW5lLmluaXQoX29iamVjdFNwcmVhZCh7XG4gICAgICAgICAgICAgICAgICBjYW52YXM6IGNhbnZhcyB8fCBjcmVhdGVDYW52YXMoKSxcbiAgICAgICAgICAgICAgICAgIHN3YXBDaGFpbkZvcm1hdDogV2ViR1BVQ29uc3RhbnRzLlRleHR1cmVGb3JtYXQuQkdSQThVbm9ybSxcbiAgICAgICAgICAgICAgICAgIGFudGlhbGlhc2luZzogZmFsc2VcbiAgICAgICAgICAgICAgICB9LCBlbmdpbmVPcHRpb25zKSk7XG5cbiAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5hYnJ1cHQoXCJyZXR1cm5cIiwgZW5naW5lKTtcblxuICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSwgX2NhbGxlZSwgdGhpcyk7XG4gICAgICB9KSk7XG5cbiAgICAgIGZ1bmN0aW9uIGdldEVuZ2luZSgpIHtcbiAgICAgICAgcmV0dXJuIF9nZXRFbmdpbmUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGdldEVuZ2luZTtcbiAgICB9KClcbiAgICAvKipcbiAgICAgKiBnZXQgdHJhbnNmb3JtIGNvbXBvbmVudFxuICAgICAqIEBwYXJhbSBlbnRpdHlcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImdldFRyYW5zZm9ybUNvbXBvbmVudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRUcmFuc2Zvcm1Db21wb25lbnQoZW50aXR5KSB7XG4gICAgICB2YXIgbWFuYWdlciA9IHRoaXMuY29udGFpbmVyLmdldChJREVOVElGSUVSLlRyYW5zZm9ybUNvbXBvbmVudE1hbmFnZXIpO1xuICAgICAgcmV0dXJuIG1hbmFnZXIuZ2V0Q29tcG9uZW50QnlFbnRpdHkoZW50aXR5KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0TWVzaENvbXBvbmVudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRNZXNoQ29tcG9uZW50KGVudGl0eSkge1xuICAgICAgdmFyIG1hbmFnZXIgPSB0aGlzLmNvbnRhaW5lci5nZXQoSURFTlRJRklFUi5NZXNoQ29tcG9uZW50TWFuYWdlcik7XG4gICAgICByZXR1cm4gbWFuYWdlci5nZXRDb21wb25lbnRCeUVudGl0eShlbnRpdHkpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzZXRDb25maWdcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0Q29uZmlnKGNvbmZpZykge1xuICAgICAgdGhpcy5jb25maWdTZXJ2aWNlLnNldChjb25maWcpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzZXRDb250YWluZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0Q29udGFpbmVyKGNvbnRhaW5lcikge1xuICAgICAgdGhpcy5jb250YWluZXIgPSBjb250YWluZXI7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldENvbnRhaW5lclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRDb250YWluZXIoKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNyZWF0ZUVudGl0eVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjcmVhdGVFbnRpdHkoKSB7XG4gICAgICByZXR1cm4gX2NyZWF0ZUVudGl0eSgpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjcmVhdGVTY2VuZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjcmVhdGVTY2VuZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnRhaW5lci5nZXQoU2NlbmUpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjcmVhdGVDYW1lcmFcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY3JlYXRlQ2FtZXJhKCkge1xuICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyLmdldChDYW1lcmEpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjcmVhdGVWaWV3XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNyZWF0ZVZpZXcoKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb250YWluZXIuZ2V0KFZpZXcpO1xuICAgIH0gLy8gcHVibGljIGNyZWF0ZUxpZ2h0KHR5cGU6IHN0cmluZywpIHtcbiAgICAvLyAgIHJldHVybiB0aGlzLmNvbnRhaW5lci5nZXROYW1lZChJREVOVElGSUVSLkxpZ2h0LCB0eXBlKVxuICAgIC8vIH1cblxuICB9LCB7XG4gICAga2V5OiBcImNyZWF0ZVJlbmRlcmFibGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY3JlYXRlUmVuZGVyYWJsZSh0eXBlLCBjb25maWcpIHtcbiAgICAgIHZhciByZW5kZXJhYmxlID0gdHlwZSA/IHRoaXMuY29udGFpbmVyLmdldE5hbWVkKElERU5USUZJRVIuUmVuZGVyYWJsZSwgdHlwZSkgOiB0aGlzLmNvbnRhaW5lci5nZXQoUmVuZGVyYWJsZSk7XG5cbiAgICAgIHZhciBlbnRpdHkgPSBfY3JlYXRlRW50aXR5KCk7XG5cbiAgICAgIHJlbmRlcmFibGUuc2V0Q29uZmlnKGNvbmZpZyB8fCB7fSk7XG4gICAgICByZW5kZXJhYmxlLnNldEVudGl0eShlbnRpdHkpO1xuICAgICAgcmV0dXJuIHJlbmRlcmFibGU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNyZWF0ZUdlb21ldHJ5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNyZWF0ZUdlb21ldHJ5KHR5cGUsIGNvbmZpZykge1xuICAgICAgdmFyIGdlb21ldHJ5ID0gdGhpcy5jb250YWluZXIuZ2V0TmFtZWQoSURFTlRJRklFUi5HZW9tZXRyeSwgdHlwZSk7XG5cbiAgICAgIHZhciBlbnRpdHkgPSBfY3JlYXRlRW50aXR5KCk7XG5cbiAgICAgIGdlb21ldHJ5LnNldENvbmZpZyhjb25maWcgfHwge30pO1xuICAgICAgZ2VvbWV0cnkuc2V0RW50aXR5KGVudGl0eSk7XG4gICAgICByZXR1cm4gZ2VvbWV0cnkuZ2V0Q29tcG9uZW50KCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNyZWF0ZU1hdGVyaWFsXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNyZWF0ZU1hdGVyaWFsKHR5cGUsIGNvbmZpZykge1xuICAgICAgdmFyIG1hdGVyaWFsID0gdGhpcy5jb250YWluZXIuZ2V0TmFtZWQoSURFTlRJRklFUi5NYXRlcmlhbCwgdHlwZSk7XG5cbiAgICAgIHZhciBlbnRpdHkgPSBfY3JlYXRlRW50aXR5KCk7XG5cbiAgICAgIG1hdGVyaWFsLnNldENvbmZpZyhjb25maWcgfHwge30pO1xuICAgICAgbWF0ZXJpYWwuc2V0RW50aXR5KGVudGl0eSwgdHlwZSk7XG4gICAgICByZXR1cm4gbWF0ZXJpYWwuZ2V0Q29tcG9uZW50KCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNyZWF0ZVRleHR1cmUyRFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjcmVhdGVUZXh0dXJlMkQoY29uZmlnKSB7XG4gICAgICB2YXIgdGV4dHVyZSA9IHRoaXMuY29udGFpbmVyLmdldChUZXh0dXJlMkQpO1xuICAgICAgdGV4dHVyZS5zZXRDb25maWcoY29uZmlnKTtcbiAgICAgIHJldHVybiB0ZXh0dXJlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjcmVhdGVCdWZmZXJHZW9tZXRyeVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjcmVhdGVCdWZmZXJHZW9tZXRyeShwYXJhbXMpIHtcbiAgICAgIHZhciBnZW9tZXRyeVN5c3RlbSA9IHRoaXMuY29udGFpbmVyLmdldE5hbWVkKElERU5USUZJRVIuU3lzdGVtcywgSURFTlRJRklFUi5HZW9tZXRyeVN5c3RlbSk7XG4gICAgICByZXR1cm4gZ2VvbWV0cnlTeXN0ZW0uY3JlYXRlQnVmZmVyR2VvbWV0cnkocGFyYW1zKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY3JlYXRlSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY3JlYXRlSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkocGFyYW1zKSB7XG4gICAgICB2YXIgZ2VvbWV0cnlTeXN0ZW0gPSB0aGlzLmNvbnRhaW5lci5nZXROYW1lZChJREVOVElGSUVSLlN5c3RlbXMsIElERU5USUZJRVIuR2VvbWV0cnlTeXN0ZW0pO1xuICAgICAgcmV0dXJuIGdlb21ldHJ5U3lzdGVtLmNyZWF0ZUluc3RhbmNlZEJ1ZmZlckdlb21ldHJ5KHBhcmFtcyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNyZWF0ZVNoYWRlck1hdGVyaWFsXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNyZWF0ZVNoYWRlck1hdGVyaWFsKHBhcmFtcykge1xuICAgICAgdmFyIG1hdGVyaWFsU3lzdGVtID0gdGhpcy5jb250YWluZXIuZ2V0TmFtZWQoSURFTlRJRklFUi5TeXN0ZW1zLCBJREVOVElGSUVSLk1hdGVyaWFsU3lzdGVtKTtcbiAgICAgIHJldHVybiBtYXRlcmlhbFN5c3RlbS5jcmVhdGVTaGFkZXJNYXRlcmlhbChwYXJhbXMpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjcmVhdGVLZXJuZWxcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY3JlYXRlS2VybmVsKHByZWNvbXBpbGVkQnVuZGxlKSB7XG4gICAgICB2YXIga2VybmVsID0gdGhpcy5jb250YWluZXIuZ2V0KEtlcm5lbCk7XG5cbiAgICAgIGlmICh0eXBlb2YgcHJlY29tcGlsZWRCdW5kbGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGtlcm5lbC5zZXRCdW5kbGUoSlNPTi5wYXJzZShwcmVjb21waWxlZEJ1bmRsZSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAga2VybmVsLnNldEJ1bmRsZShwcmVjb21waWxlZEJ1bmRsZSk7XG4gICAgICB9XG5cbiAgICAgIGtlcm5lbC5pbml0KCk7XG4gICAgICByZXR1cm4ga2VybmVsO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjcmVhdGVSZW5kZXJlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjcmVhdGVSZW5kZXJlcigpIHtcbiAgICAgIHZhciByZW5kZXJlciA9IHRoaXMuY29udGFpbmVyLmdldChSZW5kZXJlcik7XG4gICAgICByZW5kZXJlci5jb250YWluZXIgPSB0aGlzLmNvbnRhaW5lcjtcbiAgICAgIHJlbmRlcmVyLmluaXQoKTtcbiAgICAgIHJldHVybiByZW5kZXJlcjtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZGVzdHJveVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkZXN0cm95KCkge1xuICAgICAgdmFyIHN5c3RlbXMgPSB0aGlzLmNvbnRhaW5lci5nZXRBbGwoSURFTlRJRklFUi5TeXN0ZW1zKTtcbiAgICAgIHN5c3RlbXMuZm9yRWFjaChmdW5jdGlvbiAoc3lzdGVtKSB7XG4gICAgICAgIGlmIChzeXN0ZW0udGVhckRvd24pIHtcbiAgICAgICAgICBzeXN0ZW0udGVhckRvd24oKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB2YXIgZW5naW5lID0gdGhpcy5jb250YWluZXIuZ2V0KElERU5USUZJRVIuUmVuZGVyRW5naW5lKTtcbiAgICAgIGVuZ2luZS5kZXN0cm95KCk7XG4gICAgICB2YXIgaW50ZXJhY3RvciA9IHRoaXMuY29udGFpbmVyLmdldChJREVOVElGSUVSLkludGVyYWN0b3JTZXJ2aWNlKTtcbiAgICAgIGludGVyYWN0b3IuZGVzdHJveSgpO1xuICAgIH1cbiAgfV0sIFt7XG4gICAga2V5OiBcImNyZWF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjcmVhdGUoKSB7XG4gICAgICB2YXIgY29uZmlnID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgICAgIHZhciB3b3JsZENvbnRhaW5lciA9IGNyZWF0ZVdvcmxkQ29udGFpbmVyKCk7IC8vIGJpbmQgcmVuZGVyIGVuZ2luZSwgZmFsbGJhY2sgdG8gV2ViR0xcblxuICAgICAgdmFyIGVuZ2luZUNsYXp6ID0gIW5hdmlnYXRvci5ncHUgPyBXZWJHTEVuZ2luZSA6IFdlYkdQVUVuZ2luZTtcblxuICAgICAgaWYgKCF3b3JsZENvbnRhaW5lci5pc0JvdW5kKElERU5USUZJRVIuUmVuZGVyRW5naW5lKSkge1xuICAgICAgICB3b3JsZENvbnRhaW5lci5iaW5kKElERU5USUZJRVIuUmVuZGVyRW5naW5lKSAvLyBAdHMtaWdub3JlXG4gICAgICAgIC50byhlbmdpbmVDbGF6eikuaW5TaW5nbGV0b25TY29wZSgpO1xuICAgICAgfVxuXG4gICAgICB3b3JsZENvbnRhaW5lci5iaW5kKFJlbmRlcmVyKS50b1NlbGYoKTtcbiAgICAgIHdvcmxkQ29udGFpbmVyLmJpbmQoS2VybmVsKS50b1NlbGYoKTtcbiAgICAgIHdvcmxkQ29udGFpbmVyLmJpbmQoUmVuZGVyYWJsZSkudG9TZWxmKCk7XG4gICAgICB3b3JsZENvbnRhaW5lci5iaW5kKFZpZXcpLnRvU2VsZigpO1xuICAgICAgd29ybGRDb250YWluZXIuYmluZChDYW1lcmEpLnRvU2VsZigpO1xuICAgICAgd29ybGRDb250YWluZXIuYmluZChTY2VuZSkudG9TZWxmKCk7XG4gICAgICB3b3JsZENvbnRhaW5lci5iaW5kKFdvcmxkKS50b1NlbGYoKTtcbiAgICAgIHdvcmxkQ29udGFpbmVyLmJpbmQoVGV4dHVyZUNhY2hlKS50b1NlbGYoKTtcbiAgICAgIHdvcmxkQ29udGFpbmVyLmJpbmQoVGV4dHVyZTJEKS50b1NlbGYoKTsgLy8gYmluZCBnZW9tZXRyaWVzXG5cbiAgICAgIHdvcmxkQ29udGFpbmVyLmJpbmQoSURFTlRJRklFUi5HZW9tZXRyeSkudG8oQm94KS53aGVuVGFyZ2V0TmFtZWQoR2VvbWV0cnkuQk9YKTtcbiAgICAgIHdvcmxkQ29udGFpbmVyLmJpbmQoSURFTlRJRklFUi5HZW9tZXRyeSkudG8oU3BoZXJlKS53aGVuVGFyZ2V0TmFtZWQoR2VvbWV0cnkuU1BIRVJFKTtcbiAgICAgIHdvcmxkQ29udGFpbmVyLmJpbmQoSURFTlRJRklFUi5HZW9tZXRyeSkudG8oUGxhbmUpLndoZW5UYXJnZXROYW1lZChHZW9tZXRyeS5QTEFORSk7XG4gICAgICB3b3JsZENvbnRhaW5lci5iaW5kKElERU5USUZJRVIuR2VvbWV0cnkpLnRvKE1lcmdlZCkud2hlblRhcmdldE5hbWVkKEdlb21ldHJ5Lk1FUkdFRCk7IC8vIGJpbmQgbWF0ZXJpYWxzXG5cbiAgICAgIHdvcmxkQ29udGFpbmVyLmJpbmQoSURFTlRJRklFUi5NYXRlcmlhbCkudG8oQmFzaWMpLndoZW5UYXJnZXROYW1lZChNYXRlcmlhbC5CQVNJQyk7IC8vIGJpbmQgcmVuZGVyYWJsZXNcblxuICAgICAgd29ybGRDb250YWluZXIuYmluZChJREVOVElGSUVSLlJlbmRlcmFibGUpLnRvKFBvaW50KS53aGVuVGFyZ2V0TmFtZWQoUmVuZGVyYWJsZS5QT0lOVCk7XG4gICAgICB3b3JsZENvbnRhaW5lci5iaW5kKElERU5USUZJRVIuUmVuZGVyYWJsZSkudG8oTGluZSkud2hlblRhcmdldE5hbWVkKFJlbmRlcmFibGUuTElORSk7XG4gICAgICB3b3JsZENvbnRhaW5lci5iaW5kKElERU5USUZJRVIuUmVuZGVyYWJsZSkudG8oR3JpZCkud2hlblRhcmdldE5hbWVkKFJlbmRlcmFibGUuR1JJRCk7XG4gICAgICB2YXIgd29ybGQgPSB3b3JsZENvbnRhaW5lci5nZXQoV29ybGQpO1xuICAgICAgd29ybGQuc2V0Q29udGFpbmVyKHdvcmxkQ29udGFpbmVyKTtcbiAgICAgIHdvcmxkLnNldENvbmZpZyhjb25maWcpO1xuICAgICAgcmV0dXJuIHdvcmxkO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBXb3JsZDtcbn0oKSwgX3RlbXApLCAoX2Rlc2NyaXB0b3IgPSBfYXBwbHlEZWNvcmF0ZWREZXNjcmlwdG9yKF9jbGFzczIucHJvdG90eXBlLCBcImNvbmZpZ1NlcnZpY2VcIiwgW19kZWMyXSwge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHdyaXRhYmxlOiB0cnVlLFxuICBpbml0aWFsaXplcjogbnVsbFxufSkpLCBfY2xhc3MyKSkgfHwgX2NsYXNzKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVdvcmxkLmpzLm1hcCIsImltcG9ydCB7IENhbWVyYSB9IGZyb20gJy4vY2FtZXJhL0NhbWVyYSc7XG5pbXBvcnQgeyBHZW9tZXRyeSB9IGZyb20gJy4vZ2VvbWV0cnknO1xuaW1wb3J0IHsgS2VybmVsIH0gZnJvbSAnLi9LZXJuZWwnO1xuaW1wb3J0IHsgTWF0ZXJpYWwgfSBmcm9tICcuL21hdGVyaWFsJztcbmltcG9ydCB7IFJlbmRlcmFibGUgfSBmcm9tICcuL3JlbmRlcmFibGUvUmVuZGVyYWJsZSc7XG5pbXBvcnQgeyBXb3JsZCB9IGZyb20gJy4vV29ybGQnO1xuZXhwb3J0IHsgV29ybGQsIEtlcm5lbCwgQ2FtZXJhLCBSZW5kZXJhYmxlLCBHZW9tZXRyeSwgTWF0ZXJpYWwgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsImltcG9ydCB7IGlzTnVtYmVyIH0gZnJvbSAnLi8nO1xuaW1wb3J0IHsgZ2V0RWRnZVRlcm1pbmFsIH0gZnJvbSAnLi9tYXRoJztcbi8qKlxuICog5bCGIG51bWJlciB8IEZ1bmN0aW9uIOexu+Wei+eahOWPguaVsOi9rOaNouS4uiByZXR1cm4gbnVtYmVyIOeahCBGdW5jdGlvblxuICogQHBhcmFtICB7bnVtYmVyIHwgRnVuY3Rpb259ICB2YWx1ZSDpnIDopoHooqvovazmjaLnmoTlgLxcbiAqIEBwYXJhbSAge251bWJlcn0gIGRlZmF1bHRWIOi/lOWbnuWHveaVsOeahOm7mOiupOi/lOWbnuWAvFxuICogQHJldHVybiB7RnVuY3Rpb259IOi9rOaNouWQjueahOWHveaVsFxuICovXG5leHBvcnQgY29uc3QgcHJvY2Nlc3NUb0Z1bmMgPSAodmFsdWUsIGRlZmF1bHRWKSA9PiB7XG4gICAgbGV0IGZ1bmM7XG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICBmdW5jID0gKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWIHx8IDE7XG4gICAgICAgIH07XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzTnVtYmVyKHZhbHVlKSkge1xuICAgICAgICBmdW5jID0gKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9O1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgZnVuYyA9IHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gZnVuYztcbn07XG4vKipcbiAqIOWwhuiKgueCueWSjOi+ueaVsOaNrui9rOaNouS4uiBHUFUg5Y+v6K+755qE5pWw57uE44CC5bm26L+U5ZueIG1heEVkZ2VQZXJWZXRleO+8jOavj+S4quiKgueCueS4iuacgOWkmueahOi+ueaVsFxuICogQHBhcmFtICB7Tm9kZUNvbmZpZ1tdfSAgbm9kZXMg6ZyA6KaB6KKr6L2s5o2i55qE5YC8XG4gKiBAcGFyYW0gIHtFZGdlQ29uZmlnW119ICBlZGdlcyDov5Tlm57lh73mlbDnmoTpu5jorqTov5Tlm57lgLxcbiAqIEByZXR1cm4ge09iamVjdH0g6L2s5o2i5ZCO55qE5pWw57uE5Y+KIG1heEVkZ2VQZXJWZXRleCDnu4TmiJDnmoTlr7nosaFcbiAqL1xuZXhwb3J0IGNvbnN0IGJ1aWxkVGV4dHVyZURhdGEgPSAobm9kZXMsIGVkZ2VzKSA9PiB7XG4gICAgY29uc3QgZGF0YUFycmF5ID0gW107XG4gICAgY29uc3Qgbm9kZURpY3QgPSBbXTtcbiAgICBjb25zdCBtYXBJZFBvcyA9IHt9O1xuICAgIGxldCBpID0gMDtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgbiA9IG5vZGVzW2ldO1xuICAgICAgICBtYXBJZFBvc1tuLmlkXSA9IGk7XG4gICAgICAgIGRhdGFBcnJheS5wdXNoKG4ueCk7XG4gICAgICAgIGRhdGFBcnJheS5wdXNoKG4ueSk7XG4gICAgICAgIGRhdGFBcnJheS5wdXNoKDApO1xuICAgICAgICBkYXRhQXJyYXkucHVzaCgwKTtcbiAgICAgICAgbm9kZURpY3QucHVzaChbXSk7XG4gICAgfVxuICAgIGZvciAoaSA9IDA7IGkgPCBlZGdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBlID0gZWRnZXNbaV07XG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IGdldEVkZ2VUZXJtaW5hbChlLCAnc291cmNlJyk7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGdldEVkZ2VUZXJtaW5hbChlLCAndGFyZ2V0Jyk7XG4gICAgICAgIG5vZGVEaWN0W21hcElkUG9zW3NvdXJjZV1dLnB1c2gobWFwSWRQb3NbdGFyZ2V0XSk7XG4gICAgICAgIG5vZGVEaWN0W21hcElkUG9zW3RhcmdldF1dLnB1c2gobWFwSWRQb3Nbc291cmNlXSk7XG4gICAgfVxuICAgIGxldCBtYXhFZGdlUGVyVmV0ZXggPSAwO1xuICAgIGZvciAoaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSBkYXRhQXJyYXkubGVuZ3RoO1xuICAgICAgICBjb25zdCBkZXN0cyA9IG5vZGVEaWN0W2ldO1xuICAgICAgICBjb25zdCBsZW4gPSBkZXN0cy5sZW5ndGg7XG4gICAgICAgIGRhdGFBcnJheVtpICogNCArIDJdID0gb2Zmc2V0O1xuICAgICAgICBkYXRhQXJyYXlbaSAqIDQgKyAzXSA9IGRlc3RzLmxlbmd0aDtcbiAgICAgICAgbWF4RWRnZVBlclZldGV4ID0gTWF0aC5tYXgobWF4RWRnZVBlclZldGV4LCBkZXN0cy5sZW5ndGgpO1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGxlbjsgKytqKSB7XG4gICAgICAgICAgICBjb25zdCBkZXN0ID0gZGVzdHNbal07XG4gICAgICAgICAgICBkYXRhQXJyYXkucHVzaCgrZGVzdCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgd2hpbGUgKGRhdGFBcnJheS5sZW5ndGggJSA0ICE9PSAwKSB7XG4gICAgICAgIGRhdGFBcnJheS5wdXNoKDApO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBtYXhFZGdlUGVyVmV0ZXgsXG4gICAgICAgIGFycmF5OiBuZXcgRmxvYXQzMkFycmF5KGRhdGFBcnJheSksXG4gICAgfTtcbn07XG4vKipcbiog5bCG6IqC54K55ZKM6L655pWw5o2u6L2s5o2i5Li6IEdQVSDlj6/or7vnmoTmlbDnu4TvvIzmr4/mnaHovrnluKbmnInkuIDkuKrlsZ7mgKfjgILlubbov5Tlm54gbWF4RWRnZVBlclZldGV477yM5q+P5Liq6IqC54K55LiK5pyA5aSa55qE6L655pWwXG4qIEBwYXJhbSAge05vZGVDb25maWdbXX0gIG5vZGVzIOiKgueCueaVsOe7hFxuKiBAcGFyYW0gIHtFZGdlQ29uZmlnW119ICBlZGdlcyDovrnmlbDnu4RcbiogQHBhcmFtICB7RnVuY3Rpb259ICBhdHRycyDor7vlj5bovrnlsZ7mgKfnmoTlh73mlbBcbiogQHJldHVybiB7T2JqZWN0fSDovazmjaLlkI7nmoTmlbDnu4Tlj4ogbWF4RWRnZVBlclZldGV4IOe7hOaIkOeahOWvueixoVxuKi9cbi8vIGV4cG9ydCBjb25zdCBidWlsZFRleHR1cmVEYXRhV2l0aE9uZUVkZ2VBdHRyID0gKG5vZGVzOiBPdXROb2RlW10sIGVkZ2VzOiBFZGdlW10sIGF0dHJzOiBGdW5jdGlvbik6IHtcbi8vICAgYXJyYXk6IEZsb2F0MzJBcnJheSxcbi8vICAgbWF4RWRnZVBlclZldGV4OiBudW1iZXJcbi8vIH0gPT4ge1xuLy8gICBjb25zdCBkYXRhQXJyYXkgPSBbXTtcbi8vICAgY29uc3Qgbm9kZURpY3Q6IGFueSA9IFtdO1xuLy8gICBjb25zdCBtYXBJZFBvczogSW5kZXhNYXAgPSB7fTtcbi8vICAgbGV0IGkgPSAwO1xuLy8gICBmb3IgKGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbi8vICAgICAgIGNvbnN0IG4gPSBub2Rlc1tpXTtcbi8vICAgICAgIG1hcElkUG9zW24uaWRdID0gaTtcbi8vICAgICAgIGRhdGFBcnJheS5wdXNoKG4ueCk7XG4vLyAgICAgICBkYXRhQXJyYXkucHVzaChuLnkpO1xuLy8gICAgICAgZGF0YUFycmF5LnB1c2goMCk7XG4vLyAgICAgICBkYXRhQXJyYXkucHVzaCgwKTtcbi8vICAgICAgIG5vZGVEaWN0LnB1c2goW10pO1xuLy8gICB9XG4vLyAgIGZvciAoaSA9IDA7IGkgPCBlZGdlcy5sZW5ndGg7IGkrKykge1xuLy8gICAgICAgY29uc3QgZSA9IGVkZ2VzW2ldO1xuLy8gICAgICAgbm9kZURpY3RbbWFwSWRQb3NbZS5zb3VyY2VdXS5wdXNoKG1hcElkUG9zW2UudGFyZ2V0XSk7XG4vLyAgICAgICBub2RlRGljdFttYXBJZFBvc1tlLnNvdXJjZV1dLnB1c2goYXR0cnMoZSkpOyAvLyDnkIbmg7Povrnplb/vvIzlkI7nu63lj6/ku6XmlLnmiJDmr4/mnaHovrnkuI3lkIxcbi8vICAgICAgIG5vZGVEaWN0W21hcElkUG9zW2UudGFyZ2V0XV0ucHVzaChtYXBJZFBvc1tlLnNvdXJjZV0pO1xuLy8gICAgICAgbm9kZURpY3RbbWFwSWRQb3NbZS50YXJnZXRdXS5wdXNoKGF0dHJzKGUpKTsgLy8g55CG5oOz6L656ZW/77yM5ZCO57ut5Y+v5Lul5pS55oiQ5q+P5p2h6L655LiN5ZCMXG4vLyAgIH1cbi8vICAgbGV0IG1heEVkZ2VQZXJWZXRleCA9IDA7XG4vLyAgIGZvciAoaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuLy8gICAgICAgY29uc3Qgb2Zmc2V0OiBudW1iZXIgPSBkYXRhQXJyYXkubGVuZ3RoO1xuLy8gICAgICAgY29uc3QgZGVzdHMgPSBub2RlRGljdFtpXTsgLy8gZGVzdCDkuK3oioLngrkgaWQg5LiO6L656ZW/6Ze06ZqU5a2Y5YKo77yM5Y2z5LiA5L2N6IqC54K5IGlk77yM5LiA5L2N6L656ZW/4oCm4oCmXG4vLyAgICAgICBjb25zdCBsZW4gPSBkZXN0cy5sZW5ndGg7XG4vLyAgICAgICBkYXRhQXJyYXlbaSAqIDQgKyAyXSA9IG9mZnNldDtcbi8vICAgICAgIGRhdGFBcnJheVtpICogNCArIDNdID0gbGVuIC8gMjsgLy8g56ys5Zub5L2N5a2Y5YKo5LiO6K+l6IqC54K555u45YWz55qE5omA5pyJ6IqC54K55Liq5pWwXG4vLyAgICAgICBtYXhFZGdlUGVyVmV0ZXggPSBNYXRoLm1heChtYXhFZGdlUGVyVmV0ZXgsIGxlbiAvIDIpO1xuLy8gICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBsZW47ICsraikge1xuLy8gICAgICAgICAgIGNvbnN0IGRlc3QgPSBkZXN0c1tqXTtcbi8vICAgICAgICAgICBkYXRhQXJyYXkucHVzaCgrZGVzdCk7XG4vLyAgICAgICB9XG4vLyAgIH1cbi8vICAgLy8g5LiN5pivIDQg55qE5YCN5pWw77yM5aGr5YWFIDBcbi8vICAgd2hpbGUgKGRhdGFBcnJheS5sZW5ndGggJSA0ICE9PSAwKSB7XG4vLyAgICAgICBkYXRhQXJyYXkucHVzaCgwKTtcbi8vICAgfVxuLy8gICByZXR1cm4ge1xuLy8gICAgICAgYXJyYXk6IG5ldyBGbG9hdDMyQXJyYXkoZGF0YUFycmF5KSxcbi8vICAgICAgIG1heEVkZ2VQZXJWZXRleFxuLy8gICB9XG4vLyB9XG4vKipcbiog5bCG6IqC54K55ZKM6L655pWw5o2u6L2s5o2i5Li6IEdQVSDlj6/or7vnmoTmlbDnu4TvvIzmr4/mnaHovrnluKbmnInkuIDkuKrku6XkuIrlsZ7mgKfjgILlubbov5Tlm54gbWF4RWRnZVBlclZldGV477yM5q+P5Liq6IqC54K55LiK5pyA5aSa55qE6L655pWwXG4qIEBwYXJhbSAge05vZGVDb25maWdbXX0gIG5vZGVzIOiKgueCueaVsOe7hFxuKiBAcGFyYW0gIHtFZGdlQ29uZmlnW119ICBlZGdlcyDovrnmlbDnu4RcbiogQHBhcmFtICB7RnVuY3Rpb259ICBhdHRycyDor7vlj5bovrnlsZ7mgKfnmoTlh73mlbBcbiogQHJldHVybiB7T2JqZWN0fSDovazmjaLlkI7nmoTmlbDnu4Tlj4ogbWF4RWRnZVBlclZldGV4IOe7hOaIkOeahOWvueixoVxuKi9cbmV4cG9ydCBjb25zdCBidWlsZFRleHR1cmVEYXRhV2l0aFR3b0VkZ2VBdHRyID0gKG5vZGVzLCBlZGdlcywgYXR0cnMxLCBhdHRyczIpID0+IHtcbiAgICBjb25zdCBkYXRhQXJyYXkgPSBbXTtcbiAgICBjb25zdCBub2RlRGljdCA9IFtdO1xuICAgIGNvbnN0IG1hcElkUG9zID0ge307XG4gICAgbGV0IGkgPSAwO1xuICAgIGZvciAoaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBuID0gbm9kZXNbaV07XG4gICAgICAgIG1hcElkUG9zW24uaWRdID0gaTtcbiAgICAgICAgZGF0YUFycmF5LnB1c2gobi54KTtcbiAgICAgICAgZGF0YUFycmF5LnB1c2gobi55KTtcbiAgICAgICAgZGF0YUFycmF5LnB1c2goMCk7XG4gICAgICAgIGRhdGFBcnJheS5wdXNoKDApO1xuICAgICAgICBub2RlRGljdC5wdXNoKFtdKTtcbiAgICB9XG4gICAgZm9yIChpID0gMDsgaSA8IGVkZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGUgPSBlZGdlc1tpXTtcbiAgICAgICAgY29uc3Qgc291cmNlID0gZ2V0RWRnZVRlcm1pbmFsKGUsICdzb3VyY2UnKTtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZ2V0RWRnZVRlcm1pbmFsKGUsICd0YXJnZXQnKTtcbiAgICAgICAgbm9kZURpY3RbbWFwSWRQb3Nbc291cmNlXV0ucHVzaChtYXBJZFBvc1t0YXJnZXRdKTtcbiAgICAgICAgbm9kZURpY3RbbWFwSWRQb3Nbc291cmNlXV0ucHVzaChhdHRyczEoZSkpO1xuICAgICAgICBub2RlRGljdFttYXBJZFBvc1tzb3VyY2VdXS5wdXNoKGF0dHJzMihlKSk7XG4gICAgICAgIG5vZGVEaWN0W21hcElkUG9zW3NvdXJjZV1dLnB1c2goMCk7XG4gICAgICAgIG5vZGVEaWN0W21hcElkUG9zW3RhcmdldF1dLnB1c2gobWFwSWRQb3Nbc291cmNlXSk7XG4gICAgICAgIG5vZGVEaWN0W21hcElkUG9zW3RhcmdldF1dLnB1c2goYXR0cnMxKGUpKTtcbiAgICAgICAgbm9kZURpY3RbbWFwSWRQb3NbdGFyZ2V0XV0ucHVzaChhdHRyczIoZSkpO1xuICAgICAgICBub2RlRGljdFttYXBJZFBvc1t0YXJnZXRdXS5wdXNoKDApO1xuICAgIH1cbiAgICBsZXQgbWF4RWRnZVBlclZldGV4ID0gMDtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gZGF0YUFycmF5Lmxlbmd0aDtcbiAgICAgICAgY29uc3QgZGVzdHMgPSBub2RlRGljdFtpXTsgLy8gZGVzdCDkuK3oioLngrkgaWQg5LiO6L656ZW/6Ze06ZqU5a2Y5YKo77yM5Y2z5LiA5L2N6IqC54K5IGlk77yM5LiA5L2N6L656ZW/4oCm4oCmXG4gICAgICAgIGNvbnN0IGxlbiA9IGRlc3RzLmxlbmd0aDtcbiAgICAgICAgLy8gZGF0YUFycmF5W2kgKiA0ICsgMl0gPSBvZmZzZXQ7XG4gICAgICAgIC8vIGRhdGFBcnJheVtpICogNCArIDNdID0gbGVuIC8gNDsgLy8g56ys5Zub5L2N5a2Y5YKo5LiO6K+l6IqC54K555u45YWz55qE5omA5pyJ6IqC54K55Liq5pWwXG4gICAgICAgIC8vIHBhY2sgb2Zmc2V0ICYgbGVuZ3RoIGludG8gZmxvYXQzMjogb2Zmc2V0IDIwYml0LCBsZW5ndGggMTJiaXRcbiAgICAgICAgZGF0YUFycmF5W2kgKiA0ICsgMl0gPSBvZmZzZXQgKyAxMDQ4NTc2ICogbGVuIC8gNDtcbiAgICAgICAgZGF0YUFycmF5W2kgKiA0ICsgM10gPSAwOyAvLyDnrKzlm5vkvY3lrZjlgqjkuI7kuIrkuIDmrKHnmoTot53nprvlt67lgLxcbiAgICAgICAgbWF4RWRnZVBlclZldGV4ID0gTWF0aC5tYXgobWF4RWRnZVBlclZldGV4LCBsZW4gLyA0KTtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBsZW47ICsraikge1xuICAgICAgICAgICAgY29uc3QgZGVzdCA9IGRlc3RzW2pdO1xuICAgICAgICAgICAgZGF0YUFycmF5LnB1c2goK2Rlc3QpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIOS4jeaYryA0IOeahOWAjeaVsO+8jOWhq+WFhSAwXG4gICAgd2hpbGUgKGRhdGFBcnJheS5sZW5ndGggJSA0ICE9PSAwKSB7XG4gICAgICAgIGRhdGFBcnJheS5wdXNoKDApO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBtYXhFZGdlUGVyVmV0ZXgsXG4gICAgICAgIGFycmF5OiBuZXcgRmxvYXQzMkFycmF5KGRhdGFBcnJheSksXG4gICAgfTtcbn07XG4vKipcbiogdHJhbnNmb3JtIHRoZSBleHRlbmRlZCBhdHRyaWJ1dGVzIG9mIG5vZGVzIG9yIGVkZ2VzIHRvIGEgdGV4dHVyZSBhcnJheVxuKiBAcGFyYW0gIHtzdHJpbmdbXX0gIGF0dHJpYnV0ZU5hbWVzIGF0dHJpYnV0ZXMnIG5hbWUgdG8gYmUgcmVhZCBmcm9tIGl0ZW1zIGFuZCBwdXQgaW50byBvdXRwdXQgYXJyYXlcbiogQHBhcmFtICB7TW9kZWxDb25maWdbXX0gIGl0ZW1zIHRoZSBpdGVtcyB0byBiZSByZWFkXG4qIEByZXR1cm4ge0Zsb2F0MzJBcnJheX0gdGhlIGF0dHJpYnV0ZXMnIHZhbHVlIGFycmF5IHRvIGJlIHJlYWQgYnkgR1BVXG4qL1xuZXhwb3J0IGNvbnN0IGF0dHJpYnV0ZXNUb1RleHR1cmVEYXRhID0gKGF0dHJpYnV0ZU5hbWVzLCBpdGVtcykgPT4ge1xuICAgIGNvbnN0IGRhdGFBcnJheSA9IFtdO1xuICAgIGNvbnN0IGF0dHJpYnV0ZU51bSA9IGF0dHJpYnV0ZU5hbWVzLmxlbmd0aDtcbiAgICBjb25zdCBhdHRyaWJ1dHRlU3RyaW5nTWFwID0ge307XG4gICAgaXRlbXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICBhdHRyaWJ1dGVOYW1lcy5mb3JFYWNoKChuYW1lLCBpKSA9PiB7XG4gICAgICAgICAgICBpZiAoYXR0cmlidXR0ZVN0cmluZ01hcFtpdGVtW25hbWVdXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgYXR0cmlidXR0ZVN0cmluZ01hcFtpdGVtW25hbWVdXSA9IE9iamVjdC5rZXlzKGF0dHJpYnV0dGVTdHJpbmdNYXApLmxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRhdGFBcnJheS5wdXNoKGF0dHJpYnV0dGVTdHJpbmdNYXBbaXRlbVtuYW1lXV0pO1xuICAgICAgICAgICAgLy8gaW5zdXJlIGVhY2ggbm9kZSdzIGF0dHJpYnV0ZXMgdGFrZSBpbnRlciBudW1iZXIgb2YgZ3JpZHNcbiAgICAgICAgICAgIGlmIChpID09PSBhdHRyaWJ1dGVOdW0gLSAxKSB7XG4gICAgICAgICAgICAgICAgd2hpbGUgKGRhdGFBcnJheS5sZW5ndGggJSA0ICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGFBcnJheS5wdXNoKDApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgYXJyYXk6IG5ldyBGbG9hdDMyQXJyYXkoZGF0YUFycmF5KSxcbiAgICAgICAgY291bnQ6IE9iamVjdC5rZXlzKGF0dHJpYnV0dGVTdHJpbmdNYXApLmxlbmd0aFxuICAgIH07XG59O1xuLyoqXG4qIHRyYW5zZm9ybSB0aGUgbnVtYmVyIGFycmF5IGZvcm1hdCBvZiBleHRlbmRlZCBhdHRyaWJ1dGVzIG9mIG5vZGVzIG9yIGVkZ2VzIHRvIGEgdGV4dHVyZSBhcnJheVxuKiBAcGFyYW0gIHtzdHJpbmdbXX0gIGF0dHJpYnV0ZU5hbWVzIGF0dHJpYnV0ZXMnIG5hbWUgdG8gYmUgcmVhZCBmcm9tIGl0ZW1zIGFuZCBwdXQgaW50byBvdXRwdXQgYXJyYXlcbiogQHJldHVybiB7RmxvYXQzMkFycmF5fSB0aGUgYXR0cmlidXRlcycgdmFsdWUgYXJyYXkgdG8gYmUgcmVhZCBieSBHUFVcbiovXG5leHBvcnQgY29uc3QgYXJyYXlUb1RleHR1cmVEYXRhID0gKHZhbHVlQXJyYXlzKSA9PiB7XG4gICAgY29uc3QgZGF0YUFycmF5ID0gW107XG4gICAgY29uc3QgYXR0cmlidXRlTnVtID0gdmFsdWVBcnJheXMubGVuZ3RoO1xuICAgIGNvbnN0IGl0ZW1OdW0gPSB2YWx1ZUFycmF5c1swXS5sZW5ndGg7XG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBpdGVtTnVtOyBqKyspIHtcbiAgICAgICAgdmFsdWVBcnJheXMuZm9yRWFjaCgodmFsdWVBcnJheSwgaSkgPT4ge1xuICAgICAgICAgICAgZGF0YUFycmF5LnB1c2godmFsdWVBcnJheVtqXSk7XG4gICAgICAgICAgICAvLyBpbnN1cmUgZWFjaCBub2RlJ3MgYXR0cmlidXRlcyB0YWtlIGludGVyIG51bWJlciBvZiBncmlkc1xuICAgICAgICAgICAgaWYgKGkgPT09IGF0dHJpYnV0ZU51bSAtIDEpIHtcbiAgICAgICAgICAgICAgICB3aGlsZSAoZGF0YUFycmF5Lmxlbmd0aCAlIDQgIT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YUFycmF5LnB1c2goMCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBGbG9hdDMyQXJyYXkoZGF0YUFycmF5KTtcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1ncHUuanMubWFwIiwiZXhwb3J0IGNvbnN0IGZydWNodGVybWFuQ29kZSA9IGBcbmltcG9ydCB7IGdsb2JhbEludm9jYXRpb25JRCB9IGZyb20gJ2ctd2ViZ3B1JztcbmNvbnN0IE1BWF9FREdFX1BFUl9WRVJURVg7XG5jb25zdCBWRVJURVhfQ09VTlQ7XG5AbnVtdGhyZWFkcygxLCAxLCAxKVxuY2xhc3MgRnJ1Y2h0ZXJtYW4ge1xuICBAaW4gQG91dFxuICB1X0RhdGE6IHZlYzRbXTtcbiAgQGluXG4gIHVfSzogZmxvYXQ7XG4gIEBpblxuICB1X0syOiBmbG9hdDtcbiAgXG4gIEBpblxuICB1X0NlbnRlcjogdmVjMjtcbiAgQGluXG4gIHVfR3Jhdml0eTogZmxvYXQ7XG4gIEBpblxuICB1X0NsdXN0ZXJHcmF2aXR5OiBmbG9hdDtcbiAgQGluXG4gIHVfU3BlZWQ6IGZsb2F0O1xuICBAaW5cbiAgdV9NYXhEaXNwbGFjZTogZmxvYXQ7XG4gIEBpblxuICB1X0NsdXN0ZXJpbmc6IGZsb2F0O1xuICBAaW5cbiAgdV9BdHRyaWJ1dGVBcnJheTogdmVjNFtdO1xuICBAaW5cbiAgdV9DbHVzdGVyQ2VudGVyczogdmVjNFtdO1xuICBjYWxjUmVwdWxzaXZlKGk6IGludCwgY3VycmVudE5vZGU6IHZlYzQpOiB2ZWMyIHtcbiAgICBsZXQgZHggPSAwLCBkeSA9IDA7XG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBWRVJURVhfQ09VTlQ7IGorKykge1xuICAgICAgaWYgKGkgIT0gaikge1xuICAgICAgICBjb25zdCBuZXh0Tm9kZSA9IHRoaXMudV9EYXRhW2pdO1xuICAgICAgICBjb25zdCB4RGlzdCA9IGN1cnJlbnROb2RlWzBdIC0gbmV4dE5vZGVbMF07XG4gICAgICAgIGNvbnN0IHlEaXN0ID0gY3VycmVudE5vZGVbMV0gLSBuZXh0Tm9kZVsxXTtcbiAgICAgICAgY29uc3QgZGlzdCA9ICh4RGlzdCAqIHhEaXN0ICsgeURpc3QgKiB5RGlzdCkgKyAwLjAxO1xuICAgICAgICBsZXQgcGFyYW0gPSB0aGlzLnVfSzIgLyBkaXN0O1xuICAgICAgICBcbiAgICAgICAgaWYgKGRpc3QgPiAwLjApIHtcbiAgICAgICAgICBkeCArPSBwYXJhbSAqIHhEaXN0O1xuICAgICAgICAgIGR5ICs9IHBhcmFtICogeURpc3Q7XG4gICAgICAgICAgaWYgKHhEaXN0ID09IDAgJiYgeURpc3QgPT0gMCkge1xuICAgICAgICAgICAgY29uc3Qgc2lnbiA9IGkgPCBqID8gMSA6IC0xO1xuICAgICAgICAgICAgZHggKz0gcGFyYW0gKiBzaWduO1xuICAgICAgICAgICAgZHkgKz0gcGFyYW0gKiBzaWduO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gW2R4LCBkeV07XG4gIH1cbiAgY2FsY0dyYXZpdHkoY3VycmVudE5vZGU6IHZlYzQsIG5vZGVBdHRyaWJ1dGVzOiB2ZWM0KTogdmVjMiB7IC8vIFxuICAgIGxldCBkeCA9IDAsIGR5ID0gMDtcbiAgICBjb25zdCB2eCA9IGN1cnJlbnROb2RlWzBdIC0gdGhpcy51X0NlbnRlclswXTtcbiAgICBjb25zdCB2eSA9IGN1cnJlbnROb2RlWzFdIC0gdGhpcy51X0NlbnRlclsxXTtcbiAgICBjb25zdCBnZiA9IDAuMDEgKiB0aGlzLnVfSyAqIHRoaXMudV9HcmF2aXR5O1xuICAgIGR4ID0gZ2YgKiB2eDtcbiAgICBkeSA9IGdmICogdnk7XG4gICAgaWYgKHRoaXMudV9DbHVzdGVyaW5nID09IDEpIHtcbiAgICAgIGNvbnN0IGNsdXN0ZXJJZHggPSBpbnQobm9kZUF0dHJpYnV0ZXNbMF0pO1xuICAgICAgY29uc3QgY2VudGVyID0gdGhpcy51X0NsdXN0ZXJDZW50ZXJzW2NsdXN0ZXJJZHhdO1xuICAgICAgY29uc3QgY3Z4ID0gY3VycmVudE5vZGVbMF0gLSBjZW50ZXJbMF07XG4gICAgICBjb25zdCBjdnkgPSBjdXJyZW50Tm9kZVsxXSAtIGNlbnRlclsxXTtcbiAgICAgIGNvbnN0IGRpc3QgPSBzcXJ0KGN2eCAqIGN2eCArIGN2eSAqIGN2eSkgKyAwLjAxO1xuICAgICAgY29uc3QgcGFybWEgPSB0aGlzLnVfSyAqIHRoaXMudV9DbHVzdGVyR3Jhdml0eSAvIGRpc3Q7XG4gICAgICBkeCArPSBwYXJtYSAqIGN2eDtcbiAgICAgIGR5ICs9IHBhcm1hICogY3Z5O1xuICAgIH1cbiAgICByZXR1cm4gW2R4LCBkeV07XG4gIH1cbiAgY2FsY0F0dHJhY3RpdmUoaTogaW50LCBjdXJyZW50Tm9kZTogdmVjNCk6IHZlYzIge1xuICAgIGxldCBkeCA9IDAsIGR5ID0gMDtcbiAgICBjb25zdCBhcnJfb2Zmc2V0ID0gaW50KGZsb29yKGN1cnJlbnROb2RlWzJdICsgMC41KSk7XG4gICAgY29uc3QgbGVuZ3RoID0gaW50KGZsb29yKGN1cnJlbnROb2RlWzNdICsgMC41KSk7XG4gICAgY29uc3Qgbm9kZV9idWZmZXI6IHZlYzQ7XG4gICAgZm9yIChsZXQgcCA9IDA7IHAgPCBNQVhfRURHRV9QRVJfVkVSVEVYOyBwKyspIHtcbiAgICAgIGlmIChwID49IGxlbmd0aCkgYnJlYWs7XG4gICAgICBjb25zdCBhcnJfaWR4ID0gYXJyX29mZnNldCArIHA7XG4gICAgICAvLyB3aGVuIGFycl9pZHggJSA0ID09IDAgdXBkYXRlIGN1cnJlbnROb2RlZHhfYnVmZmVyXG4gICAgICBjb25zdCBidWZfb2Zmc2V0ID0gYXJyX2lkeCAtIGFycl9pZHggLyA0ICogNDtcbiAgICAgIGlmIChwID09IDAgfHwgYnVmX29mZnNldCA9PSAwKSB7XG4gICAgICAgIG5vZGVfYnVmZmVyID0gdGhpcy51X0RhdGFbaW50KGFycl9pZHggLyA0KV07XG4gICAgICB9XG4gICAgICBjb25zdCBmbG9hdF9qID0gYnVmX29mZnNldCA9PSAwID8gbm9kZV9idWZmZXJbMF0gOlxuICAgICAgICAgICAgICAgICAgICAgIGJ1Zl9vZmZzZXQgPT0gMSA/IG5vZGVfYnVmZmVyWzFdIDpcbiAgICAgICAgICAgICAgICAgICAgICBidWZfb2Zmc2V0ID09IDIgPyBub2RlX2J1ZmZlclsyXSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZV9idWZmZXJbM107XG4gICAgICBjb25zdCBuZXh0Tm9kZSA9IHRoaXMudV9EYXRhW2ludChmbG9hdF9qKV07XG4gICAgICBjb25zdCB4RGlzdCA9IGN1cnJlbnROb2RlWzBdIC0gbmV4dE5vZGVbMF07XG4gICAgICBjb25zdCB5RGlzdCA9IGN1cnJlbnROb2RlWzFdIC0gbmV4dE5vZGVbMV07XG4gICAgICBjb25zdCBkaXN0ID0gc3FydCh4RGlzdCAqIHhEaXN0ICsgeURpc3QgKiB5RGlzdCkgKyAwLjAxO1xuICAgICAgbGV0IGF0dHJhY3RpdmVGID0gZGlzdCAvIHRoaXMudV9LO1xuICAgIFxuICAgICAgaWYgKGRpc3QgPiAwLjApIHtcbiAgICAgICAgZHggLT0geERpc3QgKiBhdHRyYWN0aXZlRjtcbiAgICAgICAgZHkgLT0geURpc3QgKiBhdHRyYWN0aXZlRjtcbiAgICAgICAgaWYgKHhEaXN0ID09IDAgJiYgeURpc3QgPT0gMCkge1xuICAgICAgICAgIGNvbnN0IHNpZ24gPSBpIDwgaW50KGZsb2F0X2opID8gMSA6IC0xO1xuICAgICAgICAgIGR4IC09IHNpZ24gKiBhdHRyYWN0aXZlRjtcbiAgICAgICAgICBkeSAtPSBzaWduICogYXR0cmFjdGl2ZUY7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFtkeCwgZHldO1xuICB9XG4gIEBtYWluXG4gIGNvbXB1dGUoKSB7XG4gICAgY29uc3QgaSA9IGdsb2JhbEludm9jYXRpb25JRC54O1xuICAgIGNvbnN0IGN1cnJlbnROb2RlID0gdGhpcy51X0RhdGFbaV07XG4gICAgbGV0IGR4ID0gMCwgZHkgPSAwO1xuICAgIGlmIChpID49IFZFUlRFWF9DT1VOVCkge1xuICAgICAgdGhpcy51X0RhdGFbaV0gPSBjdXJyZW50Tm9kZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBbZ3Jhdml0eSwgZngsIGZ5LCAwXVxuICAgIGNvbnN0IG5vZGVBdHRyaWJ1dGVzID0gdGhpcy51X0F0dHJpYnV0ZUFycmF5W2ldO1xuXG4gICAgaWYgKG5vZGVBdHRyaWJ1dGVzWzFdICE9IDAgJiYgbm9kZUF0dHJpYnV0ZXNbMl0gIT0gMCkge1xuICAgICAgLy8gdGhlIG5vZGUgaXMgZml4ZWRcbiAgICAgIHRoaXMudV9EYXRhW2ldID0gW1xuICAgICAgICBub2RlQXR0cmlidXRlc1sxXSxcbiAgICAgICAgbm9kZUF0dHJpYnV0ZXNbMl0sXG4gICAgICAgIGN1cnJlbnROb2RlWzJdLFxuICAgICAgICBjdXJyZW50Tm9kZVszXVxuICAgICAgXTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyByZXB1bHNpdmVcbiAgICBjb25zdCByZXB1bHNpdmUgPSB0aGlzLmNhbGNSZXB1bHNpdmUoaSwgY3VycmVudE5vZGUpO1xuICAgIGR4ICs9IHJlcHVsc2l2ZVswXTtcbiAgICBkeSArPSByZXB1bHNpdmVbMV07XG4gICAgLy8gYXR0cmFjdGl2ZVxuICAgIGNvbnN0IGF0dHJhY3RpdmUgPSB0aGlzLmNhbGNBdHRyYWN0aXZlKGksIGN1cnJlbnROb2RlKTtcbiAgICBkeCArPSBhdHRyYWN0aXZlWzBdO1xuICAgIGR5ICs9IGF0dHJhY3RpdmVbMV07XG4gICAgLy8gZ3Jhdml0eVxuICAgIGNvbnN0IGdyYXZpdHkgPSB0aGlzLmNhbGNHcmF2aXR5KGN1cnJlbnROb2RlLCBub2RlQXR0cmlidXRlcyk7XG4gICAgZHggLT0gZ3Jhdml0eVswXTtcbiAgICBkeSAtPSBncmF2aXR5WzFdO1xuICAgIC8vIHNwZWVkXG4gICAgZHggKj0gdGhpcy51X1NwZWVkO1xuICAgIGR5ICo9IHRoaXMudV9TcGVlZDtcblxuICAgIC8vIG1vdmVcbiAgICBjb25zdCBkaXN0TGVuZ3RoID0gc3FydChkeCAqIGR4ICsgZHkgKiBkeSk7XG4gICAgaWYgKGRpc3RMZW5ndGggPiAwLjApIHtcbiAgICAgIGNvbnN0IGxpbWl0ZWREaXN0ID0gbWluKHRoaXMudV9NYXhEaXNwbGFjZSAqIHRoaXMudV9TcGVlZCwgZGlzdExlbmd0aCk7XG4gICAgICB0aGlzLnVfRGF0YVtpXSA9IFtcbiAgICAgICAgY3VycmVudE5vZGVbMF0gKyBkeCAvIGRpc3RMZW5ndGggKiBsaW1pdGVkRGlzdCxcbiAgICAgICAgY3VycmVudE5vZGVbMV0gKyBkeSAvIGRpc3RMZW5ndGggKiBsaW1pdGVkRGlzdCxcbiAgICAgICAgY3VycmVudE5vZGVbMl0sXG4gICAgICAgIGN1cnJlbnROb2RlWzNdXG4gICAgICBdO1xuICAgIH1cbiAgfVxufVxuYDtcbmV4cG9ydCBjb25zdCBmcnVjaHRlcm1hbkJ1bmRsZSA9IGB7XCJzaGFkZXJzXCI6e1wiV0dTTFwiOlwiaW1wb3J0IFxcXFxcIkdMU0wuc3RkLjQ1MFxcXFxcIiBhcyBzdGQ7XFxcXG5cXFxcblxcXFxuIyB2YXIgZ1dlYkdQVURlYnVnIDogYm9vbCA9IGZhbHNlO1xcXFxuIyB2YXIgZ1dlYkdQVURlYnVnT3V0cHV0IDogdmVjNDxmMzI+ID0gdmVjNDxmMzI+KDAuMCk7XFxcXG5cXFxcbltbYnVpbHRpbiBnbG9iYWxfaW52b2NhdGlvbl9pZF1dIHZhcjxpbj4gZ2xvYmFsSW52b2NhdGlvbklEIDogdmVjMzx1MzI+O1xcXFxuIyBbW2J1aWx0aW4gd29ya19ncm91cF9zaXplXV0gdmFyPGluPiB3b3JrR3JvdXBTaXplIDogdmVjMzx1MzI+O1xcXFxuIyBbW2J1aWx0aW4gd29ya19ncm91cF9pZF1dIHZhcjxpbj4gd29ya0dyb3VwSUQgOiB2ZWMzPHUzMj47XFxcXG5bW2J1aWx0aW4gbG9jYWxfaW52b2NhdGlvbl9pZF1dIHZhcjxpbj4gbG9jYWxJbnZvY2F0aW9uSUQgOiB2ZWMzPHUzMj47XFxcXG4jIFtbYnVpbHRpbiBudW1fd29ya19ncm91cHNdXSB2YXI8aW4+IG51bVdvcmtHcm91cHMgOiB2ZWMzPHUzMj47XFxcXG5bW2J1aWx0aW4gbG9jYWxfaW52b2NhdGlvbl9pZHhdXSB2YXI8aW4+IGxvY2FsSW52b2NhdGlvbkluZGV4IDogdTMyO1xcXFxuXFxcXG50eXBlIEdXZWJHUFVQYXJhbXMgPSBbW2Jsb2NrXV0gc3RydWN0IHtcXFxcbiAgW1tvZmZzZXQgMF1dIHVfSyA6IGYzMjtcXFxcbiAgW1tvZmZzZXQgNF1dIHVfSzIgOiBmMzI7XFxcXG4gIFtbb2Zmc2V0IDhdXSB1X0NlbnRlciA6IHZlYzI8ZjMyPjtcXFxcbiAgW1tvZmZzZXQgMTZdXSB1X0dyYXZpdHkgOiBmMzI7XFxcXG4gIFtbb2Zmc2V0IDIwXV0gdV9DbHVzdGVyR3Jhdml0eSA6IGYzMjtcXFxcbiAgW1tvZmZzZXQgMjRdXSB1X1NwZWVkIDogZjMyO1xcXFxuICBbW29mZnNldCAyOF1dIHVfTWF4RGlzcGxhY2UgOiBmMzI7XFxcXG4gIFtbb2Zmc2V0IDMyXV0gdV9DbHVzdGVyaW5nIDogZjMyO1xcXFxufTtcXFxcbltbYmluZGluZyAwLCBzZXQgMF1dIHZhcjx1bmlmb3JtPiBnV2ViR1BVVW5pZm9ybVBhcmFtcyA6IEdXZWJHUFVQYXJhbXM7XFxcXG50eXBlIEdXZWJHUFVCdWZmZXIwID0gW1tibG9ja11dIHN0cnVjdCB7XFxcXG4gIFtbb2Zmc2V0IDBdXSB1X0RhdGEgOiBbW3N0cmlkZSAxNl1dIGFycmF5PHZlYzQ8ZjMyPj47XFxcXG59O1xcXFxuW1tiaW5kaW5nIDEsIHNldCAwXV0gdmFyPHN0b3JhZ2VfYnVmZmVyPiBnV2ViR1BVQnVmZmVyMCA6IEdXZWJHUFVCdWZmZXIwO1xcXFxudHlwZSBHV2ViR1BVQnVmZmVyMSA9IFtbYmxvY2tdXSBzdHJ1Y3Qge1xcXFxuICBbW29mZnNldCAwXV0gdV9BdHRyaWJ1dGVBcnJheSA6IFtbc3RyaWRlIDE2XV0gYXJyYXk8dmVjNDxmMzI+PjtcXFxcbn07XFxcXG5bW2JpbmRpbmcgMiwgc2V0IDBdXSB2YXI8c3RvcmFnZV9idWZmZXI+IGdXZWJHUFVCdWZmZXIxIDogR1dlYkdQVUJ1ZmZlcjE7XFxcXG50eXBlIEdXZWJHUFVCdWZmZXIyID0gW1tibG9ja11dIHN0cnVjdCB7XFxcXG4gIFtbb2Zmc2V0IDBdXSB1X0NsdXN0ZXJDZW50ZXJzIDogW1tzdHJpZGUgMTZdXSBhcnJheTx2ZWM0PGYzMj4+O1xcXFxufTtcXFxcbltbYmluZGluZyAzLCBzZXQgMF1dIHZhcjxzdG9yYWdlX2J1ZmZlcj4gZ1dlYkdQVUJ1ZmZlcjIgOiBHV2ViR1BVQnVmZmVyMjtcXFxcblxcXFxuXFxcXG5cXFxcblxcXFxuXFxcXG5cXFxcblxcXFxuXFxcXG5cXFxcblxcXFxuXFxcXG5cXFxcblxcXFxuXFxcXG5cXFxcblxcXFxuXFxcXG5mbiBjYWxjUmVwdWxzaXZlKGkgOiBpMzIsIGN1cnJlbnROb2RlIDogdmVjNDxmMzI+KSAtPiB2ZWMyPGYzMj4ge3ZhciBkeCA6IGYzMiA9IDAuMDtcXFxcbnZhciBkeSA6IGYzMiA9IDAuMDtcXFxcbmZvciAodmFyIGogOiBpMzIgPSAwOyBqIDwgX19EZWZpbmVWYWx1ZVBsYWNlaG9sZGVyX19WRVJURVhfQ09VTlQ7IGogPSBqICsgMSkge2lmIChpICE9IGopIHt2YXIgbmV4dE5vZGUgOiB2ZWM0PGYzMj4gPSBnV2ViR1BVQnVmZmVyMC51X0RhdGFbal07XFxcXG52YXIgeERpc3QgOiBmMzIgPSBjdXJyZW50Tm9kZS54IC0gbmV4dE5vZGUueDtcXFxcbnZhciB5RGlzdCA6IGYzMiA9IGN1cnJlbnROb2RlLnkgLSBuZXh0Tm9kZS55O1xcXFxudmFyIGRpc3QgOiBmMzIgPSAoKHhEaXN0ICogeERpc3QpICsgKHlEaXN0ICogeURpc3QpKSArIDAuMDE7XFxcXG52YXIgcGFyYW0gOiBmMzIgPSBnV2ViR1BVVW5pZm9ybVBhcmFtcy51X0syIC8gZGlzdDtcXFxcbmlmIChkaXN0ID4gMC4wKSB7ZHggPSBkeCArIHBhcmFtICogeERpc3Q7XFxcXG5keSA9IGR5ICsgcGFyYW0gKiB5RGlzdDtcXFxcbmlmICgoeERpc3QgPT0gMC4wKSAmJiAoeURpc3QgPT0gMC4wKSkge3ZhciBzaWduIDogZjMyID0gc2VsZWN0KDEuMCwgLTEuMCwgaSA8IGopO1xcXFxuZHggPSBkeCArIHBhcmFtICogc3RkOjpzaWduO1xcXFxuZHkgPSBkeSArIHBhcmFtICogc3RkOjpzaWduO319fX1cXFxcbnJldHVybiB2ZWMyPGYzMj4oZHgsIGR5KTt9XFxcXG5mbiBjYWxjR3Jhdml0eShjdXJyZW50Tm9kZSA6IHZlYzQ8ZjMyPiwgbm9kZUF0dHJpYnV0ZXMgOiB2ZWM0PGYzMj4pIC0+IHZlYzI8ZjMyPiB7dmFyIGR4IDogZjMyID0gMC4wO1xcXFxudmFyIGR5IDogZjMyID0gMC4wO1xcXFxudmFyIHZ4IDogZjMyID0gY3VycmVudE5vZGUueCAtIGdXZWJHUFVVbmlmb3JtUGFyYW1zLnVfQ2VudGVyLng7XFxcXG52YXIgdnkgOiBmMzIgPSBjdXJyZW50Tm9kZS55IC0gZ1dlYkdQVVVuaWZvcm1QYXJhbXMudV9DZW50ZXIueTtcXFxcbnZhciBnZiA6IGYzMiA9ICgwLjAxICogZ1dlYkdQVVVuaWZvcm1QYXJhbXMudV9LKSAqIGdXZWJHUFVVbmlmb3JtUGFyYW1zLnVfR3Jhdml0eTtcXFxcbmR4ID0gZ2YgKiB2eDtcXFxcbmR5ID0gZ2YgKiB2eTtcXFxcbmlmIChnV2ViR1BVVW5pZm9ybVBhcmFtcy51X0NsdXN0ZXJpbmcgPT0gMS4wKSB7dmFyIGNsdXN0ZXJJZHggOiBpMzIgPSBpMzIobm9kZUF0dHJpYnV0ZXMueCk7XFxcXG52YXIgY2VudGVyIDogdmVjNDxmMzI+ID0gZ1dlYkdQVUJ1ZmZlcjIudV9DbHVzdGVyQ2VudGVyc1tjbHVzdGVySWR4XTtcXFxcbnZhciBjdnggOiBmMzIgPSBjdXJyZW50Tm9kZS54IC0gY2VudGVyLng7XFxcXG52YXIgY3Z5IDogZjMyID0gY3VycmVudE5vZGUueSAtIGNlbnRlci55O1xcXFxudmFyIGRpc3QgOiBmMzIgPSBzdGQ6OnNxcnQoKGN2eCAqIGN2eCkgKyAoY3Z5ICogY3Z5KSkgKyAwLjAxO1xcXFxudmFyIHBhcm1hIDogZjMyID0gKGdXZWJHUFVVbmlmb3JtUGFyYW1zLnVfSyAqIGdXZWJHUFVVbmlmb3JtUGFyYW1zLnVfQ2x1c3RlckdyYXZpdHkpIC8gZGlzdDtcXFxcbmR4ID0gZHggKyBwYXJtYSAqIGN2eDtcXFxcbmR5ID0gZHkgKyBwYXJtYSAqIGN2eTt9XFxcXG5yZXR1cm4gdmVjMjxmMzI+KGR4LCBkeSk7fVxcXFxuZm4gY2FsY0F0dHJhY3RpdmUoaSA6IGkzMiwgY3VycmVudE5vZGUgOiB2ZWM0PGYzMj4pIC0+IHZlYzI8ZjMyPiB7dmFyIGR4IDogZjMyID0gMC4wO1xcXFxudmFyIGR5IDogZjMyID0gMC4wO1xcXFxudmFyIGFycl9vZmZzZXQgOiBpMzIgPSBpMzIoc3RkOjpmbG9vcihjdXJyZW50Tm9kZS56ICsgMC41KSk7XFxcXG52YXIgbGVuZ3RoIDogaTMyID0gaTMyKHN0ZDo6Zmxvb3IoY3VycmVudE5vZGUudyArIDAuNSkpO1xcXFxudmFyIG5vZGVfYnVmZmVyIDogdmVjNDxmMzI+O1xcXFxuZm9yICh2YXIgcCA6IGkzMiA9IDA7IHAgPCBfX0RlZmluZVZhbHVlUGxhY2Vob2xkZXJfX01BWF9FREdFX1BFUl9WRVJURVg7IHAgPSBwICsgMSkge2lmIChwID49IGxlbmd0aCkge2JyZWFrO31cXFxcbnZhciBhcnJfaWR4IDogaTMyID0gYXJyX29mZnNldCArIGkzMihwKTtcXFxcbnZhciBidWZfb2Zmc2V0IDogaTMyID0gYXJyX2lkeCAtICgoYXJyX2lkeCAvIDQpICogNCk7XFxcXG5pZiAoKHAgPT0gMCkgfHwgKGJ1Zl9vZmZzZXQgPT0gMCkpIHtub2RlX2J1ZmZlciA9IGdXZWJHUFVCdWZmZXIwLnVfRGF0YVtpMzIoYXJyX2lkeCAvIDQpXTt9XFxcXG52YXIgZmxvYXRfaiA6IGYzMiA9IHNlbGVjdChub2RlX2J1ZmZlci54LCBzZWxlY3Qobm9kZV9idWZmZXIueSwgc2VsZWN0KG5vZGVfYnVmZmVyLnosIG5vZGVfYnVmZmVyLncsIGJ1Zl9vZmZzZXQgPT0gMiksIGJ1Zl9vZmZzZXQgPT0gMSksIGJ1Zl9vZmZzZXQgPT0gMCk7XFxcXG52YXIgbmV4dE5vZGUgOiB2ZWM0PGYzMj4gPSBnV2ViR1BVQnVmZmVyMC51X0RhdGFbaTMyKGZsb2F0X2opXTtcXFxcbnZhciB4RGlzdCA6IGYzMiA9IGN1cnJlbnROb2RlLnggLSBuZXh0Tm9kZS54O1xcXFxudmFyIHlEaXN0IDogZjMyID0gY3VycmVudE5vZGUueSAtIG5leHROb2RlLnk7XFxcXG52YXIgZGlzdCA6IGYzMiA9IHN0ZDo6c3FydCgoeERpc3QgKiB4RGlzdCkgKyAoeURpc3QgKiB5RGlzdCkpICsgMC4wMTtcXFxcbnZhciBhdHRyYWN0aXZlRiA6IGYzMiA9IGRpc3QgLyBnV2ViR1BVVW5pZm9ybVBhcmFtcy51X0s7XFxcXG5pZiAoZGlzdCA+IDAuMCkge2R4ID0gZHggLSB4RGlzdCAqIGF0dHJhY3RpdmVGO1xcXFxuZHkgPSBkeSAtIHlEaXN0ICogYXR0cmFjdGl2ZUY7XFxcXG5pZiAoKHhEaXN0ID09IDAuMCkgJiYgKHlEaXN0ID09IDAuMCkpIHt2YXIgc2lnbiA6IGYzMiA9IHNlbGVjdCgxLjAsIC0xLjAsIGkgPCBpMzIoZmxvYXRfaikpO1xcXFxuZHggPSBkeCAtIHN0ZDo6c2lnbiAqIGF0dHJhY3RpdmVGO1xcXFxuZHkgPSBkeSAtIHN0ZDo6c2lnbiAqIGF0dHJhY3RpdmVGO319fVxcXFxucmV0dXJuIHZlYzI8ZjMyPihkeCwgZHkpO31cXFxcbmZuIG1haW4oKSAtPiB2b2lkIHt2YXIgaSA6IGkzMiA9IGdsb2JhbEludm9jYXRpb25JRC54O1xcXFxudmFyIGN1cnJlbnROb2RlIDogdmVjNDxmMzI+ID0gZ1dlYkdQVUJ1ZmZlcjAudV9EYXRhW2ldO1xcXFxudmFyIGR4IDogZjMyID0gMC4wO1xcXFxudmFyIGR5IDogZjMyID0gMC4wO1xcXFxuaWYgKGkgPj0gX19EZWZpbmVWYWx1ZVBsYWNlaG9sZGVyX19WRVJURVhfQ09VTlQpIHtnV2ViR1BVQnVmZmVyMC51X0RhdGFbaV0gPSBjdXJyZW50Tm9kZTtcXFxcbnJldHVybiA7fVxcXFxudmFyIG5vZGVBdHRyaWJ1dGVzIDogdmVjNDxmMzI+ID0gZ1dlYkdQVUJ1ZmZlcjEudV9BdHRyaWJ1dGVBcnJheVtpXTtcXFxcbmlmICgobm9kZUF0dHJpYnV0ZXMueSAhPSAwLjApICYmIChub2RlQXR0cmlidXRlcy56ICE9IDAuMCkpIHtnV2ViR1BVQnVmZmVyMC51X0RhdGFbaV0gPSB2ZWM0PGYzMj4obm9kZUF0dHJpYnV0ZXMueSwgbm9kZUF0dHJpYnV0ZXMueiwgY3VycmVudE5vZGUueiwgY3VycmVudE5vZGUudyk7XFxcXG5yZXR1cm4gO31cXFxcbnZhciByZXB1bHNpdmUgOiB2ZWMyPGYzMj4gPSBjYWxjUmVwdWxzaXZlKGksIGN1cnJlbnROb2RlKTtcXFxcbmR4ID0gZHggKyByZXB1bHNpdmUueDtcXFxcbmR5ID0gZHkgKyByZXB1bHNpdmUueTtcXFxcbnZhciBhdHRyYWN0aXZlIDogdmVjMjxmMzI+ID0gY2FsY0F0dHJhY3RpdmUoaSwgY3VycmVudE5vZGUpO1xcXFxuZHggPSBkeCArIGF0dHJhY3RpdmUueDtcXFxcbmR5ID0gZHkgKyBhdHRyYWN0aXZlLnk7XFxcXG52YXIgZ3Jhdml0eSA6IHZlYzI8ZjMyPiA9IGNhbGNHcmF2aXR5KGN1cnJlbnROb2RlLCBub2RlQXR0cmlidXRlcyk7XFxcXG5keCA9IGR4IC0gZ3Jhdml0eS54O1xcXFxuZHkgPSBkeSAtIGdyYXZpdHkueTtcXFxcbmR4ID0gZHggKiBnV2ViR1BVVW5pZm9ybVBhcmFtcy51X1NwZWVkO1xcXFxuZHkgPSBkeSAqIGdXZWJHUFVVbmlmb3JtUGFyYW1zLnVfU3BlZWQ7XFxcXG52YXIgZGlzdExlbmd0aCA6IGYzMiA9IHN0ZDo6c3FydCgoZHggKiBkeCkgKyAoZHkgKiBkeSkpO1xcXFxuaWYgKGRpc3RMZW5ndGggPiAwLjApIHt2YXIgbGltaXRlZERpc3QgOiBmMzIgPSBzdGQ6Om1pbihnV2ViR1BVVW5pZm9ybVBhcmFtcy51X01heERpc3BsYWNlICogZ1dlYkdQVVVuaWZvcm1QYXJhbXMudV9TcGVlZCwgZGlzdExlbmd0aCk7XFxcXG5nV2ViR1BVQnVmZmVyMC51X0RhdGFbaV0gPSB2ZWM0PGYzMj4oY3VycmVudE5vZGUueCArICgoZHggLyBkaXN0TGVuZ3RoKSAqIGxpbWl0ZWREaXN0KSwgY3VycmVudE5vZGUueSArICgoZHkgLyBkaXN0TGVuZ3RoKSAqIGxpbWl0ZWREaXN0KSwgY3VycmVudE5vZGUueiwgY3VycmVudE5vZGUudyk7fVxcXFxucmV0dXJuO31cXFxcblxcXFxuZW50cnlfcG9pbnQgY29tcHV0ZSBhcyBcXFxcXCJtYWluXFxcXFwiID0gbWFpbjtcXFxcblwiLFwiR0xTTDQ1MFwiOlwiXFxcXG5cXFxcblxcXFxuYm9vbCBnV2ViR1BVRGVidWcgPSBmYWxzZTtcXFxcbnZlYzQgZ1dlYkdQVURlYnVnT3V0cHV0ID0gdmVjNCgwLjApO1xcXFxuXFxcXG5pdmVjMyBnbG9iYWxJbnZvY2F0aW9uSUQgPSBpdmVjMyhnbF9HbG9iYWxJbnZvY2F0aW9uSUQpO1xcXFxuaXZlYzMgd29ya0dyb3VwU2l6ZSA9IGl2ZWMzKDEsMSwxKTtcXFxcbml2ZWMzIHdvcmtHcm91cElEID0gaXZlYzMoZ2xfV29ya0dyb3VwSUQpO1xcXFxuaXZlYzMgbG9jYWxJbnZvY2F0aW9uSUQgPSBpdmVjMyhnbF9Mb2NhbEludm9jYXRpb25JRCk7XFxcXG5pdmVjMyBudW1Xb3JrR3JvdXBzID0gaXZlYzMoZ2xfTnVtV29ya0dyb3Vwcyk7XFxcXG5pbnQgbG9jYWxJbnZvY2F0aW9uSW5kZXggPSBpbnQoZ2xfTG9jYWxJbnZvY2F0aW9uSW5kZXgpO1xcXFxuXFxcXG5sYXlvdXQoc3RkMTQwLCBzZXQgPSAwLCBiaW5kaW5nID0gMCkgdW5pZm9ybSBHV2ViR1BVUGFyYW1zIHtcXFxcbiAgZmxvYXQgdV9LO1xcXFxuICBmbG9hdCB1X0syO1xcXFxuICB2ZWMyIHVfQ2VudGVyO1xcXFxuICBmbG9hdCB1X0dyYXZpdHk7XFxcXG4gIGZsb2F0IHVfQ2x1c3RlckdyYXZpdHk7XFxcXG4gIGZsb2F0IHVfU3BlZWQ7XFxcXG4gIGZsb2F0IHVfTWF4RGlzcGxhY2U7XFxcXG4gIGZsb2F0IHVfQ2x1c3RlcmluZztcXFxcbn0gZ1dlYkdQVVVuaWZvcm1QYXJhbXM7XFxcXG5sYXlvdXQoc3RkNDMwLCBzZXQgPSAwLCBiaW5kaW5nID0gMSkgYnVmZmVyICAgR1dlYkdQVUJ1ZmZlcjAge1xcXFxuICB2ZWM0IHVfRGF0YVtdO1xcXFxufSBnV2ViR1BVQnVmZmVyMDtcXFxcblxcXFxubGF5b3V0KHN0ZDQzMCwgc2V0ID0gMCwgYmluZGluZyA9IDIpIGJ1ZmZlciByZWFkb25seSAgR1dlYkdQVUJ1ZmZlcjEge1xcXFxuICB2ZWM0IHVfQXR0cmlidXRlQXJyYXlbXTtcXFxcbn0gZ1dlYkdQVUJ1ZmZlcjE7XFxcXG5cXFxcbmxheW91dChzdGQ0MzAsIHNldCA9IDAsIGJpbmRpbmcgPSAzKSBidWZmZXIgcmVhZG9ubHkgIEdXZWJHUFVCdWZmZXIyIHtcXFxcbiAgdmVjNCB1X0NsdXN0ZXJDZW50ZXJzW107XFxcXG59IGdXZWJHUFVCdWZmZXIyO1xcXFxuXFxcXG5cXFxcblxcXFxuI2RlZmluZSBNQVhfRURHRV9QRVJfVkVSVEVYIF9fRGVmaW5lVmFsdWVQbGFjZWhvbGRlcl9fTUFYX0VER0VfUEVSX1ZFUlRFWFxcXFxuI2RlZmluZSBWRVJURVhfQ09VTlQgX19EZWZpbmVWYWx1ZVBsYWNlaG9sZGVyX19WRVJURVhfQ09VTlRcXFxcbmxheW91dCAoXFxcXG4gIGxvY2FsX3NpemVfeCA9IDEsXFxcXG4gIGxvY2FsX3NpemVfeSA9IDEsXFxcXG4gIGxvY2FsX3NpemVfeiA9IDFcXFxcbikgaW47XFxcXG5cXFxcblxcXFxuXFxcXG5cXFxcblxcXFxuXFxcXG5cXFxcblxcXFxuXFxcXG5cXFxcblxcXFxudmVjMiBjYWxjUmVwdWxzaXZlKGludCBpLCB2ZWM0IGN1cnJlbnROb2RlKSB7ZmxvYXQgZHggPSAwLjA7XFxcXG5mbG9hdCBkeSA9IDAuMDtcXFxcbmZvciAoaW50IGogPSAwOyBqIDwgVkVSVEVYX0NPVU5UOyBqKyspIHtpZiAoaSAhPSBqKSB7dmVjNCBuZXh0Tm9kZSA9IGdXZWJHUFVCdWZmZXIwLnVfRGF0YVtqXTtcXFxcbmZsb2F0IHhEaXN0ID0gY3VycmVudE5vZGUueCAtIG5leHROb2RlLng7XFxcXG5mbG9hdCB5RGlzdCA9IGN1cnJlbnROb2RlLnkgLSBuZXh0Tm9kZS55O1xcXFxuZmxvYXQgZGlzdCA9ICgoeERpc3QgKiB4RGlzdCkgKyAoeURpc3QgKiB5RGlzdCkpICsgMC4wMTtcXFxcbmZsb2F0IHBhcmFtID0gZ1dlYkdQVVVuaWZvcm1QYXJhbXMudV9LMiAvIGRpc3Q7XFxcXG5pZiAoZGlzdCA+IDAuMCkge2R4ICs9IHBhcmFtICogeERpc3Q7XFxcXG5keSArPSBwYXJhbSAqIHlEaXN0O1xcXFxuaWYgKCh4RGlzdCA9PSAwLjApICYmICh5RGlzdCA9PSAwLjApKSB7ZmxvYXQgc2lnbiA9IChpIDwgaikgPyAoMS4wKSA6ICgtMS4wKTtcXFxcbmR4ICs9IHBhcmFtICogc2lnbjtcXFxcbmR5ICs9IHBhcmFtICogc2lnbjt9fX19XFxcXG5yZXR1cm4gdmVjMihkeCwgZHkpO31cXFxcbnZlYzIgY2FsY0dyYXZpdHkodmVjNCBjdXJyZW50Tm9kZSwgdmVjNCBub2RlQXR0cmlidXRlcykge2Zsb2F0IGR4ID0gMC4wO1xcXFxuZmxvYXQgZHkgPSAwLjA7XFxcXG5mbG9hdCB2eCA9IGN1cnJlbnROb2RlLnggLSBnV2ViR1BVVW5pZm9ybVBhcmFtcy51X0NlbnRlci54O1xcXFxuZmxvYXQgdnkgPSBjdXJyZW50Tm9kZS55IC0gZ1dlYkdQVVVuaWZvcm1QYXJhbXMudV9DZW50ZXIueTtcXFxcbmZsb2F0IGdmID0gKDAuMDEgKiBnV2ViR1BVVW5pZm9ybVBhcmFtcy51X0spICogZ1dlYkdQVVVuaWZvcm1QYXJhbXMudV9HcmF2aXR5O1xcXFxuZHggPSBnZiAqIHZ4O1xcXFxuZHkgPSBnZiAqIHZ5O1xcXFxuaWYgKGdXZWJHUFVVbmlmb3JtUGFyYW1zLnVfQ2x1c3RlcmluZyA9PSAxLjApIHtpbnQgY2x1c3RlcklkeCA9IGludChub2RlQXR0cmlidXRlcy54KTtcXFxcbnZlYzQgY2VudGVyID0gZ1dlYkdQVUJ1ZmZlcjIudV9DbHVzdGVyQ2VudGVyc1tjbHVzdGVySWR4XTtcXFxcbmZsb2F0IGN2eCA9IGN1cnJlbnROb2RlLnggLSBjZW50ZXIueDtcXFxcbmZsb2F0IGN2eSA9IGN1cnJlbnROb2RlLnkgLSBjZW50ZXIueTtcXFxcbmZsb2F0IGRpc3QgPSBzcXJ0KChjdnggKiBjdngpICsgKGN2eSAqIGN2eSkpICsgMC4wMTtcXFxcbmZsb2F0IHBhcm1hID0gKGdXZWJHUFVVbmlmb3JtUGFyYW1zLnVfSyAqIGdXZWJHUFVVbmlmb3JtUGFyYW1zLnVfQ2x1c3RlckdyYXZpdHkpIC8gZGlzdDtcXFxcbmR4ICs9IHBhcm1hICogY3Z4O1xcXFxuZHkgKz0gcGFybWEgKiBjdnk7fVxcXFxucmV0dXJuIHZlYzIoZHgsIGR5KTt9XFxcXG52ZWMyIGNhbGNBdHRyYWN0aXZlKGludCBpLCB2ZWM0IGN1cnJlbnROb2RlKSB7ZmxvYXQgZHggPSAwLjA7XFxcXG5mbG9hdCBkeSA9IDAuMDtcXFxcbmludCBhcnJfb2Zmc2V0ID0gaW50KGZsb29yKGN1cnJlbnROb2RlLnogKyAwLjUpKTtcXFxcbmludCBsZW5ndGggPSBpbnQoZmxvb3IoY3VycmVudE5vZGUudyArIDAuNSkpO1xcXFxudmVjNCBub2RlX2J1ZmZlcjtcXFxcbmZvciAoaW50IHAgPSAwOyBwIDwgTUFYX0VER0VfUEVSX1ZFUlRFWDsgcCsrKSB7aWYgKHAgPj0gbGVuZ3RoKSB7YnJlYWs7fVxcXFxuaW50IGFycl9pZHggPSBhcnJfb2Zmc2V0ICsgaW50KHApO1xcXFxuaW50IGJ1Zl9vZmZzZXQgPSBhcnJfaWR4IC0gKChhcnJfaWR4IC8gNCkgKiA0KTtcXFxcbmlmICgocCA9PSAwKSB8fCAoYnVmX29mZnNldCA9PSAwKSkge25vZGVfYnVmZmVyID0gZ1dlYkdQVUJ1ZmZlcjAudV9EYXRhW2ludChhcnJfaWR4IC8gNCldO31cXFxcbmZsb2F0IGZsb2F0X2ogPSAoYnVmX29mZnNldCA9PSAwKSA/IChub2RlX2J1ZmZlci54KSA6ICgoYnVmX29mZnNldCA9PSAxKSA/IChub2RlX2J1ZmZlci55KSA6ICgoYnVmX29mZnNldCA9PSAyKSA/IChub2RlX2J1ZmZlci56KSA6IChub2RlX2J1ZmZlci53KSkpO1xcXFxudmVjNCBuZXh0Tm9kZSA9IGdXZWJHUFVCdWZmZXIwLnVfRGF0YVtpbnQoZmxvYXRfaildO1xcXFxuZmxvYXQgeERpc3QgPSBjdXJyZW50Tm9kZS54IC0gbmV4dE5vZGUueDtcXFxcbmZsb2F0IHlEaXN0ID0gY3VycmVudE5vZGUueSAtIG5leHROb2RlLnk7XFxcXG5mbG9hdCBkaXN0ID0gc3FydCgoeERpc3QgKiB4RGlzdCkgKyAoeURpc3QgKiB5RGlzdCkpICsgMC4wMTtcXFxcbmZsb2F0IGF0dHJhY3RpdmVGID0gZGlzdCAvIGdXZWJHUFVVbmlmb3JtUGFyYW1zLnVfSztcXFxcbmlmIChkaXN0ID4gMC4wKSB7ZHggLT0geERpc3QgKiBhdHRyYWN0aXZlRjtcXFxcbmR5IC09IHlEaXN0ICogYXR0cmFjdGl2ZUY7XFxcXG5pZiAoKHhEaXN0ID09IDAuMCkgJiYgKHlEaXN0ID09IDAuMCkpIHtmbG9hdCBzaWduID0gKGkgPCBpbnQoZmxvYXRfaikpID8gKDEuMCkgOiAoLTEuMCk7XFxcXG5keCAtPSBzaWduICogYXR0cmFjdGl2ZUY7XFxcXG5keSAtPSBzaWduICogYXR0cmFjdGl2ZUY7fX19XFxcXG5yZXR1cm4gdmVjMihkeCwgZHkpO31cXFxcbnZvaWQgbWFpbigpIHtpbnQgaSA9IGdsb2JhbEludm9jYXRpb25JRC54O1xcXFxudmVjNCBjdXJyZW50Tm9kZSA9IGdXZWJHUFVCdWZmZXIwLnVfRGF0YVtpXTtcXFxcbmZsb2F0IGR4ID0gMC4wO1xcXFxuZmxvYXQgZHkgPSAwLjA7XFxcXG5pZiAoaSA+PSBWRVJURVhfQ09VTlQpIHtnV2ViR1BVQnVmZmVyMC51X0RhdGFbaV0gPSBjdXJyZW50Tm9kZTtcXFxcbnJldHVybiA7fVxcXFxudmVjNCBub2RlQXR0cmlidXRlcyA9IGdXZWJHUFVCdWZmZXIxLnVfQXR0cmlidXRlQXJyYXlbaV07XFxcXG5pZiAoKG5vZGVBdHRyaWJ1dGVzLnkgIT0gMC4wKSAmJiAobm9kZUF0dHJpYnV0ZXMueiAhPSAwLjApKSB7Z1dlYkdQVUJ1ZmZlcjAudV9EYXRhW2ldID0gdmVjNChub2RlQXR0cmlidXRlcy55LCBub2RlQXR0cmlidXRlcy56LCBjdXJyZW50Tm9kZS56LCBjdXJyZW50Tm9kZS53KTtcXFxcbnJldHVybiA7fVxcXFxudmVjMiByZXB1bHNpdmUgPSBjYWxjUmVwdWxzaXZlKGksIGN1cnJlbnROb2RlKTtcXFxcbmR4ICs9IHJlcHVsc2l2ZS54O1xcXFxuZHkgKz0gcmVwdWxzaXZlLnk7XFxcXG52ZWMyIGF0dHJhY3RpdmUgPSBjYWxjQXR0cmFjdGl2ZShpLCBjdXJyZW50Tm9kZSk7XFxcXG5keCArPSBhdHRyYWN0aXZlLng7XFxcXG5keSArPSBhdHRyYWN0aXZlLnk7XFxcXG52ZWMyIGdyYXZpdHkgPSBjYWxjR3Jhdml0eShjdXJyZW50Tm9kZSwgbm9kZUF0dHJpYnV0ZXMpO1xcXFxuZHggLT0gZ3Jhdml0eS54O1xcXFxuZHkgLT0gZ3Jhdml0eS55O1xcXFxuZHggKj0gZ1dlYkdQVVVuaWZvcm1QYXJhbXMudV9TcGVlZDtcXFxcbmR5ICo9IGdXZWJHUFVVbmlmb3JtUGFyYW1zLnVfU3BlZWQ7XFxcXG5mbG9hdCBkaXN0TGVuZ3RoID0gc3FydCgoZHggKiBkeCkgKyAoZHkgKiBkeSkpO1xcXFxuaWYgKGRpc3RMZW5ndGggPiAwLjApIHtmbG9hdCBsaW1pdGVkRGlzdCA9IG1pbihnV2ViR1BVVW5pZm9ybVBhcmFtcy51X01heERpc3BsYWNlICogZ1dlYkdQVVVuaWZvcm1QYXJhbXMudV9TcGVlZCwgZGlzdExlbmd0aCk7XFxcXG5nV2ViR1BVQnVmZmVyMC51X0RhdGFbaV0gPSB2ZWM0KGN1cnJlbnROb2RlLnggKyAoKGR4IC8gZGlzdExlbmd0aCkgKiBsaW1pdGVkRGlzdCksIGN1cnJlbnROb2RlLnkgKyAoKGR5IC8gZGlzdExlbmd0aCkgKiBsaW1pdGVkRGlzdCksIGN1cnJlbnROb2RlLnosIGN1cnJlbnROb2RlLncpO319XFxcXG5cIixcIkdMU0wxMDBcIjpcIlxcXFxuXFxcXG5mbG9hdCBlcHNpbG9uID0gMC4wMDAwMTtcXFxcbnZlYzIgYWRkclRyYW5zbGF0aW9uXzFEdG8yRChmbG9hdCBhZGRyZXNzMUQsIHZlYzIgdGV4U2l6ZSkge1xcXFxuICB2ZWMyIGNvbnZfY29uc3QgPSB2ZWMyKDEuMCAvIHRleFNpemUueCwgMS4wIC8gKHRleFNpemUueCAqIHRleFNpemUueSkpO1xcXFxuICB2ZWMyIG5vcm1BZGRyMkQgPSBmbG9hdChhZGRyZXNzMUQpICogY29udl9jb25zdDtcXFxcbiAgcmV0dXJuIHZlYzIoZnJhY3Qobm9ybUFkZHIyRC54ICsgZXBzaWxvbiksIG5vcm1BZGRyMkQueSk7XFxcXG59XFxcXG5cXFxcbnZvaWQgYmFycmllcigpIHt9XFxcXG4gIFxcXFxuXFxcXG51bmlmb3JtIHZlYzIgdV9PdXRwdXRUZXh0dXJlU2l6ZTtcXFxcbnVuaWZvcm0gaW50IHVfT3V0cHV0VGV4ZWxDb3VudDtcXFxcbnZhcnlpbmcgdmVjMiB2X1RleENvb3JkO1xcXFxuXFxcXG5ib29sIGdXZWJHUFVEZWJ1ZyA9IGZhbHNlO1xcXFxudmVjNCBnV2ViR1BVRGVidWdPdXRwdXQgPSB2ZWM0KDAuMCk7XFxcXG5cXFxcbiNkZWZpbmUgTUFYX0VER0VfUEVSX1ZFUlRFWCBfX0RlZmluZVZhbHVlUGxhY2Vob2xkZXJfX01BWF9FREdFX1BFUl9WRVJURVhcXFxcbiNkZWZpbmUgVkVSVEVYX0NPVU5UIF9fRGVmaW5lVmFsdWVQbGFjZWhvbGRlcl9fVkVSVEVYX0NPVU5UXFxcXG5cXFxcbnVuaWZvcm0gc2FtcGxlcjJEIHVfRGF0YTtcXFxcbnVuaWZvcm0gdmVjMiB1X0RhdGFTaXplO1xcXFxudmVjNCBnZXREYXRhdV9EYXRhKHZlYzIgYWRkcmVzczJEKSB7XFxcXG4gIHJldHVybiB2ZWM0KHRleHR1cmUyRCh1X0RhdGEsIGFkZHJlc3MyRCkucmdiYSk7XFxcXG59XFxcXG52ZWM0IGdldERhdGF1X0RhdGEoZmxvYXQgYWRkcmVzczFEKSB7XFxcXG4gIHJldHVybiBnZXREYXRhdV9EYXRhKGFkZHJUcmFuc2xhdGlvbl8xRHRvMkQoYWRkcmVzczFELCB1X0RhdGFTaXplKSk7XFxcXG59XFxcXG52ZWM0IGdldERhdGF1X0RhdGEoaW50IGFkZHJlc3MxRCkge1xcXFxuICByZXR1cm4gZ2V0RGF0YXVfRGF0YShmbG9hdChhZGRyZXNzMUQpKTtcXFxcbn1cXFxcbnVuaWZvcm0gZmxvYXQgdV9LO1xcXFxudW5pZm9ybSBmbG9hdCB1X0syO1xcXFxudW5pZm9ybSB2ZWMyIHVfQ2VudGVyO1xcXFxudW5pZm9ybSBmbG9hdCB1X0dyYXZpdHk7XFxcXG51bmlmb3JtIGZsb2F0IHVfQ2x1c3RlckdyYXZpdHk7XFxcXG51bmlmb3JtIGZsb2F0IHVfU3BlZWQ7XFxcXG51bmlmb3JtIGZsb2F0IHVfTWF4RGlzcGxhY2U7XFxcXG51bmlmb3JtIGZsb2F0IHVfQ2x1c3RlcmluZztcXFxcbnVuaWZvcm0gc2FtcGxlcjJEIHVfQXR0cmlidXRlQXJyYXk7XFxcXG51bmlmb3JtIHZlYzIgdV9BdHRyaWJ1dGVBcnJheVNpemU7XFxcXG52ZWM0IGdldERhdGF1X0F0dHJpYnV0ZUFycmF5KHZlYzIgYWRkcmVzczJEKSB7XFxcXG4gIHJldHVybiB2ZWM0KHRleHR1cmUyRCh1X0F0dHJpYnV0ZUFycmF5LCBhZGRyZXNzMkQpLnJnYmEpO1xcXFxufVxcXFxudmVjNCBnZXREYXRhdV9BdHRyaWJ1dGVBcnJheShmbG9hdCBhZGRyZXNzMUQpIHtcXFxcbiAgcmV0dXJuIGdldERhdGF1X0F0dHJpYnV0ZUFycmF5KGFkZHJUcmFuc2xhdGlvbl8xRHRvMkQoYWRkcmVzczFELCB1X0F0dHJpYnV0ZUFycmF5U2l6ZSkpO1xcXFxufVxcXFxudmVjNCBnZXREYXRhdV9BdHRyaWJ1dGVBcnJheShpbnQgYWRkcmVzczFEKSB7XFxcXG4gIHJldHVybiBnZXREYXRhdV9BdHRyaWJ1dGVBcnJheShmbG9hdChhZGRyZXNzMUQpKTtcXFxcbn1cXFxcbnVuaWZvcm0gc2FtcGxlcjJEIHVfQ2x1c3RlckNlbnRlcnM7XFxcXG51bmlmb3JtIHZlYzIgdV9DbHVzdGVyQ2VudGVyc1NpemU7XFxcXG52ZWM0IGdldERhdGF1X0NsdXN0ZXJDZW50ZXJzKHZlYzIgYWRkcmVzczJEKSB7XFxcXG4gIHJldHVybiB2ZWM0KHRleHR1cmUyRCh1X0NsdXN0ZXJDZW50ZXJzLCBhZGRyZXNzMkQpLnJnYmEpO1xcXFxufVxcXFxudmVjNCBnZXREYXRhdV9DbHVzdGVyQ2VudGVycyhmbG9hdCBhZGRyZXNzMUQpIHtcXFxcbiAgcmV0dXJuIGdldERhdGF1X0NsdXN0ZXJDZW50ZXJzKGFkZHJUcmFuc2xhdGlvbl8xRHRvMkQoYWRkcmVzczFELCB1X0NsdXN0ZXJDZW50ZXJzU2l6ZSkpO1xcXFxufVxcXFxudmVjNCBnZXREYXRhdV9DbHVzdGVyQ2VudGVycyhpbnQgYWRkcmVzczFEKSB7XFxcXG4gIHJldHVybiBnZXREYXRhdV9DbHVzdGVyQ2VudGVycyhmbG9hdChhZGRyZXNzMUQpKTtcXFxcbn1cXFxcbnZlYzIgY2FsY1JlcHVsc2l2ZShpbnQgaSwgdmVjNCBjdXJyZW50Tm9kZSkge1xcXFxuaXZlYzMgd29ya0dyb3VwU2l6ZSA9IGl2ZWMzKDEsIDEsIDEpO1xcXFxuaXZlYzMgbnVtV29ya0dyb3VwcyA9IGl2ZWMzKDEsIDEsIDEpOyAgICAgXFxcXG5pbnQgZ2xvYmFsSW52b2NhdGlvbkluZGV4ID0gaW50KGZsb29yKHZfVGV4Q29vcmQueCAqIHVfT3V0cHV0VGV4dHVyZVNpemUueCkpXFxcXG4gICsgaW50KGZsb29yKHZfVGV4Q29vcmQueSAqIHVfT3V0cHV0VGV4dHVyZVNpemUueSkpICogaW50KHVfT3V0cHV0VGV4dHVyZVNpemUueCk7XFxcXG5pbnQgd29ya0dyb3VwSURMZW5ndGggPSBnbG9iYWxJbnZvY2F0aW9uSW5kZXggLyAod29ya0dyb3VwU2l6ZS54ICogd29ya0dyb3VwU2l6ZS55ICogd29ya0dyb3VwU2l6ZS56KTtcXFxcbml2ZWMzIHdvcmtHcm91cElEID0gaXZlYzMod29ya0dyb3VwSURMZW5ndGggLyBudW1Xb3JrR3JvdXBzLnkgLyBudW1Xb3JrR3JvdXBzLnosIHdvcmtHcm91cElETGVuZ3RoIC8gbnVtV29ya0dyb3Vwcy54IC8gbnVtV29ya0dyb3Vwcy56LCB3b3JrR3JvdXBJRExlbmd0aCAvIG51bVdvcmtHcm91cHMueCAvIG51bVdvcmtHcm91cHMueSk7XFxcXG5pbnQgbG9jYWxJbnZvY2F0aW9uSURaID0gZ2xvYmFsSW52b2NhdGlvbkluZGV4IC8gKHdvcmtHcm91cFNpemUueCAqIHdvcmtHcm91cFNpemUueSk7XFxcXG5pbnQgbG9jYWxJbnZvY2F0aW9uSURZID0gKGdsb2JhbEludm9jYXRpb25JbmRleCAtIGxvY2FsSW52b2NhdGlvbklEWiAqIHdvcmtHcm91cFNpemUueCAqIHdvcmtHcm91cFNpemUueSkgLyB3b3JrR3JvdXBTaXplLng7XFxcXG5pbnQgbG9jYWxJbnZvY2F0aW9uSURYID0gZ2xvYmFsSW52b2NhdGlvbkluZGV4IC0gbG9jYWxJbnZvY2F0aW9uSURaICogd29ya0dyb3VwU2l6ZS54ICogd29ya0dyb3VwU2l6ZS55IC0gbG9jYWxJbnZvY2F0aW9uSURZICogd29ya0dyb3VwU2l6ZS54O1xcXFxuaXZlYzMgbG9jYWxJbnZvY2F0aW9uSUQgPSBpdmVjMyhsb2NhbEludm9jYXRpb25JRFgsIGxvY2FsSW52b2NhdGlvbklEWSwgbG9jYWxJbnZvY2F0aW9uSURaKTtcXFxcbml2ZWMzIGdsb2JhbEludm9jYXRpb25JRCA9IHdvcmtHcm91cElEICogd29ya0dyb3VwU2l6ZSArIGxvY2FsSW52b2NhdGlvbklEO1xcXFxuaW50IGxvY2FsSW52b2NhdGlvbkluZGV4ID0gbG9jYWxJbnZvY2F0aW9uSUQueiAqIHdvcmtHcm91cFNpemUueCAqIHdvcmtHcm91cFNpemUueVxcXFxuICAgICAgICAgICAgICAgICsgbG9jYWxJbnZvY2F0aW9uSUQueSAqIHdvcmtHcm91cFNpemUueCArIGxvY2FsSW52b2NhdGlvbklELng7XFxcXG5mbG9hdCBkeCA9IDAuMDtcXFxcbmZsb2F0IGR5ID0gMC4wO1xcXFxuZm9yIChpbnQgaiA9IDA7IGogPCBWRVJURVhfQ09VTlQ7IGorKykge2lmIChpICE9IGopIHt2ZWM0IG5leHROb2RlID0gZ2V0RGF0YXVfRGF0YShqKTtcXFxcbmZsb2F0IHhEaXN0ID0gY3VycmVudE5vZGUueCAtIG5leHROb2RlLng7XFxcXG5mbG9hdCB5RGlzdCA9IGN1cnJlbnROb2RlLnkgLSBuZXh0Tm9kZS55O1xcXFxuZmxvYXQgZGlzdCA9ICgoeERpc3QgKiB4RGlzdCkgKyAoeURpc3QgKiB5RGlzdCkpICsgMC4wMTtcXFxcbmZsb2F0IHBhcmFtID0gdV9LMiAvIGRpc3Q7XFxcXG5pZiAoZGlzdCA+IDAuMCkge2R4ICs9IHBhcmFtICogeERpc3Q7XFxcXG5keSArPSBwYXJhbSAqIHlEaXN0O1xcXFxuaWYgKCh4RGlzdCA9PSAwLjApICYmICh5RGlzdCA9PSAwLjApKSB7ZmxvYXQgc2lnbiA9IChpIDwgaikgPyAoMS4wKSA6ICgtMS4wKTtcXFxcbmR4ICs9IHBhcmFtICogc2lnbjtcXFxcbmR5ICs9IHBhcmFtICogc2lnbjt9fX19XFxcXG5yZXR1cm4gdmVjMihkeCwgZHkpO31cXFxcbnZlYzIgY2FsY0dyYXZpdHkodmVjNCBjdXJyZW50Tm9kZSwgdmVjNCBub2RlQXR0cmlidXRlcykge1xcXFxuaXZlYzMgd29ya0dyb3VwU2l6ZSA9IGl2ZWMzKDEsIDEsIDEpO1xcXFxuaXZlYzMgbnVtV29ya0dyb3VwcyA9IGl2ZWMzKDEsIDEsIDEpOyAgICAgXFxcXG5pbnQgZ2xvYmFsSW52b2NhdGlvbkluZGV4ID0gaW50KGZsb29yKHZfVGV4Q29vcmQueCAqIHVfT3V0cHV0VGV4dHVyZVNpemUueCkpXFxcXG4gICsgaW50KGZsb29yKHZfVGV4Q29vcmQueSAqIHVfT3V0cHV0VGV4dHVyZVNpemUueSkpICogaW50KHVfT3V0cHV0VGV4dHVyZVNpemUueCk7XFxcXG5pbnQgd29ya0dyb3VwSURMZW5ndGggPSBnbG9iYWxJbnZvY2F0aW9uSW5kZXggLyAod29ya0dyb3VwU2l6ZS54ICogd29ya0dyb3VwU2l6ZS55ICogd29ya0dyb3VwU2l6ZS56KTtcXFxcbml2ZWMzIHdvcmtHcm91cElEID0gaXZlYzMod29ya0dyb3VwSURMZW5ndGggLyBudW1Xb3JrR3JvdXBzLnkgLyBudW1Xb3JrR3JvdXBzLnosIHdvcmtHcm91cElETGVuZ3RoIC8gbnVtV29ya0dyb3Vwcy54IC8gbnVtV29ya0dyb3Vwcy56LCB3b3JrR3JvdXBJRExlbmd0aCAvIG51bVdvcmtHcm91cHMueCAvIG51bVdvcmtHcm91cHMueSk7XFxcXG5pbnQgbG9jYWxJbnZvY2F0aW9uSURaID0gZ2xvYmFsSW52b2NhdGlvbkluZGV4IC8gKHdvcmtHcm91cFNpemUueCAqIHdvcmtHcm91cFNpemUueSk7XFxcXG5pbnQgbG9jYWxJbnZvY2F0aW9uSURZID0gKGdsb2JhbEludm9jYXRpb25JbmRleCAtIGxvY2FsSW52b2NhdGlvbklEWiAqIHdvcmtHcm91cFNpemUueCAqIHdvcmtHcm91cFNpemUueSkgLyB3b3JrR3JvdXBTaXplLng7XFxcXG5pbnQgbG9jYWxJbnZvY2F0aW9uSURYID0gZ2xvYmFsSW52b2NhdGlvbkluZGV4IC0gbG9jYWxJbnZvY2F0aW9uSURaICogd29ya0dyb3VwU2l6ZS54ICogd29ya0dyb3VwU2l6ZS55IC0gbG9jYWxJbnZvY2F0aW9uSURZICogd29ya0dyb3VwU2l6ZS54O1xcXFxuaXZlYzMgbG9jYWxJbnZvY2F0aW9uSUQgPSBpdmVjMyhsb2NhbEludm9jYXRpb25JRFgsIGxvY2FsSW52b2NhdGlvbklEWSwgbG9jYWxJbnZvY2F0aW9uSURaKTtcXFxcbml2ZWMzIGdsb2JhbEludm9jYXRpb25JRCA9IHdvcmtHcm91cElEICogd29ya0dyb3VwU2l6ZSArIGxvY2FsSW52b2NhdGlvbklEO1xcXFxuaW50IGxvY2FsSW52b2NhdGlvbkluZGV4ID0gbG9jYWxJbnZvY2F0aW9uSUQueiAqIHdvcmtHcm91cFNpemUueCAqIHdvcmtHcm91cFNpemUueVxcXFxuICAgICAgICAgICAgICAgICsgbG9jYWxJbnZvY2F0aW9uSUQueSAqIHdvcmtHcm91cFNpemUueCArIGxvY2FsSW52b2NhdGlvbklELng7XFxcXG5mbG9hdCBkeCA9IDAuMDtcXFxcbmZsb2F0IGR5ID0gMC4wO1xcXFxuZmxvYXQgdnggPSBjdXJyZW50Tm9kZS54IC0gdV9DZW50ZXIueDtcXFxcbmZsb2F0IHZ5ID0gY3VycmVudE5vZGUueSAtIHVfQ2VudGVyLnk7XFxcXG5mbG9hdCBnZiA9ICgwLjAxICogdV9LKSAqIHVfR3Jhdml0eTtcXFxcbmR4ID0gZ2YgKiB2eDtcXFxcbmR5ID0gZ2YgKiB2eTtcXFxcbmlmICh1X0NsdXN0ZXJpbmcgPT0gMS4wKSB7aW50IGNsdXN0ZXJJZHggPSBpbnQobm9kZUF0dHJpYnV0ZXMueCk7XFxcXG52ZWM0IGNlbnRlciA9IGdldERhdGF1X0NsdXN0ZXJDZW50ZXJzKGNsdXN0ZXJJZHgpO1xcXFxuZmxvYXQgY3Z4ID0gY3VycmVudE5vZGUueCAtIGNlbnRlci54O1xcXFxuZmxvYXQgY3Z5ID0gY3VycmVudE5vZGUueSAtIGNlbnRlci55O1xcXFxuZmxvYXQgZGlzdCA9IHNxcnQoKGN2eCAqIGN2eCkgKyAoY3Z5ICogY3Z5KSkgKyAwLjAxO1xcXFxuZmxvYXQgcGFybWEgPSAodV9LICogdV9DbHVzdGVyR3Jhdml0eSkgLyBkaXN0O1xcXFxuZHggKz0gcGFybWEgKiBjdng7XFxcXG5keSArPSBwYXJtYSAqIGN2eTt9XFxcXG5yZXR1cm4gdmVjMihkeCwgZHkpO31cXFxcbnZlYzIgY2FsY0F0dHJhY3RpdmUoaW50IGksIHZlYzQgY3VycmVudE5vZGUpIHtcXFxcbml2ZWMzIHdvcmtHcm91cFNpemUgPSBpdmVjMygxLCAxLCAxKTtcXFxcbml2ZWMzIG51bVdvcmtHcm91cHMgPSBpdmVjMygxLCAxLCAxKTsgICAgIFxcXFxuaW50IGdsb2JhbEludm9jYXRpb25JbmRleCA9IGludChmbG9vcih2X1RleENvb3JkLnggKiB1X091dHB1dFRleHR1cmVTaXplLngpKVxcXFxuICArIGludChmbG9vcih2X1RleENvb3JkLnkgKiB1X091dHB1dFRleHR1cmVTaXplLnkpKSAqIGludCh1X091dHB1dFRleHR1cmVTaXplLngpO1xcXFxuaW50IHdvcmtHcm91cElETGVuZ3RoID0gZ2xvYmFsSW52b2NhdGlvbkluZGV4IC8gKHdvcmtHcm91cFNpemUueCAqIHdvcmtHcm91cFNpemUueSAqIHdvcmtHcm91cFNpemUueik7XFxcXG5pdmVjMyB3b3JrR3JvdXBJRCA9IGl2ZWMzKHdvcmtHcm91cElETGVuZ3RoIC8gbnVtV29ya0dyb3Vwcy55IC8gbnVtV29ya0dyb3Vwcy56LCB3b3JrR3JvdXBJRExlbmd0aCAvIG51bVdvcmtHcm91cHMueCAvIG51bVdvcmtHcm91cHMueiwgd29ya0dyb3VwSURMZW5ndGggLyBudW1Xb3JrR3JvdXBzLnggLyBudW1Xb3JrR3JvdXBzLnkpO1xcXFxuaW50IGxvY2FsSW52b2NhdGlvbklEWiA9IGdsb2JhbEludm9jYXRpb25JbmRleCAvICh3b3JrR3JvdXBTaXplLnggKiB3b3JrR3JvdXBTaXplLnkpO1xcXFxuaW50IGxvY2FsSW52b2NhdGlvbklEWSA9IChnbG9iYWxJbnZvY2F0aW9uSW5kZXggLSBsb2NhbEludm9jYXRpb25JRFogKiB3b3JrR3JvdXBTaXplLnggKiB3b3JrR3JvdXBTaXplLnkpIC8gd29ya0dyb3VwU2l6ZS54O1xcXFxuaW50IGxvY2FsSW52b2NhdGlvbklEWCA9IGdsb2JhbEludm9jYXRpb25JbmRleCAtIGxvY2FsSW52b2NhdGlvbklEWiAqIHdvcmtHcm91cFNpemUueCAqIHdvcmtHcm91cFNpemUueSAtIGxvY2FsSW52b2NhdGlvbklEWSAqIHdvcmtHcm91cFNpemUueDtcXFxcbml2ZWMzIGxvY2FsSW52b2NhdGlvbklEID0gaXZlYzMobG9jYWxJbnZvY2F0aW9uSURYLCBsb2NhbEludm9jYXRpb25JRFksIGxvY2FsSW52b2NhdGlvbklEWik7XFxcXG5pdmVjMyBnbG9iYWxJbnZvY2F0aW9uSUQgPSB3b3JrR3JvdXBJRCAqIHdvcmtHcm91cFNpemUgKyBsb2NhbEludm9jYXRpb25JRDtcXFxcbmludCBsb2NhbEludm9jYXRpb25JbmRleCA9IGxvY2FsSW52b2NhdGlvbklELnogKiB3b3JrR3JvdXBTaXplLnggKiB3b3JrR3JvdXBTaXplLnlcXFxcbiAgICAgICAgICAgICAgICArIGxvY2FsSW52b2NhdGlvbklELnkgKiB3b3JrR3JvdXBTaXplLnggKyBsb2NhbEludm9jYXRpb25JRC54O1xcXFxuZmxvYXQgZHggPSAwLjA7XFxcXG5mbG9hdCBkeSA9IDAuMDtcXFxcbmludCBhcnJfb2Zmc2V0ID0gaW50KGZsb29yKGN1cnJlbnROb2RlLnogKyAwLjUpKTtcXFxcbmludCBsZW5ndGggPSBpbnQoZmxvb3IoY3VycmVudE5vZGUudyArIDAuNSkpO1xcXFxudmVjNCBub2RlX2J1ZmZlcjtcXFxcbmZvciAoaW50IHAgPSAwOyBwIDwgTUFYX0VER0VfUEVSX1ZFUlRFWDsgcCsrKSB7aWYgKHAgPj0gbGVuZ3RoKSB7YnJlYWs7fVxcXFxuaW50IGFycl9pZHggPSBhcnJfb2Zmc2V0ICsgaW50KHApO1xcXFxuaW50IGJ1Zl9vZmZzZXQgPSBhcnJfaWR4IC0gKChhcnJfaWR4IC8gNCkgKiA0KTtcXFxcbmlmICgocCA9PSAwKSB8fCAoYnVmX29mZnNldCA9PSAwKSkge25vZGVfYnVmZmVyID0gZ2V0RGF0YXVfRGF0YShpbnQoYXJyX2lkeCAvIDQpKTt9XFxcXG5mbG9hdCBmbG9hdF9qID0gKGJ1Zl9vZmZzZXQgPT0gMCkgPyAobm9kZV9idWZmZXIueCkgOiAoKGJ1Zl9vZmZzZXQgPT0gMSkgPyAobm9kZV9idWZmZXIueSkgOiAoKGJ1Zl9vZmZzZXQgPT0gMikgPyAobm9kZV9idWZmZXIueikgOiAobm9kZV9idWZmZXIudykpKTtcXFxcbnZlYzQgbmV4dE5vZGUgPSBnZXREYXRhdV9EYXRhKGludChmbG9hdF9qKSk7XFxcXG5mbG9hdCB4RGlzdCA9IGN1cnJlbnROb2RlLnggLSBuZXh0Tm9kZS54O1xcXFxuZmxvYXQgeURpc3QgPSBjdXJyZW50Tm9kZS55IC0gbmV4dE5vZGUueTtcXFxcbmZsb2F0IGRpc3QgPSBzcXJ0KCh4RGlzdCAqIHhEaXN0KSArICh5RGlzdCAqIHlEaXN0KSkgKyAwLjAxO1xcXFxuZmxvYXQgYXR0cmFjdGl2ZUYgPSBkaXN0IC8gdV9LO1xcXFxuaWYgKGRpc3QgPiAwLjApIHtkeCAtPSB4RGlzdCAqIGF0dHJhY3RpdmVGO1xcXFxuZHkgLT0geURpc3QgKiBhdHRyYWN0aXZlRjtcXFxcbmlmICgoeERpc3QgPT0gMC4wKSAmJiAoeURpc3QgPT0gMC4wKSkge2Zsb2F0IHNpZ24gPSAoaSA8IGludChmbG9hdF9qKSkgPyAoMS4wKSA6ICgtMS4wKTtcXFxcbmR4IC09IHNpZ24gKiBhdHRyYWN0aXZlRjtcXFxcbmR5IC09IHNpZ24gKiBhdHRyYWN0aXZlRjt9fX1cXFxcbnJldHVybiB2ZWMyKGR4LCBkeSk7fVxcXFxudm9pZCBtYWluKCkge1xcXFxuaXZlYzMgd29ya0dyb3VwU2l6ZSA9IGl2ZWMzKDEsIDEsIDEpO1xcXFxuaXZlYzMgbnVtV29ya0dyb3VwcyA9IGl2ZWMzKDEsIDEsIDEpOyAgICAgXFxcXG5pbnQgZ2xvYmFsSW52b2NhdGlvbkluZGV4ID0gaW50KGZsb29yKHZfVGV4Q29vcmQueCAqIHVfT3V0cHV0VGV4dHVyZVNpemUueCkpXFxcXG4gICsgaW50KGZsb29yKHZfVGV4Q29vcmQueSAqIHVfT3V0cHV0VGV4dHVyZVNpemUueSkpICogaW50KHVfT3V0cHV0VGV4dHVyZVNpemUueCk7XFxcXG5pbnQgd29ya0dyb3VwSURMZW5ndGggPSBnbG9iYWxJbnZvY2F0aW9uSW5kZXggLyAod29ya0dyb3VwU2l6ZS54ICogd29ya0dyb3VwU2l6ZS55ICogd29ya0dyb3VwU2l6ZS56KTtcXFxcbml2ZWMzIHdvcmtHcm91cElEID0gaXZlYzMod29ya0dyb3VwSURMZW5ndGggLyBudW1Xb3JrR3JvdXBzLnkgLyBudW1Xb3JrR3JvdXBzLnosIHdvcmtHcm91cElETGVuZ3RoIC8gbnVtV29ya0dyb3Vwcy54IC8gbnVtV29ya0dyb3Vwcy56LCB3b3JrR3JvdXBJRExlbmd0aCAvIG51bVdvcmtHcm91cHMueCAvIG51bVdvcmtHcm91cHMueSk7XFxcXG5pbnQgbG9jYWxJbnZvY2F0aW9uSURaID0gZ2xvYmFsSW52b2NhdGlvbkluZGV4IC8gKHdvcmtHcm91cFNpemUueCAqIHdvcmtHcm91cFNpemUueSk7XFxcXG5pbnQgbG9jYWxJbnZvY2F0aW9uSURZID0gKGdsb2JhbEludm9jYXRpb25JbmRleCAtIGxvY2FsSW52b2NhdGlvbklEWiAqIHdvcmtHcm91cFNpemUueCAqIHdvcmtHcm91cFNpemUueSkgLyB3b3JrR3JvdXBTaXplLng7XFxcXG5pbnQgbG9jYWxJbnZvY2F0aW9uSURYID0gZ2xvYmFsSW52b2NhdGlvbkluZGV4IC0gbG9jYWxJbnZvY2F0aW9uSURaICogd29ya0dyb3VwU2l6ZS54ICogd29ya0dyb3VwU2l6ZS55IC0gbG9jYWxJbnZvY2F0aW9uSURZICogd29ya0dyb3VwU2l6ZS54O1xcXFxuaXZlYzMgbG9jYWxJbnZvY2F0aW9uSUQgPSBpdmVjMyhsb2NhbEludm9jYXRpb25JRFgsIGxvY2FsSW52b2NhdGlvbklEWSwgbG9jYWxJbnZvY2F0aW9uSURaKTtcXFxcbml2ZWMzIGdsb2JhbEludm9jYXRpb25JRCA9IHdvcmtHcm91cElEICogd29ya0dyb3VwU2l6ZSArIGxvY2FsSW52b2NhdGlvbklEO1xcXFxuaW50IGxvY2FsSW52b2NhdGlvbkluZGV4ID0gbG9jYWxJbnZvY2F0aW9uSUQueiAqIHdvcmtHcm91cFNpemUueCAqIHdvcmtHcm91cFNpemUueVxcXFxuICAgICAgICAgICAgICAgICsgbG9jYWxJbnZvY2F0aW9uSUQueSAqIHdvcmtHcm91cFNpemUueCArIGxvY2FsSW52b2NhdGlvbklELng7XFxcXG5pbnQgaSA9IGdsb2JhbEludm9jYXRpb25JRC54O1xcXFxudmVjNCBjdXJyZW50Tm9kZSA9IGdldERhdGF1X0RhdGEoaSk7XFxcXG5mbG9hdCBkeCA9IDAuMDtcXFxcbmZsb2F0IGR5ID0gMC4wO1xcXFxuaWYgKGkgPj0gVkVSVEVYX0NPVU5UKSB7Z2xfRnJhZ0NvbG9yID0gdmVjNChjdXJyZW50Tm9kZSk7XFxcXG5yZXR1cm4gO31cXFxcbnZlYzQgbm9kZUF0dHJpYnV0ZXMgPSBnZXREYXRhdV9BdHRyaWJ1dGVBcnJheShpKTtcXFxcbmlmICgobm9kZUF0dHJpYnV0ZXMueSAhPSAwLjApICYmIChub2RlQXR0cmlidXRlcy56ICE9IDAuMCkpIHtnbF9GcmFnQ29sb3IgPSB2ZWM0KHZlYzQobm9kZUF0dHJpYnV0ZXMueSwgbm9kZUF0dHJpYnV0ZXMueiwgY3VycmVudE5vZGUueiwgY3VycmVudE5vZGUudykpO1xcXFxucmV0dXJuIDt9XFxcXG52ZWMyIHJlcHVsc2l2ZSA9IGNhbGNSZXB1bHNpdmUoaSwgY3VycmVudE5vZGUpO1xcXFxuZHggKz0gcmVwdWxzaXZlLng7XFxcXG5keSArPSByZXB1bHNpdmUueTtcXFxcbnZlYzIgYXR0cmFjdGl2ZSA9IGNhbGNBdHRyYWN0aXZlKGksIGN1cnJlbnROb2RlKTtcXFxcbmR4ICs9IGF0dHJhY3RpdmUueDtcXFxcbmR5ICs9IGF0dHJhY3RpdmUueTtcXFxcbnZlYzIgZ3Jhdml0eSA9IGNhbGNHcmF2aXR5KGN1cnJlbnROb2RlLCBub2RlQXR0cmlidXRlcyk7XFxcXG5keCAtPSBncmF2aXR5Lng7XFxcXG5keSAtPSBncmF2aXR5Lnk7XFxcXG5keCAqPSB1X1NwZWVkO1xcXFxuZHkgKj0gdV9TcGVlZDtcXFxcbmZsb2F0IGRpc3RMZW5ndGggPSBzcXJ0KChkeCAqIGR4KSArIChkeSAqIGR5KSk7XFxcXG5pZiAoZGlzdExlbmd0aCA+IDAuMCkge2Zsb2F0IGxpbWl0ZWREaXN0ID0gbWluKHVfTWF4RGlzcGxhY2UgKiB1X1NwZWVkLCBkaXN0TGVuZ3RoKTtcXFxcbmdsX0ZyYWdDb2xvciA9IHZlYzQodmVjNChjdXJyZW50Tm9kZS54ICsgKChkeCAvIGRpc3RMZW5ndGgpICogbGltaXRlZERpc3QpLCBjdXJyZW50Tm9kZS55ICsgKChkeSAvIGRpc3RMZW5ndGgpICogbGltaXRlZERpc3QpLCBjdXJyZW50Tm9kZS56LCBjdXJyZW50Tm9kZS53KSk7fWlmIChnV2ViR1BVRGVidWcpIHtcXFxcbiAgZ2xfRnJhZ0NvbG9yID0gZ1dlYkdQVURlYnVnT3V0cHV0O1xcXFxufX1cXFxcblwifSxcImNvbnRleHRcIjp7XCJuYW1lXCI6XCJcIixcImRpc3BhdGNoXCI6WzEsMSwxXSxcInRocmVhZEdyb3VwU2l6ZVwiOlsxLDEsMV0sXCJtYXhJdGVyYXRpb25cIjoxLFwiZGVmaW5lc1wiOlt7XCJuYW1lXCI6XCJNQVhfRURHRV9QRVJfVkVSVEVYXCIsXCJ0eXBlXCI6XCJGbG9hdFwiLFwicnVudGltZVwiOnRydWV9LHtcIm5hbWVcIjpcIlZFUlRFWF9DT1VOVFwiLFwidHlwZVwiOlwiRmxvYXRcIixcInJ1bnRpbWVcIjp0cnVlfV0sXCJ1bmlmb3Jtc1wiOlt7XCJuYW1lXCI6XCJ1X0RhdGFcIixcInR5cGVcIjpcInZlYzQ8ZjMyPltdXCIsXCJzdG9yYWdlQ2xhc3NcIjpcIlN0b3JhZ2VCdWZmZXJcIixcInJlYWRvbmx5XCI6ZmFsc2UsXCJ3cml0ZW9ubHlcIjpmYWxzZSxcInNpemVcIjpbMSwxXX0se1wibmFtZVwiOlwidV9LXCIsXCJ0eXBlXCI6XCJGbG9hdFwiLFwic3RvcmFnZUNsYXNzXCI6XCJVbmlmb3JtXCIsXCJyZWFkb25seVwiOnRydWUsXCJ3cml0ZW9ubHlcIjpmYWxzZSxcInNpemVcIjpbMSwxXX0se1wibmFtZVwiOlwidV9LMlwiLFwidHlwZVwiOlwiRmxvYXRcIixcInN0b3JhZ2VDbGFzc1wiOlwiVW5pZm9ybVwiLFwicmVhZG9ubHlcIjp0cnVlLFwid3JpdGVvbmx5XCI6ZmFsc2UsXCJzaXplXCI6WzEsMV19LHtcIm5hbWVcIjpcInVfQ2VudGVyXCIsXCJ0eXBlXCI6XCJ2ZWMyPGYzMj5cIixcInN0b3JhZ2VDbGFzc1wiOlwiVW5pZm9ybVwiLFwicmVhZG9ubHlcIjp0cnVlLFwid3JpdGVvbmx5XCI6ZmFsc2UsXCJzaXplXCI6WzEsMV19LHtcIm5hbWVcIjpcInVfR3Jhdml0eVwiLFwidHlwZVwiOlwiRmxvYXRcIixcInN0b3JhZ2VDbGFzc1wiOlwiVW5pZm9ybVwiLFwicmVhZG9ubHlcIjp0cnVlLFwid3JpdGVvbmx5XCI6ZmFsc2UsXCJzaXplXCI6WzEsMV19LHtcIm5hbWVcIjpcInVfQ2x1c3RlckdyYXZpdHlcIixcInR5cGVcIjpcIkZsb2F0XCIsXCJzdG9yYWdlQ2xhc3NcIjpcIlVuaWZvcm1cIixcInJlYWRvbmx5XCI6dHJ1ZSxcIndyaXRlb25seVwiOmZhbHNlLFwic2l6ZVwiOlsxLDFdfSx7XCJuYW1lXCI6XCJ1X1NwZWVkXCIsXCJ0eXBlXCI6XCJGbG9hdFwiLFwic3RvcmFnZUNsYXNzXCI6XCJVbmlmb3JtXCIsXCJyZWFkb25seVwiOnRydWUsXCJ3cml0ZW9ubHlcIjpmYWxzZSxcInNpemVcIjpbMSwxXX0se1wibmFtZVwiOlwidV9NYXhEaXNwbGFjZVwiLFwidHlwZVwiOlwiRmxvYXRcIixcInN0b3JhZ2VDbGFzc1wiOlwiVW5pZm9ybVwiLFwicmVhZG9ubHlcIjp0cnVlLFwid3JpdGVvbmx5XCI6ZmFsc2UsXCJzaXplXCI6WzEsMV19LHtcIm5hbWVcIjpcInVfQ2x1c3RlcmluZ1wiLFwidHlwZVwiOlwiRmxvYXRcIixcInN0b3JhZ2VDbGFzc1wiOlwiVW5pZm9ybVwiLFwicmVhZG9ubHlcIjp0cnVlLFwid3JpdGVvbmx5XCI6ZmFsc2UsXCJzaXplXCI6WzEsMV19LHtcIm5hbWVcIjpcInVfQXR0cmlidXRlQXJyYXlcIixcInR5cGVcIjpcInZlYzQ8ZjMyPltdXCIsXCJzdG9yYWdlQ2xhc3NcIjpcIlN0b3JhZ2VCdWZmZXJcIixcInJlYWRvbmx5XCI6dHJ1ZSxcIndyaXRlb25seVwiOmZhbHNlLFwic2l6ZVwiOlsxLDFdfSx7XCJuYW1lXCI6XCJ1X0NsdXN0ZXJDZW50ZXJzXCIsXCJ0eXBlXCI6XCJ2ZWM0PGYzMj5bXVwiLFwic3RvcmFnZUNsYXNzXCI6XCJTdG9yYWdlQnVmZmVyXCIsXCJyZWFkb25seVwiOnRydWUsXCJ3cml0ZW9ubHlcIjpmYWxzZSxcInNpemVcIjpbMSwxXX1dLFwiZ2xvYmFsRGVjbGFyYXRpb25zXCI6W10sXCJvdXRwdXRcIjp7XCJuYW1lXCI6XCJ1X0RhdGFcIixcInNpemVcIjpbMSwxXSxcImxlbmd0aFwiOjF9LFwibmVlZFBpbmdwb25nXCI6dHJ1ZX19YDtcbmV4cG9ydCBjb25zdCBjbHVzdGVyQ29kZSA9IGBcbmltcG9ydCB7IGdsb2JhbEludm9jYXRpb25JRCB9IGZyb20gJ2ctd2ViZ3B1JztcbmNvbnN0IFZFUlRFWF9DT1VOVDtcbmNvbnN0IENMVVNURVJfQ09VTlQ7XG5AbnVtdGhyZWFkcygxLCAxLCAxKVxuY2xhc3MgQ2FsY0NlbnRlciB7XG4gIEBpblxuICB1X0RhdGE6IHZlYzRbXTtcbiAgQGluXG4gIHVfTm9kZUF0dHJpYnV0ZXM6IHZlYzRbXTsgLy8gW1tjbHVzdGVySWR4LCAwLCAwLCAwXSwgLi4uXVxuICBAaW4gQG91dFxuICB1X0NsdXN0ZXJDZW50ZXJzOiB2ZWM0W107IC8vIFtbY3gsIGN5LCBub2RlQ291bnQsIGNsdXN0ZXJJZHhdLCAuLi5dXG4gIEBtYWluXG4gIGNvbXB1dGUoKSB7XG4gICAgY29uc3QgaSA9IGdsb2JhbEludm9jYXRpb25JRC54O1xuICAgIGNvbnN0IGNlbnRlciA9IHRoaXMudV9DbHVzdGVyQ2VudGVyc1tpXTtcbiAgICBsZXQgc3VteCA9IDA7XG4gICAgbGV0IHN1bXkgPSAwO1xuICAgIGxldCBjb3VudCA9IDA7XG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBWRVJURVhfQ09VTlQ7IGorKykge1xuICAgICAgY29uc3QgYXR0cmlidXRlcyA9IHRoaXMudV9Ob2RlQXR0cmlidXRlc1tqXTtcbiAgICAgIGNvbnN0IGNsdXN0ZXJJZHggPSBpbnQoYXR0cmlidXRlc1swXSk7XG4gICAgICBjb25zdCB2ZXJ0ZXggPSB0aGlzLnVfRGF0YVtqXTtcbiAgICAgIGlmIChjbHVzdGVySWR4ID09IGkpIHtcbiAgICAgICAgc3VteCArPSB2ZXJ0ZXgueDtcbiAgICAgICAgc3VteSArPSB2ZXJ0ZXgueTtcbiAgICAgICAgY291bnQgKz0gMTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy51X0NsdXN0ZXJDZW50ZXJzW2ldID0gW1xuICAgICAgc3VteCAvIGNvdW50LFxuICAgICAgc3VteSAvIGNvdW50LFxuICAgICAgY291bnQsXG4gICAgICBpXG4gICAgXTtcbiAgfVxufVxuYDtcbmV4cG9ydCBjb25zdCBjbHVzdGVyQnVuZGxlID0gYHtcInNoYWRlcnNcIjp7XCJXR1NMXCI6XCJpbXBvcnQgXFxcXFwiR0xTTC5zdGQuNDUwXFxcXFwiIGFzIHN0ZDtcXFxcblxcXFxuXFxcXG4jIHZhciBnV2ViR1BVRGVidWcgOiBib29sID0gZmFsc2U7XFxcXG4jIHZhciBnV2ViR1BVRGVidWdPdXRwdXQgOiB2ZWM0PGYzMj4gPSB2ZWM0PGYzMj4oMC4wKTtcXFxcblxcXFxuW1tidWlsdGluIGdsb2JhbF9pbnZvY2F0aW9uX2lkXV0gdmFyPGluPiBnbG9iYWxJbnZvY2F0aW9uSUQgOiB2ZWMzPHUzMj47XFxcXG4jIFtbYnVpbHRpbiB3b3JrX2dyb3VwX3NpemVdXSB2YXI8aW4+IHdvcmtHcm91cFNpemUgOiB2ZWMzPHUzMj47XFxcXG4jIFtbYnVpbHRpbiB3b3JrX2dyb3VwX2lkXV0gdmFyPGluPiB3b3JrR3JvdXBJRCA6IHZlYzM8dTMyPjtcXFxcbltbYnVpbHRpbiBsb2NhbF9pbnZvY2F0aW9uX2lkXV0gdmFyPGluPiBsb2NhbEludm9jYXRpb25JRCA6IHZlYzM8dTMyPjtcXFxcbiMgW1tidWlsdGluIG51bV93b3JrX2dyb3Vwc11dIHZhcjxpbj4gbnVtV29ya0dyb3VwcyA6IHZlYzM8dTMyPjtcXFxcbltbYnVpbHRpbiBsb2NhbF9pbnZvY2F0aW9uX2lkeF1dIHZhcjxpbj4gbG9jYWxJbnZvY2F0aW9uSW5kZXggOiB1MzI7XFxcXG5cXFxcblxcXFxudHlwZSBHV2ViR1BVQnVmZmVyMCA9IFtbYmxvY2tdXSBzdHJ1Y3Qge1xcXFxuICBbW29mZnNldCAwXV0gdV9EYXRhIDogW1tzdHJpZGUgMTZdXSBhcnJheTx2ZWM0PGYzMj4+O1xcXFxufTtcXFxcbltbYmluZGluZyAwLCBzZXQgMF1dIHZhcjxzdG9yYWdlX2J1ZmZlcj4gZ1dlYkdQVUJ1ZmZlcjAgOiBHV2ViR1BVQnVmZmVyMDtcXFxcbnR5cGUgR1dlYkdQVUJ1ZmZlcjEgPSBbW2Jsb2NrXV0gc3RydWN0IHtcXFxcbiAgW1tvZmZzZXQgMF1dIHVfTm9kZUF0dHJpYnV0ZXMgOiBbW3N0cmlkZSAxNl1dIGFycmF5PHZlYzQ8ZjMyPj47XFxcXG59O1xcXFxuW1tiaW5kaW5nIDEsIHNldCAwXV0gdmFyPHN0b3JhZ2VfYnVmZmVyPiBnV2ViR1BVQnVmZmVyMSA6IEdXZWJHUFVCdWZmZXIxO1xcXFxudHlwZSBHV2ViR1BVQnVmZmVyMiA9IFtbYmxvY2tdXSBzdHJ1Y3Qge1xcXFxuICBbW29mZnNldCAwXV0gdV9DbHVzdGVyQ2VudGVycyA6IFtbc3RyaWRlIDE2XV0gYXJyYXk8dmVjNDxmMzI+PjtcXFxcbn07XFxcXG5bW2JpbmRpbmcgMiwgc2V0IDBdXSB2YXI8c3RvcmFnZV9idWZmZXI+IGdXZWJHUFVCdWZmZXIyIDogR1dlYkdQVUJ1ZmZlcjI7XFxcXG5cXFxcblxcXFxuXFxcXG5cXFxcblxcXFxuXFxcXG5cXFxcblxcXFxuXFxcXG5mbiBtYWluKCkgLT4gdm9pZCB7dmFyIGkgOiBpMzIgPSBnbG9iYWxJbnZvY2F0aW9uSUQueDtcXFxcbnZhciBjZW50ZXIgOiB2ZWM0PGYzMj4gPSBnV2ViR1BVQnVmZmVyMi51X0NsdXN0ZXJDZW50ZXJzW2ldO1xcXFxudmFyIHN1bXggOiBmMzIgPSAwLjA7XFxcXG52YXIgc3VteSA6IGYzMiA9IDAuMDtcXFxcbnZhciBjb3VudCA6IGYzMiA9IDAuMDtcXFxcbmZvciAodmFyIGogOiBpMzIgPSAwOyBqIDwgX19EZWZpbmVWYWx1ZVBsYWNlaG9sZGVyX19WRVJURVhfQ09VTlQ7IGogPSBqICsgMSkge3ZhciBhdHRyaWJ1dGVzIDogdmVjNDxmMzI+ID0gZ1dlYkdQVUJ1ZmZlcjEudV9Ob2RlQXR0cmlidXRlc1tqXTtcXFxcbnZhciBjbHVzdGVySWR4IDogaTMyID0gaTMyKGF0dHJpYnV0ZXMueCk7XFxcXG52YXIgdmVydGV4IDogdmVjNDxmMzI+ID0gZ1dlYkdQVUJ1ZmZlcjAudV9EYXRhW2pdO1xcXFxuaWYgKGNsdXN0ZXJJZHggPT0gaSkge3N1bXggPSBzdW14ICsgdmVydGV4Lng7XFxcXG5zdW15ID0gc3VteSArIHZlcnRleC55O1xcXFxuY291bnQgPSBjb3VudCArIDEuMDt9fVxcXFxuZ1dlYkdQVUJ1ZmZlcjIudV9DbHVzdGVyQ2VudGVyc1tpXSA9IHZlYzQ8ZjMyPihzdW14IC8gY291bnQsIHN1bXkgLyBjb3VudCwgY291bnQsIGkpO1xcXFxucmV0dXJuO31cXFxcblxcXFxuZW50cnlfcG9pbnQgY29tcHV0ZSBhcyBcXFxcXCJtYWluXFxcXFwiID0gbWFpbjtcXFxcblwiLFwiR0xTTDQ1MFwiOlwiXFxcXG5cXFxcblxcXFxuYm9vbCBnV2ViR1BVRGVidWcgPSBmYWxzZTtcXFxcbnZlYzQgZ1dlYkdQVURlYnVnT3V0cHV0ID0gdmVjNCgwLjApO1xcXFxuXFxcXG5pdmVjMyBnbG9iYWxJbnZvY2F0aW9uSUQgPSBpdmVjMyhnbF9HbG9iYWxJbnZvY2F0aW9uSUQpO1xcXFxuaXZlYzMgd29ya0dyb3VwU2l6ZSA9IGl2ZWMzKDEsMSwxKTtcXFxcbml2ZWMzIHdvcmtHcm91cElEID0gaXZlYzMoZ2xfV29ya0dyb3VwSUQpO1xcXFxuaXZlYzMgbG9jYWxJbnZvY2F0aW9uSUQgPSBpdmVjMyhnbF9Mb2NhbEludm9jYXRpb25JRCk7XFxcXG5pdmVjMyBudW1Xb3JrR3JvdXBzID0gaXZlYzMoZ2xfTnVtV29ya0dyb3Vwcyk7XFxcXG5pbnQgbG9jYWxJbnZvY2F0aW9uSW5kZXggPSBpbnQoZ2xfTG9jYWxJbnZvY2F0aW9uSW5kZXgpO1xcXFxuXFxcXG5cXFxcbmxheW91dChzdGQ0MzAsIHNldCA9IDAsIGJpbmRpbmcgPSAwKSBidWZmZXIgcmVhZG9ubHkgIEdXZWJHUFVCdWZmZXIwIHtcXFxcbiAgdmVjNCB1X0RhdGFbXTtcXFxcbn0gZ1dlYkdQVUJ1ZmZlcjA7XFxcXG5cXFxcbmxheW91dChzdGQ0MzAsIHNldCA9IDAsIGJpbmRpbmcgPSAxKSBidWZmZXIgcmVhZG9ubHkgIEdXZWJHUFVCdWZmZXIxIHtcXFxcbiAgdmVjNCB1X05vZGVBdHRyaWJ1dGVzW107XFxcXG59IGdXZWJHUFVCdWZmZXIxO1xcXFxuXFxcXG5sYXlvdXQoc3RkNDMwLCBzZXQgPSAwLCBiaW5kaW5nID0gMikgYnVmZmVyICAgR1dlYkdQVUJ1ZmZlcjIge1xcXFxuICB2ZWM0IHVfQ2x1c3RlckNlbnRlcnNbXTtcXFxcbn0gZ1dlYkdQVUJ1ZmZlcjI7XFxcXG5cXFxcblxcXFxuXFxcXG4jZGVmaW5lIFZFUlRFWF9DT1VOVCBfX0RlZmluZVZhbHVlUGxhY2Vob2xkZXJfX1ZFUlRFWF9DT1VOVFxcXFxuI2RlZmluZSBDTFVTVEVSX0NPVU5UIF9fRGVmaW5lVmFsdWVQbGFjZWhvbGRlcl9fQ0xVU1RFUl9DT1VOVFxcXFxubGF5b3V0IChcXFxcbiAgbG9jYWxfc2l6ZV94ID0gMSxcXFxcbiAgbG9jYWxfc2l6ZV95ID0gMSxcXFxcbiAgbG9jYWxfc2l6ZV96ID0gMVxcXFxuKSBpbjtcXFxcblxcXFxuXFxcXG5cXFxcbnZvaWQgbWFpbigpIHtpbnQgaSA9IGdsb2JhbEludm9jYXRpb25JRC54O1xcXFxudmVjNCBjZW50ZXIgPSBnV2ViR1BVQnVmZmVyMi51X0NsdXN0ZXJDZW50ZXJzW2ldO1xcXFxuZmxvYXQgc3VteCA9IDAuMDtcXFxcbmZsb2F0IHN1bXkgPSAwLjA7XFxcXG5mbG9hdCBjb3VudCA9IDAuMDtcXFxcbmZvciAoaW50IGogPSAwOyBqIDwgVkVSVEVYX0NPVU5UOyBqKyspIHt2ZWM0IGF0dHJpYnV0ZXMgPSBnV2ViR1BVQnVmZmVyMS51X05vZGVBdHRyaWJ1dGVzW2pdO1xcXFxuaW50IGNsdXN0ZXJJZHggPSBpbnQoYXR0cmlidXRlcy54KTtcXFxcbnZlYzQgdmVydGV4ID0gZ1dlYkdQVUJ1ZmZlcjAudV9EYXRhW2pdO1xcXFxuaWYgKGNsdXN0ZXJJZHggPT0gaSkge3N1bXggKz0gdmVydGV4Lng7XFxcXG5zdW15ICs9IHZlcnRleC55O1xcXFxuY291bnQgKz0gMS4wO319XFxcXG5nV2ViR1BVQnVmZmVyMi51X0NsdXN0ZXJDZW50ZXJzW2ldID0gdmVjNChzdW14IC8gY291bnQsIHN1bXkgLyBjb3VudCwgY291bnQsIGkpO31cXFxcblwiLFwiR0xTTDEwMFwiOlwiXFxcXG5cXFxcbmZsb2F0IGVwc2lsb24gPSAwLjAwMDAxO1xcXFxudmVjMiBhZGRyVHJhbnNsYXRpb25fMUR0bzJEKGZsb2F0IGFkZHJlc3MxRCwgdmVjMiB0ZXhTaXplKSB7XFxcXG4gIHZlYzIgY29udl9jb25zdCA9IHZlYzIoMS4wIC8gdGV4U2l6ZS54LCAxLjAgLyAodGV4U2l6ZS54ICogdGV4U2l6ZS55KSk7XFxcXG4gIHZlYzIgbm9ybUFkZHIyRCA9IGZsb2F0KGFkZHJlc3MxRCkgKiBjb252X2NvbnN0O1xcXFxuICByZXR1cm4gdmVjMihmcmFjdChub3JtQWRkcjJELnggKyBlcHNpbG9uKSwgbm9ybUFkZHIyRC55KTtcXFxcbn1cXFxcblxcXFxudm9pZCBiYXJyaWVyKCkge31cXFxcbiAgXFxcXG5cXFxcbnVuaWZvcm0gdmVjMiB1X091dHB1dFRleHR1cmVTaXplO1xcXFxudW5pZm9ybSBpbnQgdV9PdXRwdXRUZXhlbENvdW50O1xcXFxudmFyeWluZyB2ZWMyIHZfVGV4Q29vcmQ7XFxcXG5cXFxcbmJvb2wgZ1dlYkdQVURlYnVnID0gZmFsc2U7XFxcXG52ZWM0IGdXZWJHUFVEZWJ1Z091dHB1dCA9IHZlYzQoMC4wKTtcXFxcblxcXFxuI2RlZmluZSBWRVJURVhfQ09VTlQgX19EZWZpbmVWYWx1ZVBsYWNlaG9sZGVyX19WRVJURVhfQ09VTlRcXFxcbiNkZWZpbmUgQ0xVU1RFUl9DT1VOVCBfX0RlZmluZVZhbHVlUGxhY2Vob2xkZXJfX0NMVVNURVJfQ09VTlRcXFxcblxcXFxudW5pZm9ybSBzYW1wbGVyMkQgdV9EYXRhO1xcXFxudW5pZm9ybSB2ZWMyIHVfRGF0YVNpemU7XFxcXG52ZWM0IGdldERhdGF1X0RhdGEodmVjMiBhZGRyZXNzMkQpIHtcXFxcbiAgcmV0dXJuIHZlYzQodGV4dHVyZTJEKHVfRGF0YSwgYWRkcmVzczJEKS5yZ2JhKTtcXFxcbn1cXFxcbnZlYzQgZ2V0RGF0YXVfRGF0YShmbG9hdCBhZGRyZXNzMUQpIHtcXFxcbiAgcmV0dXJuIGdldERhdGF1X0RhdGEoYWRkclRyYW5zbGF0aW9uXzFEdG8yRChhZGRyZXNzMUQsIHVfRGF0YVNpemUpKTtcXFxcbn1cXFxcbnZlYzQgZ2V0RGF0YXVfRGF0YShpbnQgYWRkcmVzczFEKSB7XFxcXG4gIHJldHVybiBnZXREYXRhdV9EYXRhKGZsb2F0KGFkZHJlc3MxRCkpO1xcXFxufVxcXFxudW5pZm9ybSBzYW1wbGVyMkQgdV9Ob2RlQXR0cmlidXRlcztcXFxcbnVuaWZvcm0gdmVjMiB1X05vZGVBdHRyaWJ1dGVzU2l6ZTtcXFxcbnZlYzQgZ2V0RGF0YXVfTm9kZUF0dHJpYnV0ZXModmVjMiBhZGRyZXNzMkQpIHtcXFxcbiAgcmV0dXJuIHZlYzQodGV4dHVyZTJEKHVfTm9kZUF0dHJpYnV0ZXMsIGFkZHJlc3MyRCkucmdiYSk7XFxcXG59XFxcXG52ZWM0IGdldERhdGF1X05vZGVBdHRyaWJ1dGVzKGZsb2F0IGFkZHJlc3MxRCkge1xcXFxuICByZXR1cm4gZ2V0RGF0YXVfTm9kZUF0dHJpYnV0ZXMoYWRkclRyYW5zbGF0aW9uXzFEdG8yRChhZGRyZXNzMUQsIHVfTm9kZUF0dHJpYnV0ZXNTaXplKSk7XFxcXG59XFxcXG52ZWM0IGdldERhdGF1X05vZGVBdHRyaWJ1dGVzKGludCBhZGRyZXNzMUQpIHtcXFxcbiAgcmV0dXJuIGdldERhdGF1X05vZGVBdHRyaWJ1dGVzKGZsb2F0KGFkZHJlc3MxRCkpO1xcXFxufVxcXFxudW5pZm9ybSBzYW1wbGVyMkQgdV9DbHVzdGVyQ2VudGVycztcXFxcbnVuaWZvcm0gdmVjMiB1X0NsdXN0ZXJDZW50ZXJzU2l6ZTtcXFxcbnZlYzQgZ2V0RGF0YXVfQ2x1c3RlckNlbnRlcnModmVjMiBhZGRyZXNzMkQpIHtcXFxcbiAgcmV0dXJuIHZlYzQodGV4dHVyZTJEKHVfQ2x1c3RlckNlbnRlcnMsIGFkZHJlc3MyRCkucmdiYSk7XFxcXG59XFxcXG52ZWM0IGdldERhdGF1X0NsdXN0ZXJDZW50ZXJzKGZsb2F0IGFkZHJlc3MxRCkge1xcXFxuICByZXR1cm4gZ2V0RGF0YXVfQ2x1c3RlckNlbnRlcnMoYWRkclRyYW5zbGF0aW9uXzFEdG8yRChhZGRyZXNzMUQsIHVfQ2x1c3RlckNlbnRlcnNTaXplKSk7XFxcXG59XFxcXG52ZWM0IGdldERhdGF1X0NsdXN0ZXJDZW50ZXJzKGludCBhZGRyZXNzMUQpIHtcXFxcbiAgcmV0dXJuIGdldERhdGF1X0NsdXN0ZXJDZW50ZXJzKGZsb2F0KGFkZHJlc3MxRCkpO1xcXFxufVxcXFxudm9pZCBtYWluKCkge1xcXFxuaXZlYzMgd29ya0dyb3VwU2l6ZSA9IGl2ZWMzKDEsIDEsIDEpO1xcXFxuaXZlYzMgbnVtV29ya0dyb3VwcyA9IGl2ZWMzKDEsIDEsIDEpOyAgICAgXFxcXG5pbnQgZ2xvYmFsSW52b2NhdGlvbkluZGV4ID0gaW50KGZsb29yKHZfVGV4Q29vcmQueCAqIHVfT3V0cHV0VGV4dHVyZVNpemUueCkpXFxcXG4gICsgaW50KGZsb29yKHZfVGV4Q29vcmQueSAqIHVfT3V0cHV0VGV4dHVyZVNpemUueSkpICogaW50KHVfT3V0cHV0VGV4dHVyZVNpemUueCk7XFxcXG5pbnQgd29ya0dyb3VwSURMZW5ndGggPSBnbG9iYWxJbnZvY2F0aW9uSW5kZXggLyAod29ya0dyb3VwU2l6ZS54ICogd29ya0dyb3VwU2l6ZS55ICogd29ya0dyb3VwU2l6ZS56KTtcXFxcbml2ZWMzIHdvcmtHcm91cElEID0gaXZlYzMod29ya0dyb3VwSURMZW5ndGggLyBudW1Xb3JrR3JvdXBzLnkgLyBudW1Xb3JrR3JvdXBzLnosIHdvcmtHcm91cElETGVuZ3RoIC8gbnVtV29ya0dyb3Vwcy54IC8gbnVtV29ya0dyb3Vwcy56LCB3b3JrR3JvdXBJRExlbmd0aCAvIG51bVdvcmtHcm91cHMueCAvIG51bVdvcmtHcm91cHMueSk7XFxcXG5pbnQgbG9jYWxJbnZvY2F0aW9uSURaID0gZ2xvYmFsSW52b2NhdGlvbkluZGV4IC8gKHdvcmtHcm91cFNpemUueCAqIHdvcmtHcm91cFNpemUueSk7XFxcXG5pbnQgbG9jYWxJbnZvY2F0aW9uSURZID0gKGdsb2JhbEludm9jYXRpb25JbmRleCAtIGxvY2FsSW52b2NhdGlvbklEWiAqIHdvcmtHcm91cFNpemUueCAqIHdvcmtHcm91cFNpemUueSkgLyB3b3JrR3JvdXBTaXplLng7XFxcXG5pbnQgbG9jYWxJbnZvY2F0aW9uSURYID0gZ2xvYmFsSW52b2NhdGlvbkluZGV4IC0gbG9jYWxJbnZvY2F0aW9uSURaICogd29ya0dyb3VwU2l6ZS54ICogd29ya0dyb3VwU2l6ZS55IC0gbG9jYWxJbnZvY2F0aW9uSURZICogd29ya0dyb3VwU2l6ZS54O1xcXFxuaXZlYzMgbG9jYWxJbnZvY2F0aW9uSUQgPSBpdmVjMyhsb2NhbEludm9jYXRpb25JRFgsIGxvY2FsSW52b2NhdGlvbklEWSwgbG9jYWxJbnZvY2F0aW9uSURaKTtcXFxcbml2ZWMzIGdsb2JhbEludm9jYXRpb25JRCA9IHdvcmtHcm91cElEICogd29ya0dyb3VwU2l6ZSArIGxvY2FsSW52b2NhdGlvbklEO1xcXFxuaW50IGxvY2FsSW52b2NhdGlvbkluZGV4ID0gbG9jYWxJbnZvY2F0aW9uSUQueiAqIHdvcmtHcm91cFNpemUueCAqIHdvcmtHcm91cFNpemUueVxcXFxuICAgICAgICAgICAgICAgICsgbG9jYWxJbnZvY2F0aW9uSUQueSAqIHdvcmtHcm91cFNpemUueCArIGxvY2FsSW52b2NhdGlvbklELng7XFxcXG5pbnQgaSA9IGdsb2JhbEludm9jYXRpb25JRC54O1xcXFxudmVjNCBjZW50ZXIgPSBnZXREYXRhdV9DbHVzdGVyQ2VudGVycyhpKTtcXFxcbmZsb2F0IHN1bXggPSAwLjA7XFxcXG5mbG9hdCBzdW15ID0gMC4wO1xcXFxuZmxvYXQgY291bnQgPSAwLjA7XFxcXG5mb3IgKGludCBqID0gMDsgaiA8IFZFUlRFWF9DT1VOVDsgaisrKSB7dmVjNCBhdHRyaWJ1dGVzID0gZ2V0RGF0YXVfTm9kZUF0dHJpYnV0ZXMoaik7XFxcXG5pbnQgY2x1c3RlcklkeCA9IGludChhdHRyaWJ1dGVzLngpO1xcXFxudmVjNCB2ZXJ0ZXggPSBnZXREYXRhdV9EYXRhKGopO1xcXFxuaWYgKGNsdXN0ZXJJZHggPT0gaSkge3N1bXggKz0gdmVydGV4Lng7XFxcXG5zdW15ICs9IHZlcnRleC55O1xcXFxuY291bnQgKz0gMS4wO319XFxcXG5nbF9GcmFnQ29sb3IgPSB2ZWM0KHZlYzQoc3VteCAvIGNvdW50LCBzdW15IC8gY291bnQsIGNvdW50LCBpKSk7aWYgKGdXZWJHUFVEZWJ1Zykge1xcXFxuICBnbF9GcmFnQ29sb3IgPSBnV2ViR1BVRGVidWdPdXRwdXQ7XFxcXG59fVxcXFxuXCJ9LFwiY29udGV4dFwiOntcIm5hbWVcIjpcIlwiLFwiZGlzcGF0Y2hcIjpbMSwxLDFdLFwidGhyZWFkR3JvdXBTaXplXCI6WzEsMSwxXSxcIm1heEl0ZXJhdGlvblwiOjEsXCJkZWZpbmVzXCI6W3tcIm5hbWVcIjpcIlZFUlRFWF9DT1VOVFwiLFwidHlwZVwiOlwiRmxvYXRcIixcInJ1bnRpbWVcIjp0cnVlfSx7XCJuYW1lXCI6XCJDTFVTVEVSX0NPVU5UXCIsXCJ0eXBlXCI6XCJGbG9hdFwiLFwicnVudGltZVwiOnRydWV9XSxcInVuaWZvcm1zXCI6W3tcIm5hbWVcIjpcInVfRGF0YVwiLFwidHlwZVwiOlwidmVjNDxmMzI+W11cIixcInN0b3JhZ2VDbGFzc1wiOlwiU3RvcmFnZUJ1ZmZlclwiLFwicmVhZG9ubHlcIjp0cnVlLFwid3JpdGVvbmx5XCI6ZmFsc2UsXCJzaXplXCI6WzEsMV19LHtcIm5hbWVcIjpcInVfTm9kZUF0dHJpYnV0ZXNcIixcInR5cGVcIjpcInZlYzQ8ZjMyPltdXCIsXCJzdG9yYWdlQ2xhc3NcIjpcIlN0b3JhZ2VCdWZmZXJcIixcInJlYWRvbmx5XCI6dHJ1ZSxcIndyaXRlb25seVwiOmZhbHNlLFwic2l6ZVwiOlsxLDFdfSx7XCJuYW1lXCI6XCJ1X0NsdXN0ZXJDZW50ZXJzXCIsXCJ0eXBlXCI6XCJ2ZWM0PGYzMj5bXVwiLFwic3RvcmFnZUNsYXNzXCI6XCJTdG9yYWdlQnVmZmVyXCIsXCJyZWFkb25seVwiOmZhbHNlLFwid3JpdGVvbmx5XCI6ZmFsc2UsXCJzaXplXCI6WzEsMV19XSxcImdsb2JhbERlY2xhcmF0aW9uc1wiOltdLFwib3V0cHV0XCI6e1wibmFtZVwiOlwidV9DbHVzdGVyQ2VudGVyc1wiLFwic2l6ZVwiOlsxLDFdLFwibGVuZ3RoXCI6MX0sXCJuZWVkUGluZ3BvbmdcIjp0cnVlfX1gO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZnJ1Y2h0ZXJtYW5TaGFkZXIuanMubWFwIiwiLy8gQHRzLW5vY2hlY2tcbi8qKlxuICogQGZpbGVPdmVydmlldyBmcnVjaHRlcm1hbiBsYXlvdXRcbiAqIEBhdXRob3Igc2hpd3Uud3l5QGFudGZpbi5jb21cbiAqL1xudmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBCYXNlIH0gZnJvbSBcIi4uL2Jhc2VcIjtcbmltcG9ydCB7IGlzTnVtYmVyIH0gZnJvbSBcIi4uLy4uL3V0aWxcIjtcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IFdvcmxkIH0gZnJvbSBcIkBhbnR2L2ctd2ViZ3B1XCI7XG4vLyBjb21waWxlIGF0IHJ1bnRpbWUgaW4gZGV2IG1vZGVcbmltcG9ydCB7IGJ1aWxkVGV4dHVyZURhdGEsIGF0dHJpYnV0ZXNUb1RleHR1cmVEYXRhIH0gZnJvbSBcIi4uLy4uL3V0aWwvZ3B1XCI7XG4vLyB1c2UgY29tcGlsZWQgYnVuZGxlIGluIHByb2QgbW9kZVxuaW1wb3J0IHsgZnJ1Y2h0ZXJtYW5CdW5kbGUsIGNsdXN0ZXJCdW5kbGUgfSBmcm9tIFwiLi9mcnVjaHRlcm1hblNoYWRlclwiO1xuaW1wb3J0IHsgTEFZT1VUX01FU1NBR0UgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG4vKipcbiAqIGZydWNodGVybWFuIOW4g+WxgFxuICovXG5leHBvcnQgY2xhc3MgRnJ1Y2h0ZXJtYW5HUFVMYXlvdXQgZXh0ZW5kcyBCYXNlIHtcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIC8qKiDlgZzmraLov63ku6PnmoTmnIDlpKfov63ku6PmlbAgKi9cbiAgICAgICAgdGhpcy5tYXhJdGVyYXRpb24gPSAxMDAwO1xuICAgICAgICAvKiog6YeN5Yqb5aSn5bCP77yM5b2x5ZON5Zu+55qE57Sn5YeR56iL5bqmICovXG4gICAgICAgIHRoaXMuZ3Jhdml0eSA9IDEwO1xuICAgICAgICAvKiog6YCf5bqmICovXG4gICAgICAgIHRoaXMuc3BlZWQgPSAxO1xuICAgICAgICAvKiog5piv5ZCm5Lqn55Sf6IGa57G75YqbICovXG4gICAgICAgIHRoaXMuY2x1c3RlcmluZyA9IGZhbHNlO1xuICAgICAgICAvKiog5qC55o2u5ZOq5Liq5a2X5q616IGa57G7ICovXG4gICAgICAgIHRoaXMuY2x1c3RlckZpZWxkID0gXCJjbHVzdGVyXCI7XG4gICAgICAgIC8qKiDogZrnsbvlipvlpKflsI8gKi9cbiAgICAgICAgdGhpcy5jbHVzdGVyR3Jhdml0eSA9IDEwO1xuICAgICAgICAvKiog5piv5ZCm5ZCv55Sod2ViIHdvcmtlcuOAguWJjeaPkOaYr+WcqHdlYiB3b3JrZXLph4zmiafooYzluIPlsYDvvIzlkKbliJnml6DmlYhcdCovXG4gICAgICAgIHRoaXMud29ya2VyRW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLm5vZGVzID0gW107XG4gICAgICAgIHRoaXMuZWRnZXMgPSBbXTtcbiAgICAgICAgdGhpcy53aWR0aCA9IDMwMDtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSAzMDA7XG4gICAgICAgIHRoaXMubm9kZU1hcCA9IHt9O1xuICAgICAgICB0aGlzLm5vZGVJZHhNYXAgPSB7fTtcbiAgICAgICAgdGhpcy51cGRhdGVDZmcob3B0aW9ucyk7XG4gICAgfVxuICAgIGdldERlZmF1bHRDZmcoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBtYXhJdGVyYXRpb246IDEwMDAsXG4gICAgICAgICAgICBncmF2aXR5OiAxMCxcbiAgICAgICAgICAgIHNwZWVkOiAxLFxuICAgICAgICAgICAgY2x1c3RlcmluZzogZmFsc2UsXG4gICAgICAgICAgICBjbHVzdGVyR3Jhdml0eTogMTBcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICog5omn6KGM5biD5bGAXG4gICAgICovXG4gICAgZXhlY3V0ZSgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgICAgICAgICAgY29uc3Qgbm9kZXMgPSBzZWxmLm5vZGVzO1xuICAgICAgICAgICAgaWYgKCFub2RlcyB8fCBub2Rlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vbkxheW91dEVuZClcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkxheW91dEVuZCgpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghc2VsZi53aWR0aCAmJiB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICAgICAgc2VsZi53aWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFzZWxmLmhlaWdodCAmJiB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICAgICAgc2VsZi5oZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXNlbGYuY2VudGVyKSB7XG4gICAgICAgICAgICAgICAgc2VsZi5jZW50ZXIgPSBbc2VsZi53aWR0aCAvIDIsIHNlbGYuaGVpZ2h0IC8gMl07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBjZW50ZXIgPSBzZWxmLmNlbnRlcjtcbiAgICAgICAgICAgIGlmIChub2Rlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICBub2Rlc1swXS54ID0gY2VudGVyWzBdO1xuICAgICAgICAgICAgICAgIG5vZGVzWzBdLnkgPSBjZW50ZXJbMV07XG4gICAgICAgICAgICAgICAgaWYgKHNlbGYub25MYXlvdXRFbmQpXG4gICAgICAgICAgICAgICAgICAgIHNlbGYub25MYXlvdXRFbmQoKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBub2RlTWFwID0ge307XG4gICAgICAgICAgICBjb25zdCBub2RlSWR4TWFwID0ge307XG4gICAgICAgICAgICBub2Rlcy5mb3JFYWNoKChub2RlLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFpc051bWJlcihub2RlLngpKVxuICAgICAgICAgICAgICAgICAgICBub2RlLnggPSBNYXRoLnJhbmRvbSgpICogdGhpcy53aWR0aDtcbiAgICAgICAgICAgICAgICBpZiAoIWlzTnVtYmVyKG5vZGUueSkpXG4gICAgICAgICAgICAgICAgICAgIG5vZGUueSA9IE1hdGgucmFuZG9tKCkgKiB0aGlzLmhlaWdodDtcbiAgICAgICAgICAgICAgICBub2RlTWFwW25vZGUuaWRdID0gbm9kZTtcbiAgICAgICAgICAgICAgICBub2RlSWR4TWFwW25vZGUuaWRdID0gaTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc2VsZi5ub2RlTWFwID0gbm9kZU1hcDtcbiAgICAgICAgICAgIHNlbGYubm9kZUlkeE1hcCA9IG5vZGVJZHhNYXA7XG4gICAgICAgICAgICAvLyBsYXlvdXRcbiAgICAgICAgICAgIHlpZWxkIHNlbGYucnVuKCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBleGVjdXRlV2l0aFdvcmtlcihjYW52YXMsIGN0eCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICAgICAgICBjb25zdCBub2RlcyA9IHNlbGYubm9kZXM7XG4gICAgICAgICAgICBjb25zdCBjZW50ZXIgPSBzZWxmLmNlbnRlcjtcbiAgICAgICAgICAgIGlmICghbm9kZXMgfHwgbm9kZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG5vZGVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIG5vZGVzWzBdLnggPSBjZW50ZXJbMF07XG4gICAgICAgICAgICAgICAgbm9kZXNbMF0ueSA9IGNlbnRlclsxXTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBub2RlTWFwID0ge307XG4gICAgICAgICAgICBjb25zdCBub2RlSWR4TWFwID0ge307XG4gICAgICAgICAgICBub2Rlcy5mb3JFYWNoKChub2RlLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFpc051bWJlcihub2RlLngpKVxuICAgICAgICAgICAgICAgICAgICBub2RlLnggPSBNYXRoLnJhbmRvbSgpICogdGhpcy53aWR0aDtcbiAgICAgICAgICAgICAgICBpZiAoIWlzTnVtYmVyKG5vZGUueSkpXG4gICAgICAgICAgICAgICAgICAgIG5vZGUueSA9IE1hdGgucmFuZG9tKCkgKiB0aGlzLmhlaWdodDtcbiAgICAgICAgICAgICAgICBub2RlTWFwW25vZGUuaWRdID0gbm9kZTtcbiAgICAgICAgICAgICAgICBub2RlSWR4TWFwW25vZGUuaWRdID0gaTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc2VsZi5ub2RlTWFwID0gbm9kZU1hcDtcbiAgICAgICAgICAgIHNlbGYubm9kZUlkeE1hcCA9IG5vZGVJZHhNYXA7XG4gICAgICAgICAgICAvLyBsYXlvdXRcbiAgICAgICAgICAgIHlpZWxkIHNlbGYucnVuKGNhbnZhcywgY3R4KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJ1bihjYW52YXMsIGN0eCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICAgICAgICBjb25zdCBub2RlcyA9IHNlbGYubm9kZXM7XG4gICAgICAgICAgICBjb25zdCBlZGdlcyA9IHNlbGYuZWRnZXM7XG4gICAgICAgICAgICBjb25zdCBtYXhJdGVyYXRpb24gPSBzZWxmLm1heEl0ZXJhdGlvbjtcbiAgICAgICAgICAgIGNvbnN0IGNlbnRlciA9IHNlbGYuY2VudGVyO1xuICAgICAgICAgICAgY29uc3QgYXJlYSA9IHNlbGYuaGVpZ2h0ICogc2VsZi53aWR0aDtcbiAgICAgICAgICAgIGxldCBtYXhEaXNwbGFjZSA9IE1hdGguc3FydChhcmVhKSAvIDEwO1xuICAgICAgICAgICAgY29uc3QgazIgPSBhcmVhIC8gKG5vZGVzLmxlbmd0aCArIDEpO1xuICAgICAgICAgICAgY29uc3QgayA9IE1hdGguc3FydChrMik7XG4gICAgICAgICAgICBjb25zdCBzcGVlZCA9IHNlbGYuc3BlZWQ7XG4gICAgICAgICAgICBjb25zdCBjbHVzdGVyaW5nID0gc2VsZi5jbHVzdGVyaW5nO1xuICAgICAgICAgICAgY29uc3QgeyBhcnJheTogYXR0cmlidXRlQXJyYXksIGNvdW50OiBjbHVzdGVyQ291bnQgfSA9IGF0dHJpYnV0ZXNUb1RleHR1cmVEYXRhKFtzZWxmLmNsdXN0ZXJGaWVsZF0sIG5vZGVzKTtcbiAgICAgICAgICAgIC8vIHB1c2hpbmcgdGhlIGZ4IGFuZCBmeVxuICAgICAgICAgICAgbm9kZXMuZm9yRWFjaCgobm9kZSwgaSkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBmeCA9IDA7XG4gICAgICAgICAgICAgICAgbGV0IGZ5ID0gMDtcbiAgICAgICAgICAgICAgICBpZiAoaXNOdW1iZXIobm9kZS5meCkgJiYgaXNOdW1iZXIobm9kZS5meSkpIHtcbiAgICAgICAgICAgICAgICAgICAgZnggPSBub2RlLmZ4IHx8IDAuMDAxO1xuICAgICAgICAgICAgICAgICAgICBmeSA9IG5vZGUuZnkgfHwgMC4wMDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZUFycmF5WzQgKiBpICsgMV0gPSBmeDtcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVBcnJheVs0ICogaSArIDJdID0gZnk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IG51bVBhcnRpY2xlcyA9IG5vZGVzLmxlbmd0aDtcbiAgICAgICAgICAgIGNvbnN0IHsgbWF4RWRnZVBlclZldGV4LCBhcnJheTogbm9kZXNFZGdlc0FycmF5IH0gPSBidWlsZFRleHR1cmVEYXRhKG5vZGVzLCBlZGdlcyk7XG4gICAgICAgICAgICBjb25zdCB3b3JrZXJFbmFibGVkID0gc2VsZi53b3JrZXJFbmFibGVkO1xuICAgICAgICAgICAgbGV0IHdvcmxkO1xuICAgICAgICAgICAgaWYgKHdvcmtlckVuYWJsZWQpIHtcbiAgICAgICAgICAgICAgICB3b3JsZCA9IFdvcmxkLmNyZWF0ZSh7XG4gICAgICAgICAgICAgICAgICAgIGNhbnZhcyxcbiAgICAgICAgICAgICAgICAgICAgZW5naW5lT3B0aW9uczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydENvbXB1dGU6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgd29ybGQgPSBXb3JsZC5jcmVhdGUoe1xuICAgICAgICAgICAgICAgICAgICBlbmdpbmVPcHRpb25zOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0Q29tcHV0ZTogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBjb21waWxlIGF0IHJ1bnRpbWUgaW4gZGV2IG1vZGVcbiAgICAgICAgICAgIC8vIGNvbnN0IGNvbXBpbGVyID0gbmV3IENvbXBpbGVyKClcbiAgICAgICAgICAgIC8vIGNvbnN0IGZydWNodGVybWFuQnVuZGxlID0gY29tcGlsZXIuY29tcGlsZUJ1bmRsZShmcnVjaHRlcm1hbkNvZGUpXG4gICAgICAgICAgICAvLyBjb25zdCBjbHVzdGVyQnVuZGxlID0gY29tcGlsZXIuY29tcGlsZUJ1bmRsZShjbHVzdGVyQ29kZSlcbiAgICAgICAgICAgIC8vIHVzZSBjb21waWxlZCBidW5kbGUgaW4gcHJvZCBtb2RlXG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhmcnVjaHRlcm1hbkJ1bmRsZS50b1N0cmluZygpKVxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coY2x1c3RlckJ1bmRsZS50b1N0cmluZygpKVxuICAgICAgICAgICAgY29uc3Qgb25MYXlvdXRFbmQgPSBzZWxmLm9uTGF5b3V0RW5kO1xuICAgICAgICAgICAgY29uc3QgY2x1c3RlckNlbnRlcnMgPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2x1c3RlckNvdW50OyBpKyspIHtcbiAgICAgICAgICAgICAgICBjbHVzdGVyQ2VudGVycy5wdXNoKDAsIDAsIDAsIDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qga2VybmVsRnJ1Y2h0ZXJtYW4gPSB3b3JsZFxuICAgICAgICAgICAgICAgIC5jcmVhdGVLZXJuZWwoZnJ1Y2h0ZXJtYW5CdW5kbGUpXG4gICAgICAgICAgICAgICAgLnNldERpc3BhdGNoKFtudW1QYXJ0aWNsZXMsIDEsIDFdKVxuICAgICAgICAgICAgICAgIC5zZXRCaW5kaW5nKHtcbiAgICAgICAgICAgICAgICB1X0RhdGE6IG5vZGVzRWRnZXNBcnJheSxcbiAgICAgICAgICAgICAgICB1X0s6IGssXG4gICAgICAgICAgICAgICAgdV9LMjogazIsXG4gICAgICAgICAgICAgICAgdV9HcmF2aXR5OiBzZWxmLmdyYXZpdHksXG4gICAgICAgICAgICAgICAgdV9DbHVzdGVyR3Jhdml0eTogc2VsZi5jbHVzdGVyR3Jhdml0eSB8fCBzZWxmLmdyYXZpdHkgfHwgMSxcbiAgICAgICAgICAgICAgICB1X1NwZWVkOiBzcGVlZCxcbiAgICAgICAgICAgICAgICB1X01heERpc3BsYWNlOiBtYXhEaXNwbGFjZSxcbiAgICAgICAgICAgICAgICB1X0NsdXN0ZXJpbmc6IGNsdXN0ZXJpbmcgPyAxIDogMCxcbiAgICAgICAgICAgICAgICB1X0NlbnRlcjogY2VudGVyLFxuICAgICAgICAgICAgICAgIHVfQXR0cmlidXRlQXJyYXk6IGF0dHJpYnV0ZUFycmF5LFxuICAgICAgICAgICAgICAgIHVfQ2x1c3RlckNlbnRlcnM6IGNsdXN0ZXJDZW50ZXJzLFxuICAgICAgICAgICAgICAgIE1BWF9FREdFX1BFUl9WRVJURVg6IG1heEVkZ2VQZXJWZXRleCxcbiAgICAgICAgICAgICAgICBWRVJURVhfQ09VTlQ6IG51bVBhcnRpY2xlc1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBsZXQga2VybmVsQ2x1c3RlcjtcbiAgICAgICAgICAgIGlmIChjbHVzdGVyaW5nKSB7XG4gICAgICAgICAgICAgICAga2VybmVsQ2x1c3RlciA9IHdvcmxkXG4gICAgICAgICAgICAgICAgICAgIC5jcmVhdGVLZXJuZWwoY2x1c3RlckJ1bmRsZSlcbiAgICAgICAgICAgICAgICAgICAgLnNldERpc3BhdGNoKFtjbHVzdGVyQ291bnQsIDEsIDFdKVxuICAgICAgICAgICAgICAgICAgICAuc2V0QmluZGluZyh7XG4gICAgICAgICAgICAgICAgICAgIHVfRGF0YTogbm9kZXNFZGdlc0FycmF5LFxuICAgICAgICAgICAgICAgICAgICB1X05vZGVBdHRyaWJ1dGVzOiBhdHRyaWJ1dGVBcnJheSxcbiAgICAgICAgICAgICAgICAgICAgdV9DbHVzdGVyQ2VudGVyczogY2x1c3RlckNlbnRlcnMsXG4gICAgICAgICAgICAgICAgICAgIFZFUlRFWF9DT1VOVDogbnVtUGFydGljbGVzLFxuICAgICAgICAgICAgICAgICAgICBDTFVTVEVSX0NPVU5UOiBjbHVzdGVyQ291bnRcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGV4ZWN1dGUgPSAoKSA9PiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXhJdGVyYXRpb247IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXdhaXQtaW4tbG9vcFxuICAgICAgICAgICAgICAgICAgICB5aWVsZCBrZXJuZWxGcnVjaHRlcm1hbi5leGVjdXRlKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjbHVzdGVyaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXJuZWxDbHVzdGVyLnNldEJpbmRpbmcoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfRGF0YToga2VybmVsRnJ1Y2h0ZXJtYW5cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWF3YWl0LWluLWxvb3BcbiAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIGtlcm5lbENsdXN0ZXIuZXhlY3V0ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAga2VybmVsRnJ1Y2h0ZXJtYW4uc2V0QmluZGluZyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9DbHVzdGVyQ2VudGVyczoga2VybmVsQ2x1c3RlclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAga2VybmVsRnJ1Y2h0ZXJtYW4uc2V0QmluZGluZyh7XG4gICAgICAgICAgICAgICAgICAgICAgICB1X01heERpc3BsYWNlOiBtYXhEaXNwbGFjZSAqPSAwLjk5XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBmaW5hbFBhcnRpY2xlRGF0YSA9IHlpZWxkIGtlcm5lbEZydWNodGVybWFuLmdldE91dHB1dCgpO1xuICAgICAgICAgICAgICAgIGlmIChjYW52YXMpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8g5Lyg6YCS5pWw5o2u57uZ5Li757q/56iLXG4gICAgICAgICAgICAgICAgICAgIGN0eC5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBMQVlPVVRfTUVTU0FHRS5HUFVFTkQsXG4gICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhFZGdlRGF0YTogZmluYWxQYXJ0aWNsZURhdGFcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVkZ2VJbmRleEJ1ZmZlckRhdGEsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZXMuZm9yRWFjaCgobm9kZSwgaSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeCA9IGZpbmFsUGFydGljbGVEYXRhWzQgKiBpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHkgPSBmaW5hbFBhcnRpY2xlRGF0YVs0ICogaSArIDFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS54ID0geDtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUueSA9IHk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAob25MYXlvdXRFbmQpXG4gICAgICAgICAgICAgICAgICAgIG9uTGF5b3V0RW5kKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHlpZWxkIGV4ZWN1dGUoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGdldFR5cGUoKSB7XG4gICAgICAgIHJldHVybiBcImZydWNodGVybWFuLWdwdVwiO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWZydWNodGVybWFuLmpzLm1hcCIsImV4cG9ydCBjb25zdCBnRm9yY2VDb2RlID0gYFxuaW1wb3J0IHsgZ2xvYmFsSW52b2NhdGlvbklEIH0gZnJvbSAnZy13ZWJncHUnO1xuXG5jb25zdCBNQVhfRURHRV9QRVJfVkVSVEVYO1xuY29uc3QgVkVSVEVYX0NPVU5UO1xuY29uc3QgU0hJRlRfMjAgPSAxMDQ4NTc2O1xuXG5AbnVtdGhyZWFkcygxLCAxLCAxKVxuY2xhc3MgR0dGb3JjZSB7XG4gIEBpbiBAb3V0XG4gIHVfRGF0YTogdmVjNFtdO1xuXG4gIEBpblxuICB1X2RhbXBpbmc6IGZsb2F0O1xuICBcbiAgQGluXG4gIHVfbWF4U3BlZWQ6IGZsb2F0O1xuXG4gIEBpblxuICB1X21pbk1vdmVtZW50OiBmbG9hdDtcblxuICBAaW5cbiAgdV9BdmVNb3ZlbWVudDogdmVjNFtdO1xuXG4gIEBpblxuICB1X2NvdWxvbWJEaXNTY2FsZTogZmxvYXQ7XG5cbiAgQGluXG4gIHVfZmFjdG9yOiBmbG9hdDtcblxuICBAaW5cbiAgdV9Ob2RlQXR0cmlidXRlQXJyYXkxOiB2ZWM0W107XG5cbiAgQGluXG4gIHVfTm9kZUF0dHJpYnV0ZUFycmF5MjogdmVjNFtdO1xuXG4gIEBpblxuICB1X2ludGVydmFsOiBmbG9hdDtcblxuICB1bnBhY2tfZmxvYXQocGFja2VkVmFsdWU6IGZsb2F0KTogaXZlYzIge1xuICAgIGNvbnN0IHBhY2tlZEludFZhbHVlID0gaW50KHBhY2tlZFZhbHVlKTtcbiAgICBjb25zdCB2MCA9IHBhY2tlZEludFZhbHVlIC8gU0hJRlRfMjA7XG4gICAgcmV0dXJuIFt2MCwgcGFja2VkSW50VmFsdWUgLSB2MCAqIFNISUZUXzIwXTtcbiAgfVxuXG4gIGNhbGNSZXB1bHNpdmUoaTogaW50LCBjdXJyZW50Tm9kZTogdmVjNCk6IHZlYzIge1xuICAgIGxldCBheCA9IDAsIGF5ID0gMDtcbiAgICBmb3IgKGxldCBqOiBpbnQgPSAwOyBqIDwgVkVSVEVYX0NPVU5UOyBqKyspIHtcbiAgICAgIGlmIChpICE9IGopIHtcbiAgICAgICAgY29uc3QgbmV4dE5vZGUgPSB0aGlzLnVfRGF0YVtqXTtcbiAgICAgICAgY29uc3QgdnggPSBjdXJyZW50Tm9kZVswXSAtIG5leHROb2RlWzBdO1xuICAgICAgICBjb25zdCB2eSA9IGN1cnJlbnROb2RlWzFdIC0gbmV4dE5vZGVbMV07XG4gICAgICAgIGNvbnN0IGRpc3QgPSBzcXJ0KHZ4ICogdnggKyB2eSAqIHZ5KSArIDAuMDE7XG4gICAgICAgIGNvbnN0IG5fZGlzdCA9IChkaXN0ICsgMC4xKSAqIHRoaXMudV9jb3Vsb21iRGlzU2NhbGU7XG4gICAgICAgIGNvbnN0IGRpcmV4ID0gdnggLyBkaXN0O1xuICAgICAgICBjb25zdCBkaXJleSA9IHZ5IC8gZGlzdDtcbiAgICAgICAgY29uc3QgYXR0cmlidXRlc2kgPSB0aGlzLnVfTm9kZUF0dHJpYnV0ZUFycmF5MVtpXTtcbiAgICAgICAgY29uc3QgYXR0cmlidXRlc2ogPSB0aGlzLnVfTm9kZUF0dHJpYnV0ZUFycmF5MVtqXTtcbiAgICAgICAgY29uc3QgbWFzc2kgPSBhdHRyaWJ1dGVzaVswXTtcbiAgICAgICAgY29uc3Qgbm9kZVN0cmVuZ3RoaSA9IGF0dHJpYnV0ZXNpWzJdO1xuICAgICAgICBjb25zdCBub2RlU3RyZW5ndGhqID0gYXR0cmlidXRlc2pbMl07XG4gICAgICAgIGNvbnN0IG5vZGVTdHJlbmd0aCA9IChub2RlU3RyZW5ndGhpICsgbm9kZVN0cmVuZ3RoaikgLyAyO1xuICAgICAgICAvLyBjb25zdCBwYXJhbSA9IG5vZGVTdHJlbmd0aCAqIHRoaXMudV9mYWN0b3IgLyAobl9kaXN0ICogbl9kaXN0ICogbWFzc2kpO1xuICAgICAgICBjb25zdCBwYXJhbSA9IG5vZGVTdHJlbmd0aCAqIHRoaXMudV9mYWN0b3IgLyAobl9kaXN0ICogbl9kaXN0KTtcbiAgICAgICAgYXggKz0gZGlyZXggKiBwYXJhbTtcbiAgICAgICAgYXkgKz0gZGlyZXkgKiBwYXJhbTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFtheCwgYXldO1xuICB9XG5cbiAgY2FsY0dyYXZpdHkoaTogaW50LCBjdXJyZW50Tm9kZTogdmVjNCwgYXR0cmlidXRlczI6IHZlYzQpOiB2ZWMyIHtcbiAgICAvLyBub3RlOiBhdHRyaWJ1dGVzMiA9IFtjZW50ZXJYLCBjZW50ZXJZLCBncmF2aXR5LCAwXVxuXG4gICAgY29uc3QgdnggPSBjdXJyZW50Tm9kZVswXSAtIGF0dHJpYnV0ZXMyWzBdO1xuICAgIGNvbnN0IHZ5ID0gY3VycmVudE5vZGVbMV0gLSBhdHRyaWJ1dGVzMlsxXTtcbiAgICBcbiAgICBjb25zdCBheCA9IHZ4ICogYXR0cmlidXRlczJbMl07XG4gICAgY29uc3QgYXkgPSB2eSAqIGF0dHJpYnV0ZXMyWzJdO1xuICAgIFxuICAgIHJldHVybiBbYXgsIGF5XTtcbiAgfVxuXG4gIGNhbGNBdHRyYWN0aXZlKGk6IGludCwgY3VycmVudE5vZGU6IHZlYzQsIGF0dHJpYnV0ZXMxOiB2ZWM0KTogdmVjMiB7XG4gICAgLy8gbm90ZTogYXR0cmlidXRlczEgPSBbbWFzcywgZGVncmVlLCBub2RlU3Rlcm5ndGgsIDBdXG5cbiAgICBjb25zdCBtYXNzID0gYXR0cmlidXRlczFbMF07XG4gICAgbGV0IGF4ID0gMCwgYXkgPSAwO1xuICAgIC8vIGNvbnN0IGFycl9vZmZzZXQgPSBpbnQoZmxvb3IoY3VycmVudE5vZGVbMl0gKyAwLjUpKTtcbiAgICAvLyBjb25zdCBsZW5ndGggPSBpbnQoZmxvb3IoY3VycmVudE5vZGVbM10gKyAwLjUpKTtcblxuICAgIGNvbnN0IGNvbXByZXNzZWQgPSB0aGlzLnVucGFja19mbG9hdChjdXJyZW50Tm9kZVsyXSk7XG4gICAgY29uc3QgbGVuZ3RoID0gY29tcHJlc3NlZFswXTtcbiAgICBjb25zdCBhcnJfb2Zmc2V0ID0gY29tcHJlc3NlZFsxXTtcblxuICAgIGNvbnN0IG5vZGVfYnVmZmVyOiB2ZWM0O1xuICAgIGZvciAobGV0IHA6IGludCA9IDA7IHAgPCBNQVhfRURHRV9QRVJfVkVSVEVYOyBwKyspIHtcbiAgICAgIGlmIChwID49IGxlbmd0aCkgYnJlYWs7XG4gICAgICBjb25zdCBhcnJfaWR4ID0gYXJyX29mZnNldCArIDQgKiBwOyAvLyBpIOiKgueCueeahOesrCBwIOadoei+ueW8gOWni+eahOWwj+agvOWtkOS9jee9rlxuICAgICAgY29uc3QgYnVmX29mZnNldCA9IGFycl9pZHggLSBhcnJfaWR4IC8gNCAqIDQ7XG4gICAgICBpZiAocCA9PSAwIHx8IGJ1Zl9vZmZzZXQgPT0gMCkge1xuICAgICAgICBub2RlX2J1ZmZlciA9IHRoaXMudV9EYXRhW2ludChhcnJfaWR4IC8gNCldOyAvLyDlpKfmoLzlrZDvvIzlpKfmoLzlrZDkvY3nva495bCP5Liq5a2Q5L2N572uIC8gNO+8jFxuICAgICAgfVxuXG4gICAgICBsZXQgZmxvYXRfajogZmxvYXQgPSBub2RlX2J1ZmZlclswXTtcblxuICAgICAgY29uc3QgbmV4dE5vZGUgPSB0aGlzLnVfRGF0YVtpbnQoZmxvYXRfaildO1xuICAgICAgY29uc3QgdnggPSBuZXh0Tm9kZVswXSAtIGN1cnJlbnROb2RlWzBdO1xuICAgICAgY29uc3QgdnkgPSBuZXh0Tm9kZVsxXSAtIGN1cnJlbnROb2RlWzFdO1xuICAgICAgY29uc3QgZGlzdCA9IHNxcnQodnggKiB2eCArIHZ5ICogdnkpICsgMC4wMTtcbiAgICAgIGNvbnN0IGRpcmV4ID0gdnggLyBkaXN0O1xuICAgICAgY29uc3QgZGlyZXkgPSB2eSAvIGRpc3Q7XG4gICAgICBjb25zdCBlZGdlTGVuZ3RoID0gbm9kZV9idWZmZXJbMV07XG4gICAgICBjb25zdCBlZGdlU3RyZW5ndGggPSBub2RlX2J1ZmZlclsyXTtcbiAgICAgIGNvbnN0IGRpZmY6IGZsb2F0ID0gZWRnZUxlbmd0aCAtIGRpc3Q7Ly9lZGdlTGVuZ3RoXG4gICAgICAvLyBjb25zdCBwYXJhbSA9IGRpZmYgKiB0aGlzLnVfc3RpZmZuZXNzIC8gbWFzczsgLy9cbiAgICAgIGNvbnN0IHBhcmFtID0gZGlmZiAqIGVkZ2VTdHJlbmd0aCAvIG1hc3M7IC8vIFxuICAgICAgYXggLT0gZGlyZXggKiBwYXJhbTtcbiAgICAgIGF5IC09IGRpcmV5ICogcGFyYW07XG4gICAgfVxuICAgIHJldHVybiBbYXgsIGF5XTtcbiAgfVxuXG4gIEBtYWluXG4gIGNvbXB1dGUoKSB7XG4gICAgY29uc3QgaSA9IGdsb2JhbEludm9jYXRpb25JRC54O1xuICAgIGNvbnN0IGN1cnJlbnROb2RlID0gdGhpcy51X0RhdGFbaV07XG4gICAgY29uc3QgbW92ZW1lbnQgPSB1X0F2ZU1vdmVtZW50WzBdO1xuICAgIGxldCBheCA9IDAsIGF5ID0gMDtcblxuICAgIGlmIChpID49IFZFUlRFWF9DT1VOVCB8fCBtb3ZlbWVudC54IDwgdV9taW5Nb3ZlbWVudCkge1xuICAgICAgdGhpcy51X0RhdGFbaV0gPSBjdXJyZW50Tm9kZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyDmr4/kuKroioLngrnlsZ7mgKfljaDkuKTkuKrmlbDnu4TkuK3lkITkuIDmoLxcbiAgICAvLyBbbWFzcywgZGVncmVlLCBub2RlU3RyZW5ndGgsIGZ4XVxuICAgIGNvbnN0IG5vZGVBdHRyaWJ1dGVzMSA9IHRoaXMudV9Ob2RlQXR0cmlidXRlQXJyYXkxW2ldO1xuICAgIC8vIFtjZW50ZXJYLCBjZW50ZXJZLCBjZW50ZXJHcmF2aXR5LCBmeV1cbiAgICBjb25zdCBub2RlQXR0cmlidXRlczIgPSB0aGlzLnVfTm9kZUF0dHJpYnV0ZUFycmF5MltpXTtcblxuICAgIC8vIHJlcHVsc2l2ZVxuICAgIGNvbnN0IHJlcHVsc2l2ZSA9IHRoaXMuY2FsY1JlcHVsc2l2ZShpLCBjdXJyZW50Tm9kZSk7XG4gICAgYXggKz0gcmVwdWxzaXZlWzBdO1xuICAgIGF5ICs9IHJlcHVsc2l2ZVsxXTtcblxuICAgIC8vIGF0dHJhY3RpdmVcbiAgICBjb25zdCBhdHRyYWN0aXZlID0gdGhpcy5jYWxjQXR0cmFjdGl2ZShpLCBjdXJyZW50Tm9kZSwgbm9kZUF0dHJpYnV0ZXMxKTtcbiAgICBheCArPSBhdHRyYWN0aXZlWzBdO1xuICAgIGF5ICs9IGF0dHJhY3RpdmVbMV07XG5cbiAgICAvLyBncmF2aXR5XG4gICAgY29uc3QgZ3Jhdml0eSA9IHRoaXMuY2FsY0dyYXZpdHkoaSwgY3VycmVudE5vZGUsIG5vZGVBdHRyaWJ1dGVzMik7XG4gICAgYXggLT0gZ3Jhdml0eVswXTtcbiAgICBheSAtPSBncmF2aXR5WzFdO1xuXG4gICAgLy8gc3BlZWRcbiAgICBjb25zdCBwYXJhbSA9IHRoaXMudV9pbnRlcnZhbCAqIHRoaXMudV9kYW1waW5nO1xuICAgIGxldCB2eCA9IGF4ICogcGFyYW07XG4gICAgbGV0IHZ5ID0gYXkgKiBwYXJhbTtcbiAgICBjb25zdCB2bGVuZ3RoID0gc3FydCh2eCAqIHZ4ICsgdnkgKiB2eSkgKyAwLjAwMDE7XG4gICAgaWYgKHZsZW5ndGggPiB0aGlzLnVfbWF4U3BlZWQpIHtcbiAgICAgIGNvbnN0IHBhcmFtMiA9IHRoaXMudV9tYXhTcGVlZCAvIHZsZW5ndGg7XG4gICAgICB2eCA9IHBhcmFtMiAqIHZ4O1xuICAgICAgdnkgPSBwYXJhbTIgKiB2eTtcbiAgICB9XG5cbiAgICAvLyBtb3ZlXG4gICAgaWYgKG5vZGVBdHRyaWJ1dGVzMVszXSAhPSAwICYmIG5vZGVBdHRyaWJ1dGVzMlszXSAhPSAwKSB7XG4gICAgICB0aGlzLnVfRGF0YVtpXSA9IFtcbiAgICAgICAgbm9kZUF0dHJpYnV0ZXMxWzNdLFxuICAgICAgICBub2RlQXR0cmlidXRlczJbM10sXG4gICAgICAgIGN1cnJlbnROb2RlWzJdLFxuICAgICAgICAwXG4gICAgICBdO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBkaXN0eCA9IHZ4ICogdGhpcy51X2ludGVydmFsO1xuICAgICAgY29uc3QgZGlzdHkgPSB2eSAqIHRoaXMudV9pbnRlcnZhbDtcbiAgICAgIGNvbnN0IGRpc3RMZW5ndGggPSBzcXJ0KGRpc3R4ICogZGlzdHggKyBkaXN0eSAqIGRpc3R5KTtcbiAgICAgIHRoaXMudV9EYXRhW2ldID0gW1xuICAgICAgICBjdXJyZW50Tm9kZVswXSArIGRpc3R4LFxuICAgICAgICBjdXJyZW50Tm9kZVsxXSArIGRpc3R5LFxuICAgICAgICBjdXJyZW50Tm9kZVsyXSxcbiAgICAgICAgZGlzdExlbmd0aFxuICAgICAgXTtcbiAgICB9XG4gICAgXG4gICAgLy8gdGhlIGF2YXJhZ2UgbW92ZSBkaXN0YW5jZVxuICAgIC8vIG5lZWQgdG8gc2hhcmUgbWVtb3J5XG4gICAgXG4gIH1cbn1cbmA7XG5leHBvcnQgY29uc3QgZ0ZvcmNlQnVuZGxlID0gYHtcInNoYWRlcnNcIjp7XCJXR1NMXCI6XCJpbXBvcnQgXFxcXFwiR0xTTC5zdGQuNDUwXFxcXFwiIGFzIHN0ZDtcXFxcblxcXFxuXFxcXG4jIHZhciBnV2ViR1BVRGVidWcgOiBib29sID0gZmFsc2U7XFxcXG4jIHZhciBnV2ViR1BVRGVidWdPdXRwdXQgOiB2ZWM0PGYzMj4gPSB2ZWM0PGYzMj4oMC4wKTtcXFxcblxcXFxuW1tidWlsdGluIGdsb2JhbF9pbnZvY2F0aW9uX2lkXV0gdmFyPGluPiBnbG9iYWxJbnZvY2F0aW9uSUQgOiB2ZWMzPHUzMj47XFxcXG4jIFtbYnVpbHRpbiB3b3JrX2dyb3VwX3NpemVdXSB2YXI8aW4+IHdvcmtHcm91cFNpemUgOiB2ZWMzPHUzMj47XFxcXG4jIFtbYnVpbHRpbiB3b3JrX2dyb3VwX2lkXV0gdmFyPGluPiB3b3JrR3JvdXBJRCA6IHZlYzM8dTMyPjtcXFxcbltbYnVpbHRpbiBsb2NhbF9pbnZvY2F0aW9uX2lkXV0gdmFyPGluPiBsb2NhbEludm9jYXRpb25JRCA6IHZlYzM8dTMyPjtcXFxcbiMgW1tidWlsdGluIG51bV93b3JrX2dyb3Vwc11dIHZhcjxpbj4gbnVtV29ya0dyb3VwcyA6IHZlYzM8dTMyPjtcXFxcbltbYnVpbHRpbiBsb2NhbF9pbnZvY2F0aW9uX2lkeF1dIHZhcjxpbj4gbG9jYWxJbnZvY2F0aW9uSW5kZXggOiB1MzI7XFxcXG5cXFxcbnR5cGUgR1dlYkdQVVBhcmFtcyA9IFtbYmxvY2tdXSBzdHJ1Y3Qge1xcXFxuICBbW29mZnNldCAwXV0gdV9kYW1waW5nIDogZjMyO1xcXFxuICBbW29mZnNldCA0XV0gdV9tYXhTcGVlZCA6IGYzMjtcXFxcbiAgW1tvZmZzZXQgOF1dIHVfbWluTW92ZW1lbnQgOiBmMzI7XFxcXG4gIFxcXFxuICBbW29mZnNldCAxMl1dIHVfY291bG9tYkRpc1NjYWxlIDogZjMyO1xcXFxuICBbW29mZnNldCAxNl1dIHVfZmFjdG9yIDogZjMyO1xcXFxuICBcXFxcbiAgXFxcXG4gIFtbb2Zmc2V0IDIwXV0gdV9pbnRlcnZhbCA6IGYzMjtcXFxcbn07XFxcXG5bW2JpbmRpbmcgMCwgc2V0IDBdXSB2YXI8dW5pZm9ybT4gZ1dlYkdQVVVuaWZvcm1QYXJhbXMgOiBHV2ViR1BVUGFyYW1zO1xcXFxudHlwZSBHV2ViR1BVQnVmZmVyMCA9IFtbYmxvY2tdXSBzdHJ1Y3Qge1xcXFxuICBbW29mZnNldCAwXV0gdV9EYXRhIDogW1tzdHJpZGUgMTZdXSBhcnJheTx2ZWM0PGYzMj4+O1xcXFxufTtcXFxcbltbYmluZGluZyAxLCBzZXQgMF1dIHZhcjxzdG9yYWdlX2J1ZmZlcj4gZ1dlYkdQVUJ1ZmZlcjAgOiBHV2ViR1BVQnVmZmVyMDtcXFxcbnR5cGUgR1dlYkdQVUJ1ZmZlcjEgPSBbW2Jsb2NrXV0gc3RydWN0IHtcXFxcbiAgW1tvZmZzZXQgMF1dIHVfQXZlTW92ZW1lbnQgOiBbW3N0cmlkZSAxNl1dIGFycmF5PHZlYzQ8ZjMyPj47XFxcXG59O1xcXFxuW1tiaW5kaW5nIDIsIHNldCAwXV0gdmFyPHN0b3JhZ2VfYnVmZmVyPiBnV2ViR1BVQnVmZmVyMSA6IEdXZWJHUFVCdWZmZXIxO1xcXFxudHlwZSBHV2ViR1BVQnVmZmVyMiA9IFtbYmxvY2tdXSBzdHJ1Y3Qge1xcXFxuICBbW29mZnNldCAwXV0gdV9Ob2RlQXR0cmlidXRlQXJyYXkxIDogW1tzdHJpZGUgMTZdXSBhcnJheTx2ZWM0PGYzMj4+O1xcXFxufTtcXFxcbltbYmluZGluZyAzLCBzZXQgMF1dIHZhcjxzdG9yYWdlX2J1ZmZlcj4gZ1dlYkdQVUJ1ZmZlcjIgOiBHV2ViR1BVQnVmZmVyMjtcXFxcbnR5cGUgR1dlYkdQVUJ1ZmZlcjMgPSBbW2Jsb2NrXV0gc3RydWN0IHtcXFxcbiAgW1tvZmZzZXQgMF1dIHVfTm9kZUF0dHJpYnV0ZUFycmF5MiA6IFtbc3RyaWRlIDE2XV0gYXJyYXk8dmVjNDxmMzI+PjtcXFxcbn07XFxcXG5bW2JpbmRpbmcgNCwgc2V0IDBdXSB2YXI8c3RvcmFnZV9idWZmZXI+IGdXZWJHUFVCdWZmZXIzIDogR1dlYkdQVUJ1ZmZlcjM7XFxcXG5cXFxcblxcXFxuXFxcXG5cXFxcblxcXFxuXFxcXG5cXFxcblxcXFxuXFxcXG5cXFxcblxcXFxuXFxcXG5cXFxcblxcXFxuXFxcXG5cXFxcblxcXFxuZm4gdW5wYWNrX2Zsb2F0KHBhY2tlZFZhbHVlIDogZjMyKSAtPiB2ZWMyPGkzMj4ge3ZhciBwYWNrZWRJbnRWYWx1ZSA6IGkzMiA9IGkzMihwYWNrZWRWYWx1ZSk7XFxcXG52YXIgdjAgOiBpMzIgPSBwYWNrZWRJbnRWYWx1ZSAvIDEwNDg1NzY7XFxcXG5yZXR1cm4gdmVjMjxpMzI+KHYwLCBwYWNrZWRJbnRWYWx1ZSAtICh2MCAqIDEwNDg1NzYpKTt9XFxcXG5mbiBjYWxjUmVwdWxzaXZlKGkgOiBpMzIsIGN1cnJlbnROb2RlIDogdmVjNDxmMzI+KSAtPiB2ZWMyPGYzMj4ge3ZhciBheCA6IGYzMiA9IDAuMDtcXFxcbnZhciBheSA6IGYzMiA9IDAuMDtcXFxcbmZvciAodmFyIGogOiBpMzIgPSAwOyBqIDwgX19EZWZpbmVWYWx1ZVBsYWNlaG9sZGVyX19WRVJURVhfQ09VTlQ7IGogPSBqICsgMSkge2lmIChpICE9IGopIHt2YXIgbmV4dE5vZGUgOiB2ZWM0PGYzMj4gPSBnV2ViR1BVQnVmZmVyMC51X0RhdGFbal07XFxcXG52YXIgdnggOiBmMzIgPSBjdXJyZW50Tm9kZS54IC0gbmV4dE5vZGUueDtcXFxcbnZhciB2eSA6IGYzMiA9IGN1cnJlbnROb2RlLnkgLSBuZXh0Tm9kZS55O1xcXFxudmFyIGRpc3QgOiBmMzIgPSBzdGQ6OnNxcnQoKHZ4ICogdngpICsgKHZ5ICogdnkpKSArIDAuMDE7XFxcXG52YXIgbl9kaXN0IDogZjMyID0gKGRpc3QgKyAwLjEpICogZ1dlYkdQVVVuaWZvcm1QYXJhbXMudV9jb3Vsb21iRGlzU2NhbGU7XFxcXG52YXIgZGlyZXggOiBmMzIgPSB2eCAvIGRpc3Q7XFxcXG52YXIgZGlyZXkgOiBmMzIgPSB2eSAvIGRpc3Q7XFxcXG52YXIgYXR0cmlidXRlc2kgOiB2ZWM0PGYzMj4gPSBnV2ViR1BVQnVmZmVyMi51X05vZGVBdHRyaWJ1dGVBcnJheTFbaV07XFxcXG52YXIgYXR0cmlidXRlc2ogOiB2ZWM0PGYzMj4gPSBnV2ViR1BVQnVmZmVyMi51X05vZGVBdHRyaWJ1dGVBcnJheTFbal07XFxcXG52YXIgbWFzc2kgOiBmMzIgPSBhdHRyaWJ1dGVzaS54O1xcXFxudmFyIG5vZGVTdHJlbmd0aGkgOiBmMzIgPSBhdHRyaWJ1dGVzaS56O1xcXFxudmFyIG5vZGVTdHJlbmd0aGogOiBmMzIgPSBhdHRyaWJ1dGVzai56O1xcXFxudmFyIG5vZGVTdHJlbmd0aCA6IGYzMiA9IChub2RlU3RyZW5ndGhpICsgbm9kZVN0cmVuZ3RoaikgLyAyLjA7XFxcXG52YXIgcGFyYW0gOiBmMzIgPSAobm9kZVN0cmVuZ3RoICogZ1dlYkdQVVVuaWZvcm1QYXJhbXMudV9mYWN0b3IpIC8gKG5fZGlzdCAqIG5fZGlzdCk7XFxcXG5heCA9IGF4ICsgZGlyZXggKiBwYXJhbTtcXFxcbmF5ID0gYXkgKyBkaXJleSAqIHBhcmFtO319XFxcXG5yZXR1cm4gdmVjMjxmMzI+KGF4LCBheSk7fVxcXFxuZm4gY2FsY0dyYXZpdHkoaSA6IGkzMiwgY3VycmVudE5vZGUgOiB2ZWM0PGYzMj4sIGF0dHJpYnV0ZXMyIDogdmVjNDxmMzI+KSAtPiB2ZWMyPGYzMj4ge3ZhciB2eCA6IGYzMiA9IGN1cnJlbnROb2RlLnggLSBhdHRyaWJ1dGVzMi54O1xcXFxudmFyIHZ5IDogZjMyID0gY3VycmVudE5vZGUueSAtIGF0dHJpYnV0ZXMyLnk7XFxcXG52YXIgYXggOiBmMzIgPSB2eCAqIGF0dHJpYnV0ZXMyLno7XFxcXG52YXIgYXkgOiBmMzIgPSB2eSAqIGF0dHJpYnV0ZXMyLno7XFxcXG5yZXR1cm4gdmVjMjxmMzI+KGF4LCBheSk7fVxcXFxuZm4gY2FsY0F0dHJhY3RpdmUoaSA6IGkzMiwgY3VycmVudE5vZGUgOiB2ZWM0PGYzMj4sIGF0dHJpYnV0ZXMxIDogdmVjNDxmMzI+KSAtPiB2ZWMyPGYzMj4ge3ZhciBtYXNzIDogZjMyID0gYXR0cmlidXRlczEueDtcXFxcbnZhciBheCA6IGYzMiA9IDAuMDtcXFxcbnZhciBheSA6IGYzMiA9IDAuMDtcXFxcbnZhciBjb21wcmVzc2VkIDogdmVjMjxpMzI+ID0gdW5wYWNrX2Zsb2F0KGN1cnJlbnROb2RlLnopO1xcXFxudmFyIGxlbmd0aCA6IGkzMiA9IGNvbXByZXNzZWQueDtcXFxcbnZhciBhcnJfb2Zmc2V0IDogaTMyID0gY29tcHJlc3NlZC55O1xcXFxudmFyIG5vZGVfYnVmZmVyIDogdmVjNDxmMzI+O1xcXFxuZm9yICh2YXIgcCA6IGkzMiA9IDA7IHAgPCBfX0RlZmluZVZhbHVlUGxhY2Vob2xkZXJfX01BWF9FREdFX1BFUl9WRVJURVg7IHAgPSBwICsgMSkge2lmIChwID49IGxlbmd0aCkge2JyZWFrO31cXFxcbnZhciBhcnJfaWR4IDogaTMyID0gYXJyX29mZnNldCArICg0ICogcCk7XFxcXG52YXIgYnVmX29mZnNldCA6IGkzMiA9IGFycl9pZHggLSAoKGFycl9pZHggLyA0KSAqIDQpO1xcXFxuaWYgKChwID09IDApIHx8IChidWZfb2Zmc2V0ID09IDApKSB7bm9kZV9idWZmZXIgPSBnV2ViR1BVQnVmZmVyMC51X0RhdGFbaTMyKGFycl9pZHggLyA0KV07fVxcXFxudmFyIGZsb2F0X2ogOiBmMzIgPSBub2RlX2J1ZmZlci54O1xcXFxudmFyIG5leHROb2RlIDogdmVjNDxmMzI+ID0gZ1dlYkdQVUJ1ZmZlcjAudV9EYXRhW2kzMihmbG9hdF9qKV07XFxcXG52YXIgdnggOiBmMzIgPSBuZXh0Tm9kZS54IC0gY3VycmVudE5vZGUueDtcXFxcbnZhciB2eSA6IGYzMiA9IG5leHROb2RlLnkgLSBjdXJyZW50Tm9kZS55O1xcXFxudmFyIGRpc3QgOiBmMzIgPSBzdGQ6OnNxcnQoKHZ4ICogdngpICsgKHZ5ICogdnkpKSArIDAuMDE7XFxcXG52YXIgZGlyZXggOiBmMzIgPSB2eCAvIGRpc3Q7XFxcXG52YXIgZGlyZXkgOiBmMzIgPSB2eSAvIGRpc3Q7XFxcXG52YXIgZWRnZUxlbmd0aCA6IGYzMiA9IG5vZGVfYnVmZmVyLnk7XFxcXG52YXIgZWRnZVN0cmVuZ3RoIDogZjMyID0gbm9kZV9idWZmZXIuejtcXFxcbnZhciBkaWZmIDogZjMyID0gZWRnZUxlbmd0aCAtIGRpc3Q7XFxcXG52YXIgcGFyYW0gOiBmMzIgPSAoZGlmZiAqIGVkZ2VTdHJlbmd0aCkgLyBtYXNzO1xcXFxuYXggPSBheCAtIGRpcmV4ICogcGFyYW07XFxcXG5heSA9IGF5IC0gZGlyZXkgKiBwYXJhbTt9XFxcXG5yZXR1cm4gdmVjMjxmMzI+KGF4LCBheSk7fVxcXFxuZm4gbWFpbigpIC0+IHZvaWQge3ZhciBpIDogaTMyID0gZ2xvYmFsSW52b2NhdGlvbklELng7XFxcXG52YXIgY3VycmVudE5vZGUgOiB2ZWM0PGYzMj4gPSBnV2ViR1BVQnVmZmVyMC51X0RhdGFbaV07XFxcXG52YXIgbW92ZW1lbnQgOiB2ZWM0PGYzMj4gPSBnV2ViR1BVQnVmZmVyMS51X0F2ZU1vdmVtZW50WzBdO1xcXFxudmFyIGF4IDogZjMyID0gMC4wO1xcXFxudmFyIGF5IDogZjMyID0gMC4wO1xcXFxuaWYgKChpID49IF9fRGVmaW5lVmFsdWVQbGFjZWhvbGRlcl9fVkVSVEVYX0NPVU5UKSB8fCAobW92ZW1lbnQueCA8IGdXZWJHUFVVbmlmb3JtUGFyYW1zLnVfbWluTW92ZW1lbnQpKSB7Z1dlYkdQVUJ1ZmZlcjAudV9EYXRhW2ldID0gY3VycmVudE5vZGU7XFxcXG5yZXR1cm4gO31cXFxcbnZhciBub2RlQXR0cmlidXRlczEgOiB2ZWM0PGYzMj4gPSBnV2ViR1BVQnVmZmVyMi51X05vZGVBdHRyaWJ1dGVBcnJheTFbaV07XFxcXG52YXIgbm9kZUF0dHJpYnV0ZXMyIDogdmVjNDxmMzI+ID0gZ1dlYkdQVUJ1ZmZlcjMudV9Ob2RlQXR0cmlidXRlQXJyYXkyW2ldO1xcXFxudmFyIHJlcHVsc2l2ZSA6IHZlYzI8ZjMyPiA9IGNhbGNSZXB1bHNpdmUoaSwgY3VycmVudE5vZGUpO1xcXFxuYXggPSBheCArIHJlcHVsc2l2ZS54O1xcXFxuYXkgPSBheSArIHJlcHVsc2l2ZS55O1xcXFxudmFyIGF0dHJhY3RpdmUgOiB2ZWMyPGYzMj4gPSBjYWxjQXR0cmFjdGl2ZShpLCBjdXJyZW50Tm9kZSwgbm9kZUF0dHJpYnV0ZXMxKTtcXFxcbmF4ID0gYXggKyBhdHRyYWN0aXZlLng7XFxcXG5heSA9IGF5ICsgYXR0cmFjdGl2ZS55O1xcXFxudmFyIGdyYXZpdHkgOiB2ZWMyPGYzMj4gPSBjYWxjR3Jhdml0eShpLCBjdXJyZW50Tm9kZSwgbm9kZUF0dHJpYnV0ZXMyKTtcXFxcbmF4ID0gYXggLSBncmF2aXR5Lng7XFxcXG5heSA9IGF5IC0gZ3Jhdml0eS55O1xcXFxudmFyIHBhcmFtIDogZjMyID0gZ1dlYkdQVVVuaWZvcm1QYXJhbXMudV9pbnRlcnZhbCAqIGdXZWJHUFVVbmlmb3JtUGFyYW1zLnVfZGFtcGluZztcXFxcbnZhciB2eCA6IGYzMiA9IGF4ICogcGFyYW07XFxcXG52YXIgdnkgOiBmMzIgPSBheSAqIHBhcmFtO1xcXFxudmFyIHZsZW5ndGggOiBmMzIgPSBzdGQ6OnNxcnQoKHZ4ICogdngpICsgKHZ5ICogdnkpKSArIDAuMDAwMTtcXFxcbmlmICh2bGVuZ3RoID4gZ1dlYkdQVVVuaWZvcm1QYXJhbXMudV9tYXhTcGVlZCkge3ZhciBwYXJhbTIgOiBmMzIgPSBnV2ViR1BVVW5pZm9ybVBhcmFtcy51X21heFNwZWVkIC8gdmxlbmd0aDtcXFxcbnZ4ID0gcGFyYW0yICogdng7XFxcXG52eSA9IHBhcmFtMiAqIHZ5O31cXFxcbnZhciBkaXN0eCA6IGYzMiA9IHZ4ICogZ1dlYkdQVVVuaWZvcm1QYXJhbXMudV9pbnRlcnZhbDtcXFxcbnZhciBkaXN0eSA6IGYzMiA9IHZ5ICogZ1dlYkdQVVVuaWZvcm1QYXJhbXMudV9pbnRlcnZhbDtcXFxcbnZhciBkaXN0TGVuZ3RoIDogZjMyID0gc3RkOjpzcXJ0KChkaXN0eCAqIGRpc3R4KSArIChkaXN0eSAqIGRpc3R5KSk7XFxcXG5pZiAoKG5vZGVBdHRyaWJ1dGVzMS53ICE9IDAuMCkgJiYgKG5vZGVBdHRyaWJ1dGVzMi53ICE9IDAuMCkpIHtnV2ViR1BVQnVmZmVyMC51X0RhdGFbaV0gPSB2ZWM0PGYzMj4obm9kZUF0dHJpYnV0ZXMxLncsIG5vZGVBdHRyaWJ1dGVzMi53LCBjdXJyZW50Tm9kZS56LCAwLjApO31lbHNlIHtnV2ViR1BVQnVmZmVyMC51X0RhdGFbaV0gPSB2ZWM0PGYzMj4oY3VycmVudE5vZGUueCArIGRpc3R4LCBjdXJyZW50Tm9kZS55ICsgZGlzdHksIGN1cnJlbnROb2RlLnosIGRpc3RMZW5ndGgpO31cXFxcbnJldHVybjt9XFxcXG5cXFxcbmVudHJ5X3BvaW50IGNvbXB1dGUgYXMgXFxcXFwibWFpblxcXFxcIiA9IG1haW47XFxcXG5cIixcIkdMU0w0NTBcIjpcIlxcXFxuXFxcXG5cXFxcbmJvb2wgZ1dlYkdQVURlYnVnID0gZmFsc2U7XFxcXG52ZWM0IGdXZWJHUFVEZWJ1Z091dHB1dCA9IHZlYzQoMC4wKTtcXFxcblxcXFxuaXZlYzMgZ2xvYmFsSW52b2NhdGlvbklEID0gaXZlYzMoZ2xfR2xvYmFsSW52b2NhdGlvbklEKTtcXFxcbml2ZWMzIHdvcmtHcm91cFNpemUgPSBpdmVjMygxLDEsMSk7XFxcXG5pdmVjMyB3b3JrR3JvdXBJRCA9IGl2ZWMzKGdsX1dvcmtHcm91cElEKTtcXFxcbml2ZWMzIGxvY2FsSW52b2NhdGlvbklEID0gaXZlYzMoZ2xfTG9jYWxJbnZvY2F0aW9uSUQpO1xcXFxuaXZlYzMgbnVtV29ya0dyb3VwcyA9IGl2ZWMzKGdsX051bVdvcmtHcm91cHMpO1xcXFxuaW50IGxvY2FsSW52b2NhdGlvbkluZGV4ID0gaW50KGdsX0xvY2FsSW52b2NhdGlvbkluZGV4KTtcXFxcblxcXFxubGF5b3V0KHN0ZDE0MCwgc2V0ID0gMCwgYmluZGluZyA9IDApIHVuaWZvcm0gR1dlYkdQVVBhcmFtcyB7XFxcXG4gIGZsb2F0IHVfZGFtcGluZztcXFxcbiAgZmxvYXQgdV9tYXhTcGVlZDtcXFxcbiAgZmxvYXQgdV9taW5Nb3ZlbWVudDtcXFxcbiAgXFxcXG4gIGZsb2F0IHVfY291bG9tYkRpc1NjYWxlO1xcXFxuICBmbG9hdCB1X2ZhY3RvcjtcXFxcbiAgXFxcXG4gIFxcXFxuICBmbG9hdCB1X2ludGVydmFsO1xcXFxufSBnV2ViR1BVVW5pZm9ybVBhcmFtcztcXFxcbmxheW91dChzdGQ0MzAsIHNldCA9IDAsIGJpbmRpbmcgPSAxKSBidWZmZXIgICBHV2ViR1BVQnVmZmVyMCB7XFxcXG4gIHZlYzQgdV9EYXRhW107XFxcXG59IGdXZWJHUFVCdWZmZXIwO1xcXFxuXFxcXG5sYXlvdXQoc3RkNDMwLCBzZXQgPSAwLCBiaW5kaW5nID0gMikgYnVmZmVyIHJlYWRvbmx5ICBHV2ViR1BVQnVmZmVyMSB7XFxcXG4gIHZlYzQgdV9BdmVNb3ZlbWVudFtdO1xcXFxufSBnV2ViR1BVQnVmZmVyMTtcXFxcblxcXFxubGF5b3V0KHN0ZDQzMCwgc2V0ID0gMCwgYmluZGluZyA9IDMpIGJ1ZmZlciByZWFkb25seSAgR1dlYkdQVUJ1ZmZlcjIge1xcXFxuICB2ZWM0IHVfTm9kZUF0dHJpYnV0ZUFycmF5MVtdO1xcXFxufSBnV2ViR1BVQnVmZmVyMjtcXFxcblxcXFxubGF5b3V0KHN0ZDQzMCwgc2V0ID0gMCwgYmluZGluZyA9IDQpIGJ1ZmZlciByZWFkb25seSAgR1dlYkdQVUJ1ZmZlcjMge1xcXFxuICB2ZWM0IHVfTm9kZUF0dHJpYnV0ZUFycmF5MltdO1xcXFxufSBnV2ViR1BVQnVmZmVyMztcXFxcblxcXFxuXFxcXG5cXFxcbiNkZWZpbmUgTUFYX0VER0VfUEVSX1ZFUlRFWCBfX0RlZmluZVZhbHVlUGxhY2Vob2xkZXJfX01BWF9FREdFX1BFUl9WRVJURVhcXFxcbiNkZWZpbmUgVkVSVEVYX0NPVU5UIF9fRGVmaW5lVmFsdWVQbGFjZWhvbGRlcl9fVkVSVEVYX0NPVU5UXFxcXG4jZGVmaW5lIFNISUZUXzIwIDEwNDg1NzYuMFxcXFxubGF5b3V0IChcXFxcbiAgbG9jYWxfc2l6ZV94ID0gMSxcXFxcbiAgbG9jYWxfc2l6ZV95ID0gMSxcXFxcbiAgbG9jYWxfc2l6ZV96ID0gMVxcXFxuKSBpbjtcXFxcblxcXFxuXFxcXG5cXFxcblxcXFxuXFxcXG5cXFxcblxcXFxuXFxcXG5cXFxcblxcXFxuaXZlYzIgdW5wYWNrX2Zsb2F0KGZsb2F0IHBhY2tlZFZhbHVlKSB7aW50IHBhY2tlZEludFZhbHVlID0gaW50KHBhY2tlZFZhbHVlKTtcXFxcbmludCB2MCA9IHBhY2tlZEludFZhbHVlIC8gaW50KFNISUZUXzIwKTtcXFxcbnJldHVybiBpdmVjMih2MCwgcGFja2VkSW50VmFsdWUgLSAodjAgKiBpbnQoU0hJRlRfMjApKSk7fVxcXFxudmVjMiBjYWxjUmVwdWxzaXZlKGludCBpLCB2ZWM0IGN1cnJlbnROb2RlKSB7ZmxvYXQgYXggPSAwLjA7XFxcXG5mbG9hdCBheSA9IDAuMDtcXFxcbmZvciAoaW50IGogPSAwOyBqIDwgVkVSVEVYX0NPVU5UOyBqKyspIHtpZiAoaSAhPSBqKSB7dmVjNCBuZXh0Tm9kZSA9IGdXZWJHUFVCdWZmZXIwLnVfRGF0YVtqXTtcXFxcbmZsb2F0IHZ4ID0gY3VycmVudE5vZGUueCAtIG5leHROb2RlLng7XFxcXG5mbG9hdCB2eSA9IGN1cnJlbnROb2RlLnkgLSBuZXh0Tm9kZS55O1xcXFxuZmxvYXQgZGlzdCA9IHNxcnQoKHZ4ICogdngpICsgKHZ5ICogdnkpKSArIDAuMDE7XFxcXG5mbG9hdCBuX2Rpc3QgPSAoZGlzdCArIDAuMSkgKiBnV2ViR1BVVW5pZm9ybVBhcmFtcy51X2NvdWxvbWJEaXNTY2FsZTtcXFxcbmZsb2F0IGRpcmV4ID0gdnggLyBkaXN0O1xcXFxuZmxvYXQgZGlyZXkgPSB2eSAvIGRpc3Q7XFxcXG52ZWM0IGF0dHJpYnV0ZXNpID0gZ1dlYkdQVUJ1ZmZlcjIudV9Ob2RlQXR0cmlidXRlQXJyYXkxW2ldO1xcXFxudmVjNCBhdHRyaWJ1dGVzaiA9IGdXZWJHUFVCdWZmZXIyLnVfTm9kZUF0dHJpYnV0ZUFycmF5MVtqXTtcXFxcbmZsb2F0IG1hc3NpID0gYXR0cmlidXRlc2kueDtcXFxcbmZsb2F0IG5vZGVTdHJlbmd0aGkgPSBhdHRyaWJ1dGVzaS56O1xcXFxuZmxvYXQgbm9kZVN0cmVuZ3RoaiA9IGF0dHJpYnV0ZXNqLno7XFxcXG5mbG9hdCBub2RlU3RyZW5ndGggPSAobm9kZVN0cmVuZ3RoaSArIG5vZGVTdHJlbmd0aGopIC8gMi4wO1xcXFxuZmxvYXQgcGFyYW0gPSAobm9kZVN0cmVuZ3RoICogZ1dlYkdQVVVuaWZvcm1QYXJhbXMudV9mYWN0b3IpIC8gKG5fZGlzdCAqIG5fZGlzdCk7XFxcXG5heCArPSBkaXJleCAqIHBhcmFtO1xcXFxuYXkgKz0gZGlyZXkgKiBwYXJhbTt9fVxcXFxucmV0dXJuIHZlYzIoYXgsIGF5KTt9XFxcXG52ZWMyIGNhbGNHcmF2aXR5KGludCBpLCB2ZWM0IGN1cnJlbnROb2RlLCB2ZWM0IGF0dHJpYnV0ZXMyKSB7ZmxvYXQgdnggPSBjdXJyZW50Tm9kZS54IC0gYXR0cmlidXRlczIueDtcXFxcbmZsb2F0IHZ5ID0gY3VycmVudE5vZGUueSAtIGF0dHJpYnV0ZXMyLnk7XFxcXG5mbG9hdCBheCA9IHZ4ICogYXR0cmlidXRlczIuejtcXFxcbmZsb2F0IGF5ID0gdnkgKiBhdHRyaWJ1dGVzMi56O1xcXFxucmV0dXJuIHZlYzIoYXgsIGF5KTt9XFxcXG52ZWMyIGNhbGNBdHRyYWN0aXZlKGludCBpLCB2ZWM0IGN1cnJlbnROb2RlLCB2ZWM0IGF0dHJpYnV0ZXMxKSB7ZmxvYXQgbWFzcyA9IGF0dHJpYnV0ZXMxLng7XFxcXG5mbG9hdCBheCA9IDAuMDtcXFxcbmZsb2F0IGF5ID0gMC4wO1xcXFxuaXZlYzIgY29tcHJlc3NlZCA9IHVucGFja19mbG9hdChjdXJyZW50Tm9kZS56KTtcXFxcbmludCBsZW5ndGggPSBjb21wcmVzc2VkLng7XFxcXG5pbnQgYXJyX29mZnNldCA9IGNvbXByZXNzZWQueTtcXFxcbnZlYzQgbm9kZV9idWZmZXI7XFxcXG5mb3IgKGludCBwID0gMDsgcCA8IE1BWF9FREdFX1BFUl9WRVJURVg7IHArKykge2lmIChwID49IGxlbmd0aCkge2JyZWFrO31cXFxcbmludCBhcnJfaWR4ID0gYXJyX29mZnNldCArICg0ICogcCk7XFxcXG5pbnQgYnVmX29mZnNldCA9IGFycl9pZHggLSAoKGFycl9pZHggLyA0KSAqIDQpO1xcXFxuaWYgKChwID09IDApIHx8IChidWZfb2Zmc2V0ID09IDApKSB7bm9kZV9idWZmZXIgPSBnV2ViR1BVQnVmZmVyMC51X0RhdGFbaW50KGFycl9pZHggLyA0KV07fVxcXFxuZmxvYXQgZmxvYXRfaiA9IG5vZGVfYnVmZmVyLng7XFxcXG52ZWM0IG5leHROb2RlID0gZ1dlYkdQVUJ1ZmZlcjAudV9EYXRhW2ludChmbG9hdF9qKV07XFxcXG5mbG9hdCB2eCA9IG5leHROb2RlLnggLSBjdXJyZW50Tm9kZS54O1xcXFxuZmxvYXQgdnkgPSBuZXh0Tm9kZS55IC0gY3VycmVudE5vZGUueTtcXFxcbmZsb2F0IGRpc3QgPSBzcXJ0KCh2eCAqIHZ4KSArICh2eSAqIHZ5KSkgKyAwLjAxO1xcXFxuZmxvYXQgZGlyZXggPSB2eCAvIGRpc3Q7XFxcXG5mbG9hdCBkaXJleSA9IHZ5IC8gZGlzdDtcXFxcbmZsb2F0IGVkZ2VMZW5ndGggPSBub2RlX2J1ZmZlci55O1xcXFxuZmxvYXQgZWRnZVN0cmVuZ3RoID0gbm9kZV9idWZmZXIuejtcXFxcbmZsb2F0IGRpZmYgPSBlZGdlTGVuZ3RoIC0gZGlzdDtcXFxcbmZsb2F0IHBhcmFtID0gKGRpZmYgKiBlZGdlU3RyZW5ndGgpIC8gbWFzcztcXFxcbmF4IC09IGRpcmV4ICogcGFyYW07XFxcXG5heSAtPSBkaXJleSAqIHBhcmFtO31cXFxcbnJldHVybiB2ZWMyKGF4LCBheSk7fVxcXFxudm9pZCBtYWluKCkge2ludCBpID0gZ2xvYmFsSW52b2NhdGlvbklELng7XFxcXG52ZWM0IGN1cnJlbnROb2RlID0gZ1dlYkdQVUJ1ZmZlcjAudV9EYXRhW2ldO1xcXFxudmVjNCBtb3ZlbWVudCA9IGdXZWJHUFVCdWZmZXIxLnVfQXZlTW92ZW1lbnRbMF07XFxcXG5mbG9hdCBheCA9IDAuMDtcXFxcbmZsb2F0IGF5ID0gMC4wO1xcXFxuaWYgKChpID49IFZFUlRFWF9DT1VOVCkgfHwgKG1vdmVtZW50LnggPCBnV2ViR1BVVW5pZm9ybVBhcmFtcy51X21pbk1vdmVtZW50KSkge2dXZWJHUFVCdWZmZXIwLnVfRGF0YVtpXSA9IGN1cnJlbnROb2RlO1xcXFxucmV0dXJuIDt9XFxcXG52ZWM0IG5vZGVBdHRyaWJ1dGVzMSA9IGdXZWJHUFVCdWZmZXIyLnVfTm9kZUF0dHJpYnV0ZUFycmF5MVtpXTtcXFxcbnZlYzQgbm9kZUF0dHJpYnV0ZXMyID0gZ1dlYkdQVUJ1ZmZlcjMudV9Ob2RlQXR0cmlidXRlQXJyYXkyW2ldO1xcXFxudmVjMiByZXB1bHNpdmUgPSBjYWxjUmVwdWxzaXZlKGksIGN1cnJlbnROb2RlKTtcXFxcbmF4ICs9IHJlcHVsc2l2ZS54O1xcXFxuYXkgKz0gcmVwdWxzaXZlLnk7XFxcXG52ZWMyIGF0dHJhY3RpdmUgPSBjYWxjQXR0cmFjdGl2ZShpLCBjdXJyZW50Tm9kZSwgbm9kZUF0dHJpYnV0ZXMxKTtcXFxcbmF4ICs9IGF0dHJhY3RpdmUueDtcXFxcbmF5ICs9IGF0dHJhY3RpdmUueTtcXFxcbnZlYzIgZ3Jhdml0eSA9IGNhbGNHcmF2aXR5KGksIGN1cnJlbnROb2RlLCBub2RlQXR0cmlidXRlczIpO1xcXFxuYXggLT0gZ3Jhdml0eS54O1xcXFxuYXkgLT0gZ3Jhdml0eS55O1xcXFxuZmxvYXQgcGFyYW0gPSBnV2ViR1BVVW5pZm9ybVBhcmFtcy51X2ludGVydmFsICogZ1dlYkdQVVVuaWZvcm1QYXJhbXMudV9kYW1waW5nO1xcXFxuZmxvYXQgdnggPSBheCAqIHBhcmFtO1xcXFxuZmxvYXQgdnkgPSBheSAqIHBhcmFtO1xcXFxuZmxvYXQgdmxlbmd0aCA9IHNxcnQoKHZ4ICogdngpICsgKHZ5ICogdnkpKSArIDAuMDAwMTtcXFxcbmlmICh2bGVuZ3RoID4gZ1dlYkdQVVVuaWZvcm1QYXJhbXMudV9tYXhTcGVlZCkge2Zsb2F0IHBhcmFtMiA9IGdXZWJHUFVVbmlmb3JtUGFyYW1zLnVfbWF4U3BlZWQgLyB2bGVuZ3RoO1xcXFxudnggPSBwYXJhbTIgKiB2eDtcXFxcbnZ5ID0gcGFyYW0yICogdnk7fVxcXFxuZmxvYXQgZGlzdHggPSB2eCAqIGdXZWJHUFVVbmlmb3JtUGFyYW1zLnVfaW50ZXJ2YWw7XFxcXG5mbG9hdCBkaXN0eSA9IHZ5ICogZ1dlYkdQVVVuaWZvcm1QYXJhbXMudV9pbnRlcnZhbDtcXFxcbmZsb2F0IGRpc3RMZW5ndGggPSBzcXJ0KChkaXN0eCAqIGRpc3R4KSArIChkaXN0eSAqIGRpc3R5KSk7XFxcXG5pZiAoKG5vZGVBdHRyaWJ1dGVzMS53ICE9IDAuMCkgJiYgKG5vZGVBdHRyaWJ1dGVzMi53ICE9IDAuMCkpIHtnV2ViR1BVQnVmZmVyMC51X0RhdGFbaV0gPSB2ZWM0KG5vZGVBdHRyaWJ1dGVzMS53LCBub2RlQXR0cmlidXRlczIudywgY3VycmVudE5vZGUueiwgMC4wKTt9ZWxzZSB7Z1dlYkdQVUJ1ZmZlcjAudV9EYXRhW2ldID0gdmVjNChjdXJyZW50Tm9kZS54ICsgZGlzdHgsIGN1cnJlbnROb2RlLnkgKyBkaXN0eSwgY3VycmVudE5vZGUueiwgZGlzdExlbmd0aCk7fX1cXFxcblwiLFwiR0xTTDEwMFwiOlwiXFxcXG5cXFxcbmZsb2F0IGVwc2lsb24gPSAwLjAwMDAxO1xcXFxudmVjMiBhZGRyVHJhbnNsYXRpb25fMUR0bzJEKGZsb2F0IGFkZHJlc3MxRCwgdmVjMiB0ZXhTaXplKSB7XFxcXG4gIHZlYzIgY29udl9jb25zdCA9IHZlYzIoMS4wIC8gdGV4U2l6ZS54LCAxLjAgLyAodGV4U2l6ZS54ICogdGV4U2l6ZS55KSk7XFxcXG4gIHZlYzIgbm9ybUFkZHIyRCA9IGZsb2F0KGFkZHJlc3MxRCkgKiBjb252X2NvbnN0O1xcXFxuICByZXR1cm4gdmVjMihmcmFjdChub3JtQWRkcjJELnggKyBlcHNpbG9uKSwgbm9ybUFkZHIyRC55KTtcXFxcbn1cXFxcblxcXFxudm9pZCBiYXJyaWVyKCkge31cXFxcbiAgXFxcXG5cXFxcbnVuaWZvcm0gdmVjMiB1X091dHB1dFRleHR1cmVTaXplO1xcXFxudW5pZm9ybSBpbnQgdV9PdXRwdXRUZXhlbENvdW50O1xcXFxudmFyeWluZyB2ZWMyIHZfVGV4Q29vcmQ7XFxcXG5cXFxcbmJvb2wgZ1dlYkdQVURlYnVnID0gZmFsc2U7XFxcXG52ZWM0IGdXZWJHUFVEZWJ1Z091dHB1dCA9IHZlYzQoMC4wKTtcXFxcblxcXFxuI2RlZmluZSBNQVhfRURHRV9QRVJfVkVSVEVYIF9fRGVmaW5lVmFsdWVQbGFjZWhvbGRlcl9fTUFYX0VER0VfUEVSX1ZFUlRFWFxcXFxuI2RlZmluZSBWRVJURVhfQ09VTlQgX19EZWZpbmVWYWx1ZVBsYWNlaG9sZGVyX19WRVJURVhfQ09VTlRcXFxcbiNkZWZpbmUgU0hJRlRfMjAgMTA0ODU3Ni4wXFxcXG5cXFxcbnVuaWZvcm0gc2FtcGxlcjJEIHVfRGF0YTtcXFxcbnVuaWZvcm0gdmVjMiB1X0RhdGFTaXplO1xcXFxudmVjNCBnZXREYXRhdV9EYXRhKHZlYzIgYWRkcmVzczJEKSB7XFxcXG4gIHJldHVybiB2ZWM0KHRleHR1cmUyRCh1X0RhdGEsIGFkZHJlc3MyRCkucmdiYSk7XFxcXG59XFxcXG52ZWM0IGdldERhdGF1X0RhdGEoZmxvYXQgYWRkcmVzczFEKSB7XFxcXG4gIHJldHVybiBnZXREYXRhdV9EYXRhKGFkZHJUcmFuc2xhdGlvbl8xRHRvMkQoYWRkcmVzczFELCB1X0RhdGFTaXplKSk7XFxcXG59XFxcXG52ZWM0IGdldERhdGF1X0RhdGEoaW50IGFkZHJlc3MxRCkge1xcXFxuICByZXR1cm4gZ2V0RGF0YXVfRGF0YShmbG9hdChhZGRyZXNzMUQpKTtcXFxcbn1cXFxcbnVuaWZvcm0gZmxvYXQgdV9kYW1waW5nO1xcXFxudW5pZm9ybSBmbG9hdCB1X21heFNwZWVkO1xcXFxudW5pZm9ybSBmbG9hdCB1X21pbk1vdmVtZW50O1xcXFxudW5pZm9ybSBzYW1wbGVyMkQgdV9BdmVNb3ZlbWVudDtcXFxcbnVuaWZvcm0gdmVjMiB1X0F2ZU1vdmVtZW50U2l6ZTtcXFxcbnZlYzQgZ2V0RGF0YXVfQXZlTW92ZW1lbnQodmVjMiBhZGRyZXNzMkQpIHtcXFxcbiAgcmV0dXJuIHZlYzQodGV4dHVyZTJEKHVfQXZlTW92ZW1lbnQsIGFkZHJlc3MyRCkucmdiYSk7XFxcXG59XFxcXG52ZWM0IGdldERhdGF1X0F2ZU1vdmVtZW50KGZsb2F0IGFkZHJlc3MxRCkge1xcXFxuICByZXR1cm4gZ2V0RGF0YXVfQXZlTW92ZW1lbnQoYWRkclRyYW5zbGF0aW9uXzFEdG8yRChhZGRyZXNzMUQsIHVfQXZlTW92ZW1lbnRTaXplKSk7XFxcXG59XFxcXG52ZWM0IGdldERhdGF1X0F2ZU1vdmVtZW50KGludCBhZGRyZXNzMUQpIHtcXFxcbiAgcmV0dXJuIGdldERhdGF1X0F2ZU1vdmVtZW50KGZsb2F0KGFkZHJlc3MxRCkpO1xcXFxufVxcXFxudW5pZm9ybSBmbG9hdCB1X2NvdWxvbWJEaXNTY2FsZTtcXFxcbnVuaWZvcm0gZmxvYXQgdV9mYWN0b3I7XFxcXG51bmlmb3JtIHNhbXBsZXIyRCB1X05vZGVBdHRyaWJ1dGVBcnJheTE7XFxcXG51bmlmb3JtIHZlYzIgdV9Ob2RlQXR0cmlidXRlQXJyYXkxU2l6ZTtcXFxcbnZlYzQgZ2V0RGF0YXVfTm9kZUF0dHJpYnV0ZUFycmF5MSh2ZWMyIGFkZHJlc3MyRCkge1xcXFxuICByZXR1cm4gdmVjNCh0ZXh0dXJlMkQodV9Ob2RlQXR0cmlidXRlQXJyYXkxLCBhZGRyZXNzMkQpLnJnYmEpO1xcXFxufVxcXFxudmVjNCBnZXREYXRhdV9Ob2RlQXR0cmlidXRlQXJyYXkxKGZsb2F0IGFkZHJlc3MxRCkge1xcXFxuICByZXR1cm4gZ2V0RGF0YXVfTm9kZUF0dHJpYnV0ZUFycmF5MShhZGRyVHJhbnNsYXRpb25fMUR0bzJEKGFkZHJlc3MxRCwgdV9Ob2RlQXR0cmlidXRlQXJyYXkxU2l6ZSkpO1xcXFxufVxcXFxudmVjNCBnZXREYXRhdV9Ob2RlQXR0cmlidXRlQXJyYXkxKGludCBhZGRyZXNzMUQpIHtcXFxcbiAgcmV0dXJuIGdldERhdGF1X05vZGVBdHRyaWJ1dGVBcnJheTEoZmxvYXQoYWRkcmVzczFEKSk7XFxcXG59XFxcXG51bmlmb3JtIHNhbXBsZXIyRCB1X05vZGVBdHRyaWJ1dGVBcnJheTI7XFxcXG51bmlmb3JtIHZlYzIgdV9Ob2RlQXR0cmlidXRlQXJyYXkyU2l6ZTtcXFxcbnZlYzQgZ2V0RGF0YXVfTm9kZUF0dHJpYnV0ZUFycmF5Mih2ZWMyIGFkZHJlc3MyRCkge1xcXFxuICByZXR1cm4gdmVjNCh0ZXh0dXJlMkQodV9Ob2RlQXR0cmlidXRlQXJyYXkyLCBhZGRyZXNzMkQpLnJnYmEpO1xcXFxufVxcXFxudmVjNCBnZXREYXRhdV9Ob2RlQXR0cmlidXRlQXJyYXkyKGZsb2F0IGFkZHJlc3MxRCkge1xcXFxuICByZXR1cm4gZ2V0RGF0YXVfTm9kZUF0dHJpYnV0ZUFycmF5MihhZGRyVHJhbnNsYXRpb25fMUR0bzJEKGFkZHJlc3MxRCwgdV9Ob2RlQXR0cmlidXRlQXJyYXkyU2l6ZSkpO1xcXFxufVxcXFxudmVjNCBnZXREYXRhdV9Ob2RlQXR0cmlidXRlQXJyYXkyKGludCBhZGRyZXNzMUQpIHtcXFxcbiAgcmV0dXJuIGdldERhdGF1X05vZGVBdHRyaWJ1dGVBcnJheTIoZmxvYXQoYWRkcmVzczFEKSk7XFxcXG59XFxcXG51bmlmb3JtIGZsb2F0IHVfaW50ZXJ2YWw7XFxcXG5pdmVjMiB1bnBhY2tfZmxvYXQoZmxvYXQgcGFja2VkVmFsdWUpIHtcXFxcbml2ZWMzIHdvcmtHcm91cFNpemUgPSBpdmVjMygxLCAxLCAxKTtcXFxcbml2ZWMzIG51bVdvcmtHcm91cHMgPSBpdmVjMygxLCAxLCAxKTsgICAgIFxcXFxuaW50IGdsb2JhbEludm9jYXRpb25JbmRleCA9IGludChmbG9vcih2X1RleENvb3JkLnggKiB1X091dHB1dFRleHR1cmVTaXplLngpKVxcXFxuICArIGludChmbG9vcih2X1RleENvb3JkLnkgKiB1X091dHB1dFRleHR1cmVTaXplLnkpKSAqIGludCh1X091dHB1dFRleHR1cmVTaXplLngpO1xcXFxuaW50IHdvcmtHcm91cElETGVuZ3RoID0gZ2xvYmFsSW52b2NhdGlvbkluZGV4IC8gKHdvcmtHcm91cFNpemUueCAqIHdvcmtHcm91cFNpemUueSAqIHdvcmtHcm91cFNpemUueik7XFxcXG5pdmVjMyB3b3JrR3JvdXBJRCA9IGl2ZWMzKHdvcmtHcm91cElETGVuZ3RoIC8gbnVtV29ya0dyb3Vwcy55IC8gbnVtV29ya0dyb3Vwcy56LCB3b3JrR3JvdXBJRExlbmd0aCAvIG51bVdvcmtHcm91cHMueCAvIG51bVdvcmtHcm91cHMueiwgd29ya0dyb3VwSURMZW5ndGggLyBudW1Xb3JrR3JvdXBzLnggLyBudW1Xb3JrR3JvdXBzLnkpO1xcXFxuaW50IGxvY2FsSW52b2NhdGlvbklEWiA9IGdsb2JhbEludm9jYXRpb25JbmRleCAvICh3b3JrR3JvdXBTaXplLnggKiB3b3JrR3JvdXBTaXplLnkpO1xcXFxuaW50IGxvY2FsSW52b2NhdGlvbklEWSA9IChnbG9iYWxJbnZvY2F0aW9uSW5kZXggLSBsb2NhbEludm9jYXRpb25JRFogKiB3b3JrR3JvdXBTaXplLnggKiB3b3JrR3JvdXBTaXplLnkpIC8gd29ya0dyb3VwU2l6ZS54O1xcXFxuaW50IGxvY2FsSW52b2NhdGlvbklEWCA9IGdsb2JhbEludm9jYXRpb25JbmRleCAtIGxvY2FsSW52b2NhdGlvbklEWiAqIHdvcmtHcm91cFNpemUueCAqIHdvcmtHcm91cFNpemUueSAtIGxvY2FsSW52b2NhdGlvbklEWSAqIHdvcmtHcm91cFNpemUueDtcXFxcbml2ZWMzIGxvY2FsSW52b2NhdGlvbklEID0gaXZlYzMobG9jYWxJbnZvY2F0aW9uSURYLCBsb2NhbEludm9jYXRpb25JRFksIGxvY2FsSW52b2NhdGlvbklEWik7XFxcXG5pdmVjMyBnbG9iYWxJbnZvY2F0aW9uSUQgPSB3b3JrR3JvdXBJRCAqIHdvcmtHcm91cFNpemUgKyBsb2NhbEludm9jYXRpb25JRDtcXFxcbmludCBsb2NhbEludm9jYXRpb25JbmRleCA9IGxvY2FsSW52b2NhdGlvbklELnogKiB3b3JrR3JvdXBTaXplLnggKiB3b3JrR3JvdXBTaXplLnlcXFxcbiAgICAgICAgICAgICAgICArIGxvY2FsSW52b2NhdGlvbklELnkgKiB3b3JrR3JvdXBTaXplLnggKyBsb2NhbEludm9jYXRpb25JRC54O1xcXFxuaW50IHBhY2tlZEludFZhbHVlID0gaW50KHBhY2tlZFZhbHVlKTtcXFxcbmludCB2MCA9IHBhY2tlZEludFZhbHVlIC8gaW50KFNISUZUXzIwKTtcXFxcbnJldHVybiBpdmVjMih2MCwgcGFja2VkSW50VmFsdWUgLSAodjAgKiBpbnQoU0hJRlRfMjApKSk7fVxcXFxudmVjMiBjYWxjUmVwdWxzaXZlKGludCBpLCB2ZWM0IGN1cnJlbnROb2RlKSB7XFxcXG5pdmVjMyB3b3JrR3JvdXBTaXplID0gaXZlYzMoMSwgMSwgMSk7XFxcXG5pdmVjMyBudW1Xb3JrR3JvdXBzID0gaXZlYzMoMSwgMSwgMSk7ICAgICBcXFxcbmludCBnbG9iYWxJbnZvY2F0aW9uSW5kZXggPSBpbnQoZmxvb3Iodl9UZXhDb29yZC54ICogdV9PdXRwdXRUZXh0dXJlU2l6ZS54KSlcXFxcbiAgKyBpbnQoZmxvb3Iodl9UZXhDb29yZC55ICogdV9PdXRwdXRUZXh0dXJlU2l6ZS55KSkgKiBpbnQodV9PdXRwdXRUZXh0dXJlU2l6ZS54KTtcXFxcbmludCB3b3JrR3JvdXBJRExlbmd0aCA9IGdsb2JhbEludm9jYXRpb25JbmRleCAvICh3b3JrR3JvdXBTaXplLnggKiB3b3JrR3JvdXBTaXplLnkgKiB3b3JrR3JvdXBTaXplLnopO1xcXFxuaXZlYzMgd29ya0dyb3VwSUQgPSBpdmVjMyh3b3JrR3JvdXBJRExlbmd0aCAvIG51bVdvcmtHcm91cHMueSAvIG51bVdvcmtHcm91cHMueiwgd29ya0dyb3VwSURMZW5ndGggLyBudW1Xb3JrR3JvdXBzLnggLyBudW1Xb3JrR3JvdXBzLnosIHdvcmtHcm91cElETGVuZ3RoIC8gbnVtV29ya0dyb3Vwcy54IC8gbnVtV29ya0dyb3Vwcy55KTtcXFxcbmludCBsb2NhbEludm9jYXRpb25JRFogPSBnbG9iYWxJbnZvY2F0aW9uSW5kZXggLyAod29ya0dyb3VwU2l6ZS54ICogd29ya0dyb3VwU2l6ZS55KTtcXFxcbmludCBsb2NhbEludm9jYXRpb25JRFkgPSAoZ2xvYmFsSW52b2NhdGlvbkluZGV4IC0gbG9jYWxJbnZvY2F0aW9uSURaICogd29ya0dyb3VwU2l6ZS54ICogd29ya0dyb3VwU2l6ZS55KSAvIHdvcmtHcm91cFNpemUueDtcXFxcbmludCBsb2NhbEludm9jYXRpb25JRFggPSBnbG9iYWxJbnZvY2F0aW9uSW5kZXggLSBsb2NhbEludm9jYXRpb25JRFogKiB3b3JrR3JvdXBTaXplLnggKiB3b3JrR3JvdXBTaXplLnkgLSBsb2NhbEludm9jYXRpb25JRFkgKiB3b3JrR3JvdXBTaXplLng7XFxcXG5pdmVjMyBsb2NhbEludm9jYXRpb25JRCA9IGl2ZWMzKGxvY2FsSW52b2NhdGlvbklEWCwgbG9jYWxJbnZvY2F0aW9uSURZLCBsb2NhbEludm9jYXRpb25JRFopO1xcXFxuaXZlYzMgZ2xvYmFsSW52b2NhdGlvbklEID0gd29ya0dyb3VwSUQgKiB3b3JrR3JvdXBTaXplICsgbG9jYWxJbnZvY2F0aW9uSUQ7XFxcXG5pbnQgbG9jYWxJbnZvY2F0aW9uSW5kZXggPSBsb2NhbEludm9jYXRpb25JRC56ICogd29ya0dyb3VwU2l6ZS54ICogd29ya0dyb3VwU2l6ZS55XFxcXG4gICAgICAgICAgICAgICAgKyBsb2NhbEludm9jYXRpb25JRC55ICogd29ya0dyb3VwU2l6ZS54ICsgbG9jYWxJbnZvY2F0aW9uSUQueDtcXFxcbmZsb2F0IGF4ID0gMC4wO1xcXFxuZmxvYXQgYXkgPSAwLjA7XFxcXG5mb3IgKGludCBqID0gMDsgaiA8IFZFUlRFWF9DT1VOVDsgaisrKSB7aWYgKGkgIT0gaikge3ZlYzQgbmV4dE5vZGUgPSBnZXREYXRhdV9EYXRhKGopO1xcXFxuZmxvYXQgdnggPSBjdXJyZW50Tm9kZS54IC0gbmV4dE5vZGUueDtcXFxcbmZsb2F0IHZ5ID0gY3VycmVudE5vZGUueSAtIG5leHROb2RlLnk7XFxcXG5mbG9hdCBkaXN0ID0gc3FydCgodnggKiB2eCkgKyAodnkgKiB2eSkpICsgMC4wMTtcXFxcbmZsb2F0IG5fZGlzdCA9IChkaXN0ICsgMC4xKSAqIHVfY291bG9tYkRpc1NjYWxlO1xcXFxuZmxvYXQgZGlyZXggPSB2eCAvIGRpc3Q7XFxcXG5mbG9hdCBkaXJleSA9IHZ5IC8gZGlzdDtcXFxcbnZlYzQgYXR0cmlidXRlc2kgPSBnZXREYXRhdV9Ob2RlQXR0cmlidXRlQXJyYXkxKGkpO1xcXFxudmVjNCBhdHRyaWJ1dGVzaiA9IGdldERhdGF1X05vZGVBdHRyaWJ1dGVBcnJheTEoaik7XFxcXG5mbG9hdCBtYXNzaSA9IGF0dHJpYnV0ZXNpLng7XFxcXG5mbG9hdCBub2RlU3RyZW5ndGhpID0gYXR0cmlidXRlc2kuejtcXFxcbmZsb2F0IG5vZGVTdHJlbmd0aGogPSBhdHRyaWJ1dGVzai56O1xcXFxuZmxvYXQgbm9kZVN0cmVuZ3RoID0gKG5vZGVTdHJlbmd0aGkgKyBub2RlU3RyZW5ndGhqKSAvIDIuMDtcXFxcbmZsb2F0IHBhcmFtID0gKG5vZGVTdHJlbmd0aCAqIHVfZmFjdG9yKSAvIChuX2Rpc3QgKiBuX2Rpc3QpO1xcXFxuYXggKz0gZGlyZXggKiBwYXJhbTtcXFxcbmF5ICs9IGRpcmV5ICogcGFyYW07fX1cXFxcbnJldHVybiB2ZWMyKGF4LCBheSk7fVxcXFxudmVjMiBjYWxjR3Jhdml0eShpbnQgaSwgdmVjNCBjdXJyZW50Tm9kZSwgdmVjNCBhdHRyaWJ1dGVzMikge1xcXFxuaXZlYzMgd29ya0dyb3VwU2l6ZSA9IGl2ZWMzKDEsIDEsIDEpO1xcXFxuaXZlYzMgbnVtV29ya0dyb3VwcyA9IGl2ZWMzKDEsIDEsIDEpOyAgICAgXFxcXG5pbnQgZ2xvYmFsSW52b2NhdGlvbkluZGV4ID0gaW50KGZsb29yKHZfVGV4Q29vcmQueCAqIHVfT3V0cHV0VGV4dHVyZVNpemUueCkpXFxcXG4gICsgaW50KGZsb29yKHZfVGV4Q29vcmQueSAqIHVfT3V0cHV0VGV4dHVyZVNpemUueSkpICogaW50KHVfT3V0cHV0VGV4dHVyZVNpemUueCk7XFxcXG5pbnQgd29ya0dyb3VwSURMZW5ndGggPSBnbG9iYWxJbnZvY2F0aW9uSW5kZXggLyAod29ya0dyb3VwU2l6ZS54ICogd29ya0dyb3VwU2l6ZS55ICogd29ya0dyb3VwU2l6ZS56KTtcXFxcbml2ZWMzIHdvcmtHcm91cElEID0gaXZlYzMod29ya0dyb3VwSURMZW5ndGggLyBudW1Xb3JrR3JvdXBzLnkgLyBudW1Xb3JrR3JvdXBzLnosIHdvcmtHcm91cElETGVuZ3RoIC8gbnVtV29ya0dyb3Vwcy54IC8gbnVtV29ya0dyb3Vwcy56LCB3b3JrR3JvdXBJRExlbmd0aCAvIG51bVdvcmtHcm91cHMueCAvIG51bVdvcmtHcm91cHMueSk7XFxcXG5pbnQgbG9jYWxJbnZvY2F0aW9uSURaID0gZ2xvYmFsSW52b2NhdGlvbkluZGV4IC8gKHdvcmtHcm91cFNpemUueCAqIHdvcmtHcm91cFNpemUueSk7XFxcXG5pbnQgbG9jYWxJbnZvY2F0aW9uSURZID0gKGdsb2JhbEludm9jYXRpb25JbmRleCAtIGxvY2FsSW52b2NhdGlvbklEWiAqIHdvcmtHcm91cFNpemUueCAqIHdvcmtHcm91cFNpemUueSkgLyB3b3JrR3JvdXBTaXplLng7XFxcXG5pbnQgbG9jYWxJbnZvY2F0aW9uSURYID0gZ2xvYmFsSW52b2NhdGlvbkluZGV4IC0gbG9jYWxJbnZvY2F0aW9uSURaICogd29ya0dyb3VwU2l6ZS54ICogd29ya0dyb3VwU2l6ZS55IC0gbG9jYWxJbnZvY2F0aW9uSURZICogd29ya0dyb3VwU2l6ZS54O1xcXFxuaXZlYzMgbG9jYWxJbnZvY2F0aW9uSUQgPSBpdmVjMyhsb2NhbEludm9jYXRpb25JRFgsIGxvY2FsSW52b2NhdGlvbklEWSwgbG9jYWxJbnZvY2F0aW9uSURaKTtcXFxcbml2ZWMzIGdsb2JhbEludm9jYXRpb25JRCA9IHdvcmtHcm91cElEICogd29ya0dyb3VwU2l6ZSArIGxvY2FsSW52b2NhdGlvbklEO1xcXFxuaW50IGxvY2FsSW52b2NhdGlvbkluZGV4ID0gbG9jYWxJbnZvY2F0aW9uSUQueiAqIHdvcmtHcm91cFNpemUueCAqIHdvcmtHcm91cFNpemUueVxcXFxuICAgICAgICAgICAgICAgICsgbG9jYWxJbnZvY2F0aW9uSUQueSAqIHdvcmtHcm91cFNpemUueCArIGxvY2FsSW52b2NhdGlvbklELng7XFxcXG5mbG9hdCB2eCA9IGN1cnJlbnROb2RlLnggLSBhdHRyaWJ1dGVzMi54O1xcXFxuZmxvYXQgdnkgPSBjdXJyZW50Tm9kZS55IC0gYXR0cmlidXRlczIueTtcXFxcbmZsb2F0IGF4ID0gdnggKiBhdHRyaWJ1dGVzMi56O1xcXFxuZmxvYXQgYXkgPSB2eSAqIGF0dHJpYnV0ZXMyLno7XFxcXG5yZXR1cm4gdmVjMihheCwgYXkpO31cXFxcbnZlYzIgY2FsY0F0dHJhY3RpdmUoaW50IGksIHZlYzQgY3VycmVudE5vZGUsIHZlYzQgYXR0cmlidXRlczEpIHtcXFxcbml2ZWMzIHdvcmtHcm91cFNpemUgPSBpdmVjMygxLCAxLCAxKTtcXFxcbml2ZWMzIG51bVdvcmtHcm91cHMgPSBpdmVjMygxLCAxLCAxKTsgICAgIFxcXFxuaW50IGdsb2JhbEludm9jYXRpb25JbmRleCA9IGludChmbG9vcih2X1RleENvb3JkLnggKiB1X091dHB1dFRleHR1cmVTaXplLngpKVxcXFxuICArIGludChmbG9vcih2X1RleENvb3JkLnkgKiB1X091dHB1dFRleHR1cmVTaXplLnkpKSAqIGludCh1X091dHB1dFRleHR1cmVTaXplLngpO1xcXFxuaW50IHdvcmtHcm91cElETGVuZ3RoID0gZ2xvYmFsSW52b2NhdGlvbkluZGV4IC8gKHdvcmtHcm91cFNpemUueCAqIHdvcmtHcm91cFNpemUueSAqIHdvcmtHcm91cFNpemUueik7XFxcXG5pdmVjMyB3b3JrR3JvdXBJRCA9IGl2ZWMzKHdvcmtHcm91cElETGVuZ3RoIC8gbnVtV29ya0dyb3Vwcy55IC8gbnVtV29ya0dyb3Vwcy56LCB3b3JrR3JvdXBJRExlbmd0aCAvIG51bVdvcmtHcm91cHMueCAvIG51bVdvcmtHcm91cHMueiwgd29ya0dyb3VwSURMZW5ndGggLyBudW1Xb3JrR3JvdXBzLnggLyBudW1Xb3JrR3JvdXBzLnkpO1xcXFxuaW50IGxvY2FsSW52b2NhdGlvbklEWiA9IGdsb2JhbEludm9jYXRpb25JbmRleCAvICh3b3JrR3JvdXBTaXplLnggKiB3b3JrR3JvdXBTaXplLnkpO1xcXFxuaW50IGxvY2FsSW52b2NhdGlvbklEWSA9IChnbG9iYWxJbnZvY2F0aW9uSW5kZXggLSBsb2NhbEludm9jYXRpb25JRFogKiB3b3JrR3JvdXBTaXplLnggKiB3b3JrR3JvdXBTaXplLnkpIC8gd29ya0dyb3VwU2l6ZS54O1xcXFxuaW50IGxvY2FsSW52b2NhdGlvbklEWCA9IGdsb2JhbEludm9jYXRpb25JbmRleCAtIGxvY2FsSW52b2NhdGlvbklEWiAqIHdvcmtHcm91cFNpemUueCAqIHdvcmtHcm91cFNpemUueSAtIGxvY2FsSW52b2NhdGlvbklEWSAqIHdvcmtHcm91cFNpemUueDtcXFxcbml2ZWMzIGxvY2FsSW52b2NhdGlvbklEID0gaXZlYzMobG9jYWxJbnZvY2F0aW9uSURYLCBsb2NhbEludm9jYXRpb25JRFksIGxvY2FsSW52b2NhdGlvbklEWik7XFxcXG5pdmVjMyBnbG9iYWxJbnZvY2F0aW9uSUQgPSB3b3JrR3JvdXBJRCAqIHdvcmtHcm91cFNpemUgKyBsb2NhbEludm9jYXRpb25JRDtcXFxcbmludCBsb2NhbEludm9jYXRpb25JbmRleCA9IGxvY2FsSW52b2NhdGlvbklELnogKiB3b3JrR3JvdXBTaXplLnggKiB3b3JrR3JvdXBTaXplLnlcXFxcbiAgICAgICAgICAgICAgICArIGxvY2FsSW52b2NhdGlvbklELnkgKiB3b3JrR3JvdXBTaXplLnggKyBsb2NhbEludm9jYXRpb25JRC54O1xcXFxuZmxvYXQgbWFzcyA9IGF0dHJpYnV0ZXMxLng7XFxcXG5mbG9hdCBheCA9IDAuMDtcXFxcbmZsb2F0IGF5ID0gMC4wO1xcXFxuaXZlYzIgY29tcHJlc3NlZCA9IHVucGFja19mbG9hdChjdXJyZW50Tm9kZS56KTtcXFxcbmludCBsZW5ndGggPSBjb21wcmVzc2VkLng7XFxcXG5pbnQgYXJyX29mZnNldCA9IGNvbXByZXNzZWQueTtcXFxcbnZlYzQgbm9kZV9idWZmZXI7XFxcXG5mb3IgKGludCBwID0gMDsgcCA8IE1BWF9FREdFX1BFUl9WRVJURVg7IHArKykge2lmIChwID49IGxlbmd0aCkge2JyZWFrO31cXFxcbmludCBhcnJfaWR4ID0gYXJyX29mZnNldCArICg0ICogcCk7XFxcXG5pbnQgYnVmX29mZnNldCA9IGFycl9pZHggLSAoKGFycl9pZHggLyA0KSAqIDQpO1xcXFxuaWYgKChwID09IDApIHx8IChidWZfb2Zmc2V0ID09IDApKSB7bm9kZV9idWZmZXIgPSBnZXREYXRhdV9EYXRhKGludChhcnJfaWR4IC8gNCkpO31cXFxcbmZsb2F0IGZsb2F0X2ogPSBub2RlX2J1ZmZlci54O1xcXFxudmVjNCBuZXh0Tm9kZSA9IGdldERhdGF1X0RhdGEoaW50KGZsb2F0X2opKTtcXFxcbmZsb2F0IHZ4ID0gbmV4dE5vZGUueCAtIGN1cnJlbnROb2RlLng7XFxcXG5mbG9hdCB2eSA9IG5leHROb2RlLnkgLSBjdXJyZW50Tm9kZS55O1xcXFxuZmxvYXQgZGlzdCA9IHNxcnQoKHZ4ICogdngpICsgKHZ5ICogdnkpKSArIDAuMDE7XFxcXG5mbG9hdCBkaXJleCA9IHZ4IC8gZGlzdDtcXFxcbmZsb2F0IGRpcmV5ID0gdnkgLyBkaXN0O1xcXFxuZmxvYXQgZWRnZUxlbmd0aCA9IG5vZGVfYnVmZmVyLnk7XFxcXG5mbG9hdCBlZGdlU3RyZW5ndGggPSBub2RlX2J1ZmZlci56O1xcXFxuZmxvYXQgZGlmZiA9IGVkZ2VMZW5ndGggLSBkaXN0O1xcXFxuZmxvYXQgcGFyYW0gPSAoZGlmZiAqIGVkZ2VTdHJlbmd0aCkgLyBtYXNzO1xcXFxuYXggLT0gZGlyZXggKiBwYXJhbTtcXFxcbmF5IC09IGRpcmV5ICogcGFyYW07fVxcXFxucmV0dXJuIHZlYzIoYXgsIGF5KTt9XFxcXG52b2lkIG1haW4oKSB7XFxcXG5pdmVjMyB3b3JrR3JvdXBTaXplID0gaXZlYzMoMSwgMSwgMSk7XFxcXG5pdmVjMyBudW1Xb3JrR3JvdXBzID0gaXZlYzMoMSwgMSwgMSk7ICAgICBcXFxcbmludCBnbG9iYWxJbnZvY2F0aW9uSW5kZXggPSBpbnQoZmxvb3Iodl9UZXhDb29yZC54ICogdV9PdXRwdXRUZXh0dXJlU2l6ZS54KSlcXFxcbiAgKyBpbnQoZmxvb3Iodl9UZXhDb29yZC55ICogdV9PdXRwdXRUZXh0dXJlU2l6ZS55KSkgKiBpbnQodV9PdXRwdXRUZXh0dXJlU2l6ZS54KTtcXFxcbmludCB3b3JrR3JvdXBJRExlbmd0aCA9IGdsb2JhbEludm9jYXRpb25JbmRleCAvICh3b3JrR3JvdXBTaXplLnggKiB3b3JrR3JvdXBTaXplLnkgKiB3b3JrR3JvdXBTaXplLnopO1xcXFxuaXZlYzMgd29ya0dyb3VwSUQgPSBpdmVjMyh3b3JrR3JvdXBJRExlbmd0aCAvIG51bVdvcmtHcm91cHMueSAvIG51bVdvcmtHcm91cHMueiwgd29ya0dyb3VwSURMZW5ndGggLyBudW1Xb3JrR3JvdXBzLnggLyBudW1Xb3JrR3JvdXBzLnosIHdvcmtHcm91cElETGVuZ3RoIC8gbnVtV29ya0dyb3Vwcy54IC8gbnVtV29ya0dyb3Vwcy55KTtcXFxcbmludCBsb2NhbEludm9jYXRpb25JRFogPSBnbG9iYWxJbnZvY2F0aW9uSW5kZXggLyAod29ya0dyb3VwU2l6ZS54ICogd29ya0dyb3VwU2l6ZS55KTtcXFxcbmludCBsb2NhbEludm9jYXRpb25JRFkgPSAoZ2xvYmFsSW52b2NhdGlvbkluZGV4IC0gbG9jYWxJbnZvY2F0aW9uSURaICogd29ya0dyb3VwU2l6ZS54ICogd29ya0dyb3VwU2l6ZS55KSAvIHdvcmtHcm91cFNpemUueDtcXFxcbmludCBsb2NhbEludm9jYXRpb25JRFggPSBnbG9iYWxJbnZvY2F0aW9uSW5kZXggLSBsb2NhbEludm9jYXRpb25JRFogKiB3b3JrR3JvdXBTaXplLnggKiB3b3JrR3JvdXBTaXplLnkgLSBsb2NhbEludm9jYXRpb25JRFkgKiB3b3JrR3JvdXBTaXplLng7XFxcXG5pdmVjMyBsb2NhbEludm9jYXRpb25JRCA9IGl2ZWMzKGxvY2FsSW52b2NhdGlvbklEWCwgbG9jYWxJbnZvY2F0aW9uSURZLCBsb2NhbEludm9jYXRpb25JRFopO1xcXFxuaXZlYzMgZ2xvYmFsSW52b2NhdGlvbklEID0gd29ya0dyb3VwSUQgKiB3b3JrR3JvdXBTaXplICsgbG9jYWxJbnZvY2F0aW9uSUQ7XFxcXG5pbnQgbG9jYWxJbnZvY2F0aW9uSW5kZXggPSBsb2NhbEludm9jYXRpb25JRC56ICogd29ya0dyb3VwU2l6ZS54ICogd29ya0dyb3VwU2l6ZS55XFxcXG4gICAgICAgICAgICAgICAgKyBsb2NhbEludm9jYXRpb25JRC55ICogd29ya0dyb3VwU2l6ZS54ICsgbG9jYWxJbnZvY2F0aW9uSUQueDtcXFxcbmludCBpID0gZ2xvYmFsSW52b2NhdGlvbklELng7XFxcXG52ZWM0IGN1cnJlbnROb2RlID0gZ2V0RGF0YXVfRGF0YShpKTtcXFxcbnZlYzQgbW92ZW1lbnQgPSBnZXREYXRhdV9BdmVNb3ZlbWVudCgwLjApO1xcXFxuZmxvYXQgYXggPSAwLjA7XFxcXG5mbG9hdCBheSA9IDAuMDtcXFxcbmlmICgoaSA+PSBWRVJURVhfQ09VTlQpIHx8IChtb3ZlbWVudC54IDwgdV9taW5Nb3ZlbWVudCkpIHtnbF9GcmFnQ29sb3IgPSB2ZWM0KGN1cnJlbnROb2RlKTtcXFxcbnJldHVybiA7fVxcXFxudmVjNCBub2RlQXR0cmlidXRlczEgPSBnZXREYXRhdV9Ob2RlQXR0cmlidXRlQXJyYXkxKGkpO1xcXFxudmVjNCBub2RlQXR0cmlidXRlczIgPSBnZXREYXRhdV9Ob2RlQXR0cmlidXRlQXJyYXkyKGkpO1xcXFxudmVjMiByZXB1bHNpdmUgPSBjYWxjUmVwdWxzaXZlKGksIGN1cnJlbnROb2RlKTtcXFxcbmF4ICs9IHJlcHVsc2l2ZS54O1xcXFxuYXkgKz0gcmVwdWxzaXZlLnk7XFxcXG52ZWMyIGF0dHJhY3RpdmUgPSBjYWxjQXR0cmFjdGl2ZShpLCBjdXJyZW50Tm9kZSwgbm9kZUF0dHJpYnV0ZXMxKTtcXFxcbmF4ICs9IGF0dHJhY3RpdmUueDtcXFxcbmF5ICs9IGF0dHJhY3RpdmUueTtcXFxcbnZlYzIgZ3Jhdml0eSA9IGNhbGNHcmF2aXR5KGksIGN1cnJlbnROb2RlLCBub2RlQXR0cmlidXRlczIpO1xcXFxuYXggLT0gZ3Jhdml0eS54O1xcXFxuYXkgLT0gZ3Jhdml0eS55O1xcXFxuZmxvYXQgcGFyYW0gPSB1X2ludGVydmFsICogdV9kYW1waW5nO1xcXFxuZmxvYXQgdnggPSBheCAqIHBhcmFtO1xcXFxuZmxvYXQgdnkgPSBheSAqIHBhcmFtO1xcXFxuZmxvYXQgdmxlbmd0aCA9IHNxcnQoKHZ4ICogdngpICsgKHZ5ICogdnkpKSArIDAuMDAwMTtcXFxcbmlmICh2bGVuZ3RoID4gdV9tYXhTcGVlZCkge2Zsb2F0IHBhcmFtMiA9IHVfbWF4U3BlZWQgLyB2bGVuZ3RoO1xcXFxudnggPSBwYXJhbTIgKiB2eDtcXFxcbnZ5ID0gcGFyYW0yICogdnk7fVxcXFxuZmxvYXQgZGlzdHggPSB2eCAqIHVfaW50ZXJ2YWw7XFxcXG5mbG9hdCBkaXN0eSA9IHZ5ICogdV9pbnRlcnZhbDtcXFxcbmZsb2F0IGRpc3RMZW5ndGggPSBzcXJ0KChkaXN0eCAqIGRpc3R4KSArIChkaXN0eSAqIGRpc3R5KSk7XFxcXG5pZiAoKG5vZGVBdHRyaWJ1dGVzMS53ICE9IDAuMCkgJiYgKG5vZGVBdHRyaWJ1dGVzMi53ICE9IDAuMCkpIHtnbF9GcmFnQ29sb3IgPSB2ZWM0KHZlYzQobm9kZUF0dHJpYnV0ZXMxLncsIG5vZGVBdHRyaWJ1dGVzMi53LCBjdXJyZW50Tm9kZS56LCAwLjApKTt9ZWxzZSB7Z2xfRnJhZ0NvbG9yID0gdmVjNCh2ZWM0KGN1cnJlbnROb2RlLnggKyBkaXN0eCwgY3VycmVudE5vZGUueSArIGRpc3R5LCBjdXJyZW50Tm9kZS56LCBkaXN0TGVuZ3RoKSk7fWlmIChnV2ViR1BVRGVidWcpIHtcXFxcbiAgZ2xfRnJhZ0NvbG9yID0gZ1dlYkdQVURlYnVnT3V0cHV0O1xcXFxufX1cXFxcblwifSxcImNvbnRleHRcIjp7XCJuYW1lXCI6XCJcIixcImRpc3BhdGNoXCI6WzEsMSwxXSxcInRocmVhZEdyb3VwU2l6ZVwiOlsxLDEsMV0sXCJtYXhJdGVyYXRpb25cIjoxLFwiZGVmaW5lc1wiOlt7XCJuYW1lXCI6XCJNQVhfRURHRV9QRVJfVkVSVEVYXCIsXCJ0eXBlXCI6XCJGbG9hdFwiLFwicnVudGltZVwiOnRydWV9LHtcIm5hbWVcIjpcIlZFUlRFWF9DT1VOVFwiLFwidHlwZVwiOlwiRmxvYXRcIixcInJ1bnRpbWVcIjp0cnVlfSx7XCJuYW1lXCI6XCJTSElGVF8yMFwiLFwidHlwZVwiOlwiRmxvYXRcIixcInZhbHVlXCI6MTA0ODU3NixcInJ1bnRpbWVcIjpmYWxzZX1dLFwidW5pZm9ybXNcIjpbe1wibmFtZVwiOlwidV9EYXRhXCIsXCJ0eXBlXCI6XCJ2ZWM0PGYzMj5bXVwiLFwic3RvcmFnZUNsYXNzXCI6XCJTdG9yYWdlQnVmZmVyXCIsXCJyZWFkb25seVwiOmZhbHNlLFwid3JpdGVvbmx5XCI6ZmFsc2UsXCJzaXplXCI6WzEsMV19LHtcIm5hbWVcIjpcInVfZGFtcGluZ1wiLFwidHlwZVwiOlwiRmxvYXRcIixcInN0b3JhZ2VDbGFzc1wiOlwiVW5pZm9ybVwiLFwicmVhZG9ubHlcIjp0cnVlLFwid3JpdGVvbmx5XCI6ZmFsc2UsXCJzaXplXCI6WzEsMV19LHtcIm5hbWVcIjpcInVfbWF4U3BlZWRcIixcInR5cGVcIjpcIkZsb2F0XCIsXCJzdG9yYWdlQ2xhc3NcIjpcIlVuaWZvcm1cIixcInJlYWRvbmx5XCI6dHJ1ZSxcIndyaXRlb25seVwiOmZhbHNlLFwic2l6ZVwiOlsxLDFdfSx7XCJuYW1lXCI6XCJ1X21pbk1vdmVtZW50XCIsXCJ0eXBlXCI6XCJGbG9hdFwiLFwic3RvcmFnZUNsYXNzXCI6XCJVbmlmb3JtXCIsXCJyZWFkb25seVwiOnRydWUsXCJ3cml0ZW9ubHlcIjpmYWxzZSxcInNpemVcIjpbMSwxXX0se1wibmFtZVwiOlwidV9BdmVNb3ZlbWVudFwiLFwidHlwZVwiOlwidmVjNDxmMzI+W11cIixcInN0b3JhZ2VDbGFzc1wiOlwiU3RvcmFnZUJ1ZmZlclwiLFwicmVhZG9ubHlcIjp0cnVlLFwid3JpdGVvbmx5XCI6ZmFsc2UsXCJzaXplXCI6WzEsMV19LHtcIm5hbWVcIjpcInVfY291bG9tYkRpc1NjYWxlXCIsXCJ0eXBlXCI6XCJGbG9hdFwiLFwic3RvcmFnZUNsYXNzXCI6XCJVbmlmb3JtXCIsXCJyZWFkb25seVwiOnRydWUsXCJ3cml0ZW9ubHlcIjpmYWxzZSxcInNpemVcIjpbMSwxXX0se1wibmFtZVwiOlwidV9mYWN0b3JcIixcInR5cGVcIjpcIkZsb2F0XCIsXCJzdG9yYWdlQ2xhc3NcIjpcIlVuaWZvcm1cIixcInJlYWRvbmx5XCI6dHJ1ZSxcIndyaXRlb25seVwiOmZhbHNlLFwic2l6ZVwiOlsxLDFdfSx7XCJuYW1lXCI6XCJ1X05vZGVBdHRyaWJ1dGVBcnJheTFcIixcInR5cGVcIjpcInZlYzQ8ZjMyPltdXCIsXCJzdG9yYWdlQ2xhc3NcIjpcIlN0b3JhZ2VCdWZmZXJcIixcInJlYWRvbmx5XCI6dHJ1ZSxcIndyaXRlb25seVwiOmZhbHNlLFwic2l6ZVwiOlsxLDFdfSx7XCJuYW1lXCI6XCJ1X05vZGVBdHRyaWJ1dGVBcnJheTJcIixcInR5cGVcIjpcInZlYzQ8ZjMyPltdXCIsXCJzdG9yYWdlQ2xhc3NcIjpcIlN0b3JhZ2VCdWZmZXJcIixcInJlYWRvbmx5XCI6dHJ1ZSxcIndyaXRlb25seVwiOmZhbHNlLFwic2l6ZVwiOlsxLDFdfSx7XCJuYW1lXCI6XCJ1X2ludGVydmFsXCIsXCJ0eXBlXCI6XCJGbG9hdFwiLFwic3RvcmFnZUNsYXNzXCI6XCJVbmlmb3JtXCIsXCJyZWFkb25seVwiOnRydWUsXCJ3cml0ZW9ubHlcIjpmYWxzZSxcInNpemVcIjpbMSwxXX1dLFwiZ2xvYmFsRGVjbGFyYXRpb25zXCI6W10sXCJvdXRwdXRcIjp7XCJuYW1lXCI6XCJ1X0RhdGFcIixcInNpemVcIjpbMSwxXSxcImxlbmd0aFwiOjF9LFwibmVlZFBpbmdwb25nXCI6dHJ1ZX19YDtcbmV4cG9ydCBjb25zdCBhdmVNb3ZlbWVudENvZGUgPSBgXG5jb25zdCBWRVJURVhfQ09VTlQ7XG5AbnVtdGhyZWFkcygxLCAxLCAxKVxuY2xhc3MgQ2FsY0F2ZU1vdmVtZW50IHtcbiAgQGluXG4gIHVfRGF0YTogdmVjNFtdO1xuICBAaW5cbiAgdV9pdGVyOiBmbG9hdDtcbiAgQGluIEBvdXRcbiAgdV9BdmVNb3ZlbWVudDogdmVjNFtdO1xuICBAbWFpblxuICBjb21wdXRlKCkge1xuICAgIGxldCBtb3ZlbWVudCA9IDA7XG4gICAgZm9yIChsZXQgajogaW50ID0gMDsgaiA8IFZFUlRFWF9DT1VOVDsgaisrKSB7XG4gICAgICBjb25zdCB2ZXJ0ZXggPSB0aGlzLnVfRGF0YVtqXTtcbiAgICAgIG1vdmVtZW50ICs9IHZlcnRleFszXTtcbiAgICB9XG4gICAgbW92ZW1lbnQgPSBtb3ZlbWVudCAvIGZsb2F0KFZFUlRFWF9DT1VOVCk7XG4gICAgdGhpcy51X0F2ZU1vdmVtZW50WzBdID0gW21vdmVtZW50LCAwLCAwLCAwXTtcbiAgfVxufVxuYDtcbmV4cG9ydCBjb25zdCBhdmVNb3ZlbWVudEJ1bmRsZSA9IGB7XCJzaGFkZXJzXCI6e1wiV0dTTFwiOlwiaW1wb3J0IFxcXFxcIkdMU0wuc3RkLjQ1MFxcXFxcIiBhcyBzdGQ7XFxcXG5cXFxcblxcXFxuIyB2YXIgZ1dlYkdQVURlYnVnIDogYm9vbCA9IGZhbHNlO1xcXFxuIyB2YXIgZ1dlYkdQVURlYnVnT3V0cHV0IDogdmVjNDxmMzI+ID0gdmVjNDxmMzI+KDAuMCk7XFxcXG5cXFxcbltbYnVpbHRpbiBnbG9iYWxfaW52b2NhdGlvbl9pZF1dIHZhcjxpbj4gZ2xvYmFsSW52b2NhdGlvbklEIDogdmVjMzx1MzI+O1xcXFxuIyBbW2J1aWx0aW4gd29ya19ncm91cF9zaXplXV0gdmFyPGluPiB3b3JrR3JvdXBTaXplIDogdmVjMzx1MzI+O1xcXFxuIyBbW2J1aWx0aW4gd29ya19ncm91cF9pZF1dIHZhcjxpbj4gd29ya0dyb3VwSUQgOiB2ZWMzPHUzMj47XFxcXG5bW2J1aWx0aW4gbG9jYWxfaW52b2NhdGlvbl9pZF1dIHZhcjxpbj4gbG9jYWxJbnZvY2F0aW9uSUQgOiB2ZWMzPHUzMj47XFxcXG4jIFtbYnVpbHRpbiBudW1fd29ya19ncm91cHNdXSB2YXI8aW4+IG51bVdvcmtHcm91cHMgOiB2ZWMzPHUzMj47XFxcXG5bW2J1aWx0aW4gbG9jYWxfaW52b2NhdGlvbl9pZHhdXSB2YXI8aW4+IGxvY2FsSW52b2NhdGlvbkluZGV4IDogdTMyO1xcXFxuXFxcXG50eXBlIEdXZWJHUFVQYXJhbXMgPSBbW2Jsb2NrXV0gc3RydWN0IHtcXFxcbiAgW1tvZmZzZXQgMF1dIHVfaXRlciA6IGYzMjtcXFxcbn07XFxcXG5bW2JpbmRpbmcgMCwgc2V0IDBdXSB2YXI8dW5pZm9ybT4gZ1dlYkdQVVVuaWZvcm1QYXJhbXMgOiBHV2ViR1BVUGFyYW1zO1xcXFxudHlwZSBHV2ViR1BVQnVmZmVyMCA9IFtbYmxvY2tdXSBzdHJ1Y3Qge1xcXFxuICBbW29mZnNldCAwXV0gdV9EYXRhIDogW1tzdHJpZGUgMTZdXSBhcnJheTx2ZWM0PGYzMj4+O1xcXFxufTtcXFxcbltbYmluZGluZyAxLCBzZXQgMF1dIHZhcjxzdG9yYWdlX2J1ZmZlcj4gZ1dlYkdQVUJ1ZmZlcjAgOiBHV2ViR1BVQnVmZmVyMDtcXFxcbnR5cGUgR1dlYkdQVUJ1ZmZlcjEgPSBbW2Jsb2NrXV0gc3RydWN0IHtcXFxcbiAgW1tvZmZzZXQgMF1dIHVfQXZlTW92ZW1lbnQgOiBbW3N0cmlkZSAxNl1dIGFycmF5PHZlYzQ8ZjMyPj47XFxcXG59O1xcXFxuW1tiaW5kaW5nIDIsIHNldCAwXV0gdmFyPHN0b3JhZ2VfYnVmZmVyPiBnV2ViR1BVQnVmZmVyMSA6IEdXZWJHUFVCdWZmZXIxO1xcXFxuXFxcXG5cXFxcblxcXFxuXFxcXG5cXFxcblxcXFxuXFxcXG5cXFxcbmZuIG1haW4oKSAtPiB2b2lkIHt2YXIgbW92ZW1lbnQgOiBmMzIgPSAwLjA7XFxcXG5mb3IgKHZhciBqIDogaTMyID0gMDsgaiA8IF9fRGVmaW5lVmFsdWVQbGFjZWhvbGRlcl9fVkVSVEVYX0NPVU5UOyBqID0gaiArIDEpIHt2YXIgdmVydGV4IDogdmVjNDxmMzI+ID0gZ1dlYkdQVUJ1ZmZlcjAudV9EYXRhW2pdO1xcXFxubW92ZW1lbnQgPSBtb3ZlbWVudCArIHZlcnRleC53O31cXFxcbm1vdmVtZW50ID0gbW92ZW1lbnQgLyBmMzIoX19EZWZpbmVWYWx1ZVBsYWNlaG9sZGVyX19WRVJURVhfQ09VTlQpO1xcXFxuZ1dlYkdQVUJ1ZmZlcjEudV9BdmVNb3ZlbWVudFswXSA9IHZlYzQ8ZjMyPihtb3ZlbWVudCwgMC4wLCAwLjAsIDAuMCk7XFxcXG5yZXR1cm47fVxcXFxuXFxcXG5lbnRyeV9wb2ludCBjb21wdXRlIGFzIFxcXFxcIm1haW5cXFxcXCIgPSBtYWluO1xcXFxuXCIsXCJHTFNMNDUwXCI6XCJcXFxcblxcXFxuXFxcXG5ib29sIGdXZWJHUFVEZWJ1ZyA9IGZhbHNlO1xcXFxudmVjNCBnV2ViR1BVRGVidWdPdXRwdXQgPSB2ZWM0KDAuMCk7XFxcXG5cXFxcbml2ZWMzIGdsb2JhbEludm9jYXRpb25JRCA9IGl2ZWMzKGdsX0dsb2JhbEludm9jYXRpb25JRCk7XFxcXG5pdmVjMyB3b3JrR3JvdXBTaXplID0gaXZlYzMoMSwxLDEpO1xcXFxuaXZlYzMgd29ya0dyb3VwSUQgPSBpdmVjMyhnbF9Xb3JrR3JvdXBJRCk7XFxcXG5pdmVjMyBsb2NhbEludm9jYXRpb25JRCA9IGl2ZWMzKGdsX0xvY2FsSW52b2NhdGlvbklEKTtcXFxcbml2ZWMzIG51bVdvcmtHcm91cHMgPSBpdmVjMyhnbF9OdW1Xb3JrR3JvdXBzKTtcXFxcbmludCBsb2NhbEludm9jYXRpb25JbmRleCA9IGludChnbF9Mb2NhbEludm9jYXRpb25JbmRleCk7XFxcXG5cXFxcbmxheW91dChzdGQxNDAsIHNldCA9IDAsIGJpbmRpbmcgPSAwKSB1bmlmb3JtIEdXZWJHUFVQYXJhbXMge1xcXFxuICBmbG9hdCB1X2l0ZXI7XFxcXG59IGdXZWJHUFVVbmlmb3JtUGFyYW1zO1xcXFxubGF5b3V0KHN0ZDQzMCwgc2V0ID0gMCwgYmluZGluZyA9IDEpIGJ1ZmZlciByZWFkb25seSAgR1dlYkdQVUJ1ZmZlcjAge1xcXFxuICB2ZWM0IHVfRGF0YVtdO1xcXFxufSBnV2ViR1BVQnVmZmVyMDtcXFxcblxcXFxubGF5b3V0KHN0ZDQzMCwgc2V0ID0gMCwgYmluZGluZyA9IDIpIGJ1ZmZlciAgIEdXZWJHUFVCdWZmZXIxIHtcXFxcbiAgdmVjNCB1X0F2ZU1vdmVtZW50W107XFxcXG59IGdXZWJHUFVCdWZmZXIxO1xcXFxuXFxcXG5cXFxcblxcXFxuI2RlZmluZSBWRVJURVhfQ09VTlQgX19EZWZpbmVWYWx1ZVBsYWNlaG9sZGVyX19WRVJURVhfQ09VTlRcXFxcbmxheW91dCAoXFxcXG4gIGxvY2FsX3NpemVfeCA9IDEsXFxcXG4gIGxvY2FsX3NpemVfeSA9IDEsXFxcXG4gIGxvY2FsX3NpemVfeiA9IDFcXFxcbikgaW47XFxcXG5cXFxcblxcXFxuXFxcXG52b2lkIG1haW4oKSB7ZmxvYXQgbW92ZW1lbnQgPSAwLjA7XFxcXG5mb3IgKGludCBqID0gMDsgaiA8IFZFUlRFWF9DT1VOVDsgaisrKSB7dmVjNCB2ZXJ0ZXggPSBnV2ViR1BVQnVmZmVyMC51X0RhdGFbal07XFxcXG5tb3ZlbWVudCArPSB2ZXJ0ZXgudzt9XFxcXG5tb3ZlbWVudCA9IG1vdmVtZW50IC8gZmxvYXQoVkVSVEVYX0NPVU5UKTtcXFxcbmdXZWJHUFVCdWZmZXIxLnVfQXZlTW92ZW1lbnRbMF0gPSB2ZWM0KG1vdmVtZW50LCAwLjAsIDAuMCwgMC4wKTt9XFxcXG5cIixcIkdMU0wxMDBcIjpcIlxcXFxuXFxcXG5mbG9hdCBlcHNpbG9uID0gMC4wMDAwMTtcXFxcbnZlYzIgYWRkclRyYW5zbGF0aW9uXzFEdG8yRChmbG9hdCBhZGRyZXNzMUQsIHZlYzIgdGV4U2l6ZSkge1xcXFxuICB2ZWMyIGNvbnZfY29uc3QgPSB2ZWMyKDEuMCAvIHRleFNpemUueCwgMS4wIC8gKHRleFNpemUueCAqIHRleFNpemUueSkpO1xcXFxuICB2ZWMyIG5vcm1BZGRyMkQgPSBmbG9hdChhZGRyZXNzMUQpICogY29udl9jb25zdDtcXFxcbiAgcmV0dXJuIHZlYzIoZnJhY3Qobm9ybUFkZHIyRC54ICsgZXBzaWxvbiksIG5vcm1BZGRyMkQueSk7XFxcXG59XFxcXG5cXFxcbnZvaWQgYmFycmllcigpIHt9XFxcXG4gIFxcXFxuXFxcXG51bmlmb3JtIHZlYzIgdV9PdXRwdXRUZXh0dXJlU2l6ZTtcXFxcbnVuaWZvcm0gaW50IHVfT3V0cHV0VGV4ZWxDb3VudDtcXFxcbnZhcnlpbmcgdmVjMiB2X1RleENvb3JkO1xcXFxuXFxcXG5ib29sIGdXZWJHUFVEZWJ1ZyA9IGZhbHNlO1xcXFxudmVjNCBnV2ViR1BVRGVidWdPdXRwdXQgPSB2ZWM0KDAuMCk7XFxcXG5cXFxcbiNkZWZpbmUgVkVSVEVYX0NPVU5UIF9fRGVmaW5lVmFsdWVQbGFjZWhvbGRlcl9fVkVSVEVYX0NPVU5UXFxcXG5cXFxcbnVuaWZvcm0gc2FtcGxlcjJEIHVfRGF0YTtcXFxcbnVuaWZvcm0gdmVjMiB1X0RhdGFTaXplO1xcXFxudmVjNCBnZXREYXRhdV9EYXRhKHZlYzIgYWRkcmVzczJEKSB7XFxcXG4gIHJldHVybiB2ZWM0KHRleHR1cmUyRCh1X0RhdGEsIGFkZHJlc3MyRCkucmdiYSk7XFxcXG59XFxcXG52ZWM0IGdldERhdGF1X0RhdGEoZmxvYXQgYWRkcmVzczFEKSB7XFxcXG4gIHJldHVybiBnZXREYXRhdV9EYXRhKGFkZHJUcmFuc2xhdGlvbl8xRHRvMkQoYWRkcmVzczFELCB1X0RhdGFTaXplKSk7XFxcXG59XFxcXG52ZWM0IGdldERhdGF1X0RhdGEoaW50IGFkZHJlc3MxRCkge1xcXFxuICByZXR1cm4gZ2V0RGF0YXVfRGF0YShmbG9hdChhZGRyZXNzMUQpKTtcXFxcbn1cXFxcbnVuaWZvcm0gZmxvYXQgdV9pdGVyO1xcXFxudW5pZm9ybSBzYW1wbGVyMkQgdV9BdmVNb3ZlbWVudDtcXFxcbnVuaWZvcm0gdmVjMiB1X0F2ZU1vdmVtZW50U2l6ZTtcXFxcbnZlYzQgZ2V0RGF0YXVfQXZlTW92ZW1lbnQodmVjMiBhZGRyZXNzMkQpIHtcXFxcbiAgcmV0dXJuIHZlYzQodGV4dHVyZTJEKHVfQXZlTW92ZW1lbnQsIGFkZHJlc3MyRCkucmdiYSk7XFxcXG59XFxcXG52ZWM0IGdldERhdGF1X0F2ZU1vdmVtZW50KGZsb2F0IGFkZHJlc3MxRCkge1xcXFxuICByZXR1cm4gZ2V0RGF0YXVfQXZlTW92ZW1lbnQoYWRkclRyYW5zbGF0aW9uXzFEdG8yRChhZGRyZXNzMUQsIHVfQXZlTW92ZW1lbnRTaXplKSk7XFxcXG59XFxcXG52ZWM0IGdldERhdGF1X0F2ZU1vdmVtZW50KGludCBhZGRyZXNzMUQpIHtcXFxcbiAgcmV0dXJuIGdldERhdGF1X0F2ZU1vdmVtZW50KGZsb2F0KGFkZHJlc3MxRCkpO1xcXFxufVxcXFxudm9pZCBtYWluKCkge1xcXFxuaXZlYzMgd29ya0dyb3VwU2l6ZSA9IGl2ZWMzKDEsIDEsIDEpO1xcXFxuaXZlYzMgbnVtV29ya0dyb3VwcyA9IGl2ZWMzKDEsIDEsIDEpOyAgICAgXFxcXG5pbnQgZ2xvYmFsSW52b2NhdGlvbkluZGV4ID0gaW50KGZsb29yKHZfVGV4Q29vcmQueCAqIHVfT3V0cHV0VGV4dHVyZVNpemUueCkpXFxcXG4gICsgaW50KGZsb29yKHZfVGV4Q29vcmQueSAqIHVfT3V0cHV0VGV4dHVyZVNpemUueSkpICogaW50KHVfT3V0cHV0VGV4dHVyZVNpemUueCk7XFxcXG5pbnQgd29ya0dyb3VwSURMZW5ndGggPSBnbG9iYWxJbnZvY2F0aW9uSW5kZXggLyAod29ya0dyb3VwU2l6ZS54ICogd29ya0dyb3VwU2l6ZS55ICogd29ya0dyb3VwU2l6ZS56KTtcXFxcbml2ZWMzIHdvcmtHcm91cElEID0gaXZlYzMod29ya0dyb3VwSURMZW5ndGggLyBudW1Xb3JrR3JvdXBzLnkgLyBudW1Xb3JrR3JvdXBzLnosIHdvcmtHcm91cElETGVuZ3RoIC8gbnVtV29ya0dyb3Vwcy54IC8gbnVtV29ya0dyb3Vwcy56LCB3b3JrR3JvdXBJRExlbmd0aCAvIG51bVdvcmtHcm91cHMueCAvIG51bVdvcmtHcm91cHMueSk7XFxcXG5pbnQgbG9jYWxJbnZvY2F0aW9uSURaID0gZ2xvYmFsSW52b2NhdGlvbkluZGV4IC8gKHdvcmtHcm91cFNpemUueCAqIHdvcmtHcm91cFNpemUueSk7XFxcXG5pbnQgbG9jYWxJbnZvY2F0aW9uSURZID0gKGdsb2JhbEludm9jYXRpb25JbmRleCAtIGxvY2FsSW52b2NhdGlvbklEWiAqIHdvcmtHcm91cFNpemUueCAqIHdvcmtHcm91cFNpemUueSkgLyB3b3JrR3JvdXBTaXplLng7XFxcXG5pbnQgbG9jYWxJbnZvY2F0aW9uSURYID0gZ2xvYmFsSW52b2NhdGlvbkluZGV4IC0gbG9jYWxJbnZvY2F0aW9uSURaICogd29ya0dyb3VwU2l6ZS54ICogd29ya0dyb3VwU2l6ZS55IC0gbG9jYWxJbnZvY2F0aW9uSURZICogd29ya0dyb3VwU2l6ZS54O1xcXFxuaXZlYzMgbG9jYWxJbnZvY2F0aW9uSUQgPSBpdmVjMyhsb2NhbEludm9jYXRpb25JRFgsIGxvY2FsSW52b2NhdGlvbklEWSwgbG9jYWxJbnZvY2F0aW9uSURaKTtcXFxcbml2ZWMzIGdsb2JhbEludm9jYXRpb25JRCA9IHdvcmtHcm91cElEICogd29ya0dyb3VwU2l6ZSArIGxvY2FsSW52b2NhdGlvbklEO1xcXFxuaW50IGxvY2FsSW52b2NhdGlvbkluZGV4ID0gbG9jYWxJbnZvY2F0aW9uSUQueiAqIHdvcmtHcm91cFNpemUueCAqIHdvcmtHcm91cFNpemUueVxcXFxuICAgICAgICAgICAgICAgICsgbG9jYWxJbnZvY2F0aW9uSUQueSAqIHdvcmtHcm91cFNpemUueCArIGxvY2FsSW52b2NhdGlvbklELng7XFxcXG5mbG9hdCBtb3ZlbWVudCA9IDAuMDtcXFxcbmZvciAoaW50IGogPSAwOyBqIDwgVkVSVEVYX0NPVU5UOyBqKyspIHt2ZWM0IHZlcnRleCA9IGdldERhdGF1X0RhdGEoaik7XFxcXG5tb3ZlbWVudCArPSB2ZXJ0ZXgudzt9XFxcXG5tb3ZlbWVudCA9IG1vdmVtZW50IC8gZmxvYXQoVkVSVEVYX0NPVU5UKTtcXFxcbmdsX0ZyYWdDb2xvciA9IHZlYzQodmVjNChtb3ZlbWVudCwgMC4wLCAwLjAsIDAuMCkpO2lmIChnV2ViR1BVRGVidWcpIHtcXFxcbiAgZ2xfRnJhZ0NvbG9yID0gZ1dlYkdQVURlYnVnT3V0cHV0O1xcXFxufX1cXFxcblwifSxcImNvbnRleHRcIjp7XCJuYW1lXCI6XCJcIixcImRpc3BhdGNoXCI6WzEsMSwxXSxcInRocmVhZEdyb3VwU2l6ZVwiOlsxLDEsMV0sXCJtYXhJdGVyYXRpb25cIjoxLFwiZGVmaW5lc1wiOlt7XCJuYW1lXCI6XCJWRVJURVhfQ09VTlRcIixcInR5cGVcIjpcIkZsb2F0XCIsXCJydW50aW1lXCI6dHJ1ZX1dLFwidW5pZm9ybXNcIjpbe1wibmFtZVwiOlwidV9EYXRhXCIsXCJ0eXBlXCI6XCJ2ZWM0PGYzMj5bXVwiLFwic3RvcmFnZUNsYXNzXCI6XCJTdG9yYWdlQnVmZmVyXCIsXCJyZWFkb25seVwiOnRydWUsXCJ3cml0ZW9ubHlcIjpmYWxzZSxcInNpemVcIjpbMSwxXX0se1wibmFtZVwiOlwidV9pdGVyXCIsXCJ0eXBlXCI6XCJGbG9hdFwiLFwic3RvcmFnZUNsYXNzXCI6XCJVbmlmb3JtXCIsXCJyZWFkb25seVwiOnRydWUsXCJ3cml0ZW9ubHlcIjpmYWxzZSxcInNpemVcIjpbMSwxXX0se1wibmFtZVwiOlwidV9BdmVNb3ZlbWVudFwiLFwidHlwZVwiOlwidmVjNDxmMzI+W11cIixcInN0b3JhZ2VDbGFzc1wiOlwiU3RvcmFnZUJ1ZmZlclwiLFwicmVhZG9ubHlcIjpmYWxzZSxcIndyaXRlb25seVwiOmZhbHNlLFwic2l6ZVwiOlsxLDFdfV0sXCJnbG9iYWxEZWNsYXJhdGlvbnNcIjpbXSxcIm91dHB1dFwiOntcIm5hbWVcIjpcInVfQXZlTW92ZW1lbnRcIixcInNpemVcIjpbMSwxXSxcImxlbmd0aFwiOjF9LFwibmVlZFBpbmdwb25nXCI6dHJ1ZX19YDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdGb3JjZVNoYWRlci5qcy5tYXAiLCIvLyBAdHMtbm9jaGVja1xuLyoqXG4gKiBAZmlsZU92ZXJ2aWV3IGZydWNodGVybWFuIGxheW91dFxuICogQGF1dGhvciBzaGl3dS53eXlAYW50ZmluLmNvbVxuICovXG52YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IEJhc2UgfSBmcm9tIFwiLi4vYmFzZVwiO1xuaW1wb3J0IHsgaXNOdW1iZXIgfSBmcm9tIFwiLi4vLi4vdXRpbFwiO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgV29ybGQgfSBmcm9tIFwiQGFudHYvZy13ZWJncHVcIjtcbmltcG9ydCB7IHByb2NjZXNzVG9GdW5jLCBidWlsZFRleHR1cmVEYXRhV2l0aFR3b0VkZ2VBdHRyLCBhcnJheVRvVGV4dHVyZURhdGEgfSBmcm9tIFwiLi4vLi4vdXRpbC9ncHVcIjtcbmltcG9ydCB7IGdldERlZ3JlZSB9IGZyb20gXCIuLi8uLi91dGlsL21hdGhcIjtcbmltcG9ydCB7IGdGb3JjZUJ1bmRsZSwgYXZlTW92ZW1lbnRCdW5kbGUgfSBmcm9tIFwiLi9nRm9yY2VTaGFkZXJcIjtcbmltcG9ydCB7IExBWU9VVF9NRVNTQUdFIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuLyoqXG4gKiBncmFwaGluIOS4reeahCBmb3JjZSDluIPlsYBcbiAqL1xuZXhwb3J0IGNsYXNzIEdGb3JjZUdQVUxheW91dCBleHRlbmRzIEJhc2Uge1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgLyoqIOWBnOatoui/reS7o+eahOacgOWkp+i/reS7o+aVsCAqL1xuICAgICAgICB0aGlzLm1heEl0ZXJhdGlvbiA9IDEwMDA7XG4gICAgICAgIC8qKiDlvLnnsKflvJXlipvns7vmlbAgKi9cbiAgICAgICAgdGhpcy5lZGdlU3RyZW5ndGggPSAyMDA7XG4gICAgICAgIC8qKiDmlqXlipvns7vmlbAgKi9cbiAgICAgICAgdGhpcy5ub2RlU3RyZW5ndGggPSAxMDAwO1xuICAgICAgICAvKiog5bqT5Lym57O75pWwICovXG4gICAgICAgIHRoaXMuY291bG9tYkRpc1NjYWxlID0gMC4wMDU7XG4gICAgICAgIC8qKiDpmLvlsLzns7vmlbAgKi9cbiAgICAgICAgdGhpcy5kYW1waW5nID0gMC45O1xuICAgICAgICAvKiog5pyA5aSn6YCf5bqmICovXG4gICAgICAgIHRoaXMubWF4U3BlZWQgPSAxMDAwO1xuICAgICAgICAvKiog5LiA5qyh6L+t5Luj55qE5bmz5Z2H56e75Yqo6Led56a75bCP5LqO6K+l5YC85pe25YGc5q2i6L+t5LujICovXG4gICAgICAgIHRoaXMubWluTW92ZW1lbnQgPSAwLjU7XG4gICAgICAgIC8qKiDov63ku6PkuK3oobDlh48gKi9cbiAgICAgICAgdGhpcy5pbnRlcnZhbCA9IDAuMDI7XG4gICAgICAgIC8qKiDmlqXlipvnmoTkuIDkuKrns7vmlbAgKi9cbiAgICAgICAgdGhpcy5mYWN0b3IgPSAxO1xuICAgICAgICAvKiog55CG5oOz6L656ZW/ICovXG4gICAgICAgIHRoaXMubGlua0Rpc3RhbmNlID0gMTtcbiAgICAgICAgLyoqIOmHjeWKm+Wkp+WwjyAqL1xuICAgICAgICB0aGlzLmdyYXZpdHkgPSAxMDtcbiAgICAgICAgLyoqIOaYr+WQpuWQr+eUqHdlYiB3b3JrZXLjgILliY3mj5DmmK/lnKh3ZWIgd29ya2Vy6YeM5omn6KGM5biD5bGA77yM5ZCm5YiZ5peg5pWIXHQqL1xuICAgICAgICB0aGlzLndvcmtlckVuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5ub2RlcyA9IFtdO1xuICAgICAgICB0aGlzLmVkZ2VzID0gW107XG4gICAgICAgIHRoaXMud2lkdGggPSAzMDA7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gMzAwO1xuICAgICAgICB0aGlzLm5vZGVNYXAgPSB7fTtcbiAgICAgICAgdGhpcy5ub2RlSWR4TWFwID0ge307XG4gICAgICAgIHRoaXMudXBkYXRlQ2ZnKG9wdGlvbnMpO1xuICAgIH1cbiAgICBnZXREZWZhdWx0Q2ZnKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbWF4SXRlcmF0aW9uOiAyMDAwLFxuICAgICAgICAgICAgZ3Jhdml0eTogMTAsXG4gICAgICAgICAgICBjbHVzdGVyaW5nOiBmYWxzZSxcbiAgICAgICAgICAgIGNsdXN0ZXJHcmF2aXR5OiAxMFxuICAgICAgICB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiDmiafooYzluIPlsYBcbiAgICAgKi9cbiAgICBleGVjdXRlKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICAgICAgICBjb25zdCBub2RlcyA9IHNlbGYubm9kZXM7XG4gICAgICAgICAgICBpZiAoIW5vZGVzIHx8IG5vZGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGlmIChzZWxmLm9uTGF5b3V0RW5kKVxuICAgICAgICAgICAgICAgICAgICBzZWxmLm9uTGF5b3V0RW5kKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFzZWxmLndpZHRoICYmIHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgICAgICBzZWxmLndpZHRoID0gd2luZG93LmlubmVyV2lkdGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXNlbGYuaGVpZ2h0ICYmIHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgICAgICBzZWxmLmhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghc2VsZi5jZW50ZXIpIHtcbiAgICAgICAgICAgICAgICBzZWxmLmNlbnRlciA9IFtzZWxmLndpZHRoIC8gMiwgc2VsZi5oZWlnaHQgLyAyXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGNlbnRlciA9IHNlbGYuY2VudGVyO1xuICAgICAgICAgICAgaWYgKG5vZGVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIG5vZGVzWzBdLnggPSBjZW50ZXJbMF07XG4gICAgICAgICAgICAgICAgbm9kZXNbMF0ueSA9IGNlbnRlclsxXTtcbiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vbkxheW91dEVuZClcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkxheW91dEVuZCgpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG5vZGVNYXAgPSB7fTtcbiAgICAgICAgICAgIGNvbnN0IG5vZGVJZHhNYXAgPSB7fTtcbiAgICAgICAgICAgIG5vZGVzLmZvckVhY2goKG5vZGUsIGkpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWlzTnVtYmVyKG5vZGUueCkpXG4gICAgICAgICAgICAgICAgICAgIG5vZGUueCA9IE1hdGgucmFuZG9tKCkgKiBzZWxmLndpZHRoO1xuICAgICAgICAgICAgICAgIGlmICghaXNOdW1iZXIobm9kZS55KSlcbiAgICAgICAgICAgICAgICAgICAgbm9kZS55ID0gTWF0aC5yYW5kb20oKSAqIHNlbGYuaGVpZ2h0O1xuICAgICAgICAgICAgICAgIG5vZGVNYXBbbm9kZS5pZF0gPSBub2RlO1xuICAgICAgICAgICAgICAgIG5vZGVJZHhNYXBbbm9kZS5pZF0gPSBpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBzZWxmLm5vZGVNYXAgPSBub2RlTWFwO1xuICAgICAgICAgICAgc2VsZi5ub2RlSWR4TWFwID0gbm9kZUlkeE1hcDtcbiAgICAgICAgICAgIHNlbGYubm9kZVN0cmVuZ3RoID0gcHJvY2Nlc3NUb0Z1bmMoc2VsZi5ub2RlU3RyZW5ndGgsIDEpO1xuICAgICAgICAgICAgc2VsZi5lZGdlU3RyZW5ndGggPSBwcm9jY2Vzc1RvRnVuYyhzZWxmLmVkZ2VTdHJlbmd0aCwgMSk7XG4gICAgICAgICAgICAvLyBsYXlvdXRcbiAgICAgICAgICAgIHlpZWxkIHNlbGYucnVuKCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBleGVjdXRlV2l0aFdvcmtlcihjYW52YXMsIGN0eCkge1xuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAgICAgY29uc3Qgbm9kZXMgPSBzZWxmLm5vZGVzO1xuICAgICAgICBjb25zdCBjZW50ZXIgPSBzZWxmLmNlbnRlcjtcbiAgICAgICAgaWYgKCFub2RlcyB8fCBub2Rlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICBub2Rlc1swXS54ID0gY2VudGVyWzBdO1xuICAgICAgICAgICAgbm9kZXNbMF0ueSA9IGNlbnRlclsxXTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBub2RlTWFwID0ge307XG4gICAgICAgIGNvbnN0IG5vZGVJZHhNYXAgPSB7fTtcbiAgICAgICAgbm9kZXMuZm9yRWFjaCgobm9kZSwgaSkgPT4ge1xuICAgICAgICAgICAgaWYgKCFpc051bWJlcihub2RlLngpKVxuICAgICAgICAgICAgICAgIG5vZGUueCA9IE1hdGgucmFuZG9tKCkgKiBzZWxmLndpZHRoO1xuICAgICAgICAgICAgaWYgKCFpc051bWJlcihub2RlLnkpKVxuICAgICAgICAgICAgICAgIG5vZGUueSA9IE1hdGgucmFuZG9tKCkgKiBzZWxmLmhlaWdodDtcbiAgICAgICAgICAgIG5vZGVNYXBbbm9kZS5pZF0gPSBub2RlO1xuICAgICAgICAgICAgbm9kZUlkeE1hcFtub2RlLmlkXSA9IGk7XG4gICAgICAgIH0pO1xuICAgICAgICBzZWxmLm5vZGVNYXAgPSBub2RlTWFwO1xuICAgICAgICBzZWxmLm5vZGVJZHhNYXAgPSBub2RlSWR4TWFwO1xuICAgICAgICBzZWxmLm5vZGVTdHJlbmd0aCA9IHByb2NjZXNzVG9GdW5jKHNlbGYubm9kZVN0cmVuZ3RoLCAxKTtcbiAgICAgICAgc2VsZi5lZGdlU3RyZW5ndGggPSBwcm9jY2Vzc1RvRnVuYyhzZWxmLmVkZ2VTdHJlbmd0aCwgMSk7XG4gICAgICAgIC8vIGxheW91dFxuICAgICAgICBzZWxmLnJ1bihjYW52YXMsIGN0eCk7XG4gICAgfVxuICAgIHJ1bihjYW52YXMsIGN0eCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICAgICAgICBjb25zdCBub2RlcyA9IHNlbGYubm9kZXM7XG4gICAgICAgICAgICBjb25zdCBlZGdlcyA9IHNlbGYuZWRnZXM7XG4gICAgICAgICAgICBjb25zdCBtYXhJdGVyYXRpb24gPSBzZWxmLm1heEl0ZXJhdGlvbjtcbiAgICAgICAgICAgIGlmICghc2VsZi53aWR0aCAmJiB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICAgICAgc2VsZi53aWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFzZWxmLmhlaWdodCAmJiB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICAgICAgc2VsZi5oZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBudW1QYXJ0aWNsZXMgPSBub2Rlcy5sZW5ndGg7XG4gICAgICAgICAgICBzZWxmLmxpbmtEaXN0YW5jZSA9IHByb2NjZXNzVG9GdW5jKHNlbGYubGlua0Rpc3RhbmNlKTtcbiAgICAgICAgICAgIHNlbGYuZWRnZVN0cmVuZ3RoID0gcHJvY2Nlc3NUb0Z1bmMoc2VsZi5lZGdlU3RyZW5ndGgpO1xuICAgICAgICAgICAgY29uc3QgeyBtYXhFZGdlUGVyVmV0ZXgsIGFycmF5OiBub2Rlc0VkZ2VzQXJyYXkgfSA9IGJ1aWxkVGV4dHVyZURhdGFXaXRoVHdvRWRnZUF0dHIobm9kZXMsIGVkZ2VzLCBzZWxmLmxpbmtEaXN0YW5jZSwgc2VsZi5lZGdlU3RyZW5ndGgpO1xuICAgICAgICAgICAgLy8gaW5pdCBkZWdyZWUgZm9yIG1hc3NcbiAgICAgICAgICAgIHNlbGYuZGVncmVlcyA9IGdldERlZ3JlZShub2Rlcy5sZW5ndGgsIHNlbGYubm9kZUlkeE1hcCwgZWRnZXMpO1xuICAgICAgICAgICAgY29uc3QgbWFzc2VzID0gW107XG4gICAgICAgICAgICBjb25zdCBub2RlU3RyZW5ndGhzID0gW107XG4gICAgICAgICAgICBjb25zdCBjZW50ZXJYcyA9IFtdO1xuICAgICAgICAgICAgY29uc3QgY2VudGVyWXMgPSBbXTtcbiAgICAgICAgICAgIGNvbnN0IGNlbnRlckdyYXZpdGllcyA9IFtdO1xuICAgICAgICAgICAgY29uc3QgZnhzID0gW107XG4gICAgICAgICAgICBjb25zdCBmeXMgPSBbXTtcbiAgICAgICAgICAgIGlmICghc2VsZi5nZXRNYXNzKSB7XG4gICAgICAgICAgICAgICAgc2VsZi5nZXRNYXNzID0gKGQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuZGVncmVlc1tzZWxmLm5vZGVJZHhNYXBbZC5pZF1dIHx8IDE7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGdyYXZpdHkgPSBzZWxmLmdyYXZpdHk7XG4gICAgICAgICAgICBjb25zdCBjZW50ZXIgPSBzZWxmLmNlbnRlcjtcbiAgICAgICAgICAgIG5vZGVzLmZvckVhY2goKG5vZGUsIGkpID0+IHtcbiAgICAgICAgICAgICAgICBtYXNzZXMucHVzaChzZWxmLmdldE1hc3Mobm9kZSkpO1xuICAgICAgICAgICAgICAgIG5vZGVTdHJlbmd0aHMucHVzaChzZWxmLm5vZGVTdHJlbmd0aChub2RlKSk7XG4gICAgICAgICAgICAgICAgaWYgKCFzZWxmLmRlZ3JlZXNbaV0pXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuZGVncmVlc1tpXSA9IDA7XG4gICAgICAgICAgICAgICAgbGV0IG5vZGVHcmF2aXR5ID0gW2NlbnRlclswXSwgY2VudGVyWzFdLCBncmF2aXR5XTtcbiAgICAgICAgICAgICAgICBpZiAoc2VsZi5nZXRDZW50ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VzdG9tQ2VudGVyID0gc2VsZi5nZXRDZW50ZXIobm9kZSwgc2VsZi5kZWdyZWVzW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGN1c3RvbUNlbnRlciAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgaXNOdW1iZXIoY3VzdG9tQ2VudGVyWzBdKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgaXNOdW1iZXIoY3VzdG9tQ2VudGVyWzFdKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgaXNOdW1iZXIoY3VzdG9tQ2VudGVyWzJdKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZUdyYXZpdHkgPSBjdXN0b21DZW50ZXI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2VudGVyWHMucHVzaChub2RlR3Jhdml0eVswXSk7XG4gICAgICAgICAgICAgICAgY2VudGVyWXMucHVzaChub2RlR3Jhdml0eVsxXSk7XG4gICAgICAgICAgICAgICAgY2VudGVyR3Jhdml0aWVzLnB1c2gobm9kZUdyYXZpdHlbMl0pO1xuICAgICAgICAgICAgICAgIGlmIChpc051bWJlcihub2RlLmZ4KSAmJiBpc051bWJlcihub2RlLmZ5KSkge1xuICAgICAgICAgICAgICAgICAgICBmeHMucHVzaChub2RlLmZ4IHx8IDAuMDAxKTtcbiAgICAgICAgICAgICAgICAgICAgZnlzLnB1c2gobm9kZS5meSB8fCAwLjAwMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmeHMucHVzaCgwKTtcbiAgICAgICAgICAgICAgICAgICAgZnlzLnB1c2goMCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyDmr4/kuKroioLngrnnmoTpop3lpJblsZ7mgKfljaDkuKTkuKrmlbDnu4TlkITkuIDmoLzvvIxub2RlQXR0cmlidXRlQXJyYXkxIOS4reaYr++8mm1hc3MsIGRlZ3JlZSwgbm9kZVN0ZXJuZ3RoLCAwXG4gICAgICAgICAgICBjb25zdCBub2RlQXR0cmlidXRlQXJyYXkxID0gYXJyYXlUb1RleHR1cmVEYXRhKFtcbiAgICAgICAgICAgICAgICBtYXNzZXMsXG4gICAgICAgICAgICAgICAgc2VsZi5kZWdyZWVzLFxuICAgICAgICAgICAgICAgIG5vZGVTdHJlbmd0aHMsXG4gICAgICAgICAgICAgICAgZnhzXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgICAgIC8vIG5vZGVBdHRyaWJ1dGVBcnJheTIg5Lit5piv77yaY2VudGVyWCwgY2VudGVyWSwgZ3Jhdml0eSwgMCxcbiAgICAgICAgICAgIGNvbnN0IG5vZGVBdHRyaWJ1dGVBcnJheTIgPSBhcnJheVRvVGV4dHVyZURhdGEoW1xuICAgICAgICAgICAgICAgIGNlbnRlclhzLFxuICAgICAgICAgICAgICAgIGNlbnRlcllzLFxuICAgICAgICAgICAgICAgIGNlbnRlckdyYXZpdGllcyxcbiAgICAgICAgICAgICAgICBmeXNcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgY29uc3Qgd29ya2VyRW5hYmxlZCA9IHNlbGYud29ya2VyRW5hYmxlZDtcbiAgICAgICAgICAgIGxldCB3b3JsZDtcbiAgICAgICAgICAgIGlmICh3b3JrZXJFbmFibGVkKSB7XG4gICAgICAgICAgICAgICAgd29ybGQgPSBXb3JsZC5jcmVhdGUoe1xuICAgICAgICAgICAgICAgICAgICBjYW52YXMsXG4gICAgICAgICAgICAgICAgICAgIGVuZ2luZU9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRDb21wdXRlOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHdvcmxkID0gV29ybGQuY3JlYXRlKHtcbiAgICAgICAgICAgICAgICAgICAgZW5naW5lT3B0aW9uczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydENvbXB1dGU6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVE9ETzog5pyA57uI55qE6aKE57yW6K+R5Luj56CB5pS+5YWl5YiwIGdGb3JjZVNoYWRlci50cyDkuK3nm7TmjqXlvJXlhaXvvIzkuI3lho3pnIDopoHkuIvpnaLkuInooYxcbiAgICAgICAgICAgIC8vIGNvbnN0IGNvbXBpbGVyID0gbmV3IENvbXBpbGVyKCk7XG4gICAgICAgICAgICAvLyBjb25zdCBnRm9yY2VCdW5kbGUgPSBjb21waWxlci5jb21waWxlQnVuZGxlKGdGb3JjZUNvZGUpO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coZ0ZvcmNlQnVuZGxlLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgY29uc3Qgb25MYXlvdXRFbmQgPSBzZWxmLm9uTGF5b3V0RW5kO1xuICAgICAgICAgICAgY29uc3QgaW5pdFByZXZpb3VzRGF0YSA9IFtdO1xuICAgICAgICAgICAgbm9kZXNFZGdlc0FycmF5LmZvckVhY2goKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgaW5pdFByZXZpb3VzRGF0YS5wdXNoKHZhbHVlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCA0OyBpKyspIHtcbiAgICAgICAgICAgICAgICBpbml0UHJldmlvdXNEYXRhLnB1c2goMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBrZXJuZWxHRm9yY2UgPSB3b3JsZFxuICAgICAgICAgICAgICAgIC5jcmVhdGVLZXJuZWwoZ0ZvcmNlQnVuZGxlKVxuICAgICAgICAgICAgICAgIC5zZXREaXNwYXRjaChbbnVtUGFydGljbGVzLCAxLCAxXSlcbiAgICAgICAgICAgICAgICAuc2V0QmluZGluZyh7XG4gICAgICAgICAgICAgICAgdV9EYXRhOiBub2Rlc0VkZ2VzQXJyYXksXG4gICAgICAgICAgICAgICAgdV9kYW1waW5nOiBzZWxmLmRhbXBpbmcsXG4gICAgICAgICAgICAgICAgdV9tYXhTcGVlZDogc2VsZi5tYXhTcGVlZCxcbiAgICAgICAgICAgICAgICB1X21pbk1vdmVtZW50OiBzZWxmLm1pbk1vdmVtZW50LFxuICAgICAgICAgICAgICAgIHVfY291bG9tYkRpc1NjYWxlOiBzZWxmLmNvdWxvbWJEaXNTY2FsZSxcbiAgICAgICAgICAgICAgICB1X2ZhY3Rvcjogc2VsZi5mYWN0b3IsXG4gICAgICAgICAgICAgICAgdV9Ob2RlQXR0cmlidXRlQXJyYXkxOiBub2RlQXR0cmlidXRlQXJyYXkxLFxuICAgICAgICAgICAgICAgIHVfTm9kZUF0dHJpYnV0ZUFycmF5Mjogbm9kZUF0dHJpYnV0ZUFycmF5MixcbiAgICAgICAgICAgICAgICBNQVhfRURHRV9QRVJfVkVSVEVYOiBtYXhFZGdlUGVyVmV0ZXgsXG4gICAgICAgICAgICAgICAgVkVSVEVYX0NPVU5UOiBudW1QYXJ0aWNsZXMsXG4gICAgICAgICAgICAgICAgdV9BdmVNb3ZlbWVudDogaW5pdFByZXZpb3VzRGF0YSxcbiAgICAgICAgICAgICAgICB1X2ludGVydmFsOiBzZWxmLmludGVydmFsIC8vIOavj+asoei/reS7o+abtOaWsO+8jOmmluasoeiuvue9ruS4uiBpbnRlcnZhbO+8jOWcqCBvbkl0ZXJhdGlvbkNvbXBsZXRlZCDkuK3mm7TmlrBcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gY29uc3QgYXZlTW92ZW1lbnRCdW5kbGUgPSBjb21waWxlci5jb21waWxlQnVuZGxlKGF2ZU1vdmVtZW50Q29kZSk7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhhdmVNb3ZlbWVudEJ1bmRsZS50b1N0cmluZygpKTtcbiAgICAgICAgICAgIGNvbnN0IGtlcm5lbEF2ZU1vdmVtZW50ID0gd29ybGRcbiAgICAgICAgICAgICAgICAuY3JlYXRlS2VybmVsKGF2ZU1vdmVtZW50QnVuZGxlKVxuICAgICAgICAgICAgICAgIC5zZXREaXNwYXRjaChbMSwgMSwgMV0pXG4gICAgICAgICAgICAgICAgLnNldEJpbmRpbmcoe1xuICAgICAgICAgICAgICAgIHVfRGF0YTogbm9kZXNFZGdlc0FycmF5LFxuICAgICAgICAgICAgICAgIFZFUlRFWF9DT1VOVDogbnVtUGFydGljbGVzLFxuICAgICAgICAgICAgICAgIHVfQXZlTW92ZW1lbnQ6IFswLCAwLCAwLCAwXVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyDmiafooYzov63ku6NcbiAgICAgICAgICAgIC8vIGxldCBtaWRSZXMgPSBub2Rlc0VkZ2VzQXJyYXk7XG4gICAgICAgICAgICBjb25zdCBleGVjdXRlID0gKCkgPT4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWF4SXRlcmF0aW9uOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzog5Ly85LmO6YO95p2l6IeqIGtlcm5lbEdGb3JjZSDmmK/kuIDkuKrlvJXnlKhcbiAgICAgICAgICAgICAgICAgICAgLy8g5b2T5YmN5Z2Q5qCH5L2c5Li65LiL5LiA5qyh6L+t5Luj55qEIFByZXZpb3VzRGF0YVxuICAgICAgICAgICAgICAgICAgICAvLyBpZiAoaSA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gICBrZXJuZWxBdmVNb3ZlbWVudC5zZXRCaW5kaW5nKHtcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIHVfUHJldmlvdXNEYXRhOiBrZXJuZWxHRm9yY2VcbiAgICAgICAgICAgICAgICAgICAgLy8gICB9KTtcbiAgICAgICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXdhaXQtaW4tbG9vcFxuICAgICAgICAgICAgICAgICAgICB5aWVsZCBrZXJuZWxHRm9yY2UuZXhlY3V0ZSgpO1xuICAgICAgICAgICAgICAgICAgICAvLyBtaWRSZXMgPSBhd2FpdCBrZXJuZWxHRm9yY2UuZ2V0T3V0cHV0KCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIOavj+asoei/reS7o+WujOaIkOWQjlxuICAgICAgICAgICAgICAgICAgICAvLyDorqHnrpflubPlnYfkvY3np7vvvIznlKjkuo7mj5DliY3nu4jmraLov63ku6NcbiAgICAgICAgICAgICAgICAgICAga2VybmVsQXZlTW92ZW1lbnQuc2V0QmluZGluZyh7XG4gICAgICAgICAgICAgICAgICAgICAgICB1X0RhdGE6IGtlcm5lbEdGb3JjZVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWF3YWl0LWluLWxvb3BcbiAgICAgICAgICAgICAgICAgICAgeWllbGQga2VybmVsQXZlTW92ZW1lbnQuZXhlY3V0ZSgpO1xuICAgICAgICAgICAgICAgICAgICAvLyDmm7TmlrDoobDlh4/lh73mlbBcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RlcEludGVydmFsID0gTWF0aC5tYXgoMC4wMiwgc2VsZi5pbnRlcnZhbCAtIGkgKiAwLjAwMik7XG4gICAgICAgICAgICAgICAgICAgIGtlcm5lbEdGb3JjZS5zZXRCaW5kaW5nKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVfaW50ZXJ2YWw6IHN0ZXBJbnRlcnZhbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVfQXZlTW92ZW1lbnQ6IGtlcm5lbEF2ZU1vdmVtZW50XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBmaW5hbFBhcnRpY2xlRGF0YSA9IHlpZWxkIGtlcm5lbEdGb3JjZS5nZXRPdXRwdXQoKTtcbiAgICAgICAgICAgICAgICAvLyDmiYDmnInov63ku6PlrozmiJDlkI5cbiAgICAgICAgICAgICAgICBpZiAoY2FudmFzKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIOS8oOmAkuaVsOaNrue7meS4u+e6v+eoi1xuICAgICAgICAgICAgICAgICAgICBjdHgucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogTEFZT1VUX01FU1NBR0UuR1BVRU5ELFxuICAgICAgICAgICAgICAgICAgICAgICAgdmVydGV4RWRnZURhdGE6IGZpbmFsUGFydGljbGVEYXRhXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBlZGdlSW5kZXhCdWZmZXJEYXRhLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGVzLmZvckVhY2goKG5vZGUsIGkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHggPSBmaW5hbFBhcnRpY2xlRGF0YVs0ICogaV07XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB5ID0gZmluYWxQYXJ0aWNsZURhdGFbNCAqIGkgKyAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUueCA9IHg7XG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlLnkgPSB5O1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG9uTGF5b3V0RW5kKVxuICAgICAgICAgICAgICAgICAgICBvbkxheW91dEVuZCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB5aWVsZCBleGVjdXRlKCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBnZXRUeXBlKCkge1xuICAgICAgICByZXR1cm4gXCJnRm9yY2UtZ3B1XCI7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z0ZvcmNlLmpzLm1hcCIsIi8qKlxuICogQGZpbGVPdmVydmlldyBDb21ibyBmb3JjZSBsYXlvdXRcbiAqIEBhdXRob3Igc2hpd3Uud3l5QGFudGZpbi5jb21cbiAqL1xuaW1wb3J0IHsgQmFzZSB9IGZyb20gXCIuL2Jhc2VcIjtcbmltcG9ydCB7IGlzQXJyYXksIGlzTnVtYmVyLCBpc0Z1bmN0aW9uLCB0cmF2ZXJzZVRyZWVVcCwgaXNPYmplY3QsIGdldEVkZ2VUZXJtaW5hbCB9IGZyb20gXCIuLi91dGlsXCI7XG4vKipcbiAqIGZvcmNlIGxheW91dCBmb3IgZ3JhcGggd2l0aCBjb21ib3NcbiAqL1xuZXhwb3J0IGNsYXNzIENvbWJvRm9yY2VMYXlvdXQgZXh0ZW5kcyBCYXNlIHtcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIC8qKiDluIPlsYDkuK3lv4MgKi9cbiAgICAgICAgdGhpcy5jZW50ZXIgPSBbMCwgMF07XG4gICAgICAgIC8qKiDlgZzmraLov63ku6PnmoTmnIDlpKfov63ku6PmlbAgKi9cbiAgICAgICAgdGhpcy5tYXhJdGVyYXRpb24gPSAxMDA7XG4gICAgICAgIC8qKiDph43lipvlpKflsI/vvIzlvbHlk43lm77nmoTntKflh5HnqIvluqYgKi9cbiAgICAgICAgdGhpcy5ncmF2aXR5ID0gMTA7XG4gICAgICAgIC8qKiDnvqTnu4TkuK3lv4PlipvlpKflsI8gKi9cbiAgICAgICAgdGhpcy5jb21ib0dyYXZpdHkgPSAxMDtcbiAgICAgICAgLyoqIOm7mOiupOi+uemVv+W6piAqL1xuICAgICAgICB0aGlzLmxpbmtEaXN0YW5jZSA9IDEwO1xuICAgICAgICAvKiog5q+P5qyh6L+t5Luj5L2N56e755qE6KGw5YeP55u45YWz5Y+C5pWwICovXG4gICAgICAgIHRoaXMuYWxwaGEgPSAxO1xuICAgICAgICB0aGlzLmFscGhhTWluID0gMC4wMDE7XG4gICAgICAgIHRoaXMuYWxwaGFEZWNheSA9IDEgLSBNYXRoLnBvdyh0aGlzLmFscGhhTWluLCAoMSAvIDMwMCkpO1xuICAgICAgICB0aGlzLmFscGhhVGFyZ2V0ID0gMDtcbiAgICAgICAgLyoqIOiKgueCuei/kOWKqOmAn+W6puihsOWHj+WPguaVsCAqL1xuICAgICAgICB0aGlzLnZlbG9jaXR5RGVjYXkgPSAwLjY7XG4gICAgICAgIC8qKiDovrnlvJXlipvlpKflsI8gKi9cbiAgICAgICAgdGhpcy5lZGdlU3RyZW5ndGggPSAwLjY7XG4gICAgICAgIC8qKiDoioLngrnlvJXlipvlpKflsI8gKi9cbiAgICAgICAgdGhpcy5ub2RlU3RyZW5ndGggPSAzMDtcbiAgICAgICAgLyoqIOaYr+WQpuW8gOWQr+mYsuatoumHjeWPoCAqL1xuICAgICAgICB0aGlzLnByZXZlbnRPdmVybGFwID0gZmFsc2U7XG4gICAgICAgIC8qKiDmmK/lkKblvIDlkK/oioLngrnkuYvpl7TnmoTpmLLmraLph43lj6AgKi9cbiAgICAgICAgdGhpcy5wcmV2ZW50Tm9kZU92ZXJsYXAgPSBmYWxzZTtcbiAgICAgICAgLyoqIOaYr+WQpuW8gOWQryBDb21ibyDkuYvpl7TnmoTpmLLmraLph43lj6AgKi9cbiAgICAgICAgdGhpcy5wcmV2ZW50Q29tYm9PdmVybGFwID0gZmFsc2U7XG4gICAgICAgIC8qKiDpmLLmraLph43lj6DnmoTnorDmkp7lipvlpKflsI8gKi9cbiAgICAgICAgdGhpcy5jb2xsaWRlU3RyZW5ndGggPSB1bmRlZmluZWQ7XG4gICAgICAgIC8qKiDpmLLmraLph43lj6DnmoTnorDmkp7lipvlpKflsI8gKi9cbiAgICAgICAgdGhpcy5ub2RlQ29sbGlkZVN0cmVuZ3RoID0gMC41O1xuICAgICAgICAvKiog6Ziy5q2i6YeN5Y+g55qE56Kw5pKe5Yqb5aSn5bCPICovXG4gICAgICAgIHRoaXMuY29tYm9Db2xsaWRlU3RyZW5ndGggPSAwLjU7XG4gICAgICAgIC8qKiBDb21ibyDmnIDlsI/pl7Tot53vvIzpmLLmraLph43lj6Dml7bnmoTpl7TpmpkgKi9cbiAgICAgICAgdGhpcy5jb21ib1NwYWNpbmcgPSAyMDtcbiAgICAgICAgLyoqIENvbWJvIOWGhemDqOeahCBwYWRkaW5nICovXG4gICAgICAgIHRoaXMuY29tYm9QYWRkaW5nID0gMTA7XG4gICAgICAgIC8qKiDkvJjljJborqHnrpfmlqXlipvnmoTpgJ/luqbvvIzkuKToioLngrnpl7Tot53otoXov4cgb3B0aW1pemVSYW5nZUZhY3RvciAqIHdpZHRoIOWImeS4jeWGjeiuoeeul+aWpeWKm+WSjOmHjeWPoOaWpeWKmyAqL1xuICAgICAgICB0aGlzLm9wdGltaXplUmFuZ2VGYWN0b3IgPSAxO1xuICAgICAgICAvKiog5q+P5qyh6L+t5Luj55qE5Zue6LCD5Ye95pWwICovXG4gICAgICAgIHRoaXMub25UaWNrID0gKCkgPT4geyB9O1xuICAgICAgICAvKiog6L+t5Luj57uT5p2f55qE5Zue6LCD5Ye95pWwICovXG4gICAgICAgIHRoaXMub25MYXlvdXRFbmQgPSAoKSA9PiB7IH07XG4gICAgICAgIC8qKiDmoLnmja7ovrnkuKTnq6/oioLngrnlsYLnuqflt67ot53nmoTosIPmlbTlvJXlipvns7vmlbDnmoTlm6DlrZDvvIzlj5blgLzojIPlm7QgWzAsIDFd44CC5bGC57qn5beu6Led6LaK5aSn77yM5byV5Yqb6LaK5bCPICovXG4gICAgICAgIHRoaXMuZGVwdGhBdHRyYWN0aXZlRm9yY2VTY2FsZSA9IDE7XG4gICAgICAgIC8qKiDmoLnmja7ovrnkuKTnq6/oioLngrnlsYLnuqflt67ot53nmoTosIPmlbTmlqXlipvns7vmlbDnmoTlm6DlrZDvvIzlj5blgLzojIPlm7QgWzEsIEluZmluaXR5XeOAguWxgue6p+W3rui3nei2iuWkp++8jOaWpeWKm+i2iuWkpyAqL1xuICAgICAgICB0aGlzLmRlcHRoUmVwdWxzaXZlRm9yY2VTY2FsZSA9IDI7XG4gICAgICAgIC8qKiDlhoXpg6jorqHnrpflj4LmlbAgKi9cbiAgICAgICAgdGhpcy5ub2RlcyA9IFtdO1xuICAgICAgICB0aGlzLmVkZ2VzID0gW107XG4gICAgICAgIHRoaXMuY29tYm9zID0gW107XG4gICAgICAgIHRoaXMuY29tYm9UcmVlcyA9IFtdO1xuICAgICAgICB0aGlzLndpZHRoID0gMzAwO1xuICAgICAgICB0aGlzLmhlaWdodCA9IDMwMDtcbiAgICAgICAgdGhpcy5iaWFzID0gW107XG4gICAgICAgIHRoaXMubm9kZU1hcCA9IHt9O1xuICAgICAgICB0aGlzLm9yaUNvbWJvTWFwID0ge307XG4gICAgICAgIHRoaXMuaW5kZXhNYXAgPSB7fTtcbiAgICAgICAgdGhpcy5jb21ib01hcCA9IHt9O1xuICAgICAgICB0aGlzLnByZXZpb3VzTGF5b3V0ZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy51cGRhdGVDZmcob3B0aW9ucyk7XG4gICAgfVxuICAgIGdldERlZmF1bHRDZmcoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBtYXhJdGVyYXRpb246IDEwMCxcbiAgICAgICAgICAgIGNlbnRlcjogWzAsIDBdLFxuICAgICAgICAgICAgZ3Jhdml0eTogMTAsXG4gICAgICAgICAgICBzcGVlZDogMSxcbiAgICAgICAgICAgIGNvbWJvR3Jhdml0eTogMzAsXG4gICAgICAgICAgICBwcmV2ZW50T3ZlcmxhcDogZmFsc2UsXG4gICAgICAgICAgICBwcmV2ZW50Q29tYm9PdmVybGFwOiB0cnVlLFxuICAgICAgICAgICAgcHJldmVudE5vZGVPdmVybGFwOiB0cnVlLFxuICAgICAgICAgICAgbm9kZVNwYWNpbmc6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGNvbGxpZGVTdHJlbmd0aDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgbm9kZUNvbGxpZGVTdHJlbmd0aDogMC41LFxuICAgICAgICAgICAgY29tYm9Db2xsaWRlU3RyZW5ndGg6IDAuNSxcbiAgICAgICAgICAgIGNvbWJvU3BhY2luZzogMjAsXG4gICAgICAgICAgICBjb21ib1BhZGRpbmc6IDEwLFxuICAgICAgICAgICAgZWRnZVN0cmVuZ3RoOiAwLjYsXG4gICAgICAgICAgICBub2RlU3RyZW5ndGg6IDMwLFxuICAgICAgICAgICAgbGlua0Rpc3RhbmNlOiAxMFxuICAgICAgICB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiDmiafooYzluIPlsYBcbiAgICAgKi9cbiAgICBleGVjdXRlKCkge1xuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAgICAgY29uc3Qgbm9kZXMgPSBzZWxmLm5vZGVzO1xuICAgICAgICBjb25zdCBjZW50ZXIgPSBzZWxmLmNlbnRlcjtcbiAgICAgICAgc2VsZi5jb21ib1RyZWUgPSB7XG4gICAgICAgICAgICBpZDogXCJjb21ib1RyZWVSb290XCIsXG4gICAgICAgICAgICBkZXB0aDogLTEsXG4gICAgICAgICAgICBjaGlsZHJlbjogc2VsZi5jb21ib1RyZWVzXG4gICAgICAgIH07XG4gICAgICAgIGlmICghbm9kZXMgfHwgbm9kZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBpZiAoc2VsZi5vbkxheW91dEVuZClcbiAgICAgICAgICAgICAgICBzZWxmLm9uTGF5b3V0RW5kKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgbm9kZXNbMF0ueCA9IGNlbnRlclswXTtcbiAgICAgICAgICAgIG5vZGVzWzBdLnkgPSBjZW50ZXJbMV07XG4gICAgICAgICAgICBpZiAoc2VsZi5vbkxheW91dEVuZClcbiAgICAgICAgICAgICAgICBzZWxmLm9uTGF5b3V0RW5kKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgc2VsZi5pbml0VmFscygpO1xuICAgICAgICAvLyBsYXlvdXRcbiAgICAgICAgc2VsZi5ydW4oKTtcbiAgICAgICAgaWYgKHNlbGYub25MYXlvdXRFbmQpXG4gICAgICAgICAgICBzZWxmLm9uTGF5b3V0RW5kKCk7XG4gICAgfVxuICAgIHJ1bigpIHtcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICAgIGNvbnN0IG5vZGVzID0gc2VsZi5ub2RlcztcbiAgICAgICAgY29uc3QgbWF4SXRlcmF0aW9uID0gc2VsZi5wcmV2aW91c0xheW91dGVkXG4gICAgICAgICAgICA/IHNlbGYubWF4SXRlcmF0aW9uIC8gNVxuICAgICAgICAgICAgOiBzZWxmLm1heEl0ZXJhdGlvbjtcbiAgICAgICAgaWYgKCFzZWxmLndpZHRoICYmIHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIHNlbGYud2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXNlbGYuaGVpZ2h0ICYmIHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIHNlbGYuaGVpZ2h0ID0gd2luZG93LmlubmVySGVpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNlbnRlciA9IHNlbGYuY2VudGVyO1xuICAgICAgICBjb25zdCB2ZWxvY2l0eURlY2F5ID0gc2VsZi52ZWxvY2l0eURlY2F5O1xuICAgICAgICAvLyBpbml0IHRoZSBwb3NpdGlvbnMgdG8gbWFrZSB0aGUgbm9kZXMgd2l0aCBzYW1lIGNvbWJvIGdhdGhlciBhcm91bmQgdGhlIGNvbWJvXG4gICAgICAgIGNvbnN0IGNvbWJvTWFwID0gc2VsZi5jb21ib01hcDtcbiAgICAgICAgaWYgKCFzZWxmLnByZXZpb3VzTGF5b3V0ZWQpXG4gICAgICAgICAgICBzZWxmLmluaXRQb3MoY29tYm9NYXApO1xuICAgICAgICAvLyBpdGVyYXRlXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWF4SXRlcmF0aW9uOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGRpc3BsYWNlbWVudHMgPSBbXTtcbiAgICAgICAgICAgIG5vZGVzLmZvckVhY2goKF8sIGopID0+IHtcbiAgICAgICAgICAgICAgICBkaXNwbGFjZW1lbnRzW2pdID0geyB4OiAwLCB5OiAwIH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHNlbGYuYXBwbHlDYWxjdWxhdGUoZGlzcGxhY2VtZW50cyk7XG4gICAgICAgICAgICAvLyBncmF2aXR5IGZvciBjb21ib3NcbiAgICAgICAgICAgIHNlbGYuYXBwbHlDb21ib0NlbnRlckZvcmNlKGRpc3BsYWNlbWVudHMpO1xuICAgICAgICAgICAgLy8gbW92ZVxuICAgICAgICAgICAgbm9kZXMuZm9yRWFjaCgobiwgaikgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghaXNOdW1iZXIobi54KSB8fCAhaXNOdW1iZXIobi55KSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIG4ueCArPSBkaXNwbGFjZW1lbnRzW2pdLnggKiB2ZWxvY2l0eURlY2F5O1xuICAgICAgICAgICAgICAgIG4ueSArPSBkaXNwbGFjZW1lbnRzW2pdLnkgKiB2ZWxvY2l0eURlY2F5O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBzZWxmLmFscGhhICs9IChzZWxmLmFscGhhVGFyZ2V0IC0gc2VsZi5hbHBoYSkgKiBzZWxmLmFscGhhRGVjYXk7XG4gICAgICAgICAgICBzZWxmLm9uVGljaygpO1xuICAgICAgICB9XG4gICAgICAgIC8vIG1vdmUgdG8gY2VudGVyXG4gICAgICAgIGNvbnN0IG1lYW5DZW50ZXIgPSBbMCwgMF07XG4gICAgICAgIG5vZGVzLmZvckVhY2goKG4pID0+IHtcbiAgICAgICAgICAgIGlmICghaXNOdW1iZXIobi54KSB8fCAhaXNOdW1iZXIobi55KSlcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBtZWFuQ2VudGVyWzBdICs9IG4ueDtcbiAgICAgICAgICAgIG1lYW5DZW50ZXJbMV0gKz0gbi55O1xuICAgICAgICB9KTtcbiAgICAgICAgbWVhbkNlbnRlclswXSAvPSBub2Rlcy5sZW5ndGg7XG4gICAgICAgIG1lYW5DZW50ZXJbMV0gLz0gbm9kZXMubGVuZ3RoO1xuICAgICAgICBjb25zdCBjZW50ZXJPZmZzZXQgPSBbY2VudGVyWzBdIC0gbWVhbkNlbnRlclswXSwgY2VudGVyWzFdIC0gbWVhbkNlbnRlclsxXV07XG4gICAgICAgIG5vZGVzLmZvckVhY2goKG4sIGopID0+IHtcbiAgICAgICAgICAgIGlmICghaXNOdW1iZXIobi54KSB8fCAhaXNOdW1iZXIobi55KSlcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBuLnggKz0gY2VudGVyT2Zmc2V0WzBdO1xuICAgICAgICAgICAgbi55ICs9IGNlbnRlck9mZnNldFsxXTtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGFycmFuZ2UgdGhlIGVtcHR5IGNvbWJvXG4gICAgICAgIHNlbGYuY29tYm9zLmZvckVhY2goKGNvbWJvKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBtYXBwZWQgPSBjb21ib01hcFtjb21iby5pZF07XG4gICAgICAgICAgICBpZiAobWFwcGVkICYmIG1hcHBlZC5lbXB0eSkge1xuICAgICAgICAgICAgICAgIGNvbWJvLnggPSBtYXBwZWQuY3ggfHwgY29tYm8ueDtcbiAgICAgICAgICAgICAgICBjb21iby55ID0gbWFwcGVkLmN5IHx8IGNvbWJvLnk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBzZWxmLnByZXZpb3VzTGF5b3V0ZWQgPSB0cnVlO1xuICAgIH1cbiAgICBpbml0VmFscygpIHtcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICAgIGNvbnN0IGVkZ2VzID0gc2VsZi5lZGdlcztcbiAgICAgICAgY29uc3Qgbm9kZXMgPSBzZWxmLm5vZGVzO1xuICAgICAgICBjb25zdCBjb21ib3MgPSBzZWxmLmNvbWJvcztcbiAgICAgICAgY29uc3QgY291bnQgPSB7fTtcbiAgICAgICAgY29uc3Qgbm9kZU1hcCA9IHt9O1xuICAgICAgICBjb25zdCBpbmRleE1hcCA9IHt9O1xuICAgICAgICBub2Rlcy5mb3JFYWNoKChub2RlLCBpKSA9PiB7XG4gICAgICAgICAgICBub2RlTWFwW25vZGUuaWRdID0gbm9kZTtcbiAgICAgICAgICAgIGluZGV4TWFwW25vZGUuaWRdID0gaTtcbiAgICAgICAgfSk7XG4gICAgICAgIHNlbGYubm9kZU1hcCA9IG5vZGVNYXA7XG4gICAgICAgIHNlbGYuaW5kZXhNYXAgPSBpbmRleE1hcDtcbiAgICAgICAgY29uc3Qgb3JpQ29tYm9NYXAgPSB7fTtcbiAgICAgICAgY29tYm9zLmZvckVhY2goKGNvbWJvKSA9PiB7XG4gICAgICAgICAgICBvcmlDb21ib01hcFtjb21iby5pZF0gPSBjb21ibztcbiAgICAgICAgfSk7XG4gICAgICAgIHNlbGYub3JpQ29tYm9NYXAgPSBvcmlDb21ib01hcDtcbiAgICAgICAgc2VsZi5jb21ib01hcCA9IHNlbGYuZ2V0Q29tYm9NYXAoKTtcbiAgICAgICAgY29uc3QgcHJldmVudE92ZXJsYXAgPSBzZWxmLnByZXZlbnRPdmVybGFwO1xuICAgICAgICBzZWxmLnByZXZlbnRDb21ib092ZXJsYXAgPSBzZWxmLnByZXZlbnRDb21ib092ZXJsYXAgfHwgcHJldmVudE92ZXJsYXA7XG4gICAgICAgIHNlbGYucHJldmVudE5vZGVPdmVybGFwID0gc2VsZi5wcmV2ZW50Tm9kZU92ZXJsYXAgfHwgcHJldmVudE92ZXJsYXA7XG4gICAgICAgIGNvbnN0IGNvbGxpZGVTdHJlbmd0aCA9IHNlbGYuY29sbGlkZVN0cmVuZ3RoO1xuICAgICAgICBpZiAoY29sbGlkZVN0cmVuZ3RoKSB7XG4gICAgICAgICAgICBzZWxmLmNvbWJvQ29sbGlkZVN0cmVuZ3RoID0gY29sbGlkZVN0cmVuZ3RoO1xuICAgICAgICAgICAgc2VsZi5ub2RlQ29sbGlkZVN0cmVuZ3RoID0gY29sbGlkZVN0cmVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIHNlbGYuY29tYm9Db2xsaWRlU3RyZW5ndGggPSBzZWxmLmNvbWJvQ29sbGlkZVN0cmVuZ3RoXG4gICAgICAgICAgICA/IHNlbGYuY29tYm9Db2xsaWRlU3RyZW5ndGhcbiAgICAgICAgICAgIDogMDtcbiAgICAgICAgc2VsZi5ub2RlQ29sbGlkZVN0cmVuZ3RoID0gc2VsZi5ub2RlQ29sbGlkZVN0cmVuZ3RoXG4gICAgICAgICAgICA/IHNlbGYubm9kZUNvbGxpZGVTdHJlbmd0aFxuICAgICAgICAgICAgOiAwO1xuICAgICAgICAvLyBnZXQgZWRnZSBiaWFzXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWRnZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZSA9IGdldEVkZ2VUZXJtaW5hbChlZGdlc1tpXSwgJ3NvdXJjZScpO1xuICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gZ2V0RWRnZVRlcm1pbmFsKGVkZ2VzW2ldLCAndGFyZ2V0Jyk7XG4gICAgICAgICAgICBpZiAoY291bnRbc291cmNlXSlcbiAgICAgICAgICAgICAgICBjb3VudFtzb3VyY2VdKys7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgY291bnRbc291cmNlXSA9IDE7XG4gICAgICAgICAgICBpZiAoY291bnRbdGFyZ2V0XSlcbiAgICAgICAgICAgICAgICBjb3VudFt0YXJnZXRdKys7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgY291bnRbdGFyZ2V0XSA9IDE7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYmlhcyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVkZ2VzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2UgPSBnZXRFZGdlVGVybWluYWwoZWRnZXNbaV0sICdzb3VyY2UnKTtcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGdldEVkZ2VUZXJtaW5hbChlZGdlc1tpXSwgJ3RhcmdldCcpO1xuICAgICAgICAgICAgYmlhc1tpXSA9IGNvdW50W3NvdXJjZV0gLyAoY291bnRbc291cmNlXSArIGNvdW50W3RhcmdldF0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYmlhcyA9IGJpYXM7XG4gICAgICAgIGNvbnN0IG5vZGVTaXplID0gc2VsZi5ub2RlU2l6ZTtcbiAgICAgICAgY29uc3Qgbm9kZVNwYWNpbmcgPSBzZWxmLm5vZGVTcGFjaW5nO1xuICAgICAgICBsZXQgbm9kZVNpemVGdW5jO1xuICAgICAgICBsZXQgbm9kZVNwYWNpbmdGdW5jO1xuICAgICAgICAvLyBub2RlU3BhY2luZyB0byBmdW5jdGlvblxuICAgICAgICBpZiAoaXNOdW1iZXIobm9kZVNwYWNpbmcpKSB7XG4gICAgICAgICAgICBub2RlU3BhY2luZ0Z1bmMgPSAoKSA9PiBub2RlU3BhY2luZztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc0Z1bmN0aW9uKG5vZGVTcGFjaW5nKSkge1xuICAgICAgICAgICAgbm9kZVNwYWNpbmdGdW5jID0gbm9kZVNwYWNpbmc7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBub2RlU3BhY2luZ0Z1bmMgPSAoKSA9PiAwO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubm9kZVNwYWNpbmcgPSBub2RlU3BhY2luZ0Z1bmM7XG4gICAgICAgIC8vIG5vZGVTaXplIHRvIGZ1bmN0aW9uXG4gICAgICAgIGlmICghbm9kZVNpemUpIHtcbiAgICAgICAgICAgIG5vZGVTaXplRnVuYyA9IChkKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGQuc2l6ZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNBcnJheShkLnNpemUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXMgPSBkLnNpemVbMF0gPiBkLnNpemVbMV0gPyBkLnNpemVbMF0gOiBkLnNpemVbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzIC8gMjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoaXNPYmplY3QoZC5zaXplKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzID0gZC5zaXplLndpZHRoID4gZC5zaXplLmhlaWdodCA/IGQuc2l6ZS53aWR0aCA6IGQuc2l6ZS5oZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzIC8gMjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZC5zaXplIC8gMjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIDEwO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc0Z1bmN0aW9uKG5vZGVTaXplKSkge1xuICAgICAgICAgICAgbm9kZVNpemVGdW5jID0gKGQpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbm9kZVNpemUoZCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzQXJyYXkobm9kZVNpemUpKSB7XG4gICAgICAgICAgICBjb25zdCBsYXJnZXIgPSBub2RlU2l6ZVswXSA+IG5vZGVTaXplWzFdID8gbm9kZVNpemVbMF0gOiBub2RlU2l6ZVsxXTtcbiAgICAgICAgICAgIGNvbnN0IHJhZGl1cyA9IGxhcmdlciAvIDI7XG4gICAgICAgICAgICBub2RlU2l6ZUZ1bmMgPSAoZCkgPT4gcmFkaXVzO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gbnVtYmVyIHR5cGVcbiAgICAgICAgICAgIGNvbnN0IHJhZGl1cyA9IG5vZGVTaXplIC8gMjtcbiAgICAgICAgICAgIG5vZGVTaXplRnVuYyA9IChkKSA9PiByYWRpdXM7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ub2RlU2l6ZSA9IG5vZGVTaXplRnVuYztcbiAgICAgICAgLy8gY29tYm9TcGFjaW5nIHRvIGZ1bmN0aW9uXG4gICAgICAgIGNvbnN0IGNvbWJvU3BhY2luZyA9IHNlbGYuY29tYm9TcGFjaW5nO1xuICAgICAgICBsZXQgY29tYm9TcGFjaW5nRnVuYztcbiAgICAgICAgaWYgKGlzTnVtYmVyKGNvbWJvU3BhY2luZykpIHtcbiAgICAgICAgICAgIGNvbWJvU3BhY2luZ0Z1bmMgPSAoKSA9PiBjb21ib1NwYWNpbmc7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNGdW5jdGlvbihjb21ib1NwYWNpbmcpKSB7XG4gICAgICAgICAgICBjb21ib1NwYWNpbmdGdW5jID0gY29tYm9TcGFjaW5nO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gbnVsbCB0eXBlXG4gICAgICAgICAgICBjb21ib1NwYWNpbmdGdW5jID0gKCkgPT4gMDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbWJvU3BhY2luZyA9IGNvbWJvU3BhY2luZ0Z1bmM7XG4gICAgICAgIC8vIGNvbWJvUGFkZGluZyB0byBmdW5jdGlvblxuICAgICAgICBjb25zdCBjb21ib1BhZGRpbmcgPSBzZWxmLmNvbWJvUGFkZGluZztcbiAgICAgICAgbGV0IGNvbWJvUGFkZGluZ0Z1bmM7XG4gICAgICAgIGlmIChpc051bWJlcihjb21ib1BhZGRpbmcpKSB7XG4gICAgICAgICAgICBjb21ib1BhZGRpbmdGdW5jID0gKCkgPT4gY29tYm9QYWRkaW5nO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzQXJyYXkoY29tYm9QYWRkaW5nKSkge1xuICAgICAgICAgICAgY29tYm9QYWRkaW5nRnVuYyA9ICgpID0+IE1hdGgubWF4LmFwcGx5KG51bGwsIGNvbWJvUGFkZGluZyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNGdW5jdGlvbihjb21ib1BhZGRpbmcpKSB7XG4gICAgICAgICAgICBjb21ib1BhZGRpbmdGdW5jID0gY29tYm9QYWRkaW5nO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gbnVsbCB0eXBlXG4gICAgICAgICAgICBjb21ib1BhZGRpbmdGdW5jID0gKCkgPT4gMDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbWJvUGFkZGluZyA9IGNvbWJvUGFkZGluZ0Z1bmM7XG4gICAgICAgIC8vIGxpbmtEaXN0YW5jZSB0byBmdW5jdGlvblxuICAgICAgICBsZXQgbGlua0Rpc3RhbmNlID0gdGhpcy5saW5rRGlzdGFuY2U7XG4gICAgICAgIGxldCBsaW5rRGlzdGFuY2VGdW5jO1xuICAgICAgICBpZiAoIWxpbmtEaXN0YW5jZSkge1xuICAgICAgICAgICAgbGlua0Rpc3RhbmNlID0gMTA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzTnVtYmVyKGxpbmtEaXN0YW5jZSkpIHtcbiAgICAgICAgICAgIGxpbmtEaXN0YW5jZUZ1bmMgPSAoZCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBsaW5rRGlzdGFuY2U7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGlua0Rpc3RhbmNlRnVuYyA9IGxpbmtEaXN0YW5jZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxpbmtEaXN0YW5jZSA9IGxpbmtEaXN0YW5jZUZ1bmM7XG4gICAgICAgIC8vIGxpbmtTdHJlbmd0aCB0byBmdW5jdGlvblxuICAgICAgICBsZXQgZWRnZVN0cmVuZ3RoID0gdGhpcy5lZGdlU3RyZW5ndGg7XG4gICAgICAgIGxldCBlZGdlU3RyZW5ndGhGdW5jO1xuICAgICAgICBpZiAoIWVkZ2VTdHJlbmd0aCkge1xuICAgICAgICAgICAgZWRnZVN0cmVuZ3RoID0gMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNOdW1iZXIoZWRnZVN0cmVuZ3RoKSkge1xuICAgICAgICAgICAgZWRnZVN0cmVuZ3RoRnVuYyA9IChkKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVkZ2VTdHJlbmd0aDtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBlZGdlU3RyZW5ndGhGdW5jID0gZWRnZVN0cmVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZWRnZVN0cmVuZ3RoID0gZWRnZVN0cmVuZ3RoRnVuYztcbiAgICAgICAgLy8gbm9kZVN0cmVuZ3RoIHRvIGZ1bmN0aW9uXG4gICAgICAgIGxldCBub2RlU3RyZW5ndGggPSB0aGlzLm5vZGVTdHJlbmd0aDtcbiAgICAgICAgbGV0IG5vZGVTdHJlbmd0aEZ1bmM7XG4gICAgICAgIGlmICghbm9kZVN0cmVuZ3RoKSB7XG4gICAgICAgICAgICBub2RlU3RyZW5ndGggPSAzMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNOdW1iZXIobm9kZVN0cmVuZ3RoKSkge1xuICAgICAgICAgICAgbm9kZVN0cmVuZ3RoRnVuYyA9IChkKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5vZGVTdHJlbmd0aDtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBub2RlU3RyZW5ndGhGdW5jID0gbm9kZVN0cmVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubm9kZVN0cmVuZ3RoID0gbm9kZVN0cmVuZ3RoRnVuYztcbiAgICB9XG4gICAgaW5pdFBvcyhjb21ib01hcCkge1xuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAgICAgY29uc3Qgbm9kZXMgPSBzZWxmLm5vZGVzO1xuICAgICAgICBub2Rlcy5mb3JFYWNoKChub2RlLCBpKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb21ib0lkID0gbm9kZS5jb21ib0lkO1xuICAgICAgICAgICAgY29uc3QgY29tYm8gPSBjb21ib01hcFtjb21ib0lkXTtcbiAgICAgICAgICAgIGlmIChjb21ib0lkICYmIGNvbWJvKSB7XG4gICAgICAgICAgICAgICAgbm9kZS54ID0gY29tYm8uY3ggKyAxMDAgLyAoaSArIDEpO1xuICAgICAgICAgICAgICAgIG5vZGUueSA9IGNvbWJvLmN5ICsgMTAwIC8gKGkgKyAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG5vZGUueCA9IDEwMCAvIChpICsgMSk7XG4gICAgICAgICAgICAgICAgbm9kZS55ID0gMTAwIC8gKGkgKyAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGdldENvbWJvTWFwKCkge1xuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAgICAgY29uc3Qgbm9kZU1hcCA9IHNlbGYubm9kZU1hcDtcbiAgICAgICAgY29uc3QgaW5kZXhNYXAgPSBzZWxmLmluZGV4TWFwO1xuICAgICAgICBjb25zdCBjb21ib1RyZWVzID0gc2VsZi5jb21ib1RyZWVzO1xuICAgICAgICBjb25zdCBvcmlDb21ib01hcCA9IHNlbGYub3JpQ29tYm9NYXA7XG4gICAgICAgIGNvbnN0IGNvbWJvTWFwID0ge307XG4gICAgICAgIChjb21ib1RyZWVzIHx8IFtdKS5mb3JFYWNoKChjdHJlZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdHJlZUNoaWxkcmVuID0gW107XG4gICAgICAgICAgICB0cmF2ZXJzZVRyZWVVcChjdHJlZSwgKHRyZWVOb2RlKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRyZWVOb2RlLml0ZW1UeXBlID09PSBcIm5vZGVcIilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7IC8vIHNraXAgaXRcbiAgICAgICAgICAgICAgICBpZiAoIW9yaUNvbWJvTWFwW3RyZWVOb2RlLmlkXSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7IC8vIG1lYW5zIGl0IGlzIGhpZGRlbiwgc2tpcCBpdFxuICAgICAgICAgICAgICAgIGlmIChjb21ib01hcFt0cmVlTm9kZS5pZF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21ibyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiB0cmVlTm9kZS5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHRyZWVOb2RlLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgY3g6IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICBjeTogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGg6IHNlbGYub3JpQ29tYm9NYXBbdHJlZU5vZGUuaWRdLmRlcHRoIHx8IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbjogW11cbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgY29tYm9NYXBbdHJlZU5vZGUuaWRdID0gY29tYm87XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gdHJlZU5vZGUuY2hpbGRyZW47XG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuLmZvckVhY2goKGNoaWxkKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbWJvTWFwW2NoaWxkLmlkXSAmJiAhbm9kZU1hcFtjaGlsZC5pZF0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7IC8vIG1lYW5zIGl0IGlzIGhpZGRlblxuICAgICAgICAgICAgICAgICAgICAgICAgdHJlZUNoaWxkcmVuLnB1c2goY2hpbGQpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgYyA9IGNvbWJvTWFwW3RyZWVOb2RlLmlkXTtcbiAgICAgICAgICAgICAgICBjLmN4ID0gMDtcbiAgICAgICAgICAgICAgICBjLmN5ID0gMDtcbiAgICAgICAgICAgICAgICAvLyBJbiBvcmRlciB0byBsYXlvdXQgdGhlIGVtcHR5IGNvbWJvLCBhZGQgYSB2aXJ0dWFsIG5vZGUgdG8gaXRcbiAgICAgICAgICAgICAgICBpZiAodHJlZUNoaWxkcmVuLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBjLmVtcHR5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3JpQ29tYm8gPSBvcmlDb21ib01hcFt0cmVlTm9kZS5pZF07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlkeCA9IE9iamVjdC5rZXlzKG5vZGVNYXApLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmlydHVhbE5vZGVJZCA9IGAke3RyZWVOb2RlLmlkfS12aXN1YWwtY2hpbGQtJHtpZHh9YDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm5vZGUgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogdmlydHVhbE5vZGVJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHg6IG9yaUNvbWJvLngsXG4gICAgICAgICAgICAgICAgICAgICAgICB5OiBvcmlDb21iby55LFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGg6IGMuZGVwdGggKyAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbVR5cGU6IFwibm9kZVwiXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIHNlbGYubm9kZXMucHVzaCh2bm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIG5vZGVNYXBbdmlydHVhbE5vZGVJZF0gPSB2bm9kZTtcbiAgICAgICAgICAgICAgICAgICAgaW5kZXhNYXBbdmlydHVhbE5vZGVJZF0gPSBpZHg7XG4gICAgICAgICAgICAgICAgICAgIGMuY3ggPSBvcmlDb21iby54O1xuICAgICAgICAgICAgICAgICAgICBjLmN5ID0gb3JpQ29tYm8ueTtcbiAgICAgICAgICAgICAgICAgICAgdHJlZUNoaWxkcmVuLnB1c2godm5vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0cmVlQ2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgYy5jb3VudCsrO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQuaXRlbVR5cGUgIT09IFwibm9kZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZENvbWJvID0gY29tYm9NYXBbY2hpbGQuaWRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzTnVtYmVyKGNoaWxkQ29tYm8uY3gpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMuY3ggKz0gY2hpbGRDb21iby5jeDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc051bWJlcihjaGlsZENvbWJvLmN5KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLmN5ICs9IGNoaWxkQ29tYm8uY3k7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm9kZSA9IG5vZGVNYXBbY2hpbGQuaWRdO1xuICAgICAgICAgICAgICAgICAgICAvLyBtZWFucyB0aGUgbm9kZSBpcyBoaWRkZW4sIHNraXAgaXRcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFub2RlKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNOdW1iZXIobm9kZS54KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYy5jeCArPSBub2RlLng7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzTnVtYmVyKG5vZGUueSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGMuY3kgKz0gbm9kZS55O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgYy5jeCAvPSBjLmNvdW50O1xuICAgICAgICAgICAgICAgIGMuY3kgLz0gYy5jb3VudDtcbiAgICAgICAgICAgICAgICBjLmNoaWxkcmVuID0gdHJlZUNoaWxkcmVuO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gY29tYm9NYXA7XG4gICAgfVxuICAgIGFwcGx5Q29tYm9DZW50ZXJGb3JjZShkaXNwbGFjZW1lbnRzKSB7XG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgICAgICBjb25zdCBncmF2aXR5ID0gc2VsZi5ncmF2aXR5O1xuICAgICAgICBjb25zdCBjb21ib0dyYXZpdHkgPSBzZWxmLmNvbWJvR3Jhdml0eSB8fCBncmF2aXR5O1xuICAgICAgICBjb25zdCBhbHBoYSA9IHRoaXMuYWxwaGE7XG4gICAgICAgIGNvbnN0IGNvbWJvVHJlZXMgPSBzZWxmLmNvbWJvVHJlZXM7XG4gICAgICAgIGNvbnN0IGluZGV4TWFwID0gc2VsZi5pbmRleE1hcDtcbiAgICAgICAgY29uc3Qgbm9kZU1hcCA9IHNlbGYubm9kZU1hcDtcbiAgICAgICAgY29uc3QgY29tYm9NYXAgPSBzZWxmLmNvbWJvTWFwO1xuICAgICAgICAoY29tYm9UcmVlcyB8fCBbXSkuZm9yRWFjaCgoY3RyZWUpID0+IHtcbiAgICAgICAgICAgIHRyYXZlcnNlVHJlZVVwKGN0cmVlLCAodHJlZU5vZGUpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodHJlZU5vZGUuaXRlbVR5cGUgPT09IFwibm9kZVwiKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gc2tpcCBpdFxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbWJvID0gY29tYm9NYXBbdHJlZU5vZGUuaWRdO1xuICAgICAgICAgICAgICAgIC8vIG1lYW5zIHRoZSBjb21ibyBpcyBoaWRkZW4sIHNraXAgaXRcbiAgICAgICAgICAgICAgICBpZiAoIWNvbWJvKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjb25zdCBjID0gY29tYm9NYXBbdHJlZU5vZGUuaWRdO1xuICAgICAgICAgICAgICAgIC8vIGhpZ2hlciBkZXB0aCB0aGUgY29tYm8sIGxhcmdlciB0aGUgZ3Jhdml0eVxuICAgICAgICAgICAgICAgIGNvbnN0IGdyYXZpdHlTY2FsZSA9ICgoYy5kZXB0aCArIDEpIC8gMTApICogMC41O1xuICAgICAgICAgICAgICAgIC8vIGFwcGx5IGNvbWJvIGNlbnRlciBmb3JjZSBmb3IgYWxsIHRoZSBkZXNjZW5kIG5vZGVzIGluIHRoaXMgY29tYm9cbiAgICAgICAgICAgICAgICAvLyBhbmQgdXBkYXRlIHRoZSBjZW50ZXIgcG9zaXRpb24gYW5kIGNvdW50IGZvciB0aGlzIGNvbWJvXG4gICAgICAgICAgICAgICAgY29uc3QgY29tYm9YID0gYy5jeDtcbiAgICAgICAgICAgICAgICBjb25zdCBjb21ib1kgPSBjLmN5O1xuICAgICAgICAgICAgICAgIGMuY3ggPSAwO1xuICAgICAgICAgICAgICAgIGMuY3kgPSAwO1xuICAgICAgICAgICAgICAgIGMuY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkLml0ZW1UeXBlICE9PSBcIm5vZGVcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hpbGRDb21ibyA9IGNvbWJvTWFwW2NoaWxkLmlkXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZENvbWJvICYmIGlzTnVtYmVyKGNoaWxkQ29tYm8uY3gpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMuY3ggKz0gY2hpbGRDb21iby5jeDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZENvbWJvICYmIGlzTnVtYmVyKGNoaWxkQ29tYm8uY3kpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMuY3kgKz0gY2hpbGRDb21iby5jeTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBub2RlID0gbm9kZU1hcFtjaGlsZC5pZF07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZlY1ggPSAobm9kZS54IC0gY29tYm9YKSB8fCAwLjAwNTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmVjWSA9IChub2RlLnkgLSBjb21ib1kpIHx8IDAuMDA1O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsID0gTWF0aC5zcXJ0KHZlY1ggKiB2ZWNYICsgdmVjWSAqIHZlY1kpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZElkeCA9IGluZGV4TWFwW25vZGUuaWRdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJhbXMgPSAoKGNvbWJvR3Jhdml0eSAqIGFscGhhKSAvIGwpICogZ3Jhdml0eVNjYWxlO1xuICAgICAgICAgICAgICAgICAgICBkaXNwbGFjZW1lbnRzW2NoaWxkSWR4XS54IC09IHZlY1ggKiBwYXJhbXM7XG4gICAgICAgICAgICAgICAgICAgIGRpc3BsYWNlbWVudHNbY2hpbGRJZHhdLnkgLT0gdmVjWSAqIHBhcmFtcztcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzTnVtYmVyKG5vZGUueCkpXG4gICAgICAgICAgICAgICAgICAgICAgICBjLmN4ICs9IG5vZGUueDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzTnVtYmVyKG5vZGUueSkpXG4gICAgICAgICAgICAgICAgICAgICAgICBjLmN5ICs9IG5vZGUueTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjLmN4IC89IGMuY291bnQ7XG4gICAgICAgICAgICAgICAgYy5jeSAvPSBjLmNvdW50O1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBhcHBseUNhbGN1bGF0ZShkaXNwbGFjZW1lbnRzKSB7XG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgICAgICBjb25zdCBjb21ib01hcCA9IHNlbGYuY29tYm9NYXA7XG4gICAgICAgIGNvbnN0IG5vZGVzID0gc2VsZi5ub2RlcztcbiAgICAgICAgLy8gc3RvcmUgdGhlIHZ4LCB2eSwgYW5kIGRpc3RhbmNlIHRvIHJlZHVjZSBkdWxwbGljYXRlIGNhbGN1bGF0aW9uXG4gICAgICAgIGNvbnN0IHZlY01hcCA9IHt9O1xuICAgICAgICBub2Rlcy5mb3JFYWNoKCh2LCBpKSA9PiB7XG4gICAgICAgICAgICBub2Rlcy5mb3JFYWNoKCh1LCBqKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGkgPCBqKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgY29uc3QgdnggPSAodi54IC0gdS54KSB8fCAwLjAwNTtcbiAgICAgICAgICAgICAgICBjb25zdCB2eSA9ICh2LnkgLSB1LnkpIHx8IDAuMDA1O1xuICAgICAgICAgICAgICAgIGxldCB2bDIgPSB2eCAqIHZ4ICsgdnkgKiB2eTtcbiAgICAgICAgICAgICAgICBjb25zdCB2bCA9IE1hdGguc3FydCh2bDIpO1xuICAgICAgICAgICAgICAgIGlmICh2bDIgPCAxKVxuICAgICAgICAgICAgICAgICAgICB2bDIgPSB2bDtcbiAgICAgICAgICAgICAgICB2ZWNNYXBbYCR7di5pZH0tJHt1LmlkfWBdID0geyB2eCwgdnksIHZsMiwgdmwgfTtcbiAgICAgICAgICAgICAgICB2ZWNNYXBbYCR7dS5pZH0tJHt2LmlkfWBdID0geyB2bDIsIHZsLCB2eDogLXZ4LCB2eTogLXZ5IH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGdldCB0aGUgc2l6ZXMgb2YgdGhlIGNvbWJvc1xuICAgICAgICBzZWxmLnVwZGF0ZUNvbWJvU2l6ZXMoY29tYm9NYXApO1xuICAgICAgICBzZWxmLmNhbFJlcHVsc2l2ZShkaXNwbGFjZW1lbnRzLCB2ZWNNYXApO1xuICAgICAgICBzZWxmLmNhbEF0dHJhY3RpdmUoZGlzcGxhY2VtZW50cywgdmVjTWFwKTtcbiAgICAgICAgY29uc3QgcHJldmVudENvbWJvT3ZlcmxhcCA9IHNlbGYucHJldmVudENvbWJvT3ZlcmxhcDtcbiAgICAgICAgaWYgKHByZXZlbnRDb21ib092ZXJsYXApXG4gICAgICAgICAgICBzZWxmLmNvbWJvTm9uT3ZlcmxhcHBpbmcoZGlzcGxhY2VtZW50cywgY29tYm9NYXApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgdGhlIHNpemVzIG9mIHRoZSBjb21ib3MgYWNjb3JkaW5nIHRvIHRoZWlyIGNoaWxkcmVuXG4gICAgICogVXNlZCBmb3IgY29tYm9zIG5vbm92ZXJsYXAsIGJ1dCBub3QgcmUtcmVuZGVyIHRoZSBjb21ibyBzaGFwZXNcbiAgICAgKi9cbiAgICB1cGRhdGVDb21ib1NpemVzKGNvbWJvTWFwKSB7XG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgICAgICBjb25zdCBjb21ib1RyZWVzID0gc2VsZi5jb21ib1RyZWVzO1xuICAgICAgICBjb25zdCBub2RlTWFwID0gc2VsZi5ub2RlTWFwO1xuICAgICAgICBjb25zdCBub2RlU2l6ZSA9IHNlbGYubm9kZVNpemU7XG4gICAgICAgIGNvbnN0IGNvbWJvU3BhY2luZyA9IHNlbGYuY29tYm9TcGFjaW5nO1xuICAgICAgICBjb25zdCBjb21ib1BhZGRpbmcgPSBzZWxmLmNvbWJvUGFkZGluZztcbiAgICAgICAgKGNvbWJvVHJlZXMgfHwgW10pLmZvckVhY2goKGN0cmVlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0cmVlQ2hpbGRyZW4gPSBbXTtcbiAgICAgICAgICAgIHRyYXZlcnNlVHJlZVVwKGN0cmVlLCAodHJlZU5vZGUpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodHJlZU5vZGUuaXRlbVR5cGUgPT09IFwibm9kZVwiKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gc2tpcCBpdFxuICAgICAgICAgICAgICAgIGNvbnN0IGMgPSBjb21ib01hcFt0cmVlTm9kZS5pZF07XG4gICAgICAgICAgICAgICAgLy8gbWVhbnMgdGhlIGNvbWJvIGlzIGhpZGRlbiwgc2tpcCBpdFxuICAgICAgICAgICAgICAgIGlmICghYylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gdHJlZU5vZGUuY2hpbGRyZW47XG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuLmZvckVhY2goKGNoaWxkKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBtZWFucyB0aGUgY29tYm8gaXMgaGlkZGVuLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjb21ib01hcFtjaGlsZC5pZF0gJiYgIW5vZGVNYXBbY2hpbGQuaWRdKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyZWVDaGlsZHJlbi5wdXNoKGNoaWxkKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGMubWluWCA9IEluZmluaXR5O1xuICAgICAgICAgICAgICAgIGMubWluWSA9IEluZmluaXR5O1xuICAgICAgICAgICAgICAgIGMubWF4WCA9IC1JbmZpbml0eTtcbiAgICAgICAgICAgICAgICBjLm1heFkgPSAtSW5maW5pdHk7XG4gICAgICAgICAgICAgICAgdHJlZUNoaWxkcmVuLmZvckVhY2goKGNoaWxkKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZC5pdGVtVHlwZSAhPT0gXCJub2RlXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gc2tpcCBpdFxuICAgICAgICAgICAgICAgICAgICBjb25zdCBub2RlID0gbm9kZU1hcFtjaGlsZC5pZF07XG4gICAgICAgICAgICAgICAgICAgIGlmICghbm9kZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOyAvLyBtZWFucyBpdCBpcyBoaWRkZW5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgciA9IG5vZGVTaXplKG5vZGUpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBub2RlTWluWCA9IG5vZGUueCAtIHI7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vZGVNaW5ZID0gbm9kZS55IC0gcjtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm9kZU1heFggPSBub2RlLnggKyByO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBub2RlTWF4WSA9IG5vZGUueSArIHI7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjLm1pblggPiBub2RlTWluWClcbiAgICAgICAgICAgICAgICAgICAgICAgIGMubWluWCA9IG5vZGVNaW5YO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYy5taW5ZID4gbm9kZU1pblkpXG4gICAgICAgICAgICAgICAgICAgICAgICBjLm1pblkgPSBub2RlTWluWTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGMubWF4WCA8IG5vZGVNYXhYKVxuICAgICAgICAgICAgICAgICAgICAgICAgYy5tYXhYID0gbm9kZU1heFg7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjLm1heFkgPCBub2RlTWF4WSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGMubWF4WSA9IG5vZGVNYXhZO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGxldCBtaW5TaXplID0gc2VsZi5vcmlDb21ib01hcFt0cmVlTm9kZS5pZF0uc2l6ZSB8fCAxMDtcbiAgICAgICAgICAgICAgICBpZiAoaXNBcnJheShtaW5TaXplKSlcbiAgICAgICAgICAgICAgICAgICAgbWluU2l6ZSA9IG1pblNpemVbMF07XG4gICAgICAgICAgICAgICAgY29uc3QgbWF4TGVuZ3RoID0gTWF0aC5tYXgoYy5tYXhYIC0gYy5taW5YLCBjLm1heFkgLSBjLm1pblksIG1pblNpemUpO1xuICAgICAgICAgICAgICAgIGMuciA9IG1heExlbmd0aCAvIDIgKyBjb21ib1NwYWNpbmcoYykgLyAyICsgY29tYm9QYWRkaW5nKGMpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBwcmV2ZW50IHRoZSBvdmVybGFwcGluZ3MgYW1vbmcgY29tYm9zXG4gICAgICovXG4gICAgY29tYm9Ob25PdmVybGFwcGluZyhkaXNwbGFjZW1lbnRzLCBjb21ib01hcCkge1xuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAgICAgY29uc3QgY29tYm9UcmVlID0gc2VsZi5jb21ib1RyZWU7XG4gICAgICAgIGNvbnN0IGNvbWJvQ29sbGlkZVN0cmVuZ3RoID0gc2VsZi5jb21ib0NvbGxpZGVTdHJlbmd0aDtcbiAgICAgICAgY29uc3QgaW5kZXhNYXAgPSBzZWxmLmluZGV4TWFwO1xuICAgICAgICBjb25zdCBub2RlTWFwID0gc2VsZi5ub2RlTWFwO1xuICAgICAgICB0cmF2ZXJzZVRyZWVVcChjb21ib1RyZWUsICh0cmVlTm9kZSkgPT4ge1xuICAgICAgICAgICAgaWYgKCFjb21ib01hcFt0cmVlTm9kZS5pZF0gJiZcbiAgICAgICAgICAgICAgICAhbm9kZU1hcFt0cmVlTm9kZS5pZF0gJiZcbiAgICAgICAgICAgICAgICB0cmVlTm9kZS5pZCAhPT0gXCJjb21ib1RyZWVSb290XCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9IC8vIG1lYW5zIGl0IGlzIGhpZGRlblxuICAgICAgICAgICAgY29uc3QgY2hpbGRyZW4gPSB0cmVlTm9kZS5jaGlsZHJlbjtcbiAgICAgICAgICAgIC8vIOWQjOS4quWtkOagkeS4i+eahOWtkCBjb21ibyDpl7TkuKTkuKTlr7nmr5RcbiAgICAgICAgICAgIGlmIChjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgY2hpbGRyZW4uZm9yRWFjaCgodiwgaSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodi5pdGVtVHlwZSA9PT0gXCJub2RlXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIHNraXAgaXRcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY3YgPSBjb21ib01hcFt2LmlkXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjdilcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsgLy8gbWVhbnMgaXQgaXMgaGlkZGVuLCBza2lwIGl0XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuLmZvckVhY2goKHUsIGopID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpIDw9IGopXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHUuaXRlbVR5cGUgPT09IFwibm9kZVwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gc2tpcCBpdFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY3UgPSBjb21ib01hcFt1LmlkXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY3UpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBtZWFucyBpdCBpcyBoaWRkZW4sIHNraXAgaXRcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZ4ID0gKGN2LmN4IC0gY3UuY3gpIHx8IDAuMDA1O1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdnkgPSAoY3YuY3kgLSBjdS5jeSkgfHwgMC4wMDU7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsID0gdnggKiB2eCArIHZ5ICogdnk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBydiA9IGN2LnIgfHwgMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJ1ID0gY3UuciB8fCAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgciA9IHJ2ICsgcnU7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBydTIgPSBydSAqIHJ1O1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcnYyID0gcnYgKiBydjtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG92ZXJsYXBwaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobCA8IHIgKiByKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm5vZGVzID0gdi5jaGlsZHJlbjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXZub2RlcyB8fCB2bm9kZXMubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIHNraXAgaXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bm9kZXMgPSB1LmNoaWxkcmVuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdW5vZGVzIHx8IHVub2Rlcy5sZW5ndGggPT09IDApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gc2tpcCBpdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNxcnRsID0gTWF0aC5zcXJ0KGwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxsID0gKChyIC0gc3FydGwpIC8gc3FydGwpICogY29tYm9Db2xsaWRlU3RyZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeGwgPSB2eCAqIGxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHlsID0gdnkgKiBsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBycmF0aW8gPSBydTIgLyAocnYyICsgcnUyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpcnJhdGlvID0gMSAtIHJyYXRpbztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDkuKTlhYTlvJ8gY29tYm8g55qE5a2Q6IqC54K55LiK5pa95Yqg5pal5YqbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm5vZGVzLmZvckVhY2goKHZuKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2bi5pdGVtVHlwZSAhPT0gXCJub2RlXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIHNraXAgaXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFub2RlTWFwW3ZuLmlkXSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsgLy8gbWVhbnMgaXQgaXMgaGlkZGVuLCBza2lwIGl0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZpbmRleCA9IGluZGV4TWFwW3ZuLmlkXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5vZGVzLmZvckVhY2goKHVuKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodW4uaXRlbVR5cGUgIT09IFwibm9kZVwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbm9kZU1hcFt1bi5pZF0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBtZWFucyBpdCBpcyBoaWRkZW4sIHNraXAgaXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbmRleCA9IGluZGV4TWFwW3VuLmlkXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYWNlbWVudHNbdmluZGV4XS54ICs9IHhsICogcnJhdGlvO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxhY2VtZW50c1t2aW5kZXhdLnkgKz0geWwgKiBycmF0aW87XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGFjZW1lbnRzW3VpbmRleF0ueCAtPSB4bCAqIGlycmF0aW87XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGFjZW1lbnRzW3VpbmRleF0ueSAtPSB5bCAqIGlycmF0aW87XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlIHRoZSByZXB1bHNpdmUgZm9yY2UgYmV0d2VlbiBlYWNoIG5vZGUgcGFpclxuICAgICAqIEBwYXJhbSBkaXNwbGFjZW1lbnRzIFRoZSBhcnJheSBzdG9yZXMgdGhlIGRpc3BsYWNlbWVudHMgZm9yIG5vZGVzXG4gICAgICogQHBhcmFtIHZlY01hcCBUaGUgbWFwIHN0b3JlcyB2ZWN0b3IgYmV0d2VlbiBlYWNoIG5vZGUgcGFpclxuICAgICAqL1xuICAgIGNhbFJlcHVsc2l2ZShkaXNwbGFjZW1lbnRzLCB2ZWNNYXApIHtcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICAgIGNvbnN0IG5vZGVzID0gc2VsZi5ub2RlcztcbiAgICAgICAgY29uc3QgbWF4ID0gc2VsZi53aWR0aCAqIHNlbGYub3B0aW1pemVSYW5nZUZhY3RvcjtcbiAgICAgICAgY29uc3Qgbm9kZVN0cmVuZ3RoID0gc2VsZi5ub2RlU3RyZW5ndGg7XG4gICAgICAgIGNvbnN0IGFscGhhID0gc2VsZi5hbHBoYTtcbiAgICAgICAgY29uc3Qgbm9kZUNvbGxpZGVTdHJlbmd0aCA9IHNlbGYubm9kZUNvbGxpZGVTdHJlbmd0aDtcbiAgICAgICAgY29uc3QgcHJldmVudE5vZGVPdmVybGFwID0gc2VsZi5wcmV2ZW50Tm9kZU92ZXJsYXA7XG4gICAgICAgIGNvbnN0IG5vZGVTaXplRnVuYyA9IHNlbGYubm9kZVNpemU7XG4gICAgICAgIGNvbnN0IG5vZGVTcGFjaW5nRnVuYyA9IHNlbGYubm9kZVNwYWNpbmc7XG4gICAgICAgIGNvbnN0IHNjYWxlID0gc2VsZi5kZXB0aFJlcHVsc2l2ZUZvcmNlU2NhbGU7XG4gICAgICAgIGNvbnN0IGNlbnRlciA9IHNlbGYuY2VudGVyO1xuICAgICAgICBub2Rlcy5mb3JFYWNoKCh2LCBpKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXYueCB8fCAhdi55KVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIC8vIGNlbnRlciBncmF2aXR5XG4gICAgICAgICAgICBpZiAoY2VudGVyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZ3Jhdml0eSA9IHNlbGYuZ3Jhdml0eTtcbiAgICAgICAgICAgICAgICBjb25zdCB2ZWNYID0gKHYueCAtIGNlbnRlclswXSkgfHwgMC4wMDU7XG4gICAgICAgICAgICAgICAgY29uc3QgdmVjWSA9ICh2LnkgLSBjZW50ZXJbMV0pIHx8IDAuMDA1O1xuICAgICAgICAgICAgICAgIGNvbnN0IGwgPSBNYXRoLnNxcnQodmVjWCAqIHZlY1ggKyB2ZWNZICogdmVjWSk7XG4gICAgICAgICAgICAgICAgZGlzcGxhY2VtZW50c1tpXS54IC09ICh2ZWNYICogZ3Jhdml0eSAqIGFscGhhKSAvIGw7XG4gICAgICAgICAgICAgICAgZGlzcGxhY2VtZW50c1tpXS55IC09ICh2ZWNZICogZ3Jhdml0eSAqIGFscGhhKSAvIGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBub2Rlcy5mb3JFYWNoKCh1LCBqKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGkgPT09IGopIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXUueCB8fCAhdS55KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgY29uc3QgeyB2bDIsIHZsIH0gPSB2ZWNNYXBbYCR7di5pZH0tJHt1LmlkfWBdO1xuICAgICAgICAgICAgICAgIGlmICh2bCA+IG1heClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgdngsIHZ5IH0gPSB2ZWNNYXBbYCR7di5pZH0tJHt1LmlkfWBdO1xuICAgICAgICAgICAgICAgIGxldCBkZXB0aERpZmYgPSBNYXRoLmxvZyhNYXRoLmFicyh1LmRlcHRoIC0gdi5kZXB0aCkgLyAxMCkgKyAxIHx8IDE7XG4gICAgICAgICAgICAgICAgZGVwdGhEaWZmID0gZGVwdGhEaWZmIDwgMSA/IDEgOiBkZXB0aERpZmY7XG4gICAgICAgICAgICAgICAgaWYgKHUuY29tYm9JZCAhPT0gdi5jb21ib0lkKVxuICAgICAgICAgICAgICAgICAgICBkZXB0aERpZmYgKz0gMTtcbiAgICAgICAgICAgICAgICBjb25zdCBkZXB0aFBhcmFtID0gZGVwdGhEaWZmID8gTWF0aC5wb3coc2NhbGUsIGRlcHRoRGlmZikgOiAxO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmFtcyA9ICgobm9kZVN0cmVuZ3RoKHUpICogYWxwaGEpIC8gdmwyKSAqIGRlcHRoUGFyYW07XG4gICAgICAgICAgICAgICAgZGlzcGxhY2VtZW50c1tpXS54ICs9IHZ4ICogcGFyYW1zO1xuICAgICAgICAgICAgICAgIGRpc3BsYWNlbWVudHNbaV0ueSArPSB2eSAqIHBhcmFtcztcbiAgICAgICAgICAgICAgICAvLyBwcmV2ZW50IG5vZGUgb3ZlcmxhcHBpbmdzXG4gICAgICAgICAgICAgICAgaWYgKGkgPCBqICYmIHByZXZlbnROb2RlT3ZlcmxhcCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByaSA9IChub2RlU2l6ZUZ1bmModikgKyBub2RlU3BhY2luZ0Z1bmModikpIHx8IDE7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJqID0gKG5vZGVTaXplRnVuYyh1KSArIG5vZGVTcGFjaW5nRnVuYyh1KSkgfHwgMTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgciA9IHJpICsgcmo7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2bDIgPCByICogcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGwgPSAoKHIgLSB2bCkgLyB2bCkgKiBub2RlQ29sbGlkZVN0cmVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmoyID0gcmogKiByajtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBycmF0aW8gPSByajIgLyAocmkgKiByaSArIHJqMik7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4bCA9IHZ4ICogbGw7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB5bCA9IHZ5ICogbGw7XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGFjZW1lbnRzW2ldLnggKz0geGwgKiBycmF0aW87XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGFjZW1lbnRzW2ldLnkgKz0geWwgKiBycmF0aW87XG4gICAgICAgICAgICAgICAgICAgICAgICBycmF0aW8gPSAxIC0gcnJhdGlvO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxhY2VtZW50c1tqXS54IC09IHhsICogcnJhdGlvO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxhY2VtZW50c1tqXS55IC09IHlsICogcnJhdGlvO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGUgdGhlIGF0dHJhY3RpdmUgZm9yY2UgYmV0d2VlbiB0aGUgbm9kZSBwYWlyIHdpdGggZWRnZVxuICAgICAqIEBwYXJhbSBkaXNwbGFjZW1lbnRzIFRoZSBhcnJheSBzdG9yZXMgdGhlIGRpc3BsYWNlbWVudHMgZm9yIG5vZGVzXG4gICAgICogQHBhcmFtIHZlY01hcCBUaGUgbWFwIHN0b3JlcyB2ZWN0b3IgYmV0d2VlbiBlYWNoIG5vZGUgcGFpclxuICAgICAqL1xuICAgIGNhbEF0dHJhY3RpdmUoZGlzcGxhY2VtZW50cywgdmVjTWFwKSB7XG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgICAgICBjb25zdCBlZGdlcyA9IHNlbGYuZWRnZXM7XG4gICAgICAgIGNvbnN0IGxpbmtEaXN0YW5jZSA9IHNlbGYubGlua0Rpc3RhbmNlO1xuICAgICAgICBjb25zdCBhbHBoYSA9IHNlbGYuYWxwaGE7XG4gICAgICAgIGNvbnN0IGVkZ2VTdHJlbmd0aCA9IHNlbGYuZWRnZVN0cmVuZ3RoO1xuICAgICAgICBjb25zdCBiaWFzID0gc2VsZi5iaWFzO1xuICAgICAgICBjb25zdCBzY2FsZSA9IHNlbGYuZGVwdGhBdHRyYWN0aXZlRm9yY2VTY2FsZTtcbiAgICAgICAgZWRnZXMuZm9yRWFjaCgoZSwgaSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc291cmNlID0gZ2V0RWRnZVRlcm1pbmFsKGUsICdzb3VyY2UnKTtcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGdldEVkZ2VUZXJtaW5hbChlLCAndGFyZ2V0Jyk7XG4gICAgICAgICAgICBpZiAoIXNvdXJjZSB8fCAhdGFyZ2V0IHx8IHNvdXJjZSA9PT0gdGFyZ2V0KVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGNvbnN0IHVJbmRleCA9IHNlbGYuaW5kZXhNYXBbc291cmNlXTtcbiAgICAgICAgICAgIGNvbnN0IHZJbmRleCA9IHNlbGYuaW5kZXhNYXBbdGFyZ2V0XTtcbiAgICAgICAgICAgIGNvbnN0IHUgPSBzZWxmLm5vZGVNYXBbc291cmNlXTtcbiAgICAgICAgICAgIGNvbnN0IHYgPSBzZWxmLm5vZGVNYXBbdGFyZ2V0XTtcbiAgICAgICAgICAgIGlmICghdSB8fCAhdilcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBsZXQgZGVwdGhEaWZmID0gdS5kZXB0aCA9PT0gdi5kZXB0aCA/IDAgOiBNYXRoLmxvZyhNYXRoLmFicyh1LmRlcHRoIC0gdi5kZXB0aCkgLyAxMCk7XG4gICAgICAgICAgICBpZiAodS5jb21ib0lkID09PSB2LmNvbWJvSWQpIHtcbiAgICAgICAgICAgICAgICBkZXB0aERpZmYgPSBkZXB0aERpZmYgLyAyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGRlcHRoUGFyYW0gPSBkZXB0aERpZmYgPyBNYXRoLnBvdyhzY2FsZSwgZGVwdGhEaWZmKSA6IDE7XG4gICAgICAgICAgICBpZiAodS5jb21ib0lkICE9PSB2LmNvbWJvSWQgJiYgZGVwdGhQYXJhbSA9PT0gMSkge1xuICAgICAgICAgICAgICAgIGRlcHRoUGFyYW0gPSBzY2FsZSAvIDI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh1LmNvbWJvSWQgPT09IHYuY29tYm9JZCkge1xuICAgICAgICAgICAgICAgIGRlcHRoUGFyYW0gPSAyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFpc051bWJlcih2LngpIHx8ICFpc051bWJlcih1LngpIHx8ICFpc051bWJlcih2LnkpIHx8ICFpc051bWJlcih1LnkpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgeyB2bCwgdngsIHZ5IH0gPSB2ZWNNYXBbYCR7dGFyZ2V0fS0ke3NvdXJjZX1gXTtcbiAgICAgICAgICAgIGNvbnN0IGwgPSAoKHZsIC0gbGlua0Rpc3RhbmNlKGUpKSAvIHZsKSAqIGFscGhhICogZWRnZVN0cmVuZ3RoKGUpICogZGVwdGhQYXJhbTtcbiAgICAgICAgICAgIGNvbnN0IHZlY1ggPSB2eCAqIGw7XG4gICAgICAgICAgICBjb25zdCB2ZWNZID0gdnkgKiBsO1xuICAgICAgICAgICAgY29uc3QgYiA9IGJpYXNbaV07XG4gICAgICAgICAgICBkaXNwbGFjZW1lbnRzW3ZJbmRleF0ueCAtPSB2ZWNYICogYjtcbiAgICAgICAgICAgIGRpc3BsYWNlbWVudHNbdkluZGV4XS55IC09IHZlY1kgKiBiO1xuICAgICAgICAgICAgZGlzcGxhY2VtZW50c1t1SW5kZXhdLnggKz0gdmVjWCAqICgxIC0gYik7XG4gICAgICAgICAgICBkaXNwbGFjZW1lbnRzW3VJbmRleF0ueSArPSB2ZWNZICogKDEgLSBiKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGdldFR5cGUoKSB7XG4gICAgICAgIHJldHVybiBcImNvbWJvRm9yY2VcIjtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb21ib0ZvcmNlLmpzLm1hcCIsIi8vIHJlcHJlc2VudHMgYSBib2R5KGEgcG9pbnQgbWFzcykgYW5kIGl0cyBwb3NpdGlvblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQm9keSB7XG4gICAgY29uc3RydWN0b3IocGFyYW1zKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiB0aGUgaWQgb2YgdGhpcyBib2R5LCB0aGUgc2FtZSB3aXRoIHRoZSBub2RlIGlkXG4gICAgICAgICAqIEB0eXBlICB7bnVtYmVyfVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pZCA9IHBhcmFtcy5pZCB8fCAwO1xuICAgICAgICAvKipcbiAgICAgICAgICogdGhlIHBvc2l0aW9uIG9mIHRoaXMgYm9keVxuICAgICAgICAgKiBAdHlwZSAge251bWJlcn1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMucnggPSBwYXJhbXMucng7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiB0aGUgcG9zaXRpb24gb2YgdGhpcyBib2R5XG4gICAgICAgICAqIEB0eXBlICB7bnVtYmVyfVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5yeSA9IHBhcmFtcy5yeTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIHRoZSBmb3JjZSBhY3Rpbmcgb24gdGhpcyBib2R5XG4gICAgICAgICAqIEB0eXBlICB7bnVtYmVyfVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5meCA9IDA7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiB0aGUgZm9yY2UgYWN0aW5nIG9uIHRoaXMgYm9keVxuICAgICAgICAgKiBAdHlwZSAge251bWJlcn1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZnkgPSAwO1xuICAgICAgICAvKipcbiAgICAgICAgICogdGhlIG1hc3Mgb2YgdGhpcyBib2R5LCA9MSBmb3IgYSBub2RlXG4gICAgICAgICAqIEB0eXBlICB7bnVtYmVyfVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5tYXNzID0gcGFyYW1zLm1hc3M7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiB0aGUgZGVncmVlIG9mIHRoZSBub2RlIHJlcHJlc2VudGVkIGJ5IHRoaXMgYm9keVxuICAgICAgICAgKiBAdHlwZSAge251bWJlcn1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZGVncmVlID0gcGFyYW1zLmRlZ3JlZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIHRoZSBwYXJhbWV0ZXIgZm9yIHJlcHVsc2l2ZSBmb3JjZSwgPSBrclxuICAgICAgICAgKiBAdHlwZSAge251bWJlcn1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZyA9IHBhcmFtcy5nIHx8IDA7XG4gICAgfVxuICAgIC8vIHJldHVybnMgdGhlIGV1Y2xpZGVhbiBkaXN0YW5jZVxuICAgIGRpc3RhbmNlVG8oYm8pIHtcbiAgICAgICAgY29uc3QgZHggPSB0aGlzLnJ4IC0gYm8ucng7XG4gICAgICAgIGNvbnN0IGR5ID0gdGhpcy5yeSAtIGJvLnJ5O1xuICAgICAgICByZXR1cm4gTWF0aC5oeXBvdChkeCwgZHkpO1xuICAgIH1cbiAgICBzZXRQb3MoeCwgeSkge1xuICAgICAgICB0aGlzLnJ4ID0geDtcbiAgICAgICAgdGhpcy5yeSA9IHk7XG4gICAgfVxuICAgIC8vIHJlc2V0cyB0aGUgZm9yY2VzXG4gICAgcmVzZXRGb3JjZSgpIHtcbiAgICAgICAgdGhpcy5meCA9IDA7XG4gICAgICAgIHRoaXMuZnkgPSAwO1xuICAgIH1cbiAgICBhZGRGb3JjZShiKSB7XG4gICAgICAgIGNvbnN0IGR4ID0gYi5yeCAtIHRoaXMucng7XG4gICAgICAgIGNvbnN0IGR5ID0gYi5yeSAtIHRoaXMucnk7XG4gICAgICAgIGxldCBkaXN0ID0gTWF0aC5oeXBvdChkeCwgZHkpO1xuICAgICAgICBkaXN0ID0gZGlzdCA8IDAuMDAwMSA/IDAuMDAwMSA6IGRpc3Q7XG4gICAgICAgIC8vIHRoZSByZXB1bHNpdmUgZGVmaW5lZCBieSBmb3JjZSBhdGxhcyAyXG4gICAgICAgIGNvbnN0IEYgPSAodGhpcy5nICogKHRoaXMuZGVncmVlICsgMSkgKiAoYi5kZWdyZWUgKyAxKSkgLyBkaXN0O1xuICAgICAgICB0aGlzLmZ4ICs9IEYgKiBkeCAvIGRpc3Q7XG4gICAgICAgIHRoaXMuZnkgKz0gRiAqIGR5IC8gZGlzdDtcbiAgICB9XG4gICAgLy8gaWYgcXVhZCBjb250YWlucyB0aGlzIGJvZHlcbiAgICBpbihxdWFkKSB7XG4gICAgICAgIHJldHVybiBxdWFkLmNvbnRhaW5zKHRoaXMucngsIHRoaXMucnkpO1xuICAgIH1cbiAgICAvLyByZXR1cm5zIGEgbmV3IGJvZHlcbiAgICBhZGQoYm8pIHtcbiAgICAgICAgY29uc3QgbmVud01hc3MgPSB0aGlzLm1hc3MgKyBiby5tYXNzO1xuICAgICAgICBjb25zdCB4ID0gKHRoaXMucnggKiB0aGlzLm1hc3MgKyBiby5yeCAqIGJvLm1hc3MpIC8gbmVud01hc3M7XG4gICAgICAgIGNvbnN0IHkgPSAodGhpcy5yeSAqIHRoaXMubWFzcyArIGJvLnJ5ICogYm8ubWFzcykgLyBuZW53TWFzcztcbiAgICAgICAgY29uc3QgZGcgPSB0aGlzLmRlZ3JlZSArIGJvLmRlZ3JlZTtcbiAgICAgICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgICAgICAgcng6IHgsXG4gICAgICAgICAgICByeTogeSxcbiAgICAgICAgICAgIG1hc3M6IG5lbndNYXNzLFxuICAgICAgICAgICAgZGVncmVlOiBkZ1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gbmV3IEJvZHkocGFyYW1zKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1ib2R5LmpzLm1hcCIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIFF1YWQge1xuICAgIGNvbnN0cnVjdG9yKHBhcmFtcykge1xuICAgICAgICAvKipcbiAgICAgICAgICogdGhlIGNlbnRlciBwb3NpdGlvbiBvZiB0aGlzIHF1YWRcbiAgICAgICAgICogQHR5cGUgIHtudW1iZXJ9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnhtaWQgPSBwYXJhbXMueG1pZDtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIHRoZSBjZW50ZXIgcG9zaXRpb24gb2YgdGhpcyBxdWFkXG4gICAgICAgICAqIEB0eXBlICB7bnVtYmVyfVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy55bWlkID0gcGFyYW1zLnltaWQ7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiB0aGUgbGVuZ3RoIG9mIHRoaXMgcXVhZFxuICAgICAgICAgKiBAdHlwZSAge251bWJlcn1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMubGVuZ3RoID0gcGFyYW1zLmxlbmd0aDtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIHRoZSBtYXNzIGNlbnRlciBvZiB0aGlzIHF1YWRcbiAgICAgICAgICogQHR5cGUgIHtudW1iZXJ9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm1hc3NDZW50ZXIgPSBwYXJhbXMubWFzc0NlbnRlciB8fCBbMCwgMF07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiB0aGUgbWFzcyBvZiB0aGlzIHF1YWRcbiAgICAgICAgICogQHR5cGUgIHtudW1iZXJ9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm1hc3MgPSBwYXJhbXMubWFzcyB8fCAxO1xuICAgIH1cbiAgICBnZXRMZW5ndGgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxlbmd0aDtcbiAgICB9XG4gICAgY29udGFpbnMoeCwgeSkge1xuICAgICAgICBjb25zdCBoYWxmTGVuID0gdGhpcy5sZW5ndGggLyAyO1xuICAgICAgICByZXR1cm4gKHggPD0gdGhpcy54bWlkICsgaGFsZkxlbiAmJlxuICAgICAgICAgICAgeCA+PSB0aGlzLnhtaWQgLSBoYWxmTGVuICYmXG4gICAgICAgICAgICB5IDw9IHRoaXMueW1pZCArIGhhbGZMZW4gJiZcbiAgICAgICAgICAgIHkgPj0gdGhpcy55bWlkIC0gaGFsZkxlbik7XG4gICAgfVxuICAgIC8vIG5vcnRod2VzdCBxdWFkcmFudFxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZVxuICAgIE5XKCkge1xuICAgICAgICBjb25zdCB4ID0gdGhpcy54bWlkIC0gdGhpcy5sZW5ndGggLyA0O1xuICAgICAgICBjb25zdCB5ID0gdGhpcy55bWlkICsgdGhpcy5sZW5ndGggLyA0O1xuICAgICAgICBjb25zdCBsZW4gPSB0aGlzLmxlbmd0aCAvIDI7XG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgICAgICAgIHhtaWQ6IHgsXG4gICAgICAgICAgICB5bWlkOiB5LFxuICAgICAgICAgICAgbGVuZ3RoOiBsZW5cbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgTlcgPSBuZXcgUXVhZChwYXJhbXMpO1xuICAgICAgICByZXR1cm4gTlc7XG4gICAgfVxuICAgIC8vIG5vcnRoZWFzdFxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZVxuICAgIE5FKCkge1xuICAgICAgICBjb25zdCB4ID0gdGhpcy54bWlkICsgdGhpcy5sZW5ndGggLyA0O1xuICAgICAgICBjb25zdCB5ID0gdGhpcy55bWlkICsgdGhpcy5sZW5ndGggLyA0O1xuICAgICAgICBjb25zdCBsZW4gPSB0aGlzLmxlbmd0aCAvIDI7XG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgICAgICAgIHhtaWQ6IHgsXG4gICAgICAgICAgICB5bWlkOiB5LFxuICAgICAgICAgICAgbGVuZ3RoOiBsZW5cbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgTkUgPSBuZXcgUXVhZChwYXJhbXMpO1xuICAgICAgICByZXR1cm4gTkU7XG4gICAgfVxuICAgIC8vIHNvdXRod2VzdFxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZVxuICAgIFNXKCkge1xuICAgICAgICBjb25zdCB4ID0gdGhpcy54bWlkIC0gdGhpcy5sZW5ndGggLyA0O1xuICAgICAgICBjb25zdCB5ID0gdGhpcy55bWlkIC0gdGhpcy5sZW5ndGggLyA0O1xuICAgICAgICBjb25zdCBsZW4gPSB0aGlzLmxlbmd0aCAvIDI7XG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgICAgICAgIHhtaWQ6IHgsXG4gICAgICAgICAgICB5bWlkOiB5LFxuICAgICAgICAgICAgbGVuZ3RoOiBsZW5cbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgU1cgPSBuZXcgUXVhZChwYXJhbXMpO1xuICAgICAgICByZXR1cm4gU1c7XG4gICAgfVxuICAgIC8vIHNvdXRoZWFzdFxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZVxuICAgIFNFKCkge1xuICAgICAgICBjb25zdCB4ID0gdGhpcy54bWlkICsgdGhpcy5sZW5ndGggLyA0O1xuICAgICAgICBjb25zdCB5ID0gdGhpcy55bWlkIC0gdGhpcy5sZW5ndGggLyA0O1xuICAgICAgICBjb25zdCBsZW4gPSB0aGlzLmxlbmd0aCAvIDI7XG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgICAgICAgIHhtaWQ6IHgsXG4gICAgICAgICAgICB5bWlkOiB5LFxuICAgICAgICAgICAgbGVuZ3RoOiBsZW5cbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgU0UgPSBuZXcgUXVhZChwYXJhbXMpO1xuICAgICAgICByZXR1cm4gU0U7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cXVhZC5qcy5tYXAiLCIvKipcbiAqIEBmaWxlT3ZlcnZpZXcgcXVhZFRyZWVcbiAqIEBhdXRob3Igc2hpd3Uud3l5QGFudGZpbi5jb21cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUXVhZFRyZWUge1xuICAgIC8vIGVhY2ggcXVhZHRyZWUgcmVwcmVzZW50cyBhIHF1YWRyYW50IGFuZCBhbiBhZ2dyZWdhdGUgYm9keVxuICAgIC8vIHRoYXQgcmVwcmVzZW50cyBhbGwgYm9kaWVzIGluc2lkZSB0aGUgcXVhZHJhbnRcbiAgICBjb25zdHJ1Y3RvcihwYXJhbSkge1xuICAgICAgICAvKipcbiAgICAgICAgICogKGFnZ3JlZ2F0ZWQpIGJvZHkgaW4gdGhpcyBxdWFkXG4gICAgICAgICAqIEB0eXBlICB7b2JqZWN0fVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5ib2R5ID0gbnVsbDtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIHRyZWUgcmVwcmVzZW50aW5nIHRoZSBub3J0aHdlc3QgcXVhZHJhbnRcbiAgICAgICAgICogQHR5cGUgIHtvYmplY3R9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnF1YWQgPSBudWxsO1xuICAgICAgICB0aGlzLk5XID0gbnVsbDtcbiAgICAgICAgdGhpcy5ORSA9IG51bGw7XG4gICAgICAgIHRoaXMuU1cgPSBudWxsO1xuICAgICAgICB0aGlzLlNFID0gbnVsbDtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIHRocmVzaG9sZFxuICAgICAgICAgKiBAdHlwZSAge251bWJlcn1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudGhldGEgPSAwLjU7XG4gICAgICAgIGlmIChwYXJhbSAhPSBudWxsKVxuICAgICAgICAgICAgdGhpcy5xdWFkID0gcGFyYW07XG4gICAgfVxuICAgIC8vIGluc2VydCBhIGJvZHkobm9kZSkgaW50byB0aGUgdHJlZVxuICAgIGluc2VydChibykge1xuICAgICAgICAvLyBpZiB0aGlzIG5vZGUgZG9lcyBub3QgY29udGFpbiBhIGJvZHksIHB1dCB0aGUgbmV3IGJvZHkgYm8gaGVyZVxuICAgICAgICBpZiAodGhpcy5ib2R5ID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuYm9keSA9IGJvO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIGludGVybmFsIG5vZGVcbiAgICAgICAgaWYgKCF0aGlzLl9pc0V4dGVybmFsKCkpIHtcbiAgICAgICAgICAgIC8vIHVwZGF0ZSBtYXNzIGluZm9cbiAgICAgICAgICAgIHRoaXMuYm9keSA9IHRoaXMuYm9keS5hZGQoYm8pO1xuICAgICAgICAgICAgLy8gaW5zZXJ0IGJvZHkgaW50byBxdWFkcmFudFxuICAgICAgICAgICAgdGhpcy5fcHV0Qm9keShibyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7IC8vIGV4dGVybmFsIG5vZGVcbiAgICAgICAgICAgIC8vIGRpdmlkZSB0aGlzIHJlZ2lvbiBpbnRvIGZvdXIgY2hpbGRyZW5cbiAgICAgICAgICAgIGlmICh0aGlzLnF1YWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLk5XID0gbmV3IFF1YWRUcmVlKHRoaXMucXVhZC5OVygpKTtcbiAgICAgICAgICAgICAgICB0aGlzLk5FID0gbmV3IFF1YWRUcmVlKHRoaXMucXVhZC5ORSgpKTtcbiAgICAgICAgICAgICAgICB0aGlzLlNXID0gbmV3IFF1YWRUcmVlKHRoaXMucXVhZC5TVygpKTtcbiAgICAgICAgICAgICAgICB0aGlzLlNFID0gbmV3IFF1YWRUcmVlKHRoaXMucXVhZC5TRSgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGluc2VydCB0aGlzIGJvZHkgYW5kIGJvXG4gICAgICAgICAgICB0aGlzLl9wdXRCb2R5KHRoaXMuYm9keSk7XG4gICAgICAgICAgICB0aGlzLl9wdXRCb2R5KGJvKTtcbiAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgbWFzcyBpbmZvXG4gICAgICAgICAgICB0aGlzLmJvZHkgPSB0aGlzLmJvZHkuYWRkKGJvKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBpbnNlcnRzIGJvIGludG8gYSBxdWFkXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lXG4gICAgX3B1dEJvZHkoYm8pIHtcbiAgICAgICAgaWYgKCF0aGlzLnF1YWQpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGlmIChiby5pbih0aGlzLnF1YWQuTlcoKSkgJiYgdGhpcy5OVylcbiAgICAgICAgICAgIHRoaXMuTlcuaW5zZXJ0KGJvKTtcbiAgICAgICAgZWxzZSBpZiAoYm8uaW4odGhpcy5xdWFkLk5FKCkpICYmIHRoaXMuTkUpXG4gICAgICAgICAgICB0aGlzLk5FLmluc2VydChibyk7XG4gICAgICAgIGVsc2UgaWYgKGJvLmluKHRoaXMucXVhZC5TVygpKSAmJiB0aGlzLlNXKVxuICAgICAgICAgICAgdGhpcy5TVy5pbnNlcnQoYm8pO1xuICAgICAgICBlbHNlIGlmIChiby5pbih0aGlzLnF1YWQuU0UoKSkgJiYgdGhpcy5TRSlcbiAgICAgICAgICAgIHRoaXMuU0UuaW5zZXJ0KGJvKTtcbiAgICB9XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lXG4gICAgX2lzRXh0ZXJuYWwoKSB7XG4gICAgICAgIC8vIGZvdXIgY2hpbGRyZW4gYXJlIG51bGxcbiAgICAgICAgcmV0dXJuICh0aGlzLk5XID09IG51bGwgJiYgdGhpcy5ORSA9PSBudWxsICYmIHRoaXMuU1cgPT0gbnVsbCAmJiB0aGlzLlNFID09IG51bGwpO1xuICAgIH1cbiAgICAvLyB1cGRhdGUgdGhlIGZvcmNlc1xuICAgIHVwZGF0ZUZvcmNlKGJvKSB7XG4gICAgICAgIGlmICh0aGlzLmJvZHkgPT0gbnVsbCB8fCBibyA9PT0gdGhpcy5ib2R5KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYgdGhlIGN1cnJlbnQgbm9kZSBpcyBleHRlcm5hbFxuICAgICAgICBpZiAodGhpcy5faXNFeHRlcm5hbCgpKVxuICAgICAgICAgICAgYm8uYWRkRm9yY2UodGhpcy5ib2R5KTtcbiAgICAgICAgLy8gaW50ZXJuYWwgbm9kZXNcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBzID0gdGhpcy5xdWFkID8gdGhpcy5xdWFkLmdldExlbmd0aCgpIDogMDtcbiAgICAgICAgICAgIGNvbnN0IGQgPSB0aGlzLmJvZHkuZGlzdGFuY2VUbyhibyk7XG4gICAgICAgICAgICAvLyBiIGlzIGZhciBlbm91Z2hcbiAgICAgICAgICAgIGlmICgocyAvIGQpIDwgdGhpcy50aGV0YSlcbiAgICAgICAgICAgICAgICBiby5hZGRGb3JjZSh0aGlzLmJvZHkpO1xuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5OVyAmJiB0aGlzLk5XLnVwZGF0ZUZvcmNlKGJvKTtcbiAgICAgICAgICAgICAgICB0aGlzLk5FICYmIHRoaXMuTkUudXBkYXRlRm9yY2UoYm8pO1xuICAgICAgICAgICAgICAgIHRoaXMuU1cgJiYgdGhpcy5TVy51cGRhdGVGb3JjZShibyk7XG4gICAgICAgICAgICAgICAgdGhpcy5TRSAmJiB0aGlzLlNFLnVwZGF0ZUZvcmNlKGJvKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXF1YWRUcmVlLmpzLm1hcCIsImltcG9ydCB7IEJhc2UgfSBmcm9tIFwiLi4vYmFzZVwiO1xuaW1wb3J0IHsgZ2V0RWRnZVRlcm1pbmFsLCBpc0FycmF5LCBpc051bWJlciwgaXNPYmplY3QgfSBmcm9tIFwiLi4vLi4vdXRpbFwiO1xuaW1wb3J0IEJvZHkgZnJvbSAnLi9ib2R5JztcbmltcG9ydCBRdWFkIGZyb20gJy4vcXVhZCc7XG5pbXBvcnQgUXVhZFRyZWUgZnJvbSAnLi9xdWFkVHJlZSc7XG5leHBvcnQgY2xhc3MgRm9yY2VBdGxhczJMYXlvdXQgZXh0ZW5kcyBCYXNlIHtcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIC8qKiDluIPlsYDkuK3lv4MgKi9cbiAgICAgICAgdGhpcy5jZW50ZXIgPSBbMCwgMF07XG4gICAgICAgIC8qKiDlrr3luqYgKi9cbiAgICAgICAgdGhpcy53aWR0aCA9IDMwMDtcbiAgICAgICAgLyoqIOmrmOW6piAqL1xuICAgICAgICB0aGlzLmhlaWdodCA9IDMwMDtcbiAgICAgICAgdGhpcy5ub2RlcyA9IFtdO1xuICAgICAgICB0aGlzLmVkZ2VzID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICAgKiB0aGUgcGFyYW1ldGVyIGZvciByZXB1bHNpdmUgZm9yY2VzLFxuICAgICAgICAgKiBpdCB3aWxsIHNjYWxlIHRoZSBsYXlvdXQgYnV0IHdvbid0IGNoYW5nZSB0aGUgbGF5b3V0XG4gICAgICAgICAqIGxhcmdlciB0aGUga3IsIGxvb3NlciB0aGUgbGF5b3V0XG4gICAgICAgICAqIEB0eXBlICB7bnVtYmVyfVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5rciA9IDU7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiB0aGUgcGFyYW1ldGVyIGZvciBncmF2aXR5IGZvcmNlc1xuICAgICAgICAgKiBAdHlwZSAge251bWJlcn1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMua2cgPSAxO1xuICAgICAgICAvKipcbiAgICAgICAgICogbW9kZXM6XG4gICAgICAgICAqICdub3JtYWwnIGZvciBub3JtYWwgdXNpbmdcbiAgICAgICAgICogJ2xpbmxvZycgZm9yIGNvbXBhY3QgY2x1c3RlcnMuXG4gICAgICAgICAqIEB0eXBlICB7c3RyaW5nfVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5tb2RlID0gJ25vcm1hbCc7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiB3aGV0aGVyIHByZXZlbnRpbmcgdGhlIG5vZGUgb3ZlcmxhcHBpbmdcbiAgICAgICAgICogQHR5cGUgIHtib29sZWFufVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5wcmV2ZW50T3ZlcmxhcCA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogd2hldGhlciBhY3RpdmUgdGhlIGRpc3N1YWRlIGh1YiBtb2RlXG4gICAgICAgICAqIHRydWU6IGdyYW50IGF1dGhvcml0aWVzIChub2RlcyB3aXRoIGEgaGlnaCBpbmRlZ3JlZSlcbiAgICAgICAgICogYSBtb3JlIGNlbnRyYWwgcG9zaXRpb24gdGhhbiBodWJzIChub2RlcyB3aXRoIGEgaGlnaCBvdXRkZWdyZWUpXG4gICAgICAgICAqIEB0eXBlICB7Ym9vbGVhbn1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZGlzc3VhZGVIdWJzID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiB3aGV0aGVyIGFjdGl2ZSB0aGUgYmFybmVzIGh1dCBvcHRpbWl6YXRpb24gb24gY29tcHV0aW5nIHJlcHVsc2l2ZSBmb3JjZXNcbiAgICAgICAgICogQHR5cGUgIHtib29sZWFufVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5iYXJuZXNIdXQgPSB1bmRlZmluZWQ7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiB0aGUgbWF4IGl0ZXJhdGlvbiBudW1iZXJcbiAgICAgICAgICogQHR5cGUgIHtudW1iZXJ9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm1heEl0ZXJhdGlvbiA9IDA7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBjb250cm9sIHRoZSBnbG9iYWwgdmVsb2NpdHlcbiAgICAgICAgICogZGVmdWFsdDogMC4xKGdlcGhpKVxuICAgICAgICAgKiBAdHlwZSAge251bWJlcn1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMua3MgPSAwLjE7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiB0aGUgbWF4IGdsb2JhbCB2ZWxvY2l0eVxuICAgICAgICAgKiBAdHlwZSAge251bWJlcn1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMua3NtYXggPSAxMDtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIHRoZSB0b2xlcmFuY2UgZm9yIHRoZSBnbG9iYWwgc3dpbmdpbmdcbiAgICAgICAgICogQHR5cGUgIHtudW1iZXJ9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnRhbyA9IDAuMTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIHRoZSBmdW5jdGlvbiBvZiBsYXlvdXQgY29tcGxldGUgbGlzdGVuZXIsIGRpc3BsYXkgdGhlIGxlZ2VuZCBhbmQgbWluaW1hcCBhZnRlciBsYXlvdXRcbiAgICAgICAgICogQHR5cGUgIHtmdW5jdGlvbn1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMub25MYXlvdXRFbmQgPSAoKSA9PiB7IH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBhY3RpdmF0ZSBwcnVuZSBvciBub3QuXG4gICAgICAgICAqIHBydW5lIHRoZSBsZWF2ZXMgZHVyaW5nIG1vc3QgaXRlcmF0aW9ucywgbGF5b3V0IHRoZSBsZWF2ZXMgaW4gdGhlIGxhc3QgNTAgaXRlcmFpdG9ucy5cbiAgICAgICAgICogaWYgcHJ1bmUgPT09ICcnLCBpdCB3aWxsIGJlIGFjdGl2YXRlZCB3aGVuIHRoZSBub2RlcyBudW1iZXIgPiAxMDBcbiAgICAgICAgICogbm90ZSB0aGF0IGl0IHdpbGwgcmVkdWNlIHRoZSBxdWFsaXR5IG9mIHRoZSBsYXlvdXRcbiAgICAgICAgICogQHR5cGUgIHtib29sZWFufVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5wcnVuZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy51cGRhdGVDZmcob3B0aW9ucyk7XG4gICAgfVxuICAgIGdldERlZmF1bHRDZmcoKSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgLy8gZXhlY3V0ZSB0aGUgbGF5b3V0XG4gICAgZXhlY3V0ZSgpIHtcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICAgIGNvbnN0IHsgbm9kZXMsIG9uTGF5b3V0RW5kLCBwcnVuZSwgfSA9IHNlbGY7XG4gICAgICAgIGxldCBtYXhJdGVyYXRpb24gPSBzZWxmLm1heEl0ZXJhdGlvbjtcbiAgICAgICAgaWYgKCFzZWxmLndpZHRoICYmIHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIHNlbGYud2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXNlbGYuaGVpZ2h0ICYmIHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIHNlbGYuaGVpZ2h0ID0gd2luZG93LmlubmVySGVpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIC8vIHRoZSB3aGlkdGggb2YgZWFjaCBub2Rlc1xuICAgICAgICBjb25zdCBzaXplcyA9IFtdO1xuICAgICAgICBjb25zdCBub2RlTnVtID0gbm9kZXMubGVuZ3RoO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGVOdW07IGkgKz0gMSkge1xuICAgICAgICAgICAgY29uc3Qgbm9kZSA9IG5vZGVzW2ldO1xuICAgICAgICAgICAgbGV0IG5vZGVXaWR0aCA9IDEwO1xuICAgICAgICAgICAgbGV0IG5vZGVIZWlnaHQgPSAxMDtcbiAgICAgICAgICAgIGlmIChpc051bWJlcihub2RlLnNpemUpKSB7XG4gICAgICAgICAgICAgICAgbm9kZVdpZHRoID0gbm9kZS5zaXplO1xuICAgICAgICAgICAgICAgIG5vZGVIZWlnaHQgPSBub2RlLnNpemU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNBcnJheShub2RlLnNpemUpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpc05hTihub2RlLnNpemVbMF0pKVxuICAgICAgICAgICAgICAgICAgICBub2RlV2lkdGggPSBub2RlLnNpemVbMF07XG4gICAgICAgICAgICAgICAgaWYgKCFpc05hTihub2RlLnNpemVbMV0pKVxuICAgICAgICAgICAgICAgICAgICBub2RlSGVpZ2h0ID0gbm9kZS5zaXplWzFdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaXNPYmplY3Qobm9kZS5zaXplKSkge1xuICAgICAgICAgICAgICAgIG5vZGVXaWR0aCA9IG5vZGUuc2l6ZS53aWR0aDtcbiAgICAgICAgICAgICAgICBub2RlSGVpZ2h0ID0gbm9kZS5zaXplLmhlaWdodDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzZWxmLmdldFdpZHRoICYmICFpc05hTihzZWxmLmdldFdpZHRoKG5vZGUpKSlcbiAgICAgICAgICAgICAgICBub2RlSGVpZ2h0ID0gc2VsZi5nZXRXaWR0aChub2RlKTtcbiAgICAgICAgICAgIGlmIChzZWxmLmdldEhlaWdodCAmJiAhaXNOYU4oc2VsZi5nZXRIZWlnaHQobm9kZSkpKVxuICAgICAgICAgICAgICAgIG5vZGVXaWR0aCA9IHNlbGYuZ2V0SGVpZ2h0KG5vZGUpO1xuICAgICAgICAgICAgY29uc3QgbWF4U2l6ZSA9IE1hdGgubWF4KG5vZGVXaWR0aCwgbm9kZUhlaWdodCk7XG4gICAgICAgICAgICBzaXplcy5wdXNoKG1heFNpemUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzZWxmLmJhcm5lc0h1dCA9PT0gdW5kZWZpbmVkICYmIG5vZGVOdW0gPiAyNTApXG4gICAgICAgICAgICBzZWxmLmJhcm5lc0h1dCA9IHRydWU7XG4gICAgICAgIGlmIChzZWxmLnBydW5lID09PSB1bmRlZmluZWQgJiYgbm9kZU51bSA+IDEwMClcbiAgICAgICAgICAgIHNlbGYucHJ1bmUgPSB0cnVlO1xuICAgICAgICBpZiAodGhpcy5tYXhJdGVyYXRpb24gPT09IDAgJiYgIXNlbGYucHJ1bmUpIHtcbiAgICAgICAgICAgIG1heEl0ZXJhdGlvbiA9IDI1MDtcbiAgICAgICAgICAgIGlmIChub2RlTnVtIDw9IDIwMCAmJiBub2RlTnVtID4gMTAwKVxuICAgICAgICAgICAgICAgIG1heEl0ZXJhdGlvbiA9IDEwMDA7XG4gICAgICAgICAgICBlbHNlIGlmIChub2RlTnVtID4gMjAwKVxuICAgICAgICAgICAgICAgIG1heEl0ZXJhdGlvbiA9IDEyMDA7XG4gICAgICAgICAgICB0aGlzLm1heEl0ZXJhdGlvbiA9IG1heEl0ZXJhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLm1heEl0ZXJhdGlvbiA9PT0gMCAmJiBwcnVuZSkge1xuICAgICAgICAgICAgbWF4SXRlcmF0aW9uID0gMTAwO1xuICAgICAgICAgICAgaWYgKG5vZGVOdW0gPD0gMjAwICYmIG5vZGVOdW0gPiAxMDApXG4gICAgICAgICAgICAgICAgbWF4SXRlcmF0aW9uID0gNTAwO1xuICAgICAgICAgICAgZWxzZSBpZiAobm9kZU51bSA+IDIwMClcbiAgICAgICAgICAgICAgICBtYXhJdGVyYXRpb24gPSA5NTA7XG4gICAgICAgICAgICB0aGlzLm1heEl0ZXJhdGlvbiA9IG1heEl0ZXJhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXNlbGYua3IpIHtcbiAgICAgICAgICAgIHNlbGYua3IgPSA1MDtcbiAgICAgICAgICAgIGlmIChub2RlTnVtID4gMTAwICYmIG5vZGVOdW0gPD0gNTAwKVxuICAgICAgICAgICAgICAgIHNlbGYua3IgPSAyMDtcbiAgICAgICAgICAgIGVsc2UgaWYgKG5vZGVOdW0gPiA1MDApXG4gICAgICAgICAgICAgICAgc2VsZi5rciA9IDE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzZWxmLmtnKSB7XG4gICAgICAgICAgICBzZWxmLmtnID0gMjA7XG4gICAgICAgICAgICBpZiAobm9kZU51bSA+IDEwMCAmJiBub2RlTnVtIDw9IDUwMClcbiAgICAgICAgICAgICAgICBzZWxmLmtnID0gMTA7XG4gICAgICAgICAgICBlbHNlIGlmIChub2RlTnVtID4gNTAwKVxuICAgICAgICAgICAgICAgIHNlbGYua2cgPSAxO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubm9kZXMgPSBzZWxmLnVwZGF0ZU5vZGVzQnlGb3JjZXMoc2l6ZXMpO1xuICAgICAgICBvbkxheW91dEVuZCgpO1xuICAgIH1cbiAgICB1cGRhdGVOb2Rlc0J5Rm9yY2VzKHNpemVzKSB7XG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgICAgICBjb25zdCB7IGVkZ2VzLCBtYXhJdGVyYXRpb24gfSA9IHNlbGY7XG4gICAgICAgIGxldCBub2RlcyA9IHNlbGYubm9kZXM7XG4gICAgICAgIGNvbnN0IG5vbkxvb3BFZGdlcyA9IGVkZ2VzLmZpbHRlcigoZWRnZSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc291cmNlID0gZ2V0RWRnZVRlcm1pbmFsKGVkZ2UsICdzb3VyY2UnKTtcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGdldEVkZ2VUZXJtaW5hbChlZGdlLCAndGFyZ2V0Jyk7XG4gICAgICAgICAgICByZXR1cm4gc291cmNlICE9PSB0YXJnZXQ7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBzaXplID0gbm9kZXMubGVuZ3RoO1xuICAgICAgICBjb25zdCBlc2l6ZSA9IG5vbkxvb3BFZGdlcy5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGRlZ3JlZXMgPSBbXTtcbiAgICAgICAgY29uc3QgaWRNYXAgPSB7fTtcbiAgICAgICAgY29uc3QgZWRnZUVuZHNJZE1hcCA9IHt9O1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgICAgY29uc3QgRXMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzaXplOyBpICs9IDEpIHtcbiAgICAgICAgICAgIGlkTWFwW25vZGVzW2ldLmlkXSA9IGk7XG4gICAgICAgICAgICBkZWdyZWVzW2ldID0gMDtcbiAgICAgICAgICAgIGlmIChub2Rlc1tpXS54ID09PSB1bmRlZmluZWQgfHwgaXNOYU4obm9kZXNbaV0ueCkpIHtcbiAgICAgICAgICAgICAgICBub2Rlc1tpXS54ID0gTWF0aC5yYW5kb20oKSAqIDEwMDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobm9kZXNbaV0ueSA9PT0gdW5kZWZpbmVkIHx8IGlzTmFOKG5vZGVzW2ldLnkpKSB7XG4gICAgICAgICAgICAgICAgbm9kZXNbaV0ueSA9IE1hdGgucmFuZG9tKCkgKiAxMDAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgRXMucHVzaCh7IHg6IG5vZGVzW2ldLngsIHk6IG5vZGVzW2ldLnkgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlc2l6ZTsgaSArPSAxKSB7XG4gICAgICAgICAgICBsZXQgbm9kZTE7XG4gICAgICAgICAgICBsZXQgbm9kZTI7XG4gICAgICAgICAgICBsZXQgc0lkeCA9IDA7XG4gICAgICAgICAgICBsZXQgdElkeCA9IDA7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHNpemU7IGogKz0gMSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZSA9IGdldEVkZ2VUZXJtaW5hbChub25Mb29wRWRnZXNbaV0sICdzb3VyY2UnKTtcbiAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBnZXRFZGdlVGVybWluYWwobm9uTG9vcEVkZ2VzW2ldLCAndGFyZ2V0Jyk7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGVzW2pdLmlkID09PSBzb3VyY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZTEgPSBub2Rlc1tqXTtcbiAgICAgICAgICAgICAgICAgICAgc0lkeCA9IGo7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5vZGVzW2pdLmlkID09PSB0YXJnZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZTIgPSBub2Rlc1tqXTtcbiAgICAgICAgICAgICAgICAgICAgdElkeCA9IGo7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVkZ2VFbmRzSWRNYXBbaV0gPSB7IHNvdXJjZUlkeDogc0lkeCwgdGFyZ2V0SWR4OiB0SWR4IH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobm9kZTEpXG4gICAgICAgICAgICAgICAgZGVncmVlc1tpZE1hcFtub2RlMS5pZF1dICs9IDE7XG4gICAgICAgICAgICBpZiAobm9kZTIpXG4gICAgICAgICAgICAgICAgZGVncmVlc1tpZE1hcFtub2RlMi5pZF1dICs9IDE7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGl0ZXJhdGlvbiA9IG1heEl0ZXJhdGlvbjtcbiAgICAgICAgbm9kZXMgPSB0aGlzLml0ZXJhdGUoaXRlcmF0aW9uLCBpZE1hcCwgZWRnZUVuZHNJZE1hcCwgZXNpemUsIGRlZ3JlZXMsIHNpemVzKTtcbiAgICAgICAgLy8gaWYgcHJ1bmUsIHBsYWNlIHRoZSBsZWF2ZXMgYXJvdW5kIHRoZWlyIHBhcmVudHMsIGFuZCB0aGVuIHJlLWxheW91dCBmb3Igc2V2ZXJhbCBpdGVyYXRpb25zLlxuICAgICAgICBpZiAoc2VsZi5wcnVuZSkge1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBlc2l6ZTsgaiArPSAxKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRlZ3JlZXNbZWRnZUVuZHNJZE1hcFtqXS5zb3VyY2VJZHhdIDw9IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZXNbZWRnZUVuZHNJZE1hcFtqXS5zb3VyY2VJZHhdLnggPSBub2Rlc1tlZGdlRW5kc0lkTWFwW2pdLnRhcmdldElkeF0ueDtcbiAgICAgICAgICAgICAgICAgICAgbm9kZXNbZWRnZUVuZHNJZE1hcFtqXS5zb3VyY2VJZHhdLnkgPSBub2Rlc1tlZGdlRW5kc0lkTWFwW2pdLnRhcmdldElkeF0ueTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZGVncmVlc1tlZGdlRW5kc0lkTWFwW2pdLnRhcmdldElkeF0gPD0gMSkge1xuICAgICAgICAgICAgICAgICAgICBub2Rlc1tlZGdlRW5kc0lkTWFwW2pdLnRhcmdldElkeF0ueCA9IG5vZGVzW2VkZ2VFbmRzSWRNYXBbal0uc291cmNlSWR4XS54O1xuICAgICAgICAgICAgICAgICAgICBub2Rlc1tlZGdlRW5kc0lkTWFwW2pdLnRhcmdldElkeF0ueSA9IG5vZGVzW2VkZ2VFbmRzSWRNYXBbal0uc291cmNlSWR4XS55O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNlbGYucHJ1bmUgPSBmYWxzZTtcbiAgICAgICAgICAgIHNlbGYuYmFybmVzSHV0ID0gZmFsc2U7XG4gICAgICAgICAgICBpdGVyYXRpb24gPSAxMDA7XG4gICAgICAgICAgICBub2RlcyA9IHRoaXMuaXRlcmF0ZShpdGVyYXRpb24sIGlkTWFwLCBlZGdlRW5kc0lkTWFwLCBlc2l6ZSwgZGVncmVlcywgc2l6ZXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBub2RlcztcbiAgICB9XG4gICAgaXRlcmF0ZShpdGVyYXRpb24sIGlkTWFwLCBlZGdlRW5kc0lkTWFwLCBlc2l6ZSwgZGVncmVlcywgc2l6ZXMpIHtcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICAgIGxldCB7IG5vZGVzIH0gPSBzZWxmO1xuICAgICAgICBjb25zdCB7IGtyLCBwcmV2ZW50T3ZlcmxhcCB9ID0gc2VsZjtcbiAgICAgICAgY29uc3QgeyBiYXJuZXNIdXQgfSA9IHNlbGY7XG4gICAgICAgIGNvbnN0IG5vZGVOdW0gPSBub2Rlcy5sZW5ndGg7XG4gICAgICAgIGxldCBzZyA9IDA7XG4gICAgICAgIGNvbnN0IGtyUHJpbWUgPSAxMDA7XG4gICAgICAgIGxldCBpdGVyID0gaXRlcmF0aW9uO1xuICAgICAgICBjb25zdCBwcmV2b0l0ZXIgPSA1MDtcbiAgICAgICAgbGV0IGZvcmNlcyA9IFtdO1xuICAgICAgICBjb25zdCBwcmVGb3JjZXMgPSBbXTtcbiAgICAgICAgY29uc3QgYm9kaWVzID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZU51bTsgaSArPSAxKSB7XG4gICAgICAgICAgICBmb3JjZXNbMiAqIGldID0gMDtcbiAgICAgICAgICAgIGZvcmNlc1syICogaSArIDFdID0gMDtcbiAgICAgICAgICAgIGlmIChiYXJuZXNIdXQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiBpLFxuICAgICAgICAgICAgICAgICAgICByeDogbm9kZXNbaV0ueCxcbiAgICAgICAgICAgICAgICAgICAgcnk6IG5vZGVzW2ldLnksXG4gICAgICAgICAgICAgICAgICAgIG1hc3M6IDEsXG4gICAgICAgICAgICAgICAgICAgIGc6IGtyLFxuICAgICAgICAgICAgICAgICAgICBkZWdyZWU6IGRlZ3JlZXNbaV1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGJvZGllc1tpXSA9IG5ldyBCb2R5KHBhcmFtcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKGl0ZXIgPiAwKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGVOdW07IGkgKz0gMSkge1xuICAgICAgICAgICAgICAgIHByZUZvcmNlc1syICogaV0gPSBmb3JjZXNbMiAqIGldO1xuICAgICAgICAgICAgICAgIHByZUZvcmNlc1syICogaSArIDFdID0gZm9yY2VzWzIgKiBpICsgMV07XG4gICAgICAgICAgICAgICAgZm9yY2VzWzIgKiBpXSA9IDA7XG4gICAgICAgICAgICAgICAgZm9yY2VzWzIgKiBpICsgMV0gPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gYXR0cmFjdGl2ZSBmb3JjZXMsIGV4aXN0aW5nIG9uIGV2ZXJ5IGFjdHVhbCBlZGdlXG4gICAgICAgICAgICBmb3JjZXMgPSB0aGlzLmdldEF0dHJGb3JjZXMoaXRlciwgcHJldm9JdGVyLCBlc2l6ZSwgaWRNYXAsIGVkZ2VFbmRzSWRNYXAsIGRlZ3JlZXMsIHNpemVzLCBmb3JjZXMpO1xuICAgICAgICAgICAgLy8gcmVwdWxzaXZlIGZvcmNlcyBhbmQgR3Jhdml0eSwgZXhpc3Rpbmcgb24gZXZlcnkgbm9kZSBwYWlyXG4gICAgICAgICAgICAvLyBpZiBwcmV2ZW50T3ZlcmxhcCwgdXNpbmcgdGhlIG5vLW9wdGltaXplZCBtZXRob2QgaW4gdGhlIGxhc3QgcHJldm9JdGVyIGluc3RlYWQuXG4gICAgICAgICAgICBpZiAoYmFybmVzSHV0ICYmICgocHJldmVudE92ZXJsYXAgJiYgaXRlciA+IHByZXZvSXRlcikgfHwgIXByZXZlbnRPdmVybGFwKSkge1xuICAgICAgICAgICAgICAgIGZvcmNlcyA9IHRoaXMuZ2V0T3B0UmVwR3JhRm9yY2VzKGZvcmNlcywgYm9kaWVzLCBkZWdyZWVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvcmNlcyA9IHRoaXMuZ2V0UmVwR3JhRm9yY2VzKGl0ZXIsIHByZXZvSXRlciwgZm9yY2VzLCBrclByaW1lLCBzaXplcywgZGVncmVlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyB1cGRhdGUgdGhlIHBvc2l0aW9uc1xuICAgICAgICAgICAgY29uc3QgcmVzID0gdGhpcy51cGRhdGVQb3MoZm9yY2VzLCBwcmVGb3JjZXMsIHNnLCBkZWdyZWVzKTtcbiAgICAgICAgICAgIG5vZGVzID0gcmVzLm5vZGVzO1xuICAgICAgICAgICAgc2cgPSByZXMuc2c7XG4gICAgICAgICAgICBpdGVyLS07XG4gICAgICAgICAgICBpZiAoc2VsZi50aWNrKVxuICAgICAgICAgICAgICAgIHNlbGYudGljaygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBub2RlcztcbiAgICB9XG4gICAgZ2V0QXR0ckZvcmNlcyhpdGVyLCBwcmV2b0l0ZXIsIGVzaXplLCBpZE1hcCwgZWRnZUVuZHNJZE1hcCwgZGVncmVlcywgc2l6ZXMsIGZvcmNlcykge1xuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAgICAgY29uc3QgeyBub2RlcywgcHJldmVudE92ZXJsYXAsIGRpc3N1YWRlSHVicywgbW9kZSwgcHJ1bmUgfSA9IHNlbGY7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXNpemU7IGkgKz0gMSkge1xuICAgICAgICAgICAgY29uc3Qgc291cmNlTm9kZSA9IG5vZGVzW2VkZ2VFbmRzSWRNYXBbaV0uc291cmNlSWR4XTtcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZUlkeCA9IGVkZ2VFbmRzSWRNYXBbaV0uc291cmNlSWR4O1xuICAgICAgICAgICAgY29uc3QgdGFyZ2V0Tm9kZSA9IG5vZGVzW2VkZ2VFbmRzSWRNYXBbaV0udGFyZ2V0SWR4XTtcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldElkeCA9IGVkZ2VFbmRzSWRNYXBbaV0udGFyZ2V0SWR4O1xuICAgICAgICAgICAgaWYgKHBydW5lICYmIChkZWdyZWVzW3NvdXJjZUlkeF0gPD0gMSB8fCBkZWdyZWVzW3RhcmdldElkeF0gPD0gMSkpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBjb25zdCBkaXIgPSBbdGFyZ2V0Tm9kZS54IC0gc291cmNlTm9kZS54LCB0YXJnZXROb2RlLnkgLSBzb3VyY2VOb2RlLnldO1xuICAgICAgICAgICAgbGV0IGV1Y2xpRGlzID0gTWF0aC5oeXBvdChkaXJbMF0sIGRpclsxXSk7XG4gICAgICAgICAgICBldWNsaURpcyA9IGV1Y2xpRGlzIDwgMC4wMDAxID8gMC4wMDAxIDogZXVjbGlEaXM7XG4gICAgICAgICAgICBkaXJbMF0gPSBkaXJbMF0gLyBldWNsaURpcztcbiAgICAgICAgICAgIGRpclsxXSA9IGRpclsxXSAvIGV1Y2xpRGlzO1xuICAgICAgICAgICAgaWYgKHByZXZlbnRPdmVybGFwICYmIGl0ZXIgPCBwcmV2b0l0ZXIpXG4gICAgICAgICAgICAgICAgZXVjbGlEaXMgPSBldWNsaURpcyAtIHNpemVzW3NvdXJjZUlkeF0gLSBzaXplc1t0YXJnZXRJZHhdO1xuICAgICAgICAgICAgbGV0IEZhMSA9IGV1Y2xpRGlzOyAvLyB0c2xpbnQ6ZGlzYWJsZS1saW5lXG4gICAgICAgICAgICBsZXQgRmEyID0gRmExOyAvLyB0c2xpbnQ6ZGlzYWJsZS1saW5lXG4gICAgICAgICAgICBpZiAobW9kZSA9PT0gJ2xpbmxvZycpIHtcbiAgICAgICAgICAgICAgICBGYTEgPSBNYXRoLmxvZygxICsgZXVjbGlEaXMpO1xuICAgICAgICAgICAgICAgIEZhMiA9IEZhMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChkaXNzdWFkZUh1YnMpIHtcbiAgICAgICAgICAgICAgICBGYTEgPSBldWNsaURpcyAvIGRlZ3JlZXNbc291cmNlSWR4XTtcbiAgICAgICAgICAgICAgICBGYTIgPSBldWNsaURpcyAvIGRlZ3JlZXNbdGFyZ2V0SWR4XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwcmV2ZW50T3ZlcmxhcCAmJiBpdGVyIDwgcHJldm9JdGVyICYmIGV1Y2xpRGlzIDw9IDApIHtcbiAgICAgICAgICAgICAgICBGYTEgPSAwO1xuICAgICAgICAgICAgICAgIEZhMiA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChwcmV2ZW50T3ZlcmxhcCAmJiBpdGVyIDwgcHJldm9JdGVyICYmIGV1Y2xpRGlzID4gMCkge1xuICAgICAgICAgICAgICAgIEZhMSA9IGV1Y2xpRGlzO1xuICAgICAgICAgICAgICAgIEZhMiA9IGV1Y2xpRGlzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yY2VzWzIgKiBpZE1hcFtzb3VyY2VOb2RlLmlkXV0gKz0gRmExICogZGlyWzBdO1xuICAgICAgICAgICAgZm9yY2VzWzIgKiBpZE1hcFt0YXJnZXROb2RlLmlkXV0gLT0gRmEyICogZGlyWzBdO1xuICAgICAgICAgICAgZm9yY2VzWzIgKiBpZE1hcFtzb3VyY2VOb2RlLmlkXSArIDFdICs9IEZhMSAqIGRpclsxXTtcbiAgICAgICAgICAgIGZvcmNlc1syICogaWRNYXBbdGFyZ2V0Tm9kZS5pZF0gKyAxXSAtPSBGYTIgKiBkaXJbMV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZvcmNlcztcbiAgICB9XG4gICAgZ2V0UmVwR3JhRm9yY2VzKGl0ZXIsIHByZXZvSXRlciwgZm9yY2VzLCBrclByaW1lLCBzaXplcywgZGVncmVlcykge1xuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAgICAgY29uc3QgeyBub2RlcywgcHJldmVudE92ZXJsYXAsIGtyLCBrZywgY2VudGVyLCBwcnVuZSB9ID0gc2VsZjtcbiAgICAgICAgY29uc3Qgbm9kZU51bSA9IG5vZGVzLmxlbmd0aDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2RlTnVtOyBpICs9IDEpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSBpICsgMTsgaiA8IG5vZGVOdW07IGogKz0gMSkge1xuICAgICAgICAgICAgICAgIGlmIChwcnVuZSAmJiAoZGVncmVlc1tpXSA8PSAxIHx8IGRlZ3JlZXNbal0gPD0gMSkpXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRpciA9IFtub2Rlc1tqXS54IC0gbm9kZXNbaV0ueCwgbm9kZXNbal0ueSAtIG5vZGVzW2ldLnldO1xuICAgICAgICAgICAgICAgIGxldCBldWNsaURpcyA9IE1hdGguaHlwb3QoZGlyWzBdLCBkaXJbMV0pO1xuICAgICAgICAgICAgICAgIGV1Y2xpRGlzID0gZXVjbGlEaXMgPCAwLjAwMDEgPyAwLjAwMDEgOiBldWNsaURpcztcbiAgICAgICAgICAgICAgICBkaXJbMF0gPSBkaXJbMF0gLyBldWNsaURpcztcbiAgICAgICAgICAgICAgICBkaXJbMV0gPSBkaXJbMV0gLyBldWNsaURpcztcbiAgICAgICAgICAgICAgICBpZiAocHJldmVudE92ZXJsYXAgJiYgaXRlciA8IHByZXZvSXRlcilcbiAgICAgICAgICAgICAgICAgICAgZXVjbGlEaXMgPSBldWNsaURpcyAtIHNpemVzW2ldIC0gc2l6ZXNbal07XG4gICAgICAgICAgICAgICAgbGV0IEZyID0ga3IgKiAoZGVncmVlc1tpXSArIDEpICogKGRlZ3JlZXNbal0gKyAxKSAvIGV1Y2xpRGlzOyAvLyB0c2xpbnQ6ZGlzYWJsZS1saW5lXG4gICAgICAgICAgICAgICAgaWYgKHByZXZlbnRPdmVybGFwICYmIGl0ZXIgPCBwcmV2b0l0ZXIgJiYgZXVjbGlEaXMgPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIEZyID0ga3JQcmltZSAqIChkZWdyZWVzW2ldICsgMSkgKiAoZGVncmVlc1tqXSArIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChwcmV2ZW50T3ZlcmxhcCAmJiBpdGVyIDwgcHJldm9JdGVyICYmIGV1Y2xpRGlzID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIEZyID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocHJldmVudE92ZXJsYXAgJiYgaXRlciA8IHByZXZvSXRlciAmJiBldWNsaURpcyA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgRnIgPSBrciAqIChkZWdyZWVzW2ldICsgMSkgKiAoZGVncmVlc1tqXSArIDEpIC8gZXVjbGlEaXM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZvcmNlc1syICogaV0gLT0gRnIgKiBkaXJbMF07XG4gICAgICAgICAgICAgICAgZm9yY2VzWzIgKiBqXSArPSBGciAqIGRpclswXTtcbiAgICAgICAgICAgICAgICBmb3JjZXNbMiAqIGkgKyAxXSAtPSBGciAqIGRpclsxXTtcbiAgICAgICAgICAgICAgICBmb3JjZXNbMiAqIGogKyAxXSArPSBGciAqIGRpclsxXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGdyYXZpdHlcbiAgICAgICAgICAgIGNvbnN0IGRpciA9IFtub2Rlc1tpXS54IC0gY2VudGVyWzBdLCBub2Rlc1tpXS55IC0gY2VudGVyWzFdXTtcbiAgICAgICAgICAgIGNvbnN0IGV1Y2xpRGlzID0gTWF0aC5oeXBvdChkaXJbMF0sIGRpclsxXSk7XG4gICAgICAgICAgICBkaXJbMF0gPSBkaXJbMF0gLyBldWNsaURpcztcbiAgICAgICAgICAgIGRpclsxXSA9IGRpclsxXSAvIGV1Y2xpRGlzO1xuICAgICAgICAgICAgY29uc3QgRmcgPSBrZyAqIChkZWdyZWVzW2ldICsgMSk7IC8vIHRzbGludDpkaXNhYmxlLWxpbmVcbiAgICAgICAgICAgIGZvcmNlc1syICogaV0gLT0gRmcgKiBkaXJbMF07XG4gICAgICAgICAgICBmb3JjZXNbMiAqIGkgKyAxXSAtPSBGZyAqIGRpclsxXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZm9yY2VzO1xuICAgIH1cbiAgICBnZXRPcHRSZXBHcmFGb3JjZXMoZm9yY2VzLCBib2RpZXMsIGRlZ3JlZXMpIHtcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICAgIGNvbnN0IHsgbm9kZXMsIGtnLCBjZW50ZXIsIHBydW5lIH0gPSBzZWxmO1xuICAgICAgICBjb25zdCBub2RlTnVtID0gbm9kZXMubGVuZ3RoO1xuICAgICAgICBsZXQgbWlueCA9IDllMTA7XG4gICAgICAgIGxldCBtYXh4ID0gLTllMTA7XG4gICAgICAgIGxldCBtaW55ID0gOWUxMDtcbiAgICAgICAgbGV0IG1heHkgPSAtOWUxMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2RlTnVtOyBpICs9IDEpIHtcbiAgICAgICAgICAgIGlmIChwcnVuZSAmJiAoZGVncmVlc1tpXSA8PSAxKSlcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIGJvZGllc1tpXS5zZXRQb3Mobm9kZXNbaV0ueCwgbm9kZXNbaV0ueSk7XG4gICAgICAgICAgICBpZiAobm9kZXNbaV0ueCA+PSBtYXh4KVxuICAgICAgICAgICAgICAgIG1heHggPSBub2Rlc1tpXS54O1xuICAgICAgICAgICAgaWYgKG5vZGVzW2ldLnggPD0gbWlueClcbiAgICAgICAgICAgICAgICBtaW54ID0gbm9kZXNbaV0ueDtcbiAgICAgICAgICAgIGlmIChub2Rlc1tpXS55ID49IG1heHkpXG4gICAgICAgICAgICAgICAgbWF4eSA9IG5vZGVzW2ldLnk7XG4gICAgICAgICAgICBpZiAobm9kZXNbaV0ueSA8PSBtaW55KVxuICAgICAgICAgICAgICAgIG1pbnkgPSBub2Rlc1tpXS55O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHdpZHRoID0gTWF0aC5tYXgobWF4eCAtIG1pbngsIG1heHkgLSBtaW55KTtcbiAgICAgICAgY29uc3QgcXVhZFBhcmFtcyA9IHtcbiAgICAgICAgICAgIHhtaWQ6IChtYXh4ICsgbWlueCkgLyAyLFxuICAgICAgICAgICAgeW1pZDogKG1heHkgKyBtaW55KSAvIDIsXG4gICAgICAgICAgICBsZW5ndGg6IHdpZHRoLFxuICAgICAgICAgICAgbWFzc0NlbnRlcjogY2VudGVyLFxuICAgICAgICAgICAgbWFzczogbm9kZU51bVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBxdWFkID0gbmV3IFF1YWQocXVhZFBhcmFtcyk7XG4gICAgICAgIGNvbnN0IHF1YWRUcmVlID0gbmV3IFF1YWRUcmVlKHF1YWQpO1xuICAgICAgICAvLyBidWlsZCB0aGUgdHJlZSwgaW5zZXJ0IHRoZSBub2RlcyhxdWFkcykgaW50byB0aGUgdHJlZVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGVOdW07IGkgKz0gMSkge1xuICAgICAgICAgICAgaWYgKHBydW5lICYmIChkZWdyZWVzW2ldIDw9IDEpKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKGJvZGllc1tpXS5pbihxdWFkKSlcbiAgICAgICAgICAgICAgICBxdWFkVHJlZS5pbnNlcnQoYm9kaWVzW2ldKTtcbiAgICAgICAgfVxuICAgICAgICAvLyB1cGRhdGUgdGhlIHJlcHVsc2l2ZSBmb3JjZXMgYW5kIHRoZSBncmF2aXR5LlxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGVOdW07IGkgKz0gMSkge1xuICAgICAgICAgICAgaWYgKHBydW5lICYmIChkZWdyZWVzW2ldIDw9IDEpKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgYm9kaWVzW2ldLnJlc2V0Rm9yY2UoKTtcbiAgICAgICAgICAgIHF1YWRUcmVlLnVwZGF0ZUZvcmNlKGJvZGllc1tpXSk7XG4gICAgICAgICAgICBmb3JjZXNbMiAqIGldIC09IGJvZGllc1tpXS5meDtcbiAgICAgICAgICAgIGZvcmNlc1syICogaSArIDFdIC09IGJvZGllc1tpXS5meTtcbiAgICAgICAgICAgIC8vIGdyYXZpdHlcbiAgICAgICAgICAgIGNvbnN0IGRpciA9IFtub2Rlc1tpXS54IC0gY2VudGVyWzBdLCBub2Rlc1tpXS55IC0gY2VudGVyWzFdXTtcbiAgICAgICAgICAgIGxldCBldWNsaURpcyA9IE1hdGguaHlwb3QoZGlyWzBdLCBkaXJbMV0pO1xuICAgICAgICAgICAgZXVjbGlEaXMgPSBldWNsaURpcyA8IDAuMDAwMSA/IDAuMDAwMSA6IGV1Y2xpRGlzO1xuICAgICAgICAgICAgZGlyWzBdID0gZGlyWzBdIC8gZXVjbGlEaXM7XG4gICAgICAgICAgICBkaXJbMV0gPSBkaXJbMV0gLyBldWNsaURpcztcbiAgICAgICAgICAgIGNvbnN0IEZnID0ga2cgKiAoZGVncmVlc1tpXSArIDEpOyAvLyB0c2xpbnQ6ZGlzYWJsZS1saW5lXG4gICAgICAgICAgICBmb3JjZXNbMiAqIGldIC09IEZnICogZGlyWzBdO1xuICAgICAgICAgICAgZm9yY2VzWzIgKiBpICsgMV0gLT0gRmcgKiBkaXJbMV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZvcmNlcztcbiAgICB9XG4gICAgdXBkYXRlUG9zKGZvcmNlcywgcHJlRm9yY2VzLCBzZywgZGVncmVlcykge1xuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAgICAgY29uc3QgeyBub2Rlcywga3MsIHRhbywgcHJ1bmUsIGtzbWF4IH0gPSBzZWxmO1xuICAgICAgICBjb25zdCBub2RlTnVtID0gbm9kZXMubGVuZ3RoO1xuICAgICAgICBjb25zdCBzd2ducyA9IFtdO1xuICAgICAgICBjb25zdCB0cmFucyA9IFtdO1xuICAgICAgICAvLyBzd2coRykgYW5kIHRyYShHKVxuICAgICAgICBsZXQgc3dnRyA9IDA7XG4gICAgICAgIGxldCB0cmFHID0gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2RlTnVtOyBpICs9IDEpIHtcbiAgICAgICAgICAgIGlmIChwcnVuZSAmJiAoZGVncmVlc1tpXSA8PSAxKSlcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIGNvbnN0IG1pbnVzID0gW2ZvcmNlc1syICogaV0gLSBwcmVGb3JjZXNbMiAqIGldLFxuICAgICAgICAgICAgICAgIGZvcmNlc1syICogaSArIDFdIC0gcHJlRm9yY2VzWzIgKiBpICsgMV1cbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBjb25zdCBtaW51c05vcm0gPSBNYXRoLmh5cG90KG1pbnVzWzBdLCBtaW51c1sxXSk7XG4gICAgICAgICAgICBjb25zdCBhZGQgPSBbZm9yY2VzWzIgKiBpXSArIHByZUZvcmNlc1syICogaV0sXG4gICAgICAgICAgICAgICAgZm9yY2VzWzIgKiBpICsgMV0gKyBwcmVGb3JjZXNbMiAqIGkgKyAxXVxuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGNvbnN0IGFkZE5vcm0gPSBNYXRoLmh5cG90KGFkZFswXSwgYWRkWzFdKTtcbiAgICAgICAgICAgIHN3Z25zW2ldID0gbWludXNOb3JtO1xuICAgICAgICAgICAgdHJhbnNbaV0gPSBhZGROb3JtIC8gMjtcbiAgICAgICAgICAgIHN3Z0cgKz0gKGRlZ3JlZXNbaV0gKyAxKSAqIHN3Z25zW2ldO1xuICAgICAgICAgICAgdHJhRyArPSAoZGVncmVlc1tpXSArIDEpICogdHJhbnNbaV07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHJlU0cgPSBzZztcbiAgICAgICAgc2cgPSB0YW8gKiB0cmFHIC8gc3dnRzsgLy8gdHNsaW50OmRpc2FibGUtbGluZVxuICAgICAgICBpZiAocHJlU0cgIT09IDApIHtcbiAgICAgICAgICAgIHNnID0gc2cgPiAoMS41ICogcHJlU0cpID8gKDEuNSAqIHByZVNHKSA6IHNnOyAvLyB0c2xpbnQ6ZGlzYWJsZS1saW5lXG4gICAgICAgIH1cbiAgICAgICAgLy8gdXBkYXRlIHRoZSBub2RlIHBvc2l0aW9uc1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGVOdW07IGkgKz0gMSkge1xuICAgICAgICAgICAgaWYgKHBydW5lICYmIChkZWdyZWVzW2ldIDw9IDEpKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgbGV0IHNuID0ga3MgKiBzZyAvICgxICsgc2cgKiBNYXRoLnNxcnQoc3dnbnNbaV0pKTtcbiAgICAgICAgICAgIGxldCBhYnNGb3JjZSA9IE1hdGguaHlwb3QoZm9yY2VzWzIgKiBpXSwgZm9yY2VzWzIgKiBpICsgMV0pO1xuICAgICAgICAgICAgYWJzRm9yY2UgPSBhYnNGb3JjZSA8IDAuMDAwMSA/IDAuMDAwMSA6IGFic0ZvcmNlO1xuICAgICAgICAgICAgY29uc3QgbWF4ID0ga3NtYXggLyBhYnNGb3JjZTtcbiAgICAgICAgICAgIHNuID0gc24gPiBtYXggPyBtYXggOiBzbjtcbiAgICAgICAgICAgIGNvbnN0IGRueCA9IHNuICogZm9yY2VzWzIgKiBpXTtcbiAgICAgICAgICAgIGNvbnN0IGRueSA9IHNuICogZm9yY2VzWzIgKiBpICsgMV07XG4gICAgICAgICAgICBub2Rlc1tpXS54ICs9IGRueDtcbiAgICAgICAgICAgIG5vZGVzW2ldLnkgKz0gZG55O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IG5vZGVzLCBzZyB9O1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsImltcG9ydCB7IGdldExheW91dEJ5TmFtZSB9IGZyb20gXCIuLi9yZWdpc3R5XCI7XG5pbXBvcnQgeyBHcmlkTGF5b3V0IH0gZnJvbSBcIi4vZ3JpZFwiO1xuaW1wb3J0IHsgUmFuZG9tTGF5b3V0IH0gZnJvbSBcIi4vcmFuZG9tXCI7XG5pbXBvcnQgeyBHRm9yY2VMYXlvdXQgfSBmcm9tIFwiLi9nRm9yY2VcIjtcbmltcG9ydCB7IEZvcmNlTGF5b3V0IH0gZnJvbSBcIi4vZm9yY2VcIjtcbmltcG9ydCB7IENpcmN1bGFyTGF5b3V0IH0gZnJvbSBcIi4vY2lyY3VsYXJcIjtcbmltcG9ydCB7IERhZ3JlTGF5b3V0IH0gZnJvbSBcIi4vZGFncmVcIjtcbmltcG9ydCB7IFJhZGlhbExheW91dCB9IGZyb20gXCIuL3JhZGlhbFwiO1xuaW1wb3J0IHsgQ29uY2VudHJpY0xheW91dCB9IGZyb20gXCIuL2NvbmNlbnRyaWNcIjtcbmltcG9ydCB7IE1EU0xheW91dCB9IGZyb20gXCIuL21kc1wiO1xuaW1wb3J0IHsgRnJ1Y2h0ZXJtYW5MYXlvdXQgfSBmcm9tIFwiLi9mcnVjaHRlcm1hblwiO1xuaW1wb3J0IHsgRnJ1Y2h0ZXJtYW5HUFVMYXlvdXQgfSBmcm9tIFwiLi9ncHUvZnJ1Y2h0ZXJtYW5cIjtcbmltcG9ydCB7IEdGb3JjZUdQVUxheW91dCB9IGZyb20gXCIuL2dwdS9nRm9yY2VcIjtcbmltcG9ydCB7IENvbWJvRm9yY2VMYXlvdXQgfSBmcm9tIFwiLi9jb21ib0ZvcmNlXCI7XG5pbXBvcnQgeyBGb3JjZUF0bGFzMkxheW91dCB9IGZyb20gXCIuL2ZvcmNlQXRsYXMyXCI7XG5leHBvcnQgY2xhc3MgTGF5b3V0IHtcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IGxheW91dENsYXNzID0gZ2V0TGF5b3V0QnlOYW1lKG9wdGlvbnMudHlwZSk7XG4gICAgICAgIHRoaXMubGF5b3V0SW5zdGFuY2UgPSBuZXcgbGF5b3V0Q2xhc3Mob3B0aW9ucyk7XG4gICAgfVxuICAgIGxheW91dChkYXRhKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxheW91dEluc3RhbmNlLmxheW91dChkYXRhKTtcbiAgICB9XG4gICAgdXBkYXRlQ2ZnKGNmZykge1xuICAgICAgICB0aGlzLmxheW91dEluc3RhbmNlLnVwZGF0ZUNmZyhjZmcpO1xuICAgIH1cbiAgICBpbml0KGRhdGEpIHtcbiAgICAgICAgdGhpcy5sYXlvdXRJbnN0YW5jZS5pbml0KGRhdGEpO1xuICAgIH1cbiAgICBleGVjdXRlKCkge1xuICAgICAgICB0aGlzLmxheW91dEluc3RhbmNlLmV4ZWN1dGUoKTtcbiAgICB9XG4gICAgZ2V0RGVmYXVsdENmZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGF5b3V0SW5zdGFuY2UuZ2V0RGVmYXVsdENmZygpO1xuICAgIH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sYXlvdXRJbnN0YW5jZS5kZXN0cm95KCk7XG4gICAgfVxufVxuLy8gRklYTUVcbi8vIEZPUiBHNlxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lXG5leHBvcnQgY29uc3QgTGF5b3V0cyA9IHtcbiAgICBmb3JjZTogRm9yY2VMYXlvdXQsXG4gICAgZnJ1Y2h0ZXJtYW46IEZydWNodGVybWFuTGF5b3V0LFxuICAgIGZvcmNlQXRsYXMyOiBGb3JjZUF0bGFzMkxheW91dCxcbiAgICBnRm9yY2U6IEdGb3JjZUxheW91dCxcbiAgICBkYWdyZTogRGFncmVMYXlvdXQsXG4gICAgY2lyY3VsYXI6IENpcmN1bGFyTGF5b3V0LFxuICAgIHJhZGlhbDogUmFkaWFsTGF5b3V0LFxuICAgIGNvbmNlbnRyaWM6IENvbmNlbnRyaWNMYXlvdXQsXG4gICAgZ3JpZDogR3JpZExheW91dCxcbiAgICBtZHM6IE1EU0xheW91dCxcbiAgICBjb21ib0ZvcmNlOiBDb21ib0ZvcmNlTGF5b3V0LFxuICAgIHJhbmRvbTogUmFuZG9tTGF5b3V0LFxuICAgICdnRm9yY2UtZ3B1JzogR0ZvcmNlR1BVTGF5b3V0LFxuICAgICdmcnVjaHRlcm1hbi1ncHUnOiBGcnVjaHRlcm1hbkdQVUxheW91dCxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1sYXlvdXQuanMubWFwIiwiZXhwb3J0IHt9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dHlwZXMuanMubWFwIiwiaW1wb3J0IHsgR3JpZExheW91dCB9IGZyb20gXCIuL2dyaWRcIjtcbmltcG9ydCB7IFJhbmRvbUxheW91dCB9IGZyb20gXCIuL3JhbmRvbVwiO1xuaW1wb3J0IHsgR0ZvcmNlTGF5b3V0IH0gZnJvbSBcIi4vZ0ZvcmNlXCI7XG5pbXBvcnQgeyBGb3JjZUxheW91dCB9IGZyb20gXCIuL2ZvcmNlXCI7XG5pbXBvcnQgeyBDaXJjdWxhckxheW91dCB9IGZyb20gXCIuL2NpcmN1bGFyXCI7XG5pbXBvcnQgeyBEYWdyZUxheW91dCB9IGZyb20gXCIuL2RhZ3JlXCI7XG5pbXBvcnQgeyBSYWRpYWxMYXlvdXQgfSBmcm9tIFwiLi9yYWRpYWxcIjtcbmltcG9ydCB7IENvbmNlbnRyaWNMYXlvdXQgfSBmcm9tIFwiLi9jb25jZW50cmljXCI7XG5pbXBvcnQgeyBNRFNMYXlvdXQgfSBmcm9tIFwiLi9tZHNcIjtcbmltcG9ydCB7IEZydWNodGVybWFuTGF5b3V0IH0gZnJvbSBcIi4vZnJ1Y2h0ZXJtYW5cIjtcbmltcG9ydCB7IEZydWNodGVybWFuR1BVTGF5b3V0IH0gZnJvbSBcIi4vZ3B1L2ZydWNodGVybWFuXCI7XG5pbXBvcnQgeyBHRm9yY2VHUFVMYXlvdXQgfSBmcm9tIFwiLi9ncHUvZ0ZvcmNlXCI7XG5pbXBvcnQgeyBDb21ib0ZvcmNlTGF5b3V0IH0gZnJvbSBcIi4vY29tYm9Gb3JjZVwiO1xuaW1wb3J0IHsgRm9yY2VBdGxhczJMYXlvdXQgfSBmcm9tIFwiLi9mb3JjZUF0bGFzMlwiO1xuaW1wb3J0IHsgTGF5b3V0LCBMYXlvdXRzIH0gZnJvbSBcIi4vbGF5b3V0XCI7XG5leHBvcnQgeyBMYXlvdXQsIExheW91dHMgfTtcbi8vIGxheW91dFxuZXhwb3J0IHsgR3JpZExheW91dCwgUmFuZG9tTGF5b3V0LCBHRm9yY2VMYXlvdXQsIEZvcmNlTGF5b3V0LCBDaXJjdWxhckxheW91dCwgRGFncmVMYXlvdXQsIFJhZGlhbExheW91dCwgQ29uY2VudHJpY0xheW91dCwgTURTTGF5b3V0LCBGcnVjaHRlcm1hbkxheW91dCwgRnJ1Y2h0ZXJtYW5HUFVMYXlvdXQsIEdGb3JjZUdQVUxheW91dCwgQ29tYm9Gb3JjZUxheW91dCwgRm9yY2VBdGxhczJMYXlvdXQsIH07XG4vLyB0eXBlcyBmaWxlXG5leHBvcnQgKiBmcm9tIFwiLi90eXBlc1wiO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiaW1wb3J0IHsgcmVnaXN0ZXJMYXlvdXQsIHVuUmVnaXN0ZXJMYXlvdXQsIGdldExheW91dEJ5TmFtZSB9IGZyb20gXCIuL3JlZ2lzdHlcIjtcbi8vIHJlZ2lzdGVyIGxheW91dFxuZXhwb3J0IHsgcmVnaXN0ZXJMYXlvdXQsIHVuUmVnaXN0ZXJMYXlvdXQsIGdldExheW91dEJ5TmFtZSB9O1xuLy8gbGF5b3V0LCBsYXlvdXQgdHlwZXMgZmlsZSwgd29ya2VyXG5leHBvcnQgKiBmcm9tIFwiLi9sYXlvdXRcIjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsImltcG9ydCB7IFV0aWwgfSBmcm9tICdAYW50di9nNi1jb3JlJztcbmltcG9ydCB7IGlzTnVtYmVyIH0gZnJvbSAnQGFudHYvdXRpbCc7XG52YXIgdHJhdmVyc2VUcmVlID0gVXRpbC50cmF2ZXJzZVRyZWU7XG4vKipcbiAqIOWwhiBudW1iZXIgfCBGdW5jdGlvbiDnsbvlnovnmoTlj4LmlbDovazmjaLkuLogcmV0dXJuIG51bWJlciDnmoQgRnVuY3Rpb25cbiAqIEBwYXJhbSAge251bWJlciB8IEZ1bmN0aW9ufSAgdmFsdWUg6ZyA6KaB6KKr6L2s5o2i55qE5YC8XG4gKiBAcGFyYW0gIHtudW1iZXJ9ICBkZWZhdWx0ViDov5Tlm57lh73mlbDnmoTpu5jorqTov5Tlm57lgLxcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSDovazmjaLlkI7nmoTlh73mlbBcbiAqL1xuXG5leHBvcnQgdmFyIHByb2NjZXNzVG9GdW5jID0gZnVuY3Rpb24gcHJvY2Nlc3NUb0Z1bmModmFsdWUsIGRlZmF1bHRWKSB7XG4gIHZhciBmdW5jO1xuXG4gIGlmICghdmFsdWUpIHtcbiAgICBmdW5jID0gZnVuY3Rpb24gZnVuYyhkKSB7XG4gICAgICByZXR1cm4gZGVmYXVsdFYgfHwgMTtcbiAgICB9O1xuICB9IGVsc2UgaWYgKGlzTnVtYmVyKHZhbHVlKSkge1xuICAgIGZ1bmMgPSBmdW5jdGlvbiBmdW5jKGQpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIGZ1bmMgPSB2YWx1ZTtcbiAgfVxuXG4gIHJldHVybiBmdW5jO1xufTtcbi8qKlxuICog5bCG6IqC54K55ZKM6L655pWw5o2u6L2s5o2i5Li6IEdQVSDlj6/or7vnmoTmlbDnu4TjgILlubbov5Tlm54gbWF4RWRnZVBlclZldGV477yM5q+P5Liq6IqC54K55LiK5pyA5aSa55qE6L655pWwXG4gKiBAcGFyYW0gIHtOb2RlQ29uZmlnW119ICBub2RlcyDpnIDopoHooqvovazmjaLnmoTlgLxcbiAqIEBwYXJhbSAge0VkZ2VDb25maWdbXX0gIGVkZ2VzIOi/lOWbnuWHveaVsOeahOm7mOiupOi/lOWbnuWAvFxuICogQHJldHVybiB7T2JqZWN0fSDovazmjaLlkI7nmoTmlbDnu4Tlj4ogbWF4RWRnZVBlclZldGV4IOe7hOaIkOeahOWvueixoVxuICovXG5cbmV4cG9ydCB2YXIgYnVpbGRUZXh0dXJlRGF0YSA9IGZ1bmN0aW9uIGJ1aWxkVGV4dHVyZURhdGEobm9kZXMsIGVkZ2VzKSB7XG4gIHZhciBkYXRhQXJyYXkgPSBbXTtcbiAgdmFyIG5vZGVEaWN0ID0gW107XG4gIHZhciBtYXBJZFBvcyA9IHt9O1xuICB2YXIgaSA9IDA7XG5cbiAgZm9yIChpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIG4gPSBub2Rlc1tpXTtcbiAgICBtYXBJZFBvc1tuLmlkXSA9IGk7XG4gICAgZGF0YUFycmF5LnB1c2gobi54KTtcbiAgICBkYXRhQXJyYXkucHVzaChuLnkpO1xuICAgIGRhdGFBcnJheS5wdXNoKDApO1xuICAgIGRhdGFBcnJheS5wdXNoKDApO1xuICAgIG5vZGVEaWN0LnB1c2goW10pO1xuICB9XG5cbiAgZm9yIChpID0gMDsgaSA8IGVkZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGUgPSBlZGdlc1tpXTtcbiAgICBub2RlRGljdFttYXBJZFBvc1tlLnNvdXJjZV1dLnB1c2gobWFwSWRQb3NbZS50YXJnZXRdKTtcbiAgICBub2RlRGljdFttYXBJZFBvc1tlLnRhcmdldF1dLnB1c2gobWFwSWRQb3NbZS5zb3VyY2VdKTtcbiAgfVxuXG4gIHZhciBtYXhFZGdlUGVyVmV0ZXggPSAwO1xuXG4gIGZvciAoaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBvZmZzZXQgPSBkYXRhQXJyYXkubGVuZ3RoO1xuICAgIHZhciBkZXN0cyA9IG5vZGVEaWN0W2ldO1xuICAgIHZhciBsZW4gPSBkZXN0cy5sZW5ndGg7XG4gICAgZGF0YUFycmF5W2kgKiA0ICsgMl0gPSBvZmZzZXQ7XG4gICAgZGF0YUFycmF5W2kgKiA0ICsgM10gPSBkZXN0cy5sZW5ndGg7XG4gICAgbWF4RWRnZVBlclZldGV4ID0gTWF0aC5tYXgobWF4RWRnZVBlclZldGV4LCBkZXN0cy5sZW5ndGgpO1xuXG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBsZW47ICsraikge1xuICAgICAgdmFyIGRlc3QgPSBkZXN0c1tqXTtcbiAgICAgIGRhdGFBcnJheS5wdXNoKCtkZXN0KTtcbiAgICB9XG4gIH1cblxuICB3aGlsZSAoZGF0YUFycmF5Lmxlbmd0aCAlIDQgIT09IDApIHtcbiAgICBkYXRhQXJyYXkucHVzaCgwKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgYXJyYXk6IG5ldyBGbG9hdDMyQXJyYXkoZGF0YUFycmF5KSxcbiAgICBtYXhFZGdlUGVyVmV0ZXg6IG1heEVkZ2VQZXJWZXRleFxuICB9O1xufTtcbi8qKlxuICog5bCG6IqC54K55ZKM6L655pWw5o2u6L2s5o2i5Li6IEdQVSDlj6/or7vnmoTmlbDnu4TvvIzmr4/mnaHovrnluKbmnInkuIDkuKrlsZ7mgKfjgILlubbov5Tlm54gbWF4RWRnZVBlclZldGV477yM5q+P5Liq6IqC54K55LiK5pyA5aSa55qE6L655pWwXG4gKiBAcGFyYW0gIHtOb2RlQ29uZmlnW119ICBub2RlcyDoioLngrnmlbDnu4RcbiAqIEBwYXJhbSAge0VkZ2VDb25maWdbXX0gIGVkZ2VzIOi+ueaVsOe7hFxuICogQHBhcmFtICB7RnVuY3Rpb259ICBhdHRycyDor7vlj5bovrnlsZ7mgKfnmoTlh73mlbBcbiAqIEByZXR1cm4ge09iamVjdH0g6L2s5o2i5ZCO55qE5pWw57uE5Y+KIG1heEVkZ2VQZXJWZXRleCDnu4TmiJDnmoTlr7nosaFcbiAqL1xuXG5leHBvcnQgdmFyIGJ1aWxkVGV4dHVyZURhdGFXaXRoT25lRWRnZUF0dHIgPSBmdW5jdGlvbiBidWlsZFRleHR1cmVEYXRhV2l0aE9uZUVkZ2VBdHRyKG5vZGVzLCBlZGdlcywgYXR0cnMpIHtcbiAgdmFyIGRhdGFBcnJheSA9IFtdO1xuICB2YXIgbm9kZURpY3QgPSBbXTtcbiAgdmFyIG1hcElkUG9zID0ge307XG4gIHZhciBpID0gMDtcblxuICBmb3IgKGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgbiA9IG5vZGVzW2ldO1xuICAgIG1hcElkUG9zW24uaWRdID0gaTtcbiAgICBkYXRhQXJyYXkucHVzaChuLngpO1xuICAgIGRhdGFBcnJheS5wdXNoKG4ueSk7XG4gICAgZGF0YUFycmF5LnB1c2goMCk7XG4gICAgZGF0YUFycmF5LnB1c2goMCk7XG4gICAgbm9kZURpY3QucHVzaChbXSk7XG4gIH1cblxuICBmb3IgKGkgPSAwOyBpIDwgZWRnZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZSA9IGVkZ2VzW2ldO1xuICAgIG5vZGVEaWN0W21hcElkUG9zW2Uuc291cmNlXV0ucHVzaChtYXBJZFBvc1tlLnRhcmdldF0pO1xuICAgIG5vZGVEaWN0W21hcElkUG9zW2Uuc291cmNlXV0ucHVzaChhdHRycyhlKSk7IC8vIOeQhuaDs+i+uemVv++8jOWQjue7reWPr+S7peaUueaIkOavj+adoei+ueS4jeWQjFxuXG4gICAgbm9kZURpY3RbbWFwSWRQb3NbZS50YXJnZXRdXS5wdXNoKG1hcElkUG9zW2Uuc291cmNlXSk7XG4gICAgbm9kZURpY3RbbWFwSWRQb3NbZS50YXJnZXRdXS5wdXNoKGF0dHJzKGUpKTsgLy8g55CG5oOz6L656ZW/77yM5ZCO57ut5Y+v5Lul5pS55oiQ5q+P5p2h6L655LiN5ZCMXG4gIH1cblxuICB2YXIgbWF4RWRnZVBlclZldGV4ID0gMDtcblxuICBmb3IgKGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgb2Zmc2V0ID0gZGF0YUFycmF5Lmxlbmd0aDtcbiAgICB2YXIgZGVzdHMgPSBub2RlRGljdFtpXTsgLy8gZGVzdCDkuK3oioLngrkgaWQg5LiO6L656ZW/6Ze06ZqU5a2Y5YKo77yM5Y2z5LiA5L2N6IqC54K5IGlk77yM5LiA5L2N6L656ZW/4oCm4oCmXG5cbiAgICB2YXIgbGVuID0gZGVzdHMubGVuZ3RoO1xuICAgIGRhdGFBcnJheVtpICogNCArIDJdID0gb2Zmc2V0O1xuICAgIGRhdGFBcnJheVtpICogNCArIDNdID0gbGVuIC8gMjsgLy8g56ys5Zub5L2N5a2Y5YKo5LiO6K+l6IqC54K555u45YWz55qE5omA5pyJ6IqC54K55Liq5pWwXG5cbiAgICBtYXhFZGdlUGVyVmV0ZXggPSBNYXRoLm1heChtYXhFZGdlUGVyVmV0ZXgsIGxlbiAvIDIpO1xuXG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBsZW47ICsraikge1xuICAgICAgdmFyIGRlc3QgPSBkZXN0c1tqXTtcbiAgICAgIGRhdGFBcnJheS5wdXNoKCtkZXN0KTtcbiAgICB9XG4gIH0gLy8g5LiN5pivIDQg55qE5YCN5pWw77yM5aGr5YWFIDBcblxuXG4gIHdoaWxlIChkYXRhQXJyYXkubGVuZ3RoICUgNCAhPT0gMCkge1xuICAgIGRhdGFBcnJheS5wdXNoKDApO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBhcnJheTogbmV3IEZsb2F0MzJBcnJheShkYXRhQXJyYXkpLFxuICAgIG1heEVkZ2VQZXJWZXRleDogbWF4RWRnZVBlclZldGV4XG4gIH07XG59O1xuLyoqXG4gKiDlsIboioLngrnlkozovrnmlbDmja7ovazmjaLkuLogR1BVIOWPr+ivu+eahOaVsOe7hO+8jOavj+adoei+ueW4puacieS4gOS4quS7peS4iuWxnuaAp+OAguW5tui/lOWbniBtYXhFZGdlUGVyVmV0ZXjvvIzmr4/kuKroioLngrnkuIrmnIDlpJrnmoTovrnmlbBcbiAqIEBwYXJhbSAge05vZGVDb25maWdbXX0gIG5vZGVzIOiKgueCueaVsOe7hFxuICogQHBhcmFtICB7RWRnZUNvbmZpZ1tdfSAgZWRnZXMg6L655pWw57uEXG4gKiBAcGFyYW0gIHtGdW5jdGlvbn0gIGF0dHJzIOivu+WPlui+ueWxnuaAp+eahOWHveaVsFxuICogQHJldHVybiB7T2JqZWN0fSDovazmjaLlkI7nmoTmlbDnu4Tlj4ogbWF4RWRnZVBlclZldGV4IOe7hOaIkOeahOWvueixoVxuICovXG5cbmV4cG9ydCB2YXIgYnVpbGRUZXh0dXJlRGF0YVdpdGhUd29FZGdlQXR0ciA9IGZ1bmN0aW9uIGJ1aWxkVGV4dHVyZURhdGFXaXRoVHdvRWRnZUF0dHIobm9kZXMsIGVkZ2VzLCBhdHRyczEsIGF0dHJzMikge1xuICB2YXIgZGF0YUFycmF5ID0gW107XG4gIHZhciBub2RlRGljdCA9IFtdO1xuICB2YXIgbWFwSWRQb3MgPSB7fTtcbiAgdmFyIGkgPSAwO1xuXG4gIGZvciAoaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBuID0gbm9kZXNbaV07XG4gICAgbWFwSWRQb3Nbbi5pZF0gPSBpO1xuICAgIGRhdGFBcnJheS5wdXNoKG4ueCk7XG4gICAgZGF0YUFycmF5LnB1c2gobi55KTtcbiAgICBkYXRhQXJyYXkucHVzaCgwKTtcbiAgICBkYXRhQXJyYXkucHVzaCgwKTtcbiAgICBub2RlRGljdC5wdXNoKFtdKTtcbiAgfVxuXG4gIGZvciAoaSA9IDA7IGkgPCBlZGdlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBlID0gZWRnZXNbaV07XG4gICAgbm9kZURpY3RbbWFwSWRQb3NbZS5zb3VyY2VdXS5wdXNoKG1hcElkUG9zW2UudGFyZ2V0XSk7XG4gICAgbm9kZURpY3RbbWFwSWRQb3NbZS5zb3VyY2VdXS5wdXNoKGF0dHJzMShlKSk7XG4gICAgbm9kZURpY3RbbWFwSWRQb3NbZS5zb3VyY2VdXS5wdXNoKGF0dHJzMihlKSk7XG4gICAgbm9kZURpY3RbbWFwSWRQb3NbZS5zb3VyY2VdXS5wdXNoKDApO1xuICAgIG5vZGVEaWN0W21hcElkUG9zW2UudGFyZ2V0XV0ucHVzaChtYXBJZFBvc1tlLnNvdXJjZV0pO1xuICAgIG5vZGVEaWN0W21hcElkUG9zW2UudGFyZ2V0XV0ucHVzaChhdHRyczEoZSkpO1xuICAgIG5vZGVEaWN0W21hcElkUG9zW2UudGFyZ2V0XV0ucHVzaChhdHRyczIoZSkpO1xuICAgIG5vZGVEaWN0W21hcElkUG9zW2UudGFyZ2V0XV0ucHVzaCgwKTtcbiAgfVxuXG4gIHZhciBtYXhFZGdlUGVyVmV0ZXggPSAwO1xuXG4gIGZvciAoaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBvZmZzZXQgPSBkYXRhQXJyYXkubGVuZ3RoO1xuICAgIHZhciBkZXN0cyA9IG5vZGVEaWN0W2ldOyAvLyBkZXN0IOS4reiKgueCuSBpZCDkuI7ovrnplb/pl7TpmpTlrZjlgqjvvIzljbPkuIDkvY3oioLngrkgaWTvvIzkuIDkvY3ovrnplb/igKbigKZcblxuICAgIHZhciBsZW4gPSBkZXN0cy5sZW5ndGg7IC8vIGRhdGFBcnJheVtpICogNCArIDJdID0gb2Zmc2V0O1xuICAgIC8vIGRhdGFBcnJheVtpICogNCArIDNdID0gbGVuIC8gNDsgLy8g56ys5Zub5L2N5a2Y5YKo5LiO6K+l6IqC54K555u45YWz55qE5omA5pyJ6IqC54K55Liq5pWwXG4gICAgLy8gcGFjayBvZmZzZXQgJiBsZW5ndGggaW50byBmbG9hdDMyOiBvZmZzZXQgMjBiaXQsIGxlbmd0aCAxMmJpdFxuXG4gICAgZGF0YUFycmF5W2kgKiA0ICsgMl0gPSBvZmZzZXQgKyAxMDQ4NTc2ICogbGVuIC8gNDtcbiAgICBkYXRhQXJyYXlbaSAqIDQgKyAzXSA9IDA7IC8vIOesrOWbm+S9jeWtmOWCqOS4juS4iuS4gOasoeeahOi3neemu+W3ruWAvFxuXG4gICAgbWF4RWRnZVBlclZldGV4ID0gTWF0aC5tYXgobWF4RWRnZVBlclZldGV4LCBsZW4gLyA0KTtcblxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgbGVuOyArK2opIHtcbiAgICAgIHZhciBkZXN0ID0gZGVzdHNbal07XG4gICAgICBkYXRhQXJyYXkucHVzaCgrZGVzdCk7XG4gICAgfVxuICB9IC8vIOS4jeaYryA0IOeahOWAjeaVsO+8jOWhq+WFhSAwXG5cblxuICB3aGlsZSAoZGF0YUFycmF5Lmxlbmd0aCAlIDQgIT09IDApIHtcbiAgICBkYXRhQXJyYXkucHVzaCgwKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgYXJyYXk6IG5ldyBGbG9hdDMyQXJyYXkoZGF0YUFycmF5KSxcbiAgICBtYXhFZGdlUGVyVmV0ZXg6IG1heEVkZ2VQZXJWZXRleFxuICB9O1xufTtcbi8qKlxuICogdHJhbnNmb3JtIHRoZSBleHRlbmRlZCBhdHRyaWJ1dGVzIG9mIG5vZGVzIG9yIGVkZ2VzIHRvIGEgdGV4dHVyZSBhcnJheVxuICogQHBhcmFtICB7c3RyaW5nW119ICBhdHRyaWJ1dGVOYW1lcyBhdHRyaWJ1dGVzJyBuYW1lIHRvIGJlIHJlYWQgZnJvbSBpdGVtcyBhbmQgcHV0IGludG8gb3V0cHV0IGFycmF5XG4gKiBAcGFyYW0gIHtNb2RlbENvbmZpZ1tdfSAgaXRlbXMgdGhlIGl0ZW1zIHRvIGJlIHJlYWRcbiAqIEByZXR1cm4ge0Zsb2F0MzJBcnJheX0gdGhlIGF0dHJpYnV0ZXMnIHZhbHVlIGFycmF5IHRvIGJlIHJlYWQgYnkgR1BVXG4gKi9cblxuZXhwb3J0IHZhciBhdHRyaWJ1dGVzVG9UZXh0dXJlRGF0YSA9IGZ1bmN0aW9uIGF0dHJpYnV0ZXNUb1RleHR1cmVEYXRhKGF0dHJpYnV0ZU5hbWVzLCBpdGVtcykge1xuICB2YXIgZGF0YUFycmF5ID0gW107XG4gIHZhciBhdHRyaWJ1dGVOdW0gPSBhdHRyaWJ1dGVOYW1lcy5sZW5ndGg7XG4gIHZhciBhdHRyaWJ1dHRlU3RyaW5nTWFwID0ge307XG4gIGl0ZW1zLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICBhdHRyaWJ1dGVOYW1lcy5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lLCBpKSB7XG4gICAgICBpZiAoYXR0cmlidXR0ZVN0cmluZ01hcFtpdGVtW25hbWVdXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGF0dHJpYnV0dGVTdHJpbmdNYXBbaXRlbVtuYW1lXV0gPSBPYmplY3Qua2V5cyhhdHRyaWJ1dHRlU3RyaW5nTWFwKS5sZW5ndGg7XG4gICAgICB9XG5cbiAgICAgIGRhdGFBcnJheS5wdXNoKGF0dHJpYnV0dGVTdHJpbmdNYXBbaXRlbVtuYW1lXV0pOyAvLyBpbnN1cmUgZWFjaCBub2RlJ3MgYXR0cmlidXRlcyB0YWtlIGludGVyIG51bWJlciBvZiBncmlkc1xuXG4gICAgICBpZiAoaSA9PT0gYXR0cmlidXRlTnVtIC0gMSkge1xuICAgICAgICB3aGlsZSAoZGF0YUFycmF5Lmxlbmd0aCAlIDQgIT09IDApIHtcbiAgICAgICAgICBkYXRhQXJyYXkucHVzaCgwKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbiAgcmV0dXJuIHtcbiAgICBhcnJheTogbmV3IEZsb2F0MzJBcnJheShkYXRhQXJyYXkpLFxuICAgIGNvdW50OiBPYmplY3Qua2V5cyhhdHRyaWJ1dHRlU3RyaW5nTWFwKS5sZW5ndGhcbiAgfTtcbn07XG4vKipcbiAqIHRyYW5zZm9ybSB0aGUgbnVtYmVyIGFycmF5IGZvcm1hdCBvZiBleHRlbmRlZCBhdHRyaWJ1dGVzIG9mIG5vZGVzIG9yIGVkZ2VzIHRvIGEgdGV4dHVyZSBhcnJheVxuICogQHBhcmFtICB7c3RyaW5nW119ICBhdHRyaWJ1dGVOYW1lcyBhdHRyaWJ1dGVzJyBuYW1lIHRvIGJlIHJlYWQgZnJvbSBpdGVtcyBhbmQgcHV0IGludG8gb3V0cHV0IGFycmF5XG4gKiBAcmV0dXJuIHtGbG9hdDMyQXJyYXl9IHRoZSBhdHRyaWJ1dGVzJyB2YWx1ZSBhcnJheSB0byBiZSByZWFkIGJ5IEdQVVxuICovXG5cbmV4cG9ydCB2YXIgYXJyYXlUb1RleHR1cmVEYXRhID0gZnVuY3Rpb24gYXJyYXlUb1RleHR1cmVEYXRhKHZhbHVlQXJyYXlzKSB7XG4gIHZhciBkYXRhQXJyYXkgPSBbXTtcbiAgdmFyIGF0dHJpYnV0ZU51bSA9IHZhbHVlQXJyYXlzLmxlbmd0aDtcbiAgdmFyIGl0ZW1OdW0gPSB2YWx1ZUFycmF5c1swXS5sZW5ndGg7XG5cbiAgdmFyIF9sb29wXzEgPSBmdW5jdGlvbiBfbG9vcF8xKGopIHtcbiAgICB2YWx1ZUFycmF5cy5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZUFycmF5LCBpKSB7XG4gICAgICBkYXRhQXJyYXkucHVzaCh2YWx1ZUFycmF5W2pdKTsgLy8gaW5zdXJlIGVhY2ggbm9kZSdzIGF0dHJpYnV0ZXMgdGFrZSBpbnRlciBudW1iZXIgb2YgZ3JpZHNcblxuICAgICAgaWYgKGkgPT09IGF0dHJpYnV0ZU51bSAtIDEpIHtcbiAgICAgICAgd2hpbGUgKGRhdGFBcnJheS5sZW5ndGggJSA0ICE9PSAwKSB7XG4gICAgICAgICAgZGF0YUFycmF5LnB1c2goMCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICBmb3IgKHZhciBqID0gMDsgaiA8IGl0ZW1OdW07IGorKykge1xuICAgIF9sb29wXzEoaik7XG4gIH1cblxuICByZXR1cm4gbmV3IEZsb2F0MzJBcnJheShkYXRhQXJyYXkpO1xufTtcbi8qKlxuICpcbiAqIEBwYXJhbSBkYXRhIFRyZWUgZ3JhcGggZGF0YVxuICogQHBhcmFtIGxheW91dFxuICovXG5cbmV4cG9ydCB2YXIgcmFkaWFsTGF5b3V0ID0gZnVuY3Rpb24gcmFkaWFsTGF5b3V0KGRhdGEsIGxheW91dCkge1xuICAvLyDluIPlsYDmlrnlvI/mnIkgSCAvIFYgLyBMUiAvIFJMIC8gVEIgLyBCVFxuICB2YXIgVkVSVElDQUxfTEFZT1VUUyA9IFsnVicsICdUQicsICdCVCddO1xuICB2YXIgbWluID0ge1xuICAgIHg6IEluZmluaXR5LFxuICAgIHk6IEluZmluaXR5XG4gIH07XG4gIHZhciBtYXggPSB7XG4gICAgeDogLUluZmluaXR5LFxuICAgIHk6IC1JbmZpbml0eVxuICB9OyAvLyDpu5jorqTluIPlsYDmmK/lnoLnm7TluIPlsYBUQu+8jOatpOaXtnjlr7nlupRyYWTvvIx55a+55bqUclxuXG4gIHZhciByU2NhbGUgPSAneCc7XG4gIHZhciByYWRTY2FsZSA9ICd5JztcblxuICBpZiAobGF5b3V0ICYmIFZFUlRJQ0FMX0xBWU9VVFMuaW5kZXhPZihsYXlvdXQpID49IDApIHtcbiAgICAvLyDoi6XmmK/msLTlubPluIPlsYDvvIx55a+55bqUcmFk77yMeOWvueW6lHJcbiAgICByYWRTY2FsZSA9ICd4JztcbiAgICByU2NhbGUgPSAneSc7XG4gIH1cblxuICB2YXIgY291bnQgPSAwO1xuICB0cmF2ZXJzZVRyZWUoZGF0YSwgZnVuY3Rpb24gKG5vZGUpIHtcbiAgICBjb3VudCsrO1xuXG4gICAgaWYgKG5vZGUueCA+IG1heC54KSB7XG4gICAgICBtYXgueCA9IG5vZGUueDtcbiAgICB9XG5cbiAgICBpZiAobm9kZS54IDwgbWluLngpIHtcbiAgICAgIG1pbi54ID0gbm9kZS54O1xuICAgIH1cblxuICAgIGlmIChub2RlLnkgPiBtYXgueSkge1xuICAgICAgbWF4LnkgPSBub2RlLnk7XG4gICAgfVxuXG4gICAgaWYgKG5vZGUueSA8IG1pbi55KSB7XG4gICAgICBtaW4ueSA9IG5vZGUueTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSk7XG4gIHZhciBhdmdSYWQgPSBNYXRoLlBJICogMiAvIGNvdW50O1xuICB2YXIgcmFkRGlmZiA9IG1heFtyYWRTY2FsZV0gLSBtaW5bcmFkU2NhbGVdO1xuXG4gIGlmIChyYWREaWZmID09PSAwKSB7XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICB0cmF2ZXJzZVRyZWUoZGF0YSwgZnVuY3Rpb24gKG5vZGUpIHtcbiAgICB2YXIgcmFkaWFsID0gKG5vZGVbcmFkU2NhbGVdIC0gbWluW3JhZFNjYWxlXSkgLyByYWREaWZmICogKE1hdGguUEkgKiAyIC0gYXZnUmFkKSArIGF2Z1JhZDtcbiAgICB2YXIgciA9IE1hdGguYWJzKHJTY2FsZSA9PT0gJ3gnID8gbm9kZS54IC0gZGF0YS54IDogbm9kZS55IC0gZGF0YS55KTtcbiAgICBub2RlLnggPSByICogTWF0aC5jb3MocmFkaWFsKTtcbiAgICBub2RlLnkgPSByICogTWF0aC5zaW4ocmFkaWFsKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSk7XG4gIHJldHVybiBkYXRhO1xufTsiLCIvKipcbiAqIOiwg+eUqCBncHVEZXRlY3Rvci53ZWJnbCDliKTmlq3lvZPliY3mtY/op4jlmajmmK/lkKbmlK/mjIEgd2ViZ2zjgILvvIjmlK/mjIEgZ3BncHUg55qE5rWP6KeI5Zmo5LiA5a6a5Lmf5pSv5oyBIHdlYmds77yJXG4gKi9cbmV4cG9ydCB2YXIgZ3B1RGV0ZWN0b3IgPSBmdW5jdGlvbiBncHVEZXRlY3RvcigpIHtcbiAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybiB7fTtcbiAgcmV0dXJuIHtcbiAgICBjYW52YXM6ICEhd2luZG93LkNhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCxcbiAgICB3ZWJnbDogZnVuY3Rpb24gKCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmFyIGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgICAgICByZXR1cm4gISEod2luZG93LldlYkdMUmVuZGVyaW5nQ29udGV4dCAmJiAoY2FudmFzLmdldENvbnRleHQoJ3dlYmdsJykgfHwgY2FudmFzLmdldENvbnRleHQoJ2V4cGVyaW1lbnRhbC13ZWJnbCcpKSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9KCksXG4gICAgd29ya2VyczogISF3aW5kb3cuV29ya2VyLFxuICAgIGZpbGVhcGk6IHdpbmRvdy5GaWxlICYmIHdpbmRvdy5GaWxlUmVhZGVyICYmIHdpbmRvdy5GaWxlTGlzdCAmJiB3aW5kb3cuQmxvYixcbiAgICBnZXRXZWJHTEVycm9yTWVzc2FnZTogZnVuY3Rpb24gZ2V0V2ViR0xFcnJvck1lc3NhZ2UoKSB7XG4gICAgICB2YXIgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgZWxlbWVudC5pZCA9ICd3ZWJnbC1lcnJvci1tZXNzYWdlJztcbiAgICAgIGVsZW1lbnQuc3R5bGUuZm9udEZhbWlseSA9ICdtb25vc3BhY2UnO1xuICAgICAgZWxlbWVudC5zdHlsZS5mb250U2l6ZSA9ICcxM3B4JztcbiAgICAgIGVsZW1lbnQuc3R5bGUuZm9udFdlaWdodCA9ICdub3JtYWwnO1xuICAgICAgZWxlbWVudC5zdHlsZS50ZXh0QWxpZ24gPSAnY2VudGVyJztcbiAgICAgIGVsZW1lbnQuc3R5bGUuYmFja2dyb3VuZCA9ICcjZmZmJztcbiAgICAgIGVsZW1lbnQuc3R5bGUuY29sb3IgPSAnIzAwMCc7XG4gICAgICBlbGVtZW50LnN0eWxlLnBhZGRpbmcgPSAnMS41ZW0nO1xuICAgICAgZWxlbWVudC5zdHlsZS53aWR0aCA9ICc0MDBweCc7XG4gICAgICBlbGVtZW50LnN0eWxlLm1hcmdpbiA9ICc1ZW0gYXV0byAwJztcblxuICAgICAgaWYgKCF0aGlzLndlYmdsKSB7XG4gICAgICAgIGVsZW1lbnQuaW5uZXJIVE1MID0gd2luZG93LldlYkdMUmVuZGVyaW5nQ29udGV4dCA/IFsnWW91ciBncmFwaGljcyBjYXJkIGRvZXMgbm90IHNlZW0gdG8gc3VwcG9ydCA8YSBocmVmPVwiaHR0cDovL2tocm9ub3Mub3JnL3dlYmdsL3dpa2kvR2V0dGluZ19hX1dlYkdMX0ltcGxlbWVudGF0aW9uXCIgcmVsPVwiZXh0ZXJuYWwgbm9mb2xsb3dcIiByZWw9XCJleHRlcm5hbCBub2ZvbGxvd1wiIHN0eWxlPVwiY29sb3I6IzAwMFwiPldlYkdMPC9hPi48YnIgLz4nLCAnRmluZCBvdXQgaG93IHRvIGdldCBpdCA8YSBocmVmPVwiaHR0cDovL2dldC53ZWJnbC5vcmcvXCIgcmVsPVwiZXh0ZXJuYWwgbm9mb2xsb3dcIiByZWw9XCJleHRlcm5hbCBub2ZvbGxvd1wiIHN0eWxlPVwiY29sb3I6IzAwMFwiPmhlcmU8L2E+LiddLmpvaW4oJ1xcbicpIDogWydZb3VyIGJyb3dzZXIgZG9lcyBub3Qgc2VlbSB0byBzdXBwb3J0IDxhIGhyZWY9XCJodHRwOi8va2hyb25vcy5vcmcvd2ViZ2wvd2lraS9HZXR0aW5nX2FfV2ViR0xfSW1wbGVtZW50YXRpb25cIiByZWw9XCJleHRlcm5hbCBub2ZvbGxvd1wiIHJlbD1cImV4dGVybmFsIG5vZm9sbG93XCIgc3R5bGU9XCJjb2xvcjojMDAwXCI+V2ViR0w8L2E+Ljxici8+JywgJ0ZpbmQgb3V0IGhvdyB0byBnZXQgaXQgPGEgaHJlZj1cImh0dHA6Ly9nZXQud2ViZ2wub3JnL1wiIHJlbD1cImV4dGVybmFsIG5vZm9sbG93XCIgcmVsPVwiZXh0ZXJuYWwgbm9mb2xsb3dcIiBzdHlsZT1cImNvbG9yOiMwMDBcIj5oZXJlPC9hPi4nXS5qb2luKCdcXG4nKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgfSxcbiAgICBhZGRHZXRXZWJHTE1lc3NhZ2U6IGZ1bmN0aW9uIGFkZEdldFdlYkdMTWVzc2FnZShwYXJhbWV0ZXJzKSB7XG4gICAgICBwYXJhbWV0ZXJzID0gcGFyYW1ldGVycyB8fCB7fTtcbiAgICAgIHZhciBwYXJlbnQgPSBwYXJhbWV0ZXJzLnBhcmVudCAhPT0gdW5kZWZpbmVkID8gcGFyYW1ldGVycy5wYXJlbnQgOiBkb2N1bWVudC5ib2R5O1xuICAgICAgdmFyIGlkID0gcGFyYW1ldGVycy5pZCAhPT0gdW5kZWZpbmVkID8gcGFyYW1ldGVycy5pZCA6ICdvbGRpZSc7XG4gICAgICB2YXIgZWxlbWVudCA9IGdwdURldGVjdG9yKCkuZ2V0V2ViR0xFcnJvck1lc3NhZ2UoKTtcbiAgICAgIGVsZW1lbnQuaWQgPSBpZDtcbiAgICAgIHBhcmVudC5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICB9XG4gIH07XG59OyIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgKiBhcyBDb2xvclV0aWwgZnJvbSAnLi9jb2xvcic7XG5pbXBvcnQgKiBhcyBMYXlvdXRVdGlsIGZyb20gJy4vbGF5b3V0JztcbmltcG9ydCAqIGFzIEdwdVV0aWwgZnJvbSAnLi9ncHUnO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJ0BhbnR2L2c2LWNvcmUnO1xuXG52YXIgRzZVdGlsID0gX19hc3NpZ24oX19hc3NpZ24oX19hc3NpZ24oX19hc3NpZ24oe30sIFV0aWwpLCBDb2xvclV0aWwpLCBMYXlvdXRVdGlsKSwgR3B1VXRpbCk7XG5cbmV4cG9ydCBkZWZhdWx0IEc2VXRpbDsiLCJpbXBvcnQgSGllcmFyY2h5IGZyb20gJ0BhbnR2L2hpZXJhcmNoeSc7XG5pbXBvcnQgVXRpbCBmcm9tICcuLi91dGlsJztcbnZhciByYWRpYWxMYXlvdXQgPSBVdGlsLnJhZGlhbExheW91dDtcblxudmFyIFRyZWVMYXlvdXQgPVxuLyoqIEBjbGFzcyAqL1xuZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBUcmVlTGF5b3V0KGNmZykge1xuICAgIHRoaXMudHlwZSA9IGNmZy50eXBlO1xuICAgIHRoaXMucmFkaWFsID0gY2ZnLnJhZGlhbDtcbiAgICB0aGlzLmNvbmZpZyA9IGNmZztcbiAgfVxuXG4gIFRyZWVMYXlvdXQucHJvdG90eXBlLmluaXQgPSBmdW5jdGlvbiAoZGF0YSkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICB0aGlzLmRhdGEgPSBkYXRhO1xuXG4gICAgaWYgKHRoaXMucmFkaWFsKSB7XG4gICAgICB0aGlzLmxheW91dE1ldGhvZCA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIHZhciBsYXlvdXREYXRhID0gSGllcmFyY2h5W190aGlzLnR5cGVdKGRhdGEsIF90aGlzLmNvbmZpZyk7XG5cbiAgICAgICAgcmFkaWFsTGF5b3V0KGxheW91dERhdGEpO1xuICAgICAgICByZXR1cm4gbGF5b3V0RGF0YTtcbiAgICAgIH07XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmxheW91dE1ldGhvZCA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICByZXR1cm4gSGllcmFyY2h5W190aGlzLnR5cGVdKGRhdGEsIF90aGlzLmNvbmZpZyk7XG4gICAgfTtcbiAgfTtcblxuICBUcmVlTGF5b3V0LnByb3RvdHlwZS5leGVjdXRlID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLmxheW91dE1ldGhvZCh0aGlzLmRhdGEsIHRoaXMuY29uZmlnKTtcbiAgfTtcblxuICBUcmVlTGF5b3V0LnByb3RvdHlwZS5sYXlvdXQgPSBmdW5jdGlvbiAoZGF0YSkge1xuICAgIHRoaXMuaW5pdChkYXRhKTtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKCk7XG4gIH07XG5cbiAgcmV0dXJuIFRyZWVMYXlvdXQ7XG59KCk7XG5cbmV4cG9ydCBkZWZhdWx0IFRyZWVMYXlvdXQ7IiwiaW1wb3J0IHsgTGF5b3V0cyBhcyBMYXlvdXQsIHJlZ2lzdGVyTGF5b3V0IGFzIG9SZWdpc3RlckxheW91dCwgR3JpZExheW91dCwgUmFuZG9tTGF5b3V0LCBGb3JjZUxheW91dCwgQ2lyY3VsYXJMYXlvdXQsIERhZ3JlTGF5b3V0LCBSYWRpYWxMYXlvdXQsIENvbmNlbnRyaWNMYXlvdXQsIE1EU0xheW91dCwgRnJ1Y2h0ZXJtYW5HUFVMYXlvdXQsIEZydWNodGVybWFuTGF5b3V0LCBHRm9yY2VMYXlvdXQsIEdGb3JjZUdQVUxheW91dCwgQ29tYm9Gb3JjZUxheW91dCwgRm9yY2VBdGxhczJMYXlvdXQgfSBmcm9tICdAYW50di9sYXlvdXQnO1xuaW1wb3J0IFRyZWVMYXlvdXQgZnJvbSAnLi90cmVlLWxheW91dCc7XG5vUmVnaXN0ZXJMYXlvdXQoJ2dyaWQnLCBHcmlkTGF5b3V0KTtcbm9SZWdpc3RlckxheW91dCgncmFuZG9tJywgUmFuZG9tTGF5b3V0KTtcbm9SZWdpc3RlckxheW91dCgnZm9yY2UnLCBGb3JjZUxheW91dCk7XG5vUmVnaXN0ZXJMYXlvdXQoJ2NpcmN1bGFyJywgQ2lyY3VsYXJMYXlvdXQpO1xub1JlZ2lzdGVyTGF5b3V0KCdkYWdyZScsIERhZ3JlTGF5b3V0KTtcbm9SZWdpc3RlckxheW91dCgncmFkaWFsJywgUmFkaWFsTGF5b3V0KTtcbm9SZWdpc3RlckxheW91dCgnY29uY2VudHJpYycsIENvbmNlbnRyaWNMYXlvdXQpO1xub1JlZ2lzdGVyTGF5b3V0KCdtZHMnLCBNRFNMYXlvdXQpO1xub1JlZ2lzdGVyTGF5b3V0KCdmcnVjaHRlcm1hbicsIEZydWNodGVybWFuTGF5b3V0KTtcbm9SZWdpc3RlckxheW91dCgnZnJ1Y2h0ZXJtYW4tZ3B1JywgRnJ1Y2h0ZXJtYW5HUFVMYXlvdXQpO1xub1JlZ2lzdGVyTGF5b3V0KCdnRm9yY2UnLCBHRm9yY2VMYXlvdXQpO1xub1JlZ2lzdGVyTGF5b3V0KCdnRm9yY2UtZ3B1JywgR0ZvcmNlR1BVTGF5b3V0KTtcbm9SZWdpc3RlckxheW91dCgnY29tYm9Gb3JjZScsIENvbWJvRm9yY2VMYXlvdXQpO1xub1JlZ2lzdGVyTGF5b3V0KCdmb3JjZUF0bGFzMicsIEZvcmNlQXRsYXMyTGF5b3V0KTtcblxudmFyIHJlZ2lzdGVyTGF5b3V0ID0gZnVuY3Rpb24gcmVnaXN0ZXJMYXlvdXQobmFtZSwgbGF5b3V0T3ZlcnJpZGUpIHtcbiAgbGF5b3V0T3ZlcnJpZGUuaXNDdXN0b21MYXlvdXQgPSB0cnVlO1xuICBMYXlvdXRbbmFtZV0gPSBvUmVnaXN0ZXJMYXlvdXQobmFtZSwgbGF5b3V0T3ZlcnJpZGUpO1xufTtcblxuZXhwb3J0IHsgVHJlZUxheW91dCwgTGF5b3V0LCByZWdpc3RlckxheW91dCB9OyIsInZhciBXZWJXb3JrZXIgPVxuLyoqIEBjbGFzcyAqL1xuZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBXZWJXb3JrZXIod29ya2VyLCB3b3JrZXJTY2lycHRVUkwpIHtcbiAgICB2YXIgY29kZSA9IHdvcmtlci50b1N0cmluZygpO1xuICAgIHZhciBibG9iID0gbmV3IEJsb2IoW1wiaW1wb3J0U2NyaXB0cygnXCIgKyB3b3JrZXJTY2lycHRVUkwgKyBcIicpOyhcIiArIGNvZGUgKyBcIikoKVwiXSwge1xuICAgICAgdHlwZTogJ3RleHQvamF2YXNjcmlwdCdcbiAgICB9KTtcbiAgICByZXR1cm4gbmV3IFdvcmtlcihVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpKTtcbiAgfVxuXG4gIHJldHVybiBXZWJXb3JrZXI7XG59KCk7XG5cbmV4cG9ydCBkZWZhdWx0IFdlYldvcmtlcjsiLCJpbXBvcnQgV2ViV29ya2VyIGZyb20gJy4vd29yayc7XG5leHBvcnQgdmFyIExheW91dFdvcmtlciA9IGZ1bmN0aW9uIExheW91dFdvcmtlcih3b3JrZXJTY3JpcHRVUkwpIHtcbiAgaWYgKHdvcmtlclNjcmlwdFVSTCA9PT0gdm9pZCAwKSB7XG4gICAgd29ya2VyU2NyaXB0VVJMID0gJ2h0dHBzOi8vdW5wa2cuY29tL0BhbnR2L2xheW91dEBsYXRlc3QvZGlzdC9sYXlvdXQubWluLmpzJztcbiAgfVxuXG4gIGZ1bmN0aW9uIHdvcmtlckNvZGUoKSB7XG4gICAgdmFyIExBWU9VVF9NRVNTQUdFID0ge1xuICAgICAgLy8gcnVuIGxheW91dFxuICAgICAgUlVOOiAnTEFZT1VUX1JVTicsXG4gICAgICAvLyBsYXlvdXQgZW5kZWQgd2l0aCBzdWNjZXNzXG4gICAgICBFTkQ6ICdMQVlPVVRfRU5EJyxcbiAgICAgIC8vIGxheW91dCBlcnJvclxuICAgICAgRVJST1I6ICdMQVlPVVRfRVJST1InLFxuICAgICAgLy8gbGF5b3V0IHRpY2ssIHVzZWQgaW4gZm9yY2UgZGlyZWN0ZWQgbGF5b3V0XG4gICAgICBUSUNLOiAnTEFZT1VUX1RJQ0snLFxuICAgICAgR1BVUlVOOiAnR1BVX0xBWU9VVF9SVU4nLFxuICAgICAgR1BVRU5EOiAnR1BVX0xBWU9VVF9FTkQnXG4gICAgfTsgLy8gQHRzLWlnbm9yZVxuXG4gICAgbGF5b3V0LnJlZ2lzdGVyTGF5b3V0KCdncmlkJywgbGF5b3V0LkdyaWRMYXlvdXQpOyAvLyBAdHMtaWdub3JlXG5cbiAgICBsYXlvdXQucmVnaXN0ZXJMYXlvdXQoJ3JhbmRvbScsIGxheW91dC5SYW5kb21MYXlvdXQpOyAvLyBAdHMtaWdub3JlXG5cbiAgICBsYXlvdXQucmVnaXN0ZXJMYXlvdXQoJ2ZvcmNlJywgbGF5b3V0LkZvcmNlTGF5b3V0KTsgLy8gQHRzLWlnbm9yZVxuXG4gICAgbGF5b3V0LnJlZ2lzdGVyTGF5b3V0KCdjaXJjdWxhcicsIGxheW91dC5DaXJjdWxhckxheW91dCk7IC8vIEB0cy1pZ25vcmVcblxuICAgIGxheW91dC5yZWdpc3RlckxheW91dCgnZGFncmUnLCBsYXlvdXQuRGFncmVMYXlvdXQpOyAvLyBAdHMtaWdub3JlXG5cbiAgICBsYXlvdXQucmVnaXN0ZXJMYXlvdXQoJ3JhZGlhbCcsIGxheW91dC5SYWRpYWxMYXlvdXQpOyAvLyBAdHMtaWdub3JlXG5cbiAgICBsYXlvdXQucmVnaXN0ZXJMYXlvdXQoJ2NvbmNlbnRyaWMnLCBsYXlvdXQuQ29uY2VudHJpY0xheW91dCk7IC8vIEB0cy1pZ25vcmVcblxuICAgIGxheW91dC5yZWdpc3RlckxheW91dCgnbWRzJywgbGF5b3V0Lk1EU0xheW91dCk7IC8vIEB0cy1pZ25vcmVcblxuICAgIGxheW91dC5yZWdpc3RlckxheW91dCgnZnJ1Y2h0ZXJtYW4nLCBsYXlvdXQuRnJ1Y2h0ZXJtYW5MYXlvdXQpOyAvLyBAdHMtaWdub3JlXG5cbiAgICBsYXlvdXQucmVnaXN0ZXJMYXlvdXQoJ2ZydWNodGVybWFuLWdwdScsIGxheW91dC5GcnVjaHRlcm1hbkdQVUxheW91dCk7IC8vIEB0cy1pZ25vcmVcblxuICAgIGxheW91dC5yZWdpc3RlckxheW91dCgnZ0ZvcmNlJywgbGF5b3V0LkdGb3JjZUxheW91dCk7IC8vIEB0cy1pZ25vcmVcblxuICAgIGxheW91dC5yZWdpc3RlckxheW91dCgnZ0ZvcmNlLWdwdScsIGxheW91dC5HRm9yY2VHUFVMYXlvdXQpOyAvLyBAdHMtaWdub3JlXG5cbiAgICBsYXlvdXQucmVnaXN0ZXJMYXlvdXQoJ2NvbWJvRm9yY2UnLCBsYXlvdXQuQ29tYm9Gb3JjZUxheW91dCk7IC8vIEB0cy1pZ25vcmVcblxuICAgIGxheW91dC5yZWdpc3RlckxheW91dCgnZm9yY2VBdGxhczInLCBsYXlvdXQuRm9yY2VBdGxhczJMYXlvdXQpO1xuXG4gICAgZnVuY3Rpb24gaXNMYXlvdXRNZXNzYWdlKGV2ZW50KSB7XG4gICAgICB2YXIgdHlwZSA9IGV2ZW50LmRhdGEudHlwZTtcbiAgICAgIHJldHVybiB0eXBlID09PSBMQVlPVVRfTUVTU0FHRS5SVU4gfHwgdHlwZSA9PT0gTEFZT1VUX01FU1NBR0UuR1BVUlVOO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGhhbmRsZUxheW91dE1lc3NhZ2UoZXZlbnQpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIHZhciB0eXBlID0gZXZlbnQuZGF0YS50eXBlO1xuXG4gICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgY2FzZSBMQVlPVVRfTUVTU0FHRS5SVU46XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFyIF9hID0gZXZlbnQuZGF0YSxcbiAgICAgICAgICAgICAgICBub2Rlc18xID0gX2Eubm9kZXMsXG4gICAgICAgICAgICAgICAgZWRnZXMgPSBfYS5lZGdlcyxcbiAgICAgICAgICAgICAgICBfYiA9IF9hLmxheW91dENmZyxcbiAgICAgICAgICAgICAgICBsYXlvdXRDZmcgPSBfYiA9PT0gdm9pZCAwID8ge30gOiBfYjtcbiAgICAgICAgICAgIHZhciBsYXlvdXRUeXBlID0gbGF5b3V0Q2ZnLnR5cGU7IC8vIEB0cy1pZ25vcmVcblxuICAgICAgICAgICAgdmFyIExheW91dENsYXNzID0gbGF5b3V0LmdldExheW91dEJ5TmFtZShsYXlvdXRUeXBlKTtcblxuICAgICAgICAgICAgaWYgKCFMYXlvdXRDbGFzcykge1xuICAgICAgICAgICAgICB0aGlzLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgICAgICB0eXBlOiBMQVlPVVRfTUVTU0FHRS5FUlJPUixcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBcImxheW91dCBcIiArIGxheW91dFR5cGUgKyBcIiBub3QgZm91bmRcIlxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBsYXlvdXRNZXRob2RfMTtcblxuICAgICAgICAgICAgbGF5b3V0Q2ZnLm9uTGF5b3V0RW5kID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICBfdGhpcy5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAgICAgdHlwZTogTEFZT1VUX01FU1NBR0UuRU5ELFxuICAgICAgICAgICAgICAgIG5vZGVzOiBub2Rlc18xXG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgIGxheW91dE1ldGhvZF8xID09PSBudWxsIHx8IGxheW91dE1ldGhvZF8xID09PSB2b2lkIDAgPyB2b2lkIDAgOiBsYXlvdXRNZXRob2RfMS5kZXN0cm95KCk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBsYXlvdXRNZXRob2RfMSA9IG5ldyBMYXlvdXRDbGFzcyhsYXlvdXRDZmcpO1xuICAgICAgICAgICAgbGF5b3V0TWV0aG9kXzEuaW5pdCh7XG4gICAgICAgICAgICAgIG5vZGVzOiBub2Rlc18xLFxuICAgICAgICAgICAgICBlZGdlczogZWRnZXNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbGF5b3V0TWV0aG9kXzEuZXhlY3V0ZSgpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgTEFZT1VUX01FU1NBR0UuR1BVUlVOOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciBfYyA9IGV2ZW50LmRhdGEsXG4gICAgICAgICAgICAgICAgbm9kZXMgPSBfYy5ub2RlcyxcbiAgICAgICAgICAgICAgICBlZGdlcyA9IF9jLmVkZ2VzLFxuICAgICAgICAgICAgICAgIF9kID0gX2MubGF5b3V0Q2ZnLFxuICAgICAgICAgICAgICAgIGxheW91dENmZyA9IF9kID09PSB2b2lkIDAgPyB7fSA6IF9kLFxuICAgICAgICAgICAgICAgIGNhbnZhcyA9IF9jLmNhbnZhcztcbiAgICAgICAgICAgIHZhciBsYXlvdXRUeXBlID0gbGF5b3V0Q2ZnLnR5cGU7IC8vIEB0cy1pZ25vcmVcblxuICAgICAgICAgICAgdmFyIExheW91dENsYXNzID0gbGF5b3V0LmdldExheW91dEJ5TmFtZShsYXlvdXRUeXBlKTtcblxuICAgICAgICAgICAgaWYgKCFMYXlvdXRDbGFzcykge1xuICAgICAgICAgICAgICB0aGlzLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgICAgICB0eXBlOiBMQVlPVVRfTUVTU0FHRS5FUlJPUixcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBcImxheW91dCBcIiArIGxheW91dFR5cGUgKyBcIiBub3QgZm91bmRcIlxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChsYXlvdXRUeXBlLnNwbGl0KCctJylbMV0gIT09ICdncHUnKSB7XG4gICAgICAgICAgICAgIHRoaXMucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgICAgIHR5cGU6IExBWU9VVF9NRVNTQUdFLkVSUk9SLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IFwibGF5b3V0IFwiICsgbGF5b3V0VHlwZSArIFwiIGRvZXMgbm90IHN1cHBvcnQgR1BVXCJcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgbGF5b3V0TWV0aG9kID0gbmV3IExheW91dENsYXNzKGxheW91dENmZyk7XG4gICAgICAgICAgICBsYXlvdXRNZXRob2QuaW5pdCh7XG4gICAgICAgICAgICAgIG5vZGVzOiBub2RlcyxcbiAgICAgICAgICAgICAgZWRnZXM6IGVkZ2VzXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGxheW91dE1ldGhvZC5leGVjdXRlV2l0aFdvcmtlcihjYW52YXMsIHRoaXMpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgb25tZXNzYWdlID0gZnVuY3Rpb24gb25tZXNzYWdlKGV2ZW50KSB7XG4gICAgICBpZiAoaXNMYXlvdXRNZXNzYWdlKGV2ZW50KSkge1xuICAgICAgICBoYW5kbGVMYXlvdXRNZXNzYWdlKGV2ZW50KTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgdmFyIGxheW91dFdvcmtlciA9IG5ldyBXZWJXb3JrZXIod29ya2VyQ29kZSwgd29ya2VyU2NyaXB0VVJMKTtcbiAgcmV0dXJuIGxheW91dFdvcmtlcjtcbn07IiwiLyoqXG4gKiBAZmlsZW92ZXJ2aWV3IGNvbnN0YW50cyBmb3IgbGF5b3V0XG4gKiBAYXV0aG9yIGNoYW5nemhlLnpiQGFudGZpbi5jb21cbiAqL1xuXG4vKiogbGF5b3V0IG1lc3NhZ2UgdHlwZSAqL1xuZXhwb3J0IHZhciBMQVlPVVRfTUVTU0FHRSA9IHtcbiAgLy8gcnVuIGxheW91dFxuICBSVU46ICdMQVlPVVRfUlVOJyxcbiAgLy8gbGF5b3V0IGVuZGVkIHdpdGggc3VjY2Vzc1xuICBFTkQ6ICdMQVlPVVRfRU5EJyxcbiAgLy8gbGF5b3V0IGVycm9yXG4gIEVSUk9SOiAnTEFZT1VUX0VSUk9SJyxcbiAgLy8gbGF5b3V0IHRpY2ssIHVzZWQgaW4gZm9yY2UgZGlyZWN0ZWQgbGF5b3V0XG4gIFRJQ0s6ICdMQVlPVVRfVElDSycsXG4gIEdQVVJVTjogJ0dQVV9MQVlPVVRfUlVOJyxcbiAgR1BVRU5EOiAnR1BVX0xBWU9VVF9FTkQnXG59OyIsImZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiKSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfTsgfSBlbHNlIHsgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9OyB9IHJldHVybiBfdHlwZW9mKG9iaik7IH1cblxuaW1wb3J0IHsgX19hd2FpdGVyLCBfX2V4dGVuZHMsIF9fZ2VuZXJhdG9yIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBBYnN0cmFjdExheW91dCB9IGZyb20gJ0BhbnR2L2c2LWNvcmUnO1xuaW1wb3J0IHsgTGF5b3V0IH0gZnJvbSAnLi4vLi4vbGF5b3V0JztcbmltcG9ydCB7IExheW91dFdvcmtlciB9IGZyb20gJy4uLy4uL2xheW91dC93b3JrZXIvbGF5b3V0Lndvcmtlcic7XG5pbXBvcnQgeyBMQVlPVVRfTUVTU0FHRSB9IGZyb20gJy4uLy4uL2xheW91dC93b3JrZXIvbGF5b3V0Q29uc3QnO1xuaW1wb3J0IHsgZ3B1RGV0ZWN0b3IgfSBmcm9tICcuLi8uLi91dGlsL2dwdSc7XG5pbXBvcnQgeyBtaXgsIGNsb25lIH0gZnJvbSAnQGFudHYvdXRpbCc7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8taW1wbGllZC1ldmFsXG5cbnZhciBtb2NrUmFmID0gZnVuY3Rpb24gbW9ja1JhZihjYikge1xuICByZXR1cm4gc2V0VGltZW91dChjYiwgMTYpO1xufTtcblxudmFyIG1vY2tDYWYgPSBmdW5jdGlvbiBtb2NrQ2FmKHJlcUlkKSB7XG4gIHJldHVybiBjbGVhclRpbWVvdXQocmVxSWQpO1xufTtcblxudmFyIGhlbHBlciA9IHtcbiAgLy8gcG9sbHlmaWxsXG4gIHJlcXVlc3RBbmltYXRpb25GcmFtZTogZnVuY3Rpb24gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGNhbGxiYWNrKSB7XG4gICAgdmFyIGZuID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8IHdpbmRvdy53ZWJraXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHwgbW9ja1JhZiA6IG1vY2tSYWY7XG4gICAgcmV0dXJuIGZuKGNhbGxiYWNrKTtcbiAgfSxcbiAgY2FuY2VsQW5pbWF0aW9uRnJhbWU6IGZ1bmN0aW9uIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHJlcXVlc3RJZCkge1xuICAgIHZhciBmbiA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lIHx8IHdpbmRvdy53ZWJraXRDYW5jZWxBbmltYXRpb25GcmFtZSB8fCBtb2NrQ2FmIDogbW9ja0NhZjtcbiAgICByZXR1cm4gZm4ocmVxdWVzdElkKTtcbiAgfVxufTtcbnZhciBHUFVfTEFZT1VUX05BTUVTID0gWydmcnVjaHRlcm1hbicsICdnRm9yY2UnXTtcbnZhciBMQVlPVVRfUElQRVNfQURKVVNUX05BTUVTID0gWydmb3JjZScsICdncmlkJywgJ2NpcmN1bGFyJ107XG5cbnZhciBMYXlvdXRDb250cm9sbGVyID1cbi8qKiBAY2xhc3MgKi9cbmZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgX19leHRlbmRzKExheW91dENvbnRyb2xsZXIsIF9zdXBlcik7IC8vIHRoZSBjb25maWd1cmF0aW9ucyBvZiB0aGUgbGF5b3V0XG4gIC8vIHByaXZhdGUgbGF5b3V0Q2ZnOiBhbnk7IC8vIExheW91dE9wdGlvbnNcbiAgLy8gdGhlIHR5cGUgbmFtZSBvZiB0aGUgbGF5b3V0XG4gIC8vIHByaXZhdGUgbGF5b3V0VHlwZTogc3RyaW5nO1xuICAvLyBwcml2YXRlIGRhdGE6IEdyYXBoRGF0YTtcbiAgLy8gcHJpdmF0ZSBsYXlvdXRNZXRob2RzOiB0eXBlb2YgTGF5b3V0O1xuXG5cbiAgZnVuY3Rpb24gTGF5b3V0Q29udHJvbGxlcihncmFwaCkge1xuICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIGdyYXBoKSB8fCB0aGlzO1xuXG4gICAgX3RoaXMuZ3JhcGggPSBncmFwaDtcbiAgICBfdGhpcy5sYXlvdXRDZmcgPSBncmFwaC5nZXQoJ2xheW91dCcpIHx8IHt9O1xuICAgIF90aGlzLmxheW91dFR5cGUgPSBfdGhpcy5nZXRMYXlvdXRUeXBlKCk7XG4gICAgX3RoaXMud29ya2VyID0gbnVsbDtcbiAgICBfdGhpcy53b3JrZXJEYXRhID0ge307XG5cbiAgICBfdGhpcy5pbml0TGF5b3V0KCk7XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNsYXNzLW1ldGhvZHMtdXNlLXRoaXNcblxuXG4gIExheW91dENvbnRyb2xsZXIucHJvdG90eXBlLmluaXRMYXlvdXQgPSBmdW5jdGlvbiAoKSB7Ly8gbm8gZGF0YSBiZWZvcmUgcmVuZGVyaW5nXG4gIH07IC8vIGdldCBsYXlvdXQgd29ya2VyIGFuZCBjcmVhdGUgb25lIGlmIG5vdCBleGlzdHNcblxuXG4gIExheW91dENvbnRyb2xsZXIucHJvdG90eXBlLmdldFdvcmtlciA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodGhpcy53b3JrZXIpIHtcbiAgICAgIHJldHVybiB0aGlzLndvcmtlcjtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIFdvcmtlciA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIC8vIOWmguaenOW9k+WJjea1j+iniOWZqOS4jeaUr+aMgSB3ZWIgd29ya2Vy77yM5YiZ5LiN5L2/55SoIHdlYiB3b3JrZXJcbiAgICAgIGNvbnNvbGUud2FybignV2ViIHdvcmtlciBpcyBub3Qgc3VwcG9ydGVkIGluIGN1cnJlbnQgYnJvd3Nlci4nKTtcbiAgICAgIHRoaXMud29ya2VyID0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy53b3JrZXIgPSBMYXlvdXRXb3JrZXIodGhpcy5sYXlvdXRDZmcud29ya2VyU2NyaXB0VVJMKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy53b3JrZXI7XG4gIH07IC8vIHN0b3AgbGF5b3V0IHdvcmtlclxuXG5cbiAgTGF5b3V0Q29udHJvbGxlci5wcm90b3R5cGUuc3RvcFdvcmtlciA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgd29ya2VyRGF0YSA9IHRoaXMud29ya2VyRGF0YTtcblxuICAgIGlmICghdGhpcy53b3JrZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLndvcmtlci50ZXJtaW5hdGUoKTtcbiAgICB0aGlzLndvcmtlciA9IG51bGw7IC8vIOmHjeaWsOW8gOWni+aWsOeahOW4g+WxgOS5i+WJje+8jOWFiOWPlua2iOS5i+WJjeW4g+WxgOeahHJlcXVlc3RBbmltYXRpb25GcmFtZeOAglxuXG4gICAgaWYgKHdvcmtlckRhdGEucmVxdWVzdElkKSB7XG4gICAgICBoZWxwZXIuY2FuY2VsQW5pbWF0aW9uRnJhbWUod29ya2VyRGF0YS5yZXF1ZXN0SWQpO1xuICAgICAgd29ya2VyRGF0YS5yZXF1ZXN0SWQgPSBudWxsO1xuICAgIH1cblxuICAgIGlmICh3b3JrZXJEYXRhLnJlcXVlc3RJZDIpIHtcbiAgICAgIGhlbHBlci5jYW5jZWxBbmltYXRpb25GcmFtZSh3b3JrZXJEYXRhLnJlcXVlc3RJZDIpO1xuICAgICAgd29ya2VyRGF0YS5yZXF1ZXN0SWQyID0gbnVsbDtcbiAgICB9XG4gIH07XG5cbiAgTGF5b3V0Q29udHJvbGxlci5wcm90b3R5cGUuZXhlY0xheW91dE1ldGhvZCA9IGZ1bmN0aW9uIChsYXlvdXRDZmcsIG9yZGVyKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzbG92ZSwgcmVqZWN0KSB7XG4gICAgICByZXR1cm4gX19hd2FpdGVyKF90aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZ3JhcGgsIGxheW91dFR5cGUsIGlzRm9yY2UsIG9uVGlja18xLCB0aWNrLCBlbmFibGVUaWNrLCBsYXlvdXRNZXRob2QsIG9uVGlja18yLCB0aWNrLCBsYXlvdXREYXRhO1xuICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICBncmFwaCA9IHRoaXMuZ3JhcGg7XG4gICAgICAgICAgICAgIGlmICghZ3JhcGggfHwgZ3JhcGguZ2V0KCdkZXN0cm95ZWQnKSkgcmV0dXJuIFsyXG4gICAgICAgICAgICAgIC8qcmV0dXJuKi9cbiAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgbGF5b3V0VHlwZSA9IGxheW91dENmZy50eXBlOyAvLyDmr4/kuKrluIPlsYDmlrnms5Xpg73pnIDopoHms6jlhoxcblxuICAgICAgICAgICAgICBsYXlvdXRDZmcub25MYXlvdXRFbmQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgZ3JhcGguZW1pdCgnYWZ0ZXJzdWJsYXlvdXQnLCB7XG4gICAgICAgICAgICAgICAgICB0eXBlOiBsYXlvdXRUeXBlXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmVzbG92ZSgpO1xuICAgICAgICAgICAgICB9OyAvLyDoi6XnlKjmiLfmjIflrprlvIDlkK8gZ3B177yM5LiU5b2T5YmN5rWP6KeI5Zmo5pSv5oyBIHdlYmds77yM5LiU6K+l566X5rOV5a2Y5ZyoIEdQVSDniYjmnKzvvIjnm67liY3ku4XmlK/mjIEgZnJ1Y2h0ZXJtYW4g5ZKMIGdGb3JjZe+8ie+8jOS9v+eUqCBncHUg54mI5pys55qE5biD5bGAXG5cblxuICAgICAgICAgICAgICBpZiAobGF5b3V0VHlwZSAmJiB0aGlzLmlzR1BVKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmhhc0dQVVZlcnNpb24obGF5b3V0VHlwZSkpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcIlRoZSAnXCIgKyBsYXlvdXRUeXBlICsgXCInIGxheW91dCBkb2VzIG5vdCBzdXBwb3J0IEdQVSBjYWxjdWxhdGlvbiBmb3Igbm93LCBpdCB3aWxsIHJ1biBpbiBDUFUuXCIpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBsYXlvdXRUeXBlID0gbGF5b3V0VHlwZSArIFwiLWdwdVwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGlzRm9yY2UgPSBsYXlvdXRUeXBlID09PSAnZm9yY2UnIHx8IGxheW91dFR5cGUgPT09ICdnNmZvcmNlJyB8fCBsYXlvdXRUeXBlID09PSAnZ0ZvcmNlJztcblxuICAgICAgICAgICAgICBpZiAoaXNGb3JjZSkge1xuICAgICAgICAgICAgICAgIG9uVGlja18xID0gbGF5b3V0Q2ZnLm9uVGljaztcblxuICAgICAgICAgICAgICAgIHRpY2sgPSBmdW5jdGlvbiB0aWNrKCkge1xuICAgICAgICAgICAgICAgICAgaWYgKG9uVGlja18xKSB7XG4gICAgICAgICAgICAgICAgICAgIG9uVGlja18xKCk7XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIGdyYXBoLnJlZnJlc2hQb3NpdGlvbnMoKTtcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgbGF5b3V0Q2ZnLnRpY2sgPSB0aWNrO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxheW91dENmZy50eXBlID09PSAnY29tYm9Gb3JjZScpIHtcbiAgICAgICAgICAgICAgICBsYXlvdXRDZmcuY29tYm9UcmVlcyA9IGdyYXBoLmdldCgnY29tYm9UcmVlcycpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgZW5hYmxlVGljayA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgbGF5b3V0TWV0aG9kID0gbmV3IExheW91dFtsYXlvdXRUeXBlXShsYXlvdXRDZmcpO1xuICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKFwiVGhlIGxheW91dCBtZXRob2Q6ICdcIiArIGxheW91dFR5cGUgKyBcIicgZG9lcyBub3QgZXhpc3QhIFBsZWFzZSBzcGVjaWZ5IGl0IGZpcnN0LlwiKTtcbiAgICAgICAgICAgICAgICByZWplY3QoKTtcbiAgICAgICAgICAgICAgfSAvLyDmmK/lkKbpnIDopoHov63ku6PnmoTmlrnlvI/lrozmiJDluIPlsYDjgILov5nph4zmmK/mnaXoh6rluIPlsYDlr7nosaHnmoTlrp7kvovlsZ7mgKfvvIzmmK/nlLHluIPlsYDnmoTlrprkuYnogIXlnKjluIPlsYDnsbvlrprkuYnnmoTjgIJcblxuXG4gICAgICAgICAgICAgIGVuYWJsZVRpY2sgPSBsYXlvdXRNZXRob2QuZW5hYmxlVGljaztcblxuICAgICAgICAgICAgICBpZiAoZW5hYmxlVGljaykge1xuICAgICAgICAgICAgICAgIG9uVGlja18yID0gbGF5b3V0Q2ZnLm9uVGljaztcblxuICAgICAgICAgICAgICAgIHRpY2sgPSBmdW5jdGlvbiB0aWNrKCkge1xuICAgICAgICAgICAgICAgICAgaWYgKG9uVGlja18yKSB7XG4gICAgICAgICAgICAgICAgICAgIG9uVGlja18yKCk7XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIGdyYXBoLnJlZnJlc2hQb3NpdGlvbnMoKTtcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgbGF5b3V0TWV0aG9kLnRpY2sgPSB0aWNrO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgbGF5b3V0RGF0YSA9IHRoaXMuZmlsdGVyTGF5b3V0RGF0YSh0aGlzLmRhdGEsIGxheW91dENmZyk7XG4gICAgICAgICAgICAgIGFkZExheW91dE9yZGVyKGxheW91dERhdGEsIG9yZGVyKTtcbiAgICAgICAgICAgICAgbGF5b3V0TWV0aG9kLmluaXQobGF5b3V0RGF0YSk7IC8vIOiLpeWtmOWcqOiKgueCueayoeacieS9jee9ruS/oeaBr++8jOS4lOayoeacieiuvue9riBsYXlvdXTvvIzlnKggaW5pdFBvc2l0aW9ucyDkuK0gcmFuZG9tIOe7meWHuuS6huaJgOacieiKgueCueeahOS9jee9ru+8jOS4jemcgOimgeWGjeasoeaJp+ihjCByYW5kb20g5biD5bGAXG4gICAgICAgICAgICAgIC8vIOaJgOacieiKgueCuemDveacieS9jee9ruS/oeaBr++8jOS4lOaMh+WumuS6hiBsYXlvdXTvvIzliJnmiafooYzluIPlsYDvvIjku6PooajkuI3mmK/nrKzkuIDmrKHov5vooYzluIPlsYDvvIlcblxuICAgICAgICAgICAgICBncmFwaC5lbWl0KCdiZWZvcmVzdWJsYXlvdXQnLCB7XG4gICAgICAgICAgICAgICAgdHlwZTogbGF5b3V0VHlwZVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgcmV0dXJuIFs0XG4gICAgICAgICAgICAgIC8qeWllbGQqL1xuICAgICAgICAgICAgICAsIGxheW91dE1ldGhvZC5leGVjdXRlKCldO1xuXG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgIF9hLnNlbnQoKTtcblxuICAgICAgICAgICAgICBpZiAobGF5b3V0TWV0aG9kLmlzQ3VzdG9tTGF5b3V0ICYmIGxheW91dENmZy5vbkxheW91dEVuZCkgbGF5b3V0Q2ZnLm9uTGF5b3V0RW5kKCk7XG4gICAgICAgICAgICAgIHRoaXMubGF5b3V0TWV0aG9kc1tvcmRlcl0gPSBsYXlvdXRNZXRob2Q7XG4gICAgICAgICAgICAgIHJldHVybiBbMlxuICAgICAgICAgICAgICAvKnJldHVybiovXG4gICAgICAgICAgICAgIF07XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9O1xuXG4gIExheW91dENvbnRyb2xsZXIucHJvdG90eXBlLnVwZGF0ZUxheW91dE1ldGhvZCA9IGZ1bmN0aW9uIChsYXlvdXRNZXRob2QsIGxheW91dENmZykge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc2xvdmUsIHJlamVjdCkge1xuICAgICAgcmV0dXJuIF9fYXdhaXRlcihfdGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGdyYXBoLCBsYXlvdXRUeXBlLCBsYXlvdXREYXRhO1xuICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICBncmFwaCA9IHRoaXMuZ3JhcGg7XG4gICAgICAgICAgICAgIGxheW91dFR5cGUgPSBsYXlvdXRDZmcgPT09IG51bGwgfHwgbGF5b3V0Q2ZnID09PSB2b2lkIDAgPyB2b2lkIDAgOiBsYXlvdXRDZmcudHlwZTsgLy8g5q+P5Liq5biD5bGA5pa55rOV6YO96ZyA6KaB5rOo5YaMXG5cbiAgICAgICAgICAgICAgbGF5b3V0Q2ZnLm9uTGF5b3V0RW5kID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGdyYXBoLmVtaXQoJ2FmdGVyc3VibGF5b3V0Jywge1xuICAgICAgICAgICAgICAgICAgdHlwZTogbGF5b3V0VHlwZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJlc2xvdmUoKTtcbiAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICBsYXlvdXREYXRhID0gdGhpcy5maWx0ZXJMYXlvdXREYXRhKHRoaXMuZGF0YSwgbGF5b3V0Q2ZnKTtcbiAgICAgICAgICAgICAgbGF5b3V0TWV0aG9kLmluaXQobGF5b3V0RGF0YSk7XG4gICAgICAgICAgICAgIGxheW91dE1ldGhvZC51cGRhdGVDZmcobGF5b3V0Q2ZnKTtcbiAgICAgICAgICAgICAgZ3JhcGguZW1pdCgnYmVmb3Jlc3VibGF5b3V0Jywge1xuICAgICAgICAgICAgICAgIHR5cGU6IGxheW91dFR5cGVcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHJldHVybiBbNFxuICAgICAgICAgICAgICAvKnlpZWxkKi9cbiAgICAgICAgICAgICAgLCBsYXlvdXRNZXRob2QuZXhlY3V0ZSgpXTtcblxuICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICBfYS5zZW50KCk7XG5cbiAgICAgICAgICAgICAgaWYgKGxheW91dE1ldGhvZC5pc0N1c3RvbUxheW91dCAmJiBsYXlvdXRDZmcub25MYXlvdXRFbmQpIGxheW91dENmZy5vbkxheW91dEVuZCgpO1xuICAgICAgICAgICAgICByZXR1cm4gWzJcbiAgICAgICAgICAgICAgLypyZXR1cm4qL1xuICAgICAgICAgICAgICBdO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfTtcbiAgLyoqXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IHN1Y2Nlc3MgY2FsbGJhY2tcbiAgICogQHJldHVybiB7Ym9vbGVhbn0g5piv5ZCm5L2/55Sod2ViIHdvcmtlcuW4g+WxgFxuICAgKi9cblxuXG4gIExheW91dENvbnRyb2xsZXIucHJvdG90eXBlLmxheW91dCA9IGZ1bmN0aW9uIChzdWNjZXNzKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHZhciBncmFwaCA9IHRoaXMuZ3JhcGg7XG4gICAgdGhpcy5kYXRhID0gdGhpcy5zZXREYXRhRnJvbUdyYXBoKCk7XG4gICAgdmFyIF9hID0gdGhpcy5kYXRhLFxuICAgICAgICBub2RlcyA9IF9hLm5vZGVzLFxuICAgICAgICBoaWRkZW5Ob2RlcyA9IF9hLmhpZGRlbk5vZGVzO1xuXG4gICAgaWYgKCFub2Rlcykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHZhciB3aWR0aCA9IGdyYXBoLmdldCgnd2lkdGgnKTtcbiAgICB2YXIgaGVpZ2h0ID0gZ3JhcGguZ2V0KCdoZWlnaHQnKTtcbiAgICB2YXIgbGF5b3V0Q2ZnID0ge307XG4gICAgT2JqZWN0LmFzc2lnbihsYXlvdXRDZmcsIHtcbiAgICAgIHdpZHRoOiB3aWR0aCxcbiAgICAgIGhlaWdodDogaGVpZ2h0LFxuICAgICAgY2VudGVyOiBbd2lkdGggLyAyLCBoZWlnaHQgLyAyXVxuICAgIH0sIHRoaXMubGF5b3V0Q2ZnKTtcbiAgICB0aGlzLmxheW91dENmZyA9IGxheW91dENmZztcbiAgICB0aGlzLmRlc3RvcnlMYXlvdXRNZXRob2RzKCk7XG4gICAgZ3JhcGguZW1pdCgnYmVmb3JlbGF5b3V0Jyk7XG4gICAgdGhpcy5pbml0UG9zaXRpb25zKGxheW91dENmZy5jZW50ZXIsIG5vZGVzKTsgLy8gaW5pdCBoaWRkZW4gbm9kZXNcblxuICAgIHRoaXMuaW5pdFBvc2l0aW9ucyhsYXlvdXRDZmcuY2VudGVyLCBoaWRkZW5Ob2Rlcyk7IC8vIOmYsuatoueUqOaIt+ebtOaOpeeUqCAtZ3B1IOe7k+WwvuaMh+WumuW4g+WxgFxuXG4gICAgdmFyIGxheW91dFR5cGUgPSBsYXlvdXRDZmcudHlwZTtcblxuICAgIGlmIChsYXlvdXRUeXBlICYmIGxheW91dFR5cGUuc3BsaXQoJy0nKVsxXSA9PT0gJ2dwdScpIHtcbiAgICAgIGxheW91dFR5cGUgPSBsYXlvdXRUeXBlLnNwbGl0KCctJylbMF07XG4gICAgICBsYXlvdXRDZmcuZ3B1RW5hYmxlZCA9IHRydWU7XG4gICAgfSAvLyDoi6XnlKjmiLfmjIflrprlvIDlkK8gZ3B177yM5LiU5b2T5YmN5rWP6KeI5Zmo5pSv5oyBIHdlYmds77yM5LiU6K+l566X5rOV5a2Y5ZyoIEdQVSDniYjmnKzvvIjnm67liY3ku4XmlK/mjIEgZnJ1Y2h0ZXJtYW4g5ZKMIGdGb3JjZe+8ie+8jOS9v+eUqCBncHUg54mI5pys55qE5biD5bGAXG5cblxuICAgIHZhciBlbmFibGVHUFUgPSBmYWxzZTtcblxuICAgIGlmIChsYXlvdXRDZmcuZ3B1RW5hYmxlZCkge1xuICAgICAgZW5hYmxlR1BVID0gdHJ1ZTsgLy8g5omT5byA5LiL6Z2i6K+t5Y+l5bCG5Lya5a+86Ie0IHdlYndvcmtlciDmiqXmib7kuI3liLAgd2luZG93XG5cbiAgICAgIGlmICghZ3B1RGV0ZWN0b3IoKS53ZWJnbCkge1xuICAgICAgICBjb25zb2xlLndhcm4oXCJZb3VyIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCB3ZWJHTCBvciBHUEdQVS4gVGhlIGxheW91dCB3aWxsIHJ1biBpbiBDUFUuXCIpO1xuICAgICAgICBlbmFibGVHUFUgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmlzR1BVID0gZW5hYmxlR1BVOyAvLyDlnKggb25BbGxMYXlvdXRFbmQg5Lit5omn6KGM55So5oi36Ieq5a6a5LmJIG9uTGF5b3V0RW5k77yM6Kem5Y+RIGFmdGVybGF5b3V044CB5pu05paw6IqC54K55L2N572u44CBZml0Vmlldy9maXRDZW50ZXLjgIHop6blj5EgYWZ0ZXJyZW5kZXJcblxuICAgIHZhciBvbkxheW91dEVuZCA9IGxheW91dENmZy5vbkxheW91dEVuZCxcbiAgICAgICAgbGF5b3V0RW5kRm9ybWF0dGVkID0gbGF5b3V0Q2ZnLmxheW91dEVuZEZvcm1hdHRlZCxcbiAgICAgICAgYWRqdXN0ID0gbGF5b3V0Q2ZnLmFkanVzdDtcblxuICAgIGlmICghbGF5b3V0RW5kRm9ybWF0dGVkKSB7XG4gICAgICBsYXlvdXRDZmcubGF5b3V0RW5kRm9ybWF0dGVkID0gdHJ1ZTtcblxuICAgICAgbGF5b3V0Q2ZnLm9uQWxsTGF5b3V0RW5kID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKF90aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgIC8vIOaJp+ihjOeUqOaIt+iHquWumuS5iSBvbkxheW91dEVuZFxuICAgICAgICAgICAgICAgIGlmIChvbkxheW91dEVuZCkge1xuICAgICAgICAgICAgICAgICAgb25MYXlvdXRFbmQoKTtcbiAgICAgICAgICAgICAgICB9IC8vIOabtOaWsOiKgueCueS9jee9rlxuXG5cbiAgICAgICAgICAgICAgICB0aGlzLnJlZnJlc2hMYXlvdXQoKTtcbiAgICAgICAgICAgICAgICBpZiAoIShhZGp1c3QgJiYgbGF5b3V0Q2ZnLnBpcGVzKSkgcmV0dXJuIFszXG4gICAgICAgICAgICAgICAgLypicmVhayovXG4gICAgICAgICAgICAgICAgLCAyXTtcbiAgICAgICAgICAgICAgICByZXR1cm4gWzRcbiAgICAgICAgICAgICAgICAvKnlpZWxkKi9cbiAgICAgICAgICAgICAgICAsIHRoaXMuYWRqdXN0UGlwZXNCb3godGhpcy5kYXRhLCBhZGp1c3QpXTtcblxuICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoTGF5b3V0KCk7XG4gICAgICAgICAgICAgICAgX2EubGFiZWwgPSAyO1xuXG4gICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAvLyDop6blj5EgYWZ0ZXJsYXlvdXRcbiAgICAgICAgICAgICAgICBncmFwaC5lbWl0KCdhZnRlcmxheW91dCcpO1xuICAgICAgICAgICAgICAgIHJldHVybiBbMlxuICAgICAgICAgICAgICAgIC8qcmV0dXJuKi9cbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdGhpcy5zdG9wV29ya2VyKCk7XG5cbiAgICBpZiAobGF5b3V0Q2ZnLndvcmtlckVuYWJsZWQgJiYgdGhpcy5sYXlvdXRXaXRoV29ya2VyKHRoaXMuZGF0YSkpIHtcbiAgICAgIC8vIOWmguaenOWQr+eUqOW4g+WxgHdlYiB3b3JrZXLlubbkuJTmtY/op4jlmajmlK/mjIF3ZWIgd29ya2Vy77yM55Sod2ViIHdvcmtlcuW4g+WxgOOAguWQpuWImeWbnumAgOWIsOS4jeeUqHdlYiB3b3JrZXLluIPlsYDjgIJcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHZhciBzdGFydCA9IFByb21pc2UucmVzb2x2ZSgpO1xuXG4gICAgaWYgKGxheW91dENmZy50eXBlKSB7XG4gICAgICBzdGFydCA9IHN0YXJ0LnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKF90aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgIHJldHVybiBbNFxuICAgICAgICAgICAgICAgIC8qeWllbGQqL1xuICAgICAgICAgICAgICAgICwgdGhpcy5leGVjTGF5b3V0TWV0aG9kKGxheW91dENmZywgMCldO1xuXG4gICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICByZXR1cm4gWzJcbiAgICAgICAgICAgICAgICAvKnJldHVybiovXG4gICAgICAgICAgICAgICAgLCBfYS5zZW50KCldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAobGF5b3V0Q2ZnLnBpcGVzKSB7XG4gICAgICBsYXlvdXRDZmcucGlwZXMuZm9yRWFjaChmdW5jdGlvbiAoY2ZnLCBpbmRleCkge1xuICAgICAgICBzdGFydCA9IHN0YXJ0LnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBfX2F3YWl0ZXIoX3RoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICByZXR1cm4gWzRcbiAgICAgICAgICAgICAgICAgIC8qeWllbGQqL1xuICAgICAgICAgICAgICAgICAgLCB0aGlzLmV4ZWNMYXlvdXRNZXRob2QoY2ZnLCBpbmRleCldO1xuXG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyXG4gICAgICAgICAgICAgICAgICAvKnJldHVybiovXG4gICAgICAgICAgICAgICAgICAsIF9hLnNlbnQoKV07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0gLy8g5pyA5ZCO57uf5LiA5Zyo5aSW6YOo6LCD55Sob25BbGxMYXlvdXRFbmRcblxuXG4gICAgc3RhcnQudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAobGF5b3V0Q2ZnLm9uQWxsTGF5b3V0RW5kKSBsYXlvdXRDZmcub25BbGxMYXlvdXRFbmQoKTsgLy8g5Zyo5omn6KGMIGV4ZWN1dGUg5ZCO56uL5Y2z5omn6KGMIHN1Y2Nlc3PvvIzkuJTlnKggdGltZUJhciDkuK3mnIkgdGhyb3R0bGXvvIzlj6/ku6XpmLLmraIgdGltZUJhciDnm5HlkKwgYWZ0ZXJyZW5kZXIg6L+b6KGMIGNoYW5nZURhdGEg5ZCOIGxheW91dO+8jOS7juiAjOatu+W+queOr1xuICAgICAgLy8g5a+55LqOIGZvcmNlIOS4gOexu+W4g+WxgOWujOaIkOWQjueahCBmaXRWaWV3IOmcgOimgeeUqOaIt+iHquW3seWcqCBvbkxheW91dEVuZCDkuK3phY3nva5cblxuICAgICAgaWYgKHN1Y2Nlc3MpIHN1Y2Nlc3MoKTtcbiAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybignZ3JhcGggbGF5b3V0IGZhaWxlZCwnLCBlcnJvcik7XG4gICAgfSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuICAvKipcbiAgICogbGF5b3V0IHdpdGggd2ViIHdvcmtlclxuICAgKiBAcGFyYW0ge29iamVjdH0gZGF0YSBncmFwaCBkYXRhXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IOaYr+WQpuaUr+aMgXdlYiB3b3JrZXJcbiAgICovXG5cblxuICBMYXlvdXRDb250cm9sbGVyLnByb3RvdHlwZS5sYXlvdXRXaXRoV29ya2VyID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdmFyIF9hID0gdGhpcyxcbiAgICAgICAgbGF5b3V0Q2ZnID0gX2EubGF5b3V0Q2ZnLFxuICAgICAgICBncmFwaCA9IF9hLmdyYXBoO1xuXG4gICAgdmFyIHdvcmtlciA9IHRoaXMuZ2V0V29ya2VyKCk7IC8vIOavj+asoXdvcmtlciBtZXNzYWdlIGV2ZW50IGhhbmRsZXLosIPnlKjkuYvpl7TnmoTlhbHkuqvmlbDmja7vvIzkvJrooqvkv67mlLnjgIJcblxuICAgIHZhciB3b3JrZXJEYXRhID0gdGhpcy53b3JrZXJEYXRhO1xuXG4gICAgaWYgKCF3b3JrZXIpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB3b3JrZXJEYXRhLnJlcXVlc3RJZCA9IG51bGw7XG4gICAgd29ya2VyRGF0YS5yZXF1ZXN0SWQyID0gbnVsbDtcbiAgICB3b3JrZXJEYXRhLmN1cnJlbnRUaWNrID0gbnVsbDtcbiAgICB3b3JrZXJEYXRhLmN1cnJlbnRUaWNrRGF0YSA9IG51bGw7XG4gICAgZ3JhcGguZW1pdCgnYmVmb3JlbGF5b3V0Jyk7XG4gICAgdmFyIHN0YXJ0ID0gUHJvbWlzZS5yZXNvbHZlKCk7XG5cbiAgICBpZiAobGF5b3V0Q2ZnLnR5cGUpIHtcbiAgICAgIHN0YXJ0ID0gc3RhcnQudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfdGhpcy5ydW5XZWJ3b3JrZXIod29ya2VyLCBkYXRhLCBsYXlvdXRDZmcpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChsYXlvdXRDZmcucGlwZXMpIHtcbiAgICAgIHZhciBfbG9vcF8xID0gZnVuY3Rpb24gX2xvb3BfMShjZmcpIHtcbiAgICAgICAgc3RhcnQgPSBzdGFydC50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gX3RoaXMucnVuV2Vid29ya2VyKHdvcmtlciwgZGF0YSwgY2ZnKTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuXG4gICAgICBmb3IgKHZhciBfaSA9IDAsIF9iID0gbGF5b3V0Q2ZnLnBpcGVzOyBfaSA8IF9iLmxlbmd0aDsgX2krKykge1xuICAgICAgICB2YXIgY2ZnID0gX2JbX2ldO1xuXG4gICAgICAgIF9sb29wXzEoY2ZnKTtcbiAgICAgIH1cbiAgICB9IC8vIOacgOWQjue7n+S4gOWcqOWklumDqOiwg+eUqG9uQWxsTGF5b3V0RW5kXG5cblxuICAgIHN0YXJ0LnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKGxheW91dENmZy5vbkFsbExheW91dEVuZCkgbGF5b3V0Q2ZnLm9uQWxsTGF5b3V0RW5kKCk7XG4gICAgfSkuY2F0Y2goZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdsYXlvdXQgZmFpbGVkJywgZXJyb3IpO1xuICAgIH0pO1xuICAgIHJldHVybiB0cnVlO1xuICB9O1xuXG4gIExheW91dENvbnRyb2xsZXIucHJvdG90eXBlLnJ1bldlYndvcmtlciA9IGZ1bmN0aW9uICh3b3JrZXIsIGFsbERhdGEsIGxheW91dENmZykge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICB2YXIgaXNHUFUgPSB0aGlzLmlzR1BVO1xuICAgIHZhciBkYXRhID0gdGhpcy5maWx0ZXJMYXlvdXREYXRhKGFsbERhdGEsIGxheW91dENmZyk7XG4gICAgdmFyIG5vZGVzID0gZGF0YS5ub2RlcyxcbiAgICAgICAgZWRnZXMgPSBkYXRhLmVkZ2VzO1xuICAgIHZhciBvZmZTY3JlZW5DYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICB2YXIgZ3B1V29ya2VyQWJpbGl0eSA9IGlzR1BVICYmIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvZG90LW5vdGF0aW9uXG4gICAgd2luZG93Lm5hdmlnYXRvciAmJiAhbmF2aWdhdG9yW1wiZ3B1XCJdICYmIC8vIFdlYkdQVSDov5jkuI3mlK/mjIEgT2Zmc2NyZWVuQ2FudmFzXG4gICAgJ09mZnNjcmVlbkNhbnZhcycgaW4gd2luZG93ICYmICd0cmFuc2ZlckNvbnRyb2xUb09mZnNjcmVlbicgaW4gb2ZmU2NyZWVuQ2FudmFzOyAvLyBOT1RFOiBwb3N0TWVzc2FnZeeahG1lc3NhZ2Xlj4LmlbDph4zpnaLkuI3og73ljIXlkKvlh73mlbDvvIzlkKbliJlwb3N0TWVzc2FnZeS8muaKpemUme+8jFxuICAgIC8vIOS+i+Wmgu+8midmdW5jdGlvbiBjb3VsZCBub3QgYmUgY2xvbmVkJ+OAglxuICAgIC8vIOivpuaDheWPguiAg++8mmh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9XZWJfV29ya2Vyc19BUEkvU3RydWN0dXJlZF9jbG9uZV9hbGdvcml0aG1cbiAgICAvLyDmiYDku6Xov5nph4zpnIDopoHmiorov4fmu6RsYXlvdXRDZmfph4znmoTlh73mlbDlrZfmrrXov4fmu6TmjonjgIJcblxuICAgIHZhciBmaWx0ZXJlZExheW91dENmZyA9IGZpbHRlck9iamVjdChsYXlvdXRDZmcsIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSAhPT0gJ2Z1bmN0aW9uJztcbiAgICB9KTtcblxuICAgIGlmICghZ3B1V29ya2VyQWJpbGl0eSkge1xuICAgICAgd29ya2VyLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgdHlwZTogTEFZT1VUX01FU1NBR0UuUlVOLFxuICAgICAgICBub2Rlczogbm9kZXMsXG4gICAgICAgIGVkZ2VzOiBlZGdlcyxcbiAgICAgICAgbGF5b3V0Q2ZnOiBmaWx0ZXJlZExheW91dENmZ1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBvZmZzY3JlZW4gPSBvZmZTY3JlZW5DYW52YXMudHJhbnNmZXJDb250cm9sVG9PZmZzY3JlZW4oKTsgLy8gZmlsdGVyZWRMYXlvdXRDZmcuY2FudmFzID0gb2Zmc2NyZWVuO1xuXG4gICAgICBmaWx0ZXJlZExheW91dENmZy50eXBlID0gZmlsdGVyZWRMYXlvdXRDZmcudHlwZSArIFwiLWdwdVwiO1xuICAgICAgd29ya2VyLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgdHlwZTogTEFZT1VUX01FU1NBR0UuR1BVUlVOLFxuICAgICAgICBub2Rlczogbm9kZXMsXG4gICAgICAgIGVkZ2VzOiBlZGdlcyxcbiAgICAgICAgbGF5b3V0Q2ZnOiBmaWx0ZXJlZExheW91dENmZyxcbiAgICAgICAgY2FudmFzOiBvZmZzY3JlZW5cbiAgICAgIH0sIFtvZmZzY3JlZW5dKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc2xvdmUsIHJlamVjdCkge1xuICAgICAgd29ya2VyLm9ubWVzc2FnZSA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICBfdGhpcy5oYW5kbGVXb3JrZXJNZXNzYWdlKHJlc2xvdmUsIHJlamVjdCwgZXZlbnQsIGRhdGEsIGxheW91dENmZyk7XG4gICAgICB9O1xuICAgIH0pO1xuICB9OyAvLyBzdWNjZXNzIGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIHdoZW4gdXBkYXRpbmcgZ3JhcGggcG9zaXRpb25zIGZvciB0aGUgZmlyc3QgdGltZS5cblxuXG4gIExheW91dENvbnRyb2xsZXIucHJvdG90eXBlLmhhbmRsZVdvcmtlck1lc3NhZ2UgPSBmdW5jdGlvbiAocmVzbG92ZSwgcmVqZWN0LCBldmVudCwgZGF0YSwgbGF5b3V0Q2ZnKSB7XG4gICAgdmFyIF9hID0gdGhpcyxcbiAgICAgICAgZ3JhcGggPSBfYS5ncmFwaCxcbiAgICAgICAgd29ya2VyRGF0YSA9IF9hLndvcmtlckRhdGE7XG5cbiAgICB2YXIgZXZlbnREYXRhID0gZXZlbnQuZGF0YTtcbiAgICB2YXIgdHlwZSA9IGV2ZW50RGF0YS50eXBlO1xuXG4gICAgdmFyIG9uVGljayA9IGZ1bmN0aW9uIG9uVGljaygpIHtcbiAgICAgIGlmIChsYXlvdXRDZmcub25UaWNrKSB7XG4gICAgICAgIGxheW91dENmZy5vblRpY2soKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIExBWU9VVF9NRVNTQUdFLlRJQ0s6XG4gICAgICAgIHdvcmtlckRhdGEuY3VycmVudFRpY2sgPSBldmVudERhdGEuY3VycmVudFRpY2s7XG4gICAgICAgIHdvcmtlckRhdGEuY3VycmVudFRpY2tEYXRhID0gZXZlbnREYXRhO1xuXG4gICAgICAgIGlmICghd29ya2VyRGF0YS5yZXF1ZXN0SWQpIHtcbiAgICAgICAgICB3b3JrZXJEYXRhLnJlcXVlc3RJZCA9IGhlbHBlci5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24gcmVxdWVzdElkKCkge1xuICAgICAgICAgICAgdXBkYXRlTGF5b3V0UG9zaXRpb24oZGF0YSwgZXZlbnREYXRhKTtcbiAgICAgICAgICAgIGdyYXBoLnJlZnJlc2hQb3NpdGlvbnMoKTtcbiAgICAgICAgICAgIG9uVGljaygpO1xuXG4gICAgICAgICAgICBpZiAoZXZlbnREYXRhLmN1cnJlbnRUaWNrID09PSBldmVudERhdGEudG90YWxUaWNrcykge1xuICAgICAgICAgICAgICAvLyDlpoLmnpzmmK/mnIDlkI7kuIDmrKF0aWNrXG4gICAgICAgICAgICAgIHJlc2xvdmUoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAod29ya2VyRGF0YS5jdXJyZW50VGljayA9PT0gZXZlbnREYXRhLnRvdGFsVGlja3MpIHtcbiAgICAgICAgICAgICAgLy8g5rOo5oSP6L+Z6YeMd29ya2VyRGF0YS5jdXJyZW50VGlja+WPr+iDveW3sue7j+S4jeWGjeaYr+WJjemdoui1i+WAvOaXtuWAmeeahOWAvOS6hu+8jFxuICAgICAgICAgICAgICAvLyDlm6DkuLrlnKhyZXF1ZXN0QW5pbWF0aW9uRnJhbWXnrYnlvoXml7bpl7Tph4zvvIzlj6/og73kuqfnlJ/mlrDnmoR0aWNr44CCXG4gICAgICAgICAgICAgIC8vIOWmguaenOW9k+WJjXRpY2vkuI3mmK/mnIDlkI7kuIDmrKF0aWNr77yM5bm25LiU5omA5pyJ55qEdGlja+a2iOaBr+mDveW3suWPkeWHuuadpeS6hu+8jOmCo+S5iOmcgOimgeeUqOacgOWQjuS4gOasoXRpY2vnmoTmlbDmja7lho3liLfmlrDkuIDmrKHjgIJcbiAgICAgICAgICAgICAgd29ya2VyRGF0YS5yZXF1ZXN0SWQyID0gaGVscGVyLnJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbiByZXF1ZXN0SWQyKCkge1xuICAgICAgICAgICAgICAgIHVwZGF0ZUxheW91dFBvc2l0aW9uKGRhdGEsIHdvcmtlckRhdGEuY3VycmVudFRpY2tEYXRhKTtcbiAgICAgICAgICAgICAgICBncmFwaC5yZWZyZXNoUG9zaXRpb25zKCk7XG4gICAgICAgICAgICAgICAgd29ya2VyRGF0YS5yZXF1ZXN0SWQyID0gbnVsbDtcbiAgICAgICAgICAgICAgICBvblRpY2soKTtcbiAgICAgICAgICAgICAgICByZXNsb3ZlKCk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB3b3JrZXJEYXRhLnJlcXVlc3RJZCA9IG51bGw7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBMQVlPVVRfTUVTU0FHRS5FTkQ6XG4gICAgICAgIC8vIOWmguaenOayoeaciXRpY2vmtojmga/vvIjpnZ7lipvlr7zluIPlsYDvvIlcbiAgICAgICAgaWYgKHdvcmtlckRhdGEuY3VycmVudFRpY2sgPT0gbnVsbCkge1xuICAgICAgICAgIHVwZGF0ZUxheW91dFBvc2l0aW9uKGRhdGEsIGV2ZW50RGF0YSk7XG4gICAgICAgICAgcmVzbG92ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgTEFZT1VUX01FU1NBR0UuR1BVRU5EOlxuICAgICAgICAvLyDlpoLmnpzmsqHmnIl0aWNr5raI5oGv77yI6Z2e5Yqb5a+85biD5bGA77yJXG4gICAgICAgIGlmICh3b3JrZXJEYXRhLmN1cnJlbnRUaWNrID09IG51bGwpIHtcbiAgICAgICAgICB1cGRhdGVHUFVXb3JrZXJMYXlvdXRQb3NpdGlvbihkYXRhLCBldmVudERhdGEpO1xuICAgICAgICAgIHJlc2xvdmUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIExBWU9VVF9NRVNTQUdFLkVSUk9SOlxuICAgICAgICBjb25zb2xlLndhcm4oJ1dlYi1Xb3JrZXIgbGF5b3V0IGVycm9yIScsIGV2ZW50RGF0YS5tZXNzYWdlKTtcbiAgICAgICAgcmVqZWN0KCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZWplY3QoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9OyAvLyDmm7TmlrDluIPlsYDlj4LmlbBcblxuXG4gIExheW91dENvbnRyb2xsZXIucHJvdG90eXBlLnVwZGF0ZUxheW91dENmZyA9IGZ1bmN0aW9uIChjZmcpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdmFyIF9hID0gdGhpcyxcbiAgICAgICAgZ3JhcGggPSBfYS5ncmFwaCxcbiAgICAgICAgbGF5b3V0TWV0aG9kcyA9IF9hLmxheW91dE1ldGhvZHM7XG5cbiAgICB2YXIgbGF5b3V0Q2ZnID0gbWl4KHt9LCB0aGlzLmxheW91dENmZywgY2ZnKTtcbiAgICB0aGlzLmxheW91dENmZyA9IGxheW91dENmZztcblxuICAgIGlmICghKGxheW91dE1ldGhvZHMgPT09IG51bGwgfHwgbGF5b3V0TWV0aG9kcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogbGF5b3V0TWV0aG9kcy5sZW5ndGgpKSB7XG4gICAgICB0aGlzLmxheW91dCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZGF0YSA9IHRoaXMuc2V0RGF0YUZyb21HcmFwaCgpO1xuICAgIHRoaXMuc3RvcFdvcmtlcigpO1xuXG4gICAgaWYgKGNmZy53b3JrZXJFbmFibGVkICYmIHRoaXMubGF5b3V0V2l0aFdvcmtlcih0aGlzLmRhdGEpKSB7XG4gICAgICAvLyDlpoLmnpzlkK/nlKjluIPlsYB3ZWIgd29ya2Vy5bm25LiU5rWP6KeI5Zmo5pSv5oyBd2ViIHdvcmtlcu+8jOeUqHdlYiB3b3JrZXLluIPlsYDjgILlkKbliJnlm57pgIDliLDkuI3nlKh3ZWIgd29ya2Vy5biD5bGA44CCXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZ3JhcGguZW1pdCgnYmVmb3JlbGF5b3V0Jyk7XG4gICAgdmFyIHN0YXJ0ID0gUHJvbWlzZS5yZXNvbHZlKCk7XG5cbiAgICBpZiAobGF5b3V0TWV0aG9kcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIHN0YXJ0ID0gc3RhcnQudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIoX3RoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFs0XG4gICAgICAgICAgICAgICAgLyp5aWVsZCovXG4gICAgICAgICAgICAgICAgLCB0aGlzLnVwZGF0ZUxheW91dE1ldGhvZChsYXlvdXRNZXRob2RzWzBdLCBsYXlvdXRDZmcpXTtcblxuICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyXG4gICAgICAgICAgICAgICAgLypyZXR1cm4qL1xuICAgICAgICAgICAgICAgICwgX2Euc2VudCgpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGF5b3V0TWV0aG9kcyA9PT0gbnVsbCB8fCBsYXlvdXRNZXRob2RzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBsYXlvdXRNZXRob2RzLmZvckVhY2goZnVuY3Rpb24gKGxheW91dE1ldGhvZCwgaW5kZXgpIHtcbiAgICAgICAgdmFyIGN1cnJlbnRDZmcgPSBsYXlvdXRDZmcucGlwZXNbaW5kZXhdO1xuICAgICAgICBzdGFydCA9IHN0YXJ0LnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBfX2F3YWl0ZXIoX3RoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICByZXR1cm4gWzRcbiAgICAgICAgICAgICAgICAgIC8qeWllbGQqL1xuICAgICAgICAgICAgICAgICAgLCB0aGlzLnVwZGF0ZUxheW91dE1ldGhvZChsYXlvdXRNZXRob2QsIGN1cnJlbnRDZmcpXTtcblxuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgIHJldHVybiBbMlxuICAgICAgICAgICAgICAgICAgLypyZXR1cm4qL1xuICAgICAgICAgICAgICAgICAgLCBfYS5zZW50KCldO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBzdGFydC50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChsYXlvdXRDZmcub25BbGxMYXlvdXRFbmQpIGxheW91dENmZy5vbkFsbExheW91dEVuZCgpO1xuICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKCdsYXlvdXQgZmFpbGVkJywgZXJyb3IpO1xuICAgIH0pO1xuICB9O1xuXG4gIExheW91dENvbnRyb2xsZXIucHJvdG90eXBlLmFkanVzdFBpcGVzQm94ID0gZnVuY3Rpb24gKGRhdGEsIGFkanVzdCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgIHZhciBub2RlcyA9IGRhdGEubm9kZXM7XG5cbiAgICAgIGlmICghKG5vZGVzID09PSBudWxsIHx8IG5vZGVzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBub2Rlcy5sZW5ndGgpKSB7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFMQVlPVVRfUElQRVNfQURKVVNUX05BTUVTLmluY2x1ZGVzKGFkanVzdCkpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFwiVGhlIGFkanVzdCB0eXBlIFwiICsgYWRqdXN0ICsgXCIgaXMgbm90IHN1cHBvcnRlZCB5ZXQsIHBsZWFzZSBhc3NpZ24gaXQgd2l0aCAnZm9yY2UnLCAnZ3JpZCcsIG9yICdjaXJjdWxhcicuXCIpO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9XG5cbiAgICAgIHZhciBsYXlvdXRDZmcgPSB7XG4gICAgICAgIGNlbnRlcjogX3RoaXMubGF5b3V0Q2ZnLmNlbnRlcixcbiAgICAgICAgbm9kZVNpemU6IGZ1bmN0aW9uIG5vZGVTaXplKGQpIHtcbiAgICAgICAgICByZXR1cm4gTWF0aC5tYXgoZC5oZWlnaHQsIGQud2lkdGgpO1xuICAgICAgICB9LFxuICAgICAgICBwcmV2ZW50T3ZlcmxhcDogdHJ1ZSxcbiAgICAgICAgb25MYXlvdXRFbmQ6IGZ1bmN0aW9uIG9uTGF5b3V0RW5kKCkge31cbiAgICAgIH07IC8vIOiuoeeul+WHuuWkp+WNleWFg1xuXG4gICAgICB2YXIgX2EgPSBfdGhpcy5nZXRMYXlvdXRCQm94KG5vZGVzKSxcbiAgICAgICAgICBncm91cE5vZGVzID0gX2EuZ3JvdXBOb2RlcyxcbiAgICAgICAgICBsYXlvdXROb2RlcyA9IF9hLmxheW91dE5vZGVzO1xuXG4gICAgICB2YXIgcHJlTm9kZXMgPSBjbG9uZShsYXlvdXROb2Rlcyk7IC8vIOagueaNruWkp+WNleWFg+WdkOagh+eahOWPmOWMlu+8jOiwg+aVtOi/memHjOmdouavj+S4quWwj+WNleWFg25vZGVzXG5cbiAgICAgIGxheW91dENmZy5vbkxheW91dEVuZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbGF5b3V0Tm9kZXMgPT09IG51bGwgfHwgbGF5b3V0Tm9kZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxheW91dE5vZGVzLmZvckVhY2goZnVuY3Rpb24gKGVsZSwgaW5kZXgpIHtcbiAgICAgICAgICB2YXIgX2EsIF9iLCBfYztcblxuICAgICAgICAgIHZhciBkeCA9IGVsZS54IC0gKChfYSA9IHByZU5vZGVzW2luZGV4XSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLngpO1xuICAgICAgICAgIHZhciBkeSA9IGVsZS55IC0gKChfYiA9IHByZU5vZGVzW2luZGV4XSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLnkpO1xuICAgICAgICAgIChfYyA9IGdyb3VwTm9kZXNbaW5kZXhdKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MuZm9yRWFjaChmdW5jdGlvbiAobikge1xuICAgICAgICAgICAgbi54ICs9IGR4O1xuICAgICAgICAgICAgbi55ICs9IGR5O1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfTtcblxuICAgICAgdmFyIGxheW91dE1ldGhvZCA9IG5ldyBMYXlvdXRbYWRqdXN0XShsYXlvdXRDZmcpO1xuICAgICAgbGF5b3V0TWV0aG9kLmxheW91dCh7XG4gICAgICAgIG5vZGVzOiBsYXlvdXROb2Rlc1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG5cbiAgTGF5b3V0Q29udHJvbGxlci5wcm90b3R5cGUuaGFzR1BVVmVyc2lvbiA9IGZ1bmN0aW9uIChsYXlvdXROYW1lKSB7XG4gICAgcmV0dXJuIEdQVV9MQVlPVVRfTkFNRVMuaW5jbHVkZXMobGF5b3V0TmFtZSk7XG4gIH07XG5cbiAgTGF5b3V0Q29udHJvbGxlci5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmRlc3RvcnlMYXlvdXRNZXRob2RzKCk7XG4gICAgdmFyIHdvcmtlciA9IHRoaXMud29ya2VyO1xuXG4gICAgaWYgKHdvcmtlcikge1xuICAgICAgd29ya2VyLnRlcm1pbmF0ZSgpO1xuICAgICAgdGhpcy53b3JrZXIgPSBudWxsO1xuICAgIH1cblxuICAgIHRoaXMuZGVzdHJveWVkID0gdHJ1ZTtcbiAgICB0aGlzLmdyYXBoLnNldCgnbGF5b3V0JywgdW5kZWZpbmVkKTtcbiAgICB0aGlzLmxheW91dENmZyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmxheW91dFR5cGUgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5sYXlvdXRNZXRob2RzID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuZ3JhcGggPSBudWxsO1xuICB9O1xuXG4gIHJldHVybiBMYXlvdXRDb250cm9sbGVyO1xufShBYnN0cmFjdExheW91dCk7XG5cbmV4cG9ydCBkZWZhdWx0IExheW91dENvbnRyb2xsZXI7XG5cbmZ1bmN0aW9uIHVwZGF0ZUxheW91dFBvc2l0aW9uKGRhdGEsIGxheW91dERhdGEpIHtcbiAgdmFyIG5vZGVzID0gZGF0YS5ub2RlcztcbiAgdmFyIGxheW91dE5vZGVzID0gbGF5b3V0RGF0YS5ub2RlcztcbiAgdmFyIG5vZGVMZW5ndGggPSBub2Rlcy5sZW5ndGg7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlTGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgbm9kZSA9IG5vZGVzW2ldO1xuICAgIG5vZGUueCA9IGxheW91dE5vZGVzW2ldLng7XG4gICAgbm9kZS55ID0gbGF5b3V0Tm9kZXNbaV0ueTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmaWx0ZXJPYmplY3QoY29sbGVjdGlvbiwgY2FsbGJhY2spIHtcbiAgdmFyIHJlc3VsdCA9IHt9O1xuXG4gIGlmIChjb2xsZWN0aW9uICYmIF90eXBlb2YoY29sbGVjdGlvbikgPT09ICdvYmplY3QnKSB7XG4gICAgT2JqZWN0LmtleXMoY29sbGVjdGlvbikuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICBpZiAoY29sbGVjdGlvbi5oYXNPd25Qcm9wZXJ0eShrZXkpICYmIGNhbGxiYWNrKGNvbGxlY3Rpb25ba2V5XSkpIHtcbiAgICAgICAgcmVzdWx0W2tleV0gPSBjb2xsZWN0aW9uW2tleV07XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHJldHVybiBjb2xsZWN0aW9uO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVHUFVXb3JrZXJMYXlvdXRQb3NpdGlvbihkYXRhLCBsYXlvdXREYXRhKSB7XG4gIHZhciBub2RlcyA9IGRhdGEubm9kZXM7XG4gIHZhciB2ZXJ0ZXhFZGdlRGF0YSA9IGxheW91dERhdGEudmVydGV4RWRnZURhdGE7XG4gIHZhciBub2RlTGVuZ3RoID0gbm9kZXMubGVuZ3RoO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZUxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIG5vZGUgPSBub2Rlc1tpXTtcbiAgICB2YXIgeCA9IHZlcnRleEVkZ2VEYXRhWzQgKiBpXTtcbiAgICB2YXIgeSA9IHZlcnRleEVkZ2VEYXRhWzQgKiBpICsgMV07XG4gICAgbm9kZS54ID0geDtcbiAgICBub2RlLnkgPSB5O1xuICB9XG59XG5cbmZ1bmN0aW9uIGFkZExheW91dE9yZGVyKGRhdGEsIG9yZGVyKSB7XG4gIHZhciBfYTtcblxuICBpZiAoISgoX2EgPSBkYXRhID09PSBudWxsIHx8IGRhdGEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRhdGEubm9kZXMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5sZW5ndGgpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIG5vZGVzID0gZGF0YS5ub2RlcztcbiAgbm9kZXMuZm9yRWFjaChmdW5jdGlvbiAobm9kZSkge1xuICAgIG5vZGUubGF5b3V0T3JkZXIgPSBvcmRlcjtcbiAgfSk7XG59IiwiZXhwb3J0IHsgZGVmYXVsdCBhcyBFdmVudENvbnRyb2xsZXIgfSBmcm9tICcuL2V2ZW50JztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgTGF5b3V0Q29udHJvbGxlciB9IGZyb20gJy4vbGF5b3V0JzsiLCJpbXBvcnQgeyBfX2F3YWl0ZXIsIF9fZXh0ZW5kcywgX19nZW5lcmF0b3IgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IENhbnZhcyBhcyBHQ2FudmFzIH0gZnJvbSAnQGFudHYvZy1jYW52YXMnO1xuaW1wb3J0IHsgQ2FudmFzIGFzIEdTVkdDYW52YXMgfSBmcm9tICdAYW50di9nLXN2Zyc7XG5pbXBvcnQgeyBleHQgfSBmcm9tICdAYW50di9tYXRyaXgtdXRpbCc7XG5pbXBvcnQgeyBjbG9uZSwgZGVlcE1peCwgZWFjaCwgaXNTdHJpbmcsIGlzTnVtYmVyIH0gZnJvbSAnQGFudHYvdXRpbCc7XG5pbXBvcnQgeyBBYnN0cmFjdEdyYXBoIH0gZnJvbSAnQGFudHYvZzYtY29yZSc7XG5pbXBvcnQgR2xvYmFsIGZyb20gJy4uL2dsb2JhbCc7XG5pbXBvcnQgeyBMYXlvdXRDb250cm9sbGVyLCBFdmVudENvbnRyb2xsZXIgfSBmcm9tICcuL2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgY3JlYXRlRG9tIH0gZnJvbSAnQGFudHYvZG9tLXV0aWwnO1xudmFyIHRyYW5zZm9ybSA9IGV4dC50cmFuc2Zvcm07XG52YXIgU1ZHID0gJ3N2Zyc7XG5cbnZhciBHcmFwaCA9XG4vKiogQGNsYXNzICovXG5mdW5jdGlvbiAoX3N1cGVyKSB7XG4gIF9fZXh0ZW5kcyhHcmFwaCwgX3N1cGVyKTtcblxuICBmdW5jdGlvbiBHcmFwaChjZmcpIHtcbiAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBjZmcpIHx8IHRoaXM7XG5cbiAgICB2YXIgZGVmYXVsdE5vZGUgPSBfdGhpcy5nZXQoJ2RlZmF1bHROb2RlJyk7XG5cbiAgICBpZiAoIWRlZmF1bHROb2RlKSB7XG4gICAgICBfdGhpcy5zZXQoJ2RlZmF1bHROb2RlJywge1xuICAgICAgICB0eXBlOiAnY2lyY2xlJ1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKCFkZWZhdWx0Tm9kZS50eXBlKSB7XG4gICAgICBkZWZhdWx0Tm9kZS50eXBlID0gJ2NpcmNsZSc7XG5cbiAgICAgIF90aGlzLnNldCgnZGVmYXVsdE5vZGUnLCBkZWZhdWx0Tm9kZSk7XG4gICAgfVxuXG4gICAgX3RoaXMuZGVzdHJveWVkID0gZmFsc2U7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgR3JhcGgucHJvdG90eXBlLmluaXRMYXlvdXRDb250cm9sbGVyID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBsYXlvdXRDb250cm9sbGVyID0gbmV3IExheW91dENvbnRyb2xsZXIodGhpcyk7XG4gICAgdGhpcy5zZXQoe1xuICAgICAgbGF5b3V0Q29udHJvbGxlcjogbGF5b3V0Q29udHJvbGxlclxuICAgIH0pO1xuICB9O1xuXG4gIEdyYXBoLnByb3RvdHlwZS5pbml0RXZlbnRDb250cm9sbGVyID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBldmVudENvbnRyb2xsZXIgPSBuZXcgRXZlbnRDb250cm9sbGVyKHRoaXMpO1xuICAgIHRoaXMuc2V0KHtcbiAgICAgIGV2ZW50Q29udHJvbGxlcjogZXZlbnRDb250cm9sbGVyXG4gICAgfSk7XG4gIH07XG5cbiAgR3JhcGgucHJvdG90eXBlLmluaXRDYW52YXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGNvbnRhaW5lciA9IHRoaXMuZ2V0KCdjb250YWluZXInKTtcblxuICAgIGlmICh0eXBlb2YgY29udGFpbmVyID09PSAnc3RyaW5nJykge1xuICAgICAgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoY29udGFpbmVyKTtcbiAgICAgIHRoaXMuc2V0KCdjb250YWluZXInLCBjb250YWluZXIpO1xuICAgIH1cblxuICAgIGlmICghY29udGFpbmVyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgY29udGFpbmVyJyk7XG4gICAgfVxuXG4gICAgdmFyIGNsaWVudFdpZHRoID0gY29udGFpbmVyLmNsaWVudFdpZHRoLFxuICAgICAgICBjbGllbnRIZWlnaHQgPSBjb250YWluZXIuY2xpZW50SGVpZ2h0O1xuICAgIHZhciB3aWR0aCA9IHRoaXMuZ2V0KCd3aWR0aCcpIHx8IGNsaWVudFdpZHRoO1xuICAgIHZhciBoZWlnaHQgPSB0aGlzLmdldCgnaGVpZ2h0JykgfHwgY2xpZW50SGVpZ2h0O1xuXG4gICAgaWYgKCF0aGlzLmdldCgnd2lkdGgnKSAmJiAhdGhpcy5nZXQoJ2hlaWdodCcpKSB7XG4gICAgICB0aGlzLnNldCgnd2lkdGgnLCBjbGllbnRXaWR0aCk7XG4gICAgICB0aGlzLnNldCgnaGVpZ2h0JywgY2xpZW50SGVpZ2h0KTtcbiAgICB9XG5cbiAgICB2YXIgcmVuZGVyZXIgPSB0aGlzLmdldCgncmVuZGVyZXInKTtcbiAgICB2YXIgY2FudmFzO1xuXG4gICAgaWYgKHJlbmRlcmVyID09PSBTVkcpIHtcbiAgICAgIGNhbnZhcyA9IG5ldyBHU1ZHQ2FudmFzKHtcbiAgICAgICAgY29udGFpbmVyOiBjb250YWluZXIsXG4gICAgICAgIHdpZHRoOiB3aWR0aCxcbiAgICAgICAgaGVpZ2h0OiBoZWlnaHRcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgY2FudmFzQ2ZnID0ge1xuICAgICAgICBjb250YWluZXI6IGNvbnRhaW5lcixcbiAgICAgICAgd2lkdGg6IHdpZHRoLFxuICAgICAgICBoZWlnaHQ6IGhlaWdodFxuICAgICAgfTtcbiAgICAgIHZhciBwaXhlbFJhdGlvID0gdGhpcy5nZXQoJ3BpeGVsUmF0aW8nKTtcblxuICAgICAgaWYgKHBpeGVsUmF0aW8pIHtcbiAgICAgICAgY2FudmFzQ2ZnLnBpeGVsUmF0aW8gPSBwaXhlbFJhdGlvO1xuICAgICAgfVxuXG4gICAgICBjYW52YXMgPSBuZXcgR0NhbnZhcyhjYW52YXNDZmcpO1xuICAgIH1cblxuICAgIHRoaXMuc2V0KCdjYW52YXMnLCBjYW52YXMpO1xuICB9O1xuXG4gIEdyYXBoLnByb3RvdHlwZS5pbml0UGx1Z2lucyA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgZWFjaChzZWxmLmdldCgncGx1Z2lucycpLCBmdW5jdGlvbiAocGx1Z2luKSB7XG4gICAgICBpZiAoIXBsdWdpbi5kZXN0cm95ZWQgJiYgcGx1Z2luLmluaXRQbHVnaW4pIHtcbiAgICAgICAgcGx1Z2luLmluaXRQbHVnaW4oc2VsZik7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG4gIC8qKlxuICAqIOWinuWKoOWbvueJh+S4i+i9veawtOWNsOWKn+iDvVxuICAqL1xuXG5cbiAgR3JhcGgucHJvdG90eXBlLmRvd25sb2FkSW1hZ2VXYXRlcm1hcmsgPSBmdW5jdGlvbiAod2F0ZXJtYXJrZXIsIGNvbnRleHQsIHdpZHRoLCBoZWlnaHQpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgd2F0ZXJtYXJrU3RyLCB3YXRlcm1hcmtiYXNlNjQsIGltZztcbiAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIHdhdGVybWFya1N0ciA9IHdhdGVybWFya2VyLnN0eWxlLmJhY2tncm91bmRJbWFnZTtcbiAgICAgICAgICAgIHdhdGVybWFya2Jhc2U2NCA9IHdhdGVybWFya1N0ci5zbGljZSg1LCB3YXRlcm1hcmtTdHIubGVuZ3RoIC0gMik7XG4gICAgICAgICAgICBpbWcgPSBuZXcgSW1hZ2UoKTtcbiAgICAgICAgICAgIGltZy5zcmMgPSB3YXRlcm1hcmtiYXNlNjQ7XG4gICAgICAgICAgICByZXR1cm4gWzRcbiAgICAgICAgICAgIC8qeWllbGQqL1xuICAgICAgICAgICAgLCBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgICAgICAgICBpbWcub25sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHZhciBwYXQgPSBjb250ZXh0LmNyZWF0ZVBhdHRlcm4oaW1nLCBcInJlcGVhdFwiKTtcbiAgICAgICAgICAgICAgICBjb250ZXh0LnJlY3QoMCwgMCwgd2lkdGgsIGhlaWdodCk7XG4gICAgICAgICAgICAgICAgY29udGV4dC5maWxsU3R5bGUgPSBwYXQ7XG4gICAgICAgICAgICAgICAgY29udGV4dC5maWxsKCk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgnJyk7XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KV07XG5cbiAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICBfYS5zZW50KCk7XG5cbiAgICAgICAgICAgIHJldHVybiBbMlxuICAgICAgICAgICAgLypyZXR1cm4qL1xuICAgICAgICAgICAgXTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG4gIC8qKlxuICAgKiDnlKjkuo7nlJ/miJDlm77niYcgKOW8guatpWNhbGxiYWNrKVxuICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZSDlm77niYfnsbvlnovvvIzlj6/pgInlgLzvvJpcImltYWdlL3BuZ1wiIHwgXCJpbWFnZS9qcGVnXCIgfCBcImltYWdlL3dlYnBcIiB8IFwiaW1hZ2UvYm1wXCJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGJhY2tncm91bmRDb2xvciDlm77niYfog4zmma/oibJcbiAgICogQHJldHVybiB7c3RyaW5nfSDlm77niYcgZGF0YVVSTFxuICAgKi9cblxuXG4gIEdyYXBoLnByb3RvdHlwZS5hc3luY1RvRGF0YVVybCA9IGZ1bmN0aW9uICh0eXBlLCBiYWNrZ3JvdW5kQ29sb3IsIGNhbGxiYWNrLCB3aWR0aHMsIGhlaWdodHMsIHZDYW52YXNFbCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICB2YXIgd2F0ZXJtYXJrZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuZzYtZ3JhcGgtd2F0ZXJtYXJrZXInKTtcbiAgICB2YXIgY2FudmFzID0gdGhpcy5nZXQoJ2NhbnZhcycpO1xuICAgIHZhciByZW5kZXJlciA9IGNhbnZhcy5nZXRSZW5kZXJlcigpO1xuICAgIHZhciBjYW52YXNEb20gPSB2Q2FudmFzRWwgfHwgY2FudmFzLmdldCgnZWwnKTtcbiAgICB2YXIgZGF0YVVSTCA9ICcnO1xuICAgIGlmICghdHlwZSkgdHlwZSA9ICdpbWFnZS9wbmcnO1xuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIF9fYXdhaXRlcihfdGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGNsb25lTm9kZSwgc3ZnRG9jVHlwZSwgc3ZnRG9jLCBzdmdEYXRhLCBpbWFnZURhdGEsIGNvbnRleHQsIHdpZHRoLCBoZWlnaHQsIGNvbXBvc2l0ZU9wZXJhdGlvbiwgcGl4ZWxSYXRpbztcbiAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgaWYgKCEocmVuZGVyZXIgPT09ICdzdmcnKSkgcmV0dXJuIFszXG4gICAgICAgICAgICAgIC8qYnJlYWsqL1xuICAgICAgICAgICAgICAsIDFdO1xuICAgICAgICAgICAgICBjbG9uZU5vZGUgPSBjYW52YXNEb20uY2xvbmVOb2RlKHRydWUpO1xuICAgICAgICAgICAgICBzdmdEb2NUeXBlID0gZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlRG9jdW1lbnRUeXBlKCdzdmcnLCAnLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4nLCAnaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkJyk7XG4gICAgICAgICAgICAgIHN2Z0RvYyA9IGRvY3VtZW50LmltcGxlbWVudGF0aW9uLmNyZWF0ZURvY3VtZW50KCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdzdmcnLCBzdmdEb2NUeXBlKTtcbiAgICAgICAgICAgICAgc3ZnRG9jLnJlcGxhY2VDaGlsZChjbG9uZU5vZGUsIHN2Z0RvYy5kb2N1bWVudEVsZW1lbnQpO1xuICAgICAgICAgICAgICBzdmdEYXRhID0gbmV3IFhNTFNlcmlhbGl6ZXIoKS5zZXJpYWxpemVUb1N0cmluZyhzdmdEb2MpO1xuICAgICAgICAgICAgICBkYXRhVVJMID0gXCJkYXRhOmltYWdlL3N2Zyt4bWw7Y2hhcnNldD11dGY4LFwiICsgZW5jb2RlVVJJQ29tcG9uZW50KHN2Z0RhdGEpO1xuICAgICAgICAgICAgICByZXR1cm4gWzNcbiAgICAgICAgICAgICAgLypicmVhayovXG4gICAgICAgICAgICAgICwgNF07XG5cbiAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgaW1hZ2VEYXRhID0gdm9pZCAwO1xuICAgICAgICAgICAgICBjb250ZXh0ID0gY2FudmFzRG9tLmdldENvbnRleHQoJzJkJyk7XG4gICAgICAgICAgICAgIHdpZHRoID0gd2lkdGhzIHx8IHRoaXMuZ2V0KCd3aWR0aCcpO1xuICAgICAgICAgICAgICBoZWlnaHQgPSBoZWlnaHRzIHx8IHRoaXMuZ2V0KCdoZWlnaHQnKTtcbiAgICAgICAgICAgICAgY29tcG9zaXRlT3BlcmF0aW9uID0gdm9pZCAwO1xuICAgICAgICAgICAgICBpZiAoIXdhdGVybWFya2VyKSByZXR1cm4gWzNcbiAgICAgICAgICAgICAgLypicmVhayovXG4gICAgICAgICAgICAgICwgM107XG4gICAgICAgICAgICAgIHJldHVybiBbNFxuICAgICAgICAgICAgICAvKnlpZWxkKi9cbiAgICAgICAgICAgICAgLCB0aGlzLmRvd25sb2FkSW1hZ2VXYXRlcm1hcmsod2F0ZXJtYXJrZXIsIGNvbnRleHQsIHdpZHRoLCBoZWlnaHQpXTtcblxuICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICBfYS5zZW50KCk7XG5cbiAgICAgICAgICAgICAgX2EubGFiZWwgPSAzO1xuXG4gICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgIGlmIChiYWNrZ3JvdW5kQ29sb3IpIHtcbiAgICAgICAgICAgICAgICBwaXhlbFJhdGlvID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyA6IDE7XG5cbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgaW1hZ2VEYXRhID0gY29udGV4dC5nZXRJbWFnZURhdGEoMCwgMCwgd2lkdGggKiBwaXhlbFJhdGlvLCBoZWlnaHQgKiBwaXhlbFJhdGlvKTtcbiAgICAgICAgICAgICAgICAgIGNvbXBvc2l0ZU9wZXJhdGlvbiA9IGNvbnRleHQuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uO1xuICAgICAgICAgICAgICAgICAgY29udGV4dC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSAnZGVzdGluYXRpb24tb3Zlcic7XG4gICAgICAgICAgICAgICAgICBjb250ZXh0LmZpbGxTdHlsZSA9IGJhY2tncm91bmRDb2xvcjtcbiAgICAgICAgICAgICAgICAgIGNvbnRleHQuZmlsbFJlY3QoMCwgMCwgd2lkdGgsIGhlaWdodCk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Rvd25sb2FkIGltYWdlIGZhaWxlZC4gT3V0IG9mIG1lbW9yeSBhdCBJbWFnZURhdGEgY3JlYXRpb24nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBkYXRhVVJMID0gY2FudmFzRG9tLnRvRGF0YVVSTCh0eXBlKTtcblxuICAgICAgICAgICAgICBpZiAoYmFja2dyb3VuZENvbG9yKSB7XG4gICAgICAgICAgICAgICAgY29udGV4dC5jbGVhclJlY3QoMCwgMCwgd2lkdGgsIGhlaWdodCk7XG4gICAgICAgICAgICAgICAgY29udGV4dC5wdXRJbWFnZURhdGEoaW1hZ2VEYXRhLCAwLCAwKTtcbiAgICAgICAgICAgICAgICBjb250ZXh0Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9IGNvbXBvc2l0ZU9wZXJhdGlvbjtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIF9hLmxhYmVsID0gNDtcblxuICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICBpZiAoY2FsbGJhY2spIGNhbGxiYWNrKGRhdGFVUkwpO1xuICAgICAgICAgICAgICByZXR1cm4gWzJcbiAgICAgICAgICAgICAgLypyZXR1cm4qL1xuICAgICAgICAgICAgICBdO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9LCAxNik7XG4gIH07XG4gIC8qKlxuICAgKiDov5Tlm57lj6/op4HljLrln5/nmoTlm77nmoQgZGF0YVVybO+8jOeUqOS6jueUn+aIkOWbvueJh1xuICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZSDlm77niYfnsbvlnovvvIzlj6/pgInlgLzvvJpcImltYWdlL3BuZ1wiIHwgXCJpbWFnZS9qcGVnXCIgfCBcImltYWdlL3dlYnBcIiB8IFwiaW1hZ2UvYm1wXCJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGJhY2tncm91bmRDb2xvciDlm77niYfog4zmma/oibJcbiAgICogQHJldHVybiB7c3RyaW5nfSDlm77niYcgZGF0YVVSTFxuICAgKi9cblxuXG4gIEdyYXBoLnByb3RvdHlwZS50b0RhdGFVUkwgPSBmdW5jdGlvbiAodHlwZSwgYmFja2dyb3VuZENvbG9yKSB7XG4gICAgdmFyIGNhbnZhcyA9IHRoaXMuZ2V0KCdjYW52YXMnKTtcbiAgICB2YXIgcmVuZGVyZXIgPSBjYW52YXMuZ2V0UmVuZGVyZXIoKTtcbiAgICB2YXIgY2FudmFzRG9tID0gY2FudmFzLmdldCgnZWwnKTtcbiAgICBpZiAoIXR5cGUpIHR5cGUgPSAnaW1hZ2UvcG5nJztcbiAgICB2YXIgZGF0YVVSTCA9ICcnO1xuXG4gICAgaWYgKHJlbmRlcmVyID09PSAnc3ZnJykge1xuICAgICAgdmFyIGNsb25lTm9kZSA9IGNhbnZhc0RvbS5jbG9uZU5vZGUodHJ1ZSk7XG4gICAgICB2YXIgc3ZnRG9jVHlwZSA9IGRvY3VtZW50LmltcGxlbWVudGF0aW9uLmNyZWF0ZURvY3VtZW50VHlwZSgnc3ZnJywgJy0vL1czQy8vRFREIFNWRyAxLjEvL0VOJywgJ2h0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCcpO1xuICAgICAgdmFyIHN2Z0RvYyA9IGRvY3VtZW50LmltcGxlbWVudGF0aW9uLmNyZWF0ZURvY3VtZW50KCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdzdmcnLCBzdmdEb2NUeXBlKTtcbiAgICAgIHN2Z0RvYy5yZXBsYWNlQ2hpbGQoY2xvbmVOb2RlLCBzdmdEb2MuZG9jdW1lbnRFbGVtZW50KTtcbiAgICAgIHZhciBzdmdEYXRhID0gbmV3IFhNTFNlcmlhbGl6ZXIoKS5zZXJpYWxpemVUb1N0cmluZyhzdmdEb2MpO1xuICAgICAgZGF0YVVSTCA9IFwiZGF0YTppbWFnZS9zdmcreG1sO2NoYXJzZXQ9dXRmOCxcIiArIGVuY29kZVVSSUNvbXBvbmVudChzdmdEYXRhKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGltYWdlRGF0YSA9IHZvaWQgMDtcbiAgICAgIHZhciBjb250ZXh0ID0gY2FudmFzRG9tLmdldENvbnRleHQoJzJkJyk7XG4gICAgICB2YXIgd2lkdGggPSB0aGlzLmdldCgnd2lkdGgnKTtcbiAgICAgIHZhciBoZWlnaHQgPSB0aGlzLmdldCgnaGVpZ2h0Jyk7XG4gICAgICB2YXIgY29tcG9zaXRlT3BlcmF0aW9uID0gdm9pZCAwO1xuXG4gICAgICBpZiAoYmFja2dyb3VuZENvbG9yKSB7XG4gICAgICAgIHZhciBwaXhlbFJhdGlvID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyA6IDE7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpbWFnZURhdGEgPSBjb250ZXh0LmdldEltYWdlRGF0YSgwLCAwLCB3aWR0aCAqIHBpeGVsUmF0aW8sIGhlaWdodCAqIHBpeGVsUmF0aW8pO1xuICAgICAgICAgIGNvbXBvc2l0ZU9wZXJhdGlvbiA9IGNvbnRleHQuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uO1xuICAgICAgICAgIGNvbnRleHQuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gJ2Rlc3RpbmF0aW9uLW92ZXInO1xuICAgICAgICAgIGNvbnRleHQuZmlsbFN0eWxlID0gYmFja2dyb3VuZENvbG9yO1xuICAgICAgICAgIGNvbnRleHQuZmlsbFJlY3QoMCwgMCwgd2lkdGgsIGhlaWdodCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignRG93bmxvYWQgaW1hZ2UgZmFpbGVkLiBPdXQgb2YgbWVtb3J5IGF0IEltYWdlRGF0YSBjcmVhdGlvbicpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGRhdGFVUkwgPSBjYW52YXNEb20udG9EYXRhVVJMKHR5cGUpO1xuXG4gICAgICBpZiAoYmFja2dyb3VuZENvbG9yKSB7XG4gICAgICAgIGNvbnRleHQuY2xlYXJSZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICBjb250ZXh0LnB1dEltYWdlRGF0YShpbWFnZURhdGEsIDAsIDApO1xuICAgICAgICBjb250ZXh0Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9IGNvbXBvc2l0ZU9wZXJhdGlvbjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZGF0YVVSTDtcbiAgfTtcbiAgLyoqXG4gICAqIOi/lOWbnuaVtOS4quWbvu+8iOWMheaLrOi2heWHuuWPr+ingeWMuuWfn+eahOmDqOWIhu+8ieeahCBkYXRhVXJs77yM55So5LqO55Sf5oiQ5Zu+54mHXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIOW8guatpeeUn+aIkCBkYXRhVXJsIOWujOaIkOWQjueahOWbnuiwg+WHveaVsO+8jOWcqOi/memHjOWkhOeQhueUn+aIkOeahCBkYXRhVXJsIOWtl+espuS4slxuICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZSDlm77niYfnsbvlnovvvIzlj6/pgInlgLzvvJpcImltYWdlL3BuZ1wiIHwgXCJpbWFnZS9qcGVnXCIgfCBcImltYWdlL3dlYnBcIiB8IFwiaW1hZ2UvYm1wXCJcbiAgICogQHBhcmFtIHtPYmplY3R9IGltYWdlQ29uZmlnIOWbvueJh+mFjee9rumhue+8jOWMheaLrOiDjOaZr+iJsuWSjOS4iuS4i+W3puWPs+eahCBwYWRkaW5nXG4gICAqL1xuXG5cbiAgR3JhcGgucHJvdG90eXBlLnRvRnVsbERhdGFVUkwgPSBmdW5jdGlvbiAoY2FsbGJhY2ssIHR5cGUsIGltYWdlQ29uZmlnKSB7XG4gICAgdmFyIGJib3ggPSB0aGlzLmdldCgnZ3JvdXAnKS5nZXRDYW52YXNCQm94KCk7XG4gICAgdmFyIGhlaWdodCA9IGJib3guaGVpZ2h0O1xuICAgIHZhciB3aWR0aCA9IGJib3gud2lkdGg7XG4gICAgdmFyIHJlbmRlcmVyID0gdGhpcy5nZXQoJ3JlbmRlcmVyJyk7XG4gICAgdmFyIHZDb250YWluZXJET00gPSBjcmVhdGVEb20oJzxpZD1cInZpcnR1YWwtaW1hZ2VcIj48L2Rpdj4nKTtcbiAgICB2YXIgYmFja2dyb3VuZENvbG9yID0gaW1hZ2VDb25maWcgPyBpbWFnZUNvbmZpZy5iYWNrZ3JvdW5kQ29sb3IgOiB1bmRlZmluZWQ7XG4gICAgdmFyIHBhZGRpbmcgPSBpbWFnZUNvbmZpZyA/IGltYWdlQ29uZmlnLnBhZGRpbmcgOiB1bmRlZmluZWQ7XG4gICAgaWYgKCFwYWRkaW5nKSBwYWRkaW5nID0gWzAsIDAsIDAsIDBdO2Vsc2UgaWYgKGlzTnVtYmVyKHBhZGRpbmcpKSBwYWRkaW5nID0gW3BhZGRpbmcsIHBhZGRpbmcsIHBhZGRpbmcsIHBhZGRpbmddO1xuICAgIHZhciB2SGVpZ2h0ID0gaGVpZ2h0ICsgcGFkZGluZ1swXSArIHBhZGRpbmdbMl07XG4gICAgdmFyIHZXaWR0aCA9IHdpZHRoICsgcGFkZGluZ1sxXSArIHBhZGRpbmdbM107XG4gICAgdmFyIGNhbnZhc09wdGlvbnMgPSB7XG4gICAgICBjb250YWluZXI6IHZDb250YWluZXJET00sXG4gICAgICBoZWlnaHQ6IHZIZWlnaHQsXG4gICAgICB3aWR0aDogdldpZHRoLFxuICAgICAgcXVpY2tIaXQ6IHRydWVcbiAgICB9O1xuICAgIHZhciB2Q2FudmFzID0gcmVuZGVyZXIgPT09ICdzdmcnID8gbmV3IEdTVkdDYW52YXMoY2FudmFzT3B0aW9ucykgOiBuZXcgR0NhbnZhcyhjYW52YXNPcHRpb25zKTtcbiAgICB2YXIgZ3JvdXAgPSB0aGlzLmdldCgnZ3JvdXAnKTtcbiAgICB2YXIgdkdyb3VwID0gZ3JvdXAuY2xvbmUoKTtcbiAgICB2YXIgbWF0cml4ID0gY2xvbmUodkdyb3VwLmdldE1hdHJpeCgpKTtcbiAgICBpZiAoIW1hdHJpeCkgbWF0cml4ID0gWzEsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDFdO1xuICAgIHZhciBjZW50ZXJYID0gKGJib3gubWF4WCArIGJib3gubWluWCkgLyAyO1xuICAgIHZhciBjZW50ZXJZID0gKGJib3gubWF4WSArIGJib3gubWluWSkgLyAyO1xuICAgIG1hdHJpeCA9IHRyYW5zZm9ybShtYXRyaXgsIFtbJ3QnLCAtY2VudGVyWCwgLWNlbnRlclldLCBbJ3QnLCB3aWR0aCAvIDIgKyBwYWRkaW5nWzNdLCBoZWlnaHQgLyAyICsgcGFkZGluZ1swXV1dKTtcbiAgICB2R3JvdXAucmVzZXRNYXRyaXgoKTtcbiAgICB2R3JvdXAuc2V0TWF0cml4KG1hdHJpeCk7XG4gICAgdkNhbnZhcy5hZGQodkdyb3VwKTtcbiAgICB2YXIgdkNhbnZhc0VsID0gdkNhbnZhcy5nZXQoJ2VsJyk7XG4gICAgdmFyIGRhdGFVUkwgPSAnJztcbiAgICBpZiAoIXR5cGUpIHR5cGUgPSAnaW1hZ2UvcG5nJztcbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChyZW5kZXJlciA9PT0gJ3N2ZycpIHtcbiAgICAgICAgdmFyIGNsb25lTm9kZSA9IHZDYW52YXNFbC5jbG9uZU5vZGUodHJ1ZSk7XG4gICAgICAgIHZhciBzdmdEb2NUeXBlID0gZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlRG9jdW1lbnRUeXBlKCdzdmcnLCAnLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4nLCAnaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkJyk7XG4gICAgICAgIHZhciBzdmdEb2MgPSBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVEb2N1bWVudCgnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAnc3ZnJywgc3ZnRG9jVHlwZSk7XG4gICAgICAgIHN2Z0RvYy5yZXBsYWNlQ2hpbGQoY2xvbmVOb2RlLCBzdmdEb2MuZG9jdW1lbnRFbGVtZW50KTtcbiAgICAgICAgdmFyIHN2Z0RhdGEgPSBuZXcgWE1MU2VyaWFsaXplcigpLnNlcmlhbGl6ZVRvU3RyaW5nKHN2Z0RvYyk7XG4gICAgICAgIGRhdGFVUkwgPSBcImRhdGE6aW1hZ2Uvc3ZnK3htbDtjaGFyc2V0PXV0ZjgsXCIgKyBlbmNvZGVVUklDb21wb25lbnQoc3ZnRGF0YSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgaW1hZ2VEYXRhID0gdm9pZCAwO1xuICAgICAgICB2YXIgY29udGV4dCA9IHZDYW52YXNFbC5nZXRDb250ZXh0KCcyZCcpO1xuICAgICAgICB2YXIgY29tcG9zaXRlT3BlcmF0aW9uID0gdm9pZCAwO1xuXG4gICAgICAgIGlmIChiYWNrZ3JvdW5kQ29sb3IpIHtcbiAgICAgICAgICB2YXIgcGl4ZWxSYXRpbyA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gd2luZG93LmRldmljZVBpeGVsUmF0aW8gOiAxO1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGltYWdlRGF0YSA9IGNvbnRleHQuZ2V0SW1hZ2VEYXRhKDAsIDAsIHZXaWR0aCAqIHBpeGVsUmF0aW8sIHZIZWlnaHQgKiBwaXhlbFJhdGlvKTtcbiAgICAgICAgICAgIGNvbXBvc2l0ZU9wZXJhdGlvbiA9IGNvbnRleHQuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uO1xuICAgICAgICAgICAgY29udGV4dC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSAnZGVzdGluYXRpb24tb3Zlcic7XG4gICAgICAgICAgICBjb250ZXh0LmZpbGxTdHlsZSA9IGJhY2tncm91bmRDb2xvcjtcbiAgICAgICAgICAgIGNvbnRleHQuZmlsbFJlY3QoMCwgMCwgdldpZHRoLCB2SGVpZ2h0KTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRG93bmxvYWQgaW1hZ2UgZmFpbGVkLiBPdXQgb2YgbWVtb3J5IGF0IEltYWdlRGF0YSBjcmVhdGlvbicpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGRhdGFVUkwgPSB2Q2FudmFzRWwudG9EYXRhVVJMKHR5cGUpO1xuXG4gICAgICAgIGlmIChiYWNrZ3JvdW5kQ29sb3IpIHtcbiAgICAgICAgICBjb250ZXh0LmNsZWFyUmVjdCgwLCAwLCB2V2lkdGgsIHZIZWlnaHQpO1xuICAgICAgICAgIGNvbnRleHQucHV0SW1hZ2VEYXRhKGltYWdlRGF0YSwgMCwgMCk7XG4gICAgICAgICAgY29udGV4dC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSBjb21wb3NpdGVPcGVyYXRpb247XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGNhbGxiYWNrKSBjYWxsYmFjayhkYXRhVVJMKTtcbiAgICB9LCAxNik7XG4gIH07XG4gIC8qKlxuICAgKiDlr7zlh7rljIXlkKvlhajlm77nmoTlm77niYdcbiAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWUg5Zu+54mH55qE5ZCN56ewXG4gICAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIOWbvueJh+exu+Wei++8jOWPr+mAieWAvO+8mlwiaW1hZ2UvcG5nXCIgfCBcImltYWdlL2pwZWdcIiB8IFwiaW1hZ2Uvd2VicFwiIHwgXCJpbWFnZS9ibXBcIlxuICAgKiBAcGFyYW0ge09iamVjdH0gaW1hZ2VDb25maWcg5Zu+54mH6YWN572u6aG577yM5YyF5ous6IOM5pmv6Imy5ZKM5LiK5LiL5bem5Y+z55qEIHBhZGRpbmdcbiAgICovXG5cblxuICBHcmFwaC5wcm90b3R5cGUuZG93bmxvYWRGdWxsSW1hZ2UgPSBmdW5jdGlvbiAobmFtZSwgdHlwZSwgaW1hZ2VDb25maWcpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdmFyIGJib3ggPSB0aGlzLmdldCgnZ3JvdXAnKS5nZXRDYW52YXNCQm94KCk7XG4gICAgdmFyIGhlaWdodCA9IGJib3guaGVpZ2h0O1xuICAgIHZhciB3aWR0aCA9IGJib3gud2lkdGg7XG4gICAgdmFyIHJlbmRlcmVyID0gdGhpcy5nZXQoJ3JlbmRlcmVyJyk7XG4gICAgdmFyIHZDb250YWluZXJET00gPSBjcmVhdGVEb20oJzxpZD1cInZpcnR1YWwtaW1hZ2VcIj48L2Rpdj4nKTtcbiAgICB2YXIgd2F0ZXJtYXJrZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuZzYtZ3JhcGgtd2F0ZXJtYXJrZXInKTtcbiAgICB2YXIgYmFja2dyb3VuZENvbG9yID0gaW1hZ2VDb25maWcgPyBpbWFnZUNvbmZpZy5iYWNrZ3JvdW5kQ29sb3IgOiB1bmRlZmluZWQ7XG4gICAgdmFyIHBhZGRpbmcgPSBpbWFnZUNvbmZpZyA/IGltYWdlQ29uZmlnLnBhZGRpbmcgOiB1bmRlZmluZWQ7XG4gICAgaWYgKCFwYWRkaW5nKSBwYWRkaW5nID0gWzAsIDAsIDAsIDBdO2Vsc2UgaWYgKGlzTnVtYmVyKHBhZGRpbmcpKSBwYWRkaW5nID0gW3BhZGRpbmcsIHBhZGRpbmcsIHBhZGRpbmcsIHBhZGRpbmddO1xuICAgIHZhciB2SGVpZ2h0ID0gaGVpZ2h0ICsgcGFkZGluZ1swXSArIHBhZGRpbmdbMl07XG4gICAgdmFyIHZXaWR0aCA9IHdpZHRoICsgcGFkZGluZ1sxXSArIHBhZGRpbmdbM107XG5cbiAgICBpZiAod2F0ZXJtYXJrZXIpIHtcbiAgICAgIHZhciBfYSA9IHRoaXMuZ2V0KCdncmFwaFdhdGVyTWFya2VyJykuY2ZnIHx8IHt9LFxuICAgICAgICAgIHdtV2lkdGggPSBfYS53aWR0aCxcbiAgICAgICAgICB3bUhlaWdodCA9IF9hLmhlaWdodDtcblxuICAgICAgdkhlaWdodCA9IE1hdGguY2VpbCh2SGVpZ2h0IC8gd21IZWlnaHQpICogd21IZWlnaHQ7XG4gICAgICB2V2lkdGggPSBNYXRoLmNlaWwodldpZHRoIC8gd21XaWR0aCkgKiB3bVdpZHRoO1xuICAgIH1cblxuICAgIHZhciBjYW52YXNPcHRpb25zID0ge1xuICAgICAgY29udGFpbmVyOiB2Q29udGFpbmVyRE9NLFxuICAgICAgaGVpZ2h0OiB2SGVpZ2h0LFxuICAgICAgd2lkdGg6IHZXaWR0aFxuICAgIH07XG4gICAgdmFyIHZDYW52YXMgPSByZW5kZXJlciA9PT0gJ3N2ZycgPyBuZXcgR1NWR0NhbnZhcyhjYW52YXNPcHRpb25zKSA6IG5ldyBHQ2FudmFzKGNhbnZhc09wdGlvbnMpO1xuICAgIHZhciBncm91cCA9IHRoaXMuZ2V0KCdncm91cCcpO1xuICAgIHZhciB2R3JvdXAgPSBncm91cC5jbG9uZSgpO1xuICAgIHZhciBtYXRyaXggPSBjbG9uZSh2R3JvdXAuZ2V0TWF0cml4KCkpO1xuICAgIGlmICghbWF0cml4KSBtYXRyaXggPSBbMSwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMV07XG4gICAgdmFyIGNlbnRlclggPSAoYmJveC5tYXhYICsgYmJveC5taW5YKSAvIDI7XG4gICAgdmFyIGNlbnRlclkgPSAoYmJveC5tYXhZICsgYmJveC5taW5ZKSAvIDI7XG4gICAgbWF0cml4ID0gdHJhbnNmb3JtKG1hdHJpeCwgW1sndCcsIC1jZW50ZXJYLCAtY2VudGVyWV0sIFsndCcsIHdpZHRoIC8gMiArIHBhZGRpbmdbM10sIGhlaWdodCAvIDIgKyBwYWRkaW5nWzBdXV0pO1xuICAgIHZHcm91cC5yZXNldE1hdHJpeCgpO1xuICAgIHZHcm91cC5zZXRNYXRyaXgobWF0cml4KTtcbiAgICB2Q2FudmFzLmFkZCh2R3JvdXApO1xuICAgIHZhciB2Q2FudmFzRWwgPSB2Q2FudmFzLmdldCgnZWwnKTtcbiAgICBpZiAoIXR5cGUpIHR5cGUgPSAnaW1hZ2UvcG5nJztcbiAgICB0aGlzLmFzeW5jVG9EYXRhVXJsKHR5cGUsIGJhY2tncm91bmRDb2xvciwgZnVuY3Rpb24gKGRhdGFVUkwpIHtcbiAgICAgIHZhciBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgICAgdmFyIGZpbGVOYW1lID0gKG5hbWUgfHwgJ2dyYXBoJykgKyAocmVuZGVyZXIgPT09ICdzdmcnID8gJy5zdmcnIDogXCIuXCIgKyB0eXBlLnNwbGl0KCcvJylbMV0pO1xuXG4gICAgICBfdGhpcy5kYXRhVVJMVG9JbWFnZShkYXRhVVJMLCByZW5kZXJlciwgbGluaywgZmlsZU5hbWUpO1xuXG4gICAgICB2YXIgZSA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdNb3VzZUV2ZW50cycpO1xuICAgICAgZS5pbml0RXZlbnQoJ2NsaWNrJywgZmFsc2UsIGZhbHNlKTtcbiAgICAgIGxpbmsuZGlzcGF0Y2hFdmVudChlKTtcbiAgICB9LCB2V2lkdGgsIHZIZWlnaHQsIHZDYW52YXNFbCk7XG4gIH07XG4gIC8qKlxuICAgKiDnlLvluIPlr7zlh7rlm77niYfvvIzlm77niYfku4XljIXlkKvnlLvluIPlj6/op4HljLrln5/pg6jliIblhoXlrrlcbiAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWUg5Zu+54mH55qE5ZCN56ewXG4gICAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIOWbvueJh+exu+Wei++8jOWPr+mAieWAvO+8mlwiaW1hZ2UvcG5nXCIgfCBcImltYWdlL2pwZWdcIiB8IFwiaW1hZ2Uvd2VicFwiIHwgXCJpbWFnZS9ibXBcIlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYmFja2dyb3VuZENvbG9yIOWbvueJh+iDjOaZr+iJslxuICAgKi9cblxuXG4gIEdyYXBoLnByb3RvdHlwZS5kb3dubG9hZEltYWdlID0gZnVuY3Rpb24gKG5hbWUsIHR5cGUsIGJhY2tncm91bmRDb2xvcikge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICBpZiAoc2VsZi5pc0FuaW1hdGluZygpKSB7XG4gICAgICBzZWxmLnN0b3BBbmltYXRlKCk7XG4gICAgfVxuXG4gICAgdmFyIGNhbnZhcyA9IHNlbGYuZ2V0KCdjYW52YXMnKTtcbiAgICB2YXIgcmVuZGVyZXIgPSBjYW52YXMuZ2V0UmVuZGVyZXIoKTtcbiAgICBpZiAoIXR5cGUpIHR5cGUgPSAnaW1hZ2UvcG5nJztcbiAgICB2YXIgZmlsZU5hbWUgPSAobmFtZSB8fCAnZ3JhcGgnKSArIChyZW5kZXJlciA9PT0gJ3N2ZycgPyAnLnN2ZycgOiB0eXBlLnNwbGl0KCcvJylbMV0pO1xuICAgIHZhciBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgIHNlbGYuYXN5bmNUb0RhdGFVcmwodHlwZSwgYmFja2dyb3VuZENvbG9yLCBmdW5jdGlvbiAoZGF0YVVSTCkge1xuICAgICAgX3RoaXMuZGF0YVVSTFRvSW1hZ2UoZGF0YVVSTCwgcmVuZGVyZXIsIGxpbmssIGZpbGVOYW1lKTtcblxuICAgICAgdmFyIGUgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnTW91c2VFdmVudHMnKTtcbiAgICAgIGUuaW5pdEV2ZW50KCdjbGljaycsIGZhbHNlLCBmYWxzZSk7XG4gICAgICBsaW5rLmRpc3BhdGNoRXZlbnQoZSk7XG4gICAgfSk7XG4gIH07XG5cbiAgR3JhcGgucHJvdG90eXBlLmRhdGFVUkxUb0ltYWdlID0gZnVuY3Rpb24gKGRhdGFVUkwsIHJlbmRlcmVyLCBsaW5rLCBmaWxlTmFtZSkge1xuICAgIGlmICghZGF0YVVSTCB8fCBkYXRhVVJMID09PSAnZGF0YTonKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdEb3dubG9hZCBpbWFnZSBmYWlsZWQuIFRoZSBncmFwaCBpcyB0b28gbGFyZ2Ugb3IgdGhlcmUgaXMgaW52YWxpZCBhdHRyaWJ1dGUgdmFsdWVzIGluIGdyYXBoIGl0ZW1zJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBpZiAod2luZG93LkJsb2IgJiYgd2luZG93LlVSTCAmJiByZW5kZXJlciAhPT0gJ3N2ZycpIHtcbiAgICAgICAgdmFyIGFyciA9IGRhdGFVUkwuc3BsaXQoJywnKTtcbiAgICAgICAgdmFyIG1pbWUgPSAnJztcblxuICAgICAgICBpZiAoYXJyICYmIGFyci5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdmFyIG1hdGNoID0gYXJyWzBdLm1hdGNoKC86KC4qPyk7Lyk7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItZGVzdHJ1Y3R1cmluZ1xuXG4gICAgICAgICAgaWYgKG1hdGNoICYmIG1hdGNoLmxlbmd0aCA+PSAyKSBtaW1lID0gbWF0Y2hbMV07XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgYnN0ciA9IGF0b2IoYXJyWzFdKTtcbiAgICAgICAgdmFyIG4gPSBic3RyLmxlbmd0aDtcbiAgICAgICAgdmFyIHU4YXJyID0gbmV3IFVpbnQ4QXJyYXkobik7XG5cbiAgICAgICAgd2hpbGUgKG4tLSkge1xuICAgICAgICAgIHU4YXJyW25dID0gYnN0ci5jaGFyQ29kZUF0KG4pO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGJsb2JPYmpfMSA9IG5ldyBCbG9iKFt1OGFycl0sIHtcbiAgICAgICAgICB0eXBlOiBtaW1lXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICh3aW5kb3cubmF2aWdhdG9yLm1zU2F2ZUJsb2IpIHtcbiAgICAgICAgICB3aW5kb3cubmF2aWdhdG9yLm1zU2F2ZUJsb2IoYmxvYk9ial8xLCBmaWxlTmFtZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbGluay5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxpbmsuZG93bmxvYWQgPSBmaWxlTmFtZTtcbiAgICAgICAgICAgIGxpbmsuaHJlZiA9IHdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2JPYmpfMSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxpbmsuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgbGluay5kb3dubG9hZCA9IGZpbGVOYW1lO1xuICAgICAgICAgIGxpbmsuaHJlZiA9IGRhdGFVUkw7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgLyoqXG4gICAqIOa3u+WKoOaPkuS7tlxuICAgKiBAcGFyYW0ge29iamVjdH0gcGx1Z2luIOaPkuS7tuWunuS+i1xuICAgKi9cblxuXG4gIEdyYXBoLnByb3RvdHlwZS5hZGRQbHVnaW4gPSBmdW5jdGlvbiAocGx1Z2luKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgaWYgKHBsdWdpbi5kZXN0cm95ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzZWxmLmdldCgncGx1Z2lucycpLnB1c2gocGx1Z2luKTtcbiAgICBwbHVnaW4uaW5pdFBsdWdpbihzZWxmKTtcbiAgfTtcbiAgLyoqXG4gICAqIOa3u+WKoOaPkuS7tlxuICAgKiBAcGFyYW0ge29iamVjdH0gcGx1Z2luIOaPkuS7tuWunuS+i1xuICAgKi9cblxuXG4gIEdyYXBoLnByb3RvdHlwZS5yZW1vdmVQbHVnaW4gPSBmdW5jdGlvbiAocGx1Z2luKSB7XG4gICAgdmFyIHBsdWdpbnMgPSB0aGlzLmdldCgncGx1Z2lucycpO1xuICAgIHZhciBpbmRleCA9IHBsdWdpbnMuaW5kZXhPZihwbHVnaW4pO1xuXG4gICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgIHBsdWdpbi5kZXN0cm95UGx1Z2luKCk7XG4gICAgICBwbHVnaW5zLnNwbGljZShpbmRleCwgMSk7XG4gICAgfVxuICB9O1xuICAvKipcbiAgICog6K6+572u5Zu+54mH5rC05Y2wXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpbWdVUkwg5Zu+54mH5rC05Y2w55qEdXJs5Zyw5Z2AXG4gICAqIEBwYXJhbSB7V2F0ZXJNYXJrZXJDb25maWd9IGNvbmZpZyDmlofmnKzmsLTljbDnmoTphY3nva7poblcbiAgICovXG5cblxuICBHcmFwaC5wcm90b3R5cGUuc2V0SW1hZ2VXYXRlck1hcmtlciA9IGZ1bmN0aW9uIChpbWdVUkwsIGNvbmZpZykge1xuICAgIGlmIChpbWdVUkwgPT09IHZvaWQgMCkge1xuICAgICAgaW1nVVJMID0gR2xvYmFsLndhdGVyTWFya2VySW1hZ2U7XG4gICAgfVxuXG4gICAgdmFyIGNvbnRhaW5lciA9IHRoaXMuZ2V0KCdjb250YWluZXInKTtcblxuICAgIGlmIChpc1N0cmluZyhjb250YWluZXIpKSB7XG4gICAgICBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChjb250YWluZXIpO1xuICAgIH1cblxuICAgIGlmICghY29udGFpbmVyLnN0eWxlLnBvc2l0aW9uKSB7XG4gICAgICBjb250YWluZXIuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnO1xuICAgIH1cblxuICAgIHZhciBjYW52YXMgPSB0aGlzLmdldCgnZ3JhcGhXYXRlck1hcmtlcicpO1xuICAgIHZhciB3YXRlck1hcmtlckNvbmZpZyA9IGRlZXBNaXgoe30sIEdsb2JhbC5pbWFnZVdhdGVyTWFya2VyQ29uZmlnLCBjb25maWcpO1xuICAgIHZhciB3aWR0aCA9IHdhdGVyTWFya2VyQ29uZmlnLndpZHRoLFxuICAgICAgICBoZWlnaHQgPSB3YXRlck1hcmtlckNvbmZpZy5oZWlnaHQsXG4gICAgICAgIGNvbXBhdGlibGUgPSB3YXRlck1hcmtlckNvbmZpZy5jb21wYXRpYmxlLFxuICAgICAgICBpbWFnZSA9IHdhdGVyTWFya2VyQ29uZmlnLmltYWdlO1xuXG4gICAgaWYgKCFjYW52YXMpIHtcbiAgICAgIHZhciBjYW52YXNDZmcgPSB7XG4gICAgICAgIGNvbnRhaW5lcjogY29udGFpbmVyLFxuICAgICAgICB3aWR0aDogd2lkdGgsXG4gICAgICAgIGhlaWdodDogaGVpZ2h0LFxuICAgICAgICBjYXB0dXJlOiBmYWxzZVxuICAgICAgfTtcbiAgICAgIHZhciBwaXhlbFJhdGlvID0gdGhpcy5nZXQoJ3BpeGVsUmF0aW8nKTtcblxuICAgICAgaWYgKHBpeGVsUmF0aW8pIHtcbiAgICAgICAgY2FudmFzQ2ZnLnBpeGVsUmF0aW8gPSBwaXhlbFJhdGlvO1xuICAgICAgfVxuXG4gICAgICBjYW52YXMgPSBuZXcgR0NhbnZhcyhjYW52YXNDZmcpO1xuICAgICAgdGhpcy5zZXQoJ2dyYXBoV2F0ZXJNYXJrZXInLCBjYW52YXMpO1xuICAgIH1cblxuICAgIGNhbnZhcy5nZXQoJ2VsJykuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICB2YXIgY3R4ID0gY2FudmFzLmdldCgnY29udGV4dCcpO1xuICAgIHZhciByb3RhdGUgPSBpbWFnZS5yb3RhdGUsXG4gICAgICAgIHggPSBpbWFnZS54LFxuICAgICAgICB5ID0gaW1hZ2UueTsgLy8g5peL6L2sMjDluqZcblxuICAgIGN0eC5yb3RhdGUoLXJvdGF0ZSAqIE1hdGguUEkgLyAxODApO1xuICAgIHZhciBpbWcgPSBuZXcgSW1hZ2UoKTtcbiAgICBpbWcuY3Jvc3NPcmlnaW4gPSAnYW5vbnltb3VzJztcbiAgICBpbWcuc3JjID0gaW1nVVJMO1xuXG4gICAgaW1nLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN0eC5kcmF3SW1hZ2UoaW1nLCB4LCB5LCBpbWFnZS53aWR0aCwgaW1hZ2UuaGVpZ2h0KTsgLy8g5oGi5aSN5peL6L2s6KeS5bqmXG5cbiAgICAgIGN0eC5yb3RhdGUocm90YXRlICogTWF0aC5QSSAvIDE4MCk7IC8vIOm7mOiupOaMieeFp+eOsOS7o+a1j+iniOWZqOWkhOeQhlxuXG4gICAgICBpZiAoIWNvbXBhdGlibGUpIHtcbiAgICAgICAgdmFyIGJveCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5nNi1ncmFwaC13YXRlcm1hcmtlcicpO1xuXG4gICAgICAgIGlmICghYm94KSB7XG4gICAgICAgICAgYm94ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgYm94LmNsYXNzTmFtZSA9ICdnNi1ncmFwaC13YXRlcm1hcmtlcic7XG4gICAgICAgIH1cblxuICAgICAgICBib3guY2xhc3NOYW1lID0gJ2c2LWdyYXBoLXdhdGVybWFya2VyJztcblxuICAgICAgICBpZiAoIWNhbnZhcy5kZXN0cm95ZWQpIHtcbiAgICAgICAgICBib3guc3R5bGUuY3NzVGV4dCA9IFwiYmFja2dyb3VuZC1pbWFnZTogdXJsKFwiICsgY2FudmFzLmdldCgnZWwnKS50b0RhdGFVUkwoJ2ltYWdlL3BuZycpICsgXCIpO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdDtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtsZWZ0OjA7cmlnaHQ6MDtwb2ludGVyLWV2ZW50czpub25lO3otaW5kZXg6LTE7XCI7XG4gICAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGJveCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIOW9k+mcgOimgeWFvOWuueS4jeaUr+aMgSBwb2ludGVyLWV2ZW50c+WxnuaAp+eahOa1j+iniOWZqOaXtu+8jOWwhiBjb21wYXRpYmxlIOiuvue9ruS4uiB0cnVlXG4gICAgICAgIGNvbnRhaW5lci5zdHlsZS5jc3NUZXh0ID0gXCJiYWNrZ3JvdW5kLWltYWdlOiB1cmwoXCIgKyBjYW52YXMuZ2V0KCdlbCcpLnRvRGF0YVVSTCgnaW1hZ2UvcG5nJykgKyBcIik7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0O1wiO1xuICAgICAgfVxuICAgIH07XG4gIH07XG4gIC8qKlxuICAgKiDorr7nva7mlofmnKzmsLTljbBcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gdGV4dHMg5rC05Y2w55qE5paH5pys5YaF5a65XG4gICAqIEBwYXJhbSB7V2F0ZXJNYXJrZXJDb25maWd9IGNvbmZpZyDmlofmnKzmsLTljbDnmoTphY3nva7poblcbiAgICovXG5cblxuICBHcmFwaC5wcm90b3R5cGUuc2V0VGV4dFdhdGVyTWFya2VyID0gZnVuY3Rpb24gKHRleHRzLCBjb25maWcpIHtcbiAgICB2YXIgY29udGFpbmVyID0gdGhpcy5nZXQoJ2NvbnRhaW5lcicpO1xuXG4gICAgaWYgKGlzU3RyaW5nKGNvbnRhaW5lcikpIHtcbiAgICAgIGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGNvbnRhaW5lcik7XG4gICAgfVxuXG4gICAgaWYgKCFjb250YWluZXIuc3R5bGUucG9zaXRpb24pIHtcbiAgICAgIGNvbnRhaW5lci5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7XG4gICAgfVxuXG4gICAgdmFyIGNhbnZhcyA9IHRoaXMuZ2V0KCdncmFwaFdhdGVyTWFya2VyJyk7XG4gICAgdmFyIHdhdGVyTWFya2VyQ29uZmlnID0gZGVlcE1peCh7fSwgR2xvYmFsLnRleHRXYXRlck1hcmtlckNvbmZpZywgY29uZmlnKTtcbiAgICB2YXIgd2lkdGggPSB3YXRlck1hcmtlckNvbmZpZy53aWR0aCxcbiAgICAgICAgaGVpZ2h0ID0gd2F0ZXJNYXJrZXJDb25maWcuaGVpZ2h0LFxuICAgICAgICBjb21wYXRpYmxlID0gd2F0ZXJNYXJrZXJDb25maWcuY29tcGF0aWJsZSxcbiAgICAgICAgdGV4dCA9IHdhdGVyTWFya2VyQ29uZmlnLnRleHQ7XG5cbiAgICBpZiAoIWNhbnZhcykge1xuICAgICAgdmFyIGNhbnZhc0NmZyA9IHtcbiAgICAgICAgY29udGFpbmVyOiBjb250YWluZXIsXG4gICAgICAgIHdpZHRoOiB3aWR0aCxcbiAgICAgICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgICAgIGNhcHR1cmU6IGZhbHNlXG4gICAgICB9O1xuICAgICAgdmFyIHBpeGVsUmF0aW8gPSB0aGlzLmdldCgncGl4ZWxSYXRpbycpO1xuXG4gICAgICBpZiAocGl4ZWxSYXRpbykge1xuICAgICAgICBjYW52YXNDZmcucGl4ZWxSYXRpbyA9IHBpeGVsUmF0aW87XG4gICAgICB9XG5cbiAgICAgIGNhbnZhcyA9IG5ldyBHQ2FudmFzKGNhbnZhc0NmZyk7XG4gICAgICB0aGlzLnNldCgnZ3JhcGhXYXRlck1hcmtlcicsIGNhbnZhcyk7XG4gICAgfVxuXG4gICAgY2FudmFzLmdldCgnZWwnKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIHZhciBjdHggPSBjYW52YXMuZ2V0KCdjb250ZXh0Jyk7XG4gICAgdmFyIHJvdGF0ZSA9IHRleHQucm90YXRlLFxuICAgICAgICBmaWxsID0gdGV4dC5maWxsLFxuICAgICAgICBmb250RmFtaWx5ID0gdGV4dC5mb250RmFtaWx5LFxuICAgICAgICBmb250U2l6ZSA9IHRleHQuZm9udFNpemUsXG4gICAgICAgIGJhc2VsaW5lID0gdGV4dC5iYXNlbGluZSxcbiAgICAgICAgeCA9IHRleHQueCxcbiAgICAgICAgeSA9IHRleHQueSxcbiAgICAgICAgbGluZUhlaWdodCA9IHRleHQubGluZUhlaWdodDsgLy8g5peL6L2sMjDluqZcblxuICAgIGN0eC5yb3RhdGUoLXJvdGF0ZSAqIE1hdGguUEkgLyAxODApOyAvLyDorr7nva7mloflrZfmoLflvI9cblxuICAgIGN0eC5mb250ID0gZm9udFNpemUgKyBcInB4IFwiICsgZm9udEZhbWlseTsgLy8g6K6+572u5paH5a2X6aKc6ImyXG5cbiAgICBjdHguZmlsbFN0eWxlID0gZmlsbDtcbiAgICBjdHgudGV4dEJhc2VsaW5lID0gYmFzZWxpbmU7XG5cbiAgICBmb3IgKHZhciBpID0gdGV4dHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIC8vIOWwhuaWh+Wtl+e7mOWItuWIsOeUu+W4g1xuICAgICAgY3R4LmZpbGxUZXh0KHRleHRzW2ldLCB4LCB5ICsgaSAqIGxpbmVIZWlnaHQpO1xuICAgIH0gLy8g5oGi5aSN5peL6L2s6KeS5bqmXG5cblxuICAgIGN0eC5yb3RhdGUocm90YXRlICogTWF0aC5QSSAvIDE4MCk7IC8vIOm7mOiupOaMieeFp+eOsOS7o+a1j+iniOWZqOWkhOeQhlxuXG4gICAgaWYgKCFjb21wYXRpYmxlKSB7XG4gICAgICB2YXIgYm94ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmc2LWdyYXBoLXdhdGVybWFya2VyJyk7XG5cbiAgICAgIGlmICghYm94KSB7XG4gICAgICAgIGJveCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBib3guY2xhc3NOYW1lID0gJ2c2LWdyYXBoLXdhdGVybWFya2VyJztcbiAgICAgIH1cblxuICAgICAgYm94LnN0eWxlLmNzc1RleHQgPSBcImJhY2tncm91bmQtaW1hZ2U6IHVybChcIiArIGNhbnZhcy5nZXQoJ2VsJykudG9EYXRhVVJMKCdpbWFnZS9wbmcnKSArIFwiKTtiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQ7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7bGVmdDowO3JpZ2h0OjA7cG9pbnRlci1ldmVudHM6bm9uZTt6LWluZGV4Ojk5O1wiO1xuICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGJveCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIOW9k+mcgOimgeWFvOWuueS4jeaUr+aMgSBwb2ludGVyLWV2ZW50c+WxnuaAp+eahOa1j+iniOWZqOaXtu+8jOWwhiBjb21wYXRpYmxlIOiuvue9ruS4uiB0cnVlXG4gICAgICBjb250YWluZXIuc3R5bGUuY3NzVGV4dCA9IFwiYmFja2dyb3VuZC1pbWFnZTogdXJsKFwiICsgY2FudmFzLmdldCgnZWwnKS50b0RhdGFVUkwoJ2ltYWdlL3BuZycpICsgXCIpO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdDtcIjtcbiAgICB9XG4gIH07XG4gIC8qKlxuICAgKiDplIDmr4HnlLvluINcbiAgICovXG5cblxuICBHcmFwaC5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgX2EsIF9iLCBfYywgX2Q7XG5cbiAgICBlYWNoKHRoaXMuZ2V0KCdwbHVnaW5zJyksIGZ1bmN0aW9uIChwbHVnaW4pIHtcbiAgICAgIHBsdWdpbi5kZXN0cm95UGx1Z2luKCk7XG4gICAgfSk7IC8vIGRlc3Ryb3kgdG9vbHRpcCBkb21zLCByZW1vdmVkIHdoZW4gdXBncmFkZSBHNiA0LjBcblxuICAgIHZhciB0b29sdGlwRE9NcyA9IHRoaXMuZ2V0KCd0b29sdGlwcycpO1xuXG4gICAgaWYgKHRvb2x0aXBET01zKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRvb2x0aXBET01zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBjb250YWluZXIgPSB0b29sdGlwRE9Nc1tpXTtcbiAgICAgICAgaWYgKCFjb250YWluZXIpIGNvbnRpbnVlO1xuICAgICAgICB2YXIgcGFyZW50XzEgPSBjb250YWluZXIucGFyZW50RWxlbWVudDtcbiAgICAgICAgaWYgKCFwYXJlbnRfMSkgY29udGludWU7XG4gICAgICAgIHBhcmVudF8xLnJlbW92ZUNoaWxkKGNvbnRhaW5lcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgKF9hID0gdGhpcy5nZXQoJ2V2ZW50Q29udHJvbGxlcicpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZGVzdHJveSgpO1xuICAgIChfYiA9IHRoaXMuZ2V0KCdsYXlvdXRDb250cm9sbGVyJykpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5kZXN0cm95KCk7IC8vIHRoaXMuZ2V0KCdldmVudENvbnRyb2xsZXInKS5kZXN0cm95KCk7XG4gICAgLy8gdGhpcy5nZXQoJ2l0ZW1Db250cm9sbGVyJykuZGVzdHJveSgpO1xuICAgIC8vIHRoaXMuZ2V0KCdtb2RlQ29udHJvbGxlcicpLmRlc3Ryb3koKTtcbiAgICAvLyB0aGlzLmdldCgndmlld0NvbnRyb2xsZXInKS5kZXN0cm95KCk7XG4gICAgLy8gdGhpcy5nZXQoJ3N0YXRlQ29udHJvbGxlcicpLmRlc3Ryb3koKTtcbiAgICAvLyB0aGlzLmdldCgnY2FudmFzJykuZGVzdHJveSgpO1xuXG4gICAgKF9jID0gdGhpcy5nZXQoJ2dyYXBoV2F0ZXJNYXJrZXInKSkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLmRlc3Ryb3koKTtcbiAgICAoX2QgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuZzYtZ3JhcGgtd2F0ZXJtYXJrZXInKSkgPT09IG51bGwgfHwgX2QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9kLnJlbW92ZSgpO1xuXG4gICAgX3N1cGVyLnByb3RvdHlwZS5kZXN0cm95LmNhbGwodGhpcyk7XG4gIH07XG5cbiAgcmV0dXJuIEdyYXBoO1xufShBYnN0cmFjdEdyYXBoKTtcblxuZXhwb3J0IGRlZmF1bHQgR3JhcGg7IiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgSGllcmFyY2h5IGZyb20gJ0BhbnR2L2hpZXJhcmNoeSc7XG5pbXBvcnQgeyBlYWNoLCBpc09iamVjdCwgaXNTdHJpbmcgfSBmcm9tICdAYW50di91dGlsJztcbmltcG9ydCBVdGlsIGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IEdyYXBoIGZyb20gJy4vZ3JhcGgnO1xudmFyIHJhZGlhbExheW91dCA9IFV0aWwucmFkaWFsTGF5b3V0LFxuICAgIHRyYXZlcnNlVHJlZSA9IFV0aWwudHJhdmVyc2VUcmVlO1xuXG52YXIgVHJlZUdyYXBoID1cbi8qKiBAY2xhc3MgKi9cbmZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgX19leHRlbmRzKFRyZWVHcmFwaCwgX3N1cGVyKTtcblxuICBmdW5jdGlvbiBUcmVlR3JhcGgoY2ZnKSB7XG4gICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgY2ZnKSB8fCB0aGlzO1xuXG4gICAgX3RoaXMubGF5b3V0QW5pbWF0aW5nID0gZmFsc2U7IC8vIOeUqOS6jue8k+WtmOWKqOeUu+e7k+adn+WQjumcgOimgeWIoOmZpOeahOiKgueCuVxuXG4gICAgX3RoaXMuc2V0KCdyZW1vdmVMaXN0JywgW10pO1xuXG4gICAgX3RoaXMuc2V0KCdsYXlvdXRNZXRob2QnLCBfdGhpcy5nZXRMYXlvdXQoKSk7XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgLyoqXG4gICAqIOmAmui/hyBMYXlvdXQg6YWN572u6I635Y+W5biD5bGA6YWN572uXG4gICAqL1xuXG5cbiAgVHJlZUdyYXBoLnByb3RvdHlwZS5nZXRMYXlvdXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGxheW91dCA9IHRoaXMuZ2V0KCdsYXlvdXQnKTtcblxuICAgIGlmICghbGF5b3V0KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGxheW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIGxheW91dDtcbiAgICB9XG5cbiAgICBpZiAoIWxheW91dC50eXBlKSB7XG4gICAgICBsYXlvdXQudHlwZSA9ICdkZW5kcm9ncmFtJztcbiAgICB9XG5cbiAgICBpZiAoIWxheW91dC5kaXJlY3Rpb24pIHtcbiAgICAgIGxheW91dC5kaXJlY3Rpb24gPSAnVEInO1xuICAgIH1cblxuICAgIGlmIChsYXlvdXQucmFkaWFsKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgdmFyIGxheW91dERhdGEgPSBIaWVyYXJjaHlbbGF5b3V0LnR5cGVdKGRhdGEsIGxheW91dCk7XG4gICAgICAgIHJhZGlhbExheW91dChsYXlvdXREYXRhKTtcbiAgICAgICAgcmV0dXJuIGxheW91dERhdGE7XG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgcmV0dXJuIEhpZXJhcmNoeVtsYXlvdXQudHlwZV0oZGF0YSwgbGF5b3V0KTtcbiAgICB9O1xuICB9O1xuICAvKipcbiAgICog6L+U5Zue5oyH5a6a6IqC54K55Zyo5qCR5Zu+5pWw5o2u5Lit55qE57Si5byVXG4gICAqIEBwYXJhbSBjaGlsZHJlbiDmoJHlm77mlbDmja5cbiAgICogQHBhcmFtIGNoaWxkIOagkeWbvuS4reafkOS4gOS4qiBJdGVtIOeahOaVsOaNrlxuICAgKi9cblxuXG4gIFRyZWVHcmFwaC5pbmRleE9mQ2hpbGQgPSBmdW5jdGlvbiAoY2hpbGRyZW4sIGlkKSB7XG4gICAgdmFyIGluZGV4ID0gLTE7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb25zaXN0ZW50LXJldHVyblxuXG4gICAgZWFjaChjaGlsZHJlbiwgZnVuY3Rpb24gKGZvcm1lciwgaSkge1xuICAgICAgaWYgKGlkID09PSBmb3JtZXIuaWQpIHtcbiAgICAgICAgaW5kZXggPSBpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGluZGV4O1xuICB9O1xuXG4gIFRyZWVHcmFwaC5wcm90b3R5cGUuZ2V0RGVmYXVsdENmZyA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgY2ZnID0gX3N1cGVyLnByb3RvdHlwZS5nZXREZWZhdWx0Q2ZnLmNhbGwodGhpcyk7IC8vIOagkeWbvum7mOiupOaJk+W8gOWKqOeUu1xuXG5cbiAgICBjZmcuYW5pbWF0ZSA9IHRydWU7XG4gICAgcmV0dXJuIGNmZztcbiAgfTtcbiAgLyoqXG4gICAqIOWQkfCfjLLmoJHkuK3mt7vliqDmlbDmja5cbiAgICogQHBhcmFtIHRyZWVEYXRhIOagkeWbvuaVsOaNrlxuICAgKiBAcGFyYW0gcGFyZW50IOeItuiKgueCueWunuS+i1xuICAgKiBAcGFyYW0gYW5pbWF0ZSDmmK/lkKblvIDlkK/liqjnlLtcbiAgICovXG5cblxuICBUcmVlR3JhcGgucHJvdG90eXBlLmlubmVyQWRkQ2hpbGQgPSBmdW5jdGlvbiAodHJlZURhdGEsIHBhcmVudCwgYW5pbWF0ZSkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgbW9kZWwgPSB0cmVlRGF0YS5kYXRhO1xuXG4gICAgaWYgKG1vZGVsKSB7XG4gICAgICAvLyBtb2RlbCDkuK3lupTlrZjlgqjnnJ/lrp7nmoTmlbDmja7vvIznibnliKvmmK/nnJ/lrp7nmoQgY2hpbGRyZW5cbiAgICAgIG1vZGVsLnggPSB0cmVlRGF0YS54O1xuICAgICAgbW9kZWwueSA9IHRyZWVEYXRhLnk7XG4gICAgICBtb2RlbC5kZXB0aCA9IHRyZWVEYXRhLmRlcHRoO1xuICAgIH1cblxuICAgIHZhciBub2RlID0gc2VsZi5hZGRJdGVtKCdub2RlJywgbW9kZWwsIGZhbHNlKTtcblxuICAgIGlmIChwYXJlbnQpIHtcbiAgICAgIG5vZGUuc2V0KCdwYXJlbnQnLCBwYXJlbnQpO1xuXG4gICAgICBpZiAoYW5pbWF0ZSkge1xuICAgICAgICB2YXIgb3JpZ2luXzEgPSBwYXJlbnQuZ2V0KCdvcmlnaW5BdHRycycpO1xuXG4gICAgICAgIGlmIChvcmlnaW5fMSkge1xuICAgICAgICAgIG5vZGUuc2V0KCdvcmlnaW5BdHRycycsIG9yaWdpbl8xKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgcGFyZW50TW9kZWwgPSBwYXJlbnQuZ2V0TW9kZWwoKTtcbiAgICAgICAgICBub2RlLnNldCgnb3JpZ2luQXR0cnMnLCB7XG4gICAgICAgICAgICB4OiBwYXJlbnRNb2RlbC54LFxuICAgICAgICAgICAgeTogcGFyZW50TW9kZWwueVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHZhciBjaGlsZHJlbkxpc3QgPSBwYXJlbnQuZ2V0KCdjaGlsZHJlbicpO1xuXG4gICAgICBpZiAoIWNoaWxkcmVuTGlzdCkge1xuICAgICAgICBwYXJlbnQuc2V0KCdjaGlsZHJlbicsIFtub2RlXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjaGlsZHJlbkxpc3QucHVzaChub2RlKTtcbiAgICAgIH1cblxuICAgICAgc2VsZi5hZGRJdGVtKCdlZGdlJywge1xuICAgICAgICBzb3VyY2U6IHBhcmVudC5nZXQoJ2lkJyksXG4gICAgICAgIHRhcmdldDogbm9kZS5nZXQoJ2lkJyksXG4gICAgICAgIGlkOiBwYXJlbnQuZ2V0KCdpZCcpICsgXCI6XCIgKyBub2RlLmdldCgnaWQnKVxuICAgICAgfSwgZmFsc2UpO1xuICAgIH0gLy8g5riy5p+T5Yiw6KeG5Zu+5LiK5bqU5Y+C6ICD5biD5bGA55qEY2hpbGRyZW4sIOmBv+WFjeWkmue7mOWItuS6huaUtui1t+eahOiKgueCuVxuXG5cbiAgICBlYWNoKHRyZWVEYXRhLmNoaWxkcmVuIHx8IFtdLCBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgIHNlbGYuaW5uZXJBZGRDaGlsZChjaGlsZCwgbm9kZSwgYW5pbWF0ZSk7XG4gICAgfSk7XG4gICAgc2VsZi5lbWl0KCdhZnRlcmFkZGNoaWxkJywge1xuICAgICAgaXRlbTogbm9kZSxcbiAgICAgIHBhcmVudDogcGFyZW50XG4gICAgfSk7XG4gICAgcmV0dXJuIG5vZGU7XG4gIH07XG4gIC8qKlxuICAgKiDlsIbmlbDmja7kuIrnmoTlj5jmm7TovazmjaLliLDop4blm77kuIpcbiAgICogQHBhcmFtIGRhdGFcbiAgICogQHBhcmFtIHBhcmVudFxuICAgKiBAcGFyYW0gYW5pbWF0ZVxuICAgKi9cblxuXG4gIFRyZWVHcmFwaC5wcm90b3R5cGUuaW5uZXJVcGRhdGVDaGlsZCA9IGZ1bmN0aW9uIChkYXRhLCBwYXJlbnQsIGFuaW1hdGUpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIGN1cnJlbnQgPSBzZWxmLmZpbmRCeUlkKGRhdGEuaWQpOyAvLyDoi6XlrZDmoJHkuI3lrZjlnKjvvIzmlbTkvZPmt7vliqDljbPlj69cblxuICAgIGlmICghY3VycmVudCkge1xuICAgICAgc2VsZi5pbm5lckFkZENoaWxkKGRhdGEsIHBhcmVudCwgYW5pbWF0ZSk7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyDmm7TmlrDmlrDoioLngrnkuIvmiYDmnInlrZDoioLngrlcblxuXG4gICAgZWFjaChkYXRhLmNoaWxkcmVuIHx8IFtdLCBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgIHNlbGYuaW5uZXJVcGRhdGVDaGlsZChjaGlsZCwgY3VycmVudCwgYW5pbWF0ZSk7XG4gICAgfSk7IC8vIOeUqOeOsOWcqOiKgueCueeahGNoaWxkcmVu5a6e5L6L5p2l5Yig6Zmk56e76Zmk55qE5a2Q6IqC54K5XG5cbiAgICB2YXIgY2hpbGRyZW4gPSBjdXJyZW50LmdldCgnY2hpbGRyZW4nKTtcblxuICAgIGlmIChjaGlsZHJlbikge1xuICAgICAgdmFyIGxlbiA9IGNoaWxkcmVuLmxlbmd0aDtcblxuICAgICAgaWYgKGxlbiA+IDApIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IGNoaWxkcmVuLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgdmFyIGNoaWxkID0gY2hpbGRyZW5baV0uZ2V0TW9kZWwoKTtcblxuICAgICAgICAgIGlmIChUcmVlR3JhcGguaW5kZXhPZkNoaWxkKGRhdGEuY2hpbGRyZW4gfHwgW10sIGNoaWxkLmlkKSA9PT0gLTEpIHtcbiAgICAgICAgICAgIHNlbGYuaW5uZXJSZW1vdmVDaGlsZChjaGlsZC5pZCwge1xuICAgICAgICAgICAgICB4OiBkYXRhLngsXG4gICAgICAgICAgICAgIHk6IGRhdGEueVxuICAgICAgICAgICAgfSwgYW5pbWF0ZSk7IC8vIOabtOaWsOeItuiKgueCueS4i+e8k+WtmOeahOWtkOiKgueCuSBpdGVtIOWunuS+i+WIl+ihqFxuXG4gICAgICAgICAgICBjaGlsZHJlbi5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIG9yaVg7XG4gICAgdmFyIG9yaVk7XG5cbiAgICBpZiAoY3VycmVudC5nZXQoJ29yaWdpbkF0dHJzJykpIHtcbiAgICAgIG9yaVggPSBjdXJyZW50LmdldCgnb3JpZ2luQXR0cnMnKS54O1xuICAgICAgb3JpWSA9IGN1cnJlbnQuZ2V0KCdvcmlnaW5BdHRycycpLnk7XG4gICAgfVxuXG4gICAgdmFyIG1vZGVsID0gY3VycmVudC5nZXRNb2RlbCgpO1xuXG4gICAgaWYgKGFuaW1hdGUpIHtcbiAgICAgIC8vIOWmguaenOacieWKqOeUu++8jOWFiOe8k+WtmOiKgueCuei/kOWKqOWGjeabtOaWsOiKgueCuVxuICAgICAgY3VycmVudC5zZXQoJ29yaWdpbkF0dHJzJywge1xuICAgICAgICB4OiBtb2RlbC54LFxuICAgICAgICB5OiBtb2RlbC55XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjdXJyZW50LnNldCgnbW9kZWwnLCBkYXRhLmRhdGEpO1xuXG4gICAgaWYgKG9yaVggIT09IGRhdGEueCB8fCBvcmlZICE9PSBkYXRhLnkpIHtcbiAgICAgIGN1cnJlbnQudXBkYXRlUG9zaXRpb24oe1xuICAgICAgICB4OiBkYXRhLngsXG4gICAgICAgIHk6IGRhdGEueVxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuICAvKipcbiAgICog5Yig6Zmk5a2Q6IqC54K5SXRlbeWvueixoVxuICAgKiBAcGFyYW0gaWRcbiAgICogQHBhcmFtIHRvXG4gICAqIEBwYXJhbSBhbmltYXRlXG4gICAqL1xuXG5cbiAgVHJlZUdyYXBoLnByb3RvdHlwZS5pbm5lclJlbW92ZUNoaWxkID0gZnVuY3Rpb24gKGlkLCB0bywgYW5pbWF0ZSkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgbm9kZSA9IHNlbGYuZmluZEJ5SWQoaWQpO1xuXG4gICAgaWYgKCFub2RlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZWFjaChub2RlLmdldCgnY2hpbGRyZW4nKSwgZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICBzZWxmLmlubmVyUmVtb3ZlQ2hpbGQoY2hpbGQuZ2V0TW9kZWwoKS5pZCwgdG8sIGFuaW1hdGUpO1xuICAgIH0pO1xuXG4gICAgaWYgKGFuaW1hdGUpIHtcbiAgICAgIHZhciBtb2RlbCA9IG5vZGUuZ2V0TW9kZWwoKTtcbiAgICAgIG5vZGUuc2V0KCd0bycsIHRvKTtcbiAgICAgIG5vZGUuc2V0KCdvcmlnaW5BdHRycycsIHtcbiAgICAgICAgeDogbW9kZWwueCxcbiAgICAgICAgeTogbW9kZWwueVxuICAgICAgfSk7XG4gICAgICBzZWxmLmdldCgncmVtb3ZlTGlzdCcpLnB1c2gobm9kZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNlbGYucmVtb3ZlSXRlbShub2RlLCBmYWxzZSk7XG4gICAgfVxuICB9O1xuICAvKipcbiAgICog5pu05paw5pWw5o2u5qih5Z6L77yM5beu6YeP5pu05paw5bm26YeN5paw5riy5p+TXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBkYXRhIOaVsOaNruaooeWei1xuICAgKi9cblxuXG4gIFRyZWVHcmFwaC5wcm90b3R5cGUuY2hhbmdlRGF0YSA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzOyAvLyDmm7TmlLnmlbDmja7mupDlkI7vvIzlj5bmtojmiYDmnInnirbmgIFcblxuICAgIHRoaXMuZ2V0Tm9kZXMoKS5tYXAoZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgIHJldHVybiBzZWxmLmNsZWFySXRlbVN0YXRlcyhub2RlKTtcbiAgICB9KTtcbiAgICB0aGlzLmdldEVkZ2VzKCkubWFwKGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgICByZXR1cm4gc2VsZi5jbGVhckl0ZW1TdGF0ZXMoZWRnZSk7XG4gICAgfSk7XG5cbiAgICBpZiAoZGF0YSkge1xuICAgICAgc2VsZi5kYXRhKGRhdGEpO1xuICAgICAgc2VsZi5yZW5kZXIoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VsZi5sYXlvdXQodGhpcy5nZXQoJ2ZpdFZpZXcnKSk7XG4gICAgfVxuICB9O1xuICAvKipcbiAgICog5bey5pu05ZCN5Li6IHVwZGF0ZUxheW91dO+8jOS4uuS/neaMgeWFvOWuueaaguS4lOS/neeVmeOAglxuICAgKiDmm7TmlLnlubblupTnlKjmoJHluIPlsYDnrpfms5VcbiAgICogQHBhcmFtIHtvYmplY3R9IGxheW91dCDluIPlsYDnrpfms5VcbiAgICovXG5cblxuICBUcmVlR3JhcGgucHJvdG90eXBlLmNoYW5nZUxheW91dCA9IGZ1bmN0aW9uIChsYXlvdXQpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgIGNvbnNvbGUud2FybignUGxlYXNlIGNhbGwgdXBkYXRlTGF5b3V0IGluc3RlYWQgb2YgY2hhbmdlTGF5b3V0LiBjaGFuZ2VMYXlvdXQgd2lsbCBiZSBkaXNjYXJkZWQgc29vbicpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBzZWxmLnVwZGF0ZUxheW91dChsYXlvdXQpO1xuICB9O1xuICAvKipcbiAgICog5pu05pS55bm25bqU55So5qCR5biD5bGA566X5rOVXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBsYXlvdXQg5biD5bGA566X5rOVXG4gICAqL1xuXG5cbiAgVHJlZUdyYXBoLnByb3RvdHlwZS51cGRhdGVMYXlvdXQgPSBmdW5jdGlvbiAobGF5b3V0KSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgaWYgKCFsYXlvdXQpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBjb25zb2xlLndhcm4oJ2xheW91dCBjYW5ub3QgYmUgbnVsbCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHNlbGYuc2V0KCdsYXlvdXQnLCBsYXlvdXQpO1xuICAgIHNlbGYuc2V0KCdsYXlvdXRNZXRob2QnLCBzZWxmLmdldExheW91dCgpKTtcbiAgICBzZWxmLmxheW91dCgpO1xuICB9O1xuICAvKipcbiAgICog5bey5pu05ZCN5Li6IGxheW91dO+8jOS4uuS/neaMgeWFvOWuueaaguS4lOS/neeVmeOAglxuICAgKiDmoLnmja7nm67liY3nmoQgZGF0YSDliLfmlrDluIPlsYDvvIzmm7TmlrDliLDnlLvluIPkuIrjgILnlKjkuo7lj5jmm7TmlbDmja7kuYvlkI7liLfmlrDop4blm77jgIJcbiAgICogQHBhcmFtIHtib29sZWFufSBmaXRWaWV3IOabtOaWsOW4g+WxgOaXtuaYr+WQpumcgOimgemAguW6lOeql+WPo1xuICAgKi9cblxuXG4gIFRyZWVHcmFwaC5wcm90b3R5cGUucmVmcmVzaExheW91dCA9IGZ1bmN0aW9uIChmaXRWaWV3KSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICBjb25zb2xlLndhcm4oJ1BsZWFzZSBjYWxsIGxheW91dCBpbnN0ZWFkIG9mIHJlZnJlc2hMYXlvdXQuIHJlZnJlc2hMYXlvdXQgd2lsbCBiZSBkaXNjYXJkZWQgc29vbicpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBzZWxmLmxheW91dChmaXRWaWV3KTtcbiAgfTtcbiAgLyoqXG4gICAqIOagueaNruebruWJjeeahCBkYXRhIOWIt+aWsOW4g+WxgO+8jOabtOaWsOWIsOeUu+W4g+S4iuOAgueUqOS6juWPmOabtOaVsOaNruS5i+WQjuWIt+aWsOinhuWbvuOAglxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGZpdFZpZXcg5pu05paw5biD5bGA5pe25piv5ZCm6ZyA6KaB6YCC5bqU56qX5Y+jXG4gICAqL1xuXG5cbiAgVHJlZUdyYXBoLnByb3RvdHlwZS5sYXlvdXQgPSBmdW5jdGlvbiAoZml0Vmlldykge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgZGF0YSA9IHNlbGYuZ2V0KCdkYXRhJyk7XG4gICAgdmFyIGxheW91dE1ldGhvZCA9IHNlbGYuZ2V0KCdsYXlvdXRNZXRob2QnKTtcbiAgICB2YXIgbGF5b3V0RGF0YSA9IGxheW91dE1ldGhvZCA/IGxheW91dE1ldGhvZChkYXRhLCBzZWxmLmdldCgnbGF5b3V0JykpIDogZGF0YTtcbiAgICB2YXIgYW5pbWF0ZSA9IHNlbGYuZ2V0KCdhbmltYXRlJyk7XG4gICAgc2VsZi5lbWl0KCdiZWZvcmVyZWZyZXNobGF5b3V0Jywge1xuICAgICAgZGF0YTogZGF0YSxcbiAgICAgIGxheW91dERhdGE6IGxheW91dERhdGFcbiAgICB9KTtcbiAgICBzZWxmLmVtaXQoJ2JlZm9yZWxheW91dCcpO1xuICAgIHNlbGYuaW5uZXJVcGRhdGVDaGlsZChsYXlvdXREYXRhLCB1bmRlZmluZWQsIGFuaW1hdGUpO1xuXG4gICAgaWYgKGZpdFZpZXcpIHtcbiAgICAgIHZhciB2aWV3Q29udHJvbGxlciA9IHNlbGYuZ2V0KCd2aWV3Q29udHJvbGxlcicpO1xuICAgICAgdmlld0NvbnRyb2xsZXIuZml0VmlldygpO1xuICAgIH1cblxuICAgIGlmICghYW5pbWF0ZSkge1xuICAgICAgLy8g5aaC5p6c5rKh5pyJ5Yqo55S777yM55uu5YmN5LuF5pu05paw5LqG6IqC54K555qE5L2N572u77yM5Yi35paw5LiA5LiL6L6555qE5qC35byPXG4gICAgICBzZWxmLnJlZnJlc2goKTtcbiAgICAgIHNlbGYucGFpbnQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VsZi5sYXlvdXRBbmltYXRlKGxheW91dERhdGEpO1xuICAgIH1cblxuICAgIHNlbGYuZW1pdCgnYWZ0ZXJyZWZyZXNobGF5b3V0Jywge1xuICAgICAgZGF0YTogZGF0YSxcbiAgICAgIGxheW91dERhdGE6IGxheW91dERhdGFcbiAgICB9KTtcbiAgICBzZWxmLmVtaXQoJ2FmdGVybGF5b3V0Jyk7XG4gIH07XG4gIC8qKlxuICAgKiDmt7vliqDlrZDmoJHliLDlr7nlupQgaWQg55qE6IqC54K5XG4gICAqIEBwYXJhbSB7VHJlZUdyYXBoRGF0YX0gZGF0YSDlrZDmoJHmlbDmja7mqKHlnotcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmVudCDlrZDmoJHnmoTniLboioLngrlpZFxuICAgKi9cblxuXG4gIFRyZWVHcmFwaC5wcm90b3R5cGUuYWRkQ2hpbGQgPSBmdW5jdGlvbiAoZGF0YSwgcGFyZW50KSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHNlbGYuZW1pdCgnYmVmb3JlYWRkY2hpbGQnLCB7XG4gICAgICBtb2RlbDogZGF0YSxcbiAgICAgIHBhcmVudDogcGFyZW50XG4gICAgfSk7IC8vIOWwhuaVsOaNrua3u+WKoOWIsOa6kOaVsOaNruS4re+8jOi1sGNoYW5nZURhdGHmlrnms5VcblxuICAgIGlmICghaXNTdHJpbmcocGFyZW50KSkge1xuICAgICAgcGFyZW50ID0gcGFyZW50LmdldCgnaWQnKTtcbiAgICB9XG5cbiAgICB2YXIgcGFyZW50RGF0YSA9IHNlbGYuZmluZERhdGFCeUlkKHBhcmVudCk7XG5cbiAgICBpZiAocGFyZW50RGF0YSkge1xuICAgICAgaWYgKCFwYXJlbnREYXRhLmNoaWxkcmVuKSB7XG4gICAgICAgIHBhcmVudERhdGEuY2hpbGRyZW4gPSBbXTtcbiAgICAgIH1cblxuICAgICAgcGFyZW50RGF0YS5jaGlsZHJlbi5wdXNoKGRhdGEpO1xuICAgICAgc2VsZi5jaGFuZ2VEYXRhKCk7XG4gICAgfVxuICB9O1xuICAvKipcbiAgICog5pu05paw5p+Q5Liq6IqC54K55LiL55qE5omA5pyJ5a2Q6IqC54K5XG4gICAqIEBwYXJhbSB7VHJlZUdyYXBoRGF0YVtdfSBkYXRhIOWtkOagkeaVsOaNruaooeWei+mbhuWQiFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyZW50IOWtkOagkeeahOeItuiKgueCuWlkXG4gICAqL1xuXG5cbiAgVHJlZUdyYXBoLnByb3RvdHlwZS51cGRhdGVDaGlsZHJlbiA9IGZ1bmN0aW9uIChkYXRhLCBwYXJlbnRJZCkge1xuICAgIHZhciBzZWxmID0gdGhpczsgLy8g5aaC5p6c5rKh5pyJ54i26IqC54K55oiW5om+5LiN5Yiw6K+l6IqC54K577yM5piv5YWo6YeP55qE5pu05paw77yM55u05o6l6YeN572uZGF0YVxuXG4gICAgaWYgKCFwYXJlbnRJZCB8fCAhc2VsZi5maW5kQnlJZChwYXJlbnRJZCkpIHtcbiAgICAgIGNvbnNvbGUud2FybihcIlVwZGF0ZSBjaGlsZHJlbiBmYWlsZWQhIFRoZXJlIGlzIG5vIG5vZGUgd2l0aCBpZCAnXCIgKyBwYXJlbnRJZCArIFwiJ1wiKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgcGFyZW50TW9kZWwgPSBzZWxmLmZpbmREYXRhQnlJZChwYXJlbnRJZCk7XG4gICAgcGFyZW50TW9kZWwuY2hpbGRyZW4gPSBkYXRhO1xuICAgIHNlbGYuY2hhbmdlRGF0YSgpO1xuICB9O1xuICAvKipcbiAgICog5pu05paw5rqQ5pWw5o2u77yM5beu6YeP5pu05paw5a2Q5qCRXG4gICAqIEBwYXJhbSB7VHJlZUdyYXBoRGF0YX0gZGF0YSDlrZDmoJHmlbDmja7mqKHlnotcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmVudElkIOWtkOagkeeahOeItuiKgueCuWlkXG4gICAqL1xuXG5cbiAgVHJlZUdyYXBoLnByb3RvdHlwZS51cGRhdGVDaGlsZCA9IGZ1bmN0aW9uIChkYXRhLCBwYXJlbnRJZCkge1xuICAgIHZhciBzZWxmID0gdGhpczsgLy8g5aaC5p6c5rKh5pyJ54i26IqC54K55oiW5om+5LiN5Yiw6K+l6IqC54K577yM5piv5YWo6YeP55qE5pu05paw77yM55u05o6l6YeN572uZGF0YVxuXG4gICAgaWYgKCFwYXJlbnRJZCB8fCAhc2VsZi5maW5kQnlJZChwYXJlbnRJZCkpIHtcbiAgICAgIHNlbGYuY2hhbmdlRGF0YShkYXRhKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgcGFyZW50TW9kZWwgPSBzZWxmLmZpbmREYXRhQnlJZChwYXJlbnRJZCk7XG4gICAgdmFyIGN1cnJlbnQgPSBzZWxmLmZpbmRCeUlkKGRhdGEuaWQpO1xuXG4gICAgaWYgKCFwYXJlbnRNb2RlbC5jaGlsZHJlbikge1xuICAgICAgLy8g5b2TIGN1cnJlbnQg5LiN5a2Y5Zyo5pe277yMY2hpbGRyZW4g5Li656m65pWw57uEXG4gICAgICBwYXJlbnRNb2RlbC5jaGlsZHJlbiA9IFtdO1xuICAgIH0gLy8g5aaC5p6c5LiN5a2Y5Zyo6K+l6IqC54K577yM5YiZ5re75YqgXG5cblxuICAgIGlmICghY3VycmVudCkge1xuICAgICAgcGFyZW50TW9kZWwuY2hpbGRyZW4ucHVzaChkYXRhKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGluZGV4ID0gVHJlZUdyYXBoLmluZGV4T2ZDaGlsZChwYXJlbnRNb2RlbC5jaGlsZHJlbiwgZGF0YS5pZCk7XG4gICAgICBwYXJlbnRNb2RlbC5jaGlsZHJlbltpbmRleF0gPSBkYXRhO1xuICAgIH1cblxuICAgIHNlbGYuY2hhbmdlRGF0YSgpO1xuICB9O1xuICAvKipcbiAgICog5Yig6Zmk5a2Q5qCRXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpZCDlrZDmoJHmoLnoioLngrlpZFxuICAgKi9cblxuXG4gIFRyZWVHcmFwaC5wcm90b3R5cGUucmVtb3ZlQ2hpbGQgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIG5vZGUgPSBzZWxmLmZpbmRCeUlkKGlkKTtcblxuICAgIGlmICghbm9kZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBwYXJlbnQgPSBub2RlLmdldCgncGFyZW50Jyk7XG5cbiAgICBpZiAocGFyZW50ICYmICFwYXJlbnQuZGVzdHJveWVkKSB7XG4gICAgICB2YXIgcGFyZW50Tm9kZSA9IHNlbGYuZmluZERhdGFCeUlkKHBhcmVudC5nZXQoJ2lkJykpO1xuICAgICAgdmFyIHNpYmxpbmdzID0gcGFyZW50Tm9kZSAmJiBwYXJlbnROb2RlLmNoaWxkcmVuIHx8IFtdO1xuICAgICAgdmFyIG1vZGVsID0gbm9kZS5nZXRNb2RlbCgpO1xuICAgICAgdmFyIGluZGV4ID0gVHJlZUdyYXBoLmluZGV4T2ZDaGlsZChzaWJsaW5ncywgbW9kZWwuaWQpO1xuICAgICAgc2libGluZ3Muc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG5cbiAgICBzZWxmLmNoYW5nZURhdGEoKTtcbiAgfTtcbiAgLyoqXG4gICAqIOagueaNrmlk6I635Y+W5a+55bqU55qE5rqQ5pWw5o2uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpZCDlhYPntKBpZFxuICAgKiBAcGFyYW0ge1RyZWVHcmFwaERhdGEgfCB1bmRlZmluZWR9IHBhcmVudCDku47lk6rkuKroioLngrnlvIDlp4vlr7vmib7vvIzkuLrnqbrml7bku47moLnoioLngrnlvIDlp4vmn6Xmib5cbiAgICogQHJldHVybiB7VHJlZUdyYXBoRGF0YX0g5a+55bqU5rqQ5pWw5o2uXG4gICAqL1xuXG5cbiAgVHJlZUdyYXBoLnByb3RvdHlwZS5maW5kRGF0YUJ5SWQgPSBmdW5jdGlvbiAoaWQsIHBhcmVudCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgIGlmICghcGFyZW50KSB7XG4gICAgICBwYXJlbnQgPSBzZWxmLmdldCgnZGF0YScpO1xuICAgIH1cblxuICAgIGlmIChpZCA9PT0gcGFyZW50LmlkKSB7XG4gICAgICByZXR1cm4gcGFyZW50O1xuICAgIH1cblxuICAgIHZhciByZXN1bHQgPSBudWxsOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29uc2lzdGVudC1yZXR1cm5cblxuICAgIGVhY2gocGFyZW50LmNoaWxkcmVuIHx8IFtdLCBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgIGlmIChjaGlsZC5pZCA9PT0gaWQpIHtcbiAgICAgICAgcmVzdWx0ID0gY2hpbGQ7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgcmVzdWx0ID0gc2VsZi5maW5kRGF0YUJ5SWQoaWQsIGNoaWxkKTtcblxuICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbiAgLyoqXG4gICAqIOW4g+WxgOWKqOeUu+aOpeWPo++8jOeUqOS6juaVsOaNruabtOaWsOaXtuWBmuiKgueCueS9jee9ruabtOaWsOeahOWKqOeUu1xuICAgKiBAcGFyYW0ge1RyZWVHcmFwaERhdGF9IGRhdGEg5pu05paw55qE5pWw5o2uXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IG9uRnJhbWUg5a6a5LmJ6IqC54K55L2N572u5pu05paw5pe25aaC5L2V56e75YqoXG4gICAqL1xuXG5cbiAgVHJlZUdyYXBoLnByb3RvdHlwZS5sYXlvdXRBbmltYXRlID0gZnVuY3Rpb24gKGRhdGEsIG9uRnJhbWUpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIGFuaW1hdGVDZmcgPSB0aGlzLmdldCgnYW5pbWF0ZUNmZycpO1xuICAgIHNlbGYuZW1pdCgnYmVmb3JlYW5pbWF0ZScsIHtcbiAgICAgIGRhdGE6IGRhdGFcbiAgICB9KTsgLy8g5aaC5p6c6L655Lit5rKh5pyJ5oyH5a6a6ZSa54K577yM5L2G5piv5pys6Lqr5pyJ6ZSa54K55o6n5Yi277yM5Zyo5Yqo55S76L+H56iL5Lit5L+d5oyB6ZSa54K55LiN5Y+YXG5cbiAgICBzZWxmLmdldEVkZ2VzKCkuZm9yRWFjaChmdW5jdGlvbiAoZWRnZSkge1xuICAgICAgdmFyIG1vZGVsID0gZWRnZS5nZXQoJ21vZGVsJyk7XG5cbiAgICAgIGlmICghbW9kZWwuc291cmNlQW5jaG9yKSB7XG4gICAgICAgIG1vZGVsLnNvdXJjZUFuY2hvciA9IGVkZ2UuZ2V0KCdzb3VyY2VBbmNob3JJbmRleCcpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuZ2V0KCdjYW52YXMnKS5hbmltYXRlKGZ1bmN0aW9uIChyYXRpbykge1xuICAgICAgdHJhdmVyc2VUcmVlKGRhdGEsIGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICB2YXIgbm9kZSA9IHNlbGYuZmluZEJ5SWQoY2hpbGQuaWQpOyAvLyDlj6rmnInlvZPlrZjlnKhub2Rl55qE5pe25YCZ5omN5omn6KGMXG5cbiAgICAgICAgaWYgKG5vZGUpIHtcbiAgICAgICAgICB2YXIgb3JpZ2luXzIgPSBub2RlLmdldCgnb3JpZ2luQXR0cnMnKTtcbiAgICAgICAgICB2YXIgbW9kZWwgPSBub2RlLmdldCgnbW9kZWwnKTtcblxuICAgICAgICAgIGlmICghb3JpZ2luXzIpIHtcbiAgICAgICAgICAgIG9yaWdpbl8yID0ge1xuICAgICAgICAgICAgICB4OiBtb2RlbC54LFxuICAgICAgICAgICAgICB5OiBtb2RlbC55XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgbm9kZS5zZXQoJ29yaWdpbkF0dHJzJywgb3JpZ2luXzIpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChvbkZyYW1lKSB7XG4gICAgICAgICAgICB2YXIgYXR0cnMgPSBvbkZyYW1lKG5vZGUsIHJhdGlvLCBvcmlnaW5fMiwgZGF0YSk7XG4gICAgICAgICAgICBub2RlLnNldCgnbW9kZWwnLCBPYmplY3QuYXNzaWduKG1vZGVsLCBhdHRycykpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBtb2RlbC54ID0gb3JpZ2luXzIueCArIChjaGlsZC54IC0gb3JpZ2luXzIueCkgKiByYXRpbztcbiAgICAgICAgICAgIG1vZGVsLnkgPSBvcmlnaW5fMi55ICsgKGNoaWxkLnkgLSBvcmlnaW5fMi55KSAqIHJhdGlvO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSk7XG4gICAgICBlYWNoKHNlbGYuZ2V0KCdyZW1vdmVMaXN0JyksIGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgIHZhciBtb2RlbCA9IG5vZGUuZ2V0TW9kZWwoKTtcbiAgICAgICAgdmFyIGZyb20gPSBub2RlLmdldCgnb3JpZ2luQXR0cnMnKTtcbiAgICAgICAgdmFyIHRvID0gbm9kZS5nZXQoJ3RvJyk7XG4gICAgICAgIG1vZGVsLnggPSBmcm9tLnggKyAodG8ueCAtIGZyb20ueCkgKiByYXRpbztcbiAgICAgICAgbW9kZWwueSA9IGZyb20ueSArICh0by55IC0gZnJvbS55KSAqIHJhdGlvO1xuICAgICAgfSk7XG4gICAgICBzZWxmLnJlZnJlc2hQb3NpdGlvbnMoKTtcbiAgICB9LCB7XG4gICAgICBkdXJhdGlvbjogYW5pbWF0ZUNmZy5kdXJhdGlvbixcbiAgICAgIGVhc2luZzogYW5pbWF0ZUNmZy5lYXNlLFxuICAgICAgY2FsbGJhY2s6IGZ1bmN0aW9uIGNhbGxiYWNrKCkge1xuICAgICAgICBlYWNoKHNlbGYuZ2V0Tm9kZXMoKSwgZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgICBub2RlLnNldCgnb3JpZ2luQXR0cnMnLCBudWxsKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGVhY2goc2VsZi5nZXQoJ3JlbW92ZUxpc3QnKSwgZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgICBzZWxmLnJlbW92ZUl0ZW0obm9kZSk7XG4gICAgICAgIH0pO1xuICAgICAgICBzZWxmLnNldCgncmVtb3ZlTGlzdCcsIFtdKTtcblxuICAgICAgICBpZiAoYW5pbWF0ZUNmZy5jYWxsYmFjaykge1xuICAgICAgICAgIGFuaW1hdGVDZmcuY2FsbGJhY2soKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNlbGYuZW1pdCgnYWZ0ZXJhbmltYXRlJywge1xuICAgICAgICAgIGRhdGE6IGRhdGFcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgZGVsYXk6IGFuaW1hdGVDZmcuZGVsYXlcbiAgICB9KTtcbiAgfTtcbiAgLyoqXG4gICAqIOeri+WNs+WBnOatouW4g+WxgOWKqOeUu1xuICAgKi9cblxuXG4gIFRyZWVHcmFwaC5wcm90b3R5cGUuc3RvcExheW91dEFuaW1hdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5nZXQoJ2NhbnZhcycpLnN0b3BBbmltYXRlKCk7XG4gICAgdGhpcy5lbWl0KCdsYXlvdXRhbmltYXRlZW5kJywge1xuICAgICAgZGF0YTogdGhpcy5nZXQoJ2RhdGEnKVxuICAgIH0pO1xuICAgIHRoaXMubGF5b3V0QW5pbWF0aW5nID0gZmFsc2U7XG4gIH07XG4gIC8qKlxuICAgKiDmmK/lkKblnKjluIPlsYDliqjnlLtcbiAgICogQHJldHVybiB7Ym9vbGVhbn0g5piv5ZCm5pyJ5biD5bGA5Yqo55S7XG4gICAqL1xuXG5cbiAgVHJlZUdyYXBoLnByb3RvdHlwZS5pc0xheW91dEFuaW1hdGluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5sYXlvdXRBbmltYXRpbmc7XG4gIH07XG4gIC8qKlxuICAgKiDmoLnmja5kYXRh5o6l5Y+j55qE5pWw5o2u5riy5p+T6KeG5Zu+XG4gICAqL1xuXG5cbiAgVHJlZUdyYXBoLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBkYXRhID0gc2VsZi5nZXQoJ2RhdGEnKTtcblxuICAgIGlmICghZGF0YSB8fCAhaXNPYmplY3QoZGF0YSkgfHwgIU9iamVjdC5rZXlzKGRhdGEpLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdkYXRhIG11c3QgYmUgZGVmaW5lZCBmaXJzdCcpO1xuICAgIH1cblxuICAgIHNlbGYuY2xlYXIoKTtcbiAgICBzZWxmLmVtaXQoJ2JlZm9yZXJlbmRlcicpO1xuICAgIHNlbGYubGF5b3V0KHRoaXMuZ2V0KCdmaXRWaWV3JykpO1xuICAgIHNlbGYuZW1pdCgnYWZ0ZXJyZW5kZXInKTtcbiAgfTtcbiAgLyoqXG4gICAqIOWvvOWHuuWbvuaVsOaNrlxuICAgKiBAcmV0dXJuIHtvYmplY3R9IGRhdGFcbiAgICovXG5cblxuICBUcmVlR3JhcGgucHJvdG90eXBlLnNhdmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KCdkYXRhJyk7XG4gIH07XG5cbiAgcmV0dXJuIFRyZWVHcmFwaDtcbn0oR3JhcGgpO1xuXG5leHBvcnQgZGVmYXVsdCBUcmVlR3JhcGg7IiwiaW1wb3J0IHsgd3JhcEJlaGF2aW9yLCBlYWNoLCBkZWVwTWl4IH0gZnJvbSAnQGFudHYvdXRpbCc7XG5cbnZhciBQbHVnaW5CYXNlID1cbi8qKiBAY2xhc3MgKi9cbmZ1bmN0aW9uICgpIHtcbiAgLyoqXG4gICAqIOaPkuS7tuWfuuexu+eahOaehOmAoOWHveaVsFxuICAgKiBAcGFyYW0gY2ZncyDmj5Lku7bnmoTphY3nva7poblcbiAgICovXG4gIGZ1bmN0aW9uIFBsdWdpbkJhc2UoY2Zncykge1xuICAgIHRoaXMuX2NmZ3MgPSBkZWVwTWl4KHRoaXMuZ2V0RGVmYXVsdENmZ3MoKSwgY2Zncyk7XG4gICAgdGhpcy5fZXZlbnRzID0ge307XG4gICAgdGhpcy5kZXN0cm95ZWQgPSBmYWxzZTtcbiAgfVxuICAvKipcbiAgICog6I635Y+W6buY6K6k55qE5o+S5Lu26YWN572uXG4gICAqL1xuXG5cbiAgUGx1Z2luQmFzZS5wcm90b3R5cGUuZ2V0RGVmYXVsdENmZ3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9O1xuICAvKipcbiAgICog5Yid5aeL5YyW5o+S5Lu2XG4gICAqIEBwYXJhbSBncmFwaCBJR3JhcGgg5a6e5L6LXG4gICAqL1xuXG5cbiAgUGx1Z2luQmFzZS5wcm90b3R5cGUuaW5pdFBsdWdpbiA9IGZ1bmN0aW9uIChncmFwaCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBzZWxmLnNldCgnZ3JhcGgnLCBncmFwaCk7XG4gICAgdmFyIGV2ZW50cyA9IHNlbGYuZ2V0RXZlbnRzKCk7XG4gICAgdmFyIGJpbmRFdmVudHMgPSB7fTtcbiAgICBlYWNoKGV2ZW50cywgZnVuY3Rpb24gKHYsIGspIHtcbiAgICAgIHZhciBldmVudCA9IHdyYXBCZWhhdmlvcihzZWxmLCB2KTtcbiAgICAgIGJpbmRFdmVudHNba10gPSBldmVudDtcbiAgICAgIGdyYXBoLm9uKGssIGV2ZW50KTtcbiAgICB9KTtcbiAgICB0aGlzLl9ldmVudHMgPSBiaW5kRXZlbnRzO1xuICAgIHRoaXMuaW5pdCgpO1xuICB9O1xuICAvKipcbiAgICog6I635Y+W5o+S5Lu25Lit55qE5LqL5Lu25ZKM5LqL5Lu25aSE55CG5pa55rOV77yM5L6b5a2Q57G75a6e546wXG4gICAqL1xuXG5cbiAgUGx1Z2luQmFzZS5wcm90b3R5cGUuZ2V0RXZlbnRzID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB7fTtcbiAgfTtcbiAgLyoqXG4gICAqIOiOt+WPlumFjee9rumhueS4reeahOafkOS4quWAvFxuICAgKiBAcGFyYW0ga2V5IOmUruWAvFxuICAgKi9cblxuXG4gIFBsdWdpbkJhc2UucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICB2YXIgX2E7XG5cbiAgICByZXR1cm4gKF9hID0gdGhpcy5fY2ZncykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hW2tleV07XG4gIH07XG4gIC8qKlxuICAgKiDlsIbmjIflrprnmoTlgLzlrZjlgqjliLAgY2ZncyDkuK1cbiAgICogQHBhcmFtIGtleSDplK7lgLxcbiAgICogQHBhcmFtIHZhbCDorr7nva7nmoTlgLxcbiAgICovXG5cblxuICBQbHVnaW5CYXNlLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAoa2V5LCB2YWwpIHtcbiAgICB0aGlzLl9jZmdzW2tleV0gPSB2YWw7XG4gIH07XG4gIC8qKlxuICAgKiDplIDmr4Hmlrnms5XvvIzkvpvlrZDnsbvlpI3lhplcbiAgICovXG5cblxuICBQbHVnaW5CYXNlLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gKCkge307XG4gIC8qKlxuICAgKiDplIDmr4Hmj5Lku7ZcbiAgICovXG5cblxuICBQbHVnaW5CYXNlLnByb3RvdHlwZS5kZXN0cm95UGx1Z2luID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuZGVzdHJveSgpO1xuICAgIHZhciBncmFwaCA9IHRoaXMuZ2V0KCdncmFwaCcpO1xuICAgIHZhciBldmVudHMgPSB0aGlzLl9ldmVudHM7XG4gICAgZWFjaChldmVudHMsIGZ1bmN0aW9uICh2LCBrKSB7XG4gICAgICBncmFwaC5vZmYoaywgdik7XG4gICAgfSk7XG4gICAgdGhpcy5fZXZlbnRzID0gbnVsbDtcbiAgICB0aGlzLl9jZmdzID0gbnVsbDtcbiAgICB0aGlzLmRlc3Ryb3llZCA9IHRydWU7XG4gIH07XG5cbiAgcmV0dXJuIFBsdWdpbkJhc2U7XG59KCk7XG5cbmV4cG9ydCBkZWZhdWx0IFBsdWdpbkJhc2U7IiwidmFyIF9fZXh0ZW5kcyA9IHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMgfHwgZnVuY3Rpb24gKCkge1xuICB2YXIgX2V4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbiBleHRlbmRTdGF0aWNzKGQsIGIpIHtcbiAgICBfZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCB7XG4gICAgICBfX3Byb3RvX186IFtdXG4gICAgfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICBkLl9fcHJvdG9fXyA9IGI7XG4gICAgfSB8fCBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgZm9yICh2YXIgcCBpbiBiKSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdO1xuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gX2V4dGVuZFN0YXRpY3MoZCwgYik7XG4gIH07XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgaWYgKHR5cGVvZiBiICE9PSBcImZ1bmN0aW9uXCIgJiYgYiAhPT0gbnVsbCkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNsYXNzIGV4dGVuZHMgdmFsdWUgXCIgKyBTdHJpbmcoYikgKyBcIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsXCIpO1xuXG4gICAgX2V4dGVuZFN0YXRpY3MoZCwgYik7XG5cbiAgICBmdW5jdGlvbiBfXygpIHtcbiAgICAgIHRoaXMuY29uc3RydWN0b3IgPSBkO1xuICAgIH1cblxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgfTtcbn0oKTtcblxuaW1wb3J0IHsgbW9kaWZ5Q1NTLCBjcmVhdGVEb20gfSBmcm9tICdAYW50di9kb20tdXRpbCc7XG5pbXBvcnQgQmFzZSBmcm9tICcuLi9iYXNlJzsgLy8g572R5qC86IOM5pmv5Zu+54mHXG5cbnZhciBHUklEX1BORyA9ICd1cmwoZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCM2FXUjBhRDBpTkRBaUlHaGxhV2RvZEQwaU5EQWlJSGh0Ykc1elBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHlNREF3TDNOMlp5SStQR1JsWm5NK1BIQmhkSFJsY200Z2FXUTlJbWR5YVdRaUlIZHBaSFJvUFNJME1DSWdhR1ZwWjJoMFBTSTBNQ0lnY0dGMGRHVnlibFZ1YVhSelBTSjFjMlZ5VTNCaFkyVlBibFZ6WlNJK1BIQmhkR2dnWkQwaVRTQXdJREV3SUV3Z05EQWdNVEFnVFNBeE1DQXdJRXdnTVRBZ05EQWdUU0F3SURJd0lFd2dOREFnTWpBZ1RTQXlNQ0F3SUV3Z01qQWdOREFnVFNBd0lETXdJRXdnTkRBZ016QWdUU0F6TUNBd0lFd2dNekFnTkRBaUlHWnBiR3c5SW01dmJtVWlJSE4wY205clpUMGlJMlV3WlRCbE1DSWdiM0JoWTJsMGVUMGlNQzR5SWlCemRISnZhMlV0ZDJsa2RHZzlJakVpTHo0OGNHRjBhQ0JrUFNKTklEUXdJREFnVENBd0lEQWdNQ0EwTUNJZ1ptbHNiRDBpYm05dVpTSWdjM1J5YjJ0bFBTSWpaVEJsTUdVd0lpQnpkSEp2YTJVdGQybGtkR2c5SWpFaUx6NDhMM0JoZEhSbGNtNCtQQzlrWldaelBqeHlaV04wSUhkcFpIUm9QU0l4TURBbElpQm9aV2xuYUhROUlqRXdNQ1VpSUdacGJHdzlJblZ5YkNnalozSnBaQ2tpTHo0OEwzTjJaejQ9KSc7XG5cbnZhciBHcmlkID1cbi8qKiBAY2xhc3MgKi9cbmZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgX19leHRlbmRzKEdyaWQsIF9zdXBlcik7XG5cbiAgZnVuY3Rpb24gR3JpZChjb25maWcpIHtcbiAgICByZXR1cm4gX3N1cGVyLmNhbGwodGhpcywgY29uZmlnKSB8fCB0aGlzO1xuICB9XG5cbiAgR3JpZC5wcm90b3R5cGUuZ2V0RGVmYXVsdENmZ3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGltZzogR1JJRF9QTkcsXG4gICAgICBmb2xsb3c6IHRydWVcbiAgICB9O1xuICB9O1xuXG4gIEdyaWQucHJvdG90eXBlLmluaXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGdyYXBoID0gdGhpcy5nZXQoJ2dyYXBoJyk7XG4gICAgdmFyIGdyYXBoQ29udGFpbmVyID0gZ3JhcGguZ2V0KCdjb250YWluZXInKTtcbiAgICB2YXIgY2FudmFzID0gZ3JhcGguZ2V0KCdjYW52YXMnKS5nZXQoJ2VsJyk7XG4gICAgdmFyIGltZyA9IHRoaXMuZ2V0KCdpbWcnKSB8fCBHUklEX1BORztcbiAgICB2YXIgY29udGFpbmVyID0gY3JlYXRlRG9tKFwiPGRpdiBjbGFzcz0nZzYtZ3JpZC1jb250YWluZXInIHN0eWxlPVxcXCJwb3NpdGlvbjphYnNvbHV0ZTtvdmVyZmxvdzpoaWRkZW47ei1pbmRleDogLTE7XFxcIj48L2Rpdj5cIik7XG4gICAgdmFyIGdyaWRDb250YWluZXIgPSBjcmVhdGVEb20oXCI8ZGl2XFxuICAgICAgICBjbGFzcz0nZzYtZ3JpZCdcXG4gICAgICAgIHN0eWxlPSdwb3NpdGlvbjphYnNvbHV0ZTtcXG4gICAgICAgIGJhY2tncm91bmQtaW1hZ2U6IFwiICsgaW1nICsgXCI7XFxuICAgICAgICB1c2VyLXNlbGVjdDogbm9uZVxcbiAgICAgICAgJz48L2Rpdj5cIik7XG4gICAgdGhpcy5zZXQoJ2NvbnRhaW5lcicsIGNvbnRhaW5lcik7XG4gICAgdGhpcy5zZXQoJ2dyaWRDb250YWluZXInLCBncmlkQ29udGFpbmVyKTtcbiAgICB0aGlzLnBvc2l0aW9uSW5pdCgpO1xuICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChncmlkQ29udGFpbmVyKTtcbiAgICBncmFwaENvbnRhaW5lci5pbnNlcnRCZWZvcmUoY29udGFpbmVyLCBjYW52YXMpO1xuICB9O1xuICAvKiog5a6a5L2N5L+h5oGv5Yid5aeL5YyWICovXG5cblxuICBHcmlkLnByb3RvdHlwZS5wb3NpdGlvbkluaXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGdyYXBoID0gdGhpcy5nZXQoJ2dyYXBoJyk7XG4gICAgdmFyIG1pblpvb20gPSBncmFwaC5nZXQoJ21pblpvb20nKTtcbiAgICB2YXIgd2lkdGggPSBncmFwaC5nZXQoJ3dpZHRoJyk7XG4gICAgdmFyIGhlaWdodCA9IGdyYXBoLmdldCgnaGVpZ2h0Jyk7XG4gICAgbW9kaWZ5Q1NTKHRoaXMuZ2V0KCdjb250YWluZXInKSwge1xuICAgICAgd2lkdGg6IHdpZHRoICsgXCJweFwiLFxuICAgICAgaGVpZ2h0OiBoZWlnaHQgKyBcInB4XCJcbiAgICB9KTsgLy8g572R5qC8IDQwKjQwIOmcgOS/neivgSAoZ3JpZENvbnRhaW5lcldpZHRoIC8gMikgJSA0MCA9IDAg5omN6IO96K6p572R5qC857q/5a+56b2Q5bem5LiK6KeSIOaVhSAqIDgwXG5cbiAgICB2YXIgZ3JpZENvbnRhaW5lcldpZHRoID0gd2lkdGggKiA4MCAvIG1pblpvb207XG4gICAgdmFyIGdyaWRDb250YWluZXJIZWlnaHQgPSBoZWlnaHQgKiA4MCAvIG1pblpvb207XG4gICAgbW9kaWZ5Q1NTKHRoaXMuZ2V0KCdncmlkQ29udGFpbmVyJyksIHtcbiAgICAgIHdpZHRoOiBncmlkQ29udGFpbmVyV2lkdGggKyBcInB4XCIsXG4gICAgICBoZWlnaHQ6IGdyaWRDb250YWluZXJIZWlnaHQgKyBcInB4XCIsXG4gICAgICBsZWZ0OiBcIi1cIiArIGdyaWRDb250YWluZXJXaWR0aCAvIDIgKyBcInB4XCIsXG4gICAgICB0b3A6IFwiLVwiICsgZ3JpZENvbnRhaW5lckhlaWdodCAvIDIgKyBcInB4XCJcbiAgICB9KTtcbiAgfTsgLy8gY2xhc3MtbWV0aG9kcy11c2UtdGhpc1xuXG5cbiAgR3JpZC5wcm90b3R5cGUuZ2V0RXZlbnRzID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB7XG4gICAgICB2aWV3cG9ydGNoYW5nZTogJ3VwZGF0ZUdyaWQnXG4gICAgfTtcbiAgfTtcbiAgLyoqXG4gICAqIHZpZXdwb3J0IGNoYW5nZSDkuovku7bnmoTlk43lupTlh73mlbBcbiAgICogQHBhcmFtIHBhcmFtXG4gICAqL1xuXG5cbiAgR3JpZC5wcm90b3R5cGUudXBkYXRlR3JpZCA9IGZ1bmN0aW9uIChwYXJhbSkge1xuICAgIHZhciBncmlkQ29udGFpbmVyID0gdGhpcy5nZXQoJ2dyaWRDb250YWluZXInKTtcbiAgICB2YXIgbWF0cml4ID0gcGFyYW0ubWF0cml4O1xuICAgIGlmICghbWF0cml4KSBtYXRyaXggPSBbMSwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMV07XG4gICAgdmFyIGlzRm9sbG93ID0gdGhpcy5nZXQoJ2ZvbGxvdycpO1xuICAgIHZhciB0cmFuc2Zvcm0gPSBcIm1hdHJpeChcIiArIG1hdHJpeFswXSArIFwiLCBcIiArIG1hdHJpeFsxXSArIFwiLCBcIiArIG1hdHJpeFszXSArIFwiLCBcIiArIG1hdHJpeFs0XSArIFwiLCBcIiArIChpc0ZvbGxvdyA/IG1hdHJpeFs2XSA6ICcwJykgKyBcIiwgXCIgKyAoaXNGb2xsb3cgPyBtYXRyaXhbN10gOiAnMCcpICsgXCIpXCI7XG4gICAgbW9kaWZ5Q1NTKGdyaWRDb250YWluZXIsIHtcbiAgICAgIHRyYW5zZm9ybTogdHJhbnNmb3JtXG4gICAgfSk7XG4gIH07XG5cbiAgR3JpZC5wcm90b3R5cGUuZ2V0Q29udGFpbmVyID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLmdldCgnY29udGFpbmVyJyk7XG4gIH07XG5cbiAgR3JpZC5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZ3JhcGggPSB0aGlzLmdldCgnZ3JhcGgnKTtcbiAgICB2YXIgZ3JhcGhDb250YWluZXIgPSBncmFwaC5nZXQoJ2NvbnRhaW5lcicpO1xuICAgIHZhciBjb250YWluZXIgPSB0aGlzLmdldCgnY29udGFpbmVyJyk7XG4gICAgZ3JhcGhDb250YWluZXIucmVtb3ZlQ2hpbGQoY29udGFpbmVyKTtcbiAgfTtcblxuICByZXR1cm4gR3JpZDtcbn0oQmFzZSk7XG5cbmV4cG9ydCBkZWZhdWx0IEdyaWQ7IiwidmFyIF9fZXh0ZW5kcyA9IHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMgfHwgZnVuY3Rpb24gKCkge1xuICB2YXIgX2V4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbiBleHRlbmRTdGF0aWNzKGQsIGIpIHtcbiAgICBfZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCB7XG4gICAgICBfX3Byb3RvX186IFtdXG4gICAgfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICBkLl9fcHJvdG9fXyA9IGI7XG4gICAgfSB8fCBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgZm9yICh2YXIgcCBpbiBiKSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdO1xuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gX2V4dGVuZFN0YXRpY3MoZCwgYik7XG4gIH07XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgaWYgKHR5cGVvZiBiICE9PSBcImZ1bmN0aW9uXCIgJiYgYiAhPT0gbnVsbCkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNsYXNzIGV4dGVuZHMgdmFsdWUgXCIgKyBTdHJpbmcoYikgKyBcIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsXCIpO1xuXG4gICAgX2V4dGVuZFN0YXRpY3MoZCwgYik7XG5cbiAgICBmdW5jdGlvbiBfXygpIHtcbiAgICAgIHRoaXMuY29uc3RydWN0b3IgPSBkO1xuICAgIH1cblxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgfTtcbn0oKTtcblxuaW1wb3J0IHsgbW9kaWZ5Q1NTLCBjcmVhdGVEb20gfSBmcm9tICdAYW50di9kb20tdXRpbCc7XG5pbXBvcnQgeyBpc1N0cmluZyB9IGZyb20gJ0BhbnR2L3V0aWwnO1xuaW1wb3J0IGluc2VydENzcyBmcm9tICdpbnNlcnQtY3NzJztcbmltcG9ydCBCYXNlIGZyb20gJy4uL2Jhc2UnO1xudHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyAmJiBpbnNlcnRDc3MoXCJcXG4gIC5nNi1jb21wb25lbnQtY29udGV4dG1lbnUge1xcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjZTJlMmUyO1xcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XFxuICAgIGZvbnQtc2l6ZTogMTJweDtcXG4gICAgY29sb3I6ICM1NDU0NTQ7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45KTtcXG4gICAgcGFkZGluZzogMTBweCA4cHg7XFxuICAgIGJveC1zaGFkb3c6IHJnYigxNzQsIDE3NCwgMTc0KSAwcHggMHB4IDEwcHg7XFxuICB9XFxuICAuZzYtY29udGV4dG1lbnUtdWwge1xcbiAgICBwYWRkaW5nOiAwO1xcbiAgICBtYXJnaW46IDA7XFxuICAgIGxpc3Qtc3R5bGU6IG5vbmU7XFxuICB9XFxuXFxuXCIpO1xuXG52YXIgTWVudSA9XG4vKiogQGNsYXNzICovXG5mdW5jdGlvbiAoX3N1cGVyKSB7XG4gIF9fZXh0ZW5kcyhNZW51LCBfc3VwZXIpO1xuXG4gIGZ1bmN0aW9uIE1lbnUoY29uZmlnKSB7XG4gICAgcmV0dXJuIF9zdXBlci5jYWxsKHRoaXMsIGNvbmZpZykgfHwgdGhpcztcbiAgfVxuXG4gIE1lbnUucHJvdG90eXBlLmdldERlZmF1bHRDZmdzID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB7XG4gICAgICBvZmZzZXRYOiA2LFxuICAgICAgb2Zmc2V0WTogNixcbiAgICAgIGhhbmRsZU1lbnVDbGljazogdW5kZWZpbmVkLFxuICAgICAgLy8g5oyH5a6a6I+c5Y2V5YaF5a6577yMZnVuY3Rpb24oZSkgey4uLn1cbiAgICAgIGdldENvbnRlbnQ6IGZ1bmN0aW9uIGdldENvbnRlbnQoZSkge1xuICAgICAgICByZXR1cm4gXCJcXG4gICAgICAgICAgPHVsIGNsYXNzPSdnNi1jb250ZXh0bWVudS11bCc+XFxuICAgICAgICAgICAgPGxpPlxcdTgzRENcXHU1MzU1XFx1OTg3OTE8L2xpPlxcbiAgICAgICAgICAgIDxsaT5cXHU4M0RDXFx1NTM1NVxcdTk4NzkyPC9saT5cXG4gICAgICAgICAgPC91bD5cXG4gICAgICAgIFwiO1xuICAgICAgfSxcbiAgICAgIHNob3VsZEJlZ2luOiBmdW5jdGlvbiBzaG91bGRCZWdpbihlKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSxcbiAgICAgIC8vIOiPnOWNlemakOiXj+S6i+S7tlxuICAgICAgb25IaWRlOiBmdW5jdGlvbiBvbkhpZGUoKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSxcbiAgICAgIGl0ZW1UeXBlczogWydub2RlJywgJ2VkZ2UnLCAnY29tYm8nXSxcbiAgICAgIHRyaWdnZXI6ICdjb250ZXh0bWVudSdcbiAgICB9O1xuICB9OyAvLyBjbGFzcy1tZXRob2RzLXVzZS10aGlzXG5cblxuICBNZW51LnByb3RvdHlwZS5nZXRFdmVudHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHRoaXMuZ2V0KCd0cmlnZ2VyJykgPT09ICdjbGljaycpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNsaWNrOiAnb25NZW51U2hvdydcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRleHRtZW51OiAnb25NZW51U2hvdydcbiAgICB9O1xuICB9O1xuXG4gIE1lbnUucHJvdG90eXBlLmluaXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGNsYXNzTmFtZSA9IHRoaXMuZ2V0KCdjbGFzc05hbWUnKTtcbiAgICB2YXIgbWVudSA9IGNyZWF0ZURvbShcIjxkaXYgY2xhc3M9XCIgKyAoY2xhc3NOYW1lIHx8ICdnNi1jb21wb25lbnQtY29udGV4dG1lbnUnKSArIFwiPjwvZGl2PlwiKTtcbiAgICBtb2RpZnlDU1MobWVudSwge1xuICAgICAgdG9wOiAnMHB4JyxcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgdmlzaWJpbGl0eTogJ2hpZGRlbidcbiAgICB9KTtcbiAgICB2YXIgY29udGFpbmVyID0gdGhpcy5nZXQoJ2NvbnRhaW5lcicpO1xuXG4gICAgaWYgKCFjb250YWluZXIpIHtcbiAgICAgIGNvbnRhaW5lciA9IHRoaXMuZ2V0KCdncmFwaCcpLmdldCgnY29udGFpbmVyJyk7XG4gICAgfVxuXG4gICAgaWYgKGlzU3RyaW5nKGNvbnRhaW5lcikpIHtcbiAgICAgIGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGNvbnRhaW5lcik7XG4gICAgfVxuXG4gICAgY29udGFpbmVyLmFwcGVuZENoaWxkKG1lbnUpO1xuICAgIHRoaXMuc2V0KCdtZW51JywgbWVudSk7XG4gIH07XG5cbiAgTWVudS5wcm90b3R5cGUub25NZW51U2hvdyA9IGZ1bmN0aW9uIChlKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB2YXIgaXRlbVR5cGVzID0gdGhpcy5nZXQoJ2l0ZW1UeXBlcycpO1xuXG4gICAgaWYgKCFlLml0ZW0pIHtcbiAgICAgIGlmIChpdGVtVHlwZXMuaW5kZXhPZignY2FudmFzJykgPT09IC0xKSB7XG4gICAgICAgIHNlbGYub25NZW51SGlkZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChlLml0ZW0gJiYgZS5pdGVtLmdldFR5cGUgJiYgaXRlbVR5cGVzLmluZGV4T2YoZS5pdGVtLmdldFR5cGUoKSkgPT09IC0xKSB7XG4gICAgICAgIHNlbGYub25NZW51SGlkZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHNob3VsZEJlZ2luID0gdGhpcy5nZXQoJ3Nob3VsZEJlZ2luJyk7XG4gICAgaWYgKCFzaG91bGRCZWdpbihlKSkgcmV0dXJuO1xuICAgIHZhciBtZW51RG9tID0gdGhpcy5nZXQoJ21lbnUnKTtcbiAgICB2YXIgZ2V0Q29udGVudCA9IHRoaXMuZ2V0KCdnZXRDb250ZW50Jyk7XG4gICAgdmFyIGdyYXBoID0gdGhpcy5nZXQoJ2dyYXBoJyk7XG4gICAgdmFyIG1lbnUgPSBnZXRDb250ZW50KGUsIGdyYXBoKTtcblxuICAgIGlmIChpc1N0cmluZyhtZW51KSkge1xuICAgICAgbWVudURvbS5pbm5lckhUTUwgPSBtZW51O1xuICAgIH0gZWxzZSB7XG4gICAgICBtZW51RG9tLmlubmVySFRNTCA9IG1lbnUub3V0ZXJIVE1MO1xuICAgIH0gLy8g5riF6Zmk5LmL5YmN55uR5ZCs55qE5LqL5Lu2XG5cblxuICAgIHRoaXMucmVtb3ZlTWVudUV2ZW50TGlzdGVuZXIoKTtcbiAgICB2YXIgaGFuZGxlTWVudUNsaWNrID0gdGhpcy5nZXQoJ2hhbmRsZU1lbnVDbGljaycpO1xuXG4gICAgaWYgKGhhbmRsZU1lbnVDbGljaykge1xuICAgICAgdmFyIGhhbmRsZU1lbnVDbGlja1dyYXBwZXIgPSBmdW5jdGlvbiBoYW5kbGVNZW51Q2xpY2tXcmFwcGVyKGV2dCkge1xuICAgICAgICBoYW5kbGVNZW51Q2xpY2soZXZ0LnRhcmdldCwgZS5pdGVtLCBncmFwaCk7XG4gICAgICB9O1xuXG4gICAgICB0aGlzLnNldCgnaGFuZGxlTWVudUNsaWNrV3JhcHBlcicsIGhhbmRsZU1lbnVDbGlja1dyYXBwZXIpO1xuICAgICAgbWVudURvbS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGhhbmRsZU1lbnVDbGlja1dyYXBwZXIpO1xuICAgIH1cblxuICAgIHZhciB3aWR0aCA9IGdyYXBoLmdldCgnd2lkdGgnKTtcbiAgICB2YXIgaGVpZ2h0ID0gZ3JhcGguZ2V0KCdoZWlnaHQnKTtcbiAgICB2YXIgYmJveCA9IG1lbnVEb20uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgdmFyIG9mZnNldFggPSB0aGlzLmdldCgnb2Zmc2V0WCcpIHx8IDA7XG4gICAgdmFyIG9mZnNldFkgPSB0aGlzLmdldCgnb2Zmc2V0WScpIHx8IDA7XG4gICAgdmFyIGdyYXBoVG9wID0gZ3JhcGguZ2V0Q29udGFpbmVyKCkub2Zmc2V0VG9wO1xuICAgIHZhciBncmFwaExlZnQgPSBncmFwaC5nZXRDb250YWluZXIoKS5vZmZzZXRMZWZ0O1xuICAgIHZhciB4ID0gZS5jYW52YXNYICsgZ3JhcGhMZWZ0ICsgb2Zmc2V0WDtcbiAgICB2YXIgeSA9IGUuY2FudmFzWSArIGdyYXBoVG9wICsgb2Zmc2V0WTsgLy8gd2hlbiB0aGUgbWVudSBpcyAocGFydCBvZikgb3V0IG9mIHRoZSBjYW52YXNcblxuICAgIGlmICh4ICsgYmJveC53aWR0aCA+IHdpZHRoKSB7XG4gICAgICB4ID0gZS5jYW52YXNYIC0gYmJveC53aWR0aCAtIG9mZnNldFggKyBncmFwaExlZnQ7XG4gICAgfVxuXG4gICAgaWYgKHkgKyBiYm94LmhlaWdodCA+IGhlaWdodCkge1xuICAgICAgeSA9IGUuY2FudmFzWSAtIGJib3guaGVpZ2h0IC0gb2Zmc2V0WSArIGdyYXBoVG9wO1xuICAgIH1cblxuICAgIG1vZGlmeUNTUyhtZW51RG9tLCB7XG4gICAgICB0b3A6IHkgKyBcInB4XCIsXG4gICAgICBsZWZ0OiB4ICsgXCJweFwiLFxuICAgICAgdmlzaWJpbGl0eTogJ3Zpc2libGUnXG4gICAgfSk7IC8vIOW3pumUruWNleWHu+S8muinpuWPkSBib2R5IOS4iuebkeWQrOeahCBjbGljayDkuovku7bvvIzlr7zoh7Toj5zljZXlsZXnpLrlh7rmnaXlkI7lj4jnq4vljbPooqvpmpDol4/kuobvvIzpnIDopoHov4fmu6TmjolcblxuICAgIHZhciB0cmlnZ2VyZWRCeUZpcnN0Q2xpY2sgPSB0aGlzLmdldCgndHJpZ2dlcicpID09PSAnY2xpY2snO1xuXG4gICAgdmFyIGhhbmRsZXIgPSBmdW5jdGlvbiBoYW5kbGVyKGV2dCkge1xuICAgICAgaWYgKHRyaWdnZXJlZEJ5Rmlyc3RDbGljaykge1xuICAgICAgICB0cmlnZ2VyZWRCeUZpcnN0Q2xpY2sgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBzZWxmLm9uTWVudUhpZGUoKTtcbiAgICB9OyAvLyDlpoLmnpzlnKjpobXpnaLkuK3lhbbku5bku7vmhI/lnLDmlrnov5vooYxjbGljaywg6ZqQ5Y676I+c5Y2VXG5cblxuICAgIGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVyKTtcbiAgICB0aGlzLnNldCgnaGFuZGxlcicsIGhhbmRsZXIpO1xuICB9O1xuXG4gIE1lbnUucHJvdG90eXBlLnJlbW92ZU1lbnVFdmVudExpc3RlbmVyID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBoYW5kbGVNZW51Q2xpY2tXcmFwcGVyID0gdGhpcy5nZXQoJ2hhbmRsZU1lbnVDbGlja1dyYXBwZXInKTtcbiAgICB2YXIgaGFuZGxlciA9IHRoaXMuZ2V0KCdoYW5kbGVyJyk7XG5cbiAgICBpZiAoaGFuZGxlTWVudUNsaWNrV3JhcHBlcikge1xuICAgICAgdmFyIG1lbnVEb20gPSB0aGlzLmdldCgnbWVudScpO1xuICAgICAgbWVudURvbS5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIGhhbmRsZU1lbnVDbGlja1dyYXBwZXIpO1xuICAgICAgdGhpcy5zZXQoJ2hhbmRsZU1lbnVDbGlja1dyYXBwZXInLCBudWxsKTtcbiAgICB9XG5cbiAgICBpZiAoaGFuZGxlcikge1xuICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIGhhbmRsZXIpO1xuICAgIH1cbiAgfTtcblxuICBNZW51LnByb3RvdHlwZS5vbk1lbnVIaWRlID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBtZW51RG9tID0gdGhpcy5nZXQoJ21lbnUnKTtcblxuICAgIGlmIChtZW51RG9tKSB7XG4gICAgICBtb2RpZnlDU1MobWVudURvbSwge1xuICAgICAgICB2aXNpYmlsaXR5OiAnaGlkZGVuJ1xuICAgICAgfSk7XG4gICAgfSAvLyDpmpDol4/oj5zljZXlkI7pnIDopoHnp7vpmaTkuovku7bnm5HlkKxcblxuXG4gICAgdGhpcy5yZW1vdmVNZW51RXZlbnRMaXN0ZW5lcigpO1xuICB9O1xuXG4gIE1lbnUucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIG1lbnUgPSB0aGlzLmdldCgnbWVudScpO1xuICAgIHRoaXMucmVtb3ZlTWVudUV2ZW50TGlzdGVuZXIoKTtcblxuICAgIGlmIChtZW51KSB7XG4gICAgICB2YXIgY29udGFpbmVyID0gdGhpcy5nZXQoJ2NvbnRhaW5lcicpO1xuXG4gICAgICBpZiAoIWNvbnRhaW5lcikge1xuICAgICAgICBjb250YWluZXIgPSB0aGlzLmdldCgnZ3JhcGgnKS5nZXQoJ2NvbnRhaW5lcicpO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNTdHJpbmcoY29udGFpbmVyKSkge1xuICAgICAgICBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChjb250YWluZXIpO1xuICAgICAgfVxuXG4gICAgICBjb250YWluZXIucmVtb3ZlQ2hpbGQobWVudSk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBNZW51O1xufShCYXNlKTtcblxuZXhwb3J0IGRlZmF1bHQgTWVudTsiLCJ2YXIgX19leHRlbmRzID0gdGhpcyAmJiB0aGlzLl9fZXh0ZW5kcyB8fCBmdW5jdGlvbiAoKSB7XG4gIHZhciBfZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uIGV4dGVuZFN0YXRpY3MoZCwgYikge1xuICAgIF9leHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8IHtcbiAgICAgIF9fcHJvdG9fXzogW11cbiAgICB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgIGQuX19wcm90b19fID0gYjtcbiAgICB9IHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICBmb3IgKHZhciBwIGluIGIpIHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBwKSkgZFtwXSA9IGJbcF07XG4gICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiBfZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgfTtcblxuICByZXR1cm4gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICBpZiAodHlwZW9mIGIgIT09IFwiZnVuY3Rpb25cIiAmJiBiICE9PSBudWxsKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2xhc3MgZXh0ZW5kcyB2YWx1ZSBcIiArIFN0cmluZyhiKSArIFwiIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGxcIik7XG5cbiAgICBfZXh0ZW5kU3RhdGljcyhkLCBiKTtcblxuICAgIGZ1bmN0aW9uIF9fKCkge1xuICAgICAgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7XG4gICAgfVxuXG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xuICB9O1xufSgpO1xuXG52YXIgX19hc3NpZ24gPSB0aGlzICYmIHRoaXMuX19hc3NpZ24gfHwgZnVuY3Rpb24gKCkge1xuICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHQpIHtcbiAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgIHMgPSBhcmd1bWVudHNbaV07XG5cbiAgICAgIGZvciAodmFyIHAgaW4gcykge1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0W3BdID0gc1twXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdDtcbiAgfTtcblxuICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn07XG5cbmltcG9ydCB7IENhbnZhcyBhcyBHQ2FudmFzIH0gZnJvbSAnQGFudHYvZy1jYW52YXMnO1xuaW1wb3J0IHsgQ2FudmFzIGFzIEdTVkdDYW52YXMgfSBmcm9tICdAYW50di9nLXN2Zyc7XG5pbXBvcnQgeyBpc1N0cmluZywgaXNOaWwsIGVhY2gsIGRlYm91bmNlIH0gZnJvbSAnQGFudHYvdXRpbCc7XG5pbXBvcnQgeyBjcmVhdGVEb20sIG1vZGlmeUNTUyB9IGZyb20gJ0BhbnR2L2RvbS11dGlsJztcbmltcG9ydCB7IGV4dCB9IGZyb20gJ0BhbnR2L21hdHJpeC11dGlsJztcbmltcG9ydCBCYXNlIGZyb20gJy4uL2Jhc2UnO1xudmFyIG1heCA9IE1hdGgubWF4O1xudmFyIHRyYW5zZm9ybSA9IGV4dC50cmFuc2Zvcm07XG52YXIgREVGQVVMVF9NT0RFID0gJ2RlZmF1bHQnO1xudmFyIEtFWVNIQVBFX01PREUgPSAna2V5U2hhcGUnO1xudmFyIERFTEVHQVRFX01PREUgPSAnZGVsZWdhdGUnO1xudmFyIFNWRyA9ICdzdmcnO1xuXG52YXIgTWluaU1hcCA9XG4vKiogQGNsYXNzICovXG5mdW5jdGlvbiAoX3N1cGVyKSB7XG4gIF9fZXh0ZW5kcyhNaW5pTWFwLCBfc3VwZXIpO1xuXG4gIGZ1bmN0aW9uIE1pbmlNYXAoY29uZmlnKSB7XG4gICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgY29uZmlnKSB8fCB0aGlzO1xuICAgIC8qKlxuICAgICAqIOS4u+WbvuabtOaWsOeahOebkeWQrOWHveaVsO+8jOS9v+eUqCBkZWJvdW5jZSDlh4/lsJHmuLLmn5PpopHnjodcbiAgICAgKiBlLmcuIOaLluaLveiKgueCueWPquS8muWcqOadvuaJi+WQjueahCAxMDBtcyDlkI7miafooYwgdXBkYXRlQ2FudmFzXG4gICAgICogZS5nLiByZW5kZXIg5pe25aSn6YePIGFkZEl0ZW0g5Lmf5Y+q5Lya5omn6KGM5LiA5qyhIHVwZGF0ZUNhbnZhc1xuICAgICAqL1xuXG5cbiAgICBfdGhpcy5oYW5kbGVVcGRhdGVDYW52YXMgPSBkZWJvdW5jZShmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgIHZhciBzZWxmID0gX3RoaXM7XG4gICAgICBpZiAoc2VsZi5kZXN0cm95ZWQpIHJldHVybjtcbiAgICAgIHNlbGYudXBkYXRlQ2FudmFzKCk7XG4gICAgfSwgMTAwLCBmYWxzZSk7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgTWluaU1hcC5wcm90b3R5cGUuZ2V0RGVmYXVsdENmZ3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgIGNsYXNzTmFtZTogJ2c2LW1pbmltYXAnLFxuICAgICAgdmlld3BvcnRDbGFzc05hbWU6ICdnNi1taW5pbWFwLXZpZXdwb3J0JyxcbiAgICAgIC8vIE1pbmltYXAg5Lit6buY6K6k5bGV56S65ZKM5Li75Zu+5LiA5qC355qE5YaF5a6577yMS2V5U2hhcGUg5Y+q5bGV56S66IqC54K55ZKM6L6555qEIGtleSBzaGFwZSDpg6jliIbvvIxkZWxlZ2F0ZeihqOekuuWxleekuuiHquWumuS5ieeahHJlY3TvvIznlKjmiLflj6/oh6rlrprkuYnmoLflvI9cbiAgICAgIHR5cGU6ICdkZWZhdWx0JyxcbiAgICAgIHBhZGRpbmc6IDUwLFxuICAgICAgc2l6ZTogWzIwMCwgMTIwXSxcbiAgICAgIGRlbGVnYXRlU3R5bGU6IHtcbiAgICAgICAgZmlsbDogJyM0MGE5ZmYnLFxuICAgICAgICBzdHJva2U6ICcjMDk2ZGQ5J1xuICAgICAgfSxcbiAgICAgIHJlZnJlc2g6IHRydWVcbiAgICB9O1xuICB9O1xuXG4gIE1pbmlNYXAucHJvdG90eXBlLmdldEV2ZW50cyA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgYmVmb3JlcGFpbnQ6ICd1cGRhdGVWaWV3cG9ydCcsXG4gICAgICBiZWZvcmVhbmltYXRlOiAnZGlzYWJsZVJlZnJlc2gnLFxuICAgICAgYWZ0ZXJhbmltYXRlOiAnZW5hYmxlUmVmcmVzaCcsXG4gICAgICB2aWV3cG9ydGNoYW5nZTogJ2Rpc2FibGVPbmVSZWZyZXNoJ1xuICAgIH07XG4gIH07IC8vIOiLpeaYr+ato+WcqOi/m+ihjOWKqOeUu++8jOS4jeWIt+aWsOe8qeeVpeWbvlxuXG5cbiAgTWluaU1hcC5wcm90b3R5cGUuZGlzYWJsZVJlZnJlc2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5zZXQoJ3JlZnJlc2gnLCBmYWxzZSk7XG4gIH07XG5cbiAgTWluaU1hcC5wcm90b3R5cGUuZW5hYmxlUmVmcmVzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLnNldCgncmVmcmVzaCcsIHRydWUpO1xuICAgIHRoaXMudXBkYXRlQ2FudmFzKCk7XG4gIH07XG5cbiAgTWluaU1hcC5wcm90b3R5cGUuZGlzYWJsZU9uZVJlZnJlc2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5zZXQoJ3ZpZXdwb3J0Q2hhbmdlJywgdHJ1ZSk7XG4gIH07XG5cbiAgTWluaU1hcC5wcm90b3R5cGUuaW5pdFZpZXdwb3J0ID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICB2YXIgY2ZncyA9IHRoaXMuX2NmZ3M7XG4gICAgdmFyIHNpemUgPSBjZmdzLnNpemUsXG4gICAgICAgIGdyYXBoID0gY2Zncy5ncmFwaDtcbiAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHJldHVybjtcbiAgICB2YXIgY2FudmFzID0gdGhpcy5nZXQoJ2NhbnZhcycpO1xuICAgIHZhciBjb250YWluZXJET00gPSBjYW52YXMuZ2V0KCdjb250YWluZXInKTtcbiAgICB2YXIgdmlld3BvcnQgPSBjcmVhdGVEb20oXCJcXG4gICAgICA8ZGl2XFxuICAgICAgICBjbGFzcz1cIiArIGNmZ3Mudmlld3BvcnRDbGFzc05hbWUgKyBcIlxcbiAgICAgICAgc3R5bGU9J3Bvc2l0aW9uOmFic29sdXRlO1xcbiAgICAgICAgICBsZWZ0OjA7XFxuICAgICAgICAgIHRvcDowO1xcbiAgICAgICAgICBib3gtc2l6aW5nOmJvcmRlci1ib3g7XFxuICAgICAgICAgIG91dGxpbmU6IDJweCBzb2xpZCAjMTk4MGZmJ1xcbiAgICAgICAgZHJhZ2dhYmxlPXRydWU+XFxuICAgICAgPC9kaXY+XCIpO1xuICAgIHZhciBpc0ZpcmVGb3ggPSBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkuaW5kZXhPZignZmlyZWZveCcpID4gLTE7IC8vIOiuoeeul+aLluaLveawtOW5s+aWueWQkei3neemu1xuXG4gICAgdmFyIHggPSAwOyAvLyDorqHnrpfmi5bmi73lnoLnm7TmlrnlkJHot53nprtcblxuICAgIHZhciB5ID0gMDsgLy8g5piv5ZCm5Zyo5ouW5ou9bWluaW1hcOeahOinhuWPo1xuXG4gICAgdmFyIGRyYWdnaW5nID0gZmFsc2U7IC8vIOe8k+WtmHZpZXdwb3J05b2T5YmN5a+55LqO55S75biD55qEeFxuXG4gICAgdmFyIGxlZnQgPSAwOyAvLyDnvJPlrZh2aWV3cG9ydOW9k+WJjeWvueS6jueUu+W4g+eahHlcblxuICAgIHZhciB0b3AgPSAwOyAvLyDnvJPlrZh2aWV3cG9ydOW9k+WJjeWuveW6plxuXG4gICAgdmFyIHdpZHRoID0gMDsgLy8g57yT5a2Ydmlld3BvcnTlvZPliY3pq5jluqZcblxuICAgIHZhciBoZWlnaHQgPSAwO1xuICAgIHZhciByYXRpbyA9IDA7XG4gICAgdmFyIHpvb20gPSAwO1xuICAgIHZpZXdwb3J0LmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdzdGFydCcsIGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgX2EsIF9iO1xuXG4gICAgICBpZiAoZS5kYXRhVHJhbnNmZXIpIHtcbiAgICAgICAgdmFyIGltZyA9IG5ldyBJbWFnZSgpO1xuICAgICAgICBpbWcuc3JjID0gXCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycgJTNFJTNDcGF0aCAvJTNFJTNDL3N2ZyUzRVwiO1xuICAgICAgICAoX2IgPSAoX2EgPSBlLmRhdGFUcmFuc2Zlcikuc2V0RHJhZ0ltYWdlKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuY2FsbChfYSwgaW1nLCAwLCAwKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGUuZGF0YVRyYW5zZmVyLnNldERhdGEoJ3RleHQvaHRtbCcsICd2aWV3LXBvcnQtbWluaW1hcCcpO1xuICAgICAgICB9IGNhdGNoIChfYykge1xuICAgICAgICAgIC8vIHN1cHBvcnQgSUVcbiAgICAgICAgICBlLmRhdGFUcmFuc2Zlci5zZXREYXRhKCd0ZXh0JywgJ3ZpZXctcG9ydC1taW5pbWFwJyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY2Zncy5yZWZyZXNoID0gZmFsc2U7XG5cbiAgICAgIGlmIChlLnRhcmdldCAhPT0gdmlld3BvcnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSAvLyDlpoLmnpzop4blj6Plt7Lnu4/mnIDlpKfkuobvvIzkuI3pnIDopoHmi5bmi71cblxuXG4gICAgICB2YXIgc3R5bGUgPSB2aWV3cG9ydC5zdHlsZTtcbiAgICAgIGxlZnQgPSBwYXJzZUludChzdHlsZS5sZWZ0LCAxMCk7XG4gICAgICB0b3AgPSBwYXJzZUludChzdHlsZS50b3AsIDEwKTtcbiAgICAgIHdpZHRoID0gcGFyc2VJbnQoc3R5bGUud2lkdGgsIDEwKTtcbiAgICAgIGhlaWdodCA9IHBhcnNlSW50KHN0eWxlLmhlaWdodCwgMTApO1xuXG4gICAgICBpZiAod2lkdGggPiBzaXplWzBdIHx8IGhlaWdodCA+IHNpemVbMV0pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB6b29tID0gZ3JhcGguZ2V0Wm9vbSgpO1xuICAgICAgcmF0aW8gPSBfdGhpcy5nZXQoJ3JhdGlvJyk7XG4gICAgICBkcmFnZ2luZyA9IHRydWU7XG4gICAgICB4ID0gZS5jbGllbnRYO1xuICAgICAgeSA9IGUuY2xpZW50WTtcbiAgICB9LCBmYWxzZSk7XG4gICAgdmlld3BvcnQuYWRkRXZlbnRMaXN0ZW5lcihpc0ZpcmVGb3ggPyAnZHJhZ292ZXInIDogJ2RyYWcnLCBmdW5jdGlvbiAoZSkge1xuICAgICAgaWYgKCFkcmFnZ2luZyB8fCBpc05pbChlLmNsaWVudFgpIHx8IGlzTmlsKGUuY2xpZW50WSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgZHggPSB4IC0gZS5jbGllbnRYO1xuICAgICAgdmFyIGR5ID0geSAtIGUuY2xpZW50WTsgLy8g6Iul6KeG5Y+j56e75Yqo5Yiw5pyA5bem6L655oiW5pyA5Y+z6L655LqGLOS7heenu+WKqOWIsOi+ueeVjFxuXG4gICAgICBpZiAobGVmdCAtIGR4IDwgMCB8fCBsZWZ0IC0gZHggKyB3aWR0aCA+PSBzaXplWzBdKSB7XG4gICAgICAgIGR4ID0gMDtcbiAgICAgIH0gLy8g6Iul6KeG5Y+j56e75Yqo5Yiw5pyA5LiK5oiW5pyA5LiL6L655LqG77yM5LuF56e75Yqo5Yiw6L6555WMXG5cblxuICAgICAgaWYgKHRvcCAtIGR5IDwgMCB8fCB0b3AgLSBkeSArIGhlaWdodCA+PSBzaXplWzFdKSB7XG4gICAgICAgIGR5ID0gMDtcbiAgICAgIH1cblxuICAgICAgbGVmdCAtPSBkeDtcbiAgICAgIHRvcCAtPSBkeTsgLy8g5YWI56e75Yqo6KeG5Y+j77yM6YG/5YWN56e75Yqo5Yiw6L655LiK5Lul5ZCO5Ye6546w6KeG5Y+j6Zeq54OBXG5cbiAgICAgIG1vZGlmeUNTUyh2aWV3cG9ydCwge1xuICAgICAgICBsZWZ0OiBsZWZ0ICsgXCJweFwiLFxuICAgICAgICB0b3A6IHRvcCArIFwicHhcIlxuICAgICAgfSk7IC8vIGdyYXBoIOenu+WKqOmcgOimgeWBj+enu+mHjyBkeC9keSAqIOe8qeaUvuavlOS+i+aJjeS8muW+l+WIsOato+ehrueahOenu+WKqOi3neemu1xuXG4gICAgICBncmFwaC50cmFuc2xhdGUoZHggKiB6b29tIC8gcmF0aW8sIGR5ICogem9vbSAvIHJhdGlvKTtcbiAgICAgIHggPSBlLmNsaWVudFg7XG4gICAgICB5ID0gZS5jbGllbnRZO1xuICAgIH0sIGZhbHNlKTtcbiAgICB2aWV3cG9ydC5hZGRFdmVudExpc3RlbmVyKCdkcmFnZW5kJywgZnVuY3Rpb24gKCkge1xuICAgICAgZHJhZ2dpbmcgPSBmYWxzZTtcbiAgICAgIGNmZ3MucmVmcmVzaCA9IHRydWU7XG4gICAgfSwgZmFsc2UpO1xuICAgIHRoaXMuc2V0KCd2aWV3cG9ydCcsIHZpZXdwb3J0KTtcbiAgICBjb250YWluZXJET00uYXBwZW5kQ2hpbGQodmlld3BvcnQpO1xuICB9O1xuICAvKipcbiAgICog5pu05pawIHZpZXdwb3J0IOinhuWbvlxuICAgKi9cblxuXG4gIE1pbmlNYXAucHJvdG90eXBlLnVwZGF0ZVZpZXdwb3J0ID0gZnVuY3Rpb24gKCkge1xuICAgIGlmICh0aGlzLmRlc3Ryb3llZCkgcmV0dXJuO1xuICAgIHZhciByYXRpbyA9IHRoaXMuZ2V0KCdyYXRpbycpO1xuICAgIHZhciBkeCA9IHRoaXMuZ2V0KCdkeCcpO1xuICAgIHZhciBkeSA9IHRoaXMuZ2V0KCdkeScpO1xuICAgIHZhciB0b3RhbGR4ID0gdGhpcy5nZXQoJ3RvdGFsZHgnKTtcbiAgICB2YXIgdG90YWxkeSA9IHRoaXMuZ2V0KCd0b3RhbGR5Jyk7XG4gICAgdmFyIGdyYXBoID0gdGhpcy5nZXQoJ2dyYXBoJyk7XG4gICAgdmFyIHNpemUgPSB0aGlzLmdldCgnc2l6ZScpO1xuICAgIHZhciBncmFwaFdpZHRoID0gZ3JhcGguZ2V0KCd3aWR0aCcpO1xuICAgIHZhciBncmFwaEhlaWdodCA9IGdyYXBoLmdldCgnaGVpZ2h0Jyk7XG4gICAgdmFyIHRvcExlZnQgPSBncmFwaC5nZXRQb2ludEJ5Q2FudmFzKDAsIDApO1xuICAgIHZhciBib3R0b21SaWdodCA9IGdyYXBoLmdldFBvaW50QnlDYW52YXMoZ3JhcGhXaWR0aCwgZ3JhcGhIZWlnaHQpO1xuICAgIHZhciB2aWV3cG9ydCA9IHRoaXMuZ2V0KCd2aWV3cG9ydCcpO1xuXG4gICAgaWYgKCF2aWV3cG9ydCkge1xuICAgICAgdGhpcy5pbml0Vmlld3BvcnQoKTtcbiAgICB9IC8vIHZpZXdwb3J05a696auYLOW3puS4iuinkueCueeahOiuoeeul1xuXG5cbiAgICB2YXIgd2lkdGggPSAoYm90dG9tUmlnaHQueCAtIHRvcExlZnQueCkgKiByYXRpbztcbiAgICB2YXIgaGVpZ2h0ID0gKGJvdHRvbVJpZ2h0LnkgLSB0b3BMZWZ0LnkpICogcmF0aW87XG4gICAgdmFyIGxlZnQgPSB0b3BMZWZ0LnggKiByYXRpbyArIHRvdGFsZHg7XG4gICAgdmFyIHRvcCA9IHRvcExlZnQueSAqIHJhdGlvICsgdG90YWxkeTtcbiAgICB2YXIgcmlnaHQgPSBsZWZ0ICsgd2lkdGg7XG4gICAgdmFyIGJvdHRvbSA9IHRvcCArIGhlaWdodDtcblxuICAgIGlmIChsZWZ0IDwgMCkge1xuICAgICAgd2lkdGggKz0gbGVmdDtcbiAgICAgIGxlZnQgPSAwO1xuICAgIH1cblxuICAgIGlmIChyaWdodCA+IHNpemVbMF0pIHtcbiAgICAgIHdpZHRoID0gd2lkdGggLSAocmlnaHQgLSBzaXplWzBdKTtcbiAgICB9XG5cbiAgICBpZiAodG9wIDwgMCkge1xuICAgICAgaGVpZ2h0ICs9IHRvcDtcbiAgICAgIHRvcCA9IDA7XG4gICAgfVxuXG4gICAgaWYgKGJvdHRvbSA+IHNpemVbMV0pIHtcbiAgICAgIGhlaWdodCA9IGhlaWdodCAtIChib3R0b20gLSBzaXplWzFdKTtcbiAgICB9IC8vIOe8k+WtmOebruWJjee8qeaUvuavlO+8jOWcqOenu+WKqCBtaW5pbWFwIOinhueql+aXtuWwseS4jeeUqOWGjeiuoeeul+Wkp+WbvueahOenu+WKqOmHj1xuXG5cbiAgICB0aGlzLnNldCgncmF0aW8nLCByYXRpbyk7XG4gICAgdmFyIGNvcnJlY3RMZWZ0ID0gbGVmdCArIFwicHhcIjtcbiAgICB2YXIgY29ycmVjdFRvcCA9IHRvcCArIFwicHhcIjtcbiAgICBtb2RpZnlDU1Modmlld3BvcnQsIHtcbiAgICAgIGxlZnQ6IGNvcnJlY3RMZWZ0LFxuICAgICAgdG9wOiBjb3JyZWN0VG9wLFxuICAgICAgd2lkdGg6IHdpZHRoICsgXCJweFwiLFxuICAgICAgaGVpZ2h0OiBoZWlnaHQgKyBcInB4XCJcbiAgICB9KTtcbiAgfTtcbiAgLyoqXG4gICAqIOWwhuS4u+WbvuS4iueahOWbvuW9ouWujOWFqOWkjeWItuWIsOWwj+WbvlxuICAgKi9cblxuXG4gIE1pbmlNYXAucHJvdG90eXBlLnVwZGF0ZUdyYXBoU2hhcGVzID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBncmFwaCA9IHRoaXMuX2NmZ3MuZ3JhcGg7XG4gICAgdmFyIGNhbnZhcyA9IHRoaXMuZ2V0KCdjYW52YXMnKTtcbiAgICB2YXIgZ3JhcGhHcm91cCA9IGdyYXBoLmdldCgnZ3JvdXAnKTtcbiAgICBpZiAoZ3JhcGhHcm91cC5kZXN0cm95ZWQpIHJldHVybjtcbiAgICB2YXIgY2xvbmVkR3JvdXAgPSBncmFwaEdyb3VwLmNsb25lKCk7XG4gICAgY2xvbmVkR3JvdXAucmVzZXRNYXRyaXgoKTtcbiAgICBjYW52YXMuY2xlYXIoKTtcbiAgICBjYW52YXMuYWRkKGNsb25lZEdyb3VwKTsgLy8g5b2TIHJlbmRlcmVyIOaYryBzdmfvvIznlLHkuo7muLLmn5PlvJXmk47nmoQgYnVn77yM6L+Z6YeM6ZyA6KaB5bCGIHZpc2libGUg5Li6IGZhbHNlIOeahOWFg+e0oOaJi+WKqOmakOiXj1xuXG4gICAgdmFyIHJlbmRlcmVyID0gZ3JhcGguZ2V0KCdyZW5kZXJlcicpO1xuXG4gICAgaWYgKHJlbmRlcmVyID09PSBTVkcpIHtcbiAgICAgIC8vIOmAkuW9kuabtOaWsOWtkOWFg+e0oFxuICAgICAgdGhpcy51cGRhdGVWaXNpYmxlKGNsb25lZEdyb3VwKTtcbiAgICB9XG4gIH07IC8vIHN2ZyDlnKggY2FudmFzLmFkZChjbG9uZWRHcm91cCkg5LmL5ZCO5Lya5Ye6546wIHZpc2libGUg5Li6IGZhbHNlIOeahOWFg+e0oOiiq+WxleekuuWHuuadpe+8jOmcgOimgemAkuW9kuabtOaWsFxuXG5cbiAgTWluaU1hcC5wcm90b3R5cGUudXBkYXRlVmlzaWJsZSA9IGZ1bmN0aW9uIChlbGUpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgaWYgKCFlbGUuaXNHcm91cCgpICYmICFlbGUuZ2V0KCd2aXNpYmxlJykpIHtcbiAgICAgIGVsZS5oaWRlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBjaGlsZHJlbiA9IGVsZS5nZXQoJ2NoaWxkcmVuJyk7XG4gICAgICBpZiAoIWNoaWxkcmVuIHx8ICFjaGlsZHJlbi5sZW5ndGgpIHJldHVybjtcbiAgICAgIGNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgIGlmICghY2hpbGQuZ2V0KCd2aXNpYmxlJykpIGNoaWxkLmhpZGUoKTtcblxuICAgICAgICBfdGhpcy51cGRhdGVWaXNpYmxlKGNoaWxkKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfTsgLy8g5LuF5ZyoIG1pbmltYXAg5LiK57uY5Yi2IGtleVNoYXBlXG4gIC8vIEZJWE1FIOWmguaenOeUqOaIt+iHquWumuS5iee7mOWItuS6huWFtuS7luWGheWuue+8jG1pbmltYXDkuIrlsLHml6Dms5XnlLvlh7pcblxuXG4gIE1pbmlNYXAucHJvdG90eXBlLnVwZGF0ZUtleVNoYXBlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdmFyIGdyYXBoID0gdGhpcy5fY2Zncy5ncmFwaDtcbiAgICB2YXIgY2FudmFzID0gdGhpcy5nZXQoJ2NhbnZhcycpO1xuICAgIHZhciBncm91cCA9IGNhbnZhcy5nZXQoJ2NoaWxkcmVuJylbMF0gfHwgY2FudmFzLmFkZEdyb3VwKCk7XG4gICAgZWFjaChncmFwaC5nZXRFZGdlcygpLCBmdW5jdGlvbiAoZWRnZSkge1xuICAgICAgX3RoaXMudXBkYXRlT25lRWRnZUtleVNoYXBlKGVkZ2UsIGdyb3VwKTtcbiAgICB9KTtcbiAgICBlYWNoKGdyYXBoLmdldE5vZGVzKCksIGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICBfdGhpcy51cGRhdGVPbmVOb2RlS2V5U2hhcGUobm9kZSwgZ3JvdXApO1xuICAgIH0pO1xuICAgIHZhciBjb21ib3MgPSBncmFwaC5nZXRDb21ib3MoKTtcblxuICAgIGlmIChjb21ib3MgJiYgY29tYm9zLmxlbmd0aCkge1xuICAgICAgdmFyIGNvbWJvR3JvdXBfMSA9IGdyb3VwLmZpbmQoZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgcmV0dXJuIGUuZ2V0KCduYW1lJykgPT09ICdjb21ib0dyb3VwJztcbiAgICAgIH0pIHx8IGdyb3VwLmFkZEdyb3VwKHtcbiAgICAgICAgbmFtZTogJ2NvbWJvR3JvdXAnXG4gICAgICB9KTtcbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoX3RoaXMuZGVzdHJveWVkKSByZXR1cm47XG4gICAgICAgIGVhY2goY29tYm9zLCBmdW5jdGlvbiAoY29tYm8pIHtcbiAgICAgICAgICBfdGhpcy51cGRhdGVPbmVDb21ib0tleVNoYXBlKGNvbWJvLCBjb21ib0dyb3VwXzEpO1xuICAgICAgICB9KTtcbiAgICAgICAgY29tYm9Hcm91cF8xID09PSBudWxsIHx8IGNvbWJvR3JvdXBfMSA9PT0gdm9pZCAwID8gdm9pZCAwIDogY29tYm9Hcm91cF8xLnNvcnQoKTtcbiAgICAgICAgY29tYm9Hcm91cF8xID09PSBudWxsIHx8IGNvbWJvR3JvdXBfMSA9PT0gdm9pZCAwID8gdm9pZCAwIDogY29tYm9Hcm91cF8xLnRvQmFjaygpO1xuXG4gICAgICAgIF90aGlzLnVwZGF0ZUNhbnZhcygpO1xuICAgICAgfSwgMjUwKTtcbiAgICB9XG5cbiAgICB0aGlzLmNsZWFyRGVzdHJveWVkU2hhcGVzKCk7XG4gIH07XG4gIC8qKlxuICAgKiDlop7liqAv5pu05paw5Y2V5Liq5YWD57Sg55qEIGtleVNoYXBlXG4gICAqIEBwYXJhbSBpdGVtIElDb21ibyDlrp7kvotcbiAgICovXG5cblxuICBNaW5pTWFwLnByb3RvdHlwZS51cGRhdGVPbmVDb21ib0tleVNoYXBlID0gZnVuY3Rpb24gKGl0ZW0sIGNvbWJvR3JvdXApIHtcbiAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHJldHVybjtcbiAgICB2YXIgaXRlbU1hcCA9IHRoaXMuZ2V0KCdpdGVtTWFwJykgfHwge307IC8vIOW3rumHj+abtOaWsCBtaW5pbWFwIOS4iueahOS4gOS4quiKgueCue+8jOWvueW6lOS4u+WbvueahCBpdGVtXG5cbiAgICB2YXIgbWFwcGVkSXRlbSA9IGl0ZW1NYXBbaXRlbS5nZXQoJ2lkJyldO1xuICAgIHZhciBiYm94ID0gaXRlbS5nZXRCQm94KCk7IC8vIOiuoeeul+S6huiKgueCueeItue7hOefqemYteeahCBiYm94XG5cbiAgICB2YXIgY0tleVNoYXBlID0gaXRlbS5nZXQoJ2tleVNoYXBlJykuY2xvbmUoKTtcbiAgICB2YXIga2V5U2hhcGVTdHlsZSA9IGNLZXlTaGFwZS5hdHRyKCk7XG4gICAgdmFyIGF0dHJzID0ge1xuICAgICAgeDogYmJveC5jZW50ZXJYLFxuICAgICAgeTogYmJveC5jZW50ZXJZXG4gICAgfTtcblxuICAgIGlmICghbWFwcGVkSXRlbSkge1xuICAgICAgbWFwcGVkSXRlbSA9IGNLZXlTaGFwZTtcbiAgICAgIGNvbWJvR3JvdXAuYWRkKG1hcHBlZEl0ZW0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBhdHRycyA9IE9iamVjdC5hc3NpZ24oa2V5U2hhcGVTdHlsZSwgYXR0cnMpO1xuICAgIH1cblxuICAgIHZhciBzaGFwZVR5cGUgPSBtYXBwZWRJdGVtLmdldCgndHlwZScpO1xuXG4gICAgaWYgKHNoYXBlVHlwZSA9PT0gJ3JlY3QnIHx8IHNoYXBlVHlwZSA9PT0gJ2ltYWdlJykge1xuICAgICAgYXR0cnMueCA9IGJib3gubWluWDtcbiAgICAgIGF0dHJzLnkgPSBiYm94Lm1pblk7XG4gICAgfVxuXG4gICAgbWFwcGVkSXRlbS5hdHRyKGF0dHJzKTtcbiAgICBpZiAoIWl0ZW0uaXNWaXNpYmxlKCkpIG1hcHBlZEl0ZW0uaGlkZSgpO2Vsc2UgbWFwcGVkSXRlbS5zaG93KCk7XG4gICAgbWFwcGVkSXRlbS5leGlzdCA9IHRydWU7XG4gICAgdmFyIHpJbmRleCA9IGl0ZW0uZ2V0TW9kZWwoKS5kZXB0aDtcbiAgICBpZiAoIWlzTmFOKHpJbmRleCkpIG1hcHBlZEl0ZW0uc2V0KCd6SW5kZXgnLCB6SW5kZXgpO1xuICAgIGl0ZW1NYXBbaXRlbS5nZXQoJ2lkJyldID0gbWFwcGVkSXRlbTtcbiAgICB0aGlzLnNldCgnaXRlbU1hcCcsIGl0ZW1NYXApO1xuICB9O1xuICAvKipcbiAgICog5aKe5YqgL+abtOaWsOWNleS4quWFg+e0oOeahCBrZXlTaGFwZVxuICAgKiBAcGFyYW0gaXRlbSBJTm9kZSDlrp7kvotcbiAgICovXG5cblxuICBNaW5pTWFwLnByb3RvdHlwZS51cGRhdGVPbmVOb2RlS2V5U2hhcGUgPSBmdW5jdGlvbiAoaXRlbSwgZ3JvdXApIHtcbiAgICB2YXIgaXRlbU1hcCA9IHRoaXMuZ2V0KCdpdGVtTWFwJykgfHwge307IC8vIOW3rumHj+abtOaWsCBtaW5pbWFwIOS4iueahOS4gOS4quiKgueCue+8jOWvueW6lOS4u+WbvueahCBpdGVtXG5cbiAgICB2YXIgbWFwcGVkSXRlbSA9IGl0ZW1NYXBbaXRlbS5nZXQoJ2lkJyldO1xuICAgIHZhciBiYm94ID0gaXRlbS5nZXRCQm94KCk7IC8vIOiuoeeul+S6huiKgueCueeItue7hOefqemYteeahCBiYm94XG5cbiAgICB2YXIgY0tleVNoYXBlID0gaXRlbS5nZXQoJ2tleVNoYXBlJykuY2xvbmUoKTtcbiAgICB2YXIga2V5U2hhcGVTdHlsZSA9IGNLZXlTaGFwZS5hdHRyKCk7XG4gICAgdmFyIGF0dHJzID0ge1xuICAgICAgeDogYmJveC5jZW50ZXJYLFxuICAgICAgeTogYmJveC5jZW50ZXJZXG4gICAgfTtcblxuICAgIGlmICghbWFwcGVkSXRlbSkge1xuICAgICAgbWFwcGVkSXRlbSA9IGNLZXlTaGFwZTtcbiAgICAgIGdyb3VwLmFkZChtYXBwZWRJdGVtKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXR0cnMgPSBPYmplY3QuYXNzaWduKGtleVNoYXBlU3R5bGUsIGF0dHJzKTtcbiAgICB9XG5cbiAgICB2YXIgc2hhcGVUeXBlID0gbWFwcGVkSXRlbS5nZXQoJ3R5cGUnKTtcblxuICAgIGlmIChzaGFwZVR5cGUgPT09ICdyZWN0JyB8fCBzaGFwZVR5cGUgPT09ICdpbWFnZScpIHtcbiAgICAgIGF0dHJzLnggPSBiYm94Lm1pblg7XG4gICAgICBhdHRycy55ID0gYmJveC5taW5ZO1xuICAgIH1cblxuICAgIG1hcHBlZEl0ZW0uYXR0cihhdHRycyk7XG4gICAgaWYgKCFpdGVtLmlzVmlzaWJsZSgpKSBtYXBwZWRJdGVtLmhpZGUoKTtlbHNlIG1hcHBlZEl0ZW0uc2hvdygpO1xuICAgIG1hcHBlZEl0ZW0uZXhpc3QgPSB0cnVlO1xuICAgIHZhciB6SW5kZXggPSBpdGVtLmdldE1vZGVsKCkuZGVwdGg7XG4gICAgaWYgKCFpc05hTih6SW5kZXgpKSBtYXBwZWRJdGVtLnNldCgnekluZGV4JywgekluZGV4KTtcbiAgICBpdGVtTWFwW2l0ZW0uZ2V0KCdpZCcpXSA9IG1hcHBlZEl0ZW07XG4gICAgdGhpcy5zZXQoJ2l0ZW1NYXAnLCBpdGVtTWFwKTtcbiAgfTtcbiAgLyoqXG4gICAqIE1pbmltYXAg5Lit5bGV56S66Ieq5a6a5LmJ55qEcmVjdO+8jOaUr+aMgeeUqOaIt+iHquWumuS5ieagt+W8j+WSjOiKgueCueWkp+Wwj1xuICAgKi9cblxuXG4gIE1pbmlNYXAucHJvdG90eXBlLnVwZGF0ZURlbGVnYXRlU2hhcGVzID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICB2YXIgZ3JhcGggPSB0aGlzLl9jZmdzLmdyYXBoO1xuICAgIHZhciBjYW52YXMgPSB0aGlzLmdldCgnY2FudmFzJyk7XG4gICAgdmFyIGdyb3VwID0gY2FudmFzLmdldCgnY2hpbGRyZW4nKVswXSB8fCBjYW52YXMuYWRkR3JvdXAoKTsgLy8g5beu6YeP5pu05pawIG1pbmltYXAg5LiK55qE6IqC54K55ZKM6L65XG5cbiAgICBlYWNoKGdyYXBoLmdldEVkZ2VzKCksIGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgICBfdGhpcy51cGRhdGVPbmVFZGdlS2V5U2hhcGUoZWRnZSwgZ3JvdXApO1xuICAgIH0pO1xuICAgIGVhY2goZ3JhcGguZ2V0Tm9kZXMoKSwgZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgIF90aGlzLnVwZGF0ZU9uZU5vZGVEZWxlZ2F0ZVNoYXBlKG5vZGUsIGdyb3VwKTtcbiAgICB9KTtcbiAgICB2YXIgY29tYm9zID0gZ3JhcGguZ2V0Q29tYm9zKCk7XG5cbiAgICBpZiAoY29tYm9zICYmIGNvbWJvcy5sZW5ndGgpIHtcbiAgICAgIHZhciBjb21ib0dyb3VwXzIgPSBncm91cC5maW5kKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHJldHVybiBlLmdldCgnbmFtZScpID09PSAnY29tYm9Hcm91cCc7XG4gICAgICB9KSB8fCBncm91cC5hZGRHcm91cCh7XG4gICAgICAgIG5hbWU6ICdjb21ib0dyb3VwJ1xuICAgICAgfSk7XG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKF90aGlzLmRlc3Ryb3llZCkgcmV0dXJuO1xuICAgICAgICBlYWNoKGNvbWJvcywgZnVuY3Rpb24gKGNvbWJvKSB7XG4gICAgICAgICAgX3RoaXMudXBkYXRlT25lQ29tYm9LZXlTaGFwZShjb21ibywgY29tYm9Hcm91cF8yKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbWJvR3JvdXBfMiA9PT0gbnVsbCB8fCBjb21ib0dyb3VwXzIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvbWJvR3JvdXBfMi5zb3J0KCk7XG4gICAgICAgIGNvbWJvR3JvdXBfMiA9PT0gbnVsbCB8fCBjb21ib0dyb3VwXzIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvbWJvR3JvdXBfMi50b0JhY2soKTtcblxuICAgICAgICBfdGhpcy51cGRhdGVDYW52YXMoKTtcbiAgICAgIH0sIDI1MCk7XG4gICAgfVxuXG4gICAgdGhpcy5jbGVhckRlc3Ryb3llZFNoYXBlcygpO1xuICB9O1xuXG4gIE1pbmlNYXAucHJvdG90eXBlLmNsZWFyRGVzdHJveWVkU2hhcGVzID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBpdGVtTWFwID0gdGhpcy5nZXQoJ2l0ZW1NYXAnKSB8fCB7fTtcbiAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGl0ZW1NYXApO1xuICAgIGlmICgha2V5cyB8fCBrZXlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgZm9yICh2YXIgaSA9IGtleXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciBzaGFwZSA9IGl0ZW1NYXBba2V5c1tpXV07XG4gICAgICB2YXIgZXhpc3QgPSBzaGFwZS5leGlzdDtcbiAgICAgIHNoYXBlLmV4aXN0ID0gZmFsc2U7XG5cbiAgICAgIGlmICghZXhpc3QpIHtcbiAgICAgICAgc2hhcGUucmVtb3ZlKCk7XG4gICAgICAgIGRlbGV0ZSBpdGVtTWFwW2tleXNbaV1dO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgLyoqXG4gICAqIOiuvue9ruWPquaYvuekuiBlZGdlIOeahCBrZXlTaGFwZVxuICAgKiBAcGFyYW0gaXRlbSBJRWRnZSDlrp7kvotcbiAgICovXG5cblxuICBNaW5pTWFwLnByb3RvdHlwZS51cGRhdGVPbmVFZGdlS2V5U2hhcGUgPSBmdW5jdGlvbiAoaXRlbSwgZ3JvdXApIHtcbiAgICB2YXIgaXRlbU1hcCA9IHRoaXMuZ2V0KCdpdGVtTWFwJykgfHwge307IC8vIOW3rumHj+abtOaWsCBtaW5pbWFwIOS4iueahOS4gOS4quiKgueCue+8jOWvueW6lOS4u+WbvueahCBpdGVtXG5cbiAgICB2YXIgbWFwcGVkSXRlbSA9IGl0ZW1NYXBbaXRlbS5nZXQoJ2lkJyldO1xuXG4gICAgaWYgKG1hcHBlZEl0ZW0pIHtcbiAgICAgIHZhciBwYXRoID0gaXRlbS5nZXQoJ2tleVNoYXBlJykuYXR0cigncGF0aCcpO1xuICAgICAgbWFwcGVkSXRlbS5hdHRyKCdwYXRoJywgcGF0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1hcHBlZEl0ZW0gPSBpdGVtLmdldCgna2V5U2hhcGUnKS5jbG9uZSgpO1xuICAgICAgZ3JvdXAuYWRkKG1hcHBlZEl0ZW0pO1xuICAgIH1cblxuICAgIGlmICghaXRlbS5pc1Zpc2libGUoKSkgbWFwcGVkSXRlbS5oaWRlKCk7ZWxzZSBtYXBwZWRJdGVtLnNob3coKTtcbiAgICBtYXBwZWRJdGVtLmV4aXN0ID0gdHJ1ZTtcbiAgICBpdGVtTWFwW2l0ZW0uZ2V0KCdpZCcpXSA9IG1hcHBlZEl0ZW07XG4gICAgdGhpcy5zZXQoJ2l0ZW1NYXAnLCBpdGVtTWFwKTtcbiAgfTtcbiAgLyoqXG4gICAqIE1pbmltYXAg5Lit5bGV56S66Ieq5a6a5LmJ55qEIHJlY3TvvIzmlK/mjIHnlKjmiLfoh6rlrprkuYnmoLflvI/lkozoioLngrnlpKflsI9cbiAgICog5aKe5YqgL+abtOaWsOWNleS4quWFg+e0oFxuICAgKiBAcGFyYW0gaXRlbSBJTm9kZSDlrp7kvotcbiAgICovXG5cblxuICBNaW5pTWFwLnByb3RvdHlwZS51cGRhdGVPbmVOb2RlRGVsZWdhdGVTaGFwZSA9IGZ1bmN0aW9uIChpdGVtLCBncm91cCkge1xuICAgIHZhciBkZWxlZ2F0ZVN0eWxlID0gdGhpcy5nZXQoJ2RlbGVnYXRlU3R5bGUnKTtcbiAgICB2YXIgaXRlbU1hcCA9IHRoaXMuZ2V0KCdpdGVtTWFwJykgfHwge307IC8vIOW3rumHj+abtOaWsCBtaW5pbWFwIOS4iueahOS4gOS4quiKgueCue+8jOWvueW6lOS4u+WbvueahCBpdGVtXG5cbiAgICB2YXIgbWFwcGVkSXRlbSA9IGl0ZW1NYXBbaXRlbS5nZXQoJ2lkJyldO1xuICAgIHZhciBiYm94ID0gaXRlbS5nZXRCQm94KCk7IC8vIOiuoeeul+S6huiKgueCueeItue7hOefqemYteeahCBiYm94XG5cbiAgICBpZiAobWFwcGVkSXRlbSkge1xuICAgICAgdmFyIGF0dHJzID0ge1xuICAgICAgICB4OiBiYm94Lm1pblgsXG4gICAgICAgIHk6IGJib3gubWluWSxcbiAgICAgICAgd2lkdGg6IGJib3gud2lkdGgsXG4gICAgICAgIGhlaWdodDogYmJveC5oZWlnaHRcbiAgICAgIH07XG4gICAgICBtYXBwZWRJdGVtLmF0dHIoYXR0cnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBtYXBwZWRJdGVtID0gZ3JvdXAuYWRkU2hhcGUoJ3JlY3QnLCB7XG4gICAgICAgIGF0dHJzOiBfX2Fzc2lnbih7XG4gICAgICAgICAgeDogYmJveC5taW5YLFxuICAgICAgICAgIHk6IGJib3gubWluWSxcbiAgICAgICAgICB3aWR0aDogYmJveC53aWR0aCxcbiAgICAgICAgICBoZWlnaHQ6IGJib3guaGVpZ2h0XG4gICAgICAgIH0sIGRlbGVnYXRlU3R5bGUpLFxuICAgICAgICBuYW1lOiAnbWluaW1hcC1ub2RlLXNoYXBlJ1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKCFpdGVtLmlzVmlzaWJsZSgpKSBtYXBwZWRJdGVtLmhpZGUoKTtlbHNlIG1hcHBlZEl0ZW0uc2hvdygpO1xuICAgIG1hcHBlZEl0ZW0uZXhpc3QgPSB0cnVlO1xuICAgIGl0ZW1NYXBbaXRlbS5nZXQoJ2lkJyldID0gbWFwcGVkSXRlbTtcbiAgICB0aGlzLnNldCgnaXRlbU1hcCcsIGl0ZW1NYXApO1xuICB9O1xuXG4gIE1pbmlNYXAucHJvdG90eXBlLmluaXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5pbml0Q29udGFpbmVyKCk7XG4gICAgdGhpcy5nZXQoJ2dyYXBoJykub24oJ2FmdGVydXBkYXRlaXRlbScsIHRoaXMuaGFuZGxlVXBkYXRlQ2FudmFzKTtcbiAgICB0aGlzLmdldCgnZ3JhcGgnKS5vbignYWZ0ZXJpdGVtc3RhdGVjaGFuZ2UnLCB0aGlzLmhhbmRsZVVwZGF0ZUNhbnZhcyk7XG4gICAgdGhpcy5nZXQoJ2dyYXBoJykub24oJ2FmdGVyYWRkaXRlbScsIHRoaXMuaGFuZGxlVXBkYXRlQ2FudmFzKTtcbiAgICB0aGlzLmdldCgnZ3JhcGgnKS5vbignYWZ0ZXJyZW1vdmVpdGVtJywgdGhpcy5oYW5kbGVVcGRhdGVDYW52YXMpO1xuICAgIHRoaXMuZ2V0KCdncmFwaCcpLm9uKCdhZnRlcnJlbmRlcicsIHRoaXMuaGFuZGxlVXBkYXRlQ2FudmFzKTtcbiAgICB0aGlzLmdldCgnZ3JhcGgnKS5vbignYWZ0ZXJsYXlvdXQnLCB0aGlzLmhhbmRsZVVwZGF0ZUNhbnZhcyk7XG4gIH07XG4gIC8qKlxuICAgKiDliJ3lp4vljJYgTWluaW1hcCDnmoTlrrnlmahcbiAgICovXG5cblxuICBNaW5pTWFwLnByb3RvdHlwZS5pbml0Q29udGFpbmVyID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgZ3JhcGggPSBzZWxmLmdldCgnZ3JhcGgnKTtcbiAgICB2YXIgc2l6ZSA9IHNlbGYuZ2V0KCdzaXplJyk7XG4gICAgdmFyIGNsYXNzTmFtZSA9IHNlbGYuZ2V0KCdjbGFzc05hbWUnKTtcbiAgICB2YXIgcGFyZW50Tm9kZSA9IHNlbGYuZ2V0KCdjb250YWluZXInKTtcbiAgICB2YXIgY29udGFpbmVyID0gY3JlYXRlRG9tKFwiPGRpdiBjbGFzcz0nXCIgKyBjbGFzc05hbWUgKyBcIicgc3R5bGU9J3dpZHRoOiBcIiArIHNpemVbMF0gKyBcInB4OyBoZWlnaHQ6IFwiICsgc2l6ZVsxXSArIFwicHg7IG92ZXJmbG93OiBoaWRkZW4nPjwvZGl2PlwiKTtcblxuICAgIGlmIChpc1N0cmluZyhwYXJlbnROb2RlKSkge1xuICAgICAgcGFyZW50Tm9kZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHBhcmVudE5vZGUpO1xuICAgIH1cblxuICAgIGlmIChwYXJlbnROb2RlKSB7XG4gICAgICBwYXJlbnROb2RlLmFwcGVuZENoaWxkKGNvbnRhaW5lcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdyYXBoLmdldCgnY29udGFpbmVyJykuYXBwZW5kQ2hpbGQoY29udGFpbmVyKTtcbiAgICB9XG5cbiAgICBzZWxmLnNldCgnY29udGFpbmVyJywgY29udGFpbmVyKTtcbiAgICB2YXIgY29udGFpbmVyRE9NID0gY3JlYXRlRG9tKCc8ZGl2IGNsYXNzPVwiZzYtbWluaW1hcC1jb250YWluZXJcIiBzdHlsZT1cInBvc2l0aW9uOiByZWxhdGl2ZTtcIj48L2Rpdj4nKTtcbiAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoY29udGFpbmVyRE9NKTtcbiAgICBjb250YWluZXJET00uYWRkRXZlbnRMaXN0ZW5lcignZHJhZ2VudGVyJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB9KTtcbiAgICBjb250YWluZXJET00uYWRkRXZlbnRMaXN0ZW5lcignZHJhZ292ZXInLCBmdW5jdGlvbiAoZSkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH0pO1xuICAgIHZhciBjYW52YXM7XG4gICAgdmFyIHJlbmRlcmVyID0gZ3JhcGguZ2V0KCdyZW5kZXJlcicpO1xuXG4gICAgaWYgKHJlbmRlcmVyID09PSBTVkcpIHtcbiAgICAgIGNhbnZhcyA9IG5ldyBHU1ZHQ2FudmFzKHtcbiAgICAgICAgY29udGFpbmVyOiBjb250YWluZXJET00sXG4gICAgICAgIHdpZHRoOiBzaXplWzBdLFxuICAgICAgICBoZWlnaHQ6IHNpemVbMV1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjYW52YXMgPSBuZXcgR0NhbnZhcyh7XG4gICAgICAgIGNvbnRhaW5lcjogY29udGFpbmVyRE9NLFxuICAgICAgICB3aWR0aDogc2l6ZVswXSxcbiAgICAgICAgaGVpZ2h0OiBzaXplWzFdXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBzZWxmLnNldCgnY2FudmFzJywgY2FudmFzKTtcbiAgICBzZWxmLnVwZGF0ZUNhbnZhcygpO1xuICB9O1xuXG4gIE1pbmlNYXAucHJvdG90eXBlLnVwZGF0ZUNhbnZhcyA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHJldHVybjsgLy8g5aaC5p6c5piv5Zyo5Yqo55S777yM5YiZ5LiN5Yi35paw6KeG5Zu+XG5cbiAgICB2YXIgaXNSZWZyZXNoID0gdGhpcy5nZXQoJ3JlZnJlc2gnKTtcblxuICAgIGlmICghaXNSZWZyZXNoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGdyYXBoID0gdGhpcy5nZXQoJ2dyYXBoJyk7XG5cbiAgICBpZiAoZ3JhcGguZ2V0KCdkZXN0cm95ZWQnKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8g5aaC5p6c5piv6KeG5Y+j5Y+Y5o2i77yM5Lmf5LiN5Yi35paw6KeG5Zu+77yM5L2G5piv6ZyA6KaB6YeN572u6KeG5Y+j5aSn5bCP5ZKM5L2N572uXG5cblxuICAgIGlmICh0aGlzLmdldCgndmlld3BvcnRDaGFuZ2UnKSkge1xuICAgICAgdGhpcy5zZXQoJ3ZpZXdwb3J0Q2hhbmdlJywgZmFsc2UpO1xuICAgICAgdGhpcy51cGRhdGVWaWV3cG9ydCgpO1xuICAgIH1cblxuICAgIHZhciBzaXplID0gdGhpcy5nZXQoJ3NpemUnKTsgLy8g55So5oi35a6a5LmJ55qEIG1pbmltYXAgc2l6ZVxuXG4gICAgdmFyIGNhbnZhcyA9IHRoaXMuZ2V0KCdjYW52YXMnKTsgLy8gbWluaW1hcCDnmoQgY2FudmFzXG5cbiAgICB2YXIgdHlwZSA9IHRoaXMuZ2V0KCd0eXBlJyk7IC8vIG1pbmltYXAg55qE57G75Z6LXG5cbiAgICB2YXIgcGFkZGluZyA9IHRoaXMuZ2V0KCdwYWRkaW5nJyk7IC8vIOeUqOaIt+mineWumuS5ieeahCBtaW5pbWFwIOeahCBwYWRkaW5nXG5cbiAgICBpZiAoY2FudmFzLmRlc3Ryb3llZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBERUZBVUxUX01PREU6XG4gICAgICAgIHRoaXMudXBkYXRlR3JhcGhTaGFwZXMoKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgS0VZU0hBUEVfTU9ERTpcbiAgICAgICAgdGhpcy51cGRhdGVLZXlTaGFwZXMoKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgREVMRUdBVEVfTU9ERTpcbiAgICAgICAgLy8g5b6X5Yiw55qE6IqC54K555u05o6l5bim5pyJIHgg5ZKMIHnvvIzmr4/kuKroioLngrnkuI3lrZjlnKjniLYgZ3JvdXDvvIzljbPmr4/kuKroioLngrnkvY3nva7kuI3nlLHniLYgZ3JvdXAg5o6n5Yi2XG4gICAgICAgIHRoaXMudXBkYXRlRGVsZWdhdGVTaGFwZXMoKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHZhciBncm91cCA9IGNhbnZhcy5nZXQoJ2NoaWxkcmVuJylbMF07XG4gICAgaWYgKCFncm91cCkgcmV0dXJuO1xuICAgIGdyb3VwLnJlc2V0TWF0cml4KCk7IC8vIOivpSBiYm94IOaYr+WHhuehrueahO+8jOS4jeiuoeeulyBtYXRyaXgg55qE5YyF5Zu055uSXG5cbiAgICB2YXIgYmJveCA9IGdyb3VwLmdldENhbnZhc0JCb3goKTtcbiAgICB2YXIgZ3JhcGhCQm94ID0gZ3JhcGguZ2V0KCdjYW52YXMnKS5nZXRDYW52YXNCQm94KCk7IC8vIOS4u+WbvueahCBiYm94XG5cbiAgICB2YXIgZ3JhcGhab29tID0gZ3JhcGguZ2V0Wm9vbSgpIHx8IDE7XG4gICAgdmFyIHdpZHRoID0gZ3JhcGhCQm94LndpZHRoIC8gZ3JhcGhab29tO1xuICAgIHZhciBoZWlnaHQgPSBncmFwaEJCb3guaGVpZ2h0IC8gZ3JhcGhab29tO1xuXG4gICAgaWYgKE51bWJlci5pc0Zpbml0ZShiYm94LndpZHRoKSkge1xuICAgICAgLy8g5Yi35paw5ZCOYmJveOWPr+iDveS8muWPmO+8jOmcgOimgemHjee9rueUu+W4g+efqemYteS7pee8qeaUvuWIsOWQiOmAgueahOWkp+Wwj1xuICAgICAgd2lkdGggPSBtYXgoYmJveC53aWR0aCwgd2lkdGgpO1xuICAgICAgaGVpZ2h0ID0gbWF4KGJib3guaGVpZ2h0LCBoZWlnaHQpO1xuICAgIH1cblxuICAgIHdpZHRoICs9IDIgKiBwYWRkaW5nO1xuICAgIGhlaWdodCArPSAyICogcGFkZGluZztcbiAgICB2YXIgcmF0aW8gPSBNYXRoLm1pbihzaXplWzBdIC8gd2lkdGgsIHNpemVbMV0gLyBoZWlnaHQpO1xuICAgIHZhciBtYXRyaXggPSBbMSwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMV07XG4gICAgdmFyIG1pblggPSAwO1xuICAgIHZhciBtaW5ZID0gMDsgLy8g5bmz56e75Yiw5bem5LiK6KeSXG5cbiAgICBpZiAoTnVtYmVyLmlzRmluaXRlKGJib3gubWluWCkpIHtcbiAgICAgIG1pblggPSAtYmJveC5taW5YO1xuICAgIH1cblxuICAgIGlmIChOdW1iZXIuaXNGaW5pdGUoYmJveC5taW5ZKSkge1xuICAgICAgbWluWSA9IC1iYm94Lm1pblk7XG4gICAgfSAvLyDnvKnmlL7liLDpgILlkIjop4blj6PlkI4sIOW5s+enu+WIsOeUu+W4g+S4reW/g1xuXG5cbiAgICB2YXIgZHggPSAoc2l6ZVswXSAtICh3aWR0aCAtIDIgKiBwYWRkaW5nKSAqIHJhdGlvKSAvIDI7XG4gICAgdmFyIGR5ID0gKHNpemVbMV0gLSAoaGVpZ2h0IC0gMiAqIHBhZGRpbmcpICogcmF0aW8pIC8gMjtcbiAgICBtYXRyaXggPSB0cmFuc2Zvcm0obWF0cml4LCBbWyd0JywgbWluWCwgbWluWV0sIFsncycsIHJhdGlvLCByYXRpb10sIFsndCcsIGR4LCBkeV0gLy8g56e75Yqo5Yiw55S75biD5Lit5b+DXG4gICAgXSk7XG4gICAgZ3JvdXAuc2V0TWF0cml4KG1hdHJpeCk7IC8vIOabtOaWsG1pbmltYXDop4blj6NcblxuICAgIHRoaXMuc2V0KCdyYXRpbycsIHJhdGlvKTtcbiAgICB0aGlzLnNldCgndG90YWxkeCcsIGR4ICsgbWluWCAqIHJhdGlvKTtcbiAgICB0aGlzLnNldCgndG90YWxkeScsIGR5ICsgbWluWSAqIHJhdGlvKTtcbiAgICB0aGlzLnNldCgnZHgnLCBkeCk7XG4gICAgdGhpcy5zZXQoJ2R5JywgZHkpO1xuICAgIHRoaXMudXBkYXRlVmlld3BvcnQoKTtcbiAgfTtcbiAgLyoqXG4gICAqIOiOt+WPlm1pbmltYXDnmoTnlLvluINcbiAgICogQHJldHVybiB7R0NhbnZhc30gR+eahGNhbnZhc+WunuS+i1xuICAgKi9cblxuXG4gIE1pbmlNYXAucHJvdG90eXBlLmdldENhbnZhcyA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXQoJ2NhbnZhcycpO1xuICB9O1xuICAvKipcbiAgICog6I635Y+WbWluaW1hcOeahOeql+WPo1xuICAgKiBAcmV0dXJuIHtIVE1MRWxlbWVudH0g56qX5Y+j55qEZG9t5a6e5L6LXG4gICAqL1xuXG5cbiAgTWluaU1hcC5wcm90b3R5cGUuZ2V0Vmlld3BvcnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KCd2aWV3cG9ydCcpO1xuICB9O1xuICAvKipcbiAgICog6I635Y+WbWluaW1hcOeahOWuueWZqGRvbVxuICAgKiBAcmV0dXJuIHtIVE1MRWxlbWVudH0gZG9tXG4gICAqL1xuXG5cbiAgTWluaU1hcC5wcm90b3R5cGUuZ2V0Q29udGFpbmVyID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLmdldCgnY29udGFpbmVyJyk7XG4gIH07XG5cbiAgTWluaU1hcC5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmdldCgnY2FudmFzJykuZGVzdHJveSgpO1xuICAgIHZhciBjb250YWluZXIgPSB0aGlzLmdldCgnY29udGFpbmVyJyk7XG4gICAgY29udGFpbmVyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoY29udGFpbmVyKTtcbiAgfTtcblxuICByZXR1cm4gTWluaU1hcDtcbn0oQmFzZSk7XG5cbmV4cG9ydCBkZWZhdWx0IE1pbmlNYXA7IiwidmFyIF9fZXh0ZW5kcyA9IHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMgfHwgZnVuY3Rpb24gKCkge1xuICB2YXIgX2V4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbiBleHRlbmRTdGF0aWNzKGQsIGIpIHtcbiAgICBfZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCB7XG4gICAgICBfX3Byb3RvX186IFtdXG4gICAgfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICBkLl9fcHJvdG9fXyA9IGI7XG4gICAgfSB8fCBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgZm9yICh2YXIgcCBpbiBiKSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdO1xuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gX2V4dGVuZFN0YXRpY3MoZCwgYik7XG4gIH07XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgaWYgKHR5cGVvZiBiICE9PSBcImZ1bmN0aW9uXCIgJiYgYiAhPT0gbnVsbCkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNsYXNzIGV4dGVuZHMgdmFsdWUgXCIgKyBTdHJpbmcoYikgKyBcIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsXCIpO1xuXG4gICAgX2V4dGVuZFN0YXRpY3MoZCwgYik7XG5cbiAgICBmdW5jdGlvbiBfXygpIHtcbiAgICAgIHRoaXMuY29uc3RydWN0b3IgPSBkO1xuICAgIH1cblxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgfTtcbn0oKTtcblxuaW1wb3J0IEJhc2UgZnJvbSAnLi4vYmFzZSc7XG5cbmZ1bmN0aW9uIGdldEV1Y2xpRGlzKHBvaW50QSwgcG9pbnRCLCBlcHMpIHtcbiAgdmFyIHZ4ID0gcG9pbnRBLnggLSBwb2ludEIueDtcbiAgdmFyIHZ5ID0gcG9pbnRBLnkgLSBwb2ludEIueTtcblxuICBpZiAoIWVwcyB8fCBNYXRoLmFicyh2eCkgPiBlcHMgfHwgTWF0aC5hYnModnkpID4gZXBzKSB7XG4gICAgcmV0dXJuIE1hdGguc3FydCh2eCAqIHZ4ICsgdnkgKiB2eSk7XG4gIH1cblxuICByZXR1cm4gZXBzO1xufVxuXG5mdW5jdGlvbiBnZXREb3RQcm9kdWN0KGVpLCBlaikge1xuICByZXR1cm4gZWkueCAqIGVqLnggKyBlaS55ICogZWoueTtcbn1cblxuZnVuY3Rpb24gcHJvamVjdFBvaW50VG9FZGdlKHAsIGUpIHtcbiAgdmFyIGsgPSAoZS5zb3VyY2UueSAtIGUudGFyZ2V0LnkpIC8gKGUuc291cmNlLnggLSBlLnRhcmdldC54KTtcbiAgdmFyIHggPSAoayAqIGsgKiBlLnNvdXJjZS54ICsgayAqIChwLnkgLSBlLnNvdXJjZS55KSArIHAueCkgLyAoayAqIGsgKyAxKTtcbiAgdmFyIHkgPSBrICogKHggLSBlLnNvdXJjZS54KSArIGUuc291cmNlLnk7XG4gIHJldHVybiB7XG4gICAgeDogeCxcbiAgICB5OiB5XG4gIH07XG59XG5cbnZhciBCdW5kbGluZyA9XG4vKiogQGNsYXNzICovXG5mdW5jdGlvbiAoX3N1cGVyKSB7XG4gIF9fZXh0ZW5kcyhCdW5kbGluZywgX3N1cGVyKTtcblxuICBmdW5jdGlvbiBCdW5kbGluZyhjb25maWcpIHtcbiAgICByZXR1cm4gX3N1cGVyLmNhbGwodGhpcywgY29uZmlnKSB8fCB0aGlzO1xuICB9XG5cbiAgQnVuZGxpbmcucHJvdG90eXBlLmdldERlZmF1bHRDZmdzID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB7XG4gICAgICBlZGdlQnVuZGxlczogW10sXG4gICAgICBlZGdlUG9pbnRzOiBbXSxcbiAgICAgIEs6IDAuMSxcbiAgICAgIGxhbWJkYTogMC4xLFxuICAgICAgZGl2aXNpb25zOiAxLFxuICAgICAgZGl2UmF0ZTogMixcbiAgICAgIGN5Y2xlczogNixcbiAgICAgIGl0ZXJhdGlvbnM6IDkwLFxuICAgICAgaXRlclJhdGU6IDAuNjY2NjY2NyxcbiAgICAgIGJ1bmRsZVRocmVzaG9sZDogMC42LFxuICAgICAgZXBzOiAxZS02LFxuICAgICAgb25MYXlvdXRFbmQ6IGZ1bmN0aW9uIG9uTGF5b3V0RW5kKCkge30sXG4gICAgICBvblRpY2s6IGZ1bmN0aW9uIG9uVGljaygpIHt9XG4gICAgfTtcbiAgfTtcblxuICBCdW5kbGluZy5wcm90b3R5cGUuaW5pdCA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZ3JhcGggPSB0aGlzLmdldCgnZ3JhcGgnKTtcbiAgICB2YXIgb25UaWNrID0gdGhpcy5nZXQoJ29uVGljaycpO1xuXG4gICAgdmFyIHRpY2sgPSBmdW5jdGlvbiB0aWNrKCkge1xuICAgICAgaWYgKG9uVGljaykge1xuICAgICAgICBvblRpY2soKTtcbiAgICAgIH1cblxuICAgICAgZ3JhcGgucmVmcmVzaFBvc2l0aW9ucygpO1xuICAgIH07XG5cbiAgICB0aGlzLnNldCgndGljaycsIHRpY2spO1xuICB9O1xuXG4gIEJ1bmRsaW5nLnByb3RvdHlwZS5idW5kbGluZyA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHNlbGYuc2V0KCdkYXRhJywgZGF0YSk7IC8vIOWmguaenOato+WcqOW4g+WxgO+8jOW/veeVpeW4g+WxgOivt+axglxuXG4gICAgaWYgKHNlbGYuaXNUaWNraW5nKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgZWRnZXMgPSBkYXRhLmVkZ2VzIHx8IFtdO1xuICAgIHZhciBub2RlcyA9IGRhdGEubm9kZXMgfHwgW107XG4gICAgdmFyIG5vZGVJZE1hcCA9IHt9O1xuICAgIHZhciBlcnJvciA9IGZhbHNlO1xuICAgIG5vZGVzLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgIGlmIChub2RlLnggPT09IG51bGwgfHwgIW5vZGUueSA9PT0gbnVsbCB8fCBub2RlLnggPT09IHVuZGVmaW5lZCB8fCAhbm9kZS55ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZXJyb3IgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBub2RlSWRNYXBbbm9kZS5pZF0gPSBub2RlO1xuICAgIH0pO1xuICAgIGlmIChlcnJvcikgdGhyb3cgbmV3IEVycm9yKCdwbGVhc2UgbGF5b3V0IHRoZSBncmFwaCBvciBhc3NpZ24geCBhbmQgeSBmb3Igbm9kZXMgZmlyc3QnKTtcbiAgICBzZWxmLnNldCgnbm9kZUlkTWFwJywgbm9kZUlkTWFwKTsgLy8gc3ViZGl2aWRlIGVhY2ggZWRnZXNcblxuICAgIHZhciBkaXZpc2lvbnMgPSBzZWxmLmdldCgnZGl2aXNpb25zJyk7XG4gICAgdmFyIGRpdlJhdGUgPSBzZWxmLmdldCgnZGl2UmF0ZScpO1xuICAgIHZhciBlZGdlUG9pbnRzID0gc2VsZi5kaXZpZGVFZGdlcyhkaXZpc2lvbnMpO1xuICAgIHNlbGYuc2V0KCdlZGdlUG9pbnRzJywgZWRnZVBvaW50cyk7IC8vIGNvbXB1dGUgdGhlIGJ1bmRsZXNcblxuICAgIHZhciBlZGdlQnVuZGxlcyA9IHNlbGYuZ2V0RWRnZUJ1bmRsZXMoKTtcbiAgICBzZWxmLnNldCgnZWRnZUJ1bmRsZXMnLCBlZGdlQnVuZGxlcyk7IC8vIGl0ZXJhdGlvbnNcblxuICAgIHZhciBDID0gc2VsZi5nZXQoJ2N5Y2xlcycpO1xuICAgIHZhciBpdGVyYXRpb25zID0gc2VsZi5nZXQoJ2l0ZXJhdGlvbnMnKTtcbiAgICB2YXIgaXRlclJhdGUgPSBzZWxmLmdldCgnaXRlclJhdGUnKTtcbiAgICB2YXIgbGFtYmRhID0gc2VsZi5nZXQoJ2xhbWJkYScpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBDOyBpKyspIHtcbiAgICAgIHZhciBfbG9vcF8xID0gZnVuY3Rpb24gX2xvb3BfMShqKSB7XG4gICAgICAgIHZhciBmb3JjZXMgPSBbXTtcbiAgICAgICAgZWRnZXMuZm9yRWFjaChmdW5jdGlvbiAoZSwgaykge1xuICAgICAgICAgIGlmIChlLnNvdXJjZSA9PT0gZS50YXJnZXQpIHJldHVybjtcbiAgICAgICAgICB2YXIgc291cmNlID0gbm9kZUlkTWFwW2Uuc291cmNlXTtcbiAgICAgICAgICB2YXIgdGFyZ2V0ID0gbm9kZUlkTWFwW2UudGFyZ2V0XTtcbiAgICAgICAgICBmb3JjZXNba10gPSBzZWxmLmdldEVkZ2VGb3JjZXMoe1xuICAgICAgICAgICAgc291cmNlOiBzb3VyY2UsXG4gICAgICAgICAgICB0YXJnZXQ6IHRhcmdldFxuICAgICAgICAgIH0sIGssIGRpdmlzaW9ucywgbGFtYmRhKTtcblxuICAgICAgICAgIGZvciAodmFyIHAgPSAwOyBwIDwgZGl2aXNpb25zICsgMTsgcCsrKSB7XG4gICAgICAgICAgICBlZGdlUG9pbnRzW2tdW3BdLnggKz0gZm9yY2VzW2tdW3BdLng7XG4gICAgICAgICAgICBlZGdlUG9pbnRzW2tdW3BdLnkgKz0gZm9yY2VzW2tdW3BdLnk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH07XG5cbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgaXRlcmF0aW9uczsgaisrKSB7XG4gICAgICAgIF9sb29wXzEoaik7XG4gICAgICB9IC8vIHBhcmFtZXRlcnMgZm9yIG5leCBjeWNsZVxuXG5cbiAgICAgIGxhbWJkYSA9IGxhbWJkYSAvIDI7XG4gICAgICBkaXZpc2lvbnMgKj0gZGl2UmF0ZTtcbiAgICAgIGl0ZXJhdGlvbnMgKj0gaXRlclJhdGU7XG4gICAgICBlZGdlUG9pbnRzID0gc2VsZi5kaXZpZGVFZGdlcyhkaXZpc2lvbnMpO1xuICAgICAgc2VsZi5zZXQoJ2VkZ2VQb2ludHMnLCBlZGdlUG9pbnRzKTtcbiAgICB9IC8vIGNoYW5nZSB0aGUgZWRnZXMgYWNjb3JkaW5nIHRvIGVkZ2VQb2ludHNcblxuXG4gICAgZWRnZXMuZm9yRWFjaChmdW5jdGlvbiAoZSwgaSkge1xuICAgICAgaWYgKGUuc291cmNlID09PSBlLnRhcmdldCkgcmV0dXJuO1xuICAgICAgZS50eXBlID0gJ3BvbHlsaW5lJztcbiAgICAgIGUuY29udHJvbFBvaW50cyA9IGVkZ2VQb2ludHNbaV0uc2xpY2UoMSwgZWRnZVBvaW50c1tpXS5sZW5ndGggLSAxKTtcbiAgICB9KTtcbiAgICB2YXIgZ3JhcGggPSBzZWxmLmdldCgnZ3JhcGgnKTtcbiAgICBncmFwaC5yZWZyZXNoKCk7XG4gIH07XG5cbiAgQnVuZGxpbmcucHJvdG90eXBlLnVwZGF0ZUJ1bmRsaW5nID0gZnVuY3Rpb24gKGNmZykge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgZGF0YSA9IGNmZy5kYXRhO1xuXG4gICAgaWYgKGRhdGEpIHtcbiAgICAgIHNlbGYuc2V0KCdkYXRhJywgZGF0YSk7XG4gICAgfVxuXG4gICAgaWYgKHNlbGYuZ2V0KCd0aWNraW5nJykpIHtcbiAgICAgIHNlbGYuc2V0KCd0aWNraW5nJywgZmFsc2UpO1xuICAgIH1cblxuICAgIE9iamVjdC5rZXlzKGNmZykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICBzZWxmLnNldChrZXksIGNmZ1trZXldKTtcbiAgICB9KTtcblxuICAgIGlmIChjZmcub25UaWNrKSB7XG4gICAgICB2YXIgZ3JhcGhfMSA9IHRoaXMuZ2V0KCdncmFwaCcpO1xuICAgICAgc2VsZi5zZXQoJ3RpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNmZy5vblRpY2soKTtcbiAgICAgICAgZ3JhcGhfMS5yZWZyZXNoKCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBzZWxmLmJ1bmRsaW5nKGRhdGEpO1xuICB9O1xuXG4gIEJ1bmRsaW5nLnByb3RvdHlwZS5kaXZpZGVFZGdlcyA9IGZ1bmN0aW9uIChkaXZpc2lvbnMpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIGVkZ2VzID0gc2VsZi5nZXQoJ2RhdGEnKS5lZGdlcztcbiAgICB2YXIgbm9kZUlkTWFwID0gc2VsZi5nZXQoJ25vZGVJZE1hcCcpO1xuICAgIHZhciBlZGdlUG9pbnRzID0gc2VsZi5nZXQoJ2VkZ2VQb2ludHMnKTtcbiAgICBpZiAoIWVkZ2VQb2ludHMgfHwgZWRnZVBvaW50cyA9PT0gdW5kZWZpbmVkKSBlZGdlUG9pbnRzID0gW107XG4gICAgZWRnZXMuZm9yRWFjaChmdW5jdGlvbiAoZWRnZSwgaSkge1xuICAgICAgaWYgKCFlZGdlUG9pbnRzW2ldIHx8IGVkZ2VQb2ludHNbaV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBlZGdlUG9pbnRzW2ldID0gW107XG4gICAgICB9XG5cbiAgICAgIHZhciBzb3VyY2UgPSBub2RlSWRNYXBbZWRnZS5zb3VyY2VdO1xuICAgICAgdmFyIHRhcmdldCA9IG5vZGVJZE1hcFtlZGdlLnRhcmdldF07XG5cbiAgICAgIGlmIChkaXZpc2lvbnMgPT09IDEpIHtcbiAgICAgICAgZWRnZVBvaW50c1tpXS5wdXNoKHtcbiAgICAgICAgICB4OiBzb3VyY2UueCxcbiAgICAgICAgICB5OiBzb3VyY2UueVxuICAgICAgICB9KTsgLy8gc291cmNlXG5cbiAgICAgICAgZWRnZVBvaW50c1tpXS5wdXNoKHtcbiAgICAgICAgICB4OiAwLjUgKiAoc291cmNlLnggKyB0YXJnZXQueCksXG4gICAgICAgICAgeTogMC41ICogKHNvdXJjZS55ICsgdGFyZ2V0LnkpXG4gICAgICAgIH0pOyAvLyBtaWRcblxuICAgICAgICBlZGdlUG9pbnRzW2ldLnB1c2goe1xuICAgICAgICAgIHg6IHRhcmdldC54LFxuICAgICAgICAgIHk6IHRhcmdldC55XG4gICAgICAgIH0pOyAvLyB0YXJnZXRcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBlZGdlTGVuZ3RoID0gMDtcblxuICAgICAgICBpZiAoIWVkZ2VQb2ludHNbaV0gfHwgZWRnZVBvaW50c1tpXSA9PT0gW10pIHtcbiAgICAgICAgICAvLyBpdCBpcyBhIHN0cmFpZ2h0IGxpbmVcbiAgICAgICAgICBlZGdlTGVuZ3RoID0gZ2V0RXVjbGlEaXMoe1xuICAgICAgICAgICAgeDogc291cmNlLngsXG4gICAgICAgICAgICB5OiBzb3VyY2UueVxuICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgIHg6IHRhcmdldC54LFxuICAgICAgICAgICAgeTogdGFyZ2V0LnlcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlZGdlTGVuZ3RoID0gc2VsZi5nZXRFZGdlTGVuZ3RoKGVkZ2VQb2ludHNbaV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGRpdmlzaW9uTGVuZ3RoXzEgPSBlZGdlTGVuZ3RoIC8gKGRpdmlzaW9ucyArIDEpO1xuICAgICAgICB2YXIgY3VycmVudERpdmlzb25MZW5ndGhfMSA9IGRpdmlzaW9uTGVuZ3RoXzE7XG4gICAgICAgIHZhciBuZXdFZGdlUG9pbnRzXzEgPSBbe1xuICAgICAgICAgIHg6IHNvdXJjZS54LFxuICAgICAgICAgIHk6IHNvdXJjZS55XG4gICAgICAgIH1dOyAvLyBzb3VyY2VcblxuICAgICAgICBlZGdlUG9pbnRzW2ldLmZvckVhY2goZnVuY3Rpb24gKGVwLCBqKSB7XG4gICAgICAgICAgaWYgKGogPT09IDApIHJldHVybjtcbiAgICAgICAgICB2YXIgb3JpRGl2aXNpb25MZW5ndGggPSBnZXRFdWNsaURpcyhlcCwgZWRnZVBvaW50c1tpXVtqIC0gMV0pO1xuXG4gICAgICAgICAgd2hpbGUgKG9yaURpdmlzaW9uTGVuZ3RoID4gY3VycmVudERpdmlzb25MZW5ndGhfMSkge1xuICAgICAgICAgICAgdmFyIHJhdGlvID0gY3VycmVudERpdmlzb25MZW5ndGhfMSAvIG9yaURpdmlzaW9uTGVuZ3RoO1xuICAgICAgICAgICAgdmFyIGVkZ2VQb2ludCA9IHtcbiAgICAgICAgICAgICAgeDogZWRnZVBvaW50c1tpXVtqIC0gMV0ueCxcbiAgICAgICAgICAgICAgeTogZWRnZVBvaW50c1tpXVtqIC0gMV0ueVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGVkZ2VQb2ludC54ICs9IHJhdGlvICogKGVwLnggLSBlZGdlUG9pbnRzW2ldW2ogLSAxXS54KTtcbiAgICAgICAgICAgIGVkZ2VQb2ludC55ICs9IHJhdGlvICogKGVwLnkgLSBlZGdlUG9pbnRzW2ldW2ogLSAxXS55KTtcbiAgICAgICAgICAgIG5ld0VkZ2VQb2ludHNfMS5wdXNoKGVkZ2VQb2ludCk7XG4gICAgICAgICAgICBvcmlEaXZpc2lvbkxlbmd0aCAtPSBjdXJyZW50RGl2aXNvbkxlbmd0aF8xO1xuICAgICAgICAgICAgY3VycmVudERpdmlzb25MZW5ndGhfMSA9IGRpdmlzaW9uTGVuZ3RoXzE7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY3VycmVudERpdmlzb25MZW5ndGhfMSAtPSBvcmlEaXZpc2lvbkxlbmd0aDtcbiAgICAgICAgfSk7XG4gICAgICAgIG5ld0VkZ2VQb2ludHNfMS5wdXNoKHtcbiAgICAgICAgICB4OiB0YXJnZXQueCxcbiAgICAgICAgICB5OiB0YXJnZXQueVxuICAgICAgICB9KTsgLy8gdGFyZ2V0XG5cbiAgICAgICAgZWRnZVBvaW50c1tpXSA9IG5ld0VkZ2VQb2ludHNfMTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gZWRnZVBvaW50cztcbiAgfTtcbiAgLyoqXG4gICAqIOiuoeeul+i+ueeahOmVv+W6plxuICAgKiBAcGFyYW0gcG9pbnRzXG4gICAqL1xuXG5cbiAgQnVuZGxpbmcucHJvdG90eXBlLmdldEVkZ2VMZW5ndGggPSBmdW5jdGlvbiAocG9pbnRzKSB7XG4gICAgdmFyIGxlbmd0aCA9IDA7XG4gICAgcG9pbnRzLmZvckVhY2goZnVuY3Rpb24gKHAsIGkpIHtcbiAgICAgIGlmIChpID09PSAwKSByZXR1cm47XG4gICAgICBsZW5ndGggKz0gZ2V0RXVjbGlEaXMocCwgcG9pbnRzW2kgLSAxXSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGxlbmd0aDtcbiAgfTtcblxuICBCdW5kbGluZy5wcm90b3R5cGUuZ2V0RWRnZUJ1bmRsZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBkYXRhID0gc2VsZi5nZXQoJ2RhdGEnKTtcbiAgICB2YXIgZWRnZXMgPSBkYXRhLmVkZ2VzIHx8IFtdO1xuICAgIHZhciBidW5kbGVUaHJlc2hvbGQgPSBzZWxmLmdldCgnYnVuZGxlVGhyZXNob2xkJyk7XG4gICAgdmFyIG5vZGVJZE1hcCA9IHNlbGYuZ2V0KCdub2RlSWRNYXAnKTtcbiAgICB2YXIgZWRnZUJ1bmRsZXMgPSBzZWxmLmdldCgnZWRnZUJ1bmRsZXMnKTtcbiAgICBpZiAoIWVkZ2VCdW5kbGVzKSBlZGdlQnVuZGxlcyA9IFtdO1xuICAgIGVkZ2VzLmZvckVhY2goZnVuY3Rpb24gKGUsIGkpIHtcbiAgICAgIGlmICghZWRnZUJ1bmRsZXNbaV0gfHwgZWRnZUJ1bmRsZXNbaV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBlZGdlQnVuZGxlc1tpXSA9IFtdO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGVkZ2VzLmZvckVhY2goZnVuY3Rpb24gKGVpLCBpKSB7XG4gICAgICB2YXIgaVNvdXJjZSA9IG5vZGVJZE1hcFtlaS5zb3VyY2VdO1xuICAgICAgdmFyIGlUYXJnZXQgPSBub2RlSWRNYXBbZWkudGFyZ2V0XTtcbiAgICAgIGVkZ2VzLmZvckVhY2goZnVuY3Rpb24gKGVqLCBqKSB7XG4gICAgICAgIGlmIChqIDw9IGkpIHJldHVybjtcbiAgICAgICAgdmFyIGpTb3VyY2UgPSBub2RlSWRNYXBbZWouc291cmNlXTtcbiAgICAgICAgdmFyIGpUYXJnZXQgPSBub2RlSWRNYXBbZWoudGFyZ2V0XTtcbiAgICAgICAgdmFyIHNjb3JlID0gc2VsZi5nZXRCdW5kbGVTY29yZSh7XG4gICAgICAgICAgc291cmNlOiBpU291cmNlLFxuICAgICAgICAgIHRhcmdldDogaVRhcmdldFxuICAgICAgICB9LCB7XG4gICAgICAgICAgc291cmNlOiBqU291cmNlLFxuICAgICAgICAgIHRhcmdldDogalRhcmdldFxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoc2NvcmUgPj0gYnVuZGxlVGhyZXNob2xkKSB7XG4gICAgICAgICAgZWRnZUJ1bmRsZXNbaV0ucHVzaChqKTtcbiAgICAgICAgICBlZGdlQnVuZGxlc1tqXS5wdXNoKGkpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gZWRnZUJ1bmRsZXM7XG4gIH07XG5cbiAgQnVuZGxpbmcucHJvdG90eXBlLmdldEJ1bmRsZVNjb3JlID0gZnVuY3Rpb24gKGVpLCBlaikge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBlaS52eCA9IGVpLnRhcmdldC54IC0gZWkuc291cmNlLng7XG4gICAgZWkudnkgPSBlaS50YXJnZXQueSAtIGVpLnNvdXJjZS55O1xuICAgIGVqLnZ4ID0gZWoudGFyZ2V0LnggLSBlai5zb3VyY2UueDtcbiAgICBlai52eSA9IGVqLnRhcmdldC55IC0gZWouc291cmNlLnk7XG4gICAgZWkubGVuZ3RoID0gZ2V0RXVjbGlEaXMoe1xuICAgICAgeDogZWkuc291cmNlLngsXG4gICAgICB5OiBlaS5zb3VyY2UueVxuICAgIH0sIHtcbiAgICAgIHg6IGVpLnRhcmdldC54LFxuICAgICAgeTogZWkudGFyZ2V0LnlcbiAgICB9KTtcbiAgICBlai5sZW5ndGggPSBnZXRFdWNsaURpcyh7XG4gICAgICB4OiBlai5zb3VyY2UueCxcbiAgICAgIHk6IGVqLnNvdXJjZS55XG4gICAgfSwge1xuICAgICAgeDogZWoudGFyZ2V0LngsXG4gICAgICB5OiBlai50YXJnZXQueVxuICAgIH0pOyAvLyBhbmdsZSBzY29yZVxuXG4gICAgdmFyIGFTY29yZSA9IHNlbGYuZ2V0QW5nbGVTY29yZShlaSwgZWopOyAvLyBzY2FsZSBzY29yZVxuXG4gICAgdmFyIHNTY29yZSA9IHNlbGYuZ2V0U2NhbGVTY29yZShlaSwgZWopOyAvLyBwb3NpdGlvbiBzY29yZVxuXG4gICAgdmFyIHBTY29yZSA9IHNlbGYuZ2V0UG9zaXRpb25TY29yZShlaSwgZWopOyAvLyB2aXNpYmlsaXR5IHNvY3JlXG5cbiAgICB2YXIgdlNjb3JlID0gc2VsZi5nZXRWaXNpYmlsaXR5U2NvcmUoZWksIGVqKTtcbiAgICByZXR1cm4gYVNjb3JlICogc1Njb3JlICogcFNjb3JlICogdlNjb3JlO1xuICB9O1xuXG4gIEJ1bmRsaW5nLnByb3RvdHlwZS5nZXRBbmdsZVNjb3JlID0gZnVuY3Rpb24gKGVpLCBlaikge1xuICAgIHZhciBkb3RQcm9kdWN0ID0gZ2V0RG90UHJvZHVjdCh7XG4gICAgICB4OiBlaS52eCxcbiAgICAgIHk6IGVpLnZ5XG4gICAgfSwge1xuICAgICAgeDogZWoudngsXG4gICAgICB5OiBlai52eVxuICAgIH0pO1xuICAgIHJldHVybiBkb3RQcm9kdWN0IC8gKGVpLmxlbmd0aCAqIGVqLmxlbmd0aCk7XG4gIH07XG5cbiAgQnVuZGxpbmcucHJvdG90eXBlLmdldFNjYWxlU2NvcmUgPSBmdW5jdGlvbiAoZWksIGVqKSB7XG4gICAgdmFyIGFMZW5ndGggPSAoZWkubGVuZ3RoICsgZWoubGVuZ3RoKSAvIDI7XG4gICAgdmFyIHNjb3JlID0gMiAvIChhTGVuZ3RoIC8gTWF0aC5taW4oZWkubGVuZ3RoLCBlai5sZW5ndGgpICsgTWF0aC5tYXgoZWkubGVuZ3RoLCBlai5sZW5ndGgpIC8gYUxlbmd0aCk7XG4gICAgcmV0dXJuIHNjb3JlO1xuICB9O1xuXG4gIEJ1bmRsaW5nLnByb3RvdHlwZS5nZXRQb3NpdGlvblNjb3JlID0gZnVuY3Rpb24gKGVpLCBlaikge1xuICAgIHZhciBhTGVuZ3RoID0gKGVpLmxlbmd0aCArIGVqLmxlbmd0aCkgLyAyO1xuICAgIHZhciBpTWlkID0ge1xuICAgICAgeDogKGVpLnNvdXJjZS54ICsgZWkudGFyZ2V0LngpIC8gMixcbiAgICAgIHk6IChlaS5zb3VyY2UueSArIGVpLnRhcmdldC55KSAvIDJcbiAgICB9O1xuICAgIHZhciBqTWlkID0ge1xuICAgICAgeDogKGVqLnNvdXJjZS54ICsgZWoudGFyZ2V0LngpIC8gMixcbiAgICAgIHk6IChlai5zb3VyY2UueSArIGVqLnRhcmdldC55KSAvIDJcbiAgICB9O1xuICAgIHZhciBkaXN0YW5jZSA9IGdldEV1Y2xpRGlzKGlNaWQsIGpNaWQpO1xuICAgIHJldHVybiBhTGVuZ3RoIC8gKGFMZW5ndGggKyBkaXN0YW5jZSk7XG4gIH07XG5cbiAgQnVuZGxpbmcucHJvdG90eXBlLmdldFZpc2liaWxpdHlTY29yZSA9IGZ1bmN0aW9uIChlaSwgZWopIHtcbiAgICB2YXIgdmlqID0gdGhpcy5nZXRFZGdlVmlzaWJpbGl0eShlaSwgZWopO1xuICAgIHZhciB2amkgPSB0aGlzLmdldEVkZ2VWaXNpYmlsaXR5KGVqLCBlaSk7XG4gICAgcmV0dXJuIHZpaiA8IHZqaSA/IHZpaiA6IHZqaTtcbiAgfTtcblxuICBCdW5kbGluZy5wcm90b3R5cGUuZ2V0RWRnZVZpc2liaWxpdHkgPSBmdW5jdGlvbiAoZWksIGVqKSB7XG4gICAgdmFyIHBzID0gcHJvamVjdFBvaW50VG9FZGdlKGVqLnNvdXJjZSwgZWkpO1xuICAgIHZhciBwdCA9IHByb2plY3RQb2ludFRvRWRnZShlai50YXJnZXQsIGVpKTtcbiAgICB2YXIgcE1pZCA9IHtcbiAgICAgIHg6IChwcy54ICsgcHQueCkgLyAyLFxuICAgICAgeTogKHBzLnkgKyBwdC55KSAvIDJcbiAgICB9O1xuICAgIHZhciBpTWlkID0ge1xuICAgICAgeDogKGVpLnNvdXJjZS54ICsgZWkudGFyZ2V0LngpIC8gMixcbiAgICAgIHk6IChlaS5zb3VyY2UueSArIGVpLnRhcmdldC55KSAvIDJcbiAgICB9O1xuICAgIHJldHVybiBNYXRoLm1heCgwLCAxIC0gMiAqIGdldEV1Y2xpRGlzKHBNaWQsIGlNaWQpIC8gZ2V0RXVjbGlEaXMocHMsIHB0KSk7XG4gIH07XG5cbiAgQnVuZGxpbmcucHJvdG90eXBlLmdldEVkZ2VGb3JjZXMgPSBmdW5jdGlvbiAoZSwgZWlkeCwgZGl2aXNpb25zLCBsYW1iZGEpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIGVkZ2VQb2ludHMgPSBzZWxmLmdldCgnZWRnZVBvaW50cycpO1xuICAgIHZhciBLID0gc2VsZi5nZXQoJ0snKTtcbiAgICB2YXIga3AgPSBLIC8gKGdldEV1Y2xpRGlzKGUuc291cmNlLCBlLnRhcmdldCkgKiAoZGl2aXNpb25zICsgMSkpO1xuICAgIHZhciBlZGdlUG9pbnRGb3JjZXMgPSBbe1xuICAgICAgeDogMCxcbiAgICAgIHk6IDBcbiAgICB9XTtcblxuICAgIGZvciAodmFyIGkgPSAxOyBpIDwgZGl2aXNpb25zOyBpKyspIHtcbiAgICAgIHZhciBmb3JjZSA9IHtcbiAgICAgICAgeDogMCxcbiAgICAgICAgeTogMFxuICAgICAgfTtcbiAgICAgIHZhciBzcHJpbmcgPSBzZWxmLmdldFNwcmluZ0ZvcmNlKHtcbiAgICAgICAgcHJlOiBlZGdlUG9pbnRzW2VpZHhdW2kgLSAxXSxcbiAgICAgICAgY3VyOiBlZGdlUG9pbnRzW2VpZHhdW2ldLFxuICAgICAgICBuZXh0OiBlZGdlUG9pbnRzW2VpZHhdW2kgKyAxXVxuICAgICAgfSwga3ApO1xuICAgICAgdmFyIGVsZWN0cm9zdGF0aWMgPSBzZWxmLmdldEVsZWN0cm9zdGF0aWNGb3JjZShpLCBlaWR4KTtcbiAgICAgIGZvcmNlLnggPSBsYW1iZGEgKiAoc3ByaW5nLnggKyBlbGVjdHJvc3RhdGljLngpO1xuICAgICAgZm9yY2UueSA9IGxhbWJkYSAqIChzcHJpbmcueSArIGVsZWN0cm9zdGF0aWMueSk7XG4gICAgICBlZGdlUG9pbnRGb3JjZXMucHVzaChmb3JjZSk7XG4gICAgfVxuXG4gICAgZWRnZVBvaW50Rm9yY2VzLnB1c2goe1xuICAgICAgeDogMCxcbiAgICAgIHk6IDBcbiAgICB9KTtcbiAgICByZXR1cm4gZWRnZVBvaW50Rm9yY2VzO1xuICB9O1xuXG4gIEJ1bmRsaW5nLnByb3RvdHlwZS5nZXRTcHJpbmdGb3JjZSA9IGZ1bmN0aW9uIChkaXZpc2lvbnMsIGtwKSB7XG4gICAgdmFyIHggPSBkaXZpc2lvbnMucHJlLnggKyBkaXZpc2lvbnMubmV4dC54IC0gMiAqIGRpdmlzaW9ucy5jdXIueDtcbiAgICB2YXIgeSA9IGRpdmlzaW9ucy5wcmUueSArIGRpdmlzaW9ucy5uZXh0LnkgLSAyICogZGl2aXNpb25zLmN1ci55O1xuICAgIHggKj0ga3A7XG4gICAgeSAqPSBrcDtcbiAgICByZXR1cm4ge1xuICAgICAgeDogeCxcbiAgICAgIHk6IHlcbiAgICB9O1xuICB9O1xuXG4gIEJ1bmRsaW5nLnByb3RvdHlwZS5nZXRFbGVjdHJvc3RhdGljRm9yY2UgPSBmdW5jdGlvbiAocGlkeCwgZWlkeCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgZXBzID0gc2VsZi5nZXQoJ2VwcycpO1xuICAgIHZhciBlZGdlQnVuZGxlcyA9IHNlbGYuZ2V0KCdlZGdlQnVuZGxlcycpO1xuICAgIHZhciBlZGdlUG9pbnRzID0gc2VsZi5nZXQoJ2VkZ2VQb2ludHMnKTtcbiAgICB2YXIgZWRnZUJ1bmRsZSA9IGVkZ2VCdW5kbGVzW2VpZHhdO1xuICAgIHZhciByZXNGb3JjZSA9IHtcbiAgICAgIHg6IDAsXG4gICAgICB5OiAwXG4gICAgfTtcbiAgICBlZGdlQnVuZGxlLmZvckVhY2goZnVuY3Rpb24gKGViKSB7XG4gICAgICB2YXIgZm9yY2UgPSB7XG4gICAgICAgIHg6IGVkZ2VQb2ludHNbZWJdW3BpZHhdLnggLSBlZGdlUG9pbnRzW2VpZHhdW3BpZHhdLngsXG4gICAgICAgIHk6IGVkZ2VQb2ludHNbZWJdW3BpZHhdLnkgLSBlZGdlUG9pbnRzW2VpZHhdW3BpZHhdLnlcbiAgICAgIH07XG5cbiAgICAgIGlmIChNYXRoLmFicyhmb3JjZS54KSA+IGVwcyB8fCBNYXRoLmFicyhmb3JjZS55KSA+IGVwcykge1xuICAgICAgICB2YXIgbGVuZ3RoXzEgPSBnZXRFdWNsaURpcyhlZGdlUG9pbnRzW2ViXVtwaWR4XSwgZWRnZVBvaW50c1tlaWR4XVtwaWR4XSk7XG4gICAgICAgIHZhciBkaWZmID0gMSAvIGxlbmd0aF8xO1xuICAgICAgICByZXNGb3JjZS54ICs9IGZvcmNlLnggKiBkaWZmO1xuICAgICAgICByZXNGb3JjZS55ICs9IGZvcmNlLnkgKiBkaWZmO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiByZXNGb3JjZTtcbiAgfTtcblxuICBCdW5kbGluZy5wcm90b3R5cGUuaXNUaWNraW5nID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLmdldCgndGlja2luZycpO1xuICB9O1xuXG4gIEJ1bmRsaW5nLnByb3RvdHlwZS5nZXRTaW11bGF0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLmdldCgnZm9yY2VTaW11bGF0aW9uJyk7XG4gIH07XG5cbiAgQnVuZGxpbmcucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHRoaXMuZ2V0KCd0aWNraW5nJykpIHtcbiAgICAgIHRoaXMuZ2V0U2ltdWxhdGlvbigpLnN0b3AoKTtcbiAgICB9XG5cbiAgICBfc3VwZXIucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCh0aGlzKTtcbiAgfTtcblxuICByZXR1cm4gQnVuZGxpbmc7XG59KEJhc2UpO1xuXG5leHBvcnQgZGVmYXVsdCBCdW5kbGluZzsiLCJ2YXIgX19leHRlbmRzID0gdGhpcyAmJiB0aGlzLl9fZXh0ZW5kcyB8fCBmdW5jdGlvbiAoKSB7XG4gIHZhciBfZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uIGV4dGVuZFN0YXRpY3MoZCwgYikge1xuICAgIF9leHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8IHtcbiAgICAgIF9fcHJvdG9fXzogW11cbiAgICB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgIGQuX19wcm90b19fID0gYjtcbiAgICB9IHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICBmb3IgKHZhciBwIGluIGIpIHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBwKSkgZFtwXSA9IGJbcF07XG4gICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiBfZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgfTtcblxuICByZXR1cm4gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICBpZiAodHlwZW9mIGIgIT09IFwiZnVuY3Rpb25cIiAmJiBiICE9PSBudWxsKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2xhc3MgZXh0ZW5kcyB2YWx1ZSBcIiArIFN0cmluZyhiKSArIFwiIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGxcIik7XG5cbiAgICBfZXh0ZW5kU3RhdGljcyhkLCBiKTtcblxuICAgIGZ1bmN0aW9uIF9fKCkge1xuICAgICAgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7XG4gICAgfVxuXG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xuICB9O1xufSgpO1xuXG52YXIgX19hc3NpZ24gPSB0aGlzICYmIHRoaXMuX19hc3NpZ24gfHwgZnVuY3Rpb24gKCkge1xuICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHQpIHtcbiAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgIHMgPSBhcmd1bWVudHNbaV07XG5cbiAgICAgIGZvciAodmFyIHAgaW4gcykge1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0W3BdID0gc1twXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdDtcbiAgfTtcblxuICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn07XG5cbmltcG9ydCB7IGNsb25lIH0gZnJvbSAnQGFudHYvdXRpbCc7XG5pbXBvcnQgQmFzZSBmcm9tICcuLi9iYXNlJztcbnZhciBERUxUQSA9IDAuMDU7XG52YXIgbGVuc0RlbGVnYXRlU3R5bGUgPSB7XG4gIHN0cm9rZTogJyMwMDAnLFxuICBzdHJva2VPcGFjaXR5OiAwLjgsXG4gIGxpbmVXaWR0aDogMixcbiAgZmlsbE9wYWNpdHk6IDAuMSxcbiAgZmlsbDogJyNjY2MnXG59O1xuXG52YXIgRmlzaGV5ZSA9XG4vKiogQGNsYXNzICovXG5mdW5jdGlvbiAoX3N1cGVyKSB7XG4gIF9fZXh0ZW5kcyhGaXNoZXllLCBfc3VwZXIpO1xuXG4gIGZ1bmN0aW9uIEZpc2hleWUoY29uZmlnKSB7XG4gICAgcmV0dXJuIF9zdXBlci5jYWxsKHRoaXMsIGNvbmZpZykgfHwgdGhpcztcbiAgfVxuXG4gIEZpc2hleWUucHJvdG90eXBlLmdldERlZmF1bHRDZmdzID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB7XG4gICAgICB0cmlnZ2VyOiAnbW91c2Vtb3ZlJyxcbiAgICAgIGQ6IDEuNSxcbiAgICAgIHI6IDMwMCxcbiAgICAgIGRlbGVnYXRlU3R5bGU6IGNsb25lKGxlbnNEZWxlZ2F0ZVN0eWxlKSxcbiAgICAgIHNob3dMYWJlbDogZmFsc2UsXG4gICAgICBtYXhEOiA1LFxuICAgICAgbWluRDogMCxcbiAgICAgIHNjYWxlUkJ5OiAndW5zZXQnLFxuICAgICAgc2NhbGVEQnk6ICd1bnNldCcsXG4gICAgICBzaG93RFBlcmNlbnQ6IHRydWVcbiAgICB9O1xuICB9OyAvLyBjbGFzcy1tZXRob2RzLXVzZS10aGlzXG5cblxuICBGaXNoZXllLnByb3RvdHlwZS5nZXRFdmVudHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGV2ZW50cztcblxuICAgIHN3aXRjaCAodGhpcy5nZXQoJ3RyaWdnZXInKSkge1xuICAgICAgY2FzZSAnY2xpY2snOlxuICAgICAgICBldmVudHMgPSB7XG4gICAgICAgICAgY2xpY2s6ICdtYWduaWZ5J1xuICAgICAgICB9O1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnZHJhZyc6XG4gICAgICAgIGV2ZW50cyA9IHtcbiAgICAgICAgICBjbGljazogJ2NyZWF0ZURlbGVnYXRlJ1xuICAgICAgICB9O1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgZXZlbnRzID0ge1xuICAgICAgICAgIG1vdXNlbW92ZTogJ21hZ25pZnknXG4gICAgICAgIH07XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHJldHVybiBldmVudHM7XG4gIH07XG5cbiAgRmlzaGV5ZS5wcm90b3R5cGUuaW5pdCA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIHIgPSBzZWxmLmdldCgncicpO1xuICAgIHNlbGYuc2V0KCdjYWNoZWRNYWduaWZpZWRNb2RlbHMnLCBbXSk7XG4gICAgc2VsZi5zZXQoJ2NhY2hlZE9yaWdpblBvc2l0aW9ucycsIHt9KTtcbiAgICBzZWxmLnNldCgncjInLCByICogcik7XG4gICAgdmFyIGQgPSBzZWxmLmdldCgnZCcpO1xuICAgIHNlbGYuc2V0KCdtb2xlY3VsYXJQYXJhbScsIChkICsgMSkgKiByKTtcbiAgfTsgLy8gQ3JlYXRlIHRoZSBkZWxlZ2F0ZSB3aGVuIHRoZSB0cmlnZ2VyIGlzIGRyYWdcblxuXG4gIEZpc2hleWUucHJvdG90eXBlLmNyZWF0ZURlbGVnYXRlID0gZnVuY3Rpb24gKGUpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBsZW5zRGVsZWdhdGUgPSBzZWxmLmdldCgnZGVsZWdhdGUnKTtcblxuICAgIGlmICghbGVuc0RlbGVnYXRlIHx8IGxlbnNEZWxlZ2F0ZS5kZXN0cm95ZWQpIHtcbiAgICAgIHNlbGYubWFnbmlmeShlKTtcbiAgICAgIGxlbnNEZWxlZ2F0ZSA9IHNlbGYuZ2V0KCdkZWxlZ2F0ZScpOyAvLyBkcmFnIHRvIG1vdmUgdGhlIGxlbnNcblxuICAgICAgbGVuc0RlbGVnYXRlLm9uKCdkcmFnc3RhcnQnLCBmdW5jdGlvbiAoZXZ0KSB7XG4gICAgICAgIHNlbGYuc2V0KCdkZWxlZ2F0ZUNlbnRlckRpZmYnLCB7XG4gICAgICAgICAgeDogbGVuc0RlbGVnYXRlLmF0dHIoJ3gnKSAtIGV2dC54LFxuICAgICAgICAgIHk6IGxlbnNEZWxlZ2F0ZS5hdHRyKCd5JykgLSBldnQueVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgbGVuc0RlbGVnYXRlLm9uKCdkcmFnJywgZnVuY3Rpb24gKGV2dCkge1xuICAgICAgICBzZWxmLm1hZ25pZnkoZXZ0KTtcbiAgICAgIH0pOyAvLyDnu5HlrprosIPmlbTojIPlm7TvvIhy77yJ5ZKM57yp5pS+57O75pWwKGQp55qE55uR5ZCsXG4gICAgICAvLyDnlLHkuo4gZHJhZyDnlKjkuo7mlLnlj5ggbGVucyDkvY3nva4sIOWboOatpOWcqOatpOaooeW8j+S4iywgZHJhZyDkuI3og73nlKjkuo7osIPmlbQgciDlkowgZFxuICAgICAgLy8gc2NhbGluZyBkXG5cbiAgICAgIGlmICh0aGlzLmdldCgnc2NhbGVEQnknKSA9PT0gJ3doZWVsJykge1xuICAgICAgICBsZW5zRGVsZWdhdGUub24oJ21vdXNld2hlZWwnLCBmdW5jdGlvbiAoZXZ0KSB7XG4gICAgICAgICAgX3RoaXMuc2NhbGVEQnlXaGVlbChldnQpO1xuICAgICAgICB9KTtcbiAgICAgIH0gLy8gc2NhbGluZyByXG5cblxuICAgICAgaWYgKHRoaXMuZ2V0KCdzY2FsZVJCeScpID09PSAnd2hlZWwnKSB7XG4gICAgICAgIGxlbnNEZWxlZ2F0ZS5vbignbW91c2V3aGVlbCcsIGZ1bmN0aW9uIChldnQpIHtcbiAgICAgICAgICBzZWxmLnNjYWxlUkJ5V2hlZWwoZXZ0KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICAvKipcbiAgICogU2NhbGUgdGhlIHJhbmdlIGJ5IHdoZWVsXG4gICAqIEBwYXJhbSBlIG1vdXNlIHdoZWVsIGV2ZW50XG4gICAqL1xuXG5cbiAgRmlzaGV5ZS5wcm90b3R5cGUuc2NhbGVSQnlXaGVlbCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIGlmICghZSB8fCAhZS5vcmlnaW5hbEV2ZW50KSByZXR1cm47XG4gICAgaWYgKGUucHJldmVudERlZmF1bHQpIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB2YXIgZ3JhcGggPSBzZWxmLmdldCgnZ3JhcGgnKTtcbiAgICB2YXIgcmF0aW87XG4gICAgdmFyIGxlbnNEZWxlZ2F0ZSA9IHNlbGYuZ2V0KCdkZWxlZ2F0ZScpO1xuICAgIHZhciBsZW5zQ2VudGVyID0gbGVuc0RlbGVnYXRlID8ge1xuICAgICAgeDogbGVuc0RlbGVnYXRlLmF0dHIoJ3gnKSxcbiAgICAgIHk6IGxlbnNEZWxlZ2F0ZS5hdHRyKCd5JylcbiAgICB9IDogdW5kZWZpbmVkO1xuICAgIHZhciBtb3VzZVBvcyA9IGxlbnNDZW50ZXIgfHwgZ3JhcGguZ2V0UG9pbnRCeUNsaWVudChlLmNsaWVudFgsIGUuY2xpZW50WSk7XG5cbiAgICBpZiAoZS5vcmlnaW5hbEV2ZW50LndoZWVsRGVsdGEgPCAwKSB7XG4gICAgICByYXRpbyA9IDEgLSBERUxUQTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmF0aW8gPSAxIC8gKDEgLSBERUxUQSk7XG4gICAgfVxuXG4gICAgdmFyIG1heFIgPSBzZWxmLmdldCgnbWF4UicpO1xuICAgIHZhciBtaW5SID0gc2VsZi5nZXQoJ21pblInKTtcbiAgICB2YXIgciA9IHNlbGYuZ2V0KCdyJyk7XG5cbiAgICBpZiAociA+IChtYXhSIHx8IGdyYXBoLmdldCgnaGVpZ2h0JykpICYmIHJhdGlvID4gMSB8fCByIDwgKG1pblIgfHwgZ3JhcGguZ2V0KCdoZWlnaHQnKSAqIDAuMDUpICYmIHJhdGlvIDwgMSkge1xuICAgICAgcmF0aW8gPSAxO1xuICAgIH1cblxuICAgIHIgKj0gcmF0aW87XG4gICAgc2VsZi5zZXQoJ3InLCByKTtcbiAgICBzZWxmLnNldCgncjInLCByICogcik7XG4gICAgdmFyIGQgPSBzZWxmLmdldCgnZCcpO1xuICAgIHNlbGYuc2V0KCdtb2xlY3VsYXJQYXJhbScsIChkICsgMSkgKiByKTtcbiAgICBzZWxmLnNldCgnZGVsZWdhdGVDZW50ZXJEaWZmJywgdW5kZWZpbmVkKTtcbiAgICBzZWxmLm1hZ25pZnkoZSwgbW91c2VQb3MpO1xuICB9O1xuICAvKipcbiAgICogU2NhbGUgdGhlIHJhbmdlIGJ5IGRyYWdnaW5nXG4gICAqIEBwYXJhbSBlIG1vdXNlIGV2ZW50XG4gICAqL1xuXG5cbiAgRmlzaGV5ZS5wcm90b3R5cGUuc2NhbGVSQnlEcmFnID0gZnVuY3Rpb24gKGUpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgaWYgKCFlKSByZXR1cm47XG4gICAgdmFyIGRyYWdQcmVQb3MgPSBzZWxmLmdldCgnZHJhZ1ByZVBvcycpO1xuICAgIHZhciBncmFwaCA9IHNlbGYuZ2V0KCdncmFwaCcpO1xuICAgIHZhciByYXRpbztcbiAgICB2YXIgbW91c2VQb3MgPSBncmFwaC5nZXRQb2ludEJ5Q2xpZW50KGUuY2xpZW50WCwgZS5jbGllbnRZKTtcblxuICAgIGlmIChlLnggLSBkcmFnUHJlUG9zLnggPCAwKSB7XG4gICAgICByYXRpbyA9IDEgLSBERUxUQTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmF0aW8gPSAxIC8gKDEgLSBERUxUQSk7XG4gICAgfVxuXG4gICAgdmFyIG1heFIgPSBzZWxmLmdldCgnbWF4UicpO1xuICAgIHZhciBtaW5SID0gc2VsZi5nZXQoJ21pblInKTtcbiAgICB2YXIgciA9IHNlbGYuZ2V0KCdyJyk7XG5cbiAgICBpZiAociA+IChtYXhSIHx8IGdyYXBoLmdldCgnaGVpZ2h0JykpICYmIHJhdGlvID4gMSB8fCByIDwgKG1pblIgfHwgZ3JhcGguZ2V0KCdoZWlnaHQnKSAqIDAuMDUpICYmIHJhdGlvIDwgMSkge1xuICAgICAgcmF0aW8gPSAxO1xuICAgIH1cblxuICAgIHIgKj0gcmF0aW87XG4gICAgc2VsZi5zZXQoJ3InLCByKTtcbiAgICBzZWxmLnNldCgncjInLCByICogcik7XG4gICAgdmFyIGQgPSBzZWxmLmdldCgnZCcpO1xuICAgIHNlbGYuc2V0KCdtb2xlY3VsYXJQYXJhbScsIChkICsgMSkgKiByKTtcbiAgICBzZWxmLm1hZ25pZnkoZSwgbW91c2VQb3MpO1xuICAgIHNlbGYuc2V0KCdkcmFnUHJlUG9zJywge1xuICAgICAgeDogZS54LFxuICAgICAgeTogZS55XG4gICAgfSk7XG4gIH07XG4gIC8qKlxuICAgKiBTY2FsZSB0aGUgbWFnbmlmeWluZyBmYWN0b3IgYnkgd2hlZWxcbiAgICogQHBhcmFtIGUgbW91c2Ugd2hlZWwgZXZlbnRcbiAgICovXG5cblxuICBGaXNoZXllLnByb3RvdHlwZS5zY2FsZURCeVdoZWVsID0gZnVuY3Rpb24gKGV2dCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBpZiAoIWV2dCAmJiAhZXZ0Lm9yaWdpbmFsRXZlbnQpIHJldHVybjtcbiAgICBpZiAoZXZ0LnByZXZlbnREZWZhdWx0KSBldnQucHJldmVudERlZmF1bHQoKTtcbiAgICB2YXIgZGVsdGEgPSAwO1xuXG4gICAgaWYgKGV2dC5vcmlnaW5hbEV2ZW50LndoZWVsRGVsdGEgPCAwKSB7XG4gICAgICBkZWx0YSA9IC0wLjE7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbHRhID0gMC4xO1xuICAgIH1cblxuICAgIHZhciBkID0gc2VsZi5nZXQoJ2QnKTtcbiAgICB2YXIgbmV3RCA9IGQgKyBkZWx0YTtcbiAgICB2YXIgbWF4RCA9IHNlbGYuZ2V0KCdtYXhEJyk7XG4gICAgdmFyIG1pbkQgPSBzZWxmLmdldCgnbWluRCcpO1xuXG4gICAgaWYgKG5ld0QgPCBtYXhEICYmIG5ld0QgPiBtaW5EKSB7XG4gICAgICBzZWxmLnNldCgnZCcsIG5ld0QpO1xuICAgICAgdmFyIHIgPSBzZWxmLmdldCgncicpO1xuICAgICAgc2VsZi5zZXQoJ21vbGVjdWxhclBhcmFtJywgKG5ld0QgKyAxKSAqIHIpO1xuICAgICAgdmFyIGxlbnNEZWxlZ2F0ZSA9IHNlbGYuZ2V0KCdkZWxlZ2F0ZScpO1xuICAgICAgdmFyIGxlbnNDZW50ZXIgPSBsZW5zRGVsZWdhdGUgPyB7XG4gICAgICAgIHg6IGxlbnNEZWxlZ2F0ZS5hdHRyKCd4JyksXG4gICAgICAgIHk6IGxlbnNEZWxlZ2F0ZS5hdHRyKCd5JylcbiAgICAgIH0gOiB1bmRlZmluZWQ7XG4gICAgICBzZWxmLnNldCgnZGVsZWdhdGVDZW50ZXJEaWZmJywgdW5kZWZpbmVkKTtcbiAgICAgIHNlbGYubWFnbmlmeShldnQsIGxlbnNDZW50ZXIpO1xuICAgIH1cbiAgfTtcbiAgLyoqXG4gICAqIFNjYWxlIHRoZSBtYWduaWZ5aW5nIGZhY3RvciBieSBkcmFnZ2luZ1xuICAgKiBAcGFyYW0gZSBtb3VzZSBldmVudFxuICAgKi9cblxuXG4gIEZpc2hleWUucHJvdG90eXBlLnNjYWxlREJ5RHJhZyA9IGZ1bmN0aW9uIChlKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBkcmFnUHJlUG9zID0gc2VsZi5nZXQoJ2RyYWdQcmVQb3MnKTtcbiAgICB2YXIgZGVsdGEgPSBlLnggLSBkcmFnUHJlUG9zLnggPiAwID8gMC4xIDogLTAuMTtcbiAgICB2YXIgZCA9IHNlbGYuZ2V0KCdkJyk7XG4gICAgdmFyIG5ld0QgPSBkICsgZGVsdGE7XG4gICAgdmFyIG1heEQgPSBzZWxmLmdldCgnbWF4RCcpO1xuICAgIHZhciBtaW5EID0gc2VsZi5nZXQoJ21pbkQnKTtcblxuICAgIGlmIChuZXdEIDwgbWF4RCAmJiBuZXdEID4gbWluRCkge1xuICAgICAgc2VsZi5zZXQoJ2QnLCBuZXdEKTtcbiAgICAgIHZhciByID0gc2VsZi5nZXQoJ3InKTtcbiAgICAgIHNlbGYuc2V0KCdtb2xlY3VsYXJQYXJhbScsIChuZXdEICsgMSkgKiByKTtcbiAgICAgIHNlbGYubWFnbmlmeShlKTtcbiAgICB9XG5cbiAgICBzZWxmLnNldCgnZHJhZ1ByZVBvcycsIHtcbiAgICAgIHg6IGUueCxcbiAgICAgIHk6IGUueVxuICAgIH0pO1xuICB9O1xuICAvKipcbiAgICogUmVzcG9uc2UgZnVuY3Rpb24gZm9yIG1vdXNlbW92ZSwgY2xpY2ssIG9yIGRyYWcgdG8gbWFnbmlmeVxuICAgKiBAcGFyYW0gZSBtb3VzZSBldmVudFxuICAgKi9cblxuXG4gIEZpc2hleWUucHJvdG90eXBlLm1hZ25pZnkgPSBmdW5jdGlvbiAoZSwgbW91c2VQb3MpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgc2VsZi5yZXN0b3JlQ2FjaGUoKTtcbiAgICB2YXIgZ3JhcGggPSBzZWxmLmdldCgnZ3JhcGgnKTtcbiAgICB2YXIgY2FjaGVkTWFnbmlmaWVkTW9kZWxzID0gc2VsZi5nZXQoJ2NhY2hlZE1hZ25pZmllZE1vZGVscycpO1xuICAgIHZhciBjYWNoZWRPcmlnaW5Qb3NpdGlvbnMgPSBzZWxmLmdldCgnY2FjaGVkT3JpZ2luUG9zaXRpb25zJyk7XG4gICAgdmFyIHNob3dMYWJlbCA9IHNlbGYuZ2V0KCdzaG93TGFiZWwnKTtcbiAgICB2YXIgciA9IHNlbGYuZ2V0KCdyJyk7XG4gICAgdmFyIHIyID0gc2VsZi5nZXQoJ3IyJyk7XG4gICAgdmFyIGQgPSBzZWxmLmdldCgnZCcpO1xuICAgIHZhciBtb2xlY3VsYXJQYXJhbSA9IHNlbGYuZ2V0KCdtb2xlY3VsYXJQYXJhbScpO1xuICAgIHZhciBub2RlcyA9IGdyYXBoLmdldE5vZGVzKCk7XG4gICAgdmFyIG5vZGVMZW5ndGggPSBub2Rlcy5sZW5ndGg7XG4gICAgdmFyIG1DZW50ZXIgPSBtb3VzZVBvcyA/IHtcbiAgICAgIHg6IG1vdXNlUG9zLngsXG4gICAgICB5OiBtb3VzZVBvcy55XG4gICAgfSA6IHtcbiAgICAgIHg6IGUueCxcbiAgICAgIHk6IGUueVxuICAgIH07XG5cbiAgICBpZiAoc2VsZi5nZXQoJ2RyYWdnaW5nJykgJiYgKHNlbGYuZ2V0KCd0cmlnZ2VyJykgPT09ICdtb3VzZW1vdmUnIHx8IHNlbGYuZ2V0KCd0cmlnZ2VyJykgPT09ICdjbGljaycpKSB7XG4gICAgICBtQ2VudGVyID0gc2VsZi5nZXQoJ2NhY2hlQ2VudGVyJyk7XG4gICAgfVxuXG4gICAgdmFyIGRlbGVnYXRlQ2VudGVyRGlmZiA9IHNlbGYuZ2V0KCdkZWxlZ2F0ZUNlbnRlckRpZmYnKTtcblxuICAgIGlmIChkZWxlZ2F0ZUNlbnRlckRpZmYpIHtcbiAgICAgIG1DZW50ZXIueCArPSBkZWxlZ2F0ZUNlbnRlckRpZmYueDtcbiAgICAgIG1DZW50ZXIueSArPSBkZWxlZ2F0ZUNlbnRlckRpZmYueTtcbiAgICB9XG5cbiAgICBzZWxmLnVwZGF0ZURlbGVnYXRlKG1DZW50ZXIsIHIpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlTGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBtb2RlbCA9IG5vZGVzW2ldLmdldE1vZGVsKCk7XG4gICAgICB2YXIgeCA9IG1vZGVsLngsXG4gICAgICAgICAgeSA9IG1vZGVsLnk7XG4gICAgICBpZiAoaXNOYU4oeCkgfHwgaXNOYU4oeSkpIGNvbnRpbnVlOyAvLyB0aGUgc3F1YXJlIG9mIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBub2RlIGFuZCB0aGUgbWFnbmlmaWVkIGNlbnRlclxuXG4gICAgICB2YXIgZGlzdDIgPSAoeCAtIG1DZW50ZXIueCkgKiAoeCAtIG1DZW50ZXIueCkgKyAoeSAtIG1DZW50ZXIueSkgKiAoeSAtIG1DZW50ZXIueSk7XG5cbiAgICAgIGlmICghaXNOYU4oZGlzdDIpICYmIGRpc3QyIDwgcjIgJiYgZGlzdDIgIT09IDApIHtcbiAgICAgICAgdmFyIGRpc3QgPSBNYXRoLnNxcnQoZGlzdDIpOyAvLyAociAqIChkICsgMSkgKiAoZGlzdCAvIHIpKSAvIChkICogKGRpc3QgLyByKSArIDEpO1xuXG4gICAgICAgIHZhciBtYWduaWZpZWREaXN0ID0gbW9sZWN1bGFyUGFyYW0gKiBkaXN0IC8gKGQgKiBkaXN0ICsgcik7XG4gICAgICAgIHZhciBjb3MgPSAoeCAtIG1DZW50ZXIueCkgLyBkaXN0O1xuICAgICAgICB2YXIgc2luID0gKHkgLSBtQ2VudGVyLnkpIC8gZGlzdDtcbiAgICAgICAgbW9kZWwueCA9IGNvcyAqIG1hZ25pZmllZERpc3QgKyBtQ2VudGVyLng7XG4gICAgICAgIG1vZGVsLnkgPSBzaW4gKiBtYWduaWZpZWREaXN0ICsgbUNlbnRlci55O1xuXG4gICAgICAgIGlmICghY2FjaGVkT3JpZ2luUG9zaXRpb25zW21vZGVsLmlkXSkge1xuICAgICAgICAgIGNhY2hlZE9yaWdpblBvc2l0aW9uc1ttb2RlbC5pZF0gPSB7XG4gICAgICAgICAgICB4OiB4LFxuICAgICAgICAgICAgeTogeSxcbiAgICAgICAgICAgIHRleHRzOiBbXVxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBjYWNoZWRNYWduaWZpZWRNb2RlbHMucHVzaChtb2RlbCk7XG5cbiAgICAgICAgaWYgKHNob3dMYWJlbCAmJiAyICogZGlzdCA8IHIpIHtcbiAgICAgICAgICB2YXIgbm9kZSA9IG5vZGVzW2ldO1xuICAgICAgICAgIHZhciBub2RlR3JvdXAgPSBub2RlLmdldENvbnRhaW5lcigpO1xuICAgICAgICAgIHZhciBzaGFwZXMgPSBub2RlR3JvdXAuZ2V0Q2hpbGRyZW4oKTtcbiAgICAgICAgICB2YXIgc2hhcGVMZW5ndGggPSBzaGFwZXMubGVuZ3RoO1xuXG4gICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBzaGFwZUxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICB2YXIgc2hhcGUgPSBzaGFwZXNbal07XG5cbiAgICAgICAgICAgIGlmIChzaGFwZS5nZXQoJ3R5cGUnKSA9PT0gJ3RleHQnKSB7XG4gICAgICAgICAgICAgIGNhY2hlZE9yaWdpblBvc2l0aW9uc1ttb2RlbC5pZF0udGV4dHMucHVzaCh7XG4gICAgICAgICAgICAgICAgdmlzaWJsZTogc2hhcGUuZ2V0KCd2aXNpYmxlJyksXG4gICAgICAgICAgICAgICAgc2hhcGU6IHNoYXBlXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBzaGFwZS5zZXQoJ3Zpc2libGUnLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBncmFwaC5yZWZyZXNoUG9zaXRpb25zKCk7XG4gIH07XG4gIC8qKlxuICAgKiBSZXN0b3JlIHRoZSBjYWNoZSBub2RlcyB3aGlsZSBtYWduaWZ5aW5nXG4gICAqL1xuXG5cbiAgRmlzaGV5ZS5wcm90b3R5cGUucmVzdG9yZUNhY2hlID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgY2FjaGVkTWFnbmlmaWVkTW9kZWxzID0gc2VsZi5nZXQoJ2NhY2hlZE1hZ25pZmllZE1vZGVscycpO1xuICAgIHZhciBjYWNoZWRPcmlnaW5Qb3NpdGlvbnMgPSBzZWxmLmdldCgnY2FjaGVkT3JpZ2luUG9zaXRpb25zJyk7XG4gICAgdmFyIGNhY2hlTGVuZ3RoID0gY2FjaGVkTWFnbmlmaWVkTW9kZWxzLmxlbmd0aDtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2FjaGVMZW5ndGg7IGkrKykge1xuICAgICAgdmFyIG5vZGUgPSBjYWNoZWRNYWduaWZpZWRNb2RlbHNbaV07XG4gICAgICB2YXIgaWQgPSBub2RlLmlkO1xuICAgICAgdmFyIG9yaSA9IGNhY2hlZE9yaWdpblBvc2l0aW9uc1tpZF07XG4gICAgICBub2RlLnggPSBvcmkueDtcbiAgICAgIG5vZGUueSA9IG9yaS55O1xuICAgICAgdmFyIHRleHRMZW5ndGggPSBvcmkudGV4dHMubGVuZ3RoO1xuXG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHRleHRMZW5ndGg7IGorKykge1xuICAgICAgICB2YXIgdGV4dCA9IG9yaS50ZXh0c1tqXTtcbiAgICAgICAgdGV4dC5zaGFwZS5zZXQoJ3Zpc2libGUnLCB0ZXh0LnZpc2libGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHNlbGYuc2V0KCdjYWNoZWRNYWduaWZpZWRNb2RlbHMnLCBbXSk7XG4gICAgc2VsZi5zZXQoJ2NhY2hlZE9yaWdpblBvc2l0aW9ucycsIHt9KTtcbiAgfTtcbiAgLyoqXG4gICAqIEFkanVzdCBwYXJ0IG9mIHRoZSBwYXJhbWV0ZXJzLCBpbmNsdWRpbmcgdHJpZ2dlciwgZCwgciwgbWF4UiwgbWluUiwgbWF4RCwgbWluRCwgc2NhbGVSQnksIGFuZCBzY2FsZURCeVxuICAgKiBAcGFyYW0ge0Zpc2hleWVDb25maWd9IGNmZ1xuICAgKi9cblxuXG4gIEZpc2hleWUucHJvdG90eXBlLnVwZGF0ZVBhcmFtcyA9IGZ1bmN0aW9uIChjZmcpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIHIgPSBjZmcucixcbiAgICAgICAgZCA9IGNmZy5kLFxuICAgICAgICB0cmlnZ2VyID0gY2ZnLnRyaWdnZXIsXG4gICAgICAgIG1pbkQgPSBjZmcubWluRCxcbiAgICAgICAgbWF4RCA9IGNmZy5tYXhELFxuICAgICAgICBtaW5SID0gY2ZnLm1pblIsXG4gICAgICAgIG1heFIgPSBjZmcubWF4UixcbiAgICAgICAgc2NhbGVEQnkgPSBjZmcuc2NhbGVEQnksXG4gICAgICAgIHNjYWxlUkJ5ID0gY2ZnLnNjYWxlUkJ5O1xuXG4gICAgaWYgKCFpc05hTihjZmcucikpIHtcbiAgICAgIHNlbGYuc2V0KCdyJywgcik7XG4gICAgICBzZWxmLnNldCgncjInLCByICogcik7XG4gICAgfVxuXG4gICAgaWYgKCFpc05hTihkKSkge1xuICAgICAgc2VsZi5zZXQoJ2QnLCBkKTtcbiAgICB9XG5cbiAgICBpZiAoIWlzTmFOKG1heEQpKSB7XG4gICAgICBzZWxmLnNldCgnbWF4RCcsIG1heEQpO1xuICAgIH1cblxuICAgIGlmICghaXNOYU4obWluRCkpIHtcbiAgICAgIHNlbGYuc2V0KCdtaW5EJywgbWluRCk7XG4gICAgfVxuXG4gICAgaWYgKCFpc05hTihtYXhSKSkge1xuICAgICAgc2VsZi5zZXQoJ21heFInLCBtYXhSKTtcbiAgICB9XG5cbiAgICBpZiAoIWlzTmFOKG1pblIpKSB7XG4gICAgICBzZWxmLnNldCgnbWluUicsIG1pblIpO1xuICAgIH1cblxuICAgIHZhciBuZCA9IHNlbGYuZ2V0KCdkJyk7XG4gICAgdmFyIG5yID0gc2VsZi5nZXQoJ3InKTtcbiAgICBzZWxmLnNldCgnbW9sZWN1bGFyUGFyYW0nLCAobmQgKyAxKSAqIG5yKTtcblxuICAgIGlmICh0cmlnZ2VyID09PSAnbW91c2Vtb3ZlJyB8fCB0cmlnZ2VyID09PSAnY2xpY2snIHx8IHRyaWdnZXIgPT09ICdkcmFnJykge1xuICAgICAgc2VsZi5zZXQoJ3RyaWdnZXInLCB0cmlnZ2VyKTtcbiAgICB9XG5cbiAgICBpZiAoc2NhbGVEQnkgPT09ICdkcmFnJyB8fCBzY2FsZURCeSA9PT0gJ3doZWVsJyB8fCBzY2FsZURCeSA9PT0gJ3Vuc2V0Jykge1xuICAgICAgc2VsZi5zZXQoJ3NjYWxlREJ5Jywgc2NhbGVEQnkpO1xuICAgICAgc2VsZi5nZXQoJ2RlbGVnYXRlJykucmVtb3ZlKCk7XG4gICAgICBzZWxmLmdldCgnZGVsZWdhdGUnKS5kZXN0cm95KCk7XG4gICAgICB2YXIgZFBlcmNlbnRUZXh0ID0gc2VsZi5nZXQoJ2RQZXJjZW50VGV4dCcpO1xuXG4gICAgICBpZiAoZFBlcmNlbnRUZXh0KSB7XG4gICAgICAgIGRQZXJjZW50VGV4dC5yZW1vdmUoKTtcbiAgICAgICAgZFBlcmNlbnRUZXh0LmRlc3Ryb3koKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc2NhbGVSQnkgPT09ICdkcmFnJyB8fCBzY2FsZVJCeSA9PT0gJ3doZWVsJyB8fCBzY2FsZVJCeSA9PT0gJ3Vuc2V0Jykge1xuICAgICAgc2VsZi5zZXQoJ3NjYWxlUkJ5Jywgc2NhbGVSQnkpO1xuICAgICAgc2VsZi5nZXQoJ2RlbGVnYXRlJykucmVtb3ZlKCk7XG4gICAgICBzZWxmLmdldCgnZGVsZWdhdGUnKS5kZXN0cm95KCk7XG4gICAgICB2YXIgZFBlcmNlbnRUZXh0ID0gc2VsZi5nZXQoJ2RQZXJjZW50VGV4dCcpO1xuXG4gICAgICBpZiAoZFBlcmNlbnRUZXh0KSB7XG4gICAgICAgIGRQZXJjZW50VGV4dC5yZW1vdmUoKTtcbiAgICAgICAgZFBlcmNlbnRUZXh0LmRlc3Ryb3koKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIC8qKlxuICAgKiBVcGRhdGUgdGhlIGRlbGVnYXRlIHNoYXBlIG9mIHRoZSBsZW5zXG4gICAqIEBwYXJhbSB7UG9pbnR9IG1DZW50ZXIgdGhlIGNlbnRlciBvZiB0aGUgc2hhcGVcbiAgICogQHBhcmFtIHtudW1iZXJ9IHIgdGhlIHJhZGl1cyBvZiB0aGUgc2hhcGVcbiAgICovXG5cblxuICBGaXNoZXllLnByb3RvdHlwZS51cGRhdGVEZWxlZ2F0ZSA9IGZ1bmN0aW9uIChtQ2VudGVyLCByKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgZ3JhcGggPSBzZWxmLmdldCgnZ3JhcGgnKTtcbiAgICB2YXIgbGVuc0RlbGVnYXRlID0gc2VsZi5nZXQoJ2RlbGVnYXRlJyk7XG5cbiAgICBpZiAoIWxlbnNEZWxlZ2F0ZSB8fCBsZW5zRGVsZWdhdGUuZGVzdHJveWVkKSB7XG4gICAgICAvLyDmi5bliqjlpJrkuKpcbiAgICAgIHZhciBwYXJlbnRfMSA9IGdyYXBoLmdldCgnZ3JvdXAnKTtcbiAgICAgIHZhciBhdHRycyA9IHNlbGYuZ2V0KCdkZWxlZ2F0ZVN0eWxlJykgfHwgbGVuc0RlbGVnYXRlU3R5bGU7IC8vIG1vZGVs5LiK55qEeCwgeeaYr+ebuOWvueS6juWbvuW9ouS4reW/g+eahCwgZGVsZWdhdGVTaGFwZeaYr2flrp7kvossIHgseeaYr+e7neWvueWdkOagh1xuXG4gICAgICBsZW5zRGVsZWdhdGUgPSBwYXJlbnRfMS5hZGRTaGFwZSgnY2lyY2xlJywge1xuICAgICAgICBhdHRyczogX19hc3NpZ24oe1xuICAgICAgICAgIHI6IHIgLyAxLjUsXG4gICAgICAgICAgeDogbUNlbnRlci54LFxuICAgICAgICAgIHk6IG1DZW50ZXIueVxuICAgICAgICB9LCBhdHRycyksXG4gICAgICAgIG5hbWU6ICdsZW5zLXNoYXBlJyxcbiAgICAgICAgZHJhZ2dhYmxlOiB0cnVlXG4gICAgICB9KTtcblxuICAgICAgaWYgKHRoaXMuZ2V0KCd0cmlnZ2VyJykgIT09ICdkcmFnJykge1xuICAgICAgICAvLyDosIPmlbTojIPlm7QgciDnmoTnm5HlkKxcbiAgICAgICAgaWYgKHRoaXMuZ2V0KCdzY2FsZVJCeScpID09PSAnd2hlZWwnKSB7XG4gICAgICAgICAgLy8g5L2/55So5rua6L2u6LCD5pW0IHJcbiAgICAgICAgICBsZW5zRGVsZWdhdGUub24oJ21vdXNld2hlZWwnLCBmdW5jdGlvbiAoZXZ0KSB7XG4gICAgICAgICAgICBzZWxmLnNjYWxlUkJ5V2hlZWwoZXZ0KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmdldCgnc2NhbGVSQnknKSA9PT0gJ2RyYWcnKSB7XG4gICAgICAgICAgLy8g5L2/55So5ouW5ou96LCD5pW0IHJcbiAgICAgICAgICBsZW5zRGVsZWdhdGUub24oJ2RyYWdzdGFydCcsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICBzZWxmLnNldCgnZHJhZ2dpbmcnLCB0cnVlKTtcbiAgICAgICAgICAgIHNlbGYuc2V0KCdjYWNoZUNlbnRlcicsIHtcbiAgICAgICAgICAgICAgeDogZS54LFxuICAgICAgICAgICAgICB5OiBlLnlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc2VsZi5zZXQoJ2RyYWdQcmVQb3MnLCB7XG4gICAgICAgICAgICAgIHg6IGUueCxcbiAgICAgICAgICAgICAgeTogZS55XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBsZW5zRGVsZWdhdGUub24oJ2RyYWcnLCBmdW5jdGlvbiAoZXZ0KSB7XG4gICAgICAgICAgICBzZWxmLnNjYWxlUkJ5RHJhZyhldnQpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGxlbnNEZWxlZ2F0ZS5vbignZHJhZ2VuZCcsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICBzZWxmLnNldCgnZHJhZ2dpbmcnLCBmYWxzZSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gLy8g6LCD5pW057yp5pS+57O75pWwIGQg55qE55uR5ZCsXG5cblxuICAgICAgICBpZiAodGhpcy5nZXQoJ3NjYWxlREJ5JykgPT09ICd3aGVlbCcpIHtcbiAgICAgICAgICAvLyDkvb/nlKjmu5rova7osIPmlbQgZFxuICAgICAgICAgIGxlbnNEZWxlZ2F0ZS5vbignbW91c2V3aGVlbCcsIGZ1bmN0aW9uIChldnQpIHtcbiAgICAgICAgICAgIF90aGlzLnNjYWxlREJ5V2hlZWwoZXZ0KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmdldCgnc2NhbGVEQnknKSA9PT0gJ2RyYWcnKSB7XG4gICAgICAgICAgLy8g5L2/55So5ouW5ou96LCD5pW0IGRcbiAgICAgICAgICBsZW5zRGVsZWdhdGUub24oJ2RyYWdzdGFydCcsIGZ1bmN0aW9uIChldnQpIHtcbiAgICAgICAgICAgIHNlbGYuc2V0KCdkcmFnZ2luZycsIHRydWUpO1xuICAgICAgICAgICAgc2VsZi5zZXQoJ2NhY2hlQ2VudGVyJywge1xuICAgICAgICAgICAgICB4OiBldnQueCxcbiAgICAgICAgICAgICAgeTogZXZ0LnlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc2VsZi5zZXQoJ2RyYWdQcmVQb3MnLCB7XG4gICAgICAgICAgICAgIHg6IGV2dC54LFxuICAgICAgICAgICAgICB5OiBldnQueVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgbGVuc0RlbGVnYXRlLm9uKCdkcmFnJywgZnVuY3Rpb24gKGV2dCkge1xuICAgICAgICAgICAgX3RoaXMuc2NhbGVEQnlEcmFnKGV2dCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgbGVuc0RlbGVnYXRlLm9uKCdkcmFnZW5kJywgZnVuY3Rpb24gKGV2dCkge1xuICAgICAgICAgICAgc2VsZi5zZXQoJ2RyYWdnaW5nJywgZmFsc2UpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGxlbnNEZWxlZ2F0ZS5hdHRyKHtcbiAgICAgICAgeDogbUNlbnRlci54LFxuICAgICAgICB5OiBtQ2VudGVyLnksXG4gICAgICAgIHI6IHIgLyAxLjVcbiAgICAgIH0pO1xuICAgIH0gLy8g57uY5Yi257yp5pS+57O75pWw55m+5YiG5q+U5paH5pysXG5cblxuICAgIGlmIChzZWxmLmdldCgnc2hvd0RQZXJjZW50JykpIHtcbiAgICAgIHZhciBwZXJjZW50ID0gTWF0aC5yb3VuZCgoc2VsZi5nZXQoJ2QnKSAtIHNlbGYuZ2V0KCdtaW5EJykpIC8gKHNlbGYuZ2V0KCdtYXhEJykgLSBzZWxmLmdldCgnbWluRCcpKSAqIDEwMCk7XG4gICAgICB2YXIgZFBlcmNlbnRUZXh0ID0gc2VsZi5nZXQoJ2RQZXJjZW50VGV4dCcpO1xuICAgICAgdmFyIHRleHRZID0gbUNlbnRlci55ICsgciAvIDEuNSArIDE2O1xuXG4gICAgICBpZiAoIWRQZXJjZW50VGV4dCB8fCBkUGVyY2VudFRleHQuZGVzdHJveWVkKSB7XG4gICAgICAgIHZhciBwYXJlbnRfMiA9IGdyYXBoLmdldCgnZ3JvdXAnKTtcbiAgICAgICAgZFBlcmNlbnRUZXh0ID0gcGFyZW50XzIuYWRkU2hhcGUoJ3RleHQnLCB7XG4gICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgIHRleHQ6IHBlcmNlbnQgKyBcIiVcIixcbiAgICAgICAgICAgIHg6IG1DZW50ZXIueCxcbiAgICAgICAgICAgIHk6IHRleHRZLFxuICAgICAgICAgICAgZmlsbDogJyNhYWEnLFxuICAgICAgICAgICAgc3Ryb2tlOiAnI2ZmZicsXG4gICAgICAgICAgICBsaW5lV2lkdGg6IDEsXG4gICAgICAgICAgICBmb250U2l6ZTogMTJcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBzZWxmLnNldCgnZFBlcmNlbnRUZXh0JywgZFBlcmNlbnRUZXh0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRQZXJjZW50VGV4dC5hdHRyKHtcbiAgICAgICAgICB0ZXh0OiBwZXJjZW50ICsgXCIlXCIsXG4gICAgICAgICAgeDogbUNlbnRlci54LFxuICAgICAgICAgIHk6IHRleHRZXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHNlbGYuc2V0KCdkZWxlZ2F0ZScsIGxlbnNEZWxlZ2F0ZSk7XG4gIH07XG4gIC8qKlxuICAgKiBDbGVhciB0aGUgZmlzaGV5ZSBsZW5zXG4gICAqL1xuXG5cbiAgRmlzaGV5ZS5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGdyYXBoID0gdGhpcy5nZXQoJ2dyYXBoJyk7XG4gICAgdGhpcy5yZXN0b3JlQ2FjaGUoKTtcbiAgICBncmFwaC5yZWZyZXNoUG9zaXRpb25zKCk7XG4gICAgdmFyIGxlbnNEZWxlZ2F0ZSA9IHRoaXMuZ2V0KCdkZWxlZ2F0ZScpO1xuXG4gICAgaWYgKGxlbnNEZWxlZ2F0ZSAmJiAhbGVuc0RlbGVnYXRlLmRlc3Ryb3llZCkge1xuICAgICAgbGVuc0RlbGVnYXRlLnJlbW92ZSgpO1xuICAgICAgbGVuc0RlbGVnYXRlLmRlc3Ryb3koKTtcbiAgICB9XG5cbiAgICB2YXIgZFBlcmNlbnRUZXh0ID0gdGhpcy5nZXQoJ2RQZXJjZW50VGV4dCcpO1xuXG4gICAgaWYgKGRQZXJjZW50VGV4dCAmJiAhZFBlcmNlbnRUZXh0LmRlc3Ryb3llZCkge1xuICAgICAgZFBlcmNlbnRUZXh0LnJlbW92ZSgpO1xuICAgICAgZFBlcmNlbnRUZXh0LmRlc3Ryb3koKTtcbiAgICB9XG4gIH07XG4gIC8qKlxuICAgKiBEZXN0cm95IHRoZSBjb21wb25lbnRcbiAgICovXG5cblxuICBGaXNoZXllLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuY2xlYXIoKTtcbiAgfTtcblxuICByZXR1cm4gRmlzaGV5ZTtcbn0oQmFzZSk7XG5cbmV4cG9ydCBkZWZhdWx0IEZpc2hleWU7IiwidmFyIF9fZXh0ZW5kcyA9IHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMgfHwgZnVuY3Rpb24gKCkge1xuICB2YXIgX2V4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbiBleHRlbmRTdGF0aWNzKGQsIGIpIHtcbiAgICBfZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCB7XG4gICAgICBfX3Byb3RvX186IFtdXG4gICAgfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICBkLl9fcHJvdG9fXyA9IGI7XG4gICAgfSB8fCBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgZm9yICh2YXIgcCBpbiBiKSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdO1xuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gX2V4dGVuZFN0YXRpY3MoZCwgYik7XG4gIH07XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgaWYgKHR5cGVvZiBiICE9PSBcImZ1bmN0aW9uXCIgJiYgYiAhPT0gbnVsbCkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNsYXNzIGV4dGVuZHMgdmFsdWUgXCIgKyBTdHJpbmcoYikgKyBcIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsXCIpO1xuXG4gICAgX2V4dGVuZFN0YXRpY3MoZCwgYik7XG5cbiAgICBmdW5jdGlvbiBfXygpIHtcbiAgICAgIHRoaXMuY29uc3RydWN0b3IgPSBkO1xuICAgIH1cblxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgfTtcbn0oKTtcblxuaW1wb3J0IHsgbW9kaWZ5Q1NTLCBjcmVhdGVEb20gfSBmcm9tICdAYW50di9kb20tdXRpbCc7XG5pbXBvcnQgeyBjbG9uZSwgaXNTdHJpbmcgfSBmcm9tICdAYW50di91dGlsJztcbmltcG9ydCBCYXNlIGZyb20gJy4uL2Jhc2UnO1xuaW1wb3J0IGluc2VydENzcyBmcm9tICdpbnNlcnQtY3NzJztcbnZhciBERUxUQSA9IDAuMDU7XG50eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIGluc2VydENzcyhcIlxcbiAgLmc2LWNvbXBvbmVudC10b29sYmFyIHtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7XFxuICAgIHBhZGRpbmc6IDZweDtcXG4gICAgbGVmdDogMHB4O1xcbiAgICB0b3A6IDBweDtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpO1xcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjZTJlMmUyO1xcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XFxuICAgIGZvbnQtc2l6ZTogMTJweDtcXG4gICAgY29sb3I6ICM1NDU0NTQ7XFxuICAgIG1hcmdpbjogMDtcXG4gIH1cXG4gIC5nNi1jb21wb25lbnQtdG9vbGJhciBsaSB7XFxuICAgIGZsb2F0OiBsZWZ0O1xcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxuICAgIHdpZHRoOiAzNXB4O1xcbiAgICBoZWlnaHQ6IDI0cHg7XFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXG5cXHRcXHRsaXN0LXN0eWxlLXR5cGU6bm9uZTtcXG4gICAgbGlzdC1zdHlsZTogbm9uZTtcXG4gICAgbWFyZ2luLWxlZnQ6IDBweDtcXG4gIH1cXG4gIC5nNi1jb21wb25lbnQtdG9vbGJhciBsaSAuaWNvbiB7XFxuICAgIG9wYWNpdHk6IDAuNztcXG4gIH1cXG4gIC5nNi1jb21wb25lbnQtdG9vbGJhciBsaSAuaWNvbjpob3ZlciB7XFxuICAgIG9wYWNpdHk6IDE7XFxuICB9XFxuXCIpO1xuXG52YXIgZ2V0RXZlbnRQYXRoID0gZnVuY3Rpb24gZ2V0RXZlbnRQYXRoKGV2dCkge1xuICBpZiAoIWV2dCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGlmIChldnQuY29tcG9zZWRQYXRoKSB7XG4gICAgcmV0dXJuIGV2dC5jb21wb3NlZFBhdGgoKTtcbiAgfVxuXG4gIHZhciBwYXRoID0gW107XG4gIHZhciBlbCA9IGV2dC50YXJnZXQ7XG5cbiAgd2hpbGUgKGVsKSB7XG4gICAgcGF0aC5wdXNoKGVsKTtcblxuICAgIGlmIChlbC50YWdOYW1lID09PSAnSFRNTCcpIHtcbiAgICAgIHBhdGgucHVzaChkb2N1bWVudCwgd2luZG93KTtcbiAgICAgIHJldHVybiBwYXRoO1xuICAgIH1cblxuICAgIGVsID0gZWwucGFyZW50RWxlbWVudDtcbiAgfVxuXG4gIHJldHVybiBwYXRoO1xufTtcblxudmFyIFRvb2xCYXIgPVxuLyoqIEBjbGFzcyAqL1xuZnVuY3Rpb24gKF9zdXBlcikge1xuICBfX2V4dGVuZHMoVG9vbEJhciwgX3N1cGVyKTtcblxuICBmdW5jdGlvbiBUb29sQmFyKGNvbmZpZykge1xuICAgIHJldHVybiBfc3VwZXIuY2FsbCh0aGlzLCBjb25maWcpIHx8IHRoaXM7XG4gIH1cblxuICBUb29sQmFyLnByb3RvdHlwZS5nZXREZWZhdWx0Q2ZncyA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaGFuZGxlQ2xpY2s6IHVuZGVmaW5lZCxcbiAgICAgIC8vIOaMh+WumuiPnOWNleWGheWuue+8jGZ1bmN0aW9uKGUpIHsuLi59XG4gICAgICBnZXRDb250ZW50OiBmdW5jdGlvbiBnZXRDb250ZW50KGdyYXBoKSB7XG4gICAgICAgIHJldHVybiBcIlxcbiAgICAgICAgICA8dWwgY2xhc3M9J2c2LWNvbXBvbmVudC10b29sYmFyJz5cXG4gICAgICAgICAgICA8bGkgY29kZT0ncmVkbyc+XFxuICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVxcXCJpY29uXFxcIiB2aWV3Qm94PVxcXCIwIDAgMTAyNCAxMDI0XFxcIiB2ZXJzaW9uPVxcXCIxLjFcXFwiIHhtbG5zPVxcXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1xcXCIgd2lkdGg9XFxcIjI0XFxcIiBoZWlnaHQ9XFxcIjI0XFxcIj5cXG4gICAgICAgICAgICAgICAgPHBhdGggZD1cXFwiTTI1NiA2ODIuNjY2NjY3YzAtMTAyLjc0MTMzMyA2Ni43MzA2NjctMjEzLjMzMzMzMyAyMTMuMzMzMzMzLTIxMy4zMzMzMzQgMTA3LjAwOCAwIDE5MC43NjI2NjcgNTYuNTc2IDIzMC41NzA2NjcgMTI1LjM1NDY2N0w2MTEuOTY4IDY4Mi42NjY2NjdIODUzLjMzMzMzM3YtMjQxLjM2NTMzNGwtOTEuNTYyNjY2IDkxLjU2MjY2N0M3MDQuNzY4IDQ0OC40NjkzMzMgNjAxLjEzMDY2NyAzODQgNDY5LjMzMzMzMyAzODRjLTE5Ni4wOTYgMC0yOTguNjY2NjY3IDE1MC4yMjkzMzMtMjk4LjY2NjY2NiAyOTguNjY2NjY3aDg1LjMzMzMzM3pcXFwiIGZpbGw9XFxcIlxcXCIgcC1pZD1cXFwiMjA0MVxcXCI+PC9wYXRoPlxcbiAgICAgICAgICAgICAgPC9zdmc+XFxuICAgICAgICAgICAgPC9saT5cXG4gICAgICAgICAgICA8bGkgY29kZT0ndW5kbyc+XFxuICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVxcXCJpY29uXFxcIiB2aWV3Qm94PVxcXCIwIDAgMTAyNCAxMDI0XFxcIiB2ZXJzaW9uPVxcXCIxLjFcXFwiIHhtbG5zPVxcXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1xcXCIgd2lkdGg9XFxcIjI0XFxcIiBoZWlnaHQ9XFxcIjI0XFxcIj5cXG4gICAgICAgICAgICAgICAgPHBhdGggZD1cXFwiTTE3MC42NjY2NjcgNjgyLjY2NjY2N2gyNDEuMzY1MzMzbC04Ny45MzYtODcuOTc4NjY3QzM2My45MDQgNTI1LjkwOTMzMyA0NDcuNjU4NjY3IDQ2OS4zMzMzMzMgNTU0LjY2NjY2NyA0NjkuMzMzMzMzYzE0Ni42MDI2NjcgMCAyMTMuMzMzMzMzIDExMC41OTIgMjEzLjMzMzMzMyAyMTMuMzMzMzM0aDg1LjMzMzMzM2MwLTE0OC40MzczMzMtMTAyLjU3MDY2Ny0yOTguNjY2NjY3LTI5OC42NjY2NjYtMjk4LjY2NjY2Ny0xMzEuNzk3MzMzIDAtMjM1LjM5MiA2NC40NjkzMzMtMjkyLjQ4IDE0OC44MjEzMzNMMTcwLjY2NjY2NyA0NDEuMzAxMzMzVjY4Mi42NjY2Njd6XFxcIiBmaWxsPVxcXCJcXFwiIHAtaWQ9XFxcIjI3NjRcXFwiPjwvcGF0aD5cXG4gICAgICAgICAgICAgIDwvc3ZnPlxcbiAgICAgICAgICAgIDwvbGk+XFxuICAgICAgICAgICAgPGxpICBjb2RlPSd6b29tT3V0Jz5cXG4gICAgICAgICAgICAgIDxzdmcgY2xhc3M9XFxcImljb25cXFwiIHZpZXdCb3g9XFxcIjAgMCAxMDI0IDEwMjRcXFwiIHZlcnNpb249XFxcIjEuMVxcXCIgeG1sbnM9XFxcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXFxcIiB3aWR0aD1cXFwiMjRcXFwiIGhlaWdodD1cXFwiMjRcXFwiPlxcbiAgICAgICAgICAgICAgICA8cGF0aCBkPVxcXCJNNjU4LjQzMiA0MjguNzM2YTMzLjIxNiAzMy4yMTYgMCAwIDEtMzMuMTUyIDMzLjE1Mkg1MjUuODI0djk5LjQ1NmEzMy4yMTYgMzMuMjE2IDAgMCAxLTY2LjMwNCAwVjQ2MS44ODhIMzYwLjA2NGEzMy4xNTIgMzMuMTUyIDAgMCAxIDAtNjYuMzA0SDQ1OS41MlYyOTYuMTI4YTMzLjE1MiAzMy4xNTIgMCAwIDEgNjYuMzA0IDBWMzk1LjUySDYyNS4yOGMxOC4yNCAwIDMzLjE1MiAxNC44NDggMzMuMTUyIDMzLjE1MnogbTI5OS43NzYgNTIxLjc5MmE0My4zMjggNDMuMzI4IDAgMCAxLTYwLjg2NC02LjkxMmwtMTg5LjI0OC0yMjAuOTkyYTM2Mi4zNjggMzYyLjM2OCAwIDAgMS0yMTUuMzYgNzAuODQ4IDM2NC44IDM2NC44IDAgMSAxIDM2NC44LTM2NC43MzYgMzYzLjA3MiAzNjMuMDcyIDAgMCAxLTg2LjkxMiAyMzUuOTY4bDE5Mi4zODQgMjI0LjY0YTQzLjM5MiA0My4zOTIgMCAwIDEtNC44IDYxLjE4NHogbS00NjUuNTM2LTIyMy4zNmEyOTguODE2IDI5OC44MTYgMCAwIDAgMjk4LjQzMi0yOTguNDMyIDI5OC44MTYgMjk4LjgxNiAwIDAgMC0yOTguNDMyLTI5OC40MzJBMjk4LjgxNiAyOTguODE2IDAgMCAwIDE5NC4yNCA0MjguOGEyOTguODE2IDI5OC44MTYgMCAwIDAgMjk4LjQzMiAyOTguNDMyelxcXCI+PC9wYXRoPlxcbiAgICAgICAgICAgICAgPC9zdmc+XFxuICAgICAgICAgICAgPC9saT5cXG4gICAgICAgICAgICA8bGkgY29kZT0nem9vbUluJz5cXG4gICAgICAgICAgICAgIDxzdmcgY2xhc3M9XFxcImljb25cXFwiIHZpZXdCb3g9XFxcIjAgMCAxMDI0IDEwMjRcXFwiIHZlcnNpb249XFxcIjEuMVxcXCIgeG1sbnM9XFxcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXFxcIiB3aWR0aD1cXFwiMjRcXFwiIGhlaWdodD1cXFwiMjRcXFwiPlxcbiAgICAgICAgICAgICAgICA8cGF0aCBkPVxcXCJNNjM5LjkzNiA0MTZhMzIgMzIgMCAwIDEtMzIgMzJoLTI1NmEzMiAzMiAwIDAgMSAwLTY0aDI1NmEzMiAzMiAwIDAgMSAzMiAzMnogbTI4OS4yOCA1MDMuNTUyYTQxLjc5MiA0MS43OTIgMCAwIDEtNTguNzUyLTYuNjU2bC0xODIuNjU2LTIxMy4yNDhBMzQ5Ljc2IDM0OS43NiAwIDAgMSA0ODAgNzY4IDM1MiAzNTIgMCAxIDEgODMyIDQxNmEzNTAuNCAzNTAuNCAwIDAgMS04My44NCAyMjcuNzEybDE4NS42NjQgMjE2Ljc2OGE0MS44NTYgNDEuODU2IDAgMCAxLTQuNjA4IDU5LjA3MnpNNDc5LjkzNiA3MDRjMTU4Ljc4NCAwIDI4OC0xMjkuMjE2IDI4OC0yODhTNjM4LjcyIDEyOCA0NzkuOTM2IDEyOGEyODguMzIgMjg4LjMyIDAgMCAwLTI4OCAyODhjMCAxNTguNzg0IDEyOS4yMTYgMjg4IDI4OCAyODh6XFxcIiBwLWlkPVxcXCIzODUzXFxcIj48L3BhdGg+XFxuICAgICAgICAgICAgICA8L3N2Zz5cXG4gICAgICAgICAgICA8L2xpPlxcbiAgICAgICAgICAgIDxsaSBjb2RlPSdyZWFsWm9vbSc+XFxuICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVxcXCJpY29uXFxcIiB2aWV3Qm94PVxcXCIwIDAgMTAyNCAxMDI0XFxcIiB2ZXJzaW9uPVxcXCIxLjFcXFwiIHhtbG5zPVxcXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1xcXCIgd2lkdGg9XFxcIjIwXFxcIiBoZWlnaHQ9XFxcIjI0XFxcIj5cXG4gICAgICAgICAgICAgICAgPHBhdGggZD1cXFwiTTM4NCAzMjB2Mzg0SDMyMFYzMjBoNjR6IG0yNTYgMHYzODRINTc2VjMyMGg2NHpNNTEyIDU3NnY2NEg0NDhWNTc2aDY0eiBtMC0xOTJ2NjRINDQ4VjM4NGg2NHogbTM1NS45NjggNTc2SDkyLjAzMkEyOC4xNiAyOC4xNiAwIDAgMSA2NCA5MzEuOTY4VjI4LjAzMkM2NCAxMi42MDggNzYuNjA4IDAgOTUuMTY4IDBoNjEwLjM2OEw4OTYgMTkydjczOS45NjhhMjguMTYgMjguMTYgMCAwIDEtMjguMDMyIDI4LjAzMnpNNzA0IDY0djEyOGgxMjhsLTEyOC0xMjh6IG0xMjggMTkyaC0xOTAuNDY0VjY0SDEyOHY4MzJoNzA0VjI1NnpcXFwiPjwvcGF0aD5cXG4gICAgICAgICAgICAgIDwvc3ZnPlxcbiAgICAgICAgICAgIDwvbGk+XFxuICAgICAgICAgICAgPGxpIGNvZGU9J2F1dG9ab29tJz5cXG4gICAgICAgICAgICAgIDxzdmcgY2xhc3M9XFxcImljb25cXFwiIHZpZXdCb3g9XFxcIjAgMCAxMDI0IDEwMjRcXFwiIHZlcnNpb249XFxcIjEuMVxcXCIgeG1sbnM9XFxcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXFxcIiB3aWR0aD1cXFwiMjBcXFwiIGhlaWdodD1cXFwiMjRcXFwiPlxcbiAgICAgICAgICAgICAgICA8cGF0aCBkPVxcXCJNNjg0LjI4OCAzMDUuMjhsMC4xMjgtMC42NC0wLjEyOC0wLjY0Vjk5LjcxMmMwLTE5Ljg0IDE1LjU1Mi0zNS45MDQgMzQuNDk2LTM1LjcxMmEzNS4wNzIgMzUuMDcyIDAgMCAxIDM0LjU2IDM1Ljc3NnYxNzEuMDA4aDE3MC45NDRjMTkuNjQ4IDAgMzUuODQgMTUuNDg4IDM1LjcxMiAzNC40MzJhMzUuMDcyIDM1LjA3MiAwIDAgMS0zNS44NCAzNC40OTZoLTIwNC4xNmwtMC42NC0wLjEyOGEzMi43NjggMzIuNzY4IDAgMCAxLTIwLjg2NC03LjU1MmMtMS4zNDQtMS4wMjQtMi44MTYtMS42NjQtMy45NjgtMi44MTYtMC4zODQtMC4zMi0wLjUxMi0wLjc2OC0wLjgzMi0xLjA4OGEzMy40NzIgMzMuNDcyIDAgMCAxLTkuNDA4LTIyLjg0OHpNMzA1LjI4IDY0YTM1LjA3MiAzNS4wNzIgMCAwIDAtMzQuNTYgMzUuNzc2djE3MS4wMDhIOTkuNzc2QTM1LjA3MiAzNS4wNzIgMCAwIDAgNjQgMzA1LjIxNmMwIDE4Ljk0NCAxNS44NzIgMzQuNDk2IDM1Ljg0IDM0LjQ5NmgyMDQuMTZsMC42NC0wLjEyOGEzMi44OTYgMzIuODk2IDAgMCAwIDIwLjg2NC03LjU1MmMxLjM0NC0xLjAyNCAyLjgxNi0xLjY2NCAzLjkwNC0yLjgxNiAwLjM4NC0wLjMyIDAuNTEyLTAuNzY4IDAuNzY4LTEuMDg4YTMzLjAyNCAzMy4wMjQgMCAwIDAgOS41MzYtMjIuODQ4bC0wLjEyOC0wLjY0IDAuMTI4LTAuNzA0Vjk5LjcxMkEzNS4wMDggMzUuMDA4IDAgMCAwIDMwNS4yMTYgNjR6IG02MTguOTQ0IDYyMC4yODhoLTIwNC4xNmwtMC42NCAwLjEyOC0wLjUxMi0wLjEyOGMtNy44MDggMC0xNC43MiAzLjItMjAuNDggNy42OC0xLjI4IDEuMDI0LTIuNzUyIDEuNjY0LTMuODQgMi43NTItMC4zODQgMC4zMi0wLjUxMiAwLjc2OC0wLjgzMiAxLjA4OGEzMy42NjQgMzMuNjY0IDAgMCAwLTkuNDA4IDIyLjkxMmwwLjEyOCAwLjY0LTAuMTI4IDAuNzA0djIwNC4yODhjMCAxOS43MTIgMTUuNTUyIDM1LjkwNCAzNC40OTYgMzUuNzEyYTM1LjA3MiAzNS4wNzIgMCAwIDAgMzQuNTYtMzUuNzc2Vjc1My4yOGgxNzAuOTQ0YzE5LjY0OCAwIDM1Ljg0LTE1LjQ4OCAzNS43MTItMzQuNDMyYTM1LjA3MiAzNS4wNzIgMCAwIDAtMzUuODQtMzQuNDk2eiBtLTU5My45MiAxMS41MmMtMC4yNTYtMC4zMi0wLjM4NC0wLjc2OC0wLjc2OC0xLjA4OC0xLjA4OC0xLjA4OC0yLjU2LTEuNzI4LTMuODQtMi42ODhhMzMuMDg4IDMzLjA4OCAwIDAgMC0yMC40OC03LjY4bC0wLjUxMiAwLjA2NC0wLjY0LTAuMTI4SDk5Ljg0YTM1LjA3MiAzNS4wNzIgMCAwIDAtMzUuODQgMzQuNDk2IDM1LjA3MiAzNS4wNzIgMCAwIDAgMzUuNzEyIDM0LjQzMkgyNzAuNzJ2MTcxLjAwOGMwIDE5Ljg0IDE1LjU1MiAzNS44NCAzNC41NiAzNS43NzZhMzUuMDA4IDM1LjAwOCAwIDAgMCAzNC40MzItMzUuNzEyVjcyMGwtMC4xMjgtMC42NCAwLjEyOC0wLjcwNGEzMy4zNDQgMzMuMzQ0IDAgMCAwLTkuNDcyLTIyLjg0OHpNNTEyIDM3NC4xNDRhMTM3LjkyIDEzNy45MiAwIDEgMCAwLjEyOCAyNzUuODRBMTM3LjkyIDEzNy45MiAwIDAgMCA1MTIgMzc0LjA4elxcXCI+PC9wYXRoPlxcbiAgICAgICAgICAgICAgPC9zdmc+XFxuICAgICAgICAgICAgPC9saT5cXG4gICAgICAgICAgPC91bD5cXG4gICAgICAgIFwiO1xuICAgICAgfSxcbiAgICAgIHpvb21TZW5zaXRpdml0eTogMlxuICAgIH07XG4gIH07XG5cbiAgVG9vbEJhci5wcm90b3R5cGUuaW5pdCA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdmFyIGdyYXBoID0gdGhpcy5nZXQoJ2dyYXBoJyk7XG4gICAgdmFyIGdldENvbnRlbnQgPSB0aGlzLmdldCgnZ2V0Q29udGVudCcpO1xuICAgIHZhciB0b29sQmFyID0gZ2V0Q29udGVudChncmFwaCk7XG4gICAgdmFyIHRvb2xCYXJET00gPSB0b29sQmFyO1xuXG4gICAgaWYgKGlzU3RyaW5nKHRvb2xCYXIpKSB7XG4gICAgICB0b29sQmFyRE9NID0gY3JlYXRlRG9tKHRvb2xCYXIpO1xuICAgIH1cblxuICAgIHZhciBjbGFzc05hbWUgPSB0aGlzLmdldCgnY2xhc3NOYW1lJyk7XG4gICAgdG9vbEJhckRPTS5zZXRBdHRyaWJ1dGUoJ2NsYXNzJywgY2xhc3NOYW1lIHx8ICdnNi1jb21wb25lbnQtdG9vbGJhcicpO1xuICAgIHZhciBjb250YWluZXIgPSB0aGlzLmdldCgnY29udGFpbmVyJyk7XG5cbiAgICBpZiAoIWNvbnRhaW5lcikge1xuICAgICAgY29udGFpbmVyID0gdGhpcy5nZXQoJ2dyYXBoJykuZ2V0KCdjb250YWluZXInKTtcbiAgICB9XG5cbiAgICBpZiAoaXNTdHJpbmcoY29udGFpbmVyKSkge1xuICAgICAgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoY29udGFpbmVyKTtcbiAgICB9XG5cbiAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQodG9vbEJhckRPTSk7XG4gICAgdGhpcy5zZXQoJ3Rvb2xCYXInLCB0b29sQmFyRE9NKTtcbiAgICB2YXIgaGFuZGxlQ2xpY2sgPSB0aGlzLmdldCgnaGFuZGxlQ2xpY2snKTtcbiAgICB0b29sQmFyRE9NLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKGV2dCkge1xuICAgICAgdmFyIGN1cnJlbnQgPSBnZXRFdmVudFBhdGgoZXZ0KS5maWx0ZXIoZnVuY3Rpb24gKHApIHtcbiAgICAgICAgcmV0dXJuIHAubm9kZU5hbWUgPT09ICdMSSc7XG4gICAgICB9KTtcblxuICAgICAgaWYgKGN1cnJlbnQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIGNvZGUgPSBjdXJyZW50WzBdLmdldEF0dHJpYnV0ZSgnY29kZScpO1xuXG4gICAgICBpZiAoIWNvZGUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoaGFuZGxlQ2xpY2spIHtcbiAgICAgICAgaGFuZGxlQ2xpY2soY29kZSwgZ3JhcGgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgX3RoaXMuaGFuZGxlRGVmYXVsdE9wZXJhdG9yKGNvZGUsIGdyYXBoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB2YXIgcG9zID0gdGhpcy5nZXQoJ3Bvc2l0aW9uJyk7XG5cbiAgICBpZiAocG9zKSB7XG4gICAgICBtb2RpZnlDU1ModG9vbEJhckRPTSwge1xuICAgICAgICB0b3A6IHBvcy55ICsgXCJweFwiLFxuICAgICAgICBsZWZ0OiBwb3MueCArIFwicHhcIlxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5iaW5kVW5kb1JlZG8oKTtcbiAgfTtcblxuICBUb29sQmFyLnByb3RvdHlwZS5iaW5kVW5kb1JlZG8gPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGdyYXBoID0gdGhpcy5nZXQoJ2dyYXBoJyk7XG4gICAgdmFyIHVuZG9Eb20gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuZzYtY29tcG9uZW50LXRvb2xiYXIgbGlbY29kZT1cInVuZG9cIl0nKTtcbiAgICB2YXIgdW5kb0RvbUljb24gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuZzYtY29tcG9uZW50LXRvb2xiYXIgbGlbY29kZT1cInVuZG9cIl0gc3ZnJyk7XG4gICAgdmFyIHJlZG9Eb20gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuZzYtY29tcG9uZW50LXRvb2xiYXIgbGlbY29kZT1cInJlZG9cIl0nKTtcbiAgICB2YXIgcmVkb0RvbUljb24gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuZzYtY29tcG9uZW50LXRvb2xiYXIgbGlbY29kZT1cInJlZG9cIl0gc3ZnJyk7XG5cbiAgICBpZiAoIXVuZG9Eb20gfHwgIXVuZG9Eb21JY29uIHx8ICFyZWRvRG9tIHx8ICFyZWRvRG9tSWNvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGdyYXBoLm9uKCdzdGFja2NoYW5nZScsIGZ1bmN0aW9uIChldnQpIHtcbiAgICAgIHZhciB1bmRvU3RhY2sgPSBldnQudW5kb1N0YWNrLFxuICAgICAgICAgIHJlZG9TdGFjayA9IGV2dC5yZWRvU3RhY2s7XG4gICAgICB2YXIgdW5kb1N0YWNrTGVuID0gdW5kb1N0YWNrLmxlbmd0aDtcbiAgICAgIHZhciByZWRvU3RhY2tMZW4gPSByZWRvU3RhY2subGVuZ3RoOyAvLyB1bmRvIOS4jeWPr+eUqFxuXG4gICAgICBpZiAodW5kb1N0YWNrTGVuID09PSAxKSB7XG4gICAgICAgIHVuZG9Eb20uc2V0QXR0cmlidXRlKCdzdHlsZScsICdjdXJzb3I6IG5vdC1hbGxvd2VkJyk7XG4gICAgICAgIHVuZG9Eb21JY29uLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAnb3BhY2l0eTogMC40Jyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB1bmRvRG9tLnJlbW92ZUF0dHJpYnV0ZSgnc3R5bGUnKTtcbiAgICAgICAgdW5kb0RvbUljb24ucmVtb3ZlQXR0cmlidXRlKCdzdHlsZScpO1xuICAgICAgfSAvLyByZWRvIOS4jeWPr+eUqFxuXG5cbiAgICAgIGlmIChyZWRvU3RhY2tMZW4gPT09IDApIHtcbiAgICAgICAgcmVkb0RvbS5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJ2N1cnNvcjogbm90LWFsbG93ZWQnKTtcbiAgICAgICAgcmVkb0RvbUljb24uc2V0QXR0cmlidXRlKCdzdHlsZScsICdvcGFjaXR5OiAwLjQnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlZG9Eb20ucmVtb3ZlQXR0cmlidXRlKCdzdHlsZScpO1xuICAgICAgICByZWRvRG9tSWNvbi5yZW1vdmVBdHRyaWJ1dGUoJ3N0eWxlJyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG4gIC8qKlxuICAgKiB1bmRvIOaTjeS9nFxuICAgKi9cblxuXG4gIFRvb2xCYXIucHJvdG90eXBlLnVuZG8gPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGdyYXBoID0gdGhpcy5nZXQoJ2dyYXBoJyk7XG4gICAgdmFyIHVuZG9TdGFjayA9IGdyYXBoLmdldFVuZG9TdGFjaygpO1xuXG4gICAgaWYgKCF1bmRvU3RhY2sgfHwgdW5kb1N0YWNrLmxlbmd0aCA9PT0gMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBjdXJyZW50RGF0YSA9IHVuZG9TdGFjay5wb3AoKTtcblxuICAgIGlmIChjdXJyZW50RGF0YSkge1xuICAgICAgdmFyIGFjdGlvbiA9IGN1cnJlbnREYXRhLmFjdGlvbjtcbiAgICAgIGdyYXBoLnB1c2hTdGFjayhhY3Rpb24sIGNsb25lKGN1cnJlbnREYXRhLmRhdGEpLCAncmVkbycpO1xuICAgICAgdmFyIGRhdGFfMSA9IGN1cnJlbnREYXRhLmRhdGEuYmVmb3JlO1xuXG4gICAgICBpZiAoYWN0aW9uID09PSAnYWRkJykge1xuICAgICAgICBkYXRhXzEgPSBjdXJyZW50RGF0YS5kYXRhLmFmdGVyO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWRhdGFfMSkgcmV0dXJuO1xuXG4gICAgICBzd2l0Y2ggKGFjdGlvbikge1xuICAgICAgICBjYXNlICd2aXNpYmxlJzpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhkYXRhXzEpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgICB2YXIgYXJyYXkgPSBkYXRhXzFba2V5XTtcbiAgICAgICAgICAgICAgaWYgKCFhcnJheSkgcmV0dXJuO1xuICAgICAgICAgICAgICBhcnJheS5mb3JFYWNoKGZ1bmN0aW9uIChtb2RlbCkge1xuICAgICAgICAgICAgICAgIHZhciBpdGVtID0gZ3JhcGguZmluZEJ5SWQobW9kZWwuaWQpO1xuXG4gICAgICAgICAgICAgICAgaWYgKG1vZGVsLnZpc2libGUpIHtcbiAgICAgICAgICAgICAgICAgIGdyYXBoLnNob3dJdGVtKGl0ZW0sIGZhbHNlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgZ3JhcGguaGlkZUl0ZW0oaXRlbSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICBjYXNlICdyZW5kZXInOlxuICAgICAgICBjYXNlICd1cGRhdGUnOlxuICAgICAgICAgIE9iamVjdC5rZXlzKGRhdGFfMSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICB2YXIgYXJyYXkgPSBkYXRhXzFba2V5XTtcbiAgICAgICAgICAgIGlmICghYXJyYXkpIHJldHVybjtcbiAgICAgICAgICAgIGFycmF5LmZvckVhY2goZnVuY3Rpb24gKG1vZGVsKSB7XG4gICAgICAgICAgICAgIGdyYXBoLnVwZGF0ZUl0ZW0obW9kZWwuaWQsIG1vZGVsLCBmYWxzZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdjaGFuZ2VkYXRhJzpcbiAgICAgICAgICBncmFwaC5jaGFuZ2VEYXRhKGRhdGFfMSwgZmFsc2UpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ2RlbGV0ZSc6XG4gICAgICAgICAge1xuICAgICAgICAgICAgT2JqZWN0LmtleXMoZGF0YV8xKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgICAgdmFyIGFycmF5ID0gZGF0YV8xW2tleV07XG4gICAgICAgICAgICAgIGlmICghYXJyYXkpIHJldHVybjtcbiAgICAgICAgICAgICAgYXJyYXkuZm9yRWFjaChmdW5jdGlvbiAobW9kZWwpIHtcbiAgICAgICAgICAgICAgICB2YXIgaXRlbVR5cGUgPSBtb2RlbC5pdGVtVHlwZTtcbiAgICAgICAgICAgICAgICBkZWxldGUgbW9kZWwuaXRlbVR5cGU7XG4gICAgICAgICAgICAgICAgZ3JhcGguYWRkSXRlbShpdGVtVHlwZSwgbW9kZWwsIGZhbHNlKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICBjYXNlICdhZGQnOlxuICAgICAgICAgIE9iamVjdC5rZXlzKGRhdGFfMSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICB2YXIgYXJyYXkgPSBkYXRhXzFba2V5XTtcbiAgICAgICAgICAgIGlmICghYXJyYXkpIHJldHVybjtcbiAgICAgICAgICAgIGFycmF5LmZvckVhY2goZnVuY3Rpb24gKG1vZGVsKSB7XG4gICAgICAgICAgICAgIGdyYXBoLnJlbW92ZUl0ZW0obW9kZWwuaWQsIGZhbHNlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ3VwZGF0ZUNvbWJvVHJlZSc6XG4gICAgICAgICAgT2JqZWN0LmtleXMoZGF0YV8xKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgIHZhciBhcnJheSA9IGRhdGFfMVtrZXldO1xuICAgICAgICAgICAgaWYgKCFhcnJheSkgcmV0dXJuO1xuICAgICAgICAgICAgYXJyYXkuZm9yRWFjaChmdW5jdGlvbiAobW9kZWwpIHtcbiAgICAgICAgICAgICAgZ3JhcGgudXBkYXRlQ29tYm9UcmVlKG1vZGVsLmlkLCBtb2RlbC5wYXJlbnRJZCwgZmFsc2UpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIC8qKlxuICAgKiByZWRvIOaTjeS9nFxuICAgKi9cblxuXG4gIFRvb2xCYXIucHJvdG90eXBlLnJlZG8gPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGdyYXBoID0gdGhpcy5nZXQoJ2dyYXBoJyk7XG4gICAgdmFyIHJlZG9TdGFjayA9IGdyYXBoLmdldFJlZG9TdGFjaygpO1xuXG4gICAgaWYgKCFyZWRvU3RhY2sgfHwgcmVkb1N0YWNrLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBjdXJyZW50RGF0YSA9IHJlZG9TdGFjay5wb3AoKTtcblxuICAgIGlmIChjdXJyZW50RGF0YSkge1xuICAgICAgdmFyIGFjdGlvbiA9IGN1cnJlbnREYXRhLmFjdGlvbjtcbiAgICAgIHZhciBkYXRhXzIgPSBjdXJyZW50RGF0YS5kYXRhLmFmdGVyO1xuICAgICAgZ3JhcGgucHVzaFN0YWNrKGFjdGlvbiwgY2xvbmUoY3VycmVudERhdGEuZGF0YSkpO1xuXG4gICAgICBpZiAoYWN0aW9uID09PSAnZGVsZXRlJykge1xuICAgICAgICBkYXRhXzIgPSBjdXJyZW50RGF0YS5kYXRhLmJlZm9yZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFkYXRhXzIpIHJldHVybjtcblxuICAgICAgc3dpdGNoIChhY3Rpb24pIHtcbiAgICAgICAgY2FzZSAndmlzaWJsZSc6XG4gICAgICAgICAge1xuICAgICAgICAgICAgT2JqZWN0LmtleXMoZGF0YV8yKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgICAgdmFyIGFycmF5ID0gZGF0YV8yW2tleV07XG4gICAgICAgICAgICAgIGlmICghYXJyYXkpIHJldHVybjtcbiAgICAgICAgICAgICAgYXJyYXkuZm9yRWFjaChmdW5jdGlvbiAobW9kZWwpIHtcbiAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IGdyYXBoLmZpbmRCeUlkKG1vZGVsLmlkKTtcblxuICAgICAgICAgICAgICAgIGlmIChtb2RlbC52aXNpYmxlKSB7XG4gICAgICAgICAgICAgICAgICBncmFwaC5zaG93SXRlbShpdGVtLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIGdyYXBoLmhpZGVJdGVtKGl0ZW0sIGZhbHNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgY2FzZSAncmVuZGVyJzpcbiAgICAgICAgY2FzZSAndXBkYXRlJzpcbiAgICAgICAgICBPYmplY3Qua2V5cyhkYXRhXzIpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgdmFyIGFycmF5ID0gZGF0YV8yW2tleV07XG4gICAgICAgICAgICBpZiAoIWFycmF5KSByZXR1cm47XG4gICAgICAgICAgICBhcnJheS5mb3JFYWNoKGZ1bmN0aW9uIChtb2RlbCkge1xuICAgICAgICAgICAgICBncmFwaC51cGRhdGVJdGVtKG1vZGVsLmlkLCBtb2RlbCwgZmFsc2UpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnY2hhbmdlZGF0YSc6XG4gICAgICAgICAgZ3JhcGguY2hhbmdlRGF0YShkYXRhXzIsIGZhbHNlKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdkZWxldGUnOlxuICAgICAgICAgIGlmIChkYXRhXzIuZWRnZXMpIHtcbiAgICAgICAgICAgIGRhdGFfMi5lZGdlcy5mb3JFYWNoKGZ1bmN0aW9uIChtb2RlbCkge1xuICAgICAgICAgICAgICBncmFwaC5yZW1vdmVJdGVtKG1vZGVsLmlkLCBmYWxzZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoZGF0YV8yLm5vZGVzKSB7XG4gICAgICAgICAgICBkYXRhXzIubm9kZXMuZm9yRWFjaChmdW5jdGlvbiAobW9kZWwpIHtcbiAgICAgICAgICAgICAgZ3JhcGgucmVtb3ZlSXRlbShtb2RlbC5pZCwgZmFsc2UpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGRhdGFfMi5jb21ib3MpIHtcbiAgICAgICAgICAgIGRhdGFfMi5jb21ib3MuZm9yRWFjaChmdW5jdGlvbiAobW9kZWwpIHtcbiAgICAgICAgICAgICAgZ3JhcGgucmVtb3ZlSXRlbShtb2RlbC5pZCwgZmFsc2UpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnYWRkJzpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhkYXRhXzIpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgICB2YXIgYXJyYXkgPSBkYXRhXzJba2V5XTtcbiAgICAgICAgICAgICAgaWYgKCFhcnJheSkgcmV0dXJuO1xuICAgICAgICAgICAgICBhcnJheS5mb3JFYWNoKGZ1bmN0aW9uIChtb2RlbCkge1xuICAgICAgICAgICAgICAgIHZhciBpdGVtVHlwZSA9IG1vZGVsLml0ZW1UeXBlO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBtb2RlbC5pdGVtVHlwZTtcbiAgICAgICAgICAgICAgICBncmFwaC5hZGRJdGVtKGl0ZW1UeXBlLCBtb2RlbCwgZmFsc2UpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgJ3VwZGF0ZUNvbWJvVHJlZSc6XG4gICAgICAgICAgT2JqZWN0LmtleXMoZGF0YV8yKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgIHZhciBhcnJheSA9IGRhdGFfMltrZXldO1xuICAgICAgICAgICAgaWYgKCFhcnJheSkgcmV0dXJuO1xuICAgICAgICAgICAgYXJyYXkuZm9yRWFjaChmdW5jdGlvbiAobW9kZWwpIHtcbiAgICAgICAgICAgICAgZ3JhcGgudXBkYXRlQ29tYm9UcmVlKG1vZGVsLmlkLCBtb2RlbC5wYXJlbnRJZCwgZmFsc2UpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIC8qKlxuICAgKiDmoLnmja4gVG9vbGJhciDkuIrkuI3lkIznsbvlnovlr7nlm77ov5vooYzmk43kvZxcbiAgICogQHBhcmFtIGNvZGUg5pON5L2c57G75Z6L57yW56CBXG4gICAqIEBwYXJhbSBncmFwaCBHcmFwaCDlrp7kvotcbiAgICovXG5cblxuICBUb29sQmFyLnByb3RvdHlwZS5oYW5kbGVEZWZhdWx0T3BlcmF0b3IgPSBmdW5jdGlvbiAoY29kZSwgZ3JhcGgpIHtcbiAgICB2YXIgY3VycmVudFpvb20gPSBncmFwaC5nZXRab29tKCk7XG5cbiAgICBzd2l0Y2ggKGNvZGUpIHtcbiAgICAgIGNhc2UgJ3JlZG8nOlxuICAgICAgICB0aGlzLnJlZG8oKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ3VuZG8nOlxuICAgICAgICB0aGlzLnVuZG8oKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ3pvb21PdXQnOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIHJhdGlvT3V0ID0gMSAvICgxIC0gREVMVEEgKiB0aGlzLmdldCgnem9vbVNlbnNpdGl2aXR5JykpO1xuICAgICAgICAgIHZhciBtYXhab29tID0gdGhpcy5nZXQoJ21heFpvb20nKSB8fCBncmFwaC5nZXQoJ21heFpvb20nKTtcblxuICAgICAgICAgIGlmIChyYXRpb091dCAqIGN1cnJlbnRab29tID4gbWF4Wm9vbSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGdyYXBoLnpvb21UbyhjdXJyZW50Wm9vbSAqIHJhdGlvT3V0KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlICd6b29tSW4nOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIHJhdGlvSW4gPSAxIC0gREVMVEEgKiB0aGlzLmdldCgnem9vbVNlbnNpdGl2aXR5Jyk7XG4gICAgICAgICAgdmFyIG1pblpvb20gPSB0aGlzLmdldCgnbWluWm9vbScpIHx8IGdyYXBoLmdldCgnbWluWm9vbScpO1xuXG4gICAgICAgICAgaWYgKHJhdGlvSW4gKiBjdXJyZW50Wm9vbSA8IG1pblpvb20pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBncmFwaC56b29tVG8oY3VycmVudFpvb20gKiByYXRpb0luKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlICdyZWFsWm9vbSc6XG4gICAgICAgIGdyYXBoLnpvb21UbygxKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ2F1dG9ab29tJzpcbiAgICAgICAgZ3JhcGguZml0VmlldyhbMjAsIDIwXSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgIH1cbiAgfTtcblxuICBUb29sQmFyLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciB0b29sQmFyID0gdGhpcy5nZXQoJ3Rvb2xCYXInKTtcblxuICAgIGlmICh0b29sQmFyKSB7XG4gICAgICB2YXIgY29udGFpbmVyID0gdGhpcy5nZXQoJ2NvbnRhaW5lcicpO1xuXG4gICAgICBpZiAoIWNvbnRhaW5lcikge1xuICAgICAgICBjb250YWluZXIgPSB0aGlzLmdldCgnZ3JhcGgnKS5nZXQoJ2NvbnRhaW5lcicpO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNTdHJpbmcoY29udGFpbmVyKSkge1xuICAgICAgICBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChjb250YWluZXIpO1xuICAgICAgfVxuXG4gICAgICBjb250YWluZXIucmVtb3ZlQ2hpbGQodG9vbEJhcik7XG4gICAgfVxuXG4gICAgdmFyIGhhbmRsZUNsaWNrID0gdGhpcy5nZXQoJ2hhbmRsZUNsaWNrJyk7XG5cbiAgICBpZiAoaGFuZGxlQ2xpY2spIHtcbiAgICAgIHRvb2xCYXIucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVDbGljayk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBUb29sQmFyO1xufShCYXNlKTtcblxuZXhwb3J0IGRlZmF1bHQgVG9vbEJhcjsiLCJ2YXIgX19leHRlbmRzID0gdGhpcyAmJiB0aGlzLl9fZXh0ZW5kcyB8fCBmdW5jdGlvbiAoKSB7XG4gIHZhciBfZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uIGV4dGVuZFN0YXRpY3MoZCwgYikge1xuICAgIF9leHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8IHtcbiAgICAgIF9fcHJvdG9fXzogW11cbiAgICB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgIGQuX19wcm90b19fID0gYjtcbiAgICB9IHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICBmb3IgKHZhciBwIGluIGIpIHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBwKSkgZFtwXSA9IGJbcF07XG4gICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiBfZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgfTtcblxuICByZXR1cm4gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICBpZiAodHlwZW9mIGIgIT09IFwiZnVuY3Rpb25cIiAmJiBiICE9PSBudWxsKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2xhc3MgZXh0ZW5kcyB2YWx1ZSBcIiArIFN0cmluZyhiKSArIFwiIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGxcIik7XG5cbiAgICBfZXh0ZW5kU3RhdGljcyhkLCBiKTtcblxuICAgIGZ1bmN0aW9uIF9fKCkge1xuICAgICAgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7XG4gICAgfVxuXG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xuICB9O1xufSgpO1xuXG5pbXBvcnQgeyBtb2RpZnlDU1MsIGNyZWF0ZURvbSB9IGZyb20gJ0BhbnR2L2RvbS11dGlsJztcbmltcG9ydCB7IGlzQXJyYXksIGlzU3RyaW5nIH0gZnJvbSAnQGFudHYvdXRpbCc7XG5pbXBvcnQgaW5zZXJ0Q3NzIGZyb20gJ2luc2VydC1jc3MnO1xuaW1wb3J0IEJhc2UgZnJvbSAnLi4vYmFzZSc7XG50eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIGluc2VydENzcyhcIlxcbiAgLmc2LWNvbXBvbmVudC10b29sdGlwIHtcXG4gICAgYm9yZGVyOiAxcHggc29saWQgI2UyZTJlMjtcXG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xcbiAgICBmb250LXNpemU6IDEycHg7XFxuICAgIGNvbG9yOiAjNTQ1NDU0O1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOSk7XFxuICAgIHBhZGRpbmc6IDEwcHggOHB4O1xcbiAgICBib3gtc2hhZG93OiByZ2IoMTc0LCAxNzQsIDE3NCkgMHB4IDBweCAxMHB4O1xcbiAgfVxcbiAgLnRvb2x0aXAtdHlwZSB7XFxuICAgIHBhZGRpbmc6IDA7XFxuICAgIG1hcmdpbjogMDtcXG4gIH1cXG4gIC50b29sdGlwLWlkIHtcXG4gICAgY29sb3I6ICM1MzFkYWI7XFxuICB9XFxuXCIpO1xuXG52YXIgVG9vbHRpcCA9XG4vKiogQGNsYXNzICovXG5mdW5jdGlvbiAoX3N1cGVyKSB7XG4gIF9fZXh0ZW5kcyhUb29sdGlwLCBfc3VwZXIpO1xuXG4gIGZ1bmN0aW9uIFRvb2x0aXAoY29uZmlnKSB7XG4gICAgcmV0dXJuIF9zdXBlci5jYWxsKHRoaXMsIGNvbmZpZykgfHwgdGhpcztcbiAgfVxuXG4gIFRvb2x0aXAucHJvdG90eXBlLmdldERlZmF1bHRDZmdzID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB7XG4gICAgICBvZmZzZXRYOiA2LFxuICAgICAgb2Zmc2V0WTogNixcbiAgICAgIC8vIOaMh+WumuiPnOWNleWGheWuue+8jGZ1bmN0aW9uKGUpIHsuLi59XG4gICAgICBnZXRDb250ZW50OiBmdW5jdGlvbiBnZXRDb250ZW50KGUpIHtcbiAgICAgICAgcmV0dXJuIFwiXFxuICAgICAgICAgIDxoNCBjbGFzcz0ndG9vbHRpcC10eXBlJz5cXHU3QzdCXFx1NTc4QlxcdUZGMUFcIiArIGUuaXRlbS5nZXRUeXBlKCkgKyBcIjwvaDQ+XFxuICAgICAgICAgIDxzcGFuIGNsYXNzPSd0b29sdGlwLWlkJz5JRFxcdUZGMUFcIiArIGUuaXRlbS5nZXRJRCgpICsgXCI8L3NwYW4+XFxuICAgICAgICBcIjtcbiAgICAgIH0sXG4gICAgICBzaG91bGRCZWdpbjogZnVuY3Rpb24gc2hvdWxkQmVnaW4oZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0sXG4gICAgICBpdGVtVHlwZXM6IFsnbm9kZScsICdlZGdlJywgJ2NvbWJvJ10sXG4gICAgICB0cmlnZ2VyOiAnbW91c2VlbnRlcicsXG4gICAgICBmaXhUb05vZGU6IHVuZGVmaW5lZFxuICAgIH07XG4gIH07IC8vIGNsYXNzLW1ldGhvZHMtdXNlLXRoaXNcblxuXG4gIFRvb2x0aXAucHJvdG90eXBlLmdldEV2ZW50cyA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodGhpcy5nZXQoJ3RyaWdnZXInKSA9PT0gJ2NsaWNrJykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgJ25vZGU6Y2xpY2snOiAnb25DbGljaycsXG4gICAgICAgICdlZGdlOmNsaWNrJzogJ29uQ2xpY2snLFxuICAgICAgICAnY29tYm86Y2xpY2snOiAnb25DbGljaycsXG4gICAgICAgICdjYW52YXM6Y2xpY2snOiAnb25Nb3VzZUxlYXZlJyxcbiAgICAgICAgYWZ0ZXJyZW1vdmVpdGVtOiAnb25Nb3VzZUxlYXZlJyxcbiAgICAgICAgY29udGV4dG1lbnU6ICdvbk1vdXNlTGVhdmUnLFxuICAgICAgICBkcmFnOiAnb25Nb3VzZUxlYXZlJ1xuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgJ25vZGU6bW91c2VlbnRlcic6ICdvbk1vdXNlRW50ZXInLFxuICAgICAgJ25vZGU6bW91c2VsZWF2ZSc6ICdvbk1vdXNlTGVhdmUnLFxuICAgICAgJ25vZGU6bW91c2Vtb3ZlJzogJ29uTW91c2VNb3ZlJyxcbiAgICAgICdlZGdlOm1vdXNlZW50ZXInOiAnb25Nb3VzZUVudGVyJyxcbiAgICAgICdlZGdlOm1vdXNlbGVhdmUnOiAnb25Nb3VzZUxlYXZlJyxcbiAgICAgICdlZGdlOm1vdXNlbW92ZSc6ICdvbk1vdXNlTW92ZScsXG4gICAgICAnY29tYm86bW91c2VlbnRlcic6ICdvbk1vdXNlRW50ZXInLFxuICAgICAgJ2NvbWJvOm1vdXNlbGVhdmUnOiAnb25Nb3VzZUxlYXZlJyxcbiAgICAgICdjb21ibzptb3VzZW1vdmUnOiAnb25Nb3VzZU1vdmUnLFxuICAgICAgYWZ0ZXJyZW1vdmVpdGVtOiAnb25Nb3VzZUxlYXZlJyxcbiAgICAgIGNvbnRleHRtZW51OiAnb25Nb3VzZUxlYXZlJyxcbiAgICAgICdub2RlOmRyYWcnOiAnb25Nb3VzZUxlYXZlJ1xuICAgIH07XG4gIH07XG5cbiAgVG9vbHRpcC5wcm90b3R5cGUuaW5pdCA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIGNsYXNzTmFtZSA9IHNlbGYuZ2V0KCdjbGFzc05hbWUnKSB8fCAnZzYtY29tcG9uZW50LXRvb2x0aXAnO1xuICAgIHZhciB0b29sdGlwID0gY3JlYXRlRG9tKFwiPGRpdiBjbGFzcz1cIiArIGNsYXNzTmFtZSArIFwiPjwvZGl2PlwiKTtcbiAgICB2YXIgY29udGFpbmVyID0gc2VsZi5nZXQoJ2NvbnRhaW5lcicpO1xuXG4gICAgaWYgKCFjb250YWluZXIpIHtcbiAgICAgIGNvbnRhaW5lciA9IHNlbGYuZ2V0KCdncmFwaCcpLmdldCgnY29udGFpbmVyJyk7XG4gICAgfVxuXG4gICAgaWYgKGlzU3RyaW5nKGNvbnRhaW5lcikpIHtcbiAgICAgIGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGNvbnRhaW5lcik7XG4gICAgfVxuXG4gICAgbW9kaWZ5Q1NTKHRvb2x0aXAsIHtcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgdmlzaWJpbGl0eTogJ2hpZGRlbicsXG4gICAgICBkaXNwbGF5OiAnbm9uZSdcbiAgICB9KTtcbiAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQodG9vbHRpcCk7XG5cbiAgICBpZiAoc2VsZi5nZXQoJ3RyaWdnZXInKSAhPT0gJ2NsaWNrJykge1xuICAgICAgdG9vbHRpcC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWVudGVyJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgbW9kaWZ5Q1NTKHRvb2x0aXAsIHtcbiAgICAgICAgICB2aXNpYmlsaXR5OiAndmlzaWJsZScsXG4gICAgICAgICAgZGlzcGxheTogJ3Vuc2V0J1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgdG9vbHRpcC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWxlYXZlJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgc2VsZi5oaWRlVG9vbHRpcCgpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2VsZi5zZXQoJ3Rvb2x0aXAnLCB0b29sdGlwKTtcbiAgfTtcblxuICBUb29sdGlwLnByb3RvdHlwZS5vbkNsaWNrID0gZnVuY3Rpb24gKGUpIHtcbiAgICB2YXIgaXRlbVR5cGVzID0gdGhpcy5nZXQoJ2l0ZW1UeXBlcycpO1xuICAgIGlmIChlLml0ZW0gJiYgZS5pdGVtLmdldFR5cGUgJiYgaXRlbVR5cGVzLmluZGV4T2YoZS5pdGVtLmdldFR5cGUoKSkgPT09IC0xKSByZXR1cm47XG4gICAgdmFyIGl0ZW0gPSBlLml0ZW07XG4gICAgdmFyIGdyYXBoID0gdGhpcy5nZXQoJ2dyYXBoJyk7IC8vIOiLpeS4juS4iuS4gOasoeWQjOS4gCBpdGVt77yM6ZqQ6JeP6K+lIHRvb2x0aXBcblxuICAgIGlmICh0aGlzLmN1cnJlbnRUYXJnZXQgPT09IGl0ZW0pIHtcbiAgICAgIHRoaXMuY3VycmVudFRhcmdldCA9IG51bGw7XG4gICAgICB0aGlzLmhpZGVUb29sdGlwKCk7XG4gICAgICBncmFwaC5lbWl0KCd0b29sdGlwY2hhbmdlJywge1xuICAgICAgICBpdGVtOiBlLml0ZW0sXG4gICAgICAgIGFjdGlvbjogJ2hpZGUnXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jdXJyZW50VGFyZ2V0ID0gaXRlbTtcbiAgICAgIHRoaXMuc2hvd1Rvb2x0aXAoZSk7XG4gICAgICBncmFwaC5lbWl0KCd0b29sdGlwY2hhbmdlJywge1xuICAgICAgICBpdGVtOiBlLml0ZW0sXG4gICAgICAgIGFjdGlvbjogJ3Nob3cnXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgVG9vbHRpcC5wcm90b3R5cGUub25Nb3VzZUVudGVyID0gZnVuY3Rpb24gKGUpIHtcbiAgICB2YXIgaXRlbVR5cGVzID0gdGhpcy5nZXQoJ2l0ZW1UeXBlcycpO1xuICAgIGlmIChlLml0ZW0gJiYgZS5pdGVtLmdldFR5cGUgJiYgaXRlbVR5cGVzLmluZGV4T2YoZS5pdGVtLmdldFR5cGUoKSkgPT09IC0xKSByZXR1cm47XG4gICAgdmFyIGl0ZW0gPSBlLml0ZW07XG4gICAgdmFyIGdyYXBoID0gdGhpcy5nZXQoJ2dyYXBoJyk7XG4gICAgdGhpcy5jdXJyZW50VGFyZ2V0ID0gaXRlbTtcbiAgICB0aGlzLnNob3dUb29sdGlwKGUpO1xuICAgIGdyYXBoLmVtaXQoJ3Rvb2x0aXBjaGFuZ2UnLCB7XG4gICAgICBpdGVtOiBlLml0ZW0sXG4gICAgICBhY3Rpb246ICdzaG93J1xuICAgIH0pO1xuICB9O1xuXG4gIFRvb2x0aXAucHJvdG90eXBlLm9uTW91c2VNb3ZlID0gZnVuY3Rpb24gKGUpIHtcbiAgICB2YXIgaXRlbVR5cGVzID0gdGhpcy5nZXQoJ2l0ZW1UeXBlcycpO1xuICAgIGlmIChlLml0ZW0gJiYgZS5pdGVtLmdldFR5cGUgJiYgaXRlbVR5cGVzLmluZGV4T2YoZS5pdGVtLmdldFR5cGUoKSkgPT09IC0xKSByZXR1cm47XG5cbiAgICBpZiAoIXRoaXMuY3VycmVudFRhcmdldCB8fCBlLml0ZW0gIT09IHRoaXMuY3VycmVudFRhcmdldCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc2hvd1Rvb2x0aXAoZSk7XG4gIH07XG5cbiAgVG9vbHRpcC5wcm90b3R5cGUub25Nb3VzZUxlYXZlID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuaGlkZVRvb2x0aXAoKTtcbiAgICB2YXIgZ3JhcGggPSB0aGlzLmdldCgnZ3JhcGgnKTtcbiAgICBncmFwaC5lbWl0KCd0b29sdGlwY2hhbmdlJywge1xuICAgICAgaXRlbTogdGhpcy5jdXJyZW50VGFyZ2V0LFxuICAgICAgYWN0aW9uOiAnaGlkZSdcbiAgICB9KTtcbiAgICB0aGlzLmN1cnJlbnRUYXJnZXQgPSBudWxsO1xuICB9O1xuXG4gIFRvb2x0aXAucHJvdG90eXBlLnNob3dUb29sdGlwID0gZnVuY3Rpb24gKGUpIHtcbiAgICBpZiAoIWUuaXRlbSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBpdGVtVHlwZXMgPSB0aGlzLmdldCgnaXRlbVR5cGVzJyk7XG4gICAgaWYgKGUuaXRlbS5nZXRUeXBlICYmIGl0ZW1UeXBlcy5pbmRleE9mKGUuaXRlbS5nZXRUeXBlKCkpID09PSAtMSkgcmV0dXJuO1xuICAgIHZhciBjb250YWluZXIgPSB0aGlzLmdldCgndG9vbHRpcCcpO1xuICAgIHZhciBnZXRDb250ZW50ID0gdGhpcy5nZXQoJ2dldENvbnRlbnQnKTtcbiAgICB2YXIgdG9vbHRpcCA9IGdldENvbnRlbnQoZSk7XG5cbiAgICBpZiAoaXNTdHJpbmcodG9vbHRpcCkpIHtcbiAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSB0b29sdGlwO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gdG9vbHRpcC5vdXRlckhUTUw7XG4gICAgfVxuXG4gICAgdGhpcy51cGRhdGVQb3NpdGlvbihlKTtcbiAgfTtcblxuICBUb29sdGlwLnByb3RvdHlwZS5oaWRlVG9vbHRpcCA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdG9vbHRpcCA9IHRoaXMuZ2V0KCd0b29sdGlwJyk7XG5cbiAgICBpZiAodG9vbHRpcCkge1xuICAgICAgbW9kaWZ5Q1NTKHRvb2x0aXAsIHtcbiAgICAgICAgdmlzaWJpbGl0eTogJ2hpZGRlbicsXG4gICAgICAgIGRpc3BsYXk6ICdub25lJ1xuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIFRvb2x0aXAucHJvdG90eXBlLnVwZGF0ZVBvc2l0aW9uID0gZnVuY3Rpb24gKGUpIHtcbiAgICB2YXIgc2hvdWxkQmVnaW4gPSB0aGlzLmdldCgnc2hvdWxkQmVnaW4nKTtcbiAgICB2YXIgdG9vbHRpcCA9IHRoaXMuZ2V0KCd0b29sdGlwJyk7XG5cbiAgICBpZiAoIXNob3VsZEJlZ2luKGUpKSB7XG4gICAgICBtb2RpZnlDU1ModG9vbHRpcCwge1xuICAgICAgICB2aXNpYmlsaXR5OiAnaGlkZGVuJyxcbiAgICAgICAgZGlzcGxheTogJ25vbmUnXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgZ3JhcGggPSB0aGlzLmdldCgnZ3JhcGgnKTtcbiAgICB2YXIgd2lkdGggPSBncmFwaC5nZXQoJ3dpZHRoJyk7XG4gICAgdmFyIGhlaWdodCA9IGdyYXBoLmdldCgnaGVpZ2h0Jyk7XG4gICAgdmFyIG9mZnNldFggPSB0aGlzLmdldCgnb2Zmc2V0WCcpIHx8IDA7XG4gICAgdmFyIG9mZnNldFkgPSB0aGlzLmdldCgnb2Zmc2V0WScpIHx8IDA7IC8vIGNvbnN0IG1vdXNlUG9zID0gZ3JhcGguZ2V0UG9pbnRCeUNsaWVudChlLmNsaWVudFgsIGUuY2xpZW50WSk7XG5cbiAgICB2YXIgcG9pbnQgPSBncmFwaC5nZXRQb2ludEJ5Q2xpZW50KGUuY2xpZW50WCwgZS5jbGllbnRZKTtcbiAgICB2YXIgZml4VG9Ob2RlID0gdGhpcy5nZXQoJ2ZpeFRvTm9kZScpO1xuICAgIHZhciBpdGVtID0gZS5pdGVtO1xuXG4gICAgaWYgKGl0ZW0uZ2V0VHlwZSAmJiBpdGVtLmdldFR5cGUoKSA9PT0gJ25vZGUnICYmIGZpeFRvTm9kZSAmJiBpc0FycmF5KGZpeFRvTm9kZSkgJiYgZml4VG9Ob2RlLmxlbmd0aCA+PSAyKSB7XG4gICAgICB2YXIgaXRlbUJCb3ggPSBpdGVtLmdldEJCb3goKTtcbiAgICAgIHBvaW50ID0ge1xuICAgICAgICB4OiBpdGVtQkJveC5taW5YICsgaXRlbUJCb3gud2lkdGggKiBmaXhUb05vZGVbMF0sXG4gICAgICAgIHk6IGl0ZW1CQm94Lm1pblkgKyBpdGVtQkJveC5oZWlnaHQgKiBmaXhUb05vZGVbMV1cbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIF9hID0gZ3JhcGguZ2V0Q2FudmFzQnlQb2ludChwb2ludC54LCBwb2ludC55KSxcbiAgICAgICAgeCA9IF9hLngsXG4gICAgICAgIHkgPSBfYS55O1xuXG4gICAgdmFyIGdyYXBoQ29udGFpbmVyID0gZ3JhcGguZ2V0Q29udGFpbmVyKCk7XG4gICAgdmFyIHJlcyA9IHtcbiAgICAgIHg6IHggKyBncmFwaENvbnRhaW5lci5vZmZzZXRMZWZ0ICsgb2Zmc2V0WCxcbiAgICAgIHk6IHkgKyBncmFwaENvbnRhaW5lci5vZmZzZXRUb3AgKyBvZmZzZXRZXG4gICAgfTsgLy8g5YWI5L+u5pS55Li6IHZpc2libGUg5pa55Y+v5q2j56Gu6K6h566XIGJib3hcblxuICAgIG1vZGlmeUNTUyh0b29sdGlwLCB7XG4gICAgICB2aXNpYmlsaXR5OiAndmlzaWJsZScsXG4gICAgICBkaXNwbGF5OiAndW5zZXQnXG4gICAgfSk7XG4gICAgdmFyIGJib3ggPSB0b29sdGlwLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgaWYgKHggKyBiYm94LndpZHRoICsgb2Zmc2V0WCA+IHdpZHRoKSB7XG4gICAgICByZXMueCAtPSBiYm94LndpZHRoICsgb2Zmc2V0WDtcbiAgICB9XG5cbiAgICBpZiAoeSArIGJib3guaGVpZ2h0ICsgb2Zmc2V0WSA+IGhlaWdodCkge1xuICAgICAgcmVzLnkgLT0gYmJveC5oZWlnaHQgKyBvZmZzZXRZO1xuICAgIH1cblxuICAgIG1vZGlmeUNTUyh0b29sdGlwLCB7XG4gICAgICBsZWZ0OiByZXMueCArIFwicHhcIixcbiAgICAgIHRvcDogcmVzLnkgKyBcInB4XCJcbiAgICB9KTtcbiAgfTtcblxuICBUb29sdGlwLnByb3RvdHlwZS5oaWRlID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMub25Nb3VzZUxlYXZlKCk7XG4gIH07XG5cbiAgVG9vbHRpcC5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdG9vbHRpcCA9IHRoaXMuZ2V0KCd0b29sdGlwJyk7XG5cbiAgICBpZiAodG9vbHRpcCkge1xuICAgICAgdmFyIGNvbnRhaW5lciA9IHRoaXMuZ2V0KCdjb250YWluZXInKTtcblxuICAgICAgaWYgKCFjb250YWluZXIpIHtcbiAgICAgICAgY29udGFpbmVyID0gdGhpcy5nZXQoJ2dyYXBoJykuZ2V0KCdjb250YWluZXInKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzU3RyaW5nKGNvbnRhaW5lcikpIHtcbiAgICAgICAgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoY29udGFpbmVyKTtcbiAgICAgIH1cblxuICAgICAgY29udGFpbmVyLnJlbW92ZUNoaWxkKHRvb2x0aXApO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gVG9vbHRpcDtcbn0oQmFzZSk7XG5cbmV4cG9ydCBkZWZhdWx0IFRvb2x0aXA7IiwidmFyIG1ldGhvZENhY2hlID0ge307XG4vKipcbiAqIOiOt+WPluiuoeeulyB0aWNrcyDnmoTmlrnms5VcbiAqIEBwYXJhbSBrZXkg6ZSu5YC8XG4gKiBAcmV0dXJucyDorqHnrpcgdGlja3Mg55qE5pa55rOVXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUaWNrTWV0aG9kKGtleSkge1xuICAgIHJldHVybiBtZXRob2RDYWNoZVtrZXldO1xufVxuLyoqXG4gKiDms6jlhozorqHnrpcgdGlja3Mg55qE5pa55rOVXG4gKiBAcGFyYW0ga2V5IOmUruWAvFxuICogQHBhcmFtIG1ldGhvZCDmlrnms5VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyVGlja01ldGhvZChrZXksIG1ldGhvZCkge1xuICAgIG1ldGhvZENhY2hlW2tleV0gPSBtZXRob2Q7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZWdpc3Rlci5qcy5tYXAiLCJpbXBvcnQgeyBhc3NpZ24sIGlzRW1wdHksIGlzRnVuY3Rpb24sIGlzTmlsLCBpc051bWJlciwgaXNPYmplY3QsIGlzU3RyaW5nLCBtYXAgfSBmcm9tICdAYW50di91dGlsJztcbmltcG9ydCB7IGdldFRpY2tNZXRob2QgfSBmcm9tICcuL3RpY2stbWV0aG9kL3JlZ2lzdGVyJztcbnZhciBTY2FsZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBTY2FsZShjZmcpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIOW6pumHj+eahOexu+Wei1xuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy50eXBlID0gJ2Jhc2UnO1xuICAgICAgICAvKipcbiAgICAgICAgICog5piv5ZCm5YiG57G757G75Z6L55qE5bqm6YePXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmlzQ2F0ZWdvcnkgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIOaYr+WQpue6v+aAp+W6pumHj++8jOaciWxpbmVhciwgdGltZSDluqbph49cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuaXNMaW5lYXIgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIOaYr+WQpui/nue7reexu+Wei+eahOW6pumHj++8jGxpbmVhcix0aW1lLGxvZywgcG93LCBxdWFudGlsZSwgcXVhbnRpemUg6YO95pSv5oyBXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmlzQ29udGludW91cyA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICog5piv5ZCm5piv5bi46YeP55qE5bqm6YeP77yM5Lyg5YWl5ZKM5Lyg5Ye65LiA6Ie0XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmlzSWRlbnRpdHkgPSBmYWxzZTtcbiAgICAgICAgdGhpcy52YWx1ZXMgPSBbXTtcbiAgICAgICAgdGhpcy5yYW5nZSA9IFswLCAxXTtcbiAgICAgICAgdGhpcy50aWNrcyA9IFtdO1xuICAgICAgICB0aGlzLl9fY2ZnX18gPSBjZmc7XG4gICAgICAgIHRoaXMuaW5pdENmZygpO1xuICAgICAgICB0aGlzLmluaXQoKTtcbiAgICB9XG4gICAgLy8g5a+55LqO5Y6f5aeL5YC855qE5b+F6KaB6L2s5o2i77yM5aaC5YiG57G744CB5pe26Ze05a2X5q616ZyA6L2s5o2i5oiQ5pWw5YC877yM55SodHJhbnNmb3JtL21hcOWRveWQjeWPr+iDveabtOWlvVxuICAgIFNjYWxlLnByb3RvdHlwZS50cmFuc2xhdGUgPSBmdW5jdGlvbiAodikge1xuICAgICAgICByZXR1cm4gdjtcbiAgICB9O1xuICAgIC8qKiDph43mlrDliJ3lp4vljJYgKi9cbiAgICBTY2FsZS5wcm90b3R5cGUuY2hhbmdlID0gZnVuY3Rpb24gKGNmZykge1xuICAgICAgICAvLyDopobnm5bphY3nva7pobnvvIzogIzkuI3mm7/ku6NcbiAgICAgICAgYXNzaWduKHRoaXMuX19jZmdfXywgY2ZnKTtcbiAgICAgICAgdGhpcy5pbml0KCk7XG4gICAgfTtcbiAgICBTY2FsZS5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdG9yKHRoaXMuX19jZmdfXyk7XG4gICAgfTtcbiAgICAvKiog6I635Y+W5Z2Q5qCH6L206ZyA6KaB55qEdGlja3MgKi9cbiAgICBTY2FsZS5wcm90b3R5cGUuZ2V0VGlja3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHJldHVybiBtYXAodGhpcy50aWNrcywgZnVuY3Rpb24gKHRpY2ssIGlkeCkge1xuICAgICAgICAgICAgaWYgKGlzT2JqZWN0KHRpY2spKSB7XG4gICAgICAgICAgICAgICAgLy8g5LuF5b2T56ym5ZCIVGlja+exu+Wei+aXtuaJjeacieaEj+S5iVxuICAgICAgICAgICAgICAgIHJldHVybiB0aWNrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0ZXh0OiBfdGhpcy5nZXRUZXh0KHRpY2ssIGlkeCksXG4gICAgICAgICAgICAgICAgdGlja1ZhbHVlOiB0aWNrLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBfdGhpcy5zY2FsZSh0aWNrKSwgLy8gc2NhbGVkXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKiDojrflj5ZUaWNr55qE5qC85byP5YyW57uT5p6cICovXG4gICAgU2NhbGUucHJvdG90eXBlLmdldFRleHQgPSBmdW5jdGlvbiAodmFsdWUsIGtleSkge1xuICAgICAgICB2YXIgZm9ybWF0dGVyID0gdGhpcy5mb3JtYXR0ZXI7XG4gICAgICAgIHZhciByZXMgPSBmb3JtYXR0ZXIgPyBmb3JtYXR0ZXIodmFsdWUsIGtleSkgOiB2YWx1ZTtcbiAgICAgICAgaWYgKGlzTmlsKHJlcykgfHwgIWlzRnVuY3Rpb24ocmVzLnRvU3RyaW5nKSkge1xuICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXMudG9TdHJpbmcoKTtcbiAgICB9O1xuICAgIC8vIOiOt+WPlumFjee9rumhueS4reeahOWAvO+8jOW9k+WJjSBzY2FsZSDkuIrnmoTlgLzlj6/og73kvJrooqvkv67mlLlcbiAgICBTY2FsZS5wcm90b3R5cGUuZ2V0Q29uZmlnID0gZnVuY3Rpb24gKGtleSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fX2NmZ19fW2tleV07XG4gICAgfTtcbiAgICAvLyBzY2FsZeWIneWni+WMllxuICAgIFNjYWxlLnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBhc3NpZ24odGhpcywgdGhpcy5fX2NmZ19fKTtcbiAgICAgICAgdGhpcy5zZXREb21haW4oKTtcbiAgICAgICAgaWYgKGlzRW1wdHkodGhpcy5nZXRDb25maWcoJ3RpY2tzJykpKSB7XG4gICAgICAgICAgICB0aGlzLnRpY2tzID0gdGhpcy5jYWxjdWxhdGVUaWNrcygpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvLyDlrZDnsbvkuIropobnm5bmn5DkupvlsZ7mgKfvvIzkuI3og73nm7TmjqXlnKjnsbvkuIrlo7DmmI7vvIzlkKbliJnkvJrooqvopobnm5ZcbiAgICBTY2FsZS5wcm90b3R5cGUuaW5pdENmZyA9IGZ1bmN0aW9uICgpIHsgfTtcbiAgICBTY2FsZS5wcm90b3R5cGUuc2V0RG9tYWluID0gZnVuY3Rpb24gKCkgeyB9O1xuICAgIFNjYWxlLnByb3RvdHlwZS5jYWxjdWxhdGVUaWNrcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHRpY2tNZXRob2QgPSB0aGlzLnRpY2tNZXRob2Q7XG4gICAgICAgIHZhciB0aWNrcyA9IFtdO1xuICAgICAgICBpZiAoaXNTdHJpbmcodGlja01ldGhvZCkpIHtcbiAgICAgICAgICAgIHZhciBtZXRob2QgPSBnZXRUaWNrTWV0aG9kKHRpY2tNZXRob2QpO1xuICAgICAgICAgICAgaWYgKCFtZXRob2QpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZXJlIGlzIG5vIG1ldGhvZCB0byB0byBjYWxjdWxhdGUgdGlja3MhJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aWNrcyA9IG1ldGhvZCh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc0Z1bmN0aW9uKHRpY2tNZXRob2QpKSB7XG4gICAgICAgICAgICB0aWNrcyA9IHRpY2tNZXRob2QodGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRpY2tzO1xuICAgIH07XG4gICAgLy8gcmFuZ2Ug55qE5pyA5bCP5YC8XG4gICAgU2NhbGUucHJvdG90eXBlLnJhbmdlTWluID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yYW5nZVswXTtcbiAgICB9O1xuICAgIC8vIHJhbmdlIOeahOacgOWkp+WAvFxuICAgIFNjYWxlLnByb3RvdHlwZS5yYW5nZU1heCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmFuZ2VbMV07XG4gICAgfTtcbiAgICAvKiog5a6a5LmJ5Z+f6L2sIDB+MSAqL1xuICAgIFNjYWxlLnByb3RvdHlwZS5jYWxjUGVyY2VudCA9IGZ1bmN0aW9uICh2YWx1ZSwgbWluLCBtYXgpIHtcbiAgICAgICAgaWYgKGlzTnVtYmVyKHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuICh2YWx1ZSAtIG1pbikgLyAobWF4IC0gbWluKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gTmFOO1xuICAgIH07XG4gICAgLyoqIDB+Mei9rOWumuS5ieWfnyAqL1xuICAgIFNjYWxlLnByb3RvdHlwZS5jYWxjVmFsdWUgPSBmdW5jdGlvbiAocGVyY2VudCwgbWluLCBtYXgpIHtcbiAgICAgICAgcmV0dXJuIG1pbiArIHBlcmNlbnQgKiAobWF4IC0gbWluKTtcbiAgICB9O1xuICAgIHJldHVybiBTY2FsZTtcbn0oKSk7XG5leHBvcnQgZGVmYXVsdCBTY2FsZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJhc2UuanMubWFwIiwiaW1wb3J0IHsgX19leHRlbmRzLCBfX3NwcmVhZEFycmF5IH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBpc05pbCwgaXNOdW1iZXIgfSBmcm9tICdAYW50di91dGlsJztcbmltcG9ydCBCYXNlIGZyb20gJy4uL2Jhc2UnO1xuLyoqXG4gKiDliIbnsbvluqbph49cbiAqIEBjbGFzc1xuICovXG52YXIgQ2F0ZWdvcnkgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKENhdGVnb3J5LCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIENhdGVnb3J5KCkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMudHlwZSA9ICdjYXQnO1xuICAgICAgICBfdGhpcy5pc0NhdGVnb3J5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBDYXRlZ29yeS5wcm90b3R5cGUuYnVpbGRJbmRleE1hcCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnRyYW5zbGF0ZUluZGV4TWFwKSB7XG4gICAgICAgICAgICB0aGlzLnRyYW5zbGF0ZUluZGV4TWFwID0gbmV3IE1hcCgpO1xuICAgICAgICAgICAgLy8g6YeN5paw5p6E5bu657yT5a2YXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMudmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50cmFuc2xhdGVJbmRleE1hcC5zZXQodGhpcy52YWx1ZXNbaV0sIGkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBDYXRlZ29yeS5wcm90b3R5cGUudHJhbnNsYXRlID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIC8vIOaMiemcgOaehOW7uiBtYXBcbiAgICAgICAgdGhpcy5idWlsZEluZGV4TWFwKCk7XG4gICAgICAgIC8vIOaJvuW+l+WIsFxuICAgICAgICB2YXIgaWR4ID0gdGhpcy50cmFuc2xhdGVJbmRleE1hcC5nZXQodmFsdWUpO1xuICAgICAgICBpZiAoaWR4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGlkeCA9IGlzTnVtYmVyKHZhbHVlKSA/IHZhbHVlIDogTmFOO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpZHg7XG4gICAgfTtcbiAgICBDYXRlZ29yeS5wcm90b3R5cGUuc2NhbGUgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdmFyIG9yZGVyID0gdGhpcy50cmFuc2xhdGUodmFsdWUpO1xuICAgICAgICAvLyDliIbnsbvmlbDmja7lhYHorrggMC41IOiMg+WbtOWGheiwg+aVtFxuICAgICAgICAvLyBpZiAob3JkZXIgPCB0aGlzLm1pbiAtIDAuNSB8fCBvcmRlciA+IHRoaXMubWF4ICsgMC41KSB7XG4gICAgICAgIC8vICAgcmV0dXJuIE5hTjtcbiAgICAgICAgLy8gfVxuICAgICAgICB2YXIgcGVyY2VudCA9IHRoaXMuY2FsY1BlcmNlbnQob3JkZXIsIHRoaXMubWluLCB0aGlzLm1heCk7XG4gICAgICAgIHJldHVybiB0aGlzLmNhbGNWYWx1ZShwZXJjZW50LCB0aGlzLnJhbmdlTWluKCksIHRoaXMucmFuZ2VNYXgoKSk7XG4gICAgfTtcbiAgICBDYXRlZ29yeS5wcm90b3R5cGUuaW52ZXJ0ID0gZnVuY3Rpb24gKHNjYWxlZFZhbHVlKSB7XG4gICAgICAgIHZhciBkb21haW5SYW5nZSA9IHRoaXMubWF4IC0gdGhpcy5taW47XG4gICAgICAgIHZhciBwZXJjZW50ID0gdGhpcy5jYWxjUGVyY2VudChzY2FsZWRWYWx1ZSwgdGhpcy5yYW5nZU1pbigpLCB0aGlzLnJhbmdlTWF4KCkpO1xuICAgICAgICB2YXIgaWR4ID0gTWF0aC5yb3VuZChkb21haW5SYW5nZSAqIHBlcmNlbnQpICsgdGhpcy5taW47XG4gICAgICAgIGlmIChpZHggPCB0aGlzLm1pbiB8fCBpZHggPiB0aGlzLm1heCkge1xuICAgICAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZXNbaWR4XTtcbiAgICB9O1xuICAgIENhdGVnb3J5LnByb3RvdHlwZS5nZXRUZXh0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHZhciBhcmdzID0gW107XG4gICAgICAgIGZvciAodmFyIF9pID0gMTsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICBhcmdzW19pIC0gMV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICB9XG4gICAgICAgIHZhciB2ID0gdmFsdWU7XG4gICAgICAgIC8vIHZhbHVl5Li6aW5kZXhcbiAgICAgICAgaWYgKGlzTnVtYmVyKHZhbHVlKSAmJiAhdGhpcy52YWx1ZXMuaW5jbHVkZXModmFsdWUpKSB7XG4gICAgICAgICAgICB2ID0gdGhpcy52YWx1ZXNbdl07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9zdXBlci5wcm90b3R5cGUuZ2V0VGV4dC5hcHBseSh0aGlzLCBfX3NwcmVhZEFycmF5KFt2XSwgYXJncywgZmFsc2UpKTtcbiAgICB9O1xuICAgIC8vIOWkjeWGmeWxnuaAp1xuICAgIENhdGVnb3J5LnByb3RvdHlwZS5pbml0Q2ZnID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnRpY2tNZXRob2QgPSAnY2F0JztcbiAgICB9O1xuICAgIC8vIOiuvue9riBtaW4sIG1heFxuICAgIENhdGVnb3J5LnByb3RvdHlwZS5zZXREb21haW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIOeUqOaIt+acieWPr+iDveiuvue9riBtaW5cbiAgICAgICAgaWYgKGlzTmlsKHRoaXMuZ2V0Q29uZmlnKCdtaW4nKSkpIHtcbiAgICAgICAgICAgIHRoaXMubWluID0gMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNOaWwodGhpcy5nZXRDb25maWcoJ21heCcpKSkge1xuICAgICAgICAgICAgdmFyIHNpemUgPSB0aGlzLnZhbHVlcy5sZW5ndGg7XG4gICAgICAgICAgICB0aGlzLm1heCA9IHNpemUgPiAxID8gc2l6ZSAtIDEgOiBzaXplO1xuICAgICAgICB9XG4gICAgICAgIC8vIHNjYWxlLmluaXQg55qE5pe25YCZ5riF6Zmk57yT5a2YXG4gICAgICAgIGlmICh0aGlzLnRyYW5zbGF0ZUluZGV4TWFwKSB7XG4gICAgICAgICAgICB0aGlzLnRyYW5zbGF0ZUluZGV4TWFwID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gQ2F0ZWdvcnk7XG59KEJhc2UpKTtcbmV4cG9ydCBkZWZhdWx0IENhdGVnb3J5O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YmFzZS5qcy5tYXAiLCJ2YXIgdG9rZW4gPSAvZHsxLDR9fE17MSw0fXxZWSg/OllZKT98U3sxLDN9fERvfFpafFp8KFtIaE1zRG1dKVxcMT98W2FBXXxcIlteXCJdKlwifCdbXiddKicvZztcbnZhciB0d29EaWdpdHNPcHRpb25hbCA9IFwiWzEtOV1cXFxcZD9cIjtcbnZhciB0d29EaWdpdHMgPSBcIlxcXFxkXFxcXGRcIjtcbnZhciB0aHJlZURpZ2l0cyA9IFwiXFxcXGR7M31cIjtcbnZhciBmb3VyRGlnaXRzID0gXCJcXFxcZHs0fVwiO1xudmFyIHdvcmQgPSBcIlteXFxcXHNdK1wiO1xudmFyIGxpdGVyYWwgPSAvXFxbKFteXSo/KVxcXS9nbTtcbmZ1bmN0aW9uIHNob3J0ZW4oYXJyLCBzTGVuKSB7XG4gICAgdmFyIG5ld0FyciA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBhcnIubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgbmV3QXJyLnB1c2goYXJyW2ldLnN1YnN0cigwLCBzTGVuKSk7XG4gICAgfVxuICAgIHJldHVybiBuZXdBcnI7XG59XG52YXIgbW9udGhVcGRhdGUgPSBmdW5jdGlvbiAoYXJyTmFtZSkgeyByZXR1cm4gZnVuY3Rpb24gKHYsIGkxOG4pIHtcbiAgICB2YXIgbG93ZXJDYXNlQXJyID0gaTE4blthcnJOYW1lXS5tYXAoZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHYudG9Mb3dlckNhc2UoKTsgfSk7XG4gICAgdmFyIGluZGV4ID0gbG93ZXJDYXNlQXJyLmluZGV4T2Yodi50b0xvd2VyQ2FzZSgpKTtcbiAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufTsgfTtcbmZ1bmN0aW9uIGFzc2lnbihvcmlnT2JqKSB7XG4gICAgdmFyIGFyZ3MgPSBbXTtcbiAgICBmb3IgKHZhciBfaSA9IDE7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICBhcmdzW19pIC0gMV0gPSBhcmd1bWVudHNbX2ldO1xuICAgIH1cbiAgICBmb3IgKHZhciBfYSA9IDAsIGFyZ3NfMSA9IGFyZ3M7IF9hIDwgYXJnc18xLmxlbmd0aDsgX2ErKykge1xuICAgICAgICB2YXIgb2JqID0gYXJnc18xW19hXTtcbiAgICAgICAgZm9yICh2YXIga2V5IGluIG9iaikge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZSBleFxuICAgICAgICAgICAgb3JpZ09ialtrZXldID0gb2JqW2tleV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG9yaWdPYmo7XG59XG52YXIgZGF5TmFtZXMgPSBbXG4gICAgXCJTdW5kYXlcIixcbiAgICBcIk1vbmRheVwiLFxuICAgIFwiVHVlc2RheVwiLFxuICAgIFwiV2VkbmVzZGF5XCIsXG4gICAgXCJUaHVyc2RheVwiLFxuICAgIFwiRnJpZGF5XCIsXG4gICAgXCJTYXR1cmRheVwiXG5dO1xudmFyIG1vbnRoTmFtZXMgPSBbXG4gICAgXCJKYW51YXJ5XCIsXG4gICAgXCJGZWJydWFyeVwiLFxuICAgIFwiTWFyY2hcIixcbiAgICBcIkFwcmlsXCIsXG4gICAgXCJNYXlcIixcbiAgICBcIkp1bmVcIixcbiAgICBcIkp1bHlcIixcbiAgICBcIkF1Z3VzdFwiLFxuICAgIFwiU2VwdGVtYmVyXCIsXG4gICAgXCJPY3RvYmVyXCIsXG4gICAgXCJOb3ZlbWJlclwiLFxuICAgIFwiRGVjZW1iZXJcIlxuXTtcbnZhciBtb250aE5hbWVzU2hvcnQgPSBzaG9ydGVuKG1vbnRoTmFtZXMsIDMpO1xudmFyIGRheU5hbWVzU2hvcnQgPSBzaG9ydGVuKGRheU5hbWVzLCAzKTtcbnZhciBkZWZhdWx0STE4biA9IHtcbiAgICBkYXlOYW1lc1Nob3J0OiBkYXlOYW1lc1Nob3J0LFxuICAgIGRheU5hbWVzOiBkYXlOYW1lcyxcbiAgICBtb250aE5hbWVzU2hvcnQ6IG1vbnRoTmFtZXNTaG9ydCxcbiAgICBtb250aE5hbWVzOiBtb250aE5hbWVzLFxuICAgIGFtUG06IFtcImFtXCIsIFwicG1cIl0sXG4gICAgRG9GbjogZnVuY3Rpb24gKGRheU9mTW9udGgpIHtcbiAgICAgICAgcmV0dXJuIChkYXlPZk1vbnRoICtcbiAgICAgICAgICAgIFtcInRoXCIsIFwic3RcIiwgXCJuZFwiLCBcInJkXCJdW2RheU9mTW9udGggJSAxMCA+IDNcbiAgICAgICAgICAgICAgICA/IDBcbiAgICAgICAgICAgICAgICA6ICgoZGF5T2ZNb250aCAtIChkYXlPZk1vbnRoICUgMTApICE9PSAxMCA/IDEgOiAwKSAqIGRheU9mTW9udGgpICUgMTBdKTtcbiAgICB9XG59O1xudmFyIGdsb2JhbEkxOG4gPSBhc3NpZ24oe30sIGRlZmF1bHRJMThuKTtcbnZhciBzZXRHbG9iYWxEYXRlSTE4biA9IGZ1bmN0aW9uIChpMThuKSB7XG4gICAgcmV0dXJuIChnbG9iYWxJMThuID0gYXNzaWduKGdsb2JhbEkxOG4sIGkxOG4pKTtcbn07XG52YXIgcmVnZXhFc2NhcGUgPSBmdW5jdGlvbiAoc3RyKSB7XG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKC9bfFxcXFx7KClbXiQrKj8uLV0vZywgXCJcXFxcJCZcIik7XG59O1xudmFyIHBhZCA9IGZ1bmN0aW9uICh2YWwsIGxlbikge1xuICAgIGlmIChsZW4gPT09IHZvaWQgMCkgeyBsZW4gPSAyOyB9XG4gICAgdmFsID0gU3RyaW5nKHZhbCk7XG4gICAgd2hpbGUgKHZhbC5sZW5ndGggPCBsZW4pIHtcbiAgICAgICAgdmFsID0gXCIwXCIgKyB2YWw7XG4gICAgfVxuICAgIHJldHVybiB2YWw7XG59O1xudmFyIGZvcm1hdEZsYWdzID0ge1xuICAgIEQ6IGZ1bmN0aW9uIChkYXRlT2JqKSB7IHJldHVybiBTdHJpbmcoZGF0ZU9iai5nZXREYXRlKCkpOyB9LFxuICAgIEREOiBmdW5jdGlvbiAoZGF0ZU9iaikgeyByZXR1cm4gcGFkKGRhdGVPYmouZ2V0RGF0ZSgpKTsgfSxcbiAgICBEbzogZnVuY3Rpb24gKGRhdGVPYmosIGkxOG4pIHtcbiAgICAgICAgcmV0dXJuIGkxOG4uRG9GbihkYXRlT2JqLmdldERhdGUoKSk7XG4gICAgfSxcbiAgICBkOiBmdW5jdGlvbiAoZGF0ZU9iaikgeyByZXR1cm4gU3RyaW5nKGRhdGVPYmouZ2V0RGF5KCkpOyB9LFxuICAgIGRkOiBmdW5jdGlvbiAoZGF0ZU9iaikgeyByZXR1cm4gcGFkKGRhdGVPYmouZ2V0RGF5KCkpOyB9LFxuICAgIGRkZDogZnVuY3Rpb24gKGRhdGVPYmosIGkxOG4pIHtcbiAgICAgICAgcmV0dXJuIGkxOG4uZGF5TmFtZXNTaG9ydFtkYXRlT2JqLmdldERheSgpXTtcbiAgICB9LFxuICAgIGRkZGQ6IGZ1bmN0aW9uIChkYXRlT2JqLCBpMThuKSB7XG4gICAgICAgIHJldHVybiBpMThuLmRheU5hbWVzW2RhdGVPYmouZ2V0RGF5KCldO1xuICAgIH0sXG4gICAgTTogZnVuY3Rpb24gKGRhdGVPYmopIHsgcmV0dXJuIFN0cmluZyhkYXRlT2JqLmdldE1vbnRoKCkgKyAxKTsgfSxcbiAgICBNTTogZnVuY3Rpb24gKGRhdGVPYmopIHsgcmV0dXJuIHBhZChkYXRlT2JqLmdldE1vbnRoKCkgKyAxKTsgfSxcbiAgICBNTU06IGZ1bmN0aW9uIChkYXRlT2JqLCBpMThuKSB7XG4gICAgICAgIHJldHVybiBpMThuLm1vbnRoTmFtZXNTaG9ydFtkYXRlT2JqLmdldE1vbnRoKCldO1xuICAgIH0sXG4gICAgTU1NTTogZnVuY3Rpb24gKGRhdGVPYmosIGkxOG4pIHtcbiAgICAgICAgcmV0dXJuIGkxOG4ubW9udGhOYW1lc1tkYXRlT2JqLmdldE1vbnRoKCldO1xuICAgIH0sXG4gICAgWVk6IGZ1bmN0aW9uIChkYXRlT2JqKSB7XG4gICAgICAgIHJldHVybiBwYWQoU3RyaW5nKGRhdGVPYmouZ2V0RnVsbFllYXIoKSksIDQpLnN1YnN0cigyKTtcbiAgICB9LFxuICAgIFlZWVk6IGZ1bmN0aW9uIChkYXRlT2JqKSB7IHJldHVybiBwYWQoZGF0ZU9iai5nZXRGdWxsWWVhcigpLCA0KTsgfSxcbiAgICBoOiBmdW5jdGlvbiAoZGF0ZU9iaikgeyByZXR1cm4gU3RyaW5nKGRhdGVPYmouZ2V0SG91cnMoKSAlIDEyIHx8IDEyKTsgfSxcbiAgICBoaDogZnVuY3Rpb24gKGRhdGVPYmopIHsgcmV0dXJuIHBhZChkYXRlT2JqLmdldEhvdXJzKCkgJSAxMiB8fCAxMik7IH0sXG4gICAgSDogZnVuY3Rpb24gKGRhdGVPYmopIHsgcmV0dXJuIFN0cmluZyhkYXRlT2JqLmdldEhvdXJzKCkpOyB9LFxuICAgIEhIOiBmdW5jdGlvbiAoZGF0ZU9iaikgeyByZXR1cm4gcGFkKGRhdGVPYmouZ2V0SG91cnMoKSk7IH0sXG4gICAgbTogZnVuY3Rpb24gKGRhdGVPYmopIHsgcmV0dXJuIFN0cmluZyhkYXRlT2JqLmdldE1pbnV0ZXMoKSk7IH0sXG4gICAgbW06IGZ1bmN0aW9uIChkYXRlT2JqKSB7IHJldHVybiBwYWQoZGF0ZU9iai5nZXRNaW51dGVzKCkpOyB9LFxuICAgIHM6IGZ1bmN0aW9uIChkYXRlT2JqKSB7IHJldHVybiBTdHJpbmcoZGF0ZU9iai5nZXRTZWNvbmRzKCkpOyB9LFxuICAgIHNzOiBmdW5jdGlvbiAoZGF0ZU9iaikgeyByZXR1cm4gcGFkKGRhdGVPYmouZ2V0U2Vjb25kcygpKTsgfSxcbiAgICBTOiBmdW5jdGlvbiAoZGF0ZU9iaikge1xuICAgICAgICByZXR1cm4gU3RyaW5nKE1hdGgucm91bmQoZGF0ZU9iai5nZXRNaWxsaXNlY29uZHMoKSAvIDEwMCkpO1xuICAgIH0sXG4gICAgU1M6IGZ1bmN0aW9uIChkYXRlT2JqKSB7XG4gICAgICAgIHJldHVybiBwYWQoTWF0aC5yb3VuZChkYXRlT2JqLmdldE1pbGxpc2Vjb25kcygpIC8gMTApLCAyKTtcbiAgICB9LFxuICAgIFNTUzogZnVuY3Rpb24gKGRhdGVPYmopIHsgcmV0dXJuIHBhZChkYXRlT2JqLmdldE1pbGxpc2Vjb25kcygpLCAzKTsgfSxcbiAgICBhOiBmdW5jdGlvbiAoZGF0ZU9iaiwgaTE4bikge1xuICAgICAgICByZXR1cm4gZGF0ZU9iai5nZXRIb3VycygpIDwgMTIgPyBpMThuLmFtUG1bMF0gOiBpMThuLmFtUG1bMV07XG4gICAgfSxcbiAgICBBOiBmdW5jdGlvbiAoZGF0ZU9iaiwgaTE4bikge1xuICAgICAgICByZXR1cm4gZGF0ZU9iai5nZXRIb3VycygpIDwgMTJcbiAgICAgICAgICAgID8gaTE4bi5hbVBtWzBdLnRvVXBwZXJDYXNlKClcbiAgICAgICAgICAgIDogaTE4bi5hbVBtWzFdLnRvVXBwZXJDYXNlKCk7XG4gICAgfSxcbiAgICBaWjogZnVuY3Rpb24gKGRhdGVPYmopIHtcbiAgICAgICAgdmFyIG9mZnNldCA9IGRhdGVPYmouZ2V0VGltZXpvbmVPZmZzZXQoKTtcbiAgICAgICAgcmV0dXJuICgob2Zmc2V0ID4gMCA/IFwiLVwiIDogXCIrXCIpICtcbiAgICAgICAgICAgIHBhZChNYXRoLmZsb29yKE1hdGguYWJzKG9mZnNldCkgLyA2MCkgKiAxMDAgKyAoTWF0aC5hYnMob2Zmc2V0KSAlIDYwKSwgNCkpO1xuICAgIH0sXG4gICAgWjogZnVuY3Rpb24gKGRhdGVPYmopIHtcbiAgICAgICAgdmFyIG9mZnNldCA9IGRhdGVPYmouZ2V0VGltZXpvbmVPZmZzZXQoKTtcbiAgICAgICAgcmV0dXJuICgob2Zmc2V0ID4gMCA/IFwiLVwiIDogXCIrXCIpICtcbiAgICAgICAgICAgIHBhZChNYXRoLmZsb29yKE1hdGguYWJzKG9mZnNldCkgLyA2MCksIDIpICtcbiAgICAgICAgICAgIFwiOlwiICtcbiAgICAgICAgICAgIHBhZChNYXRoLmFicyhvZmZzZXQpICUgNjAsIDIpKTtcbiAgICB9XG59O1xudmFyIG1vbnRoUGFyc2UgPSBmdW5jdGlvbiAodikgeyByZXR1cm4gK3YgLSAxOyB9O1xudmFyIGVtcHR5RGlnaXRzID0gW251bGwsIHR3b0RpZ2l0c09wdGlvbmFsXTtcbnZhciBlbXB0eVdvcmQgPSBbbnVsbCwgd29yZF07XG52YXIgYW1QbSA9IFtcbiAgICBcImlzUG1cIixcbiAgICB3b3JkLFxuICAgIGZ1bmN0aW9uICh2LCBpMThuKSB7XG4gICAgICAgIHZhciB2YWwgPSB2LnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmICh2YWwgPT09IGkxOG4uYW1QbVswXSkge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodmFsID09PSBpMThuLmFtUG1bMV0pIHtcbiAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbl07XG52YXIgdGltZXpvbmVPZmZzZXQgPSBbXG4gICAgXCJ0aW1lem9uZU9mZnNldFwiLFxuICAgIFwiW15cXFxcc10qP1tcXFxcK1xcXFwtXVxcXFxkXFxcXGQ6P1xcXFxkXFxcXGR8W15cXFxcc10qP1o/XCIsXG4gICAgZnVuY3Rpb24gKHYpIHtcbiAgICAgICAgdmFyIHBhcnRzID0gKHYgKyBcIlwiKS5tYXRjaCgvKFsrLV18XFxkXFxkKS9naSk7XG4gICAgICAgIGlmIChwYXJ0cykge1xuICAgICAgICAgICAgdmFyIG1pbnV0ZXMgPSArcGFydHNbMV0gKiA2MCArIHBhcnNlSW50KHBhcnRzWzJdLCAxMCk7XG4gICAgICAgICAgICByZXR1cm4gcGFydHNbMF0gPT09IFwiK1wiID8gbWludXRlcyA6IC1taW51dGVzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbl07XG52YXIgcGFyc2VGbGFncyA9IHtcbiAgICBEOiBbXCJkYXlcIiwgdHdvRGlnaXRzT3B0aW9uYWxdLFxuICAgIEREOiBbXCJkYXlcIiwgdHdvRGlnaXRzXSxcbiAgICBEbzogW1wiZGF5XCIsIHR3b0RpZ2l0c09wdGlvbmFsICsgd29yZCwgZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHBhcnNlSW50KHYsIDEwKTsgfV0sXG4gICAgTTogW1wibW9udGhcIiwgdHdvRGlnaXRzT3B0aW9uYWwsIG1vbnRoUGFyc2VdLFxuICAgIE1NOiBbXCJtb250aFwiLCB0d29EaWdpdHMsIG1vbnRoUGFyc2VdLFxuICAgIFlZOiBbXG4gICAgICAgIFwieWVhclwiLFxuICAgICAgICB0d29EaWdpdHMsXG4gICAgICAgIGZ1bmN0aW9uICh2KSB7XG4gICAgICAgICAgICB2YXIgbm93ID0gbmV3IERhdGUoKTtcbiAgICAgICAgICAgIHZhciBjZW50ID0gKyhcIlwiICsgbm93LmdldEZ1bGxZZWFyKCkpLnN1YnN0cigwLCAyKTtcbiAgICAgICAgICAgIHJldHVybiArKFwiXCIgKyAoK3YgPiA2OCA/IGNlbnQgLSAxIDogY2VudCkgKyB2KTtcbiAgICAgICAgfVxuICAgIF0sXG4gICAgaDogW1wiaG91clwiLCB0d29EaWdpdHNPcHRpb25hbCwgdW5kZWZpbmVkLCBcImlzUG1cIl0sXG4gICAgaGg6IFtcImhvdXJcIiwgdHdvRGlnaXRzLCB1bmRlZmluZWQsIFwiaXNQbVwiXSxcbiAgICBIOiBbXCJob3VyXCIsIHR3b0RpZ2l0c09wdGlvbmFsXSxcbiAgICBISDogW1wiaG91clwiLCB0d29EaWdpdHNdLFxuICAgIG06IFtcIm1pbnV0ZVwiLCB0d29EaWdpdHNPcHRpb25hbF0sXG4gICAgbW06IFtcIm1pbnV0ZVwiLCB0d29EaWdpdHNdLFxuICAgIHM6IFtcInNlY29uZFwiLCB0d29EaWdpdHNPcHRpb25hbF0sXG4gICAgc3M6IFtcInNlY29uZFwiLCB0d29EaWdpdHNdLFxuICAgIFlZWVk6IFtcInllYXJcIiwgZm91ckRpZ2l0c10sXG4gICAgUzogW1wibWlsbGlzZWNvbmRcIiwgXCJcXFxcZFwiLCBmdW5jdGlvbiAodikgeyByZXR1cm4gK3YgKiAxMDA7IH1dLFxuICAgIFNTOiBbXCJtaWxsaXNlY29uZFwiLCB0d29EaWdpdHMsIGZ1bmN0aW9uICh2KSB7IHJldHVybiArdiAqIDEwOyB9XSxcbiAgICBTU1M6IFtcIm1pbGxpc2Vjb25kXCIsIHRocmVlRGlnaXRzXSxcbiAgICBkOiBlbXB0eURpZ2l0cyxcbiAgICBkZDogZW1wdHlEaWdpdHMsXG4gICAgZGRkOiBlbXB0eVdvcmQsXG4gICAgZGRkZDogZW1wdHlXb3JkLFxuICAgIE1NTTogW1wibW9udGhcIiwgd29yZCwgbW9udGhVcGRhdGUoXCJtb250aE5hbWVzU2hvcnRcIildLFxuICAgIE1NTU06IFtcIm1vbnRoXCIsIHdvcmQsIG1vbnRoVXBkYXRlKFwibW9udGhOYW1lc1wiKV0sXG4gICAgYTogYW1QbSxcbiAgICBBOiBhbVBtLFxuICAgIFpaOiB0aW1lem9uZU9mZnNldCxcbiAgICBaOiB0aW1lem9uZU9mZnNldFxufTtcbi8vIFNvbWUgY29tbW9uIGZvcm1hdCBzdHJpbmdzXG52YXIgZ2xvYmFsTWFza3MgPSB7XG4gICAgZGVmYXVsdDogXCJkZGQgTU1NIEREIFlZWVkgSEg6bW06c3NcIixcbiAgICBzaG9ydERhdGU6IFwiTS9EL1lZXCIsXG4gICAgbWVkaXVtRGF0ZTogXCJNTU0gRCwgWVlZWVwiLFxuICAgIGxvbmdEYXRlOiBcIk1NTU0gRCwgWVlZWVwiLFxuICAgIGZ1bGxEYXRlOiBcImRkZGQsIE1NTU0gRCwgWVlZWVwiLFxuICAgIGlzb0RhdGU6IFwiWVlZWS1NTS1ERFwiLFxuICAgIGlzb0RhdGVUaW1lOiBcIllZWVktTU0tRERUSEg6bW06c3NaXCIsXG4gICAgc2hvcnRUaW1lOiBcIkhIOm1tXCIsXG4gICAgbWVkaXVtVGltZTogXCJISDptbTpzc1wiLFxuICAgIGxvbmdUaW1lOiBcIkhIOm1tOnNzLlNTU1wiXG59O1xudmFyIHNldEdsb2JhbERhdGVNYXNrcyA9IGZ1bmN0aW9uIChtYXNrcykgeyByZXR1cm4gYXNzaWduKGdsb2JhbE1hc2tzLCBtYXNrcyk7IH07XG4vKioqXG4gKiBGb3JtYXQgYSBkYXRlXG4gKiBAbWV0aG9kIGZvcm1hdFxuICogQHBhcmFtIHtEYXRlfG51bWJlcn0gZGF0ZU9ialxuICogQHBhcmFtIHtzdHJpbmd9IG1hc2sgRm9ybWF0IG9mIHRoZSBkYXRlLCBpLmUuICdtbS1kZC15eScgb3IgJ3Nob3J0RGF0ZSdcbiAqIEByZXR1cm5zIHtzdHJpbmd9IEZvcm1hdHRlZCBkYXRlIHN0cmluZ1xuICovXG52YXIgZm9ybWF0ID0gZnVuY3Rpb24gKGRhdGVPYmosIG1hc2ssIGkxOG4pIHtcbiAgICBpZiAobWFzayA9PT0gdm9pZCAwKSB7IG1hc2sgPSBnbG9iYWxNYXNrc1tcImRlZmF1bHRcIl07IH1cbiAgICBpZiAoaTE4biA9PT0gdm9pZCAwKSB7IGkxOG4gPSB7fTsgfVxuICAgIGlmICh0eXBlb2YgZGF0ZU9iaiA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICBkYXRlT2JqID0gbmV3IERhdGUoZGF0ZU9iaik7XG4gICAgfVxuICAgIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZGF0ZU9iaikgIT09IFwiW29iamVjdCBEYXRlXVwiIHx8XG4gICAgICAgIGlzTmFOKGRhdGVPYmouZ2V0VGltZSgpKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIERhdGUgcGFzcyB0byBmb3JtYXRcIik7XG4gICAgfVxuICAgIG1hc2sgPSBnbG9iYWxNYXNrc1ttYXNrXSB8fCBtYXNrO1xuICAgIHZhciBsaXRlcmFscyA9IFtdO1xuICAgIC8vIE1ha2UgbGl0ZXJhbHMgaW5hY3RpdmUgYnkgcmVwbGFjaW5nIHRoZW0gd2l0aCBAQEBcbiAgICBtYXNrID0gbWFzay5yZXBsYWNlKGxpdGVyYWwsIGZ1bmN0aW9uICgkMCwgJDEpIHtcbiAgICAgICAgbGl0ZXJhbHMucHVzaCgkMSk7XG4gICAgICAgIHJldHVybiBcIkBAQFwiO1xuICAgIH0pO1xuICAgIHZhciBjb21iaW5lZEkxOG5TZXR0aW5ncyA9IGFzc2lnbihhc3NpZ24oe30sIGdsb2JhbEkxOG4pLCBpMThuKTtcbiAgICAvLyBBcHBseSBmb3JtYXR0aW5nIHJ1bGVzXG4gICAgbWFzayA9IG1hc2sucmVwbGFjZSh0b2tlbiwgZnVuY3Rpb24gKCQwKSB7XG4gICAgICAgIHJldHVybiBmb3JtYXRGbGFnc1skMF0oZGF0ZU9iaiwgY29tYmluZWRJMThuU2V0dGluZ3MpO1xuICAgIH0pO1xuICAgIC8vIElubGluZSBsaXRlcmFsIHZhbHVlcyBiYWNrIGludG8gdGhlIGZvcm1hdHRlZCB2YWx1ZVxuICAgIHJldHVybiBtYXNrLnJlcGxhY2UoL0BAQC9nLCBmdW5jdGlvbiAoKSB7IHJldHVybiBsaXRlcmFscy5zaGlmdCgpOyB9KTtcbn07XG4vKipcbiAqIFBhcnNlIGEgZGF0ZSBzdHJpbmcgaW50byBhIEphdmFzY3JpcHQgRGF0ZSBvYmplY3QgL1xuICogQG1ldGhvZCBwYXJzZVxuICogQHBhcmFtIHtzdHJpbmd9IGRhdGVTdHIgRGF0ZSBzdHJpbmdcbiAqIEBwYXJhbSB7c3RyaW5nfSBmb3JtYXQgRGF0ZSBwYXJzZSBmb3JtYXRcbiAqIEBwYXJhbSB7aTE4bn0gSTE4blNldHRpbmdzT3B0aW9uYWwgRnVsbCBvciBzdWJzZXQgb2YgSTE4TiBzZXR0aW5nc1xuICogQHJldHVybnMge0RhdGV8bnVsbH0gUmV0dXJucyBEYXRlIG9iamVjdC4gUmV0dXJucyBudWxsIHdoYXQgZGF0ZSBzdHJpbmcgaXMgaW52YWxpZCBvciBkb2Vzbid0IG1hdGNoIGZvcm1hdFxuICovXG5mdW5jdGlvbiBwYXJzZShkYXRlU3RyLCBmb3JtYXQsIGkxOG4pIHtcbiAgICBpZiAoaTE4biA9PT0gdm9pZCAwKSB7IGkxOG4gPSB7fTsgfVxuICAgIGlmICh0eXBlb2YgZm9ybWF0ICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgZm9ybWF0IGluIGZlY2hhIHBhcnNlXCIpO1xuICAgIH1cbiAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIGZvcm1hdCBpcyBhY3R1YWxseSBhIG1hc2tcbiAgICBmb3JtYXQgPSBnbG9iYWxNYXNrc1tmb3JtYXRdIHx8IGZvcm1hdDtcbiAgICAvLyBBdm9pZCByZWd1bGFyIGV4cHJlc3Npb24gZGVuaWFsIG9mIHNlcnZpY2UsIGZhaWwgZWFybHkgZm9yIHJlYWxseSBsb25nIHN0cmluZ3NcbiAgICAvLyBodHRwczovL3d3dy5vd2FzcC5vcmcvaW5kZXgucGhwL1JlZ3VsYXJfZXhwcmVzc2lvbl9EZW5pYWxfb2ZfU2VydmljZV8tX1JlRG9TXG4gICAgaWYgKGRhdGVTdHIubGVuZ3RoID4gMTAwMCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgLy8gRGVmYXVsdCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSB5ZWFyLlxuICAgIHZhciB0b2RheSA9IG5ldyBEYXRlKCk7XG4gICAgdmFyIGRhdGVJbmZvID0ge1xuICAgICAgICB5ZWFyOiB0b2RheS5nZXRGdWxsWWVhcigpLFxuICAgICAgICBtb250aDogMCxcbiAgICAgICAgZGF5OiAxLFxuICAgICAgICBob3VyOiAwLFxuICAgICAgICBtaW51dGU6IDAsXG4gICAgICAgIHNlY29uZDogMCxcbiAgICAgICAgbWlsbGlzZWNvbmQ6IDAsXG4gICAgICAgIGlzUG06IG51bGwsXG4gICAgICAgIHRpbWV6b25lT2Zmc2V0OiBudWxsXG4gICAgfTtcbiAgICB2YXIgcGFyc2VJbmZvID0gW107XG4gICAgdmFyIGxpdGVyYWxzID0gW107XG4gICAgLy8gUmVwbGFjZSBhbGwgdGhlIGxpdGVyYWxzIHdpdGggQEBALiBIb3BlZnVsbHkgYSBzdHJpbmcgdGhhdCB3b24ndCBleGlzdCBpbiB0aGUgZm9ybWF0XG4gICAgdmFyIG5ld0Zvcm1hdCA9IGZvcm1hdC5yZXBsYWNlKGxpdGVyYWwsIGZ1bmN0aW9uICgkMCwgJDEpIHtcbiAgICAgICAgbGl0ZXJhbHMucHVzaChyZWdleEVzY2FwZSgkMSkpO1xuICAgICAgICByZXR1cm4gXCJAQEBcIjtcbiAgICB9KTtcbiAgICB2YXIgc3BlY2lmaWVkRmllbGRzID0ge307XG4gICAgdmFyIHJlcXVpcmVkRmllbGRzID0ge307XG4gICAgLy8gQ2hhbmdlIGV2ZXJ5IHRva2VuIHRoYXQgd2UgZmluZCBpbnRvIHRoZSBjb3JyZWN0IHJlZ2V4XG4gICAgbmV3Rm9ybWF0ID0gcmVnZXhFc2NhcGUobmV3Rm9ybWF0KS5yZXBsYWNlKHRva2VuLCBmdW5jdGlvbiAoJDApIHtcbiAgICAgICAgdmFyIGluZm8gPSBwYXJzZUZsYWdzWyQwXTtcbiAgICAgICAgdmFyIGZpZWxkID0gaW5mb1swXSwgcmVnZXggPSBpbmZvWzFdLCByZXF1aXJlZEZpZWxkID0gaW5mb1szXTtcbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBlcnNvbiBoYXMgc3BlY2lmaWVkIHRoZSBzYW1lIGZpZWxkIHR3aWNlLiBUaGlzIHdpbGwgbGVhZCB0byBjb25mdXNpbmcgcmVzdWx0cy5cbiAgICAgICAgaWYgKHNwZWNpZmllZEZpZWxkc1tmaWVsZF0pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgZm9ybWF0LiBcIiArIGZpZWxkICsgXCIgc3BlY2lmaWVkIHR3aWNlIGluIGZvcm1hdFwiKTtcbiAgICAgICAgfVxuICAgICAgICBzcGVjaWZpZWRGaWVsZHNbZmllbGRdID0gdHJ1ZTtcbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlcmUgYXJlIGFueSByZXF1aXJlZCBmaWVsZHMuIEZvciBpbnN0YW5jZSwgMTIgaG91ciB0aW1lIHJlcXVpcmVzIEFNL1BNIHNwZWNpZmllZFxuICAgICAgICBpZiAocmVxdWlyZWRGaWVsZCkge1xuICAgICAgICAgICAgcmVxdWlyZWRGaWVsZHNbcmVxdWlyZWRGaWVsZF0gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHBhcnNlSW5mby5wdXNoKGluZm8pO1xuICAgICAgICByZXR1cm4gXCIoXCIgKyByZWdleCArIFwiKVwiO1xuICAgIH0pO1xuICAgIC8vIENoZWNrIGFsbCB0aGUgcmVxdWlyZWQgZmllbGRzIGFyZSBwcmVzZW50XG4gICAgT2JqZWN0LmtleXMocmVxdWlyZWRGaWVsZHMpLmZvckVhY2goZnVuY3Rpb24gKGZpZWxkKSB7XG4gICAgICAgIGlmICghc3BlY2lmaWVkRmllbGRzW2ZpZWxkXSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBmb3JtYXQuIFwiICsgZmllbGQgKyBcIiBpcyByZXF1aXJlZCBpbiBzcGVjaWZpZWQgZm9ybWF0XCIpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgLy8gQWRkIGJhY2sgYWxsIHRoZSBsaXRlcmFscyBhZnRlclxuICAgIG5ld0Zvcm1hdCA9IG5ld0Zvcm1hdC5yZXBsYWNlKC9AQEAvZywgZnVuY3Rpb24gKCkgeyByZXR1cm4gbGl0ZXJhbHMuc2hpZnQoKTsgfSk7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIGRhdGUgc3RyaW5nIG1hdGNoZXMgdGhlIGZvcm1hdC4gSWYgaXQgZG9lc24ndCByZXR1cm4gbnVsbFxuICAgIHZhciBtYXRjaGVzID0gZGF0ZVN0ci5tYXRjaChuZXcgUmVnRXhwKG5ld0Zvcm1hdCwgXCJpXCIpKTtcbiAgICBpZiAoIW1hdGNoZXMpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHZhciBjb21iaW5lZEkxOG5TZXR0aW5ncyA9IGFzc2lnbihhc3NpZ24oe30sIGdsb2JhbEkxOG4pLCBpMThuKTtcbiAgICAvLyBGb3IgZWFjaCBtYXRjaCwgY2FsbCB0aGUgcGFyc2VyIGZ1bmN0aW9uIGZvciB0aGF0IGRhdGUgcGFydFxuICAgIGZvciAodmFyIGkgPSAxOyBpIDwgbWF0Y2hlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgX2EgPSBwYXJzZUluZm9baSAtIDFdLCBmaWVsZCA9IF9hWzBdLCBwYXJzZXIgPSBfYVsyXTtcbiAgICAgICAgdmFyIHZhbHVlID0gcGFyc2VyXG4gICAgICAgICAgICA/IHBhcnNlcihtYXRjaGVzW2ldLCBjb21iaW5lZEkxOG5TZXR0aW5ncylcbiAgICAgICAgICAgIDogK21hdGNoZXNbaV07XG4gICAgICAgIC8vIElmIHRoZSBwYXJzZXIgY2FuJ3QgbWFrZSBzZW5zZSBvZiB0aGUgdmFsdWUsIHJldHVybiBudWxsXG4gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBkYXRlSW5mb1tmaWVsZF0gPSB2YWx1ZTtcbiAgICB9XG4gICAgaWYgKGRhdGVJbmZvLmlzUG0gPT09IDEgJiYgZGF0ZUluZm8uaG91ciAhPSBudWxsICYmICtkYXRlSW5mby5ob3VyICE9PSAxMikge1xuICAgICAgICBkYXRlSW5mby5ob3VyID0gK2RhdGVJbmZvLmhvdXIgKyAxMjtcbiAgICB9XG4gICAgZWxzZSBpZiAoZGF0ZUluZm8uaXNQbSA9PT0gMCAmJiArZGF0ZUluZm8uaG91ciA9PT0gMTIpIHtcbiAgICAgICAgZGF0ZUluZm8uaG91ciA9IDA7XG4gICAgfVxuICAgIHZhciBkYXRlV2l0aG91dFRaID0gbmV3IERhdGUoZGF0ZUluZm8ueWVhciwgZGF0ZUluZm8ubW9udGgsIGRhdGVJbmZvLmRheSwgZGF0ZUluZm8uaG91ciwgZGF0ZUluZm8ubWludXRlLCBkYXRlSW5mby5zZWNvbmQsIGRhdGVJbmZvLm1pbGxpc2Vjb25kKTtcbiAgICB2YXIgdmFsaWRhdGVGaWVsZHMgPSBbXG4gICAgICAgIFtcIm1vbnRoXCIsIFwiZ2V0TW9udGhcIl0sXG4gICAgICAgIFtcImRheVwiLCBcImdldERhdGVcIl0sXG4gICAgICAgIFtcImhvdXJcIiwgXCJnZXRIb3Vyc1wiXSxcbiAgICAgICAgW1wibWludXRlXCIsIFwiZ2V0TWludXRlc1wiXSxcbiAgICAgICAgW1wic2Vjb25kXCIsIFwiZ2V0U2Vjb25kc1wiXVxuICAgIF07XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHZhbGlkYXRlRmllbGRzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgZGF0ZSBmaWVsZCBpcyB3aXRoaW4gdGhlIGFsbG93ZWQgcmFuZ2UuIEphdmFzY3JpcHQgZGF0ZXMgYWxsb3dzIHZhbHVlc1xuICAgICAgICAvLyBvdXRzaWRlIHRoZSBhbGxvd2VkIHJhbmdlLiBJZiB0aGUgdmFsdWVzIGRvbid0IG1hdGNoIHRoZSB2YWx1ZSB3YXMgaW52YWxpZFxuICAgICAgICBpZiAoc3BlY2lmaWVkRmllbGRzW3ZhbGlkYXRlRmllbGRzW2ldWzBdXSAmJlxuICAgICAgICAgICAgZGF0ZUluZm9bdmFsaWRhdGVGaWVsZHNbaV1bMF1dICE9PSBkYXRlV2l0aG91dFRaW3ZhbGlkYXRlRmllbGRzW2ldWzFdXSgpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoZGF0ZUluZm8udGltZXpvbmVPZmZzZXQgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gZGF0ZVdpdGhvdXRUWjtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBEYXRlKERhdGUuVVRDKGRhdGVJbmZvLnllYXIsIGRhdGVJbmZvLm1vbnRoLCBkYXRlSW5mby5kYXksIGRhdGVJbmZvLmhvdXIsIGRhdGVJbmZvLm1pbnV0ZSAtIGRhdGVJbmZvLnRpbWV6b25lT2Zmc2V0LCBkYXRlSW5mby5zZWNvbmQsIGRhdGVJbmZvLm1pbGxpc2Vjb25kKSk7XG59XG52YXIgZmVjaGEgPSB7XG4gICAgZm9ybWF0OiBmb3JtYXQsXG4gICAgcGFyc2U6IHBhcnNlLFxuICAgIGRlZmF1bHRJMThuOiBkZWZhdWx0STE4bixcbiAgICBzZXRHbG9iYWxEYXRlSTE4bjogc2V0R2xvYmFsRGF0ZUkxOG4sXG4gICAgc2V0R2xvYmFsRGF0ZU1hc2tzOiBzZXRHbG9iYWxEYXRlTWFza3Ncbn07XG5cbmV4cG9ydCBkZWZhdWx0IGZlY2hhO1xuZXhwb3J0IHsgYXNzaWduLCBmb3JtYXQsIHBhcnNlLCBkZWZhdWx0STE4biwgc2V0R2xvYmFsRGF0ZUkxOG4sIHNldEdsb2JhbERhdGVNYXNrcyB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZmVjaGEuanMubWFwXG4iLCJpbXBvcnQgeyBpc05pbCB9IGZyb20gJ0BhbnR2L3V0aWwnO1xuLyoqXG4gKiDkuozliIblj7Pkvqfmn6Xmib5cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9kMy9kMy1hcnJheS9ibG9iL21hc3Rlci9zcmMvYmlzZWN0b3IuanNcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKGdldHRlcikge1xuICAgIC8qKlxuICAgICAqIHg6IOebruagh+WAvFxuICAgICAqIGxvOiDotbflp4vkvY3nva5cbiAgICAgKiBoaTog57uT5p2f5L2N572uXG4gICAgICovXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChhLCB4LCBfbG8sIF9oaSkge1xuICAgICAgICB2YXIgbG8gPSBpc05pbChfbG8pID8gMCA6IF9sbztcbiAgICAgICAgdmFyIGhpID0gaXNOaWwoX2hpKSA/IGEubGVuZ3RoIDogX2hpO1xuICAgICAgICB3aGlsZSAobG8gPCBoaSkge1xuICAgICAgICAgICAgdmFyIG1pZCA9IChsbyArIGhpKSA+Pj4gMTtcbiAgICAgICAgICAgIGlmIChnZXR0ZXIoYVttaWRdKSA+IHgpIHtcbiAgICAgICAgICAgICAgICBoaSA9IG1pZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxvID0gbWlkICsgMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbG87XG4gICAgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJpc2VjdG9yLmpzLm1hcCIsImltcG9ydCB7IGlzRGF0ZSwgaXNTdHJpbmcsIGxhc3QgfSBmcm9tICdAYW50di91dGlsJztcbmltcG9ydCBmZWNoYSBmcm9tICdmZWNoYSc7XG5pbXBvcnQgKiBhcyBmZWNoYTEgZnJvbSAnZmVjaGEnO1xuaW1wb3J0IGJpc2VjdG9yIGZyb20gJy4vYmlzZWN0b3InO1xudmFyIEZPUk1BVF9NRVRIT0QgPSAnZm9ybWF0JztcbmV4cG9ydCBmdW5jdGlvbiB0aW1lRm9ybWF0KHRpbWUsIG1hc2spIHtcbiAgICB2YXIgbWV0aG9kID0gZmVjaGExW0ZPUk1BVF9NRVRIT0RdIHx8IGZlY2hhW0ZPUk1BVF9NRVRIT0RdO1xuICAgIHJldHVybiBtZXRob2QodGltZSwgbWFzayk7XG59XG4vKipcbiAqIOi9rOaNouaIkOaXtumXtOaIs1xuICogQHBhcmFtIHZhbHVlIOaXtumXtOWAvFxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9UaW1lU3RhbXAodmFsdWUpIHtcbiAgICBpZiAoaXNTdHJpbmcodmFsdWUpKSB7XG4gICAgICAgIGlmICh2YWx1ZS5pbmRleE9mKCdUJykgPiAwKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IG5ldyBEYXRlKHZhbHVlKS5nZXRUaW1lKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBuZXcgRGF0ZSgnMjAxMC8wMS8xMCcpIOWSjCBuZXcgRGF0ZSgnMjAxMC0wMS0xMCcpIOeahOW3ruWIq+WcqOS6jjpcbiAgICAgICAgICAgIC8vIOWmguaenOS7heacieW5tOaciOaXpeaXtu+8jOWJjeiAheaYr+W4puacieaXtuWMuueahDogRnJpIEphbiAxMCAyMDIwIDAyOjQwOjEzIEdNVCswODAwICjkuK3lm73moIflh4bml7bpl7QpXG4gICAgICAgICAgICAvLyDlkI7ogIXkvJrmoLzlvI/ljJbmiJAgU3VuIEphbiAxMCAyMDEwIDA4OjAwOjAwIEdNVCswODAwICjkuK3lm73moIflh4bml7bpl7QpXG4gICAgICAgICAgICB2YWx1ZSA9IG5ldyBEYXRlKHZhbHVlLnJlcGxhY2UoLy0vZ2ksICcvJykpLmdldFRpbWUoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNEYXRlKHZhbHVlKSkge1xuICAgICAgICB2YWx1ZSA9IHZhbHVlLmdldFRpbWUoKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xufVxudmFyIFNFQ09ORCA9IDEwMDA7XG52YXIgTUlOVVRFID0gNjAgKiBTRUNPTkQ7XG52YXIgSE9VUiA9IDYwICogTUlOVVRFO1xudmFyIERBWSA9IDI0ICogSE9VUjtcbnZhciBNT05USCA9IERBWSAqIDMxO1xudmFyIFlFQVIgPSBEQVkgKiAzNjU7XG5leHBvcnQgeyBTRUNPTkQsIE1JTlVURSwgSE9VUiwgREFZLCBNT05USCwgWUVBUiB9O1xudmFyIGludGVydmFscyA9IFtcbiAgICBbJ0hIOm1tOnNzJywgU0VDT05EXSxcbiAgICBbJ0hIOm1tOnNzJywgU0VDT05EICogMTBdLFxuICAgIFsnSEg6bW06c3MnLCBTRUNPTkQgKiAzMF0sXG4gICAgWydISDptbScsIE1JTlVURV0sXG4gICAgWydISDptbScsIE1JTlVURSAqIDEwXSxcbiAgICBbJ0hIOm1tJywgTUlOVVRFICogMzBdLFxuICAgIFsnSEgnLCBIT1VSXSxcbiAgICBbJ0hIJywgSE9VUiAqIDZdLFxuICAgIFsnSEgnLCBIT1VSICogMTJdLFxuICAgIFsnWVlZWS1NTS1ERCcsIERBWV0sXG4gICAgWydZWVlZLU1NLUREJywgREFZICogNF0sXG4gICAgWydZWVlZLVdXJywgREFZICogN10sXG4gICAgWydZWVlZLU1NJywgTU9OVEhdLFxuICAgIFsnWVlZWS1NTScsIE1PTlRIICogNF0sXG4gICAgWydZWVlZLU1NJywgTU9OVEggKiA2XSxcbiAgICBbJ1lZWVknLCBEQVkgKiAzODBdLCAvLyDlgJ/pibRlY2hhcnRz77yM5L+d6K+B5q+P5Liq5ZGo5pyf57Sv5Yqg5pe25LiN5Lya56Kw5Yiw5oGw5ben5LiN5aSf55qE6Zeu6aKYXG5dO1xuZXhwb3J0IGZ1bmN0aW9uIGdldFRpY2tJbnRlcnZhbChtaW4sIG1heCwgdGlja0NvdW50KSB7XG4gICAgdmFyIHRhcmdldCA9IChtYXggLSBtaW4pIC8gdGlja0NvdW50O1xuICAgIHZhciBpZHggPSBiaXNlY3RvcihmdW5jdGlvbiAobykgeyByZXR1cm4gb1sxXTsgfSkoaW50ZXJ2YWxzLCB0YXJnZXQpIC0gMTtcbiAgICB2YXIgaW50ZXJ2YWwgPSBpbnRlcnZhbHNbaWR4XTtcbiAgICBpZiAoaWR4IDwgMCkge1xuICAgICAgICBpbnRlcnZhbCA9IGludGVydmFsc1swXTtcbiAgICB9XG4gICAgZWxzZSBpZiAoaWR4ID49IGludGVydmFscy5sZW5ndGgpIHtcbiAgICAgICAgaW50ZXJ2YWwgPSBsYXN0KGludGVydmFscyk7XG4gICAgfVxuICAgIHJldHVybiBpbnRlcnZhbDtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRpbWUuanMubWFwIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBlYWNoLCBpc051bWJlciB9IGZyb20gJ0BhbnR2L3V0aWwnO1xuaW1wb3J0IHsgdGltZUZvcm1hdCwgdG9UaW1lU3RhbXAgfSBmcm9tICcuLi91dGlsL3RpbWUnO1xuaW1wb3J0IENhdGVnb3J5IGZyb20gJy4vYmFzZSc7XG4vKipcbiAqIOaXtumXtOWIhuexu+W6pumHj1xuICogQGNsYXNzXG4gKi9cbnZhciBUaW1lQ2F0ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhUaW1lQ2F0LCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFRpbWVDYXQoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy50eXBlID0gJ3RpbWVDYXQnO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBvdmVycmlkZVxuICAgICAqL1xuICAgIFRpbWVDYXQucHJvdG90eXBlLnRyYW5zbGF0ZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB2YWx1ZSA9IHRvVGltZVN0YW1wKHZhbHVlKTtcbiAgICAgICAgdmFyIGluZGV4ID0gdGhpcy52YWx1ZXMuaW5kZXhPZih2YWx1ZSk7XG4gICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgIGlmIChpc051bWJlcih2YWx1ZSkgJiYgdmFsdWUgPCB0aGlzLnZhbHVlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBpbmRleCA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaW5kZXggPSBOYU47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH07XG4gICAgLyoqXG4gICAgICog55Sx5LqO5pe26Ze057G75Z6L5pWw5o2u6ZyA6KaB6L2s5o2i5LiA5LiL77yM5omA5Lul5aSN5YaZIGdldFRleHRcbiAgICAgKiBAb3ZlcnJpZGVcbiAgICAgKi9cbiAgICBUaW1lQ2F0LnByb3RvdHlwZS5nZXRUZXh0ID0gZnVuY3Rpb24gKHZhbHVlLCB0aWNrSW5kZXgpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gdGhpcy50cmFuc2xhdGUodmFsdWUpO1xuICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHRoaXMudmFsdWVzW2luZGV4XTtcbiAgICAgICAgICAgIHZhciBmb3JtYXR0ZXIgPSB0aGlzLmZvcm1hdHRlcjtcbiAgICAgICAgICAgIHJlc3VsdCA9IGZvcm1hdHRlciA/IGZvcm1hdHRlcihyZXN1bHQsIHRpY2tJbmRleCkgOiB0aW1lRm9ybWF0KHJlc3VsdCwgdGhpcy5tYXNrKTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH07XG4gICAgVGltZUNhdC5wcm90b3R5cGUuaW5pdENmZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy50aWNrTWV0aG9kID0gJ3RpbWUtY2F0JztcbiAgICAgICAgdGhpcy5tYXNrID0gJ1lZWVktTU0tREQnO1xuICAgICAgICB0aGlzLnRpY2tDb3VudCA9IDc7IC8vIOS4gOiIrOaXtumXtOaVsOaNruS8muaYvuekuiA377yMIDE077yMIDMwIOWkqeeahOaVsOWtl1xuICAgIH07XG4gICAgVGltZUNhdC5wcm90b3R5cGUuc2V0RG9tYWluID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdmFsdWVzID0gdGhpcy52YWx1ZXM7XG4gICAgICAgIC8vIOmSiOWvueaXtumXtOWIhuexu+exu+Wei++8jOS8muWwhuaXtumXtOe7n+S4gOi9rOaNouS4uuaXtumXtOaIs1xuICAgICAgICBlYWNoKHZhbHVlcywgZnVuY3Rpb24gKHYsIGkpIHtcbiAgICAgICAgICAgIHZhbHVlc1tpXSA9IHRvVGltZVN0YW1wKHYpO1xuICAgICAgICB9KTtcbiAgICAgICAgdmFsdWVzLnNvcnQoZnVuY3Rpb24gKHYxLCB2Mikge1xuICAgICAgICAgICAgcmV0dXJuIHYxIC0gdjI7XG4gICAgICAgIH0pO1xuICAgICAgICBfc3VwZXIucHJvdG90eXBlLnNldERvbWFpbi5jYWxsKHRoaXMpO1xuICAgIH07XG4gICAgcmV0dXJuIFRpbWVDYXQ7XG59KENhdGVnb3J5KSk7XG5leHBvcnQgZGVmYXVsdCBUaW1lQ2F0O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGltZS5qcy5tYXAiLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGZpbHRlciwgZ2V0UmFuZ2UsIGhlYWQsIGlzTmlsLCBsYXN0IH0gZnJvbSAnQGFudHYvdXRpbCc7XG5pbXBvcnQgQmFzZSBmcm9tICcuLi9iYXNlJztcbi8qKlxuICog6L+e57ut5bqm6YeP55qE5Z+657G7XG4gKiBAY2xhc3NcbiAqL1xudmFyIENvbnRpbnVvdXMgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKENvbnRpbnVvdXMsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gQ29udGludW91cygpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLmlzQ29udGludW91cyA9IHRydWU7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgQ29udGludW91cy5wcm90b3R5cGUuc2NhbGUgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgaWYgKGlzTmlsKHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcmFuZ2VNaW4gPSB0aGlzLnJhbmdlTWluKCk7XG4gICAgICAgIHZhciByYW5nZU1heCA9IHRoaXMucmFuZ2VNYXgoKTtcbiAgICAgICAgdmFyIG1heCA9IHRoaXMubWF4O1xuICAgICAgICB2YXIgbWluID0gdGhpcy5taW47XG4gICAgICAgIGlmIChtYXggPT09IG1pbikge1xuICAgICAgICAgICAgcmV0dXJuIHJhbmdlTWluO1xuICAgICAgICB9XG4gICAgICAgIHZhciBwZXJjZW50ID0gdGhpcy5nZXRTY2FsZVBlcmNlbnQodmFsdWUpO1xuICAgICAgICByZXR1cm4gcmFuZ2VNaW4gKyBwZXJjZW50ICogKHJhbmdlTWF4IC0gcmFuZ2VNaW4pO1xuICAgIH07XG4gICAgQ29udGludW91cy5wcm90b3R5cGUuaW5pdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgX3N1cGVyLnByb3RvdHlwZS5pbml0LmNhbGwodGhpcyk7XG4gICAgICAgIC8vIGluaXQg5a6M5oiQ5ZCO5L+d6K+BIG1pbiwgbWF4IOWMheWQqyB0aWNrcyDnmoTojIPlm7RcbiAgICAgICAgdmFyIHRpY2tzID0gdGhpcy50aWNrcztcbiAgICAgICAgdmFyIGZpcnN0VGljayA9IGhlYWQodGlja3MpO1xuICAgICAgICB2YXIgbGFzdFRpY2sgPSBsYXN0KHRpY2tzKTtcbiAgICAgICAgaWYgKGZpcnN0VGljayA8IHRoaXMubWluKSB7XG4gICAgICAgICAgICB0aGlzLm1pbiA9IGZpcnN0VGljaztcbiAgICAgICAgfVxuICAgICAgICBpZiAobGFzdFRpY2sgPiB0aGlzLm1heCkge1xuICAgICAgICAgICAgdGhpcy5tYXggPSBsYXN0VGljaztcbiAgICAgICAgfVxuICAgICAgICAvLyBzdHJpY3QtbGltaXQg5pa55byPXG4gICAgICAgIGlmICghaXNOaWwodGhpcy5taW5MaW1pdCkpIHtcbiAgICAgICAgICAgIHRoaXMubWluID0gZmlyc3RUaWNrO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNOaWwodGhpcy5tYXhMaW1pdCkpIHtcbiAgICAgICAgICAgIHRoaXMubWF4ID0gbGFzdFRpY2s7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIENvbnRpbnVvdXMucHJvdG90eXBlLnNldERvbWFpbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hID0gZ2V0UmFuZ2UodGhpcy52YWx1ZXMpLCBtaW4gPSBfYS5taW4sIG1heCA9IF9hLm1heDtcbiAgICAgICAgaWYgKGlzTmlsKHRoaXMubWluKSkge1xuICAgICAgICAgICAgdGhpcy5taW4gPSBtaW47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzTmlsKHRoaXMubWF4KSkge1xuICAgICAgICAgICAgdGhpcy5tYXggPSBtYXg7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubWluID4gdGhpcy5tYXgpIHtcbiAgICAgICAgICAgIHRoaXMubWluID0gbWluO1xuICAgICAgICAgICAgdGhpcy5tYXggPSBtYXg7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIENvbnRpbnVvdXMucHJvdG90eXBlLmNhbGN1bGF0ZVRpY2tzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgdGlja3MgPSBfc3VwZXIucHJvdG90eXBlLmNhbGN1bGF0ZVRpY2tzLmNhbGwodGhpcyk7XG4gICAgICAgIGlmICghdGhpcy5uaWNlKSB7XG4gICAgICAgICAgICB0aWNrcyA9IGZpbHRlcih0aWNrcywgZnVuY3Rpb24gKHRpY2spIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGljayA+PSBfdGhpcy5taW4gJiYgdGljayA8PSBfdGhpcy5tYXg7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGlja3M7XG4gICAgfTtcbiAgICAvLyDorqHnrpfljp/lp4vlgLzlgLzljaDnmoTnmb7liIbmr5RcbiAgICBDb250aW51b3VzLnByb3RvdHlwZS5nZXRTY2FsZVBlcmNlbnQgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdmFyIG1heCA9IHRoaXMubWF4O1xuICAgICAgICB2YXIgbWluID0gdGhpcy5taW47XG4gICAgICAgIHJldHVybiAodmFsdWUgLSBtaW4pIC8gKG1heCAtIG1pbik7XG4gICAgfTtcbiAgICBDb250aW51b3VzLnByb3RvdHlwZS5nZXRJbnZlcnRQZXJjZW50ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiAodmFsdWUgLSB0aGlzLnJhbmdlTWluKCkpIC8gKHRoaXMucmFuZ2VNYXgoKSAtIHRoaXMucmFuZ2VNaW4oKSk7XG4gICAgfTtcbiAgICByZXR1cm4gQ29udGludW91cztcbn0oQmFzZSkpO1xuZXhwb3J0IGRlZmF1bHQgQ29udGludW91cztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJhc2UuanMubWFwIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgQ29udGludW91cyBmcm9tICcuL2Jhc2UnO1xuLyoqXG4gKiDnur/mgKfluqbph49cbiAqIEBjbGFzc1xuICovXG52YXIgTGluZWFyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhMaW5lYXIsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gTGluZWFyKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMudHlwZSA9ICdsaW5lYXInO1xuICAgICAgICBfdGhpcy5pc0xpbmVhciA9IHRydWU7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgTGluZWFyLnByb3RvdHlwZS5pbnZlcnQgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdmFyIHBlcmNlbnQgPSB0aGlzLmdldEludmVydFBlcmNlbnQodmFsdWUpO1xuICAgICAgICByZXR1cm4gdGhpcy5taW4gKyBwZXJjZW50ICogKHRoaXMubWF4IC0gdGhpcy5taW4pO1xuICAgIH07XG4gICAgTGluZWFyLnByb3RvdHlwZS5pbml0Q2ZnID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnRpY2tNZXRob2QgPSAnd2lsa2luc29uLWV4dGVuZGVkJztcbiAgICAgICAgdGhpcy5uaWNlID0gZmFsc2U7XG4gICAgfTtcbiAgICByZXR1cm4gTGluZWFyO1xufShDb250aW51b3VzKSk7XG5leHBvcnQgZGVmYXVsdCBMaW5lYXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1saW5lYXIuanMubWFwIiwiaW1wb3J0IHsgZWFjaCwgaXNOaWwgfSBmcm9tICdAYW50di91dGlsJztcbi8vIOaxguS7pWHkuLrmrKHluYLvvIznu5PmnpzkuLpi55qE5Z+65pWw77yM5aaCIHheXmEgPSBiO+axgnhcbi8vIOiZveeEtuaVsOWtpuS4iiBiIOS4jeaUr+aMgei0n+aVsO+8jOS9huaYr+i/memHjOmcgOimgeaUr+aMgSDotJ/mlbBcbmV4cG9ydCBmdW5jdGlvbiBjYWxCYXNlKGEsIGIpIHtcbiAgICB2YXIgZSA9IE1hdGguRTtcbiAgICB2YXIgdmFsdWU7XG4gICAgaWYgKGIgPj0gMCkge1xuICAgICAgICB2YWx1ZSA9IE1hdGgucG93KGUsIE1hdGgubG9nKGIpIC8gYSk7IC8vIOS9v+eUqOaNouW6leWFrOW8j+axguW6lVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdmFsdWUgPSBNYXRoLnBvdyhlLCBNYXRoLmxvZygtYikgLyBhKSAqIC0xOyAvLyDkvb/nlKjmjaLlupXlhazlvI/msYLlupVcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGxvZyhhLCBiKSB7XG4gICAgaWYgKGEgPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICAgIHJldHVybiBNYXRoLmxvZyhiKSAvIE1hdGgubG9nKGEpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldExvZ1Bvc2l0aXZlTWluKHZhbHVlcywgYmFzZSwgbWF4KSB7XG4gICAgaWYgKGlzTmlsKG1heCkpIHtcbiAgICAgICAgbWF4ID0gTWF0aC5tYXguYXBwbHkobnVsbCwgdmFsdWVzKTtcbiAgICB9XG4gICAgdmFyIHBvc2l0aXZlTWluID0gbWF4O1xuICAgIGVhY2godmFsdWVzLCBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlID4gMCAmJiB2YWx1ZSA8IHBvc2l0aXZlTWluKSB7XG4gICAgICAgICAgICBwb3NpdGl2ZU1pbiA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgaWYgKHBvc2l0aXZlTWluID09PSBtYXgpIHtcbiAgICAgICAgcG9zaXRpdmVNaW4gPSBtYXggLyBiYXNlO1xuICAgIH1cbiAgICBpZiAocG9zaXRpdmVNaW4gPiAxKSB7XG4gICAgICAgIHBvc2l0aXZlTWluID0gMTtcbiAgICB9XG4gICAgcmV0dXJuIHBvc2l0aXZlTWluO1xufVxuZnVuY3Rpb24gZGlnaXRMZW5ndGgobnVtKSB7XG4gICAgLy8gR2V0IGRpZ2l0IGxlbmd0aCBvZiBlXG4gICAgdmFyIGVTcGxpdCA9IG51bS50b1N0cmluZygpLnNwbGl0KC9bZUVdLyk7XG4gICAgdmFyIGxlbiA9IChlU3BsaXRbMF0uc3BsaXQoJy4nKVsxXSB8fCAnJykubGVuZ3RoIC0gKyhlU3BsaXRbMV0gfHwgMCk7XG4gICAgcmV0dXJuIGxlbiA+IDAgPyBsZW4gOiAwO1xufVxuLyoqXG4gKiDpq5jnsr7luqbliqDms5XvvIzop6PlhrMgMC4xICsgMC4yICE9PSAwLjMg55qE57uP5YW46Zeu6aKYXG4gKlxuICogQHBhcmFtIG51bTEg5Yqg5pWwXG4gKiBAcGFyYW0gbnVtMiDooqvliqDmlbBcbiAqIEByZXR1cm4ge251bWJlcn0g6L+U5Zue5YC8XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcmVjaXNpb25BZGQobnVtMSwgbnVtMikge1xuICAgIHZhciBudW0xRGlnaXRzID0gZGlnaXRMZW5ndGgobnVtMSk7XG4gICAgdmFyIG51bTJEaWdpdHMgPSBkaWdpdExlbmd0aChudW0yKTtcbiAgICB2YXIgYmFzZU51bSA9IE1hdGgucG93KDEwLCBNYXRoLm1heChudW0xRGlnaXRzLCBudW0yRGlnaXRzKSk7XG4gICAgcmV0dXJuIChudW0xICogYmFzZU51bSArIG51bTIgKiBiYXNlTnVtKSAvIGJhc2VOdW07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tYXRoLmpzLm1hcCIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgZ2V0TG9nUG9zaXRpdmVNaW4sIGxvZyB9IGZyb20gJy4uL3V0aWwvbWF0aCc7XG5pbXBvcnQgQ29udGludW91cyBmcm9tICcuL2Jhc2UnO1xuLyoqXG4gKiBMb2cg5bqm6YeP77yM5aSE55CG6Z2e5Z2H5YyA5YiG5biDXG4gKi9cbnZhciBMb2cgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKExvZywgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBMb2coKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy50eXBlID0gJ2xvZyc7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQG92ZXJyaWRlXG4gICAgICovXG4gICAgTG9nLnByb3RvdHlwZS5pbnZlcnQgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdmFyIGJhc2UgPSB0aGlzLmJhc2U7XG4gICAgICAgIHZhciBtYXggPSBsb2coYmFzZSwgdGhpcy5tYXgpO1xuICAgICAgICB2YXIgcmFuZ2VNaW4gPSB0aGlzLnJhbmdlTWluKCk7XG4gICAgICAgIHZhciByYW5nZSA9IHRoaXMucmFuZ2VNYXgoKSAtIHJhbmdlTWluO1xuICAgICAgICB2YXIgbWluO1xuICAgICAgICB2YXIgcG9zaXRpdmVNaW4gPSB0aGlzLnBvc2l0aXZlTWluO1xuICAgICAgICBpZiAocG9zaXRpdmVNaW4pIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbWluID0gbG9nKGJhc2UsIHBvc2l0aXZlTWluIC8gYmFzZSk7XG4gICAgICAgICAgICB2YXIgYXBwZW5kUGVyY2VudCA9ICgxIC8gKG1heCAtIG1pbikpICogcmFuZ2U7IC8vIDAg5YiwIHBvc2l0aXZlTWlu55qE5Y2g5q+UXG4gICAgICAgICAgICBpZiAodmFsdWUgPCBhcHBlbmRQZXJjZW50KSB7XG4gICAgICAgICAgICAgICAgLy8g6JC95YiwIDAgLSBwb3NpdGl2ZU1pbiDkuYvpl7RcbiAgICAgICAgICAgICAgICByZXR1cm4gKHZhbHVlIC8gYXBwZW5kUGVyY2VudCkgKiBwb3NpdGl2ZU1pbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG1pbiA9IGxvZyhiYXNlLCB0aGlzLm1pbik7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHBlcmNlbnQgPSAodmFsdWUgLSByYW5nZU1pbikgLyByYW5nZTtcbiAgICAgICAgdmFyIHRtcCA9IHBlcmNlbnQgKiAobWF4IC0gbWluKSArIG1pbjtcbiAgICAgICAgcmV0dXJuIE1hdGgucG93KGJhc2UsIHRtcCk7XG4gICAgfTtcbiAgICBMb2cucHJvdG90eXBlLmluaXRDZmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMudGlja01ldGhvZCA9ICdsb2cnO1xuICAgICAgICB0aGlzLmJhc2UgPSAxMDtcbiAgICAgICAgdGhpcy50aWNrQ291bnQgPSA2O1xuICAgICAgICB0aGlzLm5pY2UgPSB0cnVlO1xuICAgIH07XG4gICAgLy8g6K6+572uXG4gICAgTG9nLnByb3RvdHlwZS5zZXREb21haW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIF9zdXBlci5wcm90b3R5cGUuc2V0RG9tYWluLmNhbGwodGhpcyk7XG4gICAgICAgIHZhciBtaW4gPSB0aGlzLm1pbjtcbiAgICAgICAgaWYgKG1pbiA8IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignV2hlbiB5b3UgdXNlIGxvZyBzY2FsZSwgdGhlIG1pbmltdW0gdmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVybyEnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWluID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnBvc2l0aXZlTWluID0gZ2V0TG9nUG9zaXRpdmVNaW4odGhpcy52YWx1ZXMsIHRoaXMuYmFzZSwgdGhpcy5tYXgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvLyDmoLnmja7lvZPliY3lgLzojrflj5bljaDmr5RcbiAgICBMb2cucHJvdG90eXBlLmdldFNjYWxlUGVyY2VudCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB2YXIgbWF4ID0gdGhpcy5tYXg7XG4gICAgICAgIHZhciBtaW4gPSB0aGlzLm1pbjtcbiAgICAgICAgaWYgKG1heCA9PT0gbWluKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICAvLyDlpoLmnpzlgLzlsI/kuo7nrYnkuo4w77yM5YiZ5oyJ54WnMOWkhOeQhlxuICAgICAgICBpZiAodmFsdWUgPD0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGJhc2UgPSB0aGlzLmJhc2U7XG4gICAgICAgIHZhciBwb3NpdGl2ZU1pbiA9IHRoaXMucG9zaXRpdmVNaW47XG4gICAgICAgIC8vIOWmguaenG1pbiA9PSAwLCDliJnmoLnmja7mr5Qw5aSn55qE5pyA5bCP5YC877yM6K6h566X5q+U5L6L5YWz57O744CC6L+Z5Liq5pyA5bCP5YC85L2c5Li65Z2Q5qCH6L205LiK55qE56ys5LqM5LiqdGlja++8jOesrOS4gOS4quaYrzDkvYbmmK/kuI3mmL7npLpcbiAgICAgICAgaWYgKHBvc2l0aXZlTWluKSB7XG4gICAgICAgICAgICBtaW4gPSAocG9zaXRpdmVNaW4gKiAxKSAvIGJhc2U7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHBlcmNlbnQ7XG4gICAgICAgIC8vIOWmguaenOaVsOWAvOWwj+S6juasoeWwj+WAvO+8jOmCo+S5iOWwseiuoeeulyB2YWx1ZSAvIOasoeWwj+WAvCDljaDmlbTkvZPnmoTmr5TkvotcbiAgICAgICAgaWYgKHZhbHVlIDwgcG9zaXRpdmVNaW4pIHtcbiAgICAgICAgICAgIHBlcmNlbnQgPSB2YWx1ZSAvIHBvc2l0aXZlTWluIC8gKGxvZyhiYXNlLCBtYXgpIC0gbG9nKGJhc2UsIG1pbikpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcGVyY2VudCA9IChsb2coYmFzZSwgdmFsdWUpIC0gbG9nKGJhc2UsIG1pbikpIC8gKGxvZyhiYXNlLCBtYXgpIC0gbG9nKGJhc2UsIG1pbikpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwZXJjZW50O1xuICAgIH07XG4gICAgcmV0dXJuIExvZztcbn0oQ29udGludW91cykpO1xuZXhwb3J0IGRlZmF1bHQgTG9nO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bG9nLmpzLm1hcCIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgY2FsQmFzZSB9IGZyb20gJy4uL3V0aWwvbWF0aCc7XG5pbXBvcnQgQ29udGludW91cyBmcm9tICcuL2Jhc2UnO1xuLyoqXG4gKiBQb3cg5bqm6YeP77yM5aSE55CG6Z2e5Z2H5YyA5YiG5biDXG4gKi9cbnZhciBQb3cgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFBvdywgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQb3coKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy50eXBlID0gJ3Bvdyc7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQG92ZXJyaWRlXG4gICAgICovXG4gICAgUG93LnByb3RvdHlwZS5pbnZlcnQgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdmFyIHBlcmNlbnQgPSB0aGlzLmdldEludmVydFBlcmNlbnQodmFsdWUpO1xuICAgICAgICB2YXIgZXhwb25lbnQgPSB0aGlzLmV4cG9uZW50O1xuICAgICAgICB2YXIgbWF4ID0gY2FsQmFzZShleHBvbmVudCwgdGhpcy5tYXgpO1xuICAgICAgICB2YXIgbWluID0gY2FsQmFzZShleHBvbmVudCwgdGhpcy5taW4pO1xuICAgICAgICB2YXIgdG1wID0gcGVyY2VudCAqIChtYXggLSBtaW4pICsgbWluO1xuICAgICAgICB2YXIgZmFjdG9yID0gdG1wID49IDAgPyAxIDogLTE7XG4gICAgICAgIHJldHVybiBNYXRoLnBvdyh0bXAsIGV4cG9uZW50KSAqIGZhY3RvcjtcbiAgICB9O1xuICAgIFBvdy5wcm90b3R5cGUuaW5pdENmZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy50aWNrTWV0aG9kID0gJ3Bvdyc7XG4gICAgICAgIHRoaXMuZXhwb25lbnQgPSAyO1xuICAgICAgICB0aGlzLnRpY2tDb3VudCA9IDU7XG4gICAgICAgIHRoaXMubmljZSA9IHRydWU7XG4gICAgfTtcbiAgICAvLyDojrflj5bluqbph4/orqHnrpfml7bvvIx2YWx1ZeWNoOeahOWumuS5ieWfn+eZvuWIhuavlFxuICAgIFBvdy5wcm90b3R5cGUuZ2V0U2NhbGVQZXJjZW50ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHZhciBtYXggPSB0aGlzLm1heDtcbiAgICAgICAgdmFyIG1pbiA9IHRoaXMubWluO1xuICAgICAgICBpZiAobWF4ID09PSBtaW4pIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICAgIHZhciBleHBvbmVudCA9IHRoaXMuZXhwb25lbnQ7XG4gICAgICAgIHZhciBwZXJjZW50ID0gKGNhbEJhc2UoZXhwb25lbnQsIHZhbHVlKSAtIGNhbEJhc2UoZXhwb25lbnQsIG1pbikpIC8gKGNhbEJhc2UoZXhwb25lbnQsIG1heCkgLSBjYWxCYXNlKGV4cG9uZW50LCBtaW4pKTtcbiAgICAgICAgcmV0dXJuIHBlcmNlbnQ7XG4gICAgfTtcbiAgICByZXR1cm4gUG93O1xufShDb250aW51b3VzKSk7XG5leHBvcnQgZGVmYXVsdCBQb3c7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wb3cuanMubWFwIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBlYWNoLCBpc0RhdGUsIGlzTmlsLCBpc051bWJlciwgaXNTdHJpbmcgfSBmcm9tICdAYW50di91dGlsJztcbmltcG9ydCB7IHRpbWVGb3JtYXQsIHRvVGltZVN0YW1wIH0gZnJvbSAnLi4vdXRpbC90aW1lJztcbmltcG9ydCBMaW5lYXIgZnJvbSAnLi9saW5lYXInO1xuLyoqXG4gKiDml7bpl7Tluqbph49cbiAqIEBjbGFzc1xuICovXG52YXIgVGltZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoVGltZSwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBUaW1lKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMudHlwZSA9ICd0aW1lJztcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAb3ZlcnJpZGVcbiAgICAgKi9cbiAgICBUaW1lLnByb3RvdHlwZS5nZXRUZXh0ID0gZnVuY3Rpb24gKHZhbHVlLCBpbmRleCkge1xuICAgICAgICB2YXIgbnVtYmVyVmFsdWUgPSB0aGlzLnRyYW5zbGF0ZSh2YWx1ZSk7XG4gICAgICAgIHZhciBmb3JtYXR0ZXIgPSB0aGlzLmZvcm1hdHRlcjtcbiAgICAgICAgcmV0dXJuIGZvcm1hdHRlciA/IGZvcm1hdHRlcihudW1iZXJWYWx1ZSwgaW5kZXgpIDogdGltZUZvcm1hdChudW1iZXJWYWx1ZSwgdGhpcy5tYXNrKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBvdmVycmlkZVxuICAgICAqL1xuICAgIFRpbWUucHJvdG90eXBlLnNjYWxlID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHZhciB2ID0gdmFsdWU7XG4gICAgICAgIGlmIChpc1N0cmluZyh2KSB8fCBpc0RhdGUodikpIHtcbiAgICAgICAgICAgIHYgPSB0aGlzLnRyYW5zbGF0ZSh2KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX3N1cGVyLnByb3RvdHlwZS5zY2FsZS5jYWxsKHRoaXMsIHYpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICog5bCG5pe26Ze06L2s5o2i5oiQ5pWw5a2XXG4gICAgICogQG92ZXJyaWRlXG4gICAgICovXG4gICAgVGltZS5wcm90b3R5cGUudHJhbnNsYXRlID0gZnVuY3Rpb24gKHYpIHtcbiAgICAgICAgcmV0dXJuIHRvVGltZVN0YW1wKHYpO1xuICAgIH07XG4gICAgVGltZS5wcm90b3R5cGUuaW5pdENmZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy50aWNrTWV0aG9kID0gJ3RpbWUtcHJldHR5JztcbiAgICAgICAgdGhpcy5tYXNrID0gJ1lZWVktTU0tREQnO1xuICAgICAgICB0aGlzLnRpY2tDb3VudCA9IDc7XG4gICAgICAgIHRoaXMubmljZSA9IGZhbHNlO1xuICAgIH07XG4gICAgVGltZS5wcm90b3R5cGUuc2V0RG9tYWluID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdmFsdWVzID0gdGhpcy52YWx1ZXM7XG4gICAgICAgIC8vIOaYr+WQpuiuvue9ruS6hiBtaW4sIG1heO+8jOiAjOS4jeaYr+ebtOaOpeWPliB0aGlzLm1pbiwgdGhpcy5tYXhcbiAgICAgICAgdmFyIG1pbkNvbmZpZyA9IHRoaXMuZ2V0Q29uZmlnKCdtaW4nKTtcbiAgICAgICAgdmFyIG1heENvbmZpZyA9IHRoaXMuZ2V0Q29uZmlnKCdtYXgnKTtcbiAgICAgICAgLy8g5aaC5p6c6K6+572u5LqGIG1pbixtYXgg5YiZ6L2s5o2i5oiQ5pe26Ze05oizXG4gICAgICAgIGlmICghaXNOaWwobWluQ29uZmlnKSB8fCAhaXNOdW1iZXIobWluQ29uZmlnKSkge1xuICAgICAgICAgICAgdGhpcy5taW4gPSB0aGlzLnRyYW5zbGF0ZSh0aGlzLm1pbik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc05pbChtYXhDb25maWcpIHx8ICFpc051bWJlcihtYXhDb25maWcpKSB7XG4gICAgICAgICAgICB0aGlzLm1heCA9IHRoaXMudHJhbnNsYXRlKHRoaXMubWF4KTtcbiAgICAgICAgfVxuICAgICAgICAvLyDmsqHmnInorr7nva4gbWluLCBtYXgg5pe2XG4gICAgICAgIGlmICh2YWx1ZXMgJiYgdmFsdWVzLmxlbmd0aCkge1xuICAgICAgICAgICAgLy8g6YeN5paw6K6h566X5pyA5aSn5pyA5bCP5YC8XG4gICAgICAgICAgICB2YXIgdGltZVN0YW1wc18xID0gW107XG4gICAgICAgICAgICB2YXIgbWluXzEgPSBJbmZpbml0eTsgLy8g5pyA5bCP5YC8XG4gICAgICAgICAgICB2YXIgc2Vjb25kTWluXzEgPSBtaW5fMTsgLy8g5qyh5bCP5YC8XG4gICAgICAgICAgICB2YXIgbWF4XzEgPSAwO1xuICAgICAgICAgICAgLy8g5L2/55So5LiA5Liq5b6q546v77yM6K6h566XbWluLG1heCxzZWNvbmRNaW5cbiAgICAgICAgICAgIGVhY2godmFsdWVzLCBmdW5jdGlvbiAodikge1xuICAgICAgICAgICAgICAgIHZhciB0aW1lU3RhbXAgPSB0b1RpbWVTdGFtcCh2KTtcbiAgICAgICAgICAgICAgICBpZiAoaXNOYU4odGltZVN0YW1wKSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBUaW1lOiBcIiArIHYgKyBcIiBpbiB0aW1lIHNjYWxlIVwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG1pbl8xID4gdGltZVN0YW1wKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlY29uZE1pbl8xID0gbWluXzE7XG4gICAgICAgICAgICAgICAgICAgIG1pbl8xID0gdGltZVN0YW1wO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChzZWNvbmRNaW5fMSA+IHRpbWVTdGFtcCkge1xuICAgICAgICAgICAgICAgICAgICBzZWNvbmRNaW5fMSA9IHRpbWVTdGFtcDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG1heF8xIDwgdGltZVN0YW1wKSB7XG4gICAgICAgICAgICAgICAgICAgIG1heF8xID0gdGltZVN0YW1wO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aW1lU3RhbXBzXzEucHVzaCh0aW1lU3RhbXApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyDlrZjlnKjlpJrkuKrlgLzml7bvvIzorr7nva7mnIDlsI/pl7Tot51cbiAgICAgICAgICAgIGlmICh2YWx1ZXMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgIHRoaXMubWluVGlja0ludGVydmFsID0gc2Vjb25kTWluXzEgLSBtaW5fMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc05pbChtaW5Db25maWcpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5taW4gPSBtaW5fMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc05pbChtYXhDb25maWcpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tYXggPSBtYXhfMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIFRpbWU7XG59KExpbmVhcikpO1xuZXhwb3J0IGRlZmF1bHQgVGltZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRpbWUuanMubWFwIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBlYWNoLCBoZWFkLCBsYXN0IH0gZnJvbSAnQGFudHYvdXRpbCc7XG5pbXBvcnQgQ29udGludW91cyBmcm9tICcuL2Jhc2UnO1xuLyoqXG4gKiDliIbmrrXluqbph49cbiAqL1xudmFyIFF1YW50aXplID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhRdWFudGl6ZSwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBRdWFudGl6ZSgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLnR5cGUgPSAncXVhbnRpemUnO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIFF1YW50aXplLnByb3RvdHlwZS5pbnZlcnQgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdmFyIHRpY2tzID0gdGhpcy50aWNrcztcbiAgICAgICAgdmFyIGxlbmd0aCA9IHRpY2tzLmxlbmd0aDtcbiAgICAgICAgdmFyIHBlcmNlbnQgPSB0aGlzLmdldEludmVydFBlcmNlbnQodmFsdWUpO1xuICAgICAgICB2YXIgbWluSW5kZXggPSBNYXRoLmZsb29yKHBlcmNlbnQgKiAobGVuZ3RoIC0gMSkpO1xuICAgICAgICAvLyDmnIDlkI7kuIDkuKpcbiAgICAgICAgaWYgKG1pbkluZGV4ID49IGxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgIHJldHVybiBsYXN0KHRpY2tzKTtcbiAgICAgICAgfVxuICAgICAgICAvLyDotoXlh7rlt6bovrnnlYzvvIwg5YiZ5Y+W56ys5LiA5LiqXG4gICAgICAgIGlmIChtaW5JbmRleCA8IDApIHtcbiAgICAgICAgICAgIHJldHVybiBoZWFkKHRpY2tzKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbWluVGljayA9IHRpY2tzW21pbkluZGV4XTtcbiAgICAgICAgdmFyIG5leHRUaWNrID0gdGlja3NbbWluSW5kZXggKyAxXTtcbiAgICAgICAgLy8g5q+U5b2T5YmN5YC85bCP55qEIHRpY2sg5Zyo5bqm6YeP5LiK55qE5Y2g5q+UXG4gICAgICAgIHZhciBtaW5JbmRleFBlcmNlbnQgPSBtaW5JbmRleCAvIChsZW5ndGggLSAxKTtcbiAgICAgICAgdmFyIG1heEluZGV4UGVyY2VudCA9IChtaW5JbmRleCArIDEpIC8gKGxlbmd0aCAtIDEpO1xuICAgICAgICByZXR1cm4gbWluVGljayArIChwZXJjZW50IC0gbWluSW5kZXhQZXJjZW50KSAvIChtYXhJbmRleFBlcmNlbnQgLSBtaW5JbmRleFBlcmNlbnQpICogKG5leHRUaWNrIC0gbWluVGljayk7XG4gICAgfTtcbiAgICBRdWFudGl6ZS5wcm90b3R5cGUuaW5pdENmZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy50aWNrTWV0aG9kID0gJ3ItcHJldHR5JztcbiAgICAgICAgdGhpcy50aWNrQ291bnQgPSA1O1xuICAgICAgICB0aGlzLm5pY2UgPSB0cnVlO1xuICAgIH07XG4gICAgUXVhbnRpemUucHJvdG90eXBlLmNhbGN1bGF0ZVRpY2tzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdGlja3MgPSBfc3VwZXIucHJvdG90eXBlLmNhbGN1bGF0ZVRpY2tzLmNhbGwodGhpcyk7XG4gICAgICAgIGlmICghdGhpcy5uaWNlKSB7IC8vIOWmguaenCBuaWNlID0gZmFsc2UgLOihpeWFhSBtaW4sIG1heFxuICAgICAgICAgICAgaWYgKGxhc3QodGlja3MpICE9PSB0aGlzLm1heCkge1xuICAgICAgICAgICAgICAgIHRpY2tzLnB1c2godGhpcy5tYXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGhlYWQodGlja3MpICE9PSB0aGlzLm1pbikge1xuICAgICAgICAgICAgICAgIHRpY2tzLnVuc2hpZnQodGhpcy5taW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aWNrcztcbiAgICB9O1xuICAgIC8vIOiuoeeul+W9k+WJjeWAvOWcqOWIu+W6puS4reeahOWNoOavlFxuICAgIFF1YW50aXplLnByb3RvdHlwZS5nZXRTY2FsZVBlcmNlbnQgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdmFyIHRpY2tzID0gdGhpcy50aWNrcztcbiAgICAgICAgLy8g6LaF5Ye65bem6L6555WMXG4gICAgICAgIGlmICh2YWx1ZSA8IGhlYWQodGlja3MpKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICAvLyDotoXlh7rlj7PovrnnlYxcbiAgICAgICAgaWYgKHZhbHVlID4gbGFzdCh0aWNrcykpIHtcbiAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9XG4gICAgICAgIHZhciBtaW5JbmRleCA9IDA7XG4gICAgICAgIGVhY2godGlja3MsIGZ1bmN0aW9uICh0aWNrLCBpbmRleCkge1xuICAgICAgICAgICAgaWYgKHZhbHVlID49IHRpY2spIHtcbiAgICAgICAgICAgICAgICBtaW5JbmRleCA9IGluZGV4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG1pbkluZGV4IC8gKHRpY2tzLmxlbmd0aCAtIDEpO1xuICAgIH07XG4gICAgcmV0dXJuIFF1YW50aXplO1xufShDb250aW51b3VzKSk7XG5leHBvcnQgZGVmYXVsdCBRdWFudGl6ZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXF1YW50aXplLmpzLm1hcCIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFF1YW50aXplIGZyb20gJy4vcXVhbnRpemUnO1xudmFyIFF1YW50aWxlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhRdWFudGlsZSwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBRdWFudGlsZSgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLnR5cGUgPSAncXVhbnRpbGUnO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIFF1YW50aWxlLnByb3RvdHlwZS5pbml0Q2ZnID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnRpY2tNZXRob2QgPSAncXVhbnRpbGUnO1xuICAgICAgICB0aGlzLnRpY2tDb3VudCA9IDU7XG4gICAgICAgIHRoaXMubmljZSA9IHRydWU7XG4gICAgfTtcbiAgICByZXR1cm4gUXVhbnRpbGU7XG59KFF1YW50aXplKSk7XG5leHBvcnQgZGVmYXVsdCBRdWFudGlsZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXF1YW50aWxlLmpzLm1hcCIsImltcG9ydCBTY2FsZSBmcm9tICcuL2Jhc2UnO1xudmFyIG1hcCA9IHt9O1xuZnVuY3Rpb24gZ2V0Q2xhc3Moa2V5KSB7XG4gICAgcmV0dXJuIG1hcFtrZXldO1xufVxuZnVuY3Rpb24gcmVnaXN0ZXJDbGFzcyhrZXksIGNscykge1xuICAgIGlmIChnZXRDbGFzcyhrZXkpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcInR5cGUgJ1wiICsga2V5ICsgXCInIGV4aXN0ZWQuXCIpO1xuICAgIH1cbiAgICBtYXBba2V5XSA9IGNscztcbn1cbmV4cG9ydCB7IFNjYWxlLCBnZXRDbGFzcyBhcyBnZXRTY2FsZSwgcmVnaXN0ZXJDbGFzcyBhcyByZWdpc3RlclNjYWxlIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1mYWN0b3J5LmpzLm1hcCIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgaXNOdW1iZXIgfSBmcm9tICdAYW50di91dGlsJztcbmltcG9ydCBCYXNlIGZyb20gJy4uL2Jhc2UnO1xuLyoqXG4gKiBpZGVudGl0eSBzY2FsZeWOn+WImeS4iuaYr+WumuS5ieWfn+WSjOWAvOWfn+S4gOiHtO+8jHNjYWxlL2ludmVydOaWueazleS5n+aYr+S4gOiHtOeahFxuICog5Y+C6ICDUueahOWunueOsO+8mmh0dHBzOi8vZ2l0aHViLmNvbS9yLWxpYi9zY2FsZXMvYmxvYi9tYXN0ZXIvUi9wYWwtaWRlbnRpdHkuclxuICog5Y+C6ICDZDPnmoTlrp7njrDvvIjlgZrkuobkuIvovazlnovvvInvvJpodHRwczovL2dpdGh1Yi5jb20vZDMvZDMtc2NhbGUvYmxvYi9tYXN0ZXIvc3JjL2lkZW50aXR5LmpzXG4gKi9cbnZhciBJZGVudGl0eSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoSWRlbnRpdHksIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gSWRlbnRpdHkoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy50eXBlID0gJ2lkZW50aXR5JztcbiAgICAgICAgX3RoaXMuaXNJZGVudGl0eSA9IHRydWU7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgSWRlbnRpdHkucHJvdG90eXBlLmNhbGN1bGF0ZVRpY2tzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZXM7XG4gICAgfTtcbiAgICBJZGVudGl0eS5wcm90b3R5cGUuc2NhbGUgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgLy8g5aaC5p6c5Lyg5YWl55qE5YC85LiN562J5LqOIGlkZW50aXR5IOeahOWAvO+8jOWImeebtOaOpei/lOWbnu+8jOeUqOS6juS4gOe7tOWbvuaXtueahCBkb2RnZVxuICAgICAgICBpZiAodGhpcy52YWx1ZXNbMF0gIT09IHZhbHVlICYmIGlzTnVtYmVyKHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnJhbmdlWzBdO1xuICAgIH07XG4gICAgSWRlbnRpdHkucHJvdG90eXBlLmludmVydCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB2YXIgcmFuZ2UgPSB0aGlzLnJhbmdlO1xuICAgICAgICBpZiAodmFsdWUgPCByYW5nZVswXSB8fCB2YWx1ZSA+IHJhbmdlWzFdKSB7XG4gICAgICAgICAgICByZXR1cm4gTmFOO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlc1swXTtcbiAgICB9O1xuICAgIHJldHVybiBJZGVudGl0eTtcbn0oQmFzZSkpO1xuZXhwb3J0IGRlZmF1bHQgSWRlbnRpdHk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCIvLyDkuLrkuobop6PlhrMganMg6L+Q566X55qE57K+5bqm6Zeu6aKYXG5leHBvcnQgZnVuY3Rpb24gcHJldHR5TnVtYmVyKG4pIHtcbiAgICByZXR1cm4gTWF0aC5hYnMobikgPCAxZS0xNSA/IG4gOiBwYXJzZUZsb2F0KG4udG9GaXhlZCgxNSkpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cHJldHR5LW51bWJlci5qcy5tYXAiLCJpbXBvcnQgeyBoZWFkLCBpbmRleE9mLCBzaXplLCBsYXN0IH0gZnJvbSAnQGFudHYvdXRpbCc7XG5pbXBvcnQgeyBwcmV0dHlOdW1iZXIgfSBmcm9tICcuL3ByZXR0eS1udW1iZXInO1xuZXhwb3J0IHZhciBERUZBVUxUX1EgPSBbMSwgNSwgMiwgMi41LCA0LCAzXTtcbmV4cG9ydCB2YXIgQUxMX1EgPSBbMSwgNSwgMiwgMi41LCA0LCAzLCAxLjUsIDcsIDYsIDgsIDldO1xudmFyIGVwcyA9IE51bWJlci5FUFNJTE9OICogMTAwO1xuZnVuY3Rpb24gbW9kKG4sIG0pIHtcbiAgICByZXR1cm4gKChuICUgbSkgKyBtKSAlIG07XG59XG5mdW5jdGlvbiByb3VuZChuKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQobiAqIDFlMTIpIC8gMWUxMjtcbn1cbmZ1bmN0aW9uIHNpbXBsaWNpdHkocSwgUSwgaiwgbG1pbiwgbG1heCwgbHN0ZXApIHtcbiAgICB2YXIgbiA9IHNpemUoUSk7XG4gICAgdmFyIGkgPSBpbmRleE9mKFEsIHEpO1xuICAgIHZhciB2ID0gMDtcbiAgICB2YXIgbSA9IG1vZChsbWluLCBsc3RlcCk7XG4gICAgaWYgKChtIDwgZXBzIHx8IGxzdGVwIC0gbSA8IGVwcykgJiYgbG1pbiA8PSAwICYmIGxtYXggPj0gMCkge1xuICAgICAgICB2ID0gMTtcbiAgICB9XG4gICAgcmV0dXJuIDEgLSBpIC8gKG4gLSAxKSAtIGogKyB2O1xufVxuZnVuY3Rpb24gc2ltcGxpY2l0eU1heChxLCBRLCBqKSB7XG4gICAgdmFyIG4gPSBzaXplKFEpO1xuICAgIHZhciBpID0gaW5kZXhPZihRLCBxKTtcbiAgICB2YXIgdiA9IDE7XG4gICAgcmV0dXJuIDEgLSBpIC8gKG4gLSAxKSAtIGogKyB2O1xufVxuZnVuY3Rpb24gZGVuc2l0eShrLCBtLCBkTWluLCBkTWF4LCBsTWluLCBsTWF4KSB7XG4gICAgdmFyIHIgPSAoayAtIDEpIC8gKGxNYXggLSBsTWluKTtcbiAgICB2YXIgcnQgPSAobSAtIDEpIC8gKE1hdGgubWF4KGxNYXgsIGRNYXgpIC0gTWF0aC5taW4oZE1pbiwgbE1pbikpO1xuICAgIHJldHVybiAyIC0gTWF0aC5tYXgociAvIHJ0LCBydCAvIHIpO1xufVxuZnVuY3Rpb24gZGVuc2l0eU1heChrLCBtKSB7XG4gICAgaWYgKGsgPj0gbSkge1xuICAgICAgICByZXR1cm4gMiAtIChrIC0gMSkgLyAobSAtIDEpO1xuICAgIH1cbiAgICByZXR1cm4gMTtcbn1cbmZ1bmN0aW9uIGNvdmVyYWdlKGRNaW4sIGRNYXgsIGxNaW4sIGxNYXgpIHtcbiAgICB2YXIgcmFuZ2UgPSBkTWF4IC0gZE1pbjtcbiAgICByZXR1cm4gMSAtICgwLjUgKiAoTWF0aC5wb3coKGRNYXggLSBsTWF4KSwgMikgKyBNYXRoLnBvdygoZE1pbiAtIGxNaW4pLCAyKSkpIC8gTWF0aC5wb3coKDAuMSAqIHJhbmdlKSwgMik7XG59XG5mdW5jdGlvbiBjb3ZlcmFnZU1heChkTWluLCBkTWF4LCBzcGFuKSB7XG4gICAgdmFyIHJhbmdlID0gZE1heCAtIGRNaW47XG4gICAgaWYgKHNwYW4gPiByYW5nZSkge1xuICAgICAgICB2YXIgaGFsZiA9IChzcGFuIC0gcmFuZ2UpIC8gMjtcbiAgICAgICAgcmV0dXJuIDEgLSBNYXRoLnBvdyhoYWxmLCAyKSAvIE1hdGgucG93KCgwLjEgKiByYW5nZSksIDIpO1xuICAgIH1cbiAgICByZXR1cm4gMTtcbn1cbmZ1bmN0aW9uIGxlZ2liaWxpdHkoKSB7XG4gICAgcmV0dXJuIDE7XG59XG4vKipcbiAqIEFuIEV4dGVuc2lvbiBvZiBXaWxraW5zb24ncyBBbGdvcml0aG0gZm9yIFBvc2l0aW9uIFRpY2sgTGFiZWxzIG9uIEF4ZXNcbiAqIGh0dHBzOi8vd3d3Lnl1cXVlLmNvbS9wcmV2aWV3L3l1cXVlLzAvMjAxOS9wZGYvMTg1MzE3LzE1NDY5OTkxNTA4NTgtNDVjM2I5YzItNGU4Ni00MjIzLWJmMWEtOGE3MzJlODE5NWVkLnBkZlxuICogQHBhcmFtIGRNaW4g5pyA5bCP5YC8XG4gKiBAcGFyYW0gZE1heCDmnIDlpKflgLxcbiAqIEBwYXJhbSBtIHRpY2vkuKrmlbBcbiAqIEBwYXJhbSBvbmx5TG9vc2Ug5piv5ZCm5YWB6K645omp5bGVbWlu44CBbWF477yM5LiN57ud5a+55by65Yi277yM5L6L5aaCWzMsIDk3XVxuICogQHBhcmFtIFEgbmljZSBudW1iZXJz6ZuG5ZCIXG4gKiBAcGFyYW0gdyDlm5vkuKrkvJjljJbnu4Tku7bnmoTmnYPph41cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZXh0ZW5kZWQoZE1pbiwgZE1heCwgbiwgb25seUxvb3NlLCBRLCB3KSB7XG4gICAgaWYgKG4gPT09IHZvaWQgMCkgeyBuID0gNTsgfVxuICAgIGlmIChvbmx5TG9vc2UgPT09IHZvaWQgMCkgeyBvbmx5TG9vc2UgPSB0cnVlOyB9XG4gICAgaWYgKFEgPT09IHZvaWQgMCkgeyBRID0gREVGQVVMVF9ROyB9XG4gICAgaWYgKHcgPT09IHZvaWQgMCkgeyB3ID0gWzAuMjUsIDAuMiwgMC41LCAwLjA1XTsgfVxuICAgIC8vIOWkhOeQhuWwj+S6jiAwIOWSjOWwj+aVsOeahCB0aWNrQ291bnRcbiAgICB2YXIgbSA9IG4gPCAwID8gMCA6IE1hdGgucm91bmQobik7XG4gICAgLy8gbmFuIOS5n+S8muWvvOiHtOW8guW4uFxuICAgIGlmIChOdW1iZXIuaXNOYU4oZE1pbikgfHwgTnVtYmVyLmlzTmFOKGRNYXgpIHx8IHR5cGVvZiBkTWluICE9PSAnbnVtYmVyJyB8fCB0eXBlb2YgZE1heCAhPT0gJ251bWJlcicgfHwgIW0pIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG1pbjogMCxcbiAgICAgICAgICAgIG1heDogMCxcbiAgICAgICAgICAgIHRpY2tzOiBbXSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLy8ganMg5p6B5aSn5YC85p6B5bCP5YC86Zeu6aKY77yM5beu5YC85bCP5LqOIDFlLTE1IOS8muWvvOiHtOiuoeeul+WHuumUmVxuICAgIGlmIChkTWF4IC0gZE1pbiA8IDFlLTE1IHx8IG0gPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG1pbjogZE1pbixcbiAgICAgICAgICAgIG1heDogZE1heCxcbiAgICAgICAgICAgIHRpY2tzOiBbZE1pbl0sXG4gICAgICAgIH07XG4gICAgfVxuICAgIHZhciBiZXN0ID0ge1xuICAgICAgICBzY29yZTogLTIsXG4gICAgICAgIGxtaW46IDAsXG4gICAgICAgIGxtYXg6IDAsXG4gICAgICAgIGxzdGVwOiAwLFxuICAgIH07XG4gICAgdmFyIGogPSAxO1xuICAgIHdoaWxlIChqIDwgSW5maW5pdHkpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBRLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICB2YXIgcSA9IFFbaV07XG4gICAgICAgICAgICB2YXIgc20gPSBzaW1wbGljaXR5TWF4KHEsIFEsIGopO1xuICAgICAgICAgICAgaWYgKHdbMF0gKiBzbSArIHdbMV0gKyB3WzJdICsgd1szXSA8IGJlc3Quc2NvcmUpIHtcbiAgICAgICAgICAgICAgICBqID0gSW5maW5pdHk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgayA9IDI7XG4gICAgICAgICAgICB3aGlsZSAoayA8IEluZmluaXR5KSB7XG4gICAgICAgICAgICAgICAgdmFyIGRtID0gZGVuc2l0eU1heChrLCBtKTtcbiAgICAgICAgICAgICAgICBpZiAod1swXSAqIHNtICsgd1sxXSArIHdbMl0gKiBkbSArIHdbM10gPCBiZXN0LnNjb3JlKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgZGVsdGEgPSAoZE1heCAtIGRNaW4pIC8gKGsgKyAxKSAvIGogLyBxO1xuICAgICAgICAgICAgICAgIHZhciB6ID0gTWF0aC5jZWlsKE1hdGgubG9nMTAoZGVsdGEpKTtcbiAgICAgICAgICAgICAgICB3aGlsZSAoeiA8IEluZmluaXR5KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzdGVwID0gaiAqIHEgKiBNYXRoLnBvdygxMCwgeik7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjbSA9IGNvdmVyYWdlTWF4KGRNaW4sIGRNYXgsIHN0ZXAgKiAoayAtIDEpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHdbMF0gKiBzbSArIHdbMV0gKiBjbSArIHdbMl0gKiBkbSArIHdbM10gPCBiZXN0LnNjb3JlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB2YXIgbWluU3RhcnQgPSBNYXRoLmZsb29yKGRNYXggLyBzdGVwKSAqIGogLSAoayAtIDEpICogajtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG1heFN0YXJ0ID0gTWF0aC5jZWlsKGRNaW4gLyBzdGVwKSAqIGo7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtaW5TdGFydCA8PSBtYXhTdGFydCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvdW50ID0gbWF4U3RhcnQgLSBtaW5TdGFydDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGlfMSA9IDA7IGlfMSA8PSBjb3VudDsgaV8xICs9IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3RhcnQgPSBtaW5TdGFydCArIGlfMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbE1pbiA9IHN0YXJ0ICogKHN0ZXAgLyBqKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbE1heCA9IGxNaW4gKyBzdGVwICogKGsgLSAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbFN0ZXAgPSBzdGVwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzID0gc2ltcGxpY2l0eShxLCBRLCBqLCBsTWluLCBsTWF4LCBsU3RlcCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBjb3ZlcmFnZShkTWluLCBkTWF4LCBsTWluLCBsTWF4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZyA9IGRlbnNpdHkoaywgbSwgZE1pbiwgZE1heCwgbE1pbiwgbE1heCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGwgPSBsZWdpYmlsaXR5KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNjb3JlID0gd1swXSAqIHMgKyB3WzFdICogYyArIHdbMl0gKiBnICsgd1szXSAqIGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNjb3JlID4gYmVzdC5zY29yZSAmJiAoIW9ubHlMb29zZSB8fCAobE1pbiA8PSBkTWluICYmIGxNYXggPj0gZE1heCkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlc3QubG1pbiA9IGxNaW47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlc3QubG1heCA9IGxNYXg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlc3QubHN0ZXAgPSBsU3RlcDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVzdC5zY29yZSA9IHNjb3JlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB6ICs9IDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGsgKz0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBqICs9IDE7XG4gICAgfVxuICAgIC8vIOWkhOeQhueyvuW6pumXrumimO+8jOS/neivgei/meS4ieS4quaVsOayoeacieeyvuW6pumXrumimFxuICAgIHZhciBsbWF4ID0gcHJldHR5TnVtYmVyKGJlc3QubG1heCk7XG4gICAgdmFyIGxtaW4gPSBwcmV0dHlOdW1iZXIoYmVzdC5sbWluKTtcbiAgICB2YXIgbHN0ZXAgPSBwcmV0dHlOdW1iZXIoYmVzdC5sc3RlcCk7XG4gICAgLy8g5YqgIHJvdW5kIOaYr+S4uuWkhOeQhiBleHRlbmRlZCgwLjk0LCAxLCA1KVxuICAgIC8vIOS/neivgeeUn+aIkOeahCB0aWNrQ291bnQg5rKh5pyJ57K+5bqm6Zeu6aKYXG4gICAgdmFyIHRpY2tDb3VudCA9IE1hdGguZmxvb3Iocm91bmQoKGxtYXggLSBsbWluKSAvIGxzdGVwKSkgKyAxO1xuICAgIHZhciB0aWNrcyA9IG5ldyBBcnJheSh0aWNrQ291bnQpO1xuICAgIC8vIOWwkeeUqOS5mOazle+8mumYsuatouWHuueOsCAtMS4yICsgMS4yICogMyA9IDIuMzk5OTk5OTk5OTk5OTk5NSDnmoTmg4XlhrVcbiAgICB0aWNrc1swXSA9IHByZXR0eU51bWJlcihsbWluKTtcbiAgICBmb3IgKHZhciBpID0gMTsgaSA8IHRpY2tDb3VudDsgaSsrKSB7XG4gICAgICAgIHRpY2tzW2ldID0gcHJldHR5TnVtYmVyKHRpY2tzW2kgLSAxXSArIGxzdGVwKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbWluOiBNYXRoLm1pbihkTWluLCBoZWFkKHRpY2tzKSksXG4gICAgICAgIG1heDogTWF0aC5tYXgoZE1heCwgbGFzdCh0aWNrcykpLFxuICAgICAgICB0aWNrczogdGlja3MsXG4gICAgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWV4dGVuZGVkLmpzLm1hcCIsImltcG9ydCB7IGZpbHRlciwgaXNOaWwsIGlzTnVtYmVyIH0gZnJvbSAnQGFudHYvdXRpbCc7XG5pbXBvcnQgZXh0ZW5kZWQgZnJvbSAnLi4vdXRpbC9leHRlbmRlZCc7XG4vKipcbiAqIOiuoeeul+WIhuexuyB0aWNrc1xuICogQHBhcmFtIGNmZyDluqbph4/nmoTphY3nva7poblcbiAqIEByZXR1cm5zIOiuoeeul+WQjueahCB0aWNrc1xuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjYWxjdWxhdGVDYXRUaWNrcyhjZmcpIHtcbiAgICB2YXIgdmFsdWVzID0gY2ZnLnZhbHVlcywgdGlja0ludGVydmFsID0gY2ZnLnRpY2tJbnRlcnZhbCwgdGlja0NvdW50ID0gY2ZnLnRpY2tDb3VudDtcbiAgICB2YXIgdGlja3MgPSB2YWx1ZXM7XG4gICAgaWYgKGlzTnVtYmVyKHRpY2tJbnRlcnZhbCkpIHtcbiAgICAgICAgcmV0dXJuIGZpbHRlcih0aWNrcywgZnVuY3Rpb24gKF9fLCBpKSB7IHJldHVybiBpICUgdGlja0ludGVydmFsID09PSAwOyB9KTtcbiAgICB9XG4gICAgdmFyIG1pbiA9IGNmZy5taW4sIG1heCA9IGNmZy5tYXg7XG4gICAgaWYgKGlzTmlsKG1pbikpIHtcbiAgICAgICAgbWluID0gMDtcbiAgICB9XG4gICAgaWYgKGlzTmlsKG1heCkpIHtcbiAgICAgICAgbWF4ID0gdmFsdWVzLmxlbmd0aCAtIDE7XG4gICAgfVxuICAgIGlmIChpc051bWJlcih0aWNrQ291bnQpICYmIHRpY2tDb3VudCA8IG1heCAtIG1pbikge1xuICAgICAgICAvLyDnroDljZXov4fmu6TvvIzpg6jliIbmg4XlhrXkuIvlsI/mlbDnmoTlgI3mlbDkuZ/lj6/ku6XmmK/mlbTmlbBcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1zaGFkb3dlZC12YXJpYWJsZVxuICAgICAgICB2YXIgdGlja3NfMSA9IGV4dGVuZGVkKG1pbiwgbWF4LCB0aWNrQ291bnQsIGZhbHNlLCBbMSwgMiwgNSwgMywgNCwgNywgNiwgOCwgOV0pLnRpY2tzO1xuICAgICAgICB2YXIgdmFsaWQgPSBmaWx0ZXIodGlja3NfMSwgZnVuY3Rpb24gKHRpY2spIHsgcmV0dXJuIHRpY2sgPj0gbWluICYmIHRpY2sgPD0gbWF4OyB9KTtcbiAgICAgICAgcmV0dXJuIHZhbGlkLm1hcChmdW5jdGlvbiAoaW5kZXgpIHsgcmV0dXJuIHZhbHVlc1tpbmRleF07IH0pO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWVzLnNsaWNlKG1pbiwgbWF4ICsgMSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jYXQuanMubWFwIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZDNMaW5lYXIoY2ZnKSB7XG4gICAgdmFyIG1pbiA9IGNmZy5taW4sIG1heCA9IGNmZy5tYXgsIG5pY2UgPSBjZmcubmljZSwgdGlja0NvdW50ID0gY2ZnLnRpY2tDb3VudDtcbiAgICB2YXIgbGluZWFyID0gbmV3IEQzTGluZWFyKCk7XG4gICAgbGluZWFyLmRvbWFpbihbbWluLCBtYXhdKTtcbiAgICBpZiAobmljZSkge1xuICAgICAgICBsaW5lYXIubmljZSh0aWNrQ291bnQpO1xuICAgIH1cbiAgICByZXR1cm4gbGluZWFyLnRpY2tzKHRpY2tDb3VudCk7XG59XG52YXIgREVGQVVMVF9DT1VOVCA9IDU7XG52YXIgZTEwID0gTWF0aC5zcXJ0KDUwKTtcbnZhciBlNSA9IE1hdGguc3FydCgxMCk7XG52YXIgZTIgPSBNYXRoLnNxcnQoMik7XG4vLyBodHRwczovL2dpdGh1Yi5jb20vZDMvZDMtc2NhbGVcbnZhciBEM0xpbmVhciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBEM0xpbmVhcigpIHtcbiAgICAgICAgdGhpcy5fZG9tYWluID0gWzAsIDFdO1xuICAgIH1cbiAgICBEM0xpbmVhci5wcm90b3R5cGUuZG9tYWluID0gZnVuY3Rpb24gKGRvbWFpbikge1xuICAgICAgICBpZiAoZG9tYWluKSB7XG4gICAgICAgICAgICB0aGlzLl9kb21haW4gPSBBcnJheS5mcm9tKGRvbWFpbiwgTnVtYmVyKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9kb21haW4uc2xpY2UoKTtcbiAgICB9O1xuICAgIEQzTGluZWFyLnByb3RvdHlwZS5uaWNlID0gZnVuY3Rpb24gKGNvdW50KSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIGlmIChjb3VudCA9PT0gdm9pZCAwKSB7IGNvdW50ID0gREVGQVVMVF9DT1VOVDsgfVxuICAgICAgICB2YXIgZCA9IHRoaXMuX2RvbWFpbi5zbGljZSgpO1xuICAgICAgICB2YXIgaTAgPSAwO1xuICAgICAgICB2YXIgaTEgPSB0aGlzLl9kb21haW4ubGVuZ3RoIC0gMTtcbiAgICAgICAgdmFyIHN0YXJ0ID0gdGhpcy5fZG9tYWluW2kwXTtcbiAgICAgICAgdmFyIHN0b3AgPSB0aGlzLl9kb21haW5baTFdO1xuICAgICAgICB2YXIgc3RlcDtcbiAgICAgICAgaWYgKHN0b3AgPCBzdGFydCkge1xuICAgICAgICAgICAgX2EgPSBbc3RvcCwgc3RhcnRdLCBzdGFydCA9IF9hWzBdLCBzdG9wID0gX2FbMV07XG4gICAgICAgICAgICBfYiA9IFtpMSwgaTBdLCBpMCA9IF9iWzBdLCBpMSA9IF9iWzFdO1xuICAgICAgICB9XG4gICAgICAgIHN0ZXAgPSB0aWNrSW5jcmVtZW50KHN0YXJ0LCBzdG9wLCBjb3VudCk7XG4gICAgICAgIGlmIChzdGVwID4gMCkge1xuICAgICAgICAgICAgc3RhcnQgPSBNYXRoLmZsb29yKHN0YXJ0IC8gc3RlcCkgKiBzdGVwO1xuICAgICAgICAgICAgc3RvcCA9IE1hdGguY2VpbChzdG9wIC8gc3RlcCkgKiBzdGVwO1xuICAgICAgICAgICAgc3RlcCA9IHRpY2tJbmNyZW1lbnQoc3RhcnQsIHN0b3AsIGNvdW50KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzdGVwIDwgMCkge1xuICAgICAgICAgICAgc3RhcnQgPSBNYXRoLmNlaWwoc3RhcnQgKiBzdGVwKSAvIHN0ZXA7XG4gICAgICAgICAgICBzdG9wID0gTWF0aC5mbG9vcihzdG9wICogc3RlcCkgLyBzdGVwO1xuICAgICAgICAgICAgc3RlcCA9IHRpY2tJbmNyZW1lbnQoc3RhcnQsIHN0b3AsIGNvdW50KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RlcCA+IDApIHtcbiAgICAgICAgICAgIGRbaTBdID0gTWF0aC5mbG9vcihzdGFydCAvIHN0ZXApICogc3RlcDtcbiAgICAgICAgICAgIGRbaTFdID0gTWF0aC5jZWlsKHN0b3AgLyBzdGVwKSAqIHN0ZXA7XG4gICAgICAgICAgICB0aGlzLmRvbWFpbihkKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzdGVwIDwgMCkge1xuICAgICAgICAgICAgZFtpMF0gPSBNYXRoLmNlaWwoc3RhcnQgKiBzdGVwKSAvIHN0ZXA7XG4gICAgICAgICAgICBkW2kxXSA9IE1hdGguZmxvb3Ioc3RvcCAqIHN0ZXApIC8gc3RlcDtcbiAgICAgICAgICAgIHRoaXMuZG9tYWluKGQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgRDNMaW5lYXIucHJvdG90eXBlLnRpY2tzID0gZnVuY3Rpb24gKGNvdW50KSB7XG4gICAgICAgIGlmIChjb3VudCA9PT0gdm9pZCAwKSB7IGNvdW50ID0gREVGQVVMVF9DT1VOVDsgfVxuICAgICAgICByZXR1cm4gZDNBcnJheVRpY2tzKHRoaXMuX2RvbWFpblswXSwgdGhpcy5fZG9tYWluW3RoaXMuX2RvbWFpbi5sZW5ndGggLSAxXSwgY291bnQgfHwgREVGQVVMVF9DT1VOVCk7XG4gICAgfTtcbiAgICByZXR1cm4gRDNMaW5lYXI7XG59KCkpO1xuZXhwb3J0IHsgRDNMaW5lYXIgfTtcbmZ1bmN0aW9uIGQzQXJyYXlUaWNrcyhzdGFydCwgc3RvcCwgY291bnQpIHtcbiAgICB2YXIgcmV2ZXJzZTtcbiAgICB2YXIgaSA9IC0xO1xuICAgIHZhciBuO1xuICAgIHZhciB0aWNrcztcbiAgICB2YXIgc3RlcDtcbiAgICAoc3RvcCA9ICtzdG9wKSwgKHN0YXJ0ID0gK3N0YXJ0KSwgKGNvdW50ID0gK2NvdW50KTtcbiAgICBpZiAoc3RhcnQgPT09IHN0b3AgJiYgY291bnQgPiAwKSB7XG4gICAgICAgIHJldHVybiBbc3RhcnRdO1xuICAgIH1cbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmVcbiAgICBpZiAoKHJldmVyc2UgPSBzdG9wIDwgc3RhcnQpKSB7XG4gICAgICAgIChuID0gc3RhcnQpLCAoc3RhcnQgPSBzdG9wKSwgKHN0b3AgPSBuKTtcbiAgICB9XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lXG4gICAgaWYgKChzdGVwID0gdGlja0luY3JlbWVudChzdGFydCwgc3RvcCwgY291bnQpKSA9PT0gMCB8fCAhaXNGaW5pdGUoc3RlcCkpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBpZiAoc3RlcCA+IDApIHtcbiAgICAgICAgc3RhcnQgPSBNYXRoLmNlaWwoc3RhcnQgLyBzdGVwKTtcbiAgICAgICAgc3RvcCA9IE1hdGguZmxvb3Ioc3RvcCAvIHN0ZXApO1xuICAgICAgICB0aWNrcyA9IG5ldyBBcnJheSgobiA9IE1hdGguY2VpbChzdG9wIC0gc3RhcnQgKyAxKSkpO1xuICAgICAgICB3aGlsZSAoKytpIDwgbikge1xuICAgICAgICAgICAgdGlja3NbaV0gPSAoc3RhcnQgKyBpKSAqIHN0ZXA7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHN0YXJ0ID0gTWF0aC5mbG9vcihzdGFydCAqIHN0ZXApO1xuICAgICAgICBzdG9wID0gTWF0aC5jZWlsKHN0b3AgKiBzdGVwKTtcbiAgICAgICAgdGlja3MgPSBuZXcgQXJyYXkoKG4gPSBNYXRoLmNlaWwoc3RhcnQgLSBzdG9wICsgMSkpKTtcbiAgICAgICAgd2hpbGUgKCsraSA8IG4pIHtcbiAgICAgICAgICAgIHRpY2tzW2ldID0gKHN0YXJ0IC0gaSkgLyBzdGVwO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChyZXZlcnNlKSB7XG4gICAgICAgIHRpY2tzLnJldmVyc2UoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRpY2tzO1xufVxuZnVuY3Rpb24gdGlja0luY3JlbWVudChzdGFydCwgc3RvcCwgY291bnQpIHtcbiAgICB2YXIgc3RlcCA9IChzdG9wIC0gc3RhcnQpIC8gTWF0aC5tYXgoMCwgY291bnQpO1xuICAgIHZhciBwb3dlciA9IE1hdGguZmxvb3IoTWF0aC5sb2coc3RlcCkgLyBNYXRoLkxOMTApO1xuICAgIHZhciBlcnJvciA9IHN0ZXAgLyBNYXRoLnBvdygxMCwgcG93ZXIpO1xuICAgIHJldHVybiBwb3dlciA+PSAwXG4gICAgICAgID8gKGVycm9yID49IGUxMCA/IDEwIDogZXJyb3IgPj0gZTUgPyA1IDogZXJyb3IgPj0gZTIgPyAyIDogMSkgKiBNYXRoLnBvdygxMCwgcG93ZXIpXG4gICAgICAgIDogLU1hdGgucG93KDEwLCAtcG93ZXIpIC8gKGVycm9yID49IGUxMCA/IDEwIDogZXJyb3IgPj0gZTUgPyA1IDogZXJyb3IgPj0gZTIgPyAyIDogMSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kMy1saW5lYXIuanMubWFwIiwiaW1wb3J0IHsgZml4ZWRCYXNlIH0gZnJvbSAnQGFudHYvdXRpbCc7XG5mdW5jdGlvbiBzbmFwTXVsdGlwbGUodiwgYmFzZSwgc25hcFR5cGUpIHtcbiAgICB2YXIgZGl2O1xuICAgIGlmIChzbmFwVHlwZSA9PT0gJ2NlaWwnKSB7XG4gICAgICAgIGRpdiA9IE1hdGguY2VpbCh2IC8gYmFzZSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHNuYXBUeXBlID09PSAnZmxvb3InKSB7XG4gICAgICAgIGRpdiA9IE1hdGguZmxvb3IodiAvIGJhc2UpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgZGl2ID0gTWF0aC5yb3VuZCh2IC8gYmFzZSk7XG4gICAgfVxuICAgIHJldHVybiBkaXYgKiBiYXNlO1xufVxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaW50ZXJ2YWxUaWNrcyhtaW4sIG1heCwgaW50ZXJ2YWwpIHtcbiAgICAvLyDlj5jmiJAgaW50ZXJ2YWwg55qE5YCN5pWwXG4gICAgdmFyIG1pblRpY2sgPSBzbmFwTXVsdGlwbGUobWluLCBpbnRlcnZhbCwgJ2Zsb29yJyk7XG4gICAgdmFyIG1heFRpY2sgPSBzbmFwTXVsdGlwbGUobWF4LCBpbnRlcnZhbCwgJ2NlaWwnKTtcbiAgICAvLyDnu5/kuIDlsI/mlbDkvY3mlbBcbiAgICBtaW5UaWNrID0gZml4ZWRCYXNlKG1pblRpY2ssIGludGVydmFsKTtcbiAgICBtYXhUaWNrID0gZml4ZWRCYXNlKG1heFRpY2ssIGludGVydmFsKTtcbiAgICB2YXIgdGlja3MgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gbWluVGljazsgaSA8PSBtYXhUaWNrOyBpID0gaSArIGludGVydmFsKSB7XG4gICAgICAgIHZhciB0aWNrVmFsdWUgPSBmaXhlZEJhc2UoaSwgaW50ZXJ2YWwpOyAvLyDpmLLmraLmta7ngrnmlbDliqDms5Xlh7rnjrDpl67pophcbiAgICAgICAgdGlja3MucHVzaCh0aWNrVmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBtaW46IG1pblRpY2ssXG4gICAgICAgIG1heDogbWF4VGljayxcbiAgICAgICAgdGlja3M6IHRpY2tzXG4gICAgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWludGVydmFsLmpzLm1hcCIsImltcG9ydCB7IGlzTmlsIH0gZnJvbSAnQGFudHYvdXRpbCc7XG4vKipcbiAqIOaMieeFp+e7meWumueahCBtaW5MaW1pdC9tYXhMaW1pdC90aWNrQ291bnQg5Z2H5YyA6K6h566X5Ye65Yi75bqmIHRpY2tzXG4gKlxuICogQHBhcmFtIGNmZyBTY2FsZSDphY3nva7poblcbiAqIEByZXR1cm4gdGlja3NcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc3RyaWN0TGltaXQoY2ZnLCBkZWZhdWx0TWluLCBkZWZhdWx0TWF4KSB7XG4gICAgdmFyIF9hO1xuICAgIHZhciBtaW5MaW1pdCA9IGNmZy5taW5MaW1pdCwgbWF4TGltaXQgPSBjZmcubWF4TGltaXQsIG1pbiA9IGNmZy5taW4sIG1heCA9IGNmZy5tYXgsIF9iID0gY2ZnLnRpY2tDb3VudCwgdGlja0NvdW50ID0gX2IgPT09IHZvaWQgMCA/IDUgOiBfYjtcbiAgICB2YXIgdGlja01pbiA9IGlzTmlsKG1pbkxpbWl0KSA/IChpc05pbChkZWZhdWx0TWluKSA/IG1pbiA6IGRlZmF1bHRNaW4pIDogbWluTGltaXQ7XG4gICAgdmFyIHRpY2tNYXggPSBpc05pbChtYXhMaW1pdCkgPyAoaXNOaWwoZGVmYXVsdE1heCkgPyBtYXggOiBkZWZhdWx0TWF4KSA6IG1heExpbWl0O1xuICAgIGlmICh0aWNrTWluID4gdGlja01heCkge1xuICAgICAgICBfYSA9IFt0aWNrTWluLCB0aWNrTWF4XSwgdGlja01heCA9IF9hWzBdLCB0aWNrTWluID0gX2FbMV07XG4gICAgfVxuICAgIGlmICh0aWNrQ291bnQgPD0gMikge1xuICAgICAgICByZXR1cm4gW3RpY2tNaW4sIHRpY2tNYXhdO1xuICAgIH1cbiAgICB2YXIgc3RlcCA9ICh0aWNrTWF4IC0gdGlja01pbikgLyAodGlja0NvdW50IC0gMSk7XG4gICAgdmFyIHRpY2tzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aWNrQ291bnQ7IGkrKykge1xuICAgICAgICB0aWNrcy5wdXNoKHRpY2tNaW4gKyBzdGVwICogaSk7XG4gICAgfVxuICAgIHJldHVybiB0aWNrcztcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXN0cmljdC1saW1pdC5qcy5tYXAiLCJpbXBvcnQgeyBoZWFkLCBpc05pbCwgbGFzdCB9IGZyb20gJ0BhbnR2L3V0aWwnO1xuaW1wb3J0IGQzTGluZWFyIGZyb20gJy4uL3V0aWwvZDMtbGluZWFyJztcbmltcG9ydCBpbnRlcnZhbCBmcm9tICcuLi91dGlsL2ludGVydmFsJztcbmltcG9ydCBzdHJpY3RMaW1pdCBmcm9tICcuLi91dGlsL3N0cmljdC1saW1pdCc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBkM0xpbmVhclRpY2tNZXRob2QoY2ZnKSB7XG4gICAgdmFyIG1pbiA9IGNmZy5taW4sIG1heCA9IGNmZy5tYXgsIHRpY2tJbnRlcnZhbCA9IGNmZy50aWNrSW50ZXJ2YWwsIG1pbkxpbWl0ID0gY2ZnLm1pbkxpbWl0LCBtYXhMaW1pdCA9IGNmZy5tYXhMaW1pdDtcbiAgICB2YXIgdGlja3MgPSBkM0xpbmVhcihjZmcpO1xuICAgIGlmICghaXNOaWwobWluTGltaXQpIHx8ICFpc05pbChtYXhMaW1pdCkpIHtcbiAgICAgICAgcmV0dXJuIHN0cmljdExpbWl0KGNmZywgaGVhZCh0aWNrcyksIGxhc3QodGlja3MpKTtcbiAgICB9XG4gICAgaWYgKHRpY2tJbnRlcnZhbCkge1xuICAgICAgICByZXR1cm4gaW50ZXJ2YWwobWluLCBtYXgsIHRpY2tJbnRlcnZhbCkudGlja3M7XG4gICAgfVxuICAgIHJldHVybiB0aWNrcztcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWQzLWxpbmVhci5qcy5tYXAiLCJpbXBvcnQgeyBoZWFkLCBpc05pbCwgbGFzdCB9IGZyb20gJ0BhbnR2L3V0aWwnO1xuaW1wb3J0IGV4dGVuZGVkIGZyb20gJy4uL3V0aWwvZXh0ZW5kZWQnO1xuaW1wb3J0IGludGVydmFsIGZyb20gJy4uL3V0aWwvaW50ZXJ2YWwnO1xuaW1wb3J0IHN0cmljdExpbWl0IGZyb20gJy4uL3V0aWwvc3RyaWN0LWxpbWl0Jztcbi8qKlxuICog6K6h566X57q/5oCn55qEIHRpY2tz77yM5L2/55SoIHdpbGtpbnNvbiBleHRlbmRlZCDmlrnms5VcbiAqIEBwYXJhbSBjZmcg5bqm6YeP55qE6YWN572u6aG5XG4gKiBAcmV0dXJucyDorqHnrpflkI7nmoQgdGlja3NcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbGluZWFyKGNmZykge1xuICAgIHZhciBtaW4gPSBjZmcubWluLCBtYXggPSBjZmcubWF4LCB0aWNrQ291bnQgPSBjZmcudGlja0NvdW50LCBuaWNlID0gY2ZnLm5pY2UsIHRpY2tJbnRlcnZhbCA9IGNmZy50aWNrSW50ZXJ2YWwsIG1pbkxpbWl0ID0gY2ZnLm1pbkxpbWl0LCBtYXhMaW1pdCA9IGNmZy5tYXhMaW1pdDtcbiAgICB2YXIgdGlja3MgPSBleHRlbmRlZChtaW4sIG1heCwgdGlja0NvdW50LCBuaWNlKS50aWNrcztcbiAgICBpZiAoIWlzTmlsKG1pbkxpbWl0KSB8fCAhaXNOaWwobWF4TGltaXQpKSB7XG4gICAgICAgIHJldHVybiBzdHJpY3RMaW1pdChjZmcsIGhlYWQodGlja3MpLCBsYXN0KHRpY2tzKSk7XG4gICAgfVxuICAgIGlmICh0aWNrSW50ZXJ2YWwpIHtcbiAgICAgICAgcmV0dXJuIGludGVydmFsKG1pbiwgbWF4LCB0aWNrSW50ZXJ2YWwpLnRpY2tzO1xuICAgIH1cbiAgICByZXR1cm4gdGlja3M7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1saW5lYXIuanMubWFwIiwiaW1wb3J0IHsgZ2V0TG9nUG9zaXRpdmVNaW4sIGxvZyB9IGZyb20gJy4uL3V0aWwvbWF0aCc7XG4vKipcbiAqIOiuoeeulyBsb2cg55qEIHRpY2tz77yM6ICD6JmRIG1pbiA9IDAg55qE5Zy65pmvXG4gKiBAcGFyYW0gY2ZnIOW6pumHj+eahOmFjee9rumhuVxuICogQHJldHVybnMg6K6h566X5ZCO55qEIHRpY2tzXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNhbGN1bGF0ZUxvZ1RpY2tzKGNmZykge1xuICAgIHZhciBiYXNlID0gY2ZnLmJhc2UsIHRpY2tDb3VudCA9IGNmZy50aWNrQ291bnQsIG1pbiA9IGNmZy5taW4sIG1heCA9IGNmZy5tYXgsIHZhbHVlcyA9IGNmZy52YWx1ZXM7XG4gICAgdmFyIG1pblRpY2s7XG4gICAgdmFyIG1heFRpY2sgPSBsb2coYmFzZSwgbWF4KTtcbiAgICBpZiAobWluID4gMCkge1xuICAgICAgICBtaW5UaWNrID0gTWF0aC5mbG9vcihsb2coYmFzZSwgbWluKSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB2YXIgcG9zaXRpdmVNaW4gPSBnZXRMb2dQb3NpdGl2ZU1pbih2YWx1ZXMsIGJhc2UsIG1heCk7XG4gICAgICAgIG1pblRpY2sgPSBNYXRoLmZsb29yKGxvZyhiYXNlLCBwb3NpdGl2ZU1pbikpO1xuICAgIH1cbiAgICB2YXIgY291bnQgPSBtYXhUaWNrIC0gbWluVGljaztcbiAgICB2YXIgYXZnID0gTWF0aC5jZWlsKGNvdW50IC8gdGlja0NvdW50KTtcbiAgICB2YXIgdGlja3MgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gbWluVGljazsgaSA8IG1heFRpY2sgKyBhdmc7IGkgPSBpICsgYXZnKSB7XG4gICAgICAgIHRpY2tzLnB1c2goTWF0aC5wb3coYmFzZSwgaSkpO1xuICAgIH1cbiAgICBpZiAobWluIDw9IDApIHtcbiAgICAgICAgLy8g5pyA5bCP5YC8IDw9IDAg5pe25pi+56S6IDBcbiAgICAgICAgdGlja3MudW5zaGlmdCgwKTtcbiAgICB9XG4gICAgcmV0dXJuIHRpY2tzO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bG9nLmpzLm1hcCIsImltcG9ydCB7IHByZXR0eU51bWJlciB9IGZyb20gJy4vcHJldHR5LW51bWJlcic7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBwcmV0dHkobWluLCBtYXgsIG0pIHtcbiAgICBpZiAobSA9PT0gdm9pZCAwKSB7IG0gPSA1OyB9XG4gICAgaWYgKG1pbiA9PT0gbWF4KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBtYXg6IG1heCxcbiAgICAgICAgICAgIG1pbjogbWluLFxuICAgICAgICAgICAgdGlja3M6IFttaW5dLFxuICAgICAgICB9O1xuICAgIH1cbiAgICB2YXIgbiA9IG0gPCAwID8gMCA6IE1hdGgucm91bmQobSk7XG4gICAgaWYgKG4gPT09IDApXG4gICAgICAgIHJldHVybiB7IG1heDogbWF4LCBtaW46IG1pbiwgdGlja3M6IFtdIH07XG4gICAgLypcbiAgICAgIFIgcHJldHR5OlxuICAgICAgaHR0cHM6Ly9zdm4uci1wcm9qZWN0Lm9yZy9SL3RydW5rL3NyYy9hcHBsL3ByZXR0eS5jXG4gICAgICBodHRwczovL3d3dy5yZG9jdW1lbnRhdGlvbi5vcmcvcGFja2FnZXMvYmFzZS92ZXJzaW9ucy8zLjUuMi90b3BpY3MvcHJldHR5XG4gICAgICAqL1xuICAgIHZhciBoID0gMS41OyAvLyBoaWdoLnUuYmlhc1xuICAgIHZhciBoNSA9IDAuNSArIDEuNSAqIGg7IC8vIHU1LmJpYXNcbiAgICAvLyDlj43mraPmiJHkuZ/kuI3kvJrosIPlj4LvvIzot7Pov4fmiYDmnInliKTmlq3mraXpqqRcbiAgICB2YXIgZCA9IG1heCAtIG1pbjtcbiAgICB2YXIgYyA9IGQgLyBuO1xuICAgIC8vIOW9k2TpnZ7luLjlsI/nmoTml7blgJnop6blj5HvvIzkvYbkvLzkuY7msqHku4DkuYjnlKhcbiAgICAvLyBjb25zdCBtaW5fbiA9IE1hdGguZmxvb3IobiAvIDMpO1xuICAgIC8vIGNvbnN0IHNocmlua19zbWwgPSBNYXRoLnBvdygyLCA1KTtcbiAgICAvLyBpZiAoTWF0aC5sb2cxMChkKSA8IC0yKSB7XG4gICAgLy8gICBjID0gKF8ubWF4KFsgTWF0aC5hYnMobWF4KSwgTWF0aC5hYnMobWluKSBdKSAqIHNocmlua19zbWwpIC8gbWluX247XG4gICAgLy8gfVxuICAgIHZhciBiYXNlID0gTWF0aC5wb3coMTAsIE1hdGguZmxvb3IoTWF0aC5sb2cxMChjKSkpO1xuICAgIHZhciB1bml0ID0gYmFzZTtcbiAgICBpZiAoMiAqIGJhc2UgLSBjIDwgaCAqIChjIC0gdW5pdCkpIHtcbiAgICAgICAgdW5pdCA9IDIgKiBiYXNlO1xuICAgICAgICBpZiAoNSAqIGJhc2UgLSBjIDwgaDUgKiAoYyAtIHVuaXQpKSB7XG4gICAgICAgICAgICB1bml0ID0gNSAqIGJhc2U7XG4gICAgICAgICAgICBpZiAoMTAgKiBiYXNlIC0gYyA8IGggKiAoYyAtIHVuaXQpKSB7XG4gICAgICAgICAgICAgICAgdW5pdCA9IDEwICogYmFzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICB2YXIgbnUgPSBNYXRoLmNlaWwobWF4IC8gdW5pdCk7XG4gICAgdmFyIG5zID0gTWF0aC5mbG9vcihtaW4gLyB1bml0KTtcbiAgICB2YXIgaGkgPSBNYXRoLm1heChudSAqIHVuaXQsIG1heCk7XG4gICAgdmFyIGxvID0gTWF0aC5taW4obnMgKiB1bml0LCBtaW4pO1xuICAgIHZhciBzaXplID0gTWF0aC5mbG9vcigoaGkgLSBsbykgLyB1bml0KSArIDE7XG4gICAgdmFyIHRpY2tzID0gbmV3IEFycmF5KHNpemUpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7XG4gICAgICAgIHRpY2tzW2ldID0gcHJldHR5TnVtYmVyKGxvICsgaSAqIHVuaXQpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBtaW46IGxvLFxuICAgICAgICBtYXg6IGhpLFxuICAgICAgICB0aWNrczogdGlja3MsXG4gICAgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXByZXR0eS5qcy5tYXAiLCJpbXBvcnQgeyBjYWxCYXNlIH0gZnJvbSAnLi4vdXRpbC9tYXRoJztcbmltcG9ydCBwcmV0dHkgZnJvbSAnLi4vdXRpbC9wcmV0dHknO1xuLyoqXG4gKiDorqHnrpcgUG93IOeahCB0aWNrc1xuICogQHBhcmFtIGNmZyDluqbph4/nmoTphY3nva7poblcbiAqIEByZXR1cm5zIOiuoeeul+WQjueahCB0aWNrc1xuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjYWxjdWxhdGVQb3dUaWNrcyhjZmcpIHtcbiAgICB2YXIgZXhwb25lbnQgPSBjZmcuZXhwb25lbnQsIHRpY2tDb3VudCA9IGNmZy50aWNrQ291bnQ7XG4gICAgdmFyIG1heCA9IE1hdGguY2VpbChjYWxCYXNlKGV4cG9uZW50LCBjZmcubWF4KSk7XG4gICAgdmFyIG1pbiA9IE1hdGguZmxvb3IoY2FsQmFzZShleHBvbmVudCwgY2ZnLm1pbikpO1xuICAgIHZhciB0aWNrcyA9IHByZXR0eShtaW4sIG1heCwgdGlja0NvdW50KS50aWNrcztcbiAgICByZXR1cm4gdGlja3MubWFwKGZ1bmN0aW9uICh0aWNrKSB7XG4gICAgICAgIHZhciBmYWN0b3IgPSB0aWNrID49IDAgPyAxIDogLTE7XG4gICAgICAgIHJldHVybiBNYXRoLnBvdyh0aWNrLCBleHBvbmVudCkgKiBmYWN0b3I7XG4gICAgfSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wb3cuanMubWFwIiwiLyoqXG4gKiDorqHnrpflh6DliIbkvY0gaHR0cHM6Ly9naXRodWIuY29tL3NpbXBsZS1zdGF0aXN0aWNzL3NpbXBsZS1zdGF0aXN0aWNzL2Jsb2IvbWFzdGVyL3NyYy9xdWFudGlsZV9zb3J0ZWQuanNcbiAqIEBwYXJhbSB4ICDmlbDnu4RcbiAqIEBwYXJhbSBwICDnmb7liIbmr5RcbiAqL1xuZnVuY3Rpb24gcXVhbnRpbGVTb3J0ZWQoeCwgcCkge1xuICAgIHZhciBpZHggPSB4Lmxlbmd0aCAqIHA7XG4gICAgLyppZiAoeC5sZW5ndGggPT09IDApIHsgLy8g5b2T5YmN5Zy65pmv6L+Z5Lqb5p2h5Lu25LiN5Y+v6IO95ZG95LitXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3F1YW50aWxlIHJlcXVpcmVzIGF0IGxlYXN0IG9uZSB2YWx1ZS4nKTtcbiAgICB9IGVsc2UgaWYgKHAgPCAwIHx8IHAgPiAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3F1YW50aWxlcyBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMScpO1xuICAgIH0gZWxzZSAqL1xuICAgIGlmIChwID09PSAxKSB7XG4gICAgICAgIC8vIElmIHAgaXMgMSwgZGlyZWN0bHkgcmV0dXJuIHRoZSBsYXN0IGVsZW1lbnRcbiAgICAgICAgcmV0dXJuIHhbeC5sZW5ndGggLSAxXTtcbiAgICB9XG4gICAgZWxzZSBpZiAocCA9PT0gMCkge1xuICAgICAgICAvLyBJZiBwIGlzIDAsIGRpcmVjdGx5IHJldHVybiB0aGUgZmlyc3QgZWxlbWVudFxuICAgICAgICByZXR1cm4geFswXTtcbiAgICB9XG4gICAgZWxzZSBpZiAoaWR4ICUgMSAhPT0gMCkge1xuICAgICAgICAvLyBJZiBwIGlzIG5vdCBpbnRlZ2VyLCByZXR1cm4gdGhlIG5leHQgZWxlbWVudCBpbiBhcnJheVxuICAgICAgICByZXR1cm4geFtNYXRoLmNlaWwoaWR4KSAtIDFdO1xuICAgIH1cbiAgICBlbHNlIGlmICh4Lmxlbmd0aCAlIDIgPT09IDApIHtcbiAgICAgICAgLy8gSWYgdGhlIGxpc3QgaGFzIGV2ZW4tbGVuZ3RoLCB3ZSdsbCB0YWtlIHRoZSBhdmVyYWdlIG9mIHRoaXMgbnVtYmVyXG4gICAgICAgIC8vIGFuZCB0aGUgbmV4dCB2YWx1ZSwgaWYgdGhlcmUgaXMgb25lXG4gICAgICAgIHJldHVybiAoeFtpZHggLSAxXSArIHhbaWR4XSkgLyAyO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgLy8gRmluYWxseSwgaW4gdGhlIHNpbXBsZSBjYXNlIG9mIGFuIGludGVnZXIgdmFsdWVcbiAgICAgICAgLy8gd2l0aCBhbiBvZGQtbGVuZ3RoIGxpc3QsIHJldHVybiB0aGUgeCB2YWx1ZSBhdCB0aGUgaW5kZXguXG4gICAgICAgIHJldHVybiB4W2lkeF07XG4gICAgfVxufVxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY2FsY3VsYXRlVGlja3MoY2ZnKSB7XG4gICAgdmFyIHRpY2tDb3VudCA9IGNmZy50aWNrQ291bnQsIHZhbHVlcyA9IGNmZy52YWx1ZXM7XG4gICAgaWYgKCF2YWx1ZXMgfHwgIXZhbHVlcy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICB2YXIgc29ydGVkID0gdmFsdWVzLnNsaWNlKCkuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICByZXR1cm4gYSAtIGI7XG4gICAgfSk7XG4gICAgdmFyIHRpY2tzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aWNrQ291bnQ7IGkrKykge1xuICAgICAgICB2YXIgcCA9IGkgLyAodGlja0NvdW50IC0gMSk7XG4gICAgICAgIHRpY2tzLnB1c2gocXVhbnRpbGVTb3J0ZWQoc29ydGVkLCBwKSk7XG4gICAgfVxuICAgIHJldHVybiB0aWNrcztcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXF1YW50aWxlLmpzLm1hcCIsImltcG9ydCB7IGhlYWQsIGlzTmlsLCBsYXN0IH0gZnJvbSAnQGFudHYvdXRpbCc7XG5pbXBvcnQgaW50ZXJ2YWwgZnJvbSAnLi4vdXRpbC9pbnRlcnZhbCc7XG5pbXBvcnQgcHJldHR5IGZyb20gJy4uL3V0aWwvcHJldHR5JztcbmltcG9ydCBzdHJpY3RMaW1pdCBmcm9tICcuLi91dGlsL3N0cmljdC1saW1pdCc7XG4vKipcbiAqIOiuoeeul+e6v+aAp+eahCB0aWNrc++8jOS9v+eUqCBSJ3MgcHJldHR5IOaWueazlVxuICogQHBhcmFtIGNmZyDluqbph4/nmoTphY3nva7poblcbiAqIEByZXR1cm5zIOiuoeeul+WQjueahCB0aWNrc1xuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBsaW5lYXJQcmV0dHkoY2ZnKSB7XG4gICAgdmFyIG1pbiA9IGNmZy5taW4sIG1heCA9IGNmZy5tYXgsIHRpY2tDb3VudCA9IGNmZy50aWNrQ291bnQsIHRpY2tJbnRlcnZhbCA9IGNmZy50aWNrSW50ZXJ2YWwsIG1pbkxpbWl0ID0gY2ZnLm1pbkxpbWl0LCBtYXhMaW1pdCA9IGNmZy5tYXhMaW1pdDtcbiAgICB2YXIgdGlja3MgPSBwcmV0dHkobWluLCBtYXgsIHRpY2tDb3VudCkudGlja3M7XG4gICAgaWYgKCFpc05pbChtaW5MaW1pdCkgfHwgIWlzTmlsKG1heExpbWl0KSkge1xuICAgICAgICByZXR1cm4gc3RyaWN0TGltaXQoY2ZnLCBoZWFkKHRpY2tzKSwgbGFzdCh0aWNrcykpO1xuICAgIH1cbiAgICBpZiAodGlja0ludGVydmFsKSB7XG4gICAgICAgIHJldHVybiBpbnRlcnZhbChtaW4sIG1heCwgdGlja0ludGVydmFsKS50aWNrcztcbiAgICB9XG4gICAgcmV0dXJuIHRpY2tzO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ci1wcmV0dHJ5LmpzLm1hcCIsImltcG9ydCB7IGdldFRpY2tJbnRlcnZhbCB9IGZyb20gJy4uL3V0aWwvdGltZSc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjYWxjdWxhdGVUaW1lVGlja3MoY2ZnKSB7XG4gICAgdmFyIG1pbiA9IGNmZy5taW4sIG1heCA9IGNmZy5tYXgsIG1pblRpY2tJbnRlcnZhbCA9IGNmZy5taW5UaWNrSW50ZXJ2YWw7XG4gICAgdmFyIHRpY2tJbnRlcnZhbCA9IGNmZy50aWNrSW50ZXJ2YWw7XG4gICAgdmFyIHRpY2tDb3VudCA9IGNmZy50aWNrQ291bnQ7XG4gICAgLy8g5oyH5a6aIHRpY2tJbnRlcnZhbCDlkI4gdGlja0NvdW50IOS4jeeUn+aViO+8jOmcgOimgemHjeaWsOiuoeeul1xuICAgIGlmICh0aWNrSW50ZXJ2YWwpIHtcbiAgICAgICAgdGlja0NvdW50ID0gTWF0aC5jZWlsKChtYXggLSBtaW4pIC8gdGlja0ludGVydmFsKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHRpY2tJbnRlcnZhbCA9IGdldFRpY2tJbnRlcnZhbChtaW4sIG1heCwgdGlja0NvdW50KVsxXTtcbiAgICAgICAgdmFyIGNvdW50ID0gKG1heCAtIG1pbikgLyB0aWNrSW50ZXJ2YWw7XG4gICAgICAgIHZhciByYXRpbyA9IGNvdW50IC8gdGlja0NvdW50O1xuICAgICAgICBpZiAocmF0aW8gPiAxKSB7XG4gICAgICAgICAgICB0aWNrSW50ZXJ2YWwgPSB0aWNrSW50ZXJ2YWwgKiBNYXRoLmNlaWwocmF0aW8pO1xuICAgICAgICB9XG4gICAgICAgIC8vIOWmguaenOiuvue9ruS6huacgOWwj+mXtOi3ne+8jOWImeS9v+eUqOacgOWwj+mXtOi3nVxuICAgICAgICBpZiAobWluVGlja0ludGVydmFsICYmIHRpY2tJbnRlcnZhbCA8IG1pblRpY2tJbnRlcnZhbCkge1xuICAgICAgICAgICAgdGlja0ludGVydmFsID0gbWluVGlja0ludGVydmFsO1xuICAgICAgICB9XG4gICAgfVxuICAgIHZhciB0aWNrcyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSBtaW47IGkgPCBtYXggKyB0aWNrSW50ZXJ2YWw7IGkgKz0gdGlja0ludGVydmFsKSB7XG4gICAgICAgIHRpY2tzLnB1c2goaSk7XG4gICAgfVxuICAgIHJldHVybiB0aWNrcztcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRpbWUuanMubWFwIiwiaW1wb3J0IHsgbGFzdCB9IGZyb20gJ0BhbnR2L3V0aWwnO1xuaW1wb3J0IGNhdFRpY2tzIGZyb20gJy4vY2F0Jztcbi8qKlxuICog6K6h566X5pe26Ze05YiG57G755qEIHRpY2tzLCDkv53lpLTvvIzkv53lsL5cbiAqIEBwYXJhbSBjZmcg5bqm6YeP55qE6YWN572u6aG5XG4gKiBAcmV0dXJucyDorqHnrpflkI7nmoQgdGlja3NcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY2FsY3VsYXRlVGltZUNhdFRpY2tzKGNmZykge1xuICAgIHZhciB0aWNrcyA9IGNhdFRpY2tzKGNmZyk7XG4gICAgdmFyIGxhc3RWYWx1ZSA9IGxhc3QoY2ZnLnZhbHVlcyk7XG4gICAgaWYgKGxhc3RWYWx1ZSAhPT0gbGFzdCh0aWNrcykpIHtcbiAgICAgICAgdGlja3MucHVzaChsYXN0VmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gdGlja3M7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD10aW1lLWNhdC5qcy5tYXAiLCJpbXBvcnQgeyBEQVksIEhPVVIsIE1JTlVURSwgTU9OVEgsIFNFQ09ORCwgWUVBUiB9IGZyb20gJy4uL3V0aWwvdGltZSc7XG5mdW5jdGlvbiBnZXRZZWFyKGRhdGUpIHtcbiAgICByZXR1cm4gbmV3IERhdGUoZGF0ZSkuZ2V0RnVsbFllYXIoKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVllYXIoeWVhcikge1xuICAgIHJldHVybiBuZXcgRGF0ZSh5ZWFyLCAwLCAxKS5nZXRUaW1lKCk7XG59XG5mdW5jdGlvbiBnZXRNb250aChkYXRlKSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKGRhdGUpLmdldE1vbnRoKCk7XG59XG5mdW5jdGlvbiBkaWZmTW9udGgobWluLCBtYXgpIHtcbiAgICB2YXIgbWluWWVhciA9IGdldFllYXIobWluKTtcbiAgICB2YXIgbWF4WWVhciA9IGdldFllYXIobWF4KTtcbiAgICB2YXIgbWluTW9udGggPSBnZXRNb250aChtaW4pO1xuICAgIHZhciBtYXhNb250aCA9IGdldE1vbnRoKG1heCk7XG4gICAgcmV0dXJuIChtYXhZZWFyIC0gbWluWWVhcikgKiAxMiArICgobWF4TW9udGggLSBtaW5Nb250aCkgJSAxMik7XG59XG5mdW5jdGlvbiBjcmVhdE1vbnRoKHllYXIsIG1vbnRoKSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKHllYXIsIG1vbnRoLCAxKS5nZXRUaW1lKCk7XG59XG5mdW5jdGlvbiBkaWZmRGF5KG1pbiwgbWF4KSB7XG4gICAgcmV0dXJuIE1hdGguY2VpbCgobWF4IC0gbWluKSAvIERBWSk7XG59XG5mdW5jdGlvbiBkaWZmSG91cihtaW4sIG1heCkge1xuICAgIHJldHVybiBNYXRoLmNlaWwoKG1heCAtIG1pbikgLyBIT1VSKTtcbn1cbmZ1bmN0aW9uIGRpZmZNaW51cyhtaW4sIG1heCkge1xuICAgIHJldHVybiBNYXRoLmNlaWwoKG1heCAtIG1pbikgLyAoNjAgKiAxMDAwKSk7XG59XG4vKipcbiAqIOiuoeeulyB0aW1lIOeahCB0aWNrc++8jOWvuSBtb250aCwgeWVhciDov5vooYwgcHJldHR5IOWkhOeQhlxuICogQHBhcmFtIGNmZyDluqbph4/nmoTphY3nva7poblcbiAqIEByZXR1cm5zIOiuoeeul+WQjueahCB0aWNrc1xuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB0aW1lUHJldHR5KGNmZykge1xuICAgIHZhciBtaW4gPSBjZmcubWluLCBtYXggPSBjZmcubWF4LCBtaW5UaWNrSW50ZXJ2YWwgPSBjZmcubWluVGlja0ludGVydmFsLCB0aWNrQ291bnQgPSBjZmcudGlja0NvdW50O1xuICAgIHZhciB0aWNrSW50ZXJ2YWwgPSBjZmcudGlja0ludGVydmFsO1xuICAgIHZhciB0aWNrcyA9IFtdO1xuICAgIC8vIOaMh+WumiB0aWNrSW50ZXJ2YWwg5ZCOIHRpY2tDb3VudCDkuI3nlJ/mlYjvvIzpnIDopoHph43mlrDorqHnrpdcbiAgICBpZiAoIXRpY2tJbnRlcnZhbCkge1xuICAgICAgICB0aWNrSW50ZXJ2YWwgPSAobWF4IC0gbWluKSAvIHRpY2tDb3VudDtcbiAgICAgICAgLy8g5aaC5p6c6K6+572u5LqG5pyA5bCP6Ze06Led77yM5YiZ5L2/55So5pyA5bCP6Ze06LedXG4gICAgICAgIGlmIChtaW5UaWNrSW50ZXJ2YWwgJiYgdGlja0ludGVydmFsIDwgbWluVGlja0ludGVydmFsKSB7XG4gICAgICAgICAgICB0aWNrSW50ZXJ2YWwgPSBtaW5UaWNrSW50ZXJ2YWw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmFyIG1pblllYXIgPSBnZXRZZWFyKG1pbik7XG4gICAgLy8g5aaC5p6c6Ze06Led5aSn5LqOIDEg5bm077yM5YiZ5bCG5byA5aeL5pel5pyf5LuO5pW05bm05byA5aeLXG4gICAgaWYgKHRpY2tJbnRlcnZhbCA+IFlFQVIpIHtcbiAgICAgICAgdmFyIG1heFllYXIgPSBnZXRZZWFyKG1heCk7XG4gICAgICAgIHZhciB5ZWFySW50ZXJ2YWwgPSBNYXRoLmNlaWwodGlja0ludGVydmFsIC8gWUVBUik7XG4gICAgICAgIGZvciAodmFyIGkgPSBtaW5ZZWFyOyBpIDw9IG1heFllYXIgKyB5ZWFySW50ZXJ2YWw7IGkgPSBpICsgeWVhckludGVydmFsKSB7XG4gICAgICAgICAgICB0aWNrcy5wdXNoKGNyZWF0ZVllYXIoaSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKHRpY2tJbnRlcnZhbCA+IE1PTlRIKSB7XG4gICAgICAgIC8vIOWkp+S6juaciOaXtlxuICAgICAgICB2YXIgbW9udGhJbnRlcnZhbCA9IE1hdGguY2VpbCh0aWNrSW50ZXJ2YWwgLyBNT05USCk7XG4gICAgICAgIHZhciBtbU1vdGggPSBnZXRNb250aChtaW4pO1xuICAgICAgICB2YXIgZE1vbnRocyA9IGRpZmZNb250aChtaW4sIG1heCk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDw9IGRNb250aHMgKyBtb250aEludGVydmFsOyBpID0gaSArIG1vbnRoSW50ZXJ2YWwpIHtcbiAgICAgICAgICAgIHRpY2tzLnB1c2goY3JlYXRNb250aChtaW5ZZWFyLCBpICsgbW1Nb3RoKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAodGlja0ludGVydmFsID4gREFZKSB7XG4gICAgICAgIC8vIOWkp+S6juWkqVxuICAgICAgICB2YXIgZGF0ZSA9IG5ldyBEYXRlKG1pbik7XG4gICAgICAgIHZhciB5ZWFyID0gZGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgICAgICB2YXIgbW9udGggPSBkYXRlLmdldE1vbnRoKCk7XG4gICAgICAgIHZhciBtZGF5ID0gZGF0ZS5nZXREYXRlKCk7XG4gICAgICAgIHZhciBkYXkgPSBNYXRoLmNlaWwodGlja0ludGVydmFsIC8gREFZKTtcbiAgICAgICAgdmFyIGRkYXlzID0gZGlmZkRheShtaW4sIG1heCk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGRheXMgKyBkYXk7IGkgPSBpICsgZGF5KSB7XG4gICAgICAgICAgICB0aWNrcy5wdXNoKG5ldyBEYXRlKHllYXIsIG1vbnRoLCBtZGF5ICsgaSkuZ2V0VGltZSgpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmICh0aWNrSW50ZXJ2YWwgPiBIT1VSKSB7XG4gICAgICAgIC8vIOWkp+S6juWwj+aXtlxuICAgICAgICB2YXIgZGF0ZSA9IG5ldyBEYXRlKG1pbik7XG4gICAgICAgIHZhciB5ZWFyID0gZGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgICAgICB2YXIgbW9udGggPSBkYXRlLmdldE1vbnRoKCk7XG4gICAgICAgIHZhciBkYXkgPSBkYXRlLmdldERhdGUoKTtcbiAgICAgICAgdmFyIGhvdXIgPSBkYXRlLmdldEhvdXJzKCk7XG4gICAgICAgIHZhciBob3VycyA9IE1hdGguY2VpbCh0aWNrSW50ZXJ2YWwgLyBIT1VSKTtcbiAgICAgICAgdmFyIGRIb3VycyA9IGRpZmZIb3VyKG1pbiwgbWF4KTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPD0gZEhvdXJzICsgaG91cnM7IGkgPSBpICsgaG91cnMpIHtcbiAgICAgICAgICAgIHRpY2tzLnB1c2gobmV3IERhdGUoeWVhciwgbW9udGgsIGRheSwgaG91ciArIGkpLmdldFRpbWUoKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAodGlja0ludGVydmFsID4gTUlOVVRFKSB7XG4gICAgICAgIC8vIOWkp+S6juWIhumSn1xuICAgICAgICB2YXIgZE1pbnVzID0gZGlmZk1pbnVzKG1pbiwgbWF4KTtcbiAgICAgICAgdmFyIG1pbnV0ZXMgPSBNYXRoLmNlaWwodGlja0ludGVydmFsIC8gTUlOVVRFKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPD0gZE1pbnVzICsgbWludXRlczsgaSA9IGkgKyBtaW51dGVzKSB7XG4gICAgICAgICAgICB0aWNrcy5wdXNoKG1pbiArIGkgKiBNSU5VVEUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICAvLyDlsI/kuo7liIbpkp9cbiAgICAgICAgdmFyIGludGVydmFsID0gdGlja0ludGVydmFsO1xuICAgICAgICBpZiAoaW50ZXJ2YWwgPCBTRUNPTkQpIHtcbiAgICAgICAgICAgIGludGVydmFsID0gU0VDT05EO1xuICAgICAgICB9XG4gICAgICAgIHZhciBtaW5TZWNvbmQgPSBNYXRoLmZsb29yKG1pbiAvIFNFQ09ORCkgKiBTRUNPTkQ7XG4gICAgICAgIHZhciBkU2Vjb25kcyA9IE1hdGguY2VpbCgobWF4IC0gbWluKSAvIFNFQ09ORCk7XG4gICAgICAgIHZhciBzZWNvbmRzID0gTWF0aC5jZWlsKGludGVydmFsIC8gU0VDT05EKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkU2Vjb25kcyArIHNlY29uZHM7IGkgPSBpICsgc2Vjb25kcykge1xuICAgICAgICAgICAgdGlja3MucHVzaChtaW5TZWNvbmQgKyBpICogU0VDT05EKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyDmnIDlpb3mmK/og73ku47nrpfms5Xog73op6PlhrPov5nkuKrpl67popjvvIzkvYbmmK/lpoLmnpzmjIflrprkuoYgdGlja0ludGVydmFs77yM6K6h566XIHRpY2tz77yM5Lmf5Y+q6IO96L+Z5LmI566X77yM5omA5LulXG4gICAgLy8g5omT5Y2w6K2m5ZGK5o+Q56S6XG4gICAgaWYgKHRpY2tzLmxlbmd0aCA+PSA1MTIpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFwiTm90aWNlOiBjdXJyZW50IHRpY2tzIGxlbmd0aChcIiArIHRpY2tzLmxlbmd0aCArIFwiKSA+PSA1MTIsIG1heSBjYXVzZSBwZXJmb3JtYW5jZSBpc3N1ZXMsIGV2ZW4gb3V0IG9mIG1lbW9yeS4gQmVjYXVzZSBvZiB0aGUgY29uZmlndXJlIFxcXCJ0aWNrSW50ZXJ2YWxcXFwiKGluIG1pbGxpc2Vjb25kcywgY3VycmVudCBpcyBcIiArIHRpY2tJbnRlcnZhbCArIFwiKSBpcyB0b28gc21hbGwsIGluY3JlYXNlIHRoZSB2YWx1ZSB0byBzb2x2ZSB0aGUgcHJvYmxlbSFcIik7XG4gICAgfVxuICAgIHJldHVybiB0aWNrcztcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRpbWUtcHJldHR5LmpzLm1hcCIsImltcG9ydCBjYXQgZnJvbSAnLi9jYXQnO1xuaW1wb3J0IGQzTGluZWFyIGZyb20gJy4vZDMtbGluZWFyJztcbmltcG9ydCBsaW5lYXIgZnJvbSAnLi9saW5lYXInO1xuaW1wb3J0IGxvZyBmcm9tICcuL2xvZyc7XG5pbXBvcnQgcG93IGZyb20gJy4vcG93JztcbmltcG9ydCBxdWFudGlsZSBmcm9tICcuL3F1YW50aWxlJztcbmltcG9ydCByUHJldHR5IGZyb20gJy4vci1wcmV0dHJ5JztcbmltcG9ydCB7IGdldFRpY2tNZXRob2QsIHJlZ2lzdGVyVGlja01ldGhvZCB9IGZyb20gJy4vcmVnaXN0ZXInO1xuaW1wb3J0IHRpbWUgZnJvbSAnLi90aW1lJztcbmltcG9ydCB0aW1lQ2F0IGZyb20gJy4vdGltZS1jYXQnO1xuaW1wb3J0IHRpbWVQcmV0dHkgZnJvbSAnLi90aW1lLXByZXR0eSc7XG5yZWdpc3RlclRpY2tNZXRob2QoJ2NhdCcsIGNhdCk7XG5yZWdpc3RlclRpY2tNZXRob2QoJ3RpbWUtY2F0JywgdGltZUNhdCk7XG5yZWdpc3RlclRpY2tNZXRob2QoJ3dpbGtpbnNvbi1leHRlbmRlZCcsIGxpbmVhcik7XG5yZWdpc3RlclRpY2tNZXRob2QoJ3ItcHJldHR5JywgclByZXR0eSk7XG5yZWdpc3RlclRpY2tNZXRob2QoJ3RpbWUnLCB0aW1lKTtcbnJlZ2lzdGVyVGlja01ldGhvZCgndGltZS1wcmV0dHknLCB0aW1lUHJldHR5KTtcbnJlZ2lzdGVyVGlja01ldGhvZCgnbG9nJywgbG9nKTtcbnJlZ2lzdGVyVGlja01ldGhvZCgncG93JywgcG93KTtcbnJlZ2lzdGVyVGlja01ldGhvZCgncXVhbnRpbGUnLCBxdWFudGlsZSk7XG5yZWdpc3RlclRpY2tNZXRob2QoJ2QzLWxpbmVhcicsIGQzTGluZWFyKTtcbmV4cG9ydCB7IGdldFRpY2tNZXRob2QsIHJlZ2lzdGVyVGlja01ldGhvZCB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiaW1wb3J0IFNjYWxlIGZyb20gJy4vYmFzZSc7XG5pbXBvcnQgQ2F0ZWdvcnkgZnJvbSAnLi9jYXRlZ29yeS9iYXNlJztcbmltcG9ydCBUaW1lQ2F0IGZyb20gJy4vY2F0ZWdvcnkvdGltZSc7XG5pbXBvcnQgTGluZWFyIGZyb20gJy4vY29udGludW91cy9saW5lYXInO1xuaW1wb3J0IExvZyBmcm9tICcuL2NvbnRpbnVvdXMvbG9nJztcbmltcG9ydCBQb3cgZnJvbSAnLi9jb250aW51b3VzL3Bvdyc7XG5pbXBvcnQgVGltZSBmcm9tICcuL2NvbnRpbnVvdXMvdGltZSc7XG5pbXBvcnQgUXVhbnRpemUgZnJvbSAnLi9jb250aW51b3VzL3F1YW50aXplJztcbmltcG9ydCBRdWFudGlsZSBmcm9tICcuL2NvbnRpbnVvdXMvcXVhbnRpbGUnO1xuaW1wb3J0IHsgZ2V0U2NhbGUsIHJlZ2lzdGVyU2NhbGUgfSBmcm9tICcuL2ZhY3RvcnknO1xuaW1wb3J0IElkZW50aXR5IGZyb20gJy4vaWRlbnRpdHkvaW5kZXgnO1xuaW1wb3J0IHsgZ2V0VGlja01ldGhvZCwgcmVnaXN0ZXJUaWNrTWV0aG9kIH0gZnJvbSAnLi90aWNrLW1ldGhvZC9pbmRleCc7XG5yZWdpc3RlclNjYWxlKCdjYXQnLCBDYXRlZ29yeSk7XG5yZWdpc3RlclNjYWxlKCdjYXRlZ29yeScsIENhdGVnb3J5KTtcbnJlZ2lzdGVyU2NhbGUoJ2lkZW50aXR5JywgSWRlbnRpdHkpO1xucmVnaXN0ZXJTY2FsZSgnbGluZWFyJywgTGluZWFyKTtcbnJlZ2lzdGVyU2NhbGUoJ2xvZycsIExvZyk7XG5yZWdpc3RlclNjYWxlKCdwb3cnLCBQb3cpO1xucmVnaXN0ZXJTY2FsZSgndGltZScsIFRpbWUpO1xucmVnaXN0ZXJTY2FsZSgndGltZUNhdCcsIFRpbWVDYXQpO1xucmVnaXN0ZXJTY2FsZSgncXVhbnRpemUnLCBRdWFudGl6ZSk7XG5yZWdpc3RlclNjYWxlKCdxdWFudGlsZScsIFF1YW50aWxlKTtcbmV4cG9ydCB7IENhdGVnb3J5LCBJZGVudGl0eSwgTGluZWFyLCBMb2csIFBvdywgVGltZSwgVGltZUNhdCwgUXVhbnRpbGUsIFF1YW50aXplLCBTY2FsZSwgZ2V0U2NhbGUsIHJlZ2lzdGVyU2NhbGUsIGdldFRpY2tNZXRob2QsIHJlZ2lzdGVyVGlja01ldGhvZCwgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsInZhciBfX3NwcmVhZEFycmF5ID0gdGhpcyAmJiB0aGlzLl9fc3ByZWFkQXJyYXkgfHwgZnVuY3Rpb24gKHRvLCBmcm9tLCBwYWNrKSB7XG4gIGlmIChwYWNrIHx8IGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIGZvciAodmFyIGkgPSAwLCBsID0gZnJvbS5sZW5ndGgsIGFyOyBpIDwgbDsgaSsrKSB7XG4gICAgaWYgKGFyIHx8ICEoaSBpbiBmcm9tKSkge1xuICAgICAgaWYgKCFhcikgYXIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tLCAwLCBpKTtcbiAgICAgIGFyW2ldID0gZnJvbVtpXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRvLmNvbmNhdChhciB8fCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tKSk7XG59O1xuXG5pbXBvcnQgKiBhcyBwYXRoVXRpbCBmcm9tICdAYW50di9wYXRoLXV0aWwnO1xuaW1wb3J0IHsgQ2F0ZWdvcnksIExpbmVhciB9IGZyb20gJ0BhbnR2L3NjYWxlJztcbmltcG9ydCB7IG1hcCwgZWFjaCwgaXNFcXVhbCwgaGVhZCwgaXNBcnJheSB9IGZyb20gJ0BhbnR2L3V0aWwnO1xuLyoqXG4gKiDngrnmlbDnu4TovawgcGF0aFxuICogQHBhcmFtIHBvaW50c1xuICovXG5cbmZ1bmN0aW9uIHBvaW50c1RvUGF0aChwb2ludHMpIHtcbiAgcmV0dXJuIG1hcChwb2ludHMsIGZ1bmN0aW9uIChwLCBpZHgpIHtcbiAgICB2YXIgY29tbWFuZCA9IGlkeCA9PT0gMCA/ICdNJyA6ICdMJztcbiAgICB2YXIgeCA9IHBbMF0sXG4gICAgICAgIHkgPSBwWzFdO1xuICAgIHJldHVybiBbY29tbWFuZCwgeCwgeV07XG4gIH0pO1xufVxuLyoqXG4gKiDlsIbngrnov57mjqXmiJDot6/lvoQgcGF0aFxuICogQHBhcmFtIHBvaW50c1xuICovXG5cblxuZXhwb3J0IGZ1bmN0aW9uIGdldExpbmVQYXRoKHBvaW50cykge1xuICByZXR1cm4gcG9pbnRzVG9QYXRoKHBvaW50cyk7XG59XG4vKipcbiAqIOWwhueCuei/nuaIkOW5s+a7keeahOabsue6v1xuICogQHBhcmFtIHBvaW50c1xuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTbW9vdGhMaW5lUGF0aChwb2ludHMpIHtcbiAgaWYgKHBvaW50cy5sZW5ndGggPD0gMikge1xuICAgIC8vIOS4pOeCueS7peWGheebtOaOpee7mOWItuaIkOi3r+W+hFxuICAgIHJldHVybiBnZXRMaW5lUGF0aChwb2ludHMpO1xuICB9XG5cbiAgdmFyIGRhdGEgPSBbXTtcbiAgZWFjaChwb2ludHMsIGZ1bmN0aW9uIChwKSB7XG4gICAgLy8g5b2T5YmN54K55ZKM5LiK5LiA5Liq54K55LiA5qC355qE5pe25YCZ77yM5b+955Wl5o6JXG4gICAgaWYgKCFpc0VxdWFsKHAsIGRhdGEuc2xpY2UoZGF0YS5sZW5ndGggLSAyKSkpIHtcbiAgICAgIGRhdGEucHVzaChwWzBdLCBwWzFdKTtcbiAgICB9XG4gIH0pO1xuICB2YXIgcGF0aCA9IHBhdGhVdGlsLmNhdG11bGxSb20yQmV6aWVyKGRhdGEsIGZhbHNlKTtcblxuICB2YXIgX2EgPSBoZWFkKHBvaW50cyksXG4gICAgICB4ID0gX2FbMF0sXG4gICAgICB5ID0gX2FbMV07XG5cbiAgcGF0aC51bnNoaWZ0KFsnTScsIHgsIHldKTtcbiAgcmV0dXJuIHBhdGg7XG59XG4vKipcbiAqIOWwhuaVsOaNrui9rOaIkCBwYXRo77yM5Yip55SoIHNjYWxlIOeahOW9kuS4gOWMluiDveWKm1xuICogQHBhcmFtIGRhdGFcbiAqIEBwYXJhbSB3aWR0aFxuICogQHBhcmFtIGhlaWdodFxuICogQHBhcmFtIHNtb290aFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBkYXRhVG9QYXRoKGRhdGEsIHdpZHRoLCBoZWlnaHQsIHNtb290aCkge1xuICBpZiAoc21vb3RoID09PSB2b2lkIDApIHtcbiAgICBzbW9vdGggPSB0cnVlO1xuICB9IC8vIOWIqeeUqCBzY2FsZSDmnaXojrflj5YgeSDkuIrnmoTmmKDlsIRcblxuXG4gIHZhciB5ID0gbmV3IExpbmVhcih7XG4gICAgdmFsdWVzOiBkYXRhXG4gIH0pO1xuICB2YXIgeCA9IG5ldyBDYXRlZ29yeSh7XG4gICAgdmFsdWVzOiBtYXAoZGF0YSwgZnVuY3Rpb24gKHYsIGlkeCkge1xuICAgICAgcmV0dXJuIGlkeDtcbiAgICB9KVxuICB9KTtcbiAgdmFyIHBvaW50cyA9IG1hcChkYXRhLCBmdW5jdGlvbiAodiwgaWR4KSB7XG4gICAgcmV0dXJuIFt4LnNjYWxlKGlkeCkgKiB3aWR0aCwgaGVpZ2h0IC0geS5zY2FsZSh2KSAqIGhlaWdodF07XG4gIH0pO1xuICByZXR1cm4gc21vb3RoID8gZ2V0U21vb3RoTGluZVBhdGgocG9pbnRzKSA6IGdldExpbmVQYXRoKHBvaW50cyk7XG59XG5leHBvcnQgZnVuY3Rpb24gZGF0YVRvUmVjdFBhdGgoZGF0YSwgd2lkdGgsIGhlaWdodCwgYmFyV2lkdGgpIHtcbiAgaWYgKGJhcldpZHRoID09PSB2b2lkIDApIHtcbiAgICBiYXJXaWR0aCA9IDU7XG4gIH0gLy8g5Yip55SoIHNjYWxlIOadpeiOt+WPliB5IOS4iueahOaYoOWwhFxuXG5cbiAgdmFyIHkgPSBuZXcgTGluZWFyKHtcbiAgICB2YWx1ZXM6IGRhdGFcbiAgfSk7XG4gIHZhciB4ID0gbmV3IENhdGVnb3J5KHtcbiAgICB2YWx1ZXM6IG1hcChkYXRhLCBmdW5jdGlvbiAodiwgaWR4KSB7XG4gICAgICByZXR1cm4gaWR4O1xuICAgIH0pXG4gIH0pO1xuICB2YXIgcG9pbnRzID0gbWFwKGRhdGEsIGZ1bmN0aW9uICh2LCBpZHgpIHtcbiAgICByZXR1cm4gW3guc2NhbGUoaWR4KSAqIHdpZHRoLCBoZWlnaHQgLSB5LnNjYWxlKHYpICogaGVpZ2h0XTtcbiAgfSk7XG4gIHZhciByZWN0UG9pbnRzID0gW107XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb2ludHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcG9pbnQgPSBwb2ludHNbaV07XG4gICAgdmFyIHBhcmFtID0ge1xuICAgICAgeDogcG9pbnRbMF0sXG4gICAgICB5OiBwb2ludFsxXSxcbiAgICAgIHkwOiBoZWlnaHQsXG4gICAgICBzaXplOiBiYXJXaWR0aFxuICAgIH07XG4gICAgdmFyIHJlY3RQb2ludCA9IGdldFJlY3RQb2ludHMocGFyYW0pO1xuICAgIHJlY3RQb2ludHMucHVzaC5hcHBseShyZWN0UG9pbnRzLCByZWN0UG9pbnQpO1xuICB9XG5cbiAgcmV0dXJuIGdldFJlY3RQYXRoKHJlY3RQb2ludHMpO1xufVxuLyoqXG4gKiDojrflvpcgYXJlYSDpnaLnp6/nmoTmqKrlkJHov57mjqXnur/nmoQgcHgg5L2N572uXG4gKiBAcGFyYW0gZGF0YVxuICogQHBhcmFtIHdpZHRoXG4gKiBAcGFyYW0gaGVpZ2h0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEFyZWFMaW5lWShkYXRhLCBoZWlnaHQpIHtcbiAgdmFyIHkgPSBuZXcgTGluZWFyKHtcbiAgICB2YWx1ZXM6IGRhdGFcbiAgfSk7XG4gIHZhciBsaW5lWSA9IE1hdGgubWF4KDAsIHkubWluKTtcbiAgcmV0dXJuIGhlaWdodCAtIHkuc2NhbGUobGluZVkpICogaGVpZ2h0O1xufVxuLyoqXG4gKiDnur8gcGF0aCDovawgYXJlYSBwYXRoXG4gKiBAcGFyYW0gcGF0aFxuICogQHBhcmFtIHdpZHRoXG4gKiBAcGFyYW0gaGVpZ2h0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGxpbmVQYXRoVG9BcmVhUGF0aChwYXRoLCB3aWR0aCwgaGVpZ2h0LCBkYXRhKSB7XG4gIHZhciBhcmVhUGF0aCA9IF9fc3ByZWFkQXJyYXkoW10sIHBhdGgsIHRydWUpO1xuXG4gIHZhciBsaW5lWVB4ID0gZ2V0QXJlYUxpbmVZKGRhdGEsIGhlaWdodCk7XG4gIGFyZWFQYXRoLnB1c2goWydMJywgd2lkdGgsIGxpbmVZUHhdKTtcbiAgYXJlYVBhdGgucHVzaChbJ0wnLCAwLCBsaW5lWVB4XSk7XG4gIGFyZWFQYXRoLnB1c2goWydaJ10pO1xuICByZXR1cm4gYXJlYVBhdGg7XG59XG4vKipcbiAqIEBpZ25vcmVcbiAqIOagueaNruaVsOaNrueCueeUn+aIkOefqeW9oueahOWbm+S4quWFs+mUrueCuVxuICogQHBhcmFtIHBvaW50SW5mbyDmlbDmja7ngrnkv6Hmga9cbiAqIEByZXR1cm5zIHJlY3QgcG9pbnRzIOi/lOWbnuefqeW9ouWbm+S4qumhtueCueS/oeaBr1xuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRSZWN0UG9pbnRzKHBvaW50SW5mbykge1xuICB2YXIgeCA9IHBvaW50SW5mby54LFxuICAgICAgeSA9IHBvaW50SW5mby55LFxuICAgICAgeTAgPSBwb2ludEluZm8ueTAsXG4gICAgICBzaXplID0gcG9pbnRJbmZvLnNpemU7IC8vIOaciSA0IOenjeaDheWGte+8jFxuICAvLyAxLiB4LCB5IOmDveS4jeaYr+aVsOe7hFxuICAvLyAyLiB55piv5pWw57uE77yMeOS4jeaYr1xuICAvLyAzLiB45piv5pWw57uE77yMeeS4jeaYr1xuICAvLyA0LiB4LCB5IOmDveaYr+aVsOe7hFxuXG4gIHZhciB5TWluO1xuICB2YXIgeU1heDtcblxuICBpZiAoaXNBcnJheSh5KSkge1xuICAgIHlNaW4gPSB5WzBdLCB5TWF4ID0geVsxXTtcbiAgfSBlbHNlIHtcbiAgICB5TWluID0geTA7XG4gICAgeU1heCA9IHk7XG4gIH1cblxuICB2YXIgeE1pbjtcbiAgdmFyIHhNYXg7XG5cbiAgaWYgKGlzQXJyYXkoeCkpIHtcbiAgICB4TWluID0geFswXSwgeE1heCA9IHhbMV07XG4gIH0gZWxzZSB7XG4gICAgeE1pbiA9IHggLSBzaXplIC8gMjtcbiAgICB4TWF4ID0geCArIHNpemUgLyAyO1xuICB9XG5cbiAgdmFyIHBvaW50cyA9IFt7XG4gICAgeDogeE1pbixcbiAgICB5OiB5TWluXG4gIH0sIHtcbiAgICB4OiB4TWluLFxuICAgIHk6IHlNYXhcbiAgfV07IC8vIOefqeW9oueahOWbm+S4quWFs+mUrueCue+8jOe7k+aehOWmguS4i++8iOW3puS4i+inkumhuuaXtumSiOi/nuaOpe+8iVxuICAvLyAxIC0tLS0gMlxuICAvLyB8ICAgICAgfFxuICAvLyAwIC0tLS0gM1xuXG4gIHBvaW50cy5wdXNoKHtcbiAgICB4OiB4TWF4LFxuICAgIHk6IHlNYXhcbiAgfSwge1xuICAgIHg6IHhNYXgsXG4gICAgeTogeU1pblxuICB9KTtcbiAgcmV0dXJuIHBvaW50cztcbn1cbi8qKlxuICogQGlnbm9yZVxuICog5qC55o2u55+p5b2i5YWz6ZSu54K557uY5Yi2IHBhdGhcbiAqIEBwYXJhbSBwb2ludHMg5YWz6ZSu54K55pWw57uEXG4gKiBAcGFyYW0gaXNDbG9zZWQgcGF0aCDmmK/lkKbpnIDopoHpl63lkIhcbiAqIEByZXR1cm5zIOi/lOWbnuefqeW9oueahCBwYXRoXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFJlY3RQYXRoKHBvaW50cywgaXNDbG9zZWQpIHtcbiAgaWYgKGlzQ2xvc2VkID09PSB2b2lkIDApIHtcbiAgICBpc0Nsb3NlZCA9IHRydWU7XG4gIH1cblxuICB2YXIgcGF0aCA9IFtdO1xuICB2YXIgZmlyc3RQb2ludCA9IHBvaW50c1swXTtcbiAgcGF0aC5wdXNoKFsnTScsIGZpcnN0UG9pbnQueCwgZmlyc3RQb2ludC55XSk7XG5cbiAgZm9yICh2YXIgaSA9IDEsIGxlbiA9IHBvaW50cy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIHBhdGgucHVzaChbJ0wnLCBwb2ludHNbaV0ueCwgcG9pbnRzW2ldLnldKTtcbiAgfSAvLyDlr7nkuo4gc2hhcGU9XCJsaW5lXCIgcGF0aCDkuI3lupTor6Xpl63lkIjvvIzlkKbliJnkvJrpgKDmiJAgbGluZUNhcCDnu5jlm77lsZ7mgKflpLHmlYhcblxuXG4gIGlmIChpc0Nsb3NlZCkge1xuICAgIHBhdGgucHVzaChbJ0wnLCBmaXJzdFBvaW50LngsIGZpcnN0UG9pbnQueV0pOyAvLyDpnIDopoHpl63lkIhcblxuICAgIHBhdGgucHVzaChbJ3onXSk7XG4gIH1cblxuICByZXR1cm4gcGF0aDtcbn0iLCJ2YXIgX19hc3NpZ24gPSB0aGlzICYmIHRoaXMuX19hc3NpZ24gfHwgZnVuY3Rpb24gKCkge1xuICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHQpIHtcbiAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgIHMgPSBhcmd1bWVudHNbaV07XG5cbiAgICAgIGZvciAodmFyIHAgaW4gcykge1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0W3BdID0gc1twXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdDtcbiAgfTtcblxuICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn07XG5cbmltcG9ydCB7IGRhdGFUb1BhdGgsIGxpbmVQYXRoVG9BcmVhUGF0aCwgZGF0YVRvUmVjdFBhdGggfSBmcm9tICcuL3BhdGgnO1xuZXhwb3J0IHZhciBMSU5FX1NUWUxFID0ge1xuICBzdHJva2U6ICcjQzVDNUM1JyxcbiAgc3Ryb2tlT3BhY2l0eTogMC44NVxufTtcbmV4cG9ydCB2YXIgQVJFQV9TVFlMRSA9IHtcbiAgZmlsbDogJyNDQUNFRDQnLFxuICBvcGFjaXR5OiAwLjg1XG59O1xuLyoqXG4gKiDnvKnnlaXotovlir/lm75cbiAqL1xuXG52YXIgVHJlbmQgPVxuLyoqIEBjbGFzcyAqL1xuZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBUcmVuZChjZmcpIHtcbiAgICB2YXIgX2EgPSBjZmcueCxcbiAgICAgICAgeCA9IF9hID09PSB2b2lkIDAgPyAwIDogX2EsXG4gICAgICAgIF9iID0gY2ZnLnksXG4gICAgICAgIHkgPSBfYiA9PT0gdm9pZCAwID8gMCA6IF9iLFxuICAgICAgICBfYyA9IGNmZy53aWR0aCxcbiAgICAgICAgd2lkdGggPSBfYyA9PT0gdm9pZCAwID8gMjAwIDogX2MsXG4gICAgICAgIF9kID0gY2ZnLmhlaWdodCxcbiAgICAgICAgaGVpZ2h0ID0gX2QgPT09IHZvaWQgMCA/IDI2IDogX2QsXG4gICAgICAgIF9lID0gY2ZnLnNtb290aCxcbiAgICAgICAgc21vb3RoID0gX2UgPT09IHZvaWQgMCA/IHRydWUgOiBfZSxcbiAgICAgICAgX2YgPSBjZmcuaXNBcmVhLFxuICAgICAgICBpc0FyZWEgPSBfZiA9PT0gdm9pZCAwID8gZmFsc2UgOiBfZixcbiAgICAgICAgX2cgPSBjZmcuZGF0YSxcbiAgICAgICAgZGF0YSA9IF9nID09PSB2b2lkIDAgPyBbXSA6IF9nLFxuICAgICAgICBsaW5lU3R5bGUgPSBjZmcubGluZVN0eWxlLFxuICAgICAgICBhcmVhU3R5bGUgPSBjZmcuYXJlYVN0eWxlLFxuICAgICAgICBncm91cCA9IGNmZy5ncm91cCxcbiAgICAgICAgX2ggPSBjZmcuaW50ZXJ2YWwsXG4gICAgICAgIGludGVydmFsID0gX2ggPT09IHZvaWQgMCA/IG51bGwgOiBfaDtcbiAgICB0aGlzLmdyb3VwID0gZ3JvdXA7XG4gICAgdGhpcy54ID0geDtcbiAgICB0aGlzLnkgPSB5O1xuICAgIHRoaXMud2lkdGggPSB3aWR0aDtcbiAgICB0aGlzLmhlaWdodCA9IGhlaWdodDtcbiAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgIHRoaXMuc21vb3RoID0gc21vb3RoO1xuICAgIHRoaXMuaXNBcmVhID0gaXNBcmVhO1xuICAgIHRoaXMubGluZVN0eWxlID0gT2JqZWN0LmFzc2lnbih7fSwgTElORV9TVFlMRSwgbGluZVN0eWxlKTtcbiAgICB0aGlzLmFyZWFTdHlsZSA9IE9iamVjdC5hc3NpZ24oe30sIEFSRUFfU1RZTEUsIGFyZWFTdHlsZSk7XG4gICAgdGhpcy5pbnRlcnZhbENvbmZpZyA9IGludGVydmFsO1xuICAgIHRoaXMucmVuZGVyTGluZSgpO1xuICB9XG4gIC8qKlxuICAgKiDmnoTpgKBcbiAgICogQHByaXZhdGVcbiAgICovXG5cblxuICBUcmVuZC5wcm90b3R5cGUucmVuZGVyTGluZSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgX2EgPSB0aGlzLFxuICAgICAgICB4ID0gX2EueCxcbiAgICAgICAgeSA9IF9hLnksXG4gICAgICAgIHdpZHRoID0gX2Eud2lkdGgsXG4gICAgICAgIGhlaWdodCA9IF9hLmhlaWdodCxcbiAgICAgICAgYmFyV2lkdGggPSBfYS5iYXJXaWR0aCxcbiAgICAgICAgZGF0YSA9IF9hLmRhdGEsXG4gICAgICAgIHNtb290aCA9IF9hLnNtb290aCxcbiAgICAgICAgaXNBcmVhID0gX2EuaXNBcmVhLFxuICAgICAgICBsaW5lU3R5bGUgPSBfYS5saW5lU3R5bGUsXG4gICAgICAgIGFyZWFTdHlsZSA9IF9hLmFyZWFTdHlsZTtcblxuICAgIHZhciB0cmVuZEdyb3VwID0gdGhpcy5ncm91cC5hZGRHcm91cCh7XG4gICAgICBuYW1lOiAndHJlbmQtZ3JvdXAnXG4gICAgfSk7XG5cbiAgICBpZiAoZGF0YSkge1xuICAgICAgdmFyIHBhdGggPSBkYXRhVG9QYXRoKGRhdGEsIHdpZHRoLCBoZWlnaHQsIHNtb290aCk7IC8vIOe6v1xuXG4gICAgICB0cmVuZEdyb3VwLmFkZFNoYXBlKCdwYXRoJywge1xuICAgICAgICBhdHRyczogX19hc3NpZ24oe1xuICAgICAgICAgIHBhdGg6IHBhdGhcbiAgICAgICAgfSwgbGluZVN0eWxlKVxuICAgICAgfSk7IC8vIOWcqCBsaW5lIOeahOWfuuehgOS4iu+8jOe7mOWItumdouenr+WbvlxuXG4gICAgICBpZiAoaXNBcmVhKSB7XG4gICAgICAgIHZhciBhcmVhUGF0aCA9IGxpbmVQYXRoVG9BcmVhUGF0aChwYXRoLCB3aWR0aCwgaGVpZ2h0LCBkYXRhKTtcbiAgICAgICAgdHJlbmRHcm91cC5hZGRTaGFwZSgncGF0aCcsIHtcbiAgICAgICAgICBhdHRyczogX19hc3NpZ24oe1xuICAgICAgICAgICAgcGF0aDogYXJlYVBhdGhcbiAgICAgICAgICB9LCBhcmVhU3R5bGUpXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gLy8g57uY5Yi25p+x54q25Zu+8J+TilxuXG5cbiAgICBpZiAodGhpcy5pbnRlcnZhbENvbmZpZykge1xuICAgICAgdHJlbmRHcm91cC5hZGRTaGFwZSgncGF0aCcsIHtcbiAgICAgICAgYXR0cnM6IF9fYXNzaWduKHtcbiAgICAgICAgICBwYXRoOiBkYXRhVG9SZWN0UGF0aCh0aGlzLmludGVydmFsQ29uZmlnLmRhdGEsIHdpZHRoLCBoZWlnaHQsIHRoaXMuaW50ZXJ2YWxDb25maWcuc3R5bGUuYmFyV2lkdGgpXG4gICAgICAgIH0sIHRoaXMuaW50ZXJ2YWxDb25maWcuc3R5bGUpXG4gICAgICB9KTtcbiAgICB9IC8vIOe7n+S4gOenu+WKqOWIsOWvueW6lOeahOS9jee9rlxuXG5cbiAgICB0cmVuZEdyb3VwLm1vdmUoeCwgeSk7XG4gIH07XG5cbiAgVHJlbmQucHJvdG90eXBlLmRlc3RvcnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5ncm91cC5kZXN0cm95KCk7XG4gIH07XG5cbiAgcmV0dXJuIFRyZW5kO1xufSgpO1xuXG5leHBvcnQgZGVmYXVsdCBUcmVuZDsiLCJ2YXIgX19hc3NpZ24gPSB0aGlzICYmIHRoaXMuX19hc3NpZ24gfHwgZnVuY3Rpb24gKCkge1xuICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHQpIHtcbiAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgIHMgPSBhcmd1bWVudHNbaV07XG5cbiAgICAgIGZvciAodmFyIHAgaW4gcykge1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0W3BdID0gc1twXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdDtcbiAgfTtcblxuICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn07XG5cbmltcG9ydCB7IGlzTnVtYmVyIH0gZnJvbSAnQGFudHYvdXRpbCc7XG52YXIgREVGQVVMVF9TVFlMRSA9IHtcbiAgZmlsbDogJyMxODkwZmYnLFxuICBzdHJva2U6ICcjMTg5MGZmJyxcbiAgdHlwZTogJ3RyZW5kJyxcbiAgcmFkaXVzOiAyLFxuICBvcGFjaXR5OiAxLFxuICBjdXJzb3I6ICdldy1yZXNpemUnLFxuICAvLyDpq5jkuq7nmoTpopzoibJcbiAgaGlnaExpZ2h0RmlsbDogJyMwMDUwYjMnXG59O1xudmFyIFNJTVBMRV9ERUZBVUxUX1NUWUxFID0ge1xuICBmaWxsOiAnI2ZmZicsXG4gIHN0cm9rZTogJyMxODkwZmYnLFxuICByYWRpdXM6IDIsXG4gIG9wYWNpdHk6IDEsXG4gIGN1cnNvcjogJ2V3LXJlc2l6ZSdcbn07XG5cbnZhciBIYW5kbGVyID1cbi8qKiBAY2xhc3MgKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gSGFuZGxlcihjZmcpIHtcbiAgICB2YXIgZ3JvdXAgPSBjZmcuZ3JvdXAsXG4gICAgICAgIG5hbWUgPSBjZmcubmFtZSxcbiAgICAgICAgdHlwZSA9IGNmZy50eXBlLFxuICAgICAgICBfYSA9IGNmZy54LFxuICAgICAgICB4ID0gX2EgPT09IHZvaWQgMCA/IDAgOiBfYSxcbiAgICAgICAgX2IgPSBjZmcueSxcbiAgICAgICAgeSA9IF9iID09PSB2b2lkIDAgPyAwIDogX2IsXG4gICAgICAgIF9jID0gY2ZnLndpZHRoLFxuICAgICAgICB3aWR0aCA9IF9jID09PSB2b2lkIDAgPyAyIDogX2MsXG4gICAgICAgIF9kID0gY2ZnLmhlaWdodCxcbiAgICAgICAgaGVpZ2h0ID0gX2QgPT09IHZvaWQgMCA/IDI0IDogX2QsXG4gICAgICAgIF9lID0gY2ZnLnN0eWxlLFxuICAgICAgICBzdHlsZSA9IF9lID09PSB2b2lkIDAgPyB7fSA6IF9lO1xuICAgIHRoaXMuZ3JvdXAgPSBncm91cDtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMuaGFuZGxlVHlwZSA9IHR5cGU7XG4gICAgdGhpcy54ID0geDtcbiAgICB0aGlzLnkgPSB5O1xuICAgIHRoaXMud2lkdGggPSB3aWR0aDtcbiAgICB0aGlzLmhlaWdodCA9IGhlaWdodDtcblxuICAgIGlmICh0eXBlID09PSAndHJlbmQnKSB7XG4gICAgICB0aGlzLnN0eWxlID0gX19hc3NpZ24oX19hc3NpZ24oe30sIERFRkFVTFRfU1RZTEUpLCBzdHlsZSk7XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnc2ltcGxlJykge1xuICAgICAgdGhpcy5zdHlsZSA9IF9fYXNzaWduKF9fYXNzaWduKHt9LCBTSU1QTEVfREVGQVVMVF9TVFlMRSksIHN0eWxlKTtcbiAgICB9XG5cbiAgICB0aGlzLnJlbmRlckhhbmRsZSgpO1xuICB9XG4gIC8qKlxuICAgKiDorr7nva7kvY3nva4geFxuICAgKiBAcGFyYW0geFxuICAgKi9cblxuXG4gIEhhbmRsZXIucHJvdG90eXBlLnNldFggPSBmdW5jdGlvbiAoeCkge1xuICAgIHRoaXMuc2V0WFkoeCwgdW5kZWZpbmVkKTtcbiAgfTtcbiAgLyoqXG4gICAqIOiuvue9ruS9jee9riB5XG4gICAqIEBwYXJhbSB5XG4gICAqL1xuXG5cbiAgSGFuZGxlci5wcm90b3R5cGUuc2V0WSA9IGZ1bmN0aW9uICh5KSB7XG4gICAgdGhpcy5zZXRYWSh1bmRlZmluZWQsIHkpO1xuICB9O1xuXG4gIEhhbmRsZXIucHJvdG90eXBlLnNldFhZID0gZnVuY3Rpb24gKHgsIHkpIHtcbiAgICBpZiAoaXNOdW1iZXIoeCkpIHtcbiAgICAgIHRoaXMueCA9IHg7XG4gICAgfVxuXG4gICAgaWYgKGlzTnVtYmVyKHkpKSB7XG4gICAgICB0aGlzLnkgPSB5O1xuICAgIH1cblxuICAgIHRoaXMudXBkYXRlWFkoKTtcbiAgfTtcbiAgLyoqXG4gICAqIOWIneWni+WMlue7hOS7tlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuXG4gIEhhbmRsZXIucHJvdG90eXBlLnJlbmRlckhhbmRsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgX2EgPSB0aGlzLFxuICAgICAgICB3aWR0aCA9IF9hLndpZHRoLFxuICAgICAgICBoZWlnaHQgPSBfYS5oZWlnaHQsXG4gICAgICAgIHN0eWxlID0gX2Euc3R5bGUsXG4gICAgICAgIG5hbWUgPSBfYS5uYW1lO1xuXG4gICAgdmFyIGZpbGwgPSBzdHlsZS5maWxsLFxuICAgICAgICBzdHJva2UgPSBzdHlsZS5zdHJva2UsXG4gICAgICAgIHJhZGl1cyA9IHN0eWxlLnJhZGl1cyxcbiAgICAgICAgb3BhY2l0eSA9IHN0eWxlLm9wYWNpdHksXG4gICAgICAgIGN1cnNvciA9IHN0eWxlLmN1cnNvcjtcbiAgICB0aGlzLmhhbmRsZUdyb3VwID0gdGhpcy5ncm91cC5hZGRHcm91cCgpOyAvLyDotovlir/lm77ml7bnmoQgaGFuZGxlXG5cbiAgICBpZiAodGhpcy5oYW5kbGVUeXBlID09PSAndHJlbmQnKSB7XG4gICAgICAvLyDlnoLnm7Tnur9cbiAgICAgIHRoaXMudmVydGljYWxMaW5lID0gdGhpcy5oYW5kbGVHcm91cC5hZGRTaGFwZSgncmVjdCcsIHtcbiAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICB4OiAwLFxuICAgICAgICAgIHk6IDAsXG4gICAgICAgICAgd2lkdGg6IHdpZHRoLFxuICAgICAgICAgIGhlaWdodDogaGVpZ2h0LFxuICAgICAgICAgIGZpbGw6IGZpbGwsXG4gICAgICAgICAgc3Ryb2tlOiBzdHJva2UsXG4gICAgICAgICAgcmFkaXVzOiByYWRpdXMsXG4gICAgICAgICAgb3BhY2l0eTogb3BhY2l0eSxcbiAgICAgICAgICBjdXJzb3I6IGN1cnNvclxuICAgICAgICB9LFxuICAgICAgICBuYW1lOiBuYW1lICsgXCItaGFuZGxlclwiXG4gICAgICB9KTtcbiAgICAgIHRoaXMudG9wQ2lyY2xlID0gdGhpcy5oYW5kbGVHcm91cC5hZGRTaGFwZSgnY2lyY2xlJywge1xuICAgICAgICBhdHRyczoge1xuICAgICAgICAgIHg6IHdpZHRoIC8gMixcbiAgICAgICAgICB5OiAwLFxuICAgICAgICAgIHI6IDIgKiB3aWR0aCxcbiAgICAgICAgICBmaWxsOiBmaWxsLFxuICAgICAgICAgIHN0cm9rZTogc3Ryb2tlLFxuICAgICAgICAgIHJhZGl1czogcmFkaXVzLFxuICAgICAgICAgIG9wYWNpdHk6IG9wYWNpdHksXG4gICAgICAgICAgY3Vyc29yOiBjdXJzb3JcbiAgICAgICAgfSxcbiAgICAgICAgbmFtZTogbmFtZSArIFwiLWhhbmRsZXJcIlxuICAgICAgfSk7XG4gICAgICB0aGlzLmJvdHRvbUNpcmNsZSA9IHRoaXMuaGFuZGxlR3JvdXAuYWRkU2hhcGUoJ2NpcmNsZScsIHtcbiAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICB4OiB3aWR0aCAvIDIsXG4gICAgICAgICAgeTogaGVpZ2h0LFxuICAgICAgICAgIHI6IDIgKiB3aWR0aCxcbiAgICAgICAgICBmaWxsOiBmaWxsLFxuICAgICAgICAgIHN0cm9rZTogc3Ryb2tlLFxuICAgICAgICAgIHJhZGl1czogcmFkaXVzLFxuICAgICAgICAgIG9wYWNpdHk6IG9wYWNpdHksXG4gICAgICAgICAgY3Vyc29yOiBjdXJzb3JcbiAgICAgICAgfSxcbiAgICAgICAgbmFtZTogbmFtZSArIFwiLWhhbmRsZXJcIlxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmhhbmRsZVR5cGUgPT09ICdzaW1wbGUnKSB7XG4gICAgICB0aGlzLnRvcENpcmNsZSA9IHRoaXMuaGFuZGxlR3JvdXAuYWRkU2hhcGUoJ2NpcmNsZScsIHtcbiAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICB4OiB3aWR0aCAvIDIsXG4gICAgICAgICAgeTogaGVpZ2h0IC8gMixcbiAgICAgICAgICByOiAyICogd2lkdGgsXG4gICAgICAgICAgZmlsbDogZmlsbCxcbiAgICAgICAgICBzdHJva2U6IHN0cm9rZSxcbiAgICAgICAgICByYWRpdXM6IHJhZGl1cyxcbiAgICAgICAgICBvcGFjaXR5OiBvcGFjaXR5LFxuICAgICAgICAgIGN1cnNvcjogY3Vyc29yLFxuICAgICAgICAgIGxpbmVXaWR0aDogMlxuICAgICAgICB9LFxuICAgICAgICBuYW1lOiBuYW1lICsgXCItaGFuZGxlclwiXG4gICAgICB9KTtcbiAgICB9IC8vIOenu+WKqOWIsOWvueW6lOeahOS9jee9rlxuXG5cbiAgICB0aGlzLnVwZGF0ZVhZKCk7XG5cbiAgICBpZiAodGhpcy5oYW5kbGVUeXBlID09PSAndHJlbmQnKSB7XG4gICAgICB0aGlzLmJpbmRUcmVuZEV2ZW50cygpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5oYW5kbGVUeXBlID09PSAnc2ltcGxlJykge1xuICAgICAgdGhpcy5iaW5kU2ltcGxlRXZlbnRzKCk7XG4gICAgfVxuICB9O1xuXG4gIEhhbmRsZXIucHJvdG90eXBlLmJpbmRTaW1wbGVFdmVudHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHZhciBuYW1lID0gdGhpcy5uYW1lO1xuICAgIHRoaXMuaGFuZGxlR3JvdXAub24obmFtZSArIFwiLWhhbmRsZXI6bW91c2VlbnRlclwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgaGlnaExpZ2h0RmlsbCA9IF90aGlzLnN0eWxlLmhpZ2hMaWdodEZpbGw7XG5cbiAgICAgIF90aGlzLnRvcENpcmNsZS5hdHRyKCdmaWxsJywgaGlnaExpZ2h0RmlsbCk7XG4gICAgfSk7XG4gICAgdGhpcy5oYW5kbGVHcm91cC5vbihuYW1lICsgXCItaGFuZGxlcjptb3VzZWxlYXZlXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBmaWxsID0gX3RoaXMuc3R5bGUuZmlsbDtcblxuICAgICAgX3RoaXMudG9wQ2lyY2xlLmF0dHIoJ2ZpbGwnLCBmaWxsKTtcbiAgICB9KTtcbiAgfTtcblxuICBIYW5kbGVyLnByb3RvdHlwZS5iaW5kVHJlbmRFdmVudHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHZhciBuYW1lID0gdGhpcy5uYW1lO1xuICAgIHRoaXMuaGFuZGxlR3JvdXAub24obmFtZSArIFwiLWhhbmRsZXI6bW91c2VlbnRlclwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgaGlnaExpZ2h0RmlsbCA9IF90aGlzLnN0eWxlLmhpZ2hMaWdodEZpbGw7XG5cbiAgICAgIF90aGlzLnZlcnRpY2FsTGluZS5hdHRyKCdmaWxsJywgaGlnaExpZ2h0RmlsbCk7XG5cbiAgICAgIF90aGlzLnRvcENpcmNsZS5hdHRyKCdmaWxsJywgaGlnaExpZ2h0RmlsbCk7XG5cbiAgICAgIF90aGlzLmJvdHRvbUNpcmNsZS5hdHRyKCdmaWxsJywgaGlnaExpZ2h0RmlsbCk7XG4gICAgfSk7XG4gICAgdGhpcy5oYW5kbGVHcm91cC5vbihuYW1lICsgXCItaGFuZGxlcjptb3VzZWxlYXZlXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBmaWxsID0gX3RoaXMuc3R5bGUuZmlsbDtcblxuICAgICAgX3RoaXMudmVydGljYWxMaW5lLmF0dHIoJ2ZpbGwnLCBmaWxsKTtcblxuICAgICAgX3RoaXMudG9wQ2lyY2xlLmF0dHIoJ2ZpbGwnLCBmaWxsKTtcblxuICAgICAgX3RoaXMuYm90dG9tQ2lyY2xlLmF0dHIoJ2ZpbGwnLCBmaWxsKTtcbiAgICB9KTtcbiAgfTtcblxuICBIYW5kbGVyLnByb3RvdHlwZS5zaG93ID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuaGFuZGxlR3JvdXAuc2hvdygpO1xuICB9O1xuXG4gIEhhbmRsZXIucHJvdG90eXBlLmhpZGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5oYW5kbGVHcm91cC5oaWRlKCk7XG4gIH07XG5cbiAgSGFuZGxlci5wcm90b3R5cGUudXBkYXRlWFkgPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5oYW5kbGVHcm91cC5zZXRNYXRyaXgoWzEsIDAsIDAsIDAsIDEsIDAsIHRoaXMueCwgdGhpcy55LCAxXSk7XG4gIH07XG5cbiAgcmV0dXJuIEhhbmRsZXI7XG59KCk7XG5cbmV4cG9ydCBkZWZhdWx0IEhhbmRsZXI7IiwiZXhwb3J0IHZhciBUSU1FTElORV9TVEFSVCA9ICd0aW1lYmFyc3RhcnRwbGF5JztcbmV4cG9ydCB2YXIgVElNRUxJTkVfRU5EID0gJ3RpbWViYXJlbmRwbGF5JztcbmV4cG9ydCB2YXIgVkFMVUVfQ0hBTkdFID0gJ3ZhbHVlY2hhbmdlJztcbmV4cG9ydCB2YXIgVElNRUJBUl9DT05GSUdfQ0hBTkdFID0gJ3RpbWViYXJDb25maWdDaGFuZ2VkJztcbmV4cG9ydCB2YXIgUExBWV9QQVVTRV9CVE4gPSAncGxheVBhdXNlQnRuJztcbmV4cG9ydCB2YXIgTkVYVF9TVEVQX0JUTiA9ICduZXh0U3RlcEJ0bic7XG5leHBvcnQgdmFyIFBSRV9TVEVQX0JUTiA9ICdwcmVTdGVwQnRuJzsiLCIvKipcbiAqIOWfuuS6jiBHIOeahOaMiemSrue7hOS7tlxuICovXG52YXIgX19hc3NpZ24gPSB0aGlzICYmIHRoaXMuX19hc3NpZ24gfHwgZnVuY3Rpb24gKCkge1xuICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHQpIHtcbiAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgIHMgPSBhcmd1bWVudHNbaV07XG5cbiAgICAgIGZvciAodmFyIHAgaW4gcykge1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0W3BdID0gc1twXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdDtcbiAgfTtcblxuICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn07XG5cbmltcG9ydCB7IGRlZXBNaXggfSBmcm9tICdAYW50di91dGlsJztcbmltcG9ydCB7IFBMQVlfUEFVU0VfQlROIH0gZnJvbSAnLi9jb25zdGFudCc7XG5cbnZhciBCdXR0b24gPVxuLyoqIEBjbGFzcyAqL1xuZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBCdXR0b24oY2ZnKSB7XG4gICAgdGhpcy5jb25maWcgPSBkZWVwTWl4KHt9LCBjZmcpO1xuICAgIHRoaXMuaW5pdCgpO1xuICB9XG5cbiAgQnV0dG9uLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAoY2ZnKSB7XG4gICAgdGhpcy5jb25maWcgPSBkZWVwTWl4KHt9LCB0aGlzLmNvbmZpZywgY2ZnKTtcbiAgICB0aGlzLnVwZGF0ZUVsZW1lbnQoKTtcbiAgICB0aGlzLnJlbmRlck1hcmtlcigpO1xuICB9O1xuXG4gIEJ1dHRvbi5wcm90b3R5cGUuaW5pdCA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmluaXRFbGVtZW50KCk7XG4gICAgdGhpcy5yZW5kZXJNYXJrZXIoKTtcbiAgfTtcblxuICBCdXR0b24ucHJvdG90eXBlLmluaXRFbGVtZW50ID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBfYSA9IHRoaXMuY29uZmlnLFxuICAgICAgICBncm91cCA9IF9hLmdyb3VwLFxuICAgICAgICBzdHlsZSA9IF9hLnN0eWxlO1xuICAgIHZhciBfYiA9IHN0eWxlLnNjYWxlLFxuICAgICAgICBzY2FsZSA9IF9iID09PSB2b2lkIDAgPyAxIDogX2IsXG4gICAgICAgIF9jID0gc3R5bGUub2Zmc2V0WCxcbiAgICAgICAgb2Zmc2V0WCA9IF9jID09PSB2b2lkIDAgPyAwIDogX2MsXG4gICAgICAgIF9kID0gc3R5bGUub2Zmc2V0WSxcbiAgICAgICAgb2Zmc2V0WSA9IF9kID09PSB2b2lkIDAgPyAwIDogX2Q7XG4gICAgdmFyIHggPSB0aGlzLmNvbmZpZy54ICsgb2Zmc2V0WDtcbiAgICB2YXIgeSA9IHRoaXMuY29uZmlnLnkgKyBvZmZzZXRZO1xuICAgIHZhciBidXR0b25Hcm91cCA9IGdyb3VwLmFkZEdyb3VwKHtcbiAgICAgIG5hbWU6IFBMQVlfUEFVU0VfQlROXG4gICAgfSk7XG4gICAgdGhpcy5zdGFydE1hcmtlckdyb3VwID0gYnV0dG9uR3JvdXAuYWRkR3JvdXAoe1xuICAgICAgbmFtZTogUExBWV9QQVVTRV9CVE5cbiAgICB9KTtcbiAgICB0aGlzLmNpcmNsZSA9IGdyb3VwLmFkZFNoYXBlKCdjaXJjbGUnLCB7XG4gICAgICBhdHRyczogX19hc3NpZ24oe1xuICAgICAgICB4OiB4LFxuICAgICAgICB5OiB5LFxuICAgICAgICByOiB0aGlzLmNvbmZpZy5yICogc2NhbGVcbiAgICAgIH0sIHN0eWxlKSxcbiAgICAgIG5hbWU6IFBMQVlfUEFVU0VfQlROXG4gICAgfSk7XG4gICAgdGhpcy5zdGFydE1hcmtlciA9IHRoaXMuc3RhcnRNYXJrZXJHcm91cC5hZGRTaGFwZSgncGF0aCcsIHtcbiAgICAgIGF0dHJzOiB7XG4gICAgICAgIHBhdGg6IHRoaXMuZ2V0U3RhcnRNYXJrZXJQYXRoKHgsIHksIHNjYWxlKSxcbiAgICAgICAgZmlsbDogc3R5bGUuc3Ryb2tlIHx8ICcjYWFhJ1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucGF1c2VNYXJrZXJHcm91cCA9IGJ1dHRvbkdyb3VwLmFkZEdyb3VwKHtcbiAgICAgIG5hbWU6IFBMQVlfUEFVU0VfQlROXG4gICAgfSk7XG4gICAgdmFyIHdpZHRoID0gMC4yNSAqIHRoaXMuY29uZmlnLnIgKiBzY2FsZTtcbiAgICB2YXIgaGVpZ2h0ID0gMC41ICogdGhpcy5jb25maWcuciAqIE1hdGguc3FydCgzKSAqIHNjYWxlO1xuICAgIHRoaXMucGF1c2VMZWZ0TWFya2VyID0gdGhpcy5wYXVzZU1hcmtlckdyb3VwLmFkZFNoYXBlKCdyZWN0Jywge1xuICAgICAgYXR0cnM6IHtcbiAgICAgICAgeDogeCAtIDAuMzc1ICogdGhpcy5jb25maWcuciAqIHNjYWxlLFxuICAgICAgICB5OiB5IC0gaGVpZ2h0IC8gMixcbiAgICAgICAgd2lkdGg6IHdpZHRoLFxuICAgICAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICAgICAgZmlsbDogc3R5bGUuc3Ryb2tlIHx8ICcjYWFhJyxcbiAgICAgICAgbGluZVdpZHRoOiAwXG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5wYXVzZVJpZ2h0TWFya2VyID0gdGhpcy5wYXVzZU1hcmtlckdyb3VwLmFkZFNoYXBlKCdyZWN0Jywge1xuICAgICAgYXR0cnM6IHtcbiAgICAgICAgeDogeCArIDEgLyA4ICogdGhpcy5jb25maWcuciAqIHNjYWxlLFxuICAgICAgICB5OiB5IC0gaGVpZ2h0IC8gMixcbiAgICAgICAgd2lkdGg6IHdpZHRoLFxuICAgICAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICAgICAgZmlsbDogc3R5bGUuc3Ryb2tlIHx8ICcjYWFhJyxcbiAgICAgICAgbGluZVdpZHRoOiAwXG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgQnV0dG9uLnByb3RvdHlwZS51cGRhdGVFbGVtZW50ID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBfYSA9IHRoaXMuY29uZmlnLnN0eWxlLFxuICAgICAgICBfYiA9IF9hLnNjYWxlLFxuICAgICAgICBzY2FsZSA9IF9iID09PSB2b2lkIDAgPyAxIDogX2IsXG4gICAgICAgIF9jID0gX2Eub2Zmc2V0WCxcbiAgICAgICAgb2Zmc2V0WCA9IF9jID09PSB2b2lkIDAgPyAwIDogX2MsXG4gICAgICAgIF9kID0gX2Eub2Zmc2V0WSxcbiAgICAgICAgb2Zmc2V0WSA9IF9kID09PSB2b2lkIDAgPyAwIDogX2Q7XG4gICAgdmFyIHggPSB0aGlzLmNvbmZpZy54ICsgb2Zmc2V0WDtcbiAgICB2YXIgeSA9IHRoaXMuY29uZmlnLnkgKyBvZmZzZXRZO1xuICAgIHRoaXMuY2lyY2xlLmF0dHIoJ3gnLCB4KTtcbiAgICB0aGlzLmNpcmNsZS5hdHRyKCd5JywgeSk7XG4gICAgdGhpcy5jaXJjbGUuYXR0cigncicsIHRoaXMuY29uZmlnLnIgKiBzY2FsZSk7XG4gICAgdGhpcy5zdGFydE1hcmtlci5hdHRyKCdwYXRoJywgdGhpcy5nZXRTdGFydE1hcmtlclBhdGgoeCwgeSwgc2NhbGUpKTtcbiAgICB2YXIgd2lkdGggPSAwLjI1ICogdGhpcy5jb25maWcuciAqIHNjYWxlO1xuICAgIHZhciBoZWlnaHQgPSAwLjUgKiB0aGlzLmNvbmZpZy5yICogTWF0aC5zcXJ0KDMpICogc2NhbGU7XG4gICAgdGhpcy5wYXVzZUxlZnRNYXJrZXIuYXR0cigneCcsIHggLSAoMSAvIDQgKyAxIC8gOCkgKiB0aGlzLmNvbmZpZy5yICogc2NhbGUpO1xuICAgIHRoaXMucGF1c2VMZWZ0TWFya2VyLmF0dHIoJ3knLCB5IC0gaGVpZ2h0IC8gMik7XG4gICAgdGhpcy5wYXVzZUxlZnRNYXJrZXIuYXR0cignd2lkdGgnLCB3aWR0aCk7XG4gICAgdGhpcy5wYXVzZUxlZnRNYXJrZXIuYXR0cignaGVpZ2h0JywgaGVpZ2h0KTtcbiAgICB0aGlzLnBhdXNlUmlnaHRNYXJrZXIuYXR0cigneCcsIHggKyAxIC8gOCAqIHRoaXMuY29uZmlnLnIgKiBzY2FsZSk7XG4gICAgdGhpcy5wYXVzZVJpZ2h0TWFya2VyLmF0dHIoJ3knLCB5IC0gaGVpZ2h0IC8gMik7XG4gICAgdGhpcy5wYXVzZVJpZ2h0TWFya2VyLmF0dHIoJ3dpZHRoJywgd2lkdGgpO1xuICAgIHRoaXMucGF1c2VSaWdodE1hcmtlci5hdHRyKCdoZWlnaHQnLCBoZWlnaHQpO1xuICB9O1xuXG4gIEJ1dHRvbi5wcm90b3R5cGUucmVuZGVyTWFya2VyID0gZnVuY3Rpb24gKCkge1xuICAgIGlmICh0aGlzLmNvbmZpZy5pc1BsYXkpIHtcbiAgICAgIHRoaXMuc3RhcnRNYXJrZXJHcm91cC5oaWRlKCk7XG4gICAgICB0aGlzLnBhdXNlTWFya2VyR3JvdXAuc2hvdygpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnN0YXJ0TWFya2VyR3JvdXAuc2hvdygpO1xuICAgICAgdGhpcy5wYXVzZU1hcmtlckdyb3VwLmhpZGUoKTtcbiAgICB9XG4gIH07XG4gIC8qKiDojrflj5bmkq3mlL7plK4gbWFya2VyIHBhdGggKi9cblxuXG4gIEJ1dHRvbi5wcm90b3R5cGUuZ2V0U3RhcnRNYXJrZXJQYXRoID0gZnVuY3Rpb24gKHgsIHksIHNjYWxlKSB7XG4gICAgdmFyIHNpZGVMZW5ndGggPSAwLjUgKiB0aGlzLmNvbmZpZy5yICogTWF0aC5zcXJ0KDMpICogc2NhbGU7XG4gICAgcmV0dXJuIFtbJ00nLCB4IC0gc2lkZUxlbmd0aCAvIE1hdGguc3FydCgzKSAvIDIsIHkgLSBzaWRlTGVuZ3RoIC8gMl0sIFsnTCcsIHggKyBzaWRlTGVuZ3RoIC8gTWF0aC5zcXJ0KDMpLCB5XSwgWydMJywgeCAtIHNpZGVMZW5ndGggLyBNYXRoLnNxcnQoMykgLyAyLCB5ICsgc2lkZUxlbmd0aCAvIDJdXTtcbiAgfTtcblxuICByZXR1cm4gQnV0dG9uO1xufSgpO1xuXG5leHBvcnQgZGVmYXVsdCBCdXR0b247IiwidmFyIF9fYXNzaWduID0gdGhpcyAmJiB0aGlzLl9fYXNzaWduIHx8IGZ1bmN0aW9uICgpIHtcbiAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0KSB7XG4gICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG4gICAgICBzID0gYXJndW1lbnRzW2ldO1xuXG4gICAgICBmb3IgKHZhciBwIGluIHMpIHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdFtwXSA9IHNbcF07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHQ7XG4gIH07XG5cbiAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59O1xuXG5pbXBvcnQgeyBkZWVwTWl4IH0gZnJvbSAnQGFudHYvdXRpbCc7XG5pbXBvcnQgeyBleHQgfSBmcm9tICdAYW50di9tYXRyaXgtdXRpbCc7XG5pbXBvcnQgQnV0dG9uIGZyb20gJy4vdGltZUJ1dHRvbic7XG5pbXBvcnQgeyBUSU1FQkFSX0NPTkZJR19DSEFOR0UsIFBSRV9TVEVQX0JUTiwgTkVYVF9TVEVQX0JUTiB9IGZyb20gJy4vY29uc3RhbnQnO1xudmFyIHRyYW5zZm9ybSA9IGV4dC50cmFuc2Zvcm07XG52YXIgREVGQVVMVF9SRUNUX0ZJTEwgPSAnI2FhYSc7XG52YXIgREVGQVVMVF9SRUNUX1NUUk9LRSA9ICdncmVlbic7XG52YXIgREVGQVVMVF9QTEFZQlROX1NUWUxFID0ge1xuICBmaWxsOiAnI2FhYScsXG4gIGZpbGxPcGFjaXR5OiAwLjM1LFxuICBzdHJva2U6ICcjYWFhJ1xufTtcbnZhciBERUZBVUxUX1BSRUJUTl9TVFlMRSA9IHtcbiAgZmlsbDogJyNmZmYnXG59O1xudmFyIERFRkFVTFRfTkVYVEJUTl9TVFlMRSA9IHtcbiAgZmlsbDogJ2dyZWVuJ1xufTtcbnZhciBERUZBVUxUX1NQRUVEX0NPTlRST0xMRVJfU1RZTEUgPSB7XG4gIHBvaW50ZXI6IHtcbiAgICBmaWxsOiAnI2FhYScsXG4gICAgbGluZVdpZHRoOiAwXG4gIH0sXG4gIHNjcm9sbGVyOiB7XG4gICAgc3Ryb2tlOiAnI2FhYScsXG4gICAgZmlsbDogJyNhYWEnLFxuICAgIGxpbmVXaWR0aDogMSxcbiAgICBsaW5lQXBwZW5kV2lkdGg6IDUsXG4gICAgY3Vyc29yOiAncG9pbnRlcidcbiAgfSxcbiAgdGV4dDoge1xuICAgIGZpbGw6ICcjYWFhJyxcbiAgICB0ZXh0QmFzZWxpbmU6ICd0b3AnXG4gIH1cbn07XG52YXIgREVGQVVMVF9USU1FVFlQRV9DT05UUk9MTEVSX1NUWUxFID0ge1xuICBjaGVjazoge1xuICAgIHN0cm9rZTogJ2dyZWVuJyxcbiAgICBsaW5lV2lkdGg6IDNcbiAgfSxcbiAgYm94OiB7XG4gICAgZmlsbDogJyNmZmYnLFxuICAgIHN0cm9rZTogJyNhYWEnLFxuICAgIGxpbmVXaWR0aDogMixcbiAgICByYWRpdXM6IDMsXG4gICAgd2lkdGg6IDEyLFxuICAgIGhlaWdodDogMTJcbiAgfSxcbiAgdGV4dDoge1xuICAgIGZpbGw6ICcjYWFhJyxcbiAgICBmb250U2l6ZTogMTIsXG4gICAgdGV4dEJhc2VsaW5lOiAndG9wJ1xuICB9XG59O1xudmFyIERFRkFVTFRfQ09OVFJPTExFUl9DT05GSUcgPSB7XG4gIHNwZWVkOiAxLFxuICBsb29wOiBmYWxzZSxcbiAgZmlsbDogJyNmZmYnLFxuICBzdHJva2U6ICcjZmZmJyxcbiAgaGlkZVRpbWVUeXBlQ29udHJvbGxlcjogZmFsc2UsXG4gIHByZUJ0blN0eWxlOiB7XG4gICAgZmlsbDogJyNhYWEnLFxuICAgIHN0cm9rZTogJyNhYWEnXG4gIH0sXG4gIG5leHRCdG5TdHlsZToge1xuICAgIGZpbGw6ICcjYWFhJyxcbiAgICBzdHJva2U6ICcjYWFhJ1xuICB9LFxuICBwbGF5QnRuU3R5bGU6IHtcbiAgICBmaWxsOiAnI2FhYScsXG4gICAgc3Ryb2tlOiAnI2FhYScsXG4gICAgZmlsbE9wYWNpdHk6IDAuMDVcbiAgfSxcbiAgc3BlZWRDb250cm9sbGVyU3R5bGU6IERFRkFVTFRfU1BFRURfQ09OVFJPTExFUl9TVFlMRSxcbiAgdGltZVR5cGVDb250cm9sbGVyU3R5bGU6IERFRkFVTFRfVElNRVRZUEVfQ09OVFJPTExFUl9TVFlMRVxufTtcbnZhciBTUEVFRF9DT05UUk9MTEVSX09GRlNFVCA9IDExMDtcbnZhciBUT0dHTEVfTU9ERUxfT0ZGU0VUID0gNTA7XG5cbnZhciBDb250cm9sbGVyQnRuID1cbi8qKiBAY2xhc3MgKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gQ29udHJvbGxlckJ0bihjZmcpIHtcbiAgICB0aGlzLmNvbnRyb2xsZXJDZmcgPSBkZWVwTWl4KHt9LCBERUZBVUxUX0NPTlRST0xMRVJfQ09ORklHLCBjZmcpO1xuICAgIHRoaXMuZ3JvdXAgPSBjZmcuZ3JvdXA7XG4gICAgdGhpcy5jb250cm9sbGVyR3JvdXAgPSB0aGlzLmdyb3VwLmFkZEdyb3VwKHtcbiAgICAgIG5hbWU6ICdjb250cm9sbGVyLWdyb3VwJ1xuICAgIH0pO1xuICAgIHRoaXMuc3BlZWRBeGlzWSA9IFtdO1xuICAgIHRoaXMuY3VycmVudFNwZWVkID0gdGhpcy5jb250cm9sbGVyQ2ZnLnNwZWVkO1xuICAgIHRoaXMuY3VycmVudFR5cGUgPSAncmFuZ2UnO1xuICAgIHRoaXMuZm9udEZhbWlseSA9IGNmZy5mb250RmFtaWx5IHx8ICdBcmlhbCwgc2Fucy1zZXJpZic7XG4gICAgdGhpcy5pbml0KCk7XG4gIH1cblxuICBDb250cm9sbGVyQnRuLnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMucmVuZGVyUGxheUJ1dHRvbigpO1xuICB9O1xuICAvKiog6I635Y+W5pKt5pS+6ZSuIG1hcmtlciBwYXRoICovXG5cblxuICBDb250cm9sbGVyQnRuLnByb3RvdHlwZS5nZXROZXh0TWFya2VyUGF0aCA9IGZ1bmN0aW9uICh4LCB5LCBsZW4pIHtcbiAgICByZXR1cm4gW1snTScsIHgsIHkgLSBsZW5dLCBbJ0wnLCB4ICsgbGVuLCB5XSwgWydMJywgeCwgeSArIGxlbl0sIFsnWicsIHgsIHkgLSBsZW5dLCBbJ00nLCB4LCB5XSwgWydMJywgeCAtIGxlbiwgeSAtIGxlbl0sIFsnTCcsIHggLSBsZW4sIHkgKyBsZW5dLCBbJ1onXV07XG4gIH07XG5cbiAgQ29udHJvbGxlckJ0bi5wcm90b3R5cGUuZ2V0UHJlTWFya2VyUGF0aCA9IGZ1bmN0aW9uICh4LCB5LCBsZW4pIHtcbiAgICByZXR1cm4gW1snTScsIHgsIHkgLSBsZW5dLCBbJ0wnLCB4IC0gbGVuLCB5XSwgWydMJywgeCwgeSArIGxlbl0sIFsnTCcsIHgsIHkgLSBsZW5dLCBbJ00nLCB4LCB5XSwgWydMJywgeCArIGxlbiwgeSAtIGxlbl0sIFsnTCcsIHggKyBsZW4sIHkgKyBsZW5dLCBbJ1onXV07XG4gIH07XG5cbiAgQ29udHJvbGxlckJ0bi5wcm90b3R5cGUucmVuZGVyUGxheUJ1dHRvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgY29udHJvbGxlckNmZyA9IHRoaXMuY29udHJvbGxlckNmZztcbiAgICB2YXIgd2lkdGggPSBjb250cm9sbGVyQ2ZnLndpZHRoLFxuICAgICAgICBoZWlnaHQgPSBjb250cm9sbGVyQ2ZnLmhlaWdodCxcbiAgICAgICAgeCA9IGNvbnRyb2xsZXJDZmcueCxcbiAgICAgICAgeSA9IGNvbnRyb2xsZXJDZmcueSxcbiAgICAgICAgaGlkZVRpbWVUeXBlQ29udHJvbGxlciA9IGNvbnRyb2xsZXJDZmcuaGlkZVRpbWVUeXBlQ29udHJvbGxlcixcbiAgICAgICAgX2EgPSBjb250cm9sbGVyQ2ZnLmZpbGwsXG4gICAgICAgIGZpbGwgPSBfYSA9PT0gdm9pZCAwID8gREVGQVVMVF9SRUNUX0ZJTEwgOiBfYSxcbiAgICAgICAgX2IgPSBjb250cm9sbGVyQ2ZnLnN0cm9rZSxcbiAgICAgICAgc3Ryb2tlID0gX2IgPT09IHZvaWQgMCA/IERFRkFVTFRfUkVDVF9TVFJPS0UgOiBfYjtcblxuICAgIHZhciBwbGF5QnRuU3R5bGUgPSBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgREVGQVVMVF9QTEFZQlROX1NUWUxFKSwgY29udHJvbGxlckNmZy5wbGF5QnRuU3R5bGUgfHwge30pO1xuXG4gICAgdmFyIHByZUJ0blN0eWxlID0gX19hc3NpZ24oX19hc3NpZ24oe30sIERFRkFVTFRfUFJFQlROX1NUWUxFKSwgY29udHJvbGxlckNmZy5wcmVCdG5TdHlsZSB8fCB7fSk7XG5cbiAgICB2YXIgbmV4dEJ0blN0eWxlID0gX19hc3NpZ24oX19hc3NpZ24oe30sIERFRkFVTFRfTkVYVEJUTl9TVFlMRSksIGNvbnRyb2xsZXJDZmcubmV4dEJ0blN0eWxlIHx8IHt9KTtcblxuICAgIHZhciByID0gaGVpZ2h0IC8gMiAtIDU7XG4gICAgdmFyIHJlYWxZID0geSArIDEwOyAvLyDnu5jliLbmnIDlpJblsYLnmoTnn6nlvaLljIXlm7TmoYZcblxuICAgIHZhciBjb250YWluZXIgPSB0aGlzLmNvbnRyb2xsZXJHcm91cC5hZGRTaGFwZSgncmVjdCcsIHtcbiAgICAgIGF0dHJzOiB7XG4gICAgICAgIHg6IHgsXG4gICAgICAgIHk6IHJlYWxZLFxuICAgICAgICB3aWR0aDogd2lkdGgsXG4gICAgICAgIGhlaWdodDogaGVpZ2h0LFxuICAgICAgICBzdHJva2U6IHN0cm9rZSxcbiAgICAgICAgZmlsbDogZmlsbFxuICAgICAgfSxcbiAgICAgIG5hbWU6ICdjb250YWluZXItcmVjdCdcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLnBsYXlCdXR0b24pIHtcbiAgICAgIHRoaXMucGxheUJ1dHRvbi51cGRhdGUoe1xuICAgICAgICB4OiB3aWR0aCAvIDIsXG4gICAgICAgIHk6IHJlYWxZLFxuICAgICAgICByOiByXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wbGF5QnV0dG9uID0gbmV3IEJ1dHRvbih7XG4gICAgICAgIGdyb3VwOiB0aGlzLmNvbnRyb2xsZXJHcm91cCxcbiAgICAgICAgeDogd2lkdGggLyAyLFxuICAgICAgICB5OiByZWFsWSArIHIgKyA1LFxuICAgICAgICByOiByLFxuICAgICAgICBpc1BsYXk6IHRoaXMuaXNQbGF5LFxuICAgICAgICBzdHlsZTogcGxheUJ0blN0eWxlXG4gICAgICB9KTtcbiAgICB9IC8vIOWQjumAgOaMiemSrlxuXG5cbiAgICB2YXIgcHJlUGFkZGluZ1ggPSBwcmVCdG5TdHlsZS5vZmZzZXRYIHx8IDA7XG4gICAgdmFyIHByZVBhZGRpbmdZID0gcHJlQnRuU3R5bGUub2Zmc2V0WSB8fCAwO1xuICAgIHZhciBwcmVSID0gKHByZUJ0blN0eWxlLnNjYWxlIHx8IDEpICogcjtcbiAgICB0aGlzLmNvbnRyb2xsZXJHcm91cC5hZGRTaGFwZSgncGF0aCcsIHtcbiAgICAgIGF0dHJzOiBfX2Fzc2lnbih7XG4gICAgICAgIHBhdGg6IHRoaXMuZ2V0UHJlTWFya2VyUGF0aCh3aWR0aCAvIDIgLSA1ICogciArIHByZVBhZGRpbmdYLCByZWFsWSArIHIgKyA1ICsgcHJlUGFkZGluZ1ksIHByZVIgKiAwLjUpXG4gICAgICB9LCBwcmVCdG5TdHlsZSksXG4gICAgICBuYW1lOiBQUkVfU1RFUF9CVE5cbiAgICB9KTsgLy8g5YmN6L+b5oyJ6ZKuXG5cbiAgICB2YXIgbnh0UGFkZGluZ1ggPSBuZXh0QnRuU3R5bGUub2Zmc2V0WCB8fCAwO1xuICAgIHZhciBueHRQYWRkaW5nWSA9IG5leHRCdG5TdHlsZS5vZmZzZXRZIHx8IDA7XG4gICAgdmFyIG54dFIgPSAobmV4dEJ0blN0eWxlLnNjYWxlIHx8IDEpICogcjtcbiAgICB0aGlzLmNvbnRyb2xsZXJHcm91cC5hZGRTaGFwZSgncGF0aCcsIHtcbiAgICAgIGF0dHJzOiBfX2Fzc2lnbih7XG4gICAgICAgIHBhdGg6IHRoaXMuZ2V0TmV4dE1hcmtlclBhdGgod2lkdGggLyAyICsgNSAqIHIgKyBueHRQYWRkaW5nWCwgcmVhbFkgKyByICsgNSArIG54dFBhZGRpbmdZLCBueHRSICogMC41KVxuICAgICAgfSwgbmV4dEJ0blN0eWxlKSxcbiAgICAgIG5hbWU6IE5FWFRfU1RFUF9CVE5cbiAgICB9KTtcbiAgICBjb250YWluZXIudG9CYWNrKCk7IC8vIOiwg+iKgnNwZWVk55qE5oyJ6ZKuXG5cbiAgICB0aGlzLnJlbmRlclNwZWVkQnRuKCk7XG5cbiAgICBpZiAoIWhpZGVUaW1lVHlwZUNvbnRyb2xsZXIpIHtcbiAgICAgIHRoaXMucmVuZGVyVG9nZ2xlVGltZSgpO1xuICAgIH1cblxuICAgIHRoaXMuYmluZEV2ZW50KCk7IC8vIOagueaNrumFjee9rueahCBzY2FsZeOAgW9mZnNldFjvvIxvZmZzZXRZIOe8qeaUvuWSjOenu+WKqOaOp+WItuagj1xuXG4gICAgdmFyIF9jID0gdGhpcy5jb250cm9sbGVyQ2ZnLnNjYWxlLFxuICAgICAgICBzY2FsZSA9IF9jID09PSB2b2lkIDAgPyAxIDogX2M7XG4gICAgdmFyIGN1cnJlbnRCQm94ID0gdGhpcy5jb250cm9sbGVyR3JvdXAuZ2V0Q2FudmFzQkJveCgpO1xuICAgIHZhciBjZW50ZXJYID0gKGN1cnJlbnRCQm94Lm1heFggKyBjdXJyZW50QkJveC5taW5YKSAvIDI7XG4gICAgdmFyIGNlbnRlclkgPSAoY3VycmVudEJCb3gubWF4WSArIGN1cnJlbnRCQm94Lm1pblkpIC8gMjtcbiAgICB2YXIgbWF0cml4ID0gdHJhbnNmb3JtKFsxLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAxXSwgW1sndCcsIC1jZW50ZXJYLCAtY2VudGVyWV0sIFsncycsIHNjYWxlLCBzY2FsZV0sIFsndCcsIGNlbnRlclgsIGNlbnRlclldXSk7XG4gICAgdGhpcy5jb250cm9sbGVyR3JvdXAuc2V0TWF0cml4KG1hdHJpeCk7XG4gIH07XG5cbiAgQ29udHJvbGxlckJ0bi5wcm90b3R5cGUucmVuZGVyU3BlZWRCdG4gPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIF9hID0gdGhpcy5jb250cm9sbGVyQ2ZnLFxuICAgICAgICB5ID0gX2EueSxcbiAgICAgICAgd2lkdGggPSBfYS53aWR0aCxcbiAgICAgICAgaGlkZVRpbWVUeXBlQ29udHJvbGxlciA9IF9hLmhpZGVUaW1lVHlwZUNvbnRyb2xsZXI7XG5cbiAgICB2YXIgc3BlZWRDb250cm9sbGVyU3R5bGUgPSBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgREVGQVVMVF9TUEVFRF9DT05UUk9MTEVSX1NUWUxFKSwgdGhpcy5jb250cm9sbGVyQ2ZnLnNwZWVkQ29udHJvbGxlclN0eWxlIHx8IHt9KTtcblxuICAgIHZhciBfYiA9IHNwZWVkQ29udHJvbGxlclN0eWxlLnNjcm9sbGVyLFxuICAgICAgICBzY3JvbGxlciA9IF9iID09PSB2b2lkIDAgPyB7fSA6IF9iLFxuICAgICAgICBfYyA9IHNwZWVkQ29udHJvbGxlclN0eWxlLnRleHQsXG4gICAgICAgIHRleHQgPSBfYyA9PT0gdm9pZCAwID8ge30gOiBfYyxcbiAgICAgICAgX2QgPSBzcGVlZENvbnRyb2xsZXJTdHlsZS5wb2ludGVyLFxuICAgICAgICBwb2ludGVyID0gX2QgPT09IHZvaWQgMCA/IHt9IDogX2QsXG4gICAgICAgIF9lID0gc3BlZWRDb250cm9sbGVyU3R5bGUuc2NhbGUsXG4gICAgICAgIHNjYWxlID0gX2UgPT09IHZvaWQgMCA/IDEgOiBfZSxcbiAgICAgICAgX2YgPSBzcGVlZENvbnRyb2xsZXJTdHlsZS5vZmZzZXRYLFxuICAgICAgICBvZmZzZXRYID0gX2YgPT09IHZvaWQgMCA/IDAgOiBfZixcbiAgICAgICAgX2cgPSBzcGVlZENvbnRyb2xsZXJTdHlsZS5vZmZzZXRZLFxuICAgICAgICBvZmZzZXRZID0gX2cgPT09IHZvaWQgMCA/IDAgOiBfZztcbiAgICB2YXIgc3BlZWRHcm91cCA9IHRoaXMuY29udHJvbGxlckdyb3VwLmFkZEdyb3VwKHtcbiAgICAgIG5hbWU6ICdzcGVlZC1ncm91cCdcbiAgICB9KTtcbiAgICB0aGlzLnNwZWVkR3JvdXAgPSBzcGVlZEdyb3VwO1xuICAgIHZhciBzcGVlZE51bSA9IFtdO1xuICAgIHZhciBtYXhTcGVlZCA9IDU7XG4gICAgdGhpcy5zcGVlZEF4aXNZID0gWzE5LCAyMiwgMjYsIDMyLCAzOV07IC8vIOWinuWKoHNwZWVk5Yi75bqmXG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IDU7IGkrKykge1xuICAgICAgdmFyIGF4aXNZID0geSArIHRoaXMuc3BlZWRBeGlzWVtpXTsgLy8g54Gw6Imy5Yi75bqmXG5cbiAgICAgIHZhciBzdGFydFggPSB3aWR0aCAtICghaGlkZVRpbWVUeXBlQ29udHJvbGxlciA/IFNQRUVEX0NPTlRST0xMRVJfT0ZGU0VUIDogVE9HR0xFX01PREVMX09GRlNFVCk7XG4gICAgICBzcGVlZEdyb3VwLmFkZFNoYXBlKCdsaW5lJywge1xuICAgICAgICBhdHRyczogX19hc3NpZ24oe1xuICAgICAgICAgIHgxOiBzdGFydFgsXG4gICAgICAgICAgeDI6IHN0YXJ0WCArIDE1LFxuICAgICAgICAgIHkxOiBheGlzWSxcbiAgICAgICAgICB5MjogYXhpc1lcbiAgICAgICAgfSwgc2Nyb2xsZXIpLFxuICAgICAgICBzcGVlZDogbWF4U3BlZWQsXG4gICAgICAgIG5hbWU6ICdzcGVlZC1yZWN0J1xuICAgICAgfSk7XG4gICAgICB0aGlzLnNwZWVkQXhpc1lbaV0gPSBheGlzWTtcbiAgICAgIHNwZWVkTnVtLnB1c2gobWF4U3BlZWQpO1xuICAgICAgbWF4U3BlZWQgPSBtYXhTcGVlZCAtIDE7XG4gICAgfSAvLyDpgJ/luqbmlofmnKxcblxuXG4gICAgdGhpcy5zcGVlZFRleHQgPSBzcGVlZEdyb3VwLmFkZFNoYXBlKCd0ZXh0Jywge1xuICAgICAgYXR0cnM6IF9fYXNzaWduKHtcbiAgICAgICAgeDogd2lkdGggLSAoIWhpZGVUaW1lVHlwZUNvbnRyb2xsZXIgPyBTUEVFRF9DT05UUk9MTEVSX09GRlNFVCA6IFRPR0dMRV9NT0RFTF9PRkZTRVQpICsgMjAsXG4gICAgICAgIHk6IHRoaXMuc3BlZWRBeGlzWVswXSArIDQsXG4gICAgICAgIHRleHQ6IFwiMS4wWFwiLFxuICAgICAgICBmb250RmFtaWx5OiB0aGlzLmZvbnRGYW1pbHkgfHwgJ0FyaWFsLCBzYW5zLXNlcmlmJ1xuICAgICAgfSwgdGV4dClcbiAgICB9KTtcbiAgICB0aGlzLnNwZWVkUG9pbnQgPSBzcGVlZEdyb3VwLmFkZFNoYXBlKCdwYXRoJywge1xuICAgICAgYXR0cnM6IF9fYXNzaWduKHtcbiAgICAgICAgcGF0aDogdGhpcy5nZXRQb2ludGVyUGF0aCh3aWR0aCAtICghaGlkZVRpbWVUeXBlQ29udHJvbGxlciA/IFNQRUVEX0NPTlRST0xMRVJfT0ZGU0VUIDogVE9HR0xFX01PREVMX09GRlNFVCksIDApLFxuICAgICAgICBtYXRyaXg6IFsxLCAwLCAwLCAwLCAxLCAwLCAwLCB0aGlzLnNwZWVkQXhpc1lbNF0sIDFdXG4gICAgICB9LCBwb2ludGVyKVxuICAgIH0pOyAvLyDmoLnmja7phY3nva7lnKggc3BlZWRDb250cm9sbGVyU3R5bGUg5Lit55qEIHNjYWxlIG9mZnNldFggb2Zmc2V0WSDnvKnmlL7lkoznp7vliqjpgJ/luqbmjqfliLblmahcblxuICAgIHZhciBjdXJyZW50QkJveCA9IHRoaXMuc3BlZWRHcm91cC5nZXRDYW52YXNCQm94KCk7XG4gICAgdmFyIGNlbnRlclggPSAoY3VycmVudEJCb3gubWF4WCArIGN1cnJlbnRCQm94Lm1pblgpIC8gMjtcbiAgICB2YXIgY2VudGVyWSA9IChjdXJyZW50QkJveC5tYXhZICsgY3VycmVudEJCb3gubWluWSkgLyAyO1xuICAgIHZhciBtYXRyaXggPSB0aGlzLnNwZWVkR3JvdXAuZ2V0TWF0cml4KCkgfHwgWzEsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDFdO1xuICAgIG1hdHJpeCA9IHRyYW5zZm9ybShtYXRyaXgsIFtbJ3QnLCAtY2VudGVyWCwgLWNlbnRlclldLCBbJ3MnLCBzY2FsZSwgc2NhbGVdLCBbJ3QnLCBjZW50ZXJYICsgb2Zmc2V0WCAqIHNjYWxlLCBjZW50ZXJZICsgb2Zmc2V0WSAqIHNjYWxlXV0pO1xuICAgIHRoaXMuc3BlZWRHcm91cC5zZXRNYXRyaXgobWF0cml4KTtcbiAgfTtcblxuICBDb250cm9sbGVyQnRuLnByb3RvdHlwZS5nZXRQb2ludGVyUGF0aCA9IGZ1bmN0aW9uICh4LCB5KSB7XG4gICAgcmV0dXJuIFtbJ00nLCB4LCB5XSwgWydMJywgeCAtIDEwLCB5IC0gNF0sIFsnTCcsIHggLSAxMCwgeSArIDRdLCBbJ1onXV07XG4gIH07XG5cbiAgQ29udHJvbGxlckJ0bi5wcm90b3R5cGUucmVuZGVyVG9nZ2xlVGltZSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgX2E7XG5cbiAgICB2YXIgd2lkdGggPSB0aGlzLmNvbnRyb2xsZXJDZmcud2lkdGg7XG5cbiAgICB2YXIgdGltZVR5cGVDb250cm9sbGVyU3R5bGUgPSBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgREVGQVVMVF9USU1FVFlQRV9DT05UUk9MTEVSX1NUWUxFKSwgdGhpcy5jb250cm9sbGVyQ2ZnLnRpbWVUeXBlQ29udHJvbGxlclN0eWxlIHx8IHt9KTtcblxuICAgIHZhciBfYiA9IHRpbWVUeXBlQ29udHJvbGxlclN0eWxlLnNjYWxlLFxuICAgICAgICBzY2FsZSA9IF9iID09PSB2b2lkIDAgPyAxIDogX2IsXG4gICAgICAgIF9jID0gdGltZVR5cGVDb250cm9sbGVyU3R5bGUub2Zmc2V0WCxcbiAgICAgICAgb2Zmc2V0WCA9IF9jID09PSB2b2lkIDAgPyAwIDogX2MsXG4gICAgICAgIF9kID0gdGltZVR5cGVDb250cm9sbGVyU3R5bGUub2Zmc2V0WSxcbiAgICAgICAgb2Zmc2V0WSA9IF9kID09PSB2b2lkIDAgPyAwIDogX2QsXG4gICAgICAgIF9lID0gdGltZVR5cGVDb250cm9sbGVyU3R5bGUuYm94LFxuICAgICAgICBib3ggPSBfZSA9PT0gdm9pZCAwID8ge30gOiBfZSxcbiAgICAgICAgX2YgPSB0aW1lVHlwZUNvbnRyb2xsZXJTdHlsZS5jaGVjayxcbiAgICAgICAgY2hlY2sgPSBfZiA9PT0gdm9pZCAwID8ge30gOiBfZixcbiAgICAgICAgX2cgPSB0aW1lVHlwZUNvbnRyb2xsZXJTdHlsZS50ZXh0LFxuICAgICAgICB0ZXh0ID0gX2cgPT09IHZvaWQgMCA/IHt9IDogX2c7XG4gICAgdGhpcy50b2dnbGVHcm91cCA9IHRoaXMuY29udHJvbGxlckdyb3VwLmFkZEdyb3VwKHtcbiAgICAgIG5hbWU6ICd0b2dnbGUtZ3JvdXAnXG4gICAgfSk7XG4gICAgdGhpcy50b2dnbGVHcm91cC5hZGRTaGFwZSgncmVjdCcsIHtcbiAgICAgIGF0dHJzOiBfX2Fzc2lnbih7XG4gICAgICAgIHg6IHdpZHRoIC0gVE9HR0xFX01PREVMX09GRlNFVCxcbiAgICAgICAgeTogdGhpcy5zcGVlZEF4aXNZWzBdICsgMy41XG4gICAgICB9LCBib3gpLFxuICAgICAgaXNDaGVja2VkOiBmYWxzZSxcbiAgICAgIG5hbWU6ICd0b2dnbGUtbW9kZWwnXG4gICAgfSk7XG4gICAgdGhpcy5jaGVja2VkSWNvbiA9IHRoaXMudG9nZ2xlR3JvdXAuYWRkU2hhcGUoJ3BhdGgnLCB7XG4gICAgICBhdHRyczogX19hc3NpZ24oe1xuICAgICAgICBwYXRoOiBbWydNJywgd2lkdGggLSBUT0dHTEVfTU9ERUxfT0ZGU0VUICsgMywgdGhpcy5zcGVlZEF4aXNZWzFdICsgNl0sIFsnTCcsIHdpZHRoIC0gVE9HR0xFX01PREVMX09GRlNFVCArIDcsIHRoaXMuc3BlZWRBeGlzWVsxXSArIDEwXSwgWydMJywgd2lkdGggLSBUT0dHTEVfTU9ERUxfT0ZGU0VUICsgMTIsIHRoaXMuc3BlZWRBeGlzWVsxXSArIDRdXVxuICAgICAgfSwgY2hlY2spLFxuICAgICAgY2FwdHVyZTogZmFsc2VcbiAgICB9KTtcbiAgICB0aGlzLmNoZWNrZWRJY29uLmhpZGUoKTtcbiAgICB0aGlzLmNoZWNrZWRUZXh0ID0gdGhpcy50b2dnbGVHcm91cC5hZGRTaGFwZSgndGV4dCcsIHtcbiAgICAgIGF0dHJzOiBfX2Fzc2lnbih7XG4gICAgICAgIHRleHQ6ICgoX2EgPSB0aGlzLmNvbnRyb2xsZXJDZmcpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS50aW1lUG9pbnRDb250cm9sbGVyVGV4dCkgfHwgJ+WNleS4gOaXtumXtCcsXG4gICAgICAgIHg6IHdpZHRoIC0gVE9HR0xFX01PREVMX09GRlNFVCArIDE1LFxuICAgICAgICB5OiB0aGlzLnNwZWVkQXhpc1lbMF0gKyA0LFxuICAgICAgICBmb250RmFtaWx5OiB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmJvZHksIG51bGwpLmdldFByb3BlcnR5VmFsdWUoJ2ZvbnQtZmFtaWx5JykgfHwgJ0FyaWFsLCBzYW5zLXNlcmlmJyA6ICdBcmlhbCwgc2Fucy1zZXJpZidcbiAgICAgIH0sIHRleHQpXG4gICAgfSk7IC8vIOagueaNrumFjee9ruWcqCB0aW1lVHlwZUNvbnRyb2xsZXJTdHlsZSDkuK3nmoQgc2NhbGUgb2Zmc2V0WCBvZmZzZXRZIOe8qeaUvuWSjOenu+WKqOmAn+W6puaOp+WItuWZqFxuXG4gICAgdmFyIGN1cnJlbnRCQm94ID0gdGhpcy50b2dnbGVHcm91cC5nZXRDYW52YXNCQm94KCk7XG4gICAgdmFyIGNlbnRlclggPSAoY3VycmVudEJCb3gubWF4WCArIGN1cnJlbnRCQm94Lm1pblgpIC8gMjtcbiAgICB2YXIgY2VudGVyWSA9IChjdXJyZW50QkJveC5tYXhZICsgY3VycmVudEJCb3gubWluWSkgLyAyO1xuICAgIHZhciBtYXRyaXggPSB0aGlzLnRvZ2dsZUdyb3VwLmdldE1hdHJpeCgpIHx8IFsxLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAxXTtcbiAgICBtYXRyaXggPSB0cmFuc2Zvcm0obWF0cml4LCBbWyd0JywgLWNlbnRlclgsIC1jZW50ZXJZXSwgWydzJywgc2NhbGUsIHNjYWxlXSwgWyd0JywgY2VudGVyWCArIG9mZnNldFggKiBzY2FsZSwgY2VudGVyWSArIG9mZnNldFkgKiBzY2FsZV1dKTtcbiAgICB0aGlzLnRvZ2dsZUdyb3VwLnNldE1hdHJpeChtYXRyaXgpO1xuICB9O1xuXG4gIENvbnRyb2xsZXJCdG4ucHJvdG90eXBlLmJpbmRFdmVudCA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdGhpcy5zcGVlZEdyb3VwLm9uKCdzcGVlZC1yZWN0OmNsaWNrJywgZnVuY3Rpb24gKGV2dCkge1xuICAgICAgdmFyIGN1cnJlbnRQb2ludGVyWSA9IGV2dC50YXJnZXQuYXR0cigneTEnKTtcblxuICAgICAgdmFyIHBvaW50ZXJNYXRyaXggPSBfdGhpcy5zcGVlZFBvaW50LmF0dHIoJ21hdHJpeCcpO1xuXG4gICAgICB2YXIgY3VycmVudFlJZHggPSBfdGhpcy5zcGVlZEF4aXNZLmluZGV4T2YocG9pbnRlck1hdHJpeFs3XSB8fCAwKTtcblxuICAgICAgdmFyIHRhcmdldFlJZHggPSBfdGhpcy5zcGVlZEF4aXNZLmluZGV4T2YoY3VycmVudFBvaW50ZXJZKTtcblxuICAgICAgdmFyIHlEaWZmID0gX3RoaXMuc3BlZWRBeGlzWVt0YXJnZXRZSWR4XSAtIF90aGlzLnNwZWVkQXhpc1lbY3VycmVudFlJZHhdO1xuICAgICAgcG9pbnRlck1hdHJpeCA9IHRyYW5zZm9ybShwb2ludGVyTWF0cml4LCBbWyd0JywgMCwgeURpZmZdXSk7XG5cbiAgICAgIF90aGlzLnNwZWVkUG9pbnQuc2V0TWF0cml4KHBvaW50ZXJNYXRyaXgpO1xuXG4gICAgICBfdGhpcy5jdXJyZW50U3BlZWQgPSBfdGhpcy5zcGVlZEF4aXNZLmxlbmd0aCAtIHRhcmdldFlJZHg7XG5cbiAgICAgIF90aGlzLnNwZWVkVGV4dC5hdHRyKCd0ZXh0JywgX3RoaXMuY3VycmVudFNwZWVkICsgXCIuMFhcIik7XG5cbiAgICAgIF90aGlzLmdyb3VwLmVtaXQoVElNRUJBUl9DT05GSUdfQ0hBTkdFLCB7XG4gICAgICAgIHNwZWVkOiBfdGhpcy5jdXJyZW50U3BlZWQsXG4gICAgICAgIHR5cGU6IF90aGlzLmN1cnJlbnRUeXBlXG4gICAgICB9KTtcbiAgICB9KTtcbiAgICB0aGlzLnNwZWVkR3JvdXAub24oJ21vdXNld2hlZWwnLCBmdW5jdGlvbiAoZXZ0KSB7XG4gICAgICBldnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHZhciBwb2ludGVyTWF0cml4ID0gX3RoaXMuc3BlZWRQb2ludC5hdHRyKCdtYXRyaXgnKSB8fCBbMSwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMV07XG4gICAgICB2YXIgY3VycmVudFBvaW50ZXJZID0gcG9pbnRlck1hdHJpeFs3XTtcblxuICAgICAgdmFyIGN1cnJlbnRZSWR4ID0gX3RoaXMuc3BlZWRBeGlzWS5pbmRleE9mKGN1cnJlbnRQb2ludGVyWSk7XG5cbiAgICAgIGlmIChjdXJyZW50WUlkeCA9PT0gLTEpIHtcbiAgICAgICAgLy8g5om+5Yiw5pyA6L+R55qE5LiA5LiqIHlcbiAgICAgICAgdmFyIG1pbkRpc3RfMSA9IEluZmluaXR5O1xuXG4gICAgICAgIF90aGlzLnNwZWVkQXhpc1kuZm9yRWFjaChmdW5jdGlvbiAoeSwgaWR4KSB7XG4gICAgICAgICAgdmFyIGRpc3QgPSBNYXRoLmFicyh5IC0gY3VycmVudFBvaW50ZXJZKTtcblxuICAgICAgICAgIGlmIChtaW5EaXN0XzEgPiBkaXN0KSB7XG4gICAgICAgICAgICBtaW5EaXN0XzEgPSBkaXN0O1xuICAgICAgICAgICAgY3VycmVudFlJZHggPSBpZHg7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGV2dC5vcmlnaW5hbEV2ZW50LmRlbHRhWSA+IDApIGN1cnJlbnRZSWR4ID0gTWF0aC5tYXgoMCwgY3VycmVudFlJZHggLSAxKTtlbHNlIGN1cnJlbnRZSWR4ID0gTWF0aC5taW4oX3RoaXMuc3BlZWRBeGlzWS5sZW5ndGggLSAxLCBjdXJyZW50WUlkeCArIDEpO1xuICAgICAgdmFyIHlEaWZmID0gX3RoaXMuc3BlZWRBeGlzWVtjdXJyZW50WUlkeF0gLSBjdXJyZW50UG9pbnRlclk7XG4gICAgICBwb2ludGVyTWF0cml4ID0gdHJhbnNmb3JtKHBvaW50ZXJNYXRyaXgsIFtbJ3QnLCAwLCB5RGlmZl1dKTtcblxuICAgICAgX3RoaXMuc3BlZWRQb2ludC5zZXRNYXRyaXgocG9pbnRlck1hdHJpeCk7XG5cbiAgICAgIF90aGlzLmN1cnJlbnRTcGVlZCA9IF90aGlzLnNwZWVkQXhpc1kubGVuZ3RoIC0gY3VycmVudFlJZHg7XG5cbiAgICAgIF90aGlzLnNwZWVkVGV4dC5hdHRyKCd0ZXh0JywgX3RoaXMuY3VycmVudFNwZWVkICsgXCIuMFhcIik7XG5cbiAgICAgIF90aGlzLmdyb3VwLmVtaXQoVElNRUJBUl9DT05GSUdfQ0hBTkdFLCB7XG4gICAgICAgIHNwZWVkOiBfdGhpcy5jdXJyZW50U3BlZWQsXG4gICAgICAgIHR5cGU6IF90aGlzLmN1cnJlbnRUeXBlXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLnRvZ2dsZUdyb3VwKSB7XG4gICAgICB0aGlzLnRvZ2dsZUdyb3VwLm9uKCd0b2dnbGUtbW9kZWw6Y2xpY2snLCBmdW5jdGlvbiAoZXZ0KSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG5cbiAgICAgICAgdmFyIGlzQ2hlY2tlZCA9IGV2dC50YXJnZXQuZ2V0KCdpc0NoZWNrZWQnKTtcblxuICAgICAgICBpZiAoIWlzQ2hlY2tlZCkge1xuICAgICAgICAgIF90aGlzLmNoZWNrZWRJY29uLnNob3coKTtcblxuICAgICAgICAgIF90aGlzLmNoZWNrZWRUZXh0LmF0dHIoJ3RleHQnLCAoKF9hID0gX3RoaXMuY29udHJvbGxlckNmZykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnRpbWVSYW5nZUNvbnRyb2xsZXJUZXh0KSB8fCAn5pe26Ze06IyD5Zu0Jyk7XG5cbiAgICAgICAgICBfdGhpcy5jdXJyZW50VHlwZSA9ICdzaW5nbGUnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIF90aGlzLmNoZWNrZWRJY29uLmhpZGUoKTtcblxuICAgICAgICAgIF90aGlzLmNoZWNrZWRUZXh0LmF0dHIoJ3RleHQnLCAoKF9iID0gX3RoaXMuY29udHJvbGxlckNmZykgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLnRpbWVQb2ludENvbnRyb2xsZXJUZXh0KSB8fCAn5Y2V5LiA5pe26Ze0Jyk7XG5cbiAgICAgICAgICBfdGhpcy5jdXJyZW50VHlwZSA9ICdyYW5nZSc7XG4gICAgICAgIH1cblxuICAgICAgICBldnQudGFyZ2V0LnNldCgnaXNDaGVja2VkJywgIWlzQ2hlY2tlZCk7XG5cbiAgICAgICAgX3RoaXMuZ3JvdXAuZW1pdChUSU1FQkFSX0NPTkZJR19DSEFOR0UsIHtcbiAgICAgICAgICB0eXBlOiBfdGhpcy5jdXJyZW50VHlwZSxcbiAgICAgICAgICBzcGVlZDogX3RoaXMuY3VycmVudFNwZWVkXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIENvbnRyb2xsZXJCdG4ucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5zcGVlZEdyb3VwLm9mZignc3BlZWQtcmVjdDpjbGljaycpO1xuXG4gICAgaWYgKHRoaXMudG9nZ2xlR3JvdXApIHtcbiAgICAgIHRoaXMudG9nZ2xlR3JvdXAub2ZmKCd0b2dnbGUtbW9kZWw6Y2xpY2snKTtcbiAgICAgIHRoaXMudG9nZ2xlR3JvdXAuZGVzdHJveSgpO1xuICAgIH1cblxuICAgIHRoaXMuc3BlZWRHcm91cC5kZXN0cm95KCk7XG4gIH07XG5cbiAgcmV0dXJuIENvbnRyb2xsZXJCdG47XG59KCk7XG5cbmV4cG9ydCBkZWZhdWx0IENvbnRyb2xsZXJCdG47IiwidmFyIF9fYXNzaWduID0gdGhpcyAmJiB0aGlzLl9fYXNzaWduIHx8IGZ1bmN0aW9uICgpIHtcbiAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0KSB7XG4gICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG4gICAgICBzID0gYXJndW1lbnRzW2ldO1xuXG4gICAgICBmb3IgKHZhciBwIGluIHMpIHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdFtwXSA9IHNbcF07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHQ7XG4gIH07XG5cbiAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59O1xuXG5pbXBvcnQgeyBnZXQsIHNpemUsIGFzc2lnbiwgZWFjaCB9IGZyb20gJ0BhbnR2L3V0aWwnO1xuaW1wb3J0IFRyZW5kIGZyb20gJy4vdHJlbmQnO1xuaW1wb3J0IEhhbmRsZXIgZnJvbSAnLi9oYW5kbGVyJztcbmltcG9ydCB7IGlzU3RyaW5nIH0gZnJvbSAnQGFudHYvdXRpbCc7XG5pbXBvcnQgQ29udHJvbGxlckJ0biBmcm9tICcuL2NvbnRyb2xsZXJCdG4nO1xuaW1wb3J0IHsgVkFMVUVfQ0hBTkdFLCBUSU1FTElORV9TVEFSVCwgVElNRUJBUl9DT05GSUdfQ0hBTkdFLCBQTEFZX1BBVVNFX0JUTiwgTkVYVF9TVEVQX0JUTiwgUFJFX1NURVBfQlROLCBUSU1FTElORV9FTkQgfSBmcm9tICcuL2NvbnN0YW50Jztcbi8qKlxuICog5LiA5Lqb6buY6K6k55qE5qC35byP6YWN572uXG4gKi9cblxuZXhwb3J0IHZhciBCQUNLR1JPVU5EX1NUWUxFID0ge1xuICBmaWxsOiAnIzQxNjE4MCcsXG4gIG9wYWNpdHk6IDAuMDVcbn07XG52YXIgU0lNUExFX0JBQ0tHUk9VTkRfU1RZTEUgPSB7XG4gIGZpbGw6ICcjNDE2MTgwJyxcbiAgb3BhY2l0eTogMC4xNSxcbiAgcmFkaXVzOiA1XG59O1xuZXhwb3J0IHZhciBGT1JFR1JPVU5EX1NUWUxFID0ge1xuICBmaWxsOiAnIzVCOEZGOScsXG4gIG9wYWNpdHk6IDAuMyxcbiAgY3Vyc29yOiAnZ3JhYidcbn07XG5leHBvcnQgdmFyIERFRkFVTFRfSEFORExFUl9XSURUSCA9IDI7XG5leHBvcnQgdmFyIEhBTkRMRVJfU1RZTEUgPSB7XG4gIHdpZHRoOiBERUZBVUxUX0hBTkRMRVJfV0lEVEgsXG4gIGhlaWdodDogMjRcbn07XG5leHBvcnQgdmFyIFRFWFRfU1RZTEUgPSB7XG4gIHRleHRCYXNlbGluZTogJ21pZGRsZScsXG4gIGZpbGw6ICcjMDAwJyxcbiAgb3BhY2l0eTogMC40NVxufTtcbmV4cG9ydCB2YXIgVElDS19MQUJFTF9TVFlMRSA9IHtcbiAgdGV4dEFsaWduOiAnY2VudGVyJyxcbiAgdGV4dEJhc2VsaW5lOiAndG9wJyxcbiAgZmlsbDogJyM2MDc4ODknLFxuICBvcGFjaXR5OiAwLjM1XG59O1xuZXhwb3J0IHZhciBUSUNLX0xJTkVfU1RZTEUgPSB7XG4gIGxpbmVXaWR0aDogMSxcbiAgc3Ryb2tlOiAnI2NjYydcbn07XG5cbnZhciBUcmVuZFRpbWVCYXIgPVxuLyoqIEBjbGFzcyAqL1xuZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBUcmVuZFRpbWVCYXIoY2ZnKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHRoaXMucHJldlggPSAwO1xuXG4gICAgdGhpcy5vbk1vdXNlRG93biA9IGZ1bmN0aW9uIChoYW5kbGVyKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgLy8gMS4g6K6w5b2V54K55Ye755qE5ruR5Z2XXG4gICAgICAgIF90aGlzLmN1cnJlbnRIYW5kbGVyID0gaGFuZGxlcjtcbiAgICAgICAgdmFyIGV2ZW50ID0gZS5vcmlnaW5hbEV2ZW50OyAvLyAyLiDlrZjlgqjlvZPliY3ngrnlh7vkvY3nva5cblxuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsgLy8g5YW85a6556e75Yqo56uv6I635Y+W5pWw5o2uXG5cbiAgICAgICAgX3RoaXMucHJldlggPSBnZXQoZXZlbnQsICd0b3VjaGVzLjAucGFnZVgnLCBldmVudC5wYWdlWCk7IC8vIDMuIOW8gOWni+a7keWKqOeahOaXtuWAme+8jOe7keWumiBtb3ZlIOWSjCB1cCDkuovku7ZcblxuICAgICAgICB2YXIgY29udGFpbmVyRE9NID0gX3RoaXMuY2FudmFzLmdldCgnY29udGFpbmVyJyk7XG5cbiAgICAgICAgY29udGFpbmVyRE9NLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIF90aGlzLm9uTW91c2VNb3ZlKTtcbiAgICAgICAgY29udGFpbmVyRE9NLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBfdGhpcy5vbk1vdXNlVXApO1xuICAgICAgICBjb250YWluZXJET00uYWRkRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsIF90aGlzLm9uTW91c2VVcCk7IC8vIOenu+WKqOerr+S6i+S7tlxuXG4gICAgICAgIGNvbnRhaW5lckRPTS5hZGRFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCBfdGhpcy5vbk1vdXNlTW92ZSk7XG4gICAgICAgIGNvbnRhaW5lckRPTS5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIF90aGlzLm9uTW91c2VVcCk7XG4gICAgICAgIGNvbnRhaW5lckRPTS5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGNhbmNlbCcsIF90aGlzLm9uTW91c2VVcCk7XG4gICAgICB9O1xuICAgIH07XG5cbiAgICB0aGlzLm9uTW91c2VNb3ZlID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIC8vIOa7keWKqOi/h+eoi+S4re+8jOiuoeeul+WBj+enu++8jOabtOaWsOa7keWdl++8jOeEtuWQjiBlbWl0IOaVsOaNruWHuuWOu1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHZhciB4ID0gZ2V0KGUsICd0b3VjaGVzLjAucGFnZVgnLCBlLnBhZ2VYKTsgLy8g5qiq5ZCR55qEIHNsaWRlciDlj6rlpITnkIYgeFxuXG4gICAgICB2YXIgb2Zmc2V0WCA9IHggLSBfdGhpcy5wcmV2WDtcblxuICAgICAgdmFyIG9mZnNldFhSYW5nZSA9IF90aGlzLmFkanVzdE9mZnNldFJhbmdlKG9mZnNldFggLyBfdGhpcy53aWR0aCk7IC8vIOabtOaWsCBzdGFydCBlbmQgcmFuZ2Ug6IyD5Zu0XG5cblxuICAgICAgX3RoaXMudXBkYXRlU3RhcnRFbmQob2Zmc2V0WFJhbmdlKTsgLy8g5pu05pawIHVpXG5cblxuICAgICAgX3RoaXMudXBkYXRlVUkoKTtcblxuICAgICAgX3RoaXMucHJldlggPSB4O1xuICAgIH07XG5cbiAgICB0aGlzLm9uTW91c2VVcCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIOe7k+adn+S5i+WQju+8jOWPlua2iOe7keWumueahOS6i+S7tlxuICAgICAgaWYgKF90aGlzLmN1cnJlbnRIYW5kbGVyKSB7XG4gICAgICAgIF90aGlzLmN1cnJlbnRIYW5kbGVyID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICB2YXIgY29udGFpbmVyRE9NID0gX3RoaXMuY2FudmFzLmdldCgnY29udGFpbmVyJyk7XG5cbiAgICAgIGlmIChjb250YWluZXJET00pIHtcbiAgICAgICAgY29udGFpbmVyRE9NLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIF90aGlzLm9uTW91c2VNb3ZlKTtcbiAgICAgICAgY29udGFpbmVyRE9NLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBfdGhpcy5vbk1vdXNlVXApOyAvLyDpmLLmraLmu5HliqjliLAgY2FudmFzIOWklumDqOS5i+WQju+8jOeKtuaAgeS4ouWksVxuXG4gICAgICAgIGNvbnRhaW5lckRPTS5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWxlYXZlJywgX3RoaXMub25Nb3VzZVVwKTsgLy8g56e75Yqo56uv5LqL5Lu2XG5cbiAgICAgICAgY29udGFpbmVyRE9NLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIF90aGlzLm9uTW91c2VNb3ZlKTtcbiAgICAgICAgY29udGFpbmVyRE9NLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgX3RoaXMub25Nb3VzZVVwKTtcbiAgICAgICAgY29udGFpbmVyRE9NLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoY2FuY2VsJywgX3RoaXMub25Nb3VzZVVwKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdmFyIF9hID0gY2ZnLngsXG4gICAgICAgIHggPSBfYSA9PT0gdm9pZCAwID8gMCA6IF9hLFxuICAgICAgICBfYiA9IGNmZy55LFxuICAgICAgICB5ID0gX2IgPT09IHZvaWQgMCA/IDAgOiBfYixcbiAgICAgICAgX2MgPSBjZmcud2lkdGgsXG4gICAgICAgIHdpZHRoID0gX2MgPT09IHZvaWQgMCA/IDEwMCA6IF9jLFxuICAgICAgICBoZWlnaHQgPSBjZmcuaGVpZ2h0LFxuICAgICAgICBfZCA9IGNmZy5wYWRkaW5nLFxuICAgICAgICBwYWRkaW5nID0gX2QgPT09IHZvaWQgMCA/IDEwIDogX2QsXG4gICAgICAgIHRyZW5kQ2ZnID0gY2ZnLnRyZW5kQ2ZnLFxuICAgICAgICBfZSA9IGNmZy5jb250cm9sbGVyQ2ZnLFxuICAgICAgICBjb250cm9sbGVyQ2ZnID0gX2UgPT09IHZvaWQgMCA/IHtcbiAgICAgIHNwZWVkOiAxXG4gICAgfSA6IF9lLFxuICAgICAgICBfZiA9IGNmZy5iYWNrZ3JvdW5kU3R5bGUsXG4gICAgICAgIGJhY2tncm91bmRTdHlsZSA9IF9mID09PSB2b2lkIDAgPyB7fSA6IF9mLFxuICAgICAgICBfZyA9IGNmZy5mb3JlZ3JvdW5kU3R5bGUsXG4gICAgICAgIGZvcmVncm91bmRTdHlsZSA9IF9nID09PSB2b2lkIDAgPyB7fSA6IF9nLFxuICAgICAgICBfaCA9IGNmZy5oYW5kbGVyU3R5bGUsXG4gICAgICAgIGhhbmRsZXJTdHlsZSA9IF9oID09PSB2b2lkIDAgPyB7fSA6IF9oLFxuICAgICAgICBfaiA9IGNmZy50ZXh0U3R5bGUsXG4gICAgICAgIHRleHRTdHlsZSA9IF9qID09PSB2b2lkIDAgPyB7fSA6IF9qLFxuICAgICAgICAvLyDnvKnnlaXovbTnmoTliJ3lp4vkvY3nva5cbiAgICBfayA9IGNmZy5zdGFydCxcbiAgICAgICAgLy8g57yp55Wl6L2055qE5Yid5aeL5L2N572uXG4gICAgc3RhcnQgPSBfayA9PT0gdm9pZCAwID8gMCA6IF9rLFxuICAgICAgICBfbCA9IGNmZy5lbmQsXG4gICAgICAgIGVuZCA9IF9sID09PSB2b2lkIDAgPyAxIDogX2wsXG4gICAgICAgIF9tID0gY2ZnLm1pblRleHQsXG4gICAgICAgIG1pblRleHQgPSBfbSA9PT0gdm9pZCAwID8gJycgOiBfbSxcbiAgICAgICAgX28gPSBjZmcubWF4VGV4dCxcbiAgICAgICAgbWF4VGV4dCA9IF9vID09PSB2b2lkIDAgPyAnJyA6IF9vLFxuICAgICAgICBncm91cCA9IGNmZy5ncm91cCxcbiAgICAgICAgZ3JhcGggPSBjZmcuZ3JhcGgsXG4gICAgICAgIGNhbnZhcyA9IGNmZy5jYW52YXMsXG4gICAgICAgIF9wID0gY2ZnLnRpY2ssXG4gICAgICAgIHRpY2sgPSBfcCA9PT0gdm9pZCAwID8ge1xuICAgICAgdGlja0xhYmVsU3R5bGU6IHt9LFxuICAgICAgdGlja0xpbmVTdHlsZToge30sXG4gICAgICB0aWNrTGFiZWxGb3JtYXR0ZXI6IGZ1bmN0aW9uIHRpY2tMYWJlbEZvcm1hdHRlcihkKSB7XG4gICAgICAgIHJldHVybiBkO1xuICAgICAgfSxcbiAgICAgIHRpY2tzOiBbXVxuICAgIH0gOiBfcCxcbiAgICAgICAgdHlwZSA9IGNmZy50eXBlO1xuICAgIHRoaXMuZ3JhcGggPSBncmFwaDtcbiAgICB0aGlzLmNhbnZhcyA9IGNhbnZhcztcbiAgICB0aGlzLmdyb3VwID0gZ3JvdXA7XG4gICAgdGhpcy50aW1lQmFyVHlwZSA9IHR5cGU7IC8vIHBvc2l0aW9uIHNpemVcblxuICAgIHRoaXMueCA9IHg7XG4gICAgdGhpcy55ID0geTtcbiAgICB0aGlzLndpZHRoID0gd2lkdGg7XG4gICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgdGhpcy5wYWRkaW5nID0gcGFkZGluZztcbiAgICB0aGlzLnRpY2tzID0gdGljay50aWNrcztcbiAgICB0aGlzLnRyZW5kQ2ZnID0gdHJlbmRDZmc7XG4gICAgdGhpcy5jb250cm9sbGVyQ2ZnID0gY29udHJvbGxlckNmZztcbiAgICB0aGlzLmN1cnJlbnRTcGVlZCA9IGNvbnRyb2xsZXJDZmcuc3BlZWQgfHwgMTtcbiAgICB0aGlzLnRpY2tMYWJlbEZvcm1hdHRlciA9IHRpY2sudGlja0xhYmVsRm9ybWF0dGVyOyAvLyBzdHlsZVxuXG4gICAgaWYgKHR5cGUgPT09ICd0cmVuZCcpIHtcbiAgICAgIHRoaXMuYmFja2dyb3VuZFN0eWxlID0gX19hc3NpZ24oX19hc3NpZ24oe30sIEJBQ0tHUk9VTkRfU1RZTEUpLCBiYWNrZ3JvdW5kU3R5bGUpO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3NpbXBsZScpIHtcbiAgICAgIHRoaXMuYmFja2dyb3VuZFN0eWxlID0gX19hc3NpZ24oX19hc3NpZ24oe30sIFNJTVBMRV9CQUNLR1JPVU5EX1NUWUxFKSwgYmFja2dyb3VuZFN0eWxlKTtcbiAgICB9XG5cbiAgICB0aGlzLmZvcmVncm91bmRTdHlsZSA9IF9fYXNzaWduKF9fYXNzaWduKHt9LCBGT1JFR1JPVU5EX1NUWUxFKSwgZm9yZWdyb3VuZFN0eWxlKTtcbiAgICB0aGlzLmhhbmRsZXJTdHlsZSA9IF9fYXNzaWduKF9fYXNzaWduKHt9LCBIQU5ETEVSX1NUWUxFKSwgaGFuZGxlclN0eWxlKTtcbiAgICB0aGlzLnRleHRTdHlsZSA9IF9fYXNzaWduKF9fYXNzaWduKHt9LCBURVhUX1NUWUxFKSwgdGV4dFN0eWxlKTtcbiAgICB0aGlzLnRpY2tMYWJlbFN0eWxlID0gX19hc3NpZ24oX19hc3NpZ24oe30sIFRJQ0tfTEFCRUxfU1RZTEUpLCB0aWNrLnRpY2tMYWJlbFN0eWxlKTtcbiAgICB0aGlzLnRpY2tMaW5lU3R5bGUgPSBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgVElDS19MSU5FX1NUWUxFKSwgdGljay50aWNrTGluZVN0eWxlKTtcbiAgICB0aGlzLmN1cnJlbnRNb2RlID0gJ3JhbmdlJzsgLy8g5Yid5aeL5L+h5oGvXG5cbiAgICB0aGlzLnN0YXJ0ID0gc3RhcnQ7XG4gICAgdGhpcy5lbmQgPSBlbmQ7XG4gICAgdGhpcy5taW5UZXh0ID0gbWluVGV4dDtcbiAgICB0aGlzLm1heFRleHQgPSBtYXhUZXh0OyAvLyDliJ3lp4vljJYgZm9udEZhbWlsee+8jOWmguaenOaciea1j+iniOWZqO+8jOWPliBib2R5IOS4iueahOWtl+S9k++8jOmYsuatouaWh+Wtl+abtOaWsOaXtuWxgOmDqOa4suafk+mAoOaIkOeahOmHjeW9sVxuXG4gICAgdGhpcy5mb250RmFtaWx5ID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5ib2R5LCBudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKCdmb250LWZhbWlseScpIHx8ICdBcmlhbCwgc2Fucy1zZXJpZicgOiAnQXJpYWwsIHNhbnMtc2VyaWYnO1xuICAgIHRoaXMucmVuZGVyU2xpZGVyKCk7XG4gIH1cbiAgLyoqXG4gICAqIOabtOaWsOmFjee9rlxuICAgKiBAcGFyYW0gY2ZnXG4gICAqL1xuXG5cbiAgVHJlbmRUaW1lQmFyLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAoY2ZnKSB7XG4gICAgdmFyIHggPSBjZmcueCxcbiAgICAgICAgeSA9IGNmZy55LFxuICAgICAgICB3aWR0aCA9IGNmZy53aWR0aCxcbiAgICAgICAgaGVpZ2h0ID0gY2ZnLmhlaWdodCxcbiAgICAgICAgbWluVGV4dCA9IGNmZy5taW5UZXh0LFxuICAgICAgICBtYXhUZXh0ID0gY2ZnLm1heFRleHQsXG4gICAgICAgIHN0YXJ0ID0gY2ZnLnN0YXJ0LFxuICAgICAgICBlbmQgPSBjZmcuZW5kOyAvLyBzdGFydOOAgWVuZCDlj6rog73mmK8gMH4xIOiMg+WbtFxuXG4gICAgdGhpcy5zdGFydCA9IE1hdGgubWluKDEsIE1hdGgubWF4KHN0YXJ0LCAwKSk7XG4gICAgdGhpcy5lbmQgPSBNYXRoLm1pbigxLCBNYXRoLm1heChlbmQsIDApKTsgLy8g5aaC5p6c5Lyg5LqG5YiZ5pu05paw77yM5rKh5pyJ5Lyg5YiZ5LiN5pu05pawXG4gICAgLy8gQHRzLWlnbm9yZVxuXG4gICAgYXNzaWduKHRoaXMsIHtcbiAgICAgIHg6IHgsXG4gICAgICB5OiB5LFxuICAgICAgd2lkdGg6IHdpZHRoLFxuICAgICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgICBtaW5UZXh0OiBtaW5UZXh0LFxuICAgICAgbWF4VGV4dDogbWF4VGV4dFxuICAgIH0pOyAvLyDmm7TmlrAgdWnvvIzkuI3oh6rliqjnu5jliLZcblxuICAgIHRoaXMudXBkYXRlVUkoKTtcbiAgfTtcblxuICBUcmVuZFRpbWVCYXIucHJvdG90eXBlLnNldFRleHQgPSBmdW5jdGlvbiAobWluVGV4dCwgbWF4VGV4dCkge1xuICAgIHRoaXMubWluVGV4dFNoYXBlLmF0dHIoJ3RleHQnLCBtaW5UZXh0KTtcbiAgICB0aGlzLm1heFRleHRTaGFwZS5hdHRyKCd0ZXh0JywgbWF4VGV4dCk7XG4gIH07XG4gIC8qKlxuICAgKiDliJ3lp4vljJbnu4Tku7bnu5PmnoRcbiAgICogQHByaXZhdGVcbiAgICovXG5cblxuICBUcmVuZFRpbWVCYXIucHJvdG90eXBlLnJlbmRlclNsaWRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdmFyIF9hID0gdGhpcyxcbiAgICAgICAgd2lkdGggPSBfYS53aWR0aCxcbiAgICAgICAgaGVpZ2h0ID0gX2EuaGVpZ2h0LFxuICAgICAgICB0aW1lQmFyVHlwZSA9IF9hLnRpbWVCYXJUeXBlOyAvLyDotovlir/lm77mlbDmja5cblxuXG4gICAgaWYgKHRpbWVCYXJUeXBlID09PSAndHJlbmQnICYmIHNpemUoZ2V0KHRoaXMudHJlbmRDZmcsICdkYXRhJykpKSB7XG4gICAgICB2YXIgdHJlbmRDb21wb25lbnQgPSBuZXcgVHJlbmQoX19hc3NpZ24oX19hc3NpZ24oe1xuICAgICAgICB4OiB0aGlzLngsXG4gICAgICAgIHk6IHRoaXMueSxcbiAgICAgICAgd2lkdGg6IHdpZHRoLFxuICAgICAgICBoZWlnaHQ6IGhlaWdodFxuICAgICAgfSwgdGhpcy50cmVuZENmZyksIHtcbiAgICAgICAgZ3JvdXA6IHRoaXMuZ3JvdXBcbiAgICAgIH0pKTtcbiAgICAgIHRoaXMudHJlbmRDb21wb25lbnQgPSB0cmVuZENvbXBvbmVudDtcbiAgICB9XG5cbiAgICB2YXIgc2xpZGVyR3JvdXAgPSB0aGlzLmdyb3VwLmFkZEdyb3VwKHtcbiAgICAgIG5hbWU6ICdzbGlkZXItZ3JvdXAnXG4gICAgfSk7IC8vIDEuIOiDjOaZr1xuXG4gICAgc2xpZGVyR3JvdXAuYWRkU2hhcGUoJ3JlY3QnLCB7XG4gICAgICBhdHRyczogX19hc3NpZ24oe1xuICAgICAgICB4OiAwLFxuICAgICAgICB5OiAwLFxuICAgICAgICB3aWR0aDogd2lkdGgsXG4gICAgICAgIGhlaWdodDogaGVpZ2h0XG4gICAgICB9LCB0aGlzLmJhY2tncm91bmRTdHlsZSlcbiAgICB9KTtcbiAgICB2YXIgdGV4dEdyb3VwID0gdGhpcy5ncm91cC5hZGRHcm91cCgpOyAvLyAyLiDlt6blj7PmloflrZdcblxuICAgIGlmICh0aW1lQmFyVHlwZSA9PT0gJ3RyZW5kJykge1xuICAgICAgdGhpcy5taW5UZXh0U2hhcGUgPSB0ZXh0R3JvdXAuYWRkU2hhcGUoJ3RleHQnLCB7XG4gICAgICAgIGF0dHJzOiBfX2Fzc2lnbih7XG4gICAgICAgICAgeDogMCxcbiAgICAgICAgICB5OiBoZWlnaHQgLyAyICsgdGhpcy55LFxuICAgICAgICAgIHRleHRBbGlnbjogJ3JpZ2h0JyxcbiAgICAgICAgICB0ZXh0OiB0aGlzLm1pblRleHQsXG4gICAgICAgICAgc2lsZW50OiBmYWxzZSxcbiAgICAgICAgICBmb250RmFtaWx5OiB0aGlzLmZvbnRGYW1pbHkgfHwgJ0FyaWFsLCBzYW5zLXNlcmlmJ1xuICAgICAgICB9LCB0aGlzLnRleHRTdHlsZSksXG4gICAgICAgIGNhcHR1cmU6IGZhbHNlXG4gICAgICB9KTtcbiAgICAgIHRoaXMubWF4VGV4dFNoYXBlID0gdGV4dEdyb3VwLmFkZFNoYXBlKCd0ZXh0Jywge1xuICAgICAgICBhdHRyczogX19hc3NpZ24oe1xuICAgICAgICAgIHk6IGhlaWdodCAvIDIgKyB0aGlzLnksXG4gICAgICAgICAgdGV4dEFsaWduOiAnbGVmdCcsXG4gICAgICAgICAgdGV4dDogdGhpcy5tYXhUZXh0LFxuICAgICAgICAgIHNpbGVudDogZmFsc2UsXG4gICAgICAgICAgZm9udEZhbWlseTogdGhpcy5mb250RmFtaWx5IHx8ICdBcmlhbCwgc2Fucy1zZXJpZidcbiAgICAgICAgfSwgdGhpcy50ZXh0U3R5bGUpLFxuICAgICAgICBjYXB0dXJlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubWluVGV4dFNoYXBlID0gdGV4dEdyb3VwLmFkZFNoYXBlKCd0ZXh0Jywge1xuICAgICAgICBhdHRyczogX19hc3NpZ24oe1xuICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgeTogdGhpcy55IC0gMTAsXG4gICAgICAgICAgdGV4dEFsaWduOiAnY2VudGVyJyxcbiAgICAgICAgICB0ZXh0OiB0aGlzLm1pblRleHQsXG4gICAgICAgICAgc2lsZW50OiBmYWxzZSxcbiAgICAgICAgICBmb250RmFtaWx5OiB0aGlzLmZvbnRGYW1pbHkgfHwgJ0FyaWFsLCBzYW5zLXNlcmlmJ1xuICAgICAgICB9LCB0aGlzLnRleHRTdHlsZSksXG4gICAgICAgIGNhcHR1cmU6IGZhbHNlXG4gICAgICB9KTtcbiAgICAgIHRoaXMubWF4VGV4dFNoYXBlID0gdGV4dEdyb3VwLmFkZFNoYXBlKCd0ZXh0Jywge1xuICAgICAgICBhdHRyczogX19hc3NpZ24oe1xuICAgICAgICAgIHk6IHRoaXMueSAtIDEwLFxuICAgICAgICAgIHRleHRBbGlnbjogJ2NlbnRlcicsXG4gICAgICAgICAgdGV4dDogdGhpcy5tYXhUZXh0LFxuICAgICAgICAgIHNpbGVudDogZmFsc2UsXG4gICAgICAgICAgZm9udEZhbWlseTogdGhpcy5mb250RmFtaWx5IHx8ICdBcmlhbCwgc2Fucy1zZXJpZidcbiAgICAgICAgfSwgdGhpcy50ZXh0U3R5bGUpLFxuICAgICAgICBjYXB0dXJlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfSAvLyAzLiDliY3mma8g6YCJ5Lit6IOM5pmv5qGGXG5cblxuICAgIHRoaXMuZm9yZWdyb3VuZFNoYXBlID0gdGhpcy5ncm91cC5hZGRHcm91cCgpLmFkZFNoYXBlKCdyZWN0Jywge1xuICAgICAgYXR0cnM6IF9fYXNzaWduKHtcbiAgICAgICAgeDogMCxcbiAgICAgICAgeTogdGhpcy55LFxuICAgICAgICBoZWlnaHQ6IGhlaWdodFxuICAgICAgfSwgdGhpcy5mb3JlZ3JvdW5kU3R5bGUpXG4gICAgfSk7XG4gICAgdGhpcy5mb3JlZ3JvdW5kU2hhcGUub24oJ21vdXNlZG93bicsIGZ1bmN0aW9uIChlKSB7XG4gICAgICBlLnRhcmdldC5hdHRyKCdjdXJzb3InLCAnZ3JhYmJpbmcnKTtcbiAgICB9KTtcbiAgICB0aGlzLmZvcmVncm91bmRTaGFwZS5vbignbW91c2V1cCcsIGZ1bmN0aW9uIChlKSB7XG4gICAgICBlLnRhcmdldC5hdHRyKCdjdXJzb3InLCBfdGhpcy5mb3JlZ3JvdW5kU3R5bGUuY3Vyc29yIHx8ICdncmFiJyk7XG4gICAgfSk7IC8vIOa7keWdl+ebuOWFs+eahOWkp+Wwj+S/oeaBr1xuXG4gICAgdmFyIGhhbmRsZXJXaWR0aCA9IGdldCh0aGlzLmhhbmRsZXJTdHlsZSwgJ3dpZHRoJywgMik7XG4gICAgdmFyIGhhbmRsZXJIZWlnaHQgPSBnZXQodGhpcy5oYW5kbGVyU3R5bGUsICdoZWlnaHQnLCAyNCk7XG4gICAgdmFyIG1pbkhhbmRsZUdyb3VwID0gdGhpcy5ncm91cC5hZGRHcm91cCh7XG4gICAgICBuYW1lOiAnbWluSGFuZGxlclNoYXBlJ1xuICAgIH0pOyAvLyA0LiDlt6blj7Pmu5HlnZdcblxuICAgIHRoaXMubWluSGFuZGxlclNoYXBlID0gbmV3IEhhbmRsZXIoe1xuICAgICAgbmFtZTogJ21pbkhhbmRsZXJTaGFwZScsXG4gICAgICBncm91cDogbWluSGFuZGxlR3JvdXAsXG4gICAgICB0eXBlOiB0aW1lQmFyVHlwZSxcbiAgICAgIHg6IHRoaXMueCxcbiAgICAgIHk6IHRoaXMueSxcbiAgICAgIHdpZHRoOiBoYW5kbGVyV2lkdGgsXG4gICAgICBoZWlnaHQ6IGhhbmRsZXJIZWlnaHQsXG4gICAgICBzdHlsZTogdGhpcy5oYW5kbGVyU3R5bGVcbiAgICB9KTtcbiAgICB2YXIgbWF4SGFuZGxlR3JvdXAgPSB0aGlzLmdyb3VwLmFkZEdyb3VwKHtcbiAgICAgIG5hbWU6ICdtYXhIYW5kbGVyU2hhcGUnXG4gICAgfSk7XG4gICAgdGhpcy5tYXhIYW5kbGVyU2hhcGUgPSBuZXcgSGFuZGxlcih7XG4gICAgICBuYW1lOiAnbWF4SGFuZGxlclNoYXBlJyxcbiAgICAgIGdyb3VwOiBtYXhIYW5kbGVHcm91cCxcbiAgICAgIHR5cGU6IHRpbWVCYXJUeXBlLFxuICAgICAgeDogdGhpcy54LFxuICAgICAgeTogdGhpcy55LFxuICAgICAgd2lkdGg6IGhhbmRsZXJXaWR0aCxcbiAgICAgIGhlaWdodDogaGFuZGxlckhlaWdodCxcbiAgICAgIHN0eWxlOiB0aGlzLmhhbmRsZXJTdHlsZVxuICAgIH0pOyAvLyDnvKnnlaXlm77kuIvpnaLnmoTml7bpl7TliLvluqZcblxuICAgIHZhciB0aWNrRGF0YSA9IHRoaXMudGlja3M7XG4gICAgdmFyIGludGVydmFsID0gd2lkdGggLyAodGlja0RhdGEubGVuZ3RoIC0gMSk7XG4gICAgdGhpcy50aWNrUG9zTGlzdCA9IFtdO1xuXG4gICAgaWYgKHRoaXMudGV4dExpc3QgJiYgdGhpcy50ZXh0TGlzdC5sZW5ndGgpIHtcbiAgICAgIHRoaXMudGV4dExpc3QuZm9yRWFjaChmdW5jdGlvbiAodGV4dCkge1xuICAgICAgICB0ZXh0LmRlc3Ryb3koKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHZhciBsYXN0WCA9IC1JbmZpbml0eTtcbiAgICB0aGlzLnRleHRMaXN0ID0gdGlja0RhdGEubWFwKGZ1bmN0aW9uIChkYXRhLCBpbmRleCkge1xuICAgICAgX3RoaXMudGlja1Bvc0xpc3QucHVzaChfdGhpcy54ICsgaW5kZXggKiBpbnRlcnZhbCk7XG5cbiAgICAgIHZhciBsYWJlbDtcblxuICAgICAgaWYgKF90aGlzLnRpY2tMYWJlbEZvcm1hdHRlcikge1xuICAgICAgICBsYWJlbCA9IF90aGlzLnRpY2tMYWJlbEZvcm1hdHRlcihkYXRhKTtcblxuICAgICAgICBpZiAoIWlzU3RyaW5nKGxhYmVsKSAmJiBsYWJlbCkge1xuICAgICAgICAgIC8vIHJldHVybiB0cnVlXG4gICAgICAgICAgbGFiZWwgPSBkYXRhLmRhdGU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxhYmVsID0gZGF0YS5kYXRlO1xuICAgICAgfSAvLyDmlofmnKzliLvluqZcblxuXG4gICAgICB2YXIgdGV4dCA9IF90aGlzLmdyb3VwLmFkZFNoYXBlKCd0ZXh0Jywge1xuICAgICAgICBhdHRyczogX19hc3NpZ24oe1xuICAgICAgICAgIHg6IF90aGlzLnggKyBpbmRleCAqIGludGVydmFsLFxuICAgICAgICAgIHk6IF90aGlzLnkgKyBoZWlnaHQgKyA1LFxuICAgICAgICAgIHRleHQ6IGxhYmVsLFxuICAgICAgICAgIGZvbnRGYW1pbHk6IF90aGlzLmZvbnRGYW1pbHkgfHwgJ0FyaWFsLCBzYW5zLXNlcmlmJ1xuICAgICAgICB9LCBfdGhpcy50aWNrTGFiZWxTdHlsZSlcbiAgICAgIH0pOyAvLyDmlofmnKzliLvluqbkuIrpnaLnmoTnq5bnur9cblxuXG4gICAgICB2YXIgbGluZSA9IF90aGlzLmdyb3VwLmFkZFNoYXBlKCdsaW5lJywge1xuICAgICAgICBhdHRyczogX19hc3NpZ24oe1xuICAgICAgICAgIHgxOiBfdGhpcy54ICsgaW5kZXggKiBpbnRlcnZhbCxcbiAgICAgICAgICB5MTogX3RoaXMueSArIGhlaWdodCArIDIsXG4gICAgICAgICAgeDI6IF90aGlzLnggKyBpbmRleCAqIGludGVydmFsLFxuICAgICAgICAgIHkyOiBfdGhpcy55ICsgaGVpZ2h0ICsgNlxuICAgICAgICB9LCBfdGhpcy50aWNrTGluZVN0eWxlKVxuICAgICAgfSk7XG5cbiAgICAgIGxpbmUudG9CYWNrKCk7XG4gICAgICB2YXIgYmJveCA9IHRleHQuZ2V0QkJveCgpOyAvLyDmir3moLfvvIzmoIfnrb7kuI7moIfnrb7pl7Tot53kuI3lsI/kuo4gMTBcblxuICAgICAgaWYgKGJib3gubWluWCA+IGxhc3RYKSB7XG4gICAgICAgIHRleHQuc2hvdygpO1xuICAgICAgICBsaW5lLnNob3coKTtcbiAgICAgICAgbGFzdFggPSBiYm94Lm1pblggKyBiYm94LndpZHRoICsgMTA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0ZXh0LmhpZGUoKTtcbiAgICAgICAgbGluZS5oaWRlKCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0ZXh0O1xuICAgIH0pOyAvLyDmuLLmn5Pmkq3mlL7jgIHlv6vov5vlkozlkI7pgIDnmoTmjqfliLbmjInpkq5cblxuICAgIHRoaXMuY29udHJvbGxlckJ0bkdyb3VwID0gbmV3IENvbnRyb2xsZXJCdG4oX19hc3NpZ24oe1xuICAgICAgZ3JvdXA6IHRoaXMuZ3JvdXAsXG4gICAgICB4OiB0aGlzLngsXG4gICAgICB5OiB0aGlzLnkgKyBoZWlnaHQgKyAyNSxcbiAgICAgIHdpZHRoOiB3aWR0aCxcbiAgICAgIGhlaWdodDogMzVcbiAgICB9LCB0aGlzLmNvbnRyb2xsZXJDZmcpKTsgLy8g5Yid5aeL5YyWIG1pblRleHQg5ZKMIG1heFRleHTvvIzmlrnkvr/orqHnrpflroPku6znmoQgYmJveFxuXG4gICAgdGhpcy51cGRhdGVTdGFydEVuZCgwKTsgLy8g5qC55o2uIHN0YXJ0IGVuZCDmm7TmlrAgdWkg55qE5L2N572u5L+h5oGvXG5cbiAgICB0aGlzLnVwZGF0ZVVJKCk7IC8vIOenu+WKqOWIsOWvueW6lOeahOS9jee9rlxuXG4gICAgc2xpZGVyR3JvdXAubW92ZSh0aGlzLngsIHRoaXMueSk7IC8vIOe7keWumuS6i+S7tum8oOagh+S6i+S7tlxuXG4gICAgdGhpcy5iaW5kRXZlbnRzKCk7XG4gIH07XG4gIC8qKlxuICAgKiDnu5Hlrprkuovku7bvvJpcbiAgICogIC0g54K55Ye7XG4gICAqICAtIOa7keWKqFxuICAgKiAgLSDmi5bmi71cbiAgICogIC0g5rua5YqoXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG5cbiAgVHJlbmRUaW1lQmFyLnByb3RvdHlwZS5iaW5kRXZlbnRzID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7IC8vIDEuIOW3pua7keWdl+eahOa7keWKqFxuXG5cbiAgICB2YXIgbWluSGFuZGxlU2hhcGVHcm91cCA9IHRoaXMuZ3JvdXAuZmluZChmdW5jdGlvbiAoZ3JvdXApIHtcbiAgICAgIHJldHVybiBncm91cC5nZXQoJ25hbWUnKSA9PT0gJ21pbkhhbmRsZXJTaGFwZSc7XG4gICAgfSk7XG5cbiAgICBpZiAobWluSGFuZGxlU2hhcGVHcm91cCkge1xuICAgICAgbWluSGFuZGxlU2hhcGVHcm91cC5vbignbWluSGFuZGxlclNoYXBlLWhhbmRsZXI6bW91c2Vkb3duJywgdGhpcy5vbk1vdXNlRG93bih0aGlzLm1pbkhhbmRsZXJTaGFwZSkpO1xuICAgICAgbWluSGFuZGxlU2hhcGVHcm91cC5vbignbWluSGFuZGxlclNoYXBlLWhhbmRsZXI6dG91Y2hzdGFydCcsIHRoaXMub25Nb3VzZURvd24odGhpcy5taW5IYW5kbGVyU2hhcGUpKTtcbiAgICB9XG5cbiAgICB2YXIgbWF4SGFuZGxlU2hhcGVHcm91cCA9IHRoaXMuZ3JvdXAuZmluZChmdW5jdGlvbiAoZ3JvdXApIHtcbiAgICAgIHJldHVybiBncm91cC5nZXQoJ25hbWUnKSA9PT0gJ21heEhhbmRsZXJTaGFwZSc7XG4gICAgfSk7IC8vIDIuIOWPs+a7keWdl+eahOa7keWKqFxuXG4gICAgaWYgKG1heEhhbmRsZVNoYXBlR3JvdXApIHtcbiAgICAgIG1heEhhbmRsZVNoYXBlR3JvdXAub24oJ21heEhhbmRsZXJTaGFwZS1oYW5kbGVyOm1vdXNlZG93bicsIHRoaXMub25Nb3VzZURvd24odGhpcy5tYXhIYW5kbGVyU2hhcGUpKTtcbiAgICAgIG1heEhhbmRsZVNoYXBlR3JvdXAub24oJ21heEhhbmRsZXJTaGFwZS1oYW5kbGVyOnRvdWNoc3RhcnQnLCB0aGlzLm9uTW91c2VEb3duKHRoaXMubWF4SGFuZGxlclNoYXBlKSk7XG4gICAgfSAvLyAzLiDliY3mma/pgInkuK3ljLrln59cblxuXG4gICAgdGhpcy5mb3JlZ3JvdW5kU2hhcGUub24oJ21vdXNlZG93bicsIHRoaXMub25Nb3VzZURvd24odGhpcy5mb3JlZ3JvdW5kU2hhcGUpKTtcbiAgICB0aGlzLmZvcmVncm91bmRTaGFwZS5vbigndG91Y2hzdGFydCcsIHRoaXMub25Nb3VzZURvd24odGhpcy5mb3JlZ3JvdW5kU2hhcGUpKTsgLy8g5pKt5pS+5Yy65oyJ6ZKu5o6n5Yi2XG5cbiAgICAvKiog5pKt5pS+L+aaguWBnOS6i+S7tiAqL1xuXG4gICAgdGhpcy5ncm91cC5vbihQTEFZX1BBVVNFX0JUTiArIFwiOmNsaWNrXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIF90aGlzLmlzUGxheSA9ICFfdGhpcy5pc1BsYXk7XG4gICAgICBfdGhpcy5jdXJyZW50SGFuZGxlciA9IF90aGlzLm1heEhhbmRsZXJTaGFwZTtcblxuICAgICAgX3RoaXMuY2hhbmdlUGxheVN0YXR1cygpO1xuICAgIH0pOyAvLyDlpITnkIbliY3ov5vkuIDmraXnmoTkuovku7ZcblxuICAgIHRoaXMuZ3JvdXAub24oTkVYVF9TVEVQX0JUTiArIFwiOmNsaWNrXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIF90aGlzLmN1cnJlbnRIYW5kbGVyID0gX3RoaXMubWF4SGFuZGxlclNoYXBlO1xuXG4gICAgICBfdGhpcy51cGRhdGVTdGFydEVuZCgwLjAxKTtcblxuICAgICAgX3RoaXMudXBkYXRlVUkoKTtcbiAgICB9KTsgLy8g5aSE55CG5ZCO6YCA5LiA5q2l55qE5LqL5Lu2XG5cbiAgICB0aGlzLmdyb3VwLm9uKFBSRV9TVEVQX0JUTiArIFwiOmNsaWNrXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIF90aGlzLmN1cnJlbnRIYW5kbGVyID0gX3RoaXMubWF4SGFuZGxlclNoYXBlO1xuXG4gICAgICBfdGhpcy51cGRhdGVTdGFydEVuZCgtMC4wMSk7XG5cbiAgICAgIF90aGlzLnVwZGF0ZVVJKCk7XG4gICAgfSk7XG4gICAgdGhpcy5ncm91cC5vbihUSU1FQkFSX0NPTkZJR19DSEFOR0UsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgdmFyIHR5cGUgPSBfYS50eXBlLFxuICAgICAgICAgIHNwZWVkID0gX2Euc3BlZWQ7XG4gICAgICBfdGhpcy5jdXJyZW50U3BlZWQgPSBzcGVlZDtcbiAgICAgIF90aGlzLmN1cnJlbnRNb2RlID0gdHlwZTtcblxuICAgICAgaWYgKHR5cGUgPT09ICdzaW5nbGUnKSB7XG4gICAgICAgIF90aGlzLm1pbkhhbmRsZXJTaGFwZS5oaWRlKCk7XG5cbiAgICAgICAgX3RoaXMuZm9yZWdyb3VuZFNoYXBlLmhpZGUoKTtcblxuICAgICAgICBfdGhpcy5taW5UZXh0U2hhcGUuaGlkZSgpO1xuICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAncmFuZ2UnKSB7XG4gICAgICAgIF90aGlzLm1pbkhhbmRsZXJTaGFwZS5zaG93KCk7XG5cbiAgICAgICAgX3RoaXMuZm9yZWdyb3VuZFNoYXBlLnNob3coKTtcblxuICAgICAgICBfdGhpcy5taW5UZXh0U2hhcGUuc2hvdygpO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuICAvKiog6L6T5YWl5b2T5YmN5ZyG54K55L2N572u77yM6L6T5Ye656a75ZOq5LiqIHRpY2sg55qE5L2N572u5pyA6L+RICovXG5cblxuICBUcmVuZFRpbWVCYXIucHJvdG90eXBlLmFkanVzdFRpY2tJbmRleCA9IGZ1bmN0aW9uICh0aW1lU2VsZWN0WCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy50aWNrUG9zTGlzdC5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLnRpY2tQb3NMaXN0W2ldIDw9IHRpbWVTZWxlY3RYICYmIHRpbWVTZWxlY3RYIDw9IHRoaXMudGlja1Bvc0xpc3RbaSArIDFdKSB7XG4gICAgICAgIHJldHVybiBNYXRoLmFicyh0aGlzLnRpY2tQb3NMaXN0W2ldIC0gdGltZVNlbGVjdFgpIDwgTWF0aC5hYnModGltZVNlbGVjdFggLSB0aGlzLnRpY2tQb3NMaXN0W2kgKyAxXSkgPyBpIDogaSArIDE7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIDA7XG4gIH07XG4gIC8qKlxuICAgKiDosIPmlbQgb2Zmc2V0UmFuZ2XvvIzlm6DkuLrkuIDkupvojIPlm7TnmoTpmZDliLZcbiAgICogQHBhcmFtIG9mZnNldFJhbmdlXG4gICAqL1xuXG5cbiAgVHJlbmRUaW1lQmFyLnByb3RvdHlwZS5hZGp1c3RPZmZzZXRSYW5nZSA9IGZ1bmN0aW9uIChvZmZzZXRSYW5nZSkge1xuICAgIC8vIOmSiOWvueS4jeWQjOeahOa7keWKqOe7hOS7tu+8jOWkhOeQhueahOaWueW8j+S4jeWQjFxuICAgIHN3aXRjaCAodGhpcy5jdXJyZW50SGFuZGxlcikge1xuICAgICAgY2FzZSB0aGlzLm1pbkhhbmRsZXJTaGFwZTpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBtaW4gPSAwIC0gdGhpcy5zdGFydDtcbiAgICAgICAgICB2YXIgbWF4ID0gMSAtIHRoaXMuc3RhcnQ7XG4gICAgICAgICAgcmV0dXJuIE1hdGgubWluKG1heCwgTWF0aC5tYXgobWluLCBvZmZzZXRSYW5nZSkpO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgdGhpcy5tYXhIYW5kbGVyU2hhcGU6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgbWluID0gMCAtIHRoaXMuZW5kO1xuICAgICAgICAgIHZhciBtYXggPSAxIC0gdGhpcy5lbmQ7XG4gICAgICAgICAgcmV0dXJuIE1hdGgubWluKG1heCwgTWF0aC5tYXgobWluLCBvZmZzZXRSYW5nZSkpO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgdGhpcy5mb3JlZ3JvdW5kU2hhcGU6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgbWluID0gMCAtIHRoaXMuc3RhcnQ7XG4gICAgICAgICAgdmFyIG1heCA9IDEgLSB0aGlzLmVuZDtcbiAgICAgICAgICByZXR1cm4gTWF0aC5taW4obWF4LCBNYXRoLm1heChtaW4sIG9mZnNldFJhbmdlKSk7XG4gICAgICAgIH1cblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICB9O1xuICAvKipcbiAgICog5pu05paw6LW35aeL44CB57uT5p2f55qE5o6n5Yi25Z2X5L2N572u44CB5paH5pys44CB6IyD5Zu05YC877yI5Y6f5aeL5YC877yJXG4gICAqIEBwYXJhbSBvZmZzZXRSYW5nZVxuICAgKi9cblxuXG4gIFRyZW5kVGltZUJhci5wcm90b3R5cGUudXBkYXRlU3RhcnRFbmQgPSBmdW5jdGlvbiAob2Zmc2V0UmFuZ2UpIHtcbiAgICB2YXIgbWluRGF0YSA9IHRoaXMudGlja3NbdGhpcy5hZGp1c3RUaWNrSW5kZXgodGhpcy5zdGFydCAqIHRoaXMud2lkdGgpXTtcbiAgICB2YXIgbWF4RGF0YSA9IHRoaXMudGlja3NbdGhpcy5hZGp1c3RUaWNrSW5kZXgodGhpcy5lbmQgKiB0aGlzLndpZHRoKV07XG5cbiAgICBpZiAoIXRoaXMuY3VycmVudEhhbmRsZXIpIHtcbiAgICAgIHRoaXMubWluVGV4dCA9IHRoaXMudGlja0xhYmVsRm9ybWF0dGVyID8gdGhpcy50aWNrTGFiZWxGb3JtYXR0ZXIobWluRGF0YSkgOiBtaW5EYXRhLmRhdGU7XG4gICAgICB0aGlzLm1heFRleHQgPSB0aGlzLnRpY2tMYWJlbEZvcm1hdHRlciA/IHRoaXMudGlja0xhYmVsRm9ybWF0dGVyKG1heERhdGEpIDogbWF4RGF0YS5kYXRlO1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8g5pON5L2c5LiN5ZCM55qE57uE5Lu277yM5Y+N6aaI5LiN5LiA5qC3XG5cblxuICAgIHN3aXRjaCAodGhpcy5jdXJyZW50SGFuZGxlcikge1xuICAgICAgY2FzZSB0aGlzLm1pbkhhbmRsZXJTaGFwZTpcbiAgICAgICAgLy8g5ouW5Yqo5pyA5bCP5ruR5Z2X5pe25L2/55So5b2T5YmN5pyA5aSn5YC86K6+572u5pyA5aSn5YC855qE5paH5pys77yM5Lul5L6/5oGi5aSN5Yiw6buY6K6k5YC8XG4gICAgICAgIHRoaXMubWF4VGV4dCA9IHRoaXMubWF4VGV4dFNoYXBlLmF0dHIoJ3RleHQnKTtcbiAgICAgICAgdGhpcy5zdGFydCArPSBvZmZzZXRSYW5nZTtcbiAgICAgICAgdGhpcy5taW5UZXh0ID0gdGhpcy50aWNrTGFiZWxGb3JtYXR0ZXIgPyB0aGlzLnRpY2tMYWJlbEZvcm1hdHRlcihtaW5EYXRhKSA6IG1pbkRhdGEuZGF0ZTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgdGhpcy5tYXhIYW5kbGVyU2hhcGU6XG4gICAgICAgIC8vIOaLluWKqOacgOWkp+a7keWdl+aXtuS9v+eUqOW9k+WJjeacgOWwj+WAvOiuvue9ruacgOWwj+WAvOeahOaWh+acrO+8jOS7peS+v+aBouWkjeWIsOm7mOiupOWAvFxuICAgICAgICB0aGlzLm1pblRleHQgPSB0aGlzLm1pblRleHRTaGFwZS5hdHRyKCd0ZXh0Jyk7XG4gICAgICAgIHRoaXMuZW5kICs9IG9mZnNldFJhbmdlO1xuICAgICAgICB0aGlzLm1heFRleHQgPSB0aGlzLnRpY2tMYWJlbEZvcm1hdHRlciA/IHRoaXMudGlja0xhYmVsRm9ybWF0dGVyKG1heERhdGEpIDogbWF4RGF0YS5kYXRlO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSB0aGlzLmZvcmVncm91bmRTaGFwZTpcbiAgICAgICAgdGhpcy5zdGFydCArPSBvZmZzZXRSYW5nZTtcbiAgICAgICAgdGhpcy5lbmQgKz0gb2Zmc2V0UmFuZ2U7XG4gICAgICAgIHRoaXMubWluVGV4dCA9IHRoaXMudGlja0xhYmVsRm9ybWF0dGVyID8gdGhpcy50aWNrTGFiZWxGb3JtYXR0ZXIobWluRGF0YSkgOiBtaW5EYXRhLmRhdGU7XG4gICAgICAgIHRoaXMubWF4VGV4dCA9IHRoaXMudGlja0xhYmVsRm9ybWF0dGVyID8gdGhpcy50aWNrTGFiZWxGb3JtYXR0ZXIobWF4RGF0YSkgOiBtYXhEYXRhLmRhdGU7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH07XG4gIC8qKlxuICAgKiDmoLnmja7np7vliqjnmoTmr5TkvovmnaXmm7TmlrAgdWnvvIzmm7TmlrDojIPlm7TvvIgwLTEg6IyD5Zu055qE5q+U5L6L5YC877yJXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG5cbiAgVHJlbmRUaW1lQmFyLnByb3RvdHlwZS51cGRhdGVVSSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgaWYgKHRoaXMuc3RhcnQgPCAwKSB7XG4gICAgICB0aGlzLnN0YXJ0ID0gMDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5lbmQgPiAxKSB7XG4gICAgICB0aGlzLmVuZCA9IDE7XG4gICAgfVxuXG4gICAgdmFyIG1pbiA9IHRoaXMueCArIHRoaXMuc3RhcnQgKiB0aGlzLndpZHRoO1xuICAgIHZhciBtYXggPSB0aGlzLnggKyB0aGlzLmVuZCAqIHRoaXMud2lkdGg7IC8vIDEuIGZvcmVncm91bmRcblxuICAgIHRoaXMuZm9yZWdyb3VuZFNoYXBlLmF0dHIoJ3gnLCBtaW4pO1xuICAgIHRoaXMuZm9yZWdyb3VuZFNoYXBlLmF0dHIoJ3dpZHRoJywgbWF4IC0gbWluKTsgLy8g5ruR5Z2X55u45YWz55qE5aSn5bCP5L+h5oGvXG5cbiAgICB2YXIgaGFuZGxlcldpZHRoID0gZ2V0KHRoaXMuaGFuZGxlclN0eWxlLCAnd2lkdGgnLCBERUZBVUxUX0hBTkRMRVJfV0lEVEgpOyAvLyDorr7nva7mlofmnKxcblxuICAgIHRoaXMuc2V0VGV4dCh0aGlzLm1pblRleHQsIHRoaXMubWF4VGV4dCk7XG5cbiAgICB2YXIgX2EgPSB0aGlzLmRvZGdlVGV4dChbbWluLCBtYXhdKSxcbiAgICAgICAgbWluQXR0cnMgPSBfYVswXSxcbiAgICAgICAgbWF4QXR0cnMgPSBfYVsxXTsgLy8gMi4g5bem5L6n5ruR5Z2X5ZKM5paH5a2X5L2N572uXG5cblxuICAgIHRoaXMubWluSGFuZGxlclNoYXBlLnNldFgobWluIC0gaGFuZGxlcldpZHRoIC8gMik7XG4gICAgZWFjaChtaW5BdHRycywgZnVuY3Rpb24gKHYsIGspIHtcbiAgICAgIHJldHVybiBfdGhpcy5taW5UZXh0U2hhcGUuYXR0cihrLCB2KTtcbiAgICB9KTsgLy8gMy4g5Y+z5L6n5ruR5Z2X5ZKM5paH5a2X5L2N572uXG5cbiAgICB0aGlzLm1heEhhbmRsZXJTaGFwZS5zZXRYKG1heCAtIGhhbmRsZXJXaWR0aCAvIDIpO1xuICAgIGVhY2gobWF4QXR0cnMsIGZ1bmN0aW9uICh2LCBrKSB7XG4gICAgICByZXR1cm4gX3RoaXMubWF4VGV4dFNoYXBlLmF0dHIoaywgdik7XG4gICAgfSk7XG5cbiAgICBpZiAodGhpcy5jdXJyZW50TW9kZSA9PT0gJ3JhbmdlJykge1xuICAgICAgLy8g5Zug5Li65a2Y5YKo55qEIHN0YXJ044CBZW5kIOWPr+iDveS4jeS4gOWumuaYr+aMieWkp+Wwj+WtmOWCqOeahO+8jOaJgOS7peaOkuW6j+S4gOS4i++8jOWvueWkluaYryBlbmQgPj0gc3RhcnRcbiAgICAgIHRoaXMuZ3JhcGguZW1pdChWQUxVRV9DSEFOR0UsIHtcbiAgICAgICAgdmFsdWU6IFt0aGlzLnN0YXJ0LCB0aGlzLmVuZF0uc29ydCgpXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuY3VycmVudE1vZGUgPT09ICdzaW5nbGUnKSB7XG4gICAgICB0aGlzLmdyYXBoLmVtaXQoVkFMVUVfQ0hBTkdFLCB7XG4gICAgICAgIHZhbHVlOiBbdGhpcy5lbmQsIHRoaXMuZW5kXVxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuICAvKipcbiAgICog6LCD5pW0IHRleHQg55qE5L2N572u77yM6Ieq5Yqo6Lqy6YG/XG4gICAqIOagueaNruS9jee9ru+8jOiwg+aVtOi/lOWbnuaWsOeahOS9jee9rlxuICAgKiBAcGFyYW0gcmFuZ2VcbiAgICovXG5cblxuICBUcmVuZFRpbWVCYXIucHJvdG90eXBlLmRvZGdlVGV4dCA9IGZ1bmN0aW9uIChyYW5nZSkge1xuICAgIHZhciBfYSwgX2I7XG5cbiAgICB2YXIgVEVYVFBBRERJTkcgPSAyO1xuICAgIHZhciBoYW5kbGVyV2lkdGggPSBnZXQodGhpcy5oYW5kbGVyU3R5bGUsICd3aWR0aCcsIERFRkFVTFRfSEFORExFUl9XSURUSCk7XG4gICAgdmFyIG1pblRleHRTaGFwZSA9IHRoaXMubWluVGV4dFNoYXBlO1xuICAgIHZhciBtYXhUZXh0U2hhcGUgPSB0aGlzLm1heFRleHRTaGFwZTtcbiAgICB2YXIgbWluID0gcmFuZ2VbMF0sXG4gICAgICAgIG1heCA9IHJhbmdlWzFdO1xuICAgIHZhciBzb3J0ZWQgPSBmYWxzZTsgLy8g5aaC5p6c5Lqk5o2i5LqG5L2N572u77yM5YiZ5a+55bqU55qEIG1pbiBtYXgg5Lmf5Lqk5o2iXG5cbiAgICBpZiAobWluID4gbWF4KSB7XG4gICAgICBfYSA9IFttYXgsIG1pbl0sIG1pbiA9IF9hWzBdLCBtYXggPSBfYVsxXTtcbiAgICAgIF9iID0gW21heFRleHRTaGFwZSwgbWluVGV4dFNoYXBlXSwgbWluVGV4dFNoYXBlID0gX2JbMF0sIG1heFRleHRTaGFwZSA9IF9iWzFdO1xuICAgICAgc29ydGVkID0gdHJ1ZTtcbiAgICB9IC8vIOmBv+iuqeinhOWIme+8jOS8mOWFiOaYvuekuuWcqOS4pOS+p++8jOWPquacieaYvuekuuS4jeS4i+eahOaXtuWAme+8jOaJjeaYvuekuuWcqOS4remXtFxuXG5cbiAgICB2YXIgbWluQkJveCA9IG1pblRleHRTaGFwZS5nZXRCQm94KCk7XG4gICAgdmFyIG1heEJCb3ggPSBtYXhUZXh0U2hhcGUuZ2V0QkJveCgpO1xuICAgIHZhciBtaW5BdHRycyA9IG51bGw7XG4gICAgdmFyIG1heEF0dHJzID0gbnVsbDtcblxuICAgIGlmICh0aGlzLnRpbWVCYXJUeXBlID09PSAndHJlbmQnKSB7XG4gICAgICBtaW5BdHRycyA9IG1pbiAtIG1pbkJCb3gud2lkdGggPCB0aGlzLnggKyBURVhUUEFERElORyA/IHtcbiAgICAgICAgeDogbWluICsgaGFuZGxlcldpZHRoIC8gMiArIFRFWFRQQURESU5HLFxuICAgICAgICB0ZXh0QWxpZ246ICdsZWZ0J1xuICAgICAgfSA6IHtcbiAgICAgICAgeDogbWluIC0gaGFuZGxlcldpZHRoIC8gMiAtIFRFWFRQQURESU5HLFxuICAgICAgICB0ZXh0QWxpZ246ICdyaWdodCdcbiAgICAgIH07XG4gICAgICBtYXhBdHRycyA9IG1heCArIG1heEJCb3gud2lkdGggPiB0aGlzLnggKyB0aGlzLndpZHRoID8ge1xuICAgICAgICB4OiBtYXggLSBoYW5kbGVyV2lkdGggLyAyIC0gVEVYVFBBRERJTkcsXG4gICAgICAgIHRleHRBbGlnbjogJ3JpZ2h0J1xuICAgICAgfSA6IHtcbiAgICAgICAgeDogbWF4ICsgaGFuZGxlcldpZHRoIC8gMiArIFRFWFRQQURESU5HLFxuICAgICAgICB0ZXh0QWxpZ246ICdsZWZ0J1xuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKHRoaXMudGltZUJhclR5cGUgPT09ICdzaW1wbGUnKSB7XG4gICAgICBtaW5BdHRycyA9IG1pbkJCb3gud2lkdGggPiBtaW4gLSBURVhUUEFERElORyA/IHtcbiAgICAgICAgeDogbWluICsgaGFuZGxlcldpZHRoIC8gMiArIFRFWFRQQURESU5HLFxuICAgICAgICB0ZXh0QWxpZ246ICdjZW50ZXInXG4gICAgICB9IDoge1xuICAgICAgICB4OiBtaW4gLSBoYW5kbGVyV2lkdGggLyAyIC0gVEVYVFBBRERJTkcsXG4gICAgICAgIHRleHRBbGlnbjogJ2NlbnRlcidcbiAgICAgIH07XG4gICAgICBtYXhBdHRycyA9IG1heEJCb3gud2lkdGggPiB0aGlzLndpZHRoIC0gbWF4IC0gVEVYVFBBRERJTkcgPyB7XG4gICAgICAgIHg6IG1heCAtIGhhbmRsZXJXaWR0aCAvIDIgLSBURVhUUEFERElORyxcbiAgICAgICAgdGV4dEFsaWduOiAnY2VudGVyJ1xuICAgICAgfSA6IHtcbiAgICAgICAgeDogbWF4ICsgaGFuZGxlcldpZHRoIC8gMiArIFRFWFRQQURESU5HLFxuICAgICAgICB0ZXh0QWxpZ246ICdjZW50ZXInXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiAhc29ydGVkID8gW21pbkF0dHJzLCBtYXhBdHRyc10gOiBbbWF4QXR0cnMsIG1pbkF0dHJzXTtcbiAgfTtcblxuICBUcmVuZFRpbWVCYXIucHJvdG90eXBlLnN0YXJ0UGxheSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgcmV0dXJuIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX2EgPSBfdGhpcyxcbiAgICAgICAgICB0aWNrcyA9IF9hLnRpY2tzLFxuICAgICAgICAgIHdpZHRoID0gX2Eud2lkdGg7XG4gICAgICB2YXIgc3BlZWQgPSBfdGhpcy5jdXJyZW50U3BlZWQ7XG4gICAgICB2YXIgdGlja0ludGVydmFsID0gd2lkdGggLyB0aWNrcy5sZW5ndGg7XG4gICAgICB2YXIgb2Zmc2V0WCA9IHRpY2tJbnRlcnZhbCAvICgoMTAgLSBzcGVlZCkgKiAxMDAwIC8gNjApO1xuXG4gICAgICB2YXIgb2Zmc2V0WFJhbmdlID0gX3RoaXMuYWRqdXN0T2Zmc2V0UmFuZ2Uob2Zmc2V0WCAvIF90aGlzLndpZHRoKTtcblxuICAgICAgX3RoaXMudXBkYXRlU3RhcnRFbmQob2Zmc2V0WFJhbmdlKTtcblxuICAgICAgX3RoaXMudXBkYXRlVUkoKTtcblxuICAgICAgaWYgKF90aGlzLmlzUGxheSkge1xuICAgICAgICBfdGhpcy5wbGF5SGFuZGxlciA9IF90aGlzLnN0YXJ0UGxheSgpO1xuICAgICAgfVxuICAgIH0pIDogdW5kZWZpbmVkO1xuICB9O1xuXG4gIFRyZW5kVGltZUJhci5wcm90b3R5cGUuY2hhbmdlUGxheVN0YXR1cyA9IGZ1bmN0aW9uIChpc1N5bmMpIHtcbiAgICBpZiAoaXNTeW5jID09PSB2b2lkIDApIHtcbiAgICAgIGlzU3luYyA9IHRydWU7XG4gICAgfVxuXG4gICAgdGhpcy5jb250cm9sbGVyQnRuR3JvdXAucGxheUJ1dHRvbi51cGRhdGUoe1xuICAgICAgaXNQbGF5OiB0aGlzLmlzUGxheVxuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMuaXNQbGF5KSB7XG4gICAgICAvLyDlvIDlp4vmkq3mlL5cbiAgICAgIHRoaXMucGxheUhhbmRsZXIgPSB0aGlzLnN0YXJ0UGxheSgpO1xuICAgICAgdGhpcy5ncmFwaC5lbWl0KFRJTUVMSU5FX1NUQVJULCBudWxsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8g57uT5p2f5pKt5pS+XG4gICAgICBpZiAodGhpcy5wbGF5SGFuZGxlcikge1xuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLnBsYXlIYW5kbGVyKTtcblxuICAgICAgICBpZiAoaXNTeW5jKSB7XG4gICAgICAgICAgdGhpcy5ncmFwaC5lbWl0KFRJTUVMSU5FX0VORCwgbnVsbCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgVHJlbmRUaW1lQmFyLnByb3RvdHlwZS5kZXN0b3J5ID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuZ3JhcGgub2ZmKFZBTFVFX0NIQU5HRSk7XG4gICAgdmFyIGdyb3VwID0gdGhpcy5ncm91cDtcbiAgICB2YXIgbWluSGFuZGxlU2hhcGVHcm91cCA9IGdyb3VwLmZpbmQoZnVuY3Rpb24gKGcpIHtcbiAgICAgIHJldHVybiBnLmdldCgnbmFtZScpID09PSAnbWluSGFuZGxlclNoYXBlJztcbiAgICB9KTtcblxuICAgIGlmIChtaW5IYW5kbGVTaGFwZUdyb3VwKSB7XG4gICAgICBtaW5IYW5kbGVTaGFwZUdyb3VwLm9mZignbWluSGFuZGxlclNoYXBlLWhhbmRsZXI6bW91c2Vkb3duJyk7XG4gICAgICBtaW5IYW5kbGVTaGFwZUdyb3VwLm9mZignbWluSGFuZGxlclNoYXBlLWhhbmRsZXI6dG91Y2hzdGFydCcpO1xuICAgICAgbWluSGFuZGxlU2hhcGVHcm91cC5kZXN0cm95KCk7XG4gICAgfVxuXG4gICAgdmFyIG1heEhhbmRsZVNoYXBlR3JvdXAgPSBncm91cC5maW5kKGZ1bmN0aW9uIChnKSB7XG4gICAgICByZXR1cm4gZy5nZXQoJ25hbWUnKSA9PT0gJ21heEhhbmRsZXJTaGFwZSc7XG4gICAgfSk7IC8vIDIuIOWPs+a7keWdl+eahOa7keWKqFxuXG4gICAgaWYgKG1heEhhbmRsZVNoYXBlR3JvdXApIHtcbiAgICAgIG1heEhhbmRsZVNoYXBlR3JvdXAub2ZmKCdtYXhIYW5kbGVyU2hhcGUtaGFuZGxlcjptb3VzZWRvd24nKTtcbiAgICAgIG1heEhhbmRsZVNoYXBlR3JvdXAub2ZmKCdtYXhIYW5kbGVyU2hhcGUtaGFuZGxlcjp0b3VjaHN0YXJ0Jyk7XG4gICAgICBtYXhIYW5kbGVTaGFwZUdyb3VwLmRlc3Ryb3koKTtcbiAgICB9IC8vIDMuIOWJjeaZr+mAieS4reWMuuWfn1xuXG5cbiAgICB0aGlzLmZvcmVncm91bmRTaGFwZS5vZmYoJ21vdXNlZG93bicpO1xuICAgIHRoaXMuZm9yZWdyb3VuZFNoYXBlLm9mZigndG91Y2hzdGFydCcpO1xuICAgIHRoaXMuZm9yZWdyb3VuZFNoYXBlLmRlc3Ryb3koKTtcbiAgICBncm91cC5vZmYoUExBWV9QQVVTRV9CVE4gKyBcIjpjbGlja1wiKTtcbiAgICBncm91cC5vZmYoTkVYVF9TVEVQX0JUTiArIFwiOmNsaWNrXCIpO1xuICAgIGdyb3VwLm9mZihQUkVfU1RFUF9CVE4gKyBcIjpjbGlja1wiKTtcbiAgICBncm91cC5vZmYoVElNRUJBUl9DT05GSUdfQ0hBTkdFKTtcbiAgICBncm91cC5kZXN0cm95KCk7XG5cbiAgICBpZiAodGhpcy50cmVuZENvbXBvbmVudCkge1xuICAgICAgdGhpcy50cmVuZENvbXBvbmVudC5kZXN0b3J5KCk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBUcmVuZFRpbWVCYXI7XG59KCk7XG5cbmV4cG9ydCBkZWZhdWx0IFRyZW5kVGltZUJhcjsiLCJpbXBvcnQgeyBpc1N0cmluZyB9IGZyb20gJ0BhbnR2L3V0aWwnO1xuaW1wb3J0IHsgY3JlYXRlRG9tLCBtb2RpZnlDU1MgfSBmcm9tICdAYW50di9kb20tdXRpbCc7XG5leHBvcnQgdmFyIEJBQ0tHUk9VTkRfU1RZTEUgPSB7XG4gIG9wYWNpdHk6IDAuNSxcbiAgZmlsbDogJyMwMDAnXG59O1xuZXhwb3J0IHZhciBBUlJPV19TVFlMRSA9IHtcbiAgb3BhY2l0eTogMC41LFxuICBmaWxsOiAnIzAwMCcsXG4gIHI6IDVcbn07XG5leHBvcnQgdmFyIFRFWFRfU1RZTEUgPSB7XG4gIGZpbGw6ICcjZmZmJyxcbiAgZm9udFNpemU6IDEyXG59O1xuLyoqXG4gKiDnvKnnlaXotovlir/lm75cbiAqL1xuXG52YXIgVGltZUJhclRvb2x0aXAgPVxuLyoqIEBjbGFzcyAqL1xuZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBUaW1lQmFyVG9vbHRpcChjZmcpIHtcbiAgICB2YXIgX2EgPSBjZmcueCxcbiAgICAgICAgeCA9IF9hID09PSB2b2lkIDAgPyAwIDogX2EsXG4gICAgICAgIF9iID0gY2ZnLnksXG4gICAgICAgIHkgPSBfYiA9PT0gdm9pZCAwID8gMCA6IF9iLFxuICAgICAgICBjb250YWluZXIgPSBjZmcuY29udGFpbmVyLFxuICAgICAgICB0ZXh0ID0gY2ZnLnRleHQsXG4gICAgICAgIF9jID0gY2ZnLnBhZGRpbmcsXG4gICAgICAgIHBhZGRpbmcgPSBfYyA9PT0gdm9pZCAwID8gWzQsIDQsIDQsIDRdIDogX2MsXG4gICAgICAgIF9kID0gY2ZnLmNsYXNzTmFtZSxcbiAgICAgICAgY2xhc3NOYW1lID0gX2QgPT09IHZvaWQgMCA/ICdnNi1jb21wb25lbnQtdGltZWJhci10b29sdGlwJyA6IF9kLFxuICAgICAgICBfZSA9IGNmZy5iYWNrZ3JvdW5kQ29sb3IsXG4gICAgICAgIGJhY2tncm91bmRDb2xvciA9IF9lID09PSB2b2lkIDAgPyAnIzAwMCcgOiBfZSxcbiAgICAgICAgX2YgPSBjZmcudGV4dENvbG9yLFxuICAgICAgICB0ZXh0Q29sb3IgPSBfZiA9PT0gdm9pZCAwID8gJyNmZmYnIDogX2YsXG4gICAgICAgIF9nID0gY2ZnLm9wYWNpdHksXG4gICAgICAgIG9wYWNpdHkgPSBfZyA9PT0gdm9pZCAwID8gMC44IDogX2csXG4gICAgICAgIF9oID0gY2ZnLmZvbnRTaXplLFxuICAgICAgICBmb250U2l6ZSA9IF9oID09PSB2b2lkIDAgPyAxMiA6IF9oO1xuICAgIHRoaXMuY29udGFpbmVyID0gY29udGFpbmVyO1xuICAgIHRoaXMuY2xhc3NOYW1lID0gY2xhc3NOYW1lO1xuICAgIHRoaXMuYmFja2dyb3VuZENvbG9yID0gYmFja2dyb3VuZENvbG9yO1xuICAgIHRoaXMudGV4dENvbG9yID0gdGV4dENvbG9yO1xuICAgIHRoaXMueCA9IHg7XG4gICAgdGhpcy55ID0geTtcbiAgICB0aGlzLnRleHQgPSB0ZXh0O1xuICAgIHRoaXMucGFkZGluZyA9IHBhZGRpbmc7XG4gICAgdGhpcy5vcGFjaXR5ID0gb3BhY2l0eTtcbiAgICB0aGlzLmZvbnRTaXplID0gZm9udFNpemU7XG4gICAgdGhpcy5yZW5kZXIoKTtcbiAgfVxuICAvKipcbiAgICog6aaW5qyh5riy5p+TXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG5cbiAgVGltZUJhclRvb2x0aXAucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIGNsYXNzTmFtZSA9IHNlbGYuY2xhc3NOYW1lLFxuICAgICAgICB4ID0gc2VsZi54LFxuICAgICAgICB5ID0gc2VsZi55LFxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3IgPSBzZWxmLmJhY2tncm91bmRDb2xvcixcbiAgICAgICAgdGV4dENvbG9yID0gc2VsZi50ZXh0Q29sb3IsXG4gICAgICAgIHRleHQgPSBzZWxmLnRleHQsXG4gICAgICAgIHBhZGRpbmcgPSBzZWxmLnBhZGRpbmcsXG4gICAgICAgIG9wYWNpdHkgPSBzZWxmLm9wYWNpdHksXG4gICAgICAgIGZvbnRTaXplID0gc2VsZi5mb250U2l6ZTtcbiAgICB2YXIgcGFyZW50Tm9kZSA9IHNlbGYuY29udGFpbmVyO1xuICAgIHZhciBjb250YWluZXIgPSBjcmVhdGVEb20oXCI8ZGl2IGNsYXNzPSdcIiArIGNsYXNzTmFtZSArIFwiJyBzdHlsZT1cXFwicG9zaXRpb246IGFic29sdXRlOyB3aWR0aDogZml0LWNvbnRlbnQ7IGhlaWdodDogZml0LWNvbnRlbnQ7IG9wYWNpdHk6IFwiICsgb3BhY2l0eSArIFwiXFxcIj48L2Rpdj5cIik7XG5cbiAgICBpZiAoaXNTdHJpbmcocGFyZW50Tm9kZSkpIHtcbiAgICAgIHBhcmVudE5vZGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChwYXJlbnROb2RlKTtcbiAgICB9XG5cbiAgICBwYXJlbnROb2RlLmFwcGVuZENoaWxkKGNvbnRhaW5lcik7XG4gICAgc2VsZi5wYXJlbnRIZWlnaHQgPSBwYXJlbnROb2RlLm9mZnNldEhlaWdodDtcbiAgICBzZWxmLnBhcmVudFdpZHRoID0gcGFyZW50Tm9kZS5vZmZzZXRXaWR0aDtcbiAgICBtb2RpZnlDU1MoY29udGFpbmVyLCB7XG4gICAgICB2aXNpYmlsaXR5OiAnaGlkZGVuJyxcbiAgICAgIHRvcDogMCxcbiAgICAgIGxlZnQ6IDBcbiAgICB9KTtcbiAgICB2YXIgYmFja2dyb3VuZCA9IGNyZWF0ZURvbShcIlxcbiAgICAgIDxkaXYgc3R5bGU9J3Bvc2l0aW9uOiBhYnNvbHV0ZTsgd2hpdGUtc3BhY2U6bm93cmFwOyBiYWNrZ3JvdW5kLWNvbG9yOiBcIiArIGJhY2tncm91bmRDb2xvciArIFwiOyBmb250LXNpemU6IFwiICsgZm9udFNpemUgKyBcInB4OyBib3JkZXItcmFkaXVzOiA0cHg7IHdpZHRoOiBmaXQtY29udGVudDsgaGVpZ2h0OiBmaXQtY29udGVudDsgY29sb3I6IFwiICsgdGV4dENvbG9yICsgXCI7IHBhZGRpbmc6IFwiICsgcGFkZGluZ1swXSArIFwicHggXCIgKyBwYWRkaW5nWzFdICsgXCJweCBcIiArIHBhZGRpbmdbMl0gKyBcInB4IFwiICsgcGFkZGluZ1szXSArIFwicHgnPjwvZGl2PlwiKTtcbiAgICBiYWNrZ3JvdW5kLmlubmVySFRNTCA9IHRleHQ7XG4gICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGJhY2tncm91bmQpO1xuICAgIHNlbGYuYmFja2dyb3VuZERPTSA9IGJhY2tncm91bmQ7XG4gICAgdmFyIGFycm93ID0gY3JlYXRlRG9tKFwiPGRpdiBzdHlsZT0ncG9zaXRpb246IGFic29sdXRlOyB3aWR0aDogMHB4OyBoZWlnaHQ6IDBweDsgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCB0cmFuc3BhcmVudDsgYm9yZGVyLXJpZ2h0OiA1cHggc29saWQgdHJhbnNwYXJlbnQ7IGJvcmRlci10b3A6IDEwcHggc29saWQgXCIgKyBiYWNrZ3JvdW5kQ29sb3IgKyBcIic+PC9kaXY+XCIpO1xuICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChhcnJvdyk7XG4gICAgc2VsZi5hcnJvd0RPTSA9IGFycm93O1xuICAgIHNlbGYuY29udGFpbmVyID0gY29udGFpbmVyO1xuICB9O1xuXG4gIFRpbWVCYXJUb29sdGlwLnByb3RvdHlwZS5zaG93ID0gZnVuY3Rpb24gKGNmZykge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgdGV4dCA9IGNmZy50ZXh0LFxuICAgICAgICB4ID0gY2ZnLngsXG4gICAgICAgIHkgPSBjZmcueSxcbiAgICAgICAgY2xpZW50WCA9IGNmZy5jbGllbnRYLFxuICAgICAgICBjbGllbnRZID0gY2ZnLmNsaWVudFk7XG4gICAgc2VsZi5iYWNrZ3JvdW5kRE9NLmlubmVySFRNTCA9IHRleHQ7XG4gICAgdmFyIGJhY2tncm91bmRXaWR0aCA9IHNlbGYuYmFja2dyb3VuZERPTS5vZmZzZXRXaWR0aDtcbiAgICB2YXIgYmFja2dyb3VuZEhlaWdodCA9IHNlbGYuYmFja2dyb3VuZERPTS5vZmZzZXRIZWlnaHQ7XG4gICAgdmFyIGFycm93V2lkdGggPSBzZWxmLmFycm93RE9NLm9mZnNldFdpZHRoO1xuICAgIHZhciBhcnJvd0hlaWdodCA9IHNlbGYuYXJyb3dET00ub2Zmc2V0SGVpZ2h0O1xuICAgIG1vZGlmeUNTUyhzZWxmLmNvbnRhaW5lciwge1xuICAgICAgdG9wOiAtYmFja2dyb3VuZEhlaWdodCAtIGFycm93SGVpZ2h0ICsgXCJweFwiLFxuICAgICAgbGVmdDogeCArIFwicHhcIixcbiAgICAgIHZpc2liaWxpdHk6ICd2aXNpYmxlJ1xuICAgIH0pO1xuICAgIG1vZGlmeUNTUyhzZWxmLmJhY2tncm91bmRET00sIHtcbiAgICAgIG1hcmdpbkxlZnQ6IC1iYWNrZ3JvdW5kV2lkdGggLyAyICsgXCJweFwiXG4gICAgfSk7XG4gICAgbW9kaWZ5Q1NTKHNlbGYuYXJyb3dET00sIHtcbiAgICAgIG1hcmdpbkxlZnQ6IC1hcnJvd1dpZHRoIC8gMiArIFwicHhcIixcbiAgICAgIHRvcDogYmFja2dyb3VuZEhlaWdodCArIFwicHhcIlxuICAgIH0pO1xuICAgIHZhciBsZWZ0ID0geCAtIGJhY2tncm91bmRXaWR0aCAvIDI7XG4gICAgdmFyIHJpZ2h0ID0geCArIGJhY2tncm91bmRXaWR0aCAvIDI7XG5cbiAgICBpZiAobGVmdCA8IDApIHtcbiAgICAgIG1vZGlmeUNTUyhzZWxmLmJhY2tncm91bmRET00sIHtcbiAgICAgICAgbWFyZ2luTGVmdDogLWJhY2tncm91bmRXaWR0aCAvIDIgLSBsZWZ0ICsgXCJweFwiXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHJpZ2h0ID4gc2VsZi5wYXJlbnRXaWR0aCkge1xuICAgICAgbW9kaWZ5Q1NTKHNlbGYuYmFja2dyb3VuZERPTSwge1xuICAgICAgICBtYXJnaW5MZWZ0OiAtYmFja2dyb3VuZFdpZHRoIC8gMiAtIHJpZ2h0ICsgc2VsZi5wYXJlbnRXaWR0aCArIDEyICsgXCJweFwiXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgVGltZUJhclRvb2x0aXAucHJvdG90eXBlLmhpZGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgbW9kaWZ5Q1NTKHRoaXMuY29udGFpbmVyLCB7XG4gICAgICB0b3A6IDAsXG4gICAgICBsZWZ0OiAwLFxuICAgICAgdmlzaWJpbGl0eTogJ2hpZGRlbidcbiAgICB9KTtcbiAgfTtcblxuICByZXR1cm4gVGltZUJhclRvb2x0aXA7XG59KCk7XG5cbmV4cG9ydCBkZWZhdWx0IFRpbWVCYXJUb29sdGlwOyIsInZhciBfX2Fzc2lnbiA9IHRoaXMgJiYgdGhpcy5fX2Fzc2lnbiB8fCBmdW5jdGlvbiAoKSB7XG4gIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodCkge1xuICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xuICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcblxuICAgICAgZm9yICh2YXIgcCBpbiBzKSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpIHRbcF0gPSBzW3BdO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0O1xuICB9O1xuXG4gIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufTtcblxuaW1wb3J0IHsgaXNTdHJpbmcgfSBmcm9tICdAYW50di91dGlsJztcbmltcG9ydCBUaW1lQmFyVG9vbHRpcCBmcm9tICcuL3RpbWVCYXJUb29sdGlwJztcbmltcG9ydCBDb250cm9sbGVyQnRuIGZyb20gJy4vY29udHJvbGxlckJ0bic7XG5pbXBvcnQgeyBWQUxVRV9DSEFOR0UsIFRJTUVMSU5FX1NUQVJULCBUSU1FTElORV9FTkQsIFBMQVlfUEFVU0VfQlROLCBORVhUX1NURVBfQlROLCBQUkVfU1RFUF9CVE4sIFRJTUVCQVJfQ09ORklHX0NIQU5HRSB9IGZyb20gJy4vY29uc3RhbnQnO1xudmFyIERFRkFVTFRfU0VMRUNURURUSUNLX1NUWUxFID0ge1xuICBmaWxsOiAnIzVCOEZGOSdcbn07XG52YXIgREVGQVVMVF9VTlNFTEVDVEVEVElDS19TVFlMRSA9IHtcbiAgZmlsbDogJyNlNmU4ZTknXG59O1xuXG52YXIgVGltZUJhclNsaWNlID1cbi8qKiBAY2xhc3MgKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gVGltZUJhclNsaWNlKGNmZ3MpIHtcbiAgICB0aGlzLmZyYW1lQ291bnQgPSAwO1xuICAgIHRoaXMuZm9udEZhbWlseSA9ICdBcmlhbCwgc2Fucy1zZXJpZic7XG4gICAgdmFyIGdyYXBoID0gY2Zncy5ncmFwaCxcbiAgICAgICAgY2FudmFzID0gY2Zncy5jYW52YXMsXG4gICAgICAgIGdyb3VwID0gY2Zncy5ncm91cCxcbiAgICAgICAgd2lkdGggPSBjZmdzLndpZHRoLFxuICAgICAgICBoZWlnaHQgPSBjZmdzLmhlaWdodCxcbiAgICAgICAgcGFkZGluZyA9IGNmZ3MucGFkZGluZyxcbiAgICAgICAgZGF0YSA9IGNmZ3MuZGF0YSxcbiAgICAgICAgc3RhcnQgPSBjZmdzLnN0YXJ0LFxuICAgICAgICBlbmQgPSBjZmdzLmVuZCxcbiAgICAgICAgX2EgPSBjZmdzLngsXG4gICAgICAgIHggPSBfYSA9PT0gdm9pZCAwID8gMCA6IF9hLFxuICAgICAgICBfYiA9IGNmZ3MueSxcbiAgICAgICAgeSA9IF9iID09PSB2b2lkIDAgPyAwIDogX2IsXG4gICAgICAgIHRpY2tMYWJlbEZvcm1hdHRlciA9IGNmZ3MudGlja0xhYmVsRm9ybWF0dGVyLFxuICAgICAgICBfYyA9IGNmZ3Muc2VsZWN0ZWRUaWNrU3R5bGUsXG4gICAgICAgIHNlbGVjdGVkVGlja1N0eWxlID0gX2MgPT09IHZvaWQgMCA/IERFRkFVTFRfU0VMRUNURURUSUNLX1NUWUxFIDogX2MsXG4gICAgICAgIF9kID0gY2Zncy51bnNlbGVjdGVkVGlja1N0eWxlLFxuICAgICAgICB1bnNlbGVjdGVkVGlja1N0eWxlID0gX2QgPT09IHZvaWQgMCA/IERFRkFVTFRfVU5TRUxFQ1RFRFRJQ0tfU1RZTEUgOiBfZCxcbiAgICAgICAgdG9vbHRpcEJhY2tncm91bmRDb2xvciA9IGNmZ3MudG9vbHRpcEJhY2tncm91bmRDb2xvcixcbiAgICAgICAgdG9vbHRpcEZvbWF0dGVyID0gY2Zncy50b29sdGlwRm9tYXR0ZXI7XG4gICAgdGhpcy5ncmFwaCA9IGdyYXBoO1xuICAgIHRoaXMuZ3JvdXAgPSBncm91cDtcbiAgICB0aGlzLnNsaWNlR3JvdXAgPSBncm91cC5hZGRHcm91cCh7XG4gICAgICBuYW1lOiAnc2xpY2UtZ3JvdXAnXG4gICAgfSk7XG4gICAgdGhpcy5jYW52YXMgPSBjYW52YXM7XG4gICAgdGhpcy53aWR0aCA9IHdpZHRoO1xuICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgIHRoaXMucGFkZGluZyA9IHBhZGRpbmc7XG4gICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICB0aGlzLnN0YXJ0ID0gc3RhcnQ7XG4gICAgdGhpcy5lbmQgPSBlbmQ7XG4gICAgdGhpcy50aWNrTGFiZWxGb3JtYXR0ZXIgPSB0aWNrTGFiZWxGb3JtYXR0ZXI7XG4gICAgdGhpcy5zZWxlY3RlZFRpY2tTdHlsZSA9IHNlbGVjdGVkVGlja1N0eWxlO1xuICAgIHRoaXMudW5zZWxlY3RlZFRpY2tTdHlsZSA9IHVuc2VsZWN0ZWRUaWNrU3R5bGU7XG4gICAgdGhpcy54ID0geDtcbiAgICB0aGlzLnkgPSB5O1xuICAgIHRoaXMudG9vbHRpcEJhY2tncm91bmRDb2xvciA9IHRvb2x0aXBCYWNrZ3JvdW5kQ29sb3I7XG4gICAgdGhpcy50b29sdGlwRm9tYXR0ZXIgPSB0b29sdGlwRm9tYXR0ZXI7IC8vIOWIneWni+WMliBmb250RmFtaWx577yM5aaC5p6c5pyJ5rWP6KeI5Zmo77yM5Y+WIGJvZHkg5LiK55qE5a2X5L2T77yM6Ziy5q2i5paH5a2X5pu05paw5pe25bGA6YOo5riy5p+T6YCg5oiQ55qE6YeN5b2xXG5cbiAgICB0aGlzLmZvbnRGYW1pbHkgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmJvZHksIG51bGwpLmdldFByb3BlcnR5VmFsdWUoJ2ZvbnQtZmFtaWx5JykgfHwgJ0FyaWFsLCBzYW5zLXNlcmlmJyA6ICdBcmlhbCwgc2Fucy1zZXJpZic7XG4gICAgdGhpcy5yZW5kZXJTbGljZXMoKTtcbiAgICB0aGlzLmluaXRFdmVudCgpO1xuICB9XG5cbiAgVGltZUJhclNsaWNlLnByb3RvdHlwZS5yZW5kZXJTbGljZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHZhciBfYSA9IHRoaXMsXG4gICAgICAgIHdpZHRoID0gX2Eud2lkdGgsXG4gICAgICAgIGhlaWdodCA9IF9hLmhlaWdodCxcbiAgICAgICAgcGFkZGluZyA9IF9hLnBhZGRpbmcsXG4gICAgICAgIGRhdGEgPSBfYS5kYXRhLFxuICAgICAgICBzdGFydCA9IF9hLnN0YXJ0LFxuICAgICAgICBlbmQgPSBfYS5lbmQsXG4gICAgICAgIHRpY2tMYWJlbEZvcm1hdHRlciA9IF9hLnRpY2tMYWJlbEZvcm1hdHRlcixcbiAgICAgICAgc2VsZWN0ZWRUaWNrU3R5bGUgPSBfYS5zZWxlY3RlZFRpY2tTdHlsZSxcbiAgICAgICAgdW5zZWxlY3RlZFRpY2tTdHlsZSA9IF9hLnVuc2VsZWN0ZWRUaWNrU3R5bGU7XG5cbiAgICB2YXIgcmVhbFdpZHRoID0gd2lkdGggLSAyICogcGFkZGluZztcbiAgICB2YXIgZm9udFNpemUgPSAxMDtcbiAgICB2YXIgbGFiZWxMaW5lSGVpZ2h0ID0gNDtcbiAgICB2YXIgbGFiZWxBcmVhSGVpZ2h0ID0gMyAqIHBhZGRpbmcgKyBsYWJlbExpbmVIZWlnaHQgKyBmb250U2l6ZTtcbiAgICB2YXIgdGlja3NBcmVhSGVpZ2h0ID0gaGVpZ2h0IC0gbGFiZWxBcmVhSGVpZ2h0IC0gMiAqIHBhZGRpbmc7XG4gICAgdmFyIGdhcCA9IDI7XG4gICAgdmFyIHRpY2tzTGVuZ3RoID0gZGF0YS5sZW5ndGg7XG4gICAgdmFyIHRpY2tXaWR0aCA9IChyZWFsV2lkdGggLSBnYXAgKiAodGlja3NMZW5ndGggLSAxKSkgLyB0aWNrc0xlbmd0aDtcbiAgICB0aGlzLnRpY2tXaWR0aCA9IHRpY2tXaWR0aDtcbiAgICB2YXIgc2xpY2VHcm91cCA9IHRoaXMuc2xpY2VHcm91cDtcbiAgICB2YXIgdGlja1JlY3RzID0gW107XG4gICAgdmFyIGxhYmVscyA9IFtdO1xuICAgIHZhciBzdGFydFRpY2tJZCA9IE1hdGgucm91bmQodGlja3NMZW5ndGggKiBzdGFydCk7XG4gICAgdmFyIGVuZFRpY2tJZCA9IE1hdGgucm91bmQodGlja3NMZW5ndGggKiBlbmQpO1xuICAgIHRoaXMuc3RhcnRUaWNrUmVjdElkID0gc3RhcnRUaWNrSWQ7XG4gICAgdGhpcy5lbmRUaWNrUmVjdElkID0gZW5kVGlja0lkO1xuICAgIGRhdGEuZm9yRWFjaChmdW5jdGlvbiAoZCwgaSkge1xuICAgICAgLy8gZHJhdyB0aGUgdGljayByZWN0c1xuICAgICAgdmFyIHNlbGVjdGVkID0gaSA+PSBzdGFydFRpY2tJZCAmJiBpIDw9IGVuZFRpY2tJZDtcbiAgICAgIHZhciB0aWNrU3R5bGUgPSBzZWxlY3RlZCA/IHNlbGVjdGVkVGlja1N0eWxlIDogdW5zZWxlY3RlZFRpY2tTdHlsZTtcbiAgICAgIHZhciByZWN0ID0gc2xpY2VHcm91cC5hZGRTaGFwZSgncmVjdCcsIHtcbiAgICAgICAgYXR0cnM6IF9fYXNzaWduKHtcbiAgICAgICAgICB4OiBwYWRkaW5nICsgaSAqICh0aWNrV2lkdGggKyBnYXApLFxuICAgICAgICAgIHk6IHBhZGRpbmcsXG4gICAgICAgICAgd2lkdGg6IHRpY2tXaWR0aCxcbiAgICAgICAgICBoZWlnaHQ6IHRpY2tzQXJlYUhlaWdodFxuICAgICAgICB9LCB0aWNrU3R5bGUpLFxuICAgICAgICBkcmFnZ2FibGU6IHRydWUsXG4gICAgICAgIG5hbWU6IFwidGljay1yZWN0LVwiICsgaVxuICAgICAgfSk7IC8vIGRyYXcgdGhlIHBpY2sgdGljayByZWN0c1xuXG4gICAgICB2YXIgcGlja1JlY3QgPSBzbGljZUdyb3VwLmFkZFNoYXBlKCdyZWN0Jywge1xuICAgICAgICBhdHRyczoge1xuICAgICAgICAgIHg6IHBhZGRpbmcgKyBpICogdGlja1dpZHRoICsgZ2FwICogKDIgKiBpIC0gMSkgLyAyLFxuICAgICAgICAgIHk6IHBhZGRpbmcsXG4gICAgICAgICAgd2lkdGg6IGkgPT09IDAgfHwgaSA9PT0gdGlja3NMZW5ndGggLSAxID8gdGlja1dpZHRoICsgZ2FwIC8gMiA6IHRpY2tXaWR0aCArIGdhcCxcbiAgICAgICAgICBoZWlnaHQ6IHRpY2tzQXJlYUhlaWdodCxcbiAgICAgICAgICBmaWxsOiAnI2ZmZicsXG4gICAgICAgICAgb3BhY2l0eTogMFxuICAgICAgICB9LFxuICAgICAgICBkcmFnZ2FibGU6IHRydWUsXG4gICAgICAgIG5hbWU6IFwicGljay1yZWN0LVwiICsgaVxuICAgICAgfSk7XG4gICAgICBwaWNrUmVjdC50b0Zyb250KCk7XG4gICAgICB2YXIgcmVjdEJCb3ggPSByZWN0LmdldEJCb3goKTtcbiAgICAgIHZhciBjZW50ZXJYID0gKHJlY3RCQm94Lm1pblggKyByZWN0QkJveC5tYXhYKSAvIDI7XG4gICAgICB0aWNrUmVjdHMucHVzaCh7XG4gICAgICAgIHJlY3Q6IHJlY3QsXG4gICAgICAgIHBpY2tSZWN0OiBwaWNrUmVjdCxcbiAgICAgICAgdmFsdWU6IGQuZGF0ZSxcbiAgICAgICAgeDogY2VudGVyWCxcbiAgICAgICAgeTogcmVjdEJCb3gubWluWVxuICAgICAgfSk7XG4gICAgICB2YXIgbGFiZWw7XG5cbiAgICAgIGlmICh0aWNrTGFiZWxGb3JtYXR0ZXIpIHtcbiAgICAgICAgbGFiZWwgPSB0aWNrTGFiZWxGb3JtYXR0ZXIoZCk7XG5cbiAgICAgICAgaWYgKCFpc1N0cmluZyhsYWJlbCkgJiYgbGFiZWwpIHtcbiAgICAgICAgICAvLyByZXR1cm4gdHJ1ZVxuICAgICAgICAgIGxhYmVsID0gZC5kYXRlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGkgJSBNYXRoLnJvdW5kKHRpY2tzTGVuZ3RoIC8gMTApID09PSAwKSB7XG4gICAgICAgIGxhYmVsID0gZC5kYXRlO1xuICAgICAgfVxuXG4gICAgICBpZiAobGFiZWwpIHtcbiAgICAgICAgbGFiZWxzLnB1c2gobGFiZWwpOyAvLyBkcmF3IHRpY2sgbGluZXNcblxuICAgICAgICB2YXIgbGluZVN0YXJ0WSA9IHJlY3RCQm94Lm1heFkgKyBwYWRkaW5nICogMjtcbiAgICAgICAgc2xpY2VHcm91cC5hZGRTaGFwZSgnbGluZScsIHtcbiAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgc3Ryb2tlOiAnI0JGQkZCRicsXG4gICAgICAgICAgICB4MTogY2VudGVyWCxcbiAgICAgICAgICAgIHkxOiBsaW5lU3RhcnRZLFxuICAgICAgICAgICAgeDI6IGNlbnRlclgsXG4gICAgICAgICAgICB5MjogbGluZVN0YXJ0WSArIGxhYmVsTGluZUhlaWdodFxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHZhciBsYWJlbFN0YXJ0WSA9IGxpbmVTdGFydFkgKyBsYWJlbExpbmVIZWlnaHQgKyBwYWRkaW5nO1xuICAgICAgICB2YXIgdGV4dCA9IHNsaWNlR3JvdXAuYWRkU2hhcGUoJ3RleHQnLCB7XG4gICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgIGZpbGw6ICcjOGM4YzhjJyxcbiAgICAgICAgICAgIHN0cm9rZTogJyNmZmYnLFxuICAgICAgICAgICAgbGluZVdpZHRoOiAxLFxuICAgICAgICAgICAgeDogY2VudGVyWCxcbiAgICAgICAgICAgIHk6IGxhYmVsU3RhcnRZLFxuICAgICAgICAgICAgdGV4dEFsaWduOiAnY2VudGVyJyxcbiAgICAgICAgICAgIHRleHQ6IGxhYmVsLFxuICAgICAgICAgICAgdGV4dEJhc2VsaW5lOiAndG9wJyxcbiAgICAgICAgICAgIGZvbnRTaXplOiAxMCxcbiAgICAgICAgICAgIGZvbnRGYW1pbHk6IF90aGlzLmZvbnRGYW1pbHkgfHwgJ0FyaWFsLCBzYW5zLXNlcmlmJ1xuICAgICAgICAgIH0sXG4gICAgICAgICAgY2FwdHVyZTogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciB0ZXh0QkJveCA9IHRleHQuZ2V0QkJveCgpO1xuXG4gICAgICAgIGlmICh0ZXh0QkJveC5tYXhYID4gd2lkdGgpIHtcbiAgICAgICAgICB0ZXh0LmF0dHIoJ3RleHRBbGlnbicsICdyaWdodCcpO1xuICAgICAgICB9IGVsc2UgaWYgKHRleHRCQm94Lm1pblggPCAwKSB7XG4gICAgICAgICAgdGV4dC5hdHRyKCd0ZXh0QWxpZ24nLCAnbGVmdCcpO1xuICAgICAgICB9IC8vIGRyYXcgdGljayBsYWJlbHNcblxuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMudGlja1JlY3RzID0gdGlja1JlY3RzOyAvLyDmuLLmn5Pmkq3mlL7jgIHlv6vov5vlkozlkI7pgIDnmoTmjqfliLbmjInpkq5cblxuICAgIHZhciBncm91cCA9IHRoaXMuZ3JvdXA7XG4gICAgdGhpcy5jdXJyZW50U3BlZWQgPSAxO1xuICAgIHRoaXMuY29udHJvbGxlckJ0bkdyb3VwID0gbmV3IENvbnRyb2xsZXJCdG4oe1xuICAgICAgZ3JvdXA6IGdyb3VwLFxuICAgICAgeDogdGhpcy54LFxuICAgICAgeTogdGhpcy55ICsgaGVpZ2h0ICsgNSxcbiAgICAgIHdpZHRoOiB3aWR0aCxcbiAgICAgIGhlaWdodDogNDAsXG4gICAgICBoaWRlVGltZVR5cGVDb250cm9sbGVyOiB0cnVlLFxuICAgICAgc3BlZWQ6IHRoaXMuY3VycmVudFNwZWVkLFxuICAgICAgZm9udEZhbWlseTogdGhpcy5mb250RmFtaWx5IHx8ICdBcmlhbCwgc2Fucy1zZXJpZidcbiAgICB9KTtcbiAgfTtcblxuICBUaW1lQmFyU2xpY2UucHJvdG90eXBlLmluaXRFdmVudCA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdmFyIHNsaWNlR3JvdXAgPSB0aGlzLnNsaWNlR3JvdXA7XG4gICAgc2xpY2VHcm91cC5vbignY2xpY2snLCBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIHRhcmdldFJlY3QgPSBlLnRhcmdldDtcbiAgICAgIGlmICh0YXJnZXRSZWN0LmdldCgndHlwZScpICE9PSAncmVjdCcgfHwgIXRhcmdldFJlY3QuZ2V0KCduYW1lJykpIHJldHVybjtcbiAgICAgIHZhciBpZCA9IHBhcnNlSW50KHRhcmdldFJlY3QuZ2V0KCduYW1lJykuc3BsaXQoJy0nKVsyXSwgMTApO1xuXG4gICAgICBpZiAoIWlzTmFOKGlkKSkge1xuICAgICAgICB2YXIgdGlja1JlY3RzXzEgPSBfdGhpcy50aWNrUmVjdHM7IC8vIGNhbmNlbCB0aGUgc2VsZWN0ZWQgdGlja3NcblxuICAgICAgICB2YXIgdW5zZWxlY3RlZFRpY2tTdHlsZV8xID0gX3RoaXMudW5zZWxlY3RlZFRpY2tTdHlsZTtcbiAgICAgICAgdGlja1JlY3RzXzEuZm9yRWFjaChmdW5jdGlvbiAodGlja1JlY3QpIHtcbiAgICAgICAgICB0aWNrUmVjdC5yZWN0LmF0dHIodW5zZWxlY3RlZFRpY2tTdHlsZV8xKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciBzZWxlY3RlZFRpY2tTdHlsZSA9IF90aGlzLnNlbGVjdGVkVGlja1N0eWxlO1xuICAgICAgICB0aWNrUmVjdHNfMVtpZF0ucmVjdC5hdHRyKHNlbGVjdGVkVGlja1N0eWxlKTtcbiAgICAgICAgX3RoaXMuc3RhcnRUaWNrUmVjdElkID0gaWQ7XG4gICAgICAgIF90aGlzLmVuZFRpY2tSZWN0SWQgPSBpZDtcbiAgICAgICAgdmFyIHRpY2tzTGVuZ3RoID0gdGlja1JlY3RzXzEubGVuZ3RoO1xuICAgICAgICB2YXIgc3RhcnQgPSBpZCAvIHRpY2tzTGVuZ3RoO1xuXG4gICAgICAgIF90aGlzLmdyYXBoLmVtaXQoVkFMVUVfQ0hBTkdFLCB7XG4gICAgICAgICAgdmFsdWU6IFtzdGFydCwgc3RhcnRdXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHNsaWNlR3JvdXAub24oJ2RyYWdzdGFydCcsIGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgdGlja1JlY3RzID0gX3RoaXMudGlja1JlY3RzOyAvLyBjYW5jZWwgdGhlIHNlbGVjdGVkIHRpY2tzXG5cbiAgICAgIHZhciB1bnNlbGVjdGVkVGlja1N0eWxlID0gX3RoaXMudW5zZWxlY3RlZFRpY2tTdHlsZTtcbiAgICAgIHRpY2tSZWN0cy5mb3JFYWNoKGZ1bmN0aW9uICh0aWNrUmVjdCkge1xuICAgICAgICB0aWNrUmVjdC5yZWN0LmF0dHIodW5zZWxlY3RlZFRpY2tTdHlsZSk7XG4gICAgICB9KTtcbiAgICAgIHZhciB0YXJnZXRSZWN0ID0gZS50YXJnZXQ7XG4gICAgICB2YXIgaWQgPSBwYXJzZUludCh0YXJnZXRSZWN0LmdldCgnbmFtZScpLnNwbGl0KCctJylbMl0sIDEwKTtcbiAgICAgIHZhciBzZWxlY3RlZFRpY2tTdHlsZSA9IF90aGlzLnNlbGVjdGVkVGlja1N0eWxlO1xuICAgICAgdGlja1JlY3RzW2lkXS5yZWN0LmF0dHIoc2VsZWN0ZWRUaWNrU3R5bGUpO1xuICAgICAgX3RoaXMuc3RhcnRUaWNrUmVjdElkID0gaWQ7XG4gICAgICB2YXIgdGlja3NMZW5ndGggPSB0aWNrUmVjdHMubGVuZ3RoO1xuICAgICAgdmFyIHN0YXJ0ID0gaWQgLyB0aWNrc0xlbmd0aDtcblxuICAgICAgX3RoaXMuZ3JhcGguZW1pdChWQUxVRV9DSEFOR0UsIHtcbiAgICAgICAgdmFsdWU6IFtzdGFydCwgc3RhcnRdXG4gICAgICB9KTtcblxuICAgICAgX3RoaXMuZHJhZ2dpbmcgPSB0cnVlO1xuICAgIH0pO1xuICAgIHNsaWNlR3JvdXAub24oJ2RyYWdvdmVyJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgIGlmICghX3RoaXMuZHJhZ2dpbmcpIHJldHVybjtcbiAgICAgIGlmIChlLnRhcmdldC5nZXQoJ3R5cGUnKSAhPT0gJ3JlY3QnKSByZXR1cm47XG4gICAgICB2YXIgaWQgPSBwYXJzZUludChlLnRhcmdldC5nZXQoJ25hbWUnKS5zcGxpdCgnLScpWzJdLCAxMCk7XG4gICAgICB2YXIgc3RhcnRUaWNrUmVjdElkID0gX3RoaXMuc3RhcnRUaWNrUmVjdElkO1xuICAgICAgdmFyIHRpY2tSZWN0cyA9IF90aGlzLnRpY2tSZWN0cztcbiAgICAgIHZhciBzZWxlY3RlZFRpY2tTdHlsZSA9IF90aGlzLnNlbGVjdGVkVGlja1N0eWxlO1xuICAgICAgdmFyIHVuc2VsZWN0ZWRUaWNrU3R5bGUgPSBfdGhpcy51bnNlbGVjdGVkVGlja1N0eWxlO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRpY2tSZWN0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgc3R5bGUgPSBpID49IHN0YXJ0VGlja1JlY3RJZCAmJiBpIDw9IGlkID8gc2VsZWN0ZWRUaWNrU3R5bGUgOiB1bnNlbGVjdGVkVGlja1N0eWxlO1xuICAgICAgICB0aWNrUmVjdHNbaV0ucmVjdC5hdHRyKHN0eWxlKTtcbiAgICAgIH1cblxuICAgICAgdmFyIHRpY2tzTGVuZ3RoID0gdGlja1JlY3RzLmxlbmd0aDtcbiAgICAgIF90aGlzLmVuZFRpY2tSZWN0SWQgPSBpZDtcbiAgICAgIHZhciBzdGFydCA9IHN0YXJ0VGlja1JlY3RJZCAvIHRpY2tzTGVuZ3RoO1xuICAgICAgdmFyIGVuZCA9IGlkIC8gdGlja3NMZW5ndGg7XG5cbiAgICAgIF90aGlzLmdyYXBoLmVtaXQoVkFMVUVfQ0hBTkdFLCB7XG4gICAgICAgIHZhbHVlOiBbc3RhcnQsIGVuZF1cbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHNsaWNlR3JvdXAub24oJ2Ryb3AnLCBmdW5jdGlvbiAoZSkge1xuICAgICAgaWYgKCFfdGhpcy5kcmFnZ2luZykgcmV0dXJuO1xuICAgICAgX3RoaXMuZHJhZ2dpbmcgPSBmYWxzZTtcbiAgICAgIGlmIChlLnRhcmdldC5nZXQoJ3R5cGUnKSAhPT0gJ3JlY3QnKSByZXR1cm47XG4gICAgICB2YXIgc3RhcnRUaWNrUmVjdElkID0gX3RoaXMuc3RhcnRUaWNrUmVjdElkO1xuICAgICAgdmFyIGlkID0gcGFyc2VJbnQoZS50YXJnZXQuZ2V0KCduYW1lJykuc3BsaXQoJy0nKVsyXSwgMTApO1xuICAgICAgaWYgKGlkIDwgc3RhcnRUaWNrUmVjdElkKSByZXR1cm47XG4gICAgICB2YXIgc2VsZWN0ZWRUaWNrU3R5bGUgPSBfdGhpcy5zZWxlY3RlZFRpY2tTdHlsZTtcbiAgICAgIHZhciB0aWNrUmVjdHMgPSBfdGhpcy50aWNrUmVjdHM7XG4gICAgICB0aWNrUmVjdHNbaWRdLnJlY3QuYXR0cihzZWxlY3RlZFRpY2tTdHlsZSk7XG4gICAgICBfdGhpcy5lbmRUaWNrUmVjdElkID0gaWQ7XG4gICAgICB2YXIgdGlja3NMZW5ndGggPSB0aWNrUmVjdHMubGVuZ3RoO1xuICAgICAgdmFyIHN0YXJ0ID0gc3RhcnRUaWNrUmVjdElkIC8gdGlja3NMZW5ndGg7XG4gICAgICB2YXIgZW5kID0gaWQgLyB0aWNrc0xlbmd0aDtcblxuICAgICAgX3RoaXMuZ3JhcGguZW1pdChWQUxVRV9DSEFOR0UsIHtcbiAgICAgICAgdmFsdWU6IFtzdGFydCwgZW5kXVxuICAgICAgfSk7XG4gICAgfSk7IC8vIHRvb2x0aXBcblxuICAgIHZhciBfYSA9IHRoaXMsXG4gICAgICAgIHRvb2x0aXBCYWNrZ3JvdW5kQ29sb3IgPSBfYS50b29sdGlwQmFja2dyb3VuZENvbG9yLFxuICAgICAgICB0b29sdGlwRm9tYXR0ZXIgPSBfYS50b29sdGlwRm9tYXR0ZXIsXG4gICAgICAgIGNhbnZhcyA9IF9hLmNhbnZhcztcblxuICAgIHZhciB0b29sdGlwID0gbmV3IFRpbWVCYXJUb29sdGlwKHtcbiAgICAgIGNvbnRhaW5lcjogY2FudmFzLmdldCgnY29udGFpbmVyJyksXG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRvb2x0aXBCYWNrZ3JvdW5kQ29sb3JcbiAgICB9KTtcbiAgICB2YXIgdGlja1JlY3RzID0gdGhpcy50aWNrUmVjdHM7XG4gICAgdGlja1JlY3RzLmZvckVhY2goZnVuY3Rpb24gKHRpY2tSZWN0KSB7XG4gICAgICB2YXIgcGlja1JlY3QgPSB0aWNrUmVjdC5waWNrUmVjdDtcbiAgICAgIHBpY2tSZWN0Lm9uKCdtb3VzZWVudGVyJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdmFyIHJlY3QgPSBlLnRhcmdldDtcbiAgICAgICAgaWYgKHJlY3QuZ2V0KCd0eXBlJykgIT09ICdyZWN0JykgcmV0dXJuO1xuICAgICAgICB2YXIgaWQgPSBwYXJzZUludChyZWN0LmdldCgnbmFtZScpLnNwbGl0KCctJylbMl0sIDEwKTtcbiAgICAgICAgdmFyIGNsaWVudFBvaW50ID0gY2FudmFzLmdldENsaWVudEJ5UG9pbnQodGlja1JlY3RzW2lkXS54LCB0aWNrUmVjdHNbaWRdLnkpO1xuICAgICAgICB0b29sdGlwLnNob3coe1xuICAgICAgICAgIHg6IHRpY2tSZWN0c1tpZF0ueCxcbiAgICAgICAgICB5OiB0aWNrUmVjdHNbaWRdLnksXG4gICAgICAgICAgY2xpZW50WDogY2xpZW50UG9pbnQueCxcbiAgICAgICAgICBjbGllbnRZOiBjbGllbnRQb2ludC55LFxuICAgICAgICAgIHRleHQ6IHRvb2x0aXBGb21hdHRlciA/IHRvb2x0aXBGb21hdHRlcih0aWNrUmVjdHNbaWRdLnZhbHVlKSA6IHRpY2tSZWN0c1tpZF0udmFsdWVcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIHBpY2tSZWN0Lm9uKCdtb3VzZWxlYXZlJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdG9vbHRpcC5oaWRlKCk7XG4gICAgICB9KTtcbiAgICB9KTsgLy8gcGxheSBjb250cm9sbGVyIGV2ZW50c1xuXG4gICAgdmFyIGdyb3VwID0gdGhpcy5ncm91cDsgLy8g5pKt5pS+5Yy65oyJ6ZKu5o6n5Yi2XG5cbiAgICAvKiog5pKt5pS+L+aaguWBnOS6i+S7tiAqL1xuXG4gICAgZ3JvdXAub24oUExBWV9QQVVTRV9CVE4gKyBcIjpjbGlja1wiLCBmdW5jdGlvbiAoKSB7XG4gICAgICBfdGhpcy5pc1BsYXkgPSAhX3RoaXMuaXNQbGF5O1xuXG4gICAgICBfdGhpcy5jaGFuZ2VQbGF5U3RhdHVzKCk7XG4gICAgfSk7IC8vIOWkhOeQhuWJjei/m+S4gOatpeeahOS6i+S7tlxuXG4gICAgZ3JvdXAub24oTkVYVF9TVEVQX0JUTiArIFwiOmNsaWNrXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIF90aGlzLnVwZGF0ZVN0YXJ0RW5kKDEpO1xuICAgIH0pOyAvLyDlpITnkIblkI7pgIDkuIDmraXnmoTkuovku7ZcblxuICAgIGdyb3VwLm9uKFBSRV9TVEVQX0JUTiArIFwiOmNsaWNrXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIF90aGlzLnVwZGF0ZVN0YXJ0RW5kKC0xKTtcbiAgICB9KTtcbiAgICBncm91cC5vbihUSU1FQkFSX0NPTkZJR19DSEFOR0UsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgdmFyIHR5cGUgPSBfYS50eXBlLFxuICAgICAgICAgIHNwZWVkID0gX2Euc3BlZWQ7XG4gICAgICBfdGhpcy5jdXJyZW50U3BlZWQgPSBzcGVlZDtcbiAgICB9KTtcbiAgfTtcblxuICBUaW1lQmFyU2xpY2UucHJvdG90eXBlLmNoYW5nZVBsYXlTdGF0dXMgPSBmdW5jdGlvbiAoaXNTeW5jKSB7XG4gICAgaWYgKGlzU3luYyA9PT0gdm9pZCAwKSB7XG4gICAgICBpc1N5bmMgPSB0cnVlO1xuICAgIH1cblxuICAgIHRoaXMuY29udHJvbGxlckJ0bkdyb3VwLnBsYXlCdXR0b24udXBkYXRlKHtcbiAgICAgIGlzUGxheTogdGhpcy5pc1BsYXlcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLmlzUGxheSkge1xuICAgICAgLy8g5byA5aeL5pKt5pS+XG4gICAgICB0aGlzLnBsYXlIYW5kbGVyID0gdGhpcy5zdGFydFBsYXkoKTtcbiAgICAgIHRoaXMuZ3JhcGguZW1pdChUSU1FTElORV9TVEFSVCwgbnVsbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIOe7k+adn+aSreaUvlxuICAgICAgaWYgKHRoaXMucGxheUhhbmRsZXIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5wbGF5SGFuZGxlcik7XG5cbiAgICAgICAgaWYgKGlzU3luYykge1xuICAgICAgICAgIHRoaXMuZ3JhcGguZW1pdChUSU1FTElORV9FTkQsIG51bGwpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIFRpbWVCYXJTbGljZS5wcm90b3R5cGUuc3RhcnRQbGF5ID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICByZXR1cm4gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBzcGVlZCA9IF90aGlzLmN1cnJlbnRTcGVlZDsgLy8g5LiA5YiG6ZKf5Yi35paw5LiA5qyhXG5cbiAgICAgIGlmIChfdGhpcy5mcmFtZUNvdW50ICUgKDYwIC8gc3BlZWQpID09PSAwKSB7XG4gICAgICAgIF90aGlzLmZyYW1lQ291bnQgPSAwO1xuXG4gICAgICAgIF90aGlzLnVwZGF0ZVN0YXJ0RW5kKDEpO1xuICAgICAgfVxuXG4gICAgICBfdGhpcy5mcmFtZUNvdW50Kys7XG5cbiAgICAgIGlmIChfdGhpcy5pc1BsYXkpIHtcbiAgICAgICAgX3RoaXMucGxheUhhbmRsZXIgPSBfdGhpcy5zdGFydFBsYXkoKTtcbiAgICAgIH1cbiAgICB9KSA6IHVuZGVmaW5lZDtcbiAgfTtcblxuICBUaW1lQmFyU2xpY2UucHJvdG90eXBlLnVwZGF0ZVN0YXJ0RW5kID0gZnVuY3Rpb24gKHNpZ24pIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIHRpY2tSZWN0cyA9IHRoaXMudGlja1JlY3RzO1xuICAgIHZhciB0aWNrc0xlbmd0aCA9IHRpY2tSZWN0cy5sZW5ndGg7XG4gICAgdmFyIHVuc2VsZWN0ZWRUaWNrU3R5bGUgPSB0aGlzLnVuc2VsZWN0ZWRUaWNrU3R5bGU7XG4gICAgdmFyIHNlbGVjdGVkVGlja1N0eWxlID0gdGhpcy5zZWxlY3RlZFRpY2tTdHlsZTtcbiAgICB2YXIgcHJldmlvdXNFbmRUaWNrUmVjdElkID0gc2VsZi5lbmRUaWNrUmVjdElkO1xuXG4gICAgaWYgKHNpZ24gPiAwKSB7XG4gICAgICBzZWxmLmVuZFRpY2tSZWN0SWQrKztcbiAgICB9IGVsc2Uge1xuICAgICAgdGlja1JlY3RzW3NlbGYuZW5kVGlja1JlY3RJZF0ucmVjdC5hdHRyKHVuc2VsZWN0ZWRUaWNrU3R5bGUpO1xuICAgICAgc2VsZi5lbmRUaWNrUmVjdElkLS07XG4gICAgfSAvLyDoi6XmraTml7Ygc3RhcnQg5LiOIGVuZCDkuI3lkIzvvIzojIPlm7TliY3ov5sv5ZCO6YCAL+aSreaUvlxuXG5cbiAgICBpZiAocHJldmlvdXNFbmRUaWNrUmVjdElkICE9PSBzZWxmLnN0YXJ0VGlja1JlY3RJZCkge1xuICAgICAgaWYgKHNlbGYuZW5kVGlja1JlY3RJZCA8IHNlbGYuc3RhcnRUaWNrUmVjdElkKSB7XG4gICAgICAgIHNlbGYuc3RhcnRUaWNrUmVjdElkID0gc2VsZi5lbmRUaWNrUmVjdElkO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyDlkKbliJnmmK/ljZXluKfnmoTliY3ov5sv5ZCO6YCAL+aSreaUvlxuICAgICAgZm9yICh2YXIgaSA9IHNlbGYuc3RhcnRUaWNrUmVjdElkOyBpIDw9IHNlbGYuZW5kVGlja1JlY3RJZCAtIDE7IGkrKykge1xuICAgICAgICB0aWNrUmVjdHNbaV0ucmVjdC5hdHRyKHVuc2VsZWN0ZWRUaWNrU3R5bGUpO1xuICAgICAgfVxuXG4gICAgICBzZWxmLnN0YXJ0VGlja1JlY3RJZCA9IHNlbGYuZW5kVGlja1JlY3RJZDtcbiAgICB9XG5cbiAgICBpZiAodGlja1JlY3RzW3NlbGYuZW5kVGlja1JlY3RJZF0pIHtcbiAgICAgIHRpY2tSZWN0c1tzZWxmLmVuZFRpY2tSZWN0SWRdLnJlY3QuYXR0cihzZWxlY3RlZFRpY2tTdHlsZSk7XG4gICAgICB2YXIgc3RhcnQgPSBzZWxmLnN0YXJ0VGlja1JlY3RJZCAvIHRpY2tzTGVuZ3RoO1xuICAgICAgdmFyIGVuZCA9IHNlbGYuZW5kVGlja1JlY3RJZCAvIHRpY2tzTGVuZ3RoO1xuICAgICAgdGhpcy5ncmFwaC5lbWl0KFZBTFVFX0NIQU5HRSwge1xuICAgICAgICB2YWx1ZTogW3N0YXJ0LCBlbmRdXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgVGltZUJhclNsaWNlLnByb3RvdHlwZS5kZXN0b3J5ID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuZ3JhcGgub2ZmKFZBTFVFX0NIQU5HRSk7XG4gICAgdmFyIGdyb3VwID0gdGhpcy5zbGljZUdyb3VwO1xuICAgIGdyb3VwLm9mZignY2xpY2snKTtcbiAgICBncm91cC5vZmYoJ2RyYWdzdGFydCcpO1xuICAgIGdyb3VwLm9mZignZHJhZ292ZXInKTtcbiAgICBncm91cC5vZmYoJ2Ryb3AnKTtcbiAgICB0aGlzLnRpY2tSZWN0cy5mb3JFYWNoKGZ1bmN0aW9uICh0aWNrUmVjdCkge1xuICAgICAgdmFyIHBpY2tSZWN0ID0gdGlja1JlY3QucGlja1JlY3Q7XG4gICAgICBwaWNrUmVjdC5vZmYoJ21vdXNlZW50ZXInKTtcbiAgICAgIHBpY2tSZWN0Lm9mZignbW91c2VsZWF2ZScpO1xuICAgIH0pO1xuICAgIHRoaXMudGlja1JlY3RzLmxlbmd0aCA9IDA7XG4gICAgZ3JvdXAub2ZmKFBMQVlfUEFVU0VfQlROICsgXCI6Y2xpY2tcIik7XG4gICAgZ3JvdXAub2ZmKE5FWFRfU1RFUF9CVE4gKyBcIjpjbGlja1wiKTtcbiAgICBncm91cC5vZmYoUFJFX1NURVBfQlROICsgXCI6Y2xpY2tcIik7XG4gICAgZ3JvdXAub2ZmKFRJTUVCQVJfQ09ORklHX0NIQU5HRSk7XG4gICAgdGhpcy5zbGljZUdyb3VwLmRlc3Ryb3koKTtcbiAgfTtcblxuICByZXR1cm4gVGltZUJhclNsaWNlO1xufSgpO1xuXG5leHBvcnQgZGVmYXVsdCBUaW1lQmFyU2xpY2U7IiwidmFyIF9fZXh0ZW5kcyA9IHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMgfHwgZnVuY3Rpb24gKCkge1xuICB2YXIgX2V4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbiBleHRlbmRTdGF0aWNzKGQsIGIpIHtcbiAgICBfZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCB7XG4gICAgICBfX3Byb3RvX186IFtdXG4gICAgfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICBkLl9fcHJvdG9fXyA9IGI7XG4gICAgfSB8fCBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgZm9yICh2YXIgcCBpbiBiKSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdO1xuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gX2V4dGVuZFN0YXRpY3MoZCwgYik7XG4gIH07XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgaWYgKHR5cGVvZiBiICE9PSBcImZ1bmN0aW9uXCIgJiYgYiAhPT0gbnVsbCkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNsYXNzIGV4dGVuZHMgdmFsdWUgXCIgKyBTdHJpbmcoYikgKyBcIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsXCIpO1xuXG4gICAgX2V4dGVuZFN0YXRpY3MoZCwgYik7XG5cbiAgICBmdW5jdGlvbiBfXygpIHtcbiAgICAgIHRoaXMuY29uc3RydWN0b3IgPSBkO1xuICAgIH1cblxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgfTtcbn0oKTtcblxudmFyIF9fYXNzaWduID0gdGhpcyAmJiB0aGlzLl9fYXNzaWduIHx8IGZ1bmN0aW9uICgpIHtcbiAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0KSB7XG4gICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG4gICAgICBzID0gYXJndW1lbnRzW2ldO1xuXG4gICAgICBmb3IgKHZhciBwIGluIHMpIHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdFtwXSA9IHNbcF07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHQ7XG4gIH07XG5cbiAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59O1xuXG52YXIgX19yZXN0ID0gdGhpcyAmJiB0aGlzLl9fcmVzdCB8fCBmdW5jdGlvbiAocywgZSkge1xuICB2YXIgdCA9IHt9O1xuXG4gIGZvciAodmFyIHAgaW4gcykge1xuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMCkgdFtwXSA9IHNbcF07XG4gIH1cblxuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpIHRbcFtpXV0gPSBzW3BbaV1dO1xuICB9XG4gIHJldHVybiB0O1xufTtcbi8qKlxuICog5Z+65LqOIEcg55qE5pe26Ze06L2057uE5Lu2XG4gKi9cblxuXG5pbXBvcnQgeyBDYW52YXMgYXMgR0NhbnZhcyB9IGZyb20gJ0BhbnR2L2ctY2FudmFzJztcbmltcG9ydCB7IENhbnZhcyBhcyBHU1ZHQ2FudmFzIH0gZnJvbSAnQGFudHYvZy1zdmcnO1xuaW1wb3J0IHsgY3JlYXRlRG9tLCBtb2RpZnlDU1MgfSBmcm9tICdAYW50di9kb20tdXRpbCc7XG5pbXBvcnQgQmFzZSBmcm9tICcuLi9iYXNlJztcbmltcG9ydCBUcmVuZFRpbWVCYXIgZnJvbSAnLi90cmVuZFRpbWVCYXInO1xuaW1wb3J0IFRpbWVCYXJTbGljZSBmcm9tICcuL3RpbWVCYXJTbGljZSc7XG5pbXBvcnQgeyBWQUxVRV9DSEFOR0UgfSBmcm9tICcuL2NvbnN0YW50JztcbmltcG9ydCB7IGlzU3RyaW5nLCB0aHJvdHRsZSB9IGZyb20gJ0BhbnR2L3V0aWwnOyAvLyBzaW1wbGUg54mI5pys6buY6K6k6auY5bqmXG5cbnZhciBERUZBVUxUX1NJTVBMRV9IRUlHSFQgPSA0OyAvLyB0cmVuZCDniYjmnKzpu5jorqTpq5jluqZcblxudmFyIERFRkFVTFRfVFJFTkRfSEVJR0hUID0gMjY7XG5cbnZhciBUaW1lQmFyID1cbi8qKiBAY2xhc3MgKi9cbmZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgX19leHRlbmRzKFRpbWVCYXIsIF9zdXBlcik7XG5cbiAgZnVuY3Rpb24gVGltZUJhcihjb25maWcpIHtcbiAgICByZXR1cm4gX3N1cGVyLmNhbGwodGhpcywgY29uZmlnKSB8fCB0aGlzO1xuICB9XG5cbiAgVGltZUJhci5wcm90b3R5cGUuZ2V0RGVmYXVsdENmZ3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgIGNsYXNzTmFtZTogJ2c2LWNvbXBvbmVudC10aW1lYmFyJyxcbiAgICAgIHBhZGRpbmc6IDEwLFxuICAgICAgdHlwZTogJ3RyZW5kJyxcbiAgICAgIHRyZW5kOiB7XG4gICAgICAgIGRhdGE6IFtdLFxuICAgICAgICBpc0FyZWE6IGZhbHNlLFxuICAgICAgICBzbW9vdGg6IHRydWVcbiAgICAgIH0sXG4gICAgICBjb250cm9sbGVyQ2ZnOiB7XG4gICAgICAgIHNwZWVkOiAxLFxuICAgICAgICBsb29wOiBmYWxzZVxuICAgICAgfSxcbiAgICAgIHNsaWRlcjoge1xuICAgICAgICBzdGFydDogMC4xLFxuICAgICAgICBlbmQ6IDAuOSxcbiAgICAgICAgbWluVGV4dDogJ21pbicsXG4gICAgICAgIG1heFRleHQ6ICdtYXgnXG4gICAgICB9LFxuICAgICAgdGljazoge1xuICAgICAgICBzdGFydDogMC4xLFxuICAgICAgICBlbmQ6IDAuOSxcbiAgICAgICAgZGF0YTogW11cbiAgICAgIH0sXG4gICAgICB0ZXh0U3R5bGU6IHt9LFxuICAgICAgZmlsdGVyRWRnZTogZmFsc2VcbiAgICB9O1xuICB9O1xuICAvKipcbiAgICog5Yid5aeL5YyWIFRpbWVCYXIg55qE5a655ZmoXG4gICAqL1xuXG5cbiAgVGltZUJhci5wcm90b3R5cGUuaW5pdENvbnRhaW5lciA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZ3JhcGggPSB0aGlzLmdldCgnZ3JhcGgnKTtcbiAgICB2YXIgX2EgPSB0aGlzLl9jZmdzLFxuICAgICAgICB3aWR0aCA9IF9hLndpZHRoLFxuICAgICAgICBoZWlnaHQgPSBfYS5oZWlnaHQ7XG4gICAgdmFyIGNsYXNzTmFtZSA9IHRoaXMuZ2V0KCdjbGFzc05hbWUnKSB8fCAnZzYtY29tcG9uZW50LXRpbWViYXInO1xuICAgIHZhciBjb250YWluZXIgPSB0aGlzLmdldCgnY29udGFpbmVyJyk7XG4gICAgdmFyIGdyYXBoQ29udGFpbmVyID0gdGhpcy5nZXQoJ2dyYXBoJykuZ2V0KCdjb250YWluZXInKTtcbiAgICB2YXIgdGltZUJhckNvbnRhaW5lcjtcblxuICAgIGlmICghY29udGFpbmVyKSB7XG4gICAgICB0aW1lQmFyQ29udGFpbmVyID0gY3JlYXRlRG9tKFwiPGRpdiBjbGFzcz0nXCIgKyBjbGFzc05hbWUgKyBcIic+PC9kaXY+XCIpO1xuICAgICAgbW9kaWZ5Q1NTKHRpbWVCYXJDb250YWluZXIsIHtcbiAgICAgICAgcG9zaXRpb246ICdyZWxhdGl2ZSdcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoaXNTdHJpbmcoY29udGFpbmVyKSkge1xuICAgICAgICBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChjb250YWluZXIpO1xuICAgICAgfVxuXG4gICAgICB0aW1lQmFyQ29udGFpbmVyID0gY29udGFpbmVyO1xuICAgIH1cblxuICAgIGdyYXBoQ29udGFpbmVyLmFwcGVuZENoaWxkKHRpbWVCYXJDb250YWluZXIpO1xuICAgIHRoaXMuc2V0KCd0aW1lQmFyQ29udGFpbmVyJywgdGltZUJhckNvbnRhaW5lcik7XG4gICAgdmFyIGNhbnZhcztcbiAgICB2YXIgcmVuZGVyZXIgPSBncmFwaC5nZXQoJ3JlbmRlcmVyJyk7XG5cbiAgICBpZiAocmVuZGVyZXIgPT09ICdTVkcnKSB7XG4gICAgICBjYW52YXMgPSBuZXcgR1NWR0NhbnZhcyh7XG4gICAgICAgIGNvbnRhaW5lcjogdGltZUJhckNvbnRhaW5lcixcbiAgICAgICAgd2lkdGg6IHdpZHRoLFxuICAgICAgICBoZWlnaHQ6IGhlaWdodFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNhbnZhcyA9IG5ldyBHQ2FudmFzKHtcbiAgICAgICAgY29udGFpbmVyOiB0aW1lQmFyQ29udGFpbmVyLFxuICAgICAgICB3aWR0aDogd2lkdGgsXG4gICAgICAgIGhlaWdodDogaGVpZ2h0XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLnNldCgnY2FudmFzJywgY2FudmFzKTtcbiAgfTtcblxuICBUaW1lQmFyLnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuaW5pdENvbnRhaW5lcigpO1xuICAgIHZhciBjYW52YXMgPSB0aGlzLmdldCgnY2FudmFzJyk7XG4gICAgdmFyIHRpbWVCYXJHcm91cCA9IGNhbnZhcy5hZGRHcm91cCh7XG4gICAgICBuYW1lOiAndGltZWJhci1ncm91cCdcbiAgICB9KTtcbiAgICB0aGlzLnNldCgndGltZUJhckdyb3VwJywgdGltZUJhckdyb3VwKTtcbiAgICB0aGlzLnJlbmRlclRyZW5kKCk7XG4gICAgdGhpcy5pbml0RXZlbnQoKTtcbiAgICB2YXIgZm9udEZhbWlseSA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuYm9keSwgbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZSgnZm9udC1mYW1pbHknKSB8fCAnQXJpYWwsIHNhbnMtc2VyaWYnIDogJ0FyaWFsLCBzYW5zLXNlcmlmJztcbiAgICB0aGlzLnNldCgnZm9udEZhbWlseScsIGZvbnRGYW1pbHkpO1xuICB9O1xuXG4gIFRpbWVCYXIucHJvdG90eXBlLnJlbmRlclRyZW5kID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBfYSA9IHRoaXMuX2NmZ3MsXG4gICAgICAgIHdpZHRoID0gX2Eud2lkdGgsXG4gICAgICAgIHggPSBfYS54LFxuICAgICAgICB5ID0gX2EueSxcbiAgICAgICAgcGFkZGluZyA9IF9hLnBhZGRpbmcsXG4gICAgICAgIHR5cGUgPSBfYS50eXBlLFxuICAgICAgICB0cmVuZCA9IF9hLnRyZW5kLFxuICAgICAgICBzbGlkZXIgPSBfYS5zbGlkZXIsXG4gICAgICAgIGNvbnRyb2xsZXJDZmcgPSBfYS5jb250cm9sbGVyQ2ZnLFxuICAgICAgICB0ZXh0U3R5bGUgPSBfYS50ZXh0U3R5bGUsXG4gICAgICAgIHRpY2sgPSBfYS50aWNrLFxuICAgICAgICBiYWNrZ3JvdW5kU3R5bGUgPSBfYS5iYWNrZ3JvdW5kU3R5bGUsXG4gICAgICAgIGZvcmVncm91bmRTdHlsZSA9IF9hLmZvcmVncm91bmRTdHlsZTtcblxuICAgIHZhciBkYXRhID0gdHJlbmQuZGF0YSxcbiAgICAgICAgb3RoZXIgPSBfX3Jlc3QodHJlbmQsIFtcImRhdGFcIl0pO1xuXG4gICAgdmFyIHJlYWxXaWR0aCA9IHdpZHRoIC0gMiAqIHBhZGRpbmc7XG4gICAgdmFyIGRlZmF1bHRIZWlnaHQgPSB0eXBlID09PSAndHJlbmQnID8gREVGQVVMVF9UUkVORF9IRUlHSFQgOiBERUZBVUxUX1NJTVBMRV9IRUlHSFQ7XG4gICAgdmFyIGdyYXBoID0gdGhpcy5nZXQoJ2dyYXBoJyk7XG4gICAgdmFyIGdyb3VwID0gdGhpcy5nZXQoJ3RpbWVCYXJHcm91cCcpO1xuICAgIHZhciBjYW52YXMgPSB0aGlzLmdldCgnY2FudmFzJyk7XG4gICAgdmFyIHRpbWViYXIgPSBudWxsO1xuXG4gICAgaWYgKHR5cGUgPT09ICd0cmVuZCcgfHwgdHlwZSA9PT0gJ3NpbXBsZScpIHtcbiAgICAgIHRpbWViYXIgPSBuZXcgVHJlbmRUaW1lQmFyKF9fYXNzaWduKF9fYXNzaWduKHtcbiAgICAgICAgZ3JhcGg6IGdyYXBoLFxuICAgICAgICBjYW52YXM6IGNhbnZhcyxcbiAgICAgICAgZ3JvdXA6IGdyb3VwLFxuICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICB4OiB4ICsgcGFkZGluZyxcbiAgICAgICAgeTogdHlwZSA9PT0gJ3RyZW5kJyA/IHkgKyBwYWRkaW5nIDogeSArIHBhZGRpbmcgKyAxNSxcbiAgICAgICAgd2lkdGg6IHJlYWxXaWR0aCxcbiAgICAgICAgaGVpZ2h0OiBkZWZhdWx0SGVpZ2h0LFxuICAgICAgICBwYWRkaW5nOiBwYWRkaW5nLFxuICAgICAgICBiYWNrZ3JvdW5kU3R5bGU6IGJhY2tncm91bmRTdHlsZSxcbiAgICAgICAgZm9yZWdyb3VuZFN0eWxlOiBmb3JlZ3JvdW5kU3R5bGUsXG4gICAgICAgIHRyZW5kQ2ZnOiBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgb3RoZXIpLCB7XG4gICAgICAgICAgZGF0YTogZGF0YS5tYXAoZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgICAgIHJldHVybiBkLnZhbHVlO1xuICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgICB9LCBzbGlkZXIpLCB7XG4gICAgICAgIHRpY2s6IHtcbiAgICAgICAgICB0aWNrczogZGF0YSxcbiAgICAgICAgICB0aWNrTGFiZWxGb3JtYXR0ZXI6IHRpY2sudGlja0xhYmVsRm9ybWF0dGVyLFxuICAgICAgICAgIHRpY2tMYWJlbFN0eWxlOiB0aWNrLnRpY2tMYWJlbFN0eWxlLFxuICAgICAgICAgIHRpY2tMaW5lU3R5bGU6IHRpY2sudGlja0xpbmVTdHlsZVxuICAgICAgICB9LFxuICAgICAgICBoYW5kbGVyU3R5bGU6IF9fYXNzaWduKF9fYXNzaWduKHt9LCBzbGlkZXIuaGFuZGxlclN0eWxlKSwge1xuICAgICAgICAgIGhlaWdodDogc2xpZGVyLmhlaWdodCB8fCBkZWZhdWx0SGVpZ2h0XG4gICAgICAgIH0pLFxuICAgICAgICBjb250cm9sbGVyQ2ZnOiBjb250cm9sbGVyQ2ZnLFxuICAgICAgICB0ZXh0U3R5bGU6IHRleHRTdHlsZVxuICAgICAgfSkpO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3RpY2snKSB7XG4gICAgICAvLyDliLvluqbml7bpl7TovbRcbiAgICAgIHRpbWViYXIgPSBuZXcgVGltZUJhclNsaWNlKF9fYXNzaWduKHtcbiAgICAgICAgZ3JhcGg6IGdyYXBoLFxuICAgICAgICBjYW52YXM6IGNhbnZhcyxcbiAgICAgICAgZ3JvdXA6IGdyb3VwLFxuICAgICAgICB4OiB4ICsgcGFkZGluZyxcbiAgICAgICAgeTogeSArIHBhZGRpbmdcbiAgICAgIH0sIHRpY2spKTtcbiAgICB9XG5cbiAgICB0aGlzLnNldCgndGltZWJhcicsIHRpbWViYXIpO1xuICB9O1xuXG4gIFRpbWVCYXIucHJvdG90eXBlLmZpbHRlckRhdGEgPSBmdW5jdGlvbiAoZXZ0KSB7XG4gICAgdmFyIF9hO1xuXG4gICAgdmFyIHZhbHVlID0gZXZ0LnZhbHVlO1xuICAgIHZhciB0cmVuZERhdGEgPSBudWxsO1xuICAgIHZhciB0eXBlID0gdGhpcy5fY2Zncy50eXBlO1xuXG4gICAgaWYgKHR5cGUgPT09ICd0cmVuZCcgfHwgdHlwZSA9PT0gJ3NpbXBsZScpIHtcbiAgICAgIHRyZW5kRGF0YSA9IHRoaXMuX2NmZ3MudHJlbmQuZGF0YTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICd0aWNrJykge1xuICAgICAgdHJlbmREYXRhID0gdGhpcy5fY2Zncy50aWNrLmRhdGE7XG4gICAgfVxuXG4gICAgaWYgKCF0cmVuZERhdGEgfHwgdHJlbmREYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc29sZS53YXJuKCfor7fphY3nva4gVGltZUJhciDnu4Tku7bnmoTmlbDmja4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgcmFuZ2VDaGFuZ2UgPSB0aGlzLmdldCgncmFuZ2VDaGFuZ2UnKTtcbiAgICB2YXIgZ3JhcGggPSB0aGlzLmdldCgnZ3JhcGgnKTtcbiAgICB2YXIgbWluID0gTWF0aC5yb3VuZCh0cmVuZERhdGEubGVuZ3RoICogdmFsdWVbMF0pO1xuICAgIHZhciBtYXggPSBNYXRoLnJvdW5kKHRyZW5kRGF0YS5sZW5ndGggKiB2YWx1ZVsxXSk7XG4gICAgbWF4ID0gbWF4ID49IHRyZW5kRGF0YS5sZW5ndGggPyB0cmVuZERhdGEubGVuZ3RoIC0gMSA6IG1heDtcbiAgICBtaW4gPSBtaW4gPj0gdHJlbmREYXRhLmxlbmd0aCA/IHRyZW5kRGF0YS5sZW5ndGggLSAxIDogbWluO1xuICAgIHZhciB0aWNrTGFiZWxGb3JtYXR0ZXIgPSAoX2EgPSB0aGlzLl9jZmdzLnRpY2spID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS50aWNrTGFiZWxGb3JtYXR0ZXI7XG4gICAgdmFyIG1pblRleHQgPSB0aWNrTGFiZWxGb3JtYXR0ZXIgPyB0aWNrTGFiZWxGb3JtYXR0ZXIodHJlbmREYXRhW21pbl0pIDogdHJlbmREYXRhW21pbl0uZGF0ZTtcbiAgICB2YXIgbWF4VGV4dCA9IHRpY2tMYWJlbEZvcm1hdHRlciA/IHRpY2tMYWJlbEZvcm1hdHRlcih0cmVuZERhdGFbbWF4XSkgOiB0cmVuZERhdGFbbWF4XS5kYXRlO1xuXG4gICAgaWYgKHR5cGUgIT09ICd0aWNrJykge1xuICAgICAgdmFyIHRpbWViYXIgPSB0aGlzLmdldCgndGltZWJhcicpO1xuICAgICAgdGltZWJhci5zZXRUZXh0KG1pblRleHQsIG1heFRleHQpO1xuICAgIH1cblxuICAgIGlmIChyYW5nZUNoYW5nZSkge1xuICAgICAgcmFuZ2VDaGFuZ2UoZ3JhcGgsIG1pblRleHQsIG1heFRleHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyDoh6rliqjov4fmu6TmlbDmja7vvIzlubbmuLLmn5MgZ3JhcGhcbiAgICAgIGlmICghdGhpcy5jYWNoZUdyYXBoRGF0YSB8fCB0aGlzLmNhY2hlR3JhcGhEYXRhLm5vZGVzICYmIHRoaXMuY2FjaGVHcmFwaERhdGEubm9kZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRoaXMuY2FjaGVHcmFwaERhdGEgPSBncmFwaC5nZXQoJ2RhdGEnKTsgLy8gZ3JhcGguc2F2ZSgpIGFzIEdyYXBoRGF0YTtcbiAgICAgIH0gLy8g6L+H5ruk5LiN5ZyoIG1pbiDlkowgbWF4IOiMg+WbtOWGheeahOiKgueCuVxuXG5cbiAgICAgIHZhciBmaWx0ZXJEYXRhID0gdGhpcy5jYWNoZUdyYXBoRGF0YS5ub2Rlcy5maWx0ZXIoZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgcmV0dXJuIGQuZGF0ZSA+PSB0cmVuZERhdGFbbWluXS5kYXRlICYmIGQuZGF0ZSA8PSB0cmVuZERhdGFbbWF4XS5kYXRlO1xuICAgICAgfSk7XG4gICAgICB2YXIgbm9kZUlkc18xID0gZmlsdGVyRGF0YS5tYXAoZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUuaWQ7XG4gICAgICB9KTtcbiAgICAgIHZhciBmaWxldGVyRWRnZXMgPSBbXTtcblxuICAgICAgaWYgKHRoaXMuY2FjaGVHcmFwaERhdGEuZWRnZXMpIHtcbiAgICAgICAgLy8g6L+H5rukIHNvdXJjZSDmiJYgdGFyZ2V0IOS4jeWcqCBtaW4g5ZKMIG1heCDojIPlm7TlhoXnmoTovrlcbiAgICAgICAgZmlsZXRlckVkZ2VzID0gdGhpcy5jYWNoZUdyYXBoRGF0YS5lZGdlcy5maWx0ZXIoZnVuY3Rpb24gKGVkZ2UpIHtcbiAgICAgICAgICByZXR1cm4gbm9kZUlkc18xLmluY2x1ZGVzKGVkZ2Uuc291cmNlKSAmJiBub2RlSWRzXzEuaW5jbHVkZXMoZWRnZS50YXJnZXQpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAodGhpcy5nZXQoJ2ZpbHRlckVkZ2UnKSkge1xuICAgICAgICAgIGZpbGV0ZXJFZGdlcyA9IGZpbGV0ZXJFZGdlcy5maWx0ZXIoZnVuY3Rpb24gKGVkZ2UpIHtcbiAgICAgICAgICAgIHJldHVybiBlZGdlLmRhdGUgPj0gdHJlbmREYXRhW21pbl0uZGF0ZSAmJiBlZGdlLmRhdGUgPD0gdHJlbmREYXRhW21heF0uZGF0ZTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBncmFwaC5jaGFuZ2VEYXRhKHtcbiAgICAgICAgbm9kZXM6IGZpbHRlckRhdGEsXG4gICAgICAgIGVkZ2VzOiBmaWxldGVyRWRnZXNcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICBUaW1lQmFyLnByb3RvdHlwZS5pbml0RXZlbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHZhciBzdGFydCA9IDA7XG4gICAgdmFyIGVuZCA9IDA7XG4gICAgdmFyIHR5cGUgPSB0aGlzLl9jZmdzLnR5cGU7XG5cbiAgICBpZiAoIXR5cGUgfHwgdHlwZSA9PT0gJ3RyZW5kJyB8fCB0eXBlID09PSAnc2ltcGxlJykge1xuICAgICAgc3RhcnQgPSB0aGlzLl9jZmdzLnNsaWRlci5zdGFydDtcbiAgICAgIGVuZCA9IHRoaXMuX2NmZ3Muc2xpZGVyLmVuZDtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICd0aWNrJykge1xuICAgICAgc3RhcnQgPSB0aGlzLl9jZmdzLnRpY2suc3RhcnQ7XG4gICAgICBlbmQgPSB0aGlzLl9jZmdzLnRpY2suZW5kO1xuICAgIH1cblxuICAgIHZhciBncmFwaCA9IHRoaXMuZ2V0KCdncmFwaCcpO1xuICAgIGdyYXBoLm9uKCdhZnRlcnJlbmRlcicsIGZ1bmN0aW9uIChlKSB7XG4gICAgICBfdGhpcy5maWx0ZXJEYXRhKHtcbiAgICAgICAgdmFsdWU6IFtzdGFydCwgZW5kXVxuICAgICAgfSk7XG4gICAgfSk7IC8vIOaXtumXtOi9tOeahOWAvOWPkeeUn+aUueWPmOeahOS6i+S7tlxuXG4gICAgZ3JhcGgub24oVkFMVUVfQ0hBTkdFLCB0aHJvdHRsZShmdW5jdGlvbiAoZSkge1xuICAgICAgX3RoaXMuZmlsdGVyRGF0YShlKTtcbiAgICB9LCAyMDAsIHtcbiAgICAgIHRyYWlsaW5nOiB0cnVlLFxuICAgICAgbGVhZGluZzogdHJ1ZVxuICAgIH0pKTtcbiAgfTtcblxuICBUaW1lQmFyLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciB0aW1lYmFyID0gdGhpcy5nZXQoJ3RpbWViYXInKTtcblxuICAgIGlmICh0aW1lYmFyICYmIHRpbWViYXIuZGVzdG9yeSkge1xuICAgICAgdGltZWJhci5kZXN0b3J5KCk7XG4gICAgfVxuXG4gICAgX3N1cGVyLnByb3RvdHlwZS5kZXN0cm95LmNhbGwodGhpcyk7XG5cbiAgICB2YXIgdGltZUJhckNvbnRhaW5lciA9IHRoaXMuZ2V0KCd0aW1lQmFyQ29udGFpbmVyJyk7XG5cbiAgICBpZiAodGltZUJhckNvbnRhaW5lcikge1xuICAgICAgdmFyIGNvbnRhaW5lciA9IHRoaXMuZ2V0KCdjb250YWluZXInKTtcblxuICAgICAgaWYgKCFjb250YWluZXIpIHtcbiAgICAgICAgY29udGFpbmVyID0gdGhpcy5nZXQoJ2dyYXBoJykuZ2V0KCdjb250YWluZXInKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzU3RyaW5nKGNvbnRhaW5lcikpIHtcbiAgICAgICAgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoY29udGFpbmVyKTtcbiAgICAgIH1cblxuICAgICAgY29udGFpbmVyLnJlbW92ZUNoaWxkKHRpbWVCYXJDb250YWluZXIpO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gVGltZUJhcjtcbn0oQmFzZSk7XG5cbmV4cG9ydCBkZWZhdWx0IFRpbWVCYXI7IiwidmFyIF9fZXh0ZW5kcyA9IHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMgfHwgZnVuY3Rpb24gKCkge1xuICB2YXIgX2V4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbiBleHRlbmRTdGF0aWNzKGQsIGIpIHtcbiAgICBfZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCB7XG4gICAgICBfX3Byb3RvX186IFtdXG4gICAgfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICBkLl9fcHJvdG9fXyA9IGI7XG4gICAgfSB8fCBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgZm9yICh2YXIgcCBpbiBiKSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdO1xuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gX2V4dGVuZFN0YXRpY3MoZCwgYik7XG4gIH07XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgaWYgKHR5cGVvZiBiICE9PSBcImZ1bmN0aW9uXCIgJiYgYiAhPT0gbnVsbCkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNsYXNzIGV4dGVuZHMgdmFsdWUgXCIgKyBTdHJpbmcoYikgKyBcIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsXCIpO1xuXG4gICAgX2V4dGVuZFN0YXRpY3MoZCwgYik7XG5cbiAgICBmdW5jdGlvbiBfXygpIHtcbiAgICAgIHRoaXMuY29uc3RydWN0b3IgPSBkO1xuICAgIH1cblxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgfTtcbn0oKTtcblxuaW1wb3J0IEJhc2UgZnJvbSAnLi4vYmFzZSc7XG5pbXBvcnQgeyBpc1N0cmluZywgaXNOaWwgfSBmcm9tICdAYW50di91dGlsJztcbmltcG9ydCB7IG1vZGlmeUNTUywgY3JlYXRlRG9tIH0gZnJvbSAnQGFudHYvZG9tLXV0aWwnO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJ0BhbnR2L2c2LWNvcmUnO1xuaW1wb3J0IHsgbWF0MyB9IGZyb20gJ0BhbnR2L21hdHJpeC11dGlsJztcbnZhciBhcHBseU1hdHJpeCA9IFV0aWwuYXBwbHlNYXRyaXg7XG5cbmZ1bmN0aW9uIGdldEltZ05hdHVyYWxEaW1lbnNpb24oaW1nLCBjYWxsYmFjaykge1xuICB2YXIgbldpZHRoLCBuSGVpZ2h0O1xuXG4gIGlmIChpbWcubmF0dXJhbFdpZHRoKSB7XG4gICAgLy8g546w5Luj5rWP6KeI5ZmoXG4gICAgbldpZHRoID0gaW1nLm5hdHVyYWxXaWR0aDtcbiAgICBuSGVpZ2h0ID0gaW1nLm5hdHVyYWxIZWlnaHQ7XG4gIH0gZWxzZSB7XG4gICAgLy8gSUU2LzcvOFxuICAgIHZhciBpbWFnZV8xID0gbmV3IEltYWdlKCk7XG4gICAgaW1hZ2VfMS5zcmMgPSBpbWcuc3JjO1xuXG4gICAgaW1hZ2VfMS5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoY2FsbGJhY2spIGNhbGxiYWNrKGltYWdlXzEud2lkdGgsIGltYWdlXzEuaGVpZ2h0KTtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIFtuV2lkdGgsIG5IZWlnaHRdO1xufVxuXG52YXIgSW1hZ2VNaW5pTWFwID1cbi8qKiBAY2xhc3MgKi9cbmZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgX19leHRlbmRzKEltYWdlTWluaU1hcCwgX3N1cGVyKTtcblxuICBmdW5jdGlvbiBJbWFnZU1pbmlNYXAoY29uZmlnKSB7XG4gICAgcmV0dXJuIF9zdXBlci5jYWxsKHRoaXMsIGNvbmZpZykgfHwgdGhpcztcbiAgfVxuXG4gIEltYWdlTWluaU1hcC5wcm90b3R5cGUuZ2V0RGVmYXVsdENmZ3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgIGNsYXNzTmFtZTogJ2c2LW1pbmltYXAnLFxuICAgICAgdmlld3BvcnRDbGFzc05hbWU6ICdnNi1taW5pbWFwLXZpZXdwb3J0JyxcbiAgICAgIHdpZHRoOiAyMDAsXG4gICAgICBkZWxlZ2F0ZVN0eWxlOiB7XG4gICAgICAgIGZpbGw6ICcjNDBhOWZmJyxcbiAgICAgICAgc3Ryb2tlOiAnIzA5NmRkOSdcbiAgICAgIH0sXG4gICAgICByZWZyZXNoOiB0cnVlXG4gICAgfTtcbiAgfTtcblxuICBJbWFnZU1pbmlNYXAucHJvdG90eXBlLmdldEV2ZW50cyA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgYmVmb3JlcGFpbnQ6ICd1cGRhdGVWaWV3cG9ydCcsXG4gICAgICBiZWZvcmVhbmltYXRlOiAnZGlzYWJsZVJlZnJlc2gnLFxuICAgICAgYWZ0ZXJhbmltYXRlOiAnZW5hYmxlUmVmcmVzaCcsXG4gICAgICB2aWV3cG9ydGNoYW5nZTogJ2Rpc2FibGVPbmVSZWZyZXNoJ1xuICAgIH07XG4gIH07IC8vIOiLpeaYr+ato+WcqOi/m+ihjOWKqOeUu++8jOS4jeWIt+aWsOe8qeeVpeWbvlxuXG5cbiAgSW1hZ2VNaW5pTWFwLnByb3RvdHlwZS5kaXNhYmxlUmVmcmVzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLnNldCgncmVmcmVzaCcsIGZhbHNlKTtcbiAgfTtcblxuICBJbWFnZU1pbmlNYXAucHJvdG90eXBlLmVuYWJsZVJlZnJlc2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5zZXQoJ3JlZnJlc2gnLCB0cnVlKTtcbiAgICB0aGlzLnVwZGF0ZUNhbnZhcygpO1xuICB9O1xuXG4gIEltYWdlTWluaU1hcC5wcm90b3R5cGUuZGlzYWJsZU9uZVJlZnJlc2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5zZXQoJ3ZpZXdwb3J0Q2hhbmdlJywgdHJ1ZSk7XG4gIH07XG5cbiAgSW1hZ2VNaW5pTWFwLnByb3RvdHlwZS5pbml0Vmlld3BvcnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHZhciBjZmdzID0gdGhpcy5fY2ZnczsgLy8gY1dpZHRoIGFuZCBjSGVpZ2h0IGFyZSB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgbWluaW1hcCdzIGNvbnRhaW5lclxuXG4gICAgdmFyIGdyYXBoID0gY2Zncy5ncmFwaDtcbiAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHJldHVybjtcbiAgICB2YXIgY29udGFpbmVyRE9NID0gdGhpcy5nZXQoJ2NvbnRhaW5lcicpO1xuXG4gICAgaWYgKGlzU3RyaW5nKGNvbnRhaW5lckRPTSkpIHtcbiAgICAgIGNvbnRhaW5lckRPTSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGNvbnRhaW5lckRPTSk7XG4gICAgfVxuXG4gICAgdmFyIHZpZXdwb3J0ID0gY3JlYXRlRG9tKFwiPGRpdiBjbGFzcz1cIiArIGNmZ3Mudmlld3BvcnRDbGFzc05hbWUgKyBcIlxcbiAgICAgIHN0eWxlPSdwb3NpdGlvbjphYnNvbHV0ZTtcXG4gICAgICAgIGxlZnQ6MDtcXG4gICAgICAgIHRvcDowO1xcbiAgICAgICAgYm94LXNpemluZzpib3JkZXItYm94O1xcbiAgICAgICAgYm9yZGVyOiAycHggc29saWQgIzE5ODBmZic+XFxuICAgICAgPC9kaXY+XCIpOyAvLyDorqHnrpfmi5bmi73msLTlubPmlrnlkJHot53nprtcblxuICAgIHZhciB4ID0gMDsgLy8g6K6h566X5ouW5ou95Z6C55u05pa55ZCR6Led56a7XG5cbiAgICB2YXIgeSA9IDA7IC8vIOaYr+WQpuWcqOaLluaLvW1pbmltYXDnmoTop4blj6NcblxuICAgIHZhciBkcmFnZ2luZyA9IGZhbHNlOyAvLyDnvJPlrZh2aWV3cG9ydOW9k+WJjeWvueS6jueUu+W4g+eahHhcblxuICAgIHZhciBsZWZ0ID0gMDsgLy8g57yT5a2Ydmlld3BvcnTlvZPliY3lr7nkuo7nlLvluIPnmoR5XG5cbiAgICB2YXIgdG9wID0gMDsgLy8g57yT5a2Ydmlld3BvcnTlvZPliY3lrr3luqZcblxuICAgIHZhciB3aWR0aCA9IDA7IC8vIOe8k+WtmHZpZXdwb3J05b2T5YmN6auY5bqmXG5cbiAgICB2YXIgaGVpZ2h0ID0gMDtcbiAgICB2YXIgcmF0aW8gPSAwO1xuICAgIHZhciB6b29tID0gMDtcbiAgICBjb250YWluZXJET00uYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgIGNmZ3MucmVmcmVzaCA9IGZhbHNlO1xuXG4gICAgICBpZiAoZS50YXJnZXQgIT09IHZpZXdwb3J0KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gLy8g5aaC5p6c6KeG5Y+j5bey57uP5pyA5aSn5LqG77yM5LiN6ZyA6KaB5ouW5ou9XG5cblxuICAgICAgdmFyIHN0eWxlID0gdmlld3BvcnQuc3R5bGU7XG4gICAgICB3aWR0aCA9IHBhcnNlSW50KHN0eWxlLndpZHRoLCAxMCk7XG4gICAgICBoZWlnaHQgPSBwYXJzZUludChzdHlsZS5oZWlnaHQsIDEwKTtcblxuICAgICAgdmFyIGNXaWR0aCA9IF90aGlzLmdldCgnd2lkdGgnKTtcblxuICAgICAgdmFyIGNIZWlnaHQgPSBfdGhpcy5nZXQoJ2hlaWdodCcpO1xuXG4gICAgICBpZiAod2lkdGggPiBjV2lkdGggfHwgaGVpZ2h0ID4gY0hlaWdodCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHpvb20gPSBncmFwaC5nZXRab29tKCk7XG4gICAgICByYXRpbyA9IF90aGlzLmdldCgncmF0aW8nKTtcbiAgICAgIGRyYWdnaW5nID0gdHJ1ZTtcbiAgICAgIHggPSBlLmNsaWVudFg7XG4gICAgICB5ID0gZS5jbGllbnRZO1xuICAgIH0sIGZhbHNlKTtcbiAgICBjb250YWluZXJET00uYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgIGlmICghZHJhZ2dpbmcgfHwgaXNOaWwoZS5jbGllbnRYKSB8fCBpc05pbChlLmNsaWVudFkpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIGNXaWR0aCA9IF90aGlzLmdldCgnd2lkdGgnKTtcblxuICAgICAgdmFyIGNIZWlnaHQgPSBfdGhpcy5nZXQoJ2hlaWdodCcpO1xuXG4gICAgICB2YXIgc3R5bGUgPSB2aWV3cG9ydC5zdHlsZTtcbiAgICAgIGxlZnQgPSBwYXJzZUludChzdHlsZS5sZWZ0LCAxMCk7XG4gICAgICB0b3AgPSBwYXJzZUludChzdHlsZS50b3AsIDEwKTtcbiAgICAgIHdpZHRoID0gcGFyc2VJbnQoc3R5bGUud2lkdGgsIDEwKTtcbiAgICAgIGhlaWdodCA9IHBhcnNlSW50KHN0eWxlLmhlaWdodCwgMTApO1xuICAgICAgdmFyIGR4ID0geCAtIGUuY2xpZW50WDtcbiAgICAgIHZhciBkeSA9IHkgLSBlLmNsaWVudFk7IC8vIOiLpeinhuWPo+enu+WKqOWIsOacgOW3pui+ueaIluacgOWPs+i+ueS6hizku4Xnp7vliqjliLDovrnnlYxcblxuICAgICAgaWYgKGxlZnQgLSBkeCA8IDApIHtcbiAgICAgICAgZHggPSBsZWZ0O1xuICAgICAgfSBlbHNlIGlmIChsZWZ0IC0gZHggKyB3aWR0aCA+PSBjV2lkdGgpIHtcbiAgICAgICAgZHggPSAwO1xuICAgICAgfSAvLyDoi6Xop4blj6Pnp7vliqjliLDmnIDkuIrmiJbmnIDkuIvovrnkuobvvIzku4Xnp7vliqjliLDovrnnlYxcblxuXG4gICAgICBpZiAodG9wIC0gZHkgPCAwKSB7XG4gICAgICAgIGR5ID0gdG9wO1xuICAgICAgfSBlbHNlIGlmICh0b3AgLSBkeSArIGhlaWdodCA+PSBjSGVpZ2h0KSB7XG4gICAgICAgIGR5ID0gMDtcbiAgICAgIH1cblxuICAgICAgbGVmdCAtPSBkeDtcbiAgICAgIHRvcCAtPSBkeTsgLy8g5YWI56e75Yqo6KeG5Y+j77yM6YG/5YWN56e75Yqo5Yiw6L655LiK5Lul5ZCO5Ye6546w6KeG5Y+j6Zeq54OBXG5cbiAgICAgIG1vZGlmeUNTUyh2aWV3cG9ydCwge1xuICAgICAgICBsZWZ0OiBsZWZ0ICsgXCJweFwiLFxuICAgICAgICB0b3A6IHRvcCArIFwicHhcIlxuICAgICAgfSk7IC8vIGdyYXBoIOenu+WKqOmcgOimgeWBj+enu+mHjyBkeC9keSAqIOe8qeaUvuavlOS+i+aJjeS8muW+l+WIsOato+ehrueahOenu+WKqOi3neemu1xuXG4gICAgICBncmFwaC50cmFuc2xhdGUoZHggKiB6b29tIC8gcmF0aW8sIGR5ICogem9vbSAvIHJhdGlvKTtcbiAgICAgIHggPSBlLmNsaWVudFg7XG4gICAgICB5ID0gZS5jbGllbnRZO1xuICAgIH0sIGZhbHNlKTtcbiAgICBjb250YWluZXJET00uYWRkRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGRyYWdnaW5nID0gZmFsc2U7XG4gICAgICBjZmdzLnJlZnJlc2ggPSB0cnVlO1xuICAgIH0sIGZhbHNlKTtcbiAgICBjb250YWluZXJET00uYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGRyYWdnaW5nID0gZmFsc2U7XG4gICAgICBjZmdzLnJlZnJlc2ggPSB0cnVlO1xuICAgIH0sIGZhbHNlKTtcbiAgICB0aGlzLnNldCgndmlld3BvcnQnLCB2aWV3cG9ydCk7XG4gICAgY29udGFpbmVyRE9NLmFwcGVuZENoaWxkKHZpZXdwb3J0KTtcbiAgfTtcbiAgLyoqXG4gICAqIOabtOaWsCB2aWV3cG9ydCDop4blm75cbiAgICovXG5cblxuICBJbWFnZU1pbmlNYXAucHJvdG90eXBlLnVwZGF0ZVZpZXdwb3J0ID0gZnVuY3Rpb24gKCkge1xuICAgIGlmICh0aGlzLmRlc3Ryb3llZCkgcmV0dXJuO1xuICAgIHZhciByYXRpbyA9IHRoaXMuZ2V0KCdyYXRpbycpO1xuICAgIHZhciBjV2lkdGggPSB0aGlzLmdldCgnd2lkdGgnKTtcbiAgICB2YXIgY0hlaWdodCA9IHRoaXMuZ2V0KCdoZWlnaHQnKTtcbiAgICB2YXIgZ3JhcGggPSB0aGlzLmdldCgnZ3JhcGgnKTtcbiAgICB2YXIgZ3JhcGhXaWR0aCA9IGdyYXBoLmdldCgnd2lkdGgnKTtcbiAgICB2YXIgZ3JhcGhIZWlnaHQgPSBncmFwaC5nZXQoJ2hlaWdodCcpO1xuICAgIHZhciBhc3BlY3RSYXRpbyA9IGdyYXBoV2lkdGggLyBncmFwaEhlaWdodDtcbiAgICB2YXIgZ3JhcGhHcm91cCA9IGdyYXBoLmdldEdyb3VwKCk7IC8vIOS4u+WbvueahCBiYm9477yI55+p6Zi15Y+Y5o2i55u45YWz55qEIGJib3jvvIlcblxuICAgIHZhciBncmFwaENhbnZhc0JCb3ggPSBncmFwaEdyb3VwLmdldENhbnZhc0JCb3goKTsgLy8g5omp5bGVIGdyYXBoQkJveCDliLDlkowgZ3JhcGhXaWR0aCAvIGdyYXBoSGVpZ2h0IOetieavlFxuXG4gICAgdmFyIGdyYXBoQ2FudmFzQkJveE1lYW4gPSBbKGdyYXBoQ2FudmFzQkJveC5taW5YICsgZ3JhcGhDYW52YXNCQm94Lm1heFgpIC8gMiwgKGdyYXBoQ2FudmFzQkJveC5taW5ZICsgZ3JhcGhDYW52YXNCQm94Lm1heFkpIC8gMl07XG4gICAgdmFyIGdyYXBoQ2FudmFzQkJveFNpemUgPSBbZ3JhcGhDYW52YXNCQm94Lm1heFggLSBncmFwaENhbnZhc0JCb3gubWluWCwgZ3JhcGhDYW52YXNCQm94Lm1heFkgLSBncmFwaENhbnZhc0JCb3gubWluWV07XG4gICAgdmFyIGV4cGFuZGVkR3JhcGhDYW52YXNCQm94ID0ge1xuICAgICAgY2VudGVyWDogZ3JhcGhDYW52YXNCQm94TWVhblswXSxcbiAgICAgIGNlbnRlclk6IGdyYXBoQ2FudmFzQkJveE1lYW5bMV0sXG4gICAgICB3aWR0aDogMCxcbiAgICAgIGhlaWdodDogMCxcbiAgICAgIG1pblg6IDAsXG4gICAgICBtaW5ZOiAwXG4gICAgfTtcblxuICAgIGlmIChncmFwaENhbnZhc0JCb3hbMF0gLyBncmFwaENhbnZhc0JCb3hbMV0gPiBhc3BlY3RSYXRpbykge1xuICAgICAgZXhwYW5kZWRHcmFwaENhbnZhc0JCb3gud2lkdGggPSBncmFwaENhbnZhc0JCb3hTaXplWzBdO1xuICAgICAgZXhwYW5kZWRHcmFwaENhbnZhc0JCb3guaGVpZ2h0ID0gZXhwYW5kZWRHcmFwaENhbnZhc0JCb3gud2lkdGggLyBhc3BlY3RSYXRpbztcbiAgICB9IGVsc2Uge1xuICAgICAgZXhwYW5kZWRHcmFwaENhbnZhc0JCb3guaGVpZ2h0ID0gZ3JhcGhDYW52YXNCQm94U2l6ZVsxXTtcbiAgICAgIGV4cGFuZGVkR3JhcGhDYW52YXNCQm94LndpZHRoID0gZXhwYW5kZWRHcmFwaENhbnZhc0JCb3guaGVpZ2h0ICogYXNwZWN0UmF0aW87XG4gICAgfVxuXG4gICAgZXhwYW5kZWRHcmFwaENhbnZhc0JCb3gubWluWCA9IGdyYXBoQ2FudmFzQkJveE1lYW5bMF0gLSBleHBhbmRlZEdyYXBoQ2FudmFzQkJveC53aWR0aCAvIDI7XG4gICAgZXhwYW5kZWRHcmFwaENhbnZhc0JCb3gubWluWSA9IGdyYXBoQ2FudmFzQkJveE1lYW5bMV0gLSBleHBhbmRlZEdyYXBoQ2FudmFzQkJveC5oZWlnaHQgLyAyO1xuICAgIHZhciBncmFwaE1hdHJpeCA9IGdyYXBoR3JvdXAuZ2V0TWF0cml4KCk7XG4gICAgaWYgKCFncmFwaE1hdHJpeCkgZ3JhcGhNYXRyaXggPSBbMSwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMV07XG4gICAgdmFyIGludmVydEdyYXBoTWF0cml4ID0gbWF0My5pbnZlcnQoWzEsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDFdLCBncmFwaE1hdHJpeCk7XG4gICAgdmFyIG1pblhZID0gYXBwbHlNYXRyaXgoe1xuICAgICAgeDogZXhwYW5kZWRHcmFwaENhbnZhc0JCb3gubWluWCxcbiAgICAgIHk6IGV4cGFuZGVkR3JhcGhDYW52YXNCQm94Lm1pbllcbiAgICB9LCBpbnZlcnRHcmFwaE1hdHJpeCk7IC8vIOaJqeWxlSBncmFwaEJCb3gg5ZCO55qEIGJib3gg55qE5bem5LiK6KeS5a+55bqU55qEIGNhbnZhcyBjb250YWluZXIg5Z2Q5qCHXG5cbiAgICB2YXIgdG9wTGVmdCA9IGdyYXBoLmdldENhbnZhc0J5UG9pbnQobWluWFkueCwgbWluWFkueSk7XG4gICAgdmFyIHZpZXdwb3J0ID0gdGhpcy5nZXQoJ3ZpZXdwb3J0Jyk7XG5cbiAgICBpZiAoIXZpZXdwb3J0KSB7XG4gICAgICB0aGlzLmluaXRWaWV3cG9ydCgpO1xuICAgIH0gLy8gVmlld3BvcnQg5LiOIG1pbmltYXAgY29udGFpbmVyIOeahOavlOS+iyA9ICBHcmFwaCBjb250YWluZXIg5LiOIGV4cGFuZGVkR3JhcGhCQm94IOavlOS+i1xuXG5cbiAgICB2YXIgdnBUb01jID0gZ3JhcGhXaWR0aCAvIGV4cGFuZGVkR3JhcGhDYW52YXNCQm94LndpZHRoOyAvLyB2aWV3cG9ydCDlrr3pq5ggPSB2cFRvTWMgKiBtaW5pbWFwIGNvbnRhaW5lciDlrr3pq5hcblxuICAgIHZhciB3aWR0aCA9IHZwVG9NYyAqIGNXaWR0aDtcbiAgICB2YXIgaGVpZ2h0ID0gdnBUb01jICogY0hlaWdodDsgLy8gdmllcnBvcnQg5bem5LiK6KeS5YiwIG1pbmltYXAgY29udGFpbmVyIOeahOi3neemuyAvIG1pbmltYXAgY29udGFpbmVyIOWuvemrmFxuICAgIC8vID0g5Li75Zu+IGV4cGFuZGVkQkJveCDlt6bkuIrop5IgY2FudmFzIGNvbnRhaW5lciDlnZDmoIfot53nprsgLyBleHBhbmRlZEJCb3gg5a696auYXG5cbiAgICB2YXIgbGVmdCA9IGNXaWR0aCAqIC10b3BMZWZ0LnggLyBleHBhbmRlZEdyYXBoQ2FudmFzQkJveC53aWR0aDtcbiAgICB2YXIgdG9wID0gY0hlaWdodCAqIC10b3BMZWZ0LnkgLyBleHBhbmRlZEdyYXBoQ2FudmFzQkJveC5oZWlnaHQ7XG4gICAgdmFyIHJpZ2h0ID0gbGVmdCArIHdpZHRoO1xuICAgIHZhciBib3R0b20gPSB0b3AgKyBoZWlnaHQ7XG5cbiAgICBpZiAobGVmdCA8IDApIHtcbiAgICAgIHdpZHRoICs9IGxlZnQ7XG4gICAgICBsZWZ0ID0gMDtcbiAgICB9XG5cbiAgICBpZiAocmlnaHQgPiBjV2lkdGgpIHtcbiAgICAgIHdpZHRoID0gd2lkdGggLSAocmlnaHQgLSBjV2lkdGgpO1xuICAgIH1cblxuICAgIGlmICh0b3AgPCAwKSB7XG4gICAgICBoZWlnaHQgKz0gdG9wO1xuICAgICAgdG9wID0gMDtcbiAgICB9XG5cbiAgICBpZiAoYm90dG9tID4gY0hlaWdodCkge1xuICAgICAgaGVpZ2h0ID0gaGVpZ2h0IC0gKGJvdHRvbSAtIGNIZWlnaHQpO1xuICAgIH0gLy8g57yT5a2Y55uu5YmN57yp5pS+5q+U77yM5Zyo56e75YqoIG1pbmltYXAg6KeG56qX5pe25bCx5LiN55So5YaN6K6h566X5aSn5Zu+55qE56e75Yqo6YePXG5cblxuICAgIHRoaXMuc2V0KCdyYXRpbycsIHJhdGlvKTtcbiAgICB2YXIgY29ycmVjdExlZnQgPSBsZWZ0ICsgXCJweFwiO1xuICAgIHZhciBjb3JyZWN0VG9wID0gdG9wICsgXCJweFwiO1xuICAgIG1vZGlmeUNTUyh2aWV3cG9ydCwge1xuICAgICAgbGVmdDogY29ycmVjdExlZnQsXG4gICAgICB0b3A6IGNvcnJlY3RUb3AsXG4gICAgICB3aWR0aDogd2lkdGggKyBcInB4XCIsXG4gICAgICBoZWlnaHQ6IGhlaWdodCArIFwicHhcIlxuICAgIH0pO1xuICB9O1xuXG4gIEltYWdlTWluaU1hcC5wcm90b3R5cGUuaW5pdCA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmluaXRDb250YWluZXIoKTtcbiAgfTtcbiAgLyoqXG4gICAqIOWIneWni+WMliBNaW5pbWFwIOeahOWuueWZqFxuICAgKi9cblxuXG4gIEltYWdlTWluaU1hcC5wcm90b3R5cGUuaW5pdENvbnRhaW5lciA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIGdyYXBoID0gc2VsZi5nZXQoJ2dyYXBoJyk7XG4gICAgdmFyIGdyYXBoV2lkdGggPSBncmFwaC5nZXQoJ3dpZHRoJyk7XG4gICAgdmFyIGdyYXBoSGVpZ2h0ID0gZ3JhcGguZ2V0KCdoZWlnaHQnKTtcbiAgICB2YXIgYXNwZWN0UmF0aW8gPSBncmFwaEhlaWdodCAvIGdyYXBoV2lkdGg7XG4gICAgdmFyIGNsYXNzTmFtZSA9IHNlbGYuZ2V0KCdjbGFzc05hbWUnKTtcbiAgICB2YXIgcGFyZW50Tm9kZSA9IHNlbGYuZ2V0KCdjb250YWluZXInKTsgLy8gc2l6ZSBvZiB0aGUgbWluaW1hcCdzIGNvbnRhaW5lclxuXG4gICAgdmFyIGNXaWR0aCA9IHNlbGYuZ2V0KCd3aWR0aCcpO1xuICAgIHZhciBjSGVpZ2h0ID0gc2VsZi5nZXQoJ2hlaWdodCcpO1xuXG4gICAgaWYgKCFjV2lkdGggJiYgIWNIZWlnaHQpIHtcbiAgICAgIGNXaWR0aCA9IDIwMDtcbiAgICB9XG5cbiAgICBpZiAoY1dpZHRoKSB7XG4gICAgICBjSGVpZ2h0ID0gYXNwZWN0UmF0aW8gKiBjV2lkdGg7XG4gICAgICBzZWxmLnNldCgnaGVpZ2h0JywgY0hlaWdodCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNXaWR0aCA9IDEgLyBhc3BlY3RSYXRpbyAqIGNIZWlnaHQ7XG4gICAgICBzZWxmLnNldCgnd2lkdGgnLCBjV2lkdGgpO1xuICAgIH1cblxuICAgIHZhciBjb250YWluZXIgPSBjcmVhdGVEb20oXCI8ZGl2IGNsYXNzPSdcIiArIGNsYXNzTmFtZSArIFwiJyBzdHlsZT0nd2lkdGg6IFwiICsgY1dpZHRoICsgXCJweDsgaGVpZ2h0OiBcIiArIGNIZWlnaHQgKyBcInB4OyBvdmVyZmxvdzogaGlkZGVuOyBwb3NpdGlvbjogcmVsYXRpdmU7Jz48L2Rpdj5cIik7XG5cbiAgICBpZiAoaXNTdHJpbmcocGFyZW50Tm9kZSkpIHtcbiAgICAgIHBhcmVudE5vZGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChwYXJlbnROb2RlKTtcbiAgICB9XG5cbiAgICBpZiAocGFyZW50Tm9kZSkge1xuICAgICAgcGFyZW50Tm9kZS5hcHBlbmRDaGlsZChjb250YWluZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBncmFwaC5nZXQoJ2NvbnRhaW5lcicpLmFwcGVuZENoaWxkKGNvbnRhaW5lcik7XG4gICAgfVxuXG4gICAgc2VsZi5zZXQoJ2NvbnRhaW5lcicsIGNvbnRhaW5lcik7XG4gICAgdmFyIGNvbnRhaW5lckRPTSA9IGNyZWF0ZURvbShcIjxkaXYgY2xhc3M9XFxcImc2LW1pbmltYXAtY29udGFpbmVyXFxcIiBzdHlsZT1cXFwicG9zaXRpb246IHJlbGF0aXZlOyB3aWR0aDogMTAwJTsgaGVpZ2h0OiAxMDAlOyB0ZXh0LWFsaWduOiBjZW50ZXI7IGRpc3BsYXk6IHRhYmxlO1xcXCI+PC9kaXY+XCIpO1xuICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChjb250YWluZXJET00pO1xuICAgIHZhciBzcGFuID0gY3JlYXRlRG9tKFwiPHNwYW4gc3R5bGU9XFxcImRpc3BsYXk6IHRhYmxlLWNlbGw7IHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IFxcXCI+PC9zcGFuPlwiKTtcbiAgICBjb250YWluZXJET00uYXBwZW5kQ2hpbGQoc3Bhbik7XG4gICAgc2VsZi5zZXQoJ2NvbnRhaW5lckRPTScsIGNvbnRhaW5lckRPTSk7XG4gICAgc2VsZi5zZXQoJ2NvbnRhaW5lclNwYW4nLCBzcGFuKTtcbiAgICB2YXIgaW1nID0gY3JlYXRlRG9tKFwiPGltZyBhbHQ9XFxcIlxcXCIgc3JjPVxcXCJcIiArIHRoaXMuZ2V0KCdncmFwaEltZycpICsgXCJcXFwiIHN0eWxlPVxcXCJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHVzZXItc2VsZWN0OiBub25lO1xcXCIgZHJhZ2dhYmxlPVxcXCJmYWxzZVxcXCIgLz5cIik7XG4gICAgc2VsZi5zZXQoJ2ltZ0RPTScsIGltZyk7XG4gICAgc2VsZi51cGRhdGVJbWdTaXplKCk7XG4gICAgc3Bhbi5hcHBlbmRDaGlsZChpbWcpO1xuICAgIHNlbGYudXBkYXRlQ2FudmFzKCk7XG4gIH07XG5cbiAgSW1hZ2VNaW5pTWFwLnByb3RvdHlwZS51cGRhdGVJbWdTaXplID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgaW1nRE9NID0gc2VsZi5nZXQoJ2ltZ0RPTScpO1xuICAgIHZhciBjV2lkdGggPSBzZWxmLmdldCgnd2lkdGgnKTtcbiAgICB2YXIgY0hlaWdodCA9IHNlbGYuZ2V0KCdoZWlnaHQnKTtcblxuICAgIGltZ0RPTS5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgbmF0dXJhbFNpemUgPSBnZXRJbWdOYXR1cmFsRGltZW5zaW9uKGltZ0RPTSk7XG5cbiAgICAgIGlmIChuYXR1cmFsU2l6ZVswXSA+IG5hdHVyYWxTaXplWzFdKSB7XG4gICAgICAgIGltZ0RPTS53aWR0aCA9IGNXaWR0aDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGltZ0RPTS5oZWlnaHQgPSBjSGVpZ2h0O1xuICAgICAgfVxuICAgIH07XG4gIH07XG5cbiAgSW1hZ2VNaW5pTWFwLnByb3RvdHlwZS51cGRhdGVDYW52YXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgLy8g5aaC5p6c5piv5Zyo5Yqo55S777yM5YiZ5LiN5Yi35paw6KeG5Zu+XG4gICAgdmFyIGlzUmVmcmVzaCA9IHRoaXMuZ2V0KCdyZWZyZXNoJyk7XG5cbiAgICBpZiAoIWlzUmVmcmVzaCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBncmFwaCA9IHRoaXMuZ2V0KCdncmFwaCcpO1xuXG4gICAgaWYgKGdyYXBoLmdldCgnZGVzdHJveWVkJykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIOWmguaenOaYr+inhuWPo+WPmOaNou+8jOS5n+S4jeWIt+aWsOinhuWbvu+8jOS9huaYr+mcgOimgemHjee9ruinhuWPo+Wkp+Wwj+WSjOS9jee9rlxuXG5cbiAgICBpZiAodGhpcy5nZXQoJ3ZpZXdwb3J0Q2hhbmdlJykpIHtcbiAgICAgIHRoaXMuc2V0KCd2aWV3cG9ydENoYW5nZScsIGZhbHNlKTtcbiAgICAgIHRoaXMudXBkYXRlVmlld3BvcnQoKTtcbiAgICB9XG5cbiAgICB2YXIgY1dpZHRoID0gdGhpcy5nZXQoJ3dpZHRoJyk7XG4gICAgdmFyIGdyYXBoQkJveCA9IGdyYXBoLmdldCgnY2FudmFzJykuZ2V0Q2FudmFzQkJveCgpO1xuICAgIHZhciB3aWR0aCA9IGdyYXBoQkJveC53aWR0aDtcbiAgICB2YXIgcmF0aW8gPSBjV2lkdGggLyB3aWR0aDsgLy8gLy8g5pu05pawbWluaW1hcOinhuWPo1xuXG4gICAgdGhpcy5zZXQoJ3JhdGlvJywgcmF0aW8pO1xuICAgIHRoaXMudXBkYXRlVmlld3BvcnQoKTtcbiAgfTtcbiAgLyoqXG4gICAqIOiOt+WPlm1pbmltYXDnmoTnqpflj6NcbiAgICogQHJldHVybiB7SFRNTEVsZW1lbnR9IOeql+WPo+eahGRvbeWunuS+i1xuICAgKi9cblxuXG4gIEltYWdlTWluaU1hcC5wcm90b3R5cGUuZ2V0Vmlld3BvcnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KCd2aWV3cG9ydCcpO1xuICB9O1xuICAvKipcbiAgICog6I635Y+WbWluaW1hcOeahOWuueWZqGRvbVxuICAgKiBAcmV0dXJuIHtIVE1MRWxlbWVudH0gZG9tXG4gICAqL1xuXG5cbiAgSW1hZ2VNaW5pTWFwLnByb3RvdHlwZS5nZXRDb250YWluZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KCdjb250YWluZXInKTtcbiAgfTtcblxuICBJbWFnZU1pbmlNYXAucHJvdG90eXBlLnVwZGF0ZUdyYXBoSW1nID0gZnVuY3Rpb24gKGltZykge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgb3JpSW1nRE9NID0gc2VsZi5nZXQoJ2ltZ0RPTScpO1xuICAgIG9yaUltZ0RPTS5yZW1vdmUoKTtcbiAgICBzZWxmLnNldCgnZ3JhcGhJbWcnLCBpbWcpO1xuICAgIHZhciBpbWdET00gPSBjcmVhdGVEb20oXCI8aW1nIGFsdD1cXFwiXFxcIiBzcmM9XFxcIlwiICsgaW1nICsgXCJcXFwiIHN0eWxlPVxcXCJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxcIiBvbmRyYWdzdGFydD1cXFwicmV0dXJuIGZhbHNlO1xcXCIgb25zZWxlY3RzdGFydD1cXFwicmV0dXJuIGZhbHNlO1xcXCIvPlwiKTtcbiAgICBzZWxmLnNldCgnaW1nRE9NJywgaW1nRE9NKTtcbiAgICBpbWdET00uc3JjID0gaW1nO1xuICAgIHNlbGYudXBkYXRlSW1nU2l6ZSgpO1xuICAgIHZhciBzcGFuID0gc2VsZi5nZXQoJ2NvbnRhaW5lclNwYW4nKTtcbiAgICBzcGFuLmFwcGVuZENoaWxkKGltZ0RPTSk7XG4gICAgc2VsZi51cGRhdGVDYW52YXMoKTtcbiAgfTtcblxuICBJbWFnZU1pbmlNYXAucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGNvbnRhaW5lciA9IHRoaXMuZ2V0KCdjb250YWluZXInKTtcbiAgICBjb250YWluZXIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChjb250YWluZXIpO1xuICB9O1xuXG4gIHJldHVybiBJbWFnZU1pbmlNYXA7XG59KEJhc2UpO1xuXG5leHBvcnQgZGVmYXVsdCBJbWFnZU1pbmlNYXA7IiwidmFyIF9fZXh0ZW5kcyA9IHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMgfHwgZnVuY3Rpb24gKCkge1xuICB2YXIgX2V4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbiBleHRlbmRTdGF0aWNzKGQsIGIpIHtcbiAgICBfZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCB7XG4gICAgICBfX3Byb3RvX186IFtdXG4gICAgfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICBkLl9fcHJvdG9fXyA9IGI7XG4gICAgfSB8fCBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgZm9yICh2YXIgcCBpbiBiKSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdO1xuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gX2V4dGVuZFN0YXRpY3MoZCwgYik7XG4gIH07XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgaWYgKHR5cGVvZiBiICE9PSBcImZ1bmN0aW9uXCIgJiYgYiAhPT0gbnVsbCkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNsYXNzIGV4dGVuZHMgdmFsdWUgXCIgKyBTdHJpbmcoYikgKyBcIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsXCIpO1xuXG4gICAgX2V4dGVuZFN0YXRpY3MoZCwgYik7XG5cbiAgICBmdW5jdGlvbiBfXygpIHtcbiAgICAgIHRoaXMuY29uc3RydWN0b3IgPSBkO1xuICAgIH1cblxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgfTtcbn0oKTtcblxudmFyIF9fYXNzaWduID0gdGhpcyAmJiB0aGlzLl9fYXNzaWduIHx8IGZ1bmN0aW9uICgpIHtcbiAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0KSB7XG4gICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG4gICAgICBzID0gYXJndW1lbnRzW2ldO1xuXG4gICAgICBmb3IgKHZhciBwIGluIHMpIHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdFtwXSA9IHNbcF07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHQ7XG4gIH07XG5cbiAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59O1xuXG5pbXBvcnQgeyBjbG9uZSB9IGZyb20gJ0BhbnR2L3V0aWwnO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJ0BhbnR2L2c2LWNvcmUnO1xuaW1wb3J0IEJhc2UgZnJvbSAnLi4vYmFzZSc7XG52YXIgZGlzdGFuY2UgPSBVdGlsLmRpc3RhbmNlO1xudmFyIERFTFRBID0gMC4wNTtcbnZhciBsZW5zRGVsZWdhdGVTdHlsZSA9IHtcbiAgc3Ryb2tlOiAnIzAwMCcsXG4gIHN0cm9rZU9wYWNpdHk6IDAuOCxcbiAgbGluZVdpZHRoOiAyLFxuICBmaWxsT3BhY2l0eTogMSxcbiAgZmlsbDogJyNmZmYnXG59O1xuXG52YXIgRWRnZUZpbHRlckxlbnMgPVxuLyoqIEBjbGFzcyAqL1xuZnVuY3Rpb24gKF9zdXBlcikge1xuICBfX2V4dGVuZHMoRWRnZUZpbHRlckxlbnMsIF9zdXBlcik7XG5cbiAgZnVuY3Rpb24gRWRnZUZpbHRlckxlbnMoY29uZmlnKSB7XG4gICAgcmV0dXJuIF9zdXBlci5jYWxsKHRoaXMsIGNvbmZpZykgfHwgdGhpcztcbiAgfVxuXG4gIEVkZ2VGaWx0ZXJMZW5zLnByb3RvdHlwZS5nZXREZWZhdWx0Q2ZncyA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ2JvdGgnLFxuICAgICAgdHJpZ2dlcjogJ21vdXNlbW92ZScsXG4gICAgICByOiA2MCxcbiAgICAgIGRlbGVnYXRlU3R5bGU6IGNsb25lKGxlbnNEZWxlZ2F0ZVN0eWxlKSxcbiAgICAgIHNob3dMYWJlbDogJ2VkZ2UnLFxuICAgICAgc2NhbGVSQnk6ICd3aGVlbCdcbiAgICB9O1xuICB9OyAvLyBjbGFzcy1tZXRob2RzLXVzZS10aGlzXG5cblxuICBFZGdlRmlsdGVyTGVucy5wcm90b3R5cGUuZ2V0RXZlbnRzID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBldmVudHM7XG5cbiAgICBzd2l0Y2ggKHRoaXMuZ2V0KCd0cmlnZ2VyJykpIHtcbiAgICAgIGNhc2UgJ2NsaWNrJzpcbiAgICAgICAgZXZlbnRzID0ge1xuICAgICAgICAgIGNsaWNrOiAnZmlsdGVyJ1xuICAgICAgICB9O1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnZHJhZyc6XG4gICAgICAgIGV2ZW50cyA9IHtcbiAgICAgICAgICBjbGljazogJ2NyZWF0ZURlbGVnYXRlJ1xuICAgICAgICB9O1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgZXZlbnRzID0ge1xuICAgICAgICAgIG1vdXNlbW92ZTogJ2ZpbHRlcidcbiAgICAgICAgfTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgcmV0dXJuIGV2ZW50cztcbiAgfTtcblxuICBFZGdlRmlsdGVyTGVucy5wcm90b3R5cGUuaW5pdCA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIHNob3dMYWJlbCA9IHNlbGYuZ2V0KCdzaG93TGFiZWwnKTtcbiAgICB2YXIgc2hvd05vZGVMYWJlbCA9IHNob3dMYWJlbCA9PT0gJ25vZGUnIHx8IHNob3dMYWJlbCA9PT0gJ2JvdGgnO1xuICAgIHZhciBzaG93RWRnZUxhYmVsID0gc2hvd0xhYmVsID09PSAnZWRnZScgfHwgc2hvd0xhYmVsID09PSAnYm90aCc7XG4gICAgc2VsZi5zZXQoJ3Nob3dOb2RlTGFiZWwnLCBzaG93Tm9kZUxhYmVsKTtcbiAgICBzZWxmLnNldCgnc2hvd0VkZ2VMYWJlbCcsIHNob3dFZGdlTGFiZWwpO1xuICAgIHZhciBzaG91bGRTaG93ID0gc2VsZi5nZXQoJ3Nob3VsZFNob3cnKTtcbiAgICBpZiAoIXNob3VsZFNob3cpIHNlbGYuc2V0KCdzaG91bGRTaG93JywgZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG4gIH07IC8vIENyZWF0ZSB0aGUgZGVsZWdhdGUgd2hlbiB0aGUgdHJpZ2dlciBpcyBkcmFnXG5cblxuICBFZGdlRmlsdGVyTGVucy5wcm90b3R5cGUuY3JlYXRlRGVsZWdhdGUgPSBmdW5jdGlvbiAoZSkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgbGVuc0RlbGVnYXRlID0gc2VsZi5nZXQoJ2RlbGVnYXRlJyk7XG5cbiAgICBpZiAoIWxlbnNEZWxlZ2F0ZSB8fCBsZW5zRGVsZWdhdGUuZGVzdHJveWVkKSB7XG4gICAgICBzZWxmLmZpbHRlcihlKTtcbiAgICAgIGxlbnNEZWxlZ2F0ZSA9IHNlbGYuZ2V0KCdkZWxlZ2F0ZScpOyAvLyBkcmFnIHRvIG1vdmUgdGhlIGxlbnNcblxuICAgICAgbGVuc0RlbGVnYXRlLm9uKCdkcmFnc3RhcnQnLCBmdW5jdGlvbiAoZXZ0KSB7fSk7XG4gICAgICBsZW5zRGVsZWdhdGUub24oJ2RyYWcnLCBmdW5jdGlvbiAoZXZ0KSB7XG4gICAgICAgIHNlbGYuZmlsdGVyKGV2dCk7XG4gICAgICB9KTsgLy8g57uR5a6a6LCD5pW06IyD5Zu077yIcu+8iVxuICAgICAgLy8g55Sx5LqOIGRyYWcg55So5LqO5pS55Y+YIGxlbnMg5L2N572u77yM5Zug5q2k5Zyo5q2k5qih5byP5LiL77yMZHJhZyDkuI3og73nlKjkuo7osIPmlbQgclxuICAgICAgLy8gc2NhbGluZyByXG5cbiAgICAgIGlmICh0aGlzLmdldCgnc2NhbGVSQnknKSA9PT0gJ3doZWVsJykge1xuICAgICAgICBsZW5zRGVsZWdhdGUub24oJ21vdXNld2hlZWwnLCBmdW5jdGlvbiAoZXZ0KSB7XG4gICAgICAgICAgc2VsZi5zY2FsZVJCeVdoZWVsKGV2dCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgLyoqXG4gICAqIFNjYWxlIHRoZSByYW5nZSBieSB3aGVlbFxuICAgKiBAcGFyYW0gZSBtb3VzZSB3aGVlbCBldmVudFxuICAgKi9cblxuXG4gIEVkZ2VGaWx0ZXJMZW5zLnByb3RvdHlwZS5zY2FsZVJCeVdoZWVsID0gZnVuY3Rpb24gKGUpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgaWYgKCFlIHx8ICFlLm9yaWdpbmFsRXZlbnQpIHJldHVybjtcbiAgICBpZiAoZS5wcmV2ZW50RGVmYXVsdCkgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHZhciBncmFwaCA9IHNlbGYuZ2V0KCdncmFwaCcpO1xuICAgIHZhciByYXRpbztcbiAgICB2YXIgbGVuc0RlbGVnYXRlID0gc2VsZi5nZXQoJ2RlbGVnYXRlJyk7XG4gICAgdmFyIGxlbnNDZW50ZXIgPSBsZW5zRGVsZWdhdGUgPyB7XG4gICAgICB4OiBsZW5zRGVsZWdhdGUuYXR0cigneCcpLFxuICAgICAgeTogbGVuc0RlbGVnYXRlLmF0dHIoJ3knKVxuICAgIH0gOiB1bmRlZmluZWQ7XG4gICAgdmFyIG1vdXNlUG9zID0gbGVuc0NlbnRlciB8fCBncmFwaC5nZXRQb2ludEJ5Q2xpZW50KGUuY2xpZW50WCwgZS5jbGllbnRZKTtcblxuICAgIGlmIChlLm9yaWdpbmFsRXZlbnQud2hlZWxEZWx0YSA8IDApIHtcbiAgICAgIHJhdGlvID0gMSAtIERFTFRBO1xuICAgIH0gZWxzZSB7XG4gICAgICByYXRpbyA9IDEgLyAoMSAtIERFTFRBKTtcbiAgICB9XG5cbiAgICB2YXIgbWF4UiA9IHNlbGYuZ2V0KCdtYXhSJyk7XG4gICAgdmFyIG1pblIgPSBzZWxmLmdldCgnbWluUicpO1xuICAgIHZhciByID0gc2VsZi5nZXQoJ3InKTtcblxuICAgIGlmIChyID4gKG1heFIgfHwgZ3JhcGguZ2V0KCdoZWlnaHQnKSkgJiYgcmF0aW8gPiAxIHx8IHIgPCAobWluUiB8fCBncmFwaC5nZXQoJ2hlaWdodCcpICogMC4wNSkgJiYgcmF0aW8gPCAxKSB7XG4gICAgICByYXRpbyA9IDE7XG4gICAgfVxuXG4gICAgciAqPSByYXRpbztcbiAgICBzZWxmLnNldCgncicsIHIpO1xuICAgIHNlbGYuZmlsdGVyKGUpO1xuICB9O1xuICAvKipcbiAgICogUmVzcG9uc2UgZnVuY3Rpb24gZm9yIG1vdXNlbW92ZSwgY2xpY2ssIG9yIGRyYWcgdG8gZmlsdGVyIG91dCB0aGUgZWRnZXNcbiAgICogQHBhcmFtIGUgbW91c2UgZXZlbnRcbiAgICovXG5cblxuICBFZGdlRmlsdGVyTGVucy5wcm90b3R5cGUuZmlsdGVyID0gZnVuY3Rpb24gKGUpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIGdyYXBoID0gc2VsZi5nZXQoJ2dyYXBoJyk7XG4gICAgdmFyIG5vZGVzID0gZ3JhcGguZ2V0Tm9kZXMoKTtcbiAgICB2YXIgaGl0Tm9kZXNNYXAgPSB7fTtcbiAgICB2YXIgciA9IHNlbGYuZ2V0KCdyJyk7XG4gICAgdmFyIHR5cGUgPSBzZWxmLmdldCgndHlwZScpO1xuICAgIHZhciBmQ2VudGVyID0ge1xuICAgICAgeDogZS54LFxuICAgICAgeTogZS55XG4gICAgfTtcbiAgICBzZWxmLnVwZGF0ZURlbGVnYXRlKGZDZW50ZXIsIHIpO1xuICAgIHZhciBzaG91bGRTaG93ID0gc2VsZi5nZXQoJ3Nob3VsZFNob3cnKTtcbiAgICB2YXIgdlNoYXBlcyA9IHNlbGYuZ2V0KCd2U2hhcGVzJyk7XG5cbiAgICBpZiAodlNoYXBlcykge1xuICAgICAgdlNoYXBlcy5mb3JFYWNoKGZ1bmN0aW9uIChzaGFwZSkge1xuICAgICAgICBzaGFwZS5yZW1vdmUoKTtcbiAgICAgICAgc2hhcGUuZGVzdHJveSgpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdlNoYXBlcyA9IFtdO1xuICAgIG5vZGVzLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgIHZhciBtb2RlbCA9IG5vZGUuZ2V0TW9kZWwoKTtcbiAgICAgIHZhciB4ID0gbW9kZWwueCxcbiAgICAgICAgICB5ID0gbW9kZWwueTtcblxuICAgICAgaWYgKGRpc3RhbmNlKHtcbiAgICAgICAgeDogeCxcbiAgICAgICAgeTogeVxuICAgICAgfSwgZkNlbnRlcikgPCByKSB7XG4gICAgICAgIGhpdE5vZGVzTWFwW21vZGVsLmlkXSA9IG5vZGU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdmFyIGVkZ2VzID0gZ3JhcGguZ2V0RWRnZXMoKTtcbiAgICB2YXIgaGl0RWRnZXMgPSBbXTtcbiAgICBlZGdlcy5mb3JFYWNoKGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgICB2YXIgbW9kZWwgPSBlZGdlLmdldE1vZGVsKCk7XG4gICAgICB2YXIgc291cmNlSWQgPSBtb2RlbC5zb3VyY2U7XG4gICAgICB2YXIgdGFyZ2V0SWQgPSBtb2RlbC50YXJnZXQ7XG5cbiAgICAgIGlmIChzaG91bGRTaG93KG1vZGVsKSkge1xuICAgICAgICBpZiAodHlwZSA9PT0gJ29ubHktc291cmNlJyB8fCB0eXBlID09PSAnb25lJykge1xuICAgICAgICAgIGlmIChoaXROb2Rlc01hcFtzb3VyY2VJZF0gJiYgIWhpdE5vZGVzTWFwW3RhcmdldElkXSkgaGl0RWRnZXMucHVzaChlZGdlKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnb25seS10YXJnZXQnIHx8IHR5cGUgPT09ICdvbmUnKSB7XG4gICAgICAgICAgaWYgKGhpdE5vZGVzTWFwW3RhcmdldElkXSAmJiAhaGl0Tm9kZXNNYXBbc291cmNlSWRdKSBoaXRFZGdlcy5wdXNoKGVkZ2UpO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdib3RoJyAmJiBoaXROb2Rlc01hcFtzb3VyY2VJZF0gJiYgaGl0Tm9kZXNNYXBbdGFyZ2V0SWRdKSB7XG4gICAgICAgICAgaGl0RWRnZXMucHVzaChlZGdlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIHZhciBzaG93Tm9kZUxhYmVsID0gc2VsZi5nZXQoJ3Nob3dOb2RlTGFiZWwnKTtcbiAgICB2YXIgc2hvd0VkZ2VMYWJlbCA9IHNlbGYuZ2V0KCdzaG93RWRnZWxhYmVsJyk7IC8vIGNvcHkgdGhlIHNoYXBlcyBpbiBoaXRFZGdlc1xuXG4gICAgdmFyIGdyb3VwID0gZ3JhcGguZ2V0KCdncm91cCcpO1xuICAgIGhpdEVkZ2VzLmZvckVhY2goZnVuY3Rpb24gKGVkZ2UpIHtcbiAgICAgIHZhciBzaGFwZXMgPSBlZGdlLmdldCgnZ3JvdXAnKS5nZXQoJ2NoaWxkcmVuJyk7XG4gICAgICBzaGFwZXMuZm9yRWFjaChmdW5jdGlvbiAoc2hhcGUpIHtcbiAgICAgICAgdmFyIHNoYXBlVHlwZSA9IHNoYXBlLmdldCgndHlwZScpO1xuICAgICAgICB2YXIgdlNoYXBlID0gZ3JvdXAuYWRkU2hhcGUoc2hhcGVUeXBlLCB7XG4gICAgICAgICAgYXR0cnM6IHNoYXBlLmF0dHIoKVxuICAgICAgICB9KTtcbiAgICAgICAgdlNoYXBlcy5wdXNoKHZTaGFwZSk7XG5cbiAgICAgICAgaWYgKHNob3dOb2RlTGFiZWwgJiYgc2hhcGVUeXBlID09PSAndGV4dCcpIHtcbiAgICAgICAgICB2U2hhcGUuc2V0KCd2aXNpYmxlJywgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pOyAvLyBjb3B5IHRoZSBzaGFwZSBzb2YgaGl0Tm9kZXNcblxuICAgIE9iamVjdC5rZXlzKGhpdE5vZGVzTWFwKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIHZhciBub2RlID0gaGl0Tm9kZXNNYXBba2V5XTtcbiAgICAgIHZhciBjbG9uZWRHcm91cCA9IG5vZGUuZ2V0KCdncm91cCcpLmNsb25lKCk7XG4gICAgICBncm91cC5hZGQoY2xvbmVkR3JvdXApO1xuICAgICAgdlNoYXBlcy5wdXNoKGNsb25lZEdyb3VwKTtcblxuICAgICAgaWYgKHNob3dFZGdlTGFiZWwpIHtcbiAgICAgICAgdmFyIHNoYXBlcyA9IGNsb25lZEdyb3VwLmdldCgnY2hpbGRyZW4nKTtcblxuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHNoYXBlcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgIHZhciBzaGFwZSA9IHNoYXBlc1tqXTtcblxuICAgICAgICAgIGlmIChzaGFwZS5nZXQoJ3R5cGUnKSA9PT0gJ3RleHQnKSB7XG4gICAgICAgICAgICBzaGFwZS5zZXQoJ3Zpc2libGUnLCB0cnVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICBzZWxmLnNldCgndlNoYXBlcycsIHZTaGFwZXMpO1xuICB9O1xuICAvKipcbiAgICogQWRqdXN0IHBhcnQgb2YgdGhlIHBhcmFtZXRlcnMsIGluY2x1ZGluZyB0cmlnZ2VyLCB0eXBlLCByLCBtYXhSLCBtaW5SLCBzaG91bGRTaG93LCBzaG93TGFiZWwsIGFuZCBzY2FsZVJCeVxuICAgKiBAcGFyYW0ge0VkZ2VGaWx0ZXJMZW5zQ29uZmlnfSBjZmdcbiAgICovXG5cblxuICBFZGdlRmlsdGVyTGVucy5wcm90b3R5cGUudXBkYXRlUGFyYW1zID0gZnVuY3Rpb24gKGNmZykge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgciA9IGNmZy5yLFxuICAgICAgICB0cmlnZ2VyID0gY2ZnLnRyaWdnZXIsXG4gICAgICAgIG1pblIgPSBjZmcubWluUixcbiAgICAgICAgbWF4UiA9IGNmZy5tYXhSLFxuICAgICAgICBzY2FsZVJCeSA9IGNmZy5zY2FsZVJCeSxcbiAgICAgICAgc2hvd0xhYmVsID0gY2ZnLnNob3dMYWJlbCxcbiAgICAgICAgc2hvdWxkU2hvdyA9IGNmZy5zaG91bGRTaG93O1xuXG4gICAgaWYgKCFpc05hTihjZmcucikpIHtcbiAgICAgIHNlbGYuc2V0KCdyJywgcik7XG4gICAgfVxuXG4gICAgaWYgKCFpc05hTihtYXhSKSkge1xuICAgICAgc2VsZi5zZXQoJ21heFInLCBtYXhSKTtcbiAgICB9XG5cbiAgICBpZiAoIWlzTmFOKG1pblIpKSB7XG4gICAgICBzZWxmLnNldCgnbWluUicsIG1pblIpO1xuICAgIH1cblxuICAgIGlmICh0cmlnZ2VyID09PSAnbW91c2Vtb3ZlJyB8fCB0cmlnZ2VyID09PSAnY2xpY2snKSB7XG4gICAgICBzZWxmLnNldCgndHJpZ2dlcicsIHRyaWdnZXIpO1xuICAgIH1cblxuICAgIGlmIChzY2FsZVJCeSA9PT0gJ3doZWVsJyB8fCBzY2FsZVJCeSA9PT0gJ3Vuc2V0Jykge1xuICAgICAgc2VsZi5zZXQoJ3NjYWxlUkJ5Jywgc2NhbGVSQnkpO1xuICAgICAgc2VsZi5nZXQoJ2RlbGVnYXRlJykucmVtb3ZlKCk7XG4gICAgICBzZWxmLmdldCgnZGVsZWdhdGUnKS5kZXN0cm95KCk7XG4gICAgICB2YXIgZFBlcmNlbnRUZXh0ID0gc2VsZi5nZXQoJ2RQZXJjZW50VGV4dCcpO1xuXG4gICAgICBpZiAoZFBlcmNlbnRUZXh0KSB7XG4gICAgICAgIGRQZXJjZW50VGV4dC5yZW1vdmUoKTtcbiAgICAgICAgZFBlcmNlbnRUZXh0LmRlc3Ryb3koKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc2hvd0xhYmVsID09PSAnbm9kZScgfHwgc2hvd0xhYmVsID09PSAnYm90aCcpIHtcbiAgICAgIHNlbGYuc2V0KCdzaG93Tm9kZUxhYmVsJywgdHJ1ZSk7XG4gICAgfVxuXG4gICAgaWYgKHNob3dMYWJlbCA9PT0gJ2VkZ2UnIHx8IHNob3dMYWJlbCA9PT0gJ2JvdGgnKSB7XG4gICAgICBzZWxmLnNldCgnc2hvd0VkZ2VMYWJlbCcsIHRydWUpO1xuICAgIH1cblxuICAgIGlmIChzaG91bGRTaG93KSB7XG4gICAgICBzZWxmLnNldCgnc2hvdWxkU2hvdycsIHNob3VsZFNob3cpO1xuICAgIH1cbiAgfTtcbiAgLyoqXG4gICAqIFVwZGF0ZSB0aGUgZGVsZWdhdGUgc2hhcGUgb2YgdGhlIGxlbnNcbiAgICogQHBhcmFtIHtQb2ludH0gbUNlbnRlciB0aGUgY2VudGVyIG9mIHRoZSBzaGFwZVxuICAgKiBAcGFyYW0ge251bWJlcn0gciB0aGUgcmFkaXVzIG9mIHRoZSBzaGFwZVxuICAgKi9cblxuXG4gIEVkZ2VGaWx0ZXJMZW5zLnByb3RvdHlwZS51cGRhdGVEZWxlZ2F0ZSA9IGZ1bmN0aW9uIChtQ2VudGVyLCByKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBncmFwaCA9IHNlbGYuZ2V0KCdncmFwaCcpO1xuICAgIHZhciBsZW5zRGVsZWdhdGUgPSBzZWxmLmdldCgnZGVsZWdhdGUnKTtcblxuICAgIGlmICghbGVuc0RlbGVnYXRlIHx8IGxlbnNEZWxlZ2F0ZS5kZXN0cm95ZWQpIHtcbiAgICAgIC8vIOaLluWKqOWkmuS4qlxuICAgICAgdmFyIHBhcmVudF8xID0gZ3JhcGguZ2V0KCdncm91cCcpO1xuICAgICAgdmFyIGF0dHJzID0gc2VsZi5nZXQoJ2RlbGVnYXRlU3R5bGUnKSB8fCBsZW5zRGVsZWdhdGVTdHlsZTsgLy8gbW9kZWzkuIrnmoR4LCB55piv55u45a+55LqO5Zu+5b2i5Lit5b+D55qE77yMZGVsZWdhdGVTaGFwZeaYr2flrp7kvovvvIx4LHnmmK/nu53lr7nlnZDmoIdcblxuICAgICAgbGVuc0RlbGVnYXRlID0gcGFyZW50XzEuYWRkU2hhcGUoJ2NpcmNsZScsIHtcbiAgICAgICAgYXR0cnM6IF9fYXNzaWduKHtcbiAgICAgICAgICByOiByLFxuICAgICAgICAgIHg6IG1DZW50ZXIueCxcbiAgICAgICAgICB5OiBtQ2VudGVyLnlcbiAgICAgICAgfSwgYXR0cnMpLFxuICAgICAgICBuYW1lOiAnbGVucy1zaGFwZScsXG4gICAgICAgIGRyYWdnYWJsZTogdHJ1ZVxuICAgICAgfSk7XG5cbiAgICAgIGlmICh0aGlzLmdldCgndHJpZ2dlcicpICE9PSAnZHJhZycpIHtcbiAgICAgICAgLy8g6LCD5pW06IyD5Zu0IHIg55qE55uR5ZCsXG4gICAgICAgIGlmICh0aGlzLmdldCgnc2NhbGVSQnknKSA9PT0gJ3doZWVsJykge1xuICAgICAgICAgIC8vIOS9v+eUqOa7mui9ruiwg+aVtCByXG4gICAgICAgICAgbGVuc0RlbGVnYXRlLm9uKCdtb3VzZXdoZWVsJywgZnVuY3Rpb24gKGV2dCkge1xuICAgICAgICAgICAgc2VsZi5zY2FsZVJCeVdoZWVsKGV2dCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbGVuc0RlbGVnYXRlLmF0dHIoe1xuICAgICAgICB4OiBtQ2VudGVyLngsXG4gICAgICAgIHk6IG1DZW50ZXIueSxcbiAgICAgICAgcjogclxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2VsZi5zZXQoJ2RlbGVnYXRlJywgbGVuc0RlbGVnYXRlKTtcbiAgfTtcbiAgLyoqXG4gICAqIENsZWFyIHRoZSBmaWx0ZXJpbmdcbiAgICovXG5cblxuICBFZGdlRmlsdGVyTGVucy5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciB2U2hhcGVzID0gc2VsZi5nZXQoJ3ZTaGFwZXMnKTtcblxuICAgIGlmICh2U2hhcGVzKSB7XG4gICAgICB2U2hhcGVzLmZvckVhY2goZnVuY3Rpb24gKHNoYXBlKSB7XG4gICAgICAgIHNoYXBlLnJlbW92ZSgpO1xuICAgICAgICBzaGFwZS5kZXN0cm95KCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB2U2hhcGVzID0gW107XG4gICAgc2VsZi5zZXQoJ3ZTaGFwZXMnLCB2U2hhcGVzKTtcbiAgICB2YXIgbGVuc0RlbGVnYXRlID0gc2VsZi5nZXQoJ2RlbGVnYXRlJyk7XG5cbiAgICBpZiAobGVuc0RlbGVnYXRlICYmICFsZW5zRGVsZWdhdGUuZGVzdHJveWVkKSB7XG4gICAgICBsZW5zRGVsZWdhdGUucmVtb3ZlKCk7XG4gICAgICBsZW5zRGVsZWdhdGUuZGVzdHJveSgpO1xuICAgIH1cbiAgfTtcbiAgLyoqXG4gICAqIERlc3Ryb3kgdGhlIGNvbXBvbmVudFxuICAgKi9cblxuXG4gIEVkZ2VGaWx0ZXJMZW5zLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuY2xlYXIoKTtcbiAgfTtcblxuICByZXR1cm4gRWRnZUZpbHRlckxlbnM7XG59KEJhc2UpO1xuXG5leHBvcnQgZGVmYXVsdCBFZGdlRmlsdGVyTGVuczsiLCJ2YXIgX19leHRlbmRzID0gdGhpcyAmJiB0aGlzLl9fZXh0ZW5kcyB8fCBmdW5jdGlvbiAoKSB7XG4gIHZhciBfZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uIGV4dGVuZFN0YXRpY3MoZCwgYikge1xuICAgIF9leHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8IHtcbiAgICAgIF9fcHJvdG9fXzogW11cbiAgICB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgIGQuX19wcm90b19fID0gYjtcbiAgICB9IHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICBmb3IgKHZhciBwIGluIGIpIHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBwKSkgZFtwXSA9IGJbcF07XG4gICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiBfZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgfTtcblxuICByZXR1cm4gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICBpZiAodHlwZW9mIGIgIT09IFwiZnVuY3Rpb25cIiAmJiBiICE9PSBudWxsKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2xhc3MgZXh0ZW5kcyB2YWx1ZSBcIiArIFN0cmluZyhiKSArIFwiIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGxcIik7XG5cbiAgICBfZXh0ZW5kU3RhdGljcyhkLCBiKTtcblxuICAgIGZ1bmN0aW9uIF9fKCkge1xuICAgICAgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7XG4gICAgfVxuXG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xuICB9O1xufSgpO1xuXG5pbXBvcnQgeyBlYWNoLCBtaXggfSBmcm9tICdAYW50di91dGlsJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICdAYW50di9nNi1jb3JlJztcbmltcG9ydCBCYXNlIGZyb20gJy4uL2Jhc2UnO1xudmFyIHBvaW50TGluZURpc3RhbmNlID0gVXRpbC5wb2ludExpbmVEaXN0YW5jZTsgLy8g5a+56b2Q57q/5qC35byPXG5cbnZhciBhbGlnbkxpbmVTdHlsZSA9IHtcbiAgc3Ryb2tlOiAnI0ZBOEMxNicsXG4gIGxpbmVXaWR0aDogMVxufTtcblxudmFyIFNuYXBMaW5lID1cbi8qKiBAY2xhc3MgKi9cbmZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgX19leHRlbmRzKFNuYXBMaW5lLCBfc3VwZXIpO1xuXG4gIGZ1bmN0aW9uIFNuYXBMaW5lKHByb3BzKSB7XG4gICAgcmV0dXJuIF9zdXBlci5jYWxsKHRoaXMsIHByb3BzKSB8fCB0aGlzO1xuICB9XG5cbiAgU25hcExpbmUucHJvdG90eXBlLmdldERlZmF1bHRDZmdzID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB7XG4gICAgICBsaW5lOiBhbGlnbkxpbmVTdHlsZSxcblxuICAgICAgLyoqXG4gICAgICAgKiBpdGVtIGFsaWduIHR5cGVcbiAgICAgICAqIEB0eXBlIHtTdHJpbmd8VHJ1ZXxGYWxzZX1cbiAgICAgICAqL1xuICAgICAgaXRlbUFsaWduVHlwZTogJ2NlbnRlcicsXG5cbiAgICAgIC8qKlxuICAgICAgICogdG9sZXJhbmNlIHRvIGl0ZW0gZm9yY2UgYWxpZ25cbiAgICAgICAqIEB0eXBlIHtTdHJpbmd8VHJ1ZXxGYWxzZX1cbiAgICAgICAqL1xuICAgICAgdG9sZXJhbmNlOiA1LFxuICAgICAgaG9yaXpvbnRhbExpbmVzOiB7fSxcbiAgICAgIHZlcnRpY2FsTGluZXM6IHt9LFxuICAgICAgYWxpZ25MaW5lczogW11cbiAgICB9O1xuICB9O1xuXG4gIFNuYXBMaW5lLnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24gKCkge307IC8vIGNsYXNzLW1ldGhvZHMtdXNlLXRoaXNcblxuXG4gIFNuYXBMaW5lLnByb3RvdHlwZS5nZXRFdmVudHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICdub2RlOmRyYWdzdGFydCc6ICdvbkRyYWdTdGFydCcsXG4gICAgICAnbm9kZTpkcmFnJzogJ29uRHJhZycsXG4gICAgICAnbm9kZTpkcmFnZW5kJzogJ29uRHJhZ0VuZCdcbiAgICB9O1xuICB9O1xuXG4gIFNuYXBMaW5lLnByb3RvdHlwZS5vbkRyYWdTdGFydCA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmluaXRCb3hMaW5lKCk7XG4gIH07XG5cbiAgU25hcExpbmUucHJvdG90eXBlLm9uRHJhZyA9IGZ1bmN0aW9uIChlKSB7XG4gICAgdmFyIGl0ZW0gPSBlLml0ZW07IC8vIOiuoeeul+i+heWKqee6v+S9jee9rizmi5bliqjov4fnqIvkuK3mm7TmlrDovoXliqnnur9cblxuICAgIHZhciBkZWxlZ2F0ZVNoYXBlID0gaXRlbS5nZXQoJ2RlbGVnYXRlU2hhcGUnKSB8fCBpdGVtO1xuICAgIHZhciBiYm94ID0gZGVsZWdhdGVTaGFwZS5nZXRCQm94KCk7XG4gICAgdmFyIG1vZGVsID0gaXRlbS5nZXRNb2RlbCgpO1xuICAgIHZhciBkeCA9IG1vZGVsLnggLSBiYm94Lng7XG4gICAgdmFyIGR5ID0gbW9kZWwueSAtIGJib3gueTtcbiAgICB0aGlzLnNob3coe1xuICAgICAgeDogYmJveC5taW5YICsgZHgsXG4gICAgICB5OiBiYm94Lm1pblkgKyBkeVxuICAgIH0sIHtcbiAgICAgIHdpZHRoOiBiYm94LndpZHRoLFxuICAgICAgaGVpZ2h0OiBiYm94LmhlaWdodFxuICAgIH0pO1xuICB9O1xuXG4gIFNuYXBMaW5lLnByb3RvdHlwZS5vbkRyYWdFbmQgPSBmdW5jdGlvbiAoKSB7XG4gICAgLy8g5ouW5Yqo57uT5p2f5pe25YCZ5Yig6Zmk6L6F5Yqp57q/XG4gICAgdGhpcy5kZXN0b3J5KCk7XG4gIH07XG4gIC8qKlxuICAgKiDmr4/mrKHlvIDlp4vmi5bliqjkuYvliY3vvIzorqHnrpflh7rmiYDmnInoioLngrnlnKjmsLTlubPlkozlnoLnm7TmlrnlkJHkuIrvvIzlt6bkuK3lj7PkuInmnaHkuK3nur/vvIzlubbnvJPlrZjotbfmnaVcbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IGl0ZW0gTm9kZeiKgueCuVxuICAgKiBAbWVtYmVyb2YgQWxpZ25MaW5lXG4gICAqL1xuXG5cbiAgU25hcExpbmUucHJvdG90eXBlLmluaXRCb3hMaW5lID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBfYSA9IHRoaXMuX2NmZ3MsXG4gICAgICAgIGhvcml6b250YWxMaW5lcyA9IF9hLmhvcml6b250YWxMaW5lcyxcbiAgICAgICAgdmVydGljYWxMaW5lcyA9IF9hLnZlcnRpY2FsTGluZXMsXG4gICAgICAgIGl0ZW1BbGlnblR5cGUgPSBfYS5pdGVtQWxpZ25UeXBlO1xuICAgIHZhciBncmFwaCA9IHRoaXMuZ2V0KCdncmFwaCcpO1xuICAgIHZhciBub2RlcyA9IGdyYXBoLmdldE5vZGVzKCk7XG4gICAgbm9kZXMuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgdmFyIGJib3ggPSBpdGVtLmdldEJCb3goKTtcbiAgICAgIHZhciBub2RlSWQgPSBpdGVtLmdldCgnaWQnKTsgLy8g6K6+572u5rC05bmz5pa55ZCR6L6F5Yqp57q/XG5cbiAgICAgIGlmIChpdGVtQWxpZ25UeXBlID09PSB0cnVlIHx8IGl0ZW1BbGlnblR5cGUgPT09ICdob3Jpem9udGFsJykge1xuICAgICAgICAvLyB0bHRyOiB0b3AgbGVmdCB0b3AgcmlnaHRcbiAgICAgICAgLy8gbGNyYzogbGVmdCBjZW50ZXIgcmlnaHQgY2VudGVyXG4gICAgICAgIC8vIGJsYnI6IGJvdHRvbSBsZWZ0IGJvdHRvbSByaWdodFxuICAgICAgICBob3Jpem9udGFsTGluZXNbbm9kZUlkICsgXCJ0bHRyXCJdID0gW2Jib3gubWluWCwgYmJveC5taW5ZLCBiYm94Lm1heFgsIGJib3gubWluWSwgaXRlbV07XG4gICAgICAgIGhvcml6b250YWxMaW5lc1tub2RlSWQgKyBcImxjcmNcIl0gPSBbYmJveC5taW5YLCBiYm94LmNlbnRlclksIGJib3gubWF4WCwgYmJveC5jZW50ZXJZLCBpdGVtXTtcbiAgICAgICAgaG9yaXpvbnRhbExpbmVzW25vZGVJZCArIFwiYmxiclwiXSA9IFtiYm94Lm1pblgsIGJib3gubWF4WSwgYmJveC5tYXhYLCBiYm94Lm1heFksIGl0ZW1dO1xuICAgICAgfSBlbHNlIGlmIChpdGVtQWxpZ25UeXBlID09PSAnY2VudGVyJykge1xuICAgICAgICBob3Jpem9udGFsTGluZXNbbm9kZUlkICsgXCJsY3JjXCJdID0gW2Jib3gubWluWCwgYmJveC5jZW50ZXJZLCBiYm94Lm1heFgsIGJib3guY2VudGVyWSwgaXRlbV07XG4gICAgICB9IC8vIOiuvue9ruWeguebtOaWueWQkei+heWKqee6v1xuXG5cbiAgICAgIGlmIChpdGVtQWxpZ25UeXBlID09PSB0cnVlIHx8IGl0ZW1BbGlnblR5cGUgPT09ICd2ZXJ0aWNhbCcpIHtcbiAgICAgICAgLy8gdGxibDogdG9wIGxlZnQgYm90dG9tIGxlZnRcbiAgICAgICAgLy8gdGNiYzogdG9wIGNlbnRlciBib3R0b20gY2VudGVyXG4gICAgICAgIC8vIHRyYnI6IHRvcCByaWdodCBib3R0b20gcmlnaHRcbiAgICAgICAgdmVydGljYWxMaW5lc1tub2RlSWQgKyBcInRsYmxcIl0gPSBbYmJveC5taW5YLCBiYm94Lm1pblksIGJib3gubWluWCwgYmJveC5tYXhZLCBpdGVtXTtcbiAgICAgICAgdmVydGljYWxMaW5lc1tub2RlSWQgKyBcInRjYmNcIl0gPSBbYmJveC5jZW50ZXJYLCBiYm94Lm1pblksIGJib3guY2VudGVyWCwgYmJveC5tYXhZLCBpdGVtXTtcbiAgICAgICAgdmVydGljYWxMaW5lc1tub2RlSWQgKyBcInRyYnJcIl0gPSBbYmJveC5tYXhYLCBiYm94Lm1pblksIGJib3gubWF4WCwgYmJveC5tYXhZLCBpdGVtXTtcbiAgICAgIH0gZWxzZSBpZiAoaXRlbUFsaWduVHlwZSA9PT0gJ2NlbnRlcicpIHtcbiAgICAgICAgdmVydGljYWxMaW5lc1tub2RlSWQgKyBcInRjYmNcIl0gPSBbYmJveC5jZW50ZXJYLCBiYm94Lm1pblksIGJib3guY2VudGVyWCwgYmJveC5tYXhZLCBpdGVtXTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcbiAgLyoqXG4gICAqIOaYvuekukFsaWduTGluZVxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gcG9pbnQg6LW35aeL54K5XG4gICAqIEBwYXJhbSB7b2JqZWN0fSBiYm94IEJCb3hcbiAgICogQHJldHVybnNcbiAgICogQG1lbWJlcm9mIEFsaWduTGluZVxuICAgKi9cblxuXG4gIFNuYXBMaW5lLnByb3RvdHlwZS5zaG93ID0gZnVuY3Rpb24gKHBvaW50LCBiYm94KSB7XG4gICAgdmFyIG9yaWdpblBvaW50ID0gbWl4KHt9LCBwb2ludCk7XG4gICAgdGhpcy5pdGVtQWxpZ24ocG9pbnQsIGJib3gsIG9yaWdpblBvaW50KTtcbiAgICByZXR1cm4gcG9pbnQ7XG4gIH07XG4gIC8qKlxuICAgKiDmi5bliqjmi5blh7rkuK3mt7vliqDovoXliqnnur9cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IHBvaW50IOi1t+Wni+eCuVxuICAgKiBAcGFyYW0ge29iamVjdH0gYmJveCDku6PnkIblvaLnirbnmoRiYm94XG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcmlnaW5Qb2ludCDljp/lp4vngrnvvIzlkIxwb2ludFxuICAgKiBAbWVtYmVyb2YgQWxpZ25MaW5lXG4gICAqL1xuXG5cbiAgU25hcExpbmUucHJvdG90eXBlLml0ZW1BbGlnbiA9IGZ1bmN0aW9uIChwb2ludCwgYmJveCwgb3JpZ2luUG9pbnQpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdmFyIF9hID0gdGhpcy5fY2ZncyxcbiAgICAgICAgaG9yaXpvbnRhbExpbmVzID0gX2EuaG9yaXpvbnRhbExpbmVzLFxuICAgICAgICB2ZXJ0aWNhbExpbmVzID0gX2EudmVydGljYWxMaW5lcyxcbiAgICAgICAgdG9sZXJhbmNlID0gX2EudG9sZXJhbmNlO1xuICAgIHZhciB0YyA9IHtcbiAgICAgIHg6IG9yaWdpblBvaW50LnggKyBiYm94LndpZHRoIC8gMixcbiAgICAgIHk6IG9yaWdpblBvaW50LnlcbiAgICB9O1xuICAgIHZhciBjYyA9IHtcbiAgICAgIHg6IG9yaWdpblBvaW50LnggKyBiYm94LndpZHRoIC8gMixcbiAgICAgIHk6IG9yaWdpblBvaW50LnkgKyBiYm94LmhlaWdodCAvIDJcbiAgICB9O1xuICAgIHZhciBiYyA9IHtcbiAgICAgIHg6IG9yaWdpblBvaW50LnggKyBiYm94LndpZHRoIC8gMixcbiAgICAgIHk6IG9yaWdpblBvaW50LnkgKyBiYm94LmhlaWdodFxuICAgIH07XG4gICAgdmFyIGxjID0ge1xuICAgICAgeDogb3JpZ2luUG9pbnQueCxcbiAgICAgIHk6IG9yaWdpblBvaW50LnkgKyBiYm94LmhlaWdodCAvIDJcbiAgICB9O1xuICAgIHZhciByYyA9IHtcbiAgICAgIHg6IG9yaWdpblBvaW50LnggKyBiYm94LndpZHRoLFxuICAgICAgeTogb3JpZ2luUG9pbnQueSArIGJib3guaGVpZ2h0IC8gMlxuICAgIH07XG4gICAgdmFyIGhvcml6b250YWxEaXMgPSBbXTtcbiAgICB2YXIgdmVydGljYWxEaXMgPSBbXTtcbiAgICB2YXIgYWxpZ25DZmcgPSBudWxsO1xuICAgIHRoaXMuY2xlYXJBbGlnbkxpbmUoKTtcbiAgICBlYWNoKGhvcml6b250YWxMaW5lcywgZnVuY3Rpb24gKGxpbmUpIHtcbiAgICAgIGlmIChsaW5lWzRdLmlzVmlzaWJsZSkge1xuICAgICAgICBob3Jpem9udGFsRGlzLnB1c2goX3RoaXMuZ2V0TGluZURpc09iamVjdChsaW5lLCB0YykpO1xuICAgICAgICBob3Jpem9udGFsRGlzLnB1c2goX3RoaXMuZ2V0TGluZURpc09iamVjdChsaW5lLCBjYykpO1xuICAgICAgICBob3Jpem9udGFsRGlzLnB1c2goX3RoaXMuZ2V0TGluZURpc09iamVjdChsaW5lLCBiYykpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGVhY2godmVydGljYWxMaW5lcywgZnVuY3Rpb24gKGxpbmUpIHtcbiAgICAgIGlmIChsaW5lWzRdLmlzVmlzaWJsZSkge1xuICAgICAgICB2ZXJ0aWNhbERpcy5wdXNoKF90aGlzLmdldExpbmVEaXNPYmplY3QobGluZSwgbGMpKTtcbiAgICAgICAgdmVydGljYWxEaXMucHVzaChfdGhpcy5nZXRMaW5lRGlzT2JqZWN0KGxpbmUsIGNjKSk7XG4gICAgICAgIHZlcnRpY2FsRGlzLnB1c2goX3RoaXMuZ2V0TGluZURpc09iamVjdChsaW5lLCByYykpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGhvcml6b250YWxEaXMuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgcmV0dXJuIGEuZGlzIC0gYi5kaXM7XG4gICAgfSk7XG4gICAgdmVydGljYWxEaXMuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgcmV0dXJuIGEuZGlzIC0gYi5kaXM7XG4gICAgfSk7XG5cbiAgICBpZiAoaG9yaXpvbnRhbERpcy5sZW5ndGggIT09IDAgJiYgaG9yaXpvbnRhbERpc1swXS5kaXMgPCB0b2xlcmFuY2UpIHtcbiAgICAgIHBvaW50LnkgPSBob3Jpem9udGFsRGlzWzBdLmxpbmVbMV0gLSBob3Jpem9udGFsRGlzWzBdLnBvaW50LnkgKyBvcmlnaW5Qb2ludC55O1xuICAgICAgYWxpZ25DZmcgPSB7XG4gICAgICAgIHR5cGU6ICdpdGVtJyxcbiAgICAgICAgaG9yaXpvbnRhbHM6IFtob3Jpem9udGFsRGlzWzBdXVxuICAgICAgfTtcblxuICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCAzOyBpKyspIHtcbiAgICAgICAgaWYgKGhvcml6b250YWxEaXNbMF0uZGlzID09PSBob3Jpem9udGFsRGlzW2ldLmRpcykge1xuICAgICAgICAgIGFsaWduQ2ZnLmhvcml6b250YWxzLnB1c2goaG9yaXpvbnRhbERpc1tpXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodmVydGljYWxEaXMubGVuZ3RoICE9PSAwICYmIHZlcnRpY2FsRGlzWzBdLmRpcyA8IHRvbGVyYW5jZSkge1xuICAgICAgcG9pbnQueCA9IHZlcnRpY2FsRGlzWzBdLmxpbmVbMF0gLSB2ZXJ0aWNhbERpc1swXS5wb2ludC54ICsgb3JpZ2luUG9pbnQueDtcblxuICAgICAgaWYgKCFhbGlnbkNmZykge1xuICAgICAgICBhbGlnbkNmZyA9IHtcbiAgICAgICAgICB0eXBlOiAnaXRlbScsXG4gICAgICAgICAgdmVydGljYWxzOiBbdmVydGljYWxEaXNbMF1dXG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhbGlnbkNmZy52ZXJ0aWNhbHMgPSBbdmVydGljYWxEaXNbMF1dO1xuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBpID0gMTsgaSA8IDM7IGkrKykge1xuICAgICAgICBpZiAodmVydGljYWxEaXNbMF0uZGlzID09PSB2ZXJ0aWNhbERpc1tpXS5kaXMpIHtcbiAgICAgICAgICBhbGlnbkNmZy52ZXJ0aWNhbHMucHVzaCh2ZXJ0aWNhbERpc1tpXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoYWxpZ25DZmcpIHtcbiAgICAgIGFsaWduQ2ZnLmJib3ggPSBiYm94O1xuICAgICAgdGhpcy5hZGRBbGlnbkxpbmUoYWxpZ25DZmcpO1xuICAgIH1cbiAgfTtcbiAgLyoqXG4gICAqIOagueaNrumFjee9rumhuea3u+WKoOi+heWKqee6v1xuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gY2ZnXG4gICAqIEBtZW1iZXJvZiBBbGlnbkxpbmVcbiAgICovXG5cblxuICBTbmFwTGluZS5wcm90b3R5cGUuYWRkQWxpZ25MaW5lID0gZnVuY3Rpb24gKGNmZykge1xuICAgIHZhciBiYm94ID0gY2ZnLmJib3gsXG4gICAgICAgIHR5cGUgPSBjZmcudHlwZSxcbiAgICAgICAgaG9yaXpvbnRhbHMgPSBjZmcuaG9yaXpvbnRhbHMsXG4gICAgICAgIHZlcnRpY2FscyA9IGNmZy52ZXJ0aWNhbHM7XG4gICAgdmFyIF9hID0gdGhpcy5fY2ZncyxcbiAgICAgICAgbGluZVN0eWxlID0gX2EubGluZSxcbiAgICAgICAgYWxpZ25MaW5lcyA9IF9hLmFsaWduTGluZXM7XG4gICAgdmFyIGdyYXBoID0gdGhpcy5nZXQoJ2dyYXBoJyk7XG4gICAgdmFyIGdyb3VwID0gZ3JhcGguZ2V0KCdncm91cCcpO1xuXG4gICAgaWYgKHR5cGUgPT09ICdpdGVtJykge1xuICAgICAgaWYgKGhvcml6b250YWxzKSB7XG4gICAgICAgIGVhY2goaG9yaXpvbnRhbHMsIGZ1bmN0aW9uIChob3Jpem9udGFsKSB7XG4gICAgICAgICAgdmFyIHJlZkxpbmUgPSBob3Jpem9udGFsLmxpbmUsXG4gICAgICAgICAgICAgIHJlZlBvaW50ID0gaG9yaXpvbnRhbC5wb2ludDtcbiAgICAgICAgICB2YXIgbGluZUNlbnRlclggPSAocmVmTGluZVswXSArIHJlZkxpbmVbMl0pIC8gMjtcbiAgICAgICAgICB2YXIgeDE7XG4gICAgICAgICAgdmFyIHgyO1xuXG4gICAgICAgICAgaWYgKHJlZlBvaW50LnggPCBsaW5lQ2VudGVyWCkge1xuICAgICAgICAgICAgeDEgPSByZWZQb2ludC54IC0gYmJveC53aWR0aCAvIDI7XG4gICAgICAgICAgICB4MiA9IE1hdGgubWF4KHJlZkxpbmVbMF0sIHJlZkxpbmVbMl0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB4MSA9IHJlZlBvaW50LnggKyBiYm94LndpZHRoIC8gMjtcbiAgICAgICAgICAgIHgyID0gTWF0aC5taW4ocmVmTGluZVswXSwgcmVmTGluZVsyXSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIGxpbmVBdHRycyA9IG1peCh7XG4gICAgICAgICAgICB4MTogeDEsXG4gICAgICAgICAgICB5MTogcmVmTGluZVsxXSxcbiAgICAgICAgICAgIHgyOiB4MixcbiAgICAgICAgICAgIHkyOiByZWZMaW5lWzFdXG4gICAgICAgICAgfSwgbGluZVN0eWxlKTtcbiAgICAgICAgICB2YXIgbGluZSA9IGdyb3VwLmFkZFNoYXBlKCdsaW5lJywge1xuICAgICAgICAgICAgYXR0cnM6IGxpbmVBdHRycyxcbiAgICAgICAgICAgIGNhcHR1cmU6IGZhbHNlXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYWxpZ25MaW5lcy5wdXNoKGxpbmUpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHZlcnRpY2Fscykge1xuICAgICAgICBlYWNoKHZlcnRpY2FscywgZnVuY3Rpb24gKHZlcnRpY2FsKSB7XG4gICAgICAgICAgdmFyIHJlZkxpbmUgPSB2ZXJ0aWNhbC5saW5lLFxuICAgICAgICAgICAgICByZWZQb2ludCA9IHZlcnRpY2FsLnBvaW50O1xuICAgICAgICAgIHZhciBsaW5lQ2VudGVyWSA9IChyZWZMaW5lWzFdICsgcmVmTGluZVszXSkgLyAyO1xuICAgICAgICAgIHZhciB5MTtcbiAgICAgICAgICB2YXIgeTI7XG5cbiAgICAgICAgICBpZiAocmVmUG9pbnQueSA8IGxpbmVDZW50ZXJZKSB7XG4gICAgICAgICAgICB5MSA9IHJlZlBvaW50LnkgLSBiYm94LmhlaWdodCAvIDI7XG4gICAgICAgICAgICB5MiA9IE1hdGgubWF4KHJlZkxpbmVbMV0sIHJlZkxpbmVbM10pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB5MSA9IHJlZlBvaW50LnkgKyBiYm94LmhlaWdodCAvIDI7XG4gICAgICAgICAgICB5MiA9IE1hdGgubWluKHJlZkxpbmVbMV0sIHJlZkxpbmVbM10pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBsaW5lQXR0cyA9IG1peCh7XG4gICAgICAgICAgICB4MTogcmVmTGluZVswXSxcbiAgICAgICAgICAgIHkxOiB5MSxcbiAgICAgICAgICAgIHgyOiByZWZMaW5lWzBdLFxuICAgICAgICAgICAgeTI6IHkyXG4gICAgICAgICAgfSwgbGluZVN0eWxlKTtcbiAgICAgICAgICB2YXIgbGluZSA9IGdyb3VwLmFkZFNoYXBlKCdsaW5lJywge1xuICAgICAgICAgICAgYXR0cnM6IGxpbmVBdHRzLFxuICAgICAgICAgICAgY2FwdHVyZTogZmFsc2VcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBhbGlnbkxpbmVzLnB1c2gobGluZSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgLyoqXG4gICAqIOiOt+WPlueCueWIsOe6v+eahOi3neemu1xuICAgKlxuICAgKiBAcGFyYW0ge2FycmF5fSBsaW5lIFt4MSwgeTEsIHgyLCB5Ml0g57q/55qE5Zub5Liq54K5XG4gICAqIEBwYXJhbSB7b2JqZWN0fSBwb2ludCDngrnnmoR45ZKMeeWdkOagh+eCuSB7eCwgeX1cbiAgICogQHJldHVybnNcbiAgICogQG1lbWJlcm9mIEFsaWduTGluZVxuICAgKi9cblxuXG4gIFNuYXBMaW5lLnByb3RvdHlwZS5nZXRMaW5lRGlzT2JqZWN0ID0gZnVuY3Rpb24gKGxpbmUsIHBvaW50KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxpbmU6IGxpbmUsXG4gICAgICBwb2ludDogcG9pbnQsXG4gICAgICBkaXM6IHBvaW50TGluZURpc3RhbmNlKGxpbmUsIHBvaW50KVxuICAgIH07XG4gIH07XG5cbiAgU25hcExpbmUucHJvdG90eXBlLmdldENvbnRhaW5lciA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXQoJ2NvbnRhaW5lcicpO1xuICB9O1xuICAvKipcbiAgICog5ouW5Yqo6L+H56iL5Lit77yM5riF5qWa5LiK5qyh57uY5Yi255qE57q/XG4gICAqXG4gICAqIEBtZW1iZXJvZiBBbGlnbkxpbmVcbiAgICovXG5cblxuICBTbmFwTGluZS5wcm90b3R5cGUuY2xlYXJBbGlnbkxpbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGFsaWduTGluZXMgPSB0aGlzLl9jZmdzLmFsaWduTGluZXM7XG4gICAgZWFjaChhbGlnbkxpbmVzLCBmdW5jdGlvbiAobGluZSkge1xuICAgICAgbGluZS5yZW1vdmUoKTtcbiAgICB9KTtcbiAgICBhbGlnbkxpbmVzLmxlbmd0aCA9IDA7XG4gIH07XG4gIC8qKlxuICAgKiDmi5bliqjnu5PmnZ/ml7blgJnvvIzmg4XlhrXnvJPlrZjnmoToioLngrnnmoTovoXliqnnur/vvIzlkIzml7bliKDpmaTnu5jliLbnmoTnur9cbiAgICpcbiAgICogQG1lbWJlcm9mIEFsaWduTGluZVxuICAgKi9cblxuXG4gIFNuYXBMaW5lLnByb3RvdHlwZS5kZXN0b3J5ID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBfYSA9IHRoaXMuX2NmZ3MsXG4gICAgICAgIGhvcml6b250YWxMaW5lcyA9IF9hLmhvcml6b250YWxMaW5lcyxcbiAgICAgICAgdmVydGljYWxMaW5lcyA9IF9hLnZlcnRpY2FsTGluZXM7XG4gICAgdmFyIGdyYXBoID0gdGhpcy5nZXQoJ2dyYXBoJyk7XG4gICAgdmFyIG5vZGVzID0gZ3JhcGguZ2V0Tm9kZXMoKTtcbiAgICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICB2YXIgaXRlbUlkID0gbm9kZS5nZXQoJ2lkJyk7XG4gICAgICBkZWxldGUgaG9yaXpvbnRhbExpbmVzW2l0ZW1JZCArIFwidGx0clwiXTtcbiAgICAgIGRlbGV0ZSBob3Jpem9udGFsTGluZXNbaXRlbUlkICsgXCJsY3JjXCJdO1xuICAgICAgZGVsZXRlIGhvcml6b250YWxMaW5lc1tpdGVtSWQgKyBcImJsYnJcIl07XG4gICAgICBkZWxldGUgdmVydGljYWxMaW5lc1tpdGVtSWQgKyBcInRsYmxcIl07XG4gICAgICBkZWxldGUgdmVydGljYWxMaW5lc1tpdGVtSWQgKyBcInRjYmNcIl07XG4gICAgICBkZWxldGUgdmVydGljYWxMaW5lc1tpdGVtSWQgKyBcInRyYnJcIl07XG4gICAgfSk7XG4gICAgdGhpcy5jbGVhckFsaWduTGluZSgpO1xuICB9O1xuXG4gIHJldHVybiBTbmFwTGluZTtcbn0oQmFzZSk7XG5cbmV4cG9ydCBkZWZhdWx0IFNuYXBMaW5lOyIsInZhciBfX2V4dGVuZHMgPSB0aGlzICYmIHRoaXMuX19leHRlbmRzIHx8IGZ1bmN0aW9uICgpIHtcbiAgdmFyIF9leHRlbmRTdGF0aWNzID0gZnVuY3Rpb24gZXh0ZW5kU3RhdGljcyhkLCBiKSB7XG4gICAgX2V4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwge1xuICAgICAgX19wcm90b19fOiBbXVxuICAgIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgZC5fX3Byb3RvX18gPSBiO1xuICAgIH0gfHwgZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgIGZvciAodmFyIHAgaW4gYikge1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIF9leHRlbmRTdGF0aWNzKGQsIGIpO1xuICB9O1xuXG4gIHJldHVybiBmdW5jdGlvbiAoZCwgYikge1xuICAgIGlmICh0eXBlb2YgYiAhPT0gXCJmdW5jdGlvblwiICYmIGIgIT09IG51bGwpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcblxuICAgIF9leHRlbmRTdGF0aWNzKGQsIGIpO1xuXG4gICAgZnVuY3Rpb24gX18oKSB7XG4gICAgICB0aGlzLmNvbnN0cnVjdG9yID0gZDtcbiAgICB9XG5cbiAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG4gIH07XG59KCk7XG5cbnZhciBfX2Fzc2lnbiA9IHRoaXMgJiYgdGhpcy5fX2Fzc2lnbiB8fCBmdW5jdGlvbiAoKSB7XG4gIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodCkge1xuICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xuICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcblxuICAgICAgZm9yICh2YXIgcCBpbiBzKSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpIHRbcF0gPSBzW3BdO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0O1xuICB9O1xuXG4gIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufTtcblxuaW1wb3J0IHsgbW9kaWZ5Q1NTLCBjcmVhdGVEb20gfSBmcm9tICdAYW50di9kb20tdXRpbCc7XG5pbXBvcnQgQmFzZSBmcm9tICcuLi9iYXNlJztcbmltcG9ydCB7IGlzQXJyYXksIGlzTnVtYmVyLCB1bmlxdWVJZCB9IGZyb20gJ0BhbnR2L3V0aWwnO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJ0BhbnR2L2c2LWNvcmUnO1xuaW1wb3J0IHsgQ2FudmFzIH0gZnJvbSAnQGFudHYvZy1jYW52YXMnO1xudmFyIEFMTE9XX0VWRU5UUyA9IFsnY2xpY2snLCAnbW91c2VlbnRlciddO1xuXG52YXIgTGVnZW5kID1cbi8qKiBAY2xhc3MgKi9cbmZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgX19leHRlbmRzKExlZ2VuZCwgX3N1cGVyKTtcblxuICBmdW5jdGlvbiBMZWdlbmQoY29uZmlnKSB7XG4gICAgcmV0dXJuIF9zdXBlci5jYWxsKHRoaXMsIGNvbmZpZykgfHwgdGhpcztcbiAgfVxuXG4gIExlZ2VuZC5wcm90b3R5cGUuZ2V0RGVmYXVsdENmZ3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRhdGE6IHt9LFxuICAgICAgcG9zaXRpb246ICd0b3AnLFxuICAgICAgcGFkZGluZzogOCxcbiAgICAgIG1hcmdpbjogOCxcbiAgICAgIG9mZnNldFg6IDAsXG4gICAgICBvZmZzZXRZOiAwLFxuICAgICAgbGF5b3V0OiAnaG9yaXpvbnRhbCcsXG4gICAgICBmbGlwUGFnZTogZmFsc2UsXG4gICAgICBjb250YWluZXJTdHlsZToge30sXG4gICAgICBhbGlnbjogdW5kZWZpbmVkLFxuICAgICAgaG9yaVNlcDogOCxcbiAgICAgIHZlcnRpU2VwOiA4LFxuICAgICAgZmlsdGVyOiB7XG4gICAgICAgIGVuYWJsZTogZmFsc2UsXG4gICAgICAgIHRyaWdnZXI6ICdjbGljaydcbiAgICAgIH1cbiAgICB9O1xuICB9O1xuXG4gIExlZ2VuZC5wcm90b3R5cGUuaW5pdCA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmZvcm1hdEFycmF5KCdwYWRkaW5nJyk7XG4gICAgdGhpcy5mb3JtYXRBcnJheSgnbWFyZ2luJyk7XG4gICAgdmFyIGZpbHRlciA9IHRoaXMuZ2V0KCdmaWx0ZXInKSB8fCB7fTtcbiAgICB2YXIgbXVsdGlwbGUgPSBmaWx0ZXIubXVsdGlwbGU7XG4gICAgaWYgKG11bHRpcGxlICYmIGZpbHRlci50cmlnZ2VyID09PSAnbW91c2VlbnRlcicpIHRoaXMuc2V0KCdtdWx0aXBsZScsIGZhbHNlKTtcbiAgICB2YXIgYWxpZ24gPSB0aGlzLmdldCgnYWxpZ24nKTtcblxuICAgIGlmICghYWxpZ24pIHtcbiAgICAgIHZhciBwb3NpdGlvbnMgPSB0aGlzLmdldCgncG9zaXRpb24nKS5zcGxpdCgnLScpO1xuICAgICAgaWYgKHBvc2l0aW9ucy5pbmNsdWRlcygnbGVmdCcpKSBhbGlnbiA9ICdsZWZ0JztcbiAgICAgIGlmIChwb3NpdGlvbnMuaW5jbHVkZXMoJ3JpZ2h0JykpIGFsaWduID0gJ3JpZ2h0JztlbHNlIGFsaWduID0gJ2NlbnRlcic7XG4gICAgICB0aGlzLnNldCgnYWxpZ24nLCBhbGlnbik7XG4gICAgfVxuXG4gICAgdmFyIGdyYXBoID0gdGhpcy5nZXQoJ2dyYXBoJyk7XG4gICAgdmFyIGdyYXBoQ29udGFpbmVyID0gZ3JhcGguZ2V0KCdjb250YWluZXInKTtcbiAgICB2YXIgY29udGFpbmVyID0gY3JlYXRlRG9tKFwiPGRpdiBjbGFzcz0nZzYtbGVnZW5kLWNvbnRhaW5lcicgc3R5bGU9XFxcInBvc2l0aW9uOiBhYnNvbHV0ZTtcXFwiPjwvZGl2PlwiKTtcbiAgICBncmFwaENvbnRhaW5lci5hcHBlbmRDaGlsZChjb250YWluZXIpO1xuICAgIHRoaXMuc2V0KCdjb250YWluZXInLCBjb250YWluZXIpO1xuICAgIHZhciBzaXplID0gdGhpcy5yZW5kZXIoKTtcbiAgICBtb2RpZnlDU1MoY29udGFpbmVyLCB0aGlzLmdldENvbnRhaW5lclBvcyhzaXplKSk7XG4gICAgdGhpcy5iaW5kRXZlbnRzKCk7XG4gIH07XG5cbiAgTGVnZW5kLnByb3RvdHlwZS5nZXRDb250YWluZXJQb3MgPSBmdW5jdGlvbiAoc2l6ZSkge1xuICAgIGlmIChzaXplID09PSB2b2lkIDApIHtcbiAgICAgIHNpemUgPSBbMCwgMF07XG4gICAgfVxuXG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBncmFwaCA9IHNlbGYuZ2V0KCdncmFwaCcpO1xuICAgIHZhciBvZmZzZXRYID0gdGhpcy5nZXQoJ29mZnNldFgnKTtcbiAgICB2YXIgb2Zmc2V0WSA9IHRoaXMuZ2V0KCdvZmZzZXRZJyk7XG4gICAgdmFyIG1hcmdpbiA9IHRoaXMuZ2V0KCdtYXJnaW4nKTtcbiAgICB2YXIgcG9zaXRpb25zID0gdGhpcy5nZXQoJ3Bvc2l0aW9uJykuc3BsaXQoJy0nKTtcbiAgICB2YXIgcG9zSWR4TWFwID0ge1xuICAgICAgJ3RvcCc6IDAsXG4gICAgICAncmlnaHQnOiAxLFxuICAgICAgJ2JvdHRvbSc6IDIsXG4gICAgICAnbGVmdCc6IDNcbiAgICB9O1xuICAgIHZhciB4ID0gMCxcbiAgICAgICAgeSA9IDA7XG4gICAgdmFyIGNvbnRhaW5lckNTUyA9IHtcbiAgICAgIGxlZnQ6IChncmFwaC5nZXRXaWR0aCgpIC0gc2l6ZVswXSkgLyAyICsgeCxcbiAgICAgIHRvcDogKGdyYXBoLmdldEhlaWdodCgpIC0gc2l6ZVsxXSkgLyAyICsgeVxuICAgIH07XG4gICAgcG9zaXRpb25zLmZvckVhY2goZnVuY3Rpb24gKHBvcykge1xuICAgICAgdmFyIG1hcmdpblZhbHVlID0gbWFyZ2luW3Bvc0lkeE1hcFtwb3NdXTtcbiAgICAgIHZhciBrZXkgPSBwb3M7XG5cbiAgICAgIHN3aXRjaCAocG9zKSB7XG4gICAgICAgIGNhc2UgJ3RvcCc6XG4gICAgICAgICAgbWFyZ2luVmFsdWUgKz0geTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdsZWZ0JzpcbiAgICAgICAgICBtYXJnaW5WYWx1ZSArPSB4O1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICAgICAgbWFyZ2luVmFsdWUgPSBncmFwaC5nZXRIZWlnaHQoKSAtIHNpemVbMV0gLSBtYXJnaW5WYWx1ZSArIHk7XG4gICAgICAgICAga2V5ID0gJ3RvcCc7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBtYXJnaW5WYWx1ZSA9IGdyYXBoLmdldFdpZHRoKCkgLSBzaXplWzBdIC0gbWFyZ2luVmFsdWUgKyB4O1xuICAgICAgICAgIGtleSA9ICdsZWZ0JztcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgY29udGFpbmVyQ1NTW2tleV0gPSBtYXJnaW5WYWx1ZTtcbiAgICB9KTtcbiAgICBjb250YWluZXJDU1MudG9wICs9IG9mZnNldFkgKyBncmFwaC5nZXRDb250YWluZXIoKS5vZmZzZXRUb3A7XG4gICAgY29udGFpbmVyQ1NTLmxlZnQgKz0gb2Zmc2V0WCArIGdyYXBoLmdldENvbnRhaW5lcigpLm9mZnNldExlZnQ7XG4gICAgT2JqZWN0LmtleXMoY29udGFpbmVyQ1NTKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIGNvbnRhaW5lckNTU1trZXldID0gY29udGFpbmVyQ1NTW2tleV0gKyBcInB4XCI7XG4gICAgfSk7XG4gICAgcmV0dXJuIGNvbnRhaW5lckNTUztcbiAgfTsgLy8gY2xhc3MtbWV0aG9kcy11c2UtdGhpc1xuXG5cbiAgTGVnZW5kLnByb3RvdHlwZS5iaW5kRXZlbnRzID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgZmlsdGVyID0gc2VsZi5nZXQoJ2ZpbHRlcicpO1xuICAgIGlmICghZmlsdGVyIHx8ICFmaWx0ZXIuZW5hYmxlKSByZXR1cm47XG4gICAgdmFyIHRyaWdnZXIgPSBmaWx0ZXIudHJpZ2dlciB8fCAnY2xpY2snO1xuXG4gICAgaWYgKCFBTExPV19FVkVOVFMuaW5jbHVkZXModHJpZ2dlcikpIHtcbiAgICAgIGNvbnNvbGUud2FybignVHJpZ2dlciBmb3IgbGVnZW5kIGZpbHRlcmxpbmcgbXVzdCBiZSBcXCdjbGlja1xcJyBvciBcXCdtb3VzZWVudGVyXFwnLCBcXCdjbGlja1xcJyB3aWxsIHRha2UgZWZmZWN0IGJ5IGRlZmF1bHQuJyk7XG4gICAgICB0cmlnZ2VyID0gJ2NsaWNrJztcbiAgICB9XG5cbiAgICB2YXIgbGMgPSBzZWxmLmdldCgnbGVnZW5kQ2FudmFzJyk7XG5cbiAgICBpZiAodHJpZ2dlciA9PT0gJ21vdXNlZW50ZXInKSB7XG4gICAgICBsYy5vbignbm9kZS1jb250YWluZXI6bW91c2VlbnRlcicsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHJldHVybiBzZWxmLmZpbHRlckRhdGEoZSk7XG4gICAgICB9KTtcbiAgICAgIGxjLm9uKCdub2RlLWNvbnRhaW5lcjptb3VzZWxlYXZlJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgc2VsZi5jbGVhckZpbHRlcigpO1xuICAgICAgICBzZWxmLmNsZWFyQWN0aXZlTGVnZW5kKCk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGMub24oJ25vZGUtY29udGFpbmVyOmNsaWNrJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgcmV0dXJuIHNlbGYuZmlsdGVyRGF0YShlKTtcbiAgICAgIH0pO1xuICAgICAgbGMub24oJ2NsaWNrJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgaWYgKGUudGFyZ2V0ICYmIGUudGFyZ2V0LmlzQ2FudmFzICYmIGUudGFyZ2V0LmlzQ2FudmFzKCkpIHtcbiAgICAgICAgICBzZWxmLmNsZWFyRmlsdGVyKCk7XG4gICAgICAgICAgc2VsZi5jbGVhckFjdGl2ZUxlZ2VuZCgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH07XG4gIC8qKlxuICAgKiDmm7TmlrAgbGVnZW5kIOaVsOaNru+8jOW8gOaUvue7meeUqOaIt+aOp+WItlxuICAgKiBAcGFyYW0gcGFyYW1cbiAgICovXG5cblxuICBMZWdlbmQucHJvdG90eXBlLmNoYW5nZURhdGEgPSBmdW5jdGlvbiAoZGF0YSkge1xuICAgIHRoaXMuc2V0KCdkYXRhJywgZGF0YSk7XG4gICAgdmFyIHNpemUgPSB0aGlzLnJlbmRlcigpO1xuICAgIG1vZGlmeUNTUyh0aGlzLmdldCgnY29udGFpbmVyJyksIHRoaXMuZ2V0Q29udGFpbmVyUG9zKHNpemUpKTtcbiAgfTtcblxuICBMZWdlbmQucHJvdG90eXBlLmFjdGl2YXRlTGVnZW5kID0gZnVuY3Rpb24gKHNoYXBlKSB7XG4gICAgdmFyIGZpbHRlciA9IHRoaXMuZ2V0KCdmaWx0ZXInKTtcbiAgICB2YXIgbXVsdGlwbGUgPSBmaWx0ZXIgPT09IG51bGwgfHwgZmlsdGVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBmaWx0ZXIubXVsdGlwbGU7XG4gICAgaWYgKCFtdWx0aXBsZSkgdGhpcy5jbGVhckFjdGl2ZUxlZ2VuZCgpO1xuICAgIHZhciBzaGFwZUdyb3VwID0gc2hhcGUuZ2V0KCdwYXJlbnQnKTsgLy8g6Iul6KKr6auY5Lqu5YWD57Sg5bey57uP5aSE5LqOIGFjdGl2ZSDnirbmgIHvvIzliJnlj5bmtojlroPnmoQgYWN0aXZlIOeKtuaAgVxuICAgIC8vIOW5tuagueaNruebruWJjeaYr+WQpuacieWFtuS7liBhY3RpdmUg54q25oCB55qE5YWD57Sg5Yaz5a6a5piv5ZCm6KaB6K6+572u5Li6IGluYWN0aXZlIOeKtuaAgVxuXG4gICAgaWYgKHNoYXBlR3JvdXAuZ2V0KCdhY3RpdmUnKSkge1xuICAgICAgc2hhcGVHcm91cC5zZXQoJ2FjdGl2ZScsIGZhbHNlKTtcbiAgICAgIGlmICh0aGlzLmZpbmRMZWdlbmRJdGVtc0J5U3RhdGUoJ2FjdGl2ZScpLmxlbmd0aCkgc2hhcGVHcm91cC5zZXQoJ2luYWN0aXZlJywgdHJ1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNoYXBlR3JvdXAuc2V0KCdpbmFjdGl2ZScsIGZhbHNlKTtcbiAgICAgIHNoYXBlR3JvdXAuc2V0KCdhY3RpdmUnLCB0cnVlKTtcbiAgICB9IC8vIOW9k+ebruWJjeacieWFg+e0oOS4uiBhY3RpdmUg54q25oCB5pe277yM5bCG6Z2eIGFjdGl2ZSDnmoTlhYPntKDorr7nva7kuLogaW5hY3RpdmVcblxuXG4gICAgaWYgKHRoaXMuZmluZExlZ2VuZEl0ZW1zQnlTdGF0ZSgnYWN0aXZlJykubGVuZ3RoKSB7XG4gICAgICB0aGlzLmZpbmRMZWdlbmRJdGVtc0J5U3RhdGUoJ2FjdGl2ZScsICdhbGwnLCBmYWxzZSkuZm9yRWFjaChmdW5jdGlvbiAoc3ViR3JvdXApIHtcbiAgICAgICAgc3ViR3JvdXAuc2V0KCdpbmFjdGl2ZScsIHRydWUpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY2xlYXJBY3RpdmVMZWdlbmQoKTtcbiAgICB9IC8vIOiuvue9ruagt+W8j1xuXG5cbiAgICB2YXIgc3RhdGVTdHlsZXMgPSAoZmlsdGVyID09PSBudWxsIHx8IGZpbHRlciA9PT0gdm9pZCAwID8gdm9pZCAwIDogZmlsdGVyLmxlbmdlZFN0YXRlU3R5bGVzKSB8fCB7fTtcbiAgICB2YXIgbGVnZW5kSW5hY3RpdmUgPSAoc3RhdGVTdHlsZXMgPT09IG51bGwgfHwgc3RhdGVTdHlsZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHN0YXRlU3R5bGVzLmluYWN0aXZlKSB8fCB7XG4gICAgICBvcGFjaXR5OiAwLjUsXG4gICAgICAndGV4dC1zaGFwZSc6IHtcbiAgICAgICAgb3BhY2l0eTogMC41XG4gICAgICB9XG4gICAgfTtcbiAgICB2YXIgbGVnZW5kVGV4dEluYWN0aXZlID0gbGVnZW5kSW5hY3RpdmVbJ3RleHQtc2hhcGUnXSB8fCB7fTtcbiAgICB0aGlzLmZpbmRMZWdlbmRJdGVtc0J5U3RhdGUoJ2luYWN0aXZlJykuZm9yRWFjaChmdW5jdGlvbiAoc3ViR3JvdXApIHtcbiAgICAgIHZhciBfYSA9IHN1Ykdyb3VwLmdldCgnY2hpbGRyZW4nKSxcbiAgICAgICAgICBrZXlTaGFwZSA9IF9hWzBdLFxuICAgICAgICAgIHRleHQgPSBfYVsxXTtcblxuICAgICAga2V5U2hhcGUuYXR0cihfX2Fzc2lnbihfX2Fzc2lnbih7fSwga2V5U2hhcGUuZ2V0KCdvcmlBdHRycycpKSwgbGVnZW5kSW5hY3RpdmUpKTtcbiAgICAgIHRleHQuYXR0cihfX2Fzc2lnbihfX2Fzc2lnbih7fSwgdGV4dC5nZXQoJ29yaUF0dHJzJykpLCBsZWdlbmRUZXh0SW5hY3RpdmUpKTtcbiAgICB9KTtcbiAgICB2YXIgbGVnZW5kQWN0aXZlID0gKHN0YXRlU3R5bGVzID09PSBudWxsIHx8IHN0YXRlU3R5bGVzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzdGF0ZVN0eWxlcy5hY3RpdmUpIHx8IHtcbiAgICAgIHN0cm9rZTogJyMwMDAnLFxuICAgICAgbGluZVdpZHRoOiAyLFxuICAgICAgJ3RleHQtc2hhcGUnOiB7XG4gICAgICAgIGZvbnRXZWlnaHQ6ICdib2xkJ1xuICAgICAgfVxuICAgIH07XG4gICAgdmFyIGxlZ2VuZFRleHRBY3RpdmUgPSBsZWdlbmRBY3RpdmVbJ3RleHQtc2hhcGUnXSB8fCB7fTtcbiAgICB0aGlzLmZpbmRMZWdlbmRJdGVtc0J5U3RhdGUoJ2FjdGl2ZScpLmZvckVhY2goZnVuY3Rpb24gKHN1Ykdyb3VwKSB7XG4gICAgICB2YXIgX2EgPSBzdWJHcm91cC5nZXQoJ2NoaWxkcmVuJyksXG4gICAgICAgICAga2V5U2hhcGUgPSBfYVswXSxcbiAgICAgICAgICB0ZXh0ID0gX2FbMV07XG5cbiAgICAgIGtleVNoYXBlLmF0dHIoX19hc3NpZ24oX19hc3NpZ24oe30sIGtleVNoYXBlLmdldCgnb3JpQXR0cnMnKSksIGxlZ2VuZEFjdGl2ZSkpO1xuICAgICAgdGV4dC5hdHRyKF9fYXNzaWduKF9fYXNzaWduKHt9LCB0ZXh0LmdldCgnb3JpQXR0cnMnKSksIGxlZ2VuZFRleHRBY3RpdmUpKTtcbiAgICB9KTtcbiAgfTtcblxuICBMZWdlbmQucHJvdG90eXBlLmZpbmRMZWdlbmRJdGVtc0J5U3RhdGUgPSBmdW5jdGlvbiAoc3RhdGVOYW1lLCB0eXBlLCB2YWx1ZSkge1xuICAgIGlmICh0eXBlID09PSB2b2lkIDApIHtcbiAgICAgIHR5cGUgPSAnYWxsJztcbiAgICB9XG5cbiAgICBpZiAodmFsdWUgPT09IHZvaWQgMCkge1xuICAgICAgdmFsdWUgPSB0cnVlO1xuICAgIH1cblxuICAgIHZhciBncm91cCA9IHRoaXMuZ2V0KCdsZWdlbmRDYW52YXMnKS5maW5kKGZ1bmN0aW9uIChlKSB7XG4gICAgICByZXR1cm4gZS5nZXQoJ25hbWUnKSA9PT0gJ3Jvb3QnO1xuICAgIH0pO1xuICAgIHZhciBub2RlR3JvdXAgPSBncm91cC5maW5kKGZ1bmN0aW9uIChlKSB7XG4gICAgICByZXR1cm4gZS5nZXQoJ25hbWUnKSA9PT0gJ25vZGUtZ3JvdXAnO1xuICAgIH0pO1xuICAgIHZhciBlZGdlR3JvdXAgPSBncm91cC5maW5kKGZ1bmN0aW9uIChlKSB7XG4gICAgICByZXR1cm4gZS5nZXQoJ25hbWUnKSA9PT0gJ2VkZ2UtZ3JvdXAnO1xuICAgIH0pO1xuICAgIGlmICh0eXBlID09PSAnbm9kZScpIHJldHVybiBub2RlR3JvdXAuZ2V0KCdjaGlsZHJlbicpLmZpbHRlcihmdW5jdGlvbiAoZykge1xuICAgICAgcmV0dXJuICEhZy5nZXQoc3RhdGVOYW1lKSA9PT0gdmFsdWU7XG4gICAgfSk7XG4gICAgaWYgKHR5cGUgPT09ICdlZGdlJykgcmV0dXJuIGVkZ2VHcm91cC5nZXQoJ2NoaWxkcmVuJykuZmlsdGVyKGZ1bmN0aW9uIChnKSB7XG4gICAgICByZXR1cm4gISFnLmdldChzdGF0ZU5hbWUpID09PSB2YWx1ZTtcbiAgICB9KTtcbiAgICByZXR1cm4gbm9kZUdyb3VwLmdldCgnY2hpbGRyZW4nKS5maWx0ZXIoZnVuY3Rpb24gKGcpIHtcbiAgICAgIHJldHVybiAhIWcuZ2V0KHN0YXRlTmFtZSkgPT09IHZhbHVlO1xuICAgIH0pLmNvbmNhdChlZGdlR3JvdXAuZ2V0KCdjaGlsZHJlbicpLmZpbHRlcihmdW5jdGlvbiAoZykge1xuICAgICAgcmV0dXJuICEhZy5nZXQoc3RhdGVOYW1lKSA9PT0gdmFsdWU7XG4gICAgfSkpO1xuICB9O1xuXG4gIExlZ2VuZC5wcm90b3R5cGUuY2xlYXJBY3RpdmVMZWdlbmQgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGxnID0gdGhpcy5nZXQoJ2xlZ2VuZENhbnZhcycpO1xuICAgIHZhciBncm91cCA9IGxnLmZpbmQoZnVuY3Rpb24gKGUpIHtcbiAgICAgIHJldHVybiBlLmdldCgnbmFtZScpID09PSAncm9vdCc7XG4gICAgfSk7XG4gICAgdmFyIGdyb3VwcyA9IFtncm91cC5maW5kKGZ1bmN0aW9uIChlKSB7XG4gICAgICByZXR1cm4gZS5nZXQoJ25hbWUnKSA9PT0gJ25vZGUtZ3JvdXAnO1xuICAgIH0pLCBncm91cC5maW5kKGZ1bmN0aW9uIChlKSB7XG4gICAgICByZXR1cm4gZS5nZXQoJ25hbWUnKSA9PT0gJ2VkZ2UtZ3JvdXAnO1xuICAgIH0pXTtcbiAgICBncm91cHMuZm9yRWFjaChmdW5jdGlvbiAoaXRlbUdyb3VwKSB7XG4gICAgICBpdGVtR3JvdXAuZ2V0KCdjaGlsZHJlbicpLmZvckVhY2goZnVuY3Rpb24gKHN1Ykdyb3VwKSB7XG4gICAgICAgIHN1Ykdyb3VwLnNldCgnYWN0aXZlJywgZmFsc2UpO1xuICAgICAgICBzdWJHcm91cC5zZXQoJ2luYWN0aXZlJywgZmFsc2UpO1xuXG4gICAgICAgIHZhciBfYSA9IHN1Ykdyb3VwLmdldCgnY2hpbGRyZW4nKSxcbiAgICAgICAgICAgIGtleVNoYXBlID0gX2FbMF0sXG4gICAgICAgICAgICB0ZXh0ID0gX2FbMV07XG5cbiAgICAgICAga2V5U2hhcGUuYXR0cihrZXlTaGFwZS5nZXQoJ29yaUF0dHJzJykpO1xuICAgICAgICB0ZXh0LmF0dHIodGV4dC5nZXQoJ29yaUF0dHJzJykpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG4gIC8qKlxuICAgKiDpq5jkuq7lkoznva7ngbDlm77kvovvvIzlubbov4fmu6TkuLvlm77lhYPntKBcbiAgICogQHBhcmFtIHBhcmFtXG4gICAqL1xuXG5cbiAgTGVnZW5kLnByb3RvdHlwZS5maWx0ZXJEYXRhID0gZnVuY3Rpb24gKGUpIHtcbiAgICB2YXIgZmlsdGVyID0gdGhpcy5nZXQoJ2ZpbHRlcicpO1xuICAgIHZhciBmaWx0ZXJGdW5jdGlvbnMgPSBmaWx0ZXIgPT09IG51bGwgfHwgZmlsdGVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBmaWx0ZXIuZmlsdGVyRnVuY3Rpb25zO1xuICAgIGlmICghZmlsdGVyIHx8ICFmaWx0ZXJGdW5jdGlvbnMpIHJldHVybjtcbiAgICB2YXIgbGMgPSB0aGlzLmdldCgnbGVnZW5kQ2FudmFzJyk7XG4gICAgdmFyIGdyYXBoID0gdGhpcy5nZXQoJ2dyYXBoJyk7XG4gICAgdmFyIGFjdGl2ZVN0YXRlID0gZmlsdGVyLmdyYXBoQWN0aXZlU3RhdGUgfHwgJ2FjdGl2ZSc7XG4gICAgdmFyIGluYWN0aXZlU3RhdGUgPSBmaWx0ZXIuZ3JhcGhJbmFjdGl2ZVN0YXRlIHx8ICdpbmFjdGl2ZSc7XG4gICAgdmFyIG11bHRpcGxlID0gZmlsdGVyLm11bHRpcGxlO1xuICAgIHRoaXMuY2xlYXJGaWx0ZXIoKTtcbiAgICBpZiAoIW11bHRpcGxlKSB0aGlzLmNsZWFyQWN0aXZlTGVnZW5kKCk7IC8vIOiuvue9riBsZWdlbmQg55qE6auY5Lqu54q25oCBXG5cbiAgICB0aGlzLmFjdGl2YXRlTGVnZW5kKGUudGFyZ2V0KTtcbiAgICB2YXIgZ3JvdXAgPSBsYy5maW5kKGZ1bmN0aW9uIChlKSB7XG4gICAgICByZXR1cm4gZS5nZXQoJ25hbWUnKSA9PT0gJ3Jvb3QnO1xuICAgIH0pO1xuICAgIHZhciBub2RlR3JvdXAgPSBncm91cC5maW5kKGZ1bmN0aW9uIChlKSB7XG4gICAgICByZXR1cm4gZS5nZXQoJ25hbWUnKSA9PT0gJ25vZGUtZ3JvdXAnO1xuICAgIH0pO1xuICAgIHZhciBlZGdlR3JvdXAgPSBncm91cC5maW5kKGZ1bmN0aW9uIChlKSB7XG4gICAgICByZXR1cm4gZS5nZXQoJ25hbWUnKSA9PT0gJ2VkZ2UtZ3JvdXAnO1xuICAgIH0pO1xuICAgIHZhciBhY3RpdmVOb2RlTGVnZW5kID0gbm9kZUdyb3VwLmdldCgnY2hpbGRyZW4nKS5maWx0ZXIoZnVuY3Rpb24gKGUpIHtcbiAgICAgIHJldHVybiBlLmdldCgnYWN0aXZlJyk7XG4gICAgfSk7XG4gICAgdmFyIGFjdGl2ZUVkZ2VMZWdlbmQgPSBlZGdlR3JvdXAuZ2V0KCdjaGlsZHJlbicpLmZpbHRlcihmdW5jdGlvbiAoZSkge1xuICAgICAgcmV0dXJuIGUuZ2V0KCdhY3RpdmUnKTtcbiAgICB9KTtcbiAgICB2YXIgYWN0aXZlQ291bnQgPSAwO1xuICAgIHZhciB0eXBlRnVuY3MgPSBbJ2dldE5vZGVzJywgJ2dldEVkZ2VzJ107XG4gICAgdHlwZUZ1bmNzLmZvckVhY2goZnVuY3Rpb24gKHR5cGVGdW5jKSB7XG4gICAgICBncmFwaFt0eXBlRnVuY10oKS5mb3JFYWNoKGZ1bmN0aW9uIChncmFwaEl0ZW0pIHtcbiAgICAgICAgdmFyIGFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICB2YXIgYWN0aXZlTGVnZW5kID0gdHlwZUZ1bmMgPT09ICdnZXROb2RlcycgPyBhY3RpdmVOb2RlTGVnZW5kIDogYWN0aXZlRWRnZUxlZ2VuZDtcbiAgICAgICAgYWN0aXZlTGVnZW5kLmZvckVhY2goZnVuY3Rpb24gKGl0ZW1Hcm91cCkge1xuICAgICAgICAgIHZhciBmdW5jID0gZmlsdGVyRnVuY3Rpb25zW2l0ZW1Hcm91cC5nZXQoJ2lkJyldO1xuICAgICAgICAgIGFjdGl2ZSA9IGFjdGl2ZSB8fCBmdW5jKGdyYXBoSXRlbS5nZXRNb2RlbCgpKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGFjdGl2ZSkge1xuICAgICAgICAgIGdyYXBoLnNldEl0ZW1TdGF0ZShncmFwaEl0ZW0sIGluYWN0aXZlU3RhdGUsIGZhbHNlKTtcbiAgICAgICAgICBncmFwaC5zZXRJdGVtU3RhdGUoZ3JhcGhJdGVtLCBhY3RpdmVTdGF0ZSwgdHJ1ZSk7XG4gICAgICAgICAgYWN0aXZlQ291bnQrKztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBncmFwaC5zZXRJdGVtU3RhdGUoZ3JhcGhJdGVtLCBhY3RpdmVTdGF0ZSwgZmFsc2UpO1xuICAgICAgICAgIGdyYXBoLnNldEl0ZW1TdGF0ZShncmFwaEl0ZW0sIGluYWN0aXZlU3RhdGUsIHRydWUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBpZiAoIWFjdGl2ZUNvdW50KSB0eXBlRnVuY3MuZm9yRWFjaChmdW5jdGlvbiAodHlwZUZ1bmMpIHtcbiAgICAgIGdyYXBoW3R5cGVGdW5jXSgpLmZvckVhY2goZnVuY3Rpb24gKGdyYXBoSXRlbSkge1xuICAgICAgICBncmFwaC5jbGVhckl0ZW1TdGF0ZXMoZ3JhcGhJdGVtLCBbaW5hY3RpdmVTdGF0ZV0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG4gIC8qKlxuICAgKiDmuIXpmaTkuLvlm77nm7jlhbPnirbmgIFcbiAgICogQHBhcmFtIHBhcmFtXG4gICAqL1xuXG5cbiAgTGVnZW5kLnByb3RvdHlwZS5jbGVhckZpbHRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAvLyDmuIXpmaQgbGVnZW5kIOeahOmrmOS6rueKtuaAgVxuICAgIHZhciBncmFwaCA9IHRoaXMuZ2V0KCdncmFwaCcpO1xuICAgIHZhciBmaWx0ZXIgPSB0aGlzLmdldCgnZmlsdGVyJyk7XG4gICAgaWYgKCFmaWx0ZXIpIHJldHVybjtcbiAgICB2YXIgYWN0aXZlU3RhdGUgPSBmaWx0ZXIuZ3JhcGhBY3RpdmVTdGF0ZSB8fCAnYWN0aXZlJztcbiAgICB2YXIgaW5hY3RpdmVTdGF0ZSA9IGZpbHRlci5ncmFwaEluYWN0aXZlU3RhdGUgfHwgJ2luYWN0aXZlJztcbiAgICBncmFwaC5nZXROb2RlcygpLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgIGdyYXBoLmNsZWFySXRlbVN0YXRlcyhub2RlLCBbYWN0aXZlU3RhdGUsIGluYWN0aXZlU3RhdGVdKTtcbiAgICB9KTtcbiAgICBncmFwaC5nZXRFZGdlcygpLmZvckVhY2goZnVuY3Rpb24gKGVkZ2UpIHtcbiAgICAgIGdyYXBoLmNsZWFySXRlbVN0YXRlcyhlZGdlLCBbYWN0aXZlU3RhdGUsIGluYWN0aXZlU3RhdGVdKTtcbiAgICB9KTtcbiAgfTtcbiAgLyoqXG4gICAqIOa4suafkyBsZWdlbmQg5Zu+XG4gICAqIEBwYXJhbSBwYXJhbVxuICAgKi9cblxuXG4gIExlZ2VuZC5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICB0aGlzLnByb2Nlc3NEYXRhKCk7XG4gICAgdmFyIGxjID0gdGhpcy5nZXQoJ2xlZ2VuZENhbnZhcycpO1xuXG4gICAgaWYgKCFsYykge1xuICAgICAgbGMgPSBuZXcgQ2FudmFzKHtcbiAgICAgICAgY29udGFpbmVyOiB0aGlzLmdldCgnY29udGFpbmVyJyksXG4gICAgICAgIHdpZHRoOiAyMDAsXG4gICAgICAgIGhlaWdodDogMjAwXG4gICAgICB9KTtcbiAgICAgIHZhciByb290R3JvdXAgPSBsYy5hZGRHcm91cCh7XG4gICAgICAgIG5hbWU6ICdyb290J1xuICAgICAgfSk7XG4gICAgICByb290R3JvdXAuYWRkR3JvdXAoe1xuICAgICAgICBuYW1lOiAnbm9kZS1ncm91cCdcbiAgICAgIH0pO1xuICAgICAgcm9vdEdyb3VwLmFkZEdyb3VwKHtcbiAgICAgICAgbmFtZTogJ2VkZ2UtZ3JvdXAnXG4gICAgICB9KTsgLy8gbm9kZVN0YXRlU3R5bGVzOiB7XG4gICAgICAvLyAgIGxlZ2VuZEFjdGl2ZSxcbiAgICAgIC8vICAgbGVnZW5kSW5hY3RpdmVcbiAgICAgIC8vIH1cblxuICAgICAgdGhpcy5zZXQoJ2xlZ2VuZENhbnZhcycsIGxjKTtcbiAgICB9XG5cbiAgICB2YXIgZ3JvdXAgPSBsYy5maW5kKGZ1bmN0aW9uIChlKSB7XG4gICAgICByZXR1cm4gZS5nZXQoJ25hbWUnKSA9PT0gJ3Jvb3QnO1xuICAgIH0pO1xuICAgIHZhciBub2RlR3JvdXAgPSBncm91cC5maW5kKGZ1bmN0aW9uIChlKSB7XG4gICAgICByZXR1cm4gZS5nZXQoJ25hbWUnKSA9PT0gJ25vZGUtZ3JvdXAnO1xuICAgIH0pO1xuICAgIHZhciBlZGdlR3JvdXAgPSBncm91cC5maW5kKGZ1bmN0aW9uIChlKSB7XG4gICAgICByZXR1cm4gZS5nZXQoJ25hbWUnKSA9PT0gJ2VkZ2UtZ3JvdXAnO1xuICAgIH0pO1xuICAgIHZhciBpdGVtc0RhdGEgPSB0aGlzLmdldCgnaXRlbXNEYXRhJyk7XG4gICAgdmFyIGl0ZW1UeXBlcyA9IFsnbm9kZXMnLCAnZWRnZXMnXTtcbiAgICB2YXIgaXRlbUdyb3VwID0gW25vZGVHcm91cCwgZWRnZUdyb3VwXTtcbiAgICBpdGVtVHlwZXMuZm9yRWFjaChmdW5jdGlvbiAoaXRlbVR5cGUsIGkpIHtcbiAgICAgIGl0ZW1zRGF0YVtpdGVtVHlwZV0uZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICB2YXIgX2E7XG5cbiAgICAgICAgdmFyIHN1Ykdyb3VwID0gaXRlbUdyb3VwW2ldLmFkZEdyb3VwKHtcbiAgICAgICAgICBpZDogZGF0YS5pZCxcbiAgICAgICAgICBuYW1lOiAnbm9kZS1jb250YWluZXInXG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgYXR0cnM7XG4gICAgICAgIHZhciBzaGFwZVR5cGUgPSBkYXRhLnR5cGU7XG5cbiAgICAgICAgdmFyIF9iID0gX3RoaXMuZ2V0U2hhcGVTaXplKGRhdGEpLFxuICAgICAgICAgICAgd2lkdGggPSBfYi53aWR0aCxcbiAgICAgICAgICAgIGhlaWdodCA9IF9iLmhlaWdodCxcbiAgICAgICAgICAgIHIgPSBfYi5yO1xuXG4gICAgICAgIHZhciBzdHlsZSA9IF90aGlzLmdldFN0eWxlKGl0ZW1UeXBlLnN1YnN0cigwLCA0KSwgZGF0YSk7XG5cbiAgICAgICAgc3dpdGNoIChkYXRhLnR5cGUpIHtcbiAgICAgICAgICBjYXNlICdjaXJjbGUnOlxuICAgICAgICAgICAgYXR0cnMgPSB7XG4gICAgICAgICAgICAgIHI6IHIsXG4gICAgICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgICAgIHk6IDBcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgJ3JlY3QnOlxuICAgICAgICAgICAgYXR0cnMgPSB7XG4gICAgICAgICAgICAgIHdpZHRoOiB3aWR0aCxcbiAgICAgICAgICAgICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgICAgICAgICAgIHg6IC13aWR0aCAvIDIsXG4gICAgICAgICAgICAgIHk6IC1oZWlnaHQgLyAyXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlICdlbGxpcHNlJzpcbiAgICAgICAgICAgIGF0dHJzID0ge1xuICAgICAgICAgICAgICByMTogd2lkdGgsXG4gICAgICAgICAgICAgIHIyOiBoZWlnaHQsXG4gICAgICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgICAgIHk6IDBcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgJ2xpbmUnOlxuICAgICAgICAgICAgYXR0cnMgPSB7XG4gICAgICAgICAgICAgIHgxOiAtd2lkdGggLyAyLFxuICAgICAgICAgICAgICB5MTogMCxcbiAgICAgICAgICAgICAgeDI6IHdpZHRoIC8gMixcbiAgICAgICAgICAgICAgeTI6IDBcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBzaGFwZVR5cGUgPSAnbGluZSc7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgJ3F1YWRyYXRpYyc6XG4gICAgICAgICAgICBhdHRycyA9IHtcbiAgICAgICAgICAgICAgcGF0aDogW1snTScsIC13aWR0aCAvIDIsIDBdLCBbJ1EnLCAwLCB3aWR0aCAvIDIsIHdpZHRoIC8gMiwgMF1dXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgc2hhcGVUeXBlID0gJ3BhdGgnO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlICdjdWJpYyc6XG4gICAgICAgICAgICBhdHRycyA9IHtcbiAgICAgICAgICAgICAgcGF0aDogW1snTScsIC13aWR0aCAvIDIsIDBdLCBbJ0MnLCAtd2lkdGggLyA2LCB3aWR0aCAvIDIsIHdpZHRoIC8gNiwgLXdpZHRoIC8gMiwgd2lkdGggLyAyLCAwXV1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBzaGFwZVR5cGUgPSAncGF0aCc7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBhdHRycyA9IHtcbiAgICAgICAgICAgICAgcjogcixcbiAgICAgICAgICAgICAgeDogMCxcbiAgICAgICAgICAgICAgeTogMFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGtleVNoYXBlID0gc3ViR3JvdXAuYWRkU2hhcGUoc2hhcGVUeXBlLCB7XG4gICAgICAgICAgYXR0cnM6IF9fYXNzaWduKF9fYXNzaWduKHt9LCBhdHRycyksIHN0eWxlKSxcbiAgICAgICAgICBuYW1lOiBkYXRhLnR5cGUgKyBcIi1ub2RlLWtleVNoYXBlXCIsXG4gICAgICAgICAgb3JpQXR0cnM6IF9fYXNzaWduKHtcbiAgICAgICAgICAgIG9wYWNpdHk6IDFcbiAgICAgICAgICB9LCBzdHlsZSlcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGRhdGEubGFiZWwpIHtcbiAgICAgICAgICB2YXIga2V5U2hhcGVCQm94ID0ga2V5U2hhcGUuZ2V0QkJveCgpO1xuICAgICAgICAgIHZhciBsYWJlbFN0eWxlID0gKChfYSA9IGRhdGEubGFiZWxDZmcpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5zdHlsZSkgfHwge307XG5cbiAgICAgICAgICB2YXIgYXR0cnNfMSA9IF9fYXNzaWduKHtcbiAgICAgICAgICAgIHRleHRBbGlnbjogJ2JlZ2luJyxcbiAgICAgICAgICAgIGZvbnRTaXplOiAxMixcbiAgICAgICAgICAgIHRleHRCYXNlbGluZTogJ21pZGRsZScsXG4gICAgICAgICAgICBmaWxsOiAnIzAwMCcsXG4gICAgICAgICAgICBvcGFjaXR5OiAxLFxuICAgICAgICAgICAgZm9udFdlaWdodDogJ25vcm1hbCdcbiAgICAgICAgICB9LCBsYWJlbFN0eWxlKTtcblxuICAgICAgICAgIHN1Ykdyb3VwLmFkZFNoYXBlKCd0ZXh0Jywge1xuICAgICAgICAgICAgYXR0cnM6IF9fYXNzaWduKHtcbiAgICAgICAgICAgICAgeDoga2V5U2hhcGVCQm94Lm1heFggKyA0LFxuICAgICAgICAgICAgICB5OiAwLFxuICAgICAgICAgICAgICB0ZXh0OiBkYXRhLmxhYmVsXG4gICAgICAgICAgICB9LCBhdHRyc18xKSxcbiAgICAgICAgICAgIGNsYXNzTmFtZTogJ2xlZ2VuZC1sYWJlbCcsXG4gICAgICAgICAgICBuYW1lOiBkYXRhLnR5cGUgKyBcIi1ub2RlLXRleHRcIixcbiAgICAgICAgICAgIG9yaUF0dHJzOiBhdHRyc18xXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHZhciBwYWRkaW5nID0gdGhpcy5nZXQoJ3BhZGRpbmcnKTtcbiAgICB2YXIgdGl0bGVTaGFwZTtcbiAgICB2YXIgdGl0bGVHcm91cCA9IGdyb3VwLmZpbmQoZnVuY3Rpb24gKGUpIHtcbiAgICAgIHJldHVybiBlLmdldCgnbmFtZScpID09PSAndGl0bGUtY29udGFpbmVyJztcbiAgICB9KTtcbiAgICB2YXIgdGl0bGVHcm91cEJCb3ggPSB7XG4gICAgICBoZWlnaHQ6IDAsXG4gICAgICBtYXhZOiAwLFxuICAgICAgd2lkdGg6IDBcbiAgICB9O1xuXG4gICAgaWYgKHRoaXMuZ2V0KCd0aXRsZScpKSB7XG4gICAgICBpZiAoIXRpdGxlR3JvdXApIHtcbiAgICAgICAgdGl0bGVHcm91cCA9IGdyb3VwLmFkZEdyb3VwKHtcbiAgICAgICAgICBuYW1lOiAndGl0bGUtY29udGFpbmVyJ1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgdmFyIGRlZmF1bHRUaXRsZVN0eWxlID0ge1xuICAgICAgICBmb250U2l6ZTogMjAsXG4gICAgICAgIGZvbnRGYW1pbHk6ICdBcmlhbCcsXG4gICAgICAgIGZvbnRXZWlnaHQ6IDMwMCxcbiAgICAgICAgdGV4dEJhc2VsaW5lOiAndG9wJyxcbiAgICAgICAgdGV4dEFsaWduOiAnY2VudGVyJyxcbiAgICAgICAgZmlsbDogXCIjMDAwXCIsXG4gICAgICAgIHg6IDAsXG4gICAgICAgIHk6IHBhZGRpbmdbMF1cbiAgICAgIH07XG4gICAgICB2YXIgdGl0bGVDb25maWcgPSB0aGlzLmdldCgndGl0bGVDb25maWcnKSB8fCB7fTtcbiAgICAgIHZhciBzdHlsZSA9IE9iamVjdC5hc3NpZ24oZGVmYXVsdFRpdGxlU3R5bGUsIHRpdGxlQ29uZmlnLnN0eWxlIHx8IHt9KTtcbiAgICAgIHRpdGxlU2hhcGUgPSB0aXRsZUdyb3VwLmFkZFNoYXBlKCd0ZXh0Jywge1xuICAgICAgICBhdHRyczogX19hc3NpZ24oe1xuICAgICAgICAgIHRleHQ6IHRoaXMuZ2V0KCd0aXRsZScpXG4gICAgICAgIH0sIHN0eWxlKVxuICAgICAgfSk7XG4gICAgICB0aXRsZUdyb3VwQkJveCA9IHRpdGxlR3JvdXAuZ2V0Q2FudmFzQkJveCgpO1xuICAgICAgdGl0bGVHcm91cC5zZXRNYXRyaXgoWzEsIDAsIDAsIDAsIDEsIDAsIHRpdGxlQ29uZmlnLm9mZnNldFgsIHRpdGxlQ29uZmlnLm9mZnNldFksIDFdKTtcbiAgICB9XG5cbiAgICB0aGlzLmxheW91dEl0ZW1zKCk7XG4gICAgdmFyIGxjQkJveCA9IGdyb3VwLmdldENhbnZhc0JCb3goKTtcbiAgICB2YXIgbm9kZUdyb3VwQkJveCA9IG5vZGVHcm91cC5nZXRDYW52YXNCQm94KCk7IC8vIOiLpeacieWbvuW9oui2hei/h+i+ueeVjOeahOaDheWGte+8jOW5s+enu+WbnuadpVxuXG4gICAgdmFyIG5vZGVHcm91cEJlZ2luWCA9IG5vZGVHcm91cEJCb3gubWluWCA8IDAgPyBNYXRoLmFicyhub2RlR3JvdXBCQm94Lm1pblgpICsgcGFkZGluZ1szXSA6IHBhZGRpbmdbM107XG4gICAgdmFyIG5vZGVHcm91cEJlZ2luWSA9IHRpdGxlR3JvdXBCQm94Lm1heFkgPCBub2RlR3JvdXBCQm94Lm1pblkgPyBNYXRoLmFicyh0aXRsZUdyb3VwQkJveC5tYXhZIC0gbm9kZUdyb3VwQkJveC5taW5ZKSArIHBhZGRpbmdbMF0gOiB0aXRsZUdyb3VwQkJveC5tYXhZICsgcGFkZGluZ1swXTtcbiAgICB2YXIgbm9kZUdyb3VwTWF0cml4ID0gWzEsIDAsIDAsIDAsIDEsIDAsIG5vZGVHcm91cEJlZ2luWCwgbm9kZUdyb3VwQmVnaW5ZLCAxXTtcbiAgICBub2RlR3JvdXAuc2V0TWF0cml4KG5vZGVHcm91cE1hdHJpeCk7XG4gICAgbGNCQm94ID0gZ3JvdXAuZ2V0Q2FudmFzQkJveCgpO1xuICAgIHZhciBzaXplID0gW2xjQkJveC5taW5YICsgbGNCQm94LndpZHRoICsgcGFkZGluZ1sxXSwgbGNCQm94Lm1pblkgKyBsY0JCb3guaGVpZ2h0ICsgcGFkZGluZ1syXV07IC8vIOagueaNriBzaXplIOWSjCB0aXRsZUNvbmZpZyDosIPmlbQgdGl0bGUg5L2N572u77yM5YaN6LCD5pW0IG5vZGVHcm91cCDkvY3nva5cblxuICAgIGlmICh0aXRsZVNoYXBlKSB7XG4gICAgICB2YXIgdGl0bGVDb25maWcgPSBfX2Fzc2lnbih7XG4gICAgICAgIHBvc2l0aW9uOiAnY2VudGVyJyxcbiAgICAgICAgb2Zmc2V0WDogMCxcbiAgICAgICAgb2Zmc2V0WTogMFxuICAgICAgfSwgdGhpcy5nZXQoJ3RpdGxlQ29uZmlnJykpO1xuXG4gICAgICB0aXRsZUdyb3VwQkJveCA9IHRpdGxlR3JvdXAuZ2V0Q2FudmFzQkJveCgpO1xuICAgICAgdmFyIHRpdGxlR3JvdXBNYXRyaXggPSB0aXRsZUdyb3VwLmdldE1hdHJpeCgpIHx8IFsxLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAxXTtcblxuICAgICAgaWYgKHRpdGxlQ29uZmlnLnBvc2l0aW9uID09PSAnY2VudGVyJykge1xuICAgICAgICB0aXRsZUdyb3VwTWF0cml4WzZdID0gc2l6ZVswXSAvIDIgKyB0aXRsZUNvbmZpZy5vZmZzZXRYO1xuICAgICAgfSBlbHNlIGlmICh0aXRsZUNvbmZpZy5wb3NpdGlvbiA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICB0aXRsZUdyb3VwTWF0cml4WzZdID0gc2l6ZVswXSAtIHBhZGRpbmdbM10gKyB0aXRsZUNvbmZpZy5vZmZzZXRYO1xuICAgICAgICB0aXRsZVNoYXBlLmF0dHIoe1xuICAgICAgICAgIHRleHRBbGlnbjogJ3JpZ2h0J1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRpdGxlR3JvdXBNYXRyaXhbNl0gPSBwYWRkaW5nWzNdICsgdGl0bGVDb25maWcub2Zmc2V0WDtcbiAgICAgICAgdGl0bGVTaGFwZS5hdHRyKHtcbiAgICAgICAgICB0ZXh0QWxpZ246ICdsZWZ0J1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgdGl0bGVHcm91cC5zZXRNYXRyaXgodGl0bGVHcm91cE1hdHJpeCk7XG4gICAgICB0aXRsZUdyb3VwQkJveCA9IHRpdGxlR3JvdXAuZ2V0Q2FudmFzQkJveCgpOyAvLyDoi6XmnInlm77lvaLotoXov4fovrnnlYznmoTmg4XlhrXvvIzlubPnp7vlm57mnaVcblxuICAgICAgbm9kZUdyb3VwQmVnaW5YID0gbm9kZUdyb3VwQkJveC5taW5YIDwgMCA/IE1hdGguYWJzKG5vZGVHcm91cEJCb3gubWluWCkgKyBwYWRkaW5nWzNdIDogcGFkZGluZ1szXTtcbiAgICAgIG5vZGVHcm91cEJlZ2luWSA9IG5vZGVHcm91cEJCb3gubWluWSA8IHRpdGxlR3JvdXBCQm94Lm1heFkgPyBNYXRoLmFicyh0aXRsZUdyb3VwQkJveC5tYXhZIC0gbm9kZUdyb3VwQkJveC5taW5ZKSArIHBhZGRpbmdbMF0gOiB0aXRsZUdyb3VwQkJveC5tYXhZICsgcGFkZGluZ1swXTtcbiAgICAgIG5vZGVHcm91cE1hdHJpeCA9IFsxLCAwLCAwLCAwLCAxLCAwLCBub2RlR3JvdXBCZWdpblgsIG5vZGVHcm91cEJlZ2luWSwgMV07XG4gICAgICBub2RlR3JvdXAuc2V0TWF0cml4KG5vZGVHcm91cE1hdHJpeCk7XG4gICAgICB2YXIgZWRnZUdyb3VwTWF0cml4XzEgPSBbMSwgMCwgMCwgMCwgMSwgMCwgbm9kZUdyb3VwQmVnaW5YLCBub2RlR3JvdXBCZWdpblksIDFdO1xuICAgICAgaWYgKHRoaXMuZ2V0KCdsYXlvdXQnKSA9PT0gJ3ZlcnRpY2FsJykgZWRnZUdyb3VwTWF0cml4XzFbNl0gKz0gbm9kZUdyb3VwQkJveC5tYXhYICsgdGhpcy5nZXQoJ2hvcmlTZXAnKTtlbHNlIGVkZ2VHcm91cE1hdHJpeF8xWzddICs9IG5vZGVHcm91cEJCb3gubWF4WSArIHRoaXMuZ2V0KCd2ZXJ0aVNlcCcpO1xuICAgICAgZWRnZUdyb3VwLnNldE1hdHJpeChlZGdlR3JvdXBNYXRyaXhfMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIOayoeaciSB0aXRsZe+8jOS5n+mcgOimgeW5s+enuyBlZGdlR3JvdXBcbiAgICAgIG5vZGVHcm91cEJCb3ggPSBub2RlR3JvdXAuZ2V0Q2FudmFzQkJveCgpO1xuICAgICAgdmFyIGVkZ2VHcm91cE1hdHJpeF8yID0gWzEsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDFdO1xuICAgICAgaWYgKHRoaXMuZ2V0KCdsYXlvdXQnKSA9PT0gJ3ZlcnRpY2FsJykgZWRnZUdyb3VwTWF0cml4XzJbNl0gKz0gbm9kZUdyb3VwTWF0cml4WzZdICsgbm9kZUdyb3VwQkJveC5tYXhYICsgdGhpcy5nZXQoJ2hvcmlTZXAnKTtlbHNlIGVkZ2VHcm91cE1hdHJpeF8yWzddICs9IG5vZGVHcm91cE1hdHJpeFs3XSArIG5vZGVHcm91cEJCb3gubWF4WSArIHRoaXMuZ2V0KCd2ZXJ0aVNlcCcpO1xuICAgICAgZWRnZUdyb3VwLnNldE1hdHJpeChlZGdlR3JvdXBNYXRyaXhfMik7XG4gICAgfVxuXG4gICAgbGNCQm94ID0gZ3JvdXAuZ2V0Q2FudmFzQkJveCgpO1xuICAgIG5vZGVHcm91cEJCb3ggPSBub2RlR3JvdXAuZ2V0Q2FudmFzQkJveCgpO1xuICAgIG5vZGVHcm91cE1hdHJpeCA9IG5vZGVHcm91cC5nZXRNYXRyaXgoKSB8fCBbMSwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMV07XG4gICAgdmFyIGVkZ2VHcm91cE1hdHJpeCA9IGVkZ2VHcm91cC5nZXRNYXRyaXgoKSB8fCBbMSwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMV07XG4gICAgdmFyIGVkZ2VHcm91cEJCb3ggPSBlZGdlR3JvdXAuZ2V0Q2FudmFzQkJveCgpO1xuICAgIHNpemUgPSBbTWF0aC5tYXgobm9kZUdyb3VwQkJveC53aWR0aCArIG5vZGVHcm91cE1hdHJpeFs2XSwgZWRnZUdyb3VwQkJveC53aWR0aCArIGVkZ2VHcm91cE1hdHJpeFs2XSkgKyBwYWRkaW5nWzFdLCBNYXRoLm1heChub2RlR3JvdXBCQm94LmhlaWdodCArIG5vZGVHcm91cE1hdHJpeFs3XSwgZWRnZUdyb3VwQkJveC5oZWlnaHQgKyBlZGdlR3JvdXBNYXRyaXhbN10pICsgcGFkZGluZ1syXV07XG4gICAgbGMuY2hhbmdlU2l6ZShzaXplWzBdLCBzaXplWzFdKTsgLy8g5pu05paw5a655Zmo6IOM5pmv5qC35byPXG5cbiAgICB2YXIgY29udGFpbmVyU3R5bGUgPSB0aGlzLmdldCgnY29udGFpbmVyU3R5bGUnKTtcbiAgICB2YXIgdmlld3BvcnRNYXRyaXggPSBncm91cC5nZXRNYXRyaXgoKSB8fCBbMSwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMV07XG4gICAgdmFyIGJlZ2luUG9zID0gVXRpbC5pbnZlcnRNYXRyaXgoe1xuICAgICAgeDogMCxcbiAgICAgIHk6IDBcbiAgICB9LCB2aWV3cG9ydE1hdHJpeCk7XG4gICAgdmFyIGJhY2tSZWN0ID0gZ3JvdXAuYWRkU2hhcGUoJ3JlY3QnLCB7XG4gICAgICBhdHRyczogX19hc3NpZ24oe1xuICAgICAgICB4OiBiZWdpblBvcy54ICsgKGNvbnRhaW5lclN0eWxlLmxpbmVXaWR0aCB8fCAxKSxcbiAgICAgICAgeTogYmVnaW5Qb3MueSArIChjb250YWluZXJTdHlsZS5saW5lV2lkdGggfHwgMSksXG4gICAgICAgIHdpZHRoOiBzaXplWzBdIC0gMiAqIChjb250YWluZXJTdHlsZS5saW5lV2lkdGggfHwgMSksXG4gICAgICAgIGhlaWdodDogc2l6ZVsxXSAtIDIgKiAoY29udGFpbmVyU3R5bGUubGluZVdpZHRoIHx8IDEpLFxuICAgICAgICBmaWxsOiBcIiNmMDBcIixcbiAgICAgICAgc3Ryb2tlOiAnIzAwMCcsXG4gICAgICAgIGxpbmVXaWR0aDogMSxcbiAgICAgICAgb3BhY2l0eTogMC41XG4gICAgICB9LCBjb250YWluZXJTdHlsZSksXG4gICAgICBuYW1lOiAnbGVnZW5kLWJhY2stcmVjdCcsXG4gICAgICBjYXB0dXJlOiBmYWxzZVxuICAgIH0pO1xuICAgIGJhY2tSZWN0LnRvQmFjaygpO1xuICAgIHJldHVybiBzaXplO1xuICB9O1xuXG4gIExlZ2VuZC5wcm90b3R5cGUubGF5b3V0SXRlbXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGxjID0gdGhpcy5nZXQoJ2xlZ2VuZENhbnZhcycpO1xuICAgIHZhciBob3JpU2VwID0gdGhpcy5nZXQoJ2hvcmlTZXAnKTtcbiAgICB2YXIgdmVydGlTZXAgPSB0aGlzLmdldCgndmVydGlTZXAnKTtcbiAgICB2YXIgbGF5b3V0ID0gdGhpcy5nZXQoJ2xheW91dCcpO1xuICAgIHZhciBhbGlnbiA9IHRoaXMuZ2V0KCdhbGlnbicpO1xuICAgIHZhciBiZWdpbiA9IFswLCAwXTtcbiAgICB2YXIgZ3JvdXAgPSBsYy5maW5kKGZ1bmN0aW9uIChlKSB7XG4gICAgICByZXR1cm4gZS5nZXQoJ25hbWUnKSA9PT0gJ3Jvb3QnO1xuICAgIH0pO1xuICAgIHZhciBub2RlR3JvdXAgPSBncm91cC5maW5kKGZ1bmN0aW9uIChlKSB7XG4gICAgICByZXR1cm4gZS5nZXQoJ25hbWUnKSA9PT0gJ25vZGUtZ3JvdXAnO1xuICAgIH0pO1xuICAgIHZhciBlZGdlR3JvdXAgPSBncm91cC5maW5kKGZ1bmN0aW9uIChlKSB7XG4gICAgICByZXR1cm4gZS5nZXQoJ25hbWUnKSA9PT0gJ2VkZ2UtZ3JvdXAnO1xuICAgIH0pO1xuICAgIHZhciBub2RlTGVnZW5kU2l6ZSA9IHtcbiAgICAgIG1pbjogMCxcbiAgICAgIG1heDogLUluZmluaXR5XG4gICAgfTtcbiAgICB2YXIgcm93TWF4WSA9IC1JbmZpbml0eTtcbiAgICBub2RlR3JvdXAuZ2V0KCdjaGlsZHJlbicpLmZvckVhY2goZnVuY3Rpb24gKGNOb2RlR3JvdXAsIGkpIHtcbiAgICAgIGlmIChpID09PSAwKSBub2RlTGVnZW5kU2l6ZS5taW4gPSBiZWdpblswXTtcbiAgICAgIHZhciBrZXlTaGFwZSA9IGNOb2RlR3JvdXAuZ2V0KCdjaGlsZHJlbicpWzBdO1xuICAgICAgdmFyIGJib3ggPSBjTm9kZUdyb3VwLmdldENhbnZhc0JCb3goKTtcblxuICAgICAgdmFyIF9hID0ga2V5U2hhcGUuZ2V0QkJveCgpLFxuICAgICAgICAgIGtleVNoYXBlV2lkdGggPSBfYS53aWR0aCxcbiAgICAgICAgICBrZXlTaGFwZUhlaWdodCA9IF9hLmhlaWdodDtcblxuICAgICAgdmFyIGN1ckhlaWdodCA9IDAsXG4gICAgICAgICAgeCA9IDAsXG4gICAgICAgICAgeSA9IDA7XG5cbiAgICAgIGlmIChsYXlvdXQgPT09ICd2ZXJ0aWNhbCcpIHtcbiAgICAgICAgeCA9IGJlZ2luWzFdO1xuICAgICAgICB5ID0gYmVnaW5bMF0gKyBrZXlTaGFwZVdpZHRoIC8gMjtcbiAgICAgICAgYmVnaW5bMF0gPSB5ICsgYmJveC5oZWlnaHQgKyB2ZXJ0aVNlcDtcbiAgICAgICAgY3VySGVpZ2h0ID0gYmJveC5tYXhYICsgeCArIGtleVNoYXBlV2lkdGggLyAyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgeCA9IGJlZ2luWzBdICsga2V5U2hhcGVXaWR0aCAvIDI7XG4gICAgICAgIHkgPSBiZWdpblsxXTtcbiAgICAgICAgYmVnaW5bMF0gPSB4ICsgYmJveC53aWR0aCArIGhvcmlTZXA7XG4gICAgICAgIGN1ckhlaWdodCA9IGJib3gubWF4WSArIHkgKyBrZXlTaGFwZUhlaWdodCAvIDI7XG4gICAgICB9XG5cbiAgICAgIGlmIChiZWdpblswXSA+IG5vZGVMZWdlbmRTaXplLm1heCkgbm9kZUxlZ2VuZFNpemUubWF4ID0gYmVnaW5bMF07XG4gICAgICBpZiAoY3VySGVpZ2h0ID4gcm93TWF4WSkgcm93TWF4WSA9IGN1ckhlaWdodDtcbiAgICAgIGNOb2RlR3JvdXAuc2V0TWF0cml4KFsxLCAwLCAwLCAwLCAxLCAwLCB4LCB5LCAxXSk7XG4gICAgfSk7XG4gICAgdmFyIG53ID0gbm9kZUxlZ2VuZFNpemUubWF4IC0gbm9kZUxlZ2VuZFNpemUubWluO1xuICAgIHZhciBlZGdlTGVnZW5kU2l6ZSA9IHtcbiAgICAgIG1pbjogMCxcbiAgICAgIG1heDogLUluZmluaXR5XG4gICAgfTtcbiAgICB2YXIgbm9kZUdyb3VwQkJveCA9IG5vZGVHcm91cC5nZXRDYW52YXNCQm94KCk7XG4gICAgYmVnaW5bMF0gPSAwO1xuICAgIGJlZ2luWzFdID0gbGF5b3V0ID09PSAndmVydGljYWwnID8gbm9kZUdyb3VwQkJveC5tYXhYICsgaG9yaVNlcCA6IG5vZGVHcm91cEJCb3gubWF4WSArIHZlcnRpU2VwO1xuICAgIGVkZ2VHcm91cC5nZXQoJ2NoaWxkcmVuJykuZm9yRWFjaChmdW5jdGlvbiAoc3ViR3JvdXAsIGkpIHtcbiAgICAgIGlmIChpID09PSAwKSBlZGdlTGVnZW5kU2l6ZS5taW4gPSBiZWdpblswXTtcbiAgICAgIHZhciBrZXlTaGFwZSA9IHN1Ykdyb3VwLmdldCgnY2hpbGRyZW4nKVswXTtcbiAgICAgIHZhciBiYm94ID0gc3ViR3JvdXAuZ2V0Q2FudmFzQkJveCgpO1xuXG4gICAgICB2YXIgX2EgPSBrZXlTaGFwZS5nZXRCQm94KCksXG4gICAgICAgICAga2V5U2hhcGVXaWR0aCA9IF9hLndpZHRoLFxuICAgICAgICAgIGtleVNoYXBlSGVpZ2h0ID0gX2EuaGVpZ2h0O1xuXG4gICAgICB2YXIgeCA9IDAsXG4gICAgICAgICAgeSA9IDA7XG5cbiAgICAgIGlmIChsYXlvdXQgPT09ICd2ZXJ0aWNhbCcpIHtcbiAgICAgICAgeCA9IGJlZ2luWzFdO1xuICAgICAgICB5ID0gYmVnaW5bMF07XG4gICAgICAgIGJlZ2luWzBdID0geSArIGJib3guaGVpZ2h0ICsgdmVydGlTZXA7XG4gICAgICAgIHN1Ykdyb3VwLnNldE1hdHJpeChbMSwgMCwgMCwgMCwgMSwgMCwgMCwgeSArIGtleVNoYXBlSGVpZ2h0IC8gMiwgMV0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgeCA9IGJlZ2luWzBdO1xuICAgICAgICB5ID0gYmVnaW5bMV07XG4gICAgICAgIGJlZ2luWzBdID0geCArIGJib3gud2lkdGggKyBob3JpU2VwO1xuICAgICAgICBzdWJHcm91cC5zZXRNYXRyaXgoWzEsIDAsIDAsIDAsIDEsIDAsIHggKyBrZXlTaGFwZVdpZHRoIC8gMiwgMCwgMV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoYmVnaW5bMF0gPiBlZGdlTGVnZW5kU2l6ZS5tYXgpIGVkZ2VMZWdlbmRTaXplLm1heCA9IGJlZ2luWzBdO1xuICAgIH0pO1xuICAgIHZhciBldyA9IGVkZ2VMZWdlbmRTaXplLm1heCAtIGVkZ2VMZWdlbmRTaXplLm1pbjtcblxuICAgIGlmIChhbGlnbiAmJiBhbGlnbiAhPT0gJycgJiYgYWxpZ24gIT09ICdsZWZ0Jykge1xuICAgICAgdmFyIHdpZHRoRGlmZiA9IG53IC0gZXc7XG4gICAgICB2YXIgbW92ZW1lbnRfMSA9IGFsaWduID09PSAnY2VudGVyJyA/IE1hdGguYWJzKHdpZHRoRGlmZikgLyAyIDogTWF0aC5hYnMod2lkdGhEaWZmKTtcbiAgICAgIHZhciBzaG91bGRBZGp1c3RHcm91cCA9IHdpZHRoRGlmZiA8IDAgPyBub2RlR3JvdXAgOiBlZGdlR3JvdXA7XG4gICAgICBzaG91bGRBZGp1c3RHcm91cC5nZXQoJ2NoaWxkcmVuJykuZm9yRWFjaChmdW5jdGlvbiAoc3ViR3JvdXApIHtcbiAgICAgICAgdmFyIG1hdHJpeCA9IHN1Ykdyb3VwLmdldE1hdHJpeCgpIHx8IFsxLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAxXTtcbiAgICAgICAgaWYgKGxheW91dCA9PT0gJ3ZlcnRpY2FsJykgbWF0cml4WzddICs9IG1vdmVtZW50XzE7ZWxzZSBtYXRyaXhbNl0gKz0gbW92ZW1lbnRfMTtcbiAgICAgICAgc3ViR3JvdXAuc2V0TWF0cml4KG1hdHJpeCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgTGVnZW5kLnByb3RvdHlwZS5wcm9jZXNzRGF0YSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZGF0YSA9IHRoaXMuZ2V0KCdkYXRhJyk7XG4gICAgdmFyIGl0ZW1zRGF0YSA9IHtcbiAgICAgIG5vZGVzOiBbXSxcbiAgICAgIGVkZ2VzOiBbXVxuICAgIH07XG5cbiAgICBpZiAoZGF0YS5ub2Rlcykge1xuICAgICAgZGF0YS5ub2Rlcy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgIHJldHVybiBhLm9yZGVyIC0gYi5vcmRlcjtcbiAgICAgIH0pO1xuICAgICAgZGF0YS5ub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2U7XG5cbiAgICAgICAgdmFyIHNpemUgPSBub2RlLnNpemUgfHwgWygoX2EgPSBub2RlLnN0eWxlKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Eud2lkdGgpIHx8ICgoX2IgPSBub2RlLnN0eWxlKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IucikgfHwgOCwgKChfYyA9IG5vZGUuc3R5bGUpID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy5oZWlnaHQpIHx8ICgoX2QgPSBub2RlLnN0eWxlKSA9PT0gbnVsbCB8fCBfZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2QucikgfHwgOF07XG4gICAgICAgIHZhciBsYWJlbFN0eWxlID0gKChfZSA9IG5vZGUubGFiZWxDZmcpID09PSBudWxsIHx8IF9lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZS5zdHlsZSkgfHwge307XG4gICAgICAgIGl0ZW1zRGF0YS5ub2Rlcy5wdXNoKHtcbiAgICAgICAgICBpZDogbm9kZS5pZCB8fCB1bmlxdWVJZCgpLFxuICAgICAgICAgIHR5cGU6IG5vZGUudHlwZSB8fCAnY2lyY2xlJyxcbiAgICAgICAgICBzdHlsZTogX19hc3NpZ24oe30sIG5vZGUuc3R5bGUpLFxuICAgICAgICAgIG9yZGVyOiBub2RlLm9yZGVyLFxuICAgICAgICAgIGxhYmVsOiBub2RlLmxhYmVsLFxuICAgICAgICAgIGl0ZW1UeXBlOiAnbm9kZScsXG4gICAgICAgICAgc2l6ZTogc2l6ZSxcbiAgICAgICAgICBsYWJlbENmZzoge1xuICAgICAgICAgICAgcG9zaXRpb246ICdyaWdodCcsXG4gICAgICAgICAgICBzdHlsZTogX19hc3NpZ24oe1xuICAgICAgICAgICAgICBmb250RmFtaWx5OiBcIkFyaWFsXCJcbiAgICAgICAgICAgIH0sIGxhYmVsU3R5bGUpXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChkYXRhLmVkZ2VzKSB7XG4gICAgICBkYXRhLmVkZ2VzLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgcmV0dXJuIGEub3JkZXIgLSBiLm9yZGVyO1xuICAgICAgfSk7XG4gICAgICBkYXRhLmVkZ2VzLmZvckVhY2goZnVuY3Rpb24gKGVkZ2UpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcblxuICAgICAgICB2YXIgdHlwZSA9IGVkZ2UudHlwZSB8fCAnbGluZSc7XG4gICAgICAgIGlmIChlZGdlLnR5cGUgPT09ICdjdWJpYy1ob3Jpem9udGFsJykgdHlwZSA9ICdjdWJpYyc7XG4gICAgICAgIHZhciBsYWJlbFN0eWxlID0gKChfYSA9IGVkZ2UubGFiZWxDZmcpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5zdHlsZSkgfHwge307XG4gICAgICAgIHZhciBzaXplID0gZWRnZS5zaXplIHx8IFsoKF9iID0gZWRnZS5zdHlsZSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLndpZHRoKSB8fCA4LCAxXTtcbiAgICAgICAgaXRlbXNEYXRhLmVkZ2VzLnB1c2goe1xuICAgICAgICAgIGlkOiBlZGdlLmlkIHx8IHVuaXF1ZUlkKCksXG4gICAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgICBzaXplOiBzaXplLFxuICAgICAgICAgIHN0eWxlOiBfX2Fzc2lnbih7XG4gICAgICAgICAgICBsaW5lV2lkdGg6IGlzQXJyYXkoc2l6ZSkgPyBzaXplWzFdIDogMVxuICAgICAgICAgIH0sIGVkZ2Uuc3R5bGUpLFxuICAgICAgICAgIG9yZGVyOiBlZGdlLm9yZGVyLFxuICAgICAgICAgIGxhYmVsOiBlZGdlLmxhYmVsLFxuICAgICAgICAgIGl0ZW1UeXBlOiAnZWRnZScsXG4gICAgICAgICAgbGFiZWxDZmc6IHtcbiAgICAgICAgICAgIHBvc2l0aW9uOiAncmlnaHQnLFxuICAgICAgICAgICAgc3R5bGU6IF9fYXNzaWduKHtcbiAgICAgICAgICAgICAgZm9udEZhbWlseTogXCJBcmlhbFwiXG4gICAgICAgICAgICB9LCBsYWJlbFN0eWxlKVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLnNldCgnaXRlbXNEYXRhJywgaXRlbXNEYXRhKTtcbiAgfTtcblxuICBMZWdlbmQucHJvdG90eXBlLmdldENvbnRhaW5lciA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXQoJ2NvbnRhaW5lcicpO1xuICB9O1xuXG4gIExlZ2VuZC5wcm90b3R5cGUuZm9ybWF0QXJyYXkgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgdmFyIHZhbHVlID0gdGhpcy5nZXQoa2V5KTtcbiAgICBpZiAoaXNOdW1iZXIodmFsdWUpKSB0aGlzLnNldChrZXksIFt2YWx1ZSwgdmFsdWUsIHZhbHVlLCB2YWx1ZV0pO2Vsc2UgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgICBzd2l0Y2ggKHZhbHVlLmxlbmd0aCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgdGhpcy5zZXQoa2V5LCBbMCwgMCwgMCwgMF0pO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICB0aGlzLnNldChrZXksIFt2YWx1ZVswXSwgdmFsdWVbMF0sIHZhbHVlWzBdLCB2YWx1ZVswXV0pO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICB0aGlzLnNldChrZXksIFt2YWx1ZVswXSwgdmFsdWVbMV0sIHZhbHVlWzBdLCB2YWx1ZVsxXV0pO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICB0aGlzLnNldChrZXksIFt2YWx1ZVswXSwgdmFsdWVbMV0sIHZhbHVlWzJdLCB2YWx1ZVsxXV0pO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmdldChrZXkpO1xuICB9O1xuXG4gIExlZ2VuZC5wcm90b3R5cGUuZ2V0U2hhcGVTaXplID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgICB2YXIgd2lkdGgsIGhlaWdodCwgcjtcblxuICAgIGlmIChkYXRhLnNpemUpIHtcbiAgICAgIGlmIChpc0FycmF5KGRhdGEuc2l6ZSkpIHtcbiAgICAgICAgd2lkdGggPSBkYXRhLnNpemVbMF07XG4gICAgICAgIGhlaWdodCA9IGRhdGEuc2l6ZVsxXSB8fCBkYXRhLnNpemVbMF07XG4gICAgICAgIHIgPSBkYXRhLnNpemVbMF0gLyAyO1xuICAgICAgfSBlbHNlIGlmIChpc051bWJlcihkYXRhLnNpemUpKSB7XG4gICAgICAgIHdpZHRoID0gZGF0YS5zaXplO1xuICAgICAgICBoZWlnaHQgPSBkYXRhLnNpemU7XG4gICAgICAgIHIgPSBkYXRhLnNpemUgLyAyO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChkYXRhLnN0eWxlKSB7XG4gICAgICBpZiAoZGF0YS5zdHlsZS53aWR0aCkgd2lkdGggPSBkYXRhLnN0eWxlLndpZHRoO1xuICAgICAgaWYgKGRhdGEuc3R5bGUuaGVpZ2h0KSBoZWlnaHQgPSBkYXRhLnN0eWxlLmhlaWdodDtcbiAgICAgIGlmIChkYXRhLnN0eWxlLnIpIHIgPSBkYXRhLnN0eWxlLnI7XG4gICAgfVxuXG4gICAgaWYgKCFyKSByID0gNTtcbiAgICBpZiAoIXdpZHRoKSB3aWR0aCA9IHI7XG4gICAgaWYgKCFoZWlnaHQpIGhlaWdodCA9IHI7XG4gICAgcmV0dXJuIHtcbiAgICAgIHdpZHRoOiB3aWR0aCxcbiAgICAgIGhlaWdodDogaGVpZ2h0LFxuICAgICAgcjogclxuICAgIH07XG4gIH07XG5cbiAgTGVnZW5kLnByb3RvdHlwZS5nZXRTdHlsZSA9IGZ1bmN0aW9uICh0eXBlLCBkYXRhKSB7XG4gICAgdmFyIGRlZmF1bHRTdHlsZSA9IHR5cGUgPT09ICdub2RlJyA/IHtcbiAgICAgIGZpbGw6ICcjY2NjJyxcbiAgICAgIGxpbmVXaWR0aDogMFxuICAgIH0gOiB7XG4gICAgICBzdHJva2U6ICcjMDAwJyxcbiAgICAgIGxpbmVXaWR0aDogMVxuICAgIH07XG4gICAgcmV0dXJuIF9fYXNzaWduKF9fYXNzaWduKHt9LCBkZWZhdWx0U3R5bGUpLCBkYXRhLnN0eWxlIHx8IHt9KTtcbiAgfTtcblxuICBMZWdlbmQucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGdyYXBoID0gdGhpcy5nZXQoJ2dyYXBoJyk7XG4gICAgdmFyIGdyYXBoQ29udGFpbmVyID0gZ3JhcGguZ2V0KCdjb250YWluZXInKTtcbiAgICB2YXIgY29udGFpbmVyID0gdGhpcy5nZXQoJ2NvbnRhaW5lcicpO1xuICAgIGdyYXBoQ29udGFpbmVyLnJlbW92ZUNoaWxkKGNvbnRhaW5lcik7XG4gIH07XG5cbiAgcmV0dXJuIExlZ2VuZDtcbn0oQmFzZSk7XG5cbmV4cG9ydCBkZWZhdWx0IExlZ2VuZDsiLCJpbXBvcnQgR3JpZCBmcm9tICcuL2dyaWQnO1xuaW1wb3J0IE1lbnUgZnJvbSAnLi9tZW51JztcbmltcG9ydCBNaW5pbWFwIGZyb20gJy4vbWluaW1hcCc7XG5pbXBvcnQgQnVuZGxpbmcgZnJvbSAnLi9idW5kbGluZyc7XG5pbXBvcnQgRmlzaGV5ZSBmcm9tICcuL2Zpc2hleWUnO1xuaW1wb3J0IFRvb2xCYXIgZnJvbSAnLi90b29sQmFyJztcbmltcG9ydCBUb29sdGlwIGZyb20gJy4vdG9vbHRpcCc7XG5pbXBvcnQgVGltZUJhciBmcm9tICcuL3RpbWVCYXInO1xuaW1wb3J0IEltYWdlTWluaW1hcCBmcm9tICcuL2ltYWdlTWluaW1hcCc7XG5pbXBvcnQgRWRnZUZpbHRlckxlbnMgZnJvbSAnLi9lZGdlRmlsdGVyTGVucyc7XG5pbXBvcnQgU25hcExpbmUgZnJvbSAnLi9zbmFwbGluZSc7XG5pbXBvcnQgUGx1Z2luQmFzZSBmcm9tICcuL2Jhc2UnO1xuaW1wb3J0IExlZ2VuZCBmcm9tICcuL2xlZ2VuZCc7XG5leHBvcnQgeyBQbHVnaW5CYXNlLCBNZW51LCBHcmlkLCBNaW5pbWFwLCBCdW5kbGluZywgVG9vbEJhciwgVG9vbHRpcCwgRmlzaGV5ZSwgVGltZUJhciwgSW1hZ2VNaW5pbWFwLCBFZGdlRmlsdGVyTGVucywgU25hcExpbmUsIExlZ2VuZCB9O1xudmFyIFBsdWdpbiA9IHtcbiAgUGx1Z2luQmFzZTogUGx1Z2luQmFzZSxcbiAgTWVudTogTWVudSxcbiAgR3JpZDogR3JpZCxcbiAgTWluaW1hcDogTWluaW1hcCxcbiAgQnVuZGxpbmc6IEJ1bmRsaW5nLFxuICBUb29sQmFyOiBUb29sQmFyLFxuICBUb29sdGlwOiBUb29sdGlwLFxuICBGaXNoZXllOiBGaXNoZXllLFxuICBUaW1lQmFyOiBUaW1lQmFyLFxuICBJbWFnZU1pbmltYXA6IEltYWdlTWluaW1hcCxcbiAgRWRnZUZpbHRlckxlbnM6IEVkZ2VGaWx0ZXJMZW5zLFxuICBTbmFwTGluZTogU25hcExpbmUsXG4gIExlZ2VuZDogTGVnZW5kXG59O1xuZXhwb3J0IGRlZmF1bHQgUGx1Z2luOyIsImltcG9ydCBQbHVnaW4gZnJvbSAnQGFudHYvZzYtcGx1Z2luJztcbmV4cG9ydCBkZWZhdWx0IFBsdWdpbjsgLy8gZXhwb3J0IGRlZmF1bHQge307IiwiaW1wb3J0IHsgX19hc3NpZ24sIF9fcmVzdCB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgcmVnaXN0ZXJOb2RlLCBCYXNlR2xvYmFsIGFzIEdsb2JhbCB9IGZyb20gJ0BhbnR2L2c2LWNvcmUnO1xuaW1wb3J0IHsgZGVlcE1peCB9IGZyb20gJ0BhbnR2L3V0aWwnOyAvLyDluKbmnInlm77moIfnmoTlnIbvvIzlj6/nlKjkuo7mi5PmiZHlm77kuK1cblxucmVnaXN0ZXJOb2RlKCdjaXJjbGUnLCB7XG4gIC8vIOiHquWumuS5ieiKgueCueaXtueahOmFjee9rlxuICBvcHRpb25zOiB7XG4gICAgc2l6ZTogR2xvYmFsLmRlZmF1bHROb2RlLnNpemUsXG4gICAgc3R5bGU6IHtcbiAgICAgIHg6IDAsXG4gICAgICB5OiAwLFxuICAgICAgc3Ryb2tlOiBHbG9iYWwuZGVmYXVsdE5vZGUuc3R5bGUuc3Ryb2tlLFxuICAgICAgZmlsbDogR2xvYmFsLmRlZmF1bHROb2RlLnN0eWxlLmZpbGwsXG4gICAgICBsaW5lV2lkdGg6IEdsb2JhbC5kZWZhdWx0Tm9kZS5zdHlsZS5saW5lV2lkdGhcbiAgICB9LFxuICAgIGxhYmVsQ2ZnOiB7XG4gICAgICBzdHlsZToge1xuICAgICAgICBmaWxsOiBHbG9iYWwubm9kZUxhYmVsLnN0eWxlLmZpbGwsXG4gICAgICAgIGZvbnRTaXplOiBHbG9iYWwubm9kZUxhYmVsLnN0eWxlLmZvbnRTaXplLFxuICAgICAgICBmb250RmFtaWx5OiBHbG9iYWwud2luZG93Rm9udEZhbWlseVxuICAgICAgfVxuICAgIH0sXG4gICAgLy8g6IqC54K55LiK5bem5Y+z5LiK5LiL5Zub5Liq5pa55ZCR5LiK55qE6ZO+5o6lY2lyY2xl6YWN572uXG4gICAgbGlua1BvaW50czoge1xuICAgICAgdG9wOiBmYWxzZSxcbiAgICAgIHJpZ2h0OiBmYWxzZSxcbiAgICAgIGJvdHRvbTogZmFsc2UsXG4gICAgICBsZWZ0OiBmYWxzZSxcbiAgICAgIC8vIGNpcmNsZeeahOWkp+Wwj1xuICAgICAgc2l6ZTogR2xvYmFsLmRlZmF1bHROb2RlLmxpbmtQb2ludHMuc2l6ZSxcbiAgICAgIGxpbmVXaWR0aDogR2xvYmFsLmRlZmF1bHROb2RlLmxpbmtQb2ludHMubGluZVdpZHRoLFxuICAgICAgZmlsbDogR2xvYmFsLmRlZmF1bHROb2RlLmxpbmtQb2ludHMuZmlsbCxcbiAgICAgIHN0cm9rZTogR2xvYmFsLmRlZmF1bHROb2RlLmxpbmtQb2ludHMuc3Ryb2tlXG4gICAgfSxcbiAgICAvLyDoioLngrnkuK1pY29u6YWN572uXG4gICAgaWNvbjoge1xuICAgICAgLy8g5piv5ZCm5pi+56S6aWNvbu+8jOWAvOS4uiBmYWxzZSDliJnkuI3muLLmn5NpY29uXG4gICAgICBzaG93OiBmYWxzZSxcbiAgICAgIC8vIGljb27nmoTlnLDlnYDvvIzlrZfnrKbkuLLnsbvlnotcbiAgICAgIGltZzogJ2h0dHBzOi8vZ3cuYWxpcGF5b2JqZWN0cy5jb20vem9zL2Jtdy1wcm9kLzVkMDE1MDY1LTg1MDUtNGU3YS1iYWVjLTk3NmY4MWUzYzQxZC5zdmcnLFxuICAgICAgd2lkdGg6IDIwLFxuICAgICAgaGVpZ2h0OiAyMFxuICAgIH0sXG4gICAgc3RhdGVTdHlsZXM6IF9fYXNzaWduKHt9LCBHbG9iYWwubm9kZVN0YXRlU3R5bGVzKVxuICB9LFxuICBzaGFwZVR5cGU6ICdjaXJjbGUnLFxuICAvLyDmlofmnKzkvY3nva5cbiAgbGFiZWxQb3NpdGlvbjogJ2NlbnRlcicsXG4gIGRyYXdTaGFwZTogZnVuY3Rpb24gZHJhd1NoYXBlKGNmZywgZ3JvdXApIHtcbiAgICB2YXIgX2EgPSAodGhpcy5tZXJnZVN0eWxlIHx8IHRoaXMuZ2V0T3B0aW9ucyhjZmcpKS5pY29uLFxuICAgICAgICBkZWZhdWx0SWNvbiA9IF9hID09PSB2b2lkIDAgPyB7fSA6IF9hO1xuICAgIHZhciBzdHlsZSA9IHRoaXMuZ2V0U2hhcGVTdHlsZShjZmcpO1xuICAgIHZhciBpY29uID0gZGVlcE1peCh7fSwgZGVmYXVsdEljb24sIGNmZy5pY29uKTtcbiAgICB2YXIgbmFtZSA9IHRoaXMudHlwZSArIFwiLWtleVNoYXBlXCI7XG4gICAgdmFyIGtleVNoYXBlID0gZ3JvdXAuYWRkU2hhcGUoJ2NpcmNsZScsIHtcbiAgICAgIGF0dHJzOiBzdHlsZSxcbiAgICAgIGNsYXNzTmFtZTogbmFtZSxcbiAgICAgIG5hbWU6IG5hbWUsXG4gICAgICBkcmFnZ2FibGU6IHRydWVcbiAgICB9KTtcbiAgICBncm91cFsnc2hhcGVNYXAnXVtuYW1lXSA9IGtleVNoYXBlO1xuICAgIHZhciB3aWR0aCA9IGljb24ud2lkdGgsXG4gICAgICAgIGhlaWdodCA9IGljb24uaGVpZ2h0LFxuICAgICAgICBzaG93ID0gaWNvbi5zaG93LFxuICAgICAgICB0ZXh0ID0gaWNvbi50ZXh0O1xuXG4gICAgaWYgKHNob3cpIHtcbiAgICAgIHZhciBpY29uTmFtZSA9IHRoaXMudHlwZSArIFwiLWljb25cIjtcblxuICAgICAgaWYgKHRleHQpIHtcbiAgICAgICAgZ3JvdXBbJ3NoYXBlTWFwJ11baWNvbk5hbWVdID0gZ3JvdXAuYWRkU2hhcGUoJ3RleHQnLCB7XG4gICAgICAgICAgYXR0cnM6IF9fYXNzaWduKHtcbiAgICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgICB5OiAwLFxuICAgICAgICAgICAgZm9udFNpemU6IDEyLFxuICAgICAgICAgICAgZmlsbDogJyMwMDAnLFxuICAgICAgICAgICAgc3Ryb2tlOiAnIzAwMCcsXG4gICAgICAgICAgICB0ZXh0QmFzZWxpbmU6ICdtaWRkbGUnLFxuICAgICAgICAgICAgdGV4dEFsaWduOiAnY2VudGVyJ1xuICAgICAgICAgIH0sIGljb24pLFxuICAgICAgICAgIGNsYXNzTmFtZTogaWNvbk5hbWUsXG4gICAgICAgICAgbmFtZTogaWNvbk5hbWUsXG4gICAgICAgICAgZHJhZ2dhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZ3JvdXBbJ3NoYXBlTWFwJ11baWNvbk5hbWVdID0gZ3JvdXAuYWRkU2hhcGUoJ2ltYWdlJywge1xuICAgICAgICAgIGF0dHJzOiBfX2Fzc2lnbih7XG4gICAgICAgICAgICB4OiAtd2lkdGggLyAyLFxuICAgICAgICAgICAgeTogLWhlaWdodCAvIDJcbiAgICAgICAgICB9LCBpY29uKSxcbiAgICAgICAgICBjbGFzc05hbWU6IGljb25OYW1lLFxuICAgICAgICAgIG5hbWU6IGljb25OYW1lLFxuICAgICAgICAgIGRyYWdnYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmRyYXdMaW5rUG9pbnRzKGNmZywgZ3JvdXApO1xuICAgIHJldHVybiBrZXlTaGFwZTtcbiAgfSxcblxuICAvKipcbiAgICog57uY5Yi26IqC54K55LiK55qETGlua1BvaW50c1xuICAgKiBAcGFyYW0ge09iamVjdH0gY2ZnIGRhdGHmlbDmja7phY3nva7poblcbiAgICogQHBhcmFtIHtHcm91cH0gZ3JvdXAgR3JvdXDlrp7kvotcbiAgICovXG4gIGRyYXdMaW5rUG9pbnRzOiBmdW5jdGlvbiBkcmF3TGlua1BvaW50cyhjZmcsIGdyb3VwKSB7XG4gICAgdmFyIGxpbmtQb2ludHMgPSAodGhpcy5tZXJnZVN0eWxlIHx8IHRoaXMuZ2V0T3B0aW9ucyhjZmcpKS5saW5rUG9pbnRzO1xuICAgIGlmICghbGlua1BvaW50cykgcmV0dXJuO1xuXG4gICAgdmFyIF9hID0gbGlua1BvaW50cyB8fCB7fSxcbiAgICAgICAgdG9wID0gX2EudG9wLFxuICAgICAgICBsZWZ0ID0gX2EubGVmdCxcbiAgICAgICAgcmlnaHQgPSBfYS5yaWdodCxcbiAgICAgICAgYm90dG9tID0gX2EuYm90dG9tLFxuICAgICAgICBtYXJrU2l6ZSA9IF9hLnNpemUsXG4gICAgICAgIG1hcmtSID0gX2EucixcbiAgICAgICAgbWFya1N0eWxlID0gX19yZXN0KF9hLCBbXCJ0b3BcIiwgXCJsZWZ0XCIsIFwicmlnaHRcIiwgXCJib3R0b21cIiwgXCJzaXplXCIsIFwiclwiXSk7XG5cbiAgICB2YXIgc2l6ZSA9IHRoaXMuZ2V0U2l6ZShjZmcpO1xuICAgIHZhciByID0gc2l6ZVswXSAvIDI7XG5cbiAgICBpZiAobGVmdCkge1xuICAgICAgLy8gbGVmdCBjaXJjbGVcbiAgICAgIHZhciBuYW1lXzEgPSAnbGluay1wb2ludC1sZWZ0JztcbiAgICAgIGdyb3VwWydzaGFwZU1hcCddW25hbWVfMV0gPSBncm91cC5hZGRTaGFwZSgnY2lyY2xlJywge1xuICAgICAgICBhdHRyczogX19hc3NpZ24oX19hc3NpZ24oe30sIG1hcmtTdHlsZSksIHtcbiAgICAgICAgICB4OiAtcixcbiAgICAgICAgICB5OiAwLFxuICAgICAgICAgIHI6IG1hcmtTaXplIC8gMiB8fCBtYXJrUiB8fCA1XG4gICAgICAgIH0pLFxuICAgICAgICBjbGFzc05hbWU6IG5hbWVfMSxcbiAgICAgICAgbmFtZTogbmFtZV8xLFxuICAgICAgICBpc0FuY2hvclBvaW50OiB0cnVlXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAocmlnaHQpIHtcbiAgICAgIC8vIHJpZ2h0IGNpcmNsZVxuICAgICAgdmFyIG5hbWVfMiA9ICdsaW5rLXBvaW50LXJpZ2h0JztcbiAgICAgIGdyb3VwWydzaGFwZU1hcCddW25hbWVfMl0gPSBncm91cC5hZGRTaGFwZSgnY2lyY2xlJywge1xuICAgICAgICBhdHRyczogX19hc3NpZ24oX19hc3NpZ24oe30sIG1hcmtTdHlsZSksIHtcbiAgICAgICAgICB4OiByLFxuICAgICAgICAgIHk6IDAsXG4gICAgICAgICAgcjogbWFya1NpemUgLyAyIHx8IG1hcmtSIHx8IDVcbiAgICAgICAgfSksXG4gICAgICAgIGNsYXNzTmFtZTogbmFtZV8yLFxuICAgICAgICBuYW1lOiBuYW1lXzIsXG4gICAgICAgIGlzQW5jaG9yUG9pbnQ6IHRydWVcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0b3ApIHtcbiAgICAgIC8vIHRvcCBjaXJjbGVcbiAgICAgIHZhciBuYW1lXzMgPSAnbGluay1wb2ludC10b3AnO1xuICAgICAgZ3JvdXBbJ3NoYXBlTWFwJ11bbmFtZV8zXSA9IGdyb3VwLmFkZFNoYXBlKCdjaXJjbGUnLCB7XG4gICAgICAgIGF0dHJzOiBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgbWFya1N0eWxlKSwge1xuICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgeTogLXIsXG4gICAgICAgICAgcjogbWFya1NpemUgLyAyIHx8IG1hcmtSIHx8IDVcbiAgICAgICAgfSksXG4gICAgICAgIGNsYXNzTmFtZTogbmFtZV8zLFxuICAgICAgICBuYW1lOiBuYW1lXzMsXG4gICAgICAgIGlzQW5jaG9yUG9pbnQ6IHRydWVcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChib3R0b20pIHtcbiAgICAgIC8vIGJvdHRvbSBjaXJjbGVcbiAgICAgIHZhciBuYW1lXzQgPSAnbGluay1wb2ludC1ib3R0b20nO1xuICAgICAgZ3JvdXBbJ3NoYXBlTWFwJ11bbmFtZV80XSA9IGdyb3VwLmFkZFNoYXBlKCdjaXJjbGUnLCB7XG4gICAgICAgIGF0dHJzOiBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgbWFya1N0eWxlKSwge1xuICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgeTogcixcbiAgICAgICAgICByOiBtYXJrU2l6ZSAvIDIgfHwgbWFya1IgfHwgNVxuICAgICAgICB9KSxcbiAgICAgICAgY2xhc3NOYW1lOiBuYW1lXzQsXG4gICAgICAgIG5hbWU6IG5hbWVfNCxcbiAgICAgICAgaXNBbmNob3JQb2ludDogdHJ1ZVxuICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiDojrflj5boioLngrnnmoTmoLflvI/vvIzkvpvln7rkuo7or6XoioLngrnoh6rlrprkuYnml7bkvb/nlKhcbiAgICogQHBhcmFtIHtPYmplY3R9IGNmZyDoioLngrnmlbDmja7mqKHlnotcbiAgICogQHJldHVybiB7T2JqZWN0fSDoioLngrnnmoTmoLflvI9cbiAgICovXG4gIGdldFNoYXBlU3R5bGU6IGZ1bmN0aW9uIGdldFNoYXBlU3R5bGUoY2ZnKSB7XG4gICAgdmFyIGRlZmF1bHRTdHlsZSA9ICh0aGlzLm1lcmdlU3R5bGUgfHwgdGhpcy5nZXRPcHRpb25zKGNmZykpLnN0eWxlO1xuICAgIHZhciBzdHJva2VTdHlsZSA9IHtcbiAgICAgIHN0cm9rZTogY2ZnLmNvbG9yXG4gICAgfTsgLy8g5aaC5p6c6K6+572u5LqGY29sb3LvvIzliJnopobnm5bpu5jorqTnmoRzdHJva2XlsZ7mgKdcblxuICAgIHZhciBzdHlsZSA9IGRlZXBNaXgoe30sIGRlZmF1bHRTdHlsZSwgc3Ryb2tlU3R5bGUpO1xuICAgIHZhciBzaXplID0gdGhpcy5nZXRTaXplKGNmZyk7XG4gICAgdmFyIHIgPSBzaXplWzBdIC8gMjtcblxuICAgIHZhciBzdHlsZXMgPSBfX2Fzc2lnbih7XG4gICAgICB4OiAwLFxuICAgICAgeTogMCxcbiAgICAgIHI6IHJcbiAgICB9LCBzdHlsZSk7XG5cbiAgICByZXR1cm4gc3R5bGVzO1xuICB9LFxuICB1cGRhdGU6IGZ1bmN0aW9uIHVwZGF0ZShjZmcsIGl0ZW0sIHVwZGF0ZVR5cGUpIHtcbiAgICB2YXIgZ3JvdXAgPSBpdGVtLmdldENvbnRhaW5lcigpO1xuICAgIHZhciBzaXplID0gdGhpcy5nZXRTaXplKGNmZyk7IC8vIOS4i+mdoui/meS6m+WxnuaAp+mcgOimgeimhueblum7mOiupOagt+W8j+S4juebruWJjeagt+W8j++8jOS9huiLpeWcqCBjZmcg5Lit5pyJ5oyH5a6a5YiZ5bqU6K+l6KKrIGNmZyDnmoTnm7jlupTphY3nva7opobnm5bjgIJcbiAgICAvLyBjb25zdCBzdHJva2VTdHlsZSA9IHtcbiAgICAvLyAgIHN0cm9rZTogY2ZnLmNvbG9yLFxuICAgIC8vICAgcjogc2l6ZVswXSAvIDIsXG4gICAgLy8gfTtcbiAgICAvLyAvLyDkuI4gZ2V0U2hhcGVTdHlsZSDkuI3lkIzlnKjkuo7vvIx1cGRhdGUg5pe26ZyA6KaB6I635Y+W5Yiw5b2T5YmN55qEIHN0eWxlIOi/m+ihjOiejeWQiOOAguWNs+aWsOS8oOWFpeeahOmFjee9rumhueS4reayoeaciea2ieWPiueahOWxnuaAp++8jOS/neeVmeW9k+WJjeeahOmFjee9ruOAglxuICAgIC8vIGNvbnN0IGtleVNoYXBlID0gaXRlbS5nZXQoJ2tleVNoYXBlJyk7XG4gICAgLy8gVE9ETzogcGVyZm9ybWFuY2VcbiAgICAvLyBjb25zdCBzdHlsZSA9IGRlZXBNaXgoe30sIGtleVNoYXBlLmF0dHIoKSwgc3Ryb2tlU3R5bGUsIGNmZy5zdHlsZSk7XG4gICAgLy8gY29uc3Qgc3R5bGUgPSBkZWVwTWl4KHt9LCBrZXlTaGFwZS5hdHRyKCksIGNmZy5zdHlsZSk7XG5cbiAgICB2YXIgc3R5bGUgPSBfX2Fzc2lnbih7fSwgY2ZnLnN0eWxlKTtcblxuICAgIGlmIChjZmcuc3R5bGUuc3Ryb2tlID09PSB1bmRlZmluZWQgJiYgY2ZnLmNvbG9yKSB7XG4gICAgICBzdHlsZS5zdHJva2UgPSBjZmcuY29sb3I7XG4gICAgfVxuXG4gICAgaWYgKGNmZy5zdHlsZS5yID09PSB1bmRlZmluZWQgJiYgIWlzTmFOKHNpemVbMF0pKSB7XG4gICAgICBzdHlsZS5yID0gc2l6ZVswXSAvIDI7XG4gICAgfVxuXG4gICAgdGhpcy51cGRhdGVTaGFwZShjZmcsIGl0ZW0sIHN0eWxlLCB0cnVlLCB1cGRhdGVUeXBlKTsgLy8gKHRoaXMgYXMgYW55KS51cGRhdGVTaGFwZShjZmcsIGl0ZW0sIHN0eWxlLCB0cnVlLCB1cGRhdGVUeXBlKTtcblxuICAgIHRoaXMudXBkYXRlTGlua1BvaW50cyhjZmcsIGdyb3VwKTtcbiAgfVxufSwgJ3NpbmdsZS1ub2RlJyk7IiwiaW1wb3J0IHsgX19hc3NpZ24sIF9fcmVzdCB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgbWl4IH0gZnJvbSAnQGFudHYvdXRpbCc7XG5pbXBvcnQgeyByZWdpc3Rlck5vZGUsIEJhc2VHbG9iYWwgYXMgR2xvYmFsIH0gZnJvbSAnQGFudHYvZzYtY29yZSc7XG5yZWdpc3Rlck5vZGUoJ3JlY3QnLCB7XG4gIC8vIOiHquWumuS5ieiKgueCueaXtueahOmFjee9rlxuICBvcHRpb25zOiB7XG4gICAgc2l6ZTogWzEwMCwgMzBdLFxuICAgIHN0eWxlOiB7XG4gICAgICByYWRpdXM6IDAsXG4gICAgICBzdHJva2U6IEdsb2JhbC5kZWZhdWx0Tm9kZS5zdHlsZS5zdHJva2UsXG4gICAgICBmaWxsOiBHbG9iYWwuZGVmYXVsdE5vZGUuc3R5bGUuZmlsbCxcbiAgICAgIGxpbmVXaWR0aDogR2xvYmFsLmRlZmF1bHROb2RlLnN0eWxlLmxpbmVXaWR0aFxuICAgIH0sXG4gICAgLy8g5paH5pys5qC35byP6YWN572uXG4gICAgbGFiZWxDZmc6IHtcbiAgICAgIHN0eWxlOiB7XG4gICAgICAgIGZpbGw6IEdsb2JhbC5ub2RlTGFiZWwuc3R5bGUuZmlsbCxcbiAgICAgICAgZm9udFNpemU6IEdsb2JhbC5ub2RlTGFiZWwuc3R5bGUuZm9udFNpemUsXG4gICAgICAgIGZvbnRGYW1pbHk6IEdsb2JhbC53aW5kb3dGb250RmFtaWx5XG4gICAgICB9XG4gICAgfSxcbiAgICAvLyDoioLngrnkuIrlt6blj7PkuIrkuIvlm5vkuKrmlrnlkJHkuIrnmoTpk77mjqVjaXJjbGXphY3nva5cbiAgICBsaW5rUG9pbnRzOiB7XG4gICAgICB0b3A6IGZhbHNlLFxuICAgICAgcmlnaHQ6IGZhbHNlLFxuICAgICAgYm90dG9tOiBmYWxzZSxcbiAgICAgIGxlZnQ6IGZhbHNlLFxuICAgICAgLy8gY2lyY2xl55qE5aSn5bCPXG4gICAgICBzaXplOiBHbG9iYWwuZGVmYXVsdE5vZGUubGlua1BvaW50cy5zaXplLFxuICAgICAgbGluZVdpZHRoOiBHbG9iYWwuZGVmYXVsdE5vZGUubGlua1BvaW50cy5saW5lV2lkdGgsXG4gICAgICBmaWxsOiBHbG9iYWwuZGVmYXVsdE5vZGUubGlua1BvaW50cy5maWxsLFxuICAgICAgc3Ryb2tlOiBHbG9iYWwuZGVmYXVsdE5vZGUubGlua1BvaW50cy5zdHJva2VcbiAgICB9LFxuICAgIC8vIOiKgueCueS4rWljb27phY3nva5cbiAgICBpY29uOiB7XG4gICAgICAvLyDmmK/lkKbmmL7npLppY29u77yM5YC85Li6IGZhbHNlIOWImeS4jea4suafk2ljb25cbiAgICAgIHNob3c6IGZhbHNlLFxuICAgICAgLy8gaWNvbueahOWcsOWdgO+8jOWtl+espuS4suexu+Wei1xuICAgICAgaW1nOiAnaHR0cHM6Ly9ndy5hbGlwYXlvYmplY3RzLmNvbS96b3MvYm13LXByb2QvNWQwMTUwNjUtODUwNS00ZTdhLWJhZWMtOTc2ZjgxZTNjNDFkLnN2ZycsXG4gICAgICB3aWR0aDogMjAsXG4gICAgICBoZWlnaHQ6IDIwXG4gICAgfSxcbiAgICAvLyDov57mjqXngrnvvIzpu5jorqTkuLrlt6blj7NcbiAgICAvLyBhbmNob3JQb2ludHM6IFt7IHg6IDAsIHk6IDAuNSB9LCB7IHg6IDEsIHk6IDAuNSB9XVxuICAgIGFuY2hvclBvaW50czogW1swLCAwLjVdLCBbMSwgMC41XV0sXG4gICAgc3RhdGVTdHlsZXM6IF9fYXNzaWduKHt9LCBHbG9iYWwubm9kZVN0YXRlU3R5bGVzKVxuICB9LFxuICBzaGFwZVR5cGU6ICdyZWN0JyxcbiAgbGFiZWxQb3NpdGlvbjogJ2NlbnRlcicsXG4gIGRyYXdTaGFwZTogZnVuY3Rpb24gZHJhd1NoYXBlKGNmZywgZ3JvdXApIHtcbiAgICB2YXIgc3R5bGUgPSB0aGlzLmdldFNoYXBlU3R5bGUoY2ZnKTtcbiAgICB2YXIga2V5U2hhcGUgPSBncm91cC5hZGRTaGFwZSgncmVjdCcsIHtcbiAgICAgIGF0dHJzOiBzdHlsZSxcbiAgICAgIGNsYXNzTmFtZTogdGhpcy50eXBlICsgXCIta2V5U2hhcGVcIixcbiAgICAgIG5hbWU6IHRoaXMudHlwZSArIFwiLWtleVNoYXBlXCIsXG4gICAgICBkcmFnZ2FibGU6IHRydWVcbiAgICB9KTtcbiAgICBncm91cFsnc2hhcGVNYXAnXVt0aGlzLnR5cGUgKyBcIi1rZXlTaGFwZVwiXSA9IGtleVNoYXBlO1xuICAgIHRoaXMuZHJhd0xpbmtQb2ludHMoY2ZnLCBncm91cCk7XG4gICAgcmV0dXJuIGtleVNoYXBlO1xuICB9LFxuXG4gIC8qKlxuICAgKiDnu5jliLboioLngrnkuIrnmoRMaW5rUG9pbnRzXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBjZmcgZGF0YeaVsOaNrumFjee9rumhuVxuICAgKiBAcGFyYW0ge0dyb3VwfSBncm91cCBHcm91cOWunuS+i1xuICAgKi9cbiAgZHJhd0xpbmtQb2ludHM6IGZ1bmN0aW9uIGRyYXdMaW5rUG9pbnRzKGNmZywgZ3JvdXApIHtcbiAgICB2YXIgX2EgPSAodGhpcy5tZXJnZVN0eWxlIHx8IHRoaXMuZ2V0T3B0aW9ucyhjZmcpKS5saW5rUG9pbnRzLFxuICAgICAgICBsaW5rUG9pbnRzID0gX2EgPT09IHZvaWQgMCA/IHt9IDogX2E7XG5cbiAgICB2YXIgdG9wID0gbGlua1BvaW50cy50b3AsXG4gICAgICAgIGxlZnQgPSBsaW5rUG9pbnRzLmxlZnQsXG4gICAgICAgIHJpZ2h0ID0gbGlua1BvaW50cy5yaWdodCxcbiAgICAgICAgYm90dG9tID0gbGlua1BvaW50cy5ib3R0b20sXG4gICAgICAgIG1hcmtTaXplID0gbGlua1BvaW50cy5zaXplLFxuICAgICAgICBtYXJrUiA9IGxpbmtQb2ludHMucixcbiAgICAgICAgbWFya1N0eWxlID0gX19yZXN0KGxpbmtQb2ludHMsIFtcInRvcFwiLCBcImxlZnRcIiwgXCJyaWdodFwiLCBcImJvdHRvbVwiLCBcInNpemVcIiwgXCJyXCJdKTtcblxuICAgIHZhciBzaXplID0gdGhpcy5nZXRTaXplKGNmZyk7XG4gICAgdmFyIHdpZHRoID0gc2l6ZVswXTtcbiAgICB2YXIgaGVpZ2h0ID0gc2l6ZVsxXTtcblxuICAgIGlmIChsZWZ0KSB7XG4gICAgICAvLyBsZWZ0IGNpcmNsZVxuICAgICAgZ3JvdXBbJ3NoYXBlTWFwJ11bJ2xpbmstcG9pbnQtbGVmdCddID0gZ3JvdXAuYWRkU2hhcGUoJ2NpcmNsZScsIHtcbiAgICAgICAgYXR0cnM6IF9fYXNzaWduKF9fYXNzaWduKHt9LCBtYXJrU3R5bGUpLCB7XG4gICAgICAgICAgeDogLXdpZHRoIC8gMixcbiAgICAgICAgICB5OiAwLFxuICAgICAgICAgIHI6IG1hcmtTaXplIC8gMiB8fCBtYXJrUiB8fCA1XG4gICAgICAgIH0pLFxuICAgICAgICBjbGFzc05hbWU6ICdsaW5rLXBvaW50LWxlZnQnLFxuICAgICAgICBuYW1lOiAnbGluay1wb2ludC1sZWZ0JyxcbiAgICAgICAgaXNBbmNob3JQb2ludDogdHJ1ZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHJpZ2h0KSB7XG4gICAgICAvLyByaWdodCBjaXJjbGVcbiAgICAgIGdyb3VwWydzaGFwZU1hcCddWydsaW5rLXBvaW50LXJpZ2h0J10gPSBncm91cC5hZGRTaGFwZSgnY2lyY2xlJywge1xuICAgICAgICBhdHRyczogX19hc3NpZ24oX19hc3NpZ24oe30sIG1hcmtTdHlsZSksIHtcbiAgICAgICAgICB4OiB3aWR0aCAvIDIsXG4gICAgICAgICAgeTogMCxcbiAgICAgICAgICByOiBtYXJrU2l6ZSAvIDIgfHwgbWFya1IgfHwgNVxuICAgICAgICB9KSxcbiAgICAgICAgY2xhc3NOYW1lOiAnbGluay1wb2ludC1yaWdodCcsXG4gICAgICAgIG5hbWU6ICdsaW5rLXBvaW50LXJpZ2h0JyxcbiAgICAgICAgaXNBbmNob3JQb2ludDogdHJ1ZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRvcCkge1xuICAgICAgLy8gdG9wIGNpcmNsZVxuICAgICAgZ3JvdXBbJ3NoYXBlTWFwJ11bJ2xpbmstcG9pbnQtdG9wJ10gPSBncm91cC5hZGRTaGFwZSgnY2lyY2xlJywge1xuICAgICAgICBhdHRyczogX19hc3NpZ24oX19hc3NpZ24oe30sIG1hcmtTdHlsZSksIHtcbiAgICAgICAgICB4OiAwLFxuICAgICAgICAgIHk6IC1oZWlnaHQgLyAyLFxuICAgICAgICAgIHI6IG1hcmtTaXplIC8gMiB8fCBtYXJrUiB8fCA1XG4gICAgICAgIH0pLFxuICAgICAgICBjbGFzc05hbWU6ICdsaW5rLXBvaW50LXRvcCcsXG4gICAgICAgIG5hbWU6ICdsaW5rLXBvaW50LXRvcCcsXG4gICAgICAgIGlzQW5jaG9yUG9pbnQ6IHRydWVcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChib3R0b20pIHtcbiAgICAgIC8vIGJvdHRvbSBjaXJjbGVcbiAgICAgIGdyb3VwWydzaGFwZU1hcCddWydsaW5rLXBvaW50LWJvdHRvbSddID0gZ3JvdXAuYWRkU2hhcGUoJ2NpcmNsZScsIHtcbiAgICAgICAgYXR0cnM6IF9fYXNzaWduKF9fYXNzaWduKHt9LCBtYXJrU3R5bGUpLCB7XG4gICAgICAgICAgeDogMCxcbiAgICAgICAgICB5OiBoZWlnaHQgLyAyLFxuICAgICAgICAgIHI6IG1hcmtTaXplIC8gMiB8fCBtYXJrUiB8fCA1XG4gICAgICAgIH0pLFxuICAgICAgICBjbGFzc05hbWU6ICdsaW5rLXBvaW50LWJvdHRvbScsXG4gICAgICAgIG5hbWU6ICdsaW5rLXBvaW50LWJvdHRvbScsXG4gICAgICAgIGlzQW5jaG9yUG9pbnQ6IHRydWVcbiAgICAgIH0pO1xuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICog6I635Y+W6IqC54K555qE5qC35byP77yM5L6b5Z+65LqO6K+l6IqC54K56Ieq5a6a5LmJ5pe25L2/55SoXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBjZmcg6IqC54K55pWw5o2u5qih5Z6LXG4gICAqIEByZXR1cm4ge09iamVjdH0g6IqC54K555qE5qC35byPXG4gICAqL1xuICBnZXRTaGFwZVN0eWxlOiBmdW5jdGlvbiBnZXRTaGFwZVN0eWxlKGNmZykge1xuICAgIHZhciBkZWZhdWx0U3R5bGUgPSAodGhpcy5tZXJnZVN0eWxlIHx8IHRoaXMuZ2V0T3B0aW9ucyhjZmcpKS5zdHlsZTtcbiAgICB2YXIgc3Ryb2tlU3R5bGUgPSB7XG4gICAgICBzdHJva2U6IGNmZy5jb2xvclxuICAgIH07IC8vIOWmguaenOiuvue9ruS6hmNvbG9y77yM5YiZ6KaG55uW6buY6K6k55qEc3Ryb2tl5bGe5oCnXG5cbiAgICB2YXIgc3R5bGUgPSBtaXgoe30sIGRlZmF1bHRTdHlsZSwgc3Ryb2tlU3R5bGUpO1xuICAgIHZhciBzaXplID0gdGhpcy5nZXRTaXplKGNmZyk7XG4gICAgdmFyIHdpZHRoID0gc3R5bGUud2lkdGggfHwgc2l6ZVswXTtcbiAgICB2YXIgaGVpZ2h0ID0gc3R5bGUuaGVpZ2h0IHx8IHNpemVbMV07XG5cbiAgICB2YXIgc3R5bGVzID0gX19hc3NpZ24oe1xuICAgICAgeDogLXdpZHRoIC8gMixcbiAgICAgIHk6IC1oZWlnaHQgLyAyLFxuICAgICAgd2lkdGg6IHdpZHRoLFxuICAgICAgaGVpZ2h0OiBoZWlnaHRcbiAgICB9LCBzdHlsZSk7XG5cbiAgICByZXR1cm4gc3R5bGVzO1xuICB9LFxuICB1cGRhdGU6IGZ1bmN0aW9uIHVwZGF0ZShjZmcsIGl0ZW0sIHVwZGF0ZVR5cGUpIHtcbiAgICB2YXIgZ3JvdXAgPSBpdGVtLmdldENvbnRhaW5lcigpOyAvLyDov5nph4zkuI3kvKAgY2ZnIOWPguaVsOaYr+WboOS4uiBjZmcuc3R5bGUg6ZyA6KaB5pyA5ZCO6KaG55uW5qC35byPXG5cbiAgICB2YXIgZGVmYXVsdFN0eWxlID0gdGhpcy5nZXRPcHRpb25zKHt9KS5zdHlsZTtcbiAgICB2YXIgc2l6ZSA9IHRoaXMuZ2V0U2l6ZShjZmcpO1xuICAgIHZhciBrZXlTaGFwZSA9IGl0ZW0uZ2V0KCdrZXlTaGFwZScpO1xuXG4gICAgaWYgKCFjZmcuc2l6ZSkge1xuICAgICAgc2l6ZVswXSA9IGtleVNoYXBlLmF0dHIoJ3dpZHRoJykgfHwgZGVmYXVsdFN0eWxlLndpZHRoO1xuICAgICAgc2l6ZVsxXSA9IGtleVNoYXBlLmF0dHIoJ2hlaWdodCcpIHx8IGRlZmF1bHRTdHlsZS5oZWlnaHQ7XG4gICAgfSAvLyDkuIvpnaLov5nkupvlsZ7mgKfpnIDopoHopobnm5bpu5jorqTmoLflvI/kuI7nm67liY3moLflvI/vvIzkvYboi6XlnKggY2ZnIOS4reacieaMh+WumuWImeW6lOivpeiiqyBjZmcg55qE55u45bqU6YWN572u6KaG55uW44CCXG5cblxuICAgIHZhciBzdHJva2VTdHlsZSA9IHtcbiAgICAgIHN0cm9rZTogY2ZnLmNvbG9yLFxuICAgICAgeDogLXNpemVbMF0gLyAyLFxuICAgICAgeTogLXNpemVbMV0gLyAyLFxuICAgICAgd2lkdGg6IHNpemVbMF0sXG4gICAgICBoZWlnaHQ6IHNpemVbMV1cbiAgICB9OyAvLyDkuI4gZ2V0U2hhcGVTdHlsZSDkuI3lkIzlnKjkuo7vvIx1cGRhdGUg5pe26ZyA6KaB6I635Y+W5Yiw5b2T5YmN55qEIHN0eWxlIOi/m+ihjOiejeWQiOOAguWNs+aWsOS8oOWFpeeahOmFjee9rumhueS4reayoeaciea2ieWPiueahOWxnuaAp++8jOS/neeVmeW9k+WJjeeahOmFjee9ruOAglxuXG4gICAgdmFyIHN0eWxlID0gbWl4KHt9LCBkZWZhdWx0U3R5bGUsIGtleVNoYXBlLmF0dHIoKSwgc3Ryb2tlU3R5bGUpO1xuICAgIHN0eWxlID0gbWl4KHN0eWxlLCBjZmcuc3R5bGUpO1xuICAgIHRoaXMudXBkYXRlU2hhcGUoY2ZnLCBpdGVtLCBzdHlsZSwgZmFsc2UsIHVwZGF0ZVR5cGUpO1xuICAgIHRoaXMudXBkYXRlTGlua1BvaW50cyhjZmcsIGdyb3VwKTtcbiAgfVxufSwgJ3NpbmdsZS1ub2RlJyk7IiwiaW1wb3J0IHsgX19hc3NpZ24sIF9fcmVzdCB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgcmVnaXN0ZXJOb2RlLCBCYXNlR2xvYmFsIGFzIEdsb2JhbCB9IGZyb20gJ0BhbnR2L2c2LWNvcmUnO1xuaW1wb3J0IHsgbWl4IH0gZnJvbSAnQGFudHYvdXRpbCc7XG4vKipcbiAqIOWfuuacrOeahOakreWchu+8jOWPr+S7pea3u+WKoOaWh+acrO+8jOm7mOiupOaWh+acrOWxheS4rVxuICovXG5cbnJlZ2lzdGVyTm9kZSgnZWxsaXBzZScsIHtcbiAgLy8g6Ieq5a6a5LmJ6IqC54K55pe255qE6YWN572uXG4gIG9wdGlvbnM6IHtcbiAgICBzaXplOiBbODAsIDQwXSxcbiAgICBzdHlsZToge1xuICAgICAgeDogMCxcbiAgICAgIHk6IDAsXG4gICAgICBzdHJva2U6IEdsb2JhbC5kZWZhdWx0Tm9kZS5zdHlsZS5zdHJva2UsXG4gICAgICBmaWxsOiBHbG9iYWwuZGVmYXVsdE5vZGUuc3R5bGUuZmlsbCxcbiAgICAgIGxpbmVXaWR0aDogR2xvYmFsLmRlZmF1bHROb2RlLnN0eWxlLmxpbmVXaWR0aFxuICAgIH0sXG4gICAgLy8g5paH5pys5qC35byP6YWN572uXG4gICAgbGFiZWxDZmc6IHtcbiAgICAgIHN0eWxlOiB7XG4gICAgICAgIGZpbGw6IEdsb2JhbC5ub2RlTGFiZWwuc3R5bGUuZmlsbCxcbiAgICAgICAgZm9udFNpemU6IEdsb2JhbC5ub2RlTGFiZWwuc3R5bGUuZm9udFNpemUsXG4gICAgICAgIGZvbnRGYW1pbHk6IEdsb2JhbC53aW5kb3dGb250RmFtaWx5XG4gICAgICB9XG4gICAgfSxcbiAgICAvLyDoioLngrnkuIrlt6blj7PkuIrkuIvlm5vkuKrmlrnlkJHkuIrnmoTpk77mjqVjaXJjbGXphY3nva5cbiAgICBsaW5rUG9pbnRzOiB7XG4gICAgICB0b3A6IGZhbHNlLFxuICAgICAgcmlnaHQ6IGZhbHNlLFxuICAgICAgYm90dG9tOiBmYWxzZSxcbiAgICAgIGxlZnQ6IGZhbHNlLFxuICAgICAgLy8gY2lyY2xl55qE5aSn5bCPXG4gICAgICBzaXplOiBHbG9iYWwuZGVmYXVsdE5vZGUubGlua1BvaW50cy5zaXplLFxuICAgICAgbGluZVdpZHRoOiBHbG9iYWwuZGVmYXVsdE5vZGUubGlua1BvaW50cy5saW5lV2lkdGgsXG4gICAgICBmaWxsOiBHbG9iYWwuZGVmYXVsdE5vZGUubGlua1BvaW50cy5maWxsLFxuICAgICAgc3Ryb2tlOiBHbG9iYWwuZGVmYXVsdE5vZGUubGlua1BvaW50cy5zdHJva2VcbiAgICB9LFxuICAgIC8vIOiKgueCueS4rWljb27phY3nva5cbiAgICBpY29uOiB7XG4gICAgICAvLyDmmK/lkKbmmL7npLppY29u77yM5YC85Li6IGZhbHNlIOWImeS4jea4suafk2ljb25cbiAgICAgIHNob3c6IGZhbHNlLFxuICAgICAgLy8gaWNvbueahOWcsOWdgO+8jOWtl+espuS4suexu+Wei1xuICAgICAgaW1nOiAnaHR0cHM6Ly9ndy5hbGlwYXlvYmplY3RzLmNvbS96b3MvYm13LXByb2QvNWQwMTUwNjUtODUwNS00ZTdhLWJhZWMtOTc2ZjgxZTNjNDFkLnN2ZycsXG4gICAgICB3aWR0aDogMjAsXG4gICAgICBoZWlnaHQ6IDIwXG4gICAgfSxcbiAgICBzdGF0ZVN0eWxlczogX19hc3NpZ24oe30sIEdsb2JhbC5ub2RlU3RhdGVTdHlsZXMpXG4gIH0sXG4gIHNoYXBlVHlwZTogJ2VsbGlwc2UnLFxuICAvLyDmlofmnKzkvY3nva5cbiAgbGFiZWxQb3NpdGlvbjogJ2NlbnRlcicsXG4gIGRyYXdTaGFwZTogZnVuY3Rpb24gZHJhd1NoYXBlKGNmZywgZ3JvdXApIHtcbiAgICB2YXIgX2EgPSAodGhpcy5tZXJnZVN0eWxlIHx8IHRoaXMuZ2V0T3B0aW9ucyhjZmcpKS5pY29uLFxuICAgICAgICBpY29uID0gX2EgPT09IHZvaWQgMCA/IHt9IDogX2E7XG4gICAgdmFyIHN0eWxlID0gdGhpcy5nZXRTaGFwZVN0eWxlKGNmZyk7XG4gICAgdmFyIGtleVNoYXBlID0gZ3JvdXAuYWRkU2hhcGUoJ2VsbGlwc2UnLCB7XG4gICAgICBhdHRyczogc3R5bGUsXG4gICAgICBjbGFzc05hbWU6ICdlbGxpcHNlLWtleVNoYXBlJyxcbiAgICAgIG5hbWU6ICdlbGxpcHNlLWtleVNoYXBlJyxcbiAgICAgIGRyYWdnYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIGdyb3VwWydzaGFwZU1hcCddWydlbGxpcHNlLWtleVNoYXBlJ10gPSBrZXlTaGFwZTtcbiAgICB2YXIgd2lkdGggPSBpY29uLndpZHRoLFxuICAgICAgICBoZWlnaHQgPSBpY29uLmhlaWdodCxcbiAgICAgICAgc2hvdyA9IGljb24uc2hvdyxcbiAgICAgICAgdGV4dCA9IGljb24udGV4dDtcblxuICAgIGlmIChzaG93KSB7XG4gICAgICBpZiAodGV4dCkge1xuICAgICAgICBncm91cFsnc2hhcGVNYXAnXVt0aGlzLnR5cGUgKyBcIi1pY29uXCJdID0gZ3JvdXAuYWRkU2hhcGUoJ3RleHQnLCB7XG4gICAgICAgICAgYXR0cnM6IF9fYXNzaWduKHtcbiAgICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgICB5OiAwLFxuICAgICAgICAgICAgZm9udFNpemU6IDEyLFxuICAgICAgICAgICAgZmlsbDogJyMwMDAnLFxuICAgICAgICAgICAgc3Ryb2tlOiAnIzAwMCcsXG4gICAgICAgICAgICB0ZXh0QmFzZWxpbmU6ICdtaWRkbGUnLFxuICAgICAgICAgICAgdGV4dEFsaWduOiAnY2VudGVyJ1xuICAgICAgICAgIH0sIGljb24pLFxuICAgICAgICAgIGNsYXNzTmFtZTogdGhpcy50eXBlICsgXCItaWNvblwiLFxuICAgICAgICAgIG5hbWU6IHRoaXMudHlwZSArIFwiLWljb25cIixcbiAgICAgICAgICBkcmFnZ2FibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBncm91cFsnc2hhcGVNYXAnXVt0aGlzLnR5cGUgKyBcIi1pY29uXCJdID0gZ3JvdXAuYWRkU2hhcGUoJ2ltYWdlJywge1xuICAgICAgICAgIGF0dHJzOiBfX2Fzc2lnbih7XG4gICAgICAgICAgICB4OiAtd2lkdGggLyAyLFxuICAgICAgICAgICAgeTogLWhlaWdodCAvIDJcbiAgICAgICAgICB9LCBpY29uKSxcbiAgICAgICAgICBjbGFzc05hbWU6IHRoaXMudHlwZSArIFwiLWljb25cIixcbiAgICAgICAgICBuYW1lOiB0aGlzLnR5cGUgKyBcIi1pY29uXCIsXG4gICAgICAgICAgZHJhZ2dhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuZHJhd0xpbmtQb2ludHMoY2ZnLCBncm91cCk7XG4gICAgcmV0dXJuIGtleVNoYXBlO1xuICB9LFxuXG4gIC8qKlxuICAgKiDnu5jliLboioLngrnkuIrnmoRMaW5rUG9pbnRzXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBjZmcgZGF0YeaVsOaNrumFjee9rumhuVxuICAgKiBAcGFyYW0ge0dyb3VwfSBncm91cCBHcm91cOWunuS+i1xuICAgKi9cbiAgZHJhd0xpbmtQb2ludHM6IGZ1bmN0aW9uIGRyYXdMaW5rUG9pbnRzKGNmZywgZ3JvdXApIHtcbiAgICB2YXIgX2EgPSAodGhpcy5tZXJnZVN0eWxlIHx8IHRoaXMuZ2V0T3B0aW9ucyhjZmcpKS5saW5rUG9pbnRzLFxuICAgICAgICBsaW5rUG9pbnRzID0gX2EgPT09IHZvaWQgMCA/IHt9IDogX2E7XG5cbiAgICB2YXIgdG9wID0gbGlua1BvaW50cy50b3AsXG4gICAgICAgIGxlZnQgPSBsaW5rUG9pbnRzLmxlZnQsXG4gICAgICAgIHJpZ2h0ID0gbGlua1BvaW50cy5yaWdodCxcbiAgICAgICAgYm90dG9tID0gbGlua1BvaW50cy5ib3R0b20sXG4gICAgICAgIG1hcmtTaXplID0gbGlua1BvaW50cy5zaXplLFxuICAgICAgICBtYXJrUiA9IGxpbmtQb2ludHMucixcbiAgICAgICAgbWFya1N0eWxlID0gX19yZXN0KGxpbmtQb2ludHMsIFtcInRvcFwiLCBcImxlZnRcIiwgXCJyaWdodFwiLCBcImJvdHRvbVwiLCBcInNpemVcIiwgXCJyXCJdKTtcblxuICAgIHZhciBzaXplID0gdGhpcy5nZXRTaXplKGNmZyk7XG4gICAgdmFyIHJ4ID0gc2l6ZVswXSAvIDI7XG4gICAgdmFyIHJ5ID0gc2l6ZVsxXSAvIDI7XG5cbiAgICBpZiAobGVmdCkge1xuICAgICAgLy8gbGVmdCBjaXJjbGVcbiAgICAgIGdyb3VwWydzaGFwZU1hcCddWydsaW5rLXBvaW50LWxlZnQnXSA9IGdyb3VwLmFkZFNoYXBlKCdjaXJjbGUnLCB7XG4gICAgICAgIGF0dHJzOiBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgbWFya1N0eWxlKSwge1xuICAgICAgICAgIHg6IC1yeCxcbiAgICAgICAgICB5OiAwLFxuICAgICAgICAgIHI6IG1hcmtTaXplIC8gMiB8fCBtYXJrUiB8fCA1XG4gICAgICAgIH0pLFxuICAgICAgICBjbGFzc05hbWU6ICdsaW5rLXBvaW50LWxlZnQnLFxuICAgICAgICBuYW1lOiAnbGluay1wb2ludC1sZWZ0JyxcbiAgICAgICAgaXNBbmNob3JQb2ludDogdHJ1ZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHJpZ2h0KSB7XG4gICAgICAvLyByaWdodCBjaXJjbGVcbiAgICAgIGdyb3VwWydzaGFwZU1hcCddWydsaW5rLXBvaW50LXJpZ2h0J10gPSBncm91cC5hZGRTaGFwZSgnY2lyY2xlJywge1xuICAgICAgICBhdHRyczogX19hc3NpZ24oX19hc3NpZ24oe30sIG1hcmtTdHlsZSksIHtcbiAgICAgICAgICB4OiByeCxcbiAgICAgICAgICB5OiAwLFxuICAgICAgICAgIHI6IG1hcmtTaXplIC8gMiB8fCBtYXJrUiB8fCA1XG4gICAgICAgIH0pLFxuICAgICAgICBjbGFzc05hbWU6ICdsaW5rLXBvaW50LXJpZ2h0JyxcbiAgICAgICAgbmFtZTogJ2xpbmstcG9pbnQtcmlnaHQnLFxuICAgICAgICBpc0FuY2hvclBvaW50OiB0cnVlXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodG9wKSB7XG4gICAgICAvLyB0b3AgY2lyY2xlXG4gICAgICBncm91cFsnc2hhcGVNYXAnXVsnbGluay1wb2ludC10b3AnXSA9IGdyb3VwLmFkZFNoYXBlKCdjaXJjbGUnLCB7XG4gICAgICAgIGF0dHJzOiBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgbWFya1N0eWxlKSwge1xuICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgeTogLXJ5LFxuICAgICAgICAgIHI6IG1hcmtTaXplIC8gMiB8fCBtYXJrUiB8fCA1XG4gICAgICAgIH0pLFxuICAgICAgICBjbGFzc05hbWU6ICdsaW5rLXBvaW50LXRvcCcsXG4gICAgICAgIG5hbWU6ICdsaW5rLXBvaW50LXRvcCcsXG4gICAgICAgIGlzQW5jaG9yUG9pbnQ6IHRydWVcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChib3R0b20pIHtcbiAgICAgIC8vIGJvdHRvbSBjaXJjbGVcbiAgICAgIGdyb3VwWydzaGFwZU1hcCddWydsaW5rLXBvaW50LWJvdHRvbSddID0gZ3JvdXAuYWRkU2hhcGUoJ2NpcmNsZScsIHtcbiAgICAgICAgYXR0cnM6IF9fYXNzaWduKF9fYXNzaWduKHt9LCBtYXJrU3R5bGUpLCB7XG4gICAgICAgICAgeDogMCxcbiAgICAgICAgICB5OiByeSxcbiAgICAgICAgICByOiBtYXJrU2l6ZSAvIDIgfHwgbWFya1IgfHwgNVxuICAgICAgICB9KSxcbiAgICAgICAgY2xhc3NOYW1lOiAnbGluay1wb2ludC1ib3R0b20nLFxuICAgICAgICBuYW1lOiAnbGluay1wb2ludC1ib3R0b20nLFxuICAgICAgICBpc0FuY2hvclBvaW50OiB0cnVlXG4gICAgICB9KTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIOiOt+WPluiKgueCueeahOagt+W8j++8jOS+m+WfuuS6juivpeiKgueCueiHquWumuS5ieaXtuS9v+eUqFxuICAgKiBAcGFyYW0ge09iamVjdH0gY2ZnIOiKgueCueaVsOaNruaooeWei1xuICAgKiBAcmV0dXJuIHtPYmplY3R9IOiKgueCueeahOagt+W8j1xuICAgKi9cbiAgZ2V0U2hhcGVTdHlsZTogZnVuY3Rpb24gZ2V0U2hhcGVTdHlsZShjZmcpIHtcbiAgICB2YXIgZGVmYXVsdFN0eWxlID0gKHRoaXMubWVyZ2VTdHlsZSB8fCB0aGlzLmdldE9wdGlvbnMoY2ZnKSkuc3R5bGU7XG4gICAgdmFyIHN0cm9rZVN0eWxlID0ge1xuICAgICAgc3Ryb2tlOiBjZmcuY29sb3JcbiAgICB9OyAvLyDlpoLmnpzorr7nva7kuoZjb2xvcu+8jOWImeimhueblum7mOiupOeahHN0cm9rZeWxnuaAp1xuXG4gICAgdmFyIHN0eWxlID0gbWl4KHt9LCBkZWZhdWx0U3R5bGUsIHN0cm9rZVN0eWxlKTtcbiAgICB2YXIgc2l6ZSA9IHRoaXMuZ2V0U2l6ZShjZmcpO1xuICAgIHZhciByeCA9IHNpemVbMF0gLyAyO1xuICAgIHZhciByeSA9IHNpemVbMV0gLyAyO1xuXG4gICAgdmFyIHN0eWxlcyA9IF9fYXNzaWduKHtcbiAgICAgIHg6IDAsXG4gICAgICB5OiAwLFxuICAgICAgcng6IHJ4LFxuICAgICAgcnk6IHJ5XG4gICAgfSwgc3R5bGUpO1xuXG4gICAgcmV0dXJuIHN0eWxlcztcbiAgfSxcbiAgdXBkYXRlOiBmdW5jdGlvbiB1cGRhdGUoY2ZnLCBpdGVtLCB1cGRhdGVUeXBlKSB7XG4gICAgdmFyIGdyb3VwID0gaXRlbS5nZXRDb250YWluZXIoKTsgLy8g6L+Z6YeM5LiN5LygIGNmZyDlj4LmlbDmmK/lm6DkuLogY2ZnLnN0eWxlIOmcgOimgeacgOWQjuimhuebluagt+W8j1xuXG4gICAgdmFyIGRlZmF1bHRTdHlsZSA9IHRoaXMuZ2V0T3B0aW9ucyh7fSkuc3R5bGU7XG4gICAgdmFyIHNpemUgPSB0aGlzLmdldFNpemUoY2ZnKTtcbiAgICB2YXIgc3Ryb2tlU3R5bGUgPSB7XG4gICAgICBzdHJva2U6IGNmZy5jb2xvcixcbiAgICAgIHJ4OiBzaXplWzBdIC8gMixcbiAgICAgIHJ5OiBzaXplWzFdIC8gMlxuICAgIH07IC8vIOS4jiBnZXRTaGFwZVN0eWxlIOS4jeWQjOWcqOS6ju+8jHVwZGF0ZSDml7bpnIDopoHojrflj5bliLDlvZPliY3nmoQgc3R5bGUg6L+b6KGM6J6N5ZCI44CC5Y2z5paw5Lyg5YWl55qE6YWN572u6aG55Lit5rKh5pyJ5raJ5Y+K55qE5bGe5oCn77yM5L+d55WZ5b2T5YmN55qE6YWN572u44CCXG5cbiAgICB2YXIga2V5U2hhcGUgPSBpdGVtLmdldCgna2V5U2hhcGUnKTtcbiAgICB2YXIgc3R5bGUgPSBtaXgoe30sIGRlZmF1bHRTdHlsZSwga2V5U2hhcGUuYXR0cigpLCBzdHJva2VTdHlsZSk7XG4gICAgc3R5bGUgPSBtaXgoc3R5bGUsIGNmZy5zdHlsZSk7XG4gICAgdGhpcy51cGRhdGVTaGFwZShjZmcsIGl0ZW0sIHN0eWxlLCB0cnVlLCB1cGRhdGVUeXBlKTtcbiAgICB0aGlzLnVwZGF0ZUxpbmtQb2ludHMoY2ZnLCBncm91cCk7XG4gIH1cbn0sICdzaW5nbGUtbm9kZScpOyIsImltcG9ydCB7IF9fYXNzaWduLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IHJlZ2lzdGVyTm9kZSwgQmFzZUdsb2JhbCBhcyBHbG9iYWwgfSBmcm9tICdAYW50di9nNi1jb3JlJztcbmltcG9ydCB7IG1peCB9IGZyb20gJ0BhbnR2L3V0aWwnOyAvLyDoj7HlvaJzaGFwZVxuXG5yZWdpc3Rlck5vZGUoJ2RpYW1vbmQnLCB7XG4gIC8vIOiHquWumuS5ieiKgueCueaXtueahOmFjee9rlxuICBvcHRpb25zOiB7XG4gICAgc2l6ZTogWzgwLCA4MF0sXG4gICAgc3R5bGU6IHtcbiAgICAgIHN0cm9rZTogR2xvYmFsLmRlZmF1bHROb2RlLnN0eWxlLnN0cm9rZSxcbiAgICAgIGZpbGw6IEdsb2JhbC5kZWZhdWx0Tm9kZS5zdHlsZS5maWxsLFxuICAgICAgbGluZVdpZHRoOiBHbG9iYWwuZGVmYXVsdE5vZGUuc3R5bGUubGluZVdpZHRoXG4gICAgfSxcbiAgICAvLyDmlofmnKzmoLflvI/phY3nva5cbiAgICBsYWJlbENmZzoge1xuICAgICAgc3R5bGU6IHtcbiAgICAgICAgZmlsbDogR2xvYmFsLm5vZGVMYWJlbC5zdHlsZS5maWxsLFxuICAgICAgICBmb250U2l6ZTogR2xvYmFsLm5vZGVMYWJlbC5zdHlsZS5mb250U2l6ZSxcbiAgICAgICAgZm9udEZhbWlseTogR2xvYmFsLndpbmRvd0ZvbnRGYW1pbHlcbiAgICAgIH1cbiAgICB9LFxuICAgIC8vIOiKgueCueS4iuW3puWPs+S4iuS4i+Wbm+S4quaWueWQkeS4iueahOmTvuaOpWNpcmNsZemFjee9rlxuICAgIGxpbmtQb2ludHM6IHtcbiAgICAgIHRvcDogZmFsc2UsXG4gICAgICByaWdodDogZmFsc2UsXG4gICAgICBib3R0b206IGZhbHNlLFxuICAgICAgbGVmdDogZmFsc2UsXG4gICAgICAvLyBjaXJjbGXnmoTlpKflsI9cbiAgICAgIHNpemU6IEdsb2JhbC5kZWZhdWx0Tm9kZS5saW5rUG9pbnRzLnNpemUsXG4gICAgICBsaW5lV2lkdGg6IEdsb2JhbC5kZWZhdWx0Tm9kZS5saW5rUG9pbnRzLmxpbmVXaWR0aCxcbiAgICAgIGZpbGw6IEdsb2JhbC5kZWZhdWx0Tm9kZS5saW5rUG9pbnRzLmZpbGwsXG4gICAgICBzdHJva2U6IEdsb2JhbC5kZWZhdWx0Tm9kZS5saW5rUG9pbnRzLnN0cm9rZVxuICAgIH0sXG4gICAgLy8g6IqC54K55LitaWNvbumFjee9rlxuICAgIGljb246IHtcbiAgICAgIC8vIOaYr+WQpuaYvuekumljb27vvIzlgLzkuLogZmFsc2Ug5YiZ5LiN5riy5p+TaWNvblxuICAgICAgc2hvdzogZmFsc2UsXG4gICAgICAvLyBpY29u55qE5Zyw5Z2A77yM5a2X56ym5Liy57G75Z6LXG4gICAgICBpbWc6ICdodHRwczovL2d3LmFsaXBheW9iamVjdHMuY29tL3pvcy9ibXctcHJvZC81ZDAxNTA2NS04NTA1LTRlN2EtYmFlYy05NzZmODFlM2M0MWQuc3ZnJyxcbiAgICAgIHdpZHRoOiAyMCxcbiAgICAgIGhlaWdodDogMjBcbiAgICB9LFxuICAgIHN0YXRlU3R5bGVzOiBfX2Fzc2lnbih7fSwgR2xvYmFsLm5vZGVTdGF0ZVN0eWxlcylcbiAgfSxcbiAgc2hhcGVUeXBlOiAnZGlhbW9uZCcsXG4gIC8vIOaWh+acrOS9jee9rlxuICBsYWJlbFBvc2l0aW9uOiAnY2VudGVyJyxcbiAgZHJhd1NoYXBlOiBmdW5jdGlvbiBkcmF3U2hhcGUoY2ZnLCBncm91cCkge1xuICAgIHZhciBfYSA9ICh0aGlzLm1lcmdlU3R5bGUgfHwgdGhpcy5nZXRPcHRpb25zKGNmZykpLmljb24sXG4gICAgICAgIGljb24gPSBfYSA9PT0gdm9pZCAwID8ge30gOiBfYTtcbiAgICB2YXIgc3R5bGUgPSB0aGlzLmdldFNoYXBlU3R5bGUoY2ZnKTtcbiAgICB2YXIga2V5U2hhcGUgPSBncm91cC5hZGRTaGFwZSgncGF0aCcsIHtcbiAgICAgIGF0dHJzOiBzdHlsZSxcbiAgICAgIGNsYXNzTmFtZTogdGhpcy50eXBlICsgXCIta2V5U2hhcGVcIixcbiAgICAgIG5hbWU6IHRoaXMudHlwZSArIFwiLWtleVNoYXBlXCIsXG4gICAgICBkcmFnZ2FibGU6IHRydWVcbiAgICB9KTtcbiAgICBncm91cFsnc2hhcGVNYXAnXVt0aGlzLnR5cGUgKyBcIi1rZXlTaGFwZVwiXSA9IGtleVNoYXBlO1xuICAgIHZhciB3ID0gaWNvbi53aWR0aCxcbiAgICAgICAgaCA9IGljb24uaGVpZ2h0LFxuICAgICAgICBzaG93ID0gaWNvbi5zaG93LFxuICAgICAgICB0ZXh0ID0gaWNvbi50ZXh0O1xuXG4gICAgaWYgKHNob3cpIHtcbiAgICAgIGlmICh0ZXh0KSB7XG4gICAgICAgIGdyb3VwWydzaGFwZU1hcCddW3RoaXMudHlwZSArIFwiLWljb25cIl0gPSBncm91cC5hZGRTaGFwZSgndGV4dCcsIHtcbiAgICAgICAgICBhdHRyczogX19hc3NpZ24oe1xuICAgICAgICAgICAgeDogMCxcbiAgICAgICAgICAgIHk6IDAsXG4gICAgICAgICAgICBmb250U2l6ZTogMTIsXG4gICAgICAgICAgICBmaWxsOiAnIzAwMCcsXG4gICAgICAgICAgICBzdHJva2U6ICcjMDAwJyxcbiAgICAgICAgICAgIHRleHRCYXNlbGluZTogJ21pZGRsZScsXG4gICAgICAgICAgICB0ZXh0QWxpZ246ICdjZW50ZXInXG4gICAgICAgICAgfSwgaWNvbiksXG4gICAgICAgICAgY2xhc3NOYW1lOiB0aGlzLnR5cGUgKyBcIi1pY29uXCIsXG4gICAgICAgICAgbmFtZTogdGhpcy50eXBlICsgXCItaWNvblwiLFxuICAgICAgICAgIGRyYWdnYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGdyb3VwWydzaGFwZU1hcCddW3RoaXMudHlwZSArIFwiLWljb25cIl0gPSBncm91cC5hZGRTaGFwZSgnaW1hZ2UnLCB7XG4gICAgICAgICAgYXR0cnM6IF9fYXNzaWduKHtcbiAgICAgICAgICAgIHg6IC13IC8gMixcbiAgICAgICAgICAgIHk6IC1oIC8gMlxuICAgICAgICAgIH0sIGljb24pLFxuICAgICAgICAgIGNsYXNzTmFtZTogdGhpcy50eXBlICsgXCItaWNvblwiLFxuICAgICAgICAgIG5hbWU6IHRoaXMudHlwZSArIFwiLWljb25cIixcbiAgICAgICAgICBkcmFnZ2FibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5kcmF3TGlua1BvaW50cyhjZmcsIGdyb3VwKTtcbiAgICByZXR1cm4ga2V5U2hhcGU7XG4gIH0sXG5cbiAgLyoqXG4gICAqIOe7mOWItuiKgueCueS4iueahExpbmtQb2ludHNcbiAgICogQHBhcmFtIHtPYmplY3R9IGNmZyBkYXRh5pWw5o2u6YWN572u6aG5XG4gICAqIEBwYXJhbSB7R3JvdXB9IGdyb3VwIEdyb3Vw5a6e5L6LXG4gICAqL1xuICBkcmF3TGlua1BvaW50czogZnVuY3Rpb24gZHJhd0xpbmtQb2ludHMoY2ZnLCBncm91cCkge1xuICAgIHZhciBfYSA9ICh0aGlzLm1lcmdlU3R5bGUgfHwgdGhpcy5nZXRPcHRpb25zKGNmZykpLmxpbmtQb2ludHMsXG4gICAgICAgIGxpbmtQb2ludHMgPSBfYSA9PT0gdm9pZCAwID8ge30gOiBfYTtcblxuICAgIHZhciB0b3AgPSBsaW5rUG9pbnRzLnRvcCxcbiAgICAgICAgbGVmdCA9IGxpbmtQb2ludHMubGVmdCxcbiAgICAgICAgcmlnaHQgPSBsaW5rUG9pbnRzLnJpZ2h0LFxuICAgICAgICBib3R0b20gPSBsaW5rUG9pbnRzLmJvdHRvbSxcbiAgICAgICAgbWFya1NpemUgPSBsaW5rUG9pbnRzLnNpemUsXG4gICAgICAgIG1hcmtSID0gbGlua1BvaW50cy5yLFxuICAgICAgICBtYXJrU3R5bGUgPSBfX3Jlc3QobGlua1BvaW50cywgW1widG9wXCIsIFwibGVmdFwiLCBcInJpZ2h0XCIsIFwiYm90dG9tXCIsIFwic2l6ZVwiLCBcInJcIl0pO1xuXG4gICAgdmFyIHNpemUgPSB0aGlzLmdldFNpemUoY2ZnKTtcbiAgICB2YXIgd2lkdGggPSBzaXplWzBdO1xuICAgIHZhciBoZWlnaHQgPSBzaXplWzFdO1xuXG4gICAgaWYgKGxlZnQpIHtcbiAgICAgIC8vIGxlZnQgY2lyY2xlXG4gICAgICBncm91cFsnc2hhcGVNYXAnXVsnbGluay1wb2ludC1sZWZ0J10gPSBncm91cC5hZGRTaGFwZSgnY2lyY2xlJywge1xuICAgICAgICBhdHRyczogX19hc3NpZ24oX19hc3NpZ24oe30sIG1hcmtTdHlsZSksIHtcbiAgICAgICAgICB4OiAtd2lkdGggLyAyLFxuICAgICAgICAgIHk6IDAsXG4gICAgICAgICAgcjogbWFya1NpemUgLyAyIHx8IG1hcmtSIHx8IDVcbiAgICAgICAgfSksXG4gICAgICAgIGNsYXNzTmFtZTogJ2xpbmstcG9pbnQtbGVmdCcsXG4gICAgICAgIG5hbWU6ICdsaW5rLXBvaW50LWxlZnQnLFxuICAgICAgICBpc0FuY2hvclBvaW50OiB0cnVlXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAocmlnaHQpIHtcbiAgICAgIC8vIHJpZ2h0IGNpcmNsZVxuICAgICAgZ3JvdXBbJ3NoYXBlTWFwJ11bJ2xpbmstcG9pbnQtcmlnaHQnXSA9IGdyb3VwLmFkZFNoYXBlKCdjaXJjbGUnLCB7XG4gICAgICAgIGF0dHJzOiBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgbWFya1N0eWxlKSwge1xuICAgICAgICAgIHg6IHdpZHRoIC8gMixcbiAgICAgICAgICB5OiAwLFxuICAgICAgICAgIHI6IG1hcmtTaXplIC8gMiB8fCBtYXJrUiB8fCA1XG4gICAgICAgIH0pLFxuICAgICAgICBjbGFzc05hbWU6ICdsaW5rLXBvaW50LXJpZ2h0JyxcbiAgICAgICAgbmFtZTogJ2xpbmstcG9pbnQtcmlnaHQnLFxuICAgICAgICBpc0FuY2hvclBvaW50OiB0cnVlXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodG9wKSB7XG4gICAgICAvLyB0b3AgY2lyY2xlXG4gICAgICBncm91cFsnc2hhcGVNYXAnXVsnbGluay1wb2ludC10b3AnXSA9IGdyb3VwLmFkZFNoYXBlKCdjaXJjbGUnLCB7XG4gICAgICAgIGF0dHJzOiBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgbWFya1N0eWxlKSwge1xuICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgeTogLWhlaWdodCAvIDIsXG4gICAgICAgICAgcjogbWFya1NpemUgLyAyIHx8IG1hcmtSIHx8IDVcbiAgICAgICAgfSksXG4gICAgICAgIGNsYXNzTmFtZTogJ2xpbmstcG9pbnQtdG9wJyxcbiAgICAgICAgbmFtZTogJ2xpbmstcG9pbnQtdG9wJyxcbiAgICAgICAgaXNBbmNob3JQb2ludDogdHJ1ZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGJvdHRvbSkge1xuICAgICAgLy8gYm90dG9tIGNpcmNsZVxuICAgICAgZ3JvdXBbJ3NoYXBlTWFwJ11bJ2xpbmstcG9pbnQtYm90dG9tJ10gPSBncm91cC5hZGRTaGFwZSgnY2lyY2xlJywge1xuICAgICAgICBhdHRyczogX19hc3NpZ24oX19hc3NpZ24oe30sIG1hcmtTdHlsZSksIHtcbiAgICAgICAgICB4OiAwLFxuICAgICAgICAgIHk6IGhlaWdodCAvIDIsXG4gICAgICAgICAgcjogbWFya1NpemUgLyAyIHx8IG1hcmtSIHx8IDVcbiAgICAgICAgfSksXG4gICAgICAgIGNsYXNzTmFtZTogJ2xpbmstcG9pbnQtYm90dG9tJyxcbiAgICAgICAgbmFtZTogJ2xpbmstcG9pbnQtYm90dG9tJyxcbiAgICAgICAgaXNBbmNob3JQb2ludDogdHJ1ZVxuICAgICAgfSk7XG4gICAgfVxuICB9LFxuICBnZXRQYXRoOiBmdW5jdGlvbiBnZXRQYXRoKGNmZykge1xuICAgIHZhciBzaXplID0gdGhpcy5nZXRTaXplKGNmZyk7XG4gICAgdmFyIHdpZHRoID0gc2l6ZVswXTtcbiAgICB2YXIgaGVpZ2h0ID0gc2l6ZVsxXTtcbiAgICB2YXIgcGF0aCA9IFtbJ00nLCAwLCAtaGVpZ2h0IC8gMl0sIFsnTCcsIHdpZHRoIC8gMiwgMF0sIFsnTCcsIDAsIGhlaWdodCAvIDJdLCBbJ0wnLCAtd2lkdGggLyAyLCAwXSwgWydaJ10gLy8g5bCB6ZetXG4gICAgXTtcbiAgICByZXR1cm4gcGF0aDtcbiAgfSxcblxuICAvKipcbiAgICog6I635Y+W6IqC54K555qE5qC35byP77yM5L6b5Z+65LqO6K+l6IqC54K56Ieq5a6a5LmJ5pe25L2/55SoXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBjZmcg6IqC54K55pWw5o2u5qih5Z6LXG4gICAqIEByZXR1cm4ge09iamVjdH0g6IqC54K555qE5qC35byPXG4gICAqL1xuICBnZXRTaGFwZVN0eWxlOiBmdW5jdGlvbiBnZXRTaGFwZVN0eWxlKGNmZykge1xuICAgIHZhciBkZWZhdWx0U3R5bGUgPSAodGhpcy5tZXJnZVN0eWxlIHx8IHRoaXMuZ2V0T3B0aW9ucyhjZmcpKS5zdHlsZTtcbiAgICB2YXIgc3Ryb2tlU3R5bGUgPSB7XG4gICAgICBzdHJva2U6IGNmZy5jb2xvclxuICAgIH07IC8vIOWmguaenOiuvue9ruS6hmNvbG9y77yM5YiZ6KaG55uW6buY6K6k55qEc3Ryb2tl5bGe5oCnXG5cbiAgICB2YXIgc3R5bGUgPSBtaXgoe30sIGRlZmF1bHRTdHlsZSwgc3Ryb2tlU3R5bGUpO1xuICAgIHZhciBwYXRoID0gdGhpcy5nZXRQYXRoKGNmZyk7XG5cbiAgICB2YXIgc3R5bGVzID0gX19hc3NpZ24oe1xuICAgICAgcGF0aDogcGF0aFxuICAgIH0sIHN0eWxlKTtcblxuICAgIHJldHVybiBzdHlsZXM7XG4gIH0sXG4gIHVwZGF0ZTogZnVuY3Rpb24gdXBkYXRlKGNmZywgaXRlbSwgdXBkYXRlVHlwZSkge1xuICAgIHZhciBncm91cCA9IGl0ZW0uZ2V0Q29udGFpbmVyKCk7IC8vIOi/memHjOS4jeS8oCBjZmcg5Y+C5pWw5piv5Zug5Li6IGNmZy5zdHlsZSDpnIDopoHmnIDlkI7opobnm5bmoLflvI9cblxuICAgIHZhciBkZWZhdWx0U3R5bGUgPSB0aGlzLmdldE9wdGlvbnMoe30pLnN0eWxlO1xuICAgIHZhciBwYXRoID0gdGhpcy5nZXRQYXRoKGNmZyk7IC8vIOS4i+mdoui/meS6m+WxnuaAp+mcgOimgeimhueblum7mOiupOagt+W8j+S4juebruWJjeagt+W8j++8jOS9huiLpeWcqCBjZmcg5Lit5pyJ5oyH5a6a5YiZ5bqU6K+l6KKrIGNmZyDnmoTnm7jlupTphY3nva7opobnm5bjgIJcblxuICAgIHZhciBzdHJva2VTdHlsZSA9IHtcbiAgICAgIHN0cm9rZTogY2ZnLmNvbG9yLFxuICAgICAgcGF0aDogcGF0aFxuICAgIH07IC8vIOS4jiBnZXRTaGFwZVN0eWxlIOS4jeWQjOWcqOS6ju+8jHVwZGF0ZSDml7bpnIDopoHojrflj5bliLDlvZPliY3nmoQgc3R5bGUg6L+b6KGM6J6N5ZCI44CC5Y2z5paw5Lyg5YWl55qE6YWN572u6aG55Lit5rKh5pyJ5raJ5Y+K55qE5bGe5oCn77yM5L+d55WZ5b2T5YmN55qE6YWN572u44CCXG5cbiAgICB2YXIga2V5U2hhcGUgPSBpdGVtLmdldCgna2V5U2hhcGUnKTtcbiAgICB2YXIgc3R5bGUgPSBtaXgoe30sIGRlZmF1bHRTdHlsZSwga2V5U2hhcGUuYXR0cigpLCBzdHJva2VTdHlsZSk7XG4gICAgc3R5bGUgPSBtaXgoc3R5bGUsIGNmZy5zdHlsZSk7XG4gICAgdGhpcy51cGRhdGVTaGFwZShjZmcsIGl0ZW0sIHN0eWxlLCB0cnVlLCB1cGRhdGVUeXBlKTtcbiAgICB0aGlzLnVwZGF0ZUxpbmtQb2ludHMoY2ZnLCBncm91cCk7XG4gIH1cbn0sICdzaW5nbGUtbm9kZScpOyIsImltcG9ydCB7IF9fYXNzaWduLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IHJlZ2lzdGVyTm9kZSwgQmFzZUdsb2JhbCBhcyBHbG9iYWwgfSBmcm9tICdAYW50di9nNi1jb3JlJztcbmltcG9ydCB7IG1peCB9IGZyb20gJ0BhbnR2L3V0aWwnOyAvLyDkuInop5LlvaJcblxucmVnaXN0ZXJOb2RlKCd0cmlhbmdsZScsIHtcbiAgLy8g6Ieq5a6a5LmJ6IqC54K55pe255qE6YWN572uXG4gIG9wdGlvbnM6IHtcbiAgICBzaXplOiA0MCxcbiAgICBkaXJlY3Rpb246ICd1cCcsXG4gICAgc3R5bGU6IHtcbiAgICAgIHN0cm9rZTogR2xvYmFsLmRlZmF1bHROb2RlLnN0eWxlLnN0cm9rZSxcbiAgICAgIGZpbGw6IEdsb2JhbC5kZWZhdWx0Tm9kZS5zdHlsZS5maWxsLFxuICAgICAgbGluZVdpZHRoOiBHbG9iYWwuZGVmYXVsdE5vZGUuc3R5bGUubGluZVdpZHRoXG4gICAgfSxcbiAgICBsYWJlbENmZzoge1xuICAgICAgc3R5bGU6IHtcbiAgICAgICAgZmlsbDogR2xvYmFsLm5vZGVMYWJlbC5zdHlsZS5maWxsLFxuICAgICAgICBmb250U2l6ZTogR2xvYmFsLm5vZGVMYWJlbC5zdHlsZS5mb250U2l6ZVxuICAgICAgfSxcbiAgICAgIG9mZnNldDogMTVcbiAgICB9LFxuICAgIC8vIOiKgueCueS4iuW3puWPs+S4iuS4i+Wbm+S4quaWueWQkeS4iueahOmTvuaOpWNpcmNsZemFjee9rlxuICAgIGxpbmtQb2ludHM6IHtcbiAgICAgIHRvcDogZmFsc2UsXG4gICAgICByaWdodDogZmFsc2UsXG4gICAgICBib3R0b206IGZhbHNlLFxuICAgICAgbGVmdDogZmFsc2UsXG4gICAgICAvLyBjaXJjbGXnmoTlpKflsI9cbiAgICAgIHNpemU6IEdsb2JhbC5kZWZhdWx0Tm9kZS5saW5rUG9pbnRzLnNpemUsXG4gICAgICBsaW5lV2lkdGg6IEdsb2JhbC5kZWZhdWx0Tm9kZS5saW5rUG9pbnRzLmxpbmVXaWR0aCxcbiAgICAgIGZpbGw6IEdsb2JhbC5kZWZhdWx0Tm9kZS5saW5rUG9pbnRzLmZpbGwsXG4gICAgICBzdHJva2U6IEdsb2JhbC5kZWZhdWx0Tm9kZS5saW5rUG9pbnRzLnN0cm9rZVxuICAgIH0sXG4gICAgLy8g6IqC54K55LitaWNvbumFjee9rlxuICAgIGljb246IHtcbiAgICAgIC8vIOaYr+WQpuaYvuekumljb27vvIzlgLzkuLogZmFsc2Ug5YiZ5LiN5riy5p+TaWNvblxuICAgICAgc2hvdzogZmFsc2UsXG4gICAgICAvLyBpY29u55qE5Zyw5Z2A77yM5a2X56ym5Liy57G75Z6LXG4gICAgICBpbWc6ICdodHRwczovL2d3LmFsaXBheW9iamVjdHMuY29tL3pvcy9ibXctcHJvZC81ZDAxNTA2NS04NTA1LTRlN2EtYmFlYy05NzZmODFlM2M0MWQuc3ZnJyxcbiAgICAgIHdpZHRoOiAyMCxcbiAgICAgIGhlaWdodDogMjAsXG4gICAgICBvZmZzZXQ6IDZcbiAgICB9LFxuICAgIHN0YXRlU3R5bGVzOiBfX2Fzc2lnbih7fSwgR2xvYmFsLm5vZGVTdGF0ZVN0eWxlcylcbiAgfSxcbiAgc2hhcGVUeXBlOiAndHJpYW5nbGUnLFxuICAvLyDmlofmnKzkvY3nva5cbiAgbGFiZWxQb3NpdGlvbjogJ2JvdHRvbScsXG4gIGRyYXdTaGFwZTogZnVuY3Rpb24gZHJhd1NoYXBlKGNmZywgZ3JvdXApIHtcbiAgICB2YXIgX2EgPSB0aGlzLm1lcmdlU3R5bGUgfHwgdGhpcy5nZXRPcHRpb25zKGNmZyksXG4gICAgICAgIF9iID0gX2EuaWNvbixcbiAgICAgICAgaWNvbiA9IF9iID09PSB2b2lkIDAgPyB7fSA6IF9iLFxuICAgICAgICBkZWZhdWx0RGlyZWN0aW9uID0gX2EuZGlyZWN0aW9uO1xuXG4gICAgdmFyIHN0eWxlID0gdGhpcy5nZXRTaGFwZVN0eWxlKGNmZyk7XG4gICAgdmFyIGRpcmVjdGlvbiA9IGNmZy5kaXJlY3Rpb24gfHwgZGVmYXVsdERpcmVjdGlvbjtcbiAgICB2YXIga2V5U2hhcGUgPSBncm91cC5hZGRTaGFwZSgncGF0aCcsIHtcbiAgICAgIGF0dHJzOiBzdHlsZSxcbiAgICAgIGNsYXNzTmFtZTogdGhpcy50eXBlICsgXCIta2V5U2hhcGVcIixcbiAgICAgIG5hbWU6IHRoaXMudHlwZSArIFwiLWtleVNoYXBlXCIsXG4gICAgICBkcmFnZ2FibGU6IHRydWVcbiAgICB9KTtcbiAgICBncm91cFsnc2hhcGVNYXAnXVt0aGlzLnR5cGUgKyBcIi1rZXlTaGFwZVwiXSA9IGtleVNoYXBlO1xuICAgIHZhciB3ID0gaWNvbi53aWR0aCxcbiAgICAgICAgaCA9IGljb24uaGVpZ2h0LFxuICAgICAgICBzaG93ID0gaWNvbi5zaG93LFxuICAgICAgICBvZmZzZXQgPSBpY29uLm9mZnNldCxcbiAgICAgICAgdGV4dCA9IGljb24udGV4dDtcblxuICAgIGlmIChzaG93KSB7XG4gICAgICBpZiAodGV4dCkge1xuICAgICAgICBncm91cFsnc2hhcGVNYXAnXVt0aGlzLnR5cGUgKyBcIi1pY29uXCJdID0gZ3JvdXAuYWRkU2hhcGUoJ3RleHQnLCB7XG4gICAgICAgICAgYXR0cnM6IF9fYXNzaWduKHtcbiAgICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgICB5OiAwLFxuICAgICAgICAgICAgZm9udFNpemU6IDEyLFxuICAgICAgICAgICAgZmlsbDogJyMwMDAnLFxuICAgICAgICAgICAgc3Ryb2tlOiAnIzAwMCcsXG4gICAgICAgICAgICB0ZXh0QmFzZWxpbmU6ICdtaWRkbGUnLFxuICAgICAgICAgICAgdGV4dEFsaWduOiAnY2VudGVyJ1xuICAgICAgICAgIH0sIGljb24pLFxuICAgICAgICAgIGNsYXNzTmFtZTogdGhpcy50eXBlICsgXCItaWNvblwiLFxuICAgICAgICAgIG5hbWU6IHRoaXMudHlwZSArIFwiLWljb25cIixcbiAgICAgICAgICBkcmFnZ2FibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgaWNvblcgPSAtdyAvIDI7XG4gICAgICAgIHZhciBpY29uSCA9IC1oIC8gMjtcblxuICAgICAgICBpZiAoZGlyZWN0aW9uID09PSAndXAnIHx8IGRpcmVjdGlvbiA9PT0gJ2Rvd24nKSB7XG4gICAgICAgICAgaWNvbkggKz0gb2Zmc2V0O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gJ2xlZnQnIHx8IGRpcmVjdGlvbiA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICAgIGljb25XICs9IG9mZnNldDtcbiAgICAgICAgfVxuXG4gICAgICAgIGdyb3VwWydzaGFwZU1hcCddW3RoaXMudHlwZSArIFwiLWljb25cIl0gPSBncm91cC5hZGRTaGFwZSgnaW1hZ2UnLCB7XG4gICAgICAgICAgYXR0cnM6IF9fYXNzaWduKHtcbiAgICAgICAgICAgIHg6IGljb25XLFxuICAgICAgICAgICAgeTogaWNvbkhcbiAgICAgICAgICB9LCBpY29uKSxcbiAgICAgICAgICBjbGFzc05hbWU6IHRoaXMudHlwZSArIFwiLWljb25cIixcbiAgICAgICAgICBuYW1lOiB0aGlzLnR5cGUgKyBcIi1pY29uXCIsXG4gICAgICAgICAgZHJhZ2dhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuZHJhd0xpbmtQb2ludHMoY2ZnLCBncm91cCk7XG4gICAgcmV0dXJuIGtleVNoYXBlO1xuICB9LFxuXG4gIC8qKlxuICAgKiDnu5jliLboioLngrnkuIrnmoRMaW5rUG9pbnRzXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBjZmcgZGF0YeaVsOaNrumFjee9rumhuVxuICAgKiBAcGFyYW0ge0dyb3VwfSBncm91cCBHcm91cOWunuS+i1xuICAgKi9cbiAgZHJhd0xpbmtQb2ludHM6IGZ1bmN0aW9uIGRyYXdMaW5rUG9pbnRzKGNmZywgZ3JvdXApIHtcbiAgICB2YXIgX2EgPSB0aGlzLm1lcmdlU3R5bGUgfHwgdGhpcy5nZXRPcHRpb25zKGNmZyksXG4gICAgICAgIF9iID0gX2EubGlua1BvaW50cyxcbiAgICAgICAgbGlua1BvaW50cyA9IF9iID09PSB2b2lkIDAgPyB7fSA6IF9iLFxuICAgICAgICBkZWZhdWx0RGlyZWN0aW9uID0gX2EuZGlyZWN0aW9uO1xuXG4gICAgdmFyIGRpcmVjdGlvbiA9IGNmZy5kaXJlY3Rpb24gfHwgZGVmYXVsdERpcmVjdGlvbjtcblxuICAgIHZhciB0b3AgPSBsaW5rUG9pbnRzLnRvcCxcbiAgICAgICAgbGVmdCA9IGxpbmtQb2ludHMubGVmdCxcbiAgICAgICAgcmlnaHQgPSBsaW5rUG9pbnRzLnJpZ2h0LFxuICAgICAgICBib3R0b20gPSBsaW5rUG9pbnRzLmJvdHRvbSxcbiAgICAgICAgbWFya1NpemUgPSBsaW5rUG9pbnRzLnNpemUsXG4gICAgICAgIG1hcmtSID0gbGlua1BvaW50cy5yLFxuICAgICAgICBtYXJrU3R5bGUgPSBfX3Jlc3QobGlua1BvaW50cywgW1widG9wXCIsIFwibGVmdFwiLCBcInJpZ2h0XCIsIFwiYm90dG9tXCIsIFwic2l6ZVwiLCBcInJcIl0pO1xuXG4gICAgdmFyIHNpemUgPSB0aGlzLmdldFNpemUoY2ZnKTtcbiAgICB2YXIgbGVuID0gc2l6ZVswXTtcblxuICAgIGlmIChsZWZ0KSB7XG4gICAgICAvLyB1cCBkb3duIGxlZnQgcmlnaHQg5Zub5Liq5pa55ZCR55qE5Z2Q5qCH5Z2H5LiN55u45ZCMXG4gICAgICB2YXIgbGVmdFBvcyA9IG51bGw7XG4gICAgICB2YXIgZGlmZlkgPSBsZW4gKiBNYXRoLnNpbigxIC8gMyAqIE1hdGguUEkpO1xuICAgICAgdmFyIHIgPSBsZW4gKiBNYXRoLnNpbigxIC8gMyAqIE1hdGguUEkpO1xuXG4gICAgICBpZiAoZGlyZWN0aW9uID09PSAndXAnKSB7XG4gICAgICAgIGxlZnRQb3MgPSBbLXIsIGRpZmZZXTtcbiAgICAgIH0gZWxzZSBpZiAoZGlyZWN0aW9uID09PSAnZG93bicpIHtcbiAgICAgICAgbGVmdFBvcyA9IFstciwgLWRpZmZZXTtcbiAgICAgIH0gZWxzZSBpZiAoZGlyZWN0aW9uID09PSAnbGVmdCcpIHtcbiAgICAgICAgbGVmdFBvcyA9IFstciwgciAtIGRpZmZZXTtcbiAgICAgIH1cblxuICAgICAgaWYgKGxlZnRQb3MpIHtcbiAgICAgICAgLy8gbGVmdCBjaXJjbGVcbiAgICAgICAgZ3JvdXBbJ3NoYXBlTWFwJ11bJ2xpbmstcG9pbnQtbGVmdCddID0gZ3JvdXAuYWRkU2hhcGUoJ2NpcmNsZScsIHtcbiAgICAgICAgICBhdHRyczogX19hc3NpZ24oX19hc3NpZ24oe30sIG1hcmtTdHlsZSksIHtcbiAgICAgICAgICAgIHg6IGxlZnRQb3NbMF0sXG4gICAgICAgICAgICB5OiBsZWZ0UG9zWzFdLFxuICAgICAgICAgICAgcjogbWFya1NpemUgLyAyIHx8IG1hcmtSIHx8IDVcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBjbGFzc05hbWU6ICdsaW5rLXBvaW50LWxlZnQnLFxuICAgICAgICAgIG5hbWU6ICdsaW5rLXBvaW50LWxlZnQnXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChyaWdodCkge1xuICAgICAgLy8gcmlnaHQgY2lyY2xlXG4gICAgICAvLyB1cCBkb3duIGxlZnQgcmlnaHQg5Zub5Liq5pa55ZCR55qE5Z2Q5qCH5Z2H5LiN55u45ZCMXG4gICAgICB2YXIgcmlnaHRQb3MgPSBudWxsO1xuICAgICAgdmFyIGRpZmZZID0gbGVuICogTWF0aC5zaW4oMSAvIDMgKiBNYXRoLlBJKTtcbiAgICAgIHZhciByID0gbGVuICogTWF0aC5zaW4oMSAvIDMgKiBNYXRoLlBJKTtcblxuICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gJ3VwJykge1xuICAgICAgICByaWdodFBvcyA9IFtyLCBkaWZmWV07XG4gICAgICB9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PT0gJ2Rvd24nKSB7XG4gICAgICAgIHJpZ2h0UG9zID0gW3IsIC1kaWZmWV07XG4gICAgICB9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICByaWdodFBvcyA9IFtyLCByIC0gZGlmZlldO1xuICAgICAgfVxuXG4gICAgICBpZiAocmlnaHRQb3MpIHtcbiAgICAgICAgZ3JvdXBbJ3NoYXBlTWFwJ11bJ2xpbmstcG9pbnQtcmlnaHQnXSA9IGdyb3VwLmFkZFNoYXBlKCdjaXJjbGUnLCB7XG4gICAgICAgICAgYXR0cnM6IF9fYXNzaWduKF9fYXNzaWduKHt9LCBtYXJrU3R5bGUpLCB7XG4gICAgICAgICAgICB4OiByaWdodFBvc1swXSxcbiAgICAgICAgICAgIHk6IHJpZ2h0UG9zWzFdLFxuICAgICAgICAgICAgcjogbWFya1NpemUgLyAyIHx8IG1hcmtSIHx8IDVcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBjbGFzc05hbWU6ICdsaW5rLXBvaW50LXJpZ2h0JyxcbiAgICAgICAgICBuYW1lOiAnbGluay1wb2ludC1yaWdodCdcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRvcCkge1xuICAgICAgLy8gdXAgZG93biBsZWZ0IHJpZ2h0IOWbm+S4quaWueWQkeeahOWdkOagh+Wdh+S4jeebuOWQjFxuICAgICAgdmFyIHRvcFBvcyA9IG51bGw7XG4gICAgICB2YXIgZGlmZlkgPSBsZW4gKiBNYXRoLnNpbigxIC8gMyAqIE1hdGguUEkpO1xuICAgICAgdmFyIHIgPSBsZW4gKiBNYXRoLnNpbigxIC8gMyAqIE1hdGguUEkpO1xuXG4gICAgICBpZiAoZGlyZWN0aW9uID09PSAndXAnKSB7XG4gICAgICAgIHRvcFBvcyA9IFtyIC0gZGlmZlksIC1kaWZmWV07XG4gICAgICB9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PT0gJ2xlZnQnKSB7XG4gICAgICAgIHRvcFBvcyA9IFtyLCAtZGlmZlldO1xuICAgICAgfSBlbHNlIGlmIChkaXJlY3Rpb24gPT09ICdyaWdodCcpIHtcbiAgICAgICAgdG9wUG9zID0gWy1yLCAtZGlmZlldO1xuICAgICAgfVxuXG4gICAgICBpZiAodG9wUG9zKSB7XG4gICAgICAgIC8vIHRvcCBjaXJjbGVcbiAgICAgICAgZ3JvdXBbJ3NoYXBlTWFwJ11bJ2xpbmstcG9pbnQtdG9wJ10gPSBncm91cC5hZGRTaGFwZSgnY2lyY2xlJywge1xuICAgICAgICAgIGF0dHJzOiBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgbWFya1N0eWxlKSwge1xuICAgICAgICAgICAgeDogdG9wUG9zWzBdLFxuICAgICAgICAgICAgeTogdG9wUG9zWzFdLFxuICAgICAgICAgICAgcjogbWFya1NpemUgLyAyIHx8IG1hcmtSIHx8IDVcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBjbGFzc05hbWU6ICdsaW5rLXBvaW50LXRvcCcsXG4gICAgICAgICAgbmFtZTogJ2xpbmstcG9pbnQtdG9wJ1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoYm90dG9tKSB7XG4gICAgICAvLyB1cCBkb3duIGxlZnQgcmlnaHQg5Zub5Liq5pa55ZCR55qE5Z2Q5qCH5Z2H5LiN55u45ZCMXG4gICAgICB2YXIgYm90dG9tUG9zID0gbnVsbDtcbiAgICAgIHZhciBkaWZmWSA9IGxlbiAqIE1hdGguc2luKDEgLyAzICogTWF0aC5QSSk7XG4gICAgICB2YXIgciA9IGxlbiAqIE1hdGguc2luKDEgLyAzICogTWF0aC5QSSk7XG5cbiAgICAgIGlmIChkaXJlY3Rpb24gPT09ICdkb3duJykge1xuICAgICAgICBib3R0b21Qb3MgPSBbLXIgKyBkaWZmWSwgZGlmZlldO1xuICAgICAgfSBlbHNlIGlmIChkaXJlY3Rpb24gPT09ICdsZWZ0Jykge1xuICAgICAgICBib3R0b21Qb3MgPSBbciwgZGlmZlldO1xuICAgICAgfSBlbHNlIGlmIChkaXJlY3Rpb24gPT09ICdyaWdodCcpIHtcbiAgICAgICAgYm90dG9tUG9zID0gWy1yLCBkaWZmWV07XG4gICAgICB9XG5cbiAgICAgIGlmIChib3R0b21Qb3MpIHtcbiAgICAgICAgLy8gYm90dG9tIGNpcmNsZVxuICAgICAgICBncm91cFsnc2hhcGVNYXAnXVsnbGluay1wb2ludC1ib3R0b20nXSA9IGdyb3VwLmFkZFNoYXBlKCdjaXJjbGUnLCB7XG4gICAgICAgICAgYXR0cnM6IF9fYXNzaWduKF9fYXNzaWduKHt9LCBtYXJrU3R5bGUpLCB7XG4gICAgICAgICAgICB4OiBib3R0b21Qb3NbMF0sXG4gICAgICAgICAgICB5OiBib3R0b21Qb3NbMV0sXG4gICAgICAgICAgICByOiBtYXJrU2l6ZSAvIDIgfHwgbWFya1IgfHwgNVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIGNsYXNzTmFtZTogJ2xpbmstcG9pbnQtYm90dG9tJyxcbiAgICAgICAgICBuYW1lOiAnbGluay1wb2ludC1ib3R0b20nXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgZ2V0UGF0aDogZnVuY3Rpb24gZ2V0UGF0aChjZmcpIHtcbiAgICB2YXIgZGVmYXVsdERpcmVjdGlvbiA9ICh0aGlzLm1lcmdlU3R5bGUgfHwgdGhpcy5nZXRPcHRpb25zKGNmZykpLmRpcmVjdGlvbjtcbiAgICB2YXIgZGlyZWN0aW9uID0gY2ZnLmRpcmVjdGlvbiB8fCBkZWZhdWx0RGlyZWN0aW9uO1xuICAgIHZhciBzaXplID0gdGhpcy5nZXRTaXplKGNmZyk7XG4gICAgdmFyIGxlbiA9IHNpemVbMF07XG4gICAgdmFyIGRpZmZZID0gbGVuICogTWF0aC5zaW4oMSAvIDMgKiBNYXRoLlBJKTtcbiAgICB2YXIgciA9IGxlbiAqIE1hdGguc2luKDEgLyAzICogTWF0aC5QSSk7XG4gICAgdmFyIHBhdGggPSBbWydNJywgLXIsIGRpZmZZXSwgWydMJywgMCwgLWRpZmZZXSwgWydMJywgciwgZGlmZlldLCBbJ1onXSAvLyDlsIHpl61cbiAgICBdO1xuXG4gICAgaWYgKGRpcmVjdGlvbiA9PT0gJ2Rvd24nKSB7XG4gICAgICBwYXRoID0gW1snTScsIC1yLCAtZGlmZlldLCBbJ0wnLCByLCAtZGlmZlldLCBbJ0wnLCAwLCBkaWZmWV0sIFsnWiddIC8vIOWwgemXrVxuICAgICAgXTtcbiAgICB9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PT0gJ2xlZnQnKSB7XG4gICAgICBwYXRoID0gW1snTScsIC1yLCByIC0gZGlmZlldLCBbJ0wnLCByLCAtcl0sIFsnTCcsIHIsIHJdLCBbJ1onXSAvLyDlsIHpl61cbiAgICAgIF07XG4gICAgfSBlbHNlIGlmIChkaXJlY3Rpb24gPT09ICdyaWdodCcpIHtcbiAgICAgIHBhdGggPSBbWydNJywgciwgciAtIGRpZmZZXSwgWydMJywgLXIsIHJdLCBbJ0wnLCAtciwgLXJdLCBbJ1onXSAvLyDlsIHpl61cbiAgICAgIF07XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhdGg7XG4gIH0sXG5cbiAgLyoqXG4gICAqIOiOt+WPluiKgueCueeahOagt+W8j++8jOS+m+WfuuS6juivpeiKgueCueiHquWumuS5ieaXtuS9v+eUqFxuICAgKiBAcGFyYW0ge09iamVjdH0gY2ZnIOiKgueCueaVsOaNruaooeWei1xuICAgKiBAcmV0dXJuIHtPYmplY3R9IOiKgueCueeahOagt+W8j1xuICAgKi9cbiAgZ2V0U2hhcGVTdHlsZTogZnVuY3Rpb24gZ2V0U2hhcGVTdHlsZShjZmcpIHtcbiAgICB2YXIgZGVmYXVsdFN0eWxlID0gKHRoaXMubWVyZ2VTdHlsZSB8fCB0aGlzLmdldE9wdGlvbnMoY2ZnKSkuc3R5bGU7XG4gICAgdmFyIHN0cm9rZVN0eWxlID0ge1xuICAgICAgc3Ryb2tlOiBjZmcuY29sb3JcbiAgICB9OyAvLyDlpoLmnpzorr7nva7kuoZjb2xvcu+8jOWImeimhueblum7mOiupOeahHN0cm9rZeWxnuaAp1xuXG4gICAgdmFyIHN0eWxlID0gbWl4KHt9LCBkZWZhdWx0U3R5bGUsIHN0cm9rZVN0eWxlKTtcbiAgICB2YXIgcGF0aCA9IHRoaXMuZ2V0UGF0aChjZmcpO1xuXG4gICAgdmFyIHN0eWxlcyA9IF9fYXNzaWduKHtcbiAgICAgIHBhdGg6IHBhdGhcbiAgICB9LCBzdHlsZSk7XG5cbiAgICByZXR1cm4gc3R5bGVzO1xuICB9LFxuICB1cGRhdGU6IGZ1bmN0aW9uIHVwZGF0ZShjZmcsIGl0ZW0sIHVwZGF0ZVR5cGUpIHtcbiAgICB2YXIgZ3JvdXAgPSBpdGVtLmdldENvbnRhaW5lcigpOyAvLyDov5nph4zkuI3kvKAgY2ZnIOWPguaVsOaYr+WboOS4uiBjZmcuc3R5bGUg6ZyA6KaB5pyA5ZCO6KaG55uW5qC35byPXG5cbiAgICB2YXIgZGVmYXVsdFN0eWxlID0gdGhpcy5nZXRPcHRpb25zKHt9KS5zdHlsZTtcbiAgICB2YXIgcGF0aCA9IHRoaXMuZ2V0UGF0aChjZmcpOyAvLyDkuIvpnaLov5nkupvlsZ7mgKfpnIDopoHopobnm5bpu5jorqTmoLflvI/kuI7nm67liY3moLflvI/vvIzkvYboi6XlnKggY2ZnIOS4reacieaMh+WumuWImeW6lOivpeiiqyBjZmcg55qE55u45bqU6YWN572u6KaG55uW44CCXG5cbiAgICB2YXIgc3Ryb2tlU3R5bGUgPSB7XG4gICAgICBzdHJva2U6IGNmZy5jb2xvcixcbiAgICAgIHBhdGg6IHBhdGhcbiAgICB9OyAvLyDkuI4gZ2V0U2hhcGVTdHlsZSDkuI3lkIzlnKjkuo7vvIx1cGRhdGUg5pe26ZyA6KaB6I635Y+W5Yiw5b2T5YmN55qEIHN0eWxlIOi/m+ihjOiejeWQiOOAguWNs+aWsOS8oOWFpeeahOmFjee9rumhueS4reayoeaciea2ieWPiueahOWxnuaAp++8jOS/neeVmeW9k+WJjeeahOmFjee9ruOAglxuXG4gICAgdmFyIGtleVNoYXBlID0gaXRlbS5nZXQoJ2tleVNoYXBlJyk7XG4gICAgdmFyIHN0eWxlID0gbWl4KHt9LCBkZWZhdWx0U3R5bGUsIGtleVNoYXBlLmF0dHIoKSwgc3Ryb2tlU3R5bGUpO1xuICAgIHN0eWxlID0gbWl4KHN0eWxlLCBjZmcuc3R5bGUpO1xuICAgIHRoaXMudXBkYXRlU2hhcGUoY2ZnLCBpdGVtLCBzdHlsZSwgdHJ1ZSwgdXBkYXRlVHlwZSk7XG4gICAgdGhpcy51cGRhdGVMaW5rUG9pbnRzKGNmZywgZ3JvdXApO1xuICB9LFxuXG4gIC8qKlxuICAgKiDmm7TmlrBsaW5rUG9pbnRzXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBjZmcg6IqC54K55pWw5o2u6YWN572u6aG5XG4gICAqIEBwYXJhbSB7R3JvdXB9IGdyb3VwIEl0ZW3miYDlnKjnmoRncm91cFxuICAgKi9cbiAgdXBkYXRlTGlua1BvaW50czogZnVuY3Rpb24gdXBkYXRlTGlua1BvaW50cyhjZmcsIGdyb3VwKSB7XG4gICAgdmFyIF9hID0gdGhpcy5nZXRPcHRpb25zKHt9KSxcbiAgICAgICAgZGVmYXVsdExpbmtQb2ludHMgPSBfYS5saW5rUG9pbnRzLFxuICAgICAgICBkZWZhdWx0RGlyZWN0aW9uID0gX2EuZGlyZWN0aW9uO1xuXG4gICAgdmFyIGRpcmVjdGlvbiA9IGNmZy5kaXJlY3Rpb24gfHwgZGVmYXVsdERpcmVjdGlvbjtcbiAgICB2YXIgbWFya0xlZnQgPSBncm91cFsnc2hhcGVNYXAnXVsnbGluay1wb2ludC1sZWZ0J10gfHwgZ3JvdXAuZmluZChmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgcmV0dXJuIGVsZW1lbnQuZ2V0KCdjbGFzc05hbWUnKSA9PT0gJ2xpbmstcG9pbnQtbGVmdCc7XG4gICAgfSk7XG4gICAgdmFyIG1hcmtSaWdodCA9IGdyb3VwWydzaGFwZU1hcCddWydsaW5rLXBvaW50LXJpZ2h0J10gfHwgZ3JvdXAuZmluZChmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgcmV0dXJuIGVsZW1lbnQuZ2V0KCdjbGFzc05hbWUnKSA9PT0gJ2xpbmstcG9pbnQtcmlnaHQnO1xuICAgIH0pO1xuICAgIHZhciBtYXJrVG9wID0gZ3JvdXBbJ3NoYXBlTWFwJ11bJ2xpbmstcG9pbnQtdG9wJ10gfHwgZ3JvdXAuZmluZChmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgcmV0dXJuIGVsZW1lbnQuZ2V0KCdjbGFzc05hbWUnKSA9PT0gJ2xpbmstcG9pbnQtdG9wJztcbiAgICB9KTtcbiAgICB2YXIgbWFya0JvdHRvbSA9IGdyb3VwWydzaGFwZU1hcCddWydsaW5rLXBvaW50LWJvdHRvbSddIHx8IGdyb3VwLmZpbmQoZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBlbGVtZW50LmdldCgnY2xhc3NOYW1lJykgPT09ICdsaW5rLXBvaW50LWJvdHRvbSc7XG4gICAgfSk7XG4gICAgdmFyIGN1cnJlbnRMaW5rUG9pbnRzID0gZGVmYXVsdExpbmtQb2ludHM7XG4gICAgdmFyIGV4aXN0TGlua1BvaW50ID0gbWFya0xlZnQgfHwgbWFya1JpZ2h0IHx8IG1hcmtUb3AgfHwgbWFya0JvdHRvbTtcblxuICAgIGlmIChleGlzdExpbmtQb2ludCkge1xuICAgICAgY3VycmVudExpbmtQb2ludHMgPSBleGlzdExpbmtQb2ludC5hdHRyKCk7XG4gICAgfVxuXG4gICAgdmFyIGxpbmtQb2ludHMgPSBtaXgoe30sIGN1cnJlbnRMaW5rUG9pbnRzLCBjZmcubGlua1BvaW50cyk7XG4gICAgdmFyIG1hcmtGaWxsID0gbGlua1BvaW50cy5maWxsLFxuICAgICAgICBtYXJrU3Ryb2tlID0gbGlua1BvaW50cy5zdHJva2UsXG4gICAgICAgIGJvcmRlcldpZHRoID0gbGlua1BvaW50cy5saW5lV2lkdGg7XG4gICAgdmFyIG1hcmtTaXplID0gbGlua1BvaW50cy5zaXplIC8gMjtcbiAgICBpZiAoIW1hcmtTaXplKSBtYXJrU2l6ZSA9IGxpbmtQb2ludHMucjtcblxuICAgIHZhciBfYiA9IGNmZy5saW5rUG9pbnRzID8gY2ZnLmxpbmtQb2ludHMgOiB7XG4gICAgICBsZWZ0OiB1bmRlZmluZWQsXG4gICAgICByaWdodDogdW5kZWZpbmVkLFxuICAgICAgdG9wOiB1bmRlZmluZWQsXG4gICAgICBib3R0b206IHVuZGVmaW5lZFxuICAgIH0sXG4gICAgICAgIGxlZnQgPSBfYi5sZWZ0LFxuICAgICAgICByaWdodCA9IF9iLnJpZ2h0LFxuICAgICAgICB0b3AgPSBfYi50b3AsXG4gICAgICAgIGJvdHRvbSA9IF9iLmJvdHRvbTtcblxuICAgIHZhciBzaXplID0gdGhpcy5nZXRTaXplKGNmZyk7XG4gICAgdmFyIGxlbiA9IHNpemVbMF07XG4gICAgdmFyIHN0eWxlcyA9IHtcbiAgICAgIHI6IG1hcmtTaXplLFxuICAgICAgZmlsbDogbWFya0ZpbGwsXG4gICAgICBzdHJva2U6IG1hcmtTdHJva2UsXG4gICAgICBsaW5lV2lkdGg6IGJvcmRlcldpZHRoXG4gICAgfTtcbiAgICB2YXIgbGVmdFBvcyA9IG51bGw7XG4gICAgdmFyIGRpZmZZID0gbGVuICogTWF0aC5zaW4oMSAvIDMgKiBNYXRoLlBJKTtcbiAgICB2YXIgciA9IGxlbiAqIE1hdGguc2luKDEgLyAzICogTWF0aC5QSSk7XG5cbiAgICBpZiAoZGlyZWN0aW9uID09PSAndXAnKSB7XG4gICAgICBsZWZ0UG9zID0gWy1yLCBkaWZmWV07XG4gICAgfSBlbHNlIGlmIChkaXJlY3Rpb24gPT09ICdkb3duJykge1xuICAgICAgbGVmdFBvcyA9IFstciwgLWRpZmZZXTtcbiAgICB9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PT0gJ2xlZnQnKSB7XG4gICAgICBsZWZ0UG9zID0gWy1yLCByIC0gZGlmZlldO1xuICAgIH1cblxuICAgIGlmIChsZWZ0UG9zKSB7XG4gICAgICBpZiAobWFya0xlZnQpIHtcbiAgICAgICAgaWYgKCFsZWZ0ICYmIGxlZnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIG1hcmtMZWZ0LnJlbW92ZSgpO1xuICAgICAgICAgIGRlbGV0ZSBncm91cFsnc2hhcGVNYXAnXVsnbGluay1wb2ludC1sZWZ0J107XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbWFya0xlZnQuYXR0cihfX2Fzc2lnbihfX2Fzc2lnbih7fSwgc3R5bGVzKSwge1xuICAgICAgICAgICAgeDogbGVmdFBvc1swXSxcbiAgICAgICAgICAgIHk6IGxlZnRQb3NbMV1cbiAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAobGVmdCkge1xuICAgICAgICBncm91cFsnc2hhcGVNYXAnXVsnbGluay1wb2ludC1sZWZ0J10gPSBncm91cC5hZGRTaGFwZSgnY2lyY2xlJywge1xuICAgICAgICAgIGF0dHJzOiBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgc3R5bGVzKSwge1xuICAgICAgICAgICAgeDogbGVmdFBvc1swXSxcbiAgICAgICAgICAgIHk6IGxlZnRQb3NbMV1cbiAgICAgICAgICB9KSxcbiAgICAgICAgICBjbGFzc05hbWU6ICdsaW5rLXBvaW50LWxlZnQnLFxuICAgICAgICAgIG5hbWU6ICdsaW5rLXBvaW50LWxlZnQnLFxuICAgICAgICAgIGlzQW5jaG9yUG9pbnQ6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHJpZ2h0UG9zID0gbnVsbDtcblxuICAgIGlmIChkaXJlY3Rpb24gPT09ICd1cCcpIHtcbiAgICAgIHJpZ2h0UG9zID0gW3IsIGRpZmZZXTtcbiAgICB9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PT0gJ2Rvd24nKSB7XG4gICAgICByaWdodFBvcyA9IFtyLCAtZGlmZlldO1xuICAgIH0gZWxzZSBpZiAoZGlyZWN0aW9uID09PSAncmlnaHQnKSB7XG4gICAgICByaWdodFBvcyA9IFtyLCByIC0gZGlmZlldO1xuICAgIH1cblxuICAgIGlmIChyaWdodFBvcykge1xuICAgICAgaWYgKG1hcmtSaWdodCkge1xuICAgICAgICBpZiAoIXJpZ2h0ICYmIHJpZ2h0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBtYXJrUmlnaHQucmVtb3ZlKCk7XG4gICAgICAgICAgZGVsZXRlIGdyb3VwWydzaGFwZU1hcCddWydsaW5rLXBvaW50LXJpZ2h0J107XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbWFya1JpZ2h0LmF0dHIoX19hc3NpZ24oX19hc3NpZ24oe30sIHN0eWxlcyksIHtcbiAgICAgICAgICAgIHg6IHJpZ2h0UG9zWzBdLFxuICAgICAgICAgICAgeTogcmlnaHRQb3NbMV1cbiAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAocmlnaHQpIHtcbiAgICAgICAgZ3JvdXBbJ3NoYXBlTWFwJ11bJ2xpbmstcG9pbnQtcmlnaHQnXSA9IGdyb3VwLmFkZFNoYXBlKCdjaXJjbGUnLCB7XG4gICAgICAgICAgYXR0cnM6IF9fYXNzaWduKF9fYXNzaWduKHt9LCBzdHlsZXMpLCB7XG4gICAgICAgICAgICB4OiByaWdodFBvc1swXSxcbiAgICAgICAgICAgIHk6IHJpZ2h0UG9zWzFdXG4gICAgICAgICAgfSksXG4gICAgICAgICAgY2xhc3NOYW1lOiAnbGluay1wb2ludC1yaWdodCcsXG4gICAgICAgICAgbmFtZTogJ2xpbmstcG9pbnQtcmlnaHQnLFxuICAgICAgICAgIGlzQW5jaG9yUG9pbnQ6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHRvcFBvcyA9IG51bGw7XG5cbiAgICBpZiAoZGlyZWN0aW9uID09PSAndXAnKSB7XG4gICAgICB0b3BQb3MgPSBbciAtIGRpZmZZLCAtZGlmZlldO1xuICAgIH0gZWxzZSBpZiAoZGlyZWN0aW9uID09PSAnbGVmdCcpIHtcbiAgICAgIHRvcFBvcyA9IFtyLCAtZGlmZlldO1xuICAgIH0gZWxzZSBpZiAoZGlyZWN0aW9uID09PSAncmlnaHQnKSB7XG4gICAgICB0b3BQb3MgPSBbLXIsIC1kaWZmWV07XG4gICAgfVxuXG4gICAgaWYgKHRvcFBvcykge1xuICAgICAgaWYgKG1hcmtUb3ApIHtcbiAgICAgICAgaWYgKCF0b3AgJiYgdG9wICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBtYXJrVG9wLnJlbW92ZSgpO1xuICAgICAgICAgIGRlbGV0ZSBncm91cFsnc2hhcGVNYXAnXVsnbGluay1wb2ludC10b3AnXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyB0b3AgY2lyY2xlXG4gICAgICAgICAgbWFya1RvcC5hdHRyKF9fYXNzaWduKF9fYXNzaWduKHt9LCBzdHlsZXMpLCB7XG4gICAgICAgICAgICB4OiB0b3BQb3NbMF0sXG4gICAgICAgICAgICB5OiB0b3BQb3NbMV1cbiAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodG9wKSB7XG4gICAgICAgIGdyb3VwWydzaGFwZU1hcCddWydsaW5rLXBvaW50LXRvcCddID0gZ3JvdXAuYWRkU2hhcGUoJ2NpcmNsZScsIHtcbiAgICAgICAgICBhdHRyczogX19hc3NpZ24oX19hc3NpZ24oe30sIHN0eWxlcyksIHtcbiAgICAgICAgICAgIHg6IHRvcFBvc1swXSxcbiAgICAgICAgICAgIHk6IHRvcFBvc1sxXVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIGNsYXNzTmFtZTogJ2xpbmstcG9pbnQtdG9wJyxcbiAgICAgICAgICBuYW1lOiAnbGluay1wb2ludC10b3AnLFxuICAgICAgICAgIGlzQW5jaG9yUG9pbnQ6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGJvdHRvbVBvcyA9IG51bGw7XG5cbiAgICBpZiAoZGlyZWN0aW9uID09PSAnZG93bicpIHtcbiAgICAgIGJvdHRvbVBvcyA9IFstciArIGRpZmZZLCBkaWZmWV07XG4gICAgfSBlbHNlIGlmIChkaXJlY3Rpb24gPT09ICdsZWZ0Jykge1xuICAgICAgYm90dG9tUG9zID0gW3IsIGRpZmZZXTtcbiAgICB9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PT0gJ3JpZ2h0Jykge1xuICAgICAgYm90dG9tUG9zID0gWy1yLCBkaWZmWV07XG4gICAgfVxuXG4gICAgaWYgKGJvdHRvbVBvcykge1xuICAgICAgaWYgKG1hcmtCb3R0b20pIHtcbiAgICAgICAgaWYgKCFib3R0b20gJiYgYm90dG9tICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBtYXJrQm90dG9tLnJlbW92ZSgpO1xuICAgICAgICAgIGRlbGV0ZSBncm91cFsnc2hhcGVNYXAnXVsnbGluay1wb2ludC1ib3R0b20nXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBtYXJrQm90dG9tLmF0dHIoX19hc3NpZ24oX19hc3NpZ24oe30sIHN0eWxlcyksIHtcbiAgICAgICAgICAgIHg6IGJvdHRvbVBvc1swXSxcbiAgICAgICAgICAgIHk6IGJvdHRvbVBvc1sxXVxuICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChib3R0b20pIHtcbiAgICAgICAgZ3JvdXBbJ3NoYXBlTWFwJ11bJ2xpbmstcG9pbnQtYm90dG9tJ10gPSBncm91cC5hZGRTaGFwZSgnY2lyY2xlJywge1xuICAgICAgICAgIGF0dHJzOiBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgc3R5bGVzKSwge1xuICAgICAgICAgICAgeDogYm90dG9tUG9zWzBdLFxuICAgICAgICAgICAgeTogYm90dG9tUG9zWzFdXG4gICAgICAgICAgfSksXG4gICAgICAgICAgY2xhc3NOYW1lOiAnbGluay1wb2ludC1ib3R0b20nLFxuICAgICAgICAgIG5hbWU6ICdsaW5rLXBvaW50LWJvdHRvbScsXG4gICAgICAgICAgaXNBbmNob3JQb2ludDogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn0sICdzaW5nbGUtbm9kZScpOyIsImltcG9ydCB7IF9fYXNzaWduLCBfX3Jlc3QgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IG1peCwgaXNTdHJpbmcgfSBmcm9tICdAYW50di91dGlsJztcbmltcG9ydCB7IHJlZ2lzdGVyTm9kZSwgQmFzZUdsb2JhbCBhcyBHbG9iYWwgfSBmcm9tICdAYW50di9nNi1jb3JlJztcbnJlZ2lzdGVyTm9kZSgnbW9kZWxSZWN0Jywge1xuICAvLyDoh6rlrprkuYnoioLngrnml7bnmoTphY3nva5cbiAgb3B0aW9uczoge1xuICAgIHNpemU6IFsxODUsIDcwXSxcbiAgICBzdHlsZToge1xuICAgICAgcmFkaXVzOiA1LFxuICAgICAgc3Ryb2tlOiAnIzY5YzBmZicsXG4gICAgICBmaWxsOiAnI2ZmZmZmZicsXG4gICAgICBsaW5lV2lkdGg6IEdsb2JhbC5kZWZhdWx0Tm9kZS5zdHlsZS5saW5lV2lkdGgsXG4gICAgICBmaWxsT3BhY2l0eTogMVxuICAgIH0sXG4gICAgLy8g5paH5pys5qC35byP6YWN572uXG4gICAgbGFiZWxDZmc6IHtcbiAgICAgIHN0eWxlOiB7XG4gICAgICAgIGZpbGw6ICcjNTk1OTU5JyxcbiAgICAgICAgZm9udFNpemU6IDE0LFxuICAgICAgICBmb250RmFtaWx5OiBHbG9iYWwud2luZG93Rm9udEZhbWlseVxuICAgICAgfSxcbiAgICAgIG9mZnNldDogMzAgLy8g6Led56a75bem5L6n55qEIG9mZnNldO+8jOayoeacieiuvue9riB5IOi9tOS4iuenu+WKqOeahOmFjee9rlxuXG4gICAgfSxcbiAgICBkZXNjcmlwdGlvbkNmZzoge1xuICAgICAgc3R5bGU6IHtcbiAgICAgICAgZm9udFNpemU6IDEyLFxuICAgICAgICBmaWxsOiAnI2JmYmZiZicsXG4gICAgICAgIGZvbnRGYW1pbHk6IEdsb2JhbC53aW5kb3dGb250RmFtaWx5XG4gICAgICB9LFxuICAgICAgcGFkZGluZ1RvcDogMFxuICAgIH0sXG4gICAgcHJlUmVjdDoge1xuICAgICAgc2hvdzogdHJ1ZSxcbiAgICAgIHdpZHRoOiA0LFxuICAgICAgZmlsbDogJyM0MGE5ZmYnLFxuICAgICAgcmFkaXVzOiAyXG4gICAgfSxcbiAgICAvLyDoioLngrnkuIrlt6blj7PkuIrkuIvlm5vkuKrmlrnlkJHkuIrnmoTpk77mjqVjaXJjbGXphY3nva5cbiAgICBsaW5rUG9pbnRzOiB7XG4gICAgICB0b3A6IGZhbHNlLFxuICAgICAgcmlnaHQ6IGZhbHNlLFxuICAgICAgYm90dG9tOiBmYWxzZSxcbiAgICAgIGxlZnQ6IGZhbHNlLFxuICAgICAgLy8gY2lyY2xl55qE5aSn5bCPXG4gICAgICBzaXplOiAxMCxcbiAgICAgIGxpbmVXaWR0aDogMSxcbiAgICAgIGZpbGw6ICcjNzJDQzRBJyxcbiAgICAgIHN0cm9rZTogJyM3MkNDNEEnXG4gICAgfSxcbiAgICAvLyDoioLngrnkuK1pY29u6YWN572uXG4gICAgbG9nb0ljb246IHtcbiAgICAgIC8vIOaYr+WQpuaYvuekumljb27vvIzlgLzkuLogZmFsc2Ug5YiZ5LiN5riy5p+TaWNvblxuICAgICAgc2hvdzogdHJ1ZSxcbiAgICAgIHg6IDAsXG4gICAgICB5OiAwLFxuICAgICAgLy8gaWNvbueahOWcsOWdgO+8jOWtl+espuS4suexu+Wei1xuICAgICAgaW1nOiAnaHR0cHM6Ly9ndy5hbGlwYXlvYmplY3RzLmNvbS96b3MvYmFzZW1lbnRfcHJvZC80ZjgxODkzYy0xODA2LTRkZTQtYWZmMy05YTZiMjY2YmM4YTIuc3ZnJyxcbiAgICAgIHdpZHRoOiAxNixcbiAgICAgIGhlaWdodDogMTYsXG4gICAgICAvLyDnlKjkuo7osIPmlbTlm77moIfnmoTlt6blj7PkvY3nva5cbiAgICAgIG9mZnNldDogMFxuICAgIH0sXG4gICAgLy8g6IqC54K55Lit6KGo56S654q25oCB55qEaWNvbumFjee9rlxuICAgIHN0YXRlSWNvbjoge1xuICAgICAgLy8g5piv5ZCm5pi+56S6aWNvbu+8jOWAvOS4uiBmYWxzZSDliJnkuI3muLLmn5NpY29uXG4gICAgICBzaG93OiB0cnVlLFxuICAgICAgeDogMCxcbiAgICAgIHk6IDAsXG4gICAgICAvLyBpY29u55qE5Zyw5Z2A77yM5a2X56ym5Liy57G75Z6LXG4gICAgICBpbWc6ICdodHRwczovL2d3LmFsaXBheW9iamVjdHMuY29tL3pvcy9iYXNlbWVudF9wcm9kLzMwMGEyNTIzLTY3ZTAtNGNiZi05ZDRhLTY3YzA3N2I0MDM5NS5zdmcnLFxuICAgICAgd2lkdGg6IDE2LFxuICAgICAgaGVpZ2h0OiAxNixcbiAgICAgIC8vIOeUqOS6juiwg+aVtOWbvuagh+eahOW3puWPs+S9jee9rlxuICAgICAgb2Zmc2V0OiAtNVxuICAgIH0sXG4gICAgLy8g6L+e5o6l54K577yM6buY6K6k5Li65bem5Y+zXG4gICAgLy8gYW5jaG9yUG9pbnRzOiBbeyB4OiAwLCB5OiAwLjUgfSwgeyB4OiAxLCB5OiAwLjUgfV1cbiAgICBhbmNob3JQb2ludHM6IFtbMCwgMC41XSwgWzEsIDAuNV1dXG4gIH0sXG4gIHNoYXBlVHlwZTogJ21vZGVsUmVjdCcsXG4gIGRyYXdTaGFwZTogZnVuY3Rpb24gZHJhd1NoYXBlKGNmZywgZ3JvdXApIHtcbiAgICB2YXIgX2EgPSAodGhpcy5tZXJnZVN0eWxlIHx8IHRoaXMuZ2V0T3B0aW9ucyhjZmcpKS5wcmVSZWN0LFxuICAgICAgICBwcmVSZWN0ID0gX2EgPT09IHZvaWQgMCA/IHt9IDogX2E7XG4gICAgdmFyIHN0eWxlID0gdGhpcy5nZXRTaGFwZVN0eWxlKGNmZyk7XG4gICAgdmFyIHNpemUgPSB0aGlzLmdldFNpemUoY2ZnKTtcbiAgICB2YXIgd2lkdGggPSBzaXplWzBdO1xuICAgIHZhciBoZWlnaHQgPSBzaXplWzFdO1xuICAgIHZhciBrZXlTaGFwZSA9IGdyb3VwLmFkZFNoYXBlKCdyZWN0Jywge1xuICAgICAgYXR0cnM6IHN0eWxlLFxuICAgICAgY2xhc3NOYW1lOiB0aGlzLnR5cGUgKyBcIi1rZXlTaGFwZVwiLFxuICAgICAgbmFtZTogdGhpcy50eXBlICsgXCIta2V5U2hhcGVcIixcbiAgICAgIGRyYWdnYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIGdyb3VwWydzaGFwZU1hcCddW3RoaXMudHlwZSArIFwiLWtleVNoYXBlXCJdID0ga2V5U2hhcGU7XG5cbiAgICB2YXIgcHJlUmVjdFNob3cgPSBwcmVSZWN0LnNob3csXG4gICAgICAgIHByZVJlY3RTdHlsZSA9IF9fcmVzdChwcmVSZWN0LCBbXCJzaG93XCJdKTtcblxuICAgIGlmIChwcmVSZWN0U2hvdykge1xuICAgICAgZ3JvdXBbJ3NoYXBlTWFwJ11bJ3ByZS1yZWN0J10gPSBncm91cC5hZGRTaGFwZSgncmVjdCcsIHtcbiAgICAgICAgYXR0cnM6IF9fYXNzaWduKHtcbiAgICAgICAgICB4OiAtd2lkdGggLyAyLFxuICAgICAgICAgIHk6IC1oZWlnaHQgLyAyLFxuICAgICAgICAgIGhlaWdodDogaGVpZ2h0XG4gICAgICAgIH0sIHByZVJlY3RTdHlsZSksXG4gICAgICAgIGNsYXNzTmFtZTogJ3ByZS1yZWN0JyxcbiAgICAgICAgbmFtZTogJ3ByZS1yZWN0JyxcbiAgICAgICAgZHJhZ2dhYmxlOiB0cnVlXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLmRyYXdMb2dvSWNvbihjZmcsIGdyb3VwKTtcbiAgICB0aGlzLmRyYXdTdGF0ZUljb24oY2ZnLCBncm91cCk7XG4gICAgdGhpcy5kcmF3TGlua1BvaW50cyhjZmcsIGdyb3VwKTtcbiAgICByZXR1cm4ga2V5U2hhcGU7XG4gIH0sXG5cbiAgLyoqXG4gICAqIOe7mOWItuaooeWei+efqeW9ouW3pui+ueeahGxvZ2/lm77moIdcbiAgICogQHBhcmFtIHtPYmplY3R9IGNmZyDmlbDmja7phY3nva7poblcbiAgICogQHBhcmFtIHtHcm91cH0gZ3JvdXAgR3JvdXDlrp7kvotcbiAgICovXG4gIGRyYXdMb2dvSWNvbjogZnVuY3Rpb24gZHJhd0xvZ29JY29uKGNmZywgZ3JvdXApIHtcbiAgICB2YXIgX2EgPSAodGhpcy5tZXJnZVN0eWxlIHx8IHRoaXMuZ2V0T3B0aW9ucyhjZmcpKS5sb2dvSWNvbixcbiAgICAgICAgbG9nb0ljb24gPSBfYSA9PT0gdm9pZCAwID8ge30gOiBfYTtcbiAgICB2YXIgc2l6ZSA9IHRoaXMuZ2V0U2l6ZShjZmcpO1xuICAgIHZhciB3aWR0aCA9IHNpemVbMF07XG5cbiAgICBpZiAobG9nb0ljb24uc2hvdykge1xuICAgICAgdmFyIHcgPSBsb2dvSWNvbi53aWR0aCxcbiAgICAgICAgICBoID0gbG9nb0ljb24uaGVpZ2h0LFxuICAgICAgICAgIHggPSBsb2dvSWNvbi54LFxuICAgICAgICAgIHkgPSBsb2dvSWNvbi55LFxuICAgICAgICAgIG9mZnNldCA9IGxvZ29JY29uLm9mZnNldCxcbiAgICAgICAgICB0ZXh0ID0gbG9nb0ljb24udGV4dCxcbiAgICAgICAgICBsb2dvSWNvblN0eWxlID0gX19yZXN0KGxvZ29JY29uLCBbXCJ3aWR0aFwiLCBcImhlaWdodFwiLCBcInhcIiwgXCJ5XCIsIFwib2Zmc2V0XCIsIFwidGV4dFwiXSk7XG5cbiAgICAgIGlmICh0ZXh0KSB7XG4gICAgICAgIGdyb3VwWydzaGFwZU1hcCddWydyZWN0LWxvZ28taWNvbiddID0gZ3JvdXAuYWRkU2hhcGUoJ3RleHQnLCB7XG4gICAgICAgICAgYXR0cnM6IF9fYXNzaWduKHtcbiAgICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgICB5OiAwLFxuICAgICAgICAgICAgZm9udFNpemU6IDEyLFxuICAgICAgICAgICAgZmlsbDogJyMwMDAnLFxuICAgICAgICAgICAgc3Ryb2tlOiAnIzAwMCcsXG4gICAgICAgICAgICB0ZXh0QmFzZWxpbmU6ICdtaWRkbGUnLFxuICAgICAgICAgICAgdGV4dEFsaWduOiAnY2VudGVyJ1xuICAgICAgICAgIH0sIGxvZ29JY29uU3R5bGUpLFxuICAgICAgICAgIGNsYXNzTmFtZTogJ3JlY3QtbG9nby1pY29uJyxcbiAgICAgICAgICBuYW1lOiAncmVjdC1sb2dvLWljb24nLFxuICAgICAgICAgIGRyYWdnYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGdyb3VwWydzaGFwZU1hcCddWydyZWN0LWxvZ28taWNvbiddID0gZ3JvdXAuYWRkU2hhcGUoJ2ltYWdlJywge1xuICAgICAgICAgIGF0dHJzOiBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgbG9nb0ljb25TdHlsZSksIHtcbiAgICAgICAgICAgIHg6IHggfHwgLXdpZHRoIC8gMiArIHcgKyBvZmZzZXQsXG4gICAgICAgICAgICB5OiB5IHx8IC1oIC8gMixcbiAgICAgICAgICAgIHdpZHRoOiB3LFxuICAgICAgICAgICAgaGVpZ2h0OiBoXG4gICAgICAgICAgfSksXG4gICAgICAgICAgY2xhc3NOYW1lOiAncmVjdC1sb2dvLWljb24nLFxuICAgICAgICAgIG5hbWU6ICdyZWN0LWxvZ28taWNvbicsXG4gICAgICAgICAgZHJhZ2dhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICog57uY5Yi25qih5Z6L55+p5b2i5Y+z6L6555qE54q25oCB5Zu+5qCHXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBjZmcg5pWw5o2u6YWN572u6aG5XG4gICAqIEBwYXJhbSB7R3JvdXB9IGdyb3VwIEdyb3Vw5a6e5L6LXG4gICAqL1xuICBkcmF3U3RhdGVJY29uOiBmdW5jdGlvbiBkcmF3U3RhdGVJY29uKGNmZywgZ3JvdXApIHtcbiAgICB2YXIgX2EgPSAodGhpcy5tZXJnZVN0eWxlIHx8IHRoaXMuZ2V0T3B0aW9ucyhjZmcpKS5zdGF0ZUljb24sXG4gICAgICAgIHN0YXRlSWNvbiA9IF9hID09PSB2b2lkIDAgPyB7fSA6IF9hO1xuICAgIHZhciBzaXplID0gdGhpcy5nZXRTaXplKGNmZyk7XG4gICAgdmFyIHdpZHRoID0gc2l6ZVswXTtcblxuICAgIGlmIChzdGF0ZUljb24uc2hvdykge1xuICAgICAgdmFyIHcgPSBzdGF0ZUljb24ud2lkdGgsXG4gICAgICAgICAgaCA9IHN0YXRlSWNvbi5oZWlnaHQsXG4gICAgICAgICAgeCA9IHN0YXRlSWNvbi54LFxuICAgICAgICAgIHkgPSBzdGF0ZUljb24ueSxcbiAgICAgICAgICBvZmZzZXQgPSBzdGF0ZUljb24ub2Zmc2V0LFxuICAgICAgICAgIHRleHQgPSBzdGF0ZUljb24udGV4dCxcbiAgICAgICAgICBpY29uU3R5bGUgPSBfX3Jlc3Qoc3RhdGVJY29uLCBbXCJ3aWR0aFwiLCBcImhlaWdodFwiLCBcInhcIiwgXCJ5XCIsIFwib2Zmc2V0XCIsIFwidGV4dFwiXSk7XG5cbiAgICAgIGlmICh0ZXh0KSB7XG4gICAgICAgIGdyb3VwWydzaGFwZU1hcCddWydyZWN0LXN0YXRlLWljb24nXSA9IGdyb3VwLmFkZFNoYXBlKCd0ZXh0Jywge1xuICAgICAgICAgIGF0dHJzOiBfX2Fzc2lnbih7XG4gICAgICAgICAgICB4OiAwLFxuICAgICAgICAgICAgeTogMCxcbiAgICAgICAgICAgIGZvbnRTaXplOiAxMixcbiAgICAgICAgICAgIGZpbGw6ICcjMDAwJyxcbiAgICAgICAgICAgIHN0cm9rZTogJyMwMDAnLFxuICAgICAgICAgICAgdGV4dEJhc2VsaW5lOiAnbWlkZGxlJyxcbiAgICAgICAgICAgIHRleHRBbGlnbjogJ2NlbnRlcidcbiAgICAgICAgICB9LCBpY29uU3R5bGUpLFxuICAgICAgICAgIGNsYXNzTmFtZTogJ3JlY3Qtc3RhdGUtaWNvbicsXG4gICAgICAgICAgbmFtZTogJ3JlY3Qtc3RhdGUtaWNvbicsXG4gICAgICAgICAgZHJhZ2dhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZ3JvdXBbJ3NoYXBlTWFwJ11bJ3JlY3Qtc3RhdGUtaWNvbiddID0gZ3JvdXAuYWRkU2hhcGUoJ2ltYWdlJywge1xuICAgICAgICAgIGF0dHJzOiBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgaWNvblN0eWxlKSwge1xuICAgICAgICAgICAgeDogeCB8fCB3aWR0aCAvIDIgLSB3ICsgb2Zmc2V0LFxuICAgICAgICAgICAgeTogeSB8fCAtaCAvIDIsXG4gICAgICAgICAgICB3aWR0aDogdyxcbiAgICAgICAgICAgIGhlaWdodDogaFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIGNsYXNzTmFtZTogJ3JlY3Qtc3RhdGUtaWNvbicsXG4gICAgICAgICAgbmFtZTogJ3JlY3Qtc3RhdGUtaWNvbicsXG4gICAgICAgICAgZHJhZ2dhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICog57uY5Yi26IqC54K55LiK55qETGlua1BvaW50c1xuICAgKiBAcGFyYW0ge09iamVjdH0gY2ZnIGRhdGHmlbDmja7phY3nva7poblcbiAgICogQHBhcmFtIHtHcm91cH0gZ3JvdXAgR3JvdXDlrp7kvotcbiAgICovXG4gIGRyYXdMaW5rUG9pbnRzOiBmdW5jdGlvbiBkcmF3TGlua1BvaW50cyhjZmcsIGdyb3VwKSB7XG4gICAgdmFyIF9hID0gKHRoaXMubWVyZ2VTdHlsZSB8fCB0aGlzLmdldE9wdGlvbnMoY2ZnKSkubGlua1BvaW50cyxcbiAgICAgICAgbGlua1BvaW50cyA9IF9hID09PSB2b2lkIDAgPyB7fSA6IF9hO1xuXG4gICAgdmFyIHRvcCA9IGxpbmtQb2ludHMudG9wLFxuICAgICAgICBsZWZ0ID0gbGlua1BvaW50cy5sZWZ0LFxuICAgICAgICByaWdodCA9IGxpbmtQb2ludHMucmlnaHQsXG4gICAgICAgIGJvdHRvbSA9IGxpbmtQb2ludHMuYm90dG9tLFxuICAgICAgICBtYXJrU2l6ZSA9IGxpbmtQb2ludHMuc2l6ZSxcbiAgICAgICAgbWFya1IgPSBsaW5rUG9pbnRzLnIsXG4gICAgICAgIG1hcmtTdHlsZSA9IF9fcmVzdChsaW5rUG9pbnRzLCBbXCJ0b3BcIiwgXCJsZWZ0XCIsIFwicmlnaHRcIiwgXCJib3R0b21cIiwgXCJzaXplXCIsIFwiclwiXSk7XG5cbiAgICB2YXIgc2l6ZSA9IHRoaXMuZ2V0U2l6ZShjZmcpO1xuICAgIHZhciB3aWR0aCA9IHNpemVbMF07XG4gICAgdmFyIGhlaWdodCA9IHNpemVbMV07XG5cbiAgICBpZiAobGVmdCkge1xuICAgICAgLy8gbGVmdCBjaXJjbGVcbiAgICAgIGdyb3VwWydzaGFwZU1hcCddWydsaW5rLXBvaW50LWxlZnQnXSA9IGdyb3VwLmFkZFNoYXBlKCdjaXJjbGUnLCB7XG4gICAgICAgIGF0dHJzOiBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgbWFya1N0eWxlKSwge1xuICAgICAgICAgIHg6IC13aWR0aCAvIDIsXG4gICAgICAgICAgeTogMCxcbiAgICAgICAgICByOiBtYXJrU2l6ZSAvIDIgfHwgbWFya1IgfHwgNVxuICAgICAgICB9KSxcbiAgICAgICAgY2xhc3NOYW1lOiAnbGluay1wb2ludC1sZWZ0JyxcbiAgICAgICAgbmFtZTogJ2xpbmstcG9pbnQtbGVmdCcsXG4gICAgICAgIGlzQW5jaG9yUG9pbnQ6IHRydWVcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChyaWdodCkge1xuICAgICAgLy8gcmlnaHQgY2lyY2xlXG4gICAgICBncm91cFsnc2hhcGVNYXAnXVsnbGluay1wb2ludC1yaWdodCddID0gZ3JvdXAuYWRkU2hhcGUoJ2NpcmNsZScsIHtcbiAgICAgICAgYXR0cnM6IF9fYXNzaWduKF9fYXNzaWduKHt9LCBtYXJrU3R5bGUpLCB7XG4gICAgICAgICAgeDogd2lkdGggLyAyLFxuICAgICAgICAgIHk6IDAsXG4gICAgICAgICAgcjogbWFya1NpemUgLyAyIHx8IG1hcmtSIHx8IDVcbiAgICAgICAgfSksXG4gICAgICAgIGNsYXNzTmFtZTogJ2xpbmstcG9pbnQtcmlnaHQnLFxuICAgICAgICBuYW1lOiAnbGluay1wb2ludC1yaWdodCcsXG4gICAgICAgIGlzQW5jaG9yUG9pbnQ6IHRydWVcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0b3ApIHtcbiAgICAgIC8vIHRvcCBjaXJjbGVcbiAgICAgIGdyb3VwWydzaGFwZU1hcCddWydsaW5rLXBvaW50LXRvcCddID0gZ3JvdXAuYWRkU2hhcGUoJ2NpcmNsZScsIHtcbiAgICAgICAgYXR0cnM6IF9fYXNzaWduKF9fYXNzaWduKHt9LCBtYXJrU3R5bGUpLCB7XG4gICAgICAgICAgeDogMCxcbiAgICAgICAgICB5OiAtaGVpZ2h0IC8gMixcbiAgICAgICAgICByOiBtYXJrU2l6ZSAvIDIgfHwgbWFya1IgfHwgNVxuICAgICAgICB9KSxcbiAgICAgICAgY2xhc3NOYW1lOiAnbGluay1wb2ludC10b3AnLFxuICAgICAgICBuYW1lOiAnbGluay1wb2ludC10b3AnLFxuICAgICAgICBpc0FuY2hvclBvaW50OiB0cnVlXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoYm90dG9tKSB7XG4gICAgICAvLyBib3R0b20gY2lyY2xlXG4gICAgICBncm91cFsnc2hhcGVNYXAnXVsnbGluay1wb2ludC1ib3R0b20nXSA9IGdyb3VwLmFkZFNoYXBlKCdjaXJjbGUnLCB7XG4gICAgICAgIGF0dHJzOiBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgbWFya1N0eWxlKSwge1xuICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgeTogaGVpZ2h0IC8gMixcbiAgICAgICAgICByOiBtYXJrU2l6ZSAvIDIgfHwgbWFya1IgfHwgNVxuICAgICAgICB9KSxcbiAgICAgICAgY2xhc3NOYW1lOiAnbGluay1wb2ludC1ib3R0b20nLFxuICAgICAgICBuYW1lOiAnbGluay1wb2ludC1ib3R0b20nLFxuICAgICAgICBpc0FuY2hvclBvaW50OiB0cnVlXG4gICAgICB9KTtcbiAgICB9XG4gIH0sXG4gIGRyYXdMYWJlbDogZnVuY3Rpb24gZHJhd0xhYmVsKGNmZywgZ3JvdXApIHtcbiAgICB2YXIgX2EgPSB0aGlzLmdldE9wdGlvbnMoY2ZnKSxcbiAgICAgICAgX2IgPSBfYS5sYWJlbENmZyxcbiAgICAgICAgbGFiZWxDZmcgPSBfYiA9PT0gdm9pZCAwID8ge30gOiBfYixcbiAgICAgICAgX2MgPSBfYS5sb2dvSWNvbixcbiAgICAgICAgbG9nb0ljb24gPSBfYyA9PT0gdm9pZCAwID8ge30gOiBfYyxcbiAgICAgICAgX2QgPSBfYS5kZXNjcmlwdGlvbkNmZyxcbiAgICAgICAgZGVzY3JpcHRpb25DZmcgPSBfZCA9PT0gdm9pZCAwID8ge30gOiBfZDtcblxuICAgIHZhciBzaXplID0gdGhpcy5nZXRTaXplKGNmZyk7XG4gICAgdmFyIHdpZHRoID0gc2l6ZVswXTtcbiAgICB2YXIgbGFiZWwgPSBudWxsO1xuICAgIHZhciBzaG93ID0gbG9nb0ljb24uc2hvdyxcbiAgICAgICAgdyA9IGxvZ29JY29uLndpZHRoO1xuICAgIHZhciBvZmZzZXRYID0gLXdpZHRoIC8gMiArIGxhYmVsQ2ZnLm9mZnNldDtcblxuICAgIGlmIChzaG93KSB7XG4gICAgICBvZmZzZXRYID0gLXdpZHRoIC8gMiArIHcgKyBsYWJlbENmZy5vZmZzZXQ7XG4gICAgfVxuXG4gICAgdmFyIGZvbnRTdHlsZSA9IGxhYmVsQ2ZnLnN0eWxlO1xuICAgIHZhciBkZXNjcmlwdGlvblN0eWxlID0gZGVzY3JpcHRpb25DZmcuc3R5bGUsXG4gICAgICAgIGRlc2NyaXB0aW9uUGFkZGluZ1RvcCA9IGRlc2NyaXB0aW9uQ2ZnLnBhZGRpbmdUb3A7XG5cbiAgICBpZiAoaXNTdHJpbmcoY2ZnLmRlc2NyaXB0aW9uKSkge1xuICAgICAgbGFiZWwgPSBncm91cC5hZGRTaGFwZSgndGV4dCcsIHtcbiAgICAgICAgYXR0cnM6IF9fYXNzaWduKF9fYXNzaWduKHt9LCBmb250U3R5bGUpLCB7XG4gICAgICAgICAgeDogb2Zmc2V0WCxcbiAgICAgICAgICB5OiAtNSxcbiAgICAgICAgICB0ZXh0OiBjZmcubGFiZWxcbiAgICAgICAgfSksXG4gICAgICAgIGNsYXNzTmFtZTogJ3RleHQtc2hhcGUnLFxuICAgICAgICBuYW1lOiAndGV4dC1zaGFwZScsXG4gICAgICAgIGRyYWdnYWJsZTogdHJ1ZVxuICAgICAgfSk7XG4gICAgICBncm91cFsnc2hhcGVNYXAnXVsndGV4dC1zaGFwZSddID0gbGFiZWw7XG4gICAgICBncm91cFsnc2hhcGVNYXAnXVsncmVjdC1kZXNjcmlwdGlvbiddID0gZ3JvdXAuYWRkU2hhcGUoJ3RleHQnLCB7XG4gICAgICAgIGF0dHJzOiBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgZGVzY3JpcHRpb25TdHlsZSksIHtcbiAgICAgICAgICB4OiBvZmZzZXRYLFxuICAgICAgICAgIHk6IDE3ICsgKGRlc2NyaXB0aW9uUGFkZGluZ1RvcCB8fCAwKSxcbiAgICAgICAgICB0ZXh0OiBjZmcuZGVzY3JpcHRpb25cbiAgICAgICAgfSksXG4gICAgICAgIGNsYXNzTmFtZTogJ3JlY3QtZGVzY3JpcHRpb24nLFxuICAgICAgICBuYW1lOiAncmVjdC1kZXNjcmlwdGlvbicsXG4gICAgICAgIGRyYWdnYWJsZTogdHJ1ZVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxhYmVsID0gZ3JvdXAuYWRkU2hhcGUoJ3RleHQnLCB7XG4gICAgICAgIGF0dHJzOiBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgZm9udFN0eWxlKSwge1xuICAgICAgICAgIHg6IG9mZnNldFgsXG4gICAgICAgICAgeTogNyxcbiAgICAgICAgICB0ZXh0OiBjZmcubGFiZWxcbiAgICAgICAgfSksXG4gICAgICAgIGNsYXNzTmFtZTogJ3RleHQtc2hhcGUnLFxuICAgICAgICBuYW1lOiAndGV4dC1zaGFwZScsXG4gICAgICAgIGRyYWdnYWJsZTogdHJ1ZVxuICAgICAgfSk7XG4gICAgICBncm91cFsnc2hhcGVNYXAnXVsndGV4dC1zaGFwZSddID0gbGFiZWw7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxhYmVsO1xuICB9LFxuXG4gIC8qKlxuICAgKiDojrflj5boioLngrnnmoTmoLflvI/vvIzkvpvln7rkuo7or6XoioLngrnoh6rlrprkuYnml7bkvb/nlKhcbiAgICogQHBhcmFtIHtPYmplY3R9IGNmZyDoioLngrnmlbDmja7mqKHlnotcbiAgICogQHJldHVybiB7T2JqZWN0fSDoioLngrnnmoTmoLflvI9cbiAgICovXG4gIGdldFNoYXBlU3R5bGU6IGZ1bmN0aW9uIGdldFNoYXBlU3R5bGUoY2ZnKSB7XG4gICAgdmFyIGRlZmF1bHRTdHlsZSA9ICh0aGlzLm1lcmdlU3R5bGUgfHwgdGhpcy5nZXRPcHRpb25zKGNmZykpLnN0eWxlO1xuICAgIHZhciBzdHJva2VTdHlsZSA9IHtcbiAgICAgIHN0cm9rZTogY2ZnLmNvbG9yXG4gICAgfTsgLy8g5aaC5p6c6K6+572u5LqGY29sb3LvvIzliJnopobnm5bpu5jorqTnmoRzdHJva2XlsZ7mgKdcblxuICAgIHZhciBzdHlsZSA9IG1peCh7fSwgZGVmYXVsdFN0eWxlLCBzdHJva2VTdHlsZSk7XG4gICAgdmFyIHNpemUgPSB0aGlzLmdldFNpemUoY2ZnKTtcbiAgICB2YXIgd2lkdGggPSBzdHlsZS53aWR0aCB8fCBzaXplWzBdO1xuICAgIHZhciBoZWlnaHQgPSBzdHlsZS5oZWlnaHQgfHwgc2l6ZVsxXTtcblxuICAgIHZhciBzdHlsZXMgPSBfX2Fzc2lnbih7XG4gICAgICB4OiAtd2lkdGggLyAyLFxuICAgICAgeTogLWhlaWdodCAvIDIsXG4gICAgICB3aWR0aDogd2lkdGgsXG4gICAgICBoZWlnaHQ6IGhlaWdodFxuICAgIH0sIHN0eWxlKTtcblxuICAgIHJldHVybiBzdHlsZXM7XG4gIH0sXG4gIHVwZGF0ZTogZnVuY3Rpb24gdXBkYXRlKGNmZywgaXRlbSkge1xuICAgIHZhciBfYSA9IHRoaXMubWVyZ2VTdHlsZSB8fCB0aGlzLmdldE9wdGlvbnMoY2ZnKSxcbiAgICAgICAgX2IgPSBfYS5zdHlsZSxcbiAgICAgICAgc3R5bGUgPSBfYiA9PT0gdm9pZCAwID8ge30gOiBfYixcbiAgICAgICAgX2MgPSBfYS5sYWJlbENmZyxcbiAgICAgICAgbGFiZWxDZmcgPSBfYyA9PT0gdm9pZCAwID8ge30gOiBfYyxcbiAgICAgICAgX2QgPSBfYS5kZXNjcmlwdGlvbkNmZyxcbiAgICAgICAgZGVzY3JpcHRpb25DZmcgPSBfZCA9PT0gdm9pZCAwID8ge30gOiBfZDtcblxuICAgIHZhciBzaXplID0gdGhpcy5nZXRTaXplKGNmZyk7XG4gICAgdmFyIHdpZHRoID0gc2l6ZVswXTtcbiAgICB2YXIgaGVpZ2h0ID0gc2l6ZVsxXTtcbiAgICB2YXIga2V5U2hhcGUgPSBpdGVtLmdldCgna2V5U2hhcGUnKTtcbiAgICBrZXlTaGFwZS5hdHRyKF9fYXNzaWduKF9fYXNzaWduKHt9LCBzdHlsZSksIHtcbiAgICAgIHg6IC13aWR0aCAvIDIsXG4gICAgICB5OiAtaGVpZ2h0IC8gMixcbiAgICAgIHdpZHRoOiB3aWR0aCxcbiAgICAgIGhlaWdodDogaGVpZ2h0XG4gICAgfSkpO1xuICAgIHZhciBncm91cCA9IGl0ZW0uZ2V0Q29udGFpbmVyKCk7XG4gICAgdmFyIGxvZ29JY29uU2hhcGUgPSBncm91cFsnc2hhcGVNYXAnXVsncmVjdC1sb2dvLWljb24nXSB8fCBncm91cC5maW5kKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICByZXR1cm4gZWxlbWVudC5nZXQoJ2NsYXNzTmFtZScpID09PSAncmVjdC1sb2dvLWljb24nO1xuICAgIH0pO1xuICAgIHZhciBjdXJyZW50TG9nb0ljb25BdHRyID0gbG9nb0ljb25TaGFwZSA/IGxvZ29JY29uU2hhcGUuYXR0cigpIDoge307XG4gICAgdmFyIGxvZ29JY29uID0gbWl4KHt9LCBjdXJyZW50TG9nb0ljb25BdHRyLCBjZmcubG9nb0ljb24pO1xuICAgIHZhciB3ID0gbG9nb0ljb24ud2lkdGg7XG5cbiAgICBpZiAodyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB3ID0gdGhpcy5vcHRpb25zLmxvZ29JY29uLndpZHRoO1xuICAgIH1cblxuICAgIHZhciBzaG93ID0gY2ZnLmxvZ29JY29uID8gY2ZnLmxvZ29JY29uLnNob3cgOiB1bmRlZmluZWQ7XG4gICAgdmFyIG9mZnNldCA9IGxhYmVsQ2ZnLm9mZnNldDtcbiAgICB2YXIgb2Zmc2V0WCA9IC13aWR0aCAvIDIgKyB3ICsgb2Zmc2V0O1xuXG4gICAgaWYgKCFzaG93ICYmIHNob3cgIT09IHVuZGVmaW5lZCkge1xuICAgICAgb2Zmc2V0WCA9IC13aWR0aCAvIDIgKyBvZmZzZXQ7XG4gICAgfVxuXG4gICAgdmFyIGxhYmVsID0gZ3JvdXBbJ3NoYXBlTWFwJ11bJ25vZGUtbGFiZWwnXSB8fCBncm91cC5maW5kKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICByZXR1cm4gZWxlbWVudC5nZXQoJ2NsYXNzTmFtZScpID09PSAnbm9kZS1sYWJlbCc7XG4gICAgfSk7XG4gICAgdmFyIGRlc2NyaXB0aW9uID0gZ3JvdXBbJ3NoYXBlTWFwJ11bJ3JlY3QtZGVzY3JpcHRpb24nXSB8fCBncm91cC5maW5kKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICByZXR1cm4gZWxlbWVudC5nZXQoJ2NsYXNzTmFtZScpID09PSAncmVjdC1kZXNjcmlwdGlvbic7XG4gICAgfSk7XG5cbiAgICBpZiAoY2ZnLmxhYmVsKSB7XG4gICAgICBpZiAoIWxhYmVsKSB7XG4gICAgICAgIGdyb3VwWydzaGFwZU1hcCddWydub2RlLWxhYmVsJ10gPSBncm91cC5hZGRTaGFwZSgndGV4dCcsIHtcbiAgICAgICAgICBhdHRyczogX19hc3NpZ24oX19hc3NpZ24oe30sIGxhYmVsQ2ZnLnN0eWxlKSwge1xuICAgICAgICAgICAgeDogb2Zmc2V0WCxcbiAgICAgICAgICAgIHk6IGNmZy5kZXNjcmlwdGlvbiA/IC01IDogNyxcbiAgICAgICAgICAgIHRleHQ6IGNmZy5sYWJlbFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIGNsYXNzTmFtZTogJ25vZGUtbGFiZWwnLFxuICAgICAgICAgIG5hbWU6ICdub2RlLWxhYmVsJyxcbiAgICAgICAgICBkcmFnZ2FibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgY2ZnU3R5bGUgPSBjZmcubGFiZWxDZmcgPyBjZmcubGFiZWxDZmcuc3R5bGUgOiB7fTtcbiAgICAgICAgdmFyIGxhYmVsU3R5bGUgPSBtaXgoe30sIGxhYmVsLmF0dHIoKSwgY2ZnU3R5bGUpO1xuICAgICAgICBpZiAoY2ZnLmxhYmVsKSBsYWJlbFN0eWxlLnRleHQgPSBjZmcubGFiZWw7XG4gICAgICAgIGxhYmVsU3R5bGUueCA9IG9mZnNldFg7XG4gICAgICAgIGlmIChpc1N0cmluZyhjZmcuZGVzY3JpcHRpb24pKSBsYWJlbFN0eWxlLnkgPSAtNTtcblxuICAgICAgICBpZiAoZGVzY3JpcHRpb24pIHtcbiAgICAgICAgICBkZXNjcmlwdGlvbi5yZXNldE1hdHJpeCgpO1xuICAgICAgICAgIGRlc2NyaXB0aW9uLmF0dHIoe1xuICAgICAgICAgICAgeDogb2Zmc2V0WFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgbGFiZWwucmVzZXRNYXRyaXgoKTtcbiAgICAgICAgbGFiZWwuYXR0cihsYWJlbFN0eWxlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaXNTdHJpbmcoY2ZnLmRlc2NyaXB0aW9uKSkge1xuICAgICAgdmFyIHBhZGRpbmdUb3AgPSBkZXNjcmlwdGlvbkNmZy5wYWRkaW5nVG9wO1xuXG4gICAgICBpZiAoIWRlc2NyaXB0aW9uKSB7XG4gICAgICAgIGdyb3VwWydzaGFwZU1hcCddWydyZWN0LWRlc2NyaXB0aW9uJ10gPSBncm91cC5hZGRTaGFwZSgndGV4dCcsIHtcbiAgICAgICAgICBhdHRyczogX19hc3NpZ24oX19hc3NpZ24oe30sIGRlc2NyaXB0aW9uQ2ZnLnN0eWxlKSwge1xuICAgICAgICAgICAgeDogb2Zmc2V0WCxcbiAgICAgICAgICAgIHk6IDE3ICsgKHBhZGRpbmdUb3AgfHwgMCksXG4gICAgICAgICAgICB0ZXh0OiBjZmcuZGVzY3JpcHRpb25cbiAgICAgICAgICB9KSxcbiAgICAgICAgICBjbGFzc05hbWU6ICdyZWN0LWRlc2NyaXB0aW9uJyxcbiAgICAgICAgICBuYW1lOiAncmVjdC1kZXNjcmlwdGlvbicsXG4gICAgICAgICAgZHJhZ2dhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGNmZ1N0eWxlID0gY2ZnLmRlc2NyaXB0aW9uQ2ZnID8gY2ZnLmRlc2NyaXB0aW9uQ2ZnLnN0eWxlIDoge307XG4gICAgICAgIHZhciBkZXNjcmlwdGlvblN0eWxlID0gbWl4KHt9LCBkZXNjcmlwdGlvbi5hdHRyKCksIGNmZ1N0eWxlKTtcbiAgICAgICAgaWYgKGlzU3RyaW5nKGNmZy5kZXNjcmlwdGlvbikpIGRlc2NyaXB0aW9uU3R5bGUudGV4dCA9IGNmZy5kZXNjcmlwdGlvbjtcbiAgICAgICAgZGVzY3JpcHRpb25TdHlsZS54ID0gb2Zmc2V0WDtcbiAgICAgICAgZGVzY3JpcHRpb24ucmVzZXRNYXRyaXgoKTtcbiAgICAgICAgZGVzY3JpcHRpb24uYXR0cihfX2Fzc2lnbihfX2Fzc2lnbih7fSwgZGVzY3JpcHRpb25TdHlsZSksIHtcbiAgICAgICAgICB5OiAxNyArIChwYWRkaW5nVG9wIHx8IDApXG4gICAgICAgIH0pKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgcHJlUmVjdFNoYXBlID0gZ3JvdXBbJ3NoYXBlTWFwJ11bJ3ByZS1yZWN0J10gfHwgZ3JvdXAuZmluZChmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgcmV0dXJuIGVsZW1lbnQuZ2V0KCdjbGFzc05hbWUnKSA9PT0gJ3ByZS1yZWN0JztcbiAgICB9KTtcblxuICAgIGlmIChwcmVSZWN0U2hhcGUgJiYgIXByZVJlY3RTaGFwZS5kZXN0cm95ZWQpIHtcbiAgICAgIHZhciBwcmVSZWN0ID0gbWl4KHt9LCBwcmVSZWN0U2hhcGUuYXR0cigpLCBjZmcucHJlUmVjdCk7XG4gICAgICBwcmVSZWN0U2hhcGUuYXR0cihfX2Fzc2lnbihfX2Fzc2lnbih7fSwgcHJlUmVjdCksIHtcbiAgICAgICAgeDogLXdpZHRoIC8gMixcbiAgICAgICAgeTogLWhlaWdodCAvIDIsXG4gICAgICAgIGhlaWdodDogaGVpZ2h0XG4gICAgICB9KSk7XG4gICAgfVxuXG4gICAgaWYgKGxvZ29JY29uU2hhcGUgJiYgIWxvZ29JY29uU2hhcGUuZGVzdHJveWVkKSB7XG4gICAgICBpZiAoIXNob3cgJiYgc2hvdyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGxvZ29JY29uU2hhcGUucmVtb3ZlKCk7XG4gICAgICAgIGRlbGV0ZSBncm91cFsnc2hhcGVNYXAnXVsncHJlLXJlY3QnXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBsb2dvVyA9IGxvZ29JY29uLndpZHRoLFxuICAgICAgICAgICAgaCA9IGxvZ29JY29uLmhlaWdodCxcbiAgICAgICAgICAgIHggPSBsb2dvSWNvbi54LFxuICAgICAgICAgICAgeSA9IGxvZ29JY29uLnksXG4gICAgICAgICAgICBsb2dvT2Zmc2V0ID0gbG9nb0ljb24ub2Zmc2V0LFxuICAgICAgICAgICAgbG9nb0ljb25TdHlsZSA9IF9fcmVzdChsb2dvSWNvbiwgW1wid2lkdGhcIiwgXCJoZWlnaHRcIiwgXCJ4XCIsIFwieVwiLCBcIm9mZnNldFwiXSk7XG5cbiAgICAgICAgbG9nb0ljb25TaGFwZS5hdHRyKF9fYXNzaWduKF9fYXNzaWduKHt9LCBsb2dvSWNvblN0eWxlKSwge1xuICAgICAgICAgIHg6IHggfHwgLXdpZHRoIC8gMiArIGxvZ29XICsgbG9nb09mZnNldCxcbiAgICAgICAgICB5OiB5IHx8IC1oIC8gMixcbiAgICAgICAgICB3aWR0aDogbG9nb1csXG4gICAgICAgICAgaGVpZ2h0OiBoXG4gICAgICAgIH0pKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHNob3cpIHtcbiAgICAgIHRoaXMuZHJhd0xvZ29JY29uKGNmZywgZ3JvdXApO1xuICAgIH1cblxuICAgIHZhciBzdGF0ZUljb25TaGFwZSA9IGdyb3VwWydzaGFwZU1hcCddWydyZWN0LXN0YXRlLWljb24nXSB8fCBncm91cC5maW5kKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICByZXR1cm4gZWxlbWVudC5nZXQoJ2NsYXNzTmFtZScpID09PSAncmVjdC1zdGF0ZS1pY29uJztcbiAgICB9KTtcbiAgICB2YXIgY3VycmVudFN0YXRlSWNvbkF0dHIgPSBzdGF0ZUljb25TaGFwZSA/IHN0YXRlSWNvblNoYXBlLmF0dHIoKSA6IHt9O1xuICAgIHZhciBzdGF0ZUljb24gPSBtaXgoe30sIGN1cnJlbnRTdGF0ZUljb25BdHRyLCBjZmcuc3RhdGVJY29uKTtcblxuICAgIGlmIChzdGF0ZUljb25TaGFwZSkge1xuICAgICAgaWYgKCFzdGF0ZUljb24uc2hvdyAmJiBzdGF0ZUljb24uc2hvdyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHN0YXRlSWNvblNoYXBlLnJlbW92ZSgpO1xuICAgICAgICBkZWxldGUgZ3JvdXBbJ3NoYXBlTWFwJ11bJ3JlY3Qtc3RhdGUtaWNvbiddO1xuICAgICAgfVxuXG4gICAgICB2YXIgc3RhdGVXID0gc3RhdGVJY29uLndpZHRoLFxuICAgICAgICAgIGggPSBzdGF0ZUljb24uaGVpZ2h0LFxuICAgICAgICAgIHggPSBzdGF0ZUljb24ueCxcbiAgICAgICAgICB5ID0gc3RhdGVJY29uLnksXG4gICAgICAgICAgc3RhdGVPZmZzZXQgPSBzdGF0ZUljb24ub2Zmc2V0LFxuICAgICAgICAgIHN0YXRlSWNvblN0eWxlID0gX19yZXN0KHN0YXRlSWNvbiwgW1wid2lkdGhcIiwgXCJoZWlnaHRcIiwgXCJ4XCIsIFwieVwiLCBcIm9mZnNldFwiXSk7XG5cbiAgICAgIHN0YXRlSWNvblNoYXBlLmF0dHIoX19hc3NpZ24oX19hc3NpZ24oe30sIHN0YXRlSWNvblN0eWxlKSwge1xuICAgICAgICB4OiB4IHx8IHdpZHRoIC8gMiAtIHN0YXRlVyArIHN0YXRlT2Zmc2V0LFxuICAgICAgICB5OiB5IHx8IC1oIC8gMixcbiAgICAgICAgd2lkdGg6IHN0YXRlVyxcbiAgICAgICAgaGVpZ2h0OiBoXG4gICAgICB9KSk7XG4gICAgfSBlbHNlIGlmIChzdGF0ZUljb24uc2hvdykge1xuICAgICAgdGhpcy5kcmF3U3RhdGVJY29uKGNmZywgZ3JvdXApO1xuICAgIH1cblxuICAgIHRoaXMudXBkYXRlTGlua1BvaW50cyhjZmcsIGdyb3VwKTtcbiAgfVxufSwgJ3NpbmdsZS1ub2RlJyk7IiwiaW1wb3J0IHsgX19hc3NpZ24sIF9fcmVzdCB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgcmVnaXN0ZXJOb2RlLCBCYXNlR2xvYmFsIGFzIEdsb2JhbCB9IGZyb20gJ0BhbnR2L2c2LWNvcmUnO1xuaW1wb3J0IHsgbWl4IH0gZnJvbSAnQGFudHYvdXRpbCc7IC8vIOS6lOinkuaYn3NoYXBlXG5cbnJlZ2lzdGVyTm9kZSgnc3RhcicsIHtcbiAgLy8g6Ieq5a6a5LmJ6IqC54K55pe255qE6YWN572uXG4gIG9wdGlvbnM6IHtcbiAgICBzaXplOiA2MCxcbiAgICBzdHlsZToge1xuICAgICAgc3Ryb2tlOiBHbG9iYWwuZGVmYXVsdE5vZGUuc3R5bGUuc3Ryb2tlLFxuICAgICAgZmlsbDogR2xvYmFsLmRlZmF1bHROb2RlLnN0eWxlLmZpbGwsXG4gICAgICBsaW5lV2lkdGg6IEdsb2JhbC5kZWZhdWx0Tm9kZS5zdHlsZS5saW5lV2lkdGhcbiAgICB9LFxuICAgIGxhYmVsQ2ZnOiB7XG4gICAgICBzdHlsZToge1xuICAgICAgICBmaWxsOiBHbG9iYWwubm9kZUxhYmVsLnN0eWxlLmZpbGwsXG4gICAgICAgIGZvbnRTaXplOiBHbG9iYWwubm9kZUxhYmVsLnN0eWxlLmZvbnRTaXplLFxuICAgICAgICBmb250RmFtaWx5OiBHbG9iYWwud2luZG93Rm9udEZhbWlseVxuICAgICAgfVxuICAgIH0sXG4gICAgLy8g6IqC54K55LiK5bem5Y+z5LiK5LiL5Zub5Liq5pa55ZCR5LiK55qE6ZO+5o6lY2lyY2xl6YWN572uXG4gICAgbGlua1BvaW50czoge1xuICAgICAgdG9wOiBmYWxzZSxcbiAgICAgIHJpZ2h0OiBmYWxzZSxcbiAgICAgIGJvdHRvbTogZmFsc2UsXG4gICAgICBsZWZ0OiBmYWxzZSxcbiAgICAgIC8vIGNpcmNsZeeahOWkp+Wwj1xuICAgICAgc2l6ZTogR2xvYmFsLmRlZmF1bHROb2RlLmxpbmtQb2ludHMuc2l6ZSxcbiAgICAgIGxpbmVXaWR0aDogR2xvYmFsLmRlZmF1bHROb2RlLmxpbmtQb2ludHMubGluZVdpZHRoLFxuICAgICAgZmlsbDogR2xvYmFsLmRlZmF1bHROb2RlLmxpbmtQb2ludHMuZmlsbCxcbiAgICAgIHN0cm9rZTogR2xvYmFsLmRlZmF1bHROb2RlLmxpbmtQb2ludHMuc3Ryb2tlXG4gICAgfSxcbiAgICAvLyDoioLngrnkuK1pY29u6YWN572uXG4gICAgaWNvbjoge1xuICAgICAgLy8g5piv5ZCm5pi+56S6aWNvbu+8jOWAvOS4uiBmYWxzZSDliJnkuI3muLLmn5NpY29uXG4gICAgICBzaG93OiBmYWxzZSxcbiAgICAgIC8vIGljb27nmoTlnLDlnYDvvIzlrZfnrKbkuLLnsbvlnotcbiAgICAgIGltZzogJ2h0dHBzOi8vZ3cuYWxpcGF5b2JqZWN0cy5jb20vem9zL2Jtdy1wcm9kLzVkMDE1MDY1LTg1MDUtNGU3YS1iYWVjLTk3NmY4MWUzYzQxZC5zdmcnLFxuICAgICAgd2lkdGg6IDIwLFxuICAgICAgaGVpZ2h0OiAyMFxuICAgIH0sXG4gICAgc3RhdGVTdHlsZXM6IF9fYXNzaWduKHt9LCBHbG9iYWwubm9kZVN0YXRlU3R5bGVzKVxuICB9LFxuICBzaGFwZVR5cGU6ICdzdGFyJyxcbiAgLy8g5paH5pys5L2N572uXG4gIGxhYmVsUG9zaXRpb246ICdjZW50ZXInLFxuICBkcmF3U2hhcGU6IGZ1bmN0aW9uIGRyYXdTaGFwZShjZmcsIGdyb3VwKSB7XG4gICAgdmFyIF9hID0gKHRoaXMubWVyZ2VTdHlsZSB8fCB0aGlzLmdldE9wdGlvbnMoY2ZnKSkuaWNvbixcbiAgICAgICAgaWNvbiA9IF9hID09PSB2b2lkIDAgPyB7fSA6IF9hO1xuICAgIHZhciBzdHlsZSA9IHRoaXMuZ2V0U2hhcGVTdHlsZShjZmcpO1xuICAgIHZhciBrZXlTaGFwZSA9IGdyb3VwLmFkZFNoYXBlKCdwYXRoJywge1xuICAgICAgYXR0cnM6IHN0eWxlLFxuICAgICAgY2xhc3NOYW1lOiB0aGlzLnR5cGUgKyBcIi1rZXlTaGFwZVwiLFxuICAgICAgbmFtZTogdGhpcy50eXBlICsgXCIta2V5U2hhcGVcIixcbiAgICAgIGRyYWdnYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIGdyb3VwWydzaGFwZU1hcCddW3RoaXMudHlwZSArIFwiLWtleVNoYXBlXCJdID0ga2V5U2hhcGU7XG4gICAgdmFyIHcgPSBpY29uLndpZHRoLFxuICAgICAgICBoID0gaWNvbi5oZWlnaHQsXG4gICAgICAgIHNob3cgPSBpY29uLnNob3csXG4gICAgICAgIHRleHQgPSBpY29uLnRleHQ7XG5cbiAgICBpZiAoc2hvdykge1xuICAgICAgaWYgKHRleHQpIHtcbiAgICAgICAgZ3JvdXBbJ3NoYXBlTWFwJ11bdGhpcy50eXBlICsgXCItaWNvblwiXSA9IGdyb3VwLmFkZFNoYXBlKCd0ZXh0Jywge1xuICAgICAgICAgIGF0dHJzOiBfX2Fzc2lnbih7XG4gICAgICAgICAgICB4OiAwLFxuICAgICAgICAgICAgeTogMCxcbiAgICAgICAgICAgIGZvbnRTaXplOiAxMixcbiAgICAgICAgICAgIGZpbGw6ICcjMDAwJyxcbiAgICAgICAgICAgIHN0cm9rZTogJyMwMDAnLFxuICAgICAgICAgICAgdGV4dEJhc2VsaW5lOiAnbWlkZGxlJyxcbiAgICAgICAgICAgIHRleHRBbGlnbjogJ2NlbnRlcidcbiAgICAgICAgICB9LCBpY29uKSxcbiAgICAgICAgICBjbGFzc05hbWU6IHRoaXMudHlwZSArIFwiLWljb25cIixcbiAgICAgICAgICBuYW1lOiB0aGlzLnR5cGUgKyBcIi1pY29uXCIsXG4gICAgICAgICAgZHJhZ2dhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZ3JvdXBbJ3NoYXBlTWFwJ11bdGhpcy50eXBlICsgXCItaWNvblwiXSA9IGdyb3VwLmFkZFNoYXBlKCdpbWFnZScsIHtcbiAgICAgICAgICBhdHRyczogX19hc3NpZ24oe1xuICAgICAgICAgICAgeDogLXcgLyAyLFxuICAgICAgICAgICAgeTogLWggLyAyXG4gICAgICAgICAgfSwgaWNvbiksXG4gICAgICAgICAgY2xhc3NOYW1lOiB0aGlzLnR5cGUgKyBcIi1pY29uXCIsXG4gICAgICAgICAgbmFtZTogdGhpcy50eXBlICsgXCItaWNvblwiLFxuICAgICAgICAgIGRyYWdnYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmRyYXdMaW5rUG9pbnRzKGNmZywgZ3JvdXApO1xuICAgIHJldHVybiBrZXlTaGFwZTtcbiAgfSxcblxuICAvKipcbiAgICog57uY5Yi26IqC54K55LiK55qETGlua1BvaW50c1xuICAgKiBAcGFyYW0ge09iamVjdH0gY2ZnIGRhdGHmlbDmja7phY3nva7poblcbiAgICogQHBhcmFtIHtHcm91cH0gZ3JvdXAgR3JvdXDlrp7kvotcbiAgICovXG4gIGRyYXdMaW5rUG9pbnRzOiBmdW5jdGlvbiBkcmF3TGlua1BvaW50cyhjZmcsIGdyb3VwKSB7XG4gICAgdmFyIF9hID0gKHRoaXMubWVyZ2VTdHlsZSB8fCB0aGlzLmdldE9wdGlvbnMoY2ZnKSkubGlua1BvaW50cyxcbiAgICAgICAgbGlua1BvaW50cyA9IF9hID09PSB2b2lkIDAgPyB7fSA6IF9hO1xuXG4gICAgdmFyIHRvcCA9IGxpbmtQb2ludHMudG9wLFxuICAgICAgICBsZWZ0ID0gbGlua1BvaW50cy5sZWZ0LFxuICAgICAgICByaWdodCA9IGxpbmtQb2ludHMucmlnaHQsXG4gICAgICAgIGxlZnRCb3R0b20gPSBsaW5rUG9pbnRzLmxlZnRCb3R0b20sXG4gICAgICAgIHJpZ2h0Qm90dG9tID0gbGlua1BvaW50cy5yaWdodEJvdHRvbSxcbiAgICAgICAgbWFya1NpemUgPSBsaW5rUG9pbnRzLnNpemUsXG4gICAgICAgIG1hcmtSID0gbGlua1BvaW50cy5yLFxuICAgICAgICBtYXJrU3R5bGUgPSBfX3Jlc3QobGlua1BvaW50cywgW1widG9wXCIsIFwibGVmdFwiLCBcInJpZ2h0XCIsIFwibGVmdEJvdHRvbVwiLCBcInJpZ2h0Qm90dG9tXCIsIFwic2l6ZVwiLCBcInJcIl0pO1xuXG4gICAgdmFyIHNpemUgPSB0aGlzLmdldFNpemUoY2ZnKTtcbiAgICB2YXIgb3V0ZXJSID0gc2l6ZVswXTtcblxuICAgIGlmIChyaWdodCkge1xuICAgICAgLy8gcmlnaHQgY2lyY2xlXG4gICAgICAvLyB1cCBkb3duIGxlZnQgcmlnaHQg5Zub5Liq5pa55ZCR55qE5Z2Q5qCH5Z2H5LiN55u45ZCMXG4gICAgICB2YXIgeDEgPSBNYXRoLmNvcygoMTggKyA3MiAqIDApIC8gMTgwICogTWF0aC5QSSkgKiBvdXRlclI7XG4gICAgICB2YXIgeTEgPSBNYXRoLnNpbigoMTggKyA3MiAqIDApIC8gMTgwICogTWF0aC5QSSkgKiBvdXRlclI7XG4gICAgICBncm91cFsnc2hhcGVNYXAnXVsnbGluay1wb2ludC1yaWdodCddID0gZ3JvdXAuYWRkU2hhcGUoJ2NpcmNsZScsIHtcbiAgICAgICAgYXR0cnM6IF9fYXNzaWduKF9fYXNzaWduKHt9LCBtYXJrU3R5bGUpLCB7XG4gICAgICAgICAgeDogeDEsXG4gICAgICAgICAgeTogLXkxLFxuICAgICAgICAgIHI6IG1hcmtTaXplIC8gMiB8fCBtYXJrUiB8fCA1XG4gICAgICAgIH0pLFxuICAgICAgICBjbGFzc05hbWU6ICdsaW5rLXBvaW50LXJpZ2h0JyxcbiAgICAgICAgbmFtZTogJ2xpbmstcG9pbnQtcmlnaHQnXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodG9wKSB7XG4gICAgICAvLyB1cCBkb3duIGxlZnQgcmlnaHQg5Zub5Liq5pa55ZCR55qE5Z2Q5qCH5Z2H5LiN55u45ZCMXG4gICAgICB2YXIgeDEgPSBNYXRoLmNvcygoMTggKyA3MiAqIDEpIC8gMTgwICogTWF0aC5QSSkgKiBvdXRlclI7XG4gICAgICB2YXIgeTEgPSBNYXRoLnNpbigoMTggKyA3MiAqIDEpIC8gMTgwICogTWF0aC5QSSkgKiBvdXRlclI7IC8vIHRvcCBjaXJjbGVcblxuICAgICAgZ3JvdXBbJ3NoYXBlTWFwJ11bJ2xpbmstcG9pbnQtdG9wJ10gPSBncm91cC5hZGRTaGFwZSgnY2lyY2xlJywge1xuICAgICAgICBhdHRyczogX19hc3NpZ24oX19hc3NpZ24oe30sIG1hcmtTdHlsZSksIHtcbiAgICAgICAgICB4OiB4MSxcbiAgICAgICAgICB5OiAteTEsXG4gICAgICAgICAgcjogbWFya1NpemUgLyAyIHx8IG1hcmtSIHx8IDVcbiAgICAgICAgfSksXG4gICAgICAgIGNsYXNzTmFtZTogJ2xpbmstcG9pbnQtdG9wJyxcbiAgICAgICAgbmFtZTogJ2xpbmstcG9pbnQtdG9wJ1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGxlZnQpIHtcbiAgICAgIC8vIHVwIGRvd24gbGVmdCByaWdodCDlm5vkuKrmlrnlkJHnmoTlnZDmoIflnYfkuI3nm7jlkIxcbiAgICAgIHZhciB4MSA9IE1hdGguY29zKCgxOCArIDcyICogMikgLyAxODAgKiBNYXRoLlBJKSAqIG91dGVyUjtcbiAgICAgIHZhciB5MSA9IE1hdGguc2luKCgxOCArIDcyICogMikgLyAxODAgKiBNYXRoLlBJKSAqIG91dGVyUjsgLy8gbGVmdCBjaXJjbGVcblxuICAgICAgZ3JvdXBbJ3NoYXBlTWFwJ11bJ2xpbmstcG9pbnQtbGVmdCddID0gZ3JvdXAuYWRkU2hhcGUoJ2NpcmNsZScsIHtcbiAgICAgICAgYXR0cnM6IF9fYXNzaWduKF9fYXNzaWduKHt9LCBtYXJrU3R5bGUpLCB7XG4gICAgICAgICAgeDogeDEsXG4gICAgICAgICAgeTogLXkxLFxuICAgICAgICAgIHI6IG1hcmtTaXplIC8gMiB8fCBtYXJrUiB8fCA1XG4gICAgICAgIH0pLFxuICAgICAgICBjbGFzc05hbWU6ICdsaW5rLXBvaW50LWxlZnQnLFxuICAgICAgICBuYW1lOiAnbGluay1wb2ludC1sZWZ0J1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGxlZnRCb3R0b20pIHtcbiAgICAgIC8vIHVwIGRvd24gbGVmdCByaWdodCDlm5vkuKrmlrnlkJHnmoTlnZDmoIflnYfkuI3nm7jlkIxcbiAgICAgIHZhciB4MSA9IE1hdGguY29zKCgxOCArIDcyICogMykgLyAxODAgKiBNYXRoLlBJKSAqIG91dGVyUjtcbiAgICAgIHZhciB5MSA9IE1hdGguc2luKCgxOCArIDcyICogMykgLyAxODAgKiBNYXRoLlBJKSAqIG91dGVyUjsgLy8gbGVmdCBib3R0b20gY2lyY2xlXG5cbiAgICAgIGdyb3VwWydzaGFwZU1hcCddWydsaW5rLXBvaW50LWJvdHRvbSddID0gZ3JvdXAuYWRkU2hhcGUoJ2NpcmNsZScsIHtcbiAgICAgICAgYXR0cnM6IF9fYXNzaWduKF9fYXNzaWduKHt9LCBtYXJrU3R5bGUpLCB7XG4gICAgICAgICAgeDogeDEsXG4gICAgICAgICAgeTogLXkxLFxuICAgICAgICAgIHI6IG1hcmtTaXplIC8gMiB8fCBtYXJrUiB8fCA1XG4gICAgICAgIH0pLFxuICAgICAgICBjbGFzc05hbWU6ICdsaW5rLXBvaW50LWxlZnQtYm90dG9tJyxcbiAgICAgICAgbmFtZTogJ2xpbmstcG9pbnQtbGVmdC1ib3R0b20nXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAocmlnaHRCb3R0b20pIHtcbiAgICAgIC8vIHVwIGRvd24gbGVmdCByaWdodCDlm5vkuKrmlrnlkJHnmoTlnZDmoIflnYfkuI3nm7jlkIxcbiAgICAgIHZhciB4MSA9IE1hdGguY29zKCgxOCArIDcyICogNCkgLyAxODAgKiBNYXRoLlBJKSAqIG91dGVyUjtcbiAgICAgIHZhciB5MSA9IE1hdGguc2luKCgxOCArIDcyICogNCkgLyAxODAgKiBNYXRoLlBJKSAqIG91dGVyUjsgLy8gbGVmdCBib3R0b20gY2lyY2xlXG5cbiAgICAgIGdyb3VwWydzaGFwZU1hcCddWydsaW5rLXBvaW50LXJpZ2h0LWJvdHRvbSddID0gZ3JvdXAuYWRkU2hhcGUoJ2NpcmNsZScsIHtcbiAgICAgICAgYXR0cnM6IF9fYXNzaWduKF9fYXNzaWduKHt9LCBtYXJrU3R5bGUpLCB7XG4gICAgICAgICAgeDogeDEsXG4gICAgICAgICAgeTogLXkxLFxuICAgICAgICAgIHI6IG1hcmtTaXplIC8gMiB8fCBtYXJrUiB8fCA1XG4gICAgICAgIH0pLFxuICAgICAgICBjbGFzc05hbWU6ICdsaW5rLXBvaW50LXJpZ2h0LWJvdHRvbScsXG4gICAgICAgIG5hbWU6ICdsaW5rLXBvaW50LXJpZ2h0LWJvdHRvbSdcbiAgICAgIH0pO1xuICAgIH1cbiAgfSxcbiAgZ2V0UGF0aDogZnVuY3Rpb24gZ2V0UGF0aChjZmcpIHtcbiAgICB2YXIgc2l6ZSA9IHRoaXMuZ2V0U2l6ZShjZmcpO1xuICAgIHZhciBvdXRlclIgPSBzaXplWzBdO1xuICAgIHZhciBkZWZhdWx0SW5uZXJSID0gb3V0ZXJSICogMyAvIDg7XG4gICAgdmFyIGlubmVyUiA9IGNmZy5pbm5lclIgfHwgZGVmYXVsdElubmVyUjtcbiAgICB2YXIgcGF0aCA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCA1OyBpKyspIHtcbiAgICAgIHZhciB4MSA9IE1hdGguY29zKCgxOCArIDcyICogaSkgLyAxODAgKiBNYXRoLlBJKSAqIG91dGVyUjtcbiAgICAgIHZhciB5MSA9IE1hdGguc2luKCgxOCArIDcyICogaSkgLyAxODAgKiBNYXRoLlBJKSAqIG91dGVyUjtcbiAgICAgIHZhciB4MiA9IE1hdGguY29zKCg1NCArIDcyICogaSkgLyAxODAgKiBNYXRoLlBJKSAqIGlubmVyUjtcbiAgICAgIHZhciB5MiA9IE1hdGguc2luKCg1NCArIDcyICogaSkgLyAxODAgKiBNYXRoLlBJKSAqIGlubmVyUjtcblxuICAgICAgaWYgKGkgPT09IDApIHtcbiAgICAgICAgcGF0aC5wdXNoKFsnTScsIHgxLCAteTFdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhdGgucHVzaChbJ0wnLCB4MSwgLXkxXSk7XG4gICAgICB9XG5cbiAgICAgIHBhdGgucHVzaChbJ0wnLCB4MiwgLXkyXSk7XG4gICAgfVxuXG4gICAgcGF0aC5wdXNoKFsnWiddKTtcbiAgICByZXR1cm4gcGF0aDtcbiAgfSxcblxuICAvKipcbiAgICog6I635Y+W6IqC54K555qE5qC35byP77yM5L6b5Z+65LqO6K+l6IqC54K56Ieq5a6a5LmJ5pe25L2/55SoXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBjZmcg6IqC54K55pWw5o2u5qih5Z6LXG4gICAqIEByZXR1cm4ge09iamVjdH0g6IqC54K555qE5qC35byPXG4gICAqL1xuICBnZXRTaGFwZVN0eWxlOiBmdW5jdGlvbiBnZXRTaGFwZVN0eWxlKGNmZykge1xuICAgIHZhciBkZWZhdWx0U3R5bGUgPSAodGhpcy5tZXJnZVN0eWxlIHx8IHRoaXMuZ2V0T3B0aW9ucyhjZmcpKS5zdHlsZTtcbiAgICB2YXIgc3Ryb2tlU3R5bGUgPSB7XG4gICAgICBzdHJva2U6IGNmZy5jb2xvclxuICAgIH07IC8vIOWmguaenOiuvue9ruS6hmNvbG9y77yM5YiZ6KaG55uW5Y6f5p2l6buY6K6k55qEIHN0cm9rZSDlsZ7mgKfjgILkvYYgY2ZnIOS4reS9hiBzdHJva2Ug5bGe5oCn5LyY5YWI57qn5pu06auYXG5cbiAgICB2YXIgc3R5bGUgPSBtaXgoe30sIGRlZmF1bHRTdHlsZSwgc3Ryb2tlU3R5bGUpO1xuICAgIHZhciBwYXRoID0gdGhpcy5nZXRQYXRoKGNmZyk7XG5cbiAgICB2YXIgc3R5bGVzID0gX19hc3NpZ24oe1xuICAgICAgcGF0aDogcGF0aFxuICAgIH0sIHN0eWxlKTtcblxuICAgIHJldHVybiBzdHlsZXM7XG4gIH0sXG4gIHVwZGF0ZTogZnVuY3Rpb24gdXBkYXRlKGNmZywgaXRlbSwgdXBkYXRlVHlwZSkge1xuICAgIHZhciBncm91cCA9IGl0ZW0uZ2V0Q29udGFpbmVyKCk7IC8vIOi/memHjOS4jeS8oCBjZmcg5Y+C5pWw5piv5Zug5Li6IGNmZy5zdHlsZSDpnIDopoHmnIDlkI7opobnm5bmoLflvI9cblxuICAgIHZhciBkZWZhdWx0U3R5bGUgPSB0aGlzLmdldE9wdGlvbnMoe30pLnN0eWxlO1xuICAgIHZhciBwYXRoID0gdGhpcy5nZXRQYXRoKGNmZyk7IC8vIOS4i+mdoui/meS6m+WxnuaAp+mcgOimgeimhueblum7mOiupOagt+W8j+S4juebruWJjeagt+W8j++8jOS9huiLpeWcqCBjZmcg5Lit5pyJ5oyH5a6a5YiZ5bqU6K+l6KKrIGNmZyDnmoTnm7jlupTphY3nva7opobnm5bjgIJcblxuICAgIHZhciBzdHJva2VTdHlsZSA9IHtcbiAgICAgIHN0cm9rZTogY2ZnLmNvbG9yLFxuICAgICAgcGF0aDogcGF0aFxuICAgIH07IC8vIOS4jiBnZXRTaGFwZVN0eWxlIOS4jeWQjOWcqOS6ju+8jHVwZGF0ZSDml7bpnIDopoHojrflj5bliLDlvZPliY3nmoQgc3R5bGUg6L+b6KGM6J6N5ZCI44CC5Y2z5paw5Lyg5YWl55qE6YWN572u6aG55Lit5rKh5pyJ5raJ5Y+K55qE5bGe5oCn77yM5L+d55WZ5b2T5YmN55qE6YWN572u44CCXG5cbiAgICB2YXIga2V5U2hhcGUgPSBpdGVtLmdldCgna2V5U2hhcGUnKTtcbiAgICB2YXIgc3R5bGUgPSBtaXgoe30sIGRlZmF1bHRTdHlsZSwga2V5U2hhcGUuYXR0cigpLCBzdHJva2VTdHlsZSk7XG4gICAgc3R5bGUgPSBtaXgoc3R5bGUsIGNmZy5zdHlsZSk7XG4gICAgdGhpcy51cGRhdGVTaGFwZShjZmcsIGl0ZW0sIHN0eWxlLCB0cnVlLCB1cGRhdGVUeXBlKTtcbiAgICB0aGlzLnVwZGF0ZUxpbmtQb2ludHMoY2ZnLCBncm91cCk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIOabtOaWsGxpbmtQb2ludHNcbiAgICogQHBhcmFtIHtPYmplY3R9IGNmZyDoioLngrnmlbDmja7phY3nva7poblcbiAgICogQHBhcmFtIHtHcm91cH0gZ3JvdXAgSXRlbeaJgOWcqOeahGdyb3VwXG4gICAqL1xuICB1cGRhdGVMaW5rUG9pbnRzOiBmdW5jdGlvbiB1cGRhdGVMaW5rUG9pbnRzKGNmZywgZ3JvdXApIHtcbiAgICB2YXIgZGVmYXVsdExpbmtQb2ludHMgPSB0aGlzLmdldE9wdGlvbnMoe30pLmxpbmtQb2ludHM7XG4gICAgdmFyIG1hcmtMZWZ0ID0gZ3JvdXBbJ3NoYXBlTWFwJ11bJ2xpbmstcG9pbnQtbGVmdCddIHx8IGdyb3VwLmZpbmQoZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBlbGVtZW50LmdldCgnY2xhc3NOYW1lJykgPT09ICdsaW5rLXBvaW50LWxlZnQnO1xuICAgIH0pO1xuICAgIHZhciBtYXJrUmlnaHQgPSBncm91cFsnc2hhcGVNYXAnXVsnbGluay1wb2ludC1yaWdodCddIHx8IGdyb3VwLmZpbmQoZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBlbGVtZW50LmdldCgnY2xhc3NOYW1lJykgPT09ICdsaW5rLXBvaW50LXJpZ2h0JztcbiAgICB9KTtcbiAgICB2YXIgbWFya1RvcCA9IGdyb3VwWydzaGFwZU1hcCddWydsaW5rLXBvaW50LXRvcCddIHx8IGdyb3VwLmZpbmQoZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBlbGVtZW50LmdldCgnY2xhc3NOYW1lJykgPT09ICdsaW5rLXBvaW50LXRvcCc7XG4gICAgfSk7XG4gICAgdmFyIG1hcmtMZWZ0Qm90dG9tID0gZ3JvdXBbJ3NoYXBlTWFwJ11bJ2xpbmstcG9pbnQtbGVmdC1ib3R0b20nXSB8fCBncm91cC5maW5kKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICByZXR1cm4gZWxlbWVudC5nZXQoJ2NsYXNzTmFtZScpID09PSAnbGluay1wb2ludC1sZWZ0LWJvdHRvbSc7XG4gICAgfSk7XG4gICAgdmFyIG1hcmtSaWdodEJvdHRvbSA9IGdyb3VwWydzaGFwZU1hcCddWydsaW5rLXBvaW50LWxlZnQtYm90dG9tJ10gfHwgZ3JvdXAuZmluZChmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgcmV0dXJuIGVsZW1lbnQuZ2V0KCdjbGFzc05hbWUnKSA9PT0gJ2xpbmstcG9pbnQtcmlnaHQtYm90dG9tJztcbiAgICB9KTtcbiAgICB2YXIgY3VycmVudExpbmtQb2ludHMgPSBkZWZhdWx0TGlua1BvaW50cztcbiAgICB2YXIgZXhpc3RMaW5rUG9pbnQgPSBtYXJrTGVmdCB8fCBtYXJrUmlnaHQgfHwgbWFya1RvcCB8fCBtYXJrTGVmdEJvdHRvbSB8fCBtYXJrUmlnaHRCb3R0b207XG5cbiAgICBpZiAoZXhpc3RMaW5rUG9pbnQpIHtcbiAgICAgIGN1cnJlbnRMaW5rUG9pbnRzID0gZXhpc3RMaW5rUG9pbnQuYXR0cigpO1xuICAgIH1cblxuICAgIHZhciBsaW5rUG9pbnRzID0gbWl4KHt9LCBjdXJyZW50TGlua1BvaW50cywgY2ZnLmxpbmtQb2ludHMpO1xuICAgIHZhciBtYXJrRmlsbCA9IGxpbmtQb2ludHMuZmlsbCxcbiAgICAgICAgbWFya1N0cm9rZSA9IGxpbmtQb2ludHMuc3Ryb2tlLFxuICAgICAgICBib3JkZXJXaWR0aCA9IGxpbmtQb2ludHMubGluZVdpZHRoO1xuICAgIHZhciBtYXJrU2l6ZSA9IGxpbmtQb2ludHMuc2l6ZSAvIDI7XG4gICAgaWYgKCFtYXJrU2l6ZSkgbWFya1NpemUgPSBsaW5rUG9pbnRzLnI7XG5cbiAgICB2YXIgX2EgPSBjZmcubGlua1BvaW50cyA/IGNmZy5saW5rUG9pbnRzIDoge1xuICAgICAgbGVmdDogdW5kZWZpbmVkLFxuICAgICAgcmlnaHQ6IHVuZGVmaW5lZCxcbiAgICAgIHRvcDogdW5kZWZpbmVkLFxuICAgICAgbGVmdEJvdHRvbTogdW5kZWZpbmVkLFxuICAgICAgcmlnaHRCb3R0b206IHVuZGVmaW5lZFxuICAgIH0sXG4gICAgICAgIGxlZnQgPSBfYS5sZWZ0LFxuICAgICAgICByaWdodCA9IF9hLnJpZ2h0LFxuICAgICAgICB0b3AgPSBfYS50b3AsXG4gICAgICAgIGxlZnRCb3R0b20gPSBfYS5sZWZ0Qm90dG9tLFxuICAgICAgICByaWdodEJvdHRvbSA9IF9hLnJpZ2h0Qm90dG9tO1xuXG4gICAgdmFyIHNpemUgPSB0aGlzLmdldFNpemUoY2ZnKTtcbiAgICB2YXIgb3V0ZXJSID0gc2l6ZVswXTtcbiAgICB2YXIgc3R5bGVzID0ge1xuICAgICAgcjogbWFya1NpemUsXG4gICAgICBmaWxsOiBtYXJrRmlsbCxcbiAgICAgIHN0cm9rZTogbWFya1N0cm9rZSxcbiAgICAgIGxpbmVXaWR0aDogYm9yZGVyV2lkdGhcbiAgICB9O1xuICAgIHZhciB4ID0gTWF0aC5jb3MoKDE4ICsgNzIgKiAwKSAvIDE4MCAqIE1hdGguUEkpICogb3V0ZXJSO1xuICAgIHZhciB5ID0gTWF0aC5zaW4oKDE4ICsgNzIgKiAwKSAvIDE4MCAqIE1hdGguUEkpICogb3V0ZXJSO1xuXG4gICAgaWYgKG1hcmtSaWdodCkge1xuICAgICAgaWYgKCFyaWdodCAmJiByaWdodCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG1hcmtSaWdodC5yZW1vdmUoKTtcbiAgICAgICAgZGVsZXRlIGdyb3VwWydzaGFwZU1hcCddWydsaW5rLXBvaW50LXJpZ2h0J107XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtYXJrUmlnaHQuYXR0cihfX2Fzc2lnbihfX2Fzc2lnbih7fSwgc3R5bGVzKSwge1xuICAgICAgICAgIHg6IHgsXG4gICAgICAgICAgeTogLXlcbiAgICAgICAgfSkpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocmlnaHQpIHtcbiAgICAgIGdyb3VwWydzaGFwZU1hcCddWydsaW5rLXBvaW50LXJpZ2h0J10gPSBncm91cC5hZGRTaGFwZSgnY2lyY2xlJywge1xuICAgICAgICBhdHRyczogX19hc3NpZ24oX19hc3NpZ24oe30sIHN0eWxlcyksIHtcbiAgICAgICAgICB4OiB4LFxuICAgICAgICAgIHk6IC15XG4gICAgICAgIH0pLFxuICAgICAgICBjbGFzc05hbWU6ICdsaW5rLXBvaW50LXJpZ2h0JyxcbiAgICAgICAgbmFtZTogJ2xpbmstcG9pbnQtcmlnaHQnLFxuICAgICAgICBpc0FuY2hvclBvaW50OiB0cnVlXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB4ID0gTWF0aC5jb3MoKDE4ICsgNzIgKiAxKSAvIDE4MCAqIE1hdGguUEkpICogb3V0ZXJSO1xuICAgIHkgPSBNYXRoLnNpbigoMTggKyA3MiAqIDEpIC8gMTgwICogTWF0aC5QSSkgKiBvdXRlclI7XG5cbiAgICBpZiAobWFya1RvcCkge1xuICAgICAgaWYgKCF0b3AgJiYgdG9wICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbWFya1RvcC5yZW1vdmUoKTtcbiAgICAgICAgZGVsZXRlIGdyb3VwWydzaGFwZU1hcCddWydsaW5rLXBvaW50LXRvcCddO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWFya1RvcC5hdHRyKF9fYXNzaWduKF9fYXNzaWduKHt9LCBzdHlsZXMpLCB7XG4gICAgICAgICAgeDogeCxcbiAgICAgICAgICB5OiAteVxuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0b3ApIHtcbiAgICAgIGdyb3VwWydzaGFwZU1hcCddWydsaW5rLXBvaW50LXRvcCddID0gZ3JvdXAuYWRkU2hhcGUoJ2NpcmNsZScsIHtcbiAgICAgICAgYXR0cnM6IF9fYXNzaWduKF9fYXNzaWduKHt9LCBzdHlsZXMpLCB7XG4gICAgICAgICAgeDogeCxcbiAgICAgICAgICB5OiAteVxuICAgICAgICB9KSxcbiAgICAgICAgY2xhc3NOYW1lOiAnbGluay1wb2ludC10b3AnLFxuICAgICAgICBuYW1lOiAnbGluay1wb2ludC10b3AnLFxuICAgICAgICBpc0FuY2hvclBvaW50OiB0cnVlXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB4ID0gTWF0aC5jb3MoKDE4ICsgNzIgKiAyKSAvIDE4MCAqIE1hdGguUEkpICogb3V0ZXJSO1xuICAgIHkgPSBNYXRoLnNpbigoMTggKyA3MiAqIDIpIC8gMTgwICogTWF0aC5QSSkgKiBvdXRlclI7XG5cbiAgICBpZiAobWFya0xlZnQpIHtcbiAgICAgIGlmICghbGVmdCAmJiBsZWZ0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbWFya0xlZnQucmVtb3ZlKCk7XG4gICAgICAgIGRlbGV0ZSBncm91cFsnc2hhcGVNYXAnXVsnbGluay1wb2ludC1sZWZ0J107XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtYXJrTGVmdC5hdHRyKF9fYXNzaWduKF9fYXNzaWduKHt9LCBzdHlsZXMpLCB7XG4gICAgICAgICAgeDogeCxcbiAgICAgICAgICB5OiAteVxuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChsZWZ0KSB7XG4gICAgICBncm91cFsnc2hhcGVNYXAnXVsnbGluay1wb2ludC1sZWZ0J10gPSBncm91cC5hZGRTaGFwZSgnY2lyY2xlJywge1xuICAgICAgICBhdHRyczogX19hc3NpZ24oX19hc3NpZ24oe30sIHN0eWxlcyksIHtcbiAgICAgICAgICB4OiB4LFxuICAgICAgICAgIHk6IC15XG4gICAgICAgIH0pLFxuICAgICAgICBjbGFzc05hbWU6ICdsaW5rLXBvaW50LWxlZnQnLFxuICAgICAgICBuYW1lOiAnbGluay1wb2ludC1sZWZ0JyxcbiAgICAgICAgaXNBbmNob3JQb2ludDogdHJ1ZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgeCA9IE1hdGguY29zKCgxOCArIDcyICogMykgLyAxODAgKiBNYXRoLlBJKSAqIG91dGVyUjtcbiAgICB5ID0gTWF0aC5zaW4oKDE4ICsgNzIgKiAzKSAvIDE4MCAqIE1hdGguUEkpICogb3V0ZXJSO1xuXG4gICAgaWYgKG1hcmtMZWZ0Qm90dG9tKSB7XG4gICAgICBpZiAoIWxlZnRCb3R0b20gJiYgbGVmdEJvdHRvbSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG1hcmtMZWZ0Qm90dG9tLnJlbW92ZSgpO1xuICAgICAgICBkZWxldGUgZ3JvdXBbJ3NoYXBlTWFwJ11bJ2xpbmstcG9pbnQtbGVmdC1ib3R0b20nXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1hcmtMZWZ0Qm90dG9tLmF0dHIoX19hc3NpZ24oX19hc3NpZ24oe30sIHN0eWxlcyksIHtcbiAgICAgICAgICB4OiB4LFxuICAgICAgICAgIHk6IC15XG4gICAgICAgIH0pKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGxlZnRCb3R0b20pIHtcbiAgICAgIGdyb3VwWydzaGFwZU1hcCddWydsaW5rLXBvaW50LWxlZnQtYm90dG9tJ10gPSBncm91cC5hZGRTaGFwZSgnY2lyY2xlJywge1xuICAgICAgICBhdHRyczogX19hc3NpZ24oX19hc3NpZ24oe30sIHN0eWxlcyksIHtcbiAgICAgICAgICB4OiB4LFxuICAgICAgICAgIHk6IC15XG4gICAgICAgIH0pLFxuICAgICAgICBjbGFzc05hbWU6ICdsaW5rLXBvaW50LWxlZnQtYm90dG9tJyxcbiAgICAgICAgbmFtZTogJ2xpbmstcG9pbnQtbGVmdC1ib3R0b20nLFxuICAgICAgICBpc0FuY2hvclBvaW50OiB0cnVlXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB4ID0gTWF0aC5jb3MoKDE4ICsgNzIgKiA0KSAvIDE4MCAqIE1hdGguUEkpICogb3V0ZXJSO1xuICAgIHkgPSBNYXRoLnNpbigoMTggKyA3MiAqIDQpIC8gMTgwICogTWF0aC5QSSkgKiBvdXRlclI7XG5cbiAgICBpZiAobWFya1JpZ2h0Qm90dG9tKSB7XG4gICAgICBpZiAoIXJpZ2h0Qm90dG9tICYmIHJpZ2h0Qm90dG9tICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbWFya0xlZnRCb3R0b20ucmVtb3ZlKCk7XG4gICAgICAgIGRlbGV0ZSBncm91cFsnc2hhcGVNYXAnXVsnbGluay1wb2ludC1yaWdodC1ib3R0b20nXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1hcmtSaWdodEJvdHRvbS5hdHRyKF9fYXNzaWduKF9fYXNzaWduKHt9LCBzdHlsZXMpLCB7XG4gICAgICAgICAgeDogeCxcbiAgICAgICAgICB5OiAteVxuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChyaWdodEJvdHRvbSkge1xuICAgICAgZ3JvdXBbJ3NoYXBlTWFwJ11bJ2xpbmstcG9pbnQtcmlnaHQtYm90dG9tJ10gPSBncm91cC5hZGRTaGFwZSgnY2lyY2xlJywge1xuICAgICAgICBhdHRyczogX19hc3NpZ24oX19hc3NpZ24oe30sIHN0eWxlcyksIHtcbiAgICAgICAgICB4OiB4LFxuICAgICAgICAgIHk6IC15XG4gICAgICAgIH0pLFxuICAgICAgICBjbGFzc05hbWU6ICdsaW5rLXBvaW50LXJpZ2h0LWJvdHRvbScsXG4gICAgICAgIG5hbWU6ICdsaW5rLXBvaW50LXJpZ2h0LWJvdHRvbScsXG4gICAgICAgIGlzQW5jaG9yUG9pbnQ6IHRydWVcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufSwgJ3NpbmdsZS1ub2RlJyk7IiwiaW1wb3J0IHsgX19hc3NpZ24gfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IHJlZ2lzdGVyTm9kZSwgQmFzZUdsb2JhbCBhcyBHbG9iYWwsIFV0aWwgfSBmcm9tICdAYW50di9nNi1jb3JlJztcbmltcG9ydCB7IGRlZXBNaXgsIGlzTnVtYmVyIH0gZnJvbSAnQGFudHYvdXRpbCc7XG52YXIgZGVmYXVsdFN1YmplY3RDb2xvcnMgPSBVdGlsLmRlZmF1bHRTdWJqZWN0Q29sb3JzOyAvLyDppbzlm77oioLngrlcblxucmVnaXN0ZXJOb2RlKCdkb251dCcsIHtcbiAgLy8g6Ieq5a6a5LmJ6IqC54K55pe255qE6YWN572uXG4gIG9wdGlvbnM6IHtcbiAgICBzaXplOiBHbG9iYWwuZGVmYXVsdE5vZGUuc2l6ZSxcbiAgICBzdHlsZToge1xuICAgICAgeDogMCxcbiAgICAgIHk6IDAsXG4gICAgICBzdHJva2U6IEdsb2JhbC5kZWZhdWx0Tm9kZS5zdHlsZS5zdHJva2UsXG4gICAgICBmaWxsOiBHbG9iYWwuZGVmYXVsdE5vZGUuc3R5bGUuZmlsbCxcbiAgICAgIGxpbmVXaWR0aDogR2xvYmFsLmRlZmF1bHROb2RlLnN0eWxlLmxpbmVXaWR0aFxuICAgIH0sXG4gICAgbGFiZWxDZmc6IHtcbiAgICAgIHN0eWxlOiB7XG4gICAgICAgIGZpbGw6IEdsb2JhbC5ub2RlTGFiZWwuc3R5bGUuZmlsbCxcbiAgICAgICAgZm9udFNpemU6IEdsb2JhbC5ub2RlTGFiZWwuc3R5bGUuZm9udFNpemUsXG4gICAgICAgIGZvbnRGYW1pbHk6IEdsb2JhbC53aW5kb3dGb250RmFtaWx5XG4gICAgICB9XG4gICAgfSxcbiAgICAvLyDoioLngrnkuIrlt6blj7PkuIrkuIvlm5vkuKrmlrnlkJHkuIrnmoTpk77mjqVjaXJjbGXphY3nva5cbiAgICBsaW5rUG9pbnRzOiB7XG4gICAgICB0b3A6IGZhbHNlLFxuICAgICAgcmlnaHQ6IGZhbHNlLFxuICAgICAgYm90dG9tOiBmYWxzZSxcbiAgICAgIGxlZnQ6IGZhbHNlLFxuICAgICAgLy8gY2lyY2xl55qE5aSn5bCPXG4gICAgICBzaXplOiBHbG9iYWwuZGVmYXVsdE5vZGUubGlua1BvaW50cy5zaXplLFxuICAgICAgbGluZVdpZHRoOiBHbG9iYWwuZGVmYXVsdE5vZGUubGlua1BvaW50cy5saW5lV2lkdGgsXG4gICAgICBmaWxsOiBHbG9iYWwuZGVmYXVsdE5vZGUubGlua1BvaW50cy5maWxsLFxuICAgICAgc3Ryb2tlOiBHbG9iYWwuZGVmYXVsdE5vZGUubGlua1BvaW50cy5zdHJva2VcbiAgICB9LFxuICAgIC8vIOiKgueCueS4rWljb27phY3nva5cbiAgICBpY29uOiB7XG4gICAgICAvLyDmmK/lkKbmmL7npLppY29u77yM5YC85Li6IGZhbHNlIOWImeS4jea4suafk2ljb25cbiAgICAgIHNob3c6IGZhbHNlLFxuICAgICAgLy8gaWNvbueahOWcsOWdgO+8jOWtl+espuS4suexu+Wei1xuICAgICAgaW1nOiAnaHR0cHM6Ly9ndy5hbGlwYXlvYmplY3RzLmNvbS96b3MvYm13LXByb2QvNWQwMTUwNjUtODUwNS00ZTdhLWJhZWMtOTc2ZjgxZTNjNDFkLnN2ZycsXG4gICAgICB3aWR0aDogMjAsXG4gICAgICBoZWlnaHQ6IDIwXG4gICAgfSxcbiAgICBzdGF0ZVN0eWxlczogX19hc3NpZ24oe30sIEdsb2JhbC5ub2RlU3RhdGVTdHlsZXMpXG4gIH0sXG4gIHNoYXBlVHlwZTogJ2NpcmNsZScsXG4gIC8vIOaWh+acrOS9jee9rlxuICBsYWJlbFBvc2l0aW9uOiAnY2VudGVyJyxcbiAgZHJhd1NoYXBlOiBmdW5jdGlvbiBkcmF3U2hhcGUoY2ZnLCBncm91cCkge1xuICAgIHZhciBfYSA9ICh0aGlzLm1lcmdlU3R5bGUgfHwgdGhpcy5nZXRPcHRpb25zKGNmZykpLmljb24sXG4gICAgICAgIGRlZmF1bHRJY29uID0gX2EgPT09IHZvaWQgMCA/IHt9IDogX2E7XG4gICAgdmFyIHN0eWxlID0gdGhpcy5nZXRTaGFwZVN0eWxlKGNmZyk7XG4gICAgdmFyIGljb24gPSBkZWVwTWl4KHt9LCBkZWZhdWx0SWNvbiwgY2ZnLmljb24pO1xuICAgIHZhciBrZXlTaGFwZSA9IGdyb3VwLmFkZFNoYXBlKCdjaXJjbGUnLCB7XG4gICAgICBhdHRyczogc3R5bGUsXG4gICAgICBjbGFzc05hbWU6IHRoaXMudHlwZSArIFwiLWtleVNoYXBlXCIsXG4gICAgICBkcmFnZ2FibGU6IHRydWUsXG4gICAgICBuYW1lOiB0aGlzLnR5cGUgKyBcIi1rZXlTaGFwZVwiXG4gICAgfSk7XG4gICAgZ3JvdXBbJ3NoYXBlTWFwJ11bdGhpcy50eXBlICsgXCIta2V5U2hhcGVcIl0gPSBrZXlTaGFwZTtcbiAgICB2YXIgd2lkdGggPSBpY29uLndpZHRoLFxuICAgICAgICBoZWlnaHQgPSBpY29uLmhlaWdodCxcbiAgICAgICAgc2hvdyA9IGljb24uc2hvdyxcbiAgICAgICAgdGV4dCA9IGljb24udGV4dDtcblxuICAgIGlmIChzaG93KSB7XG4gICAgICBpZiAodGV4dCkge1xuICAgICAgICBncm91cFsnc2hhcGVNYXAnXVt0aGlzLnR5cGUgKyBcIi1pY29uXCJdID0gZ3JvdXAuYWRkU2hhcGUoJ3RleHQnLCB7XG4gICAgICAgICAgYXR0cnM6IF9fYXNzaWduKHtcbiAgICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgICB5OiAwLFxuICAgICAgICAgICAgZm9udFNpemU6IDEyLFxuICAgICAgICAgICAgZmlsbDogJyMwMDAnLFxuICAgICAgICAgICAgc3Ryb2tlOiAnIzAwMCcsXG4gICAgICAgICAgICB0ZXh0QmFzZWxpbmU6ICdtaWRkbGUnLFxuICAgICAgICAgICAgdGV4dEFsaWduOiAnY2VudGVyJ1xuICAgICAgICAgIH0sIGljb24pLFxuICAgICAgICAgIGNsYXNzTmFtZTogdGhpcy50eXBlICsgXCItaWNvblwiLFxuICAgICAgICAgIG5hbWU6IHRoaXMudHlwZSArIFwiLWljb25cIixcbiAgICAgICAgICBkcmFnZ2FibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBncm91cFsnc2hhcGVNYXAnXVt0aGlzLnR5cGUgKyBcIi1pY29uXCJdID0gZ3JvdXAuYWRkU2hhcGUoJ2ltYWdlJywge1xuICAgICAgICAgIGF0dHJzOiBfX2Fzc2lnbih7XG4gICAgICAgICAgICB4OiAtd2lkdGggLyAyLFxuICAgICAgICAgICAgeTogLWhlaWdodCAvIDJcbiAgICAgICAgICB9LCBpY29uKSxcbiAgICAgICAgICBjbGFzc05hbWU6IHRoaXMudHlwZSArIFwiLWljb25cIixcbiAgICAgICAgICBuYW1lOiB0aGlzLnR5cGUgKyBcIi1pY29uXCIsXG4gICAgICAgICAgZHJhZ2dhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBkb251dFIgPSBrZXlTaGFwZS5hdHRyKCdyJyk7XG4gICAgdmFyIGlubmVyUiA9IDAuNiAqIGRvbnV0UjsgLy8g55Sc55Sc5ZyI55qE5YaF546v5Y2K5b6EXG5cbiAgICB2YXIgYXJjUiA9IChkb251dFIgKyBpbm5lclIpIC8gMjsgLy8g5YaF546v5Y2K5b6E5LiO5aSW546v5Y2K5b6E55qE5bmz5Z2H5YC8XG5cbiAgICB2YXIgX2IgPSBjZmcsXG4gICAgICAgIF9jID0gX2IuZG9udXRBdHRycyxcbiAgICAgICAgZG9udXRBdHRycyA9IF9jID09PSB2b2lkIDAgPyB7fSA6IF9jLFxuICAgICAgICBfZCA9IF9iLmRvbnV0Q29sb3JNYXAsXG4gICAgICAgIGRvbnV0Q29sb3JNYXAgPSBfZCA9PT0gdm9pZCAwID8ge30gOiBfZDtcbiAgICB2YXIgYXR0ck51bSA9IE9iamVjdC5rZXlzKGRvbnV0QXR0cnMpLmxlbmd0aDtcblxuICAgIGlmIChkb251dEF0dHJzICYmIGF0dHJOdW0gPiAxKSB7XG4gICAgICB2YXIgYXR0cnNfMSA9IFtdO1xuICAgICAgdmFyIHRvdGFsVmFsdWVfMSA9IDA7XG4gICAgICBPYmplY3Qua2V5cyhkb251dEF0dHJzKS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGRvbnV0QXR0cnNbbmFtZV0gfHwgMDtcbiAgICAgICAgaWYgKCFpc051bWJlcih2YWx1ZSkpIHJldHVybjtcbiAgICAgICAgYXR0cnNfMS5wdXNoKHtcbiAgICAgICAgICBrZXk6IG5hbWUsXG4gICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgIGNvbG9yOiBkb251dENvbG9yTWFwW25hbWVdXG4gICAgICAgIH0pO1xuICAgICAgICB0b3RhbFZhbHVlXzEgKz0gdmFsdWU7XG4gICAgICB9KTtcblxuICAgICAgaWYgKHRvdGFsVmFsdWVfMSkge1xuICAgICAgICB2YXIgbGluZVdpZHRoXzEgPSBkb251dFIgLSBpbm5lclI7XG5cbiAgICAgICAgaWYgKGF0dHJOdW0gPT09IDEpIHtcbiAgICAgICAgICBncm91cFsnc2hhcGVNYXAnXVsnZmFuLXNoYXBlLTAnXSA9IGdyb3VwLmFkZFNoYXBlKCdjaXJjbGUnLCB7XG4gICAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgICByOiBhcmNSLFxuICAgICAgICAgICAgICB4OiAwLFxuICAgICAgICAgICAgICB5OiAwLFxuICAgICAgICAgICAgICBzdHJva2U6IGF0dHJzXzFbMF0uY29sb3IgfHwgZGVmYXVsdFN1YmplY3RDb2xvcnNbMF0sXG4gICAgICAgICAgICAgIGxpbmVXaWR0aDogbGluZVdpZHRoXzFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBuYW1lOiBcImZhbi1zaGFwZS0wXCJcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgYXJjQmVnaW5fMSA9IFthcmNSLCAwXTtcbiAgICAgICAgdmFyIGJlZ2luQW5nbGVfMSA9IDA7XG4gICAgICAgIGF0dHJzXzEuZm9yRWFjaChmdW5jdGlvbiAoYXR0ciwgaSkge1xuICAgICAgICAgIHZhciBwZXJjZW50ID0gYXR0ci52YWx1ZSAvIHRvdGFsVmFsdWVfMTtcbiAgICAgICAgICBpZiAocGVyY2VudCA8IDAuMDAxKSByZXR1cm47XG4gICAgICAgICAgaWYgKHBlcmNlbnQgPiAwLjk5OSkgcGVyY2VudCA9IDE7XG5cbiAgICAgICAgICBpZiAocGVyY2VudCA9PT0gMSkge1xuICAgICAgICAgICAgZ3JvdXBbJ3NoYXBlTWFwJ11bXCJmYW4tc2hhcGUtXCIgKyBpXSA9IGdyb3VwLmFkZFNoYXBlKCdjaXJjbGUnLCB7XG4gICAgICAgICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgICAgICAgcjogYXJjUixcbiAgICAgICAgICAgICAgICB4OiAwLFxuICAgICAgICAgICAgICAgIHk6IDAsXG4gICAgICAgICAgICAgICAgc3Ryb2tlOiBhdHRyLmNvbG9yIHx8IGRlZmF1bHRTdWJqZWN0Q29sb3JzW2kgJSBkZWZhdWx0U3ViamVjdENvbG9ycy5sZW5ndGhdLFxuICAgICAgICAgICAgICAgIGxpbmVXaWR0aDogbGluZVdpZHRoXzFcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgbmFtZTogXCJmYW4tc2hhcGUtXCIgKyBpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBhdHRyLnBlcmNlbnQgPSBwZXJjZW50O1xuICAgICAgICAgIGF0dHIuYW5nbGUgPSBwZXJjZW50ICogTWF0aC5QSSAqIDI7XG4gICAgICAgICAgYXR0ci5iZWdpbkFnbmxlID0gYmVnaW5BbmdsZV8xO1xuICAgICAgICAgIGJlZ2luQW5nbGVfMSArPSBhdHRyLmFuZ2xlO1xuICAgICAgICAgIGF0dHIuZW5kQW5nbGUgPSBiZWdpbkFuZ2xlXzE7XG4gICAgICAgICAgYXR0ci5hcmNCZWdpbiA9IGFyY0JlZ2luXzE7XG4gICAgICAgICAgYXR0ci5hcmNFbmQgPSBbYXJjUiAqIE1hdGguY29zKGF0dHIuZW5kQW5nbGUpLCAtYXJjUiAqIE1hdGguc2luKGF0dHIuZW5kQW5nbGUpXTtcbiAgICAgICAgICB2YXIgaXNCaWcgPSBhdHRyLmFuZ2xlID4gTWF0aC5QSSA/IDEgOiAwO1xuICAgICAgICAgIHZhciBwYXRoID0gW1snTScsIGF0dHIuYXJjQmVnaW5bMF0sIGF0dHIuYXJjQmVnaW5bMV1dLCBbJ0EnLCBhcmNSLCBhcmNSLCAwLCBpc0JpZywgMCwgYXR0ci5hcmNFbmRbMF0sIGF0dHIuYXJjRW5kWzFdXSwgWydMJywgYXR0ci5hcmNFbmRbMF0sIGF0dHIuYXJjRW5kWzFdXV07XG4gICAgICAgICAgZ3JvdXBbJ3NoYXBlTWFwJ11bXCJmYW4tc2hhcGUtXCIgKyBpXSA9IGdyb3VwLmFkZFNoYXBlKCdwYXRoJywge1xuICAgICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgICAgcGF0aDogcGF0aCxcbiAgICAgICAgICAgICAgbGluZVdpZHRoOiBsaW5lV2lkdGhfMSxcbiAgICAgICAgICAgICAgc3Ryb2tlOiBhdHRyLmNvbG9yIHx8IGRlZmF1bHRTdWJqZWN0Q29sb3JzW2kgJSBkZWZhdWx0U3ViamVjdENvbG9ycy5sZW5ndGhdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmFtZTogXCJmYW4tc2hhcGUtXCIgKyBpXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYXJjQmVnaW5fMSA9IGF0dHIuYXJjRW5kO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmRyYXdMaW5rUG9pbnRzKGNmZywgZ3JvdXApO1xuICAgIHJldHVybiBrZXlTaGFwZTtcbiAgfSxcbiAgdXBkYXRlOiB1bmRlZmluZWRcbn0sICdjaXJjbGUnKTsiLCJpbXBvcnQgJy4vY2lyY2xlJztcbmltcG9ydCAnLi9yZWN0JztcbmltcG9ydCAnLi9lbGxpcHNlJztcbmltcG9ydCAnLi9kaWFtb25kJztcbmltcG9ydCAnLi90cmlhbmdsZSc7XG5pbXBvcnQgJy4vbW9kZWxSZWN0JztcbmltcG9ydCAnLi9zdGFyJztcbmltcG9ydCAnLi9kb251dCc7IC8vIGltcG9ydCAnLi9pbWFnZSc7IiwiZXhwb3J0IHZhciBnZXRCQm94RnJvbVBvaW50ID0gZnVuY3Rpb24gZ2V0QkJveEZyb21Qb2ludChwb2ludCkge1xuICB2YXIgeCA9IHBvaW50LngsXG4gICAgICB5ID0gcG9pbnQueTtcbiAgcmV0dXJuIHtcbiAgICB4OiB4LFxuICAgIHk6IHksXG4gICAgY2VudGVyWDogeCxcbiAgICBjZW50ZXJZOiB5LFxuICAgIG1pblg6IHgsXG4gICAgbWluWTogeSxcbiAgICBtYXhYOiB4LFxuICAgIG1heFk6IHksXG4gICAgaGVpZ2h0OiAwLFxuICAgIHdpZHRoOiAwXG4gIH07XG59O1xuZXhwb3J0IHZhciBnZXRCQm94RnJvbVBvaW50cyA9IGZ1bmN0aW9uIGdldEJCb3hGcm9tUG9pbnRzKHBvaW50cykge1xuICBpZiAocG9pbnRzID09PSB2b2lkIDApIHtcbiAgICBwb2ludHMgPSBbXTtcbiAgfVxuXG4gIHZhciB4cyA9IFtdO1xuICB2YXIgeXMgPSBbXTtcbiAgcG9pbnRzLmZvckVhY2goZnVuY3Rpb24gKHApIHtcbiAgICB4cy5wdXNoKHAueCk7XG4gICAgeXMucHVzaChwLnkpO1xuICB9KTtcbiAgdmFyIG1pblggPSBNYXRoLm1pbi5hcHBseShNYXRoLCB4cyk7XG4gIHZhciBtYXhYID0gTWF0aC5tYXguYXBwbHkoTWF0aCwgeHMpO1xuICB2YXIgbWluWSA9IE1hdGgubWluLmFwcGx5KE1hdGgsIHlzKTtcbiAgdmFyIG1heFkgPSBNYXRoLm1heC5hcHBseShNYXRoLCB5cyk7XG4gIHJldHVybiB7XG4gICAgY2VudGVyWDogKG1pblggKyBtYXhYKSAvIDIsXG4gICAgY2VudGVyWTogKG1pblkgKyBtYXhZKSAvIDIsXG4gICAgbWF4WDogbWF4WCxcbiAgICBtYXhZOiBtYXhZLFxuICAgIG1pblg6IG1pblgsXG4gICAgbWluWTogbWluWSxcbiAgICBoZWlnaHQ6IG1heFkgLSBtaW5ZLFxuICAgIHdpZHRoOiBtYXhYIC0gbWluWFxuICB9O1xufTtcbmV4cG9ydCB2YXIgaXNCQm94ZXNPdmVybGFwcGluZyA9IGZ1bmN0aW9uIGlzQkJveGVzT3ZlcmxhcHBpbmcoYjEsIGIyKSB7XG4gIHJldHVybiBNYXRoLmFicyhiMS5jZW50ZXJYIC0gYjIuY2VudGVyWCkgKiAyIDwgYjEud2lkdGggKyBiMi53aWR0aCAmJiBNYXRoLmFicyhiMS5jZW50ZXJZIC0gYjIuY2VudGVyWSkgKiAyIDwgYjEuaGVpZ2h0ICsgYjIuaGVpZ2h0O1xufTtcbmV4cG9ydCB2YXIgZmlsdGVyQ29ubmVjdFBvaW50cyA9IGZ1bmN0aW9uIGZpbHRlckNvbm5lY3RQb2ludHMocG9pbnRzKSB7XG4gIC8vIHByZS1wcm9jZXNzOiByZW1vdmUgZHVwbGljYXRlZCBwb2ludHNcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICB2YXIgcG9pbnRzTWFwID0ge307XG4gIHZhciBwb2ludHNMZW5ndGggPSBwb2ludHMubGVuZ3RoO1xuXG4gIGZvciAodmFyIGkgPSBwb2ludHNMZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIHZhciBwID0gcG9pbnRzW2ldO1xuICAgIHAuaWQgPSBwLnggKyBcInx8fFwiICsgcC55O1xuICAgIHBvaW50c01hcFtwLmlkXSA9IHA7XG4gICAgcmVzdWx0LnB1c2gocCk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufTtcbmV4cG9ydCB2YXIgc2ltcGxpZnlQb2x5bGluZSA9IGZ1bmN0aW9uIHNpbXBsaWZ5UG9seWxpbmUocG9pbnRzKSB7XG4gIHJldHVybiBmaWx0ZXJDb25uZWN0UG9pbnRzKHBvaW50cyk7XG59O1xuZXhwb3J0IHZhciBnZXRTaW1wbGVQb2x5bGluZSA9IGZ1bmN0aW9uIGdldFNpbXBsZVBvbHlsaW5lKHNQb2ludCwgdFBvaW50KSB7XG4gIHJldHVybiBbc1BvaW50LCB7XG4gICAgeDogc1BvaW50LngsXG4gICAgeTogdFBvaW50LnlcbiAgfSwgdFBvaW50XTtcbn07XG5leHBvcnQgdmFyIGdldEV4cGFuZGVkQkJveCA9IGZ1bmN0aW9uIGdldEV4cGFuZGVkQkJveChiYm94LCBvZmZzZXQpIHtcbiAgaWYgKGJib3gud2lkdGggfHwgYmJveC5oZWlnaHQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY2VudGVyWDogYmJveC5jZW50ZXJYLFxuICAgICAgY2VudGVyWTogYmJveC5jZW50ZXJZLFxuICAgICAgbWluWDogYmJveC5taW5YIC0gb2Zmc2V0LFxuICAgICAgbWluWTogYmJveC5taW5ZIC0gb2Zmc2V0LFxuICAgICAgbWF4WDogYmJveC5tYXhYICsgb2Zmc2V0LFxuICAgICAgbWF4WTogYmJveC5tYXhZICsgb2Zmc2V0LFxuICAgICAgaGVpZ2h0OiBiYm94LmhlaWdodCArIDIgKiBvZmZzZXQsXG4gICAgICB3aWR0aDogYmJveC53aWR0aCArIDIgKiBvZmZzZXRcbiAgICB9O1xuICB9IC8vIHdoZW4gaXQgaXMgYSBwb2ludFxuXG5cbiAgcmV0dXJuIGJib3g7XG59O1xuZXhwb3J0IHZhciBpc0hvcml6b250YWxQb3J0ID0gZnVuY3Rpb24gaXNIb3Jpem9udGFsUG9ydChwb3J0LCBiYm94KSB7XG4gIHZhciBkeCA9IE1hdGguYWJzKHBvcnQueCAtIGJib3guY2VudGVyWCk7XG4gIHZhciBkeSA9IE1hdGguYWJzKHBvcnQueSAtIGJib3guY2VudGVyWSk7XG4gIGlmIChkeCA9PT0gMCAmJiBkeSA9PT0gMCkgcmV0dXJuIDA7XG4gIHJldHVybiBkeCAvIGJib3gud2lkdGggPiBkeSAvIGJib3guaGVpZ2h0O1xufTtcbmV4cG9ydCB2YXIgZ2V0RXhwYW5kZWRCQm94UG9pbnQgPSBmdW5jdGlvbiBnZXRFeHBhbmRlZEJCb3hQb2ludChiYm94LCAvLyDlsIbljp/mnaXoioLngrkgYmJveCDmianlsZXkuoYgb2Zmc2V0IOWQjueahCBiYm9477yM5LiU6KKrIGdyaWRTaXplIOagvOW8j+WMllxucG9pbnQsIC8vIOiiqyBncmlkU2l6ZSDmoLzlvI/ljJblkI7nmoTkvY3nva7vvIhhbmNob3JQb2ludO+8iVxuYW5vdGhlclBvaW50KSB7XG4gIHZhciBpc0hvcml6b250YWwgPSBpc0hvcml6b250YWxQb3J0KHBvaW50LCBiYm94KTtcblxuICBpZiAoaXNIb3Jpem9udGFsID09PSAwKSB7XG4gICAgLy8g6K+05piO6ZSa54K55piv6IqC54K55Lit5b+D77yMbGlua0NlbnRlcjogdHJ1ZeOAgumcgOimgeagueaNruS4pOS4quiKgueCueeahOebuOWvueWFs+ezu+WGs+WumuaWueWQkVxuICAgIHZhciB4ID0gYmJveC5jZW50ZXJYO1xuICAgIHZhciB5ID0gYmJveC5jZW50ZXJZO1xuXG4gICAgaWYgKGFub3RoZXJQb2ludC55IDwgcG9pbnQueSkge1xuICAgICAgLy8g5Y+m5LiA56uv5Zyo5bem5LiKL+WPs+S4iuaWueaXtu+8jOaAu+aYr+S7juS4iuaWuei1sFxuICAgICAgeSA9IGJib3gubWluWTtcbiAgICB9IGVsc2UgaWYgKGFub3RoZXJQb2ludC54ID4gcG9pbnQueCkge1xuICAgICAgLy8g5Y+m5LiA56uv5Zyo5Y+z5LiL5pa577yM5b6A5Y+z6L656LWwXG4gICAgICB4ID0gYmJveC5tYXhYO1xuICAgIH0gZWxzZSBpZiAoYW5vdGhlclBvaW50LnggPCBwb2ludC54KSB7XG4gICAgICAvLyDlj6bkuIDnq6/lnKjlt6bkuIvmlrnvvIzlvoDlt6bovrnotbBcbiAgICAgIHggPSBiYm94Lm1pblg7XG4gICAgfSBlbHNlIGlmIChhbm90aGVyUG9pbnQueCA9PT0gcG9pbnQueCkge1xuICAgICAgLy8g5Y+m5LiA5q615Zyo5q2j5LiL5pa577yM5b6A5LiL6LWwXG4gICAgICB5ID0gYmJveC5tYXhZO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB4OiB4LFxuICAgICAgeTogeVxuICAgIH07XG4gIH1cblxuICBpZiAoaXNIb3Jpem9udGFsKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IHBvaW50LnggPiBiYm94LmNlbnRlclggPyBiYm94Lm1heFggOiBiYm94Lm1pblgsXG4gICAgICB5OiBwb2ludC55XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgeDogcG9pbnQueCxcbiAgICB5OiBwb2ludC55ID4gYmJveC5jZW50ZXJZID8gYmJveC5tYXhZIDogYmJveC5taW5ZXG4gIH07XG59O1xuLyoqXG4gKlxuICogQHBhcmFtIGIxXG4gKiBAcGFyYW0gYjJcbiAqL1xuXG5leHBvcnQgdmFyIG1lcmdlQkJveCA9IGZ1bmN0aW9uIG1lcmdlQkJveChiMSwgYjIpIHtcbiAgdmFyIG1pblggPSBNYXRoLm1pbihiMS5taW5YLCBiMi5taW5YKTtcbiAgdmFyIG1pblkgPSBNYXRoLm1pbihiMS5taW5ZLCBiMi5taW5ZKTtcbiAgdmFyIG1heFggPSBNYXRoLm1heChiMS5tYXhYLCBiMi5tYXhYKTtcbiAgdmFyIG1heFkgPSBNYXRoLm1heChiMS5tYXhZLCBiMi5tYXhZKTtcbiAgcmV0dXJuIHtcbiAgICBjZW50ZXJYOiAobWluWCArIG1heFgpIC8gMixcbiAgICBjZW50ZXJZOiAobWluWSArIG1heFkpIC8gMixcbiAgICBtaW5YOiBtaW5YLFxuICAgIG1pblk6IG1pblksXG4gICAgbWF4WDogbWF4WCxcbiAgICBtYXhZOiBtYXhZLFxuICAgIGhlaWdodDogbWF4WSAtIG1pblksXG4gICAgd2lkdGg6IG1heFggLSBtaW5YXG4gIH07XG59O1xuZXhwb3J0IHZhciBnZXRQb2ludHNGcm9tQkJveCA9IGZ1bmN0aW9uIGdldFBvaW50c0Zyb21CQm94KGJib3gpIHtcbiAgLy8gYW50aWNsb2Nrd2lzZVxuICAvLyBjb25zdCB7IG1pblgsIG1pblksIG1heFgsIG1heFkgfSA9IGJib3g7XG4gIHJldHVybiBbe1xuICAgIHg6IGJib3gubWluWCxcbiAgICB5OiBiYm94Lm1pbllcbiAgfSwge1xuICAgIHg6IGJib3gubWF4WCxcbiAgICB5OiBiYm94Lm1pbllcbiAgfSwge1xuICAgIHg6IGJib3gubWF4WCxcbiAgICB5OiBiYm94Lm1heFlcbiAgfSwge1xuICAgIHg6IGJib3gubWluWCxcbiAgICB5OiBiYm94Lm1heFlcbiAgfV07XG59O1xuZXhwb3J0IHZhciBpc1BvaW50T3V0c2lkZUJCb3ggPSBmdW5jdGlvbiBpc1BvaW50T3V0c2lkZUJCb3gocG9pbnQsIGJib3gpIHtcbiAgdmFyIHggPSBwb2ludC54LFxuICAgICAgeSA9IHBvaW50Lnk7XG4gIHJldHVybiB4IDwgYmJveC5taW5YIHx8IHggPiBiYm94Lm1heFggfHwgeSA8IGJib3gubWluWSB8fCB5ID4gYmJveC5tYXhZO1xufTtcbmV4cG9ydCB2YXIgZ2V0QkJveFhDcm9zc1BvaW50cyA9IGZ1bmN0aW9uIGdldEJCb3hYQ3Jvc3NQb2ludHMoYmJveCwgeCkge1xuICBpZiAoeCA8IGJib3gubWluWCB8fCB4ID4gYmJveC5tYXhYKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgcmV0dXJuIFt7XG4gICAgeDogeCxcbiAgICB5OiBiYm94Lm1pbllcbiAgfSwge1xuICAgIHg6IHgsXG4gICAgeTogYmJveC5tYXhZXG4gIH1dO1xufTtcbmV4cG9ydCB2YXIgZ2V0QkJveFlDcm9zc1BvaW50cyA9IGZ1bmN0aW9uIGdldEJCb3hZQ3Jvc3NQb2ludHMoYmJveCwgeSkge1xuICBpZiAoeSA8IGJib3gubWluWSB8fCB5ID4gYmJveC5tYXhZKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgcmV0dXJuIFt7XG4gICAgeDogYmJveC5taW5YLFxuICAgIHk6IHlcbiAgfSwge1xuICAgIHg6IGJib3gubWF4WCxcbiAgICB5OiB5XG4gIH1dO1xufTtcbmV4cG9ydCB2YXIgZ2V0QkJveENyb3NzUG9pbnRzQnlQb2ludCA9IGZ1bmN0aW9uIGdldEJCb3hDcm9zc1BvaW50c0J5UG9pbnQoYmJveCwgcG9pbnQpIHtcbiAgcmV0dXJuIGdldEJCb3hYQ3Jvc3NQb2ludHMoYmJveCwgcG9pbnQueCkuY29uY2F0KGdldEJCb3hZQ3Jvc3NQb2ludHMoYmJveCwgcG9pbnQueSkpO1xufTtcbi8qKlxuICog5pu85ZOI6aG/6Led56a7XG4gKi9cblxuZXhwb3J0IHZhciBkaXN0YW5jZSA9IGZ1bmN0aW9uIGRpc3RhbmNlKHAxLCBwMikge1xuICByZXR1cm4gTWF0aC5hYnMocDEueCAtIHAyLngpICsgTWF0aC5hYnMocDEueSAtIHAyLnkpO1xufTtcbi8qKlxuICog5aaC5p6cIHBvaW50cyDkuK3nmoTkuIDkuKroioLngrkgeCDkuI4gcCDnm7jnrYnvvIzliJnmtojogJcgLTLjgIJ5IOWQjFxuICog5Y2z5LyY5YWI6YCJ5oup5ZKMIHBvaW50cyDlnKjlkIzkuIDmsLTlubPnur8gLyDlnoLnm7Tnur/kuIrnmoTngrlcbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxuXG5leHBvcnQgdmFyIF9jb3N0QnlQb2ludHMgPSBmdW5jdGlvbiBfY29zdEJ5UG9pbnRzKHAsIHBvaW50cykge1xuICB2YXIgb2Zmc2V0ID0gLTI7XG4gIHZhciByZXN1bHQgPSAwO1xuICBwb2ludHMuZm9yRWFjaChmdW5jdGlvbiAocG9pbnQpIHtcbiAgICBpZiAocG9pbnQpIHtcbiAgICAgIGlmIChwLnggPT09IHBvaW50LngpIHtcbiAgICAgICAgcmVzdWx0ICs9IG9mZnNldDtcbiAgICAgIH1cblxuICAgICAgaWYgKHAueSA9PT0gcG9pbnQueSkge1xuICAgICAgICByZXN1bHQgKz0gb2Zmc2V0O1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuLyoqXG4gKiBwcyDnu4/ov4cgcCDliLAgcHQg55qE6Led56a777yM5YeP5Y675YW25LuW6Lev6L+H6IqC54K56YCg5oiQ55qE5raI6ICXXG4gKi9cblxuZXhwb3J0IHZhciBoZXVyaXN0aWNDb3N0RXN0aW1hdGUgPSBmdW5jdGlvbiBoZXVyaXN0aWNDb3N0RXN0aW1hdGUocCwgcHMsIHB0LCBzb3VyY2UsIHRhcmdldCkge1xuICByZXR1cm4gZGlzdGFuY2UocCwgcHMpICsgZGlzdGFuY2UocCwgcHQpICsgX2Nvc3RCeVBvaW50cyhwLCBbcHMsIHB0LCBzb3VyY2UsIHRhcmdldF0pO1xufTtcbmV4cG9ydCB2YXIgcmVjb25zdHJ1Y3RQYXRoID0gZnVuY3Rpb24gcmVjb25zdHJ1Y3RQYXRoKHBhdGhQb2ludHMsIHBvaW50QnlJZCwgY2FtZUZyb20sIGN1cnJlbnRJZCwgaXRlcmF0b3IpIHtcbiAgaWYgKGl0ZXJhdG9yID09PSB2b2lkIDApIHtcbiAgICBpdGVyYXRvciA9IDA7XG4gIH1cblxuICBwYXRoUG9pbnRzLnVuc2hpZnQocG9pbnRCeUlkW2N1cnJlbnRJZF0pO1xuXG4gIGlmIChjYW1lRnJvbVtjdXJyZW50SWRdICYmIGNhbWVGcm9tW2N1cnJlbnRJZF0gIT09IGN1cnJlbnRJZCAmJiBpdGVyYXRvciA8PSAxMDApIHtcbiAgICByZWNvbnN0cnVjdFBhdGgocGF0aFBvaW50cywgcG9pbnRCeUlkLCBjYW1lRnJvbSwgY2FtZUZyb21bY3VycmVudElkXSwgaXRlcmF0b3IgKyAxKTtcbiAgfVxufTtcbi8qKlxuICog5LuOIGFyciDkuK3liKDljrsgaXRlbVxuICovXG5cbmV4cG9ydCB2YXIgcmVtb3ZlRnJvbSA9IGZ1bmN0aW9uIHJlbW92ZUZyb20oYXJyLCBpdGVtKSB7XG4gIHZhciBpbmRleCA9IGFyci5pbmRleE9mKGl0ZW0pO1xuXG4gIGlmIChpbmRleCA+IC0xKSB7XG4gICAgYXJyLnNwbGljZShpbmRleCwgMSk7XG4gIH1cbn07XG5leHBvcnQgdmFyIGlzU2VnbWVudHNJbnRlcnNlY3RlZCA9IGZ1bmN0aW9uIGlzU2VnbWVudHNJbnRlcnNlY3RlZChwMCwgcDEsIHAyLCBwMykge1xuICB2YXIgdjF4ID0gcDIueCAtIHAwLng7XG4gIHZhciB2MXkgPSBwMi55IC0gcDAueTtcbiAgdmFyIHYyeCA9IHAzLnggLSBwMC54O1xuICB2YXIgdjJ5ID0gcDMueSAtIHAwLnk7XG4gIHZhciB2M3ggPSBwMi54IC0gcDEueDtcbiAgdmFyIHYzeSA9IHAyLnkgLSBwMS55O1xuICB2YXIgdjR4ID0gcDMueCAtIHAxLng7XG4gIHZhciB2NHkgPSBwMy55IC0gcDEueTtcbiAgdmFyIHBkMSA9IHYxeCAqIHYyeSAtIHYxeSAqIHYyeDtcbiAgdmFyIHBkMiA9IHYzeCAqIHY0eSAtIHYzeSAqIHY0eDtcbiAgdmFyIHBkMyA9IHYxeCAqIHYzeSAtIHYxeSAqIHYzeDtcbiAgdmFyIHBkNCA9IHYyeCAqIHY0eSAtIHYyeSAqIHY0eDtcbiAgcmV0dXJuIHBkMSAqIHBkMiA8PSAwICYmIHBkMyAqIHBkNCA8PSAwO1xufTtcbmV4cG9ydCB2YXIgaXNTZWdtZW50Q3Jvc3NpbmdCQm94ID0gZnVuY3Rpb24gaXNTZWdtZW50Q3Jvc3NpbmdCQm94KHAxLCBwMiwgYmJveCkge1xuICBpZiAoYmJveC53aWR0aCB8fCBiYm94LmhlaWdodCkge1xuICAgIHZhciBfYSA9IGdldFBvaW50c0Zyb21CQm94KGJib3gpLFxuICAgICAgICBwYSA9IF9hWzBdLFxuICAgICAgICBwYiA9IF9hWzFdLFxuICAgICAgICBwYyA9IF9hWzJdLFxuICAgICAgICBwZCA9IF9hWzNdO1xuXG4gICAgcmV0dXJuIGlzU2VnbWVudHNJbnRlcnNlY3RlZChwMSwgcDIsIHBhLCBwYikgfHwgaXNTZWdtZW50c0ludGVyc2VjdGVkKHAxLCBwMiwgcGEsIHBkKSB8fCBpc1NlZ21lbnRzSW50ZXJzZWN0ZWQocDEsIHAyLCBwYiwgcGMpIHx8IGlzU2VnbWVudHNJbnRlcnNlY3RlZChwMSwgcDIsIHBjLCBwZCk7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59O1xuLyoqXG4gKiDlnKggcG9pbnRzIOS4reaJvuWIsOa7oei2syB4IOaIliB5IOWSjCBwb2ludCDnmoQgeCDmiJYgeSDnm7jnrYnvvIzkuJTkuI4gcG9pbnQg6L+e57q/5LiN57uP6L+HIGJib3gxIOS4jiBiYm94MiDnmoTngrlcbiAqL1xuXG5leHBvcnQgdmFyIGdldE5laWdoYm9yUG9pbnRzID0gZnVuY3Rpb24gZ2V0TmVpZ2hib3JQb2ludHMocG9pbnRzLCBwb2ludCwgYmJveDEsIGJib3gyKSB7XG4gIHZhciBuZWlnaGJvcnMgPSBbXTtcbiAgcG9pbnRzLmZvckVhY2goZnVuY3Rpb24gKHApIHtcbiAgICBpZiAocCA9PT0gcG9pbnQpIHJldHVybjtcblxuICAgIGlmIChwLnggPT09IHBvaW50LnggfHwgcC55ID09PSBwb2ludC55KSB7XG4gICAgICBpZiAoaXNTZWdtZW50Q3Jvc3NpbmdCQm94KHAsIHBvaW50LCBiYm94MSkgfHwgaXNTZWdtZW50Q3Jvc3NpbmdCQm94KHAsIHBvaW50LCBiYm94MikpIHJldHVybjtcbiAgICAgIG5laWdoYm9ycy5wdXNoKHApO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBmaWx0ZXJDb25uZWN0UG9pbnRzKG5laWdoYm9ycyk7XG59O1xuZXhwb3J0IHZhciBwYXRoRmluZGVyID0gZnVuY3Rpb24gcGF0aEZpbmRlcihwb2ludHMsIHN0YXJ0LCBnb2FsLCBzQkJveCwgdEJCb3gsIG9zLCBvdCkge1xuICAvLyBBLVN0YXIgQWxnb3JpdGhtXG4gIHZhciBjbG9zZWRTZXQgPSBbXTtcbiAgdmFyIG9wZW5TZXQgPSBbc3RhcnRdO1xuICB2YXIgY2FtZUZyb20gPSB7fTtcbiAgdmFyIGdTY29yZSA9IHt9OyAvLyBhbGwgZGVmYXVsdCB2YWx1ZXMgYXJlIEluZmluaXR5XG5cbiAgdmFyIGZTY29yZSA9IHt9OyAvLyBhbGwgZGVmYXVsdCB2YWx1ZXMgYXJlIEluZmluaXR5XG5cbiAgZ1Njb3JlW3N0YXJ0LmlkXSA9IDA7XG4gIGZTY29yZVtzdGFydC5pZF0gPSBoZXVyaXN0aWNDb3N0RXN0aW1hdGUoc3RhcnQsIGdvYWwsIHN0YXJ0KTtcbiAgdmFyIHBvaW50QnlJZCA9IHt9O1xuICBwb2ludHMuZm9yRWFjaChmdW5jdGlvbiAocCkge1xuICAgIHBvaW50QnlJZFtwLmlkXSA9IHA7XG4gIH0pO1xuICB2YXIgY3VycmVudCwgbG93ZXN0RlNjb3JlO1xuXG4gIHdoaWxlIChvcGVuU2V0Lmxlbmd0aCkge1xuICAgIGN1cnJlbnQgPSB1bmRlZmluZWQ7XG4gICAgbG93ZXN0RlNjb3JlID0gSW5maW5pdHk7IC8vIOaJvuWIsCBvcGVuU2V0IOS4rSBmU2NvcmUg5pyA5bCP55qE54K5XG5cbiAgICBvcGVuU2V0LmZvckVhY2goZnVuY3Rpb24gKHApIHtcbiAgICAgIGlmIChmU2NvcmVbcC5pZF0gPD0gbG93ZXN0RlNjb3JlKSB7XG4gICAgICAgIGxvd2VzdEZTY29yZSA9IGZTY29yZVtwLmlkXTtcbiAgICAgICAgY3VycmVudCA9IHA7XG4gICAgICB9XG4gICAgfSk7IC8vIOiLpSBvcGVuU2V0IOS4rSBmU2NvcmUg5pyA5bCP55qE54K55bCx5piv57uI54K5XG5cbiAgICBpZiAoY3VycmVudCA9PT0gZ29hbCkge1xuICAgICAgLy8gZW5kaW5nIGNvbmRpdGlvblxuICAgICAgdmFyIHBhdGhQb2ludHMgPSBbXTtcbiAgICAgIHJlY29uc3RydWN0UGF0aChwYXRoUG9pbnRzLCBwb2ludEJ5SWQsIGNhbWVGcm9tLCBnb2FsLmlkKTtcbiAgICAgIHJldHVybiBwYXRoUG9pbnRzO1xuICAgIH1cblxuICAgIHJlbW92ZUZyb20ob3BlblNldCwgY3VycmVudCk7XG4gICAgY2xvc2VkU2V0LnB1c2goY3VycmVudCk7XG4gICAgZ2V0TmVpZ2hib3JQb2ludHMocG9pbnRzLCBjdXJyZW50LCBzQkJveCwgdEJCb3gpLmZvckVhY2goZnVuY3Rpb24gKG5laWdoYm9yKSB7XG4gICAgICBpZiAoY2xvc2VkU2V0LmluZGV4T2YobmVpZ2hib3IpICE9PSAtMSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChvcGVuU2V0LmluZGV4T2YobmVpZ2hib3IpID09PSAtMSkge1xuICAgICAgICBvcGVuU2V0LnB1c2gobmVpZ2hib3IpO1xuICAgICAgfVxuXG4gICAgICB2YXIgdGVudGF0aXZlR1Njb3JlID0gZlNjb3JlW2N1cnJlbnQuaWRdICsgZGlzdGFuY2UoY3VycmVudCwgbmVpZ2hib3IpOyAvLyArIGRpc3RhbmNlKG5laWdoYm9yLCBnb2FsKTtcblxuICAgICAgaWYgKGdTY29yZVtuZWlnaGJvci5pZF0gJiYgdGVudGF0aXZlR1Njb3JlID49IGdTY29yZVtuZWlnaGJvci5pZF0pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjYW1lRnJvbVtuZWlnaGJvci5pZF0gPSBjdXJyZW50LmlkO1xuICAgICAgZ1Njb3JlW25laWdoYm9yLmlkXSA9IHRlbnRhdGl2ZUdTY29yZTtcbiAgICAgIGZTY29yZVtuZWlnaGJvci5pZF0gPSBnU2NvcmVbbmVpZ2hib3IuaWRdICsgaGV1cmlzdGljQ29zdEVzdGltYXRlKG5laWdoYm9yLCBnb2FsLCBzdGFydCwgb3MsIG90KTtcbiAgICB9KTtcbiAgfSAvLyB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBmaW5kIHBhdGgnKTtcblxuXG4gIHJldHVybiBbc3RhcnQsIGdvYWxdO1xufTtcbmV4cG9ydCB2YXIgaXNCZW5kaW5nID0gZnVuY3Rpb24gaXNCZW5kaW5nKHAwLCBwMSwgcDIpIHtcbiAgcmV0dXJuICEocDAueCA9PT0gcDEueCAmJiBwMS54ID09PSBwMi54IHx8IHAwLnkgPT09IHAxLnkgJiYgcDEueSA9PT0gcDIueSk7XG59O1xuZXhwb3J0IHZhciBnZXRCb3JkZXJSYWRpdXNQb2ludHMgPSBmdW5jdGlvbiBnZXRCb3JkZXJSYWRpdXNQb2ludHMocDAsIHAxLCBwMiwgcikge1xuICB2YXIgZDAgPSBkaXN0YW5jZShwMCwgcDEpO1xuICB2YXIgZDEgPSBkaXN0YW5jZShwMiwgcDEpO1xuXG4gIGlmIChkMCA8IHIpIHtcbiAgICByID0gZDA7XG4gIH1cblxuICBpZiAoZDEgPCByKSB7XG4gICAgciA9IGQxO1xuICB9XG5cbiAgdmFyIHBzID0ge1xuICAgIHg6IHAxLnggLSByIC8gZDAgKiAocDEueCAtIHAwLngpLFxuICAgIHk6IHAxLnkgLSByIC8gZDAgKiAocDEueSAtIHAwLnkpXG4gIH07XG4gIHZhciBwdCA9IHtcbiAgICB4OiBwMS54IC0gciAvIGQxICogKHAxLnggLSBwMi54KSxcbiAgICB5OiBwMS55IC0gciAvIGQxICogKHAxLnkgLSBwMi55KVxuICB9O1xuICByZXR1cm4gW3BzLCBwdF07XG59O1xuZXhwb3J0IHZhciBnZXRQYXRoV2l0aEJvcmRlclJhZGl1c0J5UG9seWxpbmUgPSBmdW5jdGlvbiBnZXRQYXRoV2l0aEJvcmRlclJhZGl1c0J5UG9seWxpbmUocG9pbnRzLCBib3JkZXJSYWRpdXMpIHtcbiAgdmFyIHBhdGhTZWdtZW50cyA9IFtdO1xuICB2YXIgc3RhcnRQb2ludCA9IHBvaW50c1swXTtcbiAgcGF0aFNlZ21lbnRzLnB1c2goXCJNXCIgKyBzdGFydFBvaW50LnggKyBcIiBcIiArIHN0YXJ0UG9pbnQueSk7XG4gIHBvaW50cy5mb3JFYWNoKGZ1bmN0aW9uIChwLCBpKSB7XG4gICAgdmFyIHAxID0gcG9pbnRzW2kgKyAxXTtcbiAgICB2YXIgcDIgPSBwb2ludHNbaSArIDJdO1xuXG4gICAgaWYgKHAxICYmIHAyKSB7XG4gICAgICBpZiAoaXNCZW5kaW5nKHAsIHAxLCBwMikpIHtcbiAgICAgICAgdmFyIF9hID0gZ2V0Qm9yZGVyUmFkaXVzUG9pbnRzKHAsIHAxLCBwMiwgYm9yZGVyUmFkaXVzKSxcbiAgICAgICAgICAgIHBzID0gX2FbMF0sXG4gICAgICAgICAgICBwdCA9IF9hWzFdO1xuXG4gICAgICAgIHBhdGhTZWdtZW50cy5wdXNoKFwiTFwiICsgcHMueCArIFwiIFwiICsgcHMueSk7XG4gICAgICAgIHBhdGhTZWdtZW50cy5wdXNoKFwiUVwiICsgcDEueCArIFwiIFwiICsgcDEueSArIFwiIFwiICsgcHQueCArIFwiIFwiICsgcHQueSk7XG4gICAgICAgIHBhdGhTZWdtZW50cy5wdXNoKFwiTFwiICsgcHQueCArIFwiIFwiICsgcHQueSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYXRoU2VnbWVudHMucHVzaChcIkxcIiArIHAxLnggKyBcIiBcIiArIHAxLnkpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocDEpIHtcbiAgICAgIHBhdGhTZWdtZW50cy5wdXNoKFwiTFwiICsgcDEueCArIFwiIFwiICsgcDEueSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHBhdGhTZWdtZW50cy5qb2luKCcnKTtcbn07XG5leHBvcnQgdmFyIGdldFBvbHlsaW5lUG9pbnRzID0gZnVuY3Rpb24gZ2V0UG9seWxpbmVQb2ludHMoc3RhcnQsIGVuZCwgc05vZGUsIHROb2RlLCBvZmZzZXQpIHtcbiAgdmFyIHNCQm94LCB0QkJveDtcblxuICBpZiAoIXNOb2RlIHx8ICFzTm9kZS5nZXRUeXBlKCkpIHtcbiAgICBzQkJveCA9IGdldEJCb3hGcm9tUG9pbnQoc3RhcnQpO1xuICB9IGVsc2UgaWYgKHNOb2RlLmdldFR5cGUoKSA9PT0gJ2NvbWJvJykge1xuICAgIHZhciBzTm9kZUtleVNoYXBlID0gc05vZGUuZ2V0S2V5U2hhcGUoKTtcbiAgICBzQkJveCA9IHNOb2RlS2V5U2hhcGUuZ2V0Q2FudmFzQkJveCgpIHx8IGdldEJCb3hGcm9tUG9pbnQoc3RhcnQpO1xuICAgIHNCQm94LmNlbnRlclggPSAoc0JCb3gubWluWCArIHNCQm94Lm1heFgpIC8gMjtcbiAgICBzQkJveC5jZW50ZXJZID0gKHNCQm94Lm1pblkgKyBzQkJveC5tYXhZKSAvIDI7XG4gIH0gZWxzZSB7XG4gICAgc0JCb3ggPSBzTm9kZS5nZXRCQm94KCk7XG4gIH1cblxuICBpZiAoIXROb2RlIHx8ICF0Tm9kZS5nZXRUeXBlKCkpIHtcbiAgICB0QkJveCA9IGdldEJCb3hGcm9tUG9pbnQoZW5kKTtcbiAgfSBlbHNlIGlmICh0Tm9kZS5nZXRUeXBlKCkgPT09ICdjb21ibycpIHtcbiAgICB2YXIgdEtleVNoYXBlQkJveCA9IHROb2RlLmdldEtleVNoYXBlKCkuZ2V0QkJveCgpO1xuXG4gICAgaWYgKHRLZXlTaGFwZUJCb3gpIHtcbiAgICAgIHZhciBfYSA9IHROb2RlLmdldE1vZGVsKCksXG4gICAgICAgICAgdHggPSBfYS54LFxuICAgICAgICAgIHR5ID0gX2EueTtcblxuICAgICAgdEJCb3ggPSB7XG4gICAgICAgIHg6IHR4LFxuICAgICAgICB5OiB0eSxcbiAgICAgICAgd2lkdGg6IHRLZXlTaGFwZUJCb3gud2lkdGgsXG4gICAgICAgIGhlaWdodDogdEtleVNoYXBlQkJveC5oZWlnaHQsXG4gICAgICAgIG1pblg6IHRLZXlTaGFwZUJCb3gubWluWCArIHR4LFxuICAgICAgICBtYXhYOiB0S2V5U2hhcGVCQm94Lm1heFggKyB0eCxcbiAgICAgICAgbWluWTogdEtleVNoYXBlQkJveC5taW5ZICsgdHksXG4gICAgICAgIG1heFk6IHRLZXlTaGFwZUJCb3gubWF4WSArIHR5XG4gICAgICB9O1xuICAgICAgdEJCb3guY2VudGVyWCA9ICh0QkJveC5taW5YICsgdEJCb3gubWF4WCkgLyAyO1xuICAgICAgdEJCb3guY2VudGVyWSA9ICh0QkJveC5taW5ZICsgdEJCb3gubWF4WSkgLyAyO1xuICAgIH0gZWxzZSB7XG4gICAgICB0QkJveCA9IGdldEJCb3hGcm9tUG9pbnQoZW5kKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdEJCb3ggPSB0Tm9kZSAmJiB0Tm9kZS5nZXRCQm94KCk7XG4gIH0gLy8gaWYgKGlzQkJveGVzT3ZlcmxhcHBpbmcoc0JCb3gsIHRCQm94KSkge1xuICAvLyAgIC8vIHNvdXJjZSBhbmQgdGFyZ2V0IG5vZGVzIGFyZSBvdmVybGFwcGluZ1xuICAvLyAgIHJldHVybiBzaW1wbGlmeVBvbHlsaW5lKGdldFNpbXBsZVBvbHlsaW5lKHN0YXJ0LCBlbmQpKTtcbiAgLy8gfVxuXG5cbiAgdmFyIHN4QkJveCA9IGdldEV4cGFuZGVkQkJveChzQkJveCwgb2Zmc2V0KTtcbiAgdmFyIHR4QkJveCA9IGdldEV4cGFuZGVkQkJveCh0QkJveCwgb2Zmc2V0KTsgLy8gaWYgKGlzQkJveGVzT3ZlcmxhcHBpbmcoc3hCQm94LCB0eEJCb3gpKSB7XG4gIC8vICAgLy8gdGhlIGV4cGFuZGVkIGJvdW5kaW5nIGJveGVzIG9mIHNvdXJjZSBhbmQgdGFyZ2V0IG5vZGVzIGFyZSBvdmVybGFwcGluZ1xuICAvLyAgIHJldHVybiBzaW1wbGlmeVBvbHlsaW5lKGdldFNpbXBsZVBvbHlsaW5lKHN0YXJ0LCBlbmQpKTtcbiAgLy8gfVxuXG4gIHZhciBzUG9pbnQgPSBnZXRFeHBhbmRlZEJCb3hQb2ludChzeEJCb3gsIHN0YXJ0LCBlbmQpO1xuICB2YXIgdFBvaW50ID0gZ2V0RXhwYW5kZWRCQm94UG9pbnQodHhCQm94LCBlbmQsIHN0YXJ0KTtcbiAgdmFyIGxpbmVCQm94ID0gZ2V0QkJveEZyb21Qb2ludHMoW3NQb2ludCwgdFBvaW50XSk7XG4gIHZhciBzTWl4QkJveCA9IG1lcmdlQkJveChzeEJCb3gsIGxpbmVCQm94KTtcbiAgdmFyIHRNaXhCQm94ID0gbWVyZ2VCQm94KHR4QkJveCwgbGluZUJCb3gpO1xuICB2YXIgY29ubmVjdFBvaW50cyA9IFtdO1xuICBjb25uZWN0UG9pbnRzID0gY29ubmVjdFBvaW50cy5jb25jYXQoZ2V0UG9pbnRzRnJvbUJCb3goc01peEJCb3gpKS5jb25jYXQoZ2V0UG9pbnRzRnJvbUJCb3godE1peEJCb3gpKTtcbiAgdmFyIGNlbnRlclBvaW50ID0ge1xuICAgIHg6IChzdGFydC54ICsgZW5kLngpIC8gMixcbiAgICB5OiAoc3RhcnQueSArIGVuZC55KSAvIDJcbiAgfTtcbiAgW2xpbmVCQm94LCBzTWl4QkJveCwgdE1peEJCb3hdLmZvckVhY2goZnVuY3Rpb24gKGJib3gpIHtcbiAgICBjb25uZWN0UG9pbnRzID0gY29ubmVjdFBvaW50cy5jb25jYXQoZ2V0QkJveENyb3NzUG9pbnRzQnlQb2ludChiYm94LCBjZW50ZXJQb2ludCkuZmlsdGVyKGZ1bmN0aW9uIChwKSB7XG4gICAgICByZXR1cm4gaXNQb2ludE91dHNpZGVCQm94KHAsIHN4QkJveCkgJiYgaXNQb2ludE91dHNpZGVCQm94KHAsIHR4QkJveCk7XG4gICAgfSkpO1xuICB9KTtcbiAgW3tcbiAgICB4OiBzUG9pbnQueCxcbiAgICB5OiB0UG9pbnQueVxuICB9LCB7XG4gICAgeDogdFBvaW50LngsXG4gICAgeTogc1BvaW50LnlcbiAgfV0uZm9yRWFjaChmdW5jdGlvbiAocCkge1xuICAgIC8vIGltcG9zc2libGUhIVxuICAgIGlmIChpc1BvaW50T3V0c2lkZUJCb3gocCwgc3hCQm94KSAmJiBpc1BvaW50T3V0c2lkZUJCb3gocCwgdHhCQm94KSAvLyAmJlxuICAgIC8vIGlzUG9pbnRJbnNpZGVCQm94KHAsIHNNaXhCQm94KSAmJiBpc1BvaW50SW5zaWRlQkJveChwLCB0TWl4QkJveClcbiAgICApIHtcbiAgICAgIGNvbm5lY3RQb2ludHMucHVzaChwKTtcbiAgICB9XG4gIH0pO1xuICBjb25uZWN0UG9pbnRzLnVuc2hpZnQoc1BvaW50KTtcbiAgY29ubmVjdFBvaW50cy5wdXNoKHRQb2ludCk7IC8vIGZpbHRlciBvdXQgZHVscGxpY2F0ZWQgcG9pbnRzIGluIGNvbm5lY3RQb2ludHNcblxuICBjb25uZWN0UG9pbnRzID0gZmlsdGVyQ29ubmVjdFBvaW50cyhjb25uZWN0UG9pbnRzKTsgLy8gLCBzeEJCb3gsIHR4QkJveCwgb3V0ZXJCQm94XG5cbiAgdmFyIHBhdGhQb2ludHMgPSBwYXRoRmluZGVyKGNvbm5lY3RQb2ludHMsIHNQb2ludCwgdFBvaW50LCBzQkJveCwgdEJCb3gsIHN0YXJ0LCBlbmQpO1xuICBwYXRoUG9pbnRzLnVuc2hpZnQoc3RhcnQpO1xuICBwYXRoUG9pbnRzLnB1c2goZW5kKTtcbiAgcmV0dXJuIHNpbXBsaWZ5UG9seWxpbmUocGF0aFBvaW50cyk7XG59OyIsIi8qKlxuICog6YCa6L+H6YWN572u5LiN5ZCM55qEIGNvc3RGdW5jLCBkaXN0RnVuYywgY29uc3RyYWludHMg5Y+v5Lul5b6X5Yiw5LiN5ZCM5pWI5p6c55qEIHJvdXRlclxuICogZ2VuZXJhbFJvdXRlcjog5LiN6ZmQ5Yi25pCc57Si5pe255qE56e75Yqo5pa55ZCR77yM6YG/5byA6Zqc56KN5Y2z5Y+vXG4gKiBvcnRob2dvbmFsOiDnur/lv4Xpobvmsr/nnYDnq5bnm7TmiJbmsLTlubPmlrnlkJHvvIg05Liq5pa55ZCR77yJXG4gKiBvY3RvbGluZWFyUm91dGVyOiDnur/msr/nnYDnq5bnm7TjgIHmsLTlubPjgIHlr7nop5Lnur/mlrnlkJHvvIg45Liq5pa55ZCR77yJXG4gKi9cbmltcG9ydCB7IFV0aWwgfSBmcm9tICdAYW50di9nNi1jb3JlJztcbmltcG9ydCB7IGRlZXBNaXggfSBmcm9tICdAYW50di91dGlsJztcbmltcG9ydCB7IGdldEV4cGFuZGVkQkJveCwgZ2V0RXhwYW5kZWRCQm94UG9pbnQsIGdldFBvbHlsaW5lUG9pbnRzLCBzaW1wbGlmeVBvbHlsaW5lLCBpc1NlZ21lbnRDcm9zc2luZ0JCb3ggfSBmcm9tICcuL3BvbHlsaW5lLXV0aWwnO1xuXG52YXIgbWFuaGF0dGFuRGlzdCA9IGZ1bmN0aW9uIG1hbmhhdHRhbkRpc3QocDEsIHAyKSB7XG4gIHJldHVybiBNYXRoLmFicyhwMS54IC0gcDIueCkgKyBNYXRoLmFicyhwMS55IC0gcDIueSk7XG59O1xuXG52YXIgZXVjbGlEaXN0ID0gZnVuY3Rpb24gZXVjbGlEaXN0KHAxLCBwMikge1xuICByZXR1cm4gTWF0aC5zcXJ0KE1hdGgucG93KHAxLnggLSBwMi54LCAyKSArIE1hdGgucG93KHAxLnkgLSBwMi55LCAyKSk7XG59O1xuXG52YXIgc3RyYWlnaHRQYXRoID0gZnVuY3Rpb24gc3RyYWlnaHRQYXRoKHN0YXJ0LCBlbmQpIHtcbiAgLy8gY29uc29sZS53YXJuKCdmYWxsYmFja1JvdXRlOiBzdHJhaWdodCBwYXRoJyk7XG4gIHJldHVybiBbc3RhcnQsIGVuZF07XG59O1xuXG52YXIgc2ltcGxlUG9seWxpbmUgPSBmdW5jdGlvbiBzaW1wbGVQb2x5bGluZShzdGFydCwgZW5kLCBzdGFydE5vZGUsIGVuZE5vZGUsIGNmZykge1xuICByZXR1cm4gc2ltcGxpZnlQb2x5bGluZShnZXRQb2x5bGluZVBvaW50cyhzdGFydCwgZW5kLCBzdGFydE5vZGUsIGVuZE5vZGUsIGNmZy5vZmZzZXQpKTtcbn07IC8vIGdldFBvbHlsaW5lUG9pbnRzXG5cblxudmFyIGRlZmF1bHRDZmcgPSB7XG4gIG9mZnNldDogMjAsXG4gIG1heEFsbG93ZWREaXJlY3Rpb25DaGFuZ2U6IE1hdGguUEkgLyAyLFxuICBtYXhpbXVtTG9vcHM6IDIwMDAsXG4gIGdyaWRTaXplOiAxMCxcbiAgZGlyZWN0aW9uczogW3tcbiAgICBzdGVwWDogMSxcbiAgICBzdGVwWTogMFxuICB9LCB7XG4gICAgc3RlcFg6IC0xLFxuICAgIHN0ZXBZOiAwXG4gIH0sIHtcbiAgICBzdGVwWDogMCxcbiAgICBzdGVwWTogMVxuICB9LCB7XG4gICAgc3RlcFg6IDAsXG4gICAgc3RlcFk6IC0xXG4gIH0gLy8gdG9wXG4gIF0sXG5cbiAgZ2V0IHBlbmFsdGllcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgMDogMCxcbiAgICAgIDQ1OiB0aGlzLmdyaWRTaXplIC8gMixcbiAgICAgIDkwOiB0aGlzLmdyaWRTaXplIC8gMlxuICAgIH07XG4gIH0sXG5cbiAgZGlzdEZ1bmM6IG1hbmhhdHRhbkRpc3QsXG4gIGZhbGxiYWNrUm91dGU6IHNpbXBsZVBvbHlsaW5lXG59O1xuZXhwb3J0IHZhciBvY3RvbGluZWFyQ2ZnID0ge1xuICBtYXhBbGxvd2VkRGlyZWN0aW9uQ2hhbmdlOiBNYXRoLlBJIC8gNCxcbiAgLy8gOCDkuKrmlrnlkJE6IOS4iuS4i+W3puWPsyArIDQ15bqm5pac57q/5pa55ZCRXG4gIGRpcmVjdGlvbnM6IFt7XG4gICAgc3RlcFg6IDEsXG4gICAgc3RlcFk6IDBcbiAgfSwge1xuICAgIHN0ZXBYOiAxLFxuICAgIHN0ZXBZOiAxXG4gIH0sIHtcbiAgICBzdGVwWDogMCxcbiAgICBzdGVwWTogMVxuICB9LCB7XG4gICAgc3RlcFg6IC0xLFxuICAgIHN0ZXBZOiAxXG4gIH0sIHtcbiAgICBzdGVwWDogLTEsXG4gICAgc3RlcFk6IDBcbiAgfSwge1xuICAgIHN0ZXBYOiAtMSxcbiAgICBzdGVwWTogLTFcbiAgfSwge1xuICAgIHN0ZXBYOiAwLFxuICAgIHN0ZXBZOiAtMVxuICB9LCB7XG4gICAgc3RlcFg6IDEsXG4gICAgc3RlcFk6IC0xXG4gIH1dLFxuICBkaXN0RnVuYzogZXVjbGlEaXN0LFxuICBmYWxsYmFja1JvdXRlOiBzdHJhaWdodFBhdGhcbn07XG5cbnZhciBwb3MyR3JpZEl4ID0gZnVuY3Rpb24gcG9zMkdyaWRJeChwb3MsIGdyaWRTaXplKSB7XG4gIHZhciBncmlkSXggPSBNYXRoLnJvdW5kKE1hdGguYWJzKHBvcyAvIGdyaWRTaXplKSk7XG4gIHZhciBzaWduID0gcG9zIDwgMCA/IC0xIDogMTtcbiAgcmV0dXJuIGdyaWRJeCA8IDAgPyAwIDogc2lnbiAqIGdyaWRJeDtcbn07XG5cbnZhciBnZXRPYnN0YWNsZU1hcCA9IGZ1bmN0aW9uIGdldE9ic3RhY2xlTWFwKGl0ZW1zLCBncmlkU2l6ZSwgb2Zmc2V0KSB7XG4gIHZhciBtYXAgPSB7fTtcbiAgaXRlbXMuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xuICAgIC8vIGNyZWF0ZS1lZGdlIOaXtu+8jOW9k+i+ueexu+Wei+S4uiBwb2x5bGluZSDml7YgZW5kTm9kZSDkuLogbnVsbFxuICAgIGlmICghaXRlbSkgcmV0dXJuO1xuICAgIHZhciBiYm94ID0gZ2V0RXhwYW5kZWRCQm94KGl0ZW0uZ2V0QkJveCgpLCBvZmZzZXQpO1xuXG4gICAgZm9yICh2YXIgeCA9IHBvczJHcmlkSXgoYmJveC5taW5YLCBncmlkU2l6ZSk7IHggPD0gcG9zMkdyaWRJeChiYm94Lm1heFgsIGdyaWRTaXplKTsgeCArPSAxKSB7XG4gICAgICBmb3IgKHZhciB5ID0gcG9zMkdyaWRJeChiYm94Lm1pblksIGdyaWRTaXplKTsgeSA8PSBwb3MyR3JpZEl4KGJib3gubWF4WSwgZ3JpZFNpemUpOyB5ICs9IDEpIHtcbiAgICAgICAgbWFwW3ggKyBcInx8fFwiICsgeV0gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIHJldHVybiBtYXA7XG59O1xuLyoqXG4gKiDmlrnlkJHop5LvvJrorqHnrpfku44gcDEg5YiwIHAyIOeahOWwhOe6v+S4juawtOW5s+e6v+W9ouaIkOeahOWkueinkuW6puaVsO+8iOmhuuaXtumSiOS7juWPs+S+pzDCsOi9rOWIsOivpeWwhOe6v+eahOinkuW6pu+8iVxuICogQHBhcmFtIHAxIFBvbHlQb2ludFxuICogQHBhcmFtIHAyIFBvbHlQb2ludFxuICovXG5cblxudmFyIGdldERpcmVjdGlvbkFuZ2xlID0gZnVuY3Rpb24gZ2V0RGlyZWN0aW9uQW5nbGUocDEsIHAyKSB7XG4gIHZhciBkZWx0YVggPSBwMi54IC0gcDEueDtcbiAgdmFyIGRlbHRhWSA9IHAyLnkgLSBwMS55O1xuXG4gIGlmIChkZWx0YVggfHwgZGVsdGFZKSB7XG4gICAgcmV0dXJuIE1hdGguYXRhbjIoZGVsdGFZLCBkZWx0YVgpO1xuICB9XG5cbiAgcmV0dXJuIDA7XG59O1xuLyoqXG4gKiDmlrnlkJHop5LnmoTmlLnlj5jvvIzlj5blsI/kuo4xODDluqbop5JcbiAqIEBwYXJhbSBhbmdsZTFcbiAqIEBwYXJhbSBhbmdsZTJcbiAqL1xuXG5cbnZhciBnZXRBbmdsZURpZmYgPSBmdW5jdGlvbiBnZXRBbmdsZURpZmYoYW5nbGUxLCBhbmdsZTIpIHtcbiAgdmFyIGRpcmVjdGlvbkNoYW5nZSA9IE1hdGguYWJzKGFuZ2xlMSAtIGFuZ2xlMik7XG4gIHJldHVybiBkaXJlY3Rpb25DaGFuZ2UgPiBNYXRoLlBJID8gMiAqIE1hdGguUEkgLSBkaXJlY3Rpb25DaGFuZ2UgOiBkaXJlY3Rpb25DaGFuZ2U7IC8vIHJldHVybiBkaXJlY3Rpb25DaGFuZ2UgPiAxODAgPyAzNjAgLSBkaXJlY3Rpb25DaGFuZ2UgOiBkaXJlY3Rpb25DaGFuZ2U7XG59OyAvLyBQYXRoIGZpbmRlciAvL1xuXG5cbnZhciBlc3RpbWF0ZUNvc3QgPSBmdW5jdGlvbiBlc3RpbWF0ZUNvc3QoZnJvbSwgZW5kUG9pbnRzLCBkaXN0RnVuYykge1xuICB2YXIgbWluID0gSW5maW5pdHk7XG5cbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGVuZFBvaW50cy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIHZhciBjb3N0ID0gZGlzdEZ1bmMoZnJvbSwgZW5kUG9pbnRzW2ldKTtcblxuICAgIGlmIChjb3N0IDwgbWluKSB7XG4gICAgICBtaW4gPSBjb3N0O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtaW47XG59OyAvLyDorqHnrpfogIPomZEgb2Zmc2V0IOWQjueahCBCQm94IOS4iueahOi/nuaOpeeCuVxuXG5cbnZhciBnZXRCb3hQb2ludHMgPSBmdW5jdGlvbiBnZXRCb3hQb2ludHMocG9pbnQsIC8vIOiiqyBncmlkU2l6ZSDmoLzlvI/ljJblkI7nmoTkvY3nva7vvIhhbmNob3JQb2ludO+8iVxub3JpUG9pbnQsIC8vIOacquiiqyBncmlkU2l6ZSDmoLzlvI/ljJbnmoTkvY3nva7vvIhhbmNob3JQb2ludO+8iVxubm9kZSwgLy8g5Y6f5aeL6IqC54K577yM55So5LqO6I635Y+WIGJib3hcbmFub3RoZXJQb2ludCwgLy8g5Y+m5LiA56uv6KKrIGdyaWRTaXplIOagvOW8j+WMluWQjueahOS9jee9rlxuY2ZnKSB7XG4gIHZhciBwb2ludHMgPSBbXTsgLy8gY3JlYXRlLWVkZ2Ug55Sf5oiQ6L6555qE6L+H56iL5Lit77yMZW5kTm9kZSDkuLogbnVsbFxuXG4gIGlmICghbm9kZSkge1xuICAgIHJldHVybiBbcG9pbnRdO1xuICB9XG5cbiAgdmFyIGRpcmVjdGlvbnMgPSBjZmcuZGlyZWN0aW9ucyxcbiAgICAgIG9mZnNldCA9IGNmZy5vZmZzZXQ7XG4gIHZhciBiYm94ID0gbm9kZS5nZXRCQm94KCk7XG4gIHZhciBpc0luc2lkZSA9IG9yaVBvaW50LnggPiBiYm94Lm1pblggJiYgb3JpUG9pbnQueCA8IGJib3gubWF4WCAmJiBvcmlQb2ludC55ID4gYmJveC5taW5ZICYmIG9yaVBvaW50LnkgPCBiYm94Lm1heFk7XG4gIHZhciBleHBhbmRCQm94ID0gZ2V0RXhwYW5kZWRCQm94KGJib3gsIG9mZnNldCk7XG5cbiAgZm9yICh2YXIgaSBpbiBleHBhbmRCQm94KSB7XG4gICAgZXhwYW5kQkJveFtpXSA9IHBvczJHcmlkSXgoZXhwYW5kQkJveFtpXSwgY2ZnLmdyaWRTaXplKTtcbiAgfVxuXG4gIGlmIChpc0luc2lkZSkge1xuICAgIC8vIOWmguaenCBhbmNob3JQb2ludCDlnKjoioLngrnlhoXpg6jvvIzlhYHorrjnrKzkuIDmrrXnur/nqb/ov4foioLngrlcbiAgICBmb3IgKHZhciBfaSA9IDAsIGRpcmVjdGlvbnNfMSA9IGRpcmVjdGlvbnM7IF9pIDwgZGlyZWN0aW9uc18xLmxlbmd0aDsgX2krKykge1xuICAgICAgdmFyIGRpciA9IGRpcmVjdGlvbnNfMVtfaV07XG4gICAgICB2YXIgYm91bmRzID0gW1t7XG4gICAgICAgIHg6IGV4cGFuZEJCb3gubWluWCxcbiAgICAgICAgeTogZXhwYW5kQkJveC5taW5ZXG4gICAgICB9LCB7XG4gICAgICAgIHg6IGV4cGFuZEJCb3gubWF4WCxcbiAgICAgICAgeTogZXhwYW5kQkJveC5taW5ZXG4gICAgICB9XSwgW3tcbiAgICAgICAgeDogZXhwYW5kQkJveC5taW5YLFxuICAgICAgICB5OiBleHBhbmRCQm94Lm1pbllcbiAgICAgIH0sIHtcbiAgICAgICAgeDogZXhwYW5kQkJveC5taW5YLFxuICAgICAgICB5OiBleHBhbmRCQm94Lm1heFlcbiAgICAgIH1dLCBbe1xuICAgICAgICB4OiBleHBhbmRCQm94Lm1heFgsXG4gICAgICAgIHk6IGV4cGFuZEJCb3gubWluWVxuICAgICAgfSwge1xuICAgICAgICB4OiBleHBhbmRCQm94Lm1heFgsXG4gICAgICAgIHk6IGV4cGFuZEJCb3gubWF4WVxuICAgICAgfV0sIFt7XG4gICAgICAgIHg6IGV4cGFuZEJCb3gubWluWCxcbiAgICAgICAgeTogZXhwYW5kQkJveC5tYXhZXG4gICAgICB9LCB7XG4gICAgICAgIHg6IGV4cGFuZEJCb3gubWF4WCxcbiAgICAgICAgeTogZXhwYW5kQkJveC5tYXhZXG4gICAgICB9XV07XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgNDsgaSsrKSB7XG4gICAgICAgIHZhciBib3VuZExpbmUgPSBib3VuZHNbaV07XG4gICAgICAgIHZhciBpbnN0ZXJjdFBfMSA9IFV0aWwuZ2V0TGluZUludGVyc2VjdChwb2ludCwge1xuICAgICAgICAgIHg6IHBvaW50LnggKyBkaXIuc3RlcFggKiBleHBhbmRCQm94LndpZHRoLFxuICAgICAgICAgIHk6IHBvaW50LnkgKyBkaXIuc3RlcFkgKiBleHBhbmRCQm94LmhlaWdodFxuICAgICAgICB9LCBib3VuZExpbmVbMF0sIGJvdW5kTGluZVsxXSk7XG5cbiAgICAgICAgaWYgKGluc3RlcmN0UF8xICYmICFpc1NlZ21lbnRDcm9zc2luZ0JCb3gocG9pbnQsIGluc3RlcmN0UF8xLCBiYm94KSkge1xuICAgICAgICAgIGluc3RlcmN0UF8xLmlkID0gaW5zdGVyY3RQXzEueCArIFwifHx8XCIgKyBpbnN0ZXJjdFBfMS55O1xuICAgICAgICAgIHBvaW50cy5wdXNoKGluc3RlcmN0UF8xKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBwb2ludHM7XG4gIH0gLy8g5aaC5p6cIGFuY2hvclBvaW50IOWcqOiKgueCueS4iu+8jOWPquacieS4gOS4quWPr+mAieaWueWQkVxuXG5cbiAgdmFyIGluc3RlcmN0UCA9IGdldEV4cGFuZGVkQkJveFBvaW50KGV4cGFuZEJCb3gsIHBvaW50LCBhbm90aGVyUG9pbnQpO1xuICBpbnN0ZXJjdFAuaWQgPSBpbnN0ZXJjdFAueCArIFwifHx8XCIgKyBpbnN0ZXJjdFAueTtcbiAgcmV0dXJuIFtpbnN0ZXJjdFBdO1xufTtcblxudmFyIGdldERpcmVjdGlvbkNoYW5nZSA9IGZ1bmN0aW9uIGdldERpcmVjdGlvbkNoYW5nZShjdXJyZW50LCBuZWlnaGJvciwgY2FtZUZyb20sIHNjYWxlU3RhcnRQb2ludCkge1xuICB2YXIgZGlyZWN0aW9uQW5nbGUgPSBnZXREaXJlY3Rpb25BbmdsZShjdXJyZW50LCBuZWlnaGJvcik7XG5cbiAgaWYgKCFjYW1lRnJvbVtjdXJyZW50LmlkXSkge1xuICAgIHZhciBzdGFydEFuZ2xlID0gZ2V0RGlyZWN0aW9uQW5nbGUoc2NhbGVTdGFydFBvaW50LCBjdXJyZW50KTtcbiAgICByZXR1cm4gZ2V0QW5nbGVEaWZmKHN0YXJ0QW5nbGUsIGRpcmVjdGlvbkFuZ2xlKTtcbiAgfVxuXG4gIHZhciBwcmV2RGlyZWN0aW9uQW5nbGUgPSBnZXREaXJlY3Rpb25BbmdsZSh7XG4gICAgeDogY2FtZUZyb21bY3VycmVudC5pZF0ueCxcbiAgICB5OiBjYW1lRnJvbVtjdXJyZW50LmlkXS55XG4gIH0sIGN1cnJlbnQpO1xuICByZXR1cm4gZ2V0QW5nbGVEaWZmKHByZXZEaXJlY3Rpb25BbmdsZSwgZGlyZWN0aW9uQW5nbGUpO1xufTtcblxudmFyIGdldENvbnRyb2xQb2ludHMgPSBmdW5jdGlvbiBnZXRDb250cm9sUG9pbnRzKGN1cnJlbnQsIGNhbWVGcm9tLCBzY2FsZVN0YXJ0UG9pbnQsIGVuZFBvaW50LCBzdGFydFBvaW50LCBzY2FsZUVuZFBvaW50LCBncmlkU2l6ZSkge1xuICB2YXIgY29udHJvbFBvaW50cyA9IFtlbmRQb2ludF07XG4gIHZhciBjdXJyZW50SWQgPSBjdXJyZW50LmlkO1xuICB2YXIgY3VycmVudFggPSBjdXJyZW50Lng7XG4gIHZhciBjdXJyZW50WSA9IGN1cnJlbnQueTtcbiAgdmFyIGxhc3RQb2ludCA9IHtcbiAgICB4OiBjdXJyZW50WCxcbiAgICB5OiBjdXJyZW50WSxcbiAgICBpZDogY3VycmVudElkXG4gIH07XG5cbiAgaWYgKGdldERpcmVjdGlvbkNoYW5nZShsYXN0UG9pbnQsIHNjYWxlRW5kUG9pbnQsIGNhbWVGcm9tLCBzY2FsZVN0YXJ0UG9pbnQpKSB7XG4gICAgLy8gaWYgKHNjYWxlRW5kUG9pbnQueCA9PT0gZW5kUG9pbnQueCAmJiBzY2FsZUVuZFBvaW50LnkgPT09IGVuZFBvaW50LnkpXG4gICAgLy8gICBjb250cm9sUG9pbnRzLnVuc2hpZnQoe1xuICAgIC8vICAgICB4OiBlbmRQb2ludC54LFxuICAgIC8vICAgICB5OiBlbmRQb2ludC55XG4gICAgLy8gICB9KVxuICAgIC8vIGVsc2VcbiAgICAvLyAgIGNvbnRyb2xQb2ludHMudW5zaGlmdCh7XG4gICAgLy8gICAgIHg6IGxhc3RQb2ludC54ICogZ3JpZFNpemUsXG4gICAgLy8gICAgIHk6IGxhc3RQb2ludC55ICogZ3JpZFNpemUsXG4gICAgLy8gICB9KTtcbiAgICBjb250cm9sUG9pbnRzLnVuc2hpZnQoe1xuICAgICAgeDogc2NhbGVFbmRQb2ludC54ID09PSBlbmRQb2ludC54ID8gZW5kUG9pbnQueCA6IGxhc3RQb2ludC54ICogZ3JpZFNpemUsXG4gICAgICB5OiBzY2FsZUVuZFBvaW50LnkgPT09IGVuZFBvaW50LnkgPyBlbmRQb2ludC55IDogbGFzdFBvaW50LnkgKiBncmlkU2l6ZVxuICAgIH0pO1xuICB9XG5cbiAgd2hpbGUgKGNhbWVGcm9tW2N1cnJlbnRJZF0gJiYgY2FtZUZyb21bY3VycmVudElkXS5pZCAhPT0gY3VycmVudElkKSB7XG4gICAgdmFyIHBvaW50ID0ge1xuICAgICAgeDogY3VycmVudFgsXG4gICAgICB5OiBjdXJyZW50WSxcbiAgICAgIGlkOiBjdXJyZW50SWRcbiAgICB9O1xuICAgIHZhciBwcmVJZCA9IGNhbWVGcm9tW2N1cnJlbnRJZF0uaWQ7XG4gICAgdmFyIHByZVggPSBjYW1lRnJvbVtjdXJyZW50SWRdLng7XG4gICAgdmFyIHByZVkgPSBjYW1lRnJvbVtjdXJyZW50SWRdLnk7XG4gICAgdmFyIHByZVBvaW50ID0ge1xuICAgICAgeDogcHJlWCxcbiAgICAgIHk6IHByZVksXG4gICAgICBpZDogcHJlSWRcbiAgICB9O1xuICAgIHZhciBkaXJlY3Rpb25DaGFuZ2UgPSBnZXREaXJlY3Rpb25DaGFuZ2UocHJlUG9pbnQsIHBvaW50LCBjYW1lRnJvbSwgc2NhbGVTdGFydFBvaW50KTtcblxuICAgIGlmIChkaXJlY3Rpb25DaGFuZ2UpIHtcbiAgICAgIC8vIGlmIChwcmVQb2ludC54ID09PSBwb2ludC54ICYmIHByZVBvaW50LnkgPT09IHBvaW50LnkpXG4gICAgICAvLyAgIGNvbnRyb2xQb2ludHMudW5zaGlmdCh7XG4gICAgICAvLyAgICAgeDogY29udHJvbFBvaW50c1swXS54LFxuICAgICAgLy8gICAgIHk6IGNvbnRyb2xQb2ludHNbMF0ueVxuICAgICAgLy8gICB9KVxuICAgICAgLy8gZWxzZVxuICAgICAgLy8gICBjb250cm9sUG9pbnRzLnVuc2hpZnQoe1xuICAgICAgLy8gICAgIHg6IHByZVBvaW50LnggKiBncmlkU2l6ZSxcbiAgICAgIC8vICAgICB5OiBwcmVQb2ludC55ICogZ3JpZFNpemUsXG4gICAgICAvLyAgIH0pO1xuICAgICAgY29udHJvbFBvaW50cy51bnNoaWZ0KHtcbiAgICAgICAgeDogcHJlUG9pbnQueCA9PT0gcG9pbnQueCA/IGNvbnRyb2xQb2ludHNbMF0ueCA6IHByZVBvaW50LnggKiBncmlkU2l6ZSxcbiAgICAgICAgeTogcHJlUG9pbnQueSA9PT0gcG9pbnQueSA/IGNvbnRyb2xQb2ludHNbMF0ueSA6IHByZVBvaW50LnkgKiBncmlkU2l6ZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY3VycmVudElkID0gcHJlSWQ7XG4gICAgY3VycmVudFggPSBwcmVYO1xuICAgIGN1cnJlbnRZID0gcHJlWTtcbiAgfSAvLyDlkoxzdGFydE5vZGXlr7npvZBcblxuXG4gIHZhciBmaXJzdFBvaW50ID0ge1xuICAgIHg6IGN1cnJlbnRYLFxuICAgIHk6IGN1cnJlbnRZLFxuICAgIGlkOiBjdXJyZW50SWRcbiAgfTsgLy8gaWYgKGZpcnN0UG9pbnQueCA9PT0gc2NhbGVTdGFydFBvaW50LnggJiYgZmlyc3RQb2ludC55ID09PSBzY2FsZVN0YXJ0UG9pbnQueSkge1xuICAvLyAgIGNvbnRyb2xQb2ludHNbMF0ueCA9IHN0YXJ0UG9pbnQueDtcbiAgLy8gICBjb250cm9sUG9pbnRzWzBdLnkgPSBzdGFydFBvaW50Lnk7XG4gIC8vIH1cblxuICBjb250cm9sUG9pbnRzWzBdLnggPSBmaXJzdFBvaW50LnggPT09IHNjYWxlU3RhcnRQb2ludC54ID8gc3RhcnRQb2ludC54IDogY29udHJvbFBvaW50c1swXS54O1xuICBjb250cm9sUG9pbnRzWzBdLnkgPSBmaXJzdFBvaW50LnkgPT09IHNjYWxlU3RhcnRQb2ludC55ID8gc3RhcnRQb2ludC55IDogY29udHJvbFBvaW50c1swXS55O1xuICBjb250cm9sUG9pbnRzLnVuc2hpZnQoc3RhcnRQb2ludCk7XG4gIHJldHVybiBjb250cm9sUG9pbnRzO1xufTtcblxuZXhwb3J0IHZhciBwYXRoRmluZGVyID0gZnVuY3Rpb24gcGF0aEZpbmRlcihzdGFydFBvaW50LCBlbmRQb2ludCwgc3RhcnROb2RlLCBlbmROb2RlLCByb3V0ZXJDZmcpIHtcbiAgaWYgKGlzTmFOKHN0YXJ0UG9pbnQueCkgfHwgaXNOYU4oZW5kUG9pbnQueCkpIHJldHVybiBbXTtcbiAgdmFyIGNmZyA9IGRlZXBNaXgoZGVmYXVsdENmZywgcm91dGVyQ2ZnKTtcbiAgY2ZnLm9ic3RhY2xlcyA9IGNmZy5vYnN0YWNsZXMgfHwgW107XG4gIHZhciBncmlkU2l6ZSA9IGNmZy5ncmlkU2l6ZTtcbiAgdmFyIG1hcCA9IGdldE9ic3RhY2xlTWFwKGNmZy5vYnN0YWNsZXMuY29uY2F0KFtzdGFydE5vZGUsIGVuZE5vZGVdKSwgZ3JpZFNpemUsIGNmZy5vZmZzZXQpO1xuICB2YXIgc2NhbGVTdGFydFBvaW50ID0ge1xuICAgIHg6IHBvczJHcmlkSXgoc3RhcnRQb2ludC54LCBncmlkU2l6ZSksXG4gICAgeTogcG9zMkdyaWRJeChzdGFydFBvaW50LnksIGdyaWRTaXplKVxuICB9O1xuICB2YXIgc2NhbGVFbmRQb2ludCA9IHtcbiAgICB4OiBwb3MyR3JpZEl4KGVuZFBvaW50LngsIGdyaWRTaXplKSxcbiAgICB5OiBwb3MyR3JpZEl4KGVuZFBvaW50LnksIGdyaWRTaXplKVxuICB9O1xuICBzdGFydFBvaW50LmlkID0gc2NhbGVTdGFydFBvaW50LnggKyBcInx8fFwiICsgc2NhbGVTdGFydFBvaW50Lnk7XG4gIGVuZFBvaW50LmlkID0gc2NhbGVFbmRQb2ludC54ICsgXCJ8fHxcIiArIHNjYWxlRW5kUG9pbnQueTtcbiAgdmFyIHN0YXJ0UG9pbnRzID0gZ2V0Qm94UG9pbnRzKHNjYWxlU3RhcnRQb2ludCwgc3RhcnRQb2ludCwgc3RhcnROb2RlLCBzY2FsZUVuZFBvaW50LCBjZmcpO1xuICB2YXIgZW5kUG9pbnRzID0gZ2V0Qm94UG9pbnRzKHNjYWxlRW5kUG9pbnQsIGVuZFBvaW50LCBlbmROb2RlLCBzY2FsZVN0YXJ0UG9pbnQsIGNmZyk7XG4gIHN0YXJ0UG9pbnRzLmZvckVhY2goZnVuY3Rpb24gKHBvaW50KSB7XG4gICAgZGVsZXRlIG1hcFtwb2ludC5pZF07XG4gIH0pO1xuICBlbmRQb2ludHMuZm9yRWFjaChmdW5jdGlvbiAocG9pbnQpIHtcbiAgICBkZWxldGUgbWFwW3BvaW50LmlkXTtcbiAgfSk7XG4gIHZhciBvcGVuU2V0ID0ge307XG4gIHZhciBjbG9zZWRTZXQgPSB7fTtcbiAgdmFyIGNhbWVGcm9tID0ge307IC8vIOS7jui1t+eCueWIsOW9k+WJjeeCueW3suS6p+eUn+eahCBjb3N0LCBkZWZhdWx0OiBJbmZpbml0eVxuXG4gIHZhciBnU2NvcmUgPSB7fTsgLy8g6LW354K557uP6L+H5b2T5YmN54K55Yiw6L6+57uI54K56aKE5Lyw55qEIGNvc3QsIGRlZmF1bHQ6IEluZmluaXR5XG5cbiAgdmFyIGZTY29yZSA9IHt9OyAvLyBpbml0aWFsaXplXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdGFydFBvaW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBmaXJzdFN0ZXAgPSBzdGFydFBvaW50c1tpXTtcbiAgICBvcGVuU2V0W2ZpcnN0U3RlcC5pZF0gPSBmaXJzdFN0ZXA7IC8vIGNhbWVGcm9tW2ZpcnN0U3RlcC5pZF0gPSBzdGFydFBvaW50LmlkO1xuXG4gICAgZ1Njb3JlW2ZpcnN0U3RlcC5pZF0gPSAwO1xuICAgIGZTY29yZVtmaXJzdFN0ZXAuaWRdID0gZXN0aW1hdGVDb3N0KGZpcnN0U3RlcCwgZW5kUG9pbnRzLCBjZmcuZGlzdEZ1bmMpO1xuICB9XG5cbiAgdmFyIHJlbWFpbkxvb3BzID0gY2ZnLm1heGltdW1Mb29wcztcbiAgdmFyIHBlbmFsdGllcyA9IGNmZy5wZW5hbHRpZXM7XG4gIHZhciBjdXJyZW50LCBjdXJDb3N0LCBkaXJlY3Rpb24sIG5laWdoYm9yLCBuZWlnaGJvckNvc3QsIGNvc3RGcm9tU3RhcnQsIGRpcmVjdGlvbkNoYW5nZTtcblxuICB3aGlsZSAoT2JqZWN0LmtleXMob3BlblNldCkubGVuZ3RoID4gMCAmJiByZW1haW5Mb29wcyA+IDApIHtcbiAgICBjdXJyZW50ID0gdW5kZWZpbmVkO1xuICAgIGN1ckNvc3QgPSBJbmZpbml0eTsgLy8g5om+5YiwIG9wZW5TZXQg5LitIGZTY29yZSDmnIDlsI/nmoTngrlcblxuICAgIE9iamVjdC5rZXlzKG9wZW5TZXQpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgdmFyIGlkID0gb3BlblNldFtrZXldLmlkO1xuXG4gICAgICBpZiAoZlNjb3JlW2lkXSA8PSBjdXJDb3N0KSB7XG4gICAgICAgIGN1ckNvc3QgPSBmU2NvcmVbaWRdO1xuICAgICAgICBjdXJyZW50ID0gb3BlblNldFtpZF07XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKCFjdXJyZW50KSBicmVhazsgLy8g5aaC5p6cIGZTY29yZSDmnIDlsI/nmoTngrnlsLHmmK/nu4jngrlcblxuICAgIGlmIChlbmRQb2ludHMuZmluZEluZGV4KGZ1bmN0aW9uIChwb2ludCkge1xuICAgICAgcmV0dXJuIHBvaW50LnggPT09IGN1cnJlbnQueCAmJiBwb2ludC55ID09PSBjdXJyZW50Lnk7XG4gICAgfSkgPiAtMSkge1xuICAgICAgcmV0dXJuIGdldENvbnRyb2xQb2ludHMoY3VycmVudCwgY2FtZUZyb20sIHNjYWxlU3RhcnRQb2ludCwgZW5kUG9pbnQsIHN0YXJ0UG9pbnQsIHNjYWxlRW5kUG9pbnQsIGdyaWRTaXplKTtcbiAgICB9XG5cbiAgICBkZWxldGUgb3BlblNldFtjdXJyZW50LmlkXTtcbiAgICBjbG9zZWRTZXRbY3VycmVudC5pZF0gPSB0cnVlOyAvLyDojrflj5bnrKblkIjmnaHku7bnmoTkuIvkuIDmraXnmoTlgJnpgInov57mjqXngrlcbiAgICAvLyDmsr/lgJnpgInmlrnlkJHotbDkuIDmraVcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2ZnLmRpcmVjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGRpcmVjdGlvbiA9IGNmZy5kaXJlY3Rpb25zW2ldO1xuICAgICAgbmVpZ2hib3IgPSB7XG4gICAgICAgIHg6IGN1cnJlbnQueCArIGRpcmVjdGlvbi5zdGVwWCxcbiAgICAgICAgeTogY3VycmVudC55ICsgZGlyZWN0aW9uLnN0ZXBZLFxuICAgICAgICBpZDogTWF0aC5yb3VuZChjdXJyZW50LngpICsgZGlyZWN0aW9uLnN0ZXBYICsgXCJ8fHxcIiArIChNYXRoLnJvdW5kKGN1cnJlbnQueSkgKyBkaXJlY3Rpb24uc3RlcFkpXG4gICAgICB9O1xuICAgICAgaWYgKGNsb3NlZFNldFtuZWlnaGJvci5pZF0pIGNvbnRpbnVlO1xuICAgICAgZGlyZWN0aW9uQ2hhbmdlID0gZ2V0RGlyZWN0aW9uQ2hhbmdlKGN1cnJlbnQsIG5laWdoYm9yLCBjYW1lRnJvbSwgc2NhbGVTdGFydFBvaW50KTtcbiAgICAgIGlmIChkaXJlY3Rpb25DaGFuZ2UgPiBjZmcubWF4QWxsb3dlZERpcmVjdGlvbkNoYW5nZSkgY29udGludWU7XG4gICAgICBpZiAobWFwW25laWdoYm9yLmlkXSkgY29udGludWU7IC8vIOWmguaenOS6pOWPieWImei3s+i/h1xuICAgICAgLy8g5bCG5YCZ6YCJ54K55Yqg5YWlIG9wZW5TZXQsIOW5tuiuoeeul+avj+S4quWAmemAieeCueeahCBjb3N0XG5cbiAgICAgIGlmICghb3BlblNldFtuZWlnaGJvci5pZF0pIHtcbiAgICAgICAgb3BlblNldFtuZWlnaGJvci5pZF0gPSBuZWlnaGJvcjtcbiAgICAgIH1cblxuICAgICAgbmVpZ2hib3JDb3N0ID0gY2ZnLmRpc3RGdW5jKGN1cnJlbnQsIG5laWdoYm9yKSArIChpc05hTihwZW5hbHRpZXNbZGlyZWN0aW9uQ2hhbmdlXSkgPyBncmlkU2l6ZSA6IHBlbmFsdGllc1tkaXJlY3Rpb25DaGFuZ2VdKTtcbiAgICAgIGNvc3RGcm9tU3RhcnQgPSBnU2NvcmVbY3VycmVudC5pZF0gKyBuZWlnaGJvckNvc3Q7XG5cbiAgICAgIGlmIChnU2NvcmVbbmVpZ2hib3IuaWRdICYmIGNvc3RGcm9tU3RhcnQgPj0gZ1Njb3JlW25laWdoYm9yLmlkXSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY2FtZUZyb21bbmVpZ2hib3IuaWRdID0gY3VycmVudDtcbiAgICAgIGdTY29yZVtuZWlnaGJvci5pZF0gPSBjb3N0RnJvbVN0YXJ0O1xuICAgICAgZlNjb3JlW25laWdoYm9yLmlkXSA9IGNvc3RGcm9tU3RhcnQgKyBlc3RpbWF0ZUNvc3QobmVpZ2hib3IsIGVuZFBvaW50cywgY2ZnLmRpc3RGdW5jKTtcbiAgICB9XG5cbiAgICByZW1haW5Mb29wcyAtPSAxO1xuICB9XG5cbiAgcmV0dXJuIGNmZy5mYWxsYmFja1JvdXRlKHN0YXJ0UG9pbnQsIGVuZFBvaW50LCBzdGFydE5vZGUsIGVuZE5vZGUsIGNmZyk7XG59OyIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBtaXgsIGVhY2gsIGlzQXJyYXksIGlzU3RyaW5nIH0gZnJvbSAnQGFudHYvdXRpbCc7XG5pbXBvcnQgeyByZWdpc3RlckVkZ2UsIFV0aWwsIEJhc2VHbG9iYWwgYXMgR2xvYmFsIH0gZnJvbSAnQGFudHYvZzYtY29yZSc7XG5pbXBvcnQgeyBnZXRQYXRoV2l0aEJvcmRlclJhZGl1c0J5UG9seWxpbmUsIGdldFBvbHlsaW5lUG9pbnRzIH0gZnJvbSAnLi9wb2x5bGluZS11dGlsJztcbmltcG9ydCB7IHBhdGhGaW5kZXIgfSBmcm9tICcuL3JvdXRlcic7IC8vIOaKmOe6v1xuXG5yZWdpc3RlckVkZ2UoJ3BvbHlsaW5lJywge1xuICBvcHRpb25zOiB7XG4gICAgY29sb3I6IEdsb2JhbC5kZWZhdWx0RWRnZS5jb2xvcixcbiAgICBzaXplOiBHbG9iYWwuZGVmYXVsdEVkZ2Uuc2l6ZSxcbiAgICBzdHlsZToge1xuICAgICAgcmFkaXVzOiAwLFxuICAgICAgb2Zmc2V0OiAxNSxcbiAgICAgIHg6IDAsXG4gICAgICB5OiAwLFxuICAgICAgc3Ryb2tlOiBHbG9iYWwuZGVmYXVsdEVkZ2Uuc3R5bGUuc3Ryb2tlLFxuICAgICAgbGluZUFwcGVuZFdpZHRoOiBHbG9iYWwuZGVmYXVsdEVkZ2Uuc3R5bGUubGluZUFwcGVuZFdpZHRoXG4gICAgfSxcbiAgICAvLyDmlofmnKzmoLflvI/phY3nva5cbiAgICBsYWJlbENmZzoge1xuICAgICAgc3R5bGU6IHtcbiAgICAgICAgZmlsbDogR2xvYmFsLmVkZ2VMYWJlbC5zdHlsZS5maWxsLFxuICAgICAgICBmb250U2l6ZTogR2xvYmFsLmVkZ2VMYWJlbC5zdHlsZS5mb250U2l6ZSxcbiAgICAgICAgZm9udEZhbWlseTogR2xvYmFsLndpbmRvd0ZvbnRGYW1pbHlcbiAgICAgIH1cbiAgICB9LFxuICAgIHJvdXRlQ2ZnOiB7XG4gICAgICBvYnN0YWNsZXM6IFtdLFxuICAgICAgbWF4QWxsb3dlZERpcmVjdGlvbkNoYW5nZTogTWF0aC5QSSxcbiAgICAgIG1heGltdW1Mb29wczogNTAwLFxuICAgICAgZ3JpZFNpemU6IDEwIC8vIOaMh+WumueyvuW6plxuXG4gICAgfSxcbiAgICBzdGF0ZVN0eWxlczogX19hc3NpZ24oe30sIEdsb2JhbC5lZGdlU3RhdGVTdHlsZXMpXG4gIH0sXG4gIHNoYXBlVHlwZTogJ3BvbHlsaW5lJyxcbiAgLy8g5paH5pys5L2N572uXG4gIGxhYmVsUG9zaXRpb246ICdjZW50ZXInLFxuICBkcmF3U2hhcGU6IGZ1bmN0aW9uIGRyYXdTaGFwZShjZmcsIGdyb3VwKSB7XG4gICAgdmFyIHNoYXBlU3R5bGUgPSB0aGlzLmdldFNoYXBlU3R5bGUoY2ZnKTtcbiAgICBpZiAoc2hhcGVTdHlsZS5yYWRpdXMgPT09IDApIGRlbGV0ZSBzaGFwZVN0eWxlLnJhZGl1cztcbiAgICB2YXIga2V5U2hhcGUgPSBncm91cC5hZGRTaGFwZSgncGF0aCcsIHtcbiAgICAgIGNsYXNzTmFtZTogJ2VkZ2Utc2hhcGUnLFxuICAgICAgbmFtZTogJ2VkZ2Utc2hhcGUnLFxuICAgICAgYXR0cnM6IHNoYXBlU3R5bGVcbiAgICB9KTtcbiAgICBncm91cFsnc2hhcGVNYXAnXVsnZWRnZS1zaGFwZSddID0ga2V5U2hhcGU7XG4gICAgcmV0dXJuIGtleVNoYXBlO1xuICB9LFxuICBnZXRTaGFwZVN0eWxlOiBmdW5jdGlvbiBnZXRTaGFwZVN0eWxlKGNmZykge1xuICAgIHZhciBkZWZhdWx0U3R5bGUgPSB0aGlzLm9wdGlvbnMuc3R5bGU7XG4gICAgdmFyIHN0cm9rZVN0eWxlID0ge1xuICAgICAgc3Ryb2tlOiBjZmcuY29sb3JcbiAgICB9O1xuICAgIHZhciBzdHlsZSA9IG1peCh7fSwgZGVmYXVsdFN0eWxlLCBzdHJva2VTdHlsZSwgY2ZnLnN0eWxlKTtcbiAgICBjZmcgPSB0aGlzLmdldFBhdGhQb2ludHMoY2ZnKTtcbiAgICB0aGlzLnJhZGl1cyA9IHN0eWxlLnJhZGl1cztcbiAgICB0aGlzLm9mZnNldCA9IHN0eWxlLm9mZnNldDtcbiAgICB2YXIgc3RhcnRQb2ludCA9IGNmZy5zdGFydFBvaW50LFxuICAgICAgICBlbmRQb2ludCA9IGNmZy5lbmRQb2ludDtcbiAgICB2YXIgY29udHJvbFBvaW50cyA9IHRoaXMuZ2V0Q29udHJvbFBvaW50cyhjZmcpO1xuICAgIHZhciBwb2ludHMgPSBbc3RhcnRQb2ludF07IC8vIOa3u+WKoOi1t+Wni+eCuVxuICAgIC8vIOa3u+WKoOaOp+WItueCuVxuXG4gICAgaWYgKGNvbnRyb2xQb2ludHMpIHtcbiAgICAgIHBvaW50cyA9IHBvaW50cy5jb25jYXQoY29udHJvbFBvaW50cyk7XG4gICAgfSAvLyDmt7vliqDnu5PmnZ/ngrlcblxuXG4gICAgcG9pbnRzLnB1c2goZW5kUG9pbnQpO1xuICAgIHZhciBzb3VyY2UgPSBjZmcuc291cmNlTm9kZTtcbiAgICB2YXIgdGFyZ2V0ID0gY2ZnLnRhcmdldE5vZGU7XG4gICAgdmFyIHJhZGl1cyA9IHN0eWxlLnJhZGl1cztcbiAgICB2YXIgZGVmYXVsdFJvdXRlQ2ZnID0gdGhpcy5vcHRpb25zLnJvdXRlQ2ZnO1xuICAgIHZhciByb3V0ZUNmZyA9IG1peCh7fSwgZGVmYXVsdFJvdXRlQ2ZnLCBjZmcucm91dGVDZmcpO1xuICAgIHJvdXRlQ2ZnLm9mZnNldCA9IHN0eWxlLm9mZnNldDtcbiAgICB2YXIgcGF0aCA9IHRoaXMuZ2V0UGF0aChwb2ludHMsIHNvdXJjZSwgdGFyZ2V0LCByYWRpdXMsIHJvdXRlQ2ZnKTtcblxuICAgIGlmIChpc0FycmF5KHBhdGgpICYmIHBhdGgubGVuZ3RoIDw9IDEgfHwgaXNTdHJpbmcocGF0aCkgJiYgcGF0aC5pbmRleE9mKCdMJykgPT09IC0xKSB7XG4gICAgICBwYXRoID0gJ00wIDAsIEwwIDAnO1xuICAgIH1cblxuICAgIGlmIChpc05hTihzdGFydFBvaW50LngpIHx8IGlzTmFOKHN0YXJ0UG9pbnQueSkgfHwgaXNOYU4oZW5kUG9pbnQueCkgfHwgaXNOYU4oZW5kUG9pbnQueSkpIHtcbiAgICAgIHBhdGggPSAnTTAgMCwgTDAgMCc7XG4gICAgfVxuXG4gICAgdmFyIGF0dHJzID0gbWl4KHt9LCBHbG9iYWwuZGVmYXVsdEVkZ2Uuc3R5bGUsIHN0eWxlLCB7XG4gICAgICBsaW5lV2lkdGg6IGNmZy5zaXplLFxuICAgICAgcGF0aDogcGF0aFxuICAgIH0pO1xuICAgIHJldHVybiBhdHRycztcbiAgfSxcbiAgdXBkYXRlU2hhcGVTdHlsZTogZnVuY3Rpb24gdXBkYXRlU2hhcGVTdHlsZShjZmcsIGl0ZW0pIHtcbiAgICB2YXIgZ3JvdXAgPSBpdGVtLmdldENvbnRhaW5lcigpO1xuICAgIGlmICghaXRlbS5pc1Zpc2libGUoKSkgcmV0dXJuO1xuICAgIHZhciBzdHJva2VTdHlsZSA9IHtcbiAgICAgIHN0cm9rZTogY2ZnLmNvbG9yXG4gICAgfTtcbiAgICB2YXIgc2hhcGUgPSBncm91cFsnc2hhcGVNYXAnXVsnZWRnZS1zaGFwZSddIHx8IGdyb3VwLmZpbmQoZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBlbGVtZW50LmdldCgnY2xhc3NOYW1lJykgPT09ICdlZGdlLXNoYXBlJztcbiAgICB9KSB8fCBpdGVtLmdldEtleVNoYXBlKCk7XG4gICAgdmFyIHNpemUgPSBjZmcuc2l6ZTtcbiAgICBjZmcgPSB0aGlzLmdldFBhdGhQb2ludHMoY2ZnKTtcbiAgICB2YXIgc3RhcnRQb2ludCA9IGNmZy5zdGFydFBvaW50LFxuICAgICAgICBlbmRQb2ludCA9IGNmZy5lbmRQb2ludDtcbiAgICB2YXIgY29udHJvbFBvaW50cyA9IHRoaXMuZ2V0Q29udHJvbFBvaW50cyhjZmcpOyAvLyB8fCBjZmcuY29udHJvbFBvaW50cztcblxuICAgIHZhciBwb2ludHMgPSBbc3RhcnRQb2ludF07IC8vIOa3u+WKoOi1t+Wni+eCuVxuICAgIC8vIOa3u+WKoOaOp+WItueCuVxuXG4gICAgaWYgKGNvbnRyb2xQb2ludHMpIHtcbiAgICAgIHBvaW50cyA9IHBvaW50cy5jb25jYXQoY29udHJvbFBvaW50cyk7XG4gICAgfSAvLyDmt7vliqDnu5PmnZ/ngrlcblxuXG4gICAgcG9pbnRzLnB1c2goZW5kUG9pbnQpO1xuICAgIHZhciBjdXJyZW50QXR0ciA9IHNoYXBlLmF0dHIoKTtcbiAgICB2YXIgcHJldmlvdXNTdHlsZSA9IG1peCh7fSwgc3Ryb2tlU3R5bGUsIGN1cnJlbnRBdHRyLCBjZmcuc3R5bGUpO1xuICAgIHZhciBzb3VyY2UgPSBjZmcuc291cmNlTm9kZTtcbiAgICB2YXIgdGFyZ2V0ID0gY2ZnLnRhcmdldE5vZGU7XG4gICAgdmFyIHJhZGl1cyA9IHByZXZpb3VzU3R5bGUucmFkaXVzO1xuICAgIHZhciBkZWZhdWx0Um91dGVDZmcgPSB0aGlzLm9wdGlvbnMucm91dGVDZmc7XG4gICAgdmFyIHJvdXRlQ2ZnID0gbWl4KHt9LCBkZWZhdWx0Um91dGVDZmcsIGNmZy5yb3V0ZUNmZyk7XG4gICAgcm91dGVDZmcub2Zmc2V0ID0gcHJldmlvdXNTdHlsZS5vZmZzZXQ7XG4gICAgdmFyIHBhdGggPSB0aGlzLmdldFBhdGgocG9pbnRzLCBzb3VyY2UsIHRhcmdldCwgcmFkaXVzLCByb3V0ZUNmZyk7XG5cbiAgICBpZiAoaXNBcnJheShwYXRoKSAmJiBwYXRoLmxlbmd0aCA8PSAxIHx8IGlzU3RyaW5nKHBhdGgpICYmIHBhdGguaW5kZXhPZignTCcpID09PSAtMSkge1xuICAgICAgcGF0aCA9ICdNMCAwLCBMMCAwJztcbiAgICB9XG5cbiAgICBpZiAoaXNOYU4oc3RhcnRQb2ludC54KSB8fCBpc05hTihzdGFydFBvaW50LnkpIHx8IGlzTmFOKGVuZFBvaW50LngpIHx8IGlzTmFOKGVuZFBvaW50LnkpKSB7XG4gICAgICBwYXRoID0gJ00wIDAsIEwwIDAnO1xuICAgIH1cblxuICAgIGlmIChjdXJyZW50QXR0ci5lbmRBcnJvdyAmJiBwcmV2aW91c1N0eWxlLmVuZEFycm93ID09PSBmYWxzZSkge1xuICAgICAgY2ZnLnN0eWxlLmVuZEFycm93ID0ge1xuICAgICAgICBwYXRoOiAnJ1xuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAoY3VycmVudEF0dHIuc3RhcnRBcnJvdyAmJiBwcmV2aW91c1N0eWxlLnN0YXJ0QXJyb3cgPT09IGZhbHNlKSB7XG4gICAgICBjZmcuc3R5bGUuc3RhcnRBcnJvdyA9IHtcbiAgICAgICAgcGF0aDogJydcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIHN0eWxlID0gbWl4KHN0cm9rZVN0eWxlLCBzaGFwZS5hdHRyKCksIHtcbiAgICAgIGxpbmVXaWR0aDogc2l6ZSxcbiAgICAgIHBhdGg6IHBhdGhcbiAgICB9LCBjZmcuc3R5bGUpO1xuXG4gICAgaWYgKHNoYXBlKSB7XG4gICAgICBzaGFwZS5hdHRyKHN0eWxlKTtcbiAgICB9XG4gIH0sXG4gIGdldFBhdGg6IGZ1bmN0aW9uIGdldFBhdGgocG9pbnRzLCBzb3VyY2UsIHRhcmdldCwgcmFkaXVzLCByb3V0ZUNmZykge1xuICAgIHZhciBvZmZzZXQgPSByb3V0ZUNmZy5vZmZzZXQsXG4gICAgICAgIHNpbXBsZSA9IHJvdXRlQ2ZnLnNpbXBsZTsgLy8g5oyH5a6a5LqG5o6n5Yi254K5XG5cbiAgICBpZiAoIW9mZnNldCB8fCBwb2ludHMubGVuZ3RoID4gMikge1xuICAgICAgaWYgKHJhZGl1cykge1xuICAgICAgICByZXR1cm4gZ2V0UGF0aFdpdGhCb3JkZXJSYWRpdXNCeVBvbHlsaW5lKHBvaW50cywgcmFkaXVzKTtcbiAgICAgIH1cblxuICAgICAgdmFyIHBhdGhBcnJheV8xID0gW107XG4gICAgICBlYWNoKHBvaW50cywgZnVuY3Rpb24gKHBvaW50LCBpbmRleCkge1xuICAgICAgICBpZiAoaW5kZXggPT09IDApIHtcbiAgICAgICAgICBwYXRoQXJyYXlfMS5wdXNoKFsnTScsIHBvaW50LngsIHBvaW50LnldKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwYXRoQXJyYXlfMS5wdXNoKFsnTCcsIHBvaW50LngsIHBvaW50LnldKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gcGF0aEFycmF5XzE7XG4gICAgfSAvLyDmnKrmjIflrprmjqfliLbngrlcblxuXG4gICAgdmFyIHBvbHlsaW5lUG9pbnRzID0gc2ltcGxlID8gZ2V0UG9seWxpbmVQb2ludHMocG9pbnRzW3BvaW50cy5sZW5ndGggLSAxXSwgcG9pbnRzWzBdLCB0YXJnZXQsIHNvdXJjZSwgb2Zmc2V0KSA6IHBhdGhGaW5kZXIocG9pbnRzWzBdLCBwb2ludHNbcG9pbnRzLmxlbmd0aCAtIDFdLCBzb3VyY2UsIHRhcmdldCwgcm91dGVDZmcpO1xuICAgIGlmICghcG9seWxpbmVQb2ludHMgfHwgIXBvbHlsaW5lUG9pbnRzLmxlbmd0aCkgcmV0dXJuICdNMCAwLCBMMCAwJztcblxuICAgIGlmIChyYWRpdXMpIHtcbiAgICAgIHZhciByZXNfMSA9IGdldFBhdGhXaXRoQm9yZGVyUmFkaXVzQnlQb2x5bGluZShwb2x5bGluZVBvaW50cywgcmFkaXVzKTtcbiAgICAgIHJldHVybiByZXNfMTtcbiAgICB9XG5cbiAgICB2YXIgcmVzID0gVXRpbC5wb2ludHNUb1BvbHlnb24ocG9seWxpbmVQb2ludHMpO1xuICAgIHJldHVybiByZXM7XG4gIH1cbn0sICdzaW5nbGUtZWRnZScpOyIsImltcG9ydCAnLi9ub2Rlcyc7XG5pbXBvcnQgJy4vZWRnZXMnOyIsImltcG9ydCB7IEc2RXZlbnQgfSBmcm9tICdAYW50di9nNi1jb3JlJztcbmltcG9ydCBVdGlsIGZyb20gJy4uL3V0aWwnO1xudmFyIGNsb25lRXZlbnQgPSBVdGlsLmNsb25lRXZlbnQsXG4gICAgaXNOYU4gPSBVdGlsLmlzTmFOO1xudmFyIGFicyA9IE1hdGguYWJzO1xudmFyIERSQUdfT0ZGU0VUID0gMTA7XG52YXIgQUxMT1dfRVZFTlRTID0gWydzaGlmdCcsICdjdHJsJywgJ2FsdCcsICdjb250cm9sJ107XG5leHBvcnQgZGVmYXVsdCB7XG4gIGdldERlZmF1bHRDZmc6IGZ1bmN0aW9uIGdldERlZmF1bHRDZmcoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRpcmVjdGlvbjogJ2JvdGgnLFxuICAgICAgZW5hYmxlT3B0aW1pemU6IGZhbHNlLFxuICAgICAgLy8gZHJhZy1jYW52YXMg5Y+v5ouW5Yqo55qE5omp5bGV6IyD5Zu077yM6buY6K6k5Li6IDDvvIzljbPmnIDlpJrlj6/ku6Xmi5bliqjkuIDlsY/nmoTkvY3nva5cbiAgICAgIC8vIOW9k+iuvue9rueahOWAvOWkp+S6jiAwIOaXtu+8jOWNs+aLluWKqOWPr+S7pei2hei/h+S4gOWxj1xuICAgICAgLy8g5b2T6K6+572u55qE5YC85bCP5LqOIDAg5pe277yM55u45b2T5LqO57yp5bCP5LqG5Y+v5ouW5Yqo6IyD5Zu0XG4gICAgICAvLyDlhbfkvZPlrp7kvovlj6/lj4LogIPvvJpodHRwczovL2d3LmFsaXBheW9iamVjdHMuY29tL21kbi9ybXNfZjhjNmEwL2FmdHMvaW1nL0EqSUZmb1M2N19Ic3NBQUFBQUFBQUFBQUFBQVJRbkFRXG4gICAgICBzY2FsYWJsZVJhbmdlOiAwLFxuICAgICAgYWxsb3dEcmFnT25JdGVtOiBmYWxzZVxuICAgIH07XG4gIH0sXG4gIGdldEV2ZW50czogZnVuY3Rpb24gZ2V0RXZlbnRzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBkcmFnc3RhcnQ6ICdvbk1vdXNlRG93bicsXG4gICAgICBkcmFnOiAnb25Nb3VzZU1vdmUnLFxuICAgICAgZHJhZ2VuZDogJ29uTW91c2VVcCcsXG4gICAgICAnY2FudmFzOmNsaWNrJzogJ29uTW91c2VVcCcsXG4gICAgICBrZXl1cDogJ29uS2V5VXAnLFxuICAgICAgZm9jdXM6ICdvbktleVVwJyxcbiAgICAgIGtleWRvd246ICdvbktleURvd24nLFxuICAgICAgdG91Y2hzdGFydDogJ29uVG91Y2hTdGFydCcsXG4gICAgICB0b3VjaG1vdmU6ICdvblRvdWNoTW92ZScsXG4gICAgICB0b3VjaGVuZDogJ29uTW91c2VVcCdcbiAgICB9O1xuICB9LFxuICB1cGRhdGVWaWV3cG9ydDogZnVuY3Rpb24gdXBkYXRlVmlld3BvcnQoZSkge1xuICAgIHZhciBvcmlnaW4gPSB0aGlzLm9yaWdpbjtcbiAgICB2YXIgY2xpZW50WCA9ICtlLmNsaWVudFg7XG4gICAgdmFyIGNsaWVudFkgPSArZS5jbGllbnRZO1xuXG4gICAgaWYgKGlzTmFOKGNsaWVudFgpIHx8IGlzTmFOKGNsaWVudFkpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGR4ID0gY2xpZW50WCAtIG9yaWdpbi54O1xuICAgIHZhciBkeSA9IGNsaWVudFkgLSBvcmlnaW4ueTtcblxuICAgIGlmICh0aGlzLmdldCgnZGlyZWN0aW9uJykgPT09ICd4Jykge1xuICAgICAgZHkgPSAwO1xuICAgIH0gZWxzZSBpZiAodGhpcy5nZXQoJ2RpcmVjdGlvbicpID09PSAneScpIHtcbiAgICAgIGR4ID0gMDtcbiAgICB9XG5cbiAgICB0aGlzLm9yaWdpbiA9IHtcbiAgICAgIHg6IGNsaWVudFgsXG4gICAgICB5OiBjbGllbnRZXG4gICAgfTtcbiAgICB2YXIgd2lkdGggPSB0aGlzLmdyYXBoLmdldCgnd2lkdGgnKTtcbiAgICB2YXIgaGVpZ2h0ID0gdGhpcy5ncmFwaC5nZXQoJ2hlaWdodCcpO1xuICAgIHZhciBncmFwaENhbnZhc0JCb3ggPSB0aGlzLmdyYXBoLmdldCgnY2FudmFzJykuZ2V0Q2FudmFzQkJveCgpO1xuICAgIHZhciBleHBhbmRXaWR0aCA9IHRoaXMuc2NhbGFibGVSYW5nZTtcbiAgICB2YXIgZXhwYW5kSGVpZ2h0ID0gdGhpcy5zY2FsYWJsZVJhbmdlOyAvLyDoi6Ugc2NhbGFibGVSYW5nZSDmmK8gMH4xIOeahOWwj+aVsO+8jOWImeS9nOS4uuavlOS+i+iAg+iZkVxuXG4gICAgaWYgKGV4cGFuZFdpZHRoIDwgMSAmJiBleHBhbmRXaWR0aCA+IC0xKSB7XG4gICAgICBleHBhbmRXaWR0aCA9IHdpZHRoICogZXhwYW5kV2lkdGg7XG4gICAgICBleHBhbmRIZWlnaHQgPSBoZWlnaHQgKiBleHBhbmRIZWlnaHQ7XG4gICAgfVxuXG4gICAgaWYgKGdyYXBoQ2FudmFzQkJveC5taW5YIDw9IHdpZHRoICsgZXhwYW5kV2lkdGggJiYgZ3JhcGhDYW52YXNCQm94Lm1pblggKyBkeCA+IHdpZHRoICsgZXhwYW5kV2lkdGggfHwgZ3JhcGhDYW52YXNCQm94Lm1heFggKyBleHBhbmRXaWR0aCA+PSAwICYmIGdyYXBoQ2FudmFzQkJveC5tYXhYICsgZXhwYW5kV2lkdGggKyBkeCA8IDApIHtcbiAgICAgIGR4ID0gMDtcbiAgICB9XG5cbiAgICBpZiAoZ3JhcGhDYW52YXNCQm94Lm1pblkgPD0gaGVpZ2h0ICsgZXhwYW5kSGVpZ2h0ICYmIGdyYXBoQ2FudmFzQkJveC5taW5ZICsgZHkgPiBoZWlnaHQgKyBleHBhbmRIZWlnaHQgfHwgZ3JhcGhDYW52YXNCQm94Lm1heFkgKyBleHBhbmRIZWlnaHQgPj0gMCAmJiBncmFwaENhbnZhc0JCb3gubWF4WSArIGV4cGFuZEhlaWdodCArIGR5IDwgMCkge1xuICAgICAgZHkgPSAwO1xuICAgIH1cblxuICAgIHRoaXMuZ3JhcGgudHJhbnNsYXRlKGR4LCBkeSk7XG4gIH0sXG4gIG9uVG91Y2hTdGFydDogZnVuY3Rpb24gb25Ub3VjaFN0YXJ0KGUpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIHRvdWNoZXMgPSBlLm9yaWdpbmFsRXZlbnQudG91Y2hlcztcbiAgICB2YXIgZXZlbnQxID0gdG91Y2hlc1swXTtcbiAgICB2YXIgZXZlbnQyID0gdG91Y2hlc1sxXTsgLy8g5aaC5p6c5piv5Y+M5oyH5pON5L2c77yM5LiN5YWB6K645ouW5ou955S75biDXG5cbiAgICBpZiAoZXZlbnQxICYmIGV2ZW50Mikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBzZWxmLm9uTW91c2VEb3duKGUpO1xuICB9LFxuICBvbk1vdXNlRG93bjogZnVuY3Rpb24gb25Nb3VzZURvd24oZSkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgZXZlbnQgPSBlLm9yaWdpbmFsRXZlbnQ7XG5cbiAgICBpZiAoZXZlbnQgJiYgZS5uYW1lICE9PSBHNkV2ZW50LlRPVUNIU1RBUlQgJiYgZXZlbnQuYnV0dG9uICE9PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGUubmFtZSAhPT0gRzZFdmVudC5UT1VDSFNUQVJUICYmIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5ldmVudCAmJiAhd2luZG93LmV2ZW50LmJ1dHRvbnMgJiYgIXdpbmRvdy5ldmVudC5idXR0b24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuc2hvdWxkQmVnaW4uY2FsbCh0aGlzLCBlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChzZWxmLmtleWRvd24pIHJldHVybjtcbiAgICB2YXIgdGFyZ2V0ID0gZS50YXJnZXQ7XG4gICAgdmFyIHRhcmdldElzQ2FudmFzID0gdGFyZ2V0ICYmIHRhcmdldC5pc0NhbnZhcyAmJiB0YXJnZXQuaXNDYW52YXMoKTtcbiAgICBpZiAoIXRoaXMuYWxsb3dEcmFnT25JdGVtICYmICF0YXJnZXRJc0NhbnZhcykgcmV0dXJuO1xuICAgIHNlbGYub3JpZ2luID0ge1xuICAgICAgeDogZS5jbGllbnRYLFxuICAgICAgeTogZS5jbGllbnRZXG4gICAgfTtcbiAgICBzZWxmLmRyYWdnaW5nID0gZmFsc2U7XG5cbiAgICBpZiAodGhpcy5lbmFibGVPcHRpbWl6ZSkge1xuICAgICAgLy8g5ouW5YqoIGNhbnZhcyDov4fnqIvkuK3pmpDol4/miYDmnInnmoTovrnlj4psYWJlbFxuICAgICAgdmFyIGdyYXBoID0gdGhpcy5ncmFwaDtcbiAgICAgIHZhciBlZGdlcyA9IGdyYXBoLmdldEVkZ2VzKCk7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBlZGdlcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICB2YXIgc2hhcGVzID0gZWRnZXNbaV0uZ2V0KCdncm91cCcpLmdldCgnY2hpbGRyZW4nKTtcbiAgICAgICAgaWYgKCFzaGFwZXMpIGNvbnRpbnVlO1xuICAgICAgICBzaGFwZXMuZm9yRWFjaChmdW5jdGlvbiAoc2hhcGUpIHtcbiAgICAgICAgICBzaGFwZS5zZXQoJ29yaS12aXNpYmlsaXR5Jywgc2hhcGUuZ2V0KCdvcmktdmlzaWJpbGl0eScpIHx8IHNoYXBlLmdldCgndmlzaWJsZScpKTtcbiAgICAgICAgICBzaGFwZS5oaWRlKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICB2YXIgbm9kZXMgPSBncmFwaC5nZXROb2RlcygpO1xuXG4gICAgICBmb3IgKHZhciBqID0gMCwgbm9kZUxlbiA9IG5vZGVzLmxlbmd0aDsgaiA8IG5vZGVMZW47IGorKykge1xuICAgICAgICB2YXIgY29udGFpbmVyID0gbm9kZXNbal0uZ2V0Q29udGFpbmVyKCk7XG4gICAgICAgIHZhciBjaGlsZHJlbiA9IGNvbnRhaW5lci5nZXQoJ2NoaWxkcmVuJyk7XG5cbiAgICAgICAgZm9yICh2YXIgX2kgPSAwLCBjaGlsZHJlbl8xID0gY2hpbGRyZW47IF9pIDwgY2hpbGRyZW5fMS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICB2YXIgY2hpbGQgPSBjaGlsZHJlbl8xW19pXTtcbiAgICAgICAgICB2YXIgaXNLZXlTaGFwZSA9IGNoaWxkLmdldCgnaXNLZXlTaGFwZScpO1xuXG4gICAgICAgICAgaWYgKCFpc0tleVNoYXBlKSB7XG4gICAgICAgICAgICBjaGlsZC5zZXQoJ29yaS12aXNpYmlsaXR5JywgY2hpbGQuZ2V0KCdvcmktdmlzaWJpbGl0eScpIHx8IGNoaWxkLmdldCgndmlzaWJsZScpKTtcbiAgICAgICAgICAgIGNoaWxkLmhpZGUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIG9uVG91Y2hNb3ZlOiBmdW5jdGlvbiBvblRvdWNoTW92ZShlKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciB0b3VjaGVzID0gZS5vcmlnaW5hbEV2ZW50LnRvdWNoZXM7XG4gICAgdmFyIGV2ZW50MSA9IHRvdWNoZXNbMF07XG4gICAgdmFyIGV2ZW50MiA9IHRvdWNoZXNbMV07IC8vIOWmguaenOaYr+WPjOaMh+aTjeS9nO+8jOS4jeWFgeiuuOaLluaLveeUu+W4g++8jOe7k+adn+aLluaLvVxuXG4gICAgaWYgKGV2ZW50MSAmJiBldmVudDIpIHtcbiAgICAgIHRoaXMub25Nb3VzZVVwKGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBzZWxmLm9uTW91c2VNb3ZlKGUpO1xuICB9LFxuICBvbk1vdXNlTW92ZTogZnVuY3Rpb24gb25Nb3VzZU1vdmUoZSkge1xuICAgIHZhciBncmFwaCA9IHRoaXMuZ3JhcGg7XG4gICAgaWYgKHRoaXMua2V5ZG93bikgcmV0dXJuO1xuICAgIHZhciB0YXJnZXQgPSBlLnRhcmdldDtcbiAgICB2YXIgdGFyZ2V0SXNDYW52YXMgPSB0YXJnZXQgJiYgdGFyZ2V0LmlzQ2FudmFzICYmIHRhcmdldC5pc0NhbnZhcygpO1xuICAgIGlmICghdGhpcy5hbGxvd0RyYWdPbkl0ZW0gJiYgIXRhcmdldElzQ2FudmFzKSByZXR1cm47XG4gICAgZSA9IGNsb25lRXZlbnQoZSk7XG5cbiAgICBpZiAoIXRoaXMub3JpZ2luKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmRyYWdnaW5nKSB7XG4gICAgICBpZiAoYWJzKHRoaXMub3JpZ2luLnggLSBlLmNsaWVudFgpICsgYWJzKHRoaXMub3JpZ2luLnkgLSBlLmNsaWVudFkpIDwgRFJBR19PRkZTRVQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5zaG91bGRCZWdpbi5jYWxsKHRoaXMsIGUpKSB7XG4gICAgICAgIGUudHlwZSA9ICdkcmFnc3RhcnQnO1xuICAgICAgICBncmFwaC5lbWl0KCdjYW52YXM6ZHJhZ3N0YXJ0JywgZSk7XG4gICAgICAgIHRoaXMub3JpZ2luUG9zaXRpb24gPSB7XG4gICAgICAgICAgeDogZS5jbGllbnRYLFxuICAgICAgICAgIHk6IGUuY2xpZW50WVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmRyYWdnaW5nID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZS50eXBlID0gJ2RyYWcnO1xuICAgICAgZ3JhcGguZW1pdCgnY2FudmFzOmRyYWcnLCBlKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zaG91bGRVcGRhdGUuY2FsbCh0aGlzLCBlKSkge1xuICAgICAgdGhpcy51cGRhdGVWaWV3cG9ydChlKTtcbiAgICB9XG4gIH0sXG4gIG9uTW91c2VVcDogZnVuY3Rpb24gb25Nb3VzZVVwKGUpIHtcbiAgICB2YXIgX2EsIF9iO1xuXG4gICAgdmFyIGdyYXBoID0gdGhpcy5ncmFwaDtcbiAgICBpZiAodGhpcy5rZXlkb3duKSByZXR1cm47XG4gICAgdmFyIGN1cnJlbnRab29tID0gZ3JhcGguZ2V0Wm9vbSgpO1xuICAgIHZhciBtb2RlQ29udHJvbGxlciA9IGdyYXBoLmdldCgnbW9kZUNvbnRyb2xsZXInKTtcbiAgICB2YXIgem9vbUNhbnZhcyA9IChfYiA9IChfYSA9IG1vZGVDb250cm9sbGVyID09PSBudWxsIHx8IG1vZGVDb250cm9sbGVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBtb2RlQ29udHJvbGxlci5tb2Rlc1ttb2RlQ29udHJvbGxlci5tb2RlXSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmZpbHRlcihmdW5jdGlvbiAoYmVoYXZpb3IpIHtcbiAgICAgIHJldHVybiBiZWhhdmlvci50eXBlID09PSAnem9vbS1jYW52YXMnO1xuICAgIH0pKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2JbMF07XG4gICAgdmFyIG9wdGltaXplWm9vbSA9IHpvb21DYW52YXMgPyB6b29tQ2FudmFzLm9wdGltaXplWm9vbSB8fCAwLjEgOiAwO1xuXG4gICAgaWYgKHRoaXMuZW5hYmxlT3B0aW1pemUpIHtcbiAgICAgIC8vIOaLluWKqOe7k+adn+WQjuaYvuekuuaJgOacieeahOi+uVxuICAgICAgdmFyIGVkZ2VzID0gZ3JhcGguZ2V0RWRnZXMoKTtcblxuICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGVkZ2VzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIHZhciBzaGFwZXMgPSBlZGdlc1tpXS5nZXQoJ2dyb3VwJykuZ2V0KCdjaGlsZHJlbicpO1xuICAgICAgICBpZiAoIXNoYXBlcykgY29udGludWU7XG4gICAgICAgIHNoYXBlcy5mb3JFYWNoKGZ1bmN0aW9uIChzaGFwZSkge1xuICAgICAgICAgIHZhciBvcmlWaXMgPSBzaGFwZS5nZXQoJ29yaS12aXNpYmlsaXR5Jyk7XG4gICAgICAgICAgaWYgKG9yaVZpcykgc2hhcGUuc2hvdygpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGN1cnJlbnRab29tID4gb3B0aW1pemVab29tKSB7XG4gICAgICAgIHZhciBub2RlcyA9IGdyYXBoLmdldE5vZGVzKCk7XG5cbiAgICAgICAgZm9yICh2YXIgaiA9IDAsIG5vZGVMZW4gPSBub2Rlcy5sZW5ndGg7IGogPCBub2RlTGVuOyBqKyspIHtcbiAgICAgICAgICB2YXIgY29udGFpbmVyID0gbm9kZXNbal0uZ2V0Q29udGFpbmVyKCk7XG4gICAgICAgICAgdmFyIGNoaWxkcmVuID0gY29udGFpbmVyLmdldCgnY2hpbGRyZW4nKTtcblxuICAgICAgICAgIGZvciAodmFyIF9pID0gMCwgY2hpbGRyZW5fMiA9IGNoaWxkcmVuOyBfaSA8IGNoaWxkcmVuXzIubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICB2YXIgY2hpbGQgPSBjaGlsZHJlbl8yW19pXTtcbiAgICAgICAgICAgIHZhciBpc0tleVNoYXBlID0gY2hpbGQuZ2V0KCdpc0tleVNoYXBlJyk7XG5cbiAgICAgICAgICAgIGlmICghaXNLZXlTaGFwZSkge1xuICAgICAgICAgICAgICB2YXIgb3JpVmlzID0gY2hpbGQuZ2V0KCdvcmktdmlzaWJpbGl0eScpO1xuICAgICAgICAgICAgICBpZiAob3JpVmlzKSBjaGlsZC5zaG93KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmRyYWdnaW5nKSB7XG4gICAgICB0aGlzLm9yaWdpbiA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZSA9IGNsb25lRXZlbnQoZSk7XG5cbiAgICBpZiAodGhpcy5zaG91bGRFbmQuY2FsbCh0aGlzLCBlKSkge1xuICAgICAgdGhpcy51cGRhdGVWaWV3cG9ydChlKTtcbiAgICB9XG5cbiAgICBlLnR5cGUgPSAnZHJhZ2VuZCc7XG4gICAgZS5keCA9IGUuY2xpZW50WCAtIHRoaXMub3JpZ2luUG9zaXRpb24ueDtcbiAgICBlLmR5ID0gZS5jbGllbnRZIC0gdGhpcy5vcmlnaW5Qb3NpdGlvbi55O1xuICAgIGdyYXBoLmVtaXQoJ2NhbnZhczpkcmFnZW5kJywgZSk7XG4gICAgdGhpcy5lbmREcmFnKCk7XG4gIH0sXG4gIGVuZERyYWc6IGZ1bmN0aW9uIGVuZERyYWcoKSB7XG4gICAgdGhpcy5vcmlnaW4gPSBudWxsO1xuICAgIHRoaXMuZHJhZ2dpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmRyYWdiZWdpbiA9IGZhbHNlO1xuICB9LFxuICBvbktleURvd246IGZ1bmN0aW9uIG9uS2V5RG93bihlKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBjb2RlID0gZS5rZXk7XG5cbiAgICBpZiAoIWNvZGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoQUxMT1dfRVZFTlRTLmluZGV4T2YoY29kZS50b0xvd2VyQ2FzZSgpKSA+IC0xKSB7XG4gICAgICBzZWxmLmtleWRvd24gPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZWxmLmtleWRvd24gPSBmYWxzZTtcbiAgICB9XG4gIH0sXG4gIG9uS2V5VXA6IGZ1bmN0aW9uIG9uS2V5VXAoKSB7XG4gICAgdGhpcy5rZXlkb3duID0gZmFsc2U7XG4gICAgdGhpcy5vcmlnaW4gPSBudWxsO1xuICAgIHRoaXMuZHJhZ2dpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmRyYWdiZWdpbiA9IGZhbHNlO1xuICB9XG59OyIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBkZWVwTWl4LCBjbG9uZSwgZGVib3VuY2UgfSBmcm9tICdAYW50di91dGlsJztcbmltcG9ydCBHbG9iYWwgZnJvbSAnLi4vZ2xvYmFsJztcbmV4cG9ydCBkZWZhdWx0IHtcbiAgZ2V0RGVmYXVsdENmZzogZnVuY3Rpb24gZ2V0RGVmYXVsdENmZygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdXBkYXRlRWRnZTogdHJ1ZSxcbiAgICAgIGRlbGVnYXRlU3R5bGU6IHt9LFxuICAgICAgLy8g5piv5ZCm5byA5ZCvZGVsZWdhdGVcbiAgICAgIGVuYWJsZURlbGVnYXRlOiBmYWxzZSxcbiAgICAgIC8vIOaLluWKqOiKgueCuei/h+eoi+S4reaYr+WQpuWPquaUueWPmCBDb21ibyDnmoTlpKflsI/vvIzogIzkuI3mlLnlj5jlhbbnu5PmnoRcbiAgICAgIG9ubHlDaGFuZ2VDb21ib1NpemU6IGZhbHNlLFxuICAgICAgLy8g5ouW5Yqo6L+H56iL5Lit55uu5qCHIGNvbWJvIOeKtuaAgeagt+W8j1xuICAgICAgY29tYm9BY3RpdmVTdGF0ZTogJycsXG4gICAgICBzZWxlY3RlZFN0YXRlOiAnc2VsZWN0ZWQnLFxuICAgICAgZW5hYmxlT3B0aW1pemU6IGZhbHNlLFxuICAgICAgZW5hYmxlRGVib3VuY2U6IGZhbHNlLFxuICAgICAgZW5hYmxlU3RhY2s6IHRydWVcbiAgICB9O1xuICB9LFxuICBnZXRFdmVudHM6IGZ1bmN0aW9uIGdldEV2ZW50cygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgJ25vZGU6ZHJhZ3N0YXJ0JzogJ29uRHJhZ1N0YXJ0JyxcbiAgICAgICdub2RlOmRyYWcnOiAnb25EcmFnJyxcbiAgICAgICdub2RlOmRyYWdlbmQnOiAnb25EcmFnRW5kJyxcbiAgICAgICdjb21ibzpkcmFnZW50ZXInOiAnb25EcmFnRW50ZXInLFxuICAgICAgJ2NvbWJvOmRyYWdsZWF2ZSc6ICdvbkRyYWdMZWF2ZScsXG4gICAgICAnY29tYm86ZHJvcCc6ICdvbkRyb3BDb21ibycsXG4gICAgICAnbm9kZTpkcm9wJzogJ29uRHJvcE5vZGUnLFxuICAgICAgJ2NhbnZhczpkcm9wJzogJ29uRHJvcENhbnZhcycsXG4gICAgICAndG91Y2hzdGFydCc6ICdvblRvdWNoU3RhcnQnLFxuICAgICAgJ3RvdWNobW92ZSc6ICdvblRvdWNoTW92ZScsXG4gICAgICAndG91Y2hlbmQnOiAnb25EcmFnRW5kJ1xuICAgIH07XG4gIH0sXG4gIHZhbGlkYXRpb25Db21ibzogZnVuY3Rpb24gdmFsaWRhdGlvbkNvbWJvKGl0ZW0pIHtcbiAgICBpZiAoIXRoaXMub3JpZ2luIHx8ICFpdGVtIHx8IGl0ZW0uZGVzdHJveWVkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdmFyIHR5cGUgPSBpdGVtLmdldFR5cGUoKTtcblxuICAgIGlmICh0eXBlICE9PSAnY29tYm8nKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIG9uVG91Y2hTdGFydDogZnVuY3Rpb24gb25Ub3VjaFN0YXJ0KGUpIHtcbiAgICBpZiAoIWUuaXRlbSkgcmV0dXJuO1xuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgIHRyeSB7XG4gICAgICB2YXIgdG91Y2hlcyA9IGUub3JpZ2luYWxFdmVudC50b3VjaGVzO1xuICAgICAgdmFyIGV2ZW50MSA9IHRvdWNoZXNbMF07XG4gICAgICB2YXIgZXZlbnQyID0gdG91Y2hlc1sxXTtcblxuICAgICAgaWYgKGV2ZW50MSAmJiBldmVudDIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS53YXJuKCdUb3VjaCBvcmlnaW5hbCBldmVudCBub3QgZXhpc3QhJyk7XG4gICAgfVxuXG4gICAgc2VsZi5vbkRyYWdTdGFydChlKTtcbiAgfSxcbiAgb25Ub3VjaE1vdmU6IGZ1bmN0aW9uIG9uVG91Y2hNb3ZlKGUpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICB0cnkge1xuICAgICAgdmFyIHRvdWNoZXMgPSBlLm9yaWdpbmFsRXZlbnQudG91Y2hlcztcbiAgICAgIHZhciBldmVudDEgPSB0b3VjaGVzWzBdO1xuICAgICAgdmFyIGV2ZW50MiA9IHRvdWNoZXNbMV07XG5cbiAgICAgIGlmIChldmVudDEgJiYgZXZlbnQyKSB7XG4gICAgICAgIHNlbGYub25EcmFnRW5kKGUpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1RvdWNoIG9yaWdpbmFsIGV2ZW50IG5vdCBleGlzdCEnKTtcbiAgICB9XG5cbiAgICBzZWxmLm9uRHJhZyhlKTtcbiAgfSxcblxuICAvKipcbiAgICog5byA5aeL5ouW5Yqo6IqC54K5XG4gICAqIEBwYXJhbSBldnRcbiAgICovXG4gIG9uRHJhZ1N0YXJ0OiBmdW5jdGlvbiBvbkRyYWdTdGFydChldnQpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdGhpcy5jdXJyZW50U2hvdWxkRW5kID0gdHJ1ZTtcblxuICAgIGlmICghdGhpcy5zaG91bGRCZWdpbi5jYWxsKHRoaXMsIGV2dCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgaXRlbSA9IGV2dC5pdGVtO1xuXG4gICAgaWYgKCFpdGVtIHx8IGl0ZW0uZGVzdHJveWVkIHx8IGl0ZW0uaGFzTG9ja2VkKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIOaLluWKqOaXtu+8jOiuvue9ruaLluWKqOWFg+e0oOeahCBjYXB0dXJlIOS4umZhbHNl77yM5YiZ5LiN5ou+5Y+W5ouW5Yqo55qE5YWD57SgXG5cblxuICAgIHZhciBncm91cCA9IGl0ZW0uZ2V0Q29udGFpbmVyKCk7XG4gICAgZ3JvdXAuc2V0KCdjYXB0dXJlJywgZmFsc2UpO1xuICAgIGlmICghdGhpcy5jYWNoZWRDYXB0dXJlSXRlbXMpIHRoaXMuY2FjaGVkQ2FwdHVyZUl0ZW1zID0gW107XG4gICAgdGhpcy5jYWNoZWRDYXB0dXJlSXRlbXMucHVzaChpdGVtKTsgLy8g5aaC5p6c5ouW5Yqo55qEdGFyZ2V0IOaYr2xpbmtQb2ludHMgLyBhbmNob3JQb2ludHMg5YiZ5LiN5YWB6K645ouW5YqoXG5cbiAgICB2YXIgdGFyZ2V0ID0gZXZ0LnRhcmdldDtcblxuICAgIGlmICh0YXJnZXQpIHtcbiAgICAgIHZhciBpc0FuY2hvclBvaW50ID0gdGFyZ2V0LmdldCgnaXNBbmNob3JQb2ludCcpO1xuXG4gICAgICBpZiAoaXNBbmNob3JQb2ludCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGdyYXBoID0gdGhpcy5ncmFwaDtcbiAgICB0aGlzLnRhcmdldHMgPSBbXTsgLy8g5bCG6IqC54K55ouW5YWl5Yiw5oyH5a6a55qEIENvbWJvXG5cbiAgICB0aGlzLnRhcmdldENvbWJvID0gbnVsbDsgLy8g6I635Y+W5omA5pyJ6YCJ5Lit55qE5YWD57SgXG5cbiAgICB2YXIgbm9kZXMgPSBncmFwaC5maW5kQWxsQnlTdGF0ZSgnbm9kZScsIHRoaXMuc2VsZWN0ZWRTdGF0ZSk7XG4gICAgdmFyIGN1cnJlbnROb2RlSWQgPSBpdGVtLmdldCgnaWQnKTsgLy8g5b2T5YmN5ouW5Yqo55qE6IqC54K55piv5ZCm5piv6YCJ5Lit55qE6IqC54K5XG5cbiAgICB2YXIgZHJhZ05vZGVzID0gbm9kZXMuZmlsdGVyKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICB2YXIgbm9kZUlkID0gbm9kZS5nZXQoJ2lkJyk7XG4gICAgICByZXR1cm4gY3VycmVudE5vZGVJZCA9PT0gbm9kZUlkO1xuICAgIH0pOyAvLyDlj6rmi5bliqjlvZPliY3oioLngrlcblxuICAgIGlmIChkcmFnTm9kZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLnRhcmdldHMucHVzaChpdGVtKTtcbiAgICB9IGVsc2UgaWYgKG5vZGVzLmxlbmd0aCA+IDEpIHtcbiAgICAgIC8vIOaLluWKqOWkmuS4quiKgueCuVxuICAgICAgbm9kZXMuZm9yRWFjaChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICB2YXIgbG9ja2VkID0gbm9kZS5oYXNMb2NrZWQoKTtcblxuICAgICAgICBpZiAoIWxvY2tlZCkge1xuICAgICAgICAgIF90aGlzLnRhcmdldHMucHVzaChub2RlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudGFyZ2V0cy5wdXNoKGl0ZW0pO1xuICAgIH1cblxuICAgIHZhciBiZWZvcmVEcmFnTm9kZXMgPSBbXTtcbiAgICB0aGlzLnRhcmdldHMuZm9yRWFjaChmdW5jdGlvbiAodCkge1xuICAgICAgYmVmb3JlRHJhZ05vZGVzLnB1c2goY2xvbmUodC5nZXRNb2RlbCgpKSk7XG4gICAgfSk7XG4gICAgdGhpcy5zZXQoJ2JlZm9yZURyYWdOb2RlcycsIGJlZm9yZURyYWdOb2Rlcyk7XG4gICAgdGhpcy5oaWRlbkVkZ2UgPSB7fTtcblxuICAgIGlmICh0aGlzLmdldCgndXBkYXRlRWRnZScpICYmIHRoaXMuZW5hYmxlT3B0aW1pemUgJiYgIXRoaXMuZW5hYmxlRGVsZWdhdGUpIHtcbiAgICAgIHRoaXMudGFyZ2V0cy5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgIHZhciBlZGdlcyA9IG5vZGUuZ2V0RWRnZXMoKTtcbiAgICAgICAgZWRnZXMuZm9yRWFjaChmdW5jdGlvbiAoZWRnZSkge1xuICAgICAgICAgIGlmICghZWRnZS5pc1Zpc2libGUoKSkgcmV0dXJuO1xuICAgICAgICAgIF90aGlzLmhpZGVuRWRnZVtlZGdlLmdldElEKCldID0gdHJ1ZTtcbiAgICAgICAgICBlZGdlLmhpZGUoKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLm9yaWdpbiA9IHtcbiAgICAgIHg6IGV2dC54LFxuICAgICAgeTogZXZ0LnlcbiAgICB9O1xuICAgIHRoaXMucG9pbnQgPSB7fTtcbiAgICB0aGlzLm9yaWdpblBvaW50ID0ge307XG4gIH0sXG5cbiAgLyoqXG4gICAqIOaMgee7reaLluWKqOiKgueCuVxuICAgKiBAcGFyYW0gZXZ0XG4gICAqL1xuICBvbkRyYWc6IGZ1bmN0aW9uIG9uRHJhZyhldnQpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgaWYgKCF0aGlzLm9yaWdpbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5zaG91bGRVcGRhdGUuY2FsbCh0aGlzLCBldnQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZ2V0KCdlbmFibGVEZWxlZ2F0ZScpKSB7XG4gICAgICB0aGlzLnVwZGF0ZURlbGVnYXRlKGV2dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLmVuYWJsZURlYm91bmNlKSB0aGlzLmRlYm91bmNlVXBkYXRlKHtcbiAgICAgICAgdGFyZ2V0czogdGhpcy50YXJnZXRzLFxuICAgICAgICBncmFwaDogdGhpcy5ncmFwaCxcbiAgICAgICAgcG9pbnQ6IHRoaXMucG9pbnQsXG4gICAgICAgIG9yaWdpbjogdGhpcy5vcmlnaW4sXG4gICAgICAgIGV2dDogZXZ0LFxuICAgICAgICB1cGRhdGVFZGdlOiB0aGlzLmdldCgndXBkYXRlRWRnZScpXG4gICAgICB9KTtlbHNlIHRoaXMudGFyZ2V0cy5tYXAoZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgICBfdGhpcy51cGRhdGUodGFyZ2V0LCBldnQpO1xuICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiDmi5bliqjnu5PmnZ/vvIzorr7nva7mi5bliqjlhYPntKBjYXB0dXJl5Li6dHJ1Ze+8jOabtOaWsOWFg+e0oOS9jee9ru+8jOWmguaenOaYr+aLluWKqOa2ieWPiuWIsCBjb21ib++8jOWImeabtOaWsCBjb21ibyDnu5PmnoRcbiAgICogQHBhcmFtIGV2dFxuICAgKi9cbiAgb25EcmFnRW5kOiBmdW5jdGlvbiBvbkRyYWdFbmQoZXZ0KSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHZhciBfYTtcblxuICAgIGlmICghdGhpcy5vcmlnaW4pIHtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIOaLluWKqOe7k+adn+WQju+8jOiuvue9ruaLluWKqOWFg+e0oCBncm91cCDnmoQgY2FwdHVyZSDkuLogdHJ1Ze+8jOWFgeiuuOaLvuWPluaLluWKqOWFg+e0oFxuXG5cbiAgICAoX2EgPSB0aGlzLmNhY2hlZENhcHR1cmVJdGVtcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIHZhciBncm91cCA9IGl0ZW0uZ2V0Q29udGFpbmVyKCk7XG4gICAgICBncm91cC5zZXQoJ2NhcHR1cmUnLCB0cnVlKTtcbiAgICB9KTtcbiAgICB0aGlzLmNhY2hlZENhcHR1cmVJdGVtcyA9IFtdO1xuXG4gICAgaWYgKHRoaXMuZGVsZWdhdGVSZWN0KSB7XG4gICAgICB0aGlzLmRlbGVnYXRlUmVjdC5yZW1vdmUoKTtcbiAgICAgIHRoaXMuZGVsZWdhdGVSZWN0ID0gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5nZXQoJ3VwZGF0ZUVkZ2UnKSAmJiB0aGlzLmVuYWJsZU9wdGltaXplICYmICF0aGlzLmVuYWJsZURlbGVnYXRlKSB7XG4gICAgICB0aGlzLnRhcmdldHMuZm9yRWFjaChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICB2YXIgZWRnZXMgPSBub2RlLmdldEVkZ2VzKCk7XG4gICAgICAgIGVkZ2VzLmZvckVhY2goZnVuY3Rpb24gKGVkZ2UpIHtcbiAgICAgICAgICBpZiAoX3RoaXMuaGlkZW5FZGdlW2VkZ2UuZ2V0SUQoKV0pIGVkZ2Uuc2hvdygpO1xuICAgICAgICAgIGVkZ2UucmVmcmVzaCgpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuaGlkZW5FZGdlID0ge307XG4gICAgdmFyIGdyYXBoID0gdGhpcy5ncmFwaDsgLy8g5ouW5Yqo57uT5p2f5ZCO77yM5YWl5qCIXG5cbiAgICBpZiAoZ3JhcGguZ2V0KCdlbmFibGVkU3RhY2snKSAmJiB0aGlzLmVuYWJsZVN0YWNrKSB7XG4gICAgICB2YXIgc3RhY2tEYXRhXzEgPSB7XG4gICAgICAgIGJlZm9yZToge1xuICAgICAgICAgIG5vZGVzOiBbXSxcbiAgICAgICAgICBlZGdlczogW10sXG4gICAgICAgICAgY29tYm9zOiBbXVxuICAgICAgICB9LFxuICAgICAgICBhZnRlcjoge1xuICAgICAgICAgIG5vZGVzOiBbXSxcbiAgICAgICAgICBlZGdlczogW10sXG4gICAgICAgICAgY29tYm9zOiBbXVxuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgdGhpcy5nZXQoJ2JlZm9yZURyYWdOb2RlcycpLmZvckVhY2goZnVuY3Rpb24gKG1vZGVsKSB7XG4gICAgICAgIHN0YWNrRGF0YV8xLmJlZm9yZS5ub2Rlcy5wdXNoKHtcbiAgICAgICAgICBpZDogbW9kZWwuaWQsXG4gICAgICAgICAgeDogbW9kZWwueCxcbiAgICAgICAgICB5OiBtb2RlbC55XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICB0aGlzLnRhcmdldHMuZm9yRWFjaChmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICAgIHZhciB0YXJnZXRNb2RlbCA9IHRhcmdldC5nZXRNb2RlbCgpO1xuICAgICAgICBzdGFja0RhdGFfMS5hZnRlci5ub2Rlcy5wdXNoKHtcbiAgICAgICAgICBpZDogdGFyZ2V0TW9kZWwuaWQsXG4gICAgICAgICAgeDogdGFyZ2V0TW9kZWwueCxcbiAgICAgICAgICB5OiB0YXJnZXRNb2RlbC55XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICBncmFwaC5wdXNoU3RhY2soJ3VwZGF0ZScsIGNsb25lKHN0YWNrRGF0YV8xKSk7XG4gICAgfSAvLyDmi5bliqjnu5PmnZ/lkI5lbWl05LqL5Lu277yM5bCG5b2T5YmN5pON5L2c55qE6IqC54K55oqb5Ye65Y6777yM55uu5qCH6IqC54K55Li6bnVsbFxuXG5cbiAgICBncmFwaC5lbWl0KCdkcmFnbm9kZWVuZCcsIHtcbiAgICAgIGl0ZW1zOiB0aGlzLnRhcmdldHMsXG4gICAgICB0YXJnZXRJdGVtOiBudWxsXG4gICAgfSk7XG4gICAgdGhpcy5wb2ludCA9IHt9O1xuICAgIHRoaXMub3JpZ2luID0gbnVsbDtcbiAgICB0aGlzLm9yaWdpblBvaW50ID0ge307XG4gICAgdGhpcy50YXJnZXRzLmxlbmd0aCA9IDA7XG4gICAgdGhpcy50YXJnZXRDb21ibyA9IG51bGw7XG4gIH0sXG5cbiAgLyoqXG4gICAqIOaLluWKqOi/h+eoi+S4reWwhuiKgueCueaUvue9ruWIsCBjb21ibyDkuIpcbiAgICogQHBhcmFtIGV2dFxuICAgKi9cbiAgb25Ecm9wQ29tYm86IGZ1bmN0aW9uIG9uRHJvcENvbWJvKGV2dCkge1xuICAgIHZhciBpdGVtID0gZXZ0Lml0ZW07XG4gICAgdGhpcy5jdXJyZW50U2hvdWxkRW5kID0gdGhpcy5zaG91bGRFbmQuY2FsbCh0aGlzLCBldnQsIGl0ZW0pOyAvLyDoi6XkuI3lhYHorrjnu5PmnZ/vvIzliJnlsIboioLngrnkvY3nva7orr7nva7lm57liJ3or4bkvY3nva7jgILlkI7pnaLnmoTpgLvovpHku43pnIDopoHmiafooYxcblxuICAgIHRoaXMudXBkYXRlUG9zaXRpb25zKGV2dCwgIXRoaXMuY3VycmVudFNob3VsZEVuZCk7XG4gICAgaWYgKCF0aGlzLmN1cnJlbnRTaG91bGRFbmQgfHwgIXRoaXMudmFsaWRhdGlvbkNvbWJvKGl0ZW0pKSByZXR1cm47XG4gICAgdmFyIGdyYXBoID0gdGhpcy5ncmFwaDtcblxuICAgIGlmICh0aGlzLmNvbWJvQWN0aXZlU3RhdGUpIHtcbiAgICAgIGdyYXBoLnNldEl0ZW1TdGF0ZShpdGVtLCB0aGlzLmNvbWJvQWN0aXZlU3RhdGUsIGZhbHNlKTtcbiAgICB9XG5cbiAgICB0aGlzLnRhcmdldENvbWJvID0gaXRlbTsgLy8g5ouW5Yqo57uT5p2f5ZCO5piv5Yqo5oCB5pS55Y+YIENvbWJvIOWkp+Wwj+i/mOaYr+WwhuiKgueCueS7jiBDb21ibyDkuK3liKDpmaRcblxuICAgIGlmICh0aGlzLm9ubHlDaGFuZ2VDb21ib1NpemUpIHtcbiAgICAgIC8vIOaLluWKqOiKgueCuee7k+adn+WQju+8jOWKqOaAgeaUueWPmCBDb21ibyDnmoTlpKflsI9cbiAgICAgIGdyYXBoLnVwZGF0ZUNvbWJvcygpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgdGFyZ2V0Q29tYm9Nb2RlbF8xID0gaXRlbS5nZXRNb2RlbCgpO1xuICAgICAgdGhpcy50YXJnZXRzLm1hcChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICB2YXIgbm9kZU1vZGVsID0gbm9kZS5nZXRNb2RlbCgpO1xuXG4gICAgICAgIGlmIChub2RlTW9kZWwuY29tYm9JZCAhPT0gdGFyZ2V0Q29tYm9Nb2RlbF8xLmlkKSB7XG4gICAgICAgICAgZ3JhcGgudXBkYXRlQ29tYm9UcmVlKG5vZGUsIHRhcmdldENvbWJvTW9kZWxfMS5pZCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgZ3JhcGgudXBkYXRlQ29tYm8oaXRlbSk7XG4gICAgfSAvLyDlsIboioLngrnmi5bliqjliLAgY29tYm8g5LiK6Z2i77yMZW1pdOS6i+S7tuaKm+WHuuW9k+WJjeaTjeS9nOeahOiKgueCueWPiuebruaghyBjb21ib1xuXG5cbiAgICBncmFwaC5lbWl0KCdkcmFnbm9kZWVuZCcsIHtcbiAgICAgIGl0ZW1zOiB0aGlzLnRhcmdldHMsXG4gICAgICB0YXJnZXRJdGVtOiB0aGlzLnRhcmdldENvbWJvXG4gICAgfSk7XG4gIH0sXG4gIG9uRHJvcENhbnZhczogZnVuY3Rpb24gb25Ecm9wQ2FudmFzKGV2dCkge1xuICAgIHZhciBncmFwaCA9IHRoaXMuZ3JhcGg7XG4gICAgdGhpcy5jdXJyZW50U2hvdWxkRW5kID0gdGhpcy5zaG91bGRFbmQuY2FsbCh0aGlzLCBldnQsIHVuZGVmaW5lZCk7IC8vIOiLpeS4jeWFgeiuuOe7k+adn++8jOWImeWwhuiKgueCueS9jee9ruiuvue9ruWbnuWIneivhuS9jee9ruOAguWQjumdoueahOmAu+i+keS7jemcgOimgeaJp+ihjFxuXG4gICAgdGhpcy51cGRhdGVQb3NpdGlvbnMoZXZ0LCAhdGhpcy5jdXJyZW50U2hvdWxkRW5kKTtcbiAgICBpZiAoIXRoaXMudGFyZ2V0cyB8fCB0aGlzLnRhcmdldHMubGVuZ3RoID09PSAwIHx8ICF0aGlzLmN1cnJlbnRTaG91bGRFbmQpIHJldHVybjtcblxuICAgIGlmICh0aGlzLm9ubHlDaGFuZ2VDb21ib1NpemUpIHtcbiAgICAgIC8vIOaLluWKqOiKgueCuee7k+adn+WQju+8jOWKqOaAgeaUueWPmCBDb21ibyDnmoTlpKflsI9cbiAgICAgIGdyYXBoLnVwZGF0ZUNvbWJvcygpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnRhcmdldHMubWFwKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgIC8vIOaLluWKqOeahOiKgueCueaciSBjb21ib0lk77yM5Y2z5piv5LuO5YW25LuWIGNvbWJvIOS4reaLluWHuuaXtuaJjeWkhOeQhlxuICAgICAgICB2YXIgbW9kZWwgPSBub2RlLmdldE1vZGVsKCk7XG5cbiAgICAgICAgaWYgKG1vZGVsLmNvbWJvSWQpIHtcbiAgICAgICAgICBncmFwaC51cGRhdGVDb21ib1RyZWUobm9kZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICog5ouW5Yqo5pS+572u5Yiw5p+Q5LiqIGNvbWJvIOS4reeahOWtkCBub2RlIOS4ilxuICAgKiBAcGFyYW0gZXZ0XG4gICAqL1xuICBvbkRyb3BOb2RlOiBmdW5jdGlvbiBvbkRyb3BOb2RlKGV2dCkge1xuICAgIGlmICghdGhpcy50YXJnZXRzIHx8IHRoaXMudGFyZ2V0cy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIGl0ZW0gPSBldnQuaXRlbTtcbiAgICB2YXIgZ3JhcGggPSBzZWxmLmdyYXBoO1xuICAgIHZhciBjb21ib0lkID0gaXRlbS5nZXRNb2RlbCgpLmNvbWJvSWQ7XG4gICAgdmFyIG5ld1BhcmVudENvbWJvID0gY29tYm9JZCA/IGdyYXBoLmZpbmRCeUlkKGNvbWJvSWQpIDogdW5kZWZpbmVkO1xuICAgIHRoaXMuY3VycmVudFNob3VsZEVuZCA9IHRoaXMuc2hvdWxkRW5kLmNhbGwodGhpcywgZXZ0LCBuZXdQYXJlbnRDb21ibyk7IC8vIOiLpeS4jeWFgeiuuOe7k+adn++8jOWImeWwhuiKgueCueS9jee9ruiuvue9ruWbnuWIneivhuS9jee9ruOAguWQjumdoueahOmAu+i+keS7jemcgOimgeaJp+ihjFxuXG4gICAgdGhpcy51cGRhdGVQb3NpdGlvbnMoZXZ0LCAhdGhpcy5jdXJyZW50U2hvdWxkRW5kKTtcbiAgICBpZiAoIXRoaXMuY3VycmVudFNob3VsZEVuZCkgcmV0dXJuO1xuXG4gICAgaWYgKHRoaXMub25seUNoYW5nZUNvbWJvU2l6ZSkge1xuICAgICAgZ3JhcGgudXBkYXRlQ29tYm9zKCk7XG4gICAgfSBlbHNlIGlmIChjb21ib0lkKSB7XG4gICAgICB2YXIgY29tYm8gPSBncmFwaC5maW5kQnlJZChjb21ib0lkKTtcblxuICAgICAgaWYgKHNlbGYuY29tYm9BY3RpdmVTdGF0ZSkge1xuICAgICAgICBncmFwaC5zZXRJdGVtU3RhdGUoY29tYm8sIHNlbGYuY29tYm9BY3RpdmVTdGF0ZSwgZmFsc2UpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnRhcmdldHMubWFwKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgIHZhciBub2RlTW9kZWwgPSBub2RlLmdldE1vZGVsKCk7XG5cbiAgICAgICAgaWYgKGNvbWJvSWQgIT09IG5vZGVNb2RlbC5jb21ib0lkKSB7XG4gICAgICAgICAgZ3JhcGgudXBkYXRlQ29tYm9UcmVlKG5vZGUsIGNvbWJvSWQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGdyYXBoLnVwZGF0ZUNvbWJvKGNvbWJvKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50YXJnZXRzLm1hcChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICB2YXIgbW9kZWwgPSBub2RlLmdldE1vZGVsKCk7XG5cbiAgICAgICAgaWYgKG1vZGVsLmNvbWJvSWQpIHtcbiAgICAgICAgICBncmFwaC51cGRhdGVDb21ib1RyZWUobm9kZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gLy8g5bCG6IqC54K55ouW5Yqo5Yiw5Y+m5aSW5Liq6IqC54K55LiK6Z2i77yMZW1pdCDkuovku7bmipvlh7rlvZPliY3mk43kvZznmoToioLngrnlj4rnm67moIfoioLngrlcblxuXG4gICAgZ3JhcGguZW1pdCgnZHJhZ25vZGVlbmQnLCB7XG4gICAgICBpdGVtczogdGhpcy50YXJnZXRzLFxuICAgICAgdGFyZ2V0SXRlbTogaXRlbVxuICAgIH0pO1xuICB9LFxuXG4gIC8qKlxuICAgKiDlsIboioLngrnmi5blhaXliLAgQ29tYm8g5LitXG4gICAqIEBwYXJhbSBldnRcbiAgICovXG4gIG9uRHJhZ0VudGVyOiBmdW5jdGlvbiBvbkRyYWdFbnRlcihldnQpIHtcbiAgICB2YXIgaXRlbSA9IGV2dC5pdGVtO1xuICAgIGlmICghdGhpcy52YWxpZGF0aW9uQ29tYm8oaXRlbSkpIHJldHVybjtcbiAgICB2YXIgZ3JhcGggPSB0aGlzLmdyYXBoO1xuXG4gICAgaWYgKHRoaXMuY29tYm9BY3RpdmVTdGF0ZSkge1xuICAgICAgZ3JhcGguc2V0SXRlbVN0YXRlKGl0ZW0sIHRoaXMuY29tYm9BY3RpdmVTdGF0ZSwgdHJ1ZSk7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiDlsIboioLngrnku44gQ29tYm8g5Lit5ouW5Ye6XG4gICAqIEBwYXJhbSBldnRcbiAgICovXG4gIG9uRHJhZ0xlYXZlOiBmdW5jdGlvbiBvbkRyYWdMZWF2ZShldnQpIHtcbiAgICB2YXIgaXRlbSA9IGV2dC5pdGVtO1xuICAgIGlmICghdGhpcy52YWxpZGF0aW9uQ29tYm8oaXRlbSkpIHJldHVybjtcbiAgICB2YXIgZ3JhcGggPSB0aGlzLmdyYXBoO1xuXG4gICAgaWYgKHRoaXMuY29tYm9BY3RpdmVTdGF0ZSkge1xuICAgICAgZ3JhcGguc2V0SXRlbVN0YXRlKGl0ZW0sIHRoaXMuY29tYm9BY3RpdmVTdGF0ZSwgZmFsc2UpO1xuICAgIH1cbiAgfSxcbiAgdXBkYXRlUG9zaXRpb25zOiBmdW5jdGlvbiB1cGRhdGVQb3NpdGlvbnMoZXZ0LCByZXN0b3JlKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIGlmICghdGhpcy50YXJnZXRzIHx8IHRoaXMudGFyZ2V0cy5sZW5ndGggPT09IDApIHJldHVybjsgLy8g5b2T5byA5ZCvIGRlbGVnYXRlIOaXtu+8jOaLluWKqOe7k+adn+WQjumcgOimgeabtOaWsOaJgOacieW3sumAieS4reiKgueCueeahOS9jee9rlxuXG4gICAgaWYgKHRoaXMuZ2V0KCdlbmFibGVEZWxlZ2F0ZScpKSB7XG4gICAgICBpZiAodGhpcy5lbmFibGVEZWJvdW5jZSkgdGhpcy5kZWJvdW5jZVVwZGF0ZSh7XG4gICAgICAgIHRhcmdldHM6IHRoaXMudGFyZ2V0cyxcbiAgICAgICAgZ3JhcGg6IHRoaXMuZ3JhcGgsXG4gICAgICAgIHBvaW50OiB0aGlzLnBvaW50LFxuICAgICAgICBvcmlnaW46IHRoaXMub3JpZ2luLFxuICAgICAgICBldnQ6IGV2dCxcbiAgICAgICAgdXBkYXRlRWRnZTogdGhpcy5nZXQoJ3VwZGF0ZUVkZ2UnKSxcbiAgICAgICAgdXBkYXRlRnVuYzogdGhpcy51cGRhdGVcbiAgICAgIH0pO2Vsc2UgaWYgKCFyZXN0b3JlKSB0aGlzLnRhcmdldHMubWFwKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgIHJldHVybiBfdGhpcy51cGRhdGUobm9kZSwgZXZ0KTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB0aGlzLnRhcmdldHMubWFwKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICByZXR1cm4gX3RoaXMudXBkYXRlKG5vZGUsIGV2dCwgcmVzdG9yZSk7XG4gICAgfSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIOabtOaWsOiKgueCuVxuICAgKiBAcGFyYW0gaXRlbSDmi5bliqjnmoToioLngrnlrp7kvotcbiAgICogQHBhcmFtIGV2dFxuICAgKi9cbiAgdXBkYXRlOiBmdW5jdGlvbiB1cGRhdGUoaXRlbSwgZXZ0LCByZXN0b3JlKSB7XG4gICAgdmFyIG9yaWdpbiA9IHRoaXMub3JpZ2luO1xuICAgIHZhciBtb2RlbCA9IGl0ZW0uZ2V0KCdtb2RlbCcpO1xuICAgIHZhciBub2RlSWQgPSBpdGVtLmdldCgnaWQnKTtcblxuICAgIGlmICghdGhpcy5wb2ludFtub2RlSWRdKSB7XG4gICAgICB0aGlzLnBvaW50W25vZGVJZF0gPSB7XG4gICAgICAgIHg6IG1vZGVsLnggfHwgMCxcbiAgICAgICAgeTogbW9kZWwueSB8fCAwXG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciB4ID0gZXZ0LnggLSBvcmlnaW4ueCArIHRoaXMucG9pbnRbbm9kZUlkXS54O1xuICAgIHZhciB5ID0gZXZ0LnkgLSBvcmlnaW4ueSArIHRoaXMucG9pbnRbbm9kZUlkXS55O1xuXG4gICAgaWYgKHJlc3RvcmUpIHtcbiAgICAgIHggKz0gb3JpZ2luLnggLSBldnQueDtcbiAgICAgIHkgKz0gb3JpZ2luLnkgLSBldnQueTtcbiAgICB9XG5cbiAgICB2YXIgcG9zID0ge1xuICAgICAgeDogeCxcbiAgICAgIHk6IHlcbiAgICB9O1xuXG4gICAgaWYgKHRoaXMuZ2V0KCd1cGRhdGVFZGdlJykpIHtcbiAgICAgIHRoaXMuZ3JhcGgudXBkYXRlSXRlbShpdGVtLCBwb3MsIGZhbHNlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaXRlbS51cGRhdGVQb3NpdGlvbihwb3MpO1xuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICog6ZmQ5rWB5pu05paw6IqC54K5XG4gICAqIEBwYXJhbSBpdGVtIOaLluWKqOeahOiKgueCueWunuS+i1xuICAgKiBAcGFyYW0gZXZ0XG4gICAqL1xuICBkZWJvdW5jZVVwZGF0ZTogZGVib3VuY2UoZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgdmFyIHRhcmdldHMgPSBldmVudC50YXJnZXRzLFxuICAgICAgICBncmFwaCA9IGV2ZW50LmdyYXBoLFxuICAgICAgICBwb2ludCA9IGV2ZW50LnBvaW50LFxuICAgICAgICBvcmlnaW4gPSBldmVudC5vcmlnaW4sXG4gICAgICAgIGV2dCA9IGV2ZW50LmV2dCxcbiAgICAgICAgdXBkYXRlRWRnZSA9IGV2ZW50LnVwZGF0ZUVkZ2UsXG4gICAgICAgIHVwZGF0ZUZ1bmMgPSBldmVudC51cGRhdGVGdW5jO1xuICAgIHRhcmdldHMubWFwKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICB2YXIgbW9kZWwgPSBpdGVtLmdldCgnbW9kZWwnKTtcbiAgICAgIHZhciBub2RlSWQgPSBpdGVtLmdldCgnaWQnKTtcblxuICAgICAgaWYgKCFwb2ludFtub2RlSWRdKSB7XG4gICAgICAgIHBvaW50W25vZGVJZF0gPSB7XG4gICAgICAgICAgeDogbW9kZWwueCB8fCAwLFxuICAgICAgICAgIHk6IG1vZGVsLnkgfHwgMFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICB2YXIgeCA9IGV2dC54IC0gb3JpZ2luLnggKyBwb2ludFtub2RlSWRdLng7XG4gICAgICB2YXIgeSA9IGV2dC55IC0gb3JpZ2luLnkgKyBwb2ludFtub2RlSWRdLnk7XG4gICAgICB2YXIgcG9zID0ge1xuICAgICAgICB4OiB4LFxuICAgICAgICB5OiB5XG4gICAgICB9O1xuXG4gICAgICBpZiAodXBkYXRlRWRnZSkge1xuICAgICAgICBncmFwaC51cGRhdGVJdGVtKGl0ZW0sIHBvcywgZmFsc2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaXRlbS51cGRhdGVQb3NpdGlvbihwb3MpO1xuICAgICAgfVxuICAgIH0pO1xuICB9LCA1MCwgdHJ1ZSksXG5cbiAgLyoqXG4gICAqIOabtOaWsOaLluWKqOWFg+e0oOaXtueahGRlbGVnYXRlXG4gICAqIEBwYXJhbSB7RXZlbnR9IGUg5LqL5Lu25Y+l5p+EXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB4IOaLluWKqOWNleS4quWFg+e0oOaXtuWAmeeahHjlnZDmoIdcbiAgICogQHBhcmFtIHtudW1iZXJ9IHkg5ouW5Yqo5Y2V5Liq5YWD57Sg5pe25YCZ55qEeeWdkOagh1xuICAgKi9cbiAgdXBkYXRlRGVsZWdhdGU6IGZ1bmN0aW9uIHVwZGF0ZURlbGVnYXRlKGUpIHtcbiAgICB2YXIgZ3JhcGggPSB0aGlzLmdyYXBoO1xuXG4gICAgaWYgKCF0aGlzLmRlbGVnYXRlUmVjdCkge1xuICAgICAgLy8g5ouW5Yqo5aSa5LiqXG4gICAgICB2YXIgcGFyZW50XzEgPSBncmFwaC5nZXQoJ2dyb3VwJyk7XG4gICAgICB2YXIgYXR0cnMgPSBkZWVwTWl4KHt9LCBHbG9iYWwuZGVsZWdhdGVTdHlsZSwgdGhpcy5kZWxlZ2F0ZVN0eWxlKTtcblxuICAgICAgdmFyIF9hID0gdGhpcy5jYWxjdWxhdGlvbkdyb3VwUG9zaXRpb24oZSksXG4gICAgICAgICAgY3ggPSBfYS54LFxuICAgICAgICAgIGN5ID0gX2EueSxcbiAgICAgICAgICB3aWR0aCA9IF9hLndpZHRoLFxuICAgICAgICAgIGhlaWdodCA9IF9hLmhlaWdodCxcbiAgICAgICAgICBtaW5YID0gX2EubWluWCxcbiAgICAgICAgICBtaW5ZID0gX2EubWluWTtcblxuICAgICAgdGhpcy5vcmlnaW5Qb2ludCA9IHtcbiAgICAgICAgeDogY3gsXG4gICAgICAgIHk6IGN5LFxuICAgICAgICB3aWR0aDogd2lkdGgsXG4gICAgICAgIGhlaWdodDogaGVpZ2h0LFxuICAgICAgICBtaW5YOiBtaW5YLFxuICAgICAgICBtaW5ZOiBtaW5ZXG4gICAgICB9OyAvLyBtb2RlbOS4iueahHgsIHnmmK/nm7jlr7nkuo7lm77lvaLkuK3lv4PnmoTvvIxkZWxlZ2F0ZVNoYXBl5pivZ+WunuS+i++8jHgseeaYr+e7neWvueWdkOagh1xuXG4gICAgICB0aGlzLmRlbGVnYXRlUmVjdCA9IHBhcmVudF8xLmFkZFNoYXBlKCdyZWN0Jywge1xuICAgICAgICBhdHRyczogX19hc3NpZ24oe1xuICAgICAgICAgIHdpZHRoOiB3aWR0aCxcbiAgICAgICAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICAgICAgICB4OiBjeCxcbiAgICAgICAgICB5OiBjeVxuICAgICAgICB9LCBhdHRycyksXG4gICAgICAgIG5hbWU6ICdyZWN0LWRlbGVnYXRlLXNoYXBlJ1xuICAgICAgfSk7XG4gICAgICB0aGlzLmRlbGVnYXRlID0gdGhpcy5kZWxlZ2F0ZVJlY3Q7XG4gICAgICB0aGlzLmRlbGVnYXRlUmVjdC5zZXQoJ2NhcHR1cmUnLCBmYWxzZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBjbGllbnRYID0gZS54IC0gdGhpcy5vcmlnaW4ueCArIHRoaXMub3JpZ2luUG9pbnQubWluWDtcbiAgICAgIHZhciBjbGllbnRZID0gZS55IC0gdGhpcy5vcmlnaW4ueSArIHRoaXMub3JpZ2luUG9pbnQubWluWTtcbiAgICAgIHRoaXMuZGVsZWdhdGVSZWN0LmF0dHIoe1xuICAgICAgICB4OiBjbGllbnRYLFxuICAgICAgICB5OiBjbGllbnRZXG4gICAgICB9KTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIOiuoeeul2RlbGVnYXRl5L2N572u77yM5YyF5ous5bem5LiK6KeS5bem6L655Y+K5a695bqm5ZKM6auY5bqmXG4gICAqIEBtZW1iZXJvZiBJdGVtR3JvdXBcbiAgICogQHJldHVybiB7b2JqZWN0fSDorqHnrpflh7rmnaXnmoRkZWxlZ2F0ZeWdkOagh+S/oeaBr+WPiuWuvemrmFxuICAgKi9cbiAgY2FsY3VsYXRpb25Hcm91cFBvc2l0aW9uOiBmdW5jdGlvbiBjYWxjdWxhdGlvbkdyb3VwUG9zaXRpb24oZXZ0KSB7XG4gICAgdmFyIG5vZGVzID0gdGhpcy50YXJnZXRzO1xuXG4gICAgaWYgKG5vZGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgbm9kZXMucHVzaChldnQuaXRlbSk7XG4gICAgfVxuXG4gICAgdmFyIG1pbnggPSBJbmZpbml0eTtcbiAgICB2YXIgbWF4eCA9IC1JbmZpbml0eTtcbiAgICB2YXIgbWlueSA9IEluZmluaXR5O1xuICAgIHZhciBtYXh5ID0gLUluZmluaXR5OyAvLyDojrflj5blt7LoioLngrnnmoTmiYDmnInmnIDlpKfmnIDlsI94IHnlgLxcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBlbGVtZW50ID0gbm9kZXNbaV07XG4gICAgICB2YXIgYmJveCA9IGVsZW1lbnQuZ2V0QkJveCgpO1xuICAgICAgdmFyIG1pblggPSBiYm94Lm1pblgsXG4gICAgICAgICAgbWluWSA9IGJib3gubWluWSxcbiAgICAgICAgICBtYXhYID0gYmJveC5tYXhYLFxuICAgICAgICAgIG1heFkgPSBiYm94Lm1heFk7XG5cbiAgICAgIGlmIChtaW5YIDwgbWlueCkge1xuICAgICAgICBtaW54ID0gbWluWDtcbiAgICAgIH1cblxuICAgICAgaWYgKG1pblkgPCBtaW55KSB7XG4gICAgICAgIG1pbnkgPSBtaW5ZO1xuICAgICAgfVxuXG4gICAgICBpZiAobWF4WCA+IG1heHgpIHtcbiAgICAgICAgbWF4eCA9IG1heFg7XG4gICAgICB9XG5cbiAgICAgIGlmIChtYXhZID4gbWF4eSkge1xuICAgICAgICBtYXh5ID0gbWF4WTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgeCA9IE1hdGguZmxvb3IobWlueCk7XG4gICAgdmFyIHkgPSBNYXRoLmZsb29yKG1pbnkpO1xuICAgIHZhciB3aWR0aCA9IE1hdGguY2VpbChtYXh4KSAtIE1hdGguZmxvb3IobWlueCk7XG4gICAgdmFyIGhlaWdodCA9IE1hdGguY2VpbChtYXh5KSAtIE1hdGguZmxvb3IobWlueSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IHgsXG4gICAgICB5OiB5LFxuICAgICAgd2lkdGg6IHdpZHRoLFxuICAgICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgICBtaW5YOiBtaW54LFxuICAgICAgbWluWTogbWlueVxuICAgIH07XG4gIH1cbn07IiwiZXhwb3J0IGRlZmF1bHQge1xuICBnZXREZWZhdWx0Q2ZnOiBmdW5jdGlvbiBnZXREZWZhdWx0Q2ZnKCkge1xuICAgIHJldHVybiB7XG4gICAgICAvLyDlj6/pgIkgbW91c2VlbnRlciB8fCBjbGlja1xuICAgICAgLy8g6YCJ5oupIGNsaWNrIOS8muebkeWQrCB0b3VjaO+8jG1vdXNlZW50ZXIg5LiN5Lya55uR5ZCsXG4gICAgICB0cmlnZ2VyOiAnbW91c2VlbnRlcicsXG4gICAgICBhY3RpdmVTdGF0ZTogJ2FjdGl2ZScsXG4gICAgICBpbmFjdGl2ZVN0YXRlOiAnaW5hY3RpdmUnLFxuICAgICAgcmVzZXRTZWxlY3RlZDogZmFsc2UsXG4gICAgICBzaG91bGRVcGRhdGU6IGZ1bmN0aW9uIHNob3VsZFVwZGF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfTtcbiAgfSxcbiAgZ2V0RXZlbnRzOiBmdW5jdGlvbiBnZXRFdmVudHMoKSB7XG4gICAgaWYgKHRoaXMuZ2V0KCd0cmlnZ2VyJykgPT09ICdtb3VzZWVudGVyJykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgJ25vZGU6bW91c2VlbnRlcic6ICdzZXRBbGxJdGVtU3RhdGVzJyxcbiAgICAgICAgJ2NvbWJvOm1vdXNlZW50ZXInOiAnc2V0QWxsSXRlbVN0YXRlcycsXG4gICAgICAgICdub2RlOm1vdXNlbGVhdmUnOiAnY2xlYXJBY3RpdmVTdGF0ZScsXG4gICAgICAgICdjb21ibzptb3VzZWxlYXZlJzogJ2NsZWFyQWN0aXZlU3RhdGUnXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAnbm9kZTpjbGljayc6ICdzZXRBbGxJdGVtU3RhdGVzJyxcbiAgICAgICdjb21ibzpjbGljayc6ICdzZXRBbGxJdGVtU3RhdGVzJyxcbiAgICAgICdjYW52YXM6Y2xpY2snOiAnY2xlYXJBY3RpdmVTdGF0ZScsXG4gICAgICAnbm9kZTp0b3VjaHN0YXJ0JzogJ3NldE9uVG91Y2hTdGFydCcsXG4gICAgICAnY29tYm86dG91Y2hzdGFydCc6ICdzZXRPblRvdWNoU3RhcnQnLFxuICAgICAgJ2NhbnZhczp0b3VjaHN0YXJ0JzogJ2NsZWFyT25Ub3VjaFN0YXJ0J1xuICAgIH07XG4gIH0sXG4gIHNldE9uVG91Y2hTdGFydDogZnVuY3Rpb24gc2V0T25Ub3VjaFN0YXJ0KGUpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICB0cnkge1xuICAgICAgdmFyIHRvdWNoZXMgPSBlLm9yaWdpbmFsRXZlbnQudG91Y2hlcztcbiAgICAgIHZhciBldmVudDEgPSB0b3VjaGVzWzBdO1xuICAgICAgdmFyIGV2ZW50MiA9IHRvdWNoZXNbMV07XG5cbiAgICAgIGlmIChldmVudDEgJiYgZXZlbnQyKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUud2FybignVG91Y2ggb3JpZ2luYWwgZXZlbnQgbm90IGV4aXN0IScpO1xuICAgIH1cblxuICAgIHNlbGYuc2V0QWxsSXRlbVN0YXRlcyhlKTtcbiAgfSxcbiAgY2xlYXJPblRvdWNoU3RhcnQ6IGZ1bmN0aW9uIGNsZWFyT25Ub3VjaFN0YXJ0KGUpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICB0cnkge1xuICAgICAgdmFyIHRvdWNoZXMgPSBlLm9yaWdpbmFsRXZlbnQudG91Y2hlcztcbiAgICAgIHZhciBldmVudDEgPSB0b3VjaGVzWzBdO1xuICAgICAgdmFyIGV2ZW50MiA9IHRvdWNoZXNbMV07XG5cbiAgICAgIGlmIChldmVudDEgJiYgZXZlbnQyKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUud2FybignVG91Y2ggb3JpZ2luYWwgZXZlbnQgbm90IGV4aXN0IScpO1xuICAgIH1cblxuICAgIHNlbGYuY2xlYXJBY3RpdmVTdGF0ZShlKTtcbiAgfSxcbiAgc2V0QWxsSXRlbVN0YXRlczogZnVuY3Rpb24gc2V0QWxsSXRlbVN0YXRlcyhlKSB7XG4gICAgdmFyIGl0ZW0gPSBlLml0ZW07XG4gICAgdmFyIGdyYXBoID0gdGhpcy5ncmFwaDtcbiAgICB0aGlzLml0ZW0gPSBpdGVtO1xuXG4gICAgaWYgKCF0aGlzLnNob3VsZFVwZGF0ZShlLml0ZW0sIHtcbiAgICAgIGV2ZW50OiBlLFxuICAgICAgYWN0aW9uOiAnYWN0aXZhdGUnXG4gICAgfSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIGFjdGl2ZVN0YXRlID0gdGhpcy5hY3RpdmVTdGF0ZTtcbiAgICB2YXIgaW5hY3RpdmVTdGF0ZSA9IHRoaXMuaW5hY3RpdmVTdGF0ZTtcbiAgICB2YXIgbm9kZXMgPSBncmFwaC5nZXROb2RlcygpO1xuICAgIHZhciBjb21ib3MgPSBncmFwaC5nZXRDb21ib3MoKTtcbiAgICB2YXIgZWRnZXMgPSBncmFwaC5nZXRFZGdlcygpO1xuICAgIHZhciB2RWRnZXMgPSBncmFwaC5nZXQoJ3ZlZGdlcycpO1xuICAgIHZhciBub2RlTGVuZ3RoID0gbm9kZXMubGVuZ3RoO1xuICAgIHZhciBjb21ib0xlbmd0aCA9IGNvbWJvcy5sZW5ndGg7XG4gICAgdmFyIGVkZ2VMZW5ndGggPSBlZGdlcy5sZW5ndGg7XG4gICAgdmFyIHZFZGdlTGVuZ3RoID0gdkVkZ2VzLmxlbmd0aDtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZUxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgbm9kZSA9IG5vZGVzW2ldO1xuICAgICAgdmFyIGhhc1NlbGVjdGVkID0gbm9kZS5oYXNTdGF0ZSgnc2VsZWN0ZWQnKTtcblxuICAgICAgaWYgKHNlbGYucmVzZXRTZWxlY3RlZCkge1xuICAgICAgICBpZiAoaGFzU2VsZWN0ZWQpIHtcbiAgICAgICAgICBncmFwaC5zZXRJdGVtU3RhdGUobm9kZSwgJ3NlbGVjdGVkJywgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGdyYXBoLnNldEl0ZW1TdGF0ZShub2RlLCBhY3RpdmVTdGF0ZSwgZmFsc2UpO1xuXG4gICAgICBpZiAoaW5hY3RpdmVTdGF0ZSkge1xuICAgICAgICBncmFwaC5zZXRJdGVtU3RhdGUobm9kZSwgaW5hY3RpdmVTdGF0ZSwgdHJ1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb21ib0xlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgY29tYm8gPSBjb21ib3NbaV07XG4gICAgICB2YXIgaGFzU2VsZWN0ZWQgPSBjb21iby5oYXNTdGF0ZSgnc2VsZWN0ZWQnKTtcblxuICAgICAgaWYgKHNlbGYucmVzZXRTZWxlY3RlZCkge1xuICAgICAgICBpZiAoaGFzU2VsZWN0ZWQpIHtcbiAgICAgICAgICBncmFwaC5zZXRJdGVtU3RhdGUoY29tYm8sICdzZWxlY3RlZCcsIGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBncmFwaC5zZXRJdGVtU3RhdGUoY29tYm8sIGFjdGl2ZVN0YXRlLCBmYWxzZSk7XG5cbiAgICAgIGlmIChpbmFjdGl2ZVN0YXRlKSB7XG4gICAgICAgIGdyYXBoLnNldEl0ZW1TdGF0ZShjb21ibywgaW5hY3RpdmVTdGF0ZSwgdHJ1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlZGdlTGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBlZGdlID0gZWRnZXNbaV07XG4gICAgICBncmFwaC5zZXRJdGVtU3RhdGUoZWRnZSwgYWN0aXZlU3RhdGUsIGZhbHNlKTtcblxuICAgICAgaWYgKGluYWN0aXZlU3RhdGUpIHtcbiAgICAgICAgZ3JhcGguc2V0SXRlbVN0YXRlKGVkZ2UsIGluYWN0aXZlU3RhdGUsIHRydWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdkVkZ2VMZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHZFZGdlID0gdkVkZ2VzW2ldO1xuICAgICAgZ3JhcGguc2V0SXRlbVN0YXRlKHZFZGdlLCBhY3RpdmVTdGF0ZSwgZmFsc2UpO1xuXG4gICAgICBpZiAoaW5hY3RpdmVTdGF0ZSkge1xuICAgICAgICBncmFwaC5zZXRJdGVtU3RhdGUodkVkZ2UsIGluYWN0aXZlU3RhdGUsIHRydWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpbmFjdGl2ZVN0YXRlKSB7XG4gICAgICBncmFwaC5zZXRJdGVtU3RhdGUoaXRlbSwgaW5hY3RpdmVTdGF0ZSwgZmFsc2UpO1xuICAgIH1cblxuICAgIGdyYXBoLnNldEl0ZW1TdGF0ZShpdGVtLCBhY3RpdmVTdGF0ZSwgdHJ1ZSk7XG4gICAgdmFyIHJFZGdlcyA9IGl0ZW0uZ2V0RWRnZXMoKTtcbiAgICB2YXIgckVkZ2VMZWdudGggPSByRWRnZXMubGVuZ3RoO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByRWRnZUxlZ250aDsgaSsrKSB7XG4gICAgICB2YXIgZWRnZSA9IHJFZGdlc1tpXTtcbiAgICAgIHZhciBvdGhlckVuZCA9IHZvaWQgMDtcblxuICAgICAgaWYgKGVkZ2UuZ2V0U291cmNlKCkgPT09IGl0ZW0pIHtcbiAgICAgICAgb3RoZXJFbmQgPSBlZGdlLmdldFRhcmdldCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3RoZXJFbmQgPSBlZGdlLmdldFNvdXJjZSgpO1xuICAgICAgfVxuXG4gICAgICBpZiAoaW5hY3RpdmVTdGF0ZSkge1xuICAgICAgICBncmFwaC5zZXRJdGVtU3RhdGUob3RoZXJFbmQsIGluYWN0aXZlU3RhdGUsIGZhbHNlKTtcbiAgICAgIH1cblxuICAgICAgZ3JhcGguc2V0SXRlbVN0YXRlKG90aGVyRW5kLCBhY3RpdmVTdGF0ZSwgdHJ1ZSk7XG4gICAgICBncmFwaC5zZXRJdGVtU3RhdGUoZWRnZSwgaW5hY3RpdmVTdGF0ZSwgZmFsc2UpO1xuICAgICAgZ3JhcGguc2V0SXRlbVN0YXRlKGVkZ2UsIGFjdGl2ZVN0YXRlLCB0cnVlKTtcbiAgICAgIGVkZ2UudG9Gcm9udCgpO1xuICAgIH1cblxuICAgIGdyYXBoLmVtaXQoJ2FmdGVyYWN0aXZhdGVyZWxhdGlvbnMnLCB7XG4gICAgICBpdGVtOiBlLml0ZW0sXG4gICAgICBhY3Rpb246ICdhY3RpdmF0ZSdcbiAgICB9KTtcbiAgfSxcbiAgY2xlYXJBY3RpdmVTdGF0ZTogZnVuY3Rpb24gY2xlYXJBY3RpdmVTdGF0ZShlKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBncmFwaCA9IHNlbGYuZ2V0KCdncmFwaCcpO1xuXG4gICAgaWYgKCFzZWxmLnNob3VsZFVwZGF0ZShlLml0ZW0sIHtcbiAgICAgIGV2ZW50OiBlLFxuICAgICAgYWN0aW9uOiAnZGVhY3RpdmF0ZSdcbiAgICB9KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBhY3RpdmVTdGF0ZSA9IHRoaXMuYWN0aXZlU3RhdGU7XG4gICAgdmFyIGluYWN0aXZlU3RhdGUgPSB0aGlzLmluYWN0aXZlU3RhdGU7XG4gICAgdmFyIGF1dG9QYWludCA9IGdyYXBoLmdldCgnYXV0b1BhaW50Jyk7XG4gICAgZ3JhcGguc2V0QXV0b1BhaW50KGZhbHNlKTtcbiAgICB2YXIgbm9kZXMgPSBncmFwaC5nZXROb2RlcygpIHx8IFtdO1xuICAgIHZhciBjb21ib3MgPSBncmFwaC5nZXRDb21ib3MoKSB8fCBbXTtcbiAgICB2YXIgZWRnZXMgPSBncmFwaC5nZXRFZGdlcygpIHx8IFtdO1xuICAgIHZhciB2RWRnZXMgPSBncmFwaC5nZXQoJ3ZlZGdlcycpIHx8IFtdO1xuICAgIHZhciBub2RlTGVuZ3RoID0gbm9kZXMubGVuZ3RoO1xuICAgIHZhciBjb21ib0xlbmd0aCA9IGNvbWJvcy5sZW5ndGg7XG4gICAgdmFyIGVkZ2VMZW5ndGggPSBlZGdlcy5sZW5ndGg7XG4gICAgdmFyIHZFZGdlTGVuZ3RoID0gdkVkZ2VzLmxlbmd0aDtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZUxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgbm9kZSA9IG5vZGVzW2ldO1xuICAgICAgZ3JhcGguY2xlYXJJdGVtU3RhdGVzKG5vZGUsIFthY3RpdmVTdGF0ZSwgaW5hY3RpdmVTdGF0ZV0pO1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29tYm9MZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGNvbWJvID0gY29tYm9zW2ldO1xuICAgICAgZ3JhcGguY2xlYXJJdGVtU3RhdGVzKGNvbWJvLCBbYWN0aXZlU3RhdGUsIGluYWN0aXZlU3RhdGVdKTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVkZ2VMZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVkZ2UgPSBlZGdlc1tpXTtcbiAgICAgIGdyYXBoLmNsZWFySXRlbVN0YXRlcyhlZGdlLCBbYWN0aXZlU3RhdGUsIGluYWN0aXZlU3RhdGUsICdkZWFjdGl2YXRlJ10pO1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdkVkZ2VMZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHZFZGdlID0gdkVkZ2VzW2ldO1xuICAgICAgZ3JhcGguY2xlYXJJdGVtU3RhdGVzKHZFZGdlLCBbYWN0aXZlU3RhdGUsIGluYWN0aXZlU3RhdGUsICdkZWFjdGl2YXRlJ10pO1xuICAgIH1cblxuICAgIGdyYXBoLnBhaW50KCk7XG4gICAgZ3JhcGguc2V0QXV0b1BhaW50KGF1dG9QYWludCk7XG4gICAgZ3JhcGguZW1pdCgnYWZ0ZXJhY3RpdmF0ZXJlbGF0aW9ucycsIHtcbiAgICAgIGl0ZW06IGUuaXRlbSB8fCBzZWxmLmdldCgnaXRlbScpLFxuICAgICAgYWN0aW9uOiAnZGVhY3RpdmF0ZSdcbiAgICB9KTtcbiAgfVxufTsiLCJ2YXIgbWluID0gTWF0aC5taW4sXG4gICAgbWF4ID0gTWF0aC5tYXgsXG4gICAgYWJzID0gTWF0aC5hYnM7XG52YXIgREVGQVVMVF9UUklHR0VSID0gJ3NoaWZ0JztcbnZhciBBTExPV19FVkVOVFMgPSBbJ2RyYWcnLCAnc2hpZnQnLCAnY3RybCcsICdhbHQnLCAnY29udHJvbCddO1xuZXhwb3J0IGRlZmF1bHQge1xuICBnZXREZWZhdWx0Q2ZnOiBmdW5jdGlvbiBnZXREZWZhdWx0Q2ZnKCkge1xuICAgIHJldHVybiB7XG4gICAgICBicnVzaFN0eWxlOiB7XG4gICAgICAgIGZpbGw6ICcjRUVGNkZGJyxcbiAgICAgICAgZmlsbE9wYWNpdHk6IDAuNCxcbiAgICAgICAgc3Ryb2tlOiAnI0RERUVGRScsXG4gICAgICAgIGxpbmVXaWR0aDogMVxuICAgICAgfSxcbiAgICAgIG9uU2VsZWN0OiBmdW5jdGlvbiBvblNlbGVjdCgpIHt9LFxuICAgICAgb25EZXNlbGVjdDogZnVuY3Rpb24gb25EZXNlbGVjdCgpIHt9LFxuICAgICAgc2VsZWN0ZWRTdGF0ZTogJ3NlbGVjdGVkJyxcbiAgICAgIHRyaWdnZXI6IERFRkFVTFRfVFJJR0dFUixcbiAgICAgIGluY2x1ZGVFZGdlczogdHJ1ZSxcbiAgICAgIHNlbGVjdGVkRWRnZXM6IFtdLFxuICAgICAgc2VsZWN0ZWROb2RlczogW11cbiAgICB9O1xuICB9LFxuICBnZXRFdmVudHM6IGZ1bmN0aW9uIGdldEV2ZW50cygpIHtcbiAgICAvLyDmo4DmtYvovpPlhaXmmK/lkKblkIjms5VcbiAgICBpZiAoIShBTExPV19FVkVOVFMuaW5kZXhPZih0aGlzLnRyaWdnZXIudG9Mb3dlckNhc2UoKSkgPiAtMSkpIHtcbiAgICAgIHRoaXMudHJpZ2dlciA9IERFRkFVTFRfVFJJR0dFUjtcbiAgICAgIGNvbnNvbGUud2FybihcIkJlaGF2aW9yIGJydXNoLXNlbGVjdCDnmoQgdHJpZ2dlciDlj4LmlbDkuI3lkIjms5XvvIzor7fovpPlhaUgJ2RyYWcn44CBJ3NoaWZ0J+OAgSdjdHJsJyDmiJYgJ2FsdCdcIik7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudHJpZ2dlciA9PT0gJ2RyYWcnKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBkcmFnc3RhcnQ6ICdvbk1vdXNlRG93bicsXG4gICAgICAgIGRyYWc6ICdvbk1vdXNlTW92ZScsXG4gICAgICAgIGRyYWdlbmQ6ICdvbk1vdXNlVXAnLFxuICAgICAgICAnY2FudmFzOmNsaWNrJzogJ2NsZWFyU3RhdGVzJ1xuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgZHJhZ3N0YXJ0OiAnb25Nb3VzZURvd24nLFxuICAgICAgZHJhZzogJ29uTW91c2VNb3ZlJyxcbiAgICAgIGRyYWdlbmQ6ICdvbk1vdXNlVXAnLFxuICAgICAgJ2NhbnZhczpjbGljayc6ICdjbGVhclN0YXRlcycsXG4gICAgICBrZXl1cDogJ29uS2V5VXAnLFxuICAgICAga2V5ZG93bjogJ29uS2V5RG93bidcbiAgICB9O1xuICB9LFxuICBvbk1vdXNlRG93bjogZnVuY3Rpb24gb25Nb3VzZURvd24oZSkge1xuICAgIC8vIOaMieWcqG5vZGXkuIrpnaLmi5bliqjml7blgJnkuI3lupTor6XmmK/moYbpgIlcbiAgICB2YXIgaXRlbSA9IGUuaXRlbTtcbiAgICB2YXIgYnJ1c2ggPSB0aGlzLmJydXNoO1xuXG4gICAgaWYgKGl0ZW0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy50cmlnZ2VyICE9PSAnZHJhZycgJiYgIXRoaXMua2V5ZG93bikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNlbGVjdGVkTm9kZXMgJiYgdGhpcy5zZWxlY3RlZE5vZGVzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgdGhpcy5jbGVhclN0YXRlcygpO1xuICAgIH1cblxuICAgIGlmICghYnJ1c2gpIHtcbiAgICAgIGJydXNoID0gdGhpcy5jcmVhdGVCcnVzaCgpO1xuICAgIH1cblxuICAgIHRoaXMub3JpZ2luUG9pbnQgPSB7XG4gICAgICB4OiBlLmNhbnZhc1gsXG4gICAgICB5OiBlLmNhbnZhc1lcbiAgICB9O1xuICAgIGJydXNoLmF0dHIoe1xuICAgICAgd2lkdGg6IDAsXG4gICAgICBoZWlnaHQ6IDBcbiAgICB9KTtcbiAgICBicnVzaC5zaG93KCk7XG4gICAgdGhpcy5kcmFnZ2luZyA9IHRydWU7XG4gIH0sXG4gIG9uTW91c2VNb3ZlOiBmdW5jdGlvbiBvbk1vdXNlTW92ZShlKSB7XG4gICAgaWYgKCF0aGlzLmRyYWdnaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudHJpZ2dlciAhPT0gJ2RyYWcnICYmICF0aGlzLmtleWRvd24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZUJydXNoKGUpO1xuICB9LFxuICBvbk1vdXNlVXA6IGZ1bmN0aW9uIG9uTW91c2VVcChlKSB7XG4gICAgdmFyIGdyYXBoID0gdGhpcy5ncmFwaDsgLy8gVE9ETzog6Kem5Y+R5LqGIGNhbnZhczpjbGljayDlr7zoh7QgY2xlYXJTdGF0ZXNcblxuICAgIGlmICghdGhpcy5icnVzaCAmJiAhdGhpcy5kcmFnZ2luZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnRyaWdnZXIgIT09ICdkcmFnJyAmJiAhdGhpcy5rZXlkb3duKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5icnVzaC5yZW1vdmUodHJ1ZSk7IC8vIHJlbW92ZSBhbmQgZGVzdHJveVxuXG4gICAgdGhpcy5icnVzaCA9IG51bGw7XG4gICAgdGhpcy5nZXRTZWxlY3RlZE5vZGVzKGUpO1xuICAgIHRoaXMuZHJhZ2dpbmcgPSBmYWxzZTtcbiAgfSxcbiAgY2xlYXJTdGF0ZXM6IGZ1bmN0aW9uIGNsZWFyU3RhdGVzKCkge1xuICAgIHZhciBfYSA9IHRoaXMsXG4gICAgICAgIGdyYXBoID0gX2EuZ3JhcGgsXG4gICAgICAgIHNlbGVjdGVkU3RhdGUgPSBfYS5zZWxlY3RlZFN0YXRlO1xuXG4gICAgdmFyIG5vZGVzID0gZ3JhcGguZmluZEFsbEJ5U3RhdGUoJ25vZGUnLCBzZWxlY3RlZFN0YXRlKTtcbiAgICB2YXIgZWRnZXMgPSBncmFwaC5maW5kQWxsQnlTdGF0ZSgnZWRnZScsIHNlbGVjdGVkU3RhdGUpO1xuICAgIG5vZGVzLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgIHJldHVybiBncmFwaC5zZXRJdGVtU3RhdGUobm9kZSwgc2VsZWN0ZWRTdGF0ZSwgZmFsc2UpO1xuICAgIH0pO1xuICAgIGVkZ2VzLmZvckVhY2goZnVuY3Rpb24gKGVkZ2UpIHtcbiAgICAgIHJldHVybiBncmFwaC5zZXRJdGVtU3RhdGUoZWRnZSwgc2VsZWN0ZWRTdGF0ZSwgZmFsc2UpO1xuICAgIH0pO1xuICAgIHRoaXMuc2VsZWN0ZWROb2RlcyA9IFtdO1xuICAgIHRoaXMuc2VsZWN0ZWRFZGdlcyA9IFtdO1xuXG4gICAgaWYgKHRoaXMub25EZXNlbGVjdCkge1xuICAgICAgdGhpcy5vbkRlc2VsZWN0KHRoaXMuc2VsZWN0ZWROb2RlcywgdGhpcy5zZWxlY3RlZEVkZ2VzKTtcbiAgICB9XG5cbiAgICBncmFwaC5lbWl0KCdub2Rlc2VsZWN0Y2hhbmdlJywge1xuICAgICAgc2VsZWN0ZWRJdGVtczoge1xuICAgICAgICBub2RlczogW10sXG4gICAgICAgIGVkZ2VzOiBbXVxuICAgICAgfSxcbiAgICAgIHNlbGVjdDogZmFsc2VcbiAgICB9KTtcbiAgfSxcbiAgZ2V0U2VsZWN0ZWROb2RlczogZnVuY3Rpb24gZ2V0U2VsZWN0ZWROb2RlcyhlKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHZhciBfYSA9IHRoaXMsXG4gICAgICAgIGdyYXBoID0gX2EuZ3JhcGgsXG4gICAgICAgIG9yaWdpblBvaW50ID0gX2Eub3JpZ2luUG9pbnQsXG4gICAgICAgIHNob3VsZFVwZGF0ZSA9IF9hLnNob3VsZFVwZGF0ZTtcblxuICAgIHZhciBzdGF0ZSA9IHRoaXMuc2VsZWN0ZWRTdGF0ZTtcbiAgICB2YXIgcDEgPSB7XG4gICAgICB4OiBlLngsXG4gICAgICB5OiBlLnlcbiAgICB9O1xuICAgIHZhciBwMiA9IGdyYXBoLmdldFBvaW50QnlDYW52YXMob3JpZ2luUG9pbnQueCwgb3JpZ2luUG9pbnQueSk7XG4gICAgdmFyIGxlZnQgPSBtaW4ocDEueCwgcDIueCk7XG4gICAgdmFyIHJpZ2h0ID0gbWF4KHAxLngsIHAyLngpO1xuICAgIHZhciB0b3AgPSBtaW4ocDEueSwgcDIueSk7XG4gICAgdmFyIGJvdHRvbSA9IG1heChwMS55LCBwMi55KTtcbiAgICB2YXIgc2VsZWN0ZWROb2RlcyA9IFtdO1xuICAgIHZhciBzZWxlY3RlZElkcyA9IFtdO1xuICAgIGdyYXBoLmdldE5vZGVzKCkuZm9yRWFjaChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgaWYgKCFub2RlLmlzVmlzaWJsZSgpKSByZXR1cm47IC8vIOmakOiXj+iKgueCueS4jeiDveiiq+mAieS4rVxuXG4gICAgICB2YXIgYmJveCA9IG5vZGUuZ2V0QkJveCgpO1xuXG4gICAgICBpZiAoYmJveC5jZW50ZXJYID49IGxlZnQgJiYgYmJveC5jZW50ZXJYIDw9IHJpZ2h0ICYmIGJib3guY2VudGVyWSA+PSB0b3AgJiYgYmJveC5jZW50ZXJZIDw9IGJvdHRvbSkge1xuICAgICAgICBpZiAoc2hvdWxkVXBkYXRlKG5vZGUsICdzZWxlY3QnKSkge1xuICAgICAgICAgIHNlbGVjdGVkTm9kZXMucHVzaChub2RlKTtcbiAgICAgICAgICB2YXIgbW9kZWwgPSBub2RlLmdldE1vZGVsKCk7XG4gICAgICAgICAgc2VsZWN0ZWRJZHMucHVzaChtb2RlbC5pZCk7XG4gICAgICAgICAgZ3JhcGguc2V0SXRlbVN0YXRlKG5vZGUsIHN0YXRlLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIHZhciBzZWxlY3RlZEVkZ2VzID0gW107XG5cbiAgICBpZiAodGhpcy5pbmNsdWRlRWRnZXMpIHtcbiAgICAgIC8vIOmAieS4rei+ue+8jOi+ueeahHNvdXJjZeWSjHRhcmdldOmDveWcqOmAieS4reeahOiKgueCueS4reaXtuaJjemAieS4rVxuICAgICAgc2VsZWN0ZWROb2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgIHZhciBlZGdlcyA9IG5vZGUuZ2V0T3V0RWRnZXMoKTtcbiAgICAgICAgZWRnZXMuZm9yRWFjaChmdW5jdGlvbiAoZWRnZSkge1xuICAgICAgICAgIGlmICghZWRnZS5pc1Zpc2libGUoKSkgcmV0dXJuOyAvLyDpmpDol4/ovrnkuI3og73lpJ/ooqvpgInkuK1cblxuICAgICAgICAgIHZhciBtb2RlbCA9IGVkZ2UuZ2V0TW9kZWwoKTtcbiAgICAgICAgICB2YXIgc291cmNlID0gbW9kZWwuc291cmNlLFxuICAgICAgICAgICAgICB0YXJnZXQgPSBtb2RlbC50YXJnZXQ7XG5cbiAgICAgICAgICBpZiAoc2VsZWN0ZWRJZHMuaW5jbHVkZXMoc291cmNlKSAmJiBzZWxlY3RlZElkcy5pbmNsdWRlcyh0YXJnZXQpICYmIHNob3VsZFVwZGF0ZShlZGdlLCAnc2VsZWN0JykpIHtcbiAgICAgICAgICAgIHNlbGVjdGVkRWRnZXMucHVzaChlZGdlKTtcbiAgICAgICAgICAgIGdyYXBoLnNldEl0ZW1TdGF0ZShlZGdlLCBfdGhpcy5zZWxlY3RlZFN0YXRlLCB0cnVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5zZWxlY3RlZEVkZ2VzID0gc2VsZWN0ZWRFZGdlcztcbiAgICB0aGlzLnNlbGVjdGVkTm9kZXMgPSBzZWxlY3RlZE5vZGVzO1xuXG4gICAgaWYgKHRoaXMub25TZWxlY3QpIHtcbiAgICAgIHRoaXMub25TZWxlY3Qoc2VsZWN0ZWROb2Rlcywgc2VsZWN0ZWRFZGdlcyk7XG4gICAgfVxuXG4gICAgZ3JhcGguZW1pdCgnbm9kZXNlbGVjdGNoYW5nZScsIHtcbiAgICAgIHNlbGVjdGVkSXRlbXM6IHtcbiAgICAgICAgbm9kZXM6IHNlbGVjdGVkTm9kZXMsXG4gICAgICAgIGVkZ2VzOiBzZWxlY3RlZEVkZ2VzXG4gICAgICB9LFxuICAgICAgc2VsZWN0OiB0cnVlXG4gICAgfSk7XG4gIH0sXG4gIGNyZWF0ZUJydXNoOiBmdW5jdGlvbiBjcmVhdGVCcnVzaCgpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIGJydXNoID0gc2VsZi5ncmFwaC5nZXQoJ2NhbnZhcycpLmFkZFNoYXBlKCdyZWN0Jywge1xuICAgICAgYXR0cnM6IHNlbGYuYnJ1c2hTdHlsZSxcbiAgICAgIGNhcHR1cmU6IGZhbHNlLFxuICAgICAgbmFtZTogJ2JydXNoLXNoYXBlJ1xuICAgIH0pO1xuICAgIHRoaXMuYnJ1c2ggPSBicnVzaDtcbiAgICB0aGlzLmRlbGVnYXRlID0gYnJ1c2g7XG4gICAgcmV0dXJuIGJydXNoO1xuICB9LFxuICB1cGRhdGVCcnVzaDogZnVuY3Rpb24gdXBkYXRlQnJ1c2goZSkge1xuICAgIHZhciBvcmlnaW5Qb2ludCA9IHRoaXMub3JpZ2luUG9pbnQ7XG4gICAgdGhpcy5icnVzaC5hdHRyKHtcbiAgICAgIHdpZHRoOiBhYnMoZS5jYW52YXNYIC0gb3JpZ2luUG9pbnQueCksXG4gICAgICBoZWlnaHQ6IGFicyhlLmNhbnZhc1kgLSBvcmlnaW5Qb2ludC55KSxcbiAgICAgIHg6IG1pbihlLmNhbnZhc1gsIG9yaWdpblBvaW50LngpLFxuICAgICAgeTogbWluKGUuY2FudmFzWSwgb3JpZ2luUG9pbnQueSlcbiAgICB9KTtcbiAgfSxcbiAgb25LZXlEb3duOiBmdW5jdGlvbiBvbktleURvd24oZSkge1xuICAgIHZhciBjb2RlID0gZS5rZXk7XG5cbiAgICBpZiAoIWNvZGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgdHJpZ2dlckxvd2VyQ2FzZSA9IHRoaXMudHJpZ2dlci50b0xvd2VyQ2FzZSgpO1xuICAgIHZhciBjb2RlTG93ZXJDYXNlID0gY29kZS50b0xvd2VyQ2FzZSgpOyAvLyDmjInkvY8gY29udHJvbCDplK7ml7bvvIzlhYHorrjnlKjmiLforr7nva4gdHJpZ2dlciDkuLogY3RybFxuXG4gICAgaWYgKGNvZGVMb3dlckNhc2UgPT09IHRyaWdnZXJMb3dlckNhc2UgfHwgY29kZUxvd2VyQ2FzZSA9PT0gJ2NvbnRyb2wnICYmIHRyaWdnZXJMb3dlckNhc2UgPT09ICdjdHJsJyB8fCBjb2RlTG93ZXJDYXNlID09PSAnY3RybCcgJiYgdHJpZ2dlckxvd2VyQ2FzZSA9PT0gJ2NvbnRyb2wnKSB7XG4gICAgICB0aGlzLmtleWRvd24gPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmtleWRvd24gPSBmYWxzZTtcbiAgICB9XG4gIH0sXG4gIG9uS2V5VXA6IGZ1bmN0aW9uIG9uS2V5VXAoKSB7XG4gICAgaWYgKHRoaXMuYnJ1c2gpIHtcbiAgICAgIC8vIOa4hemZpOaJgOaciemAieS4reeKtuaAgeWQju+8jOiuvue9ruaLluW+l+WKqOeKtuaAgeS4umZhbHNl77yM5bm25riF6Zmk5qGG6YCJ55qEYnJ1c2hcbiAgICAgIHRoaXMuYnJ1c2gucmVtb3ZlKHRydWUpO1xuICAgICAgdGhpcy5icnVzaCA9IG51bGw7XG4gICAgICB0aGlzLmRyYWdnaW5nID0gZmFsc2U7XG4gICAgfVxuXG4gICAgdGhpcy5rZXlkb3duID0gZmFsc2U7XG4gIH1cbn07IiwiaW1wb3J0IHsgZWFjaCB9IGZyb20gJ0BhbnR2L3V0aWwnO1xudmFyIERFRkFVTFRfVFJJR0dFUiA9ICdzaGlmdCc7XG52YXIgQUxMT1dfRVZFTlRTID0gWydzaGlmdCcsICdjdHJsJywgJ2FsdCcsICdjb250cm9sJ107XG5leHBvcnQgZGVmYXVsdCB7XG4gIGdldERlZmF1bHRDZmc6IGZ1bmN0aW9uIGdldERlZmF1bHRDZmcoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG11bHRpcGxlOiB0cnVlLFxuICAgICAgdHJpZ2dlcjogREVGQVVMVF9UUklHR0VSLFxuICAgICAgc2VsZWN0ZWRTdGF0ZTogJ3NlbGVjdGVkJ1xuICAgIH07XG4gIH0sXG4gIGdldEV2ZW50czogZnVuY3Rpb24gZ2V0RXZlbnRzKCkge1xuICAgIHZhciBzZWxmID0gdGhpczsgLy8g5qOA5rWL6L6T5YWl5piv5ZCm5ZCI5rOVXG5cbiAgICBpZiAoIShBTExPV19FVkVOVFMuaW5kZXhPZihzZWxmLnRyaWdnZXIudG9Mb3dlckNhc2UoKSkgPiAtMSkpIHtcbiAgICAgIHNlbGYudHJpZ2dlciA9IERFRkFVTFRfVFJJR0dFUjsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcblxuICAgICAgY29uc29sZS53YXJuKFwiQmVoYXZpb3IgYnJ1c2gtc2VsZWN0IOeahCB0cmlnZ2VyIOWPguaVsOS4jeWQiOazle+8jOivt+i+k+WFpSAnZHJhZyfjgIEnc2hpZnQn44CBJ2N0cmwnIOaIliAnYWx0J1wiKTtcbiAgICB9XG5cbiAgICBpZiAoIXNlbGYubXVsdGlwbGUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgICdub2RlOmNsaWNrJzogJ29uQ2xpY2snLFxuICAgICAgICAnY29tYm86Y2xpY2snOiAnb25DbGljaycsXG4gICAgICAgICdjYW52YXM6Y2xpY2snOiAnb25DYW52YXNDbGljaydcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICdub2RlOmNsaWNrJzogJ29uQ2xpY2snLFxuICAgICAgJ2NvbWJvOmNsaWNrJzogJ29uQ2xpY2snLFxuICAgICAgJ2NhbnZhczpjbGljayc6ICdvbkNhbnZhc0NsaWNrJyxcbiAgICAgIGtleXVwOiAnb25LZXlVcCcsXG4gICAgICBrZXlkb3duOiAnb25LZXlEb3duJ1xuICAgIH07XG4gIH0sXG4gIG9uQ2xpY2s6IGZ1bmN0aW9uIG9uQ2xpY2soZXZ0KSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBpdGVtID0gZXZ0Lml0ZW07XG5cbiAgICBpZiAoIWl0ZW0gfHwgaXRlbS5kZXN0cm95ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgdHlwZSA9IGl0ZW0uZ2V0VHlwZSgpO1xuICAgIHZhciBncmFwaCA9IHNlbGYuZ3JhcGgsXG4gICAgICAgIGtleWRvd24gPSBzZWxmLmtleWRvd24sXG4gICAgICAgIG11bHRpcGxlID0gc2VsZi5tdWx0aXBsZSxcbiAgICAgICAgc2hvdWxkVXBkYXRlID0gc2VsZi5zaG91bGRVcGRhdGUsXG4gICAgICAgIHNob3VsZEJlZ2luID0gc2VsZi5zaG91bGRCZWdpbjtcblxuICAgIGlmICghc2hvdWxkQmVnaW4uY2FsbChzZWxmLCBldnQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBhbGxvdyB0byBzZWxlY3QgbXVsdGlwbGUgbm9kZXMgYnV0IGRpZCBub3QgcHJlc3MgYSBrZXkgfHwgZG8gbm90IGFsbG93IHRoZSBzZWxlY3QgbXVsdGlwbGUgbm9kZXNcblxuXG4gICAgaWYgKCFrZXlkb3duIHx8ICFtdWx0aXBsZSkge1xuICAgICAgdmFyIHNlbGVjdGVkID0gZ3JhcGguZmluZEFsbEJ5U3RhdGUoJ25vZGUnLCBzZWxmLnNlbGVjdGVkU3RhdGUpLmNvbmNhdChncmFwaC5maW5kQWxsQnlTdGF0ZSgnY29tYm8nLCBzZWxmLnNlbGVjdGVkU3RhdGUpKTtcbiAgICAgIGVhY2goc2VsZWN0ZWQsIGZ1bmN0aW9uIChjb21ibykge1xuICAgICAgICBpZiAoY29tYm8gIT09IGl0ZW0pIHtcbiAgICAgICAgICBncmFwaC5zZXRJdGVtU3RhdGUoY29tYm8sIHNlbGYuc2VsZWN0ZWRTdGF0ZSwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoaXRlbS5oYXNTdGF0ZShzZWxmLnNlbGVjdGVkU3RhdGUpKSB7XG4gICAgICBpZiAoc2hvdWxkVXBkYXRlLmNhbGwoc2VsZiwgZXZ0KSkge1xuICAgICAgICBncmFwaC5zZXRJdGVtU3RhdGUoaXRlbSwgc2VsZi5zZWxlY3RlZFN0YXRlLCBmYWxzZSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBzZWxlY3RlZE5vZGVzID0gZ3JhcGguZmluZEFsbEJ5U3RhdGUoJ25vZGUnLCBzZWxmLnNlbGVjdGVkU3RhdGUpO1xuICAgICAgdmFyIHNlbGVjdGVkQ29tYm9zID0gZ3JhcGguZmluZEFsbEJ5U3RhdGUoJ2NvbWJvJywgc2VsZi5zZWxlY3RlZFN0YXRlKTtcbiAgICAgIGdyYXBoLmVtaXQoJ25vZGVzZWxlY3RjaGFuZ2UnLCB7XG4gICAgICAgIHRhcmdldDogaXRlbSxcbiAgICAgICAgc2VsZWN0ZWRJdGVtczoge1xuICAgICAgICAgIG5vZGVzOiBzZWxlY3RlZE5vZGVzLFxuICAgICAgICAgIGNvbWJvczogc2VsZWN0ZWRDb21ib3NcbiAgICAgICAgfSxcbiAgICAgICAgc2VsZWN0OiBmYWxzZVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChzaG91bGRVcGRhdGUuY2FsbChzZWxmLCBldnQpKSB7XG4gICAgICAgIGdyYXBoLnNldEl0ZW1TdGF0ZShpdGVtLCBzZWxmLnNlbGVjdGVkU3RhdGUsIHRydWUpO1xuICAgICAgfVxuXG4gICAgICB2YXIgc2VsZWN0ZWROb2RlcyA9IGdyYXBoLmZpbmRBbGxCeVN0YXRlKCdub2RlJywgc2VsZi5zZWxlY3RlZFN0YXRlKTtcbiAgICAgIHZhciBzZWxlY3RlZENvbWJvcyA9IGdyYXBoLmZpbmRBbGxCeVN0YXRlKCdjb21ibycsIHNlbGYuc2VsZWN0ZWRTdGF0ZSk7XG4gICAgICBncmFwaC5lbWl0KCdub2Rlc2VsZWN0Y2hhbmdlJywge1xuICAgICAgICB0YXJnZXQ6IGl0ZW0sXG4gICAgICAgIHNlbGVjdGVkSXRlbXM6IHtcbiAgICAgICAgICBub2Rlczogc2VsZWN0ZWROb2RlcyxcbiAgICAgICAgICBjb21ib3M6IHNlbGVjdGVkQ29tYm9zXG4gICAgICAgIH0sXG4gICAgICAgIHNlbGVjdDogdHJ1ZVxuICAgICAgfSk7XG4gICAgfVxuICB9LFxuICBvbkNhbnZhc0NsaWNrOiBmdW5jdGlvbiBvbkNhbnZhc0NsaWNrKCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICB2YXIgZ3JhcGggPSB0aGlzLmdyYXBoO1xuICAgIHZhciBzZWxlY3RlZCA9IGdyYXBoLmZpbmRBbGxCeVN0YXRlKCdub2RlJywgdGhpcy5zZWxlY3RlZFN0YXRlKTtcbiAgICBlYWNoKHNlbGVjdGVkLCBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgZ3JhcGguc2V0SXRlbVN0YXRlKG5vZGUsIF90aGlzLnNlbGVjdGVkU3RhdGUsIGZhbHNlKTtcbiAgICB9KTtcbiAgICB2YXIgc2VsZWN0ZWRDb21ib3MgPSBncmFwaC5maW5kQWxsQnlTdGF0ZSgnY29tYm8nLCB0aGlzLnNlbGVjdGVkU3RhdGUpO1xuICAgIGVhY2goc2VsZWN0ZWRDb21ib3MsIGZ1bmN0aW9uIChjb21ibykge1xuICAgICAgZ3JhcGguc2V0SXRlbVN0YXRlKGNvbWJvLCBfdGhpcy5zZWxlY3RlZFN0YXRlLCBmYWxzZSk7XG4gICAgfSk7XG4gICAgZ3JhcGguZW1pdCgnbm9kZXNlbGVjdGNoYW5nZScsIHtcbiAgICAgIHNlbGVjdGVkSXRlbXM6IHtcbiAgICAgICAgbm9kZXM6IFtdLFxuICAgICAgICBlZGdlczogW10sXG4gICAgICAgIGNvbWJvczogW11cbiAgICAgIH0sXG4gICAgICBzZWxlY3Q6IGZhbHNlXG4gICAgfSk7XG4gIH0sXG4gIG9uS2V5RG93bjogZnVuY3Rpb24gb25LZXlEb3duKGUpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIGNvZGUgPSBlLmtleTtcblxuICAgIGlmICghY29kZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChjb2RlLnRvTG93ZXJDYXNlKCkgPT09IHRoaXMudHJpZ2dlci50b0xvd2VyQ2FzZSgpIHx8IGNvZGUudG9Mb3dlckNhc2UoKSA9PT0gJ2NvbnRyb2wnKSB7XG4gICAgICBzZWxmLmtleWRvd24gPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZWxmLmtleWRvd24gPSBmYWxzZTtcbiAgICB9XG4gIH0sXG4gIG9uS2V5VXA6IGZ1bmN0aW9uIG9uS2V5VXAoKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHNlbGYua2V5ZG93biA9IGZhbHNlO1xuICB9XG59OyIsImltcG9ydCB7IGV4dCB9IGZyb20gJ0BhbnR2L21hdHJpeC11dGlsJztcbmltcG9ydCB7IGNsb25lIH0gZnJvbSAnQGFudHYvdXRpbCc7XG52YXIgdHJhbnNmb3JtID0gZXh0LnRyYW5zZm9ybTtcbnZhciBERUxUQSA9IDAuMDU7XG5leHBvcnQgZGVmYXVsdCB7XG4gIGdldERlZmF1bHRDZmc6IGZ1bmN0aW9uIGdldERlZmF1bHRDZmcoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNlbnNpdGl2aXR5OiAyLFxuICAgICAgbWluWm9vbTogdW5kZWZpbmVkLFxuICAgICAgbWF4Wm9vbTogdW5kZWZpbmVkLFxuICAgICAgZW5hYmxlT3B0aW1pemU6IGZhbHNlLFxuICAgICAgb3B0aW1pemVab29tOiAwLjEsXG4gICAgICBmaXhTZWxlY3RlZEl0ZW1zOiB7XG4gICAgICAgIGZpeEFsbDogZmFsc2UsXG4gICAgICAgIGZpeExpbmVXaWR0aDogZmFsc2UsXG4gICAgICAgIGZpeExhYmVsOiBmYWxzZSxcbiAgICAgICAgZml4U3RhdGU6ICdzZWxlY3RlZCdcbiAgICAgIH1cbiAgICB9O1xuICB9LFxuICBnZXRFdmVudHM6IGZ1bmN0aW9uIGdldEV2ZW50cygpIHtcbiAgICB2YXIgZml4U2VsZWN0ZWRJdGVtcyA9IHRoaXMuZml4U2VsZWN0ZWRJdGVtcztcbiAgICBpZiAoIWZpeFNlbGVjdGVkSXRlbXMuZml4U3RhdGUpIGZpeFNlbGVjdGVkSXRlbXMuZml4U3RhdGUgPSAnc2VsZWN0ZWQnO1xuXG4gICAgaWYgKGZpeFNlbGVjdGVkSXRlbXMuZml4QWxsKSB7XG4gICAgICBmaXhTZWxlY3RlZEl0ZW1zLmZpeExpbmVXaWR0aCA9IHRydWU7XG4gICAgICBmaXhTZWxlY3RlZEl0ZW1zLmZpeExhYmVsID0gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgd2hlZWw6ICdvbldoZWVsJyxcbiAgICAgIHRvdWNoc3RhcnQ6ICdvblRvdWNoU3RhcnQnLFxuICAgICAgdG91Y2htb3ZlOiAnb25Ub3VjaE1vdmUnLFxuICAgICAgdG91Y2hlbmQ6ICdvblRvdWNoRW5kJ1xuICAgIH07XG4gIH0sXG4gIG9uVG91Y2hTdGFydDogZnVuY3Rpb24gb25Ub3VjaFN0YXJ0KGV2dCkge1xuICAgIHZhciB0b3VjaGVzID0gZXZ0Lm9yaWdpbmFsRXZlbnQudG91Y2hlcztcbiAgICB2YXIgZXZlbnQxID0gdG91Y2hlc1swXTtcbiAgICB2YXIgZXZlbnQyID0gdG91Y2hlc1sxXTtcbiAgICBldnQucHJldmVudERlZmF1bHQoKTsgLy8g5aaC5p6c5LiN5piv57yp5pS+5LqL5Lu25YiZ56aB5q2i57un57ut5omn6KGMXG5cbiAgICBpZiAoIWV2ZW50Mikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNob3VsZEJlZ2luICYmICF0aGlzLnNob3VsZEJlZ2luLmNhbGwodGhpcywgZXZ0KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8g56ys5LiA5Liq6Kem5pG454K55L2N572uXG5cblxuICAgIHRoaXMuc3RhcnRQb2ludCA9IHtcbiAgICAgIHBhZ2VYOiBldmVudDEucGFnZVgsXG4gICAgICBwYWdlWTogZXZlbnQxLnBhZ2VZXG4gICAgfTtcbiAgICB0aGlzLm1vdmVhYmxlID0gdHJ1ZTtcblxuICAgIGlmIChldmVudDIpIHtcbiAgICAgIHRoaXMuZW5kUG9pbnQgPSB7XG4gICAgICAgIHBhZ2VYOiBldmVudDIucGFnZVgsXG4gICAgICAgIHBhZ2VZOiBldmVudDIucGFnZVlcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdGhpcy5vcmlnaW5TY2FsZSA9IHRoaXMuZ3JhcGguZ2V0Wm9vbSgpIHx8IHRoaXMuY3VycmVudFNjYWxlIHx8IDE7XG4gIH0sXG4gIG9uVG91Y2hNb3ZlOiBmdW5jdGlvbiBvblRvdWNoTW92ZShldnQpIHtcbiAgICBpZiAoIXRoaXMubW92ZWFibGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBldnQucHJldmVudERlZmF1bHQoKTtcbiAgICB2YXIgdG91Y2hlcyA9IGV2dC5vcmlnaW5hbEV2ZW50LnRvdWNoZXM7XG4gICAgdmFyIGV2ZW50MSA9IHRvdWNoZXNbMF07XG4gICAgdmFyIGV2ZW50MiA9IHRvdWNoZXNbMV07XG5cbiAgICBpZiAoIWV2ZW50Mikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5lbmRQb2ludCkge1xuICAgICAgdGhpcy5lbmRQb2ludCA9IHtcbiAgICAgICAgcGFnZVg6IGV2ZW50Mi5wYWdlWCxcbiAgICAgICAgcGFnZVk6IGV2ZW50Mi5wYWdlWVxuICAgICAgfTtcbiAgICB9IC8vIOiOt+WPluWdkOagh+S5i+mXtOeahOi3neemu1xuXG5cbiAgICB2YXIgZ2V0RGlzdGFuY2UgPSBmdW5jdGlvbiBnZXREaXN0YW5jZShzdGFydCwgZW5kKSB7XG4gICAgICByZXR1cm4gTWF0aC5oeXBvdChlbmQueCAtIHN0YXJ0LngsIGVuZC55IC0gc3RhcnQueSk7XG4gICAgfTsgLy8g5Y+M5oyH57yp5pS+5q+U5L6LXG5cblxuICAgIHZhciBzY2FsZSA9IGdldERpc3RhbmNlKHtcbiAgICAgIHg6IGV2ZW50MS5wYWdlWCxcbiAgICAgIHk6IGV2ZW50MS5wYWdlWVxuICAgIH0sIHtcbiAgICAgIHg6IGV2ZW50Mi5wYWdlWCxcbiAgICAgIHk6IGV2ZW50Mi5wYWdlWVxuICAgIH0pIC8gZ2V0RGlzdGFuY2Uoe1xuICAgICAgeDogdGhpcy5zdGFydFBvaW50LnBhZ2VYLFxuICAgICAgeTogdGhpcy5zdGFydFBvaW50LnBhZ2VZXG4gICAgfSwge1xuICAgICAgeDogdGhpcy5lbmRQb2ludC5wYWdlWCxcbiAgICAgIHk6IHRoaXMuZW5kUG9pbnQucGFnZVlcbiAgICB9KTsgLy8g5bqU55So5Yiw55S75biD5LiK55qE57yp5pS+5q+U5L6LXG5cbiAgICB2YXIgem9vbSA9IHRoaXMub3JpZ2luU2NhbGUgKiBzY2FsZTsgLy8g57yT5a2Y5b2T5YmN55qE57yp5pS+5q+U5L6LXG5cbiAgICB0aGlzLmN1cnJlbnRTY2FsZSA9IHpvb207XG4gICAgdmFyIG1pblpvb20gPSB0aGlzLmdldCgnbWluWm9vbScpIHx8IHRoaXMuZ3JhcGguZ2V0KCdtaW5ab29tJyk7XG4gICAgdmFyIG1heFpvb20gPSB0aGlzLmdldCgnbWF4Wm9vbScpIHx8IHRoaXMuZ3JhcGguZ2V0KCdtYXhab29tJyk7XG5cbiAgICBpZiAoem9vbSA+IG1heFpvb20gfHwgem9vbSA8IG1pblpvb20pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgY2FudmFzID0gdGhpcy5ncmFwaC5nZXQoJ2NhbnZhcycpO1xuICAgIHZhciBwb2ludCA9IGNhbnZhcy5nZXRQb2ludEJ5Q2xpZW50KGV2dC5jbGllbnRYLCBldnQuY2xpZW50WSk7XG4gICAgdGhpcy5ncmFwaC56b29tVG8oem9vbSwge1xuICAgICAgeDogcG9pbnQueCxcbiAgICAgIHk6IHBvaW50LnlcbiAgICB9KTtcbiAgICB0aGlzLmdyYXBoLmVtaXQoJ3doZWVsem9vbScsIGV2dCk7XG4gIH0sXG4gIG9uVG91Y2hFbmQ6IGZ1bmN0aW9uIG9uVG91Y2hFbmQoKSB7XG4gICAgdGhpcy5tb3ZlYWJsZSA9IGZhbHNlO1xuICAgIHRoaXMuZW5kUG9pbnQgPSBudWxsO1xuICB9LFxuICBvbldoZWVsOiBmdW5jdGlvbiBvbldoZWVsKGUpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdmFyIF9hID0gdGhpcyxcbiAgICAgICAgZ3JhcGggPSBfYS5ncmFwaCxcbiAgICAgICAgZml4U2VsZWN0ZWRJdGVtcyA9IF9hLmZpeFNlbGVjdGVkSXRlbXM7XG5cbiAgICBpZiAodGhpcy5zaG91bGRCZWdpbiAmJiAhdGhpcy5zaG91bGRCZWdpbi5jYWxsKHRoaXMsIGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnNob3VsZFVwZGF0ZS5jYWxsKHRoaXMsIGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHZhciBjYW52YXMgPSBncmFwaC5nZXQoJ2NhbnZhcycpO1xuICAgIHZhciBwb2ludCA9IGNhbnZhcy5nZXRQb2ludEJ5Q2xpZW50KGUuY2xpZW50WCwgZS5jbGllbnRZKTtcbiAgICB2YXIgc2Vuc2l0aXZpdHkgPSB0aGlzLmdldCgnc2Vuc2l0aXZpdHknKTtcbiAgICB2YXIgZ3JhcGhab29tID0gZ3JhcGguZ2V0Wm9vbSgpO1xuICAgIHZhciByYXRpbyA9IGdyYXBoWm9vbTtcbiAgICB2YXIgem9vbSA9IGdyYXBoWm9vbTsgLy8g5YW85a65SUXjgIFGaXJlZm945Y+KQ2hyb21lXG5cbiAgICBpZiAoZS53aGVlbERlbHRhIDwgMCkge1xuICAgICAgcmF0aW8gPSAxIC0gREVMVEEgKiBzZW5zaXRpdml0eTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmF0aW8gPSAxIC8gKDEgLSBERUxUQSAqIHNlbnNpdGl2aXR5KTtcbiAgICB9XG5cbiAgICB6b29tID0gZ3JhcGhab29tICogcmF0aW87IC8vIGNvbnN0IHpvb20gPSByYXRpbyAqIGdyYXBoWm9vbTtcblxuICAgIHZhciBtaW5ab29tID0gdGhpcy5nZXQoJ21pblpvb20nKSB8fCBncmFwaC5nZXQoJ21pblpvb20nKTtcbiAgICB2YXIgbWF4Wm9vbSA9IHRoaXMuZ2V0KCdtYXhab29tJykgfHwgZ3JhcGguZ2V0KCdtYXhab29tJyk7XG5cbiAgICBpZiAoem9vbSA+IG1heFpvb20gfHwgem9vbSA8IG1pblpvb20pIHtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIGhpZGUgdGhlIHNoYXBlcyB3aGVuIHRoZSB6b29tIHJhdGlvIGlzIHNtYWxsZXIgdGhhbiBvcHRpbWl6ZVpvb21cbiAgICAvLyBoaWRlIHRoZSBzaGFwZXMgd2hlbiB6b29tbWluZ1xuXG5cbiAgICB2YXIgZW5hYmxlT3B0aW1pemUgPSB0aGlzLmdldCgnZW5hYmxlT3B0aW1pemUnKTtcblxuICAgIGlmIChlbmFibGVPcHRpbWl6ZSkge1xuICAgICAgdmFyIG9wdGltaXplWm9vbV8xID0gdGhpcy5nZXQoJ29wdGltaXplWm9vbScpO1xuICAgICAgdmFyIG9wdGltaXplZCA9IHRoaXMuZ2V0KCdvcHRpbWl6ZWQnKTtcbiAgICAgIHZhciBub2Rlc18xID0gZ3JhcGguZ2V0Tm9kZXMoKTtcbiAgICAgIHZhciBlZGdlc18xID0gZ3JhcGguZ2V0RWRnZXMoKTtcbiAgICAgIHZhciBub2Rlc0xlbmd0aF8xID0gbm9kZXNfMS5sZW5ndGg7XG4gICAgICB2YXIgZWRnZXNMZW5ndGhfMSA9IGVkZ2VzXzEubGVuZ3RoOyAvLyBoaWRpbmdcblxuICAgICAgaWYgKCFvcHRpbWl6ZWQpIHtcbiAgICAgICAgZm9yICh2YXIgbiA9IDA7IG4gPCBub2Rlc0xlbmd0aF8xOyBuKyspIHtcbiAgICAgICAgICB2YXIgbm9kZSA9IG5vZGVzXzFbbl07XG5cbiAgICAgICAgICBpZiAoIW5vZGUuZGVzdHJveWVkKSB7XG4gICAgICAgICAgICB2YXIgY2hpbGRyZW4gPSBub2RlLmdldCgnZ3JvdXAnKS5nZXQoJ2NoaWxkcmVuJyk7XG4gICAgICAgICAgICB2YXIgY2hpbGRyZW5MZW5ndGggPSBjaGlsZHJlbi5sZW5ndGg7XG5cbiAgICAgICAgICAgIGZvciAodmFyIGMgPSAwOyBjIDwgY2hpbGRyZW5MZW5ndGg7IGMrKykge1xuICAgICAgICAgICAgICB2YXIgc2hhcGUgPSBjaGlsZHJlbltjXTtcblxuICAgICAgICAgICAgICBpZiAoIXNoYXBlLmRlc3RvcnllZCAmJiAhc2hhcGUuZ2V0KCdpc0tleVNoYXBlJykpIHtcbiAgICAgICAgICAgICAgICBzaGFwZS5zZXQoJ29yaS12aXNpYmlsaXR5Jywgc2hhcGUuZ2V0KCdvcmktdmlzaWJpbGl0eScpIHx8IHNoYXBlLmdldCgndmlzaWJsZScpKTtcbiAgICAgICAgICAgICAgICBzaGFwZS5oaWRlKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKHZhciBlZGdlSW5kZXggPSAwOyBlZGdlSW5kZXggPCBlZGdlc0xlbmd0aF8xOyBlZGdlSW5kZXgrKykge1xuICAgICAgICAgIHZhciBlZGdlID0gZWRnZXNfMVtlZGdlSW5kZXhdO1xuICAgICAgICAgIHZhciBjaGlsZHJlbiA9IGVkZ2UuZ2V0KCdncm91cCcpLmdldCgnY2hpbGRyZW4nKTtcbiAgICAgICAgICB2YXIgY2hpbGRyZW5MZW5ndGggPSBjaGlsZHJlbi5sZW5ndGg7XG5cbiAgICAgICAgICBmb3IgKHZhciBjID0gMDsgYyA8IGNoaWxkcmVuTGVuZ3RoOyBjKyspIHtcbiAgICAgICAgICAgIHZhciBzaGFwZSA9IGNoaWxkcmVuW2NdO1xuICAgICAgICAgICAgc2hhcGUuc2V0KCdvcmktdmlzaWJpbGl0eScsIHNoYXBlLmdldCgnb3JpLXZpc2liaWxpdHknKSB8fCBzaGFwZS5nZXQoJ3Zpc2libGUnKSk7XG4gICAgICAgICAgICBzaGFwZS5oaWRlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZXQoJ29wdGltaXplZCcsIHRydWUpO1xuICAgICAgfSAvLyBzaG93aW5nIGFmdGVyIDEwMG1zXG5cblxuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuZ2V0KCd0aW1lb3V0JykpO1xuICAgICAgdmFyIHRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGN1cnJlbnRab29tID0gZ3JhcGguZ2V0Wm9vbSgpO1xuXG4gICAgICAgIHZhciBjdXJPcHRpbWl6ZWQgPSBfdGhpcy5nZXQoJ29wdGltaXplZCcpO1xuXG4gICAgICAgIGlmIChjdXJPcHRpbWl6ZWQpIHtcbiAgICAgICAgICBfdGhpcy5zZXQoJ29wdGltaXplZCcsIGZhbHNlKTtcblxuICAgICAgICAgIGZvciAodmFyIG4gPSAwOyBuIDwgbm9kZXNMZW5ndGhfMTsgbisrKSB7XG4gICAgICAgICAgICB2YXIgbm9kZSA9IG5vZGVzXzFbbl07XG4gICAgICAgICAgICB2YXIgY2hpbGRyZW4gPSBub2RlLmdldCgnZ3JvdXAnKS5nZXQoJ2NoaWxkcmVuJyk7XG4gICAgICAgICAgICB2YXIgY2hpbGRyZW5MZW5ndGggPSBjaGlsZHJlbi5sZW5ndGg7XG5cbiAgICAgICAgICAgIGlmIChjdXJyZW50Wm9vbSA8IG9wdGltaXplWm9vbV8xKSB7XG4gICAgICAgICAgICAgIHZhciBrZXlTaGFwZSA9IG5vZGUuZ2V0S2V5U2hhcGUoKTtcbiAgICAgICAgICAgICAgdmFyIG9yaVZpcyA9IGtleVNoYXBlLmdldCgnb3JpLXZpc2liaWxpdHknKTtcbiAgICAgICAgICAgICAgaWYgKG9yaVZpcykga2V5U2hhcGUuc2hvdygpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZm9yICh2YXIgYyA9IDA7IGMgPCBjaGlsZHJlbkxlbmd0aDsgYysrKSB7XG4gICAgICAgICAgICAgICAgdmFyIHNoYXBlID0gY2hpbGRyZW5bY107XG4gICAgICAgICAgICAgICAgdmFyIG9yaVZpcyA9IHNoYXBlLmdldCgnb3JpLXZpc2liaWxpdHknKTtcblxuICAgICAgICAgICAgICAgIGlmICghc2hhcGUuZ2V0KCd2aXNpYmxlJykgJiYgb3JpVmlzKSB7XG4gICAgICAgICAgICAgICAgICBpZiAob3JpVmlzKSBzaGFwZS5zaG93KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZm9yICh2YXIgZWRnZUluZGV4ID0gMDsgZWRnZUluZGV4IDwgZWRnZXNMZW5ndGhfMTsgZWRnZUluZGV4KyspIHtcbiAgICAgICAgICAgIHZhciBlZGdlID0gZWRnZXNfMVtlZGdlSW5kZXhdO1xuICAgICAgICAgICAgdmFyIGNoaWxkcmVuID0gZWRnZS5nZXQoJ2dyb3VwJykuZ2V0KCdjaGlsZHJlbicpO1xuICAgICAgICAgICAgdmFyIGNoaWxkcmVuTGVuZ3RoID0gY2hpbGRyZW4ubGVuZ3RoO1xuXG4gICAgICAgICAgICBpZiAoY3VycmVudFpvb20gPCBvcHRpbWl6ZVpvb21fMSkge1xuICAgICAgICAgICAgICB2YXIga2V5U2hhcGUgPSBlZGdlLmdldEtleVNoYXBlKCk7XG4gICAgICAgICAgICAgIHZhciBvcmlWaXMgPSBrZXlTaGFwZS5nZXQoJ29yaS12aXNpYmlsaXR5Jyk7XG4gICAgICAgICAgICAgIGlmIChvcmlWaXMpIGtleVNoYXBlLnNob3coKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGZvciAodmFyIGMgPSAwOyBjIDwgY2hpbGRyZW5MZW5ndGg7IGMrKykge1xuICAgICAgICAgICAgICAgIHZhciBzaGFwZSA9IGNoaWxkcmVuW2NdO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFzaGFwZS5nZXQoJ3Zpc2libGUnKSkge1xuICAgICAgICAgICAgICAgICAgdmFyIG9yaVZpcyA9IHNoYXBlLmdldCgnb3JpLXZpc2liaWxpdHknKTtcbiAgICAgICAgICAgICAgICAgIGlmIChvcmlWaXMpIHNoYXBlLnNob3coKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sIDEwMCk7XG4gICAgICB0aGlzLnNldCgndGltZW91dCcsIHRpbWVvdXQpO1xuICAgIH0gLy8gZml4IHRoZSBpdGVtcyB3aGVuIHpvb21pbmdcblxuXG4gICAgaWYgKGdyYXBoWm9vbSA8PSAxKSB7XG4gICAgICB2YXIgZml4Tm9kZXMgPSB2b2lkIDAsXG4gICAgICAgICAgZml4RWRnZXMgPSB2b2lkIDA7XG5cbiAgICAgIGlmIChmaXhTZWxlY3RlZEl0ZW1zLmZpeEFsbCB8fCBmaXhTZWxlY3RlZEl0ZW1zLmZpeExpbmVXaWR0aCB8fCBmaXhTZWxlY3RlZEl0ZW1zLmZpeExhYmVsKSB7XG4gICAgICAgIGZpeE5vZGVzID0gZ3JhcGguZmluZEFsbEJ5U3RhdGUoJ25vZGUnLCBmaXhTZWxlY3RlZEl0ZW1zLmZpeFN0YXRlKTtcbiAgICAgICAgZml4RWRnZXMgPSBncmFwaC5maW5kQWxsQnlTdGF0ZSgnZWRnZScsIGZpeFNlbGVjdGVkSXRlbXMuZml4U3RhdGUpO1xuICAgICAgICB2YXIgc2NhbGUgPSBncmFwaFpvb20gLyB6b29tO1xuICAgICAgICB2YXIgZml4Tm9kZXNMZW5ndGggPSBmaXhOb2Rlcy5sZW5ndGg7XG5cbiAgICAgICAgZm9yICh2YXIgZm4gPSAwOyBmbiA8IGZpeE5vZGVzTGVuZ3RoOyBmbisrKSB7XG4gICAgICAgICAgdmFyIG5vZGUgPSBmaXhOb2Rlc1tmbl07XG4gICAgICAgICAgdmFyIGdyb3VwID0gbm9kZS5nZXRDb250YWluZXIoKTtcbiAgICAgICAgICB2YXIgbm9kZU1vZGVsID0gbm9kZS5nZXRNb2RlbCgpO1xuICAgICAgICAgIHZhciBvcmlnaW5TdHlsZSA9IG5vZGUuZ2V0T3JpZ2luU3R5bGUoKTtcbiAgICAgICAgICB2YXIgaXRlbVN0YXRlU3R5bGUgPSBub2RlLmdldFN0YXRlU3R5bGUoZml4U2VsZWN0ZWRJdGVtcy5maXhTdGF0ZSk7XG4gICAgICAgICAgdmFyIHNoYXBlU3RhdGVTdHlsZSA9IG5vZGUuZ2V0KCdzaGFwZUZhY3RvcnknKS5nZXRTaGFwZShub2RlTW9kZWwudHlwZSkuZ2V0U3RhdGVTdHlsZShmaXhTZWxlY3RlZEl0ZW1zLmZpeFN0YXRlLCBub2RlKVtmaXhTZWxlY3RlZEl0ZW1zLmZpeFN0YXRlXTtcblxuICAgICAgICAgIGlmIChmaXhTZWxlY3RlZEl0ZW1zLmZpeEFsbCkge1xuICAgICAgICAgICAgaWYgKHpvb20gPD0gMSkge1xuICAgICAgICAgICAgICB2YXIgZ3JvdXBNYXRyaXggPSBjbG9uZShncm91cC5nZXRNYXRyaXgoKSk7XG4gICAgICAgICAgICAgIGlmICghZ3JvdXBNYXRyaXgpIGdyb3VwTWF0cml4ID0gWzEsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDFdO1xuXG4gICAgICAgICAgICAgIHZhciBfYiA9IG5vZGUuZ2V0TW9kZWwoKSxcbiAgICAgICAgICAgICAgICAgIHggPSBfYi54LFxuICAgICAgICAgICAgICAgICAgeSA9IF9iLnk7XG5cbiAgICAgICAgICAgICAgZ3JvdXBNYXRyaXggPSB0cmFuc2Zvcm0oZ3JvdXBNYXRyaXgsIFtbJ3QnLCAteCwgLXldLCBbJ3MnLCBzY2FsZSwgc2NhbGVdLCBbJ3QnLCB4LCB5XV0pO1xuICAgICAgICAgICAgICBncm91cC5zZXRNYXRyaXgoZ3JvdXBNYXRyaXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgY2hpbGRyZW4gPSBncm91cC5nZXQoJ2NoaWxkcmVuJyk7XG4gICAgICAgICAgICB2YXIgY2hpbGRyZW5MZW5ndGggPSBjaGlsZHJlbi5sZW5ndGg7XG5cbiAgICAgICAgICAgIGZvciAodmFyIGMgPSAwOyBjIDwgY2hpbGRyZW5MZW5ndGg7IGMrKykge1xuICAgICAgICAgICAgICB2YXIgc2hhcGUgPSBjaGlsZHJlbltjXTtcbiAgICAgICAgICAgICAgdmFyIGZvbnRTaXplID0gdm9pZCAwLFxuICAgICAgICAgICAgICAgICAgbGluZVdpZHRoID0gdm9pZCAwO1xuXG4gICAgICAgICAgICAgIGlmIChmaXhTZWxlY3RlZEl0ZW1zLmZpeExhYmVsKSB7XG4gICAgICAgICAgICAgICAgdmFyIHNoYXBlVHlwZSA9IHNoYXBlLmdldCgndHlwZScpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHNoYXBlVHlwZSA9PT0gJ3RleHQnKSB7XG4gICAgICAgICAgICAgICAgICBmb250U2l6ZSA9IHNoYXBlLmF0dHIoJ2ZvbnRTaXplJykgfHwgMTI7XG4gICAgICAgICAgICAgICAgICB2YXIgaXRlbVN0eWxlID0gaXRlbVN0YXRlU3R5bGVbc2hhcGUuZ2V0KCduYW1lJyldO1xuICAgICAgICAgICAgICAgICAgdmFyIHNoYXBlU3R5bGUgPSBzaGFwZVN0YXRlU3R5bGVbc2hhcGUuZ2V0KCduYW1lJyldO1xuICAgICAgICAgICAgICAgICAgdmFyIGl0ZW1Gb250U2l6ZSA9IGl0ZW1TdHlsZSA/IGl0ZW1TdHlsZS5mb250U2l6ZSA6IDEyO1xuICAgICAgICAgICAgICAgICAgdmFyIHNoYXBlRm9udFNpemUgPSBzaGFwZVN0eWxlID8gc2hhcGVTdHlsZS5mb250U2l6ZSA6IDEyO1xuICAgICAgICAgICAgICAgICAgdmFyIG9yaUZvbnRTaXplID0gaXRlbUZvbnRTaXplIHx8IHNoYXBlRm9udFNpemUgfHwgMTI7XG4gICAgICAgICAgICAgICAgICBpZiAoem9vbSA8PSAxKSBzaGFwZS5hdHRyKCdmb250U2l6ZScsIG9yaUZvbnRTaXplIC8gem9vbSk7IC8vICogZ3JhcGhab29tIC8gem9vbVxuXG4gICAgICAgICAgICAgICAgICBpZiAobGluZVdpZHRoKSBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBpZiAoZml4U2VsZWN0ZWRJdGVtcy5maXhMaW5lV2lkdGgpIHtcbiAgICAgICAgICAgICAgICBpZiAoc2hhcGUuZ2V0KCdpc0tleVNoYXBlJykpIHtcbiAgICAgICAgICAgICAgICAgIGxpbmVXaWR0aCA9IHNoYXBlLmF0dHIoJ2xpbmVXaWR0aCcpIHx8IDA7XG4gICAgICAgICAgICAgICAgICB2YXIgb3JpTGluZVdpZHRoID0gaXRlbVN0YXRlU3R5bGUubGluZVdpZHRoIHx8IHNoYXBlU3RhdGVTdHlsZS5saW5lV2lkdGggfHwgb3JpZ2luU3R5bGUubGluZVdpZHRoIHx8IDA7XG4gICAgICAgICAgICAgICAgICBpZiAoem9vbSA8PSAxKSBzaGFwZS5hdHRyKCdsaW5lV2lkdGgnLCBvcmlMaW5lV2lkdGggLyB6b29tKTsgLy8gKiBncmFwaFpvb20gLyB6b29tXG5cbiAgICAgICAgICAgICAgICAgIGlmIChmb250U2l6ZSkgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGZpeEVkZ2VzTGVuZ3RoID0gZml4RWRnZXMubGVuZ3RoO1xuXG4gICAgICAgIGZvciAodmFyIGZlID0gMDsgZmUgPCBmaXhFZGdlc0xlbmd0aDsgZmUrKykge1xuICAgICAgICAgIHZhciBlZGdlID0gZml4RWRnZXNbZmVdO1xuICAgICAgICAgIHZhciBncm91cCA9IGVkZ2UuZ2V0Q29udGFpbmVyKCk7XG4gICAgICAgICAgdmFyIGNoaWxkcmVuID0gZ3JvdXAuZ2V0KCdjaGlsZHJlbicpO1xuICAgICAgICAgIHZhciBub2RlTW9kZWwgPSBlZGdlLmdldE1vZGVsKCk7XG4gICAgICAgICAgdmFyIGl0ZW1TdGF0ZVN0eWxlID0gZWRnZS5nZXRTdGF0ZVN0eWxlKGZpeFNlbGVjdGVkSXRlbXMuZml4U3RhdGUpO1xuICAgICAgICAgIHZhciBzaGFwZVN0YXRlU3R5bGUgPSBlZGdlLmdldCgnc2hhcGVGYWN0b3J5JykuZ2V0U2hhcGUobm9kZU1vZGVsLnR5cGUpLmdldFN0YXRlU3R5bGUoZml4U2VsZWN0ZWRJdGVtcy5maXhTdGF0ZSwgZWRnZSlbZml4U2VsZWN0ZWRJdGVtcy5maXhTdGF0ZV07XG4gICAgICAgICAgdmFyIGNoaWxkcmVuTGVuZ3RoID0gY2hpbGRyZW4ubGVuZ3RoO1xuXG4gICAgICAgICAgZm9yICh2YXIgYyA9IDA7IGMgPCBjaGlsZHJlbkxlbmd0aDsgYysrKSB7XG4gICAgICAgICAgICB2YXIgc2hhcGUgPSBjaGlsZHJlbltjXTtcbiAgICAgICAgICAgIHZhciBmb250U2l6ZSA9IHZvaWQgMCxcbiAgICAgICAgICAgICAgICBsaW5lV2lkdGggPSB2b2lkIDA7XG5cbiAgICAgICAgICAgIGlmIChmaXhTZWxlY3RlZEl0ZW1zLmZpeExhYmVsIHx8IGZpeFNlbGVjdGVkSXRlbXMuZml4QWxsKSB7XG4gICAgICAgICAgICAgIHZhciBzaGFwZVR5cGUgPSBzaGFwZS5nZXQoJ3R5cGUnKTtcblxuICAgICAgICAgICAgICBpZiAoc2hhcGVUeXBlID09PSAndGV4dCcpIHtcbiAgICAgICAgICAgICAgICBmb250U2l6ZSA9IHNoYXBlLmF0dHIoJ2ZvbnRTaXplJykgfHwgMTI7XG4gICAgICAgICAgICAgICAgdmFyIGl0ZW1TdHlsZSA9IGl0ZW1TdGF0ZVN0eWxlW3NoYXBlLmdldCgnbmFtZScpXTtcbiAgICAgICAgICAgICAgICB2YXIgc2hhcGVTdHlsZSA9IHNoYXBlU3RhdGVTdHlsZVtzaGFwZS5nZXQoJ25hbWUnKV07XG4gICAgICAgICAgICAgICAgdmFyIGl0ZW1Gb250U2l6ZSA9IGl0ZW1TdHlsZSA/IGl0ZW1TdHlsZS5mb250U2l6ZSA6IDEyO1xuICAgICAgICAgICAgICAgIHZhciBzaGFwZUZvbnRTaXplID0gc2hhcGVTdHlsZSA/IHNoYXBlU3R5bGUuZm9udFNpemUgOiAxMjtcbiAgICAgICAgICAgICAgICB2YXIgb3JpRm9udFNpemUgPSBpdGVtRm9udFNpemUgfHwgc2hhcGVGb250U2l6ZSB8fCAxMjtcbiAgICAgICAgICAgICAgICBpZiAoem9vbSA8PSAxKSBzaGFwZS5hdHRyKCdmb250U2l6ZScsIG9yaUZvbnRTaXplIC8gem9vbSk7XG4gICAgICAgICAgICAgICAgaWYgKGxpbmVXaWR0aCkgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGZpeFNlbGVjdGVkSXRlbXMuZml4TGluZVdpZHRoIHx8IGZpeFNlbGVjdGVkSXRlbXMuZml4QWxsKSB7XG4gICAgICAgICAgICAgIGlmIChzaGFwZS5nZXQoJ2lzS2V5U2hhcGUnKSkge1xuICAgICAgICAgICAgICAgIGxpbmVXaWR0aCA9IHNoYXBlLmF0dHIoJ2xpbmVXaWR0aCcpIHx8IDA7XG4gICAgICAgICAgICAgICAgdmFyIG9yaUxpbmVXaWR0aCA9IGl0ZW1TdGF0ZVN0eWxlLmxpbmVXaWR0aCB8fCBzaGFwZVN0YXRlU3R5bGUubGluZVdpZHRoIHx8IDE7XG4gICAgICAgICAgICAgICAgaWYgKHpvb20gPD0gMSkgc2hhcGUuYXR0cignbGluZVdpZHRoJywgb3JpTGluZVdpZHRoIC8gem9vbSk7XG4gICAgICAgICAgICAgICAgaWYgKGZvbnRTaXplKSBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGdyYXBoLnpvb21Ubyh6b29tLCB7XG4gICAgICB4OiBwb2ludC54LFxuICAgICAgeTogcG9pbnQueVxuICAgIH0pO1xuICAgIGdyYXBoLmVtaXQoJ3doZWVsem9vbScsIGUpO1xuICB9XG59OyIsImltcG9ydCB7IG1vZGlmeUNTUywgY3JlYXRlRG9tIH0gZnJvbSAnQGFudHYvZG9tLXV0aWwnO1xuZXhwb3J0IGRlZmF1bHQge1xuICBvbk1vdXNlRW50ZXI6IGZ1bmN0aW9uIG9uTW91c2VFbnRlcihlKSB7XG4gICAgdmFyIGl0ZW0gPSBlLml0ZW07XG4gICAgdGhpcy5jdXJyZW50VGFyZ2V0ID0gaXRlbTtcbiAgICB0aGlzLnNob3dUb29sdGlwKGUpO1xuICAgIHRoaXMuZ3JhcGguZW1pdCgndG9vbHRpcGNoYW5nZScsIHtcbiAgICAgIGl0ZW06IGUuaXRlbSxcbiAgICAgIGFjdGlvbjogJ3Nob3cnXG4gICAgfSk7XG4gIH0sXG4gIG9uTW91c2VNb3ZlOiBmdW5jdGlvbiBvbk1vdXNlTW92ZShlKSB7XG4gICAgaWYgKCF0aGlzLnNob3VsZFVwZGF0ZShlKSkge1xuICAgICAgdGhpcy5oaWRlVG9vbHRpcCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5jdXJyZW50VGFyZ2V0IHx8IGUuaXRlbSAhPT0gdGhpcy5jdXJyZW50VGFyZ2V0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy51cGRhdGVQb3NpdGlvbihlKTtcbiAgfSxcbiAgb25Nb3VzZUxlYXZlOiBmdW5jdGlvbiBvbk1vdXNlTGVhdmUoZSkge1xuICAgIGlmICghdGhpcy5zaG91bGRFbmQoZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmhpZGVUb29sdGlwKCk7XG4gICAgdGhpcy5ncmFwaC5lbWl0KCd0b29sdGlwY2hhbmdlJywge1xuICAgICAgaXRlbTogdGhpcy5jdXJyZW50VGFyZ2V0LFxuICAgICAgYWN0aW9uOiAnaGlkZSdcbiAgICB9KTtcbiAgICB0aGlzLmN1cnJlbnRUYXJnZXQgPSBudWxsO1xuICB9LFxuICBzaG93VG9vbHRpcDogZnVuY3Rpb24gc2hvd1Rvb2x0aXAoZSkge1xuICAgIHZhciBjb250YWluZXIgPSB0aGlzLmNvbnRhaW5lcjtcblxuICAgIGlmICghZS5pdGVtIHx8IGUuaXRlbS5kZXN0cm95ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIWNvbnRhaW5lcikge1xuICAgICAgY29udGFpbmVyID0gdGhpcy5jcmVhdGVUb29sdGlwKHRoaXMuZ3JhcGguZ2V0KCdjYW52YXMnKSk7XG4gICAgICB0aGlzLmNvbnRhaW5lciA9IGNvbnRhaW5lcjtcbiAgICB9XG5cbiAgICB2YXIgdGV4dCA9IHRoaXMuZm9ybWF0VGV4dChlLml0ZW0uZ2V0KCdtb2RlbCcpLCBlKTtcbiAgICBjb250YWluZXIuaW5uZXJIVE1MID0gdGV4dDtcbiAgICBtb2RpZnlDU1ModGhpcy5jb250YWluZXIsIHtcbiAgICAgIHZpc2liaWxpdHk6ICd2aXNpYmxlJ1xuICAgIH0pO1xuICAgIHRoaXMudXBkYXRlUG9zaXRpb24oZSk7XG4gIH0sXG4gIGhpZGVUb29sdGlwOiBmdW5jdGlvbiBoaWRlVG9vbHRpcCgpIHtcbiAgICBtb2RpZnlDU1ModGhpcy5jb250YWluZXIsIHtcbiAgICAgIHZpc2liaWxpdHk6ICdoaWRkZW4nXG4gICAgfSk7XG4gIH0sXG4gIHVwZGF0ZVBvc2l0aW9uOiBmdW5jdGlvbiB1cGRhdGVQb3NpdGlvbihlKSB7XG4gICAgdmFyIHNob3VsZEJlZ2luID0gdGhpcy5nZXQoJ3Nob3VsZEJlZ2luJyk7XG5cbiAgICB2YXIgX2EgPSB0aGlzLFxuICAgICAgICB3aWR0aCA9IF9hLndpZHRoLFxuICAgICAgICBoZWlnaHQgPSBfYS5oZWlnaHQsXG4gICAgICAgIGNvbnRhaW5lciA9IF9hLmNvbnRhaW5lcixcbiAgICAgICAgZ3JhcGggPSBfYS5ncmFwaDtcblxuICAgIGlmICghc2hvdWxkQmVnaW4oZSkpIHtcbiAgICAgIG1vZGlmeUNTUyhjb250YWluZXIsIHtcbiAgICAgICAgdmlzaWJpbGl0eTogJ2hpZGRlbidcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBwb2ludCA9IGdyYXBoLmdldFBvaW50QnlDbGllbnQoZS5jbGllbnRYLCBlLmNsaWVudFkpO1xuXG4gICAgdmFyIF9iID0gZ3JhcGguZ2V0Q2FudmFzQnlQb2ludChwb2ludC54LCBwb2ludC55KSxcbiAgICAgICAgeCA9IF9iLngsXG4gICAgICAgIHkgPSBfYi55O1xuXG4gICAgdmFyIGJib3ggPSBjb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICBpZiAoeCA+IHdpZHRoIC8gMikge1xuICAgICAgeCAtPSBiYm94LndpZHRoO1xuICAgIH0gZWxzZSB7XG4gICAgICB4ICs9IHRoaXMub2Zmc2V0O1xuICAgIH1cblxuICAgIGlmICh5ID4gaGVpZ2h0IC8gMikge1xuICAgICAgeSAtPSBiYm94LmhlaWdodDtcbiAgICB9IGVsc2Uge1xuICAgICAgeSArPSB0aGlzLm9mZnNldDtcbiAgICB9XG5cbiAgICB2YXIgbGVmdCA9IHggKyBcInB4XCI7XG4gICAgdmFyIHRvcCA9IHkgKyBcInB4XCI7XG4gICAgbW9kaWZ5Q1NTKHRoaXMuY29udGFpbmVyLCB7XG4gICAgICBsZWZ0OiBsZWZ0LFxuICAgICAgdG9wOiB0b3AsXG4gICAgICB2aXNpYmlsaXR5OiAndmlzaWJsZSdcbiAgICB9KTtcbiAgfSxcbiAgY3JlYXRlVG9vbHRpcDogZnVuY3Rpb24gY3JlYXRlVG9vbHRpcChjYW52YXMpIHtcbiAgICB2YXIgZWwgPSBjYW52YXMuZ2V0KCdlbCcpO1xuICAgIGVsLnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJztcbiAgICB2YXIgY29udGFpbmVyID0gY3JlYXRlRG9tKFwiPGRpdiBjbGFzcz1cXFwiZzYtdG9vbHRpcCBnNi1cIiArIHRoaXMuaXRlbSArIFwiLXRvb2x0aXBcXFwiPjwvZGl2PlwiKTtcbiAgICBlbC5wYXJlbnROb2RlLmFwcGVuZENoaWxkKGNvbnRhaW5lcik7XG4gICAgbW9kaWZ5Q1NTKGNvbnRhaW5lciwge1xuICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICB2aXNpYmlsaXR5OiAndmlzaWJsZSdcbiAgICB9KTtcbiAgICB0aGlzLndpZHRoID0gY2FudmFzLmdldCgnd2lkdGgnKTtcbiAgICB0aGlzLmhlaWdodCA9IGNhbnZhcy5nZXQoJ2hlaWdodCcpO1xuICAgIHRoaXMuY29udGFpbmVyID0gY29udGFpbmVyO1xuICAgIHRoaXMuZ3JhcGguZ2V0KCd0b29sdGlwcycpLnB1c2goY29udGFpbmVyKTtcbiAgICByZXR1cm4gY29udGFpbmVyO1xuICB9XG59OyIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgYmFzZSBmcm9tICcuL3Rvb2x0aXAtYmFzZSc7XG5leHBvcnQgZGVmYXVsdCBfX2Fzc2lnbih7XG4gIGdldERlZmF1bHRDZmc6IGZ1bmN0aW9uIGdldERlZmF1bHRDZmcoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGl0ZW06ICdub2RlJyxcbiAgICAgIG9mZnNldDogMTIsXG4gICAgICBmb3JtYXRUZXh0OiBmdW5jdGlvbiBmb3JtYXRUZXh0KG1vZGVsKSB7XG4gICAgICAgIHJldHVybiBtb2RlbC5sYWJlbDtcbiAgICAgIH1cbiAgICB9O1xuICB9LFxuICBnZXRFdmVudHM6IGZ1bmN0aW9uIGdldEV2ZW50cygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgJ25vZGU6bW91c2VlbnRlcic6ICdvbk1vdXNlRW50ZXInLFxuICAgICAgJ25vZGU6bW91c2VsZWF2ZSc6ICdvbk1vdXNlTGVhdmUnLFxuICAgICAgJ25vZGU6bW91c2Vtb3ZlJzogJ29uTW91c2VNb3ZlJyxcbiAgICAgIGFmdGVycmVtb3ZlaXRlbTogJ29uTW91c2VMZWF2ZSdcbiAgICB9O1xuICB9XG59LCBiYXNlKTsiLCJpbXBvcnQgeyBfX2Fzc2lnbiB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IGJhc2UgZnJvbSAnLi90b29sdGlwLWJhc2UnO1xuZXhwb3J0IGRlZmF1bHQgX19hc3NpZ24oe1xuICBnZXREZWZhdWx0Q2ZnOiBmdW5jdGlvbiBnZXREZWZhdWx0Q2ZnKCkge1xuICAgIHJldHVybiB7XG4gICAgICBpdGVtOiAnZWRnZScsXG4gICAgICBvZmZzZXQ6IDEyLFxuICAgICAgZm9ybWF0VGV4dDogZnVuY3Rpb24gZm9ybWF0VGV4dChtb2RlbCkge1xuICAgICAgICByZXR1cm4gXCJzb3VyY2U6IFwiICsgbW9kZWwuc291cmNlICsgXCIgdGFyZ2V0OiBcIiArIG1vZGVsLnRhcmdldDtcbiAgICAgIH1cbiAgICB9O1xuICB9LFxuICBnZXRFdmVudHM6IGZ1bmN0aW9uIGdldEV2ZW50cygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgJ2VkZ2U6bW91c2VlbnRlcic6ICdvbk1vdXNlRW50ZXInLFxuICAgICAgJ2VkZ2U6bW91c2VsZWF2ZSc6ICdvbk1vdXNlTGVhdmUnLFxuICAgICAgJ2VkZ2U6bW91c2Vtb3ZlJzogJ29uTW91c2VNb3ZlJyxcbiAgICAgIGFmdGVycmVtb3ZlaXRlbTogJ29uTW91c2VMZWF2ZSdcbiAgICB9O1xuICB9XG59LCBiYXNlKTsiLCJ2YXIgREVGQVVMVF9UUklHR0VSID0gJ2NsaWNrJztcbnZhciBBTExPV19FVkVOVFMgPSBbJ2NsaWNrJywgJ2RibGNsaWNrJ107XG5leHBvcnQgZGVmYXVsdCB7XG4gIGdldERlZmF1bHRDZmc6IGZ1bmN0aW9uIGdldERlZmF1bHRDZmcoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC8qKlxuICAgICAgICog5Y+R55Sf5pS257ypL+aJqeWxleWPmOWMluaXtueahOWbnuiwg1xuICAgICAgICovXG4gICAgICB0cmlnZ2VyOiBERUZBVUxUX1RSSUdHRVIsXG4gICAgICBvbkNoYW5nZTogZnVuY3Rpb24gb25DaGFuZ2UoKSB7fVxuICAgIH07XG4gIH0sXG4gIGdldEV2ZW50czogZnVuY3Rpb24gZ2V0RXZlbnRzKCkge1xuICAgIHZhciBfYTtcblxuICAgIHZhciB0cmlnZ2VyOyAvLyDmo4DmtYvovpPlhaXmmK/lkKblkIjms5VcblxuICAgIGlmIChBTExPV19FVkVOVFMuaW5jbHVkZXModGhpcy50cmlnZ2VyKSkge1xuICAgICAgdHJpZ2dlciA9IHRoaXMudHJpZ2dlcjtcbiAgICB9IGVsc2Uge1xuICAgICAgdHJpZ2dlciA9IERFRkFVTFRfVFJJR0dFUjsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcblxuICAgICAgY29uc29sZS53YXJuKFwiQmVoYXZpb3IgY29sbGFwc2UtZXhwYW5kIOeahCB0cmlnZ2VyIOWPguaVsOS4jeWQiOazle+8jOivt+i+k+WFpSAnY2xpY2snIOaIliAnZGJsY2xpY2snXCIpO1xuICAgIH1cblxuICAgIHJldHVybiBfYSA9IHt9LCBfYVtcIm5vZGU6XCIgKyB0cmlnZ2VyXSA9ICdvbk5vZGVDbGljaycsIC8vIOaUr+aMgeenu+WKqOerr+S6i+S7tlxuICAgIF9hLnRvdWNoc3RhcnQgPSAnb25Ob2RlQ2xpY2snLCBfYTtcbiAgfSxcbiAgb25Ob2RlQ2xpY2s6IGZ1bmN0aW9uIG9uTm9kZUNsaWNrKGUpIHtcbiAgICB2YXIgaXRlbSA9IGUuaXRlbTtcbiAgICBpZiAoIWl0ZW0pIHJldHVybjsgLy8g5aaC5p6c6IqC54K56L+b6KGM6L+H5pu05paw77yMbW9kZWwg5Lya6L+b6KGMIG1lcmdl77yM55u05o6l5pS5IG1vZGVsIOWwseS4jeiDveaUueW4g+WxgO+8jOaJgOS7pemcgOimgeWOu+aUuea6kOaVsOaNrlxuXG4gICAgdmFyIHNvdXJjZURhdGEgPSB0aGlzLmdyYXBoLmZpbmREYXRhQnlJZChpdGVtLmdldCgnaWQnKSk7XG5cbiAgICBpZiAoIXNvdXJjZURhdGEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgY2hpbGRyZW4gPSBzb3VyY2VEYXRhLmNoaWxkcmVuOyAvLyDlj7blrZDoioLngrnnmoTmlLbnvKnlkozlsZXlvIDmsqHmnInmhI/kuYlcblxuICAgIGlmICghY2hpbGRyZW4gfHwgY2hpbGRyZW4ubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGNvbGxhcHNlZCA9ICFzb3VyY2VEYXRhLmNvbGxhcHNlZDtcblxuICAgIGlmICghdGhpcy5zaG91bGRCZWdpbihlLCBjb2xsYXBzZWQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc291cmNlRGF0YS5jb2xsYXBzZWQgPSBjb2xsYXBzZWQ7XG4gICAgaXRlbS5nZXRNb2RlbCgpLmNvbGxhcHNlZCA9IGNvbGxhcHNlZDtcbiAgICB0aGlzLmdyYXBoLmVtaXQoJ2l0ZW1jb2xsYXBzZWQnLCB7XG4gICAgICBpdGVtOiBlLml0ZW0sXG4gICAgICBjb2xsYXBzZWQ6IGNvbGxhcHNlZFxuICAgIH0pO1xuXG4gICAgaWYgKCF0aGlzLnNob3VsZFVwZGF0ZShlLCBjb2xsYXBzZWQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5vbkNoYW5nZShpdGVtLCBjb2xsYXBzZWQpO1xuICAgIHRoaXMuZ3JhcGgubGF5b3V0KCk7XG4gIH1cbn07IiwiaW1wb3J0IHsgX19hc3NpZ24gfSBmcm9tIFwidHNsaWJcIjtcbi8qXG4gKiBAQXV0aG9yOiBtb3llZVxuICogQExhc3RFZGl0b3JzOiBtb3llZVxuICogQERlc2NyaXB0aW9uOiDmi5bliqggQ29tYm9cbiAqL1xuXG5pbXBvcnQgeyBlYWNoIH0gZnJvbSAnQGFudHYvdXRpbCc7XG5pbXBvcnQgVXRpbCBmcm9tICcuLi91dGlsJztcbmltcG9ydCBHbG9iYWwgZnJvbSAnLi4vZ2xvYmFsJztcbnZhciBjYWxjdWxhdGlvbkl0ZW1zQkJveCA9IFV0aWwuY2FsY3VsYXRpb25JdGVtc0JCb3g7XG4vKipcbiAqIOmBjeWOhuaLluWKqOeahCBDb21ibyDkuIvnmoTmiYDmnIkgQ29tYm9cbiAqIEBwYXJhbSBkYXRhIOaLluWKqOeahCBDb21ib1xuICogQHBhcmFtIGZuXG4gKi9cblxudmFyIHRyYXZlcnNlQ29tYm8gPSBmdW5jdGlvbiB0cmF2ZXJzZUNvbWJvKGRhdGEsIGZuKSB7XG4gIGlmIChmbihkYXRhKSA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoZGF0YSkge1xuICAgIHZhciBjb21ib3MgPSBkYXRhLmdldCgnY29tYm9zJyk7XG5cbiAgICBpZiAoY29tYm9zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGVhY2goY29tYm9zLCBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgIHRyYXZlcnNlQ29tYm8oY2hpbGQsIGZuKTtcbiAgICB9KTtcbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQge1xuICBnZXREZWZhdWx0Q2ZnOiBmdW5jdGlvbiBnZXREZWZhdWx0Q2ZnKCkge1xuICAgIHJldHVybiB7XG4gICAgICBlbmFibGVEZWxlZ2F0ZTogZmFsc2UsXG4gICAgICBkZWxlZ2F0ZVN0eWxlOiB7fSxcbiAgICAgIC8vIOaLluWKqOiKgueCuei/h+eoi+S4reaYr+WQpuWPquaUueWPmCBDb21ibyDnmoTlpKflsI/vvIzogIzkuI3mlLnlj5jlhbbnu5PmnoRcbiAgICAgIG9ubHlDaGFuZ2VDb21ib1NpemU6IGZhbHNlLFxuICAgICAgLy8g5ouW5Yqo6L+H56iL5Lit55uu5qCHIGNvbWJvIOeKtuaAgeagt+W8j1xuICAgICAgYWN0aXZlU3RhdGU6ICcnLFxuICAgICAgc2VsZWN0ZWRTdGF0ZTogJ3NlbGVjdGVkJ1xuICAgIH07XG4gIH0sXG4gIGdldEV2ZW50czogZnVuY3Rpb24gZ2V0RXZlbnRzKCkge1xuICAgIHJldHVybiB7XG4gICAgICAnY29tYm86ZHJhZ3N0YXJ0JzogJ29uRHJhZ1N0YXJ0JyxcbiAgICAgICdjb21ibzpkcmFnJzogJ29uRHJhZycsXG4gICAgICAnY29tYm86ZHJhZ2VuZCc6ICdvbkRyYWdFbmQnLFxuICAgICAgJ2NvbWJvOmRyb3AnOiAnb25Ecm9wJyxcbiAgICAgICdub2RlOmRyb3AnOiAnb25Ob2RlRHJvcCcsXG4gICAgICAnY29tYm86ZHJhZ2VudGVyJzogJ29uRHJhZ0VudGVyJyxcbiAgICAgICdjb21ibzpkcmFnbGVhdmUnOiAnb25EcmFnTGVhdmUnXG4gICAgfTtcbiAgfSxcbiAgdmFsaWRhdGlvbkNvbWJvOiBmdW5jdGlvbiB2YWxpZGF0aW9uQ29tYm8oZXZ0KSB7XG4gICAgdmFyIGl0ZW0gPSBldnQuaXRlbTtcblxuICAgIGlmICghaXRlbSB8fCBpdGVtLmRlc3Ryb3llZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5zaG91bGRVcGRhdGUuY2FsbCh0aGlzLCBldnQpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdmFyIHR5cGUgPSBpdGVtLmdldFR5cGUoKTtcblxuICAgIGlmICh0eXBlICE9PSAnY29tYm8nKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIG9uRHJhZ1N0YXJ0OiBmdW5jdGlvbiBvbkRyYWdTdGFydChldnQpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdmFyIGdyYXBoID0gdGhpcy5ncmFwaDtcbiAgICB2YXIgaXRlbSA9IGV2dC5pdGVtO1xuICAgIHRoaXMuY3VycmVudFNob3VsZEVuZCA9IHRydWU7XG4gICAgaWYgKCF0aGlzLnZhbGlkYXRpb25Db21ibyhldnQpKSByZXR1cm47XG4gICAgdGhpcy50YXJnZXRzID0gW107IC8vIOiOt+WPluaJgOaciemAieS4reeahCBDb21ib1xuXG4gICAgdmFyIGNvbWJvcyA9IGdyYXBoLmZpbmRBbGxCeVN0YXRlKCdjb21ibycsIHRoaXMuc2VsZWN0ZWRTdGF0ZSk7XG4gICAgdmFyIGN1cnJlbnRDb21ibyA9IGl0ZW0uZ2V0KCdpZCcpO1xuICAgIHZhciBkcmFnQ29tYm9zID0gY29tYm9zLmZpbHRlcihmdW5jdGlvbiAoY29tYm8pIHtcbiAgICAgIHZhciBjb21ib0lkID0gY29tYm8uZ2V0KCdpZCcpO1xuICAgICAgcmV0dXJuIGN1cnJlbnRDb21ibyA9PT0gY29tYm9JZDtcbiAgICB9KTtcblxuICAgIGlmIChkcmFnQ29tYm9zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy50YXJnZXRzLnB1c2goaXRlbSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudGFyZ2V0cyA9IGNvbWJvcztcbiAgICB9XG5cbiAgICBpZiAodGhpcy5hY3RpdmVTdGF0ZSkge1xuICAgICAgdGhpcy50YXJnZXRzLm1hcChmdW5jdGlvbiAoY29tYm8pIHtcbiAgICAgICAgdmFyIG1vZGVsID0gY29tYm8uZ2V0TW9kZWwoKTtcblxuICAgICAgICBpZiAobW9kZWwucGFyZW50SWQpIHtcbiAgICAgICAgICB2YXIgcGFyZW50Q29tYm8gPSBncmFwaC5maW5kQnlJZChtb2RlbC5wYXJlbnRJZCk7XG5cbiAgICAgICAgICBpZiAocGFyZW50Q29tYm8pIHtcbiAgICAgICAgICAgIGdyYXBoLnNldEl0ZW1TdGF0ZShwYXJlbnRDb21ibywgX3RoaXMuYWN0aXZlU3RhdGUsIHRydWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5wb2ludCA9IHt9O1xuICAgIHRoaXMub3JpZ2luUG9pbnQgPSB7fTtcbiAgICB0aGlzLm9yaWdpbiA9IHtcbiAgICAgIHg6IGV2dC54LFxuICAgICAgeTogZXZ0LnlcbiAgICB9O1xuICAgIHRoaXMuY3VycmVudEl0ZW1DaGlsZENvbWJvcyA9IFtdO1xuICAgIHRyYXZlcnNlQ29tYm8oaXRlbSwgZnVuY3Rpb24gKHBhcmFtKSB7XG4gICAgICBpZiAocGFyYW0uZGVzdHJveWVkKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgdmFyIG1vZGVsID0gcGFyYW0uZ2V0TW9kZWwoKTtcblxuICAgICAgX3RoaXMuY3VycmVudEl0ZW1DaGlsZENvbWJvcy5wdXNoKG1vZGVsLmlkKTtcblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG4gIH0sXG4gIG9uRHJhZzogZnVuY3Rpb24gb25EcmFnKGV2dCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICBpZiAoIXRoaXMub3JpZ2luKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnZhbGlkYXRpb25Db21ibyhldnQpKSByZXR1cm47XG5cbiAgICBpZiAodGhpcy5lbmFibGVEZWxlZ2F0ZSkge1xuICAgICAgdGhpcy51cGRhdGVEZWxlZ2F0ZShldnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5hY3RpdmVTdGF0ZSkge1xuICAgICAgICB2YXIgZ3JhcGhfMSA9IHRoaXMuZ3JhcGg7XG4gICAgICAgIHZhciBpdGVtID0gZXZ0Lml0ZW07XG4gICAgICAgIHZhciBtb2RlbF8xID0gaXRlbS5nZXRNb2RlbCgpOyAvLyDmi5bliqjov4fnqIvkuK3lrp7ml7borqHnrpfot53nprtcblxuICAgICAgICB2YXIgY29tYm9zID0gZ3JhcGhfMS5nZXRDb21ib3MoKTtcbiAgICAgICAgdmFyIHNvdXJjZUJCb3ggPSBpdGVtLmdldEJCb3goKTtcbiAgICAgICAgdmFyIGNlbnRlclhfMSA9IHNvdXJjZUJCb3guY2VudGVyWCxcbiAgICAgICAgICAgIGNlbnRlcllfMSA9IHNvdXJjZUJCb3guY2VudGVyWSxcbiAgICAgICAgICAgIHdpZHRoXzEgPSBzb3VyY2VCQm94LndpZHRoOyAvLyDlj4LkuI7orqHnrpfnmoQgQ29tYm/vvIzpnIDopoHmjpLpmaTmjonvvJpcbiAgICAgICAgLy8gMeOAgeaLluWKqCBjb21ibyDoh6rlt7FcbiAgICAgICAgLy8gMuOAgeaLluWKqCBjb21ibyDnmoQgcGFyZW50XG4gICAgICAgIC8vIDPjgIHmi5bliqggQ29tYm8g55qEIGNoaWxkcmVuXG5cbiAgICAgICAgdmFyIGNhbGNDb21ib3MgPSBjb21ib3MuZmlsdGVyKGZ1bmN0aW9uIChjb21ibykge1xuICAgICAgICAgIHZhciBjbW9kZWwgPSBjb21iby5nZXRNb2RlbCgpOyAvLyDooqvmi5bliqjnmoTmmK/mnIDlpJblsYLnmoQgQ29tYm/vvIzml6AgcGFyZW5077yM5o6S6Zmk6Ieq6Lqr5ZKM5a2Q5YWD57SgXG5cbiAgICAgICAgICBpZiAoIW1vZGVsXzEucGFyZW50SWQpIHtcbiAgICAgICAgICAgIHJldHVybiBjbW9kZWwuaWQgIT09IG1vZGVsXzEuaWQgJiYgIV90aGlzLmN1cnJlbnRJdGVtQ2hpbGRDb21ib3MuaW5jbHVkZXMoY21vZGVsLmlkKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gY21vZGVsLmlkICE9PSBtb2RlbF8xLmlkICYmICFfdGhpcy5jdXJyZW50SXRlbUNoaWxkQ29tYm9zLmluY2x1ZGVzKGNtb2RlbC5pZCk7XG4gICAgICAgIH0pO1xuICAgICAgICBjYWxjQ29tYm9zLm1hcChmdW5jdGlvbiAoY29tYm8pIHtcbiAgICAgICAgICB2YXIgX2EgPSBjb21iby5nZXRCQm94KCksXG4gICAgICAgICAgICAgIGN4ID0gX2EuY2VudGVyWCxcbiAgICAgICAgICAgICAgY3kgPSBfYS5jZW50ZXJZLFxuICAgICAgICAgICAgICB3ID0gX2Eud2lkdGg7IC8vIOaLluWKqOeahCBjb21ibyDlkozopoHov5vlhaXnmoQgY29tYm8g5LmL6Ze055qE6Led56a7XG5cblxuICAgICAgICAgIHZhciBkaXNYID0gY2VudGVyWF8xIC0gY3g7XG4gICAgICAgICAgdmFyIGRpc1kgPSBjZW50ZXJZXzEgLSBjeTsgLy8g5ZyG5b+D6Led56a7XG5cbiAgICAgICAgICB2YXIgZGlzdGFuY2UgPSAyICogTWF0aC5zcXJ0KGRpc1ggKiBkaXNYICsgZGlzWSAqIGRpc1kpO1xuXG4gICAgICAgICAgaWYgKHdpZHRoXzEgKyB3IC0gZGlzdGFuY2UgPiAwLjggKiB3aWR0aF8xKSB7XG4gICAgICAgICAgICBncmFwaF8xLnNldEl0ZW1TdGF0ZShjb21ibywgX3RoaXMuYWN0aXZlU3RhdGUsIHRydWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBncmFwaF8xLnNldEl0ZW1TdGF0ZShjb21ibywgX3RoaXMuYWN0aXZlU3RhdGUsIGZhbHNlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBlYWNoKHRoaXMudGFyZ2V0cywgZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgX3RoaXMudXBkYXRlQ29tYm8oaXRlbSwgZXZ0KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSxcbiAgdXBkYXRlUG9zaXRpb25zOiBmdW5jdGlvbiB1cGRhdGVQb3NpdGlvbnMoZXZ0LCByZXN0b3JlKSB7XG4gICAgdmFyIF90aGlzID0gdGhpczsgLy8g5b2T5ZCv55SoIGRlbGVnYXRlIOaXtu+8jOaLluWKqOe7k+adn+aXtumcgOimgeabtOaWsCBjb21ib1xuXG5cbiAgICBpZiAodGhpcy5lbmFibGVEZWxlZ2F0ZSB8fCByZXN0b3JlKSB7XG4gICAgICBlYWNoKHRoaXMudGFyZ2V0cywgZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgX3RoaXMudXBkYXRlQ29tYm8oaXRlbSwgZXZ0LCByZXN0b3JlKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSxcbiAgb25Ecm9wOiBmdW5jdGlvbiBvbkRyb3AoZXZ0KSB7XG4gICAgdmFyIF90aGlzID0gdGhpczsgLy8g6KKr5pS+5LiL55qE55uu5qCHIGNvbWJvXG5cblxuICAgIHZhciBpdGVtID0gZXZ0Lml0ZW07XG4gICAgdGhpcy5jdXJyZW50U2hvdWxkRW5kID0gdGhpcy5zaG91bGRFbmQuY2FsbCh0aGlzLCBldnQsIGl0ZW0pO1xuICAgIHRoaXMudXBkYXRlUG9zaXRpb25zKGV2dCwgIXRoaXMuY3VycmVudFNob3VsZEVuZCk7XG4gICAgaWYgKCF0aGlzLmN1cnJlbnRTaG91bGRFbmQgfHwgIWl0ZW0gfHwgIXRoaXMudGFyZ2V0cyB8fCBpdGVtLmRlc3Ryb3llZCkgcmV0dXJuO1xuICAgIHZhciBncmFwaCA9IHRoaXMuZ3JhcGg7XG4gICAgdmFyIHRhcmdldE1vZGVsID0gaXRlbS5nZXRNb2RlbCgpO1xuICAgIHRoaXMudGFyZ2V0cy5tYXAoZnVuY3Rpb24gKGNvbWJvKSB7XG4gICAgICB2YXIgbW9kZWwgPSBjb21iby5nZXRNb2RlbCgpO1xuXG4gICAgICBpZiAobW9kZWwucGFyZW50SWQgIT09IHRhcmdldE1vZGVsLmlkKSB7XG4gICAgICAgIGlmIChfdGhpcy5hY3RpdmVTdGF0ZSkge1xuICAgICAgICAgIGdyYXBoLnNldEl0ZW1TdGF0ZShpdGVtLCBfdGhpcy5hY3RpdmVTdGF0ZSwgZmFsc2UpO1xuICAgICAgICB9IC8vIOWwhiBDb21ibyDmlL7nva7liLDmn5DkuKogQ29tYm8g5LiK6Z2i5pe277yM5Y+q5pyJ5b2TIG9ubHlDaGFuZ2VDb21ib1NpemUg5Li6IGZhbHNlIOaXtuWAmeaJjeabtOaWsCBDb21ibyDnu5PmnoRcblxuXG4gICAgICAgIGlmICghX3RoaXMub25seUNoYW5nZUNvbWJvU2l6ZSkge1xuICAgICAgICAgIGdyYXBoLnVwZGF0ZUNvbWJvVHJlZShjb21ibywgdGFyZ2V0TW9kZWwuaWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGdyYXBoLnVwZGF0ZUNvbWJvKGNvbWJvKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZ3JhcGgudXBkYXRlQ29tYm8oaXRlbSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5lbmQoaXRlbSwgZXZ0KTsgLy8g5aaC5p6c5bey57uP5ouW5pS+5LiL5LqG77yM5YiZ5LiN6ZyA6KaB5YaN6YCa6L+H6Led56a75Yik5pat5LqGXG5cbiAgICB0aGlzLmVuZENvbXBhcmlzb24gPSB0cnVlO1xuICB9LFxuICBvbk5vZGVEcm9wOiBmdW5jdGlvbiBvbk5vZGVEcm9wKGV2dCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICBpZiAoIXRoaXMudGFyZ2V0cyB8fCB0aGlzLnRhcmdldHMubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgdmFyIGdyYXBoID0gdGhpcy5ncmFwaDtcbiAgICB2YXIgaXRlbSA9IGV2dC5pdGVtO1xuICAgIHZhciBjb21ib0lkID0gaXRlbS5nZXRNb2RlbCgpLmNvbWJvSWQ7XG4gICAgdmFyIG5ld1BhcmVudENvbWJvID0gY29tYm9JZCA/IGdyYXBoLmZpbmRCeUlkKGNvbWJvSWQpIDogdW5kZWZpbmVkO1xuICAgIHRoaXMuY3VycmVudFNob3VsZEVuZCA9IHRoaXMuc2hvdWxkRW5kLmNhbGwodGhpcywgZXZ0LCBuZXdQYXJlbnRDb21ibyk7XG4gICAgdGhpcy51cGRhdGVQb3NpdGlvbnMoZXZ0LCAhdGhpcy5jdXJyZW50U2hvdWxkRW5kKTtcbiAgICBpZiAoIXRoaXMuY3VycmVudFNob3VsZEVuZCkgcmV0dXJuO1xuICAgIHZhciBkcm9wcGVkQ29tYm87IC8vIOWmguaenOiiq+aUvue9rueahOeahOiKgueCueaciSBjb21ib0lk77yM5LiU6L+Z5LiqIGNvbWJvSWQg5LiO5q2j5Zyo6KKr5ouW5ou955qEIGNvbWJvIOeahOeItiBpZCDkuI3nm7jlkIzvvIzliJnmm7TmlrDniLbkurLkuLogY29tYm9JZFxuXG4gICAgaWYgKGNvbWJvSWQpIHtcbiAgICAgIGlmICh0aGlzLmFjdGl2ZVN0YXRlKSB7XG4gICAgICAgIHZhciBjb21ibyA9IGdyYXBoLmZpbmRCeUlkKGNvbWJvSWQpO1xuICAgICAgICBncmFwaC5zZXRJdGVtU3RhdGUoY29tYm8sIHRoaXMuYWN0aXZlU3RhdGUsIGZhbHNlKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy50YXJnZXRzLm1hcChmdW5jdGlvbiAoY29tYm8pIHtcbiAgICAgICAgaWYgKCFfdGhpcy5vbmx5Q2hhbmdlQ29tYm9TaXplKSB7XG4gICAgICAgICAgaWYgKGNvbWJvSWQgIT09IGNvbWJvLmdldElEKCkpIHtcbiAgICAgICAgICAgIGRyb3BwZWRDb21ibyA9IGdyYXBoLmZpbmRCeUlkKGNvbWJvSWQpO1xuICAgICAgICAgICAgaWYgKGNvbWJvSWQgIT09IGNvbWJvLmdldE1vZGVsKCkucGFyZW50SWQpIGdyYXBoLnVwZGF0ZUNvbWJvVHJlZShjb21ibywgY29tYm9JZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGdyYXBoLnVwZGF0ZUNvbWJvKGNvbWJvKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIOWmguaenOiiq+aUvue9rueahOiKgueCueayoeaciSBjb21ib0lk77yM5LiU5q2j5Zyo6KKr5ouW5ou955qEIGNvbWJvIOacieeItiBpZO+8jOWImeabtOaWsOeItuS6suS4uiB1bmRlZmluZWRcbiAgICAgIHRoaXMudGFyZ2V0cy5tYXAoZnVuY3Rpb24gKGNvbWJvKSB7XG4gICAgICAgIGlmICghX3RoaXMub25seUNoYW5nZUNvbWJvU2l6ZSkge1xuICAgICAgICAgIHZhciBtb2RlbCA9IGNvbWJvLmdldE1vZGVsKCk7XG5cbiAgICAgICAgICBpZiAobW9kZWwuY29tYm9JZCkge1xuICAgICAgICAgICAgZ3JhcGgudXBkYXRlQ29tYm9UcmVlKGNvbWJvKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZ3JhcGgudXBkYXRlQ29tYm8oY29tYm8pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IC8vIOWmguaenOW3sue7j+aLluaUvuS4i+S6hu+8jOWImeS4jemcgOimgeWGjemAmui/h+i3neemu+WIpOaWreS6hlxuXG5cbiAgICB0aGlzLmVuZENvbXBhcmlzb24gPSB0cnVlO1xuICAgIHRoaXMuZW5kKGRyb3BwZWRDb21ibywgZXZ0KTtcbiAgfSxcbiAgb25EcmFnRW50ZXI6IGZ1bmN0aW9uIG9uRHJhZ0VudGVyKGV2dCkge1xuICAgIGlmICghdGhpcy5vcmlnaW4pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMudmFsaWRhdGlvbkNvbWJvKGV2dCkpIHJldHVybjtcbiAgICB2YXIgaXRlbSA9IGV2dC5pdGVtO1xuICAgIHZhciBncmFwaCA9IHRoaXMuZ3JhcGg7XG5cbiAgICBpZiAodGhpcy5hY3RpdmVTdGF0ZSkge1xuICAgICAgZ3JhcGguc2V0SXRlbVN0YXRlKGl0ZW0sIHRoaXMuYWN0aXZlU3RhdGUsIHRydWUpO1xuICAgIH1cbiAgfSxcbiAgb25EcmFnTGVhdmU6IGZ1bmN0aW9uIG9uRHJhZ0xlYXZlKGV2dCkge1xuICAgIGlmICghdGhpcy5vcmlnaW4pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMudmFsaWRhdGlvbkNvbWJvKGV2dCkpIHJldHVybjtcbiAgICB2YXIgaXRlbSA9IGV2dC5pdGVtO1xuICAgIHZhciBncmFwaCA9IHRoaXMuZ3JhcGg7XG5cbiAgICBpZiAodGhpcy5hY3RpdmVTdGF0ZSkge1xuICAgICAgZ3JhcGguc2V0SXRlbVN0YXRlKGl0ZW0sIHRoaXMuYWN0aXZlU3RhdGUsIGZhbHNlKTtcbiAgICB9XG4gIH0sXG4gIG9uRHJhZ0VuZDogZnVuY3Rpb24gb25EcmFnRW5kKGV2dCkge1xuICAgIGlmICghdGhpcy50YXJnZXRzIHx8IHRoaXMudGFyZ2V0cy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICB2YXIgaXRlbSA9IGV2dC5pdGVtO1xuXG4gICAgaWYgKHRoaXMuY3VycmVudFNob3VsZEVuZCkge1xuICAgICAgdGhpcy51cGRhdGVQb3NpdGlvbnMoZXZ0KTtcbiAgICB9XG5cbiAgICB2YXIgcGFyZW50Q29tYm8gPSB0aGlzLmdldFBhcmVudENvbWJvKGl0ZW0uZ2V0TW9kZWwoKS5wYXJlbnRJZCk7XG4gICAgdmFyIGdyYXBoID0gdGhpcy5ncmFwaDtcblxuICAgIGlmIChwYXJlbnRDb21ibyAmJiB0aGlzLmFjdGl2ZVN0YXRlKSB7XG4gICAgICBncmFwaC5zZXRJdGVtU3RhdGUocGFyZW50Q29tYm8sIHRoaXMuYWN0aXZlU3RhdGUsIGZhbHNlKTtcbiAgICB9XG5cbiAgICB0aGlzLmVuZCh1bmRlZmluZWQsIGV2dCk7XG4gIH0sXG4gIGVuZDogZnVuY3Rpb24gZW5kKGNvbWJvRHJvcGVkT24sIGV2dCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICBpZiAoIXRoaXMub3JpZ2luKSByZXR1cm47XG4gICAgdmFyIGdyYXBoID0gdGhpcy5ncmFwaDsgLy8g5Yig6ZmkZGVsZWdhdGUgc2hhcGVcblxuICAgIGlmICh0aGlzLmRlbGVnYXRlU2hhcGUpIHtcbiAgICAgIHZhciBkZWxlZ2F0ZUdyb3VwID0gZ3JhcGguZ2V0KCdkZWxlZ2F0ZUdyb3VwJyk7XG4gICAgICBkZWxlZ2F0ZUdyb3VwLmNsZWFyKCk7XG4gICAgICB0aGlzLmRlbGVnYXRlU2hhcGUgPSBudWxsO1xuICAgIH1cblxuICAgIGlmIChjb21ib0Ryb3BlZE9uICYmIHRoaXMuYWN0aXZlU3RhdGUpIHtcbiAgICAgIGdyYXBoLnNldEl0ZW1TdGF0ZShjb21ib0Ryb3BlZE9uLCB0aGlzLmFjdGl2ZVN0YXRlLCBmYWxzZSk7XG4gICAgfSAvLyDoi6XmsqHmnInooqvmlL7nva7nmoQgY29tYm/vvIzliJnmmK/ooqvmlL7nva7lnKjnlLvluIPkuIpcblxuXG4gICAgaWYgKCFjb21ib0Ryb3BlZE9uKSB7XG4gICAgICB0aGlzLnRhcmdldHMubWFwKGZ1bmN0aW9uIChjb21ibykge1xuICAgICAgICAvLyDlsIYgQ29tYm8g5pS+572u5Yiw5p+Q5LiqIENvbWJvIOS4iumdouaXtu+8jOWPquacieW9kyBvbmx5Q2hhbmdlQ29tYm9TaXplIOS4uiBmYWxzZSDml7blgJnmiY3mm7TmlrAgQ29tYm8g57uT5p6EXG4gICAgICAgIGlmICghX3RoaXMub25seUNoYW5nZUNvbWJvU2l6ZSkge1xuICAgICAgICAgIGdyYXBoLnVwZGF0ZUNvbWJvVHJlZShjb21ibyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZ3JhcGgudXBkYXRlQ29tYm8oY29tYm8pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLnBvaW50ID0gW107XG4gICAgdGhpcy5vcmlnaW4gPSBudWxsO1xuICAgIHRoaXMub3JpZ2luUG9pbnQgPSBudWxsO1xuICAgIHRoaXMudGFyZ2V0cy5sZW5ndGggPSAwO1xuICB9LFxuXG4gIC8qKlxuICAgKiDpgY3ljoYgY29tYm9UcmVl77yM5YiG5Yir5pu05pawIG5vZGUg5ZKMIGNvbWJvXG4gICAqIEBwYXJhbSBkYXRhXG4gICAqIEBwYXJhbSBmblxuICAgKi9cbiAgdHJhdmVyc2U6IGZ1bmN0aW9uIHRyYXZlcnNlKGRhdGEsIGZuKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIGlmIChmbihkYXRhKSA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZGF0YSkge1xuICAgICAgdmFyIGNvbWJvcyA9IGRhdGEuZ2V0KCdjb21ib3MnKTtcbiAgICAgIGVhY2goY29tYm9zLCBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgX3RoaXMudHJhdmVyc2UoY2hpbGQsIGZuKTtcbiAgICAgIH0pO1xuICAgICAgdmFyIG5vZGVzID0gZGF0YS5nZXQoJ25vZGVzJyk7XG4gICAgICBlYWNoKG5vZGVzLCBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgX3RoaXMudHJhdmVyc2UoY2hpbGQsIGZuKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSxcbiAgdXBkYXRlQ29tYm86IGZ1bmN0aW9uIHVwZGF0ZUNvbWJvKGl0ZW0sIGV2dCwgcmVzdG9yZSkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICB0aGlzLnRyYXZlcnNlKGl0ZW0sIGZ1bmN0aW9uIChwYXJhbSkge1xuICAgICAgaWYgKHBhcmFtLmRlc3Ryb3llZCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIF90aGlzLnVwZGF0ZVNpZ25sZUl0ZW0ocGFyYW0sIGV2dCwgcmVzdG9yZSk7XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuICB9LFxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gaXRlbSDlvZPliY3mraPlnKjmi5bliqjnmoTlhYPntKBcbiAgICogQHBhcmFtIGV2dFxuICAgKi9cbiAgdXBkYXRlU2lnbmxlSXRlbTogZnVuY3Rpb24gdXBkYXRlU2lnbmxlSXRlbShpdGVtLCBldnQsIHJlc3RvcmUpIHtcbiAgICB2YXIgb3JpZ2luID0gdGhpcy5vcmlnaW47XG4gICAgdmFyIGdyYXBoID0gdGhpcy5ncmFwaDtcbiAgICB2YXIgbW9kZWwgPSBpdGVtLmdldE1vZGVsKCk7XG4gICAgdmFyIGl0ZW1JZCA9IGl0ZW0uZ2V0KCdpZCcpO1xuXG4gICAgaWYgKCF0aGlzLnBvaW50W2l0ZW1JZF0pIHtcbiAgICAgIHRoaXMucG9pbnRbaXRlbUlkXSA9IHtcbiAgICAgICAgeDogbW9kZWwueCxcbiAgICAgICAgeTogbW9kZWwueVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgeCA9IGV2dC54IC0gb3JpZ2luLnggKyB0aGlzLnBvaW50W2l0ZW1JZF0ueDtcbiAgICB2YXIgeSA9IGV2dC55IC0gb3JpZ2luLnkgKyB0aGlzLnBvaW50W2l0ZW1JZF0ueTtcblxuICAgIGlmIChyZXN0b3JlKSB7XG4gICAgICB4ICs9IG9yaWdpbi54IC0gZXZ0Lng7XG4gICAgICB5ICs9IG9yaWdpbi55IC0gZXZ0Lnk7XG4gICAgfVxuXG4gICAgZ3JhcGgudXBkYXRlSXRlbShpdGVtLCB7XG4gICAgICB4OiB4LFxuICAgICAgeTogeVxuICAgIH0pO1xuICB9LFxuXG4gIC8qKlxuICAgKiDmoLnmja4gSUQg6I635Y+W54i2IENvbWJvXG4gICAqIEBwYXJhbSBwYXJlbnRJZCDniLYgQ29tYm8gSURcbiAgICovXG4gIGdldFBhcmVudENvbWJvOiBmdW5jdGlvbiBnZXRQYXJlbnRDb21ibyhwYXJlbnRJZCkge1xuICAgIHZhciBncmFwaCA9IHRoaXMuZ3JhcGg7XG5cbiAgICBpZiAoIXBhcmVudElkKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHZhciBwYXJlbnRDb21ibyA9IGdyYXBoLmZpbmRCeUlkKHBhcmVudElkKTtcblxuICAgIGlmICghcGFyZW50Q29tYm8pIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmVudENvbWJvO1xuICB9LFxuICB1cGRhdGVEZWxlZ2F0ZTogZnVuY3Rpb24gdXBkYXRlRGVsZWdhdGUoZXZ0KSB7XG4gICAgdmFyIGdyYXBoID0gdGhpcy5ncmFwaDsgLy8g5b2T5rKh5pyJIGRlbGVnYXRlIHNoYXBlIOaXtuWIm+W7ulxuXG4gICAgaWYgKCF0aGlzLmRlbGVnYXRlU2hhcGUpIHtcbiAgICAgIHZhciBkZWxlZ2F0ZUdyb3VwID0gZ3JhcGguZ2V0KCdkZWxlZ2F0ZUdyb3VwJyk7XG4gICAgICB2YXIgYmJveCA9IG51bGw7XG5cbiAgICAgIGlmICh0aGlzLnRhcmdldHMubGVuZ3RoID4gMSkge1xuICAgICAgICBiYm94ID0gY2FsY3VsYXRpb25JdGVtc0JCb3godGhpcy50YXJnZXRzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJib3ggPSB0aGlzLnRhcmdldHNbMF0uZ2V0QkJveCgpO1xuICAgICAgfVxuXG4gICAgICB2YXIgeCA9IGJib3gueCxcbiAgICAgICAgICB5ID0gYmJveC55LFxuICAgICAgICAgIHdpZHRoID0gYmJveC53aWR0aCxcbiAgICAgICAgICBoZWlnaHQgPSBiYm94LmhlaWdodCxcbiAgICAgICAgICBtaW5YID0gYmJveC5taW5YLFxuICAgICAgICAgIG1pblkgPSBiYm94Lm1pblk7XG4gICAgICB0aGlzLm9yaWdpblBvaW50ID0ge1xuICAgICAgICB4OiB4LFxuICAgICAgICB5OiB5LFxuICAgICAgICB3aWR0aDogd2lkdGgsXG4gICAgICAgIGhlaWdodDogaGVpZ2h0LFxuICAgICAgICBtaW5YOiBtaW5YLFxuICAgICAgICBtaW5ZOiBtaW5ZXG4gICAgICB9O1xuXG4gICAgICB2YXIgYXR0cnMgPSBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgR2xvYmFsLmRlbGVnYXRlU3R5bGUpLCB0aGlzLmRlbGVnYXRlU3R5bGUpO1xuXG4gICAgICB0aGlzLmRlbGVnYXRlU2hhcGUgPSBkZWxlZ2F0ZUdyb3VwLmFkZFNoYXBlKCdyZWN0Jywge1xuICAgICAgICBhdHRyczogX19hc3NpZ24oe1xuICAgICAgICAgIHdpZHRoOiBiYm94LndpZHRoLFxuICAgICAgICAgIGhlaWdodDogYmJveC5oZWlnaHQsXG4gICAgICAgICAgeDogYmJveC54LFxuICAgICAgICAgIHk6IGJib3gueVxuICAgICAgICB9LCBhdHRycyksXG4gICAgICAgIG5hbWU6ICdjb21iby1kZWxlZ2F0ZS1zaGFwZSdcbiAgICAgIH0pO1xuICAgICAgdGhpcy5kZWxlZ2F0ZVNoYXBlLnNldCgnY2FwdHVyZScsIGZhbHNlKTtcbiAgICAgIHRoaXMuZGVsZWdhdGUgPSB0aGlzLmRlbGVnYXRlU2hhcGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBjbGllbnRYID0gZXZ0LnggLSB0aGlzLm9yaWdpbi54ICsgdGhpcy5vcmlnaW5Qb2ludC5taW5YO1xuICAgICAgdmFyIGNsaWVudFkgPSBldnQueSAtIHRoaXMub3JpZ2luLnkgKyB0aGlzLm9yaWdpblBvaW50Lm1pblk7XG4gICAgICB0aGlzLmRlbGVnYXRlU2hhcGUuYXR0cih7XG4gICAgICAgIHg6IGNsaWVudFgsXG4gICAgICAgIHk6IGNsaWVudFlcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufTsiLCIvKlxuICogQEF1dGhvcjogU2hpd3VcbiAqIEBEZXNjcmlwdGlvbjog5pS26LW35ZKM5bGV5byAIENvbWJvXG4gKi9cbnZhciBERUZBVUxUX1RSSUdHRVIgPSAnZGJsY2xpY2snO1xudmFyIEFMTE9XX0VWRU5UUyA9IFsnY2xpY2snLCAnZGJsY2xpY2snXTtcbmV4cG9ydCBkZWZhdWx0IHtcbiAgZ2V0RGVmYXVsdENmZzogZnVuY3Rpb24gZ2V0RGVmYXVsdENmZygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHJpZ2dlcjogREVGQVVMVF9UUklHR0VSLFxuICAgICAgcmVsYXlvdXQ6IHRydWVcbiAgICB9O1xuICB9LFxuICBnZXRFdmVudHM6IGZ1bmN0aW9uIGdldEV2ZW50cygpIHtcbiAgICB2YXIgX2E7XG5cbiAgICB2YXIgdHJpZ2dlcjsgLy8g5qOA5rWL6L6T5YWl5piv5ZCm5ZCI5rOVXG5cbiAgICBpZiAoQUxMT1dfRVZFTlRTLmluY2x1ZGVzKHRoaXMudHJpZ2dlcikpIHtcbiAgICAgIHRyaWdnZXIgPSB0aGlzLnRyaWdnZXI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRyaWdnZXIgPSBERUZBVUxUX1RSSUdHRVI7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG5cbiAgICAgIGNvbnNvbGUud2FybihcIkJlaGF2aW9yIGNvbGxhcHNlLWV4cGFuZC1ncm91cCDnmoQgdHJpZ2dlciDlj4LmlbDkuI3lkIjms5XvvIzor7fovpPlhaUgJ2NsaWNrJyDmiJYgJ2RibGNsaWNrJ1wiKTtcbiAgICB9XG5cbiAgICByZXR1cm4gX2EgPSB7fSwgX2FbXCJjb21ibzpcIiArIHRyaWdnZXJdID0gJ29uQ29tYm9DbGljaycsIF9hO1xuICB9LFxuICBvbkNvbWJvQ2xpY2s6IGZ1bmN0aW9uIG9uQ29tYm9DbGljayhldnQpIHtcbiAgICB2YXIgaXRlbSA9IGV2dC5pdGVtO1xuXG4gICAgdmFyIF9hID0gdGhpcyxcbiAgICAgICAgZ3JhcGggPSBfYS5ncmFwaCxcbiAgICAgICAgcmVsYXlvdXQgPSBfYS5yZWxheW91dDtcblxuICAgIGlmICghaXRlbSB8fCBpdGVtLmRlc3Ryb3llZCB8fCBpdGVtLmdldFR5cGUoKSAhPT0gJ2NvbWJvJykgcmV0dXJuO1xuICAgIHZhciBtb2RlbCA9IGl0ZW0uZ2V0TW9kZWwoKTtcbiAgICB2YXIgY29tYm9JZCA9IG1vZGVsLmlkO1xuXG4gICAgaWYgKCFjb21ib0lkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZ3JhcGguY29sbGFwc2VFeHBhbmRDb21ibyhjb21ib0lkKTtcbiAgICBpZiAocmVsYXlvdXQgJiYgZ3JhcGguZ2V0KCdsYXlvdXQnKSkgZ3JhcGgubGF5b3V0KCk7ZWxzZSBncmFwaC5yZWZyZXNoUG9zaXRpb25zKCk7XG4gIH1cbn07IiwiaW1wb3J0IHsgX19hc3NpZ24gfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBVdGlsIGZyb20gJy4uL3V0aWwnO1xudmFyIGlzUG9seWdvbnNJbnRlcnNlY3QgPSBVdGlsLmlzUG9seWdvbnNJbnRlcnNlY3QsXG4gICAgcGF0aFRvUG9pbnRzID0gVXRpbC5wYXRoVG9Qb2ludHM7XG52YXIgREVGQVVMVF9UUklHR0VSID0gJ3NoaWZ0JztcbnZhciBBTExPV19FVkVOVFMgPSBbJ2RyYWcnLCAnc2hpZnQnLCAnY3RybCcsICdhbHQnLCAnY29udHJvbCddO1xuXG52YXIgaXNJdGVtSW50ZXJzZWNQb2x5Z29uID0gZnVuY3Rpb24gaXNJdGVtSW50ZXJzZWNQb2x5Z29uKGl0ZW0sIHBvbHlQb2ludHMpIHtcbiAgdmFyIHNoYXBlUG9pbnRzO1xuICB2YXIgc2hhcGUgPSBpdGVtLmdldEtleVNoYXBlKCk7XG5cbiAgaWYgKGl0ZW0uZ2V0KCd0eXBlJykgPT09ICdwYXRoJykge1xuICAgIHNoYXBlUG9pbnRzID0gcGF0aFRvUG9pbnRzKHNoYXBlLmF0dHIoJ3BhdGgnKSk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIHNoYXBlQkJveCA9IHNoYXBlLmdldENhbnZhc0JCb3goKTtcbiAgICBzaGFwZVBvaW50cyA9IFtbc2hhcGVCQm94Lm1pblgsIHNoYXBlQkJveC5taW5ZXSwgW3NoYXBlQkJveC5tYXhYLCBzaGFwZUJCb3gubWluWV0sIFtzaGFwZUJCb3gubWF4WCwgc2hhcGVCQm94Lm1heFldLCBbc2hhcGVCQm94Lm1pblgsIHNoYXBlQkJveC5tYXhZXV07XG4gIH1cblxuICByZXR1cm4gaXNQb2x5Z29uc0ludGVyc2VjdChwb2x5UG9pbnRzLCBzaGFwZVBvaW50cyk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGdldERlZmF1bHRDZmc6IGZ1bmN0aW9uIGdldERlZmF1bHRDZmcoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRlbGVnYXRlU3R5bGU6IHtcbiAgICAgICAgZmlsbDogJyNFRUY2RkYnLFxuICAgICAgICBmaWxsT3BhY2l0eTogMC40LFxuICAgICAgICBzdHJva2U6ICcjRERFRUZFJyxcbiAgICAgICAgbGluZVdpZHRoOiAxXG4gICAgICB9LFxuICAgICAgb25TZWxlY3Q6IGZ1bmN0aW9uIG9uU2VsZWN0KCkge30sXG4gICAgICBvbkRlc2VsZWN0OiBmdW5jdGlvbiBvbkRlc2VsZWN0KCkge30sXG4gICAgICBzZWxlY3RlZFN0YXRlOiAnc2VsZWN0ZWQnLFxuICAgICAgdHJpZ2dlcjogREVGQVVMVF9UUklHR0VSLFxuICAgICAgaW5jbHVkZUVkZ2VzOiB0cnVlLFxuICAgICAgc2VsZWN0ZWRFZGdlczogW10sXG4gICAgICBzZWxlY3RlZE5vZGVzOiBbXSAvLyBtdWx0aXBsZTogZmFsc2UsXG5cbiAgICB9O1xuICB9LFxuICBnZXRFdmVudHM6IGZ1bmN0aW9uIGdldEV2ZW50cygpIHtcbiAgICAvLyDmo4DmtYvovpPlhaXmmK/lkKblkIjms5VcbiAgICBpZiAoIShBTExPV19FVkVOVFMuaW5kZXhPZih0aGlzLnRyaWdnZXIudG9Mb3dlckNhc2UoKSkgPiAtMSkpIHtcbiAgICAgIHRoaXMudHJpZ2dlciA9IERFRkFVTFRfVFJJR0dFUjtcbiAgICAgIGNvbnNvbGUud2FybihcIkJlaGF2aW9yIGxhc3NvLXNlbGVjdCDnmoQgdHJpZ2dlciDlj4LmlbDkuI3lkIjms5XvvIzor7fovpPlhaUgJ2RyYWcn44CBJ3NoaWZ0J+OAgSdjdHJsJyDmiJYgJ2FsdCdcIik7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudHJpZ2dlciA9PT0gJ2RyYWcnKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBkcmFnc3RhcnQ6ICdvbkRyYWdTdGFydCcsXG4gICAgICAgIGRyYWc6ICdvbkRyYWdNb3ZlJyxcbiAgICAgICAgZHJhZ2VuZDogJ29uRHJhZ0VuZCcsXG4gICAgICAgICdjYW52YXM6Y2xpY2snOiAnY2xlYXJTdGF0ZXMnXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBkcmFnc3RhcnQ6ICdvbkRyYWdTdGFydCcsXG4gICAgICBkcmFnOiAnb25EcmFnTW92ZScsXG4gICAgICBkcmFnZW5kOiAnb25EcmFnRW5kJyxcbiAgICAgIGtleXVwOiAnb25LZXlVcCcsXG4gICAgICBrZXlkb3duOiAnb25LZXlEb3duJyxcbiAgICAgICdjYW52YXM6Y2xpY2snOiAnY2xlYXJTdGF0ZXMnXG4gICAgfTtcbiAgfSxcbiAgb25EcmFnU3RhcnQ6IGZ1bmN0aW9uIG9uRHJhZ1N0YXJ0KGUpIHtcbiAgICB2YXIgbGFzc28gPSB0aGlzLmxhc3NvO1xuICAgIHZhciBpdGVtID0gZS5pdGVtOyAvLyDmjpLpmaTlnKjoioLngrnkuIrmi5bliqhcblxuICAgIGlmIChpdGVtKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudHJpZ2dlciAhPT0gJ2RyYWcnICYmICF0aGlzLmtleWRvd24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zZWxlY3RlZE5vZGVzICYmIHRoaXMuc2VsZWN0ZWROb2Rlcy5sZW5ndGggIT09IDApIHtcbiAgICAgIHRoaXMuY2xlYXJTdGF0ZXMoKTtcbiAgICB9XG5cbiAgICBpZiAoIWxhc3NvKSB7XG4gICAgICBsYXNzbyA9IHRoaXMuY3JlYXRlTGFzc28oKTtcbiAgICB9XG5cbiAgICB0aGlzLmRyYWdnaW5nID0gdHJ1ZTtcbiAgICB0aGlzLm9yaWdpblBvaW50ID0ge1xuICAgICAgeDogZS54LFxuICAgICAgeTogZS55XG4gICAgfTtcbiAgICB0aGlzLnBvaW50cy5wdXNoKHRoaXMub3JpZ2luUG9pbnQpO1xuICAgIGxhc3NvLnNob3coKTtcbiAgfSxcbiAgb25EcmFnTW92ZTogZnVuY3Rpb24gb25EcmFnTW92ZShlKSB7XG4gICAgaWYgKCF0aGlzLmRyYWdnaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudHJpZ2dlciAhPT0gJ2RyYWcnICYmICF0aGlzLmtleWRvd24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnBvaW50cy5wdXNoKHtcbiAgICAgIHg6IGUueCxcbiAgICAgIHk6IGUueVxuICAgIH0pO1xuICAgIHRoaXMudXBkYXRlTGFzc28oZSk7XG4gIH0sXG4gIG9uRHJhZ0VuZDogZnVuY3Rpb24gb25EcmFnRW5kKGUpIHtcbiAgICBpZiAoIXRoaXMubGFzc28gJiYgIXRoaXMuZHJhZ2dpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy50cmlnZ2VyICE9PSAnZHJhZycgJiYgIXRoaXMua2V5ZG93bikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucG9pbnRzLnB1c2godGhpcy5vcmlnaW5Qb2ludCk7XG4gICAgdGhpcy5nZXRTZWxlY3RlZEl0ZW1zKCk7XG4gICAgdGhpcy5sYXNzby5yZW1vdmUodHJ1ZSk7XG4gICAgdGhpcy5sYXNzbyA9IG51bGw7XG4gICAgdGhpcy5wb2ludHMgPSBbXTtcbiAgICB0aGlzLmRyYWdnaW5nID0gZmFsc2U7XG4gIH0sXG4gIGdldExhc3NvUGF0aDogZnVuY3Rpb24gZ2V0TGFzc29QYXRoKCkge1xuICAgIHZhciBwb2ludHMgPSB0aGlzLnBvaW50cztcbiAgICB2YXIgcGF0aCA9IFtdO1xuXG4gICAgaWYgKHBvaW50cy5sZW5ndGgpIHtcbiAgICAgIHBvaW50cy5mb3JFYWNoKGZ1bmN0aW9uIChwb2ludCwgaW5kZXgpIHtcbiAgICAgICAgaWYgKGluZGV4ID09PSAwKSB7XG4gICAgICAgICAgcGF0aC5wdXNoKFsnTScsIHBvaW50LngsIHBvaW50LnldKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwYXRoLnB1c2goWydMJywgcG9pbnQueCwgcG9pbnQueV0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHBhdGgucHVzaChbJ0wnLCBwb2ludHNbMF0ueCwgcG9pbnRzWzBdLnldKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGF0aDtcbiAgfSxcbiAgY2xlYXJTdGF0ZXM6IGZ1bmN0aW9uIGNsZWFyU3RhdGVzKCkge1xuICAgIHZhciBfYSA9IHRoaXMsXG4gICAgICAgIGdyYXBoID0gX2EuZ3JhcGgsXG4gICAgICAgIHNlbGVjdGVkU3RhdGUgPSBfYS5zZWxlY3RlZFN0YXRlO1xuXG4gICAgdmFyIG5vZGVzID0gZ3JhcGguZmluZEFsbEJ5U3RhdGUoJ25vZGUnLCBzZWxlY3RlZFN0YXRlKTtcbiAgICB2YXIgZWRnZXMgPSBncmFwaC5maW5kQWxsQnlTdGF0ZSgnZWRnZScsIHNlbGVjdGVkU3RhdGUpO1xuICAgIG5vZGVzLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgIHJldHVybiBncmFwaC5zZXRJdGVtU3RhdGUobm9kZSwgc2VsZWN0ZWRTdGF0ZSwgZmFsc2UpO1xuICAgIH0pO1xuICAgIGVkZ2VzLmZvckVhY2goZnVuY3Rpb24gKGVkZ2UpIHtcbiAgICAgIHJldHVybiBncmFwaC5zZXRJdGVtU3RhdGUoZWRnZSwgc2VsZWN0ZWRTdGF0ZSwgZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMub25EZXNlbGVjdCkge1xuICAgICAgdGhpcy5vbkRlc2VsZWN0KHRoaXMuc2VsZWN0ZWROb2RlcywgdGhpcy5zZWxlY3RlZEVkZ2VzKTtcbiAgICB9XG5cbiAgICB0aGlzLnNlbGVjdGVkTm9kZXMgPSBbXTtcbiAgICB0aGlzLnNlbGVjdGVkRWRnZXMgPSBbXTtcbiAgICBncmFwaC5lbWl0KCdub2Rlc2VsZWN0Y2hhbmdlJywge1xuICAgICAgc2VsZWN0ZWRJdGVtczoge1xuICAgICAgICBub2RlczogW10sXG4gICAgICAgIGVkZ2VzOiBbXVxuICAgICAgfSxcbiAgICAgIHNlbGVjdDogZmFsc2VcbiAgICB9KTtcbiAgfSxcbiAgZ2V0U2VsZWN0ZWRJdGVtczogZnVuY3Rpb24gZ2V0U2VsZWN0ZWRJdGVtcygpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdmFyIF9hID0gdGhpcyxcbiAgICAgICAgZ3JhcGggPSBfYS5ncmFwaCxcbiAgICAgICAgc2hvdWxkVXBkYXRlID0gX2Euc2hvdWxkVXBkYXRlO1xuXG4gICAgdmFyIGxhc3NvQ29udG91ciA9IHRoaXMucG9pbnRzLm1hcChmdW5jdGlvbiAocG9pbnQpIHtcbiAgICAgIHJldHVybiBbZ3JhcGguZ2V0Q2FudmFzQnlQb2ludChwb2ludC54LCBwb2ludC55KS54LCBncmFwaC5nZXRDYW52YXNCeVBvaW50KHBvaW50LngsIHBvaW50LnkpLnldO1xuICAgIH0pO1xuICAgIHZhciBzdGF0ZSA9IHRoaXMuc2VsZWN0ZWRTdGF0ZTtcbiAgICB2YXIgc2VsZWN0ZWROb2RlcyA9IFtdO1xuICAgIHZhciBzZWxlY3RlZElkcyA9IFtdO1xuICAgIGdyYXBoLmdldE5vZGVzKCkuZm9yRWFjaChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgaWYgKCFub2RlLmlzVmlzaWJsZSgpKSByZXR1cm47IC8vIOmakOiXj+iKgueCueS4jeiDveiiq+mAieS4rVxuXG4gICAgICBpZiAoaXNJdGVtSW50ZXJzZWNQb2x5Z29uKG5vZGUsIGxhc3NvQ29udG91cikpIHtcbiAgICAgICAgaWYgKHNob3VsZFVwZGF0ZShub2RlLCAnc2VsZWN0JykpIHtcbiAgICAgICAgICBzZWxlY3RlZE5vZGVzLnB1c2gobm9kZSk7XG4gICAgICAgICAgdmFyIG1vZGVsID0gbm9kZS5nZXRNb2RlbCgpO1xuICAgICAgICAgIHNlbGVjdGVkSWRzLnB1c2gobW9kZWwuaWQpO1xuICAgICAgICAgIGdyYXBoLnNldEl0ZW1TdGF0ZShub2RlLCBzdGF0ZSwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICB2YXIgc2VsZWN0ZWRFZGdlcyA9IFtdO1xuXG4gICAgaWYgKHRoaXMuaW5jbHVkZUVkZ2VzKSB7XG4gICAgICAvLyDpgInkuK3ovrnvvIzovrnnmoRzb3VyY2Xlkox0YXJnZXTpg73lnKjpgInkuK3nmoToioLngrnkuK3ml7bmiY3pgInkuK1cbiAgICAgIHNlbGVjdGVkTm9kZXMuZm9yRWFjaChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICB2YXIgZWRnZXMgPSBub2RlLmdldE91dEVkZ2VzKCk7XG4gICAgICAgIGVkZ2VzLmZvckVhY2goZnVuY3Rpb24gKGVkZ2UpIHtcbiAgICAgICAgICBpZiAoIWVkZ2UuaXNWaXNpYmxlKCkpIHJldHVybjsgLy8g6ZqQ6JeP6L655LiN6IO95aSf6KKr6YCJ5LitXG5cbiAgICAgICAgICB2YXIgbW9kZWwgPSBlZGdlLmdldE1vZGVsKCk7XG4gICAgICAgICAgdmFyIHNvdXJjZSA9IG1vZGVsLnNvdXJjZSxcbiAgICAgICAgICAgICAgdGFyZ2V0ID0gbW9kZWwudGFyZ2V0O1xuXG4gICAgICAgICAgaWYgKHNlbGVjdGVkSWRzLmluY2x1ZGVzKHNvdXJjZSkgJiYgc2VsZWN0ZWRJZHMuaW5jbHVkZXModGFyZ2V0KSAmJiBzaG91bGRVcGRhdGUoZWRnZSwgJ3NlbGVjdCcpKSB7XG4gICAgICAgICAgICBzZWxlY3RlZEVkZ2VzLnB1c2goZWRnZSk7XG4gICAgICAgICAgICBncmFwaC5zZXRJdGVtU3RhdGUoZWRnZSwgX3RoaXMuc2VsZWN0ZWRTdGF0ZSwgdHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuc2VsZWN0ZWRFZGdlcyA9IHNlbGVjdGVkRWRnZXM7XG4gICAgdGhpcy5zZWxlY3RlZE5vZGVzID0gc2VsZWN0ZWROb2RlcztcblxuICAgIGlmICh0aGlzLm9uU2VsZWN0KSB7XG4gICAgICB0aGlzLm9uU2VsZWN0KHNlbGVjdGVkTm9kZXMsIHNlbGVjdGVkRWRnZXMpO1xuICAgIH1cblxuICAgIGdyYXBoLmVtaXQoJ25vZGVzZWxlY3RjaGFuZ2UnLCB7XG4gICAgICBzZWxlY3RlZEl0ZW1zOiB7XG4gICAgICAgIG5vZGVzOiBzZWxlY3RlZE5vZGVzLFxuICAgICAgICBlZGdlczogc2VsZWN0ZWRFZGdlc1xuICAgICAgfSxcbiAgICAgIHNlbGVjdDogdHJ1ZVxuICAgIH0pO1xuICB9LFxuICBjcmVhdGVMYXNzbzogZnVuY3Rpb24gY3JlYXRlTGFzc28oKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBsYXNzbyA9IHNlbGYuZ3JhcGguZ2V0KCdkZWxlZ2F0ZUdyb3VwJykuYWRkU2hhcGUoJ3BhdGgnLCB7XG4gICAgICBhdHRyczogX19hc3NpZ24oe1xuICAgICAgICBwYXRoOiBbXVxuICAgICAgfSwgc2VsZi5kZWxlZ2F0ZVN0eWxlKSxcbiAgICAgIGNhcHR1cmU6IGZhbHNlLFxuICAgICAgbmFtZTogJ2xhc3NvLXNoYXBlJ1xuICAgIH0pO1xuICAgIHRoaXMubGFzc28gPSBsYXNzbztcbiAgICB0aGlzLmRlbGVnYXRlID0gbGFzc287XG4gICAgdGhpcy5wb2ludHMgPSBbXTtcbiAgICByZXR1cm4gbGFzc287XG4gIH0sXG4gIHVwZGF0ZUxhc3NvOiBmdW5jdGlvbiB1cGRhdGVMYXNzbyhlKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMubGFzc28uYXR0cih7XG4gICAgICBwYXRoOiBzZWxmLmdldExhc3NvUGF0aCgpXG4gICAgfSk7XG4gIH0sXG4gIG9uS2V5RG93bjogZnVuY3Rpb24gb25LZXlEb3duKGUpIHtcbiAgICB2YXIgY29kZSA9IGUua2V5O1xuXG4gICAgaWYgKCFjb2RlKSB7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBpZiAodGhpcy5zZWxlY3RlZE5vZGVzICYmIHRoaXMuc2VsZWN0ZWROb2Rlcy5sZW5ndGggIT09IDApIHtcbiAgICAvLyAgIHRoaXMuY2xlYXJTdGF0ZXMoKTtcbiAgICAvLyB9XG5cblxuICAgIGlmIChjb2RlLnRvTG93ZXJDYXNlKCkgPT09IHRoaXMudHJpZ2dlci50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICB0aGlzLmtleWRvd24gPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmtleWRvd24gPSBmYWxzZTtcbiAgICB9XG4gIH0sXG4gIG9uS2V5VXA6IGZ1bmN0aW9uIG9uS2V5VXAoKSB7XG4gICAgaWYgKHRoaXMubGFzc28pIHtcbiAgICAgIC8vIOa4hemZpOaJgOaciemAieS4reeKtuaAgeWQju+8jOiuvue9ruaLluW+l+WKqOeKtuaAgeS4umZhbHNl77yM5bm25riF6Zmk5qGG6YCJ55qEbGFzc29cbiAgICAgIHRoaXMubGFzc28ucmVtb3ZlKHRydWUpO1xuICAgICAgdGhpcy5sYXNzbyA9IG51bGw7XG4gICAgICB0aGlzLnBvaW50cyA9IFtdO1xuICAgICAgdGhpcy5kcmFnZ2luZyA9IGZhbHNlO1xuICAgIH1cblxuICAgIHRoaXMua2V5ZG93biA9IGZhbHNlO1xuICB9XG59OyIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBpc0Z1bmN0aW9uIH0gZnJvbSAnQGFudHYvdXRpbCc7XG52YXIgREVGQVVMVF9UUklHR0VSID0gJ2NsaWNrJztcbnZhciBBTExPV19FVkVOVFMgPSBbJ2NsaWNrJywgJ2RyYWcnXTtcbnZhciBERUZBVUxUX0tFWSA9IHVuZGVmaW5lZDtcbnZhciBBTExPV19LRVlTID0gWydzaGlmdCcsICdjdHJsJywgJ2NvbnRyb2wnLCAnYWx0JywgJ21ldGEnLCB1bmRlZmluZWRdO1xuZXhwb3J0IGRlZmF1bHQge1xuICBnZXREZWZhdWx0Q2ZnOiBmdW5jdGlvbiBnZXREZWZhdWx0Q2ZnKCkge1xuICAgIHJldHVybiB7XG4gICAgICB0cmlnZ2VyOiBERUZBVUxUX1RSSUdHRVIsXG4gICAgICBrZXk6IERFRkFVTFRfS0VZLFxuICAgICAgZWRnZUNvbmZpZzoge30sXG4gICAgICBnZXRFZGdlQ29uZmlnOiB1bmRlZmluZWRcbiAgICB9O1xuICB9LFxuICBnZXRFdmVudHM6IGZ1bmN0aW9uIGdldEV2ZW50cygpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7IC8vIOajgOa1i+i+k+WFpeaYr+WQpuWQiOazlVxuXG4gICAgaWYgKCEoQUxMT1dfRVZFTlRTLmluZGV4T2Yoc2VsZi50cmlnZ2VyLnRvTG93ZXJDYXNlKCkpID4gLTEpKSB7XG4gICAgICBzZWxmLnRyaWdnZXIgPSBERUZBVUxUX1RSSUdHRVI7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG5cbiAgICAgIGNvbnNvbGUud2FybihcIkJlaGF2aW9yIGNyZWF0ZS1lZGdlIOeahCB0cmlnZ2VyIOWPguaVsOS4jeWQiOazle+8jOivt+i+k+WFpSAnY2xpY2sn77yMJ2RyYWcnXCIpO1xuICAgIH1cblxuICAgIGlmIChzZWxmLmtleSAmJiBBTExPV19LRVlTLmluZGV4T2Yoc2VsZi5rZXkudG9Mb3dlckNhc2UoKSkgPT09IC0xKSB7XG4gICAgICBzZWxmLnRyaWdnZXIgPSBERUZBVUxUX0tFWTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcblxuICAgICAgY29uc29sZS53YXJuKFwiQmVoYXZpb3IgY3JlYXRlLWVkZ2Ug55qEIGtleSDlj4LmlbDkuI3lkIjms5XvvIzor7fovpPlhaUgJ3NoaWZ0J++8jCdjdHJsJ++8jCdhbHQn77yMJ2NvbnRyb2wn77yM5oiWIHVuZGVmaW5lZFwiKTtcbiAgICB9XG5cbiAgICB2YXIgZXZlbnRzO1xuXG4gICAgaWYgKHNlbGYudHJpZ2dlciA9PT0gJ2RyYWcnKSB7XG4gICAgICBldmVudHMgPSB7XG4gICAgICAgICdub2RlOmRyYWdzdGFydCc6ICdvbkNsaWNrJyxcbiAgICAgICAgJ2NvbWJvOmRyYWdzdGFydCc6ICdvbkNsaWNrJyxcbiAgICAgICAgZHJhZzogJ3VwZGF0ZUVuZFBvaW50JyxcbiAgICAgICAgJ25vZGU6ZHJvcCc6ICdvbkNsaWNrJyxcbiAgICAgICAgJ2NvbWJvOmRyb3AnOiAnb25DbGljaycsXG4gICAgICAgIGRyYWdlbmQ6ICdvbkRyYWdFbmQnXG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAoc2VsZi50cmlnZ2VyID09PSAnY2xpY2snKSB7XG4gICAgICBldmVudHMgPSB7XG4gICAgICAgICdub2RlOmNsaWNrJzogJ29uQ2xpY2snLFxuICAgICAgICBtb3VzZW1vdmU6ICd1cGRhdGVFbmRQb2ludCcsXG4gICAgICAgICdlZGdlOmNsaWNrJzogJ2NhbmNlbENyZWF0aW5nJyxcbiAgICAgICAgJ2NhbnZhczpjbGljayc6ICdjYW5jZWxDcmVhdGluZycsXG4gICAgICAgICdjb21ibzpjbGljayc6ICdvbkNsaWNrJ1xuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAoc2VsZi5rZXkpIHtcbiAgICAgIGV2ZW50cy5rZXlkb3duID0gJ29uS2V5RG93bic7XG4gICAgICBldmVudHMua2V5dXAgPSAnb25LZXlVcCc7XG4gICAgfVxuXG4gICAgcmV0dXJuIGV2ZW50cztcbiAgfSxcbiAgb25EcmFnRW5kOiBmdW5jdGlvbiBvbkRyYWdFbmQoZXYpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgaWYgKHNlbGYua2V5ICYmICFzZWxmLmtleWRvd24pIHJldHVybjtcbiAgICB2YXIgaXRlbSA9IGV2Lml0ZW07XG4gICAgaWYgKCFpdGVtIHx8IGl0ZW0uZ2V0SUQoKSA9PT0gc2VsZi5zb3VyY2UgfHwgaXRlbS5nZXRUeXBlKCkgIT09ICdub2RlJykgc2VsZi5jYW5jZWxDcmVhdGluZyh7XG4gICAgICBpdGVtOiBzZWxmLmVkZ2UsXG4gICAgICB4OiBldi54LFxuICAgICAgeTogZXYueVxuICAgIH0pO1xuICB9LFxuICAvLyDlpoLmnpzovrnnmoTotbfngrnmsqHmnInmjIflrprvvIzliJnmoLnmja7otbfngrnliJvlu7rmlrDovrnvvJvlpoLmnpzotbfngrnlt7Lnu4/mjIflrprogIznu4jngrnmnKrmjIflrprvvIzliJnmjIflrprnu4jngrlcbiAgb25DbGljazogZnVuY3Rpb24gb25DbGljayhldikge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBpZiAoc2VsZi5rZXkgJiYgIXNlbGYua2V5ZG93bikgcmV0dXJuO1xuICAgIHZhciBub2RlID0gZXYuaXRlbTtcbiAgICB2YXIgZ3JhcGggPSBzZWxmLmdyYXBoO1xuICAgIHZhciBtb2RlbCA9IG5vZGUuZ2V0TW9kZWwoKTtcbiAgICB2YXIgZ2V0RWRnZUNvbmZpZyA9IHNlbGYuZ2V0RWRnZUNvbmZpZzsgLy8g5aaC5p6c6LW354K55bey57uP5oyH5a6a6ICM57uI54K55pyq5oyH5a6a77yM5YiZ5oyH5a6a57uI54K5XG5cbiAgICBpZiAoc2VsZi5hZGRpbmdFZGdlICYmIHNlbGYuZWRnZSkge1xuICAgICAgaWYgKCFzZWxmLnNob3VsZEVuZC5jYWxsKHNlbGYsIGV2KSkgcmV0dXJuO1xuICAgICAgdmFyIGVkZ2VDb25maWcgPSB2b2lkIDA7XG5cbiAgICAgIGlmIChnZXRFZGdlQ29uZmlnICYmIGlzRnVuY3Rpb24oZ2V0RWRnZUNvbmZpZykpIHtcbiAgICAgICAgZWRnZUNvbmZpZyA9IGdldEVkZ2VDb25maWcoe1xuICAgICAgICAgIHNvdXJjZTogc2VsZi5zb3VyY2UsXG4gICAgICAgICAgdGFyZ2V0OiBtb2RlbC5pZFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVkZ2VDb25maWcgPSBzZWxmLmVkZ2VDb25maWc7XG4gICAgICB9XG5cbiAgICAgIHZhciB1cGRhdGVDZmcgPSBfX2Fzc2lnbih7XG4gICAgICAgIHRhcmdldDogbW9kZWwuaWRcbiAgICAgIH0sIGVkZ2VDb25maWcpO1xuXG4gICAgICBpZiAoc2VsZi5zb3VyY2UgPT09IG1vZGVsLmlkKSB7XG4gICAgICAgIHVwZGF0ZUNmZy50eXBlID0gJ2xvb3AnO1xuICAgICAgfVxuXG4gICAgICBncmFwaC5lbWl0KCdiZWZvcmVjcmVhdGVlZGdlJywge30pO1xuICAgICAgZ3JhcGgudXBkYXRlSXRlbShzZWxmLmVkZ2UsIHVwZGF0ZUNmZywgZmFsc2UpO1xuXG4gICAgICBpZiAoZ3JhcGguZ2V0KCdlbmFibGVkU3RhY2snKSkge1xuICAgICAgICB2YXIgYWRkZWRNb2RlbCA9IF9fYXNzaWduKF9fYXNzaWduKHt9LCBzZWxmLmVkZ2UuZ2V0TW9kZWwoKSksIHtcbiAgICAgICAgICBpdGVtVHlwZTogJ2VkZ2UnXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBhZnRlciA9IHt9O1xuICAgICAgICBhZnRlci5lZGdlcyA9IFthZGRlZE1vZGVsXTtcbiAgICAgICAgZ3JhcGgucHVzaFN0YWNrKCdhZGQnLCB7XG4gICAgICAgICAgYmVmb3JlOiB7fSxcbiAgICAgICAgICBhZnRlcjogYWZ0ZXJcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGdyYXBoLmVtaXQoJ2FmdGVyY3JlYXRlZWRnZScsIHtcbiAgICAgICAgZWRnZTogc2VsZi5lZGdlXG4gICAgICB9KTsgLy8g5pqC5pe25bCG6K+l6L6555qEIGNhcHR1cmUg5oGi5aSN5Li6IHRydWVcblxuICAgICAgc2VsZi5lZGdlLmdldEtleVNoYXBlKCkuc2V0KCdjYXB0dXJlJywgdHJ1ZSk7XG4gICAgICBzZWxmLmVkZ2UgPSBudWxsO1xuICAgICAgc2VsZi5hZGRpbmdFZGdlID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIOWmguaenOi+ueeahOi1t+eCueayoeacieaMh+Wumu+8jOWImeagueaNrui1t+eCueWIm+W7uuaWsOi+uVxuICAgICAgaWYgKCFzZWxmLnNob3VsZEJlZ2luLmNhbGwoc2VsZiwgZXYpKSByZXR1cm47IC8vIOiOt+WPluiHquWumuS5iSBlZGdlIOmFjee9rlxuXG4gICAgICB2YXIgZWRnZUNvbmZpZyA9IHZvaWQgMDtcblxuICAgICAgaWYgKGdldEVkZ2VDb25maWcgJiYgaXNGdW5jdGlvbihnZXRFZGdlQ29uZmlnKSkge1xuICAgICAgICBlZGdlQ29uZmlnID0gZ2V0RWRnZUNvbmZpZyh7XG4gICAgICAgICAgc291cmNlOiBtb2RlbC5pZCxcbiAgICAgICAgICB0YXJnZXQ6IG1vZGVsLmlkXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZWRnZUNvbmZpZyA9IHNlbGYuZWRnZUNvbmZpZztcbiAgICAgIH1cblxuICAgICAgc2VsZi5lZGdlID0gZ3JhcGguYWRkSXRlbSgnZWRnZScsIF9fYXNzaWduKHtcbiAgICAgICAgc291cmNlOiBtb2RlbC5pZCxcbiAgICAgICAgdGFyZ2V0OiBtb2RlbC5pZFxuICAgICAgfSwgZWRnZUNvbmZpZyksIGZhbHNlKTtcbiAgICAgIHNlbGYuc291cmNlID0gbW9kZWwuaWQ7XG4gICAgICBzZWxmLmFkZGluZ0VkZ2UgPSB0cnVlOyAvLyDmmoLml7blsIbor6XovrnnmoQgY2FwdHVyZSDorr7nva7kuLogZmFsc2XvvIzov5nmoLflj6/ku6Xmi77lj5bliLDlkI7pnaLnmoTlhYPntKBcblxuICAgICAgc2VsZi5lZGdlLmdldEtleVNoYXBlKCkuc2V0KCdjYXB0dXJlJywgZmFsc2UpO1xuICAgIH1cbiAgfSxcbiAgLy8g6L6555qE6LW354K55bey57uP56Gu5a6a77yM6L6555qE5pyr56uv6Lef6ZqP6byg5qCH56e75YqoXG4gIHVwZGF0ZUVuZFBvaW50OiBmdW5jdGlvbiB1cGRhdGVFbmRQb2ludChldikge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBpZiAoc2VsZi5rZXkgJiYgIXNlbGYua2V5ZG93bikgcmV0dXJuO1xuICAgIHZhciBwb2ludCA9IHtcbiAgICAgIHg6IGV2LngsXG4gICAgICB5OiBldi55XG4gICAgfTsgLy8g6Iul5q2k5pe2IHNvdXJjZSDoioLngrnlt7Lnu4/ooqvnp7vpmaTvvIznu5PmnZ/mt7vliqDovrlcblxuICAgIGlmICghc2VsZi5ncmFwaC5maW5kQnlJZChzZWxmLnNvdXJjZSkpIHtcbiAgICAgIHNlbGYuYWRkaW5nRWRnZSA9IGZhbHNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChzZWxmLmFkZGluZ0VkZ2UgJiYgc2VsZi5lZGdlKSB7XG4gICAgICAvLyDmm7TmlrDovrnnmoTnu4jngrnkuLrpvKDmoIfkvY3nva5cbiAgICAgIHNlbGYuZ3JhcGgudXBkYXRlSXRlbShzZWxmLmVkZ2UsIHtcbiAgICAgICAgdGFyZ2V0OiBwb2ludFxuICAgICAgfSwgZmFsc2UpO1xuICAgIH1cbiAgfSxcbiAgLy8g5Y+W5raI5aKe5Yqg6L6577yM5Yig6Zmk6K+l6L6577yb5oiW5oyH5a6a57uI54K5XG4gIGNhbmNlbENyZWF0aW5nOiBmdW5jdGlvbiBjYW5jZWxDcmVhdGluZyhldikge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBpZiAoc2VsZi5rZXkgJiYgIXNlbGYua2V5ZG93bikgcmV0dXJuO1xuICAgIHZhciBncmFwaCA9IHNlbGYuZ3JhcGg7XG4gICAgdmFyIGN1cnJlbnRFZGdlID0gZXYuaXRlbTtcblxuICAgIGlmIChzZWxmLmFkZGluZ0VkZ2UgJiYgZXYudGFyZ2V0ICYmIGV2LnRhcmdldC5pc0NhbnZhcyAmJiBldi50YXJnZXQuaXNDYW52YXMoKSkge1xuICAgICAgZ3JhcGgucmVtb3ZlSXRlbShzZWxmLmVkZ2UsIGZhbHNlKTtcbiAgICAgIHNlbGYuZWRnZSA9IG51bGw7XG4gICAgICBzZWxmLmFkZGluZ0VkZ2UgPSBmYWxzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoc2VsZi5hZGRpbmdFZGdlICYmIHNlbGYuZWRnZSA9PT0gY3VycmVudEVkZ2UpIHtcbiAgICAgIGdyYXBoLnJlbW92ZUl0ZW0oc2VsZi5lZGdlLCBmYWxzZSk7XG4gICAgICBzZWxmLmVkZ2UgPSBudWxsO1xuICAgICAgc2VsZi5hZGRpbmdFZGdlID0gZmFsc2U7XG4gICAgfVxuICB9LFxuICBvbktleURvd246IGZ1bmN0aW9uIG9uS2V5RG93bihlKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBjb2RlID0gZS5rZXk7XG5cbiAgICBpZiAoIWNvZGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoY29kZS50b0xvd2VyQ2FzZSgpID09PSBzZWxmLmtleS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICBzZWxmLmtleWRvd24gPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZWxmLmtleWRvd24gPSBmYWxzZTtcbiAgICB9XG4gIH0sXG4gIG9uS2V5VXA6IGZ1bmN0aW9uIG9uS2V5VXAoKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgaWYgKHNlbGYuYWRkaW5nRWRnZSAmJiBzZWxmLmVkZ2UpIHtcbiAgICAgIC8vIOa4hemZpOato+WcqOWinuWKoOeahOi+uVxuICAgICAgc2VsZi5ncmFwaC5yZW1vdmVJdGVtKHNlbGYuZWRnZSwgZmFsc2UpO1xuICAgICAgc2VsZi5hZGRpbmdFZGdlID0gZmFsc2U7XG4gICAgICBzZWxmLmVkZ2UgPSBudWxsO1xuICAgIH1cblxuICAgIHRoaXMua2V5ZG93biA9IGZhbHNlO1xuICB9XG59OyIsInZhciBERUZBVUxUX1RSSUdHRVIgPSAnY3RybCc7XG52YXIgQUxMT1dfRVZFTlRTID0gWydzaGlmdCcsICdjdHJsJywgJ2FsdCcsICdjb250cm9sJ107XG52YXIgREVGQVVMVF9DT01CSU5FRF9LRVkgPSAnMSc7XG5leHBvcnQgZGVmYXVsdCB7XG4gIGdldERlZmF1bHRDZmc6IGZ1bmN0aW9uIGdldERlZmF1bHRDZmcoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRyaWdnZXI6IERFRkFVTFRfVFJJR0dFUixcbiAgICAgIGNvbWJpbmVkS2V5OiBERUZBVUxUX0NPTUJJTkVEX0tFWSxcbiAgICAgIGZ1bmN0aW9uTmFtZTogJ2ZpdFZpZXcnLFxuICAgICAgZnVuY3Rpb25QYXJhbXM6IFtdXG4gICAgfTtcbiAgfSxcbiAgZ2V0RXZlbnRzOiBmdW5jdGlvbiBnZXRFdmVudHMoKSB7XG4gICAgLy8g5qOA5rWL6L6T5YWl5piv5ZCm5ZCI5rOVXG4gICAgaWYgKCEoQUxMT1dfRVZFTlRTLmluZGV4T2YodGhpcy50cmlnZ2VyLnRvTG93ZXJDYXNlKCkpID4gLTEpKSB7XG4gICAgICB0aGlzLnRyaWdnZXIgPSBERUZBVUxUX1RSSUdHRVI7XG4gICAgICBjb25zb2xlLndhcm4oXCJCZWhhdmlvciBzaG9ydGN1dHMtZml0LXZpZXcgXFx1NzY4NCB0cmlnZ2VyIFxcdTUzQzJcXHU2NTcwICdcIiArIHRoaXMudHJpZ2dlciArIFwiJyBcXHU0RTBEXFx1NTQwOFxcdTZDRDVcXHVGRjBDXFx1OEJGN1xcdThGOTNcXHU1MTY1ICdkcmFnJ1xcdTMwMDEnc2hpZnQnXFx1MzAwMSdjdHJsJyBcXHU2MjE2ICdhbHQnXCIpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbWJpbmVkS2V5ID09PSB0aGlzLnRyaWdnZXIpIHtcbiAgICAgIHRoaXMuY29tYmluZWRLZXkgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGtleXVwOiAnb25LZXlVcCcsXG4gICAgICBrZXlkb3duOiAnb25LZXlEb3duJ1xuICAgIH07XG4gIH0sXG4gIG9uS2V5RG93bjogZnVuY3Rpb24gb25LZXlEb3duKGUpIHtcbiAgICB2YXIgY29kZSA9IGUua2V5O1xuXG4gICAgaWYgKCFjb2RlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHRyaWdnZXJMb3dlckNhc2UgPSB0aGlzLnRyaWdnZXIudG9Mb3dlckNhc2UoKTtcbiAgICB2YXIgY29kZUxvd2VyQ2FzZSA9IGNvZGUudG9Mb3dlckNhc2UoKTsgLy8g5oyJ5L2PIGNvbnRyb2wg6ZSu5pe277yM5YWB6K6455So5oi36K6+572uIHRyaWdnZXIg5Li6IGN0cmxcblxuICAgIGlmICghdGhpcy50cmlnZ2VyS2V5ZG93bikge1xuICAgICAgaWYgKGNvZGVMb3dlckNhc2UgPT09IHRyaWdnZXJMb3dlckNhc2UgfHwgY29kZUxvd2VyQ2FzZSA9PT0gJ2NvbnRyb2wnICYmIHRyaWdnZXJMb3dlckNhc2UgPT09ICdjdHJsJyB8fCBjb2RlTG93ZXJDYXNlID09PSAnY3RybCcgJiYgdHJpZ2dlckxvd2VyQ2FzZSA9PT0gJ2NvbnRyb2wnKSB7XG4gICAgICAgIHRoaXMudHJpZ2dlcktleWRvd24gPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy50cmlnZ2VyS2V5ZG93biA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBncmFwaCA9IHRoaXMuZ3JhcGg7XG5cbiAgICBpZiAoIWdyYXBoW3RoaXMuZnVuY3Rpb25OYW1lXSkge1xuICAgICAgY29uc29sZS53YXJuKFwiQmVoYXZpb3Igc2hvcnRjdXRzLWZpdC12aWV3IFxcdTc2ODQgZnVuY3Rpb25OYW1lIFxcdTUzQzJcXHU2NTcwICdcIiArIHRoaXMuZnVuY3Rpb25OYW1lICsgXCInIFxcdTRFMERcXHU1NDA4XFx1NkNENVxcdUZGMENcXHU1QjgzXFx1NEUwRFxcdTY2MkYgR3JhcGggXFx1NzY4NFxcdTRFMDBcXHU0RTJBXFx1NTFGRFxcdTY1NzBcXHU1NDBEXCIpO1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH0gLy8g5pyq6YWN572uIGNvbWJpbmVkS2V577yM55u05o6lIGZpdFZpZXdcblxuXG4gICAgaWYgKHRoaXMudHJpZ2dlcktleWRvd24gJiYgIXRoaXMuY29tYmluZWRLZXkpIHtcbiAgICAgIGlmICh0aGlzLmZ1bmN0aW9uUGFyYW1zICYmIHRoaXMuZnVuY3Rpb25QYXJhbXMubGVuZ3RoKSBncmFwaFt0aGlzLmZ1bmN0aW9uTmFtZV0uYXBwbHkoZ3JhcGgsIHRoaXMuZnVuY3Rpb25QYXJhbXMpO2Vsc2UgZ3JhcGhbdGhpcy5mdW5jdGlvbk5hbWVdKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGNvbWJpbmVkS2V5TG93ZXJDYXNlID0gdGhpcy5jb21iaW5lZEtleS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgaWYgKHRoaXMudHJpZ2dlcktleWRvd24pIHtcbiAgICAgIGlmIChjb2RlTG93ZXJDYXNlID09PSBjb21iaW5lZEtleUxvd2VyQ2FzZSB8fCBjb2RlTG93ZXJDYXNlID09PSAnY29udHJvbCcgJiYgY29tYmluZWRLZXlMb3dlckNhc2UgPT09ICdjdHJsJyB8fCBjb2RlTG93ZXJDYXNlID09PSAnY3RybCcgJiYgY29tYmluZWRLZXlMb3dlckNhc2UgPT09ICdjb250cm9sJykge1xuICAgICAgICBpZiAodGhpcy5mdW5jdGlvblBhcmFtcyAmJiB0aGlzLmZ1bmN0aW9uUGFyYW1zLmxlbmd0aCkgZ3JhcGhbdGhpcy5mdW5jdGlvbk5hbWVdLmFwcGx5KGdyYXBoLCB0aGlzLmZ1bmN0aW9uUGFyYW1zKTtlbHNlIGdyYXBoW3RoaXMuZnVuY3Rpb25OYW1lXSgpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgb25LZXlVcDogZnVuY3Rpb24gb25LZXlVcCgpIHtcbiAgICBpZiAodGhpcy5icnVzaCkge1xuICAgICAgLy8g5riF6Zmk5omA5pyJ6YCJ5Lit54q25oCB5ZCO77yM6K6+572u5ouW5b6X5Yqo54q25oCB5Li6ZmFsc2XvvIzlubbmuIXpmaTmoYbpgInnmoRicnVzaFxuICAgICAgdGhpcy5icnVzaC5yZW1vdmUodHJ1ZSk7XG4gICAgICB0aGlzLmJydXNoID0gbnVsbDtcbiAgICAgIHRoaXMuZHJhZ2dpbmcgPSBmYWxzZTtcbiAgICB9XG5cbiAgICB0aGlzLnRyaWdnZXJLZXlkb3duID0gZmFsc2U7XG4gIH1cbn07IiwidmFyIEFMTE9XX0VWRU5UUyA9IFsnc2hpZnQnLCAnY3RybCcsICdhbHQnLCAnY29udHJvbCddO1xuZXhwb3J0IGRlZmF1bHQge1xuICBnZXREZWZhdWx0Q2ZnOiBmdW5jdGlvbiBnZXREZWZhdWx0Q2ZnKCkge1xuICAgIHJldHVybiB7XG4gICAgICBkaXJlY3Rpb246ICdib3RoJyxcbiAgICAgIGVuYWJsZU9wdGltaXplOiBmYWxzZSxcbiAgICAgIHpvb21LZXk6ICdjdHJsJyxcbiAgICAgIC8vIHNjcm9sbC1jYW52YXMg5Y+v5rua5Yqo55qE5omp5bGV6IyD5Zu077yM6buY6K6k5Li6IDDvvIzljbPmnIDlpJrlj6/ku6Xmu5rliqjkuIDlsY/nmoTkvY3nva5cbiAgICAgIC8vIOW9k+iuvue9rueahOWAvOWkp+S6jiAwIOaXtu+8jOWNs+a7muWKqOWPr+S7pei2hei/h+S4gOWxj1xuICAgICAgLy8g5b2T6K6+572u55qE5YC85bCP5LqOIDAg5pe277yM55u45b2T5LqO57yp5bCP5LqG5Y+v5rua5Yqo6IyD5Zu0XG4gICAgICAvLyDlhbfkvZPlrp7kvovlj6/lj4LogIPvvJpodHRwczovL2d3LmFsaXBheW9iamVjdHMuY29tL21kbi9ybXNfZjhjNmEwL2FmdHMvaW1nL0EqSUZmb1M2N19Ic3NBQUFBQUFBQUFBQUFBQVJRbkFRXG4gICAgICBzY2FsYWJsZVJhbmdlOiAwXG4gICAgfTtcbiAgfSxcbiAgZ2V0RXZlbnRzOiBmdW5jdGlvbiBnZXRFdmVudHMoKSB7XG4gICAgaWYgKCF0aGlzLnpvb21LZXkgfHwgQUxMT1dfRVZFTlRTLmluZGV4T2YodGhpcy56b29tS2V5KSA9PT0gLTEpIHRoaXMuem9vbUtleSA9ICdjdHJsJztcbiAgICByZXR1cm4ge1xuICAgICAgd2hlZWw6ICdvbldoZWVsJ1xuICAgIH07XG4gIH0sXG4gIG9uV2hlZWw6IGZ1bmN0aW9uIG9uV2hlZWwoZXYpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdmFyIGdyYXBoID0gdGhpcy5ncmFwaDtcbiAgICB2YXIga2V5RG93biA9IGV2W3RoaXMuem9vbUtleSArIFwiS2V5XCJdO1xuICAgIGlmICh0aGlzLnpvb21LZXkgPT09ICdjb250cm9sJykga2V5RG93biA9IGV2LmN0cmxLZXk7XG5cbiAgICBpZiAoa2V5RG93bikge1xuICAgICAgdmFyIGNhbnZhcyA9IGdyYXBoLmdldCgnY2FudmFzJyk7XG4gICAgICB2YXIgcG9pbnQgPSBjYW52YXMuZ2V0UG9pbnRCeUNsaWVudChldi5jbGllbnRYLCBldi5jbGllbnRZKTtcbiAgICAgIHZhciByYXRpbyA9IGdyYXBoLmdldFpvb20oKTtcblxuICAgICAgaWYgKGV2LndoZWVsRGVsdGEgPiAwKSB7XG4gICAgICAgIHJhdGlvID0gcmF0aW8gKyByYXRpbyAqIDAuMDU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByYXRpbyA9IHJhdGlvIC0gcmF0aW8gKiAwLjA1O1xuICAgICAgfVxuXG4gICAgICBncmFwaC56b29tVG8ocmF0aW8sIHtcbiAgICAgICAgeDogcG9pbnQueCxcbiAgICAgICAgeTogcG9pbnQueVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBkeCA9IGV2LmRlbHRhWCB8fCBldi5tb3ZlbWVudFg7XG4gICAgICB2YXIgZHkgPSBldi5kZWx0YVkgfHwgZXYubW92ZW1lbnRZO1xuICAgICAgaWYgKCFkeSAmJiBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ0ZpcmVmb3gnKSA+IC0xKSBkeSA9IC1ldi53aGVlbERlbHRhICogMTI1IC8gMztcbiAgICAgIHZhciB3aWR0aCA9IHRoaXMuZ3JhcGguZ2V0KCd3aWR0aCcpO1xuICAgICAgdmFyIGhlaWdodCA9IHRoaXMuZ3JhcGguZ2V0KCdoZWlnaHQnKTtcbiAgICAgIHZhciBncmFwaENhbnZhc0JCb3ggPSB0aGlzLmdyYXBoLmdldCgnY2FudmFzJykuZ2V0Q2FudmFzQkJveCgpO1xuICAgICAgdmFyIGV4cGFuZFdpZHRoID0gdGhpcy5zY2FsYWJsZVJhbmdlO1xuICAgICAgdmFyIGV4cGFuZEhlaWdodCA9IHRoaXMuc2NhbGFibGVSYW5nZTsgLy8g6IulIHNjYWxhYmxlUmFuZ2Ug5pivIDB+MSDnmoTlsI/mlbDvvIzliJnkvZzkuLrmr5TkvovogIPomZFcblxuICAgICAgaWYgKGV4cGFuZFdpZHRoIDwgMSAmJiBleHBhbmRXaWR0aCA+IC0xKSB7XG4gICAgICAgIGV4cGFuZFdpZHRoID0gd2lkdGggKiBleHBhbmRXaWR0aDtcbiAgICAgICAgZXhwYW5kSGVpZ2h0ID0gaGVpZ2h0ICogZXhwYW5kSGVpZ2h0O1xuICAgICAgfVxuXG4gICAgICB2YXIgbWluWCA9IGdyYXBoQ2FudmFzQkJveC5taW5YLFxuICAgICAgICAgIG1heFggPSBncmFwaENhbnZhc0JCb3gubWF4WCxcbiAgICAgICAgICBtaW5ZID0gZ3JhcGhDYW52YXNCQm94Lm1pblksXG4gICAgICAgICAgbWF4WSA9IGdyYXBoQ2FudmFzQkJveC5tYXhZO1xuXG4gICAgICBpZiAoZHggPiAwKSB7XG4gICAgICAgIGlmIChtYXhYIDwgLWV4cGFuZFdpZHRoKSB7XG4gICAgICAgICAgZHggPSAwO1xuICAgICAgICB9IGVsc2UgaWYgKG1heFggLSBkeCA8IC1leHBhbmRXaWR0aCkge1xuICAgICAgICAgIGR4ID0gbWF4WCArIGV4cGFuZFdpZHRoO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGR4IDwgMCkge1xuICAgICAgICBpZiAobWluWCA+IHdpZHRoICsgZXhwYW5kV2lkdGgpIHtcbiAgICAgICAgICBkeCA9IDA7XG4gICAgICAgIH0gZWxzZSBpZiAobWluWCAtIGR4ID4gd2lkdGggKyBleHBhbmRXaWR0aCkge1xuICAgICAgICAgIGR4ID0gbWluWCAtICh3aWR0aCArIGV4cGFuZFdpZHRoKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZHkgPiAwKSB7XG4gICAgICAgIGlmIChtYXhZIDwgLWV4cGFuZEhlaWdodCkge1xuICAgICAgICAgIGR5ID0gMDtcbiAgICAgICAgfSBlbHNlIGlmIChtYXhZIC0gZHkgPCAtZXhwYW5kSGVpZ2h0KSB7XG4gICAgICAgICAgZHkgPSBtYXhZICsgZXhwYW5kSGVpZ2h0O1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGR5IDwgMCkge1xuICAgICAgICBpZiAobWluWSA+IGhlaWdodCArIGV4cGFuZEhlaWdodCkge1xuICAgICAgICAgIGR5ID0gMDtcbiAgICAgICAgfSBlbHNlIGlmIChtaW5ZIC0gZHkgPiBoZWlnaHQgKyBleHBhbmRIZWlnaHQpIHtcbiAgICAgICAgICBkeSA9IG1pblkgLSAoaGVpZ2h0ICsgZXhwYW5kSGVpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5nZXQoJ2RpcmVjdGlvbicpID09PSAneCcpIHtcbiAgICAgICAgZHkgPSAwO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmdldCgnZGlyZWN0aW9uJykgPT09ICd5Jykge1xuICAgICAgICBkeCA9IDA7XG4gICAgICB9XG5cbiAgICAgIGdyYXBoLnRyYW5zbGF0ZSgtZHgsIC1keSk7XG4gICAgfVxuXG4gICAgZXYucHJldmVudERlZmF1bHQoKTsgLy8gaGlkZSB0aGUgc2hhcGVzIHdoZW4gdGhlIHpvb20gcmF0aW8gaXMgc21hbGxlciB0aGFuIG9wdGltaXplWm9vbVxuICAgIC8vIGhpZGUgdGhlIHNoYXBlcyB3aGVuIHpvb21taW5nXG5cbiAgICB2YXIgZW5hYmxlT3B0aW1pemUgPSB0aGlzLmdldCgnZW5hYmxlT3B0aW1pemUnKTtcblxuICAgIGlmIChlbmFibGVPcHRpbWl6ZSkge1xuICAgICAgdmFyIG9wdGltaXplWm9vbV8xID0gdGhpcy5nZXQoJ29wdGltaXplWm9vbScpO1xuICAgICAgdmFyIG9wdGltaXplZCA9IHRoaXMuZ2V0KCdvcHRpbWl6ZWQnKTtcbiAgICAgIHZhciBub2Rlc18xID0gZ3JhcGguZ2V0Tm9kZXMoKTtcbiAgICAgIHZhciBlZGdlc18xID0gZ3JhcGguZ2V0RWRnZXMoKTtcbiAgICAgIHZhciBub2Rlc0xlbmd0aF8xID0gbm9kZXNfMS5sZW5ndGg7XG4gICAgICB2YXIgZWRnZXNMZW5ndGhfMSA9IGVkZ2VzXzEubGVuZ3RoOyAvLyBoaWRpbmdcblxuICAgICAgaWYgKCFvcHRpbWl6ZWQpIHtcbiAgICAgICAgZm9yICh2YXIgbiA9IDA7IG4gPCBub2Rlc0xlbmd0aF8xOyBuKyspIHtcbiAgICAgICAgICB2YXIgbm9kZSA9IG5vZGVzXzFbbl07XG5cbiAgICAgICAgICBpZiAoIW5vZGUuZGVzdHJveWVkKSB7XG4gICAgICAgICAgICB2YXIgY2hpbGRyZW4gPSBub2RlLmdldCgnZ3JvdXAnKS5nZXQoJ2NoaWxkcmVuJyk7XG4gICAgICAgICAgICB2YXIgY2hpbGRyZW5MZW5ndGggPSBjaGlsZHJlbi5sZW5ndGg7XG5cbiAgICAgICAgICAgIGZvciAodmFyIGMgPSAwOyBjIDwgY2hpbGRyZW5MZW5ndGg7IGMrKykge1xuICAgICAgICAgICAgICB2YXIgc2hhcGUgPSBjaGlsZHJlbltjXTtcblxuICAgICAgICAgICAgICBpZiAoIXNoYXBlLmRlc3RvcnllZCAmJiAhc2hhcGUuZ2V0KCdpc0tleVNoYXBlJykpIHtcbiAgICAgICAgICAgICAgICBzaGFwZS5zZXQoJ29yaS12aXNpYmlsaXR5Jywgc2hhcGUuZ2V0KCdvcmktdmlzaWJpbGl0eScpIHx8IHNoYXBlLmdldCgndmlzaWJsZScpKTtcbiAgICAgICAgICAgICAgICBzaGFwZS5oaWRlKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKHZhciBlZGdlSW5kZXggPSAwOyBlZGdlSW5kZXggPCBlZGdlc0xlbmd0aF8xOyBlZGdlSW5kZXgrKykge1xuICAgICAgICAgIHZhciBlZGdlID0gZWRnZXNfMVtlZGdlSW5kZXhdO1xuICAgICAgICAgIHZhciBjaGlsZHJlbiA9IGVkZ2UuZ2V0KCdncm91cCcpLmdldCgnY2hpbGRyZW4nKTtcbiAgICAgICAgICB2YXIgY2hpbGRyZW5MZW5ndGggPSBjaGlsZHJlbi5sZW5ndGg7XG5cbiAgICAgICAgICBmb3IgKHZhciBjID0gMDsgYyA8IGNoaWxkcmVuTGVuZ3RoOyBjKyspIHtcbiAgICAgICAgICAgIHZhciBzaGFwZSA9IGNoaWxkcmVuW2NdO1xuICAgICAgICAgICAgc2hhcGUuc2V0KCdvcmktdmlzaWJpbGl0eScsIHNoYXBlLmdldCgnb3JpLXZpc2liaWxpdHknKSB8fCBzaGFwZS5nZXQoJ3Zpc2libGUnKSk7XG4gICAgICAgICAgICBzaGFwZS5oaWRlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZXQoJ29wdGltaXplZCcsIHRydWUpO1xuICAgICAgfSAvLyBzaG93aW5nIGFmdGVyIDEwMG1zXG5cblxuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuZ2V0KCd0aW1lb3V0JykpO1xuICAgICAgdmFyIHRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGN1cnJlbnRab29tID0gZ3JhcGguZ2V0Wm9vbSgpO1xuXG4gICAgICAgIHZhciBjdXJPcHRpbWl6ZWQgPSBfdGhpcy5nZXQoJ29wdGltaXplZCcpO1xuXG4gICAgICAgIGlmIChjdXJPcHRpbWl6ZWQpIHtcbiAgICAgICAgICBfdGhpcy5zZXQoJ29wdGltaXplZCcsIGZhbHNlKTtcblxuICAgICAgICAgIGZvciAodmFyIG4gPSAwOyBuIDwgbm9kZXNMZW5ndGhfMTsgbisrKSB7XG4gICAgICAgICAgICB2YXIgbm9kZSA9IG5vZGVzXzFbbl07XG4gICAgICAgICAgICB2YXIgY2hpbGRyZW4gPSBub2RlLmdldCgnZ3JvdXAnKS5nZXQoJ2NoaWxkcmVuJyk7XG4gICAgICAgICAgICB2YXIgY2hpbGRyZW5MZW5ndGggPSBjaGlsZHJlbi5sZW5ndGg7XG5cbiAgICAgICAgICAgIGlmIChjdXJyZW50Wm9vbSA8IG9wdGltaXplWm9vbV8xKSB7XG4gICAgICAgICAgICAgIHZhciBrZXlTaGFwZSA9IG5vZGUuZ2V0S2V5U2hhcGUoKTtcbiAgICAgICAgICAgICAgdmFyIG9yaVZpcyA9IGtleVNoYXBlLmdldCgnb3JpLXZpc2liaWxpdHknKTtcbiAgICAgICAgICAgICAgaWYgKG9yaVZpcykga2V5U2hhcGUuc2hvdygpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZm9yICh2YXIgYyA9IDA7IGMgPCBjaGlsZHJlbkxlbmd0aDsgYysrKSB7XG4gICAgICAgICAgICAgICAgdmFyIHNoYXBlID0gY2hpbGRyZW5bY107XG4gICAgICAgICAgICAgICAgdmFyIG9yaVZpcyA9IHNoYXBlLmdldCgnb3JpLXZpc2liaWxpdHknKTtcblxuICAgICAgICAgICAgICAgIGlmICghc2hhcGUuZ2V0KCd2aXNpYmxlJykgJiYgb3JpVmlzKSB7XG4gICAgICAgICAgICAgICAgICBpZiAob3JpVmlzKSBzaGFwZS5zaG93KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZm9yICh2YXIgZWRnZUluZGV4ID0gMDsgZWRnZUluZGV4IDwgZWRnZXNMZW5ndGhfMTsgZWRnZUluZGV4KyspIHtcbiAgICAgICAgICAgIHZhciBlZGdlID0gZWRnZXNfMVtlZGdlSW5kZXhdO1xuICAgICAgICAgICAgdmFyIGNoaWxkcmVuID0gZWRnZS5nZXQoJ2dyb3VwJykuZ2V0KCdjaGlsZHJlbicpO1xuICAgICAgICAgICAgdmFyIGNoaWxkcmVuTGVuZ3RoID0gY2hpbGRyZW4ubGVuZ3RoO1xuXG4gICAgICAgICAgICBpZiAoY3VycmVudFpvb20gPCBvcHRpbWl6ZVpvb21fMSkge1xuICAgICAgICAgICAgICB2YXIga2V5U2hhcGUgPSBlZGdlLmdldEtleVNoYXBlKCk7XG4gICAgICAgICAgICAgIHZhciBvcmlWaXMgPSBrZXlTaGFwZS5nZXQoJ29yaS12aXNpYmlsaXR5Jyk7XG4gICAgICAgICAgICAgIGlmIChvcmlWaXMpIGtleVNoYXBlLnNob3coKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGZvciAodmFyIGMgPSAwOyBjIDwgY2hpbGRyZW5MZW5ndGg7IGMrKykge1xuICAgICAgICAgICAgICAgIHZhciBzaGFwZSA9IGNoaWxkcmVuW2NdO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFzaGFwZS5nZXQoJ3Zpc2libGUnKSkge1xuICAgICAgICAgICAgICAgICAgdmFyIG9yaVZpcyA9IHNoYXBlLmdldCgnb3JpLXZpc2liaWxpdHknKTtcbiAgICAgICAgICAgICAgICAgIGlmIChvcmlWaXMpIHNoYXBlLnNob3coKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sIDEwMCk7XG4gICAgICB0aGlzLnNldCgndGltZW91dCcsIHRpbWVvdXQpO1xuICAgIH1cbiAgfVxufTsiLCJpbXBvcnQgeyBlYWNoIH0gZnJvbSAnQGFudHYvdXRpbCc7XG5pbXBvcnQgeyByZWdpc3RlckJlaGF2aW9yIH0gZnJvbSAnQGFudHYvZzYtY29yZSc7IC8vIGltcG9ydCBCZWhhdmlvciBmcm9tICcuL2JlaGF2aW9yJztcblxuaW1wb3J0IERyYWdDYW52YXMgZnJvbSAnLi9kcmFnLWNhbnZhcyc7XG5pbXBvcnQgRHJhZ05vZGUgZnJvbSAnLi9kcmFnLW5vZGUnO1xuaW1wb3J0IEFjdGl2YXRlUmVsYXRpb25zIGZyb20gJy4vYWN0aXZhdGUtcmVsYXRpb25zJztcbmltcG9ydCBCcnVzaFNlbGVjdCBmcm9tICcuL2JydXNoLXNlbGVjdCc7XG5pbXBvcnQgQ2xpY2tTZWxlY3QgZnJvbSAnLi9jbGljay1zZWxlY3QnO1xuaW1wb3J0IFpvb21DYW52YXMgZnJvbSAnLi96b29tLWNhbnZhcyc7XG5pbXBvcnQgVG9vbHRpcCBmcm9tICcuL3Rvb2x0aXAnO1xuaW1wb3J0IEVkZ2VUb29sdGlwIGZyb20gJy4vZWRnZS10b29sdGlwJztcbmltcG9ydCBDb2xsYXBzZUV4cGFuZCBmcm9tICcuL2NvbGxhcHNlLWV4cGFuZCc7XG5pbXBvcnQgRHJhZ0NvbWJvIGZyb20gJy4vZHJhZy1jb21ibyc7XG5pbXBvcnQgQ29sbGFwc2VFeHBhbmRDb21ibyBmcm9tICcuL2NvbGxhcHNlLWV4cGFuZC1jb21ibyc7XG5pbXBvcnQgTGFzc29TZWxlY3QgZnJvbSAnLi9sYXNzby1zZWxlY3QnO1xuaW1wb3J0IENyZWF0ZUVkZ2UgZnJvbSAnLi9jcmVhdGUtZWRnZSc7XG5pbXBvcnQgU2hvcnRjdXRzQ2FsbCBmcm9tICcuL3Nob3J0Y3V0cy1jYWxsJztcbmltcG9ydCBTY3JvbGxDYW52YXMgZnJvbSAnLi9zY3JvbGwtY2FudmFzJztcbnZhciBiZWhhdmlvcnMgPSB7XG4gICdkcmFnLWNhbnZhcyc6IERyYWdDYW52YXMsXG4gICd6b29tLWNhbnZhcyc6IFpvb21DYW52YXMsXG4gICdkcmFnLW5vZGUnOiBEcmFnTm9kZSxcbiAgJ2FjdGl2YXRlLXJlbGF0aW9ucyc6IEFjdGl2YXRlUmVsYXRpb25zLFxuICAnYnJ1c2gtc2VsZWN0JzogQnJ1c2hTZWxlY3QsXG4gICdjbGljay1zZWxlY3QnOiBDbGlja1NlbGVjdCxcbiAgJ2xhc3NvLXNlbGVjdCc6IExhc3NvU2VsZWN0LFxuICB0b29sdGlwOiBUb29sdGlwLFxuICAnZWRnZS10b29sdGlwJzogRWRnZVRvb2x0aXAsXG4gICdjb2xsYXBzZS1leHBhbmQnOiBDb2xsYXBzZUV4cGFuZCxcbiAgJ2RyYWctY29tYm8nOiBEcmFnQ29tYm8sXG4gICdjb2xsYXBzZS1leHBhbmQtY29tYm8nOiBDb2xsYXBzZUV4cGFuZENvbWJvLFxuICAnY3JlYXRlLWVkZ2UnOiBDcmVhdGVFZGdlLFxuICAnc2hvcnRjdXRzLWNhbGwnOiBTaG9ydGN1dHNDYWxsLFxuICAnc2Nyb2xsLWNhbnZhcyc6IFNjcm9sbENhbnZhc1xufTtcbmVhY2goYmVoYXZpb3JzLCBmdW5jdGlvbiAoYmVoYXZpb3IsIHR5cGUpIHtcbiAgcmVnaXN0ZXJCZWhhdmlvcih0eXBlLCBiZWhhdmlvcik7XG59KTsgLy8gZXhwb3J0IGRlZmF1bHQgQmVoYXZpb3I7IiwiaW1wb3J0IHsgX19hc3NpZ24gfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IHJlZ2lzdGVyQmVoYXZpb3IsIHJlZ2lzdGVyQ29tYm8sIHJlZ2lzdGVyRWRnZSwgcmVnaXN0ZXJOb2RlLCBBcnJvdywgTWFya2VyLCBTaGFwZSB9IGZyb20gJ0BhbnR2L2c2LWNvcmUnO1xuaW1wb3J0ICogYXMgQWxnb3JpdGhtU3luYyBmcm9tICdAYW50di9hbGdvcml0aG0nO1xuaW1wb3J0ICogYXMgQWxnb3JpdGhtQXN5bmMgZnJvbSAnQGFudHYvYWxnb3JpdGhtL2xpYi9hc3luY0luZGV4JztcbmltcG9ydCBHcmFwaCBmcm9tICcuL2dyYXBoL2dyYXBoJztcbmltcG9ydCBUcmVlR3JhcGggZnJvbSAnLi9ncmFwaC90cmVlLWdyYXBoJztcbmltcG9ydCB7IFRyZWVMYXlvdXQsIExheW91dCwgcmVnaXN0ZXJMYXlvdXQgfSBmcm9tICcuL2xheW91dCc7XG5pbXBvcnQgR2xvYmFsIGZyb20gJy4vZ2xvYmFsJztcbmltcG9ydCBVdGlsIGZyb20gJy4vdXRpbCc7XG5pbXBvcnQgUGx1Z2luIGZyb20gJy4vcGx1Z2luJztcbmltcG9ydCAnLi9lbGVtZW50JztcbmltcG9ydCAnLi9iZWhhdmlvcic7XG5cbnZhciBBbGdvcml0aG0gPSBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgQWxnb3JpdGhtU3luYyksIEFsZ29yaXRobUFzeW5jKTtcblxudmFyIEdyaWQgPSBQbHVnaW4uR3JpZDtcbnZhciBNaW5pbWFwID0gUGx1Z2luLk1pbmltYXA7XG52YXIgQnVuZGxpbmcgPSBQbHVnaW4uQnVuZGxpbmc7XG52YXIgTWVudSA9IFBsdWdpbi5NZW51O1xudmFyIEZpc2hleWUgPSBQbHVnaW4uRmlzaGV5ZTtcbnZhciBUb29sQmFyID0gUGx1Z2luLlRvb2xCYXI7XG52YXIgVG9vbHRpcCA9IFBsdWdpbi5Ub29sdGlwO1xudmFyIFRpbWVCYXIgPSBQbHVnaW4uVGltZUJhcjtcbnZhciBJbWFnZU1pbmltYXAgPSBQbHVnaW4uSW1hZ2VNaW5pbWFwO1xudmFyIEVkZ2VGaWx0ZXJMZW5zID0gUGx1Z2luLkVkZ2VGaWx0ZXJMZW5zO1xudmFyIFNuYXBMaW5lID0gUGx1Z2luLlNuYXBMaW5lO1xudmFyIExlZ2VuZCA9IFBsdWdpbi5MZWdlbmQ7XG5leHBvcnQgKiBmcm9tICdAYW50di9nNi1jb3JlJztcbmV4cG9ydCAqIGZyb20gJy4vdHlwZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9pbnRlcmZhY2UvZ3JhcGgnO1xuZXhwb3J0IHsgR3JhcGgsIFRyZWVHcmFwaCwgVXRpbCwgTGF5b3V0LCBUcmVlTGF5b3V0LCByZWdpc3RlckxheW91dCwgR2xvYmFsLCBNaW5pbWFwLCBHcmlkLCBCdW5kbGluZywgTWVudSwgRmlzaGV5ZSwgQWxnb3JpdGhtLCBUb29sQmFyLCBUb29sdGlwLCBUaW1lQmFyLCBJbWFnZU1pbmltYXAsIEVkZ2VGaWx0ZXJMZW5zLCBTbmFwTGluZSwgTGVnZW5kLCBBcnJvdywgTWFya2VyLCBTaGFwZSB9O1xuZXhwb3J0IGRlZmF1bHQge1xuICB2ZXJzaW9uOiBHbG9iYWwudmVyc2lvbixcbiAgR3JhcGg6IEdyYXBoLFxuICBUcmVlR3JhcGg6IFRyZWVHcmFwaCxcbiAgVXRpbDogVXRpbCxcbiAgTGF5b3V0OiBMYXlvdXQsXG4gIFRyZWVMYXlvdXQ6IFRyZWVMYXlvdXQsXG4gIHJlZ2lzdGVyTGF5b3V0OiByZWdpc3RlckxheW91dCxcbiAgR2xvYmFsOiBHbG9iYWwsXG4gIHJlZ2lzdGVyQmVoYXZpb3I6IHJlZ2lzdGVyQmVoYXZpb3IsXG4gIHJlZ2lzdGVyQ29tYm86IHJlZ2lzdGVyQ29tYm8sXG4gIHJlZ2lzdGVyRWRnZTogcmVnaXN0ZXJFZGdlLFxuICByZWdpc3Rlck5vZGU6IHJlZ2lzdGVyTm9kZSxcbiAgTWluaW1hcDogUGx1Z2luLk1pbmltYXAsXG4gIEdyaWQ6IFBsdWdpbi5HcmlkLFxuICBCdW5kbGluZzogUGx1Z2luLkJ1bmRsaW5nLFxuICBNZW51OiBQbHVnaW4uTWVudSxcbiAgVG9vbEJhcjogUGx1Z2luLlRvb2xCYXIsXG4gIFRvb2x0aXA6IFBsdWdpbi5Ub29sdGlwLFxuICBMZWdlbmQ6IFBsdWdpbi5MZWdlbmQsXG4gIFRpbWVCYXI6IFRpbWVCYXIsXG4gIFNuYXBMaW5lOiBTbmFwTGluZSxcbiAgRmlzaGV5ZTogRmlzaGV5ZSxcbiAgSW1hZ2VNaW5pbWFwOiBJbWFnZU1pbmltYXAsXG4gIEVkZ2VGaWx0ZXJMZW5zOiBFZGdlRmlsdGVyTGVucyxcbiAgQWxnb3JpdGhtOiBBbGdvcml0aG0sXG4gIEFycm93OiBBcnJvdyxcbiAgTWFya2VyOiBNYXJrZXIsXG4gIFNoYXBlOiBTaGFwZVxufTsiLCJpbXBvcnQgRzYgZnJvbSAnQGFudHYvZzYtcGMnO1xuRzYudmVyc2lvbiA9ICc0LjQuMSc7XG5leHBvcnQgKiBmcm9tICdAYW50di9nNi1wYyc7XG5leHBvcnQgZGVmYXVsdCBHNjtcbmV4cG9ydCB2YXIgdmVyc2lvbiA9ICc0LjQuMSc7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///50\n")},function(module,__webpack_exports__,__webpack_require__){"use strict";eval('/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return RenderPass; });\n/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(9);\n/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(15);\n/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _babel_runtime_helpers_initializerDefineProperty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(10);\n/* harmony import */ var _babel_runtime_helpers_initializerDefineProperty__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_initializerDefineProperty__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(6);\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(7);\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _babel_runtime_helpers_applyDecoratedDescriptor__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(11);\n/* harmony import */ var _babel_runtime_helpers_applyDecoratedDescriptor__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_applyDecoratedDescriptor__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _babel_runtime_helpers_initializerWarningHelper__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(29);\n/* harmony import */ var _babel_runtime_helpers_initializerWarningHelper__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_initializerWarningHelper__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var gl_matrix__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(2);\n/* harmony import */ var inversify__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(5);\n/* harmony import */ var inversify__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(inversify__WEBPACK_IMPORTED_MODULE_8__);\n/* harmony import */ var _identifier__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(13);\n/* harmony import */ var _gl__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(35);\n\n\n\n\n\n\n\n\nvar _dec, _dec2, _dec3, _dec4, _dec5, _dec6, _dec7, _dec8, _dec9, _dec10, _dec11, _class, _class2, _descriptor, _descriptor2, _descriptor3, _descriptor4, _descriptor5, _descriptor6, _descriptor7, _descriptor8, _descriptor9, _class3, _temp;\n\nfunction _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\n\n\n\n\nvar RenderPass = (_dec = Object(inversify__WEBPACK_IMPORTED_MODULE_8__["injectable"])(), _dec2 = Object(inversify__WEBPACK_IMPORTED_MODULE_8__["inject"])(_identifier__WEBPACK_IMPORTED_MODULE_9__[/* IDENTIFIER */ "a"].MeshComponentManager), _dec3 = Object(inversify__WEBPACK_IMPORTED_MODULE_8__["inject"])(_identifier__WEBPACK_IMPORTED_MODULE_9__[/* IDENTIFIER */ "a"].GeometryComponentManager), _dec4 = Object(inversify__WEBPACK_IMPORTED_MODULE_8__["inject"])(_identifier__WEBPACK_IMPORTED_MODULE_9__[/* IDENTIFIER */ "a"].MaterialComponentManager), _dec5 = Object(inversify__WEBPACK_IMPORTED_MODULE_8__["inject"])(_identifier__WEBPACK_IMPORTED_MODULE_9__[/* IDENTIFIER */ "a"].CullableComponentManager), _dec6 = Object(inversify__WEBPACK_IMPORTED_MODULE_8__["inject"])(_identifier__WEBPACK_IMPORTED_MODULE_9__[/* IDENTIFIER */ "a"].TransformComponentManager), _dec7 = Object(inversify__WEBPACK_IMPORTED_MODULE_8__["inject"])(_identifier__WEBPACK_IMPORTED_MODULE_9__[/* IDENTIFIER */ "a"].HierarchyComponentManager), _dec8 = Object(inversify__WEBPACK_IMPORTED_MODULE_8__["inject"])(_identifier__WEBPACK_IMPORTED_MODULE_9__[/* IDENTIFIER */ "a"].Systems), _dec9 = Object(inversify__WEBPACK_IMPORTED_MODULE_8__["named"])(_identifier__WEBPACK_IMPORTED_MODULE_9__[/* IDENTIFIER */ "a"].FrameGraphSystem), _dec10 = Object(inversify__WEBPACK_IMPORTED_MODULE_8__["inject"])(_identifier__WEBPACK_IMPORTED_MODULE_9__[/* IDENTIFIER */ "a"].RenderEngine), _dec11 = Object(inversify__WEBPACK_IMPORTED_MODULE_8__["inject"])(_identifier__WEBPACK_IMPORTED_MODULE_9__[/* IDENTIFIER */ "a"].ResourcePool), _dec(_class = (_class2 = (_temp = _class3 = /*#__PURE__*/function () {\n function RenderPass() {\n var _this = this;\n\n _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3___default()(this, RenderPass);\n\n _babel_runtime_helpers_initializerDefineProperty__WEBPACK_IMPORTED_MODULE_2___default()(this, "mesh", _descriptor, this);\n\n _babel_runtime_helpers_initializerDefineProperty__WEBPACK_IMPORTED_MODULE_2___default()(this, "geometry", _descriptor2, this);\n\n _babel_runtime_helpers_initializerDefineProperty__WEBPACK_IMPORTED_MODULE_2___default()(this, "material", _descriptor3, this);\n\n _babel_runtime_helpers_initializerDefineProperty__WEBPACK_IMPORTED_MODULE_2___default()(this, "cullable", _descriptor4, this);\n\n _babel_runtime_helpers_initializerDefineProperty__WEBPACK_IMPORTED_MODULE_2___default()(this, "transform", _descriptor5, this);\n\n _babel_runtime_helpers_initializerDefineProperty__WEBPACK_IMPORTED_MODULE_2___default()(this, "hierarchy", _descriptor6, this);\n\n _babel_runtime_helpers_initializerDefineProperty__WEBPACK_IMPORTED_MODULE_2___default()(this, "frameGraphSystem", _descriptor7, this);\n\n _babel_runtime_helpers_initializerDefineProperty__WEBPACK_IMPORTED_MODULE_2___default()(this, "engine", _descriptor8, this);\n\n _babel_runtime_helpers_initializerDefineProperty__WEBPACK_IMPORTED_MODULE_2___default()(this, "resourcePool", _descriptor9, this);\n\n this.modelCache = {};\n\n this.setup = function (fg, passNode, pass) {\n var output = fg.createRenderTarget(passNode, \'color buffer\', {\n width: 1,\n height: 1,\n usage: _gl__WEBPACK_IMPORTED_MODULE_10__[/* gl */ "a"].RENDER_ATTACHMENT | _gl__WEBPACK_IMPORTED_MODULE_10__[/* gl */ "a"].SAMPLED | _gl__WEBPACK_IMPORTED_MODULE_10__[/* gl */ "a"].COPY_SRC\n });\n pass.data = {\n output: passNode.write(fg, output)\n };\n };\n\n this.execute = /*#__PURE__*/function () {\n var _ref = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee(fg, pass, views) {\n var resourceNode, framebuffer, _iterator, _step, view, canvas;\n\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n resourceNode = fg.getResourceNode(pass.data.output);\n framebuffer = _this.resourcePool.getOrCreateResource(resourceNode.resource); // initialize model of each mesh\n\n _iterator = _createForOfIteratorHelper(views);\n _context.prev = 3;\n\n _iterator.s();\n\n case 5:\n if ((_step = _iterator.n()).done) {\n _context.next = 11;\n break;\n }\n\n view = _step.value;\n _context.next = 9;\n return _this.initView(view);\n\n case 9:\n _context.next = 5;\n break;\n\n case 11:\n _context.next = 16;\n break;\n\n case 13:\n _context.prev = 13;\n _context.t0 = _context["catch"](3);\n\n _iterator.e(_context.t0);\n\n case 16:\n _context.prev = 16;\n\n _iterator.f();\n\n return _context.finish(16);\n\n case 19:\n canvas = _this.engine.getCanvas();\n framebuffer.resize({\n width: canvas.width,\n height: canvas.height\n });\n\n _this.engine.setScissor({\n enable: false\n });\n\n _this.engine.clear({\n framebuffer: framebuffer,\n color: views[0].getClearColor(),\n // TODO: use clearColor defined in view\n depth: 1\n });\n\n _this.engine.useFramebuffer(framebuffer, function () {\n var _iterator2 = _createForOfIteratorHelper(views),\n _step2;\n\n try {\n for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {\n var view = _step2.value;\n\n // must do rendering in a sync way\n _this.renderView(view);\n }\n } catch (err) {\n _iterator2.e(err);\n } finally {\n _iterator2.f();\n }\n });\n\n case 24:\n case "end":\n return _context.stop();\n }\n }\n }, _callee, null, [[3, 13, 16, 19]]);\n }));\n\n return function (_x, _x2, _x3) {\n return _ref.apply(this, arguments);\n };\n }();\n }\n\n _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4___default()(RenderPass, [{\n key: "renderView",\n value: function renderView(view) {\n var scene = view.getScene();\n var camera = view.getCamera(); // get VP matrix from camera\n\n var viewMatrix = camera.getViewTransform();\n var viewProjectionMatrix = gl_matrix__WEBPACK_IMPORTED_MODULE_7__[/* mat4 */ "b"].multiply(gl_matrix__WEBPACK_IMPORTED_MODULE_7__[/* mat4 */ "b"].create(), camera.getPerspective(), viewMatrix); // TODO: use cached planes if camera was not changed\n\n camera.getFrustum().extractFromVPMatrix(viewProjectionMatrix);\n\n var _view$getViewport = view.getViewport(),\n x = _view$getViewport.x,\n y = _view$getViewport.y,\n width = _view$getViewport.width,\n height = _view$getViewport.height;\n\n this.engine.viewport({\n x: x,\n y: y,\n width: width,\n height: height\n }); // this.engine.setScissor({\n // enable: true,\n // box: { x, y, width, height },\n // });\n // this.engine.clear({\n // // framebuffer,\n // color: [1, 1, 1, 1], // TODO: use clearColor defined in view\n // depth: 1,\n // });\n\n var _iterator3 = _createForOfIteratorHelper(scene.getEntities()),\n _step3;\n\n try {\n for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {\n var meshEntity = _step3.value;\n this.renderMesh(meshEntity, {\n camera: camera,\n view: view,\n viewMatrix: viewMatrix\n });\n }\n } catch (err) {\n _iterator3.e(err);\n } finally {\n _iterator3.f();\n }\n }\n }, {\n key: "renderMesh",\n value: function renderMesh(meshEntity, _ref2) {\n var camera = _ref2.camera,\n view = _ref2.view,\n viewMatrix = _ref2.viewMatrix;\n var mesh = this.mesh.getComponentByEntity(meshEntity);\n\n if (!mesh || !mesh.visible) {\n return;\n } // filter meshes with frustum culling\n // if (!this.cullable.getComponentByEntity(meshEntity)?.visible) {\n // return;\n // }\n\n\n var material = mesh.material;\n var geometry = mesh.geometry; // geometry 在自己的 System 中完成脏检查后的更新\n\n if (!geometry || geometry.dirty || !material) {\n return;\n } // get model matrix from mesh\n\n\n var transform = this.transform.getComponentByEntity(meshEntity);\n var modelViewMatrix = gl_matrix__WEBPACK_IMPORTED_MODULE_7__[/* mat4 */ "b"].multiply(gl_matrix__WEBPACK_IMPORTED_MODULE_7__[/* mat4 */ "b"].create(), viewMatrix, transform.worldTransform);\n\n var _view$getViewport2 = view.getViewport(),\n width = _view$getViewport2.width,\n height = _view$getViewport2.height; // set MVP matrix, other builtin uniforms @see https://threejs.org/docs/#api/en/renderers/webgl/WebGLProgram\n\n\n material.setUniform({\n projectionMatrix: camera.getPerspective(),\n modelViewMatrix: modelViewMatrix,\n modelMatrix: transform.worldTransform,\n viewMatrix: viewMatrix,\n cameraPosition: camera.getPosition(),\n u_viewport: [width, height]\n });\n\n if (mesh.model) {\n mesh.model.draw({\n uniforms: material.uniforms.reduce(function (cur, prev) {\n cur[prev.name] = prev.data;\n return cur;\n }, {})\n });\n material.uniforms.forEach(function (u) {\n u.dirty = false;\n });\n material.dirty = false;\n }\n }\n }, {\n key: "initMesh",\n value: function () {\n var _initMesh = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee2(meshEntity, view) {\n var mesh, material, geometry, modelCacheKey, _this$engine, createModel, createAttribute, modelInitializationOptions;\n\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee2$(_context2) {\n while (1) {\n switch (_context2.prev = _context2.next) {\n case 0:\n mesh = this.mesh.getComponentByEntity(meshEntity);\n\n if (mesh) {\n _context2.next = 3;\n break;\n }\n\n return _context2.abrupt("return");\n\n case 3:\n material = mesh.material;\n geometry = mesh.geometry;\n\n if (!(!geometry || geometry.dirty || !material)) {\n _context2.next = 7;\n break;\n }\n\n return _context2.abrupt("return");\n\n case 7:\n if (mesh.model) {\n _context2.next = 24;\n break;\n }\n\n modelCacheKey = "m-".concat(material.entity, "-g-").concat(geometry.entity);\n\n if (!this.modelCache[modelCacheKey]) {\n _context2.next = 12;\n break;\n }\n\n mesh.model = this.modelCache[modelCacheKey];\n return _context2.abrupt("return");\n\n case 12:\n material.setUniform({\n projectionMatrix: 1,\n modelViewMatrix: 1,\n modelMatrix: 1,\n viewMatrix: 1,\n cameraPosition: 1,\n u_viewport: 1\n });\n _this$engine = this.engine, createModel = _this$engine.createModel, createAttribute = _this$engine.createAttribute;\n modelInitializationOptions = {\n vs: material.vertexShaderGLSL,\n fs: material.fragmentShaderGLSL,\n defines: material.defines,\n attributes: geometry.attributes.reduce(function (cur, prev) {\n if (prev.data && prev.buffer) {\n cur[prev.name] = createAttribute({\n buffer: prev.buffer,\n attributes: prev.attributes,\n arrayStride: prev.arrayStride,\n stepMode: prev.stepMode,\n divisor: prev.stepMode === \'vertex\' ? 0 : 1\n });\n }\n\n return cur;\n }, {}),\n uniforms: material.uniforms.reduce(function (cur, prev) {\n cur[prev.name] = prev.data;\n return cur;\n }, {}),\n scissor: {\n enable: true,\n // @ts-ignore\n box: function box() {\n return view.getViewport();\n }\n }\n };\n\n if (material.cull) {\n modelInitializationOptions.cull = material.cull;\n }\n\n if (material.depth) {\n modelInitializationOptions.depth = material.depth;\n }\n\n if (material.blend) {\n modelInitializationOptions.blend = material.blend;\n }\n\n if (geometry.indicesBuffer) {\n modelInitializationOptions.elements = geometry.indicesBuffer;\n }\n\n if (geometry.maxInstancedCount) {\n modelInitializationOptions.instances = geometry.maxInstancedCount;\n modelInitializationOptions.count = geometry.vertexCount || 3;\n }\n\n _context2.next = 22;\n return createModel(modelInitializationOptions);\n\n case 22:\n mesh.model = _context2.sent;\n this.modelCache[modelCacheKey] = mesh.model;\n\n case 24:\n case "end":\n return _context2.stop();\n }\n }\n }, _callee2, this);\n }));\n\n function initMesh(_x4, _x5) {\n return _initMesh.apply(this, arguments);\n }\n\n return initMesh;\n }()\n }, {\n key: "initView",\n value: function () {\n var _initView = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee3(view) {\n var scene, _iterator4, _step4, meshEntity;\n\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee3$(_context3) {\n while (1) {\n switch (_context3.prev = _context3.next) {\n case 0:\n scene = view.getScene();\n _iterator4 = _createForOfIteratorHelper(scene.getEntities());\n _context3.prev = 2;\n\n _iterator4.s();\n\n case 4:\n if ((_step4 = _iterator4.n()).done) {\n _context3.next = 10;\n break;\n }\n\n meshEntity = _step4.value;\n _context3.next = 8;\n return this.initMesh(meshEntity, view);\n\n case 8:\n _context3.next = 4;\n break;\n\n case 10:\n _context3.next = 15;\n break;\n\n case 12:\n _context3.prev = 12;\n _context3.t0 = _context3["catch"](2);\n\n _iterator4.e(_context3.t0);\n\n case 15:\n _context3.prev = 15;\n\n _iterator4.f();\n\n return _context3.finish(15);\n\n case 18:\n case "end":\n return _context3.stop();\n }\n }\n }, _callee3, this, [[2, 12, 15, 18]]);\n }));\n\n function initView(_x6) {\n return _initView.apply(this, arguments);\n }\n\n return initView;\n }()\n }]);\n\n return RenderPass;\n}(), _class3.IDENTIFIER = \'Render Pass\', _temp), (_descriptor = _babel_runtime_helpers_applyDecoratedDescriptor__WEBPACK_IMPORTED_MODULE_5___default()(_class2.prototype, "mesh", [_dec2], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n}), _descriptor2 = _babel_runtime_helpers_applyDecoratedDescriptor__WEBPACK_IMPORTED_MODULE_5___default()(_class2.prototype, "geometry", [_dec3], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n}), _descriptor3 = _babel_runtime_helpers_applyDecoratedDescriptor__WEBPACK_IMPORTED_MODULE_5___default()(_class2.prototype, "material", [_dec4], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n}), _descriptor4 = _babel_runtime_helpers_applyDecoratedDescriptor__WEBPACK_IMPORTED_MODULE_5___default()(_class2.prototype, "cullable", [_dec5], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n}), _descriptor5 = _babel_runtime_helpers_applyDecoratedDescriptor__WEBPACK_IMPORTED_MODULE_5___default()(_class2.prototype, "transform", [_dec6], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n}), _descriptor6 = _babel_runtime_helpers_applyDecoratedDescriptor__WEBPACK_IMPORTED_MODULE_5___default()(_class2.prototype, "hierarchy", [_dec7], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n}), _descriptor7 = _babel_runtime_helpers_applyDecoratedDescriptor__WEBPACK_IMPORTED_MODULE_5___default()(_class2.prototype, "frameGraphSystem", [_dec8, _dec9], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n}), _descriptor8 = _babel_runtime_helpers_applyDecoratedDescriptor__WEBPACK_IMPORTED_MODULE_5___default()(_class2.prototype, "engine", [_dec10], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n}), _descriptor9 = _babel_runtime_helpers_applyDecoratedDescriptor__WEBPACK_IMPORTED_MODULE_5___default()(_class2.prototype, "resourcePool", [_dec11], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n})), _class2)) || _class);\n//# sourceMappingURL=RenderPass.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy13ZWJncHUtY29yZS9lcy9jb21wb25lbnRzL3JlbmRlcmVyL3Bhc3Nlcy9SZW5kZXJQYXNzLmpzP2Y3ODEiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUE2RDtBQUNXO0FBQ2tCO0FBQ3RCO0FBQ047QUFDMEI7QUFDQTs7QUFFeEY7O0FBRUEsd0RBQXdELFFBQVEsbUVBQW1FLHdIQUF3SCxnQkFBZ0IsV0FBVyx5QkFBeUIsU0FBUyx3QkFBd0IsNEJBQTRCLGNBQWMsU0FBUyw4QkFBOEIsRUFBRSxxQkFBcUIsVUFBVSxFQUFFLFNBQVMsRUFBRSw4SkFBOEosRUFBRSxrREFBa0QsU0FBUyxrQkFBa0IsMkJBQTJCLEVBQUUsbUJBQW1CLHNCQUFzQiw4QkFBOEIsYUFBYSxFQUFFLHNCQUFzQixlQUFlLFdBQVcsRUFBRSxtQkFBbUIsTUFBTSx5REFBeUQsRUFBRSxVQUFVLHVCQUF1QixFQUFFLEVBQUUsR0FBRzs7QUFFNzlCLGlEQUFpRCxnQkFBZ0IsZ0VBQWdFLHdEQUF3RCw2REFBNkQsc0RBQXNELGtIQUFrSDs7QUFFOVosc0NBQXNDLHVEQUF1RCx1Q0FBdUMsU0FBUyxPQUFPLGtCQUFrQixFQUFFLGFBQWE7O0FBRXBKO0FBQ3FCO0FBQ0w7QUFDdEI7QUFDcEIseUJBQXlCLDREQUFVLFlBQVksd0RBQU0sQ0FBQyw4REFBVSxnQ0FBZ0Msd0RBQU0sQ0FBQyw4REFBVSxvQ0FBb0Msd0RBQU0sQ0FBQyw4REFBVSxvQ0FBb0Msd0RBQU0sQ0FBQyw4REFBVSxvQ0FBb0Msd0RBQU0sQ0FBQyw4REFBVSxxQ0FBcUMsd0RBQU0sQ0FBQyw4REFBVSxxQ0FBcUMsd0RBQU0sQ0FBQyw4REFBVSxtQkFBbUIsdURBQUssQ0FBQyw4REFB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QUFrQixzRkFBeUI7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLGtCQUFrQixzRkFBeUI7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLGtCQUFrQixzRkFBeUI7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLGtCQUFrQixzRkFBeUI7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLGtCQUFrQixzRkFBeUI7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QiLCJmaWxlIjoiNTEuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgX3JlZ2VuZXJhdG9yUnVudGltZSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvcmVnZW5lcmF0b3JcIjtcbmltcG9ydCBfYXN5bmNUb0dlbmVyYXRvciBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hc3luY1RvR2VuZXJhdG9yXCI7XG5pbXBvcnQgX2luaXRpYWxpemVyRGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW5pdGlhbGl6ZXJEZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzc1wiO1xuaW1wb3J0IF9hcHBseURlY29yYXRlZERlc2NyaXB0b3IgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXBwbHlEZWNvcmF0ZWREZXNjcmlwdG9yXCI7XG5pbXBvcnQgX2luaXRpYWxpemVyV2FybmluZ0hlbHBlciBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbml0aWFsaXplcldhcm5pbmdIZWxwZXJcIjtcblxudmFyIF9kZWMsIF9kZWMyLCBfZGVjMywgX2RlYzQsIF9kZWM1LCBfZGVjNiwgX2RlYzcsIF9kZWM4LCBfZGVjOSwgX2RlYzEwLCBfZGVjMTEsIF9jbGFzcywgX2NsYXNzMiwgX2Rlc2NyaXB0b3IsIF9kZXNjcmlwdG9yMiwgX2Rlc2NyaXB0b3IzLCBfZGVzY3JpcHRvcjQsIF9kZXNjcmlwdG9yNSwgX2Rlc2NyaXB0b3I2LCBfZGVzY3JpcHRvcjcsIF9kZXNjcmlwdG9yOCwgX2Rlc2NyaXB0b3I5LCBfY2xhc3MzLCBfdGVtcDtcblxuZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIobywgYWxsb3dBcnJheUxpa2UpIHsgdmFyIGl0OyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJ1bmRlZmluZWRcIiB8fCBvW1N5bWJvbC5pdGVyYXRvcl0gPT0gbnVsbCkgeyBpZiAoQXJyYXkuaXNBcnJheShvKSB8fCAoaXQgPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobykpIHx8IGFsbG93QXJyYXlMaWtlICYmIG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSB7IGlmIChpdCkgbyA9IGl0OyB2YXIgaSA9IDA7IHZhciBGID0gZnVuY3Rpb24gRigpIHt9OyByZXR1cm4geyBzOiBGLCBuOiBmdW5jdGlvbiBuKCkgeyBpZiAoaSA+PSBvLmxlbmd0aCkgcmV0dXJuIHsgZG9uZTogdHJ1ZSB9OyByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IG9baSsrXSB9OyB9LCBlOiBmdW5jdGlvbiBlKF9lKSB7IHRocm93IF9lOyB9LCBmOiBGIH07IH0gdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9IHZhciBub3JtYWxDb21wbGV0aW9uID0gdHJ1ZSwgZGlkRXJyID0gZmFsc2UsIGVycjsgcmV0dXJuIHsgczogZnVuY3Rpb24gcygpIHsgaXQgPSBvW1N5bWJvbC5pdGVyYXRvcl0oKTsgfSwgbjogZnVuY3Rpb24gbigpIHsgdmFyIHN0ZXAgPSBpdC5uZXh0KCk7IG5vcm1hbENvbXBsZXRpb24gPSBzdGVwLmRvbmU7IHJldHVybiBzdGVwOyB9LCBlOiBmdW5jdGlvbiBlKF9lMikgeyBkaWRFcnIgPSB0cnVlOyBlcnIgPSBfZTI7IH0sIGY6IGZ1bmN0aW9uIGYoKSB7IHRyeSB7IGlmICghbm9ybWFsQ29tcGxldGlvbiAmJiBpdC5yZXR1cm4gIT0gbnVsbCkgaXQucmV0dXJuKCk7IH0gZmluYWxseSB7IGlmIChkaWRFcnIpIHRocm93IGVycjsgfSB9IH07IH1cblxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB9XG5cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfVxuXG5pbXBvcnQgeyBtYXQ0IH0gZnJvbSAnZ2wtbWF0cml4JztcbmltcG9ydCB7IGluamVjdCwgaW5qZWN0YWJsZSwgbmFtZWQgfSBmcm9tICdpbnZlcnNpZnknO1xuaW1wb3J0IHsgSURFTlRJRklFUiB9IGZyb20gJy4uLy4uLy4uL2lkZW50aWZpZXInO1xuaW1wb3J0IHsgZ2wgfSBmcm9tICcuLi9nbCc7XG5leHBvcnQgdmFyIFJlbmRlclBhc3MgPSAoX2RlYyA9IGluamVjdGFibGUoKSwgX2RlYzIgPSBpbmplY3QoSURFTlRJRklFUi5NZXNoQ29tcG9uZW50TWFuYWdlciksIF9kZWMzID0gaW5qZWN0KElERU5USUZJRVIuR2VvbWV0cnlDb21wb25lbnRNYW5hZ2VyKSwgX2RlYzQgPSBpbmplY3QoSURFTlRJRklFUi5NYXRlcmlhbENvbXBvbmVudE1hbmFnZXIpLCBfZGVjNSA9IGluamVjdChJREVOVElGSUVSLkN1bGxhYmxlQ29tcG9uZW50TWFuYWdlciksIF9kZWM2ID0gaW5qZWN0KElERU5USUZJRVIuVHJhbnNmb3JtQ29tcG9uZW50TWFuYWdlciksIF9kZWM3ID0gaW5qZWN0KElERU5USUZJRVIuSGllcmFyY2h5Q29tcG9uZW50TWFuYWdlciksIF9kZWM4ID0gaW5qZWN0KElERU5USUZJRVIuU3lzdGVtcyksIF9kZWM5ID0gbmFtZWQoSURFTlRJRklFUi5GcmFtZUdyYXBoU3lzdGVtKSwgX2RlYzEwID0gaW5qZWN0KElERU5USUZJRVIuUmVuZGVyRW5naW5lKSwgX2RlYzExID0gaW5qZWN0KElERU5USUZJRVIuUmVzb3VyY2VQb29sKSwgX2RlYyhfY2xhc3MgPSAoX2NsYXNzMiA9IChfdGVtcCA9IF9jbGFzczMgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBSZW5kZXJQYXNzKCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUmVuZGVyUGFzcyk7XG5cbiAgICBfaW5pdGlhbGl6ZXJEZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIm1lc2hcIiwgX2Rlc2NyaXB0b3IsIHRoaXMpO1xuXG4gICAgX2luaXRpYWxpemVyRGVmaW5lUHJvcGVydHkodGhpcywgXCJnZW9tZXRyeVwiLCBfZGVzY3JpcHRvcjIsIHRoaXMpO1xuXG4gICAgX2luaXRpYWxpemVyRGVmaW5lUHJvcGVydHkodGhpcywgXCJtYXRlcmlhbFwiLCBfZGVzY3JpcHRvcjMsIHRoaXMpO1xuXG4gICAgX2luaXRpYWxpemVyRGVmaW5lUHJvcGVydHkodGhpcywgXCJjdWxsYWJsZVwiLCBfZGVzY3JpcHRvcjQsIHRoaXMpO1xuXG4gICAgX2luaXRpYWxpemVyRGVmaW5lUHJvcGVydHkodGhpcywgXCJ0cmFuc2Zvcm1cIiwgX2Rlc2NyaXB0b3I1LCB0aGlzKTtcblxuICAgIF9pbml0aWFsaXplckRlZmluZVByb3BlcnR5KHRoaXMsIFwiaGllcmFyY2h5XCIsIF9kZXNjcmlwdG9yNiwgdGhpcyk7XG5cbiAgICBfaW5pdGlhbGl6ZXJEZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImZyYW1lR3JhcGhTeXN0ZW1cIiwgX2Rlc2NyaXB0b3I3LCB0aGlzKTtcblxuICAgIF9pbml0aWFsaXplckRlZmluZVByb3BlcnR5KHRoaXMsIFwiZW5naW5lXCIsIF9kZXNjcmlwdG9yOCwgdGhpcyk7XG5cbiAgICBfaW5pdGlhbGl6ZXJEZWZpbmVQcm9wZXJ0eSh0aGlzLCBcInJlc291cmNlUG9vbFwiLCBfZGVzY3JpcHRvcjksIHRoaXMpO1xuXG4gICAgdGhpcy5tb2RlbENhY2hlID0ge307XG5cbiAgICB0aGlzLnNldHVwID0gZnVuY3Rpb24gKGZnLCBwYXNzTm9kZSwgcGFzcykge1xuICAgICAgdmFyIG91dHB1dCA9IGZnLmNyZWF0ZVJlbmRlclRhcmdldChwYXNzTm9kZSwgJ2NvbG9yIGJ1ZmZlcicsIHtcbiAgICAgICAgd2lkdGg6IDEsXG4gICAgICAgIGhlaWdodDogMSxcbiAgICAgICAgdXNhZ2U6IGdsLlJFTkRFUl9BVFRBQ0hNRU5UIHwgZ2wuU0FNUExFRCB8IGdsLkNPUFlfU1JDXG4gICAgICB9KTtcbiAgICAgIHBhc3MuZGF0YSA9IHtcbiAgICAgICAgb3V0cHV0OiBwYXNzTm9kZS53cml0ZShmZywgb3V0cHV0KVxuICAgICAgfTtcbiAgICB9O1xuXG4gICAgdGhpcy5leGVjdXRlID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfcmVmID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoZnVuY3Rpb24gX2NhbGxlZShmZywgcGFzcywgdmlld3MpIHtcbiAgICAgICAgdmFyIHJlc291cmNlTm9kZSwgZnJhbWVidWZmZXIsIF9pdGVyYXRvciwgX3N0ZXAsIHZpZXcsIGNhbnZhcztcblxuICAgICAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7XG4gICAgICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHtcbiAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgIHJlc291cmNlTm9kZSA9IGZnLmdldFJlc291cmNlTm9kZShwYXNzLmRhdGEub3V0cHV0KTtcbiAgICAgICAgICAgICAgICBmcmFtZWJ1ZmZlciA9IF90aGlzLnJlc291cmNlUG9vbC5nZXRPckNyZWF0ZVJlc291cmNlKHJlc291cmNlTm9kZS5yZXNvdXJjZSk7IC8vIGluaXRpYWxpemUgbW9kZWwgb2YgZWFjaCBtZXNoXG5cbiAgICAgICAgICAgICAgICBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcih2aWV3cyk7XG4gICAgICAgICAgICAgICAgX2NvbnRleHQucHJldiA9IDM7XG5cbiAgICAgICAgICAgICAgICBfaXRlcmF0b3IucygpO1xuXG4gICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICBpZiAoKF9zdGVwID0gX2l0ZXJhdG9yLm4oKSkuZG9uZSkge1xuICAgICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDExO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdmlldyA9IF9zdGVwLnZhbHVlO1xuICAgICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA5O1xuICAgICAgICAgICAgICAgIHJldHVybiBfdGhpcy5pbml0Vmlldyh2aWV3KTtcblxuICAgICAgICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgY2FzZSAxMTpcbiAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTY7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgY2FzZSAxMzpcbiAgICAgICAgICAgICAgICBfY29udGV4dC5wcmV2ID0gMTM7XG4gICAgICAgICAgICAgICAgX2NvbnRleHQudDAgPSBfY29udGV4dFtcImNhdGNoXCJdKDMpO1xuXG4gICAgICAgICAgICAgICAgX2l0ZXJhdG9yLmUoX2NvbnRleHQudDApO1xuXG4gICAgICAgICAgICAgIGNhc2UgMTY6XG4gICAgICAgICAgICAgICAgX2NvbnRleHQucHJldiA9IDE2O1xuXG4gICAgICAgICAgICAgICAgX2l0ZXJhdG9yLmYoKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5maW5pc2goMTYpO1xuXG4gICAgICAgICAgICAgIGNhc2UgMTk6XG4gICAgICAgICAgICAgICAgY2FudmFzID0gX3RoaXMuZW5naW5lLmdldENhbnZhcygpO1xuICAgICAgICAgICAgICAgIGZyYW1lYnVmZmVyLnJlc2l6ZSh7XG4gICAgICAgICAgICAgICAgICB3aWR0aDogY2FudmFzLndpZHRoLFxuICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBjYW52YXMuaGVpZ2h0XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBfdGhpcy5lbmdpbmUuc2V0U2Npc3Nvcih7XG4gICAgICAgICAgICAgICAgICBlbmFibGU6IGZhbHNlXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBfdGhpcy5lbmdpbmUuY2xlYXIoe1xuICAgICAgICAgICAgICAgICAgZnJhbWVidWZmZXI6IGZyYW1lYnVmZmVyLFxuICAgICAgICAgICAgICAgICAgY29sb3I6IHZpZXdzWzBdLmdldENsZWFyQ29sb3IoKSxcbiAgICAgICAgICAgICAgICAgIC8vIFRPRE86IHVzZSBjbGVhckNvbG9yIGRlZmluZWQgaW4gdmlld1xuICAgICAgICAgICAgICAgICAgZGVwdGg6IDFcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIF90aGlzLmVuZ2luZS51c2VGcmFtZWJ1ZmZlcihmcmFtZWJ1ZmZlciwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgdmFyIF9pdGVyYXRvcjIgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcih2aWV3cyksXG4gICAgICAgICAgICAgICAgICAgICAgX3N0ZXAyO1xuXG4gICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKF9pdGVyYXRvcjIucygpOyAhKF9zdGVwMiA9IF9pdGVyYXRvcjIubigpKS5kb25lOykge1xuICAgICAgICAgICAgICAgICAgICAgIHZhciB2aWV3ID0gX3N0ZXAyLnZhbHVlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gbXVzdCBkbyByZW5kZXJpbmcgaW4gYSBzeW5jIHdheVxuICAgICAgICAgICAgICAgICAgICAgIF90aGlzLnJlbmRlclZpZXcodmlldyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICBfaXRlcmF0b3IyLmUoZXJyKTtcbiAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgIF9pdGVyYXRvcjIuZigpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgIGNhc2UgMjQ6XG4gICAgICAgICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSwgX2NhbGxlZSwgbnVsbCwgW1szLCAxMywgMTYsIDE5XV0pO1xuICAgICAgfSkpO1xuXG4gICAgICByZXR1cm4gZnVuY3Rpb24gKF94LCBfeDIsIF94Mykge1xuICAgICAgICByZXR1cm4gX3JlZi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfTtcbiAgICB9KCk7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoUmVuZGVyUGFzcywgW3tcbiAgICBrZXk6IFwicmVuZGVyVmlld1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXJWaWV3KHZpZXcpIHtcbiAgICAgIHZhciBzY2VuZSA9IHZpZXcuZ2V0U2NlbmUoKTtcbiAgICAgIHZhciBjYW1lcmEgPSB2aWV3LmdldENhbWVyYSgpOyAvLyBnZXQgVlAgbWF0cml4IGZyb20gY2FtZXJhXG5cbiAgICAgIHZhciB2aWV3TWF0cml4ID0gY2FtZXJhLmdldFZpZXdUcmFuc2Zvcm0oKTtcbiAgICAgIHZhciB2aWV3UHJvamVjdGlvbk1hdHJpeCA9IG1hdDQubXVsdGlwbHkobWF0NC5jcmVhdGUoKSwgY2FtZXJhLmdldFBlcnNwZWN0aXZlKCksIHZpZXdNYXRyaXgpOyAvLyBUT0RPOiB1c2UgY2FjaGVkIHBsYW5lcyBpZiBjYW1lcmEgd2FzIG5vdCBjaGFuZ2VkXG5cbiAgICAgIGNhbWVyYS5nZXRGcnVzdHVtKCkuZXh0cmFjdEZyb21WUE1hdHJpeCh2aWV3UHJvamVjdGlvbk1hdHJpeCk7XG5cbiAgICAgIHZhciBfdmlldyRnZXRWaWV3cG9ydCA9IHZpZXcuZ2V0Vmlld3BvcnQoKSxcbiAgICAgICAgICB4ID0gX3ZpZXckZ2V0Vmlld3BvcnQueCxcbiAgICAgICAgICB5ID0gX3ZpZXckZ2V0Vmlld3BvcnQueSxcbiAgICAgICAgICB3aWR0aCA9IF92aWV3JGdldFZpZXdwb3J0LndpZHRoLFxuICAgICAgICAgIGhlaWdodCA9IF92aWV3JGdldFZpZXdwb3J0LmhlaWdodDtcblxuICAgICAgdGhpcy5lbmdpbmUudmlld3BvcnQoe1xuICAgICAgICB4OiB4LFxuICAgICAgICB5OiB5LFxuICAgICAgICB3aWR0aDogd2lkdGgsXG4gICAgICAgIGhlaWdodDogaGVpZ2h0XG4gICAgICB9KTsgLy8gdGhpcy5lbmdpbmUuc2V0U2Npc3Nvcih7XG4gICAgICAvLyAgIGVuYWJsZTogdHJ1ZSxcbiAgICAgIC8vICAgYm94OiB7IHgsIHksIHdpZHRoLCBoZWlnaHQgfSxcbiAgICAgIC8vIH0pO1xuICAgICAgLy8gdGhpcy5lbmdpbmUuY2xlYXIoe1xuICAgICAgLy8gICAvLyBmcmFtZWJ1ZmZlcixcbiAgICAgIC8vICAgY29sb3I6IFsxLCAxLCAxLCAxXSwgLy8gVE9ETzogdXNlIGNsZWFyQ29sb3IgZGVmaW5lZCBpbiB2aWV3XG4gICAgICAvLyAgIGRlcHRoOiAxLFxuICAgICAgLy8gfSk7XG5cbiAgICAgIHZhciBfaXRlcmF0b3IzID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoc2NlbmUuZ2V0RW50aXRpZXMoKSksXG4gICAgICAgICAgX3N0ZXAzO1xuXG4gICAgICB0cnkge1xuICAgICAgICBmb3IgKF9pdGVyYXRvcjMucygpOyAhKF9zdGVwMyA9IF9pdGVyYXRvcjMubigpKS5kb25lOykge1xuICAgICAgICAgIHZhciBtZXNoRW50aXR5ID0gX3N0ZXAzLnZhbHVlO1xuICAgICAgICAgIHRoaXMucmVuZGVyTWVzaChtZXNoRW50aXR5LCB7XG4gICAgICAgICAgICBjYW1lcmE6IGNhbWVyYSxcbiAgICAgICAgICAgIHZpZXc6IHZpZXcsXG4gICAgICAgICAgICB2aWV3TWF0cml4OiB2aWV3TWF0cml4XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBfaXRlcmF0b3IzLmUoZXJyKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIF9pdGVyYXRvcjMuZigpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJNZXNoXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlck1lc2gobWVzaEVudGl0eSwgX3JlZjIpIHtcbiAgICAgIHZhciBjYW1lcmEgPSBfcmVmMi5jYW1lcmEsXG4gICAgICAgICAgdmlldyA9IF9yZWYyLnZpZXcsXG4gICAgICAgICAgdmlld01hdHJpeCA9IF9yZWYyLnZpZXdNYXRyaXg7XG4gICAgICB2YXIgbWVzaCA9IHRoaXMubWVzaC5nZXRDb21wb25lbnRCeUVudGl0eShtZXNoRW50aXR5KTtcblxuICAgICAgaWYgKCFtZXNoIHx8ICFtZXNoLnZpc2libGUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSAvLyBmaWx0ZXIgbWVzaGVzIHdpdGggZnJ1c3R1bSBjdWxsaW5nXG4gICAgICAvLyBpZiAoIXRoaXMuY3VsbGFibGUuZ2V0Q29tcG9uZW50QnlFbnRpdHkobWVzaEVudGl0eSk/LnZpc2libGUpIHtcbiAgICAgIC8vICAgcmV0dXJuO1xuICAgICAgLy8gfVxuXG5cbiAgICAgIHZhciBtYXRlcmlhbCA9IG1lc2gubWF0ZXJpYWw7XG4gICAgICB2YXIgZ2VvbWV0cnkgPSBtZXNoLmdlb21ldHJ5OyAvLyBnZW9tZXRyeSDlnKjoh6rlt7HnmoQgU3lzdGVtIOS4reWujOaIkOiEj+ajgOafpeWQjueahOabtOaWsFxuXG4gICAgICBpZiAoIWdlb21ldHJ5IHx8IGdlb21ldHJ5LmRpcnR5IHx8ICFtYXRlcmlhbCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9IC8vIGdldCBtb2RlbCBtYXRyaXggZnJvbSBtZXNoXG5cblxuICAgICAgdmFyIHRyYW5zZm9ybSA9IHRoaXMudHJhbnNmb3JtLmdldENvbXBvbmVudEJ5RW50aXR5KG1lc2hFbnRpdHkpO1xuICAgICAgdmFyIG1vZGVsVmlld01hdHJpeCA9IG1hdDQubXVsdGlwbHkobWF0NC5jcmVhdGUoKSwgdmlld01hdHJpeCwgdHJhbnNmb3JtLndvcmxkVHJhbnNmb3JtKTtcblxuICAgICAgdmFyIF92aWV3JGdldFZpZXdwb3J0MiA9IHZpZXcuZ2V0Vmlld3BvcnQoKSxcbiAgICAgICAgICB3aWR0aCA9IF92aWV3JGdldFZpZXdwb3J0Mi53aWR0aCxcbiAgICAgICAgICBoZWlnaHQgPSBfdmlldyRnZXRWaWV3cG9ydDIuaGVpZ2h0OyAvLyBzZXQgTVZQIG1hdHJpeCwgb3RoZXIgYnVpbHRpbiB1bmlmb3JtcyBAc2VlIGh0dHBzOi8vdGhyZWVqcy5vcmcvZG9jcy8jYXBpL2VuL3JlbmRlcmVycy93ZWJnbC9XZWJHTFByb2dyYW1cblxuXG4gICAgICBtYXRlcmlhbC5zZXRVbmlmb3JtKHtcbiAgICAgICAgcHJvamVjdGlvbk1hdHJpeDogY2FtZXJhLmdldFBlcnNwZWN0aXZlKCksXG4gICAgICAgIG1vZGVsVmlld01hdHJpeDogbW9kZWxWaWV3TWF0cml4LFxuICAgICAgICBtb2RlbE1hdHJpeDogdHJhbnNmb3JtLndvcmxkVHJhbnNmb3JtLFxuICAgICAgICB2aWV3TWF0cml4OiB2aWV3TWF0cml4LFxuICAgICAgICBjYW1lcmFQb3NpdGlvbjogY2FtZXJhLmdldFBvc2l0aW9uKCksXG4gICAgICAgIHVfdmlld3BvcnQ6IFt3aWR0aCwgaGVpZ2h0XVxuICAgICAgfSk7XG5cbiAgICAgIGlmIChtZXNoLm1vZGVsKSB7XG4gICAgICAgIG1lc2gubW9kZWwuZHJhdyh7XG4gICAgICAgICAgdW5pZm9ybXM6IG1hdGVyaWFsLnVuaWZvcm1zLnJlZHVjZShmdW5jdGlvbiAoY3VyLCBwcmV2KSB7XG4gICAgICAgICAgICBjdXJbcHJldi5uYW1lXSA9IHByZXYuZGF0YTtcbiAgICAgICAgICAgIHJldHVybiBjdXI7XG4gICAgICAgICAgfSwge30pXG4gICAgICAgIH0pO1xuICAgICAgICBtYXRlcmlhbC51bmlmb3Jtcy5mb3JFYWNoKGZ1bmN0aW9uICh1KSB7XG4gICAgICAgICAgdS5kaXJ0eSA9IGZhbHNlO1xuICAgICAgICB9KTtcbiAgICAgICAgbWF0ZXJpYWwuZGlydHkgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaW5pdE1lc2hcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF9pbml0TWVzaCA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUyKG1lc2hFbnRpdHksIHZpZXcpIHtcbiAgICAgICAgdmFyIG1lc2gsIG1hdGVyaWFsLCBnZW9tZXRyeSwgbW9kZWxDYWNoZUtleSwgX3RoaXMkZW5naW5lLCBjcmVhdGVNb2RlbCwgY3JlYXRlQXR0cmlidXRlLCBtb2RlbEluaXRpYWxpemF0aW9uT3B0aW9ucztcblxuICAgICAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUyJChfY29udGV4dDIpIHtcbiAgICAgICAgICB3aGlsZSAoMSkge1xuICAgICAgICAgICAgc3dpdGNoIChfY29udGV4dDIucHJldiA9IF9jb250ZXh0Mi5uZXh0KSB7XG4gICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICBtZXNoID0gdGhpcy5tZXNoLmdldENvbXBvbmVudEJ5RW50aXR5KG1lc2hFbnRpdHkpO1xuXG4gICAgICAgICAgICAgICAgaWYgKG1lc2gpIHtcbiAgICAgICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMztcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIuYWJydXB0KFwicmV0dXJuXCIpO1xuXG4gICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICBtYXRlcmlhbCA9IG1lc2gubWF0ZXJpYWw7XG4gICAgICAgICAgICAgICAgZ2VvbWV0cnkgPSBtZXNoLmdlb21ldHJ5O1xuXG4gICAgICAgICAgICAgICAgaWYgKCEoIWdlb21ldHJ5IHx8IGdlb21ldHJ5LmRpcnR5IHx8ICFtYXRlcmlhbCkpIHtcbiAgICAgICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gNztcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIuYWJydXB0KFwicmV0dXJuXCIpO1xuXG4gICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICBpZiAobWVzaC5tb2RlbCkge1xuICAgICAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAyNDtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIG1vZGVsQ2FjaGVLZXkgPSBcIm0tXCIuY29uY2F0KG1hdGVyaWFsLmVudGl0eSwgXCItZy1cIikuY29uY2F0KGdlb21ldHJ5LmVudGl0eSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMubW9kZWxDYWNoZVttb2RlbENhY2hlS2V5XSkge1xuICAgICAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAxMjtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIG1lc2gubW9kZWwgPSB0aGlzLm1vZGVsQ2FjaGVbbW9kZWxDYWNoZUtleV07XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5hYnJ1cHQoXCJyZXR1cm5cIik7XG5cbiAgICAgICAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICAgICAgICBtYXRlcmlhbC5zZXRVbmlmb3JtKHtcbiAgICAgICAgICAgICAgICAgIHByb2plY3Rpb25NYXRyaXg6IDEsXG4gICAgICAgICAgICAgICAgICBtb2RlbFZpZXdNYXRyaXg6IDEsXG4gICAgICAgICAgICAgICAgICBtb2RlbE1hdHJpeDogMSxcbiAgICAgICAgICAgICAgICAgIHZpZXdNYXRyaXg6IDEsXG4gICAgICAgICAgICAgICAgICBjYW1lcmFQb3NpdGlvbjogMSxcbiAgICAgICAgICAgICAgICAgIHVfdmlld3BvcnQ6IDFcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBfdGhpcyRlbmdpbmUgPSB0aGlzLmVuZ2luZSwgY3JlYXRlTW9kZWwgPSBfdGhpcyRlbmdpbmUuY3JlYXRlTW9kZWwsIGNyZWF0ZUF0dHJpYnV0ZSA9IF90aGlzJGVuZ2luZS5jcmVhdGVBdHRyaWJ1dGU7XG4gICAgICAgICAgICAgICAgbW9kZWxJbml0aWFsaXphdGlvbk9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgICB2czogbWF0ZXJpYWwudmVydGV4U2hhZGVyR0xTTCxcbiAgICAgICAgICAgICAgICAgIGZzOiBtYXRlcmlhbC5mcmFnbWVudFNoYWRlckdMU0wsXG4gICAgICAgICAgICAgICAgICBkZWZpbmVzOiBtYXRlcmlhbC5kZWZpbmVzLFxuICAgICAgICAgICAgICAgICAgYXR0cmlidXRlczogZ2VvbWV0cnkuYXR0cmlidXRlcy5yZWR1Y2UoZnVuY3Rpb24gKGN1ciwgcHJldikge1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJldi5kYXRhICYmIHByZXYuYnVmZmVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgY3VyW3ByZXYubmFtZV0gPSBjcmVhdGVBdHRyaWJ1dGUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyOiBwcmV2LmJ1ZmZlcixcbiAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHByZXYuYXR0cmlidXRlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5U3RyaWRlOiBwcmV2LmFycmF5U3RyaWRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RlcE1vZGU6IHByZXYuc3RlcE1vZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXZpc29yOiBwcmV2LnN0ZXBNb2RlID09PSAndmVydGV4JyA/IDAgOiAxXG4gICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3VyO1xuICAgICAgICAgICAgICAgICAgfSwge30pLFxuICAgICAgICAgICAgICAgICAgdW5pZm9ybXM6IG1hdGVyaWFsLnVuaWZvcm1zLnJlZHVjZShmdW5jdGlvbiAoY3VyLCBwcmV2KSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cltwcmV2Lm5hbWVdID0gcHJldi5kYXRhO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3VyO1xuICAgICAgICAgICAgICAgICAgfSwge30pLFxuICAgICAgICAgICAgICAgICAgc2Npc3Nvcjoge1xuICAgICAgICAgICAgICAgICAgICBlbmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgYm94OiBmdW5jdGlvbiBib3goKSB7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZpZXcuZ2V0Vmlld3BvcnQoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBpZiAobWF0ZXJpYWwuY3VsbCkge1xuICAgICAgICAgICAgICAgICAgbW9kZWxJbml0aWFsaXphdGlvbk9wdGlvbnMuY3VsbCA9IG1hdGVyaWFsLmN1bGw7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKG1hdGVyaWFsLmRlcHRoKSB7XG4gICAgICAgICAgICAgICAgICBtb2RlbEluaXRpYWxpemF0aW9uT3B0aW9ucy5kZXB0aCA9IG1hdGVyaWFsLmRlcHRoO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChtYXRlcmlhbC5ibGVuZCkge1xuICAgICAgICAgICAgICAgICAgbW9kZWxJbml0aWFsaXphdGlvbk9wdGlvbnMuYmxlbmQgPSBtYXRlcmlhbC5ibGVuZDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoZ2VvbWV0cnkuaW5kaWNlc0J1ZmZlcikge1xuICAgICAgICAgICAgICAgICAgbW9kZWxJbml0aWFsaXphdGlvbk9wdGlvbnMuZWxlbWVudHMgPSBnZW9tZXRyeS5pbmRpY2VzQnVmZmVyO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChnZW9tZXRyeS5tYXhJbnN0YW5jZWRDb3VudCkge1xuICAgICAgICAgICAgICAgICAgbW9kZWxJbml0aWFsaXphdGlvbk9wdGlvbnMuaW5zdGFuY2VzID0gZ2VvbWV0cnkubWF4SW5zdGFuY2VkQ291bnQ7XG4gICAgICAgICAgICAgICAgICBtb2RlbEluaXRpYWxpemF0aW9uT3B0aW9ucy5jb3VudCA9IGdlb21ldHJ5LnZlcnRleENvdW50IHx8IDM7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAyMjtcbiAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlTW9kZWwobW9kZWxJbml0aWFsaXphdGlvbk9wdGlvbnMpO1xuXG4gICAgICAgICAgICAgIGNhc2UgMjI6XG4gICAgICAgICAgICAgICAgbWVzaC5tb2RlbCA9IF9jb250ZXh0Mi5zZW50O1xuICAgICAgICAgICAgICAgIHRoaXMubW9kZWxDYWNoZVttb2RlbENhY2hlS2V5XSA9IG1lc2gubW9kZWw7XG5cbiAgICAgICAgICAgICAgY2FzZSAyNDpcbiAgICAgICAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIuc3RvcCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSwgX2NhbGxlZTIsIHRoaXMpO1xuICAgICAgfSkpO1xuXG4gICAgICBmdW5jdGlvbiBpbml0TWVzaChfeDQsIF94NSkge1xuICAgICAgICByZXR1cm4gX2luaXRNZXNoLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBpbml0TWVzaDtcbiAgICB9KClcbiAgfSwge1xuICAgIGtleTogXCJpbml0Vmlld1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX2luaXRWaWV3ID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTModmlldykge1xuICAgICAgICB2YXIgc2NlbmUsIF9pdGVyYXRvcjQsIF9zdGVwNCwgbWVzaEVudGl0eTtcblxuICAgICAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUzJChfY29udGV4dDMpIHtcbiAgICAgICAgICB3aGlsZSAoMSkge1xuICAgICAgICAgICAgc3dpdGNoIChfY29udGV4dDMucHJldiA9IF9jb250ZXh0My5uZXh0KSB7XG4gICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICBzY2VuZSA9IHZpZXcuZ2V0U2NlbmUoKTtcbiAgICAgICAgICAgICAgICBfaXRlcmF0b3I0ID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoc2NlbmUuZ2V0RW50aXRpZXMoKSk7XG4gICAgICAgICAgICAgICAgX2NvbnRleHQzLnByZXYgPSAyO1xuXG4gICAgICAgICAgICAgICAgX2l0ZXJhdG9yNC5zKCk7XG5cbiAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgIGlmICgoX3N0ZXA0ID0gX2l0ZXJhdG9yNC5uKCkpLmRvbmUpIHtcbiAgICAgICAgICAgICAgICAgIF9jb250ZXh0My5uZXh0ID0gMTA7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBtZXNoRW50aXR5ID0gX3N0ZXA0LnZhbHVlO1xuICAgICAgICAgICAgICAgIF9jb250ZXh0My5uZXh0ID0gODtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pbml0TWVzaChtZXNoRW50aXR5LCB2aWV3KTtcblxuICAgICAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICAgICAgX2NvbnRleHQzLm5leHQgPSA0O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgICAgICAgX2NvbnRleHQzLm5leHQgPSAxNTtcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICBjYXNlIDEyOlxuICAgICAgICAgICAgICAgIF9jb250ZXh0My5wcmV2ID0gMTI7XG4gICAgICAgICAgICAgICAgX2NvbnRleHQzLnQwID0gX2NvbnRleHQzW1wiY2F0Y2hcIl0oMik7XG5cbiAgICAgICAgICAgICAgICBfaXRlcmF0b3I0LmUoX2NvbnRleHQzLnQwKTtcblxuICAgICAgICAgICAgICBjYXNlIDE1OlxuICAgICAgICAgICAgICAgIF9jb250ZXh0My5wcmV2ID0gMTU7XG5cbiAgICAgICAgICAgICAgICBfaXRlcmF0b3I0LmYoKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDMuZmluaXNoKDE1KTtcblxuICAgICAgICAgICAgICBjYXNlIDE4OlxuICAgICAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0My5zdG9wKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LCBfY2FsbGVlMywgdGhpcywgW1syLCAxMiwgMTUsIDE4XV0pO1xuICAgICAgfSkpO1xuXG4gICAgICBmdW5jdGlvbiBpbml0VmlldyhfeDYpIHtcbiAgICAgICAgcmV0dXJuIF9pbml0Vmlldy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gaW5pdFZpZXc7XG4gICAgfSgpXG4gIH1dKTtcblxuICByZXR1cm4gUmVuZGVyUGFzcztcbn0oKSwgX2NsYXNzMy5JREVOVElGSUVSID0gJ1JlbmRlciBQYXNzJywgX3RlbXApLCAoX2Rlc2NyaXB0b3IgPSBfYXBwbHlEZWNvcmF0ZWREZXNjcmlwdG9yKF9jbGFzczIucHJvdG90eXBlLCBcIm1lc2hcIiwgW19kZWMyXSwge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHdyaXRhYmxlOiB0cnVlLFxuICBpbml0aWFsaXplcjogbnVsbFxufSksIF9kZXNjcmlwdG9yMiA9IF9hcHBseURlY29yYXRlZERlc2NyaXB0b3IoX2NsYXNzMi5wcm90b3R5cGUsIFwiZ2VvbWV0cnlcIiwgW19kZWMzXSwge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHdyaXRhYmxlOiB0cnVlLFxuICBpbml0aWFsaXplcjogbnVsbFxufSksIF9kZXNjcmlwdG9yMyA9IF9hcHBseURlY29yYXRlZERlc2NyaXB0b3IoX2NsYXNzMi5wcm90b3R5cGUsIFwibWF0ZXJpYWxcIiwgW19kZWM0XSwge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHdyaXRhYmxlOiB0cnVlLFxuICBpbml0aWFsaXplcjogbnVsbFxufSksIF9kZXNjcmlwdG9yNCA9IF9hcHBseURlY29yYXRlZERlc2NyaXB0b3IoX2NsYXNzMi5wcm90b3R5cGUsIFwiY3VsbGFibGVcIiwgW19kZWM1XSwge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHdyaXRhYmxlOiB0cnVlLFxuICBpbml0aWFsaXplcjogbnVsbFxufSksIF9kZXNjcmlwdG9yNSA9IF9hcHBseURlY29yYXRlZERlc2NyaXB0b3IoX2NsYXNzMi5wcm90b3R5cGUsIFwidHJhbnNmb3JtXCIsIFtfZGVjNl0sIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICB3cml0YWJsZTogdHJ1ZSxcbiAgaW5pdGlhbGl6ZXI6IG51bGxcbn0pLCBfZGVzY3JpcHRvcjYgPSBfYXBwbHlEZWNvcmF0ZWREZXNjcmlwdG9yKF9jbGFzczIucHJvdG90eXBlLCBcImhpZXJhcmNoeVwiLCBbX2RlYzddLCB7XG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgd3JpdGFibGU6IHRydWUsXG4gIGluaXRpYWxpemVyOiBudWxsXG59KSwgX2Rlc2NyaXB0b3I3ID0gX2FwcGx5RGVjb3JhdGVkRGVzY3JpcHRvcihfY2xhc3MyLnByb3RvdHlwZSwgXCJmcmFtZUdyYXBoU3lzdGVtXCIsIFtfZGVjOCwgX2RlYzldLCB7XG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgd3JpdGFibGU6IHRydWUsXG4gIGluaXRpYWxpemVyOiBudWxsXG59KSwgX2Rlc2NyaXB0b3I4ID0gX2FwcGx5RGVjb3JhdGVkRGVzY3JpcHRvcihfY2xhc3MyLnByb3RvdHlwZSwgXCJlbmdpbmVcIiwgW19kZWMxMF0sIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICB3cml0YWJsZTogdHJ1ZSxcbiAgaW5pdGlhbGl6ZXI6IG51bGxcbn0pLCBfZGVzY3JpcHRvcjkgPSBfYXBwbHlEZWNvcmF0ZWREZXNjcmlwdG9yKF9jbGFzczIucHJvdG90eXBlLCBcInJlc291cmNlUG9vbFwiLCBbX2RlYzExXSwge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHdyaXRhYmxlOiB0cnVlLFxuICBpbml0aWFsaXplcjogbnVsbFxufSkpLCBfY2xhc3MyKSkgfHwgX2NsYXNzKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJlbmRlclBhc3MuanMubWFwIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///51\n')},function(module,__webpack_exports__,__webpack_require__){"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"catmullRomToBezier\", function() { return catmullRomToBezier; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"fillPath\", function() { return fillPath; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"fillPathByDiff\", function() { return fillPathByDiff; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"formatPath\", function() { return formatPath; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"intersection\", function() { return intersection; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"parsePathArray\", function() { return parsePathArray; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"parsePathString\", function() { return parsePathString; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"pathToAbsolute\", function() { return pathToAbsolute; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"pathToCurve\", function() { return pathToCurve; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"rectPath\", function() { return rectPath; });\n/* harmony import */ var _antv_util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(0);\n\nvar SPACES = '\\x09\\x0a\\x0b\\x0c\\x0d\\x20\\xa0\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\u2028\\u2029';\nvar PATH_COMMAND = new RegExp(\"([a-z])[\" + SPACES + \",]*((-?\\\\d*\\\\.?\\\\d*(?:e[\\\\-+]?\\\\d+)?[\" + SPACES + \"]*,?[\" + SPACES + \"]*)+)\", 'ig');\nvar PATH_VALUES = new RegExp(\"(-?\\\\d*\\\\.?\\\\d*(?:e[\\\\-+]?\\\\d+)?)[\" + SPACES + \"]*,?[\" + SPACES + \"]*\", 'ig');\n// Parse given path string into an array of arrays of path segments\nvar parsePathString = function (pathString) {\n if (!pathString) {\n return null;\n }\n if (Object(_antv_util__WEBPACK_IMPORTED_MODULE_0__[\"isArray\"])(pathString)) {\n return pathString;\n }\n var paramCounts = {\n a: 7,\n c: 6,\n o: 2,\n h: 1,\n l: 2,\n m: 2,\n r: 4,\n q: 4,\n s: 4,\n t: 2,\n v: 1,\n u: 3,\n z: 0,\n };\n var data = [];\n String(pathString).replace(PATH_COMMAND, function (a, b, c) {\n var params = [];\n var name = b.toLowerCase();\n c.replace(PATH_VALUES, function (a, b) {\n b && params.push(+b);\n });\n if (name === 'm' && params.length > 2) {\n data.push([b].concat(params.splice(0, 2)));\n name = 'l';\n b = b === 'm' ? 'l' : 'L';\n }\n if (name === 'o' && params.length === 1) {\n data.push([b, params[0]]);\n }\n if (name === 'r') {\n data.push([b].concat(params));\n }\n else {\n while (params.length >= paramCounts[name]) {\n data.push([b].concat(params.splice(0, paramCounts[name])));\n if (!paramCounts[name]) {\n break;\n }\n }\n }\n return pathString;\n });\n return data;\n};\n// http://schepers.cc/getting-to-the-point\nvar catmullRomToBezier = function (crp, z) {\n var d = [];\n // @ts-ignore\n for (var i = 0, iLen = crp.length; iLen - 2 * !z > i; i += 2) {\n var p = [\n {\n x: +crp[i - 2],\n y: +crp[i - 1],\n },\n {\n x: +crp[i],\n y: +crp[i + 1],\n },\n {\n x: +crp[i + 2],\n y: +crp[i + 3],\n },\n {\n x: +crp[i + 4],\n y: +crp[i + 5],\n },\n ];\n if (z) {\n if (!i) {\n p[0] = {\n x: +crp[iLen - 2],\n y: +crp[iLen - 1],\n };\n }\n else if (iLen - 4 === i) {\n p[3] = {\n x: +crp[0],\n y: +crp[1],\n };\n }\n else if (iLen - 2 === i) {\n p[2] = {\n x: +crp[0],\n y: +crp[1],\n };\n p[3] = {\n x: +crp[2],\n y: +crp[3],\n };\n }\n }\n else {\n if (iLen - 4 === i) {\n p[3] = p[2];\n }\n else if (!i) {\n p[0] = {\n x: +crp[i],\n y: +crp[i + 1],\n };\n }\n }\n d.push([\n 'C',\n (-p[0].x + 6 * p[1].x + p[2].x) / 6,\n (-p[0].y + 6 * p[1].y + p[2].y) / 6,\n (p[1].x + 6 * p[2].x - p[3].x) / 6,\n (p[1].y + 6 * p[2].y - p[3].y) / 6,\n p[2].x,\n p[2].y,\n ]);\n }\n return d;\n};\nvar ellipsePath = function (x, y, rx, ry, a) {\n var res = [];\n if (a === null && ry === null) {\n ry = rx;\n }\n x = +x;\n y = +y;\n rx = +rx;\n ry = +ry;\n if (a !== null) {\n var rad = Math.PI / 180;\n var x1 = x + rx * Math.cos(-ry * rad);\n var x2 = x + rx * Math.cos(-a * rad);\n var y1 = y + rx * Math.sin(-ry * rad);\n var y2 = y + rx * Math.sin(-a * rad);\n res = [\n ['M', x1, y1],\n ['A', rx, rx, 0, +(a - ry > 180), 0, x2, y2],\n ];\n }\n else {\n res = [['M', x, y], ['m', 0, -ry], ['a', rx, ry, 0, 1, 1, 0, 2 * ry], ['a', rx, ry, 0, 1, 1, 0, -2 * ry], ['z']];\n }\n return res;\n};\nvar pathToAbsolute = function (pathArray) {\n pathArray = parsePathString(pathArray);\n if (!pathArray || !pathArray.length) {\n return [['M', 0, 0]];\n }\n var res = [];\n var x = 0;\n var y = 0;\n var mx = 0;\n var my = 0;\n var start = 0;\n var pa0;\n var dots;\n if (pathArray[0][0] === 'M') {\n x = +pathArray[0][1];\n y = +pathArray[0][2];\n mx = x;\n my = y;\n start++;\n res[0] = ['M', x, y];\n }\n var crz = pathArray.length === 3 &&\n pathArray[0][0] === 'M' &&\n pathArray[1][0].toUpperCase() === 'R' &&\n pathArray[2][0].toUpperCase() === 'Z';\n for (var r = void 0, pa = void 0, i = start, ii = pathArray.length; i < ii; i++) {\n res.push((r = []));\n pa = pathArray[i];\n pa0 = pa[0];\n if (pa0 !== pa0.toUpperCase()) {\n r[0] = pa0.toUpperCase();\n switch (r[0]) {\n case 'A':\n r[1] = pa[1];\n r[2] = pa[2];\n r[3] = pa[3];\n r[4] = pa[4];\n r[5] = pa[5];\n r[6] = +pa[6] + x;\n r[7] = +pa[7] + y;\n break;\n case 'V':\n r[1] = +pa[1] + y;\n break;\n case 'H':\n r[1] = +pa[1] + x;\n break;\n case 'R':\n dots = [x, y].concat(pa.slice(1));\n for (var j = 2, jj = dots.length; j < jj; j++) {\n dots[j] = +dots[j] + x;\n dots[++j] = +dots[j] + y;\n }\n res.pop();\n res = res.concat(catmullRomToBezier(dots, crz));\n break;\n case 'O':\n res.pop();\n dots = ellipsePath(x, y, pa[1], pa[2]);\n dots.push(dots[0]);\n res = res.concat(dots);\n break;\n case 'U':\n res.pop();\n res = res.concat(ellipsePath(x, y, pa[1], pa[2], pa[3]));\n r = ['U'].concat(res[res.length - 1].slice(-2));\n break;\n case 'M':\n mx = +pa[1] + x;\n my = +pa[2] + y;\n break; // for lint\n default:\n for (var j = 1, jj = pa.length; j < jj; j++) {\n r[j] = +pa[j] + (j % 2 ? x : y);\n }\n }\n }\n else if (pa0 === 'R') {\n dots = [x, y].concat(pa.slice(1));\n res.pop();\n res = res.concat(catmullRomToBezier(dots, crz));\n r = ['R'].concat(pa.slice(-2));\n }\n else if (pa0 === 'O') {\n res.pop();\n dots = ellipsePath(x, y, pa[1], pa[2]);\n dots.push(dots[0]);\n res = res.concat(dots);\n }\n else if (pa0 === 'U') {\n res.pop();\n res = res.concat(ellipsePath(x, y, pa[1], pa[2], pa[3]));\n r = ['U'].concat(res[res.length - 1].slice(-2));\n }\n else {\n for (var k = 0, kk = pa.length; k < kk; k++) {\n r[k] = pa[k];\n }\n }\n pa0 = pa0.toUpperCase();\n if (pa0 !== 'O') {\n switch (r[0]) {\n case 'Z':\n x = +mx;\n y = +my;\n break;\n case 'H':\n x = r[1];\n break;\n case 'V':\n y = r[1];\n break;\n case 'M':\n mx = r[r.length - 2];\n my = r[r.length - 1];\n break; // for lint\n default:\n x = r[r.length - 2];\n y = r[r.length - 1];\n }\n }\n }\n return res;\n};\nvar l2c = function (x1, y1, x2, y2) {\n return [x1, y1, x2, y2, x2, y2];\n};\nvar q2c = function (x1, y1, ax, ay, x2, y2) {\n var _13 = 1 / 3;\n var _23 = 2 / 3;\n return [_13 * x1 + _23 * ax, _13 * y1 + _23 * ay, _13 * x2 + _23 * ax, _13 * y2 + _23 * ay, x2, y2];\n};\nvar a2c = function (x1, y1, rx, ry, angle, large_arc_flag, sweep_flag, x2, y2, recursive) {\n // for more information of where this math came from visit:\n // http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n if (rx === ry) {\n rx += 1;\n }\n var _120 = (Math.PI * 120) / 180;\n var rad = (Math.PI / 180) * (+angle || 0);\n var res = [];\n var xy;\n var f1;\n var f2;\n var cx;\n var cy;\n var rotate = function (x, y, rad) {\n var X = x * Math.cos(rad) - y * Math.sin(rad);\n var Y = x * Math.sin(rad) + y * Math.cos(rad);\n return {\n x: X,\n y: Y,\n };\n };\n if (!recursive) {\n xy = rotate(x1, y1, -rad);\n x1 = xy.x;\n y1 = xy.y;\n xy = rotate(x2, y2, -rad);\n x2 = xy.x;\n y2 = xy.y;\n if (x1 === x2 && y1 === y2) {\n // 若弧的起始点和终点重叠则错开一点\n x2 += 1;\n y2 += 1;\n }\n // const cos = Math.cos(Math.PI / 180 * angle);\n // const sin = Math.sin(Math.PI / 180 * angle);\n var x = (x1 - x2) / 2;\n var y = (y1 - y2) / 2;\n var h = (x * x) / (rx * rx) + (y * y) / (ry * ry);\n if (h > 1) {\n h = Math.sqrt(h);\n rx = h * rx;\n ry = h * ry;\n }\n var rx2 = rx * rx;\n var ry2 = ry * ry;\n var k = (large_arc_flag === sweep_flag ? -1 : 1) *\n Math.sqrt(Math.abs((rx2 * ry2 - rx2 * y * y - ry2 * x * x) / (rx2 * y * y + ry2 * x * x)));\n cx = (k * rx * y) / ry + (x1 + x2) / 2;\n cy = (k * -ry * x) / rx + (y1 + y2) / 2;\n // @ts-ignore\n f1 = Math.asin(((y1 - cy) / ry).toFixed(9));\n // @ts-ignore\n f2 = Math.asin(((y2 - cy) / ry).toFixed(9));\n f1 = x1 < cx ? Math.PI - f1 : f1;\n f2 = x2 < cx ? Math.PI - f2 : f2;\n f1 < 0 && (f1 = Math.PI * 2 + f1);\n f2 < 0 && (f2 = Math.PI * 2 + f2);\n if (sweep_flag && f1 > f2) {\n f1 = f1 - Math.PI * 2;\n }\n if (!sweep_flag && f2 > f1) {\n f2 = f2 - Math.PI * 2;\n }\n }\n else {\n f1 = recursive[0];\n f2 = recursive[1];\n cx = recursive[2];\n cy = recursive[3];\n }\n var df = f2 - f1;\n if (Math.abs(df) > _120) {\n var f2old = f2;\n var x2old = x2;\n var y2old = y2;\n f2 = f1 + _120 * (sweep_flag && f2 > f1 ? 1 : -1);\n x2 = cx + rx * Math.cos(f2);\n y2 = cy + ry * Math.sin(f2);\n res = a2c(x2, y2, rx, ry, angle, 0, sweep_flag, x2old, y2old, [f2, f2old, cx, cy]);\n }\n df = f2 - f1;\n var c1 = Math.cos(f1);\n var s1 = Math.sin(f1);\n var c2 = Math.cos(f2);\n var s2 = Math.sin(f2);\n var t = Math.tan(df / 4);\n var hx = (4 / 3) * rx * t;\n var hy = (4 / 3) * ry * t;\n var m1 = [x1, y1];\n var m2 = [x1 + hx * s1, y1 - hy * c1];\n var m3 = [x2 + hx * s2, y2 - hy * c2];\n var m4 = [x2, y2];\n m2[0] = 2 * m1[0] - m2[0];\n m2[1] = 2 * m1[1] - m2[1];\n if (recursive) {\n return [m2, m3, m4].concat(res);\n }\n res = [m2, m3, m4].concat(res).join().split(',');\n var newres = [];\n for (var i = 0, ii = res.length; i < ii; i++) {\n newres[i] = i % 2 ? rotate(res[i - 1], res[i], rad).y : rotate(res[i], res[i + 1], rad).x;\n }\n return newres;\n};\nvar pathToCurve = function (path, path2) {\n var p = pathToAbsolute(path);\n var p2 = path2 && pathToAbsolute(path2);\n var attrs = {\n x: 0,\n y: 0,\n bx: 0,\n by: 0,\n X: 0,\n Y: 0,\n qx: null,\n qy: null,\n };\n var attrs2 = {\n x: 0,\n y: 0,\n bx: 0,\n by: 0,\n X: 0,\n Y: 0,\n qx: null,\n qy: null,\n };\n var pcoms1 = []; // path commands of original path p\n var pcoms2 = []; // path commands of original path p2\n var pfirst = ''; // temporary holder for original path command\n var pcom = ''; // holder for previous path command of original path\n var ii;\n var processPath = function (path, d, pcom) {\n var nx;\n var ny;\n if (!path) {\n return ['C', d.x, d.y, d.x, d.y, d.x, d.y];\n }\n !(path[0] in\n {\n T: 1,\n Q: 1,\n }) && (d.qx = d.qy = null);\n switch (path[0]) {\n case 'M':\n d.X = path[1];\n d.Y = path[2];\n break;\n case 'A':\n path = ['C'].concat(a2c.apply(0, [d.x, d.y].concat(path.slice(1))));\n break;\n case 'S':\n if (pcom === 'C' || pcom === 'S') {\n // In \"S\" case we have to take into account, if the previous command is C/S.\n nx = d.x * 2 - d.bx; // And reflect the previous\n ny = d.y * 2 - d.by; // command's control point relative to the current point.\n }\n else {\n // or some else or nothing\n nx = d.x;\n ny = d.y;\n }\n path = ['C', nx, ny].concat(path.slice(1));\n break;\n case 'T':\n if (pcom === 'Q' || pcom === 'T') {\n // In \"T\" case we have to take into account, if the previous command is Q/T.\n d.qx = d.x * 2 - d.qx; // And make a reflection similar\n d.qy = d.y * 2 - d.qy; // to case \"S\".\n }\n else {\n // or something else or nothing\n d.qx = d.x;\n d.qy = d.y;\n }\n path = ['C'].concat(q2c(d.x, d.y, d.qx, d.qy, path[1], path[2]));\n break;\n case 'Q':\n d.qx = path[1];\n d.qy = path[2];\n path = ['C'].concat(q2c(d.x, d.y, path[1], path[2], path[3], path[4]));\n break;\n case 'L':\n path = ['C'].concat(l2c(d.x, d.y, path[1], path[2]));\n break;\n case 'H':\n path = ['C'].concat(l2c(d.x, d.y, path[1], d.y));\n break;\n case 'V':\n path = ['C'].concat(l2c(d.x, d.y, d.x, path[1]));\n break;\n case 'Z':\n path = ['C'].concat(l2c(d.x, d.y, d.X, d.Y));\n break;\n default:\n break;\n }\n return path;\n };\n var fixArc = function (pp, i) {\n if (pp[i].length > 7) {\n pp[i].shift();\n var pi = pp[i];\n while (pi.length) {\n pcoms1[i] = 'A'; // if created multiple C:s, their original seg is saved\n p2 && (pcoms2[i] = 'A'); // the same as above\n pp.splice(i++, 0, ['C'].concat(pi.splice(0, 6)));\n }\n pp.splice(i, 1);\n ii = Math.max(p.length, (p2 && p2.length) || 0);\n }\n };\n var fixM = function (path1, path2, a1, a2, i) {\n if (path1 && path2 && path1[i][0] === 'M' && path2[i][0] !== 'M') {\n path2.splice(i, 0, ['M', a2.x, a2.y]);\n a1.bx = 0;\n a1.by = 0;\n a1.x = path1[i][1];\n a1.y = path1[i][2];\n ii = Math.max(p.length, (p2 && p2.length) || 0);\n }\n };\n ii = Math.max(p.length, (p2 && p2.length) || 0);\n for (var i = 0; i < ii; i++) {\n p[i] && (pfirst = p[i][0]); // save current path command\n if (pfirst !== 'C') {\n // C is not saved yet, because it may be result of conversion\n pcoms1[i] = pfirst; // Save current path command\n i && (pcom = pcoms1[i - 1]); // Get previous path command pcom\n }\n p[i] = processPath(p[i], attrs, pcom); // Previous path command is inputted to processPath\n if (pcoms1[i] !== 'A' && pfirst === 'C')\n pcoms1[i] = 'C'; // A is the only command\n // which may produce multiple C:s\n // so we have to make sure that C is also C in original path\n fixArc(p, i); // fixArc adds also the right amount of A:s to pcoms1\n if (p2) {\n // the same procedures is done to p2\n p2[i] && (pfirst = p2[i][0]);\n if (pfirst !== 'C') {\n pcoms2[i] = pfirst;\n i && (pcom = pcoms2[i - 1]);\n }\n p2[i] = processPath(p2[i], attrs2, pcom);\n if (pcoms2[i] !== 'A' && pfirst === 'C') {\n pcoms2[i] = 'C';\n }\n fixArc(p2, i);\n }\n fixM(p, p2, attrs, attrs2, i);\n fixM(p2, p, attrs2, attrs, i);\n var seg = p[i];\n var seg2 = p2 && p2[i];\n var seglen = seg.length;\n var seg2len = p2 && seg2.length;\n attrs.x = seg[seglen - 2];\n attrs.y = seg[seglen - 1];\n attrs.bx = parseFloat(seg[seglen - 4]) || attrs.x;\n attrs.by = parseFloat(seg[seglen - 3]) || attrs.y;\n attrs2.bx = p2 && (parseFloat(seg2[seg2len - 4]) || attrs2.x);\n attrs2.by = p2 && (parseFloat(seg2[seg2len - 3]) || attrs2.y);\n attrs2.x = p2 && seg2[seg2len - 2];\n attrs2.y = p2 && seg2[seg2len - 1];\n }\n return p2 ? [p, p2] : p;\n};\nvar p2s = /,?([a-z]),?/gi;\nvar parsePathArray = function (path) {\n return path.join(',').replace(p2s, '$1');\n};\nvar base3 = function (t, p1, p2, p3, p4) {\n var t1 = -3 * p1 + 9 * p2 - 9 * p3 + 3 * p4;\n var t2 = t * t1 + 6 * p1 - 12 * p2 + 6 * p3;\n return t * t2 - 3 * p1 + 3 * p2;\n};\nvar bezlen = function (x1, y1, x2, y2, x3, y3, x4, y4, z) {\n if (z === null) {\n z = 1;\n }\n z = z > 1 ? 1 : z < 0 ? 0 : z;\n var z2 = z / 2;\n var n = 12;\n var Tvalues = [\n -0.1252,\n 0.1252,\n -0.3678,\n 0.3678,\n -0.5873,\n 0.5873,\n -0.7699,\n 0.7699,\n -0.9041,\n 0.9041,\n -0.9816,\n 0.9816,\n ];\n var Cvalues = [0.2491, 0.2491, 0.2335, 0.2335, 0.2032, 0.2032, 0.1601, 0.1601, 0.1069, 0.1069, 0.0472, 0.0472];\n var sum = 0;\n for (var i = 0; i < n; i++) {\n var ct = z2 * Tvalues[i] + z2;\n var xbase = base3(ct, x1, x2, x3, x4);\n var ybase = base3(ct, y1, y2, y3, y4);\n var comb = xbase * xbase + ybase * ybase;\n sum += Cvalues[i] * Math.sqrt(comb);\n }\n return z2 * sum;\n};\nvar curveDim = function (x0, y0, x1, y1, x2, y2, x3, y3) {\n var tvalues = [];\n var bounds = [[], []];\n var a;\n var b;\n var c;\n var t;\n for (var i = 0; i < 2; ++i) {\n if (i === 0) {\n b = 6 * x0 - 12 * x1 + 6 * x2;\n a = -3 * x0 + 9 * x1 - 9 * x2 + 3 * x3;\n c = 3 * x1 - 3 * x0;\n }\n else {\n b = 6 * y0 - 12 * y1 + 6 * y2;\n a = -3 * y0 + 9 * y1 - 9 * y2 + 3 * y3;\n c = 3 * y1 - 3 * y0;\n }\n if (Math.abs(a) < 1e-12) {\n if (Math.abs(b) < 1e-12) {\n continue;\n }\n t = -c / b;\n if (t > 0 && t < 1) {\n tvalues.push(t);\n }\n continue;\n }\n var b2ac = b * b - 4 * c * a;\n var sqrtb2ac = Math.sqrt(b2ac);\n if (b2ac < 0) {\n continue;\n }\n var t1 = (-b + sqrtb2ac) / (2 * a);\n if (t1 > 0 && t1 < 1) {\n tvalues.push(t1);\n }\n var t2 = (-b - sqrtb2ac) / (2 * a);\n if (t2 > 0 && t2 < 1) {\n tvalues.push(t2);\n }\n }\n var j = tvalues.length;\n var jlen = j;\n var mt;\n while (j--) {\n t = tvalues[j];\n mt = 1 - t;\n bounds[0][j] = mt * mt * mt * x0 + 3 * mt * mt * t * x1 + 3 * mt * t * t * x2 + t * t * t * x3;\n bounds[1][j] = mt * mt * mt * y0 + 3 * mt * mt * t * y1 + 3 * mt * t * t * y2 + t * t * t * y3;\n }\n bounds[0][jlen] = x0;\n bounds[1][jlen] = y0;\n bounds[0][jlen + 1] = x3;\n bounds[1][jlen + 1] = y3;\n bounds[0].length = bounds[1].length = jlen + 2;\n return {\n min: {\n x: Math.min.apply(0, bounds[0]),\n y: Math.min.apply(0, bounds[1]),\n },\n max: {\n x: Math.max.apply(0, bounds[0]),\n y: Math.max.apply(0, bounds[1]),\n },\n };\n};\nvar intersect = function (x1, y1, x2, y2, x3, y3, x4, y4) {\n if (Math.max(x1, x2) < Math.min(x3, x4) ||\n Math.min(x1, x2) > Math.max(x3, x4) ||\n Math.max(y1, y2) < Math.min(y3, y4) ||\n Math.min(y1, y2) > Math.max(y3, y4)) {\n return;\n }\n var nx = (x1 * y2 - y1 * x2) * (x3 - x4) - (x1 - x2) * (x3 * y4 - y3 * x4);\n var ny = (x1 * y2 - y1 * x2) * (y3 - y4) - (y1 - y2) * (x3 * y4 - y3 * x4);\n var denominator = (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4);\n if (!denominator) {\n return;\n }\n var px = nx / denominator;\n var py = ny / denominator;\n var px2 = +px.toFixed(2);\n var py2 = +py.toFixed(2);\n if (px2 < +Math.min(x1, x2).toFixed(2) ||\n px2 > +Math.max(x1, x2).toFixed(2) ||\n px2 < +Math.min(x3, x4).toFixed(2) ||\n px2 > +Math.max(x3, x4).toFixed(2) ||\n py2 < +Math.min(y1, y2).toFixed(2) ||\n py2 > +Math.max(y1, y2).toFixed(2) ||\n py2 < +Math.min(y3, y4).toFixed(2) ||\n py2 > +Math.max(y3, y4).toFixed(2)) {\n return;\n }\n return {\n x: px,\n y: py,\n };\n};\nvar isPointInsideBBox = function (bbox, x, y) {\n return x >= bbox.x && x <= bbox.x + bbox.width && y >= bbox.y && y <= bbox.y + bbox.height;\n};\nvar rectPath = function (x, y, w, h, r) {\n if (r) {\n return [\n ['M', +x + +r, y],\n ['l', w - r * 2, 0],\n ['a', r, r, 0, 0, 1, r, r],\n ['l', 0, h - r * 2],\n ['a', r, r, 0, 0, 1, -r, r],\n ['l', r * 2 - w, 0],\n ['a', r, r, 0, 0, 1, -r, -r],\n ['l', 0, r * 2 - h],\n ['a', r, r, 0, 0, 1, r, -r],\n ['z'],\n ];\n }\n var res = [['M', x, y], ['l', w, 0], ['l', 0, h], ['l', -w, 0], ['z']];\n // @ts-ignore\n res.parsePathArray = parsePathArray;\n return res;\n};\nvar box = function (x, y, width, height) {\n if (x === null) {\n x = y = width = height = 0;\n }\n if (y === null) {\n y = x.y;\n width = x.width;\n height = x.height;\n x = x.x;\n }\n return {\n x: x,\n y: y,\n width: width,\n w: width,\n height: height,\n h: height,\n x2: x + width,\n y2: y + height,\n cx: x + width / 2,\n cy: y + height / 2,\n r1: Math.min(width, height) / 2,\n r2: Math.max(width, height) / 2,\n r0: Math.sqrt(width * width + height * height) / 2,\n path: rectPath(x, y, width, height),\n vb: [x, y, width, height].join(' '),\n };\n};\nvar isBBoxIntersect = function (bbox1, bbox2) {\n bbox1 = box(bbox1);\n bbox2 = box(bbox2);\n return (isPointInsideBBox(bbox2, bbox1.x, bbox1.y) ||\n isPointInsideBBox(bbox2, bbox1.x2, bbox1.y) ||\n isPointInsideBBox(bbox2, bbox1.x, bbox1.y2) ||\n isPointInsideBBox(bbox2, bbox1.x2, bbox1.y2) ||\n isPointInsideBBox(bbox1, bbox2.x, bbox2.y) ||\n isPointInsideBBox(bbox1, bbox2.x2, bbox2.y) ||\n isPointInsideBBox(bbox1, bbox2.x, bbox2.y2) ||\n isPointInsideBBox(bbox1, bbox2.x2, bbox2.y2) ||\n (((bbox1.x < bbox2.x2 && bbox1.x > bbox2.x) || (bbox2.x < bbox1.x2 && bbox2.x > bbox1.x)) &&\n ((bbox1.y < bbox2.y2 && bbox1.y > bbox2.y) || (bbox2.y < bbox1.y2 && bbox2.y > bbox1.y))));\n};\nvar bezierBBox = function (p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y) {\n if (!Object(_antv_util__WEBPACK_IMPORTED_MODULE_0__[\"isArray\"])(p1x)) {\n p1x = [p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y];\n }\n var bbox = curveDim.apply(null, p1x);\n return box(bbox.min.x, bbox.min.y, bbox.max.x - bbox.min.x, bbox.max.y - bbox.min.y);\n};\nvar findDotsAtSegment = function (p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t) {\n var t1 = 1 - t;\n var t13 = Math.pow(t1, 3);\n var t12 = Math.pow(t1, 2);\n var t2 = t * t;\n var t3 = t2 * t;\n var x = t13 * p1x + t12 * 3 * t * c1x + t1 * 3 * t * t * c2x + t3 * p2x;\n var y = t13 * p1y + t12 * 3 * t * c1y + t1 * 3 * t * t * c2y + t3 * p2y;\n var mx = p1x + 2 * t * (c1x - p1x) + t2 * (c2x - 2 * c1x + p1x);\n var my = p1y + 2 * t * (c1y - p1y) + t2 * (c2y - 2 * c1y + p1y);\n var nx = c1x + 2 * t * (c2x - c1x) + t2 * (p2x - 2 * c2x + c1x);\n var ny = c1y + 2 * t * (c2y - c1y) + t2 * (p2y - 2 * c2y + c1y);\n var ax = t1 * p1x + t * c1x;\n var ay = t1 * p1y + t * c1y;\n var cx = t1 * c2x + t * p2x;\n var cy = t1 * c2y + t * p2y;\n var alpha = 90 - (Math.atan2(mx - nx, my - ny) * 180) / Math.PI;\n // (mx > nx || my < ny) && (alpha += 180);\n return {\n x: x,\n y: y,\n m: {\n x: mx,\n y: my,\n },\n n: {\n x: nx,\n y: ny,\n },\n start: {\n x: ax,\n y: ay,\n },\n end: {\n x: cx,\n y: cy,\n },\n alpha: alpha,\n };\n};\nvar interHelper = function (bez1, bez2, justCount) {\n var bbox1 = bezierBBox(bez1);\n var bbox2 = bezierBBox(bez2);\n if (!isBBoxIntersect(bbox1, bbox2)) {\n return justCount ? 0 : [];\n }\n var l1 = bezlen.apply(0, bez1);\n var l2 = bezlen.apply(0, bez2);\n var n1 = ~~(l1 / 8);\n var n2 = ~~(l2 / 8);\n var dots1 = [];\n var dots2 = [];\n var xy = {};\n var res = justCount ? 0 : [];\n for (var i = 0; i < n1 + 1; i++) {\n var d = findDotsAtSegment.apply(0, bez1.concat(i / n1));\n dots1.push({\n x: d.x,\n y: d.y,\n t: i / n1,\n });\n }\n for (var i = 0; i < n2 + 1; i++) {\n var d = findDotsAtSegment.apply(0, bez2.concat(i / n2));\n dots2.push({\n x: d.x,\n y: d.y,\n t: i / n2,\n });\n }\n for (var i = 0; i < n1; i++) {\n for (var j = 0; j < n2; j++) {\n var di = dots1[i];\n var di1 = dots1[i + 1];\n var dj = dots2[j];\n var dj1 = dots2[j + 1];\n var ci = Math.abs(di1.x - di.x) < 0.001 ? 'y' : 'x';\n var cj = Math.abs(dj1.x - dj.x) < 0.001 ? 'y' : 'x';\n var is = intersect(di.x, di.y, di1.x, di1.y, dj.x, dj.y, dj1.x, dj1.y);\n if (is) {\n if (xy[is.x.toFixed(4)] === is.y.toFixed(4)) {\n continue;\n }\n xy[is.x.toFixed(4)] = is.y.toFixed(4);\n var t1 = di.t + Math.abs((is[ci] - di[ci]) / (di1[ci] - di[ci])) * (di1.t - di.t);\n var t2 = dj.t + Math.abs((is[cj] - dj[cj]) / (dj1[cj] - dj[cj])) * (dj1.t - dj.t);\n if (t1 >= 0 && t1 <= 1 && t2 >= 0 && t2 <= 1) {\n if (justCount) {\n // @ts-ignore\n res += 1;\n }\n else {\n // @ts-ignore\n res.push({\n x: is.x,\n y: is.y,\n t1: t1,\n t2: t2,\n });\n }\n }\n }\n }\n }\n return res;\n};\nvar interPathHelper = function (path1, path2, justCount) {\n path1 = pathToCurve(path1);\n path2 = pathToCurve(path2);\n var x1;\n var y1;\n var x2;\n var y2;\n var x1m;\n var y1m;\n var x2m;\n var y2m;\n var bez1;\n var bez2;\n var res = justCount ? 0 : [];\n for (var i = 0, ii = path1.length; i < ii; i++) {\n var pi = path1[i];\n if (pi[0] === 'M') {\n x1 = x1m = pi[1];\n y1 = y1m = pi[2];\n }\n else {\n if (pi[0] === 'C') {\n bez1 = [x1, y1].concat(pi.slice(1));\n x1 = bez1[6];\n y1 = bez1[7];\n }\n else {\n bez1 = [x1, y1, x1, y1, x1m, y1m, x1m, y1m];\n x1 = x1m;\n y1 = y1m;\n }\n for (var j = 0, jj = path2.length; j < jj; j++) {\n var pj = path2[j];\n if (pj[0] === 'M') {\n x2 = x2m = pj[1];\n y2 = y2m = pj[2];\n }\n else {\n if (pj[0] === 'C') {\n bez2 = [x2, y2].concat(pj.slice(1));\n x2 = bez2[6];\n y2 = bez2[7];\n }\n else {\n bez2 = [x2, y2, x2, y2, x2m, y2m, x2m, y2m];\n x2 = x2m;\n y2 = y2m;\n }\n var intr = interHelper(bez1, bez2, justCount);\n if (justCount) {\n // @ts-ignore\n res += intr;\n }\n else {\n // @ts-ignore\n for (var k = 0, kk = intr.length; k < kk; k++) {\n intr[k].segment1 = i;\n intr[k].segment2 = j;\n intr[k].bez1 = bez1;\n intr[k].bez2 = bez2;\n }\n // @ts-ignore\n res = res.concat(intr);\n }\n }\n }\n }\n }\n return res;\n};\nvar intersection = function (path1, path2) {\n return interPathHelper(path1, path2);\n};\nfunction decasteljau(points, t) {\n var left = [];\n var right = [];\n function recurse(points, t) {\n if (points.length === 1) {\n left.push(points[0]);\n right.push(points[0]);\n }\n else {\n var middlePoints = [];\n for (var i = 0; i < points.length - 1; i++) {\n if (i === 0) {\n left.push(points[0]);\n }\n if (i === points.length - 2) {\n right.push(points[i + 1]);\n }\n middlePoints[i] = [\n (1 - t) * points[i][0] + t * points[i + 1][0],\n (1 - t) * points[i][1] + t * points[i + 1][1],\n ];\n }\n recurse(middlePoints, t);\n }\n }\n if (points.length) {\n recurse(points, t);\n }\n return { left: left, right: right.reverse() };\n}\nfunction splitCurve(start, end, count) {\n var points = [[start[1], start[2]]];\n count = count || 2;\n var segments = [];\n if (end[0] === 'A') {\n points.push(end[6]);\n points.push(end[7]);\n }\n else if (end[0] === 'C') {\n points.push([end[1], end[2]]);\n points.push([end[3], end[4]]);\n points.push([end[5], end[6]]);\n }\n else if (end[0] === 'S' || end[0] === 'Q') {\n points.push([end[1], end[2]]);\n points.push([end[3], end[4]]);\n }\n else {\n points.push([end[1], end[2]]);\n }\n var leftSegments = points;\n var t = 1 / count;\n for (var i = 0; i < count - 1; i++) {\n var rt = t / (1 - t * i);\n var split = decasteljau(leftSegments, rt);\n segments.push(split.left);\n leftSegments = split.right;\n }\n segments.push(leftSegments);\n var result = segments.map(function (segment) {\n var cmd = [];\n if (segment.length === 4) {\n cmd.push('C');\n cmd = cmd.concat(segment[2]);\n }\n if (segment.length >= 3) {\n if (segment.length === 3) {\n cmd.push('Q');\n }\n cmd = cmd.concat(segment[1]);\n }\n if (segment.length === 2) {\n cmd.push('L');\n }\n cmd = cmd.concat(segment[segment.length - 1]);\n return cmd;\n });\n return result;\n}\nvar splitSegment = function (start, end, count) {\n if (count === 1) {\n return [[].concat(start)];\n }\n var segments = [];\n if (end[0] === 'L' || end[0] === 'C' || end[0] === 'Q') {\n segments = segments.concat(splitCurve(start, end, count));\n }\n else {\n var temp = [].concat(start);\n if (temp[0] === 'M') {\n temp[0] = 'L';\n }\n for (var i = 0; i <= count - 1; i++) {\n segments.push(temp);\n }\n }\n return segments;\n};\nvar fillPath = function (source, target) {\n if (source.length === 1) {\n return source;\n }\n var sourceLen = source.length - 1;\n var targetLen = target.length - 1;\n var ratio = sourceLen / targetLen;\n var segmentsToFill = [];\n if (source.length === 1 && source[0][0] === 'M') {\n for (var i = 0; i < targetLen - sourceLen; i++) {\n source.push(source[0]);\n }\n return source;\n }\n for (var i = 0; i < targetLen; i++) {\n var index = Math.floor(ratio * i);\n segmentsToFill[index] = (segmentsToFill[index] || 0) + 1;\n }\n var filled = segmentsToFill.reduce(function (filled, count, i) {\n if (i === sourceLen) {\n return filled.concat(source[sourceLen]);\n }\n return filled.concat(splitSegment(source[i], source[i + 1], count));\n }, []);\n filled.unshift(source[0]);\n if (target[targetLen] === 'Z' || target[targetLen] === 'z') {\n filled.push('Z');\n }\n return filled;\n};\nvar isEqual = function (obj1, obj2) {\n if (obj1.length !== obj2.length) {\n return false;\n }\n var result = true;\n Object(_antv_util__WEBPACK_IMPORTED_MODULE_0__[\"each\"])(obj1, function (item, i) {\n if (item !== obj2[i]) {\n result = false;\n return false;\n }\n });\n return result;\n};\nfunction getMinDiff(del, add, modify) {\n var type = null;\n var min = modify;\n if (add < min) {\n min = add;\n type = 'add';\n }\n if (del < min) {\n min = del;\n type = 'del';\n }\n return {\n type: type,\n min: min,\n };\n}\n/*\n * https://en.wikipedia.org/wiki/Levenshtein_distance\n * 计算两条path的编辑距离\n */\nvar levenshteinDistance = function (source, target) {\n var sourceLen = source.length;\n var targetLen = target.length;\n var sourceSegment;\n var targetSegment;\n var temp = 0;\n if (sourceLen === 0 || targetLen === 0) {\n return null;\n }\n var dist = [];\n for (var i = 0; i <= sourceLen; i++) {\n dist[i] = [];\n dist[i][0] = { min: i };\n }\n for (var j = 0; j <= targetLen; j++) {\n dist[0][j] = { min: j };\n }\n for (var i = 1; i <= sourceLen; i++) {\n sourceSegment = source[i - 1];\n for (var j = 1; j <= targetLen; j++) {\n targetSegment = target[j - 1];\n if (isEqual(sourceSegment, targetSegment)) {\n temp = 0;\n }\n else {\n temp = 1;\n }\n var del = dist[i - 1][j].min + 1;\n var add = dist[i][j - 1].min + 1;\n var modify = dist[i - 1][j - 1].min + temp;\n dist[i][j] = getMinDiff(del, add, modify);\n }\n }\n return dist;\n};\nvar fillPathByDiff = function (source, target) {\n var diffMatrix = levenshteinDistance(source, target);\n var sourceLen = source.length;\n var targetLen = target.length;\n var changes = [];\n var index = 1;\n var minPos = 1;\n // 如果source和target不是完全不相等\n if (diffMatrix[sourceLen][targetLen].min !== sourceLen) {\n // 获取从source到target所需改动\n for (var i = 1; i <= sourceLen; i++) {\n var min = diffMatrix[i][i].min;\n minPos = i;\n for (var j = index; j <= targetLen; j++) {\n if (diffMatrix[i][j].min < min) {\n min = diffMatrix[i][j].min;\n minPos = j;\n }\n }\n index = minPos;\n if (diffMatrix[i][index].type) {\n changes.push({ index: i - 1, type: diffMatrix[i][index].type });\n }\n }\n // 对source进行增删path\n for (var i = changes.length - 1; i >= 0; i--) {\n index = changes[i].index;\n if (changes[i].type === 'add') {\n source.splice(index, 0, [].concat(source[index]));\n }\n else {\n source.splice(index, 1);\n }\n }\n }\n // source尾部补齐\n sourceLen = source.length;\n var diff = targetLen - sourceLen;\n if (sourceLen < targetLen) {\n for (var i = 0; i < diff; i++) {\n if (source[sourceLen - 1][0] === 'z' || source[sourceLen - 1][0] === 'Z') {\n source.splice(sourceLen - 2, 0, source[sourceLen - 2]);\n }\n else {\n source.push(source[sourceLen - 1]);\n }\n sourceLen += 1;\n }\n }\n return source;\n};\n// 将两个点均分成count个点\nfunction _splitPoints(points, former, count) {\n var result = [].concat(points);\n var index;\n var t = 1 / (count + 1);\n var formerEnd = _getSegmentPoints(former)[0];\n for (var i = 1; i <= count; i++) {\n t *= i;\n index = Math.floor(points.length * t);\n if (index === 0) {\n result.unshift([formerEnd[0] * t + points[index][0] * (1 - t), formerEnd[1] * t + points[index][1] * (1 - t)]);\n }\n else {\n result.splice(index, 0, [\n formerEnd[0] * t + points[index][0] * (1 - t),\n formerEnd[1] * t + points[index][1] * (1 - t),\n ]);\n }\n }\n return result;\n}\n/*\n * 抽取pathSegment中的关键点\n * M,L,A,Q,H,V一个端点\n * Q, S抽取一个端点,一个控制点\n * C抽取一个端点,两个控制点\n */\nfunction _getSegmentPoints(segment) {\n var points = [];\n switch (segment[0]) {\n case 'M':\n points.push([segment[1], segment[2]]);\n break;\n case 'L':\n points.push([segment[1], segment[2]]);\n break;\n case 'A':\n points.push([segment[6], segment[7]]);\n break;\n case 'Q':\n points.push([segment[3], segment[4]]);\n points.push([segment[1], segment[2]]);\n break;\n case 'T':\n points.push([segment[1], segment[2]]);\n break;\n case 'C':\n points.push([segment[5], segment[6]]);\n points.push([segment[1], segment[2]]);\n points.push([segment[3], segment[4]]);\n break;\n case 'S':\n points.push([segment[3], segment[4]]);\n points.push([segment[1], segment[2]]);\n break;\n case 'H':\n points.push([segment[1], segment[1]]);\n break;\n case 'V':\n points.push([segment[1], segment[1]]);\n break;\n default:\n }\n return points;\n}\nvar formatPath = function (fromPath, toPath) {\n if (fromPath.length <= 1) {\n return fromPath;\n }\n var points;\n for (var i = 0; i < toPath.length; i++) {\n if (fromPath[i][0] !== toPath[i][0]) {\n // 获取fromPath的pathSegment的端点,根据toPath的指令对其改造\n points = _getSegmentPoints(fromPath[i]);\n switch (toPath[i][0]) {\n case 'M':\n fromPath[i] = ['M'].concat(points[0]);\n break;\n case 'L':\n fromPath[i] = ['L'].concat(points[0]);\n break;\n case 'A':\n fromPath[i] = [].concat(toPath[i]);\n fromPath[i][6] = points[0][0];\n fromPath[i][7] = points[0][1];\n break;\n case 'Q':\n if (points.length < 2) {\n if (i > 0) {\n points = _splitPoints(points, fromPath[i - 1], 1);\n }\n else {\n fromPath[i] = toPath[i];\n break;\n }\n }\n fromPath[i] = ['Q'].concat(points.reduce(function (arr, i) {\n return arr.concat(i);\n }, []));\n break;\n case 'T':\n fromPath[i] = ['T'].concat(points[0]);\n break;\n case 'C':\n if (points.length < 3) {\n if (i > 0) {\n points = _splitPoints(points, fromPath[i - 1], 2);\n }\n else {\n fromPath[i] = toPath[i];\n break;\n }\n }\n fromPath[i] = ['C'].concat(points.reduce(function (arr, i) {\n return arr.concat(i);\n }, []));\n break;\n case 'S':\n if (points.length < 2) {\n if (i > 0) {\n points = _splitPoints(points, fromPath[i - 1], 1);\n }\n else {\n fromPath[i] = toPath[i];\n break;\n }\n }\n fromPath[i] = ['S'].concat(points.reduce(function (arr, i) {\n return arr.concat(i);\n }, []));\n break;\n default:\n fromPath[i] = toPath[i];\n }\n }\n }\n return fromPath;\n};\n\n//# sourceMappingURL=path.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy1iYXNlL2VzbS91dGlsL3BhdGguanM/YjZmYiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBMkM7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsMERBQU87QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDLG1CQUFtQjtBQUN6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUVBQXVFLFFBQVE7QUFDL0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFEQUFxRCxRQUFRO0FBQzdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQSxtREFBbUQsUUFBUTtBQUMzRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJDQUEyQyxRQUFRO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0MsUUFBUTtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEIsb0JBQW9CO0FBQ3BCLG9CQUFvQjtBQUNwQixrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDO0FBQ3hDLHdDQUF3QztBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMENBQTBDO0FBQzFDLDBDQUEwQztBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDO0FBQ2hDLHdDQUF3QztBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLFFBQVE7QUFDM0IsbUNBQW1DO0FBQ25DO0FBQ0E7QUFDQSwrQkFBK0I7QUFDL0Isd0NBQXdDO0FBQ3hDO0FBQ0EsOENBQThDO0FBQzlDO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixPQUFPO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixPQUFPO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsMERBQU87QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLFlBQVk7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLG1CQUFtQixZQUFZO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxtQkFBbUIsUUFBUTtBQUMzQix1QkFBdUIsUUFBUTtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQyxRQUFRO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDLFFBQVE7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlEQUF5RCxRQUFRO0FBQ2pFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQix1QkFBdUI7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLGVBQWU7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsZ0JBQWdCO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsMkJBQTJCO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLGVBQWU7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSx1REFBSTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsZ0JBQWdCO0FBQ25DO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0EsbUJBQW1CLGdCQUFnQjtBQUNuQyxzQkFBc0I7QUFDdEI7QUFDQSxtQkFBbUIsZ0JBQWdCO0FBQ25DO0FBQ0EsdUJBQXVCLGdCQUFnQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixnQkFBZ0I7QUFDdkM7QUFDQTtBQUNBLCtCQUErQixnQkFBZ0I7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEIsZ0RBQWdEO0FBQzlFO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QyxRQUFRO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLFVBQVU7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixZQUFZO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixtQkFBbUI7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDMko7QUFDM0oiLCJmaWxlIjoiNTIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBlYWNoLCBpc0FycmF5IH0gZnJvbSAnQGFudHYvdXRpbCc7XG52YXIgU1BBQ0VTID0gJ1xceDA5XFx4MGFcXHgwYlxceDBjXFx4MGRcXHgyMFxceGEwXFx1MTY4MFxcdTE4MGVcXHUyMDAwXFx1MjAwMVxcdTIwMDJcXHUyMDAzXFx1MjAwNFxcdTIwMDVcXHUyMDA2XFx1MjAwN1xcdTIwMDhcXHUyMDA5XFx1MjAwYVxcdTIwMmZcXHUyMDVmXFx1MzAwMFxcdTIwMjhcXHUyMDI5JztcbnZhciBQQVRIX0NPTU1BTkQgPSBuZXcgUmVnRXhwKFwiKFthLXpdKVtcIiArIFNQQUNFUyArIFwiLF0qKCgtP1xcXFxkKlxcXFwuP1xcXFxkKig/OmVbXFxcXC0rXT9cXFxcZCspP1tcIiArIFNQQUNFUyArIFwiXSosP1tcIiArIFNQQUNFUyArIFwiXSopKylcIiwgJ2lnJyk7XG52YXIgUEFUSF9WQUxVRVMgPSBuZXcgUmVnRXhwKFwiKC0/XFxcXGQqXFxcXC4/XFxcXGQqKD86ZVtcXFxcLStdP1xcXFxkKyk/KVtcIiArIFNQQUNFUyArIFwiXSosP1tcIiArIFNQQUNFUyArIFwiXSpcIiwgJ2lnJyk7XG4vLyBQYXJzZSBnaXZlbiBwYXRoIHN0cmluZyBpbnRvIGFuIGFycmF5IG9mIGFycmF5cyBvZiBwYXRoIHNlZ21lbnRzXG52YXIgcGFyc2VQYXRoU3RyaW5nID0gZnVuY3Rpb24gKHBhdGhTdHJpbmcpIHtcbiAgICBpZiAoIXBhdGhTdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmIChpc0FycmF5KHBhdGhTdHJpbmcpKSB7XG4gICAgICAgIHJldHVybiBwYXRoU3RyaW5nO1xuICAgIH1cbiAgICB2YXIgcGFyYW1Db3VudHMgPSB7XG4gICAgICAgIGE6IDcsXG4gICAgICAgIGM6IDYsXG4gICAgICAgIG86IDIsXG4gICAgICAgIGg6IDEsXG4gICAgICAgIGw6IDIsXG4gICAgICAgIG06IDIsXG4gICAgICAgIHI6IDQsXG4gICAgICAgIHE6IDQsXG4gICAgICAgIHM6IDQsXG4gICAgICAgIHQ6IDIsXG4gICAgICAgIHY6IDEsXG4gICAgICAgIHU6IDMsXG4gICAgICAgIHo6IDAsXG4gICAgfTtcbiAgICB2YXIgZGF0YSA9IFtdO1xuICAgIFN0cmluZyhwYXRoU3RyaW5nKS5yZXBsYWNlKFBBVEhfQ09NTUFORCwgZnVuY3Rpb24gKGEsIGIsIGMpIHtcbiAgICAgICAgdmFyIHBhcmFtcyA9IFtdO1xuICAgICAgICB2YXIgbmFtZSA9IGIudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgYy5yZXBsYWNlKFBBVEhfVkFMVUVTLCBmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICAgICAgYiAmJiBwYXJhbXMucHVzaCgrYik7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAobmFtZSA9PT0gJ20nICYmIHBhcmFtcy5sZW5ndGggPiAyKSB7XG4gICAgICAgICAgICBkYXRhLnB1c2goW2JdLmNvbmNhdChwYXJhbXMuc3BsaWNlKDAsIDIpKSk7XG4gICAgICAgICAgICBuYW1lID0gJ2wnO1xuICAgICAgICAgICAgYiA9IGIgPT09ICdtJyA/ICdsJyA6ICdMJztcbiAgICAgICAgfVxuICAgICAgICBpZiAobmFtZSA9PT0gJ28nICYmIHBhcmFtcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIGRhdGEucHVzaChbYiwgcGFyYW1zWzBdXSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5hbWUgPT09ICdyJykge1xuICAgICAgICAgICAgZGF0YS5wdXNoKFtiXS5jb25jYXQocGFyYW1zKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB3aGlsZSAocGFyYW1zLmxlbmd0aCA+PSBwYXJhbUNvdW50c1tuYW1lXSkge1xuICAgICAgICAgICAgICAgIGRhdGEucHVzaChbYl0uY29uY2F0KHBhcmFtcy5zcGxpY2UoMCwgcGFyYW1Db3VudHNbbmFtZV0pKSk7XG4gICAgICAgICAgICAgICAgaWYgKCFwYXJhbUNvdW50c1tuYW1lXSkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhdGhTdHJpbmc7XG4gICAgfSk7XG4gICAgcmV0dXJuIGRhdGE7XG59O1xuLy8gaHR0cDovL3NjaGVwZXJzLmNjL2dldHRpbmctdG8tdGhlLXBvaW50XG52YXIgY2F0bXVsbFJvbVRvQmV6aWVyID0gZnVuY3Rpb24gKGNycCwgeikge1xuICAgIHZhciBkID0gW107XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGZvciAodmFyIGkgPSAwLCBpTGVuID0gY3JwLmxlbmd0aDsgaUxlbiAtIDIgKiAheiA+IGk7IGkgKz0gMikge1xuICAgICAgICB2YXIgcCA9IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB4OiArY3JwW2kgLSAyXSxcbiAgICAgICAgICAgICAgICB5OiArY3JwW2kgLSAxXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgeDogK2NycFtpXSxcbiAgICAgICAgICAgICAgICB5OiArY3JwW2kgKyAxXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgeDogK2NycFtpICsgMl0sXG4gICAgICAgICAgICAgICAgeTogK2NycFtpICsgM10sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHg6ICtjcnBbaSArIDRdLFxuICAgICAgICAgICAgICAgIHk6ICtjcnBbaSArIDVdLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgXTtcbiAgICAgICAgaWYgKHopIHtcbiAgICAgICAgICAgIGlmICghaSkge1xuICAgICAgICAgICAgICAgIHBbMF0gPSB7XG4gICAgICAgICAgICAgICAgICAgIHg6ICtjcnBbaUxlbiAtIDJdLFxuICAgICAgICAgICAgICAgICAgICB5OiArY3JwW2lMZW4gLSAxXSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaUxlbiAtIDQgPT09IGkpIHtcbiAgICAgICAgICAgICAgICBwWzNdID0ge1xuICAgICAgICAgICAgICAgICAgICB4OiArY3JwWzBdLFxuICAgICAgICAgICAgICAgICAgICB5OiArY3JwWzFdLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpTGVuIC0gMiA9PT0gaSkge1xuICAgICAgICAgICAgICAgIHBbMl0gPSB7XG4gICAgICAgICAgICAgICAgICAgIHg6ICtjcnBbMF0sXG4gICAgICAgICAgICAgICAgICAgIHk6ICtjcnBbMV0sXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBwWzNdID0ge1xuICAgICAgICAgICAgICAgICAgICB4OiArY3JwWzJdLFxuICAgICAgICAgICAgICAgICAgICB5OiArY3JwWzNdLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoaUxlbiAtIDQgPT09IGkpIHtcbiAgICAgICAgICAgICAgICBwWzNdID0gcFsyXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKCFpKSB7XG4gICAgICAgICAgICAgICAgcFswXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgeDogK2NycFtpXSxcbiAgICAgICAgICAgICAgICAgICAgeTogK2NycFtpICsgMV0sXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBkLnB1c2goW1xuICAgICAgICAgICAgJ0MnLFxuICAgICAgICAgICAgKC1wWzBdLnggKyA2ICogcFsxXS54ICsgcFsyXS54KSAvIDYsXG4gICAgICAgICAgICAoLXBbMF0ueSArIDYgKiBwWzFdLnkgKyBwWzJdLnkpIC8gNixcbiAgICAgICAgICAgIChwWzFdLnggKyA2ICogcFsyXS54IC0gcFszXS54KSAvIDYsXG4gICAgICAgICAgICAocFsxXS55ICsgNiAqIHBbMl0ueSAtIHBbM10ueSkgLyA2LFxuICAgICAgICAgICAgcFsyXS54LFxuICAgICAgICAgICAgcFsyXS55LFxuICAgICAgICBdKTtcbiAgICB9XG4gICAgcmV0dXJuIGQ7XG59O1xudmFyIGVsbGlwc2VQYXRoID0gZnVuY3Rpb24gKHgsIHksIHJ4LCByeSwgYSkge1xuICAgIHZhciByZXMgPSBbXTtcbiAgICBpZiAoYSA9PT0gbnVsbCAmJiByeSA9PT0gbnVsbCkge1xuICAgICAgICByeSA9IHJ4O1xuICAgIH1cbiAgICB4ID0gK3g7XG4gICAgeSA9ICt5O1xuICAgIHJ4ID0gK3J4O1xuICAgIHJ5ID0gK3J5O1xuICAgIGlmIChhICE9PSBudWxsKSB7XG4gICAgICAgIHZhciByYWQgPSBNYXRoLlBJIC8gMTgwO1xuICAgICAgICB2YXIgeDEgPSB4ICsgcnggKiBNYXRoLmNvcygtcnkgKiByYWQpO1xuICAgICAgICB2YXIgeDIgPSB4ICsgcnggKiBNYXRoLmNvcygtYSAqIHJhZCk7XG4gICAgICAgIHZhciB5MSA9IHkgKyByeCAqIE1hdGguc2luKC1yeSAqIHJhZCk7XG4gICAgICAgIHZhciB5MiA9IHkgKyByeCAqIE1hdGguc2luKC1hICogcmFkKTtcbiAgICAgICAgcmVzID0gW1xuICAgICAgICAgICAgWydNJywgeDEsIHkxXSxcbiAgICAgICAgICAgIFsnQScsIHJ4LCByeCwgMCwgKyhhIC0gcnkgPiAxODApLCAwLCB4MiwgeTJdLFxuICAgICAgICBdO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmVzID0gW1snTScsIHgsIHldLCBbJ20nLCAwLCAtcnldLCBbJ2EnLCByeCwgcnksIDAsIDEsIDEsIDAsIDIgKiByeV0sIFsnYScsIHJ4LCByeSwgMCwgMSwgMSwgMCwgLTIgKiByeV0sIFsneiddXTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn07XG52YXIgcGF0aFRvQWJzb2x1dGUgPSBmdW5jdGlvbiAocGF0aEFycmF5KSB7XG4gICAgcGF0aEFycmF5ID0gcGFyc2VQYXRoU3RyaW5nKHBhdGhBcnJheSk7XG4gICAgaWYgKCFwYXRoQXJyYXkgfHwgIXBhdGhBcnJheS5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIFtbJ00nLCAwLCAwXV07XG4gICAgfVxuICAgIHZhciByZXMgPSBbXTtcbiAgICB2YXIgeCA9IDA7XG4gICAgdmFyIHkgPSAwO1xuICAgIHZhciBteCA9IDA7XG4gICAgdmFyIG15ID0gMDtcbiAgICB2YXIgc3RhcnQgPSAwO1xuICAgIHZhciBwYTA7XG4gICAgdmFyIGRvdHM7XG4gICAgaWYgKHBhdGhBcnJheVswXVswXSA9PT0gJ00nKSB7XG4gICAgICAgIHggPSArcGF0aEFycmF5WzBdWzFdO1xuICAgICAgICB5ID0gK3BhdGhBcnJheVswXVsyXTtcbiAgICAgICAgbXggPSB4O1xuICAgICAgICBteSA9IHk7XG4gICAgICAgIHN0YXJ0Kys7XG4gICAgICAgIHJlc1swXSA9IFsnTScsIHgsIHldO1xuICAgIH1cbiAgICB2YXIgY3J6ID0gcGF0aEFycmF5Lmxlbmd0aCA9PT0gMyAmJlxuICAgICAgICBwYXRoQXJyYXlbMF1bMF0gPT09ICdNJyAmJlxuICAgICAgICBwYXRoQXJyYXlbMV1bMF0udG9VcHBlckNhc2UoKSA9PT0gJ1InICYmXG4gICAgICAgIHBhdGhBcnJheVsyXVswXS50b1VwcGVyQ2FzZSgpID09PSAnWic7XG4gICAgZm9yICh2YXIgciA9IHZvaWQgMCwgcGEgPSB2b2lkIDAsIGkgPSBzdGFydCwgaWkgPSBwYXRoQXJyYXkubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgICByZXMucHVzaCgociA9IFtdKSk7XG4gICAgICAgIHBhID0gcGF0aEFycmF5W2ldO1xuICAgICAgICBwYTAgPSBwYVswXTtcbiAgICAgICAgaWYgKHBhMCAhPT0gcGEwLnRvVXBwZXJDYXNlKCkpIHtcbiAgICAgICAgICAgIHJbMF0gPSBwYTAudG9VcHBlckNhc2UoKTtcbiAgICAgICAgICAgIHN3aXRjaCAoclswXSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ0EnOlxuICAgICAgICAgICAgICAgICAgICByWzFdID0gcGFbMV07XG4gICAgICAgICAgICAgICAgICAgIHJbMl0gPSBwYVsyXTtcbiAgICAgICAgICAgICAgICAgICAgclszXSA9IHBhWzNdO1xuICAgICAgICAgICAgICAgICAgICByWzRdID0gcGFbNF07XG4gICAgICAgICAgICAgICAgICAgIHJbNV0gPSBwYVs1XTtcbiAgICAgICAgICAgICAgICAgICAgcls2XSA9ICtwYVs2XSArIHg7XG4gICAgICAgICAgICAgICAgICAgIHJbN10gPSArcGFbN10gKyB5O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdWJzpcbiAgICAgICAgICAgICAgICAgICAgclsxXSA9ICtwYVsxXSArIHk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ0gnOlxuICAgICAgICAgICAgICAgICAgICByWzFdID0gK3BhWzFdICsgeDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnUic6XG4gICAgICAgICAgICAgICAgICAgIGRvdHMgPSBbeCwgeV0uY29uY2F0KHBhLnNsaWNlKDEpKTtcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDIsIGpqID0gZG90cy5sZW5ndGg7IGogPCBqajsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb3RzW2pdID0gK2RvdHNbal0gKyB4O1xuICAgICAgICAgICAgICAgICAgICAgICAgZG90c1srK2pdID0gK2RvdHNbal0gKyB5O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJlcy5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzID0gcmVzLmNvbmNhdChjYXRtdWxsUm9tVG9CZXppZXIoZG90cywgY3J6KSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ08nOlxuICAgICAgICAgICAgICAgICAgICByZXMucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIGRvdHMgPSBlbGxpcHNlUGF0aCh4LCB5LCBwYVsxXSwgcGFbMl0pO1xuICAgICAgICAgICAgICAgICAgICBkb3RzLnB1c2goZG90c1swXSk7XG4gICAgICAgICAgICAgICAgICAgIHJlcyA9IHJlcy5jb25jYXQoZG90cyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ1UnOlxuICAgICAgICAgICAgICAgICAgICByZXMucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIHJlcyA9IHJlcy5jb25jYXQoZWxsaXBzZVBhdGgoeCwgeSwgcGFbMV0sIHBhWzJdLCBwYVszXSkpO1xuICAgICAgICAgICAgICAgICAgICByID0gWydVJ10uY29uY2F0KHJlc1tyZXMubGVuZ3RoIC0gMV0uc2xpY2UoLTIpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnTSc6XG4gICAgICAgICAgICAgICAgICAgIG14ID0gK3BhWzFdICsgeDtcbiAgICAgICAgICAgICAgICAgICAgbXkgPSArcGFbMl0gKyB5O1xuICAgICAgICAgICAgICAgICAgICBicmVhazsgLy8gZm9yIGxpbnRcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMSwgamogPSBwYS5sZW5ndGg7IGogPCBqajsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByW2pdID0gK3BhW2pdICsgKGogJSAyID8geCA6IHkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocGEwID09PSAnUicpIHtcbiAgICAgICAgICAgIGRvdHMgPSBbeCwgeV0uY29uY2F0KHBhLnNsaWNlKDEpKTtcbiAgICAgICAgICAgIHJlcy5wb3AoKTtcbiAgICAgICAgICAgIHJlcyA9IHJlcy5jb25jYXQoY2F0bXVsbFJvbVRvQmV6aWVyKGRvdHMsIGNyeikpO1xuICAgICAgICAgICAgciA9IFsnUiddLmNvbmNhdChwYS5zbGljZSgtMikpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHBhMCA9PT0gJ08nKSB7XG4gICAgICAgICAgICByZXMucG9wKCk7XG4gICAgICAgICAgICBkb3RzID0gZWxsaXBzZVBhdGgoeCwgeSwgcGFbMV0sIHBhWzJdKTtcbiAgICAgICAgICAgIGRvdHMucHVzaChkb3RzWzBdKTtcbiAgICAgICAgICAgIHJlcyA9IHJlcy5jb25jYXQoZG90cyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocGEwID09PSAnVScpIHtcbiAgICAgICAgICAgIHJlcy5wb3AoKTtcbiAgICAgICAgICAgIHJlcyA9IHJlcy5jb25jYXQoZWxsaXBzZVBhdGgoeCwgeSwgcGFbMV0sIHBhWzJdLCBwYVszXSkpO1xuICAgICAgICAgICAgciA9IFsnVSddLmNvbmNhdChyZXNbcmVzLmxlbmd0aCAtIDFdLnNsaWNlKC0yKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBmb3IgKHZhciBrID0gMCwga2sgPSBwYS5sZW5ndGg7IGsgPCBrazsgaysrKSB7XG4gICAgICAgICAgICAgICAgcltrXSA9IHBhW2tdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHBhMCA9IHBhMC50b1VwcGVyQ2FzZSgpO1xuICAgICAgICBpZiAocGEwICE9PSAnTycpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoclswXSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ1onOlxuICAgICAgICAgICAgICAgICAgICB4ID0gK214O1xuICAgICAgICAgICAgICAgICAgICB5ID0gK215O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdIJzpcbiAgICAgICAgICAgICAgICAgICAgeCA9IHJbMV07XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ1YnOlxuICAgICAgICAgICAgICAgICAgICB5ID0gclsxXTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnTSc6XG4gICAgICAgICAgICAgICAgICAgIG14ID0gcltyLmxlbmd0aCAtIDJdO1xuICAgICAgICAgICAgICAgICAgICBteSA9IHJbci5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7IC8vIGZvciBsaW50XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgeCA9IHJbci5sZW5ndGggLSAyXTtcbiAgICAgICAgICAgICAgICAgICAgeSA9IHJbci5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzO1xufTtcbnZhciBsMmMgPSBmdW5jdGlvbiAoeDEsIHkxLCB4MiwgeTIpIHtcbiAgICByZXR1cm4gW3gxLCB5MSwgeDIsIHkyLCB4MiwgeTJdO1xufTtcbnZhciBxMmMgPSBmdW5jdGlvbiAoeDEsIHkxLCBheCwgYXksIHgyLCB5Mikge1xuICAgIHZhciBfMTMgPSAxIC8gMztcbiAgICB2YXIgXzIzID0gMiAvIDM7XG4gICAgcmV0dXJuIFtfMTMgKiB4MSArIF8yMyAqIGF4LCBfMTMgKiB5MSArIF8yMyAqIGF5LCBfMTMgKiB4MiArIF8yMyAqIGF4LCBfMTMgKiB5MiArIF8yMyAqIGF5LCB4MiwgeTJdO1xufTtcbnZhciBhMmMgPSBmdW5jdGlvbiAoeDEsIHkxLCByeCwgcnksIGFuZ2xlLCBsYXJnZV9hcmNfZmxhZywgc3dlZXBfZmxhZywgeDIsIHkyLCByZWN1cnNpdmUpIHtcbiAgICAvLyBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvZiB3aGVyZSB0aGlzIG1hdGggY2FtZSBmcm9tIHZpc2l0OlxuICAgIC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL1NWRzExL2ltcGxub3RlLmh0bWwjQXJjSW1wbGVtZW50YXRpb25Ob3Rlc1xuICAgIGlmIChyeCA9PT0gcnkpIHtcbiAgICAgICAgcnggKz0gMTtcbiAgICB9XG4gICAgdmFyIF8xMjAgPSAoTWF0aC5QSSAqIDEyMCkgLyAxODA7XG4gICAgdmFyIHJhZCA9IChNYXRoLlBJIC8gMTgwKSAqICgrYW5nbGUgfHwgMCk7XG4gICAgdmFyIHJlcyA9IFtdO1xuICAgIHZhciB4eTtcbiAgICB2YXIgZjE7XG4gICAgdmFyIGYyO1xuICAgIHZhciBjeDtcbiAgICB2YXIgY3k7XG4gICAgdmFyIHJvdGF0ZSA9IGZ1bmN0aW9uICh4LCB5LCByYWQpIHtcbiAgICAgICAgdmFyIFggPSB4ICogTWF0aC5jb3MocmFkKSAtIHkgKiBNYXRoLnNpbihyYWQpO1xuICAgICAgICB2YXIgWSA9IHggKiBNYXRoLnNpbihyYWQpICsgeSAqIE1hdGguY29zKHJhZCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB4OiBYLFxuICAgICAgICAgICAgeTogWSxcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIGlmICghcmVjdXJzaXZlKSB7XG4gICAgICAgIHh5ID0gcm90YXRlKHgxLCB5MSwgLXJhZCk7XG4gICAgICAgIHgxID0geHkueDtcbiAgICAgICAgeTEgPSB4eS55O1xuICAgICAgICB4eSA9IHJvdGF0ZSh4MiwgeTIsIC1yYWQpO1xuICAgICAgICB4MiA9IHh5Lng7XG4gICAgICAgIHkyID0geHkueTtcbiAgICAgICAgaWYgKHgxID09PSB4MiAmJiB5MSA9PT0geTIpIHtcbiAgICAgICAgICAgIC8vIOiLpeW8p+eahOi1t+Wni+eCueWSjOe7iOeCuemHjeWPoOWImemUmeW8gOS4gOeCuVxuICAgICAgICAgICAgeDIgKz0gMTtcbiAgICAgICAgICAgIHkyICs9IDE7XG4gICAgICAgIH1cbiAgICAgICAgLy8gY29uc3QgY29zID0gTWF0aC5jb3MoTWF0aC5QSSAvIDE4MCAqIGFuZ2xlKTtcbiAgICAgICAgLy8gY29uc3Qgc2luID0gTWF0aC5zaW4oTWF0aC5QSSAvIDE4MCAqIGFuZ2xlKTtcbiAgICAgICAgdmFyIHggPSAoeDEgLSB4MikgLyAyO1xuICAgICAgICB2YXIgeSA9ICh5MSAtIHkyKSAvIDI7XG4gICAgICAgIHZhciBoID0gKHggKiB4KSAvIChyeCAqIHJ4KSArICh5ICogeSkgLyAocnkgKiByeSk7XG4gICAgICAgIGlmIChoID4gMSkge1xuICAgICAgICAgICAgaCA9IE1hdGguc3FydChoKTtcbiAgICAgICAgICAgIHJ4ID0gaCAqIHJ4O1xuICAgICAgICAgICAgcnkgPSBoICogcnk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHJ4MiA9IHJ4ICogcng7XG4gICAgICAgIHZhciByeTIgPSByeSAqIHJ5O1xuICAgICAgICB2YXIgayA9IChsYXJnZV9hcmNfZmxhZyA9PT0gc3dlZXBfZmxhZyA/IC0xIDogMSkgKlxuICAgICAgICAgICAgTWF0aC5zcXJ0KE1hdGguYWJzKChyeDIgKiByeTIgLSByeDIgKiB5ICogeSAtIHJ5MiAqIHggKiB4KSAvIChyeDIgKiB5ICogeSArIHJ5MiAqIHggKiB4KSkpO1xuICAgICAgICBjeCA9IChrICogcnggKiB5KSAvIHJ5ICsgKHgxICsgeDIpIC8gMjtcbiAgICAgICAgY3kgPSAoayAqIC1yeSAqIHgpIC8gcnggKyAoeTEgKyB5MikgLyAyO1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGYxID0gTWF0aC5hc2luKCgoeTEgLSBjeSkgLyByeSkudG9GaXhlZCg5KSk7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgZjIgPSBNYXRoLmFzaW4oKCh5MiAtIGN5KSAvIHJ5KS50b0ZpeGVkKDkpKTtcbiAgICAgICAgZjEgPSB4MSA8IGN4ID8gTWF0aC5QSSAtIGYxIDogZjE7XG4gICAgICAgIGYyID0geDIgPCBjeCA/IE1hdGguUEkgLSBmMiA6IGYyO1xuICAgICAgICBmMSA8IDAgJiYgKGYxID0gTWF0aC5QSSAqIDIgKyBmMSk7XG4gICAgICAgIGYyIDwgMCAmJiAoZjIgPSBNYXRoLlBJICogMiArIGYyKTtcbiAgICAgICAgaWYgKHN3ZWVwX2ZsYWcgJiYgZjEgPiBmMikge1xuICAgICAgICAgICAgZjEgPSBmMSAtIE1hdGguUEkgKiAyO1xuICAgICAgICB9XG4gICAgICAgIGlmICghc3dlZXBfZmxhZyAmJiBmMiA+IGYxKSB7XG4gICAgICAgICAgICBmMiA9IGYyIC0gTWF0aC5QSSAqIDI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGYxID0gcmVjdXJzaXZlWzBdO1xuICAgICAgICBmMiA9IHJlY3Vyc2l2ZVsxXTtcbiAgICAgICAgY3ggPSByZWN1cnNpdmVbMl07XG4gICAgICAgIGN5ID0gcmVjdXJzaXZlWzNdO1xuICAgIH1cbiAgICB2YXIgZGYgPSBmMiAtIGYxO1xuICAgIGlmIChNYXRoLmFicyhkZikgPiBfMTIwKSB7XG4gICAgICAgIHZhciBmMm9sZCA9IGYyO1xuICAgICAgICB2YXIgeDJvbGQgPSB4MjtcbiAgICAgICAgdmFyIHkyb2xkID0geTI7XG4gICAgICAgIGYyID0gZjEgKyBfMTIwICogKHN3ZWVwX2ZsYWcgJiYgZjIgPiBmMSA/IDEgOiAtMSk7XG4gICAgICAgIHgyID0gY3ggKyByeCAqIE1hdGguY29zKGYyKTtcbiAgICAgICAgeTIgPSBjeSArIHJ5ICogTWF0aC5zaW4oZjIpO1xuICAgICAgICByZXMgPSBhMmMoeDIsIHkyLCByeCwgcnksIGFuZ2xlLCAwLCBzd2VlcF9mbGFnLCB4Mm9sZCwgeTJvbGQsIFtmMiwgZjJvbGQsIGN4LCBjeV0pO1xuICAgIH1cbiAgICBkZiA9IGYyIC0gZjE7XG4gICAgdmFyIGMxID0gTWF0aC5jb3MoZjEpO1xuICAgIHZhciBzMSA9IE1hdGguc2luKGYxKTtcbiAgICB2YXIgYzIgPSBNYXRoLmNvcyhmMik7XG4gICAgdmFyIHMyID0gTWF0aC5zaW4oZjIpO1xuICAgIHZhciB0ID0gTWF0aC50YW4oZGYgLyA0KTtcbiAgICB2YXIgaHggPSAoNCAvIDMpICogcnggKiB0O1xuICAgIHZhciBoeSA9ICg0IC8gMykgKiByeSAqIHQ7XG4gICAgdmFyIG0xID0gW3gxLCB5MV07XG4gICAgdmFyIG0yID0gW3gxICsgaHggKiBzMSwgeTEgLSBoeSAqIGMxXTtcbiAgICB2YXIgbTMgPSBbeDIgKyBoeCAqIHMyLCB5MiAtIGh5ICogYzJdO1xuICAgIHZhciBtNCA9IFt4MiwgeTJdO1xuICAgIG0yWzBdID0gMiAqIG0xWzBdIC0gbTJbMF07XG4gICAgbTJbMV0gPSAyICogbTFbMV0gLSBtMlsxXTtcbiAgICBpZiAocmVjdXJzaXZlKSB7XG4gICAgICAgIHJldHVybiBbbTIsIG0zLCBtNF0uY29uY2F0KHJlcyk7XG4gICAgfVxuICAgIHJlcyA9IFttMiwgbTMsIG00XS5jb25jYXQocmVzKS5qb2luKCkuc3BsaXQoJywnKTtcbiAgICB2YXIgbmV3cmVzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDAsIGlpID0gcmVzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgICAgbmV3cmVzW2ldID0gaSAlIDIgPyByb3RhdGUocmVzW2kgLSAxXSwgcmVzW2ldLCByYWQpLnkgOiByb3RhdGUocmVzW2ldLCByZXNbaSArIDFdLCByYWQpLng7XG4gICAgfVxuICAgIHJldHVybiBuZXdyZXM7XG59O1xudmFyIHBhdGhUb0N1cnZlID0gZnVuY3Rpb24gKHBhdGgsIHBhdGgyKSB7XG4gICAgdmFyIHAgPSBwYXRoVG9BYnNvbHV0ZShwYXRoKTtcbiAgICB2YXIgcDIgPSBwYXRoMiAmJiBwYXRoVG9BYnNvbHV0ZShwYXRoMik7XG4gICAgdmFyIGF0dHJzID0ge1xuICAgICAgICB4OiAwLFxuICAgICAgICB5OiAwLFxuICAgICAgICBieDogMCxcbiAgICAgICAgYnk6IDAsXG4gICAgICAgIFg6IDAsXG4gICAgICAgIFk6IDAsXG4gICAgICAgIHF4OiBudWxsLFxuICAgICAgICBxeTogbnVsbCxcbiAgICB9O1xuICAgIHZhciBhdHRyczIgPSB7XG4gICAgICAgIHg6IDAsXG4gICAgICAgIHk6IDAsXG4gICAgICAgIGJ4OiAwLFxuICAgICAgICBieTogMCxcbiAgICAgICAgWDogMCxcbiAgICAgICAgWTogMCxcbiAgICAgICAgcXg6IG51bGwsXG4gICAgICAgIHF5OiBudWxsLFxuICAgIH07XG4gICAgdmFyIHBjb21zMSA9IFtdOyAvLyBwYXRoIGNvbW1hbmRzIG9mIG9yaWdpbmFsIHBhdGggcFxuICAgIHZhciBwY29tczIgPSBbXTsgLy8gcGF0aCBjb21tYW5kcyBvZiBvcmlnaW5hbCBwYXRoIHAyXG4gICAgdmFyIHBmaXJzdCA9ICcnOyAvLyB0ZW1wb3JhcnkgaG9sZGVyIGZvciBvcmlnaW5hbCBwYXRoIGNvbW1hbmRcbiAgICB2YXIgcGNvbSA9ICcnOyAvLyBob2xkZXIgZm9yIHByZXZpb3VzIHBhdGggY29tbWFuZCBvZiBvcmlnaW5hbCBwYXRoXG4gICAgdmFyIGlpO1xuICAgIHZhciBwcm9jZXNzUGF0aCA9IGZ1bmN0aW9uIChwYXRoLCBkLCBwY29tKSB7XG4gICAgICAgIHZhciBueDtcbiAgICAgICAgdmFyIG55O1xuICAgICAgICBpZiAoIXBhdGgpIHtcbiAgICAgICAgICAgIHJldHVybiBbJ0MnLCBkLngsIGQueSwgZC54LCBkLnksIGQueCwgZC55XTtcbiAgICAgICAgfVxuICAgICAgICAhKHBhdGhbMF0gaW5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBUOiAxLFxuICAgICAgICAgICAgICAgIFE6IDEsXG4gICAgICAgICAgICB9KSAmJiAoZC5xeCA9IGQucXkgPSBudWxsKTtcbiAgICAgICAgc3dpdGNoIChwYXRoWzBdKSB7XG4gICAgICAgICAgICBjYXNlICdNJzpcbiAgICAgICAgICAgICAgICBkLlggPSBwYXRoWzFdO1xuICAgICAgICAgICAgICAgIGQuWSA9IHBhdGhbMl07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdBJzpcbiAgICAgICAgICAgICAgICBwYXRoID0gWydDJ10uY29uY2F0KGEyYy5hcHBseSgwLCBbZC54LCBkLnldLmNvbmNhdChwYXRoLnNsaWNlKDEpKSkpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnUyc6XG4gICAgICAgICAgICAgICAgaWYgKHBjb20gPT09ICdDJyB8fCBwY29tID09PSAnUycpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSW4gXCJTXCIgY2FzZSB3ZSBoYXZlIHRvIHRha2UgaW50byBhY2NvdW50LCBpZiB0aGUgcHJldmlvdXMgY29tbWFuZCBpcyBDL1MuXG4gICAgICAgICAgICAgICAgICAgIG54ID0gZC54ICogMiAtIGQuYng7IC8vIEFuZCByZWZsZWN0IHRoZSBwcmV2aW91c1xuICAgICAgICAgICAgICAgICAgICBueSA9IGQueSAqIDIgLSBkLmJ5OyAvLyBjb21tYW5kJ3MgY29udHJvbCBwb2ludCByZWxhdGl2ZSB0byB0aGUgY3VycmVudCBwb2ludC5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIG9yIHNvbWUgZWxzZSBvciBub3RoaW5nXG4gICAgICAgICAgICAgICAgICAgIG54ID0gZC54O1xuICAgICAgICAgICAgICAgICAgICBueSA9IGQueTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcGF0aCA9IFsnQycsIG54LCBueV0uY29uY2F0KHBhdGguc2xpY2UoMSkpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnVCc6XG4gICAgICAgICAgICAgICAgaWYgKHBjb20gPT09ICdRJyB8fCBwY29tID09PSAnVCcpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSW4gXCJUXCIgY2FzZSB3ZSBoYXZlIHRvIHRha2UgaW50byBhY2NvdW50LCBpZiB0aGUgcHJldmlvdXMgY29tbWFuZCBpcyBRL1QuXG4gICAgICAgICAgICAgICAgICAgIGQucXggPSBkLnggKiAyIC0gZC5xeDsgLy8gQW5kIG1ha2UgYSByZWZsZWN0aW9uIHNpbWlsYXJcbiAgICAgICAgICAgICAgICAgICAgZC5xeSA9IGQueSAqIDIgLSBkLnF5OyAvLyB0byBjYXNlIFwiU1wiLlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gb3Igc29tZXRoaW5nIGVsc2Ugb3Igbm90aGluZ1xuICAgICAgICAgICAgICAgICAgICBkLnF4ID0gZC54O1xuICAgICAgICAgICAgICAgICAgICBkLnF5ID0gZC55O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwYXRoID0gWydDJ10uY29uY2F0KHEyYyhkLngsIGQueSwgZC5xeCwgZC5xeSwgcGF0aFsxXSwgcGF0aFsyXSkpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnUSc6XG4gICAgICAgICAgICAgICAgZC5xeCA9IHBhdGhbMV07XG4gICAgICAgICAgICAgICAgZC5xeSA9IHBhdGhbMl07XG4gICAgICAgICAgICAgICAgcGF0aCA9IFsnQyddLmNvbmNhdChxMmMoZC54LCBkLnksIHBhdGhbMV0sIHBhdGhbMl0sIHBhdGhbM10sIHBhdGhbNF0pKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0wnOlxuICAgICAgICAgICAgICAgIHBhdGggPSBbJ0MnXS5jb25jYXQobDJjKGQueCwgZC55LCBwYXRoWzFdLCBwYXRoWzJdKSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdIJzpcbiAgICAgICAgICAgICAgICBwYXRoID0gWydDJ10uY29uY2F0KGwyYyhkLngsIGQueSwgcGF0aFsxXSwgZC55KSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdWJzpcbiAgICAgICAgICAgICAgICBwYXRoID0gWydDJ10uY29uY2F0KGwyYyhkLngsIGQueSwgZC54LCBwYXRoWzFdKSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdaJzpcbiAgICAgICAgICAgICAgICBwYXRoID0gWydDJ10uY29uY2F0KGwyYyhkLngsIGQueSwgZC5YLCBkLlkpKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhdGg7XG4gICAgfTtcbiAgICB2YXIgZml4QXJjID0gZnVuY3Rpb24gKHBwLCBpKSB7XG4gICAgICAgIGlmIChwcFtpXS5sZW5ndGggPiA3KSB7XG4gICAgICAgICAgICBwcFtpXS5zaGlmdCgpO1xuICAgICAgICAgICAgdmFyIHBpID0gcHBbaV07XG4gICAgICAgICAgICB3aGlsZSAocGkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgcGNvbXMxW2ldID0gJ0EnOyAvLyBpZiBjcmVhdGVkIG11bHRpcGxlIEM6cywgdGhlaXIgb3JpZ2luYWwgc2VnIGlzIHNhdmVkXG4gICAgICAgICAgICAgICAgcDIgJiYgKHBjb21zMltpXSA9ICdBJyk7IC8vIHRoZSBzYW1lIGFzIGFib3ZlXG4gICAgICAgICAgICAgICAgcHAuc3BsaWNlKGkrKywgMCwgWydDJ10uY29uY2F0KHBpLnNwbGljZSgwLCA2KSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcHAuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgaWkgPSBNYXRoLm1heChwLmxlbmd0aCwgKHAyICYmIHAyLmxlbmd0aCkgfHwgMCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHZhciBmaXhNID0gZnVuY3Rpb24gKHBhdGgxLCBwYXRoMiwgYTEsIGEyLCBpKSB7XG4gICAgICAgIGlmIChwYXRoMSAmJiBwYXRoMiAmJiBwYXRoMVtpXVswXSA9PT0gJ00nICYmIHBhdGgyW2ldWzBdICE9PSAnTScpIHtcbiAgICAgICAgICAgIHBhdGgyLnNwbGljZShpLCAwLCBbJ00nLCBhMi54LCBhMi55XSk7XG4gICAgICAgICAgICBhMS5ieCA9IDA7XG4gICAgICAgICAgICBhMS5ieSA9IDA7XG4gICAgICAgICAgICBhMS54ID0gcGF0aDFbaV1bMV07XG4gICAgICAgICAgICBhMS55ID0gcGF0aDFbaV1bMl07XG4gICAgICAgICAgICBpaSA9IE1hdGgubWF4KHAubGVuZ3RoLCAocDIgJiYgcDIubGVuZ3RoKSB8fCAwKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgaWkgPSBNYXRoLm1heChwLmxlbmd0aCwgKHAyICYmIHAyLmxlbmd0aCkgfHwgMCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpaTsgaSsrKSB7XG4gICAgICAgIHBbaV0gJiYgKHBmaXJzdCA9IHBbaV1bMF0pOyAvLyBzYXZlIGN1cnJlbnQgcGF0aCBjb21tYW5kXG4gICAgICAgIGlmIChwZmlyc3QgIT09ICdDJykge1xuICAgICAgICAgICAgLy8gQyBpcyBub3Qgc2F2ZWQgeWV0LCBiZWNhdXNlIGl0IG1heSBiZSByZXN1bHQgb2YgY29udmVyc2lvblxuICAgICAgICAgICAgcGNvbXMxW2ldID0gcGZpcnN0OyAvLyBTYXZlIGN1cnJlbnQgcGF0aCBjb21tYW5kXG4gICAgICAgICAgICBpICYmIChwY29tID0gcGNvbXMxW2kgLSAxXSk7IC8vIEdldCBwcmV2aW91cyBwYXRoIGNvbW1hbmQgcGNvbVxuICAgICAgICB9XG4gICAgICAgIHBbaV0gPSBwcm9jZXNzUGF0aChwW2ldLCBhdHRycywgcGNvbSk7IC8vIFByZXZpb3VzIHBhdGggY29tbWFuZCBpcyBpbnB1dHRlZCB0byBwcm9jZXNzUGF0aFxuICAgICAgICBpZiAocGNvbXMxW2ldICE9PSAnQScgJiYgcGZpcnN0ID09PSAnQycpXG4gICAgICAgICAgICBwY29tczFbaV0gPSAnQyc7IC8vIEEgaXMgdGhlIG9ubHkgY29tbWFuZFxuICAgICAgICAvLyB3aGljaCBtYXkgcHJvZHVjZSBtdWx0aXBsZSBDOnNcbiAgICAgICAgLy8gc28gd2UgaGF2ZSB0byBtYWtlIHN1cmUgdGhhdCBDIGlzIGFsc28gQyBpbiBvcmlnaW5hbCBwYXRoXG4gICAgICAgIGZpeEFyYyhwLCBpKTsgLy8gZml4QXJjIGFkZHMgYWxzbyB0aGUgcmlnaHQgYW1vdW50IG9mIEE6cyB0byBwY29tczFcbiAgICAgICAgaWYgKHAyKSB7XG4gICAgICAgICAgICAvLyB0aGUgc2FtZSBwcm9jZWR1cmVzIGlzIGRvbmUgdG8gcDJcbiAgICAgICAgICAgIHAyW2ldICYmIChwZmlyc3QgPSBwMltpXVswXSk7XG4gICAgICAgICAgICBpZiAocGZpcnN0ICE9PSAnQycpIHtcbiAgICAgICAgICAgICAgICBwY29tczJbaV0gPSBwZmlyc3Q7XG4gICAgICAgICAgICAgICAgaSAmJiAocGNvbSA9IHBjb21zMltpIC0gMV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcDJbaV0gPSBwcm9jZXNzUGF0aChwMltpXSwgYXR0cnMyLCBwY29tKTtcbiAgICAgICAgICAgIGlmIChwY29tczJbaV0gIT09ICdBJyAmJiBwZmlyc3QgPT09ICdDJykge1xuICAgICAgICAgICAgICAgIHBjb21zMltpXSA9ICdDJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpeEFyYyhwMiwgaSk7XG4gICAgICAgIH1cbiAgICAgICAgZml4TShwLCBwMiwgYXR0cnMsIGF0dHJzMiwgaSk7XG4gICAgICAgIGZpeE0ocDIsIHAsIGF0dHJzMiwgYXR0cnMsIGkpO1xuICAgICAgICB2YXIgc2VnID0gcFtpXTtcbiAgICAgICAgdmFyIHNlZzIgPSBwMiAmJiBwMltpXTtcbiAgICAgICAgdmFyIHNlZ2xlbiA9IHNlZy5sZW5ndGg7XG4gICAgICAgIHZhciBzZWcybGVuID0gcDIgJiYgc2VnMi5sZW5ndGg7XG4gICAgICAgIGF0dHJzLnggPSBzZWdbc2VnbGVuIC0gMl07XG4gICAgICAgIGF0dHJzLnkgPSBzZWdbc2VnbGVuIC0gMV07XG4gICAgICAgIGF0dHJzLmJ4ID0gcGFyc2VGbG9hdChzZWdbc2VnbGVuIC0gNF0pIHx8IGF0dHJzLng7XG4gICAgICAgIGF0dHJzLmJ5ID0gcGFyc2VGbG9hdChzZWdbc2VnbGVuIC0gM10pIHx8IGF0dHJzLnk7XG4gICAgICAgIGF0dHJzMi5ieCA9IHAyICYmIChwYXJzZUZsb2F0KHNlZzJbc2VnMmxlbiAtIDRdKSB8fCBhdHRyczIueCk7XG4gICAgICAgIGF0dHJzMi5ieSA9IHAyICYmIChwYXJzZUZsb2F0KHNlZzJbc2VnMmxlbiAtIDNdKSB8fCBhdHRyczIueSk7XG4gICAgICAgIGF0dHJzMi54ID0gcDIgJiYgc2VnMltzZWcybGVuIC0gMl07XG4gICAgICAgIGF0dHJzMi55ID0gcDIgJiYgc2VnMltzZWcybGVuIC0gMV07XG4gICAgfVxuICAgIHJldHVybiBwMiA/IFtwLCBwMl0gOiBwO1xufTtcbnZhciBwMnMgPSAvLD8oW2Etel0pLD8vZ2k7XG52YXIgcGFyc2VQYXRoQXJyYXkgPSBmdW5jdGlvbiAocGF0aCkge1xuICAgIHJldHVybiBwYXRoLmpvaW4oJywnKS5yZXBsYWNlKHAycywgJyQxJyk7XG59O1xudmFyIGJhc2UzID0gZnVuY3Rpb24gKHQsIHAxLCBwMiwgcDMsIHA0KSB7XG4gICAgdmFyIHQxID0gLTMgKiBwMSArIDkgKiBwMiAtIDkgKiBwMyArIDMgKiBwNDtcbiAgICB2YXIgdDIgPSB0ICogdDEgKyA2ICogcDEgLSAxMiAqIHAyICsgNiAqIHAzO1xuICAgIHJldHVybiB0ICogdDIgLSAzICogcDEgKyAzICogcDI7XG59O1xudmFyIGJlemxlbiA9IGZ1bmN0aW9uICh4MSwgeTEsIHgyLCB5MiwgeDMsIHkzLCB4NCwgeTQsIHopIHtcbiAgICBpZiAoeiA9PT0gbnVsbCkge1xuICAgICAgICB6ID0gMTtcbiAgICB9XG4gICAgeiA9IHogPiAxID8gMSA6IHogPCAwID8gMCA6IHo7XG4gICAgdmFyIHoyID0geiAvIDI7XG4gICAgdmFyIG4gPSAxMjtcbiAgICB2YXIgVHZhbHVlcyA9IFtcbiAgICAgICAgLTAuMTI1MixcbiAgICAgICAgMC4xMjUyLFxuICAgICAgICAtMC4zNjc4LFxuICAgICAgICAwLjM2NzgsXG4gICAgICAgIC0wLjU4NzMsXG4gICAgICAgIDAuNTg3MyxcbiAgICAgICAgLTAuNzY5OSxcbiAgICAgICAgMC43Njk5LFxuICAgICAgICAtMC45MDQxLFxuICAgICAgICAwLjkwNDEsXG4gICAgICAgIC0wLjk4MTYsXG4gICAgICAgIDAuOTgxNixcbiAgICBdO1xuICAgIHZhciBDdmFsdWVzID0gWzAuMjQ5MSwgMC4yNDkxLCAwLjIzMzUsIDAuMjMzNSwgMC4yMDMyLCAwLjIwMzIsIDAuMTYwMSwgMC4xNjAxLCAwLjEwNjksIDAuMTA2OSwgMC4wNDcyLCAwLjA0NzJdO1xuICAgIHZhciBzdW0gPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgIHZhciBjdCA9IHoyICogVHZhbHVlc1tpXSArIHoyO1xuICAgICAgICB2YXIgeGJhc2UgPSBiYXNlMyhjdCwgeDEsIHgyLCB4MywgeDQpO1xuICAgICAgICB2YXIgeWJhc2UgPSBiYXNlMyhjdCwgeTEsIHkyLCB5MywgeTQpO1xuICAgICAgICB2YXIgY29tYiA9IHhiYXNlICogeGJhc2UgKyB5YmFzZSAqIHliYXNlO1xuICAgICAgICBzdW0gKz0gQ3ZhbHVlc1tpXSAqIE1hdGguc3FydChjb21iKTtcbiAgICB9XG4gICAgcmV0dXJuIHoyICogc3VtO1xufTtcbnZhciBjdXJ2ZURpbSA9IGZ1bmN0aW9uICh4MCwgeTAsIHgxLCB5MSwgeDIsIHkyLCB4MywgeTMpIHtcbiAgICB2YXIgdHZhbHVlcyA9IFtdO1xuICAgIHZhciBib3VuZHMgPSBbW10sIFtdXTtcbiAgICB2YXIgYTtcbiAgICB2YXIgYjtcbiAgICB2YXIgYztcbiAgICB2YXIgdDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IDI7ICsraSkge1xuICAgICAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgICAgICAgYiA9IDYgKiB4MCAtIDEyICogeDEgKyA2ICogeDI7XG4gICAgICAgICAgICBhID0gLTMgKiB4MCArIDkgKiB4MSAtIDkgKiB4MiArIDMgKiB4MztcbiAgICAgICAgICAgIGMgPSAzICogeDEgLSAzICogeDA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBiID0gNiAqIHkwIC0gMTIgKiB5MSArIDYgKiB5MjtcbiAgICAgICAgICAgIGEgPSAtMyAqIHkwICsgOSAqIHkxIC0gOSAqIHkyICsgMyAqIHkzO1xuICAgICAgICAgICAgYyA9IDMgKiB5MSAtIDMgKiB5MDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoTWF0aC5hYnMoYSkgPCAxZS0xMikge1xuICAgICAgICAgICAgaWYgKE1hdGguYWJzKGIpIDwgMWUtMTIpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHQgPSAtYyAvIGI7XG4gICAgICAgICAgICBpZiAodCA+IDAgJiYgdCA8IDEpIHtcbiAgICAgICAgICAgICAgICB0dmFsdWVzLnB1c2godCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgYjJhYyA9IGIgKiBiIC0gNCAqIGMgKiBhO1xuICAgICAgICB2YXIgc3FydGIyYWMgPSBNYXRoLnNxcnQoYjJhYyk7XG4gICAgICAgIGlmIChiMmFjIDwgMCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHQxID0gKC1iICsgc3FydGIyYWMpIC8gKDIgKiBhKTtcbiAgICAgICAgaWYgKHQxID4gMCAmJiB0MSA8IDEpIHtcbiAgICAgICAgICAgIHR2YWx1ZXMucHVzaCh0MSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHQyID0gKC1iIC0gc3FydGIyYWMpIC8gKDIgKiBhKTtcbiAgICAgICAgaWYgKHQyID4gMCAmJiB0MiA8IDEpIHtcbiAgICAgICAgICAgIHR2YWx1ZXMucHVzaCh0Mik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmFyIGogPSB0dmFsdWVzLmxlbmd0aDtcbiAgICB2YXIgamxlbiA9IGo7XG4gICAgdmFyIG10O1xuICAgIHdoaWxlIChqLS0pIHtcbiAgICAgICAgdCA9IHR2YWx1ZXNbal07XG4gICAgICAgIG10ID0gMSAtIHQ7XG4gICAgICAgIGJvdW5kc1swXVtqXSA9IG10ICogbXQgKiBtdCAqIHgwICsgMyAqIG10ICogbXQgKiB0ICogeDEgKyAzICogbXQgKiB0ICogdCAqIHgyICsgdCAqIHQgKiB0ICogeDM7XG4gICAgICAgIGJvdW5kc1sxXVtqXSA9IG10ICogbXQgKiBtdCAqIHkwICsgMyAqIG10ICogbXQgKiB0ICogeTEgKyAzICogbXQgKiB0ICogdCAqIHkyICsgdCAqIHQgKiB0ICogeTM7XG4gICAgfVxuICAgIGJvdW5kc1swXVtqbGVuXSA9IHgwO1xuICAgIGJvdW5kc1sxXVtqbGVuXSA9IHkwO1xuICAgIGJvdW5kc1swXVtqbGVuICsgMV0gPSB4MztcbiAgICBib3VuZHNbMV1bamxlbiArIDFdID0geTM7XG4gICAgYm91bmRzWzBdLmxlbmd0aCA9IGJvdW5kc1sxXS5sZW5ndGggPSBqbGVuICsgMjtcbiAgICByZXR1cm4ge1xuICAgICAgICBtaW46IHtcbiAgICAgICAgICAgIHg6IE1hdGgubWluLmFwcGx5KDAsIGJvdW5kc1swXSksXG4gICAgICAgICAgICB5OiBNYXRoLm1pbi5hcHBseSgwLCBib3VuZHNbMV0pLFxuICAgICAgICB9LFxuICAgICAgICBtYXg6IHtcbiAgICAgICAgICAgIHg6IE1hdGgubWF4LmFwcGx5KDAsIGJvdW5kc1swXSksXG4gICAgICAgICAgICB5OiBNYXRoLm1heC5hcHBseSgwLCBib3VuZHNbMV0pLFxuICAgICAgICB9LFxuICAgIH07XG59O1xudmFyIGludGVyc2VjdCA9IGZ1bmN0aW9uICh4MSwgeTEsIHgyLCB5MiwgeDMsIHkzLCB4NCwgeTQpIHtcbiAgICBpZiAoTWF0aC5tYXgoeDEsIHgyKSA8IE1hdGgubWluKHgzLCB4NCkgfHxcbiAgICAgICAgTWF0aC5taW4oeDEsIHgyKSA+IE1hdGgubWF4KHgzLCB4NCkgfHxcbiAgICAgICAgTWF0aC5tYXgoeTEsIHkyKSA8IE1hdGgubWluKHkzLCB5NCkgfHxcbiAgICAgICAgTWF0aC5taW4oeTEsIHkyKSA+IE1hdGgubWF4KHkzLCB5NCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgbnggPSAoeDEgKiB5MiAtIHkxICogeDIpICogKHgzIC0geDQpIC0gKHgxIC0geDIpICogKHgzICogeTQgLSB5MyAqIHg0KTtcbiAgICB2YXIgbnkgPSAoeDEgKiB5MiAtIHkxICogeDIpICogKHkzIC0geTQpIC0gKHkxIC0geTIpICogKHgzICogeTQgLSB5MyAqIHg0KTtcbiAgICB2YXIgZGVub21pbmF0b3IgPSAoeDEgLSB4MikgKiAoeTMgLSB5NCkgLSAoeTEgLSB5MikgKiAoeDMgLSB4NCk7XG4gICAgaWYgKCFkZW5vbWluYXRvcikge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBweCA9IG54IC8gZGVub21pbmF0b3I7XG4gICAgdmFyIHB5ID0gbnkgLyBkZW5vbWluYXRvcjtcbiAgICB2YXIgcHgyID0gK3B4LnRvRml4ZWQoMik7XG4gICAgdmFyIHB5MiA9ICtweS50b0ZpeGVkKDIpO1xuICAgIGlmIChweDIgPCArTWF0aC5taW4oeDEsIHgyKS50b0ZpeGVkKDIpIHx8XG4gICAgICAgIHB4MiA+ICtNYXRoLm1heCh4MSwgeDIpLnRvRml4ZWQoMikgfHxcbiAgICAgICAgcHgyIDwgK01hdGgubWluKHgzLCB4NCkudG9GaXhlZCgyKSB8fFxuICAgICAgICBweDIgPiArTWF0aC5tYXgoeDMsIHg0KS50b0ZpeGVkKDIpIHx8XG4gICAgICAgIHB5MiA8ICtNYXRoLm1pbih5MSwgeTIpLnRvRml4ZWQoMikgfHxcbiAgICAgICAgcHkyID4gK01hdGgubWF4KHkxLCB5MikudG9GaXhlZCgyKSB8fFxuICAgICAgICBweTIgPCArTWF0aC5taW4oeTMsIHk0KS50b0ZpeGVkKDIpIHx8XG4gICAgICAgIHB5MiA+ICtNYXRoLm1heCh5MywgeTQpLnRvRml4ZWQoMikpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICB4OiBweCxcbiAgICAgICAgeTogcHksXG4gICAgfTtcbn07XG52YXIgaXNQb2ludEluc2lkZUJCb3ggPSBmdW5jdGlvbiAoYmJveCwgeCwgeSkge1xuICAgIHJldHVybiB4ID49IGJib3gueCAmJiB4IDw9IGJib3gueCArIGJib3gud2lkdGggJiYgeSA+PSBiYm94LnkgJiYgeSA8PSBiYm94LnkgKyBiYm94LmhlaWdodDtcbn07XG52YXIgcmVjdFBhdGggPSBmdW5jdGlvbiAoeCwgeSwgdywgaCwgcikge1xuICAgIGlmIChyKSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBbJ00nLCAreCArICtyLCB5XSxcbiAgICAgICAgICAgIFsnbCcsIHcgLSByICogMiwgMF0sXG4gICAgICAgICAgICBbJ2EnLCByLCByLCAwLCAwLCAxLCByLCByXSxcbiAgICAgICAgICAgIFsnbCcsIDAsIGggLSByICogMl0sXG4gICAgICAgICAgICBbJ2EnLCByLCByLCAwLCAwLCAxLCAtciwgcl0sXG4gICAgICAgICAgICBbJ2wnLCByICogMiAtIHcsIDBdLFxuICAgICAgICAgICAgWydhJywgciwgciwgMCwgMCwgMSwgLXIsIC1yXSxcbiAgICAgICAgICAgIFsnbCcsIDAsIHIgKiAyIC0gaF0sXG4gICAgICAgICAgICBbJ2EnLCByLCByLCAwLCAwLCAxLCByLCAtcl0sXG4gICAgICAgICAgICBbJ3onXSxcbiAgICAgICAgXTtcbiAgICB9XG4gICAgdmFyIHJlcyA9IFtbJ00nLCB4LCB5XSwgWydsJywgdywgMF0sIFsnbCcsIDAsIGhdLCBbJ2wnLCAtdywgMF0sIFsneiddXTtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgcmVzLnBhcnNlUGF0aEFycmF5ID0gcGFyc2VQYXRoQXJyYXk7XG4gICAgcmV0dXJuIHJlcztcbn07XG52YXIgYm94ID0gZnVuY3Rpb24gKHgsIHksIHdpZHRoLCBoZWlnaHQpIHtcbiAgICBpZiAoeCA9PT0gbnVsbCkge1xuICAgICAgICB4ID0geSA9IHdpZHRoID0gaGVpZ2h0ID0gMDtcbiAgICB9XG4gICAgaWYgKHkgPT09IG51bGwpIHtcbiAgICAgICAgeSA9IHgueTtcbiAgICAgICAgd2lkdGggPSB4LndpZHRoO1xuICAgICAgICBoZWlnaHQgPSB4LmhlaWdodDtcbiAgICAgICAgeCA9IHgueDtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgeDogeCxcbiAgICAgICAgeTogeSxcbiAgICAgICAgd2lkdGg6IHdpZHRoLFxuICAgICAgICB3OiB3aWR0aCxcbiAgICAgICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgICAgIGg6IGhlaWdodCxcbiAgICAgICAgeDI6IHggKyB3aWR0aCxcbiAgICAgICAgeTI6IHkgKyBoZWlnaHQsXG4gICAgICAgIGN4OiB4ICsgd2lkdGggLyAyLFxuICAgICAgICBjeTogeSArIGhlaWdodCAvIDIsXG4gICAgICAgIHIxOiBNYXRoLm1pbih3aWR0aCwgaGVpZ2h0KSAvIDIsXG4gICAgICAgIHIyOiBNYXRoLm1heCh3aWR0aCwgaGVpZ2h0KSAvIDIsXG4gICAgICAgIHIwOiBNYXRoLnNxcnQod2lkdGggKiB3aWR0aCArIGhlaWdodCAqIGhlaWdodCkgLyAyLFxuICAgICAgICBwYXRoOiByZWN0UGF0aCh4LCB5LCB3aWR0aCwgaGVpZ2h0KSxcbiAgICAgICAgdmI6IFt4LCB5LCB3aWR0aCwgaGVpZ2h0XS5qb2luKCcgJyksXG4gICAgfTtcbn07XG52YXIgaXNCQm94SW50ZXJzZWN0ID0gZnVuY3Rpb24gKGJib3gxLCBiYm94Mikge1xuICAgIGJib3gxID0gYm94KGJib3gxKTtcbiAgICBiYm94MiA9IGJveChiYm94Mik7XG4gICAgcmV0dXJuIChpc1BvaW50SW5zaWRlQkJveChiYm94MiwgYmJveDEueCwgYmJveDEueSkgfHxcbiAgICAgICAgaXNQb2ludEluc2lkZUJCb3goYmJveDIsIGJib3gxLngyLCBiYm94MS55KSB8fFxuICAgICAgICBpc1BvaW50SW5zaWRlQkJveChiYm94MiwgYmJveDEueCwgYmJveDEueTIpIHx8XG4gICAgICAgIGlzUG9pbnRJbnNpZGVCQm94KGJib3gyLCBiYm94MS54MiwgYmJveDEueTIpIHx8XG4gICAgICAgIGlzUG9pbnRJbnNpZGVCQm94KGJib3gxLCBiYm94Mi54LCBiYm94Mi55KSB8fFxuICAgICAgICBpc1BvaW50SW5zaWRlQkJveChiYm94MSwgYmJveDIueDIsIGJib3gyLnkpIHx8XG4gICAgICAgIGlzUG9pbnRJbnNpZGVCQm94KGJib3gxLCBiYm94Mi54LCBiYm94Mi55MikgfHxcbiAgICAgICAgaXNQb2ludEluc2lkZUJCb3goYmJveDEsIGJib3gyLngyLCBiYm94Mi55MikgfHxcbiAgICAgICAgKCgoYmJveDEueCA8IGJib3gyLngyICYmIGJib3gxLnggPiBiYm94Mi54KSB8fCAoYmJveDIueCA8IGJib3gxLngyICYmIGJib3gyLnggPiBiYm94MS54KSkgJiZcbiAgICAgICAgICAgICgoYmJveDEueSA8IGJib3gyLnkyICYmIGJib3gxLnkgPiBiYm94Mi55KSB8fCAoYmJveDIueSA8IGJib3gxLnkyICYmIGJib3gyLnkgPiBiYm94MS55KSkpKTtcbn07XG52YXIgYmV6aWVyQkJveCA9IGZ1bmN0aW9uIChwMXgsIHAxeSwgYzF4LCBjMXksIGMyeCwgYzJ5LCBwMngsIHAyeSkge1xuICAgIGlmICghaXNBcnJheShwMXgpKSB7XG4gICAgICAgIHAxeCA9IFtwMXgsIHAxeSwgYzF4LCBjMXksIGMyeCwgYzJ5LCBwMngsIHAyeV07XG4gICAgfVxuICAgIHZhciBiYm94ID0gY3VydmVEaW0uYXBwbHkobnVsbCwgcDF4KTtcbiAgICByZXR1cm4gYm94KGJib3gubWluLngsIGJib3gubWluLnksIGJib3gubWF4LnggLSBiYm94Lm1pbi54LCBiYm94Lm1heC55IC0gYmJveC5taW4ueSk7XG59O1xudmFyIGZpbmREb3RzQXRTZWdtZW50ID0gZnVuY3Rpb24gKHAxeCwgcDF5LCBjMXgsIGMxeSwgYzJ4LCBjMnksIHAyeCwgcDJ5LCB0KSB7XG4gICAgdmFyIHQxID0gMSAtIHQ7XG4gICAgdmFyIHQxMyA9IE1hdGgucG93KHQxLCAzKTtcbiAgICB2YXIgdDEyID0gTWF0aC5wb3codDEsIDIpO1xuICAgIHZhciB0MiA9IHQgKiB0O1xuICAgIHZhciB0MyA9IHQyICogdDtcbiAgICB2YXIgeCA9IHQxMyAqIHAxeCArIHQxMiAqIDMgKiB0ICogYzF4ICsgdDEgKiAzICogdCAqIHQgKiBjMnggKyB0MyAqIHAyeDtcbiAgICB2YXIgeSA9IHQxMyAqIHAxeSArIHQxMiAqIDMgKiB0ICogYzF5ICsgdDEgKiAzICogdCAqIHQgKiBjMnkgKyB0MyAqIHAyeTtcbiAgICB2YXIgbXggPSBwMXggKyAyICogdCAqIChjMXggLSBwMXgpICsgdDIgKiAoYzJ4IC0gMiAqIGMxeCArIHAxeCk7XG4gICAgdmFyIG15ID0gcDF5ICsgMiAqIHQgKiAoYzF5IC0gcDF5KSArIHQyICogKGMyeSAtIDIgKiBjMXkgKyBwMXkpO1xuICAgIHZhciBueCA9IGMxeCArIDIgKiB0ICogKGMyeCAtIGMxeCkgKyB0MiAqIChwMnggLSAyICogYzJ4ICsgYzF4KTtcbiAgICB2YXIgbnkgPSBjMXkgKyAyICogdCAqIChjMnkgLSBjMXkpICsgdDIgKiAocDJ5IC0gMiAqIGMyeSArIGMxeSk7XG4gICAgdmFyIGF4ID0gdDEgKiBwMXggKyB0ICogYzF4O1xuICAgIHZhciBheSA9IHQxICogcDF5ICsgdCAqIGMxeTtcbiAgICB2YXIgY3ggPSB0MSAqIGMyeCArIHQgKiBwMng7XG4gICAgdmFyIGN5ID0gdDEgKiBjMnkgKyB0ICogcDJ5O1xuICAgIHZhciBhbHBoYSA9IDkwIC0gKE1hdGguYXRhbjIobXggLSBueCwgbXkgLSBueSkgKiAxODApIC8gTWF0aC5QSTtcbiAgICAvLyAobXggPiBueCB8fCBteSA8IG55KSAmJiAoYWxwaGEgKz0gMTgwKTtcbiAgICByZXR1cm4ge1xuICAgICAgICB4OiB4LFxuICAgICAgICB5OiB5LFxuICAgICAgICBtOiB7XG4gICAgICAgICAgICB4OiBteCxcbiAgICAgICAgICAgIHk6IG15LFxuICAgICAgICB9LFxuICAgICAgICBuOiB7XG4gICAgICAgICAgICB4OiBueCxcbiAgICAgICAgICAgIHk6IG55LFxuICAgICAgICB9LFxuICAgICAgICBzdGFydDoge1xuICAgICAgICAgICAgeDogYXgsXG4gICAgICAgICAgICB5OiBheSxcbiAgICAgICAgfSxcbiAgICAgICAgZW5kOiB7XG4gICAgICAgICAgICB4OiBjeCxcbiAgICAgICAgICAgIHk6IGN5LFxuICAgICAgICB9LFxuICAgICAgICBhbHBoYTogYWxwaGEsXG4gICAgfTtcbn07XG52YXIgaW50ZXJIZWxwZXIgPSBmdW5jdGlvbiAoYmV6MSwgYmV6MiwganVzdENvdW50KSB7XG4gICAgdmFyIGJib3gxID0gYmV6aWVyQkJveChiZXoxKTtcbiAgICB2YXIgYmJveDIgPSBiZXppZXJCQm94KGJlejIpO1xuICAgIGlmICghaXNCQm94SW50ZXJzZWN0KGJib3gxLCBiYm94MikpIHtcbiAgICAgICAgcmV0dXJuIGp1c3RDb3VudCA/IDAgOiBbXTtcbiAgICB9XG4gICAgdmFyIGwxID0gYmV6bGVuLmFwcGx5KDAsIGJlejEpO1xuICAgIHZhciBsMiA9IGJlemxlbi5hcHBseSgwLCBiZXoyKTtcbiAgICB2YXIgbjEgPSB+fihsMSAvIDgpO1xuICAgIHZhciBuMiA9IH5+KGwyIC8gOCk7XG4gICAgdmFyIGRvdHMxID0gW107XG4gICAgdmFyIGRvdHMyID0gW107XG4gICAgdmFyIHh5ID0ge307XG4gICAgdmFyIHJlcyA9IGp1c3RDb3VudCA/IDAgOiBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG4xICsgMTsgaSsrKSB7XG4gICAgICAgIHZhciBkID0gZmluZERvdHNBdFNlZ21lbnQuYXBwbHkoMCwgYmV6MS5jb25jYXQoaSAvIG4xKSk7XG4gICAgICAgIGRvdHMxLnB1c2goe1xuICAgICAgICAgICAgeDogZC54LFxuICAgICAgICAgICAgeTogZC55LFxuICAgICAgICAgICAgdDogaSAvIG4xLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuMiArIDE7IGkrKykge1xuICAgICAgICB2YXIgZCA9IGZpbmREb3RzQXRTZWdtZW50LmFwcGx5KDAsIGJlejIuY29uY2F0KGkgLyBuMikpO1xuICAgICAgICBkb3RzMi5wdXNoKHtcbiAgICAgICAgICAgIHg6IGQueCxcbiAgICAgICAgICAgIHk6IGQueSxcbiAgICAgICAgICAgIHQ6IGkgLyBuMixcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbjE7IGkrKykge1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IG4yOyBqKyspIHtcbiAgICAgICAgICAgIHZhciBkaSA9IGRvdHMxW2ldO1xuICAgICAgICAgICAgdmFyIGRpMSA9IGRvdHMxW2kgKyAxXTtcbiAgICAgICAgICAgIHZhciBkaiA9IGRvdHMyW2pdO1xuICAgICAgICAgICAgdmFyIGRqMSA9IGRvdHMyW2ogKyAxXTtcbiAgICAgICAgICAgIHZhciBjaSA9IE1hdGguYWJzKGRpMS54IC0gZGkueCkgPCAwLjAwMSA/ICd5JyA6ICd4JztcbiAgICAgICAgICAgIHZhciBjaiA9IE1hdGguYWJzKGRqMS54IC0gZGoueCkgPCAwLjAwMSA/ICd5JyA6ICd4JztcbiAgICAgICAgICAgIHZhciBpcyA9IGludGVyc2VjdChkaS54LCBkaS55LCBkaTEueCwgZGkxLnksIGRqLngsIGRqLnksIGRqMS54LCBkajEueSk7XG4gICAgICAgICAgICBpZiAoaXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoeHlbaXMueC50b0ZpeGVkKDQpXSA9PT0gaXMueS50b0ZpeGVkKDQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB4eVtpcy54LnRvRml4ZWQoNCldID0gaXMueS50b0ZpeGVkKDQpO1xuICAgICAgICAgICAgICAgIHZhciB0MSA9IGRpLnQgKyBNYXRoLmFicygoaXNbY2ldIC0gZGlbY2ldKSAvIChkaTFbY2ldIC0gZGlbY2ldKSkgKiAoZGkxLnQgLSBkaS50KTtcbiAgICAgICAgICAgICAgICB2YXIgdDIgPSBkai50ICsgTWF0aC5hYnMoKGlzW2NqXSAtIGRqW2NqXSkgLyAoZGoxW2NqXSAtIGRqW2NqXSkpICogKGRqMS50IC0gZGoudCk7XG4gICAgICAgICAgICAgICAgaWYgKHQxID49IDAgJiYgdDEgPD0gMSAmJiB0MiA+PSAwICYmIHQyIDw9IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGp1c3RDb3VudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzICs9IDE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICByZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeDogaXMueCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5OiBpcy55LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQxOiB0MSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0MjogdDIsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzO1xufTtcbnZhciBpbnRlclBhdGhIZWxwZXIgPSBmdW5jdGlvbiAocGF0aDEsIHBhdGgyLCBqdXN0Q291bnQpIHtcbiAgICBwYXRoMSA9IHBhdGhUb0N1cnZlKHBhdGgxKTtcbiAgICBwYXRoMiA9IHBhdGhUb0N1cnZlKHBhdGgyKTtcbiAgICB2YXIgeDE7XG4gICAgdmFyIHkxO1xuICAgIHZhciB4MjtcbiAgICB2YXIgeTI7XG4gICAgdmFyIHgxbTtcbiAgICB2YXIgeTFtO1xuICAgIHZhciB4Mm07XG4gICAgdmFyIHkybTtcbiAgICB2YXIgYmV6MTtcbiAgICB2YXIgYmV6MjtcbiAgICB2YXIgcmVzID0ganVzdENvdW50ID8gMCA6IFtdO1xuICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IHBhdGgxLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgICAgdmFyIHBpID0gcGF0aDFbaV07XG4gICAgICAgIGlmIChwaVswXSA9PT0gJ00nKSB7XG4gICAgICAgICAgICB4MSA9IHgxbSA9IHBpWzFdO1xuICAgICAgICAgICAgeTEgPSB5MW0gPSBwaVsyXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChwaVswXSA9PT0gJ0MnKSB7XG4gICAgICAgICAgICAgICAgYmV6MSA9IFt4MSwgeTFdLmNvbmNhdChwaS5zbGljZSgxKSk7XG4gICAgICAgICAgICAgICAgeDEgPSBiZXoxWzZdO1xuICAgICAgICAgICAgICAgIHkxID0gYmV6MVs3XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGJlejEgPSBbeDEsIHkxLCB4MSwgeTEsIHgxbSwgeTFtLCB4MW0sIHkxbV07XG4gICAgICAgICAgICAgICAgeDEgPSB4MW07XG4gICAgICAgICAgICAgICAgeTEgPSB5MW07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMCwgamogPSBwYXRoMi5sZW5ndGg7IGogPCBqajsgaisrKSB7XG4gICAgICAgICAgICAgICAgdmFyIHBqID0gcGF0aDJbal07XG4gICAgICAgICAgICAgICAgaWYgKHBqWzBdID09PSAnTScpIHtcbiAgICAgICAgICAgICAgICAgICAgeDIgPSB4Mm0gPSBwalsxXTtcbiAgICAgICAgICAgICAgICAgICAgeTIgPSB5Mm0gPSBwalsyXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwalswXSA9PT0gJ0MnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBiZXoyID0gW3gyLCB5Ml0uY29uY2F0KHBqLnNsaWNlKDEpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHgyID0gYmV6Mls2XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHkyID0gYmV6Mls3XTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJlejIgPSBbeDIsIHkyLCB4MiwgeTIsIHgybSwgeTJtLCB4Mm0sIHkybV07XG4gICAgICAgICAgICAgICAgICAgICAgICB4MiA9IHgybTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHkyID0geTJtO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHZhciBpbnRyID0gaW50ZXJIZWxwZXIoYmV6MSwgYmV6MiwganVzdENvdW50KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGp1c3RDb3VudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzICs9IGludHI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrID0gMCwga2sgPSBpbnRyLmxlbmd0aDsgayA8IGtrOyBrKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRyW2tdLnNlZ21lbnQxID0gaTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRyW2tdLnNlZ21lbnQyID0gajtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRyW2tdLmJlejEgPSBiZXoxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHJba10uYmV6MiA9IGJlejI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICByZXMgPSByZXMuY29uY2F0KGludHIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXM7XG59O1xudmFyIGludGVyc2VjdGlvbiA9IGZ1bmN0aW9uIChwYXRoMSwgcGF0aDIpIHtcbiAgICByZXR1cm4gaW50ZXJQYXRoSGVscGVyKHBhdGgxLCBwYXRoMik7XG59O1xuZnVuY3Rpb24gZGVjYXN0ZWxqYXUocG9pbnRzLCB0KSB7XG4gICAgdmFyIGxlZnQgPSBbXTtcbiAgICB2YXIgcmlnaHQgPSBbXTtcbiAgICBmdW5jdGlvbiByZWN1cnNlKHBvaW50cywgdCkge1xuICAgICAgICBpZiAocG9pbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgbGVmdC5wdXNoKHBvaW50c1swXSk7XG4gICAgICAgICAgICByaWdodC5wdXNoKHBvaW50c1swXSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2YXIgbWlkZGxlUG9pbnRzID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBsZWZ0LnB1c2gocG9pbnRzWzBdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGkgPT09IHBvaW50cy5sZW5ndGggLSAyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJpZ2h0LnB1c2gocG9pbnRzW2kgKyAxXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG1pZGRsZVBvaW50c1tpXSA9IFtcbiAgICAgICAgICAgICAgICAgICAgKDEgLSB0KSAqIHBvaW50c1tpXVswXSArIHQgKiBwb2ludHNbaSArIDFdWzBdLFxuICAgICAgICAgICAgICAgICAgICAoMSAtIHQpICogcG9pbnRzW2ldWzFdICsgdCAqIHBvaW50c1tpICsgMV1bMV0sXG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlY3Vyc2UobWlkZGxlUG9pbnRzLCB0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAocG9pbnRzLmxlbmd0aCkge1xuICAgICAgICByZWN1cnNlKHBvaW50cywgdCk7XG4gICAgfVxuICAgIHJldHVybiB7IGxlZnQ6IGxlZnQsIHJpZ2h0OiByaWdodC5yZXZlcnNlKCkgfTtcbn1cbmZ1bmN0aW9uIHNwbGl0Q3VydmUoc3RhcnQsIGVuZCwgY291bnQpIHtcbiAgICB2YXIgcG9pbnRzID0gW1tzdGFydFsxXSwgc3RhcnRbMl1dXTtcbiAgICBjb3VudCA9IGNvdW50IHx8IDI7XG4gICAgdmFyIHNlZ21lbnRzID0gW107XG4gICAgaWYgKGVuZFswXSA9PT0gJ0EnKSB7XG4gICAgICAgIHBvaW50cy5wdXNoKGVuZFs2XSk7XG4gICAgICAgIHBvaW50cy5wdXNoKGVuZFs3XSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGVuZFswXSA9PT0gJ0MnKSB7XG4gICAgICAgIHBvaW50cy5wdXNoKFtlbmRbMV0sIGVuZFsyXV0pO1xuICAgICAgICBwb2ludHMucHVzaChbZW5kWzNdLCBlbmRbNF1dKTtcbiAgICAgICAgcG9pbnRzLnB1c2goW2VuZFs1XSwgZW5kWzZdXSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGVuZFswXSA9PT0gJ1MnIHx8IGVuZFswXSA9PT0gJ1EnKSB7XG4gICAgICAgIHBvaW50cy5wdXNoKFtlbmRbMV0sIGVuZFsyXV0pO1xuICAgICAgICBwb2ludHMucHVzaChbZW5kWzNdLCBlbmRbNF1dKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHBvaW50cy5wdXNoKFtlbmRbMV0sIGVuZFsyXV0pO1xuICAgIH1cbiAgICB2YXIgbGVmdFNlZ21lbnRzID0gcG9pbnRzO1xuICAgIHZhciB0ID0gMSAvIGNvdW50O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY291bnQgLSAxOyBpKyspIHtcbiAgICAgICAgdmFyIHJ0ID0gdCAvICgxIC0gdCAqIGkpO1xuICAgICAgICB2YXIgc3BsaXQgPSBkZWNhc3RlbGphdShsZWZ0U2VnbWVudHMsIHJ0KTtcbiAgICAgICAgc2VnbWVudHMucHVzaChzcGxpdC5sZWZ0KTtcbiAgICAgICAgbGVmdFNlZ21lbnRzID0gc3BsaXQucmlnaHQ7XG4gICAgfVxuICAgIHNlZ21lbnRzLnB1c2gobGVmdFNlZ21lbnRzKTtcbiAgICB2YXIgcmVzdWx0ID0gc2VnbWVudHMubWFwKGZ1bmN0aW9uIChzZWdtZW50KSB7XG4gICAgICAgIHZhciBjbWQgPSBbXTtcbiAgICAgICAgaWYgKHNlZ21lbnQubGVuZ3RoID09PSA0KSB7XG4gICAgICAgICAgICBjbWQucHVzaCgnQycpO1xuICAgICAgICAgICAgY21kID0gY21kLmNvbmNhdChzZWdtZW50WzJdKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2VnbWVudC5sZW5ndGggPj0gMykge1xuICAgICAgICAgICAgaWYgKHNlZ21lbnQubGVuZ3RoID09PSAzKSB7XG4gICAgICAgICAgICAgICAgY21kLnB1c2goJ1EnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNtZCA9IGNtZC5jb25jYXQoc2VnbWVudFsxXSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNlZ21lbnQubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgICBjbWQucHVzaCgnTCcpO1xuICAgICAgICB9XG4gICAgICAgIGNtZCA9IGNtZC5jb25jYXQoc2VnbWVudFtzZWdtZW50Lmxlbmd0aCAtIDFdKTtcbiAgICAgICAgcmV0dXJuIGNtZDtcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxudmFyIHNwbGl0U2VnbWVudCA9IGZ1bmN0aW9uIChzdGFydCwgZW5kLCBjb3VudCkge1xuICAgIGlmIChjb3VudCA9PT0gMSkge1xuICAgICAgICByZXR1cm4gW1tdLmNvbmNhdChzdGFydCldO1xuICAgIH1cbiAgICB2YXIgc2VnbWVudHMgPSBbXTtcbiAgICBpZiAoZW5kWzBdID09PSAnTCcgfHwgZW5kWzBdID09PSAnQycgfHwgZW5kWzBdID09PSAnUScpIHtcbiAgICAgICAgc2VnbWVudHMgPSBzZWdtZW50cy5jb25jYXQoc3BsaXRDdXJ2ZShzdGFydCwgZW5kLCBjb3VudCkpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdmFyIHRlbXAgPSBbXS5jb25jYXQoc3RhcnQpO1xuICAgICAgICBpZiAodGVtcFswXSA9PT0gJ00nKSB7XG4gICAgICAgICAgICB0ZW1wWzBdID0gJ0wnO1xuICAgICAgICB9XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDw9IGNvdW50IC0gMTsgaSsrKSB7XG4gICAgICAgICAgICBzZWdtZW50cy5wdXNoKHRlbXApO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzZWdtZW50cztcbn07XG52YXIgZmlsbFBhdGggPSBmdW5jdGlvbiAoc291cmNlLCB0YXJnZXQpIHtcbiAgICBpZiAoc291cmNlLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICByZXR1cm4gc291cmNlO1xuICAgIH1cbiAgICB2YXIgc291cmNlTGVuID0gc291cmNlLmxlbmd0aCAtIDE7XG4gICAgdmFyIHRhcmdldExlbiA9IHRhcmdldC5sZW5ndGggLSAxO1xuICAgIHZhciByYXRpbyA9IHNvdXJjZUxlbiAvIHRhcmdldExlbjtcbiAgICB2YXIgc2VnbWVudHNUb0ZpbGwgPSBbXTtcbiAgICBpZiAoc291cmNlLmxlbmd0aCA9PT0gMSAmJiBzb3VyY2VbMF1bMF0gPT09ICdNJykge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRhcmdldExlbiAtIHNvdXJjZUxlbjsgaSsrKSB7XG4gICAgICAgICAgICBzb3VyY2UucHVzaChzb3VyY2VbMF0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzb3VyY2U7XG4gICAgfVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGFyZ2V0TGVuOyBpKyspIHtcbiAgICAgICAgdmFyIGluZGV4ID0gTWF0aC5mbG9vcihyYXRpbyAqIGkpO1xuICAgICAgICBzZWdtZW50c1RvRmlsbFtpbmRleF0gPSAoc2VnbWVudHNUb0ZpbGxbaW5kZXhdIHx8IDApICsgMTtcbiAgICB9XG4gICAgdmFyIGZpbGxlZCA9IHNlZ21lbnRzVG9GaWxsLnJlZHVjZShmdW5jdGlvbiAoZmlsbGVkLCBjb3VudCwgaSkge1xuICAgICAgICBpZiAoaSA9PT0gc291cmNlTGVuKSB7XG4gICAgICAgICAgICByZXR1cm4gZmlsbGVkLmNvbmNhdChzb3VyY2Vbc291cmNlTGVuXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZpbGxlZC5jb25jYXQoc3BsaXRTZWdtZW50KHNvdXJjZVtpXSwgc291cmNlW2kgKyAxXSwgY291bnQpKTtcbiAgICB9LCBbXSk7XG4gICAgZmlsbGVkLnVuc2hpZnQoc291cmNlWzBdKTtcbiAgICBpZiAodGFyZ2V0W3RhcmdldExlbl0gPT09ICdaJyB8fCB0YXJnZXRbdGFyZ2V0TGVuXSA9PT0gJ3onKSB7XG4gICAgICAgIGZpbGxlZC5wdXNoKCdaJyk7XG4gICAgfVxuICAgIHJldHVybiBmaWxsZWQ7XG59O1xudmFyIGlzRXF1YWwgPSBmdW5jdGlvbiAob2JqMSwgb2JqMikge1xuICAgIGlmIChvYmoxLmxlbmd0aCAhPT0gb2JqMi5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB2YXIgcmVzdWx0ID0gdHJ1ZTtcbiAgICBlYWNoKG9iajEsIGZ1bmN0aW9uIChpdGVtLCBpKSB7XG4gICAgICAgIGlmIChpdGVtICE9PSBvYmoyW2ldKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xuZnVuY3Rpb24gZ2V0TWluRGlmZihkZWwsIGFkZCwgbW9kaWZ5KSB7XG4gICAgdmFyIHR5cGUgPSBudWxsO1xuICAgIHZhciBtaW4gPSBtb2RpZnk7XG4gICAgaWYgKGFkZCA8IG1pbikge1xuICAgICAgICBtaW4gPSBhZGQ7XG4gICAgICAgIHR5cGUgPSAnYWRkJztcbiAgICB9XG4gICAgaWYgKGRlbCA8IG1pbikge1xuICAgICAgICBtaW4gPSBkZWw7XG4gICAgICAgIHR5cGUgPSAnZGVsJztcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgbWluOiBtaW4sXG4gICAgfTtcbn1cbi8qXG4gKiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MZXZlbnNodGVpbl9kaXN0YW5jZVxuICog6K6h566X5Lik5p2hcGF0aOeahOe8lui+kei3neemu1xuICovXG52YXIgbGV2ZW5zaHRlaW5EaXN0YW5jZSA9IGZ1bmN0aW9uIChzb3VyY2UsIHRhcmdldCkge1xuICAgIHZhciBzb3VyY2VMZW4gPSBzb3VyY2UubGVuZ3RoO1xuICAgIHZhciB0YXJnZXRMZW4gPSB0YXJnZXQubGVuZ3RoO1xuICAgIHZhciBzb3VyY2VTZWdtZW50O1xuICAgIHZhciB0YXJnZXRTZWdtZW50O1xuICAgIHZhciB0ZW1wID0gMDtcbiAgICBpZiAoc291cmNlTGVuID09PSAwIHx8IHRhcmdldExlbiA9PT0gMCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgdmFyIGRpc3QgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8PSBzb3VyY2VMZW47IGkrKykge1xuICAgICAgICBkaXN0W2ldID0gW107XG4gICAgICAgIGRpc3RbaV1bMF0gPSB7IG1pbjogaSB9O1xuICAgIH1cbiAgICBmb3IgKHZhciBqID0gMDsgaiA8PSB0YXJnZXRMZW47IGorKykge1xuICAgICAgICBkaXN0WzBdW2pdID0geyBtaW46IGogfTtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPD0gc291cmNlTGVuOyBpKyspIHtcbiAgICAgICAgc291cmNlU2VnbWVudCA9IHNvdXJjZVtpIC0gMV07XG4gICAgICAgIGZvciAodmFyIGogPSAxOyBqIDw9IHRhcmdldExlbjsgaisrKSB7XG4gICAgICAgICAgICB0YXJnZXRTZWdtZW50ID0gdGFyZ2V0W2ogLSAxXTtcbiAgICAgICAgICAgIGlmIChpc0VxdWFsKHNvdXJjZVNlZ21lbnQsIHRhcmdldFNlZ21lbnQpKSB7XG4gICAgICAgICAgICAgICAgdGVtcCA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0ZW1wID0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBkZWwgPSBkaXN0W2kgLSAxXVtqXS5taW4gKyAxO1xuICAgICAgICAgICAgdmFyIGFkZCA9IGRpc3RbaV1baiAtIDFdLm1pbiArIDE7XG4gICAgICAgICAgICB2YXIgbW9kaWZ5ID0gZGlzdFtpIC0gMV1baiAtIDFdLm1pbiArIHRlbXA7XG4gICAgICAgICAgICBkaXN0W2ldW2pdID0gZ2V0TWluRGlmZihkZWwsIGFkZCwgbW9kaWZ5KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGlzdDtcbn07XG52YXIgZmlsbFBhdGhCeURpZmYgPSBmdW5jdGlvbiAoc291cmNlLCB0YXJnZXQpIHtcbiAgICB2YXIgZGlmZk1hdHJpeCA9IGxldmVuc2h0ZWluRGlzdGFuY2Uoc291cmNlLCB0YXJnZXQpO1xuICAgIHZhciBzb3VyY2VMZW4gPSBzb3VyY2UubGVuZ3RoO1xuICAgIHZhciB0YXJnZXRMZW4gPSB0YXJnZXQubGVuZ3RoO1xuICAgIHZhciBjaGFuZ2VzID0gW107XG4gICAgdmFyIGluZGV4ID0gMTtcbiAgICB2YXIgbWluUG9zID0gMTtcbiAgICAvLyDlpoLmnpxzb3VyY2Xlkox0YXJnZXTkuI3mmK/lrozlhajkuI3nm7jnrYlcbiAgICBpZiAoZGlmZk1hdHJpeFtzb3VyY2VMZW5dW3RhcmdldExlbl0ubWluICE9PSBzb3VyY2VMZW4pIHtcbiAgICAgICAgLy8g6I635Y+W5LuOc291cmNl5YiwdGFyZ2V05omA6ZyA5pS55YqoXG4gICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDw9IHNvdXJjZUxlbjsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgbWluID0gZGlmZk1hdHJpeFtpXVtpXS5taW47XG4gICAgICAgICAgICBtaW5Qb3MgPSBpO1xuICAgICAgICAgICAgZm9yICh2YXIgaiA9IGluZGV4OyBqIDw9IHRhcmdldExlbjsgaisrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRpZmZNYXRyaXhbaV1bal0ubWluIDwgbWluKSB7XG4gICAgICAgICAgICAgICAgICAgIG1pbiA9IGRpZmZNYXRyaXhbaV1bal0ubWluO1xuICAgICAgICAgICAgICAgICAgICBtaW5Qb3MgPSBqO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGluZGV4ID0gbWluUG9zO1xuICAgICAgICAgICAgaWYgKGRpZmZNYXRyaXhbaV1baW5kZXhdLnR5cGUpIHtcbiAgICAgICAgICAgICAgICBjaGFuZ2VzLnB1c2goeyBpbmRleDogaSAtIDEsIHR5cGU6IGRpZmZNYXRyaXhbaV1baW5kZXhdLnR5cGUgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8g5a+5c291cmNl6L+b6KGM5aKe5YigcGF0aFxuICAgICAgICBmb3IgKHZhciBpID0gY2hhbmdlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgaW5kZXggPSBjaGFuZ2VzW2ldLmluZGV4O1xuICAgICAgICAgICAgaWYgKGNoYW5nZXNbaV0udHlwZSA9PT0gJ2FkZCcpIHtcbiAgICAgICAgICAgICAgICBzb3VyY2Uuc3BsaWNlKGluZGV4LCAwLCBbXS5jb25jYXQoc291cmNlW2luZGV4XSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgc291cmNlLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gc291cmNl5bC+6YOo6KGl6b2QXG4gICAgc291cmNlTGVuID0gc291cmNlLmxlbmd0aDtcbiAgICB2YXIgZGlmZiA9IHRhcmdldExlbiAtIHNvdXJjZUxlbjtcbiAgICBpZiAoc291cmNlTGVuIDwgdGFyZ2V0TGVuKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGlmZjsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoc291cmNlW3NvdXJjZUxlbiAtIDFdWzBdID09PSAneicgfHwgc291cmNlW3NvdXJjZUxlbiAtIDFdWzBdID09PSAnWicpIHtcbiAgICAgICAgICAgICAgICBzb3VyY2Uuc3BsaWNlKHNvdXJjZUxlbiAtIDIsIDAsIHNvdXJjZVtzb3VyY2VMZW4gLSAyXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBzb3VyY2UucHVzaChzb3VyY2Vbc291cmNlTGVuIC0gMV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc291cmNlTGVuICs9IDE7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNvdXJjZTtcbn07XG4vLyDlsIbkuKTkuKrngrnlnYfliIbmiJBjb3VudOS4queCuVxuZnVuY3Rpb24gX3NwbGl0UG9pbnRzKHBvaW50cywgZm9ybWVyLCBjb3VudCkge1xuICAgIHZhciByZXN1bHQgPSBbXS5jb25jYXQocG9pbnRzKTtcbiAgICB2YXIgaW5kZXg7XG4gICAgdmFyIHQgPSAxIC8gKGNvdW50ICsgMSk7XG4gICAgdmFyIGZvcm1lckVuZCA9IF9nZXRTZWdtZW50UG9pbnRzKGZvcm1lcilbMF07XG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPD0gY291bnQ7IGkrKykge1xuICAgICAgICB0ICo9IGk7XG4gICAgICAgIGluZGV4ID0gTWF0aC5mbG9vcihwb2ludHMubGVuZ3RoICogdCk7XG4gICAgICAgIGlmIChpbmRleCA9PT0gMCkge1xuICAgICAgICAgICAgcmVzdWx0LnVuc2hpZnQoW2Zvcm1lckVuZFswXSAqIHQgKyBwb2ludHNbaW5kZXhdWzBdICogKDEgLSB0KSwgZm9ybWVyRW5kWzFdICogdCArIHBvaW50c1tpbmRleF1bMV0gKiAoMSAtIHQpXSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQuc3BsaWNlKGluZGV4LCAwLCBbXG4gICAgICAgICAgICAgICAgZm9ybWVyRW5kWzBdICogdCArIHBvaW50c1tpbmRleF1bMF0gKiAoMSAtIHQpLFxuICAgICAgICAgICAgICAgIGZvcm1lckVuZFsxXSAqIHQgKyBwb2ludHNbaW5kZXhdWzFdICogKDEgLSB0KSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG4vKlxuICog5oq95Y+WcGF0aFNlZ21lbnTkuK3nmoTlhbPplK7ngrlcbiAqIE0sTCxBLFEsSCxW5LiA5Liq56uv54K5XG4gKiBRLCBT5oq95Y+W5LiA5Liq56uv54K577yM5LiA5Liq5o6n5Yi254K5XG4gKiBD5oq95Y+W5LiA5Liq56uv54K577yM5Lik5Liq5o6n5Yi254K5XG4gKi9cbmZ1bmN0aW9uIF9nZXRTZWdtZW50UG9pbnRzKHNlZ21lbnQpIHtcbiAgICB2YXIgcG9pbnRzID0gW107XG4gICAgc3dpdGNoIChzZWdtZW50WzBdKSB7XG4gICAgICAgIGNhc2UgJ00nOlxuICAgICAgICAgICAgcG9pbnRzLnB1c2goW3NlZ21lbnRbMV0sIHNlZ21lbnRbMl1dKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdMJzpcbiAgICAgICAgICAgIHBvaW50cy5wdXNoKFtzZWdtZW50WzFdLCBzZWdtZW50WzJdXSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnQSc6XG4gICAgICAgICAgICBwb2ludHMucHVzaChbc2VnbWVudFs2XSwgc2VnbWVudFs3XV0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ1EnOlxuICAgICAgICAgICAgcG9pbnRzLnB1c2goW3NlZ21lbnRbM10sIHNlZ21lbnRbNF1dKTtcbiAgICAgICAgICAgIHBvaW50cy5wdXNoKFtzZWdtZW50WzFdLCBzZWdtZW50WzJdXSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnVCc6XG4gICAgICAgICAgICBwb2ludHMucHVzaChbc2VnbWVudFsxXSwgc2VnbWVudFsyXV0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ0MnOlxuICAgICAgICAgICAgcG9pbnRzLnB1c2goW3NlZ21lbnRbNV0sIHNlZ21lbnRbNl1dKTtcbiAgICAgICAgICAgIHBvaW50cy5wdXNoKFtzZWdtZW50WzFdLCBzZWdtZW50WzJdXSk7XG4gICAgICAgICAgICBwb2ludHMucHVzaChbc2VnbWVudFszXSwgc2VnbWVudFs0XV0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ1MnOlxuICAgICAgICAgICAgcG9pbnRzLnB1c2goW3NlZ21lbnRbM10sIHNlZ21lbnRbNF1dKTtcbiAgICAgICAgICAgIHBvaW50cy5wdXNoKFtzZWdtZW50WzFdLCBzZWdtZW50WzJdXSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnSCc6XG4gICAgICAgICAgICBwb2ludHMucHVzaChbc2VnbWVudFsxXSwgc2VnbWVudFsxXV0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ1YnOlxuICAgICAgICAgICAgcG9pbnRzLnB1c2goW3NlZ21lbnRbMV0sIHNlZ21lbnRbMV1dKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgIH1cbiAgICByZXR1cm4gcG9pbnRzO1xufVxudmFyIGZvcm1hdFBhdGggPSBmdW5jdGlvbiAoZnJvbVBhdGgsIHRvUGF0aCkge1xuICAgIGlmIChmcm9tUGF0aC5sZW5ndGggPD0gMSkge1xuICAgICAgICByZXR1cm4gZnJvbVBhdGg7XG4gICAgfVxuICAgIHZhciBwb2ludHM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0b1BhdGgubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGZyb21QYXRoW2ldWzBdICE9PSB0b1BhdGhbaV1bMF0pIHtcbiAgICAgICAgICAgIC8vIOiOt+WPlmZyb21QYXRo55qEcGF0aFNlZ21lbnTnmoTnq6/ngrnvvIzmoLnmja50b1BhdGjnmoTmjIfku6Tlr7nlhbbmlLnpgKBcbiAgICAgICAgICAgIHBvaW50cyA9IF9nZXRTZWdtZW50UG9pbnRzKGZyb21QYXRoW2ldKTtcbiAgICAgICAgICAgIHN3aXRjaCAodG9QYXRoW2ldWzBdKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnTSc6XG4gICAgICAgICAgICAgICAgICAgIGZyb21QYXRoW2ldID0gWydNJ10uY29uY2F0KHBvaW50c1swXSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ0wnOlxuICAgICAgICAgICAgICAgICAgICBmcm9tUGF0aFtpXSA9IFsnTCddLmNvbmNhdChwb2ludHNbMF0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdBJzpcbiAgICAgICAgICAgICAgICAgICAgZnJvbVBhdGhbaV0gPSBbXS5jb25jYXQodG9QYXRoW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgZnJvbVBhdGhbaV1bNl0gPSBwb2ludHNbMF1bMF07XG4gICAgICAgICAgICAgICAgICAgIGZyb21QYXRoW2ldWzddID0gcG9pbnRzWzBdWzFdO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdRJzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBvaW50cy5sZW5ndGggPCAyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludHMgPSBfc3BsaXRQb2ludHMocG9pbnRzLCBmcm9tUGF0aFtpIC0gMV0sIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbVBhdGhbaV0gPSB0b1BhdGhbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZnJvbVBhdGhbaV0gPSBbJ1EnXS5jb25jYXQocG9pbnRzLnJlZHVjZShmdW5jdGlvbiAoYXJyLCBpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXJyLmNvbmNhdChpKTtcbiAgICAgICAgICAgICAgICAgICAgfSwgW10pKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnVCc6XG4gICAgICAgICAgICAgICAgICAgIGZyb21QYXRoW2ldID0gWydUJ10uY29uY2F0KHBvaW50c1swXSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ0MnOlxuICAgICAgICAgICAgICAgICAgICBpZiAocG9pbnRzLmxlbmd0aCA8IDMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50cyA9IF9zcGxpdFBvaW50cyhwb2ludHMsIGZyb21QYXRoW2kgLSAxXSwgMik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tUGF0aFtpXSA9IHRvUGF0aFtpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBmcm9tUGF0aFtpXSA9IFsnQyddLmNvbmNhdChwb2ludHMucmVkdWNlKGZ1bmN0aW9uIChhcnIsIGkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhcnIuY29uY2F0KGkpO1xuICAgICAgICAgICAgICAgICAgICB9LCBbXSkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdTJzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBvaW50cy5sZW5ndGggPCAyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludHMgPSBfc3BsaXRQb2ludHMocG9pbnRzLCBmcm9tUGF0aFtpIC0gMV0sIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbVBhdGhbaV0gPSB0b1BhdGhbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZnJvbVBhdGhbaV0gPSBbJ1MnXS5jb25jYXQocG9pbnRzLnJlZHVjZShmdW5jdGlvbiAoYXJyLCBpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXJyLmNvbmNhdChpKTtcbiAgICAgICAgICAgICAgICAgICAgfSwgW10pKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgZnJvbVBhdGhbaV0gPSB0b1BhdGhbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZyb21QYXRoO1xufTtcbmV4cG9ydCB7IGNhdG11bGxSb21Ub0JlemllciwgZmlsbFBhdGgsIGZpbGxQYXRoQnlEaWZmLCBmb3JtYXRQYXRoLCBpbnRlcnNlY3Rpb24sIHBhcnNlUGF0aEFycmF5LCBwYXJzZVBhdGhTdHJpbmcsIHBhdGhUb0Fic29sdXRlLCBwYXRoVG9DdXJ2ZSwgcmVjdFBhdGgsIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wYXRoLmpzLm1hcCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///52\n")},function(module,exports,__webpack_require__){"use strict";eval("\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.Util = void 0;\r\nconst SVLink_1 = __webpack_require__(145);\r\nconst StructV_1 = __webpack_require__(96);\r\nexports.Util = {\r\n generateId() {\r\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\r\n let r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);\r\n return v.toString(16);\r\n });\r\n },\r\n objectClone(obj) {\r\n return obj ? JSON.parse(JSON.stringify(obj)) : {};\r\n },\r\n removeFromList(list, fn) {\r\n const res = [];\r\n for (let i = 0; i < list.length; i++) {\r\n if (fn(list[i])) {\r\n let removeItem = list.splice(i, 1);\r\n res.push(...removeItem);\r\n i--;\r\n }\r\n }\r\n return res;\r\n },\r\n assert(condition, errorText) {\r\n if (condition) {\r\n throw errorText;\r\n }\r\n },\r\n textParser(text) {\r\n let fieldReg = /\\[[^\\]]*\\]/g;\r\n if (fieldReg.test(text)) {\r\n let contents = text.match(fieldReg), values = contents.map(item => item.replace(/\\[|\\]/g, ''));\r\n return values;\r\n }\r\n else {\r\n return text;\r\n }\r\n },\r\n clamp(value, max, min) {\r\n if (value <= max && value >= min)\r\n return value;\r\n if (value > max)\r\n return max;\r\n if (value < min)\r\n return min;\r\n },\r\n convertGroupTable2ModelList(groupTable) {\r\n const list = [];\r\n groupTable.forEach(item => {\r\n list.push(...item.modelList);\r\n });\r\n return list;\r\n },\r\n convertG6Data(layoutGroup) {\r\n let nodes = [...layoutGroup.node, ...layoutGroup.marker], edges = layoutGroup.link;\r\n return {\r\n nodes: nodes.map(item => item.getG6ModelProps()),\r\n edges: edges.map(item => item.getG6ModelProps())\r\n };\r\n },\r\n convertModelList2G6Data(modelList) {\r\n return {\r\n nodes: (modelList.filter(item => !(item instanceof SVLink_1.SVLink)).map(item => item.getG6ModelProps())),\r\n edges: (modelList.filter(item => item instanceof SVLink_1.SVLink).map(item => item.getG6ModelProps()))\r\n };\r\n },\r\n calcRotateMatrix(matrix, rotation) {\r\n const Mat3 = StructV_1.SV.G6.Util.mat3;\r\n Mat3.rotate(matrix, matrix, rotation);\r\n return matrix;\r\n }\r\n};\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvQ29tbW9uL3V0aWwudHM/YWZkMSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFFQSwwQ0FBeUM7QUFFekMsMENBQWdDO0FBTW5CLFlBQUksR0FBRztJQUtoQixVQUFVO1FBQ04sT0FBTyxzQ0FBc0MsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLFVBQVMsQ0FBQztZQUNyRSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUMsRUFBRSxHQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBQyxHQUFHLEdBQUMsR0FBRyxDQUFDLENBQUM7WUFDM0QsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzFCLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQU1ELFdBQVcsQ0FBbUIsR0FBTTtRQUNoQyxPQUFPLEdBQUcsRUFBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFDLENBQUMsRUFBRyxDQUFDO0lBQ3JELENBQUM7SUFPRCxjQUFjLENBQUksSUFBUyxFQUFFLEVBQXdCO1FBQ2pELE1BQU0sR0FBRyxHQUFRLEVBQUUsQ0FBQztRQUVwQixLQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNqQyxJQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDWixJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDbkMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLFVBQVUsQ0FBQyxDQUFDO2dCQUN4QixDQUFDLEVBQUUsQ0FBQzth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IEdyYXBoRGF0YSwgTm9kZUNvbmZpZyB9IGZyb20gXCJAYW50di9nNi1jb3JlXCI7XHJcbmltcG9ydCB7IExheW91dEdyb3VwLCBMYXlvdXRHcm91cFRhYmxlIH0gZnJvbSBcIi4uL01vZGVsL21vZGVsQ29uc3RydWN0b3JcIjtcclxuaW1wb3J0IHsgU1ZMaW5rIH0gZnJvbSBcIi4uL01vZGVsL1NWTGlua1wiO1xyXG5pbXBvcnQgeyBTVk1vZGVsIH0gZnJvbSBcIi4uL01vZGVsL1NWTW9kZWxcIjtcclxuaW1wb3J0IHsgU1YgfSBmcm9tIFwiLi4vU3RydWN0VlwiO1xyXG5cclxuXHJcbi8qKlxyXG4gKiDlt6Xlhbflh73mlbBcclxuICovXHJcbmV4cG9ydCBjb25zdCBVdGlsID0ge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICog55Sf5oiQ5ZSv5LiAaWRcclxuICAgICAqL1xyXG4gICAgZ2VuZXJhdGVJZCgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybsKgJ3h4eHh4eHh4LXh4eHgtNHh4eC15eHh4LXh4eHh4eHh4eHh4eCcucmVwbGFjZSgvW3h5XS9nLMKgZnVuY3Rpb24oYykge1xyXG4gICAgwqDCoMKgwqDCoMKgwqDCoGxldMKgciA9IE1hdGgucmFuZG9tKCkqMTZ8MCwgdiA9IGMgPT3CoCd4J8KgPyByIDogKHImMHgzfDB4OCk7XHJcbiAgICDCoMKgwqDCoMKgwqDCoMKgcmV0dXJuwqB2LnRvU3RyaW5nKDE2KTtcclxuICAgIMKgwqDCoMKgfSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5Lme5LiQ54mI5a+56LGh5YWL6ZqGXHJcbiAgICAgKiBAcGFyYW0gb2JqIFxyXG4gICAgICovXHJcbiAgICBvYmplY3RDbG9uZTxUIGV4dGVuZHMgT2JqZWN0PihvYmo6IFQpOiBUIHtcclxuICAgICAgICByZXR1cm4gb2JqPyBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG9iaikpOiB7IH07XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5LuO5YiX6KGo5Lit56e76Zmk5YWD57SgXHJcbiAgICAgKiBAcGFyYW0gbGlzdCDnp7vpmaTliJfooahcclxuICAgICAqIEBwYXJhbSBmbiDnp7vpmaTliKTmlq3op4TliJlcclxuICAgICAqL1xyXG4gICAgcmVtb3ZlRnJvbUxpc3Q8VD4obGlzdDogVFtdLCBmbjogKGl0ZW06IFQpID0+IGJvb2xlYW4pOiBUW10ge1xyXG4gICAgICAgIGNvbnN0IHJlczogVFtdID0gW107XHJcblxyXG4gICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmKGZuKGxpc3RbaV0pKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgcmVtb3ZlSXRlbSA9IGxpc3Quc3BsaWNlKGksIDEpO1xyXG4gICAgICAgICAgICAgICAgcmVzLnB1c2goLi4ucmVtb3ZlSXRlbSk7XHJcbiAgICAgICAgICAgICAgICBpLS07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiByZXM7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5pat6KiA5Ye95pWwXHJcbiAgICAgKiBAcGFyYW0gYXNzZXJ0Rm4gXHJcbiAgICAgKiBAcGFyYW0gZXJyb3JUZXh0IFxyXG4gICAgICovXHJcbiAgICBhc3NlcnQoY29uZGl0aW9uOiBib29sZWFuLCBlcnJvclRleHQ6IHN0cmluZyk6IHZvaWQgfCBuZXZlciB7XHJcbiAgICAgICAgaWYoY29uZGl0aW9uKSB7XHJcbiAgICAgICAgICAgIHRocm93IGVycm9yVGV4dDtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5paH5pys6Kej5p6QXHJcbiAgICAgKiBAcGFyYW0gdGV4dCBcclxuICAgICAqL1xyXG4gICAgdGV4dFBhcnNlcih0ZXh0OiBzdHJpbmcpOiBzdHJpbmdbXSB8IHN0cmluZyB7XHJcbiAgICAgICAgbGV0IGZpZWxkUmVnID0gL1xcW1teXFxdXSpcXF0vZztcclxuXHJcbiAgICAgICAgaWYoZmllbGRSZWcudGVzdCh0ZXh0KSkge1xyXG4gICAgICAgICAgICBsZXQgY29udGVudHMgPSB0ZXh0Lm1hdGNoKGZpZWxkUmVnKSxcclxuICAgICAgICAgICAgICAgIHZhbHVlcyA9IGNvbnRlbnRzLm1hcChpdGVtID0+IGl0ZW0ucmVwbGFjZSgvXFxbfFxcXS9nLCAnJykpO1xyXG4gICAgICAgICAgICByZXR1cm4gdmFsdWVzO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRleHQ7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIOeJteWItuafkOS4quWAvFxyXG4gICAgICogQHBhcmFtIHZhbHVlIFxyXG4gICAgICovXHJcbiAgICBjbGFtcCh2YWx1ZTogbnVtYmVyLCBtYXg6IG51bWJlciwgbWluOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgICAgIGlmKHZhbHVlIDw9IG1heCAmJiB2YWx1ZSA+PSBtaW4pIHJldHVybiB2YWx1ZTtcclxuICAgICAgICBpZih2YWx1ZSA+IG1heCkgcmV0dXJuIG1heDtcclxuICAgICAgICBpZih2YWx1ZSA8IG1pbikgcmV0dXJuIG1pbjtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSBncm91cFRhYmxlIFxyXG4gICAgICogQHJldHVybnMgXHJcbiAgICAgKi9cclxuICAgIGNvbnZlcnRHcm91cFRhYmxlMk1vZGVsTGlzdChncm91cFRhYmxlOiBMYXlvdXRHcm91cFRhYmxlKTogU1ZNb2RlbFtdIHtcclxuICAgICAgICBjb25zdCBsaXN0OiBTVk1vZGVsW10gPSBbXTtcclxuXHJcbiAgICAgICAgZ3JvdXBUYWJsZS5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICBsaXN0LnB1c2goLi4uaXRlbS5tb2RlbExpc3QpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gbGlzdDtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHNiBkYXRhIOi9rOaNouWZqFxyXG4gICAgICogQHBhcmFtIGxheW91dEdyb3VwIFxyXG4gICAgICogQHJldHVybnMgXHJcbiAgICAgKi9cclxuICAgIGNvbnZlcnRHNkRhdGEobGF5b3V0R3JvdXA6IExheW91dEdyb3VwKTogR3JhcGhEYXRhIHtcclxuICAgICAgICBsZXQgbm9kZXMgPSBbLi4ubGF5b3V0R3JvdXAubm9kZSwgLi4ubGF5b3V0R3JvdXAubWFya2VyXSxcclxuICAgICAgICAgICAgZWRnZXMgPSBsYXlvdXRHcm91cC5saW5rO1xyXG5cclxuICAgICAgICByZXR1cm4geyBcclxuICAgICAgICAgICAgbm9kZXM6IG5vZGVzLm1hcChpdGVtID0+IGl0ZW0uZ2V0RzZNb2RlbFByb3BzKCkpIGFzIE5vZGVDb25maWdbXSwgXHJcbiAgICAgICAgICAgIGVkZ2VzOiBlZGdlcy5tYXAoaXRlbSA9PiBpdGVtLmdldEc2TW9kZWxQcm9wcygpKSBhcyBFZGdlQ29uZmlnW11cclxuICAgICAgICB9O1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIOWwhiBtb2RlbExpc3Qg6L2s5o2i5YiwIEc2RGF0YVxyXG4gICAgICogQHBhcmFtIG1vZGVsTGlzdFxyXG4gICAgICovXHJcbiAgICBjb252ZXJ0TW9kZWxMaXN0Mkc2RGF0YShtb2RlbExpc3Q6IFNWTW9kZWxbXSk6IEdyYXBoRGF0YSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgbm9kZXM6IDxOb2RlQ29uZmlnW10+KG1vZGVsTGlzdC5maWx0ZXIoaXRlbSA9PiAhKGl0ZW0gaW5zdGFuY2VvZiBTVkxpbmspKS5tYXAoaXRlbSA9PiBpdGVtLmdldEc2TW9kZWxQcm9wcygpKSksXHJcbiAgICAgICAgICAgIGVkZ2VzOiA8RWRnZUNvbmZpZ1tdPihtb2RlbExpc3QuZmlsdGVyKGl0ZW0gPT4gaXRlbSBpbnN0YW5jZW9mIFNWTGluaykubWFwKGl0ZW0gPT4gaXRlbS5nZXRHNk1vZGVsUHJvcHMoKSkpXHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIOiuoeeul+aXi+i9rOefqemYtVxyXG4gICAgICogQHBhcmFtIG1hdHJpeCBcclxuICAgICAqIEBwYXJhbSByb3RhdGlvbiBcclxuICAgICAqL1xyXG4gICAgY2FsY1JvdGF0ZU1hdHJpeChtYXRyaXg6IG51bWJlcltdLCByb3RhdGlvbjogbnVtYmVyKTogbnVtYmVyW10ge1xyXG4gICAgICAgIGNvbnN0IE1hdDMgPSBTVi5HNi5VdGlsLm1hdDM7XHJcbiAgICAgICAgTWF0My5yb3RhdGUobWF0cml4LCBtYXRyaXgsIHJvdGF0aW9uKTtcclxuICAgICAgICByZXR1cm4gbWF0cml4O1xyXG4gICAgfVxyXG59O1xyXG5cclxuXHJcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///53\n")},function(module,exports,__webpack_require__){eval("var isFunction = __webpack_require__(86),\n isLength = __webpack_require__(157);\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n}\n\nmodule.exports = isArrayLike;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzQXJyYXlMaWtlLmpzPzMwYzkiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsaUJBQWlCLG1CQUFPLENBQUMsRUFBYztBQUN2QyxlQUFlLG1CQUFPLENBQUMsR0FBWTs7QUFFbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxFQUFFO0FBQ2IsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJmaWxlIjoiNTQuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgaXNGdW5jdGlvbiA9IHJlcXVpcmUoJy4vaXNGdW5jdGlvbicpLFxuICAgIGlzTGVuZ3RoID0gcmVxdWlyZSgnLi9pc0xlbmd0aCcpO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGFycmF5LWxpa2UuIEEgdmFsdWUgaXMgY29uc2lkZXJlZCBhcnJheS1saWtlIGlmIGl0J3NcbiAqIG5vdCBhIGZ1bmN0aW9uIGFuZCBoYXMgYSBgdmFsdWUubGVuZ3RoYCB0aGF0J3MgYW4gaW50ZWdlciBncmVhdGVyIHRoYW4gb3JcbiAqIGVxdWFsIHRvIGAwYCBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUmAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYXJyYXktbGlrZSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5TGlrZShkb2N1bWVudC5ib2R5LmNoaWxkcmVuKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlKCdhYmMnKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlKF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0FycmF5TGlrZSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiBpc0xlbmd0aCh2YWx1ZS5sZW5ndGgpICYmICFpc0Z1bmN0aW9uKHZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0FycmF5TGlrZTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///54\n")},function(module,exports,__webpack_require__){eval("var baseMatches = __webpack_require__(379),\n baseMatchesProperty = __webpack_require__(389),\n identity = __webpack_require__(67),\n isArray = __webpack_require__(31),\n property = __webpack_require__(396);\n\n/**\n * The base implementation of `_.iteratee`.\n *\n * @private\n * @param {*} [value=_.identity] The value to convert to an iteratee.\n * @returns {Function} Returns the iteratee.\n */\nfunction baseIteratee(value) {\n // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.\n // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.\n if (typeof value == 'function') {\n return value;\n }\n if (value == null) {\n return identity;\n }\n if (typeof value == 'object') {\n return isArray(value)\n ? baseMatchesProperty(value[0], value[1])\n : baseMatches(value);\n }\n return property(value);\n}\n\nmodule.exports = baseIteratee;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlSXRlcmF0ZWUuanM/YmFkZiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxrQkFBa0IsbUJBQU8sQ0FBQyxHQUFnQjtBQUMxQywwQkFBMEIsbUJBQU8sQ0FBQyxHQUF3QjtBQUMxRCxlQUFlLG1CQUFPLENBQUMsRUFBWTtBQUNuQyxjQUFjLG1CQUFPLENBQUMsRUFBVztBQUNqQyxlQUFlLG1CQUFPLENBQUMsR0FBWTs7QUFFbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEVBQUU7QUFDYixhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsImZpbGUiOiI1NS5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBiYXNlTWF0Y2hlcyA9IHJlcXVpcmUoJy4vX2Jhc2VNYXRjaGVzJyksXG4gICAgYmFzZU1hdGNoZXNQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vX2Jhc2VNYXRjaGVzUHJvcGVydHknKSxcbiAgICBpZGVudGl0eSA9IHJlcXVpcmUoJy4vaWRlbnRpdHknKSxcbiAgICBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5JyksXG4gICAgcHJvcGVydHkgPSByZXF1aXJlKCcuL3Byb3BlcnR5Jyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXRlcmF0ZWVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IFt2YWx1ZT1fLmlkZW50aXR5XSBUaGUgdmFsdWUgdG8gY29udmVydCB0byBhbiBpdGVyYXRlZS5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgaXRlcmF0ZWUuXG4gKi9cbmZ1bmN0aW9uIGJhc2VJdGVyYXRlZSh2YWx1ZSkge1xuICAvLyBEb24ndCBzdG9yZSB0aGUgYHR5cGVvZmAgcmVzdWx0IGluIGEgdmFyaWFibGUgdG8gYXZvaWQgYSBKSVQgYnVnIGluIFNhZmFyaSA5LlxuICAvLyBTZWUgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE1NjAzNCBmb3IgbW9yZSBkZXRhaWxzLlxuICBpZiAodHlwZW9mIHZhbHVlID09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICByZXR1cm4gaWRlbnRpdHk7XG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBpc0FycmF5KHZhbHVlKVxuICAgICAgPyBiYXNlTWF0Y2hlc1Byb3BlcnR5KHZhbHVlWzBdLCB2YWx1ZVsxXSlcbiAgICAgIDogYmFzZU1hdGNoZXModmFsdWUpO1xuICB9XG4gIHJldHVybiBwcm9wZXJ0eSh2YWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUl0ZXJhdGVlO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///55\n")},function(module,exports,__webpack_require__){"use strict";eval('\nObject.defineProperty(exports, "__esModule", { value: true });\nexports.TargetTypeEnum = exports.BindingTypeEnum = exports.BindingScopeEnum = void 0;\nvar BindingScopeEnum = {\n Request: "Request",\n Singleton: "Singleton",\n Transient: "Transient"\n};\nexports.BindingScopeEnum = BindingScopeEnum;\nvar BindingTypeEnum = {\n ConstantValue: "ConstantValue",\n Constructor: "Constructor",\n DynamicValue: "DynamicValue",\n Factory: "Factory",\n Function: "Function",\n Instance: "Instance",\n Invalid: "Invalid",\n Provider: "Provider"\n};\nexports.BindingTypeEnum = BindingTypeEnum;\nvar TargetTypeEnum = {\n ClassProperty: "ClassProperty",\n ConstructorArgument: "ConstructorArgument",\n Variable: "Variable"\n};\nexports.TargetTypeEnum = TargetTypeEnum;\n//# sourceMappingURL=literal_types.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaW52ZXJzaWZ5L2xpYi9jb25zdGFudHMvbGl0ZXJhbF90eXBlcy5qcz8xNTVmIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFhO0FBQ2IsOENBQThDLGNBQWM7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiNTYuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuVGFyZ2V0VHlwZUVudW0gPSBleHBvcnRzLkJpbmRpbmdUeXBlRW51bSA9IGV4cG9ydHMuQmluZGluZ1Njb3BlRW51bSA9IHZvaWQgMDtcbnZhciBCaW5kaW5nU2NvcGVFbnVtID0ge1xuICAgIFJlcXVlc3Q6IFwiUmVxdWVzdFwiLFxuICAgIFNpbmdsZXRvbjogXCJTaW5nbGV0b25cIixcbiAgICBUcmFuc2llbnQ6IFwiVHJhbnNpZW50XCJcbn07XG5leHBvcnRzLkJpbmRpbmdTY29wZUVudW0gPSBCaW5kaW5nU2NvcGVFbnVtO1xudmFyIEJpbmRpbmdUeXBlRW51bSA9IHtcbiAgICBDb25zdGFudFZhbHVlOiBcIkNvbnN0YW50VmFsdWVcIixcbiAgICBDb25zdHJ1Y3RvcjogXCJDb25zdHJ1Y3RvclwiLFxuICAgIER5bmFtaWNWYWx1ZTogXCJEeW5hbWljVmFsdWVcIixcbiAgICBGYWN0b3J5OiBcIkZhY3RvcnlcIixcbiAgICBGdW5jdGlvbjogXCJGdW5jdGlvblwiLFxuICAgIEluc3RhbmNlOiBcIkluc3RhbmNlXCIsXG4gICAgSW52YWxpZDogXCJJbnZhbGlkXCIsXG4gICAgUHJvdmlkZXI6IFwiUHJvdmlkZXJcIlxufTtcbmV4cG9ydHMuQmluZGluZ1R5cGVFbnVtID0gQmluZGluZ1R5cGVFbnVtO1xudmFyIFRhcmdldFR5cGVFbnVtID0ge1xuICAgIENsYXNzUHJvcGVydHk6IFwiQ2xhc3NQcm9wZXJ0eVwiLFxuICAgIENvbnN0cnVjdG9yQXJndW1lbnQ6IFwiQ29uc3RydWN0b3JBcmd1bWVudFwiLFxuICAgIFZhcmlhYmxlOiBcIlZhcmlhYmxlXCJcbn07XG5leHBvcnRzLlRhcmdldFR5cGVFbnVtID0gVGFyZ2V0VHlwZUVudW07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1saXRlcmFsX3R5cGVzLmpzLm1hcCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///56\n')},function(module,__webpack_exports__,__webpack_require__){"use strict";eval("// ESM COMPAT FLAG\n__webpack_require__.r(__webpack_exports__);\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, \"Base\", function() { return /* reexport */ base; });\n__webpack_require__.d(__webpack_exports__, \"Circle\", function() { return /* reexport */ circle; });\n__webpack_require__.d(__webpack_exports__, \"Ellipse\", function() { return /* reexport */ ellipse; });\n__webpack_require__.d(__webpack_exports__, \"Image\", function() { return /* reexport */ shape_image; });\n__webpack_require__.d(__webpack_exports__, \"Line\", function() { return /* reexport */ line; });\n__webpack_require__.d(__webpack_exports__, \"Marker\", function() { return /* reexport */ marker; });\n__webpack_require__.d(__webpack_exports__, \"Path\", function() { return /* reexport */ shape_path; });\n__webpack_require__.d(__webpack_exports__, \"Polygon\", function() { return /* reexport */ polygon; });\n__webpack_require__.d(__webpack_exports__, \"Polyline\", function() { return /* reexport */ polyline; });\n__webpack_require__.d(__webpack_exports__, \"Rect\", function() { return /* reexport */ rect; });\n__webpack_require__.d(__webpack_exports__, \"Text\", function() { return /* reexport */ shape_text; });\n\n// NAMESPACE OBJECT: ./node_modules/@antv/g-canvas/esm/shape/index.js\nvar shape_namespaceObject = {};\n__webpack_require__.r(shape_namespaceObject);\n__webpack_require__.d(shape_namespaceObject, \"Base\", function() { return base; });\n__webpack_require__.d(shape_namespaceObject, \"Circle\", function() { return circle; });\n__webpack_require__.d(shape_namespaceObject, \"Ellipse\", function() { return ellipse; });\n__webpack_require__.d(shape_namespaceObject, \"Image\", function() { return shape_image; });\n__webpack_require__.d(shape_namespaceObject, \"Line\", function() { return line; });\n__webpack_require__.d(shape_namespaceObject, \"Marker\", function() { return marker; });\n__webpack_require__.d(shape_namespaceObject, \"Path\", function() { return shape_path; });\n__webpack_require__.d(shape_namespaceObject, \"Polygon\", function() { return polygon; });\n__webpack_require__.d(shape_namespaceObject, \"Polyline\", function() { return polyline; });\n__webpack_require__.d(shape_namespaceObject, \"Rect\", function() { return rect; });\n__webpack_require__.d(shape_namespaceObject, \"Text\", function() { return shape_text; });\n\n// EXTERNAL MODULE: ./node_modules/tslib/tslib.es6.js\nvar tslib_es6 = __webpack_require__(1);\n\n// EXTERNAL MODULE: ./node_modules/@antv/g-base/esm/index.js\nvar esm = __webpack_require__(21);\n\n// EXTERNAL MODULE: ./node_modules/@antv/g-canvas/esm/util/util.js\nvar util = __webpack_require__(16);\n\n// EXTERNAL MODULE: ./node_modules/@antv/g-canvas/esm/util/draw.js\nvar draw = __webpack_require__(30);\n\n// EXTERNAL MODULE: ./node_modules/@antv/g-canvas/esm/group.js\nvar group = __webpack_require__(77);\n\n// CONCATENATED MODULE: ./node_modules/@antv/g-canvas/esm/shape/base.js\n\n\n\n\n\n\n\nvar base_ShapeBase = /** @class */ (function (_super) {\n Object(tslib_es6[\"__extends\"])(ShapeBase, _super);\n function ShapeBase() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n ShapeBase.prototype.getDefaultAttrs = function () {\n var attrs = _super.prototype.getDefaultAttrs.call(this);\n // 设置默认值\n return Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, attrs), { lineWidth: 1, lineAppendWidth: 0, strokeOpacity: 1, fillOpacity: 1 });\n };\n ShapeBase.prototype.getShapeBase = function () {\n return shape_namespaceObject;\n };\n ShapeBase.prototype.getGroupBase = function () {\n return group[\"a\" /* default */];\n };\n /**\n * 一些方法调用会引起画布变化\n * @param {ChangeType} changeType 改变的类型\n */\n ShapeBase.prototype.onCanvasChange = function (changeType) {\n Object(draw[\"h\" /* refreshElement */])(this, changeType);\n };\n ShapeBase.prototype.calculateBBox = function () {\n var type = this.get('type');\n var lineWidth = this.getHitLineWidth();\n // const attrs = this.attr();\n var bboxMethod = Object(esm[\"getBBoxMethod\"])(type);\n var box = bboxMethod(this);\n var halfLineWidth = lineWidth / 2;\n var minX = box.x - halfLineWidth;\n var minY = box.y - halfLineWidth;\n var maxX = box.x + box.width + halfLineWidth;\n var maxY = box.y + box.height + halfLineWidth;\n return {\n x: minX,\n minX: minX,\n y: minY,\n minY: minY,\n width: box.width + lineWidth,\n height: box.height + lineWidth,\n maxX: maxX,\n maxY: maxY,\n };\n };\n ShapeBase.prototype.isFill = function () {\n return !!this.attrs['fill'] || this.isClipShape();\n };\n ShapeBase.prototype.isStroke = function () {\n return !!this.attrs['stroke'];\n };\n // 同 shape 中的方法重复了\n ShapeBase.prototype._applyClip = function (context, clip) {\n if (clip) {\n context.save();\n // 将 clip 的属性挂载到 context 上\n Object(draw[\"a\" /* applyAttrsToContext */])(context, clip);\n // 绘制 clip 路径\n clip.createPath(context);\n context.restore();\n // 裁剪\n context.clip();\n clip._afterDraw();\n }\n };\n // 绘制图形时需要考虑 region 限制\n ShapeBase.prototype.draw = function (context, region) {\n var clip = this.cfg.clipShape;\n // 如果指定了 region,同时不允许刷新时,直接返回\n if (region) {\n if (this.cfg.refresh === false) {\n // this._afterDraw();\n this.set('hasChanged', false);\n return;\n }\n // 是否相交需要考虑 clip 的包围盒\n var bbox = this.getCanvasBBox();\n if (!Object(util[\"f\" /* intersectRect */])(region, bbox)) {\n // 图形的包围盒与重绘区域不相交时,也需要清除标记\n this.set('hasChanged', false);\n // 存在多种情形需要更新 cacheCanvasBBox 和 isInview 的判定\n // 1. 之前图形在视窗内,但是现在不再视窗内\n // 2. 如果当前的图形以及父元素都没有发生过变化,refresh = false 不会走到这里,所以这里的图形都是父元素发生变化,但是没有在视图内的元素\n if (this.cfg.isInView) {\n this._afterDraw();\n }\n return;\n }\n }\n context.save();\n // 先将 attrs 应用到上下文中,再设置 clip。因为 clip 应该被当前元素的 matrix 所影响\n Object(draw[\"a\" /* applyAttrsToContext */])(context, this);\n this._applyClip(context, clip);\n this.drawPath(context);\n context.restore();\n this._afterDraw();\n };\n ShapeBase.prototype.getCanvasViewBox = function () {\n var canvas = this.cfg.canvas;\n if (canvas) {\n // @ts-ignore\n return canvas.getViewRange();\n }\n return null;\n };\n ShapeBase.prototype.cacheCanvasBBox = function () {\n var canvasBBox = this.getCanvasViewBox();\n // 绘制的时候缓存包围盒\n if (canvasBBox) {\n var bbox = this.getCanvasBBox();\n var isInView = Object(util[\"f\" /* intersectRect */])(bbox, canvasBBox);\n this.set('isInView', isInView);\n // 不再视窗内 cacheCanvasBBox 设置成 null,会提升局部渲染的性能,\n // 因为在局部渲染影响的包围盒计算时不考虑这个图形的包围盒\n // 父元素 cacheCanvasBBox 计算的时候也不计算\n if (isInView) {\n this.set('cacheCanvasBBox', bbox);\n }\n else {\n this.set('cacheCanvasBBox', null);\n }\n }\n };\n ShapeBase.prototype._afterDraw = function () {\n this.cacheCanvasBBox();\n // 绘制后消除标记\n this.set('hasChanged', false);\n this.set('refresh', null);\n };\n ShapeBase.prototype.skipDraw = function () {\n this.set('cacheCanvasBBox', null);\n this.set('isInView', null);\n this.set('hasChanged', false);\n };\n /**\n * 绘制图形的路径\n * @param {CanvasRenderingContext2D} context 上下文\n */\n ShapeBase.prototype.drawPath = function (context) {\n this.createPath(context);\n this.strokeAndFill(context);\n this.afterDrawPath(context);\n };\n /**\n * @protected\n * 填充图形\n * @param {CanvasRenderingContext2D} context context 上下文\n */\n ShapeBase.prototype.fill = function (context) {\n context.fill();\n };\n /**\n * @protected\n * 绘制图形边框\n * @param {CanvasRenderingContext2D} context context 上下文\n */\n ShapeBase.prototype.stroke = function (context) {\n context.stroke();\n };\n // 绘制或者填充\n ShapeBase.prototype.strokeAndFill = function (context) {\n var _a = this.attrs, lineWidth = _a.lineWidth, opacity = _a.opacity, strokeOpacity = _a.strokeOpacity, fillOpacity = _a.fillOpacity;\n if (this.isFill()) {\n if (!Object(util[\"i\" /* isNil */])(fillOpacity) && fillOpacity !== 1) {\n context.globalAlpha = fillOpacity;\n this.fill(context);\n context.globalAlpha = opacity;\n }\n else {\n this.fill(context);\n }\n }\n if (this.isStroke()) {\n if (lineWidth > 0) {\n if (!Object(util[\"i\" /* isNil */])(strokeOpacity) && strokeOpacity !== 1) {\n context.globalAlpha = strokeOpacity;\n }\n this.stroke(context);\n }\n }\n this.afterDrawPath(context);\n };\n /**\n * @protected\n * 绘制图形的路径\n * @param {CanvasRenderingContext2D} context 上下文\n */\n ShapeBase.prototype.createPath = function (context) { };\n /**\n * 绘制完成 path 后的操作\n * @param {CanvasRenderingContext2D} context 上下文\n */\n ShapeBase.prototype.afterDrawPath = function (context) { };\n ShapeBase.prototype.isInShape = function (refX, refY) {\n // return HitUtil.isHitShape(this, refX, refY);\n var isStroke = this.isStroke();\n var isFill = this.isFill();\n var lineWidth = this.getHitLineWidth();\n return this.isInStrokeOrPath(refX, refY, isStroke, isFill, lineWidth);\n };\n // 之所以不拆成 isInStroke 和 isInPath 在于两者存在一些共同的计算\n ShapeBase.prototype.isInStrokeOrPath = function (x, y, isStroke, isFill, lineWidth) {\n return false;\n };\n /**\n * 获取线拾取的宽度\n * @returns {number} 线的拾取宽度\n */\n ShapeBase.prototype.getHitLineWidth = function () {\n if (!this.isStroke()) {\n return 0;\n }\n var attrs = this.attrs;\n return attrs['lineWidth'] + attrs['lineAppendWidth'];\n };\n return ShapeBase;\n}(esm[\"AbstractShape\"]));\n/* harmony default export */ var base = (base_ShapeBase);\n//# sourceMappingURL=base.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-canvas/esm/shape/circle.js\n/**\n * @fileoverview 圆\n * @author dxq613@gmail.com\n */\n\n\n\nvar circle_Circle = /** @class */ (function (_super) {\n Object(tslib_es6[\"__extends\"])(Circle, _super);\n function Circle() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n Circle.prototype.getDefaultAttrs = function () {\n var attrs = _super.prototype.getDefaultAttrs.call(this);\n return Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, attrs), { x: 0, y: 0, r: 0 });\n };\n Circle.prototype.isInStrokeOrPath = function (x, y, isStroke, isFill, lineWidth) {\n var attrs = this.attr();\n var cx = attrs.x;\n var cy = attrs.y;\n var r = attrs.r;\n var halfLineWidth = lineWidth / 2;\n var absDistance = Object(util[\"b\" /* distance */])(cx, cy, x, y);\n // 直接用距离,如果同时存在边和填充时,可以减少两次计算\n if (isFill && isStroke) {\n return absDistance <= r + halfLineWidth;\n }\n if (isFill) {\n return absDistance <= r;\n }\n if (isStroke) {\n return absDistance >= r - halfLineWidth && absDistance <= r + halfLineWidth;\n }\n return false;\n };\n Circle.prototype.createPath = function (context) {\n var attrs = this.attr();\n var cx = attrs.x;\n var cy = attrs.y;\n var r = attrs.r;\n context.beginPath();\n context.arc(cx, cy, r, 0, Math.PI * 2, false);\n context.closePath();\n };\n return Circle;\n}(base));\n/* harmony default export */ var circle = (circle_Circle);\n//# sourceMappingURL=circle.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-canvas/esm/shape/ellipse.js\n/**\n * @fileoverview 椭圆\n * @author dxq613@gmail.com\n */\n\n\n// 根据椭圆公式计算 x*x/rx*rx + y*y/ry*ry;\nfunction ellipseDistance(squareX, squareY, rx, ry) {\n return squareX / (rx * rx) + squareY / (ry * ry);\n}\nvar ellipse_Ellipse = /** @class */ (function (_super) {\n Object(tslib_es6[\"__extends\"])(Ellipse, _super);\n function Ellipse() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n Ellipse.prototype.getDefaultAttrs = function () {\n var attrs = _super.prototype.getDefaultAttrs.call(this);\n return Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, attrs), { x: 0, y: 0, rx: 0, ry: 0 });\n };\n Ellipse.prototype.isInStrokeOrPath = function (x, y, isStroke, isFill, lineWidth) {\n var attrs = this.attr();\n var halfLineWith = lineWidth / 2;\n var cx = attrs.x;\n var cy = attrs.y;\n var rx = attrs.rx, ry = attrs.ry;\n var squareX = (x - cx) * (x - cx);\n var squareY = (y - cy) * (y - cy);\n // 使用椭圆的公式: x*x/rx*rx + y*y/ry*ry = 1;\n if (isFill && isStroke) {\n return ellipseDistance(squareX, squareY, rx + halfLineWith, ry + halfLineWith) <= 1;\n }\n if (isFill) {\n return ellipseDistance(squareX, squareY, rx, ry) <= 1;\n }\n if (isStroke) {\n return (ellipseDistance(squareX, squareY, rx - halfLineWith, ry - halfLineWith) >= 1 &&\n ellipseDistance(squareX, squareY, rx + halfLineWith, ry + halfLineWith) <= 1);\n }\n return false;\n };\n Ellipse.prototype.createPath = function (context) {\n var attrs = this.attr();\n var cx = attrs.x;\n var cy = attrs.y;\n var rx = attrs.rx;\n var ry = attrs.ry;\n context.beginPath();\n // 兼容逻辑\n if (context.ellipse) {\n context.ellipse(cx, cy, rx, ry, 0, 0, Math.PI * 2, false);\n }\n else {\n // 如果不支持,则使用圆来绘制,进行变形\n var r = rx > ry ? rx : ry;\n var scaleX = rx > ry ? 1 : rx / ry;\n var scaleY = rx > ry ? ry / rx : 1;\n context.save();\n context.translate(cx, cy);\n context.scale(scaleX, scaleY);\n context.arc(0, 0, r, 0, Math.PI * 2);\n context.restore();\n context.closePath();\n }\n };\n return Ellipse;\n}(base));\n/* harmony default export */ var ellipse = (ellipse_Ellipse);\n//# sourceMappingURL=ellipse.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-canvas/esm/shape/image.js\n/**\n * @fileoverview 图片\n * @author dxq613@gmail.com\n */\n\n\n\nfunction isCanvas(dom) {\n return dom instanceof HTMLElement && Object(util[\"k\" /* isString */])(dom.nodeName) && dom.nodeName.toUpperCase() === 'CANVAS';\n}\nvar image_ImageShape = /** @class */ (function (_super) {\n Object(tslib_es6[\"__extends\"])(ImageShape, _super);\n function ImageShape() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n ImageShape.prototype.getDefaultAttrs = function () {\n var attrs = _super.prototype.getDefaultAttrs.call(this);\n return Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, attrs), { x: 0, y: 0, width: 0, height: 0 });\n };\n ImageShape.prototype.initAttrs = function (attrs) {\n this._setImage(attrs.img);\n };\n // image 不计算 stroke\n ImageShape.prototype.isStroke = function () {\n return false;\n };\n // 仅仅使用包围盒检测来进行拾取\n // 所以不需要复写 isInStrokeOrPath 的方法\n ImageShape.prototype.isOnlyHitBox = function () {\n return true;\n };\n ImageShape.prototype._afterLoading = function () {\n if (this.get('toDraw') === true) {\n var canvas = this.get('canvas');\n if (canvas) {\n // 这段应该改成局部渲染\n canvas.draw();\n }\n else {\n // 这种方式如果发生遮挡会出现问题\n this.createPath(this.get('context'));\n }\n }\n };\n ImageShape.prototype._setImage = function (img) {\n var _this = this;\n var attrs = this.attrs;\n if (Object(util[\"k\" /* isString */])(img)) {\n var image_1 = new Image();\n image_1.onload = function () {\n // 图片未加载完,则已经被销毁\n if (_this.destroyed) {\n return false;\n }\n // 缓存原始地址,可以做对比,防止重复加载图片\n // 如果考虑到在加载过程中可能替换 img 属性,则情况更加复杂\n // this.set('imgSrc', img);\n // 这里会循环调用 _setImage 方法,但不会再走这个分支\n _this.attr('img', image_1);\n _this.set('loading', false);\n _this._afterLoading();\n var callback = _this.get('callback');\n if (callback) {\n callback.call(_this);\n }\n };\n // 设置跨域\n image_1.crossOrigin = 'Anonymous';\n image_1.src = img;\n // loading 过程中不绘制\n this.set('loading', true);\n }\n else if (img instanceof Image) {\n // 如果是一个 image 对象,则设置宽高\n if (!attrs.width) {\n attrs.width = img.width;\n }\n if (!attrs.height) {\n attrs.height = img.height;\n }\n }\n else if (isCanvas(img)) {\n // 如果设置了 canvas 对象\n if (!attrs.width) {\n attrs.width = Number(img.getAttribute('width'));\n }\n if (!attrs.height) {\n attrs.height, Number(img.getAttribute('height'));\n }\n }\n };\n ImageShape.prototype.onAttrChange = function (name, value, originValue) {\n _super.prototype.onAttrChange.call(this, name, value, originValue);\n // 如果加载的已经是当前图片,则不再处理\n if (name === 'img') {\n // 可以加缓冲,&& this.get('imgSrc') !== value\n this._setImage(value);\n }\n };\n ImageShape.prototype.createPath = function (context) {\n // 正在加载则不绘制\n if (this.get('loading')) {\n this.set('toDraw', true); // 加载完成后绘制\n this.set('context', context);\n return;\n }\n var attrs = this.attr();\n var x = attrs.x, y = attrs.y, width = attrs.width, height = attrs.height, sx = attrs.sx, sy = attrs.sy, swidth = attrs.swidth, sheight = attrs.sheight;\n var img = attrs.img;\n if (img instanceof Image || isCanvas(img)) {\n if (!Object(util[\"i\" /* isNil */])(sx) && !Object(util[\"i\" /* isNil */])(sy) && !Object(util[\"i\" /* isNil */])(swidth) && !Object(util[\"i\" /* isNil */])(sheight)) {\n context.drawImage(img, sx, sy, swidth, sheight, x, y, width, height);\n }\n else {\n context.drawImage(img, x, y, width, height);\n }\n }\n };\n return ImageShape;\n}(base));\n/* harmony default export */ var shape_image = (image_ImageShape);\n//# sourceMappingURL=image.js.map\n// EXTERNAL MODULE: ./node_modules/@antv/g-math/esm/index.js + 10 modules\nvar g_math_esm = __webpack_require__(20);\n\n// CONCATENATED MODULE: ./node_modules/@antv/g-canvas/esm/util/in-stroke/line.js\n\nfunction inLine(x1, y1, x2, y2, lineWidth, x, y) {\n var minX = Math.min(x1, x2);\n var maxX = Math.max(x1, x2);\n var minY = Math.min(y1, y2);\n var maxY = Math.max(y1, y2);\n var halfWidth = lineWidth / 2;\n // 因为目前的方案是计算点到直线的距离,而有可能会在延长线上,所以要先判断是否在包围盒内\n // 这种方案会在水平或者竖直的情况下载线的延长线上有半 lineWidth 的误差\n if (!(x >= minX - halfWidth && x <= maxX + halfWidth && y >= minY - halfWidth && y <= maxY + halfWidth)) {\n return false;\n }\n // 因为已经计算了包围盒,所以仅需要计算到直线的距离即可,可以显著提升性能\n return g_math_esm[\"c\" /* Line */].pointToLine(x1, y1, x2, y2, x, y) <= lineWidth / 2;\n}\n//# sourceMappingURL=line.js.map\n// EXTERNAL MODULE: ./node_modules/@antv/g-canvas/esm/util/arrow.js\nvar arrow = __webpack_require__(33);\n\n// CONCATENATED MODULE: ./node_modules/@antv/g-canvas/esm/shape/line.js\n\n/**\n * @fileoverview 线\n * @author dxq613@gmail.com\n */\n\n\n\n\nvar line_Line = /** @class */ (function (_super) {\n Object(tslib_es6[\"__extends\"])(Line, _super);\n function Line() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n Line.prototype.getDefaultAttrs = function () {\n var attrs = _super.prototype.getDefaultAttrs.call(this);\n return Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, attrs), { x1: 0, y1: 0, x2: 0, y2: 0, startArrow: false, endArrow: false });\n };\n Line.prototype.initAttrs = function (attrs) {\n this.setArrow();\n };\n // 更新属性时,检测是否更改了箭头\n Line.prototype.onAttrChange = function (name, value, originValue) {\n _super.prototype.onAttrChange.call(this, name, value, originValue);\n // 由于箭头的绘制依赖于 line 的诸多 attrs,因此这里不再对每个 attr 进行判断,attr 每次变化都会影响箭头的更新\n this.setArrow();\n };\n Line.prototype.setArrow = function () {\n var attrs = this.attr();\n var x1 = attrs.x1, y1 = attrs.y1, x2 = attrs.x2, y2 = attrs.y2, startArrow = attrs.startArrow, endArrow = attrs.endArrow;\n if (startArrow) {\n arrow[\"b\" /* addStartArrow */](this, attrs, x2, y2, x1, y1);\n }\n if (endArrow) {\n arrow[\"a\" /* addEndArrow */](this, attrs, x1, y1, x2, y2);\n }\n };\n Line.prototype.isInStrokeOrPath = function (x, y, isStroke, isFill, lineWidth) {\n if (!isStroke || !lineWidth) {\n return false;\n }\n var _a = this.attr(), x1 = _a.x1, y1 = _a.y1, x2 = _a.x2, y2 = _a.y2;\n return inLine(x1, y1, x2, y2, lineWidth, x, y);\n };\n Line.prototype.createPath = function (context) {\n var attrs = this.attr();\n var x1 = attrs.x1, y1 = attrs.y1, x2 = attrs.x2, y2 = attrs.y2, startArrow = attrs.startArrow, endArrow = attrs.endArrow;\n var startArrowDistance = {\n dx: 0,\n dy: 0,\n };\n var endArrowDistance = {\n dx: 0,\n dy: 0,\n };\n if (startArrow && startArrow.d) {\n startArrowDistance = arrow[\"c\" /* getShortenOffset */](x1, y1, x2, y2, attrs.startArrow.d);\n }\n if (endArrow && endArrow.d) {\n endArrowDistance = arrow[\"c\" /* getShortenOffset */](x1, y1, x2, y2, attrs.endArrow.d);\n }\n context.beginPath();\n // 如果自定义箭头,线条相应缩进\n context.moveTo(x1 + startArrowDistance.dx, y1 + startArrowDistance.dy);\n context.lineTo(x2 - endArrowDistance.dx, y2 - endArrowDistance.dy);\n };\n Line.prototype.afterDrawPath = function (context) {\n var startArrowShape = this.get('startArrowShape');\n var endArrowShape = this.get('endArrowShape');\n if (startArrowShape) {\n startArrowShape.draw(context);\n }\n if (endArrowShape) {\n endArrowShape.draw(context);\n }\n };\n /**\n * Get length of line\n * @return {number} length\n */\n Line.prototype.getTotalLength = function () {\n var _a = this.attr(), x1 = _a.x1, y1 = _a.y1, x2 = _a.x2, y2 = _a.y2;\n return g_math_esm[\"c\" /* Line */].length(x1, y1, x2, y2);\n };\n /**\n * Get point according to ratio\n * @param {number} ratio\n * @return {Point} point\n */\n Line.prototype.getPoint = function (ratio) {\n var _a = this.attr(), x1 = _a.x1, y1 = _a.y1, x2 = _a.x2, y2 = _a.y2;\n return g_math_esm[\"c\" /* Line */].pointAt(x1, y1, x2, y2, ratio);\n };\n return Line;\n}(base));\n/* harmony default export */ var line = (line_Line);\n//# sourceMappingURL=line.js.map\n// EXTERNAL MODULE: ./node_modules/@antv/util/esm/index.js + 110 modules\nvar util_esm = __webpack_require__(0);\n\n// EXTERNAL MODULE: ./node_modules/@antv/path-util/esm/index.js + 22 modules\nvar path_util_esm = __webpack_require__(37);\n\n// CONCATENATED MODULE: ./node_modules/@antv/g-canvas/esm/shape/marker.js\n/**\n * @fileoverview Marker\n * @author dxq613@gmail.com\n */\n\n\n\n\n\n\nvar Symbols = {\n // 圆\n circle: function (x, y, r) {\n return [\n ['M', x - r, y],\n ['A', r, r, 0, 1, 0, x + r, y],\n ['A', r, r, 0, 1, 0, x - r, y],\n ];\n },\n // 正方形\n square: function (x, y, r) {\n return [['M', x - r, y - r], ['L', x + r, y - r], ['L', x + r, y + r], ['L', x - r, y + r], ['Z']];\n },\n // 菱形\n diamond: function (x, y, r) {\n return [['M', x - r, y], ['L', x, y - r], ['L', x + r, y], ['L', x, y + r], ['Z']];\n },\n // 三角形\n triangle: function (x, y, r) {\n var diffY = r * Math.sin((1 / 3) * Math.PI);\n return [['M', x - r, y + diffY], ['L', x, y - diffY], ['L', x + r, y + diffY], ['Z']];\n },\n // 倒三角形\n 'triangle-down': function (x, y, r) {\n var diffY = r * Math.sin((1 / 3) * Math.PI);\n return [['M', x - r, y - diffY], ['L', x + r, y - diffY], ['L', x, y + diffY], ['Z']];\n },\n};\nvar marker_Marker = /** @class */ (function (_super) {\n Object(tslib_es6[\"__extends\"])(Marker, _super);\n function Marker() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n Marker.prototype.initAttrs = function (attrs) {\n this._resetParamsCache();\n };\n // 重置绘制 path 存储的缓存\n Marker.prototype._resetParamsCache = function () {\n // 为了加速 path 的绘制、拾取和计算,这个地方可以缓存很多东西\n // 这些缓存都是第一次需要时计算和存储,虽然增加了复杂度,但是频繁调用的方法,性能有很大提升\n this.set('paramsCache', {}); // 清理缓存\n };\n // 更新属性时,检测是否更改了 path\n Marker.prototype.onAttrChange = function (name, value, originValue) {\n _super.prototype.onAttrChange.call(this, name, value, originValue);\n if (['symbol', 'x', 'y', 'r', 'radius'].indexOf(name) !== -1) {\n // path 相关属性更改时,清理缓存\n this._resetParamsCache();\n }\n };\n // 仅仅使用包围盒检测来进行拾取\n // 所以不需要复写 isInStrokeOrPath 的方法\n Marker.prototype.isOnlyHitBox = function () {\n return true;\n };\n Marker.prototype._getR = function (attrs) {\n // 兼容 r 和 radius 两种写法,推荐使用 r\n return Object(util_esm[\"isNil\"])(attrs.r) ? attrs.radius : attrs.r;\n };\n Marker.prototype._getPath = function () {\n var attrs = this.attr();\n var x = attrs.x, y = attrs.y;\n var symbol = attrs.symbol || 'circle';\n var r = this._getR(attrs);\n var method;\n var path;\n if (Object(util[\"h\" /* isFunction */])(symbol)) {\n method = symbol;\n path = method(x, y, r);\n // 将 path 转成绝对路径\n path = Object(path_util_esm[\"c\" /* path2Absolute */])(path);\n }\n else {\n // 内置 symbol 的 path 都是绝对路径,直接绘制即可,不需要对 path 进行特殊处理\n method = Marker.Symbols[symbol];\n if (!method) {\n console.warn(symbol + \" marker is not supported.\");\n return null;\n }\n path = method(x, y, r);\n }\n return path;\n };\n Marker.prototype.createPath = function (context) {\n var path = this._getPath();\n var paramsCache = this.get('paramsCache');\n Object(draw[\"e\" /* drawPath */])(this, context, { path: path }, paramsCache);\n };\n Marker.Symbols = Symbols;\n return Marker;\n}(base));\n/* harmony default export */ var marker = (marker_Marker);\n//# sourceMappingURL=marker.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-canvas/esm/util/in-path/point-in-path.js\n\nfunction isPointInPath(shape, x, y) {\n var ctx = Object(esm[\"getOffScreenContext\"])();\n shape.createPath(ctx);\n return ctx.isPointInPath(x, y);\n}\n//# sourceMappingURL=point-in-path.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-canvas/esm/util/in-path/polygon.js\n/**\n * @fileoverview 判断点是否在多边形内\n * @author dxq613@gmail.com\n */\n// 多边形的射线检测,参考:https://blog.csdn.net/WilliamSun0122/article/details/77994526\nvar tolerance = 1e-6;\n// 三态函数,判断两个double在eps精度下的大小关系\nfunction dcmp(x) {\n if (Math.abs(x) < tolerance) {\n return 0;\n }\n return x < 0 ? -1 : 1;\n}\n// 判断点Q是否在p1和p2的线段上\nfunction onSegment(p1, p2, q) {\n if ((q[0] - p1[0]) * (p2[1] - p1[1]) === (p2[0] - p1[0]) * (q[1] - p1[1]) &&\n Math.min(p1[0], p2[0]) <= q[0] &&\n q[0] <= Math.max(p1[0], p2[0]) &&\n Math.min(p1[1], p2[1]) <= q[1] &&\n q[1] <= Math.max(p1[1], p2[1])) {\n return true;\n }\n return false;\n}\n// 判断点P在多边形内-射线法\nfunction isInPolygon(points, x, y) {\n var isHit = false;\n var n = points.length;\n if (n <= 2) {\n // svg 中点小于 3 个时,不显示,也无法被拾取\n return false;\n }\n for (var i = 0; i < n; i++) {\n var p1 = points[i];\n var p2 = points[(i + 1) % n];\n if (onSegment(p1, p2, [x, y])) {\n // 点在多边形一条边上\n return true;\n }\n // 前一个判断min(p1[1],p2[1]) 0 !== dcmp(p2[1] - y) > 0 &&\n dcmp(x - ((y - p1[1]) * (p1[0] - p2[0])) / (p1[1] - p2[1]) - p1[0]) < 0) {\n isHit = !isHit;\n }\n }\n return isHit;\n}\n//# sourceMappingURL=polygon.js.map\n// EXTERNAL MODULE: ./node_modules/@antv/matrix-util/esm/index.js + 1 modules\nvar matrix_util_esm = __webpack_require__(14);\n\n// EXTERNAL MODULE: ./node_modules/gl-matrix/esm/vec3.js\nvar vec3 = __webpack_require__(39);\n\n// CONCATENATED MODULE: ./node_modules/@antv/g-canvas/esm/util/in-stroke/arc.js\n\nfunction arc(cx, cy, r, startAngle, endAngle, lineWidth, x, y) {\n var angle = (Math.atan2(y - cy, x - cx) + Math.PI * 2) % (Math.PI * 2); // 转换到 0 - 2 * Math.PI 之间\n if (angle < startAngle || angle > endAngle) {\n return false;\n }\n var point = {\n x: cx + r * Math.cos(angle),\n y: cy + r * Math.sin(angle),\n };\n return Object(util[\"b\" /* distance */])(point.x, point.y, x, y) <= lineWidth / 2;\n}\n//# sourceMappingURL=arc.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-canvas/esm/util/path.js\n\n/**\n * @fileoverview path 的一些工具\n * @author dxq613@gmail.com\n */\n\n\n\n\n\n\n\n\nvar transform = matrix_util_esm[\"ext\"].transform;\nfunction path_hasArc(path) {\n var hasArc = false;\n var count = path.length;\n for (var i = 0; i < count; i++) {\n var params = path[i];\n var cmd = params[0];\n if (cmd === 'C' || cmd === 'A' || cmd === 'Q') {\n hasArc = true;\n break;\n }\n }\n return hasArc;\n}\nfunction isPointInStroke(segments, lineWidth, x, y, length) {\n var isHit = false;\n var halfWidth = lineWidth / 2;\n for (var i = 0; i < segments.length; i++) {\n var segment = segments[i];\n var currentPoint = segment.currentPoint, params = segment.params, prePoint = segment.prePoint, box = segment.box;\n // 如果在前面已经生成过包围盒,直接按照包围盒计算\n if (box && !Object(util[\"e\" /* inBox */])(box.x - halfWidth, box.y - halfWidth, box.width + lineWidth, box.height + lineWidth, x, y)) {\n continue;\n }\n switch (segment.command) {\n // L 和 Z 都是直线, M 不进行拾取\n case 'L':\n case 'Z':\n isHit = inLine(prePoint[0], prePoint[1], currentPoint[0], currentPoint[1], lineWidth, x, y);\n break;\n case 'Q':\n var qDistance = g_math_esm[\"e\" /* Quad */].pointDistance(prePoint[0], prePoint[1], params[1], params[2], params[3], params[4], x, y);\n isHit = qDistance <= lineWidth / 2;\n break;\n case 'C':\n var cDistance = g_math_esm[\"b\" /* Cubic */].pointDistance(prePoint[0], // 上一段结束位置, 即 C 的起始点\n prePoint[1], params[1], // 'C' 的参数,1、2 为第一个控制点,3、4 为第二个控制点,5、6 为结束点\n params[2], params[3], params[4], params[5], params[6], x, y, length);\n isHit = cDistance <= lineWidth / 2;\n break;\n case 'A':\n // 计算点到椭圆圆弧的距离,暂时使用近似算法,后面可以改成切割法求最近距离\n var arcParams = segment.arcParams;\n var cx = arcParams.cx, cy = arcParams.cy, rx = arcParams.rx, ry = arcParams.ry, startAngle = arcParams.startAngle, endAngle = arcParams.endAngle, xRotation = arcParams.xRotation;\n var p = [x, y, 1];\n var r = rx > ry ? rx : ry;\n var scaleX = rx > ry ? 1 : rx / ry;\n var scaleY = rx > ry ? ry / rx : 1;\n var m = transform(null, [\n ['t', -cx, -cy],\n ['r', -xRotation],\n ['s', 1 / scaleX, 1 / scaleY],\n ]);\n vec3[\"transformMat3\"](p, p, m);\n isHit = arc(0, 0, r, startAngle, endAngle, lineWidth, p[0], p[1]);\n break;\n default:\n break;\n }\n if (isHit) {\n break;\n }\n }\n return isHit;\n}\n/**\n * 提取出内部的闭合多边形和非闭合的多边形,假设 path 不存在圆弧\n * @param {Array} path 路径\n * @returns {Array} 点的集合\n */\nfunction extractPolygons(path) {\n var count = path.length;\n var polygons = [];\n var polylines = [];\n var points = []; // 防止第一个命令不是 'M'\n for (var i = 0; i < count; i++) {\n var params = path[i];\n var cmd = params[0];\n if (cmd === 'M') {\n // 遇到 'M' 判定是否是新数组,新数组中没有点\n if (points.length) {\n // 如果存在点,则说明没有遇到 'Z',开始了一个新的多边形\n polylines.push(points);\n points = []; // 创建新的点\n }\n points.push([params[1], params[2]]);\n }\n else if (cmd === 'Z') {\n if (points.length) {\n // 存在点\n polygons.push(points);\n points = []; // 开始新的点集合\n }\n // 如果不存在点,同时 'Z',则说明是错误,不处理\n }\n else {\n points.push([params[1], params[2]]);\n }\n }\n // 说明 points 未放入 polygons 或者 polyline\n // 仅当只有一个 M,没有 Z 时会发生这种情况\n if (points.length > 0) {\n polylines.push(points);\n }\n return {\n polygons: polygons,\n polylines: polylines,\n };\n}\n/* harmony default export */ var util_path = (Object(tslib_es6[\"__assign\"])({ hasArc: path_hasArc, extractPolygons: extractPolygons, isPointInStroke: isPointInStroke }, esm[\"PathUtil\"]));\n//# sourceMappingURL=path.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-canvas/esm/shape/path.js\n\n\n\n\n\n\n\n\n\n\n// 是否在多个多边形内部\nfunction isInPolygons(polygons, x, y) {\n var isHit = false;\n for (var i = 0; i < polygons.length; i++) {\n var points = polygons[i];\n isHit = isInPolygon(points, x, y);\n if (isHit) {\n break;\n }\n }\n return isHit;\n}\nvar path_Path = /** @class */ (function (_super) {\n Object(tslib_es6[\"__extends\"])(Path, _super);\n function Path() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n Path.prototype.getDefaultAttrs = function () {\n var attrs = _super.prototype.getDefaultAttrs.call(this);\n return Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, attrs), { startArrow: false, endArrow: false });\n };\n Path.prototype.initAttrs = function (attrs) {\n this._setPathArr(attrs.path);\n this.setArrow();\n };\n // 更新属性时,检测是否更改了 path\n Path.prototype.onAttrChange = function (name, value, originValue) {\n _super.prototype.onAttrChange.call(this, name, value, originValue);\n if (name === 'path') {\n this._setPathArr(value);\n }\n // 由于箭头的绘制依赖于 line 的诸多 attrs,因此这里不再对每个 attr 进行判断,attr 每次变化都会影响箭头的更新\n this.setArrow();\n };\n // 将 path 转换成绝对路径\n Path.prototype._setPathArr = function (path) {\n // 转换 path 的格式\n this.attrs.path = Object(path_util_esm[\"c\" /* path2Absolute */])(path);\n var hasArc = util_path.hasArc(path);\n // 为了加速 path 的绘制、拾取和计算,这个地方可以缓存很多东西\n // 这些缓存都是第一次需要时计算和存储,虽然增加了复杂度,但是频繁调用的方法,性能有很大提升\n this.set('hasArc', hasArc);\n this.set('paramsCache', {}); // 清理缓存\n this.set('segments', null); // 延迟生成 path,在动画场景下可能不会有拾取\n this.set('curve', null);\n this.set('tCache', null);\n this.set('totalLength', null);\n };\n Path.prototype.getSegments = function () {\n var segments = this.get('segements');\n if (!segments) {\n segments = Object(path_util_esm[\"d\" /* path2Segments */])(this.attr('path'));\n this.set('segments', segments);\n }\n return segments;\n };\n Path.prototype.setArrow = function () {\n var attrs = this.attr();\n var startArrow = attrs.startArrow, endArrow = attrs.endArrow;\n if (startArrow) {\n var tangent = this.getStartTangent();\n arrow[\"b\" /* addStartArrow */](this, attrs, tangent[0][0], tangent[0][1], tangent[1][0], tangent[1][1]);\n }\n if (endArrow) {\n var tangent = this.getEndTangent();\n arrow[\"a\" /* addEndArrow */](this, attrs, tangent[0][0], tangent[0][1], tangent[1][0], tangent[1][1]);\n }\n };\n Path.prototype.isInStrokeOrPath = function (x, y, isStroke, isFill, lineWidth) {\n var segments = this.getSegments();\n var hasArc = this.get('hasArc');\n var isHit = false;\n if (isStroke) {\n var length_1 = this.getTotalLength();\n isHit = util_path.isPointInStroke(segments, lineWidth, x, y, length_1);\n }\n if (!isHit && isFill) {\n if (hasArc) {\n // 存在曲线时,暂时使用 canvas 的 api 计算,后续可以进行多边形切割\n isHit = isPointInPath(this, x, y);\n }\n else {\n var path = this.attr('path');\n var extractResutl = util_path.extractPolygons(path);\n // 提取出来的多边形包含闭合的和非闭合的,在这里统一按照多边形处理\n isHit = isInPolygons(extractResutl.polygons, x, y) || isInPolygons(extractResutl.polylines, x, y);\n }\n }\n return isHit;\n };\n Path.prototype.createPath = function (context) {\n var attrs = this.attr();\n var paramsCache = this.get('paramsCache'); // 由于计算圆弧的参数成本很大,所以要缓存\n Object(draw[\"e\" /* drawPath */])(this, context, attrs, paramsCache);\n };\n Path.prototype.afterDrawPath = function (context) {\n var startArrowShape = this.get('startArrowShape');\n var endArrowShape = this.get('endArrowShape');\n if (startArrowShape) {\n startArrowShape.draw(context);\n }\n if (endArrowShape) {\n endArrowShape.draw(context);\n }\n };\n /**\n * Get total length of path\n * @return {number} length\n */\n Path.prototype.getTotalLength = function () {\n var totalLength = this.get('totalLength');\n if (!Object(util_esm[\"isNil\"])(totalLength)) {\n return totalLength;\n }\n this._calculateCurve();\n this._setTcache();\n return this.get('totalLength');\n };\n /**\n * Get point according to ratio\n * @param {number} ratio\n * @return {Point} point\n */\n Path.prototype.getPoint = function (ratio) {\n var tCache = this.get('tCache');\n if (!tCache) {\n this._calculateCurve();\n this._setTcache();\n tCache = this.get('tCache');\n }\n var subt;\n var index;\n var curve = this.get('curve');\n if (!tCache || tCache.length === 0) {\n if (curve) {\n return {\n x: curve[0][1],\n y: curve[0][2],\n };\n }\n return null;\n }\n Object(util_esm[\"each\"])(tCache, function (v, i) {\n if (ratio >= v[0] && ratio <= v[1]) {\n subt = (ratio - v[0]) / (v[1] - v[0]);\n index = i;\n }\n });\n var seg = curve[index];\n if (Object(util_esm[\"isNil\"])(seg) || Object(util_esm[\"isNil\"])(index)) {\n return null;\n }\n var l = seg.length;\n var nextSeg = curve[index + 1];\n return g_math_esm[\"b\" /* Cubic */].pointAt(seg[l - 2], seg[l - 1], nextSeg[1], nextSeg[2], nextSeg[3], nextSeg[4], nextSeg[5], nextSeg[6], subt);\n };\n Path.prototype._calculateCurve = function () {\n var path = this.attr().path;\n this.set('curve', util_path.pathToCurve(path));\n };\n Path.prototype._setTcache = function () {\n var totalLength = 0;\n var tempLength = 0;\n // 每段 curve 对应起止点的长度比例列表,形如: [[0, 0.25], [0.25, 0.6]. [0.6, 0.9], [0.9, 1]]\n var tCache = [];\n var segmentT;\n var segmentL;\n var segmentN;\n var l;\n var curve = this.get('curve');\n if (!curve) {\n return;\n }\n Object(util_esm[\"each\"])(curve, function (segment, i) {\n segmentN = curve[i + 1];\n l = segment.length;\n if (segmentN) {\n totalLength +=\n g_math_esm[\"b\" /* Cubic */].length(segment[l - 2], segment[l - 1], segmentN[1], segmentN[2], segmentN[3], segmentN[4], segmentN[5], segmentN[6]) || 0;\n }\n });\n this.set('totalLength', totalLength);\n if (totalLength === 0) {\n this.set('tCache', []);\n return;\n }\n Object(util_esm[\"each\"])(curve, function (segment, i) {\n segmentN = curve[i + 1];\n l = segment.length;\n if (segmentN) {\n segmentT = [];\n segmentT[0] = tempLength / totalLength;\n segmentL = g_math_esm[\"b\" /* Cubic */].length(segment[l - 2], segment[l - 1], segmentN[1], segmentN[2], segmentN[3], segmentN[4], segmentN[5], segmentN[6]);\n // 当 path 不连续时,segmentL 可能为空,为空时需要作为 0 处理\n tempLength += segmentL || 0;\n segmentT[1] = tempLength / totalLength;\n tCache.push(segmentT);\n }\n });\n this.set('tCache', tCache);\n };\n /**\n * Get start tangent vector\n * @return {Array}\n */\n Path.prototype.getStartTangent = function () {\n var segments = this.getSegments();\n var result;\n if (segments.length > 1) {\n var startPoint = segments[0].currentPoint;\n var endPoint = segments[1].currentPoint;\n var tangent = segments[1].startTangent;\n result = [];\n if (tangent) {\n result.push([startPoint[0] - tangent[0], startPoint[1] - tangent[1]]);\n result.push([startPoint[0], startPoint[1]]);\n }\n else {\n result.push([endPoint[0], endPoint[1]]);\n result.push([startPoint[0], startPoint[1]]);\n }\n }\n return result;\n };\n /**\n * Get end tangent vector\n * @return {Array}\n */\n Path.prototype.getEndTangent = function () {\n var segments = this.getSegments();\n var length = segments.length;\n var result;\n if (length > 1) {\n var startPoint = segments[length - 2].currentPoint;\n var endPoint = segments[length - 1].currentPoint;\n var tangent = segments[length - 1].endTangent;\n result = [];\n if (tangent) {\n result.push([endPoint[0] - tangent[0], endPoint[1] - tangent[1]]);\n result.push([endPoint[0], endPoint[1]]);\n }\n else {\n result.push([startPoint[0], startPoint[1]]);\n result.push([endPoint[0], endPoint[1]]);\n }\n }\n return result;\n };\n return Path;\n}(base));\n/* harmony default export */ var shape_path = (path_Path);\n//# sourceMappingURL=path.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-canvas/esm/util/in-stroke/polyline.js\n\nfunction inPolyline(points, lineWidth, x, y, isClose) {\n var count = points.length;\n if (count < 2) {\n return false;\n }\n for (var i = 0; i < count - 1; i++) {\n var x1 = points[i][0];\n var y1 = points[i][1];\n var x2 = points[i + 1][0];\n var y2 = points[i + 1][1];\n if (inLine(x1, y1, x2, y2, lineWidth, x, y)) {\n return true;\n }\n }\n // 如果封闭,则计算起始点和结束点的边\n if (isClose) {\n var first = points[0];\n var last = points[count - 1];\n if (inLine(first[0], first[1], last[0], last[1], lineWidth, x, y)) {\n return true;\n }\n }\n return false;\n}\n//# sourceMappingURL=polyline.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-canvas/esm/shape/polygon.js\n/**\n * @fileoverview 多边形\n * @author dxq613@gmail.com\n */\n\n\n\n\nvar polygon_Polygon = /** @class */ (function (_super) {\n Object(tslib_es6[\"__extends\"])(Polygon, _super);\n function Polygon() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n Polygon.prototype.isInStrokeOrPath = function (x, y, isStroke, isFill, lineWidth) {\n var points = this.attr().points;\n var isHit = false;\n if (isStroke) {\n isHit = inPolyline(points, lineWidth, x, y, true);\n }\n if (!isHit && isFill) {\n isHit = isInPolygon(points, x, y); // isPointInPath(shape, x, y);\n }\n return isHit;\n };\n Polygon.prototype.createPath = function (context) {\n var attrs = this.attr();\n var points = attrs.points;\n if (points.length < 2) {\n return;\n }\n context.beginPath();\n for (var i = 0; i < points.length; i++) {\n var point = points[i];\n if (i === 0) {\n context.moveTo(point[0], point[1]);\n }\n else {\n context.lineTo(point[0], point[1]);\n }\n }\n context.closePath();\n };\n return Polygon;\n}(base));\n/* harmony default export */ var polygon = (polygon_Polygon);\n//# sourceMappingURL=polygon.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-canvas/esm/shape/polyline.js\n\n\n\n\n\n\n\nvar polyline_PolyLine = /** @class */ (function (_super) {\n Object(tslib_es6[\"__extends\"])(PolyLine, _super);\n function PolyLine() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n PolyLine.prototype.getDefaultAttrs = function () {\n var attrs = _super.prototype.getDefaultAttrs.call(this);\n return Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, attrs), { startArrow: false, endArrow: false });\n };\n PolyLine.prototype.initAttrs = function (attrs) {\n this.setArrow();\n };\n // 更新属性时,检测是否更改了 points\n PolyLine.prototype.onAttrChange = function (name, value, originValue) {\n _super.prototype.onAttrChange.call(this, name, value, originValue);\n this.setArrow();\n if (['points'].indexOf(name) !== -1) {\n this._resetCache();\n }\n };\n PolyLine.prototype._resetCache = function () {\n this.set('totalLength', null);\n this.set('tCache', null);\n };\n PolyLine.prototype.setArrow = function () {\n var attrs = this.attr();\n var _a = this.attrs, points = _a.points, startArrow = _a.startArrow, endArrow = _a.endArrow;\n var length = points.length;\n var x1 = points[0][0];\n var y1 = points[0][1];\n var x2 = points[length - 1][0];\n var y2 = points[length - 1][1];\n if (startArrow) {\n arrow[\"b\" /* addStartArrow */](this, attrs, points[1][0], points[1][1], x1, y1);\n }\n if (endArrow) {\n arrow[\"a\" /* addEndArrow */](this, attrs, points[length - 2][0], points[length - 2][1], x2, y2);\n }\n };\n // 不允许 fill\n PolyLine.prototype.isFill = function () {\n return false;\n };\n PolyLine.prototype.isInStrokeOrPath = function (x, y, isStroke, isFill, lineWidth) {\n // 没有设置 stroke 不能被拾取, 没有线宽不能被拾取\n if (!isStroke || !lineWidth) {\n return false;\n }\n var points = this.attr().points;\n return inPolyline(points, lineWidth, x, y, false);\n };\n // 始终填充\n PolyLine.prototype.isStroke = function () {\n return true;\n };\n PolyLine.prototype.createPath = function (context) {\n var _a = this.attr(), points = _a.points, startArrow = _a.startArrow, endArrow = _a.endArrow;\n var length = points.length;\n if (points.length < 2) {\n return;\n }\n var x1 = points[0][0];\n var y1 = points[0][1];\n var x2 = points[length - 1][0];\n var y2 = points[length - 1][1];\n // 如果定义了箭头,并且是自定义箭头,线条相应缩进\n if (startArrow && startArrow.d) {\n var distance = arrow[\"c\" /* getShortenOffset */](x1, y1, points[1][0], points[1][1], startArrow.d);\n x1 += distance.dx;\n y1 += distance.dy;\n }\n if (endArrow && endArrow.d) {\n var distance = arrow[\"c\" /* getShortenOffset */](points[length - 2][0], points[length - 2][1], x2, y2, endArrow.d);\n x2 -= distance.dx;\n y2 -= distance.dy;\n }\n context.beginPath();\n context.moveTo(x1, y1);\n for (var i = 0; i < length - 1; i++) {\n var point = points[i];\n context.lineTo(point[0], point[1]);\n }\n context.lineTo(x2, y2);\n };\n PolyLine.prototype.afterDrawPath = function (context) {\n var startArrowShape = this.get('startArrowShape');\n var endArrowShape = this.get('endArrowShape');\n if (startArrowShape) {\n startArrowShape.draw(context);\n }\n if (endArrowShape) {\n endArrowShape.draw(context);\n }\n };\n /**\n * Get length of polyline\n * @return {number} length\n */\n PolyLine.prototype.getTotalLength = function () {\n var points = this.attr().points;\n // get totalLength from cache\n var totalLength = this.get('totalLength');\n if (!Object(util_esm[\"isNil\"])(totalLength)) {\n return totalLength;\n }\n this.set('totalLength', g_math_esm[\"d\" /* Polyline */].length(points));\n return this.get('totalLength');\n };\n /**\n * Get point according to ratio\n * @param {number} ratio\n * @return {Point} point\n */\n PolyLine.prototype.getPoint = function (ratio) {\n var points = this.attr().points;\n // get tCache from cache\n var tCache = this.get('tCache');\n if (!tCache) {\n this._setTcache();\n tCache = this.get('tCache');\n }\n var subt;\n var index;\n Object(util_esm[\"each\"])(tCache, function (v, i) {\n if (ratio >= v[0] && ratio <= v[1]) {\n subt = (ratio - v[0]) / (v[1] - v[0]);\n index = i;\n }\n });\n return g_math_esm[\"c\" /* Line */].pointAt(points[index][0], points[index][1], points[index + 1][0], points[index + 1][1], subt);\n };\n PolyLine.prototype._setTcache = function () {\n var points = this.attr().points;\n if (!points || points.length === 0) {\n return;\n }\n var totalLength = this.getTotalLength();\n if (totalLength <= 0) {\n return;\n }\n var tempLength = 0;\n var tCache = [];\n var segmentT;\n var segmentL;\n Object(util_esm[\"each\"])(points, function (p, i) {\n if (points[i + 1]) {\n segmentT = [];\n segmentT[0] = tempLength / totalLength;\n segmentL = g_math_esm[\"c\" /* Line */].length(p[0], p[1], points[i + 1][0], points[i + 1][1]);\n tempLength += segmentL;\n segmentT[1] = tempLength / totalLength;\n tCache.push(segmentT);\n }\n });\n this.set('tCache', tCache);\n };\n /**\n * Get start tangent vector\n * @return {Array}\n */\n PolyLine.prototype.getStartTangent = function () {\n var points = this.attr().points;\n var result = [];\n result.push([points[1][0], points[1][1]]);\n result.push([points[0][0], points[0][1]]);\n return result;\n };\n /**\n * Get end tangent vector\n * @return {Array}\n */\n PolyLine.prototype.getEndTangent = function () {\n var points = this.attr().points;\n var l = points.length - 1;\n var result = [];\n result.push([points[l - 1][0], points[l - 1][1]]);\n result.push([points[l][0], points[l][1]]);\n return result;\n };\n return PolyLine;\n}(base));\n/* harmony default export */ var polyline = (polyline_PolyLine);\n//# sourceMappingURL=polyline.js.map\n// EXTERNAL MODULE: ./node_modules/@antv/g-canvas/esm/util/parse.js\nvar parse = __webpack_require__(142);\n\n// CONCATENATED MODULE: ./node_modules/@antv/g-canvas/esm/util/in-stroke/rect.js\n\nfunction inRect(minX, minY, width, height, lineWidth, x, y) {\n var halfWidth = lineWidth / 2;\n // 将四个边看做矩形来检测,比边的检测算法要快\n return (Object(util[\"e\" /* inBox */])(minX - halfWidth, minY - halfWidth, width, lineWidth, x, y) || // 上边\n Object(util[\"e\" /* inBox */])(minX + width - halfWidth, minY - halfWidth, lineWidth, height, x, y) || // 右边\n Object(util[\"e\" /* inBox */])(minX + halfWidth, minY + height - halfWidth, width, lineWidth, x, y) || // 下边\n Object(util[\"e\" /* inBox */])(minX - halfWidth, minY + halfWidth, lineWidth, height, x, y)); // 左边\n}\n//# sourceMappingURL=rect.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-canvas/esm/util/in-stroke/rect-radius.js\n\n\nfunction rectWithRadius(minX, minY, width, height, radius, lineWidth, x, y) {\n var halfWidth = lineWidth / 2;\n return (inLine(minX + radius, minY, minX + width - radius, minY, lineWidth, x, y) ||\n inLine(minX + width, minY + radius, minX + width, minY + height - radius, lineWidth, x, y) ||\n inLine(minX + width - radius, minY + height, minX + radius, minY + height, lineWidth, x, y) ||\n inLine(minX, minY + height - radius, minX, minY + radius, lineWidth, x, y) ||\n arc(minX + width - radius, minY + radius, radius, 1.5 * Math.PI, 2 * Math.PI, lineWidth, x, y) ||\n arc(minX + width - radius, minY + height - radius, radius, 0, 0.5 * Math.PI, lineWidth, x, y) ||\n arc(minX + radius, minY + height - radius, radius, 0.5 * Math.PI, Math.PI, lineWidth, x, y) ||\n arc(minX + radius, minY + radius, radius, Math.PI, 1.5 * Math.PI, lineWidth, x, y));\n}\n//# sourceMappingURL=rect-radius.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-canvas/esm/shape/rect.js\n/**\n * @fileoverview 矩形\n * @author dxq613@gmail.com\n */\n\n\n\n\n\n\n\nvar rect_Rect = /** @class */ (function (_super) {\n Object(tslib_es6[\"__extends\"])(Rect, _super);\n function Rect() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n Rect.prototype.getDefaultAttrs = function () {\n var attrs = _super.prototype.getDefaultAttrs.call(this);\n return Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, attrs), { x: 0, y: 0, width: 0, height: 0, radius: 0 });\n };\n Rect.prototype.isInStrokeOrPath = function (x, y, isStroke, isFill, lineWidth) {\n var attrs = this.attr();\n var minX = attrs.x;\n var minY = attrs.y;\n var width = attrs.width;\n var height = attrs.height;\n var radius = attrs.radius;\n // 无圆角时的策略\n if (!radius) {\n var halfWidth = lineWidth / 2;\n // 同时填充和带有边框\n if (isFill && isStroke) {\n return Object(util[\"e\" /* inBox */])(minX - halfWidth, minY - halfWidth, width + halfWidth, height + halfWidth, x, y);\n }\n // 仅填充\n if (isFill) {\n return Object(util[\"e\" /* inBox */])(minX, minY, width, height, x, y);\n }\n if (isStroke) {\n return inRect(minX, minY, width, height, lineWidth, x, y);\n }\n }\n else {\n var isHit = false;\n if (isStroke) {\n isHit = rectWithRadius(minX, minY, width, height, radius, lineWidth, x, y);\n }\n // 仅填充时带有圆角的矩形直接通过图形拾取\n // 以后可以改成纯数学的近似拾取,将圆弧切割成多边形\n if (!isHit && isFill) {\n isHit = isPointInPath(this, x, y);\n }\n return isHit;\n }\n };\n Rect.prototype.createPath = function (context) {\n var attrs = this.attr();\n var x = attrs.x;\n var y = attrs.y;\n var width = attrs.width;\n var height = attrs.height;\n var radius = attrs.radius;\n context.beginPath();\n if (radius === 0) {\n // 改成原生的rect方法\n context.rect(x, y, width, height);\n }\n else {\n var _a = Object(parse[\"a\" /* parseRadius */])(radius), r1 = _a[0], r2 = _a[1], r3 = _a[2], r4 = _a[3];\n context.moveTo(x + r1, y);\n context.lineTo(x + width - r2, y);\n r2 !== 0 && context.arc(x + width - r2, y + r2, r2, -Math.PI / 2, 0);\n context.lineTo(x + width, y + height - r3);\n r3 !== 0 && context.arc(x + width - r3, y + height - r3, r3, 0, Math.PI / 2);\n context.lineTo(x + r4, y + height);\n r4 !== 0 && context.arc(x + r4, y + height - r4, r4, Math.PI / 2, Math.PI);\n context.lineTo(x, y + r1);\n r1 !== 0 && context.arc(x + r1, y + r1, r1, Math.PI, Math.PI * 1.5);\n context.closePath();\n }\n };\n return Rect;\n}(base));\n/* harmony default export */ var rect = (rect_Rect);\n//# sourceMappingURL=rect.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-canvas/esm/shape/text.js\n/**\n * @fileoverview 文本\n * @author dxq613@gmail.com\n */\n\n\n\n\nvar text_Text = /** @class */ (function (_super) {\n Object(tslib_es6[\"__extends\"])(Text, _super);\n function Text() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n // 默认文本属性\n Text.prototype.getDefaultAttrs = function () {\n var attrs = _super.prototype.getDefaultAttrs.call(this);\n return Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, attrs), { x: 0, y: 0, text: null, fontSize: 12, fontFamily: 'sans-serif', fontStyle: 'normal', fontWeight: 'normal', fontVariant: 'normal', textAlign: 'start', textBaseline: 'bottom' });\n };\n // 仅仅使用包围盒检测来进行拾取\n Text.prototype.isOnlyHitBox = function () {\n return true;\n };\n // 初始化时组合 font,同时判断 text 是否换行\n Text.prototype.initAttrs = function (attrs) {\n this._assembleFont();\n if (attrs.text) {\n this._setText(attrs.text);\n }\n };\n // 组装字体\n Text.prototype._assembleFont = function () {\n var attrs = this.attrs;\n attrs.font = Object(esm[\"assembleFont\"])(attrs);\n };\n // 如果文本换行,则缓存数组\n Text.prototype._setText = function (text) {\n var textArr = null;\n if (Object(util[\"k\" /* isString */])(text) && text.indexOf('\\n') !== -1) {\n textArr = text.split('\\n');\n }\n this.set('textArr', textArr);\n };\n // 更新属性时,检测是否更改了 font、text\n Text.prototype.onAttrChange = function (name, value, originValue) {\n _super.prototype.onAttrChange.call(this, name, value, originValue);\n if (name.startsWith('font')) {\n this._assembleFont();\n }\n if (name === 'text') {\n this._setText(value);\n }\n };\n // 这个方法在 text 时没有可以做的事情,如果要支持文字背景时可以考虑\n // createPath(context) {\n // }\n // 如果文本多行,需要获取文本间距\n Text.prototype._getSpaceingY = function () {\n var attrs = this.attrs;\n var lineHeight = attrs.lineHeight;\n var fontSize = attrs.fontSize * 1;\n return lineHeight ? lineHeight - fontSize : fontSize * 0.14;\n };\n // 绘制文本,考虑多行的场景\n Text.prototype._drawTextArr = function (context, textArr, isFill) {\n var attrs = this.attrs;\n var textBaseline = attrs.textBaseline;\n var x = attrs.x;\n var y = attrs.y;\n var fontSize = attrs.fontSize * 1;\n var spaceingY = this._getSpaceingY();\n var height = Object(esm[\"getTextHeight\"])(attrs.text, attrs.fontSize, attrs.lineHeight);\n var subY;\n Object(util[\"c\" /* each */])(textArr, function (subText, index) {\n subY = y + index * (spaceingY + fontSize) - height + fontSize; // bottom;\n if (textBaseline === 'middle')\n subY += height - fontSize - (height - fontSize) / 2;\n if (textBaseline === 'top')\n subY += height - fontSize;\n if (!Object(util[\"i\" /* isNil */])(subText)) {\n if (isFill) {\n context.fillText(subText, x, subY);\n }\n else {\n context.strokeText(subText, x, subY);\n }\n }\n });\n };\n // 绘制文本,同时考虑填充和绘制边框\n Text.prototype._drawText = function (context, isFill) {\n var attrs = this.attr();\n var x = attrs.x;\n var y = attrs.y;\n var textArr = this.get('textArr');\n if (textArr) {\n this._drawTextArr(context, textArr, isFill);\n }\n else {\n var text = attrs.text;\n if (!Object(util[\"i\" /* isNil */])(text)) {\n if (isFill) {\n context.fillText(text, x, y);\n }\n else {\n context.strokeText(text, x, y);\n }\n }\n }\n };\n // 复写绘制和填充的逻辑:对于文本,应该先绘制边框,再进行填充\n Text.prototype.strokeAndFill = function (context) {\n var _a = this.attrs, lineWidth = _a.lineWidth, opacity = _a.opacity, strokeOpacity = _a.strokeOpacity, fillOpacity = _a.fillOpacity;\n if (this.isStroke()) {\n if (lineWidth > 0) {\n if (!Object(util[\"i\" /* isNil */])(strokeOpacity) && strokeOpacity !== 1) {\n context.globalAlpha = opacity;\n }\n this.stroke(context);\n }\n }\n if (this.isFill()) {\n if (!Object(util[\"i\" /* isNil */])(fillOpacity) && fillOpacity !== 1) {\n context.globalAlpha = fillOpacity;\n this.fill(context);\n context.globalAlpha = opacity;\n }\n else {\n this.fill(context);\n }\n }\n this.afterDrawPath(context);\n };\n // 复写填充逻辑\n Text.prototype.fill = function (context) {\n this._drawText(context, true);\n };\n // 复写绘制边框的逻辑\n Text.prototype.stroke = function (context) {\n this._drawText(context, false);\n };\n return Text;\n}(base));\n/* harmony default export */ var shape_text = (text_Text);\n//# sourceMappingURL=text.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-canvas/esm/shape/index.js\n\n\n\n\n\n\n\n\n\n\n\n//# sourceMappingURL=index.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy1jYW52YXMvZXNtL3NoYXBlL2Jhc2UuanM/MjRiMyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy1jYW52YXMvZXNtL3NoYXBlL2NpcmNsZS5qcz9iMTg2Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9nLWNhbnZhcy9lc20vc2hhcGUvZWxsaXBzZS5qcz81OGFmIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9nLWNhbnZhcy9lc20vc2hhcGUvaW1hZ2UuanM/ZjNmOSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy1jYW52YXMvZXNtL3V0aWwvaW4tc3Ryb2tlL2xpbmUuanM/M2ZhMSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy1jYW52YXMvZXNtL3NoYXBlL2xpbmUuanM/ZDdjMCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy1jYW52YXMvZXNtL3NoYXBlL21hcmtlci5qcz9iYTY1Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9nLWNhbnZhcy9lc20vdXRpbC9pbi1wYXRoL3BvaW50LWluLXBhdGguanM/ODljNyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy1jYW52YXMvZXNtL3V0aWwvaW4tcGF0aC9wb2x5Z29uLmpzPzI4YzkiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2ctY2FudmFzL2VzbS91dGlsL2luLXN0cm9rZS9hcmMuanM/OTVkZiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy1jYW52YXMvZXNtL3V0aWwvcGF0aC5qcz83YzhlIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9nLWNhbnZhcy9lc20vc2hhcGUvcGF0aC5qcz80MDk0Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9nLWNhbnZhcy9lc20vdXRpbC9pbi1zdHJva2UvcG9seWxpbmUuanM/OWZmMSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy1jYW52YXMvZXNtL3NoYXBlL3BvbHlnb24uanM/OTc4YSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy1jYW52YXMvZXNtL3NoYXBlL3BvbHlsaW5lLmpzPzAxNDYiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2ctY2FudmFzL2VzbS91dGlsL2luLXN0cm9rZS9yZWN0LmpzP2Q2OWUiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2ctY2FudmFzL2VzbS91dGlsL2luLXN0cm9rZS9yZWN0LXJhZGl1cy5qcz80YjAxIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9nLWNhbnZhcy9lc20vc2hhcGUvcmVjdC5qcz8yNzBmIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9nLWNhbnZhcy9lc20vc2hhcGUvdGV4dC5qcz80MjJmIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9nLWNhbnZhcy9lc20vc2hhcGUvaW5kZXguanM/NDc5OSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUE0QztBQUNDO0FBQ087QUFDZTtBQUN0QjtBQUNaO0FBQ0o7QUFDN0IsSUFBSSxjQUFTO0FBQ2IsSUFBSSw4QkFBUztBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsNkJBQVEsQ0FBQyw2QkFBUSxHQUFHLFdBQVcscUVBQXFFO0FBQ25IO0FBQ0E7QUFDQSxlQUFlLHFCQUFLO0FBQ3BCO0FBQ0E7QUFDQSxlQUFlLHdCQUFLO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBLGVBQWUsV0FBVztBQUMxQjtBQUNBO0FBQ0EsUUFBUSxzQ0FBYztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsQ0FBQyxJQUFTO0FBQ0ksd0RBQUksRUFBQztBQUNwQixnQzs7QUMvSXlDO0FBQ0k7QUFDRTtBQUNKO0FBQ0Y7QUFDSTtBQUNKO0FBQ007QUFDRTtBQUNSO0FBQ0E7QUFDekMiLCJmaWxlIjoiNTcuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBfX2Fzc2lnbiwgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBBYnN0cmFjdFNoYXBlIH0gZnJvbSAnQGFudHYvZy1iYXNlJztcbmltcG9ydCB7IGlzTmlsLCBpbnRlcnNlY3RSZWN0IH0gZnJvbSAnLi4vdXRpbC91dGlsJztcbmltcG9ydCB7IGFwcGx5QXR0cnNUb0NvbnRleHQsIHJlZnJlc2hFbGVtZW50IH0gZnJvbSAnLi4vdXRpbC9kcmF3JztcbmltcG9ydCB7IGdldEJCb3hNZXRob2QgfSBmcm9tICdAYW50di9nLWJhc2UnO1xuaW1wb3J0ICogYXMgU2hhcGUgZnJvbSAnLi9pbmRleCc7XG5pbXBvcnQgR3JvdXAgZnJvbSAnLi4vZ3JvdXAnO1xudmFyIFNoYXBlQmFzZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoU2hhcGVCYXNlLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFNoYXBlQmFzZSgpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgIH1cbiAgICBTaGFwZUJhc2UucHJvdG90eXBlLmdldERlZmF1bHRBdHRycyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGF0dHJzID0gX3N1cGVyLnByb3RvdHlwZS5nZXREZWZhdWx0QXR0cnMuY2FsbCh0aGlzKTtcbiAgICAgICAgLy8g6K6+572u6buY6K6k5YC8XG4gICAgICAgIHJldHVybiBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgYXR0cnMpLCB7IGxpbmVXaWR0aDogMSwgbGluZUFwcGVuZFdpZHRoOiAwLCBzdHJva2VPcGFjaXR5OiAxLCBmaWxsT3BhY2l0eTogMSB9KTtcbiAgICB9O1xuICAgIFNoYXBlQmFzZS5wcm90b3R5cGUuZ2V0U2hhcGVCYXNlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gU2hhcGU7XG4gICAgfTtcbiAgICBTaGFwZUJhc2UucHJvdG90eXBlLmdldEdyb3VwQmFzZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIEdyb3VwO1xuICAgIH07XG4gICAgLyoqXG4gICAgICog5LiA5Lqb5pa55rOV6LCD55So5Lya5byV6LW355S75biD5Y+Y5YyWXG4gICAgICogQHBhcmFtIHtDaGFuZ2VUeXBlfSBjaGFuZ2VUeXBlIOaUueWPmOeahOexu+Wei1xuICAgICAqL1xuICAgIFNoYXBlQmFzZS5wcm90b3R5cGUub25DYW52YXNDaGFuZ2UgPSBmdW5jdGlvbiAoY2hhbmdlVHlwZSkge1xuICAgICAgICByZWZyZXNoRWxlbWVudCh0aGlzLCBjaGFuZ2VUeXBlKTtcbiAgICB9O1xuICAgIFNoYXBlQmFzZS5wcm90b3R5cGUuY2FsY3VsYXRlQkJveCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHR5cGUgPSB0aGlzLmdldCgndHlwZScpO1xuICAgICAgICB2YXIgbGluZVdpZHRoID0gdGhpcy5nZXRIaXRMaW5lV2lkdGgoKTtcbiAgICAgICAgLy8gY29uc3QgYXR0cnMgPSB0aGlzLmF0dHIoKTtcbiAgICAgICAgdmFyIGJib3hNZXRob2QgPSBnZXRCQm94TWV0aG9kKHR5cGUpO1xuICAgICAgICB2YXIgYm94ID0gYmJveE1ldGhvZCh0aGlzKTtcbiAgICAgICAgdmFyIGhhbGZMaW5lV2lkdGggPSBsaW5lV2lkdGggLyAyO1xuICAgICAgICB2YXIgbWluWCA9IGJveC54IC0gaGFsZkxpbmVXaWR0aDtcbiAgICAgICAgdmFyIG1pblkgPSBib3gueSAtIGhhbGZMaW5lV2lkdGg7XG4gICAgICAgIHZhciBtYXhYID0gYm94LnggKyBib3gud2lkdGggKyBoYWxmTGluZVdpZHRoO1xuICAgICAgICB2YXIgbWF4WSA9IGJveC55ICsgYm94LmhlaWdodCArIGhhbGZMaW5lV2lkdGg7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB4OiBtaW5YLFxuICAgICAgICAgICAgbWluWDogbWluWCxcbiAgICAgICAgICAgIHk6IG1pblksXG4gICAgICAgICAgICBtaW5ZOiBtaW5ZLFxuICAgICAgICAgICAgd2lkdGg6IGJveC53aWR0aCArIGxpbmVXaWR0aCxcbiAgICAgICAgICAgIGhlaWdodDogYm94LmhlaWdodCArIGxpbmVXaWR0aCxcbiAgICAgICAgICAgIG1heFg6IG1heFgsXG4gICAgICAgICAgICBtYXhZOiBtYXhZLFxuICAgICAgICB9O1xuICAgIH07XG4gICAgU2hhcGVCYXNlLnByb3RvdHlwZS5pc0ZpbGwgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuYXR0cnNbJ2ZpbGwnXSB8fCB0aGlzLmlzQ2xpcFNoYXBlKCk7XG4gICAgfTtcbiAgICBTaGFwZUJhc2UucHJvdG90eXBlLmlzU3Ryb2tlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLmF0dHJzWydzdHJva2UnXTtcbiAgICB9O1xuICAgIC8vIOWQjCBzaGFwZSDkuK3nmoTmlrnms5Xph43lpI3kuoZcbiAgICBTaGFwZUJhc2UucHJvdG90eXBlLl9hcHBseUNsaXAgPSBmdW5jdGlvbiAoY29udGV4dCwgY2xpcCkge1xuICAgICAgICBpZiAoY2xpcCkge1xuICAgICAgICAgICAgY29udGV4dC5zYXZlKCk7XG4gICAgICAgICAgICAvLyDlsIYgY2xpcCDnmoTlsZ7mgKfmjILovb3liLAgY29udGV4dCDkuIpcbiAgICAgICAgICAgIGFwcGx5QXR0cnNUb0NvbnRleHQoY29udGV4dCwgY2xpcCk7XG4gICAgICAgICAgICAvLyDnu5jliLYgY2xpcCDot6/lvoRcbiAgICAgICAgICAgIGNsaXAuY3JlYXRlUGF0aChjb250ZXh0KTtcbiAgICAgICAgICAgIGNvbnRleHQucmVzdG9yZSgpO1xuICAgICAgICAgICAgLy8g6KOB5YmqXG4gICAgICAgICAgICBjb250ZXh0LmNsaXAoKTtcbiAgICAgICAgICAgIGNsaXAuX2FmdGVyRHJhdygpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvLyDnu5jliLblm77lvaLml7bpnIDopoHogIPomZEgcmVnaW9uIOmZkOWItlxuICAgIFNoYXBlQmFzZS5wcm90b3R5cGUuZHJhdyA9IGZ1bmN0aW9uIChjb250ZXh0LCByZWdpb24pIHtcbiAgICAgICAgdmFyIGNsaXAgPSB0aGlzLmNmZy5jbGlwU2hhcGU7XG4gICAgICAgIC8vIOWmguaenOaMh+WumuS6hiByZWdpb27vvIzlkIzml7bkuI3lhYHorrjliLfmlrDml7bvvIznm7TmjqXov5Tlm55cbiAgICAgICAgaWYgKHJlZ2lvbikge1xuICAgICAgICAgICAgaWYgKHRoaXMuY2ZnLnJlZnJlc2ggPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgLy8gdGhpcy5fYWZ0ZXJEcmF3KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXQoJ2hhc0NoYW5nZWQnLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8g5piv5ZCm55u45Lqk6ZyA6KaB6ICD6JmRIGNsaXAg55qE5YyF5Zu055uSXG4gICAgICAgICAgICB2YXIgYmJveCA9IHRoaXMuZ2V0Q2FudmFzQkJveCgpO1xuICAgICAgICAgICAgaWYgKCFpbnRlcnNlY3RSZWN0KHJlZ2lvbiwgYmJveCkpIHtcbiAgICAgICAgICAgICAgICAvLyDlm77lvaLnmoTljIXlm7Tnm5LkuI7ph43nu5jljLrln5/kuI3nm7jkuqTml7bvvIzkuZ/pnIDopoHmuIXpmaTmoIforrBcbiAgICAgICAgICAgICAgICB0aGlzLnNldCgnaGFzQ2hhbmdlZCcsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAvLyDlrZjlnKjlpJrnp43mg4XlvaLpnIDopoHmm7TmlrAgY2FjaGVDYW52YXNCQm94IOWSjCBpc0ludmlldyDnmoTliKTlrppcbiAgICAgICAgICAgICAgICAvLyAxLiDkuYvliY3lm77lvaLlnKjop4bnqpflhoXvvIzkvYbmmK/njrDlnKjkuI3lho3op4bnqpflhoVcbiAgICAgICAgICAgICAgICAvLyAyLiDlpoLmnpzlvZPliY3nmoTlm77lvaLku6Xlj4rniLblhYPntKDpg73msqHmnInlj5HnlJ/ov4flj5jljJbvvIxyZWZyZXNoID0gZmFsc2Ug5LiN5Lya6LWw5Yiw6L+Z6YeM77yM5omA5Lul6L+Z6YeM55qE5Zu+5b2i6YO95piv54i25YWD57Sg5Y+R55Sf5Y+Y5YyW77yM5L2G5piv5rKh5pyJ5Zyo6KeG5Zu+5YaF55qE5YWD57SgXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY2ZnLmlzSW5WaWV3KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2FmdGVyRHJhdygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29udGV4dC5zYXZlKCk7XG4gICAgICAgIC8vIOWFiOWwhiBhdHRycyDlupTnlKjliLDkuIrkuIvmlofkuK3vvIzlho3orr7nva4gY2xpcOOAguWboOS4uiBjbGlwIOW6lOivpeiiq+W9k+WJjeWFg+e0oOeahCBtYXRyaXgg5omA5b2x5ZONXG4gICAgICAgIGFwcGx5QXR0cnNUb0NvbnRleHQoY29udGV4dCwgdGhpcyk7XG4gICAgICAgIHRoaXMuX2FwcGx5Q2xpcChjb250ZXh0LCBjbGlwKTtcbiAgICAgICAgdGhpcy5kcmF3UGF0aChjb250ZXh0KTtcbiAgICAgICAgY29udGV4dC5yZXN0b3JlKCk7XG4gICAgICAgIHRoaXMuX2FmdGVyRHJhdygpO1xuICAgIH07XG4gICAgU2hhcGVCYXNlLnByb3RvdHlwZS5nZXRDYW52YXNWaWV3Qm94ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgY2FudmFzID0gdGhpcy5jZmcuY2FudmFzO1xuICAgICAgICBpZiAoY2FudmFzKSB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICByZXR1cm4gY2FudmFzLmdldFZpZXdSYW5nZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gICAgU2hhcGVCYXNlLnByb3RvdHlwZS5jYWNoZUNhbnZhc0JCb3ggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBjYW52YXNCQm94ID0gdGhpcy5nZXRDYW52YXNWaWV3Qm94KCk7XG4gICAgICAgIC8vIOe7mOWItueahOaXtuWAmee8k+WtmOWMheWbtOebklxuICAgICAgICBpZiAoY2FudmFzQkJveCkge1xuICAgICAgICAgICAgdmFyIGJib3ggPSB0aGlzLmdldENhbnZhc0JCb3goKTtcbiAgICAgICAgICAgIHZhciBpc0luVmlldyA9IGludGVyc2VjdFJlY3QoYmJveCwgY2FudmFzQkJveCk7XG4gICAgICAgICAgICB0aGlzLnNldCgnaXNJblZpZXcnLCBpc0luVmlldyk7XG4gICAgICAgICAgICAvLyDkuI3lho3op4bnqpflhoUgY2FjaGVDYW52YXNCQm94IOiuvue9ruaIkCBudWxs77yM5Lya5o+Q5Y2H5bGA6YOo5riy5p+T55qE5oCn6IO977yMXG4gICAgICAgICAgICAvLyDlm6DkuLrlnKjlsYDpg6jmuLLmn5PlvbHlk43nmoTljIXlm7Tnm5LorqHnrpfml7bkuI3ogIPomZHov5nkuKrlm77lvaLnmoTljIXlm7Tnm5JcbiAgICAgICAgICAgIC8vIOeItuWFg+e0oCBjYWNoZUNhbnZhc0JCb3gg6K6h566X55qE5pe25YCZ5Lmf5LiN6K6h566XXG4gICAgICAgICAgICBpZiAoaXNJblZpZXcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldCgnY2FjaGVDYW52YXNCQm94JywgYmJveCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldCgnY2FjaGVDYW52YXNCQm94JywgbnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFNoYXBlQmFzZS5wcm90b3R5cGUuX2FmdGVyRHJhdyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5jYWNoZUNhbnZhc0JCb3goKTtcbiAgICAgICAgLy8g57uY5Yi25ZCO5raI6Zmk5qCH6K6wXG4gICAgICAgIHRoaXMuc2V0KCdoYXNDaGFuZ2VkJywgZmFsc2UpO1xuICAgICAgICB0aGlzLnNldCgncmVmcmVzaCcsIG51bGwpO1xuICAgIH07XG4gICAgU2hhcGVCYXNlLnByb3RvdHlwZS5za2lwRHJhdyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5zZXQoJ2NhY2hlQ2FudmFzQkJveCcsIG51bGwpO1xuICAgICAgICB0aGlzLnNldCgnaXNJblZpZXcnLCBudWxsKTtcbiAgICAgICAgdGhpcy5zZXQoJ2hhc0NoYW5nZWQnLCBmYWxzZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiDnu5jliLblm77lvaLnmoTot6/lvoRcbiAgICAgKiBAcGFyYW0ge0NhbnZhc1JlbmRlcmluZ0NvbnRleHQyRH0gY29udGV4dCDkuIrkuIvmlodcbiAgICAgKi9cbiAgICBTaGFwZUJhc2UucHJvdG90eXBlLmRyYXdQYXRoID0gZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgICAgdGhpcy5jcmVhdGVQYXRoKGNvbnRleHQpO1xuICAgICAgICB0aGlzLnN0cm9rZUFuZEZpbGwoY29udGV4dCk7XG4gICAgICAgIHRoaXMuYWZ0ZXJEcmF3UGF0aChjb250ZXh0KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKiDloavlhYXlm77lvaJcbiAgICAgKiBAcGFyYW0ge0NhbnZhc1JlbmRlcmluZ0NvbnRleHQyRH0gY29udGV4dCBjb250ZXh0IOS4iuS4i+aWh1xuICAgICAqL1xuICAgIFNoYXBlQmFzZS5wcm90b3R5cGUuZmlsbCA9IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICAgIGNvbnRleHQuZmlsbCgpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqIOe7mOWItuWbvuW9oui+ueahhlxuICAgICAqIEBwYXJhbSB7Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJEfSBjb250ZXh0IGNvbnRleHQg5LiK5LiL5paHXG4gICAgICovXG4gICAgU2hhcGVCYXNlLnByb3RvdHlwZS5zdHJva2UgPSBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgICBjb250ZXh0LnN0cm9rZSgpO1xuICAgIH07XG4gICAgLy8g57uY5Yi25oiW6ICF5aGr5YWFXG4gICAgU2hhcGVCYXNlLnByb3RvdHlwZS5zdHJva2VBbmRGaWxsID0gZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgICAgdmFyIF9hID0gdGhpcy5hdHRycywgbGluZVdpZHRoID0gX2EubGluZVdpZHRoLCBvcGFjaXR5ID0gX2Eub3BhY2l0eSwgc3Ryb2tlT3BhY2l0eSA9IF9hLnN0cm9rZU9wYWNpdHksIGZpbGxPcGFjaXR5ID0gX2EuZmlsbE9wYWNpdHk7XG4gICAgICAgIGlmICh0aGlzLmlzRmlsbCgpKSB7XG4gICAgICAgICAgICBpZiAoIWlzTmlsKGZpbGxPcGFjaXR5KSAmJiBmaWxsT3BhY2l0eSAhPT0gMSkge1xuICAgICAgICAgICAgICAgIGNvbnRleHQuZ2xvYmFsQWxwaGEgPSBmaWxsT3BhY2l0eTtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbGwoY29udGV4dCk7XG4gICAgICAgICAgICAgICAgY29udGV4dC5nbG9iYWxBbHBoYSA9IG9wYWNpdHk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbGwoY29udGV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaXNTdHJva2UoKSkge1xuICAgICAgICAgICAgaWYgKGxpbmVXaWR0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBpZiAoIWlzTmlsKHN0cm9rZU9wYWNpdHkpICYmIHN0cm9rZU9wYWNpdHkgIT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5nbG9iYWxBbHBoYSA9IHN0cm9rZU9wYWNpdHk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuc3Ryb2tlKGNvbnRleHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWZ0ZXJEcmF3UGF0aChjb250ZXh0KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKiDnu5jliLblm77lvaLnmoTot6/lvoRcbiAgICAgKiBAcGFyYW0ge0NhbnZhc1JlbmRlcmluZ0NvbnRleHQyRH0gY29udGV4dCDkuIrkuIvmlodcbiAgICAgKi9cbiAgICBTaGFwZUJhc2UucHJvdG90eXBlLmNyZWF0ZVBhdGggPSBmdW5jdGlvbiAoY29udGV4dCkgeyB9O1xuICAgIC8qKlxuICAgICAqIOe7mOWItuWujOaIkCBwYXRoIOWQjueahOaTjeS9nFxuICAgICAqIEBwYXJhbSB7Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJEfSBjb250ZXh0IOS4iuS4i+aWh1xuICAgICAqL1xuICAgIFNoYXBlQmFzZS5wcm90b3R5cGUuYWZ0ZXJEcmF3UGF0aCA9IGZ1bmN0aW9uIChjb250ZXh0KSB7IH07XG4gICAgU2hhcGVCYXNlLnByb3RvdHlwZS5pc0luU2hhcGUgPSBmdW5jdGlvbiAocmVmWCwgcmVmWSkge1xuICAgICAgICAvLyByZXR1cm4gSGl0VXRpbC5pc0hpdFNoYXBlKHRoaXMsIHJlZlgsIHJlZlkpO1xuICAgICAgICB2YXIgaXNTdHJva2UgPSB0aGlzLmlzU3Ryb2tlKCk7XG4gICAgICAgIHZhciBpc0ZpbGwgPSB0aGlzLmlzRmlsbCgpO1xuICAgICAgICB2YXIgbGluZVdpZHRoID0gdGhpcy5nZXRIaXRMaW5lV2lkdGgoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNJblN0cm9rZU9yUGF0aChyZWZYLCByZWZZLCBpc1N0cm9rZSwgaXNGaWxsLCBsaW5lV2lkdGgpO1xuICAgIH07XG4gICAgLy8g5LmL5omA5Lul5LiN5ouG5oiQIGlzSW5TdHJva2Ug5ZKMIGlzSW5QYXRoIOWcqOS6juS4pOiAheWtmOWcqOS4gOS6m+WFseWQjOeahOiuoeeul1xuICAgIFNoYXBlQmFzZS5wcm90b3R5cGUuaXNJblN0cm9rZU9yUGF0aCA9IGZ1bmN0aW9uICh4LCB5LCBpc1N0cm9rZSwgaXNGaWxsLCBsaW5lV2lkdGgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG4gICAgLyoqXG4gICAgICog6I635Y+W57q/5ou+5Y+W55qE5a695bqmXG4gICAgICogQHJldHVybnMge251bWJlcn0g57q/55qE5ou+5Y+W5a695bqmXG4gICAgICovXG4gICAgU2hhcGVCYXNlLnByb3RvdHlwZS5nZXRIaXRMaW5lV2lkdGggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghdGhpcy5pc1N0cm9rZSgpKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgYXR0cnMgPSB0aGlzLmF0dHJzO1xuICAgICAgICByZXR1cm4gYXR0cnNbJ2xpbmVXaWR0aCddICsgYXR0cnNbJ2xpbmVBcHBlbmRXaWR0aCddO1xuICAgIH07XG4gICAgcmV0dXJuIFNoYXBlQmFzZTtcbn0oQWJzdHJhY3RTaGFwZSkpO1xuZXhwb3J0IGRlZmF1bHQgU2hhcGVCYXNlO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YmFzZS5qcy5tYXAiLCIvKipcbiAqIEBmaWxlb3ZlcnZpZXcg5ZyGXG4gKiBAYXV0aG9yIGR4cTYxM0BnbWFpbC5jb21cbiAqL1xuaW1wb3J0IHsgX19hc3NpZ24sIF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFNoYXBlQmFzZSBmcm9tICcuL2Jhc2UnO1xuaW1wb3J0IHsgZGlzdGFuY2UgfSBmcm9tICcuLi91dGlsL3V0aWwnO1xudmFyIENpcmNsZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoQ2lyY2xlLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIENpcmNsZSgpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgIH1cbiAgICBDaXJjbGUucHJvdG90eXBlLmdldERlZmF1bHRBdHRycyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGF0dHJzID0gX3N1cGVyLnByb3RvdHlwZS5nZXREZWZhdWx0QXR0cnMuY2FsbCh0aGlzKTtcbiAgICAgICAgcmV0dXJuIF9fYXNzaWduKF9fYXNzaWduKHt9LCBhdHRycyksIHsgeDogMCwgeTogMCwgcjogMCB9KTtcbiAgICB9O1xuICAgIENpcmNsZS5wcm90b3R5cGUuaXNJblN0cm9rZU9yUGF0aCA9IGZ1bmN0aW9uICh4LCB5LCBpc1N0cm9rZSwgaXNGaWxsLCBsaW5lV2lkdGgpIHtcbiAgICAgICAgdmFyIGF0dHJzID0gdGhpcy5hdHRyKCk7XG4gICAgICAgIHZhciBjeCA9IGF0dHJzLng7XG4gICAgICAgIHZhciBjeSA9IGF0dHJzLnk7XG4gICAgICAgIHZhciByID0gYXR0cnMucjtcbiAgICAgICAgdmFyIGhhbGZMaW5lV2lkdGggPSBsaW5lV2lkdGggLyAyO1xuICAgICAgICB2YXIgYWJzRGlzdGFuY2UgPSBkaXN0YW5jZShjeCwgY3ksIHgsIHkpO1xuICAgICAgICAvLyDnm7TmjqXnlKjot53nprvvvIzlpoLmnpzlkIzml7blrZjlnKjovrnlkozloavlhYXml7bvvIzlj6/ku6Xlh4/lsJHkuKTmrKHorqHnrpdcbiAgICAgICAgaWYgKGlzRmlsbCAmJiBpc1N0cm9rZSkge1xuICAgICAgICAgICAgcmV0dXJuIGFic0Rpc3RhbmNlIDw9IHIgKyBoYWxmTGluZVdpZHRoO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0ZpbGwpIHtcbiAgICAgICAgICAgIHJldHVybiBhYnNEaXN0YW5jZSA8PSByO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1N0cm9rZSkge1xuICAgICAgICAgICAgcmV0dXJuIGFic0Rpc3RhbmNlID49IHIgLSBoYWxmTGluZVdpZHRoICYmIGFic0Rpc3RhbmNlIDw9IHIgKyBoYWxmTGluZVdpZHRoO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICAgIENpcmNsZS5wcm90b3R5cGUuY3JlYXRlUGF0aCA9IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICAgIHZhciBhdHRycyA9IHRoaXMuYXR0cigpO1xuICAgICAgICB2YXIgY3ggPSBhdHRycy54O1xuICAgICAgICB2YXIgY3kgPSBhdHRycy55O1xuICAgICAgICB2YXIgciA9IGF0dHJzLnI7XG4gICAgICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XG4gICAgICAgIGNvbnRleHQuYXJjKGN4LCBjeSwgciwgMCwgTWF0aC5QSSAqIDIsIGZhbHNlKTtcbiAgICAgICAgY29udGV4dC5jbG9zZVBhdGgoKTtcbiAgICB9O1xuICAgIHJldHVybiBDaXJjbGU7XG59KFNoYXBlQmFzZSkpO1xuZXhwb3J0IGRlZmF1bHQgQ2lyY2xlO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y2lyY2xlLmpzLm1hcCIsIi8qKlxuICogQGZpbGVvdmVydmlldyDmpK3lnIZcbiAqIEBhdXRob3IgZHhxNjEzQGdtYWlsLmNvbVxuICovXG5pbXBvcnQgeyBfX2Fzc2lnbiwgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgU2hhcGVCYXNlIGZyb20gJy4vYmFzZSc7XG4vLyDmoLnmja7mpK3lnIblhazlvI/orqHnrpcgeCp4L3J4KnJ4ICsgeSp5L3J5KnJ5O1xuZnVuY3Rpb24gZWxsaXBzZURpc3RhbmNlKHNxdWFyZVgsIHNxdWFyZVksIHJ4LCByeSkge1xuICAgIHJldHVybiBzcXVhcmVYIC8gKHJ4ICogcngpICsgc3F1YXJlWSAvIChyeSAqIHJ5KTtcbn1cbnZhciBFbGxpcHNlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhFbGxpcHNlLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEVsbGlwc2UoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICB9XG4gICAgRWxsaXBzZS5wcm90b3R5cGUuZ2V0RGVmYXVsdEF0dHJzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYXR0cnMgPSBfc3VwZXIucHJvdG90eXBlLmdldERlZmF1bHRBdHRycy5jYWxsKHRoaXMpO1xuICAgICAgICByZXR1cm4gX19hc3NpZ24oX19hc3NpZ24oe30sIGF0dHJzKSwgeyB4OiAwLCB5OiAwLCByeDogMCwgcnk6IDAgfSk7XG4gICAgfTtcbiAgICBFbGxpcHNlLnByb3RvdHlwZS5pc0luU3Ryb2tlT3JQYXRoID0gZnVuY3Rpb24gKHgsIHksIGlzU3Ryb2tlLCBpc0ZpbGwsIGxpbmVXaWR0aCkge1xuICAgICAgICB2YXIgYXR0cnMgPSB0aGlzLmF0dHIoKTtcbiAgICAgICAgdmFyIGhhbGZMaW5lV2l0aCA9IGxpbmVXaWR0aCAvIDI7XG4gICAgICAgIHZhciBjeCA9IGF0dHJzLng7XG4gICAgICAgIHZhciBjeSA9IGF0dHJzLnk7XG4gICAgICAgIHZhciByeCA9IGF0dHJzLnJ4LCByeSA9IGF0dHJzLnJ5O1xuICAgICAgICB2YXIgc3F1YXJlWCA9ICh4IC0gY3gpICogKHggLSBjeCk7XG4gICAgICAgIHZhciBzcXVhcmVZID0gKHkgLSBjeSkgKiAoeSAtIGN5KTtcbiAgICAgICAgLy8g5L2/55So5qSt5ZyG55qE5YWs5byP77yaIHgqeC9yeCpyeCArIHkqeS9yeSpyeSA9IDE7XG4gICAgICAgIGlmIChpc0ZpbGwgJiYgaXNTdHJva2UpIHtcbiAgICAgICAgICAgIHJldHVybiBlbGxpcHNlRGlzdGFuY2Uoc3F1YXJlWCwgc3F1YXJlWSwgcnggKyBoYWxmTGluZVdpdGgsIHJ5ICsgaGFsZkxpbmVXaXRoKSA8PSAxO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0ZpbGwpIHtcbiAgICAgICAgICAgIHJldHVybiBlbGxpcHNlRGlzdGFuY2Uoc3F1YXJlWCwgc3F1YXJlWSwgcngsIHJ5KSA8PSAxO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1N0cm9rZSkge1xuICAgICAgICAgICAgcmV0dXJuIChlbGxpcHNlRGlzdGFuY2Uoc3F1YXJlWCwgc3F1YXJlWSwgcnggLSBoYWxmTGluZVdpdGgsIHJ5IC0gaGFsZkxpbmVXaXRoKSA+PSAxICYmXG4gICAgICAgICAgICAgICAgZWxsaXBzZURpc3RhbmNlKHNxdWFyZVgsIHNxdWFyZVksIHJ4ICsgaGFsZkxpbmVXaXRoLCByeSArIGhhbGZMaW5lV2l0aCkgPD0gMSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG4gICAgRWxsaXBzZS5wcm90b3R5cGUuY3JlYXRlUGF0aCA9IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICAgIHZhciBhdHRycyA9IHRoaXMuYXR0cigpO1xuICAgICAgICB2YXIgY3ggPSBhdHRycy54O1xuICAgICAgICB2YXIgY3kgPSBhdHRycy55O1xuICAgICAgICB2YXIgcnggPSBhdHRycy5yeDtcbiAgICAgICAgdmFyIHJ5ID0gYXR0cnMucnk7XG4gICAgICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XG4gICAgICAgIC8vIOWFvOWuuemAu+i+kVxuICAgICAgICBpZiAoY29udGV4dC5lbGxpcHNlKSB7XG4gICAgICAgICAgICBjb250ZXh0LmVsbGlwc2UoY3gsIGN5LCByeCwgcnksIDAsIDAsIE1hdGguUEkgKiAyLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyDlpoLmnpzkuI3mlK/mjIHvvIzliJnkvb/nlKjlnIbmnaXnu5jliLbvvIzov5vooYzlj5jlvaJcbiAgICAgICAgICAgIHZhciByID0gcnggPiByeSA/IHJ4IDogcnk7XG4gICAgICAgICAgICB2YXIgc2NhbGVYID0gcnggPiByeSA/IDEgOiByeCAvIHJ5O1xuICAgICAgICAgICAgdmFyIHNjYWxlWSA9IHJ4ID4gcnkgPyByeSAvIHJ4IDogMTtcbiAgICAgICAgICAgIGNvbnRleHQuc2F2ZSgpO1xuICAgICAgICAgICAgY29udGV4dC50cmFuc2xhdGUoY3gsIGN5KTtcbiAgICAgICAgICAgIGNvbnRleHQuc2NhbGUoc2NhbGVYLCBzY2FsZVkpO1xuICAgICAgICAgICAgY29udGV4dC5hcmMoMCwgMCwgciwgMCwgTWF0aC5QSSAqIDIpO1xuICAgICAgICAgICAgY29udGV4dC5yZXN0b3JlKCk7XG4gICAgICAgICAgICBjb250ZXh0LmNsb3NlUGF0aCgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gRWxsaXBzZTtcbn0oU2hhcGVCYXNlKSk7XG5leHBvcnQgZGVmYXVsdCBFbGxpcHNlO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZWxsaXBzZS5qcy5tYXAiLCIvKipcbiAqIEBmaWxlb3ZlcnZpZXcg5Zu+54mHXG4gKiBAYXV0aG9yIGR4cTYxM0BnbWFpbC5jb21cbiAqL1xuaW1wb3J0IHsgX19hc3NpZ24sIF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IFNoYXBlQmFzZSBmcm9tICcuL2Jhc2UnO1xuaW1wb3J0IHsgaXNTdHJpbmcsIGlzTmlsIH0gZnJvbSAnLi4vdXRpbC91dGlsJztcbmZ1bmN0aW9uIGlzQ2FudmFzKGRvbSkge1xuICAgIHJldHVybiBkb20gaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiBpc1N0cmluZyhkb20ubm9kZU5hbWUpICYmIGRvbS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSAnQ0FOVkFTJztcbn1cbnZhciBJbWFnZVNoYXBlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhJbWFnZVNoYXBlLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEltYWdlU2hhcGUoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICB9XG4gICAgSW1hZ2VTaGFwZS5wcm90b3R5cGUuZ2V0RGVmYXVsdEF0dHJzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYXR0cnMgPSBfc3VwZXIucHJvdG90eXBlLmdldERlZmF1bHRBdHRycy5jYWxsKHRoaXMpO1xuICAgICAgICByZXR1cm4gX19hc3NpZ24oX19hc3NpZ24oe30sIGF0dHJzKSwgeyB4OiAwLCB5OiAwLCB3aWR0aDogMCwgaGVpZ2h0OiAwIH0pO1xuICAgIH07XG4gICAgSW1hZ2VTaGFwZS5wcm90b3R5cGUuaW5pdEF0dHJzID0gZnVuY3Rpb24gKGF0dHJzKSB7XG4gICAgICAgIHRoaXMuX3NldEltYWdlKGF0dHJzLmltZyk7XG4gICAgfTtcbiAgICAvLyBpbWFnZSDkuI3orqHnrpcgc3Ryb2tlXG4gICAgSW1hZ2VTaGFwZS5wcm90b3R5cGUuaXNTdHJva2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICAgIC8vIOS7heS7heS9v+eUqOWMheWbtOebkuajgOa1i+adpei/m+ihjOaLvuWPllxuICAgIC8vIOaJgOS7peS4jemcgOimgeWkjeWGmSBpc0luU3Ryb2tlT3JQYXRoIOeahOaWueazlVxuICAgIEltYWdlU2hhcGUucHJvdG90eXBlLmlzT25seUhpdEJveCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcbiAgICBJbWFnZVNoYXBlLnByb3RvdHlwZS5fYWZ0ZXJMb2FkaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5nZXQoJ3RvRHJhdycpID09PSB0cnVlKSB7XG4gICAgICAgICAgICB2YXIgY2FudmFzID0gdGhpcy5nZXQoJ2NhbnZhcycpO1xuICAgICAgICAgICAgaWYgKGNhbnZhcykge1xuICAgICAgICAgICAgICAgIC8vIOi/meauteW6lOivpeaUueaIkOWxgOmDqOa4suafk1xuICAgICAgICAgICAgICAgIGNhbnZhcy5kcmF3KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyDov5nnp43mlrnlvI/lpoLmnpzlj5HnlJ/pga7mjKHkvJrlh7rnjrDpl67pophcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVBhdGgodGhpcy5nZXQoJ2NvbnRleHQnKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIEltYWdlU2hhcGUucHJvdG90eXBlLl9zZXRJbWFnZSA9IGZ1bmN0aW9uIChpbWcpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIGF0dHJzID0gdGhpcy5hdHRycztcbiAgICAgICAgaWYgKGlzU3RyaW5nKGltZykpIHtcbiAgICAgICAgICAgIHZhciBpbWFnZV8xID0gbmV3IEltYWdlKCk7XG4gICAgICAgICAgICBpbWFnZV8xLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAvLyDlm77niYfmnKrliqDovb3lrozvvIzliJnlt7Lnu4/ooqvplIDmr4FcbiAgICAgICAgICAgICAgICBpZiAoX3RoaXMuZGVzdHJveWVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8g57yT5a2Y5Y6f5aeL5Zyw5Z2A77yM5Y+v5Lul5YGa5a+55q+U77yM6Ziy5q2i6YeN5aSN5Yqg6L295Zu+54mHXG4gICAgICAgICAgICAgICAgLy8g5aaC5p6c6ICD6JmR5Yiw5Zyo5Yqg6L296L+H56iL5Lit5Y+v6IO95pu/5o2iIGltZyDlsZ7mgKfvvIzliJnmg4XlhrXmm7TliqDlpI3mnYJcbiAgICAgICAgICAgICAgICAvLyB0aGlzLnNldCgnaW1nU3JjJywgaW1nKTtcbiAgICAgICAgICAgICAgICAvLyDov5nph4zkvJrlvqrnjq/osIPnlKggX3NldEltYWdlIOaWueazle+8jOS9huS4jeS8muWGjei1sOi/meS4quWIhuaUr1xuICAgICAgICAgICAgICAgIF90aGlzLmF0dHIoJ2ltZycsIGltYWdlXzEpO1xuICAgICAgICAgICAgICAgIF90aGlzLnNldCgnbG9hZGluZycsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBfdGhpcy5fYWZ0ZXJMb2FkaW5nKCk7XG4gICAgICAgICAgICAgICAgdmFyIGNhbGxiYWNrID0gX3RoaXMuZ2V0KCdjYWxsYmFjaycpO1xuICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5jYWxsKF90aGlzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgLy8g6K6+572u6Leo5Z+fXG4gICAgICAgICAgICBpbWFnZV8xLmNyb3NzT3JpZ2luID0gJ0Fub255bW91cyc7XG4gICAgICAgICAgICBpbWFnZV8xLnNyYyA9IGltZztcbiAgICAgICAgICAgIC8vIGxvYWRpbmcg6L+H56iL5Lit5LiN57uY5Yi2XG4gICAgICAgICAgICB0aGlzLnNldCgnbG9hZGluZycsIHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGltZyBpbnN0YW5jZW9mIEltYWdlKSB7XG4gICAgICAgICAgICAvLyDlpoLmnpzmmK/kuIDkuKogaW1hZ2Ug5a+56LGh77yM5YiZ6K6+572u5a696auYXG4gICAgICAgICAgICBpZiAoIWF0dHJzLndpZHRoKSB7XG4gICAgICAgICAgICAgICAgYXR0cnMud2lkdGggPSBpbWcud2lkdGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWF0dHJzLmhlaWdodCkge1xuICAgICAgICAgICAgICAgIGF0dHJzLmhlaWdodCA9IGltZy5oZWlnaHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNDYW52YXMoaW1nKSkge1xuICAgICAgICAgICAgLy8g5aaC5p6c6K6+572u5LqGIGNhbnZhcyDlr7nosaFcbiAgICAgICAgICAgIGlmICghYXR0cnMud2lkdGgpIHtcbiAgICAgICAgICAgICAgICBhdHRycy53aWR0aCA9IE51bWJlcihpbWcuZ2V0QXR0cmlidXRlKCd3aWR0aCcpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghYXR0cnMuaGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgYXR0cnMuaGVpZ2h0LCBOdW1iZXIoaW1nLmdldEF0dHJpYnV0ZSgnaGVpZ2h0JykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBJbWFnZVNoYXBlLnByb3RvdHlwZS5vbkF0dHJDaGFuZ2UgPSBmdW5jdGlvbiAobmFtZSwgdmFsdWUsIG9yaWdpblZhbHVlKSB7XG4gICAgICAgIF9zdXBlci5wcm90b3R5cGUub25BdHRyQ2hhbmdlLmNhbGwodGhpcywgbmFtZSwgdmFsdWUsIG9yaWdpblZhbHVlKTtcbiAgICAgICAgLy8g5aaC5p6c5Yqg6L2955qE5bey57uP5piv5b2T5YmN5Zu+54mH77yM5YiZ5LiN5YaN5aSE55CGXG4gICAgICAgIGlmIChuYW1lID09PSAnaW1nJykge1xuICAgICAgICAgICAgLy8g5Y+v5Lul5Yqg57yT5Yay77yMJiYgdGhpcy5nZXQoJ2ltZ1NyYycpICE9PSB2YWx1ZVxuICAgICAgICAgICAgdGhpcy5fc2V0SW1hZ2UodmFsdWUpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBJbWFnZVNoYXBlLnByb3RvdHlwZS5jcmVhdGVQYXRoID0gZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgICAgLy8g5q2j5Zyo5Yqg6L295YiZ5LiN57uY5Yi2XG4gICAgICAgIGlmICh0aGlzLmdldCgnbG9hZGluZycpKSB7XG4gICAgICAgICAgICB0aGlzLnNldCgndG9EcmF3JywgdHJ1ZSk7IC8vIOWKoOi9veWujOaIkOWQjue7mOWItlxuICAgICAgICAgICAgdGhpcy5zZXQoJ2NvbnRleHQnLCBjb250ZXh0KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgYXR0cnMgPSB0aGlzLmF0dHIoKTtcbiAgICAgICAgdmFyIHggPSBhdHRycy54LCB5ID0gYXR0cnMueSwgd2lkdGggPSBhdHRycy53aWR0aCwgaGVpZ2h0ID0gYXR0cnMuaGVpZ2h0LCBzeCA9IGF0dHJzLnN4LCBzeSA9IGF0dHJzLnN5LCBzd2lkdGggPSBhdHRycy5zd2lkdGgsIHNoZWlnaHQgPSBhdHRycy5zaGVpZ2h0O1xuICAgICAgICB2YXIgaW1nID0gYXR0cnMuaW1nO1xuICAgICAgICBpZiAoaW1nIGluc3RhbmNlb2YgSW1hZ2UgfHwgaXNDYW52YXMoaW1nKSkge1xuICAgICAgICAgICAgaWYgKCFpc05pbChzeCkgJiYgIWlzTmlsKHN5KSAmJiAhaXNOaWwoc3dpZHRoKSAmJiAhaXNOaWwoc2hlaWdodCkpIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0LmRyYXdJbWFnZShpbWcsIHN4LCBzeSwgc3dpZHRoLCBzaGVpZ2h0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnRleHQuZHJhd0ltYWdlKGltZywgeCwgeSwgd2lkdGgsIGhlaWdodCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBJbWFnZVNoYXBlO1xufShTaGFwZUJhc2UpKTtcbmV4cG9ydCBkZWZhdWx0IEltYWdlU2hhcGU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbWFnZS5qcy5tYXAiLCJpbXBvcnQgeyBMaW5lIGFzIExpbmVVdGlsIH0gZnJvbSAnQGFudHYvZy1tYXRoJztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGluTGluZSh4MSwgeTEsIHgyLCB5MiwgbGluZVdpZHRoLCB4LCB5KSB7XG4gICAgdmFyIG1pblggPSBNYXRoLm1pbih4MSwgeDIpO1xuICAgIHZhciBtYXhYID0gTWF0aC5tYXgoeDEsIHgyKTtcbiAgICB2YXIgbWluWSA9IE1hdGgubWluKHkxLCB5Mik7XG4gICAgdmFyIG1heFkgPSBNYXRoLm1heCh5MSwgeTIpO1xuICAgIHZhciBoYWxmV2lkdGggPSBsaW5lV2lkdGggLyAyO1xuICAgIC8vIOWboOS4uuebruWJjeeahOaWueahiOaYr+iuoeeul+eCueWIsOebtOe6v+eahOi3neemu++8jOiAjOacieWPr+iDveS8muWcqOW7tumVv+e6v+S4iu+8jOaJgOS7peimgeWFiOWIpOaWreaYr+WQpuWcqOWMheWbtOebkuWGhVxuICAgIC8vIOi/meenjeaWueahiOS8muWcqOawtOW5s+aIluiAheerluebtOeahOaDheWGteS4i+i9vee6v+eahOW7tumVv+e6v+S4iuacieWNiiBsaW5lV2lkdGgg55qE6K+v5beuXG4gICAgaWYgKCEoeCA+PSBtaW5YIC0gaGFsZldpZHRoICYmIHggPD0gbWF4WCArIGhhbGZXaWR0aCAmJiB5ID49IG1pblkgLSBoYWxmV2lkdGggJiYgeSA8PSBtYXhZICsgaGFsZldpZHRoKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8vIOWboOS4uuW3sue7j+iuoeeul+S6huWMheWbtOebku+8jOaJgOS7peS7hemcgOimgeiuoeeul+WIsOebtOe6v+eahOi3neemu+WNs+WPr++8jOWPr+S7peaYvuiRl+aPkOWNh+aAp+iDvVxuICAgIHJldHVybiBMaW5lVXRpbC5wb2ludFRvTGluZSh4MSwgeTEsIHgyLCB5MiwgeCwgeSkgPD0gbGluZVdpZHRoIC8gMjtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWxpbmUuanMubWFwIiwiaW1wb3J0IHsgX19hc3NpZ24sIF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuLyoqXG4gKiBAZmlsZW92ZXJ2aWV3IOe6v1xuICogQGF1dGhvciBkeHE2MTNAZ21haWwuY29tXG4gKi9cbmltcG9ydCB7IExpbmUgYXMgTGluZVV0aWwgfSBmcm9tICdAYW50di9nLW1hdGgnO1xuaW1wb3J0IFNoYXBlQmFzZSBmcm9tICcuL2Jhc2UnO1xuaW1wb3J0IGluTGluZSBmcm9tICcuLi91dGlsL2luLXN0cm9rZS9saW5lJztcbmltcG9ydCAqIGFzIEFycm93VXRpbCBmcm9tICcuLi91dGlsL2Fycm93JztcbnZhciBMaW5lID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhMaW5lLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIExpbmUoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICB9XG4gICAgTGluZS5wcm90b3R5cGUuZ2V0RGVmYXVsdEF0dHJzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYXR0cnMgPSBfc3VwZXIucHJvdG90eXBlLmdldERlZmF1bHRBdHRycy5jYWxsKHRoaXMpO1xuICAgICAgICByZXR1cm4gX19hc3NpZ24oX19hc3NpZ24oe30sIGF0dHJzKSwgeyB4MTogMCwgeTE6IDAsIHgyOiAwLCB5MjogMCwgc3RhcnRBcnJvdzogZmFsc2UsIGVuZEFycm93OiBmYWxzZSB9KTtcbiAgICB9O1xuICAgIExpbmUucHJvdG90eXBlLmluaXRBdHRycyA9IGZ1bmN0aW9uIChhdHRycykge1xuICAgICAgICB0aGlzLnNldEFycm93KCk7XG4gICAgfTtcbiAgICAvLyDmm7TmlrDlsZ7mgKfml7bvvIzmo4DmtYvmmK/lkKbmm7TmlLnkuobnrq3lpLRcbiAgICBMaW5lLnByb3RvdHlwZS5vbkF0dHJDaGFuZ2UgPSBmdW5jdGlvbiAobmFtZSwgdmFsdWUsIG9yaWdpblZhbHVlKSB7XG4gICAgICAgIF9zdXBlci5wcm90b3R5cGUub25BdHRyQ2hhbmdlLmNhbGwodGhpcywgbmFtZSwgdmFsdWUsIG9yaWdpblZhbHVlKTtcbiAgICAgICAgLy8g55Sx5LqO566t5aS055qE57uY5Yi25L6d6LWW5LqOIGxpbmUg55qE6K+45aSaIGF0dHJz77yM5Zug5q2k6L+Z6YeM5LiN5YaN5a+55q+P5LiqIGF0dHIg6L+b6KGM5Yik5pat77yMYXR0ciDmr4/mrKHlj5jljJbpg73kvJrlvbHlk43nrq3lpLTnmoTmm7TmlrBcbiAgICAgICAgdGhpcy5zZXRBcnJvdygpO1xuICAgIH07XG4gICAgTGluZS5wcm90b3R5cGUuc2V0QXJyb3cgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBhdHRycyA9IHRoaXMuYXR0cigpO1xuICAgICAgICB2YXIgeDEgPSBhdHRycy54MSwgeTEgPSBhdHRycy55MSwgeDIgPSBhdHRycy54MiwgeTIgPSBhdHRycy55Miwgc3RhcnRBcnJvdyA9IGF0dHJzLnN0YXJ0QXJyb3csIGVuZEFycm93ID0gYXR0cnMuZW5kQXJyb3c7XG4gICAgICAgIGlmIChzdGFydEFycm93KSB7XG4gICAgICAgICAgICBBcnJvd1V0aWwuYWRkU3RhcnRBcnJvdyh0aGlzLCBhdHRycywgeDIsIHkyLCB4MSwgeTEpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbmRBcnJvdykge1xuICAgICAgICAgICAgQXJyb3dVdGlsLmFkZEVuZEFycm93KHRoaXMsIGF0dHJzLCB4MSwgeTEsIHgyLCB5Mik7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIExpbmUucHJvdG90eXBlLmlzSW5TdHJva2VPclBhdGggPSBmdW5jdGlvbiAoeCwgeSwgaXNTdHJva2UsIGlzRmlsbCwgbGluZVdpZHRoKSB7XG4gICAgICAgIGlmICghaXNTdHJva2UgfHwgIWxpbmVXaWR0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHZhciBfYSA9IHRoaXMuYXR0cigpLCB4MSA9IF9hLngxLCB5MSA9IF9hLnkxLCB4MiA9IF9hLngyLCB5MiA9IF9hLnkyO1xuICAgICAgICByZXR1cm4gaW5MaW5lKHgxLCB5MSwgeDIsIHkyLCBsaW5lV2lkdGgsIHgsIHkpO1xuICAgIH07XG4gICAgTGluZS5wcm90b3R5cGUuY3JlYXRlUGF0aCA9IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICAgIHZhciBhdHRycyA9IHRoaXMuYXR0cigpO1xuICAgICAgICB2YXIgeDEgPSBhdHRycy54MSwgeTEgPSBhdHRycy55MSwgeDIgPSBhdHRycy54MiwgeTIgPSBhdHRycy55Miwgc3RhcnRBcnJvdyA9IGF0dHJzLnN0YXJ0QXJyb3csIGVuZEFycm93ID0gYXR0cnMuZW5kQXJyb3c7XG4gICAgICAgIHZhciBzdGFydEFycm93RGlzdGFuY2UgPSB7XG4gICAgICAgICAgICBkeDogMCxcbiAgICAgICAgICAgIGR5OiAwLFxuICAgICAgICB9O1xuICAgICAgICB2YXIgZW5kQXJyb3dEaXN0YW5jZSA9IHtcbiAgICAgICAgICAgIGR4OiAwLFxuICAgICAgICAgICAgZHk6IDAsXG4gICAgICAgIH07XG4gICAgICAgIGlmIChzdGFydEFycm93ICYmIHN0YXJ0QXJyb3cuZCkge1xuICAgICAgICAgICAgc3RhcnRBcnJvd0Rpc3RhbmNlID0gQXJyb3dVdGlsLmdldFNob3J0ZW5PZmZzZXQoeDEsIHkxLCB4MiwgeTIsIGF0dHJzLnN0YXJ0QXJyb3cuZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVuZEFycm93ICYmIGVuZEFycm93LmQpIHtcbiAgICAgICAgICAgIGVuZEFycm93RGlzdGFuY2UgPSBBcnJvd1V0aWwuZ2V0U2hvcnRlbk9mZnNldCh4MSwgeTEsIHgyLCB5MiwgYXR0cnMuZW5kQXJyb3cuZCk7XG4gICAgICAgIH1cbiAgICAgICAgY29udGV4dC5iZWdpblBhdGgoKTtcbiAgICAgICAgLy8g5aaC5p6c6Ieq5a6a5LmJ566t5aS077yM57q/5p2h55u45bqU57yp6L+bXG4gICAgICAgIGNvbnRleHQubW92ZVRvKHgxICsgc3RhcnRBcnJvd0Rpc3RhbmNlLmR4LCB5MSArIHN0YXJ0QXJyb3dEaXN0YW5jZS5keSk7XG4gICAgICAgIGNvbnRleHQubGluZVRvKHgyIC0gZW5kQXJyb3dEaXN0YW5jZS5keCwgeTIgLSBlbmRBcnJvd0Rpc3RhbmNlLmR5KTtcbiAgICB9O1xuICAgIExpbmUucHJvdG90eXBlLmFmdGVyRHJhd1BhdGggPSBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgICB2YXIgc3RhcnRBcnJvd1NoYXBlID0gdGhpcy5nZXQoJ3N0YXJ0QXJyb3dTaGFwZScpO1xuICAgICAgICB2YXIgZW5kQXJyb3dTaGFwZSA9IHRoaXMuZ2V0KCdlbmRBcnJvd1NoYXBlJyk7XG4gICAgICAgIGlmIChzdGFydEFycm93U2hhcGUpIHtcbiAgICAgICAgICAgIHN0YXJ0QXJyb3dTaGFwZS5kcmF3KGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbmRBcnJvd1NoYXBlKSB7XG4gICAgICAgICAgICBlbmRBcnJvd1NoYXBlLmRyYXcoY29udGV4dCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCBsZW5ndGggb2YgbGluZVxuICAgICAqIEByZXR1cm4ge251bWJlcn0gbGVuZ3RoXG4gICAgICovXG4gICAgTGluZS5wcm90b3R5cGUuZ2V0VG90YWxMZW5ndGggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYSA9IHRoaXMuYXR0cigpLCB4MSA9IF9hLngxLCB5MSA9IF9hLnkxLCB4MiA9IF9hLngyLCB5MiA9IF9hLnkyO1xuICAgICAgICByZXR1cm4gTGluZVV0aWwubGVuZ3RoKHgxLCB5MSwgeDIsIHkyKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCBwb2ludCBhY2NvcmRpbmcgdG8gcmF0aW9cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmF0aW9cbiAgICAgKiBAcmV0dXJuIHtQb2ludH0gcG9pbnRcbiAgICAgKi9cbiAgICBMaW5lLnByb3RvdHlwZS5nZXRQb2ludCA9IGZ1bmN0aW9uIChyYXRpbykge1xuICAgICAgICB2YXIgX2EgPSB0aGlzLmF0dHIoKSwgeDEgPSBfYS54MSwgeTEgPSBfYS55MSwgeDIgPSBfYS54MiwgeTIgPSBfYS55MjtcbiAgICAgICAgcmV0dXJuIExpbmVVdGlsLnBvaW50QXQoeDEsIHkxLCB4MiwgeTIsIHJhdGlvKTtcbiAgICB9O1xuICAgIHJldHVybiBMaW5lO1xufShTaGFwZUJhc2UpKTtcbmV4cG9ydCBkZWZhdWx0IExpbmU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1saW5lLmpzLm1hcCIsIi8qKlxuICogQGZpbGVvdmVydmlldyBNYXJrZXJcbiAqIEBhdXRob3IgZHhxNjEzQGdtYWlsLmNvbVxuICovXG5pbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGlzTmlsIH0gZnJvbSAnQGFudHYvdXRpbCc7XG5pbXBvcnQgeyBwYXRoMkFic29sdXRlIH0gZnJvbSAnQGFudHYvcGF0aC11dGlsJztcbmltcG9ydCBTaGFwZUJhc2UgZnJvbSAnLi9iYXNlJztcbmltcG9ydCB7IGlzRnVuY3Rpb24gfSBmcm9tICcuLi91dGlsL3V0aWwnO1xuaW1wb3J0IHsgZHJhd1BhdGggfSBmcm9tICcuLi91dGlsL2RyYXcnO1xudmFyIFN5bWJvbHMgPSB7XG4gICAgLy8g5ZyGXG4gICAgY2lyY2xlOiBmdW5jdGlvbiAoeCwgeSwgcikge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgWydNJywgeCAtIHIsIHldLFxuICAgICAgICAgICAgWydBJywgciwgciwgMCwgMSwgMCwgeCArIHIsIHldLFxuICAgICAgICAgICAgWydBJywgciwgciwgMCwgMSwgMCwgeCAtIHIsIHldLFxuICAgICAgICBdO1xuICAgIH0sXG4gICAgLy8g5q2j5pa55b2iXG4gICAgc3F1YXJlOiBmdW5jdGlvbiAoeCwgeSwgcikge1xuICAgICAgICByZXR1cm4gW1snTScsIHggLSByLCB5IC0gcl0sIFsnTCcsIHggKyByLCB5IC0gcl0sIFsnTCcsIHggKyByLCB5ICsgcl0sIFsnTCcsIHggLSByLCB5ICsgcl0sIFsnWiddXTtcbiAgICB9LFxuICAgIC8vIOiPseW9olxuICAgIGRpYW1vbmQ6IGZ1bmN0aW9uICh4LCB5LCByKSB7XG4gICAgICAgIHJldHVybiBbWydNJywgeCAtIHIsIHldLCBbJ0wnLCB4LCB5IC0gcl0sIFsnTCcsIHggKyByLCB5XSwgWydMJywgeCwgeSArIHJdLCBbJ1onXV07XG4gICAgfSxcbiAgICAvLyDkuInop5LlvaJcbiAgICB0cmlhbmdsZTogZnVuY3Rpb24gKHgsIHksIHIpIHtcbiAgICAgICAgdmFyIGRpZmZZID0gciAqIE1hdGguc2luKCgxIC8gMykgKiBNYXRoLlBJKTtcbiAgICAgICAgcmV0dXJuIFtbJ00nLCB4IC0gciwgeSArIGRpZmZZXSwgWydMJywgeCwgeSAtIGRpZmZZXSwgWydMJywgeCArIHIsIHkgKyBkaWZmWV0sIFsnWiddXTtcbiAgICB9LFxuICAgIC8vIOWAkuS4ieinkuW9olxuICAgICd0cmlhbmdsZS1kb3duJzogZnVuY3Rpb24gKHgsIHksIHIpIHtcbiAgICAgICAgdmFyIGRpZmZZID0gciAqIE1hdGguc2luKCgxIC8gMykgKiBNYXRoLlBJKTtcbiAgICAgICAgcmV0dXJuIFtbJ00nLCB4IC0gciwgeSAtIGRpZmZZXSwgWydMJywgeCArIHIsIHkgLSBkaWZmWV0sIFsnTCcsIHgsIHkgKyBkaWZmWV0sIFsnWiddXTtcbiAgICB9LFxufTtcbnZhciBNYXJrZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKE1hcmtlciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBNYXJrZXIoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICB9XG4gICAgTWFya2VyLnByb3RvdHlwZS5pbml0QXR0cnMgPSBmdW5jdGlvbiAoYXR0cnMpIHtcbiAgICAgICAgdGhpcy5fcmVzZXRQYXJhbXNDYWNoZSgpO1xuICAgIH07XG4gICAgLy8g6YeN572u57uY5Yi2IHBhdGgg5a2Y5YKo55qE57yT5a2YXG4gICAgTWFya2VyLnByb3RvdHlwZS5fcmVzZXRQYXJhbXNDYWNoZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8g5Li65LqG5Yqg6YCfIHBhdGgg55qE57uY5Yi244CB5ou+5Y+W5ZKM6K6h566X77yM6L+Z5Liq5Zyw5pa55Y+v5Lul57yT5a2Y5b6I5aSa5Lic6KW/XG4gICAgICAgIC8vIOi/meS6m+e8k+WtmOmDveaYr+esrOS4gOasoemcgOimgeaXtuiuoeeul+WSjOWtmOWCqO+8jOiZveeEtuWinuWKoOS6huWkjeadguW6pu+8jOS9huaYr+mikee5geiwg+eUqOeahOaWueazle+8jOaAp+iDveacieW+iOWkp+aPkOWNh1xuICAgICAgICB0aGlzLnNldCgncGFyYW1zQ2FjaGUnLCB7fSk7IC8vIOa4heeQhue8k+WtmFxuICAgIH07XG4gICAgLy8g5pu05paw5bGe5oCn5pe277yM5qOA5rWL5piv5ZCm5pu05pS55LqGIHBhdGhcbiAgICBNYXJrZXIucHJvdG90eXBlLm9uQXR0ckNoYW5nZSA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSwgb3JpZ2luVmFsdWUpIHtcbiAgICAgICAgX3N1cGVyLnByb3RvdHlwZS5vbkF0dHJDaGFuZ2UuY2FsbCh0aGlzLCBuYW1lLCB2YWx1ZSwgb3JpZ2luVmFsdWUpO1xuICAgICAgICBpZiAoWydzeW1ib2wnLCAneCcsICd5JywgJ3InLCAncmFkaXVzJ10uaW5kZXhPZihuYW1lKSAhPT0gLTEpIHtcbiAgICAgICAgICAgIC8vIHBhdGgg55u45YWz5bGe5oCn5pu05pS55pe277yM5riF55CG57yT5a2YXG4gICAgICAgICAgICB0aGlzLl9yZXNldFBhcmFtc0NhY2hlKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8vIOS7heS7heS9v+eUqOWMheWbtOebkuajgOa1i+adpei/m+ihjOaLvuWPllxuICAgIC8vIOaJgOS7peS4jemcgOimgeWkjeWGmSBpc0luU3Ryb2tlT3JQYXRoIOeahOaWueazlVxuICAgIE1hcmtlci5wcm90b3R5cGUuaXNPbmx5SGl0Qm94ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuICAgIE1hcmtlci5wcm90b3R5cGUuX2dldFIgPSBmdW5jdGlvbiAoYXR0cnMpIHtcbiAgICAgICAgLy8g5YW85a65IHIg5ZKMIHJhZGl1cyDkuKTnp43lhpnms5XvvIzmjqjojZDkvb/nlKggclxuICAgICAgICByZXR1cm4gaXNOaWwoYXR0cnMucikgPyBhdHRycy5yYWRpdXMgOiBhdHRycy5yO1xuICAgIH07XG4gICAgTWFya2VyLnByb3RvdHlwZS5fZ2V0UGF0aCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGF0dHJzID0gdGhpcy5hdHRyKCk7XG4gICAgICAgIHZhciB4ID0gYXR0cnMueCwgeSA9IGF0dHJzLnk7XG4gICAgICAgIHZhciBzeW1ib2wgPSBhdHRycy5zeW1ib2wgfHwgJ2NpcmNsZSc7XG4gICAgICAgIHZhciByID0gdGhpcy5fZ2V0UihhdHRycyk7XG4gICAgICAgIHZhciBtZXRob2Q7XG4gICAgICAgIHZhciBwYXRoO1xuICAgICAgICBpZiAoaXNGdW5jdGlvbihzeW1ib2wpKSB7XG4gICAgICAgICAgICBtZXRob2QgPSBzeW1ib2w7XG4gICAgICAgICAgICBwYXRoID0gbWV0aG9kKHgsIHksIHIpO1xuICAgICAgICAgICAgLy8g5bCGIHBhdGgg6L2s5oiQ57ud5a+56Lev5b6EXG4gICAgICAgICAgICBwYXRoID0gcGF0aDJBYnNvbHV0ZShwYXRoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIOWGhee9riBzeW1ib2wg55qEIHBhdGgg6YO95piv57ud5a+56Lev5b6E77yM55u05o6l57uY5Yi25Y2z5Y+v77yM5LiN6ZyA6KaB5a+5IHBhdGgg6L+b6KGM54m55q6K5aSE55CGXG4gICAgICAgICAgICBtZXRob2QgPSBNYXJrZXIuU3ltYm9sc1tzeW1ib2xdO1xuICAgICAgICAgICAgaWYgKCFtZXRob2QpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oc3ltYm9sICsgXCIgbWFya2VyIGlzIG5vdCBzdXBwb3J0ZWQuXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGF0aCA9IG1ldGhvZCh4LCB5LCByKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGF0aDtcbiAgICB9O1xuICAgIE1hcmtlci5wcm90b3R5cGUuY3JlYXRlUGF0aCA9IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICAgIHZhciBwYXRoID0gdGhpcy5fZ2V0UGF0aCgpO1xuICAgICAgICB2YXIgcGFyYW1zQ2FjaGUgPSB0aGlzLmdldCgncGFyYW1zQ2FjaGUnKTtcbiAgICAgICAgZHJhd1BhdGgodGhpcywgY29udGV4dCwgeyBwYXRoOiBwYXRoIH0sIHBhcmFtc0NhY2hlKTtcbiAgICB9O1xuICAgIE1hcmtlci5TeW1ib2xzID0gU3ltYm9scztcbiAgICByZXR1cm4gTWFya2VyO1xufShTaGFwZUJhc2UpKTtcbmV4cG9ydCBkZWZhdWx0IE1hcmtlcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1hcmtlci5qcy5tYXAiLCJpbXBvcnQgeyBnZXRPZmZTY3JlZW5Db250ZXh0IH0gZnJvbSAnQGFudHYvZy1iYXNlJztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlzUG9pbnRJblBhdGgoc2hhcGUsIHgsIHkpIHtcbiAgICB2YXIgY3R4ID0gZ2V0T2ZmU2NyZWVuQ29udGV4dCgpO1xuICAgIHNoYXBlLmNyZWF0ZVBhdGgoY3R4KTtcbiAgICByZXR1cm4gY3R4LmlzUG9pbnRJblBhdGgoeCwgeSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wb2ludC1pbi1wYXRoLmpzLm1hcCIsIi8qKlxuICogQGZpbGVvdmVydmlldyDliKTmlq3ngrnmmK/lkKblnKjlpJrovrnlvaLlhoVcbiAqIEBhdXRob3IgZHhxNjEzQGdtYWlsLmNvbVxuICovXG4vLyDlpJrovrnlvaLnmoTlsITnur/mo4DmtYvvvIzlj4LogIPvvJpodHRwczovL2Jsb2cuY3Nkbi5uZXQvV2lsbGlhbVN1bjAxMjIvYXJ0aWNsZS9kZXRhaWxzLzc3OTk0NTI2XG52YXIgdG9sZXJhbmNlID0gMWUtNjtcbi8vIOS4ieaAgeWHveaVsO+8jOWIpOaWreS4pOS4qmRvdWJsZeWcqGVwc+eyvuW6puS4i+eahOWkp+Wwj+WFs+ezu1xuZnVuY3Rpb24gZGNtcCh4KSB7XG4gICAgaWYgKE1hdGguYWJzKHgpIDwgdG9sZXJhbmNlKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICByZXR1cm4geCA8IDAgPyAtMSA6IDE7XG59XG4vLyDliKTmlq3ngrlR5piv5ZCm5ZyocDHlkoxwMueahOe6v+auteS4ilxuZnVuY3Rpb24gb25TZWdtZW50KHAxLCBwMiwgcSkge1xuICAgIGlmICgocVswXSAtIHAxWzBdKSAqIChwMlsxXSAtIHAxWzFdKSA9PT0gKHAyWzBdIC0gcDFbMF0pICogKHFbMV0gLSBwMVsxXSkgJiZcbiAgICAgICAgTWF0aC5taW4ocDFbMF0sIHAyWzBdKSA8PSBxWzBdICYmXG4gICAgICAgIHFbMF0gPD0gTWF0aC5tYXgocDFbMF0sIHAyWzBdKSAmJlxuICAgICAgICBNYXRoLm1pbihwMVsxXSwgcDJbMV0pIDw9IHFbMV0gJiZcbiAgICAgICAgcVsxXSA8PSBNYXRoLm1heChwMVsxXSwgcDJbMV0pKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG4vLyDliKTmlq3ngrlQ5Zyo5aSa6L655b2i5YaFLeWwhOe6v+azlVxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNJblBvbHlnb24ocG9pbnRzLCB4LCB5KSB7XG4gICAgdmFyIGlzSGl0ID0gZmFsc2U7XG4gICAgdmFyIG4gPSBwb2ludHMubGVuZ3RoO1xuICAgIGlmIChuIDw9IDIpIHtcbiAgICAgICAgLy8gc3ZnIOS4reeCueWwj+S6jiAzIOS4quaXtu+8jOS4jeaYvuekuu+8jOS5n+aXoOazleiiq+aLvuWPllxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgIHZhciBwMSA9IHBvaW50c1tpXTtcbiAgICAgICAgdmFyIHAyID0gcG9pbnRzWyhpICsgMSkgJSBuXTtcbiAgICAgICAgaWYgKG9uU2VnbWVudChwMSwgcDIsIFt4LCB5XSkpIHtcbiAgICAgICAgICAgIC8vIOeCueWcqOWkmui+ueW9ouS4gOadoei+ueS4ilxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8g5YmN5LiA5Liq5Yik5patbWluKHAxWzFdLHAyWzFdKTxQLnk8PW1heChwMVsxXSxwMlsxXSlcbiAgICAgICAgLy8g5ZCO5LiA5Liq5Yik5pat6KKr5rWL54K5IOWcqCDlsITnur/kuI7ovrnkuqTngrkg55qE5bem6L65XG4gICAgICAgIGlmIChkY21wKHAxWzFdIC0geSkgPiAwICE9PSBkY21wKHAyWzFdIC0geSkgPiAwICYmXG4gICAgICAgICAgICBkY21wKHggLSAoKHkgLSBwMVsxXSkgKiAocDFbMF0gLSBwMlswXSkpIC8gKHAxWzFdIC0gcDJbMV0pIC0gcDFbMF0pIDwgMCkge1xuICAgICAgICAgICAgaXNIaXQgPSAhaXNIaXQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGlzSGl0O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cG9seWdvbi5qcy5tYXAiLCJpbXBvcnQgeyBkaXN0YW5jZSB9IGZyb20gJy4uL3V0aWwnO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYXJjKGN4LCBjeSwgciwgc3RhcnRBbmdsZSwgZW5kQW5nbGUsIGxpbmVXaWR0aCwgeCwgeSkge1xuICAgIHZhciBhbmdsZSA9IChNYXRoLmF0YW4yKHkgLSBjeSwgeCAtIGN4KSArIE1hdGguUEkgKiAyKSAlIChNYXRoLlBJICogMik7IC8vIOi9rOaNouWIsCAwIC0gMiAqIE1hdGguUEkg5LmL6Ze0XG4gICAgaWYgKGFuZ2xlIDwgc3RhcnRBbmdsZSB8fCBhbmdsZSA+IGVuZEFuZ2xlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdmFyIHBvaW50ID0ge1xuICAgICAgICB4OiBjeCArIHIgKiBNYXRoLmNvcyhhbmdsZSksXG4gICAgICAgIHk6IGN5ICsgciAqIE1hdGguc2luKGFuZ2xlKSxcbiAgICB9O1xuICAgIHJldHVybiBkaXN0YW5jZShwb2ludC54LCBwb2ludC55LCB4LCB5KSA8PSBsaW5lV2lkdGggLyAyO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YXJjLmpzLm1hcCIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG4vKipcbiAqIEBmaWxlb3ZlcnZpZXcgcGF0aCDnmoTkuIDkupvlt6XlhbdcbiAqIEBhdXRob3IgZHhxNjEzQGdtYWlsLmNvbVxuICovXG5pbXBvcnQgeyBQYXRoVXRpbCB9IGZyb20gJ0BhbnR2L2ctYmFzZSc7XG5pbXBvcnQgeyBRdWFkIGFzIFF1YWRVdGlsIH0gZnJvbSAnQGFudHYvZy1tYXRoJztcbmltcG9ydCB7IEN1YmljIGFzIEN1YmljVXRpbCB9IGZyb20gJ0BhbnR2L2ctbWF0aCc7XG5pbXBvcnQgeyBleHQgfSBmcm9tICdAYW50di9tYXRyaXgtdXRpbCc7XG5pbXBvcnQgKiBhcyB2ZWMzIGZyb20gJ2dsLW1hdHJpeC92ZWMzJztcbmltcG9ydCB7IGluQm94IH0gZnJvbSAnLi91dGlsJztcbmltcG9ydCBpbkxpbmUgZnJvbSAnLi9pbi1zdHJva2UvbGluZSc7XG5pbXBvcnQgaW5BcmMgZnJvbSAnLi9pbi1zdHJva2UvYXJjJztcbnZhciB0cmFuc2Zvcm0gPSBleHQudHJhbnNmb3JtO1xuZnVuY3Rpb24gaGFzQXJjKHBhdGgpIHtcbiAgICB2YXIgaGFzQXJjID0gZmFsc2U7XG4gICAgdmFyIGNvdW50ID0gcGF0aC5sZW5ndGg7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XG4gICAgICAgIHZhciBwYXJhbXMgPSBwYXRoW2ldO1xuICAgICAgICB2YXIgY21kID0gcGFyYW1zWzBdO1xuICAgICAgICBpZiAoY21kID09PSAnQycgfHwgY21kID09PSAnQScgfHwgY21kID09PSAnUScpIHtcbiAgICAgICAgICAgIGhhc0FyYyA9IHRydWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaGFzQXJjO1xufVxuZnVuY3Rpb24gaXNQb2ludEluU3Ryb2tlKHNlZ21lbnRzLCBsaW5lV2lkdGgsIHgsIHksIGxlbmd0aCkge1xuICAgIHZhciBpc0hpdCA9IGZhbHNlO1xuICAgIHZhciBoYWxmV2lkdGggPSBsaW5lV2lkdGggLyAyO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VnbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHNlZ21lbnQgPSBzZWdtZW50c1tpXTtcbiAgICAgICAgdmFyIGN1cnJlbnRQb2ludCA9IHNlZ21lbnQuY3VycmVudFBvaW50LCBwYXJhbXMgPSBzZWdtZW50LnBhcmFtcywgcHJlUG9pbnQgPSBzZWdtZW50LnByZVBvaW50LCBib3ggPSBzZWdtZW50LmJveDtcbiAgICAgICAgLy8g5aaC5p6c5Zyo5YmN6Z2i5bey57uP55Sf5oiQ6L+H5YyF5Zu055uS77yM55u05o6l5oyJ54Wn5YyF5Zu055uS6K6h566XXG4gICAgICAgIGlmIChib3ggJiYgIWluQm94KGJveC54IC0gaGFsZldpZHRoLCBib3gueSAtIGhhbGZXaWR0aCwgYm94LndpZHRoICsgbGluZVdpZHRoLCBib3guaGVpZ2h0ICsgbGluZVdpZHRoLCB4LCB5KSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgc3dpdGNoIChzZWdtZW50LmNvbW1hbmQpIHtcbiAgICAgICAgICAgIC8vIEwg5ZKMIFog6YO95piv55u057q/77yMIE0g5LiN6L+b6KGM5ou+5Y+WXG4gICAgICAgICAgICBjYXNlICdMJzpcbiAgICAgICAgICAgIGNhc2UgJ1onOlxuICAgICAgICAgICAgICAgIGlzSGl0ID0gaW5MaW5lKHByZVBvaW50WzBdLCBwcmVQb2ludFsxXSwgY3VycmVudFBvaW50WzBdLCBjdXJyZW50UG9pbnRbMV0sIGxpbmVXaWR0aCwgeCwgeSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdRJzpcbiAgICAgICAgICAgICAgICB2YXIgcURpc3RhbmNlID0gUXVhZFV0aWwucG9pbnREaXN0YW5jZShwcmVQb2ludFswXSwgcHJlUG9pbnRbMV0sIHBhcmFtc1sxXSwgcGFyYW1zWzJdLCBwYXJhbXNbM10sIHBhcmFtc1s0XSwgeCwgeSk7XG4gICAgICAgICAgICAgICAgaXNIaXQgPSBxRGlzdGFuY2UgPD0gbGluZVdpZHRoIC8gMjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0MnOlxuICAgICAgICAgICAgICAgIHZhciBjRGlzdGFuY2UgPSBDdWJpY1V0aWwucG9pbnREaXN0YW5jZShwcmVQb2ludFswXSwgLy8g5LiK5LiA5q6157uT5p2f5L2N572uLCDljbMgQyDnmoTotbflp4vngrlcbiAgICAgICAgICAgICAgICBwcmVQb2ludFsxXSwgcGFyYW1zWzFdLCAvLyAnQycg55qE5Y+C5pWw77yMMeOAgTIg5Li656ys5LiA5Liq5o6n5Yi254K577yMM+OAgTQg5Li656ys5LqM5Liq5o6n5Yi254K577yMNeOAgTYg5Li657uT5p2f54K5XG4gICAgICAgICAgICAgICAgcGFyYW1zWzJdLCBwYXJhbXNbM10sIHBhcmFtc1s0XSwgcGFyYW1zWzVdLCBwYXJhbXNbNl0sIHgsIHksIGxlbmd0aCk7XG4gICAgICAgICAgICAgICAgaXNIaXQgPSBjRGlzdGFuY2UgPD0gbGluZVdpZHRoIC8gMjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0EnOlxuICAgICAgICAgICAgICAgIC8vIOiuoeeul+eCueWIsOakreWchuWchuW8p+eahOi3neemu++8jOaaguaXtuS9v+eUqOi/keS8vOeul+azle+8jOWQjumdouWPr+S7peaUueaIkOWIh+WJsuazleaxguacgOi/kei3neemu1xuICAgICAgICAgICAgICAgIHZhciBhcmNQYXJhbXMgPSBzZWdtZW50LmFyY1BhcmFtcztcbiAgICAgICAgICAgICAgICB2YXIgY3ggPSBhcmNQYXJhbXMuY3gsIGN5ID0gYXJjUGFyYW1zLmN5LCByeCA9IGFyY1BhcmFtcy5yeCwgcnkgPSBhcmNQYXJhbXMucnksIHN0YXJ0QW5nbGUgPSBhcmNQYXJhbXMuc3RhcnRBbmdsZSwgZW5kQW5nbGUgPSBhcmNQYXJhbXMuZW5kQW5nbGUsIHhSb3RhdGlvbiA9IGFyY1BhcmFtcy54Um90YXRpb247XG4gICAgICAgICAgICAgICAgdmFyIHAgPSBbeCwgeSwgMV07XG4gICAgICAgICAgICAgICAgdmFyIHIgPSByeCA+IHJ5ID8gcnggOiByeTtcbiAgICAgICAgICAgICAgICB2YXIgc2NhbGVYID0gcnggPiByeSA/IDEgOiByeCAvIHJ5O1xuICAgICAgICAgICAgICAgIHZhciBzY2FsZVkgPSByeCA+IHJ5ID8gcnkgLyByeCA6IDE7XG4gICAgICAgICAgICAgICAgdmFyIG0gPSB0cmFuc2Zvcm0obnVsbCwgW1xuICAgICAgICAgICAgICAgICAgICBbJ3QnLCAtY3gsIC1jeV0sXG4gICAgICAgICAgICAgICAgICAgIFsncicsIC14Um90YXRpb25dLFxuICAgICAgICAgICAgICAgICAgICBbJ3MnLCAxIC8gc2NhbGVYLCAxIC8gc2NhbGVZXSxcbiAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgICAgICB2ZWMzLnRyYW5zZm9ybU1hdDMocCwgcCwgbSk7XG4gICAgICAgICAgICAgICAgaXNIaXQgPSBpbkFyYygwLCAwLCByLCBzdGFydEFuZ2xlLCBlbmRBbmdsZSwgbGluZVdpZHRoLCBwWzBdLCBwWzFdKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzSGl0KSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaXNIaXQ7XG59XG4vKipcbiAqIOaPkOWPluWHuuWGhemDqOeahOmXreWQiOWkmui+ueW9ouWSjOmdnumXreWQiOeahOWkmui+ueW9ou+8jOWBh+iuviBwYXRoIOS4jeWtmOWcqOWchuW8p1xuICogQHBhcmFtIHtBcnJheX0gcGF0aCDot6/lvoRcbiAqIEByZXR1cm5zIHtBcnJheX0g54K555qE6ZuG5ZCIXG4gKi9cbmZ1bmN0aW9uIGV4dHJhY3RQb2x5Z29ucyhwYXRoKSB7XG4gICAgdmFyIGNvdW50ID0gcGF0aC5sZW5ndGg7XG4gICAgdmFyIHBvbHlnb25zID0gW107XG4gICAgdmFyIHBvbHlsaW5lcyA9IFtdO1xuICAgIHZhciBwb2ludHMgPSBbXTsgLy8g6Ziy5q2i56ys5LiA5Liq5ZG95Luk5LiN5pivICdNJ1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xuICAgICAgICB2YXIgcGFyYW1zID0gcGF0aFtpXTtcbiAgICAgICAgdmFyIGNtZCA9IHBhcmFtc1swXTtcbiAgICAgICAgaWYgKGNtZCA9PT0gJ00nKSB7XG4gICAgICAgICAgICAvLyDpgYfliLAgJ00nIOWIpOWumuaYr+WQpuaYr+aWsOaVsOe7hO+8jOaWsOaVsOe7hOS4reayoeacieeCuVxuICAgICAgICAgICAgaWYgKHBvaW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAvLyDlpoLmnpzlrZjlnKjngrnvvIzliJnor7TmmI7msqHmnInpgYfliLAgJ1on77yM5byA5aeL5LqG5LiA5Liq5paw55qE5aSa6L655b2iXG4gICAgICAgICAgICAgICAgcG9seWxpbmVzLnB1c2gocG9pbnRzKTtcbiAgICAgICAgICAgICAgICBwb2ludHMgPSBbXTsgLy8g5Yib5bu65paw55qE54K5XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwb2ludHMucHVzaChbcGFyYW1zWzFdLCBwYXJhbXNbMl1dKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjbWQgPT09ICdaJykge1xuICAgICAgICAgICAgaWYgKHBvaW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAvLyDlrZjlnKjngrlcbiAgICAgICAgICAgICAgICBwb2x5Z29ucy5wdXNoKHBvaW50cyk7XG4gICAgICAgICAgICAgICAgcG9pbnRzID0gW107IC8vIOW8gOWni+aWsOeahOeCuembhuWQiFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8g5aaC5p6c5LiN5a2Y5Zyo54K577yM5ZCM5pe2ICdaJ++8jOWImeivtOaYjuaYr+mUmeivr++8jOS4jeWkhOeQhlxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcG9pbnRzLnB1c2goW3BhcmFtc1sxXSwgcGFyYW1zWzJdXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8g6K+05piOIHBvaW50cyDmnKrmlL7lhaUgcG9seWdvbnMg5oiW6ICFIHBvbHlsaW5lXG4gICAgLy8g5LuF5b2T5Y+q5pyJ5LiA5LiqIE3vvIzmsqHmnIkgWiDml7bkvJrlj5HnlJ/ov5nnp43mg4XlhrVcbiAgICBpZiAocG9pbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcG9seWxpbmVzLnB1c2gocG9pbnRzKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcG9seWdvbnM6IHBvbHlnb25zLFxuICAgICAgICBwb2x5bGluZXM6IHBvbHlsaW5lcyxcbiAgICB9O1xufVxuZXhwb3J0IGRlZmF1bHQgX19hc3NpZ24oeyBoYXNBcmM6IGhhc0FyYywgZXh0cmFjdFBvbHlnb25zOiBleHRyYWN0UG9seWdvbnMsIGlzUG9pbnRJblN0cm9rZTogaXNQb2ludEluU3Ryb2tlIH0sIFBhdGhVdGlsKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBhdGguanMubWFwIiwiaW1wb3J0IHsgX19hc3NpZ24sIF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgQ3ViaWMgYXMgQ3ViaWNVdGlsIH0gZnJvbSAnQGFudHYvZy1tYXRoJztcbmltcG9ydCB7IGVhY2gsIGlzTmlsIH0gZnJvbSAnQGFudHYvdXRpbCc7XG5pbXBvcnQgU2hhcGVCYXNlIGZyb20gJy4vYmFzZSc7XG5pbXBvcnQgeyBwYXRoMkFic29sdXRlLCBwYXRoMlNlZ21lbnRzIH0gZnJvbSAnQGFudHYvcGF0aC11dGlsJztcbmltcG9ydCB7IGRyYXdQYXRoIH0gZnJvbSAnLi4vdXRpbC9kcmF3JztcbmltcG9ydCBpc1BvaW50SW5QYXRoIGZyb20gJy4uL3V0aWwvaW4tcGF0aC9wb2ludC1pbi1wYXRoJztcbmltcG9ydCBpc0luUG9seWdvbiBmcm9tICcuLi91dGlsL2luLXBhdGgvcG9seWdvbic7XG5pbXBvcnQgUGF0aFV0aWwgZnJvbSAnLi4vdXRpbC9wYXRoJztcbmltcG9ydCAqIGFzIEFycm93VXRpbCBmcm9tICcuLi91dGlsL2Fycm93Jztcbi8vIOaYr+WQpuWcqOWkmuS4quWkmui+ueW9ouWGhemDqFxuZnVuY3Rpb24gaXNJblBvbHlnb25zKHBvbHlnb25zLCB4LCB5KSB7XG4gICAgdmFyIGlzSGl0ID0gZmFsc2U7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb2x5Z29ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgcG9pbnRzID0gcG9seWdvbnNbaV07XG4gICAgICAgIGlzSGl0ID0gaXNJblBvbHlnb24ocG9pbnRzLCB4LCB5KTtcbiAgICAgICAgaWYgKGlzSGl0KSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaXNIaXQ7XG59XG52YXIgUGF0aCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUGF0aCwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQYXRoKCkge1xuICAgICAgICByZXR1cm4gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgfVxuICAgIFBhdGgucHJvdG90eXBlLmdldERlZmF1bHRBdHRycyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGF0dHJzID0gX3N1cGVyLnByb3RvdHlwZS5nZXREZWZhdWx0QXR0cnMuY2FsbCh0aGlzKTtcbiAgICAgICAgcmV0dXJuIF9fYXNzaWduKF9fYXNzaWduKHt9LCBhdHRycyksIHsgc3RhcnRBcnJvdzogZmFsc2UsIGVuZEFycm93OiBmYWxzZSB9KTtcbiAgICB9O1xuICAgIFBhdGgucHJvdG90eXBlLmluaXRBdHRycyA9IGZ1bmN0aW9uIChhdHRycykge1xuICAgICAgICB0aGlzLl9zZXRQYXRoQXJyKGF0dHJzLnBhdGgpO1xuICAgICAgICB0aGlzLnNldEFycm93KCk7XG4gICAgfTtcbiAgICAvLyDmm7TmlrDlsZ7mgKfml7bvvIzmo4DmtYvmmK/lkKbmm7TmlLnkuoYgcGF0aFxuICAgIFBhdGgucHJvdG90eXBlLm9uQXR0ckNoYW5nZSA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSwgb3JpZ2luVmFsdWUpIHtcbiAgICAgICAgX3N1cGVyLnByb3RvdHlwZS5vbkF0dHJDaGFuZ2UuY2FsbCh0aGlzLCBuYW1lLCB2YWx1ZSwgb3JpZ2luVmFsdWUpO1xuICAgICAgICBpZiAobmFtZSA9PT0gJ3BhdGgnKSB7XG4gICAgICAgICAgICB0aGlzLl9zZXRQYXRoQXJyKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICAvLyDnlLHkuo7nrq3lpLTnmoTnu5jliLbkvp3otZbkuo4gbGluZSDnmoTor7jlpJogYXR0cnPvvIzlm6DmraTov5nph4zkuI3lho3lr7nmr4/kuKogYXR0ciDov5vooYzliKTmlq3vvIxhdHRyIOavj+asoeWPmOWMlumDveS8muW9seWTjeeureWktOeahOabtOaWsFxuICAgICAgICB0aGlzLnNldEFycm93KCk7XG4gICAgfTtcbiAgICAvLyDlsIYgcGF0aCDovazmjaLmiJDnu53lr7not6/lvoRcbiAgICBQYXRoLnByb3RvdHlwZS5fc2V0UGF0aEFyciA9IGZ1bmN0aW9uIChwYXRoKSB7XG4gICAgICAgIC8vIOi9rOaNoiBwYXRoIOeahOagvOW8j1xuICAgICAgICB0aGlzLmF0dHJzLnBhdGggPSBwYXRoMkFic29sdXRlKHBhdGgpO1xuICAgICAgICB2YXIgaGFzQXJjID0gUGF0aFV0aWwuaGFzQXJjKHBhdGgpO1xuICAgICAgICAvLyDkuLrkuobliqDpgJ8gcGF0aCDnmoTnu5jliLbjgIHmi77lj5blkozorqHnrpfvvIzov5nkuKrlnLDmlrnlj6/ku6XnvJPlrZjlvojlpJrkuJzopb9cbiAgICAgICAgLy8g6L+Z5Lqb57yT5a2Y6YO95piv56ys5LiA5qyh6ZyA6KaB5pe26K6h566X5ZKM5a2Y5YKo77yM6Jm954S25aKe5Yqg5LqG5aSN5p2C5bqm77yM5L2G5piv6aKR57mB6LCD55So55qE5pa55rOV77yM5oCn6IO95pyJ5b6I5aSn5o+Q5Y2HXG4gICAgICAgIHRoaXMuc2V0KCdoYXNBcmMnLCBoYXNBcmMpO1xuICAgICAgICB0aGlzLnNldCgncGFyYW1zQ2FjaGUnLCB7fSk7IC8vIOa4heeQhue8k+WtmFxuICAgICAgICB0aGlzLnNldCgnc2VnbWVudHMnLCBudWxsKTsgLy8g5bu26L+f55Sf5oiQIHBhdGjvvIzlnKjliqjnlLvlnLrmma/kuIvlj6/og73kuI3kvJrmnInmi77lj5ZcbiAgICAgICAgdGhpcy5zZXQoJ2N1cnZlJywgbnVsbCk7XG4gICAgICAgIHRoaXMuc2V0KCd0Q2FjaGUnLCBudWxsKTtcbiAgICAgICAgdGhpcy5zZXQoJ3RvdGFsTGVuZ3RoJywgbnVsbCk7XG4gICAgfTtcbiAgICBQYXRoLnByb3RvdHlwZS5nZXRTZWdtZW50cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHNlZ21lbnRzID0gdGhpcy5nZXQoJ3NlZ2VtZW50cycpO1xuICAgICAgICBpZiAoIXNlZ21lbnRzKSB7XG4gICAgICAgICAgICBzZWdtZW50cyA9IHBhdGgyU2VnbWVudHModGhpcy5hdHRyKCdwYXRoJykpO1xuICAgICAgICAgICAgdGhpcy5zZXQoJ3NlZ21lbnRzJywgc2VnbWVudHMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZWdtZW50cztcbiAgICB9O1xuICAgIFBhdGgucHJvdG90eXBlLnNldEFycm93ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYXR0cnMgPSB0aGlzLmF0dHIoKTtcbiAgICAgICAgdmFyIHN0YXJ0QXJyb3cgPSBhdHRycy5zdGFydEFycm93LCBlbmRBcnJvdyA9IGF0dHJzLmVuZEFycm93O1xuICAgICAgICBpZiAoc3RhcnRBcnJvdykge1xuICAgICAgICAgICAgdmFyIHRhbmdlbnQgPSB0aGlzLmdldFN0YXJ0VGFuZ2VudCgpO1xuICAgICAgICAgICAgQXJyb3dVdGlsLmFkZFN0YXJ0QXJyb3codGhpcywgYXR0cnMsIHRhbmdlbnRbMF1bMF0sIHRhbmdlbnRbMF1bMV0sIHRhbmdlbnRbMV1bMF0sIHRhbmdlbnRbMV1bMV0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbmRBcnJvdykge1xuICAgICAgICAgICAgdmFyIHRhbmdlbnQgPSB0aGlzLmdldEVuZFRhbmdlbnQoKTtcbiAgICAgICAgICAgIEFycm93VXRpbC5hZGRFbmRBcnJvdyh0aGlzLCBhdHRycywgdGFuZ2VudFswXVswXSwgdGFuZ2VudFswXVsxXSwgdGFuZ2VudFsxXVswXSwgdGFuZ2VudFsxXVsxXSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFBhdGgucHJvdG90eXBlLmlzSW5TdHJva2VPclBhdGggPSBmdW5jdGlvbiAoeCwgeSwgaXNTdHJva2UsIGlzRmlsbCwgbGluZVdpZHRoKSB7XG4gICAgICAgIHZhciBzZWdtZW50cyA9IHRoaXMuZ2V0U2VnbWVudHMoKTtcbiAgICAgICAgdmFyIGhhc0FyYyA9IHRoaXMuZ2V0KCdoYXNBcmMnKTtcbiAgICAgICAgdmFyIGlzSGl0ID0gZmFsc2U7XG4gICAgICAgIGlmIChpc1N0cm9rZSkge1xuICAgICAgICAgICAgdmFyIGxlbmd0aF8xID0gdGhpcy5nZXRUb3RhbExlbmd0aCgpO1xuICAgICAgICAgICAgaXNIaXQgPSBQYXRoVXRpbC5pc1BvaW50SW5TdHJva2Uoc2VnbWVudHMsIGxpbmVXaWR0aCwgeCwgeSwgbGVuZ3RoXzEpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNIaXQgJiYgaXNGaWxsKSB7XG4gICAgICAgICAgICBpZiAoaGFzQXJjKSB7XG4gICAgICAgICAgICAgICAgLy8g5a2Y5Zyo5puy57q/5pe277yM5pqC5pe25L2/55SoIGNhbnZhcyDnmoQgYXBpIOiuoeeul++8jOWQjue7reWPr+S7pei/m+ihjOWkmui+ueW9ouWIh+WJslxuICAgICAgICAgICAgICAgIGlzSGl0ID0gaXNQb2ludEluUGF0aCh0aGlzLCB4LCB5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBwYXRoID0gdGhpcy5hdHRyKCdwYXRoJyk7XG4gICAgICAgICAgICAgICAgdmFyIGV4dHJhY3RSZXN1dGwgPSBQYXRoVXRpbC5leHRyYWN0UG9seWdvbnMocGF0aCk7XG4gICAgICAgICAgICAgICAgLy8g5o+Q5Y+W5Ye65p2l55qE5aSa6L655b2i5YyF5ZCr6Zet5ZCI55qE5ZKM6Z2e6Zet5ZCI55qE77yM5Zyo6L+Z6YeM57uf5LiA5oyJ54Wn5aSa6L655b2i5aSE55CGXG4gICAgICAgICAgICAgICAgaXNIaXQgPSBpc0luUG9seWdvbnMoZXh0cmFjdFJlc3V0bC5wb2x5Z29ucywgeCwgeSkgfHwgaXNJblBvbHlnb25zKGV4dHJhY3RSZXN1dGwucG9seWxpbmVzLCB4LCB5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXNIaXQ7XG4gICAgfTtcbiAgICBQYXRoLnByb3RvdHlwZS5jcmVhdGVQYXRoID0gZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgICAgdmFyIGF0dHJzID0gdGhpcy5hdHRyKCk7XG4gICAgICAgIHZhciBwYXJhbXNDYWNoZSA9IHRoaXMuZ2V0KCdwYXJhbXNDYWNoZScpOyAvLyDnlLHkuo7orqHnrpflnIblvKfnmoTlj4LmlbDmiJDmnKzlvojlpKfvvIzmiYDku6XopoHnvJPlrZhcbiAgICAgICAgZHJhd1BhdGgodGhpcywgY29udGV4dCwgYXR0cnMsIHBhcmFtc0NhY2hlKTtcbiAgICB9O1xuICAgIFBhdGgucHJvdG90eXBlLmFmdGVyRHJhd1BhdGggPSBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgICB2YXIgc3RhcnRBcnJvd1NoYXBlID0gdGhpcy5nZXQoJ3N0YXJ0QXJyb3dTaGFwZScpO1xuICAgICAgICB2YXIgZW5kQXJyb3dTaGFwZSA9IHRoaXMuZ2V0KCdlbmRBcnJvd1NoYXBlJyk7XG4gICAgICAgIGlmIChzdGFydEFycm93U2hhcGUpIHtcbiAgICAgICAgICAgIHN0YXJ0QXJyb3dTaGFwZS5kcmF3KGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbmRBcnJvd1NoYXBlKSB7XG4gICAgICAgICAgICBlbmRBcnJvd1NoYXBlLmRyYXcoY29udGV4dCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCB0b3RhbCBsZW5ndGggb2YgcGF0aFxuICAgICAqIEByZXR1cm4ge251bWJlcn0gbGVuZ3RoXG4gICAgICovXG4gICAgUGF0aC5wcm90b3R5cGUuZ2V0VG90YWxMZW5ndGggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB0b3RhbExlbmd0aCA9IHRoaXMuZ2V0KCd0b3RhbExlbmd0aCcpO1xuICAgICAgICBpZiAoIWlzTmlsKHRvdGFsTGVuZ3RoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRvdGFsTGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2NhbGN1bGF0ZUN1cnZlKCk7XG4gICAgICAgIHRoaXMuX3NldFRjYWNoZSgpO1xuICAgICAgICByZXR1cm4gdGhpcy5nZXQoJ3RvdGFsTGVuZ3RoJyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgcG9pbnQgYWNjb3JkaW5nIHRvIHJhdGlvXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJhdGlvXG4gICAgICogQHJldHVybiB7UG9pbnR9IHBvaW50XG4gICAgICovXG4gICAgUGF0aC5wcm90b3R5cGUuZ2V0UG9pbnQgPSBmdW5jdGlvbiAocmF0aW8pIHtcbiAgICAgICAgdmFyIHRDYWNoZSA9IHRoaXMuZ2V0KCd0Q2FjaGUnKTtcbiAgICAgICAgaWYgKCF0Q2FjaGUpIHtcbiAgICAgICAgICAgIHRoaXMuX2NhbGN1bGF0ZUN1cnZlKCk7XG4gICAgICAgICAgICB0aGlzLl9zZXRUY2FjaGUoKTtcbiAgICAgICAgICAgIHRDYWNoZSA9IHRoaXMuZ2V0KCd0Q2FjaGUnKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgc3VidDtcbiAgICAgICAgdmFyIGluZGV4O1xuICAgICAgICB2YXIgY3VydmUgPSB0aGlzLmdldCgnY3VydmUnKTtcbiAgICAgICAgaWYgKCF0Q2FjaGUgfHwgdENhY2hlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgaWYgKGN1cnZlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgeDogY3VydmVbMF1bMV0sXG4gICAgICAgICAgICAgICAgICAgIHk6IGN1cnZlWzBdWzJdLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBlYWNoKHRDYWNoZSwgZnVuY3Rpb24gKHYsIGkpIHtcbiAgICAgICAgICAgIGlmIChyYXRpbyA+PSB2WzBdICYmIHJhdGlvIDw9IHZbMV0pIHtcbiAgICAgICAgICAgICAgICBzdWJ0ID0gKHJhdGlvIC0gdlswXSkgLyAodlsxXSAtIHZbMF0pO1xuICAgICAgICAgICAgICAgIGluZGV4ID0gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHZhciBzZWcgPSBjdXJ2ZVtpbmRleF07XG4gICAgICAgIGlmIChpc05pbChzZWcpIHx8IGlzTmlsKGluZGV4KSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGwgPSBzZWcubGVuZ3RoO1xuICAgICAgICB2YXIgbmV4dFNlZyA9IGN1cnZlW2luZGV4ICsgMV07XG4gICAgICAgIHJldHVybiBDdWJpY1V0aWwucG9pbnRBdChzZWdbbCAtIDJdLCBzZWdbbCAtIDFdLCBuZXh0U2VnWzFdLCBuZXh0U2VnWzJdLCBuZXh0U2VnWzNdLCBuZXh0U2VnWzRdLCBuZXh0U2VnWzVdLCBuZXh0U2VnWzZdLCBzdWJ0KTtcbiAgICB9O1xuICAgIFBhdGgucHJvdG90eXBlLl9jYWxjdWxhdGVDdXJ2ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHBhdGggPSB0aGlzLmF0dHIoKS5wYXRoO1xuICAgICAgICB0aGlzLnNldCgnY3VydmUnLCBQYXRoVXRpbC5wYXRoVG9DdXJ2ZShwYXRoKSk7XG4gICAgfTtcbiAgICBQYXRoLnByb3RvdHlwZS5fc2V0VGNhY2hlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdG90YWxMZW5ndGggPSAwO1xuICAgICAgICB2YXIgdGVtcExlbmd0aCA9IDA7XG4gICAgICAgIC8vIOavj+autSBjdXJ2ZSDlr7nlupTotbfmraLngrnnmoTplb/luqbmr5TkvovliJfooajvvIzlvaLlpoI6IFtbMCwgMC4yNV0sIFswLjI1LCAwLjZdLiBbMC42LCAwLjldLCBbMC45LCAxXV1cbiAgICAgICAgdmFyIHRDYWNoZSA9IFtdO1xuICAgICAgICB2YXIgc2VnbWVudFQ7XG4gICAgICAgIHZhciBzZWdtZW50TDtcbiAgICAgICAgdmFyIHNlZ21lbnROO1xuICAgICAgICB2YXIgbDtcbiAgICAgICAgdmFyIGN1cnZlID0gdGhpcy5nZXQoJ2N1cnZlJyk7XG4gICAgICAgIGlmICghY3VydmUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBlYWNoKGN1cnZlLCBmdW5jdGlvbiAoc2VnbWVudCwgaSkge1xuICAgICAgICAgICAgc2VnbWVudE4gPSBjdXJ2ZVtpICsgMV07XG4gICAgICAgICAgICBsID0gc2VnbWVudC5sZW5ndGg7XG4gICAgICAgICAgICBpZiAoc2VnbWVudE4pIHtcbiAgICAgICAgICAgICAgICB0b3RhbExlbmd0aCArPVxuICAgICAgICAgICAgICAgICAgICBDdWJpY1V0aWwubGVuZ3RoKHNlZ21lbnRbbCAtIDJdLCBzZWdtZW50W2wgLSAxXSwgc2VnbWVudE5bMV0sIHNlZ21lbnROWzJdLCBzZWdtZW50TlszXSwgc2VnbWVudE5bNF0sIHNlZ21lbnROWzVdLCBzZWdtZW50Tls2XSkgfHwgMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuc2V0KCd0b3RhbExlbmd0aCcsIHRvdGFsTGVuZ3RoKTtcbiAgICAgICAgaWYgKHRvdGFsTGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnNldCgndENhY2hlJywgW10pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGVhY2goY3VydmUsIGZ1bmN0aW9uIChzZWdtZW50LCBpKSB7XG4gICAgICAgICAgICBzZWdtZW50TiA9IGN1cnZlW2kgKyAxXTtcbiAgICAgICAgICAgIGwgPSBzZWdtZW50Lmxlbmd0aDtcbiAgICAgICAgICAgIGlmIChzZWdtZW50Tikge1xuICAgICAgICAgICAgICAgIHNlZ21lbnRUID0gW107XG4gICAgICAgICAgICAgICAgc2VnbWVudFRbMF0gPSB0ZW1wTGVuZ3RoIC8gdG90YWxMZW5ndGg7XG4gICAgICAgICAgICAgICAgc2VnbWVudEwgPSBDdWJpY1V0aWwubGVuZ3RoKHNlZ21lbnRbbCAtIDJdLCBzZWdtZW50W2wgLSAxXSwgc2VnbWVudE5bMV0sIHNlZ21lbnROWzJdLCBzZWdtZW50TlszXSwgc2VnbWVudE5bNF0sIHNlZ21lbnROWzVdLCBzZWdtZW50Tls2XSk7XG4gICAgICAgICAgICAgICAgLy8g5b2TIHBhdGgg5LiN6L+e57ut5pe277yMc2VnbWVudEwg5Y+v6IO95Li656m677yM5Li656m65pe26ZyA6KaB5L2c5Li6IDAg5aSE55CGXG4gICAgICAgICAgICAgICAgdGVtcExlbmd0aCArPSBzZWdtZW50TCB8fCAwO1xuICAgICAgICAgICAgICAgIHNlZ21lbnRUWzFdID0gdGVtcExlbmd0aCAvIHRvdGFsTGVuZ3RoO1xuICAgICAgICAgICAgICAgIHRDYWNoZS5wdXNoKHNlZ21lbnRUKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuc2V0KCd0Q2FjaGUnLCB0Q2FjaGUpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0IHN0YXJ0IHRhbmdlbnQgdmVjdG9yXG4gICAgICogQHJldHVybiB7QXJyYXl9XG4gICAgICovXG4gICAgUGF0aC5wcm90b3R5cGUuZ2V0U3RhcnRUYW5nZW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgc2VnbWVudHMgPSB0aGlzLmdldFNlZ21lbnRzKCk7XG4gICAgICAgIHZhciByZXN1bHQ7XG4gICAgICAgIGlmIChzZWdtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICB2YXIgc3RhcnRQb2ludCA9IHNlZ21lbnRzWzBdLmN1cnJlbnRQb2ludDtcbiAgICAgICAgICAgIHZhciBlbmRQb2ludCA9IHNlZ21lbnRzWzFdLmN1cnJlbnRQb2ludDtcbiAgICAgICAgICAgIHZhciB0YW5nZW50ID0gc2VnbWVudHNbMV0uc3RhcnRUYW5nZW50O1xuICAgICAgICAgICAgcmVzdWx0ID0gW107XG4gICAgICAgICAgICBpZiAodGFuZ2VudCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKFtzdGFydFBvaW50WzBdIC0gdGFuZ2VudFswXSwgc3RhcnRQb2ludFsxXSAtIHRhbmdlbnRbMV1dKTtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChbc3RhcnRQb2ludFswXSwgc3RhcnRQb2ludFsxXV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goW2VuZFBvaW50WzBdLCBlbmRQb2ludFsxXV0pO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKFtzdGFydFBvaW50WzBdLCBzdGFydFBvaW50WzFdXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCBlbmQgdGFuZ2VudCB2ZWN0b3JcbiAgICAgKiBAcmV0dXJuIHtBcnJheX1cbiAgICAgKi9cbiAgICBQYXRoLnByb3RvdHlwZS5nZXRFbmRUYW5nZW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgc2VnbWVudHMgPSB0aGlzLmdldFNlZ21lbnRzKCk7XG4gICAgICAgIHZhciBsZW5ndGggPSBzZWdtZW50cy5sZW5ndGg7XG4gICAgICAgIHZhciByZXN1bHQ7XG4gICAgICAgIGlmIChsZW5ndGggPiAxKSB7XG4gICAgICAgICAgICB2YXIgc3RhcnRQb2ludCA9IHNlZ21lbnRzW2xlbmd0aCAtIDJdLmN1cnJlbnRQb2ludDtcbiAgICAgICAgICAgIHZhciBlbmRQb2ludCA9IHNlZ21lbnRzW2xlbmd0aCAtIDFdLmN1cnJlbnRQb2ludDtcbiAgICAgICAgICAgIHZhciB0YW5nZW50ID0gc2VnbWVudHNbbGVuZ3RoIC0gMV0uZW5kVGFuZ2VudDtcbiAgICAgICAgICAgIHJlc3VsdCA9IFtdO1xuICAgICAgICAgICAgaWYgKHRhbmdlbnQpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChbZW5kUG9pbnRbMF0gLSB0YW5nZW50WzBdLCBlbmRQb2ludFsxXSAtIHRhbmdlbnRbMV1dKTtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChbZW5kUG9pbnRbMF0sIGVuZFBvaW50WzFdXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChbc3RhcnRQb2ludFswXSwgc3RhcnRQb2ludFsxXV0pO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKFtlbmRQb2ludFswXSwgZW5kUG9pbnRbMV1dKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gICAgcmV0dXJuIFBhdGg7XG59KFNoYXBlQmFzZSkpO1xuZXhwb3J0IGRlZmF1bHQgUGF0aDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBhdGguanMubWFwIiwiaW1wb3J0IGluTGluZSBmcm9tICcuL2xpbmUnO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaW5Qb2x5bGluZShwb2ludHMsIGxpbmVXaWR0aCwgeCwgeSwgaXNDbG9zZSkge1xuICAgIHZhciBjb3VudCA9IHBvaW50cy5sZW5ndGg7XG4gICAgaWYgKGNvdW50IDwgMikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY291bnQgLSAxOyBpKyspIHtcbiAgICAgICAgdmFyIHgxID0gcG9pbnRzW2ldWzBdO1xuICAgICAgICB2YXIgeTEgPSBwb2ludHNbaV1bMV07XG4gICAgICAgIHZhciB4MiA9IHBvaW50c1tpICsgMV1bMF07XG4gICAgICAgIHZhciB5MiA9IHBvaW50c1tpICsgMV1bMV07XG4gICAgICAgIGlmIChpbkxpbmUoeDEsIHkxLCB4MiwgeTIsIGxpbmVXaWR0aCwgeCwgeSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIOWmguaenOWwgemXre+8jOWImeiuoeeul+i1t+Wni+eCueWSjOe7k+adn+eCueeahOi+uVxuICAgIGlmIChpc0Nsb3NlKSB7XG4gICAgICAgIHZhciBmaXJzdCA9IHBvaW50c1swXTtcbiAgICAgICAgdmFyIGxhc3QgPSBwb2ludHNbY291bnQgLSAxXTtcbiAgICAgICAgaWYgKGluTGluZShmaXJzdFswXSwgZmlyc3RbMV0sIGxhc3RbMF0sIGxhc3RbMV0sIGxpbmVXaWR0aCwgeCwgeSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBvbHlsaW5lLmpzLm1hcCIsIi8qKlxuICogQGZpbGVvdmVydmlldyDlpJrovrnlvaJcbiAqIEBhdXRob3IgZHhxNjEzQGdtYWlsLmNvbVxuICovXG5pbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBTaGFwZUJhc2UgZnJvbSAnLi9iYXNlJztcbmltcG9ydCBpblBvbHlsaW5lIGZyb20gJy4uL3V0aWwvaW4tc3Ryb2tlL3BvbHlsaW5lJztcbmltcG9ydCBpc0luUG9seWdvbiBmcm9tICcuLi91dGlsL2luLXBhdGgvcG9seWdvbic7XG52YXIgUG9seWdvbiA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUG9seWdvbiwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQb2x5Z29uKCkge1xuICAgICAgICByZXR1cm4gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgfVxuICAgIFBvbHlnb24ucHJvdG90eXBlLmlzSW5TdHJva2VPclBhdGggPSBmdW5jdGlvbiAoeCwgeSwgaXNTdHJva2UsIGlzRmlsbCwgbGluZVdpZHRoKSB7XG4gICAgICAgIHZhciBwb2ludHMgPSB0aGlzLmF0dHIoKS5wb2ludHM7XG4gICAgICAgIHZhciBpc0hpdCA9IGZhbHNlO1xuICAgICAgICBpZiAoaXNTdHJva2UpIHtcbiAgICAgICAgICAgIGlzSGl0ID0gaW5Qb2x5bGluZShwb2ludHMsIGxpbmVXaWR0aCwgeCwgeSwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc0hpdCAmJiBpc0ZpbGwpIHtcbiAgICAgICAgICAgIGlzSGl0ID0gaXNJblBvbHlnb24ocG9pbnRzLCB4LCB5KTsgLy8gaXNQb2ludEluUGF0aChzaGFwZSwgeCwgeSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlzSGl0O1xuICAgIH07XG4gICAgUG9seWdvbi5wcm90b3R5cGUuY3JlYXRlUGF0aCA9IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICAgIHZhciBhdHRycyA9IHRoaXMuYXR0cigpO1xuICAgICAgICB2YXIgcG9pbnRzID0gYXR0cnMucG9pbnRzO1xuICAgICAgICBpZiAocG9pbnRzLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb250ZXh0LmJlZ2luUGF0aCgpO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIHBvaW50ID0gcG9pbnRzW2ldO1xuICAgICAgICAgICAgaWYgKGkgPT09IDApIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0Lm1vdmVUbyhwb2ludFswXSwgcG9pbnRbMV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29udGV4dC5saW5lVG8ocG9pbnRbMF0sIHBvaW50WzFdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb250ZXh0LmNsb3NlUGF0aCgpO1xuICAgIH07XG4gICAgcmV0dXJuIFBvbHlnb247XG59KFNoYXBlQmFzZSkpO1xuZXhwb3J0IGRlZmF1bHQgUG9seWdvbjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBvbHlnb24uanMubWFwIiwiaW1wb3J0IHsgX19hc3NpZ24sIF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgTGluZSBhcyBMaW5lVXRpbCB9IGZyb20gJ0BhbnR2L2ctbWF0aCc7XG5pbXBvcnQgeyBQb2x5bGluZSBhcyBQb2x5bGluZVV0aWwgfSBmcm9tICdAYW50di9nLW1hdGgnO1xuaW1wb3J0IHsgZWFjaCwgaXNOaWwgfSBmcm9tICdAYW50di91dGlsJztcbmltcG9ydCBTaGFwZUJhc2UgZnJvbSAnLi9iYXNlJztcbmltcG9ydCBpblBvbHlsaW5lIGZyb20gJy4uL3V0aWwvaW4tc3Ryb2tlL3BvbHlsaW5lJztcbmltcG9ydCAqIGFzIEFycm93VXRpbCBmcm9tICcuLi91dGlsL2Fycm93JztcbnZhciBQb2x5TGluZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUG9seUxpbmUsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUG9seUxpbmUoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICB9XG4gICAgUG9seUxpbmUucHJvdG90eXBlLmdldERlZmF1bHRBdHRycyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGF0dHJzID0gX3N1cGVyLnByb3RvdHlwZS5nZXREZWZhdWx0QXR0cnMuY2FsbCh0aGlzKTtcbiAgICAgICAgcmV0dXJuIF9fYXNzaWduKF9fYXNzaWduKHt9LCBhdHRycyksIHsgc3RhcnRBcnJvdzogZmFsc2UsIGVuZEFycm93OiBmYWxzZSB9KTtcbiAgICB9O1xuICAgIFBvbHlMaW5lLnByb3RvdHlwZS5pbml0QXR0cnMgPSBmdW5jdGlvbiAoYXR0cnMpIHtcbiAgICAgICAgdGhpcy5zZXRBcnJvdygpO1xuICAgIH07XG4gICAgLy8g5pu05paw5bGe5oCn5pe277yM5qOA5rWL5piv5ZCm5pu05pS55LqGIHBvaW50c1xuICAgIFBvbHlMaW5lLnByb3RvdHlwZS5vbkF0dHJDaGFuZ2UgPSBmdW5jdGlvbiAobmFtZSwgdmFsdWUsIG9yaWdpblZhbHVlKSB7XG4gICAgICAgIF9zdXBlci5wcm90b3R5cGUub25BdHRyQ2hhbmdlLmNhbGwodGhpcywgbmFtZSwgdmFsdWUsIG9yaWdpblZhbHVlKTtcbiAgICAgICAgdGhpcy5zZXRBcnJvdygpO1xuICAgICAgICBpZiAoWydwb2ludHMnXS5pbmRleE9mKG5hbWUpICE9PSAtMSkge1xuICAgICAgICAgICAgdGhpcy5fcmVzZXRDYWNoZSgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBQb2x5TGluZS5wcm90b3R5cGUuX3Jlc2V0Q2FjaGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuc2V0KCd0b3RhbExlbmd0aCcsIG51bGwpO1xuICAgICAgICB0aGlzLnNldCgndENhY2hlJywgbnVsbCk7XG4gICAgfTtcbiAgICBQb2x5TGluZS5wcm90b3R5cGUuc2V0QXJyb3cgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBhdHRycyA9IHRoaXMuYXR0cigpO1xuICAgICAgICB2YXIgX2EgPSB0aGlzLmF0dHJzLCBwb2ludHMgPSBfYS5wb2ludHMsIHN0YXJ0QXJyb3cgPSBfYS5zdGFydEFycm93LCBlbmRBcnJvdyA9IF9hLmVuZEFycm93O1xuICAgICAgICB2YXIgbGVuZ3RoID0gcG9pbnRzLmxlbmd0aDtcbiAgICAgICAgdmFyIHgxID0gcG9pbnRzWzBdWzBdO1xuICAgICAgICB2YXIgeTEgPSBwb2ludHNbMF1bMV07XG4gICAgICAgIHZhciB4MiA9IHBvaW50c1tsZW5ndGggLSAxXVswXTtcbiAgICAgICAgdmFyIHkyID0gcG9pbnRzW2xlbmd0aCAtIDFdWzFdO1xuICAgICAgICBpZiAoc3RhcnRBcnJvdykge1xuICAgICAgICAgICAgQXJyb3dVdGlsLmFkZFN0YXJ0QXJyb3codGhpcywgYXR0cnMsIHBvaW50c1sxXVswXSwgcG9pbnRzWzFdWzFdLCB4MSwgeTEpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbmRBcnJvdykge1xuICAgICAgICAgICAgQXJyb3dVdGlsLmFkZEVuZEFycm93KHRoaXMsIGF0dHJzLCBwb2ludHNbbGVuZ3RoIC0gMl1bMF0sIHBvaW50c1tsZW5ndGggLSAyXVsxXSwgeDIsIHkyKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLy8g5LiN5YWB6K64IGZpbGxcbiAgICBQb2x5TGluZS5wcm90b3R5cGUuaXNGaWxsID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcbiAgICBQb2x5TGluZS5wcm90b3R5cGUuaXNJblN0cm9rZU9yUGF0aCA9IGZ1bmN0aW9uICh4LCB5LCBpc1N0cm9rZSwgaXNGaWxsLCBsaW5lV2lkdGgpIHtcbiAgICAgICAgLy8g5rKh5pyJ6K6+572uIHN0cm9rZSDkuI3og73ooqvmi77lj5YsIOayoeaciee6v+WuveS4jeiDveiiq+aLvuWPllxuICAgICAgICBpZiAoIWlzU3Ryb2tlIHx8ICFsaW5lV2lkdGgpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcG9pbnRzID0gdGhpcy5hdHRyKCkucG9pbnRzO1xuICAgICAgICByZXR1cm4gaW5Qb2x5bGluZShwb2ludHMsIGxpbmVXaWR0aCwgeCwgeSwgZmFsc2UpO1xuICAgIH07XG4gICAgLy8g5aeL57uI5aGr5YWFXG4gICAgUG9seUxpbmUucHJvdG90eXBlLmlzU3Ryb2tlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuICAgIFBvbHlMaW5lLnByb3RvdHlwZS5jcmVhdGVQYXRoID0gZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgICAgdmFyIF9hID0gdGhpcy5hdHRyKCksIHBvaW50cyA9IF9hLnBvaW50cywgc3RhcnRBcnJvdyA9IF9hLnN0YXJ0QXJyb3csIGVuZEFycm93ID0gX2EuZW5kQXJyb3c7XG4gICAgICAgIHZhciBsZW5ndGggPSBwb2ludHMubGVuZ3RoO1xuICAgICAgICBpZiAocG9pbnRzLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgeDEgPSBwb2ludHNbMF1bMF07XG4gICAgICAgIHZhciB5MSA9IHBvaW50c1swXVsxXTtcbiAgICAgICAgdmFyIHgyID0gcG9pbnRzW2xlbmd0aCAtIDFdWzBdO1xuICAgICAgICB2YXIgeTIgPSBwb2ludHNbbGVuZ3RoIC0gMV1bMV07XG4gICAgICAgIC8vIOWmguaenOWumuS5ieS6hueureWktO+8jOW5tuS4lOaYr+iHquWumuS5ieeureWktO+8jOe6v+adoeebuOW6lOe8qei/m1xuICAgICAgICBpZiAoc3RhcnRBcnJvdyAmJiBzdGFydEFycm93LmQpIHtcbiAgICAgICAgICAgIHZhciBkaXN0YW5jZSA9IEFycm93VXRpbC5nZXRTaG9ydGVuT2Zmc2V0KHgxLCB5MSwgcG9pbnRzWzFdWzBdLCBwb2ludHNbMV1bMV0sIHN0YXJ0QXJyb3cuZCk7XG4gICAgICAgICAgICB4MSArPSBkaXN0YW5jZS5keDtcbiAgICAgICAgICAgIHkxICs9IGRpc3RhbmNlLmR5O1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbmRBcnJvdyAmJiBlbmRBcnJvdy5kKSB7XG4gICAgICAgICAgICB2YXIgZGlzdGFuY2UgPSBBcnJvd1V0aWwuZ2V0U2hvcnRlbk9mZnNldChwb2ludHNbbGVuZ3RoIC0gMl1bMF0sIHBvaW50c1tsZW5ndGggLSAyXVsxXSwgeDIsIHkyLCBlbmRBcnJvdy5kKTtcbiAgICAgICAgICAgIHgyIC09IGRpc3RhbmNlLmR4O1xuICAgICAgICAgICAgeTIgLT0gZGlzdGFuY2UuZHk7XG4gICAgICAgIH1cbiAgICAgICAgY29udGV4dC5iZWdpblBhdGgoKTtcbiAgICAgICAgY29udGV4dC5tb3ZlVG8oeDEsIHkxKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBwb2ludCA9IHBvaW50c1tpXTtcbiAgICAgICAgICAgIGNvbnRleHQubGluZVRvKHBvaW50WzBdLCBwb2ludFsxXSk7XG4gICAgICAgIH1cbiAgICAgICAgY29udGV4dC5saW5lVG8oeDIsIHkyKTtcbiAgICB9O1xuICAgIFBvbHlMaW5lLnByb3RvdHlwZS5hZnRlckRyYXdQYXRoID0gZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgICAgdmFyIHN0YXJ0QXJyb3dTaGFwZSA9IHRoaXMuZ2V0KCdzdGFydEFycm93U2hhcGUnKTtcbiAgICAgICAgdmFyIGVuZEFycm93U2hhcGUgPSB0aGlzLmdldCgnZW5kQXJyb3dTaGFwZScpO1xuICAgICAgICBpZiAoc3RhcnRBcnJvd1NoYXBlKSB7XG4gICAgICAgICAgICBzdGFydEFycm93U2hhcGUuZHJhdyhjb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZW5kQXJyb3dTaGFwZSkge1xuICAgICAgICAgICAgZW5kQXJyb3dTaGFwZS5kcmF3KGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgbGVuZ3RoIG9mIHBvbHlsaW5lXG4gICAgICogQHJldHVybiB7bnVtYmVyfSBsZW5ndGhcbiAgICAgKi9cbiAgICBQb2x5TGluZS5wcm90b3R5cGUuZ2V0VG90YWxMZW5ndGggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBwb2ludHMgPSB0aGlzLmF0dHIoKS5wb2ludHM7XG4gICAgICAgIC8vIGdldCB0b3RhbExlbmd0aCBmcm9tIGNhY2hlXG4gICAgICAgIHZhciB0b3RhbExlbmd0aCA9IHRoaXMuZ2V0KCd0b3RhbExlbmd0aCcpO1xuICAgICAgICBpZiAoIWlzTmlsKHRvdGFsTGVuZ3RoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRvdGFsTGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0KCd0b3RhbExlbmd0aCcsIFBvbHlsaW5lVXRpbC5sZW5ndGgocG9pbnRzKSk7XG4gICAgICAgIHJldHVybiB0aGlzLmdldCgndG90YWxMZW5ndGgnKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCBwb2ludCBhY2NvcmRpbmcgdG8gcmF0aW9cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmF0aW9cbiAgICAgKiBAcmV0dXJuIHtQb2ludH0gcG9pbnRcbiAgICAgKi9cbiAgICBQb2x5TGluZS5wcm90b3R5cGUuZ2V0UG9pbnQgPSBmdW5jdGlvbiAocmF0aW8pIHtcbiAgICAgICAgdmFyIHBvaW50cyA9IHRoaXMuYXR0cigpLnBvaW50cztcbiAgICAgICAgLy8gZ2V0IHRDYWNoZSBmcm9tIGNhY2hlXG4gICAgICAgIHZhciB0Q2FjaGUgPSB0aGlzLmdldCgndENhY2hlJyk7XG4gICAgICAgIGlmICghdENhY2hlKSB7XG4gICAgICAgICAgICB0aGlzLl9zZXRUY2FjaGUoKTtcbiAgICAgICAgICAgIHRDYWNoZSA9IHRoaXMuZ2V0KCd0Q2FjaGUnKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgc3VidDtcbiAgICAgICAgdmFyIGluZGV4O1xuICAgICAgICBlYWNoKHRDYWNoZSwgZnVuY3Rpb24gKHYsIGkpIHtcbiAgICAgICAgICAgIGlmIChyYXRpbyA+PSB2WzBdICYmIHJhdGlvIDw9IHZbMV0pIHtcbiAgICAgICAgICAgICAgICBzdWJ0ID0gKHJhdGlvIC0gdlswXSkgLyAodlsxXSAtIHZbMF0pO1xuICAgICAgICAgICAgICAgIGluZGV4ID0gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBMaW5lVXRpbC5wb2ludEF0KHBvaW50c1tpbmRleF1bMF0sIHBvaW50c1tpbmRleF1bMV0sIHBvaW50c1tpbmRleCArIDFdWzBdLCBwb2ludHNbaW5kZXggKyAxXVsxXSwgc3VidCk7XG4gICAgfTtcbiAgICBQb2x5TGluZS5wcm90b3R5cGUuX3NldFRjYWNoZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHBvaW50cyA9IHRoaXMuYXR0cigpLnBvaW50cztcbiAgICAgICAgaWYgKCFwb2ludHMgfHwgcG9pbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciB0b3RhbExlbmd0aCA9IHRoaXMuZ2V0VG90YWxMZW5ndGgoKTtcbiAgICAgICAgaWYgKHRvdGFsTGVuZ3RoIDw9IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdGVtcExlbmd0aCA9IDA7XG4gICAgICAgIHZhciB0Q2FjaGUgPSBbXTtcbiAgICAgICAgdmFyIHNlZ21lbnRUO1xuICAgICAgICB2YXIgc2VnbWVudEw7XG4gICAgICAgIGVhY2gocG9pbnRzLCBmdW5jdGlvbiAocCwgaSkge1xuICAgICAgICAgICAgaWYgKHBvaW50c1tpICsgMV0pIHtcbiAgICAgICAgICAgICAgICBzZWdtZW50VCA9IFtdO1xuICAgICAgICAgICAgICAgIHNlZ21lbnRUWzBdID0gdGVtcExlbmd0aCAvIHRvdGFsTGVuZ3RoO1xuICAgICAgICAgICAgICAgIHNlZ21lbnRMID0gTGluZVV0aWwubGVuZ3RoKHBbMF0sIHBbMV0sIHBvaW50c1tpICsgMV1bMF0sIHBvaW50c1tpICsgMV1bMV0pO1xuICAgICAgICAgICAgICAgIHRlbXBMZW5ndGggKz0gc2VnbWVudEw7XG4gICAgICAgICAgICAgICAgc2VnbWVudFRbMV0gPSB0ZW1wTGVuZ3RoIC8gdG90YWxMZW5ndGg7XG4gICAgICAgICAgICAgICAgdENhY2hlLnB1c2goc2VnbWVudFQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5zZXQoJ3RDYWNoZScsIHRDYWNoZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgc3RhcnQgdGFuZ2VudCB2ZWN0b3JcbiAgICAgKiBAcmV0dXJuIHtBcnJheX1cbiAgICAgKi9cbiAgICBQb2x5TGluZS5wcm90b3R5cGUuZ2V0U3RhcnRUYW5nZW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgcG9pbnRzID0gdGhpcy5hdHRyKCkucG9pbnRzO1xuICAgICAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgICAgIHJlc3VsdC5wdXNoKFtwb2ludHNbMV1bMF0sIHBvaW50c1sxXVsxXV0pO1xuICAgICAgICByZXN1bHQucHVzaChbcG9pbnRzWzBdWzBdLCBwb2ludHNbMF1bMV1dKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCBlbmQgdGFuZ2VudCB2ZWN0b3JcbiAgICAgKiBAcmV0dXJuIHtBcnJheX1cbiAgICAgKi9cbiAgICBQb2x5TGluZS5wcm90b3R5cGUuZ2V0RW5kVGFuZ2VudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHBvaW50cyA9IHRoaXMuYXR0cigpLnBvaW50cztcbiAgICAgICAgdmFyIGwgPSBwb2ludHMubGVuZ3RoIC0gMTtcbiAgICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgICByZXN1bHQucHVzaChbcG9pbnRzW2wgLSAxXVswXSwgcG9pbnRzW2wgLSAxXVsxXV0pO1xuICAgICAgICByZXN1bHQucHVzaChbcG9pbnRzW2xdWzBdLCBwb2ludHNbbF1bMV1dKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuICAgIHJldHVybiBQb2x5TGluZTtcbn0oU2hhcGVCYXNlKSk7XG5leHBvcnQgZGVmYXVsdCBQb2x5TGluZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBvbHlsaW5lLmpzLm1hcCIsImltcG9ydCB7IGluQm94IH0gZnJvbSAnLi4vdXRpbCc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpblJlY3QobWluWCwgbWluWSwgd2lkdGgsIGhlaWdodCwgbGluZVdpZHRoLCB4LCB5KSB7XG4gICAgdmFyIGhhbGZXaWR0aCA9IGxpbmVXaWR0aCAvIDI7XG4gICAgLy8g5bCG5Zub5Liq6L6555yL5YGa55+p5b2i5p2l5qOA5rWL77yM5q+U6L6555qE5qOA5rWL566X5rOV6KaB5b+rXG4gICAgcmV0dXJuIChpbkJveChtaW5YIC0gaGFsZldpZHRoLCBtaW5ZIC0gaGFsZldpZHRoLCB3aWR0aCwgbGluZVdpZHRoLCB4LCB5KSB8fCAvLyDkuIrovrlcbiAgICAgICAgaW5Cb3gobWluWCArIHdpZHRoIC0gaGFsZldpZHRoLCBtaW5ZIC0gaGFsZldpZHRoLCBsaW5lV2lkdGgsIGhlaWdodCwgeCwgeSkgfHwgLy8g5Y+z6L65XG4gICAgICAgIGluQm94KG1pblggKyBoYWxmV2lkdGgsIG1pblkgKyBoZWlnaHQgLSBoYWxmV2lkdGgsIHdpZHRoLCBsaW5lV2lkdGgsIHgsIHkpIHx8IC8vIOS4i+i+uVxuICAgICAgICBpbkJveChtaW5YIC0gaGFsZldpZHRoLCBtaW5ZICsgaGFsZldpZHRoLCBsaW5lV2lkdGgsIGhlaWdodCwgeCwgeSkpOyAvLyDlt6bovrlcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJlY3QuanMubWFwIiwiaW1wb3J0IGluTGluZSBmcm9tICcuL2xpbmUnO1xuaW1wb3J0IGluQXJjIGZyb20gJy4vYXJjJztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJlY3RXaXRoUmFkaXVzKG1pblgsIG1pblksIHdpZHRoLCBoZWlnaHQsIHJhZGl1cywgbGluZVdpZHRoLCB4LCB5KSB7XG4gICAgdmFyIGhhbGZXaWR0aCA9IGxpbmVXaWR0aCAvIDI7XG4gICAgcmV0dXJuIChpbkxpbmUobWluWCArIHJhZGl1cywgbWluWSwgbWluWCArIHdpZHRoIC0gcmFkaXVzLCBtaW5ZLCBsaW5lV2lkdGgsIHgsIHkpIHx8XG4gICAgICAgIGluTGluZShtaW5YICsgd2lkdGgsIG1pblkgKyByYWRpdXMsIG1pblggKyB3aWR0aCwgbWluWSArIGhlaWdodCAtIHJhZGl1cywgbGluZVdpZHRoLCB4LCB5KSB8fFxuICAgICAgICBpbkxpbmUobWluWCArIHdpZHRoIC0gcmFkaXVzLCBtaW5ZICsgaGVpZ2h0LCBtaW5YICsgcmFkaXVzLCBtaW5ZICsgaGVpZ2h0LCBsaW5lV2lkdGgsIHgsIHkpIHx8XG4gICAgICAgIGluTGluZShtaW5YLCBtaW5ZICsgaGVpZ2h0IC0gcmFkaXVzLCBtaW5YLCBtaW5ZICsgcmFkaXVzLCBsaW5lV2lkdGgsIHgsIHkpIHx8XG4gICAgICAgIGluQXJjKG1pblggKyB3aWR0aCAtIHJhZGl1cywgbWluWSArIHJhZGl1cywgcmFkaXVzLCAxLjUgKiBNYXRoLlBJLCAyICogTWF0aC5QSSwgbGluZVdpZHRoLCB4LCB5KSB8fFxuICAgICAgICBpbkFyYyhtaW5YICsgd2lkdGggLSByYWRpdXMsIG1pblkgKyBoZWlnaHQgLSByYWRpdXMsIHJhZGl1cywgMCwgMC41ICogTWF0aC5QSSwgbGluZVdpZHRoLCB4LCB5KSB8fFxuICAgICAgICBpbkFyYyhtaW5YICsgcmFkaXVzLCBtaW5ZICsgaGVpZ2h0IC0gcmFkaXVzLCByYWRpdXMsIDAuNSAqIE1hdGguUEksIE1hdGguUEksIGxpbmVXaWR0aCwgeCwgeSkgfHxcbiAgICAgICAgaW5BcmMobWluWCArIHJhZGl1cywgbWluWSArIHJhZGl1cywgcmFkaXVzLCBNYXRoLlBJLCAxLjUgKiBNYXRoLlBJLCBsaW5lV2lkdGgsIHgsIHkpKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJlY3QtcmFkaXVzLmpzLm1hcCIsIi8qKlxuICogQGZpbGVvdmVydmlldyDnn6nlvaJcbiAqIEBhdXRob3IgZHhxNjEzQGdtYWlsLmNvbVxuICovXG5pbXBvcnQgeyBfX2Fzc2lnbiwgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgU2hhcGVCYXNlIGZyb20gJy4vYmFzZSc7XG5pbXBvcnQgeyBwYXJzZVJhZGl1cyB9IGZyb20gJy4uL3V0aWwvcGFyc2UnO1xuaW1wb3J0IHsgaW5Cb3ggfSBmcm9tICcuLi91dGlsL3V0aWwnO1xuaW1wb3J0IGluUmVjdCBmcm9tICcuLi91dGlsL2luLXN0cm9rZS9yZWN0JztcbmltcG9ydCBpblJlY3RXaXRoUmFkaXVzIGZyb20gJy4uL3V0aWwvaW4tc3Ryb2tlL3JlY3QtcmFkaXVzJztcbmltcG9ydCBpc1BvaW50SW5QYXRoIGZyb20gJy4uL3V0aWwvaW4tcGF0aC9wb2ludC1pbi1wYXRoJztcbnZhciBSZWN0ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhSZWN0LCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFJlY3QoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICB9XG4gICAgUmVjdC5wcm90b3R5cGUuZ2V0RGVmYXVsdEF0dHJzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYXR0cnMgPSBfc3VwZXIucHJvdG90eXBlLmdldERlZmF1bHRBdHRycy5jYWxsKHRoaXMpO1xuICAgICAgICByZXR1cm4gX19hc3NpZ24oX19hc3NpZ24oe30sIGF0dHJzKSwgeyB4OiAwLCB5OiAwLCB3aWR0aDogMCwgaGVpZ2h0OiAwLCByYWRpdXM6IDAgfSk7XG4gICAgfTtcbiAgICBSZWN0LnByb3RvdHlwZS5pc0luU3Ryb2tlT3JQYXRoID0gZnVuY3Rpb24gKHgsIHksIGlzU3Ryb2tlLCBpc0ZpbGwsIGxpbmVXaWR0aCkge1xuICAgICAgICB2YXIgYXR0cnMgPSB0aGlzLmF0dHIoKTtcbiAgICAgICAgdmFyIG1pblggPSBhdHRycy54O1xuICAgICAgICB2YXIgbWluWSA9IGF0dHJzLnk7XG4gICAgICAgIHZhciB3aWR0aCA9IGF0dHJzLndpZHRoO1xuICAgICAgICB2YXIgaGVpZ2h0ID0gYXR0cnMuaGVpZ2h0O1xuICAgICAgICB2YXIgcmFkaXVzID0gYXR0cnMucmFkaXVzO1xuICAgICAgICAvLyDml6DlnIbop5Lml7bnmoTnrZbnlaVcbiAgICAgICAgaWYgKCFyYWRpdXMpIHtcbiAgICAgICAgICAgIHZhciBoYWxmV2lkdGggPSBsaW5lV2lkdGggLyAyO1xuICAgICAgICAgICAgLy8g5ZCM5pe25aGr5YWF5ZKM5bim5pyJ6L655qGGXG4gICAgICAgICAgICBpZiAoaXNGaWxsICYmIGlzU3Ryb2tlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGluQm94KG1pblggLSBoYWxmV2lkdGgsIG1pblkgLSBoYWxmV2lkdGgsIHdpZHRoICsgaGFsZldpZHRoLCBoZWlnaHQgKyBoYWxmV2lkdGgsIHgsIHkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8g5LuF5aGr5YWFXG4gICAgICAgICAgICBpZiAoaXNGaWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGluQm94KG1pblgsIG1pblksIHdpZHRoLCBoZWlnaHQsIHgsIHkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzU3Ryb2tlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGluUmVjdChtaW5YLCBtaW5ZLCB3aWR0aCwgaGVpZ2h0LCBsaW5lV2lkdGgsIHgsIHkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFyIGlzSGl0ID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAoaXNTdHJva2UpIHtcbiAgICAgICAgICAgICAgICBpc0hpdCA9IGluUmVjdFdpdGhSYWRpdXMobWluWCwgbWluWSwgd2lkdGgsIGhlaWdodCwgcmFkaXVzLCBsaW5lV2lkdGgsIHgsIHkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8g5LuF5aGr5YWF5pe25bim5pyJ5ZyG6KeS55qE55+p5b2i55u05o6l6YCa6L+H5Zu+5b2i5ou+5Y+WXG4gICAgICAgICAgICAvLyDku6XlkI7lj6/ku6XmlLnmiJDnuq/mlbDlrabnmoTov5HkvLzmi77lj5bvvIzlsIblnIblvKfliIflibLmiJDlpJrovrnlvaJcbiAgICAgICAgICAgIGlmICghaXNIaXQgJiYgaXNGaWxsKSB7XG4gICAgICAgICAgICAgICAgaXNIaXQgPSBpc1BvaW50SW5QYXRoKHRoaXMsIHgsIHkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGlzSGl0O1xuICAgICAgICB9XG4gICAgfTtcbiAgICBSZWN0LnByb3RvdHlwZS5jcmVhdGVQYXRoID0gZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgICAgdmFyIGF0dHJzID0gdGhpcy5hdHRyKCk7XG4gICAgICAgIHZhciB4ID0gYXR0cnMueDtcbiAgICAgICAgdmFyIHkgPSBhdHRycy55O1xuICAgICAgICB2YXIgd2lkdGggPSBhdHRycy53aWR0aDtcbiAgICAgICAgdmFyIGhlaWdodCA9IGF0dHJzLmhlaWdodDtcbiAgICAgICAgdmFyIHJhZGl1cyA9IGF0dHJzLnJhZGl1cztcbiAgICAgICAgY29udGV4dC5iZWdpblBhdGgoKTtcbiAgICAgICAgaWYgKHJhZGl1cyA9PT0gMCkge1xuICAgICAgICAgICAgLy8g5pS55oiQ5Y6f55Sf55qEcmVjdOaWueazlVxuICAgICAgICAgICAgY29udGV4dC5yZWN0KHgsIHksIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFyIF9hID0gcGFyc2VSYWRpdXMocmFkaXVzKSwgcjEgPSBfYVswXSwgcjIgPSBfYVsxXSwgcjMgPSBfYVsyXSwgcjQgPSBfYVszXTtcbiAgICAgICAgICAgIGNvbnRleHQubW92ZVRvKHggKyByMSwgeSk7XG4gICAgICAgICAgICBjb250ZXh0LmxpbmVUbyh4ICsgd2lkdGggLSByMiwgeSk7XG4gICAgICAgICAgICByMiAhPT0gMCAmJiBjb250ZXh0LmFyYyh4ICsgd2lkdGggLSByMiwgeSArIHIyLCByMiwgLU1hdGguUEkgLyAyLCAwKTtcbiAgICAgICAgICAgIGNvbnRleHQubGluZVRvKHggKyB3aWR0aCwgeSArIGhlaWdodCAtIHIzKTtcbiAgICAgICAgICAgIHIzICE9PSAwICYmIGNvbnRleHQuYXJjKHggKyB3aWR0aCAtIHIzLCB5ICsgaGVpZ2h0IC0gcjMsIHIzLCAwLCBNYXRoLlBJIC8gMik7XG4gICAgICAgICAgICBjb250ZXh0LmxpbmVUbyh4ICsgcjQsIHkgKyBoZWlnaHQpO1xuICAgICAgICAgICAgcjQgIT09IDAgJiYgY29udGV4dC5hcmMoeCArIHI0LCB5ICsgaGVpZ2h0IC0gcjQsIHI0LCBNYXRoLlBJIC8gMiwgTWF0aC5QSSk7XG4gICAgICAgICAgICBjb250ZXh0LmxpbmVUbyh4LCB5ICsgcjEpO1xuICAgICAgICAgICAgcjEgIT09IDAgJiYgY29udGV4dC5hcmMoeCArIHIxLCB5ICsgcjEsIHIxLCBNYXRoLlBJLCBNYXRoLlBJICogMS41KTtcbiAgICAgICAgICAgIGNvbnRleHQuY2xvc2VQYXRoKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBSZWN0O1xufShTaGFwZUJhc2UpKTtcbmV4cG9ydCBkZWZhdWx0IFJlY3Q7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZWN0LmpzLm1hcCIsIi8qKlxuICogQGZpbGVvdmVydmlldyDmlofmnKxcbiAqIEBhdXRob3IgZHhxNjEzQGdtYWlsLmNvbVxuICovXG5pbXBvcnQgeyBfX2Fzc2lnbiwgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgU2hhcGVCYXNlIGZyb20gJy4vYmFzZSc7XG5pbXBvcnQgeyBpc05pbCwgaXNTdHJpbmcsIGVhY2ggfSBmcm9tICcuLi91dGlsL3V0aWwnO1xuaW1wb3J0IHsgZ2V0VGV4dEhlaWdodCwgYXNzZW1ibGVGb250IH0gZnJvbSAnQGFudHYvZy1iYXNlJztcbnZhciBUZXh0ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhUZXh0LCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFRleHQoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICB9XG4gICAgLy8g6buY6K6k5paH5pys5bGe5oCnXG4gICAgVGV4dC5wcm90b3R5cGUuZ2V0RGVmYXVsdEF0dHJzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYXR0cnMgPSBfc3VwZXIucHJvdG90eXBlLmdldERlZmF1bHRBdHRycy5jYWxsKHRoaXMpO1xuICAgICAgICByZXR1cm4gX19hc3NpZ24oX19hc3NpZ24oe30sIGF0dHJzKSwgeyB4OiAwLCB5OiAwLCB0ZXh0OiBudWxsLCBmb250U2l6ZTogMTIsIGZvbnRGYW1pbHk6ICdzYW5zLXNlcmlmJywgZm9udFN0eWxlOiAnbm9ybWFsJywgZm9udFdlaWdodDogJ25vcm1hbCcsIGZvbnRWYXJpYW50OiAnbm9ybWFsJywgdGV4dEFsaWduOiAnc3RhcnQnLCB0ZXh0QmFzZWxpbmU6ICdib3R0b20nIH0pO1xuICAgIH07XG4gICAgLy8g5LuF5LuF5L2/55So5YyF5Zu055uS5qOA5rWL5p2l6L+b6KGM5ou+5Y+WXG4gICAgVGV4dC5wcm90b3R5cGUuaXNPbmx5SGl0Qm94ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuICAgIC8vIOWIneWni+WMluaXtue7hOWQiCBmb25077yM5ZCM5pe25Yik5patIHRleHQg5piv5ZCm5o2i6KGMXG4gICAgVGV4dC5wcm90b3R5cGUuaW5pdEF0dHJzID0gZnVuY3Rpb24gKGF0dHJzKSB7XG4gICAgICAgIHRoaXMuX2Fzc2VtYmxlRm9udCgpO1xuICAgICAgICBpZiAoYXR0cnMudGV4dCkge1xuICAgICAgICAgICAgdGhpcy5fc2V0VGV4dChhdHRycy50ZXh0KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLy8g57uE6KOF5a2X5L2TXG4gICAgVGV4dC5wcm90b3R5cGUuX2Fzc2VtYmxlRm9udCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGF0dHJzID0gdGhpcy5hdHRycztcbiAgICAgICAgYXR0cnMuZm9udCA9IGFzc2VtYmxlRm9udChhdHRycyk7XG4gICAgfTtcbiAgICAvLyDlpoLmnpzmlofmnKzmjaLooYzvvIzliJnnvJPlrZjmlbDnu4RcbiAgICBUZXh0LnByb3RvdHlwZS5fc2V0VGV4dCA9IGZ1bmN0aW9uICh0ZXh0KSB7XG4gICAgICAgIHZhciB0ZXh0QXJyID0gbnVsbDtcbiAgICAgICAgaWYgKGlzU3RyaW5nKHRleHQpICYmIHRleHQuaW5kZXhPZignXFxuJykgIT09IC0xKSB7XG4gICAgICAgICAgICB0ZXh0QXJyID0gdGV4dC5zcGxpdCgnXFxuJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXQoJ3RleHRBcnInLCB0ZXh0QXJyKTtcbiAgICB9O1xuICAgIC8vIOabtOaWsOWxnuaAp+aXtu+8jOajgOa1i+aYr+WQpuabtOaUueS6hiBmb25044CBdGV4dFxuICAgIFRleHQucHJvdG90eXBlLm9uQXR0ckNoYW5nZSA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSwgb3JpZ2luVmFsdWUpIHtcbiAgICAgICAgX3N1cGVyLnByb3RvdHlwZS5vbkF0dHJDaGFuZ2UuY2FsbCh0aGlzLCBuYW1lLCB2YWx1ZSwgb3JpZ2luVmFsdWUpO1xuICAgICAgICBpZiAobmFtZS5zdGFydHNXaXRoKCdmb250JykpIHtcbiAgICAgICAgICAgIHRoaXMuX2Fzc2VtYmxlRm9udCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChuYW1lID09PSAndGV4dCcpIHtcbiAgICAgICAgICAgIHRoaXMuX3NldFRleHQodmFsdWUpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvLyDov5nkuKrmlrnms5XlnKggdGV4dCDml7bmsqHmnInlj6/ku6XlgZrnmoTkuovmg4XvvIzlpoLmnpzopoHmlK/mjIHmloflrZfog4zmma/ml7blj6/ku6XogIPomZFcbiAgICAvLyBjcmVhdGVQYXRoKGNvbnRleHQpIHtcbiAgICAvLyB9XG4gICAgLy8g5aaC5p6c5paH5pys5aSa6KGM77yM6ZyA6KaB6I635Y+W5paH5pys6Ze06LedXG4gICAgVGV4dC5wcm90b3R5cGUuX2dldFNwYWNlaW5nWSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGF0dHJzID0gdGhpcy5hdHRycztcbiAgICAgICAgdmFyIGxpbmVIZWlnaHQgPSBhdHRycy5saW5lSGVpZ2h0O1xuICAgICAgICB2YXIgZm9udFNpemUgPSBhdHRycy5mb250U2l6ZSAqIDE7XG4gICAgICAgIHJldHVybiBsaW5lSGVpZ2h0ID8gbGluZUhlaWdodCAtIGZvbnRTaXplIDogZm9udFNpemUgKiAwLjE0O1xuICAgIH07XG4gICAgLy8g57uY5Yi25paH5pys77yM6ICD6JmR5aSa6KGM55qE5Zy65pmvXG4gICAgVGV4dC5wcm90b3R5cGUuX2RyYXdUZXh0QXJyID0gZnVuY3Rpb24gKGNvbnRleHQsIHRleHRBcnIsIGlzRmlsbCkge1xuICAgICAgICB2YXIgYXR0cnMgPSB0aGlzLmF0dHJzO1xuICAgICAgICB2YXIgdGV4dEJhc2VsaW5lID0gYXR0cnMudGV4dEJhc2VsaW5lO1xuICAgICAgICB2YXIgeCA9IGF0dHJzLng7XG4gICAgICAgIHZhciB5ID0gYXR0cnMueTtcbiAgICAgICAgdmFyIGZvbnRTaXplID0gYXR0cnMuZm9udFNpemUgKiAxO1xuICAgICAgICB2YXIgc3BhY2VpbmdZID0gdGhpcy5fZ2V0U3BhY2VpbmdZKCk7XG4gICAgICAgIHZhciBoZWlnaHQgPSBnZXRUZXh0SGVpZ2h0KGF0dHJzLnRleHQsIGF0dHJzLmZvbnRTaXplLCBhdHRycy5saW5lSGVpZ2h0KTtcbiAgICAgICAgdmFyIHN1Ylk7XG4gICAgICAgIGVhY2godGV4dEFyciwgZnVuY3Rpb24gKHN1YlRleHQsIGluZGV4KSB7XG4gICAgICAgICAgICBzdWJZID0geSArIGluZGV4ICogKHNwYWNlaW5nWSArIGZvbnRTaXplKSAtIGhlaWdodCArIGZvbnRTaXplOyAvLyBib3R0b207XG4gICAgICAgICAgICBpZiAodGV4dEJhc2VsaW5lID09PSAnbWlkZGxlJylcbiAgICAgICAgICAgICAgICBzdWJZICs9IGhlaWdodCAtIGZvbnRTaXplIC0gKGhlaWdodCAtIGZvbnRTaXplKSAvIDI7XG4gICAgICAgICAgICBpZiAodGV4dEJhc2VsaW5lID09PSAndG9wJylcbiAgICAgICAgICAgICAgICBzdWJZICs9IGhlaWdodCAtIGZvbnRTaXplO1xuICAgICAgICAgICAgaWYgKCFpc05pbChzdWJUZXh0KSkge1xuICAgICAgICAgICAgICAgIGlmIChpc0ZpbGwpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5maWxsVGV4dChzdWJUZXh0LCB4LCBzdWJZKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuc3Ryb2tlVGV4dChzdWJUZXh0LCB4LCBzdWJZKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLy8g57uY5Yi25paH5pys77yM5ZCM5pe26ICD6JmR5aGr5YWF5ZKM57uY5Yi26L655qGGXG4gICAgVGV4dC5wcm90b3R5cGUuX2RyYXdUZXh0ID0gZnVuY3Rpb24gKGNvbnRleHQsIGlzRmlsbCkge1xuICAgICAgICB2YXIgYXR0cnMgPSB0aGlzLmF0dHIoKTtcbiAgICAgICAgdmFyIHggPSBhdHRycy54O1xuICAgICAgICB2YXIgeSA9IGF0dHJzLnk7XG4gICAgICAgIHZhciB0ZXh0QXJyID0gdGhpcy5nZXQoJ3RleHRBcnInKTtcbiAgICAgICAgaWYgKHRleHRBcnIpIHtcbiAgICAgICAgICAgIHRoaXMuX2RyYXdUZXh0QXJyKGNvbnRleHQsIHRleHRBcnIsIGlzRmlsbCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2YXIgdGV4dCA9IGF0dHJzLnRleHQ7XG4gICAgICAgICAgICBpZiAoIWlzTmlsKHRleHQpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzRmlsbCkge1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmZpbGxUZXh0KHRleHQsIHgsIHkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5zdHJva2VUZXh0KHRleHQsIHgsIHkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgLy8g5aSN5YaZ57uY5Yi25ZKM5aGr5YWF55qE6YC76L6R77ya5a+55LqO5paH5pys77yM5bqU6K+l5YWI57uY5Yi26L655qGG77yM5YaN6L+b6KGM5aGr5YWFXG4gICAgVGV4dC5wcm90b3R5cGUuc3Ryb2tlQW5kRmlsbCA9IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICAgIHZhciBfYSA9IHRoaXMuYXR0cnMsIGxpbmVXaWR0aCA9IF9hLmxpbmVXaWR0aCwgb3BhY2l0eSA9IF9hLm9wYWNpdHksIHN0cm9rZU9wYWNpdHkgPSBfYS5zdHJva2VPcGFjaXR5LCBmaWxsT3BhY2l0eSA9IF9hLmZpbGxPcGFjaXR5O1xuICAgICAgICBpZiAodGhpcy5pc1N0cm9rZSgpKSB7XG4gICAgICAgICAgICBpZiAobGluZVdpZHRoID4gMCkge1xuICAgICAgICAgICAgICAgIGlmICghaXNOaWwoc3Ryb2tlT3BhY2l0eSkgJiYgc3Ryb2tlT3BhY2l0eSAhPT0gMSkge1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0Lmdsb2JhbEFscGhhID0gb3BhY2l0eTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5zdHJva2UoY29udGV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaXNGaWxsKCkpIHtcbiAgICAgICAgICAgIGlmICghaXNOaWwoZmlsbE9wYWNpdHkpICYmIGZpbGxPcGFjaXR5ICE9PSAxKSB7XG4gICAgICAgICAgICAgICAgY29udGV4dC5nbG9iYWxBbHBoYSA9IGZpbGxPcGFjaXR5O1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsbChjb250ZXh0KTtcbiAgICAgICAgICAgICAgICBjb250ZXh0Lmdsb2JhbEFscGhhID0gb3BhY2l0eTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsbChjb250ZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFmdGVyRHJhd1BhdGgoY29udGV4dCk7XG4gICAgfTtcbiAgICAvLyDlpI3lhpnloavlhYXpgLvovpFcbiAgICBUZXh0LnByb3RvdHlwZS5maWxsID0gZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgICAgdGhpcy5fZHJhd1RleHQoY29udGV4dCwgdHJ1ZSk7XG4gICAgfTtcbiAgICAvLyDlpI3lhpnnu5jliLbovrnmoYbnmoTpgLvovpFcbiAgICBUZXh0LnByb3RvdHlwZS5zdHJva2UgPSBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgICB0aGlzLl9kcmF3VGV4dChjb250ZXh0LCBmYWxzZSk7XG4gICAgfTtcbiAgICByZXR1cm4gVGV4dDtcbn0oU2hhcGVCYXNlKSk7XG5leHBvcnQgZGVmYXVsdCBUZXh0O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGV4dC5qcy5tYXAiLCJleHBvcnQgeyBkZWZhdWx0IGFzIEJhc2UgfSBmcm9tICcuL2Jhc2UnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBDaXJjbGUgfSBmcm9tICcuL2NpcmNsZSc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIEVsbGlwc2UgfSBmcm9tICcuL2VsbGlwc2UnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBJbWFnZSB9IGZyb20gJy4vaW1hZ2UnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBMaW5lIH0gZnJvbSAnLi9saW5lJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgTWFya2VyIH0gZnJvbSAnLi9tYXJrZXInO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQYXRoIH0gZnJvbSAnLi9wYXRoJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUG9seWdvbiB9IGZyb20gJy4vcG9seWdvbic7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBvbHlsaW5lIH0gZnJvbSAnLi9wb2x5bGluZSc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFJlY3QgfSBmcm9tICcuL3JlY3QnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBUZXh0IH0gZnJvbSAnLi90ZXh0Jztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///57\n")},function(module,__webpack_exports__,__webpack_require__){"use strict";eval('/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return Mask; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Frustum; });\n/* harmony import */ var _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(61);\n/* harmony import */ var _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(6);\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(7);\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var gl_matrix__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(2);\n/* harmony import */ var _Plane__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(128);\n\n\n\n\n\nvar Mask;\n\n(function (Mask) {\n Mask[Mask["OUTSIDE"] = 4294967295] = "OUTSIDE";\n Mask[Mask["INSIDE"] = 0] = "INSIDE";\n Mask[Mask["INDETERMINATE"] = 2147483647] = "INDETERMINATE";\n})(Mask || (Mask = {}));\n\nvar Frustum = /*#__PURE__*/function () {\n function Frustum(planes) {\n _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1___default()(this, Frustum);\n\n this.planes = [];\n\n if (planes) {\n this.planes = planes;\n } else {\n for (var i = 0; i < 6; i++) {\n this.planes.push(new _Plane__WEBPACK_IMPORTED_MODULE_4__[/* Plane */ "a"]());\n }\n }\n }\n /**\n * extract 6 planes from vpMatrix\n * @see http://www8.cs.umu.se/kurser/5DV051/HT12/lab/plane_extraction.pdf\n * @param vpMatrix viewProjectionMatrix\n */\n\n\n _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2___default()(Frustum, [{\n key: "extractFromVPMatrix",\n value: function extractFromVPMatrix(vpMatrix) {\n var _vpMatrix = _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_0___default()(vpMatrix, 16),\n m0 = _vpMatrix[0],\n m1 = _vpMatrix[1],\n m2 = _vpMatrix[2],\n m3 = _vpMatrix[3],\n m4 = _vpMatrix[4],\n m5 = _vpMatrix[5],\n m6 = _vpMatrix[6],\n m7 = _vpMatrix[7],\n m8 = _vpMatrix[8],\n m9 = _vpMatrix[9],\n m10 = _vpMatrix[10],\n m11 = _vpMatrix[11],\n m12 = _vpMatrix[12],\n m13 = _vpMatrix[13],\n m14 = _vpMatrix[14],\n m15 = _vpMatrix[15]; // right\n\n\n gl_matrix__WEBPACK_IMPORTED_MODULE_3__[/* vec3 */ "e"].set(this.planes[0].normal, m3 - m0, m7 - m4, m11 - m8);\n this.planes[0].distance = -(m15 - m12); // left\n\n gl_matrix__WEBPACK_IMPORTED_MODULE_3__[/* vec3 */ "e"].set(this.planes[1].normal, m3 + m0, m7 + m4, m11 + m8);\n this.planes[1].distance = -(m15 + m12); // bottom\n\n gl_matrix__WEBPACK_IMPORTED_MODULE_3__[/* vec3 */ "e"].set(this.planes[2].normal, m3 + m1, m7 + m5, m11 + m9);\n this.planes[2].distance = -(m15 + m13); // top\n\n gl_matrix__WEBPACK_IMPORTED_MODULE_3__[/* vec3 */ "e"].set(this.planes[3].normal, m3 - m1, m7 - m5, m11 - m9);\n this.planes[3].distance = -(m15 - m13); // far\n\n gl_matrix__WEBPACK_IMPORTED_MODULE_3__[/* vec3 */ "e"].set(this.planes[4].normal, m3 - m2, m7 - m6, m11 - m10);\n this.planes[4].distance = -(m15 - m14); // near\n\n gl_matrix__WEBPACK_IMPORTED_MODULE_3__[/* vec3 */ "e"].set(this.planes[5].normal, m3 + m2, m7 + m6, m11 + m10);\n this.planes[5].distance = -(m15 + m14);\n this.planes.forEach(function (plane) {\n plane.normalize();\n plane.updatePNVertexFlag();\n });\n }\n }]);\n\n return Frustum;\n}();\n//# sourceMappingURL=Frustum.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy13ZWJncHUtY29yZS9lcy9zaGFwZS9GcnVzdHVtLmpzP2E5ZmIiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBa0U7QUFDRTtBQUNOO0FBQzdCO0FBQ0Q7QUFDekI7O0FBRVA7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLG9CQUFvQjs7QUFFZDtBQUNQO0FBQ0EsSUFBSSw0RUFBZTs7QUFFbkI7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTCxxQkFBcUIsT0FBTztBQUM1Qiw2QkFBNkIsb0RBQUs7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0EsRUFBRSx5RUFBWTtBQUNkO0FBQ0E7QUFDQSxzQkFBc0IsMkVBQWM7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCOzs7QUFHOUIsTUFBTSxzREFBSTtBQUNWLDZDQUE2Qzs7QUFFN0MsTUFBTSxzREFBSTtBQUNWLDZDQUE2Qzs7QUFFN0MsTUFBTSxzREFBSTtBQUNWLDZDQUE2Qzs7QUFFN0MsTUFBTSxzREFBSTtBQUNWLDZDQUE2Qzs7QUFFN0MsTUFBTSxzREFBSTtBQUNWLDZDQUE2Qzs7QUFFN0MsTUFBTSxzREFBSTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsR0FBRzs7QUFFSDtBQUNBLENBQUM7QUFDRCIsImZpbGUiOiI1OC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrXCI7XG5pbXBvcnQgX2NyZWF0ZUNsYXNzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzXCI7XG5pbXBvcnQgeyB2ZWMzIH0gZnJvbSAnZ2wtbWF0cml4JztcbmltcG9ydCB7IFBsYW5lIH0gZnJvbSAnLi9QbGFuZSc7XG5leHBvcnQgdmFyIE1hc2s7XG5cbihmdW5jdGlvbiAoTWFzaykge1xuICBNYXNrW01hc2tbXCJPVVRTSURFXCJdID0gNDI5NDk2NzI5NV0gPSBcIk9VVFNJREVcIjtcbiAgTWFza1tNYXNrW1wiSU5TSURFXCJdID0gMF0gPSBcIklOU0lERVwiO1xuICBNYXNrW01hc2tbXCJJTkRFVEVSTUlOQVRFXCJdID0gMjE0NzQ4MzY0N10gPSBcIklOREVURVJNSU5BVEVcIjtcbn0pKE1hc2sgfHwgKE1hc2sgPSB7fSkpO1xuXG5leHBvcnQgdmFyIEZydXN0dW0gPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBGcnVzdHVtKHBsYW5lcykge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBGcnVzdHVtKTtcblxuICAgIHRoaXMucGxhbmVzID0gW107XG5cbiAgICBpZiAocGxhbmVzKSB7XG4gICAgICB0aGlzLnBsYW5lcyA9IHBsYW5lcztcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCA2OyBpKyspIHtcbiAgICAgICAgdGhpcy5wbGFuZXMucHVzaChuZXcgUGxhbmUoKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBleHRyYWN0IDYgcGxhbmVzIGZyb20gdnBNYXRyaXhcbiAgICogQHNlZSBodHRwOi8vd3d3OC5jcy51bXUuc2Uva3Vyc2VyLzVEVjA1MS9IVDEyL2xhYi9wbGFuZV9leHRyYWN0aW9uLnBkZlxuICAgKiBAcGFyYW0gdnBNYXRyaXggdmlld1Byb2plY3Rpb25NYXRyaXhcbiAgICovXG5cblxuICBfY3JlYXRlQ2xhc3MoRnJ1c3R1bSwgW3tcbiAgICBrZXk6IFwiZXh0cmFjdEZyb21WUE1hdHJpeFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBleHRyYWN0RnJvbVZQTWF0cml4KHZwTWF0cml4KSB7XG4gICAgICB2YXIgX3ZwTWF0cml4ID0gX3NsaWNlZFRvQXJyYXkodnBNYXRyaXgsIDE2KSxcbiAgICAgICAgICBtMCA9IF92cE1hdHJpeFswXSxcbiAgICAgICAgICBtMSA9IF92cE1hdHJpeFsxXSxcbiAgICAgICAgICBtMiA9IF92cE1hdHJpeFsyXSxcbiAgICAgICAgICBtMyA9IF92cE1hdHJpeFszXSxcbiAgICAgICAgICBtNCA9IF92cE1hdHJpeFs0XSxcbiAgICAgICAgICBtNSA9IF92cE1hdHJpeFs1XSxcbiAgICAgICAgICBtNiA9IF92cE1hdHJpeFs2XSxcbiAgICAgICAgICBtNyA9IF92cE1hdHJpeFs3XSxcbiAgICAgICAgICBtOCA9IF92cE1hdHJpeFs4XSxcbiAgICAgICAgICBtOSA9IF92cE1hdHJpeFs5XSxcbiAgICAgICAgICBtMTAgPSBfdnBNYXRyaXhbMTBdLFxuICAgICAgICAgIG0xMSA9IF92cE1hdHJpeFsxMV0sXG4gICAgICAgICAgbTEyID0gX3ZwTWF0cml4WzEyXSxcbiAgICAgICAgICBtMTMgPSBfdnBNYXRyaXhbMTNdLFxuICAgICAgICAgIG0xNCA9IF92cE1hdHJpeFsxNF0sXG4gICAgICAgICAgbTE1ID0gX3ZwTWF0cml4WzE1XTsgLy8gcmlnaHRcblxuXG4gICAgICB2ZWMzLnNldCh0aGlzLnBsYW5lc1swXS5ub3JtYWwsIG0zIC0gbTAsIG03IC0gbTQsIG0xMSAtIG04KTtcbiAgICAgIHRoaXMucGxhbmVzWzBdLmRpc3RhbmNlID0gLShtMTUgLSBtMTIpOyAvLyBsZWZ0XG5cbiAgICAgIHZlYzMuc2V0KHRoaXMucGxhbmVzWzFdLm5vcm1hbCwgbTMgKyBtMCwgbTcgKyBtNCwgbTExICsgbTgpO1xuICAgICAgdGhpcy5wbGFuZXNbMV0uZGlzdGFuY2UgPSAtKG0xNSArIG0xMik7IC8vIGJvdHRvbVxuXG4gICAgICB2ZWMzLnNldCh0aGlzLnBsYW5lc1syXS5ub3JtYWwsIG0zICsgbTEsIG03ICsgbTUsIG0xMSArIG05KTtcbiAgICAgIHRoaXMucGxhbmVzWzJdLmRpc3RhbmNlID0gLShtMTUgKyBtMTMpOyAvLyB0b3BcblxuICAgICAgdmVjMy5zZXQodGhpcy5wbGFuZXNbM10ubm9ybWFsLCBtMyAtIG0xLCBtNyAtIG01LCBtMTEgLSBtOSk7XG4gICAgICB0aGlzLnBsYW5lc1szXS5kaXN0YW5jZSA9IC0obTE1IC0gbTEzKTsgLy8gZmFyXG5cbiAgICAgIHZlYzMuc2V0KHRoaXMucGxhbmVzWzRdLm5vcm1hbCwgbTMgLSBtMiwgbTcgLSBtNiwgbTExIC0gbTEwKTtcbiAgICAgIHRoaXMucGxhbmVzWzRdLmRpc3RhbmNlID0gLShtMTUgLSBtMTQpOyAvLyBuZWFyXG5cbiAgICAgIHZlYzMuc2V0KHRoaXMucGxhbmVzWzVdLm5vcm1hbCwgbTMgKyBtMiwgbTcgKyBtNiwgbTExICsgbTEwKTtcbiAgICAgIHRoaXMucGxhbmVzWzVdLmRpc3RhbmNlID0gLShtMTUgKyBtMTQpO1xuICAgICAgdGhpcy5wbGFuZXMuZm9yRWFjaChmdW5jdGlvbiAocGxhbmUpIHtcbiAgICAgICAgcGxhbmUubm9ybWFsaXplKCk7XG4gICAgICAgIHBsYW5lLnVwZGF0ZVBOVmVydGV4RmxhZygpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEZydXN0dW07XG59KCk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1GcnVzdHVtLmpzLm1hcCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///58\n')},function(module,exports,__webpack_require__){eval("var arrayLikeKeys = __webpack_require__(190),\n baseKeys = __webpack_require__(159),\n isArrayLike = __webpack_require__(54);\n\n/**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\nfunction keys(object) {\n return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n}\n\nmodule.exports = keys;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL2tleXMuanM/ZWM2OSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxvQkFBb0IsbUJBQU8sQ0FBQyxHQUFrQjtBQUM5QyxlQUFlLG1CQUFPLENBQUMsR0FBYTtBQUNwQyxrQkFBa0IsbUJBQU8sQ0FBQyxFQUFlOztBQUV6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsTUFBTTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJmaWxlIjoiNTkuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYXJyYXlMaWtlS2V5cyA9IHJlcXVpcmUoJy4vX2FycmF5TGlrZUtleXMnKSxcbiAgICBiYXNlS2V5cyA9IHJlcXVpcmUoJy4vX2Jhc2VLZXlzJyksXG4gICAgaXNBcnJheUxpa2UgPSByZXF1aXJlKCcuL2lzQXJyYXlMaWtlJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgb2YgYG9iamVjdGAuXG4gKlxuICogKipOb3RlOioqIE5vbi1vYmplY3QgdmFsdWVzIGFyZSBjb2VyY2VkIHRvIG9iamVjdHMuIFNlZSB0aGVcbiAqIFtFUyBzcGVjXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3Qua2V5cylcbiAqIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAqIEBleGFtcGxlXG4gKlxuICogZnVuY3Rpb24gRm9vKCkge1xuICogICB0aGlzLmEgPSAxO1xuICogICB0aGlzLmIgPSAyO1xuICogfVxuICpcbiAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gKlxuICogXy5rZXlzKG5ldyBGb28pO1xuICogLy8gPT4gWydhJywgJ2InXSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICpcbiAqIF8ua2V5cygnaGknKTtcbiAqIC8vID0+IFsnMCcsICcxJ11cbiAqL1xuZnVuY3Rpb24ga2V5cyhvYmplY3QpIHtcbiAgcmV0dXJuIGlzQXJyYXlMaWtlKG9iamVjdCkgPyBhcnJheUxpa2VLZXlzKG9iamVjdCkgOiBiYXNlS2V5cyhvYmplY3QpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGtleXM7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///59\n")},function(module,exports,__webpack_require__){"use strict";eval('\nObject.defineProperty(exports, "__esModule", { value: true });\nexports.tagProperty = exports.tagParameter = exports.decorate = void 0;\nvar ERROR_MSGS = __webpack_require__(40);\nvar METADATA_KEY = __webpack_require__(32);\nfunction tagParameter(annotationTarget, propertyName, parameterIndex, metadata) {\n var metadataKey = METADATA_KEY.TAGGED;\n _tagParameterOrProperty(metadataKey, annotationTarget, propertyName, metadata, parameterIndex);\n}\nexports.tagParameter = tagParameter;\nfunction tagProperty(annotationTarget, propertyName, metadata) {\n var metadataKey = METADATA_KEY.TAGGED_PROP;\n _tagParameterOrProperty(metadataKey, annotationTarget.constructor, propertyName, metadata);\n}\nexports.tagProperty = tagProperty;\nfunction _tagParameterOrProperty(metadataKey, annotationTarget, propertyName, metadata, parameterIndex) {\n var paramsOrPropertiesMetadata = {};\n var isParameterDecorator = (typeof parameterIndex === "number");\n var key = (parameterIndex !== undefined && isParameterDecorator) ? parameterIndex.toString() : propertyName;\n if (isParameterDecorator && propertyName !== undefined) {\n throw new Error(ERROR_MSGS.INVALID_DECORATOR_OPERATION);\n }\n if (Reflect.hasOwnMetadata(metadataKey, annotationTarget)) {\n paramsOrPropertiesMetadata = Reflect.getMetadata(metadataKey, annotationTarget);\n }\n var paramOrPropertyMetadata = paramsOrPropertiesMetadata[key];\n if (!Array.isArray(paramOrPropertyMetadata)) {\n paramOrPropertyMetadata = [];\n }\n else {\n for (var _i = 0, paramOrPropertyMetadata_1 = paramOrPropertyMetadata; _i < paramOrPropertyMetadata_1.length; _i++) {\n var m = paramOrPropertyMetadata_1[_i];\n if (m.key === metadata.key) {\n throw new Error(ERROR_MSGS.DUPLICATED_METADATA + " " + m.key.toString());\n }\n }\n }\n paramOrPropertyMetadata.push(metadata);\n paramsOrPropertiesMetadata[key] = paramOrPropertyMetadata;\n Reflect.defineMetadata(metadataKey, paramsOrPropertiesMetadata, annotationTarget);\n}\nfunction _decorate(decorators, target) {\n Reflect.decorate(decorators, target);\n}\nfunction _param(paramIndex, decorator) {\n return function (target, key) { decorator(target, key, paramIndex); };\n}\nfunction decorate(decorator, target, parameterIndex) {\n if (typeof parameterIndex === "number") {\n _decorate([_param(parameterIndex, decorator)], target);\n }\n else if (typeof parameterIndex === "string") {\n Reflect.decorate([decorator], target, parameterIndex);\n }\n else {\n _decorate([decorator], target);\n }\n}\nexports.decorate = decorate;\n//# sourceMappingURL=decorator_utils.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaW52ZXJzaWZ5L2xpYi9hbm5vdGF0aW9uL2RlY29yYXRvcl91dGlscy5qcz82NmQ3Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFhO0FBQ2IsOENBQThDLGNBQWM7QUFDNUQ7QUFDQSxpQkFBaUIsbUJBQU8sQ0FBQyxFQUF5QjtBQUNsRCxtQkFBbUIsbUJBQU8sQ0FBQyxFQUE0QjtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZFQUE2RSx1Q0FBdUM7QUFDcEg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQyxvQ0FBb0M7QUFDdkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiI2MC5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy50YWdQcm9wZXJ0eSA9IGV4cG9ydHMudGFnUGFyYW1ldGVyID0gZXhwb3J0cy5kZWNvcmF0ZSA9IHZvaWQgMDtcbnZhciBFUlJPUl9NU0dTID0gcmVxdWlyZShcIi4uL2NvbnN0YW50cy9lcnJvcl9tc2dzXCIpO1xudmFyIE1FVEFEQVRBX0tFWSA9IHJlcXVpcmUoXCIuLi9jb25zdGFudHMvbWV0YWRhdGFfa2V5c1wiKTtcbmZ1bmN0aW9uIHRhZ1BhcmFtZXRlcihhbm5vdGF0aW9uVGFyZ2V0LCBwcm9wZXJ0eU5hbWUsIHBhcmFtZXRlckluZGV4LCBtZXRhZGF0YSkge1xuICAgIHZhciBtZXRhZGF0YUtleSA9IE1FVEFEQVRBX0tFWS5UQUdHRUQ7XG4gICAgX3RhZ1BhcmFtZXRlck9yUHJvcGVydHkobWV0YWRhdGFLZXksIGFubm90YXRpb25UYXJnZXQsIHByb3BlcnR5TmFtZSwgbWV0YWRhdGEsIHBhcmFtZXRlckluZGV4KTtcbn1cbmV4cG9ydHMudGFnUGFyYW1ldGVyID0gdGFnUGFyYW1ldGVyO1xuZnVuY3Rpb24gdGFnUHJvcGVydHkoYW5ub3RhdGlvblRhcmdldCwgcHJvcGVydHlOYW1lLCBtZXRhZGF0YSkge1xuICAgIHZhciBtZXRhZGF0YUtleSA9IE1FVEFEQVRBX0tFWS5UQUdHRURfUFJPUDtcbiAgICBfdGFnUGFyYW1ldGVyT3JQcm9wZXJ0eShtZXRhZGF0YUtleSwgYW5ub3RhdGlvblRhcmdldC5jb25zdHJ1Y3RvciwgcHJvcGVydHlOYW1lLCBtZXRhZGF0YSk7XG59XG5leHBvcnRzLnRhZ1Byb3BlcnR5ID0gdGFnUHJvcGVydHk7XG5mdW5jdGlvbiBfdGFnUGFyYW1ldGVyT3JQcm9wZXJ0eShtZXRhZGF0YUtleSwgYW5ub3RhdGlvblRhcmdldCwgcHJvcGVydHlOYW1lLCBtZXRhZGF0YSwgcGFyYW1ldGVySW5kZXgpIHtcbiAgICB2YXIgcGFyYW1zT3JQcm9wZXJ0aWVzTWV0YWRhdGEgPSB7fTtcbiAgICB2YXIgaXNQYXJhbWV0ZXJEZWNvcmF0b3IgPSAodHlwZW9mIHBhcmFtZXRlckluZGV4ID09PSBcIm51bWJlclwiKTtcbiAgICB2YXIga2V5ID0gKHBhcmFtZXRlckluZGV4ICE9PSB1bmRlZmluZWQgJiYgaXNQYXJhbWV0ZXJEZWNvcmF0b3IpID8gcGFyYW1ldGVySW5kZXgudG9TdHJpbmcoKSA6IHByb3BlcnR5TmFtZTtcbiAgICBpZiAoaXNQYXJhbWV0ZXJEZWNvcmF0b3IgJiYgcHJvcGVydHlOYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKEVSUk9SX01TR1MuSU5WQUxJRF9ERUNPUkFUT1JfT1BFUkFUSU9OKTtcbiAgICB9XG4gICAgaWYgKFJlZmxlY3QuaGFzT3duTWV0YWRhdGEobWV0YWRhdGFLZXksIGFubm90YXRpb25UYXJnZXQpKSB7XG4gICAgICAgIHBhcmFtc09yUHJvcGVydGllc01ldGFkYXRhID0gUmVmbGVjdC5nZXRNZXRhZGF0YShtZXRhZGF0YUtleSwgYW5ub3RhdGlvblRhcmdldCk7XG4gICAgfVxuICAgIHZhciBwYXJhbU9yUHJvcGVydHlNZXRhZGF0YSA9IHBhcmFtc09yUHJvcGVydGllc01ldGFkYXRhW2tleV07XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHBhcmFtT3JQcm9wZXJ0eU1ldGFkYXRhKSkge1xuICAgICAgICBwYXJhbU9yUHJvcGVydHlNZXRhZGF0YSA9IFtdO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwLCBwYXJhbU9yUHJvcGVydHlNZXRhZGF0YV8xID0gcGFyYW1PclByb3BlcnR5TWV0YWRhdGE7IF9pIDwgcGFyYW1PclByb3BlcnR5TWV0YWRhdGFfMS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIHZhciBtID0gcGFyYW1PclByb3BlcnR5TWV0YWRhdGFfMVtfaV07XG4gICAgICAgICAgICBpZiAobS5rZXkgPT09IG1ldGFkYXRhLmtleSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihFUlJPUl9NU0dTLkRVUExJQ0FURURfTUVUQURBVEEgKyBcIiBcIiArIG0ua2V5LnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHBhcmFtT3JQcm9wZXJ0eU1ldGFkYXRhLnB1c2gobWV0YWRhdGEpO1xuICAgIHBhcmFtc09yUHJvcGVydGllc01ldGFkYXRhW2tleV0gPSBwYXJhbU9yUHJvcGVydHlNZXRhZGF0YTtcbiAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKG1ldGFkYXRhS2V5LCBwYXJhbXNPclByb3BlcnRpZXNNZXRhZGF0YSwgYW5ub3RhdGlvblRhcmdldCk7XG59XG5mdW5jdGlvbiBfZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0KSB7XG4gICAgUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQpO1xufVxuZnVuY3Rpb24gX3BhcmFtKHBhcmFtSW5kZXgsIGRlY29yYXRvcikge1xuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCBrZXkpIHsgZGVjb3JhdG9yKHRhcmdldCwga2V5LCBwYXJhbUluZGV4KTsgfTtcbn1cbmZ1bmN0aW9uIGRlY29yYXRlKGRlY29yYXRvciwgdGFyZ2V0LCBwYXJhbWV0ZXJJbmRleCkge1xuICAgIGlmICh0eXBlb2YgcGFyYW1ldGVySW5kZXggPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgX2RlY29yYXRlKFtfcGFyYW0ocGFyYW1ldGVySW5kZXgsIGRlY29yYXRvcildLCB0YXJnZXQpO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2YgcGFyYW1ldGVySW5kZXggPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgUmVmbGVjdC5kZWNvcmF0ZShbZGVjb3JhdG9yXSwgdGFyZ2V0LCBwYXJhbWV0ZXJJbmRleCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBfZGVjb3JhdGUoW2RlY29yYXRvcl0sIHRhcmdldCk7XG4gICAgfVxufVxuZXhwb3J0cy5kZWNvcmF0ZSA9IGRlY29yYXRlO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGVjb3JhdG9yX3V0aWxzLmpzLm1hcCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///60\n')},function(module,exports,__webpack_require__){eval('var arrayWithHoles = __webpack_require__(499);\n\nvar iterableToArrayLimit = __webpack_require__(500);\n\nvar unsupportedIterableToArray = __webpack_require__(240);\n\nvar nonIterableRest = __webpack_require__(501);\n\nfunction _slicedToArray(arr, i) {\n return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || unsupportedIterableToArray(arr, i) || nonIterableRest();\n}\n\nmodule.exports = _slicedToArray;\nmodule.exports["default"] = module.exports, module.exports.__esModule = true;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9zbGljZWRUb0FycmF5LmpzPzI3OGMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEscUJBQXFCLG1CQUFPLENBQUMsR0FBcUI7O0FBRWxELDJCQUEyQixtQkFBTyxDQUFDLEdBQTJCOztBQUU5RCxpQ0FBaUMsbUJBQU8sQ0FBQyxHQUFpQzs7QUFFMUUsc0JBQXNCLG1CQUFPLENBQUMsR0FBc0I7O0FBRXBEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBIiwiZmlsZSI6IjYxLmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIGFycmF5V2l0aEhvbGVzID0gcmVxdWlyZShcIi4vYXJyYXlXaXRoSG9sZXMuanNcIik7XG5cbnZhciBpdGVyYWJsZVRvQXJyYXlMaW1pdCA9IHJlcXVpcmUoXCIuL2l0ZXJhYmxlVG9BcnJheUxpbWl0LmpzXCIpO1xuXG52YXIgdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkgPSByZXF1aXJlKFwiLi91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheS5qc1wiKTtcblxudmFyIG5vbkl0ZXJhYmxlUmVzdCA9IHJlcXVpcmUoXCIuL25vbkl0ZXJhYmxlUmVzdC5qc1wiKTtcblxuZnVuY3Rpb24gX3NsaWNlZFRvQXJyYXkoYXJyLCBpKSB7XG4gIHJldHVybiBhcnJheVdpdGhIb2xlcyhhcnIpIHx8IGl0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkgfHwgdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkoYXJyLCBpKSB8fCBub25JdGVyYWJsZVJlc3QoKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfc2xpY2VkVG9BcnJheTtcbm1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///61\n')},function(module,__webpack_exports__,__webpack_require__){"use strict";eval('/* unused harmony export version */\n/* harmony import */ var _shape__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(80);\n/* harmony import */ var _antv_g_base__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(21);\n/* harmony import */ var _canvas__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(277);\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Canvas", function() { return _canvas__WEBPACK_IMPORTED_MODULE_2__["a"]; });\n\n/* harmony import */ var _group__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(78);\n\n\n\n\n\nvar version = \'0.5.6\';\n//# sourceMappingURL=index.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy1zdmcvZXNtL2luZGV4LmpzP2JmYjEiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBaUM7QUFDSjtBQUNnQjtBQUNGO0FBQzFCO0FBQ1Y7QUFDUCIsImZpbGUiOiI2Mi5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIFNoYXBlIGZyb20gJy4vc2hhcGUnO1xuZXhwb3J0ICogZnJvbSAnQGFudHYvZy1iYXNlJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgQ2FudmFzIH0gZnJvbSAnLi9jYW52YXMnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBHcm91cCB9IGZyb20gJy4vZ3JvdXAnO1xuZXhwb3J0IHsgU2hhcGUgfTtcbmV4cG9ydCB2YXIgdmVyc2lvbiA9ICcwLjUuNic7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///62\n')},function(module,exports,__webpack_require__){eval("var add = __webpack_require__(266)\nvar set = __webpack_require__(265)\nvar normalize = __webpack_require__(273)\nvar subtract = __webpack_require__(172)\nvar dot = __webpack_require__(274)\n\nvar tmp = [0, 0]\n\nmodule.exports.computeMiter = function computeMiter(tangent, miter, lineA, lineB, halfThick) {\n //get tangent line\n add(tangent, lineA, lineB)\n normalize(tangent, tangent)\n\n //get miter as a unit vector\n set(miter, -tangent[1], tangent[0])\n set(tmp, -lineA[1], lineA[0])\n\n //get the necessary length of our miter\n return halfThick / dot(miter, tmp)\n}\n\nmodule.exports.normal = function normal(out, dir) {\n //get perpendicular\n set(out, -dir[1], dir[0])\n return out\n}\n\nmodule.exports.direction = function direction(out, a, b) {\n //get unit dir of two lines\n subtract(out, a, b)\n normalize(out, out)\n return out\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcG9seWxpbmUtbWl0ZXItdXRpbC9pbmRleC5qcz85MWE3Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFVBQVUsbUJBQU8sQ0FBQyxHQUFhO0FBQy9CLFVBQVUsbUJBQU8sQ0FBQyxHQUFhO0FBQy9CLGdCQUFnQixtQkFBTyxDQUFDLEdBQW1CO0FBQzNDLGVBQWUsbUJBQU8sQ0FBQyxHQUFrQjtBQUN6QyxVQUFVLG1CQUFPLENBQUMsR0FBYTs7QUFFL0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiI2My5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBhZGQgPSByZXF1aXJlKCdnbC12ZWMyL2FkZCcpXG52YXIgc2V0ID0gcmVxdWlyZSgnZ2wtdmVjMi9zZXQnKVxudmFyIG5vcm1hbGl6ZSA9IHJlcXVpcmUoJ2dsLXZlYzIvbm9ybWFsaXplJylcbnZhciBzdWJ0cmFjdCA9IHJlcXVpcmUoJ2dsLXZlYzIvc3VidHJhY3QnKVxudmFyIGRvdCA9IHJlcXVpcmUoJ2dsLXZlYzIvZG90JylcblxudmFyIHRtcCA9IFswLCAwXVxuXG5tb2R1bGUuZXhwb3J0cy5jb21wdXRlTWl0ZXIgPSBmdW5jdGlvbiBjb21wdXRlTWl0ZXIodGFuZ2VudCwgbWl0ZXIsIGxpbmVBLCBsaW5lQiwgaGFsZlRoaWNrKSB7XG4gICAgLy9nZXQgdGFuZ2VudCBsaW5lXG4gICAgYWRkKHRhbmdlbnQsIGxpbmVBLCBsaW5lQilcbiAgICBub3JtYWxpemUodGFuZ2VudCwgdGFuZ2VudClcblxuICAgIC8vZ2V0IG1pdGVyIGFzIGEgdW5pdCB2ZWN0b3JcbiAgICBzZXQobWl0ZXIsIC10YW5nZW50WzFdLCB0YW5nZW50WzBdKVxuICAgIHNldCh0bXAsIC1saW5lQVsxXSwgbGluZUFbMF0pXG5cbiAgICAvL2dldCB0aGUgbmVjZXNzYXJ5IGxlbmd0aCBvZiBvdXIgbWl0ZXJcbiAgICByZXR1cm4gaGFsZlRoaWNrIC8gZG90KG1pdGVyLCB0bXApXG59XG5cbm1vZHVsZS5leHBvcnRzLm5vcm1hbCA9IGZ1bmN0aW9uIG5vcm1hbChvdXQsIGRpcikge1xuICAgIC8vZ2V0IHBlcnBlbmRpY3VsYXJcbiAgICBzZXQob3V0LCAtZGlyWzFdLCBkaXJbMF0pXG4gICAgcmV0dXJuIG91dFxufVxuXG5tb2R1bGUuZXhwb3J0cy5kaXJlY3Rpb24gPSBmdW5jdGlvbiBkaXJlY3Rpb24ob3V0LCBhLCBiKSB7XG4gICAgLy9nZXQgdW5pdCBkaXIgb2YgdHdvIGxpbmVzXG4gICAgc3VidHJhY3Qob3V0LCBhLCBiKVxuICAgIG5vcm1hbGl6ZShvdXQsIG91dClcbiAgICByZXR1cm4gb3V0XG59Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///63\n")},function(module,exports,__webpack_require__){eval("var baseIsNative = __webpack_require__(334),\n getValue = __webpack_require__(339);\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n}\n\nmodule.exports = getNative;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19nZXROYXRpdmUuanM/MGIwNyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxtQkFBbUIsbUJBQU8sQ0FBQyxHQUFpQjtBQUM1QyxlQUFlLG1CQUFPLENBQUMsR0FBYTs7QUFFcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsRUFBRTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJmaWxlIjoiNjQuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYmFzZUlzTmF0aXZlID0gcmVxdWlyZSgnLi9fYmFzZUlzTmF0aXZlJyksXG4gICAgZ2V0VmFsdWUgPSByZXF1aXJlKCcuL19nZXRWYWx1ZScpO1xuXG4vKipcbiAqIEdldHMgdGhlIG5hdGl2ZSBmdW5jdGlvbiBhdCBga2V5YCBvZiBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBtZXRob2QgdG8gZ2V0LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGZ1bmN0aW9uIGlmIGl0J3MgbmF0aXZlLCBlbHNlIGB1bmRlZmluZWRgLlxuICovXG5mdW5jdGlvbiBnZXROYXRpdmUob2JqZWN0LCBrZXkpIHtcbiAgdmFyIHZhbHVlID0gZ2V0VmFsdWUob2JqZWN0LCBrZXkpO1xuICByZXR1cm4gYmFzZUlzTmF0aXZlKHZhbHVlKSA/IHZhbHVlIDogdW5kZWZpbmVkO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldE5hdGl2ZTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///64\n")},function(module,exports,__webpack_require__){eval("var Symbol = __webpack_require__(73),\n getRawTag = __webpack_require__(335),\n objectToString = __webpack_require__(336);\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n}\n\nmodule.exports = baseGetTag;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlR2V0VGFnLmpzPzM3MjkiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsYUFBYSxtQkFBTyxDQUFDLEVBQVc7QUFDaEMsZ0JBQWdCLG1CQUFPLENBQUMsR0FBYztBQUN0QyxxQkFBcUIsbUJBQU8sQ0FBQyxHQUFtQjs7QUFFaEQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEVBQUU7QUFDYixhQUFhLE9BQU87QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwiZmlsZSI6IjY1LmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIFN5bWJvbCA9IHJlcXVpcmUoJy4vX1N5bWJvbCcpLFxuICAgIGdldFJhd1RhZyA9IHJlcXVpcmUoJy4vX2dldFJhd1RhZycpLFxuICAgIG9iamVjdFRvU3RyaW5nID0gcmVxdWlyZSgnLi9fb2JqZWN0VG9TdHJpbmcnKTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIG51bGxUYWcgPSAnW29iamVjdCBOdWxsXScsXG4gICAgdW5kZWZpbmVkVGFnID0gJ1tvYmplY3QgVW5kZWZpbmVkXSc7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIHN5bVRvU3RyaW5nVGFnID0gU3ltYm9sID8gU3ltYm9sLnRvU3RyaW5nVGFnIDogdW5kZWZpbmVkO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBnZXRUYWdgIHdpdGhvdXQgZmFsbGJhY2tzIGZvciBidWdneSBlbnZpcm9ubWVudHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHF1ZXJ5LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgYHRvU3RyaW5nVGFnYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUdldFRhZyh2YWx1ZSkge1xuICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkVGFnIDogbnVsbFRhZztcbiAgfVxuICByZXR1cm4gKHN5bVRvU3RyaW5nVGFnICYmIHN5bVRvU3RyaW5nVGFnIGluIE9iamVjdCh2YWx1ZSkpXG4gICAgPyBnZXRSYXdUYWcodmFsdWUpXG4gICAgOiBvYmplY3RUb1N0cmluZyh2YWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUdldFRhZztcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///65\n")},function(module,exports,__webpack_require__){eval("var arrayLikeKeys = __webpack_require__(190),\n baseKeysIn = __webpack_require__(359),\n isArrayLike = __webpack_require__(54);\n\n/**\n * Creates an array of the own and inherited enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keysIn(new Foo);\n * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n */\nfunction keysIn(object) {\n return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);\n}\n\nmodule.exports = keysIn;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL2tleXNJbi5qcz85OTM0Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLG9CQUFvQixtQkFBTyxDQUFDLEdBQWtCO0FBQzlDLGlCQUFpQixtQkFBTyxDQUFDLEdBQWU7QUFDeEMsa0JBQWtCLG1CQUFPLENBQUMsRUFBZTs7QUFFekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsTUFBTTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJmaWxlIjoiNjYuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYXJyYXlMaWtlS2V5cyA9IHJlcXVpcmUoJy4vX2FycmF5TGlrZUtleXMnKSxcbiAgICBiYXNlS2V5c0luID0gcmVxdWlyZSgnLi9fYmFzZUtleXNJbicpLFxuICAgIGlzQXJyYXlMaWtlID0gcmVxdWlyZSgnLi9pc0FycmF5TGlrZScpO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIG93biBhbmQgaW5oZXJpdGVkIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgb2YgYG9iamVjdGAuXG4gKlxuICogKipOb3RlOioqIE5vbi1vYmplY3QgdmFsdWVzIGFyZSBjb2VyY2VkIHRvIG9iamVjdHMuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAzLjAuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAqIEBleGFtcGxlXG4gKlxuICogZnVuY3Rpb24gRm9vKCkge1xuICogICB0aGlzLmEgPSAxO1xuICogICB0aGlzLmIgPSAyO1xuICogfVxuICpcbiAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gKlxuICogXy5rZXlzSW4obmV3IEZvbyk7XG4gKiAvLyA9PiBbJ2EnLCAnYicsICdjJ10gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAqL1xuZnVuY3Rpb24ga2V5c0luKG9iamVjdCkge1xuICByZXR1cm4gaXNBcnJheUxpa2Uob2JqZWN0KSA/IGFycmF5TGlrZUtleXMob2JqZWN0LCB0cnVlKSA6IGJhc2VLZXlzSW4ob2JqZWN0KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBrZXlzSW47XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///66\n")},function(module,exports){eval("/**\n * This method returns the first argument it receives.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'a': 1 };\n *\n * console.log(_.identity(object) === object);\n * // => true\n */\nfunction identity(value) {\n return value;\n}\n\nmodule.exports = identity;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lkZW50aXR5LmpzP2NkOWQiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEVBQUU7QUFDYixhQUFhLEVBQUU7QUFDZjtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwiZmlsZSI6IjY3LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBmaXJzdCBhcmd1bWVudCBpdCByZWNlaXZlcy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgVXRpbFxuICogQHBhcmFtIHsqfSB2YWx1ZSBBbnkgdmFsdWUuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyBgdmFsdWVgLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEgfTtcbiAqXG4gKiBjb25zb2xlLmxvZyhfLmlkZW50aXR5KG9iamVjdCkgPT09IG9iamVjdCk7XG4gKiAvLyA9PiB0cnVlXG4gKi9cbmZ1bmN0aW9uIGlkZW50aXR5KHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpZGVudGl0eTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///67\n")},function(module,exports,__webpack_require__){"use strict";eval('\nObject.defineProperty(exports, "__esModule", { value: true });\nexports.id = void 0;\nvar idCounter = 0;\nfunction id() {\n return idCounter++;\n}\nexports.id = id;\n//# sourceMappingURL=id.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaW52ZXJzaWZ5L2xpYi91dGlscy9pZC5qcz83N2QzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFhO0FBQ2IsOENBQThDLGNBQWM7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiNjguanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuaWQgPSB2b2lkIDA7XG52YXIgaWRDb3VudGVyID0gMDtcbmZ1bmN0aW9uIGlkKCkge1xuICAgIHJldHVybiBpZENvdW50ZXIrKztcbn1cbmV4cG9ydHMuaWQgPSBpZDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWlkLmpzLm1hcCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///68\n')},function(module,__webpack_exports__,__webpack_require__){"use strict";eval('/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return getTextHeight; });\n/* unused harmony export getLineSpaceing */\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return getTextWidth; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return assembleFont; });\n/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(19);\n/* harmony import */ var _offscreen__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(120);\n\n\n/**\n * 获取文本的高度\n * @param text 文本\n * @param fontSize 字体大小\n * @param lineHeight 行高,可以为空\n */\nfunction getTextHeight(text, fontSize, lineHeight) {\n var lineCount = 1;\n if (Object(_util__WEBPACK_IMPORTED_MODULE_0__[/* isString */ "h"])(text)) {\n lineCount = text.split(\'\\n\').length;\n }\n if (lineCount > 1) {\n var spaceingY = getLineSpaceing(fontSize, lineHeight);\n return fontSize * lineCount + spaceingY * (lineCount - 1);\n }\n return fontSize;\n}\n/**\n * 获取行间距如果文本多行,需要获取文本间距\n * @param fontSize 字体大小\n * @param lineHeight 行高\n */\nfunction getLineSpaceing(fontSize, lineHeight) {\n return lineHeight ? lineHeight - fontSize : fontSize * 0.14;\n}\n/**\n * 字体宽度\n * @param text 文本\n * @param font 字体\n */\nfunction getTextWidth(text, font) {\n var context = Object(_offscreen__WEBPACK_IMPORTED_MODULE_1__[/* getOffScreenContext */ "a"])(); // 获取离屏的 ctx 进行计算\n var width = 0;\n // null 或者 undefined 时,宽度为 0\n if (Object(_util__WEBPACK_IMPORTED_MODULE_0__[/* isNil */ "e"])(text) || text === \'\') {\n return width;\n }\n context.save();\n context.font = font;\n if (Object(_util__WEBPACK_IMPORTED_MODULE_0__[/* isString */ "h"])(text) && text.includes(\'\\n\')) {\n var textArr = text.split(\'\\n\');\n Object(_util__WEBPACK_IMPORTED_MODULE_0__[/* each */ "a"])(textArr, function (subText) {\n var measureWidth = context.measureText(subText).width;\n if (width < measureWidth) {\n width = measureWidth;\n }\n });\n }\n else {\n width = context.measureText(text).width;\n }\n context.restore();\n return width;\n}\nfunction assembleFont(attrs) {\n var fontSize = attrs.fontSize, fontFamily = attrs.fontFamily, fontWeight = attrs.fontWeight, fontStyle = attrs.fontStyle, fontVariant = attrs.fontVariant;\n return [fontStyle, fontVariant, fontWeight, fontSize + "px", fontFamily].join(\' \').trim();\n}\n//# sourceMappingURL=text.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy1iYXNlL2VzbS91dGlsL3RleHQuanM/YmM4OCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBK0M7QUFDRztBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0EsUUFBUSw4REFBUTtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQLGtCQUFrQiw4RUFBbUIsR0FBRztBQUN4QztBQUNBO0FBQ0EsUUFBUSwyREFBSztBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSw4REFBUTtBQUNoQjtBQUNBLFFBQVEsMERBQUk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiNjkuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpc05pbCwgZWFjaCwgaXNTdHJpbmcgfSBmcm9tICcuL3V0aWwnO1xuaW1wb3J0IHsgZ2V0T2ZmU2NyZWVuQ29udGV4dCB9IGZyb20gJy4vb2Zmc2NyZWVuJztcbi8qKlxuICog6I635Y+W5paH5pys55qE6auY5bqmXG4gKiBAcGFyYW0gdGV4dCDmlofmnKxcbiAqIEBwYXJhbSBmb250U2l6ZSDlrZfkvZPlpKflsI9cbiAqIEBwYXJhbSBsaW5lSGVpZ2h0IOihjOmrmO+8jOWPr+S7peS4uuepulxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGV4dEhlaWdodCh0ZXh0LCBmb250U2l6ZSwgbGluZUhlaWdodCkge1xuICAgIHZhciBsaW5lQ291bnQgPSAxO1xuICAgIGlmIChpc1N0cmluZyh0ZXh0KSkge1xuICAgICAgICBsaW5lQ291bnQgPSB0ZXh0LnNwbGl0KCdcXG4nKS5sZW5ndGg7XG4gICAgfVxuICAgIGlmIChsaW5lQ291bnQgPiAxKSB7XG4gICAgICAgIHZhciBzcGFjZWluZ1kgPSBnZXRMaW5lU3BhY2VpbmcoZm9udFNpemUsIGxpbmVIZWlnaHQpO1xuICAgICAgICByZXR1cm4gZm9udFNpemUgKiBsaW5lQ291bnQgKyBzcGFjZWluZ1kgKiAobGluZUNvdW50IC0gMSk7XG4gICAgfVxuICAgIHJldHVybiBmb250U2l6ZTtcbn1cbi8qKlxuICog6I635Y+W6KGM6Ze06Led5aaC5p6c5paH5pys5aSa6KGM77yM6ZyA6KaB6I635Y+W5paH5pys6Ze06LedXG4gKiBAcGFyYW0gZm9udFNpemUg5a2X5L2T5aSn5bCPXG4gKiBAcGFyYW0gbGluZUhlaWdodCDooYzpq5hcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldExpbmVTcGFjZWluZyhmb250U2l6ZSwgbGluZUhlaWdodCkge1xuICAgIHJldHVybiBsaW5lSGVpZ2h0ID8gbGluZUhlaWdodCAtIGZvbnRTaXplIDogZm9udFNpemUgKiAwLjE0O1xufVxuLyoqXG4gKiDlrZfkvZPlrr3luqZcbiAqIEBwYXJhbSB0ZXh0IOaWh+acrFxuICogQHBhcmFtIGZvbnQg5a2X5L2TXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUZXh0V2lkdGgodGV4dCwgZm9udCkge1xuICAgIHZhciBjb250ZXh0ID0gZ2V0T2ZmU2NyZWVuQ29udGV4dCgpOyAvLyDojrflj5bnprvlsY/nmoQgY3R4IOi/m+ihjOiuoeeul1xuICAgIHZhciB3aWR0aCA9IDA7XG4gICAgLy8gbnVsbCDmiJbogIUgdW5kZWZpbmVkIOaXtu+8jOWuveW6puS4uiAwXG4gICAgaWYgKGlzTmlsKHRleHQpIHx8IHRleHQgPT09ICcnKSB7XG4gICAgICAgIHJldHVybiB3aWR0aDtcbiAgICB9XG4gICAgY29udGV4dC5zYXZlKCk7XG4gICAgY29udGV4dC5mb250ID0gZm9udDtcbiAgICBpZiAoaXNTdHJpbmcodGV4dCkgJiYgdGV4dC5pbmNsdWRlcygnXFxuJykpIHtcbiAgICAgICAgdmFyIHRleHRBcnIgPSB0ZXh0LnNwbGl0KCdcXG4nKTtcbiAgICAgICAgZWFjaCh0ZXh0QXJyLCBmdW5jdGlvbiAoc3ViVGV4dCkge1xuICAgICAgICAgICAgdmFyIG1lYXN1cmVXaWR0aCA9IGNvbnRleHQubWVhc3VyZVRleHQoc3ViVGV4dCkud2lkdGg7XG4gICAgICAgICAgICBpZiAod2lkdGggPCBtZWFzdXJlV2lkdGgpIHtcbiAgICAgICAgICAgICAgICB3aWR0aCA9IG1lYXN1cmVXaWR0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB3aWR0aCA9IGNvbnRleHQubWVhc3VyZVRleHQodGV4dCkud2lkdGg7XG4gICAgfVxuICAgIGNvbnRleHQucmVzdG9yZSgpO1xuICAgIHJldHVybiB3aWR0aDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlbWJsZUZvbnQoYXR0cnMpIHtcbiAgICB2YXIgZm9udFNpemUgPSBhdHRycy5mb250U2l6ZSwgZm9udEZhbWlseSA9IGF0dHJzLmZvbnRGYW1pbHksIGZvbnRXZWlnaHQgPSBhdHRycy5mb250V2VpZ2h0LCBmb250U3R5bGUgPSBhdHRycy5mb250U3R5bGUsIGZvbnRWYXJpYW50ID0gYXR0cnMuZm9udFZhcmlhbnQ7XG4gICAgcmV0dXJuIFtmb250U3R5bGUsIGZvbnRWYXJpYW50LCBmb250V2VpZ2h0LCBmb250U2l6ZSArIFwicHhcIiwgZm9udEZhbWlseV0uam9pbignICcpLnRyaW0oKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRleHQuanMubWFwIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///69\n')},function(module,__webpack_exports__,__webpack_require__){"use strict";eval('/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return PixelPickingPass; });\n/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(9);\n/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(15);\n/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _babel_runtime_helpers_initializerDefineProperty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(10);\n/* harmony import */ var _babel_runtime_helpers_initializerDefineProperty__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_initializerDefineProperty__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(6);\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(7);\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _babel_runtime_helpers_applyDecoratedDescriptor__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(11);\n/* harmony import */ var _babel_runtime_helpers_applyDecoratedDescriptor__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_applyDecoratedDescriptor__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _babel_runtime_helpers_initializerWarningHelper__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(29);\n/* harmony import */ var _babel_runtime_helpers_initializerWarningHelper__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_initializerWarningHelper__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var inversify__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(5);\n/* harmony import */ var inversify__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(inversify__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var _identifier__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(13);\n/* harmony import */ var _utils_math__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(143);\n/* harmony import */ var _RenderPass__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(51);\n\n\n\n\n\n\n\n\nvar _dec, _dec2, _dec3, _dec4, _dec5, _class, _class2, _descriptor, _descriptor2, _descriptor3, _descriptor4, _class3, _temp;\n\nfunction _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\n\n\n\n\nvar PickingStage = {\n NONE: 0.0,\n ENCODE: 1.0,\n HIGHLIGHT: 2.0\n};\n/**\n * color-based picking\n * @see https://threejsfundamentals.org/threejs/lessons/threejs-picking.html\n */\n\nvar PixelPickingPass = (_dec = Object(inversify__WEBPACK_IMPORTED_MODULE_7__["injectable"])(), _dec2 = Object(inversify__WEBPACK_IMPORTED_MODULE_7__["inject"])(_identifier__WEBPACK_IMPORTED_MODULE_8__[/* IDENTIFIER */ "a"].RenderEngine), _dec3 = Object(inversify__WEBPACK_IMPORTED_MODULE_7__["inject"])(_identifier__WEBPACK_IMPORTED_MODULE_8__[/* IDENTIFIER */ "a"].ResourcePool), _dec4 = Object(inversify__WEBPACK_IMPORTED_MODULE_7__["inject"])(_identifier__WEBPACK_IMPORTED_MODULE_8__[/* IDENTIFIER */ "a"].RenderPassFactory), _dec5 = Object(inversify__WEBPACK_IMPORTED_MODULE_7__["inject"])(_identifier__WEBPACK_IMPORTED_MODULE_8__[/* IDENTIFIER */ "a"].MeshComponentManager), _dec(_class = (_class2 = (_temp = _class3 = /*#__PURE__*/function () {\n function PixelPickingPass() {\n var _this = this;\n\n _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3___default()(this, PixelPickingPass);\n\n _babel_runtime_helpers_initializerDefineProperty__WEBPACK_IMPORTED_MODULE_2___default()(this, "engine", _descriptor, this);\n\n _babel_runtime_helpers_initializerDefineProperty__WEBPACK_IMPORTED_MODULE_2___default()(this, "resourcePool", _descriptor2, this);\n\n _babel_runtime_helpers_initializerDefineProperty__WEBPACK_IMPORTED_MODULE_2___default()(this, "renderPassFactory", _descriptor3, this);\n\n _babel_runtime_helpers_initializerDefineProperty__WEBPACK_IMPORTED_MODULE_2___default()(this, "mesh", _descriptor4, this);\n\n this.pickingFBO = void 0;\n this.views = void 0;\n this.highlightEnabled = true;\n this.highlightColor = [255, 0, 0, 255];\n this.alreadyInRendering = false;\n\n this.setup = function (fg, passNode, pass) {\n var output = fg.createRenderTarget(passNode, \'picking fbo\', {\n width: 1,\n height: 1\n });\n pass.data = {\n output: passNode.write(fg, output)\n }; // 防止被 FrameGraph 剔除\n\n passNode.hasSideEffect = true;\n };\n\n this.execute = /*#__PURE__*/function () {\n var _ref = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee(fg, pass, views) {\n var _iterator, _step, _loop;\n\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n _this.views = views;\n\n if (!_this.alreadyInRendering) {\n _context.next = 3;\n break;\n }\n\n return _context.abrupt("return");\n\n case 3:\n _iterator = _createForOfIteratorHelper(views);\n\n try {\n _loop = function _loop() {\n var view = _step.value;\n\n var _view$getViewport = view.getViewport(),\n width = _view$getViewport.width,\n height = _view$getViewport.height; // throttled\n\n\n _this.alreadyInRendering = true; // 实例化资源\n\n var resourceNode = fg.getResourceNode(pass.data.output);\n _this.pickingFBO = _this.resourcePool.getOrCreateResource(resourceNode.resource); // TODO: only draw 1x1 quad, with offset camera\n\n _this.pickingFBO.resize({\n width: width,\n height: height\n });\n\n _this.engine.useFramebuffer(_this.pickingFBO, function () {\n _this.engine.clear({\n framebuffer: _this.pickingFBO,\n color: [0, 0, 0, 0],\n stencil: 0,\n depth: 1\n }); // 渲染\n\n\n var renderPass = _this.renderPassFactory(_RenderPass__WEBPACK_IMPORTED_MODULE_10__[/* RenderPass */ "a"].IDENTIFIER); // 修改所有\n\n\n var meshes = [];\n var scene = view.getScene();\n\n var _iterator2 = _createForOfIteratorHelper(scene.getEntities()),\n _step2;\n\n try {\n for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {\n var meshEntity = _step2.value;\n\n var mesh = _this.mesh.getComponentByEntity(meshEntity);\n\n var material = mesh.material;\n material.setUniform(\'u_PickingStage\', PickingStage.ENCODE);\n meshes.push(mesh);\n } // @ts-ignore\n\n } catch (err) {\n _iterator2.e(err);\n } finally {\n _iterator2.f();\n }\n\n renderPass.renderView(view);\n meshes.forEach(function (mesh) {\n var material = mesh.material;\n material.setUniform(\'u_PickingStage\', PickingStage.HIGHLIGHT);\n });\n _this.alreadyInRendering = false;\n });\n };\n\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n _loop();\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n\n case 5:\n case "end":\n return _context.stop();\n }\n }\n }, _callee);\n }));\n\n return function (_x, _x2, _x3) {\n return _ref.apply(this, arguments);\n };\n }();\n\n this.pick = function (_ref2, view) {\n var x = _ref2.x,\n y = _ref2.y;\n var _this$engine = _this.engine,\n readPixels = _this$engine.readPixels,\n useFramebuffer = _this$engine.useFramebuffer;\n\n var _view$getViewport2 = view.getViewport(),\n width = _view$getViewport2.width,\n height = _view$getViewport2.height;\n\n var xInDevicePixel = x * window.devicePixelRatio;\n var yInDevicePixel = y * window.devicePixelRatio; // const xInDevicePixel = x;\n // const yInDevicePixel = y;\n\n if (xInDevicePixel > width || xInDevicePixel < 0 || yInDevicePixel > height || yInDevicePixel < 0) {\n return;\n }\n\n var pickedColors;\n var pickedFeatureIdx;\n useFramebuffer(_this.pickingFBO, function () {\n // avoid realloc\n pickedColors = readPixels({\n x: Math.round(xInDevicePixel),\n // 视口坐标系原点在左上,而 WebGL 在左下,需要翻转 Y 轴\n y: Math.round(height - (y + 1) * window.devicePixelRatio),\n // y: Math.round(height - (y + 1)),\n width: 1,\n height: 1,\n data: new Uint8Array(1 * 1 * 4),\n framebuffer: _this.pickingFBO\n });\n\n if (pickedColors[0] !== 0 || pickedColors[1] !== 0 || pickedColors[2] !== 0) {\n pickedFeatureIdx = Object(_utils_math__WEBPACK_IMPORTED_MODULE_9__[/* decodePickingColor */ "a"])(pickedColors);\n\n if (_this.highlightEnabled) {\n // 高亮\n _this.highlightPickedFeature(pickedColors, view);\n }\n }\n });\n return pickedFeatureIdx;\n };\n }\n\n _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4___default()(PixelPickingPass, [{\n key: "enableHighlight",\n value: function enableHighlight(enabled) {\n this.highlightEnabled = enabled;\n }\n }, {\n key: "setHighlightColor",\n value: function setHighlightColor(color) {\n this.highlightColor = color;\n }\n }, {\n key: "highlightPickedFeature",\n\n /**\n * highlight 如果直接修改选中 feature 的 buffer,存在两个问题:\n * 1. 鼠标移走时无法恢复\n * 2. 无法实现高亮颜色与原始原色的 alpha 混合\n * 因此高亮还是放在 shader 中做比较好\n */\n value: function highlightPickedFeature(pickedColors, view) {\n if (pickedColors) {\n var _iterator3 = _createForOfIteratorHelper(view.getScene().getEntities()),\n _step3;\n\n try {\n for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {\n var meshEntity = _step3.value;\n var mesh = this.mesh.getComponentByEntity(meshEntity);\n var material = mesh.material;\n material.setUniform(\'u_PickingStage\', PickingStage.HIGHLIGHT);\n material.setUniform(\'u_PickingColor\', [pickedColors[0], pickedColors[1], pickedColors[2]]);\n material.setUniform(\'u_HighlightColor\', this.highlightColor);\n }\n } catch (err) {\n _iterator3.e(err);\n } finally {\n _iterator3.f();\n }\n }\n }\n }]);\n\n return PixelPickingPass;\n}(), _class3.IDENTIFIER = \'PixelPicking Pass\', _temp), (_descriptor = _babel_runtime_helpers_applyDecoratedDescriptor__WEBPACK_IMPORTED_MODULE_5___default()(_class2.prototype, "engine", [_dec2], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n}), _descriptor2 = _babel_runtime_helpers_applyDecoratedDescriptor__WEBPACK_IMPORTED_MODULE_5___default()(_class2.prototype, "resourcePool", [_dec3], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n}), _descriptor3 = _babel_runtime_helpers_applyDecoratedDescriptor__WEBPACK_IMPORTED_MODULE_5___default()(_class2.prototype, "renderPassFactory", [_dec4], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n}), _descriptor4 = _babel_runtime_helpers_applyDecoratedDescriptor__WEBPACK_IMPORTED_MODULE_5___default()(_class2.prototype, "mesh", [_dec5], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n})), _class2)) || _class);\n//# sourceMappingURL=PixelPickingPass.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy13ZWJncHUtY29yZS9lcy9jb21wb25lbnRzL3JlbmRlcmVyL3Bhc3Nlcy9QaXhlbFBpY2tpbmdQYXNzLmpzPzE2NTEiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUE2RDtBQUNXO0FBQ2tCO0FBQ3RCO0FBQ047QUFDMEI7QUFDQTs7QUFFeEY7O0FBRUEsd0RBQXdELFFBQVEsbUVBQW1FLHdIQUF3SCxnQkFBZ0IsV0FBVyx5QkFBeUIsU0FBUyx3QkFBd0IsNEJBQTRCLGNBQWMsU0FBUyw4QkFBOEIsRUFBRSxxQkFBcUIsVUFBVSxFQUFFLFNBQVMsRUFBRSw4SkFBOEosRUFBRSxrREFBa0QsU0FBUyxrQkFBa0IsMkJBQTJCLEVBQUUsbUJBQW1CLHNCQUFzQiw4QkFBOEIsYUFBYSxFQUFFLHNCQUFzQixlQUFlLFdBQVcsRUFBRSxtQkFBbUIsTUFBTSx5REFBeUQsRUFBRSxVQUFVLHVCQUF1QixFQUFFLEVBQUUsR0FBRzs7QUFFNzlCLGlEQUFpRCxnQkFBZ0IsZ0VBQWdFLHdEQUF3RCw2REFBNkQsc0RBQXNELGtIQUFrSDs7QUFFOVosc0NBQXNDLHVEQUF1RCx1Q0FBdUMsU0FBUyxPQUFPLGtCQUFrQixFQUFFLGFBQWE7O0FBRXRJO0FBQ0U7QUFDUTtBQUNmO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFTywrQkFBK0IsNERBQVUsWUFBWSx3REFBTSxDQUFDLDhEQUFVLHdCQUF3Qix3REFBTSxDQUFDLDhEQUFVLHdCQUF3Qix3REFBTSxDQUFDLDhEQUFVLDZCQUE2Qix3REFBTSxDQUFDLDhEQUFVO0FBQzdNO0FBQ0E7O0FBRUEsSUFBSSw0RUFBZTs7QUFFbkIsSUFBSSx1RkFBMEI7O0FBRTlCLElBQUksdUZBQTBCOztBQUU5QixJQUFJLHVGQUEwQjs7QUFFOUIsSUFBSSx1RkFBMEI7O0FBRTlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLFFBQVE7O0FBRVI7QUFDQTs7QUFFQTtBQUNBLGlCQUFpQiw4RUFBaUIsZUFBZSxpRUFBbUI7QUFDcEU7O0FBRUEsZUFBZSxpRUFBbUI7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDBEQUEwRDs7O0FBRzFELG9EQUFvRDs7QUFFcEQ7QUFDQSxxR0FBcUc7O0FBRXJHO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjs7QUFFckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLEVBQUU7OztBQUd6QiwrREFBK0QsK0RBQVUsYUFBYTs7O0FBR3RGO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLDRDQUE0QyxpQ0FBaUM7QUFDN0U7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EseUJBQXlCOztBQUV6Qix1QkFBdUI7QUFDdkI7QUFDQSx1QkFBdUI7QUFDdkI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QjtBQUN2QjtBQUNBLHFCQUFxQjtBQUNyQjs7QUFFQSxxQ0FBcUMsK0JBQStCO0FBQ3BFO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87O0FBRVA7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsdURBQXVEO0FBQ3ZEOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQSw2QkFBNkIsOEVBQWtCOztBQUUvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQSxFQUFFLHlFQUFZO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw4QkFBOEIsaUNBQWlDO0FBQy9EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBLENBQUMscUVBQXFFLHNGQUF5QjtBQUMvRjtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsa0JBQWtCLHNGQUF5QjtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsa0JBQWtCLHNGQUF5QjtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsa0JBQWtCLHNGQUF5QjtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRCIsImZpbGUiOiI3MC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfcmVnZW5lcmF0b3JSdW50aW1lIGZyb20gXCJAYmFiZWwvcnVudGltZS9yZWdlbmVyYXRvclwiO1xuaW1wb3J0IF9hc3luY1RvR2VuZXJhdG9yIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2FzeW5jVG9HZW5lcmF0b3JcIjtcbmltcG9ydCBfaW5pdGlhbGl6ZXJEZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbml0aWFsaXplckRlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrXCI7XG5pbXBvcnQgX2NyZWF0ZUNsYXNzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzXCI7XG5pbXBvcnQgX2FwcGx5RGVjb3JhdGVkRGVzY3JpcHRvciBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hcHBseURlY29yYXRlZERlc2NyaXB0b3JcIjtcbmltcG9ydCBfaW5pdGlhbGl6ZXJXYXJuaW5nSGVscGVyIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2luaXRpYWxpemVyV2FybmluZ0hlbHBlclwiO1xuXG52YXIgX2RlYywgX2RlYzIsIF9kZWMzLCBfZGVjNCwgX2RlYzUsIF9jbGFzcywgX2NsYXNzMiwgX2Rlc2NyaXB0b3IsIF9kZXNjcmlwdG9yMiwgX2Rlc2NyaXB0b3IzLCBfZGVzY3JpcHRvcjQsIF9jbGFzczMsIF90ZW1wO1xuXG5mdW5jdGlvbiBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihvLCBhbGxvd0FycmF5TGlrZSkgeyB2YXIgaXQ7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcInVuZGVmaW5lZFwiIHx8IG9bU3ltYm9sLml0ZXJhdG9yXSA9PSBudWxsKSB7IGlmIChBcnJheS5pc0FycmF5KG8pIHx8IChpdCA9IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvKSkgfHwgYWxsb3dBcnJheUxpa2UgJiYgbyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHsgaWYgKGl0KSBvID0gaXQ7IHZhciBpID0gMDsgdmFyIEYgPSBmdW5jdGlvbiBGKCkge307IHJldHVybiB7IHM6IEYsIG46IGZ1bmN0aW9uIG4oKSB7IGlmIChpID49IG8ubGVuZ3RoKSByZXR1cm4geyBkb25lOiB0cnVlIH07IHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogb1tpKytdIH07IH0sIGU6IGZ1bmN0aW9uIGUoX2UpIHsgdGhyb3cgX2U7IH0sIGY6IEYgfTsgfSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH0gdmFyIG5vcm1hbENvbXBsZXRpb24gPSB0cnVlLCBkaWRFcnIgPSBmYWxzZSwgZXJyOyByZXR1cm4geyBzOiBmdW5jdGlvbiBzKCkgeyBpdCA9IG9bU3ltYm9sLml0ZXJhdG9yXSgpOyB9LCBuOiBmdW5jdGlvbiBuKCkgeyB2YXIgc3RlcCA9IGl0Lm5leHQoKTsgbm9ybWFsQ29tcGxldGlvbiA9IHN0ZXAuZG9uZTsgcmV0dXJuIHN0ZXA7IH0sIGU6IGZ1bmN0aW9uIGUoX2UyKSB7IGRpZEVyciA9IHRydWU7IGVyciA9IF9lMjsgfSwgZjogZnVuY3Rpb24gZigpIHsgdHJ5IHsgaWYgKCFub3JtYWxDb21wbGV0aW9uICYmIGl0LnJldHVybiAhPSBudWxsKSBpdC5yZXR1cm4oKTsgfSBmaW5hbGx5IHsgaWYgKGRpZEVycikgdGhyb3cgZXJyOyB9IH0gfTsgfVxuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IH1cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9XG5cbmltcG9ydCB7IGluamVjdCwgaW5qZWN0YWJsZSB9IGZyb20gJ2ludmVyc2lmeSc7XG5pbXBvcnQgeyBJREVOVElGSUVSIH0gZnJvbSAnLi4vLi4vLi4vaWRlbnRpZmllcic7XG5pbXBvcnQgeyBkZWNvZGVQaWNraW5nQ29sb3IgfSBmcm9tICcuLi8uLi8uLi91dGlscy9tYXRoJztcbmltcG9ydCB7IFJlbmRlclBhc3MgfSBmcm9tICcuL1JlbmRlclBhc3MnO1xudmFyIFBpY2tpbmdTdGFnZSA9IHtcbiAgTk9ORTogMC4wLFxuICBFTkNPREU6IDEuMCxcbiAgSElHSExJR0hUOiAyLjBcbn07XG4vKipcbiAqIGNvbG9yLWJhc2VkIHBpY2tpbmdcbiAqIEBzZWUgaHR0cHM6Ly90aHJlZWpzZnVuZGFtZW50YWxzLm9yZy90aHJlZWpzL2xlc3NvbnMvdGhyZWVqcy1waWNraW5nLmh0bWxcbiAqL1xuXG5leHBvcnQgdmFyIFBpeGVsUGlja2luZ1Bhc3MgPSAoX2RlYyA9IGluamVjdGFibGUoKSwgX2RlYzIgPSBpbmplY3QoSURFTlRJRklFUi5SZW5kZXJFbmdpbmUpLCBfZGVjMyA9IGluamVjdChJREVOVElGSUVSLlJlc291cmNlUG9vbCksIF9kZWM0ID0gaW5qZWN0KElERU5USUZJRVIuUmVuZGVyUGFzc0ZhY3RvcnkpLCBfZGVjNSA9IGluamVjdChJREVOVElGSUVSLk1lc2hDb21wb25lbnRNYW5hZ2VyKSwgX2RlYyhfY2xhc3MgPSAoX2NsYXNzMiA9IChfdGVtcCA9IF9jbGFzczMgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBQaXhlbFBpY2tpbmdQYXNzKCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUGl4ZWxQaWNraW5nUGFzcyk7XG5cbiAgICBfaW5pdGlhbGl6ZXJEZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImVuZ2luZVwiLCBfZGVzY3JpcHRvciwgdGhpcyk7XG5cbiAgICBfaW5pdGlhbGl6ZXJEZWZpbmVQcm9wZXJ0eSh0aGlzLCBcInJlc291cmNlUG9vbFwiLCBfZGVzY3JpcHRvcjIsIHRoaXMpO1xuXG4gICAgX2luaXRpYWxpemVyRGVmaW5lUHJvcGVydHkodGhpcywgXCJyZW5kZXJQYXNzRmFjdG9yeVwiLCBfZGVzY3JpcHRvcjMsIHRoaXMpO1xuXG4gICAgX2luaXRpYWxpemVyRGVmaW5lUHJvcGVydHkodGhpcywgXCJtZXNoXCIsIF9kZXNjcmlwdG9yNCwgdGhpcyk7XG5cbiAgICB0aGlzLnBpY2tpbmdGQk8gPSB2b2lkIDA7XG4gICAgdGhpcy52aWV3cyA9IHZvaWQgMDtcbiAgICB0aGlzLmhpZ2hsaWdodEVuYWJsZWQgPSB0cnVlO1xuICAgIHRoaXMuaGlnaGxpZ2h0Q29sb3IgPSBbMjU1LCAwLCAwLCAyNTVdO1xuICAgIHRoaXMuYWxyZWFkeUluUmVuZGVyaW5nID0gZmFsc2U7XG5cbiAgICB0aGlzLnNldHVwID0gZnVuY3Rpb24gKGZnLCBwYXNzTm9kZSwgcGFzcykge1xuICAgICAgdmFyIG91dHB1dCA9IGZnLmNyZWF0ZVJlbmRlclRhcmdldChwYXNzTm9kZSwgJ3BpY2tpbmcgZmJvJywge1xuICAgICAgICB3aWR0aDogMSxcbiAgICAgICAgaGVpZ2h0OiAxXG4gICAgICB9KTtcbiAgICAgIHBhc3MuZGF0YSA9IHtcbiAgICAgICAgb3V0cHV0OiBwYXNzTm9kZS53cml0ZShmZywgb3V0cHV0KVxuICAgICAgfTsgLy8g6Ziy5q2i6KKrIEZyYW1lR3JhcGgg5YmU6ZmkXG5cbiAgICAgIHBhc3NOb2RlLmhhc1NpZGVFZmZlY3QgPSB0cnVlO1xuICAgIH07XG5cbiAgICB0aGlzLmV4ZWN1dGUgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF9yZWYgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUubWFyayhmdW5jdGlvbiBfY2FsbGVlKGZnLCBwYXNzLCB2aWV3cykge1xuICAgICAgICB2YXIgX2l0ZXJhdG9yLCBfc3RlcCwgX2xvb3A7XG5cbiAgICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUud3JhcChmdW5jdGlvbiBfY2FsbGVlJChfY29udGV4dCkge1xuICAgICAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7XG4gICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICBfdGhpcy52aWV3cyA9IHZpZXdzO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFfdGhpcy5hbHJlYWR5SW5SZW5kZXJpbmcpIHtcbiAgICAgICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAzO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmFicnVwdChcInJldHVyblwiKTtcblxuICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIodmlld3MpO1xuXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgIF9sb29wID0gZnVuY3Rpb24gX2xvb3AoKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB2aWV3ID0gX3N0ZXAudmFsdWU7XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIF92aWV3JGdldFZpZXdwb3J0ID0gdmlldy5nZXRWaWV3cG9ydCgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGggPSBfdmlldyRnZXRWaWV3cG9ydC53aWR0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCA9IF92aWV3JGdldFZpZXdwb3J0LmhlaWdodDsgLy8gdGhyb3R0bGVkXG5cblxuICAgICAgICAgICAgICAgICAgICBfdGhpcy5hbHJlYWR5SW5SZW5kZXJpbmcgPSB0cnVlOyAvLyDlrp7kvovljJbotYTmupBcblxuICAgICAgICAgICAgICAgICAgICB2YXIgcmVzb3VyY2VOb2RlID0gZmcuZ2V0UmVzb3VyY2VOb2RlKHBhc3MuZGF0YS5vdXRwdXQpO1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy5waWNraW5nRkJPID0gX3RoaXMucmVzb3VyY2VQb29sLmdldE9yQ3JlYXRlUmVzb3VyY2UocmVzb3VyY2VOb2RlLnJlc291cmNlKTsgLy8gVE9ETzogb25seSBkcmF3IDF4MSBxdWFkLCB3aXRoIG9mZnNldCBjYW1lcmFcblxuICAgICAgICAgICAgICAgICAgICBfdGhpcy5waWNraW5nRkJPLnJlc2l6ZSh7XG4gICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHdpZHRoLFxuICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogaGVpZ2h0XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIF90aGlzLmVuZ2luZS51c2VGcmFtZWJ1ZmZlcihfdGhpcy5waWNraW5nRkJPLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgX3RoaXMuZW5naW5lLmNsZWFyKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lYnVmZmVyOiBfdGhpcy5waWNraW5nRkJPLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6IFswLCAwLCAwLCAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZW5jaWw6IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXB0aDogMVxuICAgICAgICAgICAgICAgICAgICAgIH0pOyAvLyDmuLLmn5NcblxuXG4gICAgICAgICAgICAgICAgICAgICAgdmFyIHJlbmRlclBhc3MgPSBfdGhpcy5yZW5kZXJQYXNzRmFjdG9yeShSZW5kZXJQYXNzLklERU5USUZJRVIpOyAvLyDkv67mlLnmiYDmnIlcblxuXG4gICAgICAgICAgICAgICAgICAgICAgdmFyIG1lc2hlcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgIHZhciBzY2VuZSA9IHZpZXcuZ2V0U2NlbmUoKTtcblxuICAgICAgICAgICAgICAgICAgICAgIHZhciBfaXRlcmF0b3IyID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoc2NlbmUuZ2V0RW50aXRpZXMoKSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIF9zdGVwMjtcblxuICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKF9pdGVyYXRvcjIucygpOyAhKF9zdGVwMiA9IF9pdGVyYXRvcjIubigpKS5kb25lOykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWVzaEVudGl0eSA9IF9zdGVwMi52YWx1ZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWVzaCA9IF90aGlzLm1lc2guZ2V0Q29tcG9uZW50QnlFbnRpdHkobWVzaEVudGl0eSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1hdGVyaWFsID0gbWVzaC5tYXRlcmlhbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0ZXJpYWwuc2V0VW5pZm9ybSgndV9QaWNraW5nU3RhZ2UnLCBQaWNraW5nU3RhZ2UuRU5DT0RFKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzaGVzLnB1c2gobWVzaCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IC8vIEB0cy1pZ25vcmVcblxuICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgX2l0ZXJhdG9yMi5lKGVycik7XG4gICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9pdGVyYXRvcjIuZigpO1xuICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgIHJlbmRlclBhc3MucmVuZGVyVmlldyh2aWV3KTtcbiAgICAgICAgICAgICAgICAgICAgICBtZXNoZXMuZm9yRWFjaChmdW5jdGlvbiAobWVzaCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1hdGVyaWFsID0gbWVzaC5tYXRlcmlhbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGVyaWFsLnNldFVuaWZvcm0oJ3VfUGlja2luZ1N0YWdlJywgUGlja2luZ1N0YWdlLkhJR0hMSUdIVCk7XG4gICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgX3RoaXMuYWxyZWFkeUluUmVuZGVyaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgZm9yIChfaXRlcmF0b3IucygpOyAhKF9zdGVwID0gX2l0ZXJhdG9yLm4oKSkuZG9uZTspIHtcbiAgICAgICAgICAgICAgICAgICAgX2xvb3AoKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgIF9pdGVyYXRvci5lKGVycik7XG4gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgIF9pdGVyYXRvci5mKCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LCBfY2FsbGVlKTtcbiAgICAgIH0pKTtcblxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChfeCwgX3gyLCBfeDMpIHtcbiAgICAgICAgcmV0dXJuIF9yZWYuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH07XG4gICAgfSgpO1xuXG4gICAgdGhpcy5waWNrID0gZnVuY3Rpb24gKF9yZWYyLCB2aWV3KSB7XG4gICAgICB2YXIgeCA9IF9yZWYyLngsXG4gICAgICAgICAgeSA9IF9yZWYyLnk7XG4gICAgICB2YXIgX3RoaXMkZW5naW5lID0gX3RoaXMuZW5naW5lLFxuICAgICAgICAgIHJlYWRQaXhlbHMgPSBfdGhpcyRlbmdpbmUucmVhZFBpeGVscyxcbiAgICAgICAgICB1c2VGcmFtZWJ1ZmZlciA9IF90aGlzJGVuZ2luZS51c2VGcmFtZWJ1ZmZlcjtcblxuICAgICAgdmFyIF92aWV3JGdldFZpZXdwb3J0MiA9IHZpZXcuZ2V0Vmlld3BvcnQoKSxcbiAgICAgICAgICB3aWR0aCA9IF92aWV3JGdldFZpZXdwb3J0Mi53aWR0aCxcbiAgICAgICAgICBoZWlnaHQgPSBfdmlldyRnZXRWaWV3cG9ydDIuaGVpZ2h0O1xuXG4gICAgICB2YXIgeEluRGV2aWNlUGl4ZWwgPSB4ICogd2luZG93LmRldmljZVBpeGVsUmF0aW87XG4gICAgICB2YXIgeUluRGV2aWNlUGl4ZWwgPSB5ICogd2luZG93LmRldmljZVBpeGVsUmF0aW87IC8vIGNvbnN0IHhJbkRldmljZVBpeGVsID0geDtcbiAgICAgIC8vIGNvbnN0IHlJbkRldmljZVBpeGVsID0geTtcblxuICAgICAgaWYgKHhJbkRldmljZVBpeGVsID4gd2lkdGggfHwgeEluRGV2aWNlUGl4ZWwgPCAwIHx8IHlJbkRldmljZVBpeGVsID4gaGVpZ2h0IHx8IHlJbkRldmljZVBpeGVsIDwgMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBwaWNrZWRDb2xvcnM7XG4gICAgICB2YXIgcGlja2VkRmVhdHVyZUlkeDtcbiAgICAgIHVzZUZyYW1lYnVmZmVyKF90aGlzLnBpY2tpbmdGQk8sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gYXZvaWQgcmVhbGxvY1xuICAgICAgICBwaWNrZWRDb2xvcnMgPSByZWFkUGl4ZWxzKHtcbiAgICAgICAgICB4OiBNYXRoLnJvdW5kKHhJbkRldmljZVBpeGVsKSxcbiAgICAgICAgICAvLyDop4blj6PlnZDmoIfns7vljp/ngrnlnKjlt6bkuIrvvIzogIwgV2ViR0wg5Zyo5bem5LiL77yM6ZyA6KaB57+76L2sIFkg6L20XG4gICAgICAgICAgeTogTWF0aC5yb3VuZChoZWlnaHQgLSAoeSArIDEpICogd2luZG93LmRldmljZVBpeGVsUmF0aW8pLFxuICAgICAgICAgIC8vIHk6IE1hdGgucm91bmQoaGVpZ2h0IC0gKHkgKyAxKSksXG4gICAgICAgICAgd2lkdGg6IDEsXG4gICAgICAgICAgaGVpZ2h0OiAxLFxuICAgICAgICAgIGRhdGE6IG5ldyBVaW50OEFycmF5KDEgKiAxICogNCksXG4gICAgICAgICAgZnJhbWVidWZmZXI6IF90aGlzLnBpY2tpbmdGQk9cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHBpY2tlZENvbG9yc1swXSAhPT0gMCB8fCBwaWNrZWRDb2xvcnNbMV0gIT09IDAgfHwgcGlja2VkQ29sb3JzWzJdICE9PSAwKSB7XG4gICAgICAgICAgcGlja2VkRmVhdHVyZUlkeCA9IGRlY29kZVBpY2tpbmdDb2xvcihwaWNrZWRDb2xvcnMpO1xuXG4gICAgICAgICAgaWYgKF90aGlzLmhpZ2hsaWdodEVuYWJsZWQpIHtcbiAgICAgICAgICAgIC8vIOmrmOS6rlxuICAgICAgICAgICAgX3RoaXMuaGlnaGxpZ2h0UGlja2VkRmVhdHVyZShwaWNrZWRDb2xvcnMsIHZpZXcpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gcGlja2VkRmVhdHVyZUlkeDtcbiAgICB9O1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKFBpeGVsUGlja2luZ1Bhc3MsIFt7XG4gICAga2V5OiBcImVuYWJsZUhpZ2hsaWdodFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBlbmFibGVIaWdobGlnaHQoZW5hYmxlZCkge1xuICAgICAgdGhpcy5oaWdobGlnaHRFbmFibGVkID0gZW5hYmxlZDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2V0SGlnaGxpZ2h0Q29sb3JcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0SGlnaGxpZ2h0Q29sb3IoY29sb3IpIHtcbiAgICAgIHRoaXMuaGlnaGxpZ2h0Q29sb3IgPSBjb2xvcjtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaGlnaGxpZ2h0UGlja2VkRmVhdHVyZVwiLFxuXG4gICAgLyoqXG4gICAgICogaGlnaGxpZ2h0IOWmguaenOebtOaOpeS/ruaUuemAieS4rSBmZWF0dXJlIOeahCBidWZmZXLvvIzlrZjlnKjkuKTkuKrpl67popjvvJpcbiAgICAgKiAxLiDpvKDmoIfnp7votbDml7bml6Dms5XmgaLlpI1cbiAgICAgKiAyLiDml6Dms5Xlrp7njrDpq5jkuq7popzoibLkuI7ljp/lp4vljp/oibLnmoQgYWxwaGEg5re35ZCIXG4gICAgICog5Zug5q2k6auY5Lqu6L+Y5piv5pS+5ZyoIHNoYWRlciDkuK3lgZrmr5TovoPlpb1cbiAgICAgKi9cbiAgICB2YWx1ZTogZnVuY3Rpb24gaGlnaGxpZ2h0UGlja2VkRmVhdHVyZShwaWNrZWRDb2xvcnMsIHZpZXcpIHtcbiAgICAgIGlmIChwaWNrZWRDb2xvcnMpIHtcbiAgICAgICAgdmFyIF9pdGVyYXRvcjMgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcih2aWV3LmdldFNjZW5lKCkuZ2V0RW50aXRpZXMoKSksXG4gICAgICAgICAgICBfc3RlcDM7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBmb3IgKF9pdGVyYXRvcjMucygpOyAhKF9zdGVwMyA9IF9pdGVyYXRvcjMubigpKS5kb25lOykge1xuICAgICAgICAgICAgdmFyIG1lc2hFbnRpdHkgPSBfc3RlcDMudmFsdWU7XG4gICAgICAgICAgICB2YXIgbWVzaCA9IHRoaXMubWVzaC5nZXRDb21wb25lbnRCeUVudGl0eShtZXNoRW50aXR5KTtcbiAgICAgICAgICAgIHZhciBtYXRlcmlhbCA9IG1lc2gubWF0ZXJpYWw7XG4gICAgICAgICAgICBtYXRlcmlhbC5zZXRVbmlmb3JtKCd1X1BpY2tpbmdTdGFnZScsIFBpY2tpbmdTdGFnZS5ISUdITElHSFQpO1xuICAgICAgICAgICAgbWF0ZXJpYWwuc2V0VW5pZm9ybSgndV9QaWNraW5nQ29sb3InLCBbcGlja2VkQ29sb3JzWzBdLCBwaWNrZWRDb2xvcnNbMV0sIHBpY2tlZENvbG9yc1syXV0pO1xuICAgICAgICAgICAgbWF0ZXJpYWwuc2V0VW5pZm9ybSgndV9IaWdobGlnaHRDb2xvcicsIHRoaXMuaGlnaGxpZ2h0Q29sb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgX2l0ZXJhdG9yMy5lKGVycik7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgX2l0ZXJhdG9yMy5mKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gUGl4ZWxQaWNraW5nUGFzcztcbn0oKSwgX2NsYXNzMy5JREVOVElGSUVSID0gJ1BpeGVsUGlja2luZyBQYXNzJywgX3RlbXApLCAoX2Rlc2NyaXB0b3IgPSBfYXBwbHlEZWNvcmF0ZWREZXNjcmlwdG9yKF9jbGFzczIucHJvdG90eXBlLCBcImVuZ2luZVwiLCBbX2RlYzJdLCB7XG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgd3JpdGFibGU6IHRydWUsXG4gIGluaXRpYWxpemVyOiBudWxsXG59KSwgX2Rlc2NyaXB0b3IyID0gX2FwcGx5RGVjb3JhdGVkRGVzY3JpcHRvcihfY2xhc3MyLnByb3RvdHlwZSwgXCJyZXNvdXJjZVBvb2xcIiwgW19kZWMzXSwge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHdyaXRhYmxlOiB0cnVlLFxuICBpbml0aWFsaXplcjogbnVsbFxufSksIF9kZXNjcmlwdG9yMyA9IF9hcHBseURlY29yYXRlZERlc2NyaXB0b3IoX2NsYXNzMi5wcm90b3R5cGUsIFwicmVuZGVyUGFzc0ZhY3RvcnlcIiwgW19kZWM0XSwge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHdyaXRhYmxlOiB0cnVlLFxuICBpbml0aWFsaXplcjogbnVsbFxufSksIF9kZXNjcmlwdG9yNCA9IF9hcHBseURlY29yYXRlZERlc2NyaXB0b3IoX2NsYXNzMi5wcm90b3R5cGUsIFwibWVzaFwiLCBbX2RlYzVdLCB7XG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgd3JpdGFibGU6IHRydWUsXG4gIGluaXRpYWxpemVyOiBudWxsXG59KSksIF9jbGFzczIpKSB8fCBfY2xhc3MpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UGl4ZWxQaWNraW5nUGFzcy5qcy5tYXAiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///70\n')},function(module,__webpack_exports__,__webpack_require__){"use strict";eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return drawChildren; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return refreshElement; });\n/* harmony import */ var _svg__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(34);\n/* harmony import */ var _dom__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(26);\n\n\nfunction drawChildren(context, children) {\n children.forEach(function (child) {\n child.draw(context);\n });\n}\n/**\n * 更新元素,包括 group 和 shape\n * @param {IElement} element SVG 元素\n * @param {ChangeType} changeType 更新类型\n */\nfunction refreshElement(element, changeType) {\n // 对于还没有挂载到画布下的元素,canvas 可能为空\n var canvas = element.get('canvas');\n // 只有挂载到画布下,才对元素进行实际渲染\n if (canvas && canvas.get('autoDraw')) {\n var context = canvas.get('context');\n var parent_1 = element.getParent();\n var parentChildren = parent_1 ? parent_1.getChildren() : [canvas];\n var el = element.get('el');\n if (changeType === 'remove') {\n var isClipShape = element.get('isClipShape');\n // 对于 clip,不仅需要将 clipShape 对于的 SVG 元素删除,还需要将上层的 clipPath 元素也删除\n if (isClipShape) {\n var clipPathEl = el && el.parentNode;\n var defsEl = clipPathEl && clipPathEl.parentNode;\n if (clipPathEl && defsEl) {\n defsEl.removeChild(clipPathEl);\n }\n }\n else if (el && el.parentNode) {\n el.parentNode.removeChild(el);\n }\n }\n else if (changeType === 'show') {\n el.setAttribute('visibility', 'visible');\n }\n else if (changeType === 'hide') {\n el.setAttribute('visibility', 'hidden');\n }\n else if (changeType === 'zIndex') {\n Object(_dom__WEBPACK_IMPORTED_MODULE_1__[/* moveTo */ \"c\"])(el, parentChildren.indexOf(element));\n }\n else if (changeType === 'sort') {\n var children_1 = element.get('children');\n if (children_1 && children_1.length) {\n Object(_dom__WEBPACK_IMPORTED_MODULE_1__[/* sortDom */ \"d\"])(element, function (a, b) {\n return children_1.indexOf(a) - children_1.indexOf(b) ? 1 : 0;\n });\n }\n }\n else if (changeType === 'clear') {\n // el maybe null for group\n if (el) {\n el.innerHTML = '';\n }\n }\n else if (changeType === 'matrix') {\n Object(_svg__WEBPACK_IMPORTED_MODULE_0__[/* setTransform */ \"c\"])(element);\n }\n else if (changeType === 'clip') {\n Object(_svg__WEBPACK_IMPORTED_MODULE_0__[/* setClip */ \"a\"])(element, context);\n }\n else if (changeType === 'attr') {\n // 已在 afterAttrsChange 进行了处理,此处 do nothing\n }\n else if (changeType === 'add') {\n element.draw(context);\n }\n }\n}\n//# sourceMappingURL=draw.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy1zdmcvZXNtL3V0aWwvZHJhdy5qcz83MzQ5Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQThDO0FBQ047QUFDakM7QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLFdBQVcsU0FBUztBQUNwQixXQUFXLFdBQVc7QUFDdEI7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLDJEQUFNO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLDREQUFPO0FBQ3ZCO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksaUVBQVk7QUFDeEI7QUFDQTtBQUNBLFlBQVksNERBQU87QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiNzEuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBzZXRUcmFuc2Zvcm0sIHNldENsaXAgfSBmcm9tICcuL3N2Zyc7XG5pbXBvcnQgeyBzb3J0RG9tLCBtb3ZlVG8gfSBmcm9tICcuL2RvbSc7XG5leHBvcnQgZnVuY3Rpb24gZHJhd0NoaWxkcmVuKGNvbnRleHQsIGNoaWxkcmVuKSB7XG4gICAgY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgY2hpbGQuZHJhdyhjb250ZXh0KTtcbiAgICB9KTtcbn1cbi8qKlxuICog5pu05paw5YWD57Sg77yM5YyF5ousIGdyb3VwIOWSjCBzaGFwZVxuICogQHBhcmFtIHtJRWxlbWVudH0gZWxlbWVudCAgICAgICBTVkcg5YWD57SgXG4gKiBAcGFyYW0ge0NoYW5nZVR5cGV9IGNoYW5nZVR5cGUgIOabtOaWsOexu+Wei1xuICovXG5leHBvcnQgZnVuY3Rpb24gcmVmcmVzaEVsZW1lbnQoZWxlbWVudCwgY2hhbmdlVHlwZSkge1xuICAgIC8vIOWvueS6jui/mOayoeacieaMgui9veWIsOeUu+W4g+S4i+eahOWFg+e0oO+8jGNhbnZhcyDlj6/og73kuLrnqbpcbiAgICB2YXIgY2FudmFzID0gZWxlbWVudC5nZXQoJ2NhbnZhcycpO1xuICAgIC8vIOWPquacieaMgui9veWIsOeUu+W4g+S4i++8jOaJjeWvueWFg+e0oOi/m+ihjOWunumZhea4suafk1xuICAgIGlmIChjYW52YXMgJiYgY2FudmFzLmdldCgnYXV0b0RyYXcnKSkge1xuICAgICAgICB2YXIgY29udGV4dCA9IGNhbnZhcy5nZXQoJ2NvbnRleHQnKTtcbiAgICAgICAgdmFyIHBhcmVudF8xID0gZWxlbWVudC5nZXRQYXJlbnQoKTtcbiAgICAgICAgdmFyIHBhcmVudENoaWxkcmVuID0gcGFyZW50XzEgPyBwYXJlbnRfMS5nZXRDaGlsZHJlbigpIDogW2NhbnZhc107XG4gICAgICAgIHZhciBlbCA9IGVsZW1lbnQuZ2V0KCdlbCcpO1xuICAgICAgICBpZiAoY2hhbmdlVHlwZSA9PT0gJ3JlbW92ZScpIHtcbiAgICAgICAgICAgIHZhciBpc0NsaXBTaGFwZSA9IGVsZW1lbnQuZ2V0KCdpc0NsaXBTaGFwZScpO1xuICAgICAgICAgICAgLy8g5a+55LqOIGNsaXDvvIzkuI3ku4XpnIDopoHlsIYgY2xpcFNoYXBlIOWvueS6jueahCBTVkcg5YWD57Sg5Yig6Zmk77yM6L+Y6ZyA6KaB5bCG5LiK5bGC55qEIGNsaXBQYXRoIOWFg+e0oOS5n+WIoOmZpFxuICAgICAgICAgICAgaWYgKGlzQ2xpcFNoYXBlKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNsaXBQYXRoRWwgPSBlbCAmJiBlbC5wYXJlbnROb2RlO1xuICAgICAgICAgICAgICAgIHZhciBkZWZzRWwgPSBjbGlwUGF0aEVsICYmIGNsaXBQYXRoRWwucGFyZW50Tm9kZTtcbiAgICAgICAgICAgICAgICBpZiAoY2xpcFBhdGhFbCAmJiBkZWZzRWwpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVmc0VsLnJlbW92ZUNoaWxkKGNsaXBQYXRoRWwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGVsICYmIGVsLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgICAgICBlbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGVsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjaGFuZ2VUeXBlID09PSAnc2hvdycpIHtcbiAgICAgICAgICAgIGVsLnNldEF0dHJpYnV0ZSgndmlzaWJpbGl0eScsICd2aXNpYmxlJyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY2hhbmdlVHlwZSA9PT0gJ2hpZGUnKSB7XG4gICAgICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoJ3Zpc2liaWxpdHknLCAnaGlkZGVuJyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY2hhbmdlVHlwZSA9PT0gJ3pJbmRleCcpIHtcbiAgICAgICAgICAgIG1vdmVUbyhlbCwgcGFyZW50Q2hpbGRyZW4uaW5kZXhPZihlbGVtZW50KSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY2hhbmdlVHlwZSA9PT0gJ3NvcnQnKSB7XG4gICAgICAgICAgICB2YXIgY2hpbGRyZW5fMSA9IGVsZW1lbnQuZ2V0KCdjaGlsZHJlbicpO1xuICAgICAgICAgICAgaWYgKGNoaWxkcmVuXzEgJiYgY2hpbGRyZW5fMS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBzb3J0RG9tKGVsZW1lbnQsIGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjaGlsZHJlbl8xLmluZGV4T2YoYSkgLSBjaGlsZHJlbl8xLmluZGV4T2YoYikgPyAxIDogMDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjaGFuZ2VUeXBlID09PSAnY2xlYXInKSB7XG4gICAgICAgICAgICAvLyBlbCBtYXliZSBudWxsIGZvciBncm91cFxuICAgICAgICAgICAgaWYgKGVsKSB7XG4gICAgICAgICAgICAgICAgZWwuaW5uZXJIVE1MID0gJyc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY2hhbmdlVHlwZSA9PT0gJ21hdHJpeCcpIHtcbiAgICAgICAgICAgIHNldFRyYW5zZm9ybShlbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjaGFuZ2VUeXBlID09PSAnY2xpcCcpIHtcbiAgICAgICAgICAgIHNldENsaXAoZWxlbWVudCwgY29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY2hhbmdlVHlwZSA9PT0gJ2F0dHInKSB7XG4gICAgICAgICAgICAvLyDlt7LlnKggYWZ0ZXJBdHRyc0NoYW5nZSDov5vooYzkuoblpITnkIbvvIzmraTlpIQgZG8gbm90aGluZ1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNoYW5nZVR5cGUgPT09ICdhZGQnKSB7XG4gICAgICAgICAgICBlbGVtZW50LmRyYXcoY29udGV4dCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kcmF3LmpzLm1hcCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///71\n")},function(module,exports){eval("/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || (value !== value && other !== other);\n}\n\nmodule.exports = eq;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL2VxLmpzPzk2MzgiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxFQUFFO0FBQ2IsV0FBVyxFQUFFO0FBQ2IsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakIsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwiZmlsZSI6IjcyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQZXJmb3JtcyBhXG4gKiBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICogY29tcGFyaXNvbiBiZXR3ZWVuIHR3byB2YWx1ZXMgdG8gZGV0ZXJtaW5lIGlmIHRoZXkgYXJlIGVxdWl2YWxlbnQuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSB2YWx1ZXMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxIH07XG4gKiB2YXIgb3RoZXIgPSB7ICdhJzogMSB9O1xuICpcbiAqIF8uZXEob2JqZWN0LCBvYmplY3QpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uZXEob2JqZWN0LCBvdGhlcik7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uZXEoJ2EnLCAnYScpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uZXEoJ2EnLCBPYmplY3QoJ2EnKSk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uZXEoTmFOLCBOYU4pO1xuICogLy8gPT4gdHJ1ZVxuICovXG5mdW5jdGlvbiBlcSh2YWx1ZSwgb3RoZXIpIHtcbiAgcmV0dXJuIHZhbHVlID09PSBvdGhlciB8fCAodmFsdWUgIT09IHZhbHVlICYmIG90aGVyICE9PSBvdGhlcik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZXE7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///72\n")},function(module,exports,__webpack_require__){eval("var root = __webpack_require__(47);\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nmodule.exports = Symbol;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19TeW1ib2wuanM/OWU2OSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxXQUFXLG1CQUFPLENBQUMsRUFBUzs7QUFFNUI7QUFDQTs7QUFFQSIsImZpbGUiOiI3My5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciByb290ID0gcmVxdWlyZSgnLi9fcm9vdCcpO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBTeW1ib2wgPSByb290LlN5bWJvbDtcblxubW9kdWxlLmV4cG9ydHMgPSBTeW1ib2w7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///73\n")},function(module,exports,__webpack_require__){eval("/* WEBPACK VAR INJECTION */(function(module) {var root = __webpack_require__(47),\n stubFalse = __webpack_require__(355);\n\n/** Detect free variable `exports`. */\nvar freeExports = true && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined;\n\n/**\n * Checks if `value` is a buffer.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n * @example\n *\n * _.isBuffer(new Buffer(2));\n * // => true\n *\n * _.isBuffer(new Uint8Array(2));\n * // => false\n */\nvar isBuffer = nativeIsBuffer || stubFalse;\n\nmodule.exports = isBuffer;\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(156)(module)))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzQnVmZmVyLmpzPzBkMjQiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEseURBQVcsbUJBQU8sQ0FBQyxFQUFTO0FBQzVCLGdCQUFnQixtQkFBTyxDQUFDLEdBQWE7O0FBRXJDO0FBQ0Esa0JBQWtCLEtBQTBCOztBQUU1QztBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxFQUFFO0FBQ2IsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsImZpbGUiOiI3NC5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciByb290ID0gcmVxdWlyZSgnLi9fcm9vdCcpLFxuICAgIHN0dWJGYWxzZSA9IHJlcXVpcmUoJy4vc3R1YkZhbHNlJyk7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgZXhwb3J0c2AuICovXG52YXIgZnJlZUV4cG9ydHMgPSB0eXBlb2YgZXhwb3J0cyA9PSAnb2JqZWN0JyAmJiBleHBvcnRzICYmICFleHBvcnRzLm5vZGVUeXBlICYmIGV4cG9ydHM7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgbW9kdWxlYC4gKi9cbnZhciBmcmVlTW9kdWxlID0gZnJlZUV4cG9ydHMgJiYgdHlwZW9mIG1vZHVsZSA9PSAnb2JqZWN0JyAmJiBtb2R1bGUgJiYgIW1vZHVsZS5ub2RlVHlwZSAmJiBtb2R1bGU7XG5cbi8qKiBEZXRlY3QgdGhlIHBvcHVsYXIgQ29tbW9uSlMgZXh0ZW5zaW9uIGBtb2R1bGUuZXhwb3J0c2AuICovXG52YXIgbW9kdWxlRXhwb3J0cyA9IGZyZWVNb2R1bGUgJiYgZnJlZU1vZHVsZS5leHBvcnRzID09PSBmcmVlRXhwb3J0cztcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgQnVmZmVyID0gbW9kdWxlRXhwb3J0cyA/IHJvb3QuQnVmZmVyIDogdW5kZWZpbmVkO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlSXNCdWZmZXIgPSBCdWZmZXIgPyBCdWZmZXIuaXNCdWZmZXIgOiB1bmRlZmluZWQ7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBidWZmZXIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjMuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBidWZmZXIsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0J1ZmZlcihuZXcgQnVmZmVyKDIpKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQnVmZmVyKG5ldyBVaW50OEFycmF5KDIpKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbnZhciBpc0J1ZmZlciA9IG5hdGl2ZUlzQnVmZmVyIHx8IHN0dWJGYWxzZTtcblxubW9kdWxlLmV4cG9ydHMgPSBpc0J1ZmZlcjtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///74\n")},function(module,exports,__webpack_require__){eval("var DataView = __webpack_require__(364),\n Map = __webpack_require__(153),\n Promise = __webpack_require__(365),\n Set = __webpack_require__(199),\n WeakMap = __webpack_require__(366),\n baseGetTag = __webpack_require__(65),\n toSource = __webpack_require__(188);\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]',\n objectTag = '[object Object]',\n promiseTag = '[object Promise]',\n setTag = '[object Set]',\n weakMapTag = '[object WeakMap]';\n\nvar dataViewTag = '[object DataView]';\n\n/** Used to detect maps, sets, and weakmaps. */\nvar dataViewCtorString = toSource(DataView),\n mapCtorString = toSource(Map),\n promiseCtorString = toSource(Promise),\n setCtorString = toSource(Set),\n weakMapCtorString = toSource(WeakMap);\n\n/**\n * Gets the `toStringTag` of `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nvar getTag = baseGetTag;\n\n// Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\nif ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n (Map && getTag(new Map) != mapTag) ||\n (Promise && getTag(Promise.resolve()) != promiseTag) ||\n (Set && getTag(new Set) != setTag) ||\n (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n getTag = function(value) {\n var result = baseGetTag(value),\n Ctor = result == objectTag ? value.constructor : undefined,\n ctorString = Ctor ? toSource(Ctor) : '';\n\n if (ctorString) {\n switch (ctorString) {\n case dataViewCtorString: return dataViewTag;\n case mapCtorString: return mapTag;\n case promiseCtorString: return promiseTag;\n case setCtorString: return setTag;\n case weakMapCtorString: return weakMapTag;\n }\n }\n return result;\n };\n}\n\nmodule.exports = getTag;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19nZXRUYWcuanM/NDJhMiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxlQUFlLG1CQUFPLENBQUMsR0FBYTtBQUNwQyxVQUFVLG1CQUFPLENBQUMsR0FBUTtBQUMxQixjQUFjLG1CQUFPLENBQUMsR0FBWTtBQUNsQyxVQUFVLG1CQUFPLENBQUMsR0FBUTtBQUMxQixjQUFjLG1CQUFPLENBQUMsR0FBWTtBQUNsQyxpQkFBaUIsbUJBQU8sQ0FBQyxFQUFlO0FBQ3hDLGVBQWUsbUJBQU8sQ0FBQyxHQUFhOztBQUVwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxFQUFFO0FBQ2IsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwiZmlsZSI6Ijc1LmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIERhdGFWaWV3ID0gcmVxdWlyZSgnLi9fRGF0YVZpZXcnKSxcbiAgICBNYXAgPSByZXF1aXJlKCcuL19NYXAnKSxcbiAgICBQcm9taXNlID0gcmVxdWlyZSgnLi9fUHJvbWlzZScpLFxuICAgIFNldCA9IHJlcXVpcmUoJy4vX1NldCcpLFxuICAgIFdlYWtNYXAgPSByZXF1aXJlKCcuL19XZWFrTWFwJyksXG4gICAgYmFzZUdldFRhZyA9IHJlcXVpcmUoJy4vX2Jhc2VHZXRUYWcnKSxcbiAgICB0b1NvdXJjZSA9IHJlcXVpcmUoJy4vX3RvU291cmNlJyk7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBtYXBUYWcgPSAnW29iamVjdCBNYXBdJyxcbiAgICBvYmplY3RUYWcgPSAnW29iamVjdCBPYmplY3RdJyxcbiAgICBwcm9taXNlVGFnID0gJ1tvYmplY3QgUHJvbWlzZV0nLFxuICAgIHNldFRhZyA9ICdbb2JqZWN0IFNldF0nLFxuICAgIHdlYWtNYXBUYWcgPSAnW29iamVjdCBXZWFrTWFwXSc7XG5cbnZhciBkYXRhVmlld1RhZyA9ICdbb2JqZWN0IERhdGFWaWV3XSc7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBtYXBzLCBzZXRzLCBhbmQgd2Vha21hcHMuICovXG52YXIgZGF0YVZpZXdDdG9yU3RyaW5nID0gdG9Tb3VyY2UoRGF0YVZpZXcpLFxuICAgIG1hcEN0b3JTdHJpbmcgPSB0b1NvdXJjZShNYXApLFxuICAgIHByb21pc2VDdG9yU3RyaW5nID0gdG9Tb3VyY2UoUHJvbWlzZSksXG4gICAgc2V0Q3RvclN0cmluZyA9IHRvU291cmNlKFNldCksXG4gICAgd2Vha01hcEN0b3JTdHJpbmcgPSB0b1NvdXJjZShXZWFrTWFwKTtcblxuLyoqXG4gKiBHZXRzIHRoZSBgdG9TdHJpbmdUYWdgIG9mIGB2YWx1ZWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHF1ZXJ5LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgYHRvU3RyaW5nVGFnYC5cbiAqL1xudmFyIGdldFRhZyA9IGJhc2VHZXRUYWc7XG5cbi8vIEZhbGxiYWNrIGZvciBkYXRhIHZpZXdzLCBtYXBzLCBzZXRzLCBhbmQgd2VhayBtYXBzIGluIElFIDExIGFuZCBwcm9taXNlcyBpbiBOb2RlLmpzIDwgNi5cbmlmICgoRGF0YVZpZXcgJiYgZ2V0VGFnKG5ldyBEYXRhVmlldyhuZXcgQXJyYXlCdWZmZXIoMSkpKSAhPSBkYXRhVmlld1RhZykgfHxcbiAgICAoTWFwICYmIGdldFRhZyhuZXcgTWFwKSAhPSBtYXBUYWcpIHx8XG4gICAgKFByb21pc2UgJiYgZ2V0VGFnKFByb21pc2UucmVzb2x2ZSgpKSAhPSBwcm9taXNlVGFnKSB8fFxuICAgIChTZXQgJiYgZ2V0VGFnKG5ldyBTZXQpICE9IHNldFRhZykgfHxcbiAgICAoV2Vha01hcCAmJiBnZXRUYWcobmV3IFdlYWtNYXApICE9IHdlYWtNYXBUYWcpKSB7XG4gIGdldFRhZyA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgdmFyIHJlc3VsdCA9IGJhc2VHZXRUYWcodmFsdWUpLFxuICAgICAgICBDdG9yID0gcmVzdWx0ID09IG9iamVjdFRhZyA/IHZhbHVlLmNvbnN0cnVjdG9yIDogdW5kZWZpbmVkLFxuICAgICAgICBjdG9yU3RyaW5nID0gQ3RvciA/IHRvU291cmNlKEN0b3IpIDogJyc7XG5cbiAgICBpZiAoY3RvclN0cmluZykge1xuICAgICAgc3dpdGNoIChjdG9yU3RyaW5nKSB7XG4gICAgICAgIGNhc2UgZGF0YVZpZXdDdG9yU3RyaW5nOiByZXR1cm4gZGF0YVZpZXdUYWc7XG4gICAgICAgIGNhc2UgbWFwQ3RvclN0cmluZzogcmV0dXJuIG1hcFRhZztcbiAgICAgICAgY2FzZSBwcm9taXNlQ3RvclN0cmluZzogcmV0dXJuIHByb21pc2VUYWc7XG4gICAgICAgIGNhc2Ugc2V0Q3RvclN0cmluZzogcmV0dXJuIHNldFRhZztcbiAgICAgICAgY2FzZSB3ZWFrTWFwQ3RvclN0cmluZzogcmV0dXJuIHdlYWtNYXBUYWc7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0VGFnO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///75\n")},function(module,exports,__webpack_require__){eval("var baseGetTag = __webpack_require__(65),\n isObjectLike = __webpack_require__(49);\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && baseGetTag(value) == symbolTag);\n}\n\nmodule.exports = isSymbol;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzU3ltYm9sLmpzP2ZmZDYiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsaUJBQWlCLG1CQUFPLENBQUMsRUFBZTtBQUN4QyxtQkFBbUIsbUJBQU8sQ0FBQyxFQUFnQjs7QUFFM0M7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsRUFBRTtBQUNiLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJmaWxlIjoiNzYuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYmFzZUdldFRhZyA9IHJlcXVpcmUoJy4vX2Jhc2VHZXRUYWcnKSxcbiAgICBpc09iamVjdExpa2UgPSByZXF1aXJlKCcuL2lzT2JqZWN0TGlrZScpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgc3ltYm9sVGFnID0gJ1tvYmplY3QgU3ltYm9sXSc7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBTeW1ib2xgIHByaW1pdGl2ZSBvciBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBzeW1ib2wsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc1N5bWJvbChTeW1ib2wuaXRlcmF0b3IpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNTeW1ib2woJ2FiYycpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNTeW1ib2wodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnc3ltYm9sJyB8fFxuICAgIChpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IHN5bWJvbFRhZyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNTeW1ib2w7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///76\n")},function(module,__webpack_exports__,__webpack_require__){"use strict";eval('/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1);\n/* harmony import */ var _antv_g_base__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(21);\n/* harmony import */ var _shape__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(57);\n/* harmony import */ var _util_draw__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(30);\n/* harmony import */ var _antv_util__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(0);\n/* harmony import */ var _util_util__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(16);\n\n\n\n\n\n\nvar Group = /** @class */ (function (_super) {\n Object(tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"])(Group, _super);\n function Group() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n /**\n * 一些方法调用会引起画布变化\n * @param {ChangeType} changeType 改变的类型\n */\n Group.prototype.onCanvasChange = function (changeType) {\n Object(_util_draw__WEBPACK_IMPORTED_MODULE_3__[/* refreshElement */ "h"])(this, changeType);\n };\n Group.prototype.getShapeBase = function () {\n return _shape__WEBPACK_IMPORTED_MODULE_2__;\n };\n Group.prototype.getGroupBase = function () {\n return Group;\n };\n // 同 shape 中的方法重复了\n Group.prototype._applyClip = function (context, clip) {\n if (clip) {\n context.save();\n // 将 clip 的属性挂载到 context 上\n Object(_util_draw__WEBPACK_IMPORTED_MODULE_3__[/* applyAttrsToContext */ "a"])(context, clip);\n // 绘制 clip 路径\n clip.createPath(context);\n context.restore();\n // 裁剪\n context.clip();\n clip._afterDraw();\n }\n };\n // 这个方法以前直接使用的 getCanvasBBox,由于 group 上没有缓存,所以每次重新计算,导致性能开销比较大\n // 大概能够节省全局渲染 15-20% 的性能,如果不在这里加缓存优化后 10W 个节点无法达到 5-6 ms,大概能够 30-40ms\n Group.prototype.cacheCanvasBBox = function () {\n var children = this.cfg.children;\n var xArr = [];\n var yArr = [];\n Object(_antv_util__WEBPACK_IMPORTED_MODULE_4__["each"])(children, function (child) {\n var bbox = child.cfg.cacheCanvasBBox;\n // isInview 的判定是一旦图形或者分组渲染就要计算是否在视图内,\n // 这个判定 10W 个图形下差不多能够节省 5-6 ms 的开销\n if (bbox && child.cfg.isInView) {\n xArr.push(bbox.minX, bbox.maxX);\n yArr.push(bbox.minY, bbox.maxY);\n }\n });\n var bbox = null;\n if (xArr.length) {\n var minX = Object(_antv_util__WEBPACK_IMPORTED_MODULE_4__["min"])(xArr);\n var maxX = Object(_antv_util__WEBPACK_IMPORTED_MODULE_4__["max"])(xArr);\n var minY = Object(_antv_util__WEBPACK_IMPORTED_MODULE_4__["min"])(yArr);\n var maxY = Object(_antv_util__WEBPACK_IMPORTED_MODULE_4__["max"])(yArr);\n bbox = {\n minX: minX,\n minY: minY,\n x: minX,\n y: minY,\n maxX: maxX,\n maxY: maxY,\n width: maxX - minX,\n height: maxY - minY,\n };\n var canvas = this.cfg.canvas;\n if (canvas) {\n var viewRange = canvas.getViewRange();\n // 如果这个地方判定 isInView == false 设置 bbox 为 false 的话,拾取的性能会更高\n // 但是目前 10W 图形的拾取在 2-5ms 内,这个优化意义不大,可以后期观察再看\n this.set(\'isInView\', Object(_util_util__WEBPACK_IMPORTED_MODULE_5__[/* intersectRect */ "f"])(bbox, viewRange));\n }\n }\n else {\n this.set(\'isInView\', false);\n }\n this.set(\'cacheCanvasBBox\', bbox);\n };\n Group.prototype.draw = function (context, region) {\n var children = this.cfg.children;\n var allowDraw = region ? this.cfg.refresh : true; // 局部刷新需要判定\n // 这个地方需要判定,在 G6 的场景每个 group 都有 transform 的场景下性能会开销非常大\n // 通过 refresh 的判定,可以不刷新没有发生过变化的分组,不在视窗内的分组等等\n // 如果想进一步提升局部渲染性能,可以进一步优化 refresh 的判定,依然有潜力\n if (children.length && allowDraw) {\n context.save();\n // group 上的矩阵和属性也会应用到上下文上\n // 先将 attrs 应用到上下文中,再设置 clip。因为 clip 应该被当前元素的 matrix 所影响\n Object(_util_draw__WEBPACK_IMPORTED_MODULE_3__[/* applyAttrsToContext */ "a"])(context, this);\n this._applyClip(context, this.getClip());\n Object(_util_draw__WEBPACK_IMPORTED_MODULE_3__[/* drawChildren */ "d"])(context, children, region);\n context.restore();\n this.cacheCanvasBBox();\n }\n // 这里的成本比较大,如果不绘制则不再\n // this.set(\'cacheCanvasBBox\', this.getCanvasBBox());\n this.cfg.refresh = null;\n // 绘制后,消除更新标记\n this.set(\'hasChanged\', false);\n };\n // 绘制时被跳过,一般发生在分组隐藏时\n Group.prototype.skipDraw = function () {\n this.set(\'cacheCanvasBBox\', null);\n this.set(\'hasChanged\', false);\n };\n return Group;\n}(_antv_g_base__WEBPACK_IMPORTED_MODULE_1__["AbstractGroup"]));\n/* harmony default export */ __webpack_exports__["a"] = (Group);\n//# sourceMappingURL=group.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy1jYW52YXMvZXNtL2dyb3VwLmpzP2MyYWQiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQWtDO0FBQ1c7QUFDWjtBQUMrQztBQUNwQztBQUNBO0FBQzVDO0FBQ0EsSUFBSSx1REFBUztBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFdBQVc7QUFDMUI7QUFDQTtBQUNBLFFBQVEseUVBQWM7QUFDdEI7QUFDQTtBQUNBLGVBQWUsbUNBQUs7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSw4RUFBbUI7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsdURBQUk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsdUJBQXVCLHNEQUFHO0FBQzFCLHVCQUF1QixzREFBRztBQUMxQix1QkFBdUIsc0RBQUc7QUFDMUIsdUJBQXVCLHNEQUFHO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQyx3RUFBYTtBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5REFBeUQ7QUFDekQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLDhFQUFtQjtBQUMvQjtBQUNBLFlBQVksdUVBQVk7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxDQUFDLDBEQUFhO0FBQ0EsOERBQUssRUFBQztBQUNyQiIsImZpbGUiOiI3Ny5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgQWJzdHJhY3RHcm91cCB9IGZyb20gJ0BhbnR2L2ctYmFzZSc7XG5pbXBvcnQgKiBhcyBTaGFwZSBmcm9tICcuL3NoYXBlJztcbmltcG9ydCB7IGFwcGx5QXR0cnNUb0NvbnRleHQsIGRyYXdDaGlsZHJlbiwgcmVmcmVzaEVsZW1lbnQgfSBmcm9tICcuL3V0aWwvZHJhdyc7XG5pbXBvcnQgeyBlYWNoLCBtYXgsIG1pbiB9IGZyb20gJ0BhbnR2L3V0aWwnO1xuaW1wb3J0IHsgaW50ZXJzZWN0UmVjdCB9IGZyb20gJy4vdXRpbC91dGlsJztcbnZhciBHcm91cCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoR3JvdXAsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gR3JvdXAoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICog5LiA5Lqb5pa55rOV6LCD55So5Lya5byV6LW355S75biD5Y+Y5YyWXG4gICAgICogQHBhcmFtIHtDaGFuZ2VUeXBlfSBjaGFuZ2VUeXBlIOaUueWPmOeahOexu+Wei1xuICAgICAqL1xuICAgIEdyb3VwLnByb3RvdHlwZS5vbkNhbnZhc0NoYW5nZSA9IGZ1bmN0aW9uIChjaGFuZ2VUeXBlKSB7XG4gICAgICAgIHJlZnJlc2hFbGVtZW50KHRoaXMsIGNoYW5nZVR5cGUpO1xuICAgIH07XG4gICAgR3JvdXAucHJvdG90eXBlLmdldFNoYXBlQmFzZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIFNoYXBlO1xuICAgIH07XG4gICAgR3JvdXAucHJvdG90eXBlLmdldEdyb3VwQmFzZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIEdyb3VwO1xuICAgIH07XG4gICAgLy8g5ZCMIHNoYXBlIOS4reeahOaWueazlemHjeWkjeS6hlxuICAgIEdyb3VwLnByb3RvdHlwZS5fYXBwbHlDbGlwID0gZnVuY3Rpb24gKGNvbnRleHQsIGNsaXApIHtcbiAgICAgICAgaWYgKGNsaXApIHtcbiAgICAgICAgICAgIGNvbnRleHQuc2F2ZSgpO1xuICAgICAgICAgICAgLy8g5bCGIGNsaXAg55qE5bGe5oCn5oyC6L295YiwIGNvbnRleHQg5LiKXG4gICAgICAgICAgICBhcHBseUF0dHJzVG9Db250ZXh0KGNvbnRleHQsIGNsaXApO1xuICAgICAgICAgICAgLy8g57uY5Yi2IGNsaXAg6Lev5b6EXG4gICAgICAgICAgICBjbGlwLmNyZWF0ZVBhdGgoY29udGV4dCk7XG4gICAgICAgICAgICBjb250ZXh0LnJlc3RvcmUoKTtcbiAgICAgICAgICAgIC8vIOijgeWJqlxuICAgICAgICAgICAgY29udGV4dC5jbGlwKCk7XG4gICAgICAgICAgICBjbGlwLl9hZnRlckRyYXcoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLy8g6L+Z5Liq5pa55rOV5Lul5YmN55u05o6l5L2/55So55qEIGdldENhbnZhc0JCb3jvvIznlLHkuo4gZ3JvdXAg5LiK5rKh5pyJ57yT5a2Y77yM5omA5Lul5q+P5qyh6YeN5paw6K6h566X77yM5a+86Ie05oCn6IO95byA6ZSA5q+U6L6D5aSnXG4gICAgLy8g5aSn5qaC6IO95aSf6IqC55yB5YWo5bGA5riy5p+TIDE1LTIwJSDnmoTmgKfog73vvIzlpoLmnpzkuI3lnKjov5nph4zliqDnvJPlrZjkvJjljJblkI4gMTBXIOS4quiKgueCueaXoOazlei+vuWIsCA1LTYgbXPvvIzlpKfmpoLog73lpJ8gMzAtNDBtc1xuICAgIEdyb3VwLnByb3RvdHlwZS5jYWNoZUNhbnZhc0JCb3ggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBjaGlsZHJlbiA9IHRoaXMuY2ZnLmNoaWxkcmVuO1xuICAgICAgICB2YXIgeEFyciA9IFtdO1xuICAgICAgICB2YXIgeUFyciA9IFtdO1xuICAgICAgICBlYWNoKGNoaWxkcmVuLCBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgICAgIHZhciBiYm94ID0gY2hpbGQuY2ZnLmNhY2hlQ2FudmFzQkJveDtcbiAgICAgICAgICAgIC8vIGlzSW52aWV3IOeahOWIpOWumuaYr+S4gOaXpuWbvuW9ouaIluiAheWIhue7hOa4suafk+Wwseimgeiuoeeul+aYr+WQpuWcqOinhuWbvuWGhe+8jFxuICAgICAgICAgICAgLy8g6L+Z5Liq5Yik5a6aIDEwVyDkuKrlm77lvaLkuIvlt67kuI3lpJrog73lpJ/oioLnnIEgNS02IG1zIOeahOW8gOmUgFxuICAgICAgICAgICAgaWYgKGJib3ggJiYgY2hpbGQuY2ZnLmlzSW5WaWV3KSB7XG4gICAgICAgICAgICAgICAgeEFyci5wdXNoKGJib3gubWluWCwgYmJveC5tYXhYKTtcbiAgICAgICAgICAgICAgICB5QXJyLnB1c2goYmJveC5taW5ZLCBiYm94Lm1heFkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdmFyIGJib3ggPSBudWxsO1xuICAgICAgICBpZiAoeEFyci5sZW5ndGgpIHtcbiAgICAgICAgICAgIHZhciBtaW5YID0gbWluKHhBcnIpO1xuICAgICAgICAgICAgdmFyIG1heFggPSBtYXgoeEFycik7XG4gICAgICAgICAgICB2YXIgbWluWSA9IG1pbih5QXJyKTtcbiAgICAgICAgICAgIHZhciBtYXhZID0gbWF4KHlBcnIpO1xuICAgICAgICAgICAgYmJveCA9IHtcbiAgICAgICAgICAgICAgICBtaW5YOiBtaW5YLFxuICAgICAgICAgICAgICAgIG1pblk6IG1pblksXG4gICAgICAgICAgICAgICAgeDogbWluWCxcbiAgICAgICAgICAgICAgICB5OiBtaW5ZLFxuICAgICAgICAgICAgICAgIG1heFg6IG1heFgsXG4gICAgICAgICAgICAgICAgbWF4WTogbWF4WSxcbiAgICAgICAgICAgICAgICB3aWR0aDogbWF4WCAtIG1pblgsXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiBtYXhZIC0gbWluWSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB2YXIgY2FudmFzID0gdGhpcy5jZmcuY2FudmFzO1xuICAgICAgICAgICAgaWYgKGNhbnZhcykge1xuICAgICAgICAgICAgICAgIHZhciB2aWV3UmFuZ2UgPSBjYW52YXMuZ2V0Vmlld1JhbmdlKCk7XG4gICAgICAgICAgICAgICAgLy8g5aaC5p6c6L+Z5Liq5Zyw5pa55Yik5a6aIGlzSW5WaWV3ID09IGZhbHNlIOiuvue9riBiYm94IOS4uiBmYWxzZSDnmoTor53vvIzmi77lj5bnmoTmgKfog73kvJrmm7Tpq5hcbiAgICAgICAgICAgICAgICAvLyDkvYbmmK/nm67liY0gMTBXIOWbvuW9oueahOaLvuWPluWcqCAyLTVtcyDlhoXvvIzov5nkuKrkvJjljJbmhI/kuYnkuI3lpKfvvIzlj6/ku6XlkI7mnJ/op4Llr5/lho3nnItcbiAgICAgICAgICAgICAgICB0aGlzLnNldCgnaXNJblZpZXcnLCBpbnRlcnNlY3RSZWN0KGJib3gsIHZpZXdSYW5nZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZXQoJ2lzSW5WaWV3JywgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0KCdjYWNoZUNhbnZhc0JCb3gnLCBiYm94KTtcbiAgICB9O1xuICAgIEdyb3VwLnByb3RvdHlwZS5kcmF3ID0gZnVuY3Rpb24gKGNvbnRleHQsIHJlZ2lvbikge1xuICAgICAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLmNmZy5jaGlsZHJlbjtcbiAgICAgICAgdmFyIGFsbG93RHJhdyA9IHJlZ2lvbiA/IHRoaXMuY2ZnLnJlZnJlc2ggOiB0cnVlOyAvLyDlsYDpg6jliLfmlrDpnIDopoHliKTlrppcbiAgICAgICAgLy8g6L+Z5Liq5Zyw5pa56ZyA6KaB5Yik5a6a77yM5ZyoIEc2IOeahOWcuuaZr+avj+S4qiBncm91cCDpg73mnIkgdHJhbnNmb3JtIOeahOWcuuaZr+S4i+aAp+iDveS8muW8gOmUgOmdnuW4uOWkp1xuICAgICAgICAvLyDpgJrov4cgcmVmcmVzaCDnmoTliKTlrprvvIzlj6/ku6XkuI3liLfmlrDmsqHmnInlj5HnlJ/ov4flj5jljJbnmoTliIbnu4TvvIzkuI3lnKjop4bnqpflhoXnmoTliIbnu4TnrYnnrYlcbiAgICAgICAgLy8g5aaC5p6c5oOz6L+b5LiA5q2l5o+Q5Y2H5bGA6YOo5riy5p+T5oCn6IO977yM5Y+v5Lul6L+b5LiA5q2l5LyY5YyWIHJlZnJlc2gg55qE5Yik5a6a77yM5L6d54S25pyJ5r2c5YqbXG4gICAgICAgIGlmIChjaGlsZHJlbi5sZW5ndGggJiYgYWxsb3dEcmF3KSB7XG4gICAgICAgICAgICBjb250ZXh0LnNhdmUoKTtcbiAgICAgICAgICAgIC8vIGdyb3VwIOS4iueahOefqemYteWSjOWxnuaAp+S5n+S8muW6lOeUqOWIsOS4iuS4i+aWh+S4ilxuICAgICAgICAgICAgLy8g5YWI5bCGIGF0dHJzIOW6lOeUqOWIsOS4iuS4i+aWh+S4re+8jOWGjeiuvue9riBjbGlw44CC5Zug5Li6IGNsaXAg5bqU6K+l6KKr5b2T5YmN5YWD57Sg55qEIG1hdHJpeCDmiYDlvbHlk41cbiAgICAgICAgICAgIGFwcGx5QXR0cnNUb0NvbnRleHQoY29udGV4dCwgdGhpcyk7XG4gICAgICAgICAgICB0aGlzLl9hcHBseUNsaXAoY29udGV4dCwgdGhpcy5nZXRDbGlwKCkpO1xuICAgICAgICAgICAgZHJhd0NoaWxkcmVuKGNvbnRleHQsIGNoaWxkcmVuLCByZWdpb24pO1xuICAgICAgICAgICAgY29udGV4dC5yZXN0b3JlKCk7XG4gICAgICAgICAgICB0aGlzLmNhY2hlQ2FudmFzQkJveCgpO1xuICAgICAgICB9XG4gICAgICAgIC8vIOi/memHjOeahOaIkOacrOavlOi+g+Wkp++8jOWmguaenOS4jee7mOWItuWImeS4jeWGjVxuICAgICAgICAvLyB0aGlzLnNldCgnY2FjaGVDYW52YXNCQm94JywgdGhpcy5nZXRDYW52YXNCQm94KCkpO1xuICAgICAgICB0aGlzLmNmZy5yZWZyZXNoID0gbnVsbDtcbiAgICAgICAgLy8g57uY5Yi25ZCO77yM5raI6Zmk5pu05paw5qCH6K6wXG4gICAgICAgIHRoaXMuc2V0KCdoYXNDaGFuZ2VkJywgZmFsc2UpO1xuICAgIH07XG4gICAgLy8g57uY5Yi25pe26KKr6Lez6L+H77yM5LiA6Iis5Y+R55Sf5Zyo5YiG57uE6ZqQ6JeP5pe2XG4gICAgR3JvdXAucHJvdG90eXBlLnNraXBEcmF3ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnNldCgnY2FjaGVDYW52YXNCQm94JywgbnVsbCk7XG4gICAgICAgIHRoaXMuc2V0KCdoYXNDaGFuZ2VkJywgZmFsc2UpO1xuICAgIH07XG4gICAgcmV0dXJuIEdyb3VwO1xufShBYnN0cmFjdEdyb3VwKSk7XG5leHBvcnQgZGVmYXVsdCBHcm91cDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdyb3VwLmpzLm1hcCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///77\n')},function(module,__webpack_exports__,__webpack_require__){"use strict";eval('/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1);\n/* harmony import */ var _antv_g_base__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(21);\n/* harmony import */ var _antv_util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(0);\n/* harmony import */ var _shape__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(80);\n/* harmony import */ var _util_draw__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(71);\n/* harmony import */ var _util_svg__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(34);\n/* harmony import */ var _constant__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(17);\n/* harmony import */ var _util_dom__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(26);\n\n\n\n\n\n\n\n\nvar Group = /** @class */ (function (_super) {\n Object(tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"])(Group, _super);\n function Group() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n // SVG 中分组对应实体标签 \n Group.prototype.isEntityGroup = function () {\n return true;\n };\n Group.prototype.createDom = function () {\n var element = Object(_util_dom__WEBPACK_IMPORTED_MODULE_7__[/* createSVGElement */ "b"])(\'g\');\n this.set(\'el\', element);\n var parent = this.getParent();\n if (parent) {\n var parentNode = parent.get(\'el\');\n if (parentNode) {\n parentNode.appendChild(element);\n }\n else {\n // parentNode maybe null for group\n parentNode = parent.createDom();\n parent.set(\'el\', parentNode);\n parentNode.appendChild(element);\n }\n }\n return element;\n };\n // 覆盖基类的 afterAttrsChange 方法\n Group.prototype.afterAttrsChange = function (targetAttrs) {\n _super.prototype.afterAttrsChange.call(this, targetAttrs);\n var canvas = this.get(\'canvas\');\n // 只有挂载到画布下,才对元素进行实际渲染\n if (canvas && canvas.get(\'autoDraw\')) {\n var context = canvas.get(\'context\');\n this.createPath(context, targetAttrs);\n }\n };\n /**\n * 一些方法调用会引起画布变化\n * @param {ChangeType} changeType 改变的类型\n */\n Group.prototype.onCanvasChange = function (changeType) {\n Object(_util_draw__WEBPACK_IMPORTED_MODULE_4__[/* refreshElement */ "b"])(this, changeType);\n };\n Group.prototype.getShapeBase = function () {\n return _shape__WEBPACK_IMPORTED_MODULE_3__;\n };\n Group.prototype.getGroupBase = function () {\n return Group;\n };\n Group.prototype.draw = function (context) {\n var children = this.getChildren();\n var el = this.get(\'el\');\n if (this.get(\'destroyed\')) {\n if (el) {\n el.parentNode.removeChild(el);\n }\n }\n else {\n if (!el) {\n this.createDom();\n }\n Object(_util_svg__WEBPACK_IMPORTED_MODULE_5__[/* setClip */ "a"])(this, context);\n this.createPath(context);\n if (children.length) {\n Object(_util_draw__WEBPACK_IMPORTED_MODULE_4__[/* drawChildren */ "a"])(context, children);\n }\n }\n };\n /**\n * 绘制分组的路径\n * @param {Defs} context 上下文\n * @param {ShapeAttrs} targetAttrs 渲染的目标属性\n */\n Group.prototype.createPath = function (context, targetAttrs) {\n var attrs = this.attr();\n var el = this.get(\'el\');\n Object(_antv_util__WEBPACK_IMPORTED_MODULE_2__["each"])(targetAttrs || attrs, function (value, attr) {\n if (_constant__WEBPACK_IMPORTED_MODULE_6__[/* SVG_ATTR_MAP */ "b"][attr]) {\n el.setAttribute(_constant__WEBPACK_IMPORTED_MODULE_6__[/* SVG_ATTR_MAP */ "b"][attr], value);\n }\n });\n Object(_util_svg__WEBPACK_IMPORTED_MODULE_5__[/* setTransform */ "c"])(this);\n };\n return Group;\n}(_antv_g_base__WEBPACK_IMPORTED_MODULE_1__["AbstractGroup"]));\n/* harmony default export */ __webpack_exports__["a"] = (Group);\n//# sourceMappingURL=group.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy1zdmcvZXNtL2dyb3VwLmpzP2U3M2UiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFrQztBQUNXO0FBQ1g7QUFDRDtBQUMwQjtBQUNSO0FBQ1Q7QUFDSTtBQUM5QztBQUNBLElBQUksdURBQVM7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLDBFQUFnQjtBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsV0FBVztBQUMxQjtBQUNBO0FBQ0EsUUFBUSx5RUFBYztBQUN0QjtBQUNBO0FBQ0EsZUFBZSxtQ0FBSztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksaUVBQU87QUFDbkI7QUFDQTtBQUNBLGdCQUFnQix1RUFBWTtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxLQUFLO0FBQ3BCLGVBQWUsV0FBVztBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsdURBQUk7QUFDWixnQkFBZ0IsOERBQVk7QUFDNUIsZ0NBQWdDLDhEQUFZO0FBQzVDO0FBQ0EsU0FBUztBQUNULFFBQVEsc0VBQVk7QUFDcEI7QUFDQTtBQUNBLENBQUMsQ0FBQywwREFBYTtBQUNBLDhEQUFLLEVBQUM7QUFDckIiLCJmaWxlIjoiNzguanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IEFic3RyYWN0R3JvdXAgfSBmcm9tICdAYW50di9nLWJhc2UnO1xuaW1wb3J0IHsgZWFjaCB9IGZyb20gJ0BhbnR2L3V0aWwnO1xuaW1wb3J0ICogYXMgU2hhcGUgZnJvbSAnLi9zaGFwZSc7XG5pbXBvcnQgeyBkcmF3Q2hpbGRyZW4sIHJlZnJlc2hFbGVtZW50IH0gZnJvbSAnLi91dGlsL2RyYXcnO1xuaW1wb3J0IHsgc2V0Q2xpcCwgc2V0VHJhbnNmb3JtIH0gZnJvbSAnLi91dGlsL3N2Zyc7XG5pbXBvcnQgeyBTVkdfQVRUUl9NQVAgfSBmcm9tICcuL2NvbnN0YW50JztcbmltcG9ydCB7IGNyZWF0ZVNWR0VsZW1lbnQgfSBmcm9tICcuL3V0aWwvZG9tJztcbnZhciBHcm91cCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoR3JvdXAsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gR3JvdXAoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICB9XG4gICAgLy8gU1ZHIOS4reWIhue7hOWvueW6lOWunuS9k+agh+etviA8Zz5cbiAgICBHcm91cC5wcm90b3R5cGUuaXNFbnRpdHlHcm91cCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcbiAgICBHcm91cC5wcm90b3R5cGUuY3JlYXRlRG9tID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZWxlbWVudCA9IGNyZWF0ZVNWR0VsZW1lbnQoJ2cnKTtcbiAgICAgICAgdGhpcy5zZXQoJ2VsJywgZWxlbWVudCk7XG4gICAgICAgIHZhciBwYXJlbnQgPSB0aGlzLmdldFBhcmVudCgpO1xuICAgICAgICBpZiAocGFyZW50KSB7XG4gICAgICAgICAgICB2YXIgcGFyZW50Tm9kZSA9IHBhcmVudC5nZXQoJ2VsJyk7XG4gICAgICAgICAgICBpZiAocGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgICAgIHBhcmVudE5vZGUuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBwYXJlbnROb2RlIG1heWJlIG51bGwgZm9yIGdyb3VwXG4gICAgICAgICAgICAgICAgcGFyZW50Tm9kZSA9IHBhcmVudC5jcmVhdGVEb20oKTtcbiAgICAgICAgICAgICAgICBwYXJlbnQuc2V0KCdlbCcsIHBhcmVudE5vZGUpO1xuICAgICAgICAgICAgICAgIHBhcmVudE5vZGUuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgfTtcbiAgICAvLyDopobnm5bln7rnsbvnmoQgYWZ0ZXJBdHRyc0NoYW5nZSDmlrnms5VcbiAgICBHcm91cC5wcm90b3R5cGUuYWZ0ZXJBdHRyc0NoYW5nZSA9IGZ1bmN0aW9uICh0YXJnZXRBdHRycykge1xuICAgICAgICBfc3VwZXIucHJvdG90eXBlLmFmdGVyQXR0cnNDaGFuZ2UuY2FsbCh0aGlzLCB0YXJnZXRBdHRycyk7XG4gICAgICAgIHZhciBjYW52YXMgPSB0aGlzLmdldCgnY2FudmFzJyk7XG4gICAgICAgIC8vIOWPquacieaMgui9veWIsOeUu+W4g+S4i++8jOaJjeWvueWFg+e0oOi/m+ihjOWunumZhea4suafk1xuICAgICAgICBpZiAoY2FudmFzICYmIGNhbnZhcy5nZXQoJ2F1dG9EcmF3JykpIHtcbiAgICAgICAgICAgIHZhciBjb250ZXh0ID0gY2FudmFzLmdldCgnY29udGV4dCcpO1xuICAgICAgICAgICAgdGhpcy5jcmVhdGVQYXRoKGNvbnRleHQsIHRhcmdldEF0dHJzKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICog5LiA5Lqb5pa55rOV6LCD55So5Lya5byV6LW355S75biD5Y+Y5YyWXG4gICAgICogQHBhcmFtIHtDaGFuZ2VUeXBlfSBjaGFuZ2VUeXBlIOaUueWPmOeahOexu+Wei1xuICAgICAqL1xuICAgIEdyb3VwLnByb3RvdHlwZS5vbkNhbnZhc0NoYW5nZSA9IGZ1bmN0aW9uIChjaGFuZ2VUeXBlKSB7XG4gICAgICAgIHJlZnJlc2hFbGVtZW50KHRoaXMsIGNoYW5nZVR5cGUpO1xuICAgIH07XG4gICAgR3JvdXAucHJvdG90eXBlLmdldFNoYXBlQmFzZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIFNoYXBlO1xuICAgIH07XG4gICAgR3JvdXAucHJvdG90eXBlLmdldEdyb3VwQmFzZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIEdyb3VwO1xuICAgIH07XG4gICAgR3JvdXAucHJvdG90eXBlLmRyYXcgPSBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLmdldENoaWxkcmVuKCk7XG4gICAgICAgIHZhciBlbCA9IHRoaXMuZ2V0KCdlbCcpO1xuICAgICAgICBpZiAodGhpcy5nZXQoJ2Rlc3Ryb3llZCcpKSB7XG4gICAgICAgICAgICBpZiAoZWwpIHtcbiAgICAgICAgICAgICAgICBlbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGVsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmICghZWwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZURvbSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2V0Q2xpcCh0aGlzLCBjb250ZXh0KTtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlUGF0aChjb250ZXh0KTtcbiAgICAgICAgICAgIGlmIChjaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBkcmF3Q2hpbGRyZW4oY29udGV4dCwgY2hpbGRyZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiDnu5jliLbliIbnu4TnmoTot6/lvoRcbiAgICAgKiBAcGFyYW0ge0RlZnN9IGNvbnRleHQg5LiK5LiL5paHXG4gICAgICogQHBhcmFtIHtTaGFwZUF0dHJzfSB0YXJnZXRBdHRycyDmuLLmn5PnmoTnm67moIflsZ7mgKdcbiAgICAgKi9cbiAgICBHcm91cC5wcm90b3R5cGUuY3JlYXRlUGF0aCA9IGZ1bmN0aW9uIChjb250ZXh0LCB0YXJnZXRBdHRycykge1xuICAgICAgICB2YXIgYXR0cnMgPSB0aGlzLmF0dHIoKTtcbiAgICAgICAgdmFyIGVsID0gdGhpcy5nZXQoJ2VsJyk7XG4gICAgICAgIGVhY2godGFyZ2V0QXR0cnMgfHwgYXR0cnMsIGZ1bmN0aW9uICh2YWx1ZSwgYXR0cikge1xuICAgICAgICAgICAgaWYgKFNWR19BVFRSX01BUFthdHRyXSkge1xuICAgICAgICAgICAgICAgIGVsLnNldEF0dHJpYnV0ZShTVkdfQVRUUl9NQVBbYXR0cl0sIHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHNldFRyYW5zZm9ybSh0aGlzKTtcbiAgICB9O1xuICAgIHJldHVybiBHcm91cDtcbn0oQWJzdHJhY3RHcm91cCkpO1xuZXhwb3J0IGRlZmF1bHQgR3JvdXA7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1ncm91cC5qcy5tYXAiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///78\n')},function(module,__webpack_exports__,__webpack_require__){"use strict";eval('/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return AABB; });\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6);\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(7);\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var gl_matrix__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(2);\n\n\n\n\n/**\n * Axis-Aligned Bounding Box\n * 为了便于后续 Frustum Culling,通过查找表定义 p-vertex 和 n-vertex\n * @see https://github.com/antvis/GWebGPUEngine/issues/3\n */\nvar AABB = /*#__PURE__*/function () {\n function AABB(center, halfExtents) {\n _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, AABB);\n\n this.center = void 0;\n this.halfExtents = void 0;\n this.min = gl_matrix__WEBPACK_IMPORTED_MODULE_2__[/* vec3 */ "e"].create();\n this.max = gl_matrix__WEBPACK_IMPORTED_MODULE_2__[/* vec3 */ "e"].create();\n this.update(center, halfExtents);\n }\n\n _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(AABB, [{\n key: "update",\n value: function update(center, halfExtents) {\n this.center = center || gl_matrix__WEBPACK_IMPORTED_MODULE_2__[/* vec3 */ "e"].create();\n this.halfExtents = halfExtents || gl_matrix__WEBPACK_IMPORTED_MODULE_2__[/* vec3 */ "e"].fromValues(0.5, 0.5, 0.5);\n this.min = gl_matrix__WEBPACK_IMPORTED_MODULE_2__[/* vec3 */ "e"].sub(this.min, this.center, this.halfExtents);\n this.max = gl_matrix__WEBPACK_IMPORTED_MODULE_2__[/* vec3 */ "e"].add(this.max, this.center, this.halfExtents);\n }\n }, {\n key: "setMinMax",\n value: function setMinMax(min, max) {\n gl_matrix__WEBPACK_IMPORTED_MODULE_2__[/* vec3 */ "e"].add(this.center, max, min);\n gl_matrix__WEBPACK_IMPORTED_MODULE_2__[/* vec3 */ "e"].scale(this.center, this.center, 0.5);\n gl_matrix__WEBPACK_IMPORTED_MODULE_2__[/* vec3 */ "e"].sub(this.halfExtents, max, min);\n gl_matrix__WEBPACK_IMPORTED_MODULE_2__[/* vec3 */ "e"].scale(this.halfExtents, this.halfExtents, 0.5);\n gl_matrix__WEBPACK_IMPORTED_MODULE_2__[/* vec3 */ "e"].copy(this.min, min);\n gl_matrix__WEBPACK_IMPORTED_MODULE_2__[/* vec3 */ "e"].copy(this.max, max);\n }\n }, {\n key: "getMin",\n value: function getMin() {\n return this.min;\n }\n }, {\n key: "getMax",\n value: function getMax() {\n return this.max;\n }\n }, {\n key: "add",\n value: function add(aabb) {\n var tc = this.center;\n var tcx = tc[0];\n var tcy = tc[1];\n var tcz = tc[2];\n var th = this.halfExtents;\n var thx = th[0];\n var thy = th[1];\n var thz = th[2];\n var tminx = tcx - thx;\n var tmaxx = tcx + thx;\n var tminy = tcy - thy;\n var tmaxy = tcy + thy;\n var tminz = tcz - thz;\n var tmaxz = tcz + thz;\n var oc = aabb.center;\n var ocx = oc[0];\n var ocy = oc[1];\n var ocz = oc[2];\n var oh = aabb.halfExtents;\n var ohx = oh[0];\n var ohy = oh[1];\n var ohz = oh[2];\n var ominx = ocx - ohx;\n var omaxx = ocx + ohx;\n var ominy = ocy - ohy;\n var omaxy = ocy + ohy;\n var ominz = ocz - ohz;\n var omaxz = ocz + ohz;\n\n if (ominx < tminx) {\n tminx = ominx;\n }\n\n if (omaxx > tmaxx) {\n tmaxx = omaxx;\n }\n\n if (ominy < tminy) {\n tminy = ominy;\n }\n\n if (omaxy > tmaxy) {\n tmaxy = omaxy;\n }\n\n if (ominz < tminz) {\n tminz = ominz;\n }\n\n if (omaxz > tmaxz) {\n tmaxz = omaxz;\n }\n\n tc[0] = (tminx + tmaxx) * 0.5;\n tc[1] = (tminy + tmaxy) * 0.5;\n tc[2] = (tminz + tmaxz) * 0.5;\n th[0] = (tmaxx - tminx) * 0.5;\n th[1] = (tmaxy - tminy) * 0.5;\n th[2] = (tmaxz - tminz) * 0.5;\n this.min[0] = tminx;\n this.min[1] = tminy;\n this.min[2] = tminz;\n this.max[0] = tmaxx;\n this.max[1] = tmaxy;\n this.max[2] = tmaxz;\n }\n }, {\n key: "intersects",\n value: function intersects(aabb) {\n var aMax = this.getMax();\n var aMin = this.getMin();\n var bMax = aabb.getMax();\n var bMin = aabb.getMin();\n return aMin[0] <= bMax[0] && aMax[0] >= bMin[0] && aMin[1] <= bMax[1] && aMax[1] >= bMin[1] && aMin[2] <= bMax[2] && aMax[2] >= bMin[2];\n }\n }, {\n key: "containsPoint",\n value: function containsPoint(point) {\n var min = this.getMin();\n var max = this.getMax();\n return !(point[0] < min[0] || point[0] > max[0] || point[1] < min[1] || point[1] > max[1] || point[2] < min[2] || point[2] > max[2]);\n }\n /**\n * get n-vertex\n * @param plane plane of CullingVolume\n */\n\n }, {\n key: "getNegativeFarPoint",\n value: function getNegativeFarPoint(plane) {\n if (plane.pnVertexFlag === 0x111) {\n return gl_matrix__WEBPACK_IMPORTED_MODULE_2__[/* vec3 */ "e"].copy(gl_matrix__WEBPACK_IMPORTED_MODULE_2__[/* vec3 */ "e"].create(), this.min);\n } else if (plane.pnVertexFlag === 0x110) {\n return gl_matrix__WEBPACK_IMPORTED_MODULE_2__[/* vec3 */ "e"].fromValues(this.min[0], this.min[1], this.max[2]);\n } else if (plane.pnVertexFlag === 0x101) {\n return gl_matrix__WEBPACK_IMPORTED_MODULE_2__[/* vec3 */ "e"].fromValues(this.min[0], this.max[1], this.min[2]);\n } else if (plane.pnVertexFlag === 0x100) {\n return gl_matrix__WEBPACK_IMPORTED_MODULE_2__[/* vec3 */ "e"].fromValues(this.min[0], this.max[1], this.max[2]);\n } else if (plane.pnVertexFlag === 0x011) {\n return gl_matrix__WEBPACK_IMPORTED_MODULE_2__[/* vec3 */ "e"].fromValues(this.max[0], this.min[1], this.min[2]);\n } else if (plane.pnVertexFlag === 0x010) {\n return gl_matrix__WEBPACK_IMPORTED_MODULE_2__[/* vec3 */ "e"].fromValues(this.max[0], this.min[1], this.max[2]);\n } else if (plane.pnVertexFlag === 0x001) {\n return gl_matrix__WEBPACK_IMPORTED_MODULE_2__[/* vec3 */ "e"].fromValues(this.max[0], this.max[1], this.min[2]);\n } else {\n return gl_matrix__WEBPACK_IMPORTED_MODULE_2__[/* vec3 */ "e"].fromValues(this.max[0], this.max[1], this.max[2]);\n }\n }\n /**\n * get p-vertex\n * @param plane plane of CullingVolume\n */\n\n }, {\n key: "getPositiveFarPoint",\n value: function getPositiveFarPoint(plane) {\n if (plane.pnVertexFlag === 0x111) {\n return gl_matrix__WEBPACK_IMPORTED_MODULE_2__[/* vec3 */ "e"].copy(gl_matrix__WEBPACK_IMPORTED_MODULE_2__[/* vec3 */ "e"].create(), this.max);\n } else if (plane.pnVertexFlag === 0x110) {\n return gl_matrix__WEBPACK_IMPORTED_MODULE_2__[/* vec3 */ "e"].fromValues(this.max[0], this.max[1], this.min[2]);\n } else if (plane.pnVertexFlag === 0x101) {\n return gl_matrix__WEBPACK_IMPORTED_MODULE_2__[/* vec3 */ "e"].fromValues(this.max[0], this.min[1], this.max[2]);\n } else if (plane.pnVertexFlag === 0x100) {\n return gl_matrix__WEBPACK_IMPORTED_MODULE_2__[/* vec3 */ "e"].fromValues(this.max[0], this.min[1], this.min[2]);\n } else if (plane.pnVertexFlag === 0x011) {\n return gl_matrix__WEBPACK_IMPORTED_MODULE_2__[/* vec3 */ "e"].fromValues(this.min[0], this.max[1], this.max[2]);\n } else if (plane.pnVertexFlag === 0x010) {\n return gl_matrix__WEBPACK_IMPORTED_MODULE_2__[/* vec3 */ "e"].fromValues(this.min[0], this.max[1], this.min[2]);\n } else if (plane.pnVertexFlag === 0x001) {\n return gl_matrix__WEBPACK_IMPORTED_MODULE_2__[/* vec3 */ "e"].fromValues(this.min[0], this.min[1], this.max[2]);\n } else {\n return gl_matrix__WEBPACK_IMPORTED_MODULE_2__[/* vec3 */ "e"].fromValues(this.min[0], this.min[1], this.min[2]);\n }\n }\n }]);\n\n return AABB;\n}();\n//# sourceMappingURL=AABB.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy13ZWJncHUtY29yZS9lcy9zaGFwZS9BQUJCLmpzPzEwZDEiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQW9FO0FBQ047QUFDN0I7O0FBRWpDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0EsSUFBSSw0RUFBZTs7QUFFbkI7QUFDQTtBQUNBLGVBQWUsc0RBQUk7QUFDbkIsZUFBZSxzREFBSTtBQUNuQjtBQUNBOztBQUVBLEVBQUUseUVBQVk7QUFDZDtBQUNBO0FBQ0EsOEJBQThCLHNEQUFJO0FBQ2xDLHdDQUF3QyxzREFBSTtBQUM1QyxpQkFBaUIsc0RBQUk7QUFDckIsaUJBQWlCLHNEQUFJO0FBQ3JCO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxNQUFNLHNEQUFJO0FBQ1YsTUFBTSxzREFBSTtBQUNWLE1BQU0sc0RBQUk7QUFDVixNQUFNLHNEQUFJO0FBQ1YsTUFBTSxzREFBSTtBQUNWLE1BQU0sc0RBQUk7QUFDVjtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsZUFBZSxzREFBSSxNQUFNLHNEQUFJO0FBQzdCLE9BQU87QUFDUCxlQUFlLHNEQUFJO0FBQ25CLE9BQU87QUFDUCxlQUFlLHNEQUFJO0FBQ25CLE9BQU87QUFDUCxlQUFlLHNEQUFJO0FBQ25CLE9BQU87QUFDUCxlQUFlLHNEQUFJO0FBQ25CLE9BQU87QUFDUCxlQUFlLHNEQUFJO0FBQ25CLE9BQU87QUFDUCxlQUFlLHNEQUFJO0FBQ25CLE9BQU87QUFDUCxlQUFlLHNEQUFJO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsZUFBZSxzREFBSSxNQUFNLHNEQUFJO0FBQzdCLE9BQU87QUFDUCxlQUFlLHNEQUFJO0FBQ25CLE9BQU87QUFDUCxlQUFlLHNEQUFJO0FBQ25CLE9BQU87QUFDUCxlQUFlLHNEQUFJO0FBQ25CLE9BQU87QUFDUCxlQUFlLHNEQUFJO0FBQ25CLE9BQU87QUFDUCxlQUFlLHNEQUFJO0FBQ25CLE9BQU87QUFDUCxlQUFlLHNEQUFJO0FBQ25CLE9BQU87QUFDUCxlQUFlLHNEQUFJO0FBQ25CO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0EsQ0FBQztBQUNEIiwiZmlsZSI6Ijc5LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzc1wiO1xuaW1wb3J0IHsgdmVjMyB9IGZyb20gJ2dsLW1hdHJpeCc7XG5cbi8qKlxuICogQXhpcy1BbGlnbmVkIEJvdW5kaW5nIEJveFxuICog5Li65LqG5L6/5LqO5ZCO57utIEZydXN0dW0gQ3VsbGluZ++8jOmAmui/h+afpeaJvuihqOWumuS5iSBwLXZlcnRleCDlkowgbi12ZXJ0ZXhcbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2FudHZpcy9HV2ViR1BVRW5naW5lL2lzc3Vlcy8zXG4gKi9cbmV4cG9ydCB2YXIgQUFCQiA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEFBQkIoY2VudGVyLCBoYWxmRXh0ZW50cykge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBBQUJCKTtcblxuICAgIHRoaXMuY2VudGVyID0gdm9pZCAwO1xuICAgIHRoaXMuaGFsZkV4dGVudHMgPSB2b2lkIDA7XG4gICAgdGhpcy5taW4gPSB2ZWMzLmNyZWF0ZSgpO1xuICAgIHRoaXMubWF4ID0gdmVjMy5jcmVhdGUoKTtcbiAgICB0aGlzLnVwZGF0ZShjZW50ZXIsIGhhbGZFeHRlbnRzKTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhBQUJCLCBbe1xuICAgIGtleTogXCJ1cGRhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdXBkYXRlKGNlbnRlciwgaGFsZkV4dGVudHMpIHtcbiAgICAgIHRoaXMuY2VudGVyID0gY2VudGVyIHx8IHZlYzMuY3JlYXRlKCk7XG4gICAgICB0aGlzLmhhbGZFeHRlbnRzID0gaGFsZkV4dGVudHMgfHwgdmVjMy5mcm9tVmFsdWVzKDAuNSwgMC41LCAwLjUpO1xuICAgICAgdGhpcy5taW4gPSB2ZWMzLnN1Yih0aGlzLm1pbiwgdGhpcy5jZW50ZXIsIHRoaXMuaGFsZkV4dGVudHMpO1xuICAgICAgdGhpcy5tYXggPSB2ZWMzLmFkZCh0aGlzLm1heCwgdGhpcy5jZW50ZXIsIHRoaXMuaGFsZkV4dGVudHMpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzZXRNaW5NYXhcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0TWluTWF4KG1pbiwgbWF4KSB7XG4gICAgICB2ZWMzLmFkZCh0aGlzLmNlbnRlciwgbWF4LCBtaW4pO1xuICAgICAgdmVjMy5zY2FsZSh0aGlzLmNlbnRlciwgdGhpcy5jZW50ZXIsIDAuNSk7XG4gICAgICB2ZWMzLnN1Yih0aGlzLmhhbGZFeHRlbnRzLCBtYXgsIG1pbik7XG4gICAgICB2ZWMzLnNjYWxlKHRoaXMuaGFsZkV4dGVudHMsIHRoaXMuaGFsZkV4dGVudHMsIDAuNSk7XG4gICAgICB2ZWMzLmNvcHkodGhpcy5taW4sIG1pbik7XG4gICAgICB2ZWMzLmNvcHkodGhpcy5tYXgsIG1heCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldE1pblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRNaW4oKSB7XG4gICAgICByZXR1cm4gdGhpcy5taW47XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldE1heFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRNYXgoKSB7XG4gICAgICByZXR1cm4gdGhpcy5tYXg7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImFkZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhZGQoYWFiYikge1xuICAgICAgdmFyIHRjID0gdGhpcy5jZW50ZXI7XG4gICAgICB2YXIgdGN4ID0gdGNbMF07XG4gICAgICB2YXIgdGN5ID0gdGNbMV07XG4gICAgICB2YXIgdGN6ID0gdGNbMl07XG4gICAgICB2YXIgdGggPSB0aGlzLmhhbGZFeHRlbnRzO1xuICAgICAgdmFyIHRoeCA9IHRoWzBdO1xuICAgICAgdmFyIHRoeSA9IHRoWzFdO1xuICAgICAgdmFyIHRoeiA9IHRoWzJdO1xuICAgICAgdmFyIHRtaW54ID0gdGN4IC0gdGh4O1xuICAgICAgdmFyIHRtYXh4ID0gdGN4ICsgdGh4O1xuICAgICAgdmFyIHRtaW55ID0gdGN5IC0gdGh5O1xuICAgICAgdmFyIHRtYXh5ID0gdGN5ICsgdGh5O1xuICAgICAgdmFyIHRtaW56ID0gdGN6IC0gdGh6O1xuICAgICAgdmFyIHRtYXh6ID0gdGN6ICsgdGh6O1xuICAgICAgdmFyIG9jID0gYWFiYi5jZW50ZXI7XG4gICAgICB2YXIgb2N4ID0gb2NbMF07XG4gICAgICB2YXIgb2N5ID0gb2NbMV07XG4gICAgICB2YXIgb2N6ID0gb2NbMl07XG4gICAgICB2YXIgb2ggPSBhYWJiLmhhbGZFeHRlbnRzO1xuICAgICAgdmFyIG9oeCA9IG9oWzBdO1xuICAgICAgdmFyIG9oeSA9IG9oWzFdO1xuICAgICAgdmFyIG9oeiA9IG9oWzJdO1xuICAgICAgdmFyIG9taW54ID0gb2N4IC0gb2h4O1xuICAgICAgdmFyIG9tYXh4ID0gb2N4ICsgb2h4O1xuICAgICAgdmFyIG9taW55ID0gb2N5IC0gb2h5O1xuICAgICAgdmFyIG9tYXh5ID0gb2N5ICsgb2h5O1xuICAgICAgdmFyIG9taW56ID0gb2N6IC0gb2h6O1xuICAgICAgdmFyIG9tYXh6ID0gb2N6ICsgb2h6O1xuXG4gICAgICBpZiAob21pbnggPCB0bWlueCkge1xuICAgICAgICB0bWlueCA9IG9taW54O1xuICAgICAgfVxuXG4gICAgICBpZiAob21heHggPiB0bWF4eCkge1xuICAgICAgICB0bWF4eCA9IG9tYXh4O1xuICAgICAgfVxuXG4gICAgICBpZiAob21pbnkgPCB0bWlueSkge1xuICAgICAgICB0bWlueSA9IG9taW55O1xuICAgICAgfVxuXG4gICAgICBpZiAob21heHkgPiB0bWF4eSkge1xuICAgICAgICB0bWF4eSA9IG9tYXh5O1xuICAgICAgfVxuXG4gICAgICBpZiAob21pbnogPCB0bWlueikge1xuICAgICAgICB0bWlueiA9IG9taW56O1xuICAgICAgfVxuXG4gICAgICBpZiAob21heHogPiB0bWF4eikge1xuICAgICAgICB0bWF4eiA9IG9tYXh6O1xuICAgICAgfVxuXG4gICAgICB0Y1swXSA9ICh0bWlueCArIHRtYXh4KSAqIDAuNTtcbiAgICAgIHRjWzFdID0gKHRtaW55ICsgdG1heHkpICogMC41O1xuICAgICAgdGNbMl0gPSAodG1pbnogKyB0bWF4eikgKiAwLjU7XG4gICAgICB0aFswXSA9ICh0bWF4eCAtIHRtaW54KSAqIDAuNTtcbiAgICAgIHRoWzFdID0gKHRtYXh5IC0gdG1pbnkpICogMC41O1xuICAgICAgdGhbMl0gPSAodG1heHogLSB0bWlueikgKiAwLjU7XG4gICAgICB0aGlzLm1pblswXSA9IHRtaW54O1xuICAgICAgdGhpcy5taW5bMV0gPSB0bWlueTtcbiAgICAgIHRoaXMubWluWzJdID0gdG1pbno7XG4gICAgICB0aGlzLm1heFswXSA9IHRtYXh4O1xuICAgICAgdGhpcy5tYXhbMV0gPSB0bWF4eTtcbiAgICAgIHRoaXMubWF4WzJdID0gdG1heHo7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImludGVyc2VjdHNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaW50ZXJzZWN0cyhhYWJiKSB7XG4gICAgICB2YXIgYU1heCA9IHRoaXMuZ2V0TWF4KCk7XG4gICAgICB2YXIgYU1pbiA9IHRoaXMuZ2V0TWluKCk7XG4gICAgICB2YXIgYk1heCA9IGFhYmIuZ2V0TWF4KCk7XG4gICAgICB2YXIgYk1pbiA9IGFhYmIuZ2V0TWluKCk7XG4gICAgICByZXR1cm4gYU1pblswXSA8PSBiTWF4WzBdICYmIGFNYXhbMF0gPj0gYk1pblswXSAmJiBhTWluWzFdIDw9IGJNYXhbMV0gJiYgYU1heFsxXSA+PSBiTWluWzFdICYmIGFNaW5bMl0gPD0gYk1heFsyXSAmJiBhTWF4WzJdID49IGJNaW5bMl07XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNvbnRhaW5zUG9pbnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29udGFpbnNQb2ludChwb2ludCkge1xuICAgICAgdmFyIG1pbiA9IHRoaXMuZ2V0TWluKCk7XG4gICAgICB2YXIgbWF4ID0gdGhpcy5nZXRNYXgoKTtcbiAgICAgIHJldHVybiAhKHBvaW50WzBdIDwgbWluWzBdIHx8IHBvaW50WzBdID4gbWF4WzBdIHx8IHBvaW50WzFdIDwgbWluWzFdIHx8IHBvaW50WzFdID4gbWF4WzFdIHx8IHBvaW50WzJdIDwgbWluWzJdIHx8IHBvaW50WzJdID4gbWF4WzJdKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogZ2V0IG4tdmVydGV4XG4gICAgICogQHBhcmFtIHBsYW5lIHBsYW5lIG9mIEN1bGxpbmdWb2x1bWVcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImdldE5lZ2F0aXZlRmFyUG9pbnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0TmVnYXRpdmVGYXJQb2ludChwbGFuZSkge1xuICAgICAgaWYgKHBsYW5lLnBuVmVydGV4RmxhZyA9PT0gMHgxMTEpIHtcbiAgICAgICAgcmV0dXJuIHZlYzMuY29weSh2ZWMzLmNyZWF0ZSgpLCB0aGlzLm1pbik7XG4gICAgICB9IGVsc2UgaWYgKHBsYW5lLnBuVmVydGV4RmxhZyA9PT0gMHgxMTApIHtcbiAgICAgICAgcmV0dXJuIHZlYzMuZnJvbVZhbHVlcyh0aGlzLm1pblswXSwgdGhpcy5taW5bMV0sIHRoaXMubWF4WzJdKTtcbiAgICAgIH0gZWxzZSBpZiAocGxhbmUucG5WZXJ0ZXhGbGFnID09PSAweDEwMSkge1xuICAgICAgICByZXR1cm4gdmVjMy5mcm9tVmFsdWVzKHRoaXMubWluWzBdLCB0aGlzLm1heFsxXSwgdGhpcy5taW5bMl0pO1xuICAgICAgfSBlbHNlIGlmIChwbGFuZS5wblZlcnRleEZsYWcgPT09IDB4MTAwKSB7XG4gICAgICAgIHJldHVybiB2ZWMzLmZyb21WYWx1ZXModGhpcy5taW5bMF0sIHRoaXMubWF4WzFdLCB0aGlzLm1heFsyXSk7XG4gICAgICB9IGVsc2UgaWYgKHBsYW5lLnBuVmVydGV4RmxhZyA9PT0gMHgwMTEpIHtcbiAgICAgICAgcmV0dXJuIHZlYzMuZnJvbVZhbHVlcyh0aGlzLm1heFswXSwgdGhpcy5taW5bMV0sIHRoaXMubWluWzJdKTtcbiAgICAgIH0gZWxzZSBpZiAocGxhbmUucG5WZXJ0ZXhGbGFnID09PSAweDAxMCkge1xuICAgICAgICByZXR1cm4gdmVjMy5mcm9tVmFsdWVzKHRoaXMubWF4WzBdLCB0aGlzLm1pblsxXSwgdGhpcy5tYXhbMl0pO1xuICAgICAgfSBlbHNlIGlmIChwbGFuZS5wblZlcnRleEZsYWcgPT09IDB4MDAxKSB7XG4gICAgICAgIHJldHVybiB2ZWMzLmZyb21WYWx1ZXModGhpcy5tYXhbMF0sIHRoaXMubWF4WzFdLCB0aGlzLm1pblsyXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdmVjMy5mcm9tVmFsdWVzKHRoaXMubWF4WzBdLCB0aGlzLm1heFsxXSwgdGhpcy5tYXhbMl0pO1xuICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBnZXQgcC12ZXJ0ZXhcbiAgICAgKiBAcGFyYW0gcGxhbmUgcGxhbmUgb2YgQ3VsbGluZ1ZvbHVtZVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0UG9zaXRpdmVGYXJQb2ludFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRQb3NpdGl2ZUZhclBvaW50KHBsYW5lKSB7XG4gICAgICBpZiAocGxhbmUucG5WZXJ0ZXhGbGFnID09PSAweDExMSkge1xuICAgICAgICByZXR1cm4gdmVjMy5jb3B5KHZlYzMuY3JlYXRlKCksIHRoaXMubWF4KTtcbiAgICAgIH0gZWxzZSBpZiAocGxhbmUucG5WZXJ0ZXhGbGFnID09PSAweDExMCkge1xuICAgICAgICByZXR1cm4gdmVjMy5mcm9tVmFsdWVzKHRoaXMubWF4WzBdLCB0aGlzLm1heFsxXSwgdGhpcy5taW5bMl0pO1xuICAgICAgfSBlbHNlIGlmIChwbGFuZS5wblZlcnRleEZsYWcgPT09IDB4MTAxKSB7XG4gICAgICAgIHJldHVybiB2ZWMzLmZyb21WYWx1ZXModGhpcy5tYXhbMF0sIHRoaXMubWluWzFdLCB0aGlzLm1heFsyXSk7XG4gICAgICB9IGVsc2UgaWYgKHBsYW5lLnBuVmVydGV4RmxhZyA9PT0gMHgxMDApIHtcbiAgICAgICAgcmV0dXJuIHZlYzMuZnJvbVZhbHVlcyh0aGlzLm1heFswXSwgdGhpcy5taW5bMV0sIHRoaXMubWluWzJdKTtcbiAgICAgIH0gZWxzZSBpZiAocGxhbmUucG5WZXJ0ZXhGbGFnID09PSAweDAxMSkge1xuICAgICAgICByZXR1cm4gdmVjMy5mcm9tVmFsdWVzKHRoaXMubWluWzBdLCB0aGlzLm1heFsxXSwgdGhpcy5tYXhbMl0pO1xuICAgICAgfSBlbHNlIGlmIChwbGFuZS5wblZlcnRleEZsYWcgPT09IDB4MDEwKSB7XG4gICAgICAgIHJldHVybiB2ZWMzLmZyb21WYWx1ZXModGhpcy5taW5bMF0sIHRoaXMubWF4WzFdLCB0aGlzLm1pblsyXSk7XG4gICAgICB9IGVsc2UgaWYgKHBsYW5lLnBuVmVydGV4RmxhZyA9PT0gMHgwMDEpIHtcbiAgICAgICAgcmV0dXJuIHZlYzMuZnJvbVZhbHVlcyh0aGlzLm1pblswXSwgdGhpcy5taW5bMV0sIHRoaXMubWF4WzJdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB2ZWMzLmZyb21WYWx1ZXModGhpcy5taW5bMF0sIHRoaXMubWluWzFdLCB0aGlzLm1pblsyXSk7XG4gICAgICB9XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEFBQkI7XG59KCk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1BQUJCLmpzLm1hcCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///79\n')},function(module,__webpack_exports__,__webpack_require__){"use strict";eval('// ESM COMPAT FLAG\n__webpack_require__.r(__webpack_exports__);\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, "Base", function() { return /* reexport */ base; });\n__webpack_require__.d(__webpack_exports__, "Circle", function() { return /* reexport */ circle; });\n__webpack_require__.d(__webpack_exports__, "Dom", function() { return /* reexport */ shape_dom; });\n__webpack_require__.d(__webpack_exports__, "Ellipse", function() { return /* reexport */ ellipse; });\n__webpack_require__.d(__webpack_exports__, "Image", function() { return /* reexport */ shape_image; });\n__webpack_require__.d(__webpack_exports__, "Line", function() { return /* reexport */ line; });\n__webpack_require__.d(__webpack_exports__, "Marker", function() { return /* reexport */ marker; });\n__webpack_require__.d(__webpack_exports__, "Path", function() { return /* reexport */ shape_path; });\n__webpack_require__.d(__webpack_exports__, "Polygon", function() { return /* reexport */ polygon; });\n__webpack_require__.d(__webpack_exports__, "Polyline", function() { return /* reexport */ polyline; });\n__webpack_require__.d(__webpack_exports__, "Rect", function() { return /* reexport */ rect; });\n__webpack_require__.d(__webpack_exports__, "Text", function() { return /* reexport */ shape_text; });\n\n// NAMESPACE OBJECT: ./node_modules/@antv/g-svg/esm/shape/index.js\nvar shape_namespaceObject = {};\n__webpack_require__.r(shape_namespaceObject);\n__webpack_require__.d(shape_namespaceObject, "Base", function() { return base; });\n__webpack_require__.d(shape_namespaceObject, "Circle", function() { return circle; });\n__webpack_require__.d(shape_namespaceObject, "Dom", function() { return shape_dom; });\n__webpack_require__.d(shape_namespaceObject, "Ellipse", function() { return ellipse; });\n__webpack_require__.d(shape_namespaceObject, "Image", function() { return shape_image; });\n__webpack_require__.d(shape_namespaceObject, "Line", function() { return line; });\n__webpack_require__.d(shape_namespaceObject, "Marker", function() { return marker; });\n__webpack_require__.d(shape_namespaceObject, "Path", function() { return shape_path; });\n__webpack_require__.d(shape_namespaceObject, "Polygon", function() { return polygon; });\n__webpack_require__.d(shape_namespaceObject, "Polyline", function() { return polyline; });\n__webpack_require__.d(shape_namespaceObject, "Rect", function() { return rect; });\n__webpack_require__.d(shape_namespaceObject, "Text", function() { return shape_text; });\n\n// EXTERNAL MODULE: ./node_modules/tslib/tslib.es6.js\nvar tslib_es6 = __webpack_require__(1);\n\n// EXTERNAL MODULE: ./node_modules/@antv/g-base/esm/index.js\nvar esm = __webpack_require__(21);\n\n// EXTERNAL MODULE: ./node_modules/@antv/g-svg/esm/util/svg.js\nvar svg = __webpack_require__(34);\n\n// EXTERNAL MODULE: ./node_modules/@antv/g-svg/esm/util/dom.js\nvar dom = __webpack_require__(26);\n\n// EXTERNAL MODULE: ./node_modules/@antv/g-svg/esm/util/draw.js\nvar draw = __webpack_require__(71);\n\n// EXTERNAL MODULE: ./node_modules/@antv/g-svg/esm/constant.js\nvar constant = __webpack_require__(17);\n\n// EXTERNAL MODULE: ./node_modules/@antv/g-svg/esm/group.js\nvar group = __webpack_require__(78);\n\n// CONCATENATED MODULE: ./node_modules/@antv/g-svg/esm/shape/base.js\n\n\n\n\n\n\n\n\n\nvar base_ShapeBase = /** @class */ (function (_super) {\n Object(tslib_es6["__extends"])(ShapeBase, _super);\n function ShapeBase() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n _this.type = \'svg\';\n _this.canFill = false;\n _this.canStroke = false;\n return _this;\n }\n ShapeBase.prototype.getDefaultAttrs = function () {\n var attrs = _super.prototype.getDefaultAttrs.call(this);\n // 设置默认值\n return Object(tslib_es6["__assign"])(Object(tslib_es6["__assign"])({}, attrs), { lineWidth: 1, lineAppendWidth: 0, strokeOpacity: 1, fillOpacity: 1 });\n };\n // 覆盖基类的 afterAttrsChange 方法\n ShapeBase.prototype.afterAttrsChange = function (targetAttrs) {\n _super.prototype.afterAttrsChange.call(this, targetAttrs);\n var canvas = this.get(\'canvas\');\n // 只有挂载到画布下,才对元素进行实际渲染\n if (canvas && canvas.get(\'autoDraw\')) {\n var context = canvas.get(\'context\');\n this.draw(context, targetAttrs);\n }\n };\n ShapeBase.prototype.getShapeBase = function () {\n return shape_namespaceObject;\n };\n ShapeBase.prototype.getGroupBase = function () {\n return group["a" /* default */];\n };\n /**\n * 一些方法调用会引起画布变化\n * @param {ChangeType} changeType 改变的类型\n */\n ShapeBase.prototype.onCanvasChange = function (changeType) {\n Object(draw["b" /* refreshElement */])(this, changeType);\n };\n ShapeBase.prototype.calculateBBox = function () {\n var el = this.get(\'el\');\n var bbox = null;\n // 包围盒计算依赖于绘制,如果还没有生成对应的 Dom 元素,则包围盒的长宽均为 0\n if (el) {\n bbox = el.getBBox();\n }\n else {\n var bboxMethod = Object(esm["getBBoxMethod"])(this.get(\'type\'));\n if (bboxMethod) {\n bbox = bboxMethod(this);\n }\n }\n if (bbox) {\n var x = bbox.x, y = bbox.y, width = bbox.width, height = bbox.height;\n var lineWidth = this.getHitLineWidth();\n var halfWidth = lineWidth / 2;\n var minX = x - halfWidth;\n var minY = y - halfWidth;\n var maxX = x + width + halfWidth;\n var maxY = y + height + halfWidth;\n return {\n x: minX,\n y: minY,\n minX: minX,\n minY: minY,\n maxX: maxX,\n maxY: maxY,\n width: width + lineWidth,\n height: height + lineWidth,\n };\n }\n return {\n x: 0,\n y: 0,\n minX: 0,\n minY: 0,\n maxX: 0,\n maxY: 0,\n width: 0,\n height: 0,\n };\n };\n ShapeBase.prototype.isFill = function () {\n var _a = this.attr(), fill = _a.fill, fillStyle = _a.fillStyle;\n return (fill || fillStyle || this.isClipShape()) && this.canFill;\n };\n ShapeBase.prototype.isStroke = function () {\n var _a = this.attr(), stroke = _a.stroke, strokeStyle = _a.strokeStyle;\n return (stroke || strokeStyle) && this.canStroke;\n };\n ShapeBase.prototype.draw = function (context, targetAttrs) {\n var el = this.get(\'el\');\n if (this.get(\'destroyed\')) {\n if (el) {\n el.parentNode.removeChild(el);\n }\n }\n else {\n if (!el) {\n Object(dom["a" /* createDom */])(this);\n }\n Object(svg["a" /* setClip */])(this, context);\n this.createPath(context, targetAttrs);\n this.shadow(context, targetAttrs);\n this.strokeAndFill(context, targetAttrs);\n this.transform(targetAttrs);\n }\n };\n /**\n * @protected\n * 绘制图形的路径\n * @param {Defs} context 上下文\n * @param {ShapeAttrs} targetAttrs 渲染的目标属性\n */\n ShapeBase.prototype.createPath = function (context, targetAttrs) { };\n // stroke and fill\n ShapeBase.prototype.strokeAndFill = function (context, targetAttrs) {\n var attrs = targetAttrs || this.attr();\n var fill = attrs.fill, fillStyle = attrs.fillStyle, stroke = attrs.stroke, strokeStyle = attrs.strokeStyle, fillOpacity = attrs.fillOpacity, strokeOpacity = attrs.strokeOpacity, lineWidth = attrs.lineWidth;\n var el = this.get(\'el\');\n if (this.canFill) {\n // 初次渲染和更新渲染的逻辑有所不同: 初次渲染值为空时,需要设置为 none,否则就会是黑色,而更新渲染则不需要\n if (!targetAttrs) {\n this._setColor(context, \'fill\', fill || fillStyle);\n }\n else if (\'fill\' in attrs) {\n this._setColor(context, \'fill\', fill);\n }\n else if (\'fillStyle\' in attrs) {\n // compatible with fillStyle\n this._setColor(context, \'fill\', fillStyle);\n }\n if (fillOpacity) {\n el.setAttribute(constant["b" /* SVG_ATTR_MAP */][\'fillOpacity\'], fillOpacity);\n }\n }\n if (this.canStroke && lineWidth > 0) {\n if (!targetAttrs) {\n this._setColor(context, \'stroke\', stroke || strokeStyle);\n }\n else if (\'stroke\' in attrs) {\n this._setColor(context, \'stroke\', stroke);\n }\n else if (\'strokeStyle\' in attrs) {\n // compatible with strokeStyle\n this._setColor(context, \'stroke\', strokeStyle);\n }\n if (strokeOpacity) {\n el.setAttribute(constant["b" /* SVG_ATTR_MAP */][\'strokeOpacity\'], strokeOpacity);\n }\n if (lineWidth) {\n el.setAttribute(constant["b" /* SVG_ATTR_MAP */][\'lineWidth\'], lineWidth);\n }\n }\n };\n ShapeBase.prototype._setColor = function (context, attr, value) {\n var el = this.get(\'el\');\n if (!value) {\n // need to set `none` to avoid default value\n el.setAttribute(constant["b" /* SVG_ATTR_MAP */][attr], \'none\');\n return;\n }\n value = value.trim();\n if (/^[r,R,L,l]{1}[\\s]*\\(/.test(value)) {\n var id = context.find(\'gradient\', value);\n if (!id) {\n id = context.addGradient(value);\n }\n el.setAttribute(constant["b" /* SVG_ATTR_MAP */][attr], "url(#" + id + ")");\n }\n else if (/^[p,P]{1}[\\s]*\\(/.test(value)) {\n var id = context.find(\'pattern\', value);\n if (!id) {\n id = context.addPattern(value);\n }\n el.setAttribute(constant["b" /* SVG_ATTR_MAP */][attr], "url(#" + id + ")");\n }\n else {\n el.setAttribute(constant["b" /* SVG_ATTR_MAP */][attr], value);\n }\n };\n ShapeBase.prototype.shadow = function (context, targetAttrs) {\n var attrs = this.attr();\n var _a = targetAttrs || attrs, shadowOffsetX = _a.shadowOffsetX, shadowOffsetY = _a.shadowOffsetY, shadowBlur = _a.shadowBlur, shadowColor = _a.shadowColor;\n if (shadowOffsetX || shadowOffsetY || shadowBlur || shadowColor) {\n Object(svg["b" /* setShadow */])(this, context);\n }\n };\n ShapeBase.prototype.transform = function (targetAttrs) {\n var attrs = this.attr();\n var matrix = (targetAttrs || attrs).matrix;\n if (matrix) {\n Object(svg["c" /* setTransform */])(this);\n }\n };\n ShapeBase.prototype.isInShape = function (refX, refY) {\n return this.isPointInPath(refX, refY);\n };\n ShapeBase.prototype.isPointInPath = function (refX, refY) {\n var el = this.get(\'el\');\n var canvas = this.get(\'canvas\');\n var bbox = canvas.get(\'el\').getBoundingClientRect();\n var clientX = refX + bbox.left;\n var clientY = refY + bbox.top;\n var element = document.elementFromPoint(clientX, clientY);\n if (element && element.isEqualNode(el)) {\n return true;\n }\n return false;\n };\n /**\n * 获取线拾取的宽度\n * @returns {number} 线的拾取宽度\n */\n ShapeBase.prototype.getHitLineWidth = function () {\n var _a = this.attrs, lineWidth = _a.lineWidth, lineAppendWidth = _a.lineAppendWidth;\n if (this.isStroke()) {\n return lineWidth + lineAppendWidth;\n }\n return 0;\n };\n return ShapeBase;\n}(esm["AbstractShape"]));\n/* harmony default export */ var base = (base_ShapeBase);\n//# sourceMappingURL=base.js.map\n// EXTERNAL MODULE: ./node_modules/@antv/util/esm/index.js + 110 modules\nvar util_esm = __webpack_require__(0);\n\n// CONCATENATED MODULE: ./node_modules/@antv/g-svg/esm/shape/circle.js\n/**\n * @fileoverview circle\n * @author dengfuping_develop@163.com\n */\n\n\n\n\nvar circle_Circle = /** @class */ (function (_super) {\n Object(tslib_es6["__extends"])(Circle, _super);\n function Circle() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n _this.type = \'circle\';\n _this.canFill = true;\n _this.canStroke = true;\n return _this;\n }\n Circle.prototype.getDefaultAttrs = function () {\n var attrs = _super.prototype.getDefaultAttrs.call(this);\n return Object(tslib_es6["__assign"])(Object(tslib_es6["__assign"])({}, attrs), { x: 0, y: 0, r: 0 });\n };\n Circle.prototype.createPath = function (context, targetAttrs) {\n var attrs = this.attr();\n var el = this.get(\'el\');\n Object(util_esm["each"])(targetAttrs || attrs, function (value, attr) {\n // 圆和椭圆的点坐标属性不是 x, y,而是 cx, cy\n if (attr === \'x\' || attr === \'y\') {\n el.setAttribute("c" + attr, value);\n }\n else if (constant["b" /* SVG_ATTR_MAP */][attr]) {\n el.setAttribute(constant["b" /* SVG_ATTR_MAP */][attr], value);\n }\n });\n };\n return Circle;\n}(base));\n/* harmony default export */ var circle = (circle_Circle);\n//# sourceMappingURL=circle.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-svg/esm/shape/dom.js\n/**\n * @fileoverview dom\n * @author dengfuping_develop@163.com\n */\n\n\n\n\nvar dom_Dom = /** @class */ (function (_super) {\n Object(tslib_es6["__extends"])(Dom, _super);\n function Dom() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n _this.type = \'dom\';\n _this.canFill = false;\n _this.canStroke = false;\n return _this;\n }\n Dom.prototype.createPath = function (context, targetAttrs) {\n var attrs = this.attr();\n var el = this.get(\'el\');\n Object(util_esm["each"])(targetAttrs || attrs, function (value, attr) {\n if (constant["b" /* SVG_ATTR_MAP */][attr]) {\n el.setAttribute(constant["b" /* SVG_ATTR_MAP */][attr], value);\n }\n });\n if (typeof attrs[\'html\'] === \'function\') {\n var element = attrs[\'html\'].call(this, attrs);\n if (element instanceof Element || element instanceof HTMLDocument) {\n var children = el.childNodes;\n for (var i = children.length - 1; i >= 0; i--) {\n el.removeChild(children[i]);\n }\n el.appendChild(element); // append to el if it\'s an element\n }\n else {\n el.innerHTML = element; // set innerHTML\n }\n }\n else {\n el.innerHTML = attrs[\'html\']; // set innerHTML\n }\n };\n return Dom;\n}(base));\n/* harmony default export */ var shape_dom = (dom_Dom);\n//# sourceMappingURL=dom.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-svg/esm/shape/ellipse.js\n/**\n * @fileoverview ellipse\n * @author dengfuping_develop@163.com\n */\n\n\n\n\nvar ellipse_Ellipse = /** @class */ (function (_super) {\n Object(tslib_es6["__extends"])(Ellipse, _super);\n function Ellipse() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n _this.type = \'ellipse\';\n _this.canFill = true;\n _this.canStroke = true;\n return _this;\n }\n Ellipse.prototype.getDefaultAttrs = function () {\n var attrs = _super.prototype.getDefaultAttrs.call(this);\n return Object(tslib_es6["__assign"])(Object(tslib_es6["__assign"])({}, attrs), { x: 0, y: 0, rx: 0, ry: 0 });\n };\n Ellipse.prototype.createPath = function (context, targetAttrs) {\n var attrs = this.attr();\n var el = this.get(\'el\');\n Object(util_esm["each"])(targetAttrs || attrs, function (value, attr) {\n // 圆和椭圆的点坐标属性不是 x, y,而是 cx, cy\n if (attr === \'x\' || attr === \'y\') {\n el.setAttribute("c" + attr, value);\n }\n else if (constant["b" /* SVG_ATTR_MAP */][attr]) {\n el.setAttribute(constant["b" /* SVG_ATTR_MAP */][attr], value);\n }\n });\n };\n return Ellipse;\n}(base));\n/* harmony default export */ var ellipse = (ellipse_Ellipse);\n//# sourceMappingURL=ellipse.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-svg/esm/shape/image.js\n/**\n * @fileoverview image\n * @author dengfuping_develop@163.com\n */\n\n\n\n\nvar image_Image = /** @class */ (function (_super) {\n Object(tslib_es6["__extends"])(Image, _super);\n function Image() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n _this.type = \'image\';\n _this.canFill = false;\n _this.canStroke = false;\n return _this;\n }\n Image.prototype.getDefaultAttrs = function () {\n var attrs = _super.prototype.getDefaultAttrs.call(this);\n return Object(tslib_es6["__assign"])(Object(tslib_es6["__assign"])({}, attrs), { x: 0, y: 0, width: 0, height: 0 });\n };\n Image.prototype.createPath = function (context, targetAttrs) {\n var _this = this;\n var attrs = this.attr();\n var el = this.get(\'el\');\n Object(util_esm["each"])(targetAttrs || attrs, function (value, attr) {\n if (attr === \'img\') {\n _this._setImage(attrs.img);\n }\n else if (constant["b" /* SVG_ATTR_MAP */][attr]) {\n el.setAttribute(constant["b" /* SVG_ATTR_MAP */][attr], value);\n }\n });\n };\n Image.prototype.setAttr = function (name, value) {\n this.attrs[name] = value;\n if (name === \'img\') {\n this._setImage(value);\n }\n };\n Image.prototype._setImage = function (img) {\n var attrs = this.attr();\n var el = this.get(\'el\');\n if (Object(util_esm["isString"])(img)) {\n el.setAttribute(\'href\', img);\n }\n else if (img instanceof window.Image) {\n if (!attrs.width) {\n el.setAttribute(\'width\', img.width);\n this.attr(\'width\', img.width);\n }\n if (!attrs.height) {\n el.setAttribute(\'height\', img.height);\n this.attr(\'height\', img.height);\n }\n el.setAttribute(\'href\', img.src);\n }\n else if (img instanceof HTMLElement && Object(util_esm["isString"])(img.nodeName) && img.nodeName.toUpperCase() === \'CANVAS\') {\n // @ts-ignore\n el.setAttribute(\'href\', img.toDataURL());\n }\n else if (img instanceof ImageData) {\n var canvas = document.createElement(\'canvas\');\n canvas.setAttribute(\'width\', "" + img.width);\n canvas.setAttribute(\'height\', "" + img.height);\n canvas.getContext(\'2d\').putImageData(img, 0, 0);\n if (!attrs.width) {\n el.setAttribute(\'width\', "" + img.width);\n this.attr(\'width\', img.width);\n }\n if (!attrs.height) {\n el.setAttribute(\'height\', "" + img.height);\n this.attr(\'height\', img.height);\n }\n el.setAttribute(\'href\', canvas.toDataURL());\n }\n };\n return Image;\n}(base));\n/* harmony default export */ var shape_image = (image_Image);\n//# sourceMappingURL=image.js.map\n// EXTERNAL MODULE: ./node_modules/@antv/g-math/esm/index.js + 10 modules\nvar g_math_esm = __webpack_require__(20);\n\n// CONCATENATED MODULE: ./node_modules/@antv/g-svg/esm/shape/line.js\n\n/**\n * @fileoverview line\n * @author dengfuping_develop@163.com\n */\n\n\n\n\nvar line_Line = /** @class */ (function (_super) {\n Object(tslib_es6["__extends"])(Line, _super);\n function Line() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n _this.type = \'line\';\n _this.canFill = false;\n _this.canStroke = true;\n return _this;\n }\n Line.prototype.getDefaultAttrs = function () {\n var attrs = _super.prototype.getDefaultAttrs.call(this);\n return Object(tslib_es6["__assign"])(Object(tslib_es6["__assign"])({}, attrs), { x1: 0, y1: 0, x2: 0, y2: 0, startArrow: false, endArrow: false });\n };\n Line.prototype.createPath = function (context, targetAttrs) {\n var attrs = this.attr();\n var el = this.get(\'el\');\n Object(util_esm["each"])(targetAttrs || attrs, function (value, attr) {\n if (attr === \'startArrow\' || attr === \'endArrow\') {\n if (value) {\n var id = Object(util_esm["isObject"])(value)\n ? context.addArrow(attrs, constant["b" /* SVG_ATTR_MAP */][attr])\n : context.getDefaultArrow(attrs, constant["b" /* SVG_ATTR_MAP */][attr]);\n el.setAttribute(constant["b" /* SVG_ATTR_MAP */][attr], "url(#" + id + ")");\n }\n else {\n el.removeAttribute(constant["b" /* SVG_ATTR_MAP */][attr]);\n }\n }\n else if (constant["b" /* SVG_ATTR_MAP */][attr]) {\n el.setAttribute(constant["b" /* SVG_ATTR_MAP */][attr], value);\n }\n });\n };\n /**\n * Use math calculation to get length of line\n * @return {number} length\n */\n Line.prototype.getTotalLength = function () {\n var _a = this.attr(), x1 = _a.x1, y1 = _a.y1, x2 = _a.x2, y2 = _a.y2;\n return g_math_esm["c" /* Line */].length(x1, y1, x2, y2);\n };\n /**\n * Use math calculation to get point according to ratio as same sa Canvas version\n * @param {number} ratio\n * @return {Point} point\n */\n Line.prototype.getPoint = function (ratio) {\n var _a = this.attr(), x1 = _a.x1, y1 = _a.y1, x2 = _a.x2, y2 = _a.y2;\n return g_math_esm["c" /* Line */].pointAt(x1, y1, x2, y2, ratio);\n };\n return Line;\n}(base));\n/* harmony default export */ var line = (line_Line);\n//# sourceMappingURL=line.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-svg/esm/shape/marker/symbols.js\nvar Symbols = {\n // 圆\n circle: function (x, y, r) {\n return [\n [\'M\', x, y],\n [\'m\', -r, 0],\n [\'a\', r, r, 0, 1, 0, r * 2, 0],\n [\'a\', r, r, 0, 1, 0, -r * 2, 0],\n ];\n },\n // 正方形\n square: function (x, y, r) {\n return [[\'M\', x - r, y - r], [\'L\', x + r, y - r], [\'L\', x + r, y + r], [\'L\', x - r, y + r], [\'Z\']];\n },\n // 菱形\n diamond: function (x, y, r) {\n return [[\'M\', x - r, y], [\'L\', x, y - r], [\'L\', x + r, y], [\'L\', x, y + r], [\'Z\']];\n },\n // 三角形\n triangle: function (x, y, r) {\n var diffY = r * Math.sin((1 / 3) * Math.PI);\n return [[\'M\', x - r, y + diffY], [\'L\', x, y - diffY], [\'L\', x + r, y + diffY], [\'z\']];\n },\n // 倒三角形\n triangleDown: function (x, y, r) {\n var diffY = r * Math.sin((1 / 3) * Math.PI);\n return [[\'M\', x - r, y - diffY], [\'L\', x + r, y - diffY], [\'L\', x, y + diffY], [\'Z\']];\n },\n};\n/* harmony default export */ var symbols = ({\n get: function (type) {\n return Symbols[type];\n },\n register: function (type, func) {\n Symbols[type] = func;\n },\n remove: function (type) {\n delete Symbols[type];\n },\n getAll: function () {\n return Symbols;\n },\n});\n//# sourceMappingURL=symbols.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-svg/esm/shape/marker/index.js\n/**\n * @fileoverview marker\n * @author dengfuping_develop@163.com\n */\n\n\n\n\nvar marker_Marker = /** @class */ (function (_super) {\n Object(tslib_es6["__extends"])(Marker, _super);\n function Marker() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n _this.type = \'marker\';\n _this.canFill = true;\n _this.canStroke = true;\n return _this;\n }\n Marker.prototype.createPath = function (context) {\n var el = this.get(\'el\');\n el.setAttribute(\'d\', this._assembleMarker());\n };\n Marker.prototype._assembleMarker = function () {\n var d = this._getPath();\n if (Object(util_esm["isArray"])(d)) {\n return d\n .map(function (path) {\n return path.join(\' \');\n })\n .join(\'\');\n }\n return d;\n };\n Marker.prototype._getPath = function () {\n var attrs = this.attr();\n var x = attrs.x, y = attrs.y;\n // 兼容 r 和 radius 两种写法,推荐使用 r\n var r = attrs.r || attrs.radius;\n var symbol = attrs.symbol || \'circle\';\n var method;\n if (Object(util_esm["isFunction"])(symbol)) {\n method = symbol;\n }\n else {\n method = symbols.get(symbol);\n }\n if (!method) {\n console.warn(method + " symbol is not exist.");\n return null;\n }\n return method(x, y, r);\n };\n // 作为其静态属性\n Marker.symbolsFactory = symbols;\n return Marker;\n}(base));\n/* harmony default export */ var marker = (marker_Marker);\n//# sourceMappingURL=index.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-svg/esm/shape/path.js\n\n\n\n\nvar path_Path = /** @class */ (function (_super) {\n Object(tslib_es6["__extends"])(Path, _super);\n function Path() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n _this.type = \'path\';\n _this.canFill = true;\n _this.canStroke = true;\n return _this;\n }\n Path.prototype.getDefaultAttrs = function () {\n var attrs = _super.prototype.getDefaultAttrs.call(this);\n return Object(tslib_es6["__assign"])(Object(tslib_es6["__assign"])({}, attrs), { startArrow: false, endArrow: false });\n };\n Path.prototype.createPath = function (context, targetAttrs) {\n var _this = this;\n var attrs = this.attr();\n var el = this.get(\'el\');\n Object(util_esm["each"])(targetAttrs || attrs, function (value, attr) {\n if (attr === \'path\' && Object(util_esm["isArray"])(value)) {\n el.setAttribute(\'d\', _this._formatPath(value));\n }\n else if (attr === \'startArrow\' || attr === \'endArrow\') {\n if (value) {\n var id = Object(util_esm["isObject"])(value)\n ? context.addArrow(attrs, constant["b" /* SVG_ATTR_MAP */][attr])\n : context.getDefaultArrow(attrs, constant["b" /* SVG_ATTR_MAP */][attr]);\n el.setAttribute(constant["b" /* SVG_ATTR_MAP */][attr], "url(#" + id + ")");\n }\n else {\n el.removeAttribute(constant["b" /* SVG_ATTR_MAP */][attr]);\n }\n }\n else if (constant["b" /* SVG_ATTR_MAP */][attr]) {\n el.setAttribute(constant["b" /* SVG_ATTR_MAP */][attr], value);\n }\n });\n };\n Path.prototype._formatPath = function (value) {\n var newValue = value\n .map(function (path) {\n return path.join(\' \');\n })\n .join(\'\');\n if (~newValue.indexOf(\'NaN\')) {\n return \'\';\n }\n return newValue;\n };\n /**\n * Get total length of path\n * 尽管通过浏览器的 SVGPathElement.getTotalLength() 接口获取的 path 长度,\n * 与 Canvas 版本通过数学计算的方式得到的长度有一些细微差异,但最大误差在个位数像素,精度上可以能接受\n * @return {number} length\n */\n Path.prototype.getTotalLength = function () {\n var el = this.get(\'el\');\n return el ? el.getTotalLength() : null;\n };\n /**\n * Get point according to ratio\n * @param {number} ratio\n * @return {Point} point\n */\n Path.prototype.getPoint = function (ratio) {\n var el = this.get(\'el\');\n var totalLength = this.getTotalLength();\n // @see https://github.com/antvis/g/issues/634\n if (totalLength === 0) {\n return null;\n }\n var point = el ? el.getPointAtLength(ratio * totalLength) : null;\n return point\n ? {\n x: point.x,\n y: point.y,\n }\n : null;\n };\n return Path;\n}(base));\n/* harmony default export */ var shape_path = (path_Path);\n//# sourceMappingURL=path.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-svg/esm/shape/polygon.js\n\n/**\n * @fileoverview polygon\n * @author dengfuping_develop@163.com\n */\n\n\n\nvar polygon_Polygon = /** @class */ (function (_super) {\n Object(tslib_es6["__extends"])(Polygon, _super);\n function Polygon() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n _this.type = \'polygon\';\n _this.canFill = true;\n _this.canStroke = true;\n return _this;\n }\n Polygon.prototype.createPath = function (context, targetAttrs) {\n var attrs = this.attr();\n var el = this.get(\'el\');\n Object(util_esm["each"])(targetAttrs || attrs, function (value, attr) {\n if (attr === \'points\' && Object(util_esm["isArray"])(value) && value.length >= 2) {\n el.setAttribute(\'points\', value.map(function (point) { return point[0] + "," + point[1]; }).join(\' \'));\n }\n else if (constant["b" /* SVG_ATTR_MAP */][attr]) {\n el.setAttribute(constant["b" /* SVG_ATTR_MAP */][attr], value);\n }\n });\n };\n return Polygon;\n}(base));\n/* harmony default export */ var polygon = (polygon_Polygon);\n//# sourceMappingURL=polygon.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-svg/esm/shape/polyline.js\n\n\n\n\n\n\nvar polyline_Polyline = /** @class */ (function (_super) {\n Object(tslib_es6["__extends"])(Polyline, _super);\n function Polyline() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n _this.type = \'polyline\';\n _this.canFill = true;\n _this.canStroke = true;\n return _this;\n }\n Polyline.prototype.getDefaultAttrs = function () {\n var attrs = _super.prototype.getDefaultAttrs.call(this);\n return Object(tslib_es6["__assign"])(Object(tslib_es6["__assign"])({}, attrs), { startArrow: false, endArrow: false });\n };\n // 更新属性时,检测是否更改了 points\n Polyline.prototype.onAttrChange = function (name, value, originValue) {\n _super.prototype.onAttrChange.call(this, name, value, originValue);\n if ([\'points\'].indexOf(name) !== -1) {\n this._resetCache();\n }\n };\n Polyline.prototype._resetCache = function () {\n this.set(\'totalLength\', null);\n this.set(\'tCache\', null);\n };\n Polyline.prototype.createPath = function (context, targetAttrs) {\n var attrs = this.attr();\n var el = this.get(\'el\');\n Object(util_esm["each"])(targetAttrs || attrs, function (value, attr) {\n if (attr === \'points\' && Object(util_esm["isArray"])(value) && value.length >= 2) {\n el.setAttribute(\'points\', value.map(function (point) { return point[0] + "," + point[1]; }).join(\' \'));\n }\n else if (constant["b" /* SVG_ATTR_MAP */][attr]) {\n el.setAttribute(constant["b" /* SVG_ATTR_MAP */][attr], value);\n }\n });\n };\n /**\n * Get length of polyline\n * @return {number} length\n */\n Polyline.prototype.getTotalLength = function () {\n var points = this.attr().points;\n // get totalLength from cache\n var totalLength = this.get(\'totalLength\');\n if (!Object(util_esm["isNil"])(totalLength)) {\n return totalLength;\n }\n this.set(\'totalLength\', g_math_esm["d" /* Polyline */].length(points));\n return this.get(\'totalLength\');\n };\n /**\n * Get point according to ratio\n * @param {number} ratio\n * @return {Point} point\n */\n Polyline.prototype.getPoint = function (ratio) {\n var points = this.attr().points;\n // get tCache from cache\n var tCache = this.get(\'tCache\');\n if (!tCache) {\n this._setTcache();\n tCache = this.get(\'tCache\');\n }\n var subt;\n var index;\n Object(util_esm["each"])(tCache, function (v, i) {\n if (ratio >= v[0] && ratio <= v[1]) {\n subt = (ratio - v[0]) / (v[1] - v[0]);\n index = i;\n }\n });\n return g_math_esm["c" /* Line */].pointAt(points[index][0], points[index][1], points[index + 1][0], points[index + 1][1], subt);\n };\n Polyline.prototype._setTcache = function () {\n var points = this.attr().points;\n if (!points || points.length === 0) {\n return;\n }\n var totalLength = this.getTotalLength();\n if (totalLength <= 0) {\n return;\n }\n var tempLength = 0;\n var tCache = [];\n var segmentT;\n var segmentL;\n Object(util_esm["each"])(points, function (p, i) {\n if (points[i + 1]) {\n segmentT = [];\n segmentT[0] = tempLength / totalLength;\n segmentL = g_math_esm["c" /* Line */].length(p[0], p[1], points[i + 1][0], points[i + 1][1]);\n tempLength += segmentL;\n segmentT[1] = tempLength / totalLength;\n tCache.push(segmentT);\n }\n });\n this.set(\'tCache\', tCache);\n };\n /**\n * Get start tangent vector\n * @return {Array}\n */\n Polyline.prototype.getStartTangent = function () {\n var points = this.attr().points;\n var result = [];\n result.push([points[1][0], points[1][1]]);\n result.push([points[0][0], points[0][1]]);\n return result;\n };\n /**\n * Get end tangent vector\n * @return {Array}\n */\n Polyline.prototype.getEndTangent = function () {\n var points = this.attr().points;\n var l = points.length - 1;\n var result = [];\n result.push([points[l - 1][0], points[l - 1][1]]);\n result.push([points[l][0], points[l][1]]);\n return result;\n };\n return Polyline;\n}(base));\n/* harmony default export */ var polyline = (polyline_Polyline);\n//# sourceMappingURL=polyline.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-svg/esm/util/format.js\n\nvar regexTags = /[MLHVQTCSAZ]([^MLHVQTCSAZ]*)/gi;\nvar regexDot = /[^\\s,]+/gi;\nfunction parseRadius(radius) {\n var r1 = 0;\n var r2 = 0;\n var r3 = 0;\n var r4 = 0;\n if (Object(util_esm["isArray"])(radius)) {\n if (radius.length === 1) {\n r1 = r2 = r3 = r4 = radius[0];\n }\n else if (radius.length === 2) {\n r1 = r3 = radius[0];\n r2 = r4 = radius[1];\n }\n else if (radius.length === 3) {\n r1 = radius[0];\n r2 = r4 = radius[1];\n r3 = radius[2];\n }\n else {\n r1 = radius[0];\n r2 = radius[1];\n r3 = radius[2];\n r4 = radius[3];\n }\n }\n else {\n r1 = r2 = r3 = r4 = radius;\n }\n return {\n r1: r1,\n r2: r2,\n r3: r3,\n r4: r4,\n };\n}\nfunction parsePath(path) {\n path = path || [];\n if (Object(util_esm["isArray"])(path)) {\n return path;\n }\n if (Object(util_esm["isString"])(path)) {\n path = path.match(regexTags);\n Object(util_esm["each"])(path, function (item, index) {\n item = item.match(regexDot);\n if (item[0].length > 1) {\n var tag = item[0].charAt(0);\n item.splice(1, 0, item[0].substr(1));\n item[0] = tag;\n }\n Object(util_esm["each"])(item, function (sub, i) {\n if (!isNaN(sub)) {\n item[i] = +sub;\n }\n });\n path[index] = item;\n });\n return path;\n }\n}\n//# sourceMappingURL=format.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-svg/esm/shape/rect.js\n/**\n * @fileoverview rect\n * @author dengfuping_develop@163.com\n */\n\n\n\n\n\nvar rect_Rect = /** @class */ (function (_super) {\n Object(tslib_es6["__extends"])(Rect, _super);\n function Rect() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n _this.type = \'rect\';\n _this.canFill = true;\n _this.canStroke = true;\n return _this;\n }\n Rect.prototype.getDefaultAttrs = function () {\n var attrs = _super.prototype.getDefaultAttrs.call(this);\n return Object(tslib_es6["__assign"])(Object(tslib_es6["__assign"])({}, attrs), { x: 0, y: 0, width: 0, height: 0, radius: 0 });\n };\n Rect.prototype.createPath = function (context, targetAttrs) {\n var _this = this;\n var attrs = this.attr();\n var el = this.get(\'el\');\n // 加上状态量,用来标记 path 是否已组装\n var completed = false;\n // 和组装 path 相关的绘图属性\n var pathRelatedAttrs = [\'x\', \'y\', \'width\', \'height\', \'radius\'];\n Object(util_esm["each"])(targetAttrs || attrs, function (value, attr) {\n if (pathRelatedAttrs.indexOf(attr) !== -1 && !completed) {\n el.setAttribute(\'d\', _this._assembleRect(attrs));\n completed = true;\n }\n else if (pathRelatedAttrs.indexOf(attr) === -1 && constant["b" /* SVG_ATTR_MAP */][attr]) {\n el.setAttribute(constant["b" /* SVG_ATTR_MAP */][attr], value);\n }\n });\n };\n Rect.prototype._assembleRect = function (attrs) {\n var x = attrs.x;\n var y = attrs.y;\n var w = attrs.width;\n var h = attrs.height;\n var radius = attrs.radius;\n if (!radius) {\n return "M " + x + "," + y + " l " + w + ",0 l 0," + h + " l" + -w + " 0 z";\n }\n var r = parseRadius(radius);\n if (Object(util_esm["isArray"])(radius)) {\n if (radius.length === 1) {\n r.r1 = r.r2 = r.r3 = r.r4 = radius[0];\n }\n else if (radius.length === 2) {\n r.r1 = r.r3 = radius[0];\n r.r2 = r.r4 = radius[1];\n }\n else if (radius.length === 3) {\n r.r1 = radius[0];\n r.r2 = r.r4 = radius[1];\n r.r3 = radius[2];\n }\n else {\n r.r1 = radius[0];\n r.r2 = radius[1];\n r.r3 = radius[2];\n r.r4 = radius[3];\n }\n }\n else {\n r.r1 = r.r2 = r.r3 = r.r4 = radius;\n }\n var d = [\n ["M " + (x + r.r1) + "," + y],\n ["l " + (w - r.r1 - r.r2) + ",0"],\n ["a " + r.r2 + "," + r.r2 + ",0,0,1," + r.r2 + "," + r.r2],\n ["l 0," + (h - r.r2 - r.r3)],\n ["a " + r.r3 + "," + r.r3 + ",0,0,1," + -r.r3 + "," + r.r3],\n ["l " + (r.r3 + r.r4 - w) + ",0"],\n ["a " + r.r4 + "," + r.r4 + ",0,0,1," + -r.r4 + "," + -r.r4],\n ["l 0," + (r.r4 + r.r1 - h)],\n ["a " + r.r1 + "," + r.r1 + ",0,0,1," + r.r1 + "," + -r.r1],\n [\'z\'],\n ];\n return d.join(\' \');\n };\n return Rect;\n}(base));\n/* harmony default export */ var rect = (rect_Rect);\n//# sourceMappingURL=rect.js.map\n// EXTERNAL MODULE: ./node_modules/detect-browser/es/index.js\nvar es = __webpack_require__(141);\n\n// CONCATENATED MODULE: ./node_modules/@antv/g-svg/esm/shape/text.js\n/**\n * @fileoverview text\n * @author dengfuping_develop@163.com\n */\n\n\n\n\n\n\nvar LETTER_SPACING = 0.3;\nvar BASELINE_MAP = {\n top: \'before-edge\',\n middle: \'central\',\n bottom: \'after-edge\',\n alphabetic: \'baseline\',\n hanging: \'hanging\',\n};\n// for FireFox\nvar BASELINE_MAP_FOR_FIREFOX = {\n top: \'text-before-edge\',\n middle: \'central\',\n bottom: \'text-after-edge\',\n alphabetic: \'alphabetic\',\n hanging: \'hanging\',\n};\nvar ANCHOR_MAP = {\n left: \'left\',\n start: \'left\',\n center: \'middle\',\n right: \'end\',\n end: \'end\',\n};\nvar text_Text = /** @class */ (function (_super) {\n Object(tslib_es6["__extends"])(Text, _super);\n function Text() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n _this.type = \'text\';\n _this.canFill = true;\n _this.canStroke = true;\n return _this;\n }\n Text.prototype.getDefaultAttrs = function () {\n var attrs = _super.prototype.getDefaultAttrs.call(this);\n return Object(tslib_es6["__assign"])(Object(tslib_es6["__assign"])({}, attrs), { x: 0, y: 0, text: null, fontSize: 12, fontFamily: \'sans-serif\', fontStyle: \'normal\', fontWeight: \'normal\', fontVariant: \'normal\', textAlign: \'start\', textBaseline: \'bottom\' });\n };\n Text.prototype.createPath = function (context, targetAttrs) {\n var _this = this;\n var attrs = this.attr();\n var el = this.get(\'el\');\n this._setFont();\n Object(util_esm["each"])(targetAttrs || attrs, function (value, attr) {\n if (attr === \'text\') {\n _this._setText("" + value);\n }\n else if (attr === \'matrix\' && value) {\n Object(svg["c" /* setTransform */])(_this);\n }\n else if (constant["b" /* SVG_ATTR_MAP */][attr]) {\n el.setAttribute(constant["b" /* SVG_ATTR_MAP */][attr], value);\n }\n });\n el.setAttribute(\'paint-order\', \'stroke\');\n el.setAttribute(\'style\', \'stroke-linecap:butt; stroke-linejoin:miter;\');\n };\n Text.prototype._setFont = function () {\n var el = this.get(\'el\');\n var _a = this.attr(), textBaseline = _a.textBaseline, textAlign = _a.textAlign;\n var browser = Object(es["a" /* detect */])();\n if (browser && browser.name === \'firefox\') {\n // compatible with FireFox browser, ref: https://github.com/antvis/g/issues/119\n el.setAttribute(\'dominant-baseline\', BASELINE_MAP_FOR_FIREFOX[textBaseline] || \'alphabetic\');\n }\n else {\n el.setAttribute(\'alignment-baseline\', BASELINE_MAP[textBaseline] || \'baseline\');\n }\n el.setAttribute(\'text-anchor\', ANCHOR_MAP[textAlign] || \'left\');\n };\n Text.prototype._setText = function (text) {\n var el = this.get(\'el\');\n var _a = this.attr(), x = _a.x, _b = _a.textBaseline, baseline = _b === void 0 ? \'bottom\' : _b;\n if (!text) {\n el.innerHTML = \'\';\n }\n else if (~text.indexOf(\'\\n\')) {\n var textArr = text.split(\'\\n\');\n var textLen_1 = textArr.length - 1;\n var arr_1 = \'\';\n Object(util_esm["each"])(textArr, function (segment, i) {\n if (i === 0) {\n if (baseline === \'alphabetic\') {\n arr_1 += "" + segment + "";\n }\n else if (baseline === \'top\') {\n arr_1 += "" + segment + "";\n }\n else if (baseline === \'middle\') {\n arr_1 += "" + segment + "";\n }\n else if (baseline === \'bottom\') {\n arr_1 += "" + segment + "";\n }\n else if (baseline === \'hanging\') {\n arr_1 += "" + segment + "";\n }\n }\n else {\n arr_1 += "" + segment + "";\n }\n });\n el.innerHTML = arr_1;\n }\n else {\n el.innerHTML = text;\n }\n };\n return Text;\n}(base));\n/* harmony default export */ var shape_text = (text_Text);\n//# sourceMappingURL=text.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-svg/esm/shape/index.js\n\n\n\n\n\n\n\n\n\n\n\n\n//# sourceMappingURL=index.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy1zdmcvZXNtL3NoYXBlL2Jhc2UuanM/MTNkNSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy1zdmcvZXNtL3NoYXBlL2NpcmNsZS5qcz83MWFiIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9nLXN2Zy9lc20vc2hhcGUvZG9tLmpzP2E4ZTgiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2ctc3ZnL2VzbS9zaGFwZS9lbGxpcHNlLmpzPzVlMjciLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2ctc3ZnL2VzbS9zaGFwZS9pbWFnZS5qcz9hNTczIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9nLXN2Zy9lc20vc2hhcGUvbGluZS5qcz8xMjJiIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9nLXN2Zy9lc20vc2hhcGUvbWFya2VyL3N5bWJvbHMuanM/YzIyYyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy1zdmcvZXNtL3NoYXBlL21hcmtlci9pbmRleC5qcz84YzAzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9nLXN2Zy9lc20vc2hhcGUvcGF0aC5qcz8zZWU4Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9nLXN2Zy9lc20vc2hhcGUvcG9seWdvbi5qcz8wOWU5Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9nLXN2Zy9lc20vc2hhcGUvcG9seWxpbmUuanM/ZDkyOCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy1zdmcvZXNtL3V0aWwvZm9ybWF0LmpzP2YyNzYiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2ctc3ZnL2VzbS9zaGFwZS9yZWN0LmpzPzc1ZTEiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2ctc3ZnL2VzbS9zaGFwZS90ZXh0LmpzPzk0NjMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2ctc3ZnL2VzbS9zaGFwZS9pbmRleC5qcz82OGRlIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBNEM7QUFDQztBQUNrQjtBQUN2QjtBQUNNO0FBQ0g7QUFDVjtBQUNKO0FBQ2dCO0FBQzdDLElBQUksY0FBUztBQUNiLElBQUksOEJBQVM7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsNkJBQVEsQ0FBQyw2QkFBUSxHQUFHLFdBQVcscUVBQXFFO0FBQ25IO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUscUJBQUs7QUFDcEI7QUFDQTtBQUNBLGVBQWUsd0JBQUs7QUFDcEI7QUFDQTtBQUNBO0FBQ0EsZUFBZSxXQUFXO0FBQzFCO0FBQ0E7QUFDQSxRQUFRLHNDQUFjO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2Qiw0QkFBYTtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsZ0NBQVM7QUFDekI7QUFDQSxZQUFZLDhCQUFPO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLHdCQUFJO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLENBQUMsSUFBUztBQUNJLHdEQUFJLEVBQUM7QUFDcEIsZ0M7O0FDdkh5QztBQUNJO0FBQ047QUFDUTtBQUNKO0FBQ0Y7QUFDSTtBQUNKO0FBQ007QUFDRTtBQUNSO0FBQ0E7QUFDekMiLCJmaWxlIjoiODAuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBfX2Fzc2lnbiwgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBBYnN0cmFjdFNoYXBlIH0gZnJvbSAnQGFudHYvZy1iYXNlJztcbmltcG9ydCB7IHNldFNoYWRvdywgc2V0VHJhbnNmb3JtLCBzZXRDbGlwIH0gZnJvbSAnLi4vdXRpbC9zdmcnO1xuaW1wb3J0IHsgY3JlYXRlRG9tIH0gZnJvbSAnLi4vdXRpbC9kb20nO1xuaW1wb3J0IHsgcmVmcmVzaEVsZW1lbnQgfSBmcm9tICcuLi91dGlsL2RyYXcnO1xuaW1wb3J0IHsgU1ZHX0FUVFJfTUFQIH0gZnJvbSAnLi4vY29uc3RhbnQnO1xuaW1wb3J0ICogYXMgU2hhcGUgZnJvbSAnLi9pbmRleCc7XG5pbXBvcnQgR3JvdXAgZnJvbSAnLi4vZ3JvdXAnO1xuaW1wb3J0IHsgZ2V0QkJveE1ldGhvZCB9IGZyb20gJ0BhbnR2L2ctYmFzZSc7XG52YXIgU2hhcGVCYXNlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhTaGFwZUJhc2UsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gU2hhcGVCYXNlKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMudHlwZSA9ICdzdmcnO1xuICAgICAgICBfdGhpcy5jYW5GaWxsID0gZmFsc2U7XG4gICAgICAgIF90aGlzLmNhblN0cm9rZSA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIFNoYXBlQmFzZS5wcm90b3R5cGUuZ2V0RGVmYXVsdEF0dHJzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYXR0cnMgPSBfc3VwZXIucHJvdG90eXBlLmdldERlZmF1bHRBdHRycy5jYWxsKHRoaXMpO1xuICAgICAgICAvLyDorr7nva7pu5jorqTlgLxcbiAgICAgICAgcmV0dXJuIF9fYXNzaWduKF9fYXNzaWduKHt9LCBhdHRycyksIHsgbGluZVdpZHRoOiAxLCBsaW5lQXBwZW5kV2lkdGg6IDAsIHN0cm9rZU9wYWNpdHk6IDEsIGZpbGxPcGFjaXR5OiAxIH0pO1xuICAgIH07XG4gICAgLy8g6KaG55uW5Z+657G755qEIGFmdGVyQXR0cnNDaGFuZ2Ug5pa55rOVXG4gICAgU2hhcGVCYXNlLnByb3RvdHlwZS5hZnRlckF0dHJzQ2hhbmdlID0gZnVuY3Rpb24gKHRhcmdldEF0dHJzKSB7XG4gICAgICAgIF9zdXBlci5wcm90b3R5cGUuYWZ0ZXJBdHRyc0NoYW5nZS5jYWxsKHRoaXMsIHRhcmdldEF0dHJzKTtcbiAgICAgICAgdmFyIGNhbnZhcyA9IHRoaXMuZ2V0KCdjYW52YXMnKTtcbiAgICAgICAgLy8g5Y+q5pyJ5oyC6L295Yiw55S75biD5LiL77yM5omN5a+55YWD57Sg6L+b6KGM5a6e6ZmF5riy5p+TXG4gICAgICAgIGlmIChjYW52YXMgJiYgY2FudmFzLmdldCgnYXV0b0RyYXcnKSkge1xuICAgICAgICAgICAgdmFyIGNvbnRleHQgPSBjYW52YXMuZ2V0KCdjb250ZXh0Jyk7XG4gICAgICAgICAgICB0aGlzLmRyYXcoY29udGV4dCwgdGFyZ2V0QXR0cnMpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBTaGFwZUJhc2UucHJvdG90eXBlLmdldFNoYXBlQmFzZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIFNoYXBlO1xuICAgIH07XG4gICAgU2hhcGVCYXNlLnByb3RvdHlwZS5nZXRHcm91cEJhc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBHcm91cDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIOS4gOS6m+aWueazleiwg+eUqOS8muW8lei1t+eUu+W4g+WPmOWMllxuICAgICAqIEBwYXJhbSB7Q2hhbmdlVHlwZX0gY2hhbmdlVHlwZSDmlLnlj5jnmoTnsbvlnotcbiAgICAgKi9cbiAgICBTaGFwZUJhc2UucHJvdG90eXBlLm9uQ2FudmFzQ2hhbmdlID0gZnVuY3Rpb24gKGNoYW5nZVR5cGUpIHtcbiAgICAgICAgcmVmcmVzaEVsZW1lbnQodGhpcywgY2hhbmdlVHlwZSk7XG4gICAgfTtcbiAgICBTaGFwZUJhc2UucHJvdG90eXBlLmNhbGN1bGF0ZUJCb3ggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBlbCA9IHRoaXMuZ2V0KCdlbCcpO1xuICAgICAgICB2YXIgYmJveCA9IG51bGw7XG4gICAgICAgIC8vIOWMheWbtOebkuiuoeeul+S+nei1luS6jue7mOWItu+8jOWmguaenOi/mOayoeacieeUn+aIkOWvueW6lOeahCBEb20g5YWD57Sg77yM5YiZ5YyF5Zu055uS55qE6ZW/5a695Z2H5Li6IDBcbiAgICAgICAgaWYgKGVsKSB7XG4gICAgICAgICAgICBiYm94ID0gZWwuZ2V0QkJveCgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFyIGJib3hNZXRob2QgPSBnZXRCQm94TWV0aG9kKHRoaXMuZ2V0KCd0eXBlJykpO1xuICAgICAgICAgICAgaWYgKGJib3hNZXRob2QpIHtcbiAgICAgICAgICAgICAgICBiYm94ID0gYmJveE1ldGhvZCh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoYmJveCkge1xuICAgICAgICAgICAgdmFyIHggPSBiYm94LngsIHkgPSBiYm94LnksIHdpZHRoID0gYmJveC53aWR0aCwgaGVpZ2h0ID0gYmJveC5oZWlnaHQ7XG4gICAgICAgICAgICB2YXIgbGluZVdpZHRoID0gdGhpcy5nZXRIaXRMaW5lV2lkdGgoKTtcbiAgICAgICAgICAgIHZhciBoYWxmV2lkdGggPSBsaW5lV2lkdGggLyAyO1xuICAgICAgICAgICAgdmFyIG1pblggPSB4IC0gaGFsZldpZHRoO1xuICAgICAgICAgICAgdmFyIG1pblkgPSB5IC0gaGFsZldpZHRoO1xuICAgICAgICAgICAgdmFyIG1heFggPSB4ICsgd2lkdGggKyBoYWxmV2lkdGg7XG4gICAgICAgICAgICB2YXIgbWF4WSA9IHkgKyBoZWlnaHQgKyBoYWxmV2lkdGg7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHg6IG1pblgsXG4gICAgICAgICAgICAgICAgeTogbWluWSxcbiAgICAgICAgICAgICAgICBtaW5YOiBtaW5YLFxuICAgICAgICAgICAgICAgIG1pblk6IG1pblksXG4gICAgICAgICAgICAgICAgbWF4WDogbWF4WCxcbiAgICAgICAgICAgICAgICBtYXhZOiBtYXhZLFxuICAgICAgICAgICAgICAgIHdpZHRoOiB3aWR0aCArIGxpbmVXaWR0aCxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IGhlaWdodCArIGxpbmVXaWR0aCxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgICB5OiAwLFxuICAgICAgICAgICAgbWluWDogMCxcbiAgICAgICAgICAgIG1pblk6IDAsXG4gICAgICAgICAgICBtYXhYOiAwLFxuICAgICAgICAgICAgbWF4WTogMCxcbiAgICAgICAgICAgIHdpZHRoOiAwLFxuICAgICAgICAgICAgaGVpZ2h0OiAwLFxuICAgICAgICB9O1xuICAgIH07XG4gICAgU2hhcGVCYXNlLnByb3RvdHlwZS5pc0ZpbGwgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYSA9IHRoaXMuYXR0cigpLCBmaWxsID0gX2EuZmlsbCwgZmlsbFN0eWxlID0gX2EuZmlsbFN0eWxlO1xuICAgICAgICByZXR1cm4gKGZpbGwgfHwgZmlsbFN0eWxlIHx8IHRoaXMuaXNDbGlwU2hhcGUoKSkgJiYgdGhpcy5jYW5GaWxsO1xuICAgIH07XG4gICAgU2hhcGVCYXNlLnByb3RvdHlwZS5pc1N0cm9rZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hID0gdGhpcy5hdHRyKCksIHN0cm9rZSA9IF9hLnN0cm9rZSwgc3Ryb2tlU3R5bGUgPSBfYS5zdHJva2VTdHlsZTtcbiAgICAgICAgcmV0dXJuIChzdHJva2UgfHwgc3Ryb2tlU3R5bGUpICYmIHRoaXMuY2FuU3Ryb2tlO1xuICAgIH07XG4gICAgU2hhcGVCYXNlLnByb3RvdHlwZS5kcmF3ID0gZnVuY3Rpb24gKGNvbnRleHQsIHRhcmdldEF0dHJzKSB7XG4gICAgICAgIHZhciBlbCA9IHRoaXMuZ2V0KCdlbCcpO1xuICAgICAgICBpZiAodGhpcy5nZXQoJ2Rlc3Ryb3llZCcpKSB7XG4gICAgICAgICAgICBpZiAoZWwpIHtcbiAgICAgICAgICAgICAgICBlbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGVsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmICghZWwpIHtcbiAgICAgICAgICAgICAgICBjcmVhdGVEb20odGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZXRDbGlwKHRoaXMsIGNvbnRleHQpO1xuICAgICAgICAgICAgdGhpcy5jcmVhdGVQYXRoKGNvbnRleHQsIHRhcmdldEF0dHJzKTtcbiAgICAgICAgICAgIHRoaXMuc2hhZG93KGNvbnRleHQsIHRhcmdldEF0dHJzKTtcbiAgICAgICAgICAgIHRoaXMuc3Ryb2tlQW5kRmlsbChjb250ZXh0LCB0YXJnZXRBdHRycyk7XG4gICAgICAgICAgICB0aGlzLnRyYW5zZm9ybSh0YXJnZXRBdHRycyk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKiDnu5jliLblm77lvaLnmoTot6/lvoRcbiAgICAgKiBAcGFyYW0ge0RlZnN9IGNvbnRleHQg5LiK5LiL5paHXG4gICAgICogQHBhcmFtIHtTaGFwZUF0dHJzfSB0YXJnZXRBdHRycyDmuLLmn5PnmoTnm67moIflsZ7mgKdcbiAgICAgKi9cbiAgICBTaGFwZUJhc2UucHJvdG90eXBlLmNyZWF0ZVBhdGggPSBmdW5jdGlvbiAoY29udGV4dCwgdGFyZ2V0QXR0cnMpIHsgfTtcbiAgICAvLyBzdHJva2UgYW5kIGZpbGxcbiAgICBTaGFwZUJhc2UucHJvdG90eXBlLnN0cm9rZUFuZEZpbGwgPSBmdW5jdGlvbiAoY29udGV4dCwgdGFyZ2V0QXR0cnMpIHtcbiAgICAgICAgdmFyIGF0dHJzID0gdGFyZ2V0QXR0cnMgfHwgdGhpcy5hdHRyKCk7XG4gICAgICAgIHZhciBmaWxsID0gYXR0cnMuZmlsbCwgZmlsbFN0eWxlID0gYXR0cnMuZmlsbFN0eWxlLCBzdHJva2UgPSBhdHRycy5zdHJva2UsIHN0cm9rZVN0eWxlID0gYXR0cnMuc3Ryb2tlU3R5bGUsIGZpbGxPcGFjaXR5ID0gYXR0cnMuZmlsbE9wYWNpdHksIHN0cm9rZU9wYWNpdHkgPSBhdHRycy5zdHJva2VPcGFjaXR5LCBsaW5lV2lkdGggPSBhdHRycy5saW5lV2lkdGg7XG4gICAgICAgIHZhciBlbCA9IHRoaXMuZ2V0KCdlbCcpO1xuICAgICAgICBpZiAodGhpcy5jYW5GaWxsKSB7XG4gICAgICAgICAgICAvLyDliJ3mrKHmuLLmn5Plkozmm7TmlrDmuLLmn5PnmoTpgLvovpHmnInmiYDkuI3lkIw6IOWIneasoea4suafk+WAvOS4uuepuuaXtu+8jOmcgOimgeiuvue9ruS4uiBub25l77yM5ZCm5YiZ5bCx5Lya5piv6buR6Imy77yM6ICM5pu05paw5riy5p+T5YiZ5LiN6ZyA6KaBXG4gICAgICAgICAgICBpZiAoIXRhcmdldEF0dHJzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2V0Q29sb3IoY29udGV4dCwgJ2ZpbGwnLCBmaWxsIHx8IGZpbGxTdHlsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICgnZmlsbCcgaW4gYXR0cnMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zZXRDb2xvcihjb250ZXh0LCAnZmlsbCcsIGZpbGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoJ2ZpbGxTdHlsZScgaW4gYXR0cnMpIHtcbiAgICAgICAgICAgICAgICAvLyBjb21wYXRpYmxlIHdpdGggZmlsbFN0eWxlXG4gICAgICAgICAgICAgICAgdGhpcy5fc2V0Q29sb3IoY29udGV4dCwgJ2ZpbGwnLCBmaWxsU3R5bGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGZpbGxPcGFjaXR5KSB7XG4gICAgICAgICAgICAgICAgZWwuc2V0QXR0cmlidXRlKFNWR19BVFRSX01BUFsnZmlsbE9wYWNpdHknXSwgZmlsbE9wYWNpdHkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNhblN0cm9rZSAmJiBsaW5lV2lkdGggPiAwKSB7XG4gICAgICAgICAgICBpZiAoIXRhcmdldEF0dHJzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2V0Q29sb3IoY29udGV4dCwgJ3N0cm9rZScsIHN0cm9rZSB8fCBzdHJva2VTdHlsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICgnc3Ryb2tlJyBpbiBhdHRycykge1xuICAgICAgICAgICAgICAgIHRoaXMuX3NldENvbG9yKGNvbnRleHQsICdzdHJva2UnLCBzdHJva2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoJ3N0cm9rZVN0eWxlJyBpbiBhdHRycykge1xuICAgICAgICAgICAgICAgIC8vIGNvbXBhdGlibGUgd2l0aCBzdHJva2VTdHlsZVxuICAgICAgICAgICAgICAgIHRoaXMuX3NldENvbG9yKGNvbnRleHQsICdzdHJva2UnLCBzdHJva2VTdHlsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc3Ryb2tlT3BhY2l0eSkge1xuICAgICAgICAgICAgICAgIGVsLnNldEF0dHJpYnV0ZShTVkdfQVRUUl9NQVBbJ3N0cm9rZU9wYWNpdHknXSwgc3Ryb2tlT3BhY2l0eSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobGluZVdpZHRoKSB7XG4gICAgICAgICAgICAgICAgZWwuc2V0QXR0cmlidXRlKFNWR19BVFRSX01BUFsnbGluZVdpZHRoJ10sIGxpbmVXaWR0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFNoYXBlQmFzZS5wcm90b3R5cGUuX3NldENvbG9yID0gZnVuY3Rpb24gKGNvbnRleHQsIGF0dHIsIHZhbHVlKSB7XG4gICAgICAgIHZhciBlbCA9IHRoaXMuZ2V0KCdlbCcpO1xuICAgICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgICAgICAvLyBuZWVkIHRvIHNldCBgbm9uZWAgdG8gYXZvaWQgZGVmYXVsdCB2YWx1ZVxuICAgICAgICAgICAgZWwuc2V0QXR0cmlidXRlKFNWR19BVFRSX01BUFthdHRyXSwgJ25vbmUnKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YWx1ZSA9IHZhbHVlLnRyaW0oKTtcbiAgICAgICAgaWYgKC9eW3IsUixMLGxdezF9W1xcc10qXFwoLy50ZXN0KHZhbHVlKSkge1xuICAgICAgICAgICAgdmFyIGlkID0gY29udGV4dC5maW5kKCdncmFkaWVudCcsIHZhbHVlKTtcbiAgICAgICAgICAgIGlmICghaWQpIHtcbiAgICAgICAgICAgICAgICBpZCA9IGNvbnRleHQuYWRkR3JhZGllbnQodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWwuc2V0QXR0cmlidXRlKFNWR19BVFRSX01BUFthdHRyXSwgXCJ1cmwoI1wiICsgaWQgKyBcIilcIik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoL15bcCxQXXsxfVtcXHNdKlxcKC8udGVzdCh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHZhciBpZCA9IGNvbnRleHQuZmluZCgncGF0dGVybicsIHZhbHVlKTtcbiAgICAgICAgICAgIGlmICghaWQpIHtcbiAgICAgICAgICAgICAgICBpZCA9IGNvbnRleHQuYWRkUGF0dGVybih2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoU1ZHX0FUVFJfTUFQW2F0dHJdLCBcInVybCgjXCIgKyBpZCArIFwiKVwiKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGVsLnNldEF0dHJpYnV0ZShTVkdfQVRUUl9NQVBbYXR0cl0sIHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgU2hhcGVCYXNlLnByb3RvdHlwZS5zaGFkb3cgPSBmdW5jdGlvbiAoY29udGV4dCwgdGFyZ2V0QXR0cnMpIHtcbiAgICAgICAgdmFyIGF0dHJzID0gdGhpcy5hdHRyKCk7XG4gICAgICAgIHZhciBfYSA9IHRhcmdldEF0dHJzIHx8IGF0dHJzLCBzaGFkb3dPZmZzZXRYID0gX2Euc2hhZG93T2Zmc2V0WCwgc2hhZG93T2Zmc2V0WSA9IF9hLnNoYWRvd09mZnNldFksIHNoYWRvd0JsdXIgPSBfYS5zaGFkb3dCbHVyLCBzaGFkb3dDb2xvciA9IF9hLnNoYWRvd0NvbG9yO1xuICAgICAgICBpZiAoc2hhZG93T2Zmc2V0WCB8fCBzaGFkb3dPZmZzZXRZIHx8IHNoYWRvd0JsdXIgfHwgc2hhZG93Q29sb3IpIHtcbiAgICAgICAgICAgIHNldFNoYWRvdyh0aGlzLCBjb250ZXh0KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgU2hhcGVCYXNlLnByb3RvdHlwZS50cmFuc2Zvcm0gPSBmdW5jdGlvbiAodGFyZ2V0QXR0cnMpIHtcbiAgICAgICAgdmFyIGF0dHJzID0gdGhpcy5hdHRyKCk7XG4gICAgICAgIHZhciBtYXRyaXggPSAodGFyZ2V0QXR0cnMgfHwgYXR0cnMpLm1hdHJpeDtcbiAgICAgICAgaWYgKG1hdHJpeCkge1xuICAgICAgICAgICAgc2V0VHJhbnNmb3JtKHRoaXMpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBTaGFwZUJhc2UucHJvdG90eXBlLmlzSW5TaGFwZSA9IGZ1bmN0aW9uIChyZWZYLCByZWZZKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzUG9pbnRJblBhdGgocmVmWCwgcmVmWSk7XG4gICAgfTtcbiAgICBTaGFwZUJhc2UucHJvdG90eXBlLmlzUG9pbnRJblBhdGggPSBmdW5jdGlvbiAocmVmWCwgcmVmWSkge1xuICAgICAgICB2YXIgZWwgPSB0aGlzLmdldCgnZWwnKTtcbiAgICAgICAgdmFyIGNhbnZhcyA9IHRoaXMuZ2V0KCdjYW52YXMnKTtcbiAgICAgICAgdmFyIGJib3ggPSBjYW52YXMuZ2V0KCdlbCcpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICB2YXIgY2xpZW50WCA9IHJlZlggKyBiYm94LmxlZnQ7XG4gICAgICAgIHZhciBjbGllbnRZID0gcmVmWSArIGJib3gudG9wO1xuICAgICAgICB2YXIgZWxlbWVudCA9IGRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQoY2xpZW50WCwgY2xpZW50WSk7XG4gICAgICAgIGlmIChlbGVtZW50ICYmIGVsZW1lbnQuaXNFcXVhbE5vZGUoZWwpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiDojrflj5bnur/mi77lj5bnmoTlrr3luqZcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSDnur/nmoTmi77lj5blrr3luqZcbiAgICAgKi9cbiAgICBTaGFwZUJhc2UucHJvdG90eXBlLmdldEhpdExpbmVXaWR0aCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hID0gdGhpcy5hdHRycywgbGluZVdpZHRoID0gX2EubGluZVdpZHRoLCBsaW5lQXBwZW5kV2lkdGggPSBfYS5saW5lQXBwZW5kV2lkdGg7XG4gICAgICAgIGlmICh0aGlzLmlzU3Ryb2tlKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBsaW5lV2lkdGggKyBsaW5lQXBwZW5kV2lkdGg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfTtcbiAgICByZXR1cm4gU2hhcGVCYXNlO1xufShBYnN0cmFjdFNoYXBlKSk7XG5leHBvcnQgZGVmYXVsdCBTaGFwZUJhc2U7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1iYXNlLmpzLm1hcCIsIi8qKlxuICogQGZpbGVvdmVydmlldyBjaXJjbGVcbiAqIEBhdXRob3IgZGVuZ2Z1cGluZ19kZXZlbG9wQDE2My5jb21cbiAqL1xuaW1wb3J0IHsgX19hc3NpZ24sIF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgZWFjaCB9IGZyb20gJ0BhbnR2L3V0aWwnO1xuaW1wb3J0IHsgU1ZHX0FUVFJfTUFQIH0gZnJvbSAnLi4vY29uc3RhbnQnO1xuaW1wb3J0IFNoYXBlQmFzZSBmcm9tICcuL2Jhc2UnO1xudmFyIENpcmNsZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoQ2lyY2xlLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIENpcmNsZSgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLnR5cGUgPSAnY2lyY2xlJztcbiAgICAgICAgX3RoaXMuY2FuRmlsbCA9IHRydWU7XG4gICAgICAgIF90aGlzLmNhblN0cm9rZSA9IHRydWU7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgQ2lyY2xlLnByb3RvdHlwZS5nZXREZWZhdWx0QXR0cnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBhdHRycyA9IF9zdXBlci5wcm90b3R5cGUuZ2V0RGVmYXVsdEF0dHJzLmNhbGwodGhpcyk7XG4gICAgICAgIHJldHVybiBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgYXR0cnMpLCB7IHg6IDAsIHk6IDAsIHI6IDAgfSk7XG4gICAgfTtcbiAgICBDaXJjbGUucHJvdG90eXBlLmNyZWF0ZVBhdGggPSBmdW5jdGlvbiAoY29udGV4dCwgdGFyZ2V0QXR0cnMpIHtcbiAgICAgICAgdmFyIGF0dHJzID0gdGhpcy5hdHRyKCk7XG4gICAgICAgIHZhciBlbCA9IHRoaXMuZ2V0KCdlbCcpO1xuICAgICAgICBlYWNoKHRhcmdldEF0dHJzIHx8IGF0dHJzLCBmdW5jdGlvbiAodmFsdWUsIGF0dHIpIHtcbiAgICAgICAgICAgIC8vIOWchuWSjOakreWchueahOeCueWdkOagh+WxnuaAp+S4jeaYryB4LCB577yM6ICM5pivIGN4LCBjeVxuICAgICAgICAgICAgaWYgKGF0dHIgPT09ICd4JyB8fCBhdHRyID09PSAneScpIHtcbiAgICAgICAgICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoXCJjXCIgKyBhdHRyLCB2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChTVkdfQVRUUl9NQVBbYXR0cl0pIHtcbiAgICAgICAgICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoU1ZHX0FUVFJfTUFQW2F0dHJdLCB2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgcmV0dXJuIENpcmNsZTtcbn0oU2hhcGVCYXNlKSk7XG5leHBvcnQgZGVmYXVsdCBDaXJjbGU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jaXJjbGUuanMubWFwIiwiLyoqXG4gKiBAZmlsZW92ZXJ2aWV3IGRvbVxuICogQGF1dGhvciBkZW5nZnVwaW5nX2RldmVsb3BAMTYzLmNvbVxuICovXG5pbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGVhY2ggfSBmcm9tICdAYW50di91dGlsJztcbmltcG9ydCB7IFNWR19BVFRSX01BUCB9IGZyb20gJy4uL2NvbnN0YW50JztcbmltcG9ydCBTaGFwZUJhc2UgZnJvbSAnLi9iYXNlJztcbnZhciBEb20gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKERvbSwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBEb20oKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy50eXBlID0gJ2RvbSc7XG4gICAgICAgIF90aGlzLmNhbkZpbGwgPSBmYWxzZTtcbiAgICAgICAgX3RoaXMuY2FuU3Ryb2tlID0gZmFsc2U7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgRG9tLnByb3RvdHlwZS5jcmVhdGVQYXRoID0gZnVuY3Rpb24gKGNvbnRleHQsIHRhcmdldEF0dHJzKSB7XG4gICAgICAgIHZhciBhdHRycyA9IHRoaXMuYXR0cigpO1xuICAgICAgICB2YXIgZWwgPSB0aGlzLmdldCgnZWwnKTtcbiAgICAgICAgZWFjaCh0YXJnZXRBdHRycyB8fCBhdHRycywgZnVuY3Rpb24gKHZhbHVlLCBhdHRyKSB7XG4gICAgICAgICAgICBpZiAoU1ZHX0FUVFJfTUFQW2F0dHJdKSB7XG4gICAgICAgICAgICAgICAgZWwuc2V0QXR0cmlidXRlKFNWR19BVFRSX01BUFthdHRyXSwgdmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHR5cGVvZiBhdHRyc1snaHRtbCddID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB2YXIgZWxlbWVudCA9IGF0dHJzWydodG1sJ10uY2FsbCh0aGlzLCBhdHRycyk7XG4gICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEVsZW1lbnQgfHwgZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxEb2N1bWVudCkge1xuICAgICAgICAgICAgICAgIHZhciBjaGlsZHJlbiA9IGVsLmNoaWxkTm9kZXM7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IGNoaWxkcmVuLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICAgICAgICAgIGVsLnJlbW92ZUNoaWxkKGNoaWxkcmVuW2ldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWwuYXBwZW5kQ2hpbGQoZWxlbWVudCk7IC8vIGFwcGVuZCB0byBlbCBpZiBpdCdzIGFuIGVsZW1lbnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGVsLmlubmVySFRNTCA9IGVsZW1lbnQ7IC8vIHNldCBpbm5lckhUTUxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGVsLmlubmVySFRNTCA9IGF0dHJzWydodG1sJ107IC8vIHNldCBpbm5lckhUTUxcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIERvbTtcbn0oU2hhcGVCYXNlKSk7XG5leHBvcnQgZGVmYXVsdCBEb207XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kb20uanMubWFwIiwiLyoqXG4gKiBAZmlsZW92ZXJ2aWV3IGVsbGlwc2VcbiAqIEBhdXRob3IgZGVuZ2Z1cGluZ19kZXZlbG9wQDE2My5jb21cbiAqL1xuaW1wb3J0IHsgX19hc3NpZ24sIF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgZWFjaCB9IGZyb20gJ0BhbnR2L3V0aWwnO1xuaW1wb3J0IHsgU1ZHX0FUVFJfTUFQIH0gZnJvbSAnLi4vY29uc3RhbnQnO1xuaW1wb3J0IFNoYXBlQmFzZSBmcm9tICcuL2Jhc2UnO1xudmFyIEVsbGlwc2UgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEVsbGlwc2UsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gRWxsaXBzZSgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLnR5cGUgPSAnZWxsaXBzZSc7XG4gICAgICAgIF90aGlzLmNhbkZpbGwgPSB0cnVlO1xuICAgICAgICBfdGhpcy5jYW5TdHJva2UgPSB0cnVlO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIEVsbGlwc2UucHJvdG90eXBlLmdldERlZmF1bHRBdHRycyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGF0dHJzID0gX3N1cGVyLnByb3RvdHlwZS5nZXREZWZhdWx0QXR0cnMuY2FsbCh0aGlzKTtcbiAgICAgICAgcmV0dXJuIF9fYXNzaWduKF9fYXNzaWduKHt9LCBhdHRycyksIHsgeDogMCwgeTogMCwgcng6IDAsIHJ5OiAwIH0pO1xuICAgIH07XG4gICAgRWxsaXBzZS5wcm90b3R5cGUuY3JlYXRlUGF0aCA9IGZ1bmN0aW9uIChjb250ZXh0LCB0YXJnZXRBdHRycykge1xuICAgICAgICB2YXIgYXR0cnMgPSB0aGlzLmF0dHIoKTtcbiAgICAgICAgdmFyIGVsID0gdGhpcy5nZXQoJ2VsJyk7XG4gICAgICAgIGVhY2godGFyZ2V0QXR0cnMgfHwgYXR0cnMsIGZ1bmN0aW9uICh2YWx1ZSwgYXR0cikge1xuICAgICAgICAgICAgLy8g5ZyG5ZKM5qSt5ZyG55qE54K55Z2Q5qCH5bGe5oCn5LiN5pivIHgsIHnvvIzogIzmmK8gY3gsIGN5XG4gICAgICAgICAgICBpZiAoYXR0ciA9PT0gJ3gnIHx8IGF0dHIgPT09ICd5Jykge1xuICAgICAgICAgICAgICAgIGVsLnNldEF0dHJpYnV0ZShcImNcIiArIGF0dHIsIHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKFNWR19BVFRSX01BUFthdHRyXSkge1xuICAgICAgICAgICAgICAgIGVsLnNldEF0dHJpYnV0ZShTVkdfQVRUUl9NQVBbYXR0cl0sIHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gRWxsaXBzZTtcbn0oU2hhcGVCYXNlKSk7XG5leHBvcnQgZGVmYXVsdCBFbGxpcHNlO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZWxsaXBzZS5qcy5tYXAiLCIvKipcbiAqIEBmaWxlb3ZlcnZpZXcgaW1hZ2VcbiAqIEBhdXRob3IgZGVuZ2Z1cGluZ19kZXZlbG9wQDE2My5jb21cbiAqL1xuaW1wb3J0IHsgX19hc3NpZ24sIF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgZWFjaCwgaXNTdHJpbmcgfSBmcm9tICdAYW50di91dGlsJztcbmltcG9ydCB7IFNWR19BVFRSX01BUCB9IGZyb20gJy4uL2NvbnN0YW50JztcbmltcG9ydCBTaGFwZUJhc2UgZnJvbSAnLi9iYXNlJztcbnZhciBJbWFnZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoSW1hZ2UsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gSW1hZ2UoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy50eXBlID0gJ2ltYWdlJztcbiAgICAgICAgX3RoaXMuY2FuRmlsbCA9IGZhbHNlO1xuICAgICAgICBfdGhpcy5jYW5TdHJva2UgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBJbWFnZS5wcm90b3R5cGUuZ2V0RGVmYXVsdEF0dHJzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYXR0cnMgPSBfc3VwZXIucHJvdG90eXBlLmdldERlZmF1bHRBdHRycy5jYWxsKHRoaXMpO1xuICAgICAgICByZXR1cm4gX19hc3NpZ24oX19hc3NpZ24oe30sIGF0dHJzKSwgeyB4OiAwLCB5OiAwLCB3aWR0aDogMCwgaGVpZ2h0OiAwIH0pO1xuICAgIH07XG4gICAgSW1hZ2UucHJvdG90eXBlLmNyZWF0ZVBhdGggPSBmdW5jdGlvbiAoY29udGV4dCwgdGFyZ2V0QXR0cnMpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIGF0dHJzID0gdGhpcy5hdHRyKCk7XG4gICAgICAgIHZhciBlbCA9IHRoaXMuZ2V0KCdlbCcpO1xuICAgICAgICBlYWNoKHRhcmdldEF0dHJzIHx8IGF0dHJzLCBmdW5jdGlvbiAodmFsdWUsIGF0dHIpIHtcbiAgICAgICAgICAgIGlmIChhdHRyID09PSAnaW1nJykge1xuICAgICAgICAgICAgICAgIF90aGlzLl9zZXRJbWFnZShhdHRycy5pbWcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoU1ZHX0FUVFJfTUFQW2F0dHJdKSB7XG4gICAgICAgICAgICAgICAgZWwuc2V0QXR0cmlidXRlKFNWR19BVFRSX01BUFthdHRyXSwgdmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIEltYWdlLnByb3RvdHlwZS5zZXRBdHRyID0gZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7XG4gICAgICAgIHRoaXMuYXR0cnNbbmFtZV0gPSB2YWx1ZTtcbiAgICAgICAgaWYgKG5hbWUgPT09ICdpbWcnKSB7XG4gICAgICAgICAgICB0aGlzLl9zZXRJbWFnZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIEltYWdlLnByb3RvdHlwZS5fc2V0SW1hZ2UgPSBmdW5jdGlvbiAoaW1nKSB7XG4gICAgICAgIHZhciBhdHRycyA9IHRoaXMuYXR0cigpO1xuICAgICAgICB2YXIgZWwgPSB0aGlzLmdldCgnZWwnKTtcbiAgICAgICAgaWYgKGlzU3RyaW5nKGltZykpIHtcbiAgICAgICAgICAgIGVsLnNldEF0dHJpYnV0ZSgnaHJlZicsIGltZyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaW1nIGluc3RhbmNlb2Ygd2luZG93LkltYWdlKSB7XG4gICAgICAgICAgICBpZiAoIWF0dHJzLndpZHRoKSB7XG4gICAgICAgICAgICAgICAgZWwuc2V0QXR0cmlidXRlKCd3aWR0aCcsIGltZy53aWR0aCk7XG4gICAgICAgICAgICAgICAgdGhpcy5hdHRyKCd3aWR0aCcsIGltZy53aWR0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWF0dHJzLmhlaWdodCkge1xuICAgICAgICAgICAgICAgIGVsLnNldEF0dHJpYnV0ZSgnaGVpZ2h0JywgaW1nLmhlaWdodCk7XG4gICAgICAgICAgICAgICAgdGhpcy5hdHRyKCdoZWlnaHQnLCBpbWcuaGVpZ2h0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsLnNldEF0dHJpYnV0ZSgnaHJlZicsIGltZy5zcmMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGltZyBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmIGlzU3RyaW5nKGltZy5ub2RlTmFtZSkgJiYgaW1nLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09ICdDQU5WQVMnKSB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCBpbWcudG9EYXRhVVJMKCkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGltZyBpbnN0YW5jZW9mIEltYWdlRGF0YSkge1xuICAgICAgICAgICAgdmFyIGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgICAgICAgICAgY2FudmFzLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCBcIlwiICsgaW1nLndpZHRoKTtcbiAgICAgICAgICAgIGNhbnZhcy5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsIFwiXCIgKyBpbWcuaGVpZ2h0KTtcbiAgICAgICAgICAgIGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpLnB1dEltYWdlRGF0YShpbWcsIDAsIDApO1xuICAgICAgICAgICAgaWYgKCFhdHRycy53aWR0aCkge1xuICAgICAgICAgICAgICAgIGVsLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCBcIlwiICsgaW1nLndpZHRoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmF0dHIoJ3dpZHRoJywgaW1nLndpZHRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghYXR0cnMuaGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgZWwuc2V0QXR0cmlidXRlKCdoZWlnaHQnLCBcIlwiICsgaW1nLmhlaWdodCk7XG4gICAgICAgICAgICAgICAgdGhpcy5hdHRyKCdoZWlnaHQnLCBpbWcuaGVpZ2h0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsLnNldEF0dHJpYnV0ZSgnaHJlZicsIGNhbnZhcy50b0RhdGFVUkwoKSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBJbWFnZTtcbn0oU2hhcGVCYXNlKSk7XG5leHBvcnQgZGVmYXVsdCBJbWFnZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWltYWdlLmpzLm1hcCIsImltcG9ydCB7IF9fYXNzaWduLCBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbi8qKlxuICogQGZpbGVvdmVydmlldyBsaW5lXG4gKiBAYXV0aG9yIGRlbmdmdXBpbmdfZGV2ZWxvcEAxNjMuY29tXG4gKi9cbmltcG9ydCB7IExpbmUgYXMgTGluZVV0aWwgfSBmcm9tICdAYW50di9nLW1hdGgnO1xuaW1wb3J0IHsgZWFjaCwgaXNPYmplY3QgfSBmcm9tICdAYW50di91dGlsJztcbmltcG9ydCB7IFNWR19BVFRSX01BUCB9IGZyb20gJy4uL2NvbnN0YW50JztcbmltcG9ydCBTaGFwZUJhc2UgZnJvbSAnLi9iYXNlJztcbnZhciBMaW5lID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhMaW5lLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIExpbmUoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy50eXBlID0gJ2xpbmUnO1xuICAgICAgICBfdGhpcy5jYW5GaWxsID0gZmFsc2U7XG4gICAgICAgIF90aGlzLmNhblN0cm9rZSA9IHRydWU7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgTGluZS5wcm90b3R5cGUuZ2V0RGVmYXVsdEF0dHJzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYXR0cnMgPSBfc3VwZXIucHJvdG90eXBlLmdldERlZmF1bHRBdHRycy5jYWxsKHRoaXMpO1xuICAgICAgICByZXR1cm4gX19hc3NpZ24oX19hc3NpZ24oe30sIGF0dHJzKSwgeyB4MTogMCwgeTE6IDAsIHgyOiAwLCB5MjogMCwgc3RhcnRBcnJvdzogZmFsc2UsIGVuZEFycm93OiBmYWxzZSB9KTtcbiAgICB9O1xuICAgIExpbmUucHJvdG90eXBlLmNyZWF0ZVBhdGggPSBmdW5jdGlvbiAoY29udGV4dCwgdGFyZ2V0QXR0cnMpIHtcbiAgICAgICAgdmFyIGF0dHJzID0gdGhpcy5hdHRyKCk7XG4gICAgICAgIHZhciBlbCA9IHRoaXMuZ2V0KCdlbCcpO1xuICAgICAgICBlYWNoKHRhcmdldEF0dHJzIHx8IGF0dHJzLCBmdW5jdGlvbiAodmFsdWUsIGF0dHIpIHtcbiAgICAgICAgICAgIGlmIChhdHRyID09PSAnc3RhcnRBcnJvdycgfHwgYXR0ciA9PT0gJ2VuZEFycm93Jykge1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaWQgPSBpc09iamVjdCh2YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgID8gY29udGV4dC5hZGRBcnJvdyhhdHRycywgU1ZHX0FUVFJfTUFQW2F0dHJdKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBjb250ZXh0LmdldERlZmF1bHRBcnJvdyhhdHRycywgU1ZHX0FUVFJfTUFQW2F0dHJdKTtcbiAgICAgICAgICAgICAgICAgICAgZWwuc2V0QXR0cmlidXRlKFNWR19BVFRSX01BUFthdHRyXSwgXCJ1cmwoI1wiICsgaWQgKyBcIilcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoU1ZHX0FUVFJfTUFQW2F0dHJdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChTVkdfQVRUUl9NQVBbYXR0cl0pIHtcbiAgICAgICAgICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoU1ZHX0FUVFJfTUFQW2F0dHJdLCB2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogVXNlIG1hdGggY2FsY3VsYXRpb24gdG8gZ2V0IGxlbmd0aCBvZiBsaW5lXG4gICAgICogQHJldHVybiB7bnVtYmVyfSBsZW5ndGhcbiAgICAgKi9cbiAgICBMaW5lLnByb3RvdHlwZS5nZXRUb3RhbExlbmd0aCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hID0gdGhpcy5hdHRyKCksIHgxID0gX2EueDEsIHkxID0gX2EueTEsIHgyID0gX2EueDIsIHkyID0gX2EueTI7XG4gICAgICAgIHJldHVybiBMaW5lVXRpbC5sZW5ndGgoeDEsIHkxLCB4MiwgeTIpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogVXNlIG1hdGggY2FsY3VsYXRpb24gdG8gZ2V0IHBvaW50IGFjY29yZGluZyB0byByYXRpbyBhcyBzYW1lIHNhIENhbnZhcyB2ZXJzaW9uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJhdGlvXG4gICAgICogQHJldHVybiB7UG9pbnR9IHBvaW50XG4gICAgICovXG4gICAgTGluZS5wcm90b3R5cGUuZ2V0UG9pbnQgPSBmdW5jdGlvbiAocmF0aW8pIHtcbiAgICAgICAgdmFyIF9hID0gdGhpcy5hdHRyKCksIHgxID0gX2EueDEsIHkxID0gX2EueTEsIHgyID0gX2EueDIsIHkyID0gX2EueTI7XG4gICAgICAgIHJldHVybiBMaW5lVXRpbC5wb2ludEF0KHgxLCB5MSwgeDIsIHkyLCByYXRpbyk7XG4gICAgfTtcbiAgICByZXR1cm4gTGluZTtcbn0oU2hhcGVCYXNlKSk7XG5leHBvcnQgZGVmYXVsdCBMaW5lO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bGluZS5qcy5tYXAiLCJ2YXIgU3ltYm9scyA9IHtcbiAgICAvLyDlnIZcbiAgICBjaXJjbGU6IGZ1bmN0aW9uICh4LCB5LCByKSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBbJ00nLCB4LCB5XSxcbiAgICAgICAgICAgIFsnbScsIC1yLCAwXSxcbiAgICAgICAgICAgIFsnYScsIHIsIHIsIDAsIDEsIDAsIHIgKiAyLCAwXSxcbiAgICAgICAgICAgIFsnYScsIHIsIHIsIDAsIDEsIDAsIC1yICogMiwgMF0sXG4gICAgICAgIF07XG4gICAgfSxcbiAgICAvLyDmraPmlrnlvaJcbiAgICBzcXVhcmU6IGZ1bmN0aW9uICh4LCB5LCByKSB7XG4gICAgICAgIHJldHVybiBbWydNJywgeCAtIHIsIHkgLSByXSwgWydMJywgeCArIHIsIHkgLSByXSwgWydMJywgeCArIHIsIHkgKyByXSwgWydMJywgeCAtIHIsIHkgKyByXSwgWydaJ11dO1xuICAgIH0sXG4gICAgLy8g6I+x5b2iXG4gICAgZGlhbW9uZDogZnVuY3Rpb24gKHgsIHksIHIpIHtcbiAgICAgICAgcmV0dXJuIFtbJ00nLCB4IC0gciwgeV0sIFsnTCcsIHgsIHkgLSByXSwgWydMJywgeCArIHIsIHldLCBbJ0wnLCB4LCB5ICsgcl0sIFsnWiddXTtcbiAgICB9LFxuICAgIC8vIOS4ieinkuW9olxuICAgIHRyaWFuZ2xlOiBmdW5jdGlvbiAoeCwgeSwgcikge1xuICAgICAgICB2YXIgZGlmZlkgPSByICogTWF0aC5zaW4oKDEgLyAzKSAqIE1hdGguUEkpO1xuICAgICAgICByZXR1cm4gW1snTScsIHggLSByLCB5ICsgZGlmZlldLCBbJ0wnLCB4LCB5IC0gZGlmZlldLCBbJ0wnLCB4ICsgciwgeSArIGRpZmZZXSwgWyd6J11dO1xuICAgIH0sXG4gICAgLy8g5YCS5LiJ6KeS5b2iXG4gICAgdHJpYW5nbGVEb3duOiBmdW5jdGlvbiAoeCwgeSwgcikge1xuICAgICAgICB2YXIgZGlmZlkgPSByICogTWF0aC5zaW4oKDEgLyAzKSAqIE1hdGguUEkpO1xuICAgICAgICByZXR1cm4gW1snTScsIHggLSByLCB5IC0gZGlmZlldLCBbJ0wnLCB4ICsgciwgeSAtIGRpZmZZXSwgWydMJywgeCwgeSArIGRpZmZZXSwgWydaJ11dO1xuICAgIH0sXG59O1xuZXhwb3J0IGRlZmF1bHQge1xuICAgIGdldDogZnVuY3Rpb24gKHR5cGUpIHtcbiAgICAgICAgcmV0dXJuIFN5bWJvbHNbdHlwZV07XG4gICAgfSxcbiAgICByZWdpc3RlcjogZnVuY3Rpb24gKHR5cGUsIGZ1bmMpIHtcbiAgICAgICAgU3ltYm9sc1t0eXBlXSA9IGZ1bmM7XG4gICAgfSxcbiAgICByZW1vdmU6IGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgICAgIGRlbGV0ZSBTeW1ib2xzW3R5cGVdO1xuICAgIH0sXG4gICAgZ2V0QWxsOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBTeW1ib2xzO1xuICAgIH0sXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3ltYm9scy5qcy5tYXAiLCIvKipcbiAqIEBmaWxlb3ZlcnZpZXcgbWFya2VyXG4gKiBAYXV0aG9yIGRlbmdmdXBpbmdfZGV2ZWxvcEAxNjMuY29tXG4gKi9cbmltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgaXNBcnJheSwgaXNGdW5jdGlvbiB9IGZyb20gJ0BhbnR2L3V0aWwnO1xuaW1wb3J0IFNoYXBlQmFzZSBmcm9tICcuLi9iYXNlJztcbmltcG9ydCBzeW1ib2xzRmFjdG9yeSBmcm9tICcuL3N5bWJvbHMnO1xudmFyIE1hcmtlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoTWFya2VyLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIE1hcmtlcigpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLnR5cGUgPSAnbWFya2VyJztcbiAgICAgICAgX3RoaXMuY2FuRmlsbCA9IHRydWU7XG4gICAgICAgIF90aGlzLmNhblN0cm9rZSA9IHRydWU7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgTWFya2VyLnByb3RvdHlwZS5jcmVhdGVQYXRoID0gZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgICAgdmFyIGVsID0gdGhpcy5nZXQoJ2VsJyk7XG4gICAgICAgIGVsLnNldEF0dHJpYnV0ZSgnZCcsIHRoaXMuX2Fzc2VtYmxlTWFya2VyKCkpO1xuICAgIH07XG4gICAgTWFya2VyLnByb3RvdHlwZS5fYXNzZW1ibGVNYXJrZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBkID0gdGhpcy5fZ2V0UGF0aCgpO1xuICAgICAgICBpZiAoaXNBcnJheShkKSkge1xuICAgICAgICAgICAgcmV0dXJuIGRcbiAgICAgICAgICAgICAgICAubWFwKGZ1bmN0aW9uIChwYXRoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhdGguam9pbignICcpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuam9pbignJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGQ7XG4gICAgfTtcbiAgICBNYXJrZXIucHJvdG90eXBlLl9nZXRQYXRoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYXR0cnMgPSB0aGlzLmF0dHIoKTtcbiAgICAgICAgdmFyIHggPSBhdHRycy54LCB5ID0gYXR0cnMueTtcbiAgICAgICAgLy8g5YW85a65IHIg5ZKMIHJhZGl1cyDkuKTnp43lhpnms5XvvIzmjqjojZDkvb/nlKggclxuICAgICAgICB2YXIgciA9IGF0dHJzLnIgfHwgYXR0cnMucmFkaXVzO1xuICAgICAgICB2YXIgc3ltYm9sID0gYXR0cnMuc3ltYm9sIHx8ICdjaXJjbGUnO1xuICAgICAgICB2YXIgbWV0aG9kO1xuICAgICAgICBpZiAoaXNGdW5jdGlvbihzeW1ib2wpKSB7XG4gICAgICAgICAgICBtZXRob2QgPSBzeW1ib2w7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBtZXRob2QgPSBzeW1ib2xzRmFjdG9yeS5nZXQoc3ltYm9sKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW1ldGhvZCkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKG1ldGhvZCArIFwiIHN5bWJvbCBpcyBub3QgZXhpc3QuXCIpO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1ldGhvZCh4LCB5LCByKTtcbiAgICB9O1xuICAgIC8vIOS9nOS4uuWFtumdmeaAgeWxnuaAp1xuICAgIE1hcmtlci5zeW1ib2xzRmFjdG9yeSA9IHN5bWJvbHNGYWN0b3J5O1xuICAgIHJldHVybiBNYXJrZXI7XG59KFNoYXBlQmFzZSkpO1xuZXhwb3J0IGRlZmF1bHQgTWFya2VyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiaW1wb3J0IHsgX19hc3NpZ24sIF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgZWFjaCwgaXNBcnJheSwgaXNPYmplY3QgfSBmcm9tICdAYW50di91dGlsJztcbmltcG9ydCB7IFNWR19BVFRSX01BUCB9IGZyb20gJy4uL2NvbnN0YW50JztcbmltcG9ydCBTaGFwZUJhc2UgZnJvbSAnLi9iYXNlJztcbnZhciBQYXRoID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQYXRoLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBhdGgoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy50eXBlID0gJ3BhdGgnO1xuICAgICAgICBfdGhpcy5jYW5GaWxsID0gdHJ1ZTtcbiAgICAgICAgX3RoaXMuY2FuU3Ryb2tlID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBQYXRoLnByb3RvdHlwZS5nZXREZWZhdWx0QXR0cnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBhdHRycyA9IF9zdXBlci5wcm90b3R5cGUuZ2V0RGVmYXVsdEF0dHJzLmNhbGwodGhpcyk7XG4gICAgICAgIHJldHVybiBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgYXR0cnMpLCB7IHN0YXJ0QXJyb3c6IGZhbHNlLCBlbmRBcnJvdzogZmFsc2UgfSk7XG4gICAgfTtcbiAgICBQYXRoLnByb3RvdHlwZS5jcmVhdGVQYXRoID0gZnVuY3Rpb24gKGNvbnRleHQsIHRhcmdldEF0dHJzKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBhdHRycyA9IHRoaXMuYXR0cigpO1xuICAgICAgICB2YXIgZWwgPSB0aGlzLmdldCgnZWwnKTtcbiAgICAgICAgZWFjaCh0YXJnZXRBdHRycyB8fCBhdHRycywgZnVuY3Rpb24gKHZhbHVlLCBhdHRyKSB7XG4gICAgICAgICAgICBpZiAoYXR0ciA9PT0gJ3BhdGgnICYmIGlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgZWwuc2V0QXR0cmlidXRlKCdkJywgX3RoaXMuX2Zvcm1hdFBhdGgodmFsdWUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGF0dHIgPT09ICdzdGFydEFycm93JyB8fCBhdHRyID09PSAnZW5kQXJyb3cnKSB7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBpZCA9IGlzT2JqZWN0KHZhbHVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBjb250ZXh0LmFkZEFycm93KGF0dHJzLCBTVkdfQVRUUl9NQVBbYXR0cl0pXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGNvbnRleHQuZ2V0RGVmYXVsdEFycm93KGF0dHJzLCBTVkdfQVRUUl9NQVBbYXR0cl0pO1xuICAgICAgICAgICAgICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoU1ZHX0FUVFJfTUFQW2F0dHJdLCBcInVybCgjXCIgKyBpZCArIFwiKVwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZShTVkdfQVRUUl9NQVBbYXR0cl0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKFNWR19BVFRSX01BUFthdHRyXSkge1xuICAgICAgICAgICAgICAgIGVsLnNldEF0dHJpYnV0ZShTVkdfQVRUUl9NQVBbYXR0cl0sIHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBQYXRoLnByb3RvdHlwZS5fZm9ybWF0UGF0aCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB2YXIgbmV3VmFsdWUgPSB2YWx1ZVxuICAgICAgICAgICAgLm1hcChmdW5jdGlvbiAocGF0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHBhdGguam9pbignICcpO1xuICAgICAgICB9KVxuICAgICAgICAgICAgLmpvaW4oJycpO1xuICAgICAgICBpZiAofm5ld1ZhbHVlLmluZGV4T2YoJ05hTicpKSB7XG4gICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ld1ZhbHVlO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0IHRvdGFsIGxlbmd0aCBvZiBwYXRoXG4gICAgICog5bC9566h6YCa6L+H5rWP6KeI5Zmo55qEIFNWR1BhdGhFbGVtZW50LmdldFRvdGFsTGVuZ3RoKCkg5o6l5Y+j6I635Y+W55qEIHBhdGgg6ZW/5bqm77yMXG4gICAgICog5LiOIENhbnZhcyDniYjmnKzpgJrov4fmlbDlraborqHnrpfnmoTmlrnlvI/lvpfliLDnmoTplb/luqbmnInkuIDkupvnu4blvq7lt67lvILvvIzkvYbmnIDlpKfor6/lt67lnKjkuKrkvY3mlbDlg4/ntKDvvIznsr7luqbkuIrlj6/ku6Xog73mjqXlj5dcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IGxlbmd0aFxuICAgICAqL1xuICAgIFBhdGgucHJvdG90eXBlLmdldFRvdGFsTGVuZ3RoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZWwgPSB0aGlzLmdldCgnZWwnKTtcbiAgICAgICAgcmV0dXJuIGVsID8gZWwuZ2V0VG90YWxMZW5ndGgoKSA6IG51bGw7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgcG9pbnQgYWNjb3JkaW5nIHRvIHJhdGlvXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJhdGlvXG4gICAgICogQHJldHVybiB7UG9pbnR9IHBvaW50XG4gICAgICovXG4gICAgUGF0aC5wcm90b3R5cGUuZ2V0UG9pbnQgPSBmdW5jdGlvbiAocmF0aW8pIHtcbiAgICAgICAgdmFyIGVsID0gdGhpcy5nZXQoJ2VsJyk7XG4gICAgICAgIHZhciB0b3RhbExlbmd0aCA9IHRoaXMuZ2V0VG90YWxMZW5ndGgoKTtcbiAgICAgICAgLy8gQHNlZSBodHRwczovL2dpdGh1Yi5jb20vYW50dmlzL2cvaXNzdWVzLzYzNFxuICAgICAgICBpZiAodG90YWxMZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHZhciBwb2ludCA9IGVsID8gZWwuZ2V0UG9pbnRBdExlbmd0aChyYXRpbyAqIHRvdGFsTGVuZ3RoKSA6IG51bGw7XG4gICAgICAgIHJldHVybiBwb2ludFxuICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgeDogcG9pbnQueCxcbiAgICAgICAgICAgICAgICB5OiBwb2ludC55LFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiBudWxsO1xuICAgIH07XG4gICAgcmV0dXJuIFBhdGg7XG59KFNoYXBlQmFzZSkpO1xuZXhwb3J0IGRlZmF1bHQgUGF0aDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBhdGguanMubWFwIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG4vKipcbiAqIEBmaWxlb3ZlcnZpZXcgcG9seWdvblxuICogQGF1dGhvciBkZW5nZnVwaW5nX2RldmVsb3BAMTYzLmNvbVxuICovXG5pbXBvcnQgeyBlYWNoLCBpc0FycmF5IH0gZnJvbSAnQGFudHYvdXRpbCc7XG5pbXBvcnQgeyBTVkdfQVRUUl9NQVAgfSBmcm9tICcuLi9jb25zdGFudCc7XG5pbXBvcnQgU2hhcGVCYXNlIGZyb20gJy4vYmFzZSc7XG52YXIgUG9seWdvbiA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUG9seWdvbiwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQb2x5Z29uKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMudHlwZSA9ICdwb2x5Z29uJztcbiAgICAgICAgX3RoaXMuY2FuRmlsbCA9IHRydWU7XG4gICAgICAgIF90aGlzLmNhblN0cm9rZSA9IHRydWU7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgUG9seWdvbi5wcm90b3R5cGUuY3JlYXRlUGF0aCA9IGZ1bmN0aW9uIChjb250ZXh0LCB0YXJnZXRBdHRycykge1xuICAgICAgICB2YXIgYXR0cnMgPSB0aGlzLmF0dHIoKTtcbiAgICAgICAgdmFyIGVsID0gdGhpcy5nZXQoJ2VsJyk7XG4gICAgICAgIGVhY2godGFyZ2V0QXR0cnMgfHwgYXR0cnMsIGZ1bmN0aW9uICh2YWx1ZSwgYXR0cikge1xuICAgICAgICAgICAgaWYgKGF0dHIgPT09ICdwb2ludHMnICYmIGlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgICAgICAgICAgZWwuc2V0QXR0cmlidXRlKCdwb2ludHMnLCB2YWx1ZS5tYXAoZnVuY3Rpb24gKHBvaW50KSB7IHJldHVybiBwb2ludFswXSArIFwiLFwiICsgcG9pbnRbMV07IH0pLmpvaW4oJyAnKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChTVkdfQVRUUl9NQVBbYXR0cl0pIHtcbiAgICAgICAgICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoU1ZHX0FUVFJfTUFQW2F0dHJdLCB2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgcmV0dXJuIFBvbHlnb247XG59KFNoYXBlQmFzZSkpO1xuZXhwb3J0IGRlZmF1bHQgUG9seWdvbjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBvbHlnb24uanMubWFwIiwiaW1wb3J0IHsgX19hc3NpZ24sIF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgUG9seWxpbmUgYXMgUG9seWxpbmVVdGlsIH0gZnJvbSAnQGFudHYvZy1tYXRoJztcbmltcG9ydCB7IExpbmUgYXMgTGluZVV0aWwgfSBmcm9tICdAYW50di9nLW1hdGgnO1xuaW1wb3J0IHsgZWFjaCwgaXNBcnJheSwgaXNOaWwgfSBmcm9tICdAYW50di91dGlsJztcbmltcG9ydCB7IFNWR19BVFRSX01BUCB9IGZyb20gJy4uL2NvbnN0YW50JztcbmltcG9ydCBTaGFwZUJhc2UgZnJvbSAnLi9iYXNlJztcbnZhciBQb2x5bGluZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUG9seWxpbmUsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUG9seWxpbmUoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy50eXBlID0gJ3BvbHlsaW5lJztcbiAgICAgICAgX3RoaXMuY2FuRmlsbCA9IHRydWU7XG4gICAgICAgIF90aGlzLmNhblN0cm9rZSA9IHRydWU7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgUG9seWxpbmUucHJvdG90eXBlLmdldERlZmF1bHRBdHRycyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGF0dHJzID0gX3N1cGVyLnByb3RvdHlwZS5nZXREZWZhdWx0QXR0cnMuY2FsbCh0aGlzKTtcbiAgICAgICAgcmV0dXJuIF9fYXNzaWduKF9fYXNzaWduKHt9LCBhdHRycyksIHsgc3RhcnRBcnJvdzogZmFsc2UsIGVuZEFycm93OiBmYWxzZSB9KTtcbiAgICB9O1xuICAgIC8vIOabtOaWsOWxnuaAp+aXtu+8jOajgOa1i+aYr+WQpuabtOaUueS6hiBwb2ludHNcbiAgICBQb2x5bGluZS5wcm90b3R5cGUub25BdHRyQ2hhbmdlID0gZnVuY3Rpb24gKG5hbWUsIHZhbHVlLCBvcmlnaW5WYWx1ZSkge1xuICAgICAgICBfc3VwZXIucHJvdG90eXBlLm9uQXR0ckNoYW5nZS5jYWxsKHRoaXMsIG5hbWUsIHZhbHVlLCBvcmlnaW5WYWx1ZSk7XG4gICAgICAgIGlmIChbJ3BvaW50cyddLmluZGV4T2YobmFtZSkgIT09IC0xKSB7XG4gICAgICAgICAgICB0aGlzLl9yZXNldENhY2hlKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFBvbHlsaW5lLnByb3RvdHlwZS5fcmVzZXRDYWNoZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5zZXQoJ3RvdGFsTGVuZ3RoJywgbnVsbCk7XG4gICAgICAgIHRoaXMuc2V0KCd0Q2FjaGUnLCBudWxsKTtcbiAgICB9O1xuICAgIFBvbHlsaW5lLnByb3RvdHlwZS5jcmVhdGVQYXRoID0gZnVuY3Rpb24gKGNvbnRleHQsIHRhcmdldEF0dHJzKSB7XG4gICAgICAgIHZhciBhdHRycyA9IHRoaXMuYXR0cigpO1xuICAgICAgICB2YXIgZWwgPSB0aGlzLmdldCgnZWwnKTtcbiAgICAgICAgZWFjaCh0YXJnZXRBdHRycyB8fCBhdHRycywgZnVuY3Rpb24gKHZhbHVlLCBhdHRyKSB7XG4gICAgICAgICAgICBpZiAoYXR0ciA9PT0gJ3BvaW50cycgJiYgaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID49IDIpIHtcbiAgICAgICAgICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoJ3BvaW50cycsIHZhbHVlLm1hcChmdW5jdGlvbiAocG9pbnQpIHsgcmV0dXJuIHBvaW50WzBdICsgXCIsXCIgKyBwb2ludFsxXTsgfSkuam9pbignICcpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKFNWR19BVFRSX01BUFthdHRyXSkge1xuICAgICAgICAgICAgICAgIGVsLnNldEF0dHJpYnV0ZShTVkdfQVRUUl9NQVBbYXR0cl0sIHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgbGVuZ3RoIG9mIHBvbHlsaW5lXG4gICAgICogQHJldHVybiB7bnVtYmVyfSBsZW5ndGhcbiAgICAgKi9cbiAgICBQb2x5bGluZS5wcm90b3R5cGUuZ2V0VG90YWxMZW5ndGggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBwb2ludHMgPSB0aGlzLmF0dHIoKS5wb2ludHM7XG4gICAgICAgIC8vIGdldCB0b3RhbExlbmd0aCBmcm9tIGNhY2hlXG4gICAgICAgIHZhciB0b3RhbExlbmd0aCA9IHRoaXMuZ2V0KCd0b3RhbExlbmd0aCcpO1xuICAgICAgICBpZiAoIWlzTmlsKHRvdGFsTGVuZ3RoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRvdGFsTGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0KCd0b3RhbExlbmd0aCcsIFBvbHlsaW5lVXRpbC5sZW5ndGgocG9pbnRzKSk7XG4gICAgICAgIHJldHVybiB0aGlzLmdldCgndG90YWxMZW5ndGgnKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCBwb2ludCBhY2NvcmRpbmcgdG8gcmF0aW9cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmF0aW9cbiAgICAgKiBAcmV0dXJuIHtQb2ludH0gcG9pbnRcbiAgICAgKi9cbiAgICBQb2x5bGluZS5wcm90b3R5cGUuZ2V0UG9pbnQgPSBmdW5jdGlvbiAocmF0aW8pIHtcbiAgICAgICAgdmFyIHBvaW50cyA9IHRoaXMuYXR0cigpLnBvaW50cztcbiAgICAgICAgLy8gZ2V0IHRDYWNoZSBmcm9tIGNhY2hlXG4gICAgICAgIHZhciB0Q2FjaGUgPSB0aGlzLmdldCgndENhY2hlJyk7XG4gICAgICAgIGlmICghdENhY2hlKSB7XG4gICAgICAgICAgICB0aGlzLl9zZXRUY2FjaGUoKTtcbiAgICAgICAgICAgIHRDYWNoZSA9IHRoaXMuZ2V0KCd0Q2FjaGUnKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgc3VidDtcbiAgICAgICAgdmFyIGluZGV4O1xuICAgICAgICBlYWNoKHRDYWNoZSwgZnVuY3Rpb24gKHYsIGkpIHtcbiAgICAgICAgICAgIGlmIChyYXRpbyA+PSB2WzBdICYmIHJhdGlvIDw9IHZbMV0pIHtcbiAgICAgICAgICAgICAgICBzdWJ0ID0gKHJhdGlvIC0gdlswXSkgLyAodlsxXSAtIHZbMF0pO1xuICAgICAgICAgICAgICAgIGluZGV4ID0gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBMaW5lVXRpbC5wb2ludEF0KHBvaW50c1tpbmRleF1bMF0sIHBvaW50c1tpbmRleF1bMV0sIHBvaW50c1tpbmRleCArIDFdWzBdLCBwb2ludHNbaW5kZXggKyAxXVsxXSwgc3VidCk7XG4gICAgfTtcbiAgICBQb2x5bGluZS5wcm90b3R5cGUuX3NldFRjYWNoZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHBvaW50cyA9IHRoaXMuYXR0cigpLnBvaW50cztcbiAgICAgICAgaWYgKCFwb2ludHMgfHwgcG9pbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciB0b3RhbExlbmd0aCA9IHRoaXMuZ2V0VG90YWxMZW5ndGgoKTtcbiAgICAgICAgaWYgKHRvdGFsTGVuZ3RoIDw9IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdGVtcExlbmd0aCA9IDA7XG4gICAgICAgIHZhciB0Q2FjaGUgPSBbXTtcbiAgICAgICAgdmFyIHNlZ21lbnRUO1xuICAgICAgICB2YXIgc2VnbWVudEw7XG4gICAgICAgIGVhY2gocG9pbnRzLCBmdW5jdGlvbiAocCwgaSkge1xuICAgICAgICAgICAgaWYgKHBvaW50c1tpICsgMV0pIHtcbiAgICAgICAgICAgICAgICBzZWdtZW50VCA9IFtdO1xuICAgICAgICAgICAgICAgIHNlZ21lbnRUWzBdID0gdGVtcExlbmd0aCAvIHRvdGFsTGVuZ3RoO1xuICAgICAgICAgICAgICAgIHNlZ21lbnRMID0gTGluZVV0aWwubGVuZ3RoKHBbMF0sIHBbMV0sIHBvaW50c1tpICsgMV1bMF0sIHBvaW50c1tpICsgMV1bMV0pO1xuICAgICAgICAgICAgICAgIHRlbXBMZW5ndGggKz0gc2VnbWVudEw7XG4gICAgICAgICAgICAgICAgc2VnbWVudFRbMV0gPSB0ZW1wTGVuZ3RoIC8gdG90YWxMZW5ndGg7XG4gICAgICAgICAgICAgICAgdENhY2hlLnB1c2goc2VnbWVudFQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5zZXQoJ3RDYWNoZScsIHRDYWNoZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgc3RhcnQgdGFuZ2VudCB2ZWN0b3JcbiAgICAgKiBAcmV0dXJuIHtBcnJheX1cbiAgICAgKi9cbiAgICBQb2x5bGluZS5wcm90b3R5cGUuZ2V0U3RhcnRUYW5nZW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgcG9pbnRzID0gdGhpcy5hdHRyKCkucG9pbnRzO1xuICAgICAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgICAgIHJlc3VsdC5wdXNoKFtwb2ludHNbMV1bMF0sIHBvaW50c1sxXVsxXV0pO1xuICAgICAgICByZXN1bHQucHVzaChbcG9pbnRzWzBdWzBdLCBwb2ludHNbMF1bMV1dKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCBlbmQgdGFuZ2VudCB2ZWN0b3JcbiAgICAgKiBAcmV0dXJuIHtBcnJheX1cbiAgICAgKi9cbiAgICBQb2x5bGluZS5wcm90b3R5cGUuZ2V0RW5kVGFuZ2VudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHBvaW50cyA9IHRoaXMuYXR0cigpLnBvaW50cztcbiAgICAgICAgdmFyIGwgPSBwb2ludHMubGVuZ3RoIC0gMTtcbiAgICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgICByZXN1bHQucHVzaChbcG9pbnRzW2wgLSAxXVswXSwgcG9pbnRzW2wgLSAxXVsxXV0pO1xuICAgICAgICByZXN1bHQucHVzaChbcG9pbnRzW2xdWzBdLCBwb2ludHNbbF1bMV1dKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuICAgIHJldHVybiBQb2x5bGluZTtcbn0oU2hhcGVCYXNlKSk7XG5leHBvcnQgZGVmYXVsdCBQb2x5bGluZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBvbHlsaW5lLmpzLm1hcCIsImltcG9ydCB7IGVhY2gsIGlzQXJyYXksIGlzU3RyaW5nIH0gZnJvbSAnQGFudHYvdXRpbCc7XG52YXIgcmVnZXhUYWdzID0gL1tNTEhWUVRDU0FaXShbXk1MSFZRVENTQVpdKikvZ2k7XG52YXIgcmVnZXhEb3QgPSAvW15cXHMsXSsvZ2k7XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VSYWRpdXMocmFkaXVzKSB7XG4gICAgdmFyIHIxID0gMDtcbiAgICB2YXIgcjIgPSAwO1xuICAgIHZhciByMyA9IDA7XG4gICAgdmFyIHI0ID0gMDtcbiAgICBpZiAoaXNBcnJheShyYWRpdXMpKSB7XG4gICAgICAgIGlmIChyYWRpdXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICByMSA9IHIyID0gcjMgPSByNCA9IHJhZGl1c1swXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChyYWRpdXMubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgICByMSA9IHIzID0gcmFkaXVzWzBdO1xuICAgICAgICAgICAgcjIgPSByNCA9IHJhZGl1c1sxXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChyYWRpdXMubGVuZ3RoID09PSAzKSB7XG4gICAgICAgICAgICByMSA9IHJhZGl1c1swXTtcbiAgICAgICAgICAgIHIyID0gcjQgPSByYWRpdXNbMV07XG4gICAgICAgICAgICByMyA9IHJhZGl1c1syXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHIxID0gcmFkaXVzWzBdO1xuICAgICAgICAgICAgcjIgPSByYWRpdXNbMV07XG4gICAgICAgICAgICByMyA9IHJhZGl1c1syXTtcbiAgICAgICAgICAgIHI0ID0gcmFkaXVzWzNdO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByMSA9IHIyID0gcjMgPSByNCA9IHJhZGl1cztcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcjE6IHIxLFxuICAgICAgICByMjogcjIsXG4gICAgICAgIHIzOiByMyxcbiAgICAgICAgcjQ6IHI0LFxuICAgIH07XG59XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VQYXRoKHBhdGgpIHtcbiAgICBwYXRoID0gcGF0aCB8fCBbXTtcbiAgICBpZiAoaXNBcnJheShwYXRoKSkge1xuICAgICAgICByZXR1cm4gcGF0aDtcbiAgICB9XG4gICAgaWYgKGlzU3RyaW5nKHBhdGgpKSB7XG4gICAgICAgIHBhdGggPSBwYXRoLm1hdGNoKHJlZ2V4VGFncyk7XG4gICAgICAgIGVhY2gocGF0aCwgZnVuY3Rpb24gKGl0ZW0sIGluZGV4KSB7XG4gICAgICAgICAgICBpdGVtID0gaXRlbS5tYXRjaChyZWdleERvdCk7XG4gICAgICAgICAgICBpZiAoaXRlbVswXS5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRhZyA9IGl0ZW1bMF0uY2hhckF0KDApO1xuICAgICAgICAgICAgICAgIGl0ZW0uc3BsaWNlKDEsIDAsIGl0ZW1bMF0uc3Vic3RyKDEpKTtcbiAgICAgICAgICAgICAgICBpdGVtWzBdID0gdGFnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWFjaChpdGVtLCBmdW5jdGlvbiAoc3ViLCBpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpc05hTihzdWIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW1baV0gPSArc3ViO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcGF0aFtpbmRleF0gPSBpdGVtO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHBhdGg7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Zm9ybWF0LmpzLm1hcCIsIi8qKlxuICogQGZpbGVvdmVydmlldyByZWN0XG4gKiBAYXV0aG9yIGRlbmdmdXBpbmdfZGV2ZWxvcEAxNjMuY29tXG4gKi9cbmltcG9ydCB7IF9fYXNzaWduLCBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGVhY2gsIGlzQXJyYXkgfSBmcm9tICdAYW50di91dGlsJztcbmltcG9ydCBTaGFwZUJhc2UgZnJvbSAnLi9iYXNlJztcbmltcG9ydCB7IFNWR19BVFRSX01BUCB9IGZyb20gJy4uL2NvbnN0YW50JztcbmltcG9ydCB7IHBhcnNlUmFkaXVzIH0gZnJvbSAnLi4vdXRpbC9mb3JtYXQnO1xudmFyIFJlY3QgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFJlY3QsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUmVjdCgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLnR5cGUgPSAncmVjdCc7XG4gICAgICAgIF90aGlzLmNhbkZpbGwgPSB0cnVlO1xuICAgICAgICBfdGhpcy5jYW5TdHJva2UgPSB0cnVlO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIFJlY3QucHJvdG90eXBlLmdldERlZmF1bHRBdHRycyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGF0dHJzID0gX3N1cGVyLnByb3RvdHlwZS5nZXREZWZhdWx0QXR0cnMuY2FsbCh0aGlzKTtcbiAgICAgICAgcmV0dXJuIF9fYXNzaWduKF9fYXNzaWduKHt9LCBhdHRycyksIHsgeDogMCwgeTogMCwgd2lkdGg6IDAsIGhlaWdodDogMCwgcmFkaXVzOiAwIH0pO1xuICAgIH07XG4gICAgUmVjdC5wcm90b3R5cGUuY3JlYXRlUGF0aCA9IGZ1bmN0aW9uIChjb250ZXh0LCB0YXJnZXRBdHRycykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgYXR0cnMgPSB0aGlzLmF0dHIoKTtcbiAgICAgICAgdmFyIGVsID0gdGhpcy5nZXQoJ2VsJyk7XG4gICAgICAgIC8vIOWKoOS4iueKtuaAgemHj++8jOeUqOadpeagh+iusCBwYXRoIOaYr+WQpuW3sue7hOijhVxuICAgICAgICB2YXIgY29tcGxldGVkID0gZmFsc2U7XG4gICAgICAgIC8vIOWSjOe7hOijhSBwYXRoIOebuOWFs+eahOe7mOWbvuWxnuaAp1xuICAgICAgICB2YXIgcGF0aFJlbGF0ZWRBdHRycyA9IFsneCcsICd5JywgJ3dpZHRoJywgJ2hlaWdodCcsICdyYWRpdXMnXTtcbiAgICAgICAgZWFjaCh0YXJnZXRBdHRycyB8fCBhdHRycywgZnVuY3Rpb24gKHZhbHVlLCBhdHRyKSB7XG4gICAgICAgICAgICBpZiAocGF0aFJlbGF0ZWRBdHRycy5pbmRleE9mKGF0dHIpICE9PSAtMSAmJiAhY29tcGxldGVkKSB7XG4gICAgICAgICAgICAgICAgZWwuc2V0QXR0cmlidXRlKCdkJywgX3RoaXMuX2Fzc2VtYmxlUmVjdChhdHRycykpO1xuICAgICAgICAgICAgICAgIGNvbXBsZXRlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChwYXRoUmVsYXRlZEF0dHJzLmluZGV4T2YoYXR0cikgPT09IC0xICYmIFNWR19BVFRSX01BUFthdHRyXSkge1xuICAgICAgICAgICAgICAgIGVsLnNldEF0dHJpYnV0ZShTVkdfQVRUUl9NQVBbYXR0cl0sIHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBSZWN0LnByb3RvdHlwZS5fYXNzZW1ibGVSZWN0ID0gZnVuY3Rpb24gKGF0dHJzKSB7XG4gICAgICAgIHZhciB4ID0gYXR0cnMueDtcbiAgICAgICAgdmFyIHkgPSBhdHRycy55O1xuICAgICAgICB2YXIgdyA9IGF0dHJzLndpZHRoO1xuICAgICAgICB2YXIgaCA9IGF0dHJzLmhlaWdodDtcbiAgICAgICAgdmFyIHJhZGl1cyA9IGF0dHJzLnJhZGl1cztcbiAgICAgICAgaWYgKCFyYWRpdXMpIHtcbiAgICAgICAgICAgIHJldHVybiBcIk0gXCIgKyB4ICsgXCIsXCIgKyB5ICsgXCIgbCBcIiArIHcgKyBcIiwwIGwgMCxcIiArIGggKyBcIiBsXCIgKyAtdyArIFwiIDAgelwiO1xuICAgICAgICB9XG4gICAgICAgIHZhciByID0gcGFyc2VSYWRpdXMocmFkaXVzKTtcbiAgICAgICAgaWYgKGlzQXJyYXkocmFkaXVzKSkge1xuICAgICAgICAgICAgaWYgKHJhZGl1cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICByLnIxID0gci5yMiA9IHIucjMgPSByLnI0ID0gcmFkaXVzWzBdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocmFkaXVzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgICAgICAgIHIucjEgPSByLnIzID0gcmFkaXVzWzBdO1xuICAgICAgICAgICAgICAgIHIucjIgPSByLnI0ID0gcmFkaXVzWzFdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocmFkaXVzLmxlbmd0aCA9PT0gMykge1xuICAgICAgICAgICAgICAgIHIucjEgPSByYWRpdXNbMF07XG4gICAgICAgICAgICAgICAgci5yMiA9IHIucjQgPSByYWRpdXNbMV07XG4gICAgICAgICAgICAgICAgci5yMyA9IHJhZGl1c1syXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHIucjEgPSByYWRpdXNbMF07XG4gICAgICAgICAgICAgICAgci5yMiA9IHJhZGl1c1sxXTtcbiAgICAgICAgICAgICAgICByLnIzID0gcmFkaXVzWzJdO1xuICAgICAgICAgICAgICAgIHIucjQgPSByYWRpdXNbM107XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByLnIxID0gci5yMiA9IHIucjMgPSByLnI0ID0gcmFkaXVzO1xuICAgICAgICB9XG4gICAgICAgIHZhciBkID0gW1xuICAgICAgICAgICAgW1wiTSBcIiArICh4ICsgci5yMSkgKyBcIixcIiArIHldLFxuICAgICAgICAgICAgW1wibCBcIiArICh3IC0gci5yMSAtIHIucjIpICsgXCIsMFwiXSxcbiAgICAgICAgICAgIFtcImEgXCIgKyByLnIyICsgXCIsXCIgKyByLnIyICsgXCIsMCwwLDEsXCIgKyByLnIyICsgXCIsXCIgKyByLnIyXSxcbiAgICAgICAgICAgIFtcImwgMCxcIiArIChoIC0gci5yMiAtIHIucjMpXSxcbiAgICAgICAgICAgIFtcImEgXCIgKyByLnIzICsgXCIsXCIgKyByLnIzICsgXCIsMCwwLDEsXCIgKyAtci5yMyArIFwiLFwiICsgci5yM10sXG4gICAgICAgICAgICBbXCJsIFwiICsgKHIucjMgKyByLnI0IC0gdykgKyBcIiwwXCJdLFxuICAgICAgICAgICAgW1wiYSBcIiArIHIucjQgKyBcIixcIiArIHIucjQgKyBcIiwwLDAsMSxcIiArIC1yLnI0ICsgXCIsXCIgKyAtci5yNF0sXG4gICAgICAgICAgICBbXCJsIDAsXCIgKyAoci5yNCArIHIucjEgLSBoKV0sXG4gICAgICAgICAgICBbXCJhIFwiICsgci5yMSArIFwiLFwiICsgci5yMSArIFwiLDAsMCwxLFwiICsgci5yMSArIFwiLFwiICsgLXIucjFdLFxuICAgICAgICAgICAgWyd6J10sXG4gICAgICAgIF07XG4gICAgICAgIHJldHVybiBkLmpvaW4oJyAnKTtcbiAgICB9O1xuICAgIHJldHVybiBSZWN0O1xufShTaGFwZUJhc2UpKTtcbmV4cG9ydCBkZWZhdWx0IFJlY3Q7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZWN0LmpzLm1hcCIsIi8qKlxuICogQGZpbGVvdmVydmlldyB0ZXh0XG4gKiBAYXV0aG9yIGRlbmdmdXBpbmdfZGV2ZWxvcEAxNjMuY29tXG4gKi9cbmltcG9ydCB7IF9fYXNzaWduLCBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGVhY2ggfSBmcm9tICdAYW50di91dGlsJztcbmltcG9ydCB7IGRldGVjdCB9IGZyb20gJ2RldGVjdC1icm93c2VyJztcbmltcG9ydCB7IHNldFRyYW5zZm9ybSB9IGZyb20gJy4uL3V0aWwvc3ZnJztcbmltcG9ydCB7IFNWR19BVFRSX01BUCB9IGZyb20gJy4uL2NvbnN0YW50JztcbmltcG9ydCBTaGFwZUJhc2UgZnJvbSAnLi9iYXNlJztcbnZhciBMRVRURVJfU1BBQ0lORyA9IDAuMztcbnZhciBCQVNFTElORV9NQVAgPSB7XG4gICAgdG9wOiAnYmVmb3JlLWVkZ2UnLFxuICAgIG1pZGRsZTogJ2NlbnRyYWwnLFxuICAgIGJvdHRvbTogJ2FmdGVyLWVkZ2UnLFxuICAgIGFscGhhYmV0aWM6ICdiYXNlbGluZScsXG4gICAgaGFuZ2luZzogJ2hhbmdpbmcnLFxufTtcbi8vIGZvciBGaXJlRm94XG52YXIgQkFTRUxJTkVfTUFQX0ZPUl9GSVJFRk9YID0ge1xuICAgIHRvcDogJ3RleHQtYmVmb3JlLWVkZ2UnLFxuICAgIG1pZGRsZTogJ2NlbnRyYWwnLFxuICAgIGJvdHRvbTogJ3RleHQtYWZ0ZXItZWRnZScsXG4gICAgYWxwaGFiZXRpYzogJ2FscGhhYmV0aWMnLFxuICAgIGhhbmdpbmc6ICdoYW5naW5nJyxcbn07XG52YXIgQU5DSE9SX01BUCA9IHtcbiAgICBsZWZ0OiAnbGVmdCcsXG4gICAgc3RhcnQ6ICdsZWZ0JyxcbiAgICBjZW50ZXI6ICdtaWRkbGUnLFxuICAgIHJpZ2h0OiAnZW5kJyxcbiAgICBlbmQ6ICdlbmQnLFxufTtcbnZhciBUZXh0ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhUZXh0LCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFRleHQoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy50eXBlID0gJ3RleHQnO1xuICAgICAgICBfdGhpcy5jYW5GaWxsID0gdHJ1ZTtcbiAgICAgICAgX3RoaXMuY2FuU3Ryb2tlID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBUZXh0LnByb3RvdHlwZS5nZXREZWZhdWx0QXR0cnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBhdHRycyA9IF9zdXBlci5wcm90b3R5cGUuZ2V0RGVmYXVsdEF0dHJzLmNhbGwodGhpcyk7XG4gICAgICAgIHJldHVybiBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgYXR0cnMpLCB7IHg6IDAsIHk6IDAsIHRleHQ6IG51bGwsIGZvbnRTaXplOiAxMiwgZm9udEZhbWlseTogJ3NhbnMtc2VyaWYnLCBmb250U3R5bGU6ICdub3JtYWwnLCBmb250V2VpZ2h0OiAnbm9ybWFsJywgZm9udFZhcmlhbnQ6ICdub3JtYWwnLCB0ZXh0QWxpZ246ICdzdGFydCcsIHRleHRCYXNlbGluZTogJ2JvdHRvbScgfSk7XG4gICAgfTtcbiAgICBUZXh0LnByb3RvdHlwZS5jcmVhdGVQYXRoID0gZnVuY3Rpb24gKGNvbnRleHQsIHRhcmdldEF0dHJzKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBhdHRycyA9IHRoaXMuYXR0cigpO1xuICAgICAgICB2YXIgZWwgPSB0aGlzLmdldCgnZWwnKTtcbiAgICAgICAgdGhpcy5fc2V0Rm9udCgpO1xuICAgICAgICBlYWNoKHRhcmdldEF0dHJzIHx8IGF0dHJzLCBmdW5jdGlvbiAodmFsdWUsIGF0dHIpIHtcbiAgICAgICAgICAgIGlmIChhdHRyID09PSAndGV4dCcpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5fc2V0VGV4dChcIlwiICsgdmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYXR0ciA9PT0gJ21hdHJpeCcgJiYgdmFsdWUpIHtcbiAgICAgICAgICAgICAgICBzZXRUcmFuc2Zvcm0oX3RoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoU1ZHX0FUVFJfTUFQW2F0dHJdKSB7XG4gICAgICAgICAgICAgICAgZWwuc2V0QXR0cmlidXRlKFNWR19BVFRSX01BUFthdHRyXSwgdmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgZWwuc2V0QXR0cmlidXRlKCdwYWludC1vcmRlcicsICdzdHJva2UnKTtcbiAgICAgICAgZWwuc2V0QXR0cmlidXRlKCdzdHlsZScsICdzdHJva2UtbGluZWNhcDpidXR0OyBzdHJva2UtbGluZWpvaW46bWl0ZXI7Jyk7XG4gICAgfTtcbiAgICBUZXh0LnByb3RvdHlwZS5fc2V0Rm9udCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGVsID0gdGhpcy5nZXQoJ2VsJyk7XG4gICAgICAgIHZhciBfYSA9IHRoaXMuYXR0cigpLCB0ZXh0QmFzZWxpbmUgPSBfYS50ZXh0QmFzZWxpbmUsIHRleHRBbGlnbiA9IF9hLnRleHRBbGlnbjtcbiAgICAgICAgdmFyIGJyb3dzZXIgPSBkZXRlY3QoKTtcbiAgICAgICAgaWYgKGJyb3dzZXIgJiYgYnJvd3Nlci5uYW1lID09PSAnZmlyZWZveCcpIHtcbiAgICAgICAgICAgIC8vIGNvbXBhdGlibGUgd2l0aCBGaXJlRm94IGJyb3dzZXIsIHJlZjogaHR0cHM6Ly9naXRodWIuY29tL2FudHZpcy9nL2lzc3Vlcy8xMTlcbiAgICAgICAgICAgIGVsLnNldEF0dHJpYnV0ZSgnZG9taW5hbnQtYmFzZWxpbmUnLCBCQVNFTElORV9NQVBfRk9SX0ZJUkVGT1hbdGV4dEJhc2VsaW5lXSB8fCAnYWxwaGFiZXRpYycpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZWwuc2V0QXR0cmlidXRlKCdhbGlnbm1lbnQtYmFzZWxpbmUnLCBCQVNFTElORV9NQVBbdGV4dEJhc2VsaW5lXSB8fCAnYmFzZWxpbmUnKTtcbiAgICAgICAgfVxuICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoJ3RleHQtYW5jaG9yJywgQU5DSE9SX01BUFt0ZXh0QWxpZ25dIHx8ICdsZWZ0Jyk7XG4gICAgfTtcbiAgICBUZXh0LnByb3RvdHlwZS5fc2V0VGV4dCA9IGZ1bmN0aW9uICh0ZXh0KSB7XG4gICAgICAgIHZhciBlbCA9IHRoaXMuZ2V0KCdlbCcpO1xuICAgICAgICB2YXIgX2EgPSB0aGlzLmF0dHIoKSwgeCA9IF9hLngsIF9iID0gX2EudGV4dEJhc2VsaW5lLCBiYXNlbGluZSA9IF9iID09PSB2b2lkIDAgPyAnYm90dG9tJyA6IF9iO1xuICAgICAgICBpZiAoIXRleHQpIHtcbiAgICAgICAgICAgIGVsLmlubmVySFRNTCA9ICcnO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKH50ZXh0LmluZGV4T2YoJ1xcbicpKSB7XG4gICAgICAgICAgICB2YXIgdGV4dEFyciA9IHRleHQuc3BsaXQoJ1xcbicpO1xuICAgICAgICAgICAgdmFyIHRleHRMZW5fMSA9IHRleHRBcnIubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgIHZhciBhcnJfMSA9ICcnO1xuICAgICAgICAgICAgZWFjaCh0ZXh0QXJyLCBmdW5jdGlvbiAoc2VnbWVudCwgaSkge1xuICAgICAgICAgICAgICAgIGlmIChpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChiYXNlbGluZSA9PT0gJ2FscGhhYmV0aWMnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcnJfMSArPSBcIjx0c3BhbiB4PVxcXCJcIiArIHggKyBcIlxcXCIgZHk9XFxcIlwiICsgLXRleHRMZW5fMSArIFwiZW1cXFwiPlwiICsgc2VnbWVudCArIFwiPC90c3Bhbj5cIjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChiYXNlbGluZSA9PT0gJ3RvcCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFycl8xICs9IFwiPHRzcGFuIHg9XFxcIlwiICsgeCArIFwiXFxcIiBkeT1cXFwiMC45ZW1cXFwiPlwiICsgc2VnbWVudCArIFwiPC90c3Bhbj5cIjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChiYXNlbGluZSA9PT0gJ21pZGRsZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFycl8xICs9IFwiPHRzcGFuIHg9XFxcIlwiICsgeCArIFwiXFxcIiBkeT1cXFwiXCIgKyAtKHRleHRMZW5fMSAtIDEpIC8gMiArIFwiZW1cXFwiPlwiICsgc2VnbWVudCArIFwiPC90c3Bhbj5cIjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChiYXNlbGluZSA9PT0gJ2JvdHRvbScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFycl8xICs9IFwiPHRzcGFuIHg9XFxcIlwiICsgeCArIFwiXFxcIiBkeT1cXFwiLVwiICsgKHRleHRMZW5fMSArIExFVFRFUl9TUEFDSU5HKSArIFwiZW1cXFwiPlwiICsgc2VnbWVudCArIFwiPC90c3Bhbj5cIjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChiYXNlbGluZSA9PT0gJ2hhbmdpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcnJfMSArPSBcIjx0c3BhbiB4PVxcXCJcIiArIHggKyBcIlxcXCIgZHk9XFxcIlwiICsgKC0odGV4dExlbl8xIC0gMSkgLSBMRVRURVJfU1BBQ0lORykgKyBcImVtXFxcIj5cIiArIHNlZ21lbnQgKyBcIjwvdHNwYW4+XCI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGFycl8xICs9IFwiPHRzcGFuIHg9XFxcIlwiICsgeCArIFwiXFxcIiBkeT1cXFwiMWVtXFxcIj5cIiArIHNlZ21lbnQgKyBcIjwvdHNwYW4+XCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBlbC5pbm5lckhUTUwgPSBhcnJfMTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGVsLmlubmVySFRNTCA9IHRleHQ7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBUZXh0O1xufShTaGFwZUJhc2UpKTtcbmV4cG9ydCBkZWZhdWx0IFRleHQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD10ZXh0LmpzLm1hcCIsImV4cG9ydCB7IGRlZmF1bHQgYXMgQmFzZSB9IGZyb20gJy4vYmFzZSc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIENpcmNsZSB9IGZyb20gJy4vY2lyY2xlJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgRG9tIH0gZnJvbSAnLi9kb20nO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBFbGxpcHNlIH0gZnJvbSAnLi9lbGxpcHNlJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgSW1hZ2UgfSBmcm9tICcuL2ltYWdlJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgTGluZSB9IGZyb20gJy4vbGluZSc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIE1hcmtlciB9IGZyb20gJy4vbWFya2VyJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUGF0aCB9IGZyb20gJy4vcGF0aCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBvbHlnb24gfSBmcm9tICcuL3BvbHlnb24nO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQb2x5bGluZSB9IGZyb20gJy4vcG9seWxpbmUnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBSZWN0IH0gZnJvbSAnLi9yZWN0JztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgVGV4dCB9IGZyb20gJy4vdGV4dCc7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///80\n')},function(module,__webpack_exports__,__webpack_require__){"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "create", function() { return create; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "clone", function() { return clone; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "fromValues", function() { return fromValues; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "copy", function() { return copy; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "set", function() { return set; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "add", function() { return add; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "subtract", function() { return subtract; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "multiply", function() { return multiply; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "divide", function() { return divide; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ceil", function() { return ceil; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "floor", function() { return floor; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "min", function() { return min; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "max", function() { return max; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "round", function() { return round; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "scale", function() { return scale; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "scaleAndAdd", function() { return scaleAndAdd; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "distance", function() { return distance; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "squaredDistance", function() { return squaredDistance; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "length", function() { return length; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "squaredLength", function() { return squaredLength; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "negate", function() { return negate; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "inverse", function() { return inverse; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "normalize", function() { return normalize; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "dot", function() { return dot; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "cross", function() { return cross; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "lerp", function() { return lerp; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "random", function() { return random; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "transformMat2", function() { return transformMat2; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "transformMat2d", function() { return transformMat2d; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "transformMat3", function() { return transformMat3; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "transformMat4", function() { return transformMat4; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "rotate", function() { return rotate; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "angle", function() { return angle; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "zero", function() { return zero; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "str", function() { return str; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "exactEquals", function() { return exactEquals; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "equals", function() { return equals; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "len", function() { return len; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sub", function() { return sub; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mul", function() { return mul; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "div", function() { return div; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "dist", function() { return dist; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sqrDist", function() { return sqrDist; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sqrLen", function() { return sqrLen; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "forEach", function() { return forEach; });\n/* harmony import */ var _common_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12);\n\n/**\n * 2 Dimensional Vector\n * @module vec2\n */\n\n/**\n * Creates a new, empty vec2\n *\n * @returns {vec2} a new 2D vector\n */\n\nfunction create() {\n var out = new _common_js__WEBPACK_IMPORTED_MODULE_0__[/* ARRAY_TYPE */ "a"](2);\n\n if (_common_js__WEBPACK_IMPORTED_MODULE_0__[/* ARRAY_TYPE */ "a"] != Float32Array) {\n out[0] = 0;\n out[1] = 0;\n }\n\n return out;\n}\n/**\n * Creates a new vec2 initialized with values from an existing vector\n *\n * @param {ReadonlyVec2} a vector to clone\n * @returns {vec2} a new 2D vector\n */\n\nfunction clone(a) {\n var out = new _common_js__WEBPACK_IMPORTED_MODULE_0__[/* ARRAY_TYPE */ "a"](2);\n out[0] = a[0];\n out[1] = a[1];\n return out;\n}\n/**\n * Creates a new vec2 initialized with the given values\n *\n * @param {Number} x X component\n * @param {Number} y Y component\n * @returns {vec2} a new 2D vector\n */\n\nfunction fromValues(x, y) {\n var out = new _common_js__WEBPACK_IMPORTED_MODULE_0__[/* ARRAY_TYPE */ "a"](2);\n out[0] = x;\n out[1] = y;\n return out;\n}\n/**\n * Copy the values from one vec2 to another\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the source vector\n * @returns {vec2} out\n */\n\nfunction copy(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n return out;\n}\n/**\n * Set the components of a vec2 to the given values\n *\n * @param {vec2} out the receiving vector\n * @param {Number} x X component\n * @param {Number} y Y component\n * @returns {vec2} out\n */\n\nfunction set(out, x, y) {\n out[0] = x;\n out[1] = y;\n return out;\n}\n/**\n * Adds two vec2\'s\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {vec2} out\n */\n\nfunction add(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n return out;\n}\n/**\n * Subtracts vector b from vector a\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {vec2} out\n */\n\nfunction subtract(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n return out;\n}\n/**\n * Multiplies two vec2\'s\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {vec2} out\n */\n\nfunction multiply(out, a, b) {\n out[0] = a[0] * b[0];\n out[1] = a[1] * b[1];\n return out;\n}\n/**\n * Divides two vec2\'s\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {vec2} out\n */\n\nfunction divide(out, a, b) {\n out[0] = a[0] / b[0];\n out[1] = a[1] / b[1];\n return out;\n}\n/**\n * Math.ceil the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a vector to ceil\n * @returns {vec2} out\n */\n\nfunction ceil(out, a) {\n out[0] = Math.ceil(a[0]);\n out[1] = Math.ceil(a[1]);\n return out;\n}\n/**\n * Math.floor the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a vector to floor\n * @returns {vec2} out\n */\n\nfunction floor(out, a) {\n out[0] = Math.floor(a[0]);\n out[1] = Math.floor(a[1]);\n return out;\n}\n/**\n * Returns the minimum of two vec2\'s\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {vec2} out\n */\n\nfunction min(out, a, b) {\n out[0] = Math.min(a[0], b[0]);\n out[1] = Math.min(a[1], b[1]);\n return out;\n}\n/**\n * Returns the maximum of two vec2\'s\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {vec2} out\n */\n\nfunction max(out, a, b) {\n out[0] = Math.max(a[0], b[0]);\n out[1] = Math.max(a[1], b[1]);\n return out;\n}\n/**\n * Math.round the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a vector to round\n * @returns {vec2} out\n */\n\nfunction round(out, a) {\n out[0] = Math.round(a[0]);\n out[1] = Math.round(a[1]);\n return out;\n}\n/**\n * Scales a vec2 by a scalar number\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {vec2} out\n */\n\nfunction scale(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n return out;\n}\n/**\n * Adds two vec2\'s after scaling the second operand by a scalar value\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @param {Number} scale the amount to scale b by before adding\n * @returns {vec2} out\n */\n\nfunction scaleAndAdd(out, a, b, scale) {\n out[0] = a[0] + b[0] * scale;\n out[1] = a[1] + b[1] * scale;\n return out;\n}\n/**\n * Calculates the euclidian distance between two vec2\'s\n *\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {Number} distance between a and b\n */\n\nfunction distance(a, b) {\n var x = b[0] - a[0],\n y = b[1] - a[1];\n return Math.hypot(x, y);\n}\n/**\n * Calculates the squared euclidian distance between two vec2\'s\n *\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {Number} squared distance between a and b\n */\n\nfunction squaredDistance(a, b) {\n var x = b[0] - a[0],\n y = b[1] - a[1];\n return x * x + y * y;\n}\n/**\n * Calculates the length of a vec2\n *\n * @param {ReadonlyVec2} a vector to calculate length of\n * @returns {Number} length of a\n */\n\nfunction length(a) {\n var x = a[0],\n y = a[1];\n return Math.hypot(x, y);\n}\n/**\n * Calculates the squared length of a vec2\n *\n * @param {ReadonlyVec2} a vector to calculate squared length of\n * @returns {Number} squared length of a\n */\n\nfunction squaredLength(a) {\n var x = a[0],\n y = a[1];\n return x * x + y * y;\n}\n/**\n * Negates the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a vector to negate\n * @returns {vec2} out\n */\n\nfunction negate(out, a) {\n out[0] = -a[0];\n out[1] = -a[1];\n return out;\n}\n/**\n * Returns the inverse of the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a vector to invert\n * @returns {vec2} out\n */\n\nfunction inverse(out, a) {\n out[0] = 1.0 / a[0];\n out[1] = 1.0 / a[1];\n return out;\n}\n/**\n * Normalize a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a vector to normalize\n * @returns {vec2} out\n */\n\nfunction normalize(out, a) {\n var x = a[0],\n y = a[1];\n var len = x * x + y * y;\n\n if (len > 0) {\n //TODO: evaluate use of glm_invsqrt here?\n len = 1 / Math.sqrt(len);\n }\n\n out[0] = a[0] * len;\n out[1] = a[1] * len;\n return out;\n}\n/**\n * Calculates the dot product of two vec2\'s\n *\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {Number} dot product of a and b\n */\n\nfunction dot(a, b) {\n return a[0] * b[0] + a[1] * b[1];\n}\n/**\n * Computes the cross product of two vec2\'s\n * Note that the cross product must by definition produce a 3D vector\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {vec3} out\n */\n\nfunction cross(out, a, b) {\n var z = a[0] * b[1] - a[1] * b[0];\n out[0] = out[1] = 0;\n out[2] = z;\n return out;\n}\n/**\n * Performs a linear interpolation between two vec2\'s\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec2} out\n */\n\nfunction lerp(out, a, b, t) {\n var ax = a[0],\n ay = a[1];\n out[0] = ax + t * (b[0] - ax);\n out[1] = ay + t * (b[1] - ay);\n return out;\n}\n/**\n * Generates a random vector with the given scale\n *\n * @param {vec2} out the receiving vector\n * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned\n * @returns {vec2} out\n */\n\nfunction random(out, scale) {\n scale = scale || 1.0;\n var r = _common_js__WEBPACK_IMPORTED_MODULE_0__[/* RANDOM */ "c"]() * 2.0 * Math.PI;\n out[0] = Math.cos(r) * scale;\n out[1] = Math.sin(r) * scale;\n return out;\n}\n/**\n * Transforms the vec2 with a mat2\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the vector to transform\n * @param {ReadonlyMat2} m matrix to transform with\n * @returns {vec2} out\n */\n\nfunction transformMat2(out, a, m) {\n var x = a[0],\n y = a[1];\n out[0] = m[0] * x + m[2] * y;\n out[1] = m[1] * x + m[3] * y;\n return out;\n}\n/**\n * Transforms the vec2 with a mat2d\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the vector to transform\n * @param {ReadonlyMat2d} m matrix to transform with\n * @returns {vec2} out\n */\n\nfunction transformMat2d(out, a, m) {\n var x = a[0],\n y = a[1];\n out[0] = m[0] * x + m[2] * y + m[4];\n out[1] = m[1] * x + m[3] * y + m[5];\n return out;\n}\n/**\n * Transforms the vec2 with a mat3\n * 3rd vector component is implicitly \'1\'\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the vector to transform\n * @param {ReadonlyMat3} m matrix to transform with\n * @returns {vec2} out\n */\n\nfunction transformMat3(out, a, m) {\n var x = a[0],\n y = a[1];\n out[0] = m[0] * x + m[3] * y + m[6];\n out[1] = m[1] * x + m[4] * y + m[7];\n return out;\n}\n/**\n * Transforms the vec2 with a mat4\n * 3rd vector component is implicitly \'0\'\n * 4th vector component is implicitly \'1\'\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the vector to transform\n * @param {ReadonlyMat4} m matrix to transform with\n * @returns {vec2} out\n */\n\nfunction transformMat4(out, a, m) {\n var x = a[0];\n var y = a[1];\n out[0] = m[0] * x + m[4] * y + m[12];\n out[1] = m[1] * x + m[5] * y + m[13];\n return out;\n}\n/**\n * Rotate a 2D vector\n * @param {vec2} out The receiving vec2\n * @param {ReadonlyVec2} a The vec2 point to rotate\n * @param {ReadonlyVec2} b The origin of the rotation\n * @param {Number} rad The angle of rotation in radians\n * @returns {vec2} out\n */\n\nfunction rotate(out, a, b, rad) {\n //Translate point to the origin\n var p0 = a[0] - b[0],\n p1 = a[1] - b[1],\n sinC = Math.sin(rad),\n cosC = Math.cos(rad); //perform rotation and translate to correct position\n\n out[0] = p0 * cosC - p1 * sinC + b[0];\n out[1] = p0 * sinC + p1 * cosC + b[1];\n return out;\n}\n/**\n * Get the angle between two 2D vectors\n * @param {ReadonlyVec2} a The first operand\n * @param {ReadonlyVec2} b The second operand\n * @returns {Number} The angle in radians\n */\n\nfunction angle(a, b) {\n var x1 = a[0],\n y1 = a[1],\n x2 = b[0],\n y2 = b[1],\n // mag is the product of the magnitudes of a and b\n mag = Math.sqrt(x1 * x1 + y1 * y1) * Math.sqrt(x2 * x2 + y2 * y2),\n // mag &&.. short circuits if mag == 0\n cosine = mag && (x1 * x2 + y1 * y2) / mag; // Math.min(Math.max(cosine, -1), 1) clamps the cosine between -1 and 1\n\n return Math.acos(Math.min(Math.max(cosine, -1), 1));\n}\n/**\n * Set the components of a vec2 to zero\n *\n * @param {vec2} out the receiving vector\n * @returns {vec2} out\n */\n\nfunction zero(out) {\n out[0] = 0.0;\n out[1] = 0.0;\n return out;\n}\n/**\n * Returns a string representation of a vector\n *\n * @param {ReadonlyVec2} a vector to represent as a string\n * @returns {String} string representation of the vector\n */\n\nfunction str(a) {\n return "vec2(" + a[0] + ", " + a[1] + ")";\n}\n/**\n * Returns whether or not the vectors exactly have the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyVec2} a The first vector.\n * @param {ReadonlyVec2} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\nfunction exactEquals(a, b) {\n return a[0] === b[0] && a[1] === b[1];\n}\n/**\n * Returns whether or not the vectors have approximately the same elements in the same position.\n *\n * @param {ReadonlyVec2} a The first vector.\n * @param {ReadonlyVec2} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\nfunction equals(a, b) {\n var a0 = a[0],\n a1 = a[1];\n var b0 = b[0],\n b1 = b[1];\n return Math.abs(a0 - b0) <= _common_js__WEBPACK_IMPORTED_MODULE_0__[/* EPSILON */ "b"] * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= _common_js__WEBPACK_IMPORTED_MODULE_0__[/* EPSILON */ "b"] * Math.max(1.0, Math.abs(a1), Math.abs(b1));\n}\n/**\n * Alias for {@link vec2.length}\n * @function\n */\n\nvar len = length;\n/**\n * Alias for {@link vec2.subtract}\n * @function\n */\n\nvar sub = subtract;\n/**\n * Alias for {@link vec2.multiply}\n * @function\n */\n\nvar mul = multiply;\n/**\n * Alias for {@link vec2.divide}\n * @function\n */\n\nvar div = divide;\n/**\n * Alias for {@link vec2.distance}\n * @function\n */\n\nvar dist = distance;\n/**\n * Alias for {@link vec2.squaredDistance}\n * @function\n */\n\nvar sqrDist = squaredDistance;\n/**\n * Alias for {@link vec2.squaredLength}\n * @function\n */\n\nvar sqrLen = squaredLength;\n/**\n * Perform some operation over an array of vec2s.\n *\n * @param {Array} a the array of vectors to iterate over\n * @param {Number} stride Number of elements between the start of each vec2. If 0 assumes tightly packed\n * @param {Number} offset Number of elements to skip at the beginning of the array\n * @param {Number} count Number of vec2s to iterate over. If 0 iterates over entire array\n * @param {Function} fn Function to call for each vector in the array\n * @param {Object} [arg] additional argument to pass to fn\n * @returns {Array} a\n * @function\n */\n\nvar forEach = function () {\n var vec = create();\n return function (a, stride, offset, count, fn, arg) {\n var i, l;\n\n if (!stride) {\n stride = 2;\n }\n\n if (!offset) {\n offset = 0;\n }\n\n if (count) {\n l = Math.min(count * stride + offset, a.length);\n } else {\n l = a.length;\n }\n\n for (i = offset; i < l; i += stride) {\n vec[0] = a[i];\n vec[1] = a[i + 1];\n fn(vec, vec, arg);\n a[i] = vec[0];\n a[i + 1] = vec[1];\n }\n\n return a;\n };\n}();//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZ2wtbWF0cml4L2VzbS92ZWMyLmpzPzY3MTEiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUF3QztBQUN4QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLEtBQUs7QUFDbEI7O0FBRU87QUFDUCxnQkFBZ0IsNkRBQW1COztBQUVuQyxNQUFNLDZEQUFtQjtBQUN6QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsYUFBYTtBQUN4QixhQUFhLEtBQUs7QUFDbEI7O0FBRU87QUFDUCxnQkFBZ0IsNkRBQW1CO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixhQUFhLEtBQUs7QUFDbEI7O0FBRU87QUFDUCxnQkFBZ0IsNkRBQW1CO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsYUFBYTtBQUN4QixhQUFhLEtBQUs7QUFDbEI7O0FBRU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsS0FBSztBQUNsQjs7QUFFTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsYUFBYTtBQUN4QixXQUFXLGFBQWE7QUFDeEIsYUFBYSxLQUFLO0FBQ2xCOztBQUVPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxhQUFhO0FBQ3hCLFdBQVcsYUFBYTtBQUN4QixhQUFhLEtBQUs7QUFDbEI7O0FBRU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLGFBQWE7QUFDeEIsV0FBVyxhQUFhO0FBQ3hCLGFBQWEsS0FBSztBQUNsQjs7QUFFTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsYUFBYTtBQUN4QixXQUFXLGFBQWE7QUFDeEIsYUFBYSxLQUFLO0FBQ2xCOztBQUVPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxhQUFhO0FBQ3hCLGFBQWEsS0FBSztBQUNsQjs7QUFFTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsYUFBYTtBQUN4QixhQUFhLEtBQUs7QUFDbEI7O0FBRU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLGFBQWE7QUFDeEIsV0FBVyxhQUFhO0FBQ3hCLGFBQWEsS0FBSztBQUNsQjs7QUFFTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsYUFBYTtBQUN4QixXQUFXLGFBQWE7QUFDeEIsYUFBYSxLQUFLO0FBQ2xCOztBQUVPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxhQUFhO0FBQ3hCLGFBQWEsS0FBSztB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ZDtBQUNBOztBQUVPO0FBQ1A7QUFDQSxjQUFjO0FBQ2Q7QUFDQTs7QUFFTztBQUNQO0FBQ0E7QUFDQTtBQUNBLFdBQVcsTUFBTTtBQUNqQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixXQUFXLFNBQVM7QUFDcEIsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsTUFBTTtBQUNuQjtBQUNBOztBQUVPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBLG9CQUFvQixPQUFPO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsQ0FBQyIsImZpbGUiOiI4MS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGdsTWF0cml4IGZyb20gXCIuL2NvbW1vbi5qc1wiO1xuLyoqXG4gKiAyIERpbWVuc2lvbmFsIFZlY3RvclxuICogQG1vZHVsZSB2ZWMyXG4gKi9cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3LCBlbXB0eSB2ZWMyXG4gKlxuICogQHJldHVybnMge3ZlYzJ9IGEgbmV3IDJEIHZlY3RvclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGUoKSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSgyKTtcblxuICBpZiAoZ2xNYXRyaXguQVJSQVlfVFlQRSAhPSBGbG9hdDMyQXJyYXkpIHtcbiAgICBvdXRbMF0gPSAwO1xuICAgIG91dFsxXSA9IDA7XG4gIH1cblxuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IHZlYzIgaW5pdGlhbGl6ZWQgd2l0aCB2YWx1ZXMgZnJvbSBhbiBleGlzdGluZyB2ZWN0b3JcbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB2ZWN0b3IgdG8gY2xvbmVcbiAqIEByZXR1cm5zIHt2ZWMyfSBhIG5ldyAyRCB2ZWN0b3JcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY2xvbmUoYSkge1xuICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoMik7XG4gIG91dFswXSA9IGFbMF07XG4gIG91dFsxXSA9IGFbMV07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgdmVjMiBpbml0aWFsaXplZCB3aXRoIHRoZSBnaXZlbiB2YWx1ZXNcbiAqXG4gKiBAcGFyYW0ge051bWJlcn0geCBYIGNvbXBvbmVudFxuICogQHBhcmFtIHtOdW1iZXJ9IHkgWSBjb21wb25lbnRcbiAqIEByZXR1cm5zIHt2ZWMyfSBhIG5ldyAyRCB2ZWN0b3JcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVZhbHVlcyh4LCB5KSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSgyKTtcbiAgb3V0WzBdID0geDtcbiAgb3V0WzFdID0geTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ29weSB0aGUgdmFsdWVzIGZyb20gb25lIHZlYzIgdG8gYW5vdGhlclxuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB0aGUgc291cmNlIHZlY3RvclxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjb3B5KG91dCwgYSkge1xuICBvdXRbMF0gPSBhWzBdO1xuICBvdXRbMV0gPSBhWzFdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBTZXQgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWMyIHRvIHRoZSBnaXZlbiB2YWx1ZXNcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtOdW1iZXJ9IHggWCBjb21wb25lbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB5IFkgY29tcG9uZW50XG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNldChvdXQsIHgsIHkpIHtcbiAgb3V0WzBdID0geDtcbiAgb3V0WzFdID0geTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQWRkcyB0d28gdmVjMidzXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gYWRkKG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdICsgYlswXTtcbiAgb3V0WzFdID0gYVsxXSArIGJbMV07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFN1YnRyYWN0cyB2ZWN0b3IgYiBmcm9tIHZlY3RvciBhXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc3VidHJhY3Qob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gLSBiWzBdO1xuICBvdXRbMV0gPSBhWzFdIC0gYlsxXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogTXVsdGlwbGllcyB0d28gdmVjMidzXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbXVsdGlwbHkob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gKiBiWzBdO1xuICBvdXRbMV0gPSBhWzFdICogYlsxXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogRGl2aWRlcyB0d28gdmVjMidzXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZGl2aWRlKG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdIC8gYlswXTtcbiAgb3V0WzFdID0gYVsxXSAvIGJbMV07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIE1hdGguY2VpbCB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzJcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdmVjdG9yIHRvIGNlaWxcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY2VpbChvdXQsIGEpIHtcbiAgb3V0WzBdID0gTWF0aC5jZWlsKGFbMF0pO1xuICBvdXRbMV0gPSBNYXRoLmNlaWwoYVsxXSk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIE1hdGguZmxvb3IgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWMyXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHZlY3RvciB0byBmbG9vclxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmbG9vcihvdXQsIGEpIHtcbiAgb3V0WzBdID0gTWF0aC5mbG9vcihhWzBdKTtcbiAgb3V0WzFdID0gTWF0aC5mbG9vcihhWzFdKTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogUmV0dXJucyB0aGUgbWluaW11bSBvZiB0d28gdmVjMidzXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbWluKG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBNYXRoLm1pbihhWzBdLCBiWzBdKTtcbiAgb3V0WzFdID0gTWF0aC5taW4oYVsxXSwgYlsxXSk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFJldHVybnMgdGhlIG1heGltdW0gb2YgdHdvIHZlYzInc1xuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG1heChvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gTWF0aC5tYXgoYVswXSwgYlswXSk7XG4gIG91dFsxXSA9IE1hdGgubWF4KGFbMV0sIGJbMV0pO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBNYXRoLnJvdW5kIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjMlxuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB2ZWN0b3IgdG8gcm91bmRcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcm91bmQob3V0LCBhKSB7XG4gIG91dFswXSA9IE1hdGgucm91bmQoYVswXSk7XG4gIG91dFsxXSA9IE1hdGgucm91bmQoYVsxXSk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFNjYWxlcyBhIHZlYzIgYnkgYSBzY2FsYXIgbnVtYmVyXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHRoZSB2ZWN0b3IgdG8gc2NhbGVcbiAqIEBwYXJhbSB7TnVtYmVyfSBiIGFtb3VudCB0byBzY2FsZSB0aGUgdmVjdG9yIGJ5XG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNjYWxlKG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdICogYjtcbiAgb3V0WzFdID0gYVsxXSAqIGI7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIEFkZHMgdHdvIHZlYzIncyBhZnRlciBzY2FsaW5nIHRoZSBzZWNvbmQgb3BlcmFuZCBieSBhIHNjYWxhciB2YWx1ZVxuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcGFyYW0ge051bWJlcn0gc2NhbGUgdGhlIGFtb3VudCB0byBzY2FsZSBiIGJ5IGJlZm9yZSBhZGRpbmdcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc2NhbGVBbmRBZGQob3V0LCBhLCBiLCBzY2FsZSkge1xuICBvdXRbMF0gPSBhWzBdICsgYlswXSAqIHNjYWxlO1xuICBvdXRbMV0gPSBhWzFdICsgYlsxXSAqIHNjYWxlO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBldWNsaWRpYW4gZGlzdGFuY2UgYmV0d2VlbiB0d28gdmVjMidzXG4gKlxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge051bWJlcn0gZGlzdGFuY2UgYmV0d2VlbiBhIGFuZCBiXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGRpc3RhbmNlKGEsIGIpIHtcbiAgdmFyIHggPSBiWzBdIC0gYVswXSxcbiAgICAgIHkgPSBiWzFdIC0gYVsxXTtcbiAgcmV0dXJuIE1hdGguaHlwb3QoeCwgeSk7XG59XG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIHNxdWFyZWQgZXVjbGlkaWFuIGRpc3RhbmNlIGJldHdlZW4gdHdvIHZlYzInc1xuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IHNxdWFyZWQgZGlzdGFuY2UgYmV0d2VlbiBhIGFuZCBiXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNxdWFyZWREaXN0YW5jZShhLCBiKSB7XG4gIHZhciB4ID0gYlswXSAtIGFbMF0sXG4gICAgICB5ID0gYlsxXSAtIGFbMV07XG4gIHJldHVybiB4ICogeCArIHkgKiB5O1xufVxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBsZW5ndGggb2YgYSB2ZWMyXG4gKlxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdmVjdG9yIHRvIGNhbGN1bGF0ZSBsZW5ndGggb2ZcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGxlbmd0aCBvZiBhXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGxlbmd0aChhKSB7XG4gIHZhciB4ID0gYVswXSxcbiAgICAgIHkgPSBhWzFdO1xuICByZXR1cm4gTWF0aC5oeXBvdCh4LCB5KTtcbn1cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgc3F1YXJlZCBsZW5ndGggb2YgYSB2ZWMyXG4gKlxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdmVjdG9yIHRvIGNhbGN1bGF0ZSBzcXVhcmVkIGxlbmd0aCBvZlxuICogQHJldHVybnMge051bWJlcn0gc3F1YXJlZCBsZW5ndGggb2YgYVxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzcXVhcmVkTGVuZ3RoKGEpIHtcbiAgdmFyIHggPSBhWzBdLFxuICAgICAgeSA9IGFbMV07XG4gIHJldHVybiB4ICogeCArIHkgKiB5O1xufVxuLyoqXG4gKiBOZWdhdGVzIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjMlxuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB2ZWN0b3IgdG8gbmVnYXRlXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG5lZ2F0ZShvdXQsIGEpIHtcbiAgb3V0WzBdID0gLWFbMF07XG4gIG91dFsxXSA9IC1hWzFdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBSZXR1cm5zIHRoZSBpbnZlcnNlIG9mIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjMlxuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB2ZWN0b3IgdG8gaW52ZXJ0XG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGludmVyc2Uob3V0LCBhKSB7XG4gIG91dFswXSA9IDEuMCAvIGFbMF07XG4gIG91dFsxXSA9IDEuMCAvIGFbMV07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIE5vcm1hbGl6ZSBhIHZlYzJcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdmVjdG9yIHRvIG5vcm1hbGl6ZVxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemUob3V0LCBhKSB7XG4gIHZhciB4ID0gYVswXSxcbiAgICAgIHkgPSBhWzFdO1xuICB2YXIgbGVuID0geCAqIHggKyB5ICogeTtcblxuICBpZiAobGVuID4gMCkge1xuICAgIC8vVE9ETzogZXZhbHVhdGUgdXNlIG9mIGdsbV9pbnZzcXJ0IGhlcmU/XG4gICAgbGVuID0gMSAvIE1hdGguc3FydChsZW4pO1xuICB9XG5cbiAgb3V0WzBdID0gYVswXSAqIGxlbjtcbiAgb3V0WzFdID0gYVsxXSAqIGxlbjtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgZG90IHByb2R1Y3Qgb2YgdHdvIHZlYzInc1xuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGRvdCBwcm9kdWN0IG9mIGEgYW5kIGJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZG90KGEsIGIpIHtcbiAgcmV0dXJuIGFbMF0gKiBiWzBdICsgYVsxXSAqIGJbMV07XG59XG4vKipcbiAqIENvbXB1dGVzIHRoZSBjcm9zcyBwcm9kdWN0IG9mIHR3byB2ZWMyJ3NcbiAqIE5vdGUgdGhhdCB0aGUgY3Jvc3MgcHJvZHVjdCBtdXN0IGJ5IGRlZmluaXRpb24gcHJvZHVjZSBhIDNEIHZlY3RvclxuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNyb3NzKG91dCwgYSwgYikge1xuICB2YXIgeiA9IGFbMF0gKiBiWzFdIC0gYVsxXSAqIGJbMF07XG4gIG91dFswXSA9IG91dFsxXSA9IDA7XG4gIG91dFsyXSA9IHo7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFBlcmZvcm1zIGEgbGluZWFyIGludGVycG9sYXRpb24gYmV0d2VlbiB0d28gdmVjMidzXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEBwYXJhbSB7TnVtYmVyfSB0IGludGVycG9sYXRpb24gYW1vdW50LCBpbiB0aGUgcmFuZ2UgWzAtMV0sIGJldHdlZW4gdGhlIHR3byBpbnB1dHNcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbGVycChvdXQsIGEsIGIsIHQpIHtcbiAgdmFyIGF4ID0gYVswXSxcbiAgICAgIGF5ID0gYVsxXTtcbiAgb3V0WzBdID0gYXggKyB0ICogKGJbMF0gLSBheCk7XG4gIG91dFsxXSA9IGF5ICsgdCAqIChiWzFdIC0gYXkpO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBHZW5lcmF0ZXMgYSByYW5kb20gdmVjdG9yIHdpdGggdGhlIGdpdmVuIHNjYWxlXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7TnVtYmVyfSBbc2NhbGVdIExlbmd0aCBvZiB0aGUgcmVzdWx0aW5nIHZlY3Rvci4gSWYgb21taXR0ZWQsIGEgdW5pdCB2ZWN0b3Igd2lsbCBiZSByZXR1cm5lZFxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByYW5kb20ob3V0LCBzY2FsZSkge1xuICBzY2FsZSA9IHNjYWxlIHx8IDEuMDtcbiAgdmFyIHIgPSBnbE1hdHJpeC5SQU5ET00oKSAqIDIuMCAqIE1hdGguUEk7XG4gIG91dFswXSA9IE1hdGguY29zKHIpICogc2NhbGU7XG4gIG91dFsxXSA9IE1hdGguc2luKHIpICogc2NhbGU7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFRyYW5zZm9ybXMgdGhlIHZlYzIgd2l0aCBhIG1hdDJcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdGhlIHZlY3RvciB0byB0cmFuc2Zvcm1cbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyfSBtIG1hdHJpeCB0byB0cmFuc2Zvcm0gd2l0aFxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1NYXQyKG91dCwgYSwgbSkge1xuICB2YXIgeCA9IGFbMF0sXG4gICAgICB5ID0gYVsxXTtcbiAgb3V0WzBdID0gbVswXSAqIHggKyBtWzJdICogeTtcbiAgb3V0WzFdID0gbVsxXSAqIHggKyBtWzNdICogeTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogVHJhbnNmb3JtcyB0aGUgdmVjMiB3aXRoIGEgbWF0MmRcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdGhlIHZlY3RvciB0byB0cmFuc2Zvcm1cbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyZH0gbSBtYXRyaXggdG8gdHJhbnNmb3JtIHdpdGhcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNmb3JtTWF0MmQob3V0LCBhLCBtKSB7XG4gIHZhciB4ID0gYVswXSxcbiAgICAgIHkgPSBhWzFdO1xuICBvdXRbMF0gPSBtWzBdICogeCArIG1bMl0gKiB5ICsgbVs0XTtcbiAgb3V0WzFdID0gbVsxXSAqIHggKyBtWzNdICogeSArIG1bNV07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFRyYW5zZm9ybXMgdGhlIHZlYzIgd2l0aCBhIG1hdDNcbiAqIDNyZCB2ZWN0b3IgY29tcG9uZW50IGlzIGltcGxpY2l0bHkgJzEnXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHRoZSB2ZWN0b3IgdG8gdHJhbnNmb3JtXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0M30gbSBtYXRyaXggdG8gdHJhbnNmb3JtIHdpdGhcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNmb3JtTWF0MyhvdXQsIGEsIG0pIHtcbiAgdmFyIHggPSBhWzBdLFxuICAgICAgeSA9IGFbMV07XG4gIG91dFswXSA9IG1bMF0gKiB4ICsgbVszXSAqIHkgKyBtWzZdO1xuICBvdXRbMV0gPSBtWzFdICogeCArIG1bNF0gKiB5ICsgbVs3XTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogVHJhbnNmb3JtcyB0aGUgdmVjMiB3aXRoIGEgbWF0NFxuICogM3JkIHZlY3RvciBjb21wb25lbnQgaXMgaW1wbGljaXRseSAnMCdcbiAqIDR0aCB2ZWN0b3IgY29tcG9uZW50IGlzIGltcGxpY2l0bHkgJzEnXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHRoZSB2ZWN0b3IgdG8gdHJhbnNmb3JtXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gbSBtYXRyaXggdG8gdHJhbnNmb3JtIHdpdGhcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNmb3JtTWF0NChvdXQsIGEsIG0pIHtcbiAgdmFyIHggPSBhWzBdO1xuICB2YXIgeSA9IGFbMV07XG4gIG91dFswXSA9IG1bMF0gKiB4ICsgbVs0XSAqIHkgKyBtWzEyXTtcbiAgb3V0WzFdID0gbVsxXSAqIHggKyBtWzVdICogeSArIG1bMTNdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBSb3RhdGUgYSAyRCB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IFRoZSByZWNlaXZpbmcgdmVjMlxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgVGhlIHZlYzIgcG9pbnQgdG8gcm90YXRlXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYiBUaGUgb3JpZ2luIG9mIHRoZSByb3RhdGlvblxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCBUaGUgYW5nbGUgb2Ygcm90YXRpb24gaW4gcmFkaWFuc1xuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByb3RhdGUob3V0LCBhLCBiLCByYWQpIHtcbiAgLy9UcmFuc2xhdGUgcG9pbnQgdG8gdGhlIG9yaWdpblxuICB2YXIgcDAgPSBhWzBdIC0gYlswXSxcbiAgICAgIHAxID0gYVsxXSAtIGJbMV0sXG4gICAgICBzaW5DID0gTWF0aC5zaW4ocmFkKSxcbiAgICAgIGNvc0MgPSBNYXRoLmNvcyhyYWQpOyAvL3BlcmZvcm0gcm90YXRpb24gYW5kIHRyYW5zbGF0ZSB0byBjb3JyZWN0IHBvc2l0aW9uXG5cbiAgb3V0WzBdID0gcDAgKiBjb3NDIC0gcDEgKiBzaW5DICsgYlswXTtcbiAgb3V0WzFdID0gcDAgKiBzaW5DICsgcDEgKiBjb3NDICsgYlsxXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogR2V0IHRoZSBhbmdsZSBiZXR3ZWVuIHR3byAyRCB2ZWN0b3JzXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSBUaGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGIgVGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBUaGUgYW5nbGUgaW4gcmFkaWFuc1xuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBhbmdsZShhLCBiKSB7XG4gIHZhciB4MSA9IGFbMF0sXG4gICAgICB5MSA9IGFbMV0sXG4gICAgICB4MiA9IGJbMF0sXG4gICAgICB5MiA9IGJbMV0sXG4gICAgICAvLyBtYWcgaXMgdGhlIHByb2R1Y3Qgb2YgdGhlIG1hZ25pdHVkZXMgb2YgYSBhbmQgYlxuICBtYWcgPSBNYXRoLnNxcnQoeDEgKiB4MSArIHkxICogeTEpICogTWF0aC5zcXJ0KHgyICogeDIgKyB5MiAqIHkyKSxcbiAgICAgIC8vIG1hZyAmJi4uIHNob3J0IGNpcmN1aXRzIGlmIG1hZyA9PSAwXG4gIGNvc2luZSA9IG1hZyAmJiAoeDEgKiB4MiArIHkxICogeTIpIC8gbWFnOyAvLyBNYXRoLm1pbihNYXRoLm1heChjb3NpbmUsIC0xKSwgMSkgY2xhbXBzIHRoZSBjb3NpbmUgYmV0d2VlbiAtMSBhbmQgMVxuXG4gIHJldHVybiBNYXRoLmFjb3MoTWF0aC5taW4oTWF0aC5tYXgoY29zaW5lLCAtMSksIDEpKTtcbn1cbi8qKlxuICogU2V0IHRoZSBjb21wb25lbnRzIG9mIGEgdmVjMiB0byB6ZXJvXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gemVybyhvdXQpIHtcbiAgb3V0WzBdID0gMC4wO1xuICBvdXRbMV0gPSAwLjA7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSB2ZWN0b3JcbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB2ZWN0b3IgdG8gcmVwcmVzZW50IGFzIGEgc3RyaW5nXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHZlY3RvclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzdHIoYSkge1xuICByZXR1cm4gXCJ2ZWMyKFwiICsgYVswXSArIFwiLCBcIiArIGFbMV0gKyBcIilcIjtcbn1cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgdmVjdG9ycyBleGFjdGx5IGhhdmUgdGhlIHNhbWUgZWxlbWVudHMgaW4gdGhlIHNhbWUgcG9zaXRpb24gKHdoZW4gY29tcGFyZWQgd2l0aCA9PT0pXG4gKlxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgVGhlIGZpcnN0IHZlY3Rvci5cbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBiIFRoZSBzZWNvbmQgdmVjdG9yLlxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZlY3RvcnMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGV4YWN0RXF1YWxzKGEsIGIpIHtcbiAgcmV0dXJuIGFbMF0gPT09IGJbMF0gJiYgYVsxXSA9PT0gYlsxXTtcbn1cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgdmVjdG9ycyBoYXZlIGFwcHJveGltYXRlbHkgdGhlIHNhbWUgZWxlbWVudHMgaW4gdGhlIHNhbWUgcG9zaXRpb24uXG4gKlxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgVGhlIGZpcnN0IHZlY3Rvci5cbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBiIFRoZSBzZWNvbmQgdmVjdG9yLlxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZlY3RvcnMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGVxdWFscyhhLCBiKSB7XG4gIHZhciBhMCA9IGFbMF0sXG4gICAgICBhMSA9IGFbMV07XG4gIHZhciBiMCA9IGJbMF0sXG4gICAgICBiMSA9IGJbMV07XG4gIHJldHVybiBNYXRoLmFicyhhMCAtIGIwKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMCksIE1hdGguYWJzKGIwKSkgJiYgTWF0aC5hYnMoYTEgLSBiMSkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTEpLCBNYXRoLmFicyhiMSkpO1xufVxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzIubGVuZ3RofVxuICogQGZ1bmN0aW9uXG4gKi9cblxuZXhwb3J0IHZhciBsZW4gPSBsZW5ndGg7XG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMi5zdWJ0cmFjdH1cbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCB2YXIgc3ViID0gc3VidHJhY3Q7XG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMi5tdWx0aXBseX1cbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCB2YXIgbXVsID0gbXVsdGlwbHk7XG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMi5kaXZpZGV9XG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgdmFyIGRpdiA9IGRpdmlkZTtcbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMyLmRpc3RhbmNlfVxuICogQGZ1bmN0aW9uXG4gKi9cblxuZXhwb3J0IHZhciBkaXN0ID0gZGlzdGFuY2U7XG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMi5zcXVhcmVkRGlzdGFuY2V9XG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgdmFyIHNxckRpc3QgPSBzcXVhcmVkRGlzdGFuY2U7XG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMi5zcXVhcmVkTGVuZ3RofVxuICogQGZ1bmN0aW9uXG4gKi9cblxuZXhwb3J0IHZhciBzcXJMZW4gPSBzcXVhcmVkTGVuZ3RoO1xuLyoqXG4gKiBQZXJmb3JtIHNvbWUgb3BlcmF0aW9uIG92ZXIgYW4gYXJyYXkgb2YgdmVjMnMuXG4gKlxuICogQHBhcmFtIHtBcnJheX0gYSB0aGUgYXJyYXkgb2YgdmVjdG9ycyB0byBpdGVyYXRlIG92ZXJcbiAqIEBwYXJhbSB7TnVtYmVyfSBzdHJpZGUgTnVtYmVyIG9mIGVsZW1lbnRzIGJldHdlZW4gdGhlIHN0YXJ0IG9mIGVhY2ggdmVjMi4gSWYgMCBhc3N1bWVzIHRpZ2h0bHkgcGFja2VkXG4gKiBAcGFyYW0ge051bWJlcn0gb2Zmc2V0IE51bWJlciBvZiBlbGVtZW50cyB0byBza2lwIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGFycmF5XG4gKiBAcGFyYW0ge051bWJlcn0gY291bnQgTnVtYmVyIG9mIHZlYzJzIHRvIGl0ZXJhdGUgb3Zlci4gSWYgMCBpdGVyYXRlcyBvdmVyIGVudGlyZSBhcnJheVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gRnVuY3Rpb24gdG8gY2FsbCBmb3IgZWFjaCB2ZWN0b3IgaW4gdGhlIGFycmF5XG4gKiBAcGFyYW0ge09iamVjdH0gW2FyZ10gYWRkaXRpb25hbCBhcmd1bWVudCB0byBwYXNzIHRvIGZuXG4gKiBAcmV0dXJucyB7QXJyYXl9IGFcbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCB2YXIgZm9yRWFjaCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHZlYyA9IGNyZWF0ZSgpO1xuICByZXR1cm4gZnVuY3Rpb24gKGEsIHN0cmlkZSwgb2Zmc2V0LCBjb3VudCwgZm4sIGFyZykge1xuICAgIHZhciBpLCBsO1xuXG4gICAgaWYgKCFzdHJpZGUpIHtcbiAgICAgIHN0cmlkZSA9IDI7XG4gICAgfVxuXG4gICAgaWYgKCFvZmZzZXQpIHtcbiAgICAgIG9mZnNldCA9IDA7XG4gICAgfVxuXG4gICAgaWYgKGNvdW50KSB7XG4gICAgICBsID0gTWF0aC5taW4oY291bnQgKiBzdHJpZGUgKyBvZmZzZXQsIGEubGVuZ3RoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbCA9IGEubGVuZ3RoO1xuICAgIH1cblxuICAgIGZvciAoaSA9IG9mZnNldDsgaSA8IGw7IGkgKz0gc3RyaWRlKSB7XG4gICAgICB2ZWNbMF0gPSBhW2ldO1xuICAgICAgdmVjWzFdID0gYVtpICsgMV07XG4gICAgICBmbih2ZWMsIHZlYywgYXJnKTtcbiAgICAgIGFbaV0gPSB2ZWNbMF07XG4gICAgICBhW2kgKyAxXSA9IHZlY1sxXTtcbiAgICB9XG5cbiAgICByZXR1cm4gYTtcbiAgfTtcbn0oKTsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///81\n')},function(module,exports){eval("var containers = []; // will store container HTMLElement references\nvar styleElements = []; // will store {prepend: HTMLElement, append: HTMLElement}\n\nvar usage = 'insert-css: You need to provide a CSS string. Usage: insertCss(cssString[, options]).';\n\nfunction insertCss(css, options) {\n options = options || {};\n\n if (css === undefined) {\n throw new Error(usage);\n }\n\n var position = options.prepend === true ? 'prepend' : 'append';\n var container = options.container !== undefined ? options.container : document.querySelector('head');\n var containerId = containers.indexOf(container);\n\n // first time we see this container, create the necessary entries\n if (containerId === -1) {\n containerId = containers.push(container) - 1;\n styleElements[containerId] = {};\n }\n\n // try to get the correponding container + position styleElement, create it otherwise\n var styleElement;\n\n if (styleElements[containerId] !== undefined && styleElements[containerId][position] !== undefined) {\n styleElement = styleElements[containerId][position];\n } else {\n styleElement = styleElements[containerId][position] = createStyleElement();\n\n if (position === 'prepend') {\n container.insertBefore(styleElement, container.childNodes[0]);\n } else {\n container.appendChild(styleElement);\n }\n }\n\n // strip potential UTF-8 BOM if css was read from a file\n if (css.charCodeAt(0) === 0xFEFF) { css = css.substr(1, css.length); }\n\n // actually add the stylesheet\n if (styleElement.styleSheet) {\n styleElement.styleSheet.cssText += css\n } else {\n styleElement.textContent += css;\n }\n\n return styleElement;\n};\n\nfunction createStyleElement() {\n var styleElement = document.createElement('style');\n styleElement.setAttribute('type', 'text/css');\n return styleElement;\n}\n\nmodule.exports = insertCss;\nmodule.exports.insertCss = insertCss;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaW5zZXJ0LWNzcy9pbmRleC5qcz8xYWVmIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLG9CQUFvQjtBQUNwQix1QkFBdUIsZ0JBQWdCOztBQUV2Qzs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSx1Q0FBdUMsaUNBQWlDOztBQUV4RTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSIsImZpbGUiOiI4Mi5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBjb250YWluZXJzID0gW107IC8vIHdpbGwgc3RvcmUgY29udGFpbmVyIEhUTUxFbGVtZW50IHJlZmVyZW5jZXNcbnZhciBzdHlsZUVsZW1lbnRzID0gW107IC8vIHdpbGwgc3RvcmUge3ByZXBlbmQ6IEhUTUxFbGVtZW50LCBhcHBlbmQ6IEhUTUxFbGVtZW50fVxuXG52YXIgdXNhZ2UgPSAnaW5zZXJ0LWNzczogWW91IG5lZWQgdG8gcHJvdmlkZSBhIENTUyBzdHJpbmcuIFVzYWdlOiBpbnNlcnRDc3MoY3NzU3RyaW5nWywgb3B0aW9uc10pLic7XG5cbmZ1bmN0aW9uIGluc2VydENzcyhjc3MsIG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgIGlmIChjc3MgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IodXNhZ2UpO1xuICAgIH1cblxuICAgIHZhciBwb3NpdGlvbiA9IG9wdGlvbnMucHJlcGVuZCA9PT0gdHJ1ZSA/ICdwcmVwZW5kJyA6ICdhcHBlbmQnO1xuICAgIHZhciBjb250YWluZXIgPSBvcHRpb25zLmNvbnRhaW5lciAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5jb250YWluZXIgOiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdoZWFkJyk7XG4gICAgdmFyIGNvbnRhaW5lcklkID0gY29udGFpbmVycy5pbmRleE9mKGNvbnRhaW5lcik7XG5cbiAgICAvLyBmaXJzdCB0aW1lIHdlIHNlZSB0aGlzIGNvbnRhaW5lciwgY3JlYXRlIHRoZSBuZWNlc3NhcnkgZW50cmllc1xuICAgIGlmIChjb250YWluZXJJZCA9PT0gLTEpIHtcbiAgICAgICAgY29udGFpbmVySWQgPSBjb250YWluZXJzLnB1c2goY29udGFpbmVyKSAtIDE7XG4gICAgICAgIHN0eWxlRWxlbWVudHNbY29udGFpbmVySWRdID0ge307XG4gICAgfVxuXG4gICAgLy8gdHJ5IHRvIGdldCB0aGUgY29ycmVwb25kaW5nIGNvbnRhaW5lciArIHBvc2l0aW9uIHN0eWxlRWxlbWVudCwgY3JlYXRlIGl0IG90aGVyd2lzZVxuICAgIHZhciBzdHlsZUVsZW1lbnQ7XG5cbiAgICBpZiAoc3R5bGVFbGVtZW50c1tjb250YWluZXJJZF0gIT09IHVuZGVmaW5lZCAmJiBzdHlsZUVsZW1lbnRzW2NvbnRhaW5lcklkXVtwb3NpdGlvbl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBzdHlsZUVsZW1lbnQgPSBzdHlsZUVsZW1lbnRzW2NvbnRhaW5lcklkXVtwb3NpdGlvbl07XG4gICAgfSBlbHNlIHtcbiAgICAgICAgc3R5bGVFbGVtZW50ID0gc3R5bGVFbGVtZW50c1tjb250YWluZXJJZF1bcG9zaXRpb25dID0gY3JlYXRlU3R5bGVFbGVtZW50KCk7XG5cbiAgICAgICAgaWYgKHBvc2l0aW9uID09PSAncHJlcGVuZCcpIHtcbiAgICAgICAgICAgIGNvbnRhaW5lci5pbnNlcnRCZWZvcmUoc3R5bGVFbGVtZW50LCBjb250YWluZXIuY2hpbGROb2Rlc1swXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoc3R5bGVFbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIHN0cmlwIHBvdGVudGlhbCBVVEYtOCBCT00gaWYgY3NzIHdhcyByZWFkIGZyb20gYSBmaWxlXG4gICAgaWYgKGNzcy5jaGFyQ29kZUF0KDApID09PSAweEZFRkYpIHsgY3NzID0gY3NzLnN1YnN0cigxLCBjc3MubGVuZ3RoKTsgfVxuXG4gICAgLy8gYWN0dWFsbHkgYWRkIHRoZSBzdHlsZXNoZWV0XG4gICAgaWYgKHN0eWxlRWxlbWVudC5zdHlsZVNoZWV0KSB7XG4gICAgICAgIHN0eWxlRWxlbWVudC5zdHlsZVNoZWV0LmNzc1RleHQgKz0gY3NzXG4gICAgfSBlbHNlIHtcbiAgICAgICAgc3R5bGVFbGVtZW50LnRleHRDb250ZW50ICs9IGNzcztcbiAgICB9XG5cbiAgICByZXR1cm4gc3R5bGVFbGVtZW50O1xufTtcblxuZnVuY3Rpb24gY3JlYXRlU3R5bGVFbGVtZW50KCkge1xuICAgIHZhciBzdHlsZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgIHN0eWxlRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3R5cGUnLCAndGV4dC9jc3MnKTtcbiAgICByZXR1cm4gc3R5bGVFbGVtZW50O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGluc2VydENzcztcbm1vZHVsZS5leHBvcnRzLmluc2VydENzcyA9IGluc2VydENzcztcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///82\n")},function(module,__webpack_exports__,__webpack_require__){"use strict";eval('/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return CopyPass; });\n/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(9);\n/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(15);\n/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _babel_runtime_helpers_initializerDefineProperty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(10);\n/* harmony import */ var _babel_runtime_helpers_initializerDefineProperty__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_initializerDefineProperty__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(6);\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _babel_runtime_helpers_applyDecoratedDescriptor__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(11);\n/* harmony import */ var _babel_runtime_helpers_applyDecoratedDescriptor__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_applyDecoratedDescriptor__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _babel_runtime_helpers_initializerWarningHelper__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(29);\n/* harmony import */ var _babel_runtime_helpers_initializerWarningHelper__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_initializerWarningHelper__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var inversify__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(5);\n/* harmony import */ var inversify__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(inversify__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var _identifier__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(13);\n/* harmony import */ var _gl__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(35);\n/* harmony import */ var _RenderPass__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(51);\n\n\n\n\n\n\n\nvar _dec, _dec2, _dec3, _class, _class2, _descriptor, _descriptor2, _class3, _temp;\n\n\n\n\n/* babel-plugin-inline-import \'../../../services/shader-module/shaders/webgl.copy.frag.glsl\' */\nvar copyFrag = "varying vec2 v_UV;\\n\\nuniform sampler2D u_Texture;\\n\\nvoid main() {\\n gl_FragColor = vec4(texture2D(u_Texture, v_UV));\\n}";\n\n/* babel-plugin-inline-import \'../../../services/shader-module/shaders/webgl.copy.vert.glsl\' */\nvar copyVert = "attribute vec2 a_Position;\\n\\nvarying vec2 v_UV;\\n\\nvoid main() {\\n v_UV = 0.5 * (a_Position + 1.0);\\n gl_Position = vec4(a_Position, 0., 1.);\\n}";\n\n/* babel-plugin-inline-import \'../../../services/shader-module/shaders/webgpu.copy.frag.glsl\' */\nvar copyFragWebGPU = "layout(set = 0, binding = 0) uniform sampler u_TextureSampler;\\nlayout(set = 0, binding = 1) uniform texture2D u_Texture;\\n\\nlayout(location = 0) in vec2 v_UV;\\nlayout(location = 0) out vec4 outColor;\\n\\nvoid main() {\\n outColor = texture(sampler2D(u_Texture, u_TextureSampler), v_UV);\\n}";\n\n/* babel-plugin-inline-import \'../../../services/shader-module/shaders/webgpu.copy.vert.glsl\' */\nvar copyVertWebGPU = "layout(location = 0) in vec2 a_Position;\\nlayout(location = 0) out vec2 v_UV;\\n\\nvoid main() {\\n v_UV = 0.5 * (a_Position + 1.0);\\n gl_Position = vec4(a_Position, 0., 1.);\\n}";\n\n\nvar CopyPass = (_dec = Object(inversify__WEBPACK_IMPORTED_MODULE_6__["injectable"])(), _dec2 = Object(inversify__WEBPACK_IMPORTED_MODULE_6__["inject"])(_identifier__WEBPACK_IMPORTED_MODULE_7__[/* IDENTIFIER */ "a"].RenderEngine), _dec3 = Object(inversify__WEBPACK_IMPORTED_MODULE_6__["inject"])(_identifier__WEBPACK_IMPORTED_MODULE_7__[/* IDENTIFIER */ "a"].ResourcePool), _dec(_class = (_class2 = (_temp = _class3 = function CopyPass() {\n var _this = this;\n\n _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3___default()(this, CopyPass);\n\n _babel_runtime_helpers_initializerDefineProperty__WEBPACK_IMPORTED_MODULE_2___default()(this, "engine", _descriptor, this);\n\n _babel_runtime_helpers_initializerDefineProperty__WEBPACK_IMPORTED_MODULE_2___default()(this, "resourcePool", _descriptor2, this);\n\n this.model = void 0;\n\n this.setup = function (fg, passNode, pass) {\n var renderPass = fg.getPass(_RenderPass__WEBPACK_IMPORTED_MODULE_9__[/* RenderPass */ "a"].IDENTIFIER);\n\n if (renderPass) {\n var output = fg.createRenderTarget(passNode, \'render to screen\', {\n width: 1,\n height: 1\n });\n pass.data = {\n input: passNode.read(renderPass.data.output),\n output: passNode.write(fg, output)\n };\n }\n };\n\n this.execute = /*#__PURE__*/function () {\n var _ref = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee(fg, pass) {\n var _this$engine, createModel, createAttribute, createBuffer, model, resourceNode, framebuffer;\n\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n _this$engine = _this.engine, createModel = _this$engine.createModel, createAttribute = _this$engine.createAttribute, createBuffer = _this$engine.createBuffer;\n\n if (_this.model) {\n _context.next = 6;\n break;\n }\n\n _context.next = 4;\n return createModel({\n vs: _this.engine.supportWebGPU ? copyVertWebGPU : copyVert,\n fs: _this.engine.supportWebGPU ? copyFragWebGPU : copyFrag,\n attributes: {\n // rendering a fullscreen triangle instead of quad\n // @see https://www.saschawillems.de/blog/2016/08/13/vulkan-tutorial-on-rendering-a-fullscreen-quad-without-buffers/\n a_Position: createAttribute({\n buffer: createBuffer({\n data: [-4, -4, 4, -4, 0, 4],\n type: _gl__WEBPACK_IMPORTED_MODULE_8__[/* gl */ "a"].FLOAT\n }),\n size: 2,\n arrayStride: 2 * 4,\n stepMode: \'vertex\',\n attributes: [{\n shaderLocation: 0,\n offset: 0,\n format: \'float2\'\n }]\n })\n },\n uniforms: {\n // @ts-ignore\n u_Texture: null\n },\n depth: {\n enable: false\n },\n count: 3,\n blend: {\n // copy pass 需要混合\n // enable: this.getName() === \'copy\',\n enable: true\n }\n });\n\n case 4:\n model = _context.sent;\n _this.model = model;\n\n case 6:\n // 实例化资源\n resourceNode = fg.getResourceNode(pass.data.input);\n framebuffer = _this.resourcePool.getOrCreateResource(resourceNode.resource);\n\n _this.engine.useFramebuffer(null, function () {\n _this.engine.clear({\n framebuffer: null,\n color: [0, 0, 0, 0],\n depth: 1,\n stencil: 0\n });\n\n _this.model.draw({\n uniforms: {\n u_Texture: framebuffer // u_ViewportSize: [width, height],\n\n }\n });\n });\n\n case 9:\n case "end":\n return _context.stop();\n }\n }\n }, _callee);\n }));\n\n return function (_x, _x2) {\n return _ref.apply(this, arguments);\n };\n }();\n\n this.tearDown = function () {\n _this.model = undefined;\n };\n}, _class3.IDENTIFIER = \'Copy Pass\', _temp), (_descriptor = _babel_runtime_helpers_applyDecoratedDescriptor__WEBPACK_IMPORTED_MODULE_4___default()(_class2.prototype, "engine", [_dec2], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n}), _descriptor2 = _babel_runtime_helpers_applyDecoratedDescriptor__WEBPACK_IMPORTED_MODULE_4___default()(_class2.prototype, "resourcePool", [_dec3], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n})), _class2)) || _class);\n//# sourceMappingURL=CopyPass.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy13ZWJncHUtY29yZS9lcy9jb21wb25lbnRzL3JlbmRlcmVyL3Bhc3Nlcy9Db3B5UGFzcy5qcz84MzUwIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUE2RDtBQUNXO0FBQ2tCO0FBQ3RCO0FBQ29CO0FBQ0E7O0FBRXhGOztBQUUrQztBQUNFOztBQUVqRDtBQUNBLGtDQUFrQyxnQ0FBZ0MsaUJBQWlCLG9EQUFvRCxHQUFHOztBQUUxSTtBQUNBLDBDQUEwQyxzQkFBc0IsaUJBQWlCLG9DQUFvQywyQ0FBMkMsR0FBRzs7QUFFbks7QUFDQSxvRkFBb0YsMkRBQTJELHNDQUFzQyx5Q0FBeUMsaUJBQWlCLHFFQUFxRSxHQUFHOztBQUV2VDtBQUNBLDhEQUE4RCxxQ0FBcUMsaUJBQWlCLG9DQUFvQywyQ0FBMkMsR0FBRztBQUMzSztBQUNlO0FBQ25DLHVCQUF1Qiw0REFBVSxZQUFZLHdEQUFNLENBQUMsOERBQVUsd0JBQXdCLHdEQUFNLENBQUMsOERBQVU7QUFDOUc7O0FBRUEsRUFBRSw0RUFBZTs7QUFFakIsRUFBRSx1RkFBMEI7O0FBRTVCLEVBQUUsdUZBQTBCOztBQUU1Qjs7QUFFQTtBQUNBLGdDQUFnQyw4REFBVTs7QUFFMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZUFBZSw4RUFBaUIsZUFBZSxpRUFBbUI7QUFDbEU7O0FBRUEsYUFBYSxpRUFBbUI7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsOENBQUU7QUFDOUIscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCLG1CQUFtQjtBQUNuQixpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTs7QUFFZjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCOztBQUVqQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxpQkFBaUI7QUFDakIsZUFBZTs7QUFFZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxDQUFDLDJEQUEyRCxzRkFBeUI7QUFDckY7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLGtCQUFrQixzRkFBeUI7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QiLCJmaWxlIjoiODMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgX3JlZ2VuZXJhdG9yUnVudGltZSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvcmVnZW5lcmF0b3JcIjtcbmltcG9ydCBfYXN5bmNUb0dlbmVyYXRvciBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hc3luY1RvR2VuZXJhdG9yXCI7XG5pbXBvcnQgX2luaXRpYWxpemVyRGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW5pdGlhbGl6ZXJEZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9hcHBseURlY29yYXRlZERlc2NyaXB0b3IgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXBwbHlEZWNvcmF0ZWREZXNjcmlwdG9yXCI7XG5pbXBvcnQgX2luaXRpYWxpemVyV2FybmluZ0hlbHBlciBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbml0aWFsaXplcldhcm5pbmdIZWxwZXJcIjtcblxudmFyIF9kZWMsIF9kZWMyLCBfZGVjMywgX2NsYXNzLCBfY2xhc3MyLCBfZGVzY3JpcHRvciwgX2Rlc2NyaXB0b3IyLCBfY2xhc3MzLCBfdGVtcDtcblxuaW1wb3J0IHsgaW5qZWN0LCBpbmplY3RhYmxlIH0gZnJvbSAnaW52ZXJzaWZ5JztcbmltcG9ydCB7IElERU5USUZJRVIgfSBmcm9tICcuLi8uLi8uLi9pZGVudGlmaWVyJztcblxuLyogYmFiZWwtcGx1Z2luLWlubGluZS1pbXBvcnQgJy4uLy4uLy4uL3NlcnZpY2VzL3NoYWRlci1tb2R1bGUvc2hhZGVycy93ZWJnbC5jb3B5LmZyYWcuZ2xzbCcgKi9cbnZhciBjb3B5RnJhZyA9IFwidmFyeWluZyB2ZWMyIHZfVVY7XFxuXFxudW5pZm9ybSBzYW1wbGVyMkQgdV9UZXh0dXJlO1xcblxcbnZvaWQgbWFpbigpIHtcXG4gIGdsX0ZyYWdDb2xvciA9IHZlYzQodGV4dHVyZTJEKHVfVGV4dHVyZSwgdl9VVikpO1xcbn1cIjtcblxuLyogYmFiZWwtcGx1Z2luLWlubGluZS1pbXBvcnQgJy4uLy4uLy4uL3NlcnZpY2VzL3NoYWRlci1tb2R1bGUvc2hhZGVycy93ZWJnbC5jb3B5LnZlcnQuZ2xzbCcgKi9cbnZhciBjb3B5VmVydCA9IFwiYXR0cmlidXRlIHZlYzIgYV9Qb3NpdGlvbjtcXG5cXG52YXJ5aW5nIHZlYzIgdl9VVjtcXG5cXG52b2lkIG1haW4oKSB7XFxuICB2X1VWID0gMC41ICogKGFfUG9zaXRpb24gKyAxLjApO1xcbiAgZ2xfUG9zaXRpb24gPSB2ZWM0KGFfUG9zaXRpb24sIDAuLCAxLik7XFxufVwiO1xuXG4vKiBiYWJlbC1wbHVnaW4taW5saW5lLWltcG9ydCAnLi4vLi4vLi4vc2VydmljZXMvc2hhZGVyLW1vZHVsZS9zaGFkZXJzL3dlYmdwdS5jb3B5LmZyYWcuZ2xzbCcgKi9cbnZhciBjb3B5RnJhZ1dlYkdQVSA9IFwibGF5b3V0KHNldCA9IDAsIGJpbmRpbmcgPSAwKSB1bmlmb3JtIHNhbXBsZXIgdV9UZXh0dXJlU2FtcGxlcjtcXG5sYXlvdXQoc2V0ID0gMCwgYmluZGluZyA9IDEpIHVuaWZvcm0gdGV4dHVyZTJEIHVfVGV4dHVyZTtcXG5cXG5sYXlvdXQobG9jYXRpb24gPSAwKSBpbiB2ZWMyIHZfVVY7XFxubGF5b3V0KGxvY2F0aW9uID0gMCkgb3V0IHZlYzQgb3V0Q29sb3I7XFxuXFxudm9pZCBtYWluKCkge1xcbiAgb3V0Q29sb3IgPSB0ZXh0dXJlKHNhbXBsZXIyRCh1X1RleHR1cmUsIHVfVGV4dHVyZVNhbXBsZXIpLCB2X1VWKTtcXG59XCI7XG5cbi8qIGJhYmVsLXBsdWdpbi1pbmxpbmUtaW1wb3J0ICcuLi8uLi8uLi9zZXJ2aWNlcy9zaGFkZXItbW9kdWxlL3NoYWRlcnMvd2ViZ3B1LmNvcHkudmVydC5nbHNsJyAqL1xudmFyIGNvcHlWZXJ0V2ViR1BVID0gXCJsYXlvdXQobG9jYXRpb24gPSAwKSBpbiB2ZWMyIGFfUG9zaXRpb247XFxubGF5b3V0KGxvY2F0aW9uID0gMCkgb3V0IHZlYzIgdl9VVjtcXG5cXG52b2lkIG1haW4oKSB7XFxuICB2X1VWID0gMC41ICogKGFfUG9zaXRpb24gKyAxLjApO1xcbiAgZ2xfUG9zaXRpb24gPSB2ZWM0KGFfUG9zaXRpb24sIDAuLCAxLik7XFxufVwiO1xuaW1wb3J0IHsgZ2wgfSBmcm9tICcuLi9nbCc7XG5pbXBvcnQgeyBSZW5kZXJQYXNzIH0gZnJvbSAnLi9SZW5kZXJQYXNzJztcbmV4cG9ydCB2YXIgQ29weVBhc3MgPSAoX2RlYyA9IGluamVjdGFibGUoKSwgX2RlYzIgPSBpbmplY3QoSURFTlRJRklFUi5SZW5kZXJFbmdpbmUpLCBfZGVjMyA9IGluamVjdChJREVOVElGSUVSLlJlc291cmNlUG9vbCksIF9kZWMoX2NsYXNzID0gKF9jbGFzczIgPSAoX3RlbXAgPSBfY2xhc3MzID0gZnVuY3Rpb24gQ29weVBhc3MoKSB7XG4gIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIENvcHlQYXNzKTtcblxuICBfaW5pdGlhbGl6ZXJEZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImVuZ2luZVwiLCBfZGVzY3JpcHRvciwgdGhpcyk7XG5cbiAgX2luaXRpYWxpemVyRGVmaW5lUHJvcGVydHkodGhpcywgXCJyZXNvdXJjZVBvb2xcIiwgX2Rlc2NyaXB0b3IyLCB0aGlzKTtcblxuICB0aGlzLm1vZGVsID0gdm9pZCAwO1xuXG4gIHRoaXMuc2V0dXAgPSBmdW5jdGlvbiAoZmcsIHBhc3NOb2RlLCBwYXNzKSB7XG4gICAgdmFyIHJlbmRlclBhc3MgPSBmZy5nZXRQYXNzKFJlbmRlclBhc3MuSURFTlRJRklFUik7XG5cbiAgICBpZiAocmVuZGVyUGFzcykge1xuICAgICAgdmFyIG91dHB1dCA9IGZnLmNyZWF0ZVJlbmRlclRhcmdldChwYXNzTm9kZSwgJ3JlbmRlciB0byBzY3JlZW4nLCB7XG4gICAgICAgIHdpZHRoOiAxLFxuICAgICAgICBoZWlnaHQ6IDFcbiAgICAgIH0pO1xuICAgICAgcGFzcy5kYXRhID0ge1xuICAgICAgICBpbnB1dDogcGFzc05vZGUucmVhZChyZW5kZXJQYXNzLmRhdGEub3V0cHV0KSxcbiAgICAgICAgb3V0cHV0OiBwYXNzTm9kZS53cml0ZShmZywgb3V0cHV0KVxuICAgICAgfTtcbiAgICB9XG4gIH07XG5cbiAgdGhpcy5leGVjdXRlID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgICB2YXIgX3JlZiA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUoZmcsIHBhc3MpIHtcbiAgICAgIHZhciBfdGhpcyRlbmdpbmUsIGNyZWF0ZU1vZGVsLCBjcmVhdGVBdHRyaWJ1dGUsIGNyZWF0ZUJ1ZmZlciwgbW9kZWwsIHJlc291cmNlTm9kZSwgZnJhbWVidWZmZXI7XG5cbiAgICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoZnVuY3Rpb24gX2NhbGxlZSQoX2NvbnRleHQpIHtcbiAgICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgICBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7XG4gICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgIF90aGlzJGVuZ2luZSA9IF90aGlzLmVuZ2luZSwgY3JlYXRlTW9kZWwgPSBfdGhpcyRlbmdpbmUuY3JlYXRlTW9kZWwsIGNyZWF0ZUF0dHJpYnV0ZSA9IF90aGlzJGVuZ2luZS5jcmVhdGVBdHRyaWJ1dGUsIGNyZWF0ZUJ1ZmZlciA9IF90aGlzJGVuZ2luZS5jcmVhdGVCdWZmZXI7XG5cbiAgICAgICAgICAgICAgaWYgKF90aGlzLm1vZGVsKSB7XG4gICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDY7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gNDtcbiAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZU1vZGVsKHtcbiAgICAgICAgICAgICAgICB2czogX3RoaXMuZW5naW5lLnN1cHBvcnRXZWJHUFUgPyBjb3B5VmVydFdlYkdQVSA6IGNvcHlWZXJ0LFxuICAgICAgICAgICAgICAgIGZzOiBfdGhpcy5lbmdpbmUuc3VwcG9ydFdlYkdQVSA/IGNvcHlGcmFnV2ViR1BVIDogY29weUZyYWcsXG4gICAgICAgICAgICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAgICAgICAgICAgLy8gcmVuZGVyaW5nIGEgZnVsbHNjcmVlbiB0cmlhbmdsZSBpbnN0ZWFkIG9mIHF1YWRcbiAgICAgICAgICAgICAgICAgIC8vIEBzZWUgaHR0cHM6Ly93d3cuc2FzY2hhd2lsbGVtcy5kZS9ibG9nLzIwMTYvMDgvMTMvdnVsa2FuLXR1dG9yaWFsLW9uLXJlbmRlcmluZy1hLWZ1bGxzY3JlZW4tcXVhZC13aXRob3V0LWJ1ZmZlcnMvXG4gICAgICAgICAgICAgICAgICBhX1Bvc2l0aW9uOiBjcmVhdGVBdHRyaWJ1dGUoe1xuICAgICAgICAgICAgICAgICAgICBidWZmZXI6IGNyZWF0ZUJ1ZmZlcih7XG4gICAgICAgICAgICAgICAgICAgICAgZGF0YTogWy00LCAtNCwgNCwgLTQsIDAsIDRdLFxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IGdsLkZMT0FUXG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICBzaXplOiAyLFxuICAgICAgICAgICAgICAgICAgICBhcnJheVN0cmlkZTogMiAqIDQsXG4gICAgICAgICAgICAgICAgICAgIHN0ZXBNb2RlOiAndmVydGV4JyxcbiAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlczogW3tcbiAgICAgICAgICAgICAgICAgICAgICBzaGFkZXJMb2NhdGlvbjogMCxcbiAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQ6IDAsXG4gICAgICAgICAgICAgICAgICAgICAgZm9ybWF0OiAnZmxvYXQyJ1xuICAgICAgICAgICAgICAgICAgICB9XVxuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHVuaWZvcm1zOiB7XG4gICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICB1X1RleHR1cmU6IG51bGxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGRlcHRoOiB7XG4gICAgICAgICAgICAgICAgICBlbmFibGU6IGZhbHNlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBjb3VudDogMyxcbiAgICAgICAgICAgICAgICBibGVuZDoge1xuICAgICAgICAgICAgICAgICAgLy8gY29weSBwYXNzIOmcgOimgea3t+WQiFxuICAgICAgICAgICAgICAgICAgLy8gZW5hYmxlOiB0aGlzLmdldE5hbWUoKSA9PT0gJ2NvcHknLFxuICAgICAgICAgICAgICAgICAgZW5hYmxlOiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICBtb2RlbCA9IF9jb250ZXh0LnNlbnQ7XG4gICAgICAgICAgICAgIF90aGlzLm1vZGVsID0gbW9kZWw7XG5cbiAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgLy8g5a6e5L6L5YyW6LWE5rqQXG4gICAgICAgICAgICAgIHJlc291cmNlTm9kZSA9IGZnLmdldFJlc291cmNlTm9kZShwYXNzLmRhdGEuaW5wdXQpO1xuICAgICAgICAgICAgICBmcmFtZWJ1ZmZlciA9IF90aGlzLnJlc291cmNlUG9vbC5nZXRPckNyZWF0ZVJlc291cmNlKHJlc291cmNlTm9kZS5yZXNvdXJjZSk7XG5cbiAgICAgICAgICAgICAgX3RoaXMuZW5naW5lLnVzZUZyYW1lYnVmZmVyKG51bGwsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5lbmdpbmUuY2xlYXIoe1xuICAgICAgICAgICAgICAgICAgZnJhbWVidWZmZXI6IG51bGwsXG4gICAgICAgICAgICAgICAgICBjb2xvcjogWzAsIDAsIDAsIDBdLFxuICAgICAgICAgICAgICAgICAgZGVwdGg6IDEsXG4gICAgICAgICAgICAgICAgICBzdGVuY2lsOiAwXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBfdGhpcy5tb2RlbC5kcmF3KHtcbiAgICAgICAgICAgICAgICAgIHVuaWZvcm1zOiB7XG4gICAgICAgICAgICAgICAgICAgIHVfVGV4dHVyZTogZnJhbWVidWZmZXIgLy8gdV9WaWV3cG9ydFNpemU6IFt3aWR0aCwgaGVpZ2h0XSxcblxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgY2FzZSA5OlxuICAgICAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSwgX2NhbGxlZSk7XG4gICAgfSkpO1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChfeCwgX3gyKSB7XG4gICAgICByZXR1cm4gX3JlZi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG4gIH0oKTtcblxuICB0aGlzLnRlYXJEb3duID0gZnVuY3Rpb24gKCkge1xuICAgIF90aGlzLm1vZGVsID0gdW5kZWZpbmVkO1xuICB9O1xufSwgX2NsYXNzMy5JREVOVElGSUVSID0gJ0NvcHkgUGFzcycsIF90ZW1wKSwgKF9kZXNjcmlwdG9yID0gX2FwcGx5RGVjb3JhdGVkRGVzY3JpcHRvcihfY2xhc3MyLnByb3RvdHlwZSwgXCJlbmdpbmVcIiwgW19kZWMyXSwge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHdyaXRhYmxlOiB0cnVlLFxuICBpbml0aWFsaXplcjogbnVsbFxufSksIF9kZXNjcmlwdG9yMiA9IF9hcHBseURlY29yYXRlZERlc2NyaXB0b3IoX2NsYXNzMi5wcm90b3R5cGUsIFwicmVzb3VyY2VQb29sXCIsIFtfZGVjM10sIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICB3cml0YWJsZTogdHJ1ZSxcbiAgaW5pdGlhbGl6ZXI6IG51bGxcbn0pKSwgX2NsYXNzMikpIHx8IF9jbGFzcyk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Db3B5UGFzcy5qcy5tYXAiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///83\n')},function(module,exports,__webpack_require__){eval('(function webpackUniversalModuleDefinition(root, factory) {\n\tif(true)\n\t\tmodule.exports = factory();\n\telse {}\n})(typeof self !== \'undefined\' ? self : this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module[\'default\']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, \'a\', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = "";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 31);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__is_type__ = __webpack_require__(4);\n\n/* harmony default export */ __webpack_exports__["a"] = (function (value) {\n return Array.isArray ? Array.isArray(value) : Object(__WEBPACK_IMPORTED_MODULE_0__is_type__["a" /* default */])(value, \'Array\');\n});\n\n/***/ }),\n/* 1 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\nvar isArrayLike = function (value) {\n /**\n * isArrayLike([1, 2, 3]) => true\n * isArrayLike(document.body.children) => true\n * isArrayLike(\'abc\') => true\n * isArrayLike(Function) => false\n */\n return value !== null && typeof value !== \'function\' && isFinite(value.length);\n};\n\n/* harmony default export */ __webpack_exports__["a"] = (isArrayLike);\n\n/***/ }),\n/* 2 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__is_array__ = __webpack_require__(0);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__is_object__ = __webpack_require__(13);\n\n\n\nfunction each(elements, func) {\n if (!elements) {\n return;\n }\n\n var rst;\n\n if (Object(__WEBPACK_IMPORTED_MODULE_0__is_array__["a" /* default */])(elements)) {\n for (var i = 0, len = elements.length; i < len; i++) {\n rst = func(elements[i], i);\n\n if (rst === false) {\n break;\n }\n }\n } else if (Object(__WEBPACK_IMPORTED_MODULE_1__is_object__["a" /* default */])(elements)) {\n for (var k in elements) {\n if (elements.hasOwnProperty(k)) {\n rst = func(elements[k], k);\n\n if (rst === false) {\n break;\n }\n }\n }\n }\n}\n\n/* harmony default export */ __webpack_exports__["a"] = (each);\n\n/***/ }),\n/* 3 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__is_type__ = __webpack_require__(4);\n/**\n * 是否为函数\n * @param {*} fn 对象\n * @return {Boolean} 是否函数\n */\n\n/* harmony default export */ __webpack_exports__["a"] = (function (value) {\n return Object(__WEBPACK_IMPORTED_MODULE_0__is_type__["a" /* default */])(value, \'Function\');\n});\n\n/***/ }),\n/* 4 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\nvar toString = {}.toString;\n\nvar isType = function (value, type) {\n return toString.call(value) === \'[object \' + type + \']\';\n};\n\n/* harmony default export */ __webpack_exports__["a"] = (isType);\n\n/***/ }),\n/* 5 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__is_type__ = __webpack_require__(4);\n/**\n * 判断是否数字\n * @return {Boolean} 是否数字\n */\n\n\nvar isNumber = function (value) {\n return Object(__WEBPACK_IMPORTED_MODULE_0__is_type__["a" /* default */])(value, \'Number\');\n};\n\n/* harmony default export */ __webpack_exports__["a"] = (isNumber);\n\n/***/ }),\n/* 6 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n// isFinite,\nvar isNil = function (value) {\n /**\n * isNil(null) => true\n * isNil() => true\n */\n return value === null || value === undefined;\n};\n\n/* harmony default export */ __webpack_exports__["a"] = (isNil);\n\n/***/ }),\n/* 7 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar _require = __webpack_require__(33),\n mix = _require.mix;\n\nmodule.exports = {\n assign: mix\n};\n\n/***/ }),\n/* 8 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__is_type__ = __webpack_require__(4);\n\n/* harmony default export */ __webpack_exports__["a"] = (function (str) {\n return Object(__WEBPACK_IMPORTED_MODULE_0__is_type__["a" /* default */])(str, \'String\');\n});\n\n/***/ }),\n/* 9 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__is_object_like__ = __webpack_require__(15);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__is_type__ = __webpack_require__(4);\n\n\n\nvar isPlainObject = function (value) {\n /**\n * isObjectLike(new Foo) => false\n * isObjectLike([1, 2, 3]) => false\n * isObjectLike({ x: 0, y: 0 }) => true\n * isObjectLike(Object.create(null)) => true\n */\n if (!Object(__WEBPACK_IMPORTED_MODULE_0__is_object_like__["a" /* default */])(value) || !Object(__WEBPACK_IMPORTED_MODULE_1__is_type__["a" /* default */])(value, \'Object\')) {\n return false;\n }\n\n if (Object.getPrototypeOf(value) === null) {\n return true;\n }\n\n var proto = value;\n\n while (Object.getPrototypeOf(proto) !== null) {\n proto = Object.getPrototypeOf(proto);\n }\n\n return Object.getPrototypeOf(value) === proto;\n};\n\n/* harmony default export */ __webpack_exports__["a"] = (isPlainObject);\n\n/***/ }),\n/* 10 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__is_nil__ = __webpack_require__(6);\n\n/* harmony default export */ __webpack_exports__["a"] = (function (value) {\n if (Object(__WEBPACK_IMPORTED_MODULE_0__is_nil__["a" /* default */])(value)) return \'\';\n return value.toString();\n});\n\n/***/ }),\n/* 11 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar hierarchy = __webpack_require__(18);\n\nvar Layout = /*#__PURE__*/function () {\n function Layout(root, options) {\n if (options === void 0) {\n options = {};\n }\n\n var me = this;\n me.options = options;\n me.rootNode = hierarchy(root, options);\n }\n\n var _proto = Layout.prototype;\n\n _proto.execute = function execute() {\n throw new Error(\'please override this method\');\n };\n\n return Layout;\n}();\n\nmodule.exports = Layout;\n\n/***/ }),\n/* 12 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__is_array_like__ = __webpack_require__(1);\n\n\nvar contains = function (arr, value) {\n if (!Object(__WEBPACK_IMPORTED_MODULE_0__is_array_like__["a" /* default */])(arr)) {\n return false;\n }\n\n return arr.indexOf(value) > -1;\n};\n\n/* harmony default export */ __webpack_exports__["a"] = (contains);\n\n/***/ }),\n/* 13 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony default export */ __webpack_exports__["a"] = (function (value) {\n /**\n * isObject({}) => true\n * isObject([1, 2, 3]) => true\n * isObject(Function) => true\n * isObject(null) => false\n */\n var type = typeof value;\n return value !== null && type === \'object\' || type === \'function\';\n});\n\n/***/ }),\n/* 14 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__each__ = __webpack_require__(2);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__is_array_like__ = __webpack_require__(1);\n\n\n\nvar filter = function (arr, func) {\n if (!Object(__WEBPACK_IMPORTED_MODULE_1__is_array_like__["a" /* default */])(arr)) {\n return arr;\n }\n\n var result = [];\n Object(__WEBPACK_IMPORTED_MODULE_0__each__["a" /* default */])(arr, function (value, index) {\n if (func(value, index)) {\n result.push(value);\n }\n });\n return result;\n};\n\n/* harmony default export */ __webpack_exports__["a"] = (filter);\n\n/***/ }),\n/* 15 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\nvar isObjectLike = function (value) {\n /**\n * isObjectLike({}) => true\n * isObjectLike([1, 2, 3]) => true\n * isObjectLike(Function) => false\n * isObjectLike(null) => false\n */\n return typeof value === \'object\' && value !== null;\n};\n\n/* harmony default export */ __webpack_exports__["a"] = (isObjectLike);\n\n/***/ }),\n/* 16 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony export (immutable) */ __webpack_exports__["a"] = mix;\n// FIXME: Mutable param should be forbidden in static lang.\nfunction _mix(dist, obj) {\n for (var key in obj) {\n if (obj.hasOwnProperty(key) && key !== \'constructor\' && obj[key] !== undefined) {\n dist[key] = obj[key];\n }\n }\n}\n\nfunction mix(dist, src1, src2, src3) {\n if (src1) _mix(dist, src1);\n if (src2) _mix(dist, src2);\n if (src3) _mix(dist, src3);\n return dist;\n}\n\n/***/ }),\n/* 17 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar separateTree = __webpack_require__(30);\n\nvar VALID_DIRECTIONS = [\'LR\', // left to right\n\'RL\', // right to left\n\'TB\', // top to bottom\n\'BT\', // bottom to top\n\'H\', // horizontal\n\'V\' // vertical\n];\nvar HORIZONTAL_DIRECTIONS = [\'LR\', \'RL\', \'H\'];\n\nvar isHorizontal = function isHorizontal(direction) {\n return HORIZONTAL_DIRECTIONS.indexOf(direction) > -1;\n};\n\nvar DEFAULT_DIRECTION = VALID_DIRECTIONS[0];\n\nmodule.exports = function (root, options, layoutAlgrithm) {\n var direction = options.direction || DEFAULT_DIRECTION;\n options.isHorizontal = isHorizontal(direction);\n\n if (direction && VALID_DIRECTIONS.indexOf(direction) === -1) {\n throw new TypeError("Invalid direction: " + direction);\n }\n\n if (direction === VALID_DIRECTIONS[0]) {\n // LR\n layoutAlgrithm(root, options);\n } else if (direction === VALID_DIRECTIONS[1]) {\n // RL\n layoutAlgrithm(root, options);\n root.right2left();\n } else if (direction === VALID_DIRECTIONS[2]) {\n // TB\n layoutAlgrithm(root, options);\n } else if (direction === VALID_DIRECTIONS[3]) {\n // BT\n layoutAlgrithm(root, options);\n root.bottom2top();\n } else if (direction === VALID_DIRECTIONS[4] || direction === VALID_DIRECTIONS[5]) {\n // H or V\n // separate into left and right trees\n var _separateTree = separateTree(root, options),\n left = _separateTree.left,\n right = _separateTree.right; // do layout for left and right trees\n\n\n layoutAlgrithm(left, options);\n layoutAlgrithm(right, options);\n options.isHorizontal ? left.right2left() : left.bottom2top(); // combine left and right trees\n\n right.translate(left.x - right.x, left.y - right.y); // translate root\n\n root.x = left.x;\n root.y = right.y;\n var bb = root.getBoundingBox();\n\n if (options.isHorizontal) {\n if (bb.top < 0) {\n root.translate(0, -bb.top);\n }\n } else {\n if (bb.left < 0) {\n root.translate(-bb.left, 0);\n }\n }\n } // fixed root position, default value is true\n\n\n var fixedRoot = options.fixedRoot;\n if (fixedRoot === undefined) fixedRoot = true;\n\n if (fixedRoot) {\n root.translate(-(root.x + root.width / 2 + root.hgap), -(root.y + root.height / 2 + root.vgap));\n }\n\n return root;\n};\n\n/***/ }),\n/* 18 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/* eslint-disable no-cond-assign */\nvar util = __webpack_require__(7);\n\nvar PEM = 18;\nvar DEFAULT_HEIGHT = PEM * 2;\nvar DEFAULT_GAP = PEM;\nvar DEFAULT_OPTIONS = {\n getId: function getId(d) {\n return d.id || d.name;\n },\n getPreH: function getPreH(d) {\n return d.preH || 0;\n },\n getPreV: function getPreV(d) {\n return d.preV || 0;\n },\n getHGap: function getHGap(d) {\n return d.hgap || DEFAULT_GAP;\n },\n getVGap: function getVGap(d) {\n return d.vgap || DEFAULT_GAP;\n },\n getChildren: function getChildren(d) {\n return d.children;\n },\n getHeight: function getHeight(d) {\n return d.height || DEFAULT_HEIGHT;\n },\n getWidth: function getWidth(d) {\n var label = d.label || \' \';\n return d.width || label.split(\'\').length * PEM; // FIXME DO NOT get width like this\n }\n};\n\nfunction Node(data, options) {\n var me = this;\n me.vgap = me.hgap = 0;\n if (data instanceof Node) return data;\n me.data = data;\n /*\n * Gaps: filling space between nodes\n * (x, y) ----------------------\n * | vgap |\n * | -------------------- h\n * | h | | e\n * | g | | i\n * | a | | g\n * | p | | h\n * | --------------------- t\n * | |\n * -----------width------------\n */\n\n var hgap = options.getHGap(data);\n var vgap = options.getVGap(data);\n me.preH = options.getPreH(data);\n me.preV = options.getPreV(data);\n me.width = options.getWidth(data);\n me.height = options.getHeight(data);\n me.width += me.preH;\n me.height += me.preV;\n me.id = options.getId(data);\n me.x = me.y = 0;\n me.depth = 0;\n\n if (!me.children) {\n me.children = [];\n }\n\n me.addGap(hgap, vgap);\n return me;\n}\n\nutil.assign(Node.prototype, {\n isRoot: function isRoot() {\n return this.depth === 0;\n },\n isLeaf: function isLeaf() {\n return this.children.length === 0;\n },\n addGap: function addGap(hgap, vgap) {\n var me = this;\n me.hgap += hgap;\n me.vgap += vgap;\n me.width += 2 * hgap;\n me.height += 2 * vgap;\n },\n eachNode: function eachNode(callback) {\n // Depth First traverse\n var me = this;\n var nodes = [me];\n var current;\n\n while (current = nodes.shift()) {\n callback(current);\n nodes = current.children.concat(nodes);\n }\n },\n DFTraverse: function DFTraverse(callback) {\n // Depth First traverse\n this.eachNode(callback);\n },\n BFTraverse: function BFTraverse(callback) {\n // Breadth First traverse\n var me = this;\n var nodes = [me];\n var current;\n\n while (current = nodes.shift()) {\n callback(current);\n nodes = nodes.concat(current.children);\n }\n },\n getBoundingBox: function getBoundingBox() {\n // BBox for just one tree node\n var bb = {\n left: Number.MAX_VALUE,\n top: Number.MAX_VALUE,\n width: 0,\n height: 0\n };\n this.eachNode(function (node) {\n bb.left = Math.min(bb.left, node.x);\n bb.top = Math.min(bb.top, node.y);\n bb.width = Math.max(bb.width, node.x + node.width);\n bb.height = Math.max(bb.height, node.y + node.height);\n });\n return bb;\n },\n // translate\n translate: function translate(tx, ty) {\n if (tx === void 0) {\n tx = 0;\n }\n\n if (ty === void 0) {\n ty = 0;\n }\n\n this.eachNode(function (node) {\n node.x += tx;\n node.y += ty;\n node.x += node.preH;\n node.y += node.preV;\n });\n },\n right2left: function right2left() {\n var me = this;\n var bb = me.getBoundingBox();\n me.eachNode(function (node) {\n node.x = node.x - (node.x - bb.left) * 2 - node.width; // node.x = - node.x;\n });\n me.translate(bb.width, 0);\n },\n bottom2top: function bottom2top() {\n var me = this;\n var bb = me.getBoundingBox();\n me.eachNode(function (node) {\n node.y = node.y - (node.y - bb.top) * 2 - node.height; // node.y = - node.y;\n });\n me.translate(0, bb.height);\n }\n});\n\nfunction hierarchy(data, options, isolated) {\n if (options === void 0) {\n options = {};\n }\n\n options = util.assign({}, DEFAULT_OPTIONS, options);\n var root = new Node(data, options);\n var nodes = [root];\n var node;\n\n if (!isolated && !data.collapsed) {\n while (node = nodes.shift()) {\n if (!node.data.collapsed) {\n var children = options.getChildren(node.data);\n var length = children ? children.length : 0;\n node.children = new Array(length);\n\n if (children && length) {\n for (var i = 0; i < length; i++) {\n var child = new Node(children[i], options);\n node.children[i] = child;\n nodes.push(child);\n child.parent = node;\n child.depth = node.depth + 1;\n }\n }\n }\n }\n }\n\n return root;\n}\n\nmodule.exports = hierarchy;\n\n/***/ }),\n/* 19 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__is_nil__ = __webpack_require__(6);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__keys__ = __webpack_require__(20);\n\n\n\nfunction isMatch(obj, attrs) {\n var _keys = Object(__WEBPACK_IMPORTED_MODULE_1__keys__["a" /* default */])(attrs);\n\n var length = _keys.length;\n if (Object(__WEBPACK_IMPORTED_MODULE_0__is_nil__["a" /* default */])(obj)) return !length;\n\n for (var i = 0; i < length; i += 1) {\n var key = _keys[i];\n\n if (attrs[key] !== obj[key] || !(key in obj)) {\n return false;\n }\n }\n\n return true;\n}\n\n/* harmony default export */ __webpack_exports__["a"] = (isMatch);\n\n/***/ }),\n/* 20 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__each__ = __webpack_require__(2);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__is_function__ = __webpack_require__(3);\n\n\nvar keys = Object.keys ? function (obj) {\n return Object.keys(obj);\n} : function (obj) {\n var result = [];\n Object(__WEBPACK_IMPORTED_MODULE_0__each__["a" /* default */])(obj, function (value, key) {\n if (!(Object(__WEBPACK_IMPORTED_MODULE_1__is_function__["a" /* default */])(obj) && key === \'prototype\')) {\n result.push(key);\n }\n });\n return result;\n};\n/* harmony default export */ __webpack_exports__["a"] = (keys);\n\n/***/ }),\n/* 21 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__is_array_like__ = __webpack_require__(1);\n\nvar splice = Array.prototype.splice;\n\nvar pullAt = function pullAt(arr, indexes) {\n if (!Object(__WEBPACK_IMPORTED_MODULE_0__is_array_like__["a" /* default */])(arr)) {\n return [];\n }\n\n var length = arr ? indexes.length : 0;\n var last = length - 1;\n\n while (length--) {\n var previous = void 0;\n var index = indexes[length];\n\n if (length === last || index !== previous) {\n previous = index;\n splice.call(arr, index, 1);\n }\n }\n\n return arr;\n};\n\n/* harmony default export */ __webpack_exports__["a"] = (pullAt);\n\n/***/ }),\n/* 22 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__contains__ = __webpack_require__(12);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__each__ = __webpack_require__(2);\n\n\n\nvar uniq = function (arr) {\n var resultArr = [];\n Object(__WEBPACK_IMPORTED_MODULE_1__each__["a" /* default */])(arr, function (item) {\n if (!Object(__WEBPACK_IMPORTED_MODULE_0__contains__["a" /* default */])(resultArr, item)) {\n resultArr.push(item);\n }\n });\n return resultArr;\n};\n\n/* harmony default export */ __webpack_exports__["a"] = (uniq);\n\n/***/ }),\n/* 23 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__is_array__ = __webpack_require__(0);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__is_function__ = __webpack_require__(3);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__group_by__ = __webpack_require__(24);\n\n\n\n\nvar groupToMap = function (data, condition) {\n if (!condition) {\n return {\n 0: data\n };\n }\n\n if (!Object(__WEBPACK_IMPORTED_MODULE_1__is_function__["a" /* default */])(condition)) {\n var paramsCondition_1 = Object(__WEBPACK_IMPORTED_MODULE_0__is_array__["a" /* default */])(condition) ? condition : condition.replace(/\\s+/g, \'\').split(\'*\');\n\n condition = function (row) {\n var unique = \'_\'; // 避免出现数字作为Key的情况,会进行按照数字的排序\n\n for (var i = 0, l = paramsCondition_1.length; i < l; i++) {\n unique += row[paramsCondition_1[i]] && row[paramsCondition_1[i]].toString();\n }\n\n return unique;\n };\n }\n\n var groups = Object(__WEBPACK_IMPORTED_MODULE_2__group_by__["a" /* default */])(data, condition);\n return groups;\n};\n\n/* harmony default export */ __webpack_exports__["a"] = (groupToMap);\n\n/***/ }),\n/* 24 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__each__ = __webpack_require__(2);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__is_array__ = __webpack_require__(0);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__is_function__ = __webpack_require__(3);\n\n\n\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n\nfunction groupBy(data, condition) {\n if (!condition || !Object(__WEBPACK_IMPORTED_MODULE_1__is_array__["a" /* default */])(data)) {\n return {};\n }\n\n var result = {}; // 兼容方法和 字符串的写法\n\n var predicate = Object(__WEBPACK_IMPORTED_MODULE_2__is_function__["a" /* default */])(condition) ? condition : function (item) {\n return item[condition];\n };\n var key;\n Object(__WEBPACK_IMPORTED_MODULE_0__each__["a" /* default */])(data, function (item) {\n key = predicate(item);\n\n if (hasOwnProperty.call(result, key)) {\n result[key].push(item);\n } else {\n result[key] = [item];\n }\n });\n return result;\n}\n\n/* harmony default export */ __webpack_exports__["a"] = (groupBy);\n\n/***/ }),\n/* 25 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony default export */ __webpack_exports__["a"] = (function (obj, key) {\n return obj.hasOwnProperty(key);\n});\n\n/***/ }),\n/* 26 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__each__ = __webpack_require__(2);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__is_function__ = __webpack_require__(3);\n\n // @ts-ignore\n\nvar values = Object.values ? function (obj) {\n return Object.values(obj);\n} : function (obj) {\n var result = [];\n Object(__WEBPACK_IMPORTED_MODULE_0__each__["a" /* default */])(obj, function (value, key) {\n if (!(Object(__WEBPACK_IMPORTED_MODULE_1__is_function__["a" /* default */])(obj) && key === \'prototype\')) {\n result.push(value);\n }\n });\n return result;\n};\n/* harmony default export */ __webpack_exports__["a"] = (values);\n\n/***/ }),\n/* 27 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\nvar toString = {}.toString;\n\nvar getType = function (value) {\n return toString.call(value).replace(/^\\[object /, \'\').replace(/]$/, \'\');\n};\n\n/* harmony default export */ __webpack_exports__["a"] = (getType);\n\n/***/ }),\n/* 28 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\nvar objectProto = Object.prototype;\n\nvar isPrototype = function (value) {\n var Ctor = value && value.constructor;\n var proto = typeof Ctor === \'function\' && Ctor.prototype || objectProto;\n return value === proto;\n};\n\n/* harmony default export */ __webpack_exports__["a"] = (isPrototype);\n\n/***/ }),\n/* 29 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__is_object_like__ = __webpack_require__(15);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__is_array_like__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__is_string__ = __webpack_require__(8);\n\n\n\n\nvar isEqual = function (value, other) {\n if (value === other) {\n return true;\n }\n\n if (!value || !other) {\n return false;\n }\n\n if (Object(__WEBPACK_IMPORTED_MODULE_2__is_string__["a" /* default */])(value) || Object(__WEBPACK_IMPORTED_MODULE_2__is_string__["a" /* default */])(other)) {\n return false;\n }\n\n if (Object(__WEBPACK_IMPORTED_MODULE_1__is_array_like__["a" /* default */])(value) || Object(__WEBPACK_IMPORTED_MODULE_1__is_array_like__["a" /* default */])(other)) {\n if (value.length !== other.length) {\n return false;\n }\n\n var rst = true;\n\n for (var i = 0; i < value.length; i++) {\n rst = isEqual(value[i], other[i]);\n\n if (!rst) {\n break;\n }\n }\n\n return rst;\n }\n\n if (Object(__WEBPACK_IMPORTED_MODULE_0__is_object_like__["a" /* default */])(value) || Object(__WEBPACK_IMPORTED_MODULE_0__is_object_like__["a" /* default */])(other)) {\n var valueKeys = Object.keys(value);\n var otherKeys = Object.keys(other);\n\n if (valueKeys.length !== otherKeys.length) {\n return false;\n }\n\n var rst = true;\n\n for (var i = 0; i < valueKeys.length; i++) {\n rst = isEqual(value[valueKeys[i]], other[valueKeys[i]]);\n\n if (!rst) {\n break;\n }\n }\n\n return rst;\n }\n\n return false;\n};\n\n/* harmony default export */ __webpack_exports__["a"] = (isEqual);\n\n/***/ }),\n/* 30 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar hierarchy = __webpack_require__(18);\n\nmodule.exports = function (root, options) {\n // separate into left and right trees\n var left = hierarchy(root.data, options, true); // root only\n\n var right = hierarchy(root.data, options, true); // root only\n // automatically\n\n var treeSize = root.children.length;\n var rightTreeSize = Math.round(treeSize / 2); // separate left and right tree by meta data\n\n var getSide = options.getSide || function (child, index) {\n if (index < rightTreeSize) {\n return \'right\';\n }\n\n return \'left\';\n };\n\n for (var i = 0; i < treeSize; i++) {\n var child = root.children[i];\n var side = getSide(child, i);\n\n if (side === \'right\') {\n right.children.push(child);\n } else {\n left.children.push(child);\n }\n }\n\n left.eachNode(function (node) {\n if (!node.isRoot()) {\n node.side = \'left\';\n }\n });\n right.eachNode(function (node) {\n if (!node.isRoot()) {\n node.side = \'right\';\n }\n });\n return {\n left: left,\n right: right\n };\n};\n\n/***/ }),\n/* 31 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar hierarchy = {\n compactBox: __webpack_require__(32),\n dendrogram: __webpack_require__(114),\n indented: __webpack_require__(116),\n mindmap: __webpack_require__(118)\n};\nmodule.exports = hierarchy;\n\n/***/ }),\n/* 32 */\n/***/ (function(module, exports, __webpack_require__) {\n\nfunction _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; }\n\nvar TreeLayout = __webpack_require__(11);\n\nvar nonLayeredTidyTree = __webpack_require__(113);\n\nvar doTreeLayout = __webpack_require__(17);\n\nvar util = __webpack_require__(7);\n\nvar CompactBoxTreeLayout = /*#__PURE__*/function (_TreeLayout) {\n _inheritsLoose(CompactBoxTreeLayout, _TreeLayout);\n\n function CompactBoxTreeLayout() {\n return _TreeLayout.apply(this, arguments) || this;\n }\n\n var _proto = CompactBoxTreeLayout.prototype;\n\n _proto.execute = function execute() {\n var me = this;\n return doTreeLayout(me.rootNode, me.options, nonLayeredTidyTree);\n };\n\n return CompactBoxTreeLayout;\n}(TreeLayout);\n\nvar DEFAULT_OPTIONS = {};\n\nfunction compactBoxLayout(root, options) {\n options = util.assign({}, DEFAULT_OPTIONS, options);\n return new CompactBoxTreeLayout(root, options).execute();\n}\n\nmodule.exports = compactBoxLayout;\n\n/***/ }),\n/* 33 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\nObject.defineProperty(__webpack_exports__, "__esModule", { value: true });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__contains__ = __webpack_require__(12);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "contains", function() { return __WEBPACK_IMPORTED_MODULE_0__contains__["a"]; });\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "includes", function() { return __WEBPACK_IMPORTED_MODULE_0__contains__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__difference__ = __webpack_require__(34);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "difference", function() { return __WEBPACK_IMPORTED_MODULE_1__difference__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__find__ = __webpack_require__(35);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "find", function() { return __WEBPACK_IMPORTED_MODULE_2__find__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__find_index__ = __webpack_require__(36);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "findIndex", function() { return __WEBPACK_IMPORTED_MODULE_3__find_index__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__first_value__ = __webpack_require__(37);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "firstValue", function() { return __WEBPACK_IMPORTED_MODULE_4__first_value__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__flatten__ = __webpack_require__(38);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "flatten", function() { return __WEBPACK_IMPORTED_MODULE_5__flatten__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__flatten_deep__ = __webpack_require__(39);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "flattenDeep", function() { return __WEBPACK_IMPORTED_MODULE_6__flatten_deep__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__get_range__ = __webpack_require__(40);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "getRange", function() { return __WEBPACK_IMPORTED_MODULE_7__get_range__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__pull__ = __webpack_require__(41);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "pull", function() { return __WEBPACK_IMPORTED_MODULE_8__pull__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__pull_at__ = __webpack_require__(21);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "pullAt", function() { return __WEBPACK_IMPORTED_MODULE_9__pull_at__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_10__reduce__ = __webpack_require__(42);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "reduce", function() { return __WEBPACK_IMPORTED_MODULE_10__reduce__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_11__remove__ = __webpack_require__(43);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "remove", function() { return __WEBPACK_IMPORTED_MODULE_11__remove__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_12__sort_by__ = __webpack_require__(44);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "sortBy", function() { return __WEBPACK_IMPORTED_MODULE_12__sort_by__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_13__union__ = __webpack_require__(45);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "union", function() { return __WEBPACK_IMPORTED_MODULE_13__union__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_14__uniq__ = __webpack_require__(22);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "uniq", function() { return __WEBPACK_IMPORTED_MODULE_14__uniq__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_15__values_of_key__ = __webpack_require__(46);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "valuesOfKey", function() { return __WEBPACK_IMPORTED_MODULE_15__values_of_key__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_16__head__ = __webpack_require__(47);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "head", function() { return __WEBPACK_IMPORTED_MODULE_16__head__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_17__last__ = __webpack_require__(48);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "last", function() { return __WEBPACK_IMPORTED_MODULE_17__last__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_18__starts_with__ = __webpack_require__(49);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "startsWith", function() { return __WEBPACK_IMPORTED_MODULE_18__starts_with__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_19__ends_with__ = __webpack_require__(50);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "endsWith", function() { return __WEBPACK_IMPORTED_MODULE_19__ends_with__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_20__filter__ = __webpack_require__(14);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "filter", function() { return __WEBPACK_IMPORTED_MODULE_20__filter__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_21__every__ = __webpack_require__(51);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "every", function() { return __WEBPACK_IMPORTED_MODULE_21__every__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_22__some__ = __webpack_require__(52);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "some", function() { return __WEBPACK_IMPORTED_MODULE_22__some__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_23__group__ = __webpack_require__(53);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "group", function() { return __WEBPACK_IMPORTED_MODULE_23__group__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_24__group_by__ = __webpack_require__(24);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "groupBy", function() { return __WEBPACK_IMPORTED_MODULE_24__group_by__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_25__group_to_map__ = __webpack_require__(23);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "groupToMap", function() { return __WEBPACK_IMPORTED_MODULE_25__group_to_map__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_26__get_wrap_behavior__ = __webpack_require__(54);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "getWrapBehavior", function() { return __WEBPACK_IMPORTED_MODULE_26__get_wrap_behavior__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_27__wrap_behavior__ = __webpack_require__(55);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "wrapBehavior", function() { return __WEBPACK_IMPORTED_MODULE_27__wrap_behavior__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_28__number2color__ = __webpack_require__(56);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "number2color", function() { return __WEBPACK_IMPORTED_MODULE_28__number2color__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_29__parse_radius__ = __webpack_require__(57);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "parseRadius", function() { return __WEBPACK_IMPORTED_MODULE_29__parse_radius__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_30__clamp__ = __webpack_require__(58);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "clamp", function() { return __WEBPACK_IMPORTED_MODULE_30__clamp__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_31__fixed_base__ = __webpack_require__(59);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "fixedBase", function() { return __WEBPACK_IMPORTED_MODULE_31__fixed_base__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_32__is_decimal__ = __webpack_require__(60);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "isDecimal", function() { return __WEBPACK_IMPORTED_MODULE_32__is_decimal__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_33__is_even__ = __webpack_require__(61);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "isEven", function() { return __WEBPACK_IMPORTED_MODULE_33__is_even__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_34__is_integer__ = __webpack_require__(62);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "isInteger", function() { return __WEBPACK_IMPORTED_MODULE_34__is_integer__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_35__is_negative__ = __webpack_require__(63);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "isNegative", function() { return __WEBPACK_IMPORTED_MODULE_35__is_negative__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_36__is_number_equal__ = __webpack_require__(64);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "isNumberEqual", function() { return __WEBPACK_IMPORTED_MODULE_36__is_number_equal__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_37__is_odd__ = __webpack_require__(65);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "isOdd", function() { return __WEBPACK_IMPORTED_MODULE_37__is_odd__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_38__is_positive__ = __webpack_require__(66);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "isPositive", function() { return __WEBPACK_IMPORTED_MODULE_38__is_positive__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_39__max_by__ = __webpack_require__(67);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "maxBy", function() { return __WEBPACK_IMPORTED_MODULE_39__max_by__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_40__min_by__ = __webpack_require__(68);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "minBy", function() { return __WEBPACK_IMPORTED_MODULE_40__min_by__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_41__mod__ = __webpack_require__(69);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "mod", function() { return __WEBPACK_IMPORTED_MODULE_41__mod__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_42__to_degree__ = __webpack_require__(70);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "toDegree", function() { return __WEBPACK_IMPORTED_MODULE_42__to_degree__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_43__to_integer__ = __webpack_require__(71);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "toInteger", function() { return __WEBPACK_IMPORTED_MODULE_43__to_integer__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_44__to_radian__ = __webpack_require__(72);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "toRadian", function() { return __WEBPACK_IMPORTED_MODULE_44__to_radian__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_45__for_in__ = __webpack_require__(73);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "forIn", function() { return __WEBPACK_IMPORTED_MODULE_45__for_in__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_46__has__ = __webpack_require__(25);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "has", function() { return __WEBPACK_IMPORTED_MODULE_46__has__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_47__has_key__ = __webpack_require__(74);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "hasKey", function() { return __WEBPACK_IMPORTED_MODULE_47__has_key__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_48__has_value__ = __webpack_require__(75);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "hasValue", function() { return __WEBPACK_IMPORTED_MODULE_48__has_value__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_49__keys__ = __webpack_require__(20);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "keys", function() { return __WEBPACK_IMPORTED_MODULE_49__keys__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_50__is_match__ = __webpack_require__(19);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "isMatch", function() { return __WEBPACK_IMPORTED_MODULE_50__is_match__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_51__values__ = __webpack_require__(26);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "values", function() { return __WEBPACK_IMPORTED_MODULE_51__values__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_52__lower_case__ = __webpack_require__(76);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "lowerCase", function() { return __WEBPACK_IMPORTED_MODULE_52__lower_case__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_53__lower_first__ = __webpack_require__(77);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "lowerFirst", function() { return __WEBPACK_IMPORTED_MODULE_53__lower_first__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_54__substitute__ = __webpack_require__(78);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "substitute", function() { return __WEBPACK_IMPORTED_MODULE_54__substitute__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_55__upper_case__ = __webpack_require__(79);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "upperCase", function() { return __WEBPACK_IMPORTED_MODULE_55__upper_case__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_56__upper_first__ = __webpack_require__(80);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "upperFirst", function() { return __WEBPACK_IMPORTED_MODULE_56__upper_first__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_57__get_type__ = __webpack_require__(27);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "getType", function() { return __WEBPACK_IMPORTED_MODULE_57__get_type__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_58__is_arguments__ = __webpack_require__(81);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "isArguments", function() { return __WEBPACK_IMPORTED_MODULE_58__is_arguments__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_59__is_array__ = __webpack_require__(0);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "isArray", function() { return __WEBPACK_IMPORTED_MODULE_59__is_array__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_60__is_array_like__ = __webpack_require__(1);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "isArrayLike", function() { return __WEBPACK_IMPORTED_MODULE_60__is_array_like__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_61__is_boolean__ = __webpack_require__(82);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "isBoolean", function() { return __WEBPACK_IMPORTED_MODULE_61__is_boolean__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_62__is_date__ = __webpack_require__(83);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "isDate", function() { return __WEBPACK_IMPORTED_MODULE_62__is_date__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_63__is_error__ = __webpack_require__(84);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "isError", function() { return __WEBPACK_IMPORTED_MODULE_63__is_error__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_64__is_function__ = __webpack_require__(3);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "isFunction", function() { return __WEBPACK_IMPORTED_MODULE_64__is_function__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_65__is_finite__ = __webpack_require__(85);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "isFinite", function() { return __WEBPACK_IMPORTED_MODULE_65__is_finite__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_66__is_nil__ = __webpack_require__(6);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "isNil", function() { return __WEBPACK_IMPORTED_MODULE_66__is_nil__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_67__is_null__ = __webpack_require__(86);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "isNull", function() { return __WEBPACK_IMPORTED_MODULE_67__is_null__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_68__is_number__ = __webpack_require__(5);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "isNumber", function() { return __WEBPACK_IMPORTED_MODULE_68__is_number__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_69__is_object__ = __webpack_require__(13);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "isObject", function() { return __WEBPACK_IMPORTED_MODULE_69__is_object__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_70__is_object_like__ = __webpack_require__(15);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "isObjectLike", function() { return __WEBPACK_IMPORTED_MODULE_70__is_object_like__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_71__is_plain_object__ = __webpack_require__(9);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "isPlainObject", function() { return __WEBPACK_IMPORTED_MODULE_71__is_plain_object__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_72__is_prototype__ = __webpack_require__(28);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "isPrototype", function() { return __WEBPACK_IMPORTED_MODULE_72__is_prototype__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_73__is_reg_exp__ = __webpack_require__(87);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "isRegExp", function() { return __WEBPACK_IMPORTED_MODULE_73__is_reg_exp__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_74__is_string__ = __webpack_require__(8);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "isString", function() { return __WEBPACK_IMPORTED_MODULE_74__is_string__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_75__is_type__ = __webpack_require__(4);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "isType", function() { return __WEBPACK_IMPORTED_MODULE_75__is_type__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_76__is_undefined__ = __webpack_require__(88);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "isUndefined", function() { return __WEBPACK_IMPORTED_MODULE_76__is_undefined__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_77__is_element__ = __webpack_require__(89);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "isElement", function() { return __WEBPACK_IMPORTED_MODULE_77__is_element__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_78__request_animation_frame__ = __webpack_require__(90);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "requestAnimationFrame", function() { return __WEBPACK_IMPORTED_MODULE_78__request_animation_frame__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_79__clear_animation_frame__ = __webpack_require__(91);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "clearAnimationFrame", function() { return __WEBPACK_IMPORTED_MODULE_79__clear_animation_frame__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_80__augment__ = __webpack_require__(92);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "augment", function() { return __WEBPACK_IMPORTED_MODULE_80__augment__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_81__clone__ = __webpack_require__(93);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "clone", function() { return __WEBPACK_IMPORTED_MODULE_81__clone__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_82__debounce__ = __webpack_require__(94);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "debounce", function() { return __WEBPACK_IMPORTED_MODULE_82__debounce__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_83__memoize__ = __webpack_require__(95);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "memoize", function() { return __WEBPACK_IMPORTED_MODULE_83__memoize__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_84__deep_mix__ = __webpack_require__(96);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "deepMix", function() { return __WEBPACK_IMPORTED_MODULE_84__deep_mix__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_85__each__ = __webpack_require__(2);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "each", function() { return __WEBPACK_IMPORTED_MODULE_85__each__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_86__extend__ = __webpack_require__(97);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "extend", function() { return __WEBPACK_IMPORTED_MODULE_86__extend__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_87__index_of__ = __webpack_require__(98);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "indexOf", function() { return __WEBPACK_IMPORTED_MODULE_87__index_of__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_88__is_empty__ = __webpack_require__(99);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "isEmpty", function() { return __WEBPACK_IMPORTED_MODULE_88__is_empty__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_89__is_equal__ = __webpack_require__(29);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "isEqual", function() { return __WEBPACK_IMPORTED_MODULE_89__is_equal__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_90__is_equal_with__ = __webpack_require__(100);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "isEqualWith", function() { return __WEBPACK_IMPORTED_MODULE_90__is_equal_with__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_91__map__ = __webpack_require__(101);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "map", function() { return __WEBPACK_IMPORTED_MODULE_91__map__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_92__map_values__ = __webpack_require__(102);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "mapValues", function() { return __WEBPACK_IMPORTED_MODULE_92__map_values__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_93__mix__ = __webpack_require__(16);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "mix", function() { return __WEBPACK_IMPORTED_MODULE_93__mix__["a"]; });\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "assign", function() { return __WEBPACK_IMPORTED_MODULE_93__mix__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_94__get__ = __webpack_require__(103);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "get", function() { return __WEBPACK_IMPORTED_MODULE_94__get__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_95__set__ = __webpack_require__(104);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "set", function() { return __WEBPACK_IMPORTED_MODULE_95__set__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_96__pick__ = __webpack_require__(105);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "pick", function() { return __WEBPACK_IMPORTED_MODULE_96__pick__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_97__throttle__ = __webpack_require__(106);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "throttle", function() { return __WEBPACK_IMPORTED_MODULE_97__throttle__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_98__to_array__ = __webpack_require__(107);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "toArray", function() { return __WEBPACK_IMPORTED_MODULE_98__to_array__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_99__to_string__ = __webpack_require__(10);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "toString", function() { return __WEBPACK_IMPORTED_MODULE_99__to_string__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_100__unique_id__ = __webpack_require__(108);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "uniqueId", function() { return __WEBPACK_IMPORTED_MODULE_100__unique_id__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_101__noop__ = __webpack_require__(109);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "noop", function() { return __WEBPACK_IMPORTED_MODULE_101__noop__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_102__identity__ = __webpack_require__(110);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "identity", function() { return __WEBPACK_IMPORTED_MODULE_102__identity__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_103__size__ = __webpack_require__(111);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "size", function() { return __WEBPACK_IMPORTED_MODULE_103__size__["a"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_104__cache__ = __webpack_require__(112);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "Cache", function() { return __WEBPACK_IMPORTED_MODULE_104__cache__["a"]; });\n// array\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n // event\n\n\n // format\n\n\n // math\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n // object\n\n\n\n\n\n\n\n // string\n\n\n\n\n\n // type\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n // other\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n // 不知道为什么,需要把这个 export,不然 ts 会报类型错误\n\n\n\n/***/ }),\n/* 34 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__filter__ = __webpack_require__(14);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__contains__ = __webpack_require__(12);\n\n\n/**\n * Flattens `array` a single level deep.\n *\n * @param {Array} arr The array to inspect.\n * @param {Array} values The values to exclude.\n * @return {Array} Returns the new array of filtered values.\n * @example\n * difference([2, 1], [2, 3]); // => [1]\n */\n\nvar difference = function (arr, values) {\n if (values === void 0) {\n values = [];\n }\n\n return Object(__WEBPACK_IMPORTED_MODULE_0__filter__["a" /* default */])(arr, function (value) {\n return !Object(__WEBPACK_IMPORTED_MODULE_1__contains__["a" /* default */])(values, value);\n });\n};\n\n/* harmony default export */ __webpack_exports__["a"] = (difference);\n\n/***/ }),\n/* 35 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__is_function__ = __webpack_require__(3);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__is_match__ = __webpack_require__(19);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__is_array__ = __webpack_require__(0);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__is_plain_object__ = __webpack_require__(9);\n\n\n\n\n\nfunction find(arr, predicate) {\n if (!Object(__WEBPACK_IMPORTED_MODULE_2__is_array__["a" /* default */])(arr)) return null;\n\n var _predicate;\n\n if (Object(__WEBPACK_IMPORTED_MODULE_0__is_function__["a" /* default */])(predicate)) {\n _predicate = predicate;\n }\n\n if (Object(__WEBPACK_IMPORTED_MODULE_3__is_plain_object__["a" /* default */])(predicate)) {\n _predicate = function (a) {\n return Object(__WEBPACK_IMPORTED_MODULE_1__is_match__["a" /* default */])(a, predicate);\n };\n }\n\n if (_predicate) {\n for (var i = 0; i < arr.length; i += 1) {\n if (_predicate(arr[i])) {\n return arr[i];\n }\n }\n }\n\n return null;\n}\n\n/* harmony default export */ __webpack_exports__["a"] = (find);\n\n/***/ }),\n/* 36 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\nfunction findIndex(arr, predicate, fromIndex) {\n if (fromIndex === void 0) {\n fromIndex = 0;\n }\n\n for (var i = fromIndex; i < arr.length; i++) {\n if (predicate(arr[i], i)) {\n // 找到终止循环\n return i;\n }\n }\n\n return -1;\n}\n\n/* harmony default export */ __webpack_exports__["a"] = (findIndex);\n\n/***/ }),\n/* 37 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__is_nil__ = __webpack_require__(6);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__is_array__ = __webpack_require__(0);\n\n\n\nvar firstValue = function (data, name) {\n var rst = null;\n\n for (var i = 0; i < data.length; i++) {\n var obj = data[i];\n var value = obj[name];\n\n if (!Object(__WEBPACK_IMPORTED_MODULE_0__is_nil__["a" /* default */])(value)) {\n if (Object(__WEBPACK_IMPORTED_MODULE_1__is_array__["a" /* default */])(value)) {\n rst = value[0]; // todo 这里是否应该使用递归,调用 firstValue @绝云\n } else {\n rst = value;\n }\n\n break;\n }\n }\n\n return rst;\n};\n\n/* harmony default export */ __webpack_exports__["a"] = (firstValue);\n\n/***/ }),\n/* 38 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__is_array__ = __webpack_require__(0);\n\n/**\n * Flattens `array` a single level deep.\n *\n * @param {Array} arr The array to flatten.\n * @return {Array} Returns the new flattened array.\n * @example\n *\n * flatten([1, [2, [3, [4]], 5]]); // => [1, 2, [3, [4]], 5]\n */\n\nvar flatten = function (arr) {\n if (!Object(__WEBPACK_IMPORTED_MODULE_0__is_array__["a" /* default */])(arr)) {\n return [];\n }\n\n var rst = [];\n\n for (var i = 0; i < arr.length; i++) {\n rst = rst.concat(arr[i]);\n }\n\n return rst;\n};\n\n/* harmony default export */ __webpack_exports__["a"] = (flatten);\n\n/***/ }),\n/* 39 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__is_array__ = __webpack_require__(0);\n\n/**\n * Flattens `array` a single level deep.\n *\n * @param {Array} arr The array to flatten.\n * @param {Array} result The array to return.\n * @return {Array} Returns the new flattened array.\n * @example\n *\n * flattenDeep([1, [2, [3, [4]], 5]]); // => [1, 2, 3, 4, 5]\n */\n\nvar flattenDeep = function (arr, result) {\n if (result === void 0) {\n result = [];\n }\n\n if (!Object(__WEBPACK_IMPORTED_MODULE_0__is_array__["a" /* default */])(arr)) {\n result.push(arr);\n } else {\n for (var i = 0; i < arr.length; i += 1) {\n flattenDeep(arr[i], result);\n }\n }\n\n return result;\n};\n\n/* harmony default export */ __webpack_exports__["a"] = (flattenDeep);\n\n/***/ }),\n/* 40 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__is_array__ = __webpack_require__(0);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__filter__ = __webpack_require__(14);\n\n\n\nvar getRange = function (values) {\n // 存在 NaN 时,min,max 判定会出问题\n values = Object(__WEBPACK_IMPORTED_MODULE_1__filter__["a" /* default */])(values, function (v) {\n return !isNaN(v);\n });\n\n if (!values.length) {\n // 如果没有数值则直接返回0\n return {\n min: 0,\n max: 0\n };\n }\n\n if (Object(__WEBPACK_IMPORTED_MODULE_0__is_array__["a" /* default */])(values[0])) {\n var tmp = [];\n\n for (var i = 0; i < values.length; i++) {\n tmp = tmp.concat(values[i]);\n }\n\n values = tmp;\n }\n\n var max = Math.max.apply(null, values);\n var min = Math.min.apply(null, values);\n return {\n min: min,\n max: max\n };\n};\n\n/* harmony default export */ __webpack_exports__["a"] = (getRange);\n\n/***/ }),\n/* 41 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\nvar arrPrototype = Array.prototype;\nvar splice = arrPrototype.splice;\nvar indexOf = arrPrototype.indexOf;\n\nvar pull = function (arr) {\n var values = [];\n\n for (var _i = 1; _i < arguments.length; _i++) {\n values[_i - 1] = arguments[_i];\n }\n\n for (var i = 0; i < values.length; i++) {\n var value = values[i];\n var fromIndex = -1;\n\n while ((fromIndex = indexOf.call(arr, value)) > -1) {\n splice.call(arr, fromIndex, 1);\n }\n }\n\n return arr;\n};\n\n/* harmony default export */ __webpack_exports__["a"] = (pull);\n\n/***/ }),\n/* 42 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__each__ = __webpack_require__(2);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__is_array__ = __webpack_require__(0);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__is_plain_object__ = __webpack_require__(9);\n\n\n\n\nvar reduce = function (arr, fn, init) {\n if (!Object(__WEBPACK_IMPORTED_MODULE_1__is_array__["a" /* default */])(arr) && !Object(__WEBPACK_IMPORTED_MODULE_2__is_plain_object__["a" /* default */])(arr)) {\n return arr;\n }\n\n var result = init;\n Object(__WEBPACK_IMPORTED_MODULE_0__each__["a" /* default */])(arr, function (data, i) {\n result = fn(result, data, i);\n });\n return result;\n};\n\n/* harmony default export */ __webpack_exports__["a"] = (reduce);\n\n/***/ }),\n/* 43 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__is_array_like__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__pull_at__ = __webpack_require__(21);\n\n\n\nvar remove = function (arr, predicate) {\n /**\n * const arr = [1, 2, 3, 4]\n * const evens = remove(arr, n => n % 2 == 0)\n * console.log(arr) // => [1, 3]\n * console.log(evens) // => [2, 4]\n */\n var result = [];\n\n if (!Object(__WEBPACK_IMPORTED_MODULE_0__is_array_like__["a" /* default */])(arr)) {\n return result;\n }\n\n var i = -1;\n var indexes = [];\n var length = arr.length;\n\n while (++i < length) {\n var value = arr[i];\n\n if (predicate(value, i, arr)) {\n result.push(value);\n indexes.push(i);\n }\n }\n\n Object(__WEBPACK_IMPORTED_MODULE_1__pull_at__["a" /* default */])(arr, indexes);\n return result;\n};\n\n/* harmony default export */ __webpack_exports__["a"] = (remove);\n\n/***/ }),\n/* 44 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__is_array__ = __webpack_require__(0);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__is_string__ = __webpack_require__(8);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__is_function__ = __webpack_require__(3);\n\n\n\n\nfunction sortBy(arr, key) {\n var comparer;\n\n if (Object(__WEBPACK_IMPORTED_MODULE_2__is_function__["a" /* default */])(key)) {\n comparer = function (a, b) {\n return key(a) - key(b);\n };\n } else {\n var keys_1 = [];\n\n if (Object(__WEBPACK_IMPORTED_MODULE_1__is_string__["a" /* default */])(key)) {\n keys_1.push(key);\n } else if (Object(__WEBPACK_IMPORTED_MODULE_0__is_array__["a" /* default */])(key)) {\n keys_1 = key;\n }\n\n comparer = function (a, b) {\n for (var i = 0; i < keys_1.length; i += 1) {\n var prop = keys_1[i];\n\n if (a[prop] > b[prop]) {\n return 1;\n }\n\n if (a[prop] < b[prop]) {\n return -1;\n }\n }\n\n return 0;\n };\n }\n\n arr.sort(comparer);\n return arr;\n}\n\n/* harmony default export */ __webpack_exports__["a"] = (sortBy);\n\n/***/ }),\n/* 45 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__uniq__ = __webpack_require__(22);\n\n\nvar union = function () {\n var sources = [];\n\n for (var _i = 0; _i < arguments.length; _i++) {\n sources[_i] = arguments[_i];\n }\n\n return Object(__WEBPACK_IMPORTED_MODULE_0__uniq__["a" /* default */])([].concat.apply([], sources));\n};\n\n/* harmony default export */ __webpack_exports__["a"] = (union);\n\n/***/ }),\n/* 46 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__each__ = __webpack_require__(2);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__is_array__ = __webpack_require__(0);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__is_nil__ = __webpack_require__(6);\n\n\n\n/* harmony default export */ __webpack_exports__["a"] = (function (data, name) {\n var rst = [];\n var tmpMap = {};\n data.forEach(function (obj) {\n var value = obj[name];\n\n if (!Object(__WEBPACK_IMPORTED_MODULE_2__is_nil__["a" /* default */])(value)) {\n // flatten\n if (!Object(__WEBPACK_IMPORTED_MODULE_1__is_array__["a" /* default */])(value)) {\n value = [value];\n }\n\n Object(__WEBPACK_IMPORTED_MODULE_0__each__["a" /* default */])(value, function (val) {\n // unique\n if (!tmpMap[val]) {\n rst.push(val);\n tmpMap[val] = true;\n }\n });\n }\n });\n return rst;\n});\n\n/***/ }),\n/* 47 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony export (immutable) */ __webpack_exports__["a"] = head;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__is_array_like__ = __webpack_require__(1);\n\nfunction head(o) {\n if (Object(__WEBPACK_IMPORTED_MODULE_0__is_array_like__["a" /* default */])(o)) {\n return o[0];\n }\n\n return undefined;\n}\n\n/***/ }),\n/* 48 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony export (immutable) */ __webpack_exports__["a"] = last;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__is_array_like__ = __webpack_require__(1);\n\nfunction last(o) {\n if (Object(__WEBPACK_IMPORTED_MODULE_0__is_array_like__["a" /* default */])(o)) {\n var arr = o;\n return arr[arr.length - 1];\n }\n\n return undefined;\n}\n\n/***/ }),\n/* 49 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__is_array__ = __webpack_require__(0);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__is_string__ = __webpack_require__(8);\n\n\n\nfunction startsWith(arr, e) {\n return Object(__WEBPACK_IMPORTED_MODULE_0__is_array__["a" /* default */])(arr) || Object(__WEBPACK_IMPORTED_MODULE_1__is_string__["a" /* default */])(arr) ? arr[0] === e : false;\n}\n\n/* harmony default export */ __webpack_exports__["a"] = (startsWith);\n\n/***/ }),\n/* 50 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__is_array__ = __webpack_require__(0);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__is_string__ = __webpack_require__(8);\n\n\n\nfunction endsWith(arr, e) {\n return Object(__WEBPACK_IMPORTED_MODULE_0__is_array__["a" /* default */])(arr) || Object(__WEBPACK_IMPORTED_MODULE_1__is_string__["a" /* default */])(arr) ? arr[arr.length - 1] === e : false;\n}\n\n/* harmony default export */ __webpack_exports__["a"] = (endsWith);\n\n/***/ }),\n/* 51 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/**\n * 只要有一个不满足条件就返回 false\n * @param arr\n * @param func\n */\nvar every = function (arr, func) {\n for (var i = 0; i < arr.length; i++) {\n if (!func(arr[i], i)) return false;\n }\n\n return true;\n};\n\n/* harmony default export */ __webpack_exports__["a"] = (every);\n\n/***/ }),\n/* 52 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/**\n * 只要有一个满足条件就返回 true\n * @param arr\n * @param func\n */\nvar some = function (arr, func) {\n for (var i = 0; i < arr.length; i++) {\n if (func(arr[i], i)) return true;\n }\n\n return false;\n};\n\n/* harmony default export */ __webpack_exports__["a"] = (some);\n\n/***/ }),\n/* 53 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__group_to_map__ = __webpack_require__(23);\n\n/* harmony default export */ __webpack_exports__["a"] = (function (data, condition) {\n if (!condition) {\n // 没有条件,则自身改成数组\n return [data];\n }\n\n var groups = Object(__WEBPACK_IMPORTED_MODULE_0__group_to_map__["a" /* default */])(data, condition);\n var array = [];\n\n for (var i in groups) {\n array.push(groups[i]);\n }\n\n return array;\n});\n\n/***/ }),\n/* 54 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/**\n * 获取封装的事件\n * @protected\n * @param {Object} obj 对象\n * @param {String} action 事件名称\n * @return {Function} 返回事件处理函数\n */\nfunction getWrapBehavior(obj, action) {\n return obj[\'_wrap_\' + action];\n}\n\n/* harmony default export */ __webpack_exports__["a"] = (getWrapBehavior);\n\n/***/ }),\n/* 55 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/**\n * 封装事件,便于使用上下文this,和便于解除事件时使用\n * @protected\n * @param {Object} obj 对象\n * @param {String} action 事件名称\n * @return {Function} 返回事件处理函数\n */\nfunction wrapBehavior(obj, action) {\n if (obj[\'_wrap_\' + action]) {\n return obj[\'_wrap_\' + action];\n }\n\n var method = function (e) {\n obj[action](e);\n };\n\n obj[\'_wrap_\' + action] = method;\n return method;\n}\n\n/* harmony default export */ __webpack_exports__["a"] = (wrapBehavior);\n\n/***/ }),\n/* 56 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\nvar numColorCache = {};\n\nfunction numberToColor(num) {\n // 增加缓存\n var color = numColorCache[num];\n\n if (!color) {\n var str = num.toString(16);\n\n for (var i = str.length; i < 6; i++) {\n str = \'0\' + str;\n }\n\n color = \'#\' + str;\n numColorCache[num] = color;\n }\n\n return color;\n}\n\n/* harmony default export */ __webpack_exports__["a"] = (numberToColor);\n\n/***/ }),\n/* 57 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__is_array__ = __webpack_require__(0);\n\n\nfunction parseRadius(radius) {\n var r1 = 0,\n r2 = 0,\n r3 = 0,\n r4 = 0;\n\n if (Object(__WEBPACK_IMPORTED_MODULE_0__is_array__["a" /* default */])(radius)) {\n if (radius.length === 1) {\n r1 = r2 = r3 = r4 = radius[0];\n } else if (radius.length === 2) {\n r1 = r3 = radius[0];\n r2 = r4 = radius[1];\n } else if (radius.length === 3) {\n r1 = radius[0];\n r2 = r4 = radius[1];\n r3 = radius[2];\n } else {\n r1 = radius[0];\n r2 = radius[1];\n r3 = radius[2];\n r4 = radius[3];\n }\n } else {\n r1 = r2 = r3 = r4 = radius;\n }\n\n return {\n r1: r1,\n r2: r2,\n r3: r3,\n r4: r4\n };\n}\n\n/* harmony default export */ __webpack_exports__["a"] = (parseRadius);\n\n/***/ }),\n/* 58 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\nvar clamp = function (a, min, max) {\n if (a < min) {\n return min;\n } else if (a > max) {\n return max;\n }\n\n return a;\n};\n\n/* harmony default export */ __webpack_exports__["a"] = (clamp);\n\n/***/ }),\n/* 59 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\nvar fixedBase = function (v, base) {\n var str = base.toString();\n var index = str.indexOf(\'.\');\n\n if (index === -1) {\n return Math.round(v);\n }\n\n var length = str.substr(index + 1).length;\n\n if (length > 20) {\n length = 20;\n }\n\n return parseFloat(v.toFixed(length));\n};\n\n/* harmony default export */ __webpack_exports__["a"] = (fixedBase);\n\n/***/ }),\n/* 60 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__is_number__ = __webpack_require__(5);\n\n\nvar isDecimal = function (num) {\n return Object(__WEBPACK_IMPORTED_MODULE_0__is_number__["a" /* default */])(num) && num % 1 !== 0;\n};\n\n/* harmony default export */ __webpack_exports__["a"] = (isDecimal);\n\n/***/ }),\n/* 61 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__is_number__ = __webpack_require__(5);\n\n\nvar isEven = function (num) {\n return Object(__WEBPACK_IMPORTED_MODULE_0__is_number__["a" /* default */])(num) && num % 2 === 0;\n};\n\n/* harmony default export */ __webpack_exports__["a"] = (isEven);\n\n/***/ }),\n/* 62 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__is_number__ = __webpack_require__(5);\n\nvar isInteger = Number.isInteger ? Number.isInteger : function (num) {\n return Object(__WEBPACK_IMPORTED_MODULE_0__is_number__["a" /* default */])(num) && num % 1 === 0;\n};\n/* harmony default export */ __webpack_exports__["a"] = (isInteger);\n\n/***/ }),\n/* 63 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__is_number__ = __webpack_require__(5);\n\n\nvar isNegative = function (num) {\n return Object(__WEBPACK_IMPORTED_MODULE_0__is_number__["a" /* default */])(num) && num < 0;\n};\n\n/* harmony default export */ __webpack_exports__["a"] = (isNegative);\n\n/***/ }),\n/* 64 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony export (immutable) */ __webpack_exports__["a"] = isNumberEqual;\nvar PRECISION = 0.00001; // numbers less than this is considered as 0\n\nfunction isNumberEqual(a, b, precision) {\n if (precision === void 0) {\n precision = PRECISION;\n }\n\n return Math.abs(a - b) < precision;\n}\n;\n\n/***/ }),\n/* 65 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__is_number__ = __webpack_require__(5);\n\n\nvar isOdd = function (num) {\n return Object(__WEBPACK_IMPORTED_MODULE_0__is_number__["a" /* default */])(num) && num % 2 !== 0;\n};\n\n/* harmony default export */ __webpack_exports__["a"] = (isOdd);\n\n/***/ }),\n/* 66 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__is_number__ = __webpack_require__(5);\n\n\nvar isPositive = function (num) {\n return Object(__WEBPACK_IMPORTED_MODULE_0__is_number__["a" /* default */])(num) && num > 0;\n};\n\n/* harmony default export */ __webpack_exports__["a"] = (isPositive);\n\n/***/ }),\n/* 67 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__each__ = __webpack_require__(2);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__is_array__ = __webpack_require__(0);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__is_function__ = __webpack_require__(3);\n\n\n\n/**\n * @param {Array} arr The array to iterate over.\n * @param {Function} [fn] The iteratee invoked per element.\n * @return {*} Returns the maximum value.\n * @example\n *\n * var objects = [{ \'n\': 1 }, { \'n\': 2 }];\n *\n * maxBy(objects, function(o) { return o.n; });\n * // => { \'n\': 2 }\n *\n * maxBy(objects, \'n\');\n * // => { \'n\': 2 }\n */\n\n/* harmony default export */ __webpack_exports__["a"] = (function (arr, fn) {\n if (!Object(__WEBPACK_IMPORTED_MODULE_1__is_array__["a" /* default */])(arr)) {\n return undefined;\n }\n\n var max = arr[0];\n var maxData;\n\n if (Object(__WEBPACK_IMPORTED_MODULE_2__is_function__["a" /* default */])(fn)) {\n maxData = fn(arr[0]);\n } else {\n maxData = arr[0][fn];\n }\n\n var data;\n Object(__WEBPACK_IMPORTED_MODULE_0__each__["a" /* default */])(arr, function (val) {\n if (Object(__WEBPACK_IMPORTED_MODULE_2__is_function__["a" /* default */])(fn)) {\n data = fn(val);\n } else {\n data = val[fn];\n }\n\n if (data > maxData) {\n max = val;\n maxData = data;\n }\n });\n return max;\n});\n\n/***/ }),\n/* 68 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__each__ = __webpack_require__(2);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__is_array__ = __webpack_require__(0);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__is_function__ = __webpack_require__(3);\n\n\n\n/**\n * @param {Array} arr The array to iterate over.\n * @param {Function} [fn] The iteratee invoked per element.\n * @return {*} Returns the minimum value.\n * @example\n *\n * var objects = [{ \'n\': 1 }, { \'n\': 2 }];\n *\n * minBy(objects, function(o) { return o.n; });\n * // => { \'n\': 1 }\n *\n * minBy(objects, \'n\');\n * // => { \'n\': 1 }\n */\n\n/* harmony default export */ __webpack_exports__["a"] = (function (arr, fn) {\n if (!Object(__WEBPACK_IMPORTED_MODULE_1__is_array__["a" /* default */])(arr)) {\n return undefined;\n }\n\n var min = arr[0];\n var minData;\n\n if (Object(__WEBPACK_IMPORTED_MODULE_2__is_function__["a" /* default */])(fn)) {\n minData = fn(arr[0]);\n } else {\n minData = arr[0][fn];\n }\n\n var data;\n Object(__WEBPACK_IMPORTED_MODULE_0__each__["a" /* default */])(arr, function (val) {\n if (Object(__WEBPACK_IMPORTED_MODULE_2__is_function__["a" /* default */])(fn)) {\n data = fn(val);\n } else {\n data = val[fn];\n }\n\n if (data < minData) {\n min = val;\n minData = data;\n }\n });\n return min;\n});\n\n/***/ }),\n/* 69 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\nvar mod = function (n, m) {\n return (n % m + m) % m;\n};\n\n/* harmony default export */ __webpack_exports__["a"] = (mod);\n\n/***/ }),\n/* 70 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\nvar DEGREE = 180 / Math.PI;\n\nvar toDegree = function (radian) {\n return DEGREE * radian;\n};\n\n/* harmony default export */ __webpack_exports__["a"] = (toDegree);\n\n/***/ }),\n/* 71 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony default export */ __webpack_exports__["a"] = (parseInt);\n\n/***/ }),\n/* 72 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\nvar RADIAN = Math.PI / 180;\n\nvar toRadian = function (degree) {\n return RADIAN * degree;\n};\n\n/* harmony default export */ __webpack_exports__["a"] = (toRadian);\n\n/***/ }),\n/* 73 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__each__ = __webpack_require__(2);\n\n/* harmony default export */ __webpack_exports__["a"] = (__WEBPACK_IMPORTED_MODULE_0__each__["a" /* default */]);\n\n/***/ }),\n/* 74 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__has__ = __webpack_require__(25);\n\n/* harmony default export */ __webpack_exports__["a"] = (__WEBPACK_IMPORTED_MODULE_0__has__["a" /* default */]);\n\n/***/ }),\n/* 75 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__contains__ = __webpack_require__(12);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__values__ = __webpack_require__(26);\n\n\n/* harmony default export */ __webpack_exports__["a"] = (function (obj, value) {\n return Object(__WEBPACK_IMPORTED_MODULE_0__contains__["a" /* default */])(Object(__WEBPACK_IMPORTED_MODULE_1__values__["a" /* default */])(obj), value);\n});\n\n/***/ }),\n/* 76 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__to_string__ = __webpack_require__(10);\n\n\nvar lowerCase = function (str) {\n return Object(__WEBPACK_IMPORTED_MODULE_0__to_string__["a" /* default */])(str).toLowerCase();\n};\n\n/* harmony default export */ __webpack_exports__["a"] = (lowerCase);\n\n/***/ }),\n/* 77 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__to_string__ = __webpack_require__(10);\n\n\nvar lowerFirst = function (value) {\n var str = Object(__WEBPACK_IMPORTED_MODULE_0__to_string__["a" /* default */])(value);\n return str.charAt(0).toLowerCase() + str.substring(1);\n};\n\n/* harmony default export */ __webpack_exports__["a"] = (lowerFirst);\n\n/***/ }),\n/* 78 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\nfunction substitute(str, o) {\n if (!str || !o) {\n return str;\n }\n\n return str.replace(/\\\\?\\{([^{}]+)\\}/g, function (match, name) {\n if (match.charAt(0) === \'\\\\\') {\n return match.slice(1);\n }\n\n return o[name] === undefined ? \'\' : o[name];\n });\n}\n\n/* harmony default export */ __webpack_exports__["a"] = (substitute);\n\n/***/ }),\n/* 79 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__to_string__ = __webpack_require__(10);\n\n\nvar upperCase = function (str) {\n return Object(__WEBPACK_IMPORTED_MODULE_0__to_string__["a" /* default */])(str).toUpperCase();\n};\n\n/* harmony default export */ __webpack_exports__["a"] = (upperCase);\n\n/***/ }),\n/* 80 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__to_string__ = __webpack_require__(10);\n\n\nvar upperFirst = function (value) {\n var str = Object(__WEBPACK_IMPORTED_MODULE_0__to_string__["a" /* default */])(value);\n return str.charAt(0).toUpperCase() + str.substring(1);\n};\n\n/* harmony default export */ __webpack_exports__["a"] = (upperFirst);\n\n/***/ }),\n/* 81 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__is_type__ = __webpack_require__(4);\n/**\n * 是否是参数类型\n *\n * @param {Object} value 测试的值\n * @return {Boolean}\n */\n\n\nvar isArguments = function (value) {\n return Object(__WEBPACK_IMPORTED_MODULE_0__is_type__["a" /* default */])(value, \'Arguments\');\n};\n\n/* harmony default export */ __webpack_exports__["a"] = (isArguments);\n\n/***/ }),\n/* 82 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__is_type__ = __webpack_require__(4);\n/**\n * 是否是布尔类型\n *\n * @param {Object} value 测试的值\n * @return {Boolean}\n */\n\n\nvar isBoolean = function (value) {\n return Object(__WEBPACK_IMPORTED_MODULE_0__is_type__["a" /* default */])(value, \'Boolean\');\n};\n\n/* harmony default export */ __webpack_exports__["a"] = (isBoolean);\n\n/***/ }),\n/* 83 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__is_type__ = __webpack_require__(4);\n\n\nvar isDate = function (value) {\n return Object(__WEBPACK_IMPORTED_MODULE_0__is_type__["a" /* default */])(value, \'Date\');\n};\n\n/* harmony default export */ __webpack_exports__["a"] = (isDate);\n\n/***/ }),\n/* 84 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__is_type__ = __webpack_require__(4);\n/**\n * 是否是参数类型\n *\n * @param {Object} value 测试的值\n * @return {Boolean}\n */\n\n\nvar isError = function (value) {\n return Object(__WEBPACK_IMPORTED_MODULE_0__is_type__["a" /* default */])(value, \'Error\');\n};\n\n/* harmony default export */ __webpack_exports__["a"] = (isError);\n\n/***/ }),\n/* 85 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__is_number__ = __webpack_require__(5);\n/**\n * 判断是否为有限数\n * @return {Boolean}\n */\n\n/* harmony default export */ __webpack_exports__["a"] = (function (value) {\n return Object(__WEBPACK_IMPORTED_MODULE_0__is_number__["a" /* default */])(value) && isFinite(value);\n});\n\n/***/ }),\n/* 86 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\nvar isNull = function (value) {\n return value === null;\n};\n\n/* harmony default export */ __webpack_exports__["a"] = (isNull);\n\n/***/ }),\n/* 87 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__is_type__ = __webpack_require__(4);\n\n\nvar isRegExp = function (str) {\n return Object(__WEBPACK_IMPORTED_MODULE_0__is_type__["a" /* default */])(str, \'RegExp\');\n};\n\n/* harmony default export */ __webpack_exports__["a"] = (isRegExp);\n\n/***/ }),\n/* 88 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\nvar isUndefined = function (value) {\n return value === undefined;\n};\n\n/* harmony default export */ __webpack_exports__["a"] = (isUndefined);\n\n/***/ }),\n/* 89 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/**\n * 判断是否HTML元素\n * @return {Boolean} 是否HTML元素\n */\nvar isElement = function (o) {\n return o instanceof Element || o instanceof HTMLDocument;\n};\n\n/* harmony default export */ __webpack_exports__["a"] = (isElement);\n\n/***/ }),\n/* 90 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony export (immutable) */ __webpack_exports__["a"] = requestAnimationFrame;\nfunction requestAnimationFrame(fn) {\n var method = window.requestAnimationFrame || window.webkitRequestAnimationFrame || // @ts-ignore\n window.mozRequestAnimationFrame || // @ts-ignore\n window.msRequestAnimationFrame || function (f) {\n return setTimeout(f, 16);\n };\n\n return method(fn);\n}\n;\n\n/***/ }),\n/* 91 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony export (immutable) */ __webpack_exports__["a"] = cancelAnimationFrame;\nfunction cancelAnimationFrame(handler) {\n var method = window.cancelAnimationFrame || window.webkitCancelAnimationFrame || // @ts-ignore\n window.mozCancelAnimationFrame || // @ts-ignore\n window.msCancelAnimationFrame || clearTimeout;\n method(handler);\n}\n;\n\n/***/ }),\n/* 92 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__mix__ = __webpack_require__(16);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__is_function__ = __webpack_require__(3);\n\n\n\nvar augment = function () {\n var args = [];\n\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n\n var c = args[0];\n\n for (var i = 1; i < args.length; i++) {\n var obj = args[i];\n\n if (Object(__WEBPACK_IMPORTED_MODULE_1__is_function__["a" /* default */])(obj)) {\n obj = obj.prototype;\n }\n\n Object(__WEBPACK_IMPORTED_MODULE_0__mix__["a" /* default */])(c.prototype, obj);\n }\n};\n\n/* harmony default export */ __webpack_exports__["a"] = (augment);\n\n/***/ }),\n/* 93 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__is_array__ = __webpack_require__(0);\n\n\nvar clone = function (obj) {\n if (typeof obj !== \'object\' || obj === null) {\n return obj;\n }\n\n var rst;\n\n if (Object(__WEBPACK_IMPORTED_MODULE_0__is_array__["a" /* default */])(obj)) {\n rst = [];\n\n for (var i = 0, l = obj.length; i < l; i++) {\n if (typeof obj[i] === \'object\' && obj[i] != null) {\n rst[i] = clone(obj[i]);\n } else {\n rst[i] = obj[i];\n }\n }\n } else {\n rst = {};\n\n for (var k in obj) {\n if (typeof obj[k] === \'object\' && obj[k] != null) {\n rst[k] = clone(obj[k]);\n } else {\n rst[k] = obj[k];\n }\n }\n }\n\n return rst;\n};\n\n/* harmony default export */ __webpack_exports__["a"] = (clone);\n\n/***/ }),\n/* 94 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\nfunction debounce(func, wait, immediate) {\n var timeout;\n return function () {\n var context = this,\n args = arguments;\n\n var later = function () {\n timeout = null;\n\n if (!immediate) {\n func.apply(context, args);\n }\n };\n\n var callNow = immediate && !timeout;\n clearTimeout(timeout);\n timeout = setTimeout(later, wait);\n\n if (callNow) {\n func.apply(context, args);\n }\n };\n}\n\n/* harmony default export */ __webpack_exports__["a"] = (debounce);\n\n/***/ }),\n/* 95 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__is_function__ = __webpack_require__(3);\n\n/**\n * _.memoize(calColor);\n * _.memoize(calColor, (...args) => args[0]);\n * @param f\n * @param resolver\n */\n\n/* harmony default export */ __webpack_exports__["a"] = (function (f, resolver) {\n if (!Object(__WEBPACK_IMPORTED_MODULE_0__is_function__["a" /* default */])(f)) {\n throw new TypeError(\'Expected a function\');\n }\n\n var memoized = function () {\n var args = [];\n\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n } // 使用方法构造 key,如果不存在 resolver,则直接取第一个参数作为 key\n\n\n var key = resolver ? resolver.apply(this, args) : args[0];\n var cache = memoized.cache;\n\n if (cache.has(key)) {\n return cache.get(key);\n }\n\n var result = f.apply(this, args); // 缓存起来\n\n cache.set(key, result);\n return result;\n };\n\n memoized.cache = new Map();\n return memoized;\n});\n\n/***/ }),\n/* 96 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__is_array__ = __webpack_require__(0);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__is_plain_object__ = __webpack_require__(9);\n\n\nvar MAX_MIX_LEVEL = 5;\n\nfunction _deepMix(dist, src, level, maxLevel) {\n level = level || 0;\n maxLevel = maxLevel || MAX_MIX_LEVEL;\n\n for (var key in src) {\n if (src.hasOwnProperty(key)) {\n var value = src[key];\n\n if (value !== null && Object(__WEBPACK_IMPORTED_MODULE_1__is_plain_object__["a" /* default */])(value)) {\n if (!Object(__WEBPACK_IMPORTED_MODULE_1__is_plain_object__["a" /* default */])(dist[key])) {\n dist[key] = {};\n }\n\n if (level < maxLevel) {\n _deepMix(dist[key], value, level + 1, maxLevel);\n } else {\n dist[key] = src[key];\n }\n } else if (Object(__WEBPACK_IMPORTED_MODULE_0__is_array__["a" /* default */])(value)) {\n dist[key] = [];\n dist[key] = dist[key].concat(value);\n } else if (value !== undefined) {\n dist[key] = value;\n }\n }\n }\n} // todo 重写\n\n\nvar deepMix = function (rst) {\n var args = [];\n\n for (var _i = 1; _i < arguments.length; _i++) {\n args[_i - 1] = arguments[_i];\n }\n\n for (var i = 0; i < args.length; i += 1) {\n _deepMix(rst, args[i]);\n }\n\n return rst;\n};\n\n/* harmony default export */ __webpack_exports__["a"] = (deepMix);\n\n/***/ }),\n/* 97 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__mix__ = __webpack_require__(16);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__is_function__ = __webpack_require__(3);\n\n\n\nvar extend = function (subclass, superclass, overrides, staticOverrides) {\n // 如果只提供父类构造函数,则自动生成子类构造函数\n if (!Object(__WEBPACK_IMPORTED_MODULE_1__is_function__["a" /* default */])(superclass)) {\n overrides = superclass;\n superclass = subclass;\n\n subclass = function () {};\n }\n\n var create = Object.create ? function (proto, c) {\n return Object.create(proto, {\n constructor: {\n value: c\n }\n });\n } : function (proto, c) {\n function Tmp() {}\n\n Tmp.prototype = proto;\n var o = new Tmp();\n o.constructor = c;\n return o;\n };\n var superObj = create(superclass.prototype, subclass); // new superclass(),//实例化父类作为子类的prototype\n\n subclass.prototype = Object(__WEBPACK_IMPORTED_MODULE_0__mix__["a" /* default */])(superObj, subclass.prototype); // 指定子类的prototype\n\n subclass.superclass = create(superclass.prototype, superclass);\n Object(__WEBPACK_IMPORTED_MODULE_0__mix__["a" /* default */])(superObj, overrides);\n Object(__WEBPACK_IMPORTED_MODULE_0__mix__["a" /* default */])(subclass, staticOverrides);\n return subclass;\n};\n\n/* harmony default export */ __webpack_exports__["a"] = (extend);\n\n/***/ }),\n/* 98 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__is_array_like__ = __webpack_require__(1);\n\n\nvar indexOf = function (arr, obj) {\n if (!Object(__WEBPACK_IMPORTED_MODULE_0__is_array_like__["a" /* default */])(arr)) {\n return -1;\n }\n\n var m = Array.prototype.indexOf;\n\n if (m) {\n return m.call(arr, obj);\n }\n\n var index = -1;\n\n for (var i = 0; i < arr.length; i++) {\n if (arr[i] === obj) {\n index = i;\n break;\n }\n }\n\n return index;\n};\n\n/* harmony default export */ __webpack_exports__["a"] = (indexOf);\n\n/***/ }),\n/* 99 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__is_nil__ = __webpack_require__(6);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__is_array_like__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__get_type__ = __webpack_require__(27);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__is_prototype__ = __webpack_require__(28);\n\n\n\n\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n\nfunction isEmpty(value) {\n /**\n * isEmpty(null) => true\n * isEmpty() => true\n * isEmpty(true) => true\n * isEmpty(1) => true\n * isEmpty([1, 2, 3]) => false\n * isEmpty(\'abc\') => false\n * isEmpty({ a: 1 }) => false\n */\n if (Object(__WEBPACK_IMPORTED_MODULE_0__is_nil__["a" /* default */])(value)) {\n return true;\n }\n\n if (Object(__WEBPACK_IMPORTED_MODULE_1__is_array_like__["a" /* default */])(value)) {\n return !value.length;\n }\n\n var type = Object(__WEBPACK_IMPORTED_MODULE_2__get_type__["a" /* default */])(value);\n\n if (type === \'Map\' || type === \'Set\') {\n return !value.size;\n }\n\n if (Object(__WEBPACK_IMPORTED_MODULE_3__is_prototype__["a" /* default */])(value)) {\n return !Object.keys(value).length;\n }\n\n for (var key in value) {\n if (hasOwnProperty.call(value, key)) {\n return false;\n }\n }\n\n return true;\n}\n\n/* harmony default export */ __webpack_exports__["a"] = (isEmpty);\n\n/***/ }),\n/* 100 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__is_function__ = __webpack_require__(3);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__is_equal__ = __webpack_require__(29);\n\n\n/**\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {Function} [fn] The function to customize comparisons.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * function isGreeting(value) {\n * return /^h(?:i|ello)$/.test(value);\n * }\n *\n * function customizer(objValue, othValue) {\n * if (isGreeting(objValue) && isGreeting(othValue)) {\n * return true;\n * }\n * }\n *\n * var array = [\'hello\', \'goodbye\'];\n * var other = [\'hi\', \'goodbye\'];\n *\n * isEqualWith(array, other, customizer); // => true\n */\n\n/* harmony default export */ __webpack_exports__["a"] = (function (value, other, fn) {\n if (!Object(__WEBPACK_IMPORTED_MODULE_0__is_function__["a" /* default */])(fn)) {\n return Object(__WEBPACK_IMPORTED_MODULE_1__is_equal__["a" /* default */])(value, other);\n }\n\n return !!fn(value, other);\n});\n\n/***/ }),\n/* 101 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__each__ = __webpack_require__(2);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__is_array_like__ = __webpack_require__(1);\n\n\n\nvar map = function (arr, func) {\n if (!Object(__WEBPACK_IMPORTED_MODULE_1__is_array_like__["a" /* default */])(arr)) {\n // @ts-ignore\n return arr;\n }\n\n var result = [];\n Object(__WEBPACK_IMPORTED_MODULE_0__each__["a" /* default */])(arr, function (value, index) {\n result.push(func(value, index));\n });\n return result;\n};\n\n/* harmony default export */ __webpack_exports__["a"] = (map);\n\n/***/ }),\n/* 102 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__is_nil__ = __webpack_require__(6);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__is_object__ = __webpack_require__(13);\n\n\n\nvar identity = function (v) {\n return v;\n};\n\n/* harmony default export */ __webpack_exports__["a"] = (function (object, func) {\n if (func === void 0) {\n func = identity;\n }\n\n var r = {};\n\n if (Object(__WEBPACK_IMPORTED_MODULE_1__is_object__["a" /* default */])(object) && !Object(__WEBPACK_IMPORTED_MODULE_0__is_nil__["a" /* default */])(object)) {\n Object.keys(object).forEach(function (key) {\n // @ts-ignore\n r[key] = func(object[key], key);\n });\n }\n\n return r;\n});\n\n/***/ }),\n/* 103 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__is_string__ = __webpack_require__(8);\n\n/**\n * https://github.com/developit/dlv/blob/master/index.js\n * @param obj\n * @param key\n * @param defaultValue\n */\n\n/* harmony default export */ __webpack_exports__["a"] = (function (obj, key, defaultValue) {\n var p = 0;\n var keyArr = Object(__WEBPACK_IMPORTED_MODULE_0__is_string__["a" /* default */])(key) ? key.split(\'.\') : key;\n\n while (obj && p < keyArr.length) {\n obj = obj[keyArr[p++]];\n }\n\n return obj === undefined || p < keyArr.length ? defaultValue : obj;\n});\n\n/***/ }),\n/* 104 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__is_object__ = __webpack_require__(13);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__is_string__ = __webpack_require__(8);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__is_number__ = __webpack_require__(5);\n\n\n\n/**\n * https://github.com/developit/dlv/blob/master/index.js\n * @param obj\n * @param path\n * @param value\n */\n\n/* harmony default export */ __webpack_exports__["a"] = (function (obj, path, value) {\n var o = obj;\n var keyArr = Object(__WEBPACK_IMPORTED_MODULE_1__is_string__["a" /* default */])(path) ? path.split(\'.\') : path;\n keyArr.forEach(function (key, idx) {\n // 不是最后一个\n if (idx < keyArr.length - 1) {\n if (!Object(__WEBPACK_IMPORTED_MODULE_0__is_object__["a" /* default */])(o[key])) {\n o[key] = Object(__WEBPACK_IMPORTED_MODULE_2__is_number__["a" /* default */])(keyArr[idx + 1]) ? [] : {};\n }\n\n o = o[key];\n } else {\n o[key] = value;\n }\n });\n return obj;\n});\n\n/***/ }),\n/* 105 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__each__ = __webpack_require__(2);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__is_plain_object__ = __webpack_require__(9);\n\n\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n/* harmony default export */ __webpack_exports__["a"] = (function (object, keys) {\n if (object === null || !Object(__WEBPACK_IMPORTED_MODULE_1__is_plain_object__["a" /* default */])(object)) {\n return {};\n }\n\n var result = {};\n Object(__WEBPACK_IMPORTED_MODULE_0__each__["a" /* default */])(keys, function (key) {\n if (hasOwnProperty.call(object, key)) {\n result[key] = object[key];\n }\n });\n return result;\n});\n\n/***/ }),\n/* 106 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony default export */ __webpack_exports__["a"] = (function (func, wait, options) {\n var timeout, context, args, result;\n var previous = 0;\n if (!options) options = {};\n\n var later = function () {\n previous = options.leading === false ? 0 : Date.now();\n timeout = null;\n result = func.apply(context, args);\n if (!timeout) context = args = null;\n };\n\n var throttled = function () {\n var now = Date.now();\n if (!previous && options.leading === false) previous = now;\n var remaining = wait - (now - previous);\n context = this;\n args = arguments;\n\n if (remaining <= 0 || remaining > wait) {\n if (timeout) {\n clearTimeout(timeout);\n timeout = null;\n }\n\n previous = now;\n result = func.apply(context, args);\n if (!timeout) context = args = null;\n } else if (!timeout && options.trailing !== false) {\n timeout = setTimeout(later, remaining);\n }\n\n return result;\n };\n\n throttled.cancel = function () {\n clearTimeout(timeout);\n previous = 0;\n timeout = context = args = null;\n };\n\n return throttled;\n});\n\n/***/ }),\n/* 107 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__is_array_like__ = __webpack_require__(1);\n\n/* harmony default export */ __webpack_exports__["a"] = (function (value) {\n return Object(__WEBPACK_IMPORTED_MODULE_0__is_array_like__["a" /* default */])(value) ? Array.prototype.slice.call(value) : [];\n});\n\n/***/ }),\n/* 108 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\nvar map = {};\n/* harmony default export */ __webpack_exports__["a"] = (function (prefix) {\n prefix = prefix || \'g\';\n\n if (!map[prefix]) {\n map[prefix] = 1;\n } else {\n map[prefix] += 1;\n }\n\n return prefix + map[prefix];\n});\n\n/***/ }),\n/* 109 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony default export */ __webpack_exports__["a"] = (function () {});\n\n/***/ }),\n/* 110 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony default export */ __webpack_exports__["a"] = (function (v) {\n return v;\n});\n\n/***/ }),\n/* 111 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony export (immutable) */ __webpack_exports__["a"] = size;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__is_nil__ = __webpack_require__(6);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__is_array_like__ = __webpack_require__(1);\n\n\nfunction size(o) {\n if (Object(__WEBPACK_IMPORTED_MODULE_0__is_nil__["a" /* default */])(o)) {\n return 0;\n }\n\n if (Object(__WEBPACK_IMPORTED_MODULE_1__is_array_like__["a" /* default */])(o)) {\n return o.length;\n }\n\n return Object.keys(o).length;\n}\n\n/***/ }),\n/* 112 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/**\n * k-v 存储\n */\nvar default_1 =\n/** @class */\nfunction () {\n function default_1() {\n this.map = {};\n }\n\n default_1.prototype.has = function (key) {\n return this.map[key] !== undefined;\n };\n\n default_1.prototype.get = function (key, def) {\n var v = this.map[key];\n return v === undefined ? def : v;\n };\n\n default_1.prototype.set = function (key, value) {\n this.map[key] = value;\n };\n\n default_1.prototype.clear = function () {\n this.map = {};\n };\n\n default_1.prototype.delete = function (key) {\n delete this.map[key];\n };\n\n default_1.prototype.size = function () {\n return Object.keys(this.map).length;\n };\n\n return default_1;\n}();\n\n/* harmony default export */ __webpack_exports__["a"] = (default_1);\n\n/***/ }),\n/* 113 */\n/***/ (function(module, exports) {\n\n// wrap tree node\nfunction WrappedTree(w, h, y, c) {\n if (c === void 0) {\n c = [];\n }\n\n var me = this; // size\n\n me.w = w || 0;\n me.h = h || 0; // position\n\n me.y = y || 0;\n me.x = 0; // children\n\n me.c = c || [];\n me.cs = c.length; // modified\n\n me.prelim = 0;\n me.mod = 0;\n me.shift = 0;\n me.change = 0; // left/right tree\n\n me.tl = null;\n me.tr = null; // extreme left/right tree\n\n me.el = null;\n me.er = null; // modified left/right tree\n\n me.msel = 0;\n me.mser = 0;\n}\n\nWrappedTree.fromNode = function (root, isHorizontal) {\n if (!root) return null;\n var children = [];\n root.children.forEach(function (child) {\n children.push(WrappedTree.fromNode(child, isHorizontal));\n });\n if (isHorizontal) return new WrappedTree(root.height, root.width, root.x, children);\n return new WrappedTree(root.width, root.height, root.y, children);\n}; // node utils\n\n\nfunction moveRight(node, move, isHorizontal) {\n if (isHorizontal) {\n node.y += move;\n } else {\n node.x += move;\n }\n\n node.children.forEach(function (child) {\n moveRight(child, move, isHorizontal);\n });\n}\n\nfunction getMin(node, isHorizontal) {\n var res = isHorizontal ? node.y : node.x;\n node.children.forEach(function (child) {\n res = Math.min(getMin(child, isHorizontal), res);\n });\n return res;\n}\n\nfunction normalize(node, isHorizontal) {\n var min = getMin(node, isHorizontal);\n moveRight(node, -min, isHorizontal);\n}\n\nfunction convertBack(converted\n/* WrappedTree */\n, root\n/* TreeNode */\n, isHorizontal) {\n if (isHorizontal) {\n root.y = converted.x;\n } else {\n root.x = converted.x;\n }\n\n converted.c.forEach(function (child, i) {\n convertBack(child, root.children[i], isHorizontal);\n });\n}\n\nfunction layer(node, isHorizontal, d) {\n if (d === void 0) {\n d = 0;\n }\n\n if (isHorizontal) {\n node.x = d;\n d += node.width;\n } else {\n node.y = d;\n d += node.height;\n }\n\n node.children.forEach(function (child) {\n layer(child, isHorizontal, d);\n });\n}\n\nmodule.exports = function (root, options) {\n if (options === void 0) {\n options = {};\n }\n\n var isHorizontal = options.isHorizontal;\n\n function firstWalk(t) {\n if (t.cs === 0) {\n setExtremes(t);\n return;\n }\n\n firstWalk(t.c[0]);\n var ih = updateIYL(bottom(t.c[0].el), 0, null);\n\n for (var i = 1; i < t.cs; ++i) {\n firstWalk(t.c[i]);\n var min = bottom(t.c[i].er);\n separate(t, i, ih);\n ih = updateIYL(min, i, ih);\n }\n\n positionRoot(t);\n setExtremes(t);\n }\n\n function setExtremes(t) {\n if (t.cs === 0) {\n t.el = t;\n t.er = t;\n t.msel = t.mser = 0;\n } else {\n t.el = t.c[0].el;\n t.msel = t.c[0].msel;\n t.er = t.c[t.cs - 1].er;\n t.mser = t.c[t.cs - 1].mser;\n }\n }\n\n function separate(t, i, ih) {\n var sr = t.c[i - 1];\n var mssr = sr.mod;\n var cl = t.c[i];\n var mscl = cl.mod;\n\n while (sr !== null && cl !== null) {\n if (bottom(sr) > ih.low) ih = ih.nxt;\n var dist = mssr + sr.prelim + sr.w - (mscl + cl.prelim);\n\n if (dist > 0) {\n mscl += dist;\n moveSubtree(t, i, ih.index, dist);\n }\n\n var sy = bottom(sr);\n var cy = bottom(cl);\n\n if (sy <= cy) {\n sr = nextRightContour(sr);\n if (sr !== null) mssr += sr.mod;\n }\n\n if (sy >= cy) {\n cl = nextLeftContour(cl);\n if (cl !== null) mscl += cl.mod;\n }\n }\n\n if (!sr && !!cl) {\n setLeftThread(t, i, cl, mscl);\n } else if (!!sr && !cl) {\n setRightThread(t, i, sr, mssr);\n }\n }\n\n function moveSubtree(t, i, si, dist) {\n t.c[i].mod += dist;\n t.c[i].msel += dist;\n t.c[i].mser += dist;\n distributeExtra(t, i, si, dist);\n }\n\n function nextLeftContour(t) {\n return t.cs === 0 ? t.tl : t.c[0];\n }\n\n function nextRightContour(t) {\n return t.cs === 0 ? t.tr : t.c[t.cs - 1];\n }\n\n function bottom(t) {\n return t.y + t.h;\n }\n\n function setLeftThread(t, i, cl, modsumcl) {\n var li = t.c[0].el;\n li.tl = cl;\n var diff = modsumcl - cl.mod - t.c[0].msel;\n li.mod += diff;\n li.prelim -= diff;\n t.c[0].el = t.c[i].el;\n t.c[0].msel = t.c[i].msel;\n }\n\n function setRightThread(t, i, sr, modsumsr) {\n var ri = t.c[i].er;\n ri.tr = sr;\n var diff = modsumsr - sr.mod - t.c[i].mser;\n ri.mod += diff;\n ri.prelim -= diff;\n t.c[i].er = t.c[i - 1].er;\n t.c[i].mser = t.c[i - 1].mser;\n }\n\n function positionRoot(t) {\n t.prelim = (t.c[0].prelim + t.c[0].mod + t.c[t.cs - 1].mod + t.c[t.cs - 1].prelim + t.c[t.cs - 1].w) / 2 - t.w / 2;\n }\n\n function secondWalk(t, modsum) {\n modsum += t.mod;\n t.x = t.prelim + modsum;\n addChildSpacing(t);\n\n for (var i = 0; i < t.cs; i++) {\n secondWalk(t.c[i], modsum);\n }\n }\n\n function distributeExtra(t, i, si, dist) {\n if (si !== i - 1) {\n var nr = i - si;\n t.c[si + 1].shift += dist / nr;\n t.c[i].shift -= dist / nr;\n t.c[i].change -= dist - dist / nr;\n }\n }\n\n function addChildSpacing(t) {\n var d = 0;\n var modsumdelta = 0;\n\n for (var i = 0; i < t.cs; i++) {\n d += t.c[i].shift;\n modsumdelta += d + t.c[i].change;\n t.c[i].mod += modsumdelta;\n }\n }\n\n function updateIYL(low, index, ih) {\n while (ih !== null && low >= ih.low) {\n ih = ih.nxt;\n }\n\n return {\n low: low,\n index: index,\n nxt: ih\n };\n } // do layout\n\n\n layer(root, isHorizontal);\n var wt = WrappedTree.fromNode(root, isHorizontal);\n firstWalk(wt);\n secondWalk(wt, 0);\n convertBack(wt, root, isHorizontal);\n normalize(root, isHorizontal);\n return root;\n};\n\n/***/ }),\n/* 114 */\n/***/ (function(module, exports, __webpack_require__) {\n\nfunction _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; }\n\nvar TreeLayout = __webpack_require__(11);\n\nvar dendrogram = __webpack_require__(115);\n\nvar doTreeLayout = __webpack_require__(17);\n\nvar util = __webpack_require__(7);\n\nvar DendrogramLayout = /*#__PURE__*/function (_TreeLayout) {\n _inheritsLoose(DendrogramLayout, _TreeLayout);\n\n function DendrogramLayout() {\n return _TreeLayout.apply(this, arguments) || this;\n }\n\n var _proto = DendrogramLayout.prototype;\n\n _proto.execute = function execute() {\n var me = this;\n me.rootNode.width = 0;\n return doTreeLayout(me.rootNode, me.options, dendrogram);\n };\n\n return DendrogramLayout;\n}(TreeLayout);\n\nvar DEFAULT_OPTIONS = {};\n\nfunction dendrogramLayout(root, options) {\n options = util.assign({}, DEFAULT_OPTIONS, options);\n return new DendrogramLayout(root, options).execute();\n}\n\nmodule.exports = dendrogramLayout;\n\n/***/ }),\n/* 115 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// wrap tree node\n// TODO considering size\nvar util = __webpack_require__(7);\n\nfunction WrappedTree(height, children) {\n if (height === void 0) {\n height = 0;\n }\n\n if (children === void 0) {\n children = [];\n }\n\n var me = this;\n me.x = me.y = 0;\n me.leftChild = me.rightChild = null;\n me.height = 0;\n me.children = children;\n}\n\nvar DEFAULT_OPTIONS = {\n isHorizontal: true,\n nodeSep: 20,\n nodeSize: 20,\n rankSep: 200,\n subTreeSep: 10\n};\n\nfunction convertBack(converted\n/* WrappedTree */\n, root\n/* TreeNode */\n, isHorizontal) {\n if (isHorizontal) {\n root.x = converted.x;\n root.y = converted.y;\n } else {\n root.x = converted.y;\n root.y = converted.x;\n }\n\n converted.children.forEach(function (child, i) {\n convertBack(child, root.children[i], isHorizontal);\n });\n}\n\nmodule.exports = function (root, options) {\n if (options === void 0) {\n options = {};\n }\n\n options = util.assign({}, DEFAULT_OPTIONS, options);\n var maxDepth = 0;\n\n function wrappedTreeFromNode(n) {\n if (!n) return null;\n n.width = 0;\n\n if (n.depth && n.depth > maxDepth) {\n maxDepth = n.depth; // get the max depth\n }\n\n var children = n.children;\n var childrenCount = children.length;\n var t = new WrappedTree(n.height, []);\n children.forEach(function (child, i) {\n var childWT = wrappedTreeFromNode(child);\n t.children.push(childWT);\n\n if (i === 0) {\n // t.leftChild = childWT.leftChild ? childWT.leftChild : childWT\n t.leftChild = childWT;\n }\n\n if (i === childrenCount - 1) {\n // t.rightChild = childWT.rightChild ? childWT.rightChild : childWT\n t.rightChild = childWT;\n }\n });\n t.originNode = n;\n t.isLeaf = n.isLeaf();\n return t;\n }\n\n function getDrawingDepth(t) {\n if (t.isLeaf || t.children.length === 0) {\n t.drawingDepth = maxDepth;\n } else {\n var depths = t.children.map(function (child) {\n return getDrawingDepth(child);\n });\n var minChildDepth = Math.min.apply(null, depths);\n t.drawingDepth = minChildDepth - 1;\n }\n\n return t.drawingDepth;\n }\n\n var prevLeaf;\n\n function position(t) {\n t.x = t.drawingDepth * options.rankSep;\n\n if (t.isLeaf) {\n t.y = 0;\n\n if (prevLeaf) {\n t.y = prevLeaf.y + prevLeaf.height + options.nodeSep;\n\n if (t.originNode.parent !== prevLeaf.originNode.parent) {\n t.y += options.subTreeSep;\n }\n }\n\n prevLeaf = t;\n } else {\n t.children.forEach(function (child) {\n position(child);\n });\n t.y = (t.leftChild.y + t.rightChild.y) / 2;\n }\n } // wrap node\n\n\n var wt = wrappedTreeFromNode(root); // get depth for drawing\n\n getDrawingDepth(wt); // get position\n\n position(wt); // get x, y\n\n convertBack(wt, root, options.isHorizontal);\n return root;\n};\n\n/***/ }),\n/* 116 */\n/***/ (function(module, exports, __webpack_require__) {\n\nfunction _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; }\n\nvar TreeLayout = __webpack_require__(11);\n\nvar indentedTree = __webpack_require__(117);\n\nvar separateTree = __webpack_require__(30);\n\nvar util = __webpack_require__(7);\n\nvar VALID_DIRECTIONS = [\'LR\', // left to right\n\'RL\', // right to left\n\'H\' // horizontal\n];\nvar DEFAULT_DIRECTION = VALID_DIRECTIONS[0];\n\nvar IndentedLayout = /*#__PURE__*/function (_TreeLayout) {\n _inheritsLoose(IndentedLayout, _TreeLayout);\n\n function IndentedLayout() {\n return _TreeLayout.apply(this, arguments) || this;\n }\n\n var _proto = IndentedLayout.prototype;\n\n _proto.execute = function execute() {\n var me = this;\n var options = me.options;\n var root = me.rootNode;\n options.isHorizontal = true; // default indent 20 and sink first children;\n\n var _options$indent = options.indent,\n indent = _options$indent === void 0 ? 20 : _options$indent,\n _options$dropCap = options.dropCap,\n dropCap = _options$dropCap === void 0 ? true : _options$dropCap;\n var direction = options.direction || DEFAULT_DIRECTION;\n\n if (direction && VALID_DIRECTIONS.indexOf(direction) === -1) {\n throw new TypeError("Invalid direction: " + direction);\n }\n\n if (direction === VALID_DIRECTIONS[0]) {\n // LR\n indentedTree(root, indent, dropCap);\n } else if (direction === VALID_DIRECTIONS[1]) {\n // RL\n indentedTree(root, indent, dropCap);\n root.right2left();\n } else if (direction === VALID_DIRECTIONS[2]) {\n // H\n // separate into left and right trees\n var _separateTree = separateTree(root, options),\n left = _separateTree.left,\n right = _separateTree.right;\n\n indentedTree(left, indent, dropCap);\n left.right2left();\n indentedTree(right, indent, dropCap);\n var bbox = left.getBoundingBox();\n right.translate(bbox.width, 0);\n root.x = right.x - root.width / 2;\n }\n\n return root;\n };\n\n return IndentedLayout;\n}(TreeLayout);\n\nvar DEFAULT_OPTIONS = {};\n\nfunction indentedLayout(root, options) {\n options = util.assign({}, DEFAULT_OPTIONS, options);\n return new IndentedLayout(root, options).execute();\n}\n\nmodule.exports = indentedLayout;\n\n/***/ }),\n/* 117 */\n/***/ (function(module, exports) {\n\nfunction positionNode(node, previousNode, indent, dropCap) {\n // caculate the node\'s horizontal offset DX, dx\'s type might be number or function\n var displacementX = typeof indent === \'function\' ? indent(node) : indent * node.depth;\n\n if (!dropCap) {\n try {\n if (node.id === node.parent.children[0].id) {\n node.x += displacementX;\n node.y = previousNode ? previousNode.y : 0;\n return;\n }\n } catch (e) {// skip to normal when a node has no parent\n }\n }\n\n node.x += displacementX;\n node.y = previousNode ? previousNode.y + previousNode.height : 0;\n return;\n}\n\nmodule.exports = function (root, indent, dropCap) {\n var previousNode = null;\n root.eachNode(function (node) {\n positionNode(node, previousNode, indent, dropCap);\n previousNode = node;\n });\n};\n\n/***/ }),\n/* 118 */\n/***/ (function(module, exports, __webpack_require__) {\n\nfunction _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; }\n\nvar TreeLayout = __webpack_require__(11);\n\nvar mindmap = __webpack_require__(119);\n\nvar doTreeLayout = __webpack_require__(17);\n\nvar util = __webpack_require__(7);\n\nvar MindmapLayout = /*#__PURE__*/function (_TreeLayout) {\n _inheritsLoose(MindmapLayout, _TreeLayout);\n\n function MindmapLayout() {\n return _TreeLayout.apply(this, arguments) || this;\n }\n\n var _proto = MindmapLayout.prototype;\n\n _proto.execute = function execute() {\n var me = this;\n return doTreeLayout(me.rootNode, me.options, mindmap);\n };\n\n return MindmapLayout;\n}(TreeLayout);\n\nvar DEFAULT_OPTIONS = {};\n\nfunction mindmapLayout(root, options) {\n options = util.assign({}, DEFAULT_OPTIONS, options);\n return new MindmapLayout(root, options).execute();\n}\n\nmodule.exports = mindmapLayout;\n\n/***/ }),\n/* 119 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar util = __webpack_require__(7);\n\nfunction secondWalk(node, options) {\n var totalHeight = 0;\n\n if (!node.children.length) {\n totalHeight = node.height;\n } else {\n node.children.forEach(function (c) {\n totalHeight += secondWalk(c, options);\n });\n }\n\n node._subTreeSep = options.getSubTreeSep(node.data);\n node.totalHeight = Math.max(node.height, totalHeight) + 2 * node._subTreeSep;\n return node.totalHeight;\n}\n\nfunction thirdWalk(node) {\n var children = node.children;\n var len = children.length;\n\n if (len) {\n children.forEach(function (c) {\n thirdWalk(c);\n });\n var first = children[0];\n var last = children[len - 1];\n var childrenHeight = last.y - first.y + last.height;\n var childrenTotalHeight = 0;\n children.forEach(function (child) {\n childrenTotalHeight += child.totalHeight;\n });\n\n if (childrenHeight > node.height) {\n // 当子节点总高度大于父节点高度\n node.y = first.y + childrenHeight / 2 - node.height / 2;\n } else if (children.length !== 1 || node.height > childrenTotalHeight) {\n // 多于一个子节点或者父节点大于所有子节点的总高度\n var offset = node.y + (node.height - childrenHeight) / 2 - first.y;\n children.forEach(function (c) {\n c.translate(0, offset);\n });\n } else {\n // 只有一个子节点\n node.y = (first.y + first.height / 2 + last.y + last.height / 2) / 2 - node.height / 2;\n }\n }\n}\n\nvar DEFAULT_OPTIONS = {\n getSubTreeSep: function getSubTreeSep() {\n return 0;\n }\n};\n\nmodule.exports = function (root, options) {\n if (options === void 0) {\n options = {};\n }\n\n options = util.assign({}, DEFAULT_OPTIONS, options);\n root.parent = {\n x: 0,\n width: 0,\n height: 0,\n y: 0\n }; // first walk\n\n root.BFTraverse(function (node) {\n node.x = node.parent.x + node.parent.width; // simply get x\n });\n root.parent = null; // second walk\n\n secondWalk(root, options); // assign sub tree totalHeight\n // adjusting\n // separating nodes\n\n root.startY = 0;\n root.y = root.totalHeight / 2 - root.height / 2;\n root.eachNode(function (node) {\n var children = node.children;\n var len = children.length;\n\n if (len) {\n var first = children[0];\n first.startY = node.startY + node._subTreeSep;\n\n if (len === 1) {\n first.y = node.y + node.height / 2 - first.height / 2;\n } else {\n first.y = first.startY + first.totalHeight / 2 - first.height / 2;\n\n for (var i = 1; i < len; i++) {\n var c = children[i];\n c.startY = children[i - 1].startY + children[i - 1].totalHeight;\n c.y = c.startY + c.totalHeight / 2 - c.height / 2;\n }\n }\n }\n }); // third walk\n\n thirdWalk(root);\n};\n\n/***/ })\n/******/ ]);\n});\n//# sourceMappingURL=hierarchy.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvaGllcmFyY2h5L2J1aWxkL2hpZXJhcmNoeS5qcz8wNTE5Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0EsSUFBSSxJQUF5RDtBQUM3RDtBQUNBLE1BQU0sRUFLMEI7QUFDaEMsQ0FBQztBQUNELG9DQUFvQztBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQywwQkFBMEIsRUFBRTtBQUMvRCx5Q0FBeUMsZUFBZTtBQUN4RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOERBQThELCtEQUErRDtBQUM3SDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRCxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLDBDQUEwQyxTQUFTO0FBQ25EOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNB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bURBQW1EO0FBQ25EO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLDREQUE0RDtBQUM1RCxLQUFLO0FBQ0w7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0REFBNEQ7QUFDNUQsS0FBSztBQUNMO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EseUJBQXlCLFlBQVk7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQSxPQUFP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QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDOztBQUVELE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsQ0FBQzs7QUFFRCxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLENBQUM7O0FBRUQsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQzs7QUFFRCxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxDQUFDOztBQUVELE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBLENBQUM7O0FBRUQsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQSx1RUFBdUU7O0FBRXZFLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtB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O0FBRUEsdUJBQXVCLFNBQVM7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRyxFQUFFOztBQUVMO0FBQ0E7O0FBRUEsT0FBTztBQUNQO0FBQ0EsQ0FBQztBQUNEIiwiZmlsZSI6Ijg0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoW10sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wiSGllcmFyY2h5XCJdID0gZmFjdG9yeSgpO1xuXHRlbHNlXG5cdFx0cm9vdFtcIkhpZXJhcmNoeVwiXSA9IGZhY3RvcnkoKTtcbn0pKHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyA/IHNlbGYgOiB0aGlzLCBmdW5jdGlvbigpIHtcbnJldHVybiAvKioqKioqLyAoZnVuY3Rpb24obW9kdWxlcykgeyAvLyB3ZWJwYWNrQm9vdHN0cmFwXG4vKioqKioqLyBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4vKioqKioqLyBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4vKioqKioqLyBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbi8qKioqKiovIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuLyoqKioqKi8gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbi8qKioqKiovIFx0XHRcdGk6IG1vZHVsZUlkLFxuLyoqKioqKi8gXHRcdFx0bDogZmFsc2UsXG4vKioqKioqLyBcdFx0XHRleHBvcnRzOiB7fVxuLyoqKioqKi8gXHRcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuLyoqKioqKi8gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4vKioqKioqLyBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuLyoqKioqKi8gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbi8qKioqKiovIFx0fVxuLyoqKioqKi9cbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuLyoqKioqKi8gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbi8qKioqKiovIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7XG4vKioqKioqLyBcdFx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4vKioqKioqLyBcdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG4vKioqKioqLyBcdFx0XHRcdGdldDogZ2V0dGVyXG4vKioqKioqLyBcdFx0XHR9KTtcbi8qKioqKiovIFx0XHR9XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbi8qKioqKiovIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4vKioqKioqLyBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuLyoqKioqKi8gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbi8qKioqKiovIFx0XHRyZXR1cm4gZ2V0dGVyO1xuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbi8qKioqKiovIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gMzEpO1xuLyoqKioqKi8gfSlcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKioqKioqLyAoW1xuLyogMCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX2lzX3R5cGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNCk7XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1tcImFcIl0gPSAoZnVuY3Rpb24gKHZhbHVlKSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5ID8gQXJyYXkuaXNBcnJheSh2YWx1ZSkgOiBPYmplY3QoX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19pc190eXBlX19bXCJhXCIgLyogZGVmYXVsdCAqL10pKHZhbHVlLCAnQXJyYXknKTtcbn0pO1xuXG4vKioqLyB9KSxcbi8qIDEgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG52YXIgaXNBcnJheUxpa2UgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgLyoqXG4gICAqIGlzQXJyYXlMaWtlKFsxLCAyLCAzXSkgPT4gdHJ1ZVxuICAgKiBpc0FycmF5TGlrZShkb2N1bWVudC5ib2R5LmNoaWxkcmVuKSA9PiB0cnVlXG4gICAqIGlzQXJyYXlMaWtlKCdhYmMnKSA9PiB0cnVlXG4gICAqIGlzQXJyYXlMaWtlKEZ1bmN0aW9uKSA9PiBmYWxzZVxuICAgKi9cbiAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSAhPT0gJ2Z1bmN0aW9uJyAmJiBpc0Zpbml0ZSh2YWx1ZS5sZW5ndGgpO1xufTtcblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyBfX3dlYnBhY2tfZXhwb3J0c19fW1wiYVwiXSA9IChpc0FycmF5TGlrZSk7XG5cbi8qKiovIH0pLFxuLyogMiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX2lzX2FycmF5X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9faXNfb2JqZWN0X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEzKTtcblxuXG5cbmZ1bmN0aW9uIGVhY2goZWxlbWVudHMsIGZ1bmMpIHtcbiAgaWYgKCFlbGVtZW50cykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciByc3Q7XG5cbiAgaWYgKE9iamVjdChfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX2lzX2FycmF5X19bXCJhXCIgLyogZGVmYXVsdCAqL10pKGVsZW1lbnRzKSkge1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBlbGVtZW50cy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgcnN0ID0gZnVuYyhlbGVtZW50c1tpXSwgaSk7XG5cbiAgICAgIGlmIChyc3QgPT09IGZhbHNlKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmIChPYmplY3QoX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX19pc19vYmplY3RfX1tcImFcIiAvKiBkZWZhdWx0ICovXSkoZWxlbWVudHMpKSB7XG4gICAgZm9yICh2YXIgayBpbiBlbGVtZW50cykge1xuICAgICAgaWYgKGVsZW1lbnRzLmhhc093blByb3BlcnR5KGspKSB7XG4gICAgICAgIHJzdCA9IGZ1bmMoZWxlbWVudHNba10sIGspO1xuXG4gICAgICAgIGlmIChyc3QgPT09IGZhbHNlKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyBfX3dlYnBhY2tfZXhwb3J0c19fW1wiYVwiXSA9IChlYWNoKTtcblxuLyoqKi8gfSksXG4vKiAzICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9faXNfdHlwZV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KTtcbi8qKlxuICog5piv5ZCm5Li65Ye95pWwXG4gKiBAcGFyYW0gIHsqfSBmbiDlr7nosaFcbiAqIEByZXR1cm4ge0Jvb2xlYW59ICDmmK/lkKblh73mlbBcbiAqL1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIF9fd2VicGFja19leHBvcnRzX19bXCJhXCJdID0gKGZ1bmN0aW9uICh2YWx1ZSkge1xuICByZXR1cm4gT2JqZWN0KF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9faXNfdHlwZV9fW1wiYVwiIC8qIGRlZmF1bHQgKi9dKSh2YWx1ZSwgJ0Z1bmN0aW9uJyk7XG59KTtcblxuLyoqKi8gfSksXG4vKiA0ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xudmFyIHRvU3RyaW5nID0ge30udG9TdHJpbmc7XG5cbnZhciBpc1R5cGUgPSBmdW5jdGlvbiAodmFsdWUsIHR5cGUpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCAnICsgdHlwZSArICddJztcbn07XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1tcImFcIl0gPSAoaXNUeXBlKTtcblxuLyoqKi8gfSksXG4vKiA1ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9faXNfdHlwZV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KTtcbi8qKlxuICog5Yik5pat5piv5ZCm5pWw5a2XXG4gKiBAcmV0dXJuIHtCb29sZWFufSDmmK/lkKbmlbDlrZdcbiAqL1xuXG5cbnZhciBpc051bWJlciA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICByZXR1cm4gT2JqZWN0KF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9faXNfdHlwZV9fW1wiYVwiIC8qIGRlZmF1bHQgKi9dKSh2YWx1ZSwgJ051bWJlcicpO1xufTtcblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyBfX3dlYnBhY2tfZXhwb3J0c19fW1wiYVwiXSA9IChpc051bWJlcik7XG5cbi8qKiovIH0pLFxuLyogNiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbi8vIGlzRmluaXRlLFxudmFyIGlzTmlsID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gIC8qKlxuICAgKiBpc05pbChudWxsKSA9PiB0cnVlXG4gICAqIGlzTmlsKCkgPT4gdHJ1ZVxuICAgKi9cbiAgcmV0dXJuIHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQ7XG59O1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIF9fd2VicGFja19leHBvcnRzX19bXCJhXCJdID0gKGlzTmlsKTtcblxuLyoqKi8gfSksXG4vKiA3ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cbnZhciBfcmVxdWlyZSA9IF9fd2VicGFja19yZXF1aXJlX18oMzMpLFxuICAgIG1peCA9IF9yZXF1aXJlLm1peDtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGFzc2lnbjogbWl4XG59O1xuXG4vKioqLyB9KSxcbi8qIDggKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19pc190eXBlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQpO1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIF9fd2VicGFja19leHBvcnRzX19bXCJhXCJdID0gKGZ1bmN0aW9uIChzdHIpIHtcbiAgcmV0dXJuIE9iamVjdChfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX2lzX3R5cGVfX1tcImFcIiAvKiBkZWZhdWx0ICovXSkoc3RyLCAnU3RyaW5nJyk7XG59KTtcblxuLyoqKi8gfSksXG4vKiA5ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9faXNfb2JqZWN0X2xpa2VfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTUpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9faXNfdHlwZV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KTtcblxuXG5cbnZhciBpc1BsYWluT2JqZWN0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gIC8qKlxuICAgKiBpc09iamVjdExpa2UobmV3IEZvbykgPT4gZmFsc2VcbiAgICogaXNPYmplY3RMaWtlKFsxLCAyLCAzXSkgPT4gZmFsc2VcbiAgICogaXNPYmplY3RMaWtlKHsgeDogMCwgeTogMCB9KSA9PiB0cnVlXG4gICAqIGlzT2JqZWN0TGlrZShPYmplY3QuY3JlYXRlKG51bGwpKSA9PiB0cnVlXG4gICAqL1xuICBpZiAoIU9iamVjdChfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX2lzX29iamVjdF9saWtlX19bXCJhXCIgLyogZGVmYXVsdCAqL10pKHZhbHVlKSB8fCAhT2JqZWN0KF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9faXNfdHlwZV9fW1wiYVwiIC8qIGRlZmF1bHQgKi9dKSh2YWx1ZSwgJ09iamVjdCcpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSkgPT09IG51bGwpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHZhciBwcm90byA9IHZhbHVlO1xuXG4gIHdoaWxlIChPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pICE9PSBudWxsKSB7XG4gICAgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pO1xuICB9XG5cbiAgcmV0dXJuIE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSkgPT09IHByb3RvO1xufTtcblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyBfX3dlYnBhY2tfZXhwb3J0c19fW1wiYVwiXSA9IChpc1BsYWluT2JqZWN0KTtcblxuLyoqKi8gfSksXG4vKiAxMCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX2lzX25pbF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2KTtcblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyBfX3dlYnBhY2tfZXhwb3J0c19fW1wiYVwiXSA9IChmdW5jdGlvbiAodmFsdWUpIHtcbiAgaWYgKE9iamVjdChfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX2lzX25pbF9fW1wiYVwiIC8qIGRlZmF1bHQgKi9dKSh2YWx1ZSkpIHJldHVybiAnJztcbiAgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCk7XG59KTtcblxuLyoqKi8gfSksXG4vKiAxMSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG52YXIgaGllcmFyY2h5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxOCk7XG5cbnZhciBMYXlvdXQgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBMYXlvdXQocm9vdCwgb3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICB9XG5cbiAgICB2YXIgbWUgPSB0aGlzO1xuICAgIG1lLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIG1lLnJvb3ROb2RlID0gaGllcmFyY2h5KHJvb3QsIG9wdGlvbnMpO1xuICB9XG5cbiAgdmFyIF9wcm90byA9IExheW91dC5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLmV4ZWN1dGUgPSBmdW5jdGlvbiBleGVjdXRlKCkge1xuICAgIHRocm93IG5ldyBFcnJvcigncGxlYXNlIG92ZXJyaWRlIHRoaXMgbWV0aG9kJyk7XG4gIH07XG5cbiAgcmV0dXJuIExheW91dDtcbn0oKTtcblxubW9kdWxlLmV4cG9ydHMgPSBMYXlvdXQ7XG5cbi8qKiovIH0pLFxuLyogMTIgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19pc19hcnJheV9saWtlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpO1xuXG5cbnZhciBjb250YWlucyA9IGZ1bmN0aW9uIChhcnIsIHZhbHVlKSB7XG4gIGlmICghT2JqZWN0KF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9faXNfYXJyYXlfbGlrZV9fW1wiYVwiIC8qIGRlZmF1bHQgKi9dKShhcnIpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIGFyci5pbmRleE9mKHZhbHVlKSA+IC0xO1xufTtcblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyBfX3dlYnBhY2tfZXhwb3J0c19fW1wiYVwiXSA9IChjb250YWlucyk7XG5cbi8qKiovIH0pLFxuLyogMTMgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIF9fd2VicGFja19leHBvcnRzX19bXCJhXCJdID0gKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAvKipcbiAgICogaXNPYmplY3Qoe30pID0+IHRydWVcbiAgICogaXNPYmplY3QoWzEsIDIsIDNdKSA9PiB0cnVlXG4gICAqIGlzT2JqZWN0KEZ1bmN0aW9uKSA9PiB0cnVlXG4gICAqIGlzT2JqZWN0KG51bGwpID0+IGZhbHNlXG4gICAqL1xuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHR5cGUgPT09ICdvYmplY3QnIHx8IHR5cGUgPT09ICdmdW5jdGlvbic7XG59KTtcblxuLyoqKi8gfSksXG4vKiAxNCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX2VhY2hfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX19pc19hcnJheV9saWtlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpO1xuXG5cblxudmFyIGZpbHRlciA9IGZ1bmN0aW9uIChhcnIsIGZ1bmMpIHtcbiAgaWYgKCFPYmplY3QoX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX19pc19hcnJheV9saWtlX19bXCJhXCIgLyogZGVmYXVsdCAqL10pKGFycikpIHtcbiAgICByZXR1cm4gYXJyO1xuICB9XG5cbiAgdmFyIHJlc3VsdCA9IFtdO1xuICBPYmplY3QoX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19lYWNoX19bXCJhXCIgLyogZGVmYXVsdCAqL10pKGFyciwgZnVuY3Rpb24gKHZhbHVlLCBpbmRleCkge1xuICAgIGlmIChmdW5jKHZhbHVlLCBpbmRleCkpIHtcbiAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyBfX3dlYnBhY2tfZXhwb3J0c19fW1wiYVwiXSA9IChmaWx0ZXIpO1xuXG4vKioqLyB9KSxcbi8qIDE1ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xudmFyIGlzT2JqZWN0TGlrZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAvKipcbiAgICogaXNPYmplY3RMaWtlKHt9KSA9PiB0cnVlXG4gICAqIGlzT2JqZWN0TGlrZShbMSwgMiwgM10pID0+IHRydWVcbiAgICogaXNPYmplY3RMaWtlKEZ1bmN0aW9uKSA9PiBmYWxzZVxuICAgKiBpc09iamVjdExpa2UobnVsbCkgPT4gZmFsc2VcbiAgICovXG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsO1xufTtcblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyBfX3dlYnBhY2tfZXhwb3J0c19fW1wiYVwiXSA9IChpc09iamVjdExpa2UpO1xuXG4vKioqLyB9KSxcbi8qIDE2ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuLyogaGFybW9ueSBleHBvcnQgKGltbXV0YWJsZSkgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1tcImFcIl0gPSBtaXg7XG4vLyBGSVhNRTogTXV0YWJsZSBwYXJhbSBzaG91bGQgYmUgZm9yYmlkZGVuIGluIHN0YXRpYyBsYW5nLlxuZnVuY3Rpb24gX21peChkaXN0LCBvYmopIHtcbiAgZm9yICh2YXIga2V5IGluIG9iaikge1xuICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSAmJiBrZXkgIT09ICdjb25zdHJ1Y3RvcicgJiYgb2JqW2tleV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgZGlzdFtrZXldID0gb2JqW2tleV07XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIG1peChkaXN0LCBzcmMxLCBzcmMyLCBzcmMzKSB7XG4gIGlmIChzcmMxKSBfbWl4KGRpc3QsIHNyYzEpO1xuICBpZiAoc3JjMikgX21peChkaXN0LCBzcmMyKTtcbiAgaWYgKHNyYzMpIF9taXgoZGlzdCwgc3JjMyk7XG4gIHJldHVybiBkaXN0O1xufVxuXG4vKioqLyB9KSxcbi8qIDE3ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cbnZhciBzZXBhcmF0ZVRyZWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMwKTtcblxudmFyIFZBTElEX0RJUkVDVElPTlMgPSBbJ0xSJywgLy8gbGVmdCB0byByaWdodFxuJ1JMJywgLy8gcmlnaHQgdG8gbGVmdFxuJ1RCJywgLy8gdG9wIHRvIGJvdHRvbVxuJ0JUJywgLy8gYm90dG9tIHRvIHRvcFxuJ0gnLCAvLyBob3Jpem9udGFsXG4nVicgLy8gdmVydGljYWxcbl07XG52YXIgSE9SSVpPTlRBTF9ESVJFQ1RJT05TID0gWydMUicsICdSTCcsICdIJ107XG5cbnZhciBpc0hvcml6b250YWwgPSBmdW5jdGlvbiBpc0hvcml6b250YWwoZGlyZWN0aW9uKSB7XG4gIHJldHVybiBIT1JJWk9OVEFMX0RJUkVDVElPTlMuaW5kZXhPZihkaXJlY3Rpb24pID4gLTE7XG59O1xuXG52YXIgREVGQVVMVF9ESVJFQ1RJT04gPSBWQUxJRF9ESVJFQ1RJT05TWzBdO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChyb290LCBvcHRpb25zLCBsYXlvdXRBbGdyaXRobSkge1xuICB2YXIgZGlyZWN0aW9uID0gb3B0aW9ucy5kaXJlY3Rpb24gfHwgREVGQVVMVF9ESVJFQ1RJT047XG4gIG9wdGlvbnMuaXNIb3Jpem9udGFsID0gaXNIb3Jpem9udGFsKGRpcmVjdGlvbik7XG5cbiAgaWYgKGRpcmVjdGlvbiAmJiBWQUxJRF9ESVJFQ1RJT05TLmluZGV4T2YoZGlyZWN0aW9uKSA9PT0gLTEpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBkaXJlY3Rpb246IFwiICsgZGlyZWN0aW9uKTtcbiAgfVxuXG4gIGlmIChkaXJlY3Rpb24gPT09IFZBTElEX0RJUkVDVElPTlNbMF0pIHtcbiAgICAvLyBMUlxuICAgIGxheW91dEFsZ3JpdGhtKHJvb3QsIG9wdGlvbnMpO1xuICB9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PT0gVkFMSURfRElSRUNUSU9OU1sxXSkge1xuICAgIC8vIFJMXG4gICAgbGF5b3V0QWxncml0aG0ocm9vdCwgb3B0aW9ucyk7XG4gICAgcm9vdC5yaWdodDJsZWZ0KCk7XG4gIH0gZWxzZSBpZiAoZGlyZWN0aW9uID09PSBWQUxJRF9ESVJFQ1RJT05TWzJdKSB7XG4gICAgLy8gVEJcbiAgICBsYXlvdXRBbGdyaXRobShyb290LCBvcHRpb25zKTtcbiAgfSBlbHNlIGlmIChkaXJlY3Rpb24gPT09IFZBTElEX0RJUkVDVElPTlNbM10pIHtcbiAgICAvLyBCVFxuICAgIGxheW91dEFsZ3JpdGhtKHJvb3QsIG9wdGlvbnMpO1xuICAgIHJvb3QuYm90dG9tMnRvcCgpO1xuICB9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PT0gVkFMSURfRElSRUNUSU9OU1s0XSB8fCBkaXJlY3Rpb24gPT09IFZBTElEX0RJUkVDVElPTlNbNV0pIHtcbiAgICAvLyBIIG9yIFZcbiAgICAvLyBzZXBhcmF0ZSBpbnRvIGxlZnQgYW5kIHJpZ2h0IHRyZWVzXG4gICAgdmFyIF9zZXBhcmF0ZVRyZWUgPSBzZXBhcmF0ZVRyZWUocm9vdCwgb3B0aW9ucyksXG4gICAgICAgIGxlZnQgPSBfc2VwYXJhdGVUcmVlLmxlZnQsXG4gICAgICAgIHJpZ2h0ID0gX3NlcGFyYXRlVHJlZS5yaWdodDsgLy8gZG8gbGF5b3V0IGZvciBsZWZ0IGFuZCByaWdodCB0cmVlc1xuXG5cbiAgICBsYXlvdXRBbGdyaXRobShsZWZ0LCBvcHRpb25zKTtcbiAgICBsYXlvdXRBbGdyaXRobShyaWdodCwgb3B0aW9ucyk7XG4gICAgb3B0aW9ucy5pc0hvcml6b250YWwgPyBsZWZ0LnJpZ2h0MmxlZnQoKSA6IGxlZnQuYm90dG9tMnRvcCgpOyAvLyBjb21iaW5lIGxlZnQgYW5kIHJpZ2h0IHRyZWVzXG5cbiAgICByaWdodC50cmFuc2xhdGUobGVmdC54IC0gcmlnaHQueCwgbGVmdC55IC0gcmlnaHQueSk7IC8vIHRyYW5zbGF0ZSByb290XG5cbiAgICByb290LnggPSBsZWZ0Lng7XG4gICAgcm9vdC55ID0gcmlnaHQueTtcbiAgICB2YXIgYmIgPSByb290LmdldEJvdW5kaW5nQm94KCk7XG5cbiAgICBpZiAob3B0aW9ucy5pc0hvcml6b250YWwpIHtcbiAgICAgIGlmIChiYi50b3AgPCAwKSB7XG4gICAgICAgIHJvb3QudHJhbnNsYXRlKDAsIC1iYi50b3ApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoYmIubGVmdCA8IDApIHtcbiAgICAgICAgcm9vdC50cmFuc2xhdGUoLWJiLmxlZnQsIDApO1xuICAgICAgfVxuICAgIH1cbiAgfSAvLyBmaXhlZCByb290IHBvc2l0aW9uLCBkZWZhdWx0IHZhbHVlIGlzIHRydWVcblxuXG4gIHZhciBmaXhlZFJvb3QgPSBvcHRpb25zLmZpeGVkUm9vdDtcbiAgaWYgKGZpeGVkUm9vdCA9PT0gdW5kZWZpbmVkKSBmaXhlZFJvb3QgPSB0cnVlO1xuXG4gIGlmIChmaXhlZFJvb3QpIHtcbiAgICByb290LnRyYW5zbGF0ZSgtKHJvb3QueCArIHJvb3Qud2lkdGggLyAyICsgcm9vdC5oZ2FwKSwgLShyb290LnkgKyByb290LmhlaWdodCAvIDIgKyByb290LnZnYXApKTtcbiAgfVxuXG4gIHJldHVybiByb290O1xufTtcblxuLyoqKi8gfSksXG4vKiAxOCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1jb25kLWFzc2lnbiAqL1xudmFyIHV0aWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcpO1xuXG52YXIgUEVNID0gMTg7XG52YXIgREVGQVVMVF9IRUlHSFQgPSBQRU0gKiAyO1xudmFyIERFRkFVTFRfR0FQID0gUEVNO1xudmFyIERFRkFVTFRfT1BUSU9OUyA9IHtcbiAgZ2V0SWQ6IGZ1bmN0aW9uIGdldElkKGQpIHtcbiAgICByZXR1cm4gZC5pZCB8fCBkLm5hbWU7XG4gIH0sXG4gIGdldFByZUg6IGZ1bmN0aW9uIGdldFByZUgoZCkge1xuICAgIHJldHVybiBkLnByZUggfHwgMDtcbiAgfSxcbiAgZ2V0UHJlVjogZnVuY3Rpb24gZ2V0UHJlVihkKSB7XG4gICAgcmV0dXJuIGQucHJlViB8fCAwO1xuICB9LFxuICBnZXRIR2FwOiBmdW5jdGlvbiBnZXRIR2FwKGQpIHtcbiAgICByZXR1cm4gZC5oZ2FwIHx8IERFRkFVTFRfR0FQO1xuICB9LFxuICBnZXRWR2FwOiBmdW5jdGlvbiBnZXRWR2FwKGQpIHtcbiAgICByZXR1cm4gZC52Z2FwIHx8IERFRkFVTFRfR0FQO1xuICB9LFxuICBnZXRDaGlsZHJlbjogZnVuY3Rpb24gZ2V0Q2hpbGRyZW4oZCkge1xuICAgIHJldHVybiBkLmNoaWxkcmVuO1xuICB9LFxuICBnZXRIZWlnaHQ6IGZ1bmN0aW9uIGdldEhlaWdodChkKSB7XG4gICAgcmV0dXJuIGQuaGVpZ2h0IHx8IERFRkFVTFRfSEVJR0hUO1xuICB9LFxuICBnZXRXaWR0aDogZnVuY3Rpb24gZ2V0V2lkdGgoZCkge1xuICAgIHZhciBsYWJlbCA9IGQubGFiZWwgfHwgJyAnO1xuICAgIHJldHVybiBkLndpZHRoIHx8IGxhYmVsLnNwbGl0KCcnKS5sZW5ndGggKiBQRU07IC8vIEZJWE1FIERPIE5PVCBnZXQgd2lkdGggbGlrZSB0aGlzXG4gIH1cbn07XG5cbmZ1bmN0aW9uIE5vZGUoZGF0YSwgb3B0aW9ucykge1xuICB2YXIgbWUgPSB0aGlzO1xuICBtZS52Z2FwID0gbWUuaGdhcCA9IDA7XG4gIGlmIChkYXRhIGluc3RhbmNlb2YgTm9kZSkgcmV0dXJuIGRhdGE7XG4gIG1lLmRhdGEgPSBkYXRhO1xuICAvKlxuICAgKiBHYXBzOiBmaWxsaW5nIHNwYWNlIGJldHdlZW4gbm9kZXNcbiAgICogKHgsIHkpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogfCAgICAgICAgICAgIHZnYXAgICAgICAgICAgICB8XG4gICAqIHwgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgaFxuICAgKiB8IGggfCAgICAgICAgICAgICAgICAgICAgfCAgIGVcbiAgICogfCBnIHwgICAgICAgICAgICAgICAgICAgIHwgICBpXG4gICAqIHwgYSB8ICAgICAgICAgICAgICAgICAgICB8ICAgZ1xuICAgKiB8IHAgfCAgICAgICAgICAgICAgICAgICAgfCAgIGhcbiAgICogfCAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICB0XG4gICAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgKiAgLS0tLS0tLS0tLS13aWR0aC0tLS0tLS0tLS0tLVxuICAgKi9cblxuICB2YXIgaGdhcCA9IG9wdGlvbnMuZ2V0SEdhcChkYXRhKTtcbiAgdmFyIHZnYXAgPSBvcHRpb25zLmdldFZHYXAoZGF0YSk7XG4gIG1lLnByZUggPSBvcHRpb25zLmdldFByZUgoZGF0YSk7XG4gIG1lLnByZVYgPSBvcHRpb25zLmdldFByZVYoZGF0YSk7XG4gIG1lLndpZHRoID0gb3B0aW9ucy5nZXRXaWR0aChkYXRhKTtcbiAgbWUuaGVpZ2h0ID0gb3B0aW9ucy5nZXRIZWlnaHQoZGF0YSk7XG4gIG1lLndpZHRoICs9IG1lLnByZUg7XG4gIG1lLmhlaWdodCArPSBtZS5wcmVWO1xuICBtZS5pZCA9IG9wdGlvbnMuZ2V0SWQoZGF0YSk7XG4gIG1lLnggPSBtZS55ID0gMDtcbiAgbWUuZGVwdGggPSAwO1xuXG4gIGlmICghbWUuY2hpbGRyZW4pIHtcbiAgICBtZS5jaGlsZHJlbiA9IFtdO1xuICB9XG5cbiAgbWUuYWRkR2FwKGhnYXAsIHZnYXApO1xuICByZXR1cm4gbWU7XG59XG5cbnV0aWwuYXNzaWduKE5vZGUucHJvdG90eXBlLCB7XG4gIGlzUm9vdDogZnVuY3Rpb24gaXNSb290KCkge1xuICAgIHJldHVybiB0aGlzLmRlcHRoID09PSAwO1xuICB9LFxuICBpc0xlYWY6IGZ1bmN0aW9uIGlzTGVhZigpIHtcbiAgICByZXR1cm4gdGhpcy5jaGlsZHJlbi5sZW5ndGggPT09IDA7XG4gIH0sXG4gIGFkZEdhcDogZnVuY3Rpb24gYWRkR2FwKGhnYXAsIHZnYXApIHtcbiAgICB2YXIgbWUgPSB0aGlzO1xuICAgIG1lLmhnYXAgKz0gaGdhcDtcbiAgICBtZS52Z2FwICs9IHZnYXA7XG4gICAgbWUud2lkdGggKz0gMiAqIGhnYXA7XG4gICAgbWUuaGVpZ2h0ICs9IDIgKiB2Z2FwO1xuICB9LFxuICBlYWNoTm9kZTogZnVuY3Rpb24gZWFjaE5vZGUoY2FsbGJhY2spIHtcbiAgICAvLyBEZXB0aCBGaXJzdCB0cmF2ZXJzZVxuICAgIHZhciBtZSA9IHRoaXM7XG4gICAgdmFyIG5vZGVzID0gW21lXTtcbiAgICB2YXIgY3VycmVudDtcblxuICAgIHdoaWxlIChjdXJyZW50ID0gbm9kZXMuc2hpZnQoKSkge1xuICAgICAgY2FsbGJhY2soY3VycmVudCk7XG4gICAgICBub2RlcyA9IGN1cnJlbnQuY2hpbGRyZW4uY29uY2F0KG5vZGVzKTtcbiAgICB9XG4gIH0sXG4gIERGVHJhdmVyc2U6IGZ1bmN0aW9uIERGVHJhdmVyc2UoY2FsbGJhY2spIHtcbiAgICAvLyBEZXB0aCBGaXJzdCB0cmF2ZXJzZVxuICAgIHRoaXMuZWFjaE5vZGUoY2FsbGJhY2spO1xuICB9LFxuICBCRlRyYXZlcnNlOiBmdW5jdGlvbiBCRlRyYXZlcnNlKGNhbGxiYWNrKSB7XG4gICAgLy8gQnJlYWR0aCBGaXJzdCB0cmF2ZXJzZVxuICAgIHZhciBtZSA9IHRoaXM7XG4gICAgdmFyIG5vZGVzID0gW21lXTtcbiAgICB2YXIgY3VycmVudDtcblxuICAgIHdoaWxlIChjdXJyZW50ID0gbm9kZXMuc2hpZnQoKSkge1xuICAgICAgY2FsbGJhY2soY3VycmVudCk7XG4gICAgICBub2RlcyA9IG5vZGVzLmNvbmNhdChjdXJyZW50LmNoaWxkcmVuKTtcbiAgICB9XG4gIH0sXG4gIGdldEJvdW5kaW5nQm94OiBmdW5jdGlvbiBnZXRCb3VuZGluZ0JveCgpIHtcbiAgICAvLyBCQm94IGZvciBqdXN0IG9uZSB0cmVlIG5vZGVcbiAgICB2YXIgYmIgPSB7XG4gICAgICBsZWZ0OiBOdW1iZXIuTUFYX1ZBTFVFLFxuICAgICAgdG9wOiBOdW1iZXIuTUFYX1ZBTFVFLFxuICAgICAgd2lkdGg6IDAsXG4gICAgICBoZWlnaHQ6IDBcbiAgICB9O1xuICAgIHRoaXMuZWFjaE5vZGUoZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgIGJiLmxlZnQgPSBNYXRoLm1pbihiYi5sZWZ0LCBub2RlLngpO1xuICAgICAgYmIudG9wID0gTWF0aC5taW4oYmIudG9wLCBub2RlLnkpO1xuICAgICAgYmIud2lkdGggPSBNYXRoLm1heChiYi53aWR0aCwgbm9kZS54ICsgbm9kZS53aWR0aCk7XG4gICAgICBiYi5oZWlnaHQgPSBNYXRoLm1heChiYi5oZWlnaHQsIG5vZGUueSArIG5vZGUuaGVpZ2h0KTtcbiAgICB9KTtcbiAgICByZXR1cm4gYmI7XG4gIH0sXG4gIC8vIHRyYW5zbGF0ZVxuICB0cmFuc2xhdGU6IGZ1bmN0aW9uIHRyYW5zbGF0ZSh0eCwgdHkpIHtcbiAgICBpZiAodHggPT09IHZvaWQgMCkge1xuICAgICAgdHggPSAwO1xuICAgIH1cblxuICAgIGlmICh0eSA9PT0gdm9pZCAwKSB7XG4gICAgICB0eSA9IDA7XG4gICAgfVxuXG4gICAgdGhpcy5lYWNoTm9kZShmdW5jdGlvbiAobm9kZSkge1xuICAgICAgbm9kZS54ICs9IHR4O1xuICAgICAgbm9kZS55ICs9IHR5O1xuICAgICAgbm9kZS54ICs9IG5vZGUucHJlSDtcbiAgICAgIG5vZGUueSArPSBub2RlLnByZVY7XG4gICAgfSk7XG4gIH0sXG4gIHJpZ2h0MmxlZnQ6IGZ1bmN0aW9uIHJpZ2h0MmxlZnQoKSB7XG4gICAgdmFyIG1lID0gdGhpcztcbiAgICB2YXIgYmIgPSBtZS5nZXRCb3VuZGluZ0JveCgpO1xuICAgIG1lLmVhY2hOb2RlKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICBub2RlLnggPSBub2RlLnggLSAobm9kZS54IC0gYmIubGVmdCkgKiAyIC0gbm9kZS53aWR0aDsgLy8gbm9kZS54ID0gLSBub2RlLng7XG4gICAgfSk7XG4gICAgbWUudHJhbnNsYXRlKGJiLndpZHRoLCAwKTtcbiAgfSxcbiAgYm90dG9tMnRvcDogZnVuY3Rpb24gYm90dG9tMnRvcCgpIHtcbiAgICB2YXIgbWUgPSB0aGlzO1xuICAgIHZhciBiYiA9IG1lLmdldEJvdW5kaW5nQm94KCk7XG4gICAgbWUuZWFjaE5vZGUoZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgIG5vZGUueSA9IG5vZGUueSAtIChub2RlLnkgLSBiYi50b3ApICogMiAtIG5vZGUuaGVpZ2h0OyAvLyBub2RlLnkgPSAtIG5vZGUueTtcbiAgICB9KTtcbiAgICBtZS50cmFuc2xhdGUoMCwgYmIuaGVpZ2h0KTtcbiAgfVxufSk7XG5cbmZ1bmN0aW9uIGhpZXJhcmNoeShkYXRhLCBvcHRpb25zLCBpc29sYXRlZCkge1xuICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG5cbiAgb3B0aW9ucyA9IHV0aWwuYXNzaWduKHt9LCBERUZBVUxUX09QVElPTlMsIG9wdGlvbnMpO1xuICB2YXIgcm9vdCA9IG5ldyBOb2RlKGRhdGEsIG9wdGlvbnMpO1xuICB2YXIgbm9kZXMgPSBbcm9vdF07XG4gIHZhciBub2RlO1xuXG4gIGlmICghaXNvbGF0ZWQgJiYgIWRhdGEuY29sbGFwc2VkKSB7XG4gICAgd2hpbGUgKG5vZGUgPSBub2Rlcy5zaGlmdCgpKSB7XG4gICAgICBpZiAoIW5vZGUuZGF0YS5jb2xsYXBzZWQpIHtcbiAgICAgICAgdmFyIGNoaWxkcmVuID0gb3B0aW9ucy5nZXRDaGlsZHJlbihub2RlLmRhdGEpO1xuICAgICAgICB2YXIgbGVuZ3RoID0gY2hpbGRyZW4gPyBjaGlsZHJlbi5sZW5ndGggOiAwO1xuICAgICAgICBub2RlLmNoaWxkcmVuID0gbmV3IEFycmF5KGxlbmd0aCk7XG5cbiAgICAgICAgaWYgKGNoaWxkcmVuICYmIGxlbmd0aCkge1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBjaGlsZCA9IG5ldyBOb2RlKGNoaWxkcmVuW2ldLCBvcHRpb25zKTtcbiAgICAgICAgICAgIG5vZGUuY2hpbGRyZW5baV0gPSBjaGlsZDtcbiAgICAgICAgICAgIG5vZGVzLnB1c2goY2hpbGQpO1xuICAgICAgICAgICAgY2hpbGQucGFyZW50ID0gbm9kZTtcbiAgICAgICAgICAgIGNoaWxkLmRlcHRoID0gbm9kZS5kZXB0aCArIDE7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJvb3Q7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaGllcmFyY2h5O1xuXG4vKioqLyB9KSxcbi8qIDE5ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9faXNfbmlsX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fa2V5c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMCk7XG5cblxuXG5mdW5jdGlvbiBpc01hdGNoKG9iaiwgYXR0cnMpIHtcbiAgdmFyIF9rZXlzID0gT2JqZWN0KF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fa2V5c19fW1wiYVwiIC8qIGRlZmF1bHQgKi9dKShhdHRycyk7XG5cbiAgdmFyIGxlbmd0aCA9IF9rZXlzLmxlbmd0aDtcbiAgaWYgKE9iamVjdChfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX2lzX25pbF9fW1wiYVwiIC8qIGRlZmF1bHQgKi9dKShvYmopKSByZXR1cm4gIWxlbmd0aDtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7XG4gICAgdmFyIGtleSA9IF9rZXlzW2ldO1xuXG4gICAgaWYgKGF0dHJzW2tleV0gIT09IG9ialtrZXldIHx8ICEoa2V5IGluIG9iaikpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyBfX3dlYnBhY2tfZXhwb3J0c19fW1wiYVwiXSA9IChpc01hdGNoKTtcblxuLyoqKi8gfSksXG4vKiAyMCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX2VhY2hfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX19pc19mdW5jdGlvbl9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKTtcblxuXG52YXIga2V5cyA9IE9iamVjdC5rZXlzID8gZnVuY3Rpb24gKG9iaikge1xuICByZXR1cm4gT2JqZWN0LmtleXMob2JqKTtcbn0gOiBmdW5jdGlvbiAob2JqKSB7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgT2JqZWN0KF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fZWFjaF9fW1wiYVwiIC8qIGRlZmF1bHQgKi9dKShvYmosIGZ1bmN0aW9uICh2YWx1ZSwga2V5KSB7XG4gICAgaWYgKCEoT2JqZWN0KF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9faXNfZnVuY3Rpb25fX1tcImFcIiAvKiBkZWZhdWx0ICovXSkob2JqKSAmJiBrZXkgPT09ICdwcm90b3R5cGUnKSkge1xuICAgICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufTtcbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1tcImFcIl0gPSAoa2V5cyk7XG5cbi8qKiovIH0pLFxuLyogMjEgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19pc19hcnJheV9saWtlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpO1xuXG52YXIgc3BsaWNlID0gQXJyYXkucHJvdG90eXBlLnNwbGljZTtcblxudmFyIHB1bGxBdCA9IGZ1bmN0aW9uIHB1bGxBdChhcnIsIGluZGV4ZXMpIHtcbiAgaWYgKCFPYmplY3QoX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19pc19hcnJheV9saWtlX19bXCJhXCIgLyogZGVmYXVsdCAqL10pKGFycikpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICB2YXIgbGVuZ3RoID0gYXJyID8gaW5kZXhlcy5sZW5ndGggOiAwO1xuICB2YXIgbGFzdCA9IGxlbmd0aCAtIDE7XG5cbiAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgdmFyIHByZXZpb3VzID0gdm9pZCAwO1xuICAgIHZhciBpbmRleCA9IGluZGV4ZXNbbGVuZ3RoXTtcblxuICAgIGlmIChsZW5ndGggPT09IGxhc3QgfHwgaW5kZXggIT09IHByZXZpb3VzKSB7XG4gICAgICBwcmV2aW91cyA9IGluZGV4O1xuICAgICAgc3BsaWNlLmNhbGwoYXJyLCBpbmRleCwgMSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGFycjtcbn07XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1tcImFcIl0gPSAocHVsbEF0KTtcblxuLyoqKi8gfSksXG4vKiAyMiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX2NvbnRhaW5zX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEyKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfX2VhY2hfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMik7XG5cblxuXG52YXIgdW5pcSA9IGZ1bmN0aW9uIChhcnIpIHtcbiAgdmFyIHJlc3VsdEFyciA9IFtdO1xuICBPYmplY3QoX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX19lYWNoX19bXCJhXCIgLyogZGVmYXVsdCAqL10pKGFyciwgZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICBpZiAoIU9iamVjdChfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX2NvbnRhaW5zX19bXCJhXCIgLyogZGVmYXVsdCAqL10pKHJlc3VsdEFyciwgaXRlbSkpIHtcbiAgICAgIHJlc3VsdEFyci5wdXNoKGl0ZW0pO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiByZXN1bHRBcnI7XG59O1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIF9fd2VicGFja19leHBvcnRzX19bXCJhXCJdID0gKHVuaXEpO1xuXG4vKioqLyB9KSxcbi8qIDIzICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9faXNfYXJyYXlfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMCk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX19pc19mdW5jdGlvbl9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfX2dyb3VwX2J5X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI0KTtcblxuXG5cblxudmFyIGdyb3VwVG9NYXAgPSBmdW5jdGlvbiAoZGF0YSwgY29uZGl0aW9uKSB7XG4gIGlmICghY29uZGl0aW9uKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIDA6IGRhdGFcbiAgICB9O1xuICB9XG5cbiAgaWYgKCFPYmplY3QoX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX19pc19mdW5jdGlvbl9fW1wiYVwiIC8qIGRlZmF1bHQgKi9dKShjb25kaXRpb24pKSB7XG4gICAgdmFyIHBhcmFtc0NvbmRpdGlvbl8xID0gT2JqZWN0KF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9faXNfYXJyYXlfX1tcImFcIiAvKiBkZWZhdWx0ICovXSkoY29uZGl0aW9uKSA/IGNvbmRpdGlvbiA6IGNvbmRpdGlvbi5yZXBsYWNlKC9cXHMrL2csICcnKS5zcGxpdCgnKicpO1xuXG4gICAgY29uZGl0aW9uID0gZnVuY3Rpb24gKHJvdykge1xuICAgICAgdmFyIHVuaXF1ZSA9ICdfJzsgLy8g6YG/5YWN5Ye6546w5pWw5a2X5L2c5Li6S2V555qE5oOF5Ya177yM5Lya6L+b6KGM5oyJ54Wn5pWw5a2X55qE5o6S5bqPXG5cbiAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gcGFyYW1zQ29uZGl0aW9uXzEubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIHVuaXF1ZSArPSByb3dbcGFyYW1zQ29uZGl0aW9uXzFbaV1dICYmIHJvd1twYXJhbXNDb25kaXRpb25fMVtpXV0udG9TdHJpbmcoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHVuaXF1ZTtcbiAgICB9O1xuICB9XG5cbiAgdmFyIGdyb3VwcyA9IE9iamVjdChfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfX2dyb3VwX2J5X19bXCJhXCIgLyogZGVmYXVsdCAqL10pKGRhdGEsIGNvbmRpdGlvbik7XG4gIHJldHVybiBncm91cHM7XG59O1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIF9fd2VicGFja19leHBvcnRzX19bXCJhXCJdID0gKGdyb3VwVG9NYXApO1xuXG4vKioqLyB9KSxcbi8qIDI0ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fZWFjaF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfX2lzX2FycmF5X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9faXNfZnVuY3Rpb25fXyA9IF9fd2VicGFja19yZXF1aXJlX18oMyk7XG5cblxuXG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuXG5mdW5jdGlvbiBncm91cEJ5KGRhdGEsIGNvbmRpdGlvbikge1xuICBpZiAoIWNvbmRpdGlvbiB8fCAhT2JqZWN0KF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9faXNfYXJyYXlfX1tcImFcIiAvKiBkZWZhdWx0ICovXSkoZGF0YSkpIHtcbiAgICByZXR1cm4ge307XG4gIH1cblxuICB2YXIgcmVzdWx0ID0ge307IC8vIOWFvOWuueaWueazleWSjCDlrZfnrKbkuLLnmoTlhpnms5VcblxuICB2YXIgcHJlZGljYXRlID0gT2JqZWN0KF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9faXNfZnVuY3Rpb25fX1tcImFcIiAvKiBkZWZhdWx0ICovXSkoY29uZGl0aW9uKSA/IGNvbmRpdGlvbiA6IGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgcmV0dXJuIGl0ZW1bY29uZGl0aW9uXTtcbiAgfTtcbiAgdmFyIGtleTtcbiAgT2JqZWN0KF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fZWFjaF9fW1wiYVwiIC8qIGRlZmF1bHQgKi9dKShkYXRhLCBmdW5jdGlvbiAoaXRlbSkge1xuICAgIGtleSA9IHByZWRpY2F0ZShpdGVtKTtcblxuICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHJlc3VsdCwga2V5KSkge1xuICAgICAgcmVzdWx0W2tleV0ucHVzaChpdGVtKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0W2tleV0gPSBbaXRlbV07XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyBfX3dlYnBhY2tfZXhwb3J0c19fW1wiYVwiXSA9IChncm91cEJ5KTtcblxuLyoqKi8gfSksXG4vKiAyNSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1tcImFcIl0gPSAoZnVuY3Rpb24gKG9iaiwga2V5KSB7XG4gIHJldHVybiBvYmouaGFzT3duUHJvcGVydHkoa2V5KTtcbn0pO1xuXG4vKioqLyB9KSxcbi8qIDI2ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fZWFjaF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfX2lzX2Z1bmN0aW9uX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpO1xuXG4gLy8gQHRzLWlnbm9yZVxuXG52YXIgdmFsdWVzID0gT2JqZWN0LnZhbHVlcyA/IGZ1bmN0aW9uIChvYmopIHtcbiAgcmV0dXJuIE9iamVjdC52YWx1ZXMob2JqKTtcbn0gOiBmdW5jdGlvbiAob2JqKSB7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgT2JqZWN0KF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fZWFjaF9fW1wiYVwiIC8qIGRlZmF1bHQgKi9dKShvYmosIGZ1bmN0aW9uICh2YWx1ZSwga2V5KSB7XG4gICAgaWYgKCEoT2JqZWN0KF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9faXNfZnVuY3Rpb25fX1tcImFcIiAvKiBkZWZhdWx0ICovXSkob2JqKSAmJiBrZXkgPT09ICdwcm90b3R5cGUnKSkge1xuICAgICAgcmVzdWx0LnB1c2godmFsdWUpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyBfX3dlYnBhY2tfZXhwb3J0c19fW1wiYVwiXSA9ICh2YWx1ZXMpO1xuXG4vKioqLyB9KSxcbi8qIDI3ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xudmFyIHRvU3RyaW5nID0ge30udG9TdHJpbmc7XG5cbnZhciBnZXRUeXBlID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbHVlKS5yZXBsYWNlKC9eXFxbb2JqZWN0IC8sICcnKS5yZXBsYWNlKC9dJC8sICcnKTtcbn07XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1tcImFcIl0gPSAoZ2V0VHlwZSk7XG5cbi8qKiovIH0pLFxuLyogMjggKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG52YXIgaXNQcm90b3R5cGUgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgdmFyIEN0b3IgPSB2YWx1ZSAmJiB2YWx1ZS5jb25zdHJ1Y3RvcjtcbiAgdmFyIHByb3RvID0gdHlwZW9mIEN0b3IgPT09ICdmdW5jdGlvbicgJiYgQ3Rvci5wcm90b3R5cGUgfHwgb2JqZWN0UHJvdG87XG4gIHJldHVybiB2YWx1ZSA9PT0gcHJvdG87XG59O1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIF9fd2VicGFja19leHBvcnRzX19bXCJhXCJdID0gKGlzUHJvdG90eXBlKTtcblxuLyoqKi8gfSksXG4vKiAyOSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX2lzX29iamVjdF9saWtlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE1KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfX2lzX2FycmF5X2xpa2VfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX19pc19zdHJpbmdfXyA9IF9fd2VicGFja19yZXF1aXJlX18oOCk7XG5cblxuXG5cbnZhciBpc0VxdWFsID0gZnVuY3Rpb24gKHZhbHVlLCBvdGhlcikge1xuICBpZiAodmFsdWUgPT09IG90aGVyKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoIXZhbHVlIHx8ICFvdGhlcikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChPYmplY3QoX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX19pc19zdHJpbmdfX1tcImFcIiAvKiBkZWZhdWx0ICovXSkodmFsdWUpIHx8IE9iamVjdChfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfX2lzX3N0cmluZ19fW1wiYVwiIC8qIGRlZmF1bHQgKi9dKShvdGhlcikpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoT2JqZWN0KF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9faXNfYXJyYXlfbGlrZV9fW1wiYVwiIC8qIGRlZmF1bHQgKi9dKSh2YWx1ZSkgfHwgT2JqZWN0KF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9faXNfYXJyYXlfbGlrZV9fW1wiYVwiIC8qIGRlZmF1bHQgKi9dKShvdGhlcikpIHtcbiAgICBpZiAodmFsdWUubGVuZ3RoICE9PSBvdGhlci5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB2YXIgcnN0ID0gdHJ1ZTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJzdCA9IGlzRXF1YWwodmFsdWVbaV0sIG90aGVyW2ldKTtcblxuICAgICAgaWYgKCFyc3QpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJzdDtcbiAgfVxuXG4gIGlmIChPYmplY3QoX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19pc19vYmplY3RfbGlrZV9fW1wiYVwiIC8qIGRlZmF1bHQgKi9dKSh2YWx1ZSkgfHwgT2JqZWN0KF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9faXNfb2JqZWN0X2xpa2VfX1tcImFcIiAvKiBkZWZhdWx0ICovXSkob3RoZXIpKSB7XG4gICAgdmFyIHZhbHVlS2V5cyA9IE9iamVjdC5rZXlzKHZhbHVlKTtcbiAgICB2YXIgb3RoZXJLZXlzID0gT2JqZWN0LmtleXMob3RoZXIpO1xuXG4gICAgaWYgKHZhbHVlS2V5cy5sZW5ndGggIT09IG90aGVyS2V5cy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB2YXIgcnN0ID0gdHJ1ZTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWVLZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICByc3QgPSBpc0VxdWFsKHZhbHVlW3ZhbHVlS2V5c1tpXV0sIG90aGVyW3ZhbHVlS2V5c1tpXV0pO1xuXG4gICAgICBpZiAoIXJzdCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcnN0O1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyBfX3dlYnBhY2tfZXhwb3J0c19fW1wiYVwiXSA9IChpc0VxdWFsKTtcblxuLyoqKi8gfSksXG4vKiAzMCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG52YXIgaGllcmFyY2h5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxOCk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHJvb3QsIG9wdGlvbnMpIHtcbiAgLy8gc2VwYXJhdGUgaW50byBsZWZ0IGFuZCByaWdodCB0cmVlc1xuICB2YXIgbGVmdCA9IGhpZXJhcmNoeShyb290LmRhdGEsIG9wdGlvbnMsIHRydWUpOyAvLyByb290IG9ubHlcblxuICB2YXIgcmlnaHQgPSBoaWVyYXJjaHkocm9vdC5kYXRhLCBvcHRpb25zLCB0cnVlKTsgLy8gcm9vdCBvbmx5XG4gIC8vIGF1dG9tYXRpY2FsbHlcblxuICB2YXIgdHJlZVNpemUgPSByb290LmNoaWxkcmVuLmxlbmd0aDtcbiAgdmFyIHJpZ2h0VHJlZVNpemUgPSBNYXRoLnJvdW5kKHRyZWVTaXplIC8gMik7IC8vIHNlcGFyYXRlIGxlZnQgYW5kIHJpZ2h0IHRyZWUgYnkgbWV0YSBkYXRhXG5cbiAgdmFyIGdldFNpZGUgPSBvcHRpb25zLmdldFNpZGUgfHwgZnVuY3Rpb24gKGNoaWxkLCBpbmRleCkge1xuICAgIGlmIChpbmRleCA8IHJpZ2h0VHJlZVNpemUpIHtcbiAgICAgIHJldHVybiAncmlnaHQnO1xuICAgIH1cblxuICAgIHJldHVybiAnbGVmdCc7XG4gIH07XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0cmVlU2l6ZTsgaSsrKSB7XG4gICAgdmFyIGNoaWxkID0gcm9vdC5jaGlsZHJlbltpXTtcbiAgICB2YXIgc2lkZSA9IGdldFNpZGUoY2hpbGQsIGkpO1xuXG4gICAgaWYgKHNpZGUgPT09ICdyaWdodCcpIHtcbiAgICAgIHJpZ2h0LmNoaWxkcmVuLnB1c2goY2hpbGQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZWZ0LmNoaWxkcmVuLnB1c2goY2hpbGQpO1xuICAgIH1cbiAgfVxuXG4gIGxlZnQuZWFjaE5vZGUoZnVuY3Rpb24gKG5vZGUpIHtcbiAgICBpZiAoIW5vZGUuaXNSb290KCkpIHtcbiAgICAgIG5vZGUuc2lkZSA9ICdsZWZ0JztcbiAgICB9XG4gIH0pO1xuICByaWdodC5lYWNoTm9kZShmdW5jdGlvbiAobm9kZSkge1xuICAgIGlmICghbm9kZS5pc1Jvb3QoKSkge1xuICAgICAgbm9kZS5zaWRlID0gJ3JpZ2h0JztcbiAgICB9XG4gIH0pO1xuICByZXR1cm4ge1xuICAgIGxlZnQ6IGxlZnQsXG4gICAgcmlnaHQ6IHJpZ2h0XG4gIH07XG59O1xuXG4vKioqLyB9KSxcbi8qIDMxICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cbnZhciBoaWVyYXJjaHkgPSB7XG4gIGNvbXBhY3RCb3g6IF9fd2VicGFja19yZXF1aXJlX18oMzIpLFxuICBkZW5kcm9ncmFtOiBfX3dlYnBhY2tfcmVxdWlyZV9fKDExNCksXG4gIGluZGVudGVkOiBfX3dlYnBhY2tfcmVxdWlyZV9fKDExNiksXG4gIG1pbmRtYXA6IF9fd2VicGFja19yZXF1aXJlX18oMTE4KVxufTtcbm1vZHVsZS5leHBvcnRzID0gaGllcmFyY2h5O1xuXG4vKioqLyB9KSxcbi8qIDMyICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cbmZ1bmN0aW9uIF9pbmhlcml0c0xvb3NlKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcy5wcm90b3R5cGUpOyBzdWJDbGFzcy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBzdWJDbGFzczsgc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXG52YXIgVHJlZUxheW91dCA9IF9fd2VicGFja19yZXF1aXJlX18oMTEpO1xuXG52YXIgbm9uTGF5ZXJlZFRpZHlUcmVlID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMTMpO1xuXG52YXIgZG9UcmVlTGF5b3V0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNyk7XG5cbnZhciB1dGlsID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3KTtcblxudmFyIENvbXBhY3RCb3hUcmVlTGF5b3V0ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfVHJlZUxheW91dCkge1xuICBfaW5oZXJpdHNMb29zZShDb21wYWN0Qm94VHJlZUxheW91dCwgX1RyZWVMYXlvdXQpO1xuXG4gIGZ1bmN0aW9uIENvbXBhY3RCb3hUcmVlTGF5b3V0KCkge1xuICAgIHJldHVybiBfVHJlZUxheW91dC5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gIH1cblxuICB2YXIgX3Byb3RvID0gQ29tcGFjdEJveFRyZWVMYXlvdXQucHJvdG90eXBlO1xuXG4gIF9wcm90by5leGVjdXRlID0gZnVuY3Rpb24gZXhlY3V0ZSgpIHtcbiAgICB2YXIgbWUgPSB0aGlzO1xuICAgIHJldHVybiBkb1RyZWVMYXlvdXQobWUucm9vdE5vZGUsIG1lLm9wdGlvbnMsIG5vbkxheWVyZWRUaWR5VHJlZSk7XG4gIH07XG5cbiAgcmV0dXJuIENvbXBhY3RCb3hUcmVlTGF5b3V0O1xufShUcmVlTGF5b3V0KTtcblxudmFyIERFRkFVTFRfT1BUSU9OUyA9IHt9O1xuXG5mdW5jdGlvbiBjb21wYWN0Qm94TGF5b3V0KHJvb3QsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IHV0aWwuYXNzaWduKHt9LCBERUZBVUxUX09QVElPTlMsIG9wdGlvbnMpO1xuICByZXR1cm4gbmV3IENvbXBhY3RCb3hUcmVlTGF5b3V0KHJvb3QsIG9wdGlvbnMpLmV4ZWN1dGUoKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjb21wYWN0Qm94TGF5b3V0O1xuXG4vKioqLyB9KSxcbi8qIDMzICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KF9fd2VicGFja19leHBvcnRzX18sIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fY29udGFpbnNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTIpO1xuLyogaGFybW9ueSByZWV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwiY29udGFpbnNcIiwgZnVuY3Rpb24oKSB7IHJldHVybiBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX2NvbnRhaW5zX19bXCJhXCJdOyB9KTtcbi8qIGhhcm1vbnkgcmVleHBvcnQgKGJpbmRpbmcpICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCBcImluY2x1ZGVzXCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19jb250YWluc19fW1wiYVwiXTsgfSk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX19kaWZmZXJlbmNlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM0KTtcbi8qIGhhcm1vbnkgcmVleHBvcnQgKGJpbmRpbmcpICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCBcImRpZmZlcmVuY2VcIiwgZnVuY3Rpb24oKSB7IHJldHVybiBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfX2RpZmZlcmVuY2VfX1tcImFcIl07IH0pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fZmluZF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNSk7XG4vKiBoYXJtb255IHJlZXhwb3J0IChiaW5kaW5nKSAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJmaW5kXCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX19maW5kX19bXCJhXCJdOyB9KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfX2ZpbmRfaW5kZXhfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMzYpO1xuLyogaGFybW9ueSByZWV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwiZmluZEluZGV4XCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX19maW5kX2luZGV4X19bXCJhXCJdOyB9KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzRfX2ZpcnN0X3ZhbHVlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM3KTtcbi8qIGhhcm1vbnkgcmVleHBvcnQgKGJpbmRpbmcpICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCBcImZpcnN0VmFsdWVcIiwgZnVuY3Rpb24oKSB7IHJldHVybiBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzRfX2ZpcnN0X3ZhbHVlX19bXCJhXCJdOyB9KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzVfX2ZsYXR0ZW5fXyA9IF9fd2VicGFja19yZXF1aXJlX18oMzgpO1xuLyogaGFybW9ueSByZWV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwiZmxhdHRlblwiLCBmdW5jdGlvbigpIHsgcmV0dXJuIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNV9fZmxhdHRlbl9fW1wiYVwiXTsgfSk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82X19mbGF0dGVuX2RlZXBfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMzkpO1xuLyogaGFybW9ueSByZWV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwiZmxhdHRlbkRlZXBcIiwgZnVuY3Rpb24oKSB7IHJldHVybiBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzZfX2ZsYXR0ZW5fZGVlcF9fW1wiYVwiXTsgfSk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV83X19nZXRfcmFuZ2VfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNDApO1xuLyogaGFybW9ueSByZWV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwiZ2V0UmFuZ2VcIiwgZnVuY3Rpb24oKSB7IHJldHVybiBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzdfX2dldF9yYW5nZV9fW1wiYVwiXTsgfSk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV84X19wdWxsX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQxKTtcbi8qIGhhcm1vbnkgcmVleHBvcnQgKGJpbmRpbmcpICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCBcInB1bGxcIiwgZnVuY3Rpb24oKSB7IHJldHVybiBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzhfX3B1bGxfX1tcImFcIl07IH0pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfOV9fcHVsbF9hdF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMSk7XG4vKiBoYXJtb255IHJlZXhwb3J0IChiaW5kaW5nKSAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJwdWxsQXRcIiwgZnVuY3Rpb24oKSB7IHJldHVybiBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzlfX3B1bGxfYXRfX1tcImFcIl07IH0pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTBfX3JlZHVjZV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0Mik7XG4vKiBoYXJtb255IHJlZXhwb3J0IChiaW5kaW5nKSAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJyZWR1Y2VcIiwgZnVuY3Rpb24oKSB7IHJldHVybiBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzEwX19yZWR1Y2VfX1tcImFcIl07IH0pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTFfX3JlbW92ZV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0Myk7XG4vKiBoYXJtb255IHJlZXhwb3J0IChiaW5kaW5nKSAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJyZW1vdmVcIiwgZnVuY3Rpb24oKSB7IHJldHVybiBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzExX19yZW1vdmVfX1tcImFcIl07IH0pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTJfX3NvcnRfYnlfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNDQpO1xuLyogaGFybW9ueSByZWV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwic29ydEJ5XCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xMl9fc29ydF9ieV9fW1wiYVwiXTsgfSk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xM19fdW5pb25fXyA9IF9fd2VicGFja19yZXF1aXJlX18oNDUpO1xuLyogaGFybW9ueSByZWV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwidW5pb25cIiwgZnVuY3Rpb24oKSB7IHJldHVybiBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzEzX191bmlvbl9fW1wiYVwiXTsgfSk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xNF9fdW5pcV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMik7XG4vKiBoYXJtb255IHJlZXhwb3J0IChiaW5kaW5nKSAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJ1bmlxXCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xNF9fdW5pcV9fW1wiYVwiXTsgfSk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xNV9fdmFsdWVzX29mX2tleV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0Nik7XG4vKiBoYXJtb255IHJlZXhwb3J0IChiaW5kaW5nKSAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJ2YWx1ZXNPZktleVwiLCBmdW5jdGlvbigpIHsgcmV0dXJuIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTVfX3ZhbHVlc19vZl9rZXlfX1tcImFcIl07IH0pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTZfX2hlYWRfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNDcpO1xuLyogaGFybW9ueSByZWV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwiaGVhZFwiLCBmdW5jdGlvbigpIHsgcmV0dXJuIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTZfX2hlYWRfX1tcImFcIl07IH0pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTdfX2xhc3RfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNDgpO1xuLyogaGFybW9ueSByZWV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwibGFzdFwiLCBmdW5jdGlvbigpIHsgcmV0dXJuIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTdfX2xhc3RfX1tcImFcIl07IH0pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMThfX3N0YXJ0c193aXRoX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ5KTtcbi8qIGhhcm1vbnkgcmVleHBvcnQgKGJpbmRpbmcpICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCBcInN0YXJ0c1dpdGhcIiwgZnVuY3Rpb24oKSB7IHJldHVybiBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzE4X19zdGFydHNfd2l0aF9fW1wiYVwiXTsgfSk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xOV9fZW5kc193aXRoX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUwKTtcbi8qIGhhcm1vbnkgcmVleHBvcnQgKGJpbmRpbmcpICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCBcImVuZHNXaXRoXCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xOV9fZW5kc193aXRoX19bXCJhXCJdOyB9KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzIwX19maWx0ZXJfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTQpO1xuLyogaGFybW9ueSByZWV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwiZmlsdGVyXCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yMF9fZmlsdGVyX19bXCJhXCJdOyB9KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzIxX19ldmVyeV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1MSk7XG4vKiBoYXJtb255IHJlZXhwb3J0IChiaW5kaW5nKSAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJldmVyeVwiLCBmdW5jdGlvbigpIHsgcmV0dXJuIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMjFfX2V2ZXJ5X19bXCJhXCJdOyB9KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzIyX19zb21lX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUyKTtcbi8qIGhhcm1vbnkgcmVleHBvcnQgKGJpbmRpbmcpICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCBcInNvbWVcIiwgZnVuY3Rpb24oKSB7IHJldHVybiBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzIyX19zb21lX19bXCJhXCJdOyB9KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzIzX19ncm91cF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1Myk7XG4vKiBoYXJtb255IHJlZXhwb3J0IChiaW5kaW5nKSAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJncm91cFwiLCBmdW5jdGlvbigpIHsgcmV0dXJuIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMjNfX2dyb3VwX19bXCJhXCJdOyB9KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzI0X19ncm91cF9ieV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNCk7XG4vKiBoYXJtb255IHJlZXhwb3J0IChiaW5kaW5nKSAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJncm91cEJ5XCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yNF9fZ3JvdXBfYnlfX1tcImFcIl07IH0pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMjVfX2dyb3VwX3RvX21hcF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMyk7XG4vKiBoYXJtb255IHJlZXhwb3J0IChiaW5kaW5nKSAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJncm91cFRvTWFwXCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yNV9fZ3JvdXBfdG9fbWFwX19bXCJhXCJdOyB9KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzI2X19nZXRfd3JhcF9iZWhhdmlvcl9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NCk7XG4vKiBoYXJtb255IHJlZXhwb3J0IChiaW5kaW5nKSAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJnZXRXcmFwQmVoYXZpb3JcIiwgZnVuY3Rpb24oKSB7IHJldHVybiBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzI2X19nZXRfd3JhcF9iZWhhdmlvcl9fW1wiYVwiXTsgfSk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yN19fd3JhcF9iZWhhdmlvcl9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NSk7XG4vKiBoYXJtb255IHJlZXhwb3J0IChiaW5kaW5nKSAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJ3cmFwQmVoYXZpb3JcIiwgZnVuY3Rpb24oKSB7IHJldHVybiBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzI3X193cmFwX2JlaGF2aW9yX19bXCJhXCJdOyB9KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzI4X19udW1iZXIyY29sb3JfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNTYpO1xuLyogaGFybW9ueSByZWV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwibnVtYmVyMmNvbG9yXCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yOF9fbnVtYmVyMmNvbG9yX19bXCJhXCJdOyB9KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzI5X19wYXJzZV9yYWRpdXNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNTcpO1xuLyogaGFybW9ueSByZWV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwicGFyc2VSYWRpdXNcIiwgZnVuY3Rpb24oKSB7IHJldHVybiBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzI5X19wYXJzZV9yYWRpdXNfX1tcImFcIl07IH0pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMzBfX2NsYW1wX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU4KTtcbi8qIGhhcm1vbnkgcmVleHBvcnQgKGJpbmRpbmcpICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCBcImNsYW1wXCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zMF9fY2xhbXBfX1tcImFcIl07IH0pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMzFfX2ZpeGVkX2Jhc2VfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNTkpO1xuLyogaGFybW9ueSByZWV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwiZml4ZWRCYXNlXCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zMV9fZml4ZWRfYmFzZV9fW1wiYVwiXTsgfSk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zMl9faXNfZGVjaW1hbF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2MCk7XG4vKiBoYXJtb255IHJlZXhwb3J0IChiaW5kaW5nKSAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJpc0RlY2ltYWxcIiwgZnVuY3Rpb24oKSB7IHJldHVybiBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzMyX19pc19kZWNpbWFsX19bXCJhXCJdOyB9KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzMzX19pc19ldmVuX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYxKTtcbi8qIGhhcm1vbnkgcmVleHBvcnQgKGJpbmRpbmcpICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCBcImlzRXZlblwiLCBmdW5jdGlvbigpIHsgcmV0dXJuIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMzNfX2lzX2V2ZW5fX1tcImFcIl07IH0pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMzRfX2lzX2ludGVnZXJfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNjIpO1xuLyogaGFybW9ueSByZWV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwiaXNJbnRlZ2VyXCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zNF9faXNfaW50ZWdlcl9fW1wiYVwiXTsgfSk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zNV9faXNfbmVnYXRpdmVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNjMpO1xuLyogaGFybW9ueSByZWV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwiaXNOZWdhdGl2ZVwiLCBmdW5jdGlvbigpIHsgcmV0dXJuIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMzVfX2lzX25lZ2F0aXZlX19bXCJhXCJdOyB9KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzM2X19pc19udW1iZXJfZXF1YWxfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNjQpO1xuLyogaGFybW9ueSByZWV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwiaXNOdW1iZXJFcXVhbFwiLCBmdW5jdGlvbigpIHsgcmV0dXJuIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMzZfX2lzX251bWJlcl9lcXVhbF9fW1wiYVwiXTsgfSk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zN19faXNfb2RkX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY1KTtcbi8qIGhhcm1vbnkgcmVleHBvcnQgKGJpbmRpbmcpICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCBcImlzT2RkXCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zN19faXNfb2RkX19bXCJhXCJdOyB9KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzM4X19pc19wb3NpdGl2ZV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2Nik7XG4vKiBoYXJtb255IHJlZXhwb3J0IChiaW5kaW5nKSAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJpc1Bvc2l0aXZlXCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zOF9faXNfcG9zaXRpdmVfX1tcImFcIl07IH0pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMzlfX21heF9ieV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2Nyk7XG4vKiBoYXJtb255IHJlZXhwb3J0IChiaW5kaW5nKSAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJtYXhCeVwiLCBmdW5jdGlvbigpIHsgcmV0dXJuIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMzlfX21heF9ieV9fW1wiYVwiXTsgfSk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80MF9fbWluX2J5X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY4KTtcbi8qIGhhcm1vbnkgcmVleHBvcnQgKGJpbmRpbmcpICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCBcIm1pbkJ5XCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80MF9fbWluX2J5X19bXCJhXCJdOyB9KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzQxX19tb2RfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNjkpO1xuLyogaGFybW9ueSByZWV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwibW9kXCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80MV9fbW9kX19bXCJhXCJdOyB9KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzQyX190b19kZWdyZWVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNzApO1xuLyogaGFybW9ueSByZWV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwidG9EZWdyZWVcIiwgZnVuY3Rpb24oKSB7IHJldHVybiBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzQyX190b19kZWdyZWVfX1tcImFcIl07IH0pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNDNfX3RvX2ludGVnZXJfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNzEpO1xuLyogaGFybW9ueSByZWV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwidG9JbnRlZ2VyXCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80M19fdG9faW50ZWdlcl9fW1wiYVwiXTsgfSk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80NF9fdG9fcmFkaWFuX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcyKTtcbi8qIGhhcm1vbnkgcmVleHBvcnQgKGJpbmRpbmcpICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCBcInRvUmFkaWFuXCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80NF9fdG9fcmFkaWFuX19bXCJhXCJdOyB9KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzQ1X19mb3JfaW5fXyA9IF9fd2VicGFja19yZXF1aXJlX18oNzMpO1xuLyogaGFybW9ueSByZWV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwiZm9ySW5cIiwgZnVuY3Rpb24oKSB7IHJldHVybiBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzQ1X19mb3JfaW5fX1tcImFcIl07IH0pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNDZfX2hhc19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNSk7XG4vKiBoYXJtb255IHJlZXhwb3J0IChiaW5kaW5nKSAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJoYXNcIiwgZnVuY3Rpb24oKSB7IHJldHVybiBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzQ2X19oYXNfX1tcImFcIl07IH0pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNDdfX2hhc19rZXlfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNzQpO1xuLyogaGFybW9ueSByZWV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwiaGFzS2V5XCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80N19faGFzX2tleV9fW1wiYVwiXTsgfSk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80OF9faGFzX3ZhbHVlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc1KTtcbi8qIGhhcm1vbnkgcmVleHBvcnQgKGJpbmRpbmcpICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCBcImhhc1ZhbHVlXCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80OF9faGFzX3ZhbHVlX19bXCJhXCJdOyB9KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzQ5X19rZXlzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIwKTtcbi8qIGhhcm1vbnkgcmVleHBvcnQgKGJpbmRpbmcpICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCBcImtleXNcIiwgZnVuY3Rpb24oKSB7IHJldHVybiBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzQ5X19rZXlzX19bXCJhXCJdOyB9KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzUwX19pc19tYXRjaF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxOSk7XG4vKiBoYXJtb255IHJlZXhwb3J0IChiaW5kaW5nKSAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJpc01hdGNoXCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81MF9faXNfbWF0Y2hfX1tcImFcIl07IH0pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNTFfX3ZhbHVlc19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNik7XG4vKiBoYXJtb255IHJlZXhwb3J0IChiaW5kaW5nKSAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJ2YWx1ZXNcIiwgZnVuY3Rpb24oKSB7IHJldHVybiBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzUxX192YWx1ZXNfX1tcImFcIl07IH0pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNTJfX2xvd2VyX2Nhc2VfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNzYpO1xuLyogaGFybW9ueSByZWV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwibG93ZXJDYXNlXCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81Ml9fbG93ZXJfY2FzZV9fW1wiYVwiXTsgfSk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81M19fbG93ZXJfZmlyc3RfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNzcpO1xuLyogaGFybW9ueSByZWV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwibG93ZXJGaXJzdFwiLCBmdW5jdGlvbigpIHsgcmV0dXJuIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNTNfX2xvd2VyX2ZpcnN0X19bXCJhXCJdOyB9KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzU0X19zdWJzdGl0dXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc4KTtcbi8qIGhhcm1vbnkgcmVleHBvcnQgKGJpbmRpbmcpICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCBcInN1YnN0aXR1dGVcIiwgZnVuY3Rpb24oKSB7IHJldHVybiBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzU0X19zdWJzdGl0dXRlX19bXCJhXCJdOyB9KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzU1X191cHBlcl9jYXNlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc5KTtcbi8qIGhhcm1vbnkgcmVleHBvcnQgKGJpbmRpbmcpICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCBcInVwcGVyQ2FzZVwiLCBmdW5jdGlvbigpIHsgcmV0dXJuIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNTVfX3VwcGVyX2Nhc2VfX1tcImFcIl07IH0pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNTZfX3VwcGVyX2ZpcnN0X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgwKTtcbi8qIGhhcm1vbnkgcmVleHBvcnQgKGJpbmRpbmcpICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCBcInVwcGVyRmlyc3RcIiwgZnVuY3Rpb24oKSB7IHJldHVybiBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzU2X191cHBlcl9maXJzdF9fW1wiYVwiXTsgfSk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81N19fZ2V0X3R5cGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMjcpO1xuLyogaGFybW9ueSByZWV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwiZ2V0VHlwZVwiLCBmdW5jdGlvbigpIHsgcmV0dXJuIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNTdfX2dldF90eXBlX19bXCJhXCJdOyB9KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzU4X19pc19hcmd1bWVudHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oODEpO1xuLyogaGFybW9ueSByZWV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwiaXNBcmd1bWVudHNcIiwgZnVuY3Rpb24oKSB7IHJldHVybiBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzU4X19pc19hcmd1bWVudHNfX1tcImFcIl07IH0pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNTlfX2lzX2FycmF5X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xuLyogaGFybW9ueSByZWV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwiaXNBcnJheVwiLCBmdW5jdGlvbigpIHsgcmV0dXJuIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNTlfX2lzX2FycmF5X19bXCJhXCJdOyB9KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzYwX19pc19hcnJheV9saWtlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpO1xuLyogaGFybW9ueSByZWV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwiaXNBcnJheUxpa2VcIiwgZnVuY3Rpb24oKSB7IHJldHVybiBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzYwX19pc19hcnJheV9saWtlX19bXCJhXCJdOyB9KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzYxX19pc19ib29sZWFuX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgyKTtcbi8qIGhhcm1vbnkgcmVleHBvcnQgKGJpbmRpbmcpICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCBcImlzQm9vbGVhblwiLCBmdW5jdGlvbigpIHsgcmV0dXJuIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNjFfX2lzX2Jvb2xlYW5fX1tcImFcIl07IH0pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNjJfX2lzX2RhdGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oODMpO1xuLyogaGFybW9ueSByZWV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwiaXNEYXRlXCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82Ml9faXNfZGF0ZV9fW1wiYVwiXTsgfSk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82M19faXNfZXJyb3JfXyA9IF9fd2VicGFja19yZXF1aXJlX18oODQpO1xuLyogaGFybW9ueSByZWV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwiaXNFcnJvclwiLCBmdW5jdGlvbigpIHsgcmV0dXJuIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNjNfX2lzX2Vycm9yX19bXCJhXCJdOyB9KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzY0X19pc19mdW5jdGlvbl9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKTtcbi8qIGhhcm1vbnkgcmVleHBvcnQgKGJpbmRpbmcpICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCBcImlzRnVuY3Rpb25cIiwgZnVuY3Rpb24oKSB7IHJldHVybiBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzY0X19pc19mdW5jdGlvbl9fW1wiYVwiXTsgfSk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82NV9faXNfZmluaXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDg1KTtcbi8qIGhhcm1vbnkgcmVleHBvcnQgKGJpbmRpbmcpICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCBcImlzRmluaXRlXCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82NV9faXNfZmluaXRlX19bXCJhXCJdOyB9KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzY2X19pc19uaWxfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNik7XG4vKiBoYXJtb255IHJlZXhwb3J0IChiaW5kaW5nKSAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJpc05pbFwiLCBmdW5jdGlvbigpIHsgcmV0dXJuIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNjZfX2lzX25pbF9fW1wiYVwiXTsgfSk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82N19faXNfbnVsbF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4Nik7XG4vKiBoYXJtb255IHJlZXhwb3J0IChiaW5kaW5nKSAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJpc051bGxcIiwgZnVuY3Rpb24oKSB7IHJldHVybiBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzY3X19pc19udWxsX19bXCJhXCJdOyB9KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzY4X19pc19udW1iZXJfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7XG4vKiBoYXJtb255IHJlZXhwb3J0IChiaW5kaW5nKSAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJpc051bWJlclwiLCBmdW5jdGlvbigpIHsgcmV0dXJuIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNjhfX2lzX251bWJlcl9fW1wiYVwiXTsgfSk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82OV9faXNfb2JqZWN0X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEzKTtcbi8qIGhhcm1vbnkgcmVleHBvcnQgKGJpbmRpbmcpICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCBcImlzT2JqZWN0XCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82OV9faXNfb2JqZWN0X19bXCJhXCJdOyB9KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzcwX19pc19vYmplY3RfbGlrZV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNSk7XG4vKiBoYXJtb255IHJlZXhwb3J0IChiaW5kaW5nKSAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJpc09iamVjdExpa2VcIiwgZnVuY3Rpb24oKSB7IHJldHVybiBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzcwX19pc19vYmplY3RfbGlrZV9fW1wiYVwiXTsgfSk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV83MV9faXNfcGxhaW5fb2JqZWN0X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkpO1xuLyogaGFybW9ueSByZWV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwiaXNQbGFpbk9iamVjdFwiLCBmdW5jdGlvbigpIHsgcmV0dXJuIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNzFfX2lzX3BsYWluX29iamVjdF9fW1wiYVwiXTsgfSk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV83Ml9faXNfcHJvdG90eXBlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI4KTtcbi8qIGhhcm1vbnkgcmVleHBvcnQgKGJpbmRpbmcpICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCBcImlzUHJvdG90eXBlXCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV83Ml9faXNfcHJvdG90eXBlX19bXCJhXCJdOyB9KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzczX19pc19yZWdfZXhwX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDg3KTtcbi8qIGhhcm1vbnkgcmVleHBvcnQgKGJpbmRpbmcpICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCBcImlzUmVnRXhwXCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV83M19faXNfcmVnX2V4cF9fW1wiYVwiXTsgfSk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV83NF9faXNfc3RyaW5nX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgpO1xuLyogaGFybW9ueSByZWV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwiaXNTdHJpbmdcIiwgZnVuY3Rpb24oKSB7IHJldHVybiBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzc0X19pc19zdHJpbmdfX1tcImFcIl07IH0pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNzVfX2lzX3R5cGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNCk7XG4vKiBoYXJtb255IHJlZXhwb3J0IChiaW5kaW5nKSAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJpc1R5cGVcIiwgZnVuY3Rpb24oKSB7IHJldHVybiBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzc1X19pc190eXBlX19bXCJhXCJdOyB9KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzc2X19pc191bmRlZmluZWRfXyA9IF9fd2VicGFja19yZXF1aXJlX18oODgpO1xuLyogaGFybW9ueSByZWV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwiaXNVbmRlZmluZWRcIiwgZnVuY3Rpb24oKSB7IHJldHVybiBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzc2X19pc191bmRlZmluZWRfX1tcImFcIl07IH0pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNzdfX2lzX2VsZW1lbnRfXyA9IF9fd2VicGFja19yZXF1aXJlX18oODkpO1xuLyogaGFybW9ueSByZWV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwiaXNFbGVtZW50XCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV83N19faXNfZWxlbWVudF9fW1wiYVwiXTsgfSk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV83OF9fcmVxdWVzdF9hbmltYXRpb25fZnJhbWVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oOTApO1xuLyogaGFybW9ueSByZWV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwicmVxdWVzdEFuaW1hdGlvbkZyYW1lXCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV83OF9fcmVxdWVzdF9hbmltYXRpb25fZnJhbWVfX1tcImFcIl07IH0pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNzlfX2NsZWFyX2FuaW1hdGlvbl9mcmFtZV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5MSk7XG4vKiBoYXJtb255IHJlZXhwb3J0IChiaW5kaW5nKSAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJjbGVhckFuaW1hdGlvbkZyYW1lXCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV83OV9fY2xlYXJfYW5pbWF0aW9uX2ZyYW1lX19bXCJhXCJdOyB9KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzgwX19hdWdtZW50X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkyKTtcbi8qIGhhcm1vbnkgcmVleHBvcnQgKGJpbmRpbmcpICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCBcImF1Z21lbnRcIiwgZnVuY3Rpb24oKSB7IHJldHVybiBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzgwX19hdWdtZW50X19bXCJhXCJdOyB9KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzgxX19jbG9uZV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5Myk7XG4vKiBoYXJtb255IHJlZXhwb3J0IChiaW5kaW5nKSAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJjbG9uZVwiLCBmdW5jdGlvbigpIHsgcmV0dXJuIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfODFfX2Nsb25lX19bXCJhXCJdOyB9KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzgyX19kZWJvdW5jZV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5NCk7XG4vKiBoYXJtb255IHJlZXhwb3J0IChiaW5kaW5nKSAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJkZWJvdW5jZVwiLCBmdW5jdGlvbigpIHsgcmV0dXJuIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfODJfX2RlYm91bmNlX19bXCJhXCJdOyB9KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzgzX19tZW1vaXplX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk1KTtcbi8qIGhhcm1vbnkgcmVleHBvcnQgKGJpbmRpbmcpICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCBcIm1lbW9pemVcIiwgZnVuY3Rpb24oKSB7IHJldHVybiBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzgzX19tZW1vaXplX19bXCJhXCJdOyB9KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzg0X19kZWVwX21peF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5Nik7XG4vKiBoYXJtb255IHJlZXhwb3J0IChiaW5kaW5nKSAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJkZWVwTWl4XCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV84NF9fZGVlcF9taXhfX1tcImFcIl07IH0pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfODVfX2VhY2hfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMik7XG4vKiBoYXJtb255IHJlZXhwb3J0IChiaW5kaW5nKSAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJlYWNoXCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV84NV9fZWFjaF9fW1wiYVwiXTsgfSk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV84Nl9fZXh0ZW5kX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk3KTtcbi8qIGhhcm1vbnkgcmVleHBvcnQgKGJpbmRpbmcpICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCBcImV4dGVuZFwiLCBmdW5jdGlvbigpIHsgcmV0dXJuIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfODZfX2V4dGVuZF9fW1wiYVwiXTsgfSk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV84N19faW5kZXhfb2ZfXyA9IF9fd2VicGFja19yZXF1aXJlX18oOTgpO1xuLyogaGFybW9ueSByZWV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwiaW5kZXhPZlwiLCBmdW5jdGlvbigpIHsgcmV0dXJuIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfODdfX2luZGV4X29mX19bXCJhXCJdOyB9KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzg4X19pc19lbXB0eV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5OSk7XG4vKiBoYXJtb255IHJlZXhwb3J0IChiaW5kaW5nKSAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJpc0VtcHR5XCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV84OF9faXNfZW1wdHlfX1tcImFcIl07IH0pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfODlfX2lzX2VxdWFsX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI5KTtcbi8qIGhhcm1vbnkgcmVleHBvcnQgKGJpbmRpbmcpICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCBcImlzRXF1YWxcIiwgZnVuY3Rpb24oKSB7IHJldHVybiBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzg5X19pc19lcXVhbF9fW1wiYVwiXTsgfSk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV85MF9faXNfZXF1YWxfd2l0aF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMDApO1xuLyogaGFybW9ueSByZWV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwiaXNFcXVhbFdpdGhcIiwgZnVuY3Rpb24oKSB7IHJldHVybiBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzkwX19pc19lcXVhbF93aXRoX19bXCJhXCJdOyB9KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzkxX19tYXBfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTAxKTtcbi8qIGhhcm1vbnkgcmVleHBvcnQgKGJpbmRpbmcpICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCBcIm1hcFwiLCBmdW5jdGlvbigpIHsgcmV0dXJuIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfOTFfX21hcF9fW1wiYVwiXTsgfSk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV85Ml9fbWFwX3ZhbHVlc19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMDIpO1xuLyogaGFybW9ueSByZWV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwibWFwVmFsdWVzXCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV85Ml9fbWFwX3ZhbHVlc19fW1wiYVwiXTsgfSk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV85M19fbWl4X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE2KTtcbi8qIGhhcm1vbnkgcmVleHBvcnQgKGJpbmRpbmcpICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCBcIm1peFwiLCBmdW5jdGlvbigpIHsgcmV0dXJuIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfOTNfX21peF9fW1wiYVwiXTsgfSk7XG4vKiBoYXJtb255IHJlZXhwb3J0IChiaW5kaW5nKSAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJhc3NpZ25cIiwgZnVuY3Rpb24oKSB7IHJldHVybiBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzkzX19taXhfX1tcImFcIl07IH0pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfOTRfX2dldF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMDMpO1xuLyogaGFybW9ueSByZWV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwiZ2V0XCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV85NF9fZ2V0X19bXCJhXCJdOyB9KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzk1X19zZXRfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTA0KTtcbi8qIGhhcm1vbnkgcmVleHBvcnQgKGJpbmRpbmcpICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCBcInNldFwiLCBmdW5jdGlvbigpIHsgcmV0dXJuIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfOTVfX3NldF9fW1wiYVwiXTsgfSk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV85Nl9fcGlja19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMDUpO1xuLyogaGFybW9ueSByZWV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwicGlja1wiLCBmdW5jdGlvbigpIHsgcmV0dXJuIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfOTZfX3BpY2tfX1tcImFcIl07IH0pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfOTdfX3Rocm90dGxlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwNik7XG4vKiBoYXJtb255IHJlZXhwb3J0IChiaW5kaW5nKSAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJ0aHJvdHRsZVwiLCBmdW5jdGlvbigpIHsgcmV0dXJuIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfOTdfX3Rocm90dGxlX19bXCJhXCJdOyB9KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzk4X190b19hcnJheV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMDcpO1xuLyogaGFybW9ueSByZWV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwidG9BcnJheVwiLCBmdW5jdGlvbigpIHsgcmV0dXJuIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfOThfX3RvX2FycmF5X19bXCJhXCJdOyB9KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzk5X190b19zdHJpbmdfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTApO1xuLyogaGFybW9ueSByZWV4cG9ydCAoYmluZGluZykgKi8gX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIFwidG9TdHJpbmdcIiwgZnVuY3Rpb24oKSB7IHJldHVybiBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzk5X190b19zdHJpbmdfX1tcImFcIl07IH0pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTAwX191bmlxdWVfaWRfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTA4KTtcbi8qIGhhcm1vbnkgcmVleHBvcnQgKGJpbmRpbmcpICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCBcInVuaXF1ZUlkXCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xMDBfX3VuaXF1ZV9pZF9fW1wiYVwiXTsgfSk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xMDFfX25vb3BfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTA5KTtcbi8qIGhhcm1vbnkgcmVleHBvcnQgKGJpbmRpbmcpICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCBcIm5vb3BcIiwgZnVuY3Rpb24oKSB7IHJldHVybiBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzEwMV9fbm9vcF9fW1wiYVwiXTsgfSk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xMDJfX2lkZW50aXR5X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDExMCk7XG4vKiBoYXJtb255IHJlZXhwb3J0IChiaW5kaW5nKSAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJpZGVudGl0eVwiLCBmdW5jdGlvbigpIHsgcmV0dXJuIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTAyX19pZGVudGl0eV9fW1wiYVwiXTsgfSk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xMDNfX3NpemVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTExKTtcbi8qIGhhcm1vbnkgcmVleHBvcnQgKGJpbmRpbmcpICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCBcInNpemVcIiwgZnVuY3Rpb24oKSB7IHJldHVybiBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzEwM19fc2l6ZV9fW1wiYVwiXTsgfSk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xMDRfX2NhY2hlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDExMik7XG4vKiBoYXJtb255IHJlZXhwb3J0IChiaW5kaW5nKSAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJDYWNoZVwiLCBmdW5jdGlvbigpIHsgcmV0dXJuIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTA0X19jYWNoZV9fW1wiYVwiXTsgfSk7XG4vLyBhcnJheVxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gLy8gZXZlbnRcblxuXG4gLy8gZm9ybWF0XG5cblxuIC8vIG1hdGhcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAvLyBvYmplY3RcblxuXG5cblxuXG5cblxuIC8vIHN0cmluZ1xuXG5cblxuXG5cbiAvLyB0eXBlXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuIC8vIG90aGVyXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gLy8g5LiN55+l6YGT5Li65LuA5LmI77yM6ZyA6KaB5oqK6L+Z5LiqIGV4cG9ydO+8jOS4jeeEtiB0cyDkvJrmiqXnsbvlnovplJnor69cblxuXG5cbi8qKiovIH0pLFxuLyogMzQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19maWx0ZXJfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTQpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fY29udGFpbnNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTIpO1xuXG5cbi8qKlxuICogRmxhdHRlbnMgYGFycmF5YCBhIHNpbmdsZSBsZXZlbCBkZWVwLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IGFyciBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlcyBUaGUgdmFsdWVzIHRvIGV4Y2x1ZGUuXG4gKiBAcmV0dXJuIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGZpbHRlcmVkIHZhbHVlcy5cbiAqIEBleGFtcGxlXG4gKiBkaWZmZXJlbmNlKFsyLCAxXSwgWzIsIDNdKTsgIC8vID0+IFsxXVxuICovXG5cbnZhciBkaWZmZXJlbmNlID0gZnVuY3Rpb24gKGFyciwgdmFsdWVzKSB7XG4gIGlmICh2YWx1ZXMgPT09IHZvaWQgMCkge1xuICAgIHZhbHVlcyA9IFtdO1xuICB9XG5cbiAgcmV0dXJuIE9iamVjdChfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX2ZpbHRlcl9fW1wiYVwiIC8qIGRlZmF1bHQgKi9dKShhcnIsIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIHJldHVybiAhT2JqZWN0KF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fY29udGFpbnNfX1tcImFcIiAvKiBkZWZhdWx0ICovXSkodmFsdWVzLCB2YWx1ZSk7XG4gIH0pO1xufTtcblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyBfX3dlYnBhY2tfZXhwb3J0c19fW1wiYVwiXSA9IChkaWZmZXJlbmNlKTtcblxuLyoqKi8gfSksXG4vKiAzNSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX2lzX2Z1bmN0aW9uX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9faXNfbWF0Y2hfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTkpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9faXNfYXJyYXlfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMCk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX19pc19wbGFpbl9vYmplY3RfXyA9IF9fd2VicGFja19yZXF1aXJlX18oOSk7XG5cblxuXG5cblxuZnVuY3Rpb24gZmluZChhcnIsIHByZWRpY2F0ZSkge1xuICBpZiAoIU9iamVjdChfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfX2lzX2FycmF5X19bXCJhXCIgLyogZGVmYXVsdCAqL10pKGFycikpIHJldHVybiBudWxsO1xuXG4gIHZhciBfcHJlZGljYXRlO1xuXG4gIGlmIChPYmplY3QoX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19pc19mdW5jdGlvbl9fW1wiYVwiIC8qIGRlZmF1bHQgKi9dKShwcmVkaWNhdGUpKSB7XG4gICAgX3ByZWRpY2F0ZSA9IHByZWRpY2F0ZTtcbiAgfVxuXG4gIGlmIChPYmplY3QoX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX19pc19wbGFpbl9vYmplY3RfX1tcImFcIiAvKiBkZWZhdWx0ICovXSkocHJlZGljYXRlKSkge1xuICAgIF9wcmVkaWNhdGUgPSBmdW5jdGlvbiAoYSkge1xuICAgICAgcmV0dXJuIE9iamVjdChfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfX2lzX21hdGNoX19bXCJhXCIgLyogZGVmYXVsdCAqL10pKGEsIHByZWRpY2F0ZSk7XG4gICAgfTtcbiAgfVxuXG4gIGlmIChfcHJlZGljYXRlKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIGlmIChfcHJlZGljYXRlKGFycltpXSkpIHtcbiAgICAgICAgcmV0dXJuIGFycltpXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyBfX3dlYnBhY2tfZXhwb3J0c19fW1wiYVwiXSA9IChmaW5kKTtcblxuLyoqKi8gfSksXG4vKiAzNiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbmZ1bmN0aW9uIGZpbmRJbmRleChhcnIsIHByZWRpY2F0ZSwgZnJvbUluZGV4KSB7XG4gIGlmIChmcm9tSW5kZXggPT09IHZvaWQgMCkge1xuICAgIGZyb21JbmRleCA9IDA7XG4gIH1cblxuICBmb3IgKHZhciBpID0gZnJvbUluZGV4OyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKHByZWRpY2F0ZShhcnJbaV0sIGkpKSB7XG4gICAgICAvLyDmib7liLDnu4jmraLlvqrnjq9cbiAgICAgIHJldHVybiBpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiAtMTtcbn1cblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyBfX3dlYnBhY2tfZXhwb3J0c19fW1wiYVwiXSA9IChmaW5kSW5kZXgpO1xuXG4vKioqLyB9KSxcbi8qIDM3ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9faXNfbmlsX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9faXNfYXJyYXlfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMCk7XG5cblxuXG52YXIgZmlyc3RWYWx1ZSA9IGZ1bmN0aW9uIChkYXRhLCBuYW1lKSB7XG4gIHZhciByc3QgPSBudWxsO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xuICAgIHZhciBvYmogPSBkYXRhW2ldO1xuICAgIHZhciB2YWx1ZSA9IG9ialtuYW1lXTtcblxuICAgIGlmICghT2JqZWN0KF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9faXNfbmlsX19bXCJhXCIgLyogZGVmYXVsdCAqL10pKHZhbHVlKSkge1xuICAgICAgaWYgKE9iamVjdChfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfX2lzX2FycmF5X19bXCJhXCIgLyogZGVmYXVsdCAqL10pKHZhbHVlKSkge1xuICAgICAgICByc3QgPSB2YWx1ZVswXTsgLy8gdG9kbyDov5nph4zmmK/lkKblupTor6Xkvb/nlKjpgJLlvZLvvIzosIPnlKggZmlyc3RWYWx1ZSBA57ud5LqRXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByc3QgPSB2YWx1ZTtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJzdDtcbn07XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1tcImFcIl0gPSAoZmlyc3RWYWx1ZSk7XG5cbi8qKiovIH0pLFxuLyogMzggKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19pc19hcnJheV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcblxuLyoqXG4gKiBGbGF0dGVucyBgYXJyYXlgIGEgc2luZ2xlIGxldmVsIGRlZXAuXG4gKlxuICogQHBhcmFtIHtBcnJheX0gYXJyIFRoZSBhcnJheSB0byBmbGF0dGVuLlxuICogQHJldHVybiB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmbGF0dGVuZWQgYXJyYXkuXG4gKiBAZXhhbXBsZVxuICpcbiAqIGZsYXR0ZW4oWzEsIFsyLCBbMywgWzRdXSwgNV1dKTsgIC8vID0+IFsxLCAyLCBbMywgWzRdXSwgNV1cbiAqL1xuXG52YXIgZmxhdHRlbiA9IGZ1bmN0aW9uIChhcnIpIHtcbiAgaWYgKCFPYmplY3QoX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19pc19hcnJheV9fW1wiYVwiIC8qIGRlZmF1bHQgKi9dKShhcnIpKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgdmFyIHJzdCA9IFtdO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgcnN0ID0gcnN0LmNvbmNhdChhcnJbaV0pO1xuICB9XG5cbiAgcmV0dXJuIHJzdDtcbn07XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1tcImFcIl0gPSAoZmxhdHRlbik7XG5cbi8qKiovIH0pLFxuLyogMzkgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19pc19hcnJheV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcblxuLyoqXG4gKiBGbGF0dGVucyBgYXJyYXlgIGEgc2luZ2xlIGxldmVsIGRlZXAuXG4gKlxuICogQHBhcmFtIHtBcnJheX0gYXJyIFRoZSBhcnJheSB0byBmbGF0dGVuLlxuICogQHBhcmFtIHtBcnJheX0gcmVzdWx0IFRoZSBhcnJheSB0byByZXR1cm4uXG4gKiBAcmV0dXJuIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZsYXR0ZW5lZCBhcnJheS5cbiAqIEBleGFtcGxlXG4gKlxuICogZmxhdHRlbkRlZXAoWzEsIFsyLCBbMywgWzRdXSwgNV1dKTsgIC8vID0+IFsxLCAyLCAzLCA0LCA1XVxuICovXG5cbnZhciBmbGF0dGVuRGVlcCA9IGZ1bmN0aW9uIChhcnIsIHJlc3VsdCkge1xuICBpZiAocmVzdWx0ID09PSB2b2lkIDApIHtcbiAgICByZXN1bHQgPSBbXTtcbiAgfVxuXG4gIGlmICghT2JqZWN0KF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9faXNfYXJyYXlfX1tcImFcIiAvKiBkZWZhdWx0ICovXSkoYXJyKSkge1xuICAgIHJlc3VsdC5wdXNoKGFycik7XG4gIH0gZWxzZSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIGZsYXR0ZW5EZWVwKGFycltpXSwgcmVzdWx0KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyBfX3dlYnBhY2tfZXhwb3J0c19fW1wiYVwiXSA9IChmbGF0dGVuRGVlcCk7XG5cbi8qKiovIH0pLFxuLyogNDAgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19pc19hcnJheV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfX2ZpbHRlcl9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNCk7XG5cblxuXG52YXIgZ2V0UmFuZ2UgPSBmdW5jdGlvbiAodmFsdWVzKSB7XG4gIC8vIOWtmOWcqCBOYU4g5pe277yMbWluLG1heCDliKTlrprkvJrlh7rpl67pophcbiAgdmFsdWVzID0gT2JqZWN0KF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fZmlsdGVyX19bXCJhXCIgLyogZGVmYXVsdCAqL10pKHZhbHVlcywgZnVuY3Rpb24gKHYpIHtcbiAgICByZXR1cm4gIWlzTmFOKHYpO1xuICB9KTtcblxuICBpZiAoIXZhbHVlcy5sZW5ndGgpIHtcbiAgICAvLyDlpoLmnpzmsqHmnInmlbDlgLzliJnnm7TmjqXov5Tlm54wXG4gICAgcmV0dXJuIHtcbiAgICAgIG1pbjogMCxcbiAgICAgIG1heDogMFxuICAgIH07XG4gIH1cblxuICBpZiAoT2JqZWN0KF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9faXNfYXJyYXlfX1tcImFcIiAvKiBkZWZhdWx0ICovXSkodmFsdWVzWzBdKSkge1xuICAgIHZhciB0bXAgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0bXAgPSB0bXAuY29uY2F0KHZhbHVlc1tpXSk7XG4gICAgfVxuXG4gICAgdmFsdWVzID0gdG1wO1xuICB9XG5cbiAgdmFyIG1heCA9IE1hdGgubWF4LmFwcGx5KG51bGwsIHZhbHVlcyk7XG4gIHZhciBtaW4gPSBNYXRoLm1pbi5hcHBseShudWxsLCB2YWx1ZXMpO1xuICByZXR1cm4ge1xuICAgIG1pbjogbWluLFxuICAgIG1heDogbWF4XG4gIH07XG59O1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIF9fd2VicGFja19leHBvcnRzX19bXCJhXCJdID0gKGdldFJhbmdlKTtcblxuLyoqKi8gfSksXG4vKiA0MSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbnZhciBhcnJQcm90b3R5cGUgPSBBcnJheS5wcm90b3R5cGU7XG52YXIgc3BsaWNlID0gYXJyUHJvdG90eXBlLnNwbGljZTtcbnZhciBpbmRleE9mID0gYXJyUHJvdG90eXBlLmluZGV4T2Y7XG5cbnZhciBwdWxsID0gZnVuY3Rpb24gKGFycikge1xuICB2YXIgdmFsdWVzID0gW107XG5cbiAgZm9yICh2YXIgX2kgPSAxOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICB2YWx1ZXNbX2kgLSAxXSA9IGFyZ3VtZW50c1tfaV07XG4gIH1cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciB2YWx1ZSA9IHZhbHVlc1tpXTtcbiAgICB2YXIgZnJvbUluZGV4ID0gLTE7XG5cbiAgICB3aGlsZSAoKGZyb21JbmRleCA9IGluZGV4T2YuY2FsbChhcnIsIHZhbHVlKSkgPiAtMSkge1xuICAgICAgc3BsaWNlLmNhbGwoYXJyLCBmcm9tSW5kZXgsIDEpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBhcnI7XG59O1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIF9fd2VicGFja19leHBvcnRzX19bXCJhXCJdID0gKHB1bGwpO1xuXG4vKioqLyB9KSxcbi8qIDQyICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fZWFjaF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfX2lzX2FycmF5X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9faXNfcGxhaW5fb2JqZWN0X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkpO1xuXG5cblxuXG52YXIgcmVkdWNlID0gZnVuY3Rpb24gKGFyciwgZm4sIGluaXQpIHtcbiAgaWYgKCFPYmplY3QoX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX19pc19hcnJheV9fW1wiYVwiIC8qIGRlZmF1bHQgKi9dKShhcnIpICYmICFPYmplY3QoX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX19pc19wbGFpbl9vYmplY3RfX1tcImFcIiAvKiBkZWZhdWx0ICovXSkoYXJyKSkge1xuICAgIHJldHVybiBhcnI7XG4gIH1cblxuICB2YXIgcmVzdWx0ID0gaW5pdDtcbiAgT2JqZWN0KF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fZWFjaF9fW1wiYVwiIC8qIGRlZmF1bHQgKi9dKShhcnIsIGZ1bmN0aW9uIChkYXRhLCBpKSB7XG4gICAgcmVzdWx0ID0gZm4ocmVzdWx0LCBkYXRhLCBpKTtcbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIF9fd2VicGFja19leHBvcnRzX19bXCJhXCJdID0gKHJlZHVjZSk7XG5cbi8qKiovIH0pLFxuLyogNDMgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19pc19hcnJheV9saWtlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fcHVsbF9hdF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMSk7XG5cblxuXG52YXIgcmVtb3ZlID0gZnVuY3Rpb24gKGFyciwgcHJlZGljYXRlKSB7XG4gIC8qKlxuICAgKiBjb25zdCBhcnIgPSBbMSwgMiwgMywgNF1cbiAgICogY29uc3QgZXZlbnMgPSByZW1vdmUoYXJyLCBuID0+IG4gJSAyID09IDApXG4gICAqIGNvbnNvbGUubG9nKGFycikgLy8gPT4gWzEsIDNdXG4gICAqIGNvbnNvbGUubG9nKGV2ZW5zKSAvLyA9PiBbMiwgNF1cbiAgICovXG4gIHZhciByZXN1bHQgPSBbXTtcblxuICBpZiAoIU9iamVjdChfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX2lzX2FycmF5X2xpa2VfX1tcImFcIiAvKiBkZWZhdWx0ICovXSkoYXJyKSkge1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICB2YXIgaSA9IC0xO1xuICB2YXIgaW5kZXhlcyA9IFtdO1xuICB2YXIgbGVuZ3RoID0gYXJyLmxlbmd0aDtcblxuICB3aGlsZSAoKytpIDwgbGVuZ3RoKSB7XG4gICAgdmFyIHZhbHVlID0gYXJyW2ldO1xuXG4gICAgaWYgKHByZWRpY2F0ZSh2YWx1ZSwgaSwgYXJyKSkge1xuICAgICAgcmVzdWx0LnB1c2godmFsdWUpO1xuICAgICAgaW5kZXhlcy5wdXNoKGkpO1xuICAgIH1cbiAgfVxuXG4gIE9iamVjdChfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfX3B1bGxfYXRfX1tcImFcIiAvKiBkZWZhdWx0ICovXSkoYXJyLCBpbmRleGVzKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1tcImFcIl0gPSAocmVtb3ZlKTtcblxuLyoqKi8gfSksXG4vKiA0NCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX2lzX2FycmF5X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9faXNfc3RyaW5nX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9faXNfZnVuY3Rpb25fXyA9IF9fd2VicGFja19yZXF1aXJlX18oMyk7XG5cblxuXG5cbmZ1bmN0aW9uIHNvcnRCeShhcnIsIGtleSkge1xuICB2YXIgY29tcGFyZXI7XG5cbiAgaWYgKE9iamVjdChfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfX2lzX2Z1bmN0aW9uX19bXCJhXCIgLyogZGVmYXVsdCAqL10pKGtleSkpIHtcbiAgICBjb21wYXJlciA9IGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICByZXR1cm4ga2V5KGEpIC0ga2V5KGIpO1xuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgdmFyIGtleXNfMSA9IFtdO1xuXG4gICAgaWYgKE9iamVjdChfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfX2lzX3N0cmluZ19fW1wiYVwiIC8qIGRlZmF1bHQgKi9dKShrZXkpKSB7XG4gICAgICBrZXlzXzEucHVzaChrZXkpO1xuICAgIH0gZWxzZSBpZiAoT2JqZWN0KF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9faXNfYXJyYXlfX1tcImFcIiAvKiBkZWZhdWx0ICovXSkoa2V5KSkge1xuICAgICAga2V5c18xID0ga2V5O1xuICAgIH1cblxuICAgIGNvbXBhcmVyID0gZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5c18xLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIHZhciBwcm9wID0ga2V5c18xW2ldO1xuXG4gICAgICAgIGlmIChhW3Byb3BdID4gYltwcm9wXSkge1xuICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFbcHJvcF0gPCBiW3Byb3BdKSB7XG4gICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAwO1xuICAgIH07XG4gIH1cblxuICBhcnIuc29ydChjb21wYXJlcik7XG4gIHJldHVybiBhcnI7XG59XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1tcImFcIl0gPSAoc29ydEJ5KTtcblxuLyoqKi8gfSksXG4vKiA0NSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX3VuaXFfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMjIpO1xuXG5cbnZhciB1bmlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHNvdXJjZXMgPSBbXTtcblxuICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgIHNvdXJjZXNbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgfVxuXG4gIHJldHVybiBPYmplY3QoX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX191bmlxX19bXCJhXCIgLyogZGVmYXVsdCAqL10pKFtdLmNvbmNhdC5hcHBseShbXSwgc291cmNlcykpO1xufTtcblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyBfX3dlYnBhY2tfZXhwb3J0c19fW1wiYVwiXSA9ICh1bmlvbik7XG5cbi8qKiovIH0pLFxuLyogNDYgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19lYWNoX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9faXNfYXJyYXlfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMCk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX19pc19uaWxfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNik7XG5cblxuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIF9fd2VicGFja19leHBvcnRzX19bXCJhXCJdID0gKGZ1bmN0aW9uIChkYXRhLCBuYW1lKSB7XG4gIHZhciByc3QgPSBbXTtcbiAgdmFyIHRtcE1hcCA9IHt9O1xuICBkYXRhLmZvckVhY2goZnVuY3Rpb24gKG9iaikge1xuICAgIHZhciB2YWx1ZSA9IG9ialtuYW1lXTtcblxuICAgIGlmICghT2JqZWN0KF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9faXNfbmlsX19bXCJhXCIgLyogZGVmYXVsdCAqL10pKHZhbHVlKSkge1xuICAgICAgLy8gZmxhdHRlblxuICAgICAgaWYgKCFPYmplY3QoX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX19pc19hcnJheV9fW1wiYVwiIC8qIGRlZmF1bHQgKi9dKSh2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWUgPSBbdmFsdWVdO1xuICAgICAgfVxuXG4gICAgICBPYmplY3QoX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19lYWNoX19bXCJhXCIgLyogZGVmYXVsdCAqL10pKHZhbHVlLCBmdW5jdGlvbiAodmFsKSB7XG4gICAgICAgIC8vIHVuaXF1ZVxuICAgICAgICBpZiAoIXRtcE1hcFt2YWxdKSB7XG4gICAgICAgICAgcnN0LnB1c2godmFsKTtcbiAgICAgICAgICB0bXBNYXBbdmFsXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiByc3Q7XG59KTtcblxuLyoqKi8gfSksXG4vKiA0NyAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbi8qIGhhcm1vbnkgZXhwb3J0IChpbW11dGFibGUpICovIF9fd2VicGFja19leHBvcnRzX19bXCJhXCJdID0gaGVhZDtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX2lzX2FycmF5X2xpa2VfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7XG5cbmZ1bmN0aW9uIGhlYWQobykge1xuICBpZiAoT2JqZWN0KF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9faXNfYXJyYXlfbGlrZV9fW1wiYVwiIC8qIGRlZmF1bHQgKi9dKShvKSkge1xuICAgIHJldHVybiBvWzBdO1xuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqKi8gfSksXG4vKiA0OCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbi8qIGhhcm1vbnkgZXhwb3J0IChpbW11dGFibGUpICovIF9fd2VicGFja19leHBvcnRzX19bXCJhXCJdID0gbGFzdDtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX2lzX2FycmF5X2xpa2VfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7XG5cbmZ1bmN0aW9uIGxhc3Qobykge1xuICBpZiAoT2JqZWN0KF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9faXNfYXJyYXlfbGlrZV9fW1wiYVwiIC8qIGRlZmF1bHQgKi9dKShvKSkge1xuICAgIHZhciBhcnIgPSBvO1xuICAgIHJldHVybiBhcnJbYXJyLmxlbmd0aCAtIDFdO1xuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqKi8gfSksXG4vKiA0OSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX2lzX2FycmF5X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9faXNfc3RyaW5nX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgpO1xuXG5cblxuZnVuY3Rpb24gc3RhcnRzV2l0aChhcnIsIGUpIHtcbiAgcmV0dXJuIE9iamVjdChfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX2lzX2FycmF5X19bXCJhXCIgLyogZGVmYXVsdCAqL10pKGFycikgfHwgT2JqZWN0KF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9faXNfc3RyaW5nX19bXCJhXCIgLyogZGVmYXVsdCAqL10pKGFycikgPyBhcnJbMF0gPT09IGUgOiBmYWxzZTtcbn1cblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyBfX3dlYnBhY2tfZXhwb3J0c19fW1wiYVwiXSA9IChzdGFydHNXaXRoKTtcblxuLyoqKi8gfSksXG4vKiA1MCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX2lzX2FycmF5X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9faXNfc3RyaW5nX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgpO1xuXG5cblxuZnVuY3Rpb24gZW5kc1dpdGgoYXJyLCBlKSB7XG4gIHJldHVybiBPYmplY3QoX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19pc19hcnJheV9fW1wiYVwiIC8qIGRlZmF1bHQgKi9dKShhcnIpIHx8IE9iamVjdChfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfX2lzX3N0cmluZ19fW1wiYVwiIC8qIGRlZmF1bHQgKi9dKShhcnIpID8gYXJyW2Fyci5sZW5ndGggLSAxXSA9PT0gZSA6IGZhbHNlO1xufVxuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIF9fd2VicGFja19leHBvcnRzX19bXCJhXCJdID0gKGVuZHNXaXRoKTtcblxuLyoqKi8gfSksXG4vKiA1MSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbi8qKlxuICog5Y+q6KaB5pyJ5LiA5Liq5LiN5ruh6Laz5p2h5Lu25bCx6L+U5ZueIGZhbHNlXG4gKiBAcGFyYW0gYXJyXG4gKiBAcGFyYW0gZnVuY1xuICovXG52YXIgZXZlcnkgPSBmdW5jdGlvbiAoYXJyLCBmdW5jKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKCFmdW5jKGFycltpXSwgaSkpIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyBfX3dlYnBhY2tfZXhwb3J0c19fW1wiYVwiXSA9IChldmVyeSk7XG5cbi8qKiovIH0pLFxuLyogNTIgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG4vKipcbiAqIOWPquimgeacieS4gOS4qua7oei2s+adoeS7tuWwsei/lOWbniB0cnVlXG4gKiBAcGFyYW0gYXJyXG4gKiBAcGFyYW0gZnVuY1xuICovXG52YXIgc29tZSA9IGZ1bmN0aW9uIChhcnIsIGZ1bmMpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZnVuYyhhcnJbaV0sIGkpKSByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn07XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1tcImFcIl0gPSAoc29tZSk7XG5cbi8qKiovIH0pLFxuLyogNTMgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19ncm91cF90b19tYXBfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMjMpO1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIF9fd2VicGFja19leHBvcnRzX19bXCJhXCJdID0gKGZ1bmN0aW9uIChkYXRhLCBjb25kaXRpb24pIHtcbiAgaWYgKCFjb25kaXRpb24pIHtcbiAgICAvLyDmsqHmnInmnaHku7bvvIzliJnoh6rouqvmlLnmiJDmlbDnu4RcbiAgICByZXR1cm4gW2RhdGFdO1xuICB9XG5cbiAgdmFyIGdyb3VwcyA9IE9iamVjdChfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX2dyb3VwX3RvX21hcF9fW1wiYVwiIC8qIGRlZmF1bHQgKi9dKShkYXRhLCBjb25kaXRpb24pO1xuICB2YXIgYXJyYXkgPSBbXTtcblxuICBmb3IgKHZhciBpIGluIGdyb3Vwcykge1xuICAgIGFycmF5LnB1c2goZ3JvdXBzW2ldKTtcbiAgfVxuXG4gIHJldHVybiBhcnJheTtcbn0pO1xuXG4vKioqLyB9KSxcbi8qIDU0ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuLyoqXG4gKiDojrflj5blsIHoo4XnmoTkuovku7ZcbiAqIEBwcm90ZWN0ZWRcbiAqIEBwYXJhbSAge09iamVjdH0gb2JqICAg5a+56LGhXG4gKiBAcGFyYW0gIHtTdHJpbmd9IGFjdGlvbiDkuovku7blkI3np7BcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSAgICAgICAg6L+U5Zue5LqL5Lu25aSE55CG5Ye95pWwXG4gKi9cbmZ1bmN0aW9uIGdldFdyYXBCZWhhdmlvcihvYmosIGFjdGlvbikge1xuICByZXR1cm4gb2JqWydfd3JhcF8nICsgYWN0aW9uXTtcbn1cblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyBfX3dlYnBhY2tfZXhwb3J0c19fW1wiYVwiXSA9IChnZXRXcmFwQmVoYXZpb3IpO1xuXG4vKioqLyB9KSxcbi8qIDU1ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuLyoqXG4gKiDlsIHoo4Xkuovku7bvvIzkvr/kuo7kvb/nlKjkuIrkuIvmlod0aGlzLOWSjOS+v+S6juino+mZpOS6i+S7tuaXtuS9v+eUqFxuICogQHByb3RlY3RlZFxuICogQHBhcmFtICB7T2JqZWN0fSBvYmogICDlr7nosaFcbiAqIEBwYXJhbSAge1N0cmluZ30gYWN0aW9uIOS6i+S7tuWQjeensFxuICogQHJldHVybiB7RnVuY3Rpb259ICAgICAgICDov5Tlm57kuovku7blpITnkIblh73mlbBcbiAqL1xuZnVuY3Rpb24gd3JhcEJlaGF2aW9yKG9iaiwgYWN0aW9uKSB7XG4gIGlmIChvYmpbJ193cmFwXycgKyBhY3Rpb25dKSB7XG4gICAgcmV0dXJuIG9ialsnX3dyYXBfJyArIGFjdGlvbl07XG4gIH1cblxuICB2YXIgbWV0aG9kID0gZnVuY3Rpb24gKGUpIHtcbiAgICBvYmpbYWN0aW9uXShlKTtcbiAgfTtcblxuICBvYmpbJ193cmFwXycgKyBhY3Rpb25dID0gbWV0aG9kO1xuICByZXR1cm4gbWV0aG9kO1xufVxuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIF9fd2VicGFja19leHBvcnRzX19bXCJhXCJdID0gKHdyYXBCZWhhdmlvcik7XG5cbi8qKiovIH0pLFxuLyogNTYgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG52YXIgbnVtQ29sb3JDYWNoZSA9IHt9O1xuXG5mdW5jdGlvbiBudW1iZXJUb0NvbG9yKG51bSkge1xuICAvLyDlop7liqDnvJPlrZhcbiAgdmFyIGNvbG9yID0gbnVtQ29sb3JDYWNoZVtudW1dO1xuXG4gIGlmICghY29sb3IpIHtcbiAgICB2YXIgc3RyID0gbnVtLnRvU3RyaW5nKDE2KTtcblxuICAgIGZvciAodmFyIGkgPSBzdHIubGVuZ3RoOyBpIDwgNjsgaSsrKSB7XG4gICAgICBzdHIgPSAnMCcgKyBzdHI7XG4gICAgfVxuXG4gICAgY29sb3IgPSAnIycgKyBzdHI7XG4gICAgbnVtQ29sb3JDYWNoZVtudW1dID0gY29sb3I7XG4gIH1cblxuICByZXR1cm4gY29sb3I7XG59XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1tcImFcIl0gPSAobnVtYmVyVG9Db2xvcik7XG5cbi8qKiovIH0pLFxuLyogNTcgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19pc19hcnJheV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcblxuXG5mdW5jdGlvbiBwYXJzZVJhZGl1cyhyYWRpdXMpIHtcbiAgdmFyIHIxID0gMCxcbiAgICAgIHIyID0gMCxcbiAgICAgIHIzID0gMCxcbiAgICAgIHI0ID0gMDtcblxuICBpZiAoT2JqZWN0KF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9faXNfYXJyYXlfX1tcImFcIiAvKiBkZWZhdWx0ICovXSkocmFkaXVzKSkge1xuICAgIGlmIChyYWRpdXMubGVuZ3RoID09PSAxKSB7XG4gICAgICByMSA9IHIyID0gcjMgPSByNCA9IHJhZGl1c1swXTtcbiAgICB9IGVsc2UgaWYgKHJhZGl1cy5sZW5ndGggPT09IDIpIHtcbiAgICAgIHIxID0gcjMgPSByYWRpdXNbMF07XG4gICAgICByMiA9IHI0ID0gcmFkaXVzWzFdO1xuICAgIH0gZWxzZSBpZiAocmFkaXVzLmxlbmd0aCA9PT0gMykge1xuICAgICAgcjEgPSByYWRpdXNbMF07XG4gICAgICByMiA9IHI0ID0gcmFkaXVzWzFdO1xuICAgICAgcjMgPSByYWRpdXNbMl07XG4gICAgfSBlbHNlIHtcbiAgICAgIHIxID0gcmFkaXVzWzBdO1xuICAgICAgcjIgPSByYWRpdXNbMV07XG4gICAgICByMyA9IHJhZGl1c1syXTtcbiAgICAgIHI0ID0gcmFkaXVzWzNdO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICByMSA9IHIyID0gcjMgPSByNCA9IHJhZGl1cztcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgcjE6IHIxLFxuICAgIHIyOiByMixcbiAgICByMzogcjMsXG4gICAgcjQ6IHI0XG4gIH07XG59XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1tcImFcIl0gPSAocGFyc2VSYWRpdXMpO1xuXG4vKioqLyB9KSxcbi8qIDU4ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xudmFyIGNsYW1wID0gZnVuY3Rpb24gKGEsIG1pbiwgbWF4KSB7XG4gIGlmIChhIDwgbWluKSB7XG4gICAgcmV0dXJuIG1pbjtcbiAgfSBlbHNlIGlmIChhID4gbWF4KSB7XG4gICAgcmV0dXJuIG1heDtcbiAgfVxuXG4gIHJldHVybiBhO1xufTtcblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyBfX3dlYnBhY2tfZXhwb3J0c19fW1wiYVwiXSA9IChjbGFtcCk7XG5cbi8qKiovIH0pLFxuLyogNTkgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG52YXIgZml4ZWRCYXNlID0gZnVuY3Rpb24gKHYsIGJhc2UpIHtcbiAgdmFyIHN0ciA9IGJhc2UudG9TdHJpbmcoKTtcbiAgdmFyIGluZGV4ID0gc3RyLmluZGV4T2YoJy4nKTtcblxuICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQodik7XG4gIH1cblxuICB2YXIgbGVuZ3RoID0gc3RyLnN1YnN0cihpbmRleCArIDEpLmxlbmd0aDtcblxuICBpZiAobGVuZ3RoID4gMjApIHtcbiAgICBsZW5ndGggPSAyMDtcbiAgfVxuXG4gIHJldHVybiBwYXJzZUZsb2F0KHYudG9GaXhlZChsZW5ndGgpKTtcbn07XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1tcImFcIl0gPSAoZml4ZWRCYXNlKTtcblxuLyoqKi8gfSksXG4vKiA2MCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX2lzX251bWJlcl9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTtcblxuXG52YXIgaXNEZWNpbWFsID0gZnVuY3Rpb24gKG51bSkge1xuICByZXR1cm4gT2JqZWN0KF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9faXNfbnVtYmVyX19bXCJhXCIgLyogZGVmYXVsdCAqL10pKG51bSkgJiYgbnVtICUgMSAhPT0gMDtcbn07XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1tcImFcIl0gPSAoaXNEZWNpbWFsKTtcblxuLyoqKi8gfSksXG4vKiA2MSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX2lzX251bWJlcl9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTtcblxuXG52YXIgaXNFdmVuID0gZnVuY3Rpb24gKG51bSkge1xuICByZXR1cm4gT2JqZWN0KF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9faXNfbnVtYmVyX19bXCJhXCIgLyogZGVmYXVsdCAqL10pKG51bSkgJiYgbnVtICUgMiA9PT0gMDtcbn07XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1tcImFcIl0gPSAoaXNFdmVuKTtcblxuLyoqKi8gfSksXG4vKiA2MiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX2lzX251bWJlcl9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTtcblxudmFyIGlzSW50ZWdlciA9IE51bWJlci5pc0ludGVnZXIgPyBOdW1iZXIuaXNJbnRlZ2VyIDogZnVuY3Rpb24gKG51bSkge1xuICByZXR1cm4gT2JqZWN0KF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9faXNfbnVtYmVyX19bXCJhXCIgLyogZGVmYXVsdCAqL10pKG51bSkgJiYgbnVtICUgMSA9PT0gMDtcbn07XG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIF9fd2VicGFja19leHBvcnRzX19bXCJhXCJdID0gKGlzSW50ZWdlcik7XG5cbi8qKiovIH0pLFxuLyogNjMgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19pc19udW1iZXJfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7XG5cblxudmFyIGlzTmVnYXRpdmUgPSBmdW5jdGlvbiAobnVtKSB7XG4gIHJldHVybiBPYmplY3QoX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19pc19udW1iZXJfX1tcImFcIiAvKiBkZWZhdWx0ICovXSkobnVtKSAmJiBudW0gPCAwO1xufTtcblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyBfX3dlYnBhY2tfZXhwb3J0c19fW1wiYVwiXSA9IChpc05lZ2F0aXZlKTtcblxuLyoqKi8gfSksXG4vKiA2NCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbi8qIGhhcm1vbnkgZXhwb3J0IChpbW11dGFibGUpICovIF9fd2VicGFja19leHBvcnRzX19bXCJhXCJdID0gaXNOdW1iZXJFcXVhbDtcbnZhciBQUkVDSVNJT04gPSAwLjAwMDAxOyAvLyBudW1iZXJzIGxlc3MgdGhhbiB0aGlzIGlzIGNvbnNpZGVyZWQgYXMgMFxuXG5mdW5jdGlvbiBpc051bWJlckVxdWFsKGEsIGIsIHByZWNpc2lvbikge1xuICBpZiAocHJlY2lzaW9uID09PSB2b2lkIDApIHtcbiAgICBwcmVjaXNpb24gPSBQUkVDSVNJT047XG4gIH1cblxuICByZXR1cm4gTWF0aC5hYnMoYSAtIGIpIDwgcHJlY2lzaW9uO1xufVxuO1xuXG4vKioqLyB9KSxcbi8qIDY1ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9faXNfbnVtYmVyX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpO1xuXG5cbnZhciBpc09kZCA9IGZ1bmN0aW9uIChudW0pIHtcbiAgcmV0dXJuIE9iamVjdChfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX2lzX251bWJlcl9fW1wiYVwiIC8qIGRlZmF1bHQgKi9dKShudW0pICYmIG51bSAlIDIgIT09IDA7XG59O1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIF9fd2VicGFja19leHBvcnRzX19bXCJhXCJdID0gKGlzT2RkKTtcblxuLyoqKi8gfSksXG4vKiA2NiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX2lzX251bWJlcl9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTtcblxuXG52YXIgaXNQb3NpdGl2ZSA9IGZ1bmN0aW9uIChudW0pIHtcbiAgcmV0dXJuIE9iamVjdChfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX2lzX251bWJlcl9fW1wiYVwiIC8qIGRlZmF1bHQgKi9dKShudW0pICYmIG51bSA+IDA7XG59O1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIF9fd2VicGFja19leHBvcnRzX19bXCJhXCJdID0gKGlzUG9zaXRpdmUpO1xuXG4vKioqLyB9KSxcbi8qIDY3ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fZWFjaF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfX2lzX2FycmF5X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9faXNfZnVuY3Rpb25fXyA9IF9fd2VicGFja19yZXF1aXJlX18oMyk7XG5cblxuXG4vKipcbiAqIEBwYXJhbSB7QXJyYXl9IGFyciBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2ZuXSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAqIEByZXR1cm4geyp9IFJldHVybnMgdGhlIG1heGltdW0gdmFsdWUuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3RzID0gW3sgJ24nOiAxIH0sIHsgJ24nOiAyIH1dO1xuICpcbiAqIG1heEJ5KG9iamVjdHMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8ubjsgfSk7XG4gKiAvLyA9PiB7ICduJzogMiB9XG4gKlxuICogbWF4Qnkob2JqZWN0cywgJ24nKTtcbiAqIC8vID0+IHsgJ24nOiAyIH1cbiAqL1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIF9fd2VicGFja19leHBvcnRzX19bXCJhXCJdID0gKGZ1bmN0aW9uIChhcnIsIGZuKSB7XG4gIGlmICghT2JqZWN0KF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9faXNfYXJyYXlfX1tcImFcIiAvKiBkZWZhdWx0ICovXSkoYXJyKSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICB2YXIgbWF4ID0gYXJyWzBdO1xuICB2YXIgbWF4RGF0YTtcblxuICBpZiAoT2JqZWN0KF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9faXNfZnVuY3Rpb25fX1tcImFcIiAvKiBkZWZhdWx0ICovXSkoZm4pKSB7XG4gICAgbWF4RGF0YSA9IGZuKGFyclswXSk7XG4gIH0gZWxzZSB7XG4gICAgbWF4RGF0YSA9IGFyclswXVtmbl07XG4gIH1cblxuICB2YXIgZGF0YTtcbiAgT2JqZWN0KF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fZWFjaF9fW1wiYVwiIC8qIGRlZmF1bHQgKi9dKShhcnIsIGZ1bmN0aW9uICh2YWwpIHtcbiAgICBpZiAoT2JqZWN0KF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9faXNfZnVuY3Rpb25fX1tcImFcIiAvKiBkZWZhdWx0ICovXSkoZm4pKSB7XG4gICAgICBkYXRhID0gZm4odmFsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGF0YSA9IHZhbFtmbl07XG4gICAgfVxuXG4gICAgaWYgKGRhdGEgPiBtYXhEYXRhKSB7XG4gICAgICBtYXggPSB2YWw7XG4gICAgICBtYXhEYXRhID0gZGF0YTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gbWF4O1xufSk7XG5cbi8qKiovIH0pLFxuLyogNjggKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19lYWNoX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9faXNfYXJyYXlfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMCk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX19pc19mdW5jdGlvbl9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKTtcblxuXG5cbi8qKlxuICogQHBhcmFtIHtBcnJheX0gYXJyIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbZm5dIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICogQHJldHVybiB7Kn0gUmV0dXJucyB0aGUgbWluaW11bSB2YWx1ZS5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdHMgPSBbeyAnbic6IDEgfSwgeyAnbic6IDIgfV07XG4gKlxuICogbWluQnkob2JqZWN0cywgZnVuY3Rpb24obykgeyByZXR1cm4gby5uOyB9KTtcbiAqIC8vID0+IHsgJ24nOiAxIH1cbiAqXG4gKiBtaW5CeShvYmplY3RzLCAnbicpO1xuICogLy8gPT4geyAnbic6IDEgfVxuICovXG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1tcImFcIl0gPSAoZnVuY3Rpb24gKGFyciwgZm4pIHtcbiAgaWYgKCFPYmplY3QoX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX19pc19hcnJheV9fW1wiYVwiIC8qIGRlZmF1bHQgKi9dKShhcnIpKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHZhciBtaW4gPSBhcnJbMF07XG4gIHZhciBtaW5EYXRhO1xuXG4gIGlmIChPYmplY3QoX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX19pc19mdW5jdGlvbl9fW1wiYVwiIC8qIGRlZmF1bHQgKi9dKShmbikpIHtcbiAgICBtaW5EYXRhID0gZm4oYXJyWzBdKTtcbiAgfSBlbHNlIHtcbiAgICBtaW5EYXRhID0gYXJyWzBdW2ZuXTtcbiAgfVxuXG4gIHZhciBkYXRhO1xuICBPYmplY3QoX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19lYWNoX19bXCJhXCIgLyogZGVmYXVsdCAqL10pKGFyciwgZnVuY3Rpb24gKHZhbCkge1xuICAgIGlmIChPYmplY3QoX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX19pc19mdW5jdGlvbl9fW1wiYVwiIC8qIGRlZmF1bHQgKi9dKShmbikpIHtcbiAgICAgIGRhdGEgPSBmbih2YWwpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkYXRhID0gdmFsW2ZuXTtcbiAgICB9XG5cbiAgICBpZiAoZGF0YSA8IG1pbkRhdGEpIHtcbiAgICAgIG1pbiA9IHZhbDtcbiAgICAgIG1pbkRhdGEgPSBkYXRhO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBtaW47XG59KTtcblxuLyoqKi8gfSksXG4vKiA2OSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbnZhciBtb2QgPSBmdW5jdGlvbiAobiwgbSkge1xuICByZXR1cm4gKG4gJSBtICsgbSkgJSBtO1xufTtcblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyBfX3dlYnBhY2tfZXhwb3J0c19fW1wiYVwiXSA9IChtb2QpO1xuXG4vKioqLyB9KSxcbi8qIDcwICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xudmFyIERFR1JFRSA9IDE4MCAvIE1hdGguUEk7XG5cbnZhciB0b0RlZ3JlZSA9IGZ1bmN0aW9uIChyYWRpYW4pIHtcbiAgcmV0dXJuIERFR1JFRSAqIHJhZGlhbjtcbn07XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1tcImFcIl0gPSAodG9EZWdyZWUpO1xuXG4vKioqLyB9KSxcbi8qIDcxICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyBfX3dlYnBhY2tfZXhwb3J0c19fW1wiYVwiXSA9IChwYXJzZUludCk7XG5cbi8qKiovIH0pLFxuLyogNzIgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG52YXIgUkFESUFOID0gTWF0aC5QSSAvIDE4MDtcblxudmFyIHRvUmFkaWFuID0gZnVuY3Rpb24gKGRlZ3JlZSkge1xuICByZXR1cm4gUkFESUFOICogZGVncmVlO1xufTtcblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyBfX3dlYnBhY2tfZXhwb3J0c19fW1wiYVwiXSA9ICh0b1JhZGlhbik7XG5cbi8qKiovIH0pLFxuLyogNzMgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19lYWNoX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIpO1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIF9fd2VicGFja19leHBvcnRzX19bXCJhXCJdID0gKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fZWFjaF9fW1wiYVwiIC8qIGRlZmF1bHQgKi9dKTtcblxuLyoqKi8gfSksXG4vKiA3NCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX2hhc19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNSk7XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1tcImFcIl0gPSAoX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19oYXNfX1tcImFcIiAvKiBkZWZhdWx0ICovXSk7XG5cbi8qKiovIH0pLFxuLyogNzUgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19jb250YWluc19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX192YWx1ZXNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMjYpO1xuXG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1tcImFcIl0gPSAoZnVuY3Rpb24gKG9iaiwgdmFsdWUpIHtcbiAgcmV0dXJuIE9iamVjdChfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX2NvbnRhaW5zX19bXCJhXCIgLyogZGVmYXVsdCAqL10pKE9iamVjdChfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfX3ZhbHVlc19fW1wiYVwiIC8qIGRlZmF1bHQgKi9dKShvYmopLCB2YWx1ZSk7XG59KTtcblxuLyoqKi8gfSksXG4vKiA3NiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX3RvX3N0cmluZ19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMCk7XG5cblxudmFyIGxvd2VyQ2FzZSA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgcmV0dXJuIE9iamVjdChfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX3RvX3N0cmluZ19fW1wiYVwiIC8qIGRlZmF1bHQgKi9dKShzdHIpLnRvTG93ZXJDYXNlKCk7XG59O1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIF9fd2VicGFja19leHBvcnRzX19bXCJhXCJdID0gKGxvd2VyQ2FzZSk7XG5cbi8qKiovIH0pLFxuLyogNzcgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX190b19zdHJpbmdfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTApO1xuXG5cbnZhciBsb3dlckZpcnN0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gIHZhciBzdHIgPSBPYmplY3QoX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX190b19zdHJpbmdfX1tcImFcIiAvKiBkZWZhdWx0ICovXSkodmFsdWUpO1xuICByZXR1cm4gc3RyLmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpICsgc3RyLnN1YnN0cmluZygxKTtcbn07XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1tcImFcIl0gPSAobG93ZXJGaXJzdCk7XG5cbi8qKiovIH0pLFxuLyogNzggKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5mdW5jdGlvbiBzdWJzdGl0dXRlKHN0ciwgbykge1xuICBpZiAoIXN0ciB8fCAhbykge1xuICAgIHJldHVybiBzdHI7XG4gIH1cblxuICByZXR1cm4gc3RyLnJlcGxhY2UoL1xcXFw/XFx7KFtee31dKylcXH0vZywgZnVuY3Rpb24gKG1hdGNoLCBuYW1lKSB7XG4gICAgaWYgKG1hdGNoLmNoYXJBdCgwKSA9PT0gJ1xcXFwnKSB7XG4gICAgICByZXR1cm4gbWF0Y2guc2xpY2UoMSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9bbmFtZV0gPT09IHVuZGVmaW5lZCA/ICcnIDogb1tuYW1lXTtcbiAgfSk7XG59XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1tcImFcIl0gPSAoc3Vic3RpdHV0ZSk7XG5cbi8qKiovIH0pLFxuLyogNzkgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX190b19zdHJpbmdfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTApO1xuXG5cbnZhciB1cHBlckNhc2UgPSBmdW5jdGlvbiAoc3RyKSB7XG4gIHJldHVybiBPYmplY3QoX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX190b19zdHJpbmdfX1tcImFcIiAvKiBkZWZhdWx0ICovXSkoc3RyKS50b1VwcGVyQ2FzZSgpO1xufTtcblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyBfX3dlYnBhY2tfZXhwb3J0c19fW1wiYVwiXSA9ICh1cHBlckNhc2UpO1xuXG4vKioqLyB9KSxcbi8qIDgwICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fdG9fc3RyaW5nX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwKTtcblxuXG52YXIgdXBwZXJGaXJzdCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICB2YXIgc3RyID0gT2JqZWN0KF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fdG9fc3RyaW5nX19bXCJhXCIgLyogZGVmYXVsdCAqL10pKHZhbHVlKTtcbiAgcmV0dXJuIHN0ci5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHN0ci5zdWJzdHJpbmcoMSk7XG59O1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIF9fd2VicGFja19leHBvcnRzX19bXCJhXCJdID0gKHVwcGVyRmlyc3QpO1xuXG4vKioqLyB9KSxcbi8qIDgxICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9faXNfdHlwZV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KTtcbi8qKlxuICog5piv5ZCm5piv5Y+C5pWw57G75Z6LXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbHVlIOa1i+ivleeahOWAvFxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuXG5cbnZhciBpc0FyZ3VtZW50cyA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICByZXR1cm4gT2JqZWN0KF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9faXNfdHlwZV9fW1wiYVwiIC8qIGRlZmF1bHQgKi9dKSh2YWx1ZSwgJ0FyZ3VtZW50cycpO1xufTtcblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyBfX3dlYnBhY2tfZXhwb3J0c19fW1wiYVwiXSA9IChpc0FyZ3VtZW50cyk7XG5cbi8qKiovIH0pLFxuLyogODIgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19pc190eXBlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQpO1xuLyoqXG4gKiDmmK/lkKbmmK/luIPlsJTnsbvlnotcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsdWUg5rWL6K+V55qE5YC8XG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5cblxudmFyIGlzQm9vbGVhbiA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICByZXR1cm4gT2JqZWN0KF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9faXNfdHlwZV9fW1wiYVwiIC8qIGRlZmF1bHQgKi9dKSh2YWx1ZSwgJ0Jvb2xlYW4nKTtcbn07XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1tcImFcIl0gPSAoaXNCb29sZWFuKTtcblxuLyoqKi8gfSksXG4vKiA4MyAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX2lzX3R5cGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNCk7XG5cblxudmFyIGlzRGF0ZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICByZXR1cm4gT2JqZWN0KF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9faXNfdHlwZV9fW1wiYVwiIC8qIGRlZmF1bHQgKi9dKSh2YWx1ZSwgJ0RhdGUnKTtcbn07XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1tcImFcIl0gPSAoaXNEYXRlKTtcblxuLyoqKi8gfSksXG4vKiA4NCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX2lzX3R5cGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNCk7XG4vKipcbiAqIOaYr+WQpuaYr+WPguaVsOexu+Wei1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWx1ZSDmtYvor5XnmoTlgLxcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cblxuXG52YXIgaXNFcnJvciA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICByZXR1cm4gT2JqZWN0KF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9faXNfdHlwZV9fW1wiYVwiIC8qIGRlZmF1bHQgKi9dKSh2YWx1ZSwgJ0Vycm9yJyk7XG59O1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIF9fd2VicGFja19leHBvcnRzX19bXCJhXCJdID0gKGlzRXJyb3IpO1xuXG4vKioqLyB9KSxcbi8qIDg1ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9faXNfbnVtYmVyX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpO1xuLyoqXG4gKiDliKTmlq3mmK/lkKbkuLrmnInpmZDmlbBcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyBfX3dlYnBhY2tfZXhwb3J0c19fW1wiYVwiXSA9IChmdW5jdGlvbiAodmFsdWUpIHtcbiAgcmV0dXJuIE9iamVjdChfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX2lzX251bWJlcl9fW1wiYVwiIC8qIGRlZmF1bHQgKi9dKSh2YWx1ZSkgJiYgaXNGaW5pdGUodmFsdWUpO1xufSk7XG5cbi8qKiovIH0pLFxuLyogODYgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG52YXIgaXNOdWxsID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA9PT0gbnVsbDtcbn07XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1tcImFcIl0gPSAoaXNOdWxsKTtcblxuLyoqKi8gfSksXG4vKiA4NyAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX2lzX3R5cGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNCk7XG5cblxudmFyIGlzUmVnRXhwID0gZnVuY3Rpb24gKHN0cikge1xuICByZXR1cm4gT2JqZWN0KF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9faXNfdHlwZV9fW1wiYVwiIC8qIGRlZmF1bHQgKi9dKShzdHIsICdSZWdFeHAnKTtcbn07XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1tcImFcIl0gPSAoaXNSZWdFeHApO1xuXG4vKioqLyB9KSxcbi8qIDg4ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xudmFyIGlzVW5kZWZpbmVkID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkO1xufTtcblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyBfX3dlYnBhY2tfZXhwb3J0c19fW1wiYVwiXSA9IChpc1VuZGVmaW5lZCk7XG5cbi8qKiovIH0pLFxuLyogODkgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG4vKipcbiAqIOWIpOaWreaYr+WQpkhUTUzlhYPntKBcbiAqIEByZXR1cm4ge0Jvb2xlYW59IOaYr+WQpkhUTUzlhYPntKBcbiAqL1xudmFyIGlzRWxlbWVudCA9IGZ1bmN0aW9uIChvKSB7XG4gIHJldHVybiBvIGluc3RhbmNlb2YgRWxlbWVudCB8fCBvIGluc3RhbmNlb2YgSFRNTERvY3VtZW50O1xufTtcblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyBfX3dlYnBhY2tfZXhwb3J0c19fW1wiYVwiXSA9IChpc0VsZW1lbnQpO1xuXG4vKioqLyB9KSxcbi8qIDkwICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuLyogaGFybW9ueSBleHBvcnQgKGltbXV0YWJsZSkgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1tcImFcIl0gPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWU7XG5mdW5jdGlvbiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZm4pIHtcbiAgdmFyIG1ldGhvZCA9IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHwgd2luZG93LndlYmtpdFJlcXVlc3RBbmltYXRpb25GcmFtZSB8fCAvLyBAdHMtaWdub3JlXG4gIHdpbmRvdy5tb3pSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHwgLy8gQHRzLWlnbm9yZVxuICB3aW5kb3cubXNSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHwgZnVuY3Rpb24gKGYpIHtcbiAgICByZXR1cm4gc2V0VGltZW91dChmLCAxNik7XG4gIH07XG5cbiAgcmV0dXJuIG1ldGhvZChmbik7XG59XG47XG5cbi8qKiovIH0pLFxuLyogOTEgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG4vKiBoYXJtb255IGV4cG9ydCAoaW1tdXRhYmxlKSAqLyBfX3dlYnBhY2tfZXhwb3J0c19fW1wiYVwiXSA9IGNhbmNlbEFuaW1hdGlvbkZyYW1lO1xuZnVuY3Rpb24gY2FuY2VsQW5pbWF0aW9uRnJhbWUoaGFuZGxlcikge1xuICB2YXIgbWV0aG9kID0gd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lIHx8IHdpbmRvdy53ZWJraXRDYW5jZWxBbmltYXRpb25GcmFtZSB8fCAvLyBAdHMtaWdub3JlXG4gIHdpbmRvdy5tb3pDYW5jZWxBbmltYXRpb25GcmFtZSB8fCAvLyBAdHMtaWdub3JlXG4gIHdpbmRvdy5tc0NhbmNlbEFuaW1hdGlvbkZyYW1lIHx8IGNsZWFyVGltZW91dDtcbiAgbWV0aG9kKGhhbmRsZXIpO1xufVxuO1xuXG4vKioqLyB9KSxcbi8qIDkyICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fbWl4X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE2KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfX2lzX2Z1bmN0aW9uX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpO1xuXG5cblxudmFyIGF1Z21lbnQgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBhcmdzID0gW107XG5cbiAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gIH1cblxuICB2YXIgYyA9IGFyZ3NbMF07XG5cbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIG9iaiA9IGFyZ3NbaV07XG5cbiAgICBpZiAoT2JqZWN0KF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9faXNfZnVuY3Rpb25fX1tcImFcIiAvKiBkZWZhdWx0ICovXSkob2JqKSkge1xuICAgICAgb2JqID0gb2JqLnByb3RvdHlwZTtcbiAgICB9XG5cbiAgICBPYmplY3QoX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19taXhfX1tcImFcIiAvKiBkZWZhdWx0ICovXSkoYy5wcm90b3R5cGUsIG9iaik7XG4gIH1cbn07XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1tcImFcIl0gPSAoYXVnbWVudCk7XG5cbi8qKiovIH0pLFxuLyogOTMgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19pc19hcnJheV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcblxuXG52YXIgY2xvbmUgPSBmdW5jdGlvbiAob2JqKSB7XG4gIGlmICh0eXBlb2Ygb2JqICE9PSAnb2JqZWN0JyB8fCBvYmogPT09IG51bGwpIHtcbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgdmFyIHJzdDtcblxuICBpZiAoT2JqZWN0KF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9faXNfYXJyYXlfX1tcImFcIiAvKiBkZWZhdWx0ICovXSkob2JqKSkge1xuICAgIHJzdCA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDAsIGwgPSBvYmoubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICBpZiAodHlwZW9mIG9ialtpXSA9PT0gJ29iamVjdCcgJiYgb2JqW2ldICE9IG51bGwpIHtcbiAgICAgICAgcnN0W2ldID0gY2xvbmUob2JqW2ldKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJzdFtpXSA9IG9ialtpXTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcnN0ID0ge307XG5cbiAgICBmb3IgKHZhciBrIGluIG9iaikge1xuICAgICAgaWYgKHR5cGVvZiBvYmpba10gPT09ICdvYmplY3QnICYmIG9ialtrXSAhPSBudWxsKSB7XG4gICAgICAgIHJzdFtrXSA9IGNsb25lKG9ialtrXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByc3Rba10gPSBvYmpba107XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJzdDtcbn07XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1tcImFcIl0gPSAoY2xvbmUpO1xuXG4vKioqLyB9KSxcbi8qIDk0ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuZnVuY3Rpb24gZGVib3VuY2UoZnVuYywgd2FpdCwgaW1tZWRpYXRlKSB7XG4gIHZhciB0aW1lb3V0O1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHZhciBjb250ZXh0ID0gdGhpcyxcbiAgICAgICAgYXJncyA9IGFyZ3VtZW50cztcblxuICAgIHZhciBsYXRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRpbWVvdXQgPSBudWxsO1xuXG4gICAgICBpZiAoIWltbWVkaWF0ZSkge1xuICAgICAgICBmdW5jLmFwcGx5KGNvbnRleHQsIGFyZ3MpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB2YXIgY2FsbE5vdyA9IGltbWVkaWF0ZSAmJiAhdGltZW91dDtcbiAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgdGltZW91dCA9IHNldFRpbWVvdXQobGF0ZXIsIHdhaXQpO1xuXG4gICAgaWYgKGNhbGxOb3cpIHtcbiAgICAgIGZ1bmMuYXBwbHkoY29udGV4dCwgYXJncyk7XG4gICAgfVxuICB9O1xufVxuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIF9fd2VicGFja19leHBvcnRzX19bXCJhXCJdID0gKGRlYm91bmNlKTtcblxuLyoqKi8gfSksXG4vKiA5NSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX2lzX2Z1bmN0aW9uX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpO1xuXG4vKipcbiAqIF8ubWVtb2l6ZShjYWxDb2xvcik7XG4gKiBfLm1lbW9pemUoY2FsQ29sb3IsICguLi5hcmdzKSA9PiBhcmdzWzBdKTtcbiAqIEBwYXJhbSBmXG4gKiBAcGFyYW0gcmVzb2x2ZXJcbiAqL1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIF9fd2VicGFja19leHBvcnRzX19bXCJhXCJdID0gKGZ1bmN0aW9uIChmLCByZXNvbHZlcikge1xuICBpZiAoIU9iamVjdChfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX2lzX2Z1bmN0aW9uX19bXCJhXCIgLyogZGVmYXVsdCAqL10pKGYpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgYSBmdW5jdGlvbicpO1xuICB9XG5cbiAgdmFyIG1lbW9pemVkID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBhcmdzID0gW107XG5cbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgYXJnc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICAgIH0gLy8g5L2/55So5pa55rOV5p6E6YCgIGtlee+8jOWmguaenOS4jeWtmOWcqCByZXNvbHZlcu+8jOWImeebtOaOpeWPluesrOS4gOS4quWPguaVsOS9nOS4uiBrZXlcblxuXG4gICAgdmFyIGtleSA9IHJlc29sdmVyID8gcmVzb2x2ZXIuYXBwbHkodGhpcywgYXJncykgOiBhcmdzWzBdO1xuICAgIHZhciBjYWNoZSA9IG1lbW9pemVkLmNhY2hlO1xuXG4gICAgaWYgKGNhY2hlLmhhcyhrZXkpKSB7XG4gICAgICByZXR1cm4gY2FjaGUuZ2V0KGtleSk7XG4gICAgfVxuXG4gICAgdmFyIHJlc3VsdCA9IGYuYXBwbHkodGhpcywgYXJncyk7IC8vIOe8k+WtmOi1t+adpVxuXG4gICAgY2FjaGUuc2V0KGtleSwgcmVzdWx0KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG4gIG1lbW9pemVkLmNhY2hlID0gbmV3IE1hcCgpO1xuICByZXR1cm4gbWVtb2l6ZWQ7XG59KTtcblxuLyoqKi8gfSksXG4vKiA5NiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX2lzX2FycmF5X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9faXNfcGxhaW5fb2JqZWN0X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkpO1xuXG5cbnZhciBNQVhfTUlYX0xFVkVMID0gNTtcblxuZnVuY3Rpb24gX2RlZXBNaXgoZGlzdCwgc3JjLCBsZXZlbCwgbWF4TGV2ZWwpIHtcbiAgbGV2ZWwgPSBsZXZlbCB8fCAwO1xuICBtYXhMZXZlbCA9IG1heExldmVsIHx8IE1BWF9NSVhfTEVWRUw7XG5cbiAgZm9yICh2YXIga2V5IGluIHNyYykge1xuICAgIGlmIChzcmMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgdmFyIHZhbHVlID0gc3JjW2tleV07XG5cbiAgICAgIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiBPYmplY3QoX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX19pc19wbGFpbl9vYmplY3RfX1tcImFcIiAvKiBkZWZhdWx0ICovXSkodmFsdWUpKSB7XG4gICAgICAgIGlmICghT2JqZWN0KF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9faXNfcGxhaW5fb2JqZWN0X19bXCJhXCIgLyogZGVmYXVsdCAqL10pKGRpc3Rba2V5XSkpIHtcbiAgICAgICAgICBkaXN0W2tleV0gPSB7fTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsZXZlbCA8IG1heExldmVsKSB7XG4gICAgICAgICAgX2RlZXBNaXgoZGlzdFtrZXldLCB2YWx1ZSwgbGV2ZWwgKyAxLCBtYXhMZXZlbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGlzdFtrZXldID0gc3JjW2tleV07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoT2JqZWN0KF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9faXNfYXJyYXlfX1tcImFcIiAvKiBkZWZhdWx0ICovXSkodmFsdWUpKSB7XG4gICAgICAgIGRpc3Rba2V5XSA9IFtdO1xuICAgICAgICBkaXN0W2tleV0gPSBkaXN0W2tleV0uY29uY2F0KHZhbHVlKTtcbiAgICAgIH0gZWxzZSBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBkaXN0W2tleV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn0gLy8gdG9kbyDph43lhplcblxuXG52YXIgZGVlcE1peCA9IGZ1bmN0aW9uIChyc3QpIHtcbiAgdmFyIGFyZ3MgPSBbXTtcblxuICBmb3IgKHZhciBfaSA9IDE7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgIGFyZ3NbX2kgLSAxXSA9IGFyZ3VtZW50c1tfaV07XG4gIH1cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpICs9IDEpIHtcbiAgICBfZGVlcE1peChyc3QsIGFyZ3NbaV0pO1xuICB9XG5cbiAgcmV0dXJuIHJzdDtcbn07XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1tcImFcIl0gPSAoZGVlcE1peCk7XG5cbi8qKiovIH0pLFxuLyogOTcgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19taXhfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTYpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9faXNfZnVuY3Rpb25fXyA9IF9fd2VicGFja19yZXF1aXJlX18oMyk7XG5cblxuXG52YXIgZXh0ZW5kID0gZnVuY3Rpb24gKHN1YmNsYXNzLCBzdXBlcmNsYXNzLCBvdmVycmlkZXMsIHN0YXRpY092ZXJyaWRlcykge1xuICAvLyDlpoLmnpzlj6rmj5DkvpvniLbnsbvmnoTpgKDlh73mlbDvvIzliJnoh6rliqjnlJ/miJDlrZDnsbvmnoTpgKDlh73mlbBcbiAgaWYgKCFPYmplY3QoX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX19pc19mdW5jdGlvbl9fW1wiYVwiIC8qIGRlZmF1bHQgKi9dKShzdXBlcmNsYXNzKSkge1xuICAgIG92ZXJyaWRlcyA9IHN1cGVyY2xhc3M7XG4gICAgc3VwZXJjbGFzcyA9IHN1YmNsYXNzO1xuXG4gICAgc3ViY2xhc3MgPSBmdW5jdGlvbiAoKSB7fTtcbiAgfVxuXG4gIHZhciBjcmVhdGUgPSBPYmplY3QuY3JlYXRlID8gZnVuY3Rpb24gKHByb3RvLCBjKSB7XG4gICAgcmV0dXJuIE9iamVjdC5jcmVhdGUocHJvdG8sIHtcbiAgICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICAgIHZhbHVlOiBjXG4gICAgICB9XG4gICAgfSk7XG4gIH0gOiBmdW5jdGlvbiAocHJvdG8sIGMpIHtcbiAgICBmdW5jdGlvbiBUbXAoKSB7fVxuXG4gICAgVG1wLnByb3RvdHlwZSA9IHByb3RvO1xuICAgIHZhciBvID0gbmV3IFRtcCgpO1xuICAgIG8uY29uc3RydWN0b3IgPSBjO1xuICAgIHJldHVybiBvO1xuICB9O1xuICB2YXIgc3VwZXJPYmogPSBjcmVhdGUoc3VwZXJjbGFzcy5wcm90b3R5cGUsIHN1YmNsYXNzKTsgLy8gbmV3IHN1cGVyY2xhc3MoKSwvL+WunuS+i+WMlueItuexu+S9nOS4uuWtkOexu+eahHByb3RvdHlwZVxuXG4gIHN1YmNsYXNzLnByb3RvdHlwZSA9IE9iamVjdChfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX21peF9fW1wiYVwiIC8qIGRlZmF1bHQgKi9dKShzdXBlck9iaiwgc3ViY2xhc3MucHJvdG90eXBlKTsgLy8g5oyH5a6a5a2Q57G755qEcHJvdG90eXBlXG5cbiAgc3ViY2xhc3Muc3VwZXJjbGFzcyA9IGNyZWF0ZShzdXBlcmNsYXNzLnByb3RvdHlwZSwgc3VwZXJjbGFzcyk7XG4gIE9iamVjdChfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX21peF9fW1wiYVwiIC8qIGRlZmF1bHQgKi9dKShzdXBlck9iaiwgb3ZlcnJpZGVzKTtcbiAgT2JqZWN0KF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fbWl4X19bXCJhXCIgLyogZGVmYXVsdCAqL10pKHN1YmNsYXNzLCBzdGF0aWNPdmVycmlkZXMpO1xuICByZXR1cm4gc3ViY2xhc3M7XG59O1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIF9fd2VicGFja19leHBvcnRzX19bXCJhXCJdID0gKGV4dGVuZCk7XG5cbi8qKiovIH0pLFxuLyogOTggKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19pc19hcnJheV9saWtlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpO1xuXG5cbnZhciBpbmRleE9mID0gZnVuY3Rpb24gKGFyciwgb2JqKSB7XG4gIGlmICghT2JqZWN0KF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9faXNfYXJyYXlfbGlrZV9fW1wiYVwiIC8qIGRlZmF1bHQgKi9dKShhcnIpKSB7XG4gICAgcmV0dXJuIC0xO1xuICB9XG5cbiAgdmFyIG0gPSBBcnJheS5wcm90b3R5cGUuaW5kZXhPZjtcblxuICBpZiAobSkge1xuICAgIHJldHVybiBtLmNhbGwoYXJyLCBvYmopO1xuICB9XG5cbiAgdmFyIGluZGV4ID0gLTE7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoYXJyW2ldID09PSBvYmopIHtcbiAgICAgIGluZGV4ID0gaTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBpbmRleDtcbn07XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1tcImFcIl0gPSAoaW5kZXhPZik7XG5cbi8qKiovIH0pLFxuLyogOTkgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19pc19uaWxfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX19pc19hcnJheV9saWtlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9fZ2V0X3R5cGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMjcpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19faXNfcHJvdG90eXBlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI4KTtcblxuXG5cblxudmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxuZnVuY3Rpb24gaXNFbXB0eSh2YWx1ZSkge1xuICAvKipcbiAgICogaXNFbXB0eShudWxsKSA9PiB0cnVlXG4gICAqIGlzRW1wdHkoKSA9PiB0cnVlXG4gICAqIGlzRW1wdHkodHJ1ZSkgPT4gdHJ1ZVxuICAgKiBpc0VtcHR5KDEpID0+IHRydWVcbiAgICogaXNFbXB0eShbMSwgMiwgM10pID0+IGZhbHNlXG4gICAqIGlzRW1wdHkoJ2FiYycpID0+IGZhbHNlXG4gICAqIGlzRW1wdHkoeyBhOiAxIH0pID0+IGZhbHNlXG4gICAqL1xuICBpZiAoT2JqZWN0KF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9faXNfbmlsX19bXCJhXCIgLyogZGVmYXVsdCAqL10pKHZhbHVlKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKE9iamVjdChfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfX2lzX2FycmF5X2xpa2VfX1tcImFcIiAvKiBkZWZhdWx0ICovXSkodmFsdWUpKSB7XG4gICAgcmV0dXJuICF2YWx1ZS5sZW5ndGg7XG4gIH1cblxuICB2YXIgdHlwZSA9IE9iamVjdChfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfX2dldF90eXBlX19bXCJhXCIgLyogZGVmYXVsdCAqL10pKHZhbHVlKTtcblxuICBpZiAodHlwZSA9PT0gJ01hcCcgfHwgdHlwZSA9PT0gJ1NldCcpIHtcbiAgICByZXR1cm4gIXZhbHVlLnNpemU7XG4gIH1cblxuICBpZiAoT2JqZWN0KF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19faXNfcHJvdG90eXBlX19bXCJhXCIgLyogZGVmYXVsdCAqL10pKHZhbHVlKSkge1xuICAgIHJldHVybiAhT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aDtcbiAgfVxuXG4gIGZvciAodmFyIGtleSBpbiB2YWx1ZSkge1xuICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCBrZXkpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1tcImFcIl0gPSAoaXNFbXB0eSk7XG5cbi8qKiovIH0pLFxuLyogMTAwICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9faXNfZnVuY3Rpb25fXyA9IF9fd2VicGFja19yZXF1aXJlX18oMyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX19pc19lcXVhbF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygyOSk7XG5cblxuLyoqXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtmbl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpc29ucy5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFsdWVzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIGZ1bmN0aW9uIGlzR3JlZXRpbmcodmFsdWUpIHtcbiAqICAgcmV0dXJuIC9eaCg/Oml8ZWxsbykkLy50ZXN0KHZhbHVlKTtcbiAqIH1cbiAqXG4gKiBmdW5jdGlvbiBjdXN0b21pemVyKG9ialZhbHVlLCBvdGhWYWx1ZSkge1xuICogICBpZiAoaXNHcmVldGluZyhvYmpWYWx1ZSkgJiYgaXNHcmVldGluZyhvdGhWYWx1ZSkpIHtcbiAqICAgICByZXR1cm4gdHJ1ZTtcbiAqICAgfVxuICogfVxuICpcbiAqIHZhciBhcnJheSA9IFsnaGVsbG8nLCAnZ29vZGJ5ZSddO1xuICogdmFyIG90aGVyID0gWydoaScsICdnb29kYnllJ107XG4gKlxuICogaXNFcXVhbFdpdGgoYXJyYXksIG90aGVyLCBjdXN0b21pemVyKTsgIC8vID0+IHRydWVcbiAqL1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIF9fd2VicGFja19leHBvcnRzX19bXCJhXCJdID0gKGZ1bmN0aW9uICh2YWx1ZSwgb3RoZXIsIGZuKSB7XG4gIGlmICghT2JqZWN0KF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9faXNfZnVuY3Rpb25fX1tcImFcIiAvKiBkZWZhdWx0ICovXSkoZm4pKSB7XG4gICAgcmV0dXJuIE9iamVjdChfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfX2lzX2VxdWFsX19bXCJhXCIgLyogZGVmYXVsdCAqL10pKHZhbHVlLCBvdGhlcik7XG4gIH1cblxuICByZXR1cm4gISFmbih2YWx1ZSwgb3RoZXIpO1xufSk7XG5cbi8qKiovIH0pLFxuLyogMTAxICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fZWFjaF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfX2lzX2FycmF5X2xpa2VfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7XG5cblxuXG52YXIgbWFwID0gZnVuY3Rpb24gKGFyciwgZnVuYykge1xuICBpZiAoIU9iamVjdChfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfX2lzX2FycmF5X2xpa2VfX1tcImFcIiAvKiBkZWZhdWx0ICovXSkoYXJyKSkge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICByZXR1cm4gYXJyO1xuICB9XG5cbiAgdmFyIHJlc3VsdCA9IFtdO1xuICBPYmplY3QoX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19lYWNoX19bXCJhXCIgLyogZGVmYXVsdCAqL10pKGFyciwgZnVuY3Rpb24gKHZhbHVlLCBpbmRleCkge1xuICAgIHJlc3VsdC5wdXNoKGZ1bmModmFsdWUsIGluZGV4KSk7XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyBfX3dlYnBhY2tfZXhwb3J0c19fW1wiYVwiXSA9IChtYXApO1xuXG4vKioqLyB9KSxcbi8qIDEwMiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX2lzX25pbF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfX2lzX29iamVjdF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMyk7XG5cblxuXG52YXIgaWRlbnRpdHkgPSBmdW5jdGlvbiAodikge1xuICByZXR1cm4gdjtcbn07XG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1tcImFcIl0gPSAoZnVuY3Rpb24gKG9iamVjdCwgZnVuYykge1xuICBpZiAoZnVuYyA9PT0gdm9pZCAwKSB7XG4gICAgZnVuYyA9IGlkZW50aXR5O1xuICB9XG5cbiAgdmFyIHIgPSB7fTtcblxuICBpZiAoT2JqZWN0KF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9faXNfb2JqZWN0X19bXCJhXCIgLyogZGVmYXVsdCAqL10pKG9iamVjdCkgJiYgIU9iamVjdChfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX2lzX25pbF9fW1wiYVwiIC8qIGRlZmF1bHQgKi9dKShvYmplY3QpKSB7XG4gICAgT2JqZWN0LmtleXMob2JqZWN0KS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIHJba2V5XSA9IGZ1bmMob2JqZWN0W2tleV0sIGtleSk7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gcjtcbn0pO1xuXG4vKioqLyB9KSxcbi8qIDEwMyAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX2lzX3N0cmluZ19fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4KTtcblxuLyoqXG4gKiBodHRwczovL2dpdGh1Yi5jb20vZGV2ZWxvcGl0L2Rsdi9ibG9iL21hc3Rlci9pbmRleC5qc1xuICogQHBhcmFtIG9ialxuICogQHBhcmFtIGtleVxuICogQHBhcmFtIGRlZmF1bHRWYWx1ZVxuICovXG5cbi8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1tcImFcIl0gPSAoZnVuY3Rpb24gKG9iaiwga2V5LCBkZWZhdWx0VmFsdWUpIHtcbiAgdmFyIHAgPSAwO1xuICB2YXIga2V5QXJyID0gT2JqZWN0KF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9faXNfc3RyaW5nX19bXCJhXCIgLyogZGVmYXVsdCAqL10pKGtleSkgPyBrZXkuc3BsaXQoJy4nKSA6IGtleTtcblxuICB3aGlsZSAob2JqICYmIHAgPCBrZXlBcnIubGVuZ3RoKSB7XG4gICAgb2JqID0gb2JqW2tleUFycltwKytdXTtcbiAgfVxuXG4gIHJldHVybiBvYmogPT09IHVuZGVmaW5lZCB8fCBwIDwga2V5QXJyLmxlbmd0aCA/IGRlZmF1bHRWYWx1ZSA6IG9iajtcbn0pO1xuXG4vKioqLyB9KSxcbi8qIDEwNCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX2lzX29iamVjdF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX19pc19zdHJpbmdfXyA9IF9fd2VicGFja19yZXF1aXJlX18oOCk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX19pc19udW1iZXJfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7XG5cblxuXG4vKipcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9kZXZlbG9waXQvZGx2L2Jsb2IvbWFzdGVyL2luZGV4LmpzXG4gKiBAcGFyYW0gb2JqXG4gKiBAcGFyYW0gcGF0aFxuICogQHBhcmFtIHZhbHVlXG4gKi9cblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyBfX3dlYnBhY2tfZXhwb3J0c19fW1wiYVwiXSA9IChmdW5jdGlvbiAob2JqLCBwYXRoLCB2YWx1ZSkge1xuICB2YXIgbyA9IG9iajtcbiAgdmFyIGtleUFyciA9IE9iamVjdChfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfX2lzX3N0cmluZ19fW1wiYVwiIC8qIGRlZmF1bHQgKi9dKShwYXRoKSA/IHBhdGguc3BsaXQoJy4nKSA6IHBhdGg7XG4gIGtleUFyci5mb3JFYWNoKGZ1bmN0aW9uIChrZXksIGlkeCkge1xuICAgIC8vIOS4jeaYr+acgOWQjuS4gOS4qlxuICAgIGlmIChpZHggPCBrZXlBcnIubGVuZ3RoIC0gMSkge1xuICAgICAgaWYgKCFPYmplY3QoX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19pc19vYmplY3RfX1tcImFcIiAvKiBkZWZhdWx0ICovXSkob1trZXldKSkge1xuICAgICAgICBvW2tleV0gPSBPYmplY3QoX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX19pc19udW1iZXJfX1tcImFcIiAvKiBkZWZhdWx0ICovXSkoa2V5QXJyW2lkeCArIDFdKSA/IFtdIDoge307XG4gICAgICB9XG5cbiAgICAgIG8gPSBvW2tleV07XG4gICAgfSBlbHNlIHtcbiAgICAgIG9ba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBvYmo7XG59KTtcblxuLyoqKi8gfSksXG4vKiAxMDUgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX19lYWNoX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9faXNfcGxhaW5fb2JqZWN0X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkpO1xuXG5cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIF9fd2VicGFja19leHBvcnRzX19bXCJhXCJdID0gKGZ1bmN0aW9uIChvYmplY3QsIGtleXMpIHtcbiAgaWYgKG9iamVjdCA9PT0gbnVsbCB8fCAhT2JqZWN0KF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9faXNfcGxhaW5fb2JqZWN0X19bXCJhXCIgLyogZGVmYXVsdCAqL10pKG9iamVjdCkpIHtcbiAgICByZXR1cm4ge307XG4gIH1cblxuICB2YXIgcmVzdWx0ID0ge307XG4gIE9iamVjdChfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX2VhY2hfX1tcImFcIiAvKiBkZWZhdWx0ICovXSkoa2V5cywgZnVuY3Rpb24gKGtleSkge1xuICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSkge1xuICAgICAgcmVzdWx0W2tleV0gPSBvYmplY3Rba2V5XTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufSk7XG5cbi8qKiovIH0pLFxuLyogMTA2ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyBfX3dlYnBhY2tfZXhwb3J0c19fW1wiYVwiXSA9IChmdW5jdGlvbiAoZnVuYywgd2FpdCwgb3B0aW9ucykge1xuICB2YXIgdGltZW91dCwgY29udGV4dCwgYXJncywgcmVzdWx0O1xuICB2YXIgcHJldmlvdXMgPSAwO1xuICBpZiAoIW9wdGlvbnMpIG9wdGlvbnMgPSB7fTtcblxuICB2YXIgbGF0ZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgcHJldmlvdXMgPSBvcHRpb25zLmxlYWRpbmcgPT09IGZhbHNlID8gMCA6IERhdGUubm93KCk7XG4gICAgdGltZW91dCA9IG51bGw7XG4gICAgcmVzdWx0ID0gZnVuYy5hcHBseShjb250ZXh0LCBhcmdzKTtcbiAgICBpZiAoIXRpbWVvdXQpIGNvbnRleHQgPSBhcmdzID0gbnVsbDtcbiAgfTtcblxuICB2YXIgdGhyb3R0bGVkID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBub3cgPSBEYXRlLm5vdygpO1xuICAgIGlmICghcHJldmlvdXMgJiYgb3B0aW9ucy5sZWFkaW5nID09PSBmYWxzZSkgcHJldmlvdXMgPSBub3c7XG4gICAgdmFyIHJlbWFpbmluZyA9IHdhaXQgLSAobm93IC0gcHJldmlvdXMpO1xuICAgIGNvbnRleHQgPSB0aGlzO1xuICAgIGFyZ3MgPSBhcmd1bWVudHM7XG5cbiAgICBpZiAocmVtYWluaW5nIDw9IDAgfHwgcmVtYWluaW5nID4gd2FpdCkge1xuICAgICAgaWYgKHRpbWVvdXQpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICB0aW1lb3V0ID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgcHJldmlvdXMgPSBub3c7XG4gICAgICByZXN1bHQgPSBmdW5jLmFwcGx5KGNvbnRleHQsIGFyZ3MpO1xuICAgICAgaWYgKCF0aW1lb3V0KSBjb250ZXh0ID0gYXJncyA9IG51bGw7XG4gICAgfSBlbHNlIGlmICghdGltZW91dCAmJiBvcHRpb25zLnRyYWlsaW5nICE9PSBmYWxzZSkge1xuICAgICAgdGltZW91dCA9IHNldFRpbWVvdXQobGF0ZXIsIHJlbWFpbmluZyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICB0aHJvdHRsZWQuY2FuY2VsID0gZnVuY3Rpb24gKCkge1xuICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICBwcmV2aW91cyA9IDA7XG4gICAgdGltZW91dCA9IGNvbnRleHQgPSBhcmdzID0gbnVsbDtcbiAgfTtcblxuICByZXR1cm4gdGhyb3R0bGVkO1xufSk7XG5cbi8qKiovIH0pLFxuLyogMTA3ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9faXNfYXJyYXlfbGlrZV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKTtcblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyBfX3dlYnBhY2tfZXhwb3J0c19fW1wiYVwiXSA9IChmdW5jdGlvbiAodmFsdWUpIHtcbiAgcmV0dXJuIE9iamVjdChfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX2lzX2FycmF5X2xpa2VfX1tcImFcIiAvKiBkZWZhdWx0ICovXSkodmFsdWUpID8gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodmFsdWUpIDogW107XG59KTtcblxuLyoqKi8gfSksXG4vKiAxMDggKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG52YXIgbWFwID0ge307XG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIF9fd2VicGFja19leHBvcnRzX19bXCJhXCJdID0gKGZ1bmN0aW9uIChwcmVmaXgpIHtcbiAgcHJlZml4ID0gcHJlZml4IHx8ICdnJztcblxuICBpZiAoIW1hcFtwcmVmaXhdKSB7XG4gICAgbWFwW3ByZWZpeF0gPSAxO1xuICB9IGVsc2Uge1xuICAgIG1hcFtwcmVmaXhdICs9IDE7XG4gIH1cblxuICByZXR1cm4gcHJlZml4ICsgbWFwW3ByZWZpeF07XG59KTtcblxuLyoqKi8gfSksXG4vKiAxMDkgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIF9fd2VicGFja19leHBvcnRzX19bXCJhXCJdID0gKGZ1bmN0aW9uICgpIHt9KTtcblxuLyoqKi8gfSksXG4vKiAxMTAgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIF9fd2VicGFja19leHBvcnRzX19bXCJhXCJdID0gKGZ1bmN0aW9uICh2KSB7XG4gIHJldHVybiB2O1xufSk7XG5cbi8qKiovIH0pLFxuLyogMTExICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuLyogaGFybW9ueSBleHBvcnQgKGltbXV0YWJsZSkgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1tcImFcIl0gPSBzaXplO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9faXNfbmlsX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9faXNfYXJyYXlfbGlrZV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKTtcblxuXG5mdW5jdGlvbiBzaXplKG8pIHtcbiAgaWYgKE9iamVjdChfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX2lzX25pbF9fW1wiYVwiIC8qIGRlZmF1bHQgKi9dKShvKSkge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgaWYgKE9iamVjdChfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfX2lzX2FycmF5X2xpa2VfX1tcImFcIiAvKiBkZWZhdWx0ICovXSkobykpIHtcbiAgICByZXR1cm4gby5sZW5ndGg7XG4gIH1cblxuICByZXR1cm4gT2JqZWN0LmtleXMobykubGVuZ3RoO1xufVxuXG4vKioqLyB9KSxcbi8qIDExMiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbi8qKlxuICogay12IOWtmOWCqFxuICovXG52YXIgZGVmYXVsdF8xID1cbi8qKiBAY2xhc3MgKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gZGVmYXVsdF8xKCkge1xuICAgIHRoaXMubWFwID0ge307XG4gIH1cblxuICBkZWZhdWx0XzEucHJvdG90eXBlLmhhcyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICByZXR1cm4gdGhpcy5tYXBba2V5XSAhPT0gdW5kZWZpbmVkO1xuICB9O1xuXG4gIGRlZmF1bHRfMS5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKGtleSwgZGVmKSB7XG4gICAgdmFyIHYgPSB0aGlzLm1hcFtrZXldO1xuICAgIHJldHVybiB2ID09PSB1bmRlZmluZWQgPyBkZWYgOiB2O1xuICB9O1xuXG4gIGRlZmF1bHRfMS5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICB0aGlzLm1hcFtrZXldID0gdmFsdWU7XG4gIH07XG5cbiAgZGVmYXVsdF8xLnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLm1hcCA9IHt9O1xuICB9O1xuXG4gIGRlZmF1bHRfMS5wcm90b3R5cGUuZGVsZXRlID0gZnVuY3Rpb24gKGtleSkge1xuICAgIGRlbGV0ZSB0aGlzLm1hcFtrZXldO1xuICB9O1xuXG4gIGRlZmF1bHRfMS5wcm90b3R5cGUuc2l6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5tYXApLmxlbmd0aDtcbiAgfTtcblxuICByZXR1cm4gZGVmYXVsdF8xO1xufSgpO1xuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIF9fd2VicGFja19leHBvcnRzX19bXCJhXCJdID0gKGRlZmF1bHRfMSk7XG5cbi8qKiovIH0pLFxuLyogMTEzICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbi8vIHdyYXAgdHJlZSBub2RlXG5mdW5jdGlvbiBXcmFwcGVkVHJlZSh3LCBoLCB5LCBjKSB7XG4gIGlmIChjID09PSB2b2lkIDApIHtcbiAgICBjID0gW107XG4gIH1cblxuICB2YXIgbWUgPSB0aGlzOyAvLyBzaXplXG5cbiAgbWUudyA9IHcgfHwgMDtcbiAgbWUuaCA9IGggfHwgMDsgLy8gcG9zaXRpb25cblxuICBtZS55ID0geSB8fCAwO1xuICBtZS54ID0gMDsgLy8gY2hpbGRyZW5cblxuICBtZS5jID0gYyB8fCBbXTtcbiAgbWUuY3MgPSBjLmxlbmd0aDsgLy8gbW9kaWZpZWRcblxuICBtZS5wcmVsaW0gPSAwO1xuICBtZS5tb2QgPSAwO1xuICBtZS5zaGlmdCA9IDA7XG4gIG1lLmNoYW5nZSA9IDA7IC8vIGxlZnQvcmlnaHQgdHJlZVxuXG4gIG1lLnRsID0gbnVsbDtcbiAgbWUudHIgPSBudWxsOyAvLyBleHRyZW1lIGxlZnQvcmlnaHQgdHJlZVxuXG4gIG1lLmVsID0gbnVsbDtcbiAgbWUuZXIgPSBudWxsOyAvLyBtb2RpZmllZCBsZWZ0L3JpZ2h0IHRyZWVcblxuICBtZS5tc2VsID0gMDtcbiAgbWUubXNlciA9IDA7XG59XG5cbldyYXBwZWRUcmVlLmZyb21Ob2RlID0gZnVuY3Rpb24gKHJvb3QsIGlzSG9yaXpvbnRhbCkge1xuICBpZiAoIXJvb3QpIHJldHVybiBudWxsO1xuICB2YXIgY2hpbGRyZW4gPSBbXTtcbiAgcm9vdC5jaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgIGNoaWxkcmVuLnB1c2goV3JhcHBlZFRyZWUuZnJvbU5vZGUoY2hpbGQsIGlzSG9yaXpvbnRhbCkpO1xuICB9KTtcbiAgaWYgKGlzSG9yaXpvbnRhbCkgcmV0dXJuIG5ldyBXcmFwcGVkVHJlZShyb290LmhlaWdodCwgcm9vdC53aWR0aCwgcm9vdC54LCBjaGlsZHJlbik7XG4gIHJldHVybiBuZXcgV3JhcHBlZFRyZWUocm9vdC53aWR0aCwgcm9vdC5oZWlnaHQsIHJvb3QueSwgY2hpbGRyZW4pO1xufTsgLy8gbm9kZSB1dGlsc1xuXG5cbmZ1bmN0aW9uIG1vdmVSaWdodChub2RlLCBtb3ZlLCBpc0hvcml6b250YWwpIHtcbiAgaWYgKGlzSG9yaXpvbnRhbCkge1xuICAgIG5vZGUueSArPSBtb3ZlO1xuICB9IGVsc2Uge1xuICAgIG5vZGUueCArPSBtb3ZlO1xuICB9XG5cbiAgbm9kZS5jaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgIG1vdmVSaWdodChjaGlsZCwgbW92ZSwgaXNIb3Jpem9udGFsKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldE1pbihub2RlLCBpc0hvcml6b250YWwpIHtcbiAgdmFyIHJlcyA9IGlzSG9yaXpvbnRhbCA/IG5vZGUueSA6IG5vZGUueDtcbiAgbm9kZS5jaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgIHJlcyA9IE1hdGgubWluKGdldE1pbihjaGlsZCwgaXNIb3Jpem9udGFsKSwgcmVzKTtcbiAgfSk7XG4gIHJldHVybiByZXM7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZShub2RlLCBpc0hvcml6b250YWwpIHtcbiAgdmFyIG1pbiA9IGdldE1pbihub2RlLCBpc0hvcml6b250YWwpO1xuICBtb3ZlUmlnaHQobm9kZSwgLW1pbiwgaXNIb3Jpem9udGFsKTtcbn1cblxuZnVuY3Rpb24gY29udmVydEJhY2soY29udmVydGVkXG4vKiBXcmFwcGVkVHJlZSAqL1xuLCByb290XG4vKiBUcmVlTm9kZSAqL1xuLCBpc0hvcml6b250YWwpIHtcbiAgaWYgKGlzSG9yaXpvbnRhbCkge1xuICAgIHJvb3QueSA9IGNvbnZlcnRlZC54O1xuICB9IGVsc2Uge1xuICAgIHJvb3QueCA9IGNvbnZlcnRlZC54O1xuICB9XG5cbiAgY29udmVydGVkLmMuZm9yRWFjaChmdW5jdGlvbiAoY2hpbGQsIGkpIHtcbiAgICBjb252ZXJ0QmFjayhjaGlsZCwgcm9vdC5jaGlsZHJlbltpXSwgaXNIb3Jpem9udGFsKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGxheWVyKG5vZGUsIGlzSG9yaXpvbnRhbCwgZCkge1xuICBpZiAoZCA9PT0gdm9pZCAwKSB7XG4gICAgZCA9IDA7XG4gIH1cblxuICBpZiAoaXNIb3Jpem9udGFsKSB7XG4gICAgbm9kZS54ID0gZDtcbiAgICBkICs9IG5vZGUud2lkdGg7XG4gIH0gZWxzZSB7XG4gICAgbm9kZS55ID0gZDtcbiAgICBkICs9IG5vZGUuaGVpZ2h0O1xuICB9XG5cbiAgbm9kZS5jaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgIGxheWVyKGNoaWxkLCBpc0hvcml6b250YWwsIGQpO1xuICB9KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAocm9vdCwgb3B0aW9ucykge1xuICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG5cbiAgdmFyIGlzSG9yaXpvbnRhbCA9IG9wdGlvbnMuaXNIb3Jpem9udGFsO1xuXG4gIGZ1bmN0aW9uIGZpcnN0V2Fsayh0KSB7XG4gICAgaWYgKHQuY3MgPT09IDApIHtcbiAgICAgIHNldEV4dHJlbWVzKHQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZpcnN0V2Fsayh0LmNbMF0pO1xuICAgIHZhciBpaCA9IHVwZGF0ZUlZTChib3R0b20odC5jWzBdLmVsKSwgMCwgbnVsbCk7XG5cbiAgICBmb3IgKHZhciBpID0gMTsgaSA8IHQuY3M7ICsraSkge1xuICAgICAgZmlyc3RXYWxrKHQuY1tpXSk7XG4gICAgICB2YXIgbWluID0gYm90dG9tKHQuY1tpXS5lcik7XG4gICAgICBzZXBhcmF0ZSh0LCBpLCBpaCk7XG4gICAgICBpaCA9IHVwZGF0ZUlZTChtaW4sIGksIGloKTtcbiAgICB9XG5cbiAgICBwb3NpdGlvblJvb3QodCk7XG4gICAgc2V0RXh0cmVtZXModCk7XG4gIH1cblxuICBmdW5jdGlvbiBzZXRFeHRyZW1lcyh0KSB7XG4gICAgaWYgKHQuY3MgPT09IDApIHtcbiAgICAgIHQuZWwgPSB0O1xuICAgICAgdC5lciA9IHQ7XG4gICAgICB0Lm1zZWwgPSB0Lm1zZXIgPSAwO1xuICAgIH0gZWxzZSB7XG4gICAgICB0LmVsID0gdC5jWzBdLmVsO1xuICAgICAgdC5tc2VsID0gdC5jWzBdLm1zZWw7XG4gICAgICB0LmVyID0gdC5jW3QuY3MgLSAxXS5lcjtcbiAgICAgIHQubXNlciA9IHQuY1t0LmNzIC0gMV0ubXNlcjtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzZXBhcmF0ZSh0LCBpLCBpaCkge1xuICAgIHZhciBzciA9IHQuY1tpIC0gMV07XG4gICAgdmFyIG1zc3IgPSBzci5tb2Q7XG4gICAgdmFyIGNsID0gdC5jW2ldO1xuICAgIHZhciBtc2NsID0gY2wubW9kO1xuXG4gICAgd2hpbGUgKHNyICE9PSBudWxsICYmIGNsICE9PSBudWxsKSB7XG4gICAgICBpZiAoYm90dG9tKHNyKSA+IGloLmxvdykgaWggPSBpaC5ueHQ7XG4gICAgICB2YXIgZGlzdCA9IG1zc3IgKyBzci5wcmVsaW0gKyBzci53IC0gKG1zY2wgKyBjbC5wcmVsaW0pO1xuXG4gICAgICBpZiAoZGlzdCA+IDApIHtcbiAgICAgICAgbXNjbCArPSBkaXN0O1xuICAgICAgICBtb3ZlU3VidHJlZSh0LCBpLCBpaC5pbmRleCwgZGlzdCk7XG4gICAgICB9XG5cbiAgICAgIHZhciBzeSA9IGJvdHRvbShzcik7XG4gICAgICB2YXIgY3kgPSBib3R0b20oY2wpO1xuXG4gICAgICBpZiAoc3kgPD0gY3kpIHtcbiAgICAgICAgc3IgPSBuZXh0UmlnaHRDb250b3VyKHNyKTtcbiAgICAgICAgaWYgKHNyICE9PSBudWxsKSBtc3NyICs9IHNyLm1vZDtcbiAgICAgIH1cblxuICAgICAgaWYgKHN5ID49IGN5KSB7XG4gICAgICAgIGNsID0gbmV4dExlZnRDb250b3VyKGNsKTtcbiAgICAgICAgaWYgKGNsICE9PSBudWxsKSBtc2NsICs9IGNsLm1vZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXNyICYmICEhY2wpIHtcbiAgICAgIHNldExlZnRUaHJlYWQodCwgaSwgY2wsIG1zY2wpO1xuICAgIH0gZWxzZSBpZiAoISFzciAmJiAhY2wpIHtcbiAgICAgIHNldFJpZ2h0VGhyZWFkKHQsIGksIHNyLCBtc3NyKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBtb3ZlU3VidHJlZSh0LCBpLCBzaSwgZGlzdCkge1xuICAgIHQuY1tpXS5tb2QgKz0gZGlzdDtcbiAgICB0LmNbaV0ubXNlbCArPSBkaXN0O1xuICAgIHQuY1tpXS5tc2VyICs9IGRpc3Q7XG4gICAgZGlzdHJpYnV0ZUV4dHJhKHQsIGksIHNpLCBkaXN0KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG5leHRMZWZ0Q29udG91cih0KSB7XG4gICAgcmV0dXJuIHQuY3MgPT09IDAgPyB0LnRsIDogdC5jWzBdO1xuICB9XG5cbiAgZnVuY3Rpb24gbmV4dFJpZ2h0Q29udG91cih0KSB7XG4gICAgcmV0dXJuIHQuY3MgPT09IDAgPyB0LnRyIDogdC5jW3QuY3MgLSAxXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGJvdHRvbSh0KSB7XG4gICAgcmV0dXJuIHQueSArIHQuaDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNldExlZnRUaHJlYWQodCwgaSwgY2wsIG1vZHN1bWNsKSB7XG4gICAgdmFyIGxpID0gdC5jWzBdLmVsO1xuICAgIGxpLnRsID0gY2w7XG4gICAgdmFyIGRpZmYgPSBtb2RzdW1jbCAtIGNsLm1vZCAtIHQuY1swXS5tc2VsO1xuICAgIGxpLm1vZCArPSBkaWZmO1xuICAgIGxpLnByZWxpbSAtPSBkaWZmO1xuICAgIHQuY1swXS5lbCA9IHQuY1tpXS5lbDtcbiAgICB0LmNbMF0ubXNlbCA9IHQuY1tpXS5tc2VsO1xuICB9XG5cbiAgZnVuY3Rpb24gc2V0UmlnaHRUaHJlYWQodCwgaSwgc3IsIG1vZHN1bXNyKSB7XG4gICAgdmFyIHJpID0gdC5jW2ldLmVyO1xuICAgIHJpLnRyID0gc3I7XG4gICAgdmFyIGRpZmYgPSBtb2RzdW1zciAtIHNyLm1vZCAtIHQuY1tpXS5tc2VyO1xuICAgIHJpLm1vZCArPSBkaWZmO1xuICAgIHJpLnByZWxpbSAtPSBkaWZmO1xuICAgIHQuY1tpXS5lciA9IHQuY1tpIC0gMV0uZXI7XG4gICAgdC5jW2ldLm1zZXIgPSB0LmNbaSAtIDFdLm1zZXI7XG4gIH1cblxuICBmdW5jdGlvbiBwb3NpdGlvblJvb3QodCkge1xuICAgIHQucHJlbGltID0gKHQuY1swXS5wcmVsaW0gKyB0LmNbMF0ubW9kICsgdC5jW3QuY3MgLSAxXS5tb2QgKyB0LmNbdC5jcyAtIDFdLnByZWxpbSArIHQuY1t0LmNzIC0gMV0udykgLyAyIC0gdC53IC8gMjtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNlY29uZFdhbGsodCwgbW9kc3VtKSB7XG4gICAgbW9kc3VtICs9IHQubW9kO1xuICAgIHQueCA9IHQucHJlbGltICsgbW9kc3VtO1xuICAgIGFkZENoaWxkU3BhY2luZyh0KTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdC5jczsgaSsrKSB7XG4gICAgICBzZWNvbmRXYWxrKHQuY1tpXSwgbW9kc3VtKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBkaXN0cmlidXRlRXh0cmEodCwgaSwgc2ksIGRpc3QpIHtcbiAgICBpZiAoc2kgIT09IGkgLSAxKSB7XG4gICAgICB2YXIgbnIgPSBpIC0gc2k7XG4gICAgICB0LmNbc2kgKyAxXS5zaGlmdCArPSBkaXN0IC8gbnI7XG4gICAgICB0LmNbaV0uc2hpZnQgLT0gZGlzdCAvIG5yO1xuICAgICAgdC5jW2ldLmNoYW5nZSAtPSBkaXN0IC0gZGlzdCAvIG5yO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGFkZENoaWxkU3BhY2luZyh0KSB7XG4gICAgdmFyIGQgPSAwO1xuICAgIHZhciBtb2RzdW1kZWx0YSA9IDA7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHQuY3M7IGkrKykge1xuICAgICAgZCArPSB0LmNbaV0uc2hpZnQ7XG4gICAgICBtb2RzdW1kZWx0YSArPSBkICsgdC5jW2ldLmNoYW5nZTtcbiAgICAgIHQuY1tpXS5tb2QgKz0gbW9kc3VtZGVsdGE7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlSVlMKGxvdywgaW5kZXgsIGloKSB7XG4gICAgd2hpbGUgKGloICE9PSBudWxsICYmIGxvdyA+PSBpaC5sb3cpIHtcbiAgICAgIGloID0gaWgubnh0O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBsb3c6IGxvdyxcbiAgICAgIGluZGV4OiBpbmRleCxcbiAgICAgIG54dDogaWhcbiAgICB9O1xuICB9IC8vIGRvIGxheW91dFxuXG5cbiAgbGF5ZXIocm9vdCwgaXNIb3Jpem9udGFsKTtcbiAgdmFyIHd0ID0gV3JhcHBlZFRyZWUuZnJvbU5vZGUocm9vdCwgaXNIb3Jpem9udGFsKTtcbiAgZmlyc3RXYWxrKHd0KTtcbiAgc2Vjb25kV2Fsayh3dCwgMCk7XG4gIGNvbnZlcnRCYWNrKHd0LCByb290LCBpc0hvcml6b250YWwpO1xuICBub3JtYWxpemUocm9vdCwgaXNIb3Jpem9udGFsKTtcbiAgcmV0dXJuIHJvb3Q7XG59O1xuXG4vKioqLyB9KSxcbi8qIDExNCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5mdW5jdGlvbiBfaW5oZXJpdHNMb29zZShzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MucHJvdG90eXBlKTsgc3ViQ2xhc3MucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gc3ViQ2xhc3M7IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7IH1cblxudmFyIFRyZWVMYXlvdXQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDExKTtcblxudmFyIGRlbmRyb2dyYW0gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDExNSk7XG5cbnZhciBkb1RyZWVMYXlvdXQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE3KTtcblxudmFyIHV0aWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcpO1xuXG52YXIgRGVuZHJvZ3JhbUxheW91dCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1RyZWVMYXlvdXQpIHtcbiAgX2luaGVyaXRzTG9vc2UoRGVuZHJvZ3JhbUxheW91dCwgX1RyZWVMYXlvdXQpO1xuXG4gIGZ1bmN0aW9uIERlbmRyb2dyYW1MYXlvdXQoKSB7XG4gICAgcmV0dXJuIF9UcmVlTGF5b3V0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBEZW5kcm9ncmFtTGF5b3V0LnByb3RvdHlwZTtcblxuICBfcHJvdG8uZXhlY3V0ZSA9IGZ1bmN0aW9uIGV4ZWN1dGUoKSB7XG4gICAgdmFyIG1lID0gdGhpcztcbiAgICBtZS5yb290Tm9kZS53aWR0aCA9IDA7XG4gICAgcmV0dXJuIGRvVHJlZUxheW91dChtZS5yb290Tm9kZSwgbWUub3B0aW9ucywgZGVuZHJvZ3JhbSk7XG4gIH07XG5cbiAgcmV0dXJuIERlbmRyb2dyYW1MYXlvdXQ7XG59KFRyZWVMYXlvdXQpO1xuXG52YXIgREVGQVVMVF9PUFRJT05TID0ge307XG5cbmZ1bmN0aW9uIGRlbmRyb2dyYW1MYXlvdXQocm9vdCwgb3B0aW9ucykge1xuICBvcHRpb25zID0gdXRpbC5hc3NpZ24oe30sIERFRkFVTFRfT1BUSU9OUywgb3B0aW9ucyk7XG4gIHJldHVybiBuZXcgRGVuZHJvZ3JhbUxheW91dChyb290LCBvcHRpb25zKS5leGVjdXRlKCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZGVuZHJvZ3JhbUxheW91dDtcblxuLyoqKi8gfSksXG4vKiAxMTUgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuLy8gd3JhcCB0cmVlIG5vZGVcbi8vIFRPRE8gY29uc2lkZXJpbmcgc2l6ZVxudmFyIHV0aWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcpO1xuXG5mdW5jdGlvbiBXcmFwcGVkVHJlZShoZWlnaHQsIGNoaWxkcmVuKSB7XG4gIGlmIChoZWlnaHQgPT09IHZvaWQgMCkge1xuICAgIGhlaWdodCA9IDA7XG4gIH1cblxuICBpZiAoY2hpbGRyZW4gPT09IHZvaWQgMCkge1xuICAgIGNoaWxkcmVuID0gW107XG4gIH1cblxuICB2YXIgbWUgPSB0aGlzO1xuICBtZS54ID0gbWUueSA9IDA7XG4gIG1lLmxlZnRDaGlsZCA9IG1lLnJpZ2h0Q2hpbGQgPSBudWxsO1xuICBtZS5oZWlnaHQgPSAwO1xuICBtZS5jaGlsZHJlbiA9IGNoaWxkcmVuO1xufVxuXG52YXIgREVGQVVMVF9PUFRJT05TID0ge1xuICBpc0hvcml6b250YWw6IHRydWUsXG4gIG5vZGVTZXA6IDIwLFxuICBub2RlU2l6ZTogMjAsXG4gIHJhbmtTZXA6IDIwMCxcbiAgc3ViVHJlZVNlcDogMTBcbn07XG5cbmZ1bmN0aW9uIGNvbnZlcnRCYWNrKGNvbnZlcnRlZFxuLyogV3JhcHBlZFRyZWUgKi9cbiwgcm9vdFxuLyogVHJlZU5vZGUgKi9cbiwgaXNIb3Jpem9udGFsKSB7XG4gIGlmIChpc0hvcml6b250YWwpIHtcbiAgICByb290LnggPSBjb252ZXJ0ZWQueDtcbiAgICByb290LnkgPSBjb252ZXJ0ZWQueTtcbiAgfSBlbHNlIHtcbiAgICByb290LnggPSBjb252ZXJ0ZWQueTtcbiAgICByb290LnkgPSBjb252ZXJ0ZWQueDtcbiAgfVxuXG4gIGNvbnZlcnRlZC5jaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChjaGlsZCwgaSkge1xuICAgIGNvbnZlcnRCYWNrKGNoaWxkLCByb290LmNoaWxkcmVuW2ldLCBpc0hvcml6b250YWwpO1xuICB9KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAocm9vdCwgb3B0aW9ucykge1xuICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG5cbiAgb3B0aW9ucyA9IHV0aWwuYXNzaWduKHt9LCBERUZBVUxUX09QVElPTlMsIG9wdGlvbnMpO1xuICB2YXIgbWF4RGVwdGggPSAwO1xuXG4gIGZ1bmN0aW9uIHdyYXBwZWRUcmVlRnJvbU5vZGUobikge1xuICAgIGlmICghbikgcmV0dXJuIG51bGw7XG4gICAgbi53aWR0aCA9IDA7XG5cbiAgICBpZiAobi5kZXB0aCAmJiBuLmRlcHRoID4gbWF4RGVwdGgpIHtcbiAgICAgIG1heERlcHRoID0gbi5kZXB0aDsgLy8gZ2V0IHRoZSBtYXggZGVwdGhcbiAgICB9XG5cbiAgICB2YXIgY2hpbGRyZW4gPSBuLmNoaWxkcmVuO1xuICAgIHZhciBjaGlsZHJlbkNvdW50ID0gY2hpbGRyZW4ubGVuZ3RoO1xuICAgIHZhciB0ID0gbmV3IFdyYXBwZWRUcmVlKG4uaGVpZ2h0LCBbXSk7XG4gICAgY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbiAoY2hpbGQsIGkpIHtcbiAgICAgIHZhciBjaGlsZFdUID0gd3JhcHBlZFRyZWVGcm9tTm9kZShjaGlsZCk7XG4gICAgICB0LmNoaWxkcmVuLnB1c2goY2hpbGRXVCk7XG5cbiAgICAgIGlmIChpID09PSAwKSB7XG4gICAgICAgIC8vIHQubGVmdENoaWxkID0gY2hpbGRXVC5sZWZ0Q2hpbGQgPyBjaGlsZFdULmxlZnRDaGlsZCA6IGNoaWxkV1RcbiAgICAgICAgdC5sZWZ0Q2hpbGQgPSBjaGlsZFdUO1xuICAgICAgfVxuXG4gICAgICBpZiAoaSA9PT0gY2hpbGRyZW5Db3VudCAtIDEpIHtcbiAgICAgICAgLy8gdC5yaWdodENoaWxkID0gY2hpbGRXVC5yaWdodENoaWxkID8gY2hpbGRXVC5yaWdodENoaWxkIDogY2hpbGRXVFxuICAgICAgICB0LnJpZ2h0Q2hpbGQgPSBjaGlsZFdUO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHQub3JpZ2luTm9kZSA9IG47XG4gICAgdC5pc0xlYWYgPSBuLmlzTGVhZigpO1xuICAgIHJldHVybiB0O1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0RHJhd2luZ0RlcHRoKHQpIHtcbiAgICBpZiAodC5pc0xlYWYgfHwgdC5jaGlsZHJlbi5sZW5ndGggPT09IDApIHtcbiAgICAgIHQuZHJhd2luZ0RlcHRoID0gbWF4RGVwdGg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBkZXB0aHMgPSB0LmNoaWxkcmVuLm1hcChmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgcmV0dXJuIGdldERyYXdpbmdEZXB0aChjaGlsZCk7XG4gICAgICB9KTtcbiAgICAgIHZhciBtaW5DaGlsZERlcHRoID0gTWF0aC5taW4uYXBwbHkobnVsbCwgZGVwdGhzKTtcbiAgICAgIHQuZHJhd2luZ0RlcHRoID0gbWluQ2hpbGREZXB0aCAtIDE7XG4gICAgfVxuXG4gICAgcmV0dXJuIHQuZHJhd2luZ0RlcHRoO1xuICB9XG5cbiAgdmFyIHByZXZMZWFmO1xuXG4gIGZ1bmN0aW9uIHBvc2l0aW9uKHQpIHtcbiAgICB0LnggPSB0LmRyYXdpbmdEZXB0aCAqIG9wdGlvbnMucmFua1NlcDtcblxuICAgIGlmICh0LmlzTGVhZikge1xuICAgICAgdC55ID0gMDtcblxuICAgICAgaWYgKHByZXZMZWFmKSB7XG4gICAgICAgIHQueSA9IHByZXZMZWFmLnkgKyBwcmV2TGVhZi5oZWlnaHQgKyBvcHRpb25zLm5vZGVTZXA7XG5cbiAgICAgICAgaWYgKHQub3JpZ2luTm9kZS5wYXJlbnQgIT09IHByZXZMZWFmLm9yaWdpbk5vZGUucGFyZW50KSB7XG4gICAgICAgICAgdC55ICs9IG9wdGlvbnMuc3ViVHJlZVNlcDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBwcmV2TGVhZiA9IHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHQuY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgcG9zaXRpb24oY2hpbGQpO1xuICAgICAgfSk7XG4gICAgICB0LnkgPSAodC5sZWZ0Q2hpbGQueSArIHQucmlnaHRDaGlsZC55KSAvIDI7XG4gICAgfVxuICB9IC8vIHdyYXAgbm9kZVxuXG5cbiAgdmFyIHd0ID0gd3JhcHBlZFRyZWVGcm9tTm9kZShyb290KTsgLy8gZ2V0IGRlcHRoIGZvciBkcmF3aW5nXG5cbiAgZ2V0RHJhd2luZ0RlcHRoKHd0KTsgLy8gZ2V0IHBvc2l0aW9uXG5cbiAgcG9zaXRpb24od3QpOyAvLyBnZXQgeCwgeVxuXG4gIGNvbnZlcnRCYWNrKHd0LCByb290LCBvcHRpb25zLmlzSG9yaXpvbnRhbCk7XG4gIHJldHVybiByb290O1xufTtcblxuLyoqKi8gfSksXG4vKiAxMTYgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuZnVuY3Rpb24gX2luaGVyaXRzTG9vc2Uoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzLnByb3RvdHlwZSk7IHN1YkNsYXNzLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IHN1YkNsYXNzOyBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG5cbnZhciBUcmVlTGF5b3V0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMSk7XG5cbnZhciBpbmRlbnRlZFRyZWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDExNyk7XG5cbnZhciBzZXBhcmF0ZVRyZWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMwKTtcblxudmFyIHV0aWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcpO1xuXG52YXIgVkFMSURfRElSRUNUSU9OUyA9IFsnTFInLCAvLyBsZWZ0IHRvIHJpZ2h0XG4nUkwnLCAvLyByaWdodCB0byBsZWZ0XG4nSCcgLy8gaG9yaXpvbnRhbFxuXTtcbnZhciBERUZBVUxUX0RJUkVDVElPTiA9IFZBTElEX0RJUkVDVElPTlNbMF07XG5cbnZhciBJbmRlbnRlZExheW91dCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1RyZWVMYXlvdXQpIHtcbiAgX2luaGVyaXRzTG9vc2UoSW5kZW50ZWRMYXlvdXQsIF9UcmVlTGF5b3V0KTtcblxuICBmdW5jdGlvbiBJbmRlbnRlZExheW91dCgpIHtcbiAgICByZXR1cm4gX1RyZWVMYXlvdXQuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICB9XG5cbiAgdmFyIF9wcm90byA9IEluZGVudGVkTGF5b3V0LnByb3RvdHlwZTtcblxuICBfcHJvdG8uZXhlY3V0ZSA9IGZ1bmN0aW9uIGV4ZWN1dGUoKSB7XG4gICAgdmFyIG1lID0gdGhpcztcbiAgICB2YXIgb3B0aW9ucyA9IG1lLm9wdGlvbnM7XG4gICAgdmFyIHJvb3QgPSBtZS5yb290Tm9kZTtcbiAgICBvcHRpb25zLmlzSG9yaXpvbnRhbCA9IHRydWU7IC8vIGRlZmF1bHQgaW5kZW50IDIwIGFuZCBzaW5rIGZpcnN0IGNoaWxkcmVuO1xuXG4gICAgdmFyIF9vcHRpb25zJGluZGVudCA9IG9wdGlvbnMuaW5kZW50LFxuICAgICAgICBpbmRlbnQgPSBfb3B0aW9ucyRpbmRlbnQgPT09IHZvaWQgMCA/IDIwIDogX29wdGlvbnMkaW5kZW50LFxuICAgICAgICBfb3B0aW9ucyRkcm9wQ2FwID0gb3B0aW9ucy5kcm9wQ2FwLFxuICAgICAgICBkcm9wQ2FwID0gX29wdGlvbnMkZHJvcENhcCA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9vcHRpb25zJGRyb3BDYXA7XG4gICAgdmFyIGRpcmVjdGlvbiA9IG9wdGlvbnMuZGlyZWN0aW9uIHx8IERFRkFVTFRfRElSRUNUSU9OO1xuXG4gICAgaWYgKGRpcmVjdGlvbiAmJiBWQUxJRF9ESVJFQ1RJT05TLmluZGV4T2YoZGlyZWN0aW9uKSA9PT0gLTEpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGRpcmVjdGlvbjogXCIgKyBkaXJlY3Rpb24pO1xuICAgIH1cblxuICAgIGlmIChkaXJlY3Rpb24gPT09IFZBTElEX0RJUkVDVElPTlNbMF0pIHtcbiAgICAgIC8vIExSXG4gICAgICBpbmRlbnRlZFRyZWUocm9vdCwgaW5kZW50LCBkcm9wQ2FwKTtcbiAgICB9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PT0gVkFMSURfRElSRUNUSU9OU1sxXSkge1xuICAgICAgLy8gUkxcbiAgICAgIGluZGVudGVkVHJlZShyb290LCBpbmRlbnQsIGRyb3BDYXApO1xuICAgICAgcm9vdC5yaWdodDJsZWZ0KCk7XG4gICAgfSBlbHNlIGlmIChkaXJlY3Rpb24gPT09IFZBTElEX0RJUkVDVElPTlNbMl0pIHtcbiAgICAgIC8vIEhcbiAgICAgIC8vIHNlcGFyYXRlIGludG8gbGVmdCBhbmQgcmlnaHQgdHJlZXNcbiAgICAgIHZhciBfc2VwYXJhdGVUcmVlID0gc2VwYXJhdGVUcmVlKHJvb3QsIG9wdGlvbnMpLFxuICAgICAgICAgIGxlZnQgPSBfc2VwYXJhdGVUcmVlLmxlZnQsXG4gICAgICAgICAgcmlnaHQgPSBfc2VwYXJhdGVUcmVlLnJpZ2h0O1xuXG4gICAgICBpbmRlbnRlZFRyZWUobGVmdCwgaW5kZW50LCBkcm9wQ2FwKTtcbiAgICAgIGxlZnQucmlnaHQybGVmdCgpO1xuICAgICAgaW5kZW50ZWRUcmVlKHJpZ2h0LCBpbmRlbnQsIGRyb3BDYXApO1xuICAgICAgdmFyIGJib3ggPSBsZWZ0LmdldEJvdW5kaW5nQm94KCk7XG4gICAgICByaWdodC50cmFuc2xhdGUoYmJveC53aWR0aCwgMCk7XG4gICAgICByb290LnggPSByaWdodC54IC0gcm9vdC53aWR0aCAvIDI7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJvb3Q7XG4gIH07XG5cbiAgcmV0dXJuIEluZGVudGVkTGF5b3V0O1xufShUcmVlTGF5b3V0KTtcblxudmFyIERFRkFVTFRfT1BUSU9OUyA9IHt9O1xuXG5mdW5jdGlvbiBpbmRlbnRlZExheW91dChyb290LCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSB1dGlsLmFzc2lnbih7fSwgREVGQVVMVF9PUFRJT05TLCBvcHRpb25zKTtcbiAgcmV0dXJuIG5ldyBJbmRlbnRlZExheW91dChyb290LCBvcHRpb25zKS5leGVjdXRlKCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaW5kZW50ZWRMYXlvdXQ7XG5cbi8qKiovIH0pLFxuLyogMTE3ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbmZ1bmN0aW9uIHBvc2l0aW9uTm9kZShub2RlLCBwcmV2aW91c05vZGUsIGluZGVudCwgZHJvcENhcCkge1xuICAvLyAgY2FjdWxhdGUgdGhlIG5vZGUncyBob3Jpem9udGFsIG9mZnNldCBEWCwgZHgncyB0eXBlIG1pZ2h0IGJlIG51bWJlciBvciBmdW5jdGlvblxuICB2YXIgZGlzcGxhY2VtZW50WCA9IHR5cGVvZiBpbmRlbnQgPT09ICdmdW5jdGlvbicgPyBpbmRlbnQobm9kZSkgOiBpbmRlbnQgKiBub2RlLmRlcHRoO1xuXG4gIGlmICghZHJvcENhcCkge1xuICAgIHRyeSB7XG4gICAgICBpZiAobm9kZS5pZCA9PT0gbm9kZS5wYXJlbnQuY2hpbGRyZW5bMF0uaWQpIHtcbiAgICAgICAgbm9kZS54ICs9IGRpc3BsYWNlbWVudFg7XG4gICAgICAgIG5vZGUueSA9IHByZXZpb3VzTm9kZSA/IHByZXZpb3VzTm9kZS55IDogMDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHsvLyBza2lwIHRvIG5vcm1hbCB3aGVuIGEgbm9kZSBoYXMgbm8gcGFyZW50XG4gICAgfVxuICB9XG5cbiAgbm9kZS54ICs9IGRpc3BsYWNlbWVudFg7XG4gIG5vZGUueSA9IHByZXZpb3VzTm9kZSA/IHByZXZpb3VzTm9kZS55ICsgcHJldmlvdXNOb2RlLmhlaWdodCA6IDA7XG4gIHJldHVybjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAocm9vdCwgaW5kZW50LCBkcm9wQ2FwKSB7XG4gIHZhciBwcmV2aW91c05vZGUgPSBudWxsO1xuICByb290LmVhY2hOb2RlKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgcG9zaXRpb25Ob2RlKG5vZGUsIHByZXZpb3VzTm9kZSwgaW5kZW50LCBkcm9wQ2FwKTtcbiAgICBwcmV2aW91c05vZGUgPSBub2RlO1xuICB9KTtcbn07XG5cbi8qKiovIH0pLFxuLyogMTE4ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cbmZ1bmN0aW9uIF9pbmhlcml0c0xvb3NlKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcy5wcm90b3R5cGUpOyBzdWJDbGFzcy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBzdWJDbGFzczsgc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXG52YXIgVHJlZUxheW91dCA9IF9fd2VicGFja19yZXF1aXJlX18oMTEpO1xuXG52YXIgbWluZG1hcCA9IF9fd2VicGFja19yZXF1aXJlX18oMTE5KTtcblxudmFyIGRvVHJlZUxheW91dCA9IF9fd2VicGFja19yZXF1aXJlX18oMTcpO1xuXG52YXIgdXRpbCA9IF9fd2VicGFja19yZXF1aXJlX18oNyk7XG5cbnZhciBNaW5kbWFwTGF5b3V0ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfVHJlZUxheW91dCkge1xuICBfaW5oZXJpdHNMb29zZShNaW5kbWFwTGF5b3V0LCBfVHJlZUxheW91dCk7XG5cbiAgZnVuY3Rpb24gTWluZG1hcExheW91dCgpIHtcbiAgICByZXR1cm4gX1RyZWVMYXlvdXQuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICB9XG5cbiAgdmFyIF9wcm90byA9IE1pbmRtYXBMYXlvdXQucHJvdG90eXBlO1xuXG4gIF9wcm90by5leGVjdXRlID0gZnVuY3Rpb24gZXhlY3V0ZSgpIHtcbiAgICB2YXIgbWUgPSB0aGlzO1xuICAgIHJldHVybiBkb1RyZWVMYXlvdXQobWUucm9vdE5vZGUsIG1lLm9wdGlvbnMsIG1pbmRtYXApO1xuICB9O1xuXG4gIHJldHVybiBNaW5kbWFwTGF5b3V0O1xufShUcmVlTGF5b3V0KTtcblxudmFyIERFRkFVTFRfT1BUSU9OUyA9IHt9O1xuXG5mdW5jdGlvbiBtaW5kbWFwTGF5b3V0KHJvb3QsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IHV0aWwuYXNzaWduKHt9LCBERUZBVUxUX09QVElPTlMsIG9wdGlvbnMpO1xuICByZXR1cm4gbmV3IE1pbmRtYXBMYXlvdXQocm9vdCwgb3B0aW9ucykuZXhlY3V0ZSgpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG1pbmRtYXBMYXlvdXQ7XG5cbi8qKiovIH0pLFxuLyogMTE5ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cbnZhciB1dGlsID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3KTtcblxuZnVuY3Rpb24gc2Vjb25kV2Fsayhub2RlLCBvcHRpb25zKSB7XG4gIHZhciB0b3RhbEhlaWdodCA9IDA7XG5cbiAgaWYgKCFub2RlLmNoaWxkcmVuLmxlbmd0aCkge1xuICAgIHRvdGFsSGVpZ2h0ID0gbm9kZS5oZWlnaHQ7XG4gIH0gZWxzZSB7XG4gICAgbm9kZS5jaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChjKSB7XG4gICAgICB0b3RhbEhlaWdodCArPSBzZWNvbmRXYWxrKGMsIG9wdGlvbnMpO1xuICAgIH0pO1xuICB9XG5cbiAgbm9kZS5fc3ViVHJlZVNlcCA9IG9wdGlvbnMuZ2V0U3ViVHJlZVNlcChub2RlLmRhdGEpO1xuICBub2RlLnRvdGFsSGVpZ2h0ID0gTWF0aC5tYXgobm9kZS5oZWlnaHQsIHRvdGFsSGVpZ2h0KSArIDIgKiBub2RlLl9zdWJUcmVlU2VwO1xuICByZXR1cm4gbm9kZS50b3RhbEhlaWdodDtcbn1cblxuZnVuY3Rpb24gdGhpcmRXYWxrKG5vZGUpIHtcbiAgdmFyIGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbjtcbiAgdmFyIGxlbiA9IGNoaWxkcmVuLmxlbmd0aDtcblxuICBpZiAobGVuKSB7XG4gICAgY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbiAoYykge1xuICAgICAgdGhpcmRXYWxrKGMpO1xuICAgIH0pO1xuICAgIHZhciBmaXJzdCA9IGNoaWxkcmVuWzBdO1xuICAgIHZhciBsYXN0ID0gY2hpbGRyZW5bbGVuIC0gMV07XG4gICAgdmFyIGNoaWxkcmVuSGVpZ2h0ID0gbGFzdC55IC0gZmlyc3QueSArIGxhc3QuaGVpZ2h0O1xuICAgIHZhciBjaGlsZHJlblRvdGFsSGVpZ2h0ID0gMDtcbiAgICBjaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgY2hpbGRyZW5Ub3RhbEhlaWdodCArPSBjaGlsZC50b3RhbEhlaWdodDtcbiAgICB9KTtcblxuICAgIGlmIChjaGlsZHJlbkhlaWdodCA+IG5vZGUuaGVpZ2h0KSB7XG4gICAgICAvLyDlvZPlrZDoioLngrnmgLvpq5jluqblpKfkuo7niLboioLngrnpq5jluqZcbiAgICAgIG5vZGUueSA9IGZpcnN0LnkgKyBjaGlsZHJlbkhlaWdodCAvIDIgLSBub2RlLmhlaWdodCAvIDI7XG4gICAgfSBlbHNlIGlmIChjaGlsZHJlbi5sZW5ndGggIT09IDEgfHwgbm9kZS5oZWlnaHQgPiBjaGlsZHJlblRvdGFsSGVpZ2h0KSB7XG4gICAgICAvLyDlpJrkuo7kuIDkuKrlrZDoioLngrnmiJbogIXniLboioLngrnlpKfkuo7miYDmnInlrZDoioLngrnnmoTmgLvpq5jluqZcbiAgICAgIHZhciBvZmZzZXQgPSBub2RlLnkgKyAobm9kZS5oZWlnaHQgLSBjaGlsZHJlbkhlaWdodCkgLyAyIC0gZmlyc3QueTtcbiAgICAgIGNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24gKGMpIHtcbiAgICAgICAgYy50cmFuc2xhdGUoMCwgb2Zmc2V0KTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyDlj6rmnInkuIDkuKrlrZDoioLngrlcbiAgICAgIG5vZGUueSA9IChmaXJzdC55ICsgZmlyc3QuaGVpZ2h0IC8gMiArIGxhc3QueSArIGxhc3QuaGVpZ2h0IC8gMikgLyAyIC0gbm9kZS5oZWlnaHQgLyAyO1xuICAgIH1cbiAgfVxufVxuXG52YXIgREVGQVVMVF9PUFRJT05TID0ge1xuICBnZXRTdWJUcmVlU2VwOiBmdW5jdGlvbiBnZXRTdWJUcmVlU2VwKCkge1xuICAgIHJldHVybiAwO1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChyb290LCBvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cblxuICBvcHRpb25zID0gdXRpbC5hc3NpZ24oe30sIERFRkFVTFRfT1BUSU9OUywgb3B0aW9ucyk7XG4gIHJvb3QucGFyZW50ID0ge1xuICAgIHg6IDAsXG4gICAgd2lkdGg6IDAsXG4gICAgaGVpZ2h0OiAwLFxuICAgIHk6IDBcbiAgfTsgLy8gZmlyc3Qgd2Fsa1xuXG4gIHJvb3QuQkZUcmF2ZXJzZShmdW5jdGlvbiAobm9kZSkge1xuICAgIG5vZGUueCA9IG5vZGUucGFyZW50LnggKyBub2RlLnBhcmVudC53aWR0aDsgLy8gc2ltcGx5IGdldCB4XG4gIH0pO1xuICByb290LnBhcmVudCA9IG51bGw7IC8vIHNlY29uZCB3YWxrXG5cbiAgc2Vjb25kV2Fsayhyb290LCBvcHRpb25zKTsgLy8gYXNzaWduIHN1YiB0cmVlIHRvdGFsSGVpZ2h0XG4gIC8vIGFkanVzdGluZ1xuICAvLyBzZXBhcmF0aW5nIG5vZGVzXG5cbiAgcm9vdC5zdGFydFkgPSAwO1xuICByb290LnkgPSByb290LnRvdGFsSGVpZ2h0IC8gMiAtIHJvb3QuaGVpZ2h0IC8gMjtcbiAgcm9vdC5lYWNoTm9kZShmdW5jdGlvbiAobm9kZSkge1xuICAgIHZhciBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW47XG4gICAgdmFyIGxlbiA9IGNoaWxkcmVuLmxlbmd0aDtcblxuICAgIGlmIChsZW4pIHtcbiAgICAgIHZhciBmaXJzdCA9IGNoaWxkcmVuWzBdO1xuICAgICAgZmlyc3Quc3RhcnRZID0gbm9kZS5zdGFydFkgKyBub2RlLl9zdWJUcmVlU2VwO1xuXG4gICAgICBpZiAobGVuID09PSAxKSB7XG4gICAgICAgIGZpcnN0LnkgPSBub2RlLnkgKyBub2RlLmhlaWdodCAvIDIgLSBmaXJzdC5oZWlnaHQgLyAyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZmlyc3QueSA9IGZpcnN0LnN0YXJ0WSArIGZpcnN0LnRvdGFsSGVpZ2h0IC8gMiAtIGZpcnN0LmhlaWdodCAvIDI7XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgIHZhciBjID0gY2hpbGRyZW5baV07XG4gICAgICAgICAgYy5zdGFydFkgPSBjaGlsZHJlbltpIC0gMV0uc3RhcnRZICsgY2hpbGRyZW5baSAtIDFdLnRvdGFsSGVpZ2h0O1xuICAgICAgICAgIGMueSA9IGMuc3RhcnRZICsgYy50b3RhbEhlaWdodCAvIDIgLSBjLmhlaWdodCAvIDI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0pOyAvLyB0aGlyZCB3YWxrXG5cbiAgdGhpcmRXYWxrKHJvb3QpO1xufTtcblxuLyoqKi8gfSlcbi8qKioqKiovIF0pO1xufSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1oaWVyYXJjaHkuanMubWFwIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///84\n')},function(module,exports,__webpack_require__){"use strict";eval("\n\nvar colorString = __webpack_require__(314);\nvar convert = __webpack_require__(318);\n\nvar _slice = [].slice;\n\nvar skippedModels = [\n\t// to be honest, I don't really feel like keyword belongs in color convert, but eh.\n\t'keyword',\n\n\t// gray conflicts with some method names, and has its own method defined.\n\t'gray',\n\n\t// shouldn't really be in color-convert either...\n\t'hex'\n];\n\nvar hashedModelKeys = {};\nObject.keys(convert).forEach(function (model) {\n\thashedModelKeys[_slice.call(convert[model].labels).sort().join('')] = model;\n});\n\nvar limiters = {};\n\nfunction Color(obj, model) {\n\tif (!(this instanceof Color)) {\n\t\treturn new Color(obj, model);\n\t}\n\n\tif (model && model in skippedModels) {\n\t\tmodel = null;\n\t}\n\n\tif (model && !(model in convert)) {\n\t\tthrow new Error('Unknown model: ' + model);\n\t}\n\n\tvar i;\n\tvar channels;\n\n\tif (obj == null) { // eslint-disable-line no-eq-null,eqeqeq\n\t\tthis.model = 'rgb';\n\t\tthis.color = [0, 0, 0];\n\t\tthis.valpha = 1;\n\t} else if (obj instanceof Color) {\n\t\tthis.model = obj.model;\n\t\tthis.color = obj.color.slice();\n\t\tthis.valpha = obj.valpha;\n\t} else if (typeof obj === 'string') {\n\t\tvar result = colorString.get(obj);\n\t\tif (result === null) {\n\t\t\tthrow new Error('Unable to parse color from string: ' + obj);\n\t\t}\n\n\t\tthis.model = result.model;\n\t\tchannels = convert[this.model].channels;\n\t\tthis.color = result.value.slice(0, channels);\n\t\tthis.valpha = typeof result.value[channels] === 'number' ? result.value[channels] : 1;\n\t} else if (obj.length) {\n\t\tthis.model = model || 'rgb';\n\t\tchannels = convert[this.model].channels;\n\t\tvar newArr = _slice.call(obj, 0, channels);\n\t\tthis.color = zeroArray(newArr, channels);\n\t\tthis.valpha = typeof obj[channels] === 'number' ? obj[channels] : 1;\n\t} else if (typeof obj === 'number') {\n\t\t// this is always RGB - can be converted later on.\n\t\tobj &= 0xFFFFFF;\n\t\tthis.model = 'rgb';\n\t\tthis.color = [\n\t\t\t(obj >> 16) & 0xFF,\n\t\t\t(obj >> 8) & 0xFF,\n\t\t\tobj & 0xFF\n\t\t];\n\t\tthis.valpha = 1;\n\t} else {\n\t\tthis.valpha = 1;\n\n\t\tvar keys = Object.keys(obj);\n\t\tif ('alpha' in obj) {\n\t\t\tkeys.splice(keys.indexOf('alpha'), 1);\n\t\t\tthis.valpha = typeof obj.alpha === 'number' ? obj.alpha : 0;\n\t\t}\n\n\t\tvar hashedKeys = keys.sort().join('');\n\t\tif (!(hashedKeys in hashedModelKeys)) {\n\t\t\tthrow new Error('Unable to parse color from object: ' + JSON.stringify(obj));\n\t\t}\n\n\t\tthis.model = hashedModelKeys[hashedKeys];\n\n\t\tvar labels = convert[this.model].labels;\n\t\tvar color = [];\n\t\tfor (i = 0; i < labels.length; i++) {\n\t\t\tcolor.push(obj[labels[i]]);\n\t\t}\n\n\t\tthis.color = zeroArray(color);\n\t}\n\n\t// perform limitations (clamping, etc.)\n\tif (limiters[this.model]) {\n\t\tchannels = convert[this.model].channels;\n\t\tfor (i = 0; i < channels; i++) {\n\t\t\tvar limit = limiters[this.model][i];\n\t\t\tif (limit) {\n\t\t\t\tthis.color[i] = limit(this.color[i]);\n\t\t\t}\n\t\t}\n\t}\n\n\tthis.valpha = Math.max(0, Math.min(1, this.valpha));\n\n\tif (Object.freeze) {\n\t\tObject.freeze(this);\n\t}\n}\n\nColor.prototype = {\n\ttoString: function () {\n\t\treturn this.string();\n\t},\n\n\ttoJSON: function () {\n\t\treturn this[this.model]();\n\t},\n\n\tstring: function (places) {\n\t\tvar self = this.model in colorString.to ? this : this.rgb();\n\t\tself = self.round(typeof places === 'number' ? places : 1);\n\t\tvar args = self.valpha === 1 ? self.color : self.color.concat(this.valpha);\n\t\treturn colorString.to[self.model](args);\n\t},\n\n\tpercentString: function (places) {\n\t\tvar self = this.rgb().round(typeof places === 'number' ? places : 1);\n\t\tvar args = self.valpha === 1 ? self.color : self.color.concat(this.valpha);\n\t\treturn colorString.to.rgb.percent(args);\n\t},\n\n\tarray: function () {\n\t\treturn this.valpha === 1 ? this.color.slice() : this.color.concat(this.valpha);\n\t},\n\n\tobject: function () {\n\t\tvar result = {};\n\t\tvar channels = convert[this.model].channels;\n\t\tvar labels = convert[this.model].labels;\n\n\t\tfor (var i = 0; i < channels; i++) {\n\t\t\tresult[labels[i]] = this.color[i];\n\t\t}\n\n\t\tif (this.valpha !== 1) {\n\t\t\tresult.alpha = this.valpha;\n\t\t}\n\n\t\treturn result;\n\t},\n\n\tunitArray: function () {\n\t\tvar rgb = this.rgb().color;\n\t\trgb[0] /= 255;\n\t\trgb[1] /= 255;\n\t\trgb[2] /= 255;\n\n\t\tif (this.valpha !== 1) {\n\t\t\trgb.push(this.valpha);\n\t\t}\n\n\t\treturn rgb;\n\t},\n\n\tunitObject: function () {\n\t\tvar rgb = this.rgb().object();\n\t\trgb.r /= 255;\n\t\trgb.g /= 255;\n\t\trgb.b /= 255;\n\n\t\tif (this.valpha !== 1) {\n\t\t\trgb.alpha = this.valpha;\n\t\t}\n\n\t\treturn rgb;\n\t},\n\n\tround: function (places) {\n\t\tplaces = Math.max(places || 0, 0);\n\t\treturn new Color(this.color.map(roundToPlace(places)).concat(this.valpha), this.model);\n\t},\n\n\talpha: function (val) {\n\t\tif (arguments.length) {\n\t\t\treturn new Color(this.color.concat(Math.max(0, Math.min(1, val))), this.model);\n\t\t}\n\n\t\treturn this.valpha;\n\t},\n\n\t// rgb\n\tred: getset('rgb', 0, maxfn(255)),\n\tgreen: getset('rgb', 1, maxfn(255)),\n\tblue: getset('rgb', 2, maxfn(255)),\n\n\thue: getset(['hsl', 'hsv', 'hsl', 'hwb', 'hcg'], 0, function (val) { return ((val % 360) + 360) % 360; }), // eslint-disable-line brace-style\n\n\tsaturationl: getset('hsl', 1, maxfn(100)),\n\tlightness: getset('hsl', 2, maxfn(100)),\n\n\tsaturationv: getset('hsv', 1, maxfn(100)),\n\tvalue: getset('hsv', 2, maxfn(100)),\n\n\tchroma: getset('hcg', 1, maxfn(100)),\n\tgray: getset('hcg', 2, maxfn(100)),\n\n\twhite: getset('hwb', 1, maxfn(100)),\n\twblack: getset('hwb', 2, maxfn(100)),\n\n\tcyan: getset('cmyk', 0, maxfn(100)),\n\tmagenta: getset('cmyk', 1, maxfn(100)),\n\tyellow: getset('cmyk', 2, maxfn(100)),\n\tblack: getset('cmyk', 3, maxfn(100)),\n\n\tx: getset('xyz', 0, maxfn(100)),\n\ty: getset('xyz', 1, maxfn(100)),\n\tz: getset('xyz', 2, maxfn(100)),\n\n\tl: getset('lab', 0, maxfn(100)),\n\ta: getset('lab', 1),\n\tb: getset('lab', 2),\n\n\tkeyword: function (val) {\n\t\tif (arguments.length) {\n\t\t\treturn new Color(val);\n\t\t}\n\n\t\treturn convert[this.model].keyword(this.color);\n\t},\n\n\thex: function (val) {\n\t\tif (arguments.length) {\n\t\t\treturn new Color(val);\n\t\t}\n\n\t\treturn colorString.to.hex(this.rgb().round().color);\n\t},\n\n\trgbNumber: function () {\n\t\tvar rgb = this.rgb().color;\n\t\treturn ((rgb[0] & 0xFF) << 16) | ((rgb[1] & 0xFF) << 8) | (rgb[2] & 0xFF);\n\t},\n\n\tluminosity: function () {\n\t\t// http://www.w3.org/TR/WCAG20/#relativeluminancedef\n\t\tvar rgb = this.rgb().color;\n\n\t\tvar lum = [];\n\t\tfor (var i = 0; i < rgb.length; i++) {\n\t\t\tvar chan = rgb[i] / 255;\n\t\t\tlum[i] = (chan <= 0.03928) ? chan / 12.92 : Math.pow(((chan + 0.055) / 1.055), 2.4);\n\t\t}\n\n\t\treturn 0.2126 * lum[0] + 0.7152 * lum[1] + 0.0722 * lum[2];\n\t},\n\n\tcontrast: function (color2) {\n\t\t// http://www.w3.org/TR/WCAG20/#contrast-ratiodef\n\t\tvar lum1 = this.luminosity();\n\t\tvar lum2 = color2.luminosity();\n\n\t\tif (lum1 > lum2) {\n\t\t\treturn (lum1 + 0.05) / (lum2 + 0.05);\n\t\t}\n\n\t\treturn (lum2 + 0.05) / (lum1 + 0.05);\n\t},\n\n\tlevel: function (color2) {\n\t\tvar contrastRatio = this.contrast(color2);\n\t\tif (contrastRatio >= 7.1) {\n\t\t\treturn 'AAA';\n\t\t}\n\n\t\treturn (contrastRatio >= 4.5) ? 'AA' : '';\n\t},\n\n\tisDark: function () {\n\t\t// YIQ equation from http://24ways.org/2010/calculating-color-contrast\n\t\tvar rgb = this.rgb().color;\n\t\tvar yiq = (rgb[0] * 299 + rgb[1] * 587 + rgb[2] * 114) / 1000;\n\t\treturn yiq < 128;\n\t},\n\n\tisLight: function () {\n\t\treturn !this.isDark();\n\t},\n\n\tnegate: function () {\n\t\tvar rgb = this.rgb();\n\t\tfor (var i = 0; i < 3; i++) {\n\t\t\trgb.color[i] = 255 - rgb.color[i];\n\t\t}\n\t\treturn rgb;\n\t},\n\n\tlighten: function (ratio) {\n\t\tvar hsl = this.hsl();\n\t\thsl.color[2] += hsl.color[2] * ratio;\n\t\treturn hsl;\n\t},\n\n\tdarken: function (ratio) {\n\t\tvar hsl = this.hsl();\n\t\thsl.color[2] -= hsl.color[2] * ratio;\n\t\treturn hsl;\n\t},\n\n\tsaturate: function (ratio) {\n\t\tvar hsl = this.hsl();\n\t\thsl.color[1] += hsl.color[1] * ratio;\n\t\treturn hsl;\n\t},\n\n\tdesaturate: function (ratio) {\n\t\tvar hsl = this.hsl();\n\t\thsl.color[1] -= hsl.color[1] * ratio;\n\t\treturn hsl;\n\t},\n\n\twhiten: function (ratio) {\n\t\tvar hwb = this.hwb();\n\t\thwb.color[1] += hwb.color[1] * ratio;\n\t\treturn hwb;\n\t},\n\n\tblacken: function (ratio) {\n\t\tvar hwb = this.hwb();\n\t\thwb.color[2] += hwb.color[2] * ratio;\n\t\treturn hwb;\n\t},\n\n\tgrayscale: function () {\n\t\t// http://en.wikipedia.org/wiki/Grayscale#Converting_color_to_grayscale\n\t\tvar rgb = this.rgb().color;\n\t\tvar val = rgb[0] * 0.3 + rgb[1] * 0.59 + rgb[2] * 0.11;\n\t\treturn Color.rgb(val, val, val);\n\t},\n\n\tfade: function (ratio) {\n\t\treturn this.alpha(this.valpha - (this.valpha * ratio));\n\t},\n\n\topaquer: function (ratio) {\n\t\treturn this.alpha(this.valpha + (this.valpha * ratio));\n\t},\n\n\trotate: function (degrees) {\n\t\tvar hsl = this.hsl();\n\t\tvar hue = hsl.color[0];\n\t\thue = (hue + degrees) % 360;\n\t\thue = hue < 0 ? 360 + hue : hue;\n\t\thsl.color[0] = hue;\n\t\treturn hsl;\n\t},\n\n\tmix: function (mixinColor, weight) {\n\t\t// ported from sass implementation in C\n\t\t// https://github.com/sass/libsass/blob/0e6b4a2850092356aa3ece07c6b249f0221caced/functions.cpp#L209\n\t\tif (!mixinColor || !mixinColor.rgb) {\n\t\t\tthrow new Error('Argument to \"mix\" was not a Color instance, but rather an instance of ' + typeof mixinColor);\n\t\t}\n\t\tvar color1 = mixinColor.rgb();\n\t\tvar color2 = this.rgb();\n\t\tvar p = weight === undefined ? 0.5 : weight;\n\n\t\tvar w = 2 * p - 1;\n\t\tvar a = color1.alpha() - color2.alpha();\n\n\t\tvar w1 = (((w * a === -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0;\n\t\tvar w2 = 1 - w1;\n\n\t\treturn Color.rgb(\n\t\t\t\tw1 * color1.red() + w2 * color2.red(),\n\t\t\t\tw1 * color1.green() + w2 * color2.green(),\n\t\t\t\tw1 * color1.blue() + w2 * color2.blue(),\n\t\t\t\tcolor1.alpha() * p + color2.alpha() * (1 - p));\n\t}\n};\n\n// model conversion methods and static constructors\nObject.keys(convert).forEach(function (model) {\n\tif (skippedModels.indexOf(model) !== -1) {\n\t\treturn;\n\t}\n\n\tvar channels = convert[model].channels;\n\n\t// conversion methods\n\tColor.prototype[model] = function () {\n\t\tif (this.model === model) {\n\t\t\treturn new Color(this);\n\t\t}\n\n\t\tif (arguments.length) {\n\t\t\treturn new Color(arguments, model);\n\t\t}\n\n\t\tvar newAlpha = typeof arguments[channels] === 'number' ? channels : this.valpha;\n\t\treturn new Color(assertArray(convert[this.model][model].raw(this.color)).concat(newAlpha), model);\n\t};\n\n\t// 'static' construction methods\n\tColor[model] = function (color) {\n\t\tif (typeof color === 'number') {\n\t\t\tcolor = zeroArray(_slice.call(arguments), channels);\n\t\t}\n\t\treturn new Color(color, model);\n\t};\n});\n\nfunction roundTo(num, places) {\n\treturn Number(num.toFixed(places));\n}\n\nfunction roundToPlace(places) {\n\treturn function (num) {\n\t\treturn roundTo(num, places);\n\t};\n}\n\nfunction getset(model, channel, modifier) {\n\tmodel = Array.isArray(model) ? model : [model];\n\n\tmodel.forEach(function (m) {\n\t\t(limiters[m] || (limiters[m] = []))[channel] = modifier;\n\t});\n\n\tmodel = model[0];\n\n\treturn function (val) {\n\t\tvar result;\n\n\t\tif (arguments.length) {\n\t\t\tif (modifier) {\n\t\t\t\tval = modifier(val);\n\t\t\t}\n\n\t\t\tresult = this[model]();\n\t\t\tresult.color[channel] = val;\n\t\t\treturn result;\n\t\t}\n\n\t\tresult = this[model]().color[channel];\n\t\tif (modifier) {\n\t\t\tresult = modifier(result);\n\t\t}\n\n\t\treturn result;\n\t};\n}\n\nfunction maxfn(max) {\n\treturn function (v) {\n\t\treturn Math.max(0, Math.min(max, v));\n\t};\n}\n\nfunction assertArray(val) {\n\treturn Array.isArray(val) ? val : [val];\n}\n\nfunction zeroArray(arr, length) {\n\tfor (var i = 0; i < length; i++) {\n\t\tif (typeof arr[i] !== 'number') {\n\t\t\tarr[i] = 0;\n\t\t}\n\t}\n\n\treturn arr;\n}\n\nmodule.exports = Color;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29sb3IvaW5kZXguanM/NjkyOSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBYTs7QUFFYixrQkFBa0IsbUJBQU8sQ0FBQyxHQUFjO0FBQ3hDLGNBQWMsbUJBQU8sQ0FBQyxHQUFlOztBQUVyQzs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsbUJBQW1CO0FBQ25CO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsYUFBYSxtQkFBbUI7QUFDaEM7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsY0FBYztBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsaUJBQWlCLGNBQWM7QUFDL0I7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7O0FBRUEscUVBQXFFLGtDQUFrQyxFQUFFOztBQUV6RztBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGlCQUFpQixnQkFBZ0I7QUFDakM7QUFDQTtBQUNBOztBQUVBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQSxpQkFBaUIsT0FBTztBQUN4QjtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxFQUFFOztBQUVGOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZ0JBQWdCLFlBQVk7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSIsImZpbGUiOiI4NS5qcyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxudmFyIGNvbG9yU3RyaW5nID0gcmVxdWlyZSgnY29sb3Itc3RyaW5nJyk7XG52YXIgY29udmVydCA9IHJlcXVpcmUoJ2NvbG9yLWNvbnZlcnQnKTtcblxudmFyIF9zbGljZSA9IFtdLnNsaWNlO1xuXG52YXIgc2tpcHBlZE1vZGVscyA9IFtcblx0Ly8gdG8gYmUgaG9uZXN0LCBJIGRvbid0IHJlYWxseSBmZWVsIGxpa2Uga2V5d29yZCBiZWxvbmdzIGluIGNvbG9yIGNvbnZlcnQsIGJ1dCBlaC5cblx0J2tleXdvcmQnLFxuXG5cdC8vIGdyYXkgY29uZmxpY3RzIHdpdGggc29tZSBtZXRob2QgbmFtZXMsIGFuZCBoYXMgaXRzIG93biBtZXRob2QgZGVmaW5lZC5cblx0J2dyYXknLFxuXG5cdC8vIHNob3VsZG4ndCByZWFsbHkgYmUgaW4gY29sb3ItY29udmVydCBlaXRoZXIuLi5cblx0J2hleCdcbl07XG5cbnZhciBoYXNoZWRNb2RlbEtleXMgPSB7fTtcbk9iamVjdC5rZXlzKGNvbnZlcnQpLmZvckVhY2goZnVuY3Rpb24gKG1vZGVsKSB7XG5cdGhhc2hlZE1vZGVsS2V5c1tfc2xpY2UuY2FsbChjb252ZXJ0W21vZGVsXS5sYWJlbHMpLnNvcnQoKS5qb2luKCcnKV0gPSBtb2RlbDtcbn0pO1xuXG52YXIgbGltaXRlcnMgPSB7fTtcblxuZnVuY3Rpb24gQ29sb3Iob2JqLCBtb2RlbCkge1xuXHRpZiAoISh0aGlzIGluc3RhbmNlb2YgQ29sb3IpKSB7XG5cdFx0cmV0dXJuIG5ldyBDb2xvcihvYmosIG1vZGVsKTtcblx0fVxuXG5cdGlmIChtb2RlbCAmJiBtb2RlbCBpbiBza2lwcGVkTW9kZWxzKSB7XG5cdFx0bW9kZWwgPSBudWxsO1xuXHR9XG5cblx0aWYgKG1vZGVsICYmICEobW9kZWwgaW4gY29udmVydCkpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gbW9kZWw6ICcgKyBtb2RlbCk7XG5cdH1cblxuXHR2YXIgaTtcblx0dmFyIGNoYW5uZWxzO1xuXG5cdGlmIChvYmogPT0gbnVsbCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWVxLW51bGwsZXFlcWVxXG5cdFx0dGhpcy5tb2RlbCA9ICdyZ2InO1xuXHRcdHRoaXMuY29sb3IgPSBbMCwgMCwgMF07XG5cdFx0dGhpcy52YWxwaGEgPSAxO1xuXHR9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIENvbG9yKSB7XG5cdFx0dGhpcy5tb2RlbCA9IG9iai5tb2RlbDtcblx0XHR0aGlzLmNvbG9yID0gb2JqLmNvbG9yLnNsaWNlKCk7XG5cdFx0dGhpcy52YWxwaGEgPSBvYmoudmFscGhhO1xuXHR9IGVsc2UgaWYgKHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSB7XG5cdFx0dmFyIHJlc3VsdCA9IGNvbG9yU3RyaW5nLmdldChvYmopO1xuXHRcdGlmIChyZXN1bHQgPT09IG51bGwpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIHBhcnNlIGNvbG9yIGZyb20gc3RyaW5nOiAnICsgb2JqKTtcblx0XHR9XG5cblx0XHR0aGlzLm1vZGVsID0gcmVzdWx0Lm1vZGVsO1xuXHRcdGNoYW5uZWxzID0gY29udmVydFt0aGlzLm1vZGVsXS5jaGFubmVscztcblx0XHR0aGlzLmNvbG9yID0gcmVzdWx0LnZhbHVlLnNsaWNlKDAsIGNoYW5uZWxzKTtcblx0XHR0aGlzLnZhbHBoYSA9IHR5cGVvZiByZXN1bHQudmFsdWVbY2hhbm5lbHNdID09PSAnbnVtYmVyJyA/IHJlc3VsdC52YWx1ZVtjaGFubmVsc10gOiAxO1xuXHR9IGVsc2UgaWYgKG9iai5sZW5ndGgpIHtcblx0XHR0aGlzLm1vZGVsID0gbW9kZWwgfHwgJ3JnYic7XG5cdFx0Y2hhbm5lbHMgPSBjb252ZXJ0W3RoaXMubW9kZWxdLmNoYW5uZWxzO1xuXHRcdHZhciBuZXdBcnIgPSBfc2xpY2UuY2FsbChvYmosIDAsIGNoYW5uZWxzKTtcblx0XHR0aGlzLmNvbG9yID0gemVyb0FycmF5KG5ld0FyciwgY2hhbm5lbHMpO1xuXHRcdHRoaXMudmFscGhhID0gdHlwZW9mIG9ialtjaGFubmVsc10gPT09ICdudW1iZXInID8gb2JqW2NoYW5uZWxzXSA6IDE7XG5cdH0gZWxzZSBpZiAodHlwZW9mIG9iaiA9PT0gJ251bWJlcicpIHtcblx0XHQvLyB0aGlzIGlzIGFsd2F5cyBSR0IgLSBjYW4gYmUgY29udmVydGVkIGxhdGVyIG9uLlxuXHRcdG9iaiAmPSAweEZGRkZGRjtcblx0XHR0aGlzLm1vZGVsID0gJ3JnYic7XG5cdFx0dGhpcy5jb2xvciA9IFtcblx0XHRcdChvYmogPj4gMTYpICYgMHhGRixcblx0XHRcdChvYmogPj4gOCkgJiAweEZGLFxuXHRcdFx0b2JqICYgMHhGRlxuXHRcdF07XG5cdFx0dGhpcy52YWxwaGEgPSAxO1xuXHR9IGVsc2Uge1xuXHRcdHRoaXMudmFscGhhID0gMTtcblxuXHRcdHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqKTtcblx0XHRpZiAoJ2FscGhhJyBpbiBvYmopIHtcblx0XHRcdGtleXMuc3BsaWNlKGtleXMuaW5kZXhPZignYWxwaGEnKSwgMSk7XG5cdFx0XHR0aGlzLnZhbHBoYSA9IHR5cGVvZiBvYmouYWxwaGEgPT09ICdudW1iZXInID8gb2JqLmFscGhhIDogMDtcblx0XHR9XG5cblx0XHR2YXIgaGFzaGVkS2V5cyA9IGtleXMuc29ydCgpLmpvaW4oJycpO1xuXHRcdGlmICghKGhhc2hlZEtleXMgaW4gaGFzaGVkTW9kZWxLZXlzKSkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gcGFyc2UgY29sb3IgZnJvbSBvYmplY3Q6ICcgKyBKU09OLnN0cmluZ2lmeShvYmopKTtcblx0XHR9XG5cblx0XHR0aGlzLm1vZGVsID0gaGFzaGVkTW9kZWxLZXlzW2hhc2hlZEtleXNdO1xuXG5cdFx0dmFyIGxhYmVscyA9IGNvbnZlcnRbdGhpcy5tb2RlbF0ubGFiZWxzO1xuXHRcdHZhciBjb2xvciA9IFtdO1xuXHRcdGZvciAoaSA9IDA7IGkgPCBsYWJlbHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdGNvbG9yLnB1c2gob2JqW2xhYmVsc1tpXV0pO1xuXHRcdH1cblxuXHRcdHRoaXMuY29sb3IgPSB6ZXJvQXJyYXkoY29sb3IpO1xuXHR9XG5cblx0Ly8gcGVyZm9ybSBsaW1pdGF0aW9ucyAoY2xhbXBpbmcsIGV0Yy4pXG5cdGlmIChsaW1pdGVyc1t0aGlzLm1vZGVsXSkge1xuXHRcdGNoYW5uZWxzID0gY29udmVydFt0aGlzLm1vZGVsXS5jaGFubmVscztcblx0XHRmb3IgKGkgPSAwOyBpIDwgY2hhbm5lbHM7IGkrKykge1xuXHRcdFx0dmFyIGxpbWl0ID0gbGltaXRlcnNbdGhpcy5tb2RlbF1baV07XG5cdFx0XHRpZiAobGltaXQpIHtcblx0XHRcdFx0dGhpcy5jb2xvcltpXSA9IGxpbWl0KHRoaXMuY29sb3JbaV0pO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHRoaXMudmFscGhhID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgdGhpcy52YWxwaGEpKTtcblxuXHRpZiAoT2JqZWN0LmZyZWV6ZSkge1xuXHRcdE9iamVjdC5mcmVlemUodGhpcyk7XG5cdH1cbn1cblxuQ29sb3IucHJvdG90eXBlID0ge1xuXHR0b1N0cmluZzogZnVuY3Rpb24gKCkge1xuXHRcdHJldHVybiB0aGlzLnN0cmluZygpO1xuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCkge1xuXHRcdHJldHVybiB0aGlzW3RoaXMubW9kZWxdKCk7XG5cdH0sXG5cblx0c3RyaW5nOiBmdW5jdGlvbiAocGxhY2VzKSB7XG5cdFx0dmFyIHNlbGYgPSB0aGlzLm1vZGVsIGluIGNvbG9yU3RyaW5nLnRvID8gdGhpcyA6IHRoaXMucmdiKCk7XG5cdFx0c2VsZiA9IHNlbGYucm91bmQodHlwZW9mIHBsYWNlcyA9PT0gJ251bWJlcicgPyBwbGFjZXMgOiAxKTtcblx0XHR2YXIgYXJncyA9IHNlbGYudmFscGhhID09PSAxID8gc2VsZi5jb2xvciA6IHNlbGYuY29sb3IuY29uY2F0KHRoaXMudmFscGhhKTtcblx0XHRyZXR1cm4gY29sb3JTdHJpbmcudG9bc2VsZi5tb2RlbF0oYXJncyk7XG5cdH0sXG5cblx0cGVyY2VudFN0cmluZzogZnVuY3Rpb24gKHBsYWNlcykge1xuXHRcdHZhciBzZWxmID0gdGhpcy5yZ2IoKS5yb3VuZCh0eXBlb2YgcGxhY2VzID09PSAnbnVtYmVyJyA/IHBsYWNlcyA6IDEpO1xuXHRcdHZhciBhcmdzID0gc2VsZi52YWxwaGEgPT09IDEgPyBzZWxmLmNvbG9yIDogc2VsZi5jb2xvci5jb25jYXQodGhpcy52YWxwaGEpO1xuXHRcdHJldHVybiBjb2xvclN0cmluZy50by5yZ2IucGVyY2VudChhcmdzKTtcblx0fSxcblxuXHRhcnJheTogZnVuY3Rpb24gKCkge1xuXHRcdHJldHVybiB0aGlzLnZhbHBoYSA9PT0gMSA/IHRoaXMuY29sb3Iuc2xpY2UoKSA6IHRoaXMuY29sb3IuY29uY2F0KHRoaXMudmFscGhhKTtcblx0fSxcblxuXHRvYmplY3Q6IGZ1bmN0aW9uICgpIHtcblx0XHR2YXIgcmVzdWx0ID0ge307XG5cdFx0dmFyIGNoYW5uZWxzID0gY29udmVydFt0aGlzLm1vZGVsXS5jaGFubmVscztcblx0XHR2YXIgbGFiZWxzID0gY29udmVydFt0aGlzLm1vZGVsXS5sYWJlbHM7XG5cblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGNoYW5uZWxzOyBpKyspIHtcblx0XHRcdHJlc3VsdFtsYWJlbHNbaV1dID0gdGhpcy5jb2xvcltpXTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy52YWxwaGEgIT09IDEpIHtcblx0XHRcdHJlc3VsdC5hbHBoYSA9IHRoaXMudmFscGhhO1xuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH0sXG5cblx0dW5pdEFycmF5OiBmdW5jdGlvbiAoKSB7XG5cdFx0dmFyIHJnYiA9IHRoaXMucmdiKCkuY29sb3I7XG5cdFx0cmdiWzBdIC89IDI1NTtcblx0XHRyZ2JbMV0gLz0gMjU1O1xuXHRcdHJnYlsyXSAvPSAyNTU7XG5cblx0XHRpZiAodGhpcy52YWxwaGEgIT09IDEpIHtcblx0XHRcdHJnYi5wdXNoKHRoaXMudmFscGhhKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmdiO1xuXHR9LFxuXG5cdHVuaXRPYmplY3Q6IGZ1bmN0aW9uICgpIHtcblx0XHR2YXIgcmdiID0gdGhpcy5yZ2IoKS5vYmplY3QoKTtcblx0XHRyZ2IuciAvPSAyNTU7XG5cdFx0cmdiLmcgLz0gMjU1O1xuXHRcdHJnYi5iIC89IDI1NTtcblxuXHRcdGlmICh0aGlzLnZhbHBoYSAhPT0gMSkge1xuXHRcdFx0cmdiLmFscGhhID0gdGhpcy52YWxwaGE7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJnYjtcblx0fSxcblxuXHRyb3VuZDogZnVuY3Rpb24gKHBsYWNlcykge1xuXHRcdHBsYWNlcyA9IE1hdGgubWF4KHBsYWNlcyB8fCAwLCAwKTtcblx0XHRyZXR1cm4gbmV3IENvbG9yKHRoaXMuY29sb3IubWFwKHJvdW5kVG9QbGFjZShwbGFjZXMpKS5jb25jYXQodGhpcy52YWxwaGEpLCB0aGlzLm1vZGVsKTtcblx0fSxcblxuXHRhbHBoYTogZnVuY3Rpb24gKHZhbCkge1xuXHRcdGlmIChhcmd1bWVudHMubGVuZ3RoKSB7XG5cdFx0XHRyZXR1cm4gbmV3IENvbG9yKHRoaXMuY29sb3IuY29uY2F0KE1hdGgubWF4KDAsIE1hdGgubWluKDEsIHZhbCkpKSwgdGhpcy5tb2RlbCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMudmFscGhhO1xuXHR9LFxuXG5cdC8vIHJnYlxuXHRyZWQ6IGdldHNldCgncmdiJywgMCwgbWF4Zm4oMjU1KSksXG5cdGdyZWVuOiBnZXRzZXQoJ3JnYicsIDEsIG1heGZuKDI1NSkpLFxuXHRibHVlOiBnZXRzZXQoJ3JnYicsIDIsIG1heGZuKDI1NSkpLFxuXG5cdGh1ZTogZ2V0c2V0KFsnaHNsJywgJ2hzdicsICdoc2wnLCAnaHdiJywgJ2hjZyddLCAwLCBmdW5jdGlvbiAodmFsKSB7IHJldHVybiAoKHZhbCAlIDM2MCkgKyAzNjApICUgMzYwOyB9KSwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBicmFjZS1zdHlsZVxuXG5cdHNhdHVyYXRpb25sOiBnZXRzZXQoJ2hzbCcsIDEsIG1heGZuKDEwMCkpLFxuXHRsaWdodG5lc3M6IGdldHNldCgnaHNsJywgMiwgbWF4Zm4oMTAwKSksXG5cblx0c2F0dXJhdGlvbnY6IGdldHNldCgnaHN2JywgMSwgbWF4Zm4oMTAwKSksXG5cdHZhbHVlOiBnZXRzZXQoJ2hzdicsIDIsIG1heGZuKDEwMCkpLFxuXG5cdGNocm9tYTogZ2V0c2V0KCdoY2cnLCAxLCBtYXhmbigxMDApKSxcblx0Z3JheTogZ2V0c2V0KCdoY2cnLCAyLCBtYXhmbigxMDApKSxcblxuXHR3aGl0ZTogZ2V0c2V0KCdod2InLCAxLCBtYXhmbigxMDApKSxcblx0d2JsYWNrOiBnZXRzZXQoJ2h3YicsIDIsIG1heGZuKDEwMCkpLFxuXG5cdGN5YW46IGdldHNldCgnY215aycsIDAsIG1heGZuKDEwMCkpLFxuXHRtYWdlbnRhOiBnZXRzZXQoJ2NteWsnLCAxLCBtYXhmbigxMDApKSxcblx0eWVsbG93OiBnZXRzZXQoJ2NteWsnLCAyLCBtYXhmbigxMDApKSxcblx0YmxhY2s6IGdldHNldCgnY215aycsIDMsIG1heGZuKDEwMCkpLFxuXG5cdHg6IGdldHNldCgneHl6JywgMCwgbWF4Zm4oMTAwKSksXG5cdHk6IGdldHNldCgneHl6JywgMSwgbWF4Zm4oMTAwKSksXG5cdHo6IGdldHNldCgneHl6JywgMiwgbWF4Zm4oMTAwKSksXG5cblx0bDogZ2V0c2V0KCdsYWInLCAwLCBtYXhmbigxMDApKSxcblx0YTogZ2V0c2V0KCdsYWInLCAxKSxcblx0YjogZ2V0c2V0KCdsYWInLCAyKSxcblxuXHRrZXl3b3JkOiBmdW5jdGlvbiAodmFsKSB7XG5cdFx0aWYgKGFyZ3VtZW50cy5sZW5ndGgpIHtcblx0XHRcdHJldHVybiBuZXcgQ29sb3IodmFsKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gY29udmVydFt0aGlzLm1vZGVsXS5rZXl3b3JkKHRoaXMuY29sb3IpO1xuXHR9LFxuXG5cdGhleDogZnVuY3Rpb24gKHZhbCkge1xuXHRcdGlmIChhcmd1bWVudHMubGVuZ3RoKSB7XG5cdFx0XHRyZXR1cm4gbmV3IENvbG9yKHZhbCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNvbG9yU3RyaW5nLnRvLmhleCh0aGlzLnJnYigpLnJvdW5kKCkuY29sb3IpO1xuXHR9LFxuXG5cdHJnYk51bWJlcjogZnVuY3Rpb24gKCkge1xuXHRcdHZhciByZ2IgPSB0aGlzLnJnYigpLmNvbG9yO1xuXHRcdHJldHVybiAoKHJnYlswXSAmIDB4RkYpIDw8IDE2KSB8ICgocmdiWzFdICYgMHhGRikgPDwgOCkgfCAocmdiWzJdICYgMHhGRik7XG5cdH0sXG5cblx0bHVtaW5vc2l0eTogZnVuY3Rpb24gKCkge1xuXHRcdC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL1dDQUcyMC8jcmVsYXRpdmVsdW1pbmFuY2VkZWZcblx0XHR2YXIgcmdiID0gdGhpcy5yZ2IoKS5jb2xvcjtcblxuXHRcdHZhciBsdW0gPSBbXTtcblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IHJnYi5sZW5ndGg7IGkrKykge1xuXHRcdFx0dmFyIGNoYW4gPSByZ2JbaV0gLyAyNTU7XG5cdFx0XHRsdW1baV0gPSAoY2hhbiA8PSAwLjAzOTI4KSA/IGNoYW4gLyAxMi45MiA6IE1hdGgucG93KCgoY2hhbiArIDAuMDU1KSAvIDEuMDU1KSwgMi40KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gMC4yMTI2ICogbHVtWzBdICsgMC43MTUyICogbHVtWzFdICsgMC4wNzIyICogbHVtWzJdO1xuXHR9LFxuXG5cdGNvbnRyYXN0OiBmdW5jdGlvbiAoY29sb3IyKSB7XG5cdFx0Ly8gaHR0cDovL3d3dy53My5vcmcvVFIvV0NBRzIwLyNjb250cmFzdC1yYXRpb2RlZlxuXHRcdHZhciBsdW0xID0gdGhpcy5sdW1pbm9zaXR5KCk7XG5cdFx0dmFyIGx1bTIgPSBjb2xvcjIubHVtaW5vc2l0eSgpO1xuXG5cdFx0aWYgKGx1bTEgPiBsdW0yKSB7XG5cdFx0XHRyZXR1cm4gKGx1bTEgKyAwLjA1KSAvIChsdW0yICsgMC4wNSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIChsdW0yICsgMC4wNSkgLyAobHVtMSArIDAuMDUpO1xuXHR9LFxuXG5cdGxldmVsOiBmdW5jdGlvbiAoY29sb3IyKSB7XG5cdFx0dmFyIGNvbnRyYXN0UmF0aW8gPSB0aGlzLmNvbnRyYXN0KGNvbG9yMik7XG5cdFx0aWYgKGNvbnRyYXN0UmF0aW8gPj0gNy4xKSB7XG5cdFx0XHRyZXR1cm4gJ0FBQSc7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIChjb250cmFzdFJhdGlvID49IDQuNSkgPyAnQUEnIDogJyc7XG5cdH0sXG5cblx0aXNEYXJrOiBmdW5jdGlvbiAoKSB7XG5cdFx0Ly8gWUlRIGVxdWF0aW9uIGZyb20gaHR0cDovLzI0d2F5cy5vcmcvMjAxMC9jYWxjdWxhdGluZy1jb2xvci1jb250cmFzdFxuXHRcdHZhciByZ2IgPSB0aGlzLnJnYigpLmNvbG9yO1xuXHRcdHZhciB5aXEgPSAocmdiWzBdICogMjk5ICsgcmdiWzFdICogNTg3ICsgcmdiWzJdICogMTE0KSAvIDEwMDA7XG5cdFx0cmV0dXJuIHlpcSA8IDEyODtcblx0fSxcblxuXHRpc0xpZ2h0OiBmdW5jdGlvbiAoKSB7XG5cdFx0cmV0dXJuICF0aGlzLmlzRGFyaygpO1xuXHR9LFxuXG5cdG5lZ2F0ZTogZnVuY3Rpb24gKCkge1xuXHRcdHZhciByZ2IgPSB0aGlzLnJnYigpO1xuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgMzsgaSsrKSB7XG5cdFx0XHRyZ2IuY29sb3JbaV0gPSAyNTUgLSByZ2IuY29sb3JbaV07XG5cdFx0fVxuXHRcdHJldHVybiByZ2I7XG5cdH0sXG5cblx0bGlnaHRlbjogZnVuY3Rpb24gKHJhdGlvKSB7XG5cdFx0dmFyIGhzbCA9IHRoaXMuaHNsKCk7XG5cdFx0aHNsLmNvbG9yWzJdICs9IGhzbC5jb2xvclsyXSAqIHJhdGlvO1xuXHRcdHJldHVybiBoc2w7XG5cdH0sXG5cblx0ZGFya2VuOiBmdW5jdGlvbiAocmF0aW8pIHtcblx0XHR2YXIgaHNsID0gdGhpcy5oc2woKTtcblx0XHRoc2wuY29sb3JbMl0gLT0gaHNsLmNvbG9yWzJdICogcmF0aW87XG5cdFx0cmV0dXJuIGhzbDtcblx0fSxcblxuXHRzYXR1cmF0ZTogZnVuY3Rpb24gKHJhdGlvKSB7XG5cdFx0dmFyIGhzbCA9IHRoaXMuaHNsKCk7XG5cdFx0aHNsLmNvbG9yWzFdICs9IGhzbC5jb2xvclsxXSAqIHJhdGlvO1xuXHRcdHJldHVybiBoc2w7XG5cdH0sXG5cblx0ZGVzYXR1cmF0ZTogZnVuY3Rpb24gKHJhdGlvKSB7XG5cdFx0dmFyIGhzbCA9IHRoaXMuaHNsKCk7XG5cdFx0aHNsLmNvbG9yWzFdIC09IGhzbC5jb2xvclsxXSAqIHJhdGlvO1xuXHRcdHJldHVybiBoc2w7XG5cdH0sXG5cblx0d2hpdGVuOiBmdW5jdGlvbiAocmF0aW8pIHtcblx0XHR2YXIgaHdiID0gdGhpcy5od2IoKTtcblx0XHRod2IuY29sb3JbMV0gKz0gaHdiLmNvbG9yWzFdICogcmF0aW87XG5cdFx0cmV0dXJuIGh3Yjtcblx0fSxcblxuXHRibGFja2VuOiBmdW5jdGlvbiAocmF0aW8pIHtcblx0XHR2YXIgaHdiID0gdGhpcy5od2IoKTtcblx0XHRod2IuY29sb3JbMl0gKz0gaHdiLmNvbG9yWzJdICogcmF0aW87XG5cdFx0cmV0dXJuIGh3Yjtcblx0fSxcblxuXHRncmF5c2NhbGU6IGZ1bmN0aW9uICgpIHtcblx0XHQvLyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0dyYXlzY2FsZSNDb252ZXJ0aW5nX2NvbG9yX3RvX2dyYXlzY2FsZVxuXHRcdHZhciByZ2IgPSB0aGlzLnJnYigpLmNvbG9yO1xuXHRcdHZhciB2YWwgPSByZ2JbMF0gKiAwLjMgKyByZ2JbMV0gKiAwLjU5ICsgcmdiWzJdICogMC4xMTtcblx0XHRyZXR1cm4gQ29sb3IucmdiKHZhbCwgdmFsLCB2YWwpO1xuXHR9LFxuXG5cdGZhZGU6IGZ1bmN0aW9uIChyYXRpbykge1xuXHRcdHJldHVybiB0aGlzLmFscGhhKHRoaXMudmFscGhhIC0gKHRoaXMudmFscGhhICogcmF0aW8pKTtcblx0fSxcblxuXHRvcGFxdWVyOiBmdW5jdGlvbiAocmF0aW8pIHtcblx0XHRyZXR1cm4gdGhpcy5hbHBoYSh0aGlzLnZhbHBoYSArICh0aGlzLnZhbHBoYSAqIHJhdGlvKSk7XG5cdH0sXG5cblx0cm90YXRlOiBmdW5jdGlvbiAoZGVncmVlcykge1xuXHRcdHZhciBoc2wgPSB0aGlzLmhzbCgpO1xuXHRcdHZhciBodWUgPSBoc2wuY29sb3JbMF07XG5cdFx0aHVlID0gKGh1ZSArIGRlZ3JlZXMpICUgMzYwO1xuXHRcdGh1ZSA9IGh1ZSA8IDAgPyAzNjAgKyBodWUgOiBodWU7XG5cdFx0aHNsLmNvbG9yWzBdID0gaHVlO1xuXHRcdHJldHVybiBoc2w7XG5cdH0sXG5cblx0bWl4OiBmdW5jdGlvbiAobWl4aW5Db2xvciwgd2VpZ2h0KSB7XG5cdFx0Ly8gcG9ydGVkIGZyb20gc2FzcyBpbXBsZW1lbnRhdGlvbiBpbiBDXG5cdFx0Ly8gaHR0cHM6Ly9naXRodWIuY29tL3Nhc3MvbGlic2Fzcy9ibG9iLzBlNmI0YTI4NTAwOTIzNTZhYTNlY2UwN2M2YjI0OWYwMjIxY2FjZWQvZnVuY3Rpb25zLmNwcCNMMjA5XG5cdFx0aWYgKCFtaXhpbkNvbG9yIHx8ICFtaXhpbkNvbG9yLnJnYikge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdBcmd1bWVudCB0byBcIm1peFwiIHdhcyBub3QgYSBDb2xvciBpbnN0YW5jZSwgYnV0IHJhdGhlciBhbiBpbnN0YW5jZSBvZiAnICsgdHlwZW9mIG1peGluQ29sb3IpO1xuXHRcdH1cblx0XHR2YXIgY29sb3IxID0gbWl4aW5Db2xvci5yZ2IoKTtcblx0XHR2YXIgY29sb3IyID0gdGhpcy5yZ2IoKTtcblx0XHR2YXIgcCA9IHdlaWdodCA9PT0gdW5kZWZpbmVkID8gMC41IDogd2VpZ2h0O1xuXG5cdFx0dmFyIHcgPSAyICogcCAtIDE7XG5cdFx0dmFyIGEgPSBjb2xvcjEuYWxwaGEoKSAtIGNvbG9yMi5hbHBoYSgpO1xuXG5cdFx0dmFyIHcxID0gKCgodyAqIGEgPT09IC0xKSA/IHcgOiAodyArIGEpIC8gKDEgKyB3ICogYSkpICsgMSkgLyAyLjA7XG5cdFx0dmFyIHcyID0gMSAtIHcxO1xuXG5cdFx0cmV0dXJuIENvbG9yLnJnYihcblx0XHRcdFx0dzEgKiBjb2xvcjEucmVkKCkgKyB3MiAqIGNvbG9yMi5yZWQoKSxcblx0XHRcdFx0dzEgKiBjb2xvcjEuZ3JlZW4oKSArIHcyICogY29sb3IyLmdyZWVuKCksXG5cdFx0XHRcdHcxICogY29sb3IxLmJsdWUoKSArIHcyICogY29sb3IyLmJsdWUoKSxcblx0XHRcdFx0Y29sb3IxLmFscGhhKCkgKiBwICsgY29sb3IyLmFscGhhKCkgKiAoMSAtIHApKTtcblx0fVxufTtcblxuLy8gbW9kZWwgY29udmVyc2lvbiBtZXRob2RzIGFuZCBzdGF0aWMgY29uc3RydWN0b3JzXG5PYmplY3Qua2V5cyhjb252ZXJ0KS5mb3JFYWNoKGZ1bmN0aW9uIChtb2RlbCkge1xuXHRpZiAoc2tpcHBlZE1vZGVscy5pbmRleE9mKG1vZGVsKSAhPT0gLTEpIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHR2YXIgY2hhbm5lbHMgPSBjb252ZXJ0W21vZGVsXS5jaGFubmVscztcblxuXHQvLyBjb252ZXJzaW9uIG1ldGhvZHNcblx0Q29sb3IucHJvdG90eXBlW21vZGVsXSA9IGZ1bmN0aW9uICgpIHtcblx0XHRpZiAodGhpcy5tb2RlbCA9PT0gbW9kZWwpIHtcblx0XHRcdHJldHVybiBuZXcgQ29sb3IodGhpcyk7XG5cdFx0fVxuXG5cdFx0aWYgKGFyZ3VtZW50cy5sZW5ndGgpIHtcblx0XHRcdHJldHVybiBuZXcgQ29sb3IoYXJndW1lbnRzLCBtb2RlbCk7XG5cdFx0fVxuXG5cdFx0dmFyIG5ld0FscGhhID0gdHlwZW9mIGFyZ3VtZW50c1tjaGFubmVsc10gPT09ICdudW1iZXInID8gY2hhbm5lbHMgOiB0aGlzLnZhbHBoYTtcblx0XHRyZXR1cm4gbmV3IENvbG9yKGFzc2VydEFycmF5KGNvbnZlcnRbdGhpcy5tb2RlbF1bbW9kZWxdLnJhdyh0aGlzLmNvbG9yKSkuY29uY2F0KG5ld0FscGhhKSwgbW9kZWwpO1xuXHR9O1xuXG5cdC8vICdzdGF0aWMnIGNvbnN0cnVjdGlvbiBtZXRob2RzXG5cdENvbG9yW21vZGVsXSA9IGZ1bmN0aW9uIChjb2xvcikge1xuXHRcdGlmICh0eXBlb2YgY29sb3IgPT09ICdudW1iZXInKSB7XG5cdFx0XHRjb2xvciA9IHplcm9BcnJheShfc2xpY2UuY2FsbChhcmd1bWVudHMpLCBjaGFubmVscyk7XG5cdFx0fVxuXHRcdHJldHVybiBuZXcgQ29sb3IoY29sb3IsIG1vZGVsKTtcblx0fTtcbn0pO1xuXG5mdW5jdGlvbiByb3VuZFRvKG51bSwgcGxhY2VzKSB7XG5cdHJldHVybiBOdW1iZXIobnVtLnRvRml4ZWQocGxhY2VzKSk7XG59XG5cbmZ1bmN0aW9uIHJvdW5kVG9QbGFjZShwbGFjZXMpIHtcblx0cmV0dXJuIGZ1bmN0aW9uIChudW0pIHtcblx0XHRyZXR1cm4gcm91bmRUbyhudW0sIHBsYWNlcyk7XG5cdH07XG59XG5cbmZ1bmN0aW9uIGdldHNldChtb2RlbCwgY2hhbm5lbCwgbW9kaWZpZXIpIHtcblx0bW9kZWwgPSBBcnJheS5pc0FycmF5KG1vZGVsKSA/IG1vZGVsIDogW21vZGVsXTtcblxuXHRtb2RlbC5mb3JFYWNoKGZ1bmN0aW9uIChtKSB7XG5cdFx0KGxpbWl0ZXJzW21dIHx8IChsaW1pdGVyc1ttXSA9IFtdKSlbY2hhbm5lbF0gPSBtb2RpZmllcjtcblx0fSk7XG5cblx0bW9kZWwgPSBtb2RlbFswXTtcblxuXHRyZXR1cm4gZnVuY3Rpb24gKHZhbCkge1xuXHRcdHZhciByZXN1bHQ7XG5cblx0XHRpZiAoYXJndW1lbnRzLmxlbmd0aCkge1xuXHRcdFx0aWYgKG1vZGlmaWVyKSB7XG5cdFx0XHRcdHZhbCA9IG1vZGlmaWVyKHZhbCk7XG5cdFx0XHR9XG5cblx0XHRcdHJlc3VsdCA9IHRoaXNbbW9kZWxdKCk7XG5cdFx0XHRyZXN1bHQuY29sb3JbY2hhbm5lbF0gPSB2YWw7XG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdH1cblxuXHRcdHJlc3VsdCA9IHRoaXNbbW9kZWxdKCkuY29sb3JbY2hhbm5lbF07XG5cdFx0aWYgKG1vZGlmaWVyKSB7XG5cdFx0XHRyZXN1bHQgPSBtb2RpZmllcihyZXN1bHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH07XG59XG5cbmZ1bmN0aW9uIG1heGZuKG1heCkge1xuXHRyZXR1cm4gZnVuY3Rpb24gKHYpIHtcblx0XHRyZXR1cm4gTWF0aC5tYXgoMCwgTWF0aC5taW4obWF4LCB2KSk7XG5cdH07XG59XG5cbmZ1bmN0aW9uIGFzc2VydEFycmF5KHZhbCkge1xuXHRyZXR1cm4gQXJyYXkuaXNBcnJheSh2YWwpID8gdmFsIDogW3ZhbF07XG59XG5cbmZ1bmN0aW9uIHplcm9BcnJheShhcnIsIGxlbmd0aCkge1xuXHRmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG5cdFx0aWYgKHR5cGVvZiBhcnJbaV0gIT09ICdudW1iZXInKSB7XG5cdFx0XHRhcnJbaV0gPSAwO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBhcnI7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gQ29sb3I7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///85\n")},function(module,exports,__webpack_require__){eval("var baseGetTag = __webpack_require__(65),\n isObject = __webpack_require__(43);\n\n/** `Object#toString` result references. */\nvar asyncTag = '[object AsyncFunction]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n proxyTag = '[object Proxy]';\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n if (!isObject(value)) {\n return false;\n }\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 9 which returns 'object' for typed arrays and other constructors.\n var tag = baseGetTag(value);\n return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n}\n\nmodule.exports = isFunction;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzRnVuY3Rpb24uanM/OTUyMCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxpQkFBaUIsbUJBQU8sQ0FBQyxFQUFlO0FBQ3hDLGVBQWUsbUJBQU8sQ0FBQyxFQUFZOztBQUVuQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxFQUFFO0FBQ2IsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJmaWxlIjoiODYuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYmFzZUdldFRhZyA9IHJlcXVpcmUoJy4vX2Jhc2VHZXRUYWcnKSxcbiAgICBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXNPYmplY3QnKTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIGFzeW5jVGFnID0gJ1tvYmplY3QgQXN5bmNGdW5jdGlvbl0nLFxuICAgIGZ1bmNUYWcgPSAnW29iamVjdCBGdW5jdGlvbl0nLFxuICAgIGdlblRhZyA9ICdbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXScsXG4gICAgcHJveHlUYWcgPSAnW29iamVjdCBQcm94eV0nO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgRnVuY3Rpb25gIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIGZ1bmN0aW9uLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNGdW5jdGlvbihfKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzRnVuY3Rpb24oL2FiYy8pO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNGdW5jdGlvbih2YWx1ZSkge1xuICBpZiAoIWlzT2JqZWN0KHZhbHVlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvLyBUaGUgdXNlIG9mIGBPYmplY3QjdG9TdHJpbmdgIGF2b2lkcyBpc3N1ZXMgd2l0aCB0aGUgYHR5cGVvZmAgb3BlcmF0b3JcbiAgLy8gaW4gU2FmYXJpIDkgd2hpY2ggcmV0dXJucyAnb2JqZWN0JyBmb3IgdHlwZWQgYXJyYXlzIGFuZCBvdGhlciBjb25zdHJ1Y3RvcnMuXG4gIHZhciB0YWcgPSBiYXNlR2V0VGFnKHZhbHVlKTtcbiAgcmV0dXJuIHRhZyA9PSBmdW5jVGFnIHx8IHRhZyA9PSBnZW5UYWcgfHwgdGFnID09IGFzeW5jVGFnIHx8IHRhZyA9PSBwcm94eVRhZztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0Z1bmN0aW9uO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///86\n")},function(module,exports,__webpack_require__){eval("var assignValue = __webpack_require__(104),\n baseAssignValue = __webpack_require__(105);\n\n/**\n * Copies properties of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy properties from.\n * @param {Array} props The property identifiers to copy.\n * @param {Object} [object={}] The object to copy properties to.\n * @param {Function} [customizer] The function to customize copied values.\n * @returns {Object} Returns `object`.\n */\nfunction copyObject(source, props, object, customizer) {\n var isNew = !object;\n object || (object = {});\n\n var index = -1,\n length = props.length;\n\n while (++index < length) {\n var key = props[index];\n\n var newValue = customizer\n ? customizer(object[key], source[key], key, object, source)\n : undefined;\n\n if (newValue === undefined) {\n newValue = source[key];\n }\n if (isNew) {\n baseAssignValue(object, key, newValue);\n } else {\n assignValue(object, key, newValue);\n }\n }\n return object;\n}\n\nmodule.exports = copyObject;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jb3B5T2JqZWN0LmpzPzhlZWIiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsa0JBQWtCLG1CQUFPLENBQUMsR0FBZ0I7QUFDMUMsc0JBQXNCLG1CQUFPLENBQUMsR0FBb0I7O0FBRWxEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsTUFBTTtBQUNqQixXQUFXLE9BQU8sV0FBVztBQUM3QixXQUFXLFNBQVM7QUFDcEIsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBLHdCQUF3Qjs7QUFFeEI7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJmaWxlIjoiODcuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYXNzaWduVmFsdWUgPSByZXF1aXJlKCcuL19hc3NpZ25WYWx1ZScpLFxuICAgIGJhc2VBc3NpZ25WYWx1ZSA9IHJlcXVpcmUoJy4vX2Jhc2VBc3NpZ25WYWx1ZScpO1xuXG4vKipcbiAqIENvcGllcyBwcm9wZXJ0aWVzIG9mIGBzb3VyY2VgIHRvIGBvYmplY3RgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3QgdG8gY29weSBwcm9wZXJ0aWVzIGZyb20uXG4gKiBAcGFyYW0ge0FycmF5fSBwcm9wcyBUaGUgcHJvcGVydHkgaWRlbnRpZmllcnMgdG8gY29weS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0PXt9XSBUaGUgb2JqZWN0IHRvIGNvcHkgcHJvcGVydGllcyB0by5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvcGllZCB2YWx1ZXMuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICovXG5mdW5jdGlvbiBjb3B5T2JqZWN0KHNvdXJjZSwgcHJvcHMsIG9iamVjdCwgY3VzdG9taXplcikge1xuICB2YXIgaXNOZXcgPSAhb2JqZWN0O1xuICBvYmplY3QgfHwgKG9iamVjdCA9IHt9KTtcblxuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IHByb3BzLmxlbmd0aDtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciBrZXkgPSBwcm9wc1tpbmRleF07XG5cbiAgICB2YXIgbmV3VmFsdWUgPSBjdXN0b21pemVyXG4gICAgICA/IGN1c3RvbWl6ZXIob2JqZWN0W2tleV0sIHNvdXJjZVtrZXldLCBrZXksIG9iamVjdCwgc291cmNlKVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICBpZiAobmV3VmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgbmV3VmFsdWUgPSBzb3VyY2Vba2V5XTtcbiAgICB9XG4gICAgaWYgKGlzTmV3KSB7XG4gICAgICBiYXNlQXNzaWduVmFsdWUob2JqZWN0LCBrZXksIG5ld1ZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXNzaWduVmFsdWUob2JqZWN0LCBrZXksIG5ld1ZhbHVlKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG9iamVjdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjb3B5T2JqZWN0O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///87\n")},function(module,exports,__webpack_require__){eval("var baseIsArguments = __webpack_require__(354),\n isObjectLike = __webpack_require__(49);\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n * else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nvar isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n !propertyIsEnumerable.call(value, 'callee');\n};\n\nmodule.exports = isArguments;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzQXJndW1lbnRzLmpzP2QzNzAiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsc0JBQXNCLG1CQUFPLENBQUMsR0FBb0I7QUFDbEQsbUJBQW1CLG1CQUFPLENBQUMsRUFBZ0I7O0FBRTNDO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxFQUFFO0FBQ2IsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QixrQkFBa0IsRUFBRTtBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDLGtCQUFrQixFQUFFO0FBQ2xFO0FBQ0E7QUFDQTs7QUFFQSIsImZpbGUiOiI4OC5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBiYXNlSXNBcmd1bWVudHMgPSByZXF1aXJlKCcuL19iYXNlSXNBcmd1bWVudHMnKSxcbiAgICBpc09iamVjdExpa2UgPSByZXF1aXJlKCcuL2lzT2JqZWN0TGlrZScpO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBwcm9wZXJ0eUlzRW51bWVyYWJsZSA9IG9iamVjdFByb3RvLnByb3BlcnR5SXNFbnVtZXJhYmxlO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGxpa2VseSBhbiBgYXJndW1lbnRzYCBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYGFyZ3VtZW50c2Agb2JqZWN0LFxuICogIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0FyZ3VtZW50cyhmdW5jdGlvbigpIHsgcmV0dXJuIGFyZ3VtZW50czsgfSgpKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJndW1lbnRzKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG52YXIgaXNBcmd1bWVudHMgPSBiYXNlSXNBcmd1bWVudHMoZnVuY3Rpb24oKSB7IHJldHVybiBhcmd1bWVudHM7IH0oKSkgPyBiYXNlSXNBcmd1bWVudHMgOiBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCAnY2FsbGVlJykgJiZcbiAgICAhcHJvcGVydHlJc0VudW1lcmFibGUuY2FsbCh2YWx1ZSwgJ2NhbGxlZScpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBpc0FyZ3VtZW50cztcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///88\n")},function(module,exports,__webpack_require__){eval("var baseIsTypedArray = __webpack_require__(356),\n baseUnary = __webpack_require__(107),\n nodeUtil = __webpack_require__(158);\n\n/* Node.js helper references. */\nvar nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n/**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\nvar isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\nmodule.exports = isTypedArray;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzVHlwZWRBcnJheS5qcz83M2FjIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHVCQUF1QixtQkFBTyxDQUFDLEdBQXFCO0FBQ3BELGdCQUFnQixtQkFBTyxDQUFDLEdBQWM7QUFDdEMsZUFBZSxtQkFBTyxDQUFDLEdBQWE7O0FBRXBDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEVBQUU7QUFDYixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwiZmlsZSI6Ijg5LmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIGJhc2VJc1R5cGVkQXJyYXkgPSByZXF1aXJlKCcuL19iYXNlSXNUeXBlZEFycmF5JyksXG4gICAgYmFzZVVuYXJ5ID0gcmVxdWlyZSgnLi9fYmFzZVVuYXJ5JyksXG4gICAgbm9kZVV0aWwgPSByZXF1aXJlKCcuL19ub2RlVXRpbCcpO1xuXG4vKiBOb2RlLmpzIGhlbHBlciByZWZlcmVuY2VzLiAqL1xudmFyIG5vZGVJc1R5cGVkQXJyYXkgPSBub2RlVXRpbCAmJiBub2RlVXRpbC5pc1R5cGVkQXJyYXk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIHR5cGVkIGFycmF5LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMy4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgdHlwZWQgYXJyYXksIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc1R5cGVkQXJyYXkobmV3IFVpbnQ4QXJyYXkpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNUeXBlZEFycmF5KFtdKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbnZhciBpc1R5cGVkQXJyYXkgPSBub2RlSXNUeXBlZEFycmF5ID8gYmFzZVVuYXJ5KG5vZGVJc1R5cGVkQXJyYXkpIDogYmFzZUlzVHlwZWRBcnJheTtcblxubW9kdWxlLmV4cG9ydHMgPSBpc1R5cGVkQXJyYXk7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///89\n")},function(module,exports,__webpack_require__){eval("var isSymbol = __webpack_require__(76);\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/**\n * Converts `value` to a string key if it's not a string or symbol.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {string|symbol} Returns the key.\n */\nfunction toKey(value) {\n if (typeof value == 'string' || isSymbol(value)) {\n return value;\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = toKey;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL190b0tleS5qcz9mNGQ2Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGVBQWUsbUJBQU8sQ0FBQyxFQUFZOztBQUVuQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxFQUFFO0FBQ2IsYUFBYSxjQUFjO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJmaWxlIjoiOTAuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgaXNTeW1ib2wgPSByZXF1aXJlKCcuL2lzU3ltYm9sJyk7XG5cbi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIElORklOSVRZID0gMSAvIDA7XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhIHN0cmluZyBrZXkgaWYgaXQncyBub3QgYSBzdHJpbmcgb3Igc3ltYm9sLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBpbnNwZWN0LlxuICogQHJldHVybnMge3N0cmluZ3xzeW1ib2x9IFJldHVybnMgdGhlIGtleS5cbiAqL1xuZnVuY3Rpb24gdG9LZXkodmFsdWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJyB8fCBpc1N5bWJvbCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgdmFyIHJlc3VsdCA9ICh2YWx1ZSArICcnKTtcbiAgcmV0dXJuIChyZXN1bHQgPT0gJzAnICYmICgxIC8gdmFsdWUpID09IC1JTkZJTklUWSkgPyAnLTAnIDogcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHRvS2V5O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///90\n")},function(module,exports,__webpack_require__){"use strict";eval('\nObject.defineProperty(exports, "__esModule", { value: true });\nexports.circularDependencyToException = exports.listMetadataForTarget = exports.listRegisteredBindingsForServiceIdentifier = exports.getServiceIdentifierAsString = exports.getFunctionName = void 0;\nvar ERROR_MSGS = __webpack_require__(40);\nfunction getServiceIdentifierAsString(serviceIdentifier) {\n if (typeof serviceIdentifier === "function") {\n var _serviceIdentifier = serviceIdentifier;\n return _serviceIdentifier.name;\n }\n else if (typeof serviceIdentifier === "symbol") {\n return serviceIdentifier.toString();\n }\n else {\n var _serviceIdentifier = serviceIdentifier;\n return _serviceIdentifier;\n }\n}\nexports.getServiceIdentifierAsString = getServiceIdentifierAsString;\nfunction listRegisteredBindingsForServiceIdentifier(container, serviceIdentifier, getBindings) {\n var registeredBindingsList = "";\n var registeredBindings = getBindings(container, serviceIdentifier);\n if (registeredBindings.length !== 0) {\n registeredBindingsList = "\\nRegistered bindings:";\n registeredBindings.forEach(function (binding) {\n var name = "Object";\n if (binding.implementationType !== null) {\n name = getFunctionName(binding.implementationType);\n }\n registeredBindingsList = registeredBindingsList + "\\n " + name;\n if (binding.constraint.metaData) {\n registeredBindingsList = registeredBindingsList + " - " + binding.constraint.metaData;\n }\n });\n }\n return registeredBindingsList;\n}\nexports.listRegisteredBindingsForServiceIdentifier = listRegisteredBindingsForServiceIdentifier;\nfunction alreadyDependencyChain(request, serviceIdentifier) {\n if (request.parentRequest === null) {\n return false;\n }\n else if (request.parentRequest.serviceIdentifier === serviceIdentifier) {\n return true;\n }\n else {\n return alreadyDependencyChain(request.parentRequest, serviceIdentifier);\n }\n}\nfunction dependencyChainToString(request) {\n function _createStringArr(req, result) {\n if (result === void 0) { result = []; }\n var serviceIdentifier = getServiceIdentifierAsString(req.serviceIdentifier);\n result.push(serviceIdentifier);\n if (req.parentRequest !== null) {\n return _createStringArr(req.parentRequest, result);\n }\n return result;\n }\n var stringArr = _createStringArr(request);\n return stringArr.reverse().join(" --\x3e ");\n}\nfunction circularDependencyToException(request) {\n request.childRequests.forEach(function (childRequest) {\n if (alreadyDependencyChain(childRequest, childRequest.serviceIdentifier)) {\n var services = dependencyChainToString(childRequest);\n throw new Error(ERROR_MSGS.CIRCULAR_DEPENDENCY + " " + services);\n }\n else {\n circularDependencyToException(childRequest);\n }\n });\n}\nexports.circularDependencyToException = circularDependencyToException;\nfunction listMetadataForTarget(serviceIdentifierString, target) {\n if (target.isTagged() || target.isNamed()) {\n var m_1 = "";\n var namedTag = target.getNamedTag();\n var otherTags = target.getCustomTags();\n if (namedTag !== null) {\n m_1 += namedTag.toString() + "\\n";\n }\n if (otherTags !== null) {\n otherTags.forEach(function (tag) {\n m_1 += tag.toString() + "\\n";\n });\n }\n return " " + serviceIdentifierString + "\\n " + serviceIdentifierString + " - " + m_1;\n }\n else {\n return " " + serviceIdentifierString;\n }\n}\nexports.listMetadataForTarget = listMetadataForTarget;\nfunction getFunctionName(v) {\n if (v.name) {\n return v.name;\n }\n else {\n var name_1 = v.toString();\n var match = name_1.match(/^function\\s*([^\\s(]+)/);\n return match ? match[1] : "Anonymous function: " + name_1;\n }\n}\nexports.getFunctionName = getFunctionName;\n//# sourceMappingURL=serialization.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaW52ZXJzaWZ5L2xpYi91dGlscy9zZXJpYWxpemF0aW9uLmpzP2JhMzMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQWE7QUFDYiw4Q0FBOEMsY0FBYztBQUM1RDtBQUNBLGlCQUFpQixtQkFBTyxDQUFDLEVBQXlCO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0MsYUFBYTtBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6IjkxLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmNpcmN1bGFyRGVwZW5kZW5jeVRvRXhjZXB0aW9uID0gZXhwb3J0cy5saXN0TWV0YWRhdGFGb3JUYXJnZXQgPSBleHBvcnRzLmxpc3RSZWdpc3RlcmVkQmluZGluZ3NGb3JTZXJ2aWNlSWRlbnRpZmllciA9IGV4cG9ydHMuZ2V0U2VydmljZUlkZW50aWZpZXJBc1N0cmluZyA9IGV4cG9ydHMuZ2V0RnVuY3Rpb25OYW1lID0gdm9pZCAwO1xudmFyIEVSUk9SX01TR1MgPSByZXF1aXJlKFwiLi4vY29uc3RhbnRzL2Vycm9yX21zZ3NcIik7XG5mdW5jdGlvbiBnZXRTZXJ2aWNlSWRlbnRpZmllckFzU3RyaW5nKHNlcnZpY2VJZGVudGlmaWVyKSB7XG4gICAgaWYgKHR5cGVvZiBzZXJ2aWNlSWRlbnRpZmllciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHZhciBfc2VydmljZUlkZW50aWZpZXIgPSBzZXJ2aWNlSWRlbnRpZmllcjtcbiAgICAgICAgcmV0dXJuIF9zZXJ2aWNlSWRlbnRpZmllci5uYW1lO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2Ygc2VydmljZUlkZW50aWZpZXIgPT09IFwic3ltYm9sXCIpIHtcbiAgICAgICAgcmV0dXJuIHNlcnZpY2VJZGVudGlmaWVyLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB2YXIgX3NlcnZpY2VJZGVudGlmaWVyID0gc2VydmljZUlkZW50aWZpZXI7XG4gICAgICAgIHJldHVybiBfc2VydmljZUlkZW50aWZpZXI7XG4gICAgfVxufVxuZXhwb3J0cy5nZXRTZXJ2aWNlSWRlbnRpZmllckFzU3RyaW5nID0gZ2V0U2VydmljZUlkZW50aWZpZXJBc1N0cmluZztcbmZ1bmN0aW9uIGxpc3RSZWdpc3RlcmVkQmluZGluZ3NGb3JTZXJ2aWNlSWRlbnRpZmllcihjb250YWluZXIsIHNlcnZpY2VJZGVudGlmaWVyLCBnZXRCaW5kaW5ncykge1xuICAgIHZhciByZWdpc3RlcmVkQmluZGluZ3NMaXN0ID0gXCJcIjtcbiAgICB2YXIgcmVnaXN0ZXJlZEJpbmRpbmdzID0gZ2V0QmluZGluZ3MoY29udGFpbmVyLCBzZXJ2aWNlSWRlbnRpZmllcik7XG4gICAgaWYgKHJlZ2lzdGVyZWRCaW5kaW5ncy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgcmVnaXN0ZXJlZEJpbmRpbmdzTGlzdCA9IFwiXFxuUmVnaXN0ZXJlZCBiaW5kaW5nczpcIjtcbiAgICAgICAgcmVnaXN0ZXJlZEJpbmRpbmdzLmZvckVhY2goZnVuY3Rpb24gKGJpbmRpbmcpIHtcbiAgICAgICAgICAgIHZhciBuYW1lID0gXCJPYmplY3RcIjtcbiAgICAgICAgICAgIGlmIChiaW5kaW5nLmltcGxlbWVudGF0aW9uVHlwZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIG5hbWUgPSBnZXRGdW5jdGlvbk5hbWUoYmluZGluZy5pbXBsZW1lbnRhdGlvblR5cGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVnaXN0ZXJlZEJpbmRpbmdzTGlzdCA9IHJlZ2lzdGVyZWRCaW5kaW5nc0xpc3QgKyBcIlxcbiBcIiArIG5hbWU7XG4gICAgICAgICAgICBpZiAoYmluZGluZy5jb25zdHJhaW50Lm1ldGFEYXRhKSB7XG4gICAgICAgICAgICAgICAgcmVnaXN0ZXJlZEJpbmRpbmdzTGlzdCA9IHJlZ2lzdGVyZWRCaW5kaW5nc0xpc3QgKyBcIiAtIFwiICsgYmluZGluZy5jb25zdHJhaW50Lm1ldGFEYXRhO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlZ2lzdGVyZWRCaW5kaW5nc0xpc3Q7XG59XG5leHBvcnRzLmxpc3RSZWdpc3RlcmVkQmluZGluZ3NGb3JTZXJ2aWNlSWRlbnRpZmllciA9IGxpc3RSZWdpc3RlcmVkQmluZGluZ3NGb3JTZXJ2aWNlSWRlbnRpZmllcjtcbmZ1bmN0aW9uIGFscmVhZHlEZXBlbmRlbmN5Q2hhaW4ocmVxdWVzdCwgc2VydmljZUlkZW50aWZpZXIpIHtcbiAgICBpZiAocmVxdWVzdC5wYXJlbnRSZXF1ZXN0ID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZWxzZSBpZiAocmVxdWVzdC5wYXJlbnRSZXF1ZXN0LnNlcnZpY2VJZGVudGlmaWVyID09PSBzZXJ2aWNlSWRlbnRpZmllcikge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBhbHJlYWR5RGVwZW5kZW5jeUNoYWluKHJlcXVlc3QucGFyZW50UmVxdWVzdCwgc2VydmljZUlkZW50aWZpZXIpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGRlcGVuZGVuY3lDaGFpblRvU3RyaW5nKHJlcXVlc3QpIHtcbiAgICBmdW5jdGlvbiBfY3JlYXRlU3RyaW5nQXJyKHJlcSwgcmVzdWx0KSB7XG4gICAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgeyByZXN1bHQgPSBbXTsgfVxuICAgICAgICB2YXIgc2VydmljZUlkZW50aWZpZXIgPSBnZXRTZXJ2aWNlSWRlbnRpZmllckFzU3RyaW5nKHJlcS5zZXJ2aWNlSWRlbnRpZmllcik7XG4gICAgICAgIHJlc3VsdC5wdXNoKHNlcnZpY2VJZGVudGlmaWVyKTtcbiAgICAgICAgaWYgKHJlcS5wYXJlbnRSZXF1ZXN0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gX2NyZWF0ZVN0cmluZ0FycihyZXEucGFyZW50UmVxdWVzdCwgcmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICB2YXIgc3RyaW5nQXJyID0gX2NyZWF0ZVN0cmluZ0FycihyZXF1ZXN0KTtcbiAgICByZXR1cm4gc3RyaW5nQXJyLnJldmVyc2UoKS5qb2luKFwiIC0tPiBcIik7XG59XG5mdW5jdGlvbiBjaXJjdWxhckRlcGVuZGVuY3lUb0V4Y2VwdGlvbihyZXF1ZXN0KSB7XG4gICAgcmVxdWVzdC5jaGlsZFJlcXVlc3RzLmZvckVhY2goZnVuY3Rpb24gKGNoaWxkUmVxdWVzdCkge1xuICAgICAgICBpZiAoYWxyZWFkeURlcGVuZGVuY3lDaGFpbihjaGlsZFJlcXVlc3QsIGNoaWxkUmVxdWVzdC5zZXJ2aWNlSWRlbnRpZmllcikpIHtcbiAgICAgICAgICAgIHZhciBzZXJ2aWNlcyA9IGRlcGVuZGVuY3lDaGFpblRvU3RyaW5nKGNoaWxkUmVxdWVzdCk7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoRVJST1JfTVNHUy5DSVJDVUxBUl9ERVBFTkRFTkNZICsgXCIgXCIgKyBzZXJ2aWNlcyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjaXJjdWxhckRlcGVuZGVuY3lUb0V4Y2VwdGlvbihjaGlsZFJlcXVlc3QpO1xuICAgICAgICB9XG4gICAgfSk7XG59XG5leHBvcnRzLmNpcmN1bGFyRGVwZW5kZW5jeVRvRXhjZXB0aW9uID0gY2lyY3VsYXJEZXBlbmRlbmN5VG9FeGNlcHRpb247XG5mdW5jdGlvbiBsaXN0TWV0YWRhdGFGb3JUYXJnZXQoc2VydmljZUlkZW50aWZpZXJTdHJpbmcsIHRhcmdldCkge1xuICAgIGlmICh0YXJnZXQuaXNUYWdnZWQoKSB8fCB0YXJnZXQuaXNOYW1lZCgpKSB7XG4gICAgICAgIHZhciBtXzEgPSBcIlwiO1xuICAgICAgICB2YXIgbmFtZWRUYWcgPSB0YXJnZXQuZ2V0TmFtZWRUYWcoKTtcbiAgICAgICAgdmFyIG90aGVyVGFncyA9IHRhcmdldC5nZXRDdXN0b21UYWdzKCk7XG4gICAgICAgIGlmIChuYW1lZFRhZyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgbV8xICs9IG5hbWVkVGFnLnRvU3RyaW5nKCkgKyBcIlxcblwiO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvdGhlclRhZ3MgIT09IG51bGwpIHtcbiAgICAgICAgICAgIG90aGVyVGFncy5mb3JFYWNoKGZ1bmN0aW9uICh0YWcpIHtcbiAgICAgICAgICAgICAgICBtXzEgKz0gdGFnLnRvU3RyaW5nKCkgKyBcIlxcblwiO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFwiIFwiICsgc2VydmljZUlkZW50aWZpZXJTdHJpbmcgKyBcIlxcbiBcIiArIHNlcnZpY2VJZGVudGlmaWVyU3RyaW5nICsgXCIgLSBcIiArIG1fMTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBcIiBcIiArIHNlcnZpY2VJZGVudGlmaWVyU3RyaW5nO1xuICAgIH1cbn1cbmV4cG9ydHMubGlzdE1ldGFkYXRhRm9yVGFyZ2V0ID0gbGlzdE1ldGFkYXRhRm9yVGFyZ2V0O1xuZnVuY3Rpb24gZ2V0RnVuY3Rpb25OYW1lKHYpIHtcbiAgICBpZiAodi5uYW1lKSB7XG4gICAgICAgIHJldHVybiB2Lm5hbWU7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB2YXIgbmFtZV8xID0gdi50b1N0cmluZygpO1xuICAgICAgICB2YXIgbWF0Y2ggPSBuYW1lXzEubWF0Y2goL15mdW5jdGlvblxccyooW15cXHMoXSspLyk7XG4gICAgICAgIHJldHVybiBtYXRjaCA/IG1hdGNoWzFdIDogXCJBbm9ueW1vdXMgZnVuY3Rpb246IFwiICsgbmFtZV8xO1xuICAgIH1cbn1cbmV4cG9ydHMuZ2V0RnVuY3Rpb25OYW1lID0gZ2V0RnVuY3Rpb25OYW1lO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2VyaWFsaXphdGlvbi5qcy5tYXAiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///91\n')},function(module,__webpack_exports__,__webpack_require__){"use strict";eval('\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, "a", function() { return /* binding */ createWorldContainer; });\n\n// UNUSED EXPORTS: container, lazyInject, lazyMultiInject\n\n// EXTERNAL MODULE: ./node_modules/reflect-metadata/Reflect.js\nvar reflect_metadata_Reflect = __webpack_require__(239);\n\n// EXTERNAL MODULE: ./node_modules/inversify/lib/inversify.js\nvar inversify = __webpack_require__(5);\n\n// EXTERNAL MODULE: ./node_modules/inversify-inject-decorators/lib/index.js\nvar lib = __webpack_require__(282);\nvar lib_default = /*#__PURE__*/__webpack_require__.n(lib);\n\n// EXTERNAL MODULE: ./node_modules/@antv/g-webgpu-core/es/ComponentManager.js\nvar ComponentManager = __webpack_require__(25);\n\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/initializerDefineProperty.js\nvar initializerDefineProperty = __webpack_require__(10);\nvar initializerDefineProperty_default = /*#__PURE__*/__webpack_require__.n(initializerDefineProperty);\n\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/classCallCheck.js\nvar classCallCheck = __webpack_require__(6);\nvar classCallCheck_default = /*#__PURE__*/__webpack_require__.n(classCallCheck);\n\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/createClass.js\nvar createClass = __webpack_require__(7);\nvar createClass_default = /*#__PURE__*/__webpack_require__.n(createClass);\n\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/applyDecoratedDescriptor.js\nvar applyDecoratedDescriptor = __webpack_require__(11);\nvar applyDecoratedDescriptor_default = /*#__PURE__*/__webpack_require__.n(applyDecoratedDescriptor);\n\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/initializerWarningHelper.js\nvar initializerWarningHelper = __webpack_require__(29);\n\n// EXTERNAL MODULE: ./node_modules/@antv/g-webgpu-core/es/identifier.js\nvar identifier = __webpack_require__(13);\n\n// EXTERNAL MODULE: ./node_modules/@antv/g-webgpu-core/es/components/renderer/gl.js\nvar gl = __webpack_require__(35);\n\n// CONCATENATED MODULE: ./node_modules/@antv/g-webgpu-core/es/components/framegraph/ResourcePool.js\n\n\n\n\n\n\nvar _dec, _dec2, _class, _class2, _descriptor, _temp;\n\n\n\n\nvar ResourcePool_ResourcePool = (_dec = Object(inversify["injectable"])(), _dec2 = Object(inversify["inject"])(identifier["a" /* IDENTIFIER */].RenderEngine), _dec(_class = (_class2 = (_temp = /*#__PURE__*/function () {\n function ResourcePool() {\n classCallCheck_default()(this, ResourcePool);\n\n initializerDefineProperty_default()(this, "engine", _descriptor, this);\n\n this.resourcePool = {};\n }\n\n createClass_default()(ResourcePool, [{\n key: "getOrCreateResource",\n\n /**\n * 负责实例化虚拟资源,通过引擎服务\n * @param resource 虚拟资源\n */\n value: function getOrCreateResource(resource) {\n if (!this.resourcePool[resource.name]) {\n var _resource$descriptor = resource.descriptor,\n width = _resource$descriptor.width,\n height = _resource$descriptor.height,\n usage = _resource$descriptor.usage;\n this.resourcePool[resource.name] = this.engine.createFramebuffer({\n color: this.engine.createTexture2D({\n width: width,\n height: height,\n wrapS: gl["a" /* gl */].CLAMP_TO_EDGE,\n wrapT: gl["a" /* gl */].CLAMP_TO_EDGE,\n usage: usage\n })\n });\n }\n\n return this.resourcePool[resource.name];\n }\n }, {\n key: "clean",\n value: function clean() {\n this.resourcePool = {};\n }\n }]);\n\n return ResourcePool;\n}(), _temp), (_descriptor = applyDecoratedDescriptor_default()(_class2.prototype, "engine", [_dec2], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n})), _class2)) || _class);\n//# sourceMappingURL=ResourcePool.js.map\n// EXTERNAL MODULE: ./node_modules/@antv/g-webgpu-core/es/components/framegraph/System.js + 6 modules\nvar System = __webpack_require__(135);\n\n// EXTERNAL MODULE: ./node_modules/@antv/g-webgpu-core/es/components/geometry/GeometryComponent.js + 1 modules\nvar GeometryComponent = __webpack_require__(137);\n\n// EXTERNAL MODULE: ./node_modules/@antv/g-webgpu-core/es/components/geometry/System.js\nvar geometry_System = __webpack_require__(122);\n\n// EXTERNAL MODULE: ./node_modules/@antv/g-webgpu-core/es/components/material/MaterialComponent.js\nvar MaterialComponent = __webpack_require__(123);\n\n// EXTERNAL MODULE: ./node_modules/@antv/g-webgpu-core/es/components/material/System.js\nvar material_System = __webpack_require__(124);\n\n// EXTERNAL MODULE: ./node_modules/@antv/g-webgpu-core/es/components/mesh/CullableComponent.js\nvar CullableComponent = __webpack_require__(125);\n\n// EXTERNAL MODULE: ./node_modules/@antv/g-webgpu-core/es/components/mesh/MeshComponent.js\nvar MeshComponent = __webpack_require__(126);\n\n// EXTERNAL MODULE: ./node_modules/@antv/g-webgpu-core/es/components/mesh/System.js\nvar mesh_System = __webpack_require__(127);\n\n// EXTERNAL MODULE: ./node_modules/@antv/g-webgpu-core/es/components/renderer/passes/CopyPass.js\nvar CopyPass = __webpack_require__(83);\n\n// EXTERNAL MODULE: ./node_modules/@antv/g-webgpu-core/es/components/renderer/passes/PixelPickingPass.js\nvar PixelPickingPass = __webpack_require__(70);\n\n// EXTERNAL MODULE: ./node_modules/@antv/g-webgpu-core/es/components/renderer/passes/RenderPass.js\nvar RenderPass = __webpack_require__(51);\n\n// EXTERNAL MODULE: ./node_modules/@antv/g-webgpu-core/es/components/renderer/System.js\nvar renderer_System = __webpack_require__(129);\n\n// EXTERNAL MODULE: ./node_modules/@antv/g-webgpu-core/es/components/scenegraph/HierarchyComponent.js\nvar HierarchyComponent = __webpack_require__(130);\n\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/inherits.js\nvar inherits = __webpack_require__(23);\nvar inherits_default = /*#__PURE__*/__webpack_require__.n(inherits);\n\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/possibleConstructorReturn.js\nvar possibleConstructorReturn = __webpack_require__(24);\nvar possibleConstructorReturn_default = /*#__PURE__*/__webpack_require__.n(possibleConstructorReturn);\n\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/getPrototypeOf.js\nvar getPrototypeOf = __webpack_require__(18);\nvar getPrototypeOf_default = /*#__PURE__*/__webpack_require__.n(getPrototypeOf);\n\n// CONCATENATED MODULE: ./node_modules/@antv/g-webgpu-core/es/components/scenegraph/NameComponent.js\n\n\n\n\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = getPrototypeOf_default()(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = getPrototypeOf_default()(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return possibleConstructorReturn_default()(this, result); }; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\n\nvar NameComponent_NameComponent = /*#__PURE__*/function (_Component) {\n inherits_default()(NameComponent, _Component);\n\n var _super = _createSuper(NameComponent);\n\n function NameComponent(data) {\n var _this;\n\n classCallCheck_default()(this, NameComponent);\n\n _this = _super.call(this, data);\n _this.name = void 0;\n _this.name = data.name || \'\';\n return _this;\n }\n\n return NameComponent;\n}(ComponentManager["a" /* Component */]);\n//# sourceMappingURL=NameComponent.js.map\n// EXTERNAL MODULE: ./node_modules/@antv/g-webgpu-core/es/components/scenegraph/System.js\nvar scenegraph_System = __webpack_require__(131);\n\n// EXTERNAL MODULE: ./node_modules/@antv/g-webgpu-core/es/components/scenegraph/TransformComponent.js\nvar TransformComponent = __webpack_require__(132);\n\n// EXTERNAL MODULE: ./node_modules/@antv/g-webgpu-core/es/services/config/ConfigService.js\nvar ConfigService = __webpack_require__(133);\n\n// EXTERNAL MODULE: ./node_modules/@antv/g-webgpu-core/es/services/interactor/IteractorService.js\nvar IteractorService = __webpack_require__(134);\n\n// EXTERNAL MODULE: ./node_modules/@antv/g-webgpu-core/es/services/shader-module/ShaderModuleService.js + 2 modules\nvar ShaderModuleService = __webpack_require__(136);\n\n// CONCATENATED MODULE: ./node_modules/@antv/g-webgpu-core/es/inversify.config.js\n/**\n * Root Container\n * @see /dev-docs/IoC 容器、依赖注入与服务说明.md\n */\n\n\n\n\n\n\n\n // import { InteractionSystem } from \'./components/interaction/System\';\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n // @see https://github.com/inversify/InversifyJS/blob/master/wiki/container_api.md#defaultscope\n\nvar container = new inversify["Container"](); // @see https://github.com/inversify/InversifyJS/blob/master/wiki/inheritance.md#what-can-i-do-when-my-base-class-is-provided-by-a-third-party-module\n// decorate(injectable(), EventEmitter);\n// container.bind(IDENTIFIER.IEventEmitter).to(EventEmitter);\n// 支持使用 new 而非容器实例化的场景,同时禁止 lazyInject cache\n// @see https://github.com/inversify/inversify-inject-decorators#caching-vs-non-caching-behaviour\n\nvar DECORATORS = lib_default()(container, false);\n// Add babel legacy decorators support\n// @see https://github.com/inversify/InversifyJS/issues/1050\n// @see https://github.com/inversify/InversifyJS/issues/1026#issuecomment-504936034\nvar lazyInject = function lazyInject(serviceIdentifier) {\n var original = DECORATORS.lazyInject(serviceIdentifier); // the \'descriptor\' parameter is actually always defined for class fields for Babel, but is considered undefined for TSC\n // so we just hack it with ?/! combination to avoid "TS1240: Unable to resolve signature of property decorator when called as an expression"\n\n return function (proto, key, descriptor) {\n // make it work as usual\n original.call(this, proto, key); // return link to proto, so own value wont be \'undefined\' after component\'s creation\n\n if (descriptor) {\n descriptor.initializer = function () {\n return proto[key];\n };\n }\n };\n};\nvar lazyMultiInject = function lazyMultiInject(serviceIdentifier) {\n var original = DECORATORS.lazyMultiInject(serviceIdentifier); // the \'descriptor\' parameter is actually always defined for class fields for Babel, but is considered undefined for TSC\n // so we just hack it with ?/! combination to avoid "TS1240: Unable to resolve signature of property decorator when called as an expression"\n\n return function (proto, key, descriptor) {\n // make it work as usual\n original.call(this, proto, key);\n\n if (descriptor) {\n // return link to proto, so own value wont be \'undefined\' after component\'s creation\n descriptor.initializer = function () {\n return proto[key];\n };\n }\n };\n};\n/** global services */\n\ncontainer.bind(identifier["a" /* IDENTIFIER */].ShaderModuleService).to(ShaderModuleService["a" /* default */]).inSingletonScope();\n/**\n * bind global component managers in root container\n */\n\ncontainer.bind(identifier["a" /* IDENTIFIER */].NameComponentManager).toConstantValue(new ComponentManager["b" /* ComponentManager */](NameComponent_NameComponent));\ncontainer.bind(identifier["a" /* IDENTIFIER */].HierarchyComponentManager).toConstantValue(new ComponentManager["b" /* ComponentManager */](HierarchyComponent["a" /* HierarchyComponent */]));\ncontainer.bind(identifier["a" /* IDENTIFIER */].TransformComponentManager).toConstantValue(new ComponentManager["b" /* ComponentManager */](TransformComponent["a" /* TransformComponent */]));\ncontainer.bind(identifier["a" /* IDENTIFIER */].MeshComponentManager).toConstantValue(new ComponentManager["b" /* ComponentManager */](MeshComponent["a" /* MeshComponent */]));\ncontainer.bind(identifier["a" /* IDENTIFIER */].CullableComponentManager).toConstantValue(new ComponentManager["b" /* ComponentManager */](CullableComponent["a" /* CullableComponent */]));\ncontainer.bind(identifier["a" /* IDENTIFIER */].GeometryComponentManager).toConstantValue(new ComponentManager["b" /* ComponentManager */](GeometryComponent["a" /* GeometryComponent */]));\ncontainer.bind(identifier["a" /* IDENTIFIER */].MaterialComponentManager).toConstantValue(new ComponentManager["b" /* ComponentManager */](MaterialComponent["a" /* MaterialComponent */])); // https://github.com/inversify/InversifyJS/blob/master/wiki/hierarchical_di.md#support-for-hierarchical-di-systems\n\nfunction createWorldContainer() {\n var worldContainer = new inversify["Container"]();\n worldContainer.parent = container;\n /**\n * bind systems\n */\n\n worldContainer.bind(identifier["a" /* IDENTIFIER */].Systems).to(scenegraph_System["a" /* SceneGraphSystem */]).inSingletonScope().whenTargetNamed(identifier["a" /* IDENTIFIER */].SceneGraphSystem);\n worldContainer.bind(identifier["a" /* IDENTIFIER */].Systems).to(System["a" /* FrameGraphSystem */]).inSingletonScope().whenTargetNamed(identifier["a" /* IDENTIFIER */].FrameGraphSystem);\n worldContainer.bind(identifier["a" /* IDENTIFIER */].Systems).to(mesh_System["a" /* MeshSystem */]).inSingletonScope().whenTargetNamed(identifier["a" /* IDENTIFIER */].MeshSystem);\n worldContainer.bind(identifier["a" /* IDENTIFIER */].Systems).to(geometry_System["a" /* GeometrySystem */]).inSingletonScope().whenTargetNamed(identifier["a" /* IDENTIFIER */].GeometrySystem);\n worldContainer.bind(identifier["a" /* IDENTIFIER */].Systems).to(material_System["a" /* MaterialSystem */]).inSingletonScope().whenTargetNamed(identifier["a" /* IDENTIFIER */].MaterialSystem);\n worldContainer.bind(identifier["a" /* IDENTIFIER */].Systems).to(renderer_System["a" /* RendererSystem */]).inSingletonScope().whenTargetNamed(identifier["a" /* IDENTIFIER */].RendererSystem); // 资源池\n\n worldContainer.bind(identifier["a" /* IDENTIFIER */].ResourcePool).to(ResourcePool_ResourcePool).inSingletonScope();\n worldContainer.bind(identifier["a" /* IDENTIFIER */].ConfigService).to(ConfigService["a" /* ConfigService */]).inSingletonScope();\n worldContainer.bind(identifier["a" /* IDENTIFIER */].InteractorService).to(IteractorService["a" /* InteractorService */]).inSingletonScope();\n /**\n * bind render passes\n */\n\n worldContainer.bind(identifier["a" /* IDENTIFIER */].RenderPass).to(RenderPass["a" /* RenderPass */]).inSingletonScope().whenTargetNamed(RenderPass["a" /* RenderPass */].IDENTIFIER);\n worldContainer.bind(identifier["a" /* IDENTIFIER */].RenderPass).to(CopyPass["a" /* CopyPass */]).inSingletonScope().whenTargetNamed(CopyPass["a" /* CopyPass */].IDENTIFIER);\n worldContainer.bind(identifier["a" /* IDENTIFIER */].RenderPass).to(PixelPickingPass["a" /* PixelPickingPass */]).inSingletonScope().whenTargetNamed(PixelPickingPass["a" /* PixelPickingPass */].IDENTIFIER);\n worldContainer.bind(identifier["a" /* IDENTIFIER */].RenderPassFactory).toFactory(function (context) {\n return function (name) {\n return context.container.getNamed(identifier["a" /* IDENTIFIER */].RenderPass, name);\n };\n });\n return worldContainer;\n}\n//# sourceMappingURL=inversify.config.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy13ZWJncHUtY29yZS9lcy9jb21wb25lbnRzL2ZyYW1lZ3JhcGgvUmVzb3VyY2VQb29sLmpzPzQyY2QiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2ctd2ViZ3B1LWNvcmUvZXMvY29tcG9uZW50cy9zY2VuZWdyYXBoL05hbWVDb21wb25lbnQuanM/MTRjYSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy13ZWJncHUtY29yZS9lcy9pbnZlcnNpZnkuY29uZmlnLmpzPzNhYTQiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQTBGO0FBQ3RCO0FBQ047QUFDMEI7QUFDQTs7QUFFeEY7O0FBRStDO0FBQ0Q7QUFDVjtBQUM3QixJQUFJLHlCQUFZLFdBQVcsK0JBQVUsWUFBWSwyQkFBTSxDQUFDLGdDQUFVO0FBQ3pFO0FBQ0EsSUFBSSx3QkFBZTs7QUFFbkIsSUFBSSxtQ0FBMEI7O0FBRTlCO0FBQ0E7O0FBRUEsRUFBRSxxQkFBWTtBQUNkOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsZ0JBQUU7QUFDckIsbUJBQW1CLGdCQUFFO0FBQ3JCO0FBQ0EsV0FBVztBQUNYLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBLENBQUMsMkJBQTJCLGtDQUF5QjtBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRCx3Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUM1RG9FO0FBQ1o7QUFDa0M7QUFDdEI7O0FBRXBFLGdDQUFnQyw2REFBNkQseUNBQXlDLGFBQWEsd0JBQWUsa0JBQWtCLGlDQUFpQyxpQkFBaUIsd0JBQWUsbUJBQW1CLHlEQUF5RCxFQUFFLE9BQU8sdUNBQXVDLEVBQUUsUUFBUSxtQ0FBMEIsZUFBZSxHQUFHOztBQUV2YSxzQ0FBc0Msd0VBQXdFLDBDQUEwQyw4Q0FBOEMsTUFBTSx3RUFBd0UsR0FBRyxhQUFhLEVBQUUsWUFBWSxjQUFjLEVBQUU7O0FBRS9RO0FBQzVDLElBQUksMkJBQWE7QUFDeEIsRUFBRSxrQkFBUzs7QUFFWDs7QUFFQTtBQUNBOztBQUVBLElBQUksd0JBQWU7O0FBRW5CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDLENBQUMscUNBQVM7QUFDWCx5Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUM1QkE7QUFDQTtBQUNBO0FBQ0E7QUFDMEI7QUFDWTtBQUNrQjtBQUNGO0FBQ2M7QUFDRjtBQUNVO0FBQ2QsWUFBWSxvQkFBb0I7O0FBRWxCO0FBQ2Q7QUFDVTtBQUNSO0FBQ1Y7QUFDVztBQUNnQjtBQUNaO0FBQ1A7QUFDa0I7QUFDVjtBQUNKO0FBQ2M7QUFDdEM7QUFDc0I7QUFDVztBQUNJOztBQUV4RSxvQkFBb0Isc0JBQVMsR0FBRztBQUN2QztBQUNBO0FBQ0E7QUFDQTs7QUFFQSxpQkFBaUIsYUFBYTtBQUM5QjtBQUNBO0FBQ0E7QUFDTztBQUNQLDBEQUEwRDtBQUMxRDs7QUFFQTtBQUNBO0FBQ0Esb0NBQW9DOztBQUVwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1AsK0RBQStEO0FBQy9EOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsZUFBZSxnQ0FBVSx5QkFBeUIsc0NBQW1CO0FBQ3JFO0FBQ0E7QUFDQTs7QUFFQSxlQUFlLGdDQUFVLDJDQUEyQyw0Q0FBZ0IsQ0FBQywyQkFBYTtBQUNsRyxlQUFlLGdDQUFVLGdEQUFnRCw0Q0FBZ0IsQ0FBQyxnREFBa0I7QUFDNUcsZUFBZSxnQ0FBVSxnREFBZ0QsNENBQWdCLENBQUMsZ0RBQWtCO0FBQzVHLGVBQWUsZ0NBQVUsMkNBQTJDLDRDQUFnQixDQUFDLHNDQUFhO0FBQ2xHLGVBQWUsZ0NBQVUsK0NBQStDLDRDQUFnQixDQUFDLDhDQUFpQjtBQUMxRyxlQUFlLGdDQUFVLCtDQUErQyw0Q0FBZ0IsQ0FBQyw4Q0FBaUI7QUFDMUcsZUFBZSxnQ0FBVSwrQ0FBK0MsNENBQWdCLENBQUMsOENBQWlCLEdBQUc7O0FBRXRHO0FBQ1AsMkJBQTJCLHNCQUFTO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHNCQUFzQixnQ0FBVSxhQUFhLDZDQUFnQixxQ0FBcUMsZ0NBQVU7QUFDNUcsc0JBQXNCLGdDQUFVLGFBQWEsa0NBQWdCLHFDQUFxQyxnQ0FBVTtBQUM1RyxzQkFBc0IsZ0NBQVUsYUFBYSxpQ0FBVSxxQ0FBcUMsZ0NBQVU7QUFDdEcsc0JBQXNCLGdDQUFVLGFBQWEseUNBQWMscUNBQXFDLGdDQUFVO0FBQzFHLHNCQUFzQixnQ0FBVSxhQUFhLHlDQUFjLHFDQUFxQyxnQ0FBVTtBQUMxRyxzQkFBc0IsZ0NBQVUsYUFBYSx5Q0FBYyxxQ0FBcUMsZ0NBQVUsaUJBQWlCOztBQUUzSCxzQkFBc0IsZ0NBQVUsa0JBQWtCLHlCQUFZO0FBQzlELHNCQUFzQixnQ0FBVSxtQkFBbUIsc0NBQWE7QUFDaEUsc0JBQXNCLGdDQUFVLHVCQUF1Qiw2Q0FBaUI7QUFDeEU7QUFDQTtBQUNBOztBQUVBLHNCQUFzQixnQ0FBVSxnQkFBZ0IsZ0NBQVUscUNBQXFDLGdDQUFVO0FBQ3pHLHNCQUFzQixnQ0FBVSxnQkFBZ0IsNEJBQVEscUNBQXFDLDRCQUFRO0FBQ3JHLHNCQUFzQixnQ0FBVSxnQkFBZ0IsNENBQWdCLHFDQUFxQyw0Q0FBZ0I7QUFDckgsc0JBQXNCLGdDQUFVO0FBQ2hDO0FBQ0Esd0NBQXdDLGdDQUFVO0FBQ2xEO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSIsImZpbGUiOiI5Mi5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfaW5pdGlhbGl6ZXJEZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbml0aWFsaXplckRlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrXCI7XG5pbXBvcnQgX2NyZWF0ZUNsYXNzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzXCI7XG5pbXBvcnQgX2FwcGx5RGVjb3JhdGVkRGVzY3JpcHRvciBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hcHBseURlY29yYXRlZERlc2NyaXB0b3JcIjtcbmltcG9ydCBfaW5pdGlhbGl6ZXJXYXJuaW5nSGVscGVyIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2luaXRpYWxpemVyV2FybmluZ0hlbHBlclwiO1xuXG52YXIgX2RlYywgX2RlYzIsIF9jbGFzcywgX2NsYXNzMiwgX2Rlc2NyaXB0b3IsIF90ZW1wO1xuXG5pbXBvcnQgeyBpbmplY3QsIGluamVjdGFibGUgfSBmcm9tICdpbnZlcnNpZnknO1xuaW1wb3J0IHsgSURFTlRJRklFUiB9IGZyb20gJy4uLy4uL2lkZW50aWZpZXInO1xuaW1wb3J0IHsgZ2wgfSBmcm9tICcuLi9yZW5kZXJlci9nbCc7XG5leHBvcnQgdmFyIFJlc291cmNlUG9vbCA9IChfZGVjID0gaW5qZWN0YWJsZSgpLCBfZGVjMiA9IGluamVjdChJREVOVElGSUVSLlJlbmRlckVuZ2luZSksIF9kZWMoX2NsYXNzID0gKF9jbGFzczIgPSAoX3RlbXAgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBSZXNvdXJjZVBvb2woKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFJlc291cmNlUG9vbCk7XG5cbiAgICBfaW5pdGlhbGl6ZXJEZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImVuZ2luZVwiLCBfZGVzY3JpcHRvciwgdGhpcyk7XG5cbiAgICB0aGlzLnJlc291cmNlUG9vbCA9IHt9O1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKFJlc291cmNlUG9vbCwgW3tcbiAgICBrZXk6IFwiZ2V0T3JDcmVhdGVSZXNvdXJjZVwiLFxuXG4gICAgLyoqXG4gICAgICog6LSf6LSj5a6e5L6L5YyW6Jma5ouf6LWE5rqQ77yM6YCa6L+H5byV5pOO5pyN5YqhXG4gICAgICogQHBhcmFtIHJlc291cmNlIOiZmuaLn+i1hOa6kFxuICAgICAqL1xuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRPckNyZWF0ZVJlc291cmNlKHJlc291cmNlKSB7XG4gICAgICBpZiAoIXRoaXMucmVzb3VyY2VQb29sW3Jlc291cmNlLm5hbWVdKSB7XG4gICAgICAgIHZhciBfcmVzb3VyY2UkZGVzY3JpcHRvciA9IHJlc291cmNlLmRlc2NyaXB0b3IsXG4gICAgICAgICAgICB3aWR0aCA9IF9yZXNvdXJjZSRkZXNjcmlwdG9yLndpZHRoLFxuICAgICAgICAgICAgaGVpZ2h0ID0gX3Jlc291cmNlJGRlc2NyaXB0b3IuaGVpZ2h0LFxuICAgICAgICAgICAgdXNhZ2UgPSBfcmVzb3VyY2UkZGVzY3JpcHRvci51c2FnZTtcbiAgICAgICAgdGhpcy5yZXNvdXJjZVBvb2xbcmVzb3VyY2UubmFtZV0gPSB0aGlzLmVuZ2luZS5jcmVhdGVGcmFtZWJ1ZmZlcih7XG4gICAgICAgICAgY29sb3I6IHRoaXMuZW5naW5lLmNyZWF0ZVRleHR1cmUyRCh7XG4gICAgICAgICAgICB3aWR0aDogd2lkdGgsXG4gICAgICAgICAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICAgICAgICAgIHdyYXBTOiBnbC5DTEFNUF9UT19FREdFLFxuICAgICAgICAgICAgd3JhcFQ6IGdsLkNMQU1QX1RPX0VER0UsXG4gICAgICAgICAgICB1c2FnZTogdXNhZ2VcbiAgICAgICAgICB9KVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMucmVzb3VyY2VQb29sW3Jlc291cmNlLm5hbWVdO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjbGVhblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjbGVhbigpIHtcbiAgICAgIHRoaXMucmVzb3VyY2VQb29sID0ge307XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFJlc291cmNlUG9vbDtcbn0oKSwgX3RlbXApLCAoX2Rlc2NyaXB0b3IgPSBfYXBwbHlEZWNvcmF0ZWREZXNjcmlwdG9yKF9jbGFzczIucHJvdG90eXBlLCBcImVuZ2luZVwiLCBbX2RlYzJdLCB7XG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgd3JpdGFibGU6IHRydWUsXG4gIGluaXRpYWxpemVyOiBudWxsXG59KSksIF9jbGFzczIpKSB8fCBfY2xhc3MpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UmVzb3VyY2VQb29sLmpzLm1hcCIsImltcG9ydCBfY2xhc3NDYWxsQ2hlY2sgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2tcIjtcbmltcG9ydCBfaW5oZXJpdHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHNcIjtcbmltcG9ydCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuXCI7XG5pbXBvcnQgX2dldFByb3RvdHlwZU9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2dldFByb3RvdHlwZU9mXCI7XG5cbmZ1bmN0aW9uIF9jcmVhdGVTdXBlcihEZXJpdmVkKSB7IHZhciBoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0ID0gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpOyByZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKSB7IHZhciBTdXBlciA9IF9nZXRQcm90b3R5cGVPZihEZXJpdmVkKSwgcmVzdWx0OyBpZiAoaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCkgeyB2YXIgTmV3VGFyZ2V0ID0gX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yOyByZXN1bHQgPSBSZWZsZWN0LmNvbnN0cnVjdChTdXBlciwgYXJndW1lbnRzLCBOZXdUYXJnZXQpOyB9IGVsc2UgeyByZXN1bHQgPSBTdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9IHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCByZXN1bHQpOyB9OyB9XG5cbmZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7IGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpIHJldHVybiBmYWxzZTsgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTsgaWYgKHR5cGVvZiBQcm94eSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdHJ1ZTsgdHJ5IHsgRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLCBbXSwgZnVuY3Rpb24gKCkge30pKTsgcmV0dXJuIHRydWU7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9IH1cblxuaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vQ29tcG9uZW50TWFuYWdlcic7XG5leHBvcnQgdmFyIE5hbWVDb21wb25lbnQgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcbiAgX2luaGVyaXRzKE5hbWVDb21wb25lbnQsIF9Db21wb25lbnQpO1xuXG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoTmFtZUNvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gTmFtZUNvbXBvbmVudChkYXRhKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIE5hbWVDb21wb25lbnQpO1xuXG4gICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBkYXRhKTtcbiAgICBfdGhpcy5uYW1lID0gdm9pZCAwO1xuICAgIF90aGlzLm5hbWUgPSBkYXRhLm5hbWUgfHwgJyc7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgcmV0dXJuIE5hbWVDb21wb25lbnQ7XG59KENvbXBvbmVudCk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1OYW1lQ29tcG9uZW50LmpzLm1hcCIsIi8qKlxuICogUm9vdCBDb250YWluZXJcbiAqIEBzZWUgL2Rldi1kb2NzL0lvQyDlrrnlmajjgIHkvp3otZbms6jlhaXkuI7mnI3liqHor7TmmI4ubWRcbiAqL1xuaW1wb3J0ICdyZWZsZWN0LW1ldGFkYXRhJztcbmltcG9ydCB7IENvbnRhaW5lciB9IGZyb20gJ2ludmVyc2lmeSc7XG5pbXBvcnQgZ2V0RGVjb3JhdG9ycyBmcm9tICdpbnZlcnNpZnktaW5qZWN0LWRlY29yYXRvcnMnO1xuaW1wb3J0IHsgQ29tcG9uZW50TWFuYWdlciB9IGZyb20gJy4vQ29tcG9uZW50TWFuYWdlcic7XG5pbXBvcnQgeyBSZXNvdXJjZVBvb2wgfSBmcm9tICcuL2NvbXBvbmVudHMvZnJhbWVncmFwaC9SZXNvdXJjZVBvb2wnO1xuaW1wb3J0IHsgRnJhbWVHcmFwaFN5c3RlbSB9IGZyb20gJy4vY29tcG9uZW50cy9mcmFtZWdyYXBoL1N5c3RlbSc7XG5pbXBvcnQgeyBHZW9tZXRyeUNvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9nZW9tZXRyeS9HZW9tZXRyeUNvbXBvbmVudCc7XG5pbXBvcnQgeyBHZW9tZXRyeVN5c3RlbSB9IGZyb20gJy4vY29tcG9uZW50cy9nZW9tZXRyeS9TeXN0ZW0nOyAvLyBpbXBvcnQgeyBJbnRlcmFjdGlvblN5c3RlbSB9IGZyb20gJy4vY29tcG9uZW50cy9pbnRlcmFjdGlvbi9TeXN0ZW0nO1xuXG5pbXBvcnQgeyBNYXRlcmlhbENvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9tYXRlcmlhbC9NYXRlcmlhbENvbXBvbmVudCc7XG5pbXBvcnQgeyBNYXRlcmlhbFN5c3RlbSB9IGZyb20gJy4vY29tcG9uZW50cy9tYXRlcmlhbC9TeXN0ZW0nO1xuaW1wb3J0IHsgQ3VsbGFibGVDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvbWVzaC9DdWxsYWJsZUNvbXBvbmVudCc7XG5pbXBvcnQgeyBNZXNoQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL21lc2gvTWVzaENvbXBvbmVudCc7XG5pbXBvcnQgeyBNZXNoU3lzdGVtIH0gZnJvbSAnLi9jb21wb25lbnRzL21lc2gvU3lzdGVtJztcbmltcG9ydCB7IENvcHlQYXNzIH0gZnJvbSAnLi9jb21wb25lbnRzL3JlbmRlcmVyL3Bhc3Nlcy9Db3B5UGFzcyc7XG5pbXBvcnQgeyBQaXhlbFBpY2tpbmdQYXNzIH0gZnJvbSAnLi9jb21wb25lbnRzL3JlbmRlcmVyL3Bhc3Nlcy9QaXhlbFBpY2tpbmdQYXNzJztcbmltcG9ydCB7IFJlbmRlclBhc3MgfSBmcm9tICcuL2NvbXBvbmVudHMvcmVuZGVyZXIvcGFzc2VzL1JlbmRlclBhc3MnO1xuaW1wb3J0IHsgUmVuZGVyZXJTeXN0ZW0gfSBmcm9tICcuL2NvbXBvbmVudHMvcmVuZGVyZXIvU3lzdGVtJztcbmltcG9ydCB7IEhpZXJhcmNoeUNvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9zY2VuZWdyYXBoL0hpZXJhcmNoeUNvbXBvbmVudCc7XG5pbXBvcnQgeyBOYW1lQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL3NjZW5lZ3JhcGgvTmFtZUNvbXBvbmVudCc7XG5pbXBvcnQgeyBTY2VuZUdyYXBoU3lzdGVtIH0gZnJvbSAnLi9jb21wb25lbnRzL3NjZW5lZ3JhcGgvU3lzdGVtJztcbmltcG9ydCB7IFRyYW5zZm9ybUNvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9zY2VuZWdyYXBoL1RyYW5zZm9ybUNvbXBvbmVudCc7XG5pbXBvcnQgeyBJREVOVElGSUVSIH0gZnJvbSAnLi9pZGVudGlmaWVyJztcbmltcG9ydCB7IENvbmZpZ1NlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL2NvbmZpZy9Db25maWdTZXJ2aWNlJztcbmltcG9ydCB7IEludGVyYWN0b3JTZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcy9pbnRlcmFjdG9yL0l0ZXJhY3RvclNlcnZpY2UnO1xuaW1wb3J0IFNoYWRlck1vZHVsZVNlcnZpY2UgZnJvbSAnLi9zZXJ2aWNlcy9zaGFkZXItbW9kdWxlL1NoYWRlck1vZHVsZVNlcnZpY2UnOyAvLyBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9pbnZlcnNpZnkvSW52ZXJzaWZ5SlMvYmxvYi9tYXN0ZXIvd2lraS9jb250YWluZXJfYXBpLm1kI2RlZmF1bHRzY29wZVxuXG5leHBvcnQgdmFyIGNvbnRhaW5lciA9IG5ldyBDb250YWluZXIoKTsgLy8gQHNlZSBodHRwczovL2dpdGh1Yi5jb20vaW52ZXJzaWZ5L0ludmVyc2lmeUpTL2Jsb2IvbWFzdGVyL3dpa2kvaW5oZXJpdGFuY2UubWQjd2hhdC1jYW4taS1kby13aGVuLW15LWJhc2UtY2xhc3MtaXMtcHJvdmlkZWQtYnktYS10aGlyZC1wYXJ0eS1tb2R1bGVcbi8vIGRlY29yYXRlKGluamVjdGFibGUoKSwgRXZlbnRFbWl0dGVyKTtcbi8vIGNvbnRhaW5lci5iaW5kKElERU5USUZJRVIuSUV2ZW50RW1pdHRlcikudG8oRXZlbnRFbWl0dGVyKTtcbi8vIOaUr+aMgeS9v+eUqCBuZXcg6ICM6Z2e5a655Zmo5a6e5L6L5YyW55qE5Zy65pmv77yM5ZCM5pe256aB5q2iIGxhenlJbmplY3QgY2FjaGVcbi8vIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2ludmVyc2lmeS9pbnZlcnNpZnktaW5qZWN0LWRlY29yYXRvcnMjY2FjaGluZy12cy1ub24tY2FjaGluZy1iZWhhdmlvdXJcblxudmFyIERFQ09SQVRPUlMgPSBnZXREZWNvcmF0b3JzKGNvbnRhaW5lciwgZmFsc2UpO1xuLy8gQWRkIGJhYmVsIGxlZ2FjeSBkZWNvcmF0b3JzIHN1cHBvcnRcbi8vIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2ludmVyc2lmeS9JbnZlcnNpZnlKUy9pc3N1ZXMvMTA1MFxuLy8gQHNlZSBodHRwczovL2dpdGh1Yi5jb20vaW52ZXJzaWZ5L0ludmVyc2lmeUpTL2lzc3Vlcy8xMDI2I2lzc3VlY29tbWVudC01MDQ5MzYwMzRcbmV4cG9ydCB2YXIgbGF6eUluamVjdCA9IGZ1bmN0aW9uIGxhenlJbmplY3Qoc2VydmljZUlkZW50aWZpZXIpIHtcbiAgdmFyIG9yaWdpbmFsID0gREVDT1JBVE9SUy5sYXp5SW5qZWN0KHNlcnZpY2VJZGVudGlmaWVyKTsgLy8gdGhlICdkZXNjcmlwdG9yJyBwYXJhbWV0ZXIgaXMgYWN0dWFsbHkgYWx3YXlzIGRlZmluZWQgZm9yIGNsYXNzIGZpZWxkcyBmb3IgQmFiZWwsIGJ1dCBpcyBjb25zaWRlcmVkIHVuZGVmaW5lZCBmb3IgVFNDXG4gIC8vIHNvIHdlIGp1c3QgaGFjayBpdCB3aXRoID8vISBjb21iaW5hdGlvbiB0byBhdm9pZCBcIlRTMTI0MDogVW5hYmxlIHRvIHJlc29sdmUgc2lnbmF0dXJlIG9mIHByb3BlcnR5IGRlY29yYXRvciB3aGVuIGNhbGxlZCBhcyBhbiBleHByZXNzaW9uXCJcblxuICByZXR1cm4gZnVuY3Rpb24gKHByb3RvLCBrZXksIGRlc2NyaXB0b3IpIHtcbiAgICAvLyBtYWtlIGl0IHdvcmsgYXMgdXN1YWxcbiAgICBvcmlnaW5hbC5jYWxsKHRoaXMsIHByb3RvLCBrZXkpOyAvLyByZXR1cm4gbGluayB0byBwcm90bywgc28gb3duIHZhbHVlIHdvbnQgYmUgJ3VuZGVmaW5lZCcgYWZ0ZXIgY29tcG9uZW50J3MgY3JlYXRpb25cblxuICAgIGlmIChkZXNjcmlwdG9yKSB7XG4gICAgICBkZXNjcmlwdG9yLmluaXRpYWxpemVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gcHJvdG9ba2V5XTtcbiAgICAgIH07XG4gICAgfVxuICB9O1xufTtcbmV4cG9ydCB2YXIgbGF6eU11bHRpSW5qZWN0ID0gZnVuY3Rpb24gbGF6eU11bHRpSW5qZWN0KHNlcnZpY2VJZGVudGlmaWVyKSB7XG4gIHZhciBvcmlnaW5hbCA9IERFQ09SQVRPUlMubGF6eU11bHRpSW5qZWN0KHNlcnZpY2VJZGVudGlmaWVyKTsgLy8gdGhlICdkZXNjcmlwdG9yJyBwYXJhbWV0ZXIgaXMgYWN0dWFsbHkgYWx3YXlzIGRlZmluZWQgZm9yIGNsYXNzIGZpZWxkcyBmb3IgQmFiZWwsIGJ1dCBpcyBjb25zaWRlcmVkIHVuZGVmaW5lZCBmb3IgVFNDXG4gIC8vIHNvIHdlIGp1c3QgaGFjayBpdCB3aXRoID8vISBjb21iaW5hdGlvbiB0byBhdm9pZCBcIlRTMTI0MDogVW5hYmxlIHRvIHJlc29sdmUgc2lnbmF0dXJlIG9mIHByb3BlcnR5IGRlY29yYXRvciB3aGVuIGNhbGxlZCBhcyBhbiBleHByZXNzaW9uXCJcblxuICByZXR1cm4gZnVuY3Rpb24gKHByb3RvLCBrZXksIGRlc2NyaXB0b3IpIHtcbiAgICAvLyBtYWtlIGl0IHdvcmsgYXMgdXN1YWxcbiAgICBvcmlnaW5hbC5jYWxsKHRoaXMsIHByb3RvLCBrZXkpO1xuXG4gICAgaWYgKGRlc2NyaXB0b3IpIHtcbiAgICAgIC8vIHJldHVybiBsaW5rIHRvIHByb3RvLCBzbyBvd24gdmFsdWUgd29udCBiZSAndW5kZWZpbmVkJyBhZnRlciBjb21wb25lbnQncyBjcmVhdGlvblxuICAgICAgZGVzY3JpcHRvci5pbml0aWFsaXplciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHByb3RvW2tleV07XG4gICAgICB9O1xuICAgIH1cbiAgfTtcbn07XG4vKiogZ2xvYmFsIHNlcnZpY2VzICovXG5cbmNvbnRhaW5lci5iaW5kKElERU5USUZJRVIuU2hhZGVyTW9kdWxlU2VydmljZSkudG8oU2hhZGVyTW9kdWxlU2VydmljZSkuaW5TaW5nbGV0b25TY29wZSgpO1xuLyoqXG4gKiBiaW5kIGdsb2JhbCBjb21wb25lbnQgbWFuYWdlcnMgaW4gcm9vdCBjb250YWluZXJcbiAqL1xuXG5jb250YWluZXIuYmluZChJREVOVElGSUVSLk5hbWVDb21wb25lbnRNYW5hZ2VyKS50b0NvbnN0YW50VmFsdWUobmV3IENvbXBvbmVudE1hbmFnZXIoTmFtZUNvbXBvbmVudCkpO1xuY29udGFpbmVyLmJpbmQoSURFTlRJRklFUi5IaWVyYXJjaHlDb21wb25lbnRNYW5hZ2VyKS50b0NvbnN0YW50VmFsdWUobmV3IENvbXBvbmVudE1hbmFnZXIoSGllcmFyY2h5Q29tcG9uZW50KSk7XG5jb250YWluZXIuYmluZChJREVOVElGSUVSLlRyYW5zZm9ybUNvbXBvbmVudE1hbmFnZXIpLnRvQ29uc3RhbnRWYWx1ZShuZXcgQ29tcG9uZW50TWFuYWdlcihUcmFuc2Zvcm1Db21wb25lbnQpKTtcbmNvbnRhaW5lci5iaW5kKElERU5USUZJRVIuTWVzaENvbXBvbmVudE1hbmFnZXIpLnRvQ29uc3RhbnRWYWx1ZShuZXcgQ29tcG9uZW50TWFuYWdlcihNZXNoQ29tcG9uZW50KSk7XG5jb250YWluZXIuYmluZChJREVOVElGSUVSLkN1bGxhYmxlQ29tcG9uZW50TWFuYWdlcikudG9Db25zdGFudFZhbHVlKG5ldyBDb21wb25lbnRNYW5hZ2VyKEN1bGxhYmxlQ29tcG9uZW50KSk7XG5jb250YWluZXIuYmluZChJREVOVElGSUVSLkdlb21ldHJ5Q29tcG9uZW50TWFuYWdlcikudG9Db25zdGFudFZhbHVlKG5ldyBDb21wb25lbnRNYW5hZ2VyKEdlb21ldHJ5Q29tcG9uZW50KSk7XG5jb250YWluZXIuYmluZChJREVOVElGSUVSLk1hdGVyaWFsQ29tcG9uZW50TWFuYWdlcikudG9Db25zdGFudFZhbHVlKG5ldyBDb21wb25lbnRNYW5hZ2VyKE1hdGVyaWFsQ29tcG9uZW50KSk7IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9pbnZlcnNpZnkvSW52ZXJzaWZ5SlMvYmxvYi9tYXN0ZXIvd2lraS9oaWVyYXJjaGljYWxfZGkubWQjc3VwcG9ydC1mb3ItaGllcmFyY2hpY2FsLWRpLXN5c3RlbXNcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVdvcmxkQ29udGFpbmVyKCkge1xuICB2YXIgd29ybGRDb250YWluZXIgPSBuZXcgQ29udGFpbmVyKCk7XG4gIHdvcmxkQ29udGFpbmVyLnBhcmVudCA9IGNvbnRhaW5lcjtcbiAgLyoqXG4gICAqIGJpbmQgc3lzdGVtc1xuICAgKi9cblxuICB3b3JsZENvbnRhaW5lci5iaW5kKElERU5USUZJRVIuU3lzdGVtcykudG8oU2NlbmVHcmFwaFN5c3RlbSkuaW5TaW5nbGV0b25TY29wZSgpLndoZW5UYXJnZXROYW1lZChJREVOVElGSUVSLlNjZW5lR3JhcGhTeXN0ZW0pO1xuICB3b3JsZENvbnRhaW5lci5iaW5kKElERU5USUZJRVIuU3lzdGVtcykudG8oRnJhbWVHcmFwaFN5c3RlbSkuaW5TaW5nbGV0b25TY29wZSgpLndoZW5UYXJnZXROYW1lZChJREVOVElGSUVSLkZyYW1lR3JhcGhTeXN0ZW0pO1xuICB3b3JsZENvbnRhaW5lci5iaW5kKElERU5USUZJRVIuU3lzdGVtcykudG8oTWVzaFN5c3RlbSkuaW5TaW5nbGV0b25TY29wZSgpLndoZW5UYXJnZXROYW1lZChJREVOVElGSUVSLk1lc2hTeXN0ZW0pO1xuICB3b3JsZENvbnRhaW5lci5iaW5kKElERU5USUZJRVIuU3lzdGVtcykudG8oR2VvbWV0cnlTeXN0ZW0pLmluU2luZ2xldG9uU2NvcGUoKS53aGVuVGFyZ2V0TmFtZWQoSURFTlRJRklFUi5HZW9tZXRyeVN5c3RlbSk7XG4gIHdvcmxkQ29udGFpbmVyLmJpbmQoSURFTlRJRklFUi5TeXN0ZW1zKS50byhNYXRlcmlhbFN5c3RlbSkuaW5TaW5nbGV0b25TY29wZSgpLndoZW5UYXJnZXROYW1lZChJREVOVElGSUVSLk1hdGVyaWFsU3lzdGVtKTtcbiAgd29ybGRDb250YWluZXIuYmluZChJREVOVElGSUVSLlN5c3RlbXMpLnRvKFJlbmRlcmVyU3lzdGVtKS5pblNpbmdsZXRvblNjb3BlKCkud2hlblRhcmdldE5hbWVkKElERU5USUZJRVIuUmVuZGVyZXJTeXN0ZW0pOyAvLyDotYTmupDmsaBcblxuICB3b3JsZENvbnRhaW5lci5iaW5kKElERU5USUZJRVIuUmVzb3VyY2VQb29sKS50byhSZXNvdXJjZVBvb2wpLmluU2luZ2xldG9uU2NvcGUoKTtcbiAgd29ybGRDb250YWluZXIuYmluZChJREVOVElGSUVSLkNvbmZpZ1NlcnZpY2UpLnRvKENvbmZpZ1NlcnZpY2UpLmluU2luZ2xldG9uU2NvcGUoKTtcbiAgd29ybGRDb250YWluZXIuYmluZChJREVOVElGSUVSLkludGVyYWN0b3JTZXJ2aWNlKS50byhJbnRlcmFjdG9yU2VydmljZSkuaW5TaW5nbGV0b25TY29wZSgpO1xuICAvKipcbiAgICogYmluZCByZW5kZXIgcGFzc2VzXG4gICAqL1xuXG4gIHdvcmxkQ29udGFpbmVyLmJpbmQoSURFTlRJRklFUi5SZW5kZXJQYXNzKS50byhSZW5kZXJQYXNzKS5pblNpbmdsZXRvblNjb3BlKCkud2hlblRhcmdldE5hbWVkKFJlbmRlclBhc3MuSURFTlRJRklFUik7XG4gIHdvcmxkQ29udGFpbmVyLmJpbmQoSURFTlRJRklFUi5SZW5kZXJQYXNzKS50byhDb3B5UGFzcykuaW5TaW5nbGV0b25TY29wZSgpLndoZW5UYXJnZXROYW1lZChDb3B5UGFzcy5JREVOVElGSUVSKTtcbiAgd29ybGRDb250YWluZXIuYmluZChJREVOVElGSUVSLlJlbmRlclBhc3MpLnRvKFBpeGVsUGlja2luZ1Bhc3MpLmluU2luZ2xldG9uU2NvcGUoKS53aGVuVGFyZ2V0TmFtZWQoUGl4ZWxQaWNraW5nUGFzcy5JREVOVElGSUVSKTtcbiAgd29ybGRDb250YWluZXIuYmluZChJREVOVElGSUVSLlJlbmRlclBhc3NGYWN0b3J5KS50b0ZhY3RvcnkoZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgIHJldHVybiBjb250ZXh0LmNvbnRhaW5lci5nZXROYW1lZChJREVOVElGSUVSLlJlbmRlclBhc3MsIG5hbWUpO1xuICAgIH07XG4gIH0pO1xuICByZXR1cm4gd29ybGRDb250YWluZXI7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbnZlcnNpZnkuY29uZmlnLmpzLm1hcCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///92\n')},function(module,__webpack_exports__,__webpack_require__){"use strict";eval('/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return getArcParams; });\n/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(16);\n\n// 向量长度\nfunction vMag(v) {\n return Math.sqrt(v[0] * v[0] + v[1] * v[1]);\n}\n// u.v/|u||v|,计算夹角的余弦值\nfunction vRatio(u, v) {\n // 当存在一个向量的长度为 0 时,夹角也为 0,即夹角的余弦值为 1\n return vMag(u) * vMag(v) ? (u[0] * v[0] + u[1] * v[1]) / (vMag(u) * vMag(v)) : 1;\n}\n// 向量角度\nfunction vAngle(u, v) {\n return (u[0] * v[1] < u[1] * v[0] ? -1 : 1) * Math.acos(vRatio(u, v));\n}\n// A 0:rx 1:ry 2:x-axis-rotation 3:large-arc-flag 4:sweep-flag 5: x 6: y\nfunction getArcParams(startPoint, params) {\n var rx = params[1];\n var ry = params[2];\n var xRotation = Object(_util__WEBPACK_IMPORTED_MODULE_0__[/* mod */ "m"])(Object(_util__WEBPACK_IMPORTED_MODULE_0__[/* toRadian */ "o"])(params[3]), Math.PI * 2);\n var arcFlag = params[4];\n var sweepFlag = params[5];\n // 弧形起点坐标\n var x1 = startPoint[0];\n var y1 = startPoint[1];\n // 弧形终点坐标\n var x2 = params[6];\n var y2 = params[7];\n var xp = (Math.cos(xRotation) * (x1 - x2)) / 2.0 + (Math.sin(xRotation) * (y1 - y2)) / 2.0;\n var yp = (-1 * Math.sin(xRotation) * (x1 - x2)) / 2.0 + (Math.cos(xRotation) * (y1 - y2)) / 2.0;\n var lambda = (xp * xp) / (rx * rx) + (yp * yp) / (ry * ry);\n if (lambda > 1) {\n rx *= Math.sqrt(lambda);\n ry *= Math.sqrt(lambda);\n }\n var diff = rx * rx * (yp * yp) + ry * ry * (xp * xp);\n var f = diff ? Math.sqrt((rx * rx * (ry * ry) - diff) / diff) : 1;\n if (arcFlag === sweepFlag) {\n f *= -1;\n }\n if (isNaN(f)) {\n f = 0;\n }\n // 旋转前的起点坐标,且当长半轴和短半轴的长度为 0 时,坐标按 (0, 0) 处理\n var cxp = ry ? (f * rx * yp) / ry : 0;\n var cyp = rx ? (f * -ry * xp) / rx : 0;\n // 椭圆圆心坐标\n var cx = (x1 + x2) / 2.0 + Math.cos(xRotation) * cxp - Math.sin(xRotation) * cyp;\n var cy = (y1 + y2) / 2.0 + Math.sin(xRotation) * cxp + Math.cos(xRotation) * cyp;\n // 起始点的单位向量\n var u = [(xp - cxp) / rx, (yp - cyp) / ry];\n // 终止点的单位向量\n var v = [(-1 * xp - cxp) / rx, (-1 * yp - cyp) / ry];\n // 计算起始点和圆心的连线,与 x 轴正方向的夹角\n var theta = vAngle([1, 0], u);\n // 计算圆弧起始点和终止点与椭圆圆心连线的夹角\n var dTheta = vAngle(u, v);\n if (vRatio(u, v) <= -1) {\n dTheta = Math.PI;\n }\n if (vRatio(u, v) >= 1) {\n dTheta = 0;\n }\n if (sweepFlag === 0 && dTheta > 0) {\n dTheta = dTheta - 2 * Math.PI;\n }\n if (sweepFlag === 1 && dTheta < 0) {\n dTheta = dTheta + 2 * Math.PI;\n }\n return {\n cx: cx,\n cy: cy,\n // 弧形的起点和终点相同时,长轴和短轴的长度按 0 处理\n rx: Object(_util__WEBPACK_IMPORTED_MODULE_0__[/* isSamePoint */ "j"])(startPoint, [x2, y2]) ? 0 : rx,\n ry: Object(_util__WEBPACK_IMPORTED_MODULE_0__[/* isSamePoint */ "j"])(startPoint, [x2, y2]) ? 0 : ry,\n startAngle: theta,\n endAngle: theta + dTheta,\n xRotation: xRotation,\n arcFlag: arcFlag,\n sweepFlag: sweepFlag,\n };\n}\n//# sourceMappingURL=arc-params.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy1jYW52YXMvZXNtL3V0aWwvYXJjLXBhcmFtcy5qcz85YzI5Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBb0Q7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNlO0FBQ2Y7QUFDQTtBQUNBLG9CQUFvQix5REFBRyxDQUFDLDhEQUFRO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLGlFQUFXO0FBQ3ZCLFlBQVksaUVBQVc7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiI5My5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IG1vZCwgdG9SYWRpYW4sIGlzU2FtZVBvaW50IH0gZnJvbSAnLi91dGlsJztcbi8vIOWQkemHj+mVv+W6plxuZnVuY3Rpb24gdk1hZyh2KSB7XG4gICAgcmV0dXJuIE1hdGguc3FydCh2WzBdICogdlswXSArIHZbMV0gKiB2WzFdKTtcbn1cbi8vIHUudi98dXx8dnzvvIzorqHnrpflpLnop5LnmoTkvZnlvKblgLxcbmZ1bmN0aW9uIHZSYXRpbyh1LCB2KSB7XG4gICAgLy8g5b2T5a2Y5Zyo5LiA5Liq5ZCR6YeP55qE6ZW/5bqm5Li6IDAg5pe277yM5aS56KeS5Lmf5Li6IDDvvIzljbPlpLnop5LnmoTkvZnlvKblgLzkuLogMVxuICAgIHJldHVybiB2TWFnKHUpICogdk1hZyh2KSA/ICh1WzBdICogdlswXSArIHVbMV0gKiB2WzFdKSAvICh2TWFnKHUpICogdk1hZyh2KSkgOiAxO1xufVxuLy8g5ZCR6YeP6KeS5bqmXG5mdW5jdGlvbiB2QW5nbGUodSwgdikge1xuICAgIHJldHVybiAodVswXSAqIHZbMV0gPCB1WzFdICogdlswXSA/IC0xIDogMSkgKiBNYXRoLmFjb3ModlJhdGlvKHUsIHYpKTtcbn1cbi8vIEEgMDpyeCAxOnJ5IDI6eC1heGlzLXJvdGF0aW9uIDM6bGFyZ2UtYXJjLWZsYWcgNDpzd2VlcC1mbGFnIDU6IHggNjogeVxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0QXJjUGFyYW1zKHN0YXJ0UG9pbnQsIHBhcmFtcykge1xuICAgIHZhciByeCA9IHBhcmFtc1sxXTtcbiAgICB2YXIgcnkgPSBwYXJhbXNbMl07XG4gICAgdmFyIHhSb3RhdGlvbiA9IG1vZCh0b1JhZGlhbihwYXJhbXNbM10pLCBNYXRoLlBJICogMik7XG4gICAgdmFyIGFyY0ZsYWcgPSBwYXJhbXNbNF07XG4gICAgdmFyIHN3ZWVwRmxhZyA9IHBhcmFtc1s1XTtcbiAgICAvLyDlvKflvaLotbfngrnlnZDmoIdcbiAgICB2YXIgeDEgPSBzdGFydFBvaW50WzBdO1xuICAgIHZhciB5MSA9IHN0YXJ0UG9pbnRbMV07XG4gICAgLy8g5byn5b2i57uI54K55Z2Q5qCHXG4gICAgdmFyIHgyID0gcGFyYW1zWzZdO1xuICAgIHZhciB5MiA9IHBhcmFtc1s3XTtcbiAgICB2YXIgeHAgPSAoTWF0aC5jb3MoeFJvdGF0aW9uKSAqICh4MSAtIHgyKSkgLyAyLjAgKyAoTWF0aC5zaW4oeFJvdGF0aW9uKSAqICh5MSAtIHkyKSkgLyAyLjA7XG4gICAgdmFyIHlwID0gKC0xICogTWF0aC5zaW4oeFJvdGF0aW9uKSAqICh4MSAtIHgyKSkgLyAyLjAgKyAoTWF0aC5jb3MoeFJvdGF0aW9uKSAqICh5MSAtIHkyKSkgLyAyLjA7XG4gICAgdmFyIGxhbWJkYSA9ICh4cCAqIHhwKSAvIChyeCAqIHJ4KSArICh5cCAqIHlwKSAvIChyeSAqIHJ5KTtcbiAgICBpZiAobGFtYmRhID4gMSkge1xuICAgICAgICByeCAqPSBNYXRoLnNxcnQobGFtYmRhKTtcbiAgICAgICAgcnkgKj0gTWF0aC5zcXJ0KGxhbWJkYSk7XG4gICAgfVxuICAgIHZhciBkaWZmID0gcnggKiByeCAqICh5cCAqIHlwKSArIHJ5ICogcnkgKiAoeHAgKiB4cCk7XG4gICAgdmFyIGYgPSBkaWZmID8gTWF0aC5zcXJ0KChyeCAqIHJ4ICogKHJ5ICogcnkpIC0gZGlmZikgLyBkaWZmKSA6IDE7XG4gICAgaWYgKGFyY0ZsYWcgPT09IHN3ZWVwRmxhZykge1xuICAgICAgICBmICo9IC0xO1xuICAgIH1cbiAgICBpZiAoaXNOYU4oZikpIHtcbiAgICAgICAgZiA9IDA7XG4gICAgfVxuICAgIC8vIOaXi+i9rOWJjeeahOi1t+eCueWdkOagh++8jOS4lOW9k+mVv+WNiui9tOWSjOefreWNiui9tOeahOmVv+W6puS4uiAwIOaXtu+8jOWdkOagh+aMiSAoMCwgMCkg5aSE55CGXG4gICAgdmFyIGN4cCA9IHJ5ID8gKGYgKiByeCAqIHlwKSAvIHJ5IDogMDtcbiAgICB2YXIgY3lwID0gcnggPyAoZiAqIC1yeSAqIHhwKSAvIHJ4IDogMDtcbiAgICAvLyDmpK3lnIblnIblv4PlnZDmoIdcbiAgICB2YXIgY3ggPSAoeDEgKyB4MikgLyAyLjAgKyBNYXRoLmNvcyh4Um90YXRpb24pICogY3hwIC0gTWF0aC5zaW4oeFJvdGF0aW9uKSAqIGN5cDtcbiAgICB2YXIgY3kgPSAoeTEgKyB5MikgLyAyLjAgKyBNYXRoLnNpbih4Um90YXRpb24pICogY3hwICsgTWF0aC5jb3MoeFJvdGF0aW9uKSAqIGN5cDtcbiAgICAvLyDotbflp4vngrnnmoTljZXkvY3lkJHph49cbiAgICB2YXIgdSA9IFsoeHAgLSBjeHApIC8gcngsICh5cCAtIGN5cCkgLyByeV07XG4gICAgLy8g57uI5q2i54K555qE5Y2V5L2N5ZCR6YePXG4gICAgdmFyIHYgPSBbKC0xICogeHAgLSBjeHApIC8gcngsICgtMSAqIHlwIC0gY3lwKSAvIHJ5XTtcbiAgICAvLyDorqHnrpfotbflp4vngrnlkozlnIblv4PnmoTov57nur/vvIzkuI4geCDovbTmraPmlrnlkJHnmoTlpLnop5JcbiAgICB2YXIgdGhldGEgPSB2QW5nbGUoWzEsIDBdLCB1KTtcbiAgICAvLyDorqHnrpflnIblvKfotbflp4vngrnlkoznu4jmraLngrnkuI7mpK3lnIblnIblv4Pov57nur/nmoTlpLnop5JcbiAgICB2YXIgZFRoZXRhID0gdkFuZ2xlKHUsIHYpO1xuICAgIGlmICh2UmF0aW8odSwgdikgPD0gLTEpIHtcbiAgICAgICAgZFRoZXRhID0gTWF0aC5QSTtcbiAgICB9XG4gICAgaWYgKHZSYXRpbyh1LCB2KSA+PSAxKSB7XG4gICAgICAgIGRUaGV0YSA9IDA7XG4gICAgfVxuICAgIGlmIChzd2VlcEZsYWcgPT09IDAgJiYgZFRoZXRhID4gMCkge1xuICAgICAgICBkVGhldGEgPSBkVGhldGEgLSAyICogTWF0aC5QSTtcbiAgICB9XG4gICAgaWYgKHN3ZWVwRmxhZyA9PT0gMSAmJiBkVGhldGEgPCAwKSB7XG4gICAgICAgIGRUaGV0YSA9IGRUaGV0YSArIDIgKiBNYXRoLlBJO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBjeDogY3gsXG4gICAgICAgIGN5OiBjeSxcbiAgICAgICAgLy8g5byn5b2i55qE6LW354K55ZKM57uI54K555u45ZCM5pe277yM6ZW/6L205ZKM55+t6L2055qE6ZW/5bqm5oyJIDAg5aSE55CGXG4gICAgICAgIHJ4OiBpc1NhbWVQb2ludChzdGFydFBvaW50LCBbeDIsIHkyXSkgPyAwIDogcngsXG4gICAgICAgIHJ5OiBpc1NhbWVQb2ludChzdGFydFBvaW50LCBbeDIsIHkyXSkgPyAwIDogcnksXG4gICAgICAgIHN0YXJ0QW5nbGU6IHRoZXRhLFxuICAgICAgICBlbmRBbmdsZTogdGhldGEgKyBkVGhldGEsXG4gICAgICAgIHhSb3RhdGlvbjogeFJvdGF0aW9uLFxuICAgICAgICBhcmNGbGFnOiBhcmNGbGFnLFxuICAgICAgICBzd2VlcEZsYWc6IHN3ZWVwRmxhZyxcbiAgICB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YXJjLXBhcmFtcy5qcy5tYXAiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///93\n')},function(module,exports,__webpack_require__){eval('var __WEBPACK_AMD_DEFINE_RESULT__;// TinyColor v1.4.2\n// https://github.com/bgrins/TinyColor\n// Brian Grinstead, MIT License\n\n(function(Math) {\n\nvar trimLeft = /^\\s+/,\n trimRight = /\\s+$/,\n tinyCounter = 0,\n mathRound = Math.round,\n mathMin = Math.min,\n mathMax = Math.max,\n mathRandom = Math.random;\n\nfunction tinycolor (color, opts) {\n\n color = (color) ? color : \'\';\n opts = opts || { };\n\n // If input is already a tinycolor, return itself\n if (color instanceof tinycolor) {\n return color;\n }\n // If we are called as a function, call using new instead\n if (!(this instanceof tinycolor)) {\n return new tinycolor(color, opts);\n }\n\n var rgb = inputToRGB(color);\n this._originalInput = color,\n this._r = rgb.r,\n this._g = rgb.g,\n this._b = rgb.b,\n this._a = rgb.a,\n this._roundA = mathRound(100*this._a) / 100,\n this._format = opts.format || rgb.format;\n this._gradientType = opts.gradientType;\n\n // Don\'t let the range of [0,255] come back in [0,1].\n // Potentially lose a little bit of precision here, but will fix issues where\n // .5 gets interpreted as half of the total, instead of half of 1\n // If it was supposed to be 128, this was already taken care of by `inputToRgb`\n if (this._r < 1) { this._r = mathRound(this._r); }\n if (this._g < 1) { this._g = mathRound(this._g); }\n if (this._b < 1) { this._b = mathRound(this._b); }\n\n this._ok = rgb.ok;\n this._tc_id = tinyCounter++;\n}\n\ntinycolor.prototype = {\n isDark: function() {\n return this.getBrightness() < 128;\n },\n isLight: function() {\n return !this.isDark();\n },\n isValid: function() {\n return this._ok;\n },\n getOriginalInput: function() {\n return this._originalInput;\n },\n getFormat: function() {\n return this._format;\n },\n getAlpha: function() {\n return this._a;\n },\n getBrightness: function() {\n //http://www.w3.org/TR/AERT#color-contrast\n var rgb = this.toRgb();\n return (rgb.r * 299 + rgb.g * 587 + rgb.b * 114) / 1000;\n },\n getLuminance: function() {\n //http://www.w3.org/TR/2008/REC-WCAG20-20081211/#relativeluminancedef\n var rgb = this.toRgb();\n var RsRGB, GsRGB, BsRGB, R, G, B;\n RsRGB = rgb.r/255;\n GsRGB = rgb.g/255;\n BsRGB = rgb.b/255;\n\n if (RsRGB <= 0.03928) {R = RsRGB / 12.92;} else {R = Math.pow(((RsRGB + 0.055) / 1.055), 2.4);}\n if (GsRGB <= 0.03928) {G = GsRGB / 12.92;} else {G = Math.pow(((GsRGB + 0.055) / 1.055), 2.4);}\n if (BsRGB <= 0.03928) {B = BsRGB / 12.92;} else {B = Math.pow(((BsRGB + 0.055) / 1.055), 2.4);}\n return (0.2126 * R) + (0.7152 * G) + (0.0722 * B);\n },\n setAlpha: function(value) {\n this._a = boundAlpha(value);\n this._roundA = mathRound(100*this._a) / 100;\n return this;\n },\n toHsv: function() {\n var hsv = rgbToHsv(this._r, this._g, this._b);\n return { h: hsv.h * 360, s: hsv.s, v: hsv.v, a: this._a };\n },\n toHsvString: function() {\n var hsv = rgbToHsv(this._r, this._g, this._b);\n var h = mathRound(hsv.h * 360), s = mathRound(hsv.s * 100), v = mathRound(hsv.v * 100);\n return (this._a == 1) ?\n "hsv(" + h + ", " + s + "%, " + v + "%)" :\n "hsva(" + h + ", " + s + "%, " + v + "%, "+ this._roundA + ")";\n },\n toHsl: function() {\n var hsl = rgbToHsl(this._r, this._g, this._b);\n return { h: hsl.h * 360, s: hsl.s, l: hsl.l, a: this._a };\n },\n toHslString: function() {\n var hsl = rgbToHsl(this._r, this._g, this._b);\n var h = mathRound(hsl.h * 360), s = mathRound(hsl.s * 100), l = mathRound(hsl.l * 100);\n return (this._a == 1) ?\n "hsl(" + h + ", " + s + "%, " + l + "%)" :\n "hsla(" + h + ", " + s + "%, " + l + "%, "+ this._roundA + ")";\n },\n toHex: function(allow3Char) {\n return rgbToHex(this._r, this._g, this._b, allow3Char);\n },\n toHexString: function(allow3Char) {\n return \'#\' + this.toHex(allow3Char);\n },\n toHex8: function(allow4Char) {\n return rgbaToHex(this._r, this._g, this._b, this._a, allow4Char);\n },\n toHex8String: function(allow4Char) {\n return \'#\' + this.toHex8(allow4Char);\n },\n toRgb: function() {\n return { r: mathRound(this._r), g: mathRound(this._g), b: mathRound(this._b), a: this._a };\n },\n toRgbString: function() {\n return (this._a == 1) ?\n "rgb(" + mathRound(this._r) + ", " + mathRound(this._g) + ", " + mathRound(this._b) + ")" :\n "rgba(" + mathRound(this._r) + ", " + mathRound(this._g) + ", " + mathRound(this._b) + ", " + this._roundA + ")";\n },\n toPercentageRgb: function() {\n return { r: mathRound(bound01(this._r, 255) * 100) + "%", g: mathRound(bound01(this._g, 255) * 100) + "%", b: mathRound(bound01(this._b, 255) * 100) + "%", a: this._a };\n },\n toPercentageRgbString: function() {\n return (this._a == 1) ?\n "rgb(" + mathRound(bound01(this._r, 255) * 100) + "%, " + mathRound(bound01(this._g, 255) * 100) + "%, " + mathRound(bound01(this._b, 255) * 100) + "%)" :\n "rgba(" + mathRound(bound01(this._r, 255) * 100) + "%, " + mathRound(bound01(this._g, 255) * 100) + "%, " + mathRound(bound01(this._b, 255) * 100) + "%, " + this._roundA + ")";\n },\n toName: function() {\n if (this._a === 0) {\n return "transparent";\n }\n\n if (this._a < 1) {\n return false;\n }\n\n return hexNames[rgbToHex(this._r, this._g, this._b, true)] || false;\n },\n toFilter: function(secondColor) {\n var hex8String = \'#\' + rgbaToArgbHex(this._r, this._g, this._b, this._a);\n var secondHex8String = hex8String;\n var gradientType = this._gradientType ? "GradientType = 1, " : "";\n\n if (secondColor) {\n var s = tinycolor(secondColor);\n secondHex8String = \'#\' + rgbaToArgbHex(s._r, s._g, s._b, s._a);\n }\n\n return "progid:DXImageTransform.Microsoft.gradient("+gradientType+"startColorstr="+hex8String+",endColorstr="+secondHex8String+")";\n },\n toString: function(format) {\n var formatSet = !!format;\n format = format || this._format;\n\n var formattedString = false;\n var hasAlpha = this._a < 1 && this._a >= 0;\n var needsAlphaFormat = !formatSet && hasAlpha && (format === "hex" || format === "hex6" || format === "hex3" || format === "hex4" || format === "hex8" || format === "name");\n\n if (needsAlphaFormat) {\n // Special case for "transparent", all other non-alpha formats\n // will return rgba when there is transparency.\n if (format === "name" && this._a === 0) {\n return this.toName();\n }\n return this.toRgbString();\n }\n if (format === "rgb") {\n formattedString = this.toRgbString();\n }\n if (format === "prgb") {\n formattedString = this.toPercentageRgbString();\n }\n if (format === "hex" || format === "hex6") {\n formattedString = this.toHexString();\n }\n if (format === "hex3") {\n formattedString = this.toHexString(true);\n }\n if (format === "hex4") {\n formattedString = this.toHex8String(true);\n }\n if (format === "hex8") {\n formattedString = this.toHex8String();\n }\n if (format === "name") {\n formattedString = this.toName();\n }\n if (format === "hsl") {\n formattedString = this.toHslString();\n }\n if (format === "hsv") {\n formattedString = this.toHsvString();\n }\n\n return formattedString || this.toHexString();\n },\n clone: function() {\n return tinycolor(this.toString());\n },\n\n _applyModification: function(fn, args) {\n var color = fn.apply(null, [this].concat([].slice.call(args)));\n this._r = color._r;\n this._g = color._g;\n this._b = color._b;\n this.setAlpha(color._a);\n return this;\n },\n lighten: function() {\n return this._applyModification(lighten, arguments);\n },\n brighten: function() {\n return this._applyModification(brighten, arguments);\n },\n darken: function() {\n return this._applyModification(darken, arguments);\n },\n desaturate: function() {\n return this._applyModification(desaturate, arguments);\n },\n saturate: function() {\n return this._applyModification(saturate, arguments);\n },\n greyscale: function() {\n return this._applyModification(greyscale, arguments);\n },\n spin: function() {\n return this._applyModification(spin, arguments);\n },\n\n _applyCombination: function(fn, args) {\n return fn.apply(null, [this].concat([].slice.call(args)));\n },\n analogous: function() {\n return this._applyCombination(analogous, arguments);\n },\n complement: function() {\n return this._applyCombination(complement, arguments);\n },\n monochromatic: function() {\n return this._applyCombination(monochromatic, arguments);\n },\n splitcomplement: function() {\n return this._applyCombination(splitcomplement, arguments);\n },\n triad: function() {\n return this._applyCombination(triad, arguments);\n },\n tetrad: function() {\n return this._applyCombination(tetrad, arguments);\n }\n};\n\n// If input is an object, force 1 into "1.0" to handle ratios properly\n// String input requires "1.0" as input, so 1 will be treated as 1\ntinycolor.fromRatio = function(color, opts) {\n if (typeof color == "object") {\n var newColor = {};\n for (var i in color) {\n if (color.hasOwnProperty(i)) {\n if (i === "a") {\n newColor[i] = color[i];\n }\n else {\n newColor[i] = convertToPercentage(color[i]);\n }\n }\n }\n color = newColor;\n }\n\n return tinycolor(color, opts);\n};\n\n// Given a string or object, convert that input to RGB\n// Possible string inputs:\n//\n// "red"\n// "#f00" or "f00"\n// "#ff0000" or "ff0000"\n// "#ff000000" or "ff000000"\n// "rgb 255 0 0" or "rgb (255, 0, 0)"\n// "rgb 1.0 0 0" or "rgb (1, 0, 0)"\n// "rgba (255, 0, 0, 1)" or "rgba 255, 0, 0, 1"\n// "rgba (1.0, 0, 0, 1)" or "rgba 1.0, 0, 0, 1"\n// "hsl(0, 100%, 50%)" or "hsl 0 100% 50%"\n// "hsla(0, 100%, 50%, 1)" or "hsla 0 100% 50%, 1"\n// "hsv(0, 100%, 100%)" or "hsv 0 100% 100%"\n//\nfunction inputToRGB(color) {\n\n var rgb = { r: 0, g: 0, b: 0 };\n var a = 1;\n var s = null;\n var v = null;\n var l = null;\n var ok = false;\n var format = false;\n\n if (typeof color == "string") {\n color = stringInputToObject(color);\n }\n\n if (typeof color == "object") {\n if (isValidCSSUnit(color.r) && isValidCSSUnit(color.g) && isValidCSSUnit(color.b)) {\n rgb = rgbToRgb(color.r, color.g, color.b);\n ok = true;\n format = String(color.r).substr(-1) === "%" ? "prgb" : "rgb";\n }\n else if (isValidCSSUnit(color.h) && isValidCSSUnit(color.s) && isValidCSSUnit(color.v)) {\n s = convertToPercentage(color.s);\n v = convertToPercentage(color.v);\n rgb = hsvToRgb(color.h, s, v);\n ok = true;\n format = "hsv";\n }\n else if (isValidCSSUnit(color.h) && isValidCSSUnit(color.s) && isValidCSSUnit(color.l)) {\n s = convertToPercentage(color.s);\n l = convertToPercentage(color.l);\n rgb = hslToRgb(color.h, s, l);\n ok = true;\n format = "hsl";\n }\n\n if (color.hasOwnProperty("a")) {\n a = color.a;\n }\n }\n\n a = boundAlpha(a);\n\n return {\n ok: ok,\n format: color.format || format,\n r: mathMin(255, mathMax(rgb.r, 0)),\n g: mathMin(255, mathMax(rgb.g, 0)),\n b: mathMin(255, mathMax(rgb.b, 0)),\n a: a\n };\n}\n\n\n// Conversion Functions\n// --------------------\n\n// `rgbToHsl`, `rgbToHsv`, `hslToRgb`, `hsvToRgb` modified from:\n// \n\n// `rgbToRgb`\n// Handle bounds / percentage checking to conform to CSS color spec\n// \n// *Assumes:* r, g, b in [0, 255] or [0, 1]\n// *Returns:* { r, g, b } in [0, 255]\nfunction rgbToRgb(r, g, b){\n return {\n r: bound01(r, 255) * 255,\n g: bound01(g, 255) * 255,\n b: bound01(b, 255) * 255\n };\n}\n\n// `rgbToHsl`\n// Converts an RGB color value to HSL.\n// *Assumes:* r, g, and b are contained in [0, 255] or [0, 1]\n// *Returns:* { h, s, l } in [0,1]\nfunction rgbToHsl(r, g, b) {\n\n r = bound01(r, 255);\n g = bound01(g, 255);\n b = bound01(b, 255);\n\n var max = mathMax(r, g, b), min = mathMin(r, g, b);\n var h, s, l = (max + min) / 2;\n\n if(max == min) {\n h = s = 0; // achromatic\n }\n else {\n var d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n switch(max) {\n case r: h = (g - b) / d + (g < b ? 6 : 0); break;\n case g: h = (b - r) / d + 2; break;\n case b: h = (r - g) / d + 4; break;\n }\n\n h /= 6;\n }\n\n return { h: h, s: s, l: l };\n}\n\n// `hslToRgb`\n// Converts an HSL color value to RGB.\n// *Assumes:* h is contained in [0, 1] or [0, 360] and s and l are contained [0, 1] or [0, 100]\n// *Returns:* { r, g, b } in the set [0, 255]\nfunction hslToRgb(h, s, l) {\n var r, g, b;\n\n h = bound01(h, 360);\n s = bound01(s, 100);\n l = bound01(l, 100);\n\n function hue2rgb(p, q, t) {\n if(t < 0) t += 1;\n if(t > 1) t -= 1;\n if(t < 1/6) return p + (q - p) * 6 * t;\n if(t < 1/2) return q;\n if(t < 2/3) return p + (q - p) * (2/3 - t) * 6;\n return p;\n }\n\n if(s === 0) {\n r = g = b = l; // achromatic\n }\n else {\n var q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n var p = 2 * l - q;\n r = hue2rgb(p, q, h + 1/3);\n g = hue2rgb(p, q, h);\n b = hue2rgb(p, q, h - 1/3);\n }\n\n return { r: r * 255, g: g * 255, b: b * 255 };\n}\n\n// `rgbToHsv`\n// Converts an RGB color value to HSV\n// *Assumes:* r, g, and b are contained in the set [0, 255] or [0, 1]\n// *Returns:* { h, s, v } in [0,1]\nfunction rgbToHsv(r, g, b) {\n\n r = bound01(r, 255);\n g = bound01(g, 255);\n b = bound01(b, 255);\n\n var max = mathMax(r, g, b), min = mathMin(r, g, b);\n var h, s, v = max;\n\n var d = max - min;\n s = max === 0 ? 0 : d / max;\n\n if(max == min) {\n h = 0; // achromatic\n }\n else {\n switch(max) {\n case r: h = (g - b) / d + (g < b ? 6 : 0); break;\n case g: h = (b - r) / d + 2; break;\n case b: h = (r - g) / d + 4; break;\n }\n h /= 6;\n }\n return { h: h, s: s, v: v };\n}\n\n// `hsvToRgb`\n// Converts an HSV color value to RGB.\n// *Assumes:* h is contained in [0, 1] or [0, 360] and s and v are contained in [0, 1] or [0, 100]\n// *Returns:* { r, g, b } in the set [0, 255]\n function hsvToRgb(h, s, v) {\n\n h = bound01(h, 360) * 6;\n s = bound01(s, 100);\n v = bound01(v, 100);\n\n var i = Math.floor(h),\n f = h - i,\n p = v * (1 - s),\n q = v * (1 - f * s),\n t = v * (1 - (1 - f) * s),\n mod = i % 6,\n r = [v, q, p, p, t, v][mod],\n g = [t, v, v, q, p, p][mod],\n b = [p, p, t, v, v, q][mod];\n\n return { r: r * 255, g: g * 255, b: b * 255 };\n}\n\n// `rgbToHex`\n// Converts an RGB color to hex\n// Assumes r, g, and b are contained in the set [0, 255]\n// Returns a 3 or 6 character hex\nfunction rgbToHex(r, g, b, allow3Char) {\n\n var hex = [\n pad2(mathRound(r).toString(16)),\n pad2(mathRound(g).toString(16)),\n pad2(mathRound(b).toString(16))\n ];\n\n // Return a 3 character hex if possible\n if (allow3Char && hex[0].charAt(0) == hex[0].charAt(1) && hex[1].charAt(0) == hex[1].charAt(1) && hex[2].charAt(0) == hex[2].charAt(1)) {\n return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0);\n }\n\n return hex.join("");\n}\n\n// `rgbaToHex`\n// Converts an RGBA color plus alpha transparency to hex\n// Assumes r, g, b are contained in the set [0, 255] and\n// a in [0, 1]. Returns a 4 or 8 character rgba hex\nfunction rgbaToHex(r, g, b, a, allow4Char) {\n\n var hex = [\n pad2(mathRound(r).toString(16)),\n pad2(mathRound(g).toString(16)),\n pad2(mathRound(b).toString(16)),\n pad2(convertDecimalToHex(a))\n ];\n\n // Return a 4 character hex if possible\n if (allow4Char && hex[0].charAt(0) == hex[0].charAt(1) && hex[1].charAt(0) == hex[1].charAt(1) && hex[2].charAt(0) == hex[2].charAt(1) && hex[3].charAt(0) == hex[3].charAt(1)) {\n return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0) + hex[3].charAt(0);\n }\n\n return hex.join("");\n}\n\n// `rgbaToArgbHex`\n// Converts an RGBA color to an ARGB Hex8 string\n// Rarely used, but required for "toFilter()"\nfunction rgbaToArgbHex(r, g, b, a) {\n\n var hex = [\n pad2(convertDecimalToHex(a)),\n pad2(mathRound(r).toString(16)),\n pad2(mathRound(g).toString(16)),\n pad2(mathRound(b).toString(16))\n ];\n\n return hex.join("");\n}\n\n// `equals`\n// Can be called with any tinycolor input\ntinycolor.equals = function (color1, color2) {\n if (!color1 || !color2) { return false; }\n return tinycolor(color1).toRgbString() == tinycolor(color2).toRgbString();\n};\n\ntinycolor.random = function() {\n return tinycolor.fromRatio({\n r: mathRandom(),\n g: mathRandom(),\n b: mathRandom()\n });\n};\n\n\n// Modification Functions\n// ----------------------\n// Thanks to less.js for some of the basics here\n// \n\nfunction desaturate(color, amount) {\n amount = (amount === 0) ? 0 : (amount || 10);\n var hsl = tinycolor(color).toHsl();\n hsl.s -= amount / 100;\n hsl.s = clamp01(hsl.s);\n return tinycolor(hsl);\n}\n\nfunction saturate(color, amount) {\n amount = (amount === 0) ? 0 : (amount || 10);\n var hsl = tinycolor(color).toHsl();\n hsl.s += amount / 100;\n hsl.s = clamp01(hsl.s);\n return tinycolor(hsl);\n}\n\nfunction greyscale(color) {\n return tinycolor(color).desaturate(100);\n}\n\nfunction lighten (color, amount) {\n amount = (amount === 0) ? 0 : (amount || 10);\n var hsl = tinycolor(color).toHsl();\n hsl.l += amount / 100;\n hsl.l = clamp01(hsl.l);\n return tinycolor(hsl);\n}\n\nfunction brighten(color, amount) {\n amount = (amount === 0) ? 0 : (amount || 10);\n var rgb = tinycolor(color).toRgb();\n rgb.r = mathMax(0, mathMin(255, rgb.r - mathRound(255 * - (amount / 100))));\n rgb.g = mathMax(0, mathMin(255, rgb.g - mathRound(255 * - (amount / 100))));\n rgb.b = mathMax(0, mathMin(255, rgb.b - mathRound(255 * - (amount / 100))));\n return tinycolor(rgb);\n}\n\nfunction darken (color, amount) {\n amount = (amount === 0) ? 0 : (amount || 10);\n var hsl = tinycolor(color).toHsl();\n hsl.l -= amount / 100;\n hsl.l = clamp01(hsl.l);\n return tinycolor(hsl);\n}\n\n// Spin takes a positive or negative amount within [-360, 360] indicating the change of hue.\n// Values outside of this range will be wrapped into this range.\nfunction spin(color, amount) {\n var hsl = tinycolor(color).toHsl();\n var hue = (hsl.h + amount) % 360;\n hsl.h = hue < 0 ? 360 + hue : hue;\n return tinycolor(hsl);\n}\n\n// Combination Functions\n// ---------------------\n// Thanks to jQuery xColor for some of the ideas behind these\n// \n\nfunction complement(color) {\n var hsl = tinycolor(color).toHsl();\n hsl.h = (hsl.h + 180) % 360;\n return tinycolor(hsl);\n}\n\nfunction triad(color) {\n var hsl = tinycolor(color).toHsl();\n var h = hsl.h;\n return [\n tinycolor(color),\n tinycolor({ h: (h + 120) % 360, s: hsl.s, l: hsl.l }),\n tinycolor({ h: (h + 240) % 360, s: hsl.s, l: hsl.l })\n ];\n}\n\nfunction tetrad(color) {\n var hsl = tinycolor(color).toHsl();\n var h = hsl.h;\n return [\n tinycolor(color),\n tinycolor({ h: (h + 90) % 360, s: hsl.s, l: hsl.l }),\n tinycolor({ h: (h + 180) % 360, s: hsl.s, l: hsl.l }),\n tinycolor({ h: (h + 270) % 360, s: hsl.s, l: hsl.l })\n ];\n}\n\nfunction splitcomplement(color) {\n var hsl = tinycolor(color).toHsl();\n var h = hsl.h;\n return [\n tinycolor(color),\n tinycolor({ h: (h + 72) % 360, s: hsl.s, l: hsl.l}),\n tinycolor({ h: (h + 216) % 360, s: hsl.s, l: hsl.l})\n ];\n}\n\nfunction analogous(color, results, slices) {\n results = results || 6;\n slices = slices || 30;\n\n var hsl = tinycolor(color).toHsl();\n var part = 360 / slices;\n var ret = [tinycolor(color)];\n\n for (hsl.h = ((hsl.h - (part * results >> 1)) + 720) % 360; --results; ) {\n hsl.h = (hsl.h + part) % 360;\n ret.push(tinycolor(hsl));\n }\n return ret;\n}\n\nfunction monochromatic(color, results) {\n results = results || 6;\n var hsv = tinycolor(color).toHsv();\n var h = hsv.h, s = hsv.s, v = hsv.v;\n var ret = [];\n var modification = 1 / results;\n\n while (results--) {\n ret.push(tinycolor({ h: h, s: s, v: v}));\n v = (v + modification) % 1;\n }\n\n return ret;\n}\n\n// Utility Functions\n// ---------------------\n\ntinycolor.mix = function(color1, color2, amount) {\n amount = (amount === 0) ? 0 : (amount || 50);\n\n var rgb1 = tinycolor(color1).toRgb();\n var rgb2 = tinycolor(color2).toRgb();\n\n var p = amount / 100;\n\n var rgba = {\n r: ((rgb2.r - rgb1.r) * p) + rgb1.r,\n g: ((rgb2.g - rgb1.g) * p) + rgb1.g,\n b: ((rgb2.b - rgb1.b) * p) + rgb1.b,\n a: ((rgb2.a - rgb1.a) * p) + rgb1.a\n };\n\n return tinycolor(rgba);\n};\n\n\n// Readability Functions\n// ---------------------\n// false\n// tinycolor.isReadable("#000", "#111",{level:"AA",size:"large"}) => false\ntinycolor.isReadable = function(color1, color2, wcag2) {\n var readability = tinycolor.readability(color1, color2);\n var wcag2Parms, out;\n\n out = false;\n\n wcag2Parms = validateWCAG2Parms(wcag2);\n switch (wcag2Parms.level + wcag2Parms.size) {\n case "AAsmall":\n case "AAAlarge":\n out = readability >= 4.5;\n break;\n case "AAlarge":\n out = readability >= 3;\n break;\n case "AAAsmall":\n out = readability >= 7;\n break;\n }\n return out;\n\n};\n\n// `mostReadable`\n// Given a base color and a list of possible foreground or background\n// colors for that base, returns the most readable color.\n// Optionally returns Black or White if the most readable color is unreadable.\n// *Example*\n// tinycolor.mostReadable(tinycolor.mostReadable("#123", ["#124", "#125"],{includeFallbackColors:false}).toHexString(); // "#112255"\n// tinycolor.mostReadable(tinycolor.mostReadable("#123", ["#124", "#125"],{includeFallbackColors:true}).toHexString(); // "#ffffff"\n// tinycolor.mostReadable("#a8015a", ["#faf3f3"],{includeFallbackColors:true,level:"AAA",size:"large"}).toHexString(); // "#faf3f3"\n// tinycolor.mostReadable("#a8015a", ["#faf3f3"],{includeFallbackColors:true,level:"AAA",size:"small"}).toHexString(); // "#ffffff"\ntinycolor.mostReadable = function(baseColor, colorList, args) {\n var bestColor = null;\n var bestScore = 0;\n var readability;\n var includeFallbackColors, level, size ;\n args = args || {};\n includeFallbackColors = args.includeFallbackColors ;\n level = args.level;\n size = args.size;\n\n for (var i= 0; i < colorList.length ; i++) {\n readability = tinycolor.readability(baseColor, colorList[i]);\n if (readability > bestScore) {\n bestScore = readability;\n bestColor = tinycolor(colorList[i]);\n }\n }\n\n if (tinycolor.isReadable(baseColor, bestColor, {"level":level,"size":size}) || !includeFallbackColors) {\n return bestColor;\n }\n else {\n args.includeFallbackColors=false;\n return tinycolor.mostReadable(baseColor,["#fff", "#000"],args);\n }\n};\n\n\n// Big List of Colors\n// ------------------\n// \nvar names = tinycolor.names = {\n aliceblue: "f0f8ff",\n antiquewhite: "faebd7",\n aqua: "0ff",\n aquamarine: "7fffd4",\n azure: "f0ffff",\n beige: "f5f5dc",\n bisque: "ffe4c4",\n black: "000",\n blanchedalmond: "ffebcd",\n blue: "00f",\n blueviolet: "8a2be2",\n brown: "a52a2a",\n burlywood: "deb887",\n burntsienna: "ea7e5d",\n cadetblue: "5f9ea0",\n chartreuse: "7fff00",\n chocolate: "d2691e",\n coral: "ff7f50",\n cornflowerblue: "6495ed",\n cornsilk: "fff8dc",\n crimson: "dc143c",\n cyan: "0ff",\n darkblue: "00008b",\n darkcyan: "008b8b",\n darkgoldenrod: "b8860b",\n darkgray: "a9a9a9",\n darkgreen: "006400",\n darkgrey: "a9a9a9",\n darkkhaki: "bdb76b",\n darkmagenta: "8b008b",\n darkolivegreen: "556b2f",\n darkorange: "ff8c00",\n darkorchid: "9932cc",\n darkred: "8b0000",\n darksalmon: "e9967a",\n darkseagreen: "8fbc8f",\n darkslateblue: "483d8b",\n darkslategray: "2f4f4f",\n darkslategrey: "2f4f4f",\n darkturquoise: "00ced1",\n darkviolet: "9400d3",\n deeppink: "ff1493",\n deepskyblue: "00bfff",\n dimgray: "696969",\n dimgrey: "696969",\n dodgerblue: "1e90ff",\n firebrick: "b22222",\n floralwhite: "fffaf0",\n forestgreen: "228b22",\n fuchsia: "f0f",\n gainsboro: "dcdcdc",\n ghostwhite: "f8f8ff",\n gold: "ffd700",\n goldenrod: "daa520",\n gray: "808080",\n green: "008000",\n greenyellow: "adff2f",\n grey: "808080",\n honeydew: "f0fff0",\n hotpink: "ff69b4",\n indianred: "cd5c5c",\n indigo: "4b0082",\n ivory: "fffff0",\n khaki: "f0e68c",\n lavender: "e6e6fa",\n lavenderblush: "fff0f5",\n lawngreen: "7cfc00",\n lemonchiffon: "fffacd",\n lightblue: "add8e6",\n lightcoral: "f08080",\n lightcyan: "e0ffff",\n lightgoldenrodyellow: "fafad2",\n lightgray: "d3d3d3",\n lightgreen: "90ee90",\n lightgrey: "d3d3d3",\n lightpink: "ffb6c1",\n lightsalmon: "ffa07a",\n lightseagreen: "20b2aa",\n lightskyblue: "87cefa",\n lightslategray: "789",\n lightslategrey: "789",\n lightsteelblue: "b0c4de",\n lightyellow: "ffffe0",\n lime: "0f0",\n limegreen: "32cd32",\n linen: "faf0e6",\n magenta: "f0f",\n maroon: "800000",\n mediumaquamarine: "66cdaa",\n mediumblue: "0000cd",\n mediumorchid: "ba55d3",\n mediumpurple: "9370db",\n mediumseagreen: "3cb371",\n mediumslateblue: "7b68ee",\n mediumspringgreen: "00fa9a",\n mediumturquoise: "48d1cc",\n mediumvioletred: "c71585",\n midnightblue: "191970",\n mintcream: "f5fffa",\n mistyrose: "ffe4e1",\n moccasin: "ffe4b5",\n navajowhite: "ffdead",\n navy: "000080",\n oldlace: "fdf5e6",\n olive: "808000",\n olivedrab: "6b8e23",\n orange: "ffa500",\n orangered: "ff4500",\n orchid: "da70d6",\n palegoldenrod: "eee8aa",\n palegreen: "98fb98",\n paleturquoise: "afeeee",\n palevioletred: "db7093",\n papayawhip: "ffefd5",\n peachpuff: "ffdab9",\n peru: "cd853f",\n pink: "ffc0cb",\n plum: "dda0dd",\n powderblue: "b0e0e6",\n purple: "800080",\n rebeccapurple: "663399",\n red: "f00",\n rosybrown: "bc8f8f",\n royalblue: "4169e1",\n saddlebrown: "8b4513",\n salmon: "fa8072",\n sandybrown: "f4a460",\n seagreen: "2e8b57",\n seashell: "fff5ee",\n sienna: "a0522d",\n silver: "c0c0c0",\n skyblue: "87ceeb",\n slateblue: "6a5acd",\n slategray: "708090",\n slategrey: "708090",\n snow: "fffafa",\n springgreen: "00ff7f",\n steelblue: "4682b4",\n tan: "d2b48c",\n teal: "008080",\n thistle: "d8bfd8",\n tomato: "ff6347",\n turquoise: "40e0d0",\n violet: "ee82ee",\n wheat: "f5deb3",\n white: "fff",\n whitesmoke: "f5f5f5",\n yellow: "ff0",\n yellowgreen: "9acd32"\n};\n\n// Make it easy to access colors via `hexNames[hex]`\nvar hexNames = tinycolor.hexNames = flip(names);\n\n\n// Utilities\n// ---------\n\n// `{ \'name1\': \'val1\' }` becomes `{ \'val1\': \'name1\' }`\nfunction flip(o) {\n var flipped = { };\n for (var i in o) {\n if (o.hasOwnProperty(i)) {\n flipped[o[i]] = i;\n }\n }\n return flipped;\n}\n\n// Return a valid alpha value [0,1] with all invalid values being set to 1\nfunction boundAlpha(a) {\n a = parseFloat(a);\n\n if (isNaN(a) || a < 0 || a > 1) {\n a = 1;\n }\n\n return a;\n}\n\n// Take input from [0, n] and return it as [0, 1]\nfunction bound01(n, max) {\n if (isOnePointZero(n)) { n = "100%"; }\n\n var processPercent = isPercentage(n);\n n = mathMin(max, mathMax(0, parseFloat(n)));\n\n // Automatically convert percentage into number\n if (processPercent) {\n n = parseInt(n * max, 10) / 100;\n }\n\n // Handle floating point rounding errors\n if ((Math.abs(n - max) < 0.000001)) {\n return 1;\n }\n\n // Convert into [0, 1] range if it isn\'t already\n return (n % max) / parseFloat(max);\n}\n\n// Force a number between 0 and 1\nfunction clamp01(val) {\n return mathMin(1, mathMax(0, val));\n}\n\n// Parse a base-16 hex value into a base-10 integer\nfunction parseIntFromHex(val) {\n return parseInt(val, 16);\n}\n\n// Need to handle 1.0 as 100%, since once it is a number, there is no difference between it and 1\n// \nfunction isOnePointZero(n) {\n return typeof n == "string" && n.indexOf(\'.\') != -1 && parseFloat(n) === 1;\n}\n\n// Check to see if string passed in is a percentage\nfunction isPercentage(n) {\n return typeof n === "string" && n.indexOf(\'%\') != -1;\n}\n\n// Force a hex value to have 2 characters\nfunction pad2(c) {\n return c.length == 1 ? \'0\' + c : \'\' + c;\n}\n\n// Replace a decimal with it\'s percentage value\nfunction convertToPercentage(n) {\n if (n <= 1) {\n n = (n * 100) + "%";\n }\n\n return n;\n}\n\n// Converts a decimal to a hex value\nfunction convertDecimalToHex(d) {\n return Math.round(parseFloat(d) * 255).toString(16);\n}\n// Converts a hex value to a decimal\nfunction convertHexToDecimal(h) {\n return (parseIntFromHex(h) / 255);\n}\n\nvar matchers = (function() {\n\n // \n var CSS_INTEGER = "[-\\\\+]?\\\\d+%?";\n\n // \n var CSS_NUMBER = "[-\\\\+]?\\\\d*\\\\.\\\\d+%?";\n\n // Allow positive/negative integer/number. Don\'t capture the either/or, just the entire outcome.\n var CSS_UNIT = "(?:" + CSS_NUMBER + ")|(?:" + CSS_INTEGER + ")";\n\n // Actual matching.\n // Parentheses and commas are optional, but not required.\n // Whitespace can take the place of commas or opening paren\n var PERMISSIVE_MATCH3 = "[\\\\s|\\\\(]+(" + CSS_UNIT + ")[,|\\\\s]+(" + CSS_UNIT + ")[,|\\\\s]+(" + CSS_UNIT + ")\\\\s*\\\\)?";\n var PERMISSIVE_MATCH4 = "[\\\\s|\\\\(]+(" + CSS_UNIT + ")[,|\\\\s]+(" + CSS_UNIT + ")[,|\\\\s]+(" + CSS_UNIT + ")[,|\\\\s]+(" + CSS_UNIT + ")\\\\s*\\\\)?";\n\n return {\n CSS_UNIT: new RegExp(CSS_UNIT),\n rgb: new RegExp("rgb" + PERMISSIVE_MATCH3),\n rgba: new RegExp("rgba" + PERMISSIVE_MATCH4),\n hsl: new RegExp("hsl" + PERMISSIVE_MATCH3),\n hsla: new RegExp("hsla" + PERMISSIVE_MATCH4),\n hsv: new RegExp("hsv" + PERMISSIVE_MATCH3),\n hsva: new RegExp("hsva" + PERMISSIVE_MATCH4),\n hex3: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,\n hex6: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,\n hex4: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,\n hex8: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/\n };\n})();\n\n// `isValidCSSUnit`\n// Take in a single string / number and check to see if it looks like a CSS unit\n// (see `matchers` above for definition).\nfunction isValidCSSUnit(color) {\n return !!matchers.CSS_UNIT.exec(color);\n}\n\n// `stringInputToObject`\n// Permissive string parsing. Take in a number of formats, and output an object\n// based on detected format. Returns `{ r, g, b }` or `{ h, s, l }` or `{ h, s, v}`\nfunction stringInputToObject(color) {\n\n color = color.replace(trimLeft,\'\').replace(trimRight, \'\').toLowerCase();\n var named = false;\n if (names[color]) {\n color = names[color];\n named = true;\n }\n else if (color == \'transparent\') {\n return { r: 0, g: 0, b: 0, a: 0, format: "name" };\n }\n\n // Try to match string input using regular expressions.\n // Keep most of the number bounding out of this function - don\'t worry about [0,1] or [0,100] or [0,360]\n // Just return an object and let the conversion functions handle that.\n // This way the result will be the same whether the tinycolor is initialized with string or object.\n var match;\n if ((match = matchers.rgb.exec(color))) {\n return { r: match[1], g: match[2], b: match[3] };\n }\n if ((match = matchers.rgba.exec(color))) {\n return { r: match[1], g: match[2], b: match[3], a: match[4] };\n }\n if ((match = matchers.hsl.exec(color))) {\n return { h: match[1], s: match[2], l: match[3] };\n }\n if ((match = matchers.hsla.exec(color))) {\n return { h: match[1], s: match[2], l: match[3], a: match[4] };\n }\n if ((match = matchers.hsv.exec(color))) {\n return { h: match[1], s: match[2], v: match[3] };\n }\n if ((match = matchers.hsva.exec(color))) {\n return { h: match[1], s: match[2], v: match[3], a: match[4] };\n }\n if ((match = matchers.hex8.exec(color))) {\n return {\n r: parseIntFromHex(match[1]),\n g: parseIntFromHex(match[2]),\n b: parseIntFromHex(match[3]),\n a: convertHexToDecimal(match[4]),\n format: named ? "name" : "hex8"\n };\n }\n if ((match = matchers.hex6.exec(color))) {\n return {\n r: parseIntFromHex(match[1]),\n g: parseIntFromHex(match[2]),\n b: parseIntFromHex(match[3]),\n format: named ? "name" : "hex"\n };\n }\n if ((match = matchers.hex4.exec(color))) {\n return {\n r: parseIntFromHex(match[1] + \'\' + match[1]),\n g: parseIntFromHex(match[2] + \'\' + match[2]),\n b: parseIntFromHex(match[3] + \'\' + match[3]),\n a: convertHexToDecimal(match[4] + \'\' + match[4]),\n format: named ? "name" : "hex8"\n };\n }\n if ((match = matchers.hex3.exec(color))) {\n return {\n r: parseIntFromHex(match[1] + \'\' + match[1]),\n g: parseIntFromHex(match[2] + \'\' + match[2]),\n b: parseIntFromHex(match[3] + \'\' + match[3]),\n format: named ? "name" : "hex"\n };\n }\n\n return false;\n}\n\nfunction validateWCAG2Parms(parms) {\n // return valid WCAG2 parms for isReadable.\n // If input parms are invalid, return {"level":"AA", "size":"small"}\n var level, size;\n parms = parms || {"level":"AA", "size":"small"};\n level = (parms.level || "AA").toUpperCase();\n size = (parms.size || "small").toLowerCase();\n if (level !== "AA" && level !== "AAA") {\n level = "AA";\n }\n if (size !== "small" && size !== "large") {\n size = "small";\n }\n return {"level":level, "size":size};\n}\n\n// Node: Export function\nif ( true && module.exports) {\n module.exports = tinycolor;\n}\n// AMD/requirejs: Define the module\nelse if (true) {\n !(__WEBPACK_AMD_DEFINE_RESULT__ = (function () {return tinycolor;}).call(exports, __webpack_require__, exports, module),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n}\n// Browser: Expose to window\nelse {}\n\n})(Math);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdGlueWNvbG9yMi90aW55Y29sb3IuanM/NjZjYiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxvQkFBb0I7O0FBRXBCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLDhCQUE4QjtBQUNwRCxzQkFBc0IsOEJBQThCO0FBQ3BELHNCQUFzQiw4QkFBOEI7O0FBRXBEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLCtCQUErQixtQkFBbUIsT0FBTztBQUN6RCwrQkFBK0IsbUJBQW1CLE9BQU87QUFDekQsK0JBQStCLG1CQUFtQixPQUFPO0FBQ3pEO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEIsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLGdCQUFnQjtBQUNoQixLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxnQkFBZ0I7QUFDaEIsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBLEtBQUssa0JBQWtCLFlBQVksa0JBQWtCO0FBQ3JEO0FBQ0EsbUJBQW1CO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsNEJBQTRCLFlBQVk7O0FBRXhDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLEVBQUUsY0FBYyxFQUFFLGNBQWMsRUFBRTtBQUNqRSwrQkFBK0IsRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFO0FBQ2pFLCtCQUErQixFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFO0FBQ2pGLCtCQUErQixFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFO0FBQ2pGO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHdDQUF3QyxVQUFVLE9BQU8sVUFBVSxPQUFPLFNBQVM7QUFDbkY7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDJDQUEyQztBQUMzQztBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaOztBQUVBO0FBQ0EsSUFBSSxLQUE2QjtBQUNqQztBQUNBO0FBQ0E7QUFDQSxTQUFTLElBQTBDO0FBQ25ELElBQUksbUNBQU8sYUFBYSxrQkFBa0I7QUFBQSxvR0FBQztBQUMzQztBQUNBO0FBQ0EsS0FBSyxFQUVKOztBQUVELENBQUMiLCJmaWxlIjoiOTQuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBUaW55Q29sb3IgdjEuNC4yXG4vLyBodHRwczovL2dpdGh1Yi5jb20vYmdyaW5zL1RpbnlDb2xvclxuLy8gQnJpYW4gR3JpbnN0ZWFkLCBNSVQgTGljZW5zZVxuXG4oZnVuY3Rpb24oTWF0aCkge1xuXG52YXIgdHJpbUxlZnQgPSAvXlxccysvLFxuICAgIHRyaW1SaWdodCA9IC9cXHMrJC8sXG4gICAgdGlueUNvdW50ZXIgPSAwLFxuICAgIG1hdGhSb3VuZCA9IE1hdGgucm91bmQsXG4gICAgbWF0aE1pbiA9IE1hdGgubWluLFxuICAgIG1hdGhNYXggPSBNYXRoLm1heCxcbiAgICBtYXRoUmFuZG9tID0gTWF0aC5yYW5kb207XG5cbmZ1bmN0aW9uIHRpbnljb2xvciAoY29sb3IsIG9wdHMpIHtcblxuICAgIGNvbG9yID0gKGNvbG9yKSA/IGNvbG9yIDogJyc7XG4gICAgb3B0cyA9IG9wdHMgfHwgeyB9O1xuXG4gICAgLy8gSWYgaW5wdXQgaXMgYWxyZWFkeSBhIHRpbnljb2xvciwgcmV0dXJuIGl0c2VsZlxuICAgIGlmIChjb2xvciBpbnN0YW5jZW9mIHRpbnljb2xvcikge1xuICAgICAgIHJldHVybiBjb2xvcjtcbiAgICB9XG4gICAgLy8gSWYgd2UgYXJlIGNhbGxlZCBhcyBhIGZ1bmN0aW9uLCBjYWxsIHVzaW5nIG5ldyBpbnN0ZWFkXG4gICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIHRpbnljb2xvcikpIHtcbiAgICAgICAgcmV0dXJuIG5ldyB0aW55Y29sb3IoY29sb3IsIG9wdHMpO1xuICAgIH1cblxuICAgIHZhciByZ2IgPSBpbnB1dFRvUkdCKGNvbG9yKTtcbiAgICB0aGlzLl9vcmlnaW5hbElucHV0ID0gY29sb3IsXG4gICAgdGhpcy5fciA9IHJnYi5yLFxuICAgIHRoaXMuX2cgPSByZ2IuZyxcbiAgICB0aGlzLl9iID0gcmdiLmIsXG4gICAgdGhpcy5fYSA9IHJnYi5hLFxuICAgIHRoaXMuX3JvdW5kQSA9IG1hdGhSb3VuZCgxMDAqdGhpcy5fYSkgLyAxMDAsXG4gICAgdGhpcy5fZm9ybWF0ID0gb3B0cy5mb3JtYXQgfHwgcmdiLmZvcm1hdDtcbiAgICB0aGlzLl9ncmFkaWVudFR5cGUgPSBvcHRzLmdyYWRpZW50VHlwZTtcblxuICAgIC8vIERvbid0IGxldCB0aGUgcmFuZ2Ugb2YgWzAsMjU1XSBjb21lIGJhY2sgaW4gWzAsMV0uXG4gICAgLy8gUG90ZW50aWFsbHkgbG9zZSBhIGxpdHRsZSBiaXQgb2YgcHJlY2lzaW9uIGhlcmUsIGJ1dCB3aWxsIGZpeCBpc3N1ZXMgd2hlcmVcbiAgICAvLyAuNSBnZXRzIGludGVycHJldGVkIGFzIGhhbGYgb2YgdGhlIHRvdGFsLCBpbnN0ZWFkIG9mIGhhbGYgb2YgMVxuICAgIC8vIElmIGl0IHdhcyBzdXBwb3NlZCB0byBiZSAxMjgsIHRoaXMgd2FzIGFscmVhZHkgdGFrZW4gY2FyZSBvZiBieSBgaW5wdXRUb1JnYmBcbiAgICBpZiAodGhpcy5fciA8IDEpIHsgdGhpcy5fciA9IG1hdGhSb3VuZCh0aGlzLl9yKTsgfVxuICAgIGlmICh0aGlzLl9nIDwgMSkgeyB0aGlzLl9nID0gbWF0aFJvdW5kKHRoaXMuX2cpOyB9XG4gICAgaWYgKHRoaXMuX2IgPCAxKSB7IHRoaXMuX2IgPSBtYXRoUm91bmQodGhpcy5fYik7IH1cblxuICAgIHRoaXMuX29rID0gcmdiLm9rO1xuICAgIHRoaXMuX3RjX2lkID0gdGlueUNvdW50ZXIrKztcbn1cblxudGlueWNvbG9yLnByb3RvdHlwZSA9IHtcbiAgICBpc0Rhcms6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRCcmlnaHRuZXNzKCkgPCAxMjg7XG4gICAgfSxcbiAgICBpc0xpZ2h0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmlzRGFyaygpO1xuICAgIH0sXG4gICAgaXNWYWxpZDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9vaztcbiAgICB9LFxuICAgIGdldE9yaWdpbmFsSW5wdXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX29yaWdpbmFsSW5wdXQ7XG4gICAgfSxcbiAgICBnZXRGb3JtYXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZm9ybWF0O1xuICAgIH0sXG4gICAgZ2V0QWxwaGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYTtcbiAgICB9LFxuICAgIGdldEJyaWdodG5lc3M6IGZ1bmN0aW9uKCkge1xuICAgICAgICAvL2h0dHA6Ly93d3cudzMub3JnL1RSL0FFUlQjY29sb3ItY29udHJhc3RcbiAgICAgICAgdmFyIHJnYiA9IHRoaXMudG9SZ2IoKTtcbiAgICAgICAgcmV0dXJuIChyZ2IuciAqIDI5OSArIHJnYi5nICogNTg3ICsgcmdiLmIgKiAxMTQpIC8gMTAwMDtcbiAgICB9LFxuICAgIGdldEx1bWluYW5jZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vaHR0cDovL3d3dy53My5vcmcvVFIvMjAwOC9SRUMtV0NBRzIwLTIwMDgxMjExLyNyZWxhdGl2ZWx1bWluYW5jZWRlZlxuICAgICAgICB2YXIgcmdiID0gdGhpcy50b1JnYigpO1xuICAgICAgICB2YXIgUnNSR0IsIEdzUkdCLCBCc1JHQiwgUiwgRywgQjtcbiAgICAgICAgUnNSR0IgPSByZ2Iuci8yNTU7XG4gICAgICAgIEdzUkdCID0gcmdiLmcvMjU1O1xuICAgICAgICBCc1JHQiA9IHJnYi5iLzI1NTtcblxuICAgICAgICBpZiAoUnNSR0IgPD0gMC4wMzkyOCkge1IgPSBSc1JHQiAvIDEyLjkyO30gZWxzZSB7UiA9IE1hdGgucG93KCgoUnNSR0IgKyAwLjA1NSkgLyAxLjA1NSksIDIuNCk7fVxuICAgICAgICBpZiAoR3NSR0IgPD0gMC4wMzkyOCkge0cgPSBHc1JHQiAvIDEyLjkyO30gZWxzZSB7RyA9IE1hdGgucG93KCgoR3NSR0IgKyAwLjA1NSkgLyAxLjA1NSksIDIuNCk7fVxuICAgICAgICBpZiAoQnNSR0IgPD0gMC4wMzkyOCkge0IgPSBCc1JHQiAvIDEyLjkyO30gZWxzZSB7QiA9IE1hdGgucG93KCgoQnNSR0IgKyAwLjA1NSkgLyAxLjA1NSksIDIuNCk7fVxuICAgICAgICByZXR1cm4gKDAuMjEyNiAqIFIpICsgKDAuNzE1MiAqIEcpICsgKDAuMDcyMiAqIEIpO1xuICAgIH0sXG4gICAgc2V0QWxwaGE6IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX2EgPSBib3VuZEFscGhhKHZhbHVlKTtcbiAgICAgICAgdGhpcy5fcm91bmRBID0gbWF0aFJvdW5kKDEwMCp0aGlzLl9hKSAvIDEwMDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICB0b0hzdjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBoc3YgPSByZ2JUb0hzdih0aGlzLl9yLCB0aGlzLl9nLCB0aGlzLl9iKTtcbiAgICAgICAgcmV0dXJuIHsgaDogaHN2LmggKiAzNjAsIHM6IGhzdi5zLCB2OiBoc3YudiwgYTogdGhpcy5fYSB9O1xuICAgIH0sXG4gICAgdG9Ic3ZTdHJpbmc6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgaHN2ID0gcmdiVG9Ic3YodGhpcy5fciwgdGhpcy5fZywgdGhpcy5fYik7XG4gICAgICAgIHZhciBoID0gbWF0aFJvdW5kKGhzdi5oICogMzYwKSwgcyA9IG1hdGhSb3VuZChoc3YucyAqIDEwMCksIHYgPSBtYXRoUm91bmQoaHN2LnYgKiAxMDApO1xuICAgICAgICByZXR1cm4gKHRoaXMuX2EgPT0gMSkgP1xuICAgICAgICAgIFwiaHN2KFwiICArIGggKyBcIiwgXCIgKyBzICsgXCIlLCBcIiArIHYgKyBcIiUpXCIgOlxuICAgICAgICAgIFwiaHN2YShcIiArIGggKyBcIiwgXCIgKyBzICsgXCIlLCBcIiArIHYgKyBcIiUsIFwiKyB0aGlzLl9yb3VuZEEgKyBcIilcIjtcbiAgICB9LFxuICAgIHRvSHNsOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGhzbCA9IHJnYlRvSHNsKHRoaXMuX3IsIHRoaXMuX2csIHRoaXMuX2IpO1xuICAgICAgICByZXR1cm4geyBoOiBoc2wuaCAqIDM2MCwgczogaHNsLnMsIGw6IGhzbC5sLCBhOiB0aGlzLl9hIH07XG4gICAgfSxcbiAgICB0b0hzbFN0cmluZzogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBoc2wgPSByZ2JUb0hzbCh0aGlzLl9yLCB0aGlzLl9nLCB0aGlzLl9iKTtcbiAgICAgICAgdmFyIGggPSBtYXRoUm91bmQoaHNsLmggKiAzNjApLCBzID0gbWF0aFJvdW5kKGhzbC5zICogMTAwKSwgbCA9IG1hdGhSb3VuZChoc2wubCAqIDEwMCk7XG4gICAgICAgIHJldHVybiAodGhpcy5fYSA9PSAxKSA/XG4gICAgICAgICAgXCJoc2woXCIgICsgaCArIFwiLCBcIiArIHMgKyBcIiUsIFwiICsgbCArIFwiJSlcIiA6XG4gICAgICAgICAgXCJoc2xhKFwiICsgaCArIFwiLCBcIiArIHMgKyBcIiUsIFwiICsgbCArIFwiJSwgXCIrIHRoaXMuX3JvdW5kQSArIFwiKVwiO1xuICAgIH0sXG4gICAgdG9IZXg6IGZ1bmN0aW9uKGFsbG93M0NoYXIpIHtcbiAgICAgICAgcmV0dXJuIHJnYlRvSGV4KHRoaXMuX3IsIHRoaXMuX2csIHRoaXMuX2IsIGFsbG93M0NoYXIpO1xuICAgIH0sXG4gICAgdG9IZXhTdHJpbmc6IGZ1bmN0aW9uKGFsbG93M0NoYXIpIHtcbiAgICAgICAgcmV0dXJuICcjJyArIHRoaXMudG9IZXgoYWxsb3czQ2hhcik7XG4gICAgfSxcbiAgICB0b0hleDg6IGZ1bmN0aW9uKGFsbG93NENoYXIpIHtcbiAgICAgICAgcmV0dXJuIHJnYmFUb0hleCh0aGlzLl9yLCB0aGlzLl9nLCB0aGlzLl9iLCB0aGlzLl9hLCBhbGxvdzRDaGFyKTtcbiAgICB9LFxuICAgIHRvSGV4OFN0cmluZzogZnVuY3Rpb24oYWxsb3c0Q2hhcikge1xuICAgICAgICByZXR1cm4gJyMnICsgdGhpcy50b0hleDgoYWxsb3c0Q2hhcik7XG4gICAgfSxcbiAgICB0b1JnYjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB7IHI6IG1hdGhSb3VuZCh0aGlzLl9yKSwgZzogbWF0aFJvdW5kKHRoaXMuX2cpLCBiOiBtYXRoUm91bmQodGhpcy5fYiksIGE6IHRoaXMuX2EgfTtcbiAgICB9LFxuICAgIHRvUmdiU3RyaW5nOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLl9hID09IDEpID9cbiAgICAgICAgICBcInJnYihcIiAgKyBtYXRoUm91bmQodGhpcy5fcikgKyBcIiwgXCIgKyBtYXRoUm91bmQodGhpcy5fZykgKyBcIiwgXCIgKyBtYXRoUm91bmQodGhpcy5fYikgKyBcIilcIiA6XG4gICAgICAgICAgXCJyZ2JhKFwiICsgbWF0aFJvdW5kKHRoaXMuX3IpICsgXCIsIFwiICsgbWF0aFJvdW5kKHRoaXMuX2cpICsgXCIsIFwiICsgbWF0aFJvdW5kKHRoaXMuX2IpICsgXCIsIFwiICsgdGhpcy5fcm91bmRBICsgXCIpXCI7XG4gICAgfSxcbiAgICB0b1BlcmNlbnRhZ2VSZ2I6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4geyByOiBtYXRoUm91bmQoYm91bmQwMSh0aGlzLl9yLCAyNTUpICogMTAwKSArIFwiJVwiLCBnOiBtYXRoUm91bmQoYm91bmQwMSh0aGlzLl9nLCAyNTUpICogMTAwKSArIFwiJVwiLCBiOiBtYXRoUm91bmQoYm91bmQwMSh0aGlzLl9iLCAyNTUpICogMTAwKSArIFwiJVwiLCBhOiB0aGlzLl9hIH07XG4gICAgfSxcbiAgICB0b1BlcmNlbnRhZ2VSZ2JTdHJpbmc6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMuX2EgPT0gMSkgP1xuICAgICAgICAgIFwicmdiKFwiICArIG1hdGhSb3VuZChib3VuZDAxKHRoaXMuX3IsIDI1NSkgKiAxMDApICsgXCIlLCBcIiArIG1hdGhSb3VuZChib3VuZDAxKHRoaXMuX2csIDI1NSkgKiAxMDApICsgXCIlLCBcIiArIG1hdGhSb3VuZChib3VuZDAxKHRoaXMuX2IsIDI1NSkgKiAxMDApICsgXCIlKVwiIDpcbiAgICAgICAgICBcInJnYmEoXCIgKyBtYXRoUm91bmQoYm91bmQwMSh0aGlzLl9yLCAyNTUpICogMTAwKSArIFwiJSwgXCIgKyBtYXRoUm91bmQoYm91bmQwMSh0aGlzLl9nLCAyNTUpICogMTAwKSArIFwiJSwgXCIgKyBtYXRoUm91bmQoYm91bmQwMSh0aGlzLl9iLCAyNTUpICogMTAwKSArIFwiJSwgXCIgKyB0aGlzLl9yb3VuZEEgKyBcIilcIjtcbiAgICB9LFxuICAgIHRvTmFtZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICh0aGlzLl9hID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJ0cmFuc3BhcmVudFwiO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX2EgPCAxKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaGV4TmFtZXNbcmdiVG9IZXgodGhpcy5fciwgdGhpcy5fZywgdGhpcy5fYiwgdHJ1ZSldIHx8IGZhbHNlO1xuICAgIH0sXG4gICAgdG9GaWx0ZXI6IGZ1bmN0aW9uKHNlY29uZENvbG9yKSB7XG4gICAgICAgIHZhciBoZXg4U3RyaW5nID0gJyMnICsgcmdiYVRvQXJnYkhleCh0aGlzLl9yLCB0aGlzLl9nLCB0aGlzLl9iLCB0aGlzLl9hKTtcbiAgICAgICAgdmFyIHNlY29uZEhleDhTdHJpbmcgPSBoZXg4U3RyaW5nO1xuICAgICAgICB2YXIgZ3JhZGllbnRUeXBlID0gdGhpcy5fZ3JhZGllbnRUeXBlID8gXCJHcmFkaWVudFR5cGUgPSAxLCBcIiA6IFwiXCI7XG5cbiAgICAgICAgaWYgKHNlY29uZENvbG9yKSB7XG4gICAgICAgICAgICB2YXIgcyA9IHRpbnljb2xvcihzZWNvbmRDb2xvcik7XG4gICAgICAgICAgICBzZWNvbmRIZXg4U3RyaW5nID0gJyMnICsgcmdiYVRvQXJnYkhleChzLl9yLCBzLl9nLCBzLl9iLCBzLl9hKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBcInByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudChcIitncmFkaWVudFR5cGUrXCJzdGFydENvbG9yc3RyPVwiK2hleDhTdHJpbmcrXCIsZW5kQ29sb3JzdHI9XCIrc2Vjb25kSGV4OFN0cmluZytcIilcIjtcbiAgICB9LFxuICAgIHRvU3RyaW5nOiBmdW5jdGlvbihmb3JtYXQpIHtcbiAgICAgICAgdmFyIGZvcm1hdFNldCA9ICEhZm9ybWF0O1xuICAgICAgICBmb3JtYXQgPSBmb3JtYXQgfHwgdGhpcy5fZm9ybWF0O1xuXG4gICAgICAgIHZhciBmb3JtYXR0ZWRTdHJpbmcgPSBmYWxzZTtcbiAgICAgICAgdmFyIGhhc0FscGhhID0gdGhpcy5fYSA8IDEgJiYgdGhpcy5fYSA+PSAwO1xuICAgICAgICB2YXIgbmVlZHNBbHBoYUZvcm1hdCA9ICFmb3JtYXRTZXQgJiYgaGFzQWxwaGEgJiYgKGZvcm1hdCA9PT0gXCJoZXhcIiB8fCBmb3JtYXQgPT09IFwiaGV4NlwiIHx8IGZvcm1hdCA9PT0gXCJoZXgzXCIgfHwgZm9ybWF0ID09PSBcImhleDRcIiB8fCBmb3JtYXQgPT09IFwiaGV4OFwiIHx8IGZvcm1hdCA9PT0gXCJuYW1lXCIpO1xuXG4gICAgICAgIGlmIChuZWVkc0FscGhhRm9ybWF0KSB7XG4gICAgICAgICAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIFwidHJhbnNwYXJlbnRcIiwgYWxsIG90aGVyIG5vbi1hbHBoYSBmb3JtYXRzXG4gICAgICAgICAgICAvLyB3aWxsIHJldHVybiByZ2JhIHdoZW4gdGhlcmUgaXMgdHJhbnNwYXJlbmN5LlxuICAgICAgICAgICAgaWYgKGZvcm1hdCA9PT0gXCJuYW1lXCIgJiYgdGhpcy5fYSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRvTmFtZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMudG9SZ2JTdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZm9ybWF0ID09PSBcInJnYlwiKSB7XG4gICAgICAgICAgICBmb3JtYXR0ZWRTdHJpbmcgPSB0aGlzLnRvUmdiU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZvcm1hdCA9PT0gXCJwcmdiXCIpIHtcbiAgICAgICAgICAgIGZvcm1hdHRlZFN0cmluZyA9IHRoaXMudG9QZXJjZW50YWdlUmdiU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZvcm1hdCA9PT0gXCJoZXhcIiB8fCBmb3JtYXQgPT09IFwiaGV4NlwiKSB7XG4gICAgICAgICAgICBmb3JtYXR0ZWRTdHJpbmcgPSB0aGlzLnRvSGV4U3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZvcm1hdCA9PT0gXCJoZXgzXCIpIHtcbiAgICAgICAgICAgIGZvcm1hdHRlZFN0cmluZyA9IHRoaXMudG9IZXhTdHJpbmcodHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZvcm1hdCA9PT0gXCJoZXg0XCIpIHtcbiAgICAgICAgICAgIGZvcm1hdHRlZFN0cmluZyA9IHRoaXMudG9IZXg4U3RyaW5nKHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmb3JtYXQgPT09IFwiaGV4OFwiKSB7XG4gICAgICAgICAgICBmb3JtYXR0ZWRTdHJpbmcgPSB0aGlzLnRvSGV4OFN0cmluZygpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmb3JtYXQgPT09IFwibmFtZVwiKSB7XG4gICAgICAgICAgICBmb3JtYXR0ZWRTdHJpbmcgPSB0aGlzLnRvTmFtZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmb3JtYXQgPT09IFwiaHNsXCIpIHtcbiAgICAgICAgICAgIGZvcm1hdHRlZFN0cmluZyA9IHRoaXMudG9Ic2xTdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZm9ybWF0ID09PSBcImhzdlwiKSB7XG4gICAgICAgICAgICBmb3JtYXR0ZWRTdHJpbmcgPSB0aGlzLnRvSHN2U3RyaW5nKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZm9ybWF0dGVkU3RyaW5nIHx8IHRoaXMudG9IZXhTdHJpbmcoKTtcbiAgICB9LFxuICAgIGNsb25lOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRpbnljb2xvcih0aGlzLnRvU3RyaW5nKCkpO1xuICAgIH0sXG5cbiAgICBfYXBwbHlNb2RpZmljYXRpb246IGZ1bmN0aW9uKGZuLCBhcmdzKSB7XG4gICAgICAgIHZhciBjb2xvciA9IGZuLmFwcGx5KG51bGwsIFt0aGlzXS5jb25jYXQoW10uc2xpY2UuY2FsbChhcmdzKSkpO1xuICAgICAgICB0aGlzLl9yID0gY29sb3IuX3I7XG4gICAgICAgIHRoaXMuX2cgPSBjb2xvci5fZztcbiAgICAgICAgdGhpcy5fYiA9IGNvbG9yLl9iO1xuICAgICAgICB0aGlzLnNldEFscGhhKGNvbG9yLl9hKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICBsaWdodGVuOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FwcGx5TW9kaWZpY2F0aW9uKGxpZ2h0ZW4sIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICBicmlnaHRlbjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hcHBseU1vZGlmaWNhdGlvbihicmlnaHRlbiwgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgIGRhcmtlbjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hcHBseU1vZGlmaWNhdGlvbihkYXJrZW4sIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICBkZXNhdHVyYXRlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FwcGx5TW9kaWZpY2F0aW9uKGRlc2F0dXJhdGUsIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICBzYXR1cmF0ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hcHBseU1vZGlmaWNhdGlvbihzYXR1cmF0ZSwgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgIGdyZXlzY2FsZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hcHBseU1vZGlmaWNhdGlvbihncmV5c2NhbGUsIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICBzcGluOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FwcGx5TW9kaWZpY2F0aW9uKHNwaW4sIGFyZ3VtZW50cyk7XG4gICAgfSxcblxuICAgIF9hcHBseUNvbWJpbmF0aW9uOiBmdW5jdGlvbihmbiwgYXJncykge1xuICAgICAgICByZXR1cm4gZm4uYXBwbHkobnVsbCwgW3RoaXNdLmNvbmNhdChbXS5zbGljZS5jYWxsKGFyZ3MpKSk7XG4gICAgfSxcbiAgICBhbmFsb2dvdXM6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYXBwbHlDb21iaW5hdGlvbihhbmFsb2dvdXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICBjb21wbGVtZW50OiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FwcGx5Q29tYmluYXRpb24oY29tcGxlbWVudCwgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgIG1vbm9jaHJvbWF0aWM6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYXBwbHlDb21iaW5hdGlvbihtb25vY2hyb21hdGljLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgc3BsaXRjb21wbGVtZW50OiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FwcGx5Q29tYmluYXRpb24oc3BsaXRjb21wbGVtZW50LCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgdHJpYWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYXBwbHlDb21iaW5hdGlvbih0cmlhZCwgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgIHRldHJhZDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hcHBseUNvbWJpbmF0aW9uKHRldHJhZCwgYXJndW1lbnRzKTtcbiAgICB9XG59O1xuXG4vLyBJZiBpbnB1dCBpcyBhbiBvYmplY3QsIGZvcmNlIDEgaW50byBcIjEuMFwiIHRvIGhhbmRsZSByYXRpb3MgcHJvcGVybHlcbi8vIFN0cmluZyBpbnB1dCByZXF1aXJlcyBcIjEuMFwiIGFzIGlucHV0LCBzbyAxIHdpbGwgYmUgdHJlYXRlZCBhcyAxXG50aW55Y29sb3IuZnJvbVJhdGlvID0gZnVuY3Rpb24oY29sb3IsIG9wdHMpIHtcbiAgICBpZiAodHlwZW9mIGNvbG9yID09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgdmFyIG5ld0NvbG9yID0ge307XG4gICAgICAgIGZvciAodmFyIGkgaW4gY29sb3IpIHtcbiAgICAgICAgICAgIGlmIChjb2xvci5oYXNPd25Qcm9wZXJ0eShpKSkge1xuICAgICAgICAgICAgICAgIGlmIChpID09PSBcImFcIikge1xuICAgICAgICAgICAgICAgICAgICBuZXdDb2xvcltpXSA9IGNvbG9yW2ldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3Q29sb3JbaV0gPSBjb252ZXJ0VG9QZXJjZW50YWdlKGNvbG9yW2ldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29sb3IgPSBuZXdDb2xvcjtcbiAgICB9XG5cbiAgICByZXR1cm4gdGlueWNvbG9yKGNvbG9yLCBvcHRzKTtcbn07XG5cbi8vIEdpdmVuIGEgc3RyaW5nIG9yIG9iamVjdCwgY29udmVydCB0aGF0IGlucHV0IHRvIFJHQlxuLy8gUG9zc2libGUgc3RyaW5nIGlucHV0czpcbi8vXG4vLyAgICAgXCJyZWRcIlxuLy8gICAgIFwiI2YwMFwiIG9yIFwiZjAwXCJcbi8vICAgICBcIiNmZjAwMDBcIiBvciBcImZmMDAwMFwiXG4vLyAgICAgXCIjZmYwMDAwMDBcIiBvciBcImZmMDAwMDAwXCJcbi8vICAgICBcInJnYiAyNTUgMCAwXCIgb3IgXCJyZ2IgKDI1NSwgMCwgMClcIlxuLy8gICAgIFwicmdiIDEuMCAwIDBcIiBvciBcInJnYiAoMSwgMCwgMClcIlxuLy8gICAgIFwicmdiYSAoMjU1LCAwLCAwLCAxKVwiIG9yIFwicmdiYSAyNTUsIDAsIDAsIDFcIlxuLy8gICAgIFwicmdiYSAoMS4wLCAwLCAwLCAxKVwiIG9yIFwicmdiYSAxLjAsIDAsIDAsIDFcIlxuLy8gICAgIFwiaHNsKDAsIDEwMCUsIDUwJSlcIiBvciBcImhzbCAwIDEwMCUgNTAlXCJcbi8vICAgICBcImhzbGEoMCwgMTAwJSwgNTAlLCAxKVwiIG9yIFwiaHNsYSAwIDEwMCUgNTAlLCAxXCJcbi8vICAgICBcImhzdigwLCAxMDAlLCAxMDAlKVwiIG9yIFwiaHN2IDAgMTAwJSAxMDAlXCJcbi8vXG5mdW5jdGlvbiBpbnB1dFRvUkdCKGNvbG9yKSB7XG5cbiAgICB2YXIgcmdiID0geyByOiAwLCBnOiAwLCBiOiAwIH07XG4gICAgdmFyIGEgPSAxO1xuICAgIHZhciBzID0gbnVsbDtcbiAgICB2YXIgdiA9IG51bGw7XG4gICAgdmFyIGwgPSBudWxsO1xuICAgIHZhciBvayA9IGZhbHNlO1xuICAgIHZhciBmb3JtYXQgPSBmYWxzZTtcblxuICAgIGlmICh0eXBlb2YgY29sb3IgPT0gXCJzdHJpbmdcIikge1xuICAgICAgICBjb2xvciA9IHN0cmluZ0lucHV0VG9PYmplY3QoY29sb3IpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgY29sb3IgPT0gXCJvYmplY3RcIikge1xuICAgICAgICBpZiAoaXNWYWxpZENTU1VuaXQoY29sb3IucikgJiYgaXNWYWxpZENTU1VuaXQoY29sb3IuZykgJiYgaXNWYWxpZENTU1VuaXQoY29sb3IuYikpIHtcbiAgICAgICAgICAgIHJnYiA9IHJnYlRvUmdiKGNvbG9yLnIsIGNvbG9yLmcsIGNvbG9yLmIpO1xuICAgICAgICAgICAgb2sgPSB0cnVlO1xuICAgICAgICAgICAgZm9ybWF0ID0gU3RyaW5nKGNvbG9yLnIpLnN1YnN0cigtMSkgPT09IFwiJVwiID8gXCJwcmdiXCIgOiBcInJnYlwiO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzVmFsaWRDU1NVbml0KGNvbG9yLmgpICYmIGlzVmFsaWRDU1NVbml0KGNvbG9yLnMpICYmIGlzVmFsaWRDU1NVbml0KGNvbG9yLnYpKSB7XG4gICAgICAgICAgICBzID0gY29udmVydFRvUGVyY2VudGFnZShjb2xvci5zKTtcbiAgICAgICAgICAgIHYgPSBjb252ZXJ0VG9QZXJjZW50YWdlKGNvbG9yLnYpO1xuICAgICAgICAgICAgcmdiID0gaHN2VG9SZ2IoY29sb3IuaCwgcywgdik7XG4gICAgICAgICAgICBvayA9IHRydWU7XG4gICAgICAgICAgICBmb3JtYXQgPSBcImhzdlwiO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzVmFsaWRDU1NVbml0KGNvbG9yLmgpICYmIGlzVmFsaWRDU1NVbml0KGNvbG9yLnMpICYmIGlzVmFsaWRDU1NVbml0KGNvbG9yLmwpKSB7XG4gICAgICAgICAgICBzID0gY29udmVydFRvUGVyY2VudGFnZShjb2xvci5zKTtcbiAgICAgICAgICAgIGwgPSBjb252ZXJ0VG9QZXJjZW50YWdlKGNvbG9yLmwpO1xuICAgICAgICAgICAgcmdiID0gaHNsVG9SZ2IoY29sb3IuaCwgcywgbCk7XG4gICAgICAgICAgICBvayA9IHRydWU7XG4gICAgICAgICAgICBmb3JtYXQgPSBcImhzbFwiO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbG9yLmhhc093blByb3BlcnR5KFwiYVwiKSkge1xuICAgICAgICAgICAgYSA9IGNvbG9yLmE7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhID0gYm91bmRBbHBoYShhKTtcblxuICAgIHJldHVybiB7XG4gICAgICAgIG9rOiBvayxcbiAgICAgICAgZm9ybWF0OiBjb2xvci5mb3JtYXQgfHwgZm9ybWF0LFxuICAgICAgICByOiBtYXRoTWluKDI1NSwgbWF0aE1heChyZ2IuciwgMCkpLFxuICAgICAgICBnOiBtYXRoTWluKDI1NSwgbWF0aE1heChyZ2IuZywgMCkpLFxuICAgICAgICBiOiBtYXRoTWluKDI1NSwgbWF0aE1heChyZ2IuYiwgMCkpLFxuICAgICAgICBhOiBhXG4gICAgfTtcbn1cblxuXG4vLyBDb252ZXJzaW9uIEZ1bmN0aW9uc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLy8gYHJnYlRvSHNsYCwgYHJnYlRvSHN2YCwgYGhzbFRvUmdiYCwgYGhzdlRvUmdiYCBtb2RpZmllZCBmcm9tOlxuLy8gPGh0dHA6Ly9tamlqYWNrc29uLmNvbS8yMDA4LzAyL3JnYi10by1oc2wtYW5kLXJnYi10by1oc3YtY29sb3ItbW9kZWwtY29udmVyc2lvbi1hbGdvcml0aG1zLWluLWphdmFzY3JpcHQ+XG5cbi8vIGByZ2JUb1JnYmBcbi8vIEhhbmRsZSBib3VuZHMgLyBwZXJjZW50YWdlIGNoZWNraW5nIHRvIGNvbmZvcm0gdG8gQ1NTIGNvbG9yIHNwZWNcbi8vIDxodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLWNvbG9yLz5cbi8vICpBc3N1bWVzOiogciwgZywgYiBpbiBbMCwgMjU1XSBvciBbMCwgMV1cbi8vICpSZXR1cm5zOiogeyByLCBnLCBiIH0gaW4gWzAsIDI1NV1cbmZ1bmN0aW9uIHJnYlRvUmdiKHIsIGcsIGIpe1xuICAgIHJldHVybiB7XG4gICAgICAgIHI6IGJvdW5kMDEociwgMjU1KSAqIDI1NSxcbiAgICAgICAgZzogYm91bmQwMShnLCAyNTUpICogMjU1LFxuICAgICAgICBiOiBib3VuZDAxKGIsIDI1NSkgKiAyNTVcbiAgICB9O1xufVxuXG4vLyBgcmdiVG9Ic2xgXG4vLyBDb252ZXJ0cyBhbiBSR0IgY29sb3IgdmFsdWUgdG8gSFNMLlxuLy8gKkFzc3VtZXM6KiByLCBnLCBhbmQgYiBhcmUgY29udGFpbmVkIGluIFswLCAyNTVdIG9yIFswLCAxXVxuLy8gKlJldHVybnM6KiB7IGgsIHMsIGwgfSBpbiBbMCwxXVxuZnVuY3Rpb24gcmdiVG9Ic2wociwgZywgYikge1xuXG4gICAgciA9IGJvdW5kMDEociwgMjU1KTtcbiAgICBnID0gYm91bmQwMShnLCAyNTUpO1xuICAgIGIgPSBib3VuZDAxKGIsIDI1NSk7XG5cbiAgICB2YXIgbWF4ID0gbWF0aE1heChyLCBnLCBiKSwgbWluID0gbWF0aE1pbihyLCBnLCBiKTtcbiAgICB2YXIgaCwgcywgbCA9IChtYXggKyBtaW4pIC8gMjtcblxuICAgIGlmKG1heCA9PSBtaW4pIHtcbiAgICAgICAgaCA9IHMgPSAwOyAvLyBhY2hyb21hdGljXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB2YXIgZCA9IG1heCAtIG1pbjtcbiAgICAgICAgcyA9IGwgPiAwLjUgPyBkIC8gKDIgLSBtYXggLSBtaW4pIDogZCAvIChtYXggKyBtaW4pO1xuICAgICAgICBzd2l0Y2gobWF4KSB7XG4gICAgICAgICAgICBjYXNlIHI6IGggPSAoZyAtIGIpIC8gZCArIChnIDwgYiA/IDYgOiAwKTsgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIGc6IGggPSAoYiAtIHIpIC8gZCArIDI7IGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBiOiBoID0gKHIgLSBnKSAvIGQgKyA0OyBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGggLz0gNjtcbiAgICB9XG5cbiAgICByZXR1cm4geyBoOiBoLCBzOiBzLCBsOiBsIH07XG59XG5cbi8vIGBoc2xUb1JnYmBcbi8vIENvbnZlcnRzIGFuIEhTTCBjb2xvciB2YWx1ZSB0byBSR0IuXG4vLyAqQXNzdW1lczoqIGggaXMgY29udGFpbmVkIGluIFswLCAxXSBvciBbMCwgMzYwXSBhbmQgcyBhbmQgbCBhcmUgY29udGFpbmVkIFswLCAxXSBvciBbMCwgMTAwXVxuLy8gKlJldHVybnM6KiB7IHIsIGcsIGIgfSBpbiB0aGUgc2V0IFswLCAyNTVdXG5mdW5jdGlvbiBoc2xUb1JnYihoLCBzLCBsKSB7XG4gICAgdmFyIHIsIGcsIGI7XG5cbiAgICBoID0gYm91bmQwMShoLCAzNjApO1xuICAgIHMgPSBib3VuZDAxKHMsIDEwMCk7XG4gICAgbCA9IGJvdW5kMDEobCwgMTAwKTtcblxuICAgIGZ1bmN0aW9uIGh1ZTJyZ2IocCwgcSwgdCkge1xuICAgICAgICBpZih0IDwgMCkgdCArPSAxO1xuICAgICAgICBpZih0ID4gMSkgdCAtPSAxO1xuICAgICAgICBpZih0IDwgMS82KSByZXR1cm4gcCArIChxIC0gcCkgKiA2ICogdDtcbiAgICAgICAgaWYodCA8IDEvMikgcmV0dXJuIHE7XG4gICAgICAgIGlmKHQgPCAyLzMpIHJldHVybiBwICsgKHEgLSBwKSAqICgyLzMgLSB0KSAqIDY7XG4gICAgICAgIHJldHVybiBwO1xuICAgIH1cblxuICAgIGlmKHMgPT09IDApIHtcbiAgICAgICAgciA9IGcgPSBiID0gbDsgLy8gYWNocm9tYXRpY1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdmFyIHEgPSBsIDwgMC41ID8gbCAqICgxICsgcykgOiBsICsgcyAtIGwgKiBzO1xuICAgICAgICB2YXIgcCA9IDIgKiBsIC0gcTtcbiAgICAgICAgciA9IGh1ZTJyZ2IocCwgcSwgaCArIDEvMyk7XG4gICAgICAgIGcgPSBodWUycmdiKHAsIHEsIGgpO1xuICAgICAgICBiID0gaHVlMnJnYihwLCBxLCBoIC0gMS8zKTtcbiAgICB9XG5cbiAgICByZXR1cm4geyByOiByICogMjU1LCBnOiBnICogMjU1LCBiOiBiICogMjU1IH07XG59XG5cbi8vIGByZ2JUb0hzdmBcbi8vIENvbnZlcnRzIGFuIFJHQiBjb2xvciB2YWx1ZSB0byBIU1Zcbi8vICpBc3N1bWVzOiogciwgZywgYW5kIGIgYXJlIGNvbnRhaW5lZCBpbiB0aGUgc2V0IFswLCAyNTVdIG9yIFswLCAxXVxuLy8gKlJldHVybnM6KiB7IGgsIHMsIHYgfSBpbiBbMCwxXVxuZnVuY3Rpb24gcmdiVG9Ic3YociwgZywgYikge1xuXG4gICAgciA9IGJvdW5kMDEociwgMjU1KTtcbiAgICBnID0gYm91bmQwMShnLCAyNTUpO1xuICAgIGIgPSBib3VuZDAxKGIsIDI1NSk7XG5cbiAgICB2YXIgbWF4ID0gbWF0aE1heChyLCBnLCBiKSwgbWluID0gbWF0aE1pbihyLCBnLCBiKTtcbiAgICB2YXIgaCwgcywgdiA9IG1heDtcblxuICAgIHZhciBkID0gbWF4IC0gbWluO1xuICAgIHMgPSBtYXggPT09IDAgPyAwIDogZCAvIG1heDtcblxuICAgIGlmKG1heCA9PSBtaW4pIHtcbiAgICAgICAgaCA9IDA7IC8vIGFjaHJvbWF0aWNcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHN3aXRjaChtYXgpIHtcbiAgICAgICAgICAgIGNhc2UgcjogaCA9IChnIC0gYikgLyBkICsgKGcgPCBiID8gNiA6IDApOyBicmVhaztcbiAgICAgICAgICAgIGNhc2UgZzogaCA9IChiIC0gcikgLyBkICsgMjsgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIGI6IGggPSAociAtIGcpIC8gZCArIDQ7IGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGggLz0gNjtcbiAgICB9XG4gICAgcmV0dXJuIHsgaDogaCwgczogcywgdjogdiB9O1xufVxuXG4vLyBgaHN2VG9SZ2JgXG4vLyBDb252ZXJ0cyBhbiBIU1YgY29sb3IgdmFsdWUgdG8gUkdCLlxuLy8gKkFzc3VtZXM6KiBoIGlzIGNvbnRhaW5lZCBpbiBbMCwgMV0gb3IgWzAsIDM2MF0gYW5kIHMgYW5kIHYgYXJlIGNvbnRhaW5lZCBpbiBbMCwgMV0gb3IgWzAsIDEwMF1cbi8vICpSZXR1cm5zOiogeyByLCBnLCBiIH0gaW4gdGhlIHNldCBbMCwgMjU1XVxuIGZ1bmN0aW9uIGhzdlRvUmdiKGgsIHMsIHYpIHtcblxuICAgIGggPSBib3VuZDAxKGgsIDM2MCkgKiA2O1xuICAgIHMgPSBib3VuZDAxKHMsIDEwMCk7XG4gICAgdiA9IGJvdW5kMDEodiwgMTAwKTtcblxuICAgIHZhciBpID0gTWF0aC5mbG9vcihoKSxcbiAgICAgICAgZiA9IGggLSBpLFxuICAgICAgICBwID0gdiAqICgxIC0gcyksXG4gICAgICAgIHEgPSB2ICogKDEgLSBmICogcyksXG4gICAgICAgIHQgPSB2ICogKDEgLSAoMSAtIGYpICogcyksXG4gICAgICAgIG1vZCA9IGkgJSA2LFxuICAgICAgICByID0gW3YsIHEsIHAsIHAsIHQsIHZdW21vZF0sXG4gICAgICAgIGcgPSBbdCwgdiwgdiwgcSwgcCwgcF1bbW9kXSxcbiAgICAgICAgYiA9IFtwLCBwLCB0LCB2LCB2LCBxXVttb2RdO1xuXG4gICAgcmV0dXJuIHsgcjogciAqIDI1NSwgZzogZyAqIDI1NSwgYjogYiAqIDI1NSB9O1xufVxuXG4vLyBgcmdiVG9IZXhgXG4vLyBDb252ZXJ0cyBhbiBSR0IgY29sb3IgdG8gaGV4XG4vLyBBc3N1bWVzIHIsIGcsIGFuZCBiIGFyZSBjb250YWluZWQgaW4gdGhlIHNldCBbMCwgMjU1XVxuLy8gUmV0dXJucyBhIDMgb3IgNiBjaGFyYWN0ZXIgaGV4XG5mdW5jdGlvbiByZ2JUb0hleChyLCBnLCBiLCBhbGxvdzNDaGFyKSB7XG5cbiAgICB2YXIgaGV4ID0gW1xuICAgICAgICBwYWQyKG1hdGhSb3VuZChyKS50b1N0cmluZygxNikpLFxuICAgICAgICBwYWQyKG1hdGhSb3VuZChnKS50b1N0cmluZygxNikpLFxuICAgICAgICBwYWQyKG1hdGhSb3VuZChiKS50b1N0cmluZygxNikpXG4gICAgXTtcblxuICAgIC8vIFJldHVybiBhIDMgY2hhcmFjdGVyIGhleCBpZiBwb3NzaWJsZVxuICAgIGlmIChhbGxvdzNDaGFyICYmIGhleFswXS5jaGFyQXQoMCkgPT0gaGV4WzBdLmNoYXJBdCgxKSAmJiBoZXhbMV0uY2hhckF0KDApID09IGhleFsxXS5jaGFyQXQoMSkgJiYgaGV4WzJdLmNoYXJBdCgwKSA9PSBoZXhbMl0uY2hhckF0KDEpKSB7XG4gICAgICAgIHJldHVybiBoZXhbMF0uY2hhckF0KDApICsgaGV4WzFdLmNoYXJBdCgwKSArIGhleFsyXS5jaGFyQXQoMCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGhleC5qb2luKFwiXCIpO1xufVxuXG4vLyBgcmdiYVRvSGV4YFxuLy8gQ29udmVydHMgYW4gUkdCQSBjb2xvciBwbHVzIGFscGhhIHRyYW5zcGFyZW5jeSB0byBoZXhcbi8vIEFzc3VtZXMgciwgZywgYiBhcmUgY29udGFpbmVkIGluIHRoZSBzZXQgWzAsIDI1NV0gYW5kXG4vLyBhIGluIFswLCAxXS4gUmV0dXJucyBhIDQgb3IgOCBjaGFyYWN0ZXIgcmdiYSBoZXhcbmZ1bmN0aW9uIHJnYmFUb0hleChyLCBnLCBiLCBhLCBhbGxvdzRDaGFyKSB7XG5cbiAgICB2YXIgaGV4ID0gW1xuICAgICAgICBwYWQyKG1hdGhSb3VuZChyKS50b1N0cmluZygxNikpLFxuICAgICAgICBwYWQyKG1hdGhSb3VuZChnKS50b1N0cmluZygxNikpLFxuICAgICAgICBwYWQyKG1hdGhSb3VuZChiKS50b1N0cmluZygxNikpLFxuICAgICAgICBwYWQyKGNvbnZlcnREZWNpbWFsVG9IZXgoYSkpXG4gICAgXTtcblxuICAgIC8vIFJldHVybiBhIDQgY2hhcmFjdGVyIGhleCBpZiBwb3NzaWJsZVxuICAgIGlmIChhbGxvdzRDaGFyICYmIGhleFswXS5jaGFyQXQoMCkgPT0gaGV4WzBdLmNoYXJBdCgxKSAmJiBoZXhbMV0uY2hhckF0KDApID09IGhleFsxXS5jaGFyQXQoMSkgJiYgaGV4WzJdLmNoYXJBdCgwKSA9PSBoZXhbMl0uY2hhckF0KDEpICYmIGhleFszXS5jaGFyQXQoMCkgPT0gaGV4WzNdLmNoYXJBdCgxKSkge1xuICAgICAgICByZXR1cm4gaGV4WzBdLmNoYXJBdCgwKSArIGhleFsxXS5jaGFyQXQoMCkgKyBoZXhbMl0uY2hhckF0KDApICsgaGV4WzNdLmNoYXJBdCgwKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaGV4LmpvaW4oXCJcIik7XG59XG5cbi8vIGByZ2JhVG9BcmdiSGV4YFxuLy8gQ29udmVydHMgYW4gUkdCQSBjb2xvciB0byBhbiBBUkdCIEhleDggc3RyaW5nXG4vLyBSYXJlbHkgdXNlZCwgYnV0IHJlcXVpcmVkIGZvciBcInRvRmlsdGVyKClcIlxuZnVuY3Rpb24gcmdiYVRvQXJnYkhleChyLCBnLCBiLCBhKSB7XG5cbiAgICB2YXIgaGV4ID0gW1xuICAgICAgICBwYWQyKGNvbnZlcnREZWNpbWFsVG9IZXgoYSkpLFxuICAgICAgICBwYWQyKG1hdGhSb3VuZChyKS50b1N0cmluZygxNikpLFxuICAgICAgICBwYWQyKG1hdGhSb3VuZChnKS50b1N0cmluZygxNikpLFxuICAgICAgICBwYWQyKG1hdGhSb3VuZChiKS50b1N0cmluZygxNikpXG4gICAgXTtcblxuICAgIHJldHVybiBoZXguam9pbihcIlwiKTtcbn1cblxuLy8gYGVxdWFsc2Bcbi8vIENhbiBiZSBjYWxsZWQgd2l0aCBhbnkgdGlueWNvbG9yIGlucHV0XG50aW55Y29sb3IuZXF1YWxzID0gZnVuY3Rpb24gKGNvbG9yMSwgY29sb3IyKSB7XG4gICAgaWYgKCFjb2xvcjEgfHwgIWNvbG9yMikgeyByZXR1cm4gZmFsc2U7IH1cbiAgICByZXR1cm4gdGlueWNvbG9yKGNvbG9yMSkudG9SZ2JTdHJpbmcoKSA9PSB0aW55Y29sb3IoY29sb3IyKS50b1JnYlN0cmluZygpO1xufTtcblxudGlueWNvbG9yLnJhbmRvbSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aW55Y29sb3IuZnJvbVJhdGlvKHtcbiAgICAgICAgcjogbWF0aFJhbmRvbSgpLFxuICAgICAgICBnOiBtYXRoUmFuZG9tKCksXG4gICAgICAgIGI6IG1hdGhSYW5kb20oKVxuICAgIH0pO1xufTtcblxuXG4vLyBNb2RpZmljYXRpb24gRnVuY3Rpb25zXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBUaGFua3MgdG8gbGVzcy5qcyBmb3Igc29tZSBvZiB0aGUgYmFzaWNzIGhlcmVcbi8vIDxodHRwczovL2dpdGh1Yi5jb20vY2xvdWRoZWFkL2xlc3MuanMvYmxvYi9tYXN0ZXIvbGliL2xlc3MvZnVuY3Rpb25zLmpzPlxuXG5mdW5jdGlvbiBkZXNhdHVyYXRlKGNvbG9yLCBhbW91bnQpIHtcbiAgICBhbW91bnQgPSAoYW1vdW50ID09PSAwKSA/IDAgOiAoYW1vdW50IHx8IDEwKTtcbiAgICB2YXIgaHNsID0gdGlueWNvbG9yKGNvbG9yKS50b0hzbCgpO1xuICAgIGhzbC5zIC09IGFtb3VudCAvIDEwMDtcbiAgICBoc2wucyA9IGNsYW1wMDEoaHNsLnMpO1xuICAgIHJldHVybiB0aW55Y29sb3IoaHNsKTtcbn1cblxuZnVuY3Rpb24gc2F0dXJhdGUoY29sb3IsIGFtb3VudCkge1xuICAgIGFtb3VudCA9IChhbW91bnQgPT09IDApID8gMCA6IChhbW91bnQgfHwgMTApO1xuICAgIHZhciBoc2wgPSB0aW55Y29sb3IoY29sb3IpLnRvSHNsKCk7XG4gICAgaHNsLnMgKz0gYW1vdW50IC8gMTAwO1xuICAgIGhzbC5zID0gY2xhbXAwMShoc2wucyk7XG4gICAgcmV0dXJuIHRpbnljb2xvcihoc2wpO1xufVxuXG5mdW5jdGlvbiBncmV5c2NhbGUoY29sb3IpIHtcbiAgICByZXR1cm4gdGlueWNvbG9yKGNvbG9yKS5kZXNhdHVyYXRlKDEwMCk7XG59XG5cbmZ1bmN0aW9uIGxpZ2h0ZW4gKGNvbG9yLCBhbW91bnQpIHtcbiAgICBhbW91bnQgPSAoYW1vdW50ID09PSAwKSA/IDAgOiAoYW1vdW50IHx8IDEwKTtcbiAgICB2YXIgaHNsID0gdGlueWNvbG9yKGNvbG9yKS50b0hzbCgpO1xuICAgIGhzbC5sICs9IGFtb3VudCAvIDEwMDtcbiAgICBoc2wubCA9IGNsYW1wMDEoaHNsLmwpO1xuICAgIHJldHVybiB0aW55Y29sb3IoaHNsKTtcbn1cblxuZnVuY3Rpb24gYnJpZ2h0ZW4oY29sb3IsIGFtb3VudCkge1xuICAgIGFtb3VudCA9IChhbW91bnQgPT09IDApID8gMCA6IChhbW91bnQgfHwgMTApO1xuICAgIHZhciByZ2IgPSB0aW55Y29sb3IoY29sb3IpLnRvUmdiKCk7XG4gICAgcmdiLnIgPSBtYXRoTWF4KDAsIG1hdGhNaW4oMjU1LCByZ2IuciAtIG1hdGhSb3VuZCgyNTUgKiAtIChhbW91bnQgLyAxMDApKSkpO1xuICAgIHJnYi5nID0gbWF0aE1heCgwLCBtYXRoTWluKDI1NSwgcmdiLmcgLSBtYXRoUm91bmQoMjU1ICogLSAoYW1vdW50IC8gMTAwKSkpKTtcbiAgICByZ2IuYiA9IG1hdGhNYXgoMCwgbWF0aE1pbigyNTUsIHJnYi5iIC0gbWF0aFJvdW5kKDI1NSAqIC0gKGFtb3VudCAvIDEwMCkpKSk7XG4gICAgcmV0dXJuIHRpbnljb2xvcihyZ2IpO1xufVxuXG5mdW5jdGlvbiBkYXJrZW4gKGNvbG9yLCBhbW91bnQpIHtcbiAgICBhbW91bnQgPSAoYW1vdW50ID09PSAwKSA/IDAgOiAoYW1vdW50IHx8IDEwKTtcbiAgICB2YXIgaHNsID0gdGlueWNvbG9yKGNvbG9yKS50b0hzbCgpO1xuICAgIGhzbC5sIC09IGFtb3VudCAvIDEwMDtcbiAgICBoc2wubCA9IGNsYW1wMDEoaHNsLmwpO1xuICAgIHJldHVybiB0aW55Y29sb3IoaHNsKTtcbn1cblxuLy8gU3BpbiB0YWtlcyBhIHBvc2l0aXZlIG9yIG5lZ2F0aXZlIGFtb3VudCB3aXRoaW4gWy0zNjAsIDM2MF0gaW5kaWNhdGluZyB0aGUgY2hhbmdlIG9mIGh1ZS5cbi8vIFZhbHVlcyBvdXRzaWRlIG9mIHRoaXMgcmFuZ2Ugd2lsbCBiZSB3cmFwcGVkIGludG8gdGhpcyByYW5nZS5cbmZ1bmN0aW9uIHNwaW4oY29sb3IsIGFtb3VudCkge1xuICAgIHZhciBoc2wgPSB0aW55Y29sb3IoY29sb3IpLnRvSHNsKCk7XG4gICAgdmFyIGh1ZSA9IChoc2wuaCArIGFtb3VudCkgJSAzNjA7XG4gICAgaHNsLmggPSBodWUgPCAwID8gMzYwICsgaHVlIDogaHVlO1xuICAgIHJldHVybiB0aW55Y29sb3IoaHNsKTtcbn1cblxuLy8gQ29tYmluYXRpb24gRnVuY3Rpb25zXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFRoYW5rcyB0byBqUXVlcnkgeENvbG9yIGZvciBzb21lIG9mIHRoZSBpZGVhcyBiZWhpbmQgdGhlc2Vcbi8vIDxodHRwczovL2dpdGh1Yi5jb20vaW5mdXNpb24valF1ZXJ5LXhjb2xvci9ibG9iL21hc3Rlci9qcXVlcnkueGNvbG9yLmpzPlxuXG5mdW5jdGlvbiBjb21wbGVtZW50KGNvbG9yKSB7XG4gICAgdmFyIGhzbCA9IHRpbnljb2xvcihjb2xvcikudG9Ic2woKTtcbiAgICBoc2wuaCA9IChoc2wuaCArIDE4MCkgJSAzNjA7XG4gICAgcmV0dXJuIHRpbnljb2xvcihoc2wpO1xufVxuXG5mdW5jdGlvbiB0cmlhZChjb2xvcikge1xuICAgIHZhciBoc2wgPSB0aW55Y29sb3IoY29sb3IpLnRvSHNsKCk7XG4gICAgdmFyIGggPSBoc2wuaDtcbiAgICByZXR1cm4gW1xuICAgICAgICB0aW55Y29sb3IoY29sb3IpLFxuICAgICAgICB0aW55Y29sb3IoeyBoOiAoaCArIDEyMCkgJSAzNjAsIHM6IGhzbC5zLCBsOiBoc2wubCB9KSxcbiAgICAgICAgdGlueWNvbG9yKHsgaDogKGggKyAyNDApICUgMzYwLCBzOiBoc2wucywgbDogaHNsLmwgfSlcbiAgICBdO1xufVxuXG5mdW5jdGlvbiB0ZXRyYWQoY29sb3IpIHtcbiAgICB2YXIgaHNsID0gdGlueWNvbG9yKGNvbG9yKS50b0hzbCgpO1xuICAgIHZhciBoID0gaHNsLmg7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgdGlueWNvbG9yKGNvbG9yKSxcbiAgICAgICAgdGlueWNvbG9yKHsgaDogKGggKyA5MCkgJSAzNjAsIHM6IGhzbC5zLCBsOiBoc2wubCB9KSxcbiAgICAgICAgdGlueWNvbG9yKHsgaDogKGggKyAxODApICUgMzYwLCBzOiBoc2wucywgbDogaHNsLmwgfSksXG4gICAgICAgIHRpbnljb2xvcih7IGg6IChoICsgMjcwKSAlIDM2MCwgczogaHNsLnMsIGw6IGhzbC5sIH0pXG4gICAgXTtcbn1cblxuZnVuY3Rpb24gc3BsaXRjb21wbGVtZW50KGNvbG9yKSB7XG4gICAgdmFyIGhzbCA9IHRpbnljb2xvcihjb2xvcikudG9Ic2woKTtcbiAgICB2YXIgaCA9IGhzbC5oO1xuICAgIHJldHVybiBbXG4gICAgICAgIHRpbnljb2xvcihjb2xvciksXG4gICAgICAgIHRpbnljb2xvcih7IGg6IChoICsgNzIpICUgMzYwLCBzOiBoc2wucywgbDogaHNsLmx9KSxcbiAgICAgICAgdGlueWNvbG9yKHsgaDogKGggKyAyMTYpICUgMzYwLCBzOiBoc2wucywgbDogaHNsLmx9KVxuICAgIF07XG59XG5cbmZ1bmN0aW9uIGFuYWxvZ291cyhjb2xvciwgcmVzdWx0cywgc2xpY2VzKSB7XG4gICAgcmVzdWx0cyA9IHJlc3VsdHMgfHwgNjtcbiAgICBzbGljZXMgPSBzbGljZXMgfHwgMzA7XG5cbiAgICB2YXIgaHNsID0gdGlueWNvbG9yKGNvbG9yKS50b0hzbCgpO1xuICAgIHZhciBwYXJ0ID0gMzYwIC8gc2xpY2VzO1xuICAgIHZhciByZXQgPSBbdGlueWNvbG9yKGNvbG9yKV07XG5cbiAgICBmb3IgKGhzbC5oID0gKChoc2wuaCAtIChwYXJ0ICogcmVzdWx0cyA+PiAxKSkgKyA3MjApICUgMzYwOyAtLXJlc3VsdHM7ICkge1xuICAgICAgICBoc2wuaCA9IChoc2wuaCArIHBhcnQpICUgMzYwO1xuICAgICAgICByZXQucHVzaCh0aW55Y29sb3IoaHNsKSk7XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIG1vbm9jaHJvbWF0aWMoY29sb3IsIHJlc3VsdHMpIHtcbiAgICByZXN1bHRzID0gcmVzdWx0cyB8fCA2O1xuICAgIHZhciBoc3YgPSB0aW55Y29sb3IoY29sb3IpLnRvSHN2KCk7XG4gICAgdmFyIGggPSBoc3YuaCwgcyA9IGhzdi5zLCB2ID0gaHN2LnY7XG4gICAgdmFyIHJldCA9IFtdO1xuICAgIHZhciBtb2RpZmljYXRpb24gPSAxIC8gcmVzdWx0cztcblxuICAgIHdoaWxlIChyZXN1bHRzLS0pIHtcbiAgICAgICAgcmV0LnB1c2godGlueWNvbG9yKHsgaDogaCwgczogcywgdjogdn0pKTtcbiAgICAgICAgdiA9ICh2ICsgbW9kaWZpY2F0aW9uKSAlIDE7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJldDtcbn1cblxuLy8gVXRpbGl0eSBGdW5jdGlvbnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG50aW55Y29sb3IubWl4ID0gZnVuY3Rpb24oY29sb3IxLCBjb2xvcjIsIGFtb3VudCkge1xuICAgIGFtb3VudCA9IChhbW91bnQgPT09IDApID8gMCA6IChhbW91bnQgfHwgNTApO1xuXG4gICAgdmFyIHJnYjEgPSB0aW55Y29sb3IoY29sb3IxKS50b1JnYigpO1xuICAgIHZhciByZ2IyID0gdGlueWNvbG9yKGNvbG9yMikudG9SZ2IoKTtcblxuICAgIHZhciBwID0gYW1vdW50IC8gMTAwO1xuXG4gICAgdmFyIHJnYmEgPSB7XG4gICAgICAgIHI6ICgocmdiMi5yIC0gcmdiMS5yKSAqIHApICsgcmdiMS5yLFxuICAgICAgICBnOiAoKHJnYjIuZyAtIHJnYjEuZykgKiBwKSArIHJnYjEuZyxcbiAgICAgICAgYjogKChyZ2IyLmIgLSByZ2IxLmIpICogcCkgKyByZ2IxLmIsXG4gICAgICAgIGE6ICgocmdiMi5hIC0gcmdiMS5hKSAqIHApICsgcmdiMS5hXG4gICAgfTtcblxuICAgIHJldHVybiB0aW55Y29sb3IocmdiYSk7XG59O1xuXG5cbi8vIFJlYWRhYmlsaXR5IEZ1bmN0aW9uc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyA8aHR0cDovL3d3dy53My5vcmcvVFIvMjAwOC9SRUMtV0NBRzIwLTIwMDgxMjExLyNjb250cmFzdC1yYXRpb2RlZiAoV0NBRyBWZXJzaW9uIDIpXG5cbi8vIGBjb250cmFzdGBcbi8vIEFuYWx5emUgdGhlIDIgY29sb3JzIGFuZCByZXR1cm5zIHRoZSBjb2xvciBjb250cmFzdCBkZWZpbmVkIGJ5IChXQ0FHIFZlcnNpb24gMilcbnRpbnljb2xvci5yZWFkYWJpbGl0eSA9IGZ1bmN0aW9uKGNvbG9yMSwgY29sb3IyKSB7XG4gICAgdmFyIGMxID0gdGlueWNvbG9yKGNvbG9yMSk7XG4gICAgdmFyIGMyID0gdGlueWNvbG9yKGNvbG9yMik7XG4gICAgcmV0dXJuIChNYXRoLm1heChjMS5nZXRMdW1pbmFuY2UoKSxjMi5nZXRMdW1pbmFuY2UoKSkrMC4wNSkgLyAoTWF0aC5taW4oYzEuZ2V0THVtaW5hbmNlKCksYzIuZ2V0THVtaW5hbmNlKCkpKzAuMDUpO1xufTtcblxuLy8gYGlzUmVhZGFibGVgXG4vLyBFbnN1cmUgdGhhdCBmb3JlZ3JvdW5kIGFuZCBiYWNrZ3JvdW5kIGNvbG9yIGNvbWJpbmF0aW9ucyBtZWV0IFdDQUcyIGd1aWRlbGluZXMuXG4vLyBUaGUgdGhpcmQgYXJndW1lbnQgaXMgYW4gb3B0aW9uYWwgT2JqZWN0LlxuLy8gICAgICB0aGUgJ2xldmVsJyBwcm9wZXJ0eSBzdGF0ZXMgJ0FBJyBvciAnQUFBJyAtIGlmIG1pc3Npbmcgb3IgaW52YWxpZCwgaXQgZGVmYXVsdHMgdG8gJ0FBJztcbi8vICAgICAgdGhlICdzaXplJyBwcm9wZXJ0eSBzdGF0ZXMgJ2xhcmdlJyBvciAnc21hbGwnIC0gaWYgbWlzc2luZyBvciBpbnZhbGlkLCBpdCBkZWZhdWx0cyB0byAnc21hbGwnLlxuLy8gSWYgdGhlIGVudGlyZSBvYmplY3QgaXMgYWJzZW50LCBpc1JlYWRhYmxlIGRlZmF1bHRzIHRvIHtsZXZlbDpcIkFBXCIsc2l6ZTpcInNtYWxsXCJ9LlxuXG4vLyAqRXhhbXBsZSpcbi8vICAgIHRpbnljb2xvci5pc1JlYWRhYmxlKFwiIzAwMFwiLCBcIiMxMTFcIikgPT4gZmFsc2Vcbi8vICAgIHRpbnljb2xvci5pc1JlYWRhYmxlKFwiIzAwMFwiLCBcIiMxMTFcIix7bGV2ZWw6XCJBQVwiLHNpemU6XCJsYXJnZVwifSkgPT4gZmFsc2VcbnRpbnljb2xvci5pc1JlYWRhYmxlID0gZnVuY3Rpb24oY29sb3IxLCBjb2xvcjIsIHdjYWcyKSB7XG4gICAgdmFyIHJlYWRhYmlsaXR5ID0gdGlueWNvbG9yLnJlYWRhYmlsaXR5KGNvbG9yMSwgY29sb3IyKTtcbiAgICB2YXIgd2NhZzJQYXJtcywgb3V0O1xuXG4gICAgb3V0ID0gZmFsc2U7XG5cbiAgICB3Y2FnMlBhcm1zID0gdmFsaWRhdGVXQ0FHMlBhcm1zKHdjYWcyKTtcbiAgICBzd2l0Y2ggKHdjYWcyUGFybXMubGV2ZWwgKyB3Y2FnMlBhcm1zLnNpemUpIHtcbiAgICAgICAgY2FzZSBcIkFBc21hbGxcIjpcbiAgICAgICAgY2FzZSBcIkFBQWxhcmdlXCI6XG4gICAgICAgICAgICBvdXQgPSByZWFkYWJpbGl0eSA+PSA0LjU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIkFBbGFyZ2VcIjpcbiAgICAgICAgICAgIG91dCA9IHJlYWRhYmlsaXR5ID49IDM7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIkFBQXNtYWxsXCI6XG4gICAgICAgICAgICBvdXQgPSByZWFkYWJpbGl0eSA+PSA3O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG5cbn07XG5cbi8vIGBtb3N0UmVhZGFibGVgXG4vLyBHaXZlbiBhIGJhc2UgY29sb3IgYW5kIGEgbGlzdCBvZiBwb3NzaWJsZSBmb3JlZ3JvdW5kIG9yIGJhY2tncm91bmRcbi8vIGNvbG9ycyBmb3IgdGhhdCBiYXNlLCByZXR1cm5zIHRoZSBtb3N0IHJlYWRhYmxlIGNvbG9yLlxuLy8gT3B0aW9uYWxseSByZXR1cm5zIEJsYWNrIG9yIFdoaXRlIGlmIHRoZSBtb3N0IHJlYWRhYmxlIGNvbG9yIGlzIHVucmVhZGFibGUuXG4vLyAqRXhhbXBsZSpcbi8vICAgIHRpbnljb2xvci5tb3N0UmVhZGFibGUodGlueWNvbG9yLm1vc3RSZWFkYWJsZShcIiMxMjNcIiwgW1wiIzEyNFwiLCBcIiMxMjVcIl0se2luY2x1ZGVGYWxsYmFja0NvbG9yczpmYWxzZX0pLnRvSGV4U3RyaW5nKCk7IC8vIFwiIzExMjI1NVwiXG4vLyAgICB0aW55Y29sb3IubW9zdFJlYWRhYmxlKHRpbnljb2xvci5tb3N0UmVhZGFibGUoXCIjMTIzXCIsIFtcIiMxMjRcIiwgXCIjMTI1XCJdLHtpbmNsdWRlRmFsbGJhY2tDb2xvcnM6dHJ1ZX0pLnRvSGV4U3RyaW5nKCk7ICAvLyBcIiNmZmZmZmZcIlxuLy8gICAgdGlueWNvbG9yLm1vc3RSZWFkYWJsZShcIiNhODAxNWFcIiwgW1wiI2ZhZjNmM1wiXSx7aW5jbHVkZUZhbGxiYWNrQ29sb3JzOnRydWUsbGV2ZWw6XCJBQUFcIixzaXplOlwibGFyZ2VcIn0pLnRvSGV4U3RyaW5nKCk7IC8vIFwiI2ZhZjNmM1wiXG4vLyAgICB0aW55Y29sb3IubW9zdFJlYWRhYmxlKFwiI2E4MDE1YVwiLCBbXCIjZmFmM2YzXCJdLHtpbmNsdWRlRmFsbGJhY2tDb2xvcnM6dHJ1ZSxsZXZlbDpcIkFBQVwiLHNpemU6XCJzbWFsbFwifSkudG9IZXhTdHJpbmcoKTsgLy8gXCIjZmZmZmZmXCJcbnRpbnljb2xvci5tb3N0UmVhZGFibGUgPSBmdW5jdGlvbihiYXNlQ29sb3IsIGNvbG9yTGlzdCwgYXJncykge1xuICAgIHZhciBiZXN0Q29sb3IgPSBudWxsO1xuICAgIHZhciBiZXN0U2NvcmUgPSAwO1xuICAgIHZhciByZWFkYWJpbGl0eTtcbiAgICB2YXIgaW5jbHVkZUZhbGxiYWNrQ29sb3JzLCBsZXZlbCwgc2l6ZSA7XG4gICAgYXJncyA9IGFyZ3MgfHwge307XG4gICAgaW5jbHVkZUZhbGxiYWNrQ29sb3JzID0gYXJncy5pbmNsdWRlRmFsbGJhY2tDb2xvcnMgO1xuICAgIGxldmVsID0gYXJncy5sZXZlbDtcbiAgICBzaXplID0gYXJncy5zaXplO1xuXG4gICAgZm9yICh2YXIgaT0gMDsgaSA8IGNvbG9yTGlzdC5sZW5ndGggOyBpKyspIHtcbiAgICAgICAgcmVhZGFiaWxpdHkgPSB0aW55Y29sb3IucmVhZGFiaWxpdHkoYmFzZUNvbG9yLCBjb2xvckxpc3RbaV0pO1xuICAgICAgICBpZiAocmVhZGFiaWxpdHkgPiBiZXN0U2NvcmUpIHtcbiAgICAgICAgICAgIGJlc3RTY29yZSA9IHJlYWRhYmlsaXR5O1xuICAgICAgICAgICAgYmVzdENvbG9yID0gdGlueWNvbG9yKGNvbG9yTGlzdFtpXSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGlueWNvbG9yLmlzUmVhZGFibGUoYmFzZUNvbG9yLCBiZXN0Q29sb3IsIHtcImxldmVsXCI6bGV2ZWwsXCJzaXplXCI6c2l6ZX0pIHx8ICFpbmNsdWRlRmFsbGJhY2tDb2xvcnMpIHtcbiAgICAgICAgcmV0dXJuIGJlc3RDb2xvcjtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGFyZ3MuaW5jbHVkZUZhbGxiYWNrQ29sb3JzPWZhbHNlO1xuICAgICAgICByZXR1cm4gdGlueWNvbG9yLm1vc3RSZWFkYWJsZShiYXNlQ29sb3IsW1wiI2ZmZlwiLCBcIiMwMDBcIl0sYXJncyk7XG4gICAgfVxufTtcblxuXG4vLyBCaWcgTGlzdCBvZiBDb2xvcnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gPGh0dHA6Ly93d3cudzMub3JnL1RSL2NzczMtY29sb3IvI3N2Zy1jb2xvcj5cbnZhciBuYW1lcyA9IHRpbnljb2xvci5uYW1lcyA9IHtcbiAgICBhbGljZWJsdWU6IFwiZjBmOGZmXCIsXG4gICAgYW50aXF1ZXdoaXRlOiBcImZhZWJkN1wiLFxuICAgIGFxdWE6IFwiMGZmXCIsXG4gICAgYXF1YW1hcmluZTogXCI3ZmZmZDRcIixcbiAgICBhenVyZTogXCJmMGZmZmZcIixcbiAgICBiZWlnZTogXCJmNWY1ZGNcIixcbiAgICBiaXNxdWU6IFwiZmZlNGM0XCIsXG4gICAgYmxhY2s6IFwiMDAwXCIsXG4gICAgYmxhbmNoZWRhbG1vbmQ6IFwiZmZlYmNkXCIsXG4gICAgYmx1ZTogXCIwMGZcIixcbiAgICBibHVldmlvbGV0OiBcIjhhMmJlMlwiLFxuICAgIGJyb3duOiBcImE1MmEyYVwiLFxuICAgIGJ1cmx5d29vZDogXCJkZWI4ODdcIixcbiAgICBidXJudHNpZW5uYTogXCJlYTdlNWRcIixcbiAgICBjYWRldGJsdWU6IFwiNWY5ZWEwXCIsXG4gICAgY2hhcnRyZXVzZTogXCI3ZmZmMDBcIixcbiAgICBjaG9jb2xhdGU6IFwiZDI2OTFlXCIsXG4gICAgY29yYWw6IFwiZmY3ZjUwXCIsXG4gICAgY29ybmZsb3dlcmJsdWU6IFwiNjQ5NWVkXCIsXG4gICAgY29ybnNpbGs6IFwiZmZmOGRjXCIsXG4gICAgY3JpbXNvbjogXCJkYzE0M2NcIixcbiAgICBjeWFuOiBcIjBmZlwiLFxuICAgIGRhcmtibHVlOiBcIjAwMDA4YlwiLFxuICAgIGRhcmtjeWFuOiBcIjAwOGI4YlwiLFxuICAgIGRhcmtnb2xkZW5yb2Q6IFwiYjg4NjBiXCIsXG4gICAgZGFya2dyYXk6IFwiYTlhOWE5XCIsXG4gICAgZGFya2dyZWVuOiBcIjAwNjQwMFwiLFxuICAgIGRhcmtncmV5OiBcImE5YTlhOVwiLFxuICAgIGRhcmtraGFraTogXCJiZGI3NmJcIixcbiAgICBkYXJrbWFnZW50YTogXCI4YjAwOGJcIixcbiAgICBkYXJrb2xpdmVncmVlbjogXCI1NTZiMmZcIixcbiAgICBkYXJrb3JhbmdlOiBcImZmOGMwMFwiLFxuICAgIGRhcmtvcmNoaWQ6IFwiOTkzMmNjXCIsXG4gICAgZGFya3JlZDogXCI4YjAwMDBcIixcbiAgICBkYXJrc2FsbW9uOiBcImU5OTY3YVwiLFxuICAgIGRhcmtzZWFncmVlbjogXCI4ZmJjOGZcIixcbiAgICBkYXJrc2xhdGVibHVlOiBcIjQ4M2Q4YlwiLFxuICAgIGRhcmtzbGF0ZWdyYXk6IFwiMmY0ZjRmXCIsXG4gICAgZGFya3NsYXRlZ3JleTogXCIyZjRmNGZcIixcbiAgICBkYXJrdHVycXVvaXNlOiBcIjAwY2VkMVwiLFxuICAgIGRhcmt2aW9sZXQ6IFwiOTQwMGQzXCIsXG4gICAgZGVlcHBpbms6IFwiZmYxNDkzXCIsXG4gICAgZGVlcHNreWJsdWU6IFwiMDBiZmZmXCIsXG4gICAgZGltZ3JheTogXCI2OTY5NjlcIixcbiAgICBkaW1ncmV5OiBcIjY5Njk2OVwiLFxuICAgIGRvZGdlcmJsdWU6IFwiMWU5MGZmXCIsXG4gICAgZmlyZWJyaWNrOiBcImIyMjIyMlwiLFxuICAgIGZsb3JhbHdoaXRlOiBcImZmZmFmMFwiLFxuICAgIGZvcmVzdGdyZWVuOiBcIjIyOGIyMlwiLFxuICAgIGZ1Y2hzaWE6IFwiZjBmXCIsXG4gICAgZ2FpbnNib3JvOiBcImRjZGNkY1wiLFxuICAgIGdob3N0d2hpdGU6IFwiZjhmOGZmXCIsXG4gICAgZ29sZDogXCJmZmQ3MDBcIixcbiAgICBnb2xkZW5yb2Q6IFwiZGFhNTIwXCIsXG4gICAgZ3JheTogXCI4MDgwODBcIixcbiAgICBncmVlbjogXCIwMDgwMDBcIixcbiAgICBncmVlbnllbGxvdzogXCJhZGZmMmZcIixcbiAgICBncmV5OiBcIjgwODA4MFwiLFxuICAgIGhvbmV5ZGV3OiBcImYwZmZmMFwiLFxuICAgIGhvdHBpbms6IFwiZmY2OWI0XCIsXG4gICAgaW5kaWFucmVkOiBcImNkNWM1Y1wiLFxuICAgIGluZGlnbzogXCI0YjAwODJcIixcbiAgICBpdm9yeTogXCJmZmZmZjBcIixcbiAgICBraGFraTogXCJmMGU2OGNcIixcbiAgICBsYXZlbmRlcjogXCJlNmU2ZmFcIixcbiAgICBsYXZlbmRlcmJsdXNoOiBcImZmZjBmNVwiLFxuICAgIGxhd25ncmVlbjogXCI3Y2ZjMDBcIixcbiAgICBsZW1vbmNoaWZmb246IFwiZmZmYWNkXCIsXG4gICAgbGlnaHRibHVlOiBcImFkZDhlNlwiLFxuICAgIGxpZ2h0Y29yYWw6IFwiZjA4MDgwXCIsXG4gICAgbGlnaHRjeWFuOiBcImUwZmZmZlwiLFxuICAgIGxpZ2h0Z29sZGVucm9keWVsbG93OiBcImZhZmFkMlwiLFxuICAgIGxpZ2h0Z3JheTogXCJkM2QzZDNcIixcbiAgICBsaWdodGdyZWVuOiBcIjkwZWU5MFwiLFxuICAgIGxpZ2h0Z3JleTogXCJkM2QzZDNcIixcbiAgICBsaWdodHBpbms6IFwiZmZiNmMxXCIsXG4gICAgbGlnaHRzYWxtb246IFwiZmZhMDdhXCIsXG4gICAgbGlnaHRzZWFncmVlbjogXCIyMGIyYWFcIixcbiAgICBsaWdodHNreWJsdWU6IFwiODdjZWZhXCIsXG4gICAgbGlnaHRzbGF0ZWdyYXk6IFwiNzg5XCIsXG4gICAgbGlnaHRzbGF0ZWdyZXk6IFwiNzg5XCIsXG4gICAgbGlnaHRzdGVlbGJsdWU6IFwiYjBjNGRlXCIsXG4gICAgbGlnaHR5ZWxsb3c6IFwiZmZmZmUwXCIsXG4gICAgbGltZTogXCIwZjBcIixcbiAgICBsaW1lZ3JlZW46IFwiMzJjZDMyXCIsXG4gICAgbGluZW46IFwiZmFmMGU2XCIsXG4gICAgbWFnZW50YTogXCJmMGZcIixcbiAgICBtYXJvb246IFwiODAwMDAwXCIsXG4gICAgbWVkaXVtYXF1YW1hcmluZTogXCI2NmNkYWFcIixcbiAgICBtZWRpdW1ibHVlOiBcIjAwMDBjZFwiLFxuICAgIG1lZGl1bW9yY2hpZDogXCJiYTU1ZDNcIixcbiAgICBtZWRpdW1wdXJwbGU6IFwiOTM3MGRiXCIsXG4gICAgbWVkaXVtc2VhZ3JlZW46IFwiM2NiMzcxXCIsXG4gICAgbWVkaXVtc2xhdGVibHVlOiBcIjdiNjhlZVwiLFxuICAgIG1lZGl1bXNwcmluZ2dyZWVuOiBcIjAwZmE5YVwiLFxuICAgIG1lZGl1bXR1cnF1b2lzZTogXCI0OGQxY2NcIixcbiAgICBtZWRpdW12aW9sZXRyZWQ6IFwiYzcxNTg1XCIsXG4gICAgbWlkbmlnaHRibHVlOiBcIjE5MTk3MFwiLFxuICAgIG1pbnRjcmVhbTogXCJmNWZmZmFcIixcbiAgICBtaXN0eXJvc2U6IFwiZmZlNGUxXCIsXG4gICAgbW9jY2FzaW46IFwiZmZlNGI1XCIsXG4gICAgbmF2YWpvd2hpdGU6IFwiZmZkZWFkXCIsXG4gICAgbmF2eTogXCIwMDAwODBcIixcbiAgICBvbGRsYWNlOiBcImZkZjVlNlwiLFxuICAgIG9saXZlOiBcIjgwODAwMFwiLFxuICAgIG9saXZlZHJhYjogXCI2YjhlMjNcIixcbiAgICBvcmFuZ2U6IFwiZmZhNTAwXCIsXG4gICAgb3JhbmdlcmVkOiBcImZmNDUwMFwiLFxuICAgIG9yY2hpZDogXCJkYTcwZDZcIixcbiAgICBwYWxlZ29sZGVucm9kOiBcImVlZThhYVwiLFxuICAgIHBhbGVncmVlbjogXCI5OGZiOThcIixcbiAgICBwYWxldHVycXVvaXNlOiBcImFmZWVlZVwiLFxuICAgIHBhbGV2aW9sZXRyZWQ6IFwiZGI3MDkzXCIsXG4gICAgcGFwYXlhd2hpcDogXCJmZmVmZDVcIixcbiAgICBwZWFjaHB1ZmY6IFwiZmZkYWI5XCIsXG4gICAgcGVydTogXCJjZDg1M2ZcIixcbiAgICBwaW5rOiBcImZmYzBjYlwiLFxuICAgIHBsdW06IFwiZGRhMGRkXCIsXG4gICAgcG93ZGVyYmx1ZTogXCJiMGUwZTZcIixcbiAgICBwdXJwbGU6IFwiODAwMDgwXCIsXG4gICAgcmViZWNjYXB1cnBsZTogXCI2NjMzOTlcIixcbiAgICByZWQ6IFwiZjAwXCIsXG4gICAgcm9zeWJyb3duOiBcImJjOGY4ZlwiLFxuICAgIHJveWFsYmx1ZTogXCI0MTY5ZTFcIixcbiAgICBzYWRkbGVicm93bjogXCI4YjQ1MTNcIixcbiAgICBzYWxtb246IFwiZmE4MDcyXCIsXG4gICAgc2FuZHlicm93bjogXCJmNGE0NjBcIixcbiAgICBzZWFncmVlbjogXCIyZThiNTdcIixcbiAgICBzZWFzaGVsbDogXCJmZmY1ZWVcIixcbiAgICBzaWVubmE6IFwiYTA1MjJkXCIsXG4gICAgc2lsdmVyOiBcImMwYzBjMFwiLFxuICAgIHNreWJsdWU6IFwiODdjZWViXCIsXG4gICAgc2xhdGVibHVlOiBcIjZhNWFjZFwiLFxuICAgIHNsYXRlZ3JheTogXCI3MDgwOTBcIixcbiAgICBzbGF0ZWdyZXk6IFwiNzA4MDkwXCIsXG4gICAgc25vdzogXCJmZmZhZmFcIixcbiAgICBzcHJpbmdncmVlbjogXCIwMGZmN2ZcIixcbiAgICBzdGVlbGJsdWU6IFwiNDY4MmI0XCIsXG4gICAgdGFuOiBcImQyYjQ4Y1wiLFxuICAgIHRlYWw6IFwiMDA4MDgwXCIsXG4gICAgdGhpc3RsZTogXCJkOGJmZDhcIixcbiAgICB0b21hdG86IFwiZmY2MzQ3XCIsXG4gICAgdHVycXVvaXNlOiBcIjQwZTBkMFwiLFxuICAgIHZpb2xldDogXCJlZTgyZWVcIixcbiAgICB3aGVhdDogXCJmNWRlYjNcIixcbiAgICB3aGl0ZTogXCJmZmZcIixcbiAgICB3aGl0ZXNtb2tlOiBcImY1ZjVmNVwiLFxuICAgIHllbGxvdzogXCJmZjBcIixcbiAgICB5ZWxsb3dncmVlbjogXCI5YWNkMzJcIlxufTtcblxuLy8gTWFrZSBpdCBlYXN5IHRvIGFjY2VzcyBjb2xvcnMgdmlhIGBoZXhOYW1lc1toZXhdYFxudmFyIGhleE5hbWVzID0gdGlueWNvbG9yLmhleE5hbWVzID0gZmxpcChuYW1lcyk7XG5cblxuLy8gVXRpbGl0aWVzXG4vLyAtLS0tLS0tLS1cblxuLy8gYHsgJ25hbWUxJzogJ3ZhbDEnIH1gIGJlY29tZXMgYHsgJ3ZhbDEnOiAnbmFtZTEnIH1gXG5mdW5jdGlvbiBmbGlwKG8pIHtcbiAgICB2YXIgZmxpcHBlZCA9IHsgfTtcbiAgICBmb3IgKHZhciBpIGluIG8pIHtcbiAgICAgICAgaWYgKG8uaGFzT3duUHJvcGVydHkoaSkpIHtcbiAgICAgICAgICAgIGZsaXBwZWRbb1tpXV0gPSBpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmbGlwcGVkO1xufVxuXG4vLyBSZXR1cm4gYSB2YWxpZCBhbHBoYSB2YWx1ZSBbMCwxXSB3aXRoIGFsbCBpbnZhbGlkIHZhbHVlcyBiZWluZyBzZXQgdG8gMVxuZnVuY3Rpb24gYm91bmRBbHBoYShhKSB7XG4gICAgYSA9IHBhcnNlRmxvYXQoYSk7XG5cbiAgICBpZiAoaXNOYU4oYSkgfHwgYSA8IDAgfHwgYSA+IDEpIHtcbiAgICAgICAgYSA9IDE7XG4gICAgfVxuXG4gICAgcmV0dXJuIGE7XG59XG5cbi8vIFRha2UgaW5wdXQgZnJvbSBbMCwgbl0gYW5kIHJldHVybiBpdCBhcyBbMCwgMV1cbmZ1bmN0aW9uIGJvdW5kMDEobiwgbWF4KSB7XG4gICAgaWYgKGlzT25lUG9pbnRaZXJvKG4pKSB7IG4gPSBcIjEwMCVcIjsgfVxuXG4gICAgdmFyIHByb2Nlc3NQZXJjZW50ID0gaXNQZXJjZW50YWdlKG4pO1xuICAgIG4gPSBtYXRoTWluKG1heCwgbWF0aE1heCgwLCBwYXJzZUZsb2F0KG4pKSk7XG5cbiAgICAvLyBBdXRvbWF0aWNhbGx5IGNvbnZlcnQgcGVyY2VudGFnZSBpbnRvIG51bWJlclxuICAgIGlmIChwcm9jZXNzUGVyY2VudCkge1xuICAgICAgICBuID0gcGFyc2VJbnQobiAqIG1heCwgMTApIC8gMTAwO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBmbG9hdGluZyBwb2ludCByb3VuZGluZyBlcnJvcnNcbiAgICBpZiAoKE1hdGguYWJzKG4gLSBtYXgpIDwgMC4wMDAwMDEpKSB7XG4gICAgICAgIHJldHVybiAxO1xuICAgIH1cblxuICAgIC8vIENvbnZlcnQgaW50byBbMCwgMV0gcmFuZ2UgaWYgaXQgaXNuJ3QgYWxyZWFkeVxuICAgIHJldHVybiAobiAlIG1heCkgLyBwYXJzZUZsb2F0KG1heCk7XG59XG5cbi8vIEZvcmNlIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgMVxuZnVuY3Rpb24gY2xhbXAwMSh2YWwpIHtcbiAgICByZXR1cm4gbWF0aE1pbigxLCBtYXRoTWF4KDAsIHZhbCkpO1xufVxuXG4vLyBQYXJzZSBhIGJhc2UtMTYgaGV4IHZhbHVlIGludG8gYSBiYXNlLTEwIGludGVnZXJcbmZ1bmN0aW9uIHBhcnNlSW50RnJvbUhleCh2YWwpIHtcbiAgICByZXR1cm4gcGFyc2VJbnQodmFsLCAxNik7XG59XG5cbi8vIE5lZWQgdG8gaGFuZGxlIDEuMCBhcyAxMDAlLCBzaW5jZSBvbmNlIGl0IGlzIGEgbnVtYmVyLCB0aGVyZSBpcyBubyBkaWZmZXJlbmNlIGJldHdlZW4gaXQgYW5kIDFcbi8vIDxodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzc0MjIwNzIvamF2YXNjcmlwdC1ob3ctdG8tZGV0ZWN0LW51bWJlci1hcy1hLWRlY2ltYWwtaW5jbHVkaW5nLTEtMD5cbmZ1bmN0aW9uIGlzT25lUG9pbnRaZXJvKG4pIHtcbiAgICByZXR1cm4gdHlwZW9mIG4gPT0gXCJzdHJpbmdcIiAmJiBuLmluZGV4T2YoJy4nKSAhPSAtMSAmJiBwYXJzZUZsb2F0KG4pID09PSAxO1xufVxuXG4vLyBDaGVjayB0byBzZWUgaWYgc3RyaW5nIHBhc3NlZCBpbiBpcyBhIHBlcmNlbnRhZ2VcbmZ1bmN0aW9uIGlzUGVyY2VudGFnZShuKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBuID09PSBcInN0cmluZ1wiICYmIG4uaW5kZXhPZignJScpICE9IC0xO1xufVxuXG4vLyBGb3JjZSBhIGhleCB2YWx1ZSB0byBoYXZlIDIgY2hhcmFjdGVyc1xuZnVuY3Rpb24gcGFkMihjKSB7XG4gICAgcmV0dXJuIGMubGVuZ3RoID09IDEgPyAnMCcgKyBjIDogJycgKyBjO1xufVxuXG4vLyBSZXBsYWNlIGEgZGVjaW1hbCB3aXRoIGl0J3MgcGVyY2VudGFnZSB2YWx1ZVxuZnVuY3Rpb24gY29udmVydFRvUGVyY2VudGFnZShuKSB7XG4gICAgaWYgKG4gPD0gMSkge1xuICAgICAgICBuID0gKG4gKiAxMDApICsgXCIlXCI7XG4gICAgfVxuXG4gICAgcmV0dXJuIG47XG59XG5cbi8vIENvbnZlcnRzIGEgZGVjaW1hbCB0byBhIGhleCB2YWx1ZVxuZnVuY3Rpb24gY29udmVydERlY2ltYWxUb0hleChkKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQocGFyc2VGbG9hdChkKSAqIDI1NSkudG9TdHJpbmcoMTYpO1xufVxuLy8gQ29udmVydHMgYSBoZXggdmFsdWUgdG8gYSBkZWNpbWFsXG5mdW5jdGlvbiBjb252ZXJ0SGV4VG9EZWNpbWFsKGgpIHtcbiAgICByZXR1cm4gKHBhcnNlSW50RnJvbUhleChoKSAvIDI1NSk7XG59XG5cbnZhciBtYXRjaGVycyA9IChmdW5jdGlvbigpIHtcblxuICAgIC8vIDxodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLXZhbHVlcy8jaW50ZWdlcnM+XG4gICAgdmFyIENTU19JTlRFR0VSID0gXCJbLVxcXFwrXT9cXFxcZCslP1wiO1xuXG4gICAgLy8gPGh0dHA6Ly93d3cudzMub3JnL1RSL2NzczMtdmFsdWVzLyNudW1iZXItdmFsdWU+XG4gICAgdmFyIENTU19OVU1CRVIgPSBcIlstXFxcXCtdP1xcXFxkKlxcXFwuXFxcXGQrJT9cIjtcblxuICAgIC8vIEFsbG93IHBvc2l0aXZlL25lZ2F0aXZlIGludGVnZXIvbnVtYmVyLiAgRG9uJ3QgY2FwdHVyZSB0aGUgZWl0aGVyL29yLCBqdXN0IHRoZSBlbnRpcmUgb3V0Y29tZS5cbiAgICB2YXIgQ1NTX1VOSVQgPSBcIig/OlwiICsgQ1NTX05VTUJFUiArIFwiKXwoPzpcIiArIENTU19JTlRFR0VSICsgXCIpXCI7XG5cbiAgICAvLyBBY3R1YWwgbWF0Y2hpbmcuXG4gICAgLy8gUGFyZW50aGVzZXMgYW5kIGNvbW1hcyBhcmUgb3B0aW9uYWwsIGJ1dCBub3QgcmVxdWlyZWQuXG4gICAgLy8gV2hpdGVzcGFjZSBjYW4gdGFrZSB0aGUgcGxhY2Ugb2YgY29tbWFzIG9yIG9wZW5pbmcgcGFyZW5cbiAgICB2YXIgUEVSTUlTU0lWRV9NQVRDSDMgPSBcIltcXFxcc3xcXFxcKF0rKFwiICsgQ1NTX1VOSVQgKyBcIilbLHxcXFxcc10rKFwiICsgQ1NTX1VOSVQgKyBcIilbLHxcXFxcc10rKFwiICsgQ1NTX1VOSVQgKyBcIilcXFxccypcXFxcKT9cIjtcbiAgICB2YXIgUEVSTUlTU0lWRV9NQVRDSDQgPSBcIltcXFxcc3xcXFxcKF0rKFwiICsgQ1NTX1VOSVQgKyBcIilbLHxcXFxcc10rKFwiICsgQ1NTX1VOSVQgKyBcIilbLHxcXFxcc10rKFwiICsgQ1NTX1VOSVQgKyBcIilbLHxcXFxcc10rKFwiICsgQ1NTX1VOSVQgKyBcIilcXFxccypcXFxcKT9cIjtcblxuICAgIHJldHVybiB7XG4gICAgICAgIENTU19VTklUOiBuZXcgUmVnRXhwKENTU19VTklUKSxcbiAgICAgICAgcmdiOiBuZXcgUmVnRXhwKFwicmdiXCIgKyBQRVJNSVNTSVZFX01BVENIMyksXG4gICAgICAgIHJnYmE6IG5ldyBSZWdFeHAoXCJyZ2JhXCIgKyBQRVJNSVNTSVZFX01BVENINCksXG4gICAgICAgIGhzbDogbmV3IFJlZ0V4cChcImhzbFwiICsgUEVSTUlTU0lWRV9NQVRDSDMpLFxuICAgICAgICBoc2xhOiBuZXcgUmVnRXhwKFwiaHNsYVwiICsgUEVSTUlTU0lWRV9NQVRDSDQpLFxuICAgICAgICBoc3Y6IG5ldyBSZWdFeHAoXCJoc3ZcIiArIFBFUk1JU1NJVkVfTUFUQ0gzKSxcbiAgICAgICAgaHN2YTogbmV3IFJlZ0V4cChcImhzdmFcIiArIFBFUk1JU1NJVkVfTUFUQ0g0KSxcbiAgICAgICAgaGV4MzogL14jPyhbMC05YS1mQS1GXXsxfSkoWzAtOWEtZkEtRl17MX0pKFswLTlhLWZBLUZdezF9KSQvLFxuICAgICAgICBoZXg2OiAvXiM/KFswLTlhLWZBLUZdezJ9KShbMC05YS1mQS1GXXsyfSkoWzAtOWEtZkEtRl17Mn0pJC8sXG4gICAgICAgIGhleDQ6IC9eIz8oWzAtOWEtZkEtRl17MX0pKFswLTlhLWZBLUZdezF9KShbMC05YS1mQS1GXXsxfSkoWzAtOWEtZkEtRl17MX0pJC8sXG4gICAgICAgIGhleDg6IC9eIz8oWzAtOWEtZkEtRl17Mn0pKFswLTlhLWZBLUZdezJ9KShbMC05YS1mQS1GXXsyfSkoWzAtOWEtZkEtRl17Mn0pJC9cbiAgICB9O1xufSkoKTtcblxuLy8gYGlzVmFsaWRDU1NVbml0YFxuLy8gVGFrZSBpbiBhIHNpbmdsZSBzdHJpbmcgLyBudW1iZXIgYW5kIGNoZWNrIHRvIHNlZSBpZiBpdCBsb29rcyBsaWtlIGEgQ1NTIHVuaXRcbi8vIChzZWUgYG1hdGNoZXJzYCBhYm92ZSBmb3IgZGVmaW5pdGlvbikuXG5mdW5jdGlvbiBpc1ZhbGlkQ1NTVW5pdChjb2xvcikge1xuICAgIHJldHVybiAhIW1hdGNoZXJzLkNTU19VTklULmV4ZWMoY29sb3IpO1xufVxuXG4vLyBgc3RyaW5nSW5wdXRUb09iamVjdGBcbi8vIFBlcm1pc3NpdmUgc3RyaW5nIHBhcnNpbmcuICBUYWtlIGluIGEgbnVtYmVyIG9mIGZvcm1hdHMsIGFuZCBvdXRwdXQgYW4gb2JqZWN0XG4vLyBiYXNlZCBvbiBkZXRlY3RlZCBmb3JtYXQuICBSZXR1cm5zIGB7IHIsIGcsIGIgfWAgb3IgYHsgaCwgcywgbCB9YCBvciBgeyBoLCBzLCB2fWBcbmZ1bmN0aW9uIHN0cmluZ0lucHV0VG9PYmplY3QoY29sb3IpIHtcblxuICAgIGNvbG9yID0gY29sb3IucmVwbGFjZSh0cmltTGVmdCwnJykucmVwbGFjZSh0cmltUmlnaHQsICcnKS50b0xvd2VyQ2FzZSgpO1xuICAgIHZhciBuYW1lZCA9IGZhbHNlO1xuICAgIGlmIChuYW1lc1tjb2xvcl0pIHtcbiAgICAgICAgY29sb3IgPSBuYW1lc1tjb2xvcl07XG4gICAgICAgIG5hbWVkID0gdHJ1ZTtcbiAgICB9XG4gICAgZWxzZSBpZiAoY29sb3IgPT0gJ3RyYW5zcGFyZW50Jykge1xuICAgICAgICByZXR1cm4geyByOiAwLCBnOiAwLCBiOiAwLCBhOiAwLCBmb3JtYXQ6IFwibmFtZVwiIH07XG4gICAgfVxuXG4gICAgLy8gVHJ5IHRvIG1hdGNoIHN0cmluZyBpbnB1dCB1c2luZyByZWd1bGFyIGV4cHJlc3Npb25zLlxuICAgIC8vIEtlZXAgbW9zdCBvZiB0aGUgbnVtYmVyIGJvdW5kaW5nIG91dCBvZiB0aGlzIGZ1bmN0aW9uIC0gZG9uJ3Qgd29ycnkgYWJvdXQgWzAsMV0gb3IgWzAsMTAwXSBvciBbMCwzNjBdXG4gICAgLy8gSnVzdCByZXR1cm4gYW4gb2JqZWN0IGFuZCBsZXQgdGhlIGNvbnZlcnNpb24gZnVuY3Rpb25zIGhhbmRsZSB0aGF0LlxuICAgIC8vIFRoaXMgd2F5IHRoZSByZXN1bHQgd2lsbCBiZSB0aGUgc2FtZSB3aGV0aGVyIHRoZSB0aW55Y29sb3IgaXMgaW5pdGlhbGl6ZWQgd2l0aCBzdHJpbmcgb3Igb2JqZWN0LlxuICAgIHZhciBtYXRjaDtcbiAgICBpZiAoKG1hdGNoID0gbWF0Y2hlcnMucmdiLmV4ZWMoY29sb3IpKSkge1xuICAgICAgICByZXR1cm4geyByOiBtYXRjaFsxXSwgZzogbWF0Y2hbMl0sIGI6IG1hdGNoWzNdIH07XG4gICAgfVxuICAgIGlmICgobWF0Y2ggPSBtYXRjaGVycy5yZ2JhLmV4ZWMoY29sb3IpKSkge1xuICAgICAgICByZXR1cm4geyByOiBtYXRjaFsxXSwgZzogbWF0Y2hbMl0sIGI6IG1hdGNoWzNdLCBhOiBtYXRjaFs0XSB9O1xuICAgIH1cbiAgICBpZiAoKG1hdGNoID0gbWF0Y2hlcnMuaHNsLmV4ZWMoY29sb3IpKSkge1xuICAgICAgICByZXR1cm4geyBoOiBtYXRjaFsxXSwgczogbWF0Y2hbMl0sIGw6IG1hdGNoWzNdIH07XG4gICAgfVxuICAgIGlmICgobWF0Y2ggPSBtYXRjaGVycy5oc2xhLmV4ZWMoY29sb3IpKSkge1xuICAgICAgICByZXR1cm4geyBoOiBtYXRjaFsxXSwgczogbWF0Y2hbMl0sIGw6IG1hdGNoWzNdLCBhOiBtYXRjaFs0XSB9O1xuICAgIH1cbiAgICBpZiAoKG1hdGNoID0gbWF0Y2hlcnMuaHN2LmV4ZWMoY29sb3IpKSkge1xuICAgICAgICByZXR1cm4geyBoOiBtYXRjaFsxXSwgczogbWF0Y2hbMl0sIHY6IG1hdGNoWzNdIH07XG4gICAgfVxuICAgIGlmICgobWF0Y2ggPSBtYXRjaGVycy5oc3ZhLmV4ZWMoY29sb3IpKSkge1xuICAgICAgICByZXR1cm4geyBoOiBtYXRjaFsxXSwgczogbWF0Y2hbMl0sIHY6IG1hdGNoWzNdLCBhOiBtYXRjaFs0XSB9O1xuICAgIH1cbiAgICBpZiAoKG1hdGNoID0gbWF0Y2hlcnMuaGV4OC5leGVjKGNvbG9yKSkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHI6IHBhcnNlSW50RnJvbUhleChtYXRjaFsxXSksXG4gICAgICAgICAgICBnOiBwYXJzZUludEZyb21IZXgobWF0Y2hbMl0pLFxuICAgICAgICAgICAgYjogcGFyc2VJbnRGcm9tSGV4KG1hdGNoWzNdKSxcbiAgICAgICAgICAgIGE6IGNvbnZlcnRIZXhUb0RlY2ltYWwobWF0Y2hbNF0pLFxuICAgICAgICAgICAgZm9ybWF0OiBuYW1lZCA/IFwibmFtZVwiIDogXCJoZXg4XCJcbiAgICAgICAgfTtcbiAgICB9XG4gICAgaWYgKChtYXRjaCA9IG1hdGNoZXJzLmhleDYuZXhlYyhjb2xvcikpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByOiBwYXJzZUludEZyb21IZXgobWF0Y2hbMV0pLFxuICAgICAgICAgICAgZzogcGFyc2VJbnRGcm9tSGV4KG1hdGNoWzJdKSxcbiAgICAgICAgICAgIGI6IHBhcnNlSW50RnJvbUhleChtYXRjaFszXSksXG4gICAgICAgICAgICBmb3JtYXQ6IG5hbWVkID8gXCJuYW1lXCIgOiBcImhleFwiXG4gICAgICAgIH07XG4gICAgfVxuICAgIGlmICgobWF0Y2ggPSBtYXRjaGVycy5oZXg0LmV4ZWMoY29sb3IpKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcjogcGFyc2VJbnRGcm9tSGV4KG1hdGNoWzFdICsgJycgKyBtYXRjaFsxXSksXG4gICAgICAgICAgICBnOiBwYXJzZUludEZyb21IZXgobWF0Y2hbMl0gKyAnJyArIG1hdGNoWzJdKSxcbiAgICAgICAgICAgIGI6IHBhcnNlSW50RnJvbUhleChtYXRjaFszXSArICcnICsgbWF0Y2hbM10pLFxuICAgICAgICAgICAgYTogY29udmVydEhleFRvRGVjaW1hbChtYXRjaFs0XSArICcnICsgbWF0Y2hbNF0pLFxuICAgICAgICAgICAgZm9ybWF0OiBuYW1lZCA/IFwibmFtZVwiIDogXCJoZXg4XCJcbiAgICAgICAgfTtcbiAgICB9XG4gICAgaWYgKChtYXRjaCA9IG1hdGNoZXJzLmhleDMuZXhlYyhjb2xvcikpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByOiBwYXJzZUludEZyb21IZXgobWF0Y2hbMV0gKyAnJyArIG1hdGNoWzFdKSxcbiAgICAgICAgICAgIGc6IHBhcnNlSW50RnJvbUhleChtYXRjaFsyXSArICcnICsgbWF0Y2hbMl0pLFxuICAgICAgICAgICAgYjogcGFyc2VJbnRGcm9tSGV4KG1hdGNoWzNdICsgJycgKyBtYXRjaFszXSksXG4gICAgICAgICAgICBmb3JtYXQ6IG5hbWVkID8gXCJuYW1lXCIgOiBcImhleFwiXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVdDQUcyUGFybXMocGFybXMpIHtcbiAgICAvLyByZXR1cm4gdmFsaWQgV0NBRzIgcGFybXMgZm9yIGlzUmVhZGFibGUuXG4gICAgLy8gSWYgaW5wdXQgcGFybXMgYXJlIGludmFsaWQsIHJldHVybiB7XCJsZXZlbFwiOlwiQUFcIiwgXCJzaXplXCI6XCJzbWFsbFwifVxuICAgIHZhciBsZXZlbCwgc2l6ZTtcbiAgICBwYXJtcyA9IHBhcm1zIHx8IHtcImxldmVsXCI6XCJBQVwiLCBcInNpemVcIjpcInNtYWxsXCJ9O1xuICAgIGxldmVsID0gKHBhcm1zLmxldmVsIHx8IFwiQUFcIikudG9VcHBlckNhc2UoKTtcbiAgICBzaXplID0gKHBhcm1zLnNpemUgfHwgXCJzbWFsbFwiKS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmIChsZXZlbCAhPT0gXCJBQVwiICYmIGxldmVsICE9PSBcIkFBQVwiKSB7XG4gICAgICAgIGxldmVsID0gXCJBQVwiO1xuICAgIH1cbiAgICBpZiAoc2l6ZSAhPT0gXCJzbWFsbFwiICYmIHNpemUgIT09IFwibGFyZ2VcIikge1xuICAgICAgICBzaXplID0gXCJzbWFsbFwiO1xuICAgIH1cbiAgICByZXR1cm4ge1wibGV2ZWxcIjpsZXZlbCwgXCJzaXplXCI6c2l6ZX07XG59XG5cbi8vIE5vZGU6IEV4cG9ydCBmdW5jdGlvblxuaWYgKHR5cGVvZiBtb2R1bGUgIT09IFwidW5kZWZpbmVkXCIgJiYgbW9kdWxlLmV4cG9ydHMpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IHRpbnljb2xvcjtcbn1cbi8vIEFNRC9yZXF1aXJlanM6IERlZmluZSB0aGUgbW9kdWxlXG5lbHNlIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHtcbiAgICBkZWZpbmUoZnVuY3Rpb24gKCkge3JldHVybiB0aW55Y29sb3I7fSk7XG59XG4vLyBCcm93c2VyOiBFeHBvc2UgdG8gd2luZG93XG5lbHNlIHtcbiAgICB3aW5kb3cudGlueWNvbG9yID0gdGlueWNvbG9yO1xufVxuXG59KShNYXRoKTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///94\n')},function(module,exports,__webpack_require__){eval("module.exports = {\n EPSILON: __webpack_require__(263)\n , create: __webpack_require__(264)\n , clone: __webpack_require__(533)\n , fromValues: __webpack_require__(534)\n , copy: __webpack_require__(535)\n , set: __webpack_require__(265)\n , equals: __webpack_require__(536)\n , exactEquals: __webpack_require__(537)\n , add: __webpack_require__(266)\n , subtract: __webpack_require__(172)\n , sub: __webpack_require__(538)\n , multiply: __webpack_require__(267)\n , mul: __webpack_require__(539)\n , divide: __webpack_require__(268)\n , div: __webpack_require__(540)\n , inverse: __webpack_require__(541)\n , min: __webpack_require__(542)\n , max: __webpack_require__(543)\n , rotate: __webpack_require__(544)\n , floor: __webpack_require__(545)\n , ceil: __webpack_require__(546)\n , round: __webpack_require__(547)\n , scale: __webpack_require__(548)\n , scaleAndAdd: __webpack_require__(549)\n , distance: __webpack_require__(269)\n , dist: __webpack_require__(550)\n , squaredDistance: __webpack_require__(270)\n , sqrDist: __webpack_require__(551)\n , length: __webpack_require__(271)\n , len: __webpack_require__(552)\n , squaredLength: __webpack_require__(272)\n , sqrLen: __webpack_require__(553)\n , negate: __webpack_require__(554)\n , normalize: __webpack_require__(273)\n , dot: __webpack_require__(274)\n , cross: __webpack_require__(555)\n , lerp: __webpack_require__(556)\n , random: __webpack_require__(557)\n , transformMat2: __webpack_require__(558)\n , transformMat2d: __webpack_require__(559)\n , transformMat3: __webpack_require__(560)\n , transformMat4: __webpack_require__(561)\n , forEach: __webpack_require__(562)\n , limit: __webpack_require__(563)\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZ2wtdmVjMi9pbmRleC5qcz9lMjEzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0EsV0FBVyxtQkFBTyxDQUFDLEdBQVc7QUFDOUIsWUFBWSxtQkFBTyxDQUFDLEdBQVU7QUFDOUIsV0FBVyxtQkFBTyxDQUFDLEdBQVM7QUFDNUIsZ0JBQWdCLG1CQUFPLENBQUMsR0FBYztBQUN0QyxVQUFVLG1CQUFPLENBQUMsR0FBUTtBQUMxQixTQUFTLG1CQUFPLENBQUMsR0FBTztBQUN4QixZQUFZLG1CQUFPLENBQUMsR0FBVTtBQUM5QixpQkFBaUIsbUJBQU8sQ0FBQyxHQUFlO0FBQ3hDLFNBQVMsbUJBQU8sQ0FBQyxHQUFPO0FBQ3hCLGNBQWMsbUJBQU8sQ0FBQyxHQUFZO0FBQ2xDLFNBQVMsbUJBQU8sQ0FBQyxHQUFPO0FBQ3hCLGNBQWMsbUJBQU8sQ0FBQyxHQUFZO0FBQ2xDLFNBQVMsbUJBQU8sQ0FBQyxHQUFPO0FBQ3hCLFlBQVksbUJBQU8sQ0FBQyxHQUFVO0FBQzlCLFNBQVMsbUJBQU8sQ0FBQyxHQUFPO0FBQ3hCLGFBQWEsbUJBQU8sQ0FBQyxHQUFXO0FBQ2hDLFNBQVMsbUJBQU8sQ0FBQyxHQUFPO0FBQ3hCLFNBQVMsbUJBQU8sQ0FBQyxHQUFPO0FBQ3hCLFlBQVksbUJBQU8sQ0FBQyxHQUFVO0FBQzlCLFdBQVcsbUJBQU8sQ0FBQyxHQUFTO0FBQzVCLFVBQVUsbUJBQU8sQ0FBQyxHQUFRO0FBQzFCLFdBQVcsbUJBQU8sQ0FBQyxHQUFTO0FBQzVCLFdBQVcsbUJBQU8sQ0FBQyxHQUFTO0FBQzVCLGlCQUFpQixtQkFBTyxDQUFDLEdBQWU7QUFDeEMsY0FBYyxtQkFBTyxDQUFDLEdBQVk7QUFDbEMsVUFBVSxtQkFBTyxDQUFDLEdBQVE7QUFDMUIscUJBQXFCLG1CQUFPLENBQUMsR0FBbUI7QUFDaEQsYUFBYSxtQkFBTyxDQUFDLEdBQVc7QUFDaEMsWUFBWSxtQkFBTyxDQUFDLEdBQVU7QUFDOUIsU0FBUyxtQkFBTyxDQUFDLEdBQU87QUFDeEIsbUJBQW1CLG1CQUFPLENBQUMsR0FBaUI7QUFDNUMsWUFBWSxtQkFBTyxDQUFDLEdBQVU7QUFDOUIsWUFBWSxtQkFBTyxDQUFDLEdBQVU7QUFDOUIsZUFBZSxtQkFBTyxDQUFDLEdBQWE7QUFDcEMsU0FBUyxtQkFBTyxDQUFDLEdBQU87QUFDeEIsV0FBVyxtQkFBTyxDQUFDLEdBQVM7QUFDNUIsVUFBVSxtQkFBTyxDQUFDLEdBQVE7QUFDMUIsWUFBWSxtQkFBTyxDQUFDLEdBQVU7QUFDOUIsbUJBQW1CLG1CQUFPLENBQUMsR0FBaUI7QUFDNUMsb0JBQW9CLG1CQUFPLENBQUMsR0FBa0I7QUFDOUMsbUJBQW1CLG1CQUFPLENBQUMsR0FBaUI7QUFDNUMsbUJBQW1CLG1CQUFPLENBQUMsR0FBaUI7QUFDNUMsYUFBYSxtQkFBTyxDQUFDLEdBQVc7QUFDaEMsV0FBVyxtQkFBTyxDQUFDLEdBQVM7QUFDNUIiLCJmaWxlIjoiOTUuanMiLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IHtcbiAgRVBTSUxPTjogcmVxdWlyZSgnLi9lcHNpbG9uJylcbiAgLCBjcmVhdGU6IHJlcXVpcmUoJy4vY3JlYXRlJylcbiAgLCBjbG9uZTogcmVxdWlyZSgnLi9jbG9uZScpXG4gICwgZnJvbVZhbHVlczogcmVxdWlyZSgnLi9mcm9tVmFsdWVzJylcbiAgLCBjb3B5OiByZXF1aXJlKCcuL2NvcHknKVxuICAsIHNldDogcmVxdWlyZSgnLi9zZXQnKVxuICAsIGVxdWFsczogcmVxdWlyZSgnLi9lcXVhbHMnKVxuICAsIGV4YWN0RXF1YWxzOiByZXF1aXJlKCcuL2V4YWN0RXF1YWxzJylcbiAgLCBhZGQ6IHJlcXVpcmUoJy4vYWRkJylcbiAgLCBzdWJ0cmFjdDogcmVxdWlyZSgnLi9zdWJ0cmFjdCcpXG4gICwgc3ViOiByZXF1aXJlKCcuL3N1YicpXG4gICwgbXVsdGlwbHk6IHJlcXVpcmUoJy4vbXVsdGlwbHknKVxuICAsIG11bDogcmVxdWlyZSgnLi9tdWwnKVxuICAsIGRpdmlkZTogcmVxdWlyZSgnLi9kaXZpZGUnKVxuICAsIGRpdjogcmVxdWlyZSgnLi9kaXYnKVxuICAsIGludmVyc2U6IHJlcXVpcmUoJy4vaW52ZXJzZScpXG4gICwgbWluOiByZXF1aXJlKCcuL21pbicpXG4gICwgbWF4OiByZXF1aXJlKCcuL21heCcpXG4gICwgcm90YXRlOiByZXF1aXJlKCcuL3JvdGF0ZScpXG4gICwgZmxvb3I6IHJlcXVpcmUoJy4vZmxvb3InKVxuICAsIGNlaWw6IHJlcXVpcmUoJy4vY2VpbCcpXG4gICwgcm91bmQ6IHJlcXVpcmUoJy4vcm91bmQnKVxuICAsIHNjYWxlOiByZXF1aXJlKCcuL3NjYWxlJylcbiAgLCBzY2FsZUFuZEFkZDogcmVxdWlyZSgnLi9zY2FsZUFuZEFkZCcpXG4gICwgZGlzdGFuY2U6IHJlcXVpcmUoJy4vZGlzdGFuY2UnKVxuICAsIGRpc3Q6IHJlcXVpcmUoJy4vZGlzdCcpXG4gICwgc3F1YXJlZERpc3RhbmNlOiByZXF1aXJlKCcuL3NxdWFyZWREaXN0YW5jZScpXG4gICwgc3FyRGlzdDogcmVxdWlyZSgnLi9zcXJEaXN0JylcbiAgLCBsZW5ndGg6IHJlcXVpcmUoJy4vbGVuZ3RoJylcbiAgLCBsZW46IHJlcXVpcmUoJy4vbGVuJylcbiAgLCBzcXVhcmVkTGVuZ3RoOiByZXF1aXJlKCcuL3NxdWFyZWRMZW5ndGgnKVxuICAsIHNxckxlbjogcmVxdWlyZSgnLi9zcXJMZW4nKVxuICAsIG5lZ2F0ZTogcmVxdWlyZSgnLi9uZWdhdGUnKVxuICAsIG5vcm1hbGl6ZTogcmVxdWlyZSgnLi9ub3JtYWxpemUnKVxuICAsIGRvdDogcmVxdWlyZSgnLi9kb3QnKVxuICAsIGNyb3NzOiByZXF1aXJlKCcuL2Nyb3NzJylcbiAgLCBsZXJwOiByZXF1aXJlKCcuL2xlcnAnKVxuICAsIHJhbmRvbTogcmVxdWlyZSgnLi9yYW5kb20nKVxuICAsIHRyYW5zZm9ybU1hdDI6IHJlcXVpcmUoJy4vdHJhbnNmb3JtTWF0MicpXG4gICwgdHJhbnNmb3JtTWF0MmQ6IHJlcXVpcmUoJy4vdHJhbnNmb3JtTWF0MmQnKVxuICAsIHRyYW5zZm9ybU1hdDM6IHJlcXVpcmUoJy4vdHJhbnNmb3JtTWF0MycpXG4gICwgdHJhbnNmb3JtTWF0NDogcmVxdWlyZSgnLi90cmFuc2Zvcm1NYXQ0JylcbiAgLCBmb3JFYWNoOiByZXF1aXJlKCcuL2ZvckVhY2gnKVxuICAsIGxpbWl0OiByZXF1aXJlKCcuL2xpbWl0Jylcbn1cbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///95\n")},function(module,exports,__webpack_require__){"use strict";eval("\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.SV = void 0;\r\nconst engine_1 = __webpack_require__(291);\r\nconst boundingRect_1 = __webpack_require__(147);\r\nconst group_1 = __webpack_require__(149);\r\nconst pointer_1 = __webpack_require__(569);\r\nconst g6_1 = __webpack_require__(50);\r\nconst linkListNode_1 = __webpack_require__(570);\r\nconst binaryTreeNode_1 = __webpack_require__(571);\r\nconst clenQueuePointer_1 = __webpack_require__(572);\r\nconst twoCellNode_1 = __webpack_require__(573);\r\nconst cursor_1 = __webpack_require__(574);\r\nconst vector_1 = __webpack_require__(148);\r\nconst indexedNode_1 = __webpack_require__(575);\r\nexports.SV = function (DOMContainer, engineOptions = {}) {\r\n return new engine_1.Engine(DOMContainer, engineOptions);\r\n};\r\nexports.SV.Group = group_1.Group;\r\nexports.SV.Bound = boundingRect_1.Bound;\r\nexports.SV.Vector = vector_1.Vector;\r\nexports.SV.Mat3 = g6_1.Util.mat3;\r\nexports.SV.G6 = g6_1.default;\r\nexports.SV.registeredLayout = {};\r\nexports.SV.registeredShape = [\r\n pointer_1.default,\r\n linkListNode_1.default,\r\n binaryTreeNode_1.default,\r\n twoCellNode_1.default,\r\n indexedNode_1.default,\r\n cursor_1.default,\r\n clenQueuePointer_1.default,\r\n];\r\nexports.SV.registerShape = g6_1.default.registerNode;\r\nexports.SV.registerLayout = function (name, layoutCreator) {\r\n if (typeof layoutCreator.sourcesPreprocess !== 'function') {\r\n layoutCreator.sourcesPreprocess = function (data) {\r\n return data;\r\n };\r\n }\r\n if (typeof layoutCreator.defineLeakRule !== 'function') {\r\n layoutCreator.defineLeakRule = function (nodes) {\r\n return nodes;\r\n };\r\n }\r\n if (typeof layoutCreator.defineOptions !== 'function' || typeof layoutCreator.layout !== 'function') {\r\n return;\r\n }\r\n exports.SV.registeredLayout[name] = layoutCreator;\r\n};\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvU3RydWN0Vi50cz9iMTNkIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDBDQUFrQztBQUNsQyxnREFBOEM7QUFDOUMseUNBQXVDO0FBQ3ZDLDJDQUFnRDtBQUNoRCxxQ0FBb0M7QUFDcEMsZ0RBQTBEO0FBQzFELGtEQUE4RDtBQUM5RCxvREFBa0U7QUFDbEUsK0NBQXdEO0FBQ3hELDBDQUE4QztBQUM5QywwQ0FBeUM7QUFDekMsK0NBQXdEO0FBOEIzQyxVQUFFLEdBQVksVUFBUyxZQUF5QixFQUFFLGdCQUErQixFQUFHO0lBQzdGLE9BQU8sSUFBSSxlQUFNLENBQUMsWUFBWSxFQUFFLGFBQWEsQ0FBQyxDQUFDO0FBQ25ELENBQUM7QUFFRCxVQUFFLENBQUMsS0FBSyxHQUFHLGFBQUssQ0FBQztBQUNqQixVQUFFLENBQUMsS0FBSyxHQUFHLG9CQUFLLENBQUM7QUFDakIsVUFBRSxDQUFDLE1BQU0sR0FBRyxlQUFNLENBQUM7QUFDbkIsVUFBRSxDQUFDLElBQUksR0FBRyxTQUFJLENBQUMsSUFBSSxDQUFDO0FBQ3BCLFVBQUUsQ0FBQyxFQUFFLEdBQUcsWUFBRSxDQUFDO0FBRVgsVUFBRSxDQUFDLGdCQUFnQixHQUFHLEVBQUUsQ0FBQztBQUN6QixVQUFFLENBQUMsZUFBZSxHQUFHO0lBQ2pCLGlCQUFPO0lBQ1Asc0JBQVk7SUFDWix3QkFBYztJQUNkLHFCQUFXO0lBQ1gscUJBQVc7SUFDWCxnQkFBTTtJQUNOLDBCQUFnQjtDQUNuQixDQUFDO0FBRUYsVUFBRSxDQUFDLGFBQWEsR0FBRyxZQUFFLENBQUMsWUFBWSxDQUFDO0FBQ25DLFVBQUUsQ0FBQyxjQUFjLEdBQUcsVUFBUyxJQUFZLEVBQUUsYUFBNEI7SUFFbkUsSUFBRyxPQUFPLGFBQWEsQ0FBQyxpQkFBaUIsS0FBSyxVQUFVLEVBQUU7UUFDdEQsYUFBYSxDQUFDLGlCQUFpQixHQUFHLFVBQVMsSUFBa0I7WUFDekQsT0FBTyxJQUFJLENBQUM7UUFDaEIsQ0FBQztLQUNKO0lBRUQsSUFBRyxPQUFPLGFBQWEsQ0FBQyxjQUFjLEtBQUssVUFBVSxFQUFFO1FBQ25ELGFBQWEsQ0FBQyxjQUFjLEdBQUcsVUFBUyxLQUFlO1lBQ25ELE9BQU8sS0FBSyxDQUFDO1FBQ2pCLENBQUM7S0FDSjtJQUVELElBQUcsT0FBTyxhQUFhLENBQUMsYUFBYSxLQUFLLFVBQVUsSUFBSSxPQUFPLGFBQWEsQ0FBQyxNQUFNLEtBQUssVUFBVSxFQUFFO1FBQ2hHLE9BQU87S0FDVjtJQUVELFVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxhQUFhLENBQUM7QUFDOUMsQ0FBQyxDQUFDIiwiZmlsZSI6Ijk2LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRW5naW5lIH0gZnJvbSBcIi4vZW5naW5lXCI7XHJcbmltcG9ydCB7IEJvdW5kIH0gZnJvbSBcIi4vQ29tbW9uL2JvdW5kaW5nUmVjdFwiO1xyXG5pbXBvcnQgeyBHcm91cCB9IGZyb20gXCIuL0NvbW1vbi9ncm91cFwiO1xyXG5pbXBvcnQgcG9pbnRlciBmcm9tIFwiLi9SZWdpc3RlcmVkU2hhcGUvcG9pbnRlclwiO1xyXG5pbXBvcnQgRzYsIHsgVXRpbCB9IGZyb20gJ0BhbnR2L2c2JztcclxuaW1wb3J0IGxpbmtMaXN0Tm9kZSBmcm9tIFwiLi9SZWdpc3RlcmVkU2hhcGUvbGlua0xpc3ROb2RlXCI7XHJcbmltcG9ydCBiaW5hcnlUcmVlTm9kZSBmcm9tIFwiLi9SZWdpc3RlcmVkU2hhcGUvYmluYXJ5VHJlZU5vZGVcIjtcclxuaW1wb3J0IENMZW5RdWV1ZVBvaW50ZXIgZnJvbSBcIi4vUmVnaXN0ZXJlZFNoYXBlL2NsZW5RdWV1ZVBvaW50ZXJcIjtcclxuaW1wb3J0IHR3b0NlbGxOb2RlIGZyb20gXCIuL1JlZ2lzdGVyZWRTaGFwZS90d29DZWxsTm9kZVwiO1xyXG5pbXBvcnQgQ3Vyc29yIGZyb20gXCIuL1JlZ2lzdGVyZWRTaGFwZS9jdXJzb3JcIjtcclxuaW1wb3J0IHsgVmVjdG9yIH0gZnJvbSBcIi4vQ29tbW9uL3ZlY3RvclwiO1xyXG5pbXBvcnQgaW5kZXhlZE5vZGUgZnJvbSBcIi4vUmVnaXN0ZXJlZFNoYXBlL2luZGV4ZWROb2RlXCI7XHJcbmltcG9ydCB7IEVuZ2luZU9wdGlvbnMsIExheW91dENyZWF0b3IgfSBmcm9tIFwiLi9vcHRpb25zXCI7XHJcbmltcG9ydCB7IFNWTm9kZSB9IGZyb20gXCIuL01vZGVsL1NWTm9kZVwiO1xyXG5pbXBvcnQgeyBTb3VyY2VOb2RlIH0gZnJvbSBcIi4vc291cmNlc1wiO1xyXG5cclxuXHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFN0cnVjdFYge1xyXG4gICAgKERPTUNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIGVuZ2luZU9wdGlvbnM6IEVuZ2luZU9wdGlvbnMpOiBFbmdpbmU7XHJcbiAgICBHcm91cDogdHlwZW9mIEdyb3VwO1xyXG4gICAgQm91bmQ6IHR5cGVvZiBCb3VuZDtcclxuICAgIFZlY3RvcjogdHlwZW9mIFZlY3RvcixcclxuICAgIE1hdDM6IGFueTtcclxuICAgIEc2OiBhbnk7XHJcblxyXG4gICAgcmVnaXN0ZXJlZFNoYXBlOiBhbnlbXTtcclxuXHJcbiAgICByZWdpc3RlcmVkTGF5b3V0OiB7IFtrZXk6IHN0cmluZ106IExheW91dENyZWF0b3IgfSxcclxuXHJcbiAgICByZWdpc3RlclNoYXBlOiBGdW5jdGlvbixcclxuXHJcbiAgICAvKipcclxuICAgICAqIOazqOWGjOS4gOS4quW4g+WxgOWZqFxyXG4gICAgICogQHBhcmFtIG5hbWUgXHJcbiAgICAgKiBAcGFyYW0gbGF5b3V0XHJcbiAgICAgKi9cclxuICAgIHJlZ2lzdGVyTGF5b3V0KG5hbWU6IHN0cmluZywgbGF5b3V0Q3JlYXRvcjogTGF5b3V0Q3JlYXRvcik7XHJcbn1cclxuXHJcblxyXG5leHBvcnQgY29uc3QgU1Y6IFN0cnVjdFYgPSBmdW5jdGlvbihET01Db250YWluZXI6IEhUTUxFbGVtZW50LCBlbmdpbmVPcHRpb25zOiBFbmdpbmVPcHRpb25zID0geyB9KSB7XHJcbiAgICByZXR1cm4gbmV3IEVuZ2luZShET01Db250YWluZXIsIGVuZ2luZU9wdGlvbnMpO1xyXG59XHJcblxyXG5TVi5Hcm91cCA9IEdyb3VwO1xyXG5TVi5Cb3VuZCA9IEJvdW5kO1xyXG5TVi5WZWN0b3IgPSBWZWN0b3I7XHJcblNWLk1hdDMgPSBVdGlsLm1hdDM7XHJcblNWLkc2ID0gRzY7XHJcblxyXG5TVi5yZWdpc3RlcmVkTGF5b3V0ID0ge307XHJcblNWLnJlZ2lzdGVyZWRTaGFwZSA9IFtcclxuICAgIHBvaW50ZXIsIFxyXG4gICAgbGlua0xpc3ROb2RlLCBcclxuICAgIGJpbmFyeVRyZWVOb2RlLCBcclxuICAgIHR3b0NlbGxOb2RlLFxyXG4gICAgaW5kZXhlZE5vZGUsXHJcbiAgICBDdXJzb3IsXHJcbiAgICBDTGVuUXVldWVQb2ludGVyLFxyXG5dO1xyXG5cclxuU1YucmVnaXN0ZXJTaGFwZSA9IEc2LnJlZ2lzdGVyTm9kZTtcclxuU1YucmVnaXN0ZXJMYXlvdXQgPSBmdW5jdGlvbihuYW1lOiBzdHJpbmcsIGxheW91dENyZWF0b3I6IExheW91dENyZWF0b3IpIHtcclxuXHJcbiAgICBpZih0eXBlb2YgbGF5b3V0Q3JlYXRvci5zb3VyY2VzUHJlcHJvY2VzcyAhPT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgIGxheW91dENyZWF0b3Iuc291cmNlc1ByZXByb2Nlc3MgPSBmdW5jdGlvbihkYXRhOiBTb3VyY2VOb2RlW10pOiBTb3VyY2VOb2RlW10ge1xyXG4gICAgICAgICAgICByZXR1cm4gZGF0YTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYodHlwZW9mIGxheW91dENyZWF0b3IuZGVmaW5lTGVha1J1bGUgIT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICBsYXlvdXRDcmVhdG9yLmRlZmluZUxlYWtSdWxlID0gZnVuY3Rpb24obm9kZXM6IFNWTm9kZVtdKTogU1ZOb2RlW10ge1xyXG4gICAgICAgICAgICByZXR1cm4gbm9kZXM7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmKHR5cGVvZiBsYXlvdXRDcmVhdG9yLmRlZmluZU9wdGlvbnMgIT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIGxheW91dENyZWF0b3IubGF5b3V0ICE9PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBTVi5yZWdpc3RlcmVkTGF5b3V0W25hbWVdID0gbGF5b3V0Q3JlYXRvcjtcclxufTtcclxuXHJcblxyXG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///96\n")},function(module,exports,__webpack_require__){"use strict";eval('\r\nObject.defineProperty(exports, "__esModule", { value: true });\r\nexports.EventBus = void 0;\r\nexports.EventBus = {\r\n events: {},\r\n on(eventName, callback) {\r\n if (exports.EventBus.events[eventName] === undefined) {\r\n exports.EventBus.events[eventName] = [];\r\n }\r\n exports.EventBus.events[eventName].push(callback);\r\n },\r\n emit(eventName, payload) {\r\n if (exports.EventBus.events[eventName] === undefined) {\r\n return;\r\n }\r\n exports.EventBus.events[eventName].map(item => item(payload));\r\n }\r\n};\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvQ29tbW9uL2V2ZW50QnVzLnRzPzBlMjIiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBU2EsZ0JBQVEsR0FBc0I7SUFDdkMsTUFBTSxFQUFFLEVBQUc7SUFPWCxFQUFFLENBQUMsU0FBaUIsRUFBRSxRQUFrQjtRQUNwQyxJQUFHLGdCQUFRLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLFNBQVMsRUFBRTtZQUN6QyxnQkFBUSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUM7U0FDbkM7UUFFRCxnQkFBUSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQU9ELElBQUksQ0FBQyxTQUFpQixFQUFFLE9BQWE7UUFDakMsSUFBRyxnQkFBUSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxTQUFTLEVBQUU7WUFDekMsT0FBTztTQUNWO1FBRUQsZ0JBQVEsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDMUQsQ0FBQztDQUNKLENBQUMiLCJmaWxlIjoiOTcuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRXZlbnRCdXNJbnRlcmZhY2Uge1xyXG4gICAgZXZlbnRzOiB7IFtrZXk6IHN0cmluZ106IEZ1bmN0aW9uW10gfTtcclxuICAgIG9uKGV2ZW50TmFtZTogc3RyaW5nLCBjYWxsYmFjazogRnVuY3Rpb24pOiB2b2lkO1xyXG4gICAgZW1pdChldmVudE5hbWU6IHN0cmluZywgcGF5bG9hZD86IGFueSk6IHZvaWQ7XHJcbn1cclxuXHJcblxyXG5leHBvcnQgY29uc3QgRXZlbnRCdXM6IEV2ZW50QnVzSW50ZXJmYWNlID0ge1xyXG4gICAgZXZlbnRzOiB7IH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDnu5Hlrprkuovku7ZcclxuICAgICAqIEBwYXJhbSBldmVudE5hbWUgXHJcbiAgICAgKiBAcGFyYW0gY2FsbGJhY2sgXHJcbiAgICAgKi9cclxuICAgIG9uKGV2ZW50TmFtZTogc3RyaW5nLCBjYWxsYmFjazogRnVuY3Rpb24pIHtcclxuICAgICAgICBpZihFdmVudEJ1cy5ldmVudHNbZXZlbnROYW1lXSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIEV2ZW50QnVzLmV2ZW50c1tldmVudE5hbWVdID0gW107XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBFdmVudEJ1cy5ldmVudHNbZXZlbnROYW1lXS5wdXNoKGNhbGxiYWNrKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSBldmVudE5hbWUgXHJcbiAgICAgKiBAcGFyYW0gcGF5bG9hZCBcclxuICAgICAqL1xyXG4gICAgZW1pdChldmVudE5hbWU6IHN0cmluZywgcGF5bG9hZD86IGFueSkge1xyXG4gICAgICAgIGlmKEV2ZW50QnVzLmV2ZW50c1tldmVudE5hbWVdID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgRXZlbnRCdXMuZXZlbnRzW2V2ZW50TmFtZV0ubWFwKGl0ZW0gPT4gaXRlbShwYXlsb2FkKSk7XHJcbiAgICB9XHJcbn07Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///97\n')},function(module,exports,__webpack_require__){"use strict";eval('\n\nObject.defineProperty(exports, "__esModule", {\n value: true\n});\nexports.default = void 0;\n\nvar adjMatrix = function adjMatrix(graphData, directed) {\n var nodes = graphData.nodes,\n edges = graphData.edges;\n var matrix = []; // map node with index in data.nodes\n\n var nodeMap = {};\n\n if (!nodes) {\n throw new Error("invalid nodes data!");\n }\n\n if (nodes) {\n nodes.forEach(function (node, i) {\n nodeMap[node.id] = i;\n var row = [];\n matrix.push(row);\n });\n }\n\n if (edges) {\n edges.forEach(function (edge) {\n var source = edge.source,\n target = edge.target;\n var sIndex = nodeMap[source];\n var tIndex = nodeMap[target];\n if (!sIndex && sIndex !== 0 || !tIndex && tIndex !== 0) return;\n matrix[sIndex][tIndex] = 1;\n\n if (!directed) {\n matrix[tIndex][sIndex] = 1;\n }\n });\n }\n\n return matrix;\n};\n\nvar _default = adjMatrix;\nexports.default = _default;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvYWxnb3JpdGhtL2xpYi9hZGphY2VudC1tYXRyaXguanM/MTZjNyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBYTs7QUFFYjtBQUNBO0FBQ0EsQ0FBQztBQUNEOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjs7QUFFbEI7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTs7QUFFQTtBQUNBIiwiZmlsZSI6Ijk4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5cbnZhciBhZGpNYXRyaXggPSBmdW5jdGlvbiBhZGpNYXRyaXgoZ3JhcGhEYXRhLCBkaXJlY3RlZCkge1xuICB2YXIgbm9kZXMgPSBncmFwaERhdGEubm9kZXMsXG4gICAgICBlZGdlcyA9IGdyYXBoRGF0YS5lZGdlcztcbiAgdmFyIG1hdHJpeCA9IFtdOyAvLyBtYXAgbm9kZSB3aXRoIGluZGV4IGluIGRhdGEubm9kZXNcblxuICB2YXIgbm9kZU1hcCA9IHt9O1xuXG4gIGlmICghbm9kZXMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIG5vZGVzIGRhdGEhXCIpO1xuICB9XG5cbiAgaWYgKG5vZGVzKSB7XG4gICAgbm9kZXMuZm9yRWFjaChmdW5jdGlvbiAobm9kZSwgaSkge1xuICAgICAgbm9kZU1hcFtub2RlLmlkXSA9IGk7XG4gICAgICB2YXIgcm93ID0gW107XG4gICAgICBtYXRyaXgucHVzaChyb3cpO1xuICAgIH0pO1xuICB9XG5cbiAgaWYgKGVkZ2VzKSB7XG4gICAgZWRnZXMuZm9yRWFjaChmdW5jdGlvbiAoZWRnZSkge1xuICAgICAgdmFyIHNvdXJjZSA9IGVkZ2Uuc291cmNlLFxuICAgICAgICAgIHRhcmdldCA9IGVkZ2UudGFyZ2V0O1xuICAgICAgdmFyIHNJbmRleCA9IG5vZGVNYXBbc291cmNlXTtcbiAgICAgIHZhciB0SW5kZXggPSBub2RlTWFwW3RhcmdldF07XG4gICAgICBpZiAoIXNJbmRleCAmJiBzSW5kZXggIT09IDAgfHwgIXRJbmRleCAmJiB0SW5kZXggIT09IDApIHJldHVybjtcbiAgICAgIG1hdHJpeFtzSW5kZXhdW3RJbmRleF0gPSAxO1xuXG4gICAgICBpZiAoIWRpcmVjdGVkKSB7XG4gICAgICAgIG1hdHJpeFt0SW5kZXhdW3NJbmRleF0gPSAxO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIG1hdHJpeDtcbn07XG5cbnZhciBfZGVmYXVsdCA9IGFkak1hdHJpeDtcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///98\n')},function(module,exports,__webpack_require__){eval("var ListCache = __webpack_require__(100),\n stackClear = __webpack_require__(329),\n stackDelete = __webpack_require__(330),\n stackGet = __webpack_require__(331),\n stackHas = __webpack_require__(332),\n stackSet = __webpack_require__(333);\n\n/**\n * Creates a stack cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Stack(entries) {\n var data = this.__data__ = new ListCache(entries);\n this.size = data.size;\n}\n\n// Add methods to `Stack`.\nStack.prototype.clear = stackClear;\nStack.prototype['delete'] = stackDelete;\nStack.prototype.get = stackGet;\nStack.prototype.has = stackHas;\nStack.prototype.set = stackSet;\n\nmodule.exports = Stack;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19TdGFjay5qcz83ZTY0Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGdCQUFnQixtQkFBTyxDQUFDLEdBQWM7QUFDdEMsaUJBQWlCLG1CQUFPLENBQUMsR0FBZTtBQUN4QyxrQkFBa0IsbUJBQU8sQ0FBQyxHQUFnQjtBQUMxQyxlQUFlLG1CQUFPLENBQUMsR0FBYTtBQUNwQyxlQUFlLG1CQUFPLENBQUMsR0FBYTtBQUNwQyxlQUFlLG1CQUFPLENBQUMsR0FBYTs7QUFFcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsTUFBTTtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsImZpbGUiOiI5OS5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBMaXN0Q2FjaGUgPSByZXF1aXJlKCcuL19MaXN0Q2FjaGUnKSxcbiAgICBzdGFja0NsZWFyID0gcmVxdWlyZSgnLi9fc3RhY2tDbGVhcicpLFxuICAgIHN0YWNrRGVsZXRlID0gcmVxdWlyZSgnLi9fc3RhY2tEZWxldGUnKSxcbiAgICBzdGFja0dldCA9IHJlcXVpcmUoJy4vX3N0YWNrR2V0JyksXG4gICAgc3RhY2tIYXMgPSByZXF1aXJlKCcuL19zdGFja0hhcycpLFxuICAgIHN0YWNrU2V0ID0gcmVxdWlyZSgnLi9fc3RhY2tTZXQnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgc3RhY2sgY2FjaGUgb2JqZWN0IHRvIHN0b3JlIGtleS12YWx1ZSBwYWlycy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge0FycmF5fSBbZW50cmllc10gVGhlIGtleS12YWx1ZSBwYWlycyB0byBjYWNoZS5cbiAqL1xuZnVuY3Rpb24gU3RhY2soZW50cmllcykge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX18gPSBuZXcgTGlzdENhY2hlKGVudHJpZXMpO1xuICB0aGlzLnNpemUgPSBkYXRhLnNpemU7XG59XG5cbi8vIEFkZCBtZXRob2RzIHRvIGBTdGFja2AuXG5TdGFjay5wcm90b3R5cGUuY2xlYXIgPSBzdGFja0NsZWFyO1xuU3RhY2sucHJvdG90eXBlWydkZWxldGUnXSA9IHN0YWNrRGVsZXRlO1xuU3RhY2sucHJvdG90eXBlLmdldCA9IHN0YWNrR2V0O1xuU3RhY2sucHJvdG90eXBlLmhhcyA9IHN0YWNrSGFzO1xuU3RhY2sucHJvdG90eXBlLnNldCA9IHN0YWNrU2V0O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFN0YWNrO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///99\n")},function(module,exports,__webpack_require__){eval("var listCacheClear = __webpack_require__(324),\n listCacheDelete = __webpack_require__(325),\n listCacheGet = __webpack_require__(326),\n listCacheHas = __webpack_require__(327),\n listCacheSet = __webpack_require__(328);\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\nmodule.exports = ListCache;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19MaXN0Q2FjaGUuanM/NWUyZSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxxQkFBcUIsbUJBQU8sQ0FBQyxHQUFtQjtBQUNoRCxzQkFBc0IsbUJBQU8sQ0FBQyxHQUFvQjtBQUNsRCxtQkFBbUIsbUJBQU8sQ0FBQyxHQUFpQjtBQUM1QyxtQkFBbUIsbUJBQU8sQ0FBQyxHQUFpQjtBQUM1QyxtQkFBbUIsbUJBQU8sQ0FBQyxHQUFpQjs7QUFFNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsTUFBTTtBQUNqQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwiZmlsZSI6IjEwMC5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBsaXN0Q2FjaGVDbGVhciA9IHJlcXVpcmUoJy4vX2xpc3RDYWNoZUNsZWFyJyksXG4gICAgbGlzdENhY2hlRGVsZXRlID0gcmVxdWlyZSgnLi9fbGlzdENhY2hlRGVsZXRlJyksXG4gICAgbGlzdENhY2hlR2V0ID0gcmVxdWlyZSgnLi9fbGlzdENhY2hlR2V0JyksXG4gICAgbGlzdENhY2hlSGFzID0gcmVxdWlyZSgnLi9fbGlzdENhY2hlSGFzJyksXG4gICAgbGlzdENhY2hlU2V0ID0gcmVxdWlyZSgnLi9fbGlzdENhY2hlU2V0Jyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBsaXN0IGNhY2hlIG9iamVjdC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge0FycmF5fSBbZW50cmllc10gVGhlIGtleS12YWx1ZSBwYWlycyB0byBjYWNoZS5cbiAqL1xuZnVuY3Rpb24gTGlzdENhY2hlKGVudHJpZXMpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBlbnRyaWVzID09IG51bGwgPyAwIDogZW50cmllcy5sZW5ndGg7XG5cbiAgdGhpcy5jbGVhcigpO1xuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciBlbnRyeSA9IGVudHJpZXNbaW5kZXhdO1xuICAgIHRoaXMuc2V0KGVudHJ5WzBdLCBlbnRyeVsxXSk7XG4gIH1cbn1cblxuLy8gQWRkIG1ldGhvZHMgdG8gYExpc3RDYWNoZWAuXG5MaXN0Q2FjaGUucHJvdG90eXBlLmNsZWFyID0gbGlzdENhY2hlQ2xlYXI7XG5MaXN0Q2FjaGUucHJvdG90eXBlWydkZWxldGUnXSA9IGxpc3RDYWNoZURlbGV0ZTtcbkxpc3RDYWNoZS5wcm90b3R5cGUuZ2V0ID0gbGlzdENhY2hlR2V0O1xuTGlzdENhY2hlLnByb3RvdHlwZS5oYXMgPSBsaXN0Q2FjaGVIYXM7XG5MaXN0Q2FjaGUucHJvdG90eXBlLnNldCA9IGxpc3RDYWNoZVNldDtcblxubW9kdWxlLmV4cG9ydHMgPSBMaXN0Q2FjaGU7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///100\n")},function(module,exports,__webpack_require__){eval("var eq = __webpack_require__(72);\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n var length = array.length;\n while (length--) {\n if (eq(array[length][0], key)) {\n return length;\n }\n }\n return -1;\n}\n\nmodule.exports = assocIndexOf;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19hc3NvY0luZGV4T2YuanM/Y2I1YSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxTQUFTLG1CQUFPLENBQUMsRUFBTTs7QUFFdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE1BQU07QUFDakIsV0FBVyxFQUFFO0FBQ2IsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwiZmlsZSI6IjEwMS5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBlcSA9IHJlcXVpcmUoJy4vZXEnKTtcblxuLyoqXG4gKiBHZXRzIHRoZSBpbmRleCBhdCB3aGljaCB0aGUgYGtleWAgaXMgZm91bmQgaW4gYGFycmF5YCBvZiBrZXktdmFsdWUgcGFpcnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHsqfSBrZXkgVGhlIGtleSB0byBzZWFyY2ggZm9yLlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAqL1xuZnVuY3Rpb24gYXNzb2NJbmRleE9mKGFycmF5LCBrZXkpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcbiAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgaWYgKGVxKGFycmF5W2xlbmd0aF1bMF0sIGtleSkpIHtcbiAgICAgIHJldHVybiBsZW5ndGg7XG4gICAgfVxuICB9XG4gIHJldHVybiAtMTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhc3NvY0luZGV4T2Y7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///101\n")},function(module,exports,__webpack_require__){eval("var getNative = __webpack_require__(64);\n\n/* Built-in method references that are verified to be native. */\nvar nativeCreate = getNative(Object, 'create');\n\nmodule.exports = nativeCreate;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19uYXRpdmVDcmVhdGUuanM/NjA0NCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxnQkFBZ0IsbUJBQU8sQ0FBQyxFQUFjOztBQUV0QztBQUNBOztBQUVBIiwiZmlsZSI6IjEwMi5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBnZXROYXRpdmUgPSByZXF1aXJlKCcuL19nZXROYXRpdmUnKTtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgdGhhdCBhcmUgdmVyaWZpZWQgdG8gYmUgbmF0aXZlLiAqL1xudmFyIG5hdGl2ZUNyZWF0ZSA9IGdldE5hdGl2ZShPYmplY3QsICdjcmVhdGUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBuYXRpdmVDcmVhdGU7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///102\n")},function(module,exports,__webpack_require__){eval("var isKeyable = __webpack_require__(348);\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n var data = map.__data__;\n return isKeyable(key)\n ? data[typeof key == 'string' ? 'string' : 'hash']\n : data.map;\n}\n\nmodule.exports = getMapData;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19nZXRNYXBEYXRhLmpzPzQyNDUiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsZ0JBQWdCLG1CQUFPLENBQUMsR0FBYzs7QUFFdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsRUFBRTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwiZmlsZSI6IjEwMy5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBpc0tleWFibGUgPSByZXF1aXJlKCcuL19pc0tleWFibGUnKTtcblxuLyoqXG4gKiBHZXRzIHRoZSBkYXRhIGZvciBgbWFwYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG1hcCBUaGUgbWFwIHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUgcmVmZXJlbmNlIGtleS5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtYXAgZGF0YS5cbiAqL1xuZnVuY3Rpb24gZ2V0TWFwRGF0YShtYXAsIGtleSkge1xuICB2YXIgZGF0YSA9IG1hcC5fX2RhdGFfXztcbiAgcmV0dXJuIGlzS2V5YWJsZShrZXkpXG4gICAgPyBkYXRhW3R5cGVvZiBrZXkgPT0gJ3N0cmluZycgPyAnc3RyaW5nJyA6ICdoYXNoJ11cbiAgICA6IGRhdGEubWFwO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldE1hcERhdGE7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///103\n")},function(module,exports,__webpack_require__){eval("var baseAssignValue = __webpack_require__(105),\n eq = __webpack_require__(72);\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Assigns `value` to `key` of `object` if the existing value is not equivalent\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction assignValue(object, key, value) {\n var objValue = object[key];\n if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n (value === undefined && !(key in object))) {\n baseAssignValue(object, key, value);\n }\n}\n\nmodule.exports = assignValue;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19hc3NpZ25WYWx1ZS5qcz8zMmIzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHNCQUFzQixtQkFBTyxDQUFDLEdBQW9CO0FBQ2xELFNBQVMsbUJBQU8sQ0FBQyxFQUFNOztBQUV2QjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixXQUFXLEVBQUU7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwiZmlsZSI6IjEwNC5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBiYXNlQXNzaWduVmFsdWUgPSByZXF1aXJlKCcuL19iYXNlQXNzaWduVmFsdWUnKSxcbiAgICBlcSA9IHJlcXVpcmUoJy4vZXEnKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBBc3NpZ25zIGB2YWx1ZWAgdG8gYGtleWAgb2YgYG9iamVjdGAgaWYgdGhlIGV4aXN0aW5nIHZhbHVlIGlzIG5vdCBlcXVpdmFsZW50XG4gKiB1c2luZyBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICogZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBhc3NpZ24uXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBhc3NpZ24uXG4gKi9cbmZ1bmN0aW9uIGFzc2lnblZhbHVlKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICB2YXIgb2JqVmFsdWUgPSBvYmplY3Rba2V5XTtcbiAgaWYgKCEoaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkgJiYgZXEob2JqVmFsdWUsIHZhbHVlKSkgfHxcbiAgICAgICh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmICEoa2V5IGluIG9iamVjdCkpKSB7XG4gICAgYmFzZUFzc2lnblZhbHVlKG9iamVjdCwga2V5LCB2YWx1ZSk7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhc3NpZ25WYWx1ZTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///104\n")},function(module,exports,__webpack_require__){eval("var defineProperty = __webpack_require__(189);\n\n/**\n * The base implementation of `assignValue` and `assignMergeValue` without\n * value checks.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction baseAssignValue(object, key, value) {\n if (key == '__proto__' && defineProperty) {\n defineProperty(object, key, {\n 'configurable': true,\n 'enumerable': true,\n 'value': value,\n 'writable': true\n });\n } else {\n object[key] = value;\n }\n}\n\nmodule.exports = baseAssignValue;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlQXNzaWduVmFsdWUuanM/ODcyYSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxxQkFBcUIsbUJBQU8sQ0FBQyxHQUFtQjs7QUFFaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsV0FBVyxFQUFFO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBIiwiZmlsZSI6IjEwNS5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vX2RlZmluZVByb3BlcnR5Jyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYGFzc2lnblZhbHVlYCBhbmQgYGFzc2lnbk1lcmdlVmFsdWVgIHdpdGhvdXRcbiAqIHZhbHVlIGNoZWNrcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gYXNzaWduLlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gYXNzaWduLlxuICovXG5mdW5jdGlvbiBiYXNlQXNzaWduVmFsdWUob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIGlmIChrZXkgPT0gJ19fcHJvdG9fXycgJiYgZGVmaW5lUHJvcGVydHkpIHtcbiAgICBkZWZpbmVQcm9wZXJ0eShvYmplY3QsIGtleSwge1xuICAgICAgJ2NvbmZpZ3VyYWJsZSc6IHRydWUsXG4gICAgICAnZW51bWVyYWJsZSc6IHRydWUsXG4gICAgICAndmFsdWUnOiB2YWx1ZSxcbiAgICAgICd3cml0YWJsZSc6IHRydWVcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBvYmplY3Rba2V5XSA9IHZhbHVlO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUFzc2lnblZhbHVlO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///105\n")},function(module,exports){eval("/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n var type = typeof value;\n length = length == null ? MAX_SAFE_INTEGER : length;\n\n return !!length &&\n (type == 'number' ||\n (type != 'symbol' && reIsUint.test(value))) &&\n (value > -1 && value % 1 == 0 && value < length);\n}\n\nmodule.exports = isIndex;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19pc0luZGV4LmpzP2MwOTgiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxFQUFFO0FBQ2IsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwiZmlsZSI6IjEwNi5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIE1BWF9TQUZFX0lOVEVHRVIgPSA5MDA3MTk5MjU0NzQwOTkxO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgdW5zaWduZWQgaW50ZWdlciB2YWx1ZXMuICovXG52YXIgcmVJc1VpbnQgPSAvXig/OjB8WzEtOV1cXGQqKSQvO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgYXJyYXktbGlrZSBpbmRleC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcGFyYW0ge251bWJlcn0gW2xlbmd0aD1NQVhfU0FGRV9JTlRFR0VSXSBUaGUgdXBwZXIgYm91bmRzIG9mIGEgdmFsaWQgaW5kZXguXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGluZGV4LCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzSW5kZXgodmFsdWUsIGxlbmd0aCkge1xuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgbGVuZ3RoID0gbGVuZ3RoID09IG51bGwgPyBNQVhfU0FGRV9JTlRFR0VSIDogbGVuZ3RoO1xuXG4gIHJldHVybiAhIWxlbmd0aCAmJlxuICAgICh0eXBlID09ICdudW1iZXInIHx8XG4gICAgICAodHlwZSAhPSAnc3ltYm9sJyAmJiByZUlzVWludC50ZXN0KHZhbHVlKSkpICYmXG4gICAgICAgICh2YWx1ZSA+IC0xICYmIHZhbHVlICUgMSA9PSAwICYmIHZhbHVlIDwgbGVuZ3RoKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0luZGV4O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///106\n")},function(module,exports){eval("/**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\nfunction baseUnary(func) {\n return function(value) {\n return func(value);\n };\n}\n\nmodule.exports = baseUnary;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlVW5hcnkuanM/YjA0NyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsU0FBUztBQUNwQixhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwiZmlsZSI6IjEwNy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udW5hcnlgIHdpdGhvdXQgc3VwcG9ydCBmb3Igc3RvcmluZyBtZXRhZGF0YS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY2FwIGFyZ3VtZW50cyBmb3IuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjYXBwZWQgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGJhc2VVbmFyeShmdW5jKSB7XG4gIHJldHVybiBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHJldHVybiBmdW5jKHZhbHVlKTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlVW5hcnk7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///107\n")},function(module,exports){eval("/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n var Ctor = value && value.constructor,\n proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n return value === proto;\n}\n\nmodule.exports = isPrototype;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19pc1Byb3RvdHlwZS5qcz9lYWM1Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEVBQUU7QUFDYixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSIsImZpbGUiOiIxMDguanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGxpa2VseSBhIHByb3RvdHlwZSBvYmplY3QuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBwcm90b3R5cGUsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaXNQcm90b3R5cGUodmFsdWUpIHtcbiAgdmFyIEN0b3IgPSB2YWx1ZSAmJiB2YWx1ZS5jb25zdHJ1Y3RvcixcbiAgICAgIHByb3RvID0gKHR5cGVvZiBDdG9yID09ICdmdW5jdGlvbicgJiYgQ3Rvci5wcm90b3R5cGUpIHx8IG9iamVjdFByb3RvO1xuXG4gIHJldHVybiB2YWx1ZSA9PT0gcHJvdG87XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNQcm90b3R5cGU7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///108\n")},function(module,exports,__webpack_require__){eval("var overArg = __webpack_require__(191);\n\n/** Built-in value references. */\nvar getPrototype = overArg(Object.getPrototypeOf, Object);\n\nmodule.exports = getPrototype;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19nZXRQcm90b3R5cGUuanM/MmRjYiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLG1CQUFPLENBQUMsR0FBWTs7QUFFbEM7QUFDQTs7QUFFQSIsImZpbGUiOiIxMDkuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgb3ZlckFyZyA9IHJlcXVpcmUoJy4vX292ZXJBcmcnKTtcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgZ2V0UHJvdG90eXBlID0gb3ZlckFyZyhPYmplY3QuZ2V0UHJvdG90eXBlT2YsIE9iamVjdCk7XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0UHJvdG90eXBlO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///109\n")},function(module,exports,__webpack_require__){eval("var baseForOwn = __webpack_require__(164),\n createBaseEach = __webpack_require__(377);\n\n/**\n * The base implementation of `_.forEach` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n */\nvar baseEach = createBaseEach(baseForOwn);\n\nmodule.exports = baseEach;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlRWFjaC5qcz80OGEwIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGlCQUFpQixtQkFBTyxDQUFDLEdBQWU7QUFDeEMscUJBQXFCLG1CQUFPLENBQUMsR0FBbUI7O0FBRWhEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxhQUFhO0FBQ3hCLFdBQVcsU0FBUztBQUNwQixhQUFhLGFBQWE7QUFDMUI7QUFDQTs7QUFFQSIsImZpbGUiOiIxMTAuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYmFzZUZvck93biA9IHJlcXVpcmUoJy4vX2Jhc2VGb3JPd24nKSxcbiAgICBjcmVhdGVCYXNlRWFjaCA9IHJlcXVpcmUoJy4vX2NyZWF0ZUJhc2VFYWNoJyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZm9yRWFjaGAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge0FycmF5fE9iamVjdH0gUmV0dXJucyBgY29sbGVjdGlvbmAuXG4gKi9cbnZhciBiYXNlRWFjaCA9IGNyZWF0ZUJhc2VFYWNoKGJhc2VGb3JPd24pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VFYWNoO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///110\n")},function(module,exports,__webpack_require__){eval("var castPath = __webpack_require__(112),\n toKey = __webpack_require__(90);\n\n/**\n * The base implementation of `_.get` without support for default values.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @returns {*} Returns the resolved value.\n */\nfunction baseGet(object, path) {\n path = castPath(path, object);\n\n var index = 0,\n length = path.length;\n\n while (object != null && index < length) {\n object = object[toKey(path[index++])];\n }\n return (index && index == length) ? object : undefined;\n}\n\nmodule.exports = baseGet;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlR2V0LmpzPzY1NmIiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsZUFBZSxtQkFBTyxDQUFDLEdBQWE7QUFDcEMsWUFBWSxtQkFBTyxDQUFDLEVBQVU7O0FBRTlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsYUFBYTtBQUN4QixhQUFhLEVBQUU7QUFDZjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwiZmlsZSI6IjExMS5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBjYXN0UGF0aCA9IHJlcXVpcmUoJy4vX2Nhc3RQYXRoJyksXG4gICAgdG9LZXkgPSByZXF1aXJlKCcuL190b0tleScpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmdldGAgd2l0aG91dCBzdXBwb3J0IGZvciBkZWZhdWx0IHZhbHVlcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXNvbHZlZCB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gYmFzZUdldChvYmplY3QsIHBhdGgpIHtcbiAgcGF0aCA9IGNhc3RQYXRoKHBhdGgsIG9iamVjdCk7XG5cbiAgdmFyIGluZGV4ID0gMCxcbiAgICAgIGxlbmd0aCA9IHBhdGgubGVuZ3RoO1xuXG4gIHdoaWxlIChvYmplY3QgIT0gbnVsbCAmJiBpbmRleCA8IGxlbmd0aCkge1xuICAgIG9iamVjdCA9IG9iamVjdFt0b0tleShwYXRoW2luZGV4KytdKV07XG4gIH1cbiAgcmV0dXJuIChpbmRleCAmJiBpbmRleCA9PSBsZW5ndGgpID8gb2JqZWN0IDogdW5kZWZpbmVkO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VHZXQ7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///111\n")},function(module,exports,__webpack_require__){eval("var isArray = __webpack_require__(31),\n isKey = __webpack_require__(167),\n stringToPath = __webpack_require__(391),\n toString = __webpack_require__(214);\n\n/**\n * Casts `value` to a path array if it's not one.\n *\n * @private\n * @param {*} value The value to inspect.\n * @param {Object} [object] The object to query keys on.\n * @returns {Array} Returns the cast property path array.\n */\nfunction castPath(value, object) {\n if (isArray(value)) {\n return value;\n }\n return isKey(value, object) ? [value] : stringToPath(toString(value));\n}\n\nmodule.exports = castPath;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jYXN0UGF0aC5qcz9lMmU0Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsbUJBQU8sQ0FBQyxFQUFXO0FBQ2pDLFlBQVksbUJBQU8sQ0FBQyxHQUFVO0FBQzlCLG1CQUFtQixtQkFBTyxDQUFDLEdBQWlCO0FBQzVDLGVBQWUsbUJBQU8sQ0FBQyxHQUFZOztBQUVuQztBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsRUFBRTtBQUNiLFdBQVcsT0FBTztBQUNsQixhQUFhLE1BQU07QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJmaWxlIjoiMTEyLmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIGlzQXJyYXkgPSByZXF1aXJlKCcuL2lzQXJyYXknKSxcbiAgICBpc0tleSA9IHJlcXVpcmUoJy4vX2lzS2V5JyksXG4gICAgc3RyaW5nVG9QYXRoID0gcmVxdWlyZSgnLi9fc3RyaW5nVG9QYXRoJyksXG4gICAgdG9TdHJpbmcgPSByZXF1aXJlKCcuL3RvU3RyaW5nJyk7XG5cbi8qKlxuICogQ2FzdHMgYHZhbHVlYCB0byBhIHBhdGggYXJyYXkgaWYgaXQncyBub3Qgb25lLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBvYmplY3QgdG8gcXVlcnkga2V5cyBvbi5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgY2FzdCBwcm9wZXJ0eSBwYXRoIGFycmF5LlxuICovXG5mdW5jdGlvbiBjYXN0UGF0aCh2YWx1ZSwgb2JqZWN0KSB7XG4gIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICByZXR1cm4gaXNLZXkodmFsdWUsIG9iamVjdCkgPyBbdmFsdWVdIDogc3RyaW5nVG9QYXRoKHRvU3RyaW5nKHZhbHVlKSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY2FzdFBhdGg7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///112\n")},function(module,exports){eval("/**\n * A specialized version of `_.map` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction arrayMap(array, iteratee) {\n var index = -1,\n length = array == null ? 0 : array.length,\n result = Array(length);\n\n while (++index < length) {\n result[index] = iteratee(array[index], index, array);\n }\n return result;\n}\n\nmodule.exports = arrayMap;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19hcnJheU1hcC5qcz83OTQ4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE1BQU07QUFDakIsV0FBVyxTQUFTO0FBQ3BCLGFBQWEsTUFBTTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJmaWxlIjoiMTEzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8ubWFwYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWVcbiAqIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBtYXBwZWQgYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIGFycmF5TWFwKGFycmF5LCBpdGVyYXRlZSkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoLFxuICAgICAgcmVzdWx0ID0gQXJyYXkobGVuZ3RoKTtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHJlc3VsdFtpbmRleF0gPSBpdGVyYXRlZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhcnJheU1hcDtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///113\n")},function(module,exports,__webpack_require__){eval("var identity = __webpack_require__(67),\n overRest = __webpack_require__(223),\n setToString = __webpack_require__(224);\n\n/**\n * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n */\nfunction baseRest(func, start) {\n return setToString(overRest(func, start, identity), func + '');\n}\n\nmodule.exports = baseRest;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlUmVzdC5qcz8xMDBlIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGVBQWUsbUJBQU8sQ0FBQyxFQUFZO0FBQ25DLGVBQWUsbUJBQU8sQ0FBQyxHQUFhO0FBQ3BDLGtCQUFrQixtQkFBTyxDQUFDLEdBQWdCOztBQUUxQztBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsU0FBUztBQUNwQixXQUFXLE9BQU87QUFDbEIsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwiZmlsZSI6IjExNC5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBpZGVudGl0eSA9IHJlcXVpcmUoJy4vaWRlbnRpdHknKSxcbiAgICBvdmVyUmVzdCA9IHJlcXVpcmUoJy4vX292ZXJSZXN0JyksXG4gICAgc2V0VG9TdHJpbmcgPSByZXF1aXJlKCcuL19zZXRUb1N0cmluZycpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnJlc3RgIHdoaWNoIGRvZXNuJ3QgdmFsaWRhdGUgb3IgY29lcmNlIGFyZ3VtZW50cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXBwbHkgYSByZXN0IHBhcmFtZXRlciB0by5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9ZnVuYy5sZW5ndGgtMV0gVGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSByZXN0IHBhcmFtZXRlci5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBiYXNlUmVzdChmdW5jLCBzdGFydCkge1xuICByZXR1cm4gc2V0VG9TdHJpbmcob3ZlclJlc3QoZnVuYywgc3RhcnQsIGlkZW50aXR5KSwgZnVuYyArICcnKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlUmVzdDtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///114\n")},function(module,exports,__webpack_require__){eval("var eq = __webpack_require__(72),\n isArrayLike = __webpack_require__(54),\n isIndex = __webpack_require__(106),\n isObject = __webpack_require__(43);\n\n/**\n * Checks if the given arguments are from an iteratee call.\n *\n * @private\n * @param {*} value The potential iteratee value argument.\n * @param {*} index The potential iteratee index or key argument.\n * @param {*} object The potential iteratee object argument.\n * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\n * else `false`.\n */\nfunction isIterateeCall(value, index, object) {\n if (!isObject(object)) {\n return false;\n }\n var type = typeof index;\n if (type == 'number'\n ? (isArrayLike(object) && isIndex(index, object.length))\n : (type == 'string' && index in object)\n ) {\n return eq(object[index], value);\n }\n return false;\n}\n\nmodule.exports = isIterateeCall;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19pc0l0ZXJhdGVlQ2FsbC5qcz85YWZmIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFNBQVMsbUJBQU8sQ0FBQyxFQUFNO0FBQ3ZCLGtCQUFrQixtQkFBTyxDQUFDLEVBQWU7QUFDekMsY0FBYyxtQkFBTyxDQUFDLEdBQVk7QUFDbEMsZUFBZSxtQkFBTyxDQUFDLEVBQVk7O0FBRW5DO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxFQUFFO0FBQ2IsV0FBVyxFQUFFO0FBQ2IsV0FBVyxFQUFFO0FBQ2IsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsImZpbGUiOiIxMTUuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgZXEgPSByZXF1aXJlKCcuL2VxJyksXG4gICAgaXNBcnJheUxpa2UgPSByZXF1aXJlKCcuL2lzQXJyYXlMaWtlJyksXG4gICAgaXNJbmRleCA9IHJlcXVpcmUoJy4vX2lzSW5kZXgnKSxcbiAgICBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXNPYmplY3QnKTtcblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIGdpdmVuIGFyZ3VtZW50cyBhcmUgZnJvbSBhbiBpdGVyYXRlZSBjYWxsLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSBwb3RlbnRpYWwgaXRlcmF0ZWUgdmFsdWUgYXJndW1lbnQuXG4gKiBAcGFyYW0geyp9IGluZGV4IFRoZSBwb3RlbnRpYWwgaXRlcmF0ZWUgaW5kZXggb3Iga2V5IGFyZ3VtZW50LlxuICogQHBhcmFtIHsqfSBvYmplY3QgVGhlIHBvdGVudGlhbCBpdGVyYXRlZSBvYmplY3QgYXJndW1lbnQuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGFyZ3VtZW50cyBhcmUgZnJvbSBhbiBpdGVyYXRlZSBjYWxsLFxuICogIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaXNJdGVyYXRlZUNhbGwodmFsdWUsIGluZGV4LCBvYmplY3QpIHtcbiAgaWYgKCFpc09iamVjdChvYmplY3QpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciB0eXBlID0gdHlwZW9mIGluZGV4O1xuICBpZiAodHlwZSA9PSAnbnVtYmVyJ1xuICAgICAgICA/IChpc0FycmF5TGlrZShvYmplY3QpICYmIGlzSW5kZXgoaW5kZXgsIG9iamVjdC5sZW5ndGgpKVxuICAgICAgICA6ICh0eXBlID09ICdzdHJpbmcnICYmIGluZGV4IGluIG9iamVjdClcbiAgICAgICkge1xuICAgIHJldHVybiBlcShvYmplY3RbaW5kZXhdLCB2YWx1ZSk7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzSXRlcmF0ZWVDYWxsO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///115\n")},function(module,exports,__webpack_require__){"use strict";eval('\n\nvar _ = __webpack_require__(28);\n\nmodule.exports = {\n longestPath: longestPath,\n longestPathWithLayer: longestPathWithLayer,\n slack: slack,\n};\n\n/*\n * Initializes ranks for the input graph using the longest path algorithm. This\n * algorithm scales well and is fast in practice, it yields rather poor\n * solutions. Nodes are pushed to the lowest layer possible, leaving the bottom\n * ranks wide and leaving edges longer than necessary. However, due to its\n * speed, this algorithm is good for getting an initial ranking that can be fed\n * into other algorithms.\n *\n * This algorithm does not normalize layers because it will be used by other\n * algorithms in most cases. If using this algorithm directly, be sure to\n * run normalize at the end.\n *\n * Pre-conditions:\n *\n * 1. Input graph is a DAG.\n * 2. Input graph node labels can be assigned properties.\n *\n * Post-conditions:\n *\n * 1. Each node will be assign an (unnormalized) "rank" property.\n */\nfunction longestPath(g) {\n var visited = {};\n\n function dfs(v) {\n var label = g.node(v);\n if (_.has(visited, v)) {\n return label.rank;\n }\n visited[v] = true;\n\n var rank = _.min(_.map(g.outEdges(v), function(e) {\n return dfs(e.w) - g.edge(e).minlen;\n }));\n\n if (rank === Number.POSITIVE_INFINITY || // return value of _.map([]) for Lodash 3\n rank === undefined || // return value of _.map([]) for Lodash 4\n rank === null) { // return value of _.map([null])\n rank = 0;\n }\n\n return (label.rank = rank);\n }\n\n _.forEach(g.sources(), dfs);\n}\n\nfunction longestPathWithLayer(g) {\n // 用longest path,找出最深的点\n var visited = {};\n var minRank = 0;\n\n function dfs(v) {\n var label = g.node(v);\n if (_.has(visited, v)) {\n return label.rank;\n }\n visited[v] = true;\n\n var rank = _.min(_.map(g.outEdges(v), function(e) {\n return dfs(e.w) - g.edge(e).minlen;\n }));\n\n if (rank === Number.POSITIVE_INFINITY || // return value of _.map([]) for Lodash 3\n rank === undefined || // return value of _.map([]) for Lodash 4\n rank === null) { // return value of _.map([null])\n rank = 0;\n }\n\n label.rank = rank;\n minRank = Math.min(label.rank, minRank);\n return label.rank;\n }\n\n _.forEach(g.sources(), dfs);\n\n minRank += 1; // NOTE: 最小的层级是dummy root,+1\n\n // forward一遍,赋值层级\n function dfsForward(v, nextRank) {\n var label = g.node(v);\n\n var currRank = !isNaN(label.layer) ? label.layer : nextRank;\n\n // 没有指定,取最大值\n if (label.rank === undefined || label.rank < currRank) {\n label.rank = currRank;\n }\n\n // DFS遍历子节点\n _.map(g.outEdges(v), function (e) {\n dfsForward(e.w, currRank + g.edge(e).minlen);\n });\n }\n\n // 指定层级的,更新下游\n g.nodes().forEach(function (n) {\n var label = g.node(n);\n if (!isNaN(label.layer)) {\n dfsForward(n, label.layer); // 默认的dummy root所在层的rank是-1\n } else {\n label.rank -= minRank;\n }\n });\n\n // g.sources().forEach(function (root) {\n // dfsForward(root, -1); // 默认的dummy root所在层的rank是-1\n // });\n \n // 不这样做了,赋值的层级只影响下游\n /*\n // backward一遍,把父节点收紧\n function dfsBackward(v) {\n var label = g.node(v);\n\n // 有指定layer,不改动\n if (!isNaN(label.layer)) {\n label.rank = label.layer;\n return label.rank;\n }\n\n // 其它\n var rank = _.min(_.map(g.outEdges(v), function(e) {\n return dfsBackward(e.w) - g.edge(e).minlen;\n }));\n\n if (!isNaN(rank)) {\n label.rank = rank;\n }\n\n return label.rank;\n }\n\n _.forEach(g.sources(), dfsBackward);\n */\n}\n\n/*\n * Returns the amount of slack for the given edge. The slack is defined as the\n * difference between the length of the edge and its minimum length.\n */\nfunction slack(g, e) {\n return g.node(e.w).rank - g.node(e.v).rank - g.edge(e).minlen;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZGFncmVqcy9saWIvcmFuay91dGlsLmpzP2ZmYTIiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWIsUUFBUSxtQkFBTyxDQUFDLEVBQVc7O0FBRTNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBLHdCQUF3QjtBQUN4QjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBLHdCQUF3QjtBQUN4QjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBLGVBQWU7O0FBRWY7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQztBQUNqQyxLQUFLO0FBQ0w7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQSw0QkFBNEI7QUFDNUIsTUFBTTs7QUFFTjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiMTE2LmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfID0gcmVxdWlyZShcIi4uL2xvZGFzaFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGxvbmdlc3RQYXRoOiBsb25nZXN0UGF0aCxcbiAgbG9uZ2VzdFBhdGhXaXRoTGF5ZXI6IGxvbmdlc3RQYXRoV2l0aExheWVyLFxuICBzbGFjazogc2xhY2ssXG59O1xuXG4vKlxuICogSW5pdGlhbGl6ZXMgcmFua3MgZm9yIHRoZSBpbnB1dCBncmFwaCB1c2luZyB0aGUgbG9uZ2VzdCBwYXRoIGFsZ29yaXRobS4gVGhpc1xuICogYWxnb3JpdGhtIHNjYWxlcyB3ZWxsIGFuZCBpcyBmYXN0IGluIHByYWN0aWNlLCBpdCB5aWVsZHMgcmF0aGVyIHBvb3JcbiAqIHNvbHV0aW9ucy4gTm9kZXMgYXJlIHB1c2hlZCB0byB0aGUgbG93ZXN0IGxheWVyIHBvc3NpYmxlLCBsZWF2aW5nIHRoZSBib3R0b21cbiAqIHJhbmtzIHdpZGUgYW5kIGxlYXZpbmcgZWRnZXMgbG9uZ2VyIHRoYW4gbmVjZXNzYXJ5LiBIb3dldmVyLCBkdWUgdG8gaXRzXG4gKiBzcGVlZCwgdGhpcyBhbGdvcml0aG0gaXMgZ29vZCBmb3IgZ2V0dGluZyBhbiBpbml0aWFsIHJhbmtpbmcgdGhhdCBjYW4gYmUgZmVkXG4gKiBpbnRvIG90aGVyIGFsZ29yaXRobXMuXG4gKlxuICogVGhpcyBhbGdvcml0aG0gZG9lcyBub3Qgbm9ybWFsaXplIGxheWVycyBiZWNhdXNlIGl0IHdpbGwgYmUgdXNlZCBieSBvdGhlclxuICogYWxnb3JpdGhtcyBpbiBtb3N0IGNhc2VzLiBJZiB1c2luZyB0aGlzIGFsZ29yaXRobSBkaXJlY3RseSwgYmUgc3VyZSB0b1xuICogcnVuIG5vcm1hbGl6ZSBhdCB0aGUgZW5kLlxuICpcbiAqIFByZS1jb25kaXRpb25zOlxuICpcbiAqICAgIDEuIElucHV0IGdyYXBoIGlzIGEgREFHLlxuICogICAgMi4gSW5wdXQgZ3JhcGggbm9kZSBsYWJlbHMgY2FuIGJlIGFzc2lnbmVkIHByb3BlcnRpZXMuXG4gKlxuICogUG9zdC1jb25kaXRpb25zOlxuICpcbiAqICAgIDEuIEVhY2ggbm9kZSB3aWxsIGJlIGFzc2lnbiBhbiAodW5ub3JtYWxpemVkKSBcInJhbmtcIiBwcm9wZXJ0eS5cbiAqL1xuZnVuY3Rpb24gbG9uZ2VzdFBhdGgoZykge1xuICB2YXIgdmlzaXRlZCA9IHt9O1xuXG4gIGZ1bmN0aW9uIGRmcyh2KSB7XG4gICAgdmFyIGxhYmVsID0gZy5ub2RlKHYpO1xuICAgIGlmIChfLmhhcyh2aXNpdGVkLCB2KSkge1xuICAgICAgcmV0dXJuIGxhYmVsLnJhbms7XG4gICAgfVxuICAgIHZpc2l0ZWRbdl0gPSB0cnVlO1xuXG4gICAgdmFyIHJhbmsgPSBfLm1pbihfLm1hcChnLm91dEVkZ2VzKHYpLCBmdW5jdGlvbihlKSB7XG4gICAgICByZXR1cm4gZGZzKGUudykgLSBnLmVkZ2UoZSkubWlubGVuO1xuICAgIH0pKTtcblxuICAgIGlmIChyYW5rID09PSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkgfHwgLy8gcmV0dXJuIHZhbHVlIG9mIF8ubWFwKFtdKSBmb3IgTG9kYXNoIDNcbiAgICAgICAgcmFuayA9PT0gdW5kZWZpbmVkIHx8IC8vIHJldHVybiB2YWx1ZSBvZiBfLm1hcChbXSkgZm9yIExvZGFzaCA0XG4gICAgICAgIHJhbmsgPT09IG51bGwpIHsgLy8gcmV0dXJuIHZhbHVlIG9mIF8ubWFwKFtudWxsXSlcbiAgICAgIHJhbmsgPSAwO1xuICAgIH1cblxuICAgIHJldHVybiAobGFiZWwucmFuayA9IHJhbmspO1xuICB9XG5cbiAgXy5mb3JFYWNoKGcuc291cmNlcygpLCBkZnMpO1xufVxuXG5mdW5jdGlvbiBsb25nZXN0UGF0aFdpdGhMYXllcihnKSB7XG4gIC8vIOeUqGxvbmdlc3QgcGF0aO+8jOaJvuWHuuacgOa3seeahOeCuVxuICB2YXIgdmlzaXRlZCA9IHt9O1xuICB2YXIgbWluUmFuayA9IDA7XG5cbiAgZnVuY3Rpb24gZGZzKHYpIHtcbiAgICB2YXIgbGFiZWwgPSBnLm5vZGUodik7XG4gICAgaWYgKF8uaGFzKHZpc2l0ZWQsIHYpKSB7XG4gICAgICByZXR1cm4gbGFiZWwucmFuaztcbiAgICB9XG4gICAgdmlzaXRlZFt2XSA9IHRydWU7XG5cbiAgICB2YXIgcmFuayA9IF8ubWluKF8ubWFwKGcub3V0RWRnZXModiksIGZ1bmN0aW9uKGUpIHtcbiAgICAgIHJldHVybiBkZnMoZS53KSAtIGcuZWRnZShlKS5taW5sZW47XG4gICAgfSkpO1xuXG4gICAgaWYgKHJhbmsgPT09IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSB8fCAvLyByZXR1cm4gdmFsdWUgb2YgXy5tYXAoW10pIGZvciBMb2Rhc2ggM1xuICAgICAgICByYW5rID09PSB1bmRlZmluZWQgfHwgLy8gcmV0dXJuIHZhbHVlIG9mIF8ubWFwKFtdKSBmb3IgTG9kYXNoIDRcbiAgICAgICAgcmFuayA9PT0gbnVsbCkgeyAvLyByZXR1cm4gdmFsdWUgb2YgXy5tYXAoW251bGxdKVxuICAgICAgcmFuayA9IDA7XG4gICAgfVxuXG4gICAgbGFiZWwucmFuayA9IHJhbms7XG4gICAgbWluUmFuayA9IE1hdGgubWluKGxhYmVsLnJhbmssIG1pblJhbmspO1xuICAgIHJldHVybiBsYWJlbC5yYW5rO1xuICB9XG5cbiAgXy5mb3JFYWNoKGcuc291cmNlcygpLCBkZnMpO1xuXG4gIG1pblJhbmsgKz0gMTsgLy8gTk9URTog5pyA5bCP55qE5bGC57qn5pivZHVtbXkgcm9vdO+8jCsxXG5cbiAgLy8gZm9yd2FyZOS4gOmBje+8jOi1i+WAvOWxgue6p1xuICBmdW5jdGlvbiBkZnNGb3J3YXJkKHYsIG5leHRSYW5rKSB7XG4gICAgdmFyIGxhYmVsID0gZy5ub2RlKHYpO1xuXG4gICAgdmFyIGN1cnJSYW5rID0gIWlzTmFOKGxhYmVsLmxheWVyKSA/IGxhYmVsLmxheWVyIDogbmV4dFJhbms7XG5cbiAgICAvLyDmsqHmnInmjIflrprvvIzlj5bmnIDlpKflgLxcbiAgICBpZiAobGFiZWwucmFuayA9PT0gdW5kZWZpbmVkIHx8IGxhYmVsLnJhbmsgPCBjdXJyUmFuaykge1xuICAgICAgbGFiZWwucmFuayA9IGN1cnJSYW5rO1xuICAgIH1cblxuICAgIC8vIERGU+mBjeWOhuWtkOiKgueCuVxuICAgIF8ubWFwKGcub3V0RWRnZXModiksIGZ1bmN0aW9uIChlKSB7XG4gICAgICBkZnNGb3J3YXJkKGUudywgY3VyclJhbmsgKyBnLmVkZ2UoZSkubWlubGVuKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIOaMh+WumuWxgue6p+eahO+8jOabtOaWsOS4i+a4uFxuICBnLm5vZGVzKCkuZm9yRWFjaChmdW5jdGlvbiAobikge1xuICAgIHZhciBsYWJlbCA9IGcubm9kZShuKTtcbiAgICBpZiAoIWlzTmFOKGxhYmVsLmxheWVyKSkge1xuICAgICAgZGZzRm9yd2FyZChuLCBsYWJlbC5sYXllcik7IC8vIOm7mOiupOeahGR1bW15IHJvb3TmiYDlnKjlsYLnmoRyYW5r5pivLTFcbiAgICB9IGVsc2Uge1xuICAgICAgbGFiZWwucmFuayAtPSBtaW5SYW5rO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gZy5zb3VyY2VzKCkuZm9yRWFjaChmdW5jdGlvbiAocm9vdCkge1xuICAvLyAgIGRmc0ZvcndhcmQocm9vdCwgLTEpOyAvLyDpu5jorqTnmoRkdW1teSByb2905omA5Zyo5bGC55qEcmFua+aYry0xXG4gIC8vIH0pO1xuICBcbiAgLy8g5LiN6L+Z5qC35YGa5LqG77yM6LWL5YC855qE5bGC57qn5Y+q5b2x5ZON5LiL5ri4XG4gIC8qXG4gIC8vIGJhY2t3YXJk5LiA6YGN77yM5oqK54i26IqC54K55pS257SnXG4gIGZ1bmN0aW9uIGRmc0JhY2t3YXJkKHYpIHtcbiAgICB2YXIgbGFiZWwgPSBnLm5vZGUodik7XG5cbiAgICAvLyDmnInmjIflrppsYXllcu+8jOS4jeaUueWKqFxuICAgIGlmICghaXNOYU4obGFiZWwubGF5ZXIpKSB7XG4gICAgICBsYWJlbC5yYW5rID0gbGFiZWwubGF5ZXI7XG4gICAgICByZXR1cm4gbGFiZWwucmFuaztcbiAgICB9XG5cbiAgICAvLyDlhbblroNcbiAgICB2YXIgcmFuayA9IF8ubWluKF8ubWFwKGcub3V0RWRnZXModiksIGZ1bmN0aW9uKGUpIHtcbiAgICAgIHJldHVybiBkZnNCYWNrd2FyZChlLncpIC0gZy5lZGdlKGUpLm1pbmxlbjtcbiAgICB9KSk7XG5cbiAgICBpZiAoIWlzTmFOKHJhbmspKSB7XG4gICAgICBsYWJlbC5yYW5rID0gcmFuaztcbiAgICB9XG5cbiAgICByZXR1cm4gbGFiZWwucmFuaztcbiAgfVxuXG4gIF8uZm9yRWFjaChnLnNvdXJjZXMoKSwgZGZzQmFja3dhcmQpO1xuICAqL1xufVxuXG4vKlxuICogUmV0dXJucyB0aGUgYW1vdW50IG9mIHNsYWNrIGZvciB0aGUgZ2l2ZW4gZWRnZS4gVGhlIHNsYWNrIGlzIGRlZmluZWQgYXMgdGhlXG4gKiBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGxlbmd0aCBvZiB0aGUgZWRnZSBhbmQgaXRzIG1pbmltdW0gbGVuZ3RoLlxuICovXG5mdW5jdGlvbiBzbGFjayhnLCBlKSB7XG4gIHJldHVybiBnLm5vZGUoZS53KS5yYW5rIC0gZy5ub2RlKGUudikucmFuayAtIGcuZWRnZShlKS5taW5sZW47XG59XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///116\n')},function(module,__webpack_exports__,__webpack_require__){"use strict";eval('/* harmony import */ var _gl__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(35);\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "gl", function() { return _gl__WEBPACK_IMPORTED_MODULE_0__["a"]; });\n\n/* harmony import */ var _IAttribute__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(250);\n/* harmony import */ var _IAttribute__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_IAttribute__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _IBuffer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(251);\n/* harmony import */ var _IBuffer__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_IBuffer__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _IComputeModel__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(252);\n/* harmony import */ var _IComputeModel__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_IComputeModel__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _IElements__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(253);\n/* harmony import */ var _IElements__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_IElements__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _IFramebuffer__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(254);\n/* harmony import */ var _IFramebuffer__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_IFramebuffer__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _IModel__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(255);\n/* harmony import */ var _IModel__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_IModel__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var _IMultiPassRenderer__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(256);\n/* harmony import */ var _IRenderbuffer__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(257);\n/* harmony import */ var _IRenderbuffer__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(_IRenderbuffer__WEBPACK_IMPORTED_MODULE_8__);\n/* harmony import */ var _IRendererService__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(258);\n/* harmony import */ var _IRendererService__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(_IRendererService__WEBPACK_IMPORTED_MODULE_9__);\n/* harmony import */ var _ITexture2D__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(259);\n/* harmony import */ var _ITexture2D__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(_ITexture2D__WEBPACK_IMPORTED_MODULE_10__);\n/* harmony import */ var _IUniform__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(260);\n/* harmony import */ var _IUniform__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(_IUniform__WEBPACK_IMPORTED_MODULE_11__);\n\n\n\n\n\n\n\n\n\n\n\n\n//# sourceMappingURL=index.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy13ZWJncHUtY29yZS9lcy9jb21wb25lbnRzL3JlbmRlcmVyL2luZGV4LmpzP2UxNzUiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQXFCO0FBQ1E7QUFDSDtBQUNNO0FBQ0o7QUFDRztBQUNOO0FBQ1k7QUFDTDtBQUNHO0FBQ047QUFDRjtBQUMzQiIsImZpbGUiOiIxMTcuanMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2dsJztcbmV4cG9ydCAqIGZyb20gJy4vSUF0dHJpYnV0ZSc7XG5leHBvcnQgKiBmcm9tICcuL0lCdWZmZXInO1xuZXhwb3J0ICogZnJvbSAnLi9JQ29tcHV0ZU1vZGVsJztcbmV4cG9ydCAqIGZyb20gJy4vSUVsZW1lbnRzJztcbmV4cG9ydCAqIGZyb20gJy4vSUZyYW1lYnVmZmVyJztcbmV4cG9ydCAqIGZyb20gJy4vSU1vZGVsJztcbmV4cG9ydCAqIGZyb20gJy4vSU11bHRpUGFzc1JlbmRlcmVyJztcbmV4cG9ydCAqIGZyb20gJy4vSVJlbmRlcmJ1ZmZlcic7XG5leHBvcnQgKiBmcm9tICcuL0lSZW5kZXJlclNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9JVGV4dHVyZTJEJztcbmV4cG9ydCAqIGZyb20gJy4vSVVuaWZvcm0nO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///117\n')},function(module,__webpack_exports__,__webpack_require__){"use strict";eval('var GraphEvent = /** @class */ (function () {\n function GraphEvent(type, event) {\n /**\n * 是否允许冒泡\n * @type {boolean}\n */\n this.bubbles = true;\n /**\n * 触发对象\n * @type {object}\n */\n this.target = null;\n /**\n * 监听对象\n * @type {object}\n */\n this.currentTarget = null;\n /**\n * 委托对象\n * @type {object}\n */\n this.delegateTarget = null;\n /**\n * 委托事件监听对象的代理对象,即 ev.delegateObject = ev.currentTarget.get(\'delegateObject\')\n * @type {object}\n */\n this.delegateObject = null;\n /**\n * 是否阻止了原生事件\n * @type {boolean}\n */\n this.defaultPrevented = false;\n /**\n * 是否阻止传播(向上冒泡)\n * @type {boolean}\n */\n this.propagationStopped = false;\n /**\n * 触发事件的图形\n * @type {IShape}\n */\n this.shape = null;\n /**\n * 开始触发事件的图形\n * @type {IShape}\n */\n this.fromShape = null;\n /**\n * 事件结束时的触发图形\n * @type {IShape}\n */\n this.toShape = null;\n // 触发事件的路径\n this.propagationPath = [];\n this.type = type;\n this.name = type;\n this.originalEvent = event;\n this.timeStamp = event.timeStamp;\n }\n /**\n * 阻止浏览器默认的行为\n */\n GraphEvent.prototype.preventDefault = function () {\n this.defaultPrevented = true;\n if (this.originalEvent.preventDefault) {\n this.originalEvent.preventDefault();\n }\n };\n /**\n * 阻止冒泡\n */\n GraphEvent.prototype.stopPropagation = function () {\n this.propagationStopped = true;\n };\n GraphEvent.prototype.toString = function () {\n var type = this.type;\n return "[Event (type=" + type + ")]";\n };\n GraphEvent.prototype.save = function () { };\n GraphEvent.prototype.restore = function () { };\n return GraphEvent;\n}());\n/* harmony default export */ __webpack_exports__["a"] = (GraphEvent);\n//# sourceMappingURL=graph-event.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy1iYXNlL2VzbS9ldmVudC9ncmFwaC1ldmVudC5qcz9lNWUyIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDO0FBQzdDLGdEQUFnRDtBQUNoRDtBQUNBLENBQUM7QUFDYyxtRUFBVSxFQUFDO0FBQzFCIiwiZmlsZSI6IjExOC5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBHcmFwaEV2ZW50ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEdyYXBoRXZlbnQodHlwZSwgZXZlbnQpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIOaYr+WQpuWFgeiuuOWGkuazoVxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuYnViYmxlcyA9IHRydWU7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiDop6blj5Hlr7nosaFcbiAgICAgICAgICogQHR5cGUge29iamVjdH1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudGFyZ2V0ID0gbnVsbDtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIOebkeWQrOWvueixoVxuICAgICAgICAgKiBAdHlwZSB7b2JqZWN0fVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jdXJyZW50VGFyZ2V0ID0gbnVsbDtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIOWnlOaJmOWvueixoVxuICAgICAgICAgKiBAdHlwZSB7b2JqZWN0fVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5kZWxlZ2F0ZVRhcmdldCA9IG51bGw7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiDlp5TmiZjkuovku7bnm5HlkKzlr7nosaHnmoTku6PnkIblr7nosaHvvIzljbMgZXYuZGVsZWdhdGVPYmplY3QgPSBldi5jdXJyZW50VGFyZ2V0LmdldCgnZGVsZWdhdGVPYmplY3QnKVxuICAgICAgICAgKiBAdHlwZSB7b2JqZWN0fVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5kZWxlZ2F0ZU9iamVjdCA9IG51bGw7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiDmmK/lkKbpmLvmraLkuobljp/nlJ/kuovku7ZcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmRlZmF1bHRQcmV2ZW50ZWQgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIOaYr+WQpumYu+atouS8oOaSre+8iOWQkeS4iuWGkuazoe+8iVxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMucHJvcGFnYXRpb25TdG9wcGVkID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiDop6blj5Hkuovku7bnmoTlm77lvaJcbiAgICAgICAgICogQHR5cGUge0lTaGFwZX1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuc2hhcGUgPSBudWxsO1xuICAgICAgICAvKipcbiAgICAgICAgICog5byA5aeL6Kem5Y+R5LqL5Lu255qE5Zu+5b2iXG4gICAgICAgICAqIEB0eXBlIHtJU2hhcGV9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmZyb21TaGFwZSA9IG51bGw7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiDkuovku7bnu5PmnZ/ml7bnmoTop6blj5Hlm77lvaJcbiAgICAgICAgICogQHR5cGUge0lTaGFwZX1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudG9TaGFwZSA9IG51bGw7XG4gICAgICAgIC8vIOinpuWPkeS6i+S7tueahOi3r+W+hFxuICAgICAgICB0aGlzLnByb3BhZ2F0aW9uUGF0aCA9IFtdO1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLm5hbWUgPSB0eXBlO1xuICAgICAgICB0aGlzLm9yaWdpbmFsRXZlbnQgPSBldmVudDtcbiAgICAgICAgdGhpcy50aW1lU3RhbXAgPSBldmVudC50aW1lU3RhbXA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIOmYu+atoua1j+iniOWZqOm7mOiupOeahOihjOS4ulxuICAgICAqL1xuICAgIEdyYXBoRXZlbnQucHJvdG90eXBlLnByZXZlbnREZWZhdWx0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmRlZmF1bHRQcmV2ZW50ZWQgPSB0cnVlO1xuICAgICAgICBpZiAodGhpcy5vcmlnaW5hbEV2ZW50LnByZXZlbnREZWZhdWx0KSB7XG4gICAgICAgICAgICB0aGlzLm9yaWdpbmFsRXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICog6Zi75q2i5YaS5rOhXG4gICAgICovXG4gICAgR3JhcGhFdmVudC5wcm90b3R5cGUuc3RvcFByb3BhZ2F0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnByb3BhZ2F0aW9uU3RvcHBlZCA9IHRydWU7XG4gICAgfTtcbiAgICBHcmFwaEV2ZW50LnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHR5cGUgPSB0aGlzLnR5cGU7XG4gICAgICAgIHJldHVybiBcIltFdmVudCAodHlwZT1cIiArIHR5cGUgKyBcIildXCI7XG4gICAgfTtcbiAgICBHcmFwaEV2ZW50LnByb3RvdHlwZS5zYXZlID0gZnVuY3Rpb24gKCkgeyB9O1xuICAgIEdyYXBoRXZlbnQucHJvdG90eXBlLnJlc3RvcmUgPSBmdW5jdGlvbiAoKSB7IH07XG4gICAgcmV0dXJuIEdyYXBoRXZlbnQ7XG59KCkpO1xuZXhwb3J0IGRlZmF1bHQgR3JhcGhFdmVudDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdyYXBoLWV2ZW50LmpzLm1hcCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///118\n')},function(module,__webpack_exports__,__webpack_require__){"use strict";eval('/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1);\n/* harmony import */ var _antv_event_emitter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(138);\n/* harmony import */ var _util_util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(19);\n\n\n\nvar Base = /** @class */ (function (_super) {\n Object(tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"])(Base, _super);\n function Base(cfg) {\n var _this = _super.call(this) || this;\n /**\n * 是否被销毁\n * @type {boolean}\n */\n _this.destroyed = false;\n var defaultCfg = _this.getDefaultCfg();\n _this.cfg = Object(_util_util__WEBPACK_IMPORTED_MODULE_2__[/* mix */ "i"])(defaultCfg, cfg);\n return _this;\n }\n /**\n * @protected\n * 默认的配置项\n * @returns {object} 默认的配置项\n */\n Base.prototype.getDefaultCfg = function () {\n return {};\n };\n // 实现接口的方法\n Base.prototype.get = function (name) {\n return this.cfg[name];\n };\n // 实现接口的方法\n Base.prototype.set = function (name, value) {\n this.cfg[name] = value;\n };\n // 实现接口的方法\n Base.prototype.destroy = function () {\n this.cfg = {\n destroyed: true,\n };\n this.off();\n this.destroyed = true;\n };\n return Base;\n}(_antv_event_emitter__WEBPACK_IMPORTED_MODULE_1__[/* default */ "a"]));\n/* harmony default export */ __webpack_exports__["a"] = (Base);\n//# sourceMappingURL=base.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy1iYXNlL2VzbS9hYnN0cmFjdC9iYXNlLmpzPzJlNjAiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQWtDO0FBQ0c7QUFDRjtBQUNuQztBQUNBLElBQUksdURBQVM7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsOERBQUc7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixPQUFPO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsQ0FBQyxtRUFBRTtBQUNXLDZEQUFJLEVBQUM7QUFDcEIiLCJmaWxlIjoiMTE5LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgRUUgZnJvbSAnQGFudHYvZXZlbnQtZW1pdHRlcic7XG5pbXBvcnQgeyBtaXggfSBmcm9tICcuLi91dGlsL3V0aWwnO1xudmFyIEJhc2UgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEJhc2UsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gQmFzZShjZmcpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpcztcbiAgICAgICAgLyoqXG4gICAgICAgICAqIOaYr+WQpuiiq+mUgOavgVxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgICovXG4gICAgICAgIF90aGlzLmRlc3Ryb3llZCA9IGZhbHNlO1xuICAgICAgICB2YXIgZGVmYXVsdENmZyA9IF90aGlzLmdldERlZmF1bHRDZmcoKTtcbiAgICAgICAgX3RoaXMuY2ZnID0gbWl4KGRlZmF1bHRDZmcsIGNmZyk7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqIOm7mOiupOeahOmFjee9rumhuVxuICAgICAqIEByZXR1cm5zIHtvYmplY3R9IOm7mOiupOeahOmFjee9rumhuVxuICAgICAqL1xuICAgIEJhc2UucHJvdG90eXBlLmdldERlZmF1bHRDZmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9O1xuICAgIC8vIOWunueOsOaOpeWPo+eahOaWueazlVxuICAgIEJhc2UucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNmZ1tuYW1lXTtcbiAgICB9O1xuICAgIC8vIOWunueOsOaOpeWPo+eahOaWueazlVxuICAgIEJhc2UucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuICAgICAgICB0aGlzLmNmZ1tuYW1lXSA9IHZhbHVlO1xuICAgIH07XG4gICAgLy8g5a6e546w5o6l5Y+j55qE5pa55rOVXG4gICAgQmFzZS5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5jZmcgPSB7XG4gICAgICAgICAgICBkZXN0cm95ZWQ6IHRydWUsXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMub2ZmKCk7XG4gICAgICAgIHRoaXMuZGVzdHJveWVkID0gdHJ1ZTtcbiAgICB9O1xuICAgIHJldHVybiBCYXNlO1xufShFRSkpO1xuZXhwb3J0IGRlZmF1bHQgQmFzZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJhc2UuanMubWFwIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///119\n')},function(module,__webpack_exports__,__webpack_require__){"use strict";eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return getOffScreenContext; });\n// 全局设置一个唯一离屏的 ctx,用于计算 isPointInPath\nvar offScreenCtx = null;\nfunction getOffScreenContext() {\n if (!offScreenCtx) {\n var canvas = document.createElement('canvas');\n canvas.width = 1;\n canvas.height = 1;\n offScreenCtx = canvas.getContext('2d');\n }\n return offScreenCtx;\n}\n//# sourceMappingURL=offscreen.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy1iYXNlL2VzbS91dGlsL29mZnNjcmVlbi5qcz85NmRlIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6IjEyMC5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vIOWFqOWxgOiuvue9ruS4gOS4quWUr+S4gOemu+Wxj+eahCBjdHjvvIznlKjkuo7orqHnrpcgaXNQb2ludEluUGF0aFxudmFyIG9mZlNjcmVlbkN0eCA9IG51bGw7XG5leHBvcnQgZnVuY3Rpb24gZ2V0T2ZmU2NyZWVuQ29udGV4dCgpIHtcbiAgICBpZiAoIW9mZlNjcmVlbkN0eCkge1xuICAgICAgICB2YXIgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICAgIGNhbnZhcy53aWR0aCA9IDE7XG4gICAgICAgIGNhbnZhcy5oZWlnaHQgPSAxO1xuICAgICAgICBvZmZTY3JlZW5DdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICB9XG4gICAgcmV0dXJuIG9mZlNjcmVlbkN0eDtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW9mZnNjcmVlbi5qcy5tYXAiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///120\n")},function(module,__webpack_exports__,__webpack_require__){"use strict";eval('/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return EMPTY; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return createEntity; });\nvar EMPTY = -1;\nvar entitySequence = 1;\n/**\n * 类似关系型数据库的主键\n * TODO: 自动生成,考虑序列化\n */\n\nfunction createEntity() {\n return entitySequence++;\n}\n//# sourceMappingURL=Entity.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy13ZWJncHUtY29yZS9lcy9FbnRpdHkuanM/ZjcyZCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVPO0FBQ1A7QUFDQTtBQUNBIiwiZmlsZSI6IjEyMS5qcyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB2YXIgRU1QVFkgPSAtMTtcbnZhciBlbnRpdHlTZXF1ZW5jZSA9IDE7XG4vKipcbiAqIOexu+S8vOWFs+ezu+Wei+aVsOaNruW6k+eahOS4u+mUrlxuICogVE9ETzog6Ieq5Yqo55Sf5oiQ77yM6ICD6JmR5bqP5YiX5YyWXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUVudGl0eSgpIHtcbiAgcmV0dXJuIGVudGl0eVNlcXVlbmNlKys7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1FbnRpdHkuanMubWFwIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///121\n')},function(module,__webpack_exports__,__webpack_require__){"use strict";eval('/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return GeometrySystem; });\n/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(9);\n/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(15);\n/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _babel_runtime_helpers_initializerDefineProperty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(10);\n/* harmony import */ var _babel_runtime_helpers_initializerDefineProperty__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_initializerDefineProperty__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(6);\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(7);\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _babel_runtime_helpers_applyDecoratedDescriptor__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(11);\n/* harmony import */ var _babel_runtime_helpers_applyDecoratedDescriptor__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_applyDecoratedDescriptor__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _babel_runtime_helpers_initializerWarningHelper__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(29);\n/* harmony import */ var _babel_runtime_helpers_initializerWarningHelper__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_initializerWarningHelper__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var inversify__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(5);\n/* harmony import */ var inversify__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(inversify__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(3);\n/* harmony import */ var _identifier__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(13);\n/* harmony import */ var _renderer_gl__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(35);\n\n\n\n\n\n\n\n\nvar _dec, _dec2, _dec3, _class, _class2, _descriptor, _descriptor2, _temp;\n\n\n\n\n\nvar GeometrySystem = (_dec = Object(inversify__WEBPACK_IMPORTED_MODULE_7__["injectable"])(), _dec2 = Object(inversify__WEBPACK_IMPORTED_MODULE_7__["inject"])(_identifier__WEBPACK_IMPORTED_MODULE_9__[/* IDENTIFIER */ "a"].GeometryComponentManager), _dec3 = Object(inversify__WEBPACK_IMPORTED_MODULE_7__["inject"])(_identifier__WEBPACK_IMPORTED_MODULE_9__[/* IDENTIFIER */ "a"].RenderEngine), _dec(_class = (_class2 = (_temp = /*#__PURE__*/function () {\n function GeometrySystem() {\n _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3___default()(this, GeometrySystem);\n\n _babel_runtime_helpers_initializerDefineProperty__WEBPACK_IMPORTED_MODULE_2___default()(this, "geometry", _descriptor, this);\n\n _babel_runtime_helpers_initializerDefineProperty__WEBPACK_IMPORTED_MODULE_2___default()(this, "engine", _descriptor2, this);\n }\n\n _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4___default()(GeometrySystem, [{\n key: "execute",\n value: function () {\n var _execute = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee() {\n var _this = this;\n\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n this.geometry.forEach(function (entity, component) {\n // build buffers for each geometry\n if (component.dirty) {\n component.attributes.forEach(function (attribute) {\n if (attribute.dirty && attribute.data) {\n if (!attribute.buffer) {\n attribute.buffer = _this.engine.createBuffer({\n data: attribute.data,\n type: _renderer_gl__WEBPACK_IMPORTED_MODULE_10__[/* gl */ "a"].FLOAT\n });\n } else {\n var _attribute$buffer;\n\n (_attribute$buffer = attribute.buffer) === null || _attribute$buffer === void 0 ? void 0 : _attribute$buffer.subData({\n data: attribute.data,\n // TODO: support offset in subdata\n offset: 0\n });\n }\n\n attribute.dirty = false;\n }\n }); // create index buffer if needed\n\n if (component.indices) {\n if (!component.indicesBuffer) {\n component.indicesBuffer = _this.engine.createElements({\n data: component.indices,\n count: component.indices.length,\n type: _renderer_gl__WEBPACK_IMPORTED_MODULE_10__[/* gl */ "a"].UNSIGNED_INT,\n usage: _renderer_gl__WEBPACK_IMPORTED_MODULE_10__[/* gl */ "a"].STATIC_DRAW\n });\n } else {\n component.indicesBuffer.subData({\n data: component.indices,\n offset: 0\n });\n }\n }\n\n component.dirty = false;\n }\n });\n\n case 1:\n case "end":\n return _context.stop();\n }\n }\n }, _callee, this);\n }));\n\n function execute() {\n return _execute.apply(this, arguments);\n }\n\n return execute;\n }()\n }, {\n key: "tearDown",\n value: function tearDown() {\n this.geometry.forEach(function (_, geometry) {\n if (geometry.indicesBuffer) {\n geometry.indicesBuffer.destroy();\n }\n\n geometry.attributes.forEach(function (attribute) {\n if (attribute.buffer) {\n attribute.buffer.destroy();\n }\n });\n });\n this.geometry.clear();\n }\n /**\n * @see https://threejs.org/docs/#api/en/core/BufferGeometry\n */\n\n }, {\n key: "createBufferGeometry",\n value: function createBufferGeometry() {\n var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {\n vertexCount: 3\n },\n vertexCount = _ref.vertexCount;\n\n var entity = Object(___WEBPACK_IMPORTED_MODULE_8__["createEntity"])();\n return this.geometry.create(entity, {\n vertexCount: vertexCount\n });\n }\n /**\n * @see https://threejs.org/docs/#api/en/core/InstancedBufferGeometry\n */\n\n }, {\n key: "createInstancedBufferGeometry",\n value: function createInstancedBufferGeometry(_ref2) {\n var maxInstancedCount = _ref2.maxInstancedCount,\n vertexCount = _ref2.vertexCount;\n var entity = Object(___WEBPACK_IMPORTED_MODULE_8__["createEntity"])();\n return this.geometry.create(entity, {\n maxInstancedCount: maxInstancedCount,\n vertexCount: vertexCount\n });\n }\n }]);\n\n return GeometrySystem;\n}(), _temp), (_descriptor = _babel_runtime_helpers_applyDecoratedDescriptor__WEBPACK_IMPORTED_MODULE_5___default()(_class2.prototype, "geometry", [_dec2], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n}), _descriptor2 = _babel_runtime_helpers_applyDecoratedDescriptor__WEBPACK_IMPORTED_MODULE_5___default()(_class2.prototype, "engine", [_dec3], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n})), _class2)) || _class);\n//# sourceMappingURL=System.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy13ZWJncHUtY29yZS9lcy9jb21wb25lbnRzL2dlb21ldHJ5L1N5c3RlbS5qcz9lMWQzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBNkQ7QUFDVztBQUNrQjtBQUN0QjtBQUNOO0FBQzBCO0FBQ0E7O0FBRXhGOztBQUUrQztBQUNWO0FBQ1M7QUFDVjtBQUM3Qiw2QkFBNkIsNERBQVUsWUFBWSx3REFBTSxDQUFDLDhEQUFVLG9DQUFvQyx3REFBTSxDQUFDLDhEQUFVO0FBQ2hJO0FBQ0EsSUFBSSw0RUFBZTs7QUFFbkIsSUFBSSx1RkFBMEI7O0FBRTlCLElBQUksdUZBQTBCO0FBQzlCOztBQUVBLEVBQUUseUVBQVk7QUFDZDtBQUNBO0FBQ0EscUJBQXFCLDhFQUFpQixlQUFlLGlFQUFtQjtBQUN4RTs7QUFFQSxlQUFlLGlFQUFtQjtBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLHdEQUFFO0FBQ3BDLDJCQUEyQjtBQUMzQix5QkFBeUI7QUFDekI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkI7QUFDM0I7O0FBRUE7QUFDQTtBQUNBLHFCQUFxQixFQUFFOztBQUV2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDLHdEQUFFO0FBQ2xDLGlDQUFpQyx3REFBRTtBQUNuQyx5QkFBeUI7QUFDekIsdUJBQXVCO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxpQkFBaUI7O0FBRWpCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTzs7QUFFUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUEsbUJBQW1CLHNEQUFZO0FBQy9CO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLHNEQUFZO0FBQy9CO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLEdBQUc7O0FBRUg7QUFDQSxDQUFDLDJCQUEyQixzRkFBeUI7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLGtCQUFrQixzRkFBeUI7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QiLCJmaWxlIjoiMTIyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF9yZWdlbmVyYXRvclJ1bnRpbWUgZnJvbSBcIkBiYWJlbC9ydW50aW1lL3JlZ2VuZXJhdG9yXCI7XG5pbXBvcnQgX2FzeW5jVG9HZW5lcmF0b3IgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXN5bmNUb0dlbmVyYXRvclwiO1xuaW1wb3J0IF9pbml0aWFsaXplckRlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2luaXRpYWxpemVyRGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfY2xhc3NDYWxsQ2hlY2sgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2tcIjtcbmltcG9ydCBfY3JlYXRlQ2xhc3MgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlQ2xhc3NcIjtcbmltcG9ydCBfYXBwbHlEZWNvcmF0ZWREZXNjcmlwdG9yIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2FwcGx5RGVjb3JhdGVkRGVzY3JpcHRvclwiO1xuaW1wb3J0IF9pbml0aWFsaXplcldhcm5pbmdIZWxwZXIgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW5pdGlhbGl6ZXJXYXJuaW5nSGVscGVyXCI7XG5cbnZhciBfZGVjLCBfZGVjMiwgX2RlYzMsIF9jbGFzcywgX2NsYXNzMiwgX2Rlc2NyaXB0b3IsIF9kZXNjcmlwdG9yMiwgX3RlbXA7XG5cbmltcG9ydCB7IGluamVjdCwgaW5qZWN0YWJsZSB9IGZyb20gJ2ludmVyc2lmeSc7XG5pbXBvcnQgeyBjcmVhdGVFbnRpdHkgfSBmcm9tICcuLi8uLic7XG5pbXBvcnQgeyBJREVOVElGSUVSIH0gZnJvbSAnLi4vLi4vaWRlbnRpZmllcic7XG5pbXBvcnQgeyBnbCB9IGZyb20gJy4uL3JlbmRlcmVyL2dsJztcbmV4cG9ydCB2YXIgR2VvbWV0cnlTeXN0ZW0gPSAoX2RlYyA9IGluamVjdGFibGUoKSwgX2RlYzIgPSBpbmplY3QoSURFTlRJRklFUi5HZW9tZXRyeUNvbXBvbmVudE1hbmFnZXIpLCBfZGVjMyA9IGluamVjdChJREVOVElGSUVSLlJlbmRlckVuZ2luZSksIF9kZWMoX2NsYXNzID0gKF9jbGFzczIgPSAoX3RlbXAgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBHZW9tZXRyeVN5c3RlbSgpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgR2VvbWV0cnlTeXN0ZW0pO1xuXG4gICAgX2luaXRpYWxpemVyRGVmaW5lUHJvcGVydHkodGhpcywgXCJnZW9tZXRyeVwiLCBfZGVzY3JpcHRvciwgdGhpcyk7XG5cbiAgICBfaW5pdGlhbGl6ZXJEZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImVuZ2luZVwiLCBfZGVzY3JpcHRvcjIsIHRoaXMpO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKEdlb21ldHJ5U3lzdGVtLCBbe1xuICAgIGtleTogXCJleGVjdXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfZXhlY3V0ZSA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUud3JhcChmdW5jdGlvbiBfY2FsbGVlJChfY29udGV4dCkge1xuICAgICAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7XG4gICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICB0aGlzLmdlb21ldHJ5LmZvckVhY2goZnVuY3Rpb24gKGVudGl0eSwgY29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgICAvLyBidWlsZCBidWZmZXJzIGZvciBlYWNoIGdlb21ldHJ5XG4gICAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50LmRpcnR5KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5hdHRyaWJ1dGVzLmZvckVhY2goZnVuY3Rpb24gKGF0dHJpYnV0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGUuZGlydHkgJiYgYXR0cmlidXRlLmRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYXR0cmlidXRlLmJ1ZmZlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUuYnVmZmVyID0gX3RoaXMuZW5naW5lLmNyZWF0ZUJ1ZmZlcih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogYXR0cmlidXRlLmRhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogZ2wuRkxPQVRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgX2F0dHJpYnV0ZSRidWZmZXI7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKF9hdHRyaWJ1dGUkYnVmZmVyID0gYXR0cmlidXRlLmJ1ZmZlcikgPT09IG51bGwgfHwgX2F0dHJpYnV0ZSRidWZmZXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hdHRyaWJ1dGUkYnVmZmVyLnN1YkRhdGEoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IGF0dHJpYnV0ZS5kYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IHN1cHBvcnQgb2Zmc2V0IGluIHN1YmRhdGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQ6IDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZS5kaXJ0eSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7IC8vIGNyZWF0ZSBpbmRleCBidWZmZXIgaWYgbmVlZGVkXG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudC5pbmRpY2VzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKCFjb21wb25lbnQuaW5kaWNlc0J1ZmZlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LmluZGljZXNCdWZmZXIgPSBfdGhpcy5lbmdpbmUuY3JlYXRlRWxlbWVudHMoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBjb21wb25lbnQuaW5kaWNlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6IGNvbXBvbmVudC5pbmRpY2VzLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogZ2wuVU5TSUdORURfSU5ULFxuICAgICAgICAgICAgICAgICAgICAgICAgICB1c2FnZTogZ2wuU1RBVElDX0RSQVdcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuaW5kaWNlc0J1ZmZlci5zdWJEYXRhKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogY29tcG9uZW50LmluZGljZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldDogMFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LmRpcnR5ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LnN0b3AoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sIF9jYWxsZWUsIHRoaXMpO1xuICAgICAgfSkpO1xuXG4gICAgICBmdW5jdGlvbiBleGVjdXRlKCkge1xuICAgICAgICByZXR1cm4gX2V4ZWN1dGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGV4ZWN1dGU7XG4gICAgfSgpXG4gIH0sIHtcbiAgICBrZXk6IFwidGVhckRvd25cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdGVhckRvd24oKSB7XG4gICAgICB0aGlzLmdlb21ldHJ5LmZvckVhY2goZnVuY3Rpb24gKF8sIGdlb21ldHJ5KSB7XG4gICAgICAgIGlmIChnZW9tZXRyeS5pbmRpY2VzQnVmZmVyKSB7XG4gICAgICAgICAgZ2VvbWV0cnkuaW5kaWNlc0J1ZmZlci5kZXN0cm95KCk7XG4gICAgICAgIH1cblxuICAgICAgICBnZW9tZXRyeS5hdHRyaWJ1dGVzLmZvckVhY2goZnVuY3Rpb24gKGF0dHJpYnV0ZSkge1xuICAgICAgICAgIGlmIChhdHRyaWJ1dGUuYnVmZmVyKSB7XG4gICAgICAgICAgICBhdHRyaWJ1dGUuYnVmZmVyLmRlc3Ryb3koKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmdlb21ldHJ5LmNsZWFyKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBzZWUgaHR0cHM6Ly90aHJlZWpzLm9yZy9kb2NzLyNhcGkvZW4vY29yZS9CdWZmZXJHZW9tZXRyeVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiY3JlYXRlQnVmZmVyR2VvbWV0cnlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY3JlYXRlQnVmZmVyR2VvbWV0cnkoKSB7XG4gICAgICB2YXIgX3JlZiA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge1xuICAgICAgICB2ZXJ0ZXhDb3VudDogM1xuICAgICAgfSxcbiAgICAgICAgICB2ZXJ0ZXhDb3VudCA9IF9yZWYudmVydGV4Q291bnQ7XG5cbiAgICAgIHZhciBlbnRpdHkgPSBjcmVhdGVFbnRpdHkoKTtcbiAgICAgIHJldHVybiB0aGlzLmdlb21ldHJ5LmNyZWF0ZShlbnRpdHksIHtcbiAgICAgICAgdmVydGV4Q291bnQ6IHZlcnRleENvdW50XG4gICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHNlZSBodHRwczovL3RocmVlanMub3JnL2RvY3MvI2FwaS9lbi9jb3JlL0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJjcmVhdGVJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjcmVhdGVJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeShfcmVmMikge1xuICAgICAgdmFyIG1heEluc3RhbmNlZENvdW50ID0gX3JlZjIubWF4SW5zdGFuY2VkQ291bnQsXG4gICAgICAgICAgdmVydGV4Q291bnQgPSBfcmVmMi52ZXJ0ZXhDb3VudDtcbiAgICAgIHZhciBlbnRpdHkgPSBjcmVhdGVFbnRpdHkoKTtcbiAgICAgIHJldHVybiB0aGlzLmdlb21ldHJ5LmNyZWF0ZShlbnRpdHksIHtcbiAgICAgICAgbWF4SW5zdGFuY2VkQ291bnQ6IG1heEluc3RhbmNlZENvdW50LFxuICAgICAgICB2ZXJ0ZXhDb3VudDogdmVydGV4Q291bnRcbiAgICAgIH0pO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBHZW9tZXRyeVN5c3RlbTtcbn0oKSwgX3RlbXApLCAoX2Rlc2NyaXB0b3IgPSBfYXBwbHlEZWNvcmF0ZWREZXNjcmlwdG9yKF9jbGFzczIucHJvdG90eXBlLCBcImdlb21ldHJ5XCIsIFtfZGVjMl0sIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICB3cml0YWJsZTogdHJ1ZSxcbiAgaW5pdGlhbGl6ZXI6IG51bGxcbn0pLCBfZGVzY3JpcHRvcjIgPSBfYXBwbHlEZWNvcmF0ZWREZXNjcmlwdG9yKF9jbGFzczIucHJvdG90eXBlLCBcImVuZ2luZVwiLCBbX2RlYzNdLCB7XG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgd3JpdGFibGU6IHRydWUsXG4gIGluaXRpYWxpemVyOiBudWxsXG59KSksIF9jbGFzczIpKSB8fCBfY2xhc3MpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U3lzdGVtLmpzLm1hcCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///122\n')},function(module,__webpack_exports__,__webpack_require__){"use strict";eval('/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return MaterialComponent; });\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4);\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(6);\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(7);\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(22);\n/* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(23);\n/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(24);\n/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(18);\n/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(3);\n/* harmony import */ var _ComponentManager__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(25);\n\n\n\n\n\n\n\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default()(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6___default()(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_6___default()(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_5___default()(this, result); }; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\n\n\nvar MaterialComponent = /*#__PURE__*/function (_Component) {\n _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(MaterialComponent, _Component);\n\n var _super = _createSuper(MaterialComponent);\n\n // control flow in shaders, eg. USE_UV, USE_MAP...\n function MaterialComponent(data) {\n var _this;\n\n _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1___default()(this, MaterialComponent);\n\n _this = _super.call(this, data);\n _this.vertexShaderGLSL = void 0;\n _this.fragmentShaderGLSL = void 0;\n _this.defines = {};\n _this.dirty = true;\n _this.uniforms = [];\n _this.cull = {\n enable: true,\n face: ___WEBPACK_IMPORTED_MODULE_7__["gl"].BACK\n };\n _this.depth = {\n enable: true\n };\n _this.blend = void 0;\n _this.entity = void 0;\n _this.type = void 0;\n Object.assign(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_3___default()(_this), data);\n return _this;\n }\n\n _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2___default()(MaterialComponent, [{\n key: "setDefines",\n value: function setDefines(defines) {\n this.defines = _objectSpread(_objectSpread({}, this.defines), defines);\n return this;\n }\n }, {\n key: "setCull",\n value: function setCull(cull) {\n this.cull = cull;\n return this;\n }\n }, {\n key: "setDepth",\n value: function setDepth(depth) {\n this.depth = depth;\n return this;\n }\n }, {\n key: "setBlend",\n value: function setBlend(blend) {\n this.blend = blend;\n return this;\n }\n }, {\n key: "setUniform",\n value: function setUniform(name, data) {\n var _this2 = this;\n\n if (typeof name !== \'string\') {\n Object.keys(name).forEach(function (key) {\n return _this2.setUniform(key, name[key]);\n });\n return this;\n }\n\n var existedUniform = this.uniforms.find(function (u) {\n return u.name === name;\n });\n\n if (!existedUniform) {\n this.uniforms.push({\n name: name,\n dirty: true,\n data: data\n });\n } else {\n existedUniform.dirty = true;\n existedUniform.data = data;\n }\n\n this.dirty = true;\n return this;\n }\n }]);\n\n return MaterialComponent;\n}(_ComponentManager__WEBPACK_IMPORTED_MODULE_8__[/* Component */ "a"]);\n//# sourceMappingURL=MaterialComponent.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy13ZWJncHUtY29yZS9lcy9jb21wb25lbnRzL21hdGVyaWFsL01hdGVyaWFsQ29tcG9uZW50LmpzP2E2MWQiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFvRTtBQUNBO0FBQ047QUFDb0I7QUFDMUI7QUFDa0M7QUFDdEI7O0FBRXBFLDBDQUEwQyxnQ0FBZ0Msb0NBQW9DLG9EQUFvRCw4REFBOEQsZ0VBQWdFLEVBQUUsRUFBRSxnQ0FBZ0MsRUFBRSxhQUFhOztBQUVuVixnQ0FBZ0MsZ0JBQWdCLHNCQUFzQixPQUFPLHVEQUF1RCxhQUFhLHVEQUF1RCxDQUFDLDRFQUFlLDJCQUEyQixFQUFFLEVBQUUsRUFBRSw2Q0FBNkMsMkVBQTJFLEVBQUUsT0FBTyxpREFBaUQsa0ZBQWtGLEVBQUUsRUFBRSxFQUFFLEVBQUUsZUFBZTs7QUFFcGhCLGdDQUFnQyw2REFBNkQseUNBQXlDLGFBQWEsNEVBQWUsa0JBQWtCLGlDQUFpQyxpQkFBaUIsNEVBQWUsbUJBQW1CLHlEQUF5RCxFQUFFLE9BQU8sdUNBQXVDLEVBQUUsUUFBUSx1RkFBMEIsZUFBZSxHQUFHOztBQUV2YSxzQ0FBc0Msd0VBQXdFLDBDQUEwQyw4Q0FBOEMsTUFBTSx3RUFBd0UsR0FBRyxhQUFhLEVBQUUsWUFBWSxjQUFjLEVBQUU7O0FBRXZTO0FBQ3dCO0FBQzVDO0FBQ1AsRUFBRSxzRUFBUzs7QUFFWDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsSUFBSSw0RUFBZTs7QUFFbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksb0NBQUU7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixtRkFBc0I7QUFDeEM7QUFDQTs7QUFFQSxFQUFFLHlFQUFZO0FBQ2Q7QUFDQTtBQUNBLG1EQUFtRDtBQUNuRDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBLENBQUMsQ0FBQyxtRUFBUztBQUNYIiwiZmlsZSI6IjEyMy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfY2xhc3NDYWxsQ2hlY2sgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2tcIjtcbmltcG9ydCBfY3JlYXRlQ2xhc3MgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlQ2xhc3NcIjtcbmltcG9ydCBfYXNzZXJ0VGhpc0luaXRpYWxpemVkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2Fzc2VydFRoaXNJbml0aWFsaXplZFwiO1xuaW1wb3J0IF9pbmhlcml0cyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbmhlcml0c1wiO1xuaW1wb3J0IF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm5cIjtcbmltcG9ydCBfZ2V0UHJvdG90eXBlT2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZ2V0UHJvdG90eXBlT2ZcIjtcblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7IHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7IGlmIChlbnVtZXJhYmxlT25seSkgc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7IH0pOyBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7IH0gcmV0dXJuIGtleXM7IH1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXSAhPSBudWxsID8gYXJndW1lbnRzW2ldIDoge307IGlmIChpICUgMikgeyBvd25LZXlzKE9iamVjdChzb3VyY2UpLCB0cnVlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pOyB9IGVsc2UgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSk7IH0gZWxzZSB7IG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsgfSk7IH0gfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmZ1bmN0aW9uIF9jcmVhdGVTdXBlcihEZXJpdmVkKSB7IHZhciBoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0ID0gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpOyByZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKSB7IHZhciBTdXBlciA9IF9nZXRQcm90b3R5cGVPZihEZXJpdmVkKSwgcmVzdWx0OyBpZiAoaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCkgeyB2YXIgTmV3VGFyZ2V0ID0gX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yOyByZXN1bHQgPSBSZWZsZWN0LmNvbnN0cnVjdChTdXBlciwgYXJndW1lbnRzLCBOZXdUYXJnZXQpOyB9IGVsc2UgeyByZXN1bHQgPSBTdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9IHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCByZXN1bHQpOyB9OyB9XG5cbmZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7IGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpIHJldHVybiBmYWxzZTsgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTsgaWYgKHR5cGVvZiBQcm94eSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdHJ1ZTsgdHJ5IHsgRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLCBbXSwgZnVuY3Rpb24gKCkge30pKTsgcmV0dXJuIHRydWU7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9IH1cblxuaW1wb3J0IHsgZ2wgfSBmcm9tICcuLi8uLic7XG5pbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tICcuLi8uLi9Db21wb25lbnRNYW5hZ2VyJztcbmV4cG9ydCB2YXIgTWF0ZXJpYWxDb21wb25lbnQgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcbiAgX2luaGVyaXRzKE1hdGVyaWFsQ29tcG9uZW50LCBfQ29tcG9uZW50KTtcblxuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKE1hdGVyaWFsQ29tcG9uZW50KTtcblxuICAvLyBjb250cm9sIGZsb3cgaW4gc2hhZGVycywgZWcuIFVTRV9VViwgVVNFX01BUC4uLlxuICBmdW5jdGlvbiBNYXRlcmlhbENvbXBvbmVudChkYXRhKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIE1hdGVyaWFsQ29tcG9uZW50KTtcblxuICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgZGF0YSk7XG4gICAgX3RoaXMudmVydGV4U2hhZGVyR0xTTCA9IHZvaWQgMDtcbiAgICBfdGhpcy5mcmFnbWVudFNoYWRlckdMU0wgPSB2b2lkIDA7XG4gICAgX3RoaXMuZGVmaW5lcyA9IHt9O1xuICAgIF90aGlzLmRpcnR5ID0gdHJ1ZTtcbiAgICBfdGhpcy51bmlmb3JtcyA9IFtdO1xuICAgIF90aGlzLmN1bGwgPSB7XG4gICAgICBlbmFibGU6IHRydWUsXG4gICAgICBmYWNlOiBnbC5CQUNLXG4gICAgfTtcbiAgICBfdGhpcy5kZXB0aCA9IHtcbiAgICAgIGVuYWJsZTogdHJ1ZVxuICAgIH07XG4gICAgX3RoaXMuYmxlbmQgPSB2b2lkIDA7XG4gICAgX3RoaXMuZW50aXR5ID0gdm9pZCAwO1xuICAgIF90aGlzLnR5cGUgPSB2b2lkIDA7XG4gICAgT2JqZWN0LmFzc2lnbihfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgZGF0YSk7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKE1hdGVyaWFsQ29tcG9uZW50LCBbe1xuICAgIGtleTogXCJzZXREZWZpbmVzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldERlZmluZXMoZGVmaW5lcykge1xuICAgICAgdGhpcy5kZWZpbmVzID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCB0aGlzLmRlZmluZXMpLCBkZWZpbmVzKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzZXRDdWxsXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldEN1bGwoY3VsbCkge1xuICAgICAgdGhpcy5jdWxsID0gY3VsbDtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzZXREZXB0aFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXREZXB0aChkZXB0aCkge1xuICAgICAgdGhpcy5kZXB0aCA9IGRlcHRoO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNldEJsZW5kXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldEJsZW5kKGJsZW5kKSB7XG4gICAgICB0aGlzLmJsZW5kID0gYmxlbmQ7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2V0VW5pZm9ybVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRVbmlmb3JtKG5hbWUsIGRhdGEpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICBpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIE9iamVjdC5rZXlzKG5hbWUpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgIHJldHVybiBfdGhpczIuc2V0VW5pZm9ybShrZXksIG5hbWVba2V5XSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgdmFyIGV4aXN0ZWRVbmlmb3JtID0gdGhpcy51bmlmb3Jtcy5maW5kKGZ1bmN0aW9uICh1KSB7XG4gICAgICAgIHJldHVybiB1Lm5hbWUgPT09IG5hbWU7XG4gICAgICB9KTtcblxuICAgICAgaWYgKCFleGlzdGVkVW5pZm9ybSkge1xuICAgICAgICB0aGlzLnVuaWZvcm1zLnB1c2goe1xuICAgICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgICAgZGlydHk6IHRydWUsXG4gICAgICAgICAgZGF0YTogZGF0YVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGV4aXN0ZWRVbmlmb3JtLmRpcnR5ID0gdHJ1ZTtcbiAgICAgICAgZXhpc3RlZFVuaWZvcm0uZGF0YSA9IGRhdGE7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZGlydHkgPSB0cnVlO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIE1hdGVyaWFsQ29tcG9uZW50O1xufShDb21wb25lbnQpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TWF0ZXJpYWxDb21wb25lbnQuanMubWFwIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///123\n')},function(module,__webpack_exports__,__webpack_require__){"use strict";eval('/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return MaterialSystem; });\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4);\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(9);\n/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(15);\n/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _babel_runtime_helpers_initializerDefineProperty__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(10);\n/* harmony import */ var _babel_runtime_helpers_initializerDefineProperty__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_initializerDefineProperty__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(6);\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(7);\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _babel_runtime_helpers_applyDecoratedDescriptor__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(11);\n/* harmony import */ var _babel_runtime_helpers_applyDecoratedDescriptor__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_applyDecoratedDescriptor__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var _babel_runtime_helpers_initializerWarningHelper__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(29);\n/* harmony import */ var _babel_runtime_helpers_initializerWarningHelper__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_initializerWarningHelper__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var inversify__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(5);\n/* harmony import */ var inversify__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(inversify__WEBPACK_IMPORTED_MODULE_8__);\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(3);\n/* harmony import */ var _identifier__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(13);\n\n\n\n\n\n\n\n\n\nvar _dec, _dec2, _dec3, _dec4, _class, _class2, _descriptor, _descriptor2, _descriptor3, _temp;\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default()(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\n\n\n\nvar MaterialSystem = (_dec = Object(inversify__WEBPACK_IMPORTED_MODULE_8__["injectable"])(), _dec2 = Object(inversify__WEBPACK_IMPORTED_MODULE_8__["inject"])(_identifier__WEBPACK_IMPORTED_MODULE_10__[/* IDENTIFIER */ "a"].MaterialComponentManager), _dec3 = Object(inversify__WEBPACK_IMPORTED_MODULE_8__["inject"])(_identifier__WEBPACK_IMPORTED_MODULE_10__[/* IDENTIFIER */ "a"].RenderEngine), _dec4 = Object(inversify__WEBPACK_IMPORTED_MODULE_8__["inject"])(_identifier__WEBPACK_IMPORTED_MODULE_10__[/* IDENTIFIER */ "a"].ShaderModuleService), _dec(_class = (_class2 = (_temp = /*#__PURE__*/function () {\n function MaterialSystem() {\n _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_4___default()(this, MaterialSystem);\n\n _babel_runtime_helpers_initializerDefineProperty__WEBPACK_IMPORTED_MODULE_3___default()(this, "material", _descriptor, this);\n\n _babel_runtime_helpers_initializerDefineProperty__WEBPACK_IMPORTED_MODULE_3___default()(this, "engine", _descriptor2, this);\n\n _babel_runtime_helpers_initializerDefineProperty__WEBPACK_IMPORTED_MODULE_3___default()(this, "shaderModule", _descriptor3, this);\n }\n\n _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_5___default()(MaterialSystem, [{\n key: "execute",\n value: function () {\n var _execute = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee() {\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n case "end":\n return _context.stop();\n }\n }\n }, _callee);\n }));\n\n function execute() {\n return _execute.apply(this, arguments);\n }\n\n return execute;\n }()\n }, {\n key: "tearDown",\n value: function tearDown() {\n this.material.clear();\n }\n /**\n * @see https://threejs.org/docs/#api/en/materials/ShaderMaterial\n */\n\n }, {\n key: "createShaderMaterial",\n value: function createShaderMaterial(params) {\n var entity = Object(___WEBPACK_IMPORTED_MODULE_9__["createEntity"])();\n var vertexShaderGLSL = params.vertexShader;\n var fragmentShaderGLSL = params.fragmentShader;\n var uniforms = [];\n\n if (!this.engine.supportWebGPU) {\n var moduleName = "material-".concat(entity);\n this.shaderModule.registerModule(moduleName, {\n vs: params.vertexShader,\n fs: params.fragmentShader\n });\n var materialModule = this.shaderModule.getModule(moduleName);\n vertexShaderGLSL = materialModule.vs;\n fragmentShaderGLSL = materialModule.fs;\n\n if (materialModule.uniforms) {\n // @ts-ignore\n uniforms = Object.keys(materialModule.uniforms).map(function (uniformName) {\n return {\n dirty: true,\n name: uniformName,\n // @ts-ignore\n data: materialModule.uniforms[uniformName]\n };\n });\n }\n }\n\n return this.material.create(entity, _objectSpread(_objectSpread({\n vertexShaderGLSL: vertexShaderGLSL,\n fragmentShaderGLSL: fragmentShaderGLSL\n }, params), {}, {\n uniforms: uniforms\n }));\n }\n }]);\n\n return MaterialSystem;\n}(), _temp), (_descriptor = _babel_runtime_helpers_applyDecoratedDescriptor__WEBPACK_IMPORTED_MODULE_6___default()(_class2.prototype, "material", [_dec2], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n}), _descriptor2 = _babel_runtime_helpers_applyDecoratedDescriptor__WEBPACK_IMPORTED_MODULE_6___default()(_class2.prototype, "engine", [_dec3], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n}), _descriptor3 = _babel_runtime_helpers_applyDecoratedDescriptor__WEBPACK_IMPORTED_MODULE_6___default()(_class2.prototype, "shaderModule", [_dec4], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n})), _class2)) || _class);\n//# sourceMappingURL=System.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy13ZWJncHUtY29yZS9lcy9jb21wb25lbnRzL21hdGVyaWFsL1N5c3RlbS5qcz80NjVjIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFvRTtBQUNQO0FBQ1c7QUFDa0I7QUFDdEI7QUFDTjtBQUMwQjtBQUNBOztBQUV4Rjs7QUFFQSwwQ0FBMEMsZ0NBQWdDLG9DQUFvQyxvREFBb0QsOERBQThELGdFQUFnRSxFQUFFLEVBQUUsZ0NBQWdDLEVBQUUsYUFBYTs7QUFFblYsZ0NBQWdDLGdCQUFnQixzQkFBc0IsT0FBTyx1REFBdUQsYUFBYSx1REFBdUQsQ0FBQyw0RUFBZSwyQkFBMkIsRUFBRSxFQUFFLEVBQUUsNkNBQTZDLDJFQUEyRSxFQUFFLE9BQU8saURBQWlELGtGQUFrRixFQUFFLEVBQUUsRUFBRSxFQUFFLGVBQWU7O0FBRXJlO0FBQ1Y7QUFDUztBQUN2Qyw2QkFBNkIsNERBQVUsWUFBWSx3REFBTSxDQUFDLCtEQUFVLG9DQUFvQyx3REFBTSxDQUFDLCtEQUFVLHdCQUF3Qix3REFBTSxDQUFDLCtEQUFVO0FBQ3pLO0FBQ0EsSUFBSSw0RUFBZTs7QUFFbkIsSUFBSSx1RkFBMEI7O0FBRTlCLElBQUksdUZBQTBCOztBQUU5QixJQUFJLHVGQUEwQjtBQUM5Qjs7QUFFQSxFQUFFLHlFQUFZO0FBQ2Q7QUFDQTtBQUNBLHFCQUFxQiw4RUFBaUIsZUFBZSxpRUFBbUI7QUFDeEUsZUFBZSxpRUFBbUI7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTzs7QUFFUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsbUJBQW1CLHNEQUFZO0FBQy9CO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPLGFBQWE7QUFDcEI7QUFDQSxPQUFPO0FBQ1A7QUFDQSxHQUFHOztBQUVIO0FBQ0EsQ0FBQywyQkFBMkIsc0ZBQXlCO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxrQkFBa0Isc0ZBQXlCO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxrQkFBa0Isc0ZBQXlCO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEIiwiZmlsZSI6IjEyNC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfcmVnZW5lcmF0b3JSdW50aW1lIGZyb20gXCJAYmFiZWwvcnVudGltZS9yZWdlbmVyYXRvclwiO1xuaW1wb3J0IF9hc3luY1RvR2VuZXJhdG9yIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2FzeW5jVG9HZW5lcmF0b3JcIjtcbmltcG9ydCBfaW5pdGlhbGl6ZXJEZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbml0aWFsaXplckRlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrXCI7XG5pbXBvcnQgX2NyZWF0ZUNsYXNzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzXCI7XG5pbXBvcnQgX2FwcGx5RGVjb3JhdGVkRGVzY3JpcHRvciBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hcHBseURlY29yYXRlZERlc2NyaXB0b3JcIjtcbmltcG9ydCBfaW5pdGlhbGl6ZXJXYXJuaW5nSGVscGVyIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2luaXRpYWxpemVyV2FybmluZ0hlbHBlclwiO1xuXG52YXIgX2RlYywgX2RlYzIsIF9kZWMzLCBfZGVjNCwgX2NsYXNzLCBfY2xhc3MyLCBfZGVzY3JpcHRvciwgX2Rlc2NyaXB0b3IyLCBfZGVzY3JpcHRvcjMsIF90ZW1wO1xuXG5mdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHsgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTsgaWYgKGVudW1lcmFibGVPbmx5KSBzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTsgfSk7IGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsgfSByZXR1cm4ga2V5czsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldICE9IG51bGwgPyBhcmd1bWVudHNbaV0gOiB7fTsgaWYgKGkgJSAyKSB7IG93bktleXMoT2JqZWN0KHNvdXJjZSksIHRydWUpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSk7IH0gZWxzZSBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMpIHsgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKTsgfSBlbHNlIHsgb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpOyB9KTsgfSB9IHJldHVybiB0YXJnZXQ7IH1cblxuaW1wb3J0IHsgaW5qZWN0LCBpbmplY3RhYmxlIH0gZnJvbSAnaW52ZXJzaWZ5JztcbmltcG9ydCB7IGNyZWF0ZUVudGl0eSB9IGZyb20gJy4uLy4uJztcbmltcG9ydCB7IElERU5USUZJRVIgfSBmcm9tICcuLi8uLi9pZGVudGlmaWVyJztcbmV4cG9ydCB2YXIgTWF0ZXJpYWxTeXN0ZW0gPSAoX2RlYyA9IGluamVjdGFibGUoKSwgX2RlYzIgPSBpbmplY3QoSURFTlRJRklFUi5NYXRlcmlhbENvbXBvbmVudE1hbmFnZXIpLCBfZGVjMyA9IGluamVjdChJREVOVElGSUVSLlJlbmRlckVuZ2luZSksIF9kZWM0ID0gaW5qZWN0KElERU5USUZJRVIuU2hhZGVyTW9kdWxlU2VydmljZSksIF9kZWMoX2NsYXNzID0gKF9jbGFzczIgPSAoX3RlbXAgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBNYXRlcmlhbFN5c3RlbSgpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgTWF0ZXJpYWxTeXN0ZW0pO1xuXG4gICAgX2luaXRpYWxpemVyRGVmaW5lUHJvcGVydHkodGhpcywgXCJtYXRlcmlhbFwiLCBfZGVzY3JpcHRvciwgdGhpcyk7XG5cbiAgICBfaW5pdGlhbGl6ZXJEZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImVuZ2luZVwiLCBfZGVzY3JpcHRvcjIsIHRoaXMpO1xuXG4gICAgX2luaXRpYWxpemVyRGVmaW5lUHJvcGVydHkodGhpcywgXCJzaGFkZXJNb2R1bGVcIiwgX2Rlc2NyaXB0b3IzLCB0aGlzKTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhNYXRlcmlhbFN5c3RlbSwgW3tcbiAgICBrZXk6IFwiZXhlY3V0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX2V4ZWN1dGUgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUubWFyayhmdW5jdGlvbiBfY2FsbGVlKCkge1xuICAgICAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7XG4gICAgICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHtcbiAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LnN0b3AoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sIF9jYWxsZWUpO1xuICAgICAgfSkpO1xuXG4gICAgICBmdW5jdGlvbiBleGVjdXRlKCkge1xuICAgICAgICByZXR1cm4gX2V4ZWN1dGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGV4ZWN1dGU7XG4gICAgfSgpXG4gIH0sIHtcbiAgICBrZXk6IFwidGVhckRvd25cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdGVhckRvd24oKSB7XG4gICAgICB0aGlzLm1hdGVyaWFsLmNsZWFyKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBzZWUgaHR0cHM6Ly90aHJlZWpzLm9yZy9kb2NzLyNhcGkvZW4vbWF0ZXJpYWxzL1NoYWRlck1hdGVyaWFsXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJjcmVhdGVTaGFkZXJNYXRlcmlhbFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjcmVhdGVTaGFkZXJNYXRlcmlhbChwYXJhbXMpIHtcbiAgICAgIHZhciBlbnRpdHkgPSBjcmVhdGVFbnRpdHkoKTtcbiAgICAgIHZhciB2ZXJ0ZXhTaGFkZXJHTFNMID0gcGFyYW1zLnZlcnRleFNoYWRlcjtcbiAgICAgIHZhciBmcmFnbWVudFNoYWRlckdMU0wgPSBwYXJhbXMuZnJhZ21lbnRTaGFkZXI7XG4gICAgICB2YXIgdW5pZm9ybXMgPSBbXTtcblxuICAgICAgaWYgKCF0aGlzLmVuZ2luZS5zdXBwb3J0V2ViR1BVKSB7XG4gICAgICAgIHZhciBtb2R1bGVOYW1lID0gXCJtYXRlcmlhbC1cIi5jb25jYXQoZW50aXR5KTtcbiAgICAgICAgdGhpcy5zaGFkZXJNb2R1bGUucmVnaXN0ZXJNb2R1bGUobW9kdWxlTmFtZSwge1xuICAgICAgICAgIHZzOiBwYXJhbXMudmVydGV4U2hhZGVyLFxuICAgICAgICAgIGZzOiBwYXJhbXMuZnJhZ21lbnRTaGFkZXJcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciBtYXRlcmlhbE1vZHVsZSA9IHRoaXMuc2hhZGVyTW9kdWxlLmdldE1vZHVsZShtb2R1bGVOYW1lKTtcbiAgICAgICAgdmVydGV4U2hhZGVyR0xTTCA9IG1hdGVyaWFsTW9kdWxlLnZzO1xuICAgICAgICBmcmFnbWVudFNoYWRlckdMU0wgPSBtYXRlcmlhbE1vZHVsZS5mcztcblxuICAgICAgICBpZiAobWF0ZXJpYWxNb2R1bGUudW5pZm9ybXMpIHtcbiAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgdW5pZm9ybXMgPSBPYmplY3Qua2V5cyhtYXRlcmlhbE1vZHVsZS51bmlmb3JtcykubWFwKGZ1bmN0aW9uICh1bmlmb3JtTmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgZGlydHk6IHRydWUsXG4gICAgICAgICAgICAgIG5hbWU6IHVuaWZvcm1OYW1lLFxuICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgIGRhdGE6IG1hdGVyaWFsTW9kdWxlLnVuaWZvcm1zW3VuaWZvcm1OYW1lXVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5tYXRlcmlhbC5jcmVhdGUoZW50aXR5LCBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe1xuICAgICAgICB2ZXJ0ZXhTaGFkZXJHTFNMOiB2ZXJ0ZXhTaGFkZXJHTFNMLFxuICAgICAgICBmcmFnbWVudFNoYWRlckdMU0w6IGZyYWdtZW50U2hhZGVyR0xTTFxuICAgICAgfSwgcGFyYW1zKSwge30sIHtcbiAgICAgICAgdW5pZm9ybXM6IHVuaWZvcm1zXG4gICAgICB9KSk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIE1hdGVyaWFsU3lzdGVtO1xufSgpLCBfdGVtcCksIChfZGVzY3JpcHRvciA9IF9hcHBseURlY29yYXRlZERlc2NyaXB0b3IoX2NsYXNzMi5wcm90b3R5cGUsIFwibWF0ZXJpYWxcIiwgW19kZWMyXSwge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHdyaXRhYmxlOiB0cnVlLFxuICBpbml0aWFsaXplcjogbnVsbFxufSksIF9kZXNjcmlwdG9yMiA9IF9hcHBseURlY29yYXRlZERlc2NyaXB0b3IoX2NsYXNzMi5wcm90b3R5cGUsIFwiZW5naW5lXCIsIFtfZGVjM10sIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICB3cml0YWJsZTogdHJ1ZSxcbiAgaW5pdGlhbGl6ZXI6IG51bGxcbn0pLCBfZGVzY3JpcHRvcjMgPSBfYXBwbHlEZWNvcmF0ZWREZXNjcmlwdG9yKF9jbGFzczIucHJvdG90eXBlLCBcInNoYWRlck1vZHVsZVwiLCBbX2RlYzRdLCB7XG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgd3JpdGFibGU6IHRydWUsXG4gIGluaXRpYWxpemVyOiBudWxsXG59KSksIF9jbGFzczIpKSB8fCBfY2xhc3MpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U3lzdGVtLmpzLm1hcCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///124\n')},function(module,__webpack_exports__,__webpack_require__){"use strict";eval('/* unused harmony export Strategy */\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return CullableComponent; });\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6);\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(22);\n/* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(23);\n/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(24);\n/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(18);\n/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _ComponentManager__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(25);\n\n\n\n\n\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4___default()(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4___default()(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_3___default()(this, result); }; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\n\n\n/**\n * @see https://doc.babylonjs.com/how_to/optimizing_your_scene#changing-mesh-culling-strategy\n */\nvar Strategy;\n\n(function (Strategy) {\n Strategy[Strategy["Standard"] = 0] = "Standard";\n})(Strategy || (Strategy = {}));\n\nvar CullableComponent = /*#__PURE__*/function (_Component) {\n _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_2___default()(CullableComponent, _Component);\n\n var _super = _createSuper(CullableComponent);\n\n function CullableComponent(data) {\n var _this;\n\n _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, CullableComponent);\n\n _this = _super.call(this, data);\n _this.strategy = Strategy.Standard;\n _this.visibilityPlaneMask = 0;\n _this.visible = false;\n Object.assign(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_1___default()(_this), data);\n return _this;\n }\n\n return CullableComponent;\n}(_ComponentManager__WEBPACK_IMPORTED_MODULE_5__[/* Component */ "a"]);\n//# sourceMappingURL=CullableComponent.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy13ZWJncHUtY29yZS9lcy9jb21wb25lbnRzL21lc2gvQ3VsbGFibGVDb21wb25lbnQuanM/NmRhNSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFvRTtBQUNjO0FBQzFCO0FBQ2tDO0FBQ3RCOztBQUVwRSxnQ0FBZ0MsNkRBQTZELHlDQUF5QyxhQUFhLDRFQUFlLGtCQUFrQixpQ0FBaUMsaUJBQWlCLDRFQUFlLG1CQUFtQix5REFBeUQsRUFBRSxPQUFPLHVDQUF1QyxFQUFFLFFBQVEsdUZBQTBCLGVBQWUsR0FBRzs7QUFFdmEsc0NBQXNDLHdFQUF3RSwwQ0FBMEMsOENBQThDLE1BQU0sd0VBQXdFLEdBQUcsYUFBYSxFQUFFLFlBQVksY0FBYyxFQUFFOztBQUUvUTs7QUFFbkQ7QUFDQTtBQUNBO0FBQ087O0FBRVA7QUFDQTtBQUNBLENBQUMsNEJBQTRCOztBQUV0QjtBQUNQLEVBQUUsc0VBQVM7O0FBRVg7O0FBRUE7QUFDQTs7QUFFQSxJQUFJLDRFQUFlOztBQUVuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixtRkFBc0I7QUFDeEM7QUFDQTs7QUFFQTtBQUNBLENBQUMsQ0FBQyxtRUFBUztBQUNYIiwiZmlsZSI6IjEyNS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfY2xhc3NDYWxsQ2hlY2sgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2tcIjtcbmltcG9ydCBfYXNzZXJ0VGhpc0luaXRpYWxpemVkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2Fzc2VydFRoaXNJbml0aWFsaXplZFwiO1xuaW1wb3J0IF9pbmhlcml0cyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbmhlcml0c1wiO1xuaW1wb3J0IF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm5cIjtcbmltcG9ydCBfZ2V0UHJvdG90eXBlT2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZ2V0UHJvdG90eXBlT2ZcIjtcblxuZnVuY3Rpb24gX2NyZWF0ZVN1cGVyKERlcml2ZWQpIHsgdmFyIGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QgPSBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCk7IHJldHVybiBmdW5jdGlvbiBfY3JlYXRlU3VwZXJJbnRlcm5hbCgpIHsgdmFyIFN1cGVyID0gX2dldFByb3RvdHlwZU9mKERlcml2ZWQpLCByZXN1bHQ7IGlmIChoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KSB7IHZhciBOZXdUYXJnZXQgPSBfZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3I7IHJlc3VsdCA9IFJlZmxlY3QuY29uc3RydWN0KFN1cGVyLCBhcmd1bWVudHMsIE5ld1RhcmdldCk7IH0gZWxzZSB7IHJlc3VsdCA9IFN1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH0gcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIHJlc3VsdCk7IH07IH1cblxuZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpIHsgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcInVuZGVmaW5lZFwiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlOyBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlOyBpZiAodHlwZW9mIFByb3h5ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiB0cnVlOyB0cnkgeyBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfVxuXG5pbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tICcuLi8uLi9Db21wb25lbnRNYW5hZ2VyJztcblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vZG9jLmJhYnlsb25qcy5jb20vaG93X3RvL29wdGltaXppbmdfeW91cl9zY2VuZSNjaGFuZ2luZy1tZXNoLWN1bGxpbmctc3RyYXRlZ3lcbiAqL1xuZXhwb3J0IHZhciBTdHJhdGVneTtcblxuKGZ1bmN0aW9uIChTdHJhdGVneSkge1xuICBTdHJhdGVneVtTdHJhdGVneVtcIlN0YW5kYXJkXCJdID0gMF0gPSBcIlN0YW5kYXJkXCI7XG59KShTdHJhdGVneSB8fCAoU3RyYXRlZ3kgPSB7fSkpO1xuXG5leHBvcnQgdmFyIEN1bGxhYmxlQ29tcG9uZW50ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0cyhDdWxsYWJsZUNvbXBvbmVudCwgX0NvbXBvbmVudCk7XG5cbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlcihDdWxsYWJsZUNvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gQ3VsbGFibGVDb21wb25lbnQoZGF0YSkge1xuICAgIHZhciBfdGhpcztcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBDdWxsYWJsZUNvbXBvbmVudCk7XG5cbiAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIGRhdGEpO1xuICAgIF90aGlzLnN0cmF0ZWd5ID0gU3RyYXRlZ3kuU3RhbmRhcmQ7XG4gICAgX3RoaXMudmlzaWJpbGl0eVBsYW5lTWFzayA9IDA7XG4gICAgX3RoaXMudmlzaWJsZSA9IGZhbHNlO1xuICAgIE9iamVjdC5hc3NpZ24oX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIGRhdGEpO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIHJldHVybiBDdWxsYWJsZUNvbXBvbmVudDtcbn0oQ29tcG9uZW50KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUN1bGxhYmxlQ29tcG9uZW50LmpzLm1hcCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///125\n')},function(module,__webpack_exports__,__webpack_require__){"use strict";eval('/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return MeshComponent; });\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6);\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(22);\n/* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(23);\n/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(24);\n/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(18);\n/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _ComponentManager__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(25);\n/* harmony import */ var _shape_AABB__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(79);\n\n\n\n\n\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4___default()(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4___default()(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_3___default()(this, result); }; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\n\n\nvar MeshComponent = /*#__PURE__*/function (_Component) {\n _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_2___default()(MeshComponent, _Component);\n\n var _super = _createSuper(MeshComponent);\n\n /**\n * aabb 应该存在 Mesh 而非 Geometry 中,原因包括:\n * 1. 包围盒会受 transform 影响。例如每次 transform 之后应该重新计算包围盒(center 发生偏移)。\n * 2. 多个 Mesh 可以共享一个 Geometry,但可以各自拥有不同的 aabb\n */\n\n /**\n * transform 之后需要重新计算包围盒\n */\n\n /**\n * 实际渲染 Model\n */\n function MeshComponent(data) {\n var _this;\n\n _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, MeshComponent);\n\n _this = _super.call(this, data);\n _this.material = void 0;\n _this.geometry = void 0;\n _this.aabb = new _shape_AABB__WEBPACK_IMPORTED_MODULE_6__[/* AABB */ "a"]();\n _this.aabbDirty = true;\n _this.model = void 0;\n _this.visible = true;\n _this.children = [];\n Object.assign(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_1___default()(_this), data);\n return _this;\n }\n\n return MeshComponent;\n}(_ComponentManager__WEBPACK_IMPORTED_MODULE_5__[/* Component */ "a"]);\n//# sourceMappingURL=MeshComponent.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy13ZWJncHUtY29yZS9lcy9jb21wb25lbnRzL21lc2gvTWVzaENvbXBvbmVudC5qcz9lODFmIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQW9FO0FBQ2M7QUFDMUI7QUFDa0M7QUFDdEI7O0FBRXBFLGdDQUFnQyw2REFBNkQseUNBQXlDLGFBQWEsNEVBQWUsa0JBQWtCLGlDQUFpQyxpQkFBaUIsNEVBQWUsbUJBQW1CLHlEQUF5RCxFQUFFLE9BQU8sdUNBQXVDLEVBQUUsUUFBUSx1RkFBMEIsZUFBZSxHQUFHOztBQUV2YSxzQ0FBc0Msd0VBQXdFLDBDQUEwQyw4Q0FBOEMsTUFBTSx3RUFBd0UsR0FBRyxhQUFhLEVBQUUsWUFBWSxjQUFjLEVBQUU7O0FBRS9RO0FBQ1g7QUFDakM7QUFDUCxFQUFFLHNFQUFTOztBQUVYOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsSUFBSSw0RUFBZTs7QUFFbkI7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLHdEQUFJO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLG1GQUFzQjtBQUN4QztBQUNBOztBQUVBO0FBQ0EsQ0FBQyxDQUFDLG1FQUFTO0FBQ1giLCJmaWxlIjoiMTI2LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXNzZXJ0VGhpc0luaXRpYWxpemVkXCI7XG5pbXBvcnQgX2luaGVyaXRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2luaGVyaXRzXCI7XG5pbXBvcnQgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4gZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVyblwiO1xuaW1wb3J0IF9nZXRQcm90b3R5cGVPZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9nZXRQcm90b3R5cGVPZlwiO1xuXG5mdW5jdGlvbiBfY3JlYXRlU3VwZXIoRGVyaXZlZCkgeyB2YXIgaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCA9IF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKTsgcmV0dXJuIGZ1bmN0aW9uIF9jcmVhdGVTdXBlckludGVybmFsKCkgeyB2YXIgU3VwZXIgPSBfZ2V0UHJvdG90eXBlT2YoRGVyaXZlZCksIHJlc3VsdDsgaWYgKGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QpIHsgdmFyIE5ld1RhcmdldCA9IF9nZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3RvcjsgcmVzdWx0ID0gUmVmbGVjdC5jb25zdHJ1Y3QoU3VwZXIsIGFyZ3VtZW50cywgTmV3VGFyZ2V0KTsgfSBlbHNlIHsgcmVzdWx0ID0gU3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfSByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgcmVzdWx0KTsgfTsgfVxuXG5mdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkgeyBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwidW5kZWZpbmVkXCIgfHwgIVJlZmxlY3QuY29uc3RydWN0KSByZXR1cm4gZmFsc2U7IGlmIChSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKSByZXR1cm4gZmFsc2U7IGlmICh0eXBlb2YgUHJveHkgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHRydWU7IHRyeSB7IERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoRGF0ZSwgW10sIGZ1bmN0aW9uICgpIHt9KSk7IHJldHVybiB0cnVlOyB9IGNhdGNoIChlKSB7IHJldHVybiBmYWxzZTsgfSB9XG5cbmltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gJy4uLy4uL0NvbXBvbmVudE1hbmFnZXInO1xuaW1wb3J0IHsgQUFCQiB9IGZyb20gJy4uLy4uL3NoYXBlL0FBQkInO1xuZXhwb3J0IHZhciBNZXNoQ29tcG9uZW50ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0cyhNZXNoQ29tcG9uZW50LCBfQ29tcG9uZW50KTtcblxuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKE1lc2hDb21wb25lbnQpO1xuXG4gIC8qKlxuICAgKiBhYWJiIOW6lOivpeWtmOWcqCBNZXNoIOiAjOmdniBHZW9tZXRyeSDkuK3vvIzljp/lm6DljIXmi6zvvJpcbiAgICogMS4g5YyF5Zu055uS5Lya5Y+XIHRyYW5zZm9ybSDlvbHlk43jgILkvovlpoLmr4/mrKEgdHJhbnNmb3JtIOS5i+WQjuW6lOivpemHjeaWsOiuoeeul+WMheWbtOebku+8iGNlbnRlciDlj5HnlJ/lgY/np7vvvInjgIJcbiAgICogMi4g5aSa5LiqIE1lc2gg5Y+v5Lul5YWx5Lqr5LiA5LiqIEdlb21ldHJ577yM5L2G5Y+v5Lul5ZCE6Ieq5oul5pyJ5LiN5ZCM55qEIGFhYmJcbiAgICovXG5cbiAgLyoqXG4gICAqIHRyYW5zZm9ybSDkuYvlkI7pnIDopoHph43mlrDorqHnrpfljIXlm7Tnm5JcbiAgICovXG5cbiAgLyoqXG4gICAqIOWunumZhea4suafkyBNb2RlbFxuICAgKi9cbiAgZnVuY3Rpb24gTWVzaENvbXBvbmVudChkYXRhKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIE1lc2hDb21wb25lbnQpO1xuXG4gICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBkYXRhKTtcbiAgICBfdGhpcy5tYXRlcmlhbCA9IHZvaWQgMDtcbiAgICBfdGhpcy5nZW9tZXRyeSA9IHZvaWQgMDtcbiAgICBfdGhpcy5hYWJiID0gbmV3IEFBQkIoKTtcbiAgICBfdGhpcy5hYWJiRGlydHkgPSB0cnVlO1xuICAgIF90aGlzLm1vZGVsID0gdm9pZCAwO1xuICAgIF90aGlzLnZpc2libGUgPSB0cnVlO1xuICAgIF90aGlzLmNoaWxkcmVuID0gW107XG4gICAgT2JqZWN0LmFzc2lnbihfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgZGF0YSk7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgcmV0dXJuIE1lc2hDb21wb25lbnQ7XG59KENvbXBvbmVudCk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1NZXNoQ29tcG9uZW50LmpzLm1hcCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///126\n')},function(module,__webpack_exports__,__webpack_require__){"use strict";eval('/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return MeshSystem; });\n/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(9);\n/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(15);\n/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _babel_runtime_helpers_initializerDefineProperty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(10);\n/* harmony import */ var _babel_runtime_helpers_initializerDefineProperty__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_initializerDefineProperty__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(6);\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(7);\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _babel_runtime_helpers_applyDecoratedDescriptor__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(11);\n/* harmony import */ var _babel_runtime_helpers_applyDecoratedDescriptor__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_applyDecoratedDescriptor__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _babel_runtime_helpers_initializerWarningHelper__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(29);\n/* harmony import */ var _babel_runtime_helpers_initializerWarningHelper__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_initializerWarningHelper__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var gl_matrix__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(2);\n/* harmony import */ var inversify__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(5);\n/* harmony import */ var inversify__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(inversify__WEBPACK_IMPORTED_MODULE_8__);\n/* harmony import */ var _identifier__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(13);\n/* harmony import */ var _shape_Frustum__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(58);\n/* harmony import */ var _utils_math__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(143);\n\n\n\n\n\n\n\n\nvar _dec, _dec2, _dec3, _dec4, _dec5, _dec6, _class, _class2, _descriptor, _descriptor2, _descriptor3, _descriptor4, _descriptor5, _temp;\n\nfunction _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\n\n\n\n\n\nvar MeshSystem = (_dec = Object(inversify__WEBPACK_IMPORTED_MODULE_8__["injectable"])(), _dec2 = Object(inversify__WEBPACK_IMPORTED_MODULE_8__["inject"])(_identifier__WEBPACK_IMPORTED_MODULE_9__[/* IDENTIFIER */ "a"].MeshComponentManager), _dec3 = Object(inversify__WEBPACK_IMPORTED_MODULE_8__["inject"])(_identifier__WEBPACK_IMPORTED_MODULE_9__[/* IDENTIFIER */ "a"].CullableComponentManager), _dec4 = Object(inversify__WEBPACK_IMPORTED_MODULE_8__["inject"])(_identifier__WEBPACK_IMPORTED_MODULE_9__[/* IDENTIFIER */ "a"].GeometryComponentManager), _dec5 = Object(inversify__WEBPACK_IMPORTED_MODULE_8__["inject"])(_identifier__WEBPACK_IMPORTED_MODULE_9__[/* IDENTIFIER */ "a"].HierarchyComponentManager), _dec6 = Object(inversify__WEBPACK_IMPORTED_MODULE_8__["inject"])(_identifier__WEBPACK_IMPORTED_MODULE_9__[/* IDENTIFIER */ "a"].TransformComponentManager), _dec(_class = (_class2 = (_temp = /*#__PURE__*/function () {\n function MeshSystem() {\n _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3___default()(this, MeshSystem);\n\n _babel_runtime_helpers_initializerDefineProperty__WEBPACK_IMPORTED_MODULE_2___default()(this, "mesh", _descriptor, this);\n\n _babel_runtime_helpers_initializerDefineProperty__WEBPACK_IMPORTED_MODULE_2___default()(this, "cullable", _descriptor2, this);\n\n _babel_runtime_helpers_initializerDefineProperty__WEBPACK_IMPORTED_MODULE_2___default()(this, "geometry", _descriptor3, this);\n\n _babel_runtime_helpers_initializerDefineProperty__WEBPACK_IMPORTED_MODULE_2___default()(this, "hierarchy", _descriptor4, this);\n\n _babel_runtime_helpers_initializerDefineProperty__WEBPACK_IMPORTED_MODULE_2___default()(this, "transform", _descriptor5, this);\n\n this.planes = void 0;\n }\n\n _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4___default()(MeshSystem, [{\n key: "setFrustumPlanes",\n value: function setFrustumPlanes(planes) {\n this.planes = planes;\n }\n }, {\n key: "execute",\n value: function () {\n var _execute = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee(views) {\n var _iterator, _step, view, scene, camera, _iterator2, _step2, entity, component, hierarchyComponent, cullableComponent, geometryComponent, meshTransform, worldTransform, _geometryComponent$aa, center, halfExtents, transformedCenter, rotationScale, transformedHalfExtents, parentCullableComponent;\n\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n _iterator = _createForOfIteratorHelper(views);\n\n try {\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n view = _step.value;\n scene = view.getScene();\n camera = view.getCamera(); // get VP matrix from camera\n\n _iterator2 = _createForOfIteratorHelper(scene.getEntities());\n\n try {\n for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {\n entity = _step2.value;\n component = this.mesh.getComponentByEntity(entity);\n\n if (component) {\n hierarchyComponent = this.hierarchy.getComponentByEntity(entity);\n cullableComponent = this.cullable.getComponentByEntity(entity);\n geometryComponent = component.geometry;\n meshTransform = this.transform.getComponentByEntity(entity); // update mesh.aabb\n\n if (geometryComponent && geometryComponent.aabb && meshTransform && component.aabbDirty) {\n worldTransform = meshTransform.worldTransform; // apply transform to geometry.aabb\n\n _geometryComponent$aa = geometryComponent.aabb, center = _geometryComponent$aa.center, halfExtents = _geometryComponent$aa.halfExtents;\n transformedCenter = gl_matrix__WEBPACK_IMPORTED_MODULE_7__[/* vec3 */ "e"].transformMat4(gl_matrix__WEBPACK_IMPORTED_MODULE_7__[/* vec3 */ "e"].create(), center, worldTransform);\n rotationScale = Object(_utils_math__WEBPACK_IMPORTED_MODULE_11__[/* getRotationScale */ "b"])(worldTransform, gl_matrix__WEBPACK_IMPORTED_MODULE_7__[/* mat3 */ "a"].create());\n transformedHalfExtents = gl_matrix__WEBPACK_IMPORTED_MODULE_7__[/* vec3 */ "e"].transformMat3(gl_matrix__WEBPACK_IMPORTED_MODULE_7__[/* vec3 */ "e"].create(), halfExtents, rotationScale);\n component.aabb.update(transformedCenter, transformedHalfExtents);\n component.aabbDirty = false;\n } // culling\n\n\n if (cullableComponent && geometryComponent) {\n parentCullableComponent = this.cullable.getComponentByEntity((hierarchyComponent === null || hierarchyComponent === void 0 ? void 0 : hierarchyComponent.parentID) || -1);\n cullableComponent.visibilityPlaneMask = this.computeVisibilityWithPlaneMask(component.aabb, (parentCullableComponent === null || parentCullableComponent === void 0 ? void 0 : parentCullableComponent.visibilityPlaneMask) || _shape_Frustum__WEBPACK_IMPORTED_MODULE_10__[/* Mask */ "b"].INDETERMINATE, this.planes || camera.getFrustum().planes);\n cullableComponent.visible = cullableComponent.visibilityPlaneMask !== _shape_Frustum__WEBPACK_IMPORTED_MODULE_10__[/* Mask */ "b"].OUTSIDE;\n }\n }\n }\n } catch (err) {\n _iterator2.e(err);\n } finally {\n _iterator2.f();\n }\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n\n case 2:\n case "end":\n return _context.stop();\n }\n }\n }, _callee, this);\n }));\n\n function execute(_x) {\n return _execute.apply(this, arguments);\n }\n\n return execute;\n }()\n }, {\n key: "tearDown",\n value: function tearDown() {\n this.cullable.clear();\n this.mesh.clear();\n }\n /**\n *\n * @see「Optimized View Frustum Culling Algorithms for Bounding Boxes」\n * @see https://github.com/antvis/GWebGPUEngine/issues/3\n *\n * * 基础相交测试 the basic intersection test\n * * 标记 masking @see https://cesium.com/blog/2015/08/04/fast-hierarchical-culling/\n * * TODO: 平面一致性测试 the plane-coherency test\n * * TODO: 支持 mesh 指定自身的剔除策略,参考 Babylon.js @see https://doc.babylonjs.com/how_to/optimizing_your_scene#changing-mesh-culling-strategy\n *\n * @param aabb aabb\n * @param parentPlaneMask mask of parent\n * @param planes planes of frustum\n */\n\n }, {\n key: "computeVisibilityWithPlaneMask",\n value: function computeVisibilityWithPlaneMask(aabb, parentPlaneMask, planes) {\n if (parentPlaneMask === _shape_Frustum__WEBPACK_IMPORTED_MODULE_10__[/* Mask */ "b"].OUTSIDE || parentPlaneMask === _shape_Frustum__WEBPACK_IMPORTED_MODULE_10__[/* Mask */ "b"].INSIDE) {\n // 父节点完全位于视锥内或者外部,直接返回\n return parentPlaneMask;\n } // Start with MASK_INSIDE (all zeros) so that after the loop, the return value can be compared with MASK_INSIDE.\n // (Because if there are fewer than 31 planes, the upper bits wont be changed.)\n\n\n var mask = _shape_Frustum__WEBPACK_IMPORTED_MODULE_10__[/* Mask */ "b"].INSIDE;\n\n for (var k = 0, len = planes.length; k < len; ++k) {\n // For k greater than 31 (since 31 is the maximum number of INSIDE/INTERSECTING bits we can store), skip the optimization.\n var flag = k < 31 ? 1 << k : 0;\n\n if (k < 31 && (parentPlaneMask & flag) === 0) {\n // 父节点处于当前面内部,可以跳过\n continue;\n } // 使用 p-vertex 和 n-vertex 加速,避免进行平面和 aabb 全部顶点的相交检测\n\n\n var _planes$k = planes[k],\n normal = _planes$k.normal,\n distance = _planes$k.distance;\n\n if (gl_matrix__WEBPACK_IMPORTED_MODULE_7__[/* vec3 */ "e"].dot(normal, aabb.getNegativeFarPoint(planes[k])) + distance > 0) {\n return _shape_Frustum__WEBPACK_IMPORTED_MODULE_10__[/* Mask */ "b"].OUTSIDE;\n }\n\n if (gl_matrix__WEBPACK_IMPORTED_MODULE_7__[/* vec3 */ "e"].dot(normal, aabb.getPositiveFarPoint(planes[k])) + distance > 0) {\n // 和当前面相交,对应位置为1,继续检测下一个面\n mask |= flag;\n }\n }\n\n return mask;\n }\n }]);\n\n return MeshSystem;\n}(), _temp), (_descriptor = _babel_runtime_helpers_applyDecoratedDescriptor__WEBPACK_IMPORTED_MODULE_5___default()(_class2.prototype, "mesh", [_dec2], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n}), _descriptor2 = _babel_runtime_helpers_applyDecoratedDescriptor__WEBPACK_IMPORTED_MODULE_5___default()(_class2.prototype, "cullable", [_dec3], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n}), _descriptor3 = _babel_runtime_helpers_applyDecoratedDescriptor__WEBPACK_IMPORTED_MODULE_5___default()(_class2.prototype, "geometry", [_dec4], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n}), _descriptor4 = _babel_runtime_helpers_applyDecoratedDescriptor__WEBPACK_IMPORTED_MODULE_5___default()(_class2.prototype, "hierarchy", [_dec5], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n}), _descriptor5 = _babel_runtime_helpers_applyDecoratedDescriptor__WEBPACK_IMPORTED_MODULE_5___default()(_class2.prototype, "transform", [_dec6], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n})), _class2)) || _class);\n//# sourceMappingURL=System.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy13ZWJncHUtY29yZS9lcy9jb21wb25lbnRzL21lc2gvU3lzdGVtLmpzPzkxZjkiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQTZEO0FBQ1c7QUFDa0I7QUFDdEI7QUFDTjtBQUMwQjtBQUNBOztBQUV4Rjs7QUFFQSx3REFBd0QsUUFBUSxtRUFBbUUsd0hBQXdILGdCQUFnQixXQUFXLHlCQUF5QixTQUFTLHdCQUF3Qiw0QkFBNEIsY0FBYyxTQUFTLDhCQUE4QixFQUFFLHFCQUFxQixVQUFVLEVBQUUsU0FBUyxFQUFFLDhKQUE4SixFQUFFLGtEQUFrRCxTQUFTLGtCQUFrQiwyQkFBMkIsRUFBRSxtQkFBbUIsc0JBQXNCLDhCQUE4QixhQUFhLEVBQUUsc0JBQXNCLGVBQWUsV0FBVyxFQUFFLG1CQUFtQixNQUFNLHlEQUF5RCxFQUFFLFVBQVUsdUJBQXVCLEVBQUUsRUFBRSxHQUFHOztBQUU3OUIsaURBQWlELGdCQUFnQixnRUFBZ0Usd0RBQXdELDZEQUE2RCxzREFBc0Qsa0hBQWtIOztBQUU5WixzQ0FBc0MsdURBQXVELHVDQUF1QyxTQUFTLE9BQU8sa0JBQWtCLEVBQUUsYUFBYTs7QUFFOUk7QUFDUTtBQUNEO0FBQ0g7QUFDUztBQUM3Qyx5QkFBeUIsNERBQVUsWUFBWSx3REFBTSxDQUFDLDhEQUFVLGdDQUFnQyx3REFBTSxDQUFDLDhEQUFVLG9DQUFvQyx3REFBTSxDQUFDLDhEQUFVLG9DQUFvQyx3REFBTSxDQUFDLDhEQUFVLHFDQUFxQyx3REFBTSxDQUFDLDhEQUFVO0FBQ3hSO0FBQ0EsSUFBSSw0RUFBZTs7QUFFbkIsSUFBSSx1RkFBMEI7O0FBRTlCLElBQUksdUZBQTBCOztBQUU5QixJQUFJLHVGQUEwQjs7QUFFOUIsSUFBSSx1RkFBMEI7O0FBRTlCLElBQUksdUZBQTBCOztBQUU5QjtBQUNBOztBQUVBLEVBQUUseUVBQVk7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EscUJBQXFCLDhFQUFpQixlQUFlLGlFQUFtQjtBQUN4RTs7QUFFQSxlQUFlLGlFQUFtQjtBQUNsQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHFDQUFxQywrQkFBK0I7QUFDcEU7QUFDQTtBQUNBLDhDQUE4Qzs7QUFFOUM7O0FBRUE7QUFDQSwwQ0FBMEMsaUNBQWlDO0FBQzNFO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzRkFBc0Y7O0FBRXRGO0FBQ0EsMEVBQTBFOztBQUUxRTtBQUNBLGdEQUFnRCxzREFBSSxlQUFlLHNEQUFJO0FBQ3ZFLDRDQUE0Qyw2RUFBZ0IsaUJBQWlCLHNEQUFJO0FBQ2pGLHFEQUFxRCxzREFBSSxlQUFlLHNEQUFJO0FBQzVFO0FBQ0E7QUFDQSwyQkFBMkI7OztBQUczQjtBQUNBO0FBQ0EsMlBBQTJQLDREQUFJO0FBQy9QLGtHQUFrRyw0REFBSTtBQUN0RztBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPOztBQUVQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsR0FBRztBQUNIO0FBQ0E7QUFDQSw4QkFBOEIsNERBQUksZ0NBQWdDLDREQUFJO0FBQ3RFO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7OztBQUdBLGlCQUFpQiw0REFBSTs7QUFFckIsMENBQTBDLFNBQVM7QUFDbkQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOzs7QUFHVDtBQUNBO0FBQ0E7O0FBRUEsWUFBWSxzREFBSTtBQUNoQixpQkFBaUIsNERBQUk7QUFDckI7O0FBRUEsWUFBWSxzREFBSTtBQUNoQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBLENBQUMsMkJBQTJCLHNGQUF5QjtBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsa0JBQWtCLHNGQUF5QjtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsa0JBQWtCLHNGQUF5QjtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsa0JBQWtCLHNGQUF5QjtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsa0JBQWtCLHNGQUF5QjtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRCIsImZpbGUiOiIxMjcuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgX3JlZ2VuZXJhdG9yUnVudGltZSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvcmVnZW5lcmF0b3JcIjtcbmltcG9ydCBfYXN5bmNUb0dlbmVyYXRvciBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hc3luY1RvR2VuZXJhdG9yXCI7XG5pbXBvcnQgX2luaXRpYWxpemVyRGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW5pdGlhbGl6ZXJEZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzc1wiO1xuaW1wb3J0IF9hcHBseURlY29yYXRlZERlc2NyaXB0b3IgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXBwbHlEZWNvcmF0ZWREZXNjcmlwdG9yXCI7XG5pbXBvcnQgX2luaXRpYWxpemVyV2FybmluZ0hlbHBlciBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbml0aWFsaXplcldhcm5pbmdIZWxwZXJcIjtcblxudmFyIF9kZWMsIF9kZWMyLCBfZGVjMywgX2RlYzQsIF9kZWM1LCBfZGVjNiwgX2NsYXNzLCBfY2xhc3MyLCBfZGVzY3JpcHRvciwgX2Rlc2NyaXB0b3IyLCBfZGVzY3JpcHRvcjMsIF9kZXNjcmlwdG9yNCwgX2Rlc2NyaXB0b3I1LCBfdGVtcDtcblxuZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIobywgYWxsb3dBcnJheUxpa2UpIHsgdmFyIGl0OyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJ1bmRlZmluZWRcIiB8fCBvW1N5bWJvbC5pdGVyYXRvcl0gPT0gbnVsbCkgeyBpZiAoQXJyYXkuaXNBcnJheShvKSB8fCAoaXQgPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobykpIHx8IGFsbG93QXJyYXlMaWtlICYmIG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSB7IGlmIChpdCkgbyA9IGl0OyB2YXIgaSA9IDA7IHZhciBGID0gZnVuY3Rpb24gRigpIHt9OyByZXR1cm4geyBzOiBGLCBuOiBmdW5jdGlvbiBuKCkgeyBpZiAoaSA+PSBvLmxlbmd0aCkgcmV0dXJuIHsgZG9uZTogdHJ1ZSB9OyByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IG9baSsrXSB9OyB9LCBlOiBmdW5jdGlvbiBlKF9lKSB7IHRocm93IF9lOyB9LCBmOiBGIH07IH0gdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9IHZhciBub3JtYWxDb21wbGV0aW9uID0gdHJ1ZSwgZGlkRXJyID0gZmFsc2UsIGVycjsgcmV0dXJuIHsgczogZnVuY3Rpb24gcygpIHsgaXQgPSBvW1N5bWJvbC5pdGVyYXRvcl0oKTsgfSwgbjogZnVuY3Rpb24gbigpIHsgdmFyIHN0ZXAgPSBpdC5uZXh0KCk7IG5vcm1hbENvbXBsZXRpb24gPSBzdGVwLmRvbmU7IHJldHVybiBzdGVwOyB9LCBlOiBmdW5jdGlvbiBlKF9lMikgeyBkaWRFcnIgPSB0cnVlOyBlcnIgPSBfZTI7IH0sIGY6IGZ1bmN0aW9uIGYoKSB7IHRyeSB7IGlmICghbm9ybWFsQ29tcGxldGlvbiAmJiBpdC5yZXR1cm4gIT0gbnVsbCkgaXQucmV0dXJuKCk7IH0gZmluYWxseSB7IGlmIChkaWRFcnIpIHRocm93IGVycjsgfSB9IH07IH1cblxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB9XG5cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfVxuXG5pbXBvcnQgeyBtYXQzLCB2ZWMzIH0gZnJvbSAnZ2wtbWF0cml4JztcbmltcG9ydCB7IGluamVjdCwgaW5qZWN0YWJsZSB9IGZyb20gJ2ludmVyc2lmeSc7XG5pbXBvcnQgeyBJREVOVElGSUVSIH0gZnJvbSAnLi4vLi4vaWRlbnRpZmllcic7XG5pbXBvcnQgeyBNYXNrIH0gZnJvbSAnLi4vLi4vc2hhcGUvRnJ1c3R1bSc7XG5pbXBvcnQgeyBnZXRSb3RhdGlvblNjYWxlIH0gZnJvbSAnLi4vLi4vdXRpbHMvbWF0aCc7XG5leHBvcnQgdmFyIE1lc2hTeXN0ZW0gPSAoX2RlYyA9IGluamVjdGFibGUoKSwgX2RlYzIgPSBpbmplY3QoSURFTlRJRklFUi5NZXNoQ29tcG9uZW50TWFuYWdlciksIF9kZWMzID0gaW5qZWN0KElERU5USUZJRVIuQ3VsbGFibGVDb21wb25lbnRNYW5hZ2VyKSwgX2RlYzQgPSBpbmplY3QoSURFTlRJRklFUi5HZW9tZXRyeUNvbXBvbmVudE1hbmFnZXIpLCBfZGVjNSA9IGluamVjdChJREVOVElGSUVSLkhpZXJhcmNoeUNvbXBvbmVudE1hbmFnZXIpLCBfZGVjNiA9IGluamVjdChJREVOVElGSUVSLlRyYW5zZm9ybUNvbXBvbmVudE1hbmFnZXIpLCBfZGVjKF9jbGFzcyA9IChfY2xhc3MyID0gKF90ZW1wID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gTWVzaFN5c3RlbSgpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgTWVzaFN5c3RlbSk7XG5cbiAgICBfaW5pdGlhbGl6ZXJEZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIm1lc2hcIiwgX2Rlc2NyaXB0b3IsIHRoaXMpO1xuXG4gICAgX2luaXRpYWxpemVyRGVmaW5lUHJvcGVydHkodGhpcywgXCJjdWxsYWJsZVwiLCBfZGVzY3JpcHRvcjIsIHRoaXMpO1xuXG4gICAgX2luaXRpYWxpemVyRGVmaW5lUHJvcGVydHkodGhpcywgXCJnZW9tZXRyeVwiLCBfZGVzY3JpcHRvcjMsIHRoaXMpO1xuXG4gICAgX2luaXRpYWxpemVyRGVmaW5lUHJvcGVydHkodGhpcywgXCJoaWVyYXJjaHlcIiwgX2Rlc2NyaXB0b3I0LCB0aGlzKTtcblxuICAgIF9pbml0aWFsaXplckRlZmluZVByb3BlcnR5KHRoaXMsIFwidHJhbnNmb3JtXCIsIF9kZXNjcmlwdG9yNSwgdGhpcyk7XG5cbiAgICB0aGlzLnBsYW5lcyA9IHZvaWQgMDtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhNZXNoU3lzdGVtLCBbe1xuICAgIGtleTogXCJzZXRGcnVzdHVtUGxhbmVzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldEZydXN0dW1QbGFuZXMocGxhbmVzKSB7XG4gICAgICB0aGlzLnBsYW5lcyA9IHBsYW5lcztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZXhlY3V0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX2V4ZWN1dGUgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUubWFyayhmdW5jdGlvbiBfY2FsbGVlKHZpZXdzKSB7XG4gICAgICAgIHZhciBfaXRlcmF0b3IsIF9zdGVwLCB2aWV3LCBzY2VuZSwgY2FtZXJhLCBfaXRlcmF0b3IyLCBfc3RlcDIsIGVudGl0eSwgY29tcG9uZW50LCBoaWVyYXJjaHlDb21wb25lbnQsIGN1bGxhYmxlQ29tcG9uZW50LCBnZW9tZXRyeUNvbXBvbmVudCwgbWVzaFRyYW5zZm9ybSwgd29ybGRUcmFuc2Zvcm0sIF9nZW9tZXRyeUNvbXBvbmVudCRhYSwgY2VudGVyLCBoYWxmRXh0ZW50cywgdHJhbnNmb3JtZWRDZW50ZXIsIHJvdGF0aW9uU2NhbGUsIHRyYW5zZm9ybWVkSGFsZkV4dGVudHMsIHBhcmVudEN1bGxhYmxlQ29tcG9uZW50O1xuXG4gICAgICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoZnVuY3Rpb24gX2NhbGxlZSQoX2NvbnRleHQpIHtcbiAgICAgICAgICB3aGlsZSAoMSkge1xuICAgICAgICAgICAgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkge1xuICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIodmlld3MpO1xuXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgIGZvciAoX2l0ZXJhdG9yLnMoKTsgIShfc3RlcCA9IF9pdGVyYXRvci5uKCkpLmRvbmU7KSB7XG4gICAgICAgICAgICAgICAgICAgIHZpZXcgPSBfc3RlcC52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgc2NlbmUgPSB2aWV3LmdldFNjZW5lKCk7XG4gICAgICAgICAgICAgICAgICAgIGNhbWVyYSA9IHZpZXcuZ2V0Q2FtZXJhKCk7IC8vIGdldCBWUCBtYXRyaXggZnJvbSBjYW1lcmFcblxuICAgICAgICAgICAgICAgICAgICBfaXRlcmF0b3IyID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoc2NlbmUuZ2V0RW50aXRpZXMoKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICBmb3IgKF9pdGVyYXRvcjIucygpOyAhKF9zdGVwMiA9IF9pdGVyYXRvcjIubigpKS5kb25lOykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW50aXR5ID0gX3N0ZXAyLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50ID0gdGhpcy5tZXNoLmdldENvbXBvbmVudEJ5RW50aXR5KGVudGl0eSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaGllcmFyY2h5Q29tcG9uZW50ID0gdGhpcy5oaWVyYXJjaHkuZ2V0Q29tcG9uZW50QnlFbnRpdHkoZW50aXR5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY3VsbGFibGVDb21wb25lbnQgPSB0aGlzLmN1bGxhYmxlLmdldENvbXBvbmVudEJ5RW50aXR5KGVudGl0eSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGdlb21ldHJ5Q29tcG9uZW50ID0gY29tcG9uZW50Lmdlb21ldHJ5O1xuICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNoVHJhbnNmb3JtID0gdGhpcy50cmFuc2Zvcm0uZ2V0Q29tcG9uZW50QnlFbnRpdHkoZW50aXR5KTsgLy8gdXBkYXRlIG1lc2guYWFiYlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnZW9tZXRyeUNvbXBvbmVudCAmJiBnZW9tZXRyeUNvbXBvbmVudC5hYWJiICYmIG1lc2hUcmFuc2Zvcm0gJiYgY29tcG9uZW50LmFhYmJEaXJ0eSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkVHJhbnNmb3JtID0gbWVzaFRyYW5zZm9ybS53b3JsZFRyYW5zZm9ybTsgLy8gYXBwbHkgdHJhbnNmb3JtIHRvIGdlb21ldHJ5LmFhYmJcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9nZW9tZXRyeUNvbXBvbmVudCRhYSA9IGdlb21ldHJ5Q29tcG9uZW50LmFhYmIsIGNlbnRlciA9IF9nZW9tZXRyeUNvbXBvbmVudCRhYS5jZW50ZXIsIGhhbGZFeHRlbnRzID0gX2dlb21ldHJ5Q29tcG9uZW50JGFhLmhhbGZFeHRlbnRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybWVkQ2VudGVyID0gdmVjMy50cmFuc2Zvcm1NYXQ0KHZlYzMuY3JlYXRlKCksIGNlbnRlciwgd29ybGRUcmFuc2Zvcm0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdGF0aW9uU2NhbGUgPSBnZXRSb3RhdGlvblNjYWxlKHdvcmxkVHJhbnNmb3JtLCBtYXQzLmNyZWF0ZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm1lZEhhbGZFeHRlbnRzID0gdmVjMy50cmFuc2Zvcm1NYXQzKHZlYzMuY3JlYXRlKCksIGhhbGZFeHRlbnRzLCByb3RhdGlvblNjYWxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuYWFiYi51cGRhdGUodHJhbnNmb3JtZWRDZW50ZXIsIHRyYW5zZm9ybWVkSGFsZkV4dGVudHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5hYWJiRGlydHkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSAvLyBjdWxsaW5nXG5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VsbGFibGVDb21wb25lbnQgJiYgZ2VvbWV0cnlDb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRDdWxsYWJsZUNvbXBvbmVudCA9IHRoaXMuY3VsbGFibGUuZ2V0Q29tcG9uZW50QnlFbnRpdHkoKGhpZXJhcmNoeUNvbXBvbmVudCA9PT0gbnVsbCB8fCBoaWVyYXJjaHlDb21wb25lbnQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGhpZXJhcmNoeUNvbXBvbmVudC5wYXJlbnRJRCkgfHwgLTEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1bGxhYmxlQ29tcG9uZW50LnZpc2liaWxpdHlQbGFuZU1hc2sgPSB0aGlzLmNvbXB1dGVWaXNpYmlsaXR5V2l0aFBsYW5lTWFzayhjb21wb25lbnQuYWFiYiwgKHBhcmVudEN1bGxhYmxlQ29tcG9uZW50ID09PSBudWxsIHx8IHBhcmVudEN1bGxhYmxlQ29tcG9uZW50ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwYXJlbnRDdWxsYWJsZUNvbXBvbmVudC52aXNpYmlsaXR5UGxhbmVNYXNrKSB8fCBNYXNrLklOREVURVJNSU5BVEUsIHRoaXMucGxhbmVzIHx8IGNhbWVyYS5nZXRGcnVzdHVtKCkucGxhbmVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdWxsYWJsZUNvbXBvbmVudC52aXNpYmxlID0gY3VsbGFibGVDb21wb25lbnQudmlzaWJpbGl0eVBsYW5lTWFzayAhPT0gTWFzay5PVVRTSURFO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICBfaXRlcmF0b3IyLmUoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgICBfaXRlcmF0b3IyLmYoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgX2l0ZXJhdG9yLmUoZXJyKTtcbiAgICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgX2l0ZXJhdG9yLmYoKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LnN0b3AoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sIF9jYWxsZWUsIHRoaXMpO1xuICAgICAgfSkpO1xuXG4gICAgICBmdW5jdGlvbiBleGVjdXRlKF94KSB7XG4gICAgICAgIHJldHVybiBfZXhlY3V0ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZXhlY3V0ZTtcbiAgICB9KClcbiAgfSwge1xuICAgIGtleTogXCJ0ZWFyRG93blwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB0ZWFyRG93bigpIHtcbiAgICAgIHRoaXMuY3VsbGFibGUuY2xlYXIoKTtcbiAgICAgIHRoaXMubWVzaC5jbGVhcigpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBzZWXjgIxPcHRpbWl6ZWQgVmlldyBGcnVzdHVtIEN1bGxpbmcgQWxnb3JpdGhtcyBmb3IgQm91bmRpbmcgQm94ZXPjgI1cbiAgICAgKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnR2aXMvR1dlYkdQVUVuZ2luZS9pc3N1ZXMvM1xuICAgICAqXG4gICAgICogKiDln7rnoYDnm7jkuqTmtYvor5UgdGhlIGJhc2ljIGludGVyc2VjdGlvbiB0ZXN0XG4gICAgICogKiDmoIforrAgbWFza2luZyBAc2VlIGh0dHBzOi8vY2VzaXVtLmNvbS9ibG9nLzIwMTUvMDgvMDQvZmFzdC1oaWVyYXJjaGljYWwtY3VsbGluZy9cbiAgICAgKiAqIFRPRE86IOW5s+mdouS4gOiHtOaAp+a1i+ivlSB0aGUgcGxhbmUtY29oZXJlbmN5IHRlc3RcbiAgICAgKiAqIFRPRE86IOaUr+aMgSBtZXNoIOaMh+WumuiHqui6q+eahOWJlOmZpOetlueVpe+8jOWPguiAgyBCYWJ5bG9uLmpzIEBzZWUgaHR0cHM6Ly9kb2MuYmFieWxvbmpzLmNvbS9ob3dfdG8vb3B0aW1pemluZ195b3VyX3NjZW5lI2NoYW5naW5nLW1lc2gtY3VsbGluZy1zdHJhdGVneVxuICAgICAqXG4gICAgICogQHBhcmFtIGFhYmIgYWFiYlxuICAgICAqIEBwYXJhbSBwYXJlbnRQbGFuZU1hc2sgbWFzayBvZiBwYXJlbnRcbiAgICAgKiBAcGFyYW0gcGxhbmVzIHBsYW5lcyBvZiBmcnVzdHVtXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJjb21wdXRlVmlzaWJpbGl0eVdpdGhQbGFuZU1hc2tcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcHV0ZVZpc2liaWxpdHlXaXRoUGxhbmVNYXNrKGFhYmIsIHBhcmVudFBsYW5lTWFzaywgcGxhbmVzKSB7XG4gICAgICBpZiAocGFyZW50UGxhbmVNYXNrID09PSBNYXNrLk9VVFNJREUgfHwgcGFyZW50UGxhbmVNYXNrID09PSBNYXNrLklOU0lERSkge1xuICAgICAgICAvLyDniLboioLngrnlrozlhajkvY3kuo7op4bplKXlhoXmiJbogIXlpJbpg6jvvIznm7TmjqXov5Tlm55cbiAgICAgICAgcmV0dXJuIHBhcmVudFBsYW5lTWFzaztcbiAgICAgIH0gLy8gU3RhcnQgd2l0aCBNQVNLX0lOU0lERSAoYWxsIHplcm9zKSBzbyB0aGF0IGFmdGVyIHRoZSBsb29wLCB0aGUgcmV0dXJuIHZhbHVlIGNhbiBiZSBjb21wYXJlZCB3aXRoIE1BU0tfSU5TSURFLlxuICAgICAgLy8gKEJlY2F1c2UgaWYgdGhlcmUgYXJlIGZld2VyIHRoYW4gMzEgcGxhbmVzLCB0aGUgdXBwZXIgYml0cyB3b250IGJlIGNoYW5nZWQuKVxuXG5cbiAgICAgIHZhciBtYXNrID0gTWFzay5JTlNJREU7XG5cbiAgICAgIGZvciAodmFyIGsgPSAwLCBsZW4gPSBwbGFuZXMubGVuZ3RoOyBrIDwgbGVuOyArK2spIHtcbiAgICAgICAgLy8gRm9yIGsgZ3JlYXRlciB0aGFuIDMxIChzaW5jZSAzMSBpcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgSU5TSURFL0lOVEVSU0VDVElORyBiaXRzIHdlIGNhbiBzdG9yZSksIHNraXAgdGhlIG9wdGltaXphdGlvbi5cbiAgICAgICAgdmFyIGZsYWcgPSBrIDwgMzEgPyAxIDw8IGsgOiAwO1xuXG4gICAgICAgIGlmIChrIDwgMzEgJiYgKHBhcmVudFBsYW5lTWFzayAmIGZsYWcpID09PSAwKSB7XG4gICAgICAgICAgLy8g54i26IqC54K55aSE5LqO5b2T5YmN6Z2i5YaF6YOo77yM5Y+v5Lul6Lez6L+HXG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gLy8g5L2/55SoIHAtdmVydGV4IOWSjCBuLXZlcnRleCDliqDpgJ/vvIzpgb/lhY3ov5vooYzlubPpnaLlkowgYWFiYiDlhajpg6jpobbngrnnmoTnm7jkuqTmo4DmtYtcblxuXG4gICAgICAgIHZhciBfcGxhbmVzJGsgPSBwbGFuZXNba10sXG4gICAgICAgICAgICBub3JtYWwgPSBfcGxhbmVzJGsubm9ybWFsLFxuICAgICAgICAgICAgZGlzdGFuY2UgPSBfcGxhbmVzJGsuZGlzdGFuY2U7XG5cbiAgICAgICAgaWYgKHZlYzMuZG90KG5vcm1hbCwgYWFiYi5nZXROZWdhdGl2ZUZhclBvaW50KHBsYW5lc1trXSkpICsgZGlzdGFuY2UgPiAwKSB7XG4gICAgICAgICAgcmV0dXJuIE1hc2suT1VUU0lERTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2ZWMzLmRvdChub3JtYWwsIGFhYmIuZ2V0UG9zaXRpdmVGYXJQb2ludChwbGFuZXNba10pKSArIGRpc3RhbmNlID4gMCkge1xuICAgICAgICAgIC8vIOWSjOW9k+WJjemdouebuOS6pO+8jOWvueW6lOS9jee9ruS4ujHvvIznu6fnu63mo4DmtYvkuIvkuIDkuKrpnaJcbiAgICAgICAgICBtYXNrIHw9IGZsYWc7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG1hc2s7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIE1lc2hTeXN0ZW07XG59KCksIF90ZW1wKSwgKF9kZXNjcmlwdG9yID0gX2FwcGx5RGVjb3JhdGVkRGVzY3JpcHRvcihfY2xhc3MyLnByb3RvdHlwZSwgXCJtZXNoXCIsIFtfZGVjMl0sIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICB3cml0YWJsZTogdHJ1ZSxcbiAgaW5pdGlhbGl6ZXI6IG51bGxcbn0pLCBfZGVzY3JpcHRvcjIgPSBfYXBwbHlEZWNvcmF0ZWREZXNjcmlwdG9yKF9jbGFzczIucHJvdG90eXBlLCBcImN1bGxhYmxlXCIsIFtfZGVjM10sIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICB3cml0YWJsZTogdHJ1ZSxcbiAgaW5pdGlhbGl6ZXI6IG51bGxcbn0pLCBfZGVzY3JpcHRvcjMgPSBfYXBwbHlEZWNvcmF0ZWREZXNjcmlwdG9yKF9jbGFzczIucHJvdG90eXBlLCBcImdlb21ldHJ5XCIsIFtfZGVjNF0sIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICB3cml0YWJsZTogdHJ1ZSxcbiAgaW5pdGlhbGl6ZXI6IG51bGxcbn0pLCBfZGVzY3JpcHRvcjQgPSBfYXBwbHlEZWNvcmF0ZWREZXNjcmlwdG9yKF9jbGFzczIucHJvdG90eXBlLCBcImhpZXJhcmNoeVwiLCBbX2RlYzVdLCB7XG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgd3JpdGFibGU6IHRydWUsXG4gIGluaXRpYWxpemVyOiBudWxsXG59KSwgX2Rlc2NyaXB0b3I1ID0gX2FwcGx5RGVjb3JhdGVkRGVzY3JpcHRvcihfY2xhc3MyLnByb3RvdHlwZSwgXCJ0cmFuc2Zvcm1cIiwgW19kZWM2XSwge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHdyaXRhYmxlOiB0cnVlLFxuICBpbml0aWFsaXplcjogbnVsbFxufSkpLCBfY2xhc3MyKSkgfHwgX2NsYXNzKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVN5c3RlbS5qcy5tYXAiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///127\n')},function(module,__webpack_exports__,__webpack_require__){"use strict";eval('/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Plane; });\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6);\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(7);\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var gl_matrix__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(2);\n\n\n\nvar Plane = /*#__PURE__*/function () {\n /**\n * lookup table for p-vertex & n-vertex when doing frustum culling\n */\n function Plane(distance, normal) {\n _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, Plane);\n\n this.distance = void 0;\n this.normal = void 0;\n this.pnVertexFlag = void 0;\n this.distance = distance || 0;\n this.normal = normal || gl_matrix__WEBPACK_IMPORTED_MODULE_2__[/* vec3 */ "e"].fromValues(0, 1, 0);\n this.updatePNVertexFlag();\n }\n\n _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(Plane, [{\n key: "updatePNVertexFlag",\n value: function updatePNVertexFlag() {\n this.pnVertexFlag = (Number(this.normal[0] >= 0) << 8) + (Number(this.normal[1] >= 0) << 4) + Number(this.normal[2] >= 0);\n }\n }, {\n key: "distanceToPoint",\n value: function distanceToPoint(point) {\n return gl_matrix__WEBPACK_IMPORTED_MODULE_2__[/* vec3 */ "e"].dot(point, this.normal) - this.distance;\n }\n }, {\n key: "normalize",\n value: function normalize() {\n var invLen = 1 / gl_matrix__WEBPACK_IMPORTED_MODULE_2__[/* vec3 */ "e"].len(this.normal);\n gl_matrix__WEBPACK_IMPORTED_MODULE_2__[/* vec3 */ "e"].scale(this.normal, this.normal, invLen);\n this.distance *= invLen;\n }\n }, {\n key: "intersectsLine",\n value: function intersectsLine(start, end, point) {\n var d0 = this.distanceToPoint(start);\n var d1 = this.distanceToPoint(end);\n var t = d0 / (d0 - d1);\n var intersects = t >= 0 && t <= 1;\n\n if (intersects && point) {\n gl_matrix__WEBPACK_IMPORTED_MODULE_2__[/* vec3 */ "e"].lerp(point, start, end, t);\n }\n\n return intersects;\n }\n }]);\n\n return Plane;\n}();\n//# sourceMappingURL=Plane.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy13ZWJncHUtY29yZS9lcy9zaGFwZS9QbGFuZS5qcz83MTc1Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFvRTtBQUNOO0FBQzdCO0FBQzFCO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLDRFQUFlOztBQUVuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixzREFBSTtBQUNoQztBQUNBOztBQUVBLEVBQUUseUVBQVk7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsYUFBYSxzREFBSTtBQUNqQjtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsdUJBQXVCLHNEQUFJO0FBQzNCLE1BQU0sc0RBQUk7QUFDVjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFFBQVEsc0RBQUk7QUFDWjs7QUFFQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBLENBQUM7QUFDRCIsImZpbGUiOiIxMjguanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrXCI7XG5pbXBvcnQgX2NyZWF0ZUNsYXNzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzXCI7XG5pbXBvcnQgeyB2ZWMzIH0gZnJvbSAnZ2wtbWF0cml4JztcbmV4cG9ydCB2YXIgUGxhbmUgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICAvKipcbiAgICogbG9va3VwIHRhYmxlIGZvciBwLXZlcnRleCAmIG4tdmVydGV4IHdoZW4gZG9pbmcgZnJ1c3R1bSBjdWxsaW5nXG4gICAqL1xuICBmdW5jdGlvbiBQbGFuZShkaXN0YW5jZSwgbm9ybWFsKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFBsYW5lKTtcblxuICAgIHRoaXMuZGlzdGFuY2UgPSB2b2lkIDA7XG4gICAgdGhpcy5ub3JtYWwgPSB2b2lkIDA7XG4gICAgdGhpcy5wblZlcnRleEZsYWcgPSB2b2lkIDA7XG4gICAgdGhpcy5kaXN0YW5jZSA9IGRpc3RhbmNlIHx8IDA7XG4gICAgdGhpcy5ub3JtYWwgPSBub3JtYWwgfHwgdmVjMy5mcm9tVmFsdWVzKDAsIDEsIDApO1xuICAgIHRoaXMudXBkYXRlUE5WZXJ0ZXhGbGFnKCk7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoUGxhbmUsIFt7XG4gICAga2V5OiBcInVwZGF0ZVBOVmVydGV4RmxhZ1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB1cGRhdGVQTlZlcnRleEZsYWcoKSB7XG4gICAgICB0aGlzLnBuVmVydGV4RmxhZyA9IChOdW1iZXIodGhpcy5ub3JtYWxbMF0gPj0gMCkgPDwgOCkgKyAoTnVtYmVyKHRoaXMubm9ybWFsWzFdID49IDApIDw8IDQpICsgTnVtYmVyKHRoaXMubm9ybWFsWzJdID49IDApO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJkaXN0YW5jZVRvUG9pbnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZGlzdGFuY2VUb1BvaW50KHBvaW50KSB7XG4gICAgICByZXR1cm4gdmVjMy5kb3QocG9pbnQsIHRoaXMubm9ybWFsKSAtIHRoaXMuZGlzdGFuY2U7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIm5vcm1hbGl6ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBub3JtYWxpemUoKSB7XG4gICAgICB2YXIgaW52TGVuID0gMSAvIHZlYzMubGVuKHRoaXMubm9ybWFsKTtcbiAgICAgIHZlYzMuc2NhbGUodGhpcy5ub3JtYWwsIHRoaXMubm9ybWFsLCBpbnZMZW4pO1xuICAgICAgdGhpcy5kaXN0YW5jZSAqPSBpbnZMZW47XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImludGVyc2VjdHNMaW5lXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGludGVyc2VjdHNMaW5lKHN0YXJ0LCBlbmQsIHBvaW50KSB7XG4gICAgICB2YXIgZDAgPSB0aGlzLmRpc3RhbmNlVG9Qb2ludChzdGFydCk7XG4gICAgICB2YXIgZDEgPSB0aGlzLmRpc3RhbmNlVG9Qb2ludChlbmQpO1xuICAgICAgdmFyIHQgPSBkMCAvIChkMCAtIGQxKTtcbiAgICAgIHZhciBpbnRlcnNlY3RzID0gdCA+PSAwICYmIHQgPD0gMTtcblxuICAgICAgaWYgKGludGVyc2VjdHMgJiYgcG9pbnQpIHtcbiAgICAgICAgdmVjMy5sZXJwKHBvaW50LCBzdGFydCwgZW5kLCB0KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGludGVyc2VjdHM7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFBsYW5lO1xufSgpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UGxhbmUuanMubWFwIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///128\n')},function(module,__webpack_exports__,__webpack_require__){"use strict";eval('/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return RendererSystem; });\n/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(9);\n/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(15);\n/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _babel_runtime_helpers_initializerDefineProperty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(10);\n/* harmony import */ var _babel_runtime_helpers_initializerDefineProperty__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_initializerDefineProperty__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(6);\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(7);\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _babel_runtime_helpers_applyDecoratedDescriptor__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(11);\n/* harmony import */ var _babel_runtime_helpers_applyDecoratedDescriptor__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_applyDecoratedDescriptor__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _babel_runtime_helpers_initializerWarningHelper__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(29);\n/* harmony import */ var _babel_runtime_helpers_initializerWarningHelper__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_initializerWarningHelper__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var inversify__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(5);\n/* harmony import */ var inversify__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(inversify__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var _identifier__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(13);\n/* harmony import */ var _passes_CopyPass__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(83);\n/* harmony import */ var _passes_PixelPickingPass__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(70);\n/* harmony import */ var _passes_RenderPass__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(51);\n\n\n\n\n\n\n\n\nvar _dec, _dec2, _dec3, _dec4, _dec5, _dec6, _class, _class2, _descriptor, _descriptor2, _descriptor3, _descriptor4, _temp;\n\n\n\n\n\n\nvar RendererSystem = (_dec = Object(inversify__WEBPACK_IMPORTED_MODULE_7__["injectable"])(), _dec2 = Object(inversify__WEBPACK_IMPORTED_MODULE_7__["inject"])(_identifier__WEBPACK_IMPORTED_MODULE_8__[/* IDENTIFIER */ "a"].Systems), _dec3 = Object(inversify__WEBPACK_IMPORTED_MODULE_7__["named"])(_identifier__WEBPACK_IMPORTED_MODULE_8__[/* IDENTIFIER */ "a"].FrameGraphSystem), _dec4 = Object(inversify__WEBPACK_IMPORTED_MODULE_7__["inject"])(_identifier__WEBPACK_IMPORTED_MODULE_8__[/* IDENTIFIER */ "a"].RenderPassFactory), _dec5 = Object(inversify__WEBPACK_IMPORTED_MODULE_7__["inject"])(_identifier__WEBPACK_IMPORTED_MODULE_8__[/* IDENTIFIER */ "a"].ConfigService), _dec6 = Object(inversify__WEBPACK_IMPORTED_MODULE_7__["inject"])(_identifier__WEBPACK_IMPORTED_MODULE_8__[/* IDENTIFIER */ "a"].ResourcePool), _dec(_class = (_class2 = (_temp = /*#__PURE__*/function () {\n function RendererSystem() {\n _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3___default()(this, RendererSystem);\n\n _babel_runtime_helpers_initializerDefineProperty__WEBPACK_IMPORTED_MODULE_2___default()(this, "frameGraphSystem", _descriptor, this);\n\n _babel_runtime_helpers_initializerDefineProperty__WEBPACK_IMPORTED_MODULE_2___default()(this, "renderPassFactory", _descriptor2, this);\n\n _babel_runtime_helpers_initializerDefineProperty__WEBPACK_IMPORTED_MODULE_2___default()(this, "configService", _descriptor3, this);\n\n _babel_runtime_helpers_initializerDefineProperty__WEBPACK_IMPORTED_MODULE_2___default()(this, "resourcePool", _descriptor4, this);\n }\n\n _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4___default()(RendererSystem, [{\n key: "execute",\n value: function () {\n var _execute = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee(views) {\n var _this$renderPassFacto, setupRenderPass, executeRenderPass, renderPass, _this$renderPassFacto2, setupCopyPass, executeCopyPass, tearDownCopyPass, copyPass;\n\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n // const pixelPickingPass = this.renderPassFactory(\n // PixelPickingPass.IDENTIFIER,\n // );\n // const {\n // setup: setupPixelPickingPass,\n // execute: executePixelPickingPass,\n // tearDown: tearDownPickingPass,\n // } = pixelPickingPass;\n // this.frameGraphSystem.addPass(\n // PixelPickingPass.IDENTIFIER,\n // setupPixelPickingPass,\n // executePixelPickingPass,\n // tearDownPickingPass,\n // );\n _this$renderPassFacto = this.renderPassFactory(_passes_RenderPass__WEBPACK_IMPORTED_MODULE_11__[/* RenderPass */ "a"].IDENTIFIER), setupRenderPass = _this$renderPassFacto.setup, executeRenderPass = _this$renderPassFacto.execute;\n renderPass = this.frameGraphSystem.addPass(_passes_RenderPass__WEBPACK_IMPORTED_MODULE_11__[/* RenderPass */ "a"].IDENTIFIER, setupRenderPass, executeRenderPass);\n _this$renderPassFacto2 = this.renderPassFactory(_passes_CopyPass__WEBPACK_IMPORTED_MODULE_9__[/* CopyPass */ "a"].IDENTIFIER), setupCopyPass = _this$renderPassFacto2.setup, executeCopyPass = _this$renderPassFacto2.execute, tearDownCopyPass = _this$renderPassFacto2.tearDown;\n copyPass = this.frameGraphSystem.addPass(_passes_CopyPass__WEBPACK_IMPORTED_MODULE_9__[/* CopyPass */ "a"].IDENTIFIER, setupCopyPass, executeCopyPass, tearDownCopyPass);\n this.frameGraphSystem.present(copyPass.data.output); // this.frameGraphSystem.present(renderPass.data.output);\n\n case 5:\n case "end":\n return _context.stop();\n }\n }\n }, _callee, this);\n }));\n\n function execute(_x) {\n return _execute.apply(this, arguments);\n }\n\n return execute;\n }()\n }, {\n key: "tearDown",\n value: function tearDown() {\n this.resourcePool.clean();\n }\n }, {\n key: "pick",\n value: function pick(position, view) {\n var pickingPass = this.renderPassFactory(_passes_PixelPickingPass__WEBPACK_IMPORTED_MODULE_10__[/* PixelPickingPass */ "a"].IDENTIFIER);\n return pickingPass.pick(position, view);\n }\n }]);\n\n return RendererSystem;\n}(), _temp), (_descriptor = _babel_runtime_helpers_applyDecoratedDescriptor__WEBPACK_IMPORTED_MODULE_5___default()(_class2.prototype, "frameGraphSystem", [_dec2, _dec3], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n}), _descriptor2 = _babel_runtime_helpers_applyDecoratedDescriptor__WEBPACK_IMPORTED_MODULE_5___default()(_class2.prototype, "renderPassFactory", [_dec4], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n}), _descriptor3 = _babel_runtime_helpers_applyDecoratedDescriptor__WEBPACK_IMPORTED_MODULE_5___default()(_class2.prototype, "configService", [_dec5], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n}), _descriptor4 = _babel_runtime_helpers_applyDecoratedDescriptor__WEBPACK_IMPORTED_MODULE_5___default()(_class2.prototype, "resourcePool", [_dec6], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n})), _class2)) || _class);\n//# sourceMappingURL=System.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy13ZWJncHUtY29yZS9lcy9jb21wb25lbnRzL3JlbmRlcmVyL1N5c3RlbS5qcz9iNzJiIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUE2RDtBQUNXO0FBQ2tCO0FBQ3RCO0FBQ047QUFDMEI7QUFDQTs7QUFFeEY7O0FBRXNEO0FBQ1I7QUFDRDtBQUNnQjtBQUNaO0FBQzFDLDZCQUE2Qiw0REFBVSxZQUFZLHdEQUFNLENBQUMsOERBQVUsbUJBQW1CLHVEQUFLLENBQUMsOERBQVUsNEJBQTRCLHdEQUFNLENBQUMsOERBQVUsNkJBQTZCLHdEQUFNLENBQUMsOERBQVUseUJBQXlCLHdEQUFNLENBQUMsOERBQVU7QUFDblA7QUFDQSxJQUFJLDRFQUFlOztBQUVuQixJQUFJLHVGQUEwQjs7QUFFOUIsSUFBSSx1RkFBMEI7O0FBRTlCLElBQUksdUZBQTBCOztBQUU5QixJQUFJLHVGQUEwQjtBQUM5Qjs7QUFFQSxFQUFFLHlFQUFZO0FBQ2Q7QUFDQTtBQUNBLHFCQUFxQiw4RUFBaUIsZUFBZSxpRUFBbUI7QUFDeEU7O0FBRUEsZUFBZSxpRUFBbUI7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0RBQStELHNFQUFVO0FBQ3pFLDJEQUEyRCxzRUFBVTtBQUNyRSxnRUFBZ0UsaUVBQVE7QUFDeEUseURBQXlELGlFQUFRO0FBQ2pFLG9FQUFvRTs7QUFFcEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPOztBQUVQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLCtDQUErQyxrRkFBZ0I7QUFDL0Q7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQSxDQUFDLDJCQUEyQixzRkFBeUI7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLGtCQUFrQixzRkFBeUI7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLGtCQUFrQixzRkFBeUI7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLGtCQUFrQixzRkFBeUI7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QiLCJmaWxlIjoiMTI5LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF9yZWdlbmVyYXRvclJ1bnRpbWUgZnJvbSBcIkBiYWJlbC9ydW50aW1lL3JlZ2VuZXJhdG9yXCI7XG5pbXBvcnQgX2FzeW5jVG9HZW5lcmF0b3IgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXN5bmNUb0dlbmVyYXRvclwiO1xuaW1wb3J0IF9pbml0aWFsaXplckRlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2luaXRpYWxpemVyRGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfY2xhc3NDYWxsQ2hlY2sgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2tcIjtcbmltcG9ydCBfY3JlYXRlQ2xhc3MgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlQ2xhc3NcIjtcbmltcG9ydCBfYXBwbHlEZWNvcmF0ZWREZXNjcmlwdG9yIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2FwcGx5RGVjb3JhdGVkRGVzY3JpcHRvclwiO1xuaW1wb3J0IF9pbml0aWFsaXplcldhcm5pbmdIZWxwZXIgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW5pdGlhbGl6ZXJXYXJuaW5nSGVscGVyXCI7XG5cbnZhciBfZGVjLCBfZGVjMiwgX2RlYzMsIF9kZWM0LCBfZGVjNSwgX2RlYzYsIF9jbGFzcywgX2NsYXNzMiwgX2Rlc2NyaXB0b3IsIF9kZXNjcmlwdG9yMiwgX2Rlc2NyaXB0b3IzLCBfZGVzY3JpcHRvcjQsIF90ZW1wO1xuXG5pbXBvcnQgeyBpbmplY3QsIGluamVjdGFibGUsIG5hbWVkIH0gZnJvbSAnaW52ZXJzaWZ5JztcbmltcG9ydCB7IElERU5USUZJRVIgfSBmcm9tICcuLi8uLi9pZGVudGlmaWVyJztcbmltcG9ydCB7IENvcHlQYXNzIH0gZnJvbSAnLi9wYXNzZXMvQ29weVBhc3MnO1xuaW1wb3J0IHsgUGl4ZWxQaWNraW5nUGFzcyB9IGZyb20gJy4vcGFzc2VzL1BpeGVsUGlja2luZ1Bhc3MnO1xuaW1wb3J0IHsgUmVuZGVyUGFzcyB9IGZyb20gJy4vcGFzc2VzL1JlbmRlclBhc3MnO1xuZXhwb3J0IHZhciBSZW5kZXJlclN5c3RlbSA9IChfZGVjID0gaW5qZWN0YWJsZSgpLCBfZGVjMiA9IGluamVjdChJREVOVElGSUVSLlN5c3RlbXMpLCBfZGVjMyA9IG5hbWVkKElERU5USUZJRVIuRnJhbWVHcmFwaFN5c3RlbSksIF9kZWM0ID0gaW5qZWN0KElERU5USUZJRVIuUmVuZGVyUGFzc0ZhY3RvcnkpLCBfZGVjNSA9IGluamVjdChJREVOVElGSUVSLkNvbmZpZ1NlcnZpY2UpLCBfZGVjNiA9IGluamVjdChJREVOVElGSUVSLlJlc291cmNlUG9vbCksIF9kZWMoX2NsYXNzID0gKF9jbGFzczIgPSAoX3RlbXAgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBSZW5kZXJlclN5c3RlbSgpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUmVuZGVyZXJTeXN0ZW0pO1xuXG4gICAgX2luaXRpYWxpemVyRGVmaW5lUHJvcGVydHkodGhpcywgXCJmcmFtZUdyYXBoU3lzdGVtXCIsIF9kZXNjcmlwdG9yLCB0aGlzKTtcblxuICAgIF9pbml0aWFsaXplckRlZmluZVByb3BlcnR5KHRoaXMsIFwicmVuZGVyUGFzc0ZhY3RvcnlcIiwgX2Rlc2NyaXB0b3IyLCB0aGlzKTtcblxuICAgIF9pbml0aWFsaXplckRlZmluZVByb3BlcnR5KHRoaXMsIFwiY29uZmlnU2VydmljZVwiLCBfZGVzY3JpcHRvcjMsIHRoaXMpO1xuXG4gICAgX2luaXRpYWxpemVyRGVmaW5lUHJvcGVydHkodGhpcywgXCJyZXNvdXJjZVBvb2xcIiwgX2Rlc2NyaXB0b3I0LCB0aGlzKTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhSZW5kZXJlclN5c3RlbSwgW3tcbiAgICBrZXk6IFwiZXhlY3V0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX2V4ZWN1dGUgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUubWFyayhmdW5jdGlvbiBfY2FsbGVlKHZpZXdzKSB7XG4gICAgICAgIHZhciBfdGhpcyRyZW5kZXJQYXNzRmFjdG8sIHNldHVwUmVuZGVyUGFzcywgZXhlY3V0ZVJlbmRlclBhc3MsIHJlbmRlclBhc3MsIF90aGlzJHJlbmRlclBhc3NGYWN0bzIsIHNldHVwQ29weVBhc3MsIGV4ZWN1dGVDb3B5UGFzcywgdGVhckRvd25Db3B5UGFzcywgY29weVBhc3M7XG5cbiAgICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUud3JhcChmdW5jdGlvbiBfY2FsbGVlJChfY29udGV4dCkge1xuICAgICAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7XG4gICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAvLyBjb25zdCBwaXhlbFBpY2tpbmdQYXNzID0gdGhpcy5yZW5kZXJQYXNzRmFjdG9yeTxQaXhlbFBpY2tpbmdQYXNzRGF0YT4oXG4gICAgICAgICAgICAgICAgLy8gICBQaXhlbFBpY2tpbmdQYXNzLklERU5USUZJRVIsXG4gICAgICAgICAgICAgICAgLy8gKTtcbiAgICAgICAgICAgICAgICAvLyBjb25zdCB7XG4gICAgICAgICAgICAgICAgLy8gICBzZXR1cDogc2V0dXBQaXhlbFBpY2tpbmdQYXNzLFxuICAgICAgICAgICAgICAgIC8vICAgZXhlY3V0ZTogZXhlY3V0ZVBpeGVsUGlja2luZ1Bhc3MsXG4gICAgICAgICAgICAgICAgLy8gICB0ZWFyRG93bjogdGVhckRvd25QaWNraW5nUGFzcyxcbiAgICAgICAgICAgICAgICAvLyB9ID0gcGl4ZWxQaWNraW5nUGFzcztcbiAgICAgICAgICAgICAgICAvLyB0aGlzLmZyYW1lR3JhcGhTeXN0ZW0uYWRkUGFzczxQaXhlbFBpY2tpbmdQYXNzRGF0YT4oXG4gICAgICAgICAgICAgICAgLy8gICBQaXhlbFBpY2tpbmdQYXNzLklERU5USUZJRVIsXG4gICAgICAgICAgICAgICAgLy8gICBzZXR1cFBpeGVsUGlja2luZ1Bhc3MsXG4gICAgICAgICAgICAgICAgLy8gICBleGVjdXRlUGl4ZWxQaWNraW5nUGFzcyxcbiAgICAgICAgICAgICAgICAvLyAgIHRlYXJEb3duUGlja2luZ1Bhc3MsXG4gICAgICAgICAgICAgICAgLy8gKTtcbiAgICAgICAgICAgICAgICBfdGhpcyRyZW5kZXJQYXNzRmFjdG8gPSB0aGlzLnJlbmRlclBhc3NGYWN0b3J5KFJlbmRlclBhc3MuSURFTlRJRklFUiksIHNldHVwUmVuZGVyUGFzcyA9IF90aGlzJHJlbmRlclBhc3NGYWN0by5zZXR1cCwgZXhlY3V0ZVJlbmRlclBhc3MgPSBfdGhpcyRyZW5kZXJQYXNzRmFjdG8uZXhlY3V0ZTtcbiAgICAgICAgICAgICAgICByZW5kZXJQYXNzID0gdGhpcy5mcmFtZUdyYXBoU3lzdGVtLmFkZFBhc3MoUmVuZGVyUGFzcy5JREVOVElGSUVSLCBzZXR1cFJlbmRlclBhc3MsIGV4ZWN1dGVSZW5kZXJQYXNzKTtcbiAgICAgICAgICAgICAgICBfdGhpcyRyZW5kZXJQYXNzRmFjdG8yID0gdGhpcy5yZW5kZXJQYXNzRmFjdG9yeShDb3B5UGFzcy5JREVOVElGSUVSKSwgc2V0dXBDb3B5UGFzcyA9IF90aGlzJHJlbmRlclBhc3NGYWN0bzIuc2V0dXAsIGV4ZWN1dGVDb3B5UGFzcyA9IF90aGlzJHJlbmRlclBhc3NGYWN0bzIuZXhlY3V0ZSwgdGVhckRvd25Db3B5UGFzcyA9IF90aGlzJHJlbmRlclBhc3NGYWN0bzIudGVhckRvd247XG4gICAgICAgICAgICAgICAgY29weVBhc3MgPSB0aGlzLmZyYW1lR3JhcGhTeXN0ZW0uYWRkUGFzcyhDb3B5UGFzcy5JREVOVElGSUVSLCBzZXR1cENvcHlQYXNzLCBleGVjdXRlQ29weVBhc3MsIHRlYXJEb3duQ29weVBhc3MpO1xuICAgICAgICAgICAgICAgIHRoaXMuZnJhbWVHcmFwaFN5c3RlbS5wcmVzZW50KGNvcHlQYXNzLmRhdGEub3V0cHV0KTsgLy8gdGhpcy5mcmFtZUdyYXBoU3lzdGVtLnByZXNlbnQocmVuZGVyUGFzcy5kYXRhLm91dHB1dCk7XG5cbiAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LnN0b3AoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sIF9jYWxsZWUsIHRoaXMpO1xuICAgICAgfSkpO1xuXG4gICAgICBmdW5jdGlvbiBleGVjdXRlKF94KSB7XG4gICAgICAgIHJldHVybiBfZXhlY3V0ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZXhlY3V0ZTtcbiAgICB9KClcbiAgfSwge1xuICAgIGtleTogXCJ0ZWFyRG93blwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB0ZWFyRG93bigpIHtcbiAgICAgIHRoaXMucmVzb3VyY2VQb29sLmNsZWFuKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInBpY2tcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcGljayhwb3NpdGlvbiwgdmlldykge1xuICAgICAgdmFyIHBpY2tpbmdQYXNzID0gdGhpcy5yZW5kZXJQYXNzRmFjdG9yeShQaXhlbFBpY2tpbmdQYXNzLklERU5USUZJRVIpO1xuICAgICAgcmV0dXJuIHBpY2tpbmdQYXNzLnBpY2socG9zaXRpb24sIHZpZXcpO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBSZW5kZXJlclN5c3RlbTtcbn0oKSwgX3RlbXApLCAoX2Rlc2NyaXB0b3IgPSBfYXBwbHlEZWNvcmF0ZWREZXNjcmlwdG9yKF9jbGFzczIucHJvdG90eXBlLCBcImZyYW1lR3JhcGhTeXN0ZW1cIiwgW19kZWMyLCBfZGVjM10sIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICB3cml0YWJsZTogdHJ1ZSxcbiAgaW5pdGlhbGl6ZXI6IG51bGxcbn0pLCBfZGVzY3JpcHRvcjIgPSBfYXBwbHlEZWNvcmF0ZWREZXNjcmlwdG9yKF9jbGFzczIucHJvdG90eXBlLCBcInJlbmRlclBhc3NGYWN0b3J5XCIsIFtfZGVjNF0sIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICB3cml0YWJsZTogdHJ1ZSxcbiAgaW5pdGlhbGl6ZXI6IG51bGxcbn0pLCBfZGVzY3JpcHRvcjMgPSBfYXBwbHlEZWNvcmF0ZWREZXNjcmlwdG9yKF9jbGFzczIucHJvdG90eXBlLCBcImNvbmZpZ1NlcnZpY2VcIiwgW19kZWM1XSwge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHdyaXRhYmxlOiB0cnVlLFxuICBpbml0aWFsaXplcjogbnVsbFxufSksIF9kZXNjcmlwdG9yNCA9IF9hcHBseURlY29yYXRlZERlc2NyaXB0b3IoX2NsYXNzMi5wcm90b3R5cGUsIFwicmVzb3VyY2VQb29sXCIsIFtfZGVjNl0sIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICB3cml0YWJsZTogdHJ1ZSxcbiAgaW5pdGlhbGl6ZXI6IG51bGxcbn0pKSwgX2NsYXNzMikpIHx8IF9jbGFzcyk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TeXN0ZW0uanMubWFwIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///129\n')},function(module,__webpack_exports__,__webpack_require__){"use strict";eval('/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return HierarchyComponent; });\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6);\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(22);\n/* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(23);\n/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(24);\n/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(18);\n/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _ComponentManager__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(25);\n\n\n\n\n\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4___default()(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4___default()(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_3___default()(this, result); }; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\n\nvar HierarchyComponent = /*#__PURE__*/function (_Component) {\n _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_2___default()(HierarchyComponent, _Component);\n\n var _super = _createSuper(HierarchyComponent);\n\n function HierarchyComponent(data) {\n var _this;\n\n _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, HierarchyComponent);\n\n _this = _super.call(this, data);\n _this.parentID = void 0;\n Object.assign(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_1___default()(_this), data);\n return _this;\n }\n\n return HierarchyComponent;\n}(_ComponentManager__WEBPACK_IMPORTED_MODULE_5__[/* Component */ "a"]);\n//# sourceMappingURL=HierarchyComponent.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy13ZWJncHUtY29yZS9lcy9jb21wb25lbnRzL3NjZW5lZ3JhcGgvSGllcmFyY2h5Q29tcG9uZW50LmpzPzIxMGQiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQW9FO0FBQ2M7QUFDMUI7QUFDa0M7QUFDdEI7O0FBRXBFLGdDQUFnQyw2REFBNkQseUNBQXlDLGFBQWEsNEVBQWUsa0JBQWtCLGlDQUFpQyxpQkFBaUIsNEVBQWUsbUJBQW1CLHlEQUF5RCxFQUFFLE9BQU8sdUNBQXVDLEVBQUUsUUFBUSx1RkFBMEIsZUFBZSxHQUFHOztBQUV2YSxzQ0FBc0Msd0VBQXdFLDBDQUEwQyw4Q0FBOEMsTUFBTSx3RUFBd0UsR0FBRyxhQUFhLEVBQUUsWUFBWSxjQUFjLEVBQUU7O0FBRS9RO0FBQzVDO0FBQ1AsRUFBRSxzRUFBUzs7QUFFWDs7QUFFQTtBQUNBOztBQUVBLElBQUksNEVBQWU7O0FBRW5CO0FBQ0E7QUFDQSxrQkFBa0IsbUZBQXNCO0FBQ3hDO0FBQ0E7O0FBRUE7QUFDQSxDQUFDLENBQUMsbUVBQVM7QUFDWCIsImZpbGUiOiIxMzAuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrXCI7XG5pbXBvcnQgX2Fzc2VydFRoaXNJbml0aWFsaXplZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hc3NlcnRUaGlzSW5pdGlhbGl6ZWRcIjtcbmltcG9ydCBfaW5oZXJpdHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHNcIjtcbmltcG9ydCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuXCI7XG5pbXBvcnQgX2dldFByb3RvdHlwZU9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2dldFByb3RvdHlwZU9mXCI7XG5cbmZ1bmN0aW9uIF9jcmVhdGVTdXBlcihEZXJpdmVkKSB7IHZhciBoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0ID0gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpOyByZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKSB7IHZhciBTdXBlciA9IF9nZXRQcm90b3R5cGVPZihEZXJpdmVkKSwgcmVzdWx0OyBpZiAoaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCkgeyB2YXIgTmV3VGFyZ2V0ID0gX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yOyByZXN1bHQgPSBSZWZsZWN0LmNvbnN0cnVjdChTdXBlciwgYXJndW1lbnRzLCBOZXdUYXJnZXQpOyB9IGVsc2UgeyByZXN1bHQgPSBTdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9IHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCByZXN1bHQpOyB9OyB9XG5cbmZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7IGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpIHJldHVybiBmYWxzZTsgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTsgaWYgKHR5cGVvZiBQcm94eSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdHJ1ZTsgdHJ5IHsgRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLCBbXSwgZnVuY3Rpb24gKCkge30pKTsgcmV0dXJuIHRydWU7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9IH1cblxuaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vQ29tcG9uZW50TWFuYWdlcic7XG5leHBvcnQgdmFyIEhpZXJhcmNoeUNvbXBvbmVudCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0NvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoSGllcmFyY2h5Q29tcG9uZW50LCBfQ29tcG9uZW50KTtcblxuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKEhpZXJhcmNoeUNvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gSGllcmFyY2h5Q29tcG9uZW50KGRhdGEpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgSGllcmFyY2h5Q29tcG9uZW50KTtcblxuICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgZGF0YSk7XG4gICAgX3RoaXMucGFyZW50SUQgPSB2b2lkIDA7XG4gICAgT2JqZWN0LmFzc2lnbihfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgZGF0YSk7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgcmV0dXJuIEhpZXJhcmNoeUNvbXBvbmVudDtcbn0oQ29tcG9uZW50KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUhpZXJhcmNoeUNvbXBvbmVudC5qcy5tYXAiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///130\n')},function(module,__webpack_exports__,__webpack_require__){"use strict";eval('/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SceneGraphSystem; });\n/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(9);\n/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(15);\n/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _babel_runtime_helpers_initializerDefineProperty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(10);\n/* harmony import */ var _babel_runtime_helpers_initializerDefineProperty__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_initializerDefineProperty__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(6);\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(7);\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _babel_runtime_helpers_applyDecoratedDescriptor__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(11);\n/* harmony import */ var _babel_runtime_helpers_applyDecoratedDescriptor__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_applyDecoratedDescriptor__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _babel_runtime_helpers_initializerWarningHelper__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(29);\n/* harmony import */ var _babel_runtime_helpers_initializerWarningHelper__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_initializerWarningHelper__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var gl_matrix__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(2);\n/* harmony import */ var inversify__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(5);\n/* harmony import */ var inversify__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(inversify__WEBPACK_IMPORTED_MODULE_8__);\n/* harmony import */ var _identifier__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(13);\n\n\n\n\n\n\n\n\nvar _dec, _dec2, _dec3, _dec4, _class, _class2, _descriptor, _descriptor2, _descriptor3, _temp;\n\n\n\n\nvar SceneGraphSystem = (_dec = Object(inversify__WEBPACK_IMPORTED_MODULE_8__["injectable"])(), _dec2 = Object(inversify__WEBPACK_IMPORTED_MODULE_8__["inject"])(_identifier__WEBPACK_IMPORTED_MODULE_9__[/* IDENTIFIER */ "a"].HierarchyComponentManager), _dec3 = Object(inversify__WEBPACK_IMPORTED_MODULE_8__["inject"])(_identifier__WEBPACK_IMPORTED_MODULE_9__[/* IDENTIFIER */ "a"].TransformComponentManager), _dec4 = Object(inversify__WEBPACK_IMPORTED_MODULE_8__["inject"])(_identifier__WEBPACK_IMPORTED_MODULE_9__[/* IDENTIFIER */ "a"].MeshComponentManager), _dec(_class = (_class2 = (_temp = /*#__PURE__*/function () {\n function SceneGraphSystem() {\n _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_3___default()(this, SceneGraphSystem);\n\n _babel_runtime_helpers_initializerDefineProperty__WEBPACK_IMPORTED_MODULE_2___default()(this, "hierarchy", _descriptor, this);\n\n _babel_runtime_helpers_initializerDefineProperty__WEBPACK_IMPORTED_MODULE_2___default()(this, "transform", _descriptor2, this);\n\n _babel_runtime_helpers_initializerDefineProperty__WEBPACK_IMPORTED_MODULE_2___default()(this, "mesh", _descriptor3, this);\n }\n\n _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_4___default()(SceneGraphSystem, [{\n key: "execute",\n value: function () {\n var _execute = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee() {\n return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n this.runTransformUpdateSystem();\n this.runHierarchyUpdateSystem();\n\n case 2:\n case "end":\n return _context.stop();\n }\n }\n }, _callee, this);\n }));\n\n function execute() {\n return _execute.apply(this, arguments);\n }\n\n return execute;\n }()\n }, {\n key: "tearDown",\n value: function tearDown() {\n this.hierarchy.clear();\n this.transform.clear();\n }\n }, {\n key: "getHierarchyComponentManager",\n value: function getHierarchyComponentManager() {\n return this.hierarchy;\n }\n }, {\n key: "getTransformComponentManager",\n value: function getTransformComponentManager() {\n return this.transform;\n }\n }, {\n key: "runTransformUpdateSystem",\n value: function runTransformUpdateSystem() {\n var _this = this;\n\n // 原版基于 JobSystem 实现\n this.transform.forEach(function (entity, transform) {\n if (transform.isDirty() || transform.isLocalDirty()) {\n _this.setMeshAABBDirty(_this.mesh.getComponentByEntity(entity));\n\n transform.updateTransform();\n }\n });\n }\n }, {\n key: "runHierarchyUpdateSystem",\n value: function runHierarchyUpdateSystem() {\n var _this2 = this;\n\n this.hierarchy.forEach(function (entity, parentComponent) {\n var transformChild = _this2.transform.getComponentByEntity(entity);\n\n var transformParent = _this2.transform.getComponentByEntity(parentComponent.parentID);\n\n if (transformChild !== null && transformParent !== null) {\n transformChild.updateTransformWithParent(transformParent);\n }\n });\n }\n }, {\n key: "attach",\n value: function attach(entity, parent, isChildAlreadyInLocalSpace) {\n if (this.hierarchy.contains(entity)) {\n this.detach(entity);\n }\n\n this.hierarchy.create(entity, {\n parentID: parent\n });\n var mesh = this.mesh.getComponentByEntity(parent); // inform parent mesh to update its aabb\n\n this.setMeshAABBDirty(mesh);\n\n if (mesh && mesh.children.indexOf(entity) === -1) {\n mesh.children.push(entity);\n }\n\n if (this.hierarchy.getCount() > 1) {\n for (var i = this.hierarchy.getCount() - 1; i > 0; --i) {\n var parentCandidateEntity = this.hierarchy.getEntity(i); // const parentCandidateComponent = this.hierarchy.getComponent(i);\n\n for (var j = 0; j < i; ++j) {\n var childCandidateEntity = this.hierarchy.getComponent(j);\n\n if (childCandidateEntity.parentID === parentCandidateEntity) {\n this.hierarchy.moveItem(i, j);\n ++i; // next outer iteration will check the same index again as parent candidate, however things were moved upwards, so it will be a different entity!\n\n break;\n }\n }\n }\n } // Re-query parent after potential MoveItem(), because it invalidates references:\n\n\n var parentcomponent = this.hierarchy.getComponentByEntity(entity);\n var transformParent = this.transform.getComponentByEntity(parent);\n\n if (transformParent === null) {\n transformParent = this.transform.create(parent);\n }\n\n var transformChild = this.transform.getComponentByEntity(entity);\n\n if (transformChild === null) {\n transformChild = this.transform.create(entity); // after transforms.Create(), transform_parent pointer could have become invalidated!\n\n transformParent = this.transform.getComponentByEntity(parent);\n }\n\n transformChild.parent = transformParent;\n\n if (!isChildAlreadyInLocalSpace && transformParent) {\n transformChild.matrixTransform(gl_matrix__WEBPACK_IMPORTED_MODULE_7__[/* mat4 */ "b"].invert(gl_matrix__WEBPACK_IMPORTED_MODULE_7__[/* mat4 */ "b"].create(), transformParent.worldTransform));\n transformChild.updateTransform();\n }\n\n if (transformParent) {\n transformChild.updateTransformWithParent(transformParent);\n }\n }\n }, {\n key: "detach",\n value: function detach(entity) {\n var self = this.hierarchy.getComponentByEntity(entity);\n\n if (self !== null) {\n var transform = this.transform.getComponentByEntity(entity);\n\n if (transform !== null) {\n transform.parent = null;\n transform.applyTransform();\n }\n\n this.hierarchy.removeKeepSorted(entity); // inform parent mesh to update its aabb\n\n var mesh = this.mesh.getComponentByEntity(self.parentID);\n\n if (mesh) {\n var index = mesh.children.indexOf(entity);\n mesh.children.splice(index, 1);\n }\n\n this.setMeshAABBDirty(mesh);\n }\n }\n }, {\n key: "detachChildren",\n value: function detachChildren(parent) {\n var mesh = this.mesh.getComponentByEntity(parent);\n\n if (mesh) {\n mesh.children = [];\n }\n\n for (var i = 0; i < this.hierarchy.getCount();) {\n var _this$hierarchy$getCo;\n\n if (((_this$hierarchy$getCo = this.hierarchy.getComponent(i)) === null || _this$hierarchy$getCo === void 0 ? void 0 : _this$hierarchy$getCo.parentID) === parent) {\n var entity = this.hierarchy.getEntity(i);\n this.detach(entity);\n } else {\n ++i;\n }\n }\n }\n }, {\n key: "setMeshAABBDirty",\n value: function setMeshAABBDirty(mesh) {\n if (mesh) {\n mesh.aabbDirty = true;\n }\n }\n }]);\n\n return SceneGraphSystem;\n}(), _temp), (_descriptor = _babel_runtime_helpers_applyDecoratedDescriptor__WEBPACK_IMPORTED_MODULE_5___default()(_class2.prototype, "hierarchy", [_dec2], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n}), _descriptor2 = _babel_runtime_helpers_applyDecoratedDescriptor__WEBPACK_IMPORTED_MODULE_5___default()(_class2.prototype, "transform", [_dec3], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n}), _descriptor3 = _babel_runtime_helpers_applyDecoratedDescriptor__WEBPACK_IMPORTED_MODULE_5___default()(_class2.prototype, "mesh", [_dec4], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n})), _class2)) || _class);\n//# sourceMappingURL=System.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy13ZWJncHUtY29yZS9lcy9jb21wb25lbnRzL3NjZW5lZ3JhcGgvU3lzdGVtLmpzPzA0NWEiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBNkQ7QUFDVztBQUNrQjtBQUN0QjtBQUNOO0FBQzBCO0FBQ0E7O0FBRXhGOztBQUVpQztBQUNjO0FBQ0Q7QUFDdkMsK0JBQStCLDREQUFVLFlBQVksd0RBQU0sQ0FBQyw4REFBVSxxQ0FBcUMsd0RBQU0sQ0FBQyw4REFBVSxxQ0FBcUMsd0RBQU0sQ0FBQyw4REFBVTtBQUN6TDtBQUNBLElBQUksNEVBQWU7O0FBRW5CLElBQUksdUZBQTBCOztBQUU5QixJQUFJLHVGQUEwQjs7QUFFOUIsSUFBSSx1RkFBMEI7QUFDOUI7O0FBRUEsRUFBRSx5RUFBWTtBQUNkO0FBQ0E7QUFDQSxxQkFBcUIsOEVBQWlCLGVBQWUsaUVBQW1CO0FBQ3hFLGVBQWUsaUVBQW1CO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPOztBQUVQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQLHdEQUF3RDs7QUFFeEQ7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsbURBQW1ELE9BQU87QUFDMUQsa0VBQWtFOztBQUVsRSx5QkFBeUIsT0FBTztBQUNoQzs7QUFFQTtBQUNBO0FBQ0Esa0JBQWtCOztBQUVsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87OztBQUdQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsdURBQXVEOztBQUV2RDtBQUNBOztBQUVBOztBQUVBO0FBQ0EsdUNBQXVDLHNEQUFJLFFBQVEsc0RBQUk7QUFDdkQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxnREFBZ0Q7O0FBRWhEOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLHFCQUFxQiwrQkFBK0I7QUFDcEQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQSxDQUFDLDJCQUEyQixzRkFBeUI7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLGtCQUFrQixzRkFBeUI7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLGtCQUFrQixzRkFBeUI7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QiLCJmaWxlIjoiMTMxLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF9yZWdlbmVyYXRvclJ1bnRpbWUgZnJvbSBcIkBiYWJlbC9ydW50aW1lL3JlZ2VuZXJhdG9yXCI7XG5pbXBvcnQgX2FzeW5jVG9HZW5lcmF0b3IgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXN5bmNUb0dlbmVyYXRvclwiO1xuaW1wb3J0IF9pbml0aWFsaXplckRlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2luaXRpYWxpemVyRGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfY2xhc3NDYWxsQ2hlY2sgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2tcIjtcbmltcG9ydCBfY3JlYXRlQ2xhc3MgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlQ2xhc3NcIjtcbmltcG9ydCBfYXBwbHlEZWNvcmF0ZWREZXNjcmlwdG9yIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2FwcGx5RGVjb3JhdGVkRGVzY3JpcHRvclwiO1xuaW1wb3J0IF9pbml0aWFsaXplcldhcm5pbmdIZWxwZXIgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW5pdGlhbGl6ZXJXYXJuaW5nSGVscGVyXCI7XG5cbnZhciBfZGVjLCBfZGVjMiwgX2RlYzMsIF9kZWM0LCBfY2xhc3MsIF9jbGFzczIsIF9kZXNjcmlwdG9yLCBfZGVzY3JpcHRvcjIsIF9kZXNjcmlwdG9yMywgX3RlbXA7XG5cbmltcG9ydCB7IG1hdDQgfSBmcm9tICdnbC1tYXRyaXgnO1xuaW1wb3J0IHsgaW5qZWN0LCBpbmplY3RhYmxlIH0gZnJvbSAnaW52ZXJzaWZ5JztcbmltcG9ydCB7IElERU5USUZJRVIgfSBmcm9tICcuLi8uLi9pZGVudGlmaWVyJztcbmV4cG9ydCB2YXIgU2NlbmVHcmFwaFN5c3RlbSA9IChfZGVjID0gaW5qZWN0YWJsZSgpLCBfZGVjMiA9IGluamVjdChJREVOVElGSUVSLkhpZXJhcmNoeUNvbXBvbmVudE1hbmFnZXIpLCBfZGVjMyA9IGluamVjdChJREVOVElGSUVSLlRyYW5zZm9ybUNvbXBvbmVudE1hbmFnZXIpLCBfZGVjNCA9IGluamVjdChJREVOVElGSUVSLk1lc2hDb21wb25lbnRNYW5hZ2VyKSwgX2RlYyhfY2xhc3MgPSAoX2NsYXNzMiA9IChfdGVtcCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFNjZW5lR3JhcGhTeXN0ZW0oKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFNjZW5lR3JhcGhTeXN0ZW0pO1xuXG4gICAgX2luaXRpYWxpemVyRGVmaW5lUHJvcGVydHkodGhpcywgXCJoaWVyYXJjaHlcIiwgX2Rlc2NyaXB0b3IsIHRoaXMpO1xuXG4gICAgX2luaXRpYWxpemVyRGVmaW5lUHJvcGVydHkodGhpcywgXCJ0cmFuc2Zvcm1cIiwgX2Rlc2NyaXB0b3IyLCB0aGlzKTtcblxuICAgIF9pbml0aWFsaXplckRlZmluZVByb3BlcnR5KHRoaXMsIFwibWVzaFwiLCBfZGVzY3JpcHRvcjMsIHRoaXMpO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKFNjZW5lR3JhcGhTeXN0ZW0sIFt7XG4gICAga2V5OiBcImV4ZWN1dGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF9leGVjdXRlID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoZnVuY3Rpb24gX2NhbGxlZSgpIHtcbiAgICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUud3JhcChmdW5jdGlvbiBfY2FsbGVlJChfY29udGV4dCkge1xuICAgICAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7XG4gICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICB0aGlzLnJ1blRyYW5zZm9ybVVwZGF0ZVN5c3RlbSgpO1xuICAgICAgICAgICAgICAgIHRoaXMucnVuSGllcmFyY2h5VXBkYXRlU3lzdGVtKCk7XG5cbiAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LnN0b3AoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sIF9jYWxsZWUsIHRoaXMpO1xuICAgICAgfSkpO1xuXG4gICAgICBmdW5jdGlvbiBleGVjdXRlKCkge1xuICAgICAgICByZXR1cm4gX2V4ZWN1dGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGV4ZWN1dGU7XG4gICAgfSgpXG4gIH0sIHtcbiAgICBrZXk6IFwidGVhckRvd25cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdGVhckRvd24oKSB7XG4gICAgICB0aGlzLmhpZXJhcmNoeS5jbGVhcigpO1xuICAgICAgdGhpcy50cmFuc2Zvcm0uY2xlYXIoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0SGllcmFyY2h5Q29tcG9uZW50TWFuYWdlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRIaWVyYXJjaHlDb21wb25lbnRNYW5hZ2VyKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaGllcmFyY2h5O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRUcmFuc2Zvcm1Db21wb25lbnRNYW5hZ2VyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFRyYW5zZm9ybUNvbXBvbmVudE1hbmFnZXIoKSB7XG4gICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm07XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJ1blRyYW5zZm9ybVVwZGF0ZVN5c3RlbVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBydW5UcmFuc2Zvcm1VcGRhdGVTeXN0ZW0oKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICAvLyDljp/niYjln7rkuo4gSm9iU3lzdGVtIOWunueOsFxuICAgICAgdGhpcy50cmFuc2Zvcm0uZm9yRWFjaChmdW5jdGlvbiAoZW50aXR5LCB0cmFuc2Zvcm0pIHtcbiAgICAgICAgaWYgKHRyYW5zZm9ybS5pc0RpcnR5KCkgfHwgdHJhbnNmb3JtLmlzTG9jYWxEaXJ0eSgpKSB7XG4gICAgICAgICAgX3RoaXMuc2V0TWVzaEFBQkJEaXJ0eShfdGhpcy5tZXNoLmdldENvbXBvbmVudEJ5RW50aXR5KGVudGl0eSkpO1xuXG4gICAgICAgICAgdHJhbnNmb3JtLnVwZGF0ZVRyYW5zZm9ybSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicnVuSGllcmFyY2h5VXBkYXRlU3lzdGVtXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJ1bkhpZXJhcmNoeVVwZGF0ZVN5c3RlbSgpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICB0aGlzLmhpZXJhcmNoeS5mb3JFYWNoKGZ1bmN0aW9uIChlbnRpdHksIHBhcmVudENvbXBvbmVudCkge1xuICAgICAgICB2YXIgdHJhbnNmb3JtQ2hpbGQgPSBfdGhpczIudHJhbnNmb3JtLmdldENvbXBvbmVudEJ5RW50aXR5KGVudGl0eSk7XG5cbiAgICAgICAgdmFyIHRyYW5zZm9ybVBhcmVudCA9IF90aGlzMi50cmFuc2Zvcm0uZ2V0Q29tcG9uZW50QnlFbnRpdHkocGFyZW50Q29tcG9uZW50LnBhcmVudElEKTtcblxuICAgICAgICBpZiAodHJhbnNmb3JtQ2hpbGQgIT09IG51bGwgJiYgdHJhbnNmb3JtUGFyZW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgdHJhbnNmb3JtQ2hpbGQudXBkYXRlVHJhbnNmb3JtV2l0aFBhcmVudCh0cmFuc2Zvcm1QYXJlbnQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYXR0YWNoXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGF0dGFjaChlbnRpdHksIHBhcmVudCwgaXNDaGlsZEFscmVhZHlJbkxvY2FsU3BhY2UpIHtcbiAgICAgIGlmICh0aGlzLmhpZXJhcmNoeS5jb250YWlucyhlbnRpdHkpKSB7XG4gICAgICAgIHRoaXMuZGV0YWNoKGVudGl0eSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuaGllcmFyY2h5LmNyZWF0ZShlbnRpdHksIHtcbiAgICAgICAgcGFyZW50SUQ6IHBhcmVudFxuICAgICAgfSk7XG4gICAgICB2YXIgbWVzaCA9IHRoaXMubWVzaC5nZXRDb21wb25lbnRCeUVudGl0eShwYXJlbnQpOyAvLyBpbmZvcm0gcGFyZW50IG1lc2ggdG8gdXBkYXRlIGl0cyBhYWJiXG5cbiAgICAgIHRoaXMuc2V0TWVzaEFBQkJEaXJ0eShtZXNoKTtcblxuICAgICAgaWYgKG1lc2ggJiYgbWVzaC5jaGlsZHJlbi5pbmRleE9mKGVudGl0eSkgPT09IC0xKSB7XG4gICAgICAgIG1lc2guY2hpbGRyZW4ucHVzaChlbnRpdHkpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5oaWVyYXJjaHkuZ2V0Q291bnQoKSA+IDEpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IHRoaXMuaGllcmFyY2h5LmdldENvdW50KCkgLSAxOyBpID4gMDsgLS1pKSB7XG4gICAgICAgICAgdmFyIHBhcmVudENhbmRpZGF0ZUVudGl0eSA9IHRoaXMuaGllcmFyY2h5LmdldEVudGl0eShpKTsgLy8gY29uc3QgcGFyZW50Q2FuZGlkYXRlQ29tcG9uZW50ID0gdGhpcy5oaWVyYXJjaHkuZ2V0Q29tcG9uZW50KGkpO1xuXG4gICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBpOyArK2opIHtcbiAgICAgICAgICAgIHZhciBjaGlsZENhbmRpZGF0ZUVudGl0eSA9IHRoaXMuaGllcmFyY2h5LmdldENvbXBvbmVudChqKTtcblxuICAgICAgICAgICAgaWYgKGNoaWxkQ2FuZGlkYXRlRW50aXR5LnBhcmVudElEID09PSBwYXJlbnRDYW5kaWRhdGVFbnRpdHkpIHtcbiAgICAgICAgICAgICAgdGhpcy5oaWVyYXJjaHkubW92ZUl0ZW0oaSwgaik7XG4gICAgICAgICAgICAgICsraTsgLy8gbmV4dCBvdXRlciBpdGVyYXRpb24gd2lsbCBjaGVjayB0aGUgc2FtZSBpbmRleCBhZ2FpbiBhcyBwYXJlbnQgY2FuZGlkYXRlLCBob3dldmVyIHRoaW5ncyB3ZXJlIG1vdmVkIHVwd2FyZHMsIHNvIGl0IHdpbGwgYmUgYSBkaWZmZXJlbnQgZW50aXR5IVxuXG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSAvLyBSZS1xdWVyeSBwYXJlbnQgYWZ0ZXIgcG90ZW50aWFsIE1vdmVJdGVtKCksIGJlY2F1c2UgaXQgaW52YWxpZGF0ZXMgcmVmZXJlbmNlczpcblxuXG4gICAgICB2YXIgcGFyZW50Y29tcG9uZW50ID0gdGhpcy5oaWVyYXJjaHkuZ2V0Q29tcG9uZW50QnlFbnRpdHkoZW50aXR5KTtcbiAgICAgIHZhciB0cmFuc2Zvcm1QYXJlbnQgPSB0aGlzLnRyYW5zZm9ybS5nZXRDb21wb25lbnRCeUVudGl0eShwYXJlbnQpO1xuXG4gICAgICBpZiAodHJhbnNmb3JtUGFyZW50ID09PSBudWxsKSB7XG4gICAgICAgIHRyYW5zZm9ybVBhcmVudCA9IHRoaXMudHJhbnNmb3JtLmNyZWF0ZShwYXJlbnQpO1xuICAgICAgfVxuXG4gICAgICB2YXIgdHJhbnNmb3JtQ2hpbGQgPSB0aGlzLnRyYW5zZm9ybS5nZXRDb21wb25lbnRCeUVudGl0eShlbnRpdHkpO1xuXG4gICAgICBpZiAodHJhbnNmb3JtQ2hpbGQgPT09IG51bGwpIHtcbiAgICAgICAgdHJhbnNmb3JtQ2hpbGQgPSB0aGlzLnRyYW5zZm9ybS5jcmVhdGUoZW50aXR5KTsgLy8gYWZ0ZXIgdHJhbnNmb3Jtcy5DcmVhdGUoKSwgdHJhbnNmb3JtX3BhcmVudCBwb2ludGVyIGNvdWxkIGhhdmUgYmVjb21lIGludmFsaWRhdGVkIVxuXG4gICAgICAgIHRyYW5zZm9ybVBhcmVudCA9IHRoaXMudHJhbnNmb3JtLmdldENvbXBvbmVudEJ5RW50aXR5KHBhcmVudCk7XG4gICAgICB9XG5cbiAgICAgIHRyYW5zZm9ybUNoaWxkLnBhcmVudCA9IHRyYW5zZm9ybVBhcmVudDtcblxuICAgICAgaWYgKCFpc0NoaWxkQWxyZWFkeUluTG9jYWxTcGFjZSAmJiB0cmFuc2Zvcm1QYXJlbnQpIHtcbiAgICAgICAgdHJhbnNmb3JtQ2hpbGQubWF0cml4VHJhbnNmb3JtKG1hdDQuaW52ZXJ0KG1hdDQuY3JlYXRlKCksIHRyYW5zZm9ybVBhcmVudC53b3JsZFRyYW5zZm9ybSkpO1xuICAgICAgICB0cmFuc2Zvcm1DaGlsZC51cGRhdGVUcmFuc2Zvcm0oKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRyYW5zZm9ybVBhcmVudCkge1xuICAgICAgICB0cmFuc2Zvcm1DaGlsZC51cGRhdGVUcmFuc2Zvcm1XaXRoUGFyZW50KHRyYW5zZm9ybVBhcmVudCk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImRldGFjaFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkZXRhY2goZW50aXR5KSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXMuaGllcmFyY2h5LmdldENvbXBvbmVudEJ5RW50aXR5KGVudGl0eSk7XG5cbiAgICAgIGlmIChzZWxmICE9PSBudWxsKSB7XG4gICAgICAgIHZhciB0cmFuc2Zvcm0gPSB0aGlzLnRyYW5zZm9ybS5nZXRDb21wb25lbnRCeUVudGl0eShlbnRpdHkpO1xuXG4gICAgICAgIGlmICh0cmFuc2Zvcm0gIT09IG51bGwpIHtcbiAgICAgICAgICB0cmFuc2Zvcm0ucGFyZW50ID0gbnVsbDtcbiAgICAgICAgICB0cmFuc2Zvcm0uYXBwbHlUcmFuc2Zvcm0oKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaGllcmFyY2h5LnJlbW92ZUtlZXBTb3J0ZWQoZW50aXR5KTsgLy8gaW5mb3JtIHBhcmVudCBtZXNoIHRvIHVwZGF0ZSBpdHMgYWFiYlxuXG4gICAgICAgIHZhciBtZXNoID0gdGhpcy5tZXNoLmdldENvbXBvbmVudEJ5RW50aXR5KHNlbGYucGFyZW50SUQpO1xuXG4gICAgICAgIGlmIChtZXNoKSB7XG4gICAgICAgICAgdmFyIGluZGV4ID0gbWVzaC5jaGlsZHJlbi5pbmRleE9mKGVudGl0eSk7XG4gICAgICAgICAgbWVzaC5jaGlsZHJlbi5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZXRNZXNoQUFCQkRpcnR5KG1lc2gpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJkZXRhY2hDaGlsZHJlblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkZXRhY2hDaGlsZHJlbihwYXJlbnQpIHtcbiAgICAgIHZhciBtZXNoID0gdGhpcy5tZXNoLmdldENvbXBvbmVudEJ5RW50aXR5KHBhcmVudCk7XG5cbiAgICAgIGlmIChtZXNoKSB7XG4gICAgICAgIG1lc2guY2hpbGRyZW4gPSBbXTtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmhpZXJhcmNoeS5nZXRDb3VudCgpOykge1xuICAgICAgICB2YXIgX3RoaXMkaGllcmFyY2h5JGdldENvO1xuXG4gICAgICAgIGlmICgoKF90aGlzJGhpZXJhcmNoeSRnZXRDbyA9IHRoaXMuaGllcmFyY2h5LmdldENvbXBvbmVudChpKSkgPT09IG51bGwgfHwgX3RoaXMkaGllcmFyY2h5JGdldENvID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGhpcyRoaWVyYXJjaHkkZ2V0Q28ucGFyZW50SUQpID09PSBwYXJlbnQpIHtcbiAgICAgICAgICB2YXIgZW50aXR5ID0gdGhpcy5oaWVyYXJjaHkuZ2V0RW50aXR5KGkpO1xuICAgICAgICAgIHRoaXMuZGV0YWNoKGVudGl0eSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgKytpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNldE1lc2hBQUJCRGlydHlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0TWVzaEFBQkJEaXJ0eShtZXNoKSB7XG4gICAgICBpZiAobWVzaCkge1xuICAgICAgICBtZXNoLmFhYmJEaXJ0eSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFNjZW5lR3JhcGhTeXN0ZW07XG59KCksIF90ZW1wKSwgKF9kZXNjcmlwdG9yID0gX2FwcGx5RGVjb3JhdGVkRGVzY3JpcHRvcihfY2xhc3MyLnByb3RvdHlwZSwgXCJoaWVyYXJjaHlcIiwgW19kZWMyXSwge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHdyaXRhYmxlOiB0cnVlLFxuICBpbml0aWFsaXplcjogbnVsbFxufSksIF9kZXNjcmlwdG9yMiA9IF9hcHBseURlY29yYXRlZERlc2NyaXB0b3IoX2NsYXNzMi5wcm90b3R5cGUsIFwidHJhbnNmb3JtXCIsIFtfZGVjM10sIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICB3cml0YWJsZTogdHJ1ZSxcbiAgaW5pdGlhbGl6ZXI6IG51bGxcbn0pLCBfZGVzY3JpcHRvcjMgPSBfYXBwbHlEZWNvcmF0ZWREZXNjcmlwdG9yKF9jbGFzczIucHJvdG90eXBlLCBcIm1lc2hcIiwgW19kZWM0XSwge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHdyaXRhYmxlOiB0cnVlLFxuICBpbml0aWFsaXplcjogbnVsbFxufSkpLCBfY2xhc3MyKSkgfHwgX2NsYXNzKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVN5c3RlbS5qcy5tYXAiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///131\n')},function(module,__webpack_exports__,__webpack_require__){"use strict";eval('/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return TransformComponent; });\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6);\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(7);\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(22);\n/* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(23);\n/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(24);\n/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(18);\n/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var gl_matrix__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(2);\n/* harmony import */ var _ComponentManager__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(25);\n\n\n\n\n\n\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_5___default()(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_5___default()(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_4___default()(this, result); }; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\n\n\nvar TransformComponent = /*#__PURE__*/function (_Component) {\n _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_3___default()(TransformComponent, _Component);\n\n var _super = _createSuper(TransformComponent);\n\n /**\n * local space RTS\n */\n\n /**\n * XMFLOAT4X4._41\n * @see https://docs.microsoft.com/en-us/windows/win32/api/directxmath/nf-directxmath-xmfloat4x4-xmfloat4x4(constfloat)#remarks\n */\n\n /**\n * world space RTS\n */\n // 高阶函数,利用闭包重复利用临时变量\n // @see playcanvas graph node\n\n /**\n * @see https://docs.microsoft.com/en-us/windows/win32/api/directxmath/nf-directxmath-xmquaternionrotationrollpitchyaw\n */\n\n /**\n * @see https://xiaoiver.github.io/coding/2018/12/28/Camera-%E8%AE%BE%E8%AE%A1-%E4%B8%80.html\n */\n\n /**\n * TODO: 支持以下两种:\n * * translate(x, y, z)\n * * translate(vec3(x, y, z))\n */\n\n /**\n * @see https://en.wikipedia.org/wiki/Centripetal_Catmull%E2%80%93Rom_spline\n */\n // public catmullRom = (() => {\n // const aS = vec3.create();\n // const aR = quat.create();\n // const aT = vec3.create();\n // const bS = vec3.create();\n // const bR = quat.create();\n // const bT = vec3.create();\n // const cS = vec3.create();\n // const cR = quat.create();\n // const cT = vec3.create();\n // const dS = vec3.create();\n // const dR = quat.create();\n // const dT = vec3.create();\n // const R = quat.create();\n // return (\n // a: TransformComponent,\n // b: TransformComponent,\n // c: TransformComponent,\n // d: TransformComponent,\n // t: number,\n // ) => {\n // this.setDirty();\n // mat4.getScaling(aS, a.worldTransform);\n // mat4.getTranslation(aT, a.worldTransform);\n // mat4.getRotation(aR, a.worldTransform);\n // mat4.getScaling(bS, b.worldTransform);\n // mat4.getTranslation(bT, b.worldTransform);\n // mat4.getRotation(bR, b.worldTransform);\n // mat4.getScaling(cS, c.worldTransform);\n // mat4.getTranslation(cT, c.worldTransform);\n // mat4.getRotation(cR, c.worldTransform);\n // mat4.getScaling(dS, d.worldTransform);\n // mat4.getTranslation(dT, d.worldTransform);\n // mat4.getRotation(dR, d.worldTransform);\n // vec3.catmullRom(this.localPosition, aT, bT, cT, dT, t);\n // vec3.catmullRom(R, aR, bR, cR, dR, t);\n // quat.normalize(this.localRotation, R);\n // vec3.catmullRom(this.localScale, aS, bS, cS, dS, t);\n // };\n // })();\n function TransformComponent(data) {\n var _this;\n\n _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, TransformComponent);\n\n _this = _super.call(this, data);\n _this.dirtyFlag = void 0;\n _this.localDirtyFlag = void 0;\n _this.parent = null;\n _this.localPosition = gl_matrix__WEBPACK_IMPORTED_MODULE_6__[/* vec3 */ "e"].fromValues(0, 0, 0);\n _this.localRotation = gl_matrix__WEBPACK_IMPORTED_MODULE_6__[/* quat */ "c"].fromValues(0, 0, 0, 1);\n _this.localScale = gl_matrix__WEBPACK_IMPORTED_MODULE_6__[/* vec3 */ "e"].fromValues(1, 1, 1);\n _this.localTransform = gl_matrix__WEBPACK_IMPORTED_MODULE_6__[/* mat4 */ "b"].create();\n _this.position = gl_matrix__WEBPACK_IMPORTED_MODULE_6__[/* vec3 */ "e"].fromValues(0, 0, 0);\n _this.rotation = gl_matrix__WEBPACK_IMPORTED_MODULE_6__[/* quat */ "c"].fromValues(0, 0, 0, 1);\n _this.scaling = gl_matrix__WEBPACK_IMPORTED_MODULE_6__[/* vec3 */ "e"].fromValues(1, 1, 1);\n _this.worldTransform = gl_matrix__WEBPACK_IMPORTED_MODULE_6__[/* mat4 */ "b"].create();\n\n _this.matrixTransform = function () {\n var transformed = gl_matrix__WEBPACK_IMPORTED_MODULE_6__[/* mat4 */ "b"].create();\n return function (mat) {\n gl_matrix__WEBPACK_IMPORTED_MODULE_6__[/* mat4 */ "b"].multiply(transformed, _this.getLocalTransform(), mat);\n gl_matrix__WEBPACK_IMPORTED_MODULE_6__[/* mat4 */ "b"].getScaling(_this.localScale, transformed);\n gl_matrix__WEBPACK_IMPORTED_MODULE_6__[/* mat4 */ "b"].getTranslation(_this.localPosition, transformed);\n gl_matrix__WEBPACK_IMPORTED_MODULE_6__[/* mat4 */ "b"].getRotation(_this.localRotation, transformed);\n };\n }();\n\n _this.rotateRollPitchYaw = function () {\n var quatX = gl_matrix__WEBPACK_IMPORTED_MODULE_6__[/* quat */ "c"].create();\n var quatY = gl_matrix__WEBPACK_IMPORTED_MODULE_6__[/* quat */ "c"].create();\n var quatZ = gl_matrix__WEBPACK_IMPORTED_MODULE_6__[/* quat */ "c"].create();\n return function (x, y, z) {\n _this.setDirty();\n\n gl_matrix__WEBPACK_IMPORTED_MODULE_6__[/* quat */ "c"].fromEuler(quatX, x, 0, 0);\n gl_matrix__WEBPACK_IMPORTED_MODULE_6__[/* quat */ "c"].fromEuler(quatY, 0, y, 0);\n gl_matrix__WEBPACK_IMPORTED_MODULE_6__[/* quat */ "c"].fromEuler(quatZ, 0, 0, z);\n gl_matrix__WEBPACK_IMPORTED_MODULE_6__[/* quat */ "c"].multiply(_this.localRotation, quatX, _this.localRotation);\n gl_matrix__WEBPACK_IMPORTED_MODULE_6__[/* quat */ "c"].multiply(_this.localRotation, _this.localRotation, quatY);\n gl_matrix__WEBPACK_IMPORTED_MODULE_6__[/* quat */ "c"].multiply(_this.localRotation, quatZ, _this.localRotation);\n gl_matrix__WEBPACK_IMPORTED_MODULE_6__[/* quat */ "c"].normalize(_this.localRotation, _this.localRotation);\n };\n }();\n\n _this.lerp = function () {\n var aS = gl_matrix__WEBPACK_IMPORTED_MODULE_6__[/* vec3 */ "e"].create();\n var aR = gl_matrix__WEBPACK_IMPORTED_MODULE_6__[/* quat */ "c"].create();\n var aT = gl_matrix__WEBPACK_IMPORTED_MODULE_6__[/* vec3 */ "e"].create();\n var bS = gl_matrix__WEBPACK_IMPORTED_MODULE_6__[/* vec3 */ "e"].create();\n var bR = gl_matrix__WEBPACK_IMPORTED_MODULE_6__[/* quat */ "c"].create();\n var bT = gl_matrix__WEBPACK_IMPORTED_MODULE_6__[/* vec3 */ "e"].create();\n return function (a, b, t) {\n _this.setDirty();\n\n gl_matrix__WEBPACK_IMPORTED_MODULE_6__[/* mat4 */ "b"].getScaling(aS, a.worldTransform);\n gl_matrix__WEBPACK_IMPORTED_MODULE_6__[/* mat4 */ "b"].getTranslation(aT, a.worldTransform);\n gl_matrix__WEBPACK_IMPORTED_MODULE_6__[/* mat4 */ "b"].getRotation(aR, a.worldTransform);\n gl_matrix__WEBPACK_IMPORTED_MODULE_6__[/* mat4 */ "b"].getScaling(bS, b.worldTransform);\n gl_matrix__WEBPACK_IMPORTED_MODULE_6__[/* mat4 */ "b"].getTranslation(bT, b.worldTransform);\n gl_matrix__WEBPACK_IMPORTED_MODULE_6__[/* mat4 */ "b"].getRotation(bR, b.worldTransform);\n gl_matrix__WEBPACK_IMPORTED_MODULE_6__[/* vec3 */ "e"].lerp(_this.localScale, aS, bS, t);\n gl_matrix__WEBPACK_IMPORTED_MODULE_6__[/* quat */ "c"].slerp(_this.localRotation, aR, bR, t);\n gl_matrix__WEBPACK_IMPORTED_MODULE_6__[/* vec3 */ "e"].lerp(_this.localPosition, aT, bT, t);\n };\n }();\n\n _this.translate = function () {\n var tr = gl_matrix__WEBPACK_IMPORTED_MODULE_6__[/* vec3 */ "e"].create();\n return function (translation) {\n gl_matrix__WEBPACK_IMPORTED_MODULE_6__[/* vec3 */ "e"].add(tr, _this.getPosition(), translation);\n\n _this.setPosition(tr);\n\n _this.setDirty(true);\n\n return _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_2___default()(_this);\n };\n }();\n\n _this.translateLocal = function () {\n return function (translation) {\n gl_matrix__WEBPACK_IMPORTED_MODULE_6__[/* vec3 */ "e"].transformQuat(translation, translation, _this.localRotation);\n gl_matrix__WEBPACK_IMPORTED_MODULE_6__[/* vec3 */ "e"].add(_this.localPosition, _this.localPosition, translation);\n\n _this.setLocalDirty(true);\n\n return _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_2___default()(_this);\n };\n }();\n\n _this.setPosition = function () {\n var parentInvertMatrix = gl_matrix__WEBPACK_IMPORTED_MODULE_6__[/* mat4 */ "b"].create();\n return function (position) {\n _this.position = position;\n\n _this.setLocalDirty(true);\n\n if (_this.parent === null) {\n gl_matrix__WEBPACK_IMPORTED_MODULE_6__[/* vec3 */ "e"].copy(_this.localPosition, position);\n } else {\n gl_matrix__WEBPACK_IMPORTED_MODULE_6__[/* mat4 */ "b"].copy(parentInvertMatrix, _this.parent.worldTransform);\n gl_matrix__WEBPACK_IMPORTED_MODULE_6__[/* mat4 */ "b"].invert(parentInvertMatrix, parentInvertMatrix);\n gl_matrix__WEBPACK_IMPORTED_MODULE_6__[/* vec3 */ "e"].transformMat4(_this.localPosition, position, parentInvertMatrix);\n }\n\n return _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_2___default()(_this);\n };\n }();\n\n _this.rotate = function () {\n var parentInvertRotation = gl_matrix__WEBPACK_IMPORTED_MODULE_6__[/* quat */ "c"].create();\n return function (quaternion) {\n if (_this.parent === null) {\n gl_matrix__WEBPACK_IMPORTED_MODULE_6__[/* quat */ "c"].multiply(_this.localRotation, _this.localRotation, quaternion);\n gl_matrix__WEBPACK_IMPORTED_MODULE_6__[/* quat */ "c"].normalize(_this.localRotation, _this.localRotation);\n } else {\n var rot = _this.getRotation();\n\n var parentRot = _this.parent.getRotation();\n\n gl_matrix__WEBPACK_IMPORTED_MODULE_6__[/* quat */ "c"].copy(parentInvertRotation, parentRot);\n gl_matrix__WEBPACK_IMPORTED_MODULE_6__[/* quat */ "c"].invert(parentInvertRotation, parentInvertRotation);\n gl_matrix__WEBPACK_IMPORTED_MODULE_6__[/* quat */ "c"].multiply(parentInvertRotation, parentInvertRotation, quaternion);\n gl_matrix__WEBPACK_IMPORTED_MODULE_6__[/* quat */ "c"].multiply(_this.localRotation, quaternion, rot);\n gl_matrix__WEBPACK_IMPORTED_MODULE_6__[/* quat */ "c"].normalize(_this.localRotation, _this.localRotation);\n }\n\n _this.setLocalDirty();\n\n return _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_2___default()(_this);\n };\n }();\n\n _this.rotateLocal = function () {\n return function (quaternion) {\n gl_matrix__WEBPACK_IMPORTED_MODULE_6__[/* quat */ "c"].multiply(_this.localRotation, _this.localRotation, quaternion);\n gl_matrix__WEBPACK_IMPORTED_MODULE_6__[/* quat */ "c"].normalize(_this.localRotation, _this.localRotation);\n\n _this.setLocalDirty(true);\n\n return _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_2___default()(_this);\n };\n }();\n\n _this.setRotation = function () {\n var invParentRot = gl_matrix__WEBPACK_IMPORTED_MODULE_6__[/* quat */ "c"].create();\n return function (rotation) {\n if (_this.parent === null) {\n gl_matrix__WEBPACK_IMPORTED_MODULE_6__[/* quat */ "c"].copy(_this.localRotation, rotation);\n } else {\n gl_matrix__WEBPACK_IMPORTED_MODULE_6__[/* quat */ "c"].copy(invParentRot, _this.parent.getRotation());\n gl_matrix__WEBPACK_IMPORTED_MODULE_6__[/* quat */ "c"].invert(invParentRot, invParentRot);\n gl_matrix__WEBPACK_IMPORTED_MODULE_6__[/* quat */ "c"].copy(_this.localRotation, invParentRot);\n gl_matrix__WEBPACK_IMPORTED_MODULE_6__[/* quat */ "c"].mul(_this.localRotation, _this.localRotation, rotation);\n }\n\n _this.setLocalDirty(true);\n\n return _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_2___default()(_this);\n };\n }();\n\n return _this;\n }\n\n _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(TransformComponent, [{\n key: "setLocalPosition",\n value: function setLocalPosition(position) {\n gl_matrix__WEBPACK_IMPORTED_MODULE_6__[/* vec3 */ "e"].copy(this.localPosition, position);\n this.setLocalDirty(true);\n }\n }, {\n key: "setLocalScale",\n value: function setLocalScale(scale) {\n gl_matrix__WEBPACK_IMPORTED_MODULE_6__[/* vec3 */ "e"].copy(this.localScale, scale);\n this.setLocalDirty(true);\n }\n }, {\n key: "setLocalRotation",\n value: function setLocalRotation(rotation) {\n gl_matrix__WEBPACK_IMPORTED_MODULE_6__[/* quat */ "c"].copy(this.localRotation, rotation);\n this.setLocalDirty(true);\n return this;\n }\n }, {\n key: "isDirty",\n value: function isDirty() {\n return this.dirtyFlag;\n }\n }, {\n key: "setDirty",\n value: function setDirty() {\n var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n\n if (value) {\n this.dirtyFlag |= TransformComponent.DIRTY;\n } else {\n this.dirtyFlag &= ~TransformComponent.DIRTY;\n }\n }\n }, {\n key: "isLocalDirty",\n value: function isLocalDirty() {\n return this.localDirtyFlag;\n }\n }, {\n key: "setLocalDirty",\n value: function setLocalDirty() {\n var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n\n if (value) {\n this.localDirtyFlag |= TransformComponent.DIRTY;\n this.setDirty(true);\n } else {\n this.localDirtyFlag &= ~TransformComponent.DIRTY;\n }\n }\n }, {\n key: "updateTransform",\n value: function updateTransform() {\n if (this.isLocalDirty()) {\n this.getLocalTransform();\n }\n\n if (this.isDirty()) {\n if (this.parent === null) {\n gl_matrix__WEBPACK_IMPORTED_MODULE_6__[/* mat4 */ "b"].copy(this.worldTransform, this.getLocalTransform());\n this.setDirty(false);\n }\n }\n }\n }, {\n key: "updateTransformWithParent",\n value: function updateTransformWithParent(parent) {\n gl_matrix__WEBPACK_IMPORTED_MODULE_6__[/* mat4 */ "b"].multiply(this.worldTransform, parent.worldTransform, this.getLocalTransform());\n }\n }, {\n key: "applyTransform",\n value: function applyTransform() {\n this.setDirty();\n gl_matrix__WEBPACK_IMPORTED_MODULE_6__[/* mat4 */ "b"].getScaling(this.localScale, this.worldTransform);\n gl_matrix__WEBPACK_IMPORTED_MODULE_6__[/* mat4 */ "b"].getTranslation(this.localPosition, this.worldTransform);\n gl_matrix__WEBPACK_IMPORTED_MODULE_6__[/* mat4 */ "b"].getRotation(this.localRotation, this.worldTransform);\n }\n }, {\n key: "clearTransform",\n value: function clearTransform() {\n this.setDirty();\n this.localPosition = gl_matrix__WEBPACK_IMPORTED_MODULE_6__[/* vec3 */ "e"].fromValues(0, 0, 0);\n this.localRotation = gl_matrix__WEBPACK_IMPORTED_MODULE_6__[/* quat */ "c"].fromValues(0, 0, 0, 1);\n this.localScale = gl_matrix__WEBPACK_IMPORTED_MODULE_6__[/* vec3 */ "e"].fromValues(1, 1, 1);\n }\n }, {\n key: "scaleLocal",\n value: function scaleLocal(scaling) {\n this.setLocalDirty();\n gl_matrix__WEBPACK_IMPORTED_MODULE_6__[/* vec3 */ "e"].multiply(this.localScale, this.localScale, scaling);\n return this;\n }\n }, {\n key: "getLocalPosition",\n value: function getLocalPosition() {\n return this.localPosition;\n }\n }, {\n key: "getLocalRotation",\n value: function getLocalRotation() {\n return this.localRotation;\n }\n }, {\n key: "getLocalScale",\n value: function getLocalScale() {\n return this.localScale;\n }\n }, {\n key: "getLocalTransform",\n value: function getLocalTransform() {\n if (this.localDirtyFlag) {\n gl_matrix__WEBPACK_IMPORTED_MODULE_6__[/* mat4 */ "b"].fromRotationTranslationScale(this.localTransform, this.localRotation, this.localPosition, this.localScale);\n this.setLocalDirty(false);\n }\n\n return this.localTransform;\n }\n }, {\n key: "getWorldTransform",\n value: function getWorldTransform() {\n if (!this.isLocalDirty() && !this.isDirty()) {\n return this.worldTransform;\n }\n\n if (this.parent) {\n this.parent.getWorldTransform();\n }\n\n this.updateTransform();\n return this.worldTransform;\n }\n }, {\n key: "getPosition",\n value: function getPosition() {\n gl_matrix__WEBPACK_IMPORTED_MODULE_6__[/* mat4 */ "b"].getTranslation(this.position, this.worldTransform);\n return this.position;\n }\n }, {\n key: "getRotation",\n value: function getRotation() {\n gl_matrix__WEBPACK_IMPORTED_MODULE_6__[/* mat4 */ "b"].getRotation(this.rotation, this.worldTransform);\n return this.rotation;\n }\n }, {\n key: "getScale",\n value: function getScale() {\n gl_matrix__WEBPACK_IMPORTED_MODULE_6__[/* mat4 */ "b"].getScaling(this.scaling, this.worldTransform);\n return this.scaling;\n }\n }]);\n\n return TransformComponent;\n}(_ComponentManager__WEBPACK_IMPORTED_MODULE_7__[/* Component */ "a"]);\nTransformComponent.DIRTY = 1 << 0;\n//# sourceMappingURL=TransformComponent.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy13ZWJncHUtY29yZS9lcy9jb21wb25lbnRzL3NjZW5lZ3JhcGgvVHJhbnNmb3JtQ29tcG9uZW50LmpzPzE5Y2YiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQW9FO0FBQ047QUFDb0I7QUFDMUI7QUFDa0M7QUFDdEI7O0FBRXBFLGdDQUFnQyw2REFBNkQseUNBQXlDLGFBQWEsNEVBQWUsa0JBQWtCLGlDQUFpQyxpQkFBaUIsNEVBQWUsbUJBQW1CLHlEQUF5RCxFQUFFLE9BQU8sdUNBQXVDLEVBQUUsUUFBUSx1RkFBMEIsZUFBZSxHQUFHOztBQUV2YSxzQ0FBc0Msd0VBQXdFLDBDQUEwQyw4Q0FBOEMsTUFBTSx3RUFBd0UsR0FBRyxhQUFhLEVBQUUsWUFBWSxjQUFjLEVBQUU7O0FBRXJSO0FBQ007QUFDNUM7QUFDUCxFQUFFLHNFQUFTOztBQUVYOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQSxJQUFJLDRFQUFlOztBQUVuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEw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QTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVSxzREFBSTtBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxNQUFNLHNEQUFJO0FBQ1Y7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsTUFBTSxzREFBSTtBQUNWLE1BQU0sc0RBQUk7QUFDVixNQUFNLHNEQUFJO0FBQ1Y7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLHNEQUFJO0FBQy9CLDJCQUEyQixzREFBSTtBQUMvQix3QkFBd0Isc0RBQUk7QUFDNUI7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsTUFBTSxzREFBSTtBQUNWO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsUUFBUSxzREFBSTtBQUNaO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLE1BQU0sc0RBQUk7QUFDVjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxNQUFNLHNEQUFJO0FBQ1Y7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsTUFBTSxzREFBSTtBQUNWO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0EsQ0FBQyxDQUFDLG1FQUFTO0FBQ1g7QUFDQSIsImZpbGUiOiIxMzIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrXCI7XG5pbXBvcnQgX2NyZWF0ZUNsYXNzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzXCI7XG5pbXBvcnQgX2Fzc2VydFRoaXNJbml0aWFsaXplZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hc3NlcnRUaGlzSW5pdGlhbGl6ZWRcIjtcbmltcG9ydCBfaW5oZXJpdHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHNcIjtcbmltcG9ydCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuXCI7XG5pbXBvcnQgX2dldFByb3RvdHlwZU9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2dldFByb3RvdHlwZU9mXCI7XG5cbmZ1bmN0aW9uIF9jcmVhdGVTdXBlcihEZXJpdmVkKSB7IHZhciBoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0ID0gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpOyByZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKSB7IHZhciBTdXBlciA9IF9nZXRQcm90b3R5cGVPZihEZXJpdmVkKSwgcmVzdWx0OyBpZiAoaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCkgeyB2YXIgTmV3VGFyZ2V0ID0gX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yOyByZXN1bHQgPSBSZWZsZWN0LmNvbnN0cnVjdChTdXBlciwgYXJndW1lbnRzLCBOZXdUYXJnZXQpOyB9IGVsc2UgeyByZXN1bHQgPSBTdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9IHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCByZXN1bHQpOyB9OyB9XG5cbmZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7IGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpIHJldHVybiBmYWxzZTsgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTsgaWYgKHR5cGVvZiBQcm94eSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdHJ1ZTsgdHJ5IHsgRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLCBbXSwgZnVuY3Rpb24gKCkge30pKTsgcmV0dXJuIHRydWU7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9IH1cblxuaW1wb3J0IHsgbWF0NCwgcXVhdCwgdmVjMyB9IGZyb20gJ2dsLW1hdHJpeCc7XG5pbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tICcuLi8uLi9Db21wb25lbnRNYW5hZ2VyJztcbmV4cG9ydCB2YXIgVHJhbnNmb3JtQ29tcG9uZW50ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0cyhUcmFuc2Zvcm1Db21wb25lbnQsIF9Db21wb25lbnQpO1xuXG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoVHJhbnNmb3JtQ29tcG9uZW50KTtcblxuICAvKipcbiAgICogbG9jYWwgc3BhY2UgUlRTXG4gICAqL1xuXG4gIC8qKlxuICAgKiBYTUZMT0FUNFg0Ll80MVxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3dpbmRvd3Mvd2luMzIvYXBpL2RpcmVjdHhtYXRoL25mLWRpcmVjdHhtYXRoLXhtZmxvYXQ0eDQteG1mbG9hdDR4NChjb25zdGZsb2F0KSNyZW1hcmtzXG4gICAqL1xuXG4gIC8qKlxuICAgKiB3b3JsZCBzcGFjZSBSVFNcbiAgICovXG4gIC8vIOmrmOmYtuWHveaVsO+8jOWIqeeUqOmXreWMhemHjeWkjeWIqeeUqOS4tOaXtuWPmOmHj1xuICAvLyBAc2VlIHBsYXljYW52YXMgZ3JhcGggbm9kZVxuXG4gIC8qKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3dpbmRvd3Mvd2luMzIvYXBpL2RpcmVjdHhtYXRoL25mLWRpcmVjdHhtYXRoLXhtcXVhdGVybmlvbnJvdGF0aW9ucm9sbHBpdGNoeWF3XG4gICAqL1xuXG4gIC8qKlxuICAgKiBAc2VlIGh0dHBzOi8veGlhb2l2ZXIuZ2l0aHViLmlvL2NvZGluZy8yMDE4LzEyLzI4L0NhbWVyYS0lRTglQUUlQkUlRTglQUUlQTEtJUU0JUI4JTgwLmh0bWxcbiAgICovXG5cbiAgLyoqXG4gICAqIFRPRE86IOaUr+aMgeS7peS4i+S4pOenje+8mlxuICAgKiAqIHRyYW5zbGF0ZSh4LCB5LCB6KVxuICAgKiAqIHRyYW5zbGF0ZSh2ZWMzKHgsIHksIHopKVxuICAgKi9cblxuICAvKipcbiAgICogQHNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9DZW50cmlwZXRhbF9DYXRtdWxsJUUyJTgwJTkzUm9tX3NwbGluZVxuICAgKi9cbiAgLy8gcHVibGljIGNhdG11bGxSb20gPSAoKCkgPT4ge1xuICAvLyAgIGNvbnN0IGFTID0gdmVjMy5jcmVhdGUoKTtcbiAgLy8gICBjb25zdCBhUiA9IHF1YXQuY3JlYXRlKCk7XG4gIC8vICAgY29uc3QgYVQgPSB2ZWMzLmNyZWF0ZSgpO1xuICAvLyAgIGNvbnN0IGJTID0gdmVjMy5jcmVhdGUoKTtcbiAgLy8gICBjb25zdCBiUiA9IHF1YXQuY3JlYXRlKCk7XG4gIC8vICAgY29uc3QgYlQgPSB2ZWMzLmNyZWF0ZSgpO1xuICAvLyAgIGNvbnN0IGNTID0gdmVjMy5jcmVhdGUoKTtcbiAgLy8gICBjb25zdCBjUiA9IHF1YXQuY3JlYXRlKCk7XG4gIC8vICAgY29uc3QgY1QgPSB2ZWMzLmNyZWF0ZSgpO1xuICAvLyAgIGNvbnN0IGRTID0gdmVjMy5jcmVhdGUoKTtcbiAgLy8gICBjb25zdCBkUiA9IHF1YXQuY3JlYXRlKCk7XG4gIC8vICAgY29uc3QgZFQgPSB2ZWMzLmNyZWF0ZSgpO1xuICAvLyAgIGNvbnN0IFIgPSBxdWF0LmNyZWF0ZSgpO1xuICAvLyAgIHJldHVybiAoXG4gIC8vICAgICBhOiBUcmFuc2Zvcm1Db21wb25lbnQsXG4gIC8vICAgICBiOiBUcmFuc2Zvcm1Db21wb25lbnQsXG4gIC8vICAgICBjOiBUcmFuc2Zvcm1Db21wb25lbnQsXG4gIC8vICAgICBkOiBUcmFuc2Zvcm1Db21wb25lbnQsXG4gIC8vICAgICB0OiBudW1iZXIsXG4gIC8vICAgKSA9PiB7XG4gIC8vICAgICB0aGlzLnNldERpcnR5KCk7XG4gIC8vICAgICBtYXQ0LmdldFNjYWxpbmcoYVMsIGEud29ybGRUcmFuc2Zvcm0pO1xuICAvLyAgICAgbWF0NC5nZXRUcmFuc2xhdGlvbihhVCwgYS53b3JsZFRyYW5zZm9ybSk7XG4gIC8vICAgICBtYXQ0LmdldFJvdGF0aW9uKGFSLCBhLndvcmxkVHJhbnNmb3JtKTtcbiAgLy8gICAgIG1hdDQuZ2V0U2NhbGluZyhiUywgYi53b3JsZFRyYW5zZm9ybSk7XG4gIC8vICAgICBtYXQ0LmdldFRyYW5zbGF0aW9uKGJULCBiLndvcmxkVHJhbnNmb3JtKTtcbiAgLy8gICAgIG1hdDQuZ2V0Um90YXRpb24oYlIsIGIud29ybGRUcmFuc2Zvcm0pO1xuICAvLyAgICAgbWF0NC5nZXRTY2FsaW5nKGNTLCBjLndvcmxkVHJhbnNmb3JtKTtcbiAgLy8gICAgIG1hdDQuZ2V0VHJhbnNsYXRpb24oY1QsIGMud29ybGRUcmFuc2Zvcm0pO1xuICAvLyAgICAgbWF0NC5nZXRSb3RhdGlvbihjUiwgYy53b3JsZFRyYW5zZm9ybSk7XG4gIC8vICAgICBtYXQ0LmdldFNjYWxpbmcoZFMsIGQud29ybGRUcmFuc2Zvcm0pO1xuICAvLyAgICAgbWF0NC5nZXRUcmFuc2xhdGlvbihkVCwgZC53b3JsZFRyYW5zZm9ybSk7XG4gIC8vICAgICBtYXQ0LmdldFJvdGF0aW9uKGRSLCBkLndvcmxkVHJhbnNmb3JtKTtcbiAgLy8gICAgIHZlYzMuY2F0bXVsbFJvbSh0aGlzLmxvY2FsUG9zaXRpb24sIGFULCBiVCwgY1QsIGRULCB0KTtcbiAgLy8gICAgIHZlYzMuY2F0bXVsbFJvbShSLCBhUiwgYlIsIGNSLCBkUiwgdCk7XG4gIC8vICAgICBxdWF0Lm5vcm1hbGl6ZSh0aGlzLmxvY2FsUm90YXRpb24sIFIpO1xuICAvLyAgICAgdmVjMy5jYXRtdWxsUm9tKHRoaXMubG9jYWxTY2FsZSwgYVMsIGJTLCBjUywgZFMsIHQpO1xuICAvLyAgIH07XG4gIC8vIH0pKCk7XG4gIGZ1bmN0aW9uIFRyYW5zZm9ybUNvbXBvbmVudChkYXRhKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFRyYW5zZm9ybUNvbXBvbmVudCk7XG5cbiAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIGRhdGEpO1xuICAgIF90aGlzLmRpcnR5RmxhZyA9IHZvaWQgMDtcbiAgICBfdGhpcy5sb2NhbERpcnR5RmxhZyA9IHZvaWQgMDtcbiAgICBfdGhpcy5wYXJlbnQgPSBudWxsO1xuICAgIF90aGlzLmxvY2FsUG9zaXRpb24gPSB2ZWMzLmZyb21WYWx1ZXMoMCwgMCwgMCk7XG4gICAgX3RoaXMubG9jYWxSb3RhdGlvbiA9IHF1YXQuZnJvbVZhbHVlcygwLCAwLCAwLCAxKTtcbiAgICBfdGhpcy5sb2NhbFNjYWxlID0gdmVjMy5mcm9tVmFsdWVzKDEsIDEsIDEpO1xuICAgIF90aGlzLmxvY2FsVHJhbnNmb3JtID0gbWF0NC5jcmVhdGUoKTtcbiAgICBfdGhpcy5wb3NpdGlvbiA9IHZlYzMuZnJvbVZhbHVlcygwLCAwLCAwKTtcbiAgICBfdGhpcy5yb3RhdGlvbiA9IHF1YXQuZnJvbVZhbHVlcygwLCAwLCAwLCAxKTtcbiAgICBfdGhpcy5zY2FsaW5nID0gdmVjMy5mcm9tVmFsdWVzKDEsIDEsIDEpO1xuICAgIF90aGlzLndvcmxkVHJhbnNmb3JtID0gbWF0NC5jcmVhdGUoKTtcblxuICAgIF90aGlzLm1hdHJpeFRyYW5zZm9ybSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciB0cmFuc2Zvcm1lZCA9IG1hdDQuY3JlYXRlKCk7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKG1hdCkge1xuICAgICAgICBtYXQ0Lm11bHRpcGx5KHRyYW5zZm9ybWVkLCBfdGhpcy5nZXRMb2NhbFRyYW5zZm9ybSgpLCBtYXQpO1xuICAgICAgICBtYXQ0LmdldFNjYWxpbmcoX3RoaXMubG9jYWxTY2FsZSwgdHJhbnNmb3JtZWQpO1xuICAgICAgICBtYXQ0LmdldFRyYW5zbGF0aW9uKF90aGlzLmxvY2FsUG9zaXRpb24sIHRyYW5zZm9ybWVkKTtcbiAgICAgICAgbWF0NC5nZXRSb3RhdGlvbihfdGhpcy5sb2NhbFJvdGF0aW9uLCB0cmFuc2Zvcm1lZCk7XG4gICAgICB9O1xuICAgIH0oKTtcblxuICAgIF90aGlzLnJvdGF0ZVJvbGxQaXRjaFlhdyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBxdWF0WCA9IHF1YXQuY3JlYXRlKCk7XG4gICAgICB2YXIgcXVhdFkgPSBxdWF0LmNyZWF0ZSgpO1xuICAgICAgdmFyIHF1YXRaID0gcXVhdC5jcmVhdGUoKTtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoeCwgeSwgeikge1xuICAgICAgICBfdGhpcy5zZXREaXJ0eSgpO1xuXG4gICAgICAgIHF1YXQuZnJvbUV1bGVyKHF1YXRYLCB4LCAwLCAwKTtcbiAgICAgICAgcXVhdC5mcm9tRXVsZXIocXVhdFksIDAsIHksIDApO1xuICAgICAgICBxdWF0LmZyb21FdWxlcihxdWF0WiwgMCwgMCwgeik7XG4gICAgICAgIHF1YXQubXVsdGlwbHkoX3RoaXMubG9jYWxSb3RhdGlvbiwgcXVhdFgsIF90aGlzLmxvY2FsUm90YXRpb24pO1xuICAgICAgICBxdWF0Lm11bHRpcGx5KF90aGlzLmxvY2FsUm90YXRpb24sIF90aGlzLmxvY2FsUm90YXRpb24sIHF1YXRZKTtcbiAgICAgICAgcXVhdC5tdWx0aXBseShfdGhpcy5sb2NhbFJvdGF0aW9uLCBxdWF0WiwgX3RoaXMubG9jYWxSb3RhdGlvbik7XG4gICAgICAgIHF1YXQubm9ybWFsaXplKF90aGlzLmxvY2FsUm90YXRpb24sIF90aGlzLmxvY2FsUm90YXRpb24pO1xuICAgICAgfTtcbiAgICB9KCk7XG5cbiAgICBfdGhpcy5sZXJwID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGFTID0gdmVjMy5jcmVhdGUoKTtcbiAgICAgIHZhciBhUiA9IHF1YXQuY3JlYXRlKCk7XG4gICAgICB2YXIgYVQgPSB2ZWMzLmNyZWF0ZSgpO1xuICAgICAgdmFyIGJTID0gdmVjMy5jcmVhdGUoKTtcbiAgICAgIHZhciBiUiA9IHF1YXQuY3JlYXRlKCk7XG4gICAgICB2YXIgYlQgPSB2ZWMzLmNyZWF0ZSgpO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhLCBiLCB0KSB7XG4gICAgICAgIF90aGlzLnNldERpcnR5KCk7XG5cbiAgICAgICAgbWF0NC5nZXRTY2FsaW5nKGFTLCBhLndvcmxkVHJhbnNmb3JtKTtcbiAgICAgICAgbWF0NC5nZXRUcmFuc2xhdGlvbihhVCwgYS53b3JsZFRyYW5zZm9ybSk7XG4gICAgICAgIG1hdDQuZ2V0Um90YXRpb24oYVIsIGEud29ybGRUcmFuc2Zvcm0pO1xuICAgICAgICBtYXQ0LmdldFNjYWxpbmcoYlMsIGIud29ybGRUcmFuc2Zvcm0pO1xuICAgICAgICBtYXQ0LmdldFRyYW5zbGF0aW9uKGJULCBiLndvcmxkVHJhbnNmb3JtKTtcbiAgICAgICAgbWF0NC5nZXRSb3RhdGlvbihiUiwgYi53b3JsZFRyYW5zZm9ybSk7XG4gICAgICAgIHZlYzMubGVycChfdGhpcy5sb2NhbFNjYWxlLCBhUywgYlMsIHQpO1xuICAgICAgICBxdWF0LnNsZXJwKF90aGlzLmxvY2FsUm90YXRpb24sIGFSLCBiUiwgdCk7XG4gICAgICAgIHZlYzMubGVycChfdGhpcy5sb2NhbFBvc2l0aW9uLCBhVCwgYlQsIHQpO1xuICAgICAgfTtcbiAgICB9KCk7XG5cbiAgICBfdGhpcy50cmFuc2xhdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgdHIgPSB2ZWMzLmNyZWF0ZSgpO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uICh0cmFuc2xhdGlvbikge1xuICAgICAgICB2ZWMzLmFkZCh0ciwgX3RoaXMuZ2V0UG9zaXRpb24oKSwgdHJhbnNsYXRpb24pO1xuXG4gICAgICAgIF90aGlzLnNldFBvc2l0aW9uKHRyKTtcblxuICAgICAgICBfdGhpcy5zZXREaXJ0eSh0cnVlKTtcblxuICAgICAgICByZXR1cm4gX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyk7XG4gICAgICB9O1xuICAgIH0oKTtcblxuICAgIF90aGlzLnRyYW5zbGF0ZUxvY2FsID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uICh0cmFuc2xhdGlvbikge1xuICAgICAgICB2ZWMzLnRyYW5zZm9ybVF1YXQodHJhbnNsYXRpb24sIHRyYW5zbGF0aW9uLCBfdGhpcy5sb2NhbFJvdGF0aW9uKTtcbiAgICAgICAgdmVjMy5hZGQoX3RoaXMubG9jYWxQb3NpdGlvbiwgX3RoaXMubG9jYWxQb3NpdGlvbiwgdHJhbnNsYXRpb24pO1xuXG4gICAgICAgIF90aGlzLnNldExvY2FsRGlydHkodHJ1ZSk7XG5cbiAgICAgICAgcmV0dXJuIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpO1xuICAgICAgfTtcbiAgICB9KCk7XG5cbiAgICBfdGhpcy5zZXRQb3NpdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBwYXJlbnRJbnZlcnRNYXRyaXggPSBtYXQ0LmNyZWF0ZSgpO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChwb3NpdGlvbikge1xuICAgICAgICBfdGhpcy5wb3NpdGlvbiA9IHBvc2l0aW9uO1xuXG4gICAgICAgIF90aGlzLnNldExvY2FsRGlydHkodHJ1ZSk7XG5cbiAgICAgICAgaWYgKF90aGlzLnBhcmVudCA9PT0gbnVsbCkge1xuICAgICAgICAgIHZlYzMuY29weShfdGhpcy5sb2NhbFBvc2l0aW9uLCBwb3NpdGlvbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbWF0NC5jb3B5KHBhcmVudEludmVydE1hdHJpeCwgX3RoaXMucGFyZW50LndvcmxkVHJhbnNmb3JtKTtcbiAgICAgICAgICBtYXQ0LmludmVydChwYXJlbnRJbnZlcnRNYXRyaXgsIHBhcmVudEludmVydE1hdHJpeCk7XG4gICAgICAgICAgdmVjMy50cmFuc2Zvcm1NYXQ0KF90aGlzLmxvY2FsUG9zaXRpb24sIHBvc2l0aW9uLCBwYXJlbnRJbnZlcnRNYXRyaXgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpO1xuICAgICAgfTtcbiAgICB9KCk7XG5cbiAgICBfdGhpcy5yb3RhdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgcGFyZW50SW52ZXJ0Um90YXRpb24gPSBxdWF0LmNyZWF0ZSgpO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChxdWF0ZXJuaW9uKSB7XG4gICAgICAgIGlmIChfdGhpcy5wYXJlbnQgPT09IG51bGwpIHtcbiAgICAgICAgICBxdWF0Lm11bHRpcGx5KF90aGlzLmxvY2FsUm90YXRpb24sIF90aGlzLmxvY2FsUm90YXRpb24sIHF1YXRlcm5pb24pO1xuICAgICAgICAgIHF1YXQubm9ybWFsaXplKF90aGlzLmxvY2FsUm90YXRpb24sIF90aGlzLmxvY2FsUm90YXRpb24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciByb3QgPSBfdGhpcy5nZXRSb3RhdGlvbigpO1xuXG4gICAgICAgICAgdmFyIHBhcmVudFJvdCA9IF90aGlzLnBhcmVudC5nZXRSb3RhdGlvbigpO1xuXG4gICAgICAgICAgcXVhdC5jb3B5KHBhcmVudEludmVydFJvdGF0aW9uLCBwYXJlbnRSb3QpO1xuICAgICAgICAgIHF1YXQuaW52ZXJ0KHBhcmVudEludmVydFJvdGF0aW9uLCBwYXJlbnRJbnZlcnRSb3RhdGlvbik7XG4gICAgICAgICAgcXVhdC5tdWx0aXBseShwYXJlbnRJbnZlcnRSb3RhdGlvbiwgcGFyZW50SW52ZXJ0Um90YXRpb24sIHF1YXRlcm5pb24pO1xuICAgICAgICAgIHF1YXQubXVsdGlwbHkoX3RoaXMubG9jYWxSb3RhdGlvbiwgcXVhdGVybmlvbiwgcm90KTtcbiAgICAgICAgICBxdWF0Lm5vcm1hbGl6ZShfdGhpcy5sb2NhbFJvdGF0aW9uLCBfdGhpcy5sb2NhbFJvdGF0aW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIF90aGlzLnNldExvY2FsRGlydHkoKTtcblxuICAgICAgICByZXR1cm4gX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyk7XG4gICAgICB9O1xuICAgIH0oKTtcblxuICAgIF90aGlzLnJvdGF0ZUxvY2FsID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChxdWF0ZXJuaW9uKSB7XG4gICAgICAgIHF1YXQubXVsdGlwbHkoX3RoaXMubG9jYWxSb3RhdGlvbiwgX3RoaXMubG9jYWxSb3RhdGlvbiwgcXVhdGVybmlvbik7XG4gICAgICAgIHF1YXQubm9ybWFsaXplKF90aGlzLmxvY2FsUm90YXRpb24sIF90aGlzLmxvY2FsUm90YXRpb24pO1xuXG4gICAgICAgIF90aGlzLnNldExvY2FsRGlydHkodHJ1ZSk7XG5cbiAgICAgICAgcmV0dXJuIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpO1xuICAgICAgfTtcbiAgICB9KCk7XG5cbiAgICBfdGhpcy5zZXRSb3RhdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBpbnZQYXJlbnRSb3QgPSBxdWF0LmNyZWF0ZSgpO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChyb3RhdGlvbikge1xuICAgICAgICBpZiAoX3RoaXMucGFyZW50ID09PSBudWxsKSB7XG4gICAgICAgICAgcXVhdC5jb3B5KF90aGlzLmxvY2FsUm90YXRpb24sIHJvdGF0aW9uKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBxdWF0LmNvcHkoaW52UGFyZW50Um90LCBfdGhpcy5wYXJlbnQuZ2V0Um90YXRpb24oKSk7XG4gICAgICAgICAgcXVhdC5pbnZlcnQoaW52UGFyZW50Um90LCBpbnZQYXJlbnRSb3QpO1xuICAgICAgICAgIHF1YXQuY29weShfdGhpcy5sb2NhbFJvdGF0aW9uLCBpbnZQYXJlbnRSb3QpO1xuICAgICAgICAgIHF1YXQubXVsKF90aGlzLmxvY2FsUm90YXRpb24sIF90aGlzLmxvY2FsUm90YXRpb24sIHJvdGF0aW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIF90aGlzLnNldExvY2FsRGlydHkodHJ1ZSk7XG5cbiAgICAgICAgcmV0dXJuIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpO1xuICAgICAgfTtcbiAgICB9KCk7XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoVHJhbnNmb3JtQ29tcG9uZW50LCBbe1xuICAgIGtleTogXCJzZXRMb2NhbFBvc2l0aW9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldExvY2FsUG9zaXRpb24ocG9zaXRpb24pIHtcbiAgICAgIHZlYzMuY29weSh0aGlzLmxvY2FsUG9zaXRpb24sIHBvc2l0aW9uKTtcbiAgICAgIHRoaXMuc2V0TG9jYWxEaXJ0eSh0cnVlKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2V0TG9jYWxTY2FsZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRMb2NhbFNjYWxlKHNjYWxlKSB7XG4gICAgICB2ZWMzLmNvcHkodGhpcy5sb2NhbFNjYWxlLCBzY2FsZSk7XG4gICAgICB0aGlzLnNldExvY2FsRGlydHkodHJ1ZSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNldExvY2FsUm90YXRpb25cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0TG9jYWxSb3RhdGlvbihyb3RhdGlvbikge1xuICAgICAgcXVhdC5jb3B5KHRoaXMubG9jYWxSb3RhdGlvbiwgcm90YXRpb24pO1xuICAgICAgdGhpcy5zZXRMb2NhbERpcnR5KHRydWUpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImlzRGlydHlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaXNEaXJ0eSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmRpcnR5RmxhZztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2V0RGlydHlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0RGlydHkoKSB7XG4gICAgICB2YXIgdmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHRydWU7XG5cbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICB0aGlzLmRpcnR5RmxhZyB8PSBUcmFuc2Zvcm1Db21wb25lbnQuRElSVFk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmRpcnR5RmxhZyAmPSB+VHJhbnNmb3JtQ29tcG9uZW50LkRJUlRZO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpc0xvY2FsRGlydHlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaXNMb2NhbERpcnR5KCkge1xuICAgICAgcmV0dXJuIHRoaXMubG9jYWxEaXJ0eUZsYWc7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNldExvY2FsRGlydHlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0TG9jYWxEaXJ0eSgpIHtcbiAgICAgIHZhciB2YWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogdHJ1ZTtcblxuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIHRoaXMubG9jYWxEaXJ0eUZsYWcgfD0gVHJhbnNmb3JtQ29tcG9uZW50LkRJUlRZO1xuICAgICAgICB0aGlzLnNldERpcnR5KHRydWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5sb2NhbERpcnR5RmxhZyAmPSB+VHJhbnNmb3JtQ29tcG9uZW50LkRJUlRZO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ1cGRhdGVUcmFuc2Zvcm1cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdXBkYXRlVHJhbnNmb3JtKCkge1xuICAgICAgaWYgKHRoaXMuaXNMb2NhbERpcnR5KCkpIHtcbiAgICAgICAgdGhpcy5nZXRMb2NhbFRyYW5zZm9ybSgpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5pc0RpcnR5KCkpIHtcbiAgICAgICAgaWYgKHRoaXMucGFyZW50ID09PSBudWxsKSB7XG4gICAgICAgICAgbWF0NC5jb3B5KHRoaXMud29ybGRUcmFuc2Zvcm0sIHRoaXMuZ2V0TG9jYWxUcmFuc2Zvcm0oKSk7XG4gICAgICAgICAgdGhpcy5zZXREaXJ0eShmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidXBkYXRlVHJhbnNmb3JtV2l0aFBhcmVudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB1cGRhdGVUcmFuc2Zvcm1XaXRoUGFyZW50KHBhcmVudCkge1xuICAgICAgbWF0NC5tdWx0aXBseSh0aGlzLndvcmxkVHJhbnNmb3JtLCBwYXJlbnQud29ybGRUcmFuc2Zvcm0sIHRoaXMuZ2V0TG9jYWxUcmFuc2Zvcm0oKSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImFwcGx5VHJhbnNmb3JtXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFwcGx5VHJhbnNmb3JtKCkge1xuICAgICAgdGhpcy5zZXREaXJ0eSgpO1xuICAgICAgbWF0NC5nZXRTY2FsaW5nKHRoaXMubG9jYWxTY2FsZSwgdGhpcy53b3JsZFRyYW5zZm9ybSk7XG4gICAgICBtYXQ0LmdldFRyYW5zbGF0aW9uKHRoaXMubG9jYWxQb3NpdGlvbiwgdGhpcy53b3JsZFRyYW5zZm9ybSk7XG4gICAgICBtYXQ0LmdldFJvdGF0aW9uKHRoaXMubG9jYWxSb3RhdGlvbiwgdGhpcy53b3JsZFRyYW5zZm9ybSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNsZWFyVHJhbnNmb3JtXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNsZWFyVHJhbnNmb3JtKCkge1xuICAgICAgdGhpcy5zZXREaXJ0eSgpO1xuICAgICAgdGhpcy5sb2NhbFBvc2l0aW9uID0gdmVjMy5mcm9tVmFsdWVzKDAsIDAsIDApO1xuICAgICAgdGhpcy5sb2NhbFJvdGF0aW9uID0gcXVhdC5mcm9tVmFsdWVzKDAsIDAsIDAsIDEpO1xuICAgICAgdGhpcy5sb2NhbFNjYWxlID0gdmVjMy5mcm9tVmFsdWVzKDEsIDEsIDEpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzY2FsZUxvY2FsXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNjYWxlTG9jYWwoc2NhbGluZykge1xuICAgICAgdGhpcy5zZXRMb2NhbERpcnR5KCk7XG4gICAgICB2ZWMzLm11bHRpcGx5KHRoaXMubG9jYWxTY2FsZSwgdGhpcy5sb2NhbFNjYWxlLCBzY2FsaW5nKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRMb2NhbFBvc2l0aW9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldExvY2FsUG9zaXRpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5sb2NhbFBvc2l0aW9uO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRMb2NhbFJvdGF0aW9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldExvY2FsUm90YXRpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5sb2NhbFJvdGF0aW9uO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRMb2NhbFNjYWxlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldExvY2FsU2NhbGUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5sb2NhbFNjYWxlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRMb2NhbFRyYW5zZm9ybVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRMb2NhbFRyYW5zZm9ybSgpIHtcbiAgICAgIGlmICh0aGlzLmxvY2FsRGlydHlGbGFnKSB7XG4gICAgICAgIG1hdDQuZnJvbVJvdGF0aW9uVHJhbnNsYXRpb25TY2FsZSh0aGlzLmxvY2FsVHJhbnNmb3JtLCB0aGlzLmxvY2FsUm90YXRpb24sIHRoaXMubG9jYWxQb3NpdGlvbiwgdGhpcy5sb2NhbFNjYWxlKTtcbiAgICAgICAgdGhpcy5zZXRMb2NhbERpcnR5KGZhbHNlKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMubG9jYWxUcmFuc2Zvcm07XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldFdvcmxkVHJhbnNmb3JtXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFdvcmxkVHJhbnNmb3JtKCkge1xuICAgICAgaWYgKCF0aGlzLmlzTG9jYWxEaXJ0eSgpICYmICF0aGlzLmlzRGlydHkoKSkge1xuICAgICAgICByZXR1cm4gdGhpcy53b3JsZFRyYW5zZm9ybTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMucGFyZW50KSB7XG4gICAgICAgIHRoaXMucGFyZW50LmdldFdvcmxkVHJhbnNmb3JtKCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMudXBkYXRlVHJhbnNmb3JtKCk7XG4gICAgICByZXR1cm4gdGhpcy53b3JsZFRyYW5zZm9ybTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0UG9zaXRpb25cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0UG9zaXRpb24oKSB7XG4gICAgICBtYXQ0LmdldFRyYW5zbGF0aW9uKHRoaXMucG9zaXRpb24sIHRoaXMud29ybGRUcmFuc2Zvcm0pO1xuICAgICAgcmV0dXJuIHRoaXMucG9zaXRpb247XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldFJvdGF0aW9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFJvdGF0aW9uKCkge1xuICAgICAgbWF0NC5nZXRSb3RhdGlvbih0aGlzLnJvdGF0aW9uLCB0aGlzLndvcmxkVHJhbnNmb3JtKTtcbiAgICAgIHJldHVybiB0aGlzLnJvdGF0aW9uO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRTY2FsZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRTY2FsZSgpIHtcbiAgICAgIG1hdDQuZ2V0U2NhbGluZyh0aGlzLnNjYWxpbmcsIHRoaXMud29ybGRUcmFuc2Zvcm0pO1xuICAgICAgcmV0dXJuIHRoaXMuc2NhbGluZztcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gVHJhbnNmb3JtQ29tcG9uZW50O1xufShDb21wb25lbnQpO1xuVHJhbnNmb3JtQ29tcG9uZW50LkRJUlRZID0gMSA8PCAwO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VHJhbnNmb3JtQ29tcG9uZW50LmpzLm1hcCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///132\n')},function(module,__webpack_exports__,__webpack_require__){"use strict";eval('/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return ConfigService; });\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6);\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(7);\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var inversify__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(5);\n/* harmony import */ var inversify__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(inversify__WEBPACK_IMPORTED_MODULE_2__);\n\n\n\nvar _dec, _class, _temp;\n\n\nvar ConfigService = (_dec = Object(inversify__WEBPACK_IMPORTED_MODULE_2__["injectable"])(), _dec(_class = (_temp = /*#__PURE__*/function () {\n function ConfigService() {\n _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, ConfigService);\n\n this.config = void 0;\n }\n\n _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(ConfigService, [{\n key: "get",\n value: function get() {\n return this.config;\n }\n }, {\n key: "set",\n value: function set(config) {\n this.config = config;\n }\n }]);\n\n return ConfigService;\n}(), _temp)) || _class);\n//# sourceMappingURL=ConfigService.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy13ZWJncHUtY29yZS9lcy9zZXJ2aWNlcy9jb25maWcvQ29uZmlnU2VydmljZS5qcz8zMjdmIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQW9FO0FBQ047O0FBRTlEOztBQUV1QztBQUNoQyw0QkFBNEIsNERBQVU7QUFDN0M7QUFDQSxJQUFJLDRFQUFlOztBQUVuQjtBQUNBOztBQUVBLEVBQUUseUVBQVk7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQSxDQUFDO0FBQ0QiLCJmaWxlIjoiMTMzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzc1wiO1xuXG52YXIgX2RlYywgX2NsYXNzLCBfdGVtcDtcblxuaW1wb3J0IHsgaW5qZWN0YWJsZSB9IGZyb20gJ2ludmVyc2lmeSc7XG5leHBvcnQgdmFyIENvbmZpZ1NlcnZpY2UgPSAoX2RlYyA9IGluamVjdGFibGUoKSwgX2RlYyhfY2xhc3MgPSAoX3RlbXAgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBDb25maWdTZXJ2aWNlKCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBDb25maWdTZXJ2aWNlKTtcblxuICAgIHRoaXMuY29uZmlnID0gdm9pZCAwO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKENvbmZpZ1NlcnZpY2UsIFt7XG4gICAga2V5OiBcImdldFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb25maWc7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNldFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXQoY29uZmlnKSB7XG4gICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gQ29uZmlnU2VydmljZTtcbn0oKSwgX3RlbXApKSB8fCBfY2xhc3MpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q29uZmlnU2VydmljZS5qcy5tYXAiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///133\n')},function(module,__webpack_exports__,__webpack_require__){"use strict";eval('/* unused harmony export IInteractorEvent */\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return InteractorService; });\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6);\n/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(7);\n/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var inversify__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(5);\n/* harmony import */ var inversify__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(inversify__WEBPACK_IMPORTED_MODULE_2__);\n\n\n\nvar _dec, _class;\n\n\nvar IInteractorEvent;\n\n(function (IInteractorEvent) {\n IInteractorEvent["PANSTART"] = "PANSTART";\n IInteractorEvent["PANEND"] = "PANEND";\n IInteractorEvent["PANMOVE"] = "PANMOVE";\n IInteractorEvent["PINCH"] = "PINCH";\n IInteractorEvent["KEYDOWN"] = "KEYDOWN";\n IInteractorEvent["KEYUP"] = "KEYUP";\n IInteractorEvent["HOVER"] = "HOVER";\n})(IInteractorEvent || (IInteractorEvent = {}));\n\nvar InteractorService = (_dec = Object(inversify__WEBPACK_IMPORTED_MODULE_2__["injectable"])(), _dec(_class = /*#__PURE__*/function () {\n function InteractorService() {\n _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, InteractorService);\n }\n\n _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(InteractorService, [{\n key: "listen",\n value: function listen(canvas) {}\n }, {\n key: "on",\n value: function on(event, args) {}\n }, {\n key: "connect",\n value: function connect() {}\n }, {\n key: "disconnect",\n value: function disconnect() {}\n }, {\n key: "destroy",\n value: function destroy() {}\n }]);\n\n return InteractorService;\n}()) || _class);\n//# sourceMappingURL=IteractorService.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy13ZWJncHUtY29yZS9lcy9zZXJ2aWNlcy9pbnRlcmFjdG9yL0l0ZXJhY3RvclNlcnZpY2UuanM/MmM2NCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQW9FO0FBQ047O0FBRTlEOztBQUV1QztBQUNoQzs7QUFFUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyw0Q0FBNEM7O0FBRXRDLGdDQUFnQyw0REFBVTtBQUNqRDtBQUNBLElBQUksNEVBQWU7QUFDbkI7O0FBRUEsRUFBRSx5RUFBWTtBQUNkO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQSxDQUFDO0FBQ0QiLCJmaWxlIjoiMTM0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzc1wiO1xuXG52YXIgX2RlYywgX2NsYXNzO1xuXG5pbXBvcnQgeyBpbmplY3RhYmxlIH0gZnJvbSAnaW52ZXJzaWZ5JztcbmV4cG9ydCB2YXIgSUludGVyYWN0b3JFdmVudDtcblxuKGZ1bmN0aW9uIChJSW50ZXJhY3RvckV2ZW50KSB7XG4gIElJbnRlcmFjdG9yRXZlbnRbXCJQQU5TVEFSVFwiXSA9IFwiUEFOU1RBUlRcIjtcbiAgSUludGVyYWN0b3JFdmVudFtcIlBBTkVORFwiXSA9IFwiUEFORU5EXCI7XG4gIElJbnRlcmFjdG9yRXZlbnRbXCJQQU5NT1ZFXCJdID0gXCJQQU5NT1ZFXCI7XG4gIElJbnRlcmFjdG9yRXZlbnRbXCJQSU5DSFwiXSA9IFwiUElOQ0hcIjtcbiAgSUludGVyYWN0b3JFdmVudFtcIktFWURPV05cIl0gPSBcIktFWURPV05cIjtcbiAgSUludGVyYWN0b3JFdmVudFtcIktFWVVQXCJdID0gXCJLRVlVUFwiO1xuICBJSW50ZXJhY3RvckV2ZW50W1wiSE9WRVJcIl0gPSBcIkhPVkVSXCI7XG59KShJSW50ZXJhY3RvckV2ZW50IHx8IChJSW50ZXJhY3RvckV2ZW50ID0ge30pKTtcblxuZXhwb3J0IHZhciBJbnRlcmFjdG9yU2VydmljZSA9IChfZGVjID0gaW5qZWN0YWJsZSgpLCBfZGVjKF9jbGFzcyA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEludGVyYWN0b3JTZXJ2aWNlKCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBJbnRlcmFjdG9yU2VydmljZSk7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoSW50ZXJhY3RvclNlcnZpY2UsIFt7XG4gICAga2V5OiBcImxpc3RlblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBsaXN0ZW4oY2FudmFzKSB7fVxuICB9LCB7XG4gICAga2V5OiBcIm9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG9uKGV2ZW50LCBhcmdzKSB7fVxuICB9LCB7XG4gICAga2V5OiBcImNvbm5lY3RcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29ubmVjdCgpIHt9XG4gIH0sIHtcbiAgICBrZXk6IFwiZGlzY29ubmVjdFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkaXNjb25uZWN0KCkge31cbiAgfSwge1xuICAgIGtleTogXCJkZXN0cm95XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRlc3Ryb3koKSB7fVxuICB9XSk7XG5cbiAgcmV0dXJuIEludGVyYWN0b3JTZXJ2aWNlO1xufSgpKSB8fCBfY2xhc3MpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9SXRlcmFjdG9yU2VydmljZS5qcy5tYXAiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///134\n')},function(module,__webpack_exports__,__webpack_require__){"use strict";eval('\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, "a", function() { return /* binding */ System_FrameGraphSystem; });\n\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/slicedToArray.js\nvar slicedToArray = __webpack_require__(61);\nvar slicedToArray_default = /*#__PURE__*/__webpack_require__.n(slicedToArray);\n\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/regenerator/index.js\nvar regenerator = __webpack_require__(9);\nvar regenerator_default = /*#__PURE__*/__webpack_require__.n(regenerator);\n\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/asyncToGenerator.js\nvar asyncToGenerator = __webpack_require__(15);\nvar asyncToGenerator_default = /*#__PURE__*/__webpack_require__.n(asyncToGenerator);\n\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/initializerDefineProperty.js\nvar initializerDefineProperty = __webpack_require__(10);\nvar initializerDefineProperty_default = /*#__PURE__*/__webpack_require__.n(initializerDefineProperty);\n\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/classCallCheck.js\nvar classCallCheck = __webpack_require__(6);\nvar classCallCheck_default = /*#__PURE__*/__webpack_require__.n(classCallCheck);\n\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/createClass.js\nvar createClass = __webpack_require__(7);\nvar createClass_default = /*#__PURE__*/__webpack_require__.n(createClass);\n\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/applyDecoratedDescriptor.js\nvar applyDecoratedDescriptor = __webpack_require__(11);\nvar applyDecoratedDescriptor_default = /*#__PURE__*/__webpack_require__.n(applyDecoratedDescriptor);\n\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/initializerWarningHelper.js\nvar initializerWarningHelper = __webpack_require__(29);\n\n// EXTERNAL MODULE: ./node_modules/inversify/lib/inversify.js\nvar inversify = __webpack_require__(5);\n\n// EXTERNAL MODULE: ./node_modules/@antv/g-webgpu-core/es/identifier.js\nvar identifier = __webpack_require__(13);\n\n// CONCATENATED MODULE: ./node_modules/@antv/g-webgpu-core/es/components/framegraph/FrameGraphHandle.js\n\nvar FrameGraphHandle_FrameGraphHandle = function FrameGraphHandle() {\n classCallCheck_default()(this, FrameGraphHandle);\n\n this.index = void 0;\n};\n//# sourceMappingURL=FrameGraphHandle.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-webgpu-core/es/components/framegraph/FrameGraphPass.js\n\nvar FrameGraphPass_FrameGraphPass = function FrameGraphPass() {\n classCallCheck_default()(this, FrameGraphPass);\n\n this.name = void 0;\n this.data = void 0;\n this.execute = void 0;\n this.tearDown = void 0;\n};\n//# sourceMappingURL=FrameGraphPass.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-webgpu-core/es/components/framegraph/PassNode.js\n\n\nvar PassNode_PassNode = /*#__PURE__*/function () {\n function PassNode() {\n classCallCheck_default()(this, PassNode);\n\n this.name = void 0;\n this.refCount = 0;\n this.hasSideEffect = false;\n this.devirtualize = [];\n this.destroy = [];\n this.reads = [];\n this.writes = [];\n }\n\n createClass_default()(PassNode, [{\n key: "read",\n value: function read(handle) {\n if (!this.reads.find(function (h) {\n return h.index === handle.index;\n })) {\n this.reads.push(handle);\n }\n\n return handle;\n }\n }, {\n key: "sample",\n value: function sample(handle) {\n this.read(handle); // TODO: 记录在 this.samples 中\n\n return handle;\n }\n }, {\n key: "write",\n value: function write(fg, handle) {\n var existed = this.writes.find(function (h) {\n return h.index === handle.index;\n });\n\n if (existed) {\n return handle;\n }\n\n var node = fg.getResourceNode(handle);\n node.resource.version++;\n\n if (node.resource.imported) {\n this.hasSideEffect = true;\n }\n\n var r = fg.createResourceNode(node.resource);\n var newNode = fg.getResourceNode(r);\n newNode.writer = this;\n this.writes.push(r);\n return r;\n }\n }]);\n\n return PassNode;\n}();\n//# sourceMappingURL=PassNode.js.map\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/inherits.js\nvar inherits = __webpack_require__(23);\nvar inherits_default = /*#__PURE__*/__webpack_require__.n(inherits);\n\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/possibleConstructorReturn.js\nvar possibleConstructorReturn = __webpack_require__(24);\nvar possibleConstructorReturn_default = /*#__PURE__*/__webpack_require__.n(possibleConstructorReturn);\n\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/getPrototypeOf.js\nvar getPrototypeOf = __webpack_require__(18);\nvar getPrototypeOf_default = /*#__PURE__*/__webpack_require__.n(getPrototypeOf);\n\n// CONCATENATED MODULE: ./node_modules/@antv/g-webgpu-core/es/components/framegraph/VirtualResource.js\n\n\n/**\n * ported from filament\n */\nvar VirtualResource_VirtualResource = function VirtualResource() {\n classCallCheck_default()(this, VirtualResource);\n\n this.first = void 0;\n this.last = void 0;\n};\n//# sourceMappingURL=VirtualResource.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-webgpu-core/es/components/framegraph/ResourceEntry.js\n\n\n\n\n\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = getPrototypeOf_default()(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = getPrototypeOf_default()(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return possibleConstructorReturn_default()(this, result); }; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\n\nvar ResourceEntry_ResourceEntry = /*#__PURE__*/function (_VirtualResource) {\n inherits_default()(ResourceEntry, _VirtualResource);\n\n var _super = _createSuper(ResourceEntry);\n\n function ResourceEntry() {\n var _this;\n\n classCallCheck_default()(this, ResourceEntry);\n\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n _this = _super.call.apply(_super, [this].concat(args));\n _this.version = 0;\n _this.refs = 0;\n _this.name = void 0;\n _this.imported = void 0;\n _this.priority = void 0;\n _this.discardStart = true;\n _this.discardEnd = false;\n _this.descriptor = void 0;\n _this.resource = void 0;\n return _this;\n }\n\n createClass_default()(ResourceEntry, [{\n key: "preExecuteDestroy",\n\n /**\n * Lifecycles in FG\'s execute\n */\n value: function preExecuteDestroy() {\n this.discardEnd = true;\n }\n }, {\n key: "postExecuteDestroy",\n value: function postExecuteDestroy() {\n if (!this.imported) {// TODO: 不需要每一帧结束后都销毁资源,可以增加临时资源标志\n // this.resource.destroy();\n }\n }\n }, {\n key: "postExecuteDevirtualize",\n value: function postExecuteDevirtualize() {\n this.discardStart = false;\n }\n }, {\n key: "preExecuteDevirtualize",\n value: function preExecuteDevirtualize() {\n if (!this.imported) {//\n }\n }\n }]);\n\n return ResourceEntry;\n}(VirtualResource_VirtualResource);\n//# sourceMappingURL=ResourceEntry.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-webgpu-core/es/components/framegraph/ResourceNode.js\n\nvar ResourceNode_ResourceNode = function ResourceNode() {\n classCallCheck_default()(this, ResourceNode);\n\n this.resource = void 0;\n this.writer = void 0;\n this.readerCount = 0;\n this.version = void 0;\n};\n//# sourceMappingURL=ResourceNode.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-webgpu-core/es/components/framegraph/System.js\n\n\n\n\n\n\n\n\n\nvar _dec, _dec2, _class, _class2, _descriptor, _temp;\n\nfunction _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\n\n\n\n\n\n\n\n/**\n * ported from FrameGraph implemented by SakuraRender\n * @see https://zhuanlan.zhihu.com/p/98572442\n * @see https://github.com/SaeruHikari/Sakura/blob/RenderGraph/SakuraCore/Source/Framework/GraphicTypes/FrameGraph/SakuraFrameGraph.cpp\n */\n\nvar System_FrameGraphSystem = (_dec = Object(inversify["injectable"])(), _dec2 = Object(inversify["inject"])(identifier["a" /* IDENTIFIER */].RenderEngine), _dec(_class = (_class2 = (_temp = /*#__PURE__*/function () {\n function FrameGraphSystem() {\n classCallCheck_default()(this, FrameGraphSystem);\n\n this.passNodes = [];\n this.resourceNodes = [];\n this.frameGraphPasses = [];\n\n initializerDefineProperty_default()(this, "engine", _descriptor, this);\n }\n\n createClass_default()(FrameGraphSystem, [{\n key: "execute",\n value: function () {\n var _execute = asyncToGenerator_default()( /*#__PURE__*/regenerator_default.a.mark(function _callee(views) {\n return regenerator_default.a.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n // this.engine.beginFrame();\n this.compile();\n _context.next = 3;\n return this.executePassNodes(views);\n\n case 3:\n case "end":\n return _context.stop();\n }\n }\n }, _callee, this);\n }));\n\n function execute(_x) {\n return _execute.apply(this, arguments);\n }\n\n return execute;\n }()\n }, {\n key: "tearDown",\n value: function tearDown() {\n this.frameGraphPasses.forEach(function (pass) {\n if (pass.tearDown) {\n pass.tearDown();\n }\n });\n this.reset();\n }\n }, {\n key: "addPass",\n value: function addPass(name, setup, execute, tearDown) {\n var frameGraphPass = new FrameGraphPass_FrameGraphPass();\n frameGraphPass.execute = execute;\n\n if (tearDown) {\n frameGraphPass.tearDown = tearDown;\n }\n\n frameGraphPass.name = name;\n var passNode = new PassNode_PassNode();\n passNode.name = name;\n this.passNodes.push(passNode);\n this.frameGraphPasses.push(frameGraphPass);\n setup(this, passNode, frameGraphPass);\n return frameGraphPass;\n }\n }, {\n key: "getPass",\n value: function getPass(name) {\n return this.frameGraphPasses.find(function (p) {\n return p.name === name;\n });\n }\n }, {\n key: "compile",\n value: function compile() {\n var _this = this;\n\n var _iterator = _createForOfIteratorHelper(this.passNodes),\n _step;\n\n try {\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n var _pass = _step.value;\n _pass.refCount = _pass.writes.length + (_pass.hasSideEffect ? 1 : 0);\n\n _pass.reads.forEach(function (handle) {\n _this.resourceNodes[handle.index].readerCount++;\n });\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n\n var stack = [];\n\n var _iterator2 = _createForOfIteratorHelper(this.resourceNodes),\n _step2;\n\n try {\n for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {\n var node = _step2.value;\n\n if (node.readerCount === 0) {\n stack.push(node);\n }\n }\n } catch (err) {\n _iterator2.e(err);\n } finally {\n _iterator2.f();\n }\n\n while (stack.length) {\n var pNode = stack.pop();\n var writer = pNode && pNode.writer;\n\n if (writer) {\n if (--writer.refCount === 0) {\n // this pass is culled\n // assert(!writer->hasSideEffect);\n var _iterator3 = _createForOfIteratorHelper(writer.reads),\n _step3;\n\n try {\n for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {\n var resource = _step3.value;\n var r = this.resourceNodes[resource.index];\n\n if (--r.readerCount === 0) {\n stack.push(r);\n }\n }\n } catch (err) {\n _iterator3.e(err);\n } finally {\n _iterator3.f();\n }\n }\n }\n } // update the final reference counts\n\n\n this.resourceNodes.forEach(function (node) {\n node.resource.refs += node.readerCount;\n });\n\n var _iterator4 = _createForOfIteratorHelper(this.passNodes),\n _step4;\n\n try {\n for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {\n var _pass2 = _step4.value;\n\n if (!_pass2.refCount) {\n continue;\n }\n\n var _iterator6 = _createForOfIteratorHelper(_pass2.reads),\n _step6;\n\n try {\n for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) {\n var _resource2 = _step6.value;\n var pResource = this.resourceNodes[_resource2.index].resource;\n pResource.first = pResource.first ? pResource.first : _pass2;\n pResource.last = _pass2;\n }\n } catch (err) {\n _iterator6.e(err);\n } finally {\n _iterator6.f();\n }\n\n var _iterator7 = _createForOfIteratorHelper(_pass2.writes),\n _step7;\n\n try {\n for (_iterator7.s(); !(_step7 = _iterator7.n()).done;) {\n var _resource3 = _step7.value;\n var _pResource = this.resourceNodes[_resource3.index].resource;\n _pResource.first = _pResource.first ? _pResource.first : _pass2;\n _pResource.last = _pass2;\n }\n } catch (err) {\n _iterator7.e(err);\n } finally {\n _iterator7.f();\n }\n }\n } catch (err) {\n _iterator4.e(err);\n } finally {\n _iterator4.f();\n }\n\n for (var priority = 0; priority < 2; priority++) {\n var _iterator5 = _createForOfIteratorHelper(this.resourceNodes),\n _step5;\n\n try {\n for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {\n var resoureNode = _step5.value;\n var _resource = resoureNode.resource;\n\n if (_resource.priority === priority && _resource.refs) {\n var pFirst = _resource.first;\n var pLast = _resource.last;\n\n if (pFirst && pLast) {\n pFirst.devirtualize.push(_resource);\n pLast.destroy.push(_resource);\n }\n }\n }\n } catch (err) {\n _iterator5.e(err);\n } finally {\n _iterator5.f();\n }\n }\n }\n }, {\n key: "executePassNodes",\n value: function () {\n var _executePassNodes = asyncToGenerator_default()( /*#__PURE__*/regenerator_default.a.mark(function _callee2(views) {\n var _iterator8, _step8, _step8$value, index, node, _iterator9, _step9, resource, _iterator10, _step10, _resource4, _iterator11, _step11, _resource5, _iterator12, _step12, _resource6;\n\n return regenerator_default.a.wrap(function _callee2$(_context2) {\n while (1) {\n switch (_context2.prev = _context2.next) {\n case 0:\n _iterator8 = _createForOfIteratorHelper(this.passNodes.entries());\n _context2.prev = 1;\n\n _iterator8.s();\n\n case 3:\n if ((_step8 = _iterator8.n()).done) {\n _context2.next = 18;\n break;\n }\n\n _step8$value = slicedToArray_default()(_step8.value, 2), index = _step8$value[0], node = _step8$value[1];\n\n if (!node.refCount) {\n _context2.next = 16;\n break;\n }\n\n _iterator9 = _createForOfIteratorHelper(node.devirtualize);\n\n try {\n for (_iterator9.s(); !(_step9 = _iterator9.n()).done;) {\n resource = _step9.value;\n resource.preExecuteDevirtualize(this.engine);\n }\n } catch (err) {\n _iterator9.e(err);\n } finally {\n _iterator9.f();\n }\n\n _iterator10 = _createForOfIteratorHelper(node.destroy);\n\n try {\n for (_iterator10.s(); !(_step10 = _iterator10.n()).done;) {\n _resource4 = _step10.value;\n\n _resource4.preExecuteDestroy(this.engine);\n }\n } catch (err) {\n _iterator10.e(err);\n } finally {\n _iterator10.f();\n }\n\n _context2.next = 12;\n return this.frameGraphPasses[index].execute(this, this.frameGraphPasses[index], views);\n\n case 12:\n _iterator11 = _createForOfIteratorHelper(node.devirtualize);\n\n try {\n for (_iterator11.s(); !(_step11 = _iterator11.n()).done;) {\n _resource5 = _step11.value;\n\n _resource5.postExecuteDevirtualize(this.engine);\n }\n } catch (err) {\n _iterator11.e(err);\n } finally {\n _iterator11.f();\n }\n\n _iterator12 = _createForOfIteratorHelper(node.destroy);\n\n try {\n for (_iterator12.s(); !(_step12 = _iterator12.n()).done;) {\n _resource6 = _step12.value;\n\n _resource6.postExecuteDestroy(this.engine);\n }\n } catch (err) {\n _iterator12.e(err);\n } finally {\n _iterator12.f();\n }\n\n case 16:\n _context2.next = 3;\n break;\n\n case 18:\n _context2.next = 23;\n break;\n\n case 20:\n _context2.prev = 20;\n _context2.t0 = _context2["catch"](1);\n\n _iterator8.e(_context2.t0);\n\n case 23:\n _context2.prev = 23;\n\n _iterator8.f();\n\n return _context2.finish(23);\n\n case 26:\n this.reset();\n\n case 27:\n case "end":\n return _context2.stop();\n }\n }\n }, _callee2, this, [[1, 20, 23, 26]]);\n }));\n\n function executePassNodes(_x2) {\n return _executePassNodes.apply(this, arguments);\n }\n\n return executePassNodes;\n }()\n }, {\n key: "reset",\n value: function reset() {\n this.passNodes = [];\n this.resourceNodes = [];\n this.frameGraphPasses = [];\n }\n }, {\n key: "getResourceNode",\n value: function getResourceNode(r) {\n return this.resourceNodes[r.index];\n }\n }, {\n key: "createResourceNode",\n value: function createResourceNode(resourceEntry) {\n var resourceNode = new ResourceNode_ResourceNode();\n resourceNode.resource = resourceEntry;\n resourceNode.version = resourceEntry.version;\n this.resourceNodes.push(resourceNode);\n var fgh = new FrameGraphHandle_FrameGraphHandle();\n fgh.index = this.resourceNodes.length - 1;\n return fgh;\n }\n }, {\n key: "createTexture",\n value: function createTexture(passNode, name, descriptor) {\n var resource = new ResourceEntry_ResourceEntry();\n resource.name = name;\n resource.descriptor = descriptor;\n return this.createResourceNode(resource);\n }\n }, {\n key: "createRenderTarget",\n value: function createRenderTarget(passNode, name, descriptor) {\n var resource = new ResourceEntry_ResourceEntry();\n resource.name = name;\n resource.descriptor = descriptor;\n return this.createResourceNode(resource);\n }\n }, {\n key: "present",\n value: function present(input) {\n this.addPass(\'Present\', function (fg, passNode) {\n passNode.read(input);\n passNode.hasSideEffect = true;\n }, /*#__PURE__*/asyncToGenerator_default()( /*#__PURE__*/regenerator_default.a.mark(function _callee3() {\n return regenerator_default.a.wrap(function _callee3$(_context3) {\n while (1) {\n switch (_context3.prev = _context3.next) {\n case 0:\n case "end":\n return _context3.stop();\n }\n }\n }, _callee3);\n })));\n }\n }]);\n\n return FrameGraphSystem;\n}(), _temp), (_descriptor = applyDecoratedDescriptor_default()(_class2.prototype, "engine", [_dec2], {\n configurable: true,\n enumerable: true,\n writable: true,\n initializer: null\n})), _class2)) || _class);\n//# sourceMappingURL=System.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy13ZWJncHUtY29yZS9lcy9jb21wb25lbnRzL2ZyYW1lZ3JhcGgvRnJhbWVHcmFwaEhhbmRsZS5qcz8yMGM1Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9nLXdlYmdwdS1jb3JlL2VzL2NvbXBvbmVudHMvZnJhbWVncmFwaC9GcmFtZUdyYXBoUGFzcy5qcz9kN2ViIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9nLXdlYmdwdS1jb3JlL2VzL2NvbXBvbmVudHMvZnJhbWVncmFwaC9QYXNzTm9kZS5qcz84ZjQxIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9nLXdlYmdwdS1jb3JlL2VzL2NvbXBvbmVudHMvZnJhbWVncmFwaC9WaXJ0dWFsUmVzb3VyY2UuanM/Y2VjNiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy13ZWJncHUtY29yZS9lcy9jb21wb25lbnRzL2ZyYW1lZ3JhcGgvUmVzb3VyY2VFbnRyeS5qcz8zODJmIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9nLXdlYmdwdS1jb3JlL2VzL2NvbXBvbmVudHMvZnJhbWVncmFwaC9SZXNvdXJjZU5vZGUuanM/ZmZlMCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy13ZWJncHUtY29yZS9lcy9jb21wb25lbnRzL2ZyYW1lZ3JhcGgvU3lzdGVtLmpzP2NmOTMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQW9FO0FBQzdELElBQUksaUNBQWdCO0FBQzNCLEVBQUUsd0JBQWU7O0FBRWpCO0FBQ0E7QUFDQSw0Qzs7QUNOb0U7QUFDN0QsSUFBSSw2QkFBYztBQUN6QixFQUFFLHdCQUFlOztBQUVqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEM7O0FDVG9FO0FBQ047QUFD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Q0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTzs7QUFFUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsNkJBQTZCLHlCQUFZO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixpQ0FBZ0I7QUFDcEM7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSx5QkFBeUIsMkJBQWE7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLHlCQUF5QiwyQkFBYTtBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTyxlQUFlLDBCQUFpQixlQUFlLHFCQUFtQjtBQUN6RSxlQUFlLHFCQUFtQjtBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQSxHQUFHOztBQUVIO0FBQ0EsQ0FBQywyQkFBMkIsa0NBQXlCO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEIiwiZmlsZSI6IjEzNS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfY2xhc3NDYWxsQ2hlY2sgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2tcIjtcbmV4cG9ydCB2YXIgRnJhbWVHcmFwaEhhbmRsZSA9IGZ1bmN0aW9uIEZyYW1lR3JhcGhIYW5kbGUoKSB7XG4gIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBGcmFtZUdyYXBoSGFuZGxlKTtcblxuICB0aGlzLmluZGV4ID0gdm9pZCAwO1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUZyYW1lR3JhcGhIYW5kbGUuanMubWFwIiwiaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVja1wiO1xuZXhwb3J0IHZhciBGcmFtZUdyYXBoUGFzcyA9IGZ1bmN0aW9uIEZyYW1lR3JhcGhQYXNzKCkge1xuICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRnJhbWVHcmFwaFBhc3MpO1xuXG4gIHRoaXMubmFtZSA9IHZvaWQgMDtcbiAgdGhpcy5kYXRhID0gdm9pZCAwO1xuICB0aGlzLmV4ZWN1dGUgPSB2b2lkIDA7XG4gIHRoaXMudGVhckRvd24gPSB2b2lkIDA7XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RnJhbWVHcmFwaFBhc3MuanMubWFwIiwiaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzc1wiO1xuZXhwb3J0IHZhciBQYXNzTm9kZSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFBhc3NOb2RlKCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBQYXNzTm9kZSk7XG5cbiAgICB0aGlzLm5hbWUgPSB2b2lkIDA7XG4gICAgdGhpcy5yZWZDb3VudCA9IDA7XG4gICAgdGhpcy5oYXNTaWRlRWZmZWN0ID0gZmFsc2U7XG4gICAgdGhpcy5kZXZpcnR1YWxpemUgPSBbXTtcbiAgICB0aGlzLmRlc3Ryb3kgPSBbXTtcbiAgICB0aGlzLnJlYWRzID0gW107XG4gICAgdGhpcy53cml0ZXMgPSBbXTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhQYXNzTm9kZSwgW3tcbiAgICBrZXk6IFwicmVhZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZWFkKGhhbmRsZSkge1xuICAgICAgaWYgKCF0aGlzLnJlYWRzLmZpbmQoZnVuY3Rpb24gKGgpIHtcbiAgICAgICAgcmV0dXJuIGguaW5kZXggPT09IGhhbmRsZS5pbmRleDtcbiAgICAgIH0pKSB7XG4gICAgICAgIHRoaXMucmVhZHMucHVzaChoYW5kbGUpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gaGFuZGxlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzYW1wbGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2FtcGxlKGhhbmRsZSkge1xuICAgICAgdGhpcy5yZWFkKGhhbmRsZSk7IC8vIFRPRE86IOiusOW9leWcqCB0aGlzLnNhbXBsZXMg5LitXG5cbiAgICAgIHJldHVybiBoYW5kbGU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIndyaXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHdyaXRlKGZnLCBoYW5kbGUpIHtcbiAgICAgIHZhciBleGlzdGVkID0gdGhpcy53cml0ZXMuZmluZChmdW5jdGlvbiAoaCkge1xuICAgICAgICByZXR1cm4gaC5pbmRleCA9PT0gaGFuZGxlLmluZGV4O1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChleGlzdGVkKSB7XG4gICAgICAgIHJldHVybiBoYW5kbGU7XG4gICAgICB9XG5cbiAgICAgIHZhciBub2RlID0gZmcuZ2V0UmVzb3VyY2VOb2RlKGhhbmRsZSk7XG4gICAgICBub2RlLnJlc291cmNlLnZlcnNpb24rKztcblxuICAgICAgaWYgKG5vZGUucmVzb3VyY2UuaW1wb3J0ZWQpIHtcbiAgICAgICAgdGhpcy5oYXNTaWRlRWZmZWN0ID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgdmFyIHIgPSBmZy5jcmVhdGVSZXNvdXJjZU5vZGUobm9kZS5yZXNvdXJjZSk7XG4gICAgICB2YXIgbmV3Tm9kZSA9IGZnLmdldFJlc291cmNlTm9kZShyKTtcbiAgICAgIG5ld05vZGUud3JpdGVyID0gdGhpcztcbiAgICAgIHRoaXMud3JpdGVzLnB1c2gocik7XG4gICAgICByZXR1cm4gcjtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gUGFzc05vZGU7XG59KCk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QYXNzTm9kZS5qcy5tYXAiLCJpbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrXCI7XG5cbi8qKlxuICogcG9ydGVkIGZyb20gZmlsYW1lbnRcbiAqL1xuZXhwb3J0IHZhciBWaXJ0dWFsUmVzb3VyY2UgPSBmdW5jdGlvbiBWaXJ0dWFsUmVzb3VyY2UoKSB7XG4gIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBWaXJ0dWFsUmVzb3VyY2UpO1xuXG4gIHRoaXMuZmlyc3QgPSB2b2lkIDA7XG4gIHRoaXMubGFzdCA9IHZvaWQgMDtcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1WaXJ0dWFsUmVzb3VyY2UuanMubWFwIiwiaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzc1wiO1xuaW1wb3J0IF9pbmhlcml0cyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbmhlcml0c1wiO1xuaW1wb3J0IF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm5cIjtcbmltcG9ydCBfZ2V0UHJvdG90eXBlT2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZ2V0UHJvdG90eXBlT2ZcIjtcblxuZnVuY3Rpb24gX2NyZWF0ZVN1cGVyKERlcml2ZWQpIHsgdmFyIGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QgPSBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCk7IHJldHVybiBmdW5jdGlvbiBfY3JlYXRlU3VwZXJJbnRlcm5hbCgpIHsgdmFyIFN1cGVyID0gX2dldFByb3RvdHlwZU9mKERlcml2ZWQpLCByZXN1bHQ7IGlmIChoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KSB7IHZhciBOZXdUYXJnZXQgPSBfZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3I7IHJlc3VsdCA9IFJlZmxlY3QuY29uc3RydWN0KFN1cGVyLCBhcmd1bWVudHMsIE5ld1RhcmdldCk7IH0gZWxzZSB7IHJlc3VsdCA9IFN1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH0gcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIHJlc3VsdCk7IH07IH1cblxuZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpIHsgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcInVuZGVmaW5lZFwiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlOyBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlOyBpZiAodHlwZW9mIFByb3h5ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiB0cnVlOyB0cnkgeyBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfVxuXG5pbXBvcnQgeyBWaXJ0dWFsUmVzb3VyY2UgfSBmcm9tICcuL1ZpcnR1YWxSZXNvdXJjZSc7XG5leHBvcnQgdmFyIFJlc291cmNlRW50cnkgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9WaXJ0dWFsUmVzb3VyY2UpIHtcbiAgX2luaGVyaXRzKFJlc291cmNlRW50cnksIF9WaXJ0dWFsUmVzb3VyY2UpO1xuXG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoUmVzb3VyY2VFbnRyeSk7XG5cbiAgZnVuY3Rpb24gUmVzb3VyY2VFbnRyeSgpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUmVzb3VyY2VFbnRyeSk7XG5cbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgX3RoaXMgPSBfc3VwZXIuY2FsbC5hcHBseShfc3VwZXIsIFt0aGlzXS5jb25jYXQoYXJncykpO1xuICAgIF90aGlzLnZlcnNpb24gPSAwO1xuICAgIF90aGlzLnJlZnMgPSAwO1xuICAgIF90aGlzLm5hbWUgPSB2b2lkIDA7XG4gICAgX3RoaXMuaW1wb3J0ZWQgPSB2b2lkIDA7XG4gICAgX3RoaXMucHJpb3JpdHkgPSB2b2lkIDA7XG4gICAgX3RoaXMuZGlzY2FyZFN0YXJ0ID0gdHJ1ZTtcbiAgICBfdGhpcy5kaXNjYXJkRW5kID0gZmFsc2U7XG4gICAgX3RoaXMuZGVzY3JpcHRvciA9IHZvaWQgMDtcbiAgICBfdGhpcy5yZXNvdXJjZSA9IHZvaWQgMDtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoUmVzb3VyY2VFbnRyeSwgW3tcbiAgICBrZXk6IFwicHJlRXhlY3V0ZURlc3Ryb3lcIixcblxuICAgIC8qKlxuICAgICAqIExpZmVjeWNsZXMgaW4gRkcncyBleGVjdXRlXG4gICAgICovXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHByZUV4ZWN1dGVEZXN0cm95KCkge1xuICAgICAgdGhpcy5kaXNjYXJkRW5kID0gdHJ1ZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicG9zdEV4ZWN1dGVEZXN0cm95XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHBvc3RFeGVjdXRlRGVzdHJveSgpIHtcbiAgICAgIGlmICghdGhpcy5pbXBvcnRlZCkgey8vIFRPRE86IOS4jemcgOimgeavj+S4gOW4p+e7k+adn+WQjumDvemUgOavgei1hOa6kO+8jOWPr+S7peWinuWKoOS4tOaXtui1hOa6kOagh+W/l1xuICAgICAgICAvLyB0aGlzLnJlc291cmNlLmRlc3Ryb3koKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicG9zdEV4ZWN1dGVEZXZpcnR1YWxpemVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcG9zdEV4ZWN1dGVEZXZpcnR1YWxpemUoKSB7XG4gICAgICB0aGlzLmRpc2NhcmRTdGFydCA9IGZhbHNlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJwcmVFeGVjdXRlRGV2aXJ0dWFsaXplXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHByZUV4ZWN1dGVEZXZpcnR1YWxpemUoKSB7XG4gICAgICBpZiAoIXRoaXMuaW1wb3J0ZWQpIHsvL1xuICAgICAgfVxuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBSZXNvdXJjZUVudHJ5O1xufShWaXJ0dWFsUmVzb3VyY2UpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UmVzb3VyY2VFbnRyeS5qcy5tYXAiLCJpbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrXCI7XG5leHBvcnQgdmFyIFJlc291cmNlTm9kZSA9IGZ1bmN0aW9uIFJlc291cmNlTm9kZSgpIHtcbiAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFJlc291cmNlTm9kZSk7XG5cbiAgdGhpcy5yZXNvdXJjZSA9IHZvaWQgMDtcbiAgdGhpcy53cml0ZXIgPSB2b2lkIDA7XG4gIHRoaXMucmVhZGVyQ291bnQgPSAwO1xuICB0aGlzLnZlcnNpb24gPSB2b2lkIDA7XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UmVzb3VyY2VOb2RlLmpzLm1hcCIsImltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgX3JlZ2VuZXJhdG9yUnVudGltZSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvcmVnZW5lcmF0b3JcIjtcbmltcG9ydCBfYXN5bmNUb0dlbmVyYXRvciBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hc3luY1RvR2VuZXJhdG9yXCI7XG5pbXBvcnQgX2luaXRpYWxpemVyRGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW5pdGlhbGl6ZXJEZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzc1wiO1xuaW1wb3J0IF9hcHBseURlY29yYXRlZERlc2NyaXB0b3IgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXBwbHlEZWNvcmF0ZWREZXNjcmlwdG9yXCI7XG5pbXBvcnQgX2luaXRpYWxpemVyV2FybmluZ0hlbHBlciBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbml0aWFsaXplcldhcm5pbmdIZWxwZXJcIjtcblxudmFyIF9kZWMsIF9kZWMyLCBfY2xhc3MsIF9jbGFzczIsIF9kZXNjcmlwdG9yLCBfdGVtcDtcblxuZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIobywgYWxsb3dBcnJheUxpa2UpIHsgdmFyIGl0OyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJ1bmRlZmluZWRcIiB8fCBvW1N5bWJvbC5pdGVyYXRvcl0gPT0gbnVsbCkgeyBpZiAoQXJyYXkuaXNBcnJheShvKSB8fCAoaXQgPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobykpIHx8IGFsbG93QXJyYXlMaWtlICYmIG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSB7IGlmIChpdCkgbyA9IGl0OyB2YXIgaSA9IDA7IHZhciBGID0gZnVuY3Rpb24gRigpIHt9OyByZXR1cm4geyBzOiBGLCBuOiBmdW5jdGlvbiBuKCkgeyBpZiAoaSA+PSBvLmxlbmd0aCkgcmV0dXJuIHsgZG9uZTogdHJ1ZSB9OyByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IG9baSsrXSB9OyB9LCBlOiBmdW5jdGlvbiBlKF9lKSB7IHRocm93IF9lOyB9LCBmOiBGIH07IH0gdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9IHZhciBub3JtYWxDb21wbGV0aW9uID0gdHJ1ZSwgZGlkRXJyID0gZmFsc2UsIGVycjsgcmV0dXJuIHsgczogZnVuY3Rpb24gcygpIHsgaXQgPSBvW1N5bWJvbC5pdGVyYXRvcl0oKTsgfSwgbjogZnVuY3Rpb24gbigpIHsgdmFyIHN0ZXAgPSBpdC5uZXh0KCk7IG5vcm1hbENvbXBsZXRpb24gPSBzdGVwLmRvbmU7IHJldHVybiBzdGVwOyB9LCBlOiBmdW5jdGlvbiBlKF9lMikgeyBkaWRFcnIgPSB0cnVlOyBlcnIgPSBfZTI7IH0sIGY6IGZ1bmN0aW9uIGYoKSB7IHRyeSB7IGlmICghbm9ybWFsQ29tcGxldGlvbiAmJiBpdC5yZXR1cm4gIT0gbnVsbCkgaXQucmV0dXJuKCk7IH0gZmluYWxseSB7IGlmIChkaWRFcnIpIHRocm93IGVycjsgfSB9IH07IH1cblxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB9XG5cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfVxuXG5pbXBvcnQgeyBpbmplY3QsIGluamVjdGFibGUgfSBmcm9tICdpbnZlcnNpZnknO1xuaW1wb3J0IHsgSURFTlRJRklFUiB9IGZyb20gJy4uLy4uL2lkZW50aWZpZXInO1xuaW1wb3J0IHsgRnJhbWVHcmFwaEhhbmRsZSB9IGZyb20gJy4vRnJhbWVHcmFwaEhhbmRsZSc7XG5pbXBvcnQgeyBGcmFtZUdyYXBoUGFzcyB9IGZyb20gJy4vRnJhbWVHcmFwaFBhc3MnO1xuaW1wb3J0IHsgUGFzc05vZGUgfSBmcm9tICcuL1Bhc3NOb2RlJztcbmltcG9ydCB7IFJlc291cmNlRW50cnkgfSBmcm9tICcuL1Jlc291cmNlRW50cnknO1xuaW1wb3J0IHsgUmVzb3VyY2VOb2RlIH0gZnJvbSAnLi9SZXNvdXJjZU5vZGUnO1xuLyoqXG4gKiBwb3J0ZWQgZnJvbSBGcmFtZUdyYXBoIGltcGxlbWVudGVkIGJ5IFNha3VyYVJlbmRlclxuICogQHNlZSBodHRwczovL3podWFubGFuLnpoaWh1LmNvbS9wLzk4NTcyNDQyXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9TYWVydUhpa2FyaS9TYWt1cmEvYmxvYi9SZW5kZXJHcmFwaC9TYWt1cmFDb3JlL1NvdXJjZS9GcmFtZXdvcmsvR3JhcGhpY1R5cGVzL0ZyYW1lR3JhcGgvU2FrdXJhRnJhbWVHcmFwaC5jcHBcbiAqL1xuXG5leHBvcnQgdmFyIEZyYW1lR3JhcGhTeXN0ZW0gPSAoX2RlYyA9IGluamVjdGFibGUoKSwgX2RlYzIgPSBpbmplY3QoSURFTlRJRklFUi5SZW5kZXJFbmdpbmUpLCBfZGVjKF9jbGFzcyA9IChfY2xhc3MyID0gKF90ZW1wID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gRnJhbWVHcmFwaFN5c3RlbSgpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRnJhbWVHcmFwaFN5c3RlbSk7XG5cbiAgICB0aGlzLnBhc3NOb2RlcyA9IFtdO1xuICAgIHRoaXMucmVzb3VyY2VOb2RlcyA9IFtdO1xuICAgIHRoaXMuZnJhbWVHcmFwaFBhc3NlcyA9IFtdO1xuXG4gICAgX2luaXRpYWxpemVyRGVmaW5lUHJvcGVydHkodGhpcywgXCJlbmdpbmVcIiwgX2Rlc2NyaXB0b3IsIHRoaXMpO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKEZyYW1lR3JhcGhTeXN0ZW0sIFt7XG4gICAga2V5OiBcImV4ZWN1dGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF9leGVjdXRlID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoZnVuY3Rpb24gX2NhbGxlZSh2aWV3cykge1xuICAgICAgICByZXR1cm4gX3JlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7XG4gICAgICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHtcbiAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgIC8vIHRoaXMuZW5naW5lLmJlZ2luRnJhbWUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbXBpbGUoKTtcbiAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMztcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5leGVjdXRlUGFzc05vZGVzKHZpZXdzKTtcblxuICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSwgX2NhbGxlZSwgdGhpcyk7XG4gICAgICB9KSk7XG5cbiAgICAgIGZ1bmN0aW9uIGV4ZWN1dGUoX3gpIHtcbiAgICAgICAgcmV0dXJuIF9leGVjdXRlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBleGVjdXRlO1xuICAgIH0oKVxuICB9LCB7XG4gICAga2V5OiBcInRlYXJEb3duXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRlYXJEb3duKCkge1xuICAgICAgdGhpcy5mcmFtZUdyYXBoUGFzc2VzLmZvckVhY2goZnVuY3Rpb24gKHBhc3MpIHtcbiAgICAgICAgaWYgKHBhc3MudGVhckRvd24pIHtcbiAgICAgICAgICBwYXNzLnRlYXJEb3duKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdGhpcy5yZXNldCgpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJhZGRQYXNzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFkZFBhc3MobmFtZSwgc2V0dXAsIGV4ZWN1dGUsIHRlYXJEb3duKSB7XG4gICAgICB2YXIgZnJhbWVHcmFwaFBhc3MgPSBuZXcgRnJhbWVHcmFwaFBhc3MoKTtcbiAgICAgIGZyYW1lR3JhcGhQYXNzLmV4ZWN1dGUgPSBleGVjdXRlO1xuXG4gICAgICBpZiAodGVhckRvd24pIHtcbiAgICAgICAgZnJhbWVHcmFwaFBhc3MudGVhckRvd24gPSB0ZWFyRG93bjtcbiAgICAgIH1cblxuICAgICAgZnJhbWVHcmFwaFBhc3MubmFtZSA9IG5hbWU7XG4gICAgICB2YXIgcGFzc05vZGUgPSBuZXcgUGFzc05vZGUoKTtcbiAgICAgIHBhc3NOb2RlLm5hbWUgPSBuYW1lO1xuICAgICAgdGhpcy5wYXNzTm9kZXMucHVzaChwYXNzTm9kZSk7XG4gICAgICB0aGlzLmZyYW1lR3JhcGhQYXNzZXMucHVzaChmcmFtZUdyYXBoUGFzcyk7XG4gICAgICBzZXR1cCh0aGlzLCBwYXNzTm9kZSwgZnJhbWVHcmFwaFBhc3MpO1xuICAgICAgcmV0dXJuIGZyYW1lR3JhcGhQYXNzO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRQYXNzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFBhc3MobmFtZSkge1xuICAgICAgcmV0dXJuIHRoaXMuZnJhbWVHcmFwaFBhc3Nlcy5maW5kKGZ1bmN0aW9uIChwKSB7XG4gICAgICAgIHJldHVybiBwLm5hbWUgPT09IG5hbWU7XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY29tcGlsZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21waWxlKCkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgdmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKHRoaXMucGFzc05vZGVzKSxcbiAgICAgICAgICBfc3RlcDtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgZm9yIChfaXRlcmF0b3IucygpOyAhKF9zdGVwID0gX2l0ZXJhdG9yLm4oKSkuZG9uZTspIHtcbiAgICAgICAgICB2YXIgX3Bhc3MgPSBfc3RlcC52YWx1ZTtcbiAgICAgICAgICBfcGFzcy5yZWZDb3VudCA9IF9wYXNzLndyaXRlcy5sZW5ndGggKyAoX3Bhc3MuaGFzU2lkZUVmZmVjdCA/IDEgOiAwKTtcblxuICAgICAgICAgIF9wYXNzLnJlYWRzLmZvckVhY2goZnVuY3Rpb24gKGhhbmRsZSkge1xuICAgICAgICAgICAgX3RoaXMucmVzb3VyY2VOb2Rlc1toYW5kbGUuaW5kZXhdLnJlYWRlckNvdW50Kys7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBfaXRlcmF0b3IuZShlcnIpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgX2l0ZXJhdG9yLmYoKTtcbiAgICAgIH1cblxuICAgICAgdmFyIHN0YWNrID0gW107XG5cbiAgICAgIHZhciBfaXRlcmF0b3IyID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIodGhpcy5yZXNvdXJjZU5vZGVzKSxcbiAgICAgICAgICBfc3RlcDI7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGZvciAoX2l0ZXJhdG9yMi5zKCk7ICEoX3N0ZXAyID0gX2l0ZXJhdG9yMi5uKCkpLmRvbmU7KSB7XG4gICAgICAgICAgdmFyIG5vZGUgPSBfc3RlcDIudmFsdWU7XG5cbiAgICAgICAgICBpZiAobm9kZS5yZWFkZXJDb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgc3RhY2sucHVzaChub2RlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBfaXRlcmF0b3IyLmUoZXJyKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIF9pdGVyYXRvcjIuZigpO1xuICAgICAgfVxuXG4gICAgICB3aGlsZSAoc3RhY2subGVuZ3RoKSB7XG4gICAgICAgIHZhciBwTm9kZSA9IHN0YWNrLnBvcCgpO1xuICAgICAgICB2YXIgd3JpdGVyID0gcE5vZGUgJiYgcE5vZGUud3JpdGVyO1xuXG4gICAgICAgIGlmICh3cml0ZXIpIHtcbiAgICAgICAgICBpZiAoLS13cml0ZXIucmVmQ291bnQgPT09IDApIHtcbiAgICAgICAgICAgIC8vIHRoaXMgcGFzcyBpcyBjdWxsZWRcbiAgICAgICAgICAgIC8vIGFzc2VydCghd3JpdGVyLT5oYXNTaWRlRWZmZWN0KTtcbiAgICAgICAgICAgIHZhciBfaXRlcmF0b3IzID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIod3JpdGVyLnJlYWRzKSxcbiAgICAgICAgICAgICAgICBfc3RlcDM7XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGZvciAoX2l0ZXJhdG9yMy5zKCk7ICEoX3N0ZXAzID0gX2l0ZXJhdG9yMy5uKCkpLmRvbmU7KSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlc291cmNlID0gX3N0ZXAzLnZhbHVlO1xuICAgICAgICAgICAgICAgIHZhciByID0gdGhpcy5yZXNvdXJjZU5vZGVzW3Jlc291cmNlLmluZGV4XTtcblxuICAgICAgICAgICAgICAgIGlmICgtLXIucmVhZGVyQ291bnQgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgIHN0YWNrLnB1c2gocik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgX2l0ZXJhdG9yMy5lKGVycik7XG4gICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICBfaXRlcmF0b3IzLmYoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gLy8gdXBkYXRlIHRoZSBmaW5hbCByZWZlcmVuY2UgY291bnRzXG5cblxuICAgICAgdGhpcy5yZXNvdXJjZU5vZGVzLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgbm9kZS5yZXNvdXJjZS5yZWZzICs9IG5vZGUucmVhZGVyQ291bnQ7XG4gICAgICB9KTtcblxuICAgICAgdmFyIF9pdGVyYXRvcjQgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcih0aGlzLnBhc3NOb2RlcyksXG4gICAgICAgICAgX3N0ZXA0O1xuXG4gICAgICB0cnkge1xuICAgICAgICBmb3IgKF9pdGVyYXRvcjQucygpOyAhKF9zdGVwNCA9IF9pdGVyYXRvcjQubigpKS5kb25lOykge1xuICAgICAgICAgIHZhciBfcGFzczIgPSBfc3RlcDQudmFsdWU7XG5cbiAgICAgICAgICBpZiAoIV9wYXNzMi5yZWZDb3VudCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIF9pdGVyYXRvcjYgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihfcGFzczIucmVhZHMpLFxuICAgICAgICAgICAgICBfc3RlcDY7XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgZm9yIChfaXRlcmF0b3I2LnMoKTsgIShfc3RlcDYgPSBfaXRlcmF0b3I2Lm4oKSkuZG9uZTspIHtcbiAgICAgICAgICAgICAgdmFyIF9yZXNvdXJjZTIgPSBfc3RlcDYudmFsdWU7XG4gICAgICAgICAgICAgIHZhciBwUmVzb3VyY2UgPSB0aGlzLnJlc291cmNlTm9kZXNbX3Jlc291cmNlMi5pbmRleF0ucmVzb3VyY2U7XG4gICAgICAgICAgICAgIHBSZXNvdXJjZS5maXJzdCA9IHBSZXNvdXJjZS5maXJzdCA/IHBSZXNvdXJjZS5maXJzdCA6IF9wYXNzMjtcbiAgICAgICAgICAgICAgcFJlc291cmNlLmxhc3QgPSBfcGFzczI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBfaXRlcmF0b3I2LmUoZXJyKTtcbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgX2l0ZXJhdG9yNi5mKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIF9pdGVyYXRvcjcgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihfcGFzczIud3JpdGVzKSxcbiAgICAgICAgICAgICAgX3N0ZXA3O1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZvciAoX2l0ZXJhdG9yNy5zKCk7ICEoX3N0ZXA3ID0gX2l0ZXJhdG9yNy5uKCkpLmRvbmU7KSB7XG4gICAgICAgICAgICAgIHZhciBfcmVzb3VyY2UzID0gX3N0ZXA3LnZhbHVlO1xuICAgICAgICAgICAgICB2YXIgX3BSZXNvdXJjZSA9IHRoaXMucmVzb3VyY2VOb2Rlc1tfcmVzb3VyY2UzLmluZGV4XS5yZXNvdXJjZTtcbiAgICAgICAgICAgICAgX3BSZXNvdXJjZS5maXJzdCA9IF9wUmVzb3VyY2UuZmlyc3QgPyBfcFJlc291cmNlLmZpcnN0IDogX3Bhc3MyO1xuICAgICAgICAgICAgICBfcFJlc291cmNlLmxhc3QgPSBfcGFzczI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBfaXRlcmF0b3I3LmUoZXJyKTtcbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgX2l0ZXJhdG9yNy5mKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgX2l0ZXJhdG9yNC5lKGVycik7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBfaXRlcmF0b3I0LmYoKTtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgcHJpb3JpdHkgPSAwOyBwcmlvcml0eSA8IDI7IHByaW9yaXR5KyspIHtcbiAgICAgICAgdmFyIF9pdGVyYXRvcjUgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcih0aGlzLnJlc291cmNlTm9kZXMpLFxuICAgICAgICAgICAgX3N0ZXA1O1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZm9yIChfaXRlcmF0b3I1LnMoKTsgIShfc3RlcDUgPSBfaXRlcmF0b3I1Lm4oKSkuZG9uZTspIHtcbiAgICAgICAgICAgIHZhciByZXNvdXJlTm9kZSA9IF9zdGVwNS52YWx1ZTtcbiAgICAgICAgICAgIHZhciBfcmVzb3VyY2UgPSByZXNvdXJlTm9kZS5yZXNvdXJjZTtcblxuICAgICAgICAgICAgaWYgKF9yZXNvdXJjZS5wcmlvcml0eSA9PT0gcHJpb3JpdHkgJiYgX3Jlc291cmNlLnJlZnMpIHtcbiAgICAgICAgICAgICAgdmFyIHBGaXJzdCA9IF9yZXNvdXJjZS5maXJzdDtcbiAgICAgICAgICAgICAgdmFyIHBMYXN0ID0gX3Jlc291cmNlLmxhc3Q7XG5cbiAgICAgICAgICAgICAgaWYgKHBGaXJzdCAmJiBwTGFzdCkge1xuICAgICAgICAgICAgICAgIHBGaXJzdC5kZXZpcnR1YWxpemUucHVzaChfcmVzb3VyY2UpO1xuICAgICAgICAgICAgICAgIHBMYXN0LmRlc3Ryb3kucHVzaChfcmVzb3VyY2UpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBfaXRlcmF0b3I1LmUoZXJyKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBfaXRlcmF0b3I1LmYoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJleGVjdXRlUGFzc05vZGVzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfZXhlY3V0ZVBhc3NOb2RlcyA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUyKHZpZXdzKSB7XG4gICAgICAgIHZhciBfaXRlcmF0b3I4LCBfc3RlcDgsIF9zdGVwOCR2YWx1ZSwgaW5kZXgsIG5vZGUsIF9pdGVyYXRvcjksIF9zdGVwOSwgcmVzb3VyY2UsIF9pdGVyYXRvcjEwLCBfc3RlcDEwLCBfcmVzb3VyY2U0LCBfaXRlcmF0b3IxMSwgX3N0ZXAxMSwgX3Jlc291cmNlNSwgX2l0ZXJhdG9yMTIsIF9zdGVwMTIsIF9yZXNvdXJjZTY7XG5cbiAgICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUud3JhcChmdW5jdGlvbiBfY2FsbGVlMiQoX2NvbnRleHQyKSB7XG4gICAgICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQyLnByZXYgPSBfY29udGV4dDIubmV4dCkge1xuICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgX2l0ZXJhdG9yOCA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKHRoaXMucGFzc05vZGVzLmVudHJpZXMoKSk7XG4gICAgICAgICAgICAgICAgX2NvbnRleHQyLnByZXYgPSAxO1xuXG4gICAgICAgICAgICAgICAgX2l0ZXJhdG9yOC5zKCk7XG5cbiAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgIGlmICgoX3N0ZXA4ID0gX2l0ZXJhdG9yOC5uKCkpLmRvbmUpIHtcbiAgICAgICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMTg7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBfc3RlcDgkdmFsdWUgPSBfc2xpY2VkVG9BcnJheShfc3RlcDgudmFsdWUsIDIpLCBpbmRleCA9IF9zdGVwOCR2YWx1ZVswXSwgbm9kZSA9IF9zdGVwOCR2YWx1ZVsxXTtcblxuICAgICAgICAgICAgICAgIGlmICghbm9kZS5yZWZDb3VudCkge1xuICAgICAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAxNjtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIF9pdGVyYXRvcjkgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihub2RlLmRldmlydHVhbGl6ZSk7XG5cbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgZm9yIChfaXRlcmF0b3I5LnMoKTsgIShfc3RlcDkgPSBfaXRlcmF0b3I5Lm4oKSkuZG9uZTspIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2UgPSBfc3RlcDkudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIHJlc291cmNlLnByZUV4ZWN1dGVEZXZpcnR1YWxpemUodGhpcy5lbmdpbmUpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgX2l0ZXJhdG9yOS5lKGVycik7XG4gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgIF9pdGVyYXRvcjkuZigpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIF9pdGVyYXRvcjEwID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIobm9kZS5kZXN0cm95KTtcblxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICBmb3IgKF9pdGVyYXRvcjEwLnMoKTsgIShfc3RlcDEwID0gX2l0ZXJhdG9yMTAubigpKS5kb25lOykge1xuICAgICAgICAgICAgICAgICAgICBfcmVzb3VyY2U0ID0gX3N0ZXAxMC52YWx1ZTtcblxuICAgICAgICAgICAgICAgICAgICBfcmVzb3VyY2U0LnByZUV4ZWN1dGVEZXN0cm95KHRoaXMuZW5naW5lKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgIF9pdGVyYXRvcjEwLmUoZXJyKTtcbiAgICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgX2l0ZXJhdG9yMTAuZigpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMTI7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZnJhbWVHcmFwaFBhc3Nlc1tpbmRleF0uZXhlY3V0ZSh0aGlzLCB0aGlzLmZyYW1lR3JhcGhQYXNzZXNbaW5kZXhdLCB2aWV3cyk7XG5cbiAgICAgICAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICAgICAgICBfaXRlcmF0b3IxMSA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKG5vZGUuZGV2aXJ0dWFsaXplKTtcblxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICBmb3IgKF9pdGVyYXRvcjExLnMoKTsgIShfc3RlcDExID0gX2l0ZXJhdG9yMTEubigpKS5kb25lOykge1xuICAgICAgICAgICAgICAgICAgICBfcmVzb3VyY2U1ID0gX3N0ZXAxMS52YWx1ZTtcblxuICAgICAgICAgICAgICAgICAgICBfcmVzb3VyY2U1LnBvc3RFeGVjdXRlRGV2aXJ0dWFsaXplKHRoaXMuZW5naW5lKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgIF9pdGVyYXRvcjExLmUoZXJyKTtcbiAgICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgX2l0ZXJhdG9yMTEuZigpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIF9pdGVyYXRvcjEyID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIobm9kZS5kZXN0cm95KTtcblxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICBmb3IgKF9pdGVyYXRvcjEyLnMoKTsgIShfc3RlcDEyID0gX2l0ZXJhdG9yMTIubigpKS5kb25lOykge1xuICAgICAgICAgICAgICAgICAgICBfcmVzb3VyY2U2ID0gX3N0ZXAxMi52YWx1ZTtcblxuICAgICAgICAgICAgICAgICAgICBfcmVzb3VyY2U2LnBvc3RFeGVjdXRlRGVzdHJveSh0aGlzLmVuZ2luZSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICBfaXRlcmF0b3IxMi5lKGVycik7XG4gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgIF9pdGVyYXRvcjEyLmYoKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgY2FzZSAxNjpcbiAgICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDM7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgY2FzZSAxODpcbiAgICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDIzO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgIGNhc2UgMjA6XG4gICAgICAgICAgICAgICAgX2NvbnRleHQyLnByZXYgPSAyMDtcbiAgICAgICAgICAgICAgICBfY29udGV4dDIudDAgPSBfY29udGV4dDJbXCJjYXRjaFwiXSgxKTtcblxuICAgICAgICAgICAgICAgIF9pdGVyYXRvcjguZShfY29udGV4dDIudDApO1xuXG4gICAgICAgICAgICAgIGNhc2UgMjM6XG4gICAgICAgICAgICAgICAgX2NvbnRleHQyLnByZXYgPSAyMztcblxuICAgICAgICAgICAgICAgIF9pdGVyYXRvcjguZigpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5maW5pc2goMjMpO1xuXG4gICAgICAgICAgICAgIGNhc2UgMjY6XG4gICAgICAgICAgICAgICAgdGhpcy5yZXNldCgpO1xuXG4gICAgICAgICAgICAgIGNhc2UgMjc6XG4gICAgICAgICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLnN0b3AoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sIF9jYWxsZWUyLCB0aGlzLCBbWzEsIDIwLCAyMywgMjZdXSk7XG4gICAgICB9KSk7XG5cbiAgICAgIGZ1bmN0aW9uIGV4ZWN1dGVQYXNzTm9kZXMoX3gyKSB7XG4gICAgICAgIHJldHVybiBfZXhlY3V0ZVBhc3NOb2Rlcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZXhlY3V0ZVBhc3NOb2RlcztcbiAgICB9KClcbiAgfSwge1xuICAgIGtleTogXCJyZXNldFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZXNldCgpIHtcbiAgICAgIHRoaXMucGFzc05vZGVzID0gW107XG4gICAgICB0aGlzLnJlc291cmNlTm9kZXMgPSBbXTtcbiAgICAgIHRoaXMuZnJhbWVHcmFwaFBhc3NlcyA9IFtdO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRSZXNvdXJjZU5vZGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0UmVzb3VyY2VOb2RlKHIpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlc291cmNlTm9kZXNbci5pbmRleF07XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNyZWF0ZVJlc291cmNlTm9kZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjcmVhdGVSZXNvdXJjZU5vZGUocmVzb3VyY2VFbnRyeSkge1xuICAgICAgdmFyIHJlc291cmNlTm9kZSA9IG5ldyBSZXNvdXJjZU5vZGUoKTtcbiAgICAgIHJlc291cmNlTm9kZS5yZXNvdXJjZSA9IHJlc291cmNlRW50cnk7XG4gICAgICByZXNvdXJjZU5vZGUudmVyc2lvbiA9IHJlc291cmNlRW50cnkudmVyc2lvbjtcbiAgICAgIHRoaXMucmVzb3VyY2VOb2Rlcy5wdXNoKHJlc291cmNlTm9kZSk7XG4gICAgICB2YXIgZmdoID0gbmV3IEZyYW1lR3JhcGhIYW5kbGUoKTtcbiAgICAgIGZnaC5pbmRleCA9IHRoaXMucmVzb3VyY2VOb2Rlcy5sZW5ndGggLSAxO1xuICAgICAgcmV0dXJuIGZnaDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY3JlYXRlVGV4dHVyZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjcmVhdGVUZXh0dXJlKHBhc3NOb2RlLCBuYW1lLCBkZXNjcmlwdG9yKSB7XG4gICAgICB2YXIgcmVzb3VyY2UgPSBuZXcgUmVzb3VyY2VFbnRyeSgpO1xuICAgICAgcmVzb3VyY2UubmFtZSA9IG5hbWU7XG4gICAgICByZXNvdXJjZS5kZXNjcmlwdG9yID0gZGVzY3JpcHRvcjtcbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVJlc291cmNlTm9kZShyZXNvdXJjZSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNyZWF0ZVJlbmRlclRhcmdldFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjcmVhdGVSZW5kZXJUYXJnZXQocGFzc05vZGUsIG5hbWUsIGRlc2NyaXB0b3IpIHtcbiAgICAgIHZhciByZXNvdXJjZSA9IG5ldyBSZXNvdXJjZUVudHJ5KCk7XG4gICAgICByZXNvdXJjZS5uYW1lID0gbmFtZTtcbiAgICAgIHJlc291cmNlLmRlc2NyaXB0b3IgPSBkZXNjcmlwdG9yO1xuICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlUmVzb3VyY2VOb2RlKHJlc291cmNlKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicHJlc2VudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwcmVzZW50KGlucHV0KSB7XG4gICAgICB0aGlzLmFkZFBhc3MoJ1ByZXNlbnQnLCBmdW5jdGlvbiAoZmcsIHBhc3NOb2RlKSB7XG4gICAgICAgIHBhc3NOb2RlLnJlYWQoaW5wdXQpO1xuICAgICAgICBwYXNzTm9kZS5oYXNTaWRlRWZmZWN0ID0gdHJ1ZTtcbiAgICAgIH0sIC8qI19fUFVSRV9fKi9fYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUubWFyayhmdW5jdGlvbiBfY2FsbGVlMygpIHtcbiAgICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUud3JhcChmdW5jdGlvbiBfY2FsbGVlMyQoX2NvbnRleHQzKSB7XG4gICAgICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQzLnByZXYgPSBfY29udGV4dDMubmV4dCkge1xuICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQzLnN0b3AoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sIF9jYWxsZWUzKTtcbiAgICAgIH0pKSk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEZyYW1lR3JhcGhTeXN0ZW07XG59KCksIF90ZW1wKSwgKF9kZXNjcmlwdG9yID0gX2FwcGx5RGVjb3JhdGVkRGVzY3JpcHRvcihfY2xhc3MyLnByb3RvdHlwZSwgXCJlbmdpbmVcIiwgW19kZWMyXSwge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHdyaXRhYmxlOiB0cnVlLFxuICBpbml0aWFsaXplcjogbnVsbFxufSkpLCBfY2xhc3MyKSkgfHwgX2NsYXNzKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVN5c3RlbS5qcy5tYXAiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///135\n')},function(module,__webpack_exports__,__webpack_require__){"use strict";eval("\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, \"a\", function() { return /* binding */ ShaderModuleService_ShaderModuleService; });\n\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/defineProperty.js\nvar defineProperty = __webpack_require__(4);\nvar defineProperty_default = /*#__PURE__*/__webpack_require__.n(defineProperty);\n\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/classCallCheck.js\nvar classCallCheck = __webpack_require__(6);\nvar classCallCheck_default = /*#__PURE__*/__webpack_require__.n(classCallCheck);\n\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/createClass.js\nvar createClass = __webpack_require__(7);\nvar createClass_default = /*#__PURE__*/__webpack_require__.n(createClass);\n\n// EXTERNAL MODULE: ./node_modules/inversify/lib/inversify.js\nvar inversify = __webpack_require__(5);\n\n// CONCATENATED MODULE: ./node_modules/@antv/g-webgpu-core/es/utils/shader-module.js\nfunction getUniformLengthByType(type) {\n var arrayLength = 0;\n\n switch (type) {\n case 'vec2':\n case 'ivec2':\n arrayLength = 2;\n break;\n\n case 'vec3':\n case 'ivec3':\n arrayLength = 3;\n break;\n\n case 'vec4':\n case 'ivec4':\n case 'mat2':\n arrayLength = 4;\n break;\n\n case 'mat3':\n arrayLength = 9;\n break;\n\n case 'mat4':\n arrayLength = 16;\n break;\n\n default:\n }\n\n return arrayLength;\n}\nvar uniformRegExp = /uniform\\s+(bool|float|int|vec2|vec3|vec4|ivec2|ivec3|ivec4|mat2|mat3|mat4|sampler2D|samplerCube)\\s+([\\s\\S]*?);/g;\nfunction extractUniforms(content) {\n var uniforms = {};\n content = content.replace(uniformRegExp, function (_, type, c) {\n var defaultValues = c.split(':');\n var uniformName = defaultValues[0].trim();\n var defaultValue = '';\n\n if (defaultValues.length > 1) {\n defaultValue = defaultValues[1].trim();\n } // set default value for uniform according to its type\n // eg. vec2 u -> [0.0, 0.0]\n\n\n switch (type) {\n case 'bool':\n defaultValue = defaultValue === 'true';\n break;\n\n case 'float':\n case 'int':\n defaultValue = Number(defaultValue);\n break;\n\n case 'vec2':\n case 'vec3':\n case 'vec4':\n case 'ivec2':\n case 'ivec3':\n case 'ivec4':\n case 'mat2':\n case 'mat3':\n case 'mat4':\n if (defaultValue) {\n defaultValue = defaultValue.replace('[', '').replace(']', '').split(',').reduce(function (prev, cur) {\n prev.push(Number(cur.trim()));\n return prev;\n }, []);\n } else {\n defaultValue = new Array(getUniformLengthByType(type)).fill(0);\n }\n\n break;\n\n default:\n } // @ts-ignore\n\n\n uniforms[uniformName] = defaultValue;\n return \"uniform \".concat(type, \" \").concat(uniformName, \";\\n\");\n });\n return {\n content: content,\n uniforms: uniforms\n };\n}\n//# sourceMappingURL=shader-module.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-webgpu-core/es/utils/uniq.js\nfunction uniq(array) {\n return array.filter(function (v, i, a) {\n return a.indexOf(v) === i;\n });\n}\n//# sourceMappingURL=uniq.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-webgpu-core/es/services/shader-module/ShaderModuleService.js\n\n\n\n\nvar _dec, _class, _temp;\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { defineProperty_default()(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\n\n\n\n\n/* babel-plugin-inline-import './shaders/webgl.picking.frag.glsl' */\nvar pickingFrag = \"varying vec4 v_PickingResult;\\nuniform vec4 u_HighlightColor : [0, 0, 0, 0];\\nuniform float u_PickingStage : 0.0;\\n\\n#define PICKING_ENCODE 1.0\\n#define PICKING_HIGHLIGHT 2.0\\n#define COLOR_SCALE 1. / 255.\\n\\n/*\\n * Returns highlight color if this item is selected.\\n */\\nvec4 filterHighlightColor(vec4 color) {\\n bool selected = bool(v_PickingResult.a);\\n\\n if (selected) {\\n vec4 highLightColor = u_HighlightColor * COLOR_SCALE;\\n\\n float highLightAlpha = highLightColor.a;\\n float highLightRatio = highLightAlpha / (highLightAlpha + color.a * (1.0 - highLightAlpha));\\n\\n vec3 resultRGB = mix(color.rgb, highLightColor.rgb, highLightRatio);\\n return vec4(resultRGB, color.a);\\n } else {\\n return color;\\n }\\n}\\n\\n/*\\n * Returns picking color if picking enabled else unmodified argument.\\n */\\nvec4 filterPickingColor(vec4 color) {\\n vec3 pickingColor = v_PickingResult.rgb;\\n if (u_PickingStage == PICKING_ENCODE && length(pickingColor) < 0.001) {\\n discard;\\n }\\n return u_PickingStage == PICKING_ENCODE ? vec4(pickingColor, step(0.001,color.a)): color;\\n}\\n\\n/*\\n * Returns picking color if picking is enabled if not\\n * highlight color if this item is selected, otherwise unmodified argument.\\n */\\nvec4 filterColor(vec4 color) {\\n return filterPickingColor(filterHighlightColor(color));\\n}\\n\";\n\n/* babel-plugin-inline-import './shaders/webgl.picking.vert.glsl' */\nvar pickingVert = \"attribute vec3 a_PickingColor;\\nvarying vec4 v_PickingResult;\\n\\nuniform vec3 u_PickingColor : [0, 0, 0];\\nuniform vec4 u_HighlightColor : [0, 0, 0, 0];\\nuniform float u_PickingStage : 0.0;\\nuniform float u_PickingThreshold : 1.0;\\nuniform float u_PickingBuffer: 0.0;\\n\\n#define PICKING_ENCODE 1.0\\n#define PICKING_HIGHLIGHT 2.0\\n#define COLOR_SCALE 1. / 255.\\n\\nbool isVertexPicked(vec3 vertexColor) {\\n return\\n abs(vertexColor.r - u_PickingColor.r) < u_PickingThreshold &&\\n abs(vertexColor.g - u_PickingColor.g) < u_PickingThreshold &&\\n abs(vertexColor.b - u_PickingColor.b) < u_PickingThreshold;\\n}\\n\\nvoid setPickingColor(vec3 pickingColor) {\\n // compares only in highlight stage\\n v_PickingResult.a = float((u_PickingStage == PICKING_HIGHLIGHT) && isVertexPicked(pickingColor));\\n\\n // Stores the picking color so that the fragment shader can render it during picking\\n v_PickingResult.rgb = pickingColor * COLOR_SCALE;\\n}\\n\\nfloat setPickingSize(float x) {\\n return u_PickingStage == PICKING_ENCODE ? x + u_PickingBuffer : x;\\n}\";\n\n/* babel-plugin-inline-import './shaders/webgl.sdf2d.frag.glsl' */\nvar sdf2dFrag = \"/**\\n * 2D signed distance field functions\\n * @see http://www.iquilezles.org/www/articles/distfunctions2d/distfunctions2d.htm\\n */\\n\\nfloat ndot(vec2 a, vec2 b ) { return a.x*b.x - a.y*b.y; }\\n\\nfloat sdCircle(vec2 p, float r) {\\n return length(p) - r;\\n}\\n\\nfloat sdEquilateralTriangle(vec2 p) {\\n float k = sqrt(3.0);\\n p.x = abs(p.x) - 1.0;\\n p.y = p.y + 1.0/k;\\n if( p.x + k*p.y > 0.0 ) p = vec2(p.x-k*p.y,-k*p.x-p.y)/2.0;\\n p.x -= clamp( p.x, -2.0, 0.0 );\\n return -length(p)*sign(p.y);\\n}\\n\\nfloat sdBox(vec2 p, vec2 b) {\\n vec2 d = abs(p)-b;\\n return length(max(d,vec2(0))) + min(max(d.x,d.y),0.0);\\n}\\n\\nfloat sdPentagon(vec2 p, float r) {\\n vec3 k = vec3(0.809016994,0.587785252,0.726542528);\\n p.x = abs(p.x);\\n p -= 2.0*min(dot(vec2(-k.x,k.y),p),0.0)*vec2(-k.x,k.y);\\n p -= 2.0*min(dot(vec2( k.x,k.y),p),0.0)*vec2( k.x,k.y);\\n p -= vec2(clamp(p.x,-r*k.z,r*k.z),r);\\n return length(p)*sign(p.y);\\n}\\n\\nfloat sdHexagon(vec2 p, float r) {\\n vec3 k = vec3(-0.866025404,0.5,0.577350269);\\n p = abs(p);\\n p -= 2.0*min(dot(k.xy,p),0.0)*k.xy;\\n p -= vec2(clamp(p.x, -k.z*r, k.z*r), r);\\n return length(p)*sign(p.y);\\n}\\n\\nfloat sdOctogon(vec2 p, float r) {\\n vec3 k = vec3(-0.9238795325, 0.3826834323, 0.4142135623 );\\n p = abs(p);\\n p -= 2.0*min(dot(vec2( k.x,k.y),p),0.0)*vec2( k.x,k.y);\\n p -= 2.0*min(dot(vec2(-k.x,k.y),p),0.0)*vec2(-k.x,k.y);\\n p -= vec2(clamp(p.x, -k.z*r, k.z*r), r);\\n return length(p)*sign(p.y);\\n}\\n\\nfloat sdHexagram(vec2 p, float r) {\\n vec4 k=vec4(-0.5,0.8660254038,0.5773502692,1.7320508076);\\n p = abs(p);\\n p -= 2.0*min(dot(k.xy,p),0.0)*k.xy;\\n p -= 2.0*min(dot(k.yx,p),0.0)*k.yx;\\n p -= vec2(clamp(p.x,r*k.z,r*k.w),r);\\n return length(p)*sign(p.y);\\n}\\n\\nfloat sdRhombus(vec2 p, vec2 b) {\\n vec2 q = abs(p);\\n float h = clamp((-2.0*ndot(q,b)+ndot(b,b))/dot(b,b),-1.0,1.0);\\n float d = length( q - 0.5*b*vec2(1.0-h,1.0+h) );\\n return d * sign( q.x*b.y + q.y*b.x - b.x*b.y );\\n}\\n\\nfloat sdVesica(vec2 p, float r, float d) {\\n p = abs(p);\\n float b = sqrt(r*r-d*d); // can delay this sqrt\\n return ((p.y-b)*d>p.x*b)\\n ? length(p-vec2(0.0,b))\\n : length(p-vec2(-d,0.0))-r;\\n}\";\nvar precisionRegExp = /precision\\s+(high|low|medium)p\\s+float/;\nvar globalDefaultprecision = '#ifdef GL_FRAGMENT_PRECISION_HIGH\\n precision highp float;\\n #else\\n precision mediump float;\\n#endif\\n';\nvar includeRegExp = /#pragma include ([\"^+\"]?[\"\\ \"[a-zA-Z_0-9](.*)\"]*?)/g;\nvar ShaderModuleService_ShaderModuleService = (_dec = Object(inversify[\"injectable\"])(), _dec(_class = (_temp = /*#__PURE__*/function () {\n function ShaderModuleService() {\n classCallCheck_default()(this, ShaderModuleService);\n\n this.moduleCache = {};\n this.rawContentCache = {};\n }\n\n createClass_default()(ShaderModuleService, [{\n key: \"registerBuiltinModules\",\n value: function registerBuiltinModules() {\n this.destroy();\n this.registerModule('picking', {\n vs: pickingVert,\n fs: pickingFrag\n });\n this.registerModule('sdf2d', {\n vs: '',\n fs: sdf2dFrag\n });\n }\n }, {\n key: \"registerModule\",\n value: function registerModule(moduleName, moduleParams) {\n // prevent registering the same module multiple times\n if (this.rawContentCache[moduleName]) {\n return;\n }\n\n var _moduleParams$vs = moduleParams.vs,\n vs = _moduleParams$vs === void 0 ? '' : _moduleParams$vs,\n _moduleParams$fs = moduleParams.fs,\n fs = _moduleParams$fs === void 0 ? '' : _moduleParams$fs,\n declaredUniforms = moduleParams.uniforms;\n\n var _extractUniforms = extractUniforms(vs),\n extractedVS = _extractUniforms.content,\n vsUniforms = _extractUniforms.uniforms;\n\n var _extractUniforms2 = extractUniforms(fs),\n extractedFS = _extractUniforms2.content,\n fsUniforms = _extractUniforms2.uniforms;\n\n this.rawContentCache[moduleName] = {\n fs: extractedFS,\n uniforms: _objectSpread(_objectSpread(_objectSpread({}, vsUniforms), fsUniforms), declaredUniforms),\n vs: extractedVS\n };\n }\n }, {\n key: \"destroy\",\n value: function destroy() {\n this.moduleCache = {};\n this.rawContentCache = {};\n }\n }, {\n key: \"getModule\",\n value: function getModule(moduleName) {\n var _this = this;\n\n if (this.moduleCache[moduleName]) {\n return this.moduleCache[moduleName];\n }\n\n var rawVS = this.rawContentCache[moduleName].vs || '';\n var rawFS = this.rawContentCache[moduleName].fs || '';\n\n var _this$processModule = this.processModule(rawVS, [], 'vs'),\n vs = _this$processModule.content,\n vsIncludeList = _this$processModule.includeList;\n\n var _this$processModule2 = this.processModule(rawFS, [], 'fs'),\n fs = _this$processModule2.content,\n fsIncludeList = _this$processModule2.includeList;\n\n var compiledFs = fs; // TODO: extract uniforms and their default values from GLSL\n\n var uniforms = uniq(vsIncludeList.concat(fsIncludeList).concat(moduleName)).reduce(function (prev, cur) {\n return _objectSpread(_objectSpread({}, prev), _this.rawContentCache[cur].uniforms);\n }, {});\n /**\n * set default precision for fragment shader\n * https://stackoverflow.com/questions/28540290/why-it-is-necessary-to-set-precision-for-the-fragment-shader\n */\n\n if (!precisionRegExp.test(fs)) {\n compiledFs = globalDefaultprecision + fs;\n }\n\n this.moduleCache[moduleName] = {\n fs: compiledFs.trim(),\n uniforms: uniforms,\n vs: vs.trim()\n };\n return this.moduleCache[moduleName];\n }\n }, {\n key: \"processModule\",\n value: function processModule(rawContent, includeList, type) {\n var _this2 = this;\n\n var compiled = rawContent.replace(includeRegExp, function (_, strMatch) {\n var includeOpt = strMatch.split(' ');\n var includeName = includeOpt[0].replace(/\"/g, '');\n\n if (includeList.indexOf(includeName) > -1) {\n return '';\n }\n\n var txt = _this2.rawContentCache[includeName][type];\n includeList.push(includeName);\n\n var _this2$processModule = _this2.processModule(txt || '', includeList, type),\n content = _this2$processModule.content;\n\n return content;\n });\n return {\n content: compiled,\n includeList: includeList\n };\n }\n }]);\n\n return ShaderModuleService;\n}(), _temp)) || _class);\n\n//# sourceMappingURL=ShaderModuleService.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy13ZWJncHUtY29yZS9lcy91dGlscy9zaGFkZXItbW9kdWxlLmpzPzVhZGEiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2ctd2ViZ3B1LWNvcmUvZXMvdXRpbHMvdW5pcS5qcz81NjIzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9nLXdlYmdwdS1jb3JlL2VzL3NlcnZpY2VzL3NoYWRlci1tb2R1bGUvU2hhZGVyTW9kdWxlU2VydmljZS5qcz9jOTllIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxtSUFBbUk7QUFDNUg7QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYLFNBQVM7QUFDVDtBQUNBOztBQUVBOztBQUVBO0FBQ0EsS0FBSzs7O0FBR0w7QUFDQSw4REFBOEQ7QUFDOUQsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Qzs7QUN6Rk87QUFDUDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsZ0M7O0FDTG9FO0FBQ0E7QUFDTjs7QUFFOUQ7O0FBRUEsMENBQTBDLGdDQUFnQyxvQ0FBb0Msb0RBQW9ELDhEQUE4RCxnRUFBZ0UsRUFBRSxFQUFFLGdDQUFnQyxFQUFFLGFBQWE7O0FBRW5WLGdDQUFnQyxnQkFBZ0Isc0JBQXNCLE9BQU8sdURBQXVELGFBQWEsdURBQXVELENBQUMsd0JBQWUsMkJBQTJCLEVBQUUsRUFBRSxFQUFFLDZDQUE2QywyRUFBMkUsRUFBRSxPQUFPLGlEQUFpRCxrRkFBa0YsRUFBRSxFQUFFLEVBQUUsRUFBRSxlQUFlOztBQUU3ZTtBQUNxQjtBQUNwQjs7QUFFeEM7QUFDQSxnREFBZ0QsK0NBQStDLHFDQUFxQyxzTUFBc00sNENBQTRDLHFCQUFxQiwyREFBMkQsZ0RBQWdELGtHQUFrRyw0RUFBNEUsc0NBQXNDLEtBQUssT0FBTyxtQkFBbUIsS0FBSyxHQUFHLHlIQUF5SCw0Q0FBNEMsMkVBQTJFLGNBQWMsS0FBSyw2RkFBNkYsR0FBRywrS0FBK0ssMkRBQTJELEdBQUc7O0FBRWowQztBQUNBLGlEQUFpRCwrQkFBK0IsNENBQTRDLCtDQUErQyxxQ0FBcUMseUNBQXlDLHFDQUFxQyx1SUFBdUksaU5BQWlOLEdBQUcsNkNBQTZDLDRJQUE0SSwrSUFBK0ksR0FBRyxtQ0FBbUMsdUVBQXVFLEdBQUc7O0FBRWpqQztBQUNBLHFMQUFxTCwwQkFBMEIsRUFBRSxxQ0FBcUMseUJBQXlCLEdBQUcseUNBQXlDLHdCQUF3Qix5QkFBeUIsc0JBQXNCLCtEQUErRCxtQ0FBbUMsZ0NBQWdDLEdBQUcsaUNBQWlDLHNCQUFzQiwwREFBMEQsR0FBRyx1Q0FBdUMsdURBQXVELG1CQUFtQiwyREFBMkQsMkRBQTJELHlDQUF5QywrQkFBK0IsR0FBRyxzQ0FBc0MsZ0RBQWdELGVBQWUsdUNBQXVDLDRDQUE0QywrQkFBK0IsR0FBRyxzQ0FBc0MsOERBQThELGVBQWUsMkRBQTJELDJEQUEyRCw0Q0FBNEMsK0JBQStCLEdBQUcsdUNBQXVDLDZEQUE2RCxlQUFlLHVDQUF1Qyx1Q0FBdUMsd0NBQXdDLCtCQUErQixHQUFHLHFDQUFxQyxvQkFBb0Isa0VBQWtFLG9EQUFvRCxtREFBbUQsR0FBRyw4Q0FBOEMsZUFBZSw0QkFBNEIsNkhBQTZILEdBQUc7QUFDdm9FO0FBQ0Esd0ZBQXdGLG1DQUFtQztBQUMzSDtBQUNBLElBQUksdUNBQW1CLFdBQVcsK0JBQVU7QUFDNUM7QUFDQSxJQUFJLHdCQUFlOztBQUVuQjtBQUNBO0FBQ0E7O0FBRUEsRUFBRSxxQkFBWTtBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsNkJBQTZCLGVBQWU7QUFDNUM7QUFDQTs7QUFFQSw4QkFBOEIsZUFBZTtBQUM3QztBQUNBOztBQUVBO0FBQ0E7QUFDQSw4REFBOEQ7QUFDOUQ7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsMEJBQTBCOztBQUUxQixxQkFBcUIsSUFBSTtBQUN6Qiw2Q0FBNkM7QUFDN0MsT0FBTyxJQUFJO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBLENBQUM7QUFDeUM7QUFDMUMiLCJmaWxlIjoiMTM2LmpzIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGZ1bmN0aW9uIGdldFVuaWZvcm1MZW5ndGhCeVR5cGUodHlwZSkge1xuICB2YXIgYXJyYXlMZW5ndGggPSAwO1xuXG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ3ZlYzInOlxuICAgIGNhc2UgJ2l2ZWMyJzpcbiAgICAgIGFycmF5TGVuZ3RoID0gMjtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAndmVjMyc6XG4gICAgY2FzZSAnaXZlYzMnOlxuICAgICAgYXJyYXlMZW5ndGggPSAzO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICd2ZWM0JzpcbiAgICBjYXNlICdpdmVjNCc6XG4gICAgY2FzZSAnbWF0Mic6XG4gICAgICBhcnJheUxlbmd0aCA9IDQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ21hdDMnOlxuICAgICAgYXJyYXlMZW5ndGggPSA5O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdtYXQ0JzpcbiAgICAgIGFycmF5TGVuZ3RoID0gMTY7XG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gIH1cblxuICByZXR1cm4gYXJyYXlMZW5ndGg7XG59XG52YXIgdW5pZm9ybVJlZ0V4cCA9IC91bmlmb3JtXFxzKyhib29sfGZsb2F0fGludHx2ZWMyfHZlYzN8dmVjNHxpdmVjMnxpdmVjM3xpdmVjNHxtYXQyfG1hdDN8bWF0NHxzYW1wbGVyMkR8c2FtcGxlckN1YmUpXFxzKyhbXFxzXFxTXSo/KTsvZztcbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0VW5pZm9ybXMoY29udGVudCkge1xuICB2YXIgdW5pZm9ybXMgPSB7fTtcbiAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZSh1bmlmb3JtUmVnRXhwLCBmdW5jdGlvbiAoXywgdHlwZSwgYykge1xuICAgIHZhciBkZWZhdWx0VmFsdWVzID0gYy5zcGxpdCgnOicpO1xuICAgIHZhciB1bmlmb3JtTmFtZSA9IGRlZmF1bHRWYWx1ZXNbMF0udHJpbSgpO1xuICAgIHZhciBkZWZhdWx0VmFsdWUgPSAnJztcblxuICAgIGlmIChkZWZhdWx0VmFsdWVzLmxlbmd0aCA+IDEpIHtcbiAgICAgIGRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZXNbMV0udHJpbSgpO1xuICAgIH0gLy8gc2V0IGRlZmF1bHQgdmFsdWUgZm9yIHVuaWZvcm0gYWNjb3JkaW5nIHRvIGl0cyB0eXBlXG4gICAgLy8gZWcuIHZlYzIgdSAtPiBbMC4wLCAwLjBdXG5cblxuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSAnYm9vbCc6XG4gICAgICAgIGRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZSA9PT0gJ3RydWUnO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnZmxvYXQnOlxuICAgICAgY2FzZSAnaW50JzpcbiAgICAgICAgZGVmYXVsdFZhbHVlID0gTnVtYmVyKGRlZmF1bHRWYWx1ZSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICd2ZWMyJzpcbiAgICAgIGNhc2UgJ3ZlYzMnOlxuICAgICAgY2FzZSAndmVjNCc6XG4gICAgICBjYXNlICdpdmVjMic6XG4gICAgICBjYXNlICdpdmVjMyc6XG4gICAgICBjYXNlICdpdmVjNCc6XG4gICAgICBjYXNlICdtYXQyJzpcbiAgICAgIGNhc2UgJ21hdDMnOlxuICAgICAgY2FzZSAnbWF0NCc6XG4gICAgICAgIGlmIChkZWZhdWx0VmFsdWUpIHtcbiAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWUucmVwbGFjZSgnWycsICcnKS5yZXBsYWNlKCddJywgJycpLnNwbGl0KCcsJykucmVkdWNlKGZ1bmN0aW9uIChwcmV2LCBjdXIpIHtcbiAgICAgICAgICAgIHByZXYucHVzaChOdW1iZXIoY3VyLnRyaW0oKSkpO1xuICAgICAgICAgICAgcmV0dXJuIHByZXY7XG4gICAgICAgICAgfSwgW10pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IG5ldyBBcnJheShnZXRVbmlmb3JtTGVuZ3RoQnlUeXBlKHR5cGUpKS5maWxsKDApO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgfSAvLyBAdHMtaWdub3JlXG5cblxuICAgIHVuaWZvcm1zW3VuaWZvcm1OYW1lXSA9IGRlZmF1bHRWYWx1ZTtcbiAgICByZXR1cm4gXCJ1bmlmb3JtIFwiLmNvbmNhdCh0eXBlLCBcIiBcIikuY29uY2F0KHVuaWZvcm1OYW1lLCBcIjtcXG5cIik7XG4gIH0pO1xuICByZXR1cm4ge1xuICAgIGNvbnRlbnQ6IGNvbnRlbnQsXG4gICAgdW5pZm9ybXM6IHVuaWZvcm1zXG4gIH07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zaGFkZXItbW9kdWxlLmpzLm1hcCIsImV4cG9ydCBmdW5jdGlvbiB1bmlxKGFycmF5KSB7XG4gIHJldHVybiBhcnJheS5maWx0ZXIoZnVuY3Rpb24gKHYsIGksIGEpIHtcbiAgICByZXR1cm4gYS5pbmRleE9mKHYpID09PSBpO1xuICB9KTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXVuaXEuanMubWFwIiwiaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzc1wiO1xuXG52YXIgX2RlYywgX2NsYXNzLCBfdGVtcDtcblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7IHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7IGlmIChlbnVtZXJhYmxlT25seSkgc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7IH0pOyBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7IH0gcmV0dXJuIGtleXM7IH1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXSAhPSBudWxsID8gYXJndW1lbnRzW2ldIDoge307IGlmIChpICUgMikgeyBvd25LZXlzKE9iamVjdChzb3VyY2UpLCB0cnVlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pOyB9IGVsc2UgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSk7IH0gZWxzZSB7IG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsgfSk7IH0gfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmltcG9ydCB7IGluamVjdGFibGUgfSBmcm9tICdpbnZlcnNpZnknO1xuaW1wb3J0IHsgZXh0cmFjdFVuaWZvcm1zIH0gZnJvbSAnLi4vLi4vdXRpbHMvc2hhZGVyLW1vZHVsZSc7XG5pbXBvcnQgeyB1bmlxIH0gZnJvbSAnLi4vLi4vdXRpbHMvdW5pcSc7XG5cbi8qIGJhYmVsLXBsdWdpbi1pbmxpbmUtaW1wb3J0ICcuL3NoYWRlcnMvd2ViZ2wucGlja2luZy5mcmFnLmdsc2wnICovXG52YXIgcGlja2luZ0ZyYWcgPSBcInZhcnlpbmcgdmVjNCB2X1BpY2tpbmdSZXN1bHQ7XFxudW5pZm9ybSB2ZWM0IHVfSGlnaGxpZ2h0Q29sb3IgOiBbMCwgMCwgMCwgMF07XFxudW5pZm9ybSBmbG9hdCB1X1BpY2tpbmdTdGFnZSA6IDAuMDtcXG5cXG4jZGVmaW5lIFBJQ0tJTkdfRU5DT0RFIDEuMFxcbiNkZWZpbmUgUElDS0lOR19ISUdITElHSFQgMi4wXFxuI2RlZmluZSBDT0xPUl9TQ0FMRSAxLiAvIDI1NS5cXG5cXG4vKlxcbiAqIFJldHVybnMgaGlnaGxpZ2h0IGNvbG9yIGlmIHRoaXMgaXRlbSBpcyBzZWxlY3RlZC5cXG4gKi9cXG52ZWM0IGZpbHRlckhpZ2hsaWdodENvbG9yKHZlYzQgY29sb3IpIHtcXG4gIGJvb2wgc2VsZWN0ZWQgPSBib29sKHZfUGlja2luZ1Jlc3VsdC5hKTtcXG5cXG4gIGlmIChzZWxlY3RlZCkge1xcbiAgICB2ZWM0IGhpZ2hMaWdodENvbG9yID0gdV9IaWdobGlnaHRDb2xvciAqIENPTE9SX1NDQUxFO1xcblxcbiAgICBmbG9hdCBoaWdoTGlnaHRBbHBoYSA9IGhpZ2hMaWdodENvbG9yLmE7XFxuICAgIGZsb2F0IGhpZ2hMaWdodFJhdGlvID0gaGlnaExpZ2h0QWxwaGEgLyAoaGlnaExpZ2h0QWxwaGEgKyBjb2xvci5hICogKDEuMCAtIGhpZ2hMaWdodEFscGhhKSk7XFxuXFxuICAgIHZlYzMgcmVzdWx0UkdCID0gbWl4KGNvbG9yLnJnYiwgaGlnaExpZ2h0Q29sb3IucmdiLCBoaWdoTGlnaHRSYXRpbyk7XFxuICAgIHJldHVybiB2ZWM0KHJlc3VsdFJHQiwgY29sb3IuYSk7XFxuICB9IGVsc2Uge1xcbiAgICByZXR1cm4gY29sb3I7XFxuICB9XFxufVxcblxcbi8qXFxuICogUmV0dXJucyBwaWNraW5nIGNvbG9yIGlmIHBpY2tpbmcgZW5hYmxlZCBlbHNlIHVubW9kaWZpZWQgYXJndW1lbnQuXFxuICovXFxudmVjNCBmaWx0ZXJQaWNraW5nQ29sb3IodmVjNCBjb2xvcikge1xcbiAgdmVjMyBwaWNraW5nQ29sb3IgPSB2X1BpY2tpbmdSZXN1bHQucmdiO1xcbiAgaWYgKHVfUGlja2luZ1N0YWdlID09IFBJQ0tJTkdfRU5DT0RFICYmIGxlbmd0aChwaWNraW5nQ29sb3IpIDwgMC4wMDEpIHtcXG4gICAgZGlzY2FyZDtcXG4gIH1cXG4gIHJldHVybiB1X1BpY2tpbmdTdGFnZSA9PSBQSUNLSU5HX0VOQ09ERSA/IHZlYzQocGlja2luZ0NvbG9yLCBzdGVwKDAuMDAxLGNvbG9yLmEpKTogY29sb3I7XFxufVxcblxcbi8qXFxuICogUmV0dXJucyBwaWNraW5nIGNvbG9yIGlmIHBpY2tpbmcgaXMgZW5hYmxlZCBpZiBub3RcXG4gKiBoaWdobGlnaHQgY29sb3IgaWYgdGhpcyBpdGVtIGlzIHNlbGVjdGVkLCBvdGhlcndpc2UgdW5tb2RpZmllZCBhcmd1bWVudC5cXG4gKi9cXG52ZWM0IGZpbHRlckNvbG9yKHZlYzQgY29sb3IpIHtcXG4gIHJldHVybiBmaWx0ZXJQaWNraW5nQ29sb3IoZmlsdGVySGlnaGxpZ2h0Q29sb3IoY29sb3IpKTtcXG59XFxuXCI7XG5cbi8qIGJhYmVsLXBsdWdpbi1pbmxpbmUtaW1wb3J0ICcuL3NoYWRlcnMvd2ViZ2wucGlja2luZy52ZXJ0Lmdsc2wnICovXG52YXIgcGlja2luZ1ZlcnQgPSBcImF0dHJpYnV0ZSB2ZWMzIGFfUGlja2luZ0NvbG9yO1xcbnZhcnlpbmcgdmVjNCB2X1BpY2tpbmdSZXN1bHQ7XFxuXFxudW5pZm9ybSB2ZWMzIHVfUGlja2luZ0NvbG9yIDogWzAsIDAsIDBdO1xcbnVuaWZvcm0gdmVjNCB1X0hpZ2hsaWdodENvbG9yIDogWzAsIDAsIDAsIDBdO1xcbnVuaWZvcm0gZmxvYXQgdV9QaWNraW5nU3RhZ2UgOiAwLjA7XFxudW5pZm9ybSBmbG9hdCB1X1BpY2tpbmdUaHJlc2hvbGQgOiAxLjA7XFxudW5pZm9ybSBmbG9hdCB1X1BpY2tpbmdCdWZmZXI6IDAuMDtcXG5cXG4jZGVmaW5lIFBJQ0tJTkdfRU5DT0RFIDEuMFxcbiNkZWZpbmUgUElDS0lOR19ISUdITElHSFQgMi4wXFxuI2RlZmluZSBDT0xPUl9TQ0FMRSAxLiAvIDI1NS5cXG5cXG5ib29sIGlzVmVydGV4UGlja2VkKHZlYzMgdmVydGV4Q29sb3IpIHtcXG4gIHJldHVyblxcbiAgICBhYnModmVydGV4Q29sb3IuciAtIHVfUGlja2luZ0NvbG9yLnIpIDwgdV9QaWNraW5nVGhyZXNob2xkICYmXFxuICAgIGFicyh2ZXJ0ZXhDb2xvci5nIC0gdV9QaWNraW5nQ29sb3IuZykgPCB1X1BpY2tpbmdUaHJlc2hvbGQgJiZcXG4gICAgYWJzKHZlcnRleENvbG9yLmIgLSB1X1BpY2tpbmdDb2xvci5iKSA8IHVfUGlja2luZ1RocmVzaG9sZDtcXG59XFxuXFxudm9pZCBzZXRQaWNraW5nQ29sb3IodmVjMyBwaWNraW5nQ29sb3IpIHtcXG4gIC8vIGNvbXBhcmVzIG9ubHkgaW4gaGlnaGxpZ2h0IHN0YWdlXFxuICB2X1BpY2tpbmdSZXN1bHQuYSA9IGZsb2F0KCh1X1BpY2tpbmdTdGFnZSA9PSBQSUNLSU5HX0hJR0hMSUdIVCkgJiYgaXNWZXJ0ZXhQaWNrZWQocGlja2luZ0NvbG9yKSk7XFxuXFxuICAvLyBTdG9yZXMgdGhlIHBpY2tpbmcgY29sb3Igc28gdGhhdCB0aGUgZnJhZ21lbnQgc2hhZGVyIGNhbiByZW5kZXIgaXQgZHVyaW5nIHBpY2tpbmdcXG4gIHZfUGlja2luZ1Jlc3VsdC5yZ2IgPSBwaWNraW5nQ29sb3IgKiBDT0xPUl9TQ0FMRTtcXG59XFxuXFxuZmxvYXQgc2V0UGlja2luZ1NpemUoZmxvYXQgeCkge1xcbiAgIHJldHVybiB1X1BpY2tpbmdTdGFnZSA9PSBQSUNLSU5HX0VOQ09ERSA/IHggKyB1X1BpY2tpbmdCdWZmZXIgOiB4O1xcbn1cIjtcblxuLyogYmFiZWwtcGx1Z2luLWlubGluZS1pbXBvcnQgJy4vc2hhZGVycy93ZWJnbC5zZGYyZC5mcmFnLmdsc2wnICovXG52YXIgc2RmMmRGcmFnID0gXCIvKipcXG4gKiAyRCBzaWduZWQgZGlzdGFuY2UgZmllbGQgZnVuY3Rpb25zXFxuICogQHNlZSBodHRwOi8vd3d3LmlxdWlsZXpsZXMub3JnL3d3dy9hcnRpY2xlcy9kaXN0ZnVuY3Rpb25zMmQvZGlzdGZ1bmN0aW9uczJkLmh0bVxcbiAqL1xcblxcbmZsb2F0IG5kb3QodmVjMiBhLCB2ZWMyIGIgKSB7IHJldHVybiBhLngqYi54IC0gYS55KmIueTsgfVxcblxcbmZsb2F0IHNkQ2lyY2xlKHZlYzIgcCwgZmxvYXQgcikge1xcbiAgcmV0dXJuIGxlbmd0aChwKSAtIHI7XFxufVxcblxcbmZsb2F0IHNkRXF1aWxhdGVyYWxUcmlhbmdsZSh2ZWMyIHApIHtcXG4gIGZsb2F0IGsgPSBzcXJ0KDMuMCk7XFxuICBwLnggPSBhYnMocC54KSAtIDEuMDtcXG4gIHAueSA9IHAueSArIDEuMC9rO1xcbiAgaWYoIHAueCArIGsqcC55ID4gMC4wICkgcCA9IHZlYzIocC54LWsqcC55LC1rKnAueC1wLnkpLzIuMDtcXG4gIHAueCAtPSBjbGFtcCggcC54LCAtMi4wLCAwLjAgKTtcXG4gIHJldHVybiAtbGVuZ3RoKHApKnNpZ24ocC55KTtcXG59XFxuXFxuZmxvYXQgc2RCb3godmVjMiBwLCB2ZWMyIGIpIHtcXG4gIHZlYzIgZCA9IGFicyhwKS1iO1xcbiAgcmV0dXJuIGxlbmd0aChtYXgoZCx2ZWMyKDApKSkgKyBtaW4obWF4KGQueCxkLnkpLDAuMCk7XFxufVxcblxcbmZsb2F0IHNkUGVudGFnb24odmVjMiBwLCBmbG9hdCByKSB7XFxuICB2ZWMzIGsgPSB2ZWMzKDAuODA5MDE2OTk0LDAuNTg3Nzg1MjUyLDAuNzI2NTQyNTI4KTtcXG4gIHAueCA9IGFicyhwLngpO1xcbiAgcCAtPSAyLjAqbWluKGRvdCh2ZWMyKC1rLngsay55KSxwKSwwLjApKnZlYzIoLWsueCxrLnkpO1xcbiAgcCAtPSAyLjAqbWluKGRvdCh2ZWMyKCBrLngsay55KSxwKSwwLjApKnZlYzIoIGsueCxrLnkpO1xcbiAgcCAtPSB2ZWMyKGNsYW1wKHAueCwtciprLnosciprLnopLHIpO1xcbiAgcmV0dXJuIGxlbmd0aChwKSpzaWduKHAueSk7XFxufVxcblxcbmZsb2F0IHNkSGV4YWdvbih2ZWMyIHAsIGZsb2F0IHIpIHtcXG4gIHZlYzMgayA9IHZlYzMoLTAuODY2MDI1NDA0LDAuNSwwLjU3NzM1MDI2OSk7XFxuICBwID0gYWJzKHApO1xcbiAgcCAtPSAyLjAqbWluKGRvdChrLnh5LHApLDAuMCkqay54eTtcXG4gIHAgLT0gdmVjMihjbGFtcChwLngsIC1rLnoqciwgay56KnIpLCByKTtcXG4gIHJldHVybiBsZW5ndGgocCkqc2lnbihwLnkpO1xcbn1cXG5cXG5mbG9hdCBzZE9jdG9nb24odmVjMiBwLCBmbG9hdCByKSB7XFxuICB2ZWMzIGsgPSB2ZWMzKC0wLjkyMzg3OTUzMjUsIDAuMzgyNjgzNDMyMywgMC40MTQyMTM1NjIzICk7XFxuICBwID0gYWJzKHApO1xcbiAgcCAtPSAyLjAqbWluKGRvdCh2ZWMyKCBrLngsay55KSxwKSwwLjApKnZlYzIoIGsueCxrLnkpO1xcbiAgcCAtPSAyLjAqbWluKGRvdCh2ZWMyKC1rLngsay55KSxwKSwwLjApKnZlYzIoLWsueCxrLnkpO1xcbiAgcCAtPSB2ZWMyKGNsYW1wKHAueCwgLWsueipyLCBrLnoqciksIHIpO1xcbiAgcmV0dXJuIGxlbmd0aChwKSpzaWduKHAueSk7XFxufVxcblxcbmZsb2F0IHNkSGV4YWdyYW0odmVjMiBwLCBmbG9hdCByKSB7XFxuICB2ZWM0IGs9dmVjNCgtMC41LDAuODY2MDI1NDAzOCwwLjU3NzM1MDI2OTIsMS43MzIwNTA4MDc2KTtcXG4gIHAgPSBhYnMocCk7XFxuICBwIC09IDIuMCptaW4oZG90KGsueHkscCksMC4wKSprLnh5O1xcbiAgcCAtPSAyLjAqbWluKGRvdChrLnl4LHApLDAuMCkqay55eDtcXG4gIHAgLT0gdmVjMihjbGFtcChwLngsciprLnosciprLncpLHIpO1xcbiAgcmV0dXJuIGxlbmd0aChwKSpzaWduKHAueSk7XFxufVxcblxcbmZsb2F0IHNkUmhvbWJ1cyh2ZWMyIHAsIHZlYzIgYikge1xcbiAgdmVjMiBxID0gYWJzKHApO1xcbiAgZmxvYXQgaCA9IGNsYW1wKCgtMi4wKm5kb3QocSxiKStuZG90KGIsYikpL2RvdChiLGIpLC0xLjAsMS4wKTtcXG4gIGZsb2F0IGQgPSBsZW5ndGgoIHEgLSAwLjUqYip2ZWMyKDEuMC1oLDEuMCtoKSApO1xcbiAgcmV0dXJuIGQgKiBzaWduKCBxLngqYi55ICsgcS55KmIueCAtIGIueCpiLnkgKTtcXG59XFxuXFxuZmxvYXQgc2RWZXNpY2EodmVjMiBwLCBmbG9hdCByLCBmbG9hdCBkKSB7XFxuICBwID0gYWJzKHApO1xcbiAgZmxvYXQgYiA9IHNxcnQocipyLWQqZCk7IC8vIGNhbiBkZWxheSB0aGlzIHNxcnRcXG4gIHJldHVybiAoKHAueS1iKSpkPnAueCpiKVxcbiAgICAgICAgICA/IGxlbmd0aChwLXZlYzIoMC4wLGIpKVxcbiAgICAgICAgICA6IGxlbmd0aChwLXZlYzIoLWQsMC4wKSktcjtcXG59XCI7XG52YXIgcHJlY2lzaW9uUmVnRXhwID0gL3ByZWNpc2lvblxccysoaGlnaHxsb3d8bWVkaXVtKXBcXHMrZmxvYXQvO1xudmFyIGdsb2JhbERlZmF1bHRwcmVjaXNpb24gPSAnI2lmZGVmIEdMX0ZSQUdNRU5UX1BSRUNJU0lPTl9ISUdIXFxuIHByZWNpc2lvbiBoaWdocCBmbG9hdDtcXG4gI2Vsc2VcXG4gcHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XFxuI2VuZGlmXFxuJztcbnZhciBpbmNsdWRlUmVnRXhwID0gLyNwcmFnbWEgaW5jbHVkZSAoW1wiXitcIl0/W1wiXFwgXCJbYS16QS1aXzAtOV0oLiopXCJdKj8pL2c7XG52YXIgU2hhZGVyTW9kdWxlU2VydmljZSA9IChfZGVjID0gaW5qZWN0YWJsZSgpLCBfZGVjKF9jbGFzcyA9IChfdGVtcCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFNoYWRlck1vZHVsZVNlcnZpY2UoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFNoYWRlck1vZHVsZVNlcnZpY2UpO1xuXG4gICAgdGhpcy5tb2R1bGVDYWNoZSA9IHt9O1xuICAgIHRoaXMucmF3Q29udGVudENhY2hlID0ge307XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoU2hhZGVyTW9kdWxlU2VydmljZSwgW3tcbiAgICBrZXk6IFwicmVnaXN0ZXJCdWlsdGluTW9kdWxlc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZWdpc3RlckJ1aWx0aW5Nb2R1bGVzKCkge1xuICAgICAgdGhpcy5kZXN0cm95KCk7XG4gICAgICB0aGlzLnJlZ2lzdGVyTW9kdWxlKCdwaWNraW5nJywge1xuICAgICAgICB2czogcGlja2luZ1ZlcnQsXG4gICAgICAgIGZzOiBwaWNraW5nRnJhZ1xuICAgICAgfSk7XG4gICAgICB0aGlzLnJlZ2lzdGVyTW9kdWxlKCdzZGYyZCcsIHtcbiAgICAgICAgdnM6ICcnLFxuICAgICAgICBmczogc2RmMmRGcmFnXG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVnaXN0ZXJNb2R1bGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVnaXN0ZXJNb2R1bGUobW9kdWxlTmFtZSwgbW9kdWxlUGFyYW1zKSB7XG4gICAgICAvLyBwcmV2ZW50IHJlZ2lzdGVyaW5nIHRoZSBzYW1lIG1vZHVsZSBtdWx0aXBsZSB0aW1lc1xuICAgICAgaWYgKHRoaXMucmF3Q29udGVudENhY2hlW21vZHVsZU5hbWVdKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIF9tb2R1bGVQYXJhbXMkdnMgPSBtb2R1bGVQYXJhbXMudnMsXG4gICAgICAgICAgdnMgPSBfbW9kdWxlUGFyYW1zJHZzID09PSB2b2lkIDAgPyAnJyA6IF9tb2R1bGVQYXJhbXMkdnMsXG4gICAgICAgICAgX21vZHVsZVBhcmFtcyRmcyA9IG1vZHVsZVBhcmFtcy5mcyxcbiAgICAgICAgICBmcyA9IF9tb2R1bGVQYXJhbXMkZnMgPT09IHZvaWQgMCA/ICcnIDogX21vZHVsZVBhcmFtcyRmcyxcbiAgICAgICAgICBkZWNsYXJlZFVuaWZvcm1zID0gbW9kdWxlUGFyYW1zLnVuaWZvcm1zO1xuXG4gICAgICB2YXIgX2V4dHJhY3RVbmlmb3JtcyA9IGV4dHJhY3RVbmlmb3Jtcyh2cyksXG4gICAgICAgICAgZXh0cmFjdGVkVlMgPSBfZXh0cmFjdFVuaWZvcm1zLmNvbnRlbnQsXG4gICAgICAgICAgdnNVbmlmb3JtcyA9IF9leHRyYWN0VW5pZm9ybXMudW5pZm9ybXM7XG5cbiAgICAgIHZhciBfZXh0cmFjdFVuaWZvcm1zMiA9IGV4dHJhY3RVbmlmb3JtcyhmcyksXG4gICAgICAgICAgZXh0cmFjdGVkRlMgPSBfZXh0cmFjdFVuaWZvcm1zMi5jb250ZW50LFxuICAgICAgICAgIGZzVW5pZm9ybXMgPSBfZXh0cmFjdFVuaWZvcm1zMi51bmlmb3JtcztcblxuICAgICAgdGhpcy5yYXdDb250ZW50Q2FjaGVbbW9kdWxlTmFtZV0gPSB7XG4gICAgICAgIGZzOiBleHRyYWN0ZWRGUyxcbiAgICAgICAgdW5pZm9ybXM6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCB2c1VuaWZvcm1zKSwgZnNVbmlmb3JtcyksIGRlY2xhcmVkVW5pZm9ybXMpLFxuICAgICAgICB2czogZXh0cmFjdGVkVlNcbiAgICAgIH07XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImRlc3Ryb3lcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICAgIHRoaXMubW9kdWxlQ2FjaGUgPSB7fTtcbiAgICAgIHRoaXMucmF3Q29udGVudENhY2hlID0ge307XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldE1vZHVsZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRNb2R1bGUobW9kdWxlTmFtZSkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgaWYgKHRoaXMubW9kdWxlQ2FjaGVbbW9kdWxlTmFtZV0pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubW9kdWxlQ2FjaGVbbW9kdWxlTmFtZV07XG4gICAgICB9XG5cbiAgICAgIHZhciByYXdWUyA9IHRoaXMucmF3Q29udGVudENhY2hlW21vZHVsZU5hbWVdLnZzIHx8ICcnO1xuICAgICAgdmFyIHJhd0ZTID0gdGhpcy5yYXdDb250ZW50Q2FjaGVbbW9kdWxlTmFtZV0uZnMgfHwgJyc7XG5cbiAgICAgIHZhciBfdGhpcyRwcm9jZXNzTW9kdWxlID0gdGhpcy5wcm9jZXNzTW9kdWxlKHJhd1ZTLCBbXSwgJ3ZzJyksXG4gICAgICAgICAgdnMgPSBfdGhpcyRwcm9jZXNzTW9kdWxlLmNvbnRlbnQsXG4gICAgICAgICAgdnNJbmNsdWRlTGlzdCA9IF90aGlzJHByb2Nlc3NNb2R1bGUuaW5jbHVkZUxpc3Q7XG5cbiAgICAgIHZhciBfdGhpcyRwcm9jZXNzTW9kdWxlMiA9IHRoaXMucHJvY2Vzc01vZHVsZShyYXdGUywgW10sICdmcycpLFxuICAgICAgICAgIGZzID0gX3RoaXMkcHJvY2Vzc01vZHVsZTIuY29udGVudCxcbiAgICAgICAgICBmc0luY2x1ZGVMaXN0ID0gX3RoaXMkcHJvY2Vzc01vZHVsZTIuaW5jbHVkZUxpc3Q7XG5cbiAgICAgIHZhciBjb21waWxlZEZzID0gZnM7IC8vIFRPRE86IGV4dHJhY3QgdW5pZm9ybXMgYW5kIHRoZWlyIGRlZmF1bHQgdmFsdWVzIGZyb20gR0xTTFxuXG4gICAgICB2YXIgdW5pZm9ybXMgPSB1bmlxKHZzSW5jbHVkZUxpc3QuY29uY2F0KGZzSW5jbHVkZUxpc3QpLmNvbmNhdChtb2R1bGVOYW1lKSkucmVkdWNlKGZ1bmN0aW9uIChwcmV2LCBjdXIpIHtcbiAgICAgICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcHJldiksIF90aGlzLnJhd0NvbnRlbnRDYWNoZVtjdXJdLnVuaWZvcm1zKTtcbiAgICAgIH0sIHt9KTtcbiAgICAgIC8qKlxuICAgICAgICogc2V0IGRlZmF1bHQgcHJlY2lzaW9uIGZvciBmcmFnbWVudCBzaGFkZXJcbiAgICAgICAqIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzI4NTQwMjkwL3doeS1pdC1pcy1uZWNlc3NhcnktdG8tc2V0LXByZWNpc2lvbi1mb3ItdGhlLWZyYWdtZW50LXNoYWRlclxuICAgICAgICovXG5cbiAgICAgIGlmICghcHJlY2lzaW9uUmVnRXhwLnRlc3QoZnMpKSB7XG4gICAgICAgIGNvbXBpbGVkRnMgPSBnbG9iYWxEZWZhdWx0cHJlY2lzaW9uICsgZnM7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubW9kdWxlQ2FjaGVbbW9kdWxlTmFtZV0gPSB7XG4gICAgICAgIGZzOiBjb21waWxlZEZzLnRyaW0oKSxcbiAgICAgICAgdW5pZm9ybXM6IHVuaWZvcm1zLFxuICAgICAgICB2czogdnMudHJpbSgpXG4gICAgICB9O1xuICAgICAgcmV0dXJuIHRoaXMubW9kdWxlQ2FjaGVbbW9kdWxlTmFtZV07XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInByb2Nlc3NNb2R1bGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcHJvY2Vzc01vZHVsZShyYXdDb250ZW50LCBpbmNsdWRlTGlzdCwgdHlwZSkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIHZhciBjb21waWxlZCA9IHJhd0NvbnRlbnQucmVwbGFjZShpbmNsdWRlUmVnRXhwLCBmdW5jdGlvbiAoXywgc3RyTWF0Y2gpIHtcbiAgICAgICAgdmFyIGluY2x1ZGVPcHQgPSBzdHJNYXRjaC5zcGxpdCgnICcpO1xuICAgICAgICB2YXIgaW5jbHVkZU5hbWUgPSBpbmNsdWRlT3B0WzBdLnJlcGxhY2UoL1wiL2csICcnKTtcblxuICAgICAgICBpZiAoaW5jbHVkZUxpc3QuaW5kZXhPZihpbmNsdWRlTmFtZSkgPiAtMSkge1xuICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB0eHQgPSBfdGhpczIucmF3Q29udGVudENhY2hlW2luY2x1ZGVOYW1lXVt0eXBlXTtcbiAgICAgICAgaW5jbHVkZUxpc3QucHVzaChpbmNsdWRlTmFtZSk7XG5cbiAgICAgICAgdmFyIF90aGlzMiRwcm9jZXNzTW9kdWxlID0gX3RoaXMyLnByb2Nlc3NNb2R1bGUodHh0IHx8ICcnLCBpbmNsdWRlTGlzdCwgdHlwZSksXG4gICAgICAgICAgICBjb250ZW50ID0gX3RoaXMyJHByb2Nlc3NNb2R1bGUuY29udGVudDtcblxuICAgICAgICByZXR1cm4gY29udGVudDtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogY29tcGlsZWQsXG4gICAgICAgIGluY2x1ZGVMaXN0OiBpbmNsdWRlTGlzdFxuICAgICAgfTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gU2hhZGVyTW9kdWxlU2VydmljZTtcbn0oKSwgX3RlbXApKSB8fCBfY2xhc3MpO1xuZXhwb3J0IHsgU2hhZGVyTW9kdWxlU2VydmljZSBhcyBkZWZhdWx0IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TaGFkZXJNb2R1bGVTZXJ2aWNlLmpzLm1hcCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///136\n")},function(module,__webpack_exports__,__webpack_require__){"use strict";eval("\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, \"a\", function() { return /* binding */ GeometryComponent_GeometryComponent; });\n\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/defineProperty.js\nvar defineProperty = __webpack_require__(4);\nvar defineProperty_default = /*#__PURE__*/__webpack_require__.n(defineProperty);\n\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/classCallCheck.js\nvar classCallCheck = __webpack_require__(6);\nvar classCallCheck_default = /*#__PURE__*/__webpack_require__.n(classCallCheck);\n\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/createClass.js\nvar createClass = __webpack_require__(7);\nvar createClass_default = /*#__PURE__*/__webpack_require__.n(createClass);\n\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/assertThisInitialized.js\nvar assertThisInitialized = __webpack_require__(22);\nvar assertThisInitialized_default = /*#__PURE__*/__webpack_require__.n(assertThisInitialized);\n\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/inherits.js\nvar inherits = __webpack_require__(23);\nvar inherits_default = /*#__PURE__*/__webpack_require__.n(inherits);\n\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/possibleConstructorReturn.js\nvar possibleConstructorReturn = __webpack_require__(24);\nvar possibleConstructorReturn_default = /*#__PURE__*/__webpack_require__.n(possibleConstructorReturn);\n\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/getPrototypeOf.js\nvar getPrototypeOf = __webpack_require__(18);\nvar getPrototypeOf_default = /*#__PURE__*/__webpack_require__.n(getPrototypeOf);\n\n// EXTERNAL MODULE: ./node_modules/gl-matrix/esm/index.js + 4 modules\nvar esm = __webpack_require__(2);\n\n// EXTERNAL MODULE: ./node_modules/@antv/g-webgpu-core/es/ComponentManager.js\nvar ComponentManager = __webpack_require__(25);\n\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/typeof.js\nvar helpers_typeof = __webpack_require__(41);\nvar typeof_default = /*#__PURE__*/__webpack_require__.n(helpers_typeof);\n\n// CONCATENATED MODULE: ./node_modules/@antv/g-webgpu-core/es/utils/is-typedarray.js\n\n\n/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n/** `Object#toString` result references. */\n\nvar argsTag = '[object Arguments]';\nvar arrayTag = '[object Array]';\nvar boolTag = '[object Boolean]';\nvar dateTag = '[object Date]';\nvar errorTag = '[object Error]';\nvar funcTag = '[object Function]';\nvar mapTag = '[object Map]';\nvar numberTag = '[object Number]';\nvar objectTag = '[object Object]';\nvar regexpTag = '[object RegExp]';\nvar setTag = '[object Set]';\nvar stringTag = '[object String]';\nvar weakMapTag = '[object WeakMap]';\nvar arrayBufferTag = '[object ArrayBuffer]';\nvar dataViewTag = '[object DataView]';\nvar float32Tag = '[object Float32Array]';\nvar float64Tag = '[object Float64Array]';\nvar int8Tag = '[object Int8Array]';\nvar int16Tag = '[object Int16Array]';\nvar int32Tag = '[object Int32Array]';\nvar uint8Tag = '[object Uint8Array]';\nvar uint8ClampedTag = '[object Uint8ClampedArray]';\nvar uint16Tag = '[object Uint16Array]';\nvar uint32Tag = '[object Uint32Array]';\n/** Used to identify `toStringTag` values of typed arrays. */\n\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] = typedArrayTags[int8Tag] = typedArrayTags[int16Tag] = typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] = typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] = typedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] = typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] = typedArrayTags[dataViewTag] = typedArrayTags[dateTag] = typedArrayTags[errorTag] = typedArrayTags[funcTag] = typedArrayTags[mapTag] = typedArrayTags[numberTag] = typedArrayTags[objectTag] = typedArrayTags[regexpTag] = typedArrayTags[setTag] = typedArrayTags[stringTag] = typedArrayTags[weakMapTag] = false;\n/**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\n\nfunction baseUnary(func) {\n return function (value) {\n return func(value);\n };\n}\n/** Used for built-in method references. */\n\n\nvar objectProto = Object.prototype;\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\n\nvar objectToString = objectProto.toString;\n/**\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n */\n\nfunction baseIsTypedArray(value) {\n return isObjectLike(value) && isLength(value.length) && !!typedArrayTags[objectToString.call(value)];\n}\n\nfunction isLength(value) {\n return typeof value === 'number' && value > -1 && value % 1 === 0 && value <= MAX_SAFE_INTEGER;\n}\n\nfunction isObjectLike(value) {\n return !!value && typeof_default()(value) === 'object';\n}\n/**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\n\n\nvar isTypedArray = baseIsTypedArray;\n//# sourceMappingURL=is-typedarray.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-webgpu-core/es/components/geometry/GeometryComponent.js\n\n\n\n\n\n\n\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { defineProperty_default()(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = getPrototypeOf_default()(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = getPrototypeOf_default()(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return possibleConstructorReturn_default()(this, result); }; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\n\n\n\nvar GeometryComponent_GeometryComponent = /*#__PURE__*/function (_Component) {\n inherits_default()(GeometryComponent, _Component);\n\n var _super = _createSuper(GeometryComponent);\n\n // instanced count\n function GeometryComponent(data) {\n var _this;\n\n classCallCheck_default()(this, GeometryComponent);\n\n _this = _super.call(this, data);\n _this.dirty = true;\n _this.attributes = [];\n _this.indices = void 0;\n _this.indicesBuffer = void 0;\n _this.vertexCount = 0;\n _this.maxInstancedCount = void 0;\n _this.aabb = void 0;\n _this.entity = void 0;\n Object.assign(assertThisInitialized_default()(_this), data);\n return _this;\n }\n /**\n * @see https://threejs.org/docs/#api/en/core/BufferAttribute\n */\n\n\n createClass_default()(GeometryComponent, [{\n key: \"setAttribute\",\n value: function setAttribute(name, data, descriptor, bufferGetter) {\n var existed = this.attributes.find(function (a) {\n return a.name === name;\n });\n\n if (!existed) {\n this.attributes.push(_objectSpread(_objectSpread({\n dirty: true,\n name: name,\n data: data\n }, descriptor), {}, {\n bufferGetter: bufferGetter\n }));\n } else {\n existed.data = data;\n existed.dirty = true;\n }\n\n this.dirty = true;\n return this;\n }\n }, {\n key: \"setIndex\",\n value: function setIndex(data) {\n this.indices = new Uint32Array( // @ts-ignore\n data.buffer ? data.buffer : data);\n this.dirty = true;\n return this;\n }\n /**\n * when merge all the geometries into one, we need to transform every vertex's position\n * and every face's normal\n */\n\n }, {\n key: \"applyMatrix\",\n value: function applyMatrix(matrix) {\n var positionAttribute = this.attributes.find(function (_ref) {\n var name = _ref.name;\n return name === 'position';\n });\n var normalAttribute = this.attributes.find(function (_ref2) {\n var name = _ref2.name;\n return name === 'normal';\n });\n\n if (positionAttribute) {\n positionAttribute.dirty = true; // @ts-ignore\n\n if (positionAttribute.data && positionAttribute.data.length) {\n // @ts-ignore\n for (var i = 0; i < positionAttribute.data.length; i += 3) {\n var position = esm[\"f\" /* vec4 */].fromValues( // @ts-ignore\n positionAttribute.data[i], // @ts-ignore\n positionAttribute.data[i + 1], // @ts-ignore\n positionAttribute.data[i + 2], 1);\n esm[\"f\" /* vec4 */].transformMat4(position, position, matrix);\n\n if (isTypedArray(positionAttribute.data)) {\n // @ts-ignore\n positionAttribute.data.set([position[0], position[1], position[2]], i);\n } else {\n // @ts-ignore\n positionAttribute.data[i] = position[0]; // @ts-ignore\n\n positionAttribute.data[i + 1] = position[1]; // @ts-ignore\n\n positionAttribute.data[i + 2] = position[2];\n }\n }\n }\n }\n\n if (normalAttribute) {\n var normalMatrix = esm[\"a\" /* mat3 */].normalFromMat4(esm[\"a\" /* mat3 */].create(), matrix); // @ts-ignore\n\n if (normalAttribute.data && normalAttribute.data.length) {\n // @ts-ignore\n for (var _i = 0; _i < normalAttribute.data.length; _i += 3) {\n var normal = esm[\"e\" /* vec3 */].fromValues( // @ts-ignore\n normalAttribute.data[_i], // @ts-ignore\n normalAttribute.data[_i + 1], // @ts-ignore\n normalAttribute.data[_i + 2]);\n esm[\"e\" /* vec3 */].transformMat3(normal, normal, normalMatrix);\n esm[\"e\" /* vec3 */].normalize(normal, normal);\n\n if (isTypedArray(normalAttribute.data)) {\n // @ts-ignore\n normalAttribute.data.set([normal[0], normal[1], normal[2]], _i);\n } else {\n // @ts-ignore\n normalAttribute.data[_i] = normal[0]; // @ts-ignore\n\n normalAttribute.data[_i + 1] = normal[1]; // @ts-ignore\n\n normalAttribute.data[_i + 2] = normal[2];\n }\n }\n }\n }\n }\n }]);\n\n return GeometryComponent;\n}(ComponentManager[\"a\" /* Component */]);\n//# sourceMappingURL=GeometryComponent.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy13ZWJncHUtY29yZS9lcy91dGlscy9pcy10eXBlZGFycmF5LmpzP2U5OTUiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2ctd2ViZ3B1LWNvcmUvZXMvY29tcG9uZW50cy9nZW9tZXRyeS9HZW9tZXRyeUNvbXBvbmVudC5qcz9kMWFhIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBb0Q7O0FBRXBEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsU0FBUztBQUNwQixhQUFhLFNBQVM7QUFDdEI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsRUFBRTtBQUNiLGFBQWEsUUFBUTtBQUNyQjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0Esb0JBQW9CLGdCQUFPO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEVBQUU7QUFDYixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR087QUFDUCx5Qzs7QUNsR29FO0FBQ0E7QUFDTjtBQUNvQjtBQUMxQjtBQUNrQztBQUN0Qjs7QUFFcEUsMENBQTBDLGdDQUFnQyxvQ0FBb0Msb0RBQW9ELDhEQUE4RCxnRUFBZ0UsRUFBRSxFQUFFLGdDQUFnQyxFQUFFLGFBQWE7O0FBRW5WLGdDQUFnQyxnQkFBZ0Isc0JBQXNCLE9BQU8sdURBQXVELGFBQWEsdURBQXVELENBQUMsd0JBQWUsMkJBQTJCLEVBQUUsRUFBRSxFQUFFLDZDQUE2QywyRUFBMkUsRUFBRSxPQUFPLGlEQUFpRCxrRkFBa0YsRUFBRSxFQUFFLEVBQUUsRUFBRSxlQUFlOztBQUVwaEIsZ0NBQWdDLDZEQUE2RCx5Q0FBeUMsYUFBYSx3QkFBZSxrQkFBa0IsaUNBQWlDLGlCQUFpQix3QkFBZSxtQkFBbUIseURBQXlELEVBQUUsT0FBTyx1Q0FBdUMsRUFBRSxRQUFRLG1DQUEwQixlQUFlLEdBQUc7O0FBRXZhLHNDQUFzQyx3RUFBd0UsMENBQTBDLDhDQUE4QyxNQUFNLHdFQUF3RSxHQUFHLGFBQWEsRUFBRSxZQUFZLGNBQWMsRUFBRTs7QUFFclI7QUFDTTtBQUNNO0FBQ2xELElBQUksbUNBQWlCO0FBQzVCLEVBQUUsa0JBQVM7O0FBRVg7O0FBRUE7QUFDQTtBQUNBOztBQUVBLElBQUksd0JBQWU7O0FBRW5CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQiwrQkFBc0I7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0EsRUFBRSxxQkFBWTtBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyxpQkFBaUI7QUFDMUI7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0EsdUNBQXVDOztBQUV2QztBQUNBO0FBQ0EseUJBQXlCLG1DQUFtQztBQUM1RCwyQkFBMkIsbUJBQUk7QUFDL0I7QUFDQTtBQUNBO0FBQ0EsWUFBWSxtQkFBSTs7QUFFaEIsZ0JBQWdCLFlBQVk7QUFDNUI7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBLHNEQUFzRDs7QUFFdEQsMERBQTBEOztBQUUxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMkJBQTJCLG1CQUFJLGdCQUFnQixtQkFBSSxtQkFBbUI7O0FBRXRFO0FBQ0E7QUFDQSwwQkFBMEIsa0NBQWtDO0FBQzVELHlCQUF5QixtQkFBSTtBQUM3QjtBQUNBO0FBQ0E7QUFDQSxZQUFZLG1CQUFJO0FBQ2hCLFlBQVksbUJBQUk7O0FBRWhCLGdCQUFnQixZQUFZO0FBQzVCO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQSxtREFBbUQ7O0FBRW5ELHVEQUF1RDs7QUFFdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBLENBQUMsQ0FBQyxxQ0FBUztBQUNYIiwiZmlsZSI6IjEzNy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfdHlwZW9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3R5cGVvZlwiO1xuXG4vKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi9cbnZhciBNQVhfU0FGRV9JTlRFR0VSID0gOTAwNzE5OTI1NDc0MDk5MTtcbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cblxudmFyIGFyZ3NUYWcgPSAnW29iamVjdCBBcmd1bWVudHNdJztcbnZhciBhcnJheVRhZyA9ICdbb2JqZWN0IEFycmF5XSc7XG52YXIgYm9vbFRhZyA9ICdbb2JqZWN0IEJvb2xlYW5dJztcbnZhciBkYXRlVGFnID0gJ1tvYmplY3QgRGF0ZV0nO1xudmFyIGVycm9yVGFnID0gJ1tvYmplY3QgRXJyb3JdJztcbnZhciBmdW5jVGFnID0gJ1tvYmplY3QgRnVuY3Rpb25dJztcbnZhciBtYXBUYWcgPSAnW29iamVjdCBNYXBdJztcbnZhciBudW1iZXJUYWcgPSAnW29iamVjdCBOdW1iZXJdJztcbnZhciBvYmplY3RUYWcgPSAnW29iamVjdCBPYmplY3RdJztcbnZhciByZWdleHBUYWcgPSAnW29iamVjdCBSZWdFeHBdJztcbnZhciBzZXRUYWcgPSAnW29iamVjdCBTZXRdJztcbnZhciBzdHJpbmdUYWcgPSAnW29iamVjdCBTdHJpbmddJztcbnZhciB3ZWFrTWFwVGFnID0gJ1tvYmplY3QgV2Vha01hcF0nO1xudmFyIGFycmF5QnVmZmVyVGFnID0gJ1tvYmplY3QgQXJyYXlCdWZmZXJdJztcbnZhciBkYXRhVmlld1RhZyA9ICdbb2JqZWN0IERhdGFWaWV3XSc7XG52YXIgZmxvYXQzMlRhZyA9ICdbb2JqZWN0IEZsb2F0MzJBcnJheV0nO1xudmFyIGZsb2F0NjRUYWcgPSAnW29iamVjdCBGbG9hdDY0QXJyYXldJztcbnZhciBpbnQ4VGFnID0gJ1tvYmplY3QgSW50OEFycmF5XSc7XG52YXIgaW50MTZUYWcgPSAnW29iamVjdCBJbnQxNkFycmF5XSc7XG52YXIgaW50MzJUYWcgPSAnW29iamVjdCBJbnQzMkFycmF5XSc7XG52YXIgdWludDhUYWcgPSAnW29iamVjdCBVaW50OEFycmF5XSc7XG52YXIgdWludDhDbGFtcGVkVGFnID0gJ1tvYmplY3QgVWludDhDbGFtcGVkQXJyYXldJztcbnZhciB1aW50MTZUYWcgPSAnW29iamVjdCBVaW50MTZBcnJheV0nO1xudmFyIHVpbnQzMlRhZyA9ICdbb2JqZWN0IFVpbnQzMkFycmF5XSc7XG4vKiogVXNlZCB0byBpZGVudGlmeSBgdG9TdHJpbmdUYWdgIHZhbHVlcyBvZiB0eXBlZCBhcnJheXMuICovXG5cbnZhciB0eXBlZEFycmF5VGFncyA9IHt9O1xudHlwZWRBcnJheVRhZ3NbZmxvYXQzMlRhZ10gPSB0eXBlZEFycmF5VGFnc1tmbG9hdDY0VGFnXSA9IHR5cGVkQXJyYXlUYWdzW2ludDhUYWddID0gdHlwZWRBcnJheVRhZ3NbaW50MTZUYWddID0gdHlwZWRBcnJheVRhZ3NbaW50MzJUYWddID0gdHlwZWRBcnJheVRhZ3NbdWludDhUYWddID0gdHlwZWRBcnJheVRhZ3NbdWludDhDbGFtcGVkVGFnXSA9IHR5cGVkQXJyYXlUYWdzW3VpbnQxNlRhZ10gPSB0eXBlZEFycmF5VGFnc1t1aW50MzJUYWddID0gdHJ1ZTtcbnR5cGVkQXJyYXlUYWdzW2FyZ3NUYWddID0gdHlwZWRBcnJheVRhZ3NbYXJyYXlUYWddID0gdHlwZWRBcnJheVRhZ3NbYXJyYXlCdWZmZXJUYWddID0gdHlwZWRBcnJheVRhZ3NbYm9vbFRhZ10gPSB0eXBlZEFycmF5VGFnc1tkYXRhVmlld1RhZ10gPSB0eXBlZEFycmF5VGFnc1tkYXRlVGFnXSA9IHR5cGVkQXJyYXlUYWdzW2Vycm9yVGFnXSA9IHR5cGVkQXJyYXlUYWdzW2Z1bmNUYWddID0gdHlwZWRBcnJheVRhZ3NbbWFwVGFnXSA9IHR5cGVkQXJyYXlUYWdzW251bWJlclRhZ10gPSB0eXBlZEFycmF5VGFnc1tvYmplY3RUYWddID0gdHlwZWRBcnJheVRhZ3NbcmVnZXhwVGFnXSA9IHR5cGVkQXJyYXlUYWdzW3NldFRhZ10gPSB0eXBlZEFycmF5VGFnc1tzdHJpbmdUYWddID0gdHlwZWRBcnJheVRhZ3Nbd2Vha01hcFRhZ10gPSBmYWxzZTtcbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udW5hcnlgIHdpdGhvdXQgc3VwcG9ydCBmb3Igc3RvcmluZyBtZXRhZGF0YS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY2FwIGFyZ3VtZW50cyBmb3IuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjYXBwZWQgZnVuY3Rpb24uXG4gKi9cblxuZnVuY3Rpb24gYmFzZVVuYXJ5KGZ1bmMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIHJldHVybiBmdW5jKHZhbHVlKTtcbiAgfTtcbn1cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cblxuXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuLyoqXG4gKiBVc2VkIHRvIHJlc29sdmUgdGhlXG4gKiBbYHRvU3RyaW5nVGFnYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZylcbiAqIG9mIHZhbHVlcy5cbiAqL1xuXG52YXIgb2JqZWN0VG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZztcbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNUeXBlZEFycmF5YCB3aXRob3V0IE5vZGUuanMgb3B0aW1pemF0aW9ucy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHR5cGVkIGFycmF5LCBlbHNlIGBmYWxzZWAuXG4gKi9cblxuZnVuY3Rpb24gYmFzZUlzVHlwZWRBcnJheSh2YWx1ZSkge1xuICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBpc0xlbmd0aCh2YWx1ZS5sZW5ndGgpICYmICEhdHlwZWRBcnJheVRhZ3Nbb2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSldO1xufVxuXG5mdW5jdGlvbiBpc0xlbmd0aCh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiB2YWx1ZSA+IC0xICYmIHZhbHVlICUgMSA9PT0gMCAmJiB2YWx1ZSA8PSBNQVhfU0FGRV9JTlRFR0VSO1xufVxuXG5mdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpIHtcbiAgcmV0dXJuICEhdmFsdWUgJiYgX3R5cGVvZih2YWx1ZSkgPT09ICdvYmplY3QnO1xufVxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgdHlwZWQgYXJyYXkuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAzLjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB0eXBlZCBhcnJheSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzVHlwZWRBcnJheShuZXcgVWludDhBcnJheSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc1R5cGVkQXJyYXkoW10pO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuXG5cbmV4cG9ydCB2YXIgaXNUeXBlZEFycmF5ID0gYmFzZUlzVHlwZWRBcnJheTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWlzLXR5cGVkYXJyYXkuanMubWFwIiwiaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzc1wiO1xuaW1wb3J0IF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXNzZXJ0VGhpc0luaXRpYWxpemVkXCI7XG5pbXBvcnQgX2luaGVyaXRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2luaGVyaXRzXCI7XG5pbXBvcnQgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4gZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVyblwiO1xuaW1wb3J0IF9nZXRQcm90b3R5cGVPZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9nZXRQcm90b3R5cGVPZlwiO1xuXG5mdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHsgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTsgaWYgKGVudW1lcmFibGVPbmx5KSBzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTsgfSk7IGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsgfSByZXR1cm4ga2V5czsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldICE9IG51bGwgPyBhcmd1bWVudHNbaV0gOiB7fTsgaWYgKGkgJSAyKSB7IG93bktleXMoT2JqZWN0KHNvdXJjZSksIHRydWUpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSk7IH0gZWxzZSBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMpIHsgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKTsgfSBlbHNlIHsgb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpOyB9KTsgfSB9IHJldHVybiB0YXJnZXQ7IH1cblxuZnVuY3Rpb24gX2NyZWF0ZVN1cGVyKERlcml2ZWQpIHsgdmFyIGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QgPSBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCk7IHJldHVybiBmdW5jdGlvbiBfY3JlYXRlU3VwZXJJbnRlcm5hbCgpIHsgdmFyIFN1cGVyID0gX2dldFByb3RvdHlwZU9mKERlcml2ZWQpLCByZXN1bHQ7IGlmIChoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KSB7IHZhciBOZXdUYXJnZXQgPSBfZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3I7IHJlc3VsdCA9IFJlZmxlY3QuY29uc3RydWN0KFN1cGVyLCBhcmd1bWVudHMsIE5ld1RhcmdldCk7IH0gZWxzZSB7IHJlc3VsdCA9IFN1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH0gcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIHJlc3VsdCk7IH07IH1cblxuZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpIHsgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcInVuZGVmaW5lZFwiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlOyBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlOyBpZiAodHlwZW9mIFByb3h5ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiB0cnVlOyB0cnkgeyBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfVxuXG5pbXBvcnQgeyBtYXQzLCB2ZWMzLCB2ZWM0IH0gZnJvbSAnZ2wtbWF0cml4JztcbmltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gJy4uLy4uL0NvbXBvbmVudE1hbmFnZXInO1xuaW1wb3J0IHsgaXNUeXBlZEFycmF5IH0gZnJvbSAnLi4vLi4vdXRpbHMvaXMtdHlwZWRhcnJheSc7XG5leHBvcnQgdmFyIEdlb21ldHJ5Q29tcG9uZW50ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0cyhHZW9tZXRyeUNvbXBvbmVudCwgX0NvbXBvbmVudCk7XG5cbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlcihHZW9tZXRyeUNvbXBvbmVudCk7XG5cbiAgLy8gaW5zdGFuY2VkIGNvdW50XG4gIGZ1bmN0aW9uIEdlb21ldHJ5Q29tcG9uZW50KGRhdGEpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgR2VvbWV0cnlDb21wb25lbnQpO1xuXG4gICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBkYXRhKTtcbiAgICBfdGhpcy5kaXJ0eSA9IHRydWU7XG4gICAgX3RoaXMuYXR0cmlidXRlcyA9IFtdO1xuICAgIF90aGlzLmluZGljZXMgPSB2b2lkIDA7XG4gICAgX3RoaXMuaW5kaWNlc0J1ZmZlciA9IHZvaWQgMDtcbiAgICBfdGhpcy52ZXJ0ZXhDb3VudCA9IDA7XG4gICAgX3RoaXMubWF4SW5zdGFuY2VkQ291bnQgPSB2b2lkIDA7XG4gICAgX3RoaXMuYWFiYiA9IHZvaWQgMDtcbiAgICBfdGhpcy5lbnRpdHkgPSB2b2lkIDA7XG4gICAgT2JqZWN0LmFzc2lnbihfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgZGF0YSk7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG4gIC8qKlxuICAgKiBAc2VlIGh0dHBzOi8vdGhyZWVqcy5vcmcvZG9jcy8jYXBpL2VuL2NvcmUvQnVmZmVyQXR0cmlidXRlXG4gICAqL1xuXG5cbiAgX2NyZWF0ZUNsYXNzKEdlb21ldHJ5Q29tcG9uZW50LCBbe1xuICAgIGtleTogXCJzZXRBdHRyaWJ1dGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0QXR0cmlidXRlKG5hbWUsIGRhdGEsIGRlc2NyaXB0b3IsIGJ1ZmZlckdldHRlcikge1xuICAgICAgdmFyIGV4aXN0ZWQgPSB0aGlzLmF0dHJpYnV0ZXMuZmluZChmdW5jdGlvbiAoYSkge1xuICAgICAgICByZXR1cm4gYS5uYW1lID09PSBuYW1lO1xuICAgICAgfSk7XG5cbiAgICAgIGlmICghZXhpc3RlZCkge1xuICAgICAgICB0aGlzLmF0dHJpYnV0ZXMucHVzaChfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe1xuICAgICAgICAgIGRpcnR5OiB0cnVlLFxuICAgICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgICAgZGF0YTogZGF0YVxuICAgICAgICB9LCBkZXNjcmlwdG9yKSwge30sIHtcbiAgICAgICAgICBidWZmZXJHZXR0ZXI6IGJ1ZmZlckdldHRlclxuICAgICAgICB9KSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBleGlzdGVkLmRhdGEgPSBkYXRhO1xuICAgICAgICBleGlzdGVkLmRpcnR5ID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5kaXJ0eSA9IHRydWU7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2V0SW5kZXhcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0SW5kZXgoZGF0YSkge1xuICAgICAgdGhpcy5pbmRpY2VzID0gbmV3IFVpbnQzMkFycmF5KCAvLyBAdHMtaWdub3JlXG4gICAgICBkYXRhLmJ1ZmZlciA/IGRhdGEuYnVmZmVyIDogZGF0YSk7XG4gICAgICB0aGlzLmRpcnR5ID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiB3aGVuIG1lcmdlIGFsbCB0aGUgZ2VvbWV0cmllcyBpbnRvIG9uZSwgd2UgbmVlZCB0byB0cmFuc2Zvcm0gZXZlcnkgdmVydGV4J3MgcG9zaXRpb25cbiAgICAgKiBhbmQgZXZlcnkgZmFjZSdzIG5vcm1hbFxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiYXBwbHlNYXRyaXhcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYXBwbHlNYXRyaXgobWF0cml4KSB7XG4gICAgICB2YXIgcG9zaXRpb25BdHRyaWJ1dGUgPSB0aGlzLmF0dHJpYnV0ZXMuZmluZChmdW5jdGlvbiAoX3JlZikge1xuICAgICAgICB2YXIgbmFtZSA9IF9yZWYubmFtZTtcbiAgICAgICAgcmV0dXJuIG5hbWUgPT09ICdwb3NpdGlvbic7XG4gICAgICB9KTtcbiAgICAgIHZhciBub3JtYWxBdHRyaWJ1dGUgPSB0aGlzLmF0dHJpYnV0ZXMuZmluZChmdW5jdGlvbiAoX3JlZjIpIHtcbiAgICAgICAgdmFyIG5hbWUgPSBfcmVmMi5uYW1lO1xuICAgICAgICByZXR1cm4gbmFtZSA9PT0gJ25vcm1hbCc7XG4gICAgICB9KTtcblxuICAgICAgaWYgKHBvc2l0aW9uQXR0cmlidXRlKSB7XG4gICAgICAgIHBvc2l0aW9uQXR0cmlidXRlLmRpcnR5ID0gdHJ1ZTsgLy8gQHRzLWlnbm9yZVxuXG4gICAgICAgIGlmIChwb3NpdGlvbkF0dHJpYnV0ZS5kYXRhICYmIHBvc2l0aW9uQXR0cmlidXRlLmRhdGEubGVuZ3RoKSB7XG4gICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcG9zaXRpb25BdHRyaWJ1dGUuZGF0YS5sZW5ndGg7IGkgKz0gMykge1xuICAgICAgICAgICAgdmFyIHBvc2l0aW9uID0gdmVjNC5mcm9tVmFsdWVzKCAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBwb3NpdGlvbkF0dHJpYnV0ZS5kYXRhW2ldLCAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBwb3NpdGlvbkF0dHJpYnV0ZS5kYXRhW2kgKyAxXSwgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgcG9zaXRpb25BdHRyaWJ1dGUuZGF0YVtpICsgMl0sIDEpO1xuICAgICAgICAgICAgdmVjNC50cmFuc2Zvcm1NYXQ0KHBvc2l0aW9uLCBwb3NpdGlvbiwgbWF0cml4KTtcblxuICAgICAgICAgICAgaWYgKGlzVHlwZWRBcnJheShwb3NpdGlvbkF0dHJpYnV0ZS5kYXRhKSkge1xuICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgIHBvc2l0aW9uQXR0cmlidXRlLmRhdGEuc2V0KFtwb3NpdGlvblswXSwgcG9zaXRpb25bMV0sIHBvc2l0aW9uWzJdXSwgaSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgIHBvc2l0aW9uQXR0cmlidXRlLmRhdGFbaV0gPSBwb3NpdGlvblswXTsgLy8gQHRzLWlnbm9yZVxuXG4gICAgICAgICAgICAgIHBvc2l0aW9uQXR0cmlidXRlLmRhdGFbaSArIDFdID0gcG9zaXRpb25bMV07IC8vIEB0cy1pZ25vcmVcblxuICAgICAgICAgICAgICBwb3NpdGlvbkF0dHJpYnV0ZS5kYXRhW2kgKyAyXSA9IHBvc2l0aW9uWzJdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAobm9ybWFsQXR0cmlidXRlKSB7XG4gICAgICAgIHZhciBub3JtYWxNYXRyaXggPSBtYXQzLm5vcm1hbEZyb21NYXQ0KG1hdDMuY3JlYXRlKCksIG1hdHJpeCk7IC8vIEB0cy1pZ25vcmVcblxuICAgICAgICBpZiAobm9ybWFsQXR0cmlidXRlLmRhdGEgJiYgbm9ybWFsQXR0cmlidXRlLmRhdGEubGVuZ3RoKSB7XG4gICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBub3JtYWxBdHRyaWJ1dGUuZGF0YS5sZW5ndGg7IF9pICs9IDMpIHtcbiAgICAgICAgICAgIHZhciBub3JtYWwgPSB2ZWMzLmZyb21WYWx1ZXMoIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIG5vcm1hbEF0dHJpYnV0ZS5kYXRhW19pXSwgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgbm9ybWFsQXR0cmlidXRlLmRhdGFbX2kgKyAxXSwgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgbm9ybWFsQXR0cmlidXRlLmRhdGFbX2kgKyAyXSk7XG4gICAgICAgICAgICB2ZWMzLnRyYW5zZm9ybU1hdDMobm9ybWFsLCBub3JtYWwsIG5vcm1hbE1hdHJpeCk7XG4gICAgICAgICAgICB2ZWMzLm5vcm1hbGl6ZShub3JtYWwsIG5vcm1hbCk7XG5cbiAgICAgICAgICAgIGlmIChpc1R5cGVkQXJyYXkobm9ybWFsQXR0cmlidXRlLmRhdGEpKSB7XG4gICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgbm9ybWFsQXR0cmlidXRlLmRhdGEuc2V0KFtub3JtYWxbMF0sIG5vcm1hbFsxXSwgbm9ybWFsWzJdXSwgX2kpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICBub3JtYWxBdHRyaWJ1dGUuZGF0YVtfaV0gPSBub3JtYWxbMF07IC8vIEB0cy1pZ25vcmVcblxuICAgICAgICAgICAgICBub3JtYWxBdHRyaWJ1dGUuZGF0YVtfaSArIDFdID0gbm9ybWFsWzFdOyAvLyBAdHMtaWdub3JlXG5cbiAgICAgICAgICAgICAgbm9ybWFsQXR0cmlidXRlLmRhdGFbX2kgKyAyXSA9IG5vcm1hbFsyXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gR2VvbWV0cnlDb21wb25lbnQ7XG59KENvbXBvbmVudCk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1HZW9tZXRyeUNvbXBvbmVudC5qcy5tYXAiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///137\n")},function(module,__webpack_exports__,__webpack_require__){"use strict";eval("var WILDCARD = '*';\n/* event-emitter */\nvar EventEmitter = /** @class */ (function () {\n function EventEmitter() {\n this._events = {};\n }\n /**\n * 监听一个事件\n * @param evt\n * @param callback\n * @param once\n */\n EventEmitter.prototype.on = function (evt, callback, once) {\n if (!this._events[evt]) {\n this._events[evt] = [];\n }\n this._events[evt].push({\n callback: callback,\n once: !!once,\n });\n return this;\n };\n /**\n * 监听一个事件一次\n * @param evt\n * @param callback\n */\n EventEmitter.prototype.once = function (evt, callback) {\n this.on(evt, callback, true);\n return this;\n };\n /**\n * 触发一个事件\n * @param evt\n * @param args\n */\n EventEmitter.prototype.emit = function (evt) {\n var _this = this;\n var args = [];\n for (var _i = 1; _i < arguments.length; _i++) {\n args[_i - 1] = arguments[_i];\n }\n var events = this._events[evt] || [];\n var wildcardEvents = this._events[WILDCARD] || [];\n // 实际的处理 emit 方法\n var doEmit = function (es) {\n var length = es.length;\n for (var i = 0; i < length; i++) {\n if (!es[i]) {\n continue;\n }\n var _a = es[i], callback = _a.callback, once = _a.once;\n if (once) {\n es.splice(i, 1);\n if (es.length === 0) {\n delete _this._events[evt];\n }\n length--;\n i--;\n }\n callback.apply(_this, args);\n }\n };\n doEmit(events);\n doEmit(wildcardEvents);\n };\n /**\n * 取消监听一个事件,或者一个channel\n * @param evt\n * @param callback\n */\n EventEmitter.prototype.off = function (evt, callback) {\n if (!evt) {\n // evt 为空全部清除\n this._events = {};\n }\n else {\n if (!callback) {\n // evt 存在,callback 为空,清除事件所有方法\n delete this._events[evt];\n }\n else {\n // evt 存在,callback 存在,清除匹配的\n var events = this._events[evt] || [];\n var length_1 = events.length;\n for (var i = 0; i < length_1; i++) {\n if (events[i].callback === callback) {\n events.splice(i, 1);\n length_1--;\n i--;\n }\n }\n if (events.length === 0) {\n delete this._events[evt];\n }\n }\n }\n return this;\n };\n /* 当前所有的事件 */\n EventEmitter.prototype.getEvents = function () {\n return this._events;\n };\n return EventEmitter;\n}());\n/* harmony default export */ __webpack_exports__[\"a\"] = (EventEmitter);\n//# sourceMappingURL=index.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZXZlbnQtZW1pdHRlci9lc20vaW5kZXguanM/N2ZhMiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3Qix1QkFBdUI7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsWUFBWTtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixjQUFjO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDYyxxRUFBWSxFQUFDO0FBQzVCIiwiZmlsZSI6IjEzOC5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBXSUxEQ0FSRCA9ICcqJztcbi8qIGV2ZW50LWVtaXR0ZXIgKi9cbnZhciBFdmVudEVtaXR0ZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gRXZlbnRFbWl0dGVyKCkge1xuICAgICAgICB0aGlzLl9ldmVudHMgPSB7fTtcbiAgICB9XG4gICAgLyoqXG4gICAgICog55uR5ZCs5LiA5Liq5LqL5Lu2XG4gICAgICogQHBhcmFtIGV2dFxuICAgICAqIEBwYXJhbSBjYWxsYmFja1xuICAgICAqIEBwYXJhbSBvbmNlXG4gICAgICovXG4gICAgRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbiA9IGZ1bmN0aW9uIChldnQsIGNhbGxiYWNrLCBvbmNlKSB7XG4gICAgICAgIGlmICghdGhpcy5fZXZlbnRzW2V2dF0pIHtcbiAgICAgICAgICAgIHRoaXMuX2V2ZW50c1tldnRdID0gW107XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZXZlbnRzW2V2dF0ucHVzaCh7XG4gICAgICAgICAgICBjYWxsYmFjazogY2FsbGJhY2ssXG4gICAgICAgICAgICBvbmNlOiAhIW9uY2UsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIOebkeWQrOS4gOS4quS6i+S7tuS4gOasoVxuICAgICAqIEBwYXJhbSBldnRcbiAgICAgKiBAcGFyYW0gY2FsbGJhY2tcbiAgICAgKi9cbiAgICBFdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uY2UgPSBmdW5jdGlvbiAoZXZ0LCBjYWxsYmFjaykge1xuICAgICAgICB0aGlzLm9uKGV2dCwgY2FsbGJhY2ssIHRydWUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIOinpuWPkeS4gOS4quS6i+S7tlxuICAgICAqIEBwYXJhbSBldnRcbiAgICAgKiBAcGFyYW0gYXJnc1xuICAgICAqL1xuICAgIEV2ZW50RW1pdHRlci5wcm90b3R5cGUuZW1pdCA9IGZ1bmN0aW9uIChldnQpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIGFyZ3MgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAxOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIGFyZ3NbX2kgLSAxXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGV2ZW50cyA9IHRoaXMuX2V2ZW50c1tldnRdIHx8IFtdO1xuICAgICAgICB2YXIgd2lsZGNhcmRFdmVudHMgPSB0aGlzLl9ldmVudHNbV0lMRENBUkRdIHx8IFtdO1xuICAgICAgICAvLyDlrp7pmYXnmoTlpITnkIYgZW1pdCDmlrnms5VcbiAgICAgICAgdmFyIGRvRW1pdCA9IGZ1bmN0aW9uIChlcykge1xuICAgICAgICAgICAgdmFyIGxlbmd0aCA9IGVzLmxlbmd0aDtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoIWVzW2ldKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgX2EgPSBlc1tpXSwgY2FsbGJhY2sgPSBfYS5jYWxsYmFjaywgb25jZSA9IF9hLm9uY2U7XG4gICAgICAgICAgICAgICAgaWYgKG9uY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgZXMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgX3RoaXMuX2V2ZW50c1tldnRdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxlbmd0aC0tO1xuICAgICAgICAgICAgICAgICAgICBpLS07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhbGxiYWNrLmFwcGx5KF90aGlzLCBhcmdzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgZG9FbWl0KGV2ZW50cyk7XG4gICAgICAgIGRvRW1pdCh3aWxkY2FyZEV2ZW50cyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiDlj5bmtojnm5HlkKzkuIDkuKrkuovku7bvvIzmiJbogIXkuIDkuKpjaGFubmVsXG4gICAgICogQHBhcmFtIGV2dFxuICAgICAqIEBwYXJhbSBjYWxsYmFja1xuICAgICAqL1xuICAgIEV2ZW50RW1pdHRlci5wcm90b3R5cGUub2ZmID0gZnVuY3Rpb24gKGV2dCwgY2FsbGJhY2spIHtcbiAgICAgICAgaWYgKCFldnQpIHtcbiAgICAgICAgICAgIC8vIGV2dCDkuLrnqbrlhajpg6jmuIXpmaRcbiAgICAgICAgICAgIHRoaXMuX2V2ZW50cyA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKCFjYWxsYmFjaykge1xuICAgICAgICAgICAgICAgIC8vIGV2dCDlrZjlnKjvvIxjYWxsYmFjayDkuLrnqbrvvIzmuIXpmaTkuovku7bmiYDmnInmlrnms5VcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5fZXZlbnRzW2V2dF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBldnQg5a2Y5Zyo77yMY2FsbGJhY2sg5a2Y5Zyo77yM5riF6Zmk5Yy56YWN55qEXG4gICAgICAgICAgICAgICAgdmFyIGV2ZW50cyA9IHRoaXMuX2V2ZW50c1tldnRdIHx8IFtdO1xuICAgICAgICAgICAgICAgIHZhciBsZW5ndGhfMSA9IGV2ZW50cy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGhfMTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChldmVudHNbaV0uY2FsbGJhY2sgPT09IGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudHMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoXzEtLTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGktLTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZXZlbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5fZXZlbnRzW2V2dF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyog5b2T5YmN5omA5pyJ55qE5LqL5Lu2ICovXG4gICAgRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5nZXRFdmVudHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9ldmVudHM7XG4gICAgfTtcbiAgICByZXR1cm4gRXZlbnRFbWl0dGVyO1xufSgpKTtcbmV4cG9ydCBkZWZhdWx0IEV2ZW50RW1pdHRlcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///138\n")},function(module,__webpack_exports__,__webpack_require__){"use strict";eval("/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1);\n/* harmony import */ var _antv_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(0);\n/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(140);\n/* harmony import */ var _util_util__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(19);\n\n\n\n\nvar SHAPE_MAP = {};\nvar INDEX = '_INDEX';\n/**\n * 设置 canvas\n * @param {IElement} element 元素\n * @param {ICanvas} canvas 画布\n */\nfunction setCanvas(element, canvas) {\n element.set('canvas', canvas);\n if (element.isGroup()) {\n var children = element.get('children');\n if (children.length) {\n children.forEach(function (child) {\n setCanvas(child, canvas);\n });\n }\n }\n}\n/**\n * 设置 timeline\n * @param {IElement} element 元素\n * @param {Timeline} timeline 时间轴\n */\nfunction setTimeline(element, timeline) {\n element.set('timeline', timeline);\n if (element.isGroup()) {\n var children = element.get('children');\n if (children.length) {\n children.forEach(function (child) {\n setTimeline(child, timeline);\n });\n }\n }\n}\nfunction contains(container, element) {\n var children = container.getChildren();\n return children.indexOf(element) >= 0;\n}\nfunction removeChild(container, element, destroy) {\n if (destroy === void 0) { destroy = true; }\n // 不再调用 element.remove() 方法,会出现循环调用\n if (destroy) {\n element.destroy();\n }\n else {\n element.set('parent', null);\n element.set('canvas', null);\n }\n Object(_util_util__WEBPACK_IMPORTED_MODULE_3__[/* removeFromArray */ \"j\"])(container.getChildren(), element);\n}\nfunction getComparer(compare) {\n return function (left, right) {\n var result = compare(left, right);\n return result === 0 ? left[INDEX] - right[INDEX] : result;\n };\n}\nvar Container = /** @class */ (function (_super) {\n Object(tslib__WEBPACK_IMPORTED_MODULE_0__[\"__extends\"])(Container, _super);\n function Container() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n Container.prototype.isCanvas = function () {\n return false;\n };\n // 根据子节点确定 BBox\n Container.prototype.getBBox = function () {\n // 所有的值可能在画布的可视区外\n var minX = Infinity;\n var maxX = -Infinity;\n var minY = Infinity;\n var maxY = -Infinity;\n var xArr = [];\n var yArr = [];\n // 将可见元素、图形以及不为空的图形分组筛选出来,用于包围盒合并\n var children = this.getChildren().filter(function (child) {\n return child.get('visible') && (!child.isGroup() || (child.isGroup() && child.getChildren().length > 0));\n });\n if (children.length > 0) {\n Object(_util_util__WEBPACK_IMPORTED_MODULE_3__[/* each */ \"a\"])(children, function (child) {\n var box = child.getBBox();\n xArr.push(box.minX, box.maxX);\n yArr.push(box.minY, box.maxY);\n });\n minX = Object(_antv_util__WEBPACK_IMPORTED_MODULE_1__[\"min\"])(xArr);\n maxX = Object(_antv_util__WEBPACK_IMPORTED_MODULE_1__[\"max\"])(xArr);\n minY = Object(_antv_util__WEBPACK_IMPORTED_MODULE_1__[\"min\"])(yArr);\n maxY = Object(_antv_util__WEBPACK_IMPORTED_MODULE_1__[\"max\"])(yArr);\n }\n else {\n minX = 0;\n maxX = 0;\n minY = 0;\n maxY = 0;\n }\n var box = {\n x: minX,\n y: minY,\n minX: minX,\n minY: minY,\n maxX: maxX,\n maxY: maxY,\n width: maxX - minX,\n height: maxY - minY,\n };\n return box;\n };\n // 获取画布的包围盒\n Container.prototype.getCanvasBBox = function () {\n var minX = Infinity;\n var maxX = -Infinity;\n var minY = Infinity;\n var maxY = -Infinity;\n var xArr = [];\n var yArr = [];\n // 将可见元素、图形以及不为空的图形分组筛选出来,用于包围盒合并\n var children = this.getChildren().filter(function (child) {\n return child.get('visible') && (!child.isGroup() || (child.isGroup() && child.getChildren().length > 0));\n });\n if (children.length > 0) {\n Object(_util_util__WEBPACK_IMPORTED_MODULE_3__[/* each */ \"a\"])(children, function (child) {\n var box = child.getCanvasBBox();\n xArr.push(box.minX, box.maxX);\n yArr.push(box.minY, box.maxY);\n });\n minX = Object(_antv_util__WEBPACK_IMPORTED_MODULE_1__[\"min\"])(xArr);\n maxX = Object(_antv_util__WEBPACK_IMPORTED_MODULE_1__[\"max\"])(xArr);\n minY = Object(_antv_util__WEBPACK_IMPORTED_MODULE_1__[\"min\"])(yArr);\n maxY = Object(_antv_util__WEBPACK_IMPORTED_MODULE_1__[\"max\"])(yArr);\n }\n else {\n minX = 0;\n maxX = 0;\n minY = 0;\n maxY = 0;\n }\n var box = {\n x: minX,\n y: minY,\n minX: minX,\n minY: minY,\n maxX: maxX,\n maxY: maxY,\n width: maxX - minX,\n height: maxY - minY,\n };\n return box;\n };\n Container.prototype.getDefaultCfg = function () {\n var cfg = _super.prototype.getDefaultCfg.call(this);\n cfg['children'] = [];\n return cfg;\n };\n Container.prototype.onAttrChange = function (name, value, originValue) {\n _super.prototype.onAttrChange.call(this, name, value, originValue);\n if (name === 'matrix') {\n var totalMatrix = this.getTotalMatrix();\n this._applyChildrenMarix(totalMatrix);\n }\n };\n // 不但应用到自己身上还要应用于子元素\n Container.prototype.applyMatrix = function (matrix) {\n var preTotalMatrix = this.getTotalMatrix();\n _super.prototype.applyMatrix.call(this, matrix);\n var totalMatrix = this.getTotalMatrix();\n // totalMatrix 没有发生变化时,这里仅考虑两者都为 null 时\n // 不继续向下传递矩阵\n if (totalMatrix === preTotalMatrix) {\n return;\n }\n this._applyChildrenMarix(totalMatrix);\n };\n // 在子元素上设置矩阵\n Container.prototype._applyChildrenMarix = function (totalMatrix) {\n var children = this.getChildren();\n Object(_util_util__WEBPACK_IMPORTED_MODULE_3__[/* each */ \"a\"])(children, function (child) {\n child.applyMatrix(totalMatrix);\n });\n };\n // 兼容老版本的接口\n Container.prototype.addShape = function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n var type = args[0];\n var cfg = args[1];\n if (Object(_util_util__WEBPACK_IMPORTED_MODULE_3__[/* isObject */ \"f\"])(type)) {\n cfg = type;\n }\n else {\n cfg['type'] = type;\n }\n var shapeType = SHAPE_MAP[cfg.type];\n if (!shapeType) {\n shapeType = Object(_util_util__WEBPACK_IMPORTED_MODULE_3__[/* upperFirst */ \"k\"])(cfg.type);\n SHAPE_MAP[cfg.type] = shapeType;\n }\n var ShapeBase = this.getShapeBase();\n var shape = new ShapeBase[shapeType](cfg);\n this.add(shape);\n return shape;\n };\n Container.prototype.addGroup = function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n var groupClass = args[0], cfg = args[1];\n var group;\n if (Object(_util_util__WEBPACK_IMPORTED_MODULE_3__[/* isFunction */ \"d\"])(groupClass)) {\n if (cfg) {\n group = new groupClass(cfg);\n }\n else {\n group = new groupClass({\n // canvas,\n parent: this,\n });\n }\n }\n else {\n var tmpCfg = groupClass || {};\n var TmpGroupClass = this.getGroupBase();\n group = new TmpGroupClass(tmpCfg);\n }\n this.add(group);\n return group;\n };\n Container.prototype.getCanvas = function () {\n var canvas;\n if (this.isCanvas()) {\n canvas = this;\n }\n else {\n canvas = this.get('canvas');\n }\n return canvas;\n };\n Container.prototype.getShape = function (x, y, ev) {\n // 如果不支持拾取,则直接返回\n if (!Object(_util_util__WEBPACK_IMPORTED_MODULE_3__[/* isAllowCapture */ \"b\"])(this)) {\n return null;\n }\n var children = this.getChildren();\n var shape;\n // 如果容器是 group\n if (!this.isCanvas()) {\n var v = [x, y, 1];\n // 将 x, y 转换成对应于 group 的局部坐标\n v = this.invertFromMatrix(v);\n if (!this.isClipped(v[0], v[1])) {\n shape = this._findShape(children, v[0], v[1], ev);\n }\n }\n else {\n shape = this._findShape(children, x, y, ev);\n }\n return shape;\n };\n Container.prototype._findShape = function (children, x, y, ev) {\n var shape = null;\n for (var i = children.length - 1; i >= 0; i--) {\n var child = children[i];\n if (Object(_util_util__WEBPACK_IMPORTED_MODULE_3__[/* isAllowCapture */ \"b\"])(child)) {\n if (child.isGroup()) {\n shape = child.getShape(x, y, ev);\n }\n else if (child.isHit(x, y)) {\n shape = child;\n }\n }\n if (shape) {\n break;\n }\n }\n return shape;\n };\n Container.prototype.add = function (element) {\n var canvas = this.getCanvas();\n var children = this.getChildren();\n var timeline = this.get('timeline');\n var preParent = element.getParent();\n if (preParent) {\n removeChild(preParent, element, false);\n }\n element.set('parent', this);\n if (canvas) {\n setCanvas(element, canvas);\n }\n if (timeline) {\n setTimeline(element, timeline);\n }\n children.push(element);\n element.onCanvasChange('add');\n this._applyElementMatrix(element);\n };\n // 将当前容器的矩阵应用到子元素\n Container.prototype._applyElementMatrix = function (element) {\n var totalMatrix = this.getTotalMatrix();\n // 添加图形或者分组时,需要把当前图元的矩阵设置进去\n if (totalMatrix) {\n element.applyMatrix(totalMatrix);\n }\n };\n Container.prototype.getChildren = function () {\n return this.get('children');\n };\n Container.prototype.sort = function () {\n var children = this.getChildren();\n // 稳定排序\n Object(_util_util__WEBPACK_IMPORTED_MODULE_3__[/* each */ \"a\"])(children, function (child, index) {\n child[INDEX] = index;\n return child;\n });\n children.sort(getComparer(function (obj1, obj2) {\n return obj1.get('zIndex') - obj2.get('zIndex');\n }));\n this.onCanvasChange('sort');\n };\n Container.prototype.clear = function () {\n this.set('clearing', true);\n if (this.destroyed) {\n return;\n }\n var children = this.getChildren();\n for (var i = children.length - 1; i >= 0; i--) {\n children[i].destroy(); // 销毁子元素\n }\n this.set('children', []);\n this.onCanvasChange('clear');\n this.set('clearing', false);\n };\n Container.prototype.destroy = function () {\n if (this.get('destroyed')) {\n return;\n }\n this.clear();\n _super.prototype.destroy.call(this);\n };\n /**\n * 获取第一个子元素\n * @return {IElement} 第一个元素\n */\n Container.prototype.getFirst = function () {\n return this.getChildByIndex(0);\n };\n /**\n * 获取最后一个子元素\n * @return {IElement} 元素\n */\n Container.prototype.getLast = function () {\n var children = this.getChildren();\n return this.getChildByIndex(children.length - 1);\n };\n /**\n * 根据索引获取子元素\n * @return {IElement} 第一个元素\n */\n Container.prototype.getChildByIndex = function (index) {\n var children = this.getChildren();\n return children[index];\n };\n /**\n * 子元素的数量\n * @return {number} 子元素数量\n */\n Container.prototype.getCount = function () {\n var children = this.getChildren();\n return children.length;\n };\n /**\n * 是否包含对应元素\n * @param {IElement} element 元素\n * @return {boolean}\n */\n Container.prototype.contain = function (element) {\n var children = this.getChildren();\n return children.indexOf(element) > -1;\n };\n /**\n * 移除对应子元素\n * @param {IElement} element 子元素\n * @param {boolean} destroy 是否销毁子元素,默认为 true\n */\n Container.prototype.removeChild = function (element, destroy) {\n if (destroy === void 0) { destroy = true; }\n if (this.contain(element)) {\n element.remove(destroy);\n }\n };\n /**\n * 查找所有匹配的元素\n * @param {ElementFilterFn} fn 匹配函数\n * @return {IElement[]} 元素数组\n */\n Container.prototype.findAll = function (fn) {\n var rst = [];\n var children = this.getChildren();\n Object(_util_util__WEBPACK_IMPORTED_MODULE_3__[/* each */ \"a\"])(children, function (element) {\n if (fn(element)) {\n rst.push(element);\n }\n if (element.isGroup()) {\n rst = rst.concat(element.findAll(fn));\n }\n });\n return rst;\n };\n /**\n * 查找元素,找到第一个返回\n * @param {ElementFilterFn} fn 匹配函数\n * @return {IElement|null} 元素,可以为空\n */\n Container.prototype.find = function (fn) {\n var rst = null;\n var children = this.getChildren();\n Object(_util_util__WEBPACK_IMPORTED_MODULE_3__[/* each */ \"a\"])(children, function (element) {\n if (fn(element)) {\n rst = element;\n }\n else if (element.isGroup()) {\n rst = element.find(fn);\n }\n if (rst) {\n return false;\n }\n });\n return rst;\n };\n /**\n * 根据 ID 查找元素\n * @param {string} id 元素 id\n * @return {IElement|null} 元素\n */\n Container.prototype.findById = function (id) {\n return this.find(function (element) {\n return element.get('id') === id;\n });\n };\n /**\n * 该方法即将废弃,不建议使用\n * 根据 className 查找元素\n * TODO: 该方式定义暂时只给 G6 3.3 以后的版本使用,待 G6 中的 findByClassName 方法移除后,G 也需要同步移除\n * @param {string} className 元素 className\n * @return {IElement | null} 元素\n */\n Container.prototype.findByClassName = function (className) {\n return this.find(function (element) {\n return element.get('className') === className;\n });\n };\n /**\n * 根据 name 查找元素列表\n * @param {string} name 元素名称\n * @return {IElement[]} 元素\n */\n Container.prototype.findAllByName = function (name) {\n return this.findAll(function (element) {\n return element.get('name') === name;\n });\n };\n return Container;\n}(_element__WEBPACK_IMPORTED_MODULE_2__[/* default */ \"a\"]));\n/* harmony default export */ __webpack_exports__[\"a\"] = (Container);\n//# sourceMappingURL=container.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy1iYXNlL2VzbS9hYnN0cmFjdC9jb250YWluZXIuanM/MzMwZCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFrQztBQUNJO0FBQ047QUFDdUU7QUFDdkc7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFNBQVM7QUFDcEIsV0FBVyxRQUFRO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsU0FBUztBQUNwQixXQUFXLFNBQVM7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCLGdCQUFnQjtBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSwwRUFBZTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSx1REFBUztBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLFlBQVksK0RBQUk7QUFDaEI7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLG1CQUFtQixzREFBRztBQUN0QixtQkFBbUIsc0RBQUc7QUFDdEIsbUJBQW1CLHNEQUFHO0FBQ3RCLG1CQUFtQixzREFBRztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QUFDQTtBQUNBO0FBQ0EsUUFBUSwrREFBSTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixnQkFBZ0I7QUFDaEMsZ0JBQWdCLGNBQWM7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLCtEQUFJO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxPQUFPO0FBQ3RCLGdCQUFnQixjQUFjO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLE9BQU87QUFDdEIsZ0JBQWdCLGdCQUFnQjtBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxlQUFlLE9BQU87QUFDdEIsZ0JBQWdCLFdBQVc7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLENBQUMsQ0FBQyx3REFBTztBQUNNLGtFQUFTLEVBQUM7QUFDekIiLCJmaWxlIjoiMTM5LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBtYXgsIG1pbiB9IGZyb20gJ0BhbnR2L3V0aWwnO1xuaW1wb3J0IEVsZW1lbnQgZnJvbSAnLi9lbGVtZW50JztcbmltcG9ydCB7IGlzRnVuY3Rpb24sIGlzT2JqZWN0LCBlYWNoLCByZW1vdmVGcm9tQXJyYXksIHVwcGVyRmlyc3QsIGlzQWxsb3dDYXB0dXJlIH0gZnJvbSAnLi4vdXRpbC91dGlsJztcbnZhciBTSEFQRV9NQVAgPSB7fTtcbnZhciBJTkRFWCA9ICdfSU5ERVgnO1xuLyoqXG4gKiDorr7nva4gY2FudmFzXG4gKiBAcGFyYW0ge0lFbGVtZW50fSBlbGVtZW50IOWFg+e0oFxuICogQHBhcmFtIHtJQ2FudmFzfSAgY2FudmFzICDnlLvluINcbiAqL1xuZnVuY3Rpb24gc2V0Q2FudmFzKGVsZW1lbnQsIGNhbnZhcykge1xuICAgIGVsZW1lbnQuc2V0KCdjYW52YXMnLCBjYW52YXMpO1xuICAgIGlmIChlbGVtZW50LmlzR3JvdXAoKSkge1xuICAgICAgICB2YXIgY2hpbGRyZW4gPSBlbGVtZW50LmdldCgnY2hpbGRyZW4nKTtcbiAgICAgICAgaWYgKGNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICAgICAgY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgICAgICAgICBzZXRDYW52YXMoY2hpbGQsIGNhbnZhcyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8qKlxuICog6K6+572uIHRpbWVsaW5lXG4gKiBAcGFyYW0ge0lFbGVtZW50fSBlbGVtZW50ICDlhYPntKBcbiAqIEBwYXJhbSB7VGltZWxpbmV9IHRpbWVsaW5lIOaXtumXtOi9tFxuICovXG5mdW5jdGlvbiBzZXRUaW1lbGluZShlbGVtZW50LCB0aW1lbGluZSkge1xuICAgIGVsZW1lbnQuc2V0KCd0aW1lbGluZScsIHRpbWVsaW5lKTtcbiAgICBpZiAoZWxlbWVudC5pc0dyb3VwKCkpIHtcbiAgICAgICAgdmFyIGNoaWxkcmVuID0gZWxlbWVudC5nZXQoJ2NoaWxkcmVuJyk7XG4gICAgICAgIGlmIChjaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgICAgICAgICAgc2V0VGltZWxpbmUoY2hpbGQsIHRpbWVsaW5lKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gY29udGFpbnMoY29udGFpbmVyLCBlbGVtZW50KSB7XG4gICAgdmFyIGNoaWxkcmVuID0gY29udGFpbmVyLmdldENoaWxkcmVuKCk7XG4gICAgcmV0dXJuIGNoaWxkcmVuLmluZGV4T2YoZWxlbWVudCkgPj0gMDtcbn1cbmZ1bmN0aW9uIHJlbW92ZUNoaWxkKGNvbnRhaW5lciwgZWxlbWVudCwgZGVzdHJveSkge1xuICAgIGlmIChkZXN0cm95ID09PSB2b2lkIDApIHsgZGVzdHJveSA9IHRydWU7IH1cbiAgICAvLyDkuI3lho3osIPnlKggZWxlbWVudC5yZW1vdmUoKSDmlrnms5XvvIzkvJrlh7rnjrDlvqrnjq/osIPnlKhcbiAgICBpZiAoZGVzdHJveSkge1xuICAgICAgICBlbGVtZW50LmRlc3Ryb3koKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGVsZW1lbnQuc2V0KCdwYXJlbnQnLCBudWxsKTtcbiAgICAgICAgZWxlbWVudC5zZXQoJ2NhbnZhcycsIG51bGwpO1xuICAgIH1cbiAgICByZW1vdmVGcm9tQXJyYXkoY29udGFpbmVyLmdldENoaWxkcmVuKCksIGVsZW1lbnQpO1xufVxuZnVuY3Rpb24gZ2V0Q29tcGFyZXIoY29tcGFyZSkge1xuICAgIHJldHVybiBmdW5jdGlvbiAobGVmdCwgcmlnaHQpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IGNvbXBhcmUobGVmdCwgcmlnaHQpO1xuICAgICAgICByZXR1cm4gcmVzdWx0ID09PSAwID8gbGVmdFtJTkRFWF0gLSByaWdodFtJTkRFWF0gOiByZXN1bHQ7XG4gICAgfTtcbn1cbnZhciBDb250YWluZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKENvbnRhaW5lciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBDb250YWluZXIoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICB9XG4gICAgQ29udGFpbmVyLnByb3RvdHlwZS5pc0NhbnZhcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG4gICAgLy8g5qC55o2u5a2Q6IqC54K556Gu5a6aIEJCb3hcbiAgICBDb250YWluZXIucHJvdG90eXBlLmdldEJCb3ggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIOaJgOacieeahOWAvOWPr+iDveWcqOeUu+W4g+eahOWPr+inhuWMuuWkllxuICAgICAgICB2YXIgbWluWCA9IEluZmluaXR5O1xuICAgICAgICB2YXIgbWF4WCA9IC1JbmZpbml0eTtcbiAgICAgICAgdmFyIG1pblkgPSBJbmZpbml0eTtcbiAgICAgICAgdmFyIG1heFkgPSAtSW5maW5pdHk7XG4gICAgICAgIHZhciB4QXJyID0gW107XG4gICAgICAgIHZhciB5QXJyID0gW107XG4gICAgICAgIC8vIOWwhuWPr+ingeWFg+e0oOOAgeWbvuW9ouS7peWPiuS4jeS4uuepuueahOWbvuW9ouWIhue7hOetm+mAieWHuuadpe+8jOeUqOS6juWMheWbtOebkuWQiOW5tlxuICAgICAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLmdldENoaWxkcmVuKCkuZmlsdGVyKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICAgICAgcmV0dXJuIGNoaWxkLmdldCgndmlzaWJsZScpICYmICghY2hpbGQuaXNHcm91cCgpIHx8IChjaGlsZC5pc0dyb3VwKCkgJiYgY2hpbGQuZ2V0Q2hpbGRyZW4oKS5sZW5ndGggPiAwKSk7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZWFjaChjaGlsZHJlbiwgZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgICAgICAgICAgdmFyIGJveCA9IGNoaWxkLmdldEJCb3goKTtcbiAgICAgICAgICAgICAgICB4QXJyLnB1c2goYm94Lm1pblgsIGJveC5tYXhYKTtcbiAgICAgICAgICAgICAgICB5QXJyLnB1c2goYm94Lm1pblksIGJveC5tYXhZKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbWluWCA9IG1pbih4QXJyKTtcbiAgICAgICAgICAgIG1heFggPSBtYXgoeEFycik7XG4gICAgICAgICAgICBtaW5ZID0gbWluKHlBcnIpO1xuICAgICAgICAgICAgbWF4WSA9IG1heCh5QXJyKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG1pblggPSAwO1xuICAgICAgICAgICAgbWF4WCA9IDA7XG4gICAgICAgICAgICBtaW5ZID0gMDtcbiAgICAgICAgICAgIG1heFkgPSAwO1xuICAgICAgICB9XG4gICAgICAgIHZhciBib3ggPSB7XG4gICAgICAgICAgICB4OiBtaW5YLFxuICAgICAgICAgICAgeTogbWluWSxcbiAgICAgICAgICAgIG1pblg6IG1pblgsXG4gICAgICAgICAgICBtaW5ZOiBtaW5ZLFxuICAgICAgICAgICAgbWF4WDogbWF4WCxcbiAgICAgICAgICAgIG1heFk6IG1heFksXG4gICAgICAgICAgICB3aWR0aDogbWF4WCAtIG1pblgsXG4gICAgICAgICAgICBoZWlnaHQ6IG1heFkgLSBtaW5ZLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gYm94O1xuICAgIH07XG4gICAgLy8g6I635Y+W55S75biD55qE5YyF5Zu055uSXG4gICAgQ29udGFpbmVyLnByb3RvdHlwZS5nZXRDYW52YXNCQm94ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgbWluWCA9IEluZmluaXR5O1xuICAgICAgICB2YXIgbWF4WCA9IC1JbmZpbml0eTtcbiAgICAgICAgdmFyIG1pblkgPSBJbmZpbml0eTtcbiAgICAgICAgdmFyIG1heFkgPSAtSW5maW5pdHk7XG4gICAgICAgIHZhciB4QXJyID0gW107XG4gICAgICAgIHZhciB5QXJyID0gW107XG4gICAgICAgIC8vIOWwhuWPr+ingeWFg+e0oOOAgeWbvuW9ouS7peWPiuS4jeS4uuepuueahOWbvuW9ouWIhue7hOetm+mAieWHuuadpe+8jOeUqOS6juWMheWbtOebkuWQiOW5tlxuICAgICAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLmdldENoaWxkcmVuKCkuZmlsdGVyKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICAgICAgcmV0dXJuIGNoaWxkLmdldCgndmlzaWJsZScpICYmICghY2hpbGQuaXNHcm91cCgpIHx8IChjaGlsZC5pc0dyb3VwKCkgJiYgY2hpbGQuZ2V0Q2hpbGRyZW4oKS5sZW5ndGggPiAwKSk7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZWFjaChjaGlsZHJlbiwgZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgICAgICAgICAgdmFyIGJveCA9IGNoaWxkLmdldENhbnZhc0JCb3goKTtcbiAgICAgICAgICAgICAgICB4QXJyLnB1c2goYm94Lm1pblgsIGJveC5tYXhYKTtcbiAgICAgICAgICAgICAgICB5QXJyLnB1c2goYm94Lm1pblksIGJveC5tYXhZKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbWluWCA9IG1pbih4QXJyKTtcbiAgICAgICAgICAgIG1heFggPSBtYXgoeEFycik7XG4gICAgICAgICAgICBtaW5ZID0gbWluKHlBcnIpO1xuICAgICAgICAgICAgbWF4WSA9IG1heCh5QXJyKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG1pblggPSAwO1xuICAgICAgICAgICAgbWF4WCA9IDA7XG4gICAgICAgICAgICBtaW5ZID0gMDtcbiAgICAgICAgICAgIG1heFkgPSAwO1xuICAgICAgICB9XG4gICAgICAgIHZhciBib3ggPSB7XG4gICAgICAgICAgICB4OiBtaW5YLFxuICAgICAgICAgICAgeTogbWluWSxcbiAgICAgICAgICAgIG1pblg6IG1pblgsXG4gICAgICAgICAgICBtaW5ZOiBtaW5ZLFxuICAgICAgICAgICAgbWF4WDogbWF4WCxcbiAgICAgICAgICAgIG1heFk6IG1heFksXG4gICAgICAgICAgICB3aWR0aDogbWF4WCAtIG1pblgsXG4gICAgICAgICAgICBoZWlnaHQ6IG1heFkgLSBtaW5ZLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gYm94O1xuICAgIH07XG4gICAgQ29udGFpbmVyLnByb3RvdHlwZS5nZXREZWZhdWx0Q2ZnID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgY2ZnID0gX3N1cGVyLnByb3RvdHlwZS5nZXREZWZhdWx0Q2ZnLmNhbGwodGhpcyk7XG4gICAgICAgIGNmZ1snY2hpbGRyZW4nXSA9IFtdO1xuICAgICAgICByZXR1cm4gY2ZnO1xuICAgIH07XG4gICAgQ29udGFpbmVyLnByb3RvdHlwZS5vbkF0dHJDaGFuZ2UgPSBmdW5jdGlvbiAobmFtZSwgdmFsdWUsIG9yaWdpblZhbHVlKSB7XG4gICAgICAgIF9zdXBlci5wcm90b3R5cGUub25BdHRyQ2hhbmdlLmNhbGwodGhpcywgbmFtZSwgdmFsdWUsIG9yaWdpblZhbHVlKTtcbiAgICAgICAgaWYgKG5hbWUgPT09ICdtYXRyaXgnKSB7XG4gICAgICAgICAgICB2YXIgdG90YWxNYXRyaXggPSB0aGlzLmdldFRvdGFsTWF0cml4KCk7XG4gICAgICAgICAgICB0aGlzLl9hcHBseUNoaWxkcmVuTWFyaXgodG90YWxNYXRyaXgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvLyDkuI3kvYblupTnlKjliLDoh6rlt7HouqvkuIrov5jopoHlupTnlKjkuo7lrZDlhYPntKBcbiAgICBDb250YWluZXIucHJvdG90eXBlLmFwcGx5TWF0cml4ID0gZnVuY3Rpb24gKG1hdHJpeCkge1xuICAgICAgICB2YXIgcHJlVG90YWxNYXRyaXggPSB0aGlzLmdldFRvdGFsTWF0cml4KCk7XG4gICAgICAgIF9zdXBlci5wcm90b3R5cGUuYXBwbHlNYXRyaXguY2FsbCh0aGlzLCBtYXRyaXgpO1xuICAgICAgICB2YXIgdG90YWxNYXRyaXggPSB0aGlzLmdldFRvdGFsTWF0cml4KCk7XG4gICAgICAgIC8vIHRvdGFsTWF0cml4IOayoeacieWPkeeUn+WPmOWMluaXtu+8jOi/memHjOS7heiAg+iZkeS4pOiAhemDveS4uiBudWxsIOaXtlxuICAgICAgICAvLyDkuI3nu6fnu63lkJHkuIvkvKDpgJLnn6npmLVcbiAgICAgICAgaWYgKHRvdGFsTWF0cml4ID09PSBwcmVUb3RhbE1hdHJpeCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2FwcGx5Q2hpbGRyZW5NYXJpeCh0b3RhbE1hdHJpeCk7XG4gICAgfTtcbiAgICAvLyDlnKjlrZDlhYPntKDkuIrorr7nva7nn6npmLVcbiAgICBDb250YWluZXIucHJvdG90eXBlLl9hcHBseUNoaWxkcmVuTWFyaXggPSBmdW5jdGlvbiAodG90YWxNYXRyaXgpIHtcbiAgICAgICAgdmFyIGNoaWxkcmVuID0gdGhpcy5nZXRDaGlsZHJlbigpO1xuICAgICAgICBlYWNoKGNoaWxkcmVuLCBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgICAgIGNoaWxkLmFwcGx5TWF0cml4KHRvdGFsTWF0cml4KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvLyDlhbzlrrnogIHniYjmnKznmoTmjqXlj6NcbiAgICBDb250YWluZXIucHJvdG90eXBlLmFkZFNoYXBlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYXJncyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgYXJnc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICB9XG4gICAgICAgIHZhciB0eXBlID0gYXJnc1swXTtcbiAgICAgICAgdmFyIGNmZyA9IGFyZ3NbMV07XG4gICAgICAgIGlmIChpc09iamVjdCh0eXBlKSkge1xuICAgICAgICAgICAgY2ZnID0gdHlwZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNmZ1sndHlwZSddID0gdHlwZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgc2hhcGVUeXBlID0gU0hBUEVfTUFQW2NmZy50eXBlXTtcbiAgICAgICAgaWYgKCFzaGFwZVR5cGUpIHtcbiAgICAgICAgICAgIHNoYXBlVHlwZSA9IHVwcGVyRmlyc3QoY2ZnLnR5cGUpO1xuICAgICAgICAgICAgU0hBUEVfTUFQW2NmZy50eXBlXSA9IHNoYXBlVHlwZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgU2hhcGVCYXNlID0gdGhpcy5nZXRTaGFwZUJhc2UoKTtcbiAgICAgICAgdmFyIHNoYXBlID0gbmV3IFNoYXBlQmFzZVtzaGFwZVR5cGVdKGNmZyk7XG4gICAgICAgIHRoaXMuYWRkKHNoYXBlKTtcbiAgICAgICAgcmV0dXJuIHNoYXBlO1xuICAgIH07XG4gICAgQ29udGFpbmVyLnByb3RvdHlwZS5hZGRHcm91cCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZ3JvdXBDbGFzcyA9IGFyZ3NbMF0sIGNmZyA9IGFyZ3NbMV07XG4gICAgICAgIHZhciBncm91cDtcbiAgICAgICAgaWYgKGlzRnVuY3Rpb24oZ3JvdXBDbGFzcykpIHtcbiAgICAgICAgICAgIGlmIChjZmcpIHtcbiAgICAgICAgICAgICAgICBncm91cCA9IG5ldyBncm91cENsYXNzKGNmZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBncm91cCA9IG5ldyBncm91cENsYXNzKHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY2FudmFzLFxuICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IHRoaXMsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2YXIgdG1wQ2ZnID0gZ3JvdXBDbGFzcyB8fCB7fTtcbiAgICAgICAgICAgIHZhciBUbXBHcm91cENsYXNzID0gdGhpcy5nZXRHcm91cEJhc2UoKTtcbiAgICAgICAgICAgIGdyb3VwID0gbmV3IFRtcEdyb3VwQ2xhc3ModG1wQ2ZnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFkZChncm91cCk7XG4gICAgICAgIHJldHVybiBncm91cDtcbiAgICB9O1xuICAgIENvbnRhaW5lci5wcm90b3R5cGUuZ2V0Q2FudmFzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgY2FudmFzO1xuICAgICAgICBpZiAodGhpcy5pc0NhbnZhcygpKSB7XG4gICAgICAgICAgICBjYW52YXMgPSB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY2FudmFzID0gdGhpcy5nZXQoJ2NhbnZhcycpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjYW52YXM7XG4gICAgfTtcbiAgICBDb250YWluZXIucHJvdG90eXBlLmdldFNoYXBlID0gZnVuY3Rpb24gKHgsIHksIGV2KSB7XG4gICAgICAgIC8vIOWmguaenOS4jeaUr+aMgeaLvuWPlu+8jOWImeebtOaOpei/lOWbnlxuICAgICAgICBpZiAoIWlzQWxsb3dDYXB0dXJlKHRoaXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLmdldENoaWxkcmVuKCk7XG4gICAgICAgIHZhciBzaGFwZTtcbiAgICAgICAgLy8g5aaC5p6c5a655Zmo5pivIGdyb3VwXG4gICAgICAgIGlmICghdGhpcy5pc0NhbnZhcygpKSB7XG4gICAgICAgICAgICB2YXIgdiA9IFt4LCB5LCAxXTtcbiAgICAgICAgICAgIC8vIOWwhiB4LCB5IOi9rOaNouaIkOWvueW6lOS6jiBncm91cCDnmoTlsYDpg6jlnZDmoIdcbiAgICAgICAgICAgIHYgPSB0aGlzLmludmVydEZyb21NYXRyaXgodik7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNDbGlwcGVkKHZbMF0sIHZbMV0pKSB7XG4gICAgICAgICAgICAgICAgc2hhcGUgPSB0aGlzLl9maW5kU2hhcGUoY2hpbGRyZW4sIHZbMF0sIHZbMV0sIGV2KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHNoYXBlID0gdGhpcy5fZmluZFNoYXBlKGNoaWxkcmVuLCB4LCB5LCBldik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNoYXBlO1xuICAgIH07XG4gICAgQ29udGFpbmVyLnByb3RvdHlwZS5fZmluZFNoYXBlID0gZnVuY3Rpb24gKGNoaWxkcmVuLCB4LCB5LCBldikge1xuICAgICAgICB2YXIgc2hhcGUgPSBudWxsO1xuICAgICAgICBmb3IgKHZhciBpID0gY2hpbGRyZW4ubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIHZhciBjaGlsZCA9IGNoaWxkcmVuW2ldO1xuICAgICAgICAgICAgaWYgKGlzQWxsb3dDYXB0dXJlKGNoaWxkKSkge1xuICAgICAgICAgICAgICAgIGlmIChjaGlsZC5pc0dyb3VwKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgc2hhcGUgPSBjaGlsZC5nZXRTaGFwZSh4LCB5LCBldik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNoaWxkLmlzSGl0KHgsIHkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHNoYXBlID0gY2hpbGQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHNoYXBlKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNoYXBlO1xuICAgIH07XG4gICAgQ29udGFpbmVyLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICB2YXIgY2FudmFzID0gdGhpcy5nZXRDYW52YXMoKTtcbiAgICAgICAgdmFyIGNoaWxkcmVuID0gdGhpcy5nZXRDaGlsZHJlbigpO1xuICAgICAgICB2YXIgdGltZWxpbmUgPSB0aGlzLmdldCgndGltZWxpbmUnKTtcbiAgICAgICAgdmFyIHByZVBhcmVudCA9IGVsZW1lbnQuZ2V0UGFyZW50KCk7XG4gICAgICAgIGlmIChwcmVQYXJlbnQpIHtcbiAgICAgICAgICAgIHJlbW92ZUNoaWxkKHByZVBhcmVudCwgZWxlbWVudCwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsZW1lbnQuc2V0KCdwYXJlbnQnLCB0aGlzKTtcbiAgICAgICAgaWYgKGNhbnZhcykge1xuICAgICAgICAgICAgc2V0Q2FudmFzKGVsZW1lbnQsIGNhbnZhcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRpbWVsaW5lKSB7XG4gICAgICAgICAgICBzZXRUaW1lbGluZShlbGVtZW50LCB0aW1lbGluZSk7XG4gICAgICAgIH1cbiAgICAgICAgY2hpbGRyZW4ucHVzaChlbGVtZW50KTtcbiAgICAgICAgZWxlbWVudC5vbkNhbnZhc0NoYW5nZSgnYWRkJyk7XG4gICAgICAgIHRoaXMuX2FwcGx5RWxlbWVudE1hdHJpeChlbGVtZW50KTtcbiAgICB9O1xuICAgIC8vIOWwhuW9k+WJjeWuueWZqOeahOefqemYteW6lOeUqOWIsOWtkOWFg+e0oFxuICAgIENvbnRhaW5lci5wcm90b3R5cGUuX2FwcGx5RWxlbWVudE1hdHJpeCA9IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgIHZhciB0b3RhbE1hdHJpeCA9IHRoaXMuZ2V0VG90YWxNYXRyaXgoKTtcbiAgICAgICAgLy8g5re75Yqg5Zu+5b2i5oiW6ICF5YiG57uE5pe277yM6ZyA6KaB5oqK5b2T5YmN5Zu+5YWD55qE55+p6Zi16K6+572u6L+b5Y67XG4gICAgICAgIGlmICh0b3RhbE1hdHJpeCkge1xuICAgICAgICAgICAgZWxlbWVudC5hcHBseU1hdHJpeCh0b3RhbE1hdHJpeCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIENvbnRhaW5lci5wcm90b3R5cGUuZ2V0Q2hpbGRyZW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldCgnY2hpbGRyZW4nKTtcbiAgICB9O1xuICAgIENvbnRhaW5lci5wcm90b3R5cGUuc29ydCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGNoaWxkcmVuID0gdGhpcy5nZXRDaGlsZHJlbigpO1xuICAgICAgICAvLyDnqLPlrprmjpLluo9cbiAgICAgICAgZWFjaChjaGlsZHJlbiwgZnVuY3Rpb24gKGNoaWxkLCBpbmRleCkge1xuICAgICAgICAgICAgY2hpbGRbSU5ERVhdID0gaW5kZXg7XG4gICAgICAgICAgICByZXR1cm4gY2hpbGQ7XG4gICAgICAgIH0pO1xuICAgICAgICBjaGlsZHJlbi5zb3J0KGdldENvbXBhcmVyKGZ1bmN0aW9uIChvYmoxLCBvYmoyKSB7XG4gICAgICAgICAgICByZXR1cm4gb2JqMS5nZXQoJ3pJbmRleCcpIC0gb2JqMi5nZXQoJ3pJbmRleCcpO1xuICAgICAgICB9KSk7XG4gICAgICAgIHRoaXMub25DYW52YXNDaGFuZ2UoJ3NvcnQnKTtcbiAgICB9O1xuICAgIENvbnRhaW5lci5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuc2V0KCdjbGVhcmluZycsIHRydWUpO1xuICAgICAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLmdldENoaWxkcmVuKCk7XG4gICAgICAgIGZvciAodmFyIGkgPSBjaGlsZHJlbi5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgY2hpbGRyZW5baV0uZGVzdHJveSgpOyAvLyDplIDmr4HlrZDlhYPntKBcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldCgnY2hpbGRyZW4nLCBbXSk7XG4gICAgICAgIHRoaXMub25DYW52YXNDaGFuZ2UoJ2NsZWFyJyk7XG4gICAgICAgIHRoaXMuc2V0KCdjbGVhcmluZycsIGZhbHNlKTtcbiAgICB9O1xuICAgIENvbnRhaW5lci5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuZ2V0KCdkZXN0cm95ZWQnKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2xlYXIoKTtcbiAgICAgICAgX3N1cGVyLnByb3RvdHlwZS5kZXN0cm95LmNhbGwodGhpcyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiDojrflj5bnrKzkuIDkuKrlrZDlhYPntKBcbiAgICAgKiBAcmV0dXJuIHtJRWxlbWVudH0g56ys5LiA5Liq5YWD57SgXG4gICAgICovXG4gICAgQ29udGFpbmVyLnByb3RvdHlwZS5nZXRGaXJzdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q2hpbGRCeUluZGV4KDApO1xuICAgIH07XG4gICAgLyoqXG4gICAgICog6I635Y+W5pyA5ZCO5LiA5Liq5a2Q5YWD57SgXG4gICAgICogQHJldHVybiB7SUVsZW1lbnR9IOWFg+e0oFxuICAgICAqL1xuICAgIENvbnRhaW5lci5wcm90b3R5cGUuZ2V0TGFzdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGNoaWxkcmVuID0gdGhpcy5nZXRDaGlsZHJlbigpO1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRDaGlsZEJ5SW5kZXgoY2hpbGRyZW4ubGVuZ3RoIC0gMSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiDmoLnmja7ntKLlvJXojrflj5blrZDlhYPntKBcbiAgICAgKiBAcmV0dXJuIHtJRWxlbWVudH0g56ys5LiA5Liq5YWD57SgXG4gICAgICovXG4gICAgQ29udGFpbmVyLnByb3RvdHlwZS5nZXRDaGlsZEJ5SW5kZXggPSBmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICAgICAgdmFyIGNoaWxkcmVuID0gdGhpcy5nZXRDaGlsZHJlbigpO1xuICAgICAgICByZXR1cm4gY2hpbGRyZW5baW5kZXhdO1xuICAgIH07XG4gICAgLyoqXG4gICAgICog5a2Q5YWD57Sg55qE5pWw6YePXG4gICAgICogQHJldHVybiB7bnVtYmVyfSDlrZDlhYPntKDmlbDph49cbiAgICAgKi9cbiAgICBDb250YWluZXIucHJvdG90eXBlLmdldENvdW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLmdldENoaWxkcmVuKCk7XG4gICAgICAgIHJldHVybiBjaGlsZHJlbi5sZW5ndGg7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiDmmK/lkKbljIXlkKvlr7nlupTlhYPntKBcbiAgICAgKiBAcGFyYW0ge0lFbGVtZW50fSBlbGVtZW50IOWFg+e0oFxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAgICovXG4gICAgQ29udGFpbmVyLnByb3RvdHlwZS5jb250YWluID0gZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgdmFyIGNoaWxkcmVuID0gdGhpcy5nZXRDaGlsZHJlbigpO1xuICAgICAgICByZXR1cm4gY2hpbGRyZW4uaW5kZXhPZihlbGVtZW50KSA+IC0xO1xuICAgIH07XG4gICAgLyoqXG4gICAgICog56e76Zmk5a+55bqU5a2Q5YWD57SgXG4gICAgICogQHBhcmFtIHtJRWxlbWVudH0gZWxlbWVudCDlrZDlhYPntKBcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGRlc3Ryb3kg5piv5ZCm6ZSA5q+B5a2Q5YWD57Sg77yM6buY6K6k5Li6IHRydWVcbiAgICAgKi9cbiAgICBDb250YWluZXIucHJvdG90eXBlLnJlbW92ZUNoaWxkID0gZnVuY3Rpb24gKGVsZW1lbnQsIGRlc3Ryb3kpIHtcbiAgICAgICAgaWYgKGRlc3Ryb3kgPT09IHZvaWQgMCkgeyBkZXN0cm95ID0gdHJ1ZTsgfVxuICAgICAgICBpZiAodGhpcy5jb250YWluKGVsZW1lbnQpKSB7XG4gICAgICAgICAgICBlbGVtZW50LnJlbW92ZShkZXN0cm95KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICog5p+l5om+5omA5pyJ5Yy56YWN55qE5YWD57SgXG4gICAgICogQHBhcmFtICB7RWxlbWVudEZpbHRlckZufSAgIGZuICDljLnphY3lh73mlbBcbiAgICAgKiBAcmV0dXJuIHtJRWxlbWVudFtdfSDlhYPntKDmlbDnu4RcbiAgICAgKi9cbiAgICBDb250YWluZXIucHJvdG90eXBlLmZpbmRBbGwgPSBmdW5jdGlvbiAoZm4pIHtcbiAgICAgICAgdmFyIHJzdCA9IFtdO1xuICAgICAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLmdldENoaWxkcmVuKCk7XG4gICAgICAgIGVhY2goY2hpbGRyZW4sIGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgICAgICBpZiAoZm4oZWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICByc3QucHVzaChlbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlbGVtZW50LmlzR3JvdXAoKSkge1xuICAgICAgICAgICAgICAgIHJzdCA9IHJzdC5jb25jYXQoZWxlbWVudC5maW5kQWxsKGZuKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcnN0O1xuICAgIH07XG4gICAgLyoqXG4gICAgICog5p+l5om+5YWD57Sg77yM5om+5Yiw56ys5LiA5Liq6L+U5ZueXG4gICAgICogQHBhcmFtICB7RWxlbWVudEZpbHRlckZufSBmbiAgICDljLnphY3lh73mlbBcbiAgICAgKiBAcmV0dXJuIHtJRWxlbWVudHxudWxsfSDlhYPntKDvvIzlj6/ku6XkuLrnqbpcbiAgICAgKi9cbiAgICBDb250YWluZXIucHJvdG90eXBlLmZpbmQgPSBmdW5jdGlvbiAoZm4pIHtcbiAgICAgICAgdmFyIHJzdCA9IG51bGw7XG4gICAgICAgIHZhciBjaGlsZHJlbiA9IHRoaXMuZ2V0Q2hpbGRyZW4oKTtcbiAgICAgICAgZWFjaChjaGlsZHJlbiwgZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgICAgIGlmIChmbihlbGVtZW50KSkge1xuICAgICAgICAgICAgICAgIHJzdCA9IGVsZW1lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChlbGVtZW50LmlzR3JvdXAoKSkge1xuICAgICAgICAgICAgICAgIHJzdCA9IGVsZW1lbnQuZmluZChmbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocnN0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJzdDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIOagueaNriBJRCDmn6Xmib7lhYPntKBcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaWQg5YWD57SgIGlkXG4gICAgICogQHJldHVybiB7SUVsZW1lbnR8bnVsbH0g5YWD57SgXG4gICAgICovXG4gICAgQ29udGFpbmVyLnByb3RvdHlwZS5maW5kQnlJZCA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5maW5kKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudC5nZXQoJ2lkJykgPT09IGlkO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIOivpeaWueazleWNs+WwhuW6n+W8g++8jOS4jeW7uuiuruS9v+eUqFxuICAgICAqIOagueaNriBjbGFzc05hbWUg5p+l5om+5YWD57SgXG4gICAgICogVE9ETzog6K+l5pa55byP5a6a5LmJ5pqC5pe25Y+q57uZIEc2IDMuMyDku6XlkI7nmoTniYjmnKzkvb/nlKjvvIzlvoUgRzYg5Lit55qEIGZpbmRCeUNsYXNzTmFtZSDmlrnms5Xnp7vpmaTlkI7vvIxHIOS5n+mcgOimgeWQjOatpeenu+mZpFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc05hbWUg5YWD57SgIGNsYXNzTmFtZVxuICAgICAqIEByZXR1cm4ge0lFbGVtZW50IHwgbnVsbH0g5YWD57SgXG4gICAgICovXG4gICAgQ29udGFpbmVyLnByb3RvdHlwZS5maW5kQnlDbGFzc05hbWUgPSBmdW5jdGlvbiAoY2xhc3NOYW1lKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZpbmQoZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50LmdldCgnY2xhc3NOYW1lJykgPT09IGNsYXNzTmFtZTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiDmoLnmja4gbmFtZSDmn6Xmib7lhYPntKDliJfooahcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gICAgICBuYW1lIOWFg+e0oOWQjeensFxuICAgICAqIEByZXR1cm4ge0lFbGVtZW50W119IOWFg+e0oFxuICAgICAqL1xuICAgIENvbnRhaW5lci5wcm90b3R5cGUuZmluZEFsbEJ5TmFtZSA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZpbmRBbGwoZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50LmdldCgnbmFtZScpID09PSBuYW1lO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHJldHVybiBDb250YWluZXI7XG59KEVsZW1lbnQpKTtcbmV4cG9ydCBkZWZhdWx0IENvbnRhaW5lcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbnRhaW5lci5qcy5tYXAiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///139\n")},function(module,__webpack_exports__,__webpack_require__){"use strict";eval("/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1);\n/* harmony import */ var _antv_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(0);\n/* harmony import */ var _antv_matrix_util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(14);\n/* harmony import */ var _util_util__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(19);\n/* harmony import */ var _util_matrix__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(38);\n/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(119);\n\n\n\n\n\n\nvar transform = _antv_matrix_util__WEBPACK_IMPORTED_MODULE_2__[\"ext\"].transform;\nvar MATRIX = 'matrix';\nvar CLONE_CFGS = ['zIndex', 'capture', 'visible', 'type'];\n// 可以在 toAttrs 中设置,但不属于绘图属性的字段\nvar RESERVED_PORPS = ['repeat'];\nvar DELEGATION_SPLIT = ':';\nvar WILDCARD = '*';\n// 需要考虑数组嵌套数组的场景\n// 数组嵌套对象的场景不考虑\nfunction _cloneArrayAttr(arr) {\n var result = [];\n for (var i = 0; i < arr.length; i++) {\n if (Object(_antv_util__WEBPACK_IMPORTED_MODULE_1__[\"isArray\"])(arr[i])) {\n result.push([].concat(arr[i]));\n }\n else {\n result.push(arr[i]);\n }\n }\n return result;\n}\nfunction getFormatFromAttrs(toAttrs, shape) {\n var fromAttrs = {};\n var attrs = shape.attrs;\n for (var k in toAttrs) {\n fromAttrs[k] = attrs[k];\n }\n return fromAttrs;\n}\nfunction getFormatToAttrs(props, shape) {\n var toAttrs = {};\n var attrs = shape.attr();\n Object(_antv_util__WEBPACK_IMPORTED_MODULE_1__[\"each\"])(props, function (v, k) {\n if (RESERVED_PORPS.indexOf(k) === -1 && !Object(_antv_util__WEBPACK_IMPORTED_MODULE_1__[\"isEqual\"])(attrs[k], v)) {\n toAttrs[k] = v;\n }\n });\n return toAttrs;\n}\nfunction checkExistedAttrs(animations, animation) {\n if (animation.onFrame) {\n return animations;\n }\n var startTime = animation.startTime, delay = animation.delay, duration = animation.duration;\n var hasOwnProperty = Object.prototype.hasOwnProperty;\n Object(_antv_util__WEBPACK_IMPORTED_MODULE_1__[\"each\"])(animations, function (item) {\n // 后一个动画开始执行的时间 < 前一个动画的结束时间 && 后一个动画的执行时间 > 前一个动画的延迟\n if (startTime + delay < item.startTime + item.delay + item.duration && duration > item.delay) {\n Object(_antv_util__WEBPACK_IMPORTED_MODULE_1__[\"each\"])(animation.toAttrs, function (v, k) {\n if (hasOwnProperty.call(item.toAttrs, k)) {\n delete item.toAttrs[k];\n delete item.fromAttrs[k];\n }\n });\n }\n });\n return animations;\n}\nvar Element = /** @class */ (function (_super) {\n Object(tslib__WEBPACK_IMPORTED_MODULE_0__[\"__extends\"])(Element, _super);\n function Element(cfg) {\n var _this = _super.call(this, cfg) || this;\n /**\n * @protected\n * 图形属性\n * @type {ShapeAttrs}\n */\n _this.attrs = {};\n var attrs = _this.getDefaultAttrs();\n Object(_antv_util__WEBPACK_IMPORTED_MODULE_1__[\"mix\"])(attrs, cfg.attrs);\n _this.attrs = attrs;\n _this.initAttrs(attrs);\n _this.initAnimate(); // 初始化动画\n return _this;\n }\n // override\n Element.prototype.getDefaultCfg = function () {\n return {\n visible: true,\n capture: true,\n zIndex: 0,\n };\n };\n /**\n * @protected\n * 获取默认的属相\n */\n Element.prototype.getDefaultAttrs = function () {\n return {\n matrix: this.getDefaultMatrix(),\n opacity: 1,\n };\n };\n /**\n * @protected\n * 一些方法调用会引起画布变化\n * @param {ChangeType} changeType 改变的类型\n */\n Element.prototype.onCanvasChange = function (changeType) { };\n /**\n * @protected\n * 初始化属性,有些属性需要加工\n * @param {object} attrs 属性值\n */\n Element.prototype.initAttrs = function (attrs) { };\n /**\n * @protected\n * 初始化动画\n */\n Element.prototype.initAnimate = function () {\n this.set('animable', true);\n this.set('animating', false);\n };\n Element.prototype.isGroup = function () {\n return false;\n };\n Element.prototype.getParent = function () {\n return this.get('parent');\n };\n Element.prototype.getCanvas = function () {\n return this.get('canvas');\n };\n Element.prototype.attr = function () {\n var _a;\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n var name = args[0], value = args[1];\n if (!name)\n return this.attrs;\n if (Object(_antv_util__WEBPACK_IMPORTED_MODULE_1__[\"isObject\"])(name)) {\n for (var k in name) {\n this.setAttr(k, name[k]);\n }\n this.afterAttrsChange(name);\n return this;\n }\n if (args.length === 2) {\n this.setAttr(name, value);\n this.afterAttrsChange((_a = {},\n _a[name] = value,\n _a));\n return this;\n }\n return this.attrs[name];\n };\n // 是否被裁剪,被裁剪则不显示,不参与拾取\n Element.prototype.isClipped = function (refX, refY) {\n var clip = this.getClip();\n return clip && !clip.isHit(refX, refY);\n };\n /**\n * 内部设置属性值的接口\n * @param {string} name 属性名\n * @param {any} value 属性值\n */\n Element.prototype.setAttr = function (name, value) {\n var originValue = this.attrs[name];\n if (originValue !== value) {\n this.attrs[name] = value;\n this.onAttrChange(name, value, originValue);\n }\n };\n /**\n * @protected\n * 属性值发生改变\n * @param {string} name 属性名\n * @param {any} value 属性值\n * @param {any} originValue 属性值\n */\n Element.prototype.onAttrChange = function (name, value, originValue) {\n if (name === 'matrix') {\n this.set('totalMatrix', null);\n }\n };\n /**\n * 属性更改后需要做的事情\n * @protected\n */\n Element.prototype.afterAttrsChange = function (targetAttrs) {\n if (this.cfg.isClipShape) {\n var applyTo = this.cfg.applyTo;\n if (applyTo) {\n applyTo.onCanvasChange('clip');\n }\n }\n else {\n this.onCanvasChange('attr');\n }\n };\n Element.prototype.show = function () {\n // 不是高频操作直接使用 set\n this.set('visible', true);\n this.onCanvasChange('show');\n return this;\n };\n Element.prototype.hide = function () {\n // 不是高频操作直接使用 set\n this.set('visible', false);\n this.onCanvasChange('hide');\n return this;\n };\n Element.prototype.setZIndex = function (zIndex) {\n this.set('zIndex', zIndex);\n var parent = this.getParent();\n if (parent) {\n // 改变 zIndex 不应该立即触发渲染 (调用 onCanvasChange('zIndex')),需要经过 sort 再触发\n parent.sort();\n }\n return this;\n };\n Element.prototype.toFront = function () {\n var parent = this.getParent();\n if (!parent) {\n return;\n }\n var children = parent.getChildren();\n var el = this.get('el');\n var index = children.indexOf(this);\n children.splice(index, 1);\n children.push(this);\n this.onCanvasChange('zIndex');\n };\n Element.prototype.toBack = function () {\n var parent = this.getParent();\n if (!parent) {\n return;\n }\n var children = parent.getChildren();\n var el = this.get('el');\n var index = children.indexOf(this);\n children.splice(index, 1);\n children.unshift(this);\n this.onCanvasChange('zIndex');\n };\n Element.prototype.remove = function (destroy) {\n if (destroy === void 0) { destroy = true; }\n var parent = this.getParent();\n if (parent) {\n Object(_util_util__WEBPACK_IMPORTED_MODULE_3__[/* removeFromArray */ \"j\"])(parent.getChildren(), this);\n if (!parent.get('clearing')) {\n // 如果父元素正在清理,当前元素不触发 remove\n this.onCanvasChange('remove');\n }\n }\n else {\n this.onCanvasChange('remove');\n }\n if (destroy) {\n this.destroy();\n }\n };\n Element.prototype.resetMatrix = function () {\n this.attr(MATRIX, this.getDefaultMatrix());\n this.onCanvasChange('matrix');\n };\n Element.prototype.getMatrix = function () {\n return this.attr(MATRIX);\n };\n Element.prototype.setMatrix = function (m) {\n this.attr(MATRIX, m);\n this.onCanvasChange('matrix');\n };\n // 获取总的 matrix\n Element.prototype.getTotalMatrix = function () {\n var totalMatrix = this.cfg.totalMatrix;\n if (!totalMatrix) {\n var currentMatrix = this.attr('matrix');\n var parentMatrix = this.cfg.parentMatrix;\n if (parentMatrix && currentMatrix) {\n totalMatrix = Object(_util_matrix__WEBPACK_IMPORTED_MODULE_4__[/* multiplyMatrix */ \"b\"])(parentMatrix, currentMatrix);\n }\n else {\n totalMatrix = currentMatrix || parentMatrix;\n }\n this.set('totalMatrix', totalMatrix);\n }\n return totalMatrix;\n };\n // 上层分组设置 matrix\n Element.prototype.applyMatrix = function (matrix) {\n var currentMatrix = this.attr('matrix');\n var totalMatrix = null;\n if (matrix && currentMatrix) {\n totalMatrix = Object(_util_matrix__WEBPACK_IMPORTED_MODULE_4__[/* multiplyMatrix */ \"b\"])(matrix, currentMatrix);\n }\n else {\n totalMatrix = currentMatrix || matrix;\n }\n this.set('totalMatrix', totalMatrix);\n this.set('parentMatrix', matrix);\n };\n /**\n * @protected\n * 获取默认的矩阵\n * @returns {number[]|null} 默认的矩阵\n */\n Element.prototype.getDefaultMatrix = function () {\n return null;\n };\n // 将向量应用设置的矩阵\n Element.prototype.applyToMatrix = function (v) {\n var matrix = this.attr('matrix');\n if (matrix) {\n return Object(_util_matrix__WEBPACK_IMPORTED_MODULE_4__[/* multiplyVec2 */ \"c\"])(matrix, v);\n }\n return v;\n };\n // 根据设置的矩阵,将向量转换相对于图形/分组的位置\n Element.prototype.invertFromMatrix = function (v) {\n var matrix = this.attr('matrix');\n if (matrix) {\n var invertMatrix = Object(_util_matrix__WEBPACK_IMPORTED_MODULE_4__[/* invert */ \"a\"])(matrix);\n if (invertMatrix) {\n return Object(_util_matrix__WEBPACK_IMPORTED_MODULE_4__[/* multiplyVec2 */ \"c\"])(invertMatrix, v);\n }\n }\n return v;\n };\n // 设置 clip\n Element.prototype.setClip = function (clipCfg) {\n var canvas = this.getCanvas();\n // 应该只设置当前元素的 clip,不应该去修改 clip 本身,方便 clip 被复用\n // TODO: setClip 的传参既 shape 配置,也支持 shape 对象\n // const preShape = this.get('clipShape');\n // if (preShape) {\n // // 将之前的 clipShape 销毁\n // preShape.destroy();\n // }\n var clipShape = null;\n // 如果配置项为 null,则不移除 clipShape\n if (clipCfg) {\n var ShapeBase = this.getShapeBase();\n var shapeType = Object(_antv_util__WEBPACK_IMPORTED_MODULE_1__[\"upperFirst\"])(clipCfg.type);\n var Cons = ShapeBase[shapeType];\n if (Cons) {\n clipShape = new Cons({\n type: clipCfg.type,\n isClipShape: true,\n applyTo: this,\n attrs: clipCfg.attrs,\n canvas: canvas,\n });\n }\n }\n this.set('clipShape', clipShape);\n this.onCanvasChange('clip');\n return clipShape;\n };\n Element.prototype.getClip = function () {\n // 高频率调用的地方直接使用 this.cfg.xxx\n var clipShape = this.cfg.clipShape;\n // 未设置时返回 Null,保证一致性\n if (!clipShape) {\n return null;\n }\n return clipShape;\n };\n Element.prototype.clone = function () {\n var _this = this;\n var originAttrs = this.attrs;\n var attrs = {};\n Object(_antv_util__WEBPACK_IMPORTED_MODULE_1__[\"each\"])(originAttrs, function (i, k) {\n if (Object(_antv_util__WEBPACK_IMPORTED_MODULE_1__[\"isArray\"])(originAttrs[k])) {\n attrs[k] = _cloneArrayAttr(originAttrs[k]);\n }\n else {\n attrs[k] = originAttrs[k];\n }\n });\n var cons = this.constructor;\n // @ts-ignore\n var clone = new cons({ attrs: attrs });\n Object(_antv_util__WEBPACK_IMPORTED_MODULE_1__[\"each\"])(CLONE_CFGS, function (cfgName) {\n clone.set(cfgName, _this.get(cfgName));\n });\n return clone;\n };\n Element.prototype.destroy = function () {\n var destroyed = this.destroyed;\n if (destroyed) {\n return;\n }\n this.attrs = {};\n _super.prototype.destroy.call(this);\n // this.onCanvasChange('destroy');\n };\n /**\n * 是否处于动画暂停状态\n * @return {boolean} 是否处于动画暂停状态\n */\n Element.prototype.isAnimatePaused = function () {\n return this.get('_pause').isPaused;\n };\n /**\n * 执行动画,支持多种函数签名\n * 1. animate(toAttrs: ElementAttrs, duration: number, easing?: string, callback?: () => void, delay?: number)\n * 2. animate(onFrame: OnFrame, duration: number, easing?: string, callback?: () => void, delay?: number)\n * 3. animate(toAttrs: ElementAttrs, cfg: AnimateCfg)\n * 4. animate(onFrame: OnFrame, cfg: AnimateCfg)\n * 各个参数的含义为:\n * toAttrs 动画最终状态\n * onFrame 自定义帧动画函数\n * duration 动画执行时间\n * easing 动画缓动效果\n * callback 动画执行后的回调\n * delay 动画延迟时间\n */\n Element.prototype.animate = function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n if (!this.get('timeline') && !this.get('canvas')) {\n return;\n }\n this.set('animating', true);\n var timeline = this.get('timeline');\n if (!timeline) {\n timeline = this.get('canvas').get('timeline');\n this.set('timeline', timeline);\n }\n var animations = this.get('animations') || [];\n // 初始化 tick\n if (!timeline.timer) {\n timeline.initTimer();\n }\n var toAttrs = args[0], duration = args[1], _a = args[2], easing = _a === void 0 ? 'easeLinear' : _a, _b = args[3], callback = _b === void 0 ? _antv_util__WEBPACK_IMPORTED_MODULE_1__[\"noop\"] : _b, _c = args[4], delay = _c === void 0 ? 0 : _c;\n var onFrame;\n var repeat;\n var pauseCallback;\n var resumeCallback;\n var animateCfg;\n // 第二个参数,既可以是动画最终状态 toAttrs,也可以是自定义帧动画函数 onFrame\n if (Object(_antv_util__WEBPACK_IMPORTED_MODULE_1__[\"isFunction\"])(toAttrs)) {\n onFrame = toAttrs;\n toAttrs = {};\n }\n else if (Object(_antv_util__WEBPACK_IMPORTED_MODULE_1__[\"isObject\"])(toAttrs) && toAttrs.onFrame) {\n // 兼容 3.0 中的写法,onFrame 和 repeat 可在 toAttrs 中设置\n onFrame = toAttrs.onFrame;\n repeat = toAttrs.repeat;\n }\n // 第二个参数,既可以是执行时间 duration,也可以是动画参数 animateCfg\n if (Object(_antv_util__WEBPACK_IMPORTED_MODULE_1__[\"isObject\"])(duration)) {\n animateCfg = duration;\n duration = animateCfg.duration;\n easing = animateCfg.easing || 'easeLinear';\n delay = animateCfg.delay || 0;\n // animateCfg 中的设置优先级更高\n repeat = animateCfg.repeat || repeat || false;\n callback = animateCfg.callback || _antv_util__WEBPACK_IMPORTED_MODULE_1__[\"noop\"];\n pauseCallback = animateCfg.pauseCallback || _antv_util__WEBPACK_IMPORTED_MODULE_1__[\"noop\"];\n resumeCallback = animateCfg.resumeCallback || _antv_util__WEBPACK_IMPORTED_MODULE_1__[\"noop\"];\n }\n else {\n // 第四个参数,既可以是回调函数 callback,也可以是延迟时间 delay\n if (Object(_antv_util__WEBPACK_IMPORTED_MODULE_1__[\"isNumber\"])(callback)) {\n delay = callback;\n callback = null;\n }\n // 第三个参数,既可以是缓动参数 easing,也可以是回调函数 callback\n if (Object(_antv_util__WEBPACK_IMPORTED_MODULE_1__[\"isFunction\"])(easing)) {\n callback = easing;\n easing = 'easeLinear';\n }\n else {\n easing = easing || 'easeLinear';\n }\n }\n var formatToAttrs = getFormatToAttrs(toAttrs, this);\n var animation = {\n fromAttrs: getFormatFromAttrs(formatToAttrs, this),\n toAttrs: formatToAttrs,\n duration: duration,\n easing: easing,\n repeat: repeat,\n callback: callback,\n pauseCallback: pauseCallback,\n resumeCallback: resumeCallback,\n delay: delay,\n startTime: timeline.getTime(),\n id: Object(_antv_util__WEBPACK_IMPORTED_MODULE_1__[\"uniqueId\"])(),\n onFrame: onFrame,\n pathFormatted: false,\n };\n // 如果动画元素队列中已经有这个图形了\n if (animations.length > 0) {\n // 先检查是否需要合并属性。若有相同的动画,将该属性从前一个动画中删除,直接用后一个动画中\n animations = checkExistedAttrs(animations, animation);\n }\n else {\n // 否则将图形添加到动画元素队列\n timeline.addAnimator(this);\n }\n animations.push(animation);\n this.set('animations', animations);\n this.set('_pause', { isPaused: false });\n };\n /**\n * 停止动画\n * @param {boolean} toEnd 是否到动画的最终状态\n */\n Element.prototype.stopAnimate = function (toEnd) {\n var _this = this;\n if (toEnd === void 0) { toEnd = true; }\n var animations = this.get('animations');\n Object(_antv_util__WEBPACK_IMPORTED_MODULE_1__[\"each\"])(animations, function (animation) {\n // 将动画执行到最后一帧\n if (toEnd) {\n if (animation.onFrame) {\n _this.attr(animation.onFrame(1));\n }\n else {\n _this.attr(animation.toAttrs);\n }\n }\n if (animation.callback) {\n // 动画停止时的回调\n animation.callback();\n }\n });\n this.set('animating', false);\n this.set('animations', []);\n };\n /**\n * 暂停动画\n */\n Element.prototype.pauseAnimate = function () {\n var timeline = this.get('timeline');\n var animations = this.get('animations');\n var pauseTime = timeline.getTime();\n Object(_antv_util__WEBPACK_IMPORTED_MODULE_1__[\"each\"])(animations, function (animation) {\n animation._paused = true;\n animation._pauseTime = pauseTime;\n if (animation.pauseCallback) {\n // 动画暂停时的回调\n animation.pauseCallback();\n }\n });\n // 记录下是在什么时候暂停的\n this.set('_pause', {\n isPaused: true,\n pauseTime: pauseTime,\n });\n return this;\n };\n /**\n * 恢复动画\n */\n Element.prototype.resumeAnimate = function () {\n var timeline = this.get('timeline');\n var current = timeline.getTime();\n var animations = this.get('animations');\n var pauseTime = this.get('_pause').pauseTime;\n // 之后更新属性需要计算动画已经执行的时长,如果暂停了,就把初始时间调后\n Object(_antv_util__WEBPACK_IMPORTED_MODULE_1__[\"each\"])(animations, function (animation) {\n animation.startTime = animation.startTime + (current - pauseTime);\n animation._paused = false;\n animation._pauseTime = null;\n if (animation.resumeCallback) {\n animation.resumeCallback();\n }\n });\n this.set('_pause', {\n isPaused: false,\n });\n this.set('animations', animations);\n return this;\n };\n /**\n * 触发委托事件\n * @param {string} type 事件类型\n * @param {GraphEvent} eventObj 事件对象\n */\n Element.prototype.emitDelegation = function (type, eventObj) {\n var _this = this;\n var paths = eventObj.propagationPath;\n var events = this.getEvents();\n var relativeShape;\n if (type === 'mouseenter') {\n relativeShape = eventObj.fromShape;\n }\n else if (type === 'mouseleave') {\n relativeShape = eventObj.toShape;\n }\n var _loop_1 = function (i) {\n var element = paths[i];\n // 暂定跟 name 绑定\n var name_1 = element.get('name');\n if (name_1) {\n // 第一个 mouseenter 和 mouseleave 的停止即可,因为后面的都是前面的 Parent\n if (\n // 只有 element 是 Group 或者 Canvas 的时候,才需要判断 isParent\n (element.isGroup() || (element.isCanvas && element.isCanvas())) &&\n relativeShape &&\n Object(_util_util__WEBPACK_IMPORTED_MODULE_3__[/* isParent */ \"g\"])(element, relativeShape)) {\n return \"break\";\n }\n if (Object(_antv_util__WEBPACK_IMPORTED_MODULE_1__[\"isArray\"])(name_1)) {\n Object(_antv_util__WEBPACK_IMPORTED_MODULE_1__[\"each\"])(name_1, function (subName) {\n _this.emitDelegateEvent(element, subName, eventObj);\n });\n }\n else {\n this_1.emitDelegateEvent(element, name_1, eventObj);\n }\n }\n };\n var this_1 = this;\n // 至少有一个对象,且第一个对象为 shape\n for (var i = 0; i < paths.length; i++) {\n var state_1 = _loop_1(i);\n if (state_1 === \"break\")\n break;\n }\n };\n Element.prototype.emitDelegateEvent = function (element, name, eventObj) {\n var events = this.getEvents();\n // 事件委托的形式 name:type\n var eventName = name + DELEGATION_SPLIT + eventObj.type;\n if (events[eventName] || events[WILDCARD]) {\n // 对于通配符 *,事件名称 = 委托事件名称\n eventObj.name = eventName;\n eventObj.currentTarget = element;\n eventObj.delegateTarget = this;\n // 将委托事件的监听对象 delegateObject 挂载到事件对象上\n eventObj.delegateObject = element.get('delegateObject');\n this.emit(eventName, eventObj);\n }\n };\n /**\n * 移动元素\n * @param {number} translateX 水平移动距离\n * @param {number} translateY 垂直移动距离\n * @return {IElement} 元素\n */\n Element.prototype.translate = function (translateX, translateY) {\n if (translateX === void 0) { translateX = 0; }\n if (translateY === void 0) { translateY = 0; }\n var matrix = this.getMatrix();\n var newMatrix = transform(matrix, [['t', translateX, translateY]]);\n this.setMatrix(newMatrix);\n return this;\n };\n /**\n * 移动元素到目标位置\n * @param {number} targetX 目标位置的水平坐标\n * @param {number} targetX 目标位置的垂直坐标\n * @return {IElement} 元素\n */\n Element.prototype.move = function (targetX, targetY) {\n var x = this.attr('x') || 0;\n var y = this.attr('y') || 0;\n this.translate(targetX - x, targetY - y);\n return this;\n };\n /**\n * 移动元素到目标位置,等价于 move 方法。由于 moveTo 的语义性更强,因此在文档中推荐使用 moveTo 方法\n * @param {number} targetX 目标位置的 x 轴坐标\n * @param {number} targetY 目标位置的 y 轴坐标\n * @return {IElement} 元素\n */\n Element.prototype.moveTo = function (targetX, targetY) {\n return this.move(targetX, targetY);\n };\n /**\n * 缩放元素\n * @param {number} ratioX 水平缩放比例\n * @param {number} ratioY 垂直缩放比例\n * @return {IElement} 元素\n */\n Element.prototype.scale = function (ratioX, ratioY) {\n var matrix = this.getMatrix();\n var newMatrix = transform(matrix, [['s', ratioX, ratioY || ratioX]]);\n this.setMatrix(newMatrix);\n return this;\n };\n /**\n * 以画布左上角 (0, 0) 为中心旋转元素\n * @param {number} radian 旋转角度(弧度值)\n * @return {IElement} 元素\n */\n Element.prototype.rotate = function (radian) {\n var matrix = this.getMatrix();\n var newMatrix = transform(matrix, [['r', radian]]);\n this.setMatrix(newMatrix);\n return this;\n };\n /**\n * 以起始点为中心旋转元素\n * @param {number} radian 旋转角度(弧度值)\n * @return {IElement} 元素\n */\n Element.prototype.rotateAtStart = function (rotate) {\n var _a = this.attr(), x = _a.x, y = _a.y;\n var matrix = this.getMatrix();\n var newMatrix = transform(matrix, [\n ['t', -x, -y],\n ['r', rotate],\n ['t', x, y],\n ]);\n this.setMatrix(newMatrix);\n return this;\n };\n /**\n * 以任意点 (x, y) 为中心旋转元素\n * @param {number} radian 旋转角度(弧度值)\n * @return {IElement} 元素\n */\n Element.prototype.rotateAtPoint = function (x, y, rotate) {\n var matrix = this.getMatrix();\n var newMatrix = transform(matrix, [\n ['t', -x, -y],\n ['r', rotate],\n ['t', x, y],\n ]);\n this.setMatrix(newMatrix);\n return this;\n };\n return Element;\n}(_base__WEBPACK_IMPORTED_MODULE_5__[/* default */ \"a\"]));\n/* harmony default export */ __webpack_exports__[\"a\"] = (Element);\n//# sourceMappingURL=element.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy1iYXNlL2VzbS9hYnN0cmFjdC9lbGVtZW50LmpzP2NjYWYiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQWtDO0FBQ21GO0FBQzdFO0FBQ2lCO0FBQ2E7QUFDNUM7QUFDMUIsZ0JBQWdCLHFEQUFHO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLGdCQUFnQjtBQUNuQyxZQUFZLDBEQUFPO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSx1REFBSTtBQUNSLGlEQUFpRCwwREFBTztBQUN4RDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLHVEQUFJO0FBQ1I7QUFDQTtBQUNBLFlBQVksdURBQUk7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsSUFBSSx1REFBUztBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0EsUUFBUSxzREFBRztBQUNYO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsV0FBVztBQUMxQjtBQUNBLDhEQUE4RDtBQUM5RDtBQUNBO0FBQ0E7QUFDQSxlQUFlLE9BQU87QUFDdEI7QUFDQSxvREFBb0Q7QUFDcEQ7QUFDQTtB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QWUsT0FBTztBQUN0QixnQkFBZ0IsU0FBUztBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLE9BQU87QUFDdEIsZ0JBQWdCLFNBQVM7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxPQUFPO0FBQ3RCLGdCQUFnQixTQUFTO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLE9BQU87QUFDdEIsZ0JBQWdCLFNBQVM7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxDQUFDLHFEQUFJO0FBQ1MsZ0VBQU8sRUFBQztBQUN2QiIsImZpbGUiOiIxNDAuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGVhY2gsIGlzRXF1YWwsIGlzRnVuY3Rpb24sIGlzTnVtYmVyLCBpc09iamVjdCwgaXNBcnJheSwgbm9vcCwgbWl4LCB1cHBlckZpcnN0LCB1bmlxdWVJZCB9IGZyb20gJ0BhbnR2L3V0aWwnO1xuaW1wb3J0IHsgZXh0IH0gZnJvbSAnQGFudHYvbWF0cml4LXV0aWwnO1xuaW1wb3J0IHsgcmVtb3ZlRnJvbUFycmF5LCBpc1BhcmVudCB9IGZyb20gJy4uL3V0aWwvdXRpbCc7XG5pbXBvcnQgeyBtdWx0aXBseU1hdHJpeCwgbXVsdGlwbHlWZWMyLCBpbnZlcnQgfSBmcm9tICcuLi91dGlsL21hdHJpeCc7XG5pbXBvcnQgQmFzZSBmcm9tICcuL2Jhc2UnO1xudmFyIHRyYW5zZm9ybSA9IGV4dC50cmFuc2Zvcm07XG52YXIgTUFUUklYID0gJ21hdHJpeCc7XG52YXIgQ0xPTkVfQ0ZHUyA9IFsnekluZGV4JywgJ2NhcHR1cmUnLCAndmlzaWJsZScsICd0eXBlJ107XG4vLyDlj6/ku6XlnKggdG9BdHRycyDkuK3orr7nva7vvIzkvYbkuI3lsZ7kuo7nu5jlm77lsZ7mgKfnmoTlrZfmrrVcbnZhciBSRVNFUlZFRF9QT1JQUyA9IFsncmVwZWF0J107XG52YXIgREVMRUdBVElPTl9TUExJVCA9ICc6JztcbnZhciBXSUxEQ0FSRCA9ICcqJztcbi8vIOmcgOimgeiAg+iZkeaVsOe7hOW1jOWll+aVsOe7hOeahOWcuuaZr1xuLy8g5pWw57uE5bWM5aWX5a+56LGh55qE5Zy65pmv5LiN6ICD6JmRXG5mdW5jdGlvbiBfY2xvbmVBcnJheUF0dHIoYXJyKSB7XG4gICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChpc0FycmF5KGFycltpXSkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKFtdLmNvbmNhdChhcnJbaV0pKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGFycltpXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIGdldEZvcm1hdEZyb21BdHRycyh0b0F0dHJzLCBzaGFwZSkge1xuICAgIHZhciBmcm9tQXR0cnMgPSB7fTtcbiAgICB2YXIgYXR0cnMgPSBzaGFwZS5hdHRycztcbiAgICBmb3IgKHZhciBrIGluIHRvQXR0cnMpIHtcbiAgICAgICAgZnJvbUF0dHJzW2tdID0gYXR0cnNba107XG4gICAgfVxuICAgIHJldHVybiBmcm9tQXR0cnM7XG59XG5mdW5jdGlvbiBnZXRGb3JtYXRUb0F0dHJzKHByb3BzLCBzaGFwZSkge1xuICAgIHZhciB0b0F0dHJzID0ge307XG4gICAgdmFyIGF0dHJzID0gc2hhcGUuYXR0cigpO1xuICAgIGVhY2gocHJvcHMsIGZ1bmN0aW9uICh2LCBrKSB7XG4gICAgICAgIGlmIChSRVNFUlZFRF9QT1JQUy5pbmRleE9mKGspID09PSAtMSAmJiAhaXNFcXVhbChhdHRyc1trXSwgdikpIHtcbiAgICAgICAgICAgIHRvQXR0cnNba10gPSB2O1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHRvQXR0cnM7XG59XG5mdW5jdGlvbiBjaGVja0V4aXN0ZWRBdHRycyhhbmltYXRpb25zLCBhbmltYXRpb24pIHtcbiAgICBpZiAoYW5pbWF0aW9uLm9uRnJhbWUpIHtcbiAgICAgICAgcmV0dXJuIGFuaW1hdGlvbnM7XG4gICAgfVxuICAgIHZhciBzdGFydFRpbWUgPSBhbmltYXRpb24uc3RhcnRUaW1lLCBkZWxheSA9IGFuaW1hdGlvbi5kZWxheSwgZHVyYXRpb24gPSBhbmltYXRpb24uZHVyYXRpb247XG4gICAgdmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbiAgICBlYWNoKGFuaW1hdGlvbnMsIGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgIC8vIOWQjuS4gOS4quWKqOeUu+W8gOWni+aJp+ihjOeahOaXtumXtCA8IOWJjeS4gOS4quWKqOeUu+eahOe7k+adn+aXtumXtCAmJiDlkI7kuIDkuKrliqjnlLvnmoTmiafooYzml7bpl7QgPiDliY3kuIDkuKrliqjnlLvnmoTlu7bov59cbiAgICAgICAgaWYgKHN0YXJ0VGltZSArIGRlbGF5IDwgaXRlbS5zdGFydFRpbWUgKyBpdGVtLmRlbGF5ICsgaXRlbS5kdXJhdGlvbiAmJiBkdXJhdGlvbiA+IGl0ZW0uZGVsYXkpIHtcbiAgICAgICAgICAgIGVhY2goYW5pbWF0aW9uLnRvQXR0cnMsIGZ1bmN0aW9uICh2LCBrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoaXRlbS50b0F0dHJzLCBrKSkge1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgaXRlbS50b0F0dHJzW2tdO1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgaXRlbS5mcm9tQXR0cnNba107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gYW5pbWF0aW9ucztcbn1cbnZhciBFbGVtZW50ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhFbGVtZW50LCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEVsZW1lbnQoY2ZnKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIGNmZykgfHwgdGhpcztcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgICAgICog5Zu+5b2i5bGe5oCnXG4gICAgICAgICAqIEB0eXBlIHtTaGFwZUF0dHJzfVxuICAgICAgICAgKi9cbiAgICAgICAgX3RoaXMuYXR0cnMgPSB7fTtcbiAgICAgICAgdmFyIGF0dHJzID0gX3RoaXMuZ2V0RGVmYXVsdEF0dHJzKCk7XG4gICAgICAgIG1peChhdHRycywgY2ZnLmF0dHJzKTtcbiAgICAgICAgX3RoaXMuYXR0cnMgPSBhdHRycztcbiAgICAgICAgX3RoaXMuaW5pdEF0dHJzKGF0dHJzKTtcbiAgICAgICAgX3RoaXMuaW5pdEFuaW1hdGUoKTsgLy8g5Yid5aeL5YyW5Yqo55S7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgLy8gb3ZlcnJpZGVcbiAgICBFbGVtZW50LnByb3RvdHlwZS5nZXREZWZhdWx0Q2ZnID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdmlzaWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNhcHR1cmU6IHRydWUsXG4gICAgICAgICAgICB6SW5kZXg6IDAsXG4gICAgICAgIH07XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICog6I635Y+W6buY6K6k55qE5bGe55u4XG4gICAgICovXG4gICAgRWxlbWVudC5wcm90b3R5cGUuZ2V0RGVmYXVsdEF0dHJzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbWF0cml4OiB0aGlzLmdldERlZmF1bHRNYXRyaXgoKSxcbiAgICAgICAgICAgIG9wYWNpdHk6IDEsXG4gICAgICAgIH07XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICog5LiA5Lqb5pa55rOV6LCD55So5Lya5byV6LW355S75biD5Y+Y5YyWXG4gICAgICogQHBhcmFtIHtDaGFuZ2VUeXBlfSBjaGFuZ2VUeXBlIOaUueWPmOeahOexu+Wei1xuICAgICAqL1xuICAgIEVsZW1lbnQucHJvdG90eXBlLm9uQ2FudmFzQ2hhbmdlID0gZnVuY3Rpb24gKGNoYW5nZVR5cGUpIHsgfTtcbiAgICAvKipcbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICog5Yid5aeL5YyW5bGe5oCn77yM5pyJ5Lqb5bGe5oCn6ZyA6KaB5Yqg5belXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGF0dHJzIOWxnuaAp+WAvFxuICAgICAqL1xuICAgIEVsZW1lbnQucHJvdG90eXBlLmluaXRBdHRycyA9IGZ1bmN0aW9uIChhdHRycykgeyB9O1xuICAgIC8qKlxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKiDliJ3lp4vljJbliqjnlLtcbiAgICAgKi9cbiAgICBFbGVtZW50LnByb3RvdHlwZS5pbml0QW5pbWF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5zZXQoJ2FuaW1hYmxlJywgdHJ1ZSk7XG4gICAgICAgIHRoaXMuc2V0KCdhbmltYXRpbmcnLCBmYWxzZSk7XG4gICAgfTtcbiAgICBFbGVtZW50LnByb3RvdHlwZS5pc0dyb3VwID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcbiAgICBFbGVtZW50LnByb3RvdHlwZS5nZXRQYXJlbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldCgncGFyZW50Jyk7XG4gICAgfTtcbiAgICBFbGVtZW50LnByb3RvdHlwZS5nZXRDYW52YXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldCgnY2FudmFzJyk7XG4gICAgfTtcbiAgICBFbGVtZW50LnByb3RvdHlwZS5hdHRyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHZhciBhcmdzID0gW107XG4gICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG5hbWUgPSBhcmdzWzBdLCB2YWx1ZSA9IGFyZ3NbMV07XG4gICAgICAgIGlmICghbmFtZSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmF0dHJzO1xuICAgICAgICBpZiAoaXNPYmplY3QobmFtZSkpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGsgaW4gbmFtZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0QXR0cihrLCBuYW1lW2tdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuYWZ0ZXJBdHRyc0NoYW5nZShuYW1lKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgICAgdGhpcy5zZXRBdHRyKG5hbWUsIHZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMuYWZ0ZXJBdHRyc0NoYW5nZSgoX2EgPSB7fSxcbiAgICAgICAgICAgICAgICBfYVtuYW1lXSA9IHZhbHVlLFxuICAgICAgICAgICAgICAgIF9hKSk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5hdHRyc1tuYW1lXTtcbiAgICB9O1xuICAgIC8vIOaYr+WQpuiiq+ijgeWJqu+8jOiiq+ijgeWJquWImeS4jeaYvuekuu+8jOS4jeWPguS4juaLvuWPllxuICAgIEVsZW1lbnQucHJvdG90eXBlLmlzQ2xpcHBlZCA9IGZ1bmN0aW9uIChyZWZYLCByZWZZKSB7XG4gICAgICAgIHZhciBjbGlwID0gdGhpcy5nZXRDbGlwKCk7XG4gICAgICAgIHJldHVybiBjbGlwICYmICFjbGlwLmlzSGl0KHJlZlgsIHJlZlkpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICog5YaF6YOo6K6+572u5bGe5oCn5YC855qE5o6l5Y+jXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUg5bGe5oCn5ZCNXG4gICAgICogQHBhcmFtIHthbnl9IHZhbHVlIOWxnuaAp+WAvFxuICAgICAqL1xuICAgIEVsZW1lbnQucHJvdG90eXBlLnNldEF0dHIgPSBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHtcbiAgICAgICAgdmFyIG9yaWdpblZhbHVlID0gdGhpcy5hdHRyc1tuYW1lXTtcbiAgICAgICAgaWYgKG9yaWdpblZhbHVlICE9PSB2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5hdHRyc1tuYW1lXSA9IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy5vbkF0dHJDaGFuZ2UobmFtZSwgdmFsdWUsIG9yaWdpblZhbHVlKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqIOWxnuaAp+WAvOWPkeeUn+aUueWPmFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIOWxnuaAp+WQjVxuICAgICAqIEBwYXJhbSB7YW55fSB2YWx1ZSDlsZ7mgKflgLxcbiAgICAgKiBAcGFyYW0ge2FueX0gb3JpZ2luVmFsdWUg5bGe5oCn5YC8XG4gICAgICovXG4gICAgRWxlbWVudC5wcm90b3R5cGUub25BdHRyQ2hhbmdlID0gZnVuY3Rpb24gKG5hbWUsIHZhbHVlLCBvcmlnaW5WYWx1ZSkge1xuICAgICAgICBpZiAobmFtZSA9PT0gJ21hdHJpeCcpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0KCd0b3RhbE1hdHJpeCcsIG51bGwpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiDlsZ7mgKfmm7TmlLnlkI7pnIDopoHlgZrnmoTkuovmg4VcbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICovXG4gICAgRWxlbWVudC5wcm90b3R5cGUuYWZ0ZXJBdHRyc0NoYW5nZSA9IGZ1bmN0aW9uICh0YXJnZXRBdHRycykge1xuICAgICAgICBpZiAodGhpcy5jZmcuaXNDbGlwU2hhcGUpIHtcbiAgICAgICAgICAgIHZhciBhcHBseVRvID0gdGhpcy5jZmcuYXBwbHlUbztcbiAgICAgICAgICAgIGlmIChhcHBseVRvKSB7XG4gICAgICAgICAgICAgICAgYXBwbHlUby5vbkNhbnZhc0NoYW5nZSgnY2xpcCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5vbkNhbnZhc0NoYW5nZSgnYXR0cicpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBFbGVtZW50LnByb3RvdHlwZS5zaG93ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyDkuI3mmK/pq5jpopHmk43kvZznm7TmjqXkvb/nlKggc2V0XG4gICAgICAgIHRoaXMuc2V0KCd2aXNpYmxlJywgdHJ1ZSk7XG4gICAgICAgIHRoaXMub25DYW52YXNDaGFuZ2UoJ3Nob3cnKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBFbGVtZW50LnByb3RvdHlwZS5oaWRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyDkuI3mmK/pq5jpopHmk43kvZznm7TmjqXkvb/nlKggc2V0XG4gICAgICAgIHRoaXMuc2V0KCd2aXNpYmxlJywgZmFsc2UpO1xuICAgICAgICB0aGlzLm9uQ2FudmFzQ2hhbmdlKCdoaWRlJyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgRWxlbWVudC5wcm90b3R5cGUuc2V0WkluZGV4ID0gZnVuY3Rpb24gKHpJbmRleCkge1xuICAgICAgICB0aGlzLnNldCgnekluZGV4JywgekluZGV4KTtcbiAgICAgICAgdmFyIHBhcmVudCA9IHRoaXMuZ2V0UGFyZW50KCk7XG4gICAgICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgICAgIC8vIOaUueWPmCB6SW5kZXgg5LiN5bqU6K+l56uL5Y2z6Kem5Y+R5riy5p+TICjosIPnlKggb25DYW52YXNDaGFuZ2UoJ3pJbmRleCcpKe+8jOmcgOimgee7j+i/hyBzb3J0IOWGjeinpuWPkVxuICAgICAgICAgICAgcGFyZW50LnNvcnQoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIEVsZW1lbnQucHJvdG90eXBlLnRvRnJvbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBwYXJlbnQgPSB0aGlzLmdldFBhcmVudCgpO1xuICAgICAgICBpZiAoIXBhcmVudCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjaGlsZHJlbiA9IHBhcmVudC5nZXRDaGlsZHJlbigpO1xuICAgICAgICB2YXIgZWwgPSB0aGlzLmdldCgnZWwnKTtcbiAgICAgICAgdmFyIGluZGV4ID0gY2hpbGRyZW4uaW5kZXhPZih0aGlzKTtcbiAgICAgICAgY2hpbGRyZW4uc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgY2hpbGRyZW4ucHVzaCh0aGlzKTtcbiAgICAgICAgdGhpcy5vbkNhbnZhc0NoYW5nZSgnekluZGV4Jyk7XG4gICAgfTtcbiAgICBFbGVtZW50LnByb3RvdHlwZS50b0JhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBwYXJlbnQgPSB0aGlzLmdldFBhcmVudCgpO1xuICAgICAgICBpZiAoIXBhcmVudCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjaGlsZHJlbiA9IHBhcmVudC5nZXRDaGlsZHJlbigpO1xuICAgICAgICB2YXIgZWwgPSB0aGlzLmdldCgnZWwnKTtcbiAgICAgICAgdmFyIGluZGV4ID0gY2hpbGRyZW4uaW5kZXhPZih0aGlzKTtcbiAgICAgICAgY2hpbGRyZW4uc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgY2hpbGRyZW4udW5zaGlmdCh0aGlzKTtcbiAgICAgICAgdGhpcy5vbkNhbnZhc0NoYW5nZSgnekluZGV4Jyk7XG4gICAgfTtcbiAgICBFbGVtZW50LnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiAoZGVzdHJveSkge1xuICAgICAgICBpZiAoZGVzdHJveSA9PT0gdm9pZCAwKSB7IGRlc3Ryb3kgPSB0cnVlOyB9XG4gICAgICAgIHZhciBwYXJlbnQgPSB0aGlzLmdldFBhcmVudCgpO1xuICAgICAgICBpZiAocGFyZW50KSB7XG4gICAgICAgICAgICByZW1vdmVGcm9tQXJyYXkocGFyZW50LmdldENoaWxkcmVuKCksIHRoaXMpO1xuICAgICAgICAgICAgaWYgKCFwYXJlbnQuZ2V0KCdjbGVhcmluZycpKSB7XG4gICAgICAgICAgICAgICAgLy8g5aaC5p6c54i25YWD57Sg5q2j5Zyo5riF55CG77yM5b2T5YmN5YWD57Sg5LiN6Kem5Y+RIHJlbW92ZVxuICAgICAgICAgICAgICAgIHRoaXMub25DYW52YXNDaGFuZ2UoJ3JlbW92ZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5vbkNhbnZhc0NoYW5nZSgncmVtb3ZlJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRlc3Ryb3kpIHtcbiAgICAgICAgICAgIHRoaXMuZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBFbGVtZW50LnByb3RvdHlwZS5yZXNldE1hdHJpeCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5hdHRyKE1BVFJJWCwgdGhpcy5nZXREZWZhdWx0TWF0cml4KCkpO1xuICAgICAgICB0aGlzLm9uQ2FudmFzQ2hhbmdlKCdtYXRyaXgnKTtcbiAgICB9O1xuICAgIEVsZW1lbnQucHJvdG90eXBlLmdldE1hdHJpeCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXR0cihNQVRSSVgpO1xuICAgIH07XG4gICAgRWxlbWVudC5wcm90b3R5cGUuc2V0TWF0cml4ID0gZnVuY3Rpb24gKG0pIHtcbiAgICAgICAgdGhpcy5hdHRyKE1BVFJJWCwgbSk7XG4gICAgICAgIHRoaXMub25DYW52YXNDaGFuZ2UoJ21hdHJpeCcpO1xuICAgIH07XG4gICAgLy8g6I635Y+W5oC755qEIG1hdHJpeFxuICAgIEVsZW1lbnQucHJvdG90eXBlLmdldFRvdGFsTWF0cml4ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdG90YWxNYXRyaXggPSB0aGlzLmNmZy50b3RhbE1hdHJpeDtcbiAgICAgICAgaWYgKCF0b3RhbE1hdHJpeCkge1xuICAgICAgICAgICAgdmFyIGN1cnJlbnRNYXRyaXggPSB0aGlzLmF0dHIoJ21hdHJpeCcpO1xuICAgICAgICAgICAgdmFyIHBhcmVudE1hdHJpeCA9IHRoaXMuY2ZnLnBhcmVudE1hdHJpeDtcbiAgICAgICAgICAgIGlmIChwYXJlbnRNYXRyaXggJiYgY3VycmVudE1hdHJpeCkge1xuICAgICAgICAgICAgICAgIHRvdGFsTWF0cml4ID0gbXVsdGlwbHlNYXRyaXgocGFyZW50TWF0cml4LCBjdXJyZW50TWF0cml4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRvdGFsTWF0cml4ID0gY3VycmVudE1hdHJpeCB8fCBwYXJlbnRNYXRyaXg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNldCgndG90YWxNYXRyaXgnLCB0b3RhbE1hdHJpeCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRvdGFsTWF0cml4O1xuICAgIH07XG4gICAgLy8g5LiK5bGC5YiG57uE6K6+572uIG1hdHJpeFxuICAgIEVsZW1lbnQucHJvdG90eXBlLmFwcGx5TWF0cml4ID0gZnVuY3Rpb24gKG1hdHJpeCkge1xuICAgICAgICB2YXIgY3VycmVudE1hdHJpeCA9IHRoaXMuYXR0cignbWF0cml4Jyk7XG4gICAgICAgIHZhciB0b3RhbE1hdHJpeCA9IG51bGw7XG4gICAgICAgIGlmIChtYXRyaXggJiYgY3VycmVudE1hdHJpeCkge1xuICAgICAgICAgICAgdG90YWxNYXRyaXggPSBtdWx0aXBseU1hdHJpeChtYXRyaXgsIGN1cnJlbnRNYXRyaXgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdG90YWxNYXRyaXggPSBjdXJyZW50TWF0cml4IHx8IG1hdHJpeDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldCgndG90YWxNYXRyaXgnLCB0b3RhbE1hdHJpeCk7XG4gICAgICAgIHRoaXMuc2V0KCdwYXJlbnRNYXRyaXgnLCBtYXRyaXgpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqIOiOt+WPlum7mOiupOeahOefqemYtVxuICAgICAqIEByZXR1cm5zIHtudW1iZXJbXXxudWxsfSDpu5jorqTnmoTnn6npmLVcbiAgICAgKi9cbiAgICBFbGVtZW50LnByb3RvdHlwZS5nZXREZWZhdWx0TWF0cml4ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICAgIC8vIOWwhuWQkemHj+W6lOeUqOiuvue9rueahOefqemYtVxuICAgIEVsZW1lbnQucHJvdG90eXBlLmFwcGx5VG9NYXRyaXggPSBmdW5jdGlvbiAodikge1xuICAgICAgICB2YXIgbWF0cml4ID0gdGhpcy5hdHRyKCdtYXRyaXgnKTtcbiAgICAgICAgaWYgKG1hdHJpeCkge1xuICAgICAgICAgICAgcmV0dXJuIG11bHRpcGx5VmVjMihtYXRyaXgsIHYpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2O1xuICAgIH07XG4gICAgLy8g5qC55o2u6K6+572u55qE55+p6Zi177yM5bCG5ZCR6YeP6L2s5o2i55u45a+55LqO5Zu+5b2iL+WIhue7hOeahOS9jee9rlxuICAgIEVsZW1lbnQucHJvdG90eXBlLmludmVydEZyb21NYXRyaXggPSBmdW5jdGlvbiAodikge1xuICAgICAgICB2YXIgbWF0cml4ID0gdGhpcy5hdHRyKCdtYXRyaXgnKTtcbiAgICAgICAgaWYgKG1hdHJpeCkge1xuICAgICAgICAgICAgdmFyIGludmVydE1hdHJpeCA9IGludmVydChtYXRyaXgpO1xuICAgICAgICAgICAgaWYgKGludmVydE1hdHJpeCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBtdWx0aXBseVZlYzIoaW52ZXJ0TWF0cml4LCB2KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdjtcbiAgICB9O1xuICAgIC8vIOiuvue9riBjbGlwXG4gICAgRWxlbWVudC5wcm90b3R5cGUuc2V0Q2xpcCA9IGZ1bmN0aW9uIChjbGlwQ2ZnKSB7XG4gICAgICAgIHZhciBjYW52YXMgPSB0aGlzLmdldENhbnZhcygpO1xuICAgICAgICAvLyDlupTor6Xlj6rorr7nva7lvZPliY3lhYPntKDnmoQgY2xpcO+8jOS4jeW6lOivpeWOu+S/ruaUuSBjbGlwIOacrOi6q++8jOaWueS+vyBjbGlwIOiiq+WkjeeUqFxuICAgICAgICAvLyBUT0RPOiBzZXRDbGlwIOeahOS8oOWPguaXoiBzaGFwZSDphY3nva7vvIzkuZ/mlK/mjIEgc2hhcGUg5a+56LGhXG4gICAgICAgIC8vIGNvbnN0IHByZVNoYXBlID0gdGhpcy5nZXQoJ2NsaXBTaGFwZScpO1xuICAgICAgICAvLyBpZiAocHJlU2hhcGUpIHtcbiAgICAgICAgLy8gICAvLyDlsIbkuYvliY3nmoQgY2xpcFNoYXBlIOmUgOavgVxuICAgICAgICAvLyAgIHByZVNoYXBlLmRlc3Ryb3koKTtcbiAgICAgICAgLy8gfVxuICAgICAgICB2YXIgY2xpcFNoYXBlID0gbnVsbDtcbiAgICAgICAgLy8g5aaC5p6c6YWN572u6aG55Li6IG51bGzvvIzliJnkuI3np7vpmaQgY2xpcFNoYXBlXG4gICAgICAgIGlmIChjbGlwQ2ZnKSB7XG4gICAgICAgICAgICB2YXIgU2hhcGVCYXNlID0gdGhpcy5nZXRTaGFwZUJhc2UoKTtcbiAgICAgICAgICAgIHZhciBzaGFwZVR5cGUgPSB1cHBlckZpcnN0KGNsaXBDZmcudHlwZSk7XG4gICAgICAgICAgICB2YXIgQ29ucyA9IFNoYXBlQmFzZVtzaGFwZVR5cGVdO1xuICAgICAgICAgICAgaWYgKENvbnMpIHtcbiAgICAgICAgICAgICAgICBjbGlwU2hhcGUgPSBuZXcgQ29ucyh7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IGNsaXBDZmcudHlwZSxcbiAgICAgICAgICAgICAgICAgICAgaXNDbGlwU2hhcGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGFwcGx5VG86IHRoaXMsXG4gICAgICAgICAgICAgICAgICAgIGF0dHJzOiBjbGlwQ2ZnLmF0dHJzLFxuICAgICAgICAgICAgICAgICAgICBjYW52YXM6IGNhbnZhcyxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldCgnY2xpcFNoYXBlJywgY2xpcFNoYXBlKTtcbiAgICAgICAgdGhpcy5vbkNhbnZhc0NoYW5nZSgnY2xpcCcpO1xuICAgICAgICByZXR1cm4gY2xpcFNoYXBlO1xuICAgIH07XG4gICAgRWxlbWVudC5wcm90b3R5cGUuZ2V0Q2xpcCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8g6auY6aKR546H6LCD55So55qE5Zyw5pa555u05o6l5L2/55SoIHRoaXMuY2ZnLnh4eFxuICAgICAgICB2YXIgY2xpcFNoYXBlID0gdGhpcy5jZmcuY2xpcFNoYXBlO1xuICAgICAgICAvLyDmnKrorr7nva7ml7bov5Tlm54gTnVsbO+8jOS/neivgeS4gOiHtOaAp1xuICAgICAgICBpZiAoIWNsaXBTaGFwZSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNsaXBTaGFwZTtcbiAgICB9O1xuICAgIEVsZW1lbnQucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgb3JpZ2luQXR0cnMgPSB0aGlzLmF0dHJzO1xuICAgICAgICB2YXIgYXR0cnMgPSB7fTtcbiAgICAgICAgZWFjaChvcmlnaW5BdHRycywgZnVuY3Rpb24gKGksIGspIHtcbiAgICAgICAgICAgIGlmIChpc0FycmF5KG9yaWdpbkF0dHJzW2tdKSkge1xuICAgICAgICAgICAgICAgIGF0dHJzW2tdID0gX2Nsb25lQXJyYXlBdHRyKG9yaWdpbkF0dHJzW2tdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGF0dHJzW2tdID0gb3JpZ2luQXR0cnNba107XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgY29ucyA9IHRoaXMuY29uc3RydWN0b3I7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgdmFyIGNsb25lID0gbmV3IGNvbnMoeyBhdHRyczogYXR0cnMgfSk7XG4gICAgICAgIGVhY2goQ0xPTkVfQ0ZHUywgZnVuY3Rpb24gKGNmZ05hbWUpIHtcbiAgICAgICAgICAgIGNsb25lLnNldChjZmdOYW1lLCBfdGhpcy5nZXQoY2ZnTmFtZSkpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGNsb25lO1xuICAgIH07XG4gICAgRWxlbWVudC5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGRlc3Ryb3llZCA9IHRoaXMuZGVzdHJveWVkO1xuICAgICAgICBpZiAoZGVzdHJveWVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hdHRycyA9IHt9O1xuICAgICAgICBfc3VwZXIucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCh0aGlzKTtcbiAgICAgICAgLy8gdGhpcy5vbkNhbnZhc0NoYW5nZSgnZGVzdHJveScpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICog5piv5ZCm5aSE5LqO5Yqo55S75pqC5YGc54q25oCBXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0g5piv5ZCm5aSE5LqO5Yqo55S75pqC5YGc54q25oCBXG4gICAgICovXG4gICAgRWxlbWVudC5wcm90b3R5cGUuaXNBbmltYXRlUGF1c2VkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXQoJ19wYXVzZScpLmlzUGF1c2VkO1xuICAgIH07XG4gICAgLyoqXG4gICAgICog5omn6KGM5Yqo55S777yM5pSv5oyB5aSa56eN5Ye95pWw562+5ZCNXG4gICAgICogMS4gYW5pbWF0ZSh0b0F0dHJzOiBFbGVtZW50QXR0cnMsIGR1cmF0aW9uOiBudW1iZXIsIGVhc2luZz86IHN0cmluZywgY2FsbGJhY2s/OiAoKSA9PiB2b2lkLCBkZWxheT86IG51bWJlcilcbiAgICAgKiAyLiBhbmltYXRlKG9uRnJhbWU6IE9uRnJhbWUsIGR1cmF0aW9uOiBudW1iZXIsIGVhc2luZz86IHN0cmluZywgY2FsbGJhY2s/OiAoKSA9PiB2b2lkLCBkZWxheT86IG51bWJlcilcbiAgICAgKiAzLiBhbmltYXRlKHRvQXR0cnM6IEVsZW1lbnRBdHRycywgY2ZnOiBBbmltYXRlQ2ZnKVxuICAgICAqIDQuIGFuaW1hdGUob25GcmFtZTogT25GcmFtZSwgY2ZnOiBBbmltYXRlQ2ZnKVxuICAgICAqIOWQhOS4quWPguaVsOeahOWQq+S5ieS4ujpcbiAgICAgKiAgIHRvQXR0cnMgIOWKqOeUu+acgOe7iOeKtuaAgVxuICAgICAqICAgb25GcmFtZSAg6Ieq5a6a5LmJ5bin5Yqo55S75Ye95pWwXG4gICAgICogICBkdXJhdGlvbiDliqjnlLvmiafooYzml7bpl7RcbiAgICAgKiAgIGVhc2luZyAgIOWKqOeUu+e8k+WKqOaViOaenFxuICAgICAqICAgY2FsbGJhY2sg5Yqo55S75omn6KGM5ZCO55qE5Zue6LCDXG4gICAgICogICBkZWxheSAgICDliqjnlLvlu7bov5/ml7bpl7RcbiAgICAgKi9cbiAgICBFbGVtZW50LnByb3RvdHlwZS5hbmltYXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYXJncyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgYXJnc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5nZXQoJ3RpbWVsaW5lJykgJiYgIXRoaXMuZ2V0KCdjYW52YXMnKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0KCdhbmltYXRpbmcnLCB0cnVlKTtcbiAgICAgICAgdmFyIHRpbWVsaW5lID0gdGhpcy5nZXQoJ3RpbWVsaW5lJyk7XG4gICAgICAgIGlmICghdGltZWxpbmUpIHtcbiAgICAgICAgICAgIHRpbWVsaW5lID0gdGhpcy5nZXQoJ2NhbnZhcycpLmdldCgndGltZWxpbmUnKTtcbiAgICAgICAgICAgIHRoaXMuc2V0KCd0aW1lbGluZScsIHRpbWVsaW5lKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgYW5pbWF0aW9ucyA9IHRoaXMuZ2V0KCdhbmltYXRpb25zJykgfHwgW107XG4gICAgICAgIC8vIOWIneWni+WMliB0aWNrXG4gICAgICAgIGlmICghdGltZWxpbmUudGltZXIpIHtcbiAgICAgICAgICAgIHRpbWVsaW5lLmluaXRUaW1lcigpO1xuICAgICAgICB9XG4gICAgICAgIHZhciB0b0F0dHJzID0gYXJnc1swXSwgZHVyYXRpb24gPSBhcmdzWzFdLCBfYSA9IGFyZ3NbMl0sIGVhc2luZyA9IF9hID09PSB2b2lkIDAgPyAnZWFzZUxpbmVhcicgOiBfYSwgX2IgPSBhcmdzWzNdLCBjYWxsYmFjayA9IF9iID09PSB2b2lkIDAgPyBub29wIDogX2IsIF9jID0gYXJnc1s0XSwgZGVsYXkgPSBfYyA9PT0gdm9pZCAwID8gMCA6IF9jO1xuICAgICAgICB2YXIgb25GcmFtZTtcbiAgICAgICAgdmFyIHJlcGVhdDtcbiAgICAgICAgdmFyIHBhdXNlQ2FsbGJhY2s7XG4gICAgICAgIHZhciByZXN1bWVDYWxsYmFjaztcbiAgICAgICAgdmFyIGFuaW1hdGVDZmc7XG4gICAgICAgIC8vIOesrOS6jOS4quWPguaVsO+8jOaXouWPr+S7peaYr+WKqOeUu+acgOe7iOeKtuaAgSB0b0F0dHJz77yM5Lmf5Y+v5Lul5piv6Ieq5a6a5LmJ5bin5Yqo55S75Ye95pWwIG9uRnJhbWVcbiAgICAgICAgaWYgKGlzRnVuY3Rpb24odG9BdHRycykpIHtcbiAgICAgICAgICAgIG9uRnJhbWUgPSB0b0F0dHJzO1xuICAgICAgICAgICAgdG9BdHRycyA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzT2JqZWN0KHRvQXR0cnMpICYmIHRvQXR0cnMub25GcmFtZSkge1xuICAgICAgICAgICAgLy8g5YW85a65IDMuMCDkuK3nmoTlhpnms5XvvIxvbkZyYW1lIOWSjCByZXBlYXQg5Y+v5ZyoIHRvQXR0cnMg5Lit6K6+572uXG4gICAgICAgICAgICBvbkZyYW1lID0gdG9BdHRycy5vbkZyYW1lO1xuICAgICAgICAgICAgcmVwZWF0ID0gdG9BdHRycy5yZXBlYXQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8g56ys5LqM5Liq5Y+C5pWw77yM5pei5Y+v5Lul5piv5omn6KGM5pe26Ze0IGR1cmF0aW9u77yM5Lmf5Y+v5Lul5piv5Yqo55S75Y+C5pWwIGFuaW1hdGVDZmdcbiAgICAgICAgaWYgKGlzT2JqZWN0KGR1cmF0aW9uKSkge1xuICAgICAgICAgICAgYW5pbWF0ZUNmZyA9IGR1cmF0aW9uO1xuICAgICAgICAgICAgZHVyYXRpb24gPSBhbmltYXRlQ2ZnLmR1cmF0aW9uO1xuICAgICAgICAgICAgZWFzaW5nID0gYW5pbWF0ZUNmZy5lYXNpbmcgfHwgJ2Vhc2VMaW5lYXInO1xuICAgICAgICAgICAgZGVsYXkgPSBhbmltYXRlQ2ZnLmRlbGF5IHx8IDA7XG4gICAgICAgICAgICAvLyBhbmltYXRlQ2ZnIOS4reeahOiuvue9ruS8mOWFiOe6p+abtOmrmFxuICAgICAgICAgICAgcmVwZWF0ID0gYW5pbWF0ZUNmZy5yZXBlYXQgfHwgcmVwZWF0IHx8IGZhbHNlO1xuICAgICAgICAgICAgY2FsbGJhY2sgPSBhbmltYXRlQ2ZnLmNhbGxiYWNrIHx8IG5vb3A7XG4gICAgICAgICAgICBwYXVzZUNhbGxiYWNrID0gYW5pbWF0ZUNmZy5wYXVzZUNhbGxiYWNrIHx8IG5vb3A7XG4gICAgICAgICAgICByZXN1bWVDYWxsYmFjayA9IGFuaW1hdGVDZmcucmVzdW1lQ2FsbGJhY2sgfHwgbm9vcDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIOesrOWbm+S4quWPguaVsO+8jOaXouWPr+S7peaYr+Wbnuiwg+WHveaVsCBjYWxsYmFja++8jOS5n+WPr+S7peaYr+W7tui/n+aXtumXtCBkZWxheVxuICAgICAgICAgICAgaWYgKGlzTnVtYmVyKGNhbGxiYWNrKSkge1xuICAgICAgICAgICAgICAgIGRlbGF5ID0gY2FsbGJhY2s7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8g56ys5LiJ5Liq5Y+C5pWw77yM5pei5Y+v5Lul5piv57yT5Yqo5Y+C5pWwIGVhc2luZ++8jOS5n+WPr+S7peaYr+Wbnuiwg+WHveaVsCBjYWxsYmFja1xuICAgICAgICAgICAgaWYgKGlzRnVuY3Rpb24oZWFzaW5nKSkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gZWFzaW5nO1xuICAgICAgICAgICAgICAgIGVhc2luZyA9ICdlYXNlTGluZWFyJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGVhc2luZyA9IGVhc2luZyB8fCAnZWFzZUxpbmVhcic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGZvcm1hdFRvQXR0cnMgPSBnZXRGb3JtYXRUb0F0dHJzKHRvQXR0cnMsIHRoaXMpO1xuICAgICAgICB2YXIgYW5pbWF0aW9uID0ge1xuICAgICAgICAgICAgZnJvbUF0dHJzOiBnZXRGb3JtYXRGcm9tQXR0cnMoZm9ybWF0VG9BdHRycywgdGhpcyksXG4gICAgICAgICAgICB0b0F0dHJzOiBmb3JtYXRUb0F0dHJzLFxuICAgICAgICAgICAgZHVyYXRpb246IGR1cmF0aW9uLFxuICAgICAgICAgICAgZWFzaW5nOiBlYXNpbmcsXG4gICAgICAgICAgICByZXBlYXQ6IHJlcGVhdCxcbiAgICAgICAgICAgIGNhbGxiYWNrOiBjYWxsYmFjayxcbiAgICAgICAgICAgIHBhdXNlQ2FsbGJhY2s6IHBhdXNlQ2FsbGJhY2ssXG4gICAgICAgICAgICByZXN1bWVDYWxsYmFjazogcmVzdW1lQ2FsbGJhY2ssXG4gICAgICAgICAgICBkZWxheTogZGVsYXksXG4gICAgICAgICAgICBzdGFydFRpbWU6IHRpbWVsaW5lLmdldFRpbWUoKSxcbiAgICAgICAgICAgIGlkOiB1bmlxdWVJZCgpLFxuICAgICAgICAgICAgb25GcmFtZTogb25GcmFtZSxcbiAgICAgICAgICAgIHBhdGhGb3JtYXR0ZWQ6IGZhbHNlLFxuICAgICAgICB9O1xuICAgICAgICAvLyDlpoLmnpzliqjnlLvlhYPntKDpmJ/liJfkuK3lt7Lnu4/mnInov5nkuKrlm77lvaLkuoZcbiAgICAgICAgaWYgKGFuaW1hdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgLy8g5YWI5qOA5p+l5piv5ZCm6ZyA6KaB5ZCI5bm25bGe5oCn44CC6Iul5pyJ55u45ZCM55qE5Yqo55S777yM5bCG6K+l5bGe5oCn5LuO5YmN5LiA5Liq5Yqo55S75Lit5Yig6ZmkLOebtOaOpeeUqOWQjuS4gOS4quWKqOeUu+S4rVxuICAgICAgICAgICAgYW5pbWF0aW9ucyA9IGNoZWNrRXhpc3RlZEF0dHJzKGFuaW1hdGlvbnMsIGFuaW1hdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyDlkKbliJnlsIblm77lvaLmt7vliqDliLDliqjnlLvlhYPntKDpmJ/liJdcbiAgICAgICAgICAgIHRpbWVsaW5lLmFkZEFuaW1hdG9yKHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIGFuaW1hdGlvbnMucHVzaChhbmltYXRpb24pO1xuICAgICAgICB0aGlzLnNldCgnYW5pbWF0aW9ucycsIGFuaW1hdGlvbnMpO1xuICAgICAgICB0aGlzLnNldCgnX3BhdXNlJywgeyBpc1BhdXNlZDogZmFsc2UgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiDlgZzmraLliqjnlLtcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHRvRW5kIOaYr+WQpuWIsOWKqOeUu+eahOacgOe7iOeKtuaAgVxuICAgICAqL1xuICAgIEVsZW1lbnQucHJvdG90eXBlLnN0b3BBbmltYXRlID0gZnVuY3Rpb24gKHRvRW5kKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIGlmICh0b0VuZCA9PT0gdm9pZCAwKSB7IHRvRW5kID0gdHJ1ZTsgfVxuICAgICAgICB2YXIgYW5pbWF0aW9ucyA9IHRoaXMuZ2V0KCdhbmltYXRpb25zJyk7XG4gICAgICAgIGVhY2goYW5pbWF0aW9ucywgZnVuY3Rpb24gKGFuaW1hdGlvbikge1xuICAgICAgICAgICAgLy8g5bCG5Yqo55S75omn6KGM5Yiw5pyA5ZCO5LiA5binXG4gICAgICAgICAgICBpZiAodG9FbmQpIHtcbiAgICAgICAgICAgICAgICBpZiAoYW5pbWF0aW9uLm9uRnJhbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuYXR0cihhbmltYXRpb24ub25GcmFtZSgxKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy5hdHRyKGFuaW1hdGlvbi50b0F0dHJzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYW5pbWF0aW9uLmNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgLy8g5Yqo55S75YGc5q2i5pe255qE5Zue6LCDXG4gICAgICAgICAgICAgICAgYW5pbWF0aW9uLmNhbGxiYWNrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnNldCgnYW5pbWF0aW5nJywgZmFsc2UpO1xuICAgICAgICB0aGlzLnNldCgnYW5pbWF0aW9ucycsIFtdKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIOaaguWBnOWKqOeUu1xuICAgICAqL1xuICAgIEVsZW1lbnQucHJvdG90eXBlLnBhdXNlQW5pbWF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHRpbWVsaW5lID0gdGhpcy5nZXQoJ3RpbWVsaW5lJyk7XG4gICAgICAgIHZhciBhbmltYXRpb25zID0gdGhpcy5nZXQoJ2FuaW1hdGlvbnMnKTtcbiAgICAgICAgdmFyIHBhdXNlVGltZSA9IHRpbWVsaW5lLmdldFRpbWUoKTtcbiAgICAgICAgZWFjaChhbmltYXRpb25zLCBmdW5jdGlvbiAoYW5pbWF0aW9uKSB7XG4gICAgICAgICAgICBhbmltYXRpb24uX3BhdXNlZCA9IHRydWU7XG4gICAgICAgICAgICBhbmltYXRpb24uX3BhdXNlVGltZSA9IHBhdXNlVGltZTtcbiAgICAgICAgICAgIGlmIChhbmltYXRpb24ucGF1c2VDYWxsYmFjaykge1xuICAgICAgICAgICAgICAgIC8vIOWKqOeUu+aaguWBnOaXtueahOWbnuiwg1xuICAgICAgICAgICAgICAgIGFuaW1hdGlvbi5wYXVzZUNhbGxiYWNrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAvLyDorrDlvZXkuIvmmK/lnKjku4DkuYjml7blgJnmmoLlgZznmoRcbiAgICAgICAgdGhpcy5zZXQoJ19wYXVzZScsIHtcbiAgICAgICAgICAgIGlzUGF1c2VkOiB0cnVlLFxuICAgICAgICAgICAgcGF1c2VUaW1lOiBwYXVzZVRpbWUsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIOaBouWkjeWKqOeUu1xuICAgICAqL1xuICAgIEVsZW1lbnQucHJvdG90eXBlLnJlc3VtZUFuaW1hdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB0aW1lbGluZSA9IHRoaXMuZ2V0KCd0aW1lbGluZScpO1xuICAgICAgICB2YXIgY3VycmVudCA9IHRpbWVsaW5lLmdldFRpbWUoKTtcbiAgICAgICAgdmFyIGFuaW1hdGlvbnMgPSB0aGlzLmdldCgnYW5pbWF0aW9ucycpO1xuICAgICAgICB2YXIgcGF1c2VUaW1lID0gdGhpcy5nZXQoJ19wYXVzZScpLnBhdXNlVGltZTtcbiAgICAgICAgLy8g5LmL5ZCO5pu05paw5bGe5oCn6ZyA6KaB6K6h566X5Yqo55S75bey57uP5omn6KGM55qE5pe26ZW/77yM5aaC5p6c5pqC5YGc5LqG77yM5bCx5oqK5Yid5aeL5pe26Ze06LCD5ZCOXG4gICAgICAgIGVhY2goYW5pbWF0aW9ucywgZnVuY3Rpb24gKGFuaW1hdGlvbikge1xuICAgICAgICAgICAgYW5pbWF0aW9uLnN0YXJ0VGltZSA9IGFuaW1hdGlvbi5zdGFydFRpbWUgKyAoY3VycmVudCAtIHBhdXNlVGltZSk7XG4gICAgICAgICAgICBhbmltYXRpb24uX3BhdXNlZCA9IGZhbHNlO1xuICAgICAgICAgICAgYW5pbWF0aW9uLl9wYXVzZVRpbWUgPSBudWxsO1xuICAgICAgICAgICAgaWYgKGFuaW1hdGlvbi5yZXN1bWVDYWxsYmFjaykge1xuICAgICAgICAgICAgICAgIGFuaW1hdGlvbi5yZXN1bWVDYWxsYmFjaygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5zZXQoJ19wYXVzZScsIHtcbiAgICAgICAgICAgIGlzUGF1c2VkOiBmYWxzZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuc2V0KCdhbmltYXRpb25zJywgYW5pbWF0aW9ucyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICog6Kem5Y+R5aeU5omY5LqL5Lu2XG4gICAgICogQHBhcmFtICB7c3RyaW5nfSAgICAgdHlwZSDkuovku7bnsbvlnotcbiAgICAgKiBAcGFyYW0gIHtHcmFwaEV2ZW50fSBldmVudE9iaiDkuovku7blr7nosaFcbiAgICAgKi9cbiAgICBFbGVtZW50LnByb3RvdHlwZS5lbWl0RGVsZWdhdGlvbiA9IGZ1bmN0aW9uICh0eXBlLCBldmVudE9iaikge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgcGF0aHMgPSBldmVudE9iai5wcm9wYWdhdGlvblBhdGg7XG4gICAgICAgIHZhciBldmVudHMgPSB0aGlzLmdldEV2ZW50cygpO1xuICAgICAgICB2YXIgcmVsYXRpdmVTaGFwZTtcbiAgICAgICAgaWYgKHR5cGUgPT09ICdtb3VzZWVudGVyJykge1xuICAgICAgICAgICAgcmVsYXRpdmVTaGFwZSA9IGV2ZW50T2JqLmZyb21TaGFwZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlID09PSAnbW91c2VsZWF2ZScpIHtcbiAgICAgICAgICAgIHJlbGF0aXZlU2hhcGUgPSBldmVudE9iai50b1NoYXBlO1xuICAgICAgICB9XG4gICAgICAgIHZhciBfbG9vcF8xID0gZnVuY3Rpb24gKGkpIHtcbiAgICAgICAgICAgIHZhciBlbGVtZW50ID0gcGF0aHNbaV07XG4gICAgICAgICAgICAvLyDmmoLlrprot58gbmFtZSDnu5HlrppcbiAgICAgICAgICAgIHZhciBuYW1lXzEgPSBlbGVtZW50LmdldCgnbmFtZScpO1xuICAgICAgICAgICAgaWYgKG5hbWVfMSkge1xuICAgICAgICAgICAgICAgIC8vIOesrOS4gOS4qiBtb3VzZWVudGVyIOWSjCBtb3VzZWxlYXZlIOeahOWBnOatouWNs+WPr++8jOWboOS4uuWQjumdoueahOmDveaYr+WJjemdoueahCBQYXJlbnRcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgLy8g5Y+q5pyJIGVsZW1lbnQg5pivIEdyb3VwIOaIluiAhSBDYW52YXMg55qE5pe25YCZ77yM5omN6ZyA6KaB5Yik5patIGlzUGFyZW50XG4gICAgICAgICAgICAgICAgKGVsZW1lbnQuaXNHcm91cCgpIHx8IChlbGVtZW50LmlzQ2FudmFzICYmIGVsZW1lbnQuaXNDYW52YXMoKSkpICYmXG4gICAgICAgICAgICAgICAgICAgIHJlbGF0aXZlU2hhcGUgJiZcbiAgICAgICAgICAgICAgICAgICAgaXNQYXJlbnQoZWxlbWVudCwgcmVsYXRpdmVTaGFwZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiYnJlYWtcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGlzQXJyYXkobmFtZV8xKSkge1xuICAgICAgICAgICAgICAgICAgICBlYWNoKG5hbWVfMSwgZnVuY3Rpb24gKHN1Yk5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLmVtaXREZWxlZ2F0ZUV2ZW50KGVsZW1lbnQsIHN1Yk5hbWUsIGV2ZW50T2JqKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzXzEuZW1pdERlbGVnYXRlRXZlbnQoZWxlbWVudCwgbmFtZV8xLCBldmVudE9iaik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB2YXIgdGhpc18xID0gdGhpcztcbiAgICAgICAgLy8g6Iez5bCR5pyJ5LiA5Liq5a+56LGh77yM5LiU56ys5LiA5Liq5a+56LGh5Li6IHNoYXBlXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGF0aHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBzdGF0ZV8xID0gX2xvb3BfMShpKTtcbiAgICAgICAgICAgIGlmIChzdGF0ZV8xID09PSBcImJyZWFrXCIpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIEVsZW1lbnQucHJvdG90eXBlLmVtaXREZWxlZ2F0ZUV2ZW50ID0gZnVuY3Rpb24gKGVsZW1lbnQsIG5hbWUsIGV2ZW50T2JqKSB7XG4gICAgICAgIHZhciBldmVudHMgPSB0aGlzLmdldEV2ZW50cygpO1xuICAgICAgICAvLyDkuovku7blp5TmiZjnmoTlvaLlvI8gbmFtZTp0eXBlXG4gICAgICAgIHZhciBldmVudE5hbWUgPSBuYW1lICsgREVMRUdBVElPTl9TUExJVCArIGV2ZW50T2JqLnR5cGU7XG4gICAgICAgIGlmIChldmVudHNbZXZlbnROYW1lXSB8fCBldmVudHNbV0lMRENBUkRdKSB7XG4gICAgICAgICAgICAvLyDlr7nkuo7pgJrphY3nrKYgKu+8jOS6i+S7tuWQjeensCA9IOWnlOaJmOS6i+S7tuWQjeensFxuICAgICAgICAgICAgZXZlbnRPYmoubmFtZSA9IGV2ZW50TmFtZTtcbiAgICAgICAgICAgIGV2ZW50T2JqLmN1cnJlbnRUYXJnZXQgPSBlbGVtZW50O1xuICAgICAgICAgICAgZXZlbnRPYmouZGVsZWdhdGVUYXJnZXQgPSB0aGlzO1xuICAgICAgICAgICAgLy8g5bCG5aeU5omY5LqL5Lu255qE55uR5ZCs5a+56LGhIGRlbGVnYXRlT2JqZWN0IOaMgui9veWIsOS6i+S7tuWvueixoeS4ilxuICAgICAgICAgICAgZXZlbnRPYmouZGVsZWdhdGVPYmplY3QgPSBlbGVtZW50LmdldCgnZGVsZWdhdGVPYmplY3QnKTtcbiAgICAgICAgICAgIHRoaXMuZW1pdChldmVudE5hbWUsIGV2ZW50T2JqKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICog56e75Yqo5YWD57SgXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHRyYW5zbGF0ZVgg5rC05bmz56e75Yqo6Led56a7XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHRyYW5zbGF0ZVkg5Z6C55u056e75Yqo6Led56a7XG4gICAgICogQHJldHVybiB7SUVsZW1lbnR9IOWFg+e0oFxuICAgICAqL1xuICAgIEVsZW1lbnQucHJvdG90eXBlLnRyYW5zbGF0ZSA9IGZ1bmN0aW9uICh0cmFuc2xhdGVYLCB0cmFuc2xhdGVZKSB7XG4gICAgICAgIGlmICh0cmFuc2xhdGVYID09PSB2b2lkIDApIHsgdHJhbnNsYXRlWCA9IDA7IH1cbiAgICAgICAgaWYgKHRyYW5zbGF0ZVkgPT09IHZvaWQgMCkgeyB0cmFuc2xhdGVZID0gMDsgfVxuICAgICAgICB2YXIgbWF0cml4ID0gdGhpcy5nZXRNYXRyaXgoKTtcbiAgICAgICAgdmFyIG5ld01hdHJpeCA9IHRyYW5zZm9ybShtYXRyaXgsIFtbJ3QnLCB0cmFuc2xhdGVYLCB0cmFuc2xhdGVZXV0pO1xuICAgICAgICB0aGlzLnNldE1hdHJpeChuZXdNYXRyaXgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIOenu+WKqOWFg+e0oOWIsOebruagh+S9jee9rlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB0YXJnZXRYIOebruagh+S9jee9rueahOawtOW5s+WdkOagh1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB0YXJnZXRYIOebruagh+S9jee9rueahOWeguebtOWdkOagh1xuICAgICAqIEByZXR1cm4ge0lFbGVtZW50fSDlhYPntKBcbiAgICAgKi9cbiAgICBFbGVtZW50LnByb3RvdHlwZS5tb3ZlID0gZnVuY3Rpb24gKHRhcmdldFgsIHRhcmdldFkpIHtcbiAgICAgICAgdmFyIHggPSB0aGlzLmF0dHIoJ3gnKSB8fCAwO1xuICAgICAgICB2YXIgeSA9IHRoaXMuYXR0cigneScpIHx8IDA7XG4gICAgICAgIHRoaXMudHJhbnNsYXRlKHRhcmdldFggLSB4LCB0YXJnZXRZIC0geSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICog56e75Yqo5YWD57Sg5Yiw55uu5qCH5L2N572u77yM562J5Lu35LqOIG1vdmUg5pa55rOV44CC55Sx5LqOIG1vdmVUbyDnmoTor63kuYnmgKfmm7TlvLrvvIzlm6DmraTlnKjmlofmoaPkuK3mjqjojZDkvb/nlKggbW92ZVRvIOaWueazlVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB0YXJnZXRYIOebruagh+S9jee9rueahCB4IOi9tOWdkOagh1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB0YXJnZXRZIOebruagh+S9jee9rueahCB5IOi9tOWdkOagh1xuICAgICAqIEByZXR1cm4ge0lFbGVtZW50fSDlhYPntKBcbiAgICAgKi9cbiAgICBFbGVtZW50LnByb3RvdHlwZS5tb3ZlVG8gPSBmdW5jdGlvbiAodGFyZ2V0WCwgdGFyZ2V0WSkge1xuICAgICAgICByZXR1cm4gdGhpcy5tb3ZlKHRhcmdldFgsIHRhcmdldFkpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICog57yp5pS+5YWD57SgXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJhdGlvWCDmsLTlubPnvKnmlL7mr5TkvotcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmF0aW9ZIOWeguebtOe8qeaUvuavlOS+i1xuICAgICAqIEByZXR1cm4ge0lFbGVtZW50fSDlhYPntKBcbiAgICAgKi9cbiAgICBFbGVtZW50LnByb3RvdHlwZS5zY2FsZSA9IGZ1bmN0aW9uIChyYXRpb1gsIHJhdGlvWSkge1xuICAgICAgICB2YXIgbWF0cml4ID0gdGhpcy5nZXRNYXRyaXgoKTtcbiAgICAgICAgdmFyIG5ld01hdHJpeCA9IHRyYW5zZm9ybShtYXRyaXgsIFtbJ3MnLCByYXRpb1gsIHJhdGlvWSB8fCByYXRpb1hdXSk7XG4gICAgICAgIHRoaXMuc2V0TWF0cml4KG5ld01hdHJpeCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICog5Lul55S75biD5bem5LiK6KeSICgwLCAwKSDkuLrkuK3lv4Pml4vovazlhYPntKBcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmFkaWFuIOaXi+i9rOinkuW6pijlvKfluqblgLwpXG4gICAgICogQHJldHVybiB7SUVsZW1lbnR9IOWFg+e0oFxuICAgICAqL1xuICAgIEVsZW1lbnQucHJvdG90eXBlLnJvdGF0ZSA9IGZ1bmN0aW9uIChyYWRpYW4pIHtcbiAgICAgICAgdmFyIG1hdHJpeCA9IHRoaXMuZ2V0TWF0cml4KCk7XG4gICAgICAgIHZhciBuZXdNYXRyaXggPSB0cmFuc2Zvcm0obWF0cml4LCBbWydyJywgcmFkaWFuXV0pO1xuICAgICAgICB0aGlzLnNldE1hdHJpeChuZXdNYXRyaXgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIOS7pei1t+Wni+eCueS4uuS4reW/g+aXi+i9rOWFg+e0oFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByYWRpYW4g5peL6L2s6KeS5bqmKOW8p+W6puWAvClcbiAgICAgKiBAcmV0dXJuIHtJRWxlbWVudH0g5YWD57SgXG4gICAgICovXG4gICAgRWxlbWVudC5wcm90b3R5cGUucm90YXRlQXRTdGFydCA9IGZ1bmN0aW9uIChyb3RhdGUpIHtcbiAgICAgICAgdmFyIF9hID0gdGhpcy5hdHRyKCksIHggPSBfYS54LCB5ID0gX2EueTtcbiAgICAgICAgdmFyIG1hdHJpeCA9IHRoaXMuZ2V0TWF0cml4KCk7XG4gICAgICAgIHZhciBuZXdNYXRyaXggPSB0cmFuc2Zvcm0obWF0cml4LCBbXG4gICAgICAgICAgICBbJ3QnLCAteCwgLXldLFxuICAgICAgICAgICAgWydyJywgcm90YXRlXSxcbiAgICAgICAgICAgIFsndCcsIHgsIHldLFxuICAgICAgICBdKTtcbiAgICAgICAgdGhpcy5zZXRNYXRyaXgobmV3TWF0cml4KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiDku6Xku7vmhI/ngrkgKHgsIHkpIOS4uuS4reW/g+aXi+i9rOWFg+e0oFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByYWRpYW4g5peL6L2s6KeS5bqmKOW8p+W6puWAvClcbiAgICAgKiBAcmV0dXJuIHtJRWxlbWVudH0g5YWD57SgXG4gICAgICovXG4gICAgRWxlbWVudC5wcm90b3R5cGUucm90YXRlQXRQb2ludCA9IGZ1bmN0aW9uICh4LCB5LCByb3RhdGUpIHtcbiAgICAgICAgdmFyIG1hdHJpeCA9IHRoaXMuZ2V0TWF0cml4KCk7XG4gICAgICAgIHZhciBuZXdNYXRyaXggPSB0cmFuc2Zvcm0obWF0cml4LCBbXG4gICAgICAgICAgICBbJ3QnLCAteCwgLXldLFxuICAgICAgICAgICAgWydyJywgcm90YXRlXSxcbiAgICAgICAgICAgIFsndCcsIHgsIHldLFxuICAgICAgICBdKTtcbiAgICAgICAgdGhpcy5zZXRNYXRyaXgobmV3TWF0cml4KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICByZXR1cm4gRWxlbWVudDtcbn0oQmFzZSkpO1xuZXhwb3J0IGRlZmF1bHQgRWxlbWVudDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWVsZW1lbnQuanMubWFwIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///140\n")},function(module,__webpack_exports__,__webpack_require__){"use strict";eval("/* WEBPACK VAR INJECTION */(function(process) {/* unused harmony export BrowserInfo */\n/* unused harmony export NodeInfo */\n/* unused harmony export SearchBotDeviceInfo */\n/* unused harmony export BotInfo */\n/* unused harmony export ReactNativeInfo */\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return detect; });\n/* unused harmony export browserName */\n/* unused harmony export parseUserAgent */\n/* unused harmony export detectOS */\n/* unused harmony export getNodeVersion */\nvar __spreadArray = (undefined && undefined.__spreadArray) || function (to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n};\nvar BrowserInfo = /** @class */ (function () {\n function BrowserInfo(name, version, os) {\n this.name = name;\n this.version = version;\n this.os = os;\n this.type = 'browser';\n }\n return BrowserInfo;\n}());\n\nvar NodeInfo = /** @class */ (function () {\n function NodeInfo(version) {\n this.version = version;\n this.type = 'node';\n this.name = 'node';\n this.os = process.platform;\n }\n return NodeInfo;\n}());\n\nvar SearchBotDeviceInfo = /** @class */ (function () {\n function SearchBotDeviceInfo(name, version, os, bot) {\n this.name = name;\n this.version = version;\n this.os = os;\n this.bot = bot;\n this.type = 'bot-device';\n }\n return SearchBotDeviceInfo;\n}());\n\nvar BotInfo = /** @class */ (function () {\n function BotInfo() {\n this.type = 'bot';\n this.bot = true; // NOTE: deprecated test name instead\n this.name = 'bot';\n this.version = null;\n this.os = null;\n }\n return BotInfo;\n}());\n\nvar ReactNativeInfo = /** @class */ (function () {\n function ReactNativeInfo() {\n this.type = 'react-native';\n this.name = 'react-native';\n this.version = null;\n this.os = null;\n }\n return ReactNativeInfo;\n}());\n\n// tslint:disable-next-line:max-line-length\nvar SEARCHBOX_UA_REGEX = /alexa|bot|crawl(er|ing)|facebookexternalhit|feedburner|google web preview|nagios|postrank|pingdom|slurp|spider|yahoo!|yandex/;\nvar SEARCHBOT_OS_REGEX = /(nuhk|curl|Googlebot|Yammybot|Openbot|Slurp|MSNBot|Ask\\ Jeeves\\/Teoma|ia_archiver)/;\nvar REQUIRED_VERSION_PARTS = 3;\nvar userAgentRules = [\n ['aol', /AOLShield\\/([0-9\\._]+)/],\n ['edge', /Edge\\/([0-9\\._]+)/],\n ['edge-ios', /EdgiOS\\/([0-9\\._]+)/],\n ['yandexbrowser', /YaBrowser\\/([0-9\\._]+)/],\n ['kakaotalk', /KAKAOTALK\\s([0-9\\.]+)/],\n ['samsung', /SamsungBrowser\\/([0-9\\.]+)/],\n ['silk', /\\bSilk\\/([0-9._-]+)\\b/],\n ['miui', /MiuiBrowser\\/([0-9\\.]+)$/],\n ['beaker', /BeakerBrowser\\/([0-9\\.]+)/],\n ['edge-chromium', /EdgA?\\/([0-9\\.]+)/],\n [\n 'chromium-webview',\n /(?!Chrom.*OPR)wv\\).*Chrom(?:e|ium)\\/([0-9\\.]+)(:?\\s|$)/,\n ],\n ['chrome', /(?!Chrom.*OPR)Chrom(?:e|ium)\\/([0-9\\.]+)(:?\\s|$)/],\n ['phantomjs', /PhantomJS\\/([0-9\\.]+)(:?\\s|$)/],\n ['crios', /CriOS\\/([0-9\\.]+)(:?\\s|$)/],\n ['firefox', /Firefox\\/([0-9\\.]+)(?:\\s|$)/],\n ['fxios', /FxiOS\\/([0-9\\.]+)/],\n ['opera-mini', /Opera Mini.*Version\\/([0-9\\.]+)/],\n ['opera', /Opera\\/([0-9\\.]+)(?:\\s|$)/],\n ['opera', /OPR\\/([0-9\\.]+)(:?\\s|$)/],\n ['ie', /Trident\\/7\\.0.*rv\\:([0-9\\.]+).*\\).*Gecko$/],\n ['ie', /MSIE\\s([0-9\\.]+);.*Trident\\/[4-7].0/],\n ['ie', /MSIE\\s(7\\.0)/],\n ['bb10', /BB10;\\sTouch.*Version\\/([0-9\\.]+)/],\n ['android', /Android\\s([0-9\\.]+)/],\n ['ios', /Version\\/([0-9\\._]+).*Mobile.*Safari.*/],\n ['safari', /Version\\/([0-9\\._]+).*Safari/],\n ['facebook', /FB[AS]V\\/([0-9\\.]+)/],\n ['instagram', /Instagram\\s([0-9\\.]+)/],\n ['ios-webview', /AppleWebKit\\/([0-9\\.]+).*Mobile/],\n ['ios-webview', /AppleWebKit\\/([0-9\\.]+).*Gecko\\)$/],\n ['curl', /^curl\\/([0-9\\.]+)$/],\n ['searchbot', SEARCHBOX_UA_REGEX],\n];\nvar operatingSystemRules = [\n ['iOS', /iP(hone|od|ad)/],\n ['Android OS', /Android/],\n ['BlackBerry OS', /BlackBerry|BB10/],\n ['Windows Mobile', /IEMobile/],\n ['Amazon OS', /Kindle/],\n ['Windows 3.11', /Win16/],\n ['Windows 95', /(Windows 95)|(Win95)|(Windows_95)/],\n ['Windows 98', /(Windows 98)|(Win98)/],\n ['Windows 2000', /(Windows NT 5.0)|(Windows 2000)/],\n ['Windows XP', /(Windows NT 5.1)|(Windows XP)/],\n ['Windows Server 2003', /(Windows NT 5.2)/],\n ['Windows Vista', /(Windows NT 6.0)/],\n ['Windows 7', /(Windows NT 6.1)/],\n ['Windows 8', /(Windows NT 6.2)/],\n ['Windows 8.1', /(Windows NT 6.3)/],\n ['Windows 10', /(Windows NT 10.0)/],\n ['Windows ME', /Windows ME/],\n ['Open BSD', /OpenBSD/],\n ['Sun OS', /SunOS/],\n ['Chrome OS', /CrOS/],\n ['Linux', /(Linux)|(X11)/],\n ['Mac OS', /(Mac_PowerPC)|(Macintosh)/],\n ['QNX', /QNX/],\n ['BeOS', /BeOS/],\n ['OS/2', /OS\\/2/],\n];\nfunction detect(userAgent) {\n if (!!userAgent) {\n return parseUserAgent(userAgent);\n }\n if (typeof document === 'undefined' &&\n typeof navigator !== 'undefined' &&\n navigator.product === 'ReactNative') {\n return new ReactNativeInfo();\n }\n if (typeof navigator !== 'undefined') {\n return parseUserAgent(navigator.userAgent);\n }\n return getNodeVersion();\n}\nfunction matchUserAgent(ua) {\n // opted for using reduce here rather than Array#first with a regex.test call\n // this is primarily because using the reduce we only perform the regex\n // execution once rather than once for the test and for the exec again below\n // probably something that needs to be benchmarked though\n return (ua !== '' &&\n userAgentRules.reduce(function (matched, _a) {\n var browser = _a[0], regex = _a[1];\n if (matched) {\n return matched;\n }\n var uaMatch = regex.exec(ua);\n return !!uaMatch && [browser, uaMatch];\n }, false));\n}\nfunction browserName(ua) {\n var data = matchUserAgent(ua);\n return data ? data[0] : null;\n}\nfunction parseUserAgent(ua) {\n var matchedRule = matchUserAgent(ua);\n if (!matchedRule) {\n return null;\n }\n var name = matchedRule[0], match = matchedRule[1];\n if (name === 'searchbot') {\n return new BotInfo();\n }\n // Do not use RegExp for split operation as some browser do not support it (See: http://blog.stevenlevithan.com/archives/cross-browser-split)\n var versionParts = match[1] && match[1].split('.').join('_').split('_').slice(0, 3);\n if (versionParts) {\n if (versionParts.length < REQUIRED_VERSION_PARTS) {\n versionParts = __spreadArray(__spreadArray([], versionParts, true), createVersionParts(REQUIRED_VERSION_PARTS - versionParts.length), true);\n }\n }\n else {\n versionParts = [];\n }\n var version = versionParts.join('.');\n var os = detectOS(ua);\n var searchBotMatch = SEARCHBOT_OS_REGEX.exec(ua);\n if (searchBotMatch && searchBotMatch[1]) {\n return new SearchBotDeviceInfo(name, version, os, searchBotMatch[1]);\n }\n return new BrowserInfo(name, version, os);\n}\nfunction detectOS(ua) {\n for (var ii = 0, count = operatingSystemRules.length; ii < count; ii++) {\n var _a = operatingSystemRules[ii], os = _a[0], regex = _a[1];\n var match = regex.exec(ua);\n if (match) {\n return os;\n }\n }\n return null;\n}\nfunction getNodeVersion() {\n var isNode = typeof process !== 'undefined' && process.version;\n return isNode ? new NodeInfo(process.version.slice(1)) : null;\n}\nfunction createVersionParts(count) {\n var output = [];\n for (var ii = 0; ii < count; ii++) {\n output.push('0');\n }\n return output;\n}\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(177)))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZGV0ZWN0LWJyb3dzZXIvZXMvaW5kZXguanM/N2I0NiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLHFCQUFxQixTQUFJLElBQUksU0FBSTtBQUNqQyw0RUFBNEUsT0FBTztBQUNuRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ3NCO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ21CO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDOEI7QUFDL0I7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ2tCO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQzBCO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0EsbUJBQW1CO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQLHlEQUF5RCxZQUFZO0FBQ3JFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsWUFBWTtBQUNoQztBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiIxNDEuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgX19zcHJlYWRBcnJheSA9ICh0aGlzICYmIHRoaXMuX19zcHJlYWRBcnJheSkgfHwgZnVuY3Rpb24gKHRvLCBmcm9tLCBwYWNrKSB7XG4gICAgaWYgKHBhY2sgfHwgYXJndW1lbnRzLmxlbmd0aCA9PT0gMikgZm9yICh2YXIgaSA9IDAsIGwgPSBmcm9tLmxlbmd0aCwgYXI7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgaWYgKGFyIHx8ICEoaSBpbiBmcm9tKSkge1xuICAgICAgICAgICAgaWYgKCFhcikgYXIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tLCAwLCBpKTtcbiAgICAgICAgICAgIGFyW2ldID0gZnJvbVtpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdG8uY29uY2F0KGFyIHx8IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20pKTtcbn07XG52YXIgQnJvd3NlckluZm8gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQnJvd3NlckluZm8obmFtZSwgdmVyc2lvbiwgb3MpIHtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy52ZXJzaW9uID0gdmVyc2lvbjtcbiAgICAgICAgdGhpcy5vcyA9IG9zO1xuICAgICAgICB0aGlzLnR5cGUgPSAnYnJvd3Nlcic7XG4gICAgfVxuICAgIHJldHVybiBCcm93c2VySW5mbztcbn0oKSk7XG5leHBvcnQgeyBCcm93c2VySW5mbyB9O1xudmFyIE5vZGVJbmZvID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIE5vZGVJbmZvKHZlcnNpb24pIHtcbiAgICAgICAgdGhpcy52ZXJzaW9uID0gdmVyc2lvbjtcbiAgICAgICAgdGhpcy50eXBlID0gJ25vZGUnO1xuICAgICAgICB0aGlzLm5hbWUgPSAnbm9kZSc7XG4gICAgICAgIHRoaXMub3MgPSBwcm9jZXNzLnBsYXRmb3JtO1xuICAgIH1cbiAgICByZXR1cm4gTm9kZUluZm87XG59KCkpO1xuZXhwb3J0IHsgTm9kZUluZm8gfTtcbnZhciBTZWFyY2hCb3REZXZpY2VJbmZvID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFNlYXJjaEJvdERldmljZUluZm8obmFtZSwgdmVyc2lvbiwgb3MsIGJvdCkge1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uO1xuICAgICAgICB0aGlzLm9zID0gb3M7XG4gICAgICAgIHRoaXMuYm90ID0gYm90O1xuICAgICAgICB0aGlzLnR5cGUgPSAnYm90LWRldmljZSc7XG4gICAgfVxuICAgIHJldHVybiBTZWFyY2hCb3REZXZpY2VJbmZvO1xufSgpKTtcbmV4cG9ydCB7IFNlYXJjaEJvdERldmljZUluZm8gfTtcbnZhciBCb3RJbmZvID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEJvdEluZm8oKSB7XG4gICAgICAgIHRoaXMudHlwZSA9ICdib3QnO1xuICAgICAgICB0aGlzLmJvdCA9IHRydWU7IC8vIE5PVEU6IGRlcHJlY2F0ZWQgdGVzdCBuYW1lIGluc3RlYWRcbiAgICAgICAgdGhpcy5uYW1lID0gJ2JvdCc7XG4gICAgICAgIHRoaXMudmVyc2lvbiA9IG51bGw7XG4gICAgICAgIHRoaXMub3MgPSBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gQm90SW5mbztcbn0oKSk7XG5leHBvcnQgeyBCb3RJbmZvIH07XG52YXIgUmVhY3ROYXRpdmVJbmZvID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFJlYWN0TmF0aXZlSW5mbygpIHtcbiAgICAgICAgdGhpcy50eXBlID0gJ3JlYWN0LW5hdGl2ZSc7XG4gICAgICAgIHRoaXMubmFtZSA9ICdyZWFjdC1uYXRpdmUnO1xuICAgICAgICB0aGlzLnZlcnNpb24gPSBudWxsO1xuICAgICAgICB0aGlzLm9zID0gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIFJlYWN0TmF0aXZlSW5mbztcbn0oKSk7XG5leHBvcnQgeyBSZWFjdE5hdGl2ZUluZm8gfTtcbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcbnZhciBTRUFSQ0hCT1hfVUFfUkVHRVggPSAvYWxleGF8Ym90fGNyYXdsKGVyfGluZyl8ZmFjZWJvb2tleHRlcm5hbGhpdHxmZWVkYnVybmVyfGdvb2dsZSB3ZWIgcHJldmlld3xuYWdpb3N8cG9zdHJhbmt8cGluZ2RvbXxzbHVycHxzcGlkZXJ8eWFob28hfHlhbmRleC87XG52YXIgU0VBUkNIQk9UX09TX1JFR0VYID0gLyhudWhrfGN1cmx8R29vZ2xlYm90fFlhbW15Ym90fE9wZW5ib3R8U2x1cnB8TVNOQm90fEFza1xcIEplZXZlc1xcL1Rlb21hfGlhX2FyY2hpdmVyKS87XG52YXIgUkVRVUlSRURfVkVSU0lPTl9QQVJUUyA9IDM7XG52YXIgdXNlckFnZW50UnVsZXMgPSBbXG4gICAgWydhb2wnLCAvQU9MU2hpZWxkXFwvKFswLTlcXC5fXSspL10sXG4gICAgWydlZGdlJywgL0VkZ2VcXC8oWzAtOVxcLl9dKykvXSxcbiAgICBbJ2VkZ2UtaW9zJywgL0VkZ2lPU1xcLyhbMC05XFwuX10rKS9dLFxuICAgIFsneWFuZGV4YnJvd3NlcicsIC9ZYUJyb3dzZXJcXC8oWzAtOVxcLl9dKykvXSxcbiAgICBbJ2tha2FvdGFsaycsIC9LQUtBT1RBTEtcXHMoWzAtOVxcLl0rKS9dLFxuICAgIFsnc2Ftc3VuZycsIC9TYW1zdW5nQnJvd3NlclxcLyhbMC05XFwuXSspL10sXG4gICAgWydzaWxrJywgL1xcYlNpbGtcXC8oWzAtOS5fLV0rKVxcYi9dLFxuICAgIFsnbWl1aScsIC9NaXVpQnJvd3NlclxcLyhbMC05XFwuXSspJC9dLFxuICAgIFsnYmVha2VyJywgL0JlYWtlckJyb3dzZXJcXC8oWzAtOVxcLl0rKS9dLFxuICAgIFsnZWRnZS1jaHJvbWl1bScsIC9FZGdBP1xcLyhbMC05XFwuXSspL10sXG4gICAgW1xuICAgICAgICAnY2hyb21pdW0td2VidmlldycsXG4gICAgICAgIC8oPyFDaHJvbS4qT1BSKXd2XFwpLipDaHJvbSg/OmV8aXVtKVxcLyhbMC05XFwuXSspKDo/XFxzfCQpLyxcbiAgICBdLFxuICAgIFsnY2hyb21lJywgLyg/IUNocm9tLipPUFIpQ2hyb20oPzplfGl1bSlcXC8oWzAtOVxcLl0rKSg6P1xcc3wkKS9dLFxuICAgIFsncGhhbnRvbWpzJywgL1BoYW50b21KU1xcLyhbMC05XFwuXSspKDo/XFxzfCQpL10sXG4gICAgWydjcmlvcycsIC9DcmlPU1xcLyhbMC05XFwuXSspKDo/XFxzfCQpL10sXG4gICAgWydmaXJlZm94JywgL0ZpcmVmb3hcXC8oWzAtOVxcLl0rKSg/Olxcc3wkKS9dLFxuICAgIFsnZnhpb3MnLCAvRnhpT1NcXC8oWzAtOVxcLl0rKS9dLFxuICAgIFsnb3BlcmEtbWluaScsIC9PcGVyYSBNaW5pLipWZXJzaW9uXFwvKFswLTlcXC5dKykvXSxcbiAgICBbJ29wZXJhJywgL09wZXJhXFwvKFswLTlcXC5dKykoPzpcXHN8JCkvXSxcbiAgICBbJ29wZXJhJywgL09QUlxcLyhbMC05XFwuXSspKDo/XFxzfCQpL10sXG4gICAgWydpZScsIC9UcmlkZW50XFwvN1xcLjAuKnJ2XFw6KFswLTlcXC5dKykuKlxcKS4qR2Vja28kL10sXG4gICAgWydpZScsIC9NU0lFXFxzKFswLTlcXC5dKyk7LipUcmlkZW50XFwvWzQtN10uMC9dLFxuICAgIFsnaWUnLCAvTVNJRVxccyg3XFwuMCkvXSxcbiAgICBbJ2JiMTAnLCAvQkIxMDtcXHNUb3VjaC4qVmVyc2lvblxcLyhbMC05XFwuXSspL10sXG4gICAgWydhbmRyb2lkJywgL0FuZHJvaWRcXHMoWzAtOVxcLl0rKS9dLFxuICAgIFsnaW9zJywgL1ZlcnNpb25cXC8oWzAtOVxcLl9dKykuKk1vYmlsZS4qU2FmYXJpLiovXSxcbiAgICBbJ3NhZmFyaScsIC9WZXJzaW9uXFwvKFswLTlcXC5fXSspLipTYWZhcmkvXSxcbiAgICBbJ2ZhY2Vib29rJywgL0ZCW0FTXVZcXC8oWzAtOVxcLl0rKS9dLFxuICAgIFsnaW5zdGFncmFtJywgL0luc3RhZ3JhbVxccyhbMC05XFwuXSspL10sXG4gICAgWydpb3Mtd2VidmlldycsIC9BcHBsZVdlYktpdFxcLyhbMC05XFwuXSspLipNb2JpbGUvXSxcbiAgICBbJ2lvcy13ZWJ2aWV3JywgL0FwcGxlV2ViS2l0XFwvKFswLTlcXC5dKykuKkdlY2tvXFwpJC9dLFxuICAgIFsnY3VybCcsIC9eY3VybFxcLyhbMC05XFwuXSspJC9dLFxuICAgIFsnc2VhcmNoYm90JywgU0VBUkNIQk9YX1VBX1JFR0VYXSxcbl07XG52YXIgb3BlcmF0aW5nU3lzdGVtUnVsZXMgPSBbXG4gICAgWydpT1MnLCAvaVAoaG9uZXxvZHxhZCkvXSxcbiAgICBbJ0FuZHJvaWQgT1MnLCAvQW5kcm9pZC9dLFxuICAgIFsnQmxhY2tCZXJyeSBPUycsIC9CbGFja0JlcnJ5fEJCMTAvXSxcbiAgICBbJ1dpbmRvd3MgTW9iaWxlJywgL0lFTW9iaWxlL10sXG4gICAgWydBbWF6b24gT1MnLCAvS2luZGxlL10sXG4gICAgWydXaW5kb3dzIDMuMTEnLCAvV2luMTYvXSxcbiAgICBbJ1dpbmRvd3MgOTUnLCAvKFdpbmRvd3MgOTUpfChXaW45NSl8KFdpbmRvd3NfOTUpL10sXG4gICAgWydXaW5kb3dzIDk4JywgLyhXaW5kb3dzIDk4KXwoV2luOTgpL10sXG4gICAgWydXaW5kb3dzIDIwMDAnLCAvKFdpbmRvd3MgTlQgNS4wKXwoV2luZG93cyAyMDAwKS9dLFxuICAgIFsnV2luZG93cyBYUCcsIC8oV2luZG93cyBOVCA1LjEpfChXaW5kb3dzIFhQKS9dLFxuICAgIFsnV2luZG93cyBTZXJ2ZXIgMjAwMycsIC8oV2luZG93cyBOVCA1LjIpL10sXG4gICAgWydXaW5kb3dzIFZpc3RhJywgLyhXaW5kb3dzIE5UIDYuMCkvXSxcbiAgICBbJ1dpbmRvd3MgNycsIC8oV2luZG93cyBOVCA2LjEpL10sXG4gICAgWydXaW5kb3dzIDgnLCAvKFdpbmRvd3MgTlQgNi4yKS9dLFxuICAgIFsnV2luZG93cyA4LjEnLCAvKFdpbmRvd3MgTlQgNi4zKS9dLFxuICAgIFsnV2luZG93cyAxMCcsIC8oV2luZG93cyBOVCAxMC4wKS9dLFxuICAgIFsnV2luZG93cyBNRScsIC9XaW5kb3dzIE1FL10sXG4gICAgWydPcGVuIEJTRCcsIC9PcGVuQlNEL10sXG4gICAgWydTdW4gT1MnLCAvU3VuT1MvXSxcbiAgICBbJ0Nocm9tZSBPUycsIC9Dck9TL10sXG4gICAgWydMaW51eCcsIC8oTGludXgpfChYMTEpL10sXG4gICAgWydNYWMgT1MnLCAvKE1hY19Qb3dlclBDKXwoTWFjaW50b3NoKS9dLFxuICAgIFsnUU5YJywgL1FOWC9dLFxuICAgIFsnQmVPUycsIC9CZU9TL10sXG4gICAgWydPUy8yJywgL09TXFwvMi9dLFxuXTtcbmV4cG9ydCBmdW5jdGlvbiBkZXRlY3QodXNlckFnZW50KSB7XG4gICAgaWYgKCEhdXNlckFnZW50KSB7XG4gICAgICAgIHJldHVybiBwYXJzZVVzZXJBZ2VudCh1c2VyQWdlbnQpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGRvY3VtZW50ID09PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICB0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICBuYXZpZ2F0b3IucHJvZHVjdCA9PT0gJ1JlYWN0TmF0aXZlJykge1xuICAgICAgICByZXR1cm4gbmV3IFJlYWN0TmF0aXZlSW5mbygpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIHBhcnNlVXNlckFnZW50KG5hdmlnYXRvci51c2VyQWdlbnQpO1xuICAgIH1cbiAgICByZXR1cm4gZ2V0Tm9kZVZlcnNpb24oKTtcbn1cbmZ1bmN0aW9uIG1hdGNoVXNlckFnZW50KHVhKSB7XG4gICAgLy8gb3B0ZWQgZm9yIHVzaW5nIHJlZHVjZSBoZXJlIHJhdGhlciB0aGFuIEFycmF5I2ZpcnN0IHdpdGggYSByZWdleC50ZXN0IGNhbGxcbiAgICAvLyB0aGlzIGlzIHByaW1hcmlseSBiZWNhdXNlIHVzaW5nIHRoZSByZWR1Y2Ugd2Ugb25seSBwZXJmb3JtIHRoZSByZWdleFxuICAgIC8vIGV4ZWN1dGlvbiBvbmNlIHJhdGhlciB0aGFuIG9uY2UgZm9yIHRoZSB0ZXN0IGFuZCBmb3IgdGhlIGV4ZWMgYWdhaW4gYmVsb3dcbiAgICAvLyBwcm9iYWJseSBzb21ldGhpbmcgdGhhdCBuZWVkcyB0byBiZSBiZW5jaG1hcmtlZCB0aG91Z2hcbiAgICByZXR1cm4gKHVhICE9PSAnJyAmJlxuICAgICAgICB1c2VyQWdlbnRSdWxlcy5yZWR1Y2UoZnVuY3Rpb24gKG1hdGNoZWQsIF9hKSB7XG4gICAgICAgICAgICB2YXIgYnJvd3NlciA9IF9hWzBdLCByZWdleCA9IF9hWzFdO1xuICAgICAgICAgICAgaWYgKG1hdGNoZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbWF0Y2hlZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciB1YU1hdGNoID0gcmVnZXguZXhlYyh1YSk7XG4gICAgICAgICAgICByZXR1cm4gISF1YU1hdGNoICYmIFticm93c2VyLCB1YU1hdGNoXTtcbiAgICAgICAgfSwgZmFsc2UpKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBicm93c2VyTmFtZSh1YSkge1xuICAgIHZhciBkYXRhID0gbWF0Y2hVc2VyQWdlbnQodWEpO1xuICAgIHJldHVybiBkYXRhID8gZGF0YVswXSA6IG51bGw7XG59XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VVc2VyQWdlbnQodWEpIHtcbiAgICB2YXIgbWF0Y2hlZFJ1bGUgPSBtYXRjaFVzZXJBZ2VudCh1YSk7XG4gICAgaWYgKCFtYXRjaGVkUnVsZSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgdmFyIG5hbWUgPSBtYXRjaGVkUnVsZVswXSwgbWF0Y2ggPSBtYXRjaGVkUnVsZVsxXTtcbiAgICBpZiAobmFtZSA9PT0gJ3NlYXJjaGJvdCcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBCb3RJbmZvKCk7XG4gICAgfVxuICAgIC8vIERvIG5vdCB1c2UgUmVnRXhwIGZvciBzcGxpdCBvcGVyYXRpb24gYXMgc29tZSBicm93c2VyIGRvIG5vdCBzdXBwb3J0IGl0IChTZWU6IGh0dHA6Ly9ibG9nLnN0ZXZlbmxldml0aGFuLmNvbS9hcmNoaXZlcy9jcm9zcy1icm93c2VyLXNwbGl0KVxuICAgIHZhciB2ZXJzaW9uUGFydHMgPSBtYXRjaFsxXSAmJiBtYXRjaFsxXS5zcGxpdCgnLicpLmpvaW4oJ18nKS5zcGxpdCgnXycpLnNsaWNlKDAsIDMpO1xuICAgIGlmICh2ZXJzaW9uUGFydHMpIHtcbiAgICAgICAgaWYgKHZlcnNpb25QYXJ0cy5sZW5ndGggPCBSRVFVSVJFRF9WRVJTSU9OX1BBUlRTKSB7XG4gICAgICAgICAgICB2ZXJzaW9uUGFydHMgPSBfX3NwcmVhZEFycmF5KF9fc3ByZWFkQXJyYXkoW10sIHZlcnNpb25QYXJ0cywgdHJ1ZSksIGNyZWF0ZVZlcnNpb25QYXJ0cyhSRVFVSVJFRF9WRVJTSU9OX1BBUlRTIC0gdmVyc2lvblBhcnRzLmxlbmd0aCksIHRydWUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB2ZXJzaW9uUGFydHMgPSBbXTtcbiAgICB9XG4gICAgdmFyIHZlcnNpb24gPSB2ZXJzaW9uUGFydHMuam9pbignLicpO1xuICAgIHZhciBvcyA9IGRldGVjdE9TKHVhKTtcbiAgICB2YXIgc2VhcmNoQm90TWF0Y2ggPSBTRUFSQ0hCT1RfT1NfUkVHRVguZXhlYyh1YSk7XG4gICAgaWYgKHNlYXJjaEJvdE1hdGNoICYmIHNlYXJjaEJvdE1hdGNoWzFdKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2VhcmNoQm90RGV2aWNlSW5mbyhuYW1lLCB2ZXJzaW9uLCBvcywgc2VhcmNoQm90TWF0Y2hbMV0pO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IEJyb3dzZXJJbmZvKG5hbWUsIHZlcnNpb24sIG9zKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBkZXRlY3RPUyh1YSkge1xuICAgIGZvciAodmFyIGlpID0gMCwgY291bnQgPSBvcGVyYXRpbmdTeXN0ZW1SdWxlcy5sZW5ndGg7IGlpIDwgY291bnQ7IGlpKyspIHtcbiAgICAgICAgdmFyIF9hID0gb3BlcmF0aW5nU3lzdGVtUnVsZXNbaWldLCBvcyA9IF9hWzBdLCByZWdleCA9IF9hWzFdO1xuICAgICAgICB2YXIgbWF0Y2ggPSByZWdleC5leGVjKHVhKTtcbiAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgICByZXR1cm4gb3M7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0Tm9kZVZlcnNpb24oKSB7XG4gICAgdmFyIGlzTm9kZSA9IHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiBwcm9jZXNzLnZlcnNpb247XG4gICAgcmV0dXJuIGlzTm9kZSA/IG5ldyBOb2RlSW5mbyhwcm9jZXNzLnZlcnNpb24uc2xpY2UoMSkpIDogbnVsbDtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVZlcnNpb25QYXJ0cyhjb3VudCkge1xuICAgIHZhciBvdXRwdXQgPSBbXTtcbiAgICBmb3IgKHZhciBpaSA9IDA7IGlpIDwgY291bnQ7IGlpKyspIHtcbiAgICAgICAgb3V0cHV0LnB1c2goJzAnKTtcbiAgICB9XG4gICAgcmV0dXJuIG91dHB1dDtcbn1cbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///141\n")},function(module,__webpack_exports__,__webpack_require__){"use strict";eval("/* unused harmony export parseLineGradient */\n/* unused harmony export parseRadialGradient */\n/* unused harmony export parsePattern */\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return parseStyle; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return parseRadius; });\n/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(16);\n\nvar regexLG = /^l\\s*\\(\\s*([\\d.]+)\\s*\\)\\s*(.*)/i;\nvar regexRG = /^r\\s*\\(\\s*([\\d.]+)\\s*,\\s*([\\d.]+)\\s*,\\s*([\\d.]+)\\s*\\)\\s*(.*)/i;\nvar regexPR = /^p\\s*\\(\\s*([axyn])\\s*\\)\\s*(.*)/i;\nvar regexColorStop = /[\\d.]+:(#[^\\s]+|[^\\)]+\\))/gi;\nfunction addStop(steps, gradient) {\n var arr = steps.match(regexColorStop);\n Object(_util__WEBPACK_IMPORTED_MODULE_0__[/* each */ \"c\"])(arr, function (item) {\n var itemArr = item.split(':');\n gradient.addColorStop(itemArr[0], itemArr[1]);\n });\n}\n/**\n * 将边和填充设置的颜色转换成线性渐变对象\n * @param {CanvasRenderingContext2D} context canvas 上下文\n * @param {IElement} element 图形元素\n * @param {string} gradientStr 颜色\n * @returns {any} 渐变对象\n */\nfunction parseLineGradient(context, element, gradientStr) {\n var arr = regexLG.exec(gradientStr);\n var angle = (parseFloat(arr[1]) % 360) * (Math.PI / 180);\n var steps = arr[2];\n var box = element.getBBox();\n var start;\n var end;\n if (angle >= 0 && angle < (1 / 2) * Math.PI) {\n start = {\n x: box.minX,\n y: box.minY,\n };\n end = {\n x: box.maxX,\n y: box.maxY,\n };\n }\n else if ((1 / 2) * Math.PI <= angle && angle < Math.PI) {\n start = {\n x: box.maxX,\n y: box.minY,\n };\n end = {\n x: box.minX,\n y: box.maxY,\n };\n }\n else if (Math.PI <= angle && angle < (3 / 2) * Math.PI) {\n start = {\n x: box.maxX,\n y: box.maxY,\n };\n end = {\n x: box.minX,\n y: box.minY,\n };\n }\n else {\n start = {\n x: box.minX,\n y: box.maxY,\n };\n end = {\n x: box.maxX,\n y: box.minY,\n };\n }\n var tanTheta = Math.tan(angle);\n var tanTheta2 = tanTheta * tanTheta;\n var x = (end.x - start.x + tanTheta * (end.y - start.y)) / (tanTheta2 + 1) + start.x;\n var y = (tanTheta * (end.x - start.x + tanTheta * (end.y - start.y))) / (tanTheta2 + 1) + start.y;\n var gradient = context.createLinearGradient(start.x, start.y, x, y);\n addStop(steps, gradient);\n return gradient;\n}\n/**\n * 将边和填充设置的颜色转换成圆形渐变对象\n * @param {CanvasRenderingContext2D} context canvas 上下文\n * @param {IElement} element 图形元素\n * @param {string} gradientStr 颜色\n * @returns {any} 渐变对象\n */\nfunction parseRadialGradient(context, element, gradientStr) {\n var arr = regexRG.exec(gradientStr);\n var fx = parseFloat(arr[1]);\n var fy = parseFloat(arr[2]);\n var fr = parseFloat(arr[3]);\n var steps = arr[4];\n // 环半径为0时,默认无渐变,取渐变序列的最后一个颜色\n if (fr === 0) {\n var colors = steps.match(regexColorStop);\n return colors[colors.length - 1].split(':')[1];\n }\n var box = element.getBBox();\n var width = box.maxX - box.minX;\n var height = box.maxY - box.minY;\n var r = Math.sqrt(width * width + height * height) / 2;\n var gradient = context.createRadialGradient(box.minX + width * fx, box.minY + height * fy, 0, box.minX + width / 2, box.minY + height / 2, fr * r);\n addStop(steps, gradient);\n return gradient;\n}\n/**\n * 边和填充设置的颜色转换成 pattern\n * @param {CanvasRenderingContext2D} context canvas 上下文\n * @param {IElement} element 图形元素\n * @param {string} patternStr 生成 pattern 的字符串\n */\nfunction parsePattern(context, element, patternStr) {\n // 在转换过程中进行了缓存\n if (element.get('patternSource') && element.get('patternSource') === patternStr) {\n return element.get('pattern');\n }\n var pattern;\n var img;\n var arr = regexPR.exec(patternStr);\n var repeat = arr[1];\n var source = arr[2];\n // Function to be called when pattern loads\n function onload() {\n // Create pattern\n pattern = context.createPattern(img, repeat);\n element.set('pattern', pattern); // be a cache\n element.set('patternSource', patternStr);\n }\n switch (repeat) {\n case 'a':\n repeat = 'repeat';\n break;\n case 'x':\n repeat = 'repeat-x';\n break;\n case 'y':\n repeat = 'repeat-y';\n break;\n case 'n':\n repeat = 'no-repeat';\n break;\n default:\n repeat = 'no-repeat';\n }\n img = new Image();\n // If source URL is not a data URL\n if (!source.match(/^data:/i)) {\n // Set crossOrigin for this image\n img.crossOrigin = 'Anonymous';\n }\n img.src = source;\n if (img.complete) {\n onload();\n }\n else {\n img.onload = onload;\n // Fix onload() bug in IE9\n img.src = img.src;\n }\n return pattern;\n}\nfunction parseStyle(context, element, color) {\n var bbox = element.getBBox();\n if (isNaN(bbox.x) || isNaN(bbox.y) || isNaN(bbox.width) || isNaN(bbox.height)) {\n return color;\n }\n if (Object(_util__WEBPACK_IMPORTED_MODULE_0__[/* isString */ \"k\"])(color)) {\n if (color[1] === '(' || color[2] === '(') {\n if (color[0] === 'l') {\n // regexLG.test(color)\n return parseLineGradient(context, element, color);\n }\n if (color[0] === 'r') {\n // regexRG.test(color)\n return parseRadialGradient(context, element, color);\n }\n if (color[0] === 'p') {\n // regexPR.test(color)\n return parsePattern(context, element, color);\n }\n }\n return color;\n }\n if (color instanceof CanvasPattern) {\n return color;\n }\n}\nfunction parseRadius(radius) {\n var r1 = 0;\n var r2 = 0;\n var r3 = 0;\n var r4 = 0;\n if (Object(_util__WEBPACK_IMPORTED_MODULE_0__[/* isArray */ \"g\"])(radius)) {\n if (radius.length === 1) {\n r1 = r2 = r3 = r4 = radius[0];\n }\n else if (radius.length === 2) {\n r1 = r3 = radius[0];\n r2 = r4 = radius[1];\n }\n else if (radius.length === 3) {\n r1 = radius[0];\n r2 = r4 = radius[1];\n r3 = radius[2];\n }\n else {\n r1 = radius[0];\n r2 = radius[1];\n r3 = radius[2];\n r4 = radius[3];\n }\n }\n else {\n r1 = r2 = r3 = r4 = radius;\n }\n return [r1, r2, r3, r4];\n}\n//# sourceMappingURL=parse.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy1jYW52YXMvZXNtL3V0aWwvcGFyc2UuanM/YWY0MCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBaUQ7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSwwREFBSTtBQUNSO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsV0FBVyx5QkFBeUI7QUFDcEMsV0FBVyxTQUFTO0FBQ3BCLFdBQVcsT0FBTztBQUNsQixhQUFhLElBQUk7QUFDakI7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLHlCQUF5QjtBQUNwQyxXQUFXLFNBQVM7QUFDcEIsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsSUFBSTtBQUNqQjtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcseUJBQXlCO0FBQ3BDLFdBQVcsU0FBUztBQUNwQixXQUFXLE9BQU87QUFDbEI7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSw4REFBUTtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsNkRBQU87QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiIxNDIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpc1N0cmluZywgZWFjaCwgaXNBcnJheSB9IGZyb20gJy4vdXRpbCc7XG52YXIgcmVnZXhMRyA9IC9ebFxccypcXChcXHMqKFtcXGQuXSspXFxzKlxcKVxccyooLiopL2k7XG52YXIgcmVnZXhSRyA9IC9eclxccypcXChcXHMqKFtcXGQuXSspXFxzKixcXHMqKFtcXGQuXSspXFxzKixcXHMqKFtcXGQuXSspXFxzKlxcKVxccyooLiopL2k7XG52YXIgcmVnZXhQUiA9IC9ecFxccypcXChcXHMqKFtheHluXSlcXHMqXFwpXFxzKiguKikvaTtcbnZhciByZWdleENvbG9yU3RvcCA9IC9bXFxkLl0rOigjW15cXHNdK3xbXlxcKV0rXFwpKS9naTtcbmZ1bmN0aW9uIGFkZFN0b3Aoc3RlcHMsIGdyYWRpZW50KSB7XG4gICAgdmFyIGFyciA9IHN0ZXBzLm1hdGNoKHJlZ2V4Q29sb3JTdG9wKTtcbiAgICBlYWNoKGFyciwgZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgdmFyIGl0ZW1BcnIgPSBpdGVtLnNwbGl0KCc6Jyk7XG4gICAgICAgIGdyYWRpZW50LmFkZENvbG9yU3RvcChpdGVtQXJyWzBdLCBpdGVtQXJyWzFdKTtcbiAgICB9KTtcbn1cbi8qKlxuICog5bCG6L655ZKM5aGr5YWF6K6+572u55qE6aKc6Imy6L2s5o2i5oiQ57q/5oCn5riQ5Y+Y5a+56LGhXG4gKiBAcGFyYW0ge0NhbnZhc1JlbmRlcmluZ0NvbnRleHQyRH0gY29udGV4dCBjYW52YXMg5LiK5LiL5paHXG4gKiBAcGFyYW0ge0lFbGVtZW50fSAgICAgICAgICAgICAgICAgZWxlbWVudCAg5Zu+5b2i5YWD57SgXG4gKiBAcGFyYW0ge3N0cmluZ30gICAgICAgICAgICAgICAgICAgZ3JhZGllbnRTdHIgICDpopzoibJcbiAqIEByZXR1cm5zIHthbnl9IOa4kOWPmOWvueixoVxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VMaW5lR3JhZGllbnQoY29udGV4dCwgZWxlbWVudCwgZ3JhZGllbnRTdHIpIHtcbiAgICB2YXIgYXJyID0gcmVnZXhMRy5leGVjKGdyYWRpZW50U3RyKTtcbiAgICB2YXIgYW5nbGUgPSAocGFyc2VGbG9hdChhcnJbMV0pICUgMzYwKSAqIChNYXRoLlBJIC8gMTgwKTtcbiAgICB2YXIgc3RlcHMgPSBhcnJbMl07XG4gICAgdmFyIGJveCA9IGVsZW1lbnQuZ2V0QkJveCgpO1xuICAgIHZhciBzdGFydDtcbiAgICB2YXIgZW5kO1xuICAgIGlmIChhbmdsZSA+PSAwICYmIGFuZ2xlIDwgKDEgLyAyKSAqIE1hdGguUEkpIHtcbiAgICAgICAgc3RhcnQgPSB7XG4gICAgICAgICAgICB4OiBib3gubWluWCxcbiAgICAgICAgICAgIHk6IGJveC5taW5ZLFxuICAgICAgICB9O1xuICAgICAgICBlbmQgPSB7XG4gICAgICAgICAgICB4OiBib3gubWF4WCxcbiAgICAgICAgICAgIHk6IGJveC5tYXhZLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBlbHNlIGlmICgoMSAvIDIpICogTWF0aC5QSSA8PSBhbmdsZSAmJiBhbmdsZSA8IE1hdGguUEkpIHtcbiAgICAgICAgc3RhcnQgPSB7XG4gICAgICAgICAgICB4OiBib3gubWF4WCxcbiAgICAgICAgICAgIHk6IGJveC5taW5ZLFxuICAgICAgICB9O1xuICAgICAgICBlbmQgPSB7XG4gICAgICAgICAgICB4OiBib3gubWluWCxcbiAgICAgICAgICAgIHk6IGJveC5tYXhZLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBlbHNlIGlmIChNYXRoLlBJIDw9IGFuZ2xlICYmIGFuZ2xlIDwgKDMgLyAyKSAqIE1hdGguUEkpIHtcbiAgICAgICAgc3RhcnQgPSB7XG4gICAgICAgICAgICB4OiBib3gubWF4WCxcbiAgICAgICAgICAgIHk6IGJveC5tYXhZLFxuICAgICAgICB9O1xuICAgICAgICBlbmQgPSB7XG4gICAgICAgICAgICB4OiBib3gubWluWCxcbiAgICAgICAgICAgIHk6IGJveC5taW5ZLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgc3RhcnQgPSB7XG4gICAgICAgICAgICB4OiBib3gubWluWCxcbiAgICAgICAgICAgIHk6IGJveC5tYXhZLFxuICAgICAgICB9O1xuICAgICAgICBlbmQgPSB7XG4gICAgICAgICAgICB4OiBib3gubWF4WCxcbiAgICAgICAgICAgIHk6IGJveC5taW5ZLFxuICAgICAgICB9O1xuICAgIH1cbiAgICB2YXIgdGFuVGhldGEgPSBNYXRoLnRhbihhbmdsZSk7XG4gICAgdmFyIHRhblRoZXRhMiA9IHRhblRoZXRhICogdGFuVGhldGE7XG4gICAgdmFyIHggPSAoZW5kLnggLSBzdGFydC54ICsgdGFuVGhldGEgKiAoZW5kLnkgLSBzdGFydC55KSkgLyAodGFuVGhldGEyICsgMSkgKyBzdGFydC54O1xuICAgIHZhciB5ID0gKHRhblRoZXRhICogKGVuZC54IC0gc3RhcnQueCArIHRhblRoZXRhICogKGVuZC55IC0gc3RhcnQueSkpKSAvICh0YW5UaGV0YTIgKyAxKSArIHN0YXJ0Lnk7XG4gICAgdmFyIGdyYWRpZW50ID0gY29udGV4dC5jcmVhdGVMaW5lYXJHcmFkaWVudChzdGFydC54LCBzdGFydC55LCB4LCB5KTtcbiAgICBhZGRTdG9wKHN0ZXBzLCBncmFkaWVudCk7XG4gICAgcmV0dXJuIGdyYWRpZW50O1xufVxuLyoqXG4gKiDlsIbovrnlkozloavlhYXorr7nva7nmoTpopzoibLovazmjaLmiJDlnIblvaLmuJDlj5jlr7nosaFcbiAqIEBwYXJhbSB7Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJEfSBjb250ZXh0IGNhbnZhcyDkuIrkuIvmlodcbiAqIEBwYXJhbSB7SUVsZW1lbnR9ICAgICAgICAgICAgICAgICBlbGVtZW50ICDlm77lvaLlhYPntKBcbiAqIEBwYXJhbSB7c3RyaW5nfSAgICAgICAgICAgICAgICAgICBncmFkaWVudFN0ciAgIOminOiJslxuICogQHJldHVybnMge2FueX0g5riQ5Y+Y5a+56LGhXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVJhZGlhbEdyYWRpZW50KGNvbnRleHQsIGVsZW1lbnQsIGdyYWRpZW50U3RyKSB7XG4gICAgdmFyIGFyciA9IHJlZ2V4UkcuZXhlYyhncmFkaWVudFN0cik7XG4gICAgdmFyIGZ4ID0gcGFyc2VGbG9hdChhcnJbMV0pO1xuICAgIHZhciBmeSA9IHBhcnNlRmxvYXQoYXJyWzJdKTtcbiAgICB2YXIgZnIgPSBwYXJzZUZsb2F0KGFyclszXSk7XG4gICAgdmFyIHN0ZXBzID0gYXJyWzRdO1xuICAgIC8vIOeOr+WNiuW+hOS4ujDml7bvvIzpu5jorqTml6DmuJDlj5jvvIzlj5bmuJDlj5jluo/liJfnmoTmnIDlkI7kuIDkuKrpopzoibJcbiAgICBpZiAoZnIgPT09IDApIHtcbiAgICAgICAgdmFyIGNvbG9ycyA9IHN0ZXBzLm1hdGNoKHJlZ2V4Q29sb3JTdG9wKTtcbiAgICAgICAgcmV0dXJuIGNvbG9yc1tjb2xvcnMubGVuZ3RoIC0gMV0uc3BsaXQoJzonKVsxXTtcbiAgICB9XG4gICAgdmFyIGJveCA9IGVsZW1lbnQuZ2V0QkJveCgpO1xuICAgIHZhciB3aWR0aCA9IGJveC5tYXhYIC0gYm94Lm1pblg7XG4gICAgdmFyIGhlaWdodCA9IGJveC5tYXhZIC0gYm94Lm1pblk7XG4gICAgdmFyIHIgPSBNYXRoLnNxcnQod2lkdGggKiB3aWR0aCArIGhlaWdodCAqIGhlaWdodCkgLyAyO1xuICAgIHZhciBncmFkaWVudCA9IGNvbnRleHQuY3JlYXRlUmFkaWFsR3JhZGllbnQoYm94Lm1pblggKyB3aWR0aCAqIGZ4LCBib3gubWluWSArIGhlaWdodCAqIGZ5LCAwLCBib3gubWluWCArIHdpZHRoIC8gMiwgYm94Lm1pblkgKyBoZWlnaHQgLyAyLCBmciAqIHIpO1xuICAgIGFkZFN0b3Aoc3RlcHMsIGdyYWRpZW50KTtcbiAgICByZXR1cm4gZ3JhZGllbnQ7XG59XG4vKipcbiAqIOi+ueWSjOWhq+WFheiuvue9rueahOminOiJsui9rOaNouaIkCBwYXR0ZXJuXG4gKiBAcGFyYW0ge0NhbnZhc1JlbmRlcmluZ0NvbnRleHQyRH0gY29udGV4dCBjYW52YXMg5LiK5LiL5paHXG4gKiBAcGFyYW0ge0lFbGVtZW50fSAgICAgICAgICAgICAgICAgZWxlbWVudCAg5Zu+5b2i5YWD57SgXG4gKiBAcGFyYW0ge3N0cmluZ30gICAgICAgICAgICAgICAgICAgcGF0dGVyblN0ciAgIOeUn+aIkCBwYXR0ZXJuIOeahOWtl+espuS4slxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VQYXR0ZXJuKGNvbnRleHQsIGVsZW1lbnQsIHBhdHRlcm5TdHIpIHtcbiAgICAvLyDlnKjovazmjaLov4fnqIvkuK3ov5vooYzkuobnvJPlrZhcbiAgICBpZiAoZWxlbWVudC5nZXQoJ3BhdHRlcm5Tb3VyY2UnKSAmJiBlbGVtZW50LmdldCgncGF0dGVyblNvdXJjZScpID09PSBwYXR0ZXJuU3RyKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50LmdldCgncGF0dGVybicpO1xuICAgIH1cbiAgICB2YXIgcGF0dGVybjtcbiAgICB2YXIgaW1nO1xuICAgIHZhciBhcnIgPSByZWdleFBSLmV4ZWMocGF0dGVyblN0cik7XG4gICAgdmFyIHJlcGVhdCA9IGFyclsxXTtcbiAgICB2YXIgc291cmNlID0gYXJyWzJdO1xuICAgIC8vIEZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuIHBhdHRlcm4gbG9hZHNcbiAgICBmdW5jdGlvbiBvbmxvYWQoKSB7XG4gICAgICAgIC8vIENyZWF0ZSBwYXR0ZXJuXG4gICAgICAgIHBhdHRlcm4gPSBjb250ZXh0LmNyZWF0ZVBhdHRlcm4oaW1nLCByZXBlYXQpO1xuICAgICAgICBlbGVtZW50LnNldCgncGF0dGVybicsIHBhdHRlcm4pOyAvLyBiZSBhIGNhY2hlXG4gICAgICAgIGVsZW1lbnQuc2V0KCdwYXR0ZXJuU291cmNlJywgcGF0dGVyblN0cik7XG4gICAgfVxuICAgIHN3aXRjaCAocmVwZWF0KSB7XG4gICAgICAgIGNhc2UgJ2EnOlxuICAgICAgICAgICAgcmVwZWF0ID0gJ3JlcGVhdCc7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAneCc6XG4gICAgICAgICAgICByZXBlYXQgPSAncmVwZWF0LXgnO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3knOlxuICAgICAgICAgICAgcmVwZWF0ID0gJ3JlcGVhdC15JztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICduJzpcbiAgICAgICAgICAgIHJlcGVhdCA9ICduby1yZXBlYXQnO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXBlYXQgPSAnbm8tcmVwZWF0JztcbiAgICB9XG4gICAgaW1nID0gbmV3IEltYWdlKCk7XG4gICAgLy8gSWYgc291cmNlIFVSTCBpcyBub3QgYSBkYXRhIFVSTFxuICAgIGlmICghc291cmNlLm1hdGNoKC9eZGF0YTovaSkpIHtcbiAgICAgICAgLy8gU2V0IGNyb3NzT3JpZ2luIGZvciB0aGlzIGltYWdlXG4gICAgICAgIGltZy5jcm9zc09yaWdpbiA9ICdBbm9ueW1vdXMnO1xuICAgIH1cbiAgICBpbWcuc3JjID0gc291cmNlO1xuICAgIGlmIChpbWcuY29tcGxldGUpIHtcbiAgICAgICAgb25sb2FkKCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpbWcub25sb2FkID0gb25sb2FkO1xuICAgICAgICAvLyBGaXggb25sb2FkKCkgYnVnIGluIElFOVxuICAgICAgICBpbWcuc3JjID0gaW1nLnNyYztcbiAgICB9XG4gICAgcmV0dXJuIHBhdHRlcm47XG59XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VTdHlsZShjb250ZXh0LCBlbGVtZW50LCBjb2xvcikge1xuICAgIHZhciBiYm94ID0gZWxlbWVudC5nZXRCQm94KCk7XG4gICAgaWYgKGlzTmFOKGJib3gueCkgfHwgaXNOYU4oYmJveC55KSB8fCBpc05hTihiYm94LndpZHRoKSB8fCBpc05hTihiYm94LmhlaWdodCkpIHtcbiAgICAgICAgcmV0dXJuIGNvbG9yO1xuICAgIH1cbiAgICBpZiAoaXNTdHJpbmcoY29sb3IpKSB7XG4gICAgICAgIGlmIChjb2xvclsxXSA9PT0gJygnIHx8IGNvbG9yWzJdID09PSAnKCcpIHtcbiAgICAgICAgICAgIGlmIChjb2xvclswXSA9PT0gJ2wnKSB7XG4gICAgICAgICAgICAgICAgLy8gcmVnZXhMRy50ZXN0KGNvbG9yKVxuICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZUxpbmVHcmFkaWVudChjb250ZXh0LCBlbGVtZW50LCBjb2xvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY29sb3JbMF0gPT09ICdyJykge1xuICAgICAgICAgICAgICAgIC8vIHJlZ2V4UkcudGVzdChjb2xvcilcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VSYWRpYWxHcmFkaWVudChjb250ZXh0LCBlbGVtZW50LCBjb2xvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY29sb3JbMF0gPT09ICdwJykge1xuICAgICAgICAgICAgICAgIC8vIHJlZ2V4UFIudGVzdChjb2xvcilcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VQYXR0ZXJuKGNvbnRleHQsIGVsZW1lbnQsIGNvbG9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29sb3I7XG4gICAgfVxuICAgIGlmIChjb2xvciBpbnN0YW5jZW9mIENhbnZhc1BhdHRlcm4pIHtcbiAgICAgICAgcmV0dXJuIGNvbG9yO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVJhZGl1cyhyYWRpdXMpIHtcbiAgICB2YXIgcjEgPSAwO1xuICAgIHZhciByMiA9IDA7XG4gICAgdmFyIHIzID0gMDtcbiAgICB2YXIgcjQgPSAwO1xuICAgIGlmIChpc0FycmF5KHJhZGl1cykpIHtcbiAgICAgICAgaWYgKHJhZGl1cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHIxID0gcjIgPSByMyA9IHI0ID0gcmFkaXVzWzBdO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHJhZGl1cy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgIHIxID0gcjMgPSByYWRpdXNbMF07XG4gICAgICAgICAgICByMiA9IHI0ID0gcmFkaXVzWzFdO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHJhZGl1cy5sZW5ndGggPT09IDMpIHtcbiAgICAgICAgICAgIHIxID0gcmFkaXVzWzBdO1xuICAgICAgICAgICAgcjIgPSByNCA9IHJhZGl1c1sxXTtcbiAgICAgICAgICAgIHIzID0gcmFkaXVzWzJdO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcjEgPSByYWRpdXNbMF07XG4gICAgICAgICAgICByMiA9IHJhZGl1c1sxXTtcbiAgICAgICAgICAgIHIzID0gcmFkaXVzWzJdO1xuICAgICAgICAgICAgcjQgPSByYWRpdXNbM107XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHIxID0gcjIgPSByMyA9IHI0ID0gcmFkaXVzO1xuICAgIH1cbiAgICByZXR1cm4gW3IxLCByMiwgcjMsIHI0XTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBhcnNlLmpzLm1hcCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///142\n")},function(module,__webpack_exports__,__webpack_require__){"use strict";eval('\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, "b", function() { return /* binding */ getRotationScale; });\n__webpack_require__.d(__webpack_exports__, "a", function() { return /* binding */ decodePickingColor; });\n\n// UNUSED EXPORTS: getAngle, createVec3, encodePickingColor\n\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/slicedToArray.js\nvar slicedToArray = __webpack_require__(61);\nvar slicedToArray_default = /*#__PURE__*/__webpack_require__.n(slicedToArray);\n\n// EXTERNAL MODULE: ./node_modules/gl-matrix/esm/index.js + 4 modules\nvar esm = __webpack_require__(2);\n\n// CONCATENATED MODULE: ./node_modules/@antv/g-webgpu-core/es/utils/is-number.js\nfunction isNumber(value) {\n return typeof value === \'number\';\n}\n//# sourceMappingURL=is-number.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-webgpu-core/es/utils/math.js\n\n\n\nfunction getAngle(angle) {\n if (angle === undefined) {\n return 0;\n } else if (angle > 360 || angle < -360) {\n return angle % 360;\n }\n\n return angle;\n}\nfunction createVec3(x, y, z) {\n if (isNumber(x)) {\n return esm["e" /* vec3 */].fromValues(x, y, z);\n }\n\n if (x.length === 3) {\n return esm["e" /* vec3 */].clone(x);\n } // @ts-ignore\n\n\n return esm["e" /* vec3 */].fromValues(x[0], x[1], x[2]);\n}\nfunction getRotationScale(matrix, result) {\n result[0] = matrix[0];\n result[1] = matrix[1];\n result[2] = matrix[2];\n result[3] = matrix[4];\n result[4] = matrix[5];\n result[5] = matrix[6];\n result[6] = matrix[8];\n result[7] = matrix[9];\n result[8] = matrix[10];\n return result;\n}\nfunction decodePickingColor(color) {\n var _color = slicedToArray_default()(color, 3),\n i1 = _color[0],\n i2 = _color[1],\n i3 = _color[2]; // 1 was added to seperate from no selection\n\n\n var index = i1 + i2 * 256 + i3 * 65536 - 1;\n return index;\n}\nfunction encodePickingColor(featureIdx) {\n return [featureIdx + 1 & 255, featureIdx + 1 >> 8 & 255, featureIdx + 1 >> 8 >> 8 & 255];\n}\n//# sourceMappingURL=math.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy13ZWJncHUtY29yZS9lcy91dGlscy9pcy1udW1iZXIuanM/MzhhMyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy13ZWJncHUtY29yZS9lcy91dGlscy9tYXRoLmpzP2ZiMTAiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBQU87QUFDUDtBQUNBO0FBQ0EscUM7O0FDSGtFO0FBQ2pDO0FBQ007QUFDaEM7QUFDUDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNPO0FBQ1AsTUFBTSxRQUFRO0FBQ2QsV0FBVyxtQkFBSTtBQUNmOztBQUVBO0FBQ0EsV0FBVyxtQkFBSTtBQUNmLEdBQUc7OztBQUdILFNBQVMsbUJBQUk7QUFDYjtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1AsZUFBZSx1QkFBYztBQUM3QjtBQUNBO0FBQ0EscUJBQXFCOzs7QUFHckI7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0EiLCJmaWxlIjoiMTQzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGZ1bmN0aW9uIGlzTnVtYmVyKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aXMtbnVtYmVyLmpzLm1hcCIsImltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgeyB2ZWMzIH0gZnJvbSAnZ2wtbWF0cml4JztcbmltcG9ydCB7IGlzTnVtYmVyIH0gZnJvbSAnLi9pcy1udW1iZXInO1xuZXhwb3J0IGZ1bmN0aW9uIGdldEFuZ2xlKGFuZ2xlKSB7XG4gIGlmIChhbmdsZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIDA7XG4gIH0gZWxzZSBpZiAoYW5nbGUgPiAzNjAgfHwgYW5nbGUgPCAtMzYwKSB7XG4gICAgcmV0dXJuIGFuZ2xlICUgMzYwO1xuICB9XG5cbiAgcmV0dXJuIGFuZ2xlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVZlYzMoeCwgeSwgeikge1xuICBpZiAoaXNOdW1iZXIoeCkpIHtcbiAgICByZXR1cm4gdmVjMy5mcm9tVmFsdWVzKHgsIHksIHopO1xuICB9XG5cbiAgaWYgKHgubGVuZ3RoID09PSAzKSB7XG4gICAgcmV0dXJuIHZlYzMuY2xvbmUoeCk7XG4gIH0gLy8gQHRzLWlnbm9yZVxuXG5cbiAgcmV0dXJuIHZlYzMuZnJvbVZhbHVlcyh4WzBdLCB4WzFdLCB4WzJdKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRSb3RhdGlvblNjYWxlKG1hdHJpeCwgcmVzdWx0KSB7XG4gIHJlc3VsdFswXSA9IG1hdHJpeFswXTtcbiAgcmVzdWx0WzFdID0gbWF0cml4WzFdO1xuICByZXN1bHRbMl0gPSBtYXRyaXhbMl07XG4gIHJlc3VsdFszXSA9IG1hdHJpeFs0XTtcbiAgcmVzdWx0WzRdID0gbWF0cml4WzVdO1xuICByZXN1bHRbNV0gPSBtYXRyaXhbNl07XG4gIHJlc3VsdFs2XSA9IG1hdHJpeFs4XTtcbiAgcmVzdWx0WzddID0gbWF0cml4WzldO1xuICByZXN1bHRbOF0gPSBtYXRyaXhbMTBdO1xuICByZXR1cm4gcmVzdWx0O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZVBpY2tpbmdDb2xvcihjb2xvcikge1xuICB2YXIgX2NvbG9yID0gX3NsaWNlZFRvQXJyYXkoY29sb3IsIDMpLFxuICAgICAgaTEgPSBfY29sb3JbMF0sXG4gICAgICBpMiA9IF9jb2xvclsxXSxcbiAgICAgIGkzID0gX2NvbG9yWzJdOyAvLyAxIHdhcyBhZGRlZCB0byBzZXBlcmF0ZSBmcm9tIG5vIHNlbGVjdGlvblxuXG5cbiAgdmFyIGluZGV4ID0gaTEgKyBpMiAqIDI1NiArIGkzICogNjU1MzYgLSAxO1xuICByZXR1cm4gaW5kZXg7XG59XG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlUGlja2luZ0NvbG9yKGZlYXR1cmVJZHgpIHtcbiAgcmV0dXJuIFtmZWF0dXJlSWR4ICsgMSAmIDI1NSwgZmVhdHVyZUlkeCArIDEgPj4gOCAmIDI1NSwgZmVhdHVyZUlkeCArIDEgPj4gOCA+PiA4ICYgMjU1XTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1hdGguanMubWFwIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///143\n')},function(module,exports,__webpack_require__){eval('/*\nCopyright (c) 2012-2014 Chris Pettitt\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the "Software"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n*/\n\nmodule.exports = {\n graphlib: __webpack_require__(46),\n\n layout: __webpack_require__(434),\n debug: __webpack_require__(496),\n util: {\n time: __webpack_require__(36).time,\n notime: __webpack_require__(36).notime\n },\n version: __webpack_require__(497)\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZGFncmVqcy9pbmRleC5qcz82OTQ4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFlBQVksbUJBQU8sQ0FBQyxFQUFnQjs7QUFFcEMsVUFBVSxtQkFBTyxDQUFDLEdBQWM7QUFDaEMsU0FBUyxtQkFBTyxDQUFDLEdBQWE7QUFDOUI7QUFDQSxVQUFVLG1CQUFPLENBQUMsRUFBWTtBQUM5QixZQUFZLG1CQUFPLENBQUMsRUFBWTtBQUNoQyxHQUFHO0FBQ0gsV0FBVyxtQkFBTyxDQUFDLEdBQWU7QUFDbEMiLCJmaWxlIjoiMTQ0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCAoYykgMjAxMi0yMDE0IENocmlzIFBldHRpdHRcblxuUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxub2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xudG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG5mdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuXG5UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG5cblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbklNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG5BVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG5MSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuVEhFIFNPRlRXQVJFLlxuKi9cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGdyYXBobGliOiByZXF1aXJlKFwiLi9saWIvZ3JhcGhsaWJcIiksXG5cbiAgbGF5b3V0OiByZXF1aXJlKFwiLi9saWIvbGF5b3V0XCIpLFxuICBkZWJ1ZzogcmVxdWlyZShcIi4vbGliL2RlYnVnXCIpLFxuICB1dGlsOiB7XG4gICAgdGltZTogcmVxdWlyZShcIi4vbGliL3V0aWxcIikudGltZSxcbiAgICBub3RpbWU6IHJlcXVpcmUoXCIuL2xpYi91dGlsXCIpLm5vdGltZVxuICB9LFxuICB2ZXJzaW9uOiByZXF1aXJlKFwiLi9saWIvdmVyc2lvblwiKVxufTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///144\n')},function(module,exports,__webpack_require__){"use strict";eval("\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.SVLink = void 0;\r\nconst util_1 = __webpack_require__(53);\r\nconst SVModel_1 = __webpack_require__(146);\r\nclass SVLink extends SVModel_1.SVModel {\r\n constructor(id, type, group, layout, node, target, index, options) {\r\n super(id, type, group, layout, 'link');\r\n this.node = node;\r\n this.target = target;\r\n this.linkIndex = index;\r\n node.links.outDegree.push(this);\r\n target.links.inDegree.push(this);\r\n this.G6ModelProps = this.generateG6ModelProps(options);\r\n }\r\n generateG6ModelProps(options) {\r\n let sourceAnchor = options.sourceAnchor, targetAnchor = options.targetAnchor;\r\n if (options.sourceAnchor && typeof options.sourceAnchor === 'function' && this.linkIndex !== null) {\r\n sourceAnchor = options.sourceAnchor(this.linkIndex);\r\n }\r\n if (options.targetAnchor && typeof options.targetAnchor === 'function' && this.linkIndex !== null) {\r\n targetAnchor = options.targetAnchor(this.linkIndex);\r\n }\r\n return {\r\n id: this.id,\r\n type: options.type,\r\n source: this.node.id,\r\n target: this.target.id,\r\n sourceAnchor,\r\n targetAnchor,\r\n label: options.label,\r\n style: util_1.Util.objectClone(options.style),\r\n labelCfg: util_1.Util.objectClone(options.labelOptions),\r\n curveOffset: options.curveOffset\r\n };\r\n }\r\n}\r\nexports.SVLink = SVLink;\r\n;\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvTW9kZWwvU1ZMaW5rLnRzP2RjZTYiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsdUNBQXNDO0FBRXRDLDJDQUFvQztBQUdwQyxNQUFhLE1BQU8sU0FBUSxpQkFBTztJQVEvQixZQUFZLEVBQVUsRUFBRSxJQUFZLEVBQUUsS0FBYSxFQUFFLE1BQWMsRUFBRSxJQUFZLEVBQUUsTUFBYyxFQUFFLEtBQWEsRUFBRSxPQUFtQjtRQUNqSSxLQUFLLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRXZDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBRXZCLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoQyxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDakMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUdTLG9CQUFvQixDQUFDLE9BQW1CO1FBQzlDLElBQUksWUFBWSxHQUFHLE9BQU8sQ0FBQyxZQUFZLEVBQ25DLFlBQVksR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDO1FBRXhDLElBQUcsT0FBTyxDQUFDLFlBQVksSUFBSSxPQUFPLE9BQU8sQ0FBQyxZQUFZLEtBQUssVUFBVSxJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssSUFBSSxFQUFFO1lBQzlGLFlBQVksR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztTQUN2RDtRQUVELElBQUcsT0FBTyxDQUFDLFlBQVksSUFBSSxPQUFPLE9BQU8sQ0FBQyxZQUFZLEtBQUssVUFBVSxJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssSUFBSSxFQUFFO1lBQzlGLFlBQVksR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztTQUN2RDtRQUVELE9BQU87WUFDSCxFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUU7WUFDWCxJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUk7WUFDbEIsTUFBTSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNwQixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ3RCLFlBQVk7WUFDWixZQUFZO1lBQ1osS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLO1lBQ3BCLEtBQUssRUFBRSxXQUFJLENBQUMsV0FBVyxDQUFRLE9BQU8sQ0FBQyxLQUFLLENBQUM7WUFDN0MsUUFBUSxFQUFFLFdBQUksQ0FBQyxXQUFXLENBQWtCLE9BQU8sQ0FBQyxZQUFZLENBQUM7WUFDakUsV0FBVyxFQUFFLE9BQU8sQ0FBQyxXQUFXO1NBQ25DLENBQUM7SUFDTixDQUFDO0NBQ0o7QUE5Q0Qsd0JBOENDO0FBQUEsQ0FBQyIsImZpbGUiOiIxNDUuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFZGdlQ29uZmlnLCBJRWRnZSB9IGZyb20gXCJAYW50di9nNi1jb3JlXCI7XHJcbmltcG9ydCB7IFV0aWwgfSBmcm9tIFwiLi4vQ29tbW9uL3V0aWxcIjtcclxuaW1wb3J0IHsgTGlua0xhYmVsT3B0aW9uLCBMaW5rT3B0aW9uLCBTdHlsZSB9IGZyb20gXCIuLi9vcHRpb25zXCI7XHJcbmltcG9ydCB7IFNWTW9kZWwgfSBmcm9tIFwiLi9TVk1vZGVsXCI7XHJcbmltcG9ydCB7IFNWTm9kZSB9IGZyb20gXCIuL1NWTm9kZVwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFNWTGluayBleHRlbmRzIFNWTW9kZWwgeyBcclxuICAgIHB1YmxpYyBub2RlOiBTVk5vZGU7XHJcbiAgICBwdWJsaWMgdGFyZ2V0OiBTVk5vZGU7XHJcbiAgICBwdWJsaWMgbGlua0luZGV4OiBudW1iZXI7XHJcblxyXG4gICAgcHVibGljIHNoYWRvd0c2SXRlbTogSUVkZ2U7XHJcbiAgICBwdWJsaWMgRzZJdGVtOiBJRWRnZTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihpZDogc3RyaW5nLCB0eXBlOiBzdHJpbmcsIGdyb3VwOiBzdHJpbmcsIGxheW91dDogc3RyaW5nLCBub2RlOiBTVk5vZGUsIHRhcmdldDogU1ZOb2RlLCBpbmRleDogbnVtYmVyLCBvcHRpb25zOiBMaW5rT3B0aW9uKSB7IFxyXG4gICAgICAgIHN1cGVyKGlkLCB0eXBlLCBncm91cCwgbGF5b3V0LCAnbGluaycpO1xyXG5cclxuICAgICAgICB0aGlzLm5vZGUgPSBub2RlO1xyXG4gICAgICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0O1xyXG4gICAgICAgIHRoaXMubGlua0luZGV4ID0gaW5kZXg7XHJcblxyXG4gICAgICAgIG5vZGUubGlua3Mub3V0RGVncmVlLnB1c2godGhpcyk7XHJcbiAgICAgICAgdGFyZ2V0LmxpbmtzLmluRGVncmVlLnB1c2godGhpcyk7XHJcbiAgICAgICAgdGhpcy5HNk1vZGVsUHJvcHMgPSB0aGlzLmdlbmVyYXRlRzZNb2RlbFByb3BzKG9wdGlvbnMpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwcm90ZWN0ZWQgZ2VuZXJhdGVHNk1vZGVsUHJvcHMob3B0aW9uczogTGlua09wdGlvbik6IEVkZ2VDb25maWcge1xyXG4gICAgICAgIGxldCBzb3VyY2VBbmNob3IgPSBvcHRpb25zLnNvdXJjZUFuY2hvciwgXHJcbiAgICAgICAgICAgIHRhcmdldEFuY2hvciA9IG9wdGlvbnMudGFyZ2V0QW5jaG9yO1xyXG5cclxuICAgICAgICBpZihvcHRpb25zLnNvdXJjZUFuY2hvciAmJiB0eXBlb2Ygb3B0aW9ucy5zb3VyY2VBbmNob3IgPT09ICdmdW5jdGlvbicgJiYgdGhpcy5saW5rSW5kZXggIT09IG51bGwpIHtcclxuICAgICAgICAgICAgc291cmNlQW5jaG9yID0gb3B0aW9ucy5zb3VyY2VBbmNob3IodGhpcy5saW5rSW5kZXgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYob3B0aW9ucy50YXJnZXRBbmNob3IgJiYgdHlwZW9mIG9wdGlvbnMudGFyZ2V0QW5jaG9yID09PSAnZnVuY3Rpb24nICYmIHRoaXMubGlua0luZGV4ICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRhcmdldEFuY2hvciA9IG9wdGlvbnMudGFyZ2V0QW5jaG9yKHRoaXMubGlua0luZGV4KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxyXG4gICAgICAgICAgICB0eXBlOiBvcHRpb25zLnR5cGUsXHJcbiAgICAgICAgICAgIHNvdXJjZTogdGhpcy5ub2RlLmlkLFxyXG4gICAgICAgICAgICB0YXJnZXQ6IHRoaXMudGFyZ2V0LmlkLFxyXG4gICAgICAgICAgICBzb3VyY2VBbmNob3IsXHJcbiAgICAgICAgICAgIHRhcmdldEFuY2hvcixcclxuICAgICAgICAgICAgbGFiZWw6IG9wdGlvbnMubGFiZWwsXHJcbiAgICAgICAgICAgIHN0eWxlOiBVdGlsLm9iamVjdENsb25lPFN0eWxlPihvcHRpb25zLnN0eWxlKSxcclxuICAgICAgICAgICAgbGFiZWxDZmc6IFV0aWwub2JqZWN0Q2xvbmU8TGlua0xhYmVsT3B0aW9uPihvcHRpb25zLmxhYmVsT3B0aW9ucyksXHJcbiAgICAgICAgICAgIGN1cnZlT2Zmc2V0OiBvcHRpb25zLmN1cnZlT2Zmc2V0XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxufTtcclxuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///145\n")},function(module,exports,__webpack_require__){"use strict";eval("\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.SVModel = void 0;\r\nconst util_1 = __webpack_require__(53);\r\nclass SVModel {\r\n constructor(id, type, group, layout, modelType) {\r\n this.id = id;\r\n this.sourceType = type;\r\n this.group = group;\r\n this.layout = layout;\r\n this.shadowG6Item = null;\r\n this.G6Item = null;\r\n this.discarded = false;\r\n this.freed = false;\r\n this.leaked = false;\r\n this.transformMatrix = [1, 0, 0, 0, 1, 0, 0, 0, 1];\r\n this.modelType = modelType;\r\n }\r\n generateG6ModelProps(options) {\r\n return null;\r\n }\r\n get(attr) {\r\n return this.G6ModelProps[attr];\r\n }\r\n set(attr, value) {\r\n if (this.discarded) {\r\n return;\r\n }\r\n if (typeof attr === 'object') {\r\n Object.keys(attr).map(item => {\r\n this.set(item, attr[item]);\r\n });\r\n return;\r\n }\r\n if (this.G6ModelProps[attr] === value) {\r\n return;\r\n }\r\n if (attr === 'style' || attr === 'labelCfg') {\r\n Object.assign(this.G6ModelProps[attr], value);\r\n }\r\n else {\r\n this.G6ModelProps[attr] = value;\r\n }\r\n if (attr === 'rotation') {\r\n const matrix = util_1.Util.calcRotateMatrix(this.getMatrix(), value);\r\n this.setMatrix(matrix);\r\n }\r\n if (this.G6Item) {\r\n if (attr === 'x' || attr === 'y') {\r\n this.G6Item.updatePosition({ [attr]: value });\r\n this.G6Item.refresh();\r\n }\r\n else {\r\n this.G6Item.update(this.G6ModelProps);\r\n }\r\n }\r\n if (this.shadowG6Item) {\r\n if (attr === 'x' || attr === 'y') {\r\n this.shadowG6Item.updatePosition({ [attr]: value });\r\n this.shadowG6Item.refresh();\r\n }\r\n else {\r\n this.shadowG6Item.update(this.G6ModelProps);\r\n }\r\n }\r\n }\r\n getBound() {\r\n return this.shadowG6Item.getBBox();\r\n }\r\n getMatrix() {\r\n return [...this.transformMatrix];\r\n }\r\n setMatrix(matrix) {\r\n this.transformMatrix = matrix;\r\n this.set('style', { matrix });\r\n }\r\n getG6ModelProps() {\r\n return util_1.Util.objectClone(this.G6ModelProps);\r\n }\r\n getModelType() {\r\n return this.modelType;\r\n }\r\n isNode() {\r\n return false;\r\n }\r\n}\r\nexports.SVModel = SVModel;\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvTW9kZWwvU1ZNb2RlbC50cz9kMGJhIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHVDQUFzQztBQVV0QyxNQUFhLE9BQU87SUFrQmhCLFlBQVksRUFBVSxFQUFFLElBQVksRUFBRSxLQUFhLEVBQUUsTUFBYyxFQUFFLFNBQWlCO1FBQ2xGLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDO1FBQ2IsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7UUFDdkIsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDekIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFDbkIsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDdkIsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFDcEIsSUFBSSxDQUFDLGVBQWUsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDbkQsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7SUFDL0IsQ0FBQztJQU9TLG9CQUFvQixDQUFDLE9BQW9CO1FBQy9DLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFNRCxHQUFHLENBQUMsSUFBWTtRQUNaLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBUUQsR0FBRyxDQUFDLElBQXFCLEVBQUUsS0FBVztRQUNsQyxJQUFHLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDZixPQUFPO1NBQ1Y7UUFFRCxJQUFHLE9BQU8sSUFBSSxLQUFLLFFBQVEsRUFBRTtZQUN6QixNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDekIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDL0IsQ0FBQyxDQUFDLENBQUM7WUFDSCxPQUFPO1NBQ1Y7UUFFRCxJQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssS0FBSyxFQUFFO1lBQ2xDLE9BQU87U0FDVjtRQUVELElBQUcsSUFBSSxLQUFLLE9BQU8sSUFBSSxJQUFJLEtBQUssVUFBVSxFQUFFO1lBQ3hDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztTQUNqRDthQUNJO1lBQ0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUM7U0FDbkM7UUFFRCxJQUFHLElBQUksS0FBSyxVQUFVLEVBQUU7WUFDcEIsTUFBTSxNQUFNLEdBQUcsV0FBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUM5RCxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQzFCO1FBR0QsSUFBRyxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ1osSUFBRyxJQUFJLEtBQUssR0FBRyxJQUFJLElBQUksS0FBSyxHQUFHLEVBQUU7Z0JBQzdCLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQVcsQ0FBQyxDQUFDO2dCQUN2RCxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO2FBQ3pCO2lCQUNJO2dCQUNELElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQzthQUN6QztTQUNKO1FBR0QsSUFBRyxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ2xCLElBQUcsSUFBSSxLQUFLLEdBQUcsSUFBSSxJQUFJLEtBQUssR0FBRyxFQUFFO2dCQUM3QixJQUFJLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFXLENBQUMsQ0FBQztnQkFDN0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsQ0FBQzthQUMvQjtpQkFDSTtnQkFDRCxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7YUFDL0M7U0FDSjtJQUNMLENBQUM7SUFNRCxRQUFRO1FBQ0osT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ3ZDLENBQUM7SUFLRCxTQUFTO1FBQ0wsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFNRCxTQUFTLENBQUMsTUFBZ0I7UUFDdEIsSUFBSSxDQUFDLGVBQWUsR0FBRyxNQUFNLENBQUM7UUFDOUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFNRCxlQUFlO1FBQ1gsT0FBTyxXQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBTUQsWUFBWTtRQUNSLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUMxQixDQUFDO0lBS0QsTUFBTTtRQUNGLE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7Q0FDSjtBQXhKRCwwQkF3SkMiLCJmaWxlIjoiMTQ2LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVXRpbCB9IGZyb20gXCIuLi9Db21tb24vdXRpbFwiO1xyXG5pbXBvcnQgeyBNb2RlbE9wdGlvbiwgU3R5bGUgfSBmcm9tIFwiLi4vb3B0aW9uc1wiO1xyXG5pbXBvcnQgeyBCb3VuZGluZ1JlY3QgfSBmcm9tIFwiLi4vQ29tbW9uL2JvdW5kaW5nUmVjdFwiO1xyXG5pbXBvcnQgeyBFZGdlQ29uZmlnLCBJdGVtLCBOb2RlQ29uZmlnIH0gZnJvbSBcIkBhbnR2L2c2LWNvcmVcIjtcclxuaW1wb3J0IHsgUG9pbnQgfSBmcm9tIFwiQGFudHYvZy1iYXNlXCI7XHJcblxyXG5cclxuXHJcblxyXG5cclxuZXhwb3J0IGNsYXNzIFNWTW9kZWwge1xyXG4gICAgcHVibGljIGlkOiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgc291cmNlVHlwZTogc3RyaW5nO1xyXG4gICAgXHJcbiAgICBwdWJsaWMgZ3JvdXA6IHN0cmluZztcclxuICAgIHB1YmxpYyBsYXlvdXQ6IHN0cmluZztcclxuICAgIHB1YmxpYyBHNk1vZGVsUHJvcHM6IE5vZGVDb25maWcgfCBFZGdlQ29uZmlnO1xyXG4gICAgcHVibGljIHNoYWRvd0c2SXRlbTogSXRlbTtcclxuICAgIHB1YmxpYyBHNkl0ZW06IEl0ZW07XHJcblxyXG4gICAgcHVibGljIGRpc2NhcmRlZDogYm9vbGVhbjtcclxuICAgIHB1YmxpYyBmcmVlZDogYm9vbGVhbjtcclxuICAgIHB1YmxpYyBsZWFrZWQ6IGJvb2xlYW47XHJcbiAgICBwdWJsaWMgZ2VuZXJhbFN0eWxlOiBQYXJ0aWFsPFN0eWxlPjtcclxuXHJcbiAgICBwcml2YXRlIHRyYW5zZm9ybU1hdHJpeDogbnVtYmVyW107XHJcbiAgICBwcml2YXRlIG1vZGVsVHlwZTogc3RyaW5nO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGlkOiBzdHJpbmcsIHR5cGU6IHN0cmluZywgZ3JvdXA6IHN0cmluZywgbGF5b3V0OiBzdHJpbmcsIG1vZGVsVHlwZTogc3RyaW5nKSB7IFxyXG4gICAgICAgIHRoaXMuaWQgPSBpZDtcclxuICAgICAgICB0aGlzLnNvdXJjZVR5cGUgPSB0eXBlO1xyXG4gICAgICAgIHRoaXMuZ3JvdXAgPSBncm91cDtcclxuICAgICAgICB0aGlzLmxheW91dCA9IGxheW91dDtcclxuICAgICAgICB0aGlzLnNoYWRvd0c2SXRlbSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5HNkl0ZW0gPSBudWxsO1xyXG4gICAgICAgIHRoaXMuZGlzY2FyZGVkID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5mcmVlZCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMubGVha2VkID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy50cmFuc2Zvcm1NYXRyaXggPSBbMSwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMV07XHJcbiAgICAgICAgdGhpcy5tb2RlbFR5cGUgPSBtb2RlbFR5cGU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAb3ZlcnJpZGVcclxuICAgICAqIOWumuS5iSBHNiBtb2RlbCDnmoTlsZ7mgKdcclxuICAgICAqIEBwYXJhbSBvcHRpb24gXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBnZW5lcmF0ZUc2TW9kZWxQcm9wcyhvcHRpb25zOiBNb2RlbE9wdGlvbikge1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6I635Y+WIEc2IG1vZGVsIOeahOWxnuaAp1xyXG4gICAgICogQHBhcmFtIGF0dHIgXHJcbiAgICAgKi9cclxuICAgIGdldChhdHRyOiBzdHJpbmcpOiBhbnkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLkc2TW9kZWxQcm9wc1thdHRyXTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOiuvue9riBHNiBtb2RlbCDnmoTlsZ7mgKdcclxuICAgICAqIEBwYXJhbSBhdHRyIFxyXG4gICAgICogQHBhcmFtIHZhbHVlIFxyXG4gICAgICogQHJldHVybnMgXHJcbiAgICAgKi9cclxuICAgIHNldChhdHRyOiBzdHJpbmcgfCBvYmplY3QsIHZhbHVlPzogYW55KSB7XHJcbiAgICAgICAgaWYodGhpcy5kaXNjYXJkZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYodHlwZW9mIGF0dHIgPT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGF0dHIpLm1hcChpdGVtID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0KGl0ZW0sIGF0dHJbaXRlbV0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYodGhpcy5HNk1vZGVsUHJvcHNbYXR0cl0gPT09IHZhbHVlKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmKGF0dHIgPT09ICdzdHlsZScgfHwgYXR0ciA9PT0gJ2xhYmVsQ2ZnJykge1xyXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMuRzZNb2RlbFByb3BzW2F0dHJdLCB2YWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLkc2TW9kZWxQcm9wc1thdHRyXSA9IHZhbHVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYoYXR0ciA9PT0gJ3JvdGF0aW9uJykge1xyXG4gICAgICAgICAgICBjb25zdCBtYXRyaXggPSBVdGlsLmNhbGNSb3RhdGVNYXRyaXgodGhpcy5nZXRNYXRyaXgoKSwgdmFsdWUpO1xyXG4gICAgICAgICAgICB0aGlzLnNldE1hdHJpeChtYXRyaXgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8g5pu05pawRzZJdGVtXHJcbiAgICAgICAgaWYodGhpcy5HNkl0ZW0pIHtcclxuICAgICAgICAgICAgaWYoYXR0ciA9PT0gJ3gnIHx8IGF0dHIgPT09ICd5Jykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5HNkl0ZW0udXBkYXRlUG9zaXRpb24oeyBbYXR0cl06IHZhbHVlIH0gYXMgUG9pbnQpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5HNkl0ZW0ucmVmcmVzaCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5HNkl0ZW0udXBkYXRlKHRoaXMuRzZNb2RlbFByb3BzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8g5pu05pawc2hhZG93RzZJdGVtXHJcbiAgICAgICAgaWYodGhpcy5zaGFkb3dHNkl0ZW0pIHtcclxuICAgICAgICAgICAgaWYoYXR0ciA9PT0gJ3gnIHx8IGF0dHIgPT09ICd5Jykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zaGFkb3dHNkl0ZW0udXBkYXRlUG9zaXRpb24oeyBbYXR0cl06IHZhbHVlIH0gYXMgUG9pbnQpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zaGFkb3dHNkl0ZW0ucmVmcmVzaCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zaGFkb3dHNkl0ZW0udXBkYXRlKHRoaXMuRzZNb2RlbFByb3BzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOiOt+WPluWMheWbtOebklxyXG4gICAgICogQHJldHVybnMgXHJcbiAgICAgKi9cclxuICAgIGdldEJvdW5kKCk6IEJvdW5kaW5nUmVjdCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2hhZG93RzZJdGVtLmdldEJCb3goKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOiOt+WPluWPmOaNouefqemYtVxyXG4gICAgICovXHJcbiAgICBnZXRNYXRyaXgoKTogbnVtYmVyW10ge1xyXG4gICAgICAgIHJldHVybiBbLi4udGhpcy50cmFuc2Zvcm1NYXRyaXhdO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIOiuvue9ruWPmOaNouefqemYtVxyXG4gICAgICogQHBhcmFtIG1hdHJpeCBcclxuICAgICAqL1xyXG4gICAgc2V0TWF0cml4KG1hdHJpeDogbnVtYmVyW10pIHtcclxuICAgICAgICB0aGlzLnRyYW5zZm9ybU1hdHJpeCA9IG1hdHJpeDtcclxuICAgICAgICB0aGlzLnNldCgnc3R5bGUnLCB7IG1hdHJpeCB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMgXHJcbiAgICAgKi9cclxuICAgIGdldEc2TW9kZWxQcm9wcygpOiBOb2RlQ29uZmlnIHwgRWRnZUNvbmZpZyB7XHJcbiAgICAgICAgcmV0dXJuIFV0aWwub2JqZWN0Q2xvbmUodGhpcy5HNk1vZGVsUHJvcHMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6I635Y+WIG1vZGVsIOexu+Wei1xyXG4gICAgICogQHJldHVybnMgXHJcbiAgICAgKi9cclxuICAgIGdldE1vZGVsVHlwZSgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm1vZGVsVHlwZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOWIpOaWreaYr+WQpuS4uuiKgueCuW1vZGVs77yIU1ZOb2Rl77yJXHJcbiAgICAgKi9cclxuICAgIGlzTm9kZSgpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbn1cclxuXHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///146\n")},function(module,exports,__webpack_require__){"use strict";eval('\r\nObject.defineProperty(exports, "__esModule", { value: true });\r\nexports.Bound = void 0;\r\nconst vector_1 = __webpack_require__(148);\r\nexports.Bound = {\r\n fromPoints(points) {\r\n let maxX = -Infinity, minX = Infinity, maxY = -Infinity, minY = Infinity;\r\n points.map(item => {\r\n if (item[0] > maxX)\r\n maxX = item[0];\r\n if (item[0] < minX)\r\n minX = item[0];\r\n if (item[1] > maxY)\r\n maxY = item[1];\r\n if (item[1] < minY)\r\n minY = item[1];\r\n });\r\n return {\r\n x: minX,\r\n y: minY,\r\n width: maxX - minX,\r\n height: maxY - minY\r\n };\r\n },\r\n toPoints(bound) {\r\n return [\r\n [bound.x, bound.y],\r\n [bound.x + bound.width, bound.y],\r\n [bound.x + bound.width, bound.y + bound.height],\r\n [bound.x, bound.y + bound.height]\r\n ];\r\n },\r\n union(...arg) {\r\n return arg.length > 1 ?\r\n arg.reduce((total, cur) => {\r\n let minX = total.x < cur.x ? total.x : cur.x, maxX = total.x + total.width < cur.x + cur.width ? cur.x + cur.width : total.x + total.width, minY = total.y < cur.y ? total.y : cur.y, maxY = total.y + total.height < cur.y + cur.height ? cur.y + cur.height : total.y + total.height;\r\n return {\r\n x: minX,\r\n y: minY,\r\n width: maxX - minX,\r\n height: maxY - minY\r\n };\r\n }) : arg[0];\r\n },\r\n intersect(b1, b2) {\r\n let x, y, maxX, maxY, overlapsX, overlapsY;\r\n if (b1.x < b2.x + b2.width && b1.x + b1.width > b2.x) {\r\n x = b1.x < b2.x ? b2.x : b1.x;\r\n maxX = b1.x + b1.width;\r\n overlapsX = maxX - x;\r\n }\r\n if (b1.y < b2.y + b2.height && b1.y + b1.height > b2.y) {\r\n y = b1.y < b2.y ? b2.y : b1.y;\r\n maxY = b1.y + b1.height < b2.y + b2.height ? b1.y + b1.height : b2.y + b2.height;\r\n overlapsY = maxY - y;\r\n }\r\n if (!overlapsX || !overlapsY)\r\n return null;\r\n return {\r\n x,\r\n y,\r\n width: overlapsX,\r\n height: overlapsY\r\n };\r\n },\r\n translate(bound, dx, dy) {\r\n bound.x += dx;\r\n bound.y += dy;\r\n },\r\n rotation(bound, rot) {\r\n let cx = bound.x + bound.width / 2, cy = bound.y + bound.height / 2;\r\n return exports.Bound.fromPoints(exports.Bound.toPoints(bound).map(item => vector_1.Vector.rotation(rot, item, [cx, cy])));\r\n },\r\n isOverlap(b1, b2) {\r\n let maxX1 = b1.x + b1.width, maxY1 = b1.y + b1.height, maxX2 = b2.x + b2.width, maxY2 = b2.y + b2.height;\r\n if (b1.x < maxX2 && b2.x < maxX1 && b1.y < maxY2 && b2.y < maxY1) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n};\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvQ29tbW9uL2JvdW5kaW5nUmVjdC50cz80OGVhIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDBDQUFrQztBQWNyQixhQUFLLEdBQUc7SUFNakIsVUFBVSxDQUFDLE1BQStCO1FBQ3RDLElBQUksSUFBSSxHQUFHLENBQUMsUUFBUSxFQUNoQixJQUFJLEdBQUcsUUFBUSxFQUNmLElBQUksR0FBRyxDQUFDLFFBQVEsRUFDaEIsSUFBSSxHQUFHLFFBQVEsQ0FBQztRQUVwQixNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ2QsSUFBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSTtnQkFBRSxJQUFJLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2xDLElBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUk7Z0JBQUUsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNsQyxJQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJO2dCQUFFLElBQUksR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbEMsSUFBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSTtnQkFBRSxJQUFJLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RDLENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTztZQUNILENBQUMsRUFBRSxJQUFJO1lBQ1AsQ0FBQyxFQUFFLElBQUk7WUFDUCxLQUFLLEVBQUUsSUFBSSxHQUFHLElBQUk7WUFDbEIsTUFBTSxFQUFFLElBQUksR0FBRyxJQUFJO1NBQ3RCLENBQUM7SUFDTixDQUFDO0lBTUQsUUFBUSxDQUFDLEtBQW1CO1FBQ3hCLE9BQU87WUFDSCxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUNsQixDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ2hDLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztZQUMvQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO1NBQ3BDLENBQUM7SUFDTixDQUFDO0lBTUQsS0FBSyxDQUFDLEdBQUcsR0FBbUI7UUFDeEIsT0FBTyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBQztZQUNsQixHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFO2dCQUMxQixJQUFJLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFDdEMsSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxLQUFLLEVBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxLQUFLLEVBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLEVBQzFGLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFDdEMsSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFN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Q0FBQyxLQUFLLEVBQ3ZCLEtBQUssR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLEVBQ3hCLEtBQUssR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLEVBQ3ZCLEtBQUssR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUM7UUFFN0IsSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLEtBQUssRUFBRTtZQUM5RCxPQUFPLElBQUksQ0FBQztTQUNmO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztDQUNKLENBQUMiLCJmaWxlIjoiMTQ3LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVmVjdG9yIH0gZnJvbSBcIi4vdmVjdG9yXCI7XHJcblxyXG5cclxuXHJcbi8vIOWMheWbtOebkuexu+Wei1xyXG5leHBvcnQgdHlwZSBCb3VuZGluZ1JlY3QgPSB7XHJcbiAgICB4OiBudW1iZXI7XHJcbiAgICB5OiBudW1iZXI7XHJcbiAgICB3aWR0aDogbnVtYmVyO1xyXG4gICAgaGVpZ2h0OiBudW1iZXI7XHJcbn07XHJcblxyXG5cclxuLy8g5YyF5Zu055uS5pON5L2cXHJcbmV4cG9ydCBjb25zdCBCb3VuZCA9IHtcclxuXHJcbiAgICAvKipcclxuICAgICAqIOS7jueCuembhueUn+aIkOWMheWbtOebklxyXG4gICAgICogQHBhcmFtIHBvaW50cyBcclxuICAgICAqL1xyXG4gICAgZnJvbVBvaW50cyhwb2ludHM6IEFycmF5PFtudW1iZXIsIG51bWJlcl0+KTogQm91bmRpbmdSZWN0IHtcclxuICAgICAgICBsZXQgbWF4WCA9IC1JbmZpbml0eSxcclxuICAgICAgICAgICAgbWluWCA9IEluZmluaXR5LFxyXG4gICAgICAgICAgICBtYXhZID0gLUluZmluaXR5LFxyXG4gICAgICAgICAgICBtaW5ZID0gSW5maW5pdHk7XHJcblxyXG4gICAgICAgIHBvaW50cy5tYXAoaXRlbSA9PiB7XHJcbiAgICAgICAgICAgIGlmKGl0ZW1bMF0gPiBtYXhYKSBtYXhYID0gaXRlbVswXTtcclxuICAgICAgICAgICAgaWYoaXRlbVswXSA8IG1pblgpIG1pblggPSBpdGVtWzBdO1xyXG4gICAgICAgICAgICBpZihpdGVtWzFdID4gbWF4WSkgbWF4WSA9IGl0ZW1bMV07XHJcbiAgICAgICAgICAgIGlmKGl0ZW1bMV0gPCBtaW5ZKSBtaW5ZID0gaXRlbVsxXTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgeDogbWluWCxcclxuICAgICAgICAgICAgeTogbWluWSxcclxuICAgICAgICAgICAgd2lkdGg6IG1heFggLSBtaW5YLFxyXG4gICAgICAgICAgICBoZWlnaHQ6IG1heFkgLSBtaW5ZXHJcbiAgICAgICAgfTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDnlLHljIXlm7Tnm5LovazljJbkuLrlm5vkuKrpobbngrnvvIjpobrml7bpkojvvIlcclxuICAgICAqIEBwYXJhbSBib3VuZCBcclxuICAgICAqL1xyXG4gICAgdG9Qb2ludHMoYm91bmQ6IEJvdW5kaW5nUmVjdCk6IEFycmF5PFtudW1iZXIsIG51bWJlcl0+IHtcclxuICAgICAgICByZXR1cm4gW1xyXG4gICAgICAgICAgICBbYm91bmQueCwgYm91bmQueV0sXHJcbiAgICAgICAgICAgIFtib3VuZC54ICsgYm91bmQud2lkdGgsIGJvdW5kLnldLFxyXG4gICAgICAgICAgICBbYm91bmQueCArIGJvdW5kLndpZHRoLCBib3VuZC55ICsgYm91bmQuaGVpZ2h0XSxcclxuICAgICAgICAgICAgW2JvdW5kLngsIGJvdW5kLnkgKyBib3VuZC5oZWlnaHRdXHJcbiAgICAgICAgXTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmsYLljIXlm7Tnm5Llubbpm4ZcclxuICAgICAqIEBwYXJhbSBhcmcgXHJcbiAgICAgKi9cclxuICAgIHVuaW9uKC4uLmFyZzogQm91bmRpbmdSZWN0W10pOiBCb3VuZGluZ1JlY3Qge1xyXG4gICAgICAgIHJldHVybiBhcmcubGVuZ3RoID4gMT8gXHJcbiAgICAgICAgICAgIGFyZy5yZWR1Y2UoKHRvdGFsLCBjdXIpID0+IHtcclxuICAgICAgICAgICAgbGV0IG1pblggPSB0b3RhbC54IDwgY3VyLng/IHRvdGFsLng6IGN1ci54LFxyXG4gICAgICAgICAgICAgICAgbWF4WCA9IHRvdGFsLnggKyB0b3RhbC53aWR0aCA8IGN1ci54ICsgY3VyLndpZHRoPyBjdXIueCArIGN1ci53aWR0aDogdG90YWwueCArIHRvdGFsLndpZHRoLFxyXG4gICAgICAgICAgICAgICAgbWluWSA9IHRvdGFsLnkgPCBjdXIueT8gdG90YWwueTogY3VyLnksXHJcbiAgICAgICAgICAgICAgICBtYXhZID0gdG90YWwueSArIHRvdGFsLmhlaWdodCA8IGN1ci55ICsgY3VyLmhlaWdodD8gY3VyLnkgKyBjdXIuaGVpZ2h0OiB0b3RhbC55ICsgdG90YWwuaGVpZ2h0O1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHg6IG1pblgsXHJcbiAgICAgICAgICAgICAgICB5OiBtaW5ZLFxyXG4gICAgICAgICAgICAgICAgd2lkdGg6IG1heFggLSBtaW5YLFxyXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiBtYXhZIC0gbWluWVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH0pOiBhcmdbMF07XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5YyF5Zu055uS5rGC5Lqk6ZuGXHJcbiAgICAgKiBAcGFyYW0gYjEgXHJcbiAgICAgKiBAcGFyYW0gYjIgXHJcbiAgICAgKi9cclxuICAgIGludGVyc2VjdChiMTogQm91bmRpbmdSZWN0LCBiMjogQm91bmRpbmdSZWN0KTogQm91bmRpbmdSZWN0IHtcclxuICAgICAgICBsZXQgeCwgeSwgXHJcbiAgICAgICAgICAgIG1heFgsIG1heFksXHJcbiAgICAgICAgICAgIG92ZXJsYXBzWCxcclxuICAgICAgICAgICAgb3ZlcmxhcHNZO1xyXG5cclxuICAgICAgICBpZihiMS54IDwgYjIueCArIGIyLndpZHRoICYmIGIxLnggKyBiMS53aWR0aCA+IGIyLngpIHtcclxuICAgICAgICAgICAgeCA9IGIxLnggPCBiMi54PyBiMi54OiBiMS54O1xyXG4gICAgICAgICAgICAvLyBtYXhYID0gYjEueCArIGIxLndpZHRoIDwgYjIueCArIGIyLndpZHRoPyBiMS54ICsgYjEud2lkdGg6IGIyLnggKyBiMi53aWR0aDtcclxuICAgICAgICAgICAgbWF4WCA9IGIxLnggKyBiMS53aWR0aDtcclxuICAgICAgICAgICAgb3ZlcmxhcHNYID0gbWF4WCAtIHg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIGlmKGIxLnkgPCBiMi55ICsgYjIuaGVpZ2h0ICYmIGIxLnkgKyBiMS5oZWlnaHQgPiBiMi55KSB7XHJcbiAgICAgICAgICAgIHkgPSBiMS55IDwgYjIueT8gYjIueTogYjEueTtcclxuICAgICAgICAgICAgbWF4WSA9IGIxLnkgKyBiMS5oZWlnaHQgPCBiMi55ICsgYjIuaGVpZ2h0PyBiMS55ICsgYjEuaGVpZ2h0OiBiMi55ICsgYjIuaGVpZ2h0O1xyXG4gICAgICAgICAgICBvdmVybGFwc1kgPSBtYXhZIC0geTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmKCFvdmVybGFwc1ggfHwgIW92ZXJsYXBzWSkgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHgsXHJcbiAgICAgICAgICAgIHksXHJcbiAgICAgICAgICAgIHdpZHRoOiBvdmVybGFwc1gsXHJcbiAgICAgICAgICAgIGhlaWdodDogb3ZlcmxhcHNZXHJcbiAgICAgICAgfTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDkvY3np7vljIXlm7Tnm5JcclxuICAgICAqIEBwYXJhbSBib3VuZFxyXG4gICAgICogQHBhcmFtIGR4IFxyXG4gICAgICogQHBhcmFtIGR5IFxyXG4gICAgICovXHJcbiAgICB0cmFuc2xhdGUoYm91bmQ6IEJvdW5kaW5nUmVjdCwgZHg6IG51bWJlciwgZHk6IG51bWJlcikge1xyXG4gICAgICAgIGJvdW5kLnggKz0gZHg7XHJcbiAgICAgICAgYm91bmQueSArPSBkeTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmsYLljIXlm7Tnm5Lml4vovazlkI7mlrDlvaLmiJDnmoTljIXlm7Tnm5JcclxuICAgICAqIEBwYXJhbSBib3VuZCBcclxuICAgICAqIEBwYXJhbSByb3RcclxuICAgICAqL1xyXG4gICAgcm90YXRpb24oYm91bmQ6IEJvdW5kaW5nUmVjdCwgcm90OiBudW1iZXIpOiBCb3VuZGluZ1JlY3Qge1xyXG4gICAgICAgIGxldCBjeCA9IGJvdW5kLnggKyBib3VuZC53aWR0aCAvIDIsXHJcbiAgICAgICAgICAgIGN5ID0gYm91bmQueSArIGJvdW5kLmhlaWdodCAvIDI7XHJcblxyXG4gICAgICAgIHJldHVybiBCb3VuZC5mcm9tUG9pbnRzKEJvdW5kLnRvUG9pbnRzKGJvdW5kKS5tYXAoaXRlbSA9PiBWZWN0b3Iucm90YXRpb24ocm90LCBpdGVtLCBbY3gsIGN5XSkpKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDliKTmlq3kuKTkuKrljIXlm7Tnm5LmmK/lkKbnm7jkuqRcclxuICAgICAqIEBwYXJhbSBiMSBcclxuICAgICAqIEBwYXJhbSBiMiBcclxuICAgICAqL1xyXG4gICAgaXNPdmVybGFwKGIxOiBCb3VuZGluZ1JlY3QsIGIyOiBCb3VuZGluZ1JlY3QpOiBib29sZWFuIHtcclxuICAgICAgICBsZXQgbWF4WDEgPSBiMS54ICsgYjEud2lkdGgsXHJcbiAgICAgICAgICAgIG1heFkxID0gYjEueSArIGIxLmhlaWdodCxcclxuICAgICAgICAgICAgbWF4WDIgPSBiMi54ICsgYjIud2lkdGgsXHJcbiAgICAgICAgICAgIG1heFkyID0gYjIueSArIGIyLmhlaWdodDtcclxuXHJcbiAgICAgICAgaWYgKGIxLnggPCBtYXhYMiAmJiBiMi54IDwgbWF4WDEgJiYgYjEueSA8IG1heFkyICYmIGIyLnkgPCBtYXhZMSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG59O1xyXG5cclxuXHJcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///147\n')},function(module,exports,__webpack_require__){"use strict";eval('\r\nObject.defineProperty(exports, "__esModule", { value: true });\r\nexports.Vector = void 0;\r\nexports.Vector = {\r\n add(v1, v2) {\r\n return [v1[0] + v2[0], v1[1] + v2[1]];\r\n },\r\n subtract(v1, v2) {\r\n return [v1[0] - v2[0], v1[1] - v2[1]];\r\n },\r\n dot(v1, v2) {\r\n return v1[0] * v2[0] + v1[1] * v2[1];\r\n },\r\n scale(v, n) {\r\n return [v[0] * n, v[1] * n];\r\n },\r\n length(v) {\r\n return Math.sqrt(Math.pow(v[0], 2) + Math.pow(v[1], 2));\r\n },\r\n rotation(radian, point, center = [0, 0]) {\r\n if (radian === 0)\r\n return point;\r\n radian = -radian;\r\n let cos = Math.cos(radian), sin = Math.sin(radian), dv = [point[0] - center[0], point[1] - center[1]], v = [0, 0];\r\n v[0] = center[0] + (dv[0] * cos - dv[1] * sin);\r\n v[1] = center[1] + (dv[0] * sin + dv[1] * cos);\r\n return v;\r\n },\r\n tangent(v) {\r\n return [-v[1], v[0]];\r\n },\r\n normalize(v) {\r\n let len = exports.Vector.length(v);\r\n if (len === 0) {\r\n return [0, 0];\r\n }\r\n else if (len === 1) {\r\n return v;\r\n }\r\n else {\r\n return [v[0] / len, v[1] / len];\r\n }\r\n },\r\n location(v, direction, len) {\r\n return exports.Vector.add(v, exports.Vector.scale(exports.Vector.normalize(direction), len));\r\n },\r\n negative(v) {\r\n return exports.Vector.scale(v, -1);\r\n }\r\n};\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvQ29tbW9uL3ZlY3Rvci50cz82ODkxIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUdhLGNBQU0sR0FBRztJQU9sQixHQUFHLENBQUMsRUFBb0IsRUFBRSxFQUFvQjtRQUMxQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQU9ELFFBQVEsQ0FBQyxFQUFvQixFQUFFLEVBQW9CO1FBQy9DLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBT0QsR0FBRyxDQUFDLEVBQW9CLEVBQUUsRUFBb0I7UUFDMUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDekMsQ0FBQztJQU9ELEtBQUssQ0FBQyxDQUFtQixFQUFFLENBQVM7UUFDaEMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFNRCxNQUFNLENBQUMsQ0FBbUI7UUFDdEIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUcsVUFBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBQyxDQUFDO0lBQ3hDLENBQUM7SUFRRCxRQUFRLENBQUMsTUFBYyxFQUFFLEtBQXVCLEVBQUUsU0FBMkIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQy9FLElBQUcsTUFBTSxLQUFLLENBQUM7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUU5QixNQUFNLEdBQUcsQ0FBQyxNQUFNLENBQUM7UUFFakIsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFDdEIsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQ3RCLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUNqRCxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFWCxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDL0MsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBRW5ELE9BQU8sQ0FBcUIsQ0FBQztJQUNqQyxDQUFDO0lBS0QsT0FBTyxDQUFDLENBQW1CO1FBQ3ZCLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN6QixDQUFDO0lBS0QsU0FBUyxDQUFDLENBQW1CO1FBQ3pCLElBQUksR0FBRyxHQUFHLGNBQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFM0IsSUFBRyxHQUFHLEtBQUssQ0FBQyxFQUFFO1lBQ1YsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztTQUNqQjthQUNJLElBQUcsR0FBRyxLQUFLLENBQUMsRUFBRTtZQUNmLE9BQU8sQ0FBQyxDQUFDO1NBQ1o7YUFDSTtZQUNELE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztTQUNuQztJQUNMLENBQUM7SUFRRCxRQUFRLENBQUMsQ0FBbUIsRUFBRSxTQUEyQixFQUFFLEdBQVc7UUFDbEUsT0FBTyxjQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxjQUFNLENBQUMsS0FBSyxDQUFDLGNBQU0sQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUN6RSxDQUFDO0lBS0QsUUFBUSxDQUFDLENBQW1CO1FBQ3hCLE9BQU8sY0FBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvQixDQUFDO0NBQ0osQ0FBQyIsImZpbGUiOiIxNDguanMiLCJzb3VyY2VzQ29udGVudCI6WyJcclxuXHJcblxyXG5leHBvcnQgY29uc3QgVmVjdG9yID0ge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICog5ZCR6YeP55u45YqgXHJcbiAgICAgKiBAcGFyYW0gdjEgXHJcbiAgICAgKiBAcGFyYW0gdjIgXHJcbiAgICAgKi9cclxuICAgIGFkZCh2MTogW251bWJlciwgbnVtYmVyXSwgdjI6IFtudW1iZXIsIG51bWJlcl0pOiBbbnVtYmVyLCBudW1iZXJdIHtcclxuICAgICAgICByZXR1cm4gW3YxWzBdICsgdjJbMF0sIHYxWzFdICsgdjJbMV1dO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIOWQkemHj+ebuOWHj1xyXG4gICAgICogQHBhcmFtIHYxIFxyXG4gICAgICogQHBhcmFtIHYyIFxyXG4gICAgICovXHJcbiAgICBzdWJ0cmFjdCh2MTogW251bWJlciwgbnVtYmVyXSwgdjI6IFtudW1iZXIsIG51bWJlcl0pOiBbbnVtYmVyLCBudW1iZXJdIHtcclxuICAgICAgICByZXR1cm4gW3YxWzBdIC0gdjJbMF0sIHYxWzFdIC0gdjJbMV1dO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIOWQkemHj+eCueenr1xyXG4gICAgICogQHBhcmFtIHYxIFxyXG4gICAgICogQHBhcmFtIHYyIFxyXG4gICAgICovXHJcbiAgICBkb3QodjE6IFtudW1iZXIsIG51bWJlcl0sIHYyOiBbbnVtYmVyLCBudW1iZXJdKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gdjFbMF0gKiB2MlswXSArIHYxWzFdICogdjJbMV07XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5ZCR6YeP57yp5pS+XHJcbiAgICAgKiBAcGFyYW0gdiBcclxuICAgICAqIEBwYXJhbSBuIFxyXG4gICAgICovXHJcbiAgICBzY2FsZSh2OiBbbnVtYmVyLCBudW1iZXJdLCBuOiBudW1iZXIpOiBbbnVtYmVyLCBudW1iZXJdIHtcclxuICAgICAgICByZXR1cm4gW3ZbMF0gKiBuLCB2WzFdICogbl07XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5ZCR6YeP5rGC5qih6ZW/XHJcbiAgICAgKiBAcGFyYW0gdiBcclxuICAgICAqL1xyXG4gICAgbGVuZ3RoKHY6IFtudW1iZXIsIG51bWJlcl0pOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiBNYXRoLnNxcnQodlswXSoqMiArIHZbMV0qKjIpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIOe7leafkOeCueaXi+i9rOWQkemHj1xyXG4gICAgICogQHBhcmFtIHJhZGlhbiDop5LluqbvvIjlvKfluqbliLbvvIlcclxuICAgICAqIEBwYXJhbSBwb2ludCDml4vovaznmoTngrlcclxuICAgICAqIEBwYXJhbSBjZW50ZXIg57uV55qE54K5XHJcbiAgICAgKi9cclxuICAgIHJvdGF0aW9uKHJhZGlhbjogbnVtYmVyLCBwb2ludDogW251bWJlciwgbnVtYmVyXSwgY2VudGVyOiBbbnVtYmVyLCBudW1iZXJdID0gWzAsIDBdKTogW251bWJlciwgbnVtYmVyXSB7XHJcbiAgICAgICAgaWYocmFkaWFuID09PSAwKSByZXR1cm4gcG9pbnQ7XHJcblxyXG4gICAgICAgIHJhZGlhbiA9IC1yYWRpYW47XHJcblxyXG4gICAgICAgIGxldCBjb3MgPSBNYXRoLmNvcyhyYWRpYW4pLFxyXG4gICAgICAgICAgICBzaW4gPSBNYXRoLnNpbihyYWRpYW4pLFxyXG4gICAgICAgICAgICBkdiA9IFtwb2ludFswXSAtIGNlbnRlclswXSwgcG9pbnRbMV0gLSBjZW50ZXJbMV1dLFxyXG4gICAgICAgICAgICB2ID0gWzAsIDBdO1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIHZbMF0gPSBjZW50ZXJbMF0gKyAoZHZbMF0gKiBjb3MgLSBkdlsxXSAqIHNpbik7XHJcbiAgICAgICAgICAgIHZbMV0gPSBjZW50ZXJbMV0gKyAoZHZbMF0gKiBzaW4gKyBkdlsxXSAqIGNvcyk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgcmV0dXJuIHYgYXMgW251bWJlciwgbnVtYmVyXTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmsYLlkJHph4/ms5XlkJFcclxuICAgICAqL1xyXG4gICAgdGFuZ2VudCh2OiBbbnVtYmVyLCBudW1iZXJdKTogW251bWJlciwgbnVtYmVyXSB7XHJcbiAgICAgICAgcmV0dXJuIFstdlsxXSwgdlswXV07XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5ZCR6YeP5Y2V5L2N5YyWXHJcbiAgICAgKi9cclxuICAgIG5vcm1hbGl6ZSh2OiBbbnVtYmVyLCBudW1iZXJdKTogW251bWJlciwgbnVtYmVyXSB7XHJcbiAgICAgICAgbGV0IGxlbiA9IFZlY3Rvci5sZW5ndGgodik7XHJcblxyXG4gICAgICAgIGlmKGxlbiA9PT0gMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gWzAsIDBdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmKGxlbiA9PT0gMSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBbdlswXSAvIGxlbiwgdlsxXSAvIGxlbl07XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIOaxguS4gOS4quWQkemHj++8iOeCue+8ieaMieeFp2RpcmVjdGlvbuaWueWQke+8jOW7tumVv2xlbumVv+W6puWQjueahOWdkOagh1xyXG4gICAgICogQHBhcmFtIHZcclxuICAgICAqIEBwYXJhbSBkaXJlY3Rpb25cclxuICAgICAqIEBwYXJhbSBsZW4gXHJcbiAgICAgKi9cclxuICAgIGxvY2F0aW9uKHY6IFtudW1iZXIsIG51bWJlcl0sIGRpcmVjdGlvbjogW251bWJlciwgbnVtYmVyXSwgbGVuOiBudW1iZXIpOiBbbnVtYmVyLCBudW1iZXJdIHtcclxuICAgICAgICByZXR1cm4gVmVjdG9yLmFkZCh2LCBWZWN0b3Iuc2NhbGUoVmVjdG9yLm5vcm1hbGl6ZShkaXJlY3Rpb24pLCBsZW4pKTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDlkJHph4/lj5blj41cclxuICAgICAqL1xyXG4gICAgbmVnYXRpdmUodjogW251bWJlciwgbnVtYmVyXSk6IFtudW1iZXIsIG51bWJlcl0ge1xyXG4gICAgICAgIHJldHVybiBWZWN0b3Iuc2NhbGUodiwgLTEpO1xyXG4gICAgfVxyXG59O1xyXG5cclxuXHJcblxyXG5cclxuXHJcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///148\n')},function(module,exports,__webpack_require__){"use strict";eval("\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.Group = void 0;\r\nconst util_1 = __webpack_require__(53);\r\nconst boundingRect_1 = __webpack_require__(147);\r\nconst matrix_util_1 = __webpack_require__(14);\r\nclass Group {\r\n constructor(...arg) {\r\n this.models = [];\r\n this.id = util_1.Util.generateId();\r\n if (arg) {\r\n this.add(...arg);\r\n }\r\n }\r\n add(...arg) {\r\n arg.map(ele => {\r\n this.models.push(ele);\r\n });\r\n }\r\n remove(model) {\r\n util_1.Util.removeFromList(this.models, item => item.id === model.id);\r\n }\r\n getBound() {\r\n return this.models.length ?\r\n boundingRect_1.Bound.union(...this.models.map(item => item.getBound())) :\r\n { x: 0, y: 0, width: 0, height: 0 };\r\n }\r\n getPaddingBound(padding = 0) {\r\n const bound = this.getBound();\r\n bound.x -= padding;\r\n bound.y -= padding;\r\n bound.width += padding * 2;\r\n bound.height += padding * 2;\r\n return bound;\r\n }\r\n getModels() {\r\n return this.models;\r\n }\r\n translate(dx, dy) {\r\n this.models.map(item => {\r\n if (item instanceof Group) {\r\n item.translate(dx, dy);\r\n }\r\n else {\r\n item.set('x', item.get('x') + dx);\r\n item.set('y', item.get('y') + dy);\r\n }\r\n });\r\n }\r\n scale(center, ratio) {\r\n this.models.map(item => {\r\n if (item instanceof Group) {\r\n item.scale(center, ratio);\r\n }\r\n else {\r\n const matrix = matrix_util_1.ext.transform(item.getMatrix(), [\r\n ['t', -center[0], -center[1]],\r\n ['s', ratio, ratio],\r\n ['t', center[0], center[1]],\r\n ]);\r\n item.setMatrix(matrix);\r\n }\r\n });\r\n }\r\n clear() {\r\n this.models.length = 0;\r\n }\r\n}\r\nexports.Group = Group;\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvQ29tbW9uL2dyb3VwLnRzPzliZjMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsdUNBQThCO0FBQzlCLGdEQUFxRDtBQUVyRCw4Q0FBd0M7QUFPeEMsTUFBYSxLQUFLO0lBSWQsWUFBWSxHQUFHLEdBQTJCO1FBRmxDLFdBQU0sR0FBMkIsRUFBRSxDQUFDO1FBR3hDLElBQUksQ0FBQyxFQUFFLEdBQUcsV0FBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBRTVCLElBQUksR0FBRyxFQUFFO1lBQ0wsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDO1NBQ3BCO0lBQ0wsQ0FBQztJQU1ELEdBQUcsQ0FBQyxHQUFHLEdBQTJCO1FBQzlCLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDVixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMxQixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFNRCxNQUFNLENBQUMsS0FBc0I7UUFDekIsV0FBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDbkUsQ0FBQztJQUtELFFBQVE7UUFDSixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDdkIsb0JBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMxRCxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM1QyxDQUFDO0lBT0QsZUFBZSxDQUFDLFVBQWtCLENBQUM7UUFDL0IsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBRTlCLEtBQUssQ0FBQyxDQUFDLElBQUksT0FBTyxDQUFDO1FBQ25CLEtBQUssQ0FBQyxDQUFDLElBQUksT0FBTyxDQUFDO1FBQ25CLEtBQUssQ0FBQyxLQUFLLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQztRQUMzQixLQUFLLENBQUMsTUFBTSxJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUM7UUFFNUIsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUVELFNBQVM7UUFDTCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDdkIsQ0FBQztJQU9ELFNBQVMsQ0FBQyxFQUFVLEVBQUUsRUFBVTtRQUM1QixJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNuQixJQUFJLElBQUksWUFBWSxLQUFLLEVBQUU7Z0JBQ3ZCLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO2FBQzFCO2lCQUNJO2dCQUNELElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7Z0JBQ2xDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7YUFDckM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFPRCxLQUFLLENBQUMsTUFBd0IsRUFBRSxLQUFhO1FBQ3pDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ25CLElBQUksSUFBSSxZQUFZLEtBQUssRUFBRTtnQkFDdkIsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7YUFDN0I7aUJBQ0k7Z0JBQ0QsTUFBTSxNQUFNLEdBQUcsaUJBQUcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFO29CQUMzQyxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDN0IsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQztvQkFDbkIsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDOUIsQ0FBQyxDQUFDO2dCQUNILElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7YUFDMUI7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFLRCxLQUFLO1FBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQzNCLENBQUM7Q0FDSjtBQXZHRCxzQkF1R0MiLCJmaWxlIjoiMTQ5LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVXRpbCB9IGZyb20gXCIuL3V0aWxcIjtcclxuaW1wb3J0IHsgQm91bmRpbmdSZWN0LCBCb3VuZCB9IGZyb20gXCIuL2JvdW5kaW5nUmVjdFwiO1xyXG5pbXBvcnQgeyBTVk1vZGVsIH0gZnJvbSBcIi4uL01vZGVsL1NWTW9kZWxcIjtcclxuaW1wb3J0IHsgZXh0IH0gZnJvbSAnQGFudHYvbWF0cml4LXV0aWwnO1xyXG5cclxuXHJcblxyXG4vKipcclxuICogbW9kZWwg6ZuG5ZCI57uEXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgR3JvdXAge1xyXG4gICAgaWQ6IHN0cmluZztcclxuICAgIHByaXZhdGUgbW9kZWxzOiBBcnJheTxTVk1vZGVsIHwgR3JvdXA+ID0gW107XHJcblxyXG4gICAgY29uc3RydWN0b3IoLi4uYXJnOiBBcnJheTxTVk1vZGVsIHwgR3JvdXA+KSB7XHJcbiAgICAgICAgdGhpcy5pZCA9IFV0aWwuZ2VuZXJhdGVJZCgpO1xyXG5cclxuICAgICAgICBpZiAoYXJnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYWRkKC4uLmFyZyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5re75YqgZWxlbWVudFxyXG4gICAgICogQHBhcmFtIGFyZyBcclxuICAgICAqL1xyXG4gICAgYWRkKC4uLmFyZzogQXJyYXk8U1ZNb2RlbCB8IEdyb3VwPikge1xyXG4gICAgICAgIGFyZy5tYXAoZWxlID0+IHtcclxuICAgICAgICAgICAgdGhpcy5tb2RlbHMucHVzaChlbGUpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog56e76ZmkIG1vZGVsXHJcbiAgICAgKiBAcGFyYW0gZWxlbWVudCBcclxuICAgICAqL1xyXG4gICAgcmVtb3ZlKG1vZGVsOiBTVk1vZGVsIHwgR3JvdXApIHtcclxuICAgICAgICBVdGlsLnJlbW92ZUZyb21MaXN0KHRoaXMubW9kZWxzLCBpdGVtID0+IGl0ZW0uaWQgPT09IG1vZGVsLmlkKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOiOt+WPlmdyb3Vw55qE5YyF5Zu055uSXHJcbiAgICAgKi9cclxuICAgIGdldEJvdW5kKCk6IEJvdW5kaW5nUmVjdCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubW9kZWxzLmxlbmd0aCA/XHJcbiAgICAgICAgICAgIEJvdW5kLnVuaW9uKC4uLnRoaXMubW9kZWxzLm1hcChpdGVtID0+IGl0ZW0uZ2V0Qm91bmQoKSkpIDpcclxuICAgICAgICAgICAgeyB4OiAwLCB5OiAwLCB3aWR0aDogMCwgaGVpZ2h0OiAwIH07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDojrflj5blhbfmnInkuIDlrprlhoXovrnot53nmoTljIXlm7Tnm5JcclxuICAgICAqIEBwYXJhbSBwYWRkaW5nIFxyXG4gICAgICogQHJldHVybnMgXHJcbiAgICAgKi9cclxuICAgIGdldFBhZGRpbmdCb3VuZChwYWRkaW5nOiBudW1iZXIgPSAwKTogQm91bmRpbmdSZWN0IHtcclxuICAgICAgICBjb25zdCBib3VuZCA9IHRoaXMuZ2V0Qm91bmQoKTtcclxuXHJcbiAgICAgICAgYm91bmQueCAtPSBwYWRkaW5nO1xyXG4gICAgICAgIGJvdW5kLnkgLT0gcGFkZGluZztcclxuICAgICAgICBib3VuZC53aWR0aCArPSBwYWRkaW5nICogMjtcclxuICAgICAgICBib3VuZC5oZWlnaHQgKz0gcGFkZGluZyAqIDI7XHJcblxyXG4gICAgICAgIHJldHVybiBib3VuZDtcclxuICAgIH1cclxuXHJcbiAgICBnZXRNb2RlbHMoKTogQXJyYXk8U1ZNb2RlbCB8IEdyb3VwPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubW9kZWxzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5L2N56e7Z3JvdXBcclxuICAgICAqIEBwYXJhbSBkeCBcclxuICAgICAqIEBwYXJhbSBkeSBcclxuICAgICAqL1xyXG4gICAgdHJhbnNsYXRlKGR4OiBudW1iZXIsIGR5OiBudW1iZXIpIHtcclxuICAgICAgICB0aGlzLm1vZGVscy5tYXAoaXRlbSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChpdGVtIGluc3RhbmNlb2YgR3JvdXApIHtcclxuICAgICAgICAgICAgICAgIGl0ZW0udHJhbnNsYXRlKGR4LCBkeSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpdGVtLnNldCgneCcsIGl0ZW0uZ2V0KCd4JykgKyBkeCk7XHJcbiAgICAgICAgICAgICAgICBpdGVtLnNldCgneScsIGl0ZW0uZ2V0KCd5JykgKyBkeSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOe8qeaUvmdyb3VwXHJcbiAgICAgKiBAcGFyYW0gY2VudGVyXHJcbiAgICAgKiBAcGFyYW0gcmF0aW8gXHJcbiAgICAgKi9cclxuICAgIHNjYWxlKGNlbnRlcjogW251bWJlciwgbnVtYmVyXSwgcmF0aW86IG51bWJlcikge1xyXG4gICAgICAgIHRoaXMubW9kZWxzLm1hcChpdGVtID0+IHtcclxuICAgICAgICAgICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBHcm91cCkge1xyXG4gICAgICAgICAgICAgICAgaXRlbS5zY2FsZShjZW50ZXIsIHJhdGlvKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG1hdHJpeCA9IGV4dC50cmFuc2Zvcm0oaXRlbS5nZXRNYXRyaXgoKSwgW1xyXG4gICAgICAgICAgICAgICAgICAgIFsndCcsIC1jZW50ZXJbMF0sIC1jZW50ZXJbMV1dLFxyXG4gICAgICAgICAgICAgICAgICAgIFsncycsIHJhdGlvLCByYXRpb10sXHJcbiAgICAgICAgICAgICAgICAgICAgWyd0JywgY2VudGVyWzBdLCBjZW50ZXJbMV1dLFxyXG4gICAgICAgICAgICAgICAgXSk7XHJcbiAgICAgICAgICAgICAgICBpdGVtLnNldE1hdHJpeChtYXRyaXgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmuIXnqbpncm91cFxyXG4gICAgICovXHJcbiAgICBjbGVhcigpIHtcclxuICAgICAgICB0aGlzLm1vZGVscy5sZW5ndGggPSAwO1xyXG4gICAgfVxyXG59Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///149\n")},function(module,exports,__webpack_require__){"use strict";eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.MESSAGE = exports.ALGORITHM = void 0;\nvar ALGORITHM = {\n pageRank: 'pageRank',\n breadthFirstSearch: 'breadthFirstSearch',\n connectedComponent: 'connectedComponent',\n depthFirstSearch: 'depthFirstSearch',\n detectCycle: 'detectCycle',\n detectDirectedCycle: 'detectDirectedCycle',\n detectAllCycles: 'detectAllCycles',\n detectAllDirectedCycle: 'detectAllDirectedCycle',\n detectAllUndirectedCycle: 'detectAllUndirectedCycle',\n dijkstra: 'dijkstra',\n findAllPath: 'findAllPath',\n findShortestPath: 'findShortestPath',\n floydWarshall: 'floydWarshall',\n getAdjMatrix: 'getAdjMatrix',\n getDegree: 'getDegree',\n getInDegree: 'getInDegree',\n getNeighbors: 'getNeighbors',\n getOutDegree: 'getOutDegree',\n labelPropagation: 'labelPropagation',\n louvain: 'louvain',\n GADDI: 'GADDI',\n minimumSpanningTree: 'minimumSpanningTree',\n SUCCESS: 'SUCCESS',\n FAILURE: 'FAILURE'\n};\nexports.ALGORITHM = ALGORITHM;\nvar MESSAGE = {\n SUCCESS: 'SUCCESS',\n FAILURE: 'FAILURE'\n};\nexports.MESSAGE = MESSAGE;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvYWxnb3JpdGhtL2xpYi93b3JrZXJzL2NvbnN0YW50LmpzPzkwMjMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWI7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiMTUwLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLk1FU1NBR0UgPSBleHBvcnRzLkFMR09SSVRITSA9IHZvaWQgMDtcbnZhciBBTEdPUklUSE0gPSB7XG4gIHBhZ2VSYW5rOiAncGFnZVJhbmsnLFxuICBicmVhZHRoRmlyc3RTZWFyY2g6ICdicmVhZHRoRmlyc3RTZWFyY2gnLFxuICBjb25uZWN0ZWRDb21wb25lbnQ6ICdjb25uZWN0ZWRDb21wb25lbnQnLFxuICBkZXB0aEZpcnN0U2VhcmNoOiAnZGVwdGhGaXJzdFNlYXJjaCcsXG4gIGRldGVjdEN5Y2xlOiAnZGV0ZWN0Q3ljbGUnLFxuICBkZXRlY3REaXJlY3RlZEN5Y2xlOiAnZGV0ZWN0RGlyZWN0ZWRDeWNsZScsXG4gIGRldGVjdEFsbEN5Y2xlczogJ2RldGVjdEFsbEN5Y2xlcycsXG4gIGRldGVjdEFsbERpcmVjdGVkQ3ljbGU6ICdkZXRlY3RBbGxEaXJlY3RlZEN5Y2xlJyxcbiAgZGV0ZWN0QWxsVW5kaXJlY3RlZEN5Y2xlOiAnZGV0ZWN0QWxsVW5kaXJlY3RlZEN5Y2xlJyxcbiAgZGlqa3N0cmE6ICdkaWprc3RyYScsXG4gIGZpbmRBbGxQYXRoOiAnZmluZEFsbFBhdGgnLFxuICBmaW5kU2hvcnRlc3RQYXRoOiAnZmluZFNob3J0ZXN0UGF0aCcsXG4gIGZsb3lkV2Fyc2hhbGw6ICdmbG95ZFdhcnNoYWxsJyxcbiAgZ2V0QWRqTWF0cml4OiAnZ2V0QWRqTWF0cml4JyxcbiAgZ2V0RGVncmVlOiAnZ2V0RGVncmVlJyxcbiAgZ2V0SW5EZWdyZWU6ICdnZXRJbkRlZ3JlZScsXG4gIGdldE5laWdoYm9yczogJ2dldE5laWdoYm9ycycsXG4gIGdldE91dERlZ3JlZTogJ2dldE91dERlZ3JlZScsXG4gIGxhYmVsUHJvcGFnYXRpb246ICdsYWJlbFByb3BhZ2F0aW9uJyxcbiAgbG91dmFpbjogJ2xvdXZhaW4nLFxuICBHQURESTogJ0dBRERJJyxcbiAgbWluaW11bVNwYW5uaW5nVHJlZTogJ21pbmltdW1TcGFubmluZ1RyZWUnLFxuICBTVUNDRVNTOiAnU1VDQ0VTUycsXG4gIEZBSUxVUkU6ICdGQUlMVVJFJ1xufTtcbmV4cG9ydHMuQUxHT1JJVEhNID0gQUxHT1JJVEhNO1xudmFyIE1FU1NBR0UgPSB7XG4gIFNVQ0NFU1M6ICdTVUNDRVNTJyxcbiAgRkFJTFVSRTogJ0ZBSUxVUkUnXG59O1xuZXhwb3J0cy5NRVNTQUdFID0gTUVTU0FHRTsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///150\n")},function(module,exports,__webpack_require__){"use strict";eval('\n\nObject.defineProperty(exports, "__esModule", {\n value: true\n});\nexports.default = void 0;\n\nvar _tslib = __webpack_require__(1);\n\nvar _util = __webpack_require__(0);\n\nvar _util2 = __webpack_require__(45);\n\nvar minVertex = function minVertex(D, nodes, marks) {\n // 找出最小的点\n var minDis = Infinity;\n var minNode;\n\n for (var i = 0; i < nodes.length; i++) {\n var nodeId = nodes[i].id;\n\n if (!marks[nodeId] && D[nodeId] <= minDis) {\n minDis = D[nodeId];\n minNode = nodes[i];\n }\n }\n\n return minNode;\n};\n\nvar dijkstra = function dijkstra(graphData, source, directed, weightPropertyName) {\n var _a = graphData.nodes,\n nodes = _a === void 0 ? [] : _a,\n _b = graphData.edges,\n edges = _b === void 0 ? [] : _b;\n var nodeIds = [];\n var marks = {};\n var D = {};\n var prevs = {}; // key: 顶点, value: 顶点的前驱点数组(可能有多条等长的最短路径)\n\n nodes.forEach(function (node, i) {\n var id = node.id;\n nodeIds.push(id);\n D[id] = Infinity;\n if (id === source) D[id] = 0;\n });\n var nodeNum = nodes.length;\n\n var _loop_1 = function _loop_1(i) {\n // Process the vertices\n var minNode = minVertex(D, nodes, marks);\n var minNodeId = minNode.id;\n marks[minNodeId] = true;\n if (D[minNodeId] === Infinity) return "continue"; // Unreachable vertices cannot be the intermediate point\n\n var relatedEdges = [];\n if (directed) relatedEdges = (0, _util2.getOutEdgesNodeId)(minNodeId, edges);else relatedEdges = (0, _util2.getEdgesByNodeId)(minNodeId, edges);\n relatedEdges.forEach(function (edge) {\n var edgeTarget = edge.target;\n var edgeSource = edge.source;\n var w = edgeTarget === minNodeId ? edgeSource : edgeTarget;\n var weight = weightPropertyName && edge[weightPropertyName] ? edge[weightPropertyName] : 1;\n\n if (D[w] > D[minNode.id] + weight) {\n D[w] = D[minNode.id] + weight;\n prevs[w] = [minNode.id];\n } else if (D[w] === D[minNode.id] + weight) {\n prevs[w].push(minNode.id);\n }\n });\n };\n\n for (var i = 0; i < nodeNum; i++) {\n _loop_1(i);\n }\n\n prevs[source] = [source]; // 每个节点存可能存在多条最短路径\n\n var paths = {};\n\n for (var target in D) {\n if (D[target] !== Infinity) {\n findAllPaths(source, target, prevs, paths);\n }\n } // 兼容之前单路径\n\n\n var path = {};\n\n for (var target in paths) {\n path[target] = paths[target][0];\n }\n\n return {\n length: D,\n path: path,\n allPath: paths\n };\n};\n\nvar _default = dijkstra;\nexports.default = _default;\n\nfunction findAllPaths(source, target, prevs, foundPaths) {\n if (source === target) {\n return [source];\n }\n\n if (foundPaths[target]) {\n return foundPaths[target];\n }\n\n var paths = [];\n\n for (var _i = 0, _a = prevs[target]; _i < _a.length; _i++) {\n var prev = _a[_i];\n var prevPaths = findAllPaths(source, prev, prevs, foundPaths);\n if (!prevPaths) return;\n\n for (var _b = 0, prevPaths_1 = prevPaths; _b < prevPaths_1.length; _b++) {\n var prePath = prevPaths_1[_b];\n if ((0, _util.isArray)(prePath)) paths.push((0, _tslib.__spreadArray)((0, _tslib.__spreadArray)([], prePath), [target]));else paths.push([prePath, target]);\n }\n }\n\n foundPaths[target] = paths;\n return foundPaths[target];\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvYWxnb3JpdGhtL2xpYi9kaWprc3RyYS5qcz85Yjk2Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFhOztBQUViO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7O0FBRUEsYUFBYSxtQkFBTyxDQUFDLENBQU87O0FBRTVCLFlBQVksbUJBQU8sQ0FBQyxDQUFZOztBQUVoQyxhQUFhLG1CQUFPLENBQUMsRUFBUTs7QUFFN0I7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsaUJBQWlCLGtCQUFrQjtBQUNuQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjs7QUFFakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscURBQXFEOztBQUVyRDtBQUNBLGlGQUFpRjtBQUNqRjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBLGlCQUFpQixhQUFhO0FBQzlCO0FBQ0E7O0FBRUEsMkJBQTJCOztBQUUzQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7OztBQUdIOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsc0NBQXNDLGdCQUFnQjtBQUN0RDtBQUNBO0FBQ0E7O0FBRUEsNkNBQTZDLHlCQUF5QjtBQUN0RTtBQUNBLCtIQUErSDtBQUMvSDtBQUNBOztBQUVBO0FBQ0E7QUFDQSIsImZpbGUiOiIxNTEuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIF90c2xpYiA9IHJlcXVpcmUoXCJ0c2xpYlwiKTtcblxudmFyIF91dGlsID0gcmVxdWlyZShcIkBhbnR2L3V0aWxcIik7XG5cbnZhciBfdXRpbDIgPSByZXF1aXJlKFwiLi91dGlsXCIpO1xuXG52YXIgbWluVmVydGV4ID0gZnVuY3Rpb24gbWluVmVydGV4KEQsIG5vZGVzLCBtYXJrcykge1xuICAvLyDmib7lh7rmnIDlsI/nmoTngrlcbiAgdmFyIG1pbkRpcyA9IEluZmluaXR5O1xuICB2YXIgbWluTm9kZTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIG5vZGVJZCA9IG5vZGVzW2ldLmlkO1xuXG4gICAgaWYgKCFtYXJrc1tub2RlSWRdICYmIERbbm9kZUlkXSA8PSBtaW5EaXMpIHtcbiAgICAgIG1pbkRpcyA9IERbbm9kZUlkXTtcbiAgICAgIG1pbk5vZGUgPSBub2Rlc1tpXTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbWluTm9kZTtcbn07XG5cbnZhciBkaWprc3RyYSA9IGZ1bmN0aW9uIGRpamtzdHJhKGdyYXBoRGF0YSwgc291cmNlLCBkaXJlY3RlZCwgd2VpZ2h0UHJvcGVydHlOYW1lKSB7XG4gIHZhciBfYSA9IGdyYXBoRGF0YS5ub2RlcyxcbiAgICAgIG5vZGVzID0gX2EgPT09IHZvaWQgMCA/IFtdIDogX2EsXG4gICAgICBfYiA9IGdyYXBoRGF0YS5lZGdlcyxcbiAgICAgIGVkZ2VzID0gX2IgPT09IHZvaWQgMCA/IFtdIDogX2I7XG4gIHZhciBub2RlSWRzID0gW107XG4gIHZhciBtYXJrcyA9IHt9O1xuICB2YXIgRCA9IHt9O1xuICB2YXIgcHJldnMgPSB7fTsgLy8ga2V5OiDpobbngrksIHZhbHVlOiDpobbngrnnmoTliY3pqbHngrnmlbDnu4TvvIjlj6/og73mnInlpJrmnaHnrYnplb/nmoTmnIDnn63ot6/lvoTvvIlcblxuICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChub2RlLCBpKSB7XG4gICAgdmFyIGlkID0gbm9kZS5pZDtcbiAgICBub2RlSWRzLnB1c2goaWQpO1xuICAgIERbaWRdID0gSW5maW5pdHk7XG4gICAgaWYgKGlkID09PSBzb3VyY2UpIERbaWRdID0gMDtcbiAgfSk7XG4gIHZhciBub2RlTnVtID0gbm9kZXMubGVuZ3RoO1xuXG4gIHZhciBfbG9vcF8xID0gZnVuY3Rpb24gX2xvb3BfMShpKSB7XG4gICAgLy8gUHJvY2VzcyB0aGUgdmVydGljZXNcbiAgICB2YXIgbWluTm9kZSA9IG1pblZlcnRleChELCBub2RlcywgbWFya3MpO1xuICAgIHZhciBtaW5Ob2RlSWQgPSBtaW5Ob2RlLmlkO1xuICAgIG1hcmtzW21pbk5vZGVJZF0gPSB0cnVlO1xuICAgIGlmIChEW21pbk5vZGVJZF0gPT09IEluZmluaXR5KSByZXR1cm4gXCJjb250aW51ZVwiOyAvLyBVbnJlYWNoYWJsZSB2ZXJ0aWNlcyBjYW5ub3QgYmUgdGhlIGludGVybWVkaWF0ZSBwb2ludFxuXG4gICAgdmFyIHJlbGF0ZWRFZGdlcyA9IFtdO1xuICAgIGlmIChkaXJlY3RlZCkgcmVsYXRlZEVkZ2VzID0gKDAsIF91dGlsMi5nZXRPdXRFZGdlc05vZGVJZCkobWluTm9kZUlkLCBlZGdlcyk7ZWxzZSByZWxhdGVkRWRnZXMgPSAoMCwgX3V0aWwyLmdldEVkZ2VzQnlOb2RlSWQpKG1pbk5vZGVJZCwgZWRnZXMpO1xuICAgIHJlbGF0ZWRFZGdlcy5mb3JFYWNoKGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgICB2YXIgZWRnZVRhcmdldCA9IGVkZ2UudGFyZ2V0O1xuICAgICAgdmFyIGVkZ2VTb3VyY2UgPSBlZGdlLnNvdXJjZTtcbiAgICAgIHZhciB3ID0gZWRnZVRhcmdldCA9PT0gbWluTm9kZUlkID8gZWRnZVNvdXJjZSA6IGVkZ2VUYXJnZXQ7XG4gICAgICB2YXIgd2VpZ2h0ID0gd2VpZ2h0UHJvcGVydHlOYW1lICYmIGVkZ2Vbd2VpZ2h0UHJvcGVydHlOYW1lXSA/IGVkZ2Vbd2VpZ2h0UHJvcGVydHlOYW1lXSA6IDE7XG5cbiAgICAgIGlmIChEW3ddID4gRFttaW5Ob2RlLmlkXSArIHdlaWdodCkge1xuICAgICAgICBEW3ddID0gRFttaW5Ob2RlLmlkXSArIHdlaWdodDtcbiAgICAgICAgcHJldnNbd10gPSBbbWluTm9kZS5pZF07XG4gICAgICB9IGVsc2UgaWYgKERbd10gPT09IERbbWluTm9kZS5pZF0gKyB3ZWlnaHQpIHtcbiAgICAgICAgcHJldnNbd10ucHVzaChtaW5Ob2RlLmlkKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVOdW07IGkrKykge1xuICAgIF9sb29wXzEoaSk7XG4gIH1cblxuICBwcmV2c1tzb3VyY2VdID0gW3NvdXJjZV07IC8vIOavj+S4quiKgueCueWtmOWPr+iDveWtmOWcqOWkmuadoeacgOefrei3r+W+hFxuXG4gIHZhciBwYXRocyA9IHt9O1xuXG4gIGZvciAodmFyIHRhcmdldCBpbiBEKSB7XG4gICAgaWYgKERbdGFyZ2V0XSAhPT0gSW5maW5pdHkpIHtcbiAgICAgIGZpbmRBbGxQYXRocyhzb3VyY2UsIHRhcmdldCwgcHJldnMsIHBhdGhzKTtcbiAgICB9XG4gIH0gLy8g5YW85a655LmL5YmN5Y2V6Lev5b6EXG5cblxuICB2YXIgcGF0aCA9IHt9O1xuXG4gIGZvciAodmFyIHRhcmdldCBpbiBwYXRocykge1xuICAgIHBhdGhbdGFyZ2V0XSA9IHBhdGhzW3RhcmdldF1bMF07XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGxlbmd0aDogRCxcbiAgICBwYXRoOiBwYXRoLFxuICAgIGFsbFBhdGg6IHBhdGhzXG4gIH07XG59O1xuXG52YXIgX2RlZmF1bHQgPSBkaWprc3RyYTtcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0O1xuXG5mdW5jdGlvbiBmaW5kQWxsUGF0aHMoc291cmNlLCB0YXJnZXQsIHByZXZzLCBmb3VuZFBhdGhzKSB7XG4gIGlmIChzb3VyY2UgPT09IHRhcmdldCkge1xuICAgIHJldHVybiBbc291cmNlXTtcbiAgfVxuXG4gIGlmIChmb3VuZFBhdGhzW3RhcmdldF0pIHtcbiAgICByZXR1cm4gZm91bmRQYXRoc1t0YXJnZXRdO1xuICB9XG5cbiAgdmFyIHBhdGhzID0gW107XG5cbiAgZm9yICh2YXIgX2kgPSAwLCBfYSA9IHByZXZzW3RhcmdldF07IF9pIDwgX2EubGVuZ3RoOyBfaSsrKSB7XG4gICAgdmFyIHByZXYgPSBfYVtfaV07XG4gICAgdmFyIHByZXZQYXRocyA9IGZpbmRBbGxQYXRocyhzb3VyY2UsIHByZXYsIHByZXZzLCBmb3VuZFBhdGhzKTtcbiAgICBpZiAoIXByZXZQYXRocykgcmV0dXJuO1xuXG4gICAgZm9yICh2YXIgX2IgPSAwLCBwcmV2UGF0aHNfMSA9IHByZXZQYXRoczsgX2IgPCBwcmV2UGF0aHNfMS5sZW5ndGg7IF9iKyspIHtcbiAgICAgIHZhciBwcmVQYXRoID0gcHJldlBhdGhzXzFbX2JdO1xuICAgICAgaWYgKCgwLCBfdXRpbC5pc0FycmF5KShwcmVQYXRoKSkgcGF0aHMucHVzaCgoMCwgX3RzbGliLl9fc3ByZWFkQXJyYXkpKCgwLCBfdHNsaWIuX19zcHJlYWRBcnJheSkoW10sIHByZVBhdGgpLCBbdGFyZ2V0XSkpO2Vsc2UgcGF0aHMucHVzaChbcHJlUGF0aCwgdGFyZ2V0XSk7XG4gICAgfVxuICB9XG5cbiAgZm91bmRQYXRoc1t0YXJnZXRdID0gcGF0aHM7XG4gIHJldHVybiBmb3VuZFBhdGhzW3RhcmdldF07XG59Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///151\n')},function(module,exports,__webpack_require__){"use strict";eval('\n\nvar _ = __webpack_require__(42);\n\nmodule.exports = Graph;\n\nvar DEFAULT_EDGE_NAME = "\\x00";\nvar GRAPH_NODE = "\\x00";\nvar EDGE_KEY_DELIM = "\\x01";\n\n// Implementation notes:\n//\n// * Node id query functions should return string ids for the nodes\n// * Edge id query functions should return an "edgeObj", edge object, that is\n// composed of enough information to uniquely identify an edge: {v, w, name}.\n// * Internally we use an "edgeId", a stringified form of the edgeObj, to\n// reference edges. This is because we need a performant way to look these\n// edges up and, object properties, which have string keys, are the closest\n// we\'re going to get to a performant hashtable in JavaScript.\n\nfunction Graph(opts) {\n this._isDirected = _.has(opts, "directed") ? opts.directed : true;\n this._isMultigraph = _.has(opts, "multigraph") ? opts.multigraph : false;\n this._isCompound = _.has(opts, "compound") ? opts.compound : false;\n\n // Label for the graph itself\n this._label = undefined;\n\n // Defaults to be set when creating a new node\n this._defaultNodeLabelFn = _.constant(undefined);\n\n // Defaults to be set when creating a new edge\n this._defaultEdgeLabelFn = _.constant(undefined);\n\n // v -> label\n this._nodes = {};\n\n if (this._isCompound) {\n // v -> parent\n this._parent = {};\n\n // v -> children\n this._children = {};\n this._children[GRAPH_NODE] = {};\n }\n\n // v -> edgeObj\n this._in = {};\n\n // u -> v -> Number\n this._preds = {};\n\n // v -> edgeObj\n this._out = {};\n\n // v -> w -> Number\n this._sucs = {};\n\n // e -> edgeObj\n this._edgeObjs = {};\n\n // e -> label\n this._edgeLabels = {};\n}\n\n/* Number of nodes in the graph. Should only be changed by the implementation. */\nGraph.prototype._nodeCount = 0;\n\n/* Number of edges in the graph. Should only be changed by the implementation. */\nGraph.prototype._edgeCount = 0;\n\n\n/* === Graph functions ========= */\n\nGraph.prototype.isDirected = function() {\n return this._isDirected;\n};\n\nGraph.prototype.isMultigraph = function() {\n return this._isMultigraph;\n};\n\nGraph.prototype.isCompound = function() {\n return this._isCompound;\n};\n\nGraph.prototype.setGraph = function(label) {\n this._label = label;\n return this;\n};\n\nGraph.prototype.graph = function() {\n return this._label;\n};\n\n\n/* === Node functions ========== */\n\nGraph.prototype.setDefaultNodeLabel = function(newDefault) {\n if (!_.isFunction(newDefault)) {\n newDefault = _.constant(newDefault);\n }\n this._defaultNodeLabelFn = newDefault;\n return this;\n};\n\nGraph.prototype.nodeCount = function() {\n return this._nodeCount;\n};\n\nGraph.prototype.nodes = function() {\n return _.keys(this._nodes);\n};\n\nGraph.prototype.sources = function() {\n var self = this;\n return _.filter(this.nodes(), function(v) {\n return _.isEmpty(self._in[v]);\n });\n};\n\nGraph.prototype.sinks = function() {\n var self = this;\n return _.filter(this.nodes(), function(v) {\n return _.isEmpty(self._out[v]);\n });\n};\n\nGraph.prototype.setNodes = function(vs, value) {\n var args = arguments;\n var self = this;\n _.each(vs, function(v) {\n if (args.length > 1) {\n self.setNode(v, value);\n } else {\n self.setNode(v);\n }\n });\n return this;\n};\n\nGraph.prototype.setNode = function(v, value) {\n if (_.has(this._nodes, v)) {\n if (arguments.length > 1) {\n this._nodes[v] = value;\n }\n return this;\n }\n\n this._nodes[v] = arguments.length > 1 ? value : this._defaultNodeLabelFn(v);\n if (this._isCompound) {\n this._parent[v] = GRAPH_NODE;\n this._children[v] = {};\n this._children[GRAPH_NODE][v] = true;\n }\n this._in[v] = {};\n this._preds[v] = {};\n this._out[v] = {};\n this._sucs[v] = {};\n ++this._nodeCount;\n return this;\n};\n\nGraph.prototype.node = function(v) {\n return this._nodes[v];\n};\n\nGraph.prototype.hasNode = function(v) {\n return _.has(this._nodes, v);\n};\n\nGraph.prototype.removeNode = function(v) {\n var self = this;\n if (_.has(this._nodes, v)) {\n var removeEdge = function(e) { self.removeEdge(self._edgeObjs[e]); };\n delete this._nodes[v];\n if (this._isCompound) {\n this._removeFromParentsChildList(v);\n delete this._parent[v];\n _.each(this.children(v), function(child) {\n self.setParent(child);\n });\n delete this._children[v];\n }\n _.each(_.keys(this._in[v]), removeEdge);\n delete this._in[v];\n delete this._preds[v];\n _.each(_.keys(this._out[v]), removeEdge);\n delete this._out[v];\n delete this._sucs[v];\n --this._nodeCount;\n }\n return this;\n};\n\nGraph.prototype.setParent = function(v, parent) {\n if (!this._isCompound) {\n throw new Error("Cannot set parent in a non-compound graph");\n }\n\n if (_.isUndefined(parent)) {\n parent = GRAPH_NODE;\n } else {\n // Coerce parent to string\n parent += "";\n for (var ancestor = parent;\n !_.isUndefined(ancestor);\n ancestor = this.parent(ancestor)) {\n if (ancestor === v) {\n throw new Error("Setting " + parent+ " as parent of " + v +\n " would create a cycle");\n }\n }\n\n this.setNode(parent);\n }\n\n this.setNode(v);\n this._removeFromParentsChildList(v);\n this._parent[v] = parent;\n this._children[parent][v] = true;\n return this;\n};\n\nGraph.prototype._removeFromParentsChildList = function(v) {\n delete this._children[this._parent[v]][v];\n};\n\nGraph.prototype.parent = function(v) {\n if (this._isCompound) {\n var parent = this._parent[v];\n if (parent !== GRAPH_NODE) {\n return parent;\n }\n }\n};\n\nGraph.prototype.children = function(v) {\n if (_.isUndefined(v)) {\n v = GRAPH_NODE;\n }\n\n if (this._isCompound) {\n var children = this._children[v];\n if (children) {\n return _.keys(children);\n }\n } else if (v === GRAPH_NODE) {\n return this.nodes();\n } else if (this.hasNode(v)) {\n return [];\n }\n};\n\nGraph.prototype.predecessors = function(v) {\n var predsV = this._preds[v];\n if (predsV) {\n return _.keys(predsV);\n }\n};\n\nGraph.prototype.successors = function(v) {\n var sucsV = this._sucs[v];\n if (sucsV) {\n return _.keys(sucsV);\n }\n};\n\nGraph.prototype.neighbors = function(v) {\n var preds = this.predecessors(v);\n if (preds) {\n return _.union(preds, this.successors(v));\n }\n};\n\nGraph.prototype.isLeaf = function (v) {\n var neighbors;\n if (this.isDirected()) {\n neighbors = this.successors(v);\n } else {\n neighbors = this.neighbors(v);\n }\n return neighbors.length === 0;\n};\n\nGraph.prototype.filterNodes = function(filter) {\n var copy = new this.constructor({\n directed: this._isDirected,\n multigraph: this._isMultigraph,\n compound: this._isCompound\n });\n\n copy.setGraph(this.graph());\n\n var self = this;\n _.each(this._nodes, function(value, v) {\n if (filter(v)) {\n copy.setNode(v, value);\n }\n });\n\n _.each(this._edgeObjs, function(e) {\n if (copy.hasNode(e.v) && copy.hasNode(e.w)) {\n copy.setEdge(e, self.edge(e));\n }\n });\n\n var parents = {};\n function findParent(v) {\n var parent = self.parent(v);\n if (parent === undefined || copy.hasNode(parent)) {\n parents[v] = parent;\n return parent;\n } else if (parent in parents) {\n return parents[parent];\n } else {\n return findParent(parent);\n }\n }\n\n if (this._isCompound) {\n _.each(copy.nodes(), function(v) {\n copy.setParent(v, findParent(v));\n });\n }\n\n return copy;\n};\n\n/* === Edge functions ========== */\n\nGraph.prototype.setDefaultEdgeLabel = function(newDefault) {\n if (!_.isFunction(newDefault)) {\n newDefault = _.constant(newDefault);\n }\n this._defaultEdgeLabelFn = newDefault;\n return this;\n};\n\nGraph.prototype.edgeCount = function() {\n return this._edgeCount;\n};\n\nGraph.prototype.edges = function() {\n return _.values(this._edgeObjs);\n};\n\nGraph.prototype.setPath = function(vs, value) {\n var self = this;\n var args = arguments;\n _.reduce(vs, function(v, w) {\n if (args.length > 1) {\n self.setEdge(v, w, value);\n } else {\n self.setEdge(v, w);\n }\n return w;\n });\n return this;\n};\n\n/*\n * setEdge(v, w, [value, [name]])\n * setEdge({ v, w, [name] }, [value])\n */\nGraph.prototype.setEdge = function() {\n var v, w, name, value;\n var valueSpecified = false;\n var arg0 = arguments[0];\n\n if (typeof arg0 === "object" && arg0 !== null && "v" in arg0) {\n v = arg0.v;\n w = arg0.w;\n name = arg0.name;\n if (arguments.length === 2) {\n value = arguments[1];\n valueSpecified = true;\n }\n } else {\n v = arg0;\n w = arguments[1];\n name = arguments[3];\n if (arguments.length > 2) {\n value = arguments[2];\n valueSpecified = true;\n }\n }\n\n v = "" + v;\n w = "" + w;\n if (!_.isUndefined(name)) {\n name = "" + name;\n }\n\n var e = edgeArgsToId(this._isDirected, v, w, name);\n if (_.has(this._edgeLabels, e)) {\n if (valueSpecified) {\n this._edgeLabels[e] = value;\n }\n return this;\n }\n\n if (!_.isUndefined(name) && !this._isMultigraph) {\n throw new Error("Cannot set a named edge when isMultigraph = false");\n }\n\n // It didn\'t exist, so we need to create it.\n // First ensure the nodes exist.\n this.setNode(v);\n this.setNode(w);\n\n this._edgeLabels[e] = valueSpecified ? value : this._defaultEdgeLabelFn(v, w, name);\n\n var edgeObj = edgeArgsToObj(this._isDirected, v, w, name);\n // Ensure we add undirected edges in a consistent way.\n v = edgeObj.v;\n w = edgeObj.w;\n\n Object.freeze(edgeObj);\n this._edgeObjs[e] = edgeObj;\n incrementOrInitEntry(this._preds[w], v);\n incrementOrInitEntry(this._sucs[v], w);\n this._in[w][e] = edgeObj;\n this._out[v][e] = edgeObj;\n this._edgeCount++;\n return this;\n};\n\nGraph.prototype.edge = function(v, w, name) {\n var e = (arguments.length === 1\n ? edgeObjToId(this._isDirected, arguments[0])\n : edgeArgsToId(this._isDirected, v, w, name));\n return this._edgeLabels[e];\n};\n\nGraph.prototype.hasEdge = function(v, w, name) {\n var e = (arguments.length === 1\n ? edgeObjToId(this._isDirected, arguments[0])\n : edgeArgsToId(this._isDirected, v, w, name));\n return _.has(this._edgeLabels, e);\n};\n\nGraph.prototype.removeEdge = function(v, w, name) {\n var e = (arguments.length === 1\n ? edgeObjToId(this._isDirected, arguments[0])\n : edgeArgsToId(this._isDirected, v, w, name));\n var edge = this._edgeObjs[e];\n if (edge) {\n v = edge.v;\n w = edge.w;\n delete this._edgeLabels[e];\n delete this._edgeObjs[e];\n decrementOrRemoveEntry(this._preds[w], v);\n decrementOrRemoveEntry(this._sucs[v], w);\n delete this._in[w][e];\n delete this._out[v][e];\n this._edgeCount--;\n }\n return this;\n};\n\nGraph.prototype.inEdges = function(v, u) {\n var inV = this._in[v];\n if (inV) {\n var edges = _.values(inV);\n if (!u) {\n return edges;\n }\n return _.filter(edges, function(edge) { return edge.v === u; });\n }\n};\n\nGraph.prototype.outEdges = function(v, w) {\n var outV = this._out[v];\n if (outV) {\n var edges = _.values(outV);\n if (!w) {\n return edges;\n }\n return _.filter(edges, function(edge) { return edge.w === w; });\n }\n};\n\nGraph.prototype.nodeEdges = function(v, w) {\n var inEdges = this.inEdges(v, w);\n if (inEdges) {\n return inEdges.concat(this.outEdges(v, w));\n }\n};\n\nfunction incrementOrInitEntry(map, k) {\n if (map[k]) {\n map[k]++;\n } else {\n map[k] = 1;\n }\n}\n\nfunction decrementOrRemoveEntry(map, k) {\n if (!--map[k]) { delete map[k]; }\n}\n\nfunction edgeArgsToId(isDirected, v_, w_, name) {\n var v = "" + v_;\n var w = "" + w_;\n if (!isDirected && v > w) {\n var tmp = v;\n v = w;\n w = tmp;\n }\n return v + EDGE_KEY_DELIM + w + EDGE_KEY_DELIM +\n (_.isUndefined(name) ? DEFAULT_EDGE_NAME : name);\n}\n\nfunction edgeArgsToObj(isDirected, v_, w_, name) {\n var v = "" + v_;\n var w = "" + w_;\n if (!isDirected && v > w) {\n var tmp = v;\n v = w;\n w = tmp;\n }\n var edgeObj = { v: v, w: w };\n if (name) {\n edgeObj.name = name;\n }\n return edgeObj;\n}\n\nfunction edgeObjToId(isDirected, edgeObj) {\n return edgeArgsToId(isDirected, edgeObj.v, edgeObj.w, edgeObj.name);\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZ3JhcGhsaWIvbGliL2dyYXBoLmpzPzk2NzEiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWIsUUFBUSxtQkFBTyxDQUFDLEVBQVU7O0FBRTFCOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9FQUFvRSxXQUFXO0FBQy9FO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQyxvQ0FBb0M7QUFDdEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxZQUFZLGVBQWU7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDLHFCQUFxQixFQUFFO0FBQ2xFO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQ0FBMkMscUJBQXFCLEVBQUU7QUFDbEU7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGtCQUFrQixlQUFlO0FBQ2pDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSIsImZpbGUiOiIxNTIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxudmFyIF8gPSByZXF1aXJlKFwiLi9sb2Rhc2hcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gR3JhcGg7XG5cbnZhciBERUZBVUxUX0VER0VfTkFNRSA9IFwiXFx4MDBcIjtcbnZhciBHUkFQSF9OT0RFID0gXCJcXHgwMFwiO1xudmFyIEVER0VfS0VZX0RFTElNID0gXCJcXHgwMVwiO1xuXG4vLyBJbXBsZW1lbnRhdGlvbiBub3Rlczpcbi8vXG4vLyAgKiBOb2RlIGlkIHF1ZXJ5IGZ1bmN0aW9ucyBzaG91bGQgcmV0dXJuIHN0cmluZyBpZHMgZm9yIHRoZSBub2Rlc1xuLy8gICogRWRnZSBpZCBxdWVyeSBmdW5jdGlvbnMgc2hvdWxkIHJldHVybiBhbiBcImVkZ2VPYmpcIiwgZWRnZSBvYmplY3QsIHRoYXQgaXNcbi8vICAgIGNvbXBvc2VkIG9mIGVub3VnaCBpbmZvcm1hdGlvbiB0byB1bmlxdWVseSBpZGVudGlmeSBhbiBlZGdlOiB7diwgdywgbmFtZX0uXG4vLyAgKiBJbnRlcm5hbGx5IHdlIHVzZSBhbiBcImVkZ2VJZFwiLCBhIHN0cmluZ2lmaWVkIGZvcm0gb2YgdGhlIGVkZ2VPYmosIHRvXG4vLyAgICByZWZlcmVuY2UgZWRnZXMuIFRoaXMgaXMgYmVjYXVzZSB3ZSBuZWVkIGEgcGVyZm9ybWFudCB3YXkgdG8gbG9vayB0aGVzZVxuLy8gICAgZWRnZXMgdXAgYW5kLCBvYmplY3QgcHJvcGVydGllcywgd2hpY2ggaGF2ZSBzdHJpbmcga2V5cywgYXJlIHRoZSBjbG9zZXN0XG4vLyAgICB3ZSdyZSBnb2luZyB0byBnZXQgdG8gYSBwZXJmb3JtYW50IGhhc2h0YWJsZSBpbiBKYXZhU2NyaXB0LlxuXG5mdW5jdGlvbiBHcmFwaChvcHRzKSB7XG4gIHRoaXMuX2lzRGlyZWN0ZWQgPSBfLmhhcyhvcHRzLCBcImRpcmVjdGVkXCIpID8gb3B0cy5kaXJlY3RlZCA6IHRydWU7XG4gIHRoaXMuX2lzTXVsdGlncmFwaCA9IF8uaGFzKG9wdHMsIFwibXVsdGlncmFwaFwiKSA/IG9wdHMubXVsdGlncmFwaCA6IGZhbHNlO1xuICB0aGlzLl9pc0NvbXBvdW5kID0gXy5oYXMob3B0cywgXCJjb21wb3VuZFwiKSA/IG9wdHMuY29tcG91bmQgOiBmYWxzZTtcblxuICAvLyBMYWJlbCBmb3IgdGhlIGdyYXBoIGl0c2VsZlxuICB0aGlzLl9sYWJlbCA9IHVuZGVmaW5lZDtcblxuICAvLyBEZWZhdWx0cyB0byBiZSBzZXQgd2hlbiBjcmVhdGluZyBhIG5ldyBub2RlXG4gIHRoaXMuX2RlZmF1bHROb2RlTGFiZWxGbiA9IF8uY29uc3RhbnQodW5kZWZpbmVkKTtcblxuICAvLyBEZWZhdWx0cyB0byBiZSBzZXQgd2hlbiBjcmVhdGluZyBhIG5ldyBlZGdlXG4gIHRoaXMuX2RlZmF1bHRFZGdlTGFiZWxGbiA9IF8uY29uc3RhbnQodW5kZWZpbmVkKTtcblxuICAvLyB2IC0+IGxhYmVsXG4gIHRoaXMuX25vZGVzID0ge307XG5cbiAgaWYgKHRoaXMuX2lzQ29tcG91bmQpIHtcbiAgICAvLyB2IC0+IHBhcmVudFxuICAgIHRoaXMuX3BhcmVudCA9IHt9O1xuXG4gICAgLy8gdiAtPiBjaGlsZHJlblxuICAgIHRoaXMuX2NoaWxkcmVuID0ge307XG4gICAgdGhpcy5fY2hpbGRyZW5bR1JBUEhfTk9ERV0gPSB7fTtcbiAgfVxuXG4gIC8vIHYgLT4gZWRnZU9ialxuICB0aGlzLl9pbiA9IHt9O1xuXG4gIC8vIHUgLT4gdiAtPiBOdW1iZXJcbiAgdGhpcy5fcHJlZHMgPSB7fTtcblxuICAvLyB2IC0+IGVkZ2VPYmpcbiAgdGhpcy5fb3V0ID0ge307XG5cbiAgLy8gdiAtPiB3IC0+IE51bWJlclxuICB0aGlzLl9zdWNzID0ge307XG5cbiAgLy8gZSAtPiBlZGdlT2JqXG4gIHRoaXMuX2VkZ2VPYmpzID0ge307XG5cbiAgLy8gZSAtPiBsYWJlbFxuICB0aGlzLl9lZGdlTGFiZWxzID0ge307XG59XG5cbi8qIE51bWJlciBvZiBub2RlcyBpbiB0aGUgZ3JhcGguIFNob3VsZCBvbmx5IGJlIGNoYW5nZWQgYnkgdGhlIGltcGxlbWVudGF0aW9uLiAqL1xuR3JhcGgucHJvdG90eXBlLl9ub2RlQ291bnQgPSAwO1xuXG4vKiBOdW1iZXIgb2YgZWRnZXMgaW4gdGhlIGdyYXBoLiBTaG91bGQgb25seSBiZSBjaGFuZ2VkIGJ5IHRoZSBpbXBsZW1lbnRhdGlvbi4gKi9cbkdyYXBoLnByb3RvdHlwZS5fZWRnZUNvdW50ID0gMDtcblxuXG4vKiA9PT0gR3JhcGggZnVuY3Rpb25zID09PT09PT09PSAqL1xuXG5HcmFwaC5wcm90b3R5cGUuaXNEaXJlY3RlZCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5faXNEaXJlY3RlZDtcbn07XG5cbkdyYXBoLnByb3RvdHlwZS5pc011bHRpZ3JhcGggPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuX2lzTXVsdGlncmFwaDtcbn07XG5cbkdyYXBoLnByb3RvdHlwZS5pc0NvbXBvdW5kID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLl9pc0NvbXBvdW5kO1xufTtcblxuR3JhcGgucHJvdG90eXBlLnNldEdyYXBoID0gZnVuY3Rpb24obGFiZWwpIHtcbiAgdGhpcy5fbGFiZWwgPSBsYWJlbDtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5HcmFwaC5wcm90b3R5cGUuZ3JhcGggPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuX2xhYmVsO1xufTtcblxuXG4vKiA9PT0gTm9kZSBmdW5jdGlvbnMgPT09PT09PT09PSAqL1xuXG5HcmFwaC5wcm90b3R5cGUuc2V0RGVmYXVsdE5vZGVMYWJlbCA9IGZ1bmN0aW9uKG5ld0RlZmF1bHQpIHtcbiAgaWYgKCFfLmlzRnVuY3Rpb24obmV3RGVmYXVsdCkpIHtcbiAgICBuZXdEZWZhdWx0ID0gXy5jb25zdGFudChuZXdEZWZhdWx0KTtcbiAgfVxuICB0aGlzLl9kZWZhdWx0Tm9kZUxhYmVsRm4gPSBuZXdEZWZhdWx0O1xuICByZXR1cm4gdGhpcztcbn07XG5cbkdyYXBoLnByb3RvdHlwZS5ub2RlQ291bnQgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuX25vZGVDb3VudDtcbn07XG5cbkdyYXBoLnByb3RvdHlwZS5ub2RlcyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gXy5rZXlzKHRoaXMuX25vZGVzKTtcbn07XG5cbkdyYXBoLnByb3RvdHlwZS5zb3VyY2VzID0gZnVuY3Rpb24oKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgcmV0dXJuIF8uZmlsdGVyKHRoaXMubm9kZXMoKSwgZnVuY3Rpb24odikge1xuICAgIHJldHVybiBfLmlzRW1wdHkoc2VsZi5faW5bdl0pO1xuICB9KTtcbn07XG5cbkdyYXBoLnByb3RvdHlwZS5zaW5rcyA9IGZ1bmN0aW9uKCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHJldHVybiBfLmZpbHRlcih0aGlzLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICByZXR1cm4gXy5pc0VtcHR5KHNlbGYuX291dFt2XSk7XG4gIH0pO1xufTtcblxuR3JhcGgucHJvdG90eXBlLnNldE5vZGVzID0gZnVuY3Rpb24odnMsIHZhbHVlKSB7XG4gIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIF8uZWFjaCh2cywgZnVuY3Rpb24odikge1xuICAgIGlmIChhcmdzLmxlbmd0aCA+IDEpIHtcbiAgICAgIHNlbGYuc2V0Tm9kZSh2LCB2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNlbGYuc2V0Tm9kZSh2KTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gdGhpcztcbn07XG5cbkdyYXBoLnByb3RvdHlwZS5zZXROb2RlID0gZnVuY3Rpb24odiwgdmFsdWUpIHtcbiAgaWYgKF8uaGFzKHRoaXMuX25vZGVzLCB2KSkge1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgdGhpcy5fbm9kZXNbdl0gPSB2YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB0aGlzLl9ub2Rlc1t2XSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxID8gdmFsdWUgOiB0aGlzLl9kZWZhdWx0Tm9kZUxhYmVsRm4odik7XG4gIGlmICh0aGlzLl9pc0NvbXBvdW5kKSB7XG4gICAgdGhpcy5fcGFyZW50W3ZdID0gR1JBUEhfTk9ERTtcbiAgICB0aGlzLl9jaGlsZHJlblt2XSA9IHt9O1xuICAgIHRoaXMuX2NoaWxkcmVuW0dSQVBIX05PREVdW3ZdID0gdHJ1ZTtcbiAgfVxuICB0aGlzLl9pblt2XSA9IHt9O1xuICB0aGlzLl9wcmVkc1t2XSA9IHt9O1xuICB0aGlzLl9vdXRbdl0gPSB7fTtcbiAgdGhpcy5fc3Vjc1t2XSA9IHt9O1xuICArK3RoaXMuX25vZGVDb3VudDtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5HcmFwaC5wcm90b3R5cGUubm9kZSA9IGZ1bmN0aW9uKHYpIHtcbiAgcmV0dXJuIHRoaXMuX25vZGVzW3ZdO1xufTtcblxuR3JhcGgucHJvdG90eXBlLmhhc05vZGUgPSBmdW5jdGlvbih2KSB7XG4gIHJldHVybiBfLmhhcyh0aGlzLl9ub2Rlcywgdik7XG59O1xuXG5HcmFwaC5wcm90b3R5cGUucmVtb3ZlTm9kZSA9ICBmdW5jdGlvbih2KSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgaWYgKF8uaGFzKHRoaXMuX25vZGVzLCB2KSkge1xuICAgIHZhciByZW1vdmVFZGdlID0gZnVuY3Rpb24oZSkgeyBzZWxmLnJlbW92ZUVkZ2Uoc2VsZi5fZWRnZU9ianNbZV0pOyB9O1xuICAgIGRlbGV0ZSB0aGlzLl9ub2Rlc1t2XTtcbiAgICBpZiAodGhpcy5faXNDb21wb3VuZCkge1xuICAgICAgdGhpcy5fcmVtb3ZlRnJvbVBhcmVudHNDaGlsZExpc3Qodik7XG4gICAgICBkZWxldGUgdGhpcy5fcGFyZW50W3ZdO1xuICAgICAgXy5lYWNoKHRoaXMuY2hpbGRyZW4odiksIGZ1bmN0aW9uKGNoaWxkKSB7XG4gICAgICAgIHNlbGYuc2V0UGFyZW50KGNoaWxkKTtcbiAgICAgIH0pO1xuICAgICAgZGVsZXRlIHRoaXMuX2NoaWxkcmVuW3ZdO1xuICAgIH1cbiAgICBfLmVhY2goXy5rZXlzKHRoaXMuX2luW3ZdKSwgcmVtb3ZlRWRnZSk7XG4gICAgZGVsZXRlIHRoaXMuX2luW3ZdO1xuICAgIGRlbGV0ZSB0aGlzLl9wcmVkc1t2XTtcbiAgICBfLmVhY2goXy5rZXlzKHRoaXMuX291dFt2XSksIHJlbW92ZUVkZ2UpO1xuICAgIGRlbGV0ZSB0aGlzLl9vdXRbdl07XG4gICAgZGVsZXRlIHRoaXMuX3N1Y3Nbdl07XG4gICAgLS10aGlzLl9ub2RlQ291bnQ7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5HcmFwaC5wcm90b3R5cGUuc2V0UGFyZW50ID0gZnVuY3Rpb24odiwgcGFyZW50KSB7XG4gIGlmICghdGhpcy5faXNDb21wb3VuZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBzZXQgcGFyZW50IGluIGEgbm9uLWNvbXBvdW5kIGdyYXBoXCIpO1xuICB9XG5cbiAgaWYgKF8uaXNVbmRlZmluZWQocGFyZW50KSkge1xuICAgIHBhcmVudCA9IEdSQVBIX05PREU7XG4gIH0gZWxzZSB7XG4gICAgLy8gQ29lcmNlIHBhcmVudCB0byBzdHJpbmdcbiAgICBwYXJlbnQgKz0gXCJcIjtcbiAgICBmb3IgKHZhciBhbmNlc3RvciA9IHBhcmVudDtcbiAgICAgICFfLmlzVW5kZWZpbmVkKGFuY2VzdG9yKTtcbiAgICAgIGFuY2VzdG9yID0gdGhpcy5wYXJlbnQoYW5jZXN0b3IpKSB7XG4gICAgICBpZiAoYW5jZXN0b3IgPT09IHYpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU2V0dGluZyBcIiArIHBhcmVudCsgXCIgYXMgcGFyZW50IG9mIFwiICsgdiArXG4gICAgICAgICAgICAgICAgICAgICAgICBcIiB3b3VsZCBjcmVhdGUgYSBjeWNsZVwiKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnNldE5vZGUocGFyZW50KTtcbiAgfVxuXG4gIHRoaXMuc2V0Tm9kZSh2KTtcbiAgdGhpcy5fcmVtb3ZlRnJvbVBhcmVudHNDaGlsZExpc3Qodik7XG4gIHRoaXMuX3BhcmVudFt2XSA9IHBhcmVudDtcbiAgdGhpcy5fY2hpbGRyZW5bcGFyZW50XVt2XSA9IHRydWU7XG4gIHJldHVybiB0aGlzO1xufTtcblxuR3JhcGgucHJvdG90eXBlLl9yZW1vdmVGcm9tUGFyZW50c0NoaWxkTGlzdCA9IGZ1bmN0aW9uKHYpIHtcbiAgZGVsZXRlIHRoaXMuX2NoaWxkcmVuW3RoaXMuX3BhcmVudFt2XV1bdl07XG59O1xuXG5HcmFwaC5wcm90b3R5cGUucGFyZW50ID0gZnVuY3Rpb24odikge1xuICBpZiAodGhpcy5faXNDb21wb3VuZCkge1xuICAgIHZhciBwYXJlbnQgPSB0aGlzLl9wYXJlbnRbdl07XG4gICAgaWYgKHBhcmVudCAhPT0gR1JBUEhfTk9ERSkge1xuICAgICAgcmV0dXJuIHBhcmVudDtcbiAgICB9XG4gIH1cbn07XG5cbkdyYXBoLnByb3RvdHlwZS5jaGlsZHJlbiA9IGZ1bmN0aW9uKHYpIHtcbiAgaWYgKF8uaXNVbmRlZmluZWQodikpIHtcbiAgICB2ID0gR1JBUEhfTk9ERTtcbiAgfVxuXG4gIGlmICh0aGlzLl9pc0NvbXBvdW5kKSB7XG4gICAgdmFyIGNoaWxkcmVuID0gdGhpcy5fY2hpbGRyZW5bdl07XG4gICAgaWYgKGNoaWxkcmVuKSB7XG4gICAgICByZXR1cm4gXy5rZXlzKGNoaWxkcmVuKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAodiA9PT0gR1JBUEhfTk9ERSkge1xuICAgIHJldHVybiB0aGlzLm5vZGVzKCk7XG4gIH0gZWxzZSBpZiAodGhpcy5oYXNOb2RlKHYpKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG59O1xuXG5HcmFwaC5wcm90b3R5cGUucHJlZGVjZXNzb3JzID0gZnVuY3Rpb24odikge1xuICB2YXIgcHJlZHNWID0gdGhpcy5fcHJlZHNbdl07XG4gIGlmIChwcmVkc1YpIHtcbiAgICByZXR1cm4gXy5rZXlzKHByZWRzVik7XG4gIH1cbn07XG5cbkdyYXBoLnByb3RvdHlwZS5zdWNjZXNzb3JzID0gZnVuY3Rpb24odikge1xuICB2YXIgc3Vjc1YgPSB0aGlzLl9zdWNzW3ZdO1xuICBpZiAoc3Vjc1YpIHtcbiAgICByZXR1cm4gXy5rZXlzKHN1Y3NWKTtcbiAgfVxufTtcblxuR3JhcGgucHJvdG90eXBlLm5laWdoYm9ycyA9IGZ1bmN0aW9uKHYpIHtcbiAgdmFyIHByZWRzID0gdGhpcy5wcmVkZWNlc3NvcnModik7XG4gIGlmIChwcmVkcykge1xuICAgIHJldHVybiBfLnVuaW9uKHByZWRzLCB0aGlzLnN1Y2Nlc3NvcnModikpO1xuICB9XG59O1xuXG5HcmFwaC5wcm90b3R5cGUuaXNMZWFmID0gZnVuY3Rpb24gKHYpIHtcbiAgdmFyIG5laWdoYm9ycztcbiAgaWYgKHRoaXMuaXNEaXJlY3RlZCgpKSB7XG4gICAgbmVpZ2hib3JzID0gdGhpcy5zdWNjZXNzb3JzKHYpO1xuICB9IGVsc2Uge1xuICAgIG5laWdoYm9ycyA9IHRoaXMubmVpZ2hib3JzKHYpO1xuICB9XG4gIHJldHVybiBuZWlnaGJvcnMubGVuZ3RoID09PSAwO1xufTtcblxuR3JhcGgucHJvdG90eXBlLmZpbHRlck5vZGVzID0gZnVuY3Rpb24oZmlsdGVyKSB7XG4gIHZhciBjb3B5ID0gbmV3IHRoaXMuY29uc3RydWN0b3Ioe1xuICAgIGRpcmVjdGVkOiB0aGlzLl9pc0RpcmVjdGVkLFxuICAgIG11bHRpZ3JhcGg6IHRoaXMuX2lzTXVsdGlncmFwaCxcbiAgICBjb21wb3VuZDogdGhpcy5faXNDb21wb3VuZFxuICB9KTtcblxuICBjb3B5LnNldEdyYXBoKHRoaXMuZ3JhcGgoKSk7XG5cbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBfLmVhY2godGhpcy5fbm9kZXMsIGZ1bmN0aW9uKHZhbHVlLCB2KSB7XG4gICAgaWYgKGZpbHRlcih2KSkge1xuICAgICAgY29weS5zZXROb2RlKHYsIHZhbHVlKTtcbiAgICB9XG4gIH0pO1xuXG4gIF8uZWFjaCh0aGlzLl9lZGdlT2JqcywgZnVuY3Rpb24oZSkge1xuICAgIGlmIChjb3B5Lmhhc05vZGUoZS52KSAmJiBjb3B5Lmhhc05vZGUoZS53KSkge1xuICAgICAgY29weS5zZXRFZGdlKGUsIHNlbGYuZWRnZShlKSk7XG4gICAgfVxuICB9KTtcblxuICB2YXIgcGFyZW50cyA9IHt9O1xuICBmdW5jdGlvbiBmaW5kUGFyZW50KHYpIHtcbiAgICB2YXIgcGFyZW50ID0gc2VsZi5wYXJlbnQodik7XG4gICAgaWYgKHBhcmVudCA9PT0gdW5kZWZpbmVkIHx8IGNvcHkuaGFzTm9kZShwYXJlbnQpKSB7XG4gICAgICBwYXJlbnRzW3ZdID0gcGFyZW50O1xuICAgICAgcmV0dXJuIHBhcmVudDtcbiAgICB9IGVsc2UgaWYgKHBhcmVudCBpbiBwYXJlbnRzKSB7XG4gICAgICByZXR1cm4gcGFyZW50c1twYXJlbnRdO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmluZFBhcmVudChwYXJlbnQpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0aGlzLl9pc0NvbXBvdW5kKSB7XG4gICAgXy5lYWNoKGNvcHkubm9kZXMoKSwgZnVuY3Rpb24odikge1xuICAgICAgY29weS5zZXRQYXJlbnQodiwgZmluZFBhcmVudCh2KSk7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gY29weTtcbn07XG5cbi8qID09PSBFZGdlIGZ1bmN0aW9ucyA9PT09PT09PT09ICovXG5cbkdyYXBoLnByb3RvdHlwZS5zZXREZWZhdWx0RWRnZUxhYmVsID0gZnVuY3Rpb24obmV3RGVmYXVsdCkge1xuICBpZiAoIV8uaXNGdW5jdGlvbihuZXdEZWZhdWx0KSkge1xuICAgIG5ld0RlZmF1bHQgPSBfLmNvbnN0YW50KG5ld0RlZmF1bHQpO1xuICB9XG4gIHRoaXMuX2RlZmF1bHRFZGdlTGFiZWxGbiA9IG5ld0RlZmF1bHQ7XG4gIHJldHVybiB0aGlzO1xufTtcblxuR3JhcGgucHJvdG90eXBlLmVkZ2VDb3VudCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5fZWRnZUNvdW50O1xufTtcblxuR3JhcGgucHJvdG90eXBlLmVkZ2VzID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBfLnZhbHVlcyh0aGlzLl9lZGdlT2Jqcyk7XG59O1xuXG5HcmFwaC5wcm90b3R5cGUuc2V0UGF0aCA9IGZ1bmN0aW9uKHZzLCB2YWx1ZSkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICBfLnJlZHVjZSh2cywgZnVuY3Rpb24odiwgdykge1xuICAgIGlmIChhcmdzLmxlbmd0aCA+IDEpIHtcbiAgICAgIHNlbGYuc2V0RWRnZSh2LCB3LCB2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNlbGYuc2V0RWRnZSh2LCB3KTtcbiAgICB9XG4gICAgcmV0dXJuIHc7XG4gIH0pO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qXG4gKiBzZXRFZGdlKHYsIHcsIFt2YWx1ZSwgW25hbWVdXSlcbiAqIHNldEVkZ2UoeyB2LCB3LCBbbmFtZV0gfSwgW3ZhbHVlXSlcbiAqL1xuR3JhcGgucHJvdG90eXBlLnNldEVkZ2UgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHYsIHcsIG5hbWUsIHZhbHVlO1xuICB2YXIgdmFsdWVTcGVjaWZpZWQgPSBmYWxzZTtcbiAgdmFyIGFyZzAgPSBhcmd1bWVudHNbMF07XG5cbiAgaWYgKHR5cGVvZiBhcmcwID09PSBcIm9iamVjdFwiICYmIGFyZzAgIT09IG51bGwgJiYgXCJ2XCIgaW4gYXJnMCkge1xuICAgIHYgPSBhcmcwLnY7XG4gICAgdyA9IGFyZzAudztcbiAgICBuYW1lID0gYXJnMC5uYW1lO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyKSB7XG4gICAgICB2YWx1ZSA9IGFyZ3VtZW50c1sxXTtcbiAgICAgIHZhbHVlU3BlY2lmaWVkID0gdHJ1ZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdiA9IGFyZzA7XG4gICAgdyA9IGFyZ3VtZW50c1sxXTtcbiAgICBuYW1lID0gYXJndW1lbnRzWzNdO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMikge1xuICAgICAgdmFsdWUgPSBhcmd1bWVudHNbMl07XG4gICAgICB2YWx1ZVNwZWNpZmllZCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgdiA9IFwiXCIgKyB2O1xuICB3ID0gXCJcIiArIHc7XG4gIGlmICghXy5pc1VuZGVmaW5lZChuYW1lKSkge1xuICAgIG5hbWUgPSBcIlwiICsgbmFtZTtcbiAgfVxuXG4gIHZhciBlID0gZWRnZUFyZ3NUb0lkKHRoaXMuX2lzRGlyZWN0ZWQsIHYsIHcsIG5hbWUpO1xuICBpZiAoXy5oYXModGhpcy5fZWRnZUxhYmVscywgZSkpIHtcbiAgICBpZiAodmFsdWVTcGVjaWZpZWQpIHtcbiAgICAgIHRoaXMuX2VkZ2VMYWJlbHNbZV0gPSB2YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBpZiAoIV8uaXNVbmRlZmluZWQobmFtZSkgJiYgIXRoaXMuX2lzTXVsdGlncmFwaCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBzZXQgYSBuYW1lZCBlZGdlIHdoZW4gaXNNdWx0aWdyYXBoID0gZmFsc2VcIik7XG4gIH1cblxuICAvLyBJdCBkaWRuJ3QgZXhpc3QsIHNvIHdlIG5lZWQgdG8gY3JlYXRlIGl0LlxuICAvLyBGaXJzdCBlbnN1cmUgdGhlIG5vZGVzIGV4aXN0LlxuICB0aGlzLnNldE5vZGUodik7XG4gIHRoaXMuc2V0Tm9kZSh3KTtcblxuICB0aGlzLl9lZGdlTGFiZWxzW2VdID0gdmFsdWVTcGVjaWZpZWQgPyB2YWx1ZSA6IHRoaXMuX2RlZmF1bHRFZGdlTGFiZWxGbih2LCB3LCBuYW1lKTtcblxuICB2YXIgZWRnZU9iaiA9IGVkZ2VBcmdzVG9PYmoodGhpcy5faXNEaXJlY3RlZCwgdiwgdywgbmFtZSk7XG4gIC8vIEVuc3VyZSB3ZSBhZGQgdW5kaXJlY3RlZCBlZGdlcyBpbiBhIGNvbnNpc3RlbnQgd2F5LlxuICB2ID0gZWRnZU9iai52O1xuICB3ID0gZWRnZU9iai53O1xuXG4gIE9iamVjdC5mcmVlemUoZWRnZU9iaik7XG4gIHRoaXMuX2VkZ2VPYmpzW2VdID0gZWRnZU9iajtcbiAgaW5jcmVtZW50T3JJbml0RW50cnkodGhpcy5fcHJlZHNbd10sIHYpO1xuICBpbmNyZW1lbnRPckluaXRFbnRyeSh0aGlzLl9zdWNzW3ZdLCB3KTtcbiAgdGhpcy5faW5bd11bZV0gPSBlZGdlT2JqO1xuICB0aGlzLl9vdXRbdl1bZV0gPSBlZGdlT2JqO1xuICB0aGlzLl9lZGdlQ291bnQrKztcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5HcmFwaC5wcm90b3R5cGUuZWRnZSA9IGZ1bmN0aW9uKHYsIHcsIG5hbWUpIHtcbiAgdmFyIGUgPSAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMVxuICAgID8gZWRnZU9ialRvSWQodGhpcy5faXNEaXJlY3RlZCwgYXJndW1lbnRzWzBdKVxuICAgIDogZWRnZUFyZ3NUb0lkKHRoaXMuX2lzRGlyZWN0ZWQsIHYsIHcsIG5hbWUpKTtcbiAgcmV0dXJuIHRoaXMuX2VkZ2VMYWJlbHNbZV07XG59O1xuXG5HcmFwaC5wcm90b3R5cGUuaGFzRWRnZSA9IGZ1bmN0aW9uKHYsIHcsIG5hbWUpIHtcbiAgdmFyIGUgPSAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMVxuICAgID8gZWRnZU9ialRvSWQodGhpcy5faXNEaXJlY3RlZCwgYXJndW1lbnRzWzBdKVxuICAgIDogZWRnZUFyZ3NUb0lkKHRoaXMuX2lzRGlyZWN0ZWQsIHYsIHcsIG5hbWUpKTtcbiAgcmV0dXJuIF8uaGFzKHRoaXMuX2VkZ2VMYWJlbHMsIGUpO1xufTtcblxuR3JhcGgucHJvdG90eXBlLnJlbW92ZUVkZ2UgPSBmdW5jdGlvbih2LCB3LCBuYW1lKSB7XG4gIHZhciBlID0gKGFyZ3VtZW50cy5sZW5ndGggPT09IDFcbiAgICA/IGVkZ2VPYmpUb0lkKHRoaXMuX2lzRGlyZWN0ZWQsIGFyZ3VtZW50c1swXSlcbiAgICA6IGVkZ2VBcmdzVG9JZCh0aGlzLl9pc0RpcmVjdGVkLCB2LCB3LCBuYW1lKSk7XG4gIHZhciBlZGdlID0gdGhpcy5fZWRnZU9ianNbZV07XG4gIGlmIChlZGdlKSB7XG4gICAgdiA9IGVkZ2UudjtcbiAgICB3ID0gZWRnZS53O1xuICAgIGRlbGV0ZSB0aGlzLl9lZGdlTGFiZWxzW2VdO1xuICAgIGRlbGV0ZSB0aGlzLl9lZGdlT2Jqc1tlXTtcbiAgICBkZWNyZW1lbnRPclJlbW92ZUVudHJ5KHRoaXMuX3ByZWRzW3ddLCB2KTtcbiAgICBkZWNyZW1lbnRPclJlbW92ZUVudHJ5KHRoaXMuX3N1Y3Nbdl0sIHcpO1xuICAgIGRlbGV0ZSB0aGlzLl9pblt3XVtlXTtcbiAgICBkZWxldGUgdGhpcy5fb3V0W3ZdW2VdO1xuICAgIHRoaXMuX2VkZ2VDb3VudC0tO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuR3JhcGgucHJvdG90eXBlLmluRWRnZXMgPSBmdW5jdGlvbih2LCB1KSB7XG4gIHZhciBpblYgPSB0aGlzLl9pblt2XTtcbiAgaWYgKGluVikge1xuICAgIHZhciBlZGdlcyA9IF8udmFsdWVzKGluVik7XG4gICAgaWYgKCF1KSB7XG4gICAgICByZXR1cm4gZWRnZXM7XG4gICAgfVxuICAgIHJldHVybiBfLmZpbHRlcihlZGdlcywgZnVuY3Rpb24oZWRnZSkgeyByZXR1cm4gZWRnZS52ID09PSB1OyB9KTtcbiAgfVxufTtcblxuR3JhcGgucHJvdG90eXBlLm91dEVkZ2VzID0gZnVuY3Rpb24odiwgdykge1xuICB2YXIgb3V0ViA9IHRoaXMuX291dFt2XTtcbiAgaWYgKG91dFYpIHtcbiAgICB2YXIgZWRnZXMgPSBfLnZhbHVlcyhvdXRWKTtcbiAgICBpZiAoIXcpIHtcbiAgICAgIHJldHVybiBlZGdlcztcbiAgICB9XG4gICAgcmV0dXJuIF8uZmlsdGVyKGVkZ2VzLCBmdW5jdGlvbihlZGdlKSB7IHJldHVybiBlZGdlLncgPT09IHc7IH0pO1xuICB9XG59O1xuXG5HcmFwaC5wcm90b3R5cGUubm9kZUVkZ2VzID0gZnVuY3Rpb24odiwgdykge1xuICB2YXIgaW5FZGdlcyA9IHRoaXMuaW5FZGdlcyh2LCB3KTtcbiAgaWYgKGluRWRnZXMpIHtcbiAgICByZXR1cm4gaW5FZGdlcy5jb25jYXQodGhpcy5vdXRFZGdlcyh2LCB3KSk7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGluY3JlbWVudE9ySW5pdEVudHJ5KG1hcCwgaykge1xuICBpZiAobWFwW2tdKSB7XG4gICAgbWFwW2tdKys7XG4gIH0gZWxzZSB7XG4gICAgbWFwW2tdID0gMTtcbiAgfVxufVxuXG5mdW5jdGlvbiBkZWNyZW1lbnRPclJlbW92ZUVudHJ5KG1hcCwgaykge1xuICBpZiAoIS0tbWFwW2tdKSB7IGRlbGV0ZSBtYXBba107IH1cbn1cblxuZnVuY3Rpb24gZWRnZUFyZ3NUb0lkKGlzRGlyZWN0ZWQsIHZfLCB3XywgbmFtZSkge1xuICB2YXIgdiA9IFwiXCIgKyB2XztcbiAgdmFyIHcgPSBcIlwiICsgd187XG4gIGlmICghaXNEaXJlY3RlZCAmJiB2ID4gdykge1xuICAgIHZhciB0bXAgPSB2O1xuICAgIHYgPSB3O1xuICAgIHcgPSB0bXA7XG4gIH1cbiAgcmV0dXJuIHYgKyBFREdFX0tFWV9ERUxJTSArIHcgKyBFREdFX0tFWV9ERUxJTSArXG4gICAgICAgICAgICAgKF8uaXNVbmRlZmluZWQobmFtZSkgPyBERUZBVUxUX0VER0VfTkFNRSA6IG5hbWUpO1xufVxuXG5mdW5jdGlvbiBlZGdlQXJnc1RvT2JqKGlzRGlyZWN0ZWQsIHZfLCB3XywgbmFtZSkge1xuICB2YXIgdiA9IFwiXCIgKyB2XztcbiAgdmFyIHcgPSBcIlwiICsgd187XG4gIGlmICghaXNEaXJlY3RlZCAmJiB2ID4gdykge1xuICAgIHZhciB0bXAgPSB2O1xuICAgIHYgPSB3O1xuICAgIHcgPSB0bXA7XG4gIH1cbiAgdmFyIGVkZ2VPYmogPSAgeyB2OiB2LCB3OiB3IH07XG4gIGlmIChuYW1lKSB7XG4gICAgZWRnZU9iai5uYW1lID0gbmFtZTtcbiAgfVxuICByZXR1cm4gZWRnZU9iajtcbn1cblxuZnVuY3Rpb24gZWRnZU9ialRvSWQoaXNEaXJlY3RlZCwgZWRnZU9iaikge1xuICByZXR1cm4gZWRnZUFyZ3NUb0lkKGlzRGlyZWN0ZWQsIGVkZ2VPYmoudiwgZWRnZU9iai53LCBlZGdlT2JqLm5hbWUpO1xufVxuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///152\n')},function(module,exports,__webpack_require__){eval("var getNative = __webpack_require__(64),\n root = __webpack_require__(47);\n\n/* Built-in method references that are verified to be native. */\nvar Map = getNative(root, 'Map');\n\nmodule.exports = Map;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19NYXAuanM/NzliYyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxnQkFBZ0IsbUJBQU8sQ0FBQyxFQUFjO0FBQ3RDLFdBQVcsbUJBQU8sQ0FBQyxFQUFTOztBQUU1QjtBQUNBOztBQUVBIiwiZmlsZSI6IjE1My5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBnZXROYXRpdmUgPSByZXF1aXJlKCcuL19nZXROYXRpdmUnKSxcbiAgICByb290ID0gcmVxdWlyZSgnLi9fcm9vdCcpO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB0aGF0IGFyZSB2ZXJpZmllZCB0byBiZSBuYXRpdmUuICovXG52YXIgTWFwID0gZ2V0TmF0aXZlKHJvb3QsICdNYXAnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBNYXA7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///153\n")},function(module,exports,__webpack_require__){eval("var mapCacheClear = __webpack_require__(340),\n mapCacheDelete = __webpack_require__(347),\n mapCacheGet = __webpack_require__(349),\n mapCacheHas = __webpack_require__(350),\n mapCacheSet = __webpack_require__(351);\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\nmodule.exports = MapCache;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19NYXBDYWNoZS5qcz83YjgzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLG9CQUFvQixtQkFBTyxDQUFDLEdBQWtCO0FBQzlDLHFCQUFxQixtQkFBTyxDQUFDLEdBQW1CO0FBQ2hELGtCQUFrQixtQkFBTyxDQUFDLEdBQWdCO0FBQzFDLGtCQUFrQixtQkFBTyxDQUFDLEdBQWdCO0FBQzFDLGtCQUFrQixtQkFBTyxDQUFDLEdBQWdCOztBQUUxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxNQUFNO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJmaWxlIjoiMTU0LmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIG1hcENhY2hlQ2xlYXIgPSByZXF1aXJlKCcuL19tYXBDYWNoZUNsZWFyJyksXG4gICAgbWFwQ2FjaGVEZWxldGUgPSByZXF1aXJlKCcuL19tYXBDYWNoZURlbGV0ZScpLFxuICAgIG1hcENhY2hlR2V0ID0gcmVxdWlyZSgnLi9fbWFwQ2FjaGVHZXQnKSxcbiAgICBtYXBDYWNoZUhhcyA9IHJlcXVpcmUoJy4vX21hcENhY2hlSGFzJyksXG4gICAgbWFwQ2FjaGVTZXQgPSByZXF1aXJlKCcuL19tYXBDYWNoZVNldCcpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBtYXAgY2FjaGUgb2JqZWN0IHRvIHN0b3JlIGtleS12YWx1ZSBwYWlycy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge0FycmF5fSBbZW50cmllc10gVGhlIGtleS12YWx1ZSBwYWlycyB0byBjYWNoZS5cbiAqL1xuZnVuY3Rpb24gTWFwQ2FjaGUoZW50cmllcykge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGVudHJpZXMgPT0gbnVsbCA/IDAgOiBlbnRyaWVzLmxlbmd0aDtcblxuICB0aGlzLmNsZWFyKCk7XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIGVudHJ5ID0gZW50cmllc1tpbmRleF07XG4gICAgdGhpcy5zZXQoZW50cnlbMF0sIGVudHJ5WzFdKTtcbiAgfVxufVxuXG4vLyBBZGQgbWV0aG9kcyB0byBgTWFwQ2FjaGVgLlxuTWFwQ2FjaGUucHJvdG90eXBlLmNsZWFyID0gbWFwQ2FjaGVDbGVhcjtcbk1hcENhY2hlLnByb3RvdHlwZVsnZGVsZXRlJ10gPSBtYXBDYWNoZURlbGV0ZTtcbk1hcENhY2hlLnByb3RvdHlwZS5nZXQgPSBtYXBDYWNoZUdldDtcbk1hcENhY2hlLnByb3RvdHlwZS5oYXMgPSBtYXBDYWNoZUhhcztcbk1hcENhY2hlLnByb3RvdHlwZS5zZXQgPSBtYXBDYWNoZVNldDtcblxubW9kdWxlLmV4cG9ydHMgPSBNYXBDYWNoZTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///154\n")},function(module,exports){eval("/**\n * A specialized version of `_.forEach` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns `array`.\n */\nfunction arrayEach(array, iteratee) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (iteratee(array[index], index, array) === false) {\n break;\n }\n }\n return array;\n}\n\nmodule.exports = arrayEach;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19hcnJheUVhY2guanM/ODA1NyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxNQUFNO0FBQ2pCLFdBQVcsU0FBUztBQUNwQixhQUFhLE1BQU07QUFDbkI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJmaWxlIjoiMTU1LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uZm9yRWFjaGAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yXG4gKiBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gKi9cbmZ1bmN0aW9uIGFycmF5RWFjaChhcnJheSwgaXRlcmF0ZWUpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIGlmIChpdGVyYXRlZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkgPT09IGZhbHNlKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGFycmF5O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFycmF5RWFjaDtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///155\n")},function(module,exports){eval('module.exports = function(module) {\n\tif (!module.webpackPolyfill) {\n\t\tmodule.deprecate = function() {};\n\t\tmodule.paths = [];\n\t\t// module.parent = undefined by default\n\t\tif (!module.children) module.children = [];\n\t\tObject.defineProperty(module, "loaded", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.l;\n\t\t\t}\n\t\t});\n\t\tObject.defineProperty(module, "id", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.i;\n\t\t\t}\n\t\t});\n\t\tmodule.webpackPolyfill = 1;\n\t}\n\treturn module;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vKHdlYnBhY2spL2J1aWxkaW4vbW9kdWxlLmpzP2NlZDIiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6IjE1Ni5qcyIsInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24obW9kdWxlKSB7XG5cdGlmICghbW9kdWxlLndlYnBhY2tQb2x5ZmlsbCkge1xuXHRcdG1vZHVsZS5kZXByZWNhdGUgPSBmdW5jdGlvbigpIHt9O1xuXHRcdG1vZHVsZS5wYXRocyA9IFtdO1xuXHRcdC8vIG1vZHVsZS5wYXJlbnQgPSB1bmRlZmluZWQgYnkgZGVmYXVsdFxuXHRcdGlmICghbW9kdWxlLmNoaWxkcmVuKSBtb2R1bGUuY2hpbGRyZW4gPSBbXTtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLCBcImxvYWRlZFwiLCB7XG5cdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0Z2V0OiBmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuIG1vZHVsZS5sO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtb2R1bGUsIFwiaWRcIiwge1xuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdGdldDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiBtb2R1bGUuaTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRtb2R1bGUud2VicGFja1BvbHlmaWxsID0gMTtcblx0fVxuXHRyZXR1cm4gbW9kdWxlO1xufTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///156\n')},function(module,exports){eval("/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n return typeof value == 'number' &&\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\nmodule.exports = isLength;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzTGVuZ3RoLmpzP2IyMTgiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsRUFBRTtBQUNiLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJmaWxlIjoiMTU3LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgTUFYX1NBRkVfSU5URUdFUiA9IDkwMDcxOTkyNTQ3NDA5OTE7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBhcnJheS1saWtlIGxlbmd0aC5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgbG9vc2VseSBiYXNlZCBvblxuICogW2BUb0xlbmd0aGBdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXRvbGVuZ3RoKS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGxlbmd0aCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzTGVuZ3RoKDMpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNMZW5ndGgoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNMZW5ndGgoSW5maW5pdHkpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzTGVuZ3RoKCczJyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0xlbmd0aCh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdudW1iZXInICYmXG4gICAgdmFsdWUgPiAtMSAmJiB2YWx1ZSAlIDEgPT0gMCAmJiB2YWx1ZSA8PSBNQVhfU0FGRV9JTlRFR0VSO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzTGVuZ3RoO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///157\n")},function(module,exports,__webpack_require__){eval("/* WEBPACK VAR INJECTION */(function(module) {var freeGlobal = __webpack_require__(186);\n\n/** Detect free variable `exports`. */\nvar freeExports = true && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Detect free variable `process` from Node.js. */\nvar freeProcess = moduleExports && freeGlobal.process;\n\n/** Used to access faster Node.js helpers. */\nvar nodeUtil = (function() {\n try {\n // Use `util.types` for Node.js 10+.\n var types = freeModule && freeModule.require && freeModule.require('util').types;\n\n if (types) {\n return types;\n }\n\n // Legacy `process.binding('util')` for Node.js < 10.\n return freeProcess && freeProcess.binding && freeProcess.binding('util');\n } catch (e) {}\n}());\n\nmodule.exports = nodeUtil;\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(156)(module)))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19ub2RlVXRpbC5qcz85OWQzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtEQUFpQixtQkFBTyxDQUFDLEdBQWU7O0FBRXhDO0FBQ0Esa0JBQWtCLEtBQTBCOztBQUU1QztBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNILENBQUM7O0FBRUQiLCJmaWxlIjoiMTU4LmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIGZyZWVHbG9iYWwgPSByZXF1aXJlKCcuL19mcmVlR2xvYmFsJyk7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgZXhwb3J0c2AuICovXG52YXIgZnJlZUV4cG9ydHMgPSB0eXBlb2YgZXhwb3J0cyA9PSAnb2JqZWN0JyAmJiBleHBvcnRzICYmICFleHBvcnRzLm5vZGVUeXBlICYmIGV4cG9ydHM7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgbW9kdWxlYC4gKi9cbnZhciBmcmVlTW9kdWxlID0gZnJlZUV4cG9ydHMgJiYgdHlwZW9mIG1vZHVsZSA9PSAnb2JqZWN0JyAmJiBtb2R1bGUgJiYgIW1vZHVsZS5ub2RlVHlwZSAmJiBtb2R1bGU7XG5cbi8qKiBEZXRlY3QgdGhlIHBvcHVsYXIgQ29tbW9uSlMgZXh0ZW5zaW9uIGBtb2R1bGUuZXhwb3J0c2AuICovXG52YXIgbW9kdWxlRXhwb3J0cyA9IGZyZWVNb2R1bGUgJiYgZnJlZU1vZHVsZS5leHBvcnRzID09PSBmcmVlRXhwb3J0cztcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBwcm9jZXNzYCBmcm9tIE5vZGUuanMuICovXG52YXIgZnJlZVByb2Nlc3MgPSBtb2R1bGVFeHBvcnRzICYmIGZyZWVHbG9iYWwucHJvY2VzcztcblxuLyoqIFVzZWQgdG8gYWNjZXNzIGZhc3RlciBOb2RlLmpzIGhlbHBlcnMuICovXG52YXIgbm9kZVV0aWwgPSAoZnVuY3Rpb24oKSB7XG4gIHRyeSB7XG4gICAgLy8gVXNlIGB1dGlsLnR5cGVzYCBmb3IgTm9kZS5qcyAxMCsuXG4gICAgdmFyIHR5cGVzID0gZnJlZU1vZHVsZSAmJiBmcmVlTW9kdWxlLnJlcXVpcmUgJiYgZnJlZU1vZHVsZS5yZXF1aXJlKCd1dGlsJykudHlwZXM7XG5cbiAgICBpZiAodHlwZXMpIHtcbiAgICAgIHJldHVybiB0eXBlcztcbiAgICB9XG5cbiAgICAvLyBMZWdhY3kgYHByb2Nlc3MuYmluZGluZygndXRpbCcpYCBmb3IgTm9kZS5qcyA8IDEwLlxuICAgIHJldHVybiBmcmVlUHJvY2VzcyAmJiBmcmVlUHJvY2Vzcy5iaW5kaW5nICYmIGZyZWVQcm9jZXNzLmJpbmRpbmcoJ3V0aWwnKTtcbiAgfSBjYXRjaCAoZSkge31cbn0oKSk7XG5cbm1vZHVsZS5leHBvcnRzID0gbm9kZVV0aWw7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///158\n")},function(module,exports,__webpack_require__){eval("var isPrototype = __webpack_require__(108),\n nativeKeys = __webpack_require__(357);\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeys(object) {\n if (!isPrototype(object)) {\n return nativeKeys(object);\n }\n var result = [];\n for (var key in Object(object)) {\n if (hasOwnProperty.call(object, key) && key != 'constructor') {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = baseKeys;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlS2V5cy5qcz8wM2RkIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGtCQUFrQixtQkFBTyxDQUFDLEdBQWdCO0FBQzFDLGlCQUFpQixtQkFBTyxDQUFDLEdBQWU7O0FBRXhDO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixhQUFhLE1BQU07QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJmaWxlIjoiMTU5LmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIGlzUHJvdG90eXBlID0gcmVxdWlyZSgnLi9faXNQcm90b3R5cGUnKSxcbiAgICBuYXRpdmVLZXlzID0gcmVxdWlyZSgnLi9fbmF0aXZlS2V5cycpO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmtleXNgIHdoaWNoIGRvZXNuJ3QgdHJlYXQgc3BhcnNlIGFycmF5cyBhcyBkZW5zZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAqL1xuZnVuY3Rpb24gYmFzZUtleXMob2JqZWN0KSB7XG4gIGlmICghaXNQcm90b3R5cGUob2JqZWN0KSkge1xuICAgIHJldHVybiBuYXRpdmVLZXlzKG9iamVjdCk7XG4gIH1cbiAgdmFyIHJlc3VsdCA9IFtdO1xuICBmb3IgKHZhciBrZXkgaW4gT2JqZWN0KG9iamVjdCkpIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkgJiYga2V5ICE9ICdjb25zdHJ1Y3RvcicpIHtcbiAgICAgIHJlc3VsdC5wdXNoKGtleSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUtleXM7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///159\n")},function(module,exports,__webpack_require__){eval("var arrayFilter = __webpack_require__(194),\n stubArray = __webpack_require__(195);\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeGetSymbols = Object.getOwnPropertySymbols;\n\n/**\n * Creates an array of the own enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\nvar getSymbols = !nativeGetSymbols ? stubArray : function(object) {\n if (object == null) {\n return [];\n }\n object = Object(object);\n return arrayFilter(nativeGetSymbols(object), function(symbol) {\n return propertyIsEnumerable.call(object, symbol);\n });\n};\n\nmodule.exports = getSymbols;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19nZXRTeW1ib2xzLmpzPzMyZjQiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsa0JBQWtCLG1CQUFPLENBQUMsR0FBZ0I7QUFDMUMsZ0JBQWdCLG1CQUFPLENBQUMsR0FBYTs7QUFFckM7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsYUFBYSxNQUFNO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUEiLCJmaWxlIjoiMTYwLmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIGFycmF5RmlsdGVyID0gcmVxdWlyZSgnLi9fYXJyYXlGaWx0ZXInKSxcbiAgICBzdHViQXJyYXkgPSByZXF1aXJlKCcuL3N0dWJBcnJheScpO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBwcm9wZXJ0eUlzRW51bWVyYWJsZSA9IG9iamVjdFByb3RvLnByb3BlcnR5SXNFbnVtZXJhYmxlO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlR2V0U3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGVudW1lcmFibGUgc3ltYm9scyBvZiBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBzeW1ib2xzLlxuICovXG52YXIgZ2V0U3ltYm9scyA9ICFuYXRpdmVHZXRTeW1ib2xzID8gc3R1YkFycmF5IDogZnVuY3Rpb24ob2JqZWN0KSB7XG4gIGlmIChvYmplY3QgPT0gbnVsbCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBvYmplY3QgPSBPYmplY3Qob2JqZWN0KTtcbiAgcmV0dXJuIGFycmF5RmlsdGVyKG5hdGl2ZUdldFN5bWJvbHMob2JqZWN0KSwgZnVuY3Rpb24oc3ltYm9sKSB7XG4gICAgcmV0dXJuIHByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwob2JqZWN0LCBzeW1ib2wpO1xuICB9KTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0U3ltYm9scztcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///160\n")},function(module,exports){eval("/**\n * Appends the elements of `values` to `array`.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to append.\n * @returns {Array} Returns `array`.\n */\nfunction arrayPush(array, values) {\n var index = -1,\n length = values.length,\n offset = array.length;\n\n while (++index < length) {\n array[offset + index] = values[index];\n }\n return array;\n}\n\nmodule.exports = arrayPush;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19hcnJheVB1c2guanM/MDg3ZCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsTUFBTTtBQUNqQixXQUFXLE1BQU07QUFDakIsYUFBYSxNQUFNO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsImZpbGUiOiIxNjEuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEFwcGVuZHMgdGhlIGVsZW1lbnRzIG9mIGB2YWx1ZXNgIHRvIGBhcnJheWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge0FycmF5fSB2YWx1ZXMgVGhlIHZhbHVlcyB0byBhcHBlbmQuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAqL1xuZnVuY3Rpb24gYXJyYXlQdXNoKGFycmF5LCB2YWx1ZXMpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSB2YWx1ZXMubGVuZ3RoLFxuICAgICAgb2Zmc2V0ID0gYXJyYXkubGVuZ3RoO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgYXJyYXlbb2Zmc2V0ICsgaW5kZXhdID0gdmFsdWVzW2luZGV4XTtcbiAgfVxuICByZXR1cm4gYXJyYXk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXJyYXlQdXNoO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///161\n")},function(module,exports,__webpack_require__){eval("var Uint8Array = __webpack_require__(200);\n\n/**\n * Creates a clone of `arrayBuffer`.\n *\n * @private\n * @param {ArrayBuffer} arrayBuffer The array buffer to clone.\n * @returns {ArrayBuffer} Returns the cloned array buffer.\n */\nfunction cloneArrayBuffer(arrayBuffer) {\n var result = new arrayBuffer.constructor(arrayBuffer.byteLength);\n new Uint8Array(result).set(new Uint8Array(arrayBuffer));\n return result;\n}\n\nmodule.exports = cloneArrayBuffer;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jbG9uZUFycmF5QnVmZmVyLmpzP2Y4YWYiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsaUJBQWlCLG1CQUFPLENBQUMsR0FBZTs7QUFFeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFlBQVk7QUFDdkIsYUFBYSxZQUFZO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsImZpbGUiOiIxNjIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgVWludDhBcnJheSA9IHJlcXVpcmUoJy4vX1VpbnQ4QXJyYXknKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgY2xvbmUgb2YgYGFycmF5QnVmZmVyYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheUJ1ZmZlcn0gYXJyYXlCdWZmZXIgVGhlIGFycmF5IGJ1ZmZlciB0byBjbG9uZS5cbiAqIEByZXR1cm5zIHtBcnJheUJ1ZmZlcn0gUmV0dXJucyB0aGUgY2xvbmVkIGFycmF5IGJ1ZmZlci5cbiAqL1xuZnVuY3Rpb24gY2xvbmVBcnJheUJ1ZmZlcihhcnJheUJ1ZmZlcikge1xuICB2YXIgcmVzdWx0ID0gbmV3IGFycmF5QnVmZmVyLmNvbnN0cnVjdG9yKGFycmF5QnVmZmVyLmJ5dGVMZW5ndGgpO1xuICBuZXcgVWludDhBcnJheShyZXN1bHQpLnNldChuZXcgVWludDhBcnJheShhcnJheUJ1ZmZlcikpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNsb25lQXJyYXlCdWZmZXI7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///162\n")},function(module,exports){eval("/**\n * Creates a function that returns `value`.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {*} value The value to return from the new function.\n * @returns {Function} Returns the new constant function.\n * @example\n *\n * var objects = _.times(2, _.constant({ 'a': 1 }));\n *\n * console.log(objects);\n * // => [{ 'a': 1 }, { 'a': 1 }]\n *\n * console.log(objects[0] === objects[1]);\n * // => true\n */\nfunction constant(value) {\n return function() {\n return value;\n };\n}\n\nmodule.exports = constant;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL2NvbnN0YW50LmpzPzcyZjAiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEVBQUU7QUFDYixhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBLHdDQUF3QyxTQUFTO0FBQ2pEO0FBQ0E7QUFDQSxXQUFXLFNBQVMsR0FBRyxTQUFTO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsImZpbGUiOiIxNjMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYHZhbHVlYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDIuNC4wXG4gKiBAY2F0ZWdvcnkgVXRpbFxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcmV0dXJuIGZyb20gdGhlIG5ldyBmdW5jdGlvbi5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGNvbnN0YW50IGZ1bmN0aW9uLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0cyA9IF8udGltZXMoMiwgXy5jb25zdGFudCh7ICdhJzogMSB9KSk7XG4gKlxuICogY29uc29sZS5sb2cob2JqZWN0cyk7XG4gKiAvLyA9PiBbeyAnYSc6IDEgfSwgeyAnYSc6IDEgfV1cbiAqXG4gKiBjb25zb2xlLmxvZyhvYmplY3RzWzBdID09PSBvYmplY3RzWzFdKTtcbiAqIC8vID0+IHRydWVcbiAqL1xuZnVuY3Rpb24gY29uc3RhbnQodmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjb25zdGFudDtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///163\n")},function(module,exports,__webpack_require__){eval("var baseFor = __webpack_require__(165),\n keys = __webpack_require__(59);\n\n/**\n * The base implementation of `_.forOwn` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Object} Returns `object`.\n */\nfunction baseForOwn(object, iteratee) {\n return object && baseFor(object, iteratee, keys);\n}\n\nmodule.exports = baseForOwn;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlRm9yT3duLmpzPzI0MmUiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxtQkFBTyxDQUFDLEdBQVk7QUFDbEMsV0FBVyxtQkFBTyxDQUFDLEVBQVE7O0FBRTNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsU0FBUztBQUNwQixhQUFhLE9BQU87QUFDcEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJmaWxlIjoiMTY0LmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIGJhc2VGb3IgPSByZXF1aXJlKCcuL19iYXNlRm9yJyksXG4gICAga2V5cyA9IHJlcXVpcmUoJy4va2V5cycpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZvck93bmAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VGb3JPd24ob2JqZWN0LCBpdGVyYXRlZSkge1xuICByZXR1cm4gb2JqZWN0ICYmIGJhc2VGb3Iob2JqZWN0LCBpdGVyYXRlZSwga2V5cyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUZvck93bjtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///164\n")},function(module,exports,__webpack_require__){eval("var createBaseFor = __webpack_require__(376);\n\n/**\n * The base implementation of `baseForOwn` which iterates over `object`\n * properties returned by `keysFunc` and invokes `iteratee` for each property.\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @returns {Object} Returns `object`.\n */\nvar baseFor = createBaseFor();\n\nmodule.exports = baseFor;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlRm9yLmpzPzcyYWYiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsb0JBQW9CLG1CQUFPLENBQUMsR0FBa0I7O0FBRTlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixXQUFXLFNBQVM7QUFDcEIsV0FBVyxTQUFTO0FBQ3BCLGFBQWEsT0FBTztBQUNwQjtBQUNBOztBQUVBIiwiZmlsZSI6IjE2NS5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBjcmVhdGVCYXNlRm9yID0gcmVxdWlyZSgnLi9fY3JlYXRlQmFzZUZvcicpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBiYXNlRm9yT3duYCB3aGljaCBpdGVyYXRlcyBvdmVyIGBvYmplY3RgXG4gKiBwcm9wZXJ0aWVzIHJldHVybmVkIGJ5IGBrZXlzRnVuY2AgYW5kIGludm9rZXMgYGl0ZXJhdGVlYCBmb3IgZWFjaCBwcm9wZXJ0eS5cbiAqIEl0ZXJhdGVlIGZ1bmN0aW9ucyBtYXkgZXhpdCBpdGVyYXRpb24gZWFybHkgYnkgZXhwbGljaXRseSByZXR1cm5pbmcgYGZhbHNlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBrZXlzRnVuYyBUaGUgZnVuY3Rpb24gdG8gZ2V0IHRoZSBrZXlzIG9mIGBvYmplY3RgLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAqL1xudmFyIGJhc2VGb3IgPSBjcmVhdGVCYXNlRm9yKCk7XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUZvcjtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///165\n")},function(module,exports){eval("/**\n * Converts `set` to an array of its values.\n *\n * @private\n * @param {Object} set The set to convert.\n * @returns {Array} Returns the values.\n */\nfunction setToArray(set) {\n var index = -1,\n result = Array(set.size);\n\n set.forEach(function(value) {\n result[++index] = value;\n });\n return result;\n}\n\nmodule.exports = setToArray;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19zZXRUb0FycmF5LmpzP2FjNDEiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsYUFBYSxNQUFNO0FBQ25CO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQSIsImZpbGUiOiIxNjYuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvbnZlcnRzIGBzZXRgIHRvIGFuIGFycmF5IG9mIGl0cyB2YWx1ZXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBzZXQgVGhlIHNldCB0byBjb252ZXJ0LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSB2YWx1ZXMuXG4gKi9cbmZ1bmN0aW9uIHNldFRvQXJyYXkoc2V0KSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgcmVzdWx0ID0gQXJyYXkoc2V0LnNpemUpO1xuXG4gIHNldC5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgcmVzdWx0WysraW5kZXhdID0gdmFsdWU7XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNldFRvQXJyYXk7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///166\n")},function(module,exports,__webpack_require__){eval("var isArray = __webpack_require__(31),\n isSymbol = __webpack_require__(76);\n\n/** Used to match property names within property paths. */\nvar reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n reIsPlainProp = /^\\w*$/;\n\n/**\n * Checks if `value` is a property name and not a property path.\n *\n * @private\n * @param {*} value The value to check.\n * @param {Object} [object] The object to query keys on.\n * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n */\nfunction isKey(value, object) {\n if (isArray(value)) {\n return false;\n }\n var type = typeof value;\n if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n value == null || isSymbol(value)) {\n return true;\n }\n return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n (object != null && value in Object(object));\n}\n\nmodule.exports = isKey;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19pc0tleS5qcz9mNjA4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsbUJBQU8sQ0FBQyxFQUFXO0FBQ2pDLGVBQWUsbUJBQU8sQ0FBQyxFQUFZOztBQUVuQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEVBQUU7QUFDYixXQUFXLE9BQU87QUFDbEIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwiZmlsZSI6IjE2Ny5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5JyksXG4gICAgaXNTeW1ib2wgPSByZXF1aXJlKCcuL2lzU3ltYm9sJyk7XG5cbi8qKiBVc2VkIHRvIG1hdGNoIHByb3BlcnR5IG5hbWVzIHdpdGhpbiBwcm9wZXJ0eSBwYXRocy4gKi9cbnZhciByZUlzRGVlcFByb3AgPSAvXFwufFxcWyg/OlteW1xcXV0qfChbXCInXSkoPzooPyFcXDEpW15cXFxcXXxcXFxcLikqP1xcMSlcXF0vLFxuICAgIHJlSXNQbGFpblByb3AgPSAvXlxcdyokLztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHByb3BlcnR5IG5hbWUgYW5kIG5vdCBhIHByb3BlcnR5IHBhdGguXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBvYmplY3QgdG8gcXVlcnkga2V5cyBvbi5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgcHJvcGVydHkgbmFtZSwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc0tleSh2YWx1ZSwgb2JqZWN0KSB7XG4gIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgaWYgKHR5cGUgPT0gJ251bWJlcicgfHwgdHlwZSA9PSAnc3ltYm9sJyB8fCB0eXBlID09ICdib29sZWFuJyB8fFxuICAgICAgdmFsdWUgPT0gbnVsbCB8fCBpc1N5bWJvbCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gcmVJc1BsYWluUHJvcC50ZXN0KHZhbHVlKSB8fCAhcmVJc0RlZXBQcm9wLnRlc3QodmFsdWUpIHx8XG4gICAgKG9iamVjdCAhPSBudWxsICYmIHZhbHVlIGluIE9iamVjdChvYmplY3QpKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0tleTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///167\n")},function(module,exports,__webpack_require__){eval("var arrayPush = __webpack_require__(161),\n isFlattenable = __webpack_require__(410);\n\n/**\n * The base implementation of `_.flatten` with support for restricting flattening.\n *\n * @private\n * @param {Array} array The array to flatten.\n * @param {number} depth The maximum recursion depth.\n * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.\n * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.\n * @param {Array} [result=[]] The initial result value.\n * @returns {Array} Returns the new flattened array.\n */\nfunction baseFlatten(array, depth, predicate, isStrict, result) {\n var index = -1,\n length = array.length;\n\n predicate || (predicate = isFlattenable);\n result || (result = []);\n\n while (++index < length) {\n var value = array[index];\n if (depth > 0 && predicate(value)) {\n if (depth > 1) {\n // Recursively flatten arrays (susceptible to call stack limits).\n baseFlatten(value, depth - 1, predicate, isStrict, result);\n } else {\n arrayPush(result, value);\n }\n } else if (!isStrict) {\n result[result.length] = value;\n }\n }\n return result;\n}\n\nmodule.exports = baseFlatten;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlRmxhdHRlbi5qcz81YzY5Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGdCQUFnQixtQkFBTyxDQUFDLEdBQWM7QUFDdEMsb0JBQW9CLG1CQUFPLENBQUMsR0FBa0I7O0FBRTlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxNQUFNO0FBQ2pCLFdBQVcsT0FBTztBQUNsQixXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CLFdBQVcsTUFBTTtBQUNqQixhQUFhLE1BQU07QUFDbkI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwiZmlsZSI6IjE2OC5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBhcnJheVB1c2ggPSByZXF1aXJlKCcuL19hcnJheVB1c2gnKSxcbiAgICBpc0ZsYXR0ZW5hYmxlID0gcmVxdWlyZSgnLi9faXNGbGF0dGVuYWJsZScpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZsYXR0ZW5gIHdpdGggc3VwcG9ydCBmb3IgcmVzdHJpY3RpbmcgZmxhdHRlbmluZy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGZsYXR0ZW4uXG4gKiBAcGFyYW0ge251bWJlcn0gZGVwdGggVGhlIG1heGltdW0gcmVjdXJzaW9uIGRlcHRoLlxuICogQHBhcmFtIHtib29sZWFufSBbcHJlZGljYXRlPWlzRmxhdHRlbmFibGVdIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtpc1N0cmljdF0gUmVzdHJpY3QgdG8gdmFsdWVzIHRoYXQgcGFzcyBgcHJlZGljYXRlYCBjaGVja3MuXG4gKiBAcGFyYW0ge0FycmF5fSBbcmVzdWx0PVtdXSBUaGUgaW5pdGlhbCByZXN1bHQgdmFsdWUuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmbGF0dGVuZWQgYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIGJhc2VGbGF0dGVuKGFycmF5LCBkZXB0aCwgcHJlZGljYXRlLCBpc1N0cmljdCwgcmVzdWx0KSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gIHByZWRpY2F0ZSB8fCAocHJlZGljYXRlID0gaXNGbGF0dGVuYWJsZSk7XG4gIHJlc3VsdCB8fCAocmVzdWx0ID0gW10pO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdO1xuICAgIGlmIChkZXB0aCA+IDAgJiYgcHJlZGljYXRlKHZhbHVlKSkge1xuICAgICAgaWYgKGRlcHRoID4gMSkge1xuICAgICAgICAvLyBSZWN1cnNpdmVseSBmbGF0dGVuIGFycmF5cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgICAgICBiYXNlRmxhdHRlbih2YWx1ZSwgZGVwdGggLSAxLCBwcmVkaWNhdGUsIGlzU3RyaWN0LCByZXN1bHQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXJyYXlQdXNoKHJlc3VsdCwgdmFsdWUpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIWlzU3RyaWN0KSB7XG4gICAgICByZXN1bHRbcmVzdWx0Lmxlbmd0aF0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlRmxhdHRlbjtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///168\n")},function(module,exports,__webpack_require__){eval("var isSymbol = __webpack_require__(76);\n\n/**\n * The base implementation of methods like `_.max` and `_.min` which accepts a\n * `comparator` to determine the extremum value.\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} iteratee The iteratee invoked per iteration.\n * @param {Function} comparator The comparator used to compare values.\n * @returns {*} Returns the extremum value.\n */\nfunction baseExtremum(array, iteratee, comparator) {\n var index = -1,\n length = array.length;\n\n while (++index < length) {\n var value = array[index],\n current = iteratee(value);\n\n if (current != null && (computed === undefined\n ? (current === current && !isSymbol(current))\n : comparator(current, computed)\n )) {\n var computed = current,\n result = value;\n }\n }\n return result;\n}\n\nmodule.exports = baseExtremum;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlRXh0cmVtdW0uanM/NzZlOSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxlQUFlLG1CQUFPLENBQUMsRUFBWTs7QUFFbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsTUFBTTtBQUNqQixXQUFXLFNBQVM7QUFDcEIsV0FBVyxTQUFTO0FBQ3BCLGFBQWEsRUFBRTtBQUNmO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsImZpbGUiOiIxNjkuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgaXNTeW1ib2wgPSByZXF1aXJlKCcuL2lzU3ltYm9sJyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgbWV0aG9kcyBsaWtlIGBfLm1heGAgYW5kIGBfLm1pbmAgd2hpY2ggYWNjZXB0cyBhXG4gKiBgY29tcGFyYXRvcmAgdG8gZGV0ZXJtaW5lIHRoZSBleHRyZW11bSB2YWx1ZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjb21wYXJhdG9yIFRoZSBjb21wYXJhdG9yIHVzZWQgdG8gY29tcGFyZSB2YWx1ZXMuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZXh0cmVtdW0gdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGJhc2VFeHRyZW11bShhcnJheSwgaXRlcmF0ZWUsIGNvbXBhcmF0b3IpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF0sXG4gICAgICAgIGN1cnJlbnQgPSBpdGVyYXRlZSh2YWx1ZSk7XG5cbiAgICBpZiAoY3VycmVudCAhPSBudWxsICYmIChjb21wdXRlZCA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyAoY3VycmVudCA9PT0gY3VycmVudCAmJiAhaXNTeW1ib2woY3VycmVudCkpXG4gICAgICAgICAgOiBjb21wYXJhdG9yKGN1cnJlbnQsIGNvbXB1dGVkKVxuICAgICAgICApKSB7XG4gICAgICB2YXIgY29tcHV0ZWQgPSBjdXJyZW50LFxuICAgICAgICAgIHJlc3VsdCA9IHZhbHVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VFeHRyZW11bTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///169\n")},function(module,exports,__webpack_require__){"use strict";eval('\nObject.defineProperty(exports, "__esModule", { value: true });\nexports.BindingOnSyntax = void 0;\nvar binding_when_syntax_1 = __webpack_require__(171);\nvar BindingOnSyntax = (function () {\n function BindingOnSyntax(binding) {\n this._binding = binding;\n }\n BindingOnSyntax.prototype.onActivation = function (handler) {\n this._binding.onActivation = handler;\n return new binding_when_syntax_1.BindingWhenSyntax(this._binding);\n };\n return BindingOnSyntax;\n}());\nexports.BindingOnSyntax = BindingOnSyntax;\n//# sourceMappingURL=binding_on_syntax.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaW52ZXJzaWZ5L2xpYi9zeW50YXgvYmluZGluZ19vbl9zeW50YXguanM/ZTM0ZSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBYTtBQUNiLDhDQUE4QyxjQUFjO0FBQzVEO0FBQ0EsNEJBQTRCLG1CQUFPLENBQUMsR0FBdUI7QUFDM0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0EiLCJmaWxlIjoiMTcwLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkJpbmRpbmdPblN5bnRheCA9IHZvaWQgMDtcbnZhciBiaW5kaW5nX3doZW5fc3ludGF4XzEgPSByZXF1aXJlKFwiLi9iaW5kaW5nX3doZW5fc3ludGF4XCIpO1xudmFyIEJpbmRpbmdPblN5bnRheCA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQmluZGluZ09uU3ludGF4KGJpbmRpbmcpIHtcbiAgICAgICAgdGhpcy5fYmluZGluZyA9IGJpbmRpbmc7XG4gICAgfVxuICAgIEJpbmRpbmdPblN5bnRheC5wcm90b3R5cGUub25BY3RpdmF0aW9uID0gZnVuY3Rpb24gKGhhbmRsZXIpIHtcbiAgICAgICAgdGhpcy5fYmluZGluZy5vbkFjdGl2YXRpb24gPSBoYW5kbGVyO1xuICAgICAgICByZXR1cm4gbmV3IGJpbmRpbmdfd2hlbl9zeW50YXhfMS5CaW5kaW5nV2hlblN5bnRheCh0aGlzLl9iaW5kaW5nKTtcbiAgICB9O1xuICAgIHJldHVybiBCaW5kaW5nT25TeW50YXg7XG59KCkpO1xuZXhwb3J0cy5CaW5kaW5nT25TeW50YXggPSBCaW5kaW5nT25TeW50YXg7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1iaW5kaW5nX29uX3N5bnRheC5qcy5tYXAiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///170\n')},function(module,exports,__webpack_require__){"use strict";eval('\nObject.defineProperty(exports, "__esModule", { value: true });\nexports.BindingWhenSyntax = void 0;\nvar binding_on_syntax_1 = __webpack_require__(170);\nvar constraint_helpers_1 = __webpack_require__(247);\nvar BindingWhenSyntax = (function () {\n function BindingWhenSyntax(binding) {\n this._binding = binding;\n }\n BindingWhenSyntax.prototype.when = function (constraint) {\n this._binding.constraint = constraint;\n return new binding_on_syntax_1.BindingOnSyntax(this._binding);\n };\n BindingWhenSyntax.prototype.whenTargetNamed = function (name) {\n this._binding.constraint = constraint_helpers_1.namedConstraint(name);\n return new binding_on_syntax_1.BindingOnSyntax(this._binding);\n };\n BindingWhenSyntax.prototype.whenTargetIsDefault = function () {\n this._binding.constraint = function (request) {\n var targetIsDefault = (request.target !== null) &&\n (!request.target.isNamed()) &&\n (!request.target.isTagged());\n return targetIsDefault;\n };\n return new binding_on_syntax_1.BindingOnSyntax(this._binding);\n };\n BindingWhenSyntax.prototype.whenTargetTagged = function (tag, value) {\n this._binding.constraint = constraint_helpers_1.taggedConstraint(tag)(value);\n return new binding_on_syntax_1.BindingOnSyntax(this._binding);\n };\n BindingWhenSyntax.prototype.whenInjectedInto = function (parent) {\n this._binding.constraint = function (request) {\n return constraint_helpers_1.typeConstraint(parent)(request.parentRequest);\n };\n return new binding_on_syntax_1.BindingOnSyntax(this._binding);\n };\n BindingWhenSyntax.prototype.whenParentNamed = function (name) {\n this._binding.constraint = function (request) {\n return constraint_helpers_1.namedConstraint(name)(request.parentRequest);\n };\n return new binding_on_syntax_1.BindingOnSyntax(this._binding);\n };\n BindingWhenSyntax.prototype.whenParentTagged = function (tag, value) {\n this._binding.constraint = function (request) {\n return constraint_helpers_1.taggedConstraint(tag)(value)(request.parentRequest);\n };\n return new binding_on_syntax_1.BindingOnSyntax(this._binding);\n };\n BindingWhenSyntax.prototype.whenAnyAncestorIs = function (ancestor) {\n this._binding.constraint = function (request) {\n return constraint_helpers_1.traverseAncerstors(request, constraint_helpers_1.typeConstraint(ancestor));\n };\n return new binding_on_syntax_1.BindingOnSyntax(this._binding);\n };\n BindingWhenSyntax.prototype.whenNoAncestorIs = function (ancestor) {\n this._binding.constraint = function (request) {\n return !constraint_helpers_1.traverseAncerstors(request, constraint_helpers_1.typeConstraint(ancestor));\n };\n return new binding_on_syntax_1.BindingOnSyntax(this._binding);\n };\n BindingWhenSyntax.prototype.whenAnyAncestorNamed = function (name) {\n this._binding.constraint = function (request) {\n return constraint_helpers_1.traverseAncerstors(request, constraint_helpers_1.namedConstraint(name));\n };\n return new binding_on_syntax_1.BindingOnSyntax(this._binding);\n };\n BindingWhenSyntax.prototype.whenNoAncestorNamed = function (name) {\n this._binding.constraint = function (request) {\n return !constraint_helpers_1.traverseAncerstors(request, constraint_helpers_1.namedConstraint(name));\n };\n return new binding_on_syntax_1.BindingOnSyntax(this._binding);\n };\n BindingWhenSyntax.prototype.whenAnyAncestorTagged = function (tag, value) {\n this._binding.constraint = function (request) {\n return constraint_helpers_1.traverseAncerstors(request, constraint_helpers_1.taggedConstraint(tag)(value));\n };\n return new binding_on_syntax_1.BindingOnSyntax(this._binding);\n };\n BindingWhenSyntax.prototype.whenNoAncestorTagged = function (tag, value) {\n this._binding.constraint = function (request) {\n return !constraint_helpers_1.traverseAncerstors(request, constraint_helpers_1.taggedConstraint(tag)(value));\n };\n return new binding_on_syntax_1.BindingOnSyntax(this._binding);\n };\n BindingWhenSyntax.prototype.whenAnyAncestorMatches = function (constraint) {\n this._binding.constraint = function (request) {\n return constraint_helpers_1.traverseAncerstors(request, constraint);\n };\n return new binding_on_syntax_1.BindingOnSyntax(this._binding);\n };\n BindingWhenSyntax.prototype.whenNoAncestorMatches = function (constraint) {\n this._binding.constraint = function (request) {\n return !constraint_helpers_1.traverseAncerstors(request, constraint);\n };\n return new binding_on_syntax_1.BindingOnSyntax(this._binding);\n };\n return BindingWhenSyntax;\n}());\nexports.BindingWhenSyntax = BindingWhenSyntax;\n//# sourceMappingURL=binding_when_syntax.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaW52ZXJzaWZ5L2xpYi9zeW50YXgvYmluZGluZ193aGVuX3N5bnRheC5qcz9jZjgxIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFhO0FBQ2IsOENBQThDLGNBQWM7QUFDNUQ7QUFDQSwwQkFBMEIsbUJBQU8sQ0FBQyxHQUFxQjtBQUN2RCwyQkFBMkIsbUJBQU8sQ0FBQyxHQUFzQjtBQUN6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0EiLCJmaWxlIjoiMTcxLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkJpbmRpbmdXaGVuU3ludGF4ID0gdm9pZCAwO1xudmFyIGJpbmRpbmdfb25fc3ludGF4XzEgPSByZXF1aXJlKFwiLi9iaW5kaW5nX29uX3N5bnRheFwiKTtcbnZhciBjb25zdHJhaW50X2hlbHBlcnNfMSA9IHJlcXVpcmUoXCIuL2NvbnN0cmFpbnRfaGVscGVyc1wiKTtcbnZhciBCaW5kaW5nV2hlblN5bnRheCA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQmluZGluZ1doZW5TeW50YXgoYmluZGluZykge1xuICAgICAgICB0aGlzLl9iaW5kaW5nID0gYmluZGluZztcbiAgICB9XG4gICAgQmluZGluZ1doZW5TeW50YXgucHJvdG90eXBlLndoZW4gPSBmdW5jdGlvbiAoY29uc3RyYWludCkge1xuICAgICAgICB0aGlzLl9iaW5kaW5nLmNvbnN0cmFpbnQgPSBjb25zdHJhaW50O1xuICAgICAgICByZXR1cm4gbmV3IGJpbmRpbmdfb25fc3ludGF4XzEuQmluZGluZ09uU3ludGF4KHRoaXMuX2JpbmRpbmcpO1xuICAgIH07XG4gICAgQmluZGluZ1doZW5TeW50YXgucHJvdG90eXBlLndoZW5UYXJnZXROYW1lZCA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIHRoaXMuX2JpbmRpbmcuY29uc3RyYWludCA9IGNvbnN0cmFpbnRfaGVscGVyc18xLm5hbWVkQ29uc3RyYWludChuYW1lKTtcbiAgICAgICAgcmV0dXJuIG5ldyBiaW5kaW5nX29uX3N5bnRheF8xLkJpbmRpbmdPblN5bnRheCh0aGlzLl9iaW5kaW5nKTtcbiAgICB9O1xuICAgIEJpbmRpbmdXaGVuU3ludGF4LnByb3RvdHlwZS53aGVuVGFyZ2V0SXNEZWZhdWx0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl9iaW5kaW5nLmNvbnN0cmFpbnQgPSBmdW5jdGlvbiAocmVxdWVzdCkge1xuICAgICAgICAgICAgdmFyIHRhcmdldElzRGVmYXVsdCA9IChyZXF1ZXN0LnRhcmdldCAhPT0gbnVsbCkgJiZcbiAgICAgICAgICAgICAgICAoIXJlcXVlc3QudGFyZ2V0LmlzTmFtZWQoKSkgJiZcbiAgICAgICAgICAgICAgICAoIXJlcXVlc3QudGFyZ2V0LmlzVGFnZ2VkKCkpO1xuICAgICAgICAgICAgcmV0dXJuIHRhcmdldElzRGVmYXVsdDtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIG5ldyBiaW5kaW5nX29uX3N5bnRheF8xLkJpbmRpbmdPblN5bnRheCh0aGlzLl9iaW5kaW5nKTtcbiAgICB9O1xuICAgIEJpbmRpbmdXaGVuU3ludGF4LnByb3RvdHlwZS53aGVuVGFyZ2V0VGFnZ2VkID0gZnVuY3Rpb24gKHRhZywgdmFsdWUpIHtcbiAgICAgICAgdGhpcy5fYmluZGluZy5jb25zdHJhaW50ID0gY29uc3RyYWludF9oZWxwZXJzXzEudGFnZ2VkQ29uc3RyYWludCh0YWcpKHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIG5ldyBiaW5kaW5nX29uX3N5bnRheF8xLkJpbmRpbmdPblN5bnRheCh0aGlzLl9iaW5kaW5nKTtcbiAgICB9O1xuICAgIEJpbmRpbmdXaGVuU3ludGF4LnByb3RvdHlwZS53aGVuSW5qZWN0ZWRJbnRvID0gZnVuY3Rpb24gKHBhcmVudCkge1xuICAgICAgICB0aGlzLl9iaW5kaW5nLmNvbnN0cmFpbnQgPSBmdW5jdGlvbiAocmVxdWVzdCkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnN0cmFpbnRfaGVscGVyc18xLnR5cGVDb25zdHJhaW50KHBhcmVudCkocmVxdWVzdC5wYXJlbnRSZXF1ZXN0KTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIG5ldyBiaW5kaW5nX29uX3N5bnRheF8xLkJpbmRpbmdPblN5bnRheCh0aGlzLl9iaW5kaW5nKTtcbiAgICB9O1xuICAgIEJpbmRpbmdXaGVuU3ludGF4LnByb3RvdHlwZS53aGVuUGFyZW50TmFtZWQgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICB0aGlzLl9iaW5kaW5nLmNvbnN0cmFpbnQgPSBmdW5jdGlvbiAocmVxdWVzdCkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnN0cmFpbnRfaGVscGVyc18xLm5hbWVkQ29uc3RyYWludChuYW1lKShyZXF1ZXN0LnBhcmVudFJlcXVlc3QpO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gbmV3IGJpbmRpbmdfb25fc3ludGF4XzEuQmluZGluZ09uU3ludGF4KHRoaXMuX2JpbmRpbmcpO1xuICAgIH07XG4gICAgQmluZGluZ1doZW5TeW50YXgucHJvdG90eXBlLndoZW5QYXJlbnRUYWdnZWQgPSBmdW5jdGlvbiAodGFnLCB2YWx1ZSkge1xuICAgICAgICB0aGlzLl9iaW5kaW5nLmNvbnN0cmFpbnQgPSBmdW5jdGlvbiAocmVxdWVzdCkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnN0cmFpbnRfaGVscGVyc18xLnRhZ2dlZENvbnN0cmFpbnQodGFnKSh2YWx1ZSkocmVxdWVzdC5wYXJlbnRSZXF1ZXN0KTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIG5ldyBiaW5kaW5nX29uX3N5bnRheF8xLkJpbmRpbmdPblN5bnRheCh0aGlzLl9iaW5kaW5nKTtcbiAgICB9O1xuICAgIEJpbmRpbmdXaGVuU3ludGF4LnByb3RvdHlwZS53aGVuQW55QW5jZXN0b3JJcyA9IGZ1bmN0aW9uIChhbmNlc3Rvcikge1xuICAgICAgICB0aGlzLl9iaW5kaW5nLmNvbnN0cmFpbnQgPSBmdW5jdGlvbiAocmVxdWVzdCkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnN0cmFpbnRfaGVscGVyc18xLnRyYXZlcnNlQW5jZXJzdG9ycyhyZXF1ZXN0LCBjb25zdHJhaW50X2hlbHBlcnNfMS50eXBlQ29uc3RyYWludChhbmNlc3RvcikpO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gbmV3IGJpbmRpbmdfb25fc3ludGF4XzEuQmluZGluZ09uU3ludGF4KHRoaXMuX2JpbmRpbmcpO1xuICAgIH07XG4gICAgQmluZGluZ1doZW5TeW50YXgucHJvdG90eXBlLndoZW5Ob0FuY2VzdG9ySXMgPSBmdW5jdGlvbiAoYW5jZXN0b3IpIHtcbiAgICAgICAgdGhpcy5fYmluZGluZy5jb25zdHJhaW50ID0gZnVuY3Rpb24gKHJlcXVlc3QpIHtcbiAgICAgICAgICAgIHJldHVybiAhY29uc3RyYWludF9oZWxwZXJzXzEudHJhdmVyc2VBbmNlcnN0b3JzKHJlcXVlc3QsIGNvbnN0cmFpbnRfaGVscGVyc18xLnR5cGVDb25zdHJhaW50KGFuY2VzdG9yKSk7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBuZXcgYmluZGluZ19vbl9zeW50YXhfMS5CaW5kaW5nT25TeW50YXgodGhpcy5fYmluZGluZyk7XG4gICAgfTtcbiAgICBCaW5kaW5nV2hlblN5bnRheC5wcm90b3R5cGUud2hlbkFueUFuY2VzdG9yTmFtZWQgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICB0aGlzLl9iaW5kaW5nLmNvbnN0cmFpbnQgPSBmdW5jdGlvbiAocmVxdWVzdCkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnN0cmFpbnRfaGVscGVyc18xLnRyYXZlcnNlQW5jZXJzdG9ycyhyZXF1ZXN0LCBjb25zdHJhaW50X2hlbHBlcnNfMS5uYW1lZENvbnN0cmFpbnQobmFtZSkpO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gbmV3IGJpbmRpbmdfb25fc3ludGF4XzEuQmluZGluZ09uU3ludGF4KHRoaXMuX2JpbmRpbmcpO1xuICAgIH07XG4gICAgQmluZGluZ1doZW5TeW50YXgucHJvdG90eXBlLndoZW5Ob0FuY2VzdG9yTmFtZWQgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICB0aGlzLl9iaW5kaW5nLmNvbnN0cmFpbnQgPSBmdW5jdGlvbiAocmVxdWVzdCkge1xuICAgICAgICAgICAgcmV0dXJuICFjb25zdHJhaW50X2hlbHBlcnNfMS50cmF2ZXJzZUFuY2Vyc3RvcnMocmVxdWVzdCwgY29uc3RyYWludF9oZWxwZXJzXzEubmFtZWRDb25zdHJhaW50KG5hbWUpKTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIG5ldyBiaW5kaW5nX29uX3N5bnRheF8xLkJpbmRpbmdPblN5bnRheCh0aGlzLl9iaW5kaW5nKTtcbiAgICB9O1xuICAgIEJpbmRpbmdXaGVuU3ludGF4LnByb3RvdHlwZS53aGVuQW55QW5jZXN0b3JUYWdnZWQgPSBmdW5jdGlvbiAodGFnLCB2YWx1ZSkge1xuICAgICAgICB0aGlzLl9iaW5kaW5nLmNvbnN0cmFpbnQgPSBmdW5jdGlvbiAocmVxdWVzdCkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnN0cmFpbnRfaGVscGVyc18xLnRyYXZlcnNlQW5jZXJzdG9ycyhyZXF1ZXN0LCBjb25zdHJhaW50X2hlbHBlcnNfMS50YWdnZWRDb25zdHJhaW50KHRhZykodmFsdWUpKTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIG5ldyBiaW5kaW5nX29uX3N5bnRheF8xLkJpbmRpbmdPblN5bnRheCh0aGlzLl9iaW5kaW5nKTtcbiAgICB9O1xuICAgIEJpbmRpbmdXaGVuU3ludGF4LnByb3RvdHlwZS53aGVuTm9BbmNlc3RvclRhZ2dlZCA9IGZ1bmN0aW9uICh0YWcsIHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX2JpbmRpbmcuY29uc3RyYWludCA9IGZ1bmN0aW9uIChyZXF1ZXN0KSB7XG4gICAgICAgICAgICByZXR1cm4gIWNvbnN0cmFpbnRfaGVscGVyc18xLnRyYXZlcnNlQW5jZXJzdG9ycyhyZXF1ZXN0LCBjb25zdHJhaW50X2hlbHBlcnNfMS50YWdnZWRDb25zdHJhaW50KHRhZykodmFsdWUpKTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIG5ldyBiaW5kaW5nX29uX3N5bnRheF8xLkJpbmRpbmdPblN5bnRheCh0aGlzLl9iaW5kaW5nKTtcbiAgICB9O1xuICAgIEJpbmRpbmdXaGVuU3ludGF4LnByb3RvdHlwZS53aGVuQW55QW5jZXN0b3JNYXRjaGVzID0gZnVuY3Rpb24gKGNvbnN0cmFpbnQpIHtcbiAgICAgICAgdGhpcy5fYmluZGluZy5jb25zdHJhaW50ID0gZnVuY3Rpb24gKHJlcXVlc3QpIHtcbiAgICAgICAgICAgIHJldHVybiBjb25zdHJhaW50X2hlbHBlcnNfMS50cmF2ZXJzZUFuY2Vyc3RvcnMocmVxdWVzdCwgY29uc3RyYWludCk7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBuZXcgYmluZGluZ19vbl9zeW50YXhfMS5CaW5kaW5nT25TeW50YXgodGhpcy5fYmluZGluZyk7XG4gICAgfTtcbiAgICBCaW5kaW5nV2hlblN5bnRheC5wcm90b3R5cGUud2hlbk5vQW5jZXN0b3JNYXRjaGVzID0gZnVuY3Rpb24gKGNvbnN0cmFpbnQpIHtcbiAgICAgICAgdGhpcy5fYmluZGluZy5jb25zdHJhaW50ID0gZnVuY3Rpb24gKHJlcXVlc3QpIHtcbiAgICAgICAgICAgIHJldHVybiAhY29uc3RyYWludF9oZWxwZXJzXzEudHJhdmVyc2VBbmNlcnN0b3JzKHJlcXVlc3QsIGNvbnN0cmFpbnQpO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gbmV3IGJpbmRpbmdfb25fc3ludGF4XzEuQmluZGluZ09uU3ludGF4KHRoaXMuX2JpbmRpbmcpO1xuICAgIH07XG4gICAgcmV0dXJuIEJpbmRpbmdXaGVuU3ludGF4O1xufSgpKTtcbmV4cG9ydHMuQmluZGluZ1doZW5TeW50YXggPSBCaW5kaW5nV2hlblN5bnRheDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJpbmRpbmdfd2hlbl9zeW50YXguanMubWFwIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///171\n')},function(module,exports){eval("module.exports = subtract\n\n/**\n * Subtracts vector b from vector a\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @returns {vec2} out\n */\nfunction subtract(out, a, b) {\n out[0] = a[0] - b[0]\n out[1] = a[1] - b[1]\n return out\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZ2wtdmVjMi9zdWJ0cmFjdC5qcz83MDZjIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLEtBQUs7QUFDaEIsV0FBVyxLQUFLO0FBQ2hCLGFBQWEsS0FBSztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiMTcyLmpzIiwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBzdWJ0cmFjdFxuXG4vKipcbiAqIFN1YnRyYWN0cyB2ZWN0b3IgYiBmcm9tIHZlY3RvciBhXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjMn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG5mdW5jdGlvbiBzdWJ0cmFjdChvdXQsIGEsIGIpIHtcbiAgICBvdXRbMF0gPSBhWzBdIC0gYlswXVxuICAgIG91dFsxXSA9IGFbMV0gLSBiWzFdXG4gICAgcmV0dXJuIG91dFxufSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///172\n")},function(module,exports,__webpack_require__){"use strict";eval("\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.SVMarker = void 0;\r\nconst util_1 = __webpack_require__(53);\r\nconst SVModel_1 = __webpack_require__(146);\r\nclass SVMarker extends SVModel_1.SVModel {\r\n constructor(id, type, group, layout, label, target, options) {\r\n super(id, type, group, layout, 'marker');\r\n this.target = target;\r\n this.label = label;\r\n this.target.marker = this;\r\n this.G6ModelProps = this.generateG6ModelProps(options);\r\n }\r\n generateG6ModelProps(options) {\r\n this.anchor = options.anchor;\r\n const type = options.type, defaultSize = type === 'pointer' ? [8, 30] : [12, 12];\r\n return {\r\n id: this.id,\r\n x: 0,\r\n y: 0,\r\n rotation: 0,\r\n type: options.type || 'marker',\r\n size: options.size || defaultSize,\r\n anchorPoints: null,\r\n label: typeof this.label === 'string' ? this.label : this.label.join(', '),\r\n style: util_1.Util.objectClone(options.style),\r\n labelCfg: util_1.Util.objectClone(options.labelOptions)\r\n };\r\n }\r\n getLabelSizeRadius() {\r\n const { width, height } = this.shadowG6Item.getContainer().getChildren()[2].getBBox();\r\n return width > height ? width : height;\r\n }\r\n}\r\nexports.SVMarker = SVMarker;\r\n;\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvTW9kZWwvU1ZNYXJrZXIudHM/NTA0OCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSx1Q0FBc0M7QUFFdEMsMkNBQW9DO0FBS3BDLE1BQWEsUUFBUyxTQUFRLGlCQUFPO0lBUWpDLFlBQVksRUFBVSxFQUFFLElBQVksRUFBRSxLQUFhLEVBQUUsTUFBYyxFQUFFLEtBQXdCLEVBQUUsTUFBYyxFQUFFLE9BQXFCO1FBQ2hJLEtBQUssQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFFekMsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFFbkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQzFCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFFUyxvQkFBb0IsQ0FBQyxPQUFxQjtRQUNoRCxJQUFJLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUM7UUFFN0IsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksRUFDbkIsV0FBVyxHQUFzQixJQUFJLEtBQUssU0FBUyxFQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUU3RSxPQUFPO1lBQ0gsRUFBRSxFQUFFLElBQUksQ0FBQyxFQUFFO1lBQ1gsQ0FBQyxFQUFFLENBQUM7WUFDSixDQUFDLEVBQUUsQ0FBQztZQUNKLFFBQVEsRUFBRSxDQUFDO1lBQ1gsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJLElBQUksUUFBUTtZQUM5QixJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUksSUFBSSxXQUFXO1lBQ2pDLFlBQVksRUFBRSxJQUFJO1lBQ2xCLEtBQUssRUFBRSxPQUFPLElBQUksQ0FBQyxLQUFLLEtBQUssUUFBUSxFQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztZQUN4RSxLQUFLLEVBQUUsV0FBSSxDQUFDLFdBQVcsQ0FBUSxPQUFPLENBQUMsS0FBSyxDQUFDO1lBQzdDLFFBQVEsRUFBRSxXQUFJLENBQUMsV0FBVyxDQUFrQixPQUFPLENBQUMsWUFBWSxDQUFDO1NBQ3BFLENBQUM7SUFDTixDQUFDO0lBRU0sa0JBQWtCO1FBQ3JCLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUN0RixPQUFPLEtBQUssR0FBRyxNQUFNLEVBQUMsQ0FBQyxLQUFLLEVBQUMsQ0FBQyxNQUFNLENBQUM7SUFDekMsQ0FBQztDQUNKO0FBMUNELDRCQTBDQztBQUFBLENBQUMiLCJmaWxlIjoiMTczLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSU5vZGUsIE5vZGVDb25maWcgfSBmcm9tIFwiQGFudHYvZzYtY29yZVwiO1xyXG5pbXBvcnQgeyBVdGlsIH0gZnJvbSBcIi4uL0NvbW1vbi91dGlsXCI7XHJcbmltcG9ydCB7IE1hcmtlck9wdGlvbiwgTm9kZUxhYmVsT3B0aW9uLCBTdHlsZSB9IGZyb20gXCIuLi9vcHRpb25zXCI7XHJcbmltcG9ydCB7IFNWTW9kZWwgfSBmcm9tIFwiLi9TVk1vZGVsXCI7XHJcbmltcG9ydCB7IFNWTm9kZSB9IGZyb20gXCIuL1NWTm9kZVwiO1xyXG5cclxuXHJcblxyXG5leHBvcnQgY2xhc3MgU1ZNYXJrZXIgZXh0ZW5kcyBTVk1vZGVsIHtcclxuICAgIHB1YmxpYyB0YXJnZXQ6IFNWTm9kZTtcclxuICAgIHB1YmxpYyBsYWJlbDogc3RyaW5nIHwgc3RyaW5nW107XHJcbiAgICBwdWJsaWMgYW5jaG9yOiBudW1iZXI7XHJcblxyXG4gICAgcHVibGljIHNoYWRvd0c2SXRlbTogSU5vZGU7XHJcbiAgICBwdWJsaWMgRzZJdGVtOiBJTm9kZTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihpZDogc3RyaW5nLCB0eXBlOiBzdHJpbmcsIGdyb3VwOiBzdHJpbmcsIGxheW91dDogc3RyaW5nLCBsYWJlbDogc3RyaW5nIHwgc3RyaW5nW10sIHRhcmdldDogU1ZOb2RlLCBvcHRpb25zOiBNYXJrZXJPcHRpb24pIHtcclxuICAgICAgICBzdXBlcihpZCwgdHlwZSwgZ3JvdXAsIGxheW91dCwgJ21hcmtlcicpO1xyXG5cclxuICAgICAgICB0aGlzLnRhcmdldCA9IHRhcmdldDtcclxuICAgICAgICB0aGlzLmxhYmVsID0gbGFiZWw7XHJcblxyXG4gICAgICAgIHRoaXMudGFyZ2V0Lm1hcmtlciA9IHRoaXM7XHJcbiAgICAgICAgdGhpcy5HNk1vZGVsUHJvcHMgPSB0aGlzLmdlbmVyYXRlRzZNb2RlbFByb3BzKG9wdGlvbnMpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBnZW5lcmF0ZUc2TW9kZWxQcm9wcyhvcHRpb25zOiBNYXJrZXJPcHRpb24pOiBOb2RlQ29uZmlnIHtcclxuICAgICAgICB0aGlzLmFuY2hvciA9IG9wdGlvbnMuYW5jaG9yO1xyXG5cclxuICAgICAgICBjb25zdCB0eXBlID0gb3B0aW9ucy50eXBlLFxyXG4gICAgICAgICAgICAgIGRlZmF1bHRTaXplOiBbbnVtYmVyLCBudW1iZXJdID0gIHR5cGUgPT09ICdwb2ludGVyJz8gWzgsIDMwXTogWzEyLCAxMl07XHJcblxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxyXG4gICAgICAgICAgICB4OiAwLFxyXG4gICAgICAgICAgICB5OiAwLFxyXG4gICAgICAgICAgICByb3RhdGlvbjogMCxcclxuICAgICAgICAgICAgdHlwZTogb3B0aW9ucy50eXBlIHx8ICdtYXJrZXInLFxyXG4gICAgICAgICAgICBzaXplOiBvcHRpb25zLnNpemUgfHwgZGVmYXVsdFNpemUsXHJcbiAgICAgICAgICAgIGFuY2hvclBvaW50czogbnVsbCxcclxuICAgICAgICAgICAgbGFiZWw6IHR5cGVvZiB0aGlzLmxhYmVsID09PSAnc3RyaW5nJz8gdGhpcy5sYWJlbDogdGhpcy5sYWJlbC5qb2luKCcsICcpLFxyXG4gICAgICAgICAgICBzdHlsZTogVXRpbC5vYmplY3RDbG9uZTxTdHlsZT4ob3B0aW9ucy5zdHlsZSksXHJcbiAgICAgICAgICAgIGxhYmVsQ2ZnOiBVdGlsLm9iamVjdENsb25lPE5vZGVMYWJlbE9wdGlvbj4ob3B0aW9ucy5sYWJlbE9wdGlvbnMpXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0TGFiZWxTaXplUmFkaXVzKCk6IG51bWJlciB7XHJcbiAgICAgICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSB0aGlzLnNoYWRvd0c2SXRlbS5nZXRDb250YWluZXIoKS5nZXRDaGlsZHJlbigpWzJdLmdldEJCb3goKTtcclxuICAgICAgICByZXR1cm4gd2lkdGggPiBoZWlnaHQ/IHdpZHRoOiBoZWlnaHQ7XHJcbiAgICB9XHJcbn07Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///173\n")},function(module,exports,__webpack_require__){"use strict";eval("\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.SVNode = exports.SVLeakAddress = exports.SVFreedLabel = void 0;\r\nconst util_1 = __webpack_require__(53);\r\nconst SVModel_1 = __webpack_require__(146);\r\nclass SVFreedLabel extends SVModel_1.SVModel {\r\n constructor(id, type, group, layout, node) {\r\n super(id, type, group, layout, 'freedLabel');\r\n this.node = node;\r\n this.node.freedLabel = this;\r\n this.G6ModelProps = this.generateG6ModelProps();\r\n }\r\n generateG6ModelProps() {\r\n return {\r\n id: this.id,\r\n x: 0,\r\n y: 0,\r\n type: 'rect',\r\n label: '已释放',\r\n labelCfg: {\r\n style: {\r\n fill: '#b83b5e',\r\n opacity: 0.6\r\n }\r\n },\r\n size: [0, 0],\r\n style: {\r\n stroke: null,\r\n fill: 'transparent'\r\n }\r\n };\r\n }\r\n}\r\nexports.SVFreedLabel = SVFreedLabel;\r\nclass SVLeakAddress extends SVModel_1.SVModel {\r\n constructor(id, type, group, layout, node) {\r\n super(id, type, group, layout, 'leakAddress');\r\n this.node = node;\r\n this.sourceId = node.sourceId;\r\n this.node.leakAddress = this;\r\n this.G6ModelProps = this.generateG6ModelProps();\r\n }\r\n generateG6ModelProps() {\r\n return {\r\n id: this.id,\r\n x: 0,\r\n y: 0,\r\n type: 'rect',\r\n label: this.sourceId,\r\n labelCfg: {\r\n style: {\r\n fill: '#666',\r\n fontSize: 16\r\n }\r\n },\r\n size: [0, 0],\r\n style: {\r\n stroke: null,\r\n fill: 'transparent'\r\n }\r\n };\r\n }\r\n}\r\nexports.SVLeakAddress = SVLeakAddress;\r\nclass SVNode extends SVModel_1.SVModel {\r\n constructor(id, type, group, layout, sourceNode, label, options) {\r\n super(id, type, group, layout, 'node');\r\n this.group = group;\r\n this.layout = layout;\r\n Object.keys(sourceNode).map(prop => {\r\n if (prop !== 'id') {\r\n this[prop] = sourceNode[prop];\r\n }\r\n });\r\n this.sourceNode = sourceNode;\r\n this.sourceId = sourceNode.id.toString();\r\n this.marker = null;\r\n this.links = { inDegree: [], outDegree: [] };\r\n this.sourceNode = sourceNode;\r\n this.label = label;\r\n this.G6ModelProps = this.generateG6ModelProps(options);\r\n }\r\n generateG6ModelProps(options) {\r\n let indexOptions = util_1.Util.objectClone(options.indexOptions);\r\n if (indexOptions) {\r\n Object.keys(indexOptions).map(key => {\r\n var _a;\r\n let indexOptionItem = indexOptions[key];\r\n indexOptionItem.value = (_a = this.sourceNode[key]) !== null && _a !== void 0 ? _a : '';\r\n });\r\n }\r\n return Object.assign(Object.assign({}, this.sourceNode), { id: this.id, x: 0, y: 0, rotation: options.rotation || 0, type: options.type, size: options.size || [60, 30], anchorPoints: options.anchorPoints, label: this.label, style: util_1.Util.objectClone(options.style), labelCfg: util_1.Util.objectClone(options.labelOptions), indexCfg: indexOptions });\r\n }\r\n isNode() {\r\n return true;\r\n }\r\n getSourceId() {\r\n return this.sourceId;\r\n }\r\n}\r\nexports.SVNode = SVNode;\r\n;\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvTW9kZWwvU1ZOb2RlLnRzPzRhY2MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsdUNBQXNDO0FBS3RDLDJDQUFvQztBQUdwQyxNQUFhLFlBQWEsU0FBUSxpQkFBTztJQUdyQyxZQUFZLEVBQVUsRUFBRSxJQUFZLEVBQUUsS0FBYSxFQUFFLE1BQWMsRUFBRSxJQUFZO1FBQzdFLEtBQUssQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFFN0MsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1FBQzVCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7SUFDcEQsQ0FBQztJQUVELG9CQUFvQjtRQUNoQixPQUFPO1lBQ0gsRUFBRSxFQUFFLElBQUksQ0FBQyxFQUFFO1lBQ1gsQ0FBQyxFQUFFLENBQUM7WUFDSixDQUFDLEVBQUUsQ0FBQztZQUNKLElBQUksRUFBRSxNQUFNO1lBQ1osS0FBSyxFQUFFLEtBQUs7WUFDWixRQUFRLEVBQUU7Z0JBQ04sS0FBSyxFQUFFO29CQUNILElBQUksRUFBRSxTQUFTO29CQUNmLE9BQU8sRUFBRSxHQUFHO2lCQUNmO2FBQ0o7WUFDRCxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ1osS0FBSyxFQUFFO2dCQUNILE1BQU0sRUFBRSxJQUFJO2dCQUNaLElBQUksRUFBRSxhQUFhO2FBQ3RCO1NBQ0osQ0FBQztJQUNOLENBQUM7Q0FDSjtBQS9CRCxvQ0ErQkM7QUFHRCxNQUFhLGFBQWMsU0FBUSxpQkFBTztJQUl0QyxZQUFZLEVBQVUsRUFBRSxJQUFZLEVBQUUsS0FBYSxFQUFFLE1BQWMsRUFBRSxJQUFZO1FBQzdFLEtBQUssQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFFOUMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQzlCLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztRQUM3QixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO0lBQ3BELENBQUM7SUFFRCxvQkFBb0I7UUFDaEIsT0FBTztZQUNILEVBQUUsRUFBRSxJQUFJLENBQUMsRUFBRTtZQUNYLENBQUMsRUFBRSxDQUFDO1lBQ0osQ0FBQyxFQUFFLENBQUM7WUFDSixJQUFJLEVBQUUsTUFBTTtZQUNaLEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUTtZQUNwQixRQUFRLEVBQUU7Z0JBQ04sS0FBSyxFQUFFO29CQUNILElBQUksRUFBRSxNQUFNO29CQUNaLFFBQVEsRUFBRSxFQUFFO2lCQUNmO2FBQ0o7WUFDRCxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ1osS0FBSyxFQUFFO2dCQUNILE1BQU0sRUFBRSxJQUFJO2dCQUNaLElBQUksRUFBRSxhQUFhO2FBQ3RCO1NBQ0osQ0FBQztJQUNOLENBQUM7Q0FDSjtBQWpDRCxzQ0FpQ0M7QUFJRCxNQUFhLE1BQU8sU0FBUSxpQkFBTztJQWUvQixZQUFZLEVBQVUsRUFBRSxJQUFZLEVBQUUsS0FBYSxFQUFFLE1BQWMsRUFBRSxVQUFzQixFQUFFLEtBQXdCLEVBQUUsT0FBbUI7UUFDdEksS0FBSyxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztRQUV2QyxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUVyQixNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUMvQixJQUFJLElBQUksS0FBSyxJQUFJLEVBQUU7Z0JBQ2YsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUNqQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7UUFDN0IsSUFBSSxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBRXpDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ25CLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsQ0FBQztRQUM3QyxJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztRQUM3QixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRVMsb0JBQW9CLENBQUMsT0FBbUI7UUFDOUMsSUFBSSxZQUFZLEdBQUcsV0FBSSxDQUFDLFdBQVcsQ0FBa0IsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRTNFLElBQUksWUFBWSxFQUFFO1lBQ2QsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUU7O2dCQUNoQyxJQUFJLGVBQWUsR0FBRyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3hDLGVBQWUsQ0FBQyxLQUFLLFNBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsbUNBQUksRUFBRSxDQUFDO1lBQ3ZELENBQUMsQ0FBQyxDQUFDO1NBQ047UUFFRCx1Q0FDTyxJQUFJLENBQUMsVUFBVSxLQUNsQixFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFDWCxDQUFDLEVBQUUsQ0FBQyxFQUNKLENBQUMsRUFBRSxDQUFDLEVBQ0osUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRLElBQUksQ0FBQyxFQUMvQixJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUksRUFDbEIsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJLElBQUksQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQzlCLFlBQVksRUFBRSxPQUFPLENBQUMsWUFBWSxFQUNsQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQWUsRUFDM0IsS0FBSyxFQUFFLFdBQUksQ0FBQyxXQUFXLENBQVEsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUM3QyxRQUFRLEVBQUUsV0FBSSxDQUFDLFdBQVcsQ0FBa0IsT0FBTyxDQUFDLFlBQVksQ0FBQyxFQUNqRSxRQUFRLEVBQUUsWUFBWSxJQUN4QjtJQUNOLENBQUM7SUFFRCxNQUFNO1FBQ0YsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVELFdBQVc7UUFDUCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDekIsQ0FBQztDQUNKO0FBdEVELHdCQXNFQztBQUFBLENBQUMiLCJmaWxlIjoiMTc0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSU5vZGUsIE5vZGVDb25maWcgfSBmcm9tIFwiQGFudHYvZzYtY29yZVwiO1xyXG5pbXBvcnQgeyBVdGlsIH0gZnJvbSBcIi4uL0NvbW1vbi91dGlsXCI7XHJcbmltcG9ydCB7IE5vZGVJbmRleE9wdGlvbiwgTm9kZUxhYmVsT3B0aW9uLCBOb2RlT3B0aW9uLCBTdHlsZSB9IGZyb20gXCIuLi9vcHRpb25zXCI7XHJcbmltcG9ydCB7IFNvdXJjZU5vZGUgfSBmcm9tIFwiLi4vc291cmNlc1wiO1xyXG5pbXBvcnQgeyBTVkxpbmsgfSBmcm9tIFwiLi9TVkxpbmtcIjtcclxuaW1wb3J0IHsgU1ZNYXJrZXIgfSBmcm9tIFwiLi9TVk1hcmtlclwiO1xyXG5pbXBvcnQgeyBTVk1vZGVsIH0gZnJvbSBcIi4vU1ZNb2RlbFwiO1xyXG5cclxuXHJcbmV4cG9ydCBjbGFzcyBTVkZyZWVkTGFiZWwgZXh0ZW5kcyBTVk1vZGVsIHtcclxuICAgIHB1YmxpYyBub2RlOiBTVk5vZGU7XHJcblxyXG4gICAgY29uc3RydWN0b3IoaWQ6IHN0cmluZywgdHlwZTogc3RyaW5nLCBncm91cDogc3RyaW5nLCBsYXlvdXQ6IHN0cmluZywgbm9kZTogU1ZOb2RlKSB7XHJcbiAgICAgICAgc3VwZXIoaWQsIHR5cGUsIGdyb3VwLCBsYXlvdXQsICdmcmVlZExhYmVsJyk7XHJcblxyXG4gICAgICAgIHRoaXMubm9kZSA9IG5vZGU7XHJcbiAgICAgICAgdGhpcy5ub2RlLmZyZWVkTGFiZWwgPSB0aGlzO1xyXG4gICAgICAgIHRoaXMuRzZNb2RlbFByb3BzID0gdGhpcy5nZW5lcmF0ZUc2TW9kZWxQcm9wcygpO1xyXG4gICAgfVxyXG5cclxuICAgIGdlbmVyYXRlRzZNb2RlbFByb3BzKCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxyXG4gICAgICAgICAgICB4OiAwLFxyXG4gICAgICAgICAgICB5OiAwLFxyXG4gICAgICAgICAgICB0eXBlOiAncmVjdCcsXHJcbiAgICAgICAgICAgIGxhYmVsOiAn5bey6YeK5pS+JyxcclxuICAgICAgICAgICAgbGFiZWxDZmc6IHtcclxuICAgICAgICAgICAgICAgIHN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmlsbDogJyNiODNiNWUnLFxyXG4gICAgICAgICAgICAgICAgICAgIG9wYWNpdHk6IDAuNlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzaXplOiBbMCwgMF0sXHJcbiAgICAgICAgICAgIHN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICBzdHJva2U6IG51bGwsXHJcbiAgICAgICAgICAgICAgICBmaWxsOiAndHJhbnNwYXJlbnQnXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgfVxyXG59XHJcblxyXG5cclxuZXhwb3J0IGNsYXNzIFNWTGVha0FkZHJlc3MgZXh0ZW5kcyBTVk1vZGVsIHtcclxuICAgIHB1YmxpYyBub2RlOiBTVk5vZGU7XHJcbiAgICBwcml2YXRlIHNvdXJjZUlkOiBzdHJpbmc7XHJcblxyXG4gICAgY29uc3RydWN0b3IoaWQ6IHN0cmluZywgdHlwZTogc3RyaW5nLCBncm91cDogc3RyaW5nLCBsYXlvdXQ6IHN0cmluZywgbm9kZTogU1ZOb2RlKSB7XHJcbiAgICAgICAgc3VwZXIoaWQsIHR5cGUsIGdyb3VwLCBsYXlvdXQsICdsZWFrQWRkcmVzcycpO1xyXG5cclxuICAgICAgICB0aGlzLm5vZGUgPSBub2RlO1xyXG4gICAgICAgIHRoaXMuc291cmNlSWQgPSBub2RlLnNvdXJjZUlkO1xyXG4gICAgICAgIHRoaXMubm9kZS5sZWFrQWRkcmVzcyA9IHRoaXM7XHJcbiAgICAgICAgdGhpcy5HNk1vZGVsUHJvcHMgPSB0aGlzLmdlbmVyYXRlRzZNb2RlbFByb3BzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2VuZXJhdGVHNk1vZGVsUHJvcHMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgaWQ6IHRoaXMuaWQsXHJcbiAgICAgICAgICAgIHg6IDAsXHJcbiAgICAgICAgICAgIHk6IDAsXHJcbiAgICAgICAgICAgIHR5cGU6ICdyZWN0JyxcclxuICAgICAgICAgICAgbGFiZWw6IHRoaXMuc291cmNlSWQsXHJcbiAgICAgICAgICAgIGxhYmVsQ2ZnOiB7XHJcbiAgICAgICAgICAgICAgICBzdHlsZToge1xyXG4gICAgICAgICAgICAgICAgICAgIGZpbGw6ICcjNjY2JyxcclxuICAgICAgICAgICAgICAgICAgICBmb250U2l6ZTogMTZcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgc2l6ZTogWzAsIDBdLFxyXG4gICAgICAgICAgICBzdHlsZToge1xyXG4gICAgICAgICAgICAgICAgc3Ryb2tlOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgZmlsbDogJ3RyYW5zcGFyZW50J1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxufVxyXG5cclxuXHJcblxyXG5leHBvcnQgY2xhc3MgU1ZOb2RlIGV4dGVuZHMgU1ZNb2RlbCB7XHJcbiAgICBwdWJsaWMgc291cmNlSWQ6IHN0cmluZztcclxuICAgIHB1YmxpYyBzb3VyY2VOb2RlOiBTb3VyY2VOb2RlO1xyXG4gICAgcHVibGljIG1hcmtlcjogU1ZNYXJrZXI7XHJcbiAgICBwdWJsaWMgZnJlZWRMYWJlbDogU1ZGcmVlZExhYmVsO1xyXG4gICAgcHVibGljIGxlYWtBZGRyZXNzOiBTVkxlYWtBZGRyZXNzO1xyXG4gICAgcHVibGljIGxpbmtzOiB7XHJcbiAgICAgICAgaW5EZWdyZWU6IFNWTGlua1tdO1xyXG4gICAgICAgIG91dERlZ3JlZTogU1ZMaW5rW107XHJcbiAgICB9O1xyXG4gICAgcHJpdmF0ZSBsYWJlbDogc3RyaW5nIHwgc3RyaW5nW107XHJcblxyXG4gICAgcHVibGljIHNoYWRvd0c2SXRlbTogSU5vZGU7XHJcbiAgICBwdWJsaWMgRzZJdGVtOiBJTm9kZTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihpZDogc3RyaW5nLCB0eXBlOiBzdHJpbmcsIGdyb3VwOiBzdHJpbmcsIGxheW91dDogc3RyaW5nLCBzb3VyY2VOb2RlOiBTb3VyY2VOb2RlLCBsYWJlbDogc3RyaW5nIHwgc3RyaW5nW10sIG9wdGlvbnM6IE5vZGVPcHRpb24pIHtcclxuICAgICAgICBzdXBlcihpZCwgdHlwZSwgZ3JvdXAsIGxheW91dCwgJ25vZGUnKTtcclxuXHJcbiAgICAgICAgdGhpcy5ncm91cCA9IGdyb3VwO1xyXG4gICAgICAgIHRoaXMubGF5b3V0ID0gbGF5b3V0O1xyXG5cclxuICAgICAgICBPYmplY3Qua2V5cyhzb3VyY2VOb2RlKS5tYXAocHJvcCA9PiB7XHJcbiAgICAgICAgICAgIGlmIChwcm9wICE9PSAnaWQnKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzW3Byb3BdID0gc291cmNlTm9kZVtwcm9wXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLnNvdXJjZU5vZGUgPSBzb3VyY2VOb2RlO1xyXG4gICAgICAgIHRoaXMuc291cmNlSWQgPSBzb3VyY2VOb2RlLmlkLnRvU3RyaW5nKCk7XHJcblxyXG4gICAgICAgIHRoaXMubWFya2VyID0gbnVsbDtcclxuICAgICAgICB0aGlzLmxpbmtzID0geyBpbkRlZ3JlZTogW10sIG91dERlZ3JlZTogW10gfTtcclxuICAgICAgICB0aGlzLnNvdXJjZU5vZGUgPSBzb3VyY2VOb2RlO1xyXG4gICAgICAgIHRoaXMubGFiZWwgPSBsYWJlbDtcclxuICAgICAgICB0aGlzLkc2TW9kZWxQcm9wcyA9IHRoaXMuZ2VuZXJhdGVHNk1vZGVsUHJvcHMob3B0aW9ucyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGdlbmVyYXRlRzZNb2RlbFByb3BzKG9wdGlvbnM6IE5vZGVPcHRpb24pOiBOb2RlQ29uZmlnIHtcclxuICAgICAgICBsZXQgaW5kZXhPcHRpb25zID0gVXRpbC5vYmplY3RDbG9uZTxOb2RlSW5kZXhPcHRpb24+KG9wdGlvbnMuaW5kZXhPcHRpb25zKTtcclxuXHJcbiAgICAgICAgaWYgKGluZGV4T3B0aW9ucykge1xyXG4gICAgICAgICAgICBPYmplY3Qua2V5cyhpbmRleE9wdGlvbnMpLm1hcChrZXkgPT4ge1xyXG4gICAgICAgICAgICAgICAgbGV0IGluZGV4T3B0aW9uSXRlbSA9IGluZGV4T3B0aW9uc1trZXldO1xyXG4gICAgICAgICAgICAgICAgaW5kZXhPcHRpb25JdGVtLnZhbHVlID0gdGhpcy5zb3VyY2VOb2RlW2tleV0gPz8gJyc7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgLi4udGhpcy5zb3VyY2VOb2RlLFxyXG4gICAgICAgICAgICBpZDogdGhpcy5pZCxcclxuICAgICAgICAgICAgeDogMCxcclxuICAgICAgICAgICAgeTogMCxcclxuICAgICAgICAgICAgcm90YXRpb246IG9wdGlvbnMucm90YXRpb24gfHwgMCxcclxuICAgICAgICAgICAgdHlwZTogb3B0aW9ucy50eXBlLFxyXG4gICAgICAgICAgICBzaXplOiBvcHRpb25zLnNpemUgfHwgWzYwLCAzMF0sXHJcbiAgICAgICAgICAgIGFuY2hvclBvaW50czogb3B0aW9ucy5hbmNob3JQb2ludHMsXHJcbiAgICAgICAgICAgIGxhYmVsOiB0aGlzLmxhYmVsIGFzIHN0cmluZyxcclxuICAgICAgICAgICAgc3R5bGU6IFV0aWwub2JqZWN0Q2xvbmU8U3R5bGU+KG9wdGlvbnMuc3R5bGUpLFxyXG4gICAgICAgICAgICBsYWJlbENmZzogVXRpbC5vYmplY3RDbG9uZTxOb2RlTGFiZWxPcHRpb24+KG9wdGlvbnMubGFiZWxPcHRpb25zKSxcclxuICAgICAgICAgICAgaW5kZXhDZmc6IGluZGV4T3B0aW9uc1xyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgaXNOb2RlKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFNvdXJjZUlkKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc291cmNlSWQ7XHJcbiAgICB9XHJcbn07XHJcblxyXG5cclxuXHJcblxyXG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///174\n")},function(module,exports){eval("//# sourceMappingURL=types.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy1iYXNlL2VzbS90eXBlcy5qcz9lMWM2Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBIiwiZmlsZSI6IjE3NS5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vIyBzb3VyY2VNYXBwaW5nVVJMPXR5cGVzLmpzLm1hcCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///175\n")},function(module,exports){eval("//# sourceMappingURL=interfaces.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy1iYXNlL2VzbS9pbnRlcmZhY2VzLmpzP2I1ZDUiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEiLCJmaWxlIjoiMTc2LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW50ZXJmYWNlcy5qcy5tYXAiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///176\n")},function(module,exports){eval("// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n} ())\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcHJvY2Vzcy9icm93c2VyLmpzP2YyOGMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixzQkFBc0I7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHFDQUFxQzs7QUFFckM7QUFDQTtBQUNBOztBQUVBLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsVUFBVSIsImZpbGUiOiIxNzcuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBzaGltIGZvciB1c2luZyBwcm9jZXNzIGluIGJyb3dzZXJcbnZhciBwcm9jZXNzID0gbW9kdWxlLmV4cG9ydHMgPSB7fTtcblxuLy8gY2FjaGVkIGZyb20gd2hhdGV2ZXIgZ2xvYmFsIGlzIHByZXNlbnQgc28gdGhhdCB0ZXN0IHJ1bm5lcnMgdGhhdCBzdHViIGl0XG4vLyBkb24ndCBicmVhayB0aGluZ3MuICBCdXQgd2UgbmVlZCB0byB3cmFwIGl0IGluIGEgdHJ5IGNhdGNoIGluIGNhc2UgaXQgaXNcbi8vIHdyYXBwZWQgaW4gc3RyaWN0IG1vZGUgY29kZSB3aGljaCBkb2Vzbid0IGRlZmluZSBhbnkgZ2xvYmFscy4gIEl0J3MgaW5zaWRlIGFcbi8vIGZ1bmN0aW9uIGJlY2F1c2UgdHJ5L2NhdGNoZXMgZGVvcHRpbWl6ZSBpbiBjZXJ0YWluIGVuZ2luZXMuXG5cbnZhciBjYWNoZWRTZXRUaW1lb3V0O1xudmFyIGNhY2hlZENsZWFyVGltZW91dDtcblxuZnVuY3Rpb24gZGVmYXVsdFNldFRpbW91dCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRDbGVhclRpbWVvdXQgKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG4oZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2V0VGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2YgY2xlYXJUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgIH1cbn0gKCkpXG5mdW5jdGlvbiBydW5UaW1lb3V0KGZ1bikge1xuICAgIGlmIChjYWNoZWRTZXRUaW1lb3V0ID09PSBzZXRUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICAvLyBpZiBzZXRUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkU2V0VGltZW91dCA9PT0gZGVmYXVsdFNldFRpbW91dCB8fCAhY2FjaGVkU2V0VGltZW91dCkgJiYgc2V0VGltZW91dCkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dChmdW4sIDApO1xuICAgIH0gY2F0Y2goZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwobnVsbCwgZnVuLCAwKTtcbiAgICAgICAgfSBjYXRjaChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yXG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKHRoaXMsIGZ1biwgMCk7XG4gICAgICAgIH1cbiAgICB9XG5cblxufVxuZnVuY3Rpb24gcnVuQ2xlYXJUaW1lb3V0KG1hcmtlcikge1xuICAgIGlmIChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGNsZWFyVGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICAvLyBpZiBjbGVhclRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGRlZmF1bHRDbGVhclRpbWVvdXQgfHwgIWNhY2hlZENsZWFyVGltZW91dCkgJiYgY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCAgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbChudWxsLCBtYXJrZXIpO1xuICAgICAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yLlxuICAgICAgICAgICAgLy8gU29tZSB2ZXJzaW9ucyBvZiBJLkUuIGhhdmUgZGlmZmVyZW50IHJ1bGVzIGZvciBjbGVhclRpbWVvdXQgdnMgc2V0VGltZW91dFxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKHRoaXMsIG1hcmtlcik7XG4gICAgICAgIH1cbiAgICB9XG5cblxuXG59XG52YXIgcXVldWUgPSBbXTtcbnZhciBkcmFpbmluZyA9IGZhbHNlO1xudmFyIGN1cnJlbnRRdWV1ZTtcbnZhciBxdWV1ZUluZGV4ID0gLTE7XG5cbmZ1bmN0aW9uIGNsZWFuVXBOZXh0VGljaygpIHtcbiAgICBpZiAoIWRyYWluaW5nIHx8ICFjdXJyZW50UXVldWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIGlmIChjdXJyZW50UXVldWUubGVuZ3RoKSB7XG4gICAgICAgIHF1ZXVlID0gY3VycmVudFF1ZXVlLmNvbmNhdChxdWV1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgIH1cbiAgICBpZiAocXVldWUubGVuZ3RoKSB7XG4gICAgICAgIGRyYWluUXVldWUoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRyYWluUXVldWUoKSB7XG4gICAgaWYgKGRyYWluaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHRpbWVvdXQgPSBydW5UaW1lb3V0KGNsZWFuVXBOZXh0VGljayk7XG4gICAgZHJhaW5pbmcgPSB0cnVlO1xuXG4gICAgdmFyIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB3aGlsZShsZW4pIHtcbiAgICAgICAgY3VycmVudFF1ZXVlID0gcXVldWU7XG4gICAgICAgIHF1ZXVlID0gW107XG4gICAgICAgIHdoaWxlICgrK3F1ZXVlSW5kZXggPCBsZW4pIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50UXVldWUpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UXVldWVbcXVldWVJbmRleF0ucnVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgICAgICBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgfVxuICAgIGN1cnJlbnRRdWV1ZSA9IG51bGw7XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBydW5DbGVhclRpbWVvdXQodGltZW91dCk7XG59XG5cbnByb2Nlc3MubmV4dFRpY2sgPSBmdW5jdGlvbiAoZnVuKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcXVldWUucHVzaChuZXcgSXRlbShmdW4sIGFyZ3MpKTtcbiAgICBpZiAocXVldWUubGVuZ3RoID09PSAxICYmICFkcmFpbmluZykge1xuICAgICAgICBydW5UaW1lb3V0KGRyYWluUXVldWUpO1xuICAgIH1cbn07XG5cbi8vIHY4IGxpa2VzIHByZWRpY3RpYmxlIG9iamVjdHNcbmZ1bmN0aW9uIEl0ZW0oZnVuLCBhcnJheSkge1xuICAgIHRoaXMuZnVuID0gZnVuO1xuICAgIHRoaXMuYXJyYXkgPSBhcnJheTtcbn1cbkl0ZW0ucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmZ1bi5hcHBseShudWxsLCB0aGlzLmFycmF5KTtcbn07XG5wcm9jZXNzLnRpdGxlID0gJ2Jyb3dzZXInO1xucHJvY2Vzcy5icm93c2VyID0gdHJ1ZTtcbnByb2Nlc3MuZW52ID0ge307XG5wcm9jZXNzLmFyZ3YgPSBbXTtcbnByb2Nlc3MudmVyc2lvbiA9ICcnOyAvLyBlbXB0eSBzdHJpbmcgdG8gYXZvaWQgcmVnZXhwIGlzc3Vlc1xucHJvY2Vzcy52ZXJzaW9ucyA9IHt9O1xuXG5mdW5jdGlvbiBub29wKCkge31cblxucHJvY2Vzcy5vbiA9IG5vb3A7XG5wcm9jZXNzLmFkZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3Mub25jZSA9IG5vb3A7XG5wcm9jZXNzLm9mZiA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUxpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlQWxsTGlzdGVuZXJzID0gbm9vcDtcbnByb2Nlc3MuZW1pdCA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRPbmNlTGlzdGVuZXIgPSBub29wO1xuXG5wcm9jZXNzLmxpc3RlbmVycyA9IGZ1bmN0aW9uIChuYW1lKSB7IHJldHVybiBbXSB9XG5cbnByb2Nlc3MuYmluZGluZyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcblxucHJvY2Vzcy5jd2QgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAnLycgfTtcbnByb2Nlc3MuY2hkaXIgPSBmdW5jdGlvbiAoZGlyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5wcm9jZXNzLnVtYXNrID0gZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///177\n")},function(module,__webpack_exports__,__webpack_require__){"use strict";eval('/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1);\n/* harmony import */ var _container__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(139);\n\n\nvar AbstractGroup = /** @class */ (function (_super) {\n Object(tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"])(AbstractGroup, _super);\n function AbstractGroup() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n AbstractGroup.prototype.isGroup = function () {\n return true;\n };\n AbstractGroup.prototype.isEntityGroup = function () {\n return false;\n };\n AbstractGroup.prototype.clone = function () {\n var clone = _super.prototype.clone.call(this);\n // 获取构造函数\n var children = this.getChildren();\n for (var i = 0; i < children.length; i++) {\n var child = children[i];\n clone.add(child.clone());\n }\n return clone;\n };\n return AbstractGroup;\n}(_container__WEBPACK_IMPORTED_MODULE_1__[/* default */ "a"]));\n/* harmony default export */ __webpack_exports__["a"] = (AbstractGroup);\n//# sourceMappingURL=group.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy1iYXNlL2VzbS9hYnN0cmFjdC9ncm91cC5qcz9mODNjIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBa0M7QUFDRTtBQUNwQztBQUNBLElBQUksdURBQVM7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixxQkFBcUI7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxDQUFDLDBEQUFTO0FBQ0ksc0VBQWEsRUFBQztBQUM3QiIsImZpbGUiOiIxNzguanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCBDb250YWluZXIgZnJvbSAnLi9jb250YWluZXInO1xudmFyIEFic3RyYWN0R3JvdXAgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEFic3RyYWN0R3JvdXAsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gQWJzdHJhY3RHcm91cCgpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgIH1cbiAgICBBYnN0cmFjdEdyb3VwLnByb3RvdHlwZS5pc0dyb3VwID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuICAgIEFic3RyYWN0R3JvdXAucHJvdG90eXBlLmlzRW50aXR5R3JvdXAgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICAgIEFic3RyYWN0R3JvdXAucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgY2xvbmUgPSBfc3VwZXIucHJvdG90eXBlLmNsb25lLmNhbGwodGhpcyk7XG4gICAgICAgIC8vIOiOt+WPluaehOmAoOWHveaVsFxuICAgICAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLmdldENoaWxkcmVuKCk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBjaGlsZCA9IGNoaWxkcmVuW2ldO1xuICAgICAgICAgICAgY2xvbmUuYWRkKGNoaWxkLmNsb25lKCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjbG9uZTtcbiAgICB9O1xuICAgIHJldHVybiBBYnN0cmFjdEdyb3VwO1xufShDb250YWluZXIpKTtcbmV4cG9ydCBkZWZhdWx0IEFic3RyYWN0R3JvdXA7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1ncm91cC5qcy5tYXAiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///178\n')},function(module,__webpack_exports__,__webpack_require__){"use strict";eval("/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1);\n/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(140);\n/* harmony import */ var _util_matrix__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(38);\n\n\n\nvar AbstractShape = /** @class */ (function (_super) {\n Object(tslib__WEBPACK_IMPORTED_MODULE_0__[\"__extends\"])(AbstractShape, _super);\n function AbstractShape(cfg) {\n return _super.call(this, cfg) || this;\n }\n // 是否在包围盒内\n AbstractShape.prototype._isInBBox = function (refX, refY) {\n var bbox = this.getBBox();\n return bbox.minX <= refX && bbox.maxX >= refX && bbox.minY <= refY && bbox.maxY >= refY;\n };\n /**\n * 属性更改后需要做的事情\n * @protected\n * @param {ShapeAttrs} targetAttrs 渲染的图像属性\n */\n AbstractShape.prototype.afterAttrsChange = function (targetAttrs) {\n _super.prototype.afterAttrsChange.call(this, targetAttrs);\n this.clearCacheBBox();\n };\n // 计算包围盒时,需要缓存,这是一个高频的操作\n AbstractShape.prototype.getBBox = function () {\n var bbox = this.cfg.bbox;\n if (!bbox) {\n bbox = this.calculateBBox();\n this.set('bbox', bbox);\n }\n return bbox;\n };\n // 计算相对于画布的包围盒\n AbstractShape.prototype.getCanvasBBox = function () {\n var canvasBBox = this.cfg.canvasBBox;\n if (!canvasBBox) {\n canvasBBox = this.calculateCanvasBBox();\n this.set('canvasBBox', canvasBBox);\n }\n return canvasBBox;\n };\n AbstractShape.prototype.applyMatrix = function (matrix) {\n _super.prototype.applyMatrix.call(this, matrix);\n // 清理掉缓存的包围盒\n this.set('canvasBBox', null);\n };\n /**\n * 计算相对于画布的包围盒,默认等同于 bbox\n * @return {BBox} 包围盒\n */\n AbstractShape.prototype.calculateCanvasBBox = function () {\n var bbox = this.getBBox();\n var totalMatrix = this.getTotalMatrix();\n var minX = bbox.minX, minY = bbox.minY, maxX = bbox.maxX, maxY = bbox.maxY;\n if (totalMatrix) {\n var topLeft = Object(_util_matrix__WEBPACK_IMPORTED_MODULE_2__[/* multiplyVec2 */ \"c\"])(totalMatrix, [bbox.minX, bbox.minY]);\n var topRight = Object(_util_matrix__WEBPACK_IMPORTED_MODULE_2__[/* multiplyVec2 */ \"c\"])(totalMatrix, [bbox.maxX, bbox.minY]);\n var bottomLeft = Object(_util_matrix__WEBPACK_IMPORTED_MODULE_2__[/* multiplyVec2 */ \"c\"])(totalMatrix, [bbox.minX, bbox.maxY]);\n var bottomRight = Object(_util_matrix__WEBPACK_IMPORTED_MODULE_2__[/* multiplyVec2 */ \"c\"])(totalMatrix, [bbox.maxX, bbox.maxY]);\n minX = Math.min(topLeft[0], topRight[0], bottomLeft[0], bottomRight[0]);\n maxX = Math.max(topLeft[0], topRight[0], bottomLeft[0], bottomRight[0]);\n minY = Math.min(topLeft[1], topRight[1], bottomLeft[1], bottomRight[1]);\n maxY = Math.max(topLeft[1], topRight[1], bottomLeft[1], bottomRight[1]);\n }\n var attrs = this.attrs;\n // 如果存在 shadow 则计算 shadow\n if (attrs.shadowColor) {\n var _a = attrs.shadowBlur, shadowBlur = _a === void 0 ? 0 : _a, _b = attrs.shadowOffsetX, shadowOffsetX = _b === void 0 ? 0 : _b, _c = attrs.shadowOffsetY, shadowOffsetY = _c === void 0 ? 0 : _c;\n var shadowLeft = minX - shadowBlur + shadowOffsetX;\n var shadowRight = maxX + shadowBlur + shadowOffsetX;\n var shadowTop = minY - shadowBlur + shadowOffsetY;\n var shadowBottom = maxY + shadowBlur + shadowOffsetY;\n minX = Math.min(minX, shadowLeft);\n maxX = Math.max(maxX, shadowRight);\n minY = Math.min(minY, shadowTop);\n maxY = Math.max(maxY, shadowBottom);\n }\n return {\n x: minX,\n y: minY,\n minX: minX,\n minY: minY,\n maxX: maxX,\n maxY: maxY,\n width: maxX - minX,\n height: maxY - minY,\n };\n };\n /**\n * @protected\n * 清理缓存的 bbox\n */\n AbstractShape.prototype.clearCacheBBox = function () {\n this.set('bbox', null);\n this.set('canvasBBox', null);\n };\n // 实现接口\n AbstractShape.prototype.isClipShape = function () {\n return this.get('isClipShape');\n };\n /**\n * @protected\n * 不同的图形自己实现是否在图形内部的逻辑,要判断边和填充区域\n * @param {number} refX 相对于图形的坐标 x\n * @param {number} refY 相对于图形的坐标 Y\n * @return {boolean} 点是否在图形内部\n */\n AbstractShape.prototype.isInShape = function (refX, refY) {\n return false;\n };\n /**\n * 是否仅仅使用 BBox 检测就可以判定拾取到图形\n * 默认是 false,但是有些图形例如 image、marker 等都可直接使用 BBox 的检测而不需要使用图形拾取\n * @return {Boolean} 仅仅使用 BBox 进行拾取\n */\n AbstractShape.prototype.isOnlyHitBox = function () {\n return false;\n };\n // 不同的 Shape 各自实现\n AbstractShape.prototype.isHit = function (x, y) {\n var startArrowShape = this.get('startArrowShape');\n var endArrowShape = this.get('endArrowShape');\n var vec = [x, y, 1];\n vec = this.invertFromMatrix(vec);\n var refX = vec[0], refY = vec[1];\n var inBBox = this._isInBBox(refX, refY);\n // 跳过图形的拾取,在某些图形中可以省略一倍的检测成本\n if (this.isOnlyHitBox()) {\n return inBBox;\n }\n // 被裁减掉的和不在包围盒内的不进行计算\n if (inBBox && !this.isClipped(refX, refY)) {\n // 对图形进行拾取判断\n if (this.isInShape(refX, refY)) {\n return true;\n }\n // 对起始箭头进行拾取判断\n if (startArrowShape && startArrowShape.isHit(refX, refY)) {\n return true;\n }\n // 对结束箭头进行拾取判断\n if (endArrowShape && endArrowShape.isHit(refX, refY)) {\n return true;\n }\n }\n return false;\n };\n return AbstractShape;\n}(_element__WEBPACK_IMPORTED_MODULE_1__[/* default */ \"a\"]));\n/* harmony default export */ __webpack_exports__[\"a\"] = (AbstractShape);\n//# sourceMappingURL=shape.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy1iYXNlL2VzbS9hYnN0cmFjdC9zaGFwZS5qcz8zMWExIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFrQztBQUNGO0FBQ2M7QUFDOUM7QUFDQSxJQUFJLHVEQUFTO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsV0FBVztBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsS0FBSztBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIseUVBQVk7QUFDdEMsMkJBQTJCLHlFQUFZO0FBQ3ZDLDZCQUE2Qix5RUFBWTtBQUN6Qyw4QkFBOEIseUVBQVk7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixPQUFPO0FBQ3ZCLGdCQUFnQixPQUFPO0FBQ3ZCLGdCQUFnQixRQUFRO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLFFBQVE7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLENBQUMsd0RBQU87QUFDTSxzRUFBYSxFQUFDO0FBQzdCIiwiZmlsZSI6IjE3OS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IEVsZW1lbnQgZnJvbSAnLi9lbGVtZW50JztcbmltcG9ydCB7IG11bHRpcGx5VmVjMiB9IGZyb20gJy4uL3V0aWwvbWF0cml4JztcbnZhciBBYnN0cmFjdFNoYXBlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhBYnN0cmFjdFNoYXBlLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEFic3RyYWN0U2hhcGUoY2ZnKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIuY2FsbCh0aGlzLCBjZmcpIHx8IHRoaXM7XG4gICAgfVxuICAgIC8vIOaYr+WQpuWcqOWMheWbtOebkuWGhVxuICAgIEFic3RyYWN0U2hhcGUucHJvdG90eXBlLl9pc0luQkJveCA9IGZ1bmN0aW9uIChyZWZYLCByZWZZKSB7XG4gICAgICAgIHZhciBiYm94ID0gdGhpcy5nZXRCQm94KCk7XG4gICAgICAgIHJldHVybiBiYm94Lm1pblggPD0gcmVmWCAmJiBiYm94Lm1heFggPj0gcmVmWCAmJiBiYm94Lm1pblkgPD0gcmVmWSAmJiBiYm94Lm1heFkgPj0gcmVmWTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIOWxnuaAp+abtOaUueWQjumcgOimgeWBmueahOS6i+aDhVxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKiBAcGFyYW0ge1NoYXBlQXR0cnN9IHRhcmdldEF0dHJzIOa4suafk+eahOWbvuWDj+WxnuaAp1xuICAgICAqL1xuICAgIEFic3RyYWN0U2hhcGUucHJvdG90eXBlLmFmdGVyQXR0cnNDaGFuZ2UgPSBmdW5jdGlvbiAodGFyZ2V0QXR0cnMpIHtcbiAgICAgICAgX3N1cGVyLnByb3RvdHlwZS5hZnRlckF0dHJzQ2hhbmdlLmNhbGwodGhpcywgdGFyZ2V0QXR0cnMpO1xuICAgICAgICB0aGlzLmNsZWFyQ2FjaGVCQm94KCk7XG4gICAgfTtcbiAgICAvLyDorqHnrpfljIXlm7Tnm5Lml7bvvIzpnIDopoHnvJPlrZjvvIzov5nmmK/kuIDkuKrpq5jpopHnmoTmk43kvZxcbiAgICBBYnN0cmFjdFNoYXBlLnByb3RvdHlwZS5nZXRCQm94ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYmJveCA9IHRoaXMuY2ZnLmJib3g7XG4gICAgICAgIGlmICghYmJveCkge1xuICAgICAgICAgICAgYmJveCA9IHRoaXMuY2FsY3VsYXRlQkJveCgpO1xuICAgICAgICAgICAgdGhpcy5zZXQoJ2Jib3gnLCBiYm94KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYmJveDtcbiAgICB9O1xuICAgIC8vIOiuoeeul+ebuOWvueS6jueUu+W4g+eahOWMheWbtOebklxuICAgIEFic3RyYWN0U2hhcGUucHJvdG90eXBlLmdldENhbnZhc0JCb3ggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBjYW52YXNCQm94ID0gdGhpcy5jZmcuY2FudmFzQkJveDtcbiAgICAgICAgaWYgKCFjYW52YXNCQm94KSB7XG4gICAgICAgICAgICBjYW52YXNCQm94ID0gdGhpcy5jYWxjdWxhdGVDYW52YXNCQm94KCk7XG4gICAgICAgICAgICB0aGlzLnNldCgnY2FudmFzQkJveCcsIGNhbnZhc0JCb3gpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjYW52YXNCQm94O1xuICAgIH07XG4gICAgQWJzdHJhY3RTaGFwZS5wcm90b3R5cGUuYXBwbHlNYXRyaXggPSBmdW5jdGlvbiAobWF0cml4KSB7XG4gICAgICAgIF9zdXBlci5wcm90b3R5cGUuYXBwbHlNYXRyaXguY2FsbCh0aGlzLCBtYXRyaXgpO1xuICAgICAgICAvLyDmuIXnkIbmjonnvJPlrZjnmoTljIXlm7Tnm5JcbiAgICAgICAgdGhpcy5zZXQoJ2NhbnZhc0JCb3gnLCBudWxsKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIOiuoeeul+ebuOWvueS6jueUu+W4g+eahOWMheWbtOebku+8jOm7mOiupOetieWQjOS6jiBiYm94XG4gICAgICogQHJldHVybiB7QkJveH0g5YyF5Zu055uSXG4gICAgICovXG4gICAgQWJzdHJhY3RTaGFwZS5wcm90b3R5cGUuY2FsY3VsYXRlQ2FudmFzQkJveCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGJib3ggPSB0aGlzLmdldEJCb3goKTtcbiAgICAgICAgdmFyIHRvdGFsTWF0cml4ID0gdGhpcy5nZXRUb3RhbE1hdHJpeCgpO1xuICAgICAgICB2YXIgbWluWCA9IGJib3gubWluWCwgbWluWSA9IGJib3gubWluWSwgbWF4WCA9IGJib3gubWF4WCwgbWF4WSA9IGJib3gubWF4WTtcbiAgICAgICAgaWYgKHRvdGFsTWF0cml4KSB7XG4gICAgICAgICAgICB2YXIgdG9wTGVmdCA9IG11bHRpcGx5VmVjMih0b3RhbE1hdHJpeCwgW2Jib3gubWluWCwgYmJveC5taW5ZXSk7XG4gICAgICAgICAgICB2YXIgdG9wUmlnaHQgPSBtdWx0aXBseVZlYzIodG90YWxNYXRyaXgsIFtiYm94Lm1heFgsIGJib3gubWluWV0pO1xuICAgICAgICAgICAgdmFyIGJvdHRvbUxlZnQgPSBtdWx0aXBseVZlYzIodG90YWxNYXRyaXgsIFtiYm94Lm1pblgsIGJib3gubWF4WV0pO1xuICAgICAgICAgICAgdmFyIGJvdHRvbVJpZ2h0ID0gbXVsdGlwbHlWZWMyKHRvdGFsTWF0cml4LCBbYmJveC5tYXhYLCBiYm94Lm1heFldKTtcbiAgICAgICAgICAgIG1pblggPSBNYXRoLm1pbih0b3BMZWZ0WzBdLCB0b3BSaWdodFswXSwgYm90dG9tTGVmdFswXSwgYm90dG9tUmlnaHRbMF0pO1xuICAgICAgICAgICAgbWF4WCA9IE1hdGgubWF4KHRvcExlZnRbMF0sIHRvcFJpZ2h0WzBdLCBib3R0b21MZWZ0WzBdLCBib3R0b21SaWdodFswXSk7XG4gICAgICAgICAgICBtaW5ZID0gTWF0aC5taW4odG9wTGVmdFsxXSwgdG9wUmlnaHRbMV0sIGJvdHRvbUxlZnRbMV0sIGJvdHRvbVJpZ2h0WzFdKTtcbiAgICAgICAgICAgIG1heFkgPSBNYXRoLm1heCh0b3BMZWZ0WzFdLCB0b3BSaWdodFsxXSwgYm90dG9tTGVmdFsxXSwgYm90dG9tUmlnaHRbMV0pO1xuICAgICAgICB9XG4gICAgICAgIHZhciBhdHRycyA9IHRoaXMuYXR0cnM7XG4gICAgICAgIC8vIOWmguaenOWtmOWcqCBzaGFkb3cg5YiZ6K6h566XIHNoYWRvd1xuICAgICAgICBpZiAoYXR0cnMuc2hhZG93Q29sb3IpIHtcbiAgICAgICAgICAgIHZhciBfYSA9IGF0dHJzLnNoYWRvd0JsdXIsIHNoYWRvd0JsdXIgPSBfYSA9PT0gdm9pZCAwID8gMCA6IF9hLCBfYiA9IGF0dHJzLnNoYWRvd09mZnNldFgsIHNoYWRvd09mZnNldFggPSBfYiA9PT0gdm9pZCAwID8gMCA6IF9iLCBfYyA9IGF0dHJzLnNoYWRvd09mZnNldFksIHNoYWRvd09mZnNldFkgPSBfYyA9PT0gdm9pZCAwID8gMCA6IF9jO1xuICAgICAgICAgICAgdmFyIHNoYWRvd0xlZnQgPSBtaW5YIC0gc2hhZG93Qmx1ciArIHNoYWRvd09mZnNldFg7XG4gICAgICAgICAgICB2YXIgc2hhZG93UmlnaHQgPSBtYXhYICsgc2hhZG93Qmx1ciArIHNoYWRvd09mZnNldFg7XG4gICAgICAgICAgICB2YXIgc2hhZG93VG9wID0gbWluWSAtIHNoYWRvd0JsdXIgKyBzaGFkb3dPZmZzZXRZO1xuICAgICAgICAgICAgdmFyIHNoYWRvd0JvdHRvbSA9IG1heFkgKyBzaGFkb3dCbHVyICsgc2hhZG93T2Zmc2V0WTtcbiAgICAgICAgICAgIG1pblggPSBNYXRoLm1pbihtaW5YLCBzaGFkb3dMZWZ0KTtcbiAgICAgICAgICAgIG1heFggPSBNYXRoLm1heChtYXhYLCBzaGFkb3dSaWdodCk7XG4gICAgICAgICAgICBtaW5ZID0gTWF0aC5taW4obWluWSwgc2hhZG93VG9wKTtcbiAgICAgICAgICAgIG1heFkgPSBNYXRoLm1heChtYXhZLCBzaGFkb3dCb3R0b20pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB4OiBtaW5YLFxuICAgICAgICAgICAgeTogbWluWSxcbiAgICAgICAgICAgIG1pblg6IG1pblgsXG4gICAgICAgICAgICBtaW5ZOiBtaW5ZLFxuICAgICAgICAgICAgbWF4WDogbWF4WCxcbiAgICAgICAgICAgIG1heFk6IG1heFksXG4gICAgICAgICAgICB3aWR0aDogbWF4WCAtIG1pblgsXG4gICAgICAgICAgICBoZWlnaHQ6IG1heFkgLSBtaW5ZLFxuICAgICAgICB9O1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqIOa4heeQhue8k+WtmOeahCBiYm94XG4gICAgICovXG4gICAgQWJzdHJhY3RTaGFwZS5wcm90b3R5cGUuY2xlYXJDYWNoZUJCb3ggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuc2V0KCdiYm94JywgbnVsbCk7XG4gICAgICAgIHRoaXMuc2V0KCdjYW52YXNCQm94JywgbnVsbCk7XG4gICAgfTtcbiAgICAvLyDlrp7njrDmjqXlj6NcbiAgICBBYnN0cmFjdFNoYXBlLnByb3RvdHlwZS5pc0NsaXBTaGFwZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0KCdpc0NsaXBTaGFwZScpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqIOS4jeWQjOeahOWbvuW9ouiHquW3seWunueOsOaYr+WQpuWcqOWbvuW9ouWGhemDqOeahOmAu+i+ke+8jOimgeWIpOaWrei+ueWSjOWhq+WFheWMuuWfn1xuICAgICAqIEBwYXJhbSAge251bWJlcn0gIHJlZlgg55u45a+55LqO5Zu+5b2i55qE5Z2Q5qCHIHhcbiAgICAgKiBAcGFyYW0gIHtudW1iZXJ9ICByZWZZIOebuOWvueS6juWbvuW9oueahOWdkOaghyBZXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0g54K55piv5ZCm5Zyo5Zu+5b2i5YaF6YOoXG4gICAgICovXG4gICAgQWJzdHJhY3RTaGFwZS5wcm90b3R5cGUuaXNJblNoYXBlID0gZnVuY3Rpb24gKHJlZlgsIHJlZlkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG4gICAgLyoqXG4gICAgICog5piv5ZCm5LuF5LuF5L2/55SoIEJCb3gg5qOA5rWL5bCx5Y+v5Lul5Yik5a6a5ou+5Y+W5Yiw5Zu+5b2iXG4gICAgICog6buY6K6k5pivIGZhbHNl77yM5L2G5piv5pyJ5Lqb5Zu+5b2i5L6L5aaCIGltYWdl44CBbWFya2VyIOetiemDveWPr+ebtOaOpeS9v+eUqCBCQm94IOeahOajgOa1i+iAjOS4jemcgOimgeS9v+eUqOWbvuW9ouaLvuWPllxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59IOS7heS7heS9v+eUqCBCQm94IOi/m+ihjOaLvuWPllxuICAgICAqL1xuICAgIEFic3RyYWN0U2hhcGUucHJvdG90eXBlLmlzT25seUhpdEJveCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG4gICAgLy8g5LiN5ZCM55qEIFNoYXBlIOWQhOiHquWunueOsFxuICAgIEFic3RyYWN0U2hhcGUucHJvdG90eXBlLmlzSGl0ID0gZnVuY3Rpb24gKHgsIHkpIHtcbiAgICAgICAgdmFyIHN0YXJ0QXJyb3dTaGFwZSA9IHRoaXMuZ2V0KCdzdGFydEFycm93U2hhcGUnKTtcbiAgICAgICAgdmFyIGVuZEFycm93U2hhcGUgPSB0aGlzLmdldCgnZW5kQXJyb3dTaGFwZScpO1xuICAgICAgICB2YXIgdmVjID0gW3gsIHksIDFdO1xuICAgICAgICB2ZWMgPSB0aGlzLmludmVydEZyb21NYXRyaXgodmVjKTtcbiAgICAgICAgdmFyIHJlZlggPSB2ZWNbMF0sIHJlZlkgPSB2ZWNbMV07XG4gICAgICAgIHZhciBpbkJCb3ggPSB0aGlzLl9pc0luQkJveChyZWZYLCByZWZZKTtcbiAgICAgICAgLy8g6Lez6L+H5Zu+5b2i55qE5ou+5Y+W77yM5Zyo5p+Q5Lqb5Zu+5b2i5Lit5Y+v5Lul55yB55Wl5LiA5YCN55qE5qOA5rWL5oiQ5pysXG4gICAgICAgIGlmICh0aGlzLmlzT25seUhpdEJveCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5CQm94O1xuICAgICAgICB9XG4gICAgICAgIC8vIOiiq+ijgeWHj+aOieeahOWSjOS4jeWcqOWMheWbtOebkuWGheeahOS4jei/m+ihjOiuoeeul1xuICAgICAgICBpZiAoaW5CQm94ICYmICF0aGlzLmlzQ2xpcHBlZChyZWZYLCByZWZZKSkge1xuICAgICAgICAgICAgLy8g5a+55Zu+5b2i6L+b6KGM5ou+5Y+W5Yik5patXG4gICAgICAgICAgICBpZiAodGhpcy5pc0luU2hhcGUocmVmWCwgcmVmWSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIOWvuei1t+Wni+eureWktOi/m+ihjOaLvuWPluWIpOaWrVxuICAgICAgICAgICAgaWYgKHN0YXJ0QXJyb3dTaGFwZSAmJiBzdGFydEFycm93U2hhcGUuaXNIaXQocmVmWCwgcmVmWSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIOWvuee7k+adn+eureWktOi/m+ihjOaLvuWPluWIpOaWrVxuICAgICAgICAgICAgaWYgKGVuZEFycm93U2hhcGUgJiYgZW5kQXJyb3dTaGFwZS5pc0hpdChyZWZYLCByZWZZKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICAgIHJldHVybiBBYnN0cmFjdFNoYXBlO1xufShFbGVtZW50KSk7XG5leHBvcnQgZGVmYXVsdCBBYnN0cmFjdFNoYXBlO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2hhcGUuanMubWFwIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///179\n")},function(module,exports,__webpack_require__){"use strict";eval('\n\nObject.defineProperty(exports, "__esModule", {\n value: true\n});\nexports.default = getConnectedComponents;\nexports.detectStrongConnectComponents = exports.detectConnectedComponents = void 0;\n\nvar _util = __webpack_require__(45);\n\n/**\n * Generate all connected components for an undirected graph\n * @param graph\n */\nvar detectConnectedComponents = function detectConnectedComponents(graphData) {\n var _a = graphData.nodes,\n nodes = _a === void 0 ? [] : _a,\n _b = graphData.edges,\n edges = _b === void 0 ? [] : _b;\n var allComponents = [];\n var visited = {};\n var nodeStack = [];\n\n var getComponent = function getComponent(node) {\n nodeStack.push(node);\n visited[node.id] = true;\n var neighbors = (0, _util.getNeighbors)(node.id, edges);\n\n var _loop_1 = function _loop_1(i) {\n var neighbor = neighbors[i];\n\n if (!visited[neighbor]) {\n var targetNode = nodes.filter(function (node) {\n return node.id === neighbor;\n });\n\n if (targetNode.length > 0) {\n getComponent(targetNode[0]);\n }\n }\n };\n\n for (var i = 0; i < neighbors.length; ++i) {\n _loop_1(i);\n }\n };\n\n for (var i = 0; i < nodes.length; i++) {\n var node = nodes[i];\n\n if (!visited[node.id]) {\n // 对于无向图进行dfs遍历,每一次调用后都得到一个连通分量\n getComponent(node);\n var component = [];\n\n while (nodeStack.length > 0) {\n component.push(nodeStack.pop());\n }\n\n allComponents.push(component);\n }\n }\n\n return allComponents;\n};\n/**\n * Tarjan\'s Algorithm 复杂度 O(|V|+|E|)\n * For directed graph only\n * a directed graph is said to be strongly connected if "every vertex is reachable from every other vertex".\n * refer: http://en.wikipedia.org/wiki/Tarjan%27s_strongly_connected_components_algorithm\n * @param graph\n * @return a list of strongly connected components\n */\n\n\nexports.detectConnectedComponents = detectConnectedComponents;\n\nvar detectStrongConnectComponents = function detectStrongConnectComponents(graphData) {\n var _a = graphData.nodes,\n nodes = _a === void 0 ? [] : _a,\n _b = graphData.edges,\n edges = _b === void 0 ? [] : _b;\n var nodeStack = [];\n var inStack = {}; // 辅助判断是否已经在stack中,减少查找开销\n\n var indices = {};\n var lowLink = {};\n var allComponents = [];\n var index = 0;\n\n var getComponent = function getComponent(node) {\n // Set the depth index for v to the smallest unused index\n indices[node.id] = index;\n lowLink[node.id] = index;\n index += 1;\n nodeStack.push(node);\n inStack[node.id] = true; // 考虑每个邻接点\n\n var neighbors = (0, _util.getNeighbors)(node.id, edges, \'target\').filter(function (n) {\n return nodes.map(function (node) {\n return node.id;\n }).indexOf(n) > -1;\n });\n\n var _loop_2 = function _loop_2(i) {\n var targetNodeID = neighbors[i];\n\n if (!indices[targetNodeID] && indices[targetNodeID] !== 0) {\n var targetNode = nodes.filter(function (node) {\n return node.id === targetNodeID;\n });\n\n if (targetNode.length > 0) {\n getComponent(targetNode[0]);\n } // tree edge\n\n\n lowLink[node.id] = Math.min(lowLink[node.id], lowLink[targetNodeID]);\n } else if (inStack[targetNodeID]) {\n // back edge, target node is in the current SCC\n lowLink[node.id] = Math.min(lowLink[node.id], indices[targetNodeID]);\n }\n };\n\n for (var i = 0; i < neighbors.length; i++) {\n _loop_2(i);\n } // If node is a root node, generate an SCC\n\n\n if (lowLink[node.id] === indices[node.id]) {\n var component = [];\n\n while (nodeStack.length > 0) {\n var tmpNode = nodeStack.pop();\n inStack[tmpNode.id] = false;\n component.push(tmpNode);\n if (tmpNode === node) break;\n }\n\n if (component.length > 0) {\n allComponents.push(component);\n }\n }\n };\n\n for (var _i = 0, nodes_1 = nodes; _i < nodes_1.length; _i++) {\n var node = nodes_1[_i];\n\n if (!indices[node.id] && indices[node.id] !== 0) {\n getComponent(node);\n }\n }\n\n return allComponents;\n};\n\nexports.detectStrongConnectComponents = detectStrongConnectComponents;\n\nfunction getConnectedComponents(graphData, directed) {\n if (directed) return detectStrongConnectComponents(graphData);\n return detectConnectedComponents(graphData);\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvYWxnb3JpdGhtL2xpYi9jb25uZWN0ZWQtY29tcG9uZW50LmpzPzg2MmUiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWI7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBOztBQUVBLFlBQVksbUJBQU8sQ0FBQyxFQUFROztBQUU1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsbUJBQW1CLHNCQUFzQjtBQUN6QztBQUNBO0FBQ0E7O0FBRUEsaUJBQWlCLGtCQUFrQjtBQUNuQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7O0FBRW5CO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0Qjs7QUFFNUI7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7O0FBRUw7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQSxTQUFTOzs7QUFHVDtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxtQkFBbUIsc0JBQXNCO0FBQ3pDO0FBQ0EsS0FBSzs7O0FBR0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxtQ0FBbUMscUJBQXFCO0FBQ3hEOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiMTgwLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBnZXRDb25uZWN0ZWRDb21wb25lbnRzO1xuZXhwb3J0cy5kZXRlY3RTdHJvbmdDb25uZWN0Q29tcG9uZW50cyA9IGV4cG9ydHMuZGV0ZWN0Q29ubmVjdGVkQ29tcG9uZW50cyA9IHZvaWQgMDtcblxudmFyIF91dGlsID0gcmVxdWlyZShcIi4vdXRpbFwiKTtcblxuLyoqXG4gKiBHZW5lcmF0ZSBhbGwgY29ubmVjdGVkIGNvbXBvbmVudHMgZm9yIGFuIHVuZGlyZWN0ZWQgZ3JhcGhcbiAqIEBwYXJhbSBncmFwaFxuICovXG52YXIgZGV0ZWN0Q29ubmVjdGVkQ29tcG9uZW50cyA9IGZ1bmN0aW9uIGRldGVjdENvbm5lY3RlZENvbXBvbmVudHMoZ3JhcGhEYXRhKSB7XG4gIHZhciBfYSA9IGdyYXBoRGF0YS5ub2RlcyxcbiAgICAgIG5vZGVzID0gX2EgPT09IHZvaWQgMCA/IFtdIDogX2EsXG4gICAgICBfYiA9IGdyYXBoRGF0YS5lZGdlcyxcbiAgICAgIGVkZ2VzID0gX2IgPT09IHZvaWQgMCA/IFtdIDogX2I7XG4gIHZhciBhbGxDb21wb25lbnRzID0gW107XG4gIHZhciB2aXNpdGVkID0ge307XG4gIHZhciBub2RlU3RhY2sgPSBbXTtcblxuICB2YXIgZ2V0Q29tcG9uZW50ID0gZnVuY3Rpb24gZ2V0Q29tcG9uZW50KG5vZGUpIHtcbiAgICBub2RlU3RhY2sucHVzaChub2RlKTtcbiAgICB2aXNpdGVkW25vZGUuaWRdID0gdHJ1ZTtcbiAgICB2YXIgbmVpZ2hib3JzID0gKDAsIF91dGlsLmdldE5laWdoYm9ycykobm9kZS5pZCwgZWRnZXMpO1xuXG4gICAgdmFyIF9sb29wXzEgPSBmdW5jdGlvbiBfbG9vcF8xKGkpIHtcbiAgICAgIHZhciBuZWlnaGJvciA9IG5laWdoYm9yc1tpXTtcblxuICAgICAgaWYgKCF2aXNpdGVkW25laWdoYm9yXSkge1xuICAgICAgICB2YXIgdGFyZ2V0Tm9kZSA9IG5vZGVzLmZpbHRlcihmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICAgIHJldHVybiBub2RlLmlkID09PSBuZWlnaGJvcjtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHRhcmdldE5vZGUubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGdldENvbXBvbmVudCh0YXJnZXROb2RlWzBdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5laWdoYm9ycy5sZW5ndGg7ICsraSkge1xuICAgICAgX2xvb3BfMShpKTtcbiAgICB9XG4gIH07XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBub2RlID0gbm9kZXNbaV07XG5cbiAgICBpZiAoIXZpc2l0ZWRbbm9kZS5pZF0pIHtcbiAgICAgIC8vIOWvueS6juaXoOWQkeWbvui/m+ihjGRmc+mBjeWOhu+8jOavj+S4gOasoeiwg+eUqOWQjumDveW+l+WIsOS4gOS4qui/numAmuWIhumHj1xuICAgICAgZ2V0Q29tcG9uZW50KG5vZGUpO1xuICAgICAgdmFyIGNvbXBvbmVudCA9IFtdO1xuXG4gICAgICB3aGlsZSAobm9kZVN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29tcG9uZW50LnB1c2gobm9kZVN0YWNrLnBvcCgpKTtcbiAgICAgIH1cblxuICAgICAgYWxsQ29tcG9uZW50cy5wdXNoKGNvbXBvbmVudCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGFsbENvbXBvbmVudHM7XG59O1xuLyoqXG4gKiBUYXJqYW4ncyBBbGdvcml0aG0g5aSN5p2C5bqmICBPKHxWfCt8RXwpXG4gKiBGb3IgZGlyZWN0ZWQgZ3JhcGggb25seVxuICogYSBkaXJlY3RlZCBncmFwaCBpcyBzYWlkIHRvIGJlIHN0cm9uZ2x5IGNvbm5lY3RlZCBpZiBcImV2ZXJ5IHZlcnRleCBpcyByZWFjaGFibGUgZnJvbSBldmVyeSBvdGhlciB2ZXJ0ZXhcIi5cbiAqIHJlZmVyOiBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1RhcmphbiUyN3Nfc3Ryb25nbHlfY29ubmVjdGVkX2NvbXBvbmVudHNfYWxnb3JpdGhtXG4gKiBAcGFyYW0gZ3JhcGhcbiAqIEByZXR1cm4gYSBsaXN0IG9mIHN0cm9uZ2x5IGNvbm5lY3RlZCBjb21wb25lbnRzXG4gKi9cblxuXG5leHBvcnRzLmRldGVjdENvbm5lY3RlZENvbXBvbmVudHMgPSBkZXRlY3RDb25uZWN0ZWRDb21wb25lbnRzO1xuXG52YXIgZGV0ZWN0U3Ryb25nQ29ubmVjdENvbXBvbmVudHMgPSBmdW5jdGlvbiBkZXRlY3RTdHJvbmdDb25uZWN0Q29tcG9uZW50cyhncmFwaERhdGEpIHtcbiAgdmFyIF9hID0gZ3JhcGhEYXRhLm5vZGVzLFxuICAgICAgbm9kZXMgPSBfYSA9PT0gdm9pZCAwID8gW10gOiBfYSxcbiAgICAgIF9iID0gZ3JhcGhEYXRhLmVkZ2VzLFxuICAgICAgZWRnZXMgPSBfYiA9PT0gdm9pZCAwID8gW10gOiBfYjtcbiAgdmFyIG5vZGVTdGFjayA9IFtdO1xuICB2YXIgaW5TdGFjayA9IHt9OyAvLyDovoXliqnliKTmlq3mmK/lkKblt7Lnu4/lnKhzdGFja+S4re+8jOWHj+WwkeafpeaJvuW8gOmUgFxuXG4gIHZhciBpbmRpY2VzID0ge307XG4gIHZhciBsb3dMaW5rID0ge307XG4gIHZhciBhbGxDb21wb25lbnRzID0gW107XG4gIHZhciBpbmRleCA9IDA7XG5cbiAgdmFyIGdldENvbXBvbmVudCA9IGZ1bmN0aW9uIGdldENvbXBvbmVudChub2RlKSB7XG4gICAgLy8gU2V0IHRoZSBkZXB0aCBpbmRleCBmb3IgdiB0byB0aGUgc21hbGxlc3QgdW51c2VkIGluZGV4XG4gICAgaW5kaWNlc1tub2RlLmlkXSA9IGluZGV4O1xuICAgIGxvd0xpbmtbbm9kZS5pZF0gPSBpbmRleDtcbiAgICBpbmRleCArPSAxO1xuICAgIG5vZGVTdGFjay5wdXNoKG5vZGUpO1xuICAgIGluU3RhY2tbbm9kZS5pZF0gPSB0cnVlOyAvLyDogIPomZHmr4/kuKrpgrvmjqXngrlcblxuICAgIHZhciBuZWlnaGJvcnMgPSAoMCwgX3V0aWwuZ2V0TmVpZ2hib3JzKShub2RlLmlkLCBlZGdlcywgJ3RhcmdldCcpLmZpbHRlcihmdW5jdGlvbiAobikge1xuICAgICAgcmV0dXJuIG5vZGVzLm1hcChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5pZDtcbiAgICAgIH0pLmluZGV4T2YobikgPiAtMTtcbiAgICB9KTtcblxuICAgIHZhciBfbG9vcF8yID0gZnVuY3Rpb24gX2xvb3BfMihpKSB7XG4gICAgICB2YXIgdGFyZ2V0Tm9kZUlEID0gbmVpZ2hib3JzW2ldO1xuXG4gICAgICBpZiAoIWluZGljZXNbdGFyZ2V0Tm9kZUlEXSAmJiBpbmRpY2VzW3RhcmdldE5vZGVJRF0gIT09IDApIHtcbiAgICAgICAgdmFyIHRhcmdldE5vZGUgPSBub2Rlcy5maWx0ZXIoZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgICByZXR1cm4gbm9kZS5pZCA9PT0gdGFyZ2V0Tm9kZUlEO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAodGFyZ2V0Tm9kZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgZ2V0Q29tcG9uZW50KHRhcmdldE5vZGVbMF0pO1xuICAgICAgICB9IC8vIHRyZWUgZWRnZVxuXG5cbiAgICAgICAgbG93TGlua1tub2RlLmlkXSA9IE1hdGgubWluKGxvd0xpbmtbbm9kZS5pZF0sIGxvd0xpbmtbdGFyZ2V0Tm9kZUlEXSk7XG4gICAgICB9IGVsc2UgaWYgKGluU3RhY2tbdGFyZ2V0Tm9kZUlEXSkge1xuICAgICAgICAvLyBiYWNrIGVkZ2UsIHRhcmdldCBub2RlIGlzIGluIHRoZSBjdXJyZW50IFNDQ1xuICAgICAgICBsb3dMaW5rW25vZGUuaWRdID0gTWF0aC5taW4obG93TGlua1tub2RlLmlkXSwgaW5kaWNlc1t0YXJnZXROb2RlSURdKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuZWlnaGJvcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIF9sb29wXzIoaSk7XG4gICAgfSAvLyBJZiBub2RlIGlzIGEgcm9vdCBub2RlLCBnZW5lcmF0ZSBhbiBTQ0NcblxuXG4gICAgaWYgKGxvd0xpbmtbbm9kZS5pZF0gPT09IGluZGljZXNbbm9kZS5pZF0pIHtcbiAgICAgIHZhciBjb21wb25lbnQgPSBbXTtcblxuICAgICAgd2hpbGUgKG5vZGVTdGFjay5sZW5ndGggPiAwKSB7XG4gICAgICAgIHZhciB0bXBOb2RlID0gbm9kZVN0YWNrLnBvcCgpO1xuICAgICAgICBpblN0YWNrW3RtcE5vZGUuaWRdID0gZmFsc2U7XG4gICAgICAgIGNvbXBvbmVudC5wdXNoKHRtcE5vZGUpO1xuICAgICAgICBpZiAodG1wTm9kZSA9PT0gbm9kZSkgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb21wb25lbnQubGVuZ3RoID4gMCkge1xuICAgICAgICBhbGxDb21wb25lbnRzLnB1c2goY29tcG9uZW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgZm9yICh2YXIgX2kgPSAwLCBub2Rlc18xID0gbm9kZXM7IF9pIDwgbm9kZXNfMS5sZW5ndGg7IF9pKyspIHtcbiAgICB2YXIgbm9kZSA9IG5vZGVzXzFbX2ldO1xuXG4gICAgaWYgKCFpbmRpY2VzW25vZGUuaWRdICYmIGluZGljZXNbbm9kZS5pZF0gIT09IDApIHtcbiAgICAgIGdldENvbXBvbmVudChub2RlKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYWxsQ29tcG9uZW50cztcbn07XG5cbmV4cG9ydHMuZGV0ZWN0U3Ryb25nQ29ubmVjdENvbXBvbmVudHMgPSBkZXRlY3RTdHJvbmdDb25uZWN0Q29tcG9uZW50cztcblxuZnVuY3Rpb24gZ2V0Q29ubmVjdGVkQ29tcG9uZW50cyhncmFwaERhdGEsIGRpcmVjdGVkKSB7XG4gIGlmIChkaXJlY3RlZCkgcmV0dXJuIGRldGVjdFN0cm9uZ0Nvbm5lY3RDb21wb25lbnRzKGdyYXBoRGF0YSk7XG4gIHJldHVybiBkZXRlY3RDb25uZWN0ZWRDb21wb25lbnRzKGdyYXBoRGF0YSk7XG59Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///180\n')},function(module,exports,__webpack_require__){"use strict";eval('\n\nObject.defineProperty(exports, "__esModule", {\n value: true\n});\nexports.getOutDegree = exports.getInDegree = exports.default = void 0;\n\nvar degree = function degree(graphData) {\n var degrees = {};\n var _a = graphData.nodes,\n nodes = _a === void 0 ? [] : _a,\n _b = graphData.edges,\n edges = _b === void 0 ? [] : _b;\n nodes.forEach(function (node) {\n degrees[node.id] = {\n degree: 0,\n inDegree: 0,\n outDegree: 0\n };\n });\n edges.forEach(function (edge) {\n degrees[edge.source].degree++;\n degrees[edge.source].outDegree++;\n degrees[edge.target].degree++;\n degrees[edge.target].inDegree++;\n });\n return degrees;\n};\n\nvar _default = degree;\n/**\n * 获取指定节点的入度\n * @param graphData 图数据\n * @param nodeId 节点ID\n */\n\nexports.default = _default;\n\nvar getInDegree = function getInDegree(graphData, nodeId) {\n var nodeDegree = degree(graphData);\n\n if (nodeDegree[nodeId]) {\n return degree(graphData)[nodeId].inDegree;\n }\n\n return 0;\n};\n/**\n * 获取指定节点的出度\n * @param graphData 图数据\n * @param nodeId 节点ID\n */\n\n\nexports.getInDegree = getInDegree;\n\nvar getOutDegree = function getOutDegree(graphData, nodeId) {\n var nodeDegree = degree(graphData);\n\n if (nodeDegree[nodeId]) {\n return degree(graphData)[nodeId].outDegree;\n }\n\n return 0;\n};\n\nexports.getOutDegree = getOutDegree;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvYWxnb3JpdGhtL2xpYi9kZWdyZWUuanM/ZDljNSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBYTs7QUFFYjtBQUNBO0FBQ0EsQ0FBQztBQUNEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBIiwiZmlsZSI6IjE4MS5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5nZXRPdXREZWdyZWUgPSBleHBvcnRzLmdldEluRGVncmVlID0gZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgZGVncmVlID0gZnVuY3Rpb24gZGVncmVlKGdyYXBoRGF0YSkge1xuICB2YXIgZGVncmVlcyA9IHt9O1xuICB2YXIgX2EgPSBncmFwaERhdGEubm9kZXMsXG4gICAgICBub2RlcyA9IF9hID09PSB2b2lkIDAgPyBbXSA6IF9hLFxuICAgICAgX2IgPSBncmFwaERhdGEuZWRnZXMsXG4gICAgICBlZGdlcyA9IF9iID09PSB2b2lkIDAgPyBbXSA6IF9iO1xuICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgZGVncmVlc1tub2RlLmlkXSA9IHtcbiAgICAgIGRlZ3JlZTogMCxcbiAgICAgIGluRGVncmVlOiAwLFxuICAgICAgb3V0RGVncmVlOiAwXG4gICAgfTtcbiAgfSk7XG4gIGVkZ2VzLmZvckVhY2goZnVuY3Rpb24gKGVkZ2UpIHtcbiAgICBkZWdyZWVzW2VkZ2Uuc291cmNlXS5kZWdyZWUrKztcbiAgICBkZWdyZWVzW2VkZ2Uuc291cmNlXS5vdXREZWdyZWUrKztcbiAgICBkZWdyZWVzW2VkZ2UudGFyZ2V0XS5kZWdyZWUrKztcbiAgICBkZWdyZWVzW2VkZ2UudGFyZ2V0XS5pbkRlZ3JlZSsrO1xuICB9KTtcbiAgcmV0dXJuIGRlZ3JlZXM7XG59O1xuXG52YXIgX2RlZmF1bHQgPSBkZWdyZWU7XG4vKipcbiAqIOiOt+WPluaMh+WumuiKgueCueeahOWFpeW6plxuICogQHBhcmFtIGdyYXBoRGF0YSDlm77mlbDmja5cbiAqIEBwYXJhbSBub2RlSWQg6IqC54K5SURcbiAqL1xuXG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDtcblxudmFyIGdldEluRGVncmVlID0gZnVuY3Rpb24gZ2V0SW5EZWdyZWUoZ3JhcGhEYXRhLCBub2RlSWQpIHtcbiAgdmFyIG5vZGVEZWdyZWUgPSBkZWdyZWUoZ3JhcGhEYXRhKTtcblxuICBpZiAobm9kZURlZ3JlZVtub2RlSWRdKSB7XG4gICAgcmV0dXJuIGRlZ3JlZShncmFwaERhdGEpW25vZGVJZF0uaW5EZWdyZWU7XG4gIH1cblxuICByZXR1cm4gMDtcbn07XG4vKipcbiAqIOiOt+WPluaMh+WumuiKgueCueeahOWHuuW6plxuICogQHBhcmFtIGdyYXBoRGF0YSDlm77mlbDmja5cbiAqIEBwYXJhbSBub2RlSWQg6IqC54K5SURcbiAqL1xuXG5cbmV4cG9ydHMuZ2V0SW5EZWdyZWUgPSBnZXRJbkRlZ3JlZTtcblxudmFyIGdldE91dERlZ3JlZSA9IGZ1bmN0aW9uIGdldE91dERlZ3JlZShncmFwaERhdGEsIG5vZGVJZCkge1xuICB2YXIgbm9kZURlZ3JlZSA9IGRlZ3JlZShncmFwaERhdGEpO1xuXG4gIGlmIChub2RlRGVncmVlW25vZGVJZF0pIHtcbiAgICByZXR1cm4gZGVncmVlKGdyYXBoRGF0YSlbbm9kZUlkXS5vdXREZWdyZWU7XG4gIH1cblxuICByZXR1cm4gMDtcbn07XG5cbmV4cG9ydHMuZ2V0T3V0RGVncmVlID0gZ2V0T3V0RGVncmVlOyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///181\n')},function(module,exports,__webpack_require__){"use strict";eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = depthFirstSearch;\n\nvar _util = __webpack_require__(45);\n\nfunction initCallbacks(callbacks) {\n if (callbacks === void 0) {\n callbacks = {};\n }\n\n var initiatedCallback = callbacks;\n\n var stubCallback = function stubCallback() {};\n\n var allowTraversalCallback = function () {\n var seen = {};\n return function (_a) {\n var next = _a.next;\n\n if (!seen[next]) {\n seen[next] = true;\n return true;\n }\n\n return false;\n };\n }();\n\n initiatedCallback.allowTraversal = callbacks.allowTraversal || allowTraversalCallback;\n initiatedCallback.enter = callbacks.enter || stubCallback;\n initiatedCallback.leave = callbacks.leave || stubCallback;\n return initiatedCallback;\n}\n/**\n * @param {Graph} graph\n * @param {GraphNode} currentNode\n * @param {GraphNode} previousNode\n * @param {Callbacks} callbacks\n */\n\n\nfunction depthFirstSearchRecursive(graphData, currentNode, previousNode, callbacks) {\n callbacks.enter({\n current: currentNode,\n previous: previousNode\n });\n var _a = graphData.edges,\n edges = _a === void 0 ? [] : _a;\n (0, _util.getNeighbors)(currentNode, edges, 'target').forEach(function (nextNode) {\n if (callbacks.allowTraversal({\n previous: previousNode,\n current: currentNode,\n next: nextNode\n })) {\n depthFirstSearchRecursive(graphData, nextNode, currentNode, callbacks);\n }\n });\n callbacks.leave({\n current: currentNode,\n previous: previousNode\n });\n}\n/**\n * 深度优先遍历图\n * @param data GraphData 图数据\n * @param startNodeId 开始遍历的节点的 ID\n * @param originalCallbacks 回调\n */\n\n\nfunction depthFirstSearch(graphData, startNodeId, callbacks) {\n depthFirstSearchRecursive(graphData, startNodeId, '', initCallbacks(callbacks));\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvYWxnb3JpdGhtL2xpYi9kZnMuanM/ZmU1MSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBYTs7QUFFYjtBQUNBO0FBQ0EsQ0FBQztBQUNEOztBQUVBLFlBQVksbUJBQU8sQ0FBQyxFQUFROztBQUU1QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE1BQU07QUFDakIsV0FBVyxVQUFVO0FBQ3JCLFdBQVcsVUFBVTtBQUNyQixXQUFXLFVBQVU7QUFDckI7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0EiLCJmaWxlIjoiMTgyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBkZXB0aEZpcnN0U2VhcmNoO1xuXG52YXIgX3V0aWwgPSByZXF1aXJlKFwiLi91dGlsXCIpO1xuXG5mdW5jdGlvbiBpbml0Q2FsbGJhY2tzKGNhbGxiYWNrcykge1xuICBpZiAoY2FsbGJhY2tzID09PSB2b2lkIDApIHtcbiAgICBjYWxsYmFja3MgPSB7fTtcbiAgfVxuXG4gIHZhciBpbml0aWF0ZWRDYWxsYmFjayA9IGNhbGxiYWNrcztcblxuICB2YXIgc3R1YkNhbGxiYWNrID0gZnVuY3Rpb24gc3R1YkNhbGxiYWNrKCkge307XG5cbiAgdmFyIGFsbG93VHJhdmVyc2FsQ2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNlZW4gPSB7fTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKF9hKSB7XG4gICAgICB2YXIgbmV4dCA9IF9hLm5leHQ7XG5cbiAgICAgIGlmICghc2VlbltuZXh0XSkge1xuICAgICAgICBzZWVuW25leHRdID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICB9KCk7XG5cbiAgaW5pdGlhdGVkQ2FsbGJhY2suYWxsb3dUcmF2ZXJzYWwgPSBjYWxsYmFja3MuYWxsb3dUcmF2ZXJzYWwgfHwgYWxsb3dUcmF2ZXJzYWxDYWxsYmFjaztcbiAgaW5pdGlhdGVkQ2FsbGJhY2suZW50ZXIgPSBjYWxsYmFja3MuZW50ZXIgfHwgc3R1YkNhbGxiYWNrO1xuICBpbml0aWF0ZWRDYWxsYmFjay5sZWF2ZSA9IGNhbGxiYWNrcy5sZWF2ZSB8fCBzdHViQ2FsbGJhY2s7XG4gIHJldHVybiBpbml0aWF0ZWRDYWxsYmFjaztcbn1cbi8qKlxuICogQHBhcmFtIHtHcmFwaH0gZ3JhcGhcbiAqIEBwYXJhbSB7R3JhcGhOb2RlfSBjdXJyZW50Tm9kZVxuICogQHBhcmFtIHtHcmFwaE5vZGV9IHByZXZpb3VzTm9kZVxuICogQHBhcmFtIHtDYWxsYmFja3N9IGNhbGxiYWNrc1xuICovXG5cblxuZnVuY3Rpb24gZGVwdGhGaXJzdFNlYXJjaFJlY3Vyc2l2ZShncmFwaERhdGEsIGN1cnJlbnROb2RlLCBwcmV2aW91c05vZGUsIGNhbGxiYWNrcykge1xuICBjYWxsYmFja3MuZW50ZXIoe1xuICAgIGN1cnJlbnQ6IGN1cnJlbnROb2RlLFxuICAgIHByZXZpb3VzOiBwcmV2aW91c05vZGVcbiAgfSk7XG4gIHZhciBfYSA9IGdyYXBoRGF0YS5lZGdlcyxcbiAgICAgIGVkZ2VzID0gX2EgPT09IHZvaWQgMCA/IFtdIDogX2E7XG4gICgwLCBfdXRpbC5nZXROZWlnaGJvcnMpKGN1cnJlbnROb2RlLCBlZGdlcywgJ3RhcmdldCcpLmZvckVhY2goZnVuY3Rpb24gKG5leHROb2RlKSB7XG4gICAgaWYgKGNhbGxiYWNrcy5hbGxvd1RyYXZlcnNhbCh7XG4gICAgICBwcmV2aW91czogcHJldmlvdXNOb2RlLFxuICAgICAgY3VycmVudDogY3VycmVudE5vZGUsXG4gICAgICBuZXh0OiBuZXh0Tm9kZVxuICAgIH0pKSB7XG4gICAgICBkZXB0aEZpcnN0U2VhcmNoUmVjdXJzaXZlKGdyYXBoRGF0YSwgbmV4dE5vZGUsIGN1cnJlbnROb2RlLCBjYWxsYmFja3MpO1xuICAgIH1cbiAgfSk7XG4gIGNhbGxiYWNrcy5sZWF2ZSh7XG4gICAgY3VycmVudDogY3VycmVudE5vZGUsXG4gICAgcHJldmlvdXM6IHByZXZpb3VzTm9kZVxuICB9KTtcbn1cbi8qKlxuICog5rex5bqm5LyY5YWI6YGN5Y6G5Zu+XG4gKiBAcGFyYW0gZGF0YSBHcmFwaERhdGEg5Zu+5pWw5o2uXG4gKiBAcGFyYW0gc3RhcnROb2RlSWQg5byA5aeL6YGN5Y6G55qE6IqC54K555qEIElEXG4gKiBAcGFyYW0gb3JpZ2luYWxDYWxsYmFja3Mg5Zue6LCDXG4gKi9cblxuXG5mdW5jdGlvbiBkZXB0aEZpcnN0U2VhcmNoKGdyYXBoRGF0YSwgc3RhcnROb2RlSWQsIGNhbGxiYWNrcykge1xuICBkZXB0aEZpcnN0U2VhcmNoUmVjdXJzaXZlKGdyYXBoRGF0YSwgc3RhcnROb2RlSWQsICcnLCBpbml0Q2FsbGJhY2tzKGNhbGxiYWNrcykpO1xufSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///182\n")},function(module,exports,__webpack_require__){"use strict";eval('\n\nObject.defineProperty(exports, "__esModule", {\n value: true\n});\nexports.default = void 0;\n\nvar _adjacentMatrix = _interopRequireDefault(__webpack_require__(98));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar floydWarshall = function floydWarshall(graphData, directed) {\n var adjacentMatrix = (0, _adjacentMatrix.default)(graphData, directed);\n var dist = [];\n var size = adjacentMatrix.length;\n\n for (var i = 0; i < size; i += 1) {\n dist[i] = [];\n\n for (var j = 0; j < size; j += 1) {\n if (i === j) {\n dist[i][j] = 0;\n } else if (adjacentMatrix[i][j] === 0 || !adjacentMatrix[i][j]) {\n dist[i][j] = Infinity;\n } else {\n dist[i][j] = adjacentMatrix[i][j];\n }\n }\n } // floyd\n\n\n for (var k = 0; k < size; k += 1) {\n for (var i = 0; i < size; i += 1) {\n for (var j = 0; j < size; j += 1) {\n if (dist[i][j] > dist[i][k] + dist[k][j]) {\n dist[i][j] = dist[i][k] + dist[k][j];\n }\n }\n }\n }\n\n return dist;\n};\n\nvar _default = floydWarshall;\nexports.default = _default;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvYWxnb3JpdGhtL2xpYi9mbG95ZFdhcnNoYWxsLmpzPzAyNTMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWI7QUFDQTtBQUNBLENBQUM7QUFDRDs7QUFFQSw2Q0FBNkMsbUJBQU8sQ0FBQyxFQUFtQjs7QUFFeEUsc0NBQXNDLHVDQUF1QyxnQkFBZ0I7O0FBRTdGO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGlCQUFpQixVQUFVO0FBQzNCOztBQUVBLG1CQUFtQixVQUFVO0FBQzdCO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7O0FBR0gsaUJBQWlCLFVBQVU7QUFDM0IsbUJBQW1CLFVBQVU7QUFDN0IscUJBQXFCLFVBQVU7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSIsImZpbGUiOiIxODMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIF9hZGphY2VudE1hdHJpeCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vYWRqYWNlbnQtbWF0cml4XCIpKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxudmFyIGZsb3lkV2Fyc2hhbGwgPSBmdW5jdGlvbiBmbG95ZFdhcnNoYWxsKGdyYXBoRGF0YSwgZGlyZWN0ZWQpIHtcbiAgdmFyIGFkamFjZW50TWF0cml4ID0gKDAsIF9hZGphY2VudE1hdHJpeC5kZWZhdWx0KShncmFwaERhdGEsIGRpcmVjdGVkKTtcbiAgdmFyIGRpc3QgPSBbXTtcbiAgdmFyIHNpemUgPSBhZGphY2VudE1hdHJpeC5sZW5ndGg7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaXplOyBpICs9IDEpIHtcbiAgICBkaXN0W2ldID0gW107XG5cbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IHNpemU7IGogKz0gMSkge1xuICAgICAgaWYgKGkgPT09IGopIHtcbiAgICAgICAgZGlzdFtpXVtqXSA9IDA7XG4gICAgICB9IGVsc2UgaWYgKGFkamFjZW50TWF0cml4W2ldW2pdID09PSAwIHx8ICFhZGphY2VudE1hdHJpeFtpXVtqXSkge1xuICAgICAgICBkaXN0W2ldW2pdID0gSW5maW5pdHk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkaXN0W2ldW2pdID0gYWRqYWNlbnRNYXRyaXhbaV1bal07XG4gICAgICB9XG4gICAgfVxuICB9IC8vIGZsb3lkXG5cblxuICBmb3IgKHZhciBrID0gMDsgayA8IHNpemU7IGsgKz0gMSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2l6ZTsgaSArPSAxKSB7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHNpemU7IGogKz0gMSkge1xuICAgICAgICBpZiAoZGlzdFtpXVtqXSA+IGRpc3RbaV1ba10gKyBkaXN0W2tdW2pdKSB7XG4gICAgICAgICAgZGlzdFtpXVtqXSA9IGRpc3RbaV1ba10gKyBkaXN0W2tdW2pdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGRpc3Q7XG59O1xuXG52YXIgX2RlZmF1bHQgPSBmbG95ZFdhcnNoYWxsO1xuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///183\n')},function(module,exports,__webpack_require__){eval("/* MIT license */\nvar cssKeywords = __webpack_require__(319);\n\n// NOTE: conversions should only return primitive values (i.e. arrays, or\n// values that give correct `typeof` results).\n// do not use box values types (i.e. Number(), String(), etc.)\n\nvar reverseKeywords = {};\nfor (var key in cssKeywords) {\n\tif (cssKeywords.hasOwnProperty(key)) {\n\t\treverseKeywords[cssKeywords[key]] = key;\n\t}\n}\n\nvar convert = module.exports = {\n\trgb: {channels: 3, labels: 'rgb'},\n\thsl: {channels: 3, labels: 'hsl'},\n\thsv: {channels: 3, labels: 'hsv'},\n\thwb: {channels: 3, labels: 'hwb'},\n\tcmyk: {channels: 4, labels: 'cmyk'},\n\txyz: {channels: 3, labels: 'xyz'},\n\tlab: {channels: 3, labels: 'lab'},\n\tlch: {channels: 3, labels: 'lch'},\n\thex: {channels: 1, labels: ['hex']},\n\tkeyword: {channels: 1, labels: ['keyword']},\n\tansi16: {channels: 1, labels: ['ansi16']},\n\tansi256: {channels: 1, labels: ['ansi256']},\n\thcg: {channels: 3, labels: ['h', 'c', 'g']},\n\tapple: {channels: 3, labels: ['r16', 'g16', 'b16']},\n\tgray: {channels: 1, labels: ['gray']}\n};\n\n// hide .channels and .labels properties\nfor (var model in convert) {\n\tif (convert.hasOwnProperty(model)) {\n\t\tif (!('channels' in convert[model])) {\n\t\t\tthrow new Error('missing channels property: ' + model);\n\t\t}\n\n\t\tif (!('labels' in convert[model])) {\n\t\t\tthrow new Error('missing channel labels property: ' + model);\n\t\t}\n\n\t\tif (convert[model].labels.length !== convert[model].channels) {\n\t\t\tthrow new Error('channel and label counts mismatch: ' + model);\n\t\t}\n\n\t\tvar channels = convert[model].channels;\n\t\tvar labels = convert[model].labels;\n\t\tdelete convert[model].channels;\n\t\tdelete convert[model].labels;\n\t\tObject.defineProperty(convert[model], 'channels', {value: channels});\n\t\tObject.defineProperty(convert[model], 'labels', {value: labels});\n\t}\n}\n\nconvert.rgb.hsl = function (rgb) {\n\tvar r = rgb[0] / 255;\n\tvar g = rgb[1] / 255;\n\tvar b = rgb[2] / 255;\n\tvar min = Math.min(r, g, b);\n\tvar max = Math.max(r, g, b);\n\tvar delta = max - min;\n\tvar h;\n\tvar s;\n\tvar l;\n\n\tif (max === min) {\n\t\th = 0;\n\t} else if (r === max) {\n\t\th = (g - b) / delta;\n\t} else if (g === max) {\n\t\th = 2 + (b - r) / delta;\n\t} else if (b === max) {\n\t\th = 4 + (r - g) / delta;\n\t}\n\n\th = Math.min(h * 60, 360);\n\n\tif (h < 0) {\n\t\th += 360;\n\t}\n\n\tl = (min + max) / 2;\n\n\tif (max === min) {\n\t\ts = 0;\n\t} else if (l <= 0.5) {\n\t\ts = delta / (max + min);\n\t} else {\n\t\ts = delta / (2 - max - min);\n\t}\n\n\treturn [h, s * 100, l * 100];\n};\n\nconvert.rgb.hsv = function (rgb) {\n\tvar rdif;\n\tvar gdif;\n\tvar bdif;\n\tvar h;\n\tvar s;\n\n\tvar r = rgb[0] / 255;\n\tvar g = rgb[1] / 255;\n\tvar b = rgb[2] / 255;\n\tvar v = Math.max(r, g, b);\n\tvar diff = v - Math.min(r, g, b);\n\tvar diffc = function (c) {\n\t\treturn (v - c) / 6 / diff + 1 / 2;\n\t};\n\n\tif (diff === 0) {\n\t\th = s = 0;\n\t} else {\n\t\ts = diff / v;\n\t\trdif = diffc(r);\n\t\tgdif = diffc(g);\n\t\tbdif = diffc(b);\n\n\t\tif (r === v) {\n\t\t\th = bdif - gdif;\n\t\t} else if (g === v) {\n\t\t\th = (1 / 3) + rdif - bdif;\n\t\t} else if (b === v) {\n\t\t\th = (2 / 3) + gdif - rdif;\n\t\t}\n\t\tif (h < 0) {\n\t\t\th += 1;\n\t\t} else if (h > 1) {\n\t\t\th -= 1;\n\t\t}\n\t}\n\n\treturn [\n\t\th * 360,\n\t\ts * 100,\n\t\tv * 100\n\t];\n};\n\nconvert.rgb.hwb = function (rgb) {\n\tvar r = rgb[0];\n\tvar g = rgb[1];\n\tvar b = rgb[2];\n\tvar h = convert.rgb.hsl(rgb)[0];\n\tvar w = 1 / 255 * Math.min(r, Math.min(g, b));\n\n\tb = 1 - 1 / 255 * Math.max(r, Math.max(g, b));\n\n\treturn [h, w * 100, b * 100];\n};\n\nconvert.rgb.cmyk = function (rgb) {\n\tvar r = rgb[0] / 255;\n\tvar g = rgb[1] / 255;\n\tvar b = rgb[2] / 255;\n\tvar c;\n\tvar m;\n\tvar y;\n\tvar k;\n\n\tk = Math.min(1 - r, 1 - g, 1 - b);\n\tc = (1 - r - k) / (1 - k) || 0;\n\tm = (1 - g - k) / (1 - k) || 0;\n\ty = (1 - b - k) / (1 - k) || 0;\n\n\treturn [c * 100, m * 100, y * 100, k * 100];\n};\n\n/**\n * See https://en.m.wikipedia.org/wiki/Euclidean_distance#Squared_Euclidean_distance\n * */\nfunction comparativeDistance(x, y) {\n\treturn (\n\t\tMath.pow(x[0] - y[0], 2) +\n\t\tMath.pow(x[1] - y[1], 2) +\n\t\tMath.pow(x[2] - y[2], 2)\n\t);\n}\n\nconvert.rgb.keyword = function (rgb) {\n\tvar reversed = reverseKeywords[rgb];\n\tif (reversed) {\n\t\treturn reversed;\n\t}\n\n\tvar currentClosestDistance = Infinity;\n\tvar currentClosestKeyword;\n\n\tfor (var keyword in cssKeywords) {\n\t\tif (cssKeywords.hasOwnProperty(keyword)) {\n\t\t\tvar value = cssKeywords[keyword];\n\n\t\t\t// Compute comparative distance\n\t\t\tvar distance = comparativeDistance(rgb, value);\n\n\t\t\t// Check if its less, if so set as closest\n\t\t\tif (distance < currentClosestDistance) {\n\t\t\t\tcurrentClosestDistance = distance;\n\t\t\t\tcurrentClosestKeyword = keyword;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn currentClosestKeyword;\n};\n\nconvert.keyword.rgb = function (keyword) {\n\treturn cssKeywords[keyword];\n};\n\nconvert.rgb.xyz = function (rgb) {\n\tvar r = rgb[0] / 255;\n\tvar g = rgb[1] / 255;\n\tvar b = rgb[2] / 255;\n\n\t// assume sRGB\n\tr = r > 0.04045 ? Math.pow(((r + 0.055) / 1.055), 2.4) : (r / 12.92);\n\tg = g > 0.04045 ? Math.pow(((g + 0.055) / 1.055), 2.4) : (g / 12.92);\n\tb = b > 0.04045 ? Math.pow(((b + 0.055) / 1.055), 2.4) : (b / 12.92);\n\n\tvar x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805);\n\tvar y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722);\n\tvar z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505);\n\n\treturn [x * 100, y * 100, z * 100];\n};\n\nconvert.rgb.lab = function (rgb) {\n\tvar xyz = convert.rgb.xyz(rgb);\n\tvar x = xyz[0];\n\tvar y = xyz[1];\n\tvar z = xyz[2];\n\tvar l;\n\tvar a;\n\tvar b;\n\n\tx /= 95.047;\n\ty /= 100;\n\tz /= 108.883;\n\n\tx = x > 0.008856 ? Math.pow(x, 1 / 3) : (7.787 * x) + (16 / 116);\n\ty = y > 0.008856 ? Math.pow(y, 1 / 3) : (7.787 * y) + (16 / 116);\n\tz = z > 0.008856 ? Math.pow(z, 1 / 3) : (7.787 * z) + (16 / 116);\n\n\tl = (116 * y) - 16;\n\ta = 500 * (x - y);\n\tb = 200 * (y - z);\n\n\treturn [l, a, b];\n};\n\nconvert.hsl.rgb = function (hsl) {\n\tvar h = hsl[0] / 360;\n\tvar s = hsl[1] / 100;\n\tvar l = hsl[2] / 100;\n\tvar t1;\n\tvar t2;\n\tvar t3;\n\tvar rgb;\n\tvar val;\n\n\tif (s === 0) {\n\t\tval = l * 255;\n\t\treturn [val, val, val];\n\t}\n\n\tif (l < 0.5) {\n\t\tt2 = l * (1 + s);\n\t} else {\n\t\tt2 = l + s - l * s;\n\t}\n\n\tt1 = 2 * l - t2;\n\n\trgb = [0, 0, 0];\n\tfor (var i = 0; i < 3; i++) {\n\t\tt3 = h + 1 / 3 * -(i - 1);\n\t\tif (t3 < 0) {\n\t\t\tt3++;\n\t\t}\n\t\tif (t3 > 1) {\n\t\t\tt3--;\n\t\t}\n\n\t\tif (6 * t3 < 1) {\n\t\t\tval = t1 + (t2 - t1) * 6 * t3;\n\t\t} else if (2 * t3 < 1) {\n\t\t\tval = t2;\n\t\t} else if (3 * t3 < 2) {\n\t\t\tval = t1 + (t2 - t1) * (2 / 3 - t3) * 6;\n\t\t} else {\n\t\t\tval = t1;\n\t\t}\n\n\t\trgb[i] = val * 255;\n\t}\n\n\treturn rgb;\n};\n\nconvert.hsl.hsv = function (hsl) {\n\tvar h = hsl[0];\n\tvar s = hsl[1] / 100;\n\tvar l = hsl[2] / 100;\n\tvar smin = s;\n\tvar lmin = Math.max(l, 0.01);\n\tvar sv;\n\tvar v;\n\n\tl *= 2;\n\ts *= (l <= 1) ? l : 2 - l;\n\tsmin *= lmin <= 1 ? lmin : 2 - lmin;\n\tv = (l + s) / 2;\n\tsv = l === 0 ? (2 * smin) / (lmin + smin) : (2 * s) / (l + s);\n\n\treturn [h, sv * 100, v * 100];\n};\n\nconvert.hsv.rgb = function (hsv) {\n\tvar h = hsv[0] / 60;\n\tvar s = hsv[1] / 100;\n\tvar v = hsv[2] / 100;\n\tvar hi = Math.floor(h) % 6;\n\n\tvar f = h - Math.floor(h);\n\tvar p = 255 * v * (1 - s);\n\tvar q = 255 * v * (1 - (s * f));\n\tvar t = 255 * v * (1 - (s * (1 - f)));\n\tv *= 255;\n\n\tswitch (hi) {\n\t\tcase 0:\n\t\t\treturn [v, t, p];\n\t\tcase 1:\n\t\t\treturn [q, v, p];\n\t\tcase 2:\n\t\t\treturn [p, v, t];\n\t\tcase 3:\n\t\t\treturn [p, q, v];\n\t\tcase 4:\n\t\t\treturn [t, p, v];\n\t\tcase 5:\n\t\t\treturn [v, p, q];\n\t}\n};\n\nconvert.hsv.hsl = function (hsv) {\n\tvar h = hsv[0];\n\tvar s = hsv[1] / 100;\n\tvar v = hsv[2] / 100;\n\tvar vmin = Math.max(v, 0.01);\n\tvar lmin;\n\tvar sl;\n\tvar l;\n\n\tl = (2 - s) * v;\n\tlmin = (2 - s) * vmin;\n\tsl = s * vmin;\n\tsl /= (lmin <= 1) ? lmin : 2 - lmin;\n\tsl = sl || 0;\n\tl /= 2;\n\n\treturn [h, sl * 100, l * 100];\n};\n\n// http://dev.w3.org/csswg/css-color/#hwb-to-rgb\nconvert.hwb.rgb = function (hwb) {\n\tvar h = hwb[0] / 360;\n\tvar wh = hwb[1] / 100;\n\tvar bl = hwb[2] / 100;\n\tvar ratio = wh + bl;\n\tvar i;\n\tvar v;\n\tvar f;\n\tvar n;\n\n\t// wh + bl cant be > 1\n\tif (ratio > 1) {\n\t\twh /= ratio;\n\t\tbl /= ratio;\n\t}\n\n\ti = Math.floor(6 * h);\n\tv = 1 - bl;\n\tf = 6 * h - i;\n\n\tif ((i & 0x01) !== 0) {\n\t\tf = 1 - f;\n\t}\n\n\tn = wh + f * (v - wh); // linear interpolation\n\n\tvar r;\n\tvar g;\n\tvar b;\n\tswitch (i) {\n\t\tdefault:\n\t\tcase 6:\n\t\tcase 0: r = v; g = n; b = wh; break;\n\t\tcase 1: r = n; g = v; b = wh; break;\n\t\tcase 2: r = wh; g = v; b = n; break;\n\t\tcase 3: r = wh; g = n; b = v; break;\n\t\tcase 4: r = n; g = wh; b = v; break;\n\t\tcase 5: r = v; g = wh; b = n; break;\n\t}\n\n\treturn [r * 255, g * 255, b * 255];\n};\n\nconvert.cmyk.rgb = function (cmyk) {\n\tvar c = cmyk[0] / 100;\n\tvar m = cmyk[1] / 100;\n\tvar y = cmyk[2] / 100;\n\tvar k = cmyk[3] / 100;\n\tvar r;\n\tvar g;\n\tvar b;\n\n\tr = 1 - Math.min(1, c * (1 - k) + k);\n\tg = 1 - Math.min(1, m * (1 - k) + k);\n\tb = 1 - Math.min(1, y * (1 - k) + k);\n\n\treturn [r * 255, g * 255, b * 255];\n};\n\nconvert.xyz.rgb = function (xyz) {\n\tvar x = xyz[0] / 100;\n\tvar y = xyz[1] / 100;\n\tvar z = xyz[2] / 100;\n\tvar r;\n\tvar g;\n\tvar b;\n\n\tr = (x * 3.2406) + (y * -1.5372) + (z * -0.4986);\n\tg = (x * -0.9689) + (y * 1.8758) + (z * 0.0415);\n\tb = (x * 0.0557) + (y * -0.2040) + (z * 1.0570);\n\n\t// assume sRGB\n\tr = r > 0.0031308\n\t\t? ((1.055 * Math.pow(r, 1.0 / 2.4)) - 0.055)\n\t\t: r * 12.92;\n\n\tg = g > 0.0031308\n\t\t? ((1.055 * Math.pow(g, 1.0 / 2.4)) - 0.055)\n\t\t: g * 12.92;\n\n\tb = b > 0.0031308\n\t\t? ((1.055 * Math.pow(b, 1.0 / 2.4)) - 0.055)\n\t\t: b * 12.92;\n\n\tr = Math.min(Math.max(0, r), 1);\n\tg = Math.min(Math.max(0, g), 1);\n\tb = Math.min(Math.max(0, b), 1);\n\n\treturn [r * 255, g * 255, b * 255];\n};\n\nconvert.xyz.lab = function (xyz) {\n\tvar x = xyz[0];\n\tvar y = xyz[1];\n\tvar z = xyz[2];\n\tvar l;\n\tvar a;\n\tvar b;\n\n\tx /= 95.047;\n\ty /= 100;\n\tz /= 108.883;\n\n\tx = x > 0.008856 ? Math.pow(x, 1 / 3) : (7.787 * x) + (16 / 116);\n\ty = y > 0.008856 ? Math.pow(y, 1 / 3) : (7.787 * y) + (16 / 116);\n\tz = z > 0.008856 ? Math.pow(z, 1 / 3) : (7.787 * z) + (16 / 116);\n\n\tl = (116 * y) - 16;\n\ta = 500 * (x - y);\n\tb = 200 * (y - z);\n\n\treturn [l, a, b];\n};\n\nconvert.lab.xyz = function (lab) {\n\tvar l = lab[0];\n\tvar a = lab[1];\n\tvar b = lab[2];\n\tvar x;\n\tvar y;\n\tvar z;\n\n\ty = (l + 16) / 116;\n\tx = a / 500 + y;\n\tz = y - b / 200;\n\n\tvar y2 = Math.pow(y, 3);\n\tvar x2 = Math.pow(x, 3);\n\tvar z2 = Math.pow(z, 3);\n\ty = y2 > 0.008856 ? y2 : (y - 16 / 116) / 7.787;\n\tx = x2 > 0.008856 ? x2 : (x - 16 / 116) / 7.787;\n\tz = z2 > 0.008856 ? z2 : (z - 16 / 116) / 7.787;\n\n\tx *= 95.047;\n\ty *= 100;\n\tz *= 108.883;\n\n\treturn [x, y, z];\n};\n\nconvert.lab.lch = function (lab) {\n\tvar l = lab[0];\n\tvar a = lab[1];\n\tvar b = lab[2];\n\tvar hr;\n\tvar h;\n\tvar c;\n\n\thr = Math.atan2(b, a);\n\th = hr * 360 / 2 / Math.PI;\n\n\tif (h < 0) {\n\t\th += 360;\n\t}\n\n\tc = Math.sqrt(a * a + b * b);\n\n\treturn [l, c, h];\n};\n\nconvert.lch.lab = function (lch) {\n\tvar l = lch[0];\n\tvar c = lch[1];\n\tvar h = lch[2];\n\tvar a;\n\tvar b;\n\tvar hr;\n\n\thr = h / 360 * 2 * Math.PI;\n\ta = c * Math.cos(hr);\n\tb = c * Math.sin(hr);\n\n\treturn [l, a, b];\n};\n\nconvert.rgb.ansi16 = function (args) {\n\tvar r = args[0];\n\tvar g = args[1];\n\tvar b = args[2];\n\tvar value = 1 in arguments ? arguments[1] : convert.rgb.hsv(args)[2]; // hsv -> ansi16 optimization\n\n\tvalue = Math.round(value / 50);\n\n\tif (value === 0) {\n\t\treturn 30;\n\t}\n\n\tvar ansi = 30\n\t\t+ ((Math.round(b / 255) << 2)\n\t\t| (Math.round(g / 255) << 1)\n\t\t| Math.round(r / 255));\n\n\tif (value === 2) {\n\t\tansi += 60;\n\t}\n\n\treturn ansi;\n};\n\nconvert.hsv.ansi16 = function (args) {\n\t// optimization here; we already know the value and don't need to get\n\t// it converted for us.\n\treturn convert.rgb.ansi16(convert.hsv.rgb(args), args[2]);\n};\n\nconvert.rgb.ansi256 = function (args) {\n\tvar r = args[0];\n\tvar g = args[1];\n\tvar b = args[2];\n\n\t// we use the extended greyscale palette here, with the exception of\n\t// black and white. normal palette only has 4 greyscale shades.\n\tif (r === g && g === b) {\n\t\tif (r < 8) {\n\t\t\treturn 16;\n\t\t}\n\n\t\tif (r > 248) {\n\t\t\treturn 231;\n\t\t}\n\n\t\treturn Math.round(((r - 8) / 247) * 24) + 232;\n\t}\n\n\tvar ansi = 16\n\t\t+ (36 * Math.round(r / 255 * 5))\n\t\t+ (6 * Math.round(g / 255 * 5))\n\t\t+ Math.round(b / 255 * 5);\n\n\treturn ansi;\n};\n\nconvert.ansi16.rgb = function (args) {\n\tvar color = args % 10;\n\n\t// handle greyscale\n\tif (color === 0 || color === 7) {\n\t\tif (args > 50) {\n\t\t\tcolor += 3.5;\n\t\t}\n\n\t\tcolor = color / 10.5 * 255;\n\n\t\treturn [color, color, color];\n\t}\n\n\tvar mult = (~~(args > 50) + 1) * 0.5;\n\tvar r = ((color & 1) * mult) * 255;\n\tvar g = (((color >> 1) & 1) * mult) * 255;\n\tvar b = (((color >> 2) & 1) * mult) * 255;\n\n\treturn [r, g, b];\n};\n\nconvert.ansi256.rgb = function (args) {\n\t// handle greyscale\n\tif (args >= 232) {\n\t\tvar c = (args - 232) * 10 + 8;\n\t\treturn [c, c, c];\n\t}\n\n\targs -= 16;\n\n\tvar rem;\n\tvar r = Math.floor(args / 36) / 5 * 255;\n\tvar g = Math.floor((rem = args % 36) / 6) / 5 * 255;\n\tvar b = (rem % 6) / 5 * 255;\n\n\treturn [r, g, b];\n};\n\nconvert.rgb.hex = function (args) {\n\tvar integer = ((Math.round(args[0]) & 0xFF) << 16)\n\t\t+ ((Math.round(args[1]) & 0xFF) << 8)\n\t\t+ (Math.round(args[2]) & 0xFF);\n\n\tvar string = integer.toString(16).toUpperCase();\n\treturn '000000'.substring(string.length) + string;\n};\n\nconvert.hex.rgb = function (args) {\n\tvar match = args.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);\n\tif (!match) {\n\t\treturn [0, 0, 0];\n\t}\n\n\tvar colorString = match[0];\n\n\tif (match[0].length === 3) {\n\t\tcolorString = colorString.split('').map(function (char) {\n\t\t\treturn char + char;\n\t\t}).join('');\n\t}\n\n\tvar integer = parseInt(colorString, 16);\n\tvar r = (integer >> 16) & 0xFF;\n\tvar g = (integer >> 8) & 0xFF;\n\tvar b = integer & 0xFF;\n\n\treturn [r, g, b];\n};\n\nconvert.rgb.hcg = function (rgb) {\n\tvar r = rgb[0] / 255;\n\tvar g = rgb[1] / 255;\n\tvar b = rgb[2] / 255;\n\tvar max = Math.max(Math.max(r, g), b);\n\tvar min = Math.min(Math.min(r, g), b);\n\tvar chroma = (max - min);\n\tvar grayscale;\n\tvar hue;\n\n\tif (chroma < 1) {\n\t\tgrayscale = min / (1 - chroma);\n\t} else {\n\t\tgrayscale = 0;\n\t}\n\n\tif (chroma <= 0) {\n\t\thue = 0;\n\t} else\n\tif (max === r) {\n\t\thue = ((g - b) / chroma) % 6;\n\t} else\n\tif (max === g) {\n\t\thue = 2 + (b - r) / chroma;\n\t} else {\n\t\thue = 4 + (r - g) / chroma + 4;\n\t}\n\n\thue /= 6;\n\thue %= 1;\n\n\treturn [hue * 360, chroma * 100, grayscale * 100];\n};\n\nconvert.hsl.hcg = function (hsl) {\n\tvar s = hsl[1] / 100;\n\tvar l = hsl[2] / 100;\n\tvar c = 1;\n\tvar f = 0;\n\n\tif (l < 0.5) {\n\t\tc = 2.0 * s * l;\n\t} else {\n\t\tc = 2.0 * s * (1.0 - l);\n\t}\n\n\tif (c < 1.0) {\n\t\tf = (l - 0.5 * c) / (1.0 - c);\n\t}\n\n\treturn [hsl[0], c * 100, f * 100];\n};\n\nconvert.hsv.hcg = function (hsv) {\n\tvar s = hsv[1] / 100;\n\tvar v = hsv[2] / 100;\n\n\tvar c = s * v;\n\tvar f = 0;\n\n\tif (c < 1.0) {\n\t\tf = (v - c) / (1 - c);\n\t}\n\n\treturn [hsv[0], c * 100, f * 100];\n};\n\nconvert.hcg.rgb = function (hcg) {\n\tvar h = hcg[0] / 360;\n\tvar c = hcg[1] / 100;\n\tvar g = hcg[2] / 100;\n\n\tif (c === 0.0) {\n\t\treturn [g * 255, g * 255, g * 255];\n\t}\n\n\tvar pure = [0, 0, 0];\n\tvar hi = (h % 1) * 6;\n\tvar v = hi % 1;\n\tvar w = 1 - v;\n\tvar mg = 0;\n\n\tswitch (Math.floor(hi)) {\n\t\tcase 0:\n\t\t\tpure[0] = 1; pure[1] = v; pure[2] = 0; break;\n\t\tcase 1:\n\t\t\tpure[0] = w; pure[1] = 1; pure[2] = 0; break;\n\t\tcase 2:\n\t\t\tpure[0] = 0; pure[1] = 1; pure[2] = v; break;\n\t\tcase 3:\n\t\t\tpure[0] = 0; pure[1] = w; pure[2] = 1; break;\n\t\tcase 4:\n\t\t\tpure[0] = v; pure[1] = 0; pure[2] = 1; break;\n\t\tdefault:\n\t\t\tpure[0] = 1; pure[1] = 0; pure[2] = w;\n\t}\n\n\tmg = (1.0 - c) * g;\n\n\treturn [\n\t\t(c * pure[0] + mg) * 255,\n\t\t(c * pure[1] + mg) * 255,\n\t\t(c * pure[2] + mg) * 255\n\t];\n};\n\nconvert.hcg.hsv = function (hcg) {\n\tvar c = hcg[1] / 100;\n\tvar g = hcg[2] / 100;\n\n\tvar v = c + g * (1.0 - c);\n\tvar f = 0;\n\n\tif (v > 0.0) {\n\t\tf = c / v;\n\t}\n\n\treturn [hcg[0], f * 100, v * 100];\n};\n\nconvert.hcg.hsl = function (hcg) {\n\tvar c = hcg[1] / 100;\n\tvar g = hcg[2] / 100;\n\n\tvar l = g * (1.0 - c) + 0.5 * c;\n\tvar s = 0;\n\n\tif (l > 0.0 && l < 0.5) {\n\t\ts = c / (2 * l);\n\t} else\n\tif (l >= 0.5 && l < 1.0) {\n\t\ts = c / (2 * (1 - l));\n\t}\n\n\treturn [hcg[0], s * 100, l * 100];\n};\n\nconvert.hcg.hwb = function (hcg) {\n\tvar c = hcg[1] / 100;\n\tvar g = hcg[2] / 100;\n\tvar v = c + g * (1.0 - c);\n\treturn [hcg[0], (v - c) * 100, (1 - v) * 100];\n};\n\nconvert.hwb.hcg = function (hwb) {\n\tvar w = hwb[1] / 100;\n\tvar b = hwb[2] / 100;\n\tvar v = 1 - b;\n\tvar c = v - w;\n\tvar g = 0;\n\n\tif (c < 1) {\n\t\tg = (v - c) / (1 - c);\n\t}\n\n\treturn [hwb[0], c * 100, g * 100];\n};\n\nconvert.apple.rgb = function (apple) {\n\treturn [(apple[0] / 65535) * 255, (apple[1] / 65535) * 255, (apple[2] / 65535) * 255];\n};\n\nconvert.rgb.apple = function (rgb) {\n\treturn [(rgb[0] / 255) * 65535, (rgb[1] / 255) * 65535, (rgb[2] / 255) * 65535];\n};\n\nconvert.gray.rgb = function (args) {\n\treturn [args[0] / 100 * 255, args[0] / 100 * 255, args[0] / 100 * 255];\n};\n\nconvert.gray.hsl = convert.gray.hsv = function (args) {\n\treturn [0, 0, args[0]];\n};\n\nconvert.gray.hwb = function (gray) {\n\treturn [0, 100, gray[0]];\n};\n\nconvert.gray.cmyk = function (gray) {\n\treturn [0, 0, 0, gray[0]];\n};\n\nconvert.gray.lab = function (gray) {\n\treturn [gray[0], 0, 0];\n};\n\nconvert.gray.hex = function (gray) {\n\tvar val = Math.round(gray[0] / 100 * 255) & 0xFF;\n\tvar integer = (val << 16) + (val << 8) + val;\n\n\tvar string = integer.toString(16).toUpperCase();\n\treturn '000000'.substring(string.length) + string;\n};\n\nconvert.rgb.gray = function (rgb) {\n\tvar val = (rgb[0] + rgb[1] + rgb[2]) / 3;\n\treturn [val / 255 * 100];\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29sb3ItY29udmVydC9jb252ZXJzaW9ucy5qcz9iNzUzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0Esa0JBQWtCLG1CQUFPLENBQUMsR0FBWTs7QUFFdEM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE9BQU8sMkJBQTJCO0FBQ2xDLE9BQU8sMkJBQTJCO0FBQ2xDLE9BQU8sMkJBQTJCO0FBQ2xDLE9BQU8sMkJBQTJCO0FBQ2xDLFFBQVEsNEJBQTRCO0FBQ3BDLE9BQU8sMkJBQTJCO0FBQ2xDLE9BQU8sMkJBQTJCO0FBQ2xDLE9BQU8sMkJBQTJCO0FBQ2xDLE9BQU8sNkJBQTZCO0FBQ3BDLFdBQVcsaUNBQWlDO0FBQzVDLFVBQVUsZ0NBQWdDO0FBQzFDLFdBQVcsaUNBQWlDO0FBQzVDLE9BQU8scUNBQXFDO0FBQzVDLFNBQVMsMkNBQTJDO0FBQ3BELFFBQVE7QUFDUjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFEQUFxRCxnQkFBZ0I7QUFDckUsbURBQW1ELGNBQWM7QUFDakU7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0EsRUFBRTtBQUNGO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQSxFQUFFO0FBQ0Y7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxnQkFBZ0IsT0FBTztBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsdUJBQXVCOztBQUV2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsT0FBTyxRQUFRO0FBQy9CLGdCQUFnQixPQUFPLFFBQVE7QUFDL0IsaUJBQWlCLE9BQU8sT0FBTztBQUMvQixpQkFBaUIsT0FBTyxPQUFPO0FBQy9CLGdCQUFnQixRQUFRLE9BQU87QUFDL0IsZ0JBQWdCLFFBQVEsT0FBTztBQUMvQjs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzRUFBc0U7O0FBRXRFOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwrQ0FBK0MsRUFBRSxVQUFVLEVBQUU7QUFDN0Q7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGVBQWUsYUFBYSxhQUFhO0FBQ3pDO0FBQ0EsZUFBZSxhQUFhLGFBQWE7QUFDekM7QUFDQSxlQUFlLGFBQWEsYUFBYTtBQUN6QztBQUNBLGVBQWUsYUFBYSxhQUFhO0FBQ3pDO0FBQ0EsZUFBZSxhQUFhLGFBQWE7QUFDekM7QUFDQSxlQUFlLGFBQWE7QUFDNUI7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiIxODQuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBNSVQgbGljZW5zZSAqL1xudmFyIGNzc0tleXdvcmRzID0gcmVxdWlyZSgnY29sb3ItbmFtZScpO1xuXG4vLyBOT1RFOiBjb252ZXJzaW9ucyBzaG91bGQgb25seSByZXR1cm4gcHJpbWl0aXZlIHZhbHVlcyAoaS5lLiBhcnJheXMsIG9yXG4vLyAgICAgICB2YWx1ZXMgdGhhdCBnaXZlIGNvcnJlY3QgYHR5cGVvZmAgcmVzdWx0cykuXG4vLyAgICAgICBkbyBub3QgdXNlIGJveCB2YWx1ZXMgdHlwZXMgKGkuZS4gTnVtYmVyKCksIFN0cmluZygpLCBldGMuKVxuXG52YXIgcmV2ZXJzZUtleXdvcmRzID0ge307XG5mb3IgKHZhciBrZXkgaW4gY3NzS2V5d29yZHMpIHtcblx0aWYgKGNzc0tleXdvcmRzLmhhc093blByb3BlcnR5KGtleSkpIHtcblx0XHRyZXZlcnNlS2V5d29yZHNbY3NzS2V5d29yZHNba2V5XV0gPSBrZXk7XG5cdH1cbn1cblxudmFyIGNvbnZlcnQgPSBtb2R1bGUuZXhwb3J0cyA9IHtcblx0cmdiOiB7Y2hhbm5lbHM6IDMsIGxhYmVsczogJ3JnYid9LFxuXHRoc2w6IHtjaGFubmVsczogMywgbGFiZWxzOiAnaHNsJ30sXG5cdGhzdjoge2NoYW5uZWxzOiAzLCBsYWJlbHM6ICdoc3YnfSxcblx0aHdiOiB7Y2hhbm5lbHM6IDMsIGxhYmVsczogJ2h3Yid9LFxuXHRjbXlrOiB7Y2hhbm5lbHM6IDQsIGxhYmVsczogJ2NteWsnfSxcblx0eHl6OiB7Y2hhbm5lbHM6IDMsIGxhYmVsczogJ3h5eid9LFxuXHRsYWI6IHtjaGFubmVsczogMywgbGFiZWxzOiAnbGFiJ30sXG5cdGxjaDoge2NoYW5uZWxzOiAzLCBsYWJlbHM6ICdsY2gnfSxcblx0aGV4OiB7Y2hhbm5lbHM6IDEsIGxhYmVsczogWydoZXgnXX0sXG5cdGtleXdvcmQ6IHtjaGFubmVsczogMSwgbGFiZWxzOiBbJ2tleXdvcmQnXX0sXG5cdGFuc2kxNjoge2NoYW5uZWxzOiAxLCBsYWJlbHM6IFsnYW5zaTE2J119LFxuXHRhbnNpMjU2OiB7Y2hhbm5lbHM6IDEsIGxhYmVsczogWydhbnNpMjU2J119LFxuXHRoY2c6IHtjaGFubmVsczogMywgbGFiZWxzOiBbJ2gnLCAnYycsICdnJ119LFxuXHRhcHBsZToge2NoYW5uZWxzOiAzLCBsYWJlbHM6IFsncjE2JywgJ2cxNicsICdiMTYnXX0sXG5cdGdyYXk6IHtjaGFubmVsczogMSwgbGFiZWxzOiBbJ2dyYXknXX1cbn07XG5cbi8vIGhpZGUgLmNoYW5uZWxzIGFuZCAubGFiZWxzIHByb3BlcnRpZXNcbmZvciAodmFyIG1vZGVsIGluIGNvbnZlcnQpIHtcblx0aWYgKGNvbnZlcnQuaGFzT3duUHJvcGVydHkobW9kZWwpKSB7XG5cdFx0aWYgKCEoJ2NoYW5uZWxzJyBpbiBjb252ZXJ0W21vZGVsXSkpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignbWlzc2luZyBjaGFubmVscyBwcm9wZXJ0eTogJyArIG1vZGVsKTtcblx0XHR9XG5cblx0XHRpZiAoISgnbGFiZWxzJyBpbiBjb252ZXJ0W21vZGVsXSkpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignbWlzc2luZyBjaGFubmVsIGxhYmVscyBwcm9wZXJ0eTogJyArIG1vZGVsKTtcblx0XHR9XG5cblx0XHRpZiAoY29udmVydFttb2RlbF0ubGFiZWxzLmxlbmd0aCAhPT0gY29udmVydFttb2RlbF0uY2hhbm5lbHMpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignY2hhbm5lbCBhbmQgbGFiZWwgY291bnRzIG1pc21hdGNoOiAnICsgbW9kZWwpO1xuXHRcdH1cblxuXHRcdHZhciBjaGFubmVscyA9IGNvbnZlcnRbbW9kZWxdLmNoYW5uZWxzO1xuXHRcdHZhciBsYWJlbHMgPSBjb252ZXJ0W21vZGVsXS5sYWJlbHM7XG5cdFx0ZGVsZXRlIGNvbnZlcnRbbW9kZWxdLmNoYW5uZWxzO1xuXHRcdGRlbGV0ZSBjb252ZXJ0W21vZGVsXS5sYWJlbHM7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbnZlcnRbbW9kZWxdLCAnY2hhbm5lbHMnLCB7dmFsdWU6IGNoYW5uZWxzfSk7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbnZlcnRbbW9kZWxdLCAnbGFiZWxzJywge3ZhbHVlOiBsYWJlbHN9KTtcblx0fVxufVxuXG5jb252ZXJ0LnJnYi5oc2wgPSBmdW5jdGlvbiAocmdiKSB7XG5cdHZhciByID0gcmdiWzBdIC8gMjU1O1xuXHR2YXIgZyA9IHJnYlsxXSAvIDI1NTtcblx0dmFyIGIgPSByZ2JbMl0gLyAyNTU7XG5cdHZhciBtaW4gPSBNYXRoLm1pbihyLCBnLCBiKTtcblx0dmFyIG1heCA9IE1hdGgubWF4KHIsIGcsIGIpO1xuXHR2YXIgZGVsdGEgPSBtYXggLSBtaW47XG5cdHZhciBoO1xuXHR2YXIgcztcblx0dmFyIGw7XG5cblx0aWYgKG1heCA9PT0gbWluKSB7XG5cdFx0aCA9IDA7XG5cdH0gZWxzZSBpZiAociA9PT0gbWF4KSB7XG5cdFx0aCA9IChnIC0gYikgLyBkZWx0YTtcblx0fSBlbHNlIGlmIChnID09PSBtYXgpIHtcblx0XHRoID0gMiArIChiIC0gcikgLyBkZWx0YTtcblx0fSBlbHNlIGlmIChiID09PSBtYXgpIHtcblx0XHRoID0gNCArIChyIC0gZykgLyBkZWx0YTtcblx0fVxuXG5cdGggPSBNYXRoLm1pbihoICogNjAsIDM2MCk7XG5cblx0aWYgKGggPCAwKSB7XG5cdFx0aCArPSAzNjA7XG5cdH1cblxuXHRsID0gKG1pbiArIG1heCkgLyAyO1xuXG5cdGlmIChtYXggPT09IG1pbikge1xuXHRcdHMgPSAwO1xuXHR9IGVsc2UgaWYgKGwgPD0gMC41KSB7XG5cdFx0cyA9IGRlbHRhIC8gKG1heCArIG1pbik7XG5cdH0gZWxzZSB7XG5cdFx0cyA9IGRlbHRhIC8gKDIgLSBtYXggLSBtaW4pO1xuXHR9XG5cblx0cmV0dXJuIFtoLCBzICogMTAwLCBsICogMTAwXTtcbn07XG5cbmNvbnZlcnQucmdiLmhzdiA9IGZ1bmN0aW9uIChyZ2IpIHtcblx0dmFyIHJkaWY7XG5cdHZhciBnZGlmO1xuXHR2YXIgYmRpZjtcblx0dmFyIGg7XG5cdHZhciBzO1xuXG5cdHZhciByID0gcmdiWzBdIC8gMjU1O1xuXHR2YXIgZyA9IHJnYlsxXSAvIDI1NTtcblx0dmFyIGIgPSByZ2JbMl0gLyAyNTU7XG5cdHZhciB2ID0gTWF0aC5tYXgociwgZywgYik7XG5cdHZhciBkaWZmID0gdiAtIE1hdGgubWluKHIsIGcsIGIpO1xuXHR2YXIgZGlmZmMgPSBmdW5jdGlvbiAoYykge1xuXHRcdHJldHVybiAodiAtIGMpIC8gNiAvIGRpZmYgKyAxIC8gMjtcblx0fTtcblxuXHRpZiAoZGlmZiA9PT0gMCkge1xuXHRcdGggPSBzID0gMDtcblx0fSBlbHNlIHtcblx0XHRzID0gZGlmZiAvIHY7XG5cdFx0cmRpZiA9IGRpZmZjKHIpO1xuXHRcdGdkaWYgPSBkaWZmYyhnKTtcblx0XHRiZGlmID0gZGlmZmMoYik7XG5cblx0XHRpZiAociA9PT0gdikge1xuXHRcdFx0aCA9IGJkaWYgLSBnZGlmO1xuXHRcdH0gZWxzZSBpZiAoZyA9PT0gdikge1xuXHRcdFx0aCA9ICgxIC8gMykgKyByZGlmIC0gYmRpZjtcblx0XHR9IGVsc2UgaWYgKGIgPT09IHYpIHtcblx0XHRcdGggPSAoMiAvIDMpICsgZ2RpZiAtIHJkaWY7XG5cdFx0fVxuXHRcdGlmIChoIDwgMCkge1xuXHRcdFx0aCArPSAxO1xuXHRcdH0gZWxzZSBpZiAoaCA+IDEpIHtcblx0XHRcdGggLT0gMTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gW1xuXHRcdGggKiAzNjAsXG5cdFx0cyAqIDEwMCxcblx0XHR2ICogMTAwXG5cdF07XG59O1xuXG5jb252ZXJ0LnJnYi5od2IgPSBmdW5jdGlvbiAocmdiKSB7XG5cdHZhciByID0gcmdiWzBdO1xuXHR2YXIgZyA9IHJnYlsxXTtcblx0dmFyIGIgPSByZ2JbMl07XG5cdHZhciBoID0gY29udmVydC5yZ2IuaHNsKHJnYilbMF07XG5cdHZhciB3ID0gMSAvIDI1NSAqIE1hdGgubWluKHIsIE1hdGgubWluKGcsIGIpKTtcblxuXHRiID0gMSAtIDEgLyAyNTUgKiBNYXRoLm1heChyLCBNYXRoLm1heChnLCBiKSk7XG5cblx0cmV0dXJuIFtoLCB3ICogMTAwLCBiICogMTAwXTtcbn07XG5cbmNvbnZlcnQucmdiLmNteWsgPSBmdW5jdGlvbiAocmdiKSB7XG5cdHZhciByID0gcmdiWzBdIC8gMjU1O1xuXHR2YXIgZyA9IHJnYlsxXSAvIDI1NTtcblx0dmFyIGIgPSByZ2JbMl0gLyAyNTU7XG5cdHZhciBjO1xuXHR2YXIgbTtcblx0dmFyIHk7XG5cdHZhciBrO1xuXG5cdGsgPSBNYXRoLm1pbigxIC0gciwgMSAtIGcsIDEgLSBiKTtcblx0YyA9ICgxIC0gciAtIGspIC8gKDEgLSBrKSB8fCAwO1xuXHRtID0gKDEgLSBnIC0gaykgLyAoMSAtIGspIHx8IDA7XG5cdHkgPSAoMSAtIGIgLSBrKSAvICgxIC0gaykgfHwgMDtcblxuXHRyZXR1cm4gW2MgKiAxMDAsIG0gKiAxMDAsIHkgKiAxMDAsIGsgKiAxMDBdO1xufTtcblxuLyoqXG4gKiBTZWUgaHR0cHM6Ly9lbi5tLndpa2lwZWRpYS5vcmcvd2lraS9FdWNsaWRlYW5fZGlzdGFuY2UjU3F1YXJlZF9FdWNsaWRlYW5fZGlzdGFuY2VcbiAqICovXG5mdW5jdGlvbiBjb21wYXJhdGl2ZURpc3RhbmNlKHgsIHkpIHtcblx0cmV0dXJuIChcblx0XHRNYXRoLnBvdyh4WzBdIC0geVswXSwgMikgK1xuXHRcdE1hdGgucG93KHhbMV0gLSB5WzFdLCAyKSArXG5cdFx0TWF0aC5wb3coeFsyXSAtIHlbMl0sIDIpXG5cdCk7XG59XG5cbmNvbnZlcnQucmdiLmtleXdvcmQgPSBmdW5jdGlvbiAocmdiKSB7XG5cdHZhciByZXZlcnNlZCA9IHJldmVyc2VLZXl3b3Jkc1tyZ2JdO1xuXHRpZiAocmV2ZXJzZWQpIHtcblx0XHRyZXR1cm4gcmV2ZXJzZWQ7XG5cdH1cblxuXHR2YXIgY3VycmVudENsb3Nlc3REaXN0YW5jZSA9IEluZmluaXR5O1xuXHR2YXIgY3VycmVudENsb3Nlc3RLZXl3b3JkO1xuXG5cdGZvciAodmFyIGtleXdvcmQgaW4gY3NzS2V5d29yZHMpIHtcblx0XHRpZiAoY3NzS2V5d29yZHMuaGFzT3duUHJvcGVydHkoa2V5d29yZCkpIHtcblx0XHRcdHZhciB2YWx1ZSA9IGNzc0tleXdvcmRzW2tleXdvcmRdO1xuXG5cdFx0XHQvLyBDb21wdXRlIGNvbXBhcmF0aXZlIGRpc3RhbmNlXG5cdFx0XHR2YXIgZGlzdGFuY2UgPSBjb21wYXJhdGl2ZURpc3RhbmNlKHJnYiwgdmFsdWUpO1xuXG5cdFx0XHQvLyBDaGVjayBpZiBpdHMgbGVzcywgaWYgc28gc2V0IGFzIGNsb3Nlc3Rcblx0XHRcdGlmIChkaXN0YW5jZSA8IGN1cnJlbnRDbG9zZXN0RGlzdGFuY2UpIHtcblx0XHRcdFx0Y3VycmVudENsb3Nlc3REaXN0YW5jZSA9IGRpc3RhbmNlO1xuXHRcdFx0XHRjdXJyZW50Q2xvc2VzdEtleXdvcmQgPSBrZXl3b3JkO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiBjdXJyZW50Q2xvc2VzdEtleXdvcmQ7XG59O1xuXG5jb252ZXJ0LmtleXdvcmQucmdiID0gZnVuY3Rpb24gKGtleXdvcmQpIHtcblx0cmV0dXJuIGNzc0tleXdvcmRzW2tleXdvcmRdO1xufTtcblxuY29udmVydC5yZ2IueHl6ID0gZnVuY3Rpb24gKHJnYikge1xuXHR2YXIgciA9IHJnYlswXSAvIDI1NTtcblx0dmFyIGcgPSByZ2JbMV0gLyAyNTU7XG5cdHZhciBiID0gcmdiWzJdIC8gMjU1O1xuXG5cdC8vIGFzc3VtZSBzUkdCXG5cdHIgPSByID4gMC4wNDA0NSA/IE1hdGgucG93KCgociArIDAuMDU1KSAvIDEuMDU1KSwgMi40KSA6IChyIC8gMTIuOTIpO1xuXHRnID0gZyA+IDAuMDQwNDUgPyBNYXRoLnBvdygoKGcgKyAwLjA1NSkgLyAxLjA1NSksIDIuNCkgOiAoZyAvIDEyLjkyKTtcblx0YiA9IGIgPiAwLjA0MDQ1ID8gTWF0aC5wb3coKChiICsgMC4wNTUpIC8gMS4wNTUpLCAyLjQpIDogKGIgLyAxMi45Mik7XG5cblx0dmFyIHggPSAociAqIDAuNDEyNCkgKyAoZyAqIDAuMzU3NikgKyAoYiAqIDAuMTgwNSk7XG5cdHZhciB5ID0gKHIgKiAwLjIxMjYpICsgKGcgKiAwLjcxNTIpICsgKGIgKiAwLjA3MjIpO1xuXHR2YXIgeiA9IChyICogMC4wMTkzKSArIChnICogMC4xMTkyKSArIChiICogMC45NTA1KTtcblxuXHRyZXR1cm4gW3ggKiAxMDAsIHkgKiAxMDAsIHogKiAxMDBdO1xufTtcblxuY29udmVydC5yZ2IubGFiID0gZnVuY3Rpb24gKHJnYikge1xuXHR2YXIgeHl6ID0gY29udmVydC5yZ2IueHl6KHJnYik7XG5cdHZhciB4ID0geHl6WzBdO1xuXHR2YXIgeSA9IHh5elsxXTtcblx0dmFyIHogPSB4eXpbMl07XG5cdHZhciBsO1xuXHR2YXIgYTtcblx0dmFyIGI7XG5cblx0eCAvPSA5NS4wNDc7XG5cdHkgLz0gMTAwO1xuXHR6IC89IDEwOC44ODM7XG5cblx0eCA9IHggPiAwLjAwODg1NiA/IE1hdGgucG93KHgsIDEgLyAzKSA6ICg3Ljc4NyAqIHgpICsgKDE2IC8gMTE2KTtcblx0eSA9IHkgPiAwLjAwODg1NiA/IE1hdGgucG93KHksIDEgLyAzKSA6ICg3Ljc4NyAqIHkpICsgKDE2IC8gMTE2KTtcblx0eiA9IHogPiAwLjAwODg1NiA/IE1hdGgucG93KHosIDEgLyAzKSA6ICg3Ljc4NyAqIHopICsgKDE2IC8gMTE2KTtcblxuXHRsID0gKDExNiAqIHkpIC0gMTY7XG5cdGEgPSA1MDAgKiAoeCAtIHkpO1xuXHRiID0gMjAwICogKHkgLSB6KTtcblxuXHRyZXR1cm4gW2wsIGEsIGJdO1xufTtcblxuY29udmVydC5oc2wucmdiID0gZnVuY3Rpb24gKGhzbCkge1xuXHR2YXIgaCA9IGhzbFswXSAvIDM2MDtcblx0dmFyIHMgPSBoc2xbMV0gLyAxMDA7XG5cdHZhciBsID0gaHNsWzJdIC8gMTAwO1xuXHR2YXIgdDE7XG5cdHZhciB0Mjtcblx0dmFyIHQzO1xuXHR2YXIgcmdiO1xuXHR2YXIgdmFsO1xuXG5cdGlmIChzID09PSAwKSB7XG5cdFx0dmFsID0gbCAqIDI1NTtcblx0XHRyZXR1cm4gW3ZhbCwgdmFsLCB2YWxdO1xuXHR9XG5cblx0aWYgKGwgPCAwLjUpIHtcblx0XHR0MiA9IGwgKiAoMSArIHMpO1xuXHR9IGVsc2Uge1xuXHRcdHQyID0gbCArIHMgLSBsICogcztcblx0fVxuXG5cdHQxID0gMiAqIGwgLSB0MjtcblxuXHRyZ2IgPSBbMCwgMCwgMF07XG5cdGZvciAodmFyIGkgPSAwOyBpIDwgMzsgaSsrKSB7XG5cdFx0dDMgPSBoICsgMSAvIDMgKiAtKGkgLSAxKTtcblx0XHRpZiAodDMgPCAwKSB7XG5cdFx0XHR0MysrO1xuXHRcdH1cblx0XHRpZiAodDMgPiAxKSB7XG5cdFx0XHR0My0tO1xuXHRcdH1cblxuXHRcdGlmICg2ICogdDMgPCAxKSB7XG5cdFx0XHR2YWwgPSB0MSArICh0MiAtIHQxKSAqIDYgKiB0Mztcblx0XHR9IGVsc2UgaWYgKDIgKiB0MyA8IDEpIHtcblx0XHRcdHZhbCA9IHQyO1xuXHRcdH0gZWxzZSBpZiAoMyAqIHQzIDwgMikge1xuXHRcdFx0dmFsID0gdDEgKyAodDIgLSB0MSkgKiAoMiAvIDMgLSB0MykgKiA2O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR2YWwgPSB0MTtcblx0XHR9XG5cblx0XHRyZ2JbaV0gPSB2YWwgKiAyNTU7XG5cdH1cblxuXHRyZXR1cm4gcmdiO1xufTtcblxuY29udmVydC5oc2wuaHN2ID0gZnVuY3Rpb24gKGhzbCkge1xuXHR2YXIgaCA9IGhzbFswXTtcblx0dmFyIHMgPSBoc2xbMV0gLyAxMDA7XG5cdHZhciBsID0gaHNsWzJdIC8gMTAwO1xuXHR2YXIgc21pbiA9IHM7XG5cdHZhciBsbWluID0gTWF0aC5tYXgobCwgMC4wMSk7XG5cdHZhciBzdjtcblx0dmFyIHY7XG5cblx0bCAqPSAyO1xuXHRzICo9IChsIDw9IDEpID8gbCA6IDIgLSBsO1xuXHRzbWluICo9IGxtaW4gPD0gMSA/IGxtaW4gOiAyIC0gbG1pbjtcblx0diA9IChsICsgcykgLyAyO1xuXHRzdiA9IGwgPT09IDAgPyAoMiAqIHNtaW4pIC8gKGxtaW4gKyBzbWluKSA6ICgyICogcykgLyAobCArIHMpO1xuXG5cdHJldHVybiBbaCwgc3YgKiAxMDAsIHYgKiAxMDBdO1xufTtcblxuY29udmVydC5oc3YucmdiID0gZnVuY3Rpb24gKGhzdikge1xuXHR2YXIgaCA9IGhzdlswXSAvIDYwO1xuXHR2YXIgcyA9IGhzdlsxXSAvIDEwMDtcblx0dmFyIHYgPSBoc3ZbMl0gLyAxMDA7XG5cdHZhciBoaSA9IE1hdGguZmxvb3IoaCkgJSA2O1xuXG5cdHZhciBmID0gaCAtIE1hdGguZmxvb3IoaCk7XG5cdHZhciBwID0gMjU1ICogdiAqICgxIC0gcyk7XG5cdHZhciBxID0gMjU1ICogdiAqICgxIC0gKHMgKiBmKSk7XG5cdHZhciB0ID0gMjU1ICogdiAqICgxIC0gKHMgKiAoMSAtIGYpKSk7XG5cdHYgKj0gMjU1O1xuXG5cdHN3aXRjaCAoaGkpIHtcblx0XHRjYXNlIDA6XG5cdFx0XHRyZXR1cm4gW3YsIHQsIHBdO1xuXHRcdGNhc2UgMTpcblx0XHRcdHJldHVybiBbcSwgdiwgcF07XG5cdFx0Y2FzZSAyOlxuXHRcdFx0cmV0dXJuIFtwLCB2LCB0XTtcblx0XHRjYXNlIDM6XG5cdFx0XHRyZXR1cm4gW3AsIHEsIHZdO1xuXHRcdGNhc2UgNDpcblx0XHRcdHJldHVybiBbdCwgcCwgdl07XG5cdFx0Y2FzZSA1OlxuXHRcdFx0cmV0dXJuIFt2LCBwLCBxXTtcblx0fVxufTtcblxuY29udmVydC5oc3YuaHNsID0gZnVuY3Rpb24gKGhzdikge1xuXHR2YXIgaCA9IGhzdlswXTtcblx0dmFyIHMgPSBoc3ZbMV0gLyAxMDA7XG5cdHZhciB2ID0gaHN2WzJdIC8gMTAwO1xuXHR2YXIgdm1pbiA9IE1hdGgubWF4KHYsIDAuMDEpO1xuXHR2YXIgbG1pbjtcblx0dmFyIHNsO1xuXHR2YXIgbDtcblxuXHRsID0gKDIgLSBzKSAqIHY7XG5cdGxtaW4gPSAoMiAtIHMpICogdm1pbjtcblx0c2wgPSBzICogdm1pbjtcblx0c2wgLz0gKGxtaW4gPD0gMSkgPyBsbWluIDogMiAtIGxtaW47XG5cdHNsID0gc2wgfHwgMDtcblx0bCAvPSAyO1xuXG5cdHJldHVybiBbaCwgc2wgKiAxMDAsIGwgKiAxMDBdO1xufTtcblxuLy8gaHR0cDovL2Rldi53My5vcmcvY3Nzd2cvY3NzLWNvbG9yLyNod2ItdG8tcmdiXG5jb252ZXJ0Lmh3Yi5yZ2IgPSBmdW5jdGlvbiAoaHdiKSB7XG5cdHZhciBoID0gaHdiWzBdIC8gMzYwO1xuXHR2YXIgd2ggPSBod2JbMV0gLyAxMDA7XG5cdHZhciBibCA9IGh3YlsyXSAvIDEwMDtcblx0dmFyIHJhdGlvID0gd2ggKyBibDtcblx0dmFyIGk7XG5cdHZhciB2O1xuXHR2YXIgZjtcblx0dmFyIG47XG5cblx0Ly8gd2ggKyBibCBjYW50IGJlID4gMVxuXHRpZiAocmF0aW8gPiAxKSB7XG5cdFx0d2ggLz0gcmF0aW87XG5cdFx0YmwgLz0gcmF0aW87XG5cdH1cblxuXHRpID0gTWF0aC5mbG9vcig2ICogaCk7XG5cdHYgPSAxIC0gYmw7XG5cdGYgPSA2ICogaCAtIGk7XG5cblx0aWYgKChpICYgMHgwMSkgIT09IDApIHtcblx0XHRmID0gMSAtIGY7XG5cdH1cblxuXHRuID0gd2ggKyBmICogKHYgLSB3aCk7IC8vIGxpbmVhciBpbnRlcnBvbGF0aW9uXG5cblx0dmFyIHI7XG5cdHZhciBnO1xuXHR2YXIgYjtcblx0c3dpdGNoIChpKSB7XG5cdFx0ZGVmYXVsdDpcblx0XHRjYXNlIDY6XG5cdFx0Y2FzZSAwOiByID0gdjsgZyA9IG47IGIgPSB3aDsgYnJlYWs7XG5cdFx0Y2FzZSAxOiByID0gbjsgZyA9IHY7IGIgPSB3aDsgYnJlYWs7XG5cdFx0Y2FzZSAyOiByID0gd2g7IGcgPSB2OyBiID0gbjsgYnJlYWs7XG5cdFx0Y2FzZSAzOiByID0gd2g7IGcgPSBuOyBiID0gdjsgYnJlYWs7XG5cdFx0Y2FzZSA0OiByID0gbjsgZyA9IHdoOyBiID0gdjsgYnJlYWs7XG5cdFx0Y2FzZSA1OiByID0gdjsgZyA9IHdoOyBiID0gbjsgYnJlYWs7XG5cdH1cblxuXHRyZXR1cm4gW3IgKiAyNTUsIGcgKiAyNTUsIGIgKiAyNTVdO1xufTtcblxuY29udmVydC5jbXlrLnJnYiA9IGZ1bmN0aW9uIChjbXlrKSB7XG5cdHZhciBjID0gY215a1swXSAvIDEwMDtcblx0dmFyIG0gPSBjbXlrWzFdIC8gMTAwO1xuXHR2YXIgeSA9IGNteWtbMl0gLyAxMDA7XG5cdHZhciBrID0gY215a1szXSAvIDEwMDtcblx0dmFyIHI7XG5cdHZhciBnO1xuXHR2YXIgYjtcblxuXHRyID0gMSAtIE1hdGgubWluKDEsIGMgKiAoMSAtIGspICsgayk7XG5cdGcgPSAxIC0gTWF0aC5taW4oMSwgbSAqICgxIC0gaykgKyBrKTtcblx0YiA9IDEgLSBNYXRoLm1pbigxLCB5ICogKDEgLSBrKSArIGspO1xuXG5cdHJldHVybiBbciAqIDI1NSwgZyAqIDI1NSwgYiAqIDI1NV07XG59O1xuXG5jb252ZXJ0Lnh5ei5yZ2IgPSBmdW5jdGlvbiAoeHl6KSB7XG5cdHZhciB4ID0geHl6WzBdIC8gMTAwO1xuXHR2YXIgeSA9IHh5elsxXSAvIDEwMDtcblx0dmFyIHogPSB4eXpbMl0gLyAxMDA7XG5cdHZhciByO1xuXHR2YXIgZztcblx0dmFyIGI7XG5cblx0ciA9ICh4ICogMy4yNDA2KSArICh5ICogLTEuNTM3MikgKyAoeiAqIC0wLjQ5ODYpO1xuXHRnID0gKHggKiAtMC45Njg5KSArICh5ICogMS44NzU4KSArICh6ICogMC4wNDE1KTtcblx0YiA9ICh4ICogMC4wNTU3KSArICh5ICogLTAuMjA0MCkgKyAoeiAqIDEuMDU3MCk7XG5cblx0Ly8gYXNzdW1lIHNSR0Jcblx0ciA9IHIgPiAwLjAwMzEzMDhcblx0XHQ/ICgoMS4wNTUgKiBNYXRoLnBvdyhyLCAxLjAgLyAyLjQpKSAtIDAuMDU1KVxuXHRcdDogciAqIDEyLjkyO1xuXG5cdGcgPSBnID4gMC4wMDMxMzA4XG5cdFx0PyAoKDEuMDU1ICogTWF0aC5wb3coZywgMS4wIC8gMi40KSkgLSAwLjA1NSlcblx0XHQ6IGcgKiAxMi45MjtcblxuXHRiID0gYiA+IDAuMDAzMTMwOFxuXHRcdD8gKCgxLjA1NSAqIE1hdGgucG93KGIsIDEuMCAvIDIuNCkpIC0gMC4wNTUpXG5cdFx0OiBiICogMTIuOTI7XG5cblx0ciA9IE1hdGgubWluKE1hdGgubWF4KDAsIHIpLCAxKTtcblx0ZyA9IE1hdGgubWluKE1hdGgubWF4KDAsIGcpLCAxKTtcblx0YiA9IE1hdGgubWluKE1hdGgubWF4KDAsIGIpLCAxKTtcblxuXHRyZXR1cm4gW3IgKiAyNTUsIGcgKiAyNTUsIGIgKiAyNTVdO1xufTtcblxuY29udmVydC54eXoubGFiID0gZnVuY3Rpb24gKHh5eikge1xuXHR2YXIgeCA9IHh5elswXTtcblx0dmFyIHkgPSB4eXpbMV07XG5cdHZhciB6ID0geHl6WzJdO1xuXHR2YXIgbDtcblx0dmFyIGE7XG5cdHZhciBiO1xuXG5cdHggLz0gOTUuMDQ3O1xuXHR5IC89IDEwMDtcblx0eiAvPSAxMDguODgzO1xuXG5cdHggPSB4ID4gMC4wMDg4NTYgPyBNYXRoLnBvdyh4LCAxIC8gMykgOiAoNy43ODcgKiB4KSArICgxNiAvIDExNik7XG5cdHkgPSB5ID4gMC4wMDg4NTYgPyBNYXRoLnBvdyh5LCAxIC8gMykgOiAoNy43ODcgKiB5KSArICgxNiAvIDExNik7XG5cdHogPSB6ID4gMC4wMDg4NTYgPyBNYXRoLnBvdyh6LCAxIC8gMykgOiAoNy43ODcgKiB6KSArICgxNiAvIDExNik7XG5cblx0bCA9ICgxMTYgKiB5KSAtIDE2O1xuXHRhID0gNTAwICogKHggLSB5KTtcblx0YiA9IDIwMCAqICh5IC0geik7XG5cblx0cmV0dXJuIFtsLCBhLCBiXTtcbn07XG5cbmNvbnZlcnQubGFiLnh5eiA9IGZ1bmN0aW9uIChsYWIpIHtcblx0dmFyIGwgPSBsYWJbMF07XG5cdHZhciBhID0gbGFiWzFdO1xuXHR2YXIgYiA9IGxhYlsyXTtcblx0dmFyIHg7XG5cdHZhciB5O1xuXHR2YXIgejtcblxuXHR5ID0gKGwgKyAxNikgLyAxMTY7XG5cdHggPSBhIC8gNTAwICsgeTtcblx0eiA9IHkgLSBiIC8gMjAwO1xuXG5cdHZhciB5MiA9IE1hdGgucG93KHksIDMpO1xuXHR2YXIgeDIgPSBNYXRoLnBvdyh4LCAzKTtcblx0dmFyIHoyID0gTWF0aC5wb3coeiwgMyk7XG5cdHkgPSB5MiA+IDAuMDA4ODU2ID8geTIgOiAoeSAtIDE2IC8gMTE2KSAvIDcuNzg3O1xuXHR4ID0geDIgPiAwLjAwODg1NiA/IHgyIDogKHggLSAxNiAvIDExNikgLyA3Ljc4Nztcblx0eiA9IHoyID4gMC4wMDg4NTYgPyB6MiA6ICh6IC0gMTYgLyAxMTYpIC8gNy43ODc7XG5cblx0eCAqPSA5NS4wNDc7XG5cdHkgKj0gMTAwO1xuXHR6ICo9IDEwOC44ODM7XG5cblx0cmV0dXJuIFt4LCB5LCB6XTtcbn07XG5cbmNvbnZlcnQubGFiLmxjaCA9IGZ1bmN0aW9uIChsYWIpIHtcblx0dmFyIGwgPSBsYWJbMF07XG5cdHZhciBhID0gbGFiWzFdO1xuXHR2YXIgYiA9IGxhYlsyXTtcblx0dmFyIGhyO1xuXHR2YXIgaDtcblx0dmFyIGM7XG5cblx0aHIgPSBNYXRoLmF0YW4yKGIsIGEpO1xuXHRoID0gaHIgKiAzNjAgLyAyIC8gTWF0aC5QSTtcblxuXHRpZiAoaCA8IDApIHtcblx0XHRoICs9IDM2MDtcblx0fVxuXG5cdGMgPSBNYXRoLnNxcnQoYSAqIGEgKyBiICogYik7XG5cblx0cmV0dXJuIFtsLCBjLCBoXTtcbn07XG5cbmNvbnZlcnQubGNoLmxhYiA9IGZ1bmN0aW9uIChsY2gpIHtcblx0dmFyIGwgPSBsY2hbMF07XG5cdHZhciBjID0gbGNoWzFdO1xuXHR2YXIgaCA9IGxjaFsyXTtcblx0dmFyIGE7XG5cdHZhciBiO1xuXHR2YXIgaHI7XG5cblx0aHIgPSBoIC8gMzYwICogMiAqIE1hdGguUEk7XG5cdGEgPSBjICogTWF0aC5jb3MoaHIpO1xuXHRiID0gYyAqIE1hdGguc2luKGhyKTtcblxuXHRyZXR1cm4gW2wsIGEsIGJdO1xufTtcblxuY29udmVydC5yZ2IuYW5zaTE2ID0gZnVuY3Rpb24gKGFyZ3MpIHtcblx0dmFyIHIgPSBhcmdzWzBdO1xuXHR2YXIgZyA9IGFyZ3NbMV07XG5cdHZhciBiID0gYXJnc1syXTtcblx0dmFyIHZhbHVlID0gMSBpbiBhcmd1bWVudHMgPyBhcmd1bWVudHNbMV0gOiBjb252ZXJ0LnJnYi5oc3YoYXJncylbMl07IC8vIGhzdiAtPiBhbnNpMTYgb3B0aW1pemF0aW9uXG5cblx0dmFsdWUgPSBNYXRoLnJvdW5kKHZhbHVlIC8gNTApO1xuXG5cdGlmICh2YWx1ZSA9PT0gMCkge1xuXHRcdHJldHVybiAzMDtcblx0fVxuXG5cdHZhciBhbnNpID0gMzBcblx0XHQrICgoTWF0aC5yb3VuZChiIC8gMjU1KSA8PCAyKVxuXHRcdHwgKE1hdGgucm91bmQoZyAvIDI1NSkgPDwgMSlcblx0XHR8IE1hdGgucm91bmQociAvIDI1NSkpO1xuXG5cdGlmICh2YWx1ZSA9PT0gMikge1xuXHRcdGFuc2kgKz0gNjA7XG5cdH1cblxuXHRyZXR1cm4gYW5zaTtcbn07XG5cbmNvbnZlcnQuaHN2LmFuc2kxNiA9IGZ1bmN0aW9uIChhcmdzKSB7XG5cdC8vIG9wdGltaXphdGlvbiBoZXJlOyB3ZSBhbHJlYWR5IGtub3cgdGhlIHZhbHVlIGFuZCBkb24ndCBuZWVkIHRvIGdldFxuXHQvLyBpdCBjb252ZXJ0ZWQgZm9yIHVzLlxuXHRyZXR1cm4gY29udmVydC5yZ2IuYW5zaTE2KGNvbnZlcnQuaHN2LnJnYihhcmdzKSwgYXJnc1syXSk7XG59O1xuXG5jb252ZXJ0LnJnYi5hbnNpMjU2ID0gZnVuY3Rpb24gKGFyZ3MpIHtcblx0dmFyIHIgPSBhcmdzWzBdO1xuXHR2YXIgZyA9IGFyZ3NbMV07XG5cdHZhciBiID0gYXJnc1syXTtcblxuXHQvLyB3ZSB1c2UgdGhlIGV4dGVuZGVkIGdyZXlzY2FsZSBwYWxldHRlIGhlcmUsIHdpdGggdGhlIGV4Y2VwdGlvbiBvZlxuXHQvLyBibGFjayBhbmQgd2hpdGUuIG5vcm1hbCBwYWxldHRlIG9ubHkgaGFzIDQgZ3JleXNjYWxlIHNoYWRlcy5cblx0aWYgKHIgPT09IGcgJiYgZyA9PT0gYikge1xuXHRcdGlmIChyIDwgOCkge1xuXHRcdFx0cmV0dXJuIDE2O1xuXHRcdH1cblxuXHRcdGlmIChyID4gMjQ4KSB7XG5cdFx0XHRyZXR1cm4gMjMxO1xuXHRcdH1cblxuXHRcdHJldHVybiBNYXRoLnJvdW5kKCgociAtIDgpIC8gMjQ3KSAqIDI0KSArIDIzMjtcblx0fVxuXG5cdHZhciBhbnNpID0gMTZcblx0XHQrICgzNiAqIE1hdGgucm91bmQociAvIDI1NSAqIDUpKVxuXHRcdCsgKDYgKiBNYXRoLnJvdW5kKGcgLyAyNTUgKiA1KSlcblx0XHQrIE1hdGgucm91bmQoYiAvIDI1NSAqIDUpO1xuXG5cdHJldHVybiBhbnNpO1xufTtcblxuY29udmVydC5hbnNpMTYucmdiID0gZnVuY3Rpb24gKGFyZ3MpIHtcblx0dmFyIGNvbG9yID0gYXJncyAlIDEwO1xuXG5cdC8vIGhhbmRsZSBncmV5c2NhbGVcblx0aWYgKGNvbG9yID09PSAwIHx8IGNvbG9yID09PSA3KSB7XG5cdFx0aWYgKGFyZ3MgPiA1MCkge1xuXHRcdFx0Y29sb3IgKz0gMy41O1xuXHRcdH1cblxuXHRcdGNvbG9yID0gY29sb3IgLyAxMC41ICogMjU1O1xuXG5cdFx0cmV0dXJuIFtjb2xvciwgY29sb3IsIGNvbG9yXTtcblx0fVxuXG5cdHZhciBtdWx0ID0gKH5+KGFyZ3MgPiA1MCkgKyAxKSAqIDAuNTtcblx0dmFyIHIgPSAoKGNvbG9yICYgMSkgKiBtdWx0KSAqIDI1NTtcblx0dmFyIGcgPSAoKChjb2xvciA+PiAxKSAmIDEpICogbXVsdCkgKiAyNTU7XG5cdHZhciBiID0gKCgoY29sb3IgPj4gMikgJiAxKSAqIG11bHQpICogMjU1O1xuXG5cdHJldHVybiBbciwgZywgYl07XG59O1xuXG5jb252ZXJ0LmFuc2kyNTYucmdiID0gZnVuY3Rpb24gKGFyZ3MpIHtcblx0Ly8gaGFuZGxlIGdyZXlzY2FsZVxuXHRpZiAoYXJncyA+PSAyMzIpIHtcblx0XHR2YXIgYyA9IChhcmdzIC0gMjMyKSAqIDEwICsgODtcblx0XHRyZXR1cm4gW2MsIGMsIGNdO1xuXHR9XG5cblx0YXJncyAtPSAxNjtcblxuXHR2YXIgcmVtO1xuXHR2YXIgciA9IE1hdGguZmxvb3IoYXJncyAvIDM2KSAvIDUgKiAyNTU7XG5cdHZhciBnID0gTWF0aC5mbG9vcigocmVtID0gYXJncyAlIDM2KSAvIDYpIC8gNSAqIDI1NTtcblx0dmFyIGIgPSAocmVtICUgNikgLyA1ICogMjU1O1xuXG5cdHJldHVybiBbciwgZywgYl07XG59O1xuXG5jb252ZXJ0LnJnYi5oZXggPSBmdW5jdGlvbiAoYXJncykge1xuXHR2YXIgaW50ZWdlciA9ICgoTWF0aC5yb3VuZChhcmdzWzBdKSAmIDB4RkYpIDw8IDE2KVxuXHRcdCsgKChNYXRoLnJvdW5kKGFyZ3NbMV0pICYgMHhGRikgPDwgOClcblx0XHQrIChNYXRoLnJvdW5kKGFyZ3NbMl0pICYgMHhGRik7XG5cblx0dmFyIHN0cmluZyA9IGludGVnZXIudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCk7XG5cdHJldHVybiAnMDAwMDAwJy5zdWJzdHJpbmcoc3RyaW5nLmxlbmd0aCkgKyBzdHJpbmc7XG59O1xuXG5jb252ZXJ0LmhleC5yZ2IgPSBmdW5jdGlvbiAoYXJncykge1xuXHR2YXIgbWF0Y2ggPSBhcmdzLnRvU3RyaW5nKDE2KS5tYXRjaCgvW2EtZjAtOV17Nn18W2EtZjAtOV17M30vaSk7XG5cdGlmICghbWF0Y2gpIHtcblx0XHRyZXR1cm4gWzAsIDAsIDBdO1xuXHR9XG5cblx0dmFyIGNvbG9yU3RyaW5nID0gbWF0Y2hbMF07XG5cblx0aWYgKG1hdGNoWzBdLmxlbmd0aCA9PT0gMykge1xuXHRcdGNvbG9yU3RyaW5nID0gY29sb3JTdHJpbmcuc3BsaXQoJycpLm1hcChmdW5jdGlvbiAoY2hhcikge1xuXHRcdFx0cmV0dXJuIGNoYXIgKyBjaGFyO1xuXHRcdH0pLmpvaW4oJycpO1xuXHR9XG5cblx0dmFyIGludGVnZXIgPSBwYXJzZUludChjb2xvclN0cmluZywgMTYpO1xuXHR2YXIgciA9IChpbnRlZ2VyID4+IDE2KSAmIDB4RkY7XG5cdHZhciBnID0gKGludGVnZXIgPj4gOCkgJiAweEZGO1xuXHR2YXIgYiA9IGludGVnZXIgJiAweEZGO1xuXG5cdHJldHVybiBbciwgZywgYl07XG59O1xuXG5jb252ZXJ0LnJnYi5oY2cgPSBmdW5jdGlvbiAocmdiKSB7XG5cdHZhciByID0gcmdiWzBdIC8gMjU1O1xuXHR2YXIgZyA9IHJnYlsxXSAvIDI1NTtcblx0dmFyIGIgPSByZ2JbMl0gLyAyNTU7XG5cdHZhciBtYXggPSBNYXRoLm1heChNYXRoLm1heChyLCBnKSwgYik7XG5cdHZhciBtaW4gPSBNYXRoLm1pbihNYXRoLm1pbihyLCBnKSwgYik7XG5cdHZhciBjaHJvbWEgPSAobWF4IC0gbWluKTtcblx0dmFyIGdyYXlzY2FsZTtcblx0dmFyIGh1ZTtcblxuXHRpZiAoY2hyb21hIDwgMSkge1xuXHRcdGdyYXlzY2FsZSA9IG1pbiAvICgxIC0gY2hyb21hKTtcblx0fSBlbHNlIHtcblx0XHRncmF5c2NhbGUgPSAwO1xuXHR9XG5cblx0aWYgKGNocm9tYSA8PSAwKSB7XG5cdFx0aHVlID0gMDtcblx0fSBlbHNlXG5cdGlmIChtYXggPT09IHIpIHtcblx0XHRodWUgPSAoKGcgLSBiKSAvIGNocm9tYSkgJSA2O1xuXHR9IGVsc2Vcblx0aWYgKG1heCA9PT0gZykge1xuXHRcdGh1ZSA9IDIgKyAoYiAtIHIpIC8gY2hyb21hO1xuXHR9IGVsc2Uge1xuXHRcdGh1ZSA9IDQgKyAociAtIGcpIC8gY2hyb21hICsgNDtcblx0fVxuXG5cdGh1ZSAvPSA2O1xuXHRodWUgJT0gMTtcblxuXHRyZXR1cm4gW2h1ZSAqIDM2MCwgY2hyb21hICogMTAwLCBncmF5c2NhbGUgKiAxMDBdO1xufTtcblxuY29udmVydC5oc2wuaGNnID0gZnVuY3Rpb24gKGhzbCkge1xuXHR2YXIgcyA9IGhzbFsxXSAvIDEwMDtcblx0dmFyIGwgPSBoc2xbMl0gLyAxMDA7XG5cdHZhciBjID0gMTtcblx0dmFyIGYgPSAwO1xuXG5cdGlmIChsIDwgMC41KSB7XG5cdFx0YyA9IDIuMCAqIHMgKiBsO1xuXHR9IGVsc2Uge1xuXHRcdGMgPSAyLjAgKiBzICogKDEuMCAtIGwpO1xuXHR9XG5cblx0aWYgKGMgPCAxLjApIHtcblx0XHRmID0gKGwgLSAwLjUgKiBjKSAvICgxLjAgLSBjKTtcblx0fVxuXG5cdHJldHVybiBbaHNsWzBdLCBjICogMTAwLCBmICogMTAwXTtcbn07XG5cbmNvbnZlcnQuaHN2LmhjZyA9IGZ1bmN0aW9uIChoc3YpIHtcblx0dmFyIHMgPSBoc3ZbMV0gLyAxMDA7XG5cdHZhciB2ID0gaHN2WzJdIC8gMTAwO1xuXG5cdHZhciBjID0gcyAqIHY7XG5cdHZhciBmID0gMDtcblxuXHRpZiAoYyA8IDEuMCkge1xuXHRcdGYgPSAodiAtIGMpIC8gKDEgLSBjKTtcblx0fVxuXG5cdHJldHVybiBbaHN2WzBdLCBjICogMTAwLCBmICogMTAwXTtcbn07XG5cbmNvbnZlcnQuaGNnLnJnYiA9IGZ1bmN0aW9uIChoY2cpIHtcblx0dmFyIGggPSBoY2dbMF0gLyAzNjA7XG5cdHZhciBjID0gaGNnWzFdIC8gMTAwO1xuXHR2YXIgZyA9IGhjZ1syXSAvIDEwMDtcblxuXHRpZiAoYyA9PT0gMC4wKSB7XG5cdFx0cmV0dXJuIFtnICogMjU1LCBnICogMjU1LCBnICogMjU1XTtcblx0fVxuXG5cdHZhciBwdXJlID0gWzAsIDAsIDBdO1xuXHR2YXIgaGkgPSAoaCAlIDEpICogNjtcblx0dmFyIHYgPSBoaSAlIDE7XG5cdHZhciB3ID0gMSAtIHY7XG5cdHZhciBtZyA9IDA7XG5cblx0c3dpdGNoIChNYXRoLmZsb29yKGhpKSkge1xuXHRcdGNhc2UgMDpcblx0XHRcdHB1cmVbMF0gPSAxOyBwdXJlWzFdID0gdjsgcHVyZVsyXSA9IDA7IGJyZWFrO1xuXHRcdGNhc2UgMTpcblx0XHRcdHB1cmVbMF0gPSB3OyBwdXJlWzFdID0gMTsgcHVyZVsyXSA9IDA7IGJyZWFrO1xuXHRcdGNhc2UgMjpcblx0XHRcdHB1cmVbMF0gPSAwOyBwdXJlWzFdID0gMTsgcHVyZVsyXSA9IHY7IGJyZWFrO1xuXHRcdGNhc2UgMzpcblx0XHRcdHB1cmVbMF0gPSAwOyBwdXJlWzFdID0gdzsgcHVyZVsyXSA9IDE7IGJyZWFrO1xuXHRcdGNhc2UgNDpcblx0XHRcdHB1cmVbMF0gPSB2OyBwdXJlWzFdID0gMDsgcHVyZVsyXSA9IDE7IGJyZWFrO1xuXHRcdGRlZmF1bHQ6XG5cdFx0XHRwdXJlWzBdID0gMTsgcHVyZVsxXSA9IDA7IHB1cmVbMl0gPSB3O1xuXHR9XG5cblx0bWcgPSAoMS4wIC0gYykgKiBnO1xuXG5cdHJldHVybiBbXG5cdFx0KGMgKiBwdXJlWzBdICsgbWcpICogMjU1LFxuXHRcdChjICogcHVyZVsxXSArIG1nKSAqIDI1NSxcblx0XHQoYyAqIHB1cmVbMl0gKyBtZykgKiAyNTVcblx0XTtcbn07XG5cbmNvbnZlcnQuaGNnLmhzdiA9IGZ1bmN0aW9uIChoY2cpIHtcblx0dmFyIGMgPSBoY2dbMV0gLyAxMDA7XG5cdHZhciBnID0gaGNnWzJdIC8gMTAwO1xuXG5cdHZhciB2ID0gYyArIGcgKiAoMS4wIC0gYyk7XG5cdHZhciBmID0gMDtcblxuXHRpZiAodiA+IDAuMCkge1xuXHRcdGYgPSBjIC8gdjtcblx0fVxuXG5cdHJldHVybiBbaGNnWzBdLCBmICogMTAwLCB2ICogMTAwXTtcbn07XG5cbmNvbnZlcnQuaGNnLmhzbCA9IGZ1bmN0aW9uIChoY2cpIHtcblx0dmFyIGMgPSBoY2dbMV0gLyAxMDA7XG5cdHZhciBnID0gaGNnWzJdIC8gMTAwO1xuXG5cdHZhciBsID0gZyAqICgxLjAgLSBjKSArIDAuNSAqIGM7XG5cdHZhciBzID0gMDtcblxuXHRpZiAobCA+IDAuMCAmJiBsIDwgMC41KSB7XG5cdFx0cyA9IGMgLyAoMiAqIGwpO1xuXHR9IGVsc2Vcblx0aWYgKGwgPj0gMC41ICYmIGwgPCAxLjApIHtcblx0XHRzID0gYyAvICgyICogKDEgLSBsKSk7XG5cdH1cblxuXHRyZXR1cm4gW2hjZ1swXSwgcyAqIDEwMCwgbCAqIDEwMF07XG59O1xuXG5jb252ZXJ0LmhjZy5od2IgPSBmdW5jdGlvbiAoaGNnKSB7XG5cdHZhciBjID0gaGNnWzFdIC8gMTAwO1xuXHR2YXIgZyA9IGhjZ1syXSAvIDEwMDtcblx0dmFyIHYgPSBjICsgZyAqICgxLjAgLSBjKTtcblx0cmV0dXJuIFtoY2dbMF0sICh2IC0gYykgKiAxMDAsICgxIC0gdikgKiAxMDBdO1xufTtcblxuY29udmVydC5od2IuaGNnID0gZnVuY3Rpb24gKGh3Yikge1xuXHR2YXIgdyA9IGh3YlsxXSAvIDEwMDtcblx0dmFyIGIgPSBod2JbMl0gLyAxMDA7XG5cdHZhciB2ID0gMSAtIGI7XG5cdHZhciBjID0gdiAtIHc7XG5cdHZhciBnID0gMDtcblxuXHRpZiAoYyA8IDEpIHtcblx0XHRnID0gKHYgLSBjKSAvICgxIC0gYyk7XG5cdH1cblxuXHRyZXR1cm4gW2h3YlswXSwgYyAqIDEwMCwgZyAqIDEwMF07XG59O1xuXG5jb252ZXJ0LmFwcGxlLnJnYiA9IGZ1bmN0aW9uIChhcHBsZSkge1xuXHRyZXR1cm4gWyhhcHBsZVswXSAvIDY1NTM1KSAqIDI1NSwgKGFwcGxlWzFdIC8gNjU1MzUpICogMjU1LCAoYXBwbGVbMl0gLyA2NTUzNSkgKiAyNTVdO1xufTtcblxuY29udmVydC5yZ2IuYXBwbGUgPSBmdW5jdGlvbiAocmdiKSB7XG5cdHJldHVybiBbKHJnYlswXSAvIDI1NSkgKiA2NTUzNSwgKHJnYlsxXSAvIDI1NSkgKiA2NTUzNSwgKHJnYlsyXSAvIDI1NSkgKiA2NTUzNV07XG59O1xuXG5jb252ZXJ0LmdyYXkucmdiID0gZnVuY3Rpb24gKGFyZ3MpIHtcblx0cmV0dXJuIFthcmdzWzBdIC8gMTAwICogMjU1LCBhcmdzWzBdIC8gMTAwICogMjU1LCBhcmdzWzBdIC8gMTAwICogMjU1XTtcbn07XG5cbmNvbnZlcnQuZ3JheS5oc2wgPSBjb252ZXJ0LmdyYXkuaHN2ID0gZnVuY3Rpb24gKGFyZ3MpIHtcblx0cmV0dXJuIFswLCAwLCBhcmdzWzBdXTtcbn07XG5cbmNvbnZlcnQuZ3JheS5od2IgPSBmdW5jdGlvbiAoZ3JheSkge1xuXHRyZXR1cm4gWzAsIDEwMCwgZ3JheVswXV07XG59O1xuXG5jb252ZXJ0LmdyYXkuY215ayA9IGZ1bmN0aW9uIChncmF5KSB7XG5cdHJldHVybiBbMCwgMCwgMCwgZ3JheVswXV07XG59O1xuXG5jb252ZXJ0LmdyYXkubGFiID0gZnVuY3Rpb24gKGdyYXkpIHtcblx0cmV0dXJuIFtncmF5WzBdLCAwLCAwXTtcbn07XG5cbmNvbnZlcnQuZ3JheS5oZXggPSBmdW5jdGlvbiAoZ3JheSkge1xuXHR2YXIgdmFsID0gTWF0aC5yb3VuZChncmF5WzBdIC8gMTAwICogMjU1KSAmIDB4RkY7XG5cdHZhciBpbnRlZ2VyID0gKHZhbCA8PCAxNikgKyAodmFsIDw8IDgpICsgdmFsO1xuXG5cdHZhciBzdHJpbmcgPSBpbnRlZ2VyLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpO1xuXHRyZXR1cm4gJzAwMDAwMCcuc3Vic3RyaW5nKHN0cmluZy5sZW5ndGgpICsgc3RyaW5nO1xufTtcblxuY29udmVydC5yZ2IuZ3JheSA9IGZ1bmN0aW9uIChyZ2IpIHtcblx0dmFyIHZhbCA9IChyZ2JbMF0gKyByZ2JbMV0gKyByZ2JbMl0pIC8gMztcblx0cmV0dXJuIFt2YWwgLyAyNTUgKiAxMDBdO1xufTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///184\n")},function(module,exports,__webpack_require__){eval("var Stack = __webpack_require__(99),\n arrayEach = __webpack_require__(155),\n assignValue = __webpack_require__(104),\n baseAssign = __webpack_require__(352),\n baseAssignIn = __webpack_require__(358),\n cloneBuffer = __webpack_require__(192),\n copyArray = __webpack_require__(193),\n copySymbols = __webpack_require__(361),\n copySymbolsIn = __webpack_require__(362),\n getAllKeys = __webpack_require__(197),\n getAllKeysIn = __webpack_require__(363),\n getTag = __webpack_require__(75),\n initCloneArray = __webpack_require__(367),\n initCloneByTag = __webpack_require__(368),\n initCloneObject = __webpack_require__(202),\n isArray = __webpack_require__(31),\n isBuffer = __webpack_require__(74),\n isMap = __webpack_require__(372),\n isObject = __webpack_require__(43),\n isSet = __webpack_require__(374),\n keys = __webpack_require__(59),\n keysIn = __webpack_require__(66);\n\n/** Used to compose bitmasks for cloning. */\nvar CLONE_DEEP_FLAG = 1,\n CLONE_FLAT_FLAG = 2,\n CLONE_SYMBOLS_FLAG = 4;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n objectTag = '[object Object]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]',\n weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values supported by `_.clone`. */\nvar cloneableTags = {};\ncloneableTags[argsTag] = cloneableTags[arrayTag] =\ncloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =\ncloneableTags[boolTag] = cloneableTags[dateTag] =\ncloneableTags[float32Tag] = cloneableTags[float64Tag] =\ncloneableTags[int8Tag] = cloneableTags[int16Tag] =\ncloneableTags[int32Tag] = cloneableTags[mapTag] =\ncloneableTags[numberTag] = cloneableTags[objectTag] =\ncloneableTags[regexpTag] = cloneableTags[setTag] =\ncloneableTags[stringTag] = cloneableTags[symbolTag] =\ncloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =\ncloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;\ncloneableTags[errorTag] = cloneableTags[funcTag] =\ncloneableTags[weakMapTag] = false;\n\n/**\n * The base implementation of `_.clone` and `_.cloneDeep` which tracks\n * traversed objects.\n *\n * @private\n * @param {*} value The value to clone.\n * @param {boolean} bitmask The bitmask flags.\n * 1 - Deep clone\n * 2 - Flatten inherited properties\n * 4 - Clone symbols\n * @param {Function} [customizer] The function to customize cloning.\n * @param {string} [key] The key of `value`.\n * @param {Object} [object] The parent object of `value`.\n * @param {Object} [stack] Tracks traversed objects and their clone counterparts.\n * @returns {*} Returns the cloned value.\n */\nfunction baseClone(value, bitmask, customizer, key, object, stack) {\n var result,\n isDeep = bitmask & CLONE_DEEP_FLAG,\n isFlat = bitmask & CLONE_FLAT_FLAG,\n isFull = bitmask & CLONE_SYMBOLS_FLAG;\n\n if (customizer) {\n result = object ? customizer(value, key, object, stack) : customizer(value);\n }\n if (result !== undefined) {\n return result;\n }\n if (!isObject(value)) {\n return value;\n }\n var isArr = isArray(value);\n if (isArr) {\n result = initCloneArray(value);\n if (!isDeep) {\n return copyArray(value, result);\n }\n } else {\n var tag = getTag(value),\n isFunc = tag == funcTag || tag == genTag;\n\n if (isBuffer(value)) {\n return cloneBuffer(value, isDeep);\n }\n if (tag == objectTag || tag == argsTag || (isFunc && !object)) {\n result = (isFlat || isFunc) ? {} : initCloneObject(value);\n if (!isDeep) {\n return isFlat\n ? copySymbolsIn(value, baseAssignIn(result, value))\n : copySymbols(value, baseAssign(result, value));\n }\n } else {\n if (!cloneableTags[tag]) {\n return object ? value : {};\n }\n result = initCloneByTag(value, tag, isDeep);\n }\n }\n // Check for circular references and return its corresponding clone.\n stack || (stack = new Stack);\n var stacked = stack.get(value);\n if (stacked) {\n return stacked;\n }\n stack.set(value, result);\n\n if (isSet(value)) {\n value.forEach(function(subValue) {\n result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));\n });\n } else if (isMap(value)) {\n value.forEach(function(subValue, key) {\n result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack));\n });\n }\n\n var keysFunc = isFull\n ? (isFlat ? getAllKeysIn : getAllKeys)\n : (isFlat ? keysIn : keys);\n\n var props = isArr ? undefined : keysFunc(value);\n arrayEach(props || value, function(subValue, key) {\n if (props) {\n key = subValue;\n subValue = value[key];\n }\n // Recursively populate clone (susceptible to call stack limits).\n assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));\n });\n return result;\n}\n\nmodule.exports = baseClone;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlQ2xvbmUuanM/MzgxOCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZLG1CQUFPLENBQUMsRUFBVTtBQUM5QixnQkFBZ0IsbUJBQU8sQ0FBQyxHQUFjO0FBQ3RDLGtCQUFrQixtQkFBTyxDQUFDLEdBQWdCO0FBQzFDLGlCQUFpQixtQkFBTyxDQUFDLEdBQWU7QUFDeEMsbUJBQW1CLG1CQUFPLENBQUMsR0FBaUI7QUFDNUMsa0JBQWtCLG1CQUFPLENBQUMsR0FBZ0I7QUFDMUMsZ0JBQWdCLG1CQUFPLENBQUMsR0FBYztBQUN0QyxrQkFBa0IsbUJBQU8sQ0FBQyxHQUFnQjtBQUMxQyxvQkFBb0IsbUJBQU8sQ0FBQyxHQUFrQjtBQUM5QyxpQkFBaUIsbUJBQU8sQ0FBQyxHQUFlO0FBQ3hDLG1CQUFtQixtQkFBTyxDQUFDLEdBQWlCO0FBQzVDLGFBQWEsbUJBQU8sQ0FBQyxFQUFXO0FBQ2hDLHFCQUFxQixtQkFBTyxDQUFDLEdBQW1CO0FBQ2hELHFCQUFxQixtQkFBTyxDQUFDLEdBQW1CO0FBQ2hELHNCQUFzQixtQkFBTyxDQUFDLEdBQW9CO0FBQ2xELGNBQWMsbUJBQU8sQ0FBQyxFQUFXO0FBQ2pDLGVBQWUsbUJBQU8sQ0FBQyxFQUFZO0FBQ25DLFlBQVksbUJBQU8sQ0FBQyxHQUFTO0FBQzdCLGVBQWUsbUJBQU8sQ0FBQyxFQUFZO0FBQ25DLFlBQVksbUJBQU8sQ0FBQyxHQUFTO0FBQzdCLFdBQVcsbUJBQU8sQ0FBQyxFQUFRO0FBQzNCLGFBQWEsbUJBQU8sQ0FBQyxFQUFVOztBQUUvQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxFQUFFO0FBQ2IsV0FBVyxRQUFRO0FBQ25CO0FBQ0E7QUFDQTtBQUNBLFdBQVcsU0FBUztBQUNwQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixhQUFhLEVBQUU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0M7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQSIsImZpbGUiOiIxODUuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgU3RhY2sgPSByZXF1aXJlKCcuL19TdGFjaycpLFxuICAgIGFycmF5RWFjaCA9IHJlcXVpcmUoJy4vX2FycmF5RWFjaCcpLFxuICAgIGFzc2lnblZhbHVlID0gcmVxdWlyZSgnLi9fYXNzaWduVmFsdWUnKSxcbiAgICBiYXNlQXNzaWduID0gcmVxdWlyZSgnLi9fYmFzZUFzc2lnbicpLFxuICAgIGJhc2VBc3NpZ25JbiA9IHJlcXVpcmUoJy4vX2Jhc2VBc3NpZ25JbicpLFxuICAgIGNsb25lQnVmZmVyID0gcmVxdWlyZSgnLi9fY2xvbmVCdWZmZXInKSxcbiAgICBjb3B5QXJyYXkgPSByZXF1aXJlKCcuL19jb3B5QXJyYXknKSxcbiAgICBjb3B5U3ltYm9scyA9IHJlcXVpcmUoJy4vX2NvcHlTeW1ib2xzJyksXG4gICAgY29weVN5bWJvbHNJbiA9IHJlcXVpcmUoJy4vX2NvcHlTeW1ib2xzSW4nKSxcbiAgICBnZXRBbGxLZXlzID0gcmVxdWlyZSgnLi9fZ2V0QWxsS2V5cycpLFxuICAgIGdldEFsbEtleXNJbiA9IHJlcXVpcmUoJy4vX2dldEFsbEtleXNJbicpLFxuICAgIGdldFRhZyA9IHJlcXVpcmUoJy4vX2dldFRhZycpLFxuICAgIGluaXRDbG9uZUFycmF5ID0gcmVxdWlyZSgnLi9faW5pdENsb25lQXJyYXknKSxcbiAgICBpbml0Q2xvbmVCeVRhZyA9IHJlcXVpcmUoJy4vX2luaXRDbG9uZUJ5VGFnJyksXG4gICAgaW5pdENsb25lT2JqZWN0ID0gcmVxdWlyZSgnLi9faW5pdENsb25lT2JqZWN0JyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpLFxuICAgIGlzQnVmZmVyID0gcmVxdWlyZSgnLi9pc0J1ZmZlcicpLFxuICAgIGlzTWFwID0gcmVxdWlyZSgnLi9pc01hcCcpLFxuICAgIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9pc09iamVjdCcpLFxuICAgIGlzU2V0ID0gcmVxdWlyZSgnLi9pc1NldCcpLFxuICAgIGtleXMgPSByZXF1aXJlKCcuL2tleXMnKSxcbiAgICBrZXlzSW4gPSByZXF1aXJlKCcuL2tleXNJbicpO1xuXG4vKiogVXNlZCB0byBjb21wb3NlIGJpdG1hc2tzIGZvciBjbG9uaW5nLiAqL1xudmFyIENMT05FX0RFRVBfRkxBRyA9IDEsXG4gICAgQ0xPTkVfRkxBVF9GTEFHID0gMixcbiAgICBDTE9ORV9TWU1CT0xTX0ZMQUcgPSA0O1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgYXJnc1RhZyA9ICdbb2JqZWN0IEFyZ3VtZW50c10nLFxuICAgIGFycmF5VGFnID0gJ1tvYmplY3QgQXJyYXldJyxcbiAgICBib29sVGFnID0gJ1tvYmplY3QgQm9vbGVhbl0nLFxuICAgIGRhdGVUYWcgPSAnW29iamVjdCBEYXRlXScsXG4gICAgZXJyb3JUYWcgPSAnW29iamVjdCBFcnJvcl0nLFxuICAgIGZ1bmNUYWcgPSAnW29iamVjdCBGdW5jdGlvbl0nLFxuICAgIGdlblRhZyA9ICdbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXScsXG4gICAgbWFwVGFnID0gJ1tvYmplY3QgTWFwXScsXG4gICAgbnVtYmVyVGFnID0gJ1tvYmplY3QgTnVtYmVyXScsXG4gICAgb2JqZWN0VGFnID0gJ1tvYmplY3QgT2JqZWN0XScsXG4gICAgcmVnZXhwVGFnID0gJ1tvYmplY3QgUmVnRXhwXScsXG4gICAgc2V0VGFnID0gJ1tvYmplY3QgU2V0XScsXG4gICAgc3RyaW5nVGFnID0gJ1tvYmplY3QgU3RyaW5nXScsXG4gICAgc3ltYm9sVGFnID0gJ1tvYmplY3QgU3ltYm9sXScsXG4gICAgd2Vha01hcFRhZyA9ICdbb2JqZWN0IFdlYWtNYXBdJztcblxudmFyIGFycmF5QnVmZmVyVGFnID0gJ1tvYmplY3QgQXJyYXlCdWZmZXJdJyxcbiAgICBkYXRhVmlld1RhZyA9ICdbb2JqZWN0IERhdGFWaWV3XScsXG4gICAgZmxvYXQzMlRhZyA9ICdbb2JqZWN0IEZsb2F0MzJBcnJheV0nLFxuICAgIGZsb2F0NjRUYWcgPSAnW29iamVjdCBGbG9hdDY0QXJyYXldJyxcbiAgICBpbnQ4VGFnID0gJ1tvYmplY3QgSW50OEFycmF5XScsXG4gICAgaW50MTZUYWcgPSAnW29iamVjdCBJbnQxNkFycmF5XScsXG4gICAgaW50MzJUYWcgPSAnW29iamVjdCBJbnQzMkFycmF5XScsXG4gICAgdWludDhUYWcgPSAnW29iamVjdCBVaW50OEFycmF5XScsXG4gICAgdWludDhDbGFtcGVkVGFnID0gJ1tvYmplY3QgVWludDhDbGFtcGVkQXJyYXldJyxcbiAgICB1aW50MTZUYWcgPSAnW29iamVjdCBVaW50MTZBcnJheV0nLFxuICAgIHVpbnQzMlRhZyA9ICdbb2JqZWN0IFVpbnQzMkFycmF5XSc7XG5cbi8qKiBVc2VkIHRvIGlkZW50aWZ5IGB0b1N0cmluZ1RhZ2AgdmFsdWVzIHN1cHBvcnRlZCBieSBgXy5jbG9uZWAuICovXG52YXIgY2xvbmVhYmxlVGFncyA9IHt9O1xuY2xvbmVhYmxlVGFnc1thcmdzVGFnXSA9IGNsb25lYWJsZVRhZ3NbYXJyYXlUYWddID1cbmNsb25lYWJsZVRhZ3NbYXJyYXlCdWZmZXJUYWddID0gY2xvbmVhYmxlVGFnc1tkYXRhVmlld1RhZ10gPVxuY2xvbmVhYmxlVGFnc1tib29sVGFnXSA9IGNsb25lYWJsZVRhZ3NbZGF0ZVRhZ10gPVxuY2xvbmVhYmxlVGFnc1tmbG9hdDMyVGFnXSA9IGNsb25lYWJsZVRhZ3NbZmxvYXQ2NFRhZ10gPVxuY2xvbmVhYmxlVGFnc1tpbnQ4VGFnXSA9IGNsb25lYWJsZVRhZ3NbaW50MTZUYWddID1cbmNsb25lYWJsZVRhZ3NbaW50MzJUYWddID0gY2xvbmVhYmxlVGFnc1ttYXBUYWddID1cbmNsb25lYWJsZVRhZ3NbbnVtYmVyVGFnXSA9IGNsb25lYWJsZVRhZ3Nbb2JqZWN0VGFnXSA9XG5jbG9uZWFibGVUYWdzW3JlZ2V4cFRhZ10gPSBjbG9uZWFibGVUYWdzW3NldFRhZ10gPVxuY2xvbmVhYmxlVGFnc1tzdHJpbmdUYWddID0gY2xvbmVhYmxlVGFnc1tzeW1ib2xUYWddID1cbmNsb25lYWJsZVRhZ3NbdWludDhUYWddID0gY2xvbmVhYmxlVGFnc1t1aW50OENsYW1wZWRUYWddID1cbmNsb25lYWJsZVRhZ3NbdWludDE2VGFnXSA9IGNsb25lYWJsZVRhZ3NbdWludDMyVGFnXSA9IHRydWU7XG5jbG9uZWFibGVUYWdzW2Vycm9yVGFnXSA9IGNsb25lYWJsZVRhZ3NbZnVuY1RhZ10gPVxuY2xvbmVhYmxlVGFnc1t3ZWFrTWFwVGFnXSA9IGZhbHNlO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmNsb25lYCBhbmQgYF8uY2xvbmVEZWVwYCB3aGljaCB0cmFja3NcbiAqIHRyYXZlcnNlZCBvYmplY3RzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjbG9uZS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy5cbiAqICAxIC0gRGVlcCBjbG9uZVxuICogIDIgLSBGbGF0dGVuIGluaGVyaXRlZCBwcm9wZXJ0aWVzXG4gKiAgNCAtIENsb25lIHN5bWJvbHNcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNsb25pbmcuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2tleV0gVGhlIGtleSBvZiBgdmFsdWVgLlxuICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBwYXJlbnQgb2JqZWN0IG9mIGB2YWx1ZWAuXG4gKiBAcGFyYW0ge09iamVjdH0gW3N0YWNrXSBUcmFja3MgdHJhdmVyc2VkIG9iamVjdHMgYW5kIHRoZWlyIGNsb25lIGNvdW50ZXJwYXJ0cy5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBjbG9uZWQgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGJhc2VDbG9uZSh2YWx1ZSwgYml0bWFzaywgY3VzdG9taXplciwga2V5LCBvYmplY3QsIHN0YWNrKSB7XG4gIHZhciByZXN1bHQsXG4gICAgICBpc0RlZXAgPSBiaXRtYXNrICYgQ0xPTkVfREVFUF9GTEFHLFxuICAgICAgaXNGbGF0ID0gYml0bWFzayAmIENMT05FX0ZMQVRfRkxBRyxcbiAgICAgIGlzRnVsbCA9IGJpdG1hc2sgJiBDTE9ORV9TWU1CT0xTX0ZMQUc7XG5cbiAgaWYgKGN1c3RvbWl6ZXIpIHtcbiAgICByZXN1bHQgPSBvYmplY3QgPyBjdXN0b21pemVyKHZhbHVlLCBrZXksIG9iamVjdCwgc3RhY2spIDogY3VzdG9taXplcih2YWx1ZSk7XG4gIH1cbiAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBpZiAoIWlzT2JqZWN0KHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICB2YXIgaXNBcnIgPSBpc0FycmF5KHZhbHVlKTtcbiAgaWYgKGlzQXJyKSB7XG4gICAgcmVzdWx0ID0gaW5pdENsb25lQXJyYXkodmFsdWUpO1xuICAgIGlmICghaXNEZWVwKSB7XG4gICAgICByZXR1cm4gY29weUFycmF5KHZhbHVlLCByZXN1bHQpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YXIgdGFnID0gZ2V0VGFnKHZhbHVlKSxcbiAgICAgICAgaXNGdW5jID0gdGFnID09IGZ1bmNUYWcgfHwgdGFnID09IGdlblRhZztcblxuICAgIGlmIChpc0J1ZmZlcih2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBjbG9uZUJ1ZmZlcih2YWx1ZSwgaXNEZWVwKTtcbiAgICB9XG4gICAgaWYgKHRhZyA9PSBvYmplY3RUYWcgfHwgdGFnID09IGFyZ3NUYWcgfHwgKGlzRnVuYyAmJiAhb2JqZWN0KSkge1xuICAgICAgcmVzdWx0ID0gKGlzRmxhdCB8fCBpc0Z1bmMpID8ge30gOiBpbml0Q2xvbmVPYmplY3QodmFsdWUpO1xuICAgICAgaWYgKCFpc0RlZXApIHtcbiAgICAgICAgcmV0dXJuIGlzRmxhdFxuICAgICAgICAgID8gY29weVN5bWJvbHNJbih2YWx1ZSwgYmFzZUFzc2lnbkluKHJlc3VsdCwgdmFsdWUpKVxuICAgICAgICAgIDogY29weVN5bWJvbHModmFsdWUsIGJhc2VBc3NpZ24ocmVzdWx0LCB2YWx1ZSkpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIWNsb25lYWJsZVRhZ3NbdGFnXSkge1xuICAgICAgICByZXR1cm4gb2JqZWN0ID8gdmFsdWUgOiB7fTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdCA9IGluaXRDbG9uZUJ5VGFnKHZhbHVlLCB0YWcsIGlzRGVlcCk7XG4gICAgfVxuICB9XG4gIC8vIENoZWNrIGZvciBjaXJjdWxhciByZWZlcmVuY2VzIGFuZCByZXR1cm4gaXRzIGNvcnJlc3BvbmRpbmcgY2xvbmUuXG4gIHN0YWNrIHx8IChzdGFjayA9IG5ldyBTdGFjayk7XG4gIHZhciBzdGFja2VkID0gc3RhY2suZ2V0KHZhbHVlKTtcbiAgaWYgKHN0YWNrZWQpIHtcbiAgICByZXR1cm4gc3RhY2tlZDtcbiAgfVxuICBzdGFjay5zZXQodmFsdWUsIHJlc3VsdCk7XG5cbiAgaWYgKGlzU2V0KHZhbHVlKSkge1xuICAgIHZhbHVlLmZvckVhY2goZnVuY3Rpb24oc3ViVmFsdWUpIHtcbiAgICAgIHJlc3VsdC5hZGQoYmFzZUNsb25lKHN1YlZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBzdWJWYWx1ZSwgdmFsdWUsIHN0YWNrKSk7XG4gICAgfSk7XG4gIH0gZWxzZSBpZiAoaXNNYXAodmFsdWUpKSB7XG4gICAgdmFsdWUuZm9yRWFjaChmdW5jdGlvbihzdWJWYWx1ZSwga2V5KSB7XG4gICAgICByZXN1bHQuc2V0KGtleSwgYmFzZUNsb25lKHN1YlZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBrZXksIHZhbHVlLCBzdGFjaykpO1xuICAgIH0pO1xuICB9XG5cbiAgdmFyIGtleXNGdW5jID0gaXNGdWxsXG4gICAgPyAoaXNGbGF0ID8gZ2V0QWxsS2V5c0luIDogZ2V0QWxsS2V5cylcbiAgICA6IChpc0ZsYXQgPyBrZXlzSW4gOiBrZXlzKTtcblxuICB2YXIgcHJvcHMgPSBpc0FyciA/IHVuZGVmaW5lZCA6IGtleXNGdW5jKHZhbHVlKTtcbiAgYXJyYXlFYWNoKHByb3BzIHx8IHZhbHVlLCBmdW5jdGlvbihzdWJWYWx1ZSwga2V5KSB7XG4gICAgaWYgKHByb3BzKSB7XG4gICAgICBrZXkgPSBzdWJWYWx1ZTtcbiAgICAgIHN1YlZhbHVlID0gdmFsdWVba2V5XTtcbiAgICB9XG4gICAgLy8gUmVjdXJzaXZlbHkgcG9wdWxhdGUgY2xvbmUgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICBhc3NpZ25WYWx1ZShyZXN1bHQsIGtleSwgYmFzZUNsb25lKHN1YlZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBrZXksIHZhbHVlLCBzdGFjaykpO1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlQ2xvbmU7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///185\n")},function(module,exports,__webpack_require__){eval("/* WEBPACK VAR INJECTION */(function(global) {/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nmodule.exports = freeGlobal;\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(187)))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19mcmVlR2xvYmFsLmpzPzU4NWEiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTs7QUFFQSIsImZpbGUiOiIxODYuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYGdsb2JhbGAgZnJvbSBOb2RlLmpzLiAqL1xudmFyIGZyZWVHbG9iYWwgPSB0eXBlb2YgZ2xvYmFsID09ICdvYmplY3QnICYmIGdsb2JhbCAmJiBnbG9iYWwuT2JqZWN0ID09PSBPYmplY3QgJiYgZ2xvYmFsO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZyZWVHbG9iYWw7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///186\n")},function(module,exports){eval('var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || new Function("return this")();\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === "object") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it\'s\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vKHdlYnBhY2spL2J1aWxkaW4vZ2xvYmFsLmpzP2NkMDAiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSw0Q0FBNEM7O0FBRTVDIiwiZmlsZSI6IjE4Ny5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBnO1xuXG4vLyBUaGlzIHdvcmtzIGluIG5vbi1zdHJpY3QgbW9kZVxuZyA9IChmdW5jdGlvbigpIHtcblx0cmV0dXJuIHRoaXM7XG59KSgpO1xuXG50cnkge1xuXHQvLyBUaGlzIHdvcmtzIGlmIGV2YWwgaXMgYWxsb3dlZCAoc2VlIENTUClcblx0ZyA9IGcgfHwgbmV3IEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKTtcbn0gY2F0Y2ggKGUpIHtcblx0Ly8gVGhpcyB3b3JrcyBpZiB0aGUgd2luZG93IHJlZmVyZW5jZSBpcyBhdmFpbGFibGVcblx0aWYgKHR5cGVvZiB3aW5kb3cgPT09IFwib2JqZWN0XCIpIGcgPSB3aW5kb3c7XG59XG5cbi8vIGcgY2FuIHN0aWxsIGJlIHVuZGVmaW5lZCwgYnV0IG5vdGhpbmcgdG8gZG8gYWJvdXQgaXQuLi5cbi8vIFdlIHJldHVybiB1bmRlZmluZWQsIGluc3RlYWQgb2Ygbm90aGluZyBoZXJlLCBzbyBpdCdzXG4vLyBlYXNpZXIgdG8gaGFuZGxlIHRoaXMgY2FzZS4gaWYoIWdsb2JhbCkgeyAuLi59XG5cbm1vZHVsZS5leHBvcnRzID0gZztcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///187\n')},function(module,exports){eval("/** Used for built-in method references. */\nvar funcProto = Function.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n try {\n return (func + '');\n } catch (e) {}\n }\n return '';\n}\n\nmodule.exports = toSource;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL190b1NvdXJjZS5qcz9kYzU3Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsU0FBUztBQUNwQixhQUFhLE9BQU87QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQSIsImZpbGUiOiIxODguanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgZnVuY1Byb3RvID0gRnVuY3Rpb24ucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byByZXNvbHZlIHRoZSBkZWNvbXBpbGVkIHNvdXJjZSBvZiBmdW5jdGlvbnMuICovXG52YXIgZnVuY1RvU3RyaW5nID0gZnVuY1Byb3RvLnRvU3RyaW5nO1xuXG4vKipcbiAqIENvbnZlcnRzIGBmdW5jYCB0byBpdHMgc291cmNlIGNvZGUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBzb3VyY2UgY29kZS5cbiAqL1xuZnVuY3Rpb24gdG9Tb3VyY2UoZnVuYykge1xuICBpZiAoZnVuYyAhPSBudWxsKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBmdW5jVG9TdHJpbmcuY2FsbChmdW5jKTtcbiAgICB9IGNhdGNoIChlKSB7fVxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gKGZ1bmMgKyAnJyk7XG4gICAgfSBjYXRjaCAoZSkge31cbiAgfVxuICByZXR1cm4gJyc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdG9Tb3VyY2U7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///188\n")},function(module,exports,__webpack_require__){eval("var getNative = __webpack_require__(64);\n\nvar defineProperty = (function() {\n try {\n var func = getNative(Object, 'defineProperty');\n func({}, '', {});\n return func;\n } catch (e) {}\n}());\n\nmodule.exports = defineProperty;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19kZWZpbmVQcm9wZXJ0eS5qcz8zYjRhIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGdCQUFnQixtQkFBTyxDQUFDLEVBQWM7O0FBRXRDO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQjtBQUNBLEdBQUc7QUFDSCxDQUFDOztBQUVEIiwiZmlsZSI6IjE4OS5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBnZXROYXRpdmUgPSByZXF1aXJlKCcuL19nZXROYXRpdmUnKTtcblxudmFyIGRlZmluZVByb3BlcnR5ID0gKGZ1bmN0aW9uKCkge1xuICB0cnkge1xuICAgIHZhciBmdW5jID0gZ2V0TmF0aXZlKE9iamVjdCwgJ2RlZmluZVByb3BlcnR5Jyk7XG4gICAgZnVuYyh7fSwgJycsIHt9KTtcbiAgICByZXR1cm4gZnVuYztcbiAgfSBjYXRjaCAoZSkge31cbn0oKSk7XG5cbm1vZHVsZS5leHBvcnRzID0gZGVmaW5lUHJvcGVydHk7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///189\n")},function(module,exports,__webpack_require__){eval("var baseTimes = __webpack_require__(353),\n isArguments = __webpack_require__(88),\n isArray = __webpack_require__(31),\n isBuffer = __webpack_require__(74),\n isIndex = __webpack_require__(106),\n isTypedArray = __webpack_require__(89);\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\nfunction arrayLikeKeys(value, inherited) {\n var isArr = isArray(value),\n isArg = !isArr && isArguments(value),\n isBuff = !isArr && !isArg && isBuffer(value),\n isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n skipIndexes = isArr || isArg || isBuff || isType,\n result = skipIndexes ? baseTimes(value.length, String) : [],\n length = result.length;\n\n for (var key in value) {\n if ((inherited || hasOwnProperty.call(value, key)) &&\n !(skipIndexes && (\n // Safari 9 has enumerable `arguments.length` in strict mode.\n key == 'length' ||\n // Node.js 0.10 has enumerable non-index properties on buffers.\n (isBuff && (key == 'offset' || key == 'parent')) ||\n // PhantomJS 2 has enumerable non-index properties on typed arrays.\n (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n // Skip index properties.\n isIndex(key, length)\n ))) {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = arrayLikeKeys;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19hcnJheUxpa2VLZXlzLmpzPzZmY2QiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsZ0JBQWdCLG1CQUFPLENBQUMsR0FBYztBQUN0QyxrQkFBa0IsbUJBQU8sQ0FBQyxFQUFlO0FBQ3pDLGNBQWMsbUJBQU8sQ0FBQyxFQUFXO0FBQ2pDLGVBQWUsbUJBQU8sQ0FBQyxFQUFZO0FBQ25DLGNBQWMsbUJBQU8sQ0FBQyxHQUFZO0FBQ2xDLG1CQUFtQixtQkFBTyxDQUFDLEVBQWdCOztBQUUzQztBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEVBQUU7QUFDYixXQUFXLFFBQVE7QUFDbkIsYUFBYSxNQUFNO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwiZmlsZSI6IjE5MC5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBiYXNlVGltZXMgPSByZXF1aXJlKCcuL19iYXNlVGltZXMnKSxcbiAgICBpc0FyZ3VtZW50cyA9IHJlcXVpcmUoJy4vaXNBcmd1bWVudHMnKSxcbiAgICBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5JyksXG4gICAgaXNCdWZmZXIgPSByZXF1aXJlKCcuL2lzQnVmZmVyJyksXG4gICAgaXNJbmRleCA9IHJlcXVpcmUoJy4vX2lzSW5kZXgnKSxcbiAgICBpc1R5cGVkQXJyYXkgPSByZXF1aXJlKCcuL2lzVHlwZWRBcnJheScpO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgb2YgdGhlIGFycmF5LWxpa2UgYHZhbHVlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGluaGVyaXRlZCBTcGVjaWZ5IHJldHVybmluZyBpbmhlcml0ZWQgcHJvcGVydHkgbmFtZXMuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICovXG5mdW5jdGlvbiBhcnJheUxpa2VLZXlzKHZhbHVlLCBpbmhlcml0ZWQpIHtcbiAgdmFyIGlzQXJyID0gaXNBcnJheSh2YWx1ZSksXG4gICAgICBpc0FyZyA9ICFpc0FyciAmJiBpc0FyZ3VtZW50cyh2YWx1ZSksXG4gICAgICBpc0J1ZmYgPSAhaXNBcnIgJiYgIWlzQXJnICYmIGlzQnVmZmVyKHZhbHVlKSxcbiAgICAgIGlzVHlwZSA9ICFpc0FyciAmJiAhaXNBcmcgJiYgIWlzQnVmZiAmJiBpc1R5cGVkQXJyYXkodmFsdWUpLFxuICAgICAgc2tpcEluZGV4ZXMgPSBpc0FyciB8fCBpc0FyZyB8fCBpc0J1ZmYgfHwgaXNUeXBlLFxuICAgICAgcmVzdWx0ID0gc2tpcEluZGV4ZXMgPyBiYXNlVGltZXModmFsdWUubGVuZ3RoLCBTdHJpbmcpIDogW10sXG4gICAgICBsZW5ndGggPSByZXN1bHQubGVuZ3RoO1xuXG4gIGZvciAodmFyIGtleSBpbiB2YWx1ZSkge1xuICAgIGlmICgoaW5oZXJpdGVkIHx8IGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIGtleSkpICYmXG4gICAgICAgICEoc2tpcEluZGV4ZXMgJiYgKFxuICAgICAgICAgICAvLyBTYWZhcmkgOSBoYXMgZW51bWVyYWJsZSBgYXJndW1lbnRzLmxlbmd0aGAgaW4gc3RyaWN0IG1vZGUuXG4gICAgICAgICAgIGtleSA9PSAnbGVuZ3RoJyB8fFxuICAgICAgICAgICAvLyBOb2RlLmpzIDAuMTAgaGFzIGVudW1lcmFibGUgbm9uLWluZGV4IHByb3BlcnRpZXMgb24gYnVmZmVycy5cbiAgICAgICAgICAgKGlzQnVmZiAmJiAoa2V5ID09ICdvZmZzZXQnIHx8IGtleSA9PSAncGFyZW50JykpIHx8XG4gICAgICAgICAgIC8vIFBoYW50b21KUyAyIGhhcyBlbnVtZXJhYmxlIG5vbi1pbmRleCBwcm9wZXJ0aWVzIG9uIHR5cGVkIGFycmF5cy5cbiAgICAgICAgICAgKGlzVHlwZSAmJiAoa2V5ID09ICdidWZmZXInIHx8IGtleSA9PSAnYnl0ZUxlbmd0aCcgfHwga2V5ID09ICdieXRlT2Zmc2V0JykpIHx8XG4gICAgICAgICAgIC8vIFNraXAgaW5kZXggcHJvcGVydGllcy5cbiAgICAgICAgICAgaXNJbmRleChrZXksIGxlbmd0aClcbiAgICAgICAgKSkpIHtcbiAgICAgIHJlc3VsdC5wdXNoKGtleSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXJyYXlMaWtlS2V5cztcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///190\n")},function(module,exports){eval("/**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\nfunction overArg(func, transform) {\n return function(arg) {\n return func(transform(arg));\n };\n}\n\nmodule.exports = overArg;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19vdmVyQXJnLmpzPzkxZTkiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFNBQVM7QUFDcEIsV0FBVyxTQUFTO0FBQ3BCLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJmaWxlIjoiMTkxLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDcmVhdGVzIGEgdW5hcnkgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCB3aXRoIGl0cyBhcmd1bWVudCB0cmFuc2Zvcm1lZC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gd3JhcC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHRyYW5zZm9ybSBUaGUgYXJndW1lbnQgdHJhbnNmb3JtLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIG92ZXJBcmcoZnVuYywgdHJhbnNmb3JtKSB7XG4gIHJldHVybiBmdW5jdGlvbihhcmcpIHtcbiAgICByZXR1cm4gZnVuYyh0cmFuc2Zvcm0oYXJnKSk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gb3ZlckFyZztcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///191\n")},function(module,exports,__webpack_require__){eval("/* WEBPACK VAR INJECTION */(function(module) {var root = __webpack_require__(47);\n\n/** Detect free variable `exports`. */\nvar freeExports = true && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined,\n allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined;\n\n/**\n * Creates a clone of `buffer`.\n *\n * @private\n * @param {Buffer} buffer The buffer to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Buffer} Returns the cloned buffer.\n */\nfunction cloneBuffer(buffer, isDeep) {\n if (isDeep) {\n return buffer.slice();\n }\n var length = buffer.length,\n result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);\n\n buffer.copy(result);\n return result;\n}\n\nmodule.exports = cloneBuffer;\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(156)(module)))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jbG9uZUJ1ZmZlci5qcz9lNTM4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHlEQUFXLG1CQUFPLENBQUMsRUFBUzs7QUFFNUI7QUFDQSxrQkFBa0IsS0FBMEI7O0FBRTVDO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsV0FBVyxRQUFRO0FBQ25CLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEiLCJmaWxlIjoiMTkyLmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIHJvb3QgPSByZXF1aXJlKCcuL19yb290Jyk7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgZXhwb3J0c2AuICovXG52YXIgZnJlZUV4cG9ydHMgPSB0eXBlb2YgZXhwb3J0cyA9PSAnb2JqZWN0JyAmJiBleHBvcnRzICYmICFleHBvcnRzLm5vZGVUeXBlICYmIGV4cG9ydHM7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgbW9kdWxlYC4gKi9cbnZhciBmcmVlTW9kdWxlID0gZnJlZUV4cG9ydHMgJiYgdHlwZW9mIG1vZHVsZSA9PSAnb2JqZWN0JyAmJiBtb2R1bGUgJiYgIW1vZHVsZS5ub2RlVHlwZSAmJiBtb2R1bGU7XG5cbi8qKiBEZXRlY3QgdGhlIHBvcHVsYXIgQ29tbW9uSlMgZXh0ZW5zaW9uIGBtb2R1bGUuZXhwb3J0c2AuICovXG52YXIgbW9kdWxlRXhwb3J0cyA9IGZyZWVNb2R1bGUgJiYgZnJlZU1vZHVsZS5leHBvcnRzID09PSBmcmVlRXhwb3J0cztcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgQnVmZmVyID0gbW9kdWxlRXhwb3J0cyA/IHJvb3QuQnVmZmVyIDogdW5kZWZpbmVkLFxuICAgIGFsbG9jVW5zYWZlID0gQnVmZmVyID8gQnVmZmVyLmFsbG9jVW5zYWZlIDogdW5kZWZpbmVkO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBjbG9uZSBvZiAgYGJ1ZmZlcmAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QnVmZmVyfSBidWZmZXIgVGhlIGJ1ZmZlciB0byBjbG9uZS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzRGVlcF0gU3BlY2lmeSBhIGRlZXAgY2xvbmUuXG4gKiBAcmV0dXJucyB7QnVmZmVyfSBSZXR1cm5zIHRoZSBjbG9uZWQgYnVmZmVyLlxuICovXG5mdW5jdGlvbiBjbG9uZUJ1ZmZlcihidWZmZXIsIGlzRGVlcCkge1xuICBpZiAoaXNEZWVwKSB7XG4gICAgcmV0dXJuIGJ1ZmZlci5zbGljZSgpO1xuICB9XG4gIHZhciBsZW5ndGggPSBidWZmZXIubGVuZ3RoLFxuICAgICAgcmVzdWx0ID0gYWxsb2NVbnNhZmUgPyBhbGxvY1Vuc2FmZShsZW5ndGgpIDogbmV3IGJ1ZmZlci5jb25zdHJ1Y3RvcihsZW5ndGgpO1xuXG4gIGJ1ZmZlci5jb3B5KHJlc3VsdCk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY2xvbmVCdWZmZXI7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///192\n")},function(module,exports){eval("/**\n * Copies the values of `source` to `array`.\n *\n * @private\n * @param {Array} source The array to copy values from.\n * @param {Array} [array=[]] The array to copy values to.\n * @returns {Array} Returns `array`.\n */\nfunction copyArray(source, array) {\n var index = -1,\n length = source.length;\n\n array || (array = Array(length));\n while (++index < length) {\n array[index] = source[index];\n }\n return array;\n}\n\nmodule.exports = copyArray;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jb3B5QXJyYXkuanM/NDM1OSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsTUFBTTtBQUNqQixXQUFXLE1BQU07QUFDakIsYUFBYSxNQUFNO0FBQ25CO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsImZpbGUiOiIxOTMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcGllcyB0aGUgdmFsdWVzIG9mIGBzb3VyY2VgIHRvIGBhcnJheWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IHNvdXJjZSBUaGUgYXJyYXkgdG8gY29weSB2YWx1ZXMgZnJvbS5cbiAqIEBwYXJhbSB7QXJyYXl9IFthcnJheT1bXV0gVGhlIGFycmF5IHRvIGNvcHkgdmFsdWVzIHRvLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gKi9cbmZ1bmN0aW9uIGNvcHlBcnJheShzb3VyY2UsIGFycmF5KSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gc291cmNlLmxlbmd0aDtcblxuICBhcnJheSB8fCAoYXJyYXkgPSBBcnJheShsZW5ndGgpKTtcbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICBhcnJheVtpbmRleF0gPSBzb3VyY2VbaW5kZXhdO1xuICB9XG4gIHJldHVybiBhcnJheTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjb3B5QXJyYXk7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///193\n")},function(module,exports){eval("/**\n * A specialized version of `_.filter` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\nfunction arrayFilter(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length,\n resIndex = 0,\n result = [];\n\n while (++index < length) {\n var value = array[index];\n if (predicate(value, index, array)) {\n result[resIndex++] = value;\n }\n }\n return result;\n}\n\nmodule.exports = arrayFilter;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19hcnJheUZpbHRlci5qcz8yZDdjIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE1BQU07QUFDakIsV0FBVyxTQUFTO0FBQ3BCLGFBQWEsTUFBTTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsImZpbGUiOiIxOTQuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5maWx0ZXJgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvclxuICogaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmaWx0ZXJlZCBhcnJheS5cbiAqL1xuZnVuY3Rpb24gYXJyYXlGaWx0ZXIoYXJyYXksIHByZWRpY2F0ZSkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoLFxuICAgICAgcmVzSW5kZXggPSAwLFxuICAgICAgcmVzdWx0ID0gW107XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF07XG4gICAgaWYgKHByZWRpY2F0ZSh2YWx1ZSwgaW5kZXgsIGFycmF5KSkge1xuICAgICAgcmVzdWx0W3Jlc0luZGV4KytdID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXJyYXlGaWx0ZXI7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///194\n")},function(module,exports){eval("/**\n * This method returns a new empty array.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {Array} Returns the new empty array.\n * @example\n *\n * var arrays = _.times(2, _.stubArray);\n *\n * console.log(arrays);\n * // => [[], []]\n *\n * console.log(arrays[0] === arrays[1]);\n * // => false\n */\nfunction stubArray() {\n return [];\n}\n\nmodule.exports = stubArray;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL3N0dWJBcnJheS5qcz9kMzI3Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxNQUFNO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwiZmlsZSI6IjE5NS5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVGhpcyBtZXRob2QgcmV0dXJucyBhIG5ldyBlbXB0eSBhcnJheS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMTMuMFxuICogQGNhdGVnb3J5IFV0aWxcbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGVtcHR5IGFycmF5LlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgYXJyYXlzID0gXy50aW1lcygyLCBfLnN0dWJBcnJheSk7XG4gKlxuICogY29uc29sZS5sb2coYXJyYXlzKTtcbiAqIC8vID0+IFtbXSwgW11dXG4gKlxuICogY29uc29sZS5sb2coYXJyYXlzWzBdID09PSBhcnJheXNbMV0pO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gc3R1YkFycmF5KCkge1xuICByZXR1cm4gW107XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc3R1YkFycmF5O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///195\n")},function(module,exports,__webpack_require__){eval("var arrayPush = __webpack_require__(161),\n getPrototype = __webpack_require__(109),\n getSymbols = __webpack_require__(160),\n stubArray = __webpack_require__(195);\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeGetSymbols = Object.getOwnPropertySymbols;\n\n/**\n * Creates an array of the own and inherited enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\nvar getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) {\n var result = [];\n while (object) {\n arrayPush(result, getSymbols(object));\n object = getPrototype(object);\n }\n return result;\n};\n\nmodule.exports = getSymbolsIn;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19nZXRTeW1ib2xzSW4uanM/YTAyOSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxnQkFBZ0IsbUJBQU8sQ0FBQyxHQUFjO0FBQ3RDLG1CQUFtQixtQkFBTyxDQUFDLEdBQWlCO0FBQzVDLGlCQUFpQixtQkFBTyxDQUFDLEdBQWU7QUFDeEMsZ0JBQWdCLG1CQUFPLENBQUMsR0FBYTs7QUFFckM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixhQUFhLE1BQU07QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwiZmlsZSI6IjE5Ni5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBhcnJheVB1c2ggPSByZXF1aXJlKCcuL19hcnJheVB1c2gnKSxcbiAgICBnZXRQcm90b3R5cGUgPSByZXF1aXJlKCcuL19nZXRQcm90b3R5cGUnKSxcbiAgICBnZXRTeW1ib2xzID0gcmVxdWlyZSgnLi9fZ2V0U3ltYm9scycpLFxuICAgIHN0dWJBcnJheSA9IHJlcXVpcmUoJy4vc3R1YkFycmF5Jyk7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVHZXRTeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scztcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHN5bWJvbHMgb2YgYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2Ygc3ltYm9scy5cbiAqL1xudmFyIGdldFN5bWJvbHNJbiA9ICFuYXRpdmVHZXRTeW1ib2xzID8gc3R1YkFycmF5IDogZnVuY3Rpb24ob2JqZWN0KSB7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgd2hpbGUgKG9iamVjdCkge1xuICAgIGFycmF5UHVzaChyZXN1bHQsIGdldFN5bWJvbHMob2JqZWN0KSk7XG4gICAgb2JqZWN0ID0gZ2V0UHJvdG90eXBlKG9iamVjdCk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0U3ltYm9sc0luO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///196\n")},function(module,exports,__webpack_require__){eval("var baseGetAllKeys = __webpack_require__(198),\n getSymbols = __webpack_require__(160),\n keys = __webpack_require__(59);\n\n/**\n * Creates an array of own enumerable property names and symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction getAllKeys(object) {\n return baseGetAllKeys(object, keys, getSymbols);\n}\n\nmodule.exports = getAllKeys;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19nZXRBbGxLZXlzLmpzP2E5OTQiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEscUJBQXFCLG1CQUFPLENBQUMsR0FBbUI7QUFDaEQsaUJBQWlCLG1CQUFPLENBQUMsR0FBZTtBQUN4QyxXQUFXLG1CQUFPLENBQUMsRUFBUTs7QUFFM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsYUFBYSxNQUFNO0FBQ25CO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwiZmlsZSI6IjE5Ny5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBiYXNlR2V0QWxsS2V5cyA9IHJlcXVpcmUoJy4vX2Jhc2VHZXRBbGxLZXlzJyksXG4gICAgZ2V0U3ltYm9scyA9IHJlcXVpcmUoJy4vX2dldFN5bWJvbHMnKSxcbiAgICBrZXlzID0gcmVxdWlyZSgnLi9rZXlzJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiBvd24gZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBhbmQgc3ltYm9scyBvZiBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcyBhbmQgc3ltYm9scy5cbiAqL1xuZnVuY3Rpb24gZ2V0QWxsS2V5cyhvYmplY3QpIHtcbiAgcmV0dXJuIGJhc2VHZXRBbGxLZXlzKG9iamVjdCwga2V5cywgZ2V0U3ltYm9scyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0QWxsS2V5cztcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///197\n")},function(module,exports,__webpack_require__){eval("var arrayPush = __webpack_require__(161),\n isArray = __webpack_require__(31);\n\n/**\n * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\n * `keysFunc` and `symbolsFunc` to get the enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @param {Function} symbolsFunc The function to get the symbols of `object`.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction baseGetAllKeys(object, keysFunc, symbolsFunc) {\n var result = keysFunc(object);\n return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\n}\n\nmodule.exports = baseGetAllKeys;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlR2V0QWxsS2V5cy5qcz83ZDFmIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGdCQUFnQixtQkFBTyxDQUFDLEdBQWM7QUFDdEMsY0FBYyxtQkFBTyxDQUFDLEVBQVc7O0FBRWpDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixXQUFXLFNBQVM7QUFDcEIsV0FBVyxTQUFTO0FBQ3BCLGFBQWEsTUFBTTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwiZmlsZSI6IjE5OC5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBhcnJheVB1c2ggPSByZXF1aXJlKCcuL19hcnJheVB1c2gnKSxcbiAgICBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5Jyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYGdldEFsbEtleXNgIGFuZCBgZ2V0QWxsS2V5c0luYCB3aGljaCB1c2VzXG4gKiBga2V5c0Z1bmNgIGFuZCBgc3ltYm9sc0Z1bmNgIHRvIGdldCB0aGUgZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBhbmRcbiAqIHN5bWJvbHMgb2YgYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGtleXNGdW5jIFRoZSBmdW5jdGlvbiB0byBnZXQgdGhlIGtleXMgb2YgYG9iamVjdGAuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBzeW1ib2xzRnVuYyBUaGUgZnVuY3Rpb24gdG8gZ2V0IHRoZSBzeW1ib2xzIG9mIGBvYmplY3RgLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcyBhbmQgc3ltYm9scy5cbiAqL1xuZnVuY3Rpb24gYmFzZUdldEFsbEtleXMob2JqZWN0LCBrZXlzRnVuYywgc3ltYm9sc0Z1bmMpIHtcbiAgdmFyIHJlc3VsdCA9IGtleXNGdW5jKG9iamVjdCk7XG4gIHJldHVybiBpc0FycmF5KG9iamVjdCkgPyByZXN1bHQgOiBhcnJheVB1c2gocmVzdWx0LCBzeW1ib2xzRnVuYyhvYmplY3QpKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlR2V0QWxsS2V5cztcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///198\n")},function(module,exports,__webpack_require__){eval("var getNative = __webpack_require__(64),\n root = __webpack_require__(47);\n\n/* Built-in method references that are verified to be native. */\nvar Set = getNative(root, 'Set');\n\nmodule.exports = Set;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19TZXQuanM/Yzg2OSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxnQkFBZ0IsbUJBQU8sQ0FBQyxFQUFjO0FBQ3RDLFdBQVcsbUJBQU8sQ0FBQyxFQUFTOztBQUU1QjtBQUNBOztBQUVBIiwiZmlsZSI6IjE5OS5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBnZXROYXRpdmUgPSByZXF1aXJlKCcuL19nZXROYXRpdmUnKSxcbiAgICByb290ID0gcmVxdWlyZSgnLi9fcm9vdCcpO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB0aGF0IGFyZSB2ZXJpZmllZCB0byBiZSBuYXRpdmUuICovXG52YXIgU2V0ID0gZ2V0TmF0aXZlKHJvb3QsICdTZXQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBTZXQ7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///199\n")},function(module,exports,__webpack_require__){eval("var root = __webpack_require__(47);\n\n/** Built-in value references. */\nvar Uint8Array = root.Uint8Array;\n\nmodule.exports = Uint8Array;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19VaW50OEFycmF5LmpzPzI0NzQiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsV0FBVyxtQkFBTyxDQUFDLEVBQVM7O0FBRTVCO0FBQ0E7O0FBRUEiLCJmaWxlIjoiMjAwLmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIHJvb3QgPSByZXF1aXJlKCcuL19yb290Jyk7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIFVpbnQ4QXJyYXkgPSByb290LlVpbnQ4QXJyYXk7XG5cbm1vZHVsZS5leHBvcnRzID0gVWludDhBcnJheTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///200\n")},function(module,exports,__webpack_require__){eval("var cloneArrayBuffer = __webpack_require__(162);\n\n/**\n * Creates a clone of `typedArray`.\n *\n * @private\n * @param {Object} typedArray The typed array to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned typed array.\n */\nfunction cloneTypedArray(typedArray, isDeep) {\n var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;\n return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);\n}\n\nmodule.exports = cloneTypedArray;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jbG9uZVR5cGVkQXJyYXkuanM/YzhmZSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx1QkFBdUIsbUJBQU8sQ0FBQyxHQUFxQjs7QUFFcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsV0FBVyxRQUFRO0FBQ25CLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwiZmlsZSI6IjIwMS5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBjbG9uZUFycmF5QnVmZmVyID0gcmVxdWlyZSgnLi9fY2xvbmVBcnJheUJ1ZmZlcicpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBjbG9uZSBvZiBgdHlwZWRBcnJheWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSB0eXBlZEFycmF5IFRoZSB0eXBlZCBhcnJheSB0byBjbG9uZS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzRGVlcF0gU3BlY2lmeSBhIGRlZXAgY2xvbmUuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjbG9uZWQgdHlwZWQgYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIGNsb25lVHlwZWRBcnJheSh0eXBlZEFycmF5LCBpc0RlZXApIHtcbiAgdmFyIGJ1ZmZlciA9IGlzRGVlcCA/IGNsb25lQXJyYXlCdWZmZXIodHlwZWRBcnJheS5idWZmZXIpIDogdHlwZWRBcnJheS5idWZmZXI7XG4gIHJldHVybiBuZXcgdHlwZWRBcnJheS5jb25zdHJ1Y3RvcihidWZmZXIsIHR5cGVkQXJyYXkuYnl0ZU9mZnNldCwgdHlwZWRBcnJheS5sZW5ndGgpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNsb25lVHlwZWRBcnJheTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///201\n")},function(module,exports,__webpack_require__){eval("var baseCreate = __webpack_require__(203),\n getPrototype = __webpack_require__(109),\n isPrototype = __webpack_require__(108);\n\n/**\n * Initializes an object clone.\n *\n * @private\n * @param {Object} object The object to clone.\n * @returns {Object} Returns the initialized clone.\n */\nfunction initCloneObject(object) {\n return (typeof object.constructor == 'function' && !isPrototype(object))\n ? baseCreate(getPrototype(object))\n : {};\n}\n\nmodule.exports = initCloneObject;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19pbml0Q2xvbmVPYmplY3QuanM/ZmEyMSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxpQkFBaUIsbUJBQU8sQ0FBQyxHQUFlO0FBQ3hDLG1CQUFtQixtQkFBTyxDQUFDLEdBQWlCO0FBQzVDLGtCQUFrQixtQkFBTyxDQUFDLEdBQWdCOztBQUUxQztBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixhQUFhLE9BQU87QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwiZmlsZSI6IjIwMi5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBiYXNlQ3JlYXRlID0gcmVxdWlyZSgnLi9fYmFzZUNyZWF0ZScpLFxuICAgIGdldFByb3RvdHlwZSA9IHJlcXVpcmUoJy4vX2dldFByb3RvdHlwZScpLFxuICAgIGlzUHJvdG90eXBlID0gcmVxdWlyZSgnLi9faXNQcm90b3R5cGUnKTtcblxuLyoqXG4gKiBJbml0aWFsaXplcyBhbiBvYmplY3QgY2xvbmUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBjbG9uZS5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGluaXRpYWxpemVkIGNsb25lLlxuICovXG5mdW5jdGlvbiBpbml0Q2xvbmVPYmplY3Qob2JqZWN0KSB7XG4gIHJldHVybiAodHlwZW9mIG9iamVjdC5jb25zdHJ1Y3RvciA9PSAnZnVuY3Rpb24nICYmICFpc1Byb3RvdHlwZShvYmplY3QpKVxuICAgID8gYmFzZUNyZWF0ZShnZXRQcm90b3R5cGUob2JqZWN0KSlcbiAgICA6IHt9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGluaXRDbG9uZU9iamVjdDtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///202\n")},function(module,exports,__webpack_require__){eval("var isObject = __webpack_require__(43);\n\n/** Built-in value references. */\nvar objectCreate = Object.create;\n\n/**\n * The base implementation of `_.create` without support for assigning\n * properties to the created object.\n *\n * @private\n * @param {Object} proto The object to inherit from.\n * @returns {Object} Returns the new object.\n */\nvar baseCreate = (function() {\n function object() {}\n return function(proto) {\n if (!isObject(proto)) {\n return {};\n }\n if (objectCreate) {\n return objectCreate(proto);\n }\n object.prototype = proto;\n var result = new object;\n object.prototype = undefined;\n return result;\n };\n}());\n\nmodule.exports = baseCreate;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlQ3JlYXRlLmpzPzc1MzAiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsZUFBZSxtQkFBTyxDQUFDLEVBQVk7O0FBRW5DO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixhQUFhLE9BQU87QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRCIsImZpbGUiOiIyMDMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL2lzT2JqZWN0Jyk7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdENyZWF0ZSA9IE9iamVjdC5jcmVhdGU7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uY3JlYXRlYCB3aXRob3V0IHN1cHBvcnQgZm9yIGFzc2lnbmluZ1xuICogcHJvcGVydGllcyB0byB0aGUgY3JlYXRlZCBvYmplY3QuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBwcm90byBUaGUgb2JqZWN0IHRvIGluaGVyaXQgZnJvbS5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gKi9cbnZhciBiYXNlQ3JlYXRlID0gKGZ1bmN0aW9uKCkge1xuICBmdW5jdGlvbiBvYmplY3QoKSB7fVxuICByZXR1cm4gZnVuY3Rpb24ocHJvdG8pIHtcbiAgICBpZiAoIWlzT2JqZWN0KHByb3RvKSkge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgICBpZiAob2JqZWN0Q3JlYXRlKSB7XG4gICAgICByZXR1cm4gb2JqZWN0Q3JlYXRlKHByb3RvKTtcbiAgICB9XG4gICAgb2JqZWN0LnByb3RvdHlwZSA9IHByb3RvO1xuICAgIHZhciByZXN1bHQgPSBuZXcgb2JqZWN0O1xuICAgIG9iamVjdC5wcm90b3R5cGUgPSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbn0oKSk7XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUNyZWF0ZTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///203\n")},function(module,exports,__webpack_require__){eval("module.exports = __webpack_require__(205);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL2VhY2guanM/YzY0MSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxpQkFBaUIsbUJBQU8sQ0FBQyxHQUFXIiwiZmlsZSI6IjIwNC5qcyIsInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9mb3JFYWNoJyk7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///204\n")},function(module,exports,__webpack_require__){eval("var arrayEach = __webpack_require__(155),\n baseEach = __webpack_require__(110),\n castFunction = __webpack_require__(206),\n isArray = __webpack_require__(31);\n\n/**\n * Iterates over elements of `collection` and invokes `iteratee` for each element.\n * The iteratee is invoked with three arguments: (value, index|key, collection).\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * **Note:** As with other \"Collections\" methods, objects with a \"length\"\n * property are iterated like arrays. To avoid this behavior use `_.forIn`\n * or `_.forOwn` for object iteration.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @alias each\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n * @see _.forEachRight\n * @example\n *\n * _.forEach([1, 2], function(value) {\n * console.log(value);\n * });\n * // => Logs `1` then `2`.\n *\n * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {\n * console.log(key);\n * });\n * // => Logs 'a' then 'b' (iteration order is not guaranteed).\n */\nfunction forEach(collection, iteratee) {\n var func = isArray(collection) ? arrayEach : baseEach;\n return func(collection, castFunction(iteratee));\n}\n\nmodule.exports = forEach;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL2ZvckVhY2guanM/NmNkNCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxnQkFBZ0IsbUJBQU8sQ0FBQyxHQUFjO0FBQ3RDLGVBQWUsbUJBQU8sQ0FBQyxHQUFhO0FBQ3BDLG1CQUFtQixtQkFBTyxDQUFDLEdBQWlCO0FBQzVDLGNBQWMsbUJBQU8sQ0FBQyxFQUFXOztBQUVqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxhQUFhO0FBQ3hCLFdBQVcsU0FBUztBQUNwQixhQUFhLGFBQWE7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsY0FBYyxpQkFBaUI7QUFDL0I7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwiZmlsZSI6IjIwNS5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBhcnJheUVhY2ggPSByZXF1aXJlKCcuL19hcnJheUVhY2gnKSxcbiAgICBiYXNlRWFjaCA9IHJlcXVpcmUoJy4vX2Jhc2VFYWNoJyksXG4gICAgY2FzdEZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fY2FzdEZ1bmN0aW9uJyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpO1xuXG4vKipcbiAqIEl0ZXJhdGVzIG92ZXIgZWxlbWVudHMgb2YgYGNvbGxlY3Rpb25gIGFuZCBpbnZva2VzIGBpdGVyYXRlZWAgZm9yIGVhY2ggZWxlbWVudC5cbiAqIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gKiBJdGVyYXRlZSBmdW5jdGlvbnMgbWF5IGV4aXQgaXRlcmF0aW9uIGVhcmx5IGJ5IGV4cGxpY2l0bHkgcmV0dXJuaW5nIGBmYWxzZWAuXG4gKlxuICogKipOb3RlOioqIEFzIHdpdGggb3RoZXIgXCJDb2xsZWN0aW9uc1wiIG1ldGhvZHMsIG9iamVjdHMgd2l0aCBhIFwibGVuZ3RoXCJcbiAqIHByb3BlcnR5IGFyZSBpdGVyYXRlZCBsaWtlIGFycmF5cy4gVG8gYXZvaWQgdGhpcyBiZWhhdmlvciB1c2UgYF8uZm9ySW5gXG4gKiBvciBgXy5mb3JPd25gIGZvciBvYmplY3QgaXRlcmF0aW9uLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBhbGlhcyBlYWNoXG4gKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl8T2JqZWN0fSBSZXR1cm5zIGBjb2xsZWN0aW9uYC5cbiAqIEBzZWUgXy5mb3JFYWNoUmlnaHRcbiAqIEBleGFtcGxlXG4gKlxuICogXy5mb3JFYWNoKFsxLCAyXSwgZnVuY3Rpb24odmFsdWUpIHtcbiAqICAgY29uc29sZS5sb2codmFsdWUpO1xuICogfSk7XG4gKiAvLyA9PiBMb2dzIGAxYCB0aGVuIGAyYC5cbiAqXG4gKiBfLmZvckVhY2goeyAnYSc6IDEsICdiJzogMiB9LCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gKiAgIGNvbnNvbGUubG9nKGtleSk7XG4gKiB9KTtcbiAqIC8vID0+IExvZ3MgJ2EnIHRoZW4gJ2InIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpLlxuICovXG5mdW5jdGlvbiBmb3JFYWNoKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSB7XG4gIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5RWFjaCA6IGJhc2VFYWNoO1xuICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBjYXN0RnVuY3Rpb24oaXRlcmF0ZWUpKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmb3JFYWNoO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///205\n")},function(module,exports,__webpack_require__){eval("var identity = __webpack_require__(67);\n\n/**\n * Casts `value` to `identity` if it's not a function.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {Function} Returns cast function.\n */\nfunction castFunction(value) {\n return typeof value == 'function' ? value : identity;\n}\n\nmodule.exports = castFunction;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jYXN0RnVuY3Rpb24uanM/MTMwNCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxlQUFlLG1CQUFPLENBQUMsRUFBWTs7QUFFbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEVBQUU7QUFDYixhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJmaWxlIjoiMjA2LmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIGlkZW50aXR5ID0gcmVxdWlyZSgnLi9pZGVudGl0eScpO1xuXG4vKipcbiAqIENhc3RzIGB2YWx1ZWAgdG8gYGlkZW50aXR5YCBpZiBpdCdzIG5vdCBhIGZ1bmN0aW9uLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBpbnNwZWN0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGNhc3QgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGNhc3RGdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdmdW5jdGlvbicgPyB2YWx1ZSA6IGlkZW50aXR5O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNhc3RGdW5jdGlvbjtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///206\n")},function(module,exports,__webpack_require__){eval("var arrayFilter = __webpack_require__(194),\n baseFilter = __webpack_require__(378),\n baseIteratee = __webpack_require__(55),\n isArray = __webpack_require__(31);\n\n/**\n * Iterates over elements of `collection`, returning an array of all elements\n * `predicate` returns truthy for. The predicate is invoked with three\n * arguments: (value, index|key, collection).\n *\n * **Note:** Unlike `_.remove`, this method returns a new array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n * @see _.reject\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': true },\n * { 'user': 'fred', 'age': 40, 'active': false }\n * ];\n *\n * _.filter(users, function(o) { return !o.active; });\n * // => objects for ['fred']\n *\n * // The `_.matches` iteratee shorthand.\n * _.filter(users, { 'age': 36, 'active': true });\n * // => objects for ['barney']\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.filter(users, ['active', false]);\n * // => objects for ['fred']\n *\n * // The `_.property` iteratee shorthand.\n * _.filter(users, 'active');\n * // => objects for ['barney']\n *\n * // Combining several predicates using `_.overEvery` or `_.overSome`.\n * _.filter(users, _.overSome([{ 'age': 36 }, ['age', 40]]));\n * // => objects for ['fred', 'barney']\n */\nfunction filter(collection, predicate) {\n var func = isArray(collection) ? arrayFilter : baseFilter;\n return func(collection, baseIteratee(predicate, 3));\n}\n\nmodule.exports = filter;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL2ZpbHRlci5qcz85MzgwIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGtCQUFrQixtQkFBTyxDQUFDLEdBQWdCO0FBQzFDLGlCQUFpQixtQkFBTyxDQUFDLEdBQWU7QUFDeEMsbUJBQW1CLG1CQUFPLENBQUMsRUFBaUI7QUFDNUMsY0FBYyxtQkFBTyxDQUFDLEVBQVc7O0FBRWpDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLGFBQWE7QUFDeEIsV0FBVyxTQUFTO0FBQ3BCLGFBQWEsTUFBTTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU0sOENBQThDO0FBQ3BELE1BQU07QUFDTjtBQUNBO0FBQ0EsZ0NBQWdDLGtCQUFrQixFQUFFO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQiw0QkFBNEI7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyxZQUFZO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsImZpbGUiOiIyMDcuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYXJyYXlGaWx0ZXIgPSByZXF1aXJlKCcuL19hcnJheUZpbHRlcicpLFxuICAgIGJhc2VGaWx0ZXIgPSByZXF1aXJlKCcuL19iYXNlRmlsdGVyJyksXG4gICAgYmFzZUl0ZXJhdGVlID0gcmVxdWlyZSgnLi9fYmFzZUl0ZXJhdGVlJyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpO1xuXG4vKipcbiAqIEl0ZXJhdGVzIG92ZXIgZWxlbWVudHMgb2YgYGNvbGxlY3Rpb25gLCByZXR1cm5pbmcgYW4gYXJyYXkgb2YgYWxsIGVsZW1lbnRzXG4gKiBgcHJlZGljYXRlYCByZXR1cm5zIHRydXRoeSBmb3IuIFRoZSBwcmVkaWNhdGUgaXMgaW52b2tlZCB3aXRoIHRocmVlXG4gKiBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS5cbiAqXG4gKiAqKk5vdGU6KiogVW5saWtlIGBfLnJlbW92ZWAsIHRoaXMgbWV0aG9kIHJldHVybnMgYSBuZXcgYXJyYXkuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZpbHRlcmVkIGFycmF5LlxuICogQHNlZSBfLnJlamVjdFxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgdXNlcnMgPSBbXG4gKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM2LCAnYWN0aXZlJzogdHJ1ZSB9LFxuICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiA0MCwgJ2FjdGl2ZSc6IGZhbHNlIH1cbiAqIF07XG4gKlxuICogXy5maWx0ZXIodXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuICFvLmFjdGl2ZTsgfSk7XG4gKiAvLyA9PiBvYmplY3RzIGZvciBbJ2ZyZWQnXVxuICpcbiAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gKiBfLmZpbHRlcih1c2VycywgeyAnYWdlJzogMzYsICdhY3RpdmUnOiB0cnVlIH0pO1xuICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknXVxuICpcbiAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAqIF8uZmlsdGVyKHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gKiAvLyA9PiBvYmplY3RzIGZvciBbJ2ZyZWQnXVxuICpcbiAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICogXy5maWx0ZXIodXNlcnMsICdhY3RpdmUnKTtcbiAqIC8vID0+IG9iamVjdHMgZm9yIFsnYmFybmV5J11cbiAqXG4gKiAvLyBDb21iaW5pbmcgc2V2ZXJhbCBwcmVkaWNhdGVzIHVzaW5nIGBfLm92ZXJFdmVyeWAgb3IgYF8ub3ZlclNvbWVgLlxuICogXy5maWx0ZXIodXNlcnMsIF8ub3ZlclNvbWUoW3sgJ2FnZSc6IDM2IH0sIFsnYWdlJywgNDBdXSkpO1xuICogLy8gPT4gb2JqZWN0cyBmb3IgWydmcmVkJywgJ2Jhcm5leSddXG4gKi9cbmZ1bmN0aW9uIGZpbHRlcihjb2xsZWN0aW9uLCBwcmVkaWNhdGUpIHtcbiAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlGaWx0ZXIgOiBiYXNlRmlsdGVyO1xuICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBiYXNlSXRlcmF0ZWUocHJlZGljYXRlLCAzKSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZmlsdGVyO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///207\n")},function(module,exports,__webpack_require__){eval("var baseIsEqualDeep = __webpack_require__(381),\n isObjectLike = __webpack_require__(49);\n\n/**\n * The base implementation of `_.isEqual` which supports partial comparisons\n * and tracks traversed objects.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {boolean} bitmask The bitmask flags.\n * 1 - Unordered comparison\n * 2 - Partial comparison\n * @param {Function} [customizer] The function to customize comparisons.\n * @param {Object} [stack] Tracks traversed `value` and `other` objects.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n */\nfunction baseIsEqual(value, other, bitmask, customizer, stack) {\n if (value === other) {\n return true;\n }\n if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {\n return value !== value && other !== other;\n }\n return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);\n}\n\nmodule.exports = baseIsEqual;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlSXNFcXVhbC5qcz9jMDVmIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHNCQUFzQixtQkFBTyxDQUFDLEdBQW9CO0FBQ2xELG1CQUFtQixtQkFBTyxDQUFDLEVBQWdCOztBQUUzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxFQUFFO0FBQ2IsV0FBVyxFQUFFO0FBQ2IsV0FBVyxRQUFRO0FBQ25CO0FBQ0E7QUFDQSxXQUFXLFNBQVM7QUFDcEIsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsImZpbGUiOiIyMDguanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYmFzZUlzRXF1YWxEZWVwID0gcmVxdWlyZSgnLi9fYmFzZUlzRXF1YWxEZWVwJyksXG4gICAgaXNPYmplY3RMaWtlID0gcmVxdWlyZSgnLi9pc09iamVjdExpa2UnKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc0VxdWFsYCB3aGljaCBzdXBwb3J0cyBwYXJ0aWFsIGNvbXBhcmlzb25zXG4gKiBhbmQgdHJhY2tzIHRyYXZlcnNlZCBvYmplY3RzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy5cbiAqICAxIC0gVW5vcmRlcmVkIGNvbXBhcmlzb25cbiAqICAyIC0gUGFydGlhbCBjb21wYXJpc29uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpc29ucy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbc3RhY2tdIFRyYWNrcyB0cmF2ZXJzZWQgYHZhbHVlYCBhbmQgYG90aGVyYCBvYmplY3RzLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSB2YWx1ZXMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUlzRXF1YWwodmFsdWUsIG90aGVyLCBiaXRtYXNrLCBjdXN0b21pemVyLCBzdGFjaykge1xuICBpZiAodmFsdWUgPT09IG90aGVyKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKHZhbHVlID09IG51bGwgfHwgb3RoZXIgPT0gbnVsbCB8fCAoIWlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgIWlzT2JqZWN0TGlrZShvdGhlcikpKSB7XG4gICAgcmV0dXJuIHZhbHVlICE9PSB2YWx1ZSAmJiBvdGhlciAhPT0gb3RoZXI7XG4gIH1cbiAgcmV0dXJuIGJhc2VJc0VxdWFsRGVlcCh2YWx1ZSwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGJhc2VJc0VxdWFsLCBzdGFjayk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUlzRXF1YWw7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///208\n")},function(module,exports,__webpack_require__){eval("var SetCache = __webpack_require__(210),\n arraySome = __webpack_require__(384),\n cacheHas = __webpack_require__(211);\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * A specialized version of `baseIsEqualDeep` for arrays with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Array} array The array to compare.\n * @param {Array} other The other array to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `array` and `other` objects.\n * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n */\nfunction equalArrays(array, other, bitmask, customizer, equalFunc, stack) {\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n arrLength = array.length,\n othLength = other.length;\n\n if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\n return false;\n }\n // Check that cyclic values are equal.\n var arrStacked = stack.get(array);\n var othStacked = stack.get(other);\n if (arrStacked && othStacked) {\n return arrStacked == other && othStacked == array;\n }\n var index = -1,\n result = true,\n seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;\n\n stack.set(array, other);\n stack.set(other, array);\n\n // Ignore non-index properties.\n while (++index < arrLength) {\n var arrValue = array[index],\n othValue = other[index];\n\n if (customizer) {\n var compared = isPartial\n ? customizer(othValue, arrValue, index, other, array, stack)\n : customizer(arrValue, othValue, index, array, other, stack);\n }\n if (compared !== undefined) {\n if (compared) {\n continue;\n }\n result = false;\n break;\n }\n // Recursively compare arrays (susceptible to call stack limits).\n if (seen) {\n if (!arraySome(other, function(othValue, othIndex) {\n if (!cacheHas(seen, othIndex) &&\n (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {\n return seen.push(othIndex);\n }\n })) {\n result = false;\n break;\n }\n } else if (!(\n arrValue === othValue ||\n equalFunc(arrValue, othValue, bitmask, customizer, stack)\n )) {\n result = false;\n break;\n }\n }\n stack['delete'](array);\n stack['delete'](other);\n return result;\n}\n\nmodule.exports = equalArrays;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19lcXVhbEFycmF5cy5qcz9hMmJlIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGVBQWUsbUJBQU8sQ0FBQyxHQUFhO0FBQ3BDLGdCQUFnQixtQkFBTyxDQUFDLEdBQWM7QUFDdEMsZUFBZSxtQkFBTyxDQUFDLEdBQWE7O0FBRXBDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxNQUFNO0FBQ2pCLFdBQVcsTUFBTTtBQUNqQixXQUFXLE9BQU87QUFDbEIsV0FBVyxTQUFTO0FBQ3BCLFdBQVcsU0FBUztBQUNwQixXQUFXLE9BQU87QUFDbEIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJmaWxlIjoiMjA5LmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIFNldENhY2hlID0gcmVxdWlyZSgnLi9fU2V0Q2FjaGUnKSxcbiAgICBhcnJheVNvbWUgPSByZXF1aXJlKCcuL19hcnJheVNvbWUnKSxcbiAgICBjYWNoZUhhcyA9IHJlcXVpcmUoJy4vX2NhY2hlSGFzJyk7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIHZhbHVlIGNvbXBhcmlzb25zLiAqL1xudmFyIENPTVBBUkVfUEFSVElBTF9GTEFHID0gMSxcbiAgICBDT01QQVJFX1VOT1JERVJFRF9GTEFHID0gMjtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VJc0VxdWFsRGVlcGAgZm9yIGFycmF5cyB3aXRoIHN1cHBvcnQgZm9yXG4gKiBwYXJ0aWFsIGRlZXAgY29tcGFyaXNvbnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBjb21wYXJlLlxuICogQHBhcmFtIHtBcnJheX0gb3RoZXIgVGhlIG90aGVyIGFycmF5IHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBiYXNlSXNFcXVhbGAgZm9yIG1vcmUgZGV0YWlscy5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGN1c3RvbWl6ZXIgVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpc29ucy5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGVxdWFsRnVuYyBUaGUgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGVxdWl2YWxlbnRzIG9mIHZhbHVlcy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBzdGFjayBUcmFja3MgdHJhdmVyc2VkIGBhcnJheWAgYW5kIGBvdGhlcmAgb2JqZWN0cy5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgYXJyYXlzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGVxdWFsQXJyYXlzKGFycmF5LCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjaykge1xuICB2YXIgaXNQYXJ0aWFsID0gYml0bWFzayAmIENPTVBBUkVfUEFSVElBTF9GTEFHLFxuICAgICAgYXJyTGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgb3RoTGVuZ3RoID0gb3RoZXIubGVuZ3RoO1xuXG4gIGlmIChhcnJMZW5ndGggIT0gb3RoTGVuZ3RoICYmICEoaXNQYXJ0aWFsICYmIG90aExlbmd0aCA+IGFyckxlbmd0aCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLy8gQ2hlY2sgdGhhdCBjeWNsaWMgdmFsdWVzIGFyZSBlcXVhbC5cbiAgdmFyIGFyclN0YWNrZWQgPSBzdGFjay5nZXQoYXJyYXkpO1xuICB2YXIgb3RoU3RhY2tlZCA9IHN0YWNrLmdldChvdGhlcik7XG4gIGlmIChhcnJTdGFja2VkICYmIG90aFN0YWNrZWQpIHtcbiAgICByZXR1cm4gYXJyU3RhY2tlZCA9PSBvdGhlciAmJiBvdGhTdGFja2VkID09IGFycmF5O1xuICB9XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgcmVzdWx0ID0gdHJ1ZSxcbiAgICAgIHNlZW4gPSAoYml0bWFzayAmIENPTVBBUkVfVU5PUkRFUkVEX0ZMQUcpID8gbmV3IFNldENhY2hlIDogdW5kZWZpbmVkO1xuXG4gIHN0YWNrLnNldChhcnJheSwgb3RoZXIpO1xuICBzdGFjay5zZXQob3RoZXIsIGFycmF5KTtcblxuICAvLyBJZ25vcmUgbm9uLWluZGV4IHByb3BlcnRpZXMuXG4gIHdoaWxlICgrK2luZGV4IDwgYXJyTGVuZ3RoKSB7XG4gICAgdmFyIGFyclZhbHVlID0gYXJyYXlbaW5kZXhdLFxuICAgICAgICBvdGhWYWx1ZSA9IG90aGVyW2luZGV4XTtcblxuICAgIGlmIChjdXN0b21pemVyKSB7XG4gICAgICB2YXIgY29tcGFyZWQgPSBpc1BhcnRpYWxcbiAgICAgICAgPyBjdXN0b21pemVyKG90aFZhbHVlLCBhcnJWYWx1ZSwgaW5kZXgsIG90aGVyLCBhcnJheSwgc3RhY2spXG4gICAgICAgIDogY3VzdG9taXplcihhcnJWYWx1ZSwgb3RoVmFsdWUsIGluZGV4LCBhcnJheSwgb3RoZXIsIHN0YWNrKTtcbiAgICB9XG4gICAgaWYgKGNvbXBhcmVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChjb21wYXJlZCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdCA9IGZhbHNlO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIC8vIFJlY3Vyc2l2ZWx5IGNvbXBhcmUgYXJyYXlzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG4gICAgaWYgKHNlZW4pIHtcbiAgICAgIGlmICghYXJyYXlTb21lKG90aGVyLCBmdW5jdGlvbihvdGhWYWx1ZSwgb3RoSW5kZXgpIHtcbiAgICAgICAgICAgIGlmICghY2FjaGVIYXMoc2Vlbiwgb3RoSW5kZXgpICYmXG4gICAgICAgICAgICAgICAgKGFyclZhbHVlID09PSBvdGhWYWx1ZSB8fCBlcXVhbEZ1bmMoYXJyVmFsdWUsIG90aFZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBzdGFjaykpKSB7XG4gICAgICAgICAgICAgIHJldHVybiBzZWVuLnB1c2gob3RoSW5kZXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pKSB7XG4gICAgICAgIHJlc3VsdCA9IGZhbHNlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCEoXG4gICAgICAgICAgYXJyVmFsdWUgPT09IG90aFZhbHVlIHx8XG4gICAgICAgICAgICBlcXVhbEZ1bmMoYXJyVmFsdWUsIG90aFZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBzdGFjaylcbiAgICAgICAgKSkge1xuICAgICAgcmVzdWx0ID0gZmFsc2U7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgc3RhY2tbJ2RlbGV0ZSddKGFycmF5KTtcbiAgc3RhY2tbJ2RlbGV0ZSddKG90aGVyKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBlcXVhbEFycmF5cztcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///209\n")},function(module,exports,__webpack_require__){eval("var MapCache = __webpack_require__(154),\n setCacheAdd = __webpack_require__(382),\n setCacheHas = __webpack_require__(383);\n\n/**\n *\n * Creates an array cache object to store unique values.\n *\n * @private\n * @constructor\n * @param {Array} [values] The values to cache.\n */\nfunction SetCache(values) {\n var index = -1,\n length = values == null ? 0 : values.length;\n\n this.__data__ = new MapCache;\n while (++index < length) {\n this.add(values[index]);\n }\n}\n\n// Add methods to `SetCache`.\nSetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\nSetCache.prototype.has = setCacheHas;\n\nmodule.exports = SetCache;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19TZXRDYWNoZS5qcz9kNjEyIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGVBQWUsbUJBQU8sQ0FBQyxHQUFhO0FBQ3BDLGtCQUFrQixtQkFBTyxDQUFDLEdBQWdCO0FBQzFDLGtCQUFrQixtQkFBTyxDQUFDLEdBQWdCOztBQUUxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE1BQU07QUFDakI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEiLCJmaWxlIjoiMjEwLmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIE1hcENhY2hlID0gcmVxdWlyZSgnLi9fTWFwQ2FjaGUnKSxcbiAgICBzZXRDYWNoZUFkZCA9IHJlcXVpcmUoJy4vX3NldENhY2hlQWRkJyksXG4gICAgc2V0Q2FjaGVIYXMgPSByZXF1aXJlKCcuL19zZXRDYWNoZUhhcycpO1xuXG4vKipcbiAqXG4gKiBDcmVhdGVzIGFuIGFycmF5IGNhY2hlIG9iamVjdCB0byBzdG9yZSB1bmlxdWUgdmFsdWVzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7QXJyYXl9IFt2YWx1ZXNdIFRoZSB2YWx1ZXMgdG8gY2FjaGUuXG4gKi9cbmZ1bmN0aW9uIFNldENhY2hlKHZhbHVlcykge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IHZhbHVlcyA9PSBudWxsID8gMCA6IHZhbHVlcy5sZW5ndGg7XG5cbiAgdGhpcy5fX2RhdGFfXyA9IG5ldyBNYXBDYWNoZTtcbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB0aGlzLmFkZCh2YWx1ZXNbaW5kZXhdKTtcbiAgfVxufVxuXG4vLyBBZGQgbWV0aG9kcyB0byBgU2V0Q2FjaGVgLlxuU2V0Q2FjaGUucHJvdG90eXBlLmFkZCA9IFNldENhY2hlLnByb3RvdHlwZS5wdXNoID0gc2V0Q2FjaGVBZGQ7XG5TZXRDYWNoZS5wcm90b3R5cGUuaGFzID0gc2V0Q2FjaGVIYXM7XG5cbm1vZHVsZS5leHBvcnRzID0gU2V0Q2FjaGU7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///210\n")},function(module,exports){eval("/**\n * Checks if a `cache` value for `key` exists.\n *\n * @private\n * @param {Object} cache The cache to query.\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction cacheHas(cache, key) {\n return cache.has(key);\n}\n\nmodule.exports = cacheHas;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jYWNoZUhhcy5qcz9jNTg0Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJmaWxlIjoiMjExLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDaGVja3MgaWYgYSBgY2FjaGVgIHZhbHVlIGZvciBga2V5YCBleGlzdHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBjYWNoZSBUaGUgY2FjaGUgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gY2FjaGVIYXMoY2FjaGUsIGtleSkge1xuICByZXR1cm4gY2FjaGUuaGFzKGtleSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY2FjaGVIYXM7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///211\n")},function(module,exports,__webpack_require__){eval("var isObject = __webpack_require__(43);\n\n/**\n * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` if suitable for strict\n * equality comparisons, else `false`.\n */\nfunction isStrictComparable(value) {\n return value === value && !isObject(value);\n}\n\nmodule.exports = isStrictComparable;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19pc1N0cmljdENvbXBhcmFibGUuanM/MDhjYyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxlQUFlLG1CQUFPLENBQUMsRUFBWTs7QUFFbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEVBQUU7QUFDYixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsImZpbGUiOiIyMTIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL2lzT2JqZWN0Jyk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgc3VpdGFibGUgZm9yIHN0cmljdCBlcXVhbGl0eSBjb21wYXJpc29ucywgaS5lLiBgPT09YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpZiBzdWl0YWJsZSBmb3Igc3RyaWN0XG4gKiAgZXF1YWxpdHkgY29tcGFyaXNvbnMsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaXNTdHJpY3RDb21wYXJhYmxlKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA9PT0gdmFsdWUgJiYgIWlzT2JqZWN0KHZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc1N0cmljdENvbXBhcmFibGU7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///212\n")},function(module,exports){eval("/**\n * A specialized version of `matchesProperty` for source values suitable\n * for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction matchesStrictComparable(key, srcValue) {\n return function(object) {\n if (object == null) {\n return false;\n }\n return object[key] === srcValue &&\n (srcValue !== undefined || (key in Object(object)));\n };\n}\n\nmodule.exports = matchesStrictComparable;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19tYXRjaGVzU3RyaWN0Q29tcGFyYWJsZS5qcz8yMGVjIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsV0FBVyxFQUFFO0FBQ2IsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwiZmlsZSI6IjIxMy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBtYXRjaGVzUHJvcGVydHlgIGZvciBzb3VyY2UgdmFsdWVzIHN1aXRhYmxlXG4gKiBmb3Igc3RyaWN0IGVxdWFsaXR5IGNvbXBhcmlzb25zLCBpLmUuIGA9PT1gLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAqIEBwYXJhbSB7Kn0gc3JjVmFsdWUgVGhlIHZhbHVlIHRvIG1hdGNoLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgc3BlYyBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gbWF0Y2hlc1N0cmljdENvbXBhcmFibGUoa2V5LCBzcmNWYWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgaWYgKG9iamVjdCA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBvYmplY3Rba2V5XSA9PT0gc3JjVmFsdWUgJiZcbiAgICAgIChzcmNWYWx1ZSAhPT0gdW5kZWZpbmVkIHx8IChrZXkgaW4gT2JqZWN0KG9iamVjdCkpKTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtYXRjaGVzU3RyaWN0Q29tcGFyYWJsZTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///213\n")},function(module,exports,__webpack_require__){eval("var baseToString = __webpack_require__(394);\n\n/**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\nfunction toString(value) {\n return value == null ? '' : baseToString(value);\n}\n\nmodule.exports = toString;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL3RvU3RyaW5nLmpzPzc2ZGQiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsbUJBQW1CLG1CQUFPLENBQUMsR0FBaUI7O0FBRTVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEVBQUU7QUFDYixhQUFhLE9BQU87QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsImZpbGUiOiIyMTQuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYmFzZVRvU3RyaW5nID0gcmVxdWlyZSgnLi9fYmFzZVRvU3RyaW5nJyk7XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhIHN0cmluZy4gQW4gZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkIGZvciBgbnVsbGBcbiAqIGFuZCBgdW5kZWZpbmVkYCB2YWx1ZXMuIFRoZSBzaWduIG9mIGAtMGAgaXMgcHJlc2VydmVkLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY29udmVydGVkIHN0cmluZy5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50b1N0cmluZyhudWxsKTtcbiAqIC8vID0+ICcnXG4gKlxuICogXy50b1N0cmluZygtMCk7XG4gKiAvLyA9PiAnLTAnXG4gKlxuICogXy50b1N0cmluZyhbMSwgMiwgM10pO1xuICogLy8gPT4gJzEsMiwzJ1xuICovXG5mdW5jdGlvbiB0b1N0cmluZyh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgPT0gbnVsbCA/ICcnIDogYmFzZVRvU3RyaW5nKHZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB0b1N0cmluZztcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///214\n")},function(module,exports,__webpack_require__){eval("var baseHasIn = __webpack_require__(395),\n hasPath = __webpack_require__(216);\n\n/**\n * Checks if `path` is a direct or inherited property of `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n * @example\n *\n * var object = _.create({ 'a': _.create({ 'b': 2 }) });\n *\n * _.hasIn(object, 'a');\n * // => true\n *\n * _.hasIn(object, 'a.b');\n * // => true\n *\n * _.hasIn(object, ['a', 'b']);\n * // => true\n *\n * _.hasIn(object, 'b');\n * // => false\n */\nfunction hasIn(object, path) {\n return object != null && hasPath(object, path, baseHasIn);\n}\n\nmodule.exports = hasIn;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL2hhc0luLmpzPzg2MDQiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsZ0JBQWdCLG1CQUFPLENBQUMsR0FBYztBQUN0QyxjQUFjLG1CQUFPLENBQUMsR0FBWTs7QUFFbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsV0FBVyxhQUFhO0FBQ3hCLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0EsMEJBQTBCLGdCQUFnQixTQUFTLEdBQUc7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJmaWxlIjoiMjE1LmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIGJhc2VIYXNJbiA9IHJlcXVpcmUoJy4vX2Jhc2VIYXNJbicpLFxuICAgIGhhc1BhdGggPSByZXF1aXJlKCcuL19oYXNQYXRoJyk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGBwYXRoYCBpcyBhIGRpcmVjdCBvciBpbmhlcml0ZWQgcHJvcGVydHkgb2YgYG9iamVjdGAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHBhdGhgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0ID0gXy5jcmVhdGUoeyAnYSc6IF8uY3JlYXRlKHsgJ2InOiAyIH0pIH0pO1xuICpcbiAqIF8uaGFzSW4ob2JqZWN0LCAnYScpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaGFzSW4ob2JqZWN0LCAnYS5iJyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5oYXNJbihvYmplY3QsIFsnYScsICdiJ10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaGFzSW4ob2JqZWN0LCAnYicpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaGFzSW4ob2JqZWN0LCBwYXRoKSB7XG4gIHJldHVybiBvYmplY3QgIT0gbnVsbCAmJiBoYXNQYXRoKG9iamVjdCwgcGF0aCwgYmFzZUhhc0luKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBoYXNJbjtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///215\n")},function(module,exports,__webpack_require__){eval("var castPath = __webpack_require__(112),\n isArguments = __webpack_require__(88),\n isArray = __webpack_require__(31),\n isIndex = __webpack_require__(106),\n isLength = __webpack_require__(157),\n toKey = __webpack_require__(90);\n\n/**\n * Checks if `path` exists on `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @param {Function} hasFunc The function to check properties.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n */\nfunction hasPath(object, path, hasFunc) {\n path = castPath(path, object);\n\n var index = -1,\n length = path.length,\n result = false;\n\n while (++index < length) {\n var key = toKey(path[index]);\n if (!(result = object != null && hasFunc(object, key))) {\n break;\n }\n object = object[key];\n }\n if (result || ++index != length) {\n return result;\n }\n length = object == null ? 0 : object.length;\n return !!length && isLength(length) && isIndex(key, length) &&\n (isArray(object) || isArguments(object));\n}\n\nmodule.exports = hasPath;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19oYXNQYXRoLmpzP2UyYzAiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsZUFBZSxtQkFBTyxDQUFDLEdBQWE7QUFDcEMsa0JBQWtCLG1CQUFPLENBQUMsRUFBZTtBQUN6QyxjQUFjLG1CQUFPLENBQUMsRUFBVztBQUNqQyxjQUFjLG1CQUFPLENBQUMsR0FBWTtBQUNsQyxlQUFlLG1CQUFPLENBQUMsR0FBWTtBQUNuQyxZQUFZLG1CQUFPLENBQUMsRUFBVTs7QUFFOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsV0FBVyxhQUFhO0FBQ3hCLFdBQVcsU0FBUztBQUNwQixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwiZmlsZSI6IjIxNi5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBjYXN0UGF0aCA9IHJlcXVpcmUoJy4vX2Nhc3RQYXRoJyksXG4gICAgaXNBcmd1bWVudHMgPSByZXF1aXJlKCcuL2lzQXJndW1lbnRzJyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpLFxuICAgIGlzSW5kZXggPSByZXF1aXJlKCcuL19pc0luZGV4JyksXG4gICAgaXNMZW5ndGggPSByZXF1aXJlKCcuL2lzTGVuZ3RoJyksXG4gICAgdG9LZXkgPSByZXF1aXJlKCcuL190b0tleScpO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgcGF0aGAgZXhpc3RzIG9uIGBvYmplY3RgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCB0byBjaGVjay5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGhhc0Z1bmMgVGhlIGZ1bmN0aW9uIHRvIGNoZWNrIHByb3BlcnRpZXMuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHBhdGhgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBoYXNQYXRoKG9iamVjdCwgcGF0aCwgaGFzRnVuYykge1xuICBwYXRoID0gY2FzdFBhdGgocGF0aCwgb2JqZWN0KTtcblxuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IHBhdGgubGVuZ3RoLFxuICAgICAgcmVzdWx0ID0gZmFsc2U7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIga2V5ID0gdG9LZXkocGF0aFtpbmRleF0pO1xuICAgIGlmICghKHJlc3VsdCA9IG9iamVjdCAhPSBudWxsICYmIGhhc0Z1bmMob2JqZWN0LCBrZXkpKSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIG9iamVjdCA9IG9iamVjdFtrZXldO1xuICB9XG4gIGlmIChyZXN1bHQgfHwgKytpbmRleCAhPSBsZW5ndGgpIHtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIGxlbmd0aCA9IG9iamVjdCA9PSBudWxsID8gMCA6IG9iamVjdC5sZW5ndGg7XG4gIHJldHVybiAhIWxlbmd0aCAmJiBpc0xlbmd0aChsZW5ndGgpICYmIGlzSW5kZXgoa2V5LCBsZW5ndGgpICYmXG4gICAgKGlzQXJyYXkob2JqZWN0KSB8fCBpc0FyZ3VtZW50cyhvYmplY3QpKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBoYXNQYXRoO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///216\n")},function(module,exports){eval("/**\n * The base implementation of `_.property` without support for deep paths.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction baseProperty(key) {\n return function(object) {\n return object == null ? undefined : object[key];\n };\n}\n\nmodule.exports = baseProperty;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlUHJvcGVydHkuanM/ZWY1ZCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwiZmlsZSI6IjIxNy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucHJvcGVydHlgIHdpdGhvdXQgc3VwcG9ydCBmb3IgZGVlcCBwYXRocy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBhY2Nlc3NvciBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gYmFzZVByb3BlcnR5KGtleSkge1xuICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gdW5kZWZpbmVkIDogb2JqZWN0W2tleV07XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVByb3BlcnR5O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///217\n")},function(module,exports,__webpack_require__){eval("var baseHas = __webpack_require__(398),\n hasPath = __webpack_require__(216);\n\n/**\n * Checks if `path` is a direct property of `object`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n * @example\n *\n * var object = { 'a': { 'b': 2 } };\n * var other = _.create({ 'a': _.create({ 'b': 2 }) });\n *\n * _.has(object, 'a');\n * // => true\n *\n * _.has(object, 'a.b');\n * // => true\n *\n * _.has(object, ['a', 'b']);\n * // => true\n *\n * _.has(other, 'a');\n * // => false\n */\nfunction has(object, path) {\n return object != null && hasPath(object, path, baseHas);\n}\n\nmodule.exports = has;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL2hhcy5qcz8zODUyIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsbUJBQU8sQ0FBQyxHQUFZO0FBQ2xDLGNBQWMsbUJBQU8sQ0FBQyxHQUFZOztBQUVsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixXQUFXLGFBQWE7QUFDeEIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQSxpQkFBaUIsT0FBTyxTQUFTO0FBQ2pDLHlCQUF5QixnQkFBZ0IsU0FBUyxHQUFHO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwiZmlsZSI6IjIxOC5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBiYXNlSGFzID0gcmVxdWlyZSgnLi9fYmFzZUhhcycpLFxuICAgIGhhc1BhdGggPSByZXF1aXJlKCcuL19oYXNQYXRoJyk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGBwYXRoYCBpcyBhIGRpcmVjdCBwcm9wZXJ0eSBvZiBgb2JqZWN0YC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgcGF0aGAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3QgPSB7ICdhJzogeyAnYic6IDIgfSB9O1xuICogdmFyIG90aGVyID0gXy5jcmVhdGUoeyAnYSc6IF8uY3JlYXRlKHsgJ2InOiAyIH0pIH0pO1xuICpcbiAqIF8uaGFzKG9iamVjdCwgJ2EnKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmhhcyhvYmplY3QsICdhLmInKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmhhcyhvYmplY3QsIFsnYScsICdiJ10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaGFzKG90aGVyLCAnYScpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaGFzKG9iamVjdCwgcGF0aCkge1xuICByZXR1cm4gb2JqZWN0ICE9IG51bGwgJiYgaGFzUGF0aChvYmplY3QsIHBhdGgsIGJhc2VIYXMpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGhhcztcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///218\n")},function(module,exports){eval("/**\n * Checks if `value` is `undefined`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.\n * @example\n *\n * _.isUndefined(void 0);\n * // => true\n *\n * _.isUndefined(null);\n * // => false\n */\nfunction isUndefined(value) {\n return value === undefined;\n}\n\nmodule.exports = isUndefined;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzVW5kZWZpbmVkLmpzPzRjZmUiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEVBQUU7QUFDYixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsImZpbGUiOiIyMTkuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGB1bmRlZmluZWRgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBzaW5jZSAwLjEuMFxuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGB1bmRlZmluZWRgLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNVbmRlZmluZWQodm9pZCAwKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzVW5kZWZpbmVkKG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNVbmRlZmluZWQodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNVbmRlZmluZWQ7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///219\n")},function(module,exports,__webpack_require__){eval("var arrayMap = __webpack_require__(113),\n baseIteratee = __webpack_require__(55),\n baseMap = __webpack_require__(221),\n isArray = __webpack_require__(31);\n\n/**\n * Creates an array of values by running each element in `collection` thru\n * `iteratee`. The iteratee is invoked with three arguments:\n * (value, index|key, collection).\n *\n * Many lodash methods are guarded to work as iteratees for methods like\n * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.\n *\n * The guarded methods are:\n * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,\n * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,\n * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,\n * `template`, `trim`, `trimEnd`, `trimStart`, and `words`\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n * @example\n *\n * function square(n) {\n * return n * n;\n * }\n *\n * _.map([4, 8], square);\n * // => [16, 64]\n *\n * _.map({ 'a': 4, 'b': 8 }, square);\n * // => [16, 64] (iteration order is not guaranteed)\n *\n * var users = [\n * { 'user': 'barney' },\n * { 'user': 'fred' }\n * ];\n *\n * // The `_.property` iteratee shorthand.\n * _.map(users, 'user');\n * // => ['barney', 'fred']\n */\nfunction map(collection, iteratee) {\n var func = isArray(collection) ? arrayMap : baseMap;\n return func(collection, baseIteratee(iteratee, 3));\n}\n\nmodule.exports = map;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL21hcC5qcz9kZDYxIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGVBQWUsbUJBQU8sQ0FBQyxHQUFhO0FBQ3BDLG1CQUFtQixtQkFBTyxDQUFDLEVBQWlCO0FBQzVDLGNBQWMsbUJBQU8sQ0FBQyxHQUFZO0FBQ2xDLGNBQWMsbUJBQU8sQ0FBQyxFQUFXOztBQUVqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLGFBQWE7QUFDeEIsV0FBVyxTQUFTO0FBQ3BCLGFBQWEsTUFBTTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLGlCQUFpQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQSxNQUFNLG1CQUFtQjtBQUN6QixNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJmaWxlIjoiMjIwLmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIGFycmF5TWFwID0gcmVxdWlyZSgnLi9fYXJyYXlNYXAnKSxcbiAgICBiYXNlSXRlcmF0ZWUgPSByZXF1aXJlKCcuL19iYXNlSXRlcmF0ZWUnKSxcbiAgICBiYXNlTWFwID0gcmVxdWlyZSgnLi9fYmFzZU1hcCcpLFxuICAgIGlzQXJyYXkgPSByZXF1aXJlKCcuL2lzQXJyYXknKTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIHZhbHVlcyBieSBydW5uaW5nIGVhY2ggZWxlbWVudCBpbiBgY29sbGVjdGlvbmAgdGhydVxuICogYGl0ZXJhdGVlYC4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6XG4gKiAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gKlxuICogTWFueSBsb2Rhc2ggbWV0aG9kcyBhcmUgZ3VhcmRlZCB0byB3b3JrIGFzIGl0ZXJhdGVlcyBmb3IgbWV0aG9kcyBsaWtlXG4gKiBgXy5ldmVyeWAsIGBfLmZpbHRlcmAsIGBfLm1hcGAsIGBfLm1hcFZhbHVlc2AsIGBfLnJlamVjdGAsIGFuZCBgXy5zb21lYC5cbiAqXG4gKiBUaGUgZ3VhcmRlZCBtZXRob2RzIGFyZTpcbiAqIGBhcnlgLCBgY2h1bmtgLCBgY3VycnlgLCBgY3VycnlSaWdodGAsIGBkcm9wYCwgYGRyb3BSaWdodGAsIGBldmVyeWAsXG4gKiBgZmlsbGAsIGBpbnZlcnRgLCBgcGFyc2VJbnRgLCBgcmFuZG9tYCwgYHJhbmdlYCwgYHJhbmdlUmlnaHRgLCBgcmVwZWF0YCxcbiAqIGBzYW1wbGVTaXplYCwgYHNsaWNlYCwgYHNvbWVgLCBgc29ydEJ5YCwgYHNwbGl0YCwgYHRha2VgLCBgdGFrZVJpZ2h0YCxcbiAqIGB0ZW1wbGF0ZWAsIGB0cmltYCwgYHRyaW1FbmRgLCBgdHJpbVN0YXJ0YCwgYW5kIGB3b3Jkc2BcbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBtYXBwZWQgYXJyYXkuXG4gKiBAZXhhbXBsZVxuICpcbiAqIGZ1bmN0aW9uIHNxdWFyZShuKSB7XG4gKiAgIHJldHVybiBuICogbjtcbiAqIH1cbiAqXG4gKiBfLm1hcChbNCwgOF0sIHNxdWFyZSk7XG4gKiAvLyA9PiBbMTYsIDY0XVxuICpcbiAqIF8ubWFwKHsgJ2EnOiA0LCAnYic6IDggfSwgc3F1YXJlKTtcbiAqIC8vID0+IFsxNiwgNjRdIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gKlxuICogdmFyIHVzZXJzID0gW1xuICogICB7ICd1c2VyJzogJ2Jhcm5leScgfSxcbiAqICAgeyAndXNlcic6ICdmcmVkJyB9XG4gKiBdO1xuICpcbiAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICogXy5tYXAodXNlcnMsICd1c2VyJyk7XG4gKiAvLyA9PiBbJ2Jhcm5leScsICdmcmVkJ11cbiAqL1xuZnVuY3Rpb24gbWFwKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSB7XG4gIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5TWFwIDogYmFzZU1hcDtcbiAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbiwgYmFzZUl0ZXJhdGVlKGl0ZXJhdGVlLCAzKSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWFwO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///220\n")},function(module,exports,__webpack_require__){eval("var baseEach = __webpack_require__(110),\n isArrayLike = __webpack_require__(54);\n\n/**\n * The base implementation of `_.map` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction baseMap(collection, iteratee) {\n var index = -1,\n result = isArrayLike(collection) ? Array(collection.length) : [];\n\n baseEach(collection, function(value, key, collection) {\n result[++index] = iteratee(value, key, collection);\n });\n return result;\n}\n\nmodule.exports = baseMap;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlTWFwLmpzPzk3ZDMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsZUFBZSxtQkFBTyxDQUFDLEdBQWE7QUFDcEMsa0JBQWtCLG1CQUFPLENBQUMsRUFBZTs7QUFFekM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLGFBQWE7QUFDeEIsV0FBVyxTQUFTO0FBQ3BCLGFBQWEsTUFBTTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUEiLCJmaWxlIjoiMjIxLmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIGJhc2VFYWNoID0gcmVxdWlyZSgnLi9fYmFzZUVhY2gnKSxcbiAgICBpc0FycmF5TGlrZSA9IHJlcXVpcmUoJy4vaXNBcnJheUxpa2UnKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5tYXBgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IG1hcHBlZCBhcnJheS5cbiAqL1xuZnVuY3Rpb24gYmFzZU1hcChjb2xsZWN0aW9uLCBpdGVyYXRlZSkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIHJlc3VsdCA9IGlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pID8gQXJyYXkoY29sbGVjdGlvbi5sZW5ndGgpIDogW107XG5cbiAgYmFzZUVhY2goY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUsIGtleSwgY29sbGVjdGlvbikge1xuICAgIHJlc3VsdFsrK2luZGV4XSA9IGl0ZXJhdGVlKHZhbHVlLCBrZXksIGNvbGxlY3Rpb24pO1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlTWFwO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///221\n")},function(module,exports,__webpack_require__){eval("var arrayReduce = __webpack_require__(400),\n baseEach = __webpack_require__(110),\n baseIteratee = __webpack_require__(55),\n baseReduce = __webpack_require__(401),\n isArray = __webpack_require__(31);\n\n/**\n * Reduces `collection` to a value which is the accumulated result of running\n * each element in `collection` thru `iteratee`, where each successive\n * invocation is supplied the return value of the previous. If `accumulator`\n * is not given, the first element of `collection` is used as the initial\n * value. The iteratee is invoked with four arguments:\n * (accumulator, value, index|key, collection).\n *\n * Many lodash methods are guarded to work as iteratees for methods like\n * `_.reduce`, `_.reduceRight`, and `_.transform`.\n *\n * The guarded methods are:\n * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,\n * and `sortBy`\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @returns {*} Returns the accumulated value.\n * @see _.reduceRight\n * @example\n *\n * _.reduce([1, 2], function(sum, n) {\n * return sum + n;\n * }, 0);\n * // => 3\n *\n * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {\n * (result[value] || (result[value] = [])).push(key);\n * return result;\n * }, {});\n * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)\n */\nfunction reduce(collection, iteratee, accumulator) {\n var func = isArray(collection) ? arrayReduce : baseReduce,\n initAccum = arguments.length < 3;\n\n return func(collection, baseIteratee(iteratee, 4), accumulator, initAccum, baseEach);\n}\n\nmodule.exports = reduce;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL3JlZHVjZS5qcz9jNWEyIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGtCQUFrQixtQkFBTyxDQUFDLEdBQWdCO0FBQzFDLGVBQWUsbUJBQU8sQ0FBQyxHQUFhO0FBQ3BDLG1CQUFtQixtQkFBTyxDQUFDLEVBQWlCO0FBQzVDLGlCQUFpQixtQkFBTyxDQUFDLEdBQWU7QUFDeEMsY0FBYyxtQkFBTyxDQUFDLEVBQVc7O0FBRWpDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxhQUFhO0FBQ3hCLFdBQVcsU0FBUztBQUNwQixXQUFXLEVBQUU7QUFDYixhQUFhLEVBQUU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxhQUFhLHlCQUF5QjtBQUN0QztBQUNBO0FBQ0EsSUFBSSxJQUFJO0FBQ1IsVUFBVSw4QkFBOEI7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSIsImZpbGUiOiIyMjIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYXJyYXlSZWR1Y2UgPSByZXF1aXJlKCcuL19hcnJheVJlZHVjZScpLFxuICAgIGJhc2VFYWNoID0gcmVxdWlyZSgnLi9fYmFzZUVhY2gnKSxcbiAgICBiYXNlSXRlcmF0ZWUgPSByZXF1aXJlKCcuL19iYXNlSXRlcmF0ZWUnKSxcbiAgICBiYXNlUmVkdWNlID0gcmVxdWlyZSgnLi9fYmFzZVJlZHVjZScpLFxuICAgIGlzQXJyYXkgPSByZXF1aXJlKCcuL2lzQXJyYXknKTtcblxuLyoqXG4gKiBSZWR1Y2VzIGBjb2xsZWN0aW9uYCB0byBhIHZhbHVlIHdoaWNoIGlzIHRoZSBhY2N1bXVsYXRlZCByZXN1bHQgb2YgcnVubmluZ1xuICogZWFjaCBlbGVtZW50IGluIGBjb2xsZWN0aW9uYCB0aHJ1IGBpdGVyYXRlZWAsIHdoZXJlIGVhY2ggc3VjY2Vzc2l2ZVxuICogaW52b2NhdGlvbiBpcyBzdXBwbGllZCB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBwcmV2aW91cy4gSWYgYGFjY3VtdWxhdG9yYFxuICogaXMgbm90IGdpdmVuLCB0aGUgZmlyc3QgZWxlbWVudCBvZiBgY29sbGVjdGlvbmAgaXMgdXNlZCBhcyB0aGUgaW5pdGlhbFxuICogdmFsdWUuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggZm91ciBhcmd1bWVudHM6XG4gKiAoYWNjdW11bGF0b3IsIHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLlxuICpcbiAqIE1hbnkgbG9kYXNoIG1ldGhvZHMgYXJlIGd1YXJkZWQgdG8gd29yayBhcyBpdGVyYXRlZXMgZm9yIG1ldGhvZHMgbGlrZVxuICogYF8ucmVkdWNlYCwgYF8ucmVkdWNlUmlnaHRgLCBhbmQgYF8udHJhbnNmb3JtYC5cbiAqXG4gKiBUaGUgZ3VhcmRlZCBtZXRob2RzIGFyZTpcbiAqIGBhc3NpZ25gLCBgZGVmYXVsdHNgLCBgZGVmYXVsdHNEZWVwYCwgYGluY2x1ZGVzYCwgYG1lcmdlYCwgYG9yZGVyQnlgLFxuICogYW5kIGBzb3J0QnlgXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHBhcmFtIHsqfSBbYWNjdW11bGF0b3JdIFRoZSBpbml0aWFsIHZhbHVlLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLlxuICogQHNlZSBfLnJlZHVjZVJpZ2h0XG4gKiBAZXhhbXBsZVxuICpcbiAqIF8ucmVkdWNlKFsxLCAyXSwgZnVuY3Rpb24oc3VtLCBuKSB7XG4gKiAgIHJldHVybiBzdW0gKyBuO1xuICogfSwgMCk7XG4gKiAvLyA9PiAzXG4gKlxuICogXy5yZWR1Y2UoeyAnYSc6IDEsICdiJzogMiwgJ2MnOiAxIH0sIGZ1bmN0aW9uKHJlc3VsdCwgdmFsdWUsIGtleSkge1xuICogICAocmVzdWx0W3ZhbHVlXSB8fCAocmVzdWx0W3ZhbHVlXSA9IFtdKSkucHVzaChrZXkpO1xuICogICByZXR1cm4gcmVzdWx0O1xuICogfSwge30pO1xuICogLy8gPT4geyAnMSc6IFsnYScsICdjJ10sICcyJzogWydiJ10gfSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICovXG5mdW5jdGlvbiByZWR1Y2UoY29sbGVjdGlvbiwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yKSB7XG4gIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5UmVkdWNlIDogYmFzZVJlZHVjZSxcbiAgICAgIGluaXRBY2N1bSA9IGFyZ3VtZW50cy5sZW5ndGggPCAzO1xuXG4gIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIGJhc2VJdGVyYXRlZShpdGVyYXRlZSwgNCksIGFjY3VtdWxhdG9yLCBpbml0QWNjdW0sIGJhc2VFYWNoKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSByZWR1Y2U7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///222\n")},function(module,exports,__webpack_require__){eval("var apply = __webpack_require__(411);\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * A specialized version of `baseRest` which transforms the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @param {Function} transform The rest array transform.\n * @returns {Function} Returns the new function.\n */\nfunction overRest(func, start, transform) {\n start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n return function() {\n var args = arguments,\n index = -1,\n length = nativeMax(args.length - start, 0),\n array = Array(length);\n\n while (++index < length) {\n array[index] = args[start + index];\n }\n index = -1;\n var otherArgs = Array(start + 1);\n while (++index < start) {\n otherArgs[index] = args[index];\n }\n otherArgs[start] = transform(array);\n return apply(func, this, otherArgs);\n };\n}\n\nmodule.exports = overRest;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19vdmVyUmVzdC5qcz8yMjg2Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVksbUJBQU8sQ0FBQyxHQUFVOztBQUU5QjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxTQUFTO0FBQ3BCLFdBQVcsT0FBTztBQUNsQixXQUFXLFNBQVM7QUFDcEIsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwiZmlsZSI6IjIyMy5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBhcHBseSA9IHJlcXVpcmUoJy4vX2FwcGx5Jyk7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVNYXggPSBNYXRoLm1heDtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VSZXN0YCB3aGljaCB0cmFuc2Zvcm1zIHRoZSByZXN0IGFycmF5LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBhcHBseSBhIHJlc3QgcGFyYW1ldGVyIHRvLlxuICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD1mdW5jLmxlbmd0aC0xXSBUaGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIHJlc3QgcGFyYW1ldGVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gdHJhbnNmb3JtIFRoZSByZXN0IGFycmF5IHRyYW5zZm9ybS5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBvdmVyUmVzdChmdW5jLCBzdGFydCwgdHJhbnNmb3JtKSB7XG4gIHN0YXJ0ID0gbmF0aXZlTWF4KHN0YXJ0ID09PSB1bmRlZmluZWQgPyAoZnVuYy5sZW5ndGggLSAxKSA6IHN0YXJ0LCAwKTtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBhcmdzID0gYXJndW1lbnRzLFxuICAgICAgICBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBuYXRpdmVNYXgoYXJncy5sZW5ndGggLSBzdGFydCwgMCksXG4gICAgICAgIGFycmF5ID0gQXJyYXkobGVuZ3RoKTtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBhcnJheVtpbmRleF0gPSBhcmdzW3N0YXJ0ICsgaW5kZXhdO1xuICAgIH1cbiAgICBpbmRleCA9IC0xO1xuICAgIHZhciBvdGhlckFyZ3MgPSBBcnJheShzdGFydCArIDEpO1xuICAgIHdoaWxlICgrK2luZGV4IDwgc3RhcnQpIHtcbiAgICAgIG90aGVyQXJnc1tpbmRleF0gPSBhcmdzW2luZGV4XTtcbiAgICB9XG4gICAgb3RoZXJBcmdzW3N0YXJ0XSA9IHRyYW5zZm9ybShhcnJheSk7XG4gICAgcmV0dXJuIGFwcGx5KGZ1bmMsIHRoaXMsIG90aGVyQXJncyk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gb3ZlclJlc3Q7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///223\n")},function(module,exports,__webpack_require__){eval("var baseSetToString = __webpack_require__(412),\n shortOut = __webpack_require__(413);\n\n/**\n * Sets the `toString` method of `func` to return `string`.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar setToString = shortOut(baseSetToString);\n\nmodule.exports = setToString;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19zZXRUb1N0cmluZy5qcz9jMWM5Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHNCQUFzQixtQkFBTyxDQUFDLEdBQW9CO0FBQ2xELGVBQWUsbUJBQU8sQ0FBQyxHQUFhOztBQUVwQztBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsU0FBUztBQUNwQixXQUFXLFNBQVM7QUFDcEIsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7O0FBRUEiLCJmaWxlIjoiMjI0LmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIGJhc2VTZXRUb1N0cmluZyA9IHJlcXVpcmUoJy4vX2Jhc2VTZXRUb1N0cmluZycpLFxuICAgIHNob3J0T3V0ID0gcmVxdWlyZSgnLi9fc2hvcnRPdXQnKTtcblxuLyoqXG4gKiBTZXRzIHRoZSBgdG9TdHJpbmdgIG1ldGhvZCBvZiBgZnVuY2AgdG8gcmV0dXJuIGBzdHJpbmdgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBzdHJpbmcgVGhlIGB0b1N0cmluZ2AgcmVzdWx0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGBmdW5jYC5cbiAqL1xudmFyIHNldFRvU3RyaW5nID0gc2hvcnRPdXQoYmFzZVNldFRvU3RyaW5nKTtcblxubW9kdWxlLmV4cG9ydHMgPSBzZXRUb1N0cmluZztcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///224\n")},function(module,exports){eval("/**\n * The base implementation of `_.findIndex` and `_.findLastIndex` without\n * support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} predicate The function invoked per iteration.\n * @param {number} fromIndex The index to search from.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction baseFindIndex(array, predicate, fromIndex, fromRight) {\n var length = array.length,\n index = fromIndex + (fromRight ? 1 : -1);\n\n while ((fromRight ? index-- : ++index < length)) {\n if (predicate(array[index], index, array)) {\n return index;\n }\n }\n return -1;\n}\n\nmodule.exports = baseFindIndex;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlRmluZEluZGV4LmpzPzJiMDMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsTUFBTTtBQUNqQixXQUFXLFNBQVM7QUFDcEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsUUFBUTtBQUNuQixhQUFhLE9BQU87QUFDcEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJmaWxlIjoiMjI1LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5maW5kSW5kZXhgIGFuZCBgXy5maW5kTGFzdEluZGV4YCB3aXRob3V0XG4gKiBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHBhcmFtIHtudW1iZXJ9IGZyb21JbmRleCBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VGaW5kSW5kZXgoYXJyYXksIHByZWRpY2F0ZSwgZnJvbUluZGV4LCBmcm9tUmlnaHQpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgIGluZGV4ID0gZnJvbUluZGV4ICsgKGZyb21SaWdodCA/IDEgOiAtMSk7XG5cbiAgd2hpbGUgKChmcm9tUmlnaHQgPyBpbmRleC0tIDogKytpbmRleCA8IGxlbmd0aCkpIHtcbiAgICBpZiAocHJlZGljYXRlKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSkge1xuICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH1cbiAgfVxuICByZXR1cm4gLTE7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUZpbmRJbmRleDtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///225\n")},function(module,exports,__webpack_require__){eval("var isArrayLike = __webpack_require__(54),\n isObjectLike = __webpack_require__(49);\n\n/**\n * This method is like `_.isArrayLike` except that it also checks if `value`\n * is an object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array-like object,\n * else `false`.\n * @example\n *\n * _.isArrayLikeObject([1, 2, 3]);\n * // => true\n *\n * _.isArrayLikeObject(document.body.children);\n * // => true\n *\n * _.isArrayLikeObject('abc');\n * // => false\n *\n * _.isArrayLikeObject(_.noop);\n * // => false\n */\nfunction isArrayLikeObject(value) {\n return isObjectLike(value) && isArrayLike(value);\n}\n\nmodule.exports = isArrayLikeObject;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzQXJyYXlMaWtlT2JqZWN0LmpzP2RjYmUiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsa0JBQWtCLG1CQUFPLENBQUMsRUFBZTtBQUN6QyxtQkFBbUIsbUJBQU8sQ0FBQyxFQUFnQjs7QUFFM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsRUFBRTtBQUNiLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJmaWxlIjoiMjI2LmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIGlzQXJyYXlMaWtlID0gcmVxdWlyZSgnLi9pc0FycmF5TGlrZScpLFxuICAgIGlzT2JqZWN0TGlrZSA9IHJlcXVpcmUoJy4vaXNPYmplY3RMaWtlJyk7XG5cbi8qKlxuICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5pc0FycmF5TGlrZWAgZXhjZXB0IHRoYXQgaXQgYWxzbyBjaGVja3MgaWYgYHZhbHVlYFxuICogaXMgYW4gb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGFycmF5LWxpa2Ugb2JqZWN0LFxuICogIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0FycmF5TGlrZU9iamVjdChbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheUxpa2VPYmplY3QoZG9jdW1lbnQuYm9keS5jaGlsZHJlbik7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5TGlrZU9iamVjdCgnYWJjJyk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNBcnJheUxpa2VPYmplY3QoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzQXJyYXlMaWtlT2JqZWN0KHZhbHVlKSB7XG4gIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGlzQXJyYXlMaWtlKHZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0FycmF5TGlrZU9iamVjdDtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///226\n")},function(module,exports,__webpack_require__){eval("var baseValues = __webpack_require__(422),\n keys = __webpack_require__(59);\n\n/**\n * Creates an array of the own enumerable string keyed property values of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property values.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.values(new Foo);\n * // => [1, 2] (iteration order is not guaranteed)\n *\n * _.values('hi');\n * // => ['h', 'i']\n */\nfunction values(object) {\n return object == null ? [] : baseValues(object, keys(object));\n}\n\nmodule.exports = values;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL3ZhbHVlcy5qcz8zZmYxIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGlCQUFpQixtQkFBTyxDQUFDLEdBQWU7QUFDeEMsV0FBVyxtQkFBTyxDQUFDLEVBQVE7O0FBRTNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixhQUFhLE1BQU07QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwiZmlsZSI6IjIyNy5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBiYXNlVmFsdWVzID0gcmVxdWlyZSgnLi9fYmFzZVZhbHVlcycpLFxuICAgIGtleXMgPSByZXF1aXJlKCcuL2tleXMnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydHkgdmFsdWVzIG9mIGBvYmplY3RgLlxuICpcbiAqICoqTm90ZToqKiBOb24tb2JqZWN0IHZhbHVlcyBhcmUgY29lcmNlZCB0byBvYmplY3RzLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBzaW5jZSAwLjEuMFxuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgdmFsdWVzLlxuICogQGV4YW1wbGVcbiAqXG4gKiBmdW5jdGlvbiBGb28oKSB7XG4gKiAgIHRoaXMuYSA9IDE7XG4gKiAgIHRoaXMuYiA9IDI7XG4gKiB9XG4gKlxuICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAqXG4gKiBfLnZhbHVlcyhuZXcgRm9vKTtcbiAqIC8vID0+IFsxLCAyXSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICpcbiAqIF8udmFsdWVzKCdoaScpO1xuICogLy8gPT4gWydoJywgJ2knXVxuICovXG5mdW5jdGlvbiB2YWx1ZXMob2JqZWN0KSB7XG4gIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IFtdIDogYmFzZVZhbHVlcyhvYmplY3QsIGtleXMob2JqZWN0KSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdmFsdWVzO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///227\n")},function(module,exports,__webpack_require__){eval('var _ = __webpack_require__(42);\nvar PriorityQueue = __webpack_require__(229);\n\nmodule.exports = dijkstra;\n\nvar DEFAULT_WEIGHT_FUNC = _.constant(1);\n\nfunction dijkstra(g, source, weightFn, edgeFn) {\n return runDijkstra(g, String(source),\n weightFn || DEFAULT_WEIGHT_FUNC,\n edgeFn || function(v) { return g.outEdges(v); });\n}\n\nfunction runDijkstra(g, source, weightFn, edgeFn) {\n var results = {};\n var pq = new PriorityQueue();\n var v, vEntry;\n\n var updateNeighbors = function(edge) {\n var w = edge.v !== v ? edge.v : edge.w;\n var wEntry = results[w];\n var weight = weightFn(edge);\n var distance = vEntry.distance + weight;\n\n if (weight < 0) {\n throw new Error("dijkstra does not allow negative edge weights. " +\n "Bad edge: " + edge + " Weight: " + weight);\n }\n\n if (distance < wEntry.distance) {\n wEntry.distance = distance;\n wEntry.predecessor = v;\n pq.decrease(w, distance);\n }\n };\n\n g.nodes().forEach(function(v) {\n var distance = v === source ? 0 : Number.POSITIVE_INFINITY;\n results[v] = { distance: distance };\n pq.add(v, distance);\n });\n\n while (pq.size() > 0) {\n v = pq.removeMin();\n vEntry = results[v];\n if (vEntry.distance === Number.POSITIVE_INFINITY) {\n break;\n }\n\n edgeFn(v).forEach(updateNeighbors);\n }\n\n return results;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZ3JhcGhsaWIvbGliL2FsZy9kaWprc3RyYS5qcz9hNDczIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFFBQVEsbUJBQU8sQ0FBQyxFQUFXO0FBQzNCLG9CQUFvQixtQkFBTyxDQUFDLEdBQXdCOztBQUVwRDs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsc0JBQXNCLEVBQUU7QUFDbkQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSIsImZpbGUiOiIyMjguanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgXyA9IHJlcXVpcmUoXCIuLi9sb2Rhc2hcIik7XG52YXIgUHJpb3JpdHlRdWV1ZSA9IHJlcXVpcmUoXCIuLi9kYXRhL3ByaW9yaXR5LXF1ZXVlXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGRpamtzdHJhO1xuXG52YXIgREVGQVVMVF9XRUlHSFRfRlVOQyA9IF8uY29uc3RhbnQoMSk7XG5cbmZ1bmN0aW9uIGRpamtzdHJhKGcsIHNvdXJjZSwgd2VpZ2h0Rm4sIGVkZ2VGbikge1xuICByZXR1cm4gcnVuRGlqa3N0cmEoZywgU3RyaW5nKHNvdXJjZSksXG4gICAgd2VpZ2h0Rm4gfHwgREVGQVVMVF9XRUlHSFRfRlVOQyxcbiAgICBlZGdlRm4gfHwgZnVuY3Rpb24odikgeyByZXR1cm4gZy5vdXRFZGdlcyh2KTsgfSk7XG59XG5cbmZ1bmN0aW9uIHJ1bkRpamtzdHJhKGcsIHNvdXJjZSwgd2VpZ2h0Rm4sIGVkZ2VGbikge1xuICB2YXIgcmVzdWx0cyA9IHt9O1xuICB2YXIgcHEgPSBuZXcgUHJpb3JpdHlRdWV1ZSgpO1xuICB2YXIgdiwgdkVudHJ5O1xuXG4gIHZhciB1cGRhdGVOZWlnaGJvcnMgPSBmdW5jdGlvbihlZGdlKSB7XG4gICAgdmFyIHcgPSBlZGdlLnYgIT09IHYgPyBlZGdlLnYgOiBlZGdlLnc7XG4gICAgdmFyIHdFbnRyeSA9IHJlc3VsdHNbd107XG4gICAgdmFyIHdlaWdodCA9IHdlaWdodEZuKGVkZ2UpO1xuICAgIHZhciBkaXN0YW5jZSA9IHZFbnRyeS5kaXN0YW5jZSArIHdlaWdodDtcblxuICAgIGlmICh3ZWlnaHQgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJkaWprc3RyYSBkb2VzIG5vdCBhbGxvdyBuZWdhdGl2ZSBlZGdlIHdlaWdodHMuIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICBcIkJhZCBlZGdlOiBcIiArIGVkZ2UgKyBcIiBXZWlnaHQ6IFwiICsgd2VpZ2h0KTtcbiAgICB9XG5cbiAgICBpZiAoZGlzdGFuY2UgPCB3RW50cnkuZGlzdGFuY2UpIHtcbiAgICAgIHdFbnRyeS5kaXN0YW5jZSA9IGRpc3RhbmNlO1xuICAgICAgd0VudHJ5LnByZWRlY2Vzc29yID0gdjtcbiAgICAgIHBxLmRlY3JlYXNlKHcsIGRpc3RhbmNlKTtcbiAgICB9XG4gIH07XG5cbiAgZy5ub2RlcygpLmZvckVhY2goZnVuY3Rpb24odikge1xuICAgIHZhciBkaXN0YW5jZSA9IHYgPT09IHNvdXJjZSA/IDAgOiBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG4gICAgcmVzdWx0c1t2XSA9IHsgZGlzdGFuY2U6IGRpc3RhbmNlIH07XG4gICAgcHEuYWRkKHYsIGRpc3RhbmNlKTtcbiAgfSk7XG5cbiAgd2hpbGUgKHBxLnNpemUoKSA+IDApIHtcbiAgICB2ID0gcHEucmVtb3ZlTWluKCk7XG4gICAgdkVudHJ5ID0gcmVzdWx0c1t2XTtcbiAgICBpZiAodkVudHJ5LmRpc3RhbmNlID09PSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGVkZ2VGbih2KS5mb3JFYWNoKHVwZGF0ZU5laWdoYm9ycyk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0cztcbn1cbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///228\n')},function(module,exports,__webpack_require__){eval('var _ = __webpack_require__(42);\n\nmodule.exports = PriorityQueue;\n\n/**\n * A min-priority queue data structure. This algorithm is derived from Cormen,\n * et al., "Introduction to Algorithms". The basic idea of a min-priority\n * queue is that you can efficiently (in O(1) time) get the smallest key in\n * the queue. Adding and removing elements takes O(log n) time. A key can\n * have its priority decreased in O(log n) time.\n */\nfunction PriorityQueue() {\n this._arr = [];\n this._keyIndices = {};\n}\n\n/**\n * Returns the number of elements in the queue. Takes `O(1)` time.\n */\nPriorityQueue.prototype.size = function() {\n return this._arr.length;\n};\n\n/**\n * Returns the keys that are in the queue. Takes `O(n)` time.\n */\nPriorityQueue.prototype.keys = function() {\n return this._arr.map(function(x) { return x.key; });\n};\n\n/**\n * Returns `true` if **key** is in the queue and `false` if not.\n */\nPriorityQueue.prototype.has = function(key) {\n return _.has(this._keyIndices, key);\n};\n\n/**\n * Returns the priority for **key**. If **key** is not present in the queue\n * then this function returns `undefined`. Takes `O(1)` time.\n *\n * @param {Object} key\n */\nPriorityQueue.prototype.priority = function(key) {\n var index = this._keyIndices[key];\n if (index !== undefined) {\n return this._arr[index].priority;\n }\n};\n\n/**\n * Returns the key for the minimum element in this queue. If the queue is\n * empty this function throws an Error. Takes `O(1)` time.\n */\nPriorityQueue.prototype.min = function() {\n if (this.size() === 0) {\n throw new Error("Queue underflow");\n }\n return this._arr[0].key;\n};\n\n/**\n * Inserts a new key into the priority queue. If the key already exists in\n * the queue this function returns `false`; otherwise it will return `true`.\n * Takes `O(n)` time.\n *\n * @param {Object} key the key to add\n * @param {Number} priority the initial priority for the key\n */\nPriorityQueue.prototype.add = function(key, priority) {\n var keyIndices = this._keyIndices;\n key = String(key);\n if (!_.has(keyIndices, key)) {\n var arr = this._arr;\n var index = arr.length;\n keyIndices[key] = index;\n arr.push({key: key, priority: priority});\n this._decrease(index);\n return true;\n }\n return false;\n};\n\n/**\n * Removes and returns the smallest key in the queue. Takes `O(log n)` time.\n */\nPriorityQueue.prototype.removeMin = function() {\n this._swap(0, this._arr.length - 1);\n var min = this._arr.pop();\n delete this._keyIndices[min.key];\n this._heapify(0);\n return min.key;\n};\n\n/**\n * Decreases the priority for **key** to **priority**. If the new priority is\n * greater than the previous priority, this function will throw an Error.\n *\n * @param {Object} key the key for which to raise priority\n * @param {Number} priority the new priority for the key\n */\nPriorityQueue.prototype.decrease = function(key, priority) {\n var index = this._keyIndices[key];\n if (priority > this._arr[index].priority) {\n throw new Error("New priority is greater than current priority. " +\n "Key: " + key + " Old: " + this._arr[index].priority + " New: " + priority);\n }\n this._arr[index].priority = priority;\n this._decrease(index);\n};\n\nPriorityQueue.prototype._heapify = function(i) {\n var arr = this._arr;\n var l = 2 * i;\n var r = l + 1;\n var largest = i;\n if (l < arr.length) {\n largest = arr[l].priority < arr[largest].priority ? l : largest;\n if (r < arr.length) {\n largest = arr[r].priority < arr[largest].priority ? r : largest;\n }\n if (largest !== i) {\n this._swap(i, largest);\n this._heapify(largest);\n }\n }\n};\n\nPriorityQueue.prototype._decrease = function(index) {\n var arr = this._arr;\n var priority = arr[index].priority;\n var parent;\n while (index !== 0) {\n parent = index >> 1;\n if (arr[parent].priority < priority) {\n break;\n }\n this._swap(index, parent);\n index = parent;\n }\n};\n\nPriorityQueue.prototype._swap = function(i, j) {\n var arr = this._arr;\n var keyIndices = this._keyIndices;\n var origArrI = arr[i];\n var origArrJ = arr[j];\n arr[i] = origArrJ;\n arr[j] = origArrI;\n keyIndices[origArrJ.key] = i;\n keyIndices[origArrI.key] = j;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZ3JhcGhsaWIvbGliL2RhdGEvcHJpb3JpdHktcXVldWUuanM/MDFlYiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxRQUFRLG1CQUFPLENBQUMsRUFBVzs7QUFFM0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0MsY0FBYyxFQUFFO0FBQ3BEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsMkNBQTJDO0FBQzNDO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLDZCQUE2QjtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiIyMjkuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgXyA9IHJlcXVpcmUoXCIuLi9sb2Rhc2hcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gUHJpb3JpdHlRdWV1ZTtcblxuLyoqXG4gKiBBIG1pbi1wcmlvcml0eSBxdWV1ZSBkYXRhIHN0cnVjdHVyZS4gVGhpcyBhbGdvcml0aG0gaXMgZGVyaXZlZCBmcm9tIENvcm1lbixcbiAqIGV0IGFsLiwgXCJJbnRyb2R1Y3Rpb24gdG8gQWxnb3JpdGhtc1wiLiBUaGUgYmFzaWMgaWRlYSBvZiBhIG1pbi1wcmlvcml0eVxuICogcXVldWUgaXMgdGhhdCB5b3UgY2FuIGVmZmljaWVudGx5IChpbiBPKDEpIHRpbWUpIGdldCB0aGUgc21hbGxlc3Qga2V5IGluXG4gKiB0aGUgcXVldWUuIEFkZGluZyBhbmQgcmVtb3ZpbmcgZWxlbWVudHMgdGFrZXMgTyhsb2cgbikgdGltZS4gQSBrZXkgY2FuXG4gKiBoYXZlIGl0cyBwcmlvcml0eSBkZWNyZWFzZWQgaW4gTyhsb2cgbikgdGltZS5cbiAqL1xuZnVuY3Rpb24gUHJpb3JpdHlRdWV1ZSgpIHtcbiAgdGhpcy5fYXJyID0gW107XG4gIHRoaXMuX2tleUluZGljZXMgPSB7fTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHF1ZXVlLiBUYWtlcyBgTygxKWAgdGltZS5cbiAqL1xuUHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUuc2l6ZSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5fYXJyLmxlbmd0aDtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUga2V5cyB0aGF0IGFyZSBpbiB0aGUgcXVldWUuIFRha2VzIGBPKG4pYCB0aW1lLlxuICovXG5Qcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5rZXlzID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLl9hcnIubWFwKGZ1bmN0aW9uKHgpIHsgcmV0dXJuIHgua2V5OyB9KTtcbn07XG5cbi8qKlxuICogUmV0dXJucyBgdHJ1ZWAgaWYgKiprZXkqKiBpcyBpbiB0aGUgcXVldWUgYW5kIGBmYWxzZWAgaWYgbm90LlxuICovXG5Qcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbihrZXkpIHtcbiAgcmV0dXJuIF8uaGFzKHRoaXMuX2tleUluZGljZXMsIGtleSk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIHByaW9yaXR5IGZvciAqKmtleSoqLiBJZiAqKmtleSoqIGlzIG5vdCBwcmVzZW50IGluIHRoZSBxdWV1ZVxuICogdGhlbiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYHVuZGVmaW5lZGAuIFRha2VzIGBPKDEpYCB0aW1lLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBrZXlcbiAqL1xuUHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUucHJpb3JpdHkgPSBmdW5jdGlvbihrZXkpIHtcbiAgdmFyIGluZGV4ID0gdGhpcy5fa2V5SW5kaWNlc1trZXldO1xuICBpZiAoaW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB0aGlzLl9hcnJbaW5kZXhdLnByaW9yaXR5O1xuICB9XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGtleSBmb3IgdGhlIG1pbmltdW0gZWxlbWVudCBpbiB0aGlzIHF1ZXVlLiBJZiB0aGUgcXVldWUgaXNcbiAqIGVtcHR5IHRoaXMgZnVuY3Rpb24gdGhyb3dzIGFuIEVycm9yLiBUYWtlcyBgTygxKWAgdGltZS5cbiAqL1xuUHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUubWluID0gZnVuY3Rpb24oKSB7XG4gIGlmICh0aGlzLnNpemUoKSA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIlF1ZXVlIHVuZGVyZmxvd1wiKTtcbiAgfVxuICByZXR1cm4gdGhpcy5fYXJyWzBdLmtleTtcbn07XG5cbi8qKlxuICogSW5zZXJ0cyBhIG5ldyBrZXkgaW50byB0aGUgcHJpb3JpdHkgcXVldWUuIElmIHRoZSBrZXkgYWxyZWFkeSBleGlzdHMgaW5cbiAqIHRoZSBxdWV1ZSB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYGZhbHNlYDsgb3RoZXJ3aXNlIGl0IHdpbGwgcmV0dXJuIGB0cnVlYC5cbiAqIFRha2VzIGBPKG4pYCB0aW1lLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBrZXkgdGhlIGtleSB0byBhZGRcbiAqIEBwYXJhbSB7TnVtYmVyfSBwcmlvcml0eSB0aGUgaW5pdGlhbCBwcmlvcml0eSBmb3IgdGhlIGtleVxuICovXG5Qcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbihrZXksIHByaW9yaXR5KSB7XG4gIHZhciBrZXlJbmRpY2VzID0gdGhpcy5fa2V5SW5kaWNlcztcbiAga2V5ID0gU3RyaW5nKGtleSk7XG4gIGlmICghXy5oYXMoa2V5SW5kaWNlcywga2V5KSkge1xuICAgIHZhciBhcnIgPSB0aGlzLl9hcnI7XG4gICAgdmFyIGluZGV4ID0gYXJyLmxlbmd0aDtcbiAgICBrZXlJbmRpY2VzW2tleV0gPSBpbmRleDtcbiAgICBhcnIucHVzaCh7a2V5OiBrZXksIHByaW9yaXR5OiBwcmlvcml0eX0pO1xuICAgIHRoaXMuX2RlY3JlYXNlKGluZGV4KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59O1xuXG4vKipcbiAqIFJlbW92ZXMgYW5kIHJldHVybnMgdGhlIHNtYWxsZXN0IGtleSBpbiB0aGUgcXVldWUuIFRha2VzIGBPKGxvZyBuKWAgdGltZS5cbiAqL1xuUHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUucmVtb3ZlTWluID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuX3N3YXAoMCwgdGhpcy5fYXJyLmxlbmd0aCAtIDEpO1xuICB2YXIgbWluID0gdGhpcy5fYXJyLnBvcCgpO1xuICBkZWxldGUgdGhpcy5fa2V5SW5kaWNlc1ttaW4ua2V5XTtcbiAgdGhpcy5faGVhcGlmeSgwKTtcbiAgcmV0dXJuIG1pbi5rZXk7XG59O1xuXG4vKipcbiAqIERlY3JlYXNlcyB0aGUgcHJpb3JpdHkgZm9yICoqa2V5KiogdG8gKipwcmlvcml0eSoqLiBJZiB0aGUgbmV3IHByaW9yaXR5IGlzXG4gKiBncmVhdGVyIHRoYW4gdGhlIHByZXZpb3VzIHByaW9yaXR5LCB0aGlzIGZ1bmN0aW9uIHdpbGwgdGhyb3cgYW4gRXJyb3IuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGtleSB0aGUga2V5IGZvciB3aGljaCB0byByYWlzZSBwcmlvcml0eVxuICogQHBhcmFtIHtOdW1iZXJ9IHByaW9yaXR5IHRoZSBuZXcgcHJpb3JpdHkgZm9yIHRoZSBrZXlcbiAqL1xuUHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUuZGVjcmVhc2UgPSBmdW5jdGlvbihrZXksIHByaW9yaXR5KSB7XG4gIHZhciBpbmRleCA9IHRoaXMuX2tleUluZGljZXNba2V5XTtcbiAgaWYgKHByaW9yaXR5ID4gdGhpcy5fYXJyW2luZGV4XS5wcmlvcml0eSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIk5ldyBwcmlvcml0eSBpcyBncmVhdGVyIHRoYW4gY3VycmVudCBwcmlvcml0eS4gXCIgK1xuICAgICAgICBcIktleTogXCIgKyBrZXkgKyBcIiBPbGQ6IFwiICsgdGhpcy5fYXJyW2luZGV4XS5wcmlvcml0eSArIFwiIE5ldzogXCIgKyBwcmlvcml0eSk7XG4gIH1cbiAgdGhpcy5fYXJyW2luZGV4XS5wcmlvcml0eSA9IHByaW9yaXR5O1xuICB0aGlzLl9kZWNyZWFzZShpbmRleCk7XG59O1xuXG5Qcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5faGVhcGlmeSA9IGZ1bmN0aW9uKGkpIHtcbiAgdmFyIGFyciA9IHRoaXMuX2FycjtcbiAgdmFyIGwgPSAyICogaTtcbiAgdmFyIHIgPSBsICsgMTtcbiAgdmFyIGxhcmdlc3QgPSBpO1xuICBpZiAobCA8IGFyci5sZW5ndGgpIHtcbiAgICBsYXJnZXN0ID0gYXJyW2xdLnByaW9yaXR5IDwgYXJyW2xhcmdlc3RdLnByaW9yaXR5ID8gbCA6IGxhcmdlc3Q7XG4gICAgaWYgKHIgPCBhcnIubGVuZ3RoKSB7XG4gICAgICBsYXJnZXN0ID0gYXJyW3JdLnByaW9yaXR5IDwgYXJyW2xhcmdlc3RdLnByaW9yaXR5ID8gciA6IGxhcmdlc3Q7XG4gICAgfVxuICAgIGlmIChsYXJnZXN0ICE9PSBpKSB7XG4gICAgICB0aGlzLl9zd2FwKGksIGxhcmdlc3QpO1xuICAgICAgdGhpcy5faGVhcGlmeShsYXJnZXN0KTtcbiAgICB9XG4gIH1cbn07XG5cblByaW9yaXR5UXVldWUucHJvdG90eXBlLl9kZWNyZWFzZSA9IGZ1bmN0aW9uKGluZGV4KSB7XG4gIHZhciBhcnIgPSB0aGlzLl9hcnI7XG4gIHZhciBwcmlvcml0eSA9IGFycltpbmRleF0ucHJpb3JpdHk7XG4gIHZhciBwYXJlbnQ7XG4gIHdoaWxlIChpbmRleCAhPT0gMCkge1xuICAgIHBhcmVudCA9IGluZGV4ID4+IDE7XG4gICAgaWYgKGFycltwYXJlbnRdLnByaW9yaXR5IDwgcHJpb3JpdHkpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICB0aGlzLl9zd2FwKGluZGV4LCBwYXJlbnQpO1xuICAgIGluZGV4ID0gcGFyZW50O1xuICB9XG59O1xuXG5Qcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5fc3dhcCA9IGZ1bmN0aW9uKGksIGopIHtcbiAgdmFyIGFyciA9IHRoaXMuX2FycjtcbiAgdmFyIGtleUluZGljZXMgPSB0aGlzLl9rZXlJbmRpY2VzO1xuICB2YXIgb3JpZ0FyckkgPSBhcnJbaV07XG4gIHZhciBvcmlnQXJySiA9IGFycltqXTtcbiAgYXJyW2ldID0gb3JpZ0Fycko7XG4gIGFycltqXSA9IG9yaWdBcnJJO1xuICBrZXlJbmRpY2VzW29yaWdBcnJKLmtleV0gPSBpO1xuICBrZXlJbmRpY2VzW29yaWdBcnJJLmtleV0gPSBqO1xufTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///229\n')},function(module,exports,__webpack_require__){eval("var _ = __webpack_require__(42);\n\nmodule.exports = tarjan;\n\nfunction tarjan(g) {\n var index = 0;\n var stack = [];\n var visited = {}; // node id -> { onStack, lowlink, index }\n var results = [];\n\n function dfs(v) {\n var entry = visited[v] = {\n onStack: true,\n lowlink: index,\n index: index++\n };\n stack.push(v);\n\n g.successors(v).forEach(function(w) {\n if (!_.has(visited, w)) {\n dfs(w);\n entry.lowlink = Math.min(entry.lowlink, visited[w].lowlink);\n } else if (visited[w].onStack) {\n entry.lowlink = Math.min(entry.lowlink, visited[w].index);\n }\n });\n\n if (entry.lowlink === entry.index) {\n var cmpt = [];\n var w;\n do {\n w = stack.pop();\n visited[w].onStack = false;\n cmpt.push(w);\n } while (v !== w);\n results.push(cmpt);\n }\n }\n\n g.nodes().forEach(function(v) {\n if (!_.has(visited, v)) {\n dfs(v);\n }\n });\n\n return results;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZ3JhcGhsaWIvbGliL2FsZy90YXJqYW4uanM/Y2ZhNyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxRQUFRLG1CQUFPLENBQUMsRUFBVzs7QUFFM0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLGdCQUFnQjtBQUNuQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0EiLCJmaWxlIjoiMjMwLmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHRhcmphbjtcblxuZnVuY3Rpb24gdGFyamFuKGcpIHtcbiAgdmFyIGluZGV4ID0gMDtcbiAgdmFyIHN0YWNrID0gW107XG4gIHZhciB2aXNpdGVkID0ge307IC8vIG5vZGUgaWQgLT4geyBvblN0YWNrLCBsb3dsaW5rLCBpbmRleCB9XG4gIHZhciByZXN1bHRzID0gW107XG5cbiAgZnVuY3Rpb24gZGZzKHYpIHtcbiAgICB2YXIgZW50cnkgPSB2aXNpdGVkW3ZdID0ge1xuICAgICAgb25TdGFjazogdHJ1ZSxcbiAgICAgIGxvd2xpbms6IGluZGV4LFxuICAgICAgaW5kZXg6IGluZGV4KytcbiAgICB9O1xuICAgIHN0YWNrLnB1c2godik7XG5cbiAgICBnLnN1Y2Nlc3NvcnModikuZm9yRWFjaChmdW5jdGlvbih3KSB7XG4gICAgICBpZiAoIV8uaGFzKHZpc2l0ZWQsIHcpKSB7XG4gICAgICAgIGRmcyh3KTtcbiAgICAgICAgZW50cnkubG93bGluayA9IE1hdGgubWluKGVudHJ5Lmxvd2xpbmssIHZpc2l0ZWRbd10ubG93bGluayk7XG4gICAgICB9IGVsc2UgaWYgKHZpc2l0ZWRbd10ub25TdGFjaykge1xuICAgICAgICBlbnRyeS5sb3dsaW5rID0gTWF0aC5taW4oZW50cnkubG93bGluaywgdmlzaXRlZFt3XS5pbmRleCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoZW50cnkubG93bGluayA9PT0gZW50cnkuaW5kZXgpIHtcbiAgICAgIHZhciBjbXB0ID0gW107XG4gICAgICB2YXIgdztcbiAgICAgIGRvIHtcbiAgICAgICAgdyA9IHN0YWNrLnBvcCgpO1xuICAgICAgICB2aXNpdGVkW3ddLm9uU3RhY2sgPSBmYWxzZTtcbiAgICAgICAgY21wdC5wdXNoKHcpO1xuICAgICAgfSB3aGlsZSAodiAhPT0gdyk7XG4gICAgICByZXN1bHRzLnB1c2goY21wdCk7XG4gICAgfVxuICB9XG5cbiAgZy5ub2RlcygpLmZvckVhY2goZnVuY3Rpb24odikge1xuICAgIGlmICghXy5oYXModmlzaXRlZCwgdikpIHtcbiAgICAgIGRmcyh2KTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiByZXN1bHRzO1xufVxuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///230\n")},function(module,exports,__webpack_require__){eval("var _ = __webpack_require__(42);\n\nmodule.exports = topsort;\ntopsort.CycleException = CycleException;\n\nfunction topsort(g) {\n var visited = {};\n var stack = {};\n var results = [];\n\n function visit(node) {\n if (_.has(stack, node)) {\n throw new CycleException();\n }\n\n if (!_.has(visited, node)) {\n stack[node] = true;\n visited[node] = true;\n _.each(g.predecessors(node), visit);\n delete stack[node];\n results.push(node);\n }\n }\n\n _.each(g.sinks(), visit);\n\n if (_.size(visited) !== g.nodeCount()) {\n throw new CycleException();\n }\n\n return results;\n}\n\nfunction CycleException() {}\nCycleException.prototype = new Error(); // must be an instance of Error to pass testing//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZ3JhcGhsaWIvbGliL2FsZy90b3Bzb3J0LmpzPzgxODUiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsUUFBUSxtQkFBTyxDQUFDLEVBQVc7O0FBRTNCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLHVDQUF1QyIsImZpbGUiOiIyMzEuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgXyA9IHJlcXVpcmUoXCIuLi9sb2Rhc2hcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gdG9wc29ydDtcbnRvcHNvcnQuQ3ljbGVFeGNlcHRpb24gPSBDeWNsZUV4Y2VwdGlvbjtcblxuZnVuY3Rpb24gdG9wc29ydChnKSB7XG4gIHZhciB2aXNpdGVkID0ge307XG4gIHZhciBzdGFjayA9IHt9O1xuICB2YXIgcmVzdWx0cyA9IFtdO1xuXG4gIGZ1bmN0aW9uIHZpc2l0KG5vZGUpIHtcbiAgICBpZiAoXy5oYXMoc3RhY2ssIG5vZGUpKSB7XG4gICAgICB0aHJvdyBuZXcgQ3ljbGVFeGNlcHRpb24oKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaGFzKHZpc2l0ZWQsIG5vZGUpKSB7XG4gICAgICBzdGFja1tub2RlXSA9IHRydWU7XG4gICAgICB2aXNpdGVkW25vZGVdID0gdHJ1ZTtcbiAgICAgIF8uZWFjaChnLnByZWRlY2Vzc29ycyhub2RlKSwgdmlzaXQpO1xuICAgICAgZGVsZXRlIHN0YWNrW25vZGVdO1xuICAgICAgcmVzdWx0cy5wdXNoKG5vZGUpO1xuICAgIH1cbiAgfVxuXG4gIF8uZWFjaChnLnNpbmtzKCksIHZpc2l0KTtcblxuICBpZiAoXy5zaXplKHZpc2l0ZWQpICE9PSBnLm5vZGVDb3VudCgpKSB7XG4gICAgdGhyb3cgbmV3IEN5Y2xlRXhjZXB0aW9uKCk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0cztcbn1cblxuZnVuY3Rpb24gQ3ljbGVFeGNlcHRpb24oKSB7fVxuQ3ljbGVFeGNlcHRpb24ucHJvdG90eXBlID0gbmV3IEVycm9yKCk7IC8vIG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgRXJyb3IgdG8gcGFzcyB0ZXN0aW5nIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///231\n")},function(module,exports,__webpack_require__){eval('var _ = __webpack_require__(42);\n\nmodule.exports = dfs;\n\n/*\n * A helper that preforms a pre- or post-order traversal on the input graph\n * and returns the nodes in the order they were visited. If the graph is\n * undirected then this algorithm will navigate using neighbors. If the graph\n * is directed then this algorithm will navigate using successors.\n *\n * Order must be one of "pre" or "post".\n */\nfunction dfs(g, vs, order) {\n if (!_.isArray(vs)) {\n vs = [vs];\n }\n\n var navigation = (g.isDirected() ? g.successors : g.neighbors).bind(g);\n\n var acc = [];\n var visited = {};\n _.each(vs, function(v) {\n if (!g.hasNode(v)) {\n throw new Error("Graph does not have node: " + v);\n }\n\n doDfs(g, v, order === "post", visited, navigation, acc);\n });\n return acc;\n}\n\nfunction doDfs(g, v, postorder, visited, navigation, acc) {\n if (!_.has(visited, v)) {\n visited[v] = true;\n\n if (!postorder) { acc.push(v); }\n _.each(navigation(v), function(w) {\n doDfs(g, w, postorder, visited, navigation, acc);\n });\n if (postorder) { acc.push(v); }\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZ3JhcGhsaWIvbGliL2FsZy9kZnMuanM/ZGYyZSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxRQUFRLG1CQUFPLENBQUMsRUFBVzs7QUFFM0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxxQkFBcUIsYUFBYTtBQUNsQztBQUNBO0FBQ0EsS0FBSztBQUNMLG9CQUFvQixhQUFhO0FBQ2pDO0FBQ0EiLCJmaWxlIjoiMjMyLmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGRmcztcblxuLypcbiAqIEEgaGVscGVyIHRoYXQgcHJlZm9ybXMgYSBwcmUtIG9yIHBvc3Qtb3JkZXIgdHJhdmVyc2FsIG9uIHRoZSBpbnB1dCBncmFwaFxuICogYW5kIHJldHVybnMgdGhlIG5vZGVzIGluIHRoZSBvcmRlciB0aGV5IHdlcmUgdmlzaXRlZC4gSWYgdGhlIGdyYXBoIGlzXG4gKiB1bmRpcmVjdGVkIHRoZW4gdGhpcyBhbGdvcml0aG0gd2lsbCBuYXZpZ2F0ZSB1c2luZyBuZWlnaGJvcnMuIElmIHRoZSBncmFwaFxuICogaXMgZGlyZWN0ZWQgdGhlbiB0aGlzIGFsZ29yaXRobSB3aWxsIG5hdmlnYXRlIHVzaW5nIHN1Y2Nlc3NvcnMuXG4gKlxuICogT3JkZXIgbXVzdCBiZSBvbmUgb2YgXCJwcmVcIiBvciBcInBvc3RcIi5cbiAqL1xuZnVuY3Rpb24gZGZzKGcsIHZzLCBvcmRlcikge1xuICBpZiAoIV8uaXNBcnJheSh2cykpIHtcbiAgICB2cyA9IFt2c107XG4gIH1cblxuICB2YXIgbmF2aWdhdGlvbiA9IChnLmlzRGlyZWN0ZWQoKSA/IGcuc3VjY2Vzc29ycyA6IGcubmVpZ2hib3JzKS5iaW5kKGcpO1xuXG4gIHZhciBhY2MgPSBbXTtcbiAgdmFyIHZpc2l0ZWQgPSB7fTtcbiAgXy5lYWNoKHZzLCBmdW5jdGlvbih2KSB7XG4gICAgaWYgKCFnLmhhc05vZGUodikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkdyYXBoIGRvZXMgbm90IGhhdmUgbm9kZTogXCIgKyB2KTtcbiAgICB9XG5cbiAgICBkb0RmcyhnLCB2LCBvcmRlciA9PT0gXCJwb3N0XCIsIHZpc2l0ZWQsIG5hdmlnYXRpb24sIGFjYyk7XG4gIH0pO1xuICByZXR1cm4gYWNjO1xufVxuXG5mdW5jdGlvbiBkb0RmcyhnLCB2LCBwb3N0b3JkZXIsIHZpc2l0ZWQsIG5hdmlnYXRpb24sIGFjYykge1xuICBpZiAoIV8uaGFzKHZpc2l0ZWQsIHYpKSB7XG4gICAgdmlzaXRlZFt2XSA9IHRydWU7XG5cbiAgICBpZiAoIXBvc3RvcmRlcikgeyBhY2MucHVzaCh2KTsgfVxuICAgIF8uZWFjaChuYXZpZ2F0aW9uKHYpLCBmdW5jdGlvbih3KSB7XG4gICAgICBkb0RmcyhnLCB3LCBwb3N0b3JkZXIsIHZpc2l0ZWQsIG5hdmlnYXRpb24sIGFjYyk7XG4gICAgfSk7XG4gICAgaWYgKHBvc3RvcmRlcikgeyBhY2MucHVzaCh2KTsgfVxuICB9XG59XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///232\n')},function(module,exports,__webpack_require__){eval("var toNumber = __webpack_require__(441);\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0,\n MAX_INTEGER = 1.7976931348623157e+308;\n\n/**\n * Converts `value` to a finite number.\n *\n * @static\n * @memberOf _\n * @since 4.12.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted number.\n * @example\n *\n * _.toFinite(3.2);\n * // => 3.2\n *\n * _.toFinite(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toFinite(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toFinite('3.2');\n * // => 3.2\n */\nfunction toFinite(value) {\n if (!value) {\n return value === 0 ? value : 0;\n }\n value = toNumber(value);\n if (value === INFINITY || value === -INFINITY) {\n var sign = (value < 0 ? -1 : 1);\n return sign * MAX_INTEGER;\n }\n return value === value ? value : 0;\n}\n\nmodule.exports = toFinite;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL3RvRmluaXRlLmpzPzY0MjgiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsZUFBZSxtQkFBTyxDQUFDLEdBQVk7O0FBRW5DO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsRUFBRTtBQUNiLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsImZpbGUiOiIyMzMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgdG9OdW1iZXIgPSByZXF1aXJlKCcuL3RvTnVtYmVyJyk7XG5cbi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIElORklOSVRZID0gMSAvIDAsXG4gICAgTUFYX0lOVEVHRVIgPSAxLjc5NzY5MzEzNDg2MjMxNTdlKzMwODtcblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgZmluaXRlIG51bWJlci5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMTIuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgbnVtYmVyLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRvRmluaXRlKDMuMik7XG4gKiAvLyA9PiAzLjJcbiAqXG4gKiBfLnRvRmluaXRlKE51bWJlci5NSU5fVkFMVUUpO1xuICogLy8gPT4gNWUtMzI0XG4gKlxuICogXy50b0Zpbml0ZShJbmZpbml0eSk7XG4gKiAvLyA9PiAxLjc5NzY5MzEzNDg2MjMxNTdlKzMwOFxuICpcbiAqIF8udG9GaW5pdGUoJzMuMicpO1xuICogLy8gPT4gMy4yXG4gKi9cbmZ1bmN0aW9uIHRvRmluaXRlKHZhbHVlKSB7XG4gIGlmICghdmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09IDAgPyB2YWx1ZSA6IDA7XG4gIH1cbiAgdmFsdWUgPSB0b051bWJlcih2YWx1ZSk7XG4gIGlmICh2YWx1ZSA9PT0gSU5GSU5JVFkgfHwgdmFsdWUgPT09IC1JTkZJTklUWSkge1xuICAgIHZhciBzaWduID0gKHZhbHVlIDwgMCA/IC0xIDogMSk7XG4gICAgcmV0dXJuIHNpZ24gKiBNQVhfSU5URUdFUjtcbiAgfVxuICByZXR1cm4gdmFsdWUgPT09IHZhbHVlID8gdmFsdWUgOiAwO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHRvRmluaXRlO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///233\n")},function(module,exports,__webpack_require__){eval("var baseFlatten = __webpack_require__(168);\n\n/**\n * Flattens `array` a single level deep.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to flatten.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * _.flatten([1, [2, [3, [4]], 5]]);\n * // => [1, 2, [3, [4]], 5]\n */\nfunction flatten(array) {\n var length = array == null ? 0 : array.length;\n return length ? baseFlatten(array, 1) : [];\n}\n\nmodule.exports = flatten;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL2ZsYXR0ZW4uanM/NGQ4YyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxrQkFBa0IsbUJBQU8sQ0FBQyxHQUFnQjs7QUFFMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE1BQU07QUFDakIsYUFBYSxNQUFNO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsImZpbGUiOiIyMzQuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYmFzZUZsYXR0ZW4gPSByZXF1aXJlKCcuL19iYXNlRmxhdHRlbicpO1xuXG4vKipcbiAqIEZsYXR0ZW5zIGBhcnJheWAgYSBzaW5nbGUgbGV2ZWwgZGVlcC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgQXJyYXlcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBmbGF0dGVuLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmxhdHRlbmVkIGFycmF5LlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmZsYXR0ZW4oWzEsIFsyLCBbMywgWzRdXSwgNV1dKTtcbiAqIC8vID0+IFsxLCAyLCBbMywgWzRdXSwgNV1cbiAqL1xuZnVuY3Rpb24gZmxhdHRlbihhcnJheSkge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gIHJldHVybiBsZW5ndGggPyBiYXNlRmxhdHRlbihhcnJheSwgMSkgOiBbXTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmbGF0dGVuO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///234\n")},function(module,exports,__webpack_require__){eval("var baseAssignValue = __webpack_require__(105),\n eq = __webpack_require__(72);\n\n/**\n * This function is like `assignValue` except that it doesn't assign\n * `undefined` values.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction assignMergeValue(object, key, value) {\n if ((value !== undefined && !eq(object[key], value)) ||\n (value === undefined && !(key in object))) {\n baseAssignValue(object, key, value);\n }\n}\n\nmodule.exports = assignMergeValue;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19hc3NpZ25NZXJnZVZhbHVlLmpzP2I3NjAiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsc0JBQXNCLG1CQUFPLENBQUMsR0FBb0I7QUFDbEQsU0FBUyxtQkFBTyxDQUFDLEVBQU07O0FBRXZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsRUFBRTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwiZmlsZSI6IjIzNS5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBiYXNlQXNzaWduVmFsdWUgPSByZXF1aXJlKCcuL19iYXNlQXNzaWduVmFsdWUnKSxcbiAgICBlcSA9IHJlcXVpcmUoJy4vZXEnKTtcblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIGxpa2UgYGFzc2lnblZhbHVlYCBleGNlcHQgdGhhdCBpdCBkb2Vzbid0IGFzc2lnblxuICogYHVuZGVmaW5lZGAgdmFsdWVzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBhc3NpZ24uXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBhc3NpZ24uXG4gKi9cbmZ1bmN0aW9uIGFzc2lnbk1lcmdlVmFsdWUob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIGlmICgodmFsdWUgIT09IHVuZGVmaW5lZCAmJiAhZXEob2JqZWN0W2tleV0sIHZhbHVlKSkgfHxcbiAgICAgICh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmICEoa2V5IGluIG9iamVjdCkpKSB7XG4gICAgYmFzZUFzc2lnblZhbHVlKG9iamVjdCwga2V5LCB2YWx1ZSk7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhc3NpZ25NZXJnZVZhbHVlO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///235\n")},function(module,exports){eval("/**\n * Gets the value at `key`, unless `key` is \"__proto__\" or \"constructor\".\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction safeGet(object, key) {\n if (key === 'constructor' && typeof object[key] === 'function') {\n return;\n }\n\n if (key == '__proto__') {\n return;\n }\n\n return object[key];\n}\n\nmodule.exports = safeGet;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19zYWZlR2V0LmpzPzhhZGIiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsRUFBRTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEiLCJmaWxlIjoiMjM2LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZXRzIHRoZSB2YWx1ZSBhdCBga2V5YCwgdW5sZXNzIGBrZXlgIGlzIFwiX19wcm90b19fXCIgb3IgXCJjb25zdHJ1Y3RvclwiLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBwcm9wZXJ0eSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gc2FmZUdldChvYmplY3QsIGtleSkge1xuICBpZiAoa2V5ID09PSAnY29uc3RydWN0b3InICYmIHR5cGVvZiBvYmplY3Rba2V5XSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChrZXkgPT0gJ19fcHJvdG9fXycpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICByZXR1cm4gb2JqZWN0W2tleV07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2FmZUdldDtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///236\n")},function(module,exports){eval("/**\n * The base implementation of `_.lt` which doesn't coerce arguments.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is less than `other`,\n * else `false`.\n */\nfunction baseLt(value, other) {\n return value < other;\n}\n\nmodule.exports = baseLt;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlTHQuanM/OGQyMCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsRUFBRTtBQUNiLFdBQVcsRUFBRTtBQUNiLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwiZmlsZSI6IjIzNy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ubHRgIHdoaWNoIGRvZXNuJ3QgY29lcmNlIGFyZ3VtZW50cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7Kn0gb3RoZXIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBsZXNzIHRoYW4gYG90aGVyYCxcbiAqICBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VMdCh2YWx1ZSwgb3RoZXIpIHtcbiAgcmV0dXJuIHZhbHVlIDwgb3RoZXI7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUx0O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///237\n")},function(module,exports,__webpack_require__){"use strict";eval('\n\nvar _ = __webpack_require__(28);\nvar Graph = __webpack_require__(46).Graph;\nvar slack = __webpack_require__(116).slack;\n\n// module.exports = feasibleTree;\nmodule.exports = {\n feasibleTree: feasibleTree,\n feasibleTreeWithLayer: feasibleTreeWithLayer\n};\n\n/*\n * Constructs a spanning tree with tight edges and adjusted the input node\'s\n * ranks to achieve this. A tight edge is one that is has a length that matches\n * its "minlen" attribute.\n *\n * The basic structure for this function is derived from Gansner, et al., "A\n * Technique for Drawing Directed Graphs."\n *\n * Pre-conditions:\n *\n * 1. Graph must be a DAG.\n * 2. Graph must be connected.\n * 3. Graph must have at least one node.\n * 5. Graph nodes must have been previously assigned a "rank" property that\n * respects the "minlen" property of incident edges.\n * 6. Graph edges must have a "minlen" property.\n *\n * Post-conditions:\n *\n * - Graph nodes will have their rank adjusted to ensure that all edges are\n * tight.\n *\n * Returns a tree (undirected graph) that is constructed using only "tight"\n * edges.\n */\nfunction feasibleTree(g) {\n var t = new Graph({ directed: false });\n\n // Choose arbitrary node from which to start our tree\n var start = g.nodes()[0];\n var size = g.nodeCount();\n t.setNode(start, {});\n\n var edge, delta;\n while (tightTree(t, g) < size) {\n edge = findMinSlackEdge(t, g);\n delta = t.hasNode(edge.v) ? slack(g, edge) : -slack(g, edge);\n shiftRanks(t, g, delta);\n }\n\n return t;\n}\n\n/*\n * Finds a maximal tree of tight edges and returns the number of nodes in the\n * tree.\n */\nfunction tightTree(t, g) {\n function dfs(v) {\n _.forEach(g.nodeEdges(v), function(e) {\n var edgeV = e.v,\n w = (v === edgeV) ? e.w : edgeV;\n if (!t.hasNode(w) && !slack(g, e)) {\n t.setNode(w, {});\n t.setEdge(v, w, {});\n dfs(w);\n }\n });\n }\n\n _.forEach(t.nodes(), dfs);\n return t.nodeCount();\n}\n\n/*\n * Constructs a spanning tree with tight edges and adjusted the input node\'s\n * ranks to achieve this. A tight edge is one that is has a length that matches\n * its "minlen" attribute.\n *\n * The basic structure for this function is derived from Gansner, et al., "A\n * Technique for Drawing Directed Graphs."\n *\n * Pre-conditions:\n *\n * 1. Graph must be a DAG.\n * 2. Graph must be connected.\n * 3. Graph must have at least one node.\n * 5. Graph nodes must have been previously assigned a "rank" property that\n * respects the "minlen" property of incident edges.\n * 6. Graph edges must have a "minlen" property.\n *\n * Post-conditions:\n *\n * - Graph nodes will have their rank adjusted to ensure that all edges are\n * tight.\n *\n * Returns a tree (undirected graph) that is constructed using only "tight"\n * edges.\n */\nfunction feasibleTreeWithLayer(g) {\n var t = new Graph({ directed: false });\n\n // Choose arbitrary node from which to start our tree\n var start = g.nodes()[0];\n var size = g.nodeCount();\n t.setNode(start, {});\n\n var edge, delta;\n while (tightTreeWithLayer(t, g) < size) {\n edge = findMinSlackEdge(t, g);\n delta = t.hasNode(edge.v) ? slack(g, edge) : -slack(g, edge);\n shiftRanks(t, g, delta);\n }\n\n return t;\n}\n\n\n/*\n * Finds a maximal tree of tight edges and returns the number of nodes in the\n * tree.\n */\nfunction tightTreeWithLayer(t, g) {\n function dfs(v) {\n _.forEach(g.nodeEdges(v), function(e) {\n var edgeV = e.v,\n w = (v === edgeV) ? e.w : edgeV;\n // 对于指定layer的,直接加入tight-tree,不参与调整\n if (!t.hasNode(w) && (g.node(w).layer !== undefined || !slack(g, e))) {\n t.setNode(w, {});\n t.setEdge(v, w, {});\n dfs(w);\n }\n });\n }\n\n _.forEach(t.nodes(), dfs);\n return t.nodeCount();\n}\n\n/*\n * Finds the edge with the smallest slack that is incident on tree and returns\n * it.\n */\nfunction findMinSlackEdge(t, g) {\n return _.minBy(g.edges(), function(e) {\n if (t.hasNode(e.v) !== t.hasNode(e.w)) {\n return slack(g, e);\n }\n });\n}\n\nfunction shiftRanks(t, g, delta) {\n _.forEach(t.nodes(), function(v) {\n g.node(v).rank += delta;\n });\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZGFncmVqcy9saWIvcmFuay9mZWFzaWJsZS10cmVlLmpzPzE1MTUiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWIsUUFBUSxtQkFBTyxDQUFDLEVBQVc7QUFDM0IsWUFBWSxtQkFBTyxDQUFDLEVBQWE7QUFDakMsWUFBWSxtQkFBTyxDQUFDLEdBQVE7O0FBRTVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixrQkFBa0I7O0FBRXZDO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjs7QUFFckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUI7QUFDdkIsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsa0JBQWtCOztBQUV2QztBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7O0FBRXJCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCO0FBQ3ZCLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIIiwiZmlsZSI6IjIzOC5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG52YXIgXyA9IHJlcXVpcmUoXCIuLi9sb2Rhc2hcIik7XG52YXIgR3JhcGggPSByZXF1aXJlKFwiLi4vZ3JhcGhsaWJcIikuR3JhcGg7XG52YXIgc2xhY2sgPSByZXF1aXJlKFwiLi91dGlsXCIpLnNsYWNrO1xuXG4vLyBtb2R1bGUuZXhwb3J0cyA9IGZlYXNpYmxlVHJlZTtcbm1vZHVsZS5leHBvcnRzID0ge1xuICBmZWFzaWJsZVRyZWU6IGZlYXNpYmxlVHJlZSxcbiAgZmVhc2libGVUcmVlV2l0aExheWVyOiBmZWFzaWJsZVRyZWVXaXRoTGF5ZXJcbn07XG5cbi8qXG4gKiBDb25zdHJ1Y3RzIGEgc3Bhbm5pbmcgdHJlZSB3aXRoIHRpZ2h0IGVkZ2VzIGFuZCBhZGp1c3RlZCB0aGUgaW5wdXQgbm9kZSdzXG4gKiByYW5rcyB0byBhY2hpZXZlIHRoaXMuIEEgdGlnaHQgZWRnZSBpcyBvbmUgdGhhdCBpcyBoYXMgYSBsZW5ndGggdGhhdCBtYXRjaGVzXG4gKiBpdHMgXCJtaW5sZW5cIiBhdHRyaWJ1dGUuXG4gKlxuICogVGhlIGJhc2ljIHN0cnVjdHVyZSBmb3IgdGhpcyBmdW5jdGlvbiBpcyBkZXJpdmVkIGZyb20gR2Fuc25lciwgZXQgYWwuLCBcIkFcbiAqIFRlY2huaXF1ZSBmb3IgRHJhd2luZyBEaXJlY3RlZCBHcmFwaHMuXCJcbiAqXG4gKiBQcmUtY29uZGl0aW9uczpcbiAqXG4gKiAgICAxLiBHcmFwaCBtdXN0IGJlIGEgREFHLlxuICogICAgMi4gR3JhcGggbXVzdCBiZSBjb25uZWN0ZWQuXG4gKiAgICAzLiBHcmFwaCBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIG5vZGUuXG4gKiAgICA1LiBHcmFwaCBub2RlcyBtdXN0IGhhdmUgYmVlbiBwcmV2aW91c2x5IGFzc2lnbmVkIGEgXCJyYW5rXCIgcHJvcGVydHkgdGhhdFxuICogICAgICAgcmVzcGVjdHMgdGhlIFwibWlubGVuXCIgcHJvcGVydHkgb2YgaW5jaWRlbnQgZWRnZXMuXG4gKiAgICA2LiBHcmFwaCBlZGdlcyBtdXN0IGhhdmUgYSBcIm1pbmxlblwiIHByb3BlcnR5LlxuICpcbiAqIFBvc3QtY29uZGl0aW9uczpcbiAqXG4gKiAgICAtIEdyYXBoIG5vZGVzIHdpbGwgaGF2ZSB0aGVpciByYW5rIGFkanVzdGVkIHRvIGVuc3VyZSB0aGF0IGFsbCBlZGdlcyBhcmVcbiAqICAgICAgdGlnaHQuXG4gKlxuICogUmV0dXJucyBhIHRyZWUgKHVuZGlyZWN0ZWQgZ3JhcGgpIHRoYXQgaXMgY29uc3RydWN0ZWQgdXNpbmcgb25seSBcInRpZ2h0XCJcbiAqIGVkZ2VzLlxuICovXG5mdW5jdGlvbiBmZWFzaWJsZVRyZWUoZykge1xuICB2YXIgdCA9IG5ldyBHcmFwaCh7IGRpcmVjdGVkOiBmYWxzZSB9KTtcblxuICAvLyBDaG9vc2UgYXJiaXRyYXJ5IG5vZGUgZnJvbSB3aGljaCB0byBzdGFydCBvdXIgdHJlZVxuICB2YXIgc3RhcnQgPSBnLm5vZGVzKClbMF07XG4gIHZhciBzaXplID0gZy5ub2RlQ291bnQoKTtcbiAgdC5zZXROb2RlKHN0YXJ0LCB7fSk7XG5cbiAgdmFyIGVkZ2UsIGRlbHRhO1xuICB3aGlsZSAodGlnaHRUcmVlKHQsIGcpIDwgc2l6ZSkge1xuICAgIGVkZ2UgPSBmaW5kTWluU2xhY2tFZGdlKHQsIGcpO1xuICAgIGRlbHRhID0gdC5oYXNOb2RlKGVkZ2UudikgPyBzbGFjayhnLCBlZGdlKSA6IC1zbGFjayhnLCBlZGdlKTtcbiAgICBzaGlmdFJhbmtzKHQsIGcsIGRlbHRhKTtcbiAgfVxuXG4gIHJldHVybiB0O1xufVxuXG4vKlxuICogRmluZHMgYSBtYXhpbWFsIHRyZWUgb2YgdGlnaHQgZWRnZXMgYW5kIHJldHVybnMgdGhlIG51bWJlciBvZiBub2RlcyBpbiB0aGVcbiAqIHRyZWUuXG4gKi9cbmZ1bmN0aW9uIHRpZ2h0VHJlZSh0LCBnKSB7XG4gIGZ1bmN0aW9uIGRmcyh2KSB7XG4gICAgXy5mb3JFYWNoKGcubm9kZUVkZ2VzKHYpLCBmdW5jdGlvbihlKSB7XG4gICAgICB2YXIgZWRnZVYgPSBlLnYsXG4gICAgICAgIHcgPSAodiA9PT0gZWRnZVYpID8gZS53IDogZWRnZVY7XG4gICAgICBpZiAoIXQuaGFzTm9kZSh3KSAmJiAhc2xhY2soZywgZSkpIHtcbiAgICAgICAgdC5zZXROb2RlKHcsIHt9KTtcbiAgICAgICAgdC5zZXRFZGdlKHYsIHcsIHt9KTtcbiAgICAgICAgZGZzKHcpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgXy5mb3JFYWNoKHQubm9kZXMoKSwgZGZzKTtcbiAgcmV0dXJuIHQubm9kZUNvdW50KCk7XG59XG5cbi8qXG4gKiBDb25zdHJ1Y3RzIGEgc3Bhbm5pbmcgdHJlZSB3aXRoIHRpZ2h0IGVkZ2VzIGFuZCBhZGp1c3RlZCB0aGUgaW5wdXQgbm9kZSdzXG4gKiByYW5rcyB0byBhY2hpZXZlIHRoaXMuIEEgdGlnaHQgZWRnZSBpcyBvbmUgdGhhdCBpcyBoYXMgYSBsZW5ndGggdGhhdCBtYXRjaGVzXG4gKiBpdHMgXCJtaW5sZW5cIiBhdHRyaWJ1dGUuXG4gKlxuICogVGhlIGJhc2ljIHN0cnVjdHVyZSBmb3IgdGhpcyBmdW5jdGlvbiBpcyBkZXJpdmVkIGZyb20gR2Fuc25lciwgZXQgYWwuLCBcIkFcbiAqIFRlY2huaXF1ZSBmb3IgRHJhd2luZyBEaXJlY3RlZCBHcmFwaHMuXCJcbiAqXG4gKiBQcmUtY29uZGl0aW9uczpcbiAqXG4gKiAgICAxLiBHcmFwaCBtdXN0IGJlIGEgREFHLlxuICogICAgMi4gR3JhcGggbXVzdCBiZSBjb25uZWN0ZWQuXG4gKiAgICAzLiBHcmFwaCBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIG5vZGUuXG4gKiAgICA1LiBHcmFwaCBub2RlcyBtdXN0IGhhdmUgYmVlbiBwcmV2aW91c2x5IGFzc2lnbmVkIGEgXCJyYW5rXCIgcHJvcGVydHkgdGhhdFxuICogICAgICAgcmVzcGVjdHMgdGhlIFwibWlubGVuXCIgcHJvcGVydHkgb2YgaW5jaWRlbnQgZWRnZXMuXG4gKiAgICA2LiBHcmFwaCBlZGdlcyBtdXN0IGhhdmUgYSBcIm1pbmxlblwiIHByb3BlcnR5LlxuICpcbiAqIFBvc3QtY29uZGl0aW9uczpcbiAqXG4gKiAgICAtIEdyYXBoIG5vZGVzIHdpbGwgaGF2ZSB0aGVpciByYW5rIGFkanVzdGVkIHRvIGVuc3VyZSB0aGF0IGFsbCBlZGdlcyBhcmVcbiAqICAgICAgdGlnaHQuXG4gKlxuICogUmV0dXJucyBhIHRyZWUgKHVuZGlyZWN0ZWQgZ3JhcGgpIHRoYXQgaXMgY29uc3RydWN0ZWQgdXNpbmcgb25seSBcInRpZ2h0XCJcbiAqIGVkZ2VzLlxuICovXG5mdW5jdGlvbiBmZWFzaWJsZVRyZWVXaXRoTGF5ZXIoZykge1xuICB2YXIgdCA9IG5ldyBHcmFwaCh7IGRpcmVjdGVkOiBmYWxzZSB9KTtcblxuICAvLyBDaG9vc2UgYXJiaXRyYXJ5IG5vZGUgZnJvbSB3aGljaCB0byBzdGFydCBvdXIgdHJlZVxuICB2YXIgc3RhcnQgPSBnLm5vZGVzKClbMF07XG4gIHZhciBzaXplID0gZy5ub2RlQ291bnQoKTtcbiAgdC5zZXROb2RlKHN0YXJ0LCB7fSk7XG5cbiAgdmFyIGVkZ2UsIGRlbHRhO1xuICB3aGlsZSAodGlnaHRUcmVlV2l0aExheWVyKHQsIGcpIDwgc2l6ZSkge1xuICAgIGVkZ2UgPSBmaW5kTWluU2xhY2tFZGdlKHQsIGcpO1xuICAgIGRlbHRhID0gdC5oYXNOb2RlKGVkZ2UudikgPyBzbGFjayhnLCBlZGdlKSA6IC1zbGFjayhnLCBlZGdlKTtcbiAgICBzaGlmdFJhbmtzKHQsIGcsIGRlbHRhKTtcbiAgfVxuXG4gIHJldHVybiB0O1xufVxuXG5cbi8qXG4gKiBGaW5kcyBhIG1heGltYWwgdHJlZSBvZiB0aWdodCBlZGdlcyBhbmQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIG5vZGVzIGluIHRoZVxuICogdHJlZS5cbiAqL1xuZnVuY3Rpb24gdGlnaHRUcmVlV2l0aExheWVyKHQsIGcpIHtcbiAgZnVuY3Rpb24gZGZzKHYpIHtcbiAgICBfLmZvckVhY2goZy5ub2RlRWRnZXModiksIGZ1bmN0aW9uKGUpIHtcbiAgICAgIHZhciBlZGdlViA9IGUudixcbiAgICAgICAgdyA9ICh2ID09PSBlZGdlVikgPyBlLncgOiBlZGdlVjtcbiAgICAgIC8vIOWvueS6juaMh+WummxheWVy55qE77yM55u05o6l5Yqg5YWldGlnaHQtdHJlZe+8jOS4jeWPguS4juiwg+aVtFxuICAgICAgaWYgKCF0Lmhhc05vZGUodykgJiYgKGcubm9kZSh3KS5sYXllciAhPT0gdW5kZWZpbmVkIHx8ICFzbGFjayhnLCBlKSkpIHtcbiAgICAgICAgdC5zZXROb2RlKHcsIHt9KTtcbiAgICAgICAgdC5zZXRFZGdlKHYsIHcsIHt9KTtcbiAgICAgICAgZGZzKHcpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgXy5mb3JFYWNoKHQubm9kZXMoKSwgZGZzKTtcbiAgcmV0dXJuIHQubm9kZUNvdW50KCk7XG59XG5cbi8qXG4gKiBGaW5kcyB0aGUgZWRnZSB3aXRoIHRoZSBzbWFsbGVzdCBzbGFjayB0aGF0IGlzIGluY2lkZW50IG9uIHRyZWUgYW5kIHJldHVybnNcbiAqIGl0LlxuICovXG5mdW5jdGlvbiBmaW5kTWluU2xhY2tFZGdlKHQsIGcpIHtcbiAgcmV0dXJuIF8ubWluQnkoZy5lZGdlcygpLCBmdW5jdGlvbihlKSB7XG4gICAgaWYgKHQuaGFzTm9kZShlLnYpICE9PSB0Lmhhc05vZGUoZS53KSkge1xuICAgICAgcmV0dXJuIHNsYWNrKGcsIGUpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHNoaWZ0UmFua3ModCwgZywgZGVsdGEpIHtcbiAgXy5mb3JFYWNoKHQubm9kZXMoKSwgZnVuY3Rpb24odikge1xuICAgIGcubm9kZSh2KS5yYW5rICs9IGRlbHRhO1xuICB9KTtcbn1cbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///238\n')},function(module,exports,__webpack_require__){eval('/* WEBPACK VAR INJECTION */(function(process, global) {/*! *****************************************************************************\nCopyright (C) Microsoft. All rights reserved.\nLicensed under the Apache License, Version 2.0 (the "License"); you may not use\nthis file except in compliance with the License. You may obtain a copy of the\nLicense at http://www.apache.org/licenses/LICENSE-2.0\n\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\nMERCHANTABLITY OR NON-INFRINGEMENT.\n\nSee the Apache Version 2.0 License for specific language governing permissions\nand limitations under the License.\n***************************************************************************** */\nvar Reflect;\n(function (Reflect) {\n // Metadata Proposal\n // https://rbuckton.github.io/reflect-metadata/\n (function (factory) {\n var root = typeof global === "object" ? global :\n typeof self === "object" ? self :\n typeof this === "object" ? this :\n Function("return this;")();\n var exporter = makeExporter(Reflect);\n if (typeof root.Reflect === "undefined") {\n root.Reflect = Reflect;\n }\n else {\n exporter = makeExporter(root.Reflect, exporter);\n }\n factory(exporter);\n function makeExporter(target, previous) {\n return function (key, value) {\n if (typeof target[key] !== "function") {\n Object.defineProperty(target, key, { configurable: true, writable: true, value: value });\n }\n if (previous)\n previous(key, value);\n };\n }\n })(function (exporter) {\n var hasOwn = Object.prototype.hasOwnProperty;\n // feature test for Symbol support\n var supportsSymbol = typeof Symbol === "function";\n var toPrimitiveSymbol = supportsSymbol && typeof Symbol.toPrimitive !== "undefined" ? Symbol.toPrimitive : "@@toPrimitive";\n var iteratorSymbol = supportsSymbol && typeof Symbol.iterator !== "undefined" ? Symbol.iterator : "@@iterator";\n var supportsCreate = typeof Object.create === "function"; // feature test for Object.create support\n var supportsProto = { __proto__: [] } instanceof Array; // feature test for __proto__ support\n var downLevel = !supportsCreate && !supportsProto;\n var HashMap = {\n // create an object in dictionary mode (a.k.a. "slow" mode in v8)\n create: supportsCreate\n ? function () { return MakeDictionary(Object.create(null)); }\n : supportsProto\n ? function () { return MakeDictionary({ __proto__: null }); }\n : function () { return MakeDictionary({}); },\n has: downLevel\n ? function (map, key) { return hasOwn.call(map, key); }\n : function (map, key) { return key in map; },\n get: downLevel\n ? function (map, key) { return hasOwn.call(map, key) ? map[key] : undefined; }\n : function (map, key) { return map[key]; },\n };\n // Load global or shim versions of Map, Set, and WeakMap\n var functionPrototype = Object.getPrototypeOf(Function);\n var usePolyfill = typeof process === "object" && process.env && process.env["REFLECT_METADATA_USE_MAP_POLYFILL"] === "true";\n var _Map = !usePolyfill && typeof Map === "function" && typeof Map.prototype.entries === "function" ? Map : CreateMapPolyfill();\n var _Set = !usePolyfill && typeof Set === "function" && typeof Set.prototype.entries === "function" ? Set : CreateSetPolyfill();\n var _WeakMap = !usePolyfill && typeof WeakMap === "function" ? WeakMap : CreateWeakMapPolyfill();\n // [[Metadata]] internal slot\n // https://rbuckton.github.io/reflect-metadata/#ordinary-object-internal-methods-and-internal-slots\n var Metadata = new _WeakMap();\n /**\n * Applies a set of decorators to a property of a target object.\n * @param decorators An array of decorators.\n * @param target The target object.\n * @param propertyKey (Optional) The property key to decorate.\n * @param attributes (Optional) The property descriptor for the target key.\n * @remarks Decorators are applied in reverse order.\n * @example\n *\n * class Example {\n * // property declarations are not part of ES6, though they are valid in TypeScript:\n * // static staticProperty;\n * // property;\n *\n * constructor(p) { }\n * static staticMethod(p) { }\n * method(p) { }\n * }\n *\n * // constructor\n * Example = Reflect.decorate(decoratorsArray, Example);\n *\n * // property (on constructor)\n * Reflect.decorate(decoratorsArray, Example, "staticProperty");\n *\n * // property (on prototype)\n * Reflect.decorate(decoratorsArray, Example.prototype, "property");\n *\n * // method (on constructor)\n * Object.defineProperty(Example, "staticMethod",\n * Reflect.decorate(decoratorsArray, Example, "staticMethod",\n * Object.getOwnPropertyDescriptor(Example, "staticMethod")));\n *\n * // method (on prototype)\n * Object.defineProperty(Example.prototype, "method",\n * Reflect.decorate(decoratorsArray, Example.prototype, "method",\n * Object.getOwnPropertyDescriptor(Example.prototype, "method")));\n *\n */\n function decorate(decorators, target, propertyKey, attributes) {\n if (!IsUndefined(propertyKey)) {\n if (!IsArray(decorators))\n throw new TypeError();\n if (!IsObject(target))\n throw new TypeError();\n if (!IsObject(attributes) && !IsUndefined(attributes) && !IsNull(attributes))\n throw new TypeError();\n if (IsNull(attributes))\n attributes = undefined;\n propertyKey = ToPropertyKey(propertyKey);\n return DecorateProperty(decorators, target, propertyKey, attributes);\n }\n else {\n if (!IsArray(decorators))\n throw new TypeError();\n if (!IsConstructor(target))\n throw new TypeError();\n return DecorateConstructor(decorators, target);\n }\n }\n exporter("decorate", decorate);\n // 4.1.2 Reflect.metadata(metadataKey, metadataValue)\n // https://rbuckton.github.io/reflect-metadata/#reflect.metadata\n /**\n * A default metadata decorator factory that can be used on a class, class member, or parameter.\n * @param metadataKey The key for the metadata entry.\n * @param metadataValue The value for the metadata entry.\n * @returns A decorator function.\n * @remarks\n * If `metadataKey` is already defined for the target and target key, the\n * metadataValue for that key will be overwritten.\n * @example\n *\n * // constructor\n * @Reflect.metadata(key, value)\n * class Example {\n * }\n *\n * // property (on constructor, TypeScript only)\n * class Example {\n * @Reflect.metadata(key, value)\n * static staticProperty;\n * }\n *\n * // property (on prototype, TypeScript only)\n * class Example {\n * @Reflect.metadata(key, value)\n * property;\n * }\n *\n * // method (on constructor)\n * class Example {\n * @Reflect.metadata(key, value)\n * static staticMethod() { }\n * }\n *\n * // method (on prototype)\n * class Example {\n * @Reflect.metadata(key, value)\n * method() { }\n * }\n *\n */\n function metadata(metadataKey, metadataValue) {\n function decorator(target, propertyKey) {\n if (!IsObject(target))\n throw new TypeError();\n if (!IsUndefined(propertyKey) && !IsPropertyKey(propertyKey))\n throw new TypeError();\n OrdinaryDefineOwnMetadata(metadataKey, metadataValue, target, propertyKey);\n }\n return decorator;\n }\n exporter("metadata", metadata);\n /**\n * Define a unique metadata entry on the target.\n * @param metadataKey A key used to store and retrieve metadata.\n * @param metadataValue A value that contains attached metadata.\n * @param target The target object on which to define metadata.\n * @param propertyKey (Optional) The property key for the target.\n * @example\n *\n * class Example {\n * // property declarations are not part of ES6, though they are valid in TypeScript:\n * // static staticProperty;\n * // property;\n *\n * constructor(p) { }\n * static staticMethod(p) { }\n * method(p) { }\n * }\n *\n * // constructor\n * Reflect.defineMetadata("custom:annotation", options, Example);\n *\n * // property (on constructor)\n * Reflect.defineMetadata("custom:annotation", options, Example, "staticProperty");\n *\n * // property (on prototype)\n * Reflect.defineMetadata("custom:annotation", options, Example.prototype, "property");\n *\n * // method (on constructor)\n * Reflect.defineMetadata("custom:annotation", options, Example, "staticMethod");\n *\n * // method (on prototype)\n * Reflect.defineMetadata("custom:annotation", options, Example.prototype, "method");\n *\n * // decorator factory as metadata-producing annotation.\n * function MyAnnotation(options): Decorator {\n * return (target, key?) => Reflect.defineMetadata("custom:annotation", options, target, key);\n * }\n *\n */\n function defineMetadata(metadataKey, metadataValue, target, propertyKey) {\n if (!IsObject(target))\n throw new TypeError();\n if (!IsUndefined(propertyKey))\n propertyKey = ToPropertyKey(propertyKey);\n return OrdinaryDefineOwnMetadata(metadataKey, metadataValue, target, propertyKey);\n }\n exporter("defineMetadata", defineMetadata);\n /**\n * Gets a value indicating whether the target object or its prototype chain has the provided metadata key defined.\n * @param metadataKey A key used to store and retrieve metadata.\n * @param target The target object on which the metadata is defined.\n * @param propertyKey (Optional) The property key for the target.\n * @returns `true` if the metadata key was defined on the target object or its prototype chain; otherwise, `false`.\n * @example\n *\n * class Example {\n * // property declarations are not part of ES6, though they are valid in TypeScript:\n * // static staticProperty;\n * // property;\n *\n * constructor(p) { }\n * static staticMethod(p) { }\n * method(p) { }\n * }\n *\n * // constructor\n * result = Reflect.hasMetadata("custom:annotation", Example);\n *\n * // property (on constructor)\n * result = Reflect.hasMetadata("custom:annotation", Example, "staticProperty");\n *\n * // property (on prototype)\n * result = Reflect.hasMetadata("custom:annotation", Example.prototype, "property");\n *\n * // method (on constructor)\n * result = Reflect.hasMetadata("custom:annotation", Example, "staticMethod");\n *\n * // method (on prototype)\n * result = Reflect.hasMetadata("custom:annotation", Example.prototype, "method");\n *\n */\n function hasMetadata(metadataKey, target, propertyKey) {\n if (!IsObject(target))\n throw new TypeError();\n if (!IsUndefined(propertyKey))\n propertyKey = ToPropertyKey(propertyKey);\n return OrdinaryHasMetadata(metadataKey, target, propertyKey);\n }\n exporter("hasMetadata", hasMetadata);\n /**\n * Gets a value indicating whether the target object has the provided metadata key defined.\n * @param metadataKey A key used to store and retrieve metadata.\n * @param target The target object on which the metadata is defined.\n * @param propertyKey (Optional) The property key for the target.\n * @returns `true` if the metadata key was defined on the target object; otherwise, `false`.\n * @example\n *\n * class Example {\n * // property declarations are not part of ES6, though they are valid in TypeScript:\n * // static staticProperty;\n * // property;\n *\n * constructor(p) { }\n * static staticMethod(p) { }\n * method(p) { }\n * }\n *\n * // constructor\n * result = Reflect.hasOwnMetadata("custom:annotation", Example);\n *\n * // property (on constructor)\n * result = Reflect.hasOwnMetadata("custom:annotation", Example, "staticProperty");\n *\n * // property (on prototype)\n * result = Reflect.hasOwnMetadata("custom:annotation", Example.prototype, "property");\n *\n * // method (on constructor)\n * result = Reflect.hasOwnMetadata("custom:annotation", Example, "staticMethod");\n *\n * // method (on prototype)\n * result = Reflect.hasOwnMetadata("custom:annotation", Example.prototype, "method");\n *\n */\n function hasOwnMetadata(metadataKey, target, propertyKey) {\n if (!IsObject(target))\n throw new TypeError();\n if (!IsUndefined(propertyKey))\n propertyKey = ToPropertyKey(propertyKey);\n return OrdinaryHasOwnMetadata(metadataKey, target, propertyKey);\n }\n exporter("hasOwnMetadata", hasOwnMetadata);\n /**\n * Gets the metadata value for the provided metadata key on the target object or its prototype chain.\n * @param metadataKey A key used to store and retrieve metadata.\n * @param target The target object on which the metadata is defined.\n * @param propertyKey (Optional) The property key for the target.\n * @returns The metadata value for the metadata key if found; otherwise, `undefined`.\n * @example\n *\n * class Example {\n * // property declarations are not part of ES6, though they are valid in TypeScript:\n * // static staticProperty;\n * // property;\n *\n * constructor(p) { }\n * static staticMethod(p) { }\n * method(p) { }\n * }\n *\n * // constructor\n * result = Reflect.getMetadata("custom:annotation", Example);\n *\n * // property (on constructor)\n * result = Reflect.getMetadata("custom:annotation", Example, "staticProperty");\n *\n * // property (on prototype)\n * result = Reflect.getMetadata("custom:annotation", Example.prototype, "property");\n *\n * // method (on constructor)\n * result = Reflect.getMetadata("custom:annotation", Example, "staticMethod");\n *\n * // method (on prototype)\n * result = Reflect.getMetadata("custom:annotation", Example.prototype, "method");\n *\n */\n function getMetadata(metadataKey, target, propertyKey) {\n if (!IsObject(target))\n throw new TypeError();\n if (!IsUndefined(propertyKey))\n propertyKey = ToPropertyKey(propertyKey);\n return OrdinaryGetMetadata(metadataKey, target, propertyKey);\n }\n exporter("getMetadata", getMetadata);\n /**\n * Gets the metadata value for the provided metadata key on the target object.\n * @param metadataKey A key used to store and retrieve metadata.\n * @param target The target object on which the metadata is defined.\n * @param propertyKey (Optional) The property key for the target.\n * @returns The metadata value for the metadata key if found; otherwise, `undefined`.\n * @example\n *\n * class Example {\n * // property declarations are not part of ES6, though they are valid in TypeScript:\n * // static staticProperty;\n * // property;\n *\n * constructor(p) { }\n * static staticMethod(p) { }\n * method(p) { }\n * }\n *\n * // constructor\n * result = Reflect.getOwnMetadata("custom:annotation", Example);\n *\n * // property (on constructor)\n * result = Reflect.getOwnMetadata("custom:annotation", Example, "staticProperty");\n *\n * // property (on prototype)\n * result = Reflect.getOwnMetadata("custom:annotation", Example.prototype, "property");\n *\n * // method (on constructor)\n * result = Reflect.getOwnMetadata("custom:annotation", Example, "staticMethod");\n *\n * // method (on prototype)\n * result = Reflect.getOwnMetadata("custom:annotation", Example.prototype, "method");\n *\n */\n function getOwnMetadata(metadataKey, target, propertyKey) {\n if (!IsObject(target))\n throw new TypeError();\n if (!IsUndefined(propertyKey))\n propertyKey = ToPropertyKey(propertyKey);\n return OrdinaryGetOwnMetadata(metadataKey, target, propertyKey);\n }\n exporter("getOwnMetadata", getOwnMetadata);\n /**\n * Gets the metadata keys defined on the target object or its prototype chain.\n * @param target The target object on which the metadata is defined.\n * @param propertyKey (Optional) The property key for the target.\n * @returns An array of unique metadata keys.\n * @example\n *\n * class Example {\n * // property declarations are not part of ES6, though they are valid in TypeScript:\n * // static staticProperty;\n * // property;\n *\n * constructor(p) { }\n * static staticMethod(p) { }\n * method(p) { }\n * }\n *\n * // constructor\n * result = Reflect.getMetadataKeys(Example);\n *\n * // property (on constructor)\n * result = Reflect.getMetadataKeys(Example, "staticProperty");\n *\n * // property (on prototype)\n * result = Reflect.getMetadataKeys(Example.prototype, "property");\n *\n * // method (on constructor)\n * result = Reflect.getMetadataKeys(Example, "staticMethod");\n *\n * // method (on prototype)\n * result = Reflect.getMetadataKeys(Example.prototype, "method");\n *\n */\n function getMetadataKeys(target, propertyKey) {\n if (!IsObject(target))\n throw new TypeError();\n if (!IsUndefined(propertyKey))\n propertyKey = ToPropertyKey(propertyKey);\n return OrdinaryMetadataKeys(target, propertyKey);\n }\n exporter("getMetadataKeys", getMetadataKeys);\n /**\n * Gets the unique metadata keys defined on the target object.\n * @param target The target object on which the metadata is defined.\n * @param propertyKey (Optional) The property key for the target.\n * @returns An array of unique metadata keys.\n * @example\n *\n * class Example {\n * // property declarations are not part of ES6, though they are valid in TypeScript:\n * // static staticProperty;\n * // property;\n *\n * constructor(p) { }\n * static staticMethod(p) { }\n * method(p) { }\n * }\n *\n * // constructor\n * result = Reflect.getOwnMetadataKeys(Example);\n *\n * // property (on constructor)\n * result = Reflect.getOwnMetadataKeys(Example, "staticProperty");\n *\n * // property (on prototype)\n * result = Reflect.getOwnMetadataKeys(Example.prototype, "property");\n *\n * // method (on constructor)\n * result = Reflect.getOwnMetadataKeys(Example, "staticMethod");\n *\n * // method (on prototype)\n * result = Reflect.getOwnMetadataKeys(Example.prototype, "method");\n *\n */\n function getOwnMetadataKeys(target, propertyKey) {\n if (!IsObject(target))\n throw new TypeError();\n if (!IsUndefined(propertyKey))\n propertyKey = ToPropertyKey(propertyKey);\n return OrdinaryOwnMetadataKeys(target, propertyKey);\n }\n exporter("getOwnMetadataKeys", getOwnMetadataKeys);\n /**\n * Deletes the metadata entry from the target object with the provided key.\n * @param metadataKey A key used to store and retrieve metadata.\n * @param target The target object on which the metadata is defined.\n * @param propertyKey (Optional) The property key for the target.\n * @returns `true` if the metadata entry was found and deleted; otherwise, false.\n * @example\n *\n * class Example {\n * // property declarations are not part of ES6, though they are valid in TypeScript:\n * // static staticProperty;\n * // property;\n *\n * constructor(p) { }\n * static staticMethod(p) { }\n * method(p) { }\n * }\n *\n * // constructor\n * result = Reflect.deleteMetadata("custom:annotation", Example);\n *\n * // property (on constructor)\n * result = Reflect.deleteMetadata("custom:annotation", Example, "staticProperty");\n *\n * // property (on prototype)\n * result = Reflect.deleteMetadata("custom:annotation", Example.prototype, "property");\n *\n * // method (on constructor)\n * result = Reflect.deleteMetadata("custom:annotation", Example, "staticMethod");\n *\n * // method (on prototype)\n * result = Reflect.deleteMetadata("custom:annotation", Example.prototype, "method");\n *\n */\n function deleteMetadata(metadataKey, target, propertyKey) {\n if (!IsObject(target))\n throw new TypeError();\n if (!IsUndefined(propertyKey))\n propertyKey = ToPropertyKey(propertyKey);\n var metadataMap = GetOrCreateMetadataMap(target, propertyKey, /*Create*/ false);\n if (IsUndefined(metadataMap))\n return false;\n if (!metadataMap.delete(metadataKey))\n return false;\n if (metadataMap.size > 0)\n return true;\n var targetMetadata = Metadata.get(target);\n targetMetadata.delete(propertyKey);\n if (targetMetadata.size > 0)\n return true;\n Metadata.delete(target);\n return true;\n }\n exporter("deleteMetadata", deleteMetadata);\n function DecorateConstructor(decorators, target) {\n for (var i = decorators.length - 1; i >= 0; --i) {\n var decorator = decorators[i];\n var decorated = decorator(target);\n if (!IsUndefined(decorated) && !IsNull(decorated)) {\n if (!IsConstructor(decorated))\n throw new TypeError();\n target = decorated;\n }\n }\n return target;\n }\n function DecorateProperty(decorators, target, propertyKey, descriptor) {\n for (var i = decorators.length - 1; i >= 0; --i) {\n var decorator = decorators[i];\n var decorated = decorator(target, propertyKey, descriptor);\n if (!IsUndefined(decorated) && !IsNull(decorated)) {\n if (!IsObject(decorated))\n throw new TypeError();\n descriptor = decorated;\n }\n }\n return descriptor;\n }\n function GetOrCreateMetadataMap(O, P, Create) {\n var targetMetadata = Metadata.get(O);\n if (IsUndefined(targetMetadata)) {\n if (!Create)\n return undefined;\n targetMetadata = new _Map();\n Metadata.set(O, targetMetadata);\n }\n var metadataMap = targetMetadata.get(P);\n if (IsUndefined(metadataMap)) {\n if (!Create)\n return undefined;\n metadataMap = new _Map();\n targetMetadata.set(P, metadataMap);\n }\n return metadataMap;\n }\n // 3.1.1.1 OrdinaryHasMetadata(MetadataKey, O, P)\n // https://rbuckton.github.io/reflect-metadata/#ordinaryhasmetadata\n function OrdinaryHasMetadata(MetadataKey, O, P) {\n var hasOwn = OrdinaryHasOwnMetadata(MetadataKey, O, P);\n if (hasOwn)\n return true;\n var parent = OrdinaryGetPrototypeOf(O);\n if (!IsNull(parent))\n return OrdinaryHasMetadata(MetadataKey, parent, P);\n return false;\n }\n // 3.1.2.1 OrdinaryHasOwnMetadata(MetadataKey, O, P)\n // https://rbuckton.github.io/reflect-metadata/#ordinaryhasownmetadata\n function OrdinaryHasOwnMetadata(MetadataKey, O, P) {\n var metadataMap = GetOrCreateMetadataMap(O, P, /*Create*/ false);\n if (IsUndefined(metadataMap))\n return false;\n return ToBoolean(metadataMap.has(MetadataKey));\n }\n // 3.1.3.1 OrdinaryGetMetadata(MetadataKey, O, P)\n // https://rbuckton.github.io/reflect-metadata/#ordinarygetmetadata\n function OrdinaryGetMetadata(MetadataKey, O, P) {\n var hasOwn = OrdinaryHasOwnMetadata(MetadataKey, O, P);\n if (hasOwn)\n return OrdinaryGetOwnMetadata(MetadataKey, O, P);\n var parent = OrdinaryGetPrototypeOf(O);\n if (!IsNull(parent))\n return OrdinaryGetMetadata(MetadataKey, parent, P);\n return undefined;\n }\n // 3.1.4.1 OrdinaryGetOwnMetadata(MetadataKey, O, P)\n // https://rbuckton.github.io/reflect-metadata/#ordinarygetownmetadata\n function OrdinaryGetOwnMetadata(MetadataKey, O, P) {\n var metadataMap = GetOrCreateMetadataMap(O, P, /*Create*/ false);\n if (IsUndefined(metadataMap))\n return undefined;\n return metadataMap.get(MetadataKey);\n }\n // 3.1.5.1 OrdinaryDefineOwnMetadata(MetadataKey, MetadataValue, O, P)\n // https://rbuckton.github.io/reflect-metadata/#ordinarydefineownmetadata\n function OrdinaryDefineOwnMetadata(MetadataKey, MetadataValue, O, P) {\n var metadataMap = GetOrCreateMetadataMap(O, P, /*Create*/ true);\n metadataMap.set(MetadataKey, MetadataValue);\n }\n // 3.1.6.1 OrdinaryMetadataKeys(O, P)\n // https://rbuckton.github.io/reflect-metadata/#ordinarymetadatakeys\n function OrdinaryMetadataKeys(O, P) {\n var ownKeys = OrdinaryOwnMetadataKeys(O, P);\n var parent = OrdinaryGetPrototypeOf(O);\n if (parent === null)\n return ownKeys;\n var parentKeys = OrdinaryMetadataKeys(parent, P);\n if (parentKeys.length <= 0)\n return ownKeys;\n if (ownKeys.length <= 0)\n return parentKeys;\n var set = new _Set();\n var keys = [];\n for (var _i = 0, ownKeys_1 = ownKeys; _i < ownKeys_1.length; _i++) {\n var key = ownKeys_1[_i];\n var hasKey = set.has(key);\n if (!hasKey) {\n set.add(key);\n keys.push(key);\n }\n }\n for (var _a = 0, parentKeys_1 = parentKeys; _a < parentKeys_1.length; _a++) {\n var key = parentKeys_1[_a];\n var hasKey = set.has(key);\n if (!hasKey) {\n set.add(key);\n keys.push(key);\n }\n }\n return keys;\n }\n // 3.1.7.1 OrdinaryOwnMetadataKeys(O, P)\n // https://rbuckton.github.io/reflect-metadata/#ordinaryownmetadatakeys\n function OrdinaryOwnMetadataKeys(O, P) {\n var keys = [];\n var metadataMap = GetOrCreateMetadataMap(O, P, /*Create*/ false);\n if (IsUndefined(metadataMap))\n return keys;\n var keysObj = metadataMap.keys();\n var iterator = GetIterator(keysObj);\n var k = 0;\n while (true) {\n var next = IteratorStep(iterator);\n if (!next) {\n keys.length = k;\n return keys;\n }\n var nextValue = IteratorValue(next);\n try {\n keys[k] = nextValue;\n }\n catch (e) {\n try {\n IteratorClose(iterator);\n }\n finally {\n throw e;\n }\n }\n k++;\n }\n }\n // 6 ECMAScript Data Typ0es and Values\n // https://tc39.github.io/ecma262/#sec-ecmascript-data-types-and-values\n function Type(x) {\n if (x === null)\n return 1 /* Null */;\n switch (typeof x) {\n case "undefined": return 0 /* Undefined */;\n case "boolean": return 2 /* Boolean */;\n case "string": return 3 /* String */;\n case "symbol": return 4 /* Symbol */;\n case "number": return 5 /* Number */;\n case "object": return x === null ? 1 /* Null */ : 6 /* Object */;\n default: return 6 /* Object */;\n }\n }\n // 6.1.1 The Undefined Type\n // https://tc39.github.io/ecma262/#sec-ecmascript-language-types-undefined-type\n function IsUndefined(x) {\n return x === undefined;\n }\n // 6.1.2 The Null Type\n // https://tc39.github.io/ecma262/#sec-ecmascript-language-types-null-type\n function IsNull(x) {\n return x === null;\n }\n // 6.1.5 The Symbol Type\n // https://tc39.github.io/ecma262/#sec-ecmascript-language-types-symbol-type\n function IsSymbol(x) {\n return typeof x === "symbol";\n }\n // 6.1.7 The Object Type\n // https://tc39.github.io/ecma262/#sec-object-type\n function IsObject(x) {\n return typeof x === "object" ? x !== null : typeof x === "function";\n }\n // 7.1 Type Conversion\n // https://tc39.github.io/ecma262/#sec-type-conversion\n // 7.1.1 ToPrimitive(input [, PreferredType])\n // https://tc39.github.io/ecma262/#sec-toprimitive\n function ToPrimitive(input, PreferredType) {\n switch (Type(input)) {\n case 0 /* Undefined */: return input;\n case 1 /* Null */: return input;\n case 2 /* Boolean */: return input;\n case 3 /* String */: return input;\n case 4 /* Symbol */: return input;\n case 5 /* Number */: return input;\n }\n var hint = PreferredType === 3 /* String */ ? "string" : PreferredType === 5 /* Number */ ? "number" : "default";\n var exoticToPrim = GetMethod(input, toPrimitiveSymbol);\n if (exoticToPrim !== undefined) {\n var result = exoticToPrim.call(input, hint);\n if (IsObject(result))\n throw new TypeError();\n return result;\n }\n return OrdinaryToPrimitive(input, hint === "default" ? "number" : hint);\n }\n // 7.1.1.1 OrdinaryToPrimitive(O, hint)\n // https://tc39.github.io/ecma262/#sec-ordinarytoprimitive\n function OrdinaryToPrimitive(O, hint) {\n if (hint === "string") {\n var toString_1 = O.toString;\n if (IsCallable(toString_1)) {\n var result = toString_1.call(O);\n if (!IsObject(result))\n return result;\n }\n var valueOf = O.valueOf;\n if (IsCallable(valueOf)) {\n var result = valueOf.call(O);\n if (!IsObject(result))\n return result;\n }\n }\n else {\n var valueOf = O.valueOf;\n if (IsCallable(valueOf)) {\n var result = valueOf.call(O);\n if (!IsObject(result))\n return result;\n }\n var toString_2 = O.toString;\n if (IsCallable(toString_2)) {\n var result = toString_2.call(O);\n if (!IsObject(result))\n return result;\n }\n }\n throw new TypeError();\n }\n // 7.1.2 ToBoolean(argument)\n // https://tc39.github.io/ecma262/2016/#sec-toboolean\n function ToBoolean(argument) {\n return !!argument;\n }\n // 7.1.12 ToString(argument)\n // https://tc39.github.io/ecma262/#sec-tostring\n function ToString(argument) {\n return "" + argument;\n }\n // 7.1.14 ToPropertyKey(argument)\n // https://tc39.github.io/ecma262/#sec-topropertykey\n function ToPropertyKey(argument) {\n var key = ToPrimitive(argument, 3 /* String */);\n if (IsSymbol(key))\n return key;\n return ToString(key);\n }\n // 7.2 Testing and Comparison Operations\n // https://tc39.github.io/ecma262/#sec-testing-and-comparison-operations\n // 7.2.2 IsArray(argument)\n // https://tc39.github.io/ecma262/#sec-isarray\n function IsArray(argument) {\n return Array.isArray\n ? Array.isArray(argument)\n : argument instanceof Object\n ? argument instanceof Array\n : Object.prototype.toString.call(argument) === "[object Array]";\n }\n // 7.2.3 IsCallable(argument)\n // https://tc39.github.io/ecma262/#sec-iscallable\n function IsCallable(argument) {\n // NOTE: This is an approximation as we cannot check for [[Call]] internal method.\n return typeof argument === "function";\n }\n // 7.2.4 IsConstructor(argument)\n // https://tc39.github.io/ecma262/#sec-isconstructor\n function IsConstructor(argument) {\n // NOTE: This is an approximation as we cannot check for [[Construct]] internal method.\n return typeof argument === "function";\n }\n // 7.2.7 IsPropertyKey(argument)\n // https://tc39.github.io/ecma262/#sec-ispropertykey\n function IsPropertyKey(argument) {\n switch (Type(argument)) {\n case 3 /* String */: return true;\n case 4 /* Symbol */: return true;\n default: return false;\n }\n }\n // 7.3 Operations on Objects\n // https://tc39.github.io/ecma262/#sec-operations-on-objects\n // 7.3.9 GetMethod(V, P)\n // https://tc39.github.io/ecma262/#sec-getmethod\n function GetMethod(V, P) {\n var func = V[P];\n if (func === undefined || func === null)\n return undefined;\n if (!IsCallable(func))\n throw new TypeError();\n return func;\n }\n // 7.4 Operations on Iterator Objects\n // https://tc39.github.io/ecma262/#sec-operations-on-iterator-objects\n function GetIterator(obj) {\n var method = GetMethod(obj, iteratorSymbol);\n if (!IsCallable(method))\n throw new TypeError(); // from Call\n var iterator = method.call(obj);\n if (!IsObject(iterator))\n throw new TypeError();\n return iterator;\n }\n // 7.4.4 IteratorValue(iterResult)\n // https://tc39.github.io/ecma262/2016/#sec-iteratorvalue\n function IteratorValue(iterResult) {\n return iterResult.value;\n }\n // 7.4.5 IteratorStep(iterator)\n // https://tc39.github.io/ecma262/#sec-iteratorstep\n function IteratorStep(iterator) {\n var result = iterator.next();\n return result.done ? false : result;\n }\n // 7.4.6 IteratorClose(iterator, completion)\n // https://tc39.github.io/ecma262/#sec-iteratorclose\n function IteratorClose(iterator) {\n var f = iterator["return"];\n if (f)\n f.call(iterator);\n }\n // 9.1 Ordinary Object Internal Methods and Internal Slots\n // https://tc39.github.io/ecma262/#sec-ordinary-object-internal-methods-and-internal-slots\n // 9.1.1.1 OrdinaryGetPrototypeOf(O)\n // https://tc39.github.io/ecma262/#sec-ordinarygetprototypeof\n function OrdinaryGetPrototypeOf(O) {\n var proto = Object.getPrototypeOf(O);\n if (typeof O !== "function" || O === functionPrototype)\n return proto;\n // TypeScript doesn\'t set __proto__ in ES5, as it\'s non-standard.\n // Try to determine the superclass constructor. Compatible implementations\n // must either set __proto__ on a subclass constructor to the superclass constructor,\n // or ensure each class has a valid `constructor` property on its prototype that\n // points back to the constructor.\n // If this is not the same as Function.[[Prototype]], then this is definately inherited.\n // This is the case when in ES6 or when using __proto__ in a compatible browser.\n if (proto !== functionPrototype)\n return proto;\n // If the super prototype is Object.prototype, null, or undefined, then we cannot determine the heritage.\n var prototype = O.prototype;\n var prototypeProto = prototype && Object.getPrototypeOf(prototype);\n if (prototypeProto == null || prototypeProto === Object.prototype)\n return proto;\n // If the constructor was not a function, then we cannot determine the heritage.\n var constructor = prototypeProto.constructor;\n if (typeof constructor !== "function")\n return proto;\n // If we have some kind of self-reference, then we cannot determine the heritage.\n if (constructor === O)\n return proto;\n // we have a pretty good guess at the heritage.\n return constructor;\n }\n // naive Map shim\n function CreateMapPolyfill() {\n var cacheSentinel = {};\n var arraySentinel = [];\n var MapIterator = /** @class */ (function () {\n function MapIterator(keys, values, selector) {\n this._index = 0;\n this._keys = keys;\n this._values = values;\n this._selector = selector;\n }\n MapIterator.prototype["@@iterator"] = function () { return this; };\n MapIterator.prototype[iteratorSymbol] = function () { return this; };\n MapIterator.prototype.next = function () {\n var index = this._index;\n if (index >= 0 && index < this._keys.length) {\n var result = this._selector(this._keys[index], this._values[index]);\n if (index + 1 >= this._keys.length) {\n this._index = -1;\n this._keys = arraySentinel;\n this._values = arraySentinel;\n }\n else {\n this._index++;\n }\n return { value: result, done: false };\n }\n return { value: undefined, done: true };\n };\n MapIterator.prototype.throw = function (error) {\n if (this._index >= 0) {\n this._index = -1;\n this._keys = arraySentinel;\n this._values = arraySentinel;\n }\n throw error;\n };\n MapIterator.prototype.return = function (value) {\n if (this._index >= 0) {\n this._index = -1;\n this._keys = arraySentinel;\n this._values = arraySentinel;\n }\n return { value: value, done: true };\n };\n return MapIterator;\n }());\n return /** @class */ (function () {\n function Map() {\n this._keys = [];\n this._values = [];\n this._cacheKey = cacheSentinel;\n this._cacheIndex = -2;\n }\n Object.defineProperty(Map.prototype, "size", {\n get: function () { return this._keys.length; },\n enumerable: true,\n configurable: true\n });\n Map.prototype.has = function (key) { return this._find(key, /*insert*/ false) >= 0; };\n Map.prototype.get = function (key) {\n var index = this._find(key, /*insert*/ false);\n return index >= 0 ? this._values[index] : undefined;\n };\n Map.prototype.set = function (key, value) {\n var index = this._find(key, /*insert*/ true);\n this._values[index] = value;\n return this;\n };\n Map.prototype.delete = function (key) {\n var index = this._find(key, /*insert*/ false);\n if (index >= 0) {\n var size = this._keys.length;\n for (var i = index + 1; i < size; i++) {\n this._keys[i - 1] = this._keys[i];\n this._values[i - 1] = this._values[i];\n }\n this._keys.length--;\n this._values.length--;\n if (key === this._cacheKey) {\n this._cacheKey = cacheSentinel;\n this._cacheIndex = -2;\n }\n return true;\n }\n return false;\n };\n Map.prototype.clear = function () {\n this._keys.length = 0;\n this._values.length = 0;\n this._cacheKey = cacheSentinel;\n this._cacheIndex = -2;\n };\n Map.prototype.keys = function () { return new MapIterator(this._keys, this._values, getKey); };\n Map.prototype.values = function () { return new MapIterator(this._keys, this._values, getValue); };\n Map.prototype.entries = function () { return new MapIterator(this._keys, this._values, getEntry); };\n Map.prototype["@@iterator"] = function () { return this.entries(); };\n Map.prototype[iteratorSymbol] = function () { return this.entries(); };\n Map.prototype._find = function (key, insert) {\n if (this._cacheKey !== key) {\n this._cacheIndex = this._keys.indexOf(this._cacheKey = key);\n }\n if (this._cacheIndex < 0 && insert) {\n this._cacheIndex = this._keys.length;\n this._keys.push(key);\n this._values.push(undefined);\n }\n return this._cacheIndex;\n };\n return Map;\n }());\n function getKey(key, _) {\n return key;\n }\n function getValue(_, value) {\n return value;\n }\n function getEntry(key, value) {\n return [key, value];\n }\n }\n // naive Set shim\n function CreateSetPolyfill() {\n return /** @class */ (function () {\n function Set() {\n this._map = new _Map();\n }\n Object.defineProperty(Set.prototype, "size", {\n get: function () { return this._map.size; },\n enumerable: true,\n configurable: true\n });\n Set.prototype.has = function (value) { return this._map.has(value); };\n Set.prototype.add = function (value) { return this._map.set(value, value), this; };\n Set.prototype.delete = function (value) { return this._map.delete(value); };\n Set.prototype.clear = function () { this._map.clear(); };\n Set.prototype.keys = function () { return this._map.keys(); };\n Set.prototype.values = function () { return this._map.values(); };\n Set.prototype.entries = function () { return this._map.entries(); };\n Set.prototype["@@iterator"] = function () { return this.keys(); };\n Set.prototype[iteratorSymbol] = function () { return this.keys(); };\n return Set;\n }());\n }\n // naive WeakMap shim\n function CreateWeakMapPolyfill() {\n var UUID_SIZE = 16;\n var keys = HashMap.create();\n var rootKey = CreateUniqueKey();\n return /** @class */ (function () {\n function WeakMap() {\n this._key = CreateUniqueKey();\n }\n WeakMap.prototype.has = function (target) {\n var table = GetOrCreateWeakMapTable(target, /*create*/ false);\n return table !== undefined ? HashMap.has(table, this._key) : false;\n };\n WeakMap.prototype.get = function (target) {\n var table = GetOrCreateWeakMapTable(target, /*create*/ false);\n return table !== undefined ? HashMap.get(table, this._key) : undefined;\n };\n WeakMap.prototype.set = function (target, value) {\n var table = GetOrCreateWeakMapTable(target, /*create*/ true);\n table[this._key] = value;\n return this;\n };\n WeakMap.prototype.delete = function (target) {\n var table = GetOrCreateWeakMapTable(target, /*create*/ false);\n return table !== undefined ? delete table[this._key] : false;\n };\n WeakMap.prototype.clear = function () {\n // NOTE: not a real clear, just makes the previous data unreachable\n this._key = CreateUniqueKey();\n };\n return WeakMap;\n }());\n function CreateUniqueKey() {\n var key;\n do\n key = "@@WeakMap@@" + CreateUUID();\n while (HashMap.has(keys, key));\n keys[key] = true;\n return key;\n }\n function GetOrCreateWeakMapTable(target, create) {\n if (!hasOwn.call(target, rootKey)) {\n if (!create)\n return undefined;\n Object.defineProperty(target, rootKey, { value: HashMap.create() });\n }\n return target[rootKey];\n }\n function FillRandomBytes(buffer, size) {\n for (var i = 0; i < size; ++i)\n buffer[i] = Math.random() * 0xff | 0;\n return buffer;\n }\n function GenRandomBytes(size) {\n if (typeof Uint8Array === "function") {\n if (typeof crypto !== "undefined")\n return crypto.getRandomValues(new Uint8Array(size));\n if (typeof msCrypto !== "undefined")\n return msCrypto.getRandomValues(new Uint8Array(size));\n return FillRandomBytes(new Uint8Array(size), size);\n }\n return FillRandomBytes(new Array(size), size);\n }\n function CreateUUID() {\n var data = GenRandomBytes(UUID_SIZE);\n // mark as random - RFC 4122 § 4.4\n data[6] = data[6] & 0x4f | 0x40;\n data[8] = data[8] & 0xbf | 0x80;\n var result = "";\n for (var offset = 0; offset < UUID_SIZE; ++offset) {\n var byte = data[offset];\n if (offset === 4 || offset === 6 || offset === 8)\n result += "-";\n if (byte < 16)\n result += "0";\n result += byte.toString(16).toLowerCase();\n }\n return result;\n }\n }\n // uses a heuristic used by v8 and chakra to force an object into dictionary mode.\n function MakeDictionary(obj) {\n obj.__ = undefined;\n delete obj.__;\n return obj;\n }\n });\n})(Reflect || (Reflect = {}));\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(177), __webpack_require__(187)))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVmbGVjdC1tZXRhZGF0YS9SZWZsZWN0LmpzPzk4ZGIiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBLCtEQUErRDtBQUMvRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQ0FBMEM7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdEQUF3RCxtREFBbUQ7QUFDM0c7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUVBQWlFO0FBQ2pFLDZCQUE2QixnQkFBZ0Isa0JBQWtCO0FBQy9EO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLDRDQUE0QztBQUMzRTtBQUNBLG1DQUFtQyx3QkFBd0Isa0JBQWtCLEVBQUU7QUFDL0UsbUNBQW1DLHlCQUF5QixFQUFFLEVBQUU7QUFDaEU7QUFDQSx1Q0FBdUMsOEJBQThCO0FBQ3JFLHVDQUF1QyxtQkFBbUIsRUFBRTtBQUM1RDtBQUNBLHVDQUF1QyxxREFBcUQ7QUFDNUYsdUNBQXVDLGlCQUFpQixFQUFFO0FBQzFEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQztBQUNuQywyQ0FBMkM7QUFDM0MsOEJBQThCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMENBQTBDO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DO0FBQ25DLDJDQUEyQztBQUMzQyw4QkFBOEI7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUdBQXVHO0FBQ3ZHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DO0FBQ25DLDJDQUEyQztBQUMzQyw4QkFBOEI7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlEQUFpRCx1QkFBdUI7QUFDeEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1REFBdUQsMEJBQTBCO0FBQ2pGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQztBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtRUFBbUUsYUFBYTtBQUNoRixxRUFBcUUsYUFBYTtBQUNsRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0M7QUFDaEM7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQywwQkFBMEIsRUFBRTtBQUNsRTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCLG9EQUFvRCwrQ0FBK0M7QUFDbkc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQ0FBK0MsVUFBVTtBQUN6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtEQUFrRCwwREFBMEQ7QUFDNUcsb0RBQW9ELDREQUE0RDtBQUNoSCxxREFBcUQsNERBQTREO0FBQ2pILDJEQUEyRCx1QkFBdUI7QUFDbEYsNkRBQTZELHVCQUF1QjtBQUNwRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQyx1QkFBdUIsRUFBRTtBQUMvRDtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCLHNEQUFzRCw2QkFBNkI7QUFDbkYsc0RBQXNELDBDQUEwQztBQUNoRyx5REFBeUQsZ0NBQWdDO0FBQ3pGLG1EQUFtRCxtQkFBbUI7QUFDdEUsa0RBQWtELHlCQUF5QjtBQUMzRSxvREFBb0QsMkJBQTJCO0FBQy9FLHFEQUFxRCw0QkFBNEI7QUFDakYsMkRBQTJELG9CQUFvQjtBQUMvRSw2REFBNkQsb0JBQW9CO0FBQ2pGO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNERBQTRELDBCQUEwQjtBQUN0RjtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixVQUFVO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DLG9CQUFvQjtBQUN4RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxDQUFDLDBCQUEwQiIsImZpbGUiOiIyMzkuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiEgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbkNvcHlyaWdodCAoQykgTWljcm9zb2Z0LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlXG50aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZVxuTGljZW5zZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVEhJUyBDT0RFIElTIFBST1ZJREVEIE9OIEFOICpBUyBJUyogQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBBTlkgSU1QTElFRFxuV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSxcbk1FUkNIQU5UQUJMSVRZIE9SIE5PTi1JTkZSSU5HRU1FTlQuXG5cblNlZSB0aGUgQXBhY2hlIFZlcnNpb24gMi4wIExpY2Vuc2UgZm9yIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9uc1xuYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cbnZhciBSZWZsZWN0O1xuKGZ1bmN0aW9uIChSZWZsZWN0KSB7XG4gICAgLy8gTWV0YWRhdGEgUHJvcG9zYWxcbiAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhL1xuICAgIChmdW5jdGlvbiAoZmFjdG9yeSkge1xuICAgICAgICB2YXIgcm9vdCA9IHR5cGVvZiBnbG9iYWwgPT09IFwib2JqZWN0XCIgPyBnbG9iYWwgOlxuICAgICAgICAgICAgdHlwZW9mIHNlbGYgPT09IFwib2JqZWN0XCIgPyBzZWxmIDpcbiAgICAgICAgICAgICAgICB0eXBlb2YgdGhpcyA9PT0gXCJvYmplY3RcIiA/IHRoaXMgOlxuICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbihcInJldHVybiB0aGlzO1wiKSgpO1xuICAgICAgICB2YXIgZXhwb3J0ZXIgPSBtYWtlRXhwb3J0ZXIoUmVmbGVjdCk7XG4gICAgICAgIGlmICh0eXBlb2Ygcm9vdC5SZWZsZWN0ID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICByb290LlJlZmxlY3QgPSBSZWZsZWN0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZXhwb3J0ZXIgPSBtYWtlRXhwb3J0ZXIocm9vdC5SZWZsZWN0LCBleHBvcnRlcik7XG4gICAgICAgIH1cbiAgICAgICAgZmFjdG9yeShleHBvcnRlcik7XG4gICAgICAgIGZ1bmN0aW9uIG1ha2VFeHBvcnRlcih0YXJnZXQsIHByZXZpb3VzKSB7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRhcmdldFtrZXldICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiB2YWx1ZSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHByZXZpb3VzKVxuICAgICAgICAgICAgICAgICAgICBwcmV2aW91cyhrZXksIHZhbHVlKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9KShmdW5jdGlvbiAoZXhwb3J0ZXIpIHtcbiAgICAgICAgdmFyIGhhc093biA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG4gICAgICAgIC8vIGZlYXR1cmUgdGVzdCBmb3IgU3ltYm9sIHN1cHBvcnRcbiAgICAgICAgdmFyIHN1cHBvcnRzU3ltYm9sID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiO1xuICAgICAgICB2YXIgdG9QcmltaXRpdmVTeW1ib2wgPSBzdXBwb3J0c1N5bWJvbCAmJiB0eXBlb2YgU3ltYm9sLnRvUHJpbWl0aXZlICE9PSBcInVuZGVmaW5lZFwiID8gU3ltYm9sLnRvUHJpbWl0aXZlIDogXCJAQHRvUHJpbWl0aXZlXCI7XG4gICAgICAgIHZhciBpdGVyYXRvclN5bWJvbCA9IHN1cHBvcnRzU3ltYm9sICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgIT09IFwidW5kZWZpbmVkXCIgPyBTeW1ib2wuaXRlcmF0b3IgOiBcIkBAaXRlcmF0b3JcIjtcbiAgICAgICAgdmFyIHN1cHBvcnRzQ3JlYXRlID0gdHlwZW9mIE9iamVjdC5jcmVhdGUgPT09IFwiZnVuY3Rpb25cIjsgLy8gZmVhdHVyZSB0ZXN0IGZvciBPYmplY3QuY3JlYXRlIHN1cHBvcnRcbiAgICAgICAgdmFyIHN1cHBvcnRzUHJvdG8gPSB7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5OyAvLyBmZWF0dXJlIHRlc3QgZm9yIF9fcHJvdG9fXyBzdXBwb3J0XG4gICAgICAgIHZhciBkb3duTGV2ZWwgPSAhc3VwcG9ydHNDcmVhdGUgJiYgIXN1cHBvcnRzUHJvdG87XG4gICAgICAgIHZhciBIYXNoTWFwID0ge1xuICAgICAgICAgICAgLy8gY3JlYXRlIGFuIG9iamVjdCBpbiBkaWN0aW9uYXJ5IG1vZGUgKGEuay5hLiBcInNsb3dcIiBtb2RlIGluIHY4KVxuICAgICAgICAgICAgY3JlYXRlOiBzdXBwb3J0c0NyZWF0ZVxuICAgICAgICAgICAgICAgID8gZnVuY3Rpb24gKCkgeyByZXR1cm4gTWFrZURpY3Rpb25hcnkoT2JqZWN0LmNyZWF0ZShudWxsKSk7IH1cbiAgICAgICAgICAgICAgICA6IHN1cHBvcnRzUHJvdG9cbiAgICAgICAgICAgICAgICAgICAgPyBmdW5jdGlvbiAoKSB7IHJldHVybiBNYWtlRGljdGlvbmFyeSh7IF9fcHJvdG9fXzogbnVsbCB9KTsgfVxuICAgICAgICAgICAgICAgICAgICA6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIE1ha2VEaWN0aW9uYXJ5KHt9KTsgfSxcbiAgICAgICAgICAgIGhhczogZG93bkxldmVsXG4gICAgICAgICAgICAgICAgPyBmdW5jdGlvbiAobWFwLCBrZXkpIHsgcmV0dXJuIGhhc093bi5jYWxsKG1hcCwga2V5KTsgfVxuICAgICAgICAgICAgICAgIDogZnVuY3Rpb24gKG1hcCwga2V5KSB7IHJldHVybiBrZXkgaW4gbWFwOyB9LFxuICAgICAgICAgICAgZ2V0OiBkb3duTGV2ZWxcbiAgICAgICAgICAgICAgICA/IGZ1bmN0aW9uIChtYXAsIGtleSkgeyByZXR1cm4gaGFzT3duLmNhbGwobWFwLCBrZXkpID8gbWFwW2tleV0gOiB1bmRlZmluZWQ7IH1cbiAgICAgICAgICAgICAgICA6IGZ1bmN0aW9uIChtYXAsIGtleSkgeyByZXR1cm4gbWFwW2tleV07IH0sXG4gICAgICAgIH07XG4gICAgICAgIC8vIExvYWQgZ2xvYmFsIG9yIHNoaW0gdmVyc2lvbnMgb2YgTWFwLCBTZXQsIGFuZCBXZWFrTWFwXG4gICAgICAgIHZhciBmdW5jdGlvblByb3RvdHlwZSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihGdW5jdGlvbik7XG4gICAgICAgIHZhciB1c2VQb2x5ZmlsbCA9IHR5cGVvZiBwcm9jZXNzID09PSBcIm9iamVjdFwiICYmIHByb2Nlc3MuZW52ICYmIHByb2Nlc3MuZW52W1wiUkVGTEVDVF9NRVRBREFUQV9VU0VfTUFQX1BPTFlGSUxMXCJdID09PSBcInRydWVcIjtcbiAgICAgICAgdmFyIF9NYXAgPSAhdXNlUG9seWZpbGwgJiYgdHlwZW9mIE1hcCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBNYXAucHJvdG90eXBlLmVudHJpZXMgPT09IFwiZnVuY3Rpb25cIiA/IE1hcCA6IENyZWF0ZU1hcFBvbHlmaWxsKCk7XG4gICAgICAgIHZhciBfU2V0ID0gIXVzZVBvbHlmaWxsICYmIHR5cGVvZiBTZXQgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU2V0LnByb3RvdHlwZS5lbnRyaWVzID09PSBcImZ1bmN0aW9uXCIgPyBTZXQgOiBDcmVhdGVTZXRQb2x5ZmlsbCgpO1xuICAgICAgICB2YXIgX1dlYWtNYXAgPSAhdXNlUG9seWZpbGwgJiYgdHlwZW9mIFdlYWtNYXAgPT09IFwiZnVuY3Rpb25cIiA/IFdlYWtNYXAgOiBDcmVhdGVXZWFrTWFwUG9seWZpbGwoKTtcbiAgICAgICAgLy8gW1tNZXRhZGF0YV1dIGludGVybmFsIHNsb3RcbiAgICAgICAgLy8gaHR0cHM6Ly9yYnVja3Rvbi5naXRodWIuaW8vcmVmbGVjdC1tZXRhZGF0YS8jb3JkaW5hcnktb2JqZWN0LWludGVybmFsLW1ldGhvZHMtYW5kLWludGVybmFsLXNsb3RzXG4gICAgICAgIHZhciBNZXRhZGF0YSA9IG5ldyBfV2Vha01hcCgpO1xuICAgICAgICAvKipcbiAgICAgICAgICogQXBwbGllcyBhIHNldCBvZiBkZWNvcmF0b3JzIHRvIGEgcHJvcGVydHkgb2YgYSB0YXJnZXQgb2JqZWN0LlxuICAgICAgICAgKiBAcGFyYW0gZGVjb3JhdG9ycyBBbiBhcnJheSBvZiBkZWNvcmF0b3JzLlxuICAgICAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgb2JqZWN0LlxuICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlLZXkgKE9wdGlvbmFsKSBUaGUgcHJvcGVydHkga2V5IHRvIGRlY29yYXRlLlxuICAgICAgICAgKiBAcGFyYW0gYXR0cmlidXRlcyAoT3B0aW9uYWwpIFRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgdGFyZ2V0IGtleS5cbiAgICAgICAgICogQHJlbWFya3MgRGVjb3JhdG9ycyBhcmUgYXBwbGllZCBpbiByZXZlcnNlIG9yZGVyLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHkgZGVjbGFyYXRpb25zIGFyZSBub3QgcGFydCBvZiBFUzYsIHRob3VnaCB0aGV5IGFyZSB2YWxpZCBpbiBUeXBlU2NyaXB0OlxuICAgICAgICAgKiAgICAgICAgIC8vIHN0YXRpYyBzdGF0aWNQcm9wZXJ0eTtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICAgICBjb25zdHJ1Y3RvcihwKSB7IH1cbiAgICAgICAgICogICAgICAgICBzdGF0aWMgc3RhdGljTWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIG1ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIGNvbnN0cnVjdG9yXG4gICAgICAgICAqICAgICBFeGFtcGxlID0gUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzQXJyYXksIEV4YW1wbGUpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzQXJyYXksIEV4YW1wbGUsIFwic3RhdGljUHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzQXJyYXksIEV4YW1wbGUucHJvdG90eXBlLCBcInByb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShFeGFtcGxlLCBcInN0YXRpY01ldGhvZFwiLFxuICAgICAgICAgKiAgICAgICAgIFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9yc0FycmF5LCBFeGFtcGxlLCBcInN0YXRpY01ldGhvZFwiLFxuICAgICAgICAgKiAgICAgICAgICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKEV4YW1wbGUsIFwic3RhdGljTWV0aG9kXCIpKSk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShFeGFtcGxlLnByb3RvdHlwZSwgXCJtZXRob2RcIixcbiAgICAgICAgICogICAgICAgICBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnNBcnJheSwgRXhhbXBsZS5wcm90b3R5cGUsIFwibWV0aG9kXCIsXG4gICAgICAgICAqICAgICAgICAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoRXhhbXBsZS5wcm90b3R5cGUsIFwibWV0aG9kXCIpKSk7XG4gICAgICAgICAqXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBkZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIHByb3BlcnR5S2V5LCBhdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHByb3BlcnR5S2V5KSkge1xuICAgICAgICAgICAgICAgIGlmICghSXNBcnJheShkZWNvcmF0b3JzKSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgICAgIGlmICghSXNPYmplY3QodGFyZ2V0KSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgICAgIGlmICghSXNPYmplY3QoYXR0cmlidXRlcykgJiYgIUlzVW5kZWZpbmVkKGF0dHJpYnV0ZXMpICYmICFJc051bGwoYXR0cmlidXRlcykpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICBpZiAoSXNOdWxsKGF0dHJpYnV0ZXMpKVxuICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHByb3BlcnR5S2V5ID0gVG9Qcm9wZXJ0eUtleShwcm9wZXJ0eUtleSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIERlY29yYXRlUHJvcGVydHkoZGVjb3JhdG9ycywgdGFyZ2V0LCBwcm9wZXJ0eUtleSwgYXR0cmlidXRlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoIUlzQXJyYXkoZGVjb3JhdG9ycykpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICBpZiAoIUlzQ29uc3RydWN0b3IodGFyZ2V0KSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgICAgIHJldHVybiBEZWNvcmF0ZUNvbnN0cnVjdG9yKGRlY29yYXRvcnMsIHRhcmdldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZXhwb3J0ZXIoXCJkZWNvcmF0ZVwiLCBkZWNvcmF0ZSk7XG4gICAgICAgIC8vIDQuMS4yIFJlZmxlY3QubWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpXG4gICAgICAgIC8vIGh0dHBzOi8vcmJ1Y2t0b24uZ2l0aHViLmlvL3JlZmxlY3QtbWV0YWRhdGEvI3JlZmxlY3QubWV0YWRhdGFcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgZGVmYXVsdCBtZXRhZGF0YSBkZWNvcmF0b3IgZmFjdG9yeSB0aGF0IGNhbiBiZSB1c2VkIG9uIGEgY2xhc3MsIGNsYXNzIG1lbWJlciwgb3IgcGFyYW1ldGVyLlxuICAgICAgICAgKiBAcGFyYW0gbWV0YWRhdGFLZXkgVGhlIGtleSBmb3IgdGhlIG1ldGFkYXRhIGVudHJ5LlxuICAgICAgICAgKiBAcGFyYW0gbWV0YWRhdGFWYWx1ZSBUaGUgdmFsdWUgZm9yIHRoZSBtZXRhZGF0YSBlbnRyeS5cbiAgICAgICAgICogQHJldHVybnMgQSBkZWNvcmF0b3IgZnVuY3Rpb24uXG4gICAgICAgICAqIEByZW1hcmtzXG4gICAgICAgICAqIElmIGBtZXRhZGF0YUtleWAgaXMgYWxyZWFkeSBkZWZpbmVkIGZvciB0aGUgdGFyZ2V0IGFuZCB0YXJnZXQga2V5LCB0aGVcbiAgICAgICAgICogbWV0YWRhdGFWYWx1ZSBmb3IgdGhhdCBrZXkgd2lsbCBiZSBvdmVyd3JpdHRlbi5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIGNvbnN0cnVjdG9yXG4gICAgICAgICAqICAgICBAUmVmbGVjdC5tZXRhZGF0YShrZXksIHZhbHVlKVxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gY29uc3RydWN0b3IsIFR5cGVTY3JpcHQgb25seSlcbiAgICAgICAgICogICAgIGNsYXNzIEV4YW1wbGUge1xuICAgICAgICAgKiAgICAgICAgIEBSZWZsZWN0Lm1ldGFkYXRhKGtleSwgdmFsdWUpXG4gICAgICAgICAqICAgICAgICAgc3RhdGljIHN0YXRpY1Byb3BlcnR5O1xuICAgICAgICAgKiAgICAgfVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIHByb3RvdHlwZSwgVHlwZVNjcmlwdCBvbmx5KVxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICAgICAgQFJlZmxlY3QubWV0YWRhdGEoa2V5LCB2YWx1ZSlcbiAgICAgICAgICogICAgICAgICBwcm9wZXJ0eTtcbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICBjbGFzcyBFeGFtcGxlIHtcbiAgICAgICAgICogICAgICAgICBAUmVmbGVjdC5tZXRhZGF0YShrZXksIHZhbHVlKVxuICAgICAgICAgKiAgICAgICAgIHN0YXRpYyBzdGF0aWNNZXRob2QoKSB7IH1cbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICAgICAgQFJlZmxlY3QubWV0YWRhdGEoa2V5LCB2YWx1ZSlcbiAgICAgICAgICogICAgICAgICBtZXRob2QoKSB7IH1cbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIG1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKSB7XG4gICAgICAgICAgICBmdW5jdGlvbiBkZWNvcmF0b3IodGFyZ2V0LCBwcm9wZXJ0eUtleSkge1xuICAgICAgICAgICAgICAgIGlmICghSXNPYmplY3QodGFyZ2V0KSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocHJvcGVydHlLZXkpICYmICFJc1Byb3BlcnR5S2V5KHByb3BlcnR5S2V5KSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgICAgIE9yZGluYXJ5RGVmaW5lT3duTWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUsIHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGRlY29yYXRvcjtcbiAgICAgICAgfVxuICAgICAgICBleHBvcnRlcihcIm1ldGFkYXRhXCIsIG1ldGFkYXRhKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIERlZmluZSBhIHVuaXF1ZSBtZXRhZGF0YSBlbnRyeSBvbiB0aGUgdGFyZ2V0LlxuICAgICAgICAgKiBAcGFyYW0gbWV0YWRhdGFLZXkgQSBrZXkgdXNlZCB0byBzdG9yZSBhbmQgcmV0cmlldmUgbWV0YWRhdGEuXG4gICAgICAgICAqIEBwYXJhbSBtZXRhZGF0YVZhbHVlIEEgdmFsdWUgdGhhdCBjb250YWlucyBhdHRhY2hlZCBtZXRhZGF0YS5cbiAgICAgICAgICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IG9iamVjdCBvbiB3aGljaCB0byBkZWZpbmUgbWV0YWRhdGEuXG4gICAgICAgICAqIEBwYXJhbSBwcm9wZXJ0eUtleSAoT3B0aW9uYWwpIFRoZSBwcm9wZXJ0eSBrZXkgZm9yIHRoZSB0YXJnZXQuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICBjbGFzcyBFeGFtcGxlIHtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eSBkZWNsYXJhdGlvbnMgYXJlIG5vdCBwYXJ0IG9mIEVTNiwgdGhvdWdoIHRoZXkgYXJlIHZhbGlkIGluIFR5cGVTY3JpcHQ6XG4gICAgICAgICAqICAgICAgICAgLy8gc3RhdGljIHN0YXRpY1Byb3BlcnR5O1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5O1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgICAgIGNvbnN0cnVjdG9yKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIHN0YXRpYyBzdGF0aWNNZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgbWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgfVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gY29uc3RydWN0b3JcbiAgICAgICAgICogICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBvcHRpb25zLCBFeGFtcGxlKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBvcHRpb25zLCBFeGFtcGxlLCBcInN0YXRpY1Byb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBvcHRpb25zLCBFeGFtcGxlLnByb3RvdHlwZSwgXCJwcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgb3B0aW9ucywgRXhhbXBsZSwgXCJzdGF0aWNNZXRob2RcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBvcHRpb25zLCBFeGFtcGxlLnByb3RvdHlwZSwgXCJtZXRob2RcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBkZWNvcmF0b3IgZmFjdG9yeSBhcyBtZXRhZGF0YS1wcm9kdWNpbmcgYW5ub3RhdGlvbi5cbiAgICAgICAgICogICAgIGZ1bmN0aW9uIE15QW5ub3RhdGlvbihvcHRpb25zKTogRGVjb3JhdG9yIHtcbiAgICAgICAgICogICAgICAgICByZXR1cm4gKHRhcmdldCwga2V5PykgPT4gUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIG9wdGlvbnMsIHRhcmdldCwga2V5KTtcbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIGRlZmluZU1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlLCB0YXJnZXQsIHByb3BlcnR5S2V5KSB7XG4gICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHRhcmdldCkpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChwcm9wZXJ0eUtleSkpXG4gICAgICAgICAgICAgICAgcHJvcGVydHlLZXkgPSBUb1Byb3BlcnR5S2V5KHByb3BlcnR5S2V5KTtcbiAgICAgICAgICAgIHJldHVybiBPcmRpbmFyeURlZmluZU93bk1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlLCB0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgICAgICAgfVxuICAgICAgICBleHBvcnRlcihcImRlZmluZU1ldGFkYXRhXCIsIGRlZmluZU1ldGFkYXRhKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgYSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHRhcmdldCBvYmplY3Qgb3IgaXRzIHByb3RvdHlwZSBjaGFpbiBoYXMgdGhlIHByb3ZpZGVkIG1ldGFkYXRhIGtleSBkZWZpbmVkLlxuICAgICAgICAgKiBAcGFyYW0gbWV0YWRhdGFLZXkgQSBrZXkgdXNlZCB0byBzdG9yZSBhbmQgcmV0cmlldmUgbWV0YWRhdGEuXG4gICAgICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBvYmplY3Qgb24gd2hpY2ggdGhlIG1ldGFkYXRhIGlzIGRlZmluZWQuXG4gICAgICAgICAqIEBwYXJhbSBwcm9wZXJ0eUtleSAoT3B0aW9uYWwpIFRoZSBwcm9wZXJ0eSBrZXkgZm9yIHRoZSB0YXJnZXQuXG4gICAgICAgICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgbWV0YWRhdGEga2V5IHdhcyBkZWZpbmVkIG9uIHRoZSB0YXJnZXQgb2JqZWN0IG9yIGl0cyBwcm90b3R5cGUgY2hhaW47IG90aGVyd2lzZSwgYGZhbHNlYC5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIGNsYXNzIEV4YW1wbGUge1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5IGRlY2xhcmF0aW9ucyBhcmUgbm90IHBhcnQgb2YgRVM2LCB0aG91Z2ggdGhleSBhcmUgdmFsaWQgaW4gVHlwZVNjcmlwdDpcbiAgICAgICAgICogICAgICAgICAvLyBzdGF0aWMgc3RhdGljUHJvcGVydHk7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgICAgY29uc3RydWN0b3IocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgc3RhdGljIHN0YXRpY01ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgICAgICBtZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBjb25zdHJ1Y3RvclxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5oYXNNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5oYXNNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUsIFwic3RhdGljUHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5oYXNNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUucHJvdG90eXBlLCBcInByb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuaGFzTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLCBcInN0YXRpY01ldGhvZFwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5oYXNNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUucHJvdG90eXBlLCBcIm1ldGhvZFwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIGhhc01ldGFkYXRhKG1ldGFkYXRhS2V5LCB0YXJnZXQsIHByb3BlcnR5S2V5KSB7XG4gICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHRhcmdldCkpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChwcm9wZXJ0eUtleSkpXG4gICAgICAgICAgICAgICAgcHJvcGVydHlLZXkgPSBUb1Byb3BlcnR5S2V5KHByb3BlcnR5S2V5KTtcbiAgICAgICAgICAgIHJldHVybiBPcmRpbmFyeUhhc01ldGFkYXRhKG1ldGFkYXRhS2V5LCB0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgICAgICAgfVxuICAgICAgICBleHBvcnRlcihcImhhc01ldGFkYXRhXCIsIGhhc01ldGFkYXRhKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgYSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHRhcmdldCBvYmplY3QgaGFzIHRoZSBwcm92aWRlZCBtZXRhZGF0YSBrZXkgZGVmaW5lZC5cbiAgICAgICAgICogQHBhcmFtIG1ldGFkYXRhS2V5IEEga2V5IHVzZWQgdG8gc3RvcmUgYW5kIHJldHJpZXZlIG1ldGFkYXRhLlxuICAgICAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgb2JqZWN0IG9uIHdoaWNoIHRoZSBtZXRhZGF0YSBpcyBkZWZpbmVkLlxuICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlLZXkgKE9wdGlvbmFsKSBUaGUgcHJvcGVydHkga2V5IGZvciB0aGUgdGFyZ2V0LlxuICAgICAgICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG1ldGFkYXRhIGtleSB3YXMgZGVmaW5lZCBvbiB0aGUgdGFyZ2V0IG9iamVjdDsgb3RoZXJ3aXNlLCBgZmFsc2VgLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHkgZGVjbGFyYXRpb25zIGFyZSBub3QgcGFydCBvZiBFUzYsIHRob3VnaCB0aGV5IGFyZSB2YWxpZCBpbiBUeXBlU2NyaXB0OlxuICAgICAgICAgKiAgICAgICAgIC8vIHN0YXRpYyBzdGF0aWNQcm9wZXJ0eTtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICAgICBjb25zdHJ1Y3RvcihwKSB7IH1cbiAgICAgICAgICogICAgICAgICBzdGF0aWMgc3RhdGljTWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIG1ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIGNvbnN0cnVjdG9yXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0Lmhhc093bk1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0Lmhhc093bk1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSwgXCJzdGF0aWNQcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0Lmhhc093bk1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZS5wcm90b3R5cGUsIFwicHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5oYXNPd25NZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUsIFwic3RhdGljTWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0Lmhhc093bk1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZS5wcm90b3R5cGUsIFwibWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gaGFzT3duTWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCwgcHJvcGVydHlLZXkpIHtcbiAgICAgICAgICAgIGlmICghSXNPYmplY3QodGFyZ2V0KSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHByb3BlcnR5S2V5KSlcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eUtleSA9IFRvUHJvcGVydHlLZXkocHJvcGVydHlLZXkpO1xuICAgICAgICAgICAgcmV0dXJuIE9yZGluYXJ5SGFzT3duTWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgICAgICB9XG4gICAgICAgIGV4cG9ydGVyKFwiaGFzT3duTWV0YWRhdGFcIiwgaGFzT3duTWV0YWRhdGEpO1xuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyB0aGUgbWV0YWRhdGEgdmFsdWUgZm9yIHRoZSBwcm92aWRlZCBtZXRhZGF0YSBrZXkgb24gdGhlIHRhcmdldCBvYmplY3Qgb3IgaXRzIHByb3RvdHlwZSBjaGFpbi5cbiAgICAgICAgICogQHBhcmFtIG1ldGFkYXRhS2V5IEEga2V5IHVzZWQgdG8gc3RvcmUgYW5kIHJldHJpZXZlIG1ldGFkYXRhLlxuICAgICAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgb2JqZWN0IG9uIHdoaWNoIHRoZSBtZXRhZGF0YSBpcyBkZWZpbmVkLlxuICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlLZXkgKE9wdGlvbmFsKSBUaGUgcHJvcGVydHkga2V5IGZvciB0aGUgdGFyZ2V0LlxuICAgICAgICAgKiBAcmV0dXJucyBUaGUgbWV0YWRhdGEgdmFsdWUgZm9yIHRoZSBtZXRhZGF0YSBrZXkgaWYgZm91bmQ7IG90aGVyd2lzZSwgYHVuZGVmaW5lZGAuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICBjbGFzcyBFeGFtcGxlIHtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eSBkZWNsYXJhdGlvbnMgYXJlIG5vdCBwYXJ0IG9mIEVTNiwgdGhvdWdoIHRoZXkgYXJlIHZhbGlkIGluIFR5cGVTY3JpcHQ6XG4gICAgICAgICAqICAgICAgICAgLy8gc3RhdGljIHN0YXRpY1Byb3BlcnR5O1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5O1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgICAgIGNvbnN0cnVjdG9yKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIHN0YXRpYyBzdGF0aWNNZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgbWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgfVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gY29uc3RydWN0b3JcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLCBcInN0YXRpY1Byb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLnByb3RvdHlwZSwgXCJwcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSwgXCJzdGF0aWNNZXRob2RcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLnByb3RvdHlwZSwgXCJtZXRob2RcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBnZXRNZXRhZGF0YShtZXRhZGF0YUtleSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSkge1xuICAgICAgICAgICAgaWYgKCFJc09iamVjdCh0YXJnZXQpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocHJvcGVydHlLZXkpKVxuICAgICAgICAgICAgICAgIHByb3BlcnR5S2V5ID0gVG9Qcm9wZXJ0eUtleShwcm9wZXJ0eUtleSk7XG4gICAgICAgICAgICByZXR1cm4gT3JkaW5hcnlHZXRNZXRhZGF0YShtZXRhZGF0YUtleSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gICAgICAgIH1cbiAgICAgICAgZXhwb3J0ZXIoXCJnZXRNZXRhZGF0YVwiLCBnZXRNZXRhZGF0YSk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIHRoZSBtZXRhZGF0YSB2YWx1ZSBmb3IgdGhlIHByb3ZpZGVkIG1ldGFkYXRhIGtleSBvbiB0aGUgdGFyZ2V0IG9iamVjdC5cbiAgICAgICAgICogQHBhcmFtIG1ldGFkYXRhS2V5IEEga2V5IHVzZWQgdG8gc3RvcmUgYW5kIHJldHJpZXZlIG1ldGFkYXRhLlxuICAgICAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgb2JqZWN0IG9uIHdoaWNoIHRoZSBtZXRhZGF0YSBpcyBkZWZpbmVkLlxuICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlLZXkgKE9wdGlvbmFsKSBUaGUgcHJvcGVydHkga2V5IGZvciB0aGUgdGFyZ2V0LlxuICAgICAgICAgKiBAcmV0dXJucyBUaGUgbWV0YWRhdGEgdmFsdWUgZm9yIHRoZSBtZXRhZGF0YSBrZXkgaWYgZm91bmQ7IG90aGVyd2lzZSwgYHVuZGVmaW5lZGAuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICBjbGFzcyBFeGFtcGxlIHtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eSBkZWNsYXJhdGlvbnMgYXJlIG5vdCBwYXJ0IG9mIEVTNiwgdGhvdWdoIHRoZXkgYXJlIHZhbGlkIGluIFR5cGVTY3JpcHQ6XG4gICAgICAgICAqICAgICAgICAgLy8gc3RhdGljIHN0YXRpY1Byb3BlcnR5O1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5O1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgICAgIGNvbnN0cnVjdG9yKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIHN0YXRpYyBzdGF0aWNNZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgbWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgfVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gY29uc3RydWN0b3JcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0T3duTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0T3duTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLCBcInN0YXRpY1Byb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0T3duTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLnByb3RvdHlwZSwgXCJwcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE93bk1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSwgXCJzdGF0aWNNZXRob2RcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0T3duTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLnByb3RvdHlwZSwgXCJtZXRob2RcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBnZXRPd25NZXRhZGF0YShtZXRhZGF0YUtleSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSkge1xuICAgICAgICAgICAgaWYgKCFJc09iamVjdCh0YXJnZXQpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocHJvcGVydHlLZXkpKVxuICAgICAgICAgICAgICAgIHByb3BlcnR5S2V5ID0gVG9Qcm9wZXJ0eUtleShwcm9wZXJ0eUtleSk7XG4gICAgICAgICAgICByZXR1cm4gT3JkaW5hcnlHZXRPd25NZXRhZGF0YShtZXRhZGF0YUtleSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gICAgICAgIH1cbiAgICAgICAgZXhwb3J0ZXIoXCJnZXRPd25NZXRhZGF0YVwiLCBnZXRPd25NZXRhZGF0YSk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIHRoZSBtZXRhZGF0YSBrZXlzIGRlZmluZWQgb24gdGhlIHRhcmdldCBvYmplY3Qgb3IgaXRzIHByb3RvdHlwZSBjaGFpbi5cbiAgICAgICAgICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IG9iamVjdCBvbiB3aGljaCB0aGUgbWV0YWRhdGEgaXMgZGVmaW5lZC5cbiAgICAgICAgICogQHBhcmFtIHByb3BlcnR5S2V5IChPcHRpb25hbCkgVGhlIHByb3BlcnR5IGtleSBmb3IgdGhlIHRhcmdldC5cbiAgICAgICAgICogQHJldHVybnMgQW4gYXJyYXkgb2YgdW5pcXVlIG1ldGFkYXRhIGtleXMuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICBjbGFzcyBFeGFtcGxlIHtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eSBkZWNsYXJhdGlvbnMgYXJlIG5vdCBwYXJ0IG9mIEVTNiwgdGhvdWdoIHRoZXkgYXJlIHZhbGlkIGluIFR5cGVTY3JpcHQ6XG4gICAgICAgICAqICAgICAgICAgLy8gc3RhdGljIHN0YXRpY1Byb3BlcnR5O1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5O1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgICAgIGNvbnN0cnVjdG9yKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIHN0YXRpYyBzdGF0aWNNZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgbWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgfVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gY29uc3RydWN0b3JcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0TWV0YWRhdGFLZXlzKEV4YW1wbGUpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRNZXRhZGF0YUtleXMoRXhhbXBsZSwgXCJzdGF0aWNQcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE1ldGFkYXRhS2V5cyhFeGFtcGxlLnByb3RvdHlwZSwgXCJwcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE1ldGFkYXRhS2V5cyhFeGFtcGxlLCBcInN0YXRpY01ldGhvZFwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRNZXRhZGF0YUtleXMoRXhhbXBsZS5wcm90b3R5cGUsIFwibWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gZ2V0TWV0YWRhdGFLZXlzKHRhcmdldCwgcHJvcGVydHlLZXkpIHtcbiAgICAgICAgICAgIGlmICghSXNPYmplY3QodGFyZ2V0KSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHByb3BlcnR5S2V5KSlcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eUtleSA9IFRvUHJvcGVydHlLZXkocHJvcGVydHlLZXkpO1xuICAgICAgICAgICAgcmV0dXJuIE9yZGluYXJ5TWV0YWRhdGFLZXlzKHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgICAgICB9XG4gICAgICAgIGV4cG9ydGVyKFwiZ2V0TWV0YWRhdGFLZXlzXCIsIGdldE1ldGFkYXRhS2V5cyk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIHRoZSB1bmlxdWUgbWV0YWRhdGEga2V5cyBkZWZpbmVkIG9uIHRoZSB0YXJnZXQgb2JqZWN0LlxuICAgICAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgb2JqZWN0IG9uIHdoaWNoIHRoZSBtZXRhZGF0YSBpcyBkZWZpbmVkLlxuICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlLZXkgKE9wdGlvbmFsKSBUaGUgcHJvcGVydHkga2V5IGZvciB0aGUgdGFyZ2V0LlxuICAgICAgICAgKiBAcmV0dXJucyBBbiBhcnJheSBvZiB1bmlxdWUgbWV0YWRhdGEga2V5cy5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIGNsYXNzIEV4YW1wbGUge1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5IGRlY2xhcmF0aW9ucyBhcmUgbm90IHBhcnQgb2YgRVM2LCB0aG91Z2ggdGhleSBhcmUgdmFsaWQgaW4gVHlwZVNjcmlwdDpcbiAgICAgICAgICogICAgICAgICAvLyBzdGF0aWMgc3RhdGljUHJvcGVydHk7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgICAgY29uc3RydWN0b3IocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgc3RhdGljIHN0YXRpY01ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgICAgICBtZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBjb25zdHJ1Y3RvclxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRPd25NZXRhZGF0YUtleXMoRXhhbXBsZSk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE93bk1ldGFkYXRhS2V5cyhFeGFtcGxlLCBcInN0YXRpY1Byb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0T3duTWV0YWRhdGFLZXlzKEV4YW1wbGUucHJvdG90eXBlLCBcInByb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0T3duTWV0YWRhdGFLZXlzKEV4YW1wbGUsIFwic3RhdGljTWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE93bk1ldGFkYXRhS2V5cyhFeGFtcGxlLnByb3RvdHlwZSwgXCJtZXRob2RcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBnZXRPd25NZXRhZGF0YUtleXModGFyZ2V0LCBwcm9wZXJ0eUtleSkge1xuICAgICAgICAgICAgaWYgKCFJc09iamVjdCh0YXJnZXQpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocHJvcGVydHlLZXkpKVxuICAgICAgICAgICAgICAgIHByb3BlcnR5S2V5ID0gVG9Qcm9wZXJ0eUtleShwcm9wZXJ0eUtleSk7XG4gICAgICAgICAgICByZXR1cm4gT3JkaW5hcnlPd25NZXRhZGF0YUtleXModGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gICAgICAgIH1cbiAgICAgICAgZXhwb3J0ZXIoXCJnZXRPd25NZXRhZGF0YUtleXNcIiwgZ2V0T3duTWV0YWRhdGFLZXlzKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIERlbGV0ZXMgdGhlIG1ldGFkYXRhIGVudHJ5IGZyb20gdGhlIHRhcmdldCBvYmplY3Qgd2l0aCB0aGUgcHJvdmlkZWQga2V5LlxuICAgICAgICAgKiBAcGFyYW0gbWV0YWRhdGFLZXkgQSBrZXkgdXNlZCB0byBzdG9yZSBhbmQgcmV0cmlldmUgbWV0YWRhdGEuXG4gICAgICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBvYmplY3Qgb24gd2hpY2ggdGhlIG1ldGFkYXRhIGlzIGRlZmluZWQuXG4gICAgICAgICAqIEBwYXJhbSBwcm9wZXJ0eUtleSAoT3B0aW9uYWwpIFRoZSBwcm9wZXJ0eSBrZXkgZm9yIHRoZSB0YXJnZXQuXG4gICAgICAgICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgbWV0YWRhdGEgZW50cnkgd2FzIGZvdW5kIGFuZCBkZWxldGVkOyBvdGhlcndpc2UsIGZhbHNlLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHkgZGVjbGFyYXRpb25zIGFyZSBub3QgcGFydCBvZiBFUzYsIHRob3VnaCB0aGV5IGFyZSB2YWxpZCBpbiBUeXBlU2NyaXB0OlxuICAgICAgICAgKiAgICAgICAgIC8vIHN0YXRpYyBzdGF0aWNQcm9wZXJ0eTtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICAgICBjb25zdHJ1Y3RvcihwKSB7IH1cbiAgICAgICAgICogICAgICAgICBzdGF0aWMgc3RhdGljTWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIG1ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIGNvbnN0cnVjdG9yXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmRlbGV0ZU1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmRlbGV0ZU1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSwgXCJzdGF0aWNQcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmRlbGV0ZU1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZS5wcm90b3R5cGUsIFwicHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5kZWxldGVNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUsIFwic3RhdGljTWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmRlbGV0ZU1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZS5wcm90b3R5cGUsIFwibWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gZGVsZXRlTWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCwgcHJvcGVydHlLZXkpIHtcbiAgICAgICAgICAgIGlmICghSXNPYmplY3QodGFyZ2V0KSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHByb3BlcnR5S2V5KSlcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eUtleSA9IFRvUHJvcGVydHlLZXkocHJvcGVydHlLZXkpO1xuICAgICAgICAgICAgdmFyIG1ldGFkYXRhTWFwID0gR2V0T3JDcmVhdGVNZXRhZGF0YU1hcCh0YXJnZXQsIHByb3BlcnR5S2V5LCAvKkNyZWF0ZSovIGZhbHNlKTtcbiAgICAgICAgICAgIGlmIChJc1VuZGVmaW5lZChtZXRhZGF0YU1hcCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgaWYgKCFtZXRhZGF0YU1hcC5kZWxldGUobWV0YWRhdGFLZXkpKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGlmIChtZXRhZGF0YU1hcC5zaXplID4gMClcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIHZhciB0YXJnZXRNZXRhZGF0YSA9IE1ldGFkYXRhLmdldCh0YXJnZXQpO1xuICAgICAgICAgICAgdGFyZ2V0TWV0YWRhdGEuZGVsZXRlKHByb3BlcnR5S2V5KTtcbiAgICAgICAgICAgIGlmICh0YXJnZXRNZXRhZGF0YS5zaXplID4gMClcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIE1ldGFkYXRhLmRlbGV0ZSh0YXJnZXQpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZXhwb3J0ZXIoXCJkZWxldGVNZXRhZGF0YVwiLCBkZWxldGVNZXRhZGF0YSk7XG4gICAgICAgIGZ1bmN0aW9uIERlY29yYXRlQ29uc3RydWN0b3IoZGVjb3JhdG9ycywgdGFyZ2V0KSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICAgICAgICAgIHZhciBkZWNvcmF0b3IgPSBkZWNvcmF0b3JzW2ldO1xuICAgICAgICAgICAgICAgIHZhciBkZWNvcmF0ZWQgPSBkZWNvcmF0b3IodGFyZ2V0KTtcbiAgICAgICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKGRlY29yYXRlZCkgJiYgIUlzTnVsbChkZWNvcmF0ZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghSXNDb25zdHJ1Y3RvcihkZWNvcmF0ZWQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBkZWNvcmF0ZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBEZWNvcmF0ZVByb3BlcnR5KGRlY29yYXRvcnMsIHRhcmdldCwgcHJvcGVydHlLZXksIGRlc2NyaXB0b3IpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgICAgICAgICAgdmFyIGRlY29yYXRvciA9IGRlY29yYXRvcnNbaV07XG4gICAgICAgICAgICAgICAgdmFyIGRlY29yYXRlZCA9IGRlY29yYXRvcih0YXJnZXQsIHByb3BlcnR5S2V5LCBkZXNjcmlwdG9yKTtcbiAgICAgICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKGRlY29yYXRlZCkgJiYgIUlzTnVsbChkZWNvcmF0ZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghSXNPYmplY3QoZGVjb3JhdGVkKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvciA9IGRlY29yYXRlZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBHZXRPckNyZWF0ZU1ldGFkYXRhTWFwKE8sIFAsIENyZWF0ZSkge1xuICAgICAgICAgICAgdmFyIHRhcmdldE1ldGFkYXRhID0gTWV0YWRhdGEuZ2V0KE8pO1xuICAgICAgICAgICAgaWYgKElzVW5kZWZpbmVkKHRhcmdldE1ldGFkYXRhKSkge1xuICAgICAgICAgICAgICAgIGlmICghQ3JlYXRlKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHRhcmdldE1ldGFkYXRhID0gbmV3IF9NYXAoKTtcbiAgICAgICAgICAgICAgICBNZXRhZGF0YS5zZXQoTywgdGFyZ2V0TWV0YWRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIG1ldGFkYXRhTWFwID0gdGFyZ2V0TWV0YWRhdGEuZ2V0KFApO1xuICAgICAgICAgICAgaWYgKElzVW5kZWZpbmVkKG1ldGFkYXRhTWFwKSkge1xuICAgICAgICAgICAgICAgIGlmICghQ3JlYXRlKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIG1ldGFkYXRhTWFwID0gbmV3IF9NYXAoKTtcbiAgICAgICAgICAgICAgICB0YXJnZXRNZXRhZGF0YS5zZXQoUCwgbWV0YWRhdGFNYXApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG1ldGFkYXRhTWFwO1xuICAgICAgICB9XG4gICAgICAgIC8vIDMuMS4xLjEgT3JkaW5hcnlIYXNNZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUClcbiAgICAgICAgLy8gaHR0cHM6Ly9yYnVja3Rvbi5naXRodWIuaW8vcmVmbGVjdC1tZXRhZGF0YS8jb3JkaW5hcnloYXNtZXRhZGF0YVxuICAgICAgICBmdW5jdGlvbiBPcmRpbmFyeUhhc01ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKSB7XG4gICAgICAgICAgICB2YXIgaGFzT3duID0gT3JkaW5hcnlIYXNPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUCk7XG4gICAgICAgICAgICBpZiAoaGFzT3duKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgdmFyIHBhcmVudCA9IE9yZGluYXJ5R2V0UHJvdG90eXBlT2YoTyk7XG4gICAgICAgICAgICBpZiAoIUlzTnVsbChwYXJlbnQpKVxuICAgICAgICAgICAgICAgIHJldHVybiBPcmRpbmFyeUhhc01ldGFkYXRhKE1ldGFkYXRhS2V5LCBwYXJlbnQsIFApO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIC8vIDMuMS4yLjEgT3JkaW5hcnlIYXNPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUClcbiAgICAgICAgLy8gaHR0cHM6Ly9yYnVja3Rvbi5naXRodWIuaW8vcmVmbGVjdC1tZXRhZGF0YS8jb3JkaW5hcnloYXNvd25tZXRhZGF0YVxuICAgICAgICBmdW5jdGlvbiBPcmRpbmFyeUhhc093bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKSB7XG4gICAgICAgICAgICB2YXIgbWV0YWRhdGFNYXAgPSBHZXRPckNyZWF0ZU1ldGFkYXRhTWFwKE8sIFAsIC8qQ3JlYXRlKi8gZmFsc2UpO1xuICAgICAgICAgICAgaWYgKElzVW5kZWZpbmVkKG1ldGFkYXRhTWFwKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gVG9Cb29sZWFuKG1ldGFkYXRhTWFwLmhhcyhNZXRhZGF0YUtleSkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIDMuMS4zLjEgT3JkaW5hcnlHZXRNZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUClcbiAgICAgICAgLy8gaHR0cHM6Ly9yYnVja3Rvbi5naXRodWIuaW8vcmVmbGVjdC1tZXRhZGF0YS8jb3JkaW5hcnlnZXRtZXRhZGF0YVxuICAgICAgICBmdW5jdGlvbiBPcmRpbmFyeUdldE1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKSB7XG4gICAgICAgICAgICB2YXIgaGFzT3duID0gT3JkaW5hcnlIYXNPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUCk7XG4gICAgICAgICAgICBpZiAoaGFzT3duKVxuICAgICAgICAgICAgICAgIHJldHVybiBPcmRpbmFyeUdldE93bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKTtcbiAgICAgICAgICAgIHZhciBwYXJlbnQgPSBPcmRpbmFyeUdldFByb3RvdHlwZU9mKE8pO1xuICAgICAgICAgICAgaWYgKCFJc051bGwocGFyZW50KSlcbiAgICAgICAgICAgICAgICByZXR1cm4gT3JkaW5hcnlHZXRNZXRhZGF0YShNZXRhZGF0YUtleSwgcGFyZW50LCBQKTtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gMy4xLjQuMSBPcmRpbmFyeUdldE93bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKVxuICAgICAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhLyNvcmRpbmFyeWdldG93bm1ldGFkYXRhXG4gICAgICAgIGZ1bmN0aW9uIE9yZGluYXJ5R2V0T3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApIHtcbiAgICAgICAgICAgIHZhciBtZXRhZGF0YU1hcCA9IEdldE9yQ3JlYXRlTWV0YWRhdGFNYXAoTywgUCwgLypDcmVhdGUqLyBmYWxzZSk7XG4gICAgICAgICAgICBpZiAoSXNVbmRlZmluZWQobWV0YWRhdGFNYXApKVxuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICByZXR1cm4gbWV0YWRhdGFNYXAuZ2V0KE1ldGFkYXRhS2V5KTtcbiAgICAgICAgfVxuICAgICAgICAvLyAzLjEuNS4xIE9yZGluYXJ5RGVmaW5lT3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE1ldGFkYXRhVmFsdWUsIE8sIFApXG4gICAgICAgIC8vIGh0dHBzOi8vcmJ1Y2t0b24uZ2l0aHViLmlvL3JlZmxlY3QtbWV0YWRhdGEvI29yZGluYXJ5ZGVmaW5lb3dubWV0YWRhdGFcbiAgICAgICAgZnVuY3Rpb24gT3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTWV0YWRhdGFWYWx1ZSwgTywgUCkge1xuICAgICAgICAgICAgdmFyIG1ldGFkYXRhTWFwID0gR2V0T3JDcmVhdGVNZXRhZGF0YU1hcChPLCBQLCAvKkNyZWF0ZSovIHRydWUpO1xuICAgICAgICAgICAgbWV0YWRhdGFNYXAuc2V0KE1ldGFkYXRhS2V5LCBNZXRhZGF0YVZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICAvLyAzLjEuNi4xIE9yZGluYXJ5TWV0YWRhdGFLZXlzKE8sIFApXG4gICAgICAgIC8vIGh0dHBzOi8vcmJ1Y2t0b24uZ2l0aHViLmlvL3JlZmxlY3QtbWV0YWRhdGEvI29yZGluYXJ5bWV0YWRhdGFrZXlzXG4gICAgICAgIGZ1bmN0aW9uIE9yZGluYXJ5TWV0YWRhdGFLZXlzKE8sIFApIHtcbiAgICAgICAgICAgIHZhciBvd25LZXlzID0gT3JkaW5hcnlPd25NZXRhZGF0YUtleXMoTywgUCk7XG4gICAgICAgICAgICB2YXIgcGFyZW50ID0gT3JkaW5hcnlHZXRQcm90b3R5cGVPZihPKTtcbiAgICAgICAgICAgIGlmIChwYXJlbnQgPT09IG51bGwpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG93bktleXM7XG4gICAgICAgICAgICB2YXIgcGFyZW50S2V5cyA9IE9yZGluYXJ5TWV0YWRhdGFLZXlzKHBhcmVudCwgUCk7XG4gICAgICAgICAgICBpZiAocGFyZW50S2V5cy5sZW5ndGggPD0gMClcbiAgICAgICAgICAgICAgICByZXR1cm4gb3duS2V5cztcbiAgICAgICAgICAgIGlmIChvd25LZXlzLmxlbmd0aCA8PSAwKVxuICAgICAgICAgICAgICAgIHJldHVybiBwYXJlbnRLZXlzO1xuICAgICAgICAgICAgdmFyIHNldCA9IG5ldyBfU2V0KCk7XG4gICAgICAgICAgICB2YXIga2V5cyA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgX2kgPSAwLCBvd25LZXlzXzEgPSBvd25LZXlzOyBfaSA8IG93bktleXNfMS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgICAgICB2YXIga2V5ID0gb3duS2V5c18xW19pXTtcbiAgICAgICAgICAgICAgICB2YXIgaGFzS2V5ID0gc2V0LmhhcyhrZXkpO1xuICAgICAgICAgICAgICAgIGlmICghaGFzS2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIHNldC5hZGQoa2V5KTtcbiAgICAgICAgICAgICAgICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yICh2YXIgX2EgPSAwLCBwYXJlbnRLZXlzXzEgPSBwYXJlbnRLZXlzOyBfYSA8IHBhcmVudEtleXNfMS5sZW5ndGg7IF9hKyspIHtcbiAgICAgICAgICAgICAgICB2YXIga2V5ID0gcGFyZW50S2V5c18xW19hXTtcbiAgICAgICAgICAgICAgICB2YXIgaGFzS2V5ID0gc2V0LmhhcyhrZXkpO1xuICAgICAgICAgICAgICAgIGlmICghaGFzS2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIHNldC5hZGQoa2V5KTtcbiAgICAgICAgICAgICAgICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGtleXM7XG4gICAgICAgIH1cbiAgICAgICAgLy8gMy4xLjcuMSBPcmRpbmFyeU93bk1ldGFkYXRhS2V5cyhPLCBQKVxuICAgICAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhLyNvcmRpbmFyeW93bm1ldGFkYXRha2V5c1xuICAgICAgICBmdW5jdGlvbiBPcmRpbmFyeU93bk1ldGFkYXRhS2V5cyhPLCBQKSB7XG4gICAgICAgICAgICB2YXIga2V5cyA9IFtdO1xuICAgICAgICAgICAgdmFyIG1ldGFkYXRhTWFwID0gR2V0T3JDcmVhdGVNZXRhZGF0YU1hcChPLCBQLCAvKkNyZWF0ZSovIGZhbHNlKTtcbiAgICAgICAgICAgIGlmIChJc1VuZGVmaW5lZChtZXRhZGF0YU1hcCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGtleXM7XG4gICAgICAgICAgICB2YXIga2V5c09iaiA9IG1ldGFkYXRhTWFwLmtleXMoKTtcbiAgICAgICAgICAgIHZhciBpdGVyYXRvciA9IEdldEl0ZXJhdG9yKGtleXNPYmopO1xuICAgICAgICAgICAgdmFyIGsgPSAwO1xuICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICB2YXIgbmV4dCA9IEl0ZXJhdG9yU3RlcChpdGVyYXRvcik7XG4gICAgICAgICAgICAgICAgaWYgKCFuZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIGtleXMubGVuZ3RoID0gaztcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGtleXM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBuZXh0VmFsdWUgPSBJdGVyYXRvclZhbHVlKG5leHQpO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGtleXNba10gPSBuZXh0VmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBJdGVyYXRvckNsb3NlKGl0ZXJhdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaysrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIDYgRUNNQVNjcmlwdCBEYXRhIFR5cDBlcyBhbmQgVmFsdWVzXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWVjbWFzY3JpcHQtZGF0YS10eXBlcy1hbmQtdmFsdWVzXG4gICAgICAgIGZ1bmN0aW9uIFR5cGUoeCkge1xuICAgICAgICAgICAgaWYgKHggPT09IG51bGwpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogTnVsbCAqLztcbiAgICAgICAgICAgIHN3aXRjaCAodHlwZW9mIHgpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwidW5kZWZpbmVkXCI6IHJldHVybiAwIC8qIFVuZGVmaW5lZCAqLztcbiAgICAgICAgICAgICAgICBjYXNlIFwiYm9vbGVhblwiOiByZXR1cm4gMiAvKiBCb29sZWFuICovO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJzdHJpbmdcIjogcmV0dXJuIDMgLyogU3RyaW5nICovO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJzeW1ib2xcIjogcmV0dXJuIDQgLyogU3ltYm9sICovO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJudW1iZXJcIjogcmV0dXJuIDUgLyogTnVtYmVyICovO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJvYmplY3RcIjogcmV0dXJuIHggPT09IG51bGwgPyAxIC8qIE51bGwgKi8gOiA2IC8qIE9iamVjdCAqLztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OiByZXR1cm4gNiAvKiBPYmplY3QgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gNi4xLjEgVGhlIFVuZGVmaW5lZCBUeXBlXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWVjbWFzY3JpcHQtbGFuZ3VhZ2UtdHlwZXMtdW5kZWZpbmVkLXR5cGVcbiAgICAgICAgZnVuY3Rpb24gSXNVbmRlZmluZWQoeCkge1xuICAgICAgICAgICAgcmV0dXJuIHggPT09IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICAvLyA2LjEuMiBUaGUgTnVsbCBUeXBlXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWVjbWFzY3JpcHQtbGFuZ3VhZ2UtdHlwZXMtbnVsbC10eXBlXG4gICAgICAgIGZ1bmN0aW9uIElzTnVsbCh4KSB7XG4gICAgICAgICAgICByZXR1cm4geCA9PT0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICAvLyA2LjEuNSBUaGUgU3ltYm9sIFR5cGVcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtZWNtYXNjcmlwdC1sYW5ndWFnZS10eXBlcy1zeW1ib2wtdHlwZVxuICAgICAgICBmdW5jdGlvbiBJc1N5bWJvbCh4KSB7XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIHggPT09IFwic3ltYm9sXCI7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNi4xLjcgVGhlIE9iamVjdCBUeXBlXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC10eXBlXG4gICAgICAgIGZ1bmN0aW9uIElzT2JqZWN0KHgpIHtcbiAgICAgICAgICAgIHJldHVybiB0eXBlb2YgeCA9PT0gXCJvYmplY3RcIiA/IHggIT09IG51bGwgOiB0eXBlb2YgeCA9PT0gXCJmdW5jdGlvblwiO1xuICAgICAgICB9XG4gICAgICAgIC8vIDcuMSBUeXBlIENvbnZlcnNpb25cbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtdHlwZS1jb252ZXJzaW9uXG4gICAgICAgIC8vIDcuMS4xIFRvUHJpbWl0aXZlKGlucHV0IFssIFByZWZlcnJlZFR5cGVdKVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy10b3ByaW1pdGl2ZVxuICAgICAgICBmdW5jdGlvbiBUb1ByaW1pdGl2ZShpbnB1dCwgUHJlZmVycmVkVHlwZSkge1xuICAgICAgICAgICAgc3dpdGNoIChUeXBlKGlucHV0KSkge1xuICAgICAgICAgICAgICAgIGNhc2UgMCAvKiBVbmRlZmluZWQgKi86IHJldHVybiBpbnB1dDtcbiAgICAgICAgICAgICAgICBjYXNlIDEgLyogTnVsbCAqLzogcmV0dXJuIGlucHV0O1xuICAgICAgICAgICAgICAgIGNhc2UgMiAvKiBCb29sZWFuICovOiByZXR1cm4gaW5wdXQ7XG4gICAgICAgICAgICAgICAgY2FzZSAzIC8qIFN0cmluZyAqLzogcmV0dXJuIGlucHV0O1xuICAgICAgICAgICAgICAgIGNhc2UgNCAvKiBTeW1ib2wgKi86IHJldHVybiBpbnB1dDtcbiAgICAgICAgICAgICAgICBjYXNlIDUgLyogTnVtYmVyICovOiByZXR1cm4gaW5wdXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgaGludCA9IFByZWZlcnJlZFR5cGUgPT09IDMgLyogU3RyaW5nICovID8gXCJzdHJpbmdcIiA6IFByZWZlcnJlZFR5cGUgPT09IDUgLyogTnVtYmVyICovID8gXCJudW1iZXJcIiA6IFwiZGVmYXVsdFwiO1xuICAgICAgICAgICAgdmFyIGV4b3RpY1RvUHJpbSA9IEdldE1ldGhvZChpbnB1dCwgdG9QcmltaXRpdmVTeW1ib2wpO1xuICAgICAgICAgICAgaWYgKGV4b3RpY1RvUHJpbSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGV4b3RpY1RvUHJpbS5jYWxsKGlucHV0LCBoaW50KTtcbiAgICAgICAgICAgICAgICBpZiAoSXNPYmplY3QocmVzdWx0KSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gT3JkaW5hcnlUb1ByaW1pdGl2ZShpbnB1dCwgaGludCA9PT0gXCJkZWZhdWx0XCIgPyBcIm51bWJlclwiIDogaGludCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNy4xLjEuMSBPcmRpbmFyeVRvUHJpbWl0aXZlKE8sIGhpbnQpXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9yZGluYXJ5dG9wcmltaXRpdmVcbiAgICAgICAgZnVuY3Rpb24gT3JkaW5hcnlUb1ByaW1pdGl2ZShPLCBoaW50KSB7XG4gICAgICAgICAgICBpZiAoaGludCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgIHZhciB0b1N0cmluZ18xID0gTy50b1N0cmluZztcbiAgICAgICAgICAgICAgICBpZiAoSXNDYWxsYWJsZSh0b1N0cmluZ18xKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gdG9TdHJpbmdfMS5jYWxsKE8pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHJlc3VsdCkpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgdmFsdWVPZiA9IE8udmFsdWVPZjtcbiAgICAgICAgICAgICAgICBpZiAoSXNDYWxsYWJsZSh2YWx1ZU9mKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gdmFsdWVPZi5jYWxsKE8pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHJlc3VsdCkpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciB2YWx1ZU9mID0gTy52YWx1ZU9mO1xuICAgICAgICAgICAgICAgIGlmIChJc0NhbGxhYmxlKHZhbHVlT2YpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSB2YWx1ZU9mLmNhbGwoTyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghSXNPYmplY3QocmVzdWx0KSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciB0b1N0cmluZ18yID0gTy50b1N0cmluZztcbiAgICAgICAgICAgICAgICBpZiAoSXNDYWxsYWJsZSh0b1N0cmluZ18yKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gdG9TdHJpbmdfMi5jYWxsKE8pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHJlc3VsdCkpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyA3LjEuMiBUb0Jvb2xlYW4oYXJndW1lbnQpXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8yMDE2LyNzZWMtdG9ib29sZWFuXG4gICAgICAgIGZ1bmN0aW9uIFRvQm9vbGVhbihhcmd1bWVudCkge1xuICAgICAgICAgICAgcmV0dXJuICEhYXJndW1lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNy4xLjEyIFRvU3RyaW5nKGFyZ3VtZW50KVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy10b3N0cmluZ1xuICAgICAgICBmdW5jdGlvbiBUb1N0cmluZyhhcmd1bWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIFwiXCIgKyBhcmd1bWVudDtcbiAgICAgICAgfVxuICAgICAgICAvLyA3LjEuMTQgVG9Qcm9wZXJ0eUtleShhcmd1bWVudClcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtdG9wcm9wZXJ0eWtleVxuICAgICAgICBmdW5jdGlvbiBUb1Byb3BlcnR5S2V5KGFyZ3VtZW50KSB7XG4gICAgICAgICAgICB2YXIga2V5ID0gVG9QcmltaXRpdmUoYXJndW1lbnQsIDMgLyogU3RyaW5nICovKTtcbiAgICAgICAgICAgIGlmIChJc1N5bWJvbChrZXkpKVxuICAgICAgICAgICAgICAgIHJldHVybiBrZXk7XG4gICAgICAgICAgICByZXR1cm4gVG9TdHJpbmcoa2V5KTtcbiAgICAgICAgfVxuICAgICAgICAvLyA3LjIgVGVzdGluZyBhbmQgQ29tcGFyaXNvbiBPcGVyYXRpb25zXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXRlc3RpbmctYW5kLWNvbXBhcmlzb24tb3BlcmF0aW9uc1xuICAgICAgICAvLyA3LjIuMiBJc0FycmF5KGFyZ3VtZW50KVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1pc2FycmF5XG4gICAgICAgIGZ1bmN0aW9uIElzQXJyYXkoYXJndW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5XG4gICAgICAgICAgICAgICAgPyBBcnJheS5pc0FycmF5KGFyZ3VtZW50KVxuICAgICAgICAgICAgICAgIDogYXJndW1lbnQgaW5zdGFuY2VvZiBPYmplY3RcbiAgICAgICAgICAgICAgICAgICAgPyBhcmd1bWVudCBpbnN0YW5jZW9mIEFycmF5XG4gICAgICAgICAgICAgICAgICAgIDogT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGFyZ3VtZW50KSA9PT0gXCJbb2JqZWN0IEFycmF5XVwiO1xuICAgICAgICB9XG4gICAgICAgIC8vIDcuMi4zIElzQ2FsbGFibGUoYXJndW1lbnQpXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWlzY2FsbGFibGVcbiAgICAgICAgZnVuY3Rpb24gSXNDYWxsYWJsZShhcmd1bWVudCkge1xuICAgICAgICAgICAgLy8gTk9URTogVGhpcyBpcyBhbiBhcHByb3hpbWF0aW9uIGFzIHdlIGNhbm5vdCBjaGVjayBmb3IgW1tDYWxsXV0gaW50ZXJuYWwgbWV0aG9kLlxuICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBhcmd1bWVudCA9PT0gXCJmdW5jdGlvblwiO1xuICAgICAgICB9XG4gICAgICAgIC8vIDcuMi40IElzQ29uc3RydWN0b3IoYXJndW1lbnQpXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWlzY29uc3RydWN0b3JcbiAgICAgICAgZnVuY3Rpb24gSXNDb25zdHJ1Y3Rvcihhcmd1bWVudCkge1xuICAgICAgICAgICAgLy8gTk9URTogVGhpcyBpcyBhbiBhcHByb3hpbWF0aW9uIGFzIHdlIGNhbm5vdCBjaGVjayBmb3IgW1tDb25zdHJ1Y3RdXSBpbnRlcm5hbCBtZXRob2QuXG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIGFyZ3VtZW50ID09PSBcImZ1bmN0aW9uXCI7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNy4yLjcgSXNQcm9wZXJ0eUtleShhcmd1bWVudClcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtaXNwcm9wZXJ0eWtleVxuICAgICAgICBmdW5jdGlvbiBJc1Byb3BlcnR5S2V5KGFyZ3VtZW50KSB7XG4gICAgICAgICAgICBzd2l0Y2ggKFR5cGUoYXJndW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAzIC8qIFN0cmluZyAqLzogcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgY2FzZSA0IC8qIFN5bWJvbCAqLzogcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIDcuMyBPcGVyYXRpb25zIG9uIE9iamVjdHNcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb3BlcmF0aW9ucy1vbi1vYmplY3RzXG4gICAgICAgIC8vIDcuMy45IEdldE1ldGhvZChWLCBQKVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1nZXRtZXRob2RcbiAgICAgICAgZnVuY3Rpb24gR2V0TWV0aG9kKFYsIFApIHtcbiAgICAgICAgICAgIHZhciBmdW5jID0gVltQXTtcbiAgICAgICAgICAgIGlmIChmdW5jID09PSB1bmRlZmluZWQgfHwgZnVuYyA9PT0gbnVsbClcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKCFJc0NhbGxhYmxlKGZ1bmMpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgIHJldHVybiBmdW5jO1xuICAgICAgICB9XG4gICAgICAgIC8vIDcuNCBPcGVyYXRpb25zIG9uIEl0ZXJhdG9yIE9iamVjdHNcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb3BlcmF0aW9ucy1vbi1pdGVyYXRvci1vYmplY3RzXG4gICAgICAgIGZ1bmN0aW9uIEdldEl0ZXJhdG9yKG9iaikge1xuICAgICAgICAgICAgdmFyIG1ldGhvZCA9IEdldE1ldGhvZChvYmosIGl0ZXJhdG9yU3ltYm9sKTtcbiAgICAgICAgICAgIGlmICghSXNDYWxsYWJsZShtZXRob2QpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsgLy8gZnJvbSBDYWxsXG4gICAgICAgICAgICB2YXIgaXRlcmF0b3IgPSBtZXRob2QuY2FsbChvYmopO1xuICAgICAgICAgICAgaWYgKCFJc09iamVjdChpdGVyYXRvcikpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgcmV0dXJuIGl0ZXJhdG9yO1xuICAgICAgICB9XG4gICAgICAgIC8vIDcuNC40IEl0ZXJhdG9yVmFsdWUoaXRlclJlc3VsdClcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLzIwMTYvI3NlYy1pdGVyYXRvcnZhbHVlXG4gICAgICAgIGZ1bmN0aW9uIEl0ZXJhdG9yVmFsdWUoaXRlclJlc3VsdCkge1xuICAgICAgICAgICAgcmV0dXJuIGl0ZXJSZXN1bHQudmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNy40LjUgSXRlcmF0b3JTdGVwKGl0ZXJhdG9yKVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1pdGVyYXRvcnN0ZXBcbiAgICAgICAgZnVuY3Rpb24gSXRlcmF0b3JTdGVwKGl0ZXJhdG9yKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gaXRlcmF0b3IubmV4dCgpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5kb25lID8gZmFsc2UgOiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNy40LjYgSXRlcmF0b3JDbG9zZShpdGVyYXRvciwgY29tcGxldGlvbilcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtaXRlcmF0b3JjbG9zZVxuICAgICAgICBmdW5jdGlvbiBJdGVyYXRvckNsb3NlKGl0ZXJhdG9yKSB7XG4gICAgICAgICAgICB2YXIgZiA9IGl0ZXJhdG9yW1wicmV0dXJuXCJdO1xuICAgICAgICAgICAgaWYgKGYpXG4gICAgICAgICAgICAgICAgZi5jYWxsKGl0ZXJhdG9yKTtcbiAgICAgICAgfVxuICAgICAgICAvLyA5LjEgT3JkaW5hcnkgT2JqZWN0IEludGVybmFsIE1ldGhvZHMgYW5kIEludGVybmFsIFNsb3RzXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9yZGluYXJ5LW9iamVjdC1pbnRlcm5hbC1tZXRob2RzLWFuZC1pbnRlcm5hbC1zbG90c1xuICAgICAgICAvLyA5LjEuMS4xIE9yZGluYXJ5R2V0UHJvdG90eXBlT2YoTylcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb3JkaW5hcnlnZXRwcm90b3R5cGVvZlxuICAgICAgICBmdW5jdGlvbiBPcmRpbmFyeUdldFByb3RvdHlwZU9mKE8pIHtcbiAgICAgICAgICAgIHZhciBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihPKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgTyAhPT0gXCJmdW5jdGlvblwiIHx8IE8gPT09IGZ1bmN0aW9uUHJvdG90eXBlKVxuICAgICAgICAgICAgICAgIHJldHVybiBwcm90bztcbiAgICAgICAgICAgIC8vIFR5cGVTY3JpcHQgZG9lc24ndCBzZXQgX19wcm90b19fIGluIEVTNSwgYXMgaXQncyBub24tc3RhbmRhcmQuXG4gICAgICAgICAgICAvLyBUcnkgdG8gZGV0ZXJtaW5lIHRoZSBzdXBlcmNsYXNzIGNvbnN0cnVjdG9yLiBDb21wYXRpYmxlIGltcGxlbWVudGF0aW9uc1xuICAgICAgICAgICAgLy8gbXVzdCBlaXRoZXIgc2V0IF9fcHJvdG9fXyBvbiBhIHN1YmNsYXNzIGNvbnN0cnVjdG9yIHRvIHRoZSBzdXBlcmNsYXNzIGNvbnN0cnVjdG9yLFxuICAgICAgICAgICAgLy8gb3IgZW5zdXJlIGVhY2ggY2xhc3MgaGFzIGEgdmFsaWQgYGNvbnN0cnVjdG9yYCBwcm9wZXJ0eSBvbiBpdHMgcHJvdG90eXBlIHRoYXRcbiAgICAgICAgICAgIC8vIHBvaW50cyBiYWNrIHRvIHRoZSBjb25zdHJ1Y3Rvci5cbiAgICAgICAgICAgIC8vIElmIHRoaXMgaXMgbm90IHRoZSBzYW1lIGFzIEZ1bmN0aW9uLltbUHJvdG90eXBlXV0sIHRoZW4gdGhpcyBpcyBkZWZpbmF0ZWx5IGluaGVyaXRlZC5cbiAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIGNhc2Ugd2hlbiBpbiBFUzYgb3Igd2hlbiB1c2luZyBfX3Byb3RvX18gaW4gYSBjb21wYXRpYmxlIGJyb3dzZXIuXG4gICAgICAgICAgICBpZiAocHJvdG8gIT09IGZ1bmN0aW9uUHJvdG90eXBlKVxuICAgICAgICAgICAgICAgIHJldHVybiBwcm90bztcbiAgICAgICAgICAgIC8vIElmIHRoZSBzdXBlciBwcm90b3R5cGUgaXMgT2JqZWN0LnByb3RvdHlwZSwgbnVsbCwgb3IgdW5kZWZpbmVkLCB0aGVuIHdlIGNhbm5vdCBkZXRlcm1pbmUgdGhlIGhlcml0YWdlLlxuICAgICAgICAgICAgdmFyIHByb3RvdHlwZSA9IE8ucHJvdG90eXBlO1xuICAgICAgICAgICAgdmFyIHByb3RvdHlwZVByb3RvID0gcHJvdG90eXBlICYmIE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90b3R5cGUpO1xuICAgICAgICAgICAgaWYgKHByb3RvdHlwZVByb3RvID09IG51bGwgfHwgcHJvdG90eXBlUHJvdG8gPT09IE9iamVjdC5wcm90b3R5cGUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHByb3RvO1xuICAgICAgICAgICAgLy8gSWYgdGhlIGNvbnN0cnVjdG9yIHdhcyBub3QgYSBmdW5jdGlvbiwgdGhlbiB3ZSBjYW5ub3QgZGV0ZXJtaW5lIHRoZSBoZXJpdGFnZS5cbiAgICAgICAgICAgIHZhciBjb25zdHJ1Y3RvciA9IHByb3RvdHlwZVByb3RvLmNvbnN0cnVjdG9yO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBjb25zdHJ1Y3RvciAhPT0gXCJmdW5jdGlvblwiKVxuICAgICAgICAgICAgICAgIHJldHVybiBwcm90bztcbiAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgc29tZSBraW5kIG9mIHNlbGYtcmVmZXJlbmNlLCB0aGVuIHdlIGNhbm5vdCBkZXRlcm1pbmUgdGhlIGhlcml0YWdlLlxuICAgICAgICAgICAgaWYgKGNvbnN0cnVjdG9yID09PSBPKVxuICAgICAgICAgICAgICAgIHJldHVybiBwcm90bztcbiAgICAgICAgICAgIC8vIHdlIGhhdmUgYSBwcmV0dHkgZ29vZCBndWVzcyBhdCB0aGUgaGVyaXRhZ2UuXG4gICAgICAgICAgICByZXR1cm4gY29uc3RydWN0b3I7XG4gICAgICAgIH1cbiAgICAgICAgLy8gbmFpdmUgTWFwIHNoaW1cbiAgICAgICAgZnVuY3Rpb24gQ3JlYXRlTWFwUG9seWZpbGwoKSB7XG4gICAgICAgICAgICB2YXIgY2FjaGVTZW50aW5lbCA9IHt9O1xuICAgICAgICAgICAgdmFyIGFycmF5U2VudGluZWwgPSBbXTtcbiAgICAgICAgICAgIHZhciBNYXBJdGVyYXRvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBNYXBJdGVyYXRvcihrZXlzLCB2YWx1ZXMsIHNlbGVjdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2luZGV4ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fa2V5cyA9IGtleXM7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlcyA9IHZhbHVlcztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2VsZWN0b3IgPSBzZWxlY3RvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgTWFwSXRlcmF0b3IucHJvdG90eXBlW1wiQEBpdGVyYXRvclwiXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH07XG4gICAgICAgICAgICAgICAgTWFwSXRlcmF0b3IucHJvdG90eXBlW2l0ZXJhdG9yU3ltYm9sXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH07XG4gICAgICAgICAgICAgICAgTWFwSXRlcmF0b3IucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IHRoaXMuX2luZGV4O1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IHRoaXMuX2tleXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gdGhpcy5fc2VsZWN0b3IodGhpcy5fa2V5c1tpbmRleF0sIHRoaXMuX3ZhbHVlc1tpbmRleF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ICsgMSA+PSB0aGlzLl9rZXlzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2luZGV4ID0gLTE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fa2V5cyA9IGFycmF5U2VudGluZWw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmFsdWVzID0gYXJyYXlTZW50aW5lbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2luZGV4Kys7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogcmVzdWx0LCBkb25lOiBmYWxzZSB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIE1hcEl0ZXJhdG9yLnByb3RvdHlwZS50aHJvdyA9IGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5faW5kZXggPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faW5kZXggPSAtMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2tleXMgPSBhcnJheVNlbnRpbmVsO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmFsdWVzID0gYXJyYXlTZW50aW5lbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIE1hcEl0ZXJhdG9yLnByb3RvdHlwZS5yZXR1cm4gPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2luZGV4ID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2luZGV4ID0gLTE7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9rZXlzID0gYXJyYXlTZW50aW5lbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlcyA9IGFycmF5U2VudGluZWw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IHZhbHVlLCBkb25lOiB0cnVlIH07XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICByZXR1cm4gTWFwSXRlcmF0b3I7XG4gICAgICAgICAgICB9KCkpO1xuICAgICAgICAgICAgcmV0dXJuIC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBNYXAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2tleXMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmFsdWVzID0gW107XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhY2hlS2V5ID0gY2FjaGVTZW50aW5lbDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVJbmRleCA9IC0yO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoTWFwLnByb3RvdHlwZSwgXCJzaXplXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9rZXlzLmxlbmd0aDsgfSxcbiAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgTWFwLnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiAoa2V5KSB7IHJldHVybiB0aGlzLl9maW5kKGtleSwgLyppbnNlcnQqLyBmYWxzZSkgPj0gMDsgfTtcbiAgICAgICAgICAgICAgICBNYXAucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gdGhpcy5fZmluZChrZXksIC8qaW5zZXJ0Ki8gZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXggPj0gMCA/IHRoaXMuX3ZhbHVlc1tpbmRleF0gOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBNYXAucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IHRoaXMuX2ZpbmQoa2V5LCAvKmluc2VydCovIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZXNbaW5kZXhdID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgTWFwLnByb3RvdHlwZS5kZWxldGUgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IHRoaXMuX2ZpbmQoa2V5LCAvKmluc2VydCovIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzaXplID0gdGhpcy5fa2V5cy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gaW5kZXggKyAxOyBpIDwgc2l6ZTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fa2V5c1tpIC0gMV0gPSB0aGlzLl9rZXlzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlc1tpIC0gMV0gPSB0aGlzLl92YWx1ZXNbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9rZXlzLmxlbmd0aC0tO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmFsdWVzLmxlbmd0aC0tO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGtleSA9PT0gdGhpcy5fY2FjaGVLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jYWNoZUtleSA9IGNhY2hlU2VudGluZWw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVJbmRleCA9IC0yO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgTWFwLnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fa2V5cy5sZW5ndGggPSAwO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZXMubGVuZ3RoID0gMDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVLZXkgPSBjYWNoZVNlbnRpbmVsO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jYWNoZUluZGV4ID0gLTI7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBNYXAucHJvdG90eXBlLmtleXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBuZXcgTWFwSXRlcmF0b3IodGhpcy5fa2V5cywgdGhpcy5fdmFsdWVzLCBnZXRLZXkpOyB9O1xuICAgICAgICAgICAgICAgIE1hcC5wcm90b3R5cGUudmFsdWVzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IE1hcEl0ZXJhdG9yKHRoaXMuX2tleXMsIHRoaXMuX3ZhbHVlcywgZ2V0VmFsdWUpOyB9O1xuICAgICAgICAgICAgICAgIE1hcC5wcm90b3R5cGUuZW50cmllcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBNYXBJdGVyYXRvcih0aGlzLl9rZXlzLCB0aGlzLl92YWx1ZXMsIGdldEVudHJ5KTsgfTtcbiAgICAgICAgICAgICAgICBNYXAucHJvdG90eXBlW1wiQEBpdGVyYXRvclwiXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuZW50cmllcygpOyB9O1xuICAgICAgICAgICAgICAgIE1hcC5wcm90b3R5cGVbaXRlcmF0b3JTeW1ib2xdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5lbnRyaWVzKCk7IH07XG4gICAgICAgICAgICAgICAgTWFwLnByb3RvdHlwZS5fZmluZCA9IGZ1bmN0aW9uIChrZXksIGluc2VydCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fY2FjaGVLZXkgIT09IGtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVJbmRleCA9IHRoaXMuX2tleXMuaW5kZXhPZih0aGlzLl9jYWNoZUtleSA9IGtleSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2NhY2hlSW5kZXggPCAwICYmIGluc2VydCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVJbmRleCA9IHRoaXMuX2tleXMubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fa2V5cy5wdXNoKGtleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZXMucHVzaCh1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9jYWNoZUluZGV4O1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcmV0dXJuIE1hcDtcbiAgICAgICAgICAgIH0oKSk7XG4gICAgICAgICAgICBmdW5jdGlvbiBnZXRLZXkoa2V5LCBfKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGtleTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIGdldFZhbHVlKF8sIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnVuY3Rpb24gZ2V0RW50cnkoa2V5LCB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBba2V5LCB2YWx1ZV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gbmFpdmUgU2V0IHNoaW1cbiAgICAgICAgZnVuY3Rpb24gQ3JlYXRlU2V0UG9seWZpbGwoKSB7XG4gICAgICAgICAgICByZXR1cm4gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFNldCgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFwID0gbmV3IF9NYXAoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFNldC5wcm90b3R5cGUsIFwic2l6ZVwiLCB7XG4gICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fbWFwLnNpemU7IH0sXG4gICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIFNldC5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB0aGlzLl9tYXAuaGFzKHZhbHVlKTsgfTtcbiAgICAgICAgICAgICAgICBTZXQucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdGhpcy5fbWFwLnNldCh2YWx1ZSwgdmFsdWUpLCB0aGlzOyB9O1xuICAgICAgICAgICAgICAgIFNldC5wcm90b3R5cGUuZGVsZXRlID0gZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB0aGlzLl9tYXAuZGVsZXRlKHZhbHVlKTsgfTtcbiAgICAgICAgICAgICAgICBTZXQucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gKCkgeyB0aGlzLl9tYXAuY2xlYXIoKTsgfTtcbiAgICAgICAgICAgICAgICBTZXQucHJvdG90eXBlLmtleXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9tYXAua2V5cygpOyB9O1xuICAgICAgICAgICAgICAgIFNldC5wcm90b3R5cGUudmFsdWVzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fbWFwLnZhbHVlcygpOyB9O1xuICAgICAgICAgICAgICAgIFNldC5wcm90b3R5cGUuZW50cmllcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX21hcC5lbnRyaWVzKCk7IH07XG4gICAgICAgICAgICAgICAgU2V0LnByb3RvdHlwZVtcIkBAaXRlcmF0b3JcIl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLmtleXMoKTsgfTtcbiAgICAgICAgICAgICAgICBTZXQucHJvdG90eXBlW2l0ZXJhdG9yU3ltYm9sXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMua2V5cygpOyB9O1xuICAgICAgICAgICAgICAgIHJldHVybiBTZXQ7XG4gICAgICAgICAgICB9KCkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIG5haXZlIFdlYWtNYXAgc2hpbVxuICAgICAgICBmdW5jdGlvbiBDcmVhdGVXZWFrTWFwUG9seWZpbGwoKSB7XG4gICAgICAgICAgICB2YXIgVVVJRF9TSVpFID0gMTY7XG4gICAgICAgICAgICB2YXIga2V5cyA9IEhhc2hNYXAuY3JlYXRlKCk7XG4gICAgICAgICAgICB2YXIgcm9vdEtleSA9IENyZWF0ZVVuaXF1ZUtleSgpO1xuICAgICAgICAgICAgcmV0dXJuIC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBXZWFrTWFwKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9rZXkgPSBDcmVhdGVVbmlxdWVLZXkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgV2Vha01hcC5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdGFibGUgPSBHZXRPckNyZWF0ZVdlYWtNYXBUYWJsZSh0YXJnZXQsIC8qY3JlYXRlKi8gZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFibGUgIT09IHVuZGVmaW5lZCA/IEhhc2hNYXAuaGFzKHRhYmxlLCB0aGlzLl9rZXkpIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBXZWFrTWFwLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0YWJsZSA9IEdldE9yQ3JlYXRlV2Vha01hcFRhYmxlKHRhcmdldCwgLypjcmVhdGUqLyBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0YWJsZSAhPT0gdW5kZWZpbmVkID8gSGFzaE1hcC5nZXQodGFibGUsIHRoaXMuX2tleSkgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBXZWFrTWFwLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAodGFyZ2V0LCB2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdGFibGUgPSBHZXRPckNyZWF0ZVdlYWtNYXBUYWJsZSh0YXJnZXQsIC8qY3JlYXRlKi8gdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHRhYmxlW3RoaXMuX2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBXZWFrTWFwLnByb3RvdHlwZS5kZWxldGUgPSBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0YWJsZSA9IEdldE9yQ3JlYXRlV2Vha01hcFRhYmxlKHRhcmdldCwgLypjcmVhdGUqLyBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0YWJsZSAhPT0gdW5kZWZpbmVkID8gZGVsZXRlIHRhYmxlW3RoaXMuX2tleV0gOiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIFdlYWtNYXAucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOiBub3QgYSByZWFsIGNsZWFyLCBqdXN0IG1ha2VzIHRoZSBwcmV2aW91cyBkYXRhIHVucmVhY2hhYmxlXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2tleSA9IENyZWF0ZVVuaXF1ZUtleSgpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcmV0dXJuIFdlYWtNYXA7XG4gICAgICAgICAgICB9KCkpO1xuICAgICAgICAgICAgZnVuY3Rpb24gQ3JlYXRlVW5pcXVlS2V5KCkge1xuICAgICAgICAgICAgICAgIHZhciBrZXk7XG4gICAgICAgICAgICAgICAgZG9cbiAgICAgICAgICAgICAgICAgICAga2V5ID0gXCJAQFdlYWtNYXBAQFwiICsgQ3JlYXRlVVVJRCgpO1xuICAgICAgICAgICAgICAgIHdoaWxlIChIYXNoTWFwLmhhcyhrZXlzLCBrZXkpKTtcbiAgICAgICAgICAgICAgICBrZXlzW2tleV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgIHJldHVybiBrZXk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBHZXRPckNyZWF0ZVdlYWtNYXBUYWJsZSh0YXJnZXQsIGNyZWF0ZSkge1xuICAgICAgICAgICAgICAgIGlmICghaGFzT3duLmNhbGwodGFyZ2V0LCByb290S2V5KSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNyZWF0ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHJvb3RLZXksIHsgdmFsdWU6IEhhc2hNYXAuY3JlYXRlKCkgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXRbcm9vdEtleV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBGaWxsUmFuZG9tQnl0ZXMoYnVmZmVyLCBzaXplKSB7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaXplOyArK2kpXG4gICAgICAgICAgICAgICAgICAgIGJ1ZmZlcltpXSA9IE1hdGgucmFuZG9tKCkgKiAweGZmIHwgMDtcbiAgICAgICAgICAgICAgICByZXR1cm4gYnVmZmVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnVuY3Rpb24gR2VuUmFuZG9tQnl0ZXMoc2l6ZSkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgVWludDhBcnJheSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY3J5cHRvICE9PSBcInVuZGVmaW5lZFwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQ4QXJyYXkoc2l6ZSkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG1zQ3J5cHRvICE9PSBcInVuZGVmaW5lZFwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1zQ3J5cHRvLmdldFJhbmRvbVZhbHVlcyhuZXcgVWludDhBcnJheShzaXplKSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBGaWxsUmFuZG9tQnl0ZXMobmV3IFVpbnQ4QXJyYXkoc2l6ZSksIHNpemUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gRmlsbFJhbmRvbUJ5dGVzKG5ldyBBcnJheShzaXplKSwgc2l6ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBDcmVhdGVVVUlEKCkge1xuICAgICAgICAgICAgICAgIHZhciBkYXRhID0gR2VuUmFuZG9tQnl0ZXMoVVVJRF9TSVpFKTtcbiAgICAgICAgICAgICAgICAvLyBtYXJrIGFzIHJhbmRvbSAtIFJGQyA0MTIyIMKnIDQuNFxuICAgICAgICAgICAgICAgIGRhdGFbNl0gPSBkYXRhWzZdICYgMHg0ZiB8IDB4NDA7XG4gICAgICAgICAgICAgICAgZGF0YVs4XSA9IGRhdGFbOF0gJiAweGJmIHwgMHg4MDtcbiAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gXCJcIjtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBvZmZzZXQgPSAwOyBvZmZzZXQgPCBVVUlEX1NJWkU7ICsrb2Zmc2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBieXRlID0gZGF0YVtvZmZzZXRdO1xuICAgICAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ID09PSA0IHx8IG9mZnNldCA9PT0gNiB8fCBvZmZzZXQgPT09IDgpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gXCItXCI7XG4gICAgICAgICAgICAgICAgICAgIGlmIChieXRlIDwgMTYpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gXCIwXCI7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBieXRlLnRvU3RyaW5nKDE2KS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIHVzZXMgYSBoZXVyaXN0aWMgdXNlZCBieSB2OCBhbmQgY2hha3JhIHRvIGZvcmNlIGFuIG9iamVjdCBpbnRvIGRpY3Rpb25hcnkgbW9kZS5cbiAgICAgICAgZnVuY3Rpb24gTWFrZURpY3Rpb25hcnkob2JqKSB7XG4gICAgICAgICAgICBvYmouX18gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBkZWxldGUgb2JqLl9fO1xuICAgICAgICAgICAgcmV0dXJuIG9iajtcbiAgICAgICAgfVxuICAgIH0pO1xufSkoUmVmbGVjdCB8fCAoUmVmbGVjdCA9IHt9KSk7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///239\n')},function(module,exports,__webpack_require__){eval('var arrayLikeToArray = __webpack_require__(241);\n\nfunction _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === "string") return arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === "Object" && o.constructor) n = o.constructor.name;\n if (n === "Map" || n === "Set") return Array.from(o);\n if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return arrayLikeToArray(o, minLen);\n}\n\nmodule.exports = _unsupportedIterableToArray;\nmodule.exports["default"] = module.exports, module.exports.__esModule = true;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheS5qcz82NjEzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHVCQUF1QixtQkFBTyxDQUFDLEdBQXVCOztBQUV0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EiLCJmaWxlIjoiMjQwLmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIGFycmF5TGlrZVRvQXJyYXkgPSByZXF1aXJlKFwiLi9hcnJheUxpa2VUb0FycmF5LmpzXCIpO1xuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7XG4gIGlmICghbykgcmV0dXJuO1xuICBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBhcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7XG4gIHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTtcbiAgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTtcbiAgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7XG4gIGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheTtcbm1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///240\n')},function(module,exports){eval('function _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n\n for (var i = 0, arr2 = new Array(len); i < len; i++) {\n arr2[i] = arr[i];\n }\n\n return arr2;\n}\n\nmodule.exports = _arrayLikeToArray;\nmodule.exports["default"] = module.exports, module.exports.__esModule = true;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hcnJheUxpa2VUb0FycmF5LmpzPzVhNDMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTs7QUFFQSx3Q0FBd0MsU0FBUztBQUNqRDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSIsImZpbGUiOiIyNDEuanMiLCJzb3VyY2VzQ29udGVudCI6WyJmdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikge1xuICBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDtcblxuICBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHtcbiAgICBhcnIyW2ldID0gYXJyW2ldO1xuICB9XG5cbiAgcmV0dXJuIGFycjI7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2FycmF5TGlrZVRvQXJyYXk7XG5tb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0cywgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///241\n')},function(module,exports,__webpack_require__){"use strict";eval('\nObject.defineProperty(exports, "__esModule", { value: true });\nexports.MetadataReader = void 0;\nvar METADATA_KEY = __webpack_require__(32);\nvar MetadataReader = (function () {\n function MetadataReader() {\n }\n MetadataReader.prototype.getConstructorMetadata = function (constructorFunc) {\n var compilerGeneratedMetadata = Reflect.getMetadata(METADATA_KEY.PARAM_TYPES, constructorFunc);\n var userGeneratedMetadata = Reflect.getMetadata(METADATA_KEY.TAGGED, constructorFunc);\n return {\n compilerGeneratedMetadata: compilerGeneratedMetadata,\n userGeneratedMetadata: userGeneratedMetadata || {}\n };\n };\n MetadataReader.prototype.getPropertiesMetadata = function (constructorFunc) {\n var userGeneratedMetadata = Reflect.getMetadata(METADATA_KEY.TAGGED_PROP, constructorFunc) || [];\n return userGeneratedMetadata;\n };\n return MetadataReader;\n}());\nexports.MetadataReader = MetadataReader;\n//# sourceMappingURL=metadata_reader.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaW52ZXJzaWZ5L2xpYi9wbGFubmluZy9tZXRhZGF0YV9yZWFkZXIuanM/YzI3OCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBYTtBQUNiLDhDQUE4QyxjQUFjO0FBQzVEO0FBQ0EsbUJBQW1CLG1CQUFPLENBQUMsRUFBNEI7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQSIsImZpbGUiOiIyNDIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuTWV0YWRhdGFSZWFkZXIgPSB2b2lkIDA7XG52YXIgTUVUQURBVEFfS0VZID0gcmVxdWlyZShcIi4uL2NvbnN0YW50cy9tZXRhZGF0YV9rZXlzXCIpO1xudmFyIE1ldGFkYXRhUmVhZGVyID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBNZXRhZGF0YVJlYWRlcigpIHtcbiAgICB9XG4gICAgTWV0YWRhdGFSZWFkZXIucHJvdG90eXBlLmdldENvbnN0cnVjdG9yTWV0YWRhdGEgPSBmdW5jdGlvbiAoY29uc3RydWN0b3JGdW5jKSB7XG4gICAgICAgIHZhciBjb21waWxlckdlbmVyYXRlZE1ldGFkYXRhID0gUmVmbGVjdC5nZXRNZXRhZGF0YShNRVRBREFUQV9LRVkuUEFSQU1fVFlQRVMsIGNvbnN0cnVjdG9yRnVuYyk7XG4gICAgICAgIHZhciB1c2VyR2VuZXJhdGVkTWV0YWRhdGEgPSBSZWZsZWN0LmdldE1ldGFkYXRhKE1FVEFEQVRBX0tFWS5UQUdHRUQsIGNvbnN0cnVjdG9yRnVuYyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb21waWxlckdlbmVyYXRlZE1ldGFkYXRhOiBjb21waWxlckdlbmVyYXRlZE1ldGFkYXRhLFxuICAgICAgICAgICAgdXNlckdlbmVyYXRlZE1ldGFkYXRhOiB1c2VyR2VuZXJhdGVkTWV0YWRhdGEgfHwge31cbiAgICAgICAgfTtcbiAgICB9O1xuICAgIE1ldGFkYXRhUmVhZGVyLnByb3RvdHlwZS5nZXRQcm9wZXJ0aWVzTWV0YWRhdGEgPSBmdW5jdGlvbiAoY29uc3RydWN0b3JGdW5jKSB7XG4gICAgICAgIHZhciB1c2VyR2VuZXJhdGVkTWV0YWRhdGEgPSBSZWZsZWN0LmdldE1ldGFkYXRhKE1FVEFEQVRBX0tFWS5UQUdHRURfUFJPUCwgY29uc3RydWN0b3JGdW5jKSB8fCBbXTtcbiAgICAgICAgcmV0dXJuIHVzZXJHZW5lcmF0ZWRNZXRhZGF0YTtcbiAgICB9O1xuICAgIHJldHVybiBNZXRhZGF0YVJlYWRlcjtcbn0oKSk7XG5leHBvcnRzLk1ldGFkYXRhUmVhZGVyID0gTWV0YWRhdGFSZWFkZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tZXRhZGF0YV9yZWFkZXIuanMubWFwIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///242\n')},function(module,exports,__webpack_require__){"use strict";eval('\nObject.defineProperty(exports, "__esModule", { value: true });\nexports.isStackOverflowExeption = void 0;\nvar ERROR_MSGS = __webpack_require__(40);\nfunction isStackOverflowExeption(error) {\n return (error instanceof RangeError ||\n error.message === ERROR_MSGS.STACK_OVERFLOW);\n}\nexports.isStackOverflowExeption = isStackOverflowExeption;\n//# sourceMappingURL=exceptions.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaW52ZXJzaWZ5L2xpYi91dGlscy9leGNlcHRpb25zLmpzP2E4YWYiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQWE7QUFDYiw4Q0FBOEMsY0FBYztBQUM1RDtBQUNBLGlCQUFpQixtQkFBTyxDQUFDLEVBQXlCO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiIyNDMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuaXNTdGFja092ZXJmbG93RXhlcHRpb24gPSB2b2lkIDA7XG52YXIgRVJST1JfTVNHUyA9IHJlcXVpcmUoXCIuLi9jb25zdGFudHMvZXJyb3JfbXNnc1wiKTtcbmZ1bmN0aW9uIGlzU3RhY2tPdmVyZmxvd0V4ZXB0aW9uKGVycm9yKSB7XG4gICAgcmV0dXJuIChlcnJvciBpbnN0YW5jZW9mIFJhbmdlRXJyb3IgfHxcbiAgICAgICAgZXJyb3IubWVzc2FnZSA9PT0gRVJST1JfTVNHUy5TVEFDS19PVkVSRkxPVyk7XG59XG5leHBvcnRzLmlzU3RhY2tPdmVyZmxvd0V4ZXB0aW9uID0gaXNTdGFja092ZXJmbG93RXhlcHRpb247XG4vLyMgc291cmNlTWFwcGluZ1VSTD1leGNlcHRpb25zLmpzLm1hcCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///243\n')},function(module,exports,__webpack_require__){"use strict";eval('\nObject.defineProperty(exports, "__esModule", { value: true });\nexports.inject = exports.LazyServiceIdentifer = void 0;\nvar error_msgs_1 = __webpack_require__(40);\nvar METADATA_KEY = __webpack_require__(32);\nvar metadata_1 = __webpack_require__(48);\nvar decorator_utils_1 = __webpack_require__(60);\nvar LazyServiceIdentifer = (function () {\n function LazyServiceIdentifer(cb) {\n this._cb = cb;\n }\n LazyServiceIdentifer.prototype.unwrap = function () {\n return this._cb();\n };\n return LazyServiceIdentifer;\n}());\nexports.LazyServiceIdentifer = LazyServiceIdentifer;\nfunction inject(serviceIdentifier) {\n return function (target, targetKey, index) {\n if (serviceIdentifier === undefined) {\n throw new Error(error_msgs_1.UNDEFINED_INJECT_ANNOTATION(target.name));\n }\n var metadata = new metadata_1.Metadata(METADATA_KEY.INJECT_TAG, serviceIdentifier);\n if (typeof index === "number") {\n decorator_utils_1.tagParameter(target, targetKey, index, metadata);\n }\n else {\n decorator_utils_1.tagProperty(target, targetKey, metadata);\n }\n };\n}\nexports.inject = inject;\n//# sourceMappingURL=inject.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaW52ZXJzaWZ5L2xpYi9hbm5vdGF0aW9uL2luamVjdC5qcz82MjRmIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFhO0FBQ2IsOENBQThDLGNBQWM7QUFDNUQ7QUFDQSxtQkFBbUIsbUJBQU8sQ0FBQyxFQUF5QjtBQUNwRCxtQkFBbUIsbUJBQU8sQ0FBQyxFQUE0QjtBQUN2RCxpQkFBaUIsbUJBQU8sQ0FBQyxFQUFzQjtBQUMvQyx3QkFBd0IsbUJBQU8sQ0FBQyxFQUFtQjtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiMjQ0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmluamVjdCA9IGV4cG9ydHMuTGF6eVNlcnZpY2VJZGVudGlmZXIgPSB2b2lkIDA7XG52YXIgZXJyb3JfbXNnc18xID0gcmVxdWlyZShcIi4uL2NvbnN0YW50cy9lcnJvcl9tc2dzXCIpO1xudmFyIE1FVEFEQVRBX0tFWSA9IHJlcXVpcmUoXCIuLi9jb25zdGFudHMvbWV0YWRhdGFfa2V5c1wiKTtcbnZhciBtZXRhZGF0YV8xID0gcmVxdWlyZShcIi4uL3BsYW5uaW5nL21ldGFkYXRhXCIpO1xudmFyIGRlY29yYXRvcl91dGlsc18xID0gcmVxdWlyZShcIi4vZGVjb3JhdG9yX3V0aWxzXCIpO1xudmFyIExhenlTZXJ2aWNlSWRlbnRpZmVyID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBMYXp5U2VydmljZUlkZW50aWZlcihjYikge1xuICAgICAgICB0aGlzLl9jYiA9IGNiO1xuICAgIH1cbiAgICBMYXp5U2VydmljZUlkZW50aWZlci5wcm90b3R5cGUudW53cmFwID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2IoKTtcbiAgICB9O1xuICAgIHJldHVybiBMYXp5U2VydmljZUlkZW50aWZlcjtcbn0oKSk7XG5leHBvcnRzLkxhenlTZXJ2aWNlSWRlbnRpZmVyID0gTGF6eVNlcnZpY2VJZGVudGlmZXI7XG5mdW5jdGlvbiBpbmplY3Qoc2VydmljZUlkZW50aWZpZXIpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwgdGFyZ2V0S2V5LCBpbmRleCkge1xuICAgICAgICBpZiAoc2VydmljZUlkZW50aWZpZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yX21zZ3NfMS5VTkRFRklORURfSU5KRUNUX0FOTk9UQVRJT04odGFyZ2V0Lm5hbWUpKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbWV0YWRhdGEgPSBuZXcgbWV0YWRhdGFfMS5NZXRhZGF0YShNRVRBREFUQV9LRVkuSU5KRUNUX1RBRywgc2VydmljZUlkZW50aWZpZXIpO1xuICAgICAgICBpZiAodHlwZW9mIGluZGV4ID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICBkZWNvcmF0b3JfdXRpbHNfMS50YWdQYXJhbWV0ZXIodGFyZ2V0LCB0YXJnZXRLZXksIGluZGV4LCBtZXRhZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBkZWNvcmF0b3JfdXRpbHNfMS50YWdQcm9wZXJ0eSh0YXJnZXQsIHRhcmdldEtleSwgbWV0YWRhdGEpO1xuICAgICAgICB9XG4gICAgfTtcbn1cbmV4cG9ydHMuaW5qZWN0ID0gaW5qZWN0O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5qZWN0LmpzLm1hcCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///244\n')},function(module,exports,__webpack_require__){"use strict";eval('\nObject.defineProperty(exports, "__esModule", { value: true });\nexports.Target = void 0;\nvar METADATA_KEY = __webpack_require__(32);\nvar id_1 = __webpack_require__(68);\nvar metadata_1 = __webpack_require__(48);\nvar queryable_string_1 = __webpack_require__(509);\nvar Target = (function () {\n function Target(type, name, serviceIdentifier, namedOrTagged) {\n this.id = id_1.id();\n this.type = type;\n this.serviceIdentifier = serviceIdentifier;\n this.name = new queryable_string_1.QueryableString(name || "");\n this.metadata = new Array();\n var metadataItem = null;\n if (typeof namedOrTagged === "string") {\n metadataItem = new metadata_1.Metadata(METADATA_KEY.NAMED_TAG, namedOrTagged);\n }\n else if (namedOrTagged instanceof metadata_1.Metadata) {\n metadataItem = namedOrTagged;\n }\n if (metadataItem !== null) {\n this.metadata.push(metadataItem);\n }\n }\n Target.prototype.hasTag = function (key) {\n for (var _i = 0, _a = this.metadata; _i < _a.length; _i++) {\n var m = _a[_i];\n if (m.key === key) {\n return true;\n }\n }\n return false;\n };\n Target.prototype.isArray = function () {\n return this.hasTag(METADATA_KEY.MULTI_INJECT_TAG);\n };\n Target.prototype.matchesArray = function (name) {\n return this.matchesTag(METADATA_KEY.MULTI_INJECT_TAG)(name);\n };\n Target.prototype.isNamed = function () {\n return this.hasTag(METADATA_KEY.NAMED_TAG);\n };\n Target.prototype.isTagged = function () {\n return this.metadata.some(function (metadata) { return METADATA_KEY.NON_CUSTOM_TAG_KEYS.every(function (key) { return metadata.key !== key; }); });\n };\n Target.prototype.isOptional = function () {\n return this.matchesTag(METADATA_KEY.OPTIONAL_TAG)(true);\n };\n Target.prototype.getNamedTag = function () {\n if (this.isNamed()) {\n return this.metadata.filter(function (m) { return m.key === METADATA_KEY.NAMED_TAG; })[0];\n }\n return null;\n };\n Target.prototype.getCustomTags = function () {\n if (this.isTagged()) {\n return this.metadata.filter(function (metadata) { return METADATA_KEY.NON_CUSTOM_TAG_KEYS.every(function (key) { return metadata.key !== key; }); });\n }\n else {\n return null;\n }\n };\n Target.prototype.matchesNamedTag = function (name) {\n return this.matchesTag(METADATA_KEY.NAMED_TAG)(name);\n };\n Target.prototype.matchesTag = function (key) {\n var _this = this;\n return function (value) {\n for (var _i = 0, _a = _this.metadata; _i < _a.length; _i++) {\n var m = _a[_i];\n if (m.key === key && m.value === value) {\n return true;\n }\n }\n return false;\n };\n };\n return Target;\n}());\nexports.Target = Target;\n//# sourceMappingURL=target.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaW52ZXJzaWZ5L2xpYi9wbGFubmluZy90YXJnZXQuanM/NzU3ZCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBYTtBQUNiLDhDQUE4QyxjQUFjO0FBQzVEO0FBQ0EsbUJBQW1CLG1CQUFPLENBQUMsRUFBNEI7QUFDdkQsV0FBVyxtQkFBTyxDQUFDLEVBQWE7QUFDaEMsaUJBQWlCLG1CQUFPLENBQUMsRUFBWTtBQUNyQyx5QkFBeUIsbUJBQU8sQ0FBQyxHQUFvQjtBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QyxnQkFBZ0I7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVEQUF1RCwrREFBK0QsNkJBQTZCLEVBQUUsRUFBRSxFQUFFO0FBQ3pKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNEQUFzRCx5Q0FBeUMsRUFBRTtBQUNqRztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkRBQTZELCtEQUErRCw2QkFBNkIsRUFBRSxFQUFFLEVBQUU7QUFDL0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlEQUFpRCxnQkFBZ0I7QUFDakU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0EiLCJmaWxlIjoiMjQ1LmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlRhcmdldCA9IHZvaWQgMDtcbnZhciBNRVRBREFUQV9LRVkgPSByZXF1aXJlKFwiLi4vY29uc3RhbnRzL21ldGFkYXRhX2tleXNcIik7XG52YXIgaWRfMSA9IHJlcXVpcmUoXCIuLi91dGlscy9pZFwiKTtcbnZhciBtZXRhZGF0YV8xID0gcmVxdWlyZShcIi4vbWV0YWRhdGFcIik7XG52YXIgcXVlcnlhYmxlX3N0cmluZ18xID0gcmVxdWlyZShcIi4vcXVlcnlhYmxlX3N0cmluZ1wiKTtcbnZhciBUYXJnZXQgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFRhcmdldCh0eXBlLCBuYW1lLCBzZXJ2aWNlSWRlbnRpZmllciwgbmFtZWRPclRhZ2dlZCkge1xuICAgICAgICB0aGlzLmlkID0gaWRfMS5pZCgpO1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLnNlcnZpY2VJZGVudGlmaWVyID0gc2VydmljZUlkZW50aWZpZXI7XG4gICAgICAgIHRoaXMubmFtZSA9IG5ldyBxdWVyeWFibGVfc3RyaW5nXzEuUXVlcnlhYmxlU3RyaW5nKG5hbWUgfHwgXCJcIik7XG4gICAgICAgIHRoaXMubWV0YWRhdGEgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgdmFyIG1ldGFkYXRhSXRlbSA9IG51bGw7XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZWRPclRhZ2dlZCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgbWV0YWRhdGFJdGVtID0gbmV3IG1ldGFkYXRhXzEuTWV0YWRhdGEoTUVUQURBVEFfS0VZLk5BTUVEX1RBRywgbmFtZWRPclRhZ2dlZCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobmFtZWRPclRhZ2dlZCBpbnN0YW5jZW9mIG1ldGFkYXRhXzEuTWV0YWRhdGEpIHtcbiAgICAgICAgICAgIG1ldGFkYXRhSXRlbSA9IG5hbWVkT3JUYWdnZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1ldGFkYXRhSXRlbSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5tZXRhZGF0YS5wdXNoKG1ldGFkYXRhSXRlbSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgVGFyZ2V0LnByb3RvdHlwZS5oYXNUYWcgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIGZvciAodmFyIF9pID0gMCwgX2EgPSB0aGlzLm1ldGFkYXRhOyBfaSA8IF9hLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgdmFyIG0gPSBfYVtfaV07XG4gICAgICAgICAgICBpZiAobS5rZXkgPT09IGtleSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICAgIFRhcmdldC5wcm90b3R5cGUuaXNBcnJheSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFzVGFnKE1FVEFEQVRBX0tFWS5NVUxUSV9JTkpFQ1RfVEFHKTtcbiAgICB9O1xuICAgIFRhcmdldC5wcm90b3R5cGUubWF0Y2hlc0FycmF5ID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWF0Y2hlc1RhZyhNRVRBREFUQV9LRVkuTVVMVElfSU5KRUNUX1RBRykobmFtZSk7XG4gICAgfTtcbiAgICBUYXJnZXQucHJvdG90eXBlLmlzTmFtZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhc1RhZyhNRVRBREFUQV9LRVkuTkFNRURfVEFHKTtcbiAgICB9O1xuICAgIFRhcmdldC5wcm90b3R5cGUuaXNUYWdnZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1ldGFkYXRhLnNvbWUoZnVuY3Rpb24gKG1ldGFkYXRhKSB7IHJldHVybiBNRVRBREFUQV9LRVkuTk9OX0NVU1RPTV9UQUdfS0VZUy5ldmVyeShmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBtZXRhZGF0YS5rZXkgIT09IGtleTsgfSk7IH0pO1xuICAgIH07XG4gICAgVGFyZ2V0LnByb3RvdHlwZS5pc09wdGlvbmFsID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tYXRjaGVzVGFnKE1FVEFEQVRBX0tFWS5PUFRJT05BTF9UQUcpKHRydWUpO1xuICAgIH07XG4gICAgVGFyZ2V0LnByb3RvdHlwZS5nZXROYW1lZFRhZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNOYW1lZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5tZXRhZGF0YS5maWx0ZXIoZnVuY3Rpb24gKG0pIHsgcmV0dXJuIG0ua2V5ID09PSBNRVRBREFUQV9LRVkuTkFNRURfVEFHOyB9KVswXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICAgIFRhcmdldC5wcm90b3R5cGUuZ2V0Q3VzdG9tVGFncyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNUYWdnZWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubWV0YWRhdGEuZmlsdGVyKGZ1bmN0aW9uIChtZXRhZGF0YSkgeyByZXR1cm4gTUVUQURBVEFfS0VZLk5PTl9DVVNUT01fVEFHX0tFWVMuZXZlcnkoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4gbWV0YWRhdGEua2V5ICE9PSBrZXk7IH0pOyB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBUYXJnZXQucHJvdG90eXBlLm1hdGNoZXNOYW1lZFRhZyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hdGNoZXNUYWcoTUVUQURBVEFfS0VZLk5BTUVEX1RBRykobmFtZSk7XG4gICAgfTtcbiAgICBUYXJnZXQucHJvdG90eXBlLm1hdGNoZXNUYWcgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIGZvciAodmFyIF9pID0gMCwgX2EgPSBfdGhpcy5tZXRhZGF0YTsgX2kgPCBfYS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgbSA9IF9hW19pXTtcbiAgICAgICAgICAgICAgICBpZiAobS5rZXkgPT09IGtleSAmJiBtLnZhbHVlID09PSB2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH07XG4gICAgfTtcbiAgICByZXR1cm4gVGFyZ2V0O1xufSgpKTtcbmV4cG9ydHMuVGFyZ2V0ID0gVGFyZ2V0O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGFyZ2V0LmpzLm1hcCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///245\n')},function(module,exports,__webpack_require__){"use strict";eval('\nObject.defineProperty(exports, "__esModule", { value: true });\nexports.BindingWhenOnSyntax = void 0;\nvar binding_on_syntax_1 = __webpack_require__(170);\nvar binding_when_syntax_1 = __webpack_require__(171);\nvar BindingWhenOnSyntax = (function () {\n function BindingWhenOnSyntax(binding) {\n this._binding = binding;\n this._bindingWhenSyntax = new binding_when_syntax_1.BindingWhenSyntax(this._binding);\n this._bindingOnSyntax = new binding_on_syntax_1.BindingOnSyntax(this._binding);\n }\n BindingWhenOnSyntax.prototype.when = function (constraint) {\n return this._bindingWhenSyntax.when(constraint);\n };\n BindingWhenOnSyntax.prototype.whenTargetNamed = function (name) {\n return this._bindingWhenSyntax.whenTargetNamed(name);\n };\n BindingWhenOnSyntax.prototype.whenTargetIsDefault = function () {\n return this._bindingWhenSyntax.whenTargetIsDefault();\n };\n BindingWhenOnSyntax.prototype.whenTargetTagged = function (tag, value) {\n return this._bindingWhenSyntax.whenTargetTagged(tag, value);\n };\n BindingWhenOnSyntax.prototype.whenInjectedInto = function (parent) {\n return this._bindingWhenSyntax.whenInjectedInto(parent);\n };\n BindingWhenOnSyntax.prototype.whenParentNamed = function (name) {\n return this._bindingWhenSyntax.whenParentNamed(name);\n };\n BindingWhenOnSyntax.prototype.whenParentTagged = function (tag, value) {\n return this._bindingWhenSyntax.whenParentTagged(tag, value);\n };\n BindingWhenOnSyntax.prototype.whenAnyAncestorIs = function (ancestor) {\n return this._bindingWhenSyntax.whenAnyAncestorIs(ancestor);\n };\n BindingWhenOnSyntax.prototype.whenNoAncestorIs = function (ancestor) {\n return this._bindingWhenSyntax.whenNoAncestorIs(ancestor);\n };\n BindingWhenOnSyntax.prototype.whenAnyAncestorNamed = function (name) {\n return this._bindingWhenSyntax.whenAnyAncestorNamed(name);\n };\n BindingWhenOnSyntax.prototype.whenAnyAncestorTagged = function (tag, value) {\n return this._bindingWhenSyntax.whenAnyAncestorTagged(tag, value);\n };\n BindingWhenOnSyntax.prototype.whenNoAncestorNamed = function (name) {\n return this._bindingWhenSyntax.whenNoAncestorNamed(name);\n };\n BindingWhenOnSyntax.prototype.whenNoAncestorTagged = function (tag, value) {\n return this._bindingWhenSyntax.whenNoAncestorTagged(tag, value);\n };\n BindingWhenOnSyntax.prototype.whenAnyAncestorMatches = function (constraint) {\n return this._bindingWhenSyntax.whenAnyAncestorMatches(constraint);\n };\n BindingWhenOnSyntax.prototype.whenNoAncestorMatches = function (constraint) {\n return this._bindingWhenSyntax.whenNoAncestorMatches(constraint);\n };\n BindingWhenOnSyntax.prototype.onActivation = function (handler) {\n return this._bindingOnSyntax.onActivation(handler);\n };\n return BindingWhenOnSyntax;\n}());\nexports.BindingWhenOnSyntax = BindingWhenOnSyntax;\n//# sourceMappingURL=binding_when_on_syntax.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaW52ZXJzaWZ5L2xpYi9zeW50YXgvYmluZGluZ193aGVuX29uX3N5bnRheC5qcz8yY2FjIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFhO0FBQ2IsOENBQThDLGNBQWM7QUFDNUQ7QUFDQSwwQkFBMEIsbUJBQU8sQ0FBQyxHQUFxQjtBQUN2RCw0QkFBNEIsbUJBQU8sQ0FBQyxHQUF1QjtBQUMzRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBIiwiZmlsZSI6IjI0Ni5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5CaW5kaW5nV2hlbk9uU3ludGF4ID0gdm9pZCAwO1xudmFyIGJpbmRpbmdfb25fc3ludGF4XzEgPSByZXF1aXJlKFwiLi9iaW5kaW5nX29uX3N5bnRheFwiKTtcbnZhciBiaW5kaW5nX3doZW5fc3ludGF4XzEgPSByZXF1aXJlKFwiLi9iaW5kaW5nX3doZW5fc3ludGF4XCIpO1xudmFyIEJpbmRpbmdXaGVuT25TeW50YXggPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEJpbmRpbmdXaGVuT25TeW50YXgoYmluZGluZykge1xuICAgICAgICB0aGlzLl9iaW5kaW5nID0gYmluZGluZztcbiAgICAgICAgdGhpcy5fYmluZGluZ1doZW5TeW50YXggPSBuZXcgYmluZGluZ193aGVuX3N5bnRheF8xLkJpbmRpbmdXaGVuU3ludGF4KHRoaXMuX2JpbmRpbmcpO1xuICAgICAgICB0aGlzLl9iaW5kaW5nT25TeW50YXggPSBuZXcgYmluZGluZ19vbl9zeW50YXhfMS5CaW5kaW5nT25TeW50YXgodGhpcy5fYmluZGluZyk7XG4gICAgfVxuICAgIEJpbmRpbmdXaGVuT25TeW50YXgucHJvdG90eXBlLndoZW4gPSBmdW5jdGlvbiAoY29uc3RyYWludCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYmluZGluZ1doZW5TeW50YXgud2hlbihjb25zdHJhaW50KTtcbiAgICB9O1xuICAgIEJpbmRpbmdXaGVuT25TeW50YXgucHJvdG90eXBlLndoZW5UYXJnZXROYW1lZCA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9iaW5kaW5nV2hlblN5bnRheC53aGVuVGFyZ2V0TmFtZWQobmFtZSk7XG4gICAgfTtcbiAgICBCaW5kaW5nV2hlbk9uU3ludGF4LnByb3RvdHlwZS53aGVuVGFyZ2V0SXNEZWZhdWx0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYmluZGluZ1doZW5TeW50YXgud2hlblRhcmdldElzRGVmYXVsdCgpO1xuICAgIH07XG4gICAgQmluZGluZ1doZW5PblN5bnRheC5wcm90b3R5cGUud2hlblRhcmdldFRhZ2dlZCA9IGZ1bmN0aW9uICh0YWcsIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9iaW5kaW5nV2hlblN5bnRheC53aGVuVGFyZ2V0VGFnZ2VkKHRhZywgdmFsdWUpO1xuICAgIH07XG4gICAgQmluZGluZ1doZW5PblN5bnRheC5wcm90b3R5cGUud2hlbkluamVjdGVkSW50byA9IGZ1bmN0aW9uIChwYXJlbnQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2JpbmRpbmdXaGVuU3ludGF4LndoZW5JbmplY3RlZEludG8ocGFyZW50KTtcbiAgICB9O1xuICAgIEJpbmRpbmdXaGVuT25TeW50YXgucHJvdG90eXBlLndoZW5QYXJlbnROYW1lZCA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9iaW5kaW5nV2hlblN5bnRheC53aGVuUGFyZW50TmFtZWQobmFtZSk7XG4gICAgfTtcbiAgICBCaW5kaW5nV2hlbk9uU3ludGF4LnByb3RvdHlwZS53aGVuUGFyZW50VGFnZ2VkID0gZnVuY3Rpb24gKHRhZywgdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2JpbmRpbmdXaGVuU3ludGF4LndoZW5QYXJlbnRUYWdnZWQodGFnLCB2YWx1ZSk7XG4gICAgfTtcbiAgICBCaW5kaW5nV2hlbk9uU3ludGF4LnByb3RvdHlwZS53aGVuQW55QW5jZXN0b3JJcyA9IGZ1bmN0aW9uIChhbmNlc3Rvcikge1xuICAgICAgICByZXR1cm4gdGhpcy5fYmluZGluZ1doZW5TeW50YXgud2hlbkFueUFuY2VzdG9ySXMoYW5jZXN0b3IpO1xuICAgIH07XG4gICAgQmluZGluZ1doZW5PblN5bnRheC5wcm90b3R5cGUud2hlbk5vQW5jZXN0b3JJcyA9IGZ1bmN0aW9uIChhbmNlc3Rvcikge1xuICAgICAgICByZXR1cm4gdGhpcy5fYmluZGluZ1doZW5TeW50YXgud2hlbk5vQW5jZXN0b3JJcyhhbmNlc3Rvcik7XG4gICAgfTtcbiAgICBCaW5kaW5nV2hlbk9uU3ludGF4LnByb3RvdHlwZS53aGVuQW55QW5jZXN0b3JOYW1lZCA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9iaW5kaW5nV2hlblN5bnRheC53aGVuQW55QW5jZXN0b3JOYW1lZChuYW1lKTtcbiAgICB9O1xuICAgIEJpbmRpbmdXaGVuT25TeW50YXgucHJvdG90eXBlLndoZW5BbnlBbmNlc3RvclRhZ2dlZCA9IGZ1bmN0aW9uICh0YWcsIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9iaW5kaW5nV2hlblN5bnRheC53aGVuQW55QW5jZXN0b3JUYWdnZWQodGFnLCB2YWx1ZSk7XG4gICAgfTtcbiAgICBCaW5kaW5nV2hlbk9uU3ludGF4LnByb3RvdHlwZS53aGVuTm9BbmNlc3Rvck5hbWVkID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2JpbmRpbmdXaGVuU3ludGF4LndoZW5Ob0FuY2VzdG9yTmFtZWQobmFtZSk7XG4gICAgfTtcbiAgICBCaW5kaW5nV2hlbk9uU3ludGF4LnByb3RvdHlwZS53aGVuTm9BbmNlc3RvclRhZ2dlZCA9IGZ1bmN0aW9uICh0YWcsIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9iaW5kaW5nV2hlblN5bnRheC53aGVuTm9BbmNlc3RvclRhZ2dlZCh0YWcsIHZhbHVlKTtcbiAgICB9O1xuICAgIEJpbmRpbmdXaGVuT25TeW50YXgucHJvdG90eXBlLndoZW5BbnlBbmNlc3Rvck1hdGNoZXMgPSBmdW5jdGlvbiAoY29uc3RyYWludCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYmluZGluZ1doZW5TeW50YXgud2hlbkFueUFuY2VzdG9yTWF0Y2hlcyhjb25zdHJhaW50KTtcbiAgICB9O1xuICAgIEJpbmRpbmdXaGVuT25TeW50YXgucHJvdG90eXBlLndoZW5Ob0FuY2VzdG9yTWF0Y2hlcyA9IGZ1bmN0aW9uIChjb25zdHJhaW50KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9iaW5kaW5nV2hlblN5bnRheC53aGVuTm9BbmNlc3Rvck1hdGNoZXMoY29uc3RyYWludCk7XG4gICAgfTtcbiAgICBCaW5kaW5nV2hlbk9uU3ludGF4LnByb3RvdHlwZS5vbkFjdGl2YXRpb24gPSBmdW5jdGlvbiAoaGFuZGxlcikge1xuICAgICAgICByZXR1cm4gdGhpcy5fYmluZGluZ09uU3ludGF4Lm9uQWN0aXZhdGlvbihoYW5kbGVyKTtcbiAgICB9O1xuICAgIHJldHVybiBCaW5kaW5nV2hlbk9uU3ludGF4O1xufSgpKTtcbmV4cG9ydHMuQmluZGluZ1doZW5PblN5bnRheCA9IEJpbmRpbmdXaGVuT25TeW50YXg7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1iaW5kaW5nX3doZW5fb25fc3ludGF4LmpzLm1hcCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///246\n')},function(module,exports,__webpack_require__){"use strict";eval('\nObject.defineProperty(exports, "__esModule", { value: true });\nexports.typeConstraint = exports.namedConstraint = exports.taggedConstraint = exports.traverseAncerstors = void 0;\nvar METADATA_KEY = __webpack_require__(32);\nvar metadata_1 = __webpack_require__(48);\nvar traverseAncerstors = function (request, constraint) {\n var parent = request.parentRequest;\n if (parent !== null) {\n return constraint(parent) ? true : traverseAncerstors(parent, constraint);\n }\n else {\n return false;\n }\n};\nexports.traverseAncerstors = traverseAncerstors;\nvar taggedConstraint = function (key) { return function (value) {\n var constraint = function (request) {\n return request !== null && request.target !== null && request.target.matchesTag(key)(value);\n };\n constraint.metaData = new metadata_1.Metadata(key, value);\n return constraint;\n}; };\nexports.taggedConstraint = taggedConstraint;\nvar namedConstraint = taggedConstraint(METADATA_KEY.NAMED_TAG);\nexports.namedConstraint = namedConstraint;\nvar typeConstraint = function (type) { return function (request) {\n var binding = null;\n if (request !== null) {\n binding = request.bindings[0];\n if (typeof type === "string") {\n var serviceIdentifier = binding.serviceIdentifier;\n return serviceIdentifier === type;\n }\n else {\n var constructor = request.bindings[0].implementationType;\n return type === constructor;\n }\n }\n return false;\n}; };\nexports.typeConstraint = typeConstraint;\n//# sourceMappingURL=constraint_helpers.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaW52ZXJzaWZ5L2xpYi9zeW50YXgvY29uc3RyYWludF9oZWxwZXJzLmpzPzQ1MWYiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQWE7QUFDYiw4Q0FBOEMsY0FBYztBQUM1RDtBQUNBLG1CQUFtQixtQkFBTyxDQUFDLEVBQTRCO0FBQ3ZELGlCQUFpQixtQkFBTyxDQUFDLEVBQXNCO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0EiLCJmaWxlIjoiMjQ3LmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnR5cGVDb25zdHJhaW50ID0gZXhwb3J0cy5uYW1lZENvbnN0cmFpbnQgPSBleHBvcnRzLnRhZ2dlZENvbnN0cmFpbnQgPSBleHBvcnRzLnRyYXZlcnNlQW5jZXJzdG9ycyA9IHZvaWQgMDtcbnZhciBNRVRBREFUQV9LRVkgPSByZXF1aXJlKFwiLi4vY29uc3RhbnRzL21ldGFkYXRhX2tleXNcIik7XG52YXIgbWV0YWRhdGFfMSA9IHJlcXVpcmUoXCIuLi9wbGFubmluZy9tZXRhZGF0YVwiKTtcbnZhciB0cmF2ZXJzZUFuY2Vyc3RvcnMgPSBmdW5jdGlvbiAocmVxdWVzdCwgY29uc3RyYWludCkge1xuICAgIHZhciBwYXJlbnQgPSByZXF1ZXN0LnBhcmVudFJlcXVlc3Q7XG4gICAgaWYgKHBhcmVudCAhPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gY29uc3RyYWludChwYXJlbnQpID8gdHJ1ZSA6IHRyYXZlcnNlQW5jZXJzdG9ycyhwYXJlbnQsIGNvbnN0cmFpbnQpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn07XG5leHBvcnRzLnRyYXZlcnNlQW5jZXJzdG9ycyA9IHRyYXZlcnNlQW5jZXJzdG9ycztcbnZhciB0YWdnZWRDb25zdHJhaW50ID0gZnVuY3Rpb24gKGtleSkgeyByZXR1cm4gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgdmFyIGNvbnN0cmFpbnQgPSBmdW5jdGlvbiAocmVxdWVzdCkge1xuICAgICAgICByZXR1cm4gcmVxdWVzdCAhPT0gbnVsbCAmJiByZXF1ZXN0LnRhcmdldCAhPT0gbnVsbCAmJiByZXF1ZXN0LnRhcmdldC5tYXRjaGVzVGFnKGtleSkodmFsdWUpO1xuICAgIH07XG4gICAgY29uc3RyYWludC5tZXRhRGF0YSA9IG5ldyBtZXRhZGF0YV8xLk1ldGFkYXRhKGtleSwgdmFsdWUpO1xuICAgIHJldHVybiBjb25zdHJhaW50O1xufTsgfTtcbmV4cG9ydHMudGFnZ2VkQ29uc3RyYWludCA9IHRhZ2dlZENvbnN0cmFpbnQ7XG52YXIgbmFtZWRDb25zdHJhaW50ID0gdGFnZ2VkQ29uc3RyYWludChNRVRBREFUQV9LRVkuTkFNRURfVEFHKTtcbmV4cG9ydHMubmFtZWRDb25zdHJhaW50ID0gbmFtZWRDb25zdHJhaW50O1xudmFyIHR5cGVDb25zdHJhaW50ID0gZnVuY3Rpb24gKHR5cGUpIHsgcmV0dXJuIGZ1bmN0aW9uIChyZXF1ZXN0KSB7XG4gICAgdmFyIGJpbmRpbmcgPSBudWxsO1xuICAgIGlmIChyZXF1ZXN0ICE9PSBudWxsKSB7XG4gICAgICAgIGJpbmRpbmcgPSByZXF1ZXN0LmJpbmRpbmdzWzBdO1xuICAgICAgICBpZiAodHlwZW9mIHR5cGUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHZhciBzZXJ2aWNlSWRlbnRpZmllciA9IGJpbmRpbmcuc2VydmljZUlkZW50aWZpZXI7XG4gICAgICAgICAgICByZXR1cm4gc2VydmljZUlkZW50aWZpZXIgPT09IHR5cGU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2YXIgY29uc3RydWN0b3IgPSByZXF1ZXN0LmJpbmRpbmdzWzBdLmltcGxlbWVudGF0aW9uVHlwZTtcbiAgICAgICAgICAgIHJldHVybiB0eXBlID09PSBjb25zdHJ1Y3RvcjtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59OyB9O1xuZXhwb3J0cy50eXBlQ29uc3RyYWludCA9IHR5cGVDb25zdHJhaW50O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29uc3RyYWludF9oZWxwZXJzLmpzLm1hcCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///247\n')},function(module,__webpack_exports__,__webpack_require__){"use strict";eval('/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return generateAABBFromVertices; });\n/* harmony import */ var gl_matrix__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2);\n/* harmony import */ var _shape_AABB__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(79);\n\n\n/**\n * generate AABB with positions\n * @param positions [x1,y1,z1, x2,y2,z2]\n */\n\nfunction generateAABBFromVertices(positions) {\n var aabb = new _shape_AABB__WEBPACK_IMPORTED_MODULE_1__[/* AABB */ "a"]();\n var min = gl_matrix__WEBPACK_IMPORTED_MODULE_0__[/* vec3 */ "e"].fromValues(positions[0], positions[1], positions[2]);\n var max = gl_matrix__WEBPACK_IMPORTED_MODULE_0__[/* vec3 */ "e"].fromValues(positions[0], positions[1], positions[2]);\n\n for (var i = 3; i < positions.length;) {\n var x = positions[i++];\n var y = positions[i++];\n var z = positions[i++];\n\n if (x < min[0]) {\n min[0] = x;\n }\n\n if (y < min[1]) {\n min[1] = y;\n }\n\n if (z < min[2]) {\n min[2] = z;\n }\n\n if (x > max[0]) {\n max[0] = x;\n }\n\n if (y > max[1]) {\n max[1] = y;\n }\n\n if (z > max[2]) {\n max[2] = z;\n }\n }\n\n aabb.setMinMax(min, max);\n return aabb;\n}\n//# sourceMappingURL=aabb.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy13ZWJncHUtY29yZS9lcy91dGlscy9hYWJiLmpzPzRhYzYiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQWlDO0FBQ0k7QUFDckM7QUFDQTtBQUNBO0FBQ0E7O0FBRU87QUFDUCxpQkFBaUIsd0RBQUk7QUFDckIsWUFBWSxzREFBSTtBQUNoQixZQUFZLHNEQUFJOztBQUVoQixpQkFBaUIsc0JBQXNCO0FBQ3ZDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6IjI0OC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHZlYzMgfSBmcm9tICdnbC1tYXRyaXgnO1xuaW1wb3J0IHsgQUFCQiB9IGZyb20gJy4uL3NoYXBlL0FBQkInO1xuLyoqXG4gKiBnZW5lcmF0ZSBBQUJCIHdpdGggcG9zaXRpb25zXG4gKiBAcGFyYW0gcG9zaXRpb25zIFt4MSx5MSx6MSwgeDIseTIsejJdXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlQUFCQkZyb21WZXJ0aWNlcyhwb3NpdGlvbnMpIHtcbiAgdmFyIGFhYmIgPSBuZXcgQUFCQigpO1xuICB2YXIgbWluID0gdmVjMy5mcm9tVmFsdWVzKHBvc2l0aW9uc1swXSwgcG9zaXRpb25zWzFdLCBwb3NpdGlvbnNbMl0pO1xuICB2YXIgbWF4ID0gdmVjMy5mcm9tVmFsdWVzKHBvc2l0aW9uc1swXSwgcG9zaXRpb25zWzFdLCBwb3NpdGlvbnNbMl0pO1xuXG4gIGZvciAodmFyIGkgPSAzOyBpIDwgcG9zaXRpb25zLmxlbmd0aDspIHtcbiAgICB2YXIgeCA9IHBvc2l0aW9uc1tpKytdO1xuICAgIHZhciB5ID0gcG9zaXRpb25zW2krK107XG4gICAgdmFyIHogPSBwb3NpdGlvbnNbaSsrXTtcblxuICAgIGlmICh4IDwgbWluWzBdKSB7XG4gICAgICBtaW5bMF0gPSB4O1xuICAgIH1cblxuICAgIGlmICh5IDwgbWluWzFdKSB7XG4gICAgICBtaW5bMV0gPSB5O1xuICAgIH1cblxuICAgIGlmICh6IDwgbWluWzJdKSB7XG4gICAgICBtaW5bMl0gPSB6O1xuICAgIH1cblxuICAgIGlmICh4ID4gbWF4WzBdKSB7XG4gICAgICBtYXhbMF0gPSB4O1xuICAgIH1cblxuICAgIGlmICh5ID4gbWF4WzFdKSB7XG4gICAgICBtYXhbMV0gPSB5O1xuICAgIH1cblxuICAgIGlmICh6ID4gbWF4WzJdKSB7XG4gICAgICBtYXhbMl0gPSB6O1xuICAgIH1cbiAgfVxuXG4gIGFhYmIuc2V0TWluTWF4KG1pbiwgbWF4KTtcbiAgcmV0dXJuIGFhYmI7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hYWJiLmpzLm1hcCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///248\n')},function(module,__webpack_exports__,__webpack_require__){"use strict";eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return isSafari; });\nvar isSafari = typeof navigator !== 'undefined' && /Version\\/[\\d\\.]+.*Safari/.test(navigator.userAgent);\n//# sourceMappingURL=isSafari.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy13ZWJncHUtY29yZS9lcy91dGlscy9pc1NhZmFyaS5qcz85NjMzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQU87QUFDUCIsImZpbGUiOiIyNDkuanMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdmFyIGlzU2FmYXJpID0gdHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgL1ZlcnNpb25cXC9bXFxkXFwuXSsuKlNhZmFyaS8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWlzU2FmYXJpLmpzLm1hcCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///249\n")},function(module,exports){eval("\n//# sourceMappingURL=IAttribute.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy13ZWJncHUtY29yZS9lcy9jb21wb25lbnRzL3JlbmRlcmVyL0lBdHRyaWJ1dGUuanM/YTI1NiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQ0EiLCJmaWxlIjoiMjUwLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXG4vLyMgc291cmNlTWFwcGluZ1VSTD1JQXR0cmlidXRlLmpzLm1hcCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///250\n")},function(module,exports){eval("\n//# sourceMappingURL=IBuffer.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy13ZWJncHUtY29yZS9lcy9jb21wb25lbnRzL3JlbmRlcmVyL0lCdWZmZXIuanM/MDM1ZSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQ0EiLCJmaWxlIjoiMjUxLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXG4vLyMgc291cmNlTWFwcGluZ1VSTD1JQnVmZmVyLmpzLm1hcCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///251\n")},function(module,exports){eval("\n//# sourceMappingURL=IComputeModel.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy13ZWJncHUtY29yZS9lcy9jb21wb25lbnRzL3JlbmRlcmVyL0lDb21wdXRlTW9kZWwuanM/MzliYSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQ0EiLCJmaWxlIjoiMjUyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXG4vLyMgc291cmNlTWFwcGluZ1VSTD1JQ29tcHV0ZU1vZGVsLmpzLm1hcCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///252\n")},function(module,exports){eval("\n//# sourceMappingURL=IElements.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy13ZWJncHUtY29yZS9lcy9jb21wb25lbnRzL3JlbmRlcmVyL0lFbGVtZW50cy5qcz9mOTExIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFDQSIsImZpbGUiOiIyNTMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUlFbGVtZW50cy5qcy5tYXAiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///253\n")},function(module,exports){eval("\n//# sourceMappingURL=IFramebuffer.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy13ZWJncHUtY29yZS9lcy9jb21wb25lbnRzL3JlbmRlcmVyL0lGcmFtZWJ1ZmZlci5qcz85Y2VlIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFDQSIsImZpbGUiOiIyNTQuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUlGcmFtZWJ1ZmZlci5qcy5tYXAiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///254\n")},function(module,exports){eval("\n//# sourceMappingURL=IModel.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy13ZWJncHUtY29yZS9lcy9jb21wb25lbnRzL3JlbmRlcmVyL0lNb2RlbC5qcz9jOWE1Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFDQSIsImZpbGUiOiIyNTUuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUlNb2RlbC5qcy5tYXAiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///255\n")},function(module,__webpack_exports__,__webpack_require__){"use strict";eval('/* unused harmony export PassType */\nvar PassType;\n/**\n * Pass 分两类:\n * 1. 渲染相关 eg. ClearPass、RenderPass、PickingPass、ShadowPass\n * 2. PostProcessing eg. CopyPass、BlurPass\n * 另外考虑到 Pass 之间严格的执行顺序,render 方法必须是异步的\n */\n\n(function (PassType) {\n PassType["Normal"] = "normal";\n PassType["PostProcessing"] = "post-processing";\n})(PassType || (PassType = {}));\n//# sourceMappingURL=IMultiPassRenderer.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy13ZWJncHUtY29yZS9lcy9jb21wb25lbnRzL3JlbmRlcmVyL0lNdWx0aVBhc3NSZW5kZXJlci5qcz81N2ZjIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsQ0FBQyw0QkFBNEI7QUFDN0IiLCJmaWxlIjoiMjU2LmpzIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHZhciBQYXNzVHlwZTtcbi8qKlxuICogUGFzcyDliIbkuKTnsbvvvJpcbiAqIDEuIOa4suafk+ebuOWFsyBlZy4gQ2xlYXJQYXNz44CBUmVuZGVyUGFzc+OAgVBpY2tpbmdQYXNz44CBU2hhZG93UGFzc1xuICogMi4gUG9zdFByb2Nlc3NpbmcgZWcuIENvcHlQYXNz44CBQmx1clBhc3NcbiAqIOWPpuWkluiAg+iZkeWIsCBQYXNzIOS5i+mXtOS4peagvOeahOaJp+ihjOmhuuW6j++8jHJlbmRlciDmlrnms5Xlv4XpobvmmK/lvILmraXnmoRcbiAqL1xuXG4oZnVuY3Rpb24gKFBhc3NUeXBlKSB7XG4gIFBhc3NUeXBlW1wiTm9ybWFsXCJdID0gXCJub3JtYWxcIjtcbiAgUGFzc1R5cGVbXCJQb3N0UHJvY2Vzc2luZ1wiXSA9IFwicG9zdC1wcm9jZXNzaW5nXCI7XG59KShQYXNzVHlwZSB8fCAoUGFzc1R5cGUgPSB7fSkpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9SU11bHRpUGFzc1JlbmRlcmVyLmpzLm1hcCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///256\n')},function(module,exports){eval("\n//# sourceMappingURL=IRenderbuffer.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy13ZWJncHUtY29yZS9lcy9jb21wb25lbnRzL3JlbmRlcmVyL0lSZW5kZXJidWZmZXIuanM/YmRkMyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQ0EiLCJmaWxlIjoiMjU3LmpzIiwic291cmNlc0NvbnRlbnQiOlsiXG4vLyMgc291cmNlTWFwcGluZ1VSTD1JUmVuZGVyYnVmZmVyLmpzLm1hcCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///257\n")},function(module,exports){eval("\n//# sourceMappingURL=IRendererService.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy13ZWJncHUtY29yZS9lcy9jb21wb25lbnRzL3JlbmRlcmVyL0lSZW5kZXJlclNlcnZpY2UuanM/MzYyYSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQ0EiLCJmaWxlIjoiMjU4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiXG4vLyMgc291cmNlTWFwcGluZ1VSTD1JUmVuZGVyZXJTZXJ2aWNlLmpzLm1hcCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///258\n")},function(module,exports){eval("\n//# sourceMappingURL=ITexture2D.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy13ZWJncHUtY29yZS9lcy9jb21wb25lbnRzL3JlbmRlcmVyL0lUZXh0dXJlMkQuanM/MjU3ZCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQ0EiLCJmaWxlIjoiMjU5LmpzIiwic291cmNlc0NvbnRlbnQiOlsiXG4vLyMgc291cmNlTWFwcGluZ1VSTD1JVGV4dHVyZTJELmpzLm1hcCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///259\n")},function(module,exports){eval("\n//# sourceMappingURL=IUniform.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy13ZWJncHUtY29yZS9lcy9jb21wb25lbnRzL3JlbmRlcmVyL0lVbmlmb3JtLmpzPzY2MzUiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUNBIiwiZmlsZSI6IjI2MC5qcyIsInNvdXJjZXNDb250ZW50IjpbIlxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9SVVuaWZvcm0uanMubWFwIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///260\n")},function(module,exports){eval("\n//# sourceMappingURL=interface.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy13ZWJncHUtY29yZS9lcy9jb21wb25lbnRzL21hdGVyaWFsL2ludGVyZmFjZS5qcz8xNTc0Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFDQSIsImZpbGUiOiIyNjEuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWludGVyZmFjZS5qcy5tYXAiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///261\n")},function(module,exports){eval("\n//# sourceMappingURL=interface.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy13ZWJncHUtY29yZS9lcy9jb21wb25lbnRzL21lc2gvaW50ZXJmYWNlLmpzPzYzMjciXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUNBIiwiZmlsZSI6IjI2Mi5qcyIsInNvdXJjZXNDb250ZW50IjpbIlxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW50ZXJmYWNlLmpzLm1hcCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///262\n")},function(module,exports){eval("module.exports = 0.000001\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZ2wtdmVjMi9lcHNpbG9uLmpzPzM0NDMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEiLCJmaWxlIjoiMjYzLmpzIiwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSAwLjAwMDAwMVxuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///263\n")},function(module,exports){eval("module.exports = create\n\n/**\n * Creates a new, empty vec2\n *\n * @returns {vec2} a new 2D vector\n */\nfunction create() {\n var out = new Float32Array(2)\n out[0] = 0\n out[1] = 0\n return out\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZ2wtdmVjMi9jcmVhdGUuanM/MTIzZCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLEtBQUs7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiMjY0LmpzIiwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBjcmVhdGVcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3LCBlbXB0eSB2ZWMyXG4gKlxuICogQHJldHVybnMge3ZlYzJ9IGEgbmV3IDJEIHZlY3RvclxuICovXG5mdW5jdGlvbiBjcmVhdGUoKSB7XG4gICAgdmFyIG91dCA9IG5ldyBGbG9hdDMyQXJyYXkoMilcbiAgICBvdXRbMF0gPSAwXG4gICAgb3V0WzFdID0gMFxuICAgIHJldHVybiBvdXRcbn0iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///264\n")},function(module,exports){eval("module.exports = set\n\n/**\n * Set the components of a vec2 to the given values\n *\n * @param {vec2} out the receiving vector\n * @param {Number} x X component\n * @param {Number} y Y component\n * @returns {vec2} out\n */\nfunction set(out, x, y) {\n out[0] = x\n out[1] = y\n return out\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZ2wtdmVjMi9zZXQuanM/ZTA3OSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixhQUFhLEtBQUs7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6IjI2NS5qcyIsInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gc2V0XG5cbi8qKlxuICogU2V0IHRoZSBjb21wb25lbnRzIG9mIGEgdmVjMiB0byB0aGUgZ2l2ZW4gdmFsdWVzXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7TnVtYmVyfSB4IFggY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0geSBZIGNvbXBvbmVudFxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG5mdW5jdGlvbiBzZXQob3V0LCB4LCB5KSB7XG4gICAgb3V0WzBdID0geFxuICAgIG91dFsxXSA9IHlcbiAgICByZXR1cm4gb3V0XG59Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///265\n")},function(module,exports){eval("module.exports = add\n\n/**\n * Adds two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @returns {vec2} out\n */\nfunction add(out, a, b) {\n out[0] = a[0] + b[0]\n out[1] = a[1] + b[1]\n return out\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZ2wtdmVjMi9hZGQuanM/ZmFjMiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsS0FBSztBQUNoQixhQUFhLEtBQUs7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6IjI2Ni5qcyIsInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gYWRkXG5cbi8qKlxuICogQWRkcyB0d28gdmVjMidzXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjMn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG5mdW5jdGlvbiBhZGQob3V0LCBhLCBiKSB7XG4gICAgb3V0WzBdID0gYVswXSArIGJbMF1cbiAgICBvdXRbMV0gPSBhWzFdICsgYlsxXVxuICAgIHJldHVybiBvdXRcbn0iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///266\n")},function(module,exports){eval("module.exports = multiply\n\n/**\n * Multiplies two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @returns {vec2} out\n */\nfunction multiply(out, a, b) {\n out[0] = a[0] * b[0]\n out[1] = a[1] * b[1]\n return out\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZ2wtdmVjMi9tdWx0aXBseS5qcz9iYmFhIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLEtBQUs7QUFDaEIsV0FBVyxLQUFLO0FBQ2hCLGFBQWEsS0FBSztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiMjY3LmpzIiwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBtdWx0aXBseVxuXG4vKipcbiAqIE11bHRpcGxpZXMgdHdvIHZlYzInc1xuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xuZnVuY3Rpb24gbXVsdGlwbHkob3V0LCBhLCBiKSB7XG4gICAgb3V0WzBdID0gYVswXSAqIGJbMF1cbiAgICBvdXRbMV0gPSBhWzFdICogYlsxXVxuICAgIHJldHVybiBvdXRcbn0iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///267\n")},function(module,exports){eval("module.exports = divide\n\n/**\n * Divides two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @returns {vec2} out\n */\nfunction divide(out, a, b) {\n out[0] = a[0] / b[0]\n out[1] = a[1] / b[1]\n return out\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZ2wtdmVjMi9kaXZpZGUuanM/MDZlZCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsS0FBSztBQUNoQixhQUFhLEtBQUs7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6IjI2OC5qcyIsInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gZGl2aWRlXG5cbi8qKlxuICogRGl2aWRlcyB0d28gdmVjMidzXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjMn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG5mdW5jdGlvbiBkaXZpZGUob3V0LCBhLCBiKSB7XG4gICAgb3V0WzBdID0gYVswXSAvIGJbMF1cbiAgICBvdXRbMV0gPSBhWzFdIC8gYlsxXVxuICAgIHJldHVybiBvdXRcbn0iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///268\n")},function(module,exports){eval("module.exports = distance\n\n/**\n * Calculates the euclidian distance between two vec2's\n *\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @returns {Number} distance between a and b\n */\nfunction distance(a, b) {\n var x = b[0] - a[0],\n y = b[1] - a[1]\n return Math.sqrt(x*x + y*y)\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZ2wtdmVjMi9kaXN0YW5jZS5qcz8zMzliIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLEtBQUs7QUFDaEIsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiIyNjkuanMiLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IGRpc3RhbmNlXG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgZXVjbGlkaWFuIGRpc3RhbmNlIGJldHdlZW4gdHdvIHZlYzInc1xuICpcbiAqIEBwYXJhbSB7dmVjMn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge051bWJlcn0gZGlzdGFuY2UgYmV0d2VlbiBhIGFuZCBiXG4gKi9cbmZ1bmN0aW9uIGRpc3RhbmNlKGEsIGIpIHtcbiAgICB2YXIgeCA9IGJbMF0gLSBhWzBdLFxuICAgICAgICB5ID0gYlsxXSAtIGFbMV1cbiAgICByZXR1cm4gTWF0aC5zcXJ0KHgqeCArIHkqeSlcbn0iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///269\n")},function(module,exports){eval("module.exports = squaredDistance\n\n/**\n * Calculates the squared euclidian distance between two vec2's\n *\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @returns {Number} squared distance between a and b\n */\nfunction squaredDistance(a, b) {\n var x = b[0] - a[0],\n y = b[1] - a[1]\n return x*x + y*y\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZ2wtdmVjMi9zcXVhcmVkRGlzdGFuY2UuanM/MGI3MCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxLQUFLO0FBQ2hCLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiMjcwLmpzIiwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBzcXVhcmVkRGlzdGFuY2VcblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBzcXVhcmVkIGV1Y2xpZGlhbiBkaXN0YW5jZSBiZXR3ZWVuIHR3byB2ZWMyJ3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IHNxdWFyZWQgZGlzdGFuY2UgYmV0d2VlbiBhIGFuZCBiXG4gKi9cbmZ1bmN0aW9uIHNxdWFyZWREaXN0YW5jZShhLCBiKSB7XG4gICAgdmFyIHggPSBiWzBdIC0gYVswXSxcbiAgICAgICAgeSA9IGJbMV0gLSBhWzFdXG4gICAgcmV0dXJuIHgqeCArIHkqeVxufSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///270\n")},function(module,exports){eval("module.exports = length\n\n/**\n * Calculates the length of a vec2\n *\n * @param {vec2} a vector to calculate length of\n * @returns {Number} length of a\n */\nfunction length(a) {\n var x = a[0],\n y = a[1]\n return Math.sqrt(x*x + y*y)\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZ2wtdmVjMi9sZW5ndGguanM/Yzg0OCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiIyNzEuanMiLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IGxlbmd0aFxuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGxlbmd0aCBvZiBhIHZlYzJcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdmVjdG9yIHRvIGNhbGN1bGF0ZSBsZW5ndGggb2ZcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGxlbmd0aCBvZiBhXG4gKi9cbmZ1bmN0aW9uIGxlbmd0aChhKSB7XG4gICAgdmFyIHggPSBhWzBdLFxuICAgICAgICB5ID0gYVsxXVxuICAgIHJldHVybiBNYXRoLnNxcnQoeCp4ICsgeSp5KVxufSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///271\n")},function(module,exports){eval("module.exports = squaredLength\n\n/**\n * Calculates the squared length of a vec2\n *\n * @param {vec2} a vector to calculate squared length of\n * @returns {Number} squared length of a\n */\nfunction squaredLength(a) {\n var x = a[0],\n y = a[1]\n return x*x + y*y\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZ2wtdmVjMi9zcXVhcmVkTGVuZ3RoLmpzPzQ4NjkiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiMjcyLmpzIiwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBzcXVhcmVkTGVuZ3RoXG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgc3F1YXJlZCBsZW5ndGggb2YgYSB2ZWMyXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBhIHZlY3RvciB0byBjYWxjdWxhdGUgc3F1YXJlZCBsZW5ndGggb2ZcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IHNxdWFyZWQgbGVuZ3RoIG9mIGFcbiAqL1xuZnVuY3Rpb24gc3F1YXJlZExlbmd0aChhKSB7XG4gICAgdmFyIHggPSBhWzBdLFxuICAgICAgICB5ID0gYVsxXVxuICAgIHJldHVybiB4KnggKyB5Knlcbn0iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///272\n")},function(module,exports){eval("module.exports = normalize\n\n/**\n * Normalize a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a vector to normalize\n * @returns {vec2} out\n */\nfunction normalize(out, a) {\n var x = a[0],\n y = a[1]\n var len = x*x + y*y\n if (len > 0) {\n //TODO: evaluate use of glm_invsqrt here?\n len = 1 / Math.sqrt(len)\n out[0] = a[0] * len\n out[1] = a[1] * len\n }\n return out\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZ2wtdmVjMi9ub3JtYWxpemUuanM/YjdjMyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxLQUFLO0FBQ2hCLGFBQWEsS0FBSztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiIyNzMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IG5vcm1hbGl6ZVxuXG4vKipcbiAqIE5vcm1hbGl6ZSBhIHZlYzJcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMyfSBhIHZlY3RvciB0byBub3JtYWxpemVcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplKG91dCwgYSkge1xuICAgIHZhciB4ID0gYVswXSxcbiAgICAgICAgeSA9IGFbMV1cbiAgICB2YXIgbGVuID0geCp4ICsgeSp5XG4gICAgaWYgKGxlbiA+IDApIHtcbiAgICAgICAgLy9UT0RPOiBldmFsdWF0ZSB1c2Ugb2YgZ2xtX2ludnNxcnQgaGVyZT9cbiAgICAgICAgbGVuID0gMSAvIE1hdGguc3FydChsZW4pXG4gICAgICAgIG91dFswXSA9IGFbMF0gKiBsZW5cbiAgICAgICAgb3V0WzFdID0gYVsxXSAqIGxlblxuICAgIH1cbiAgICByZXR1cm4gb3V0XG59Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///273\n")},function(module,exports){eval("module.exports = dot\n\n/**\n * Calculates the dot product of two vec2's\n *\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @returns {Number} dot product of a and b\n */\nfunction dot(a, b) {\n return a[0] * b[0] + a[1] * b[1]\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZ2wtdmVjMi9kb3QuanM/NmJjNiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxLQUFLO0FBQ2hCLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiIyNzQuanMiLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IGRvdFxuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGRvdCBwcm9kdWN0IG9mIHR3byB2ZWMyJ3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGRvdCBwcm9kdWN0IG9mIGEgYW5kIGJcbiAqL1xuZnVuY3Rpb24gZG90KGEsIGIpIHtcbiAgICByZXR1cm4gYVswXSAqIGJbMF0gKyBhWzFdICogYlsxXVxufSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///274\n")},function(module,__webpack_exports__,__webpack_require__){"use strict";eval('\n// NAMESPACE OBJECT: ./node_modules/d3-ease/src/index.js\nvar src_namespaceObject = {};\n__webpack_require__.r(src_namespaceObject);\n__webpack_require__.d(src_namespaceObject, "easeLinear", function() { return linear; });\n__webpack_require__.d(src_namespaceObject, "easeQuad", function() { return quadInOut; });\n__webpack_require__.d(src_namespaceObject, "easeQuadIn", function() { return quadIn; });\n__webpack_require__.d(src_namespaceObject, "easeQuadOut", function() { return quadOut; });\n__webpack_require__.d(src_namespaceObject, "easeQuadInOut", function() { return quadInOut; });\n__webpack_require__.d(src_namespaceObject, "easeCubic", function() { return cubicInOut; });\n__webpack_require__.d(src_namespaceObject, "easeCubicIn", function() { return cubicIn; });\n__webpack_require__.d(src_namespaceObject, "easeCubicOut", function() { return cubicOut; });\n__webpack_require__.d(src_namespaceObject, "easeCubicInOut", function() { return cubicInOut; });\n__webpack_require__.d(src_namespaceObject, "easePoly", function() { return polyInOut; });\n__webpack_require__.d(src_namespaceObject, "easePolyIn", function() { return polyIn; });\n__webpack_require__.d(src_namespaceObject, "easePolyOut", function() { return polyOut; });\n__webpack_require__.d(src_namespaceObject, "easePolyInOut", function() { return polyInOut; });\n__webpack_require__.d(src_namespaceObject, "easeSin", function() { return sinInOut; });\n__webpack_require__.d(src_namespaceObject, "easeSinIn", function() { return sinIn; });\n__webpack_require__.d(src_namespaceObject, "easeSinOut", function() { return sinOut; });\n__webpack_require__.d(src_namespaceObject, "easeSinInOut", function() { return sinInOut; });\n__webpack_require__.d(src_namespaceObject, "easeExp", function() { return expInOut; });\n__webpack_require__.d(src_namespaceObject, "easeExpIn", function() { return expIn; });\n__webpack_require__.d(src_namespaceObject, "easeExpOut", function() { return expOut; });\n__webpack_require__.d(src_namespaceObject, "easeExpInOut", function() { return expInOut; });\n__webpack_require__.d(src_namespaceObject, "easeCircle", function() { return circleInOut; });\n__webpack_require__.d(src_namespaceObject, "easeCircleIn", function() { return circleIn; });\n__webpack_require__.d(src_namespaceObject, "easeCircleOut", function() { return circleOut; });\n__webpack_require__.d(src_namespaceObject, "easeCircleInOut", function() { return circleInOut; });\n__webpack_require__.d(src_namespaceObject, "easeBounce", function() { return bounceOut; });\n__webpack_require__.d(src_namespaceObject, "easeBounceIn", function() { return bounceIn; });\n__webpack_require__.d(src_namespaceObject, "easeBounceOut", function() { return bounceOut; });\n__webpack_require__.d(src_namespaceObject, "easeBounceInOut", function() { return bounceInOut; });\n__webpack_require__.d(src_namespaceObject, "easeBack", function() { return backInOut; });\n__webpack_require__.d(src_namespaceObject, "easeBackIn", function() { return backIn; });\n__webpack_require__.d(src_namespaceObject, "easeBackOut", function() { return backOut; });\n__webpack_require__.d(src_namespaceObject, "easeBackInOut", function() { return backInOut; });\n__webpack_require__.d(src_namespaceObject, "easeElastic", function() { return elastic_elasticOut; });\n__webpack_require__.d(src_namespaceObject, "easeElasticIn", function() { return elastic_elasticIn; });\n__webpack_require__.d(src_namespaceObject, "easeElasticOut", function() { return elastic_elasticOut; });\n__webpack_require__.d(src_namespaceObject, "easeElasticInOut", function() { return elastic_elasticInOut; });\n\n// EXTERNAL MODULE: ./node_modules/tslib/tslib.es6.js\nvar tslib_es6 = __webpack_require__(1);\n\n// EXTERNAL MODULE: ./node_modules/detect-browser/es/index.js\nvar es = __webpack_require__(141);\n\n// EXTERNAL MODULE: ./node_modules/@antv/g-base/esm/abstract/container.js\nvar abstract_container = __webpack_require__(139);\n\n// EXTERNAL MODULE: ./node_modules/@antv/g-base/esm/util/util.js\nvar util = __webpack_require__(19);\n\n// EXTERNAL MODULE: ./node_modules/@antv/util/esm/index.js + 110 modules\nvar esm = __webpack_require__(0);\n\n// CONCATENATED MODULE: ./node_modules/@antv/g-base/node_modules/d3-timer/src/timer.js\nvar timer_frame = 0, // is an animation frame pending?\n timeout = 0, // is a timeout pending?\n interval = 0, // are any timers active?\n pokeDelay = 1000, // how frequently we check for clock skew\n taskHead,\n taskTail,\n clockLast = 0,\n clockNow = 0,\n clockSkew = 0,\n clock = typeof performance === "object" && performance.now ? performance : Date,\n setFrame = typeof window === "object" && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function(f) { setTimeout(f, 17); };\n\nfunction now() {\n return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew);\n}\n\nfunction clearNow() {\n clockNow = 0;\n}\n\nfunction Timer() {\n this._call =\n this._time =\n this._next = null;\n}\n\nTimer.prototype = timer.prototype = {\n constructor: Timer,\n restart: function(callback, delay, time) {\n if (typeof callback !== "function") throw new TypeError("callback is not a function");\n time = (time == null ? now() : +time) + (delay == null ? 0 : +delay);\n if (!this._next && taskTail !== this) {\n if (taskTail) taskTail._next = this;\n else taskHead = this;\n taskTail = this;\n }\n this._call = callback;\n this._time = time;\n sleep();\n },\n stop: function() {\n if (this._call) {\n this._call = null;\n this._time = Infinity;\n sleep();\n }\n }\n};\n\nfunction timer(callback, delay, time) {\n var t = new Timer;\n t.restart(callback, delay, time);\n return t;\n}\n\nfunction timerFlush() {\n now(); // Get the current time, if not already set.\n ++timer_frame; // Pretend we’ve set an alarm, if we haven’t already.\n var t = taskHead, e;\n while (t) {\n if ((e = clockNow - t._time) >= 0) t._call.call(null, e);\n t = t._next;\n }\n --timer_frame;\n}\n\nfunction wake() {\n clockNow = (clockLast = clock.now()) + clockSkew;\n timer_frame = timeout = 0;\n try {\n timerFlush();\n } finally {\n timer_frame = 0;\n nap();\n clockNow = 0;\n }\n}\n\nfunction poke() {\n var now = clock.now(), delay = now - clockLast;\n if (delay > pokeDelay) clockSkew -= delay, clockLast = now;\n}\n\nfunction nap() {\n var t0, t1 = taskHead, t2, time = Infinity;\n while (t1) {\n if (t1._call) {\n if (time > t1._time) time = t1._time;\n t0 = t1, t1 = t1._next;\n } else {\n t2 = t1._next, t1._next = null;\n t1 = t0 ? t0._next = t2 : taskHead = t2;\n }\n }\n taskTail = t0;\n sleep(time);\n}\n\nfunction sleep(time) {\n if (timer_frame) return; // Soonest alarm already set, or will be.\n if (timeout) timeout = clearTimeout(timeout);\n var delay = time - clockNow; // Strictly less than if we recomputed clockNow.\n if (delay > 24) {\n if (time < Infinity) timeout = setTimeout(wake, time - clock.now() - clockSkew);\n if (interval) interval = clearInterval(interval);\n } else {\n if (!interval) clockLast = clock.now(), interval = setInterval(poke, pokeDelay);\n timer_frame = 1, setFrame(wake);\n }\n}\n\n// CONCATENATED MODULE: ./node_modules/d3-ease/src/linear.js\nfunction linear(t) {\n return +t;\n}\n\n// CONCATENATED MODULE: ./node_modules/d3-ease/src/quad.js\nfunction quadIn(t) {\n return t * t;\n}\n\nfunction quadOut(t) {\n return t * (2 - t);\n}\n\nfunction quadInOut(t) {\n return ((t *= 2) <= 1 ? t * t : --t * (2 - t) + 1) / 2;\n}\n\n// CONCATENATED MODULE: ./node_modules/d3-ease/src/cubic.js\nfunction cubicIn(t) {\n return t * t * t;\n}\n\nfunction cubicOut(t) {\n return --t * t * t + 1;\n}\n\nfunction cubicInOut(t) {\n return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2;\n}\n\n// CONCATENATED MODULE: ./node_modules/d3-ease/src/poly.js\nvar exponent = 3;\n\nvar polyIn = (function custom(e) {\n e = +e;\n\n function polyIn(t) {\n return Math.pow(t, e);\n }\n\n polyIn.exponent = custom;\n\n return polyIn;\n})(exponent);\n\nvar polyOut = (function custom(e) {\n e = +e;\n\n function polyOut(t) {\n return 1 - Math.pow(1 - t, e);\n }\n\n polyOut.exponent = custom;\n\n return polyOut;\n})(exponent);\n\nvar polyInOut = (function custom(e) {\n e = +e;\n\n function polyInOut(t) {\n return ((t *= 2) <= 1 ? Math.pow(t, e) : 2 - Math.pow(2 - t, e)) / 2;\n }\n\n polyInOut.exponent = custom;\n\n return polyInOut;\n})(exponent);\n\n// CONCATENATED MODULE: ./node_modules/d3-ease/src/sin.js\nvar pi = Math.PI,\n halfPi = pi / 2;\n\nfunction sinIn(t) {\n return (+t === 1) ? 1 : 1 - Math.cos(t * halfPi);\n}\n\nfunction sinOut(t) {\n return Math.sin(t * halfPi);\n}\n\nfunction sinInOut(t) {\n return (1 - Math.cos(pi * t)) / 2;\n}\n\n// CONCATENATED MODULE: ./node_modules/d3-ease/src/math.js\n// tpmt is two power minus ten times t scaled to [0,1]\nfunction tpmt(x) {\n return (Math.pow(2, -10 * x) - 0.0009765625) * 1.0009775171065494;\n}\n\n// CONCATENATED MODULE: ./node_modules/d3-ease/src/exp.js\n\n\nfunction expIn(t) {\n return tpmt(1 - +t);\n}\n\nfunction expOut(t) {\n return 1 - tpmt(t);\n}\n\nfunction expInOut(t) {\n return ((t *= 2) <= 1 ? tpmt(1 - t) : 2 - tpmt(t - 1)) / 2;\n}\n\n// CONCATENATED MODULE: ./node_modules/d3-ease/src/circle.js\nfunction circleIn(t) {\n return 1 - Math.sqrt(1 - t * t);\n}\n\nfunction circleOut(t) {\n return Math.sqrt(1 - --t * t);\n}\n\nfunction circleInOut(t) {\n return ((t *= 2) <= 1 ? 1 - Math.sqrt(1 - t * t) : Math.sqrt(1 - (t -= 2) * t) + 1) / 2;\n}\n\n// CONCATENATED MODULE: ./node_modules/d3-ease/src/bounce.js\nvar b1 = 4 / 11,\n b2 = 6 / 11,\n b3 = 8 / 11,\n b4 = 3 / 4,\n b5 = 9 / 11,\n b6 = 10 / 11,\n b7 = 15 / 16,\n b8 = 21 / 22,\n b9 = 63 / 64,\n b0 = 1 / b1 / b1;\n\nfunction bounceIn(t) {\n return 1 - bounceOut(1 - t);\n}\n\nfunction bounceOut(t) {\n return (t = +t) < b1 ? b0 * t * t : t < b3 ? b0 * (t -= b2) * t + b4 : t < b6 ? b0 * (t -= b5) * t + b7 : b0 * (t -= b8) * t + b9;\n}\n\nfunction bounceInOut(t) {\n return ((t *= 2) <= 1 ? 1 - bounceOut(1 - t) : bounceOut(t - 1) + 1) / 2;\n}\n\n// CONCATENATED MODULE: ./node_modules/d3-ease/src/back.js\nvar overshoot = 1.70158;\n\nvar backIn = (function custom(s) {\n s = +s;\n\n function backIn(t) {\n return (t = +t) * t * (s * (t - 1) + t);\n }\n\n backIn.overshoot = custom;\n\n return backIn;\n})(overshoot);\n\nvar backOut = (function custom(s) {\n s = +s;\n\n function backOut(t) {\n return --t * t * ((t + 1) * s + t) + 1;\n }\n\n backOut.overshoot = custom;\n\n return backOut;\n})(overshoot);\n\nvar backInOut = (function custom(s) {\n s = +s;\n\n function backInOut(t) {\n return ((t *= 2) < 1 ? t * t * ((s + 1) * t - s) : (t -= 2) * t * ((s + 1) * t + s) + 2) / 2;\n }\n\n backInOut.overshoot = custom;\n\n return backInOut;\n})(overshoot);\n\n// CONCATENATED MODULE: ./node_modules/d3-ease/src/elastic.js\n\n\nvar tau = 2 * Math.PI,\n amplitude = 1,\n period = 0.3;\n\nvar elastic_elasticIn = (function custom(a, p) {\n var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);\n\n function elasticIn(t) {\n return a * tpmt(-(--t)) * Math.sin((s - t) / p);\n }\n\n elasticIn.amplitude = function(a) { return custom(a, p * tau); };\n elasticIn.period = function(p) { return custom(a, p); };\n\n return elasticIn;\n})(amplitude, period);\n\nvar elastic_elasticOut = (function custom(a, p) {\n var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);\n\n function elasticOut(t) {\n return 1 - a * tpmt(t = +t) * Math.sin((t + s) / p);\n }\n\n elasticOut.amplitude = function(a) { return custom(a, p * tau); };\n elasticOut.period = function(p) { return custom(a, p); };\n\n return elasticOut;\n})(amplitude, period);\n\nvar elastic_elasticInOut = (function custom(a, p) {\n var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);\n\n function elasticInOut(t) {\n return ((t = t * 2 - 1) < 0\n ? a * tpmt(-t) * Math.sin((s - t) / p)\n : 2 - a * tpmt(t) * Math.sin((s + t) / p)) / 2;\n }\n\n elasticInOut.amplitude = function(a) { return custom(a, p * tau); };\n elasticInOut.period = function(p) { return custom(a, p); };\n\n return elasticInOut;\n})(amplitude, period);\n\n// CONCATENATED MODULE: ./node_modules/d3-ease/src/index.js\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n// CONCATENATED MODULE: ./node_modules/d3-color/src/define.js\n/* harmony default export */ var define = (function(constructor, factory, prototype) {\n constructor.prototype = factory.prototype = prototype;\n prototype.constructor = constructor;\n});\n\nfunction extend(parent, definition) {\n var prototype = Object.create(parent.prototype);\n for (var key in definition) prototype[key] = definition[key];\n return prototype;\n}\n\n// CONCATENATED MODULE: ./node_modules/d3-color/src/color.js\n\n\nfunction Color() {}\n\nvar darker = 0.7;\nvar brighter = 1 / darker;\n\nvar reI = "\\\\s*([+-]?\\\\d+)\\\\s*",\n reN = "\\\\s*([+-]?\\\\d*\\\\.?\\\\d+(?:[eE][+-]?\\\\d+)?)\\\\s*",\n reP = "\\\\s*([+-]?\\\\d*\\\\.?\\\\d+(?:[eE][+-]?\\\\d+)?)%\\\\s*",\n reHex = /^#([0-9a-f]{3,8})$/,\n reRgbInteger = new RegExp("^rgb\\\\(" + [reI, reI, reI] + "\\\\)$"),\n reRgbPercent = new RegExp("^rgb\\\\(" + [reP, reP, reP] + "\\\\)$"),\n reRgbaInteger = new RegExp("^rgba\\\\(" + [reI, reI, reI, reN] + "\\\\)$"),\n reRgbaPercent = new RegExp("^rgba\\\\(" + [reP, reP, reP, reN] + "\\\\)$"),\n reHslPercent = new RegExp("^hsl\\\\(" + [reN, reP, reP] + "\\\\)$"),\n reHslaPercent = new RegExp("^hsla\\\\(" + [reN, reP, reP, reN] + "\\\\)$");\n\nvar named = {\n aliceblue: 0xf0f8ff,\n antiquewhite: 0xfaebd7,\n aqua: 0x00ffff,\n aquamarine: 0x7fffd4,\n azure: 0xf0ffff,\n beige: 0xf5f5dc,\n bisque: 0xffe4c4,\n black: 0x000000,\n blanchedalmond: 0xffebcd,\n blue: 0x0000ff,\n blueviolet: 0x8a2be2,\n brown: 0xa52a2a,\n burlywood: 0xdeb887,\n cadetblue: 0x5f9ea0,\n chartreuse: 0x7fff00,\n chocolate: 0xd2691e,\n coral: 0xff7f50,\n cornflowerblue: 0x6495ed,\n cornsilk: 0xfff8dc,\n crimson: 0xdc143c,\n cyan: 0x00ffff,\n darkblue: 0x00008b,\n darkcyan: 0x008b8b,\n darkgoldenrod: 0xb8860b,\n darkgray: 0xa9a9a9,\n darkgreen: 0x006400,\n darkgrey: 0xa9a9a9,\n darkkhaki: 0xbdb76b,\n darkmagenta: 0x8b008b,\n darkolivegreen: 0x556b2f,\n darkorange: 0xff8c00,\n darkorchid: 0x9932cc,\n darkred: 0x8b0000,\n darksalmon: 0xe9967a,\n darkseagreen: 0x8fbc8f,\n darkslateblue: 0x483d8b,\n darkslategray: 0x2f4f4f,\n darkslategrey: 0x2f4f4f,\n darkturquoise: 0x00ced1,\n darkviolet: 0x9400d3,\n deeppink: 0xff1493,\n deepskyblue: 0x00bfff,\n dimgray: 0x696969,\n dimgrey: 0x696969,\n dodgerblue: 0x1e90ff,\n firebrick: 0xb22222,\n floralwhite: 0xfffaf0,\n forestgreen: 0x228b22,\n fuchsia: 0xff00ff,\n gainsboro: 0xdcdcdc,\n ghostwhite: 0xf8f8ff,\n gold: 0xffd700,\n goldenrod: 0xdaa520,\n gray: 0x808080,\n green: 0x008000,\n greenyellow: 0xadff2f,\n grey: 0x808080,\n honeydew: 0xf0fff0,\n hotpink: 0xff69b4,\n indianred: 0xcd5c5c,\n indigo: 0x4b0082,\n ivory: 0xfffff0,\n khaki: 0xf0e68c,\n lavender: 0xe6e6fa,\n lavenderblush: 0xfff0f5,\n lawngreen: 0x7cfc00,\n lemonchiffon: 0xfffacd,\n lightblue: 0xadd8e6,\n lightcoral: 0xf08080,\n lightcyan: 0xe0ffff,\n lightgoldenrodyellow: 0xfafad2,\n lightgray: 0xd3d3d3,\n lightgreen: 0x90ee90,\n lightgrey: 0xd3d3d3,\n lightpink: 0xffb6c1,\n lightsalmon: 0xffa07a,\n lightseagreen: 0x20b2aa,\n lightskyblue: 0x87cefa,\n lightslategray: 0x778899,\n lightslategrey: 0x778899,\n lightsteelblue: 0xb0c4de,\n lightyellow: 0xffffe0,\n lime: 0x00ff00,\n limegreen: 0x32cd32,\n linen: 0xfaf0e6,\n magenta: 0xff00ff,\n maroon: 0x800000,\n mediumaquamarine: 0x66cdaa,\n mediumblue: 0x0000cd,\n mediumorchid: 0xba55d3,\n mediumpurple: 0x9370db,\n mediumseagreen: 0x3cb371,\n mediumslateblue: 0x7b68ee,\n mediumspringgreen: 0x00fa9a,\n mediumturquoise: 0x48d1cc,\n mediumvioletred: 0xc71585,\n midnightblue: 0x191970,\n mintcream: 0xf5fffa,\n mistyrose: 0xffe4e1,\n moccasin: 0xffe4b5,\n navajowhite: 0xffdead,\n navy: 0x000080,\n oldlace: 0xfdf5e6,\n olive: 0x808000,\n olivedrab: 0x6b8e23,\n orange: 0xffa500,\n orangered: 0xff4500,\n orchid: 0xda70d6,\n palegoldenrod: 0xeee8aa,\n palegreen: 0x98fb98,\n paleturquoise: 0xafeeee,\n palevioletred: 0xdb7093,\n papayawhip: 0xffefd5,\n peachpuff: 0xffdab9,\n peru: 0xcd853f,\n pink: 0xffc0cb,\n plum: 0xdda0dd,\n powderblue: 0xb0e0e6,\n purple: 0x800080,\n rebeccapurple: 0x663399,\n red: 0xff0000,\n rosybrown: 0xbc8f8f,\n royalblue: 0x4169e1,\n saddlebrown: 0x8b4513,\n salmon: 0xfa8072,\n sandybrown: 0xf4a460,\n seagreen: 0x2e8b57,\n seashell: 0xfff5ee,\n sienna: 0xa0522d,\n silver: 0xc0c0c0,\n skyblue: 0x87ceeb,\n slateblue: 0x6a5acd,\n slategray: 0x708090,\n slategrey: 0x708090,\n snow: 0xfffafa,\n springgreen: 0x00ff7f,\n steelblue: 0x4682b4,\n tan: 0xd2b48c,\n teal: 0x008080,\n thistle: 0xd8bfd8,\n tomato: 0xff6347,\n turquoise: 0x40e0d0,\n violet: 0xee82ee,\n wheat: 0xf5deb3,\n white: 0xffffff,\n whitesmoke: 0xf5f5f5,\n yellow: 0xffff00,\n yellowgreen: 0x9acd32\n};\n\ndefine(Color, color_color, {\n copy: function(channels) {\n return Object.assign(new this.constructor, this, channels);\n },\n displayable: function() {\n return this.rgb().displayable();\n },\n hex: color_formatHex, // Deprecated! Use color.formatHex.\n formatHex: color_formatHex,\n formatHsl: color_formatHsl,\n formatRgb: color_formatRgb,\n toString: color_formatRgb\n});\n\nfunction color_formatHex() {\n return this.rgb().formatHex();\n}\n\nfunction color_formatHsl() {\n return hslConvert(this).formatHsl();\n}\n\nfunction color_formatRgb() {\n return this.rgb().formatRgb();\n}\n\nfunction color_color(format) {\n var m, l;\n format = (format + "").trim().toLowerCase();\n return (m = reHex.exec(format)) ? (l = m[1].length, m = parseInt(m[1], 16), l === 6 ? rgbn(m) // #ff0000\n : l === 3 ? new Rgb((m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), ((m & 0xf) << 4) | (m & 0xf), 1) // #f00\n : l === 8 ? rgba(m >> 24 & 0xff, m >> 16 & 0xff, m >> 8 & 0xff, (m & 0xff) / 0xff) // #ff000000\n : l === 4 ? rgba((m >> 12 & 0xf) | (m >> 8 & 0xf0), (m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), (((m & 0xf) << 4) | (m & 0xf)) / 0xff) // #f000\n : null) // invalid hex\n : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0)\n : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%)\n : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1)\n : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1)\n : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%)\n : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1)\n : named.hasOwnProperty(format) ? rgbn(named[format]) // eslint-disable-line no-prototype-builtins\n : format === "transparent" ? new Rgb(NaN, NaN, NaN, 0)\n : null;\n}\n\nfunction rgbn(n) {\n return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1);\n}\n\nfunction rgba(r, g, b, a) {\n if (a <= 0) r = g = b = NaN;\n return new Rgb(r, g, b, a);\n}\n\nfunction rgbConvert(o) {\n if (!(o instanceof Color)) o = color_color(o);\n if (!o) return new Rgb;\n o = o.rgb();\n return new Rgb(o.r, o.g, o.b, o.opacity);\n}\n\nfunction color_rgb(r, g, b, opacity) {\n return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);\n}\n\nfunction Rgb(r, g, b, opacity) {\n this.r = +r;\n this.g = +g;\n this.b = +b;\n this.opacity = +opacity;\n}\n\ndefine(Rgb, color_rgb, extend(Color, {\n brighter: function(k) {\n k = k == null ? brighter : Math.pow(brighter, k);\n return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n },\n darker: function(k) {\n k = k == null ? darker : Math.pow(darker, k);\n return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n },\n rgb: function() {\n return this;\n },\n displayable: function() {\n return (-0.5 <= this.r && this.r < 255.5)\n && (-0.5 <= this.g && this.g < 255.5)\n && (-0.5 <= this.b && this.b < 255.5)\n && (0 <= this.opacity && this.opacity <= 1);\n },\n hex: rgb_formatHex, // Deprecated! Use color.formatHex.\n formatHex: rgb_formatHex,\n formatRgb: rgb_formatRgb,\n toString: rgb_formatRgb\n}));\n\nfunction rgb_formatHex() {\n return "#" + hex(this.r) + hex(this.g) + hex(this.b);\n}\n\nfunction rgb_formatRgb() {\n var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a));\n return (a === 1 ? "rgb(" : "rgba(")\n + Math.max(0, Math.min(255, Math.round(this.r) || 0)) + ", "\n + Math.max(0, Math.min(255, Math.round(this.g) || 0)) + ", "\n + Math.max(0, Math.min(255, Math.round(this.b) || 0))\n + (a === 1 ? ")" : ", " + a + ")");\n}\n\nfunction hex(value) {\n value = Math.max(0, Math.min(255, Math.round(value) || 0));\n return (value < 16 ? "0" : "") + value.toString(16);\n}\n\nfunction hsla(h, s, l, a) {\n if (a <= 0) h = s = l = NaN;\n else if (l <= 0 || l >= 1) h = s = NaN;\n else if (s <= 0) h = NaN;\n return new Hsl(h, s, l, a);\n}\n\nfunction hslConvert(o) {\n if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);\n if (!(o instanceof Color)) o = color_color(o);\n if (!o) return new Hsl;\n if (o instanceof Hsl) return o;\n o = o.rgb();\n var r = o.r / 255,\n g = o.g / 255,\n b = o.b / 255,\n min = Math.min(r, g, b),\n max = Math.max(r, g, b),\n h = NaN,\n s = max - min,\n l = (max + min) / 2;\n if (s) {\n if (r === max) h = (g - b) / s + (g < b) * 6;\n else if (g === max) h = (b - r) / s + 2;\n else h = (r - g) / s + 4;\n s /= l < 0.5 ? max + min : 2 - max - min;\n h *= 60;\n } else {\n s = l > 0 && l < 1 ? 0 : h;\n }\n return new Hsl(h, s, l, o.opacity);\n}\n\nfunction hsl(h, s, l, opacity) {\n return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);\n}\n\nfunction Hsl(h, s, l, opacity) {\n this.h = +h;\n this.s = +s;\n this.l = +l;\n this.opacity = +opacity;\n}\n\ndefine(Hsl, hsl, extend(Color, {\n brighter: function(k) {\n k = k == null ? brighter : Math.pow(brighter, k);\n return new Hsl(this.h, this.s, this.l * k, this.opacity);\n },\n darker: function(k) {\n k = k == null ? darker : Math.pow(darker, k);\n return new Hsl(this.h, this.s, this.l * k, this.opacity);\n },\n rgb: function() {\n var h = this.h % 360 + (this.h < 0) * 360,\n s = isNaN(h) || isNaN(this.s) ? 0 : this.s,\n l = this.l,\n m2 = l + (l < 0.5 ? l : 1 - l) * s,\n m1 = 2 * l - m2;\n return new Rgb(\n hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2),\n hsl2rgb(h, m1, m2),\n hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2),\n this.opacity\n );\n },\n displayable: function() {\n return (0 <= this.s && this.s <= 1 || isNaN(this.s))\n && (0 <= this.l && this.l <= 1)\n && (0 <= this.opacity && this.opacity <= 1);\n },\n formatHsl: function() {\n var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a));\n return (a === 1 ? "hsl(" : "hsla(")\n + (this.h || 0) + ", "\n + (this.s || 0) * 100 + "%, "\n + (this.l || 0) * 100 + "%"\n + (a === 1 ? ")" : ", " + a + ")");\n }\n}));\n\n/* From FvD 13.37, CSS Color Module Level 3 */\nfunction hsl2rgb(h, m1, m2) {\n return (h < 60 ? m1 + (m2 - m1) * h / 60\n : h < 180 ? m2\n : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60\n : m1) * 255;\n}\n\n// CONCATENATED MODULE: ./node_modules/d3-interpolate/src/basis.js\nfunction basis(t1, v0, v1, v2, v3) {\n var t2 = t1 * t1, t3 = t2 * t1;\n return ((1 - 3 * t1 + 3 * t2 - t3) * v0\n + (4 - 6 * t2 + 3 * t3) * v1\n + (1 + 3 * t1 + 3 * t2 - 3 * t3) * v2\n + t3 * v3) / 6;\n}\n\n/* harmony default export */ var src_basis = (function(values) {\n var n = values.length - 1;\n return function(t) {\n var i = t <= 0 ? (t = 0) : t >= 1 ? (t = 1, n - 1) : Math.floor(t * n),\n v1 = values[i],\n v2 = values[i + 1],\n v0 = i > 0 ? values[i - 1] : 2 * v1 - v2,\n v3 = i < n - 1 ? values[i + 2] : 2 * v2 - v1;\n return basis((t - i / n) * n, v0, v1, v2, v3);\n };\n});\n\n// CONCATENATED MODULE: ./node_modules/d3-interpolate/src/basisClosed.js\n\n\n/* harmony default export */ var basisClosed = (function(values) {\n var n = values.length;\n return function(t) {\n var i = Math.floor(((t %= 1) < 0 ? ++t : t) * n),\n v0 = values[(i + n - 1) % n],\n v1 = values[i % n],\n v2 = values[(i + 1) % n],\n v3 = values[(i + 2) % n];\n return basis((t - i / n) * n, v0, v1, v2, v3);\n };\n});\n\n// CONCATENATED MODULE: ./node_modules/d3-interpolate/src/constant.js\n/* harmony default export */ var constant = (function(x) {\n return function() {\n return x;\n };\n});\n\n// CONCATENATED MODULE: ./node_modules/d3-interpolate/src/color.js\n\n\nfunction color_linear(a, d) {\n return function(t) {\n return a + t * d;\n };\n}\n\nfunction exponential(a, b, y) {\n return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function(t) {\n return Math.pow(a + t * b, y);\n };\n}\n\nfunction hue(a, b) {\n var d = b - a;\n return d ? color_linear(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : constant(isNaN(a) ? b : a);\n}\n\nfunction gamma(y) {\n return (y = +y) === 1 ? nogamma : function(a, b) {\n return b - a ? exponential(a, b, y) : constant(isNaN(a) ? b : a);\n };\n}\n\nfunction nogamma(a, b) {\n var d = b - a;\n return d ? color_linear(a, d) : constant(isNaN(a) ? b : a);\n}\n\n// CONCATENATED MODULE: ./node_modules/d3-interpolate/src/rgb.js\n\n\n\n\n\n/* harmony default export */ var src_rgb = ((function rgbGamma(y) {\n var color = gamma(y);\n\n function rgb(start, end) {\n var r = color((start = color_rgb(start)).r, (end = color_rgb(end)).r),\n g = color(start.g, end.g),\n b = color(start.b, end.b),\n opacity = nogamma(start.opacity, end.opacity);\n return function(t) {\n start.r = r(t);\n start.g = g(t);\n start.b = b(t);\n start.opacity = opacity(t);\n return start + "";\n };\n }\n\n rgb.gamma = rgbGamma;\n\n return rgb;\n})(1));\n\nfunction rgbSpline(spline) {\n return function(colors) {\n var n = colors.length,\n r = new Array(n),\n g = new Array(n),\n b = new Array(n),\n i, color;\n for (i = 0; i < n; ++i) {\n color = color_rgb(colors[i]);\n r[i] = color.r || 0;\n g[i] = color.g || 0;\n b[i] = color.b || 0;\n }\n r = spline(r);\n g = spline(g);\n b = spline(b);\n color.opacity = 1;\n return function(t) {\n color.r = r(t);\n color.g = g(t);\n color.b = b(t);\n return color + "";\n };\n };\n}\n\nvar rgbBasis = rgbSpline(src_basis);\nvar rgbBasisClosed = rgbSpline(basisClosed);\n\n// CONCATENATED MODULE: ./node_modules/d3-interpolate/src/numberArray.js\n/* harmony default export */ var numberArray = (function(a, b) {\n if (!b) b = [];\n var n = a ? Math.min(b.length, a.length) : 0,\n c = b.slice(),\n i;\n return function(t) {\n for (i = 0; i < n; ++i) c[i] = a[i] * (1 - t) + b[i] * t;\n return c;\n };\n});\n\nfunction isNumberArray(x) {\n return ArrayBuffer.isView(x) && !(x instanceof DataView);\n}\n\n// CONCATENATED MODULE: ./node_modules/d3-interpolate/src/array.js\n\n\n\n/* harmony default export */ var array = (function(a, b) {\n return (isNumberArray(b) ? numberArray : genericArray)(a, b);\n});\n\nfunction genericArray(a, b) {\n var nb = b ? b.length : 0,\n na = a ? Math.min(nb, a.length) : 0,\n x = new Array(na),\n c = new Array(nb),\n i;\n\n for (i = 0; i < na; ++i) x[i] = value(a[i], b[i]);\n for (; i < nb; ++i) c[i] = b[i];\n\n return function(t) {\n for (i = 0; i < na; ++i) c[i] = x[i](t);\n return c;\n };\n}\n\n// CONCATENATED MODULE: ./node_modules/d3-interpolate/src/date.js\n/* harmony default export */ var date = (function(a, b) {\n var d = new Date;\n return a = +a, b = +b, function(t) {\n return d.setTime(a * (1 - t) + b * t), d;\n };\n});\n\n// CONCATENATED MODULE: ./node_modules/d3-interpolate/src/number.js\n/* harmony default export */ var number = (function(a, b) {\n return a = +a, b = +b, function(t) {\n return a * (1 - t) + b * t;\n };\n});\n\n// CONCATENATED MODULE: ./node_modules/d3-interpolate/src/object.js\n\n\n/* harmony default export */ var object = (function(a, b) {\n var i = {},\n c = {},\n k;\n\n if (a === null || typeof a !== "object") a = {};\n if (b === null || typeof b !== "object") b = {};\n\n for (k in b) {\n if (k in a) {\n i[k] = value(a[k], b[k]);\n } else {\n c[k] = b[k];\n }\n }\n\n return function(t) {\n for (k in i) c[k] = i[k](t);\n return c;\n };\n});\n\n// CONCATENATED MODULE: ./node_modules/d3-interpolate/src/string.js\n\n\nvar reA = /[-+]?(?:\\d+\\.?\\d*|\\.?\\d+)(?:[eE][-+]?\\d+)?/g,\n reB = new RegExp(reA.source, "g");\n\nfunction zero(b) {\n return function() {\n return b;\n };\n}\n\nfunction one(b) {\n return function(t) {\n return b(t) + "";\n };\n}\n\n/* harmony default export */ var string = (function(a, b) {\n var bi = reA.lastIndex = reB.lastIndex = 0, // scan index for next number in b\n am, // current match in a\n bm, // current match in b\n bs, // string preceding current number in b, if any\n i = -1, // index in s\n s = [], // string constants and placeholders\n q = []; // number interpolators\n\n // Coerce inputs to strings.\n a = a + "", b = b + "";\n\n // Interpolate pairs of numbers in a & b.\n while ((am = reA.exec(a))\n && (bm = reB.exec(b))) {\n if ((bs = bm.index) > bi) { // a string precedes the next number in b\n bs = b.slice(bi, bs);\n if (s[i]) s[i] += bs; // coalesce with previous string\n else s[++i] = bs;\n }\n if ((am = am[0]) === (bm = bm[0])) { // numbers in a & b match\n if (s[i]) s[i] += bm; // coalesce with previous string\n else s[++i] = bm;\n } else { // interpolate non-matching numbers\n s[++i] = null;\n q.push({i: i, x: number(am, bm)});\n }\n bi = reB.lastIndex;\n }\n\n // Add remains of b.\n if (bi < b.length) {\n bs = b.slice(bi);\n if (s[i]) s[i] += bs; // coalesce with previous string\n else s[++i] = bs;\n }\n\n // Special optimization for only a single match.\n // Otherwise, interpolate each of the numbers and rejoin the string.\n return s.length < 2 ? (q[0]\n ? one(q[0].x)\n : zero(b))\n : (b = q.length, function(t) {\n for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t);\n return s.join("");\n });\n});\n\n// CONCATENATED MODULE: ./node_modules/d3-interpolate/src/value.js\n\n\n\n\n\n\n\n\n\n\n/* harmony default export */ var value = (function(a, b) {\n var t = typeof b, c;\n return b == null || t === "boolean" ? constant(b)\n : (t === "number" ? number\n : t === "string" ? ((c = color_color(b)) ? (b = c, src_rgb) : string)\n : b instanceof color_color ? src_rgb\n : b instanceof Date ? date\n : isNumberArray(b) ? numberArray\n : Array.isArray(b) ? genericArray\n : typeof b.valueOf !== "function" && typeof b.toString !== "function" || isNaN(b) ? object\n : number)(a, b);\n});\n\n// EXTERNAL MODULE: ./node_modules/@antv/g-base/esm/util/path.js\nvar path = __webpack_require__(52);\n\n// CONCATENATED MODULE: ./node_modules/@antv/g-base/esm/util/color.js\nvar isColorProp = function (prop) { return [\'fill\', \'stroke\', \'fillStyle\', \'strokeStyle\'].includes(prop); };\nvar isGradientColor = function (val) { return /^[r,R,L,l]{1}[\\s]*\\(/.test(val); };\n//# sourceMappingURL=color.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-base/esm/animate/timeline.js\n\n\n\n // 目前整体动画只需要数值和数组的差值计算\n\n\nvar IDENTITY_MATRIX = [1, 0, 0, 0, 1, 0, 0, 0, 1];\n/**\n * 使用 ratio 进行插值计算来更新属性\n * @param {IElement} shape 元素\n * @param {Animation} animation 动画\n * @param {number} ratio 比例\n * @return {boolean} 动画是否执行完成\n */\nfunction _update(shape, animation, ratio) {\n var cProps = {}; // 此刻属性\n var fromAttrs = animation.fromAttrs, toAttrs = animation.toAttrs;\n if (shape.destroyed) {\n return;\n }\n var interf; // 差值函数\n for (var k in toAttrs) {\n if (!Object(esm["isEqual"])(fromAttrs[k], toAttrs[k])) {\n if (k === \'path\') {\n var toPath = toAttrs[k];\n var fromPath = fromAttrs[k];\n if (toPath.length > fromPath.length) {\n toPath = path["parsePathString"](toAttrs[k]); // 终点状态\n fromPath = path["parsePathString"](fromAttrs[k]); // 起始状态\n fromPath = path["fillPathByDiff"](fromPath, toPath);\n fromPath = path["formatPath"](fromPath, toPath);\n animation.fromAttrs.path = fromPath;\n animation.toAttrs.path = toPath;\n }\n else if (!animation.pathFormatted) {\n toPath = path["parsePathString"](toAttrs[k]);\n fromPath = path["parsePathString"](fromAttrs[k]);\n fromPath = path["formatPath"](fromPath, toPath);\n animation.fromAttrs.path = fromPath;\n animation.toAttrs.path = toPath;\n animation.pathFormatted = true;\n }\n cProps[k] = [];\n for (var i = 0; i < toPath.length; i++) {\n var toPathPoint = toPath[i];\n var fromPathPoint = fromPath[i];\n var cPathPoint = [];\n for (var j = 0; j < toPathPoint.length; j++) {\n if (Object(esm["isNumber"])(toPathPoint[j]) && fromPathPoint && Object(esm["isNumber"])(fromPathPoint[j])) {\n interf = value(fromPathPoint[j], toPathPoint[j]);\n cPathPoint.push(interf(ratio));\n }\n else {\n cPathPoint.push(toPathPoint[j]);\n }\n }\n cProps[k].push(cPathPoint);\n }\n }\n else if (k === \'matrix\') {\n /*\n 对矩阵进行插值时,需要保证矩阵不为空,为空则使用单位矩阵\n TODO: 二维和三维场景下单位矩阵不同,之后 WebGL 版需要做进一步处理\n */\n var matrixFn = array(fromAttrs[k] || IDENTITY_MATRIX, toAttrs[k] || IDENTITY_MATRIX);\n var currentMatrix = matrixFn(ratio);\n cProps[k] = currentMatrix;\n }\n else if (isColorProp(k) && isGradientColor(toAttrs[k])) {\n cProps[k] = toAttrs[k];\n }\n else if (!Object(esm["isFunction"])(toAttrs[k])) {\n // 非函数类型的值才能做插值\n interf = value(fromAttrs[k], toAttrs[k]);\n cProps[k] = interf(ratio);\n }\n }\n }\n shape.attr(cProps);\n}\n/**\n * 根据自定义帧动画函数 onFrame 来更新属性\n * @param {IElement} shape 元素\n * @param {Animation} animation 动画\n * @param {number} elapsed 动画执行时间(毫秒)\n * @return {boolean} 动画是否执行完成\n */\nfunction update(shape, animation, elapsed) {\n var startTime = animation.startTime, delay = animation.delay;\n // 如果还没有开始执行或暂停,先不更新\n if (elapsed < startTime + delay || animation._paused) {\n return false;\n }\n var ratio;\n var duration = animation.duration;\n var easing = animation.easing;\n // 已执行时间\n elapsed = elapsed - startTime - animation.delay;\n if (animation.repeat) {\n // 如果动画重复执行,则 elapsed > duration,计算 ratio 时需取模\n ratio = (elapsed % duration) / duration;\n ratio = src_namespaceObject[easing](ratio);\n }\n else {\n ratio = elapsed / duration;\n if (ratio < 1) {\n // 动画未执行完\n ratio = src_namespaceObject[easing](ratio);\n }\n else {\n // 动画已执行完\n if (animation.onFrame) {\n shape.attr(animation.onFrame(1));\n }\n else {\n shape.attr(animation.toAttrs);\n }\n return true;\n }\n }\n if (animation.onFrame) {\n var attrs = animation.onFrame(ratio);\n shape.attr(attrs);\n }\n else {\n _update(shape, animation, ratio);\n }\n return false;\n}\nvar timeline_Timeline = /** @class */ (function () {\n /**\n * 时间轴构造函数,依赖于画布\n * @param {}\n */\n function Timeline(canvas) {\n /**\n * 执行动画的元素列表\n * @type {IElement[]}\n */\n this.animators = [];\n /**\n * 当前时间\n * @type {number}\n */\n this.current = 0;\n /**\n * 定时器\n * @type {d3Timer.Timer}\n */\n this.timer = null;\n this.canvas = canvas;\n }\n /**\n * 初始化定时器\n */\n Timeline.prototype.initTimer = function () {\n var _this = this;\n var isFinished = false;\n var shape;\n var animations;\n var animation;\n this.timer = timer(function (elapsed) {\n _this.current = elapsed;\n if (_this.animators.length > 0) {\n for (var i = _this.animators.length - 1; i >= 0; i--) {\n shape = _this.animators[i];\n if (shape.destroyed) {\n // 如果已经被销毁,直接移出队列\n _this.removeAnimator(i);\n continue;\n }\n if (!shape.isAnimatePaused()) {\n animations = shape.get(\'animations\');\n for (var j = animations.length - 1; j >= 0; j--) {\n animation = animations[j];\n isFinished = update(shape, animation, elapsed);\n if (isFinished) {\n animations.splice(j, 1);\n isFinished = false;\n if (animation.callback) {\n animation.callback();\n }\n }\n }\n }\n if (animations.length === 0) {\n _this.removeAnimator(i);\n }\n }\n var autoDraw = _this.canvas.get(\'autoDraw\');\n // 非自动渲染模式下,手动调用 canvas.draw() 重新渲染\n if (!autoDraw) {\n _this.canvas.draw();\n }\n }\n });\n };\n /**\n * 增加动画元素\n */\n Timeline.prototype.addAnimator = function (shape) {\n this.animators.push(shape);\n };\n /**\n * 移除动画元素\n */\n Timeline.prototype.removeAnimator = function (index) {\n this.animators.splice(index, 1);\n };\n /**\n * 是否有动画在执行\n */\n Timeline.prototype.isAnimating = function () {\n return !!this.animators.length;\n };\n /**\n * 停止定时器\n */\n Timeline.prototype.stop = function () {\n if (this.timer) {\n this.timer.stop();\n }\n };\n /**\n * 停止时间轴上所有元素的动画,并置空动画元素列表\n * @param {boolean} toEnd 是否到动画的最终状态,用来透传给动画元素的 stopAnimate 方法\n */\n Timeline.prototype.stopAllAnimations = function (toEnd) {\n if (toEnd === void 0) { toEnd = true; }\n this.animators.forEach(function (animator) {\n animator.stopAnimate(toEnd);\n });\n this.animators = [];\n this.canvas.draw();\n };\n /**\n * 获取当前时间\n */\n Timeline.prototype.getTime = function () {\n return this.current;\n };\n return Timeline;\n}());\n/* harmony default export */ var animate_timeline = (timeline_Timeline);\n//# sourceMappingURL=timeline.js.map\n// EXTERNAL MODULE: ./node_modules/@antv/g-base/esm/event/graph-event.js\nvar graph_event = __webpack_require__(118);\n\n// CONCATENATED MODULE: ./node_modules/@antv/g-base/esm/event/event-contoller.js\n/**\n * @fileoverview 事件处理器\n * @author dxq613@gmail.com\n */\n\n\nvar CLICK_OFFSET = 40;\nvar LEFT_BTN_CODE = 0;\nvar DELEGATION_SPLIT = \':\';\nvar EVENTS = [\n \'mousedown\',\n \'mouseup\',\n \'dblclick\',\n \'mouseout\',\n \'mouseover\',\n \'mousemove\',\n \'mouseleave\',\n \'mouseenter\',\n \'touchstart\',\n \'touchmove\',\n \'touchend\',\n \'dragenter\',\n \'dragover\',\n \'dragleave\',\n \'drop\',\n \'contextmenu\',\n \'mousewheel\',\n];\n// 是否有委托事件监听\nfunction hasDelegation(events, type) {\n for (var key in events) {\n if (events.hasOwnProperty(key) && key.indexOf(DELEGATION_SPLIT + type) >= 0) {\n return true;\n }\n }\n return false;\n}\n// 触发目标事件,目标只能是 shape 或 canvas\nfunction emitTargetEvent(target, type, eventObj) {\n eventObj.name = type;\n eventObj.target = target;\n eventObj.currentTarget = target;\n eventObj.delegateTarget = target;\n target.emit(type, eventObj);\n}\n// 事件冒泡, enter 和 leave 需要对 fromShape 和 toShape 进行判同\nfunction bubbleEvent(container, type, eventObj) {\n if (eventObj.bubbles) {\n var relativeShape = void 0;\n var isOverEvent = false;\n if (type === \'mouseenter\') {\n relativeShape = eventObj.fromShape;\n isOverEvent = true;\n }\n else if (type === \'mouseleave\') {\n isOverEvent = true;\n relativeShape = eventObj.toShape;\n }\n // canvas 上的 mouseenter, mouseleave 事件,仅当进入或者移出 canvas 时触发\n if (container.isCanvas() && isOverEvent) {\n return;\n }\n // 如果相关图形同当前图形在同一个容器内,不触发事件\n if (relativeShape && Object(util["g" /* isParent */])(container, relativeShape)) {\n // 阻止继续向上冒泡\n eventObj.bubbles = false;\n return;\n }\n // 事件名称可能在委托过程中被修改,因此事件冒泡时需要重新设置事件名称\n eventObj.name = type;\n eventObj.currentTarget = container;\n eventObj.delegateTarget = container;\n container.emit(type, eventObj);\n }\n}\nvar event_contoller_EventController = /** @class */ (function () {\n function EventController(cfg) {\n var _this = this;\n // 正在被拖拽的图形\n this.draggingShape = null;\n this.dragging = false;\n // 当前鼠标/touch所在位置的图形\n this.currentShape = null;\n this.mousedownShape = null;\n this.mousedownPoint = null;\n // 统一处理所有的回调\n this._eventCallback = function (ev) {\n var type = ev.type;\n _this._triggerEvent(type, ev);\n };\n // 在 document 处理拖拽到画布外的事件,处理从图形上移除画布未被捕捉的问题\n this._onDocumentMove = function (ev) {\n var canvas = _this.canvas;\n var el = canvas.get(\'el\');\n if (el !== ev.target) {\n // 不在 canvas 上移动\n if (_this.dragging || _this.currentShape) {\n var pointInfo = _this._getPointInfo(ev);\n // 还在拖拽过程中\n if (_this.dragging) {\n _this._emitEvent(\'drag\', ev, pointInfo, _this.draggingShape);\n }\n // 说明从某个图形直接移动到了画布外面,\n // 修复了 mouseleave 的 bug 后不再出现这种情况\n // if (this.currentShape) {\n // this._emitEvent(\'mouseleave\', ev, pointInfo, this.currentShape, this.currentShape, null);\n // this.currentShape = null;\n // }\n }\n }\n };\n // 在 document 上处理拖拽到外面,释放鼠标时触发 dragend\n this._onDocumentMouseUp = function (ev) {\n var canvas = _this.canvas;\n var el = canvas.get(\'el\');\n if (el !== ev.target) {\n // 不在 canvas 上移动\n if (_this.dragging) {\n var pointInfo = _this._getPointInfo(ev);\n if (_this.draggingShape) {\n // 如果存在拖拽的图形,则也触发 drop 事件\n _this._emitEvent(\'drop\', ev, pointInfo, null);\n }\n _this._emitEvent(\'dragend\', ev, pointInfo, _this.draggingShape);\n _this._afterDrag(_this.draggingShape, pointInfo, ev);\n }\n }\n };\n this.canvas = cfg.canvas;\n }\n EventController.prototype.init = function () {\n this._bindEvents();\n };\n // 注册事件\n EventController.prototype._bindEvents = function () {\n var _this = this;\n var el = this.canvas.get(\'el\');\n Object(util["a" /* each */])(EVENTS, function (eventName) {\n el.addEventListener(eventName, _this._eventCallback);\n });\n if (document) {\n // 处理移动到外面没有触发 shape mouse leave 的事件\n // 处理拖拽到外部的问题\n document.addEventListener(\'mousemove\', this._onDocumentMove);\n // 处理拖拽过程中在外部释放鼠标的问题\n document.addEventListener(\'mouseup\', this._onDocumentMouseUp);\n }\n };\n // 清理事件\n EventController.prototype._clearEvents = function () {\n var _this = this;\n var el = this.canvas.get(\'el\');\n Object(util["a" /* each */])(EVENTS, function (eventName) {\n el.removeEventListener(eventName, _this._eventCallback);\n });\n if (document) {\n document.removeEventListener(\'mousemove\', this._onDocumentMove);\n document.removeEventListener(\'mouseup\', this._onDocumentMouseUp);\n }\n };\n EventController.prototype._getEventObj = function (type, event, point, target, fromShape, toShape) {\n var eventObj = new graph_event["a" /* default */](type, event);\n eventObj.fromShape = fromShape;\n eventObj.toShape = toShape;\n eventObj.x = point.x;\n eventObj.y = point.y;\n eventObj.clientX = point.clientX;\n eventObj.clientY = point.clientY;\n eventObj.propagationPath.push(target);\n // 事件的x,y应该是基于画布左上角的,与canvas的matrix无关\n return eventObj;\n };\n // 根据点获取图形,提取成独立方法,便于后续优化\n EventController.prototype._getShape = function (point, ev) {\n return this.canvas.getShape(point.x, point.y, ev);\n };\n // 获取事件的当前点的信息\n EventController.prototype._getPointInfo = function (ev) {\n var canvas = this.canvas;\n var clientPoint = canvas.getClientByEvent(ev);\n var point = canvas.getPointByEvent(ev);\n return {\n x: point.x,\n y: point.y,\n clientX: clientPoint.x,\n clientY: clientPoint.y,\n };\n };\n // 触发事件\n EventController.prototype._triggerEvent = function (type, ev) {\n var pointInfo = this._getPointInfo(ev);\n // 每次都获取图形有一定成本,后期可以考虑进行缓存策略\n var shape = this._getShape(pointInfo, ev);\n var method = this["_on" + type];\n var leaveCanvas = false;\n if (method) {\n method.call(this, pointInfo, shape, ev);\n }\n else {\n var preShape = this.currentShape;\n // 如果进入、移出画布时存在图形,则要分别触发事件\n if (type === \'mouseenter\' || type === \'dragenter\' || type === \'mouseover\') {\n this._emitEvent(type, ev, pointInfo, null, null, shape); // 先进入画布\n if (shape) {\n this._emitEvent(type, ev, pointInfo, shape, null, shape); // 再触发图形的事件\n }\n if (type === \'mouseenter\' && this.draggingShape) {\n // 如果正在拖拽图形, 则触发 dragleave\n this._emitEvent(\'dragenter\', ev, pointInfo, null);\n }\n }\n else if (type === \'mouseleave\' || type === \'dragleave\' || type === \'mouseout\') {\n leaveCanvas = true;\n if (preShape) {\n this._emitEvent(type, ev, pointInfo, preShape, preShape, null); // 先触发图形的事件\n }\n this._emitEvent(type, ev, pointInfo, null, preShape, null); // 再触发离开画布事件\n if (type === \'mouseleave\' && this.draggingShape) {\n this._emitEvent(\'dragleave\', ev, pointInfo, null);\n }\n }\n else {\n this._emitEvent(type, ev, pointInfo, shape, null, null); // 一般事件中不需要考虑 from, to\n }\n }\n if (!leaveCanvas) {\n this.currentShape = shape;\n }\n // 当鼠标从画布移动到 shape 或者从 preShape 移动到 shape 时,应用 shape 上的鼠标样式\n if (shape && !shape.get(\'destroyed\')) {\n var canvas = this.canvas;\n var el = canvas.get(\'el\');\n el.style.cursor = shape.attr(\'cursor\') || canvas.get(\'cursor\');\n }\n };\n // 记录下点击的位置、图形,便于拖拽事件、click 事件的判定\n EventController.prototype._onmousedown = function (pointInfo, shape, event) {\n // 只有鼠标左键的 mousedown 事件才会设置 mousedownShape 等属性,避免鼠标右键的 mousedown 事件引起其他事件发生\n if (event.button === LEFT_BTN_CODE) {\n this.mousedownShape = shape;\n this.mousedownPoint = pointInfo;\n this.mousedownTimeStamp = event.timeStamp;\n }\n this._emitEvent(\'mousedown\', event, pointInfo, shape, null, null); // mousedown 不考虑fromShape, toShape\n };\n // mouseleave 和 mouseenter 都是成对存在的\n // mouseenter 和 mouseover 同时触发\n EventController.prototype._emitMouseoverEvents = function (event, pointInfo, fromShape, toShape) {\n var el = this.canvas.get(\'el\');\n if (fromShape !== toShape) {\n if (fromShape) {\n this._emitEvent(\'mouseout\', event, pointInfo, fromShape, fromShape, toShape);\n this._emitEvent(\'mouseleave\', event, pointInfo, fromShape, fromShape, toShape);\n // 当鼠标从 fromShape 移动到画布上时,重置鼠标样式\n if (!toShape || toShape.get(\'destroyed\')) {\n el.style.cursor = this.canvas.get(\'cursor\');\n }\n }\n if (toShape) {\n this._emitEvent(\'mouseover\', event, pointInfo, toShape, fromShape, toShape);\n this._emitEvent(\'mouseenter\', event, pointInfo, toShape, fromShape, toShape);\n }\n }\n };\n // dragover 不等同于 mouseover,而等同于 mousemove\n EventController.prototype._emitDragoverEvents = function (event, pointInfo, fromShape, toShape, isCanvasEmit) {\n if (toShape) {\n if (toShape !== fromShape) {\n if (fromShape) {\n this._emitEvent(\'dragleave\', event, pointInfo, fromShape, fromShape, toShape);\n }\n this._emitEvent(\'dragenter\', event, pointInfo, toShape, fromShape, toShape);\n }\n if (!isCanvasEmit) {\n this._emitEvent(\'dragover\', event, pointInfo, toShape);\n }\n }\n else if (fromShape) {\n // TODO: 此处判断有问题,当 drag 图形时,也会触发一次 dragleave 事件,因为此时 toShape 为 null,这不是所期望的\n // 经过空白区域\n this._emitEvent(\'dragleave\', event, pointInfo, fromShape, fromShape, toShape);\n }\n if (isCanvasEmit) {\n this._emitEvent(\'dragover\', event, pointInfo, toShape);\n }\n };\n // drag 完成后,需要做一些清理工作\n EventController.prototype._afterDrag = function (draggingShape, pointInfo, event) {\n if (draggingShape) {\n draggingShape.set(\'capture\', true); // 恢复可以拾取\n this.draggingShape = null;\n }\n this.dragging = false;\n // drag 完成后,有可能 draggingShape 已经移动到了当前位置,所以不能直接取当前图形\n var shape = this._getShape(pointInfo, event);\n // 拖拽完成后,进行 enter,leave 的判定\n if (shape !== draggingShape) {\n this._emitMouseoverEvents(event, pointInfo, draggingShape, shape);\n }\n this.currentShape = shape; // 更新当前 shape,如果不处理当前图形的 mouseleave 事件可能会出问题\n };\n // 按键抬起时,会终止拖拽、触发点击\n EventController.prototype._onmouseup = function (pointInfo, shape, event) {\n // eevent.button === 0 表示鼠标左键事件,此处加上判断主要是为了避免右键鼠标会触发 mouseup 和 click 事件\n // ref: https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/button\n if (event.button === LEFT_BTN_CODE) {\n var draggingShape = this.draggingShape;\n if (this.dragging) {\n // 存在可以拖拽的图形,同时拖拽到其他图形上时触发 drag 事件\n if (draggingShape) {\n this._emitEvent(\'drop\', event, pointInfo, shape);\n }\n this._emitEvent(\'dragend\', event, pointInfo, draggingShape);\n this._afterDrag(draggingShape, pointInfo, event);\n }\n else {\n this._emitEvent(\'mouseup\', event, pointInfo, shape); // 先触发 mouseup 再触发 click\n if (shape === this.mousedownShape) {\n this._emitEvent(\'click\', event, pointInfo, shape);\n }\n this.mousedownShape = null;\n this.mousedownPoint = null;\n }\n }\n };\n // 当触发浏览器的 dragover 事件时,不会再触发 mousemove ,所以这时候的 dragenter, dragleave 事件需要重新处理\n EventController.prototype._ondragover = function (pointInfo, shape, event) {\n event.preventDefault(); // 如果不对 dragover 进行 preventDefault,则不会在 canvas 上触发 drop 事件\n var preShape = this.currentShape;\n this._emitDragoverEvents(event, pointInfo, preShape, shape, true);\n };\n // 大量的图形事件,都通过 mousemove 模拟\n EventController.prototype._onmousemove = function (pointInfo, shape, event) {\n var canvas = this.canvas;\n var preShape = this.currentShape;\n var draggingShape = this.draggingShape;\n // 正在拖拽时\n if (this.dragging) {\n // 正在拖拽中\n if (draggingShape) {\n // 如果拖拽了 shape 会触发 dragenter, dragleave, dragover 和 drag 事件\n this._emitDragoverEvents(event, pointInfo, preShape, shape, false);\n }\n // 如果存在 draggingShape 则会在 draggingShape 上触发 drag 事件,冒泡到 canvas 上\n // 否则在 canvas 上触发 drag 事件\n this._emitEvent(\'drag\', event, pointInfo, draggingShape);\n }\n else {\n var mousedownPoint = this.mousedownPoint;\n if (mousedownPoint) {\n // 当鼠标点击下去,同时移动时,进行 drag 判定\n var mousedownShape = this.mousedownShape;\n var now = event.timeStamp;\n var timeWindow = now - this.mousedownTimeStamp;\n var dx = mousedownPoint.clientX - pointInfo.clientX;\n var dy = mousedownPoint.clientY - pointInfo.clientY;\n var dist = dx * dx + dy * dy;\n if (timeWindow > 120 || dist > CLICK_OFFSET) {\n if (mousedownShape && mousedownShape.get(\'draggable\')) {\n // 设置了 draggable 的 shape 才能触发 drag 相关的事件\n draggingShape = this.mousedownShape; // 拖动鼠标点下时的 shape\n draggingShape.set(\'capture\', false); // 禁止继续拾取,否则无法进行 dragover,dragenter,dragleave,drop的判定\n this.draggingShape = draggingShape;\n this.dragging = true;\n this._emitEvent(\'dragstart\', event, pointInfo, draggingShape);\n // 清理按下鼠标时缓存的值\n this.mousedownShape = null;\n this.mousedownPoint = null;\n }\n else if (!mousedownShape && canvas.get(\'draggable\')) {\n // 设置了 draggable 的 canvas 才能触发 drag 相关的事件\n this.dragging = true;\n this._emitEvent(\'dragstart\', event, pointInfo, null);\n // 清理按下鼠标时缓存的值\n this.mousedownShape = null;\n this.mousedownPoint = null;\n }\n else {\n this._emitMouseoverEvents(event, pointInfo, preShape, shape);\n this._emitEvent(\'mousemove\', event, pointInfo, shape);\n }\n }\n else {\n this._emitMouseoverEvents(event, pointInfo, preShape, shape);\n this._emitEvent(\'mousemove\', event, pointInfo, shape);\n }\n }\n else {\n // 没有按键按下时,则直接触发 mouse over 相关的各种事件\n this._emitMouseoverEvents(event, pointInfo, preShape, shape);\n // 始终触发移动\n this._emitEvent(\'mousemove\', event, pointInfo, shape);\n }\n }\n };\n // 触发事件\n EventController.prototype._emitEvent = function (type, event, pointInfo, shape, fromShape, toShape) {\n var eventObj = this._getEventObj(type, event, pointInfo, shape, fromShape, toShape);\n // 存在 shape 触发,则进行冒泡处理\n if (shape) {\n eventObj.shape = shape;\n // 触发 shape 上的事件\n emitTargetEvent(shape, type, eventObj);\n var parent_1 = shape.getParent();\n // 执行冒泡\n while (parent_1) {\n // 委托事件要先触发\n parent_1.emitDelegation(type, eventObj);\n // 事件冒泡停止,不能妨碍委托事件\n if (!eventObj.propagationStopped) {\n bubbleEvent(parent_1, type, eventObj);\n }\n eventObj.propagationPath.push(parent_1);\n parent_1 = parent_1.getParent();\n }\n }\n else {\n // 如果没有 shape 直接在 canvas 上触发\n var canvas = this.canvas;\n // 直接触发 canvas 上的事件\n emitTargetEvent(canvas, type, eventObj);\n }\n };\n EventController.prototype.destroy = function () {\n // 清理事件\n this._clearEvents();\n // 清理缓存的对象\n this.canvas = null;\n this.currentShape = null;\n this.draggingShape = null;\n this.mousedownPoint = null;\n this.mousedownShape = null;\n this.mousedownTimeStamp = null;\n };\n return EventController;\n}());\n/* harmony default export */ var event_contoller = (event_contoller_EventController);\n//# sourceMappingURL=event-contoller.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-base/esm/abstract/canvas.js\n\n\n\n\n\n\nvar PX_SUFFIX = \'px\';\nvar browser = Object(es["a" /* detect */])();\nvar isFirefox = browser && browser.name === \'firefox\';\nvar canvas_Canvas = /** @class */ (function (_super) {\n Object(tslib_es6["__extends"])(Canvas, _super);\n function Canvas(cfg) {\n var _this = _super.call(this, cfg) || this;\n _this.initContainer();\n _this.initDom();\n _this.initEvents();\n _this.initTimeline();\n return _this;\n }\n Canvas.prototype.getDefaultCfg = function () {\n var cfg = _super.prototype.getDefaultCfg.call(this);\n // set default cursor style for canvas\n cfg[\'cursor\'] = \'default\';\n // CSS transform 目前尚未经过长时间验证,为了避免影响上层业务,默认关闭,上层按需开启\n cfg[\'supportCSSTransform\'] = false;\n return cfg;\n };\n /**\n * @protected\n * 初始化容器\n */\n Canvas.prototype.initContainer = function () {\n var container = this.get(\'container\');\n if (Object(util["h" /* isString */])(container)) {\n container = document.getElementById(container);\n this.set(\'container\', container);\n }\n };\n /**\n * @protected\n * 初始化 DOM\n */\n Canvas.prototype.initDom = function () {\n var el = this.createDom();\n this.set(\'el\', el);\n // 附加到容器\n var container = this.get(\'container\');\n container.appendChild(el);\n // 设置初始宽度\n this.setDOMSize(this.get(\'width\'), this.get(\'height\'));\n };\n /**\n * @protected\n * 初始化绑定的事件\n */\n Canvas.prototype.initEvents = function () {\n var eventController = new event_contoller({\n canvas: this,\n });\n eventController.init();\n this.set(\'eventController\', eventController);\n };\n /**\n * @protected\n * 初始化时间轴\n */\n Canvas.prototype.initTimeline = function () {\n var timeline = new animate_timeline(this);\n this.set(\'timeline\', timeline);\n };\n /**\n * @protected\n * 修改画布对应的 DOM 的大小\n * @param {number} width 宽度\n * @param {number} height 高度\n */\n Canvas.prototype.setDOMSize = function (width, height) {\n var el = this.get(\'el\');\n if (util["c" /* isBrowser */]) {\n el.style.width = width + PX_SUFFIX;\n el.style.height = height + PX_SUFFIX;\n }\n };\n // 实现接口\n Canvas.prototype.changeSize = function (width, height) {\n this.setDOMSize(width, height);\n this.set(\'width\', width);\n this.set(\'height\', height);\n this.onCanvasChange(\'changeSize\');\n };\n /**\n * 获取当前的渲染引擎\n * @return {Renderer} 返回当前的渲染引擎\n */\n Canvas.prototype.getRenderer = function () {\n return this.get(\'renderer\');\n };\n /**\n * 获取画布的 cursor 样式\n * @return {Cursor}\n */\n Canvas.prototype.getCursor = function () {\n return this.get(\'cursor\');\n };\n /**\n * 设置画布的 cursor 样式\n * @param {Cursor} cursor cursor 样式\n */\n Canvas.prototype.setCursor = function (cursor) {\n this.set(\'cursor\', cursor);\n var el = this.get(\'el\');\n if (util["c" /* isBrowser */] && el) {\n // 直接设置样式,不等待鼠标移动时再设置\n el.style.cursor = cursor;\n }\n };\n // 实现接口\n Canvas.prototype.getPointByEvent = function (ev) {\n var supportCSSTransform = this.get(\'supportCSSTransform\');\n if (supportCSSTransform) {\n // For Firefox <= 38\n if (isFirefox && !Object(util["e" /* isNil */])(ev.layerX) && ev.layerX !== ev.offsetX) {\n return {\n x: ev.layerX,\n y: ev.layerY,\n };\n }\n if (!Object(util["e" /* isNil */])(ev.offsetX)) {\n // For IE6+, Firefox >= 39, Chrome, Safari, Opera\n return {\n x: ev.offsetX,\n y: ev.offsetY,\n };\n }\n }\n // should calculate by self for other cases, like Safari in ios\n // TODO: support CSS transform\n var _a = this.getClientByEvent(ev), clientX = _a.x, clientY = _a.y;\n return this.getPointByClient(clientX, clientY);\n };\n // 获取 touch 事件的 clientX 和 clientY 需要单独处理\n Canvas.prototype.getClientByEvent = function (ev) {\n var clientInfo = ev;\n if (ev.touches) {\n if (ev.type === \'touchend\') {\n clientInfo = ev.changedTouches[0];\n }\n else {\n clientInfo = ev.touches[0];\n }\n }\n return {\n x: clientInfo.clientX,\n y: clientInfo.clientY,\n };\n };\n // 实现接口\n Canvas.prototype.getPointByClient = function (clientX, clientY) {\n var el = this.get(\'el\');\n var bbox = el.getBoundingClientRect();\n return {\n x: clientX - bbox.left,\n y: clientY - bbox.top,\n };\n };\n // 实现接口\n Canvas.prototype.getClientByPoint = function (x, y) {\n var el = this.get(\'el\');\n var bbox = el.getBoundingClientRect();\n return {\n x: x + bbox.left,\n y: y + bbox.top,\n };\n };\n // 实现接口\n Canvas.prototype.draw = function () { };\n /**\n * @protected\n * 销毁 DOM 容器\n */\n Canvas.prototype.removeDom = function () {\n var el = this.get(\'el\');\n el.parentNode.removeChild(el);\n };\n /**\n * @protected\n * 清理所有的事件\n */\n Canvas.prototype.clearEvents = function () {\n var eventController = this.get(\'eventController\');\n eventController.destroy();\n };\n Canvas.prototype.isCanvas = function () {\n return true;\n };\n Canvas.prototype.getParent = function () {\n return null;\n };\n Canvas.prototype.destroy = function () {\n var timeline = this.get(\'timeline\');\n if (this.get(\'destroyed\')) {\n return;\n }\n this.clear();\n // 同初始化时相反顺序调用\n if (timeline) {\n // 画布销毁时自动停止动画\n timeline.stop();\n }\n this.clearEvents();\n this.removeDom();\n _super.prototype.destroy.call(this);\n };\n return Canvas;\n}(abstract_container["a" /* default */]));\n/* harmony default export */ var canvas = __webpack_exports__["a"] = (canvas_Canvas);\n//# sourceMappingURL=canvas.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy1iYXNlL25vZGVfbW9kdWxlcy9kMy10aW1lci9zcmMvdGltZXIuanM/ZmZmNiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtZWFzZS9zcmMvbGluZWFyLmpzPzY1MTMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWVhc2Uvc3JjL3F1YWQuanM/NGQ3MiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtZWFzZS9zcmMvY3ViaWMuanM/ODkyMSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtZWFzZS9zcmMvcG9seS5qcz9lNTdhIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1lYXNlL3NyYy9zaW4uanM/ZWI2NyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtZWFzZS9zcmMvbWF0aC5qcz9lOTkxIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1lYXNlL3NyYy9leHAuanM/MmNlNSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtZWFzZS9zcmMvY2lyY2xlLmpzP2I0ODkiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWVhc2Uvc3JjL2JvdW5jZS5qcz8zMDc4Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1lYXNlL3NyYy9iYWNrLmpzPzg5NDYiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWVhc2Uvc3JjL2VsYXN0aWMuanM/YjljZiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtZWFzZS9zcmMvaW5kZXguanM/ZmI3NyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtY29sb3Ivc3JjL2RlZmluZS5qcz82M2FkIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1jb2xvci9zcmMvY29sb3IuanM/MTY2YSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL2Jhc2lzLmpzP2M4NGEiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9iYXNpc0Nsb3NlZC5qcz80YmNkIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvY29uc3RhbnQuanM/YzY5OCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL2NvbG9yLmpzP2IwNTUiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9yZ2IuanM/ZTM2MCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL251bWJlckFycmF5LmpzPzUxZGUiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9hcnJheS5qcz82NzMwIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvZGF0ZS5qcz8xYjZkIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvbnVtYmVyLmpzP2UzMTciLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9vYmplY3QuanM/NzFiZCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL3N0cmluZy5qcz85MGVmIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvdmFsdWUuanM/ZWExZCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy1iYXNlL2VzbS91dGlsL2NvbG9yLmpzPzZjYjMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2ctYmFzZS9lc20vYW5pbWF0ZS90aW1lbGluZS5qcz81OWM5Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9nLWJhc2UvZXNtL2V2ZW50L2V2ZW50LWNvbnRvbGxlci5qcz9kMjQ0Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9nLWJhc2UvZXNtL2Fic3RyYWN0L2NhbnZhcy5qcz8xMjQzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxJQUFJLFdBQUs7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxSUFBcUksbUJBQW1COztBQUVqSjtBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFTztBQUNQO0FBQ0E7QUFDQTtBQUNBOztBQUVPO0FBQ1AsUUFBUTtBQUNSLElBQUksV0FBSyxDQUFDO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksV0FBSztBQUNUOztBQUVBO0FBQ0E7QUFDQSxFQUFFLFdBQUs7QUFDUDtBQUNBO0FBQ0EsR0FBRztBQUNILElBQUksV0FBSztBQUNUO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE1BQU0sV0FBSyxTQUFTO0FBQ3BCO0FBQ0EsOEJBQThCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLElBQUksV0FBSztBQUNUO0FBQ0E7OztBQzdHTztBQUNQO0FBQ0E7OztBQ0ZPO0FBQ1A7QUFDQTs7QUFFTztBQUNQO0FBQ0E7O0FBRU87QUFDUDtBQUNBOzs7QUNWTztBQUNQO0FBQ0E7O0FBRU87QUFD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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEVBQTBFO0FBQzFFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtDQUErQztBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0M7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvRUFBb0U7QUFDcEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0I7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDREQUE0RDtBQUM1RCw0REFBNEQ7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ2MsbUZBQWUsRUFBQztBQUMvQiwyQzs7QUNyYmtDO0FBQ007QUFDSjtBQUNzQjtBQUNmO0FBQ1k7QUFDdkQ7QUFDQSxjQUFjLDRCQUFNO0FBQ3BCO0FBQ0EsSUFBSSxhQUFNO0FBQ1YsSUFBSSw4QkFBUztBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxnQ0FBUTtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQyxlQUFlO0FBQ2pEO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsZ0JBQVE7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsT0FBTztBQUN0QixlQUFlLE9BQU87QUFDdEI7QUFDQTtBQUNBO0FBQ0EsWUFBWSx5QkFBUztBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixTQUFTO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLE9BQU87QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLHlCQUFTO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4Qiw2QkFBSztBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLDZCQUFLO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsQ0FBQyxxQ0FBUztBQUNJLG1GQUFNLEVBQUM7QUFDdEIiLCJmaWxlIjoiMjc1LmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIGZyYW1lID0gMCwgLy8gaXMgYW4gYW5pbWF0aW9uIGZyYW1lIHBlbmRpbmc/XG4gICAgdGltZW91dCA9IDAsIC8vIGlzIGEgdGltZW91dCBwZW5kaW5nP1xuICAgIGludGVydmFsID0gMCwgLy8gYXJlIGFueSB0aW1lcnMgYWN0aXZlP1xuICAgIHBva2VEZWxheSA9IDEwMDAsIC8vIGhvdyBmcmVxdWVudGx5IHdlIGNoZWNrIGZvciBjbG9jayBza2V3XG4gICAgdGFza0hlYWQsXG4gICAgdGFza1RhaWwsXG4gICAgY2xvY2tMYXN0ID0gMCxcbiAgICBjbG9ja05vdyA9IDAsXG4gICAgY2xvY2tTa2V3ID0gMCxcbiAgICBjbG9jayA9IHR5cGVvZiBwZXJmb3JtYW5jZSA9PT0gXCJvYmplY3RcIiAmJiBwZXJmb3JtYW5jZS5ub3cgPyBwZXJmb3JtYW5jZSA6IERhdGUsXG4gICAgc2V0RnJhbWUgPSB0eXBlb2Ygd2luZG93ID09PSBcIm9iamVjdFwiICYmIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPyB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lLmJpbmQod2luZG93KSA6IGZ1bmN0aW9uKGYpIHsgc2V0VGltZW91dChmLCAxNyk7IH07XG5cbmV4cG9ydCBmdW5jdGlvbiBub3coKSB7XG4gIHJldHVybiBjbG9ja05vdyB8fCAoc2V0RnJhbWUoY2xlYXJOb3cpLCBjbG9ja05vdyA9IGNsb2NrLm5vdygpICsgY2xvY2tTa2V3KTtcbn1cblxuZnVuY3Rpb24gY2xlYXJOb3coKSB7XG4gIGNsb2NrTm93ID0gMDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFRpbWVyKCkge1xuICB0aGlzLl9jYWxsID1cbiAgdGhpcy5fdGltZSA9XG4gIHRoaXMuX25leHQgPSBudWxsO1xufVxuXG5UaW1lci5wcm90b3R5cGUgPSB0aW1lci5wcm90b3R5cGUgPSB7XG4gIGNvbnN0cnVjdG9yOiBUaW1lcixcbiAgcmVzdGFydDogZnVuY3Rpb24oY2FsbGJhY2ssIGRlbGF5LCB0aW1lKSB7XG4gICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiY2FsbGJhY2sgaXMgbm90IGEgZnVuY3Rpb25cIik7XG4gICAgdGltZSA9ICh0aW1lID09IG51bGwgPyBub3coKSA6ICt0aW1lKSArIChkZWxheSA9PSBudWxsID8gMCA6ICtkZWxheSk7XG4gICAgaWYgKCF0aGlzLl9uZXh0ICYmIHRhc2tUYWlsICE9PSB0aGlzKSB7XG4gICAgICBpZiAodGFza1RhaWwpIHRhc2tUYWlsLl9uZXh0ID0gdGhpcztcbiAgICAgIGVsc2UgdGFza0hlYWQgPSB0aGlzO1xuICAgICAgdGFza1RhaWwgPSB0aGlzO1xuICAgIH1cbiAgICB0aGlzLl9jYWxsID0gY2FsbGJhY2s7XG4gICAgdGhpcy5fdGltZSA9IHRpbWU7XG4gICAgc2xlZXAoKTtcbiAgfSxcbiAgc3RvcDogZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuX2NhbGwpIHtcbiAgICAgIHRoaXMuX2NhbGwgPSBudWxsO1xuICAgICAgdGhpcy5fdGltZSA9IEluZmluaXR5O1xuICAgICAgc2xlZXAoKTtcbiAgICB9XG4gIH1cbn07XG5cbmV4cG9ydCBmdW5jdGlvbiB0aW1lcihjYWxsYmFjaywgZGVsYXksIHRpbWUpIHtcbiAgdmFyIHQgPSBuZXcgVGltZXI7XG4gIHQucmVzdGFydChjYWxsYmFjaywgZGVsYXksIHRpbWUpO1xuICByZXR1cm4gdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRpbWVyRmx1c2goKSB7XG4gIG5vdygpOyAvLyBHZXQgdGhlIGN1cnJlbnQgdGltZSwgaWYgbm90IGFscmVhZHkgc2V0LlxuICArK2ZyYW1lOyAvLyBQcmV0ZW5kIHdl4oCZdmUgc2V0IGFuIGFsYXJtLCBpZiB3ZSBoYXZlbuKAmXQgYWxyZWFkeS5cbiAgdmFyIHQgPSB0YXNrSGVhZCwgZTtcbiAgd2hpbGUgKHQpIHtcbiAgICBpZiAoKGUgPSBjbG9ja05vdyAtIHQuX3RpbWUpID49IDApIHQuX2NhbGwuY2FsbChudWxsLCBlKTtcbiAgICB0ID0gdC5fbmV4dDtcbiAgfVxuICAtLWZyYW1lO1xufVxuXG5mdW5jdGlvbiB3YWtlKCkge1xuICBjbG9ja05vdyA9IChjbG9ja0xhc3QgPSBjbG9jay5ub3coKSkgKyBjbG9ja1NrZXc7XG4gIGZyYW1lID0gdGltZW91dCA9IDA7XG4gIHRyeSB7XG4gICAgdGltZXJGbHVzaCgpO1xuICB9IGZpbmFsbHkge1xuICAgIGZyYW1lID0gMDtcbiAgICBuYXAoKTtcbiAgICBjbG9ja05vdyA9IDA7XG4gIH1cbn1cblxuZnVuY3Rpb24gcG9rZSgpIHtcbiAgdmFyIG5vdyA9IGNsb2NrLm5vdygpLCBkZWxheSA9IG5vdyAtIGNsb2NrTGFzdDtcbiAgaWYgKGRlbGF5ID4gcG9rZURlbGF5KSBjbG9ja1NrZXcgLT0gZGVsYXksIGNsb2NrTGFzdCA9IG5vdztcbn1cblxuZnVuY3Rpb24gbmFwKCkge1xuICB2YXIgdDAsIHQxID0gdGFza0hlYWQsIHQyLCB0aW1lID0gSW5maW5pdHk7XG4gIHdoaWxlICh0MSkge1xuICAgIGlmICh0MS5fY2FsbCkge1xuICAgICAgaWYgKHRpbWUgPiB0MS5fdGltZSkgdGltZSA9IHQxLl90aW1lO1xuICAgICAgdDAgPSB0MSwgdDEgPSB0MS5fbmV4dDtcbiAgICB9IGVsc2Uge1xuICAgICAgdDIgPSB0MS5fbmV4dCwgdDEuX25leHQgPSBudWxsO1xuICAgICAgdDEgPSB0MCA/IHQwLl9uZXh0ID0gdDIgOiB0YXNrSGVhZCA9IHQyO1xuICAgIH1cbiAgfVxuICB0YXNrVGFpbCA9IHQwO1xuICBzbGVlcCh0aW1lKTtcbn1cblxuZnVuY3Rpb24gc2xlZXAodGltZSkge1xuICBpZiAoZnJhbWUpIHJldHVybjsgLy8gU29vbmVzdCBhbGFybSBhbHJlYWR5IHNldCwgb3Igd2lsbCBiZS5cbiAgaWYgKHRpbWVvdXQpIHRpbWVvdXQgPSBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gIHZhciBkZWxheSA9IHRpbWUgLSBjbG9ja05vdzsgLy8gU3RyaWN0bHkgbGVzcyB0aGFuIGlmIHdlIHJlY29tcHV0ZWQgY2xvY2tOb3cuXG4gIGlmIChkZWxheSA+IDI0KSB7XG4gICAgaWYgKHRpbWUgPCBJbmZpbml0eSkgdGltZW91dCA9IHNldFRpbWVvdXQod2FrZSwgdGltZSAtIGNsb2NrLm5vdygpIC0gY2xvY2tTa2V3KTtcbiAgICBpZiAoaW50ZXJ2YWwpIGludGVydmFsID0gY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7XG4gIH0gZWxzZSB7XG4gICAgaWYgKCFpbnRlcnZhbCkgY2xvY2tMYXN0ID0gY2xvY2subm93KCksIGludGVydmFsID0gc2V0SW50ZXJ2YWwocG9rZSwgcG9rZURlbGF5KTtcbiAgICBmcmFtZSA9IDEsIHNldEZyYW1lKHdha2UpO1xuICB9XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gbGluZWFyKHQpIHtcbiAgcmV0dXJuICt0O1xufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIHF1YWRJbih0KSB7XG4gIHJldHVybiB0ICogdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHF1YWRPdXQodCkge1xuICByZXR1cm4gdCAqICgyIC0gdCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBxdWFkSW5PdXQodCkge1xuICByZXR1cm4gKCh0ICo9IDIpIDw9IDEgPyB0ICogdCA6IC0tdCAqICgyIC0gdCkgKyAxKSAvIDI7XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gY3ViaWNJbih0KSB7XG4gIHJldHVybiB0ICogdCAqIHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjdWJpY091dCh0KSB7XG4gIHJldHVybiAtLXQgKiB0ICogdCArIDE7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjdWJpY0luT3V0KHQpIHtcbiAgcmV0dXJuICgodCAqPSAyKSA8PSAxID8gdCAqIHQgKiB0IDogKHQgLT0gMikgKiB0ICogdCArIDIpIC8gMjtcbn1cbiIsInZhciBleHBvbmVudCA9IDM7XG5cbmV4cG9ydCB2YXIgcG9seUluID0gKGZ1bmN0aW9uIGN1c3RvbShlKSB7XG4gIGUgPSArZTtcblxuICBmdW5jdGlvbiBwb2x5SW4odCkge1xuICAgIHJldHVybiBNYXRoLnBvdyh0LCBlKTtcbiAgfVxuXG4gIHBvbHlJbi5leHBvbmVudCA9IGN1c3RvbTtcblxuICByZXR1cm4gcG9seUluO1xufSkoZXhwb25lbnQpO1xuXG5leHBvcnQgdmFyIHBvbHlPdXQgPSAoZnVuY3Rpb24gY3VzdG9tKGUpIHtcbiAgZSA9ICtlO1xuXG4gIGZ1bmN0aW9uIHBvbHlPdXQodCkge1xuICAgIHJldHVybiAxIC0gTWF0aC5wb3coMSAtIHQsIGUpO1xuICB9XG5cbiAgcG9seU91dC5leHBvbmVudCA9IGN1c3RvbTtcblxuICByZXR1cm4gcG9seU91dDtcbn0pKGV4cG9uZW50KTtcblxuZXhwb3J0IHZhciBwb2x5SW5PdXQgPSAoZnVuY3Rpb24gY3VzdG9tKGUpIHtcbiAgZSA9ICtlO1xuXG4gIGZ1bmN0aW9uIHBvbHlJbk91dCh0KSB7XG4gICAgcmV0dXJuICgodCAqPSAyKSA8PSAxID8gTWF0aC5wb3codCwgZSkgOiAyIC0gTWF0aC5wb3coMiAtIHQsIGUpKSAvIDI7XG4gIH1cblxuICBwb2x5SW5PdXQuZXhwb25lbnQgPSBjdXN0b207XG5cbiAgcmV0dXJuIHBvbHlJbk91dDtcbn0pKGV4cG9uZW50KTtcbiIsInZhciBwaSA9IE1hdGguUEksXG4gICAgaGFsZlBpID0gcGkgLyAyO1xuXG5leHBvcnQgZnVuY3Rpb24gc2luSW4odCkge1xuICByZXR1cm4gKCt0ID09PSAxKSA/IDEgOiAxIC0gTWF0aC5jb3ModCAqIGhhbGZQaSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaW5PdXQodCkge1xuICByZXR1cm4gTWF0aC5zaW4odCAqIGhhbGZQaSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaW5Jbk91dCh0KSB7XG4gIHJldHVybiAoMSAtIE1hdGguY29zKHBpICogdCkpIC8gMjtcbn1cbiIsIi8vIHRwbXQgaXMgdHdvIHBvd2VyIG1pbnVzIHRlbiB0aW1lcyB0IHNjYWxlZCB0byBbMCwxXVxuZXhwb3J0IGZ1bmN0aW9uIHRwbXQoeCkge1xuICByZXR1cm4gKE1hdGgucG93KDIsIC0xMCAqIHgpIC0gMC4wMDA5NzY1NjI1KSAqIDEuMDAwOTc3NTE3MTA2NTQ5NDtcbn1cbiIsImltcG9ydCB7dHBtdH0gZnJvbSBcIi4vbWF0aC5qc1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gZXhwSW4odCkge1xuICByZXR1cm4gdHBtdCgxIC0gK3QpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXhwT3V0KHQpIHtcbiAgcmV0dXJuIDEgLSB0cG10KHQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXhwSW5PdXQodCkge1xuICByZXR1cm4gKCh0ICo9IDIpIDw9IDEgPyB0cG10KDEgLSB0KSA6IDIgLSB0cG10KHQgLSAxKSkgLyAyO1xufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIGNpcmNsZUluKHQpIHtcbiAgcmV0dXJuIDEgLSBNYXRoLnNxcnQoMSAtIHQgKiB0KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNpcmNsZU91dCh0KSB7XG4gIHJldHVybiBNYXRoLnNxcnQoMSAtIC0tdCAqIHQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2lyY2xlSW5PdXQodCkge1xuICByZXR1cm4gKCh0ICo9IDIpIDw9IDEgPyAxIC0gTWF0aC5zcXJ0KDEgLSB0ICogdCkgOiBNYXRoLnNxcnQoMSAtICh0IC09IDIpICogdCkgKyAxKSAvIDI7XG59XG4iLCJ2YXIgYjEgPSA0IC8gMTEsXG4gICAgYjIgPSA2IC8gMTEsXG4gICAgYjMgPSA4IC8gMTEsXG4gICAgYjQgPSAzIC8gNCxcbiAgICBiNSA9IDkgLyAxMSxcbiAgICBiNiA9IDEwIC8gMTEsXG4gICAgYjcgPSAxNSAvIDE2LFxuICAgIGI4ID0gMjEgLyAyMixcbiAgICBiOSA9IDYzIC8gNjQsXG4gICAgYjAgPSAxIC8gYjEgLyBiMTtcblxuZXhwb3J0IGZ1bmN0aW9uIGJvdW5jZUluKHQpIHtcbiAgcmV0dXJuIDEgLSBib3VuY2VPdXQoMSAtIHQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYm91bmNlT3V0KHQpIHtcbiAgcmV0dXJuICh0ID0gK3QpIDwgYjEgPyBiMCAqIHQgKiB0IDogdCA8IGIzID8gYjAgKiAodCAtPSBiMikgKiB0ICsgYjQgOiB0IDwgYjYgPyBiMCAqICh0IC09IGI1KSAqIHQgKyBiNyA6IGIwICogKHQgLT0gYjgpICogdCArIGI5O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYm91bmNlSW5PdXQodCkge1xuICByZXR1cm4gKCh0ICo9IDIpIDw9IDEgPyAxIC0gYm91bmNlT3V0KDEgLSB0KSA6IGJvdW5jZU91dCh0IC0gMSkgKyAxKSAvIDI7XG59XG4iLCJ2YXIgb3ZlcnNob290ID0gMS43MDE1ODtcblxuZXhwb3J0IHZhciBiYWNrSW4gPSAoZnVuY3Rpb24gY3VzdG9tKHMpIHtcbiAgcyA9ICtzO1xuXG4gIGZ1bmN0aW9uIGJhY2tJbih0KSB7XG4gICAgcmV0dXJuICh0ID0gK3QpICogdCAqIChzICogKHQgLSAxKSArIHQpO1xuICB9XG5cbiAgYmFja0luLm92ZXJzaG9vdCA9IGN1c3RvbTtcblxuICByZXR1cm4gYmFja0luO1xufSkob3ZlcnNob290KTtcblxuZXhwb3J0IHZhciBiYWNrT3V0ID0gKGZ1bmN0aW9uIGN1c3RvbShzKSB7XG4gIHMgPSArcztcblxuICBmdW5jdGlvbiBiYWNrT3V0KHQpIHtcbiAgICByZXR1cm4gLS10ICogdCAqICgodCArIDEpICogcyArIHQpICsgMTtcbiAgfVxuXG4gIGJhY2tPdXQub3ZlcnNob290ID0gY3VzdG9tO1xuXG4gIHJldHVybiBiYWNrT3V0O1xufSkob3ZlcnNob290KTtcblxuZXhwb3J0IHZhciBiYWNrSW5PdXQgPSAoZnVuY3Rpb24gY3VzdG9tKHMpIHtcbiAgcyA9ICtzO1xuXG4gIGZ1bmN0aW9uIGJhY2tJbk91dCh0KSB7XG4gICAgcmV0dXJuICgodCAqPSAyKSA8IDEgPyB0ICogdCAqICgocyArIDEpICogdCAtIHMpIDogKHQgLT0gMikgKiB0ICogKChzICsgMSkgKiB0ICsgcykgKyAyKSAvIDI7XG4gIH1cblxuICBiYWNrSW5PdXQub3ZlcnNob290ID0gY3VzdG9tO1xuXG4gIHJldHVybiBiYWNrSW5PdXQ7XG59KShvdmVyc2hvb3QpO1xuIiwiaW1wb3J0IHt0cG10fSBmcm9tIFwiLi9tYXRoLmpzXCI7XG5cbnZhciB0YXUgPSAyICogTWF0aC5QSSxcbiAgICBhbXBsaXR1ZGUgPSAxLFxuICAgIHBlcmlvZCA9IDAuMztcblxuZXhwb3J0IHZhciBlbGFzdGljSW4gPSAoZnVuY3Rpb24gY3VzdG9tKGEsIHApIHtcbiAgdmFyIHMgPSBNYXRoLmFzaW4oMSAvIChhID0gTWF0aC5tYXgoMSwgYSkpKSAqIChwIC89IHRhdSk7XG5cbiAgZnVuY3Rpb24gZWxhc3RpY0luKHQpIHtcbiAgICByZXR1cm4gYSAqIHRwbXQoLSgtLXQpKSAqIE1hdGguc2luKChzIC0gdCkgLyBwKTtcbiAgfVxuXG4gIGVsYXN0aWNJbi5hbXBsaXR1ZGUgPSBmdW5jdGlvbihhKSB7IHJldHVybiBjdXN0b20oYSwgcCAqIHRhdSk7IH07XG4gIGVsYXN0aWNJbi5wZXJpb2QgPSBmdW5jdGlvbihwKSB7IHJldHVybiBjdXN0b20oYSwgcCk7IH07XG5cbiAgcmV0dXJuIGVsYXN0aWNJbjtcbn0pKGFtcGxpdHVkZSwgcGVyaW9kKTtcblxuZXhwb3J0IHZhciBlbGFzdGljT3V0ID0gKGZ1bmN0aW9uIGN1c3RvbShhLCBwKSB7XG4gIHZhciBzID0gTWF0aC5hc2luKDEgLyAoYSA9IE1hdGgubWF4KDEsIGEpKSkgKiAocCAvPSB0YXUpO1xuXG4gIGZ1bmN0aW9uIGVsYXN0aWNPdXQodCkge1xuICAgIHJldHVybiAxIC0gYSAqIHRwbXQodCA9ICt0KSAqIE1hdGguc2luKCh0ICsgcykgLyBwKTtcbiAgfVxuXG4gIGVsYXN0aWNPdXQuYW1wbGl0dWRlID0gZnVuY3Rpb24oYSkgeyByZXR1cm4gY3VzdG9tKGEsIHAgKiB0YXUpOyB9O1xuICBlbGFzdGljT3V0LnBlcmlvZCA9IGZ1bmN0aW9uKHApIHsgcmV0dXJuIGN1c3RvbShhLCBwKTsgfTtcblxuICByZXR1cm4gZWxhc3RpY091dDtcbn0pKGFtcGxpdHVkZSwgcGVyaW9kKTtcblxuZXhwb3J0IHZhciBlbGFzdGljSW5PdXQgPSAoZnVuY3Rpb24gY3VzdG9tKGEsIHApIHtcbiAgdmFyIHMgPSBNYXRoLmFzaW4oMSAvIChhID0gTWF0aC5tYXgoMSwgYSkpKSAqIChwIC89IHRhdSk7XG5cbiAgZnVuY3Rpb24gZWxhc3RpY0luT3V0KHQpIHtcbiAgICByZXR1cm4gKCh0ID0gdCAqIDIgLSAxKSA8IDBcbiAgICAgICAgPyBhICogdHBtdCgtdCkgKiBNYXRoLnNpbigocyAtIHQpIC8gcClcbiAgICAgICAgOiAyIC0gYSAqIHRwbXQodCkgKiBNYXRoLnNpbigocyArIHQpIC8gcCkpIC8gMjtcbiAgfVxuXG4gIGVsYXN0aWNJbk91dC5hbXBsaXR1ZGUgPSBmdW5jdGlvbihhKSB7IHJldHVybiBjdXN0b20oYSwgcCAqIHRhdSk7IH07XG4gIGVsYXN0aWNJbk91dC5wZXJpb2QgPSBmdW5jdGlvbihwKSB7IHJldHVybiBjdXN0b20oYSwgcCk7IH07XG5cbiAgcmV0dXJuIGVsYXN0aWNJbk91dDtcbn0pKGFtcGxpdHVkZSwgcGVyaW9kKTtcbiIsImV4cG9ydCB7XG4gIGxpbmVhciBhcyBlYXNlTGluZWFyXG59IGZyb20gXCIuL2xpbmVhci5qc1wiO1xuXG5leHBvcnQge1xuICBxdWFkSW5PdXQgYXMgZWFzZVF1YWQsXG4gIHF1YWRJbiBhcyBlYXNlUXVhZEluLFxuICBxdWFkT3V0IGFzIGVhc2VRdWFkT3V0LFxuICBxdWFkSW5PdXQgYXMgZWFzZVF1YWRJbk91dFxufSBmcm9tIFwiLi9xdWFkLmpzXCI7XG5cbmV4cG9ydCB7XG4gIGN1YmljSW5PdXQgYXMgZWFzZUN1YmljLFxuICBjdWJpY0luIGFzIGVhc2VDdWJpY0luLFxuICBjdWJpY091dCBhcyBlYXNlQ3ViaWNPdXQsXG4gIGN1YmljSW5PdXQgYXMgZWFzZUN1YmljSW5PdXRcbn0gZnJvbSBcIi4vY3ViaWMuanNcIjtcblxuZXhwb3J0IHtcbiAgcG9seUluT3V0IGFzIGVhc2VQb2x5LFxuICBwb2x5SW4gYXMgZWFzZVBvbHlJbixcbiAgcG9seU91dCBhcyBlYXNlUG9seU91dCxcbiAgcG9seUluT3V0IGFzIGVhc2VQb2x5SW5PdXRcbn0gZnJvbSBcIi4vcG9seS5qc1wiO1xuXG5leHBvcnQge1xuICBzaW5Jbk91dCBhcyBlYXNlU2luLFxuICBzaW5JbiBhcyBlYXNlU2luSW4sXG4gIHNpbk91dCBhcyBlYXNlU2luT3V0LFxuICBzaW5Jbk91dCBhcyBlYXNlU2luSW5PdXRcbn0gZnJvbSBcIi4vc2luLmpzXCI7XG5cbmV4cG9ydCB7XG4gIGV4cEluT3V0IGFzIGVhc2VFeHAsXG4gIGV4cEluIGFzIGVhc2VFeHBJbixcbiAgZXhwT3V0IGFzIGVhc2VFeHBPdXQsXG4gIGV4cEluT3V0IGFzIGVhc2VFeHBJbk91dFxufSBmcm9tIFwiLi9leHAuanNcIjtcblxuZXhwb3J0IHtcbiAgY2lyY2xlSW5PdXQgYXMgZWFzZUNpcmNsZSxcbiAgY2lyY2xlSW4gYXMgZWFzZUNpcmNsZUluLFxuICBjaXJjbGVPdXQgYXMgZWFzZUNpcmNsZU91dCxcbiAgY2lyY2xlSW5PdXQgYXMgZWFzZUNpcmNsZUluT3V0XG59IGZyb20gXCIuL2NpcmNsZS5qc1wiO1xuXG5leHBvcnQge1xuICBib3VuY2VPdXQgYXMgZWFzZUJvdW5jZSxcbiAgYm91bmNlSW4gYXMgZWFzZUJvdW5jZUluLFxuICBib3VuY2VPdXQgYXMgZWFzZUJvdW5jZU91dCxcbiAgYm91bmNlSW5PdXQgYXMgZWFzZUJvdW5jZUluT3V0XG59IGZyb20gXCIuL2JvdW5jZS5qc1wiO1xuXG5leHBvcnQge1xuICBiYWNrSW5PdXQgYXMgZWFzZUJhY2ssXG4gIGJhY2tJbiBhcyBlYXNlQmFja0luLFxuICBiYWNrT3V0IGFzIGVhc2VCYWNrT3V0LFxuICBiYWNrSW5PdXQgYXMgZWFzZUJhY2tJbk91dFxufSBmcm9tIFwiLi9iYWNrLmpzXCI7XG5cbmV4cG9ydCB7XG4gIGVsYXN0aWNPdXQgYXMgZWFzZUVsYXN0aWMsXG4gIGVsYXN0aWNJbiBhcyBlYXNlRWxhc3RpY0luLFxuICBlbGFzdGljT3V0IGFzIGVhc2VFbGFzdGljT3V0LFxuICBlbGFzdGljSW5PdXQgYXMgZWFzZUVsYXN0aWNJbk91dFxufSBmcm9tIFwiLi9lbGFzdGljLmpzXCI7XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihjb25zdHJ1Y3RvciwgZmFjdG9yeSwgcHJvdG90eXBlKSB7XG4gIGNvbnN0cnVjdG9yLnByb3RvdHlwZSA9IGZhY3RvcnkucHJvdG90eXBlID0gcHJvdG90eXBlO1xuICBwcm90b3R5cGUuY29uc3RydWN0b3IgPSBjb25zdHJ1Y3Rvcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4dGVuZChwYXJlbnQsIGRlZmluaXRpb24pIHtcbiAgdmFyIHByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUocGFyZW50LnByb3RvdHlwZSk7XG4gIGZvciAodmFyIGtleSBpbiBkZWZpbml0aW9uKSBwcm90b3R5cGVba2V5XSA9IGRlZmluaXRpb25ba2V5XTtcbiAgcmV0dXJuIHByb3RvdHlwZTtcbn1cbiIsImltcG9ydCBkZWZpbmUsIHtleHRlbmR9IGZyb20gXCIuL2RlZmluZS5qc1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gQ29sb3IoKSB7fVxuXG5leHBvcnQgdmFyIGRhcmtlciA9IDAuNztcbmV4cG9ydCB2YXIgYnJpZ2h0ZXIgPSAxIC8gZGFya2VyO1xuXG52YXIgcmVJID0gXCJcXFxccyooWystXT9cXFxcZCspXFxcXHMqXCIsXG4gICAgcmVOID0gXCJcXFxccyooWystXT9cXFxcZCpcXFxcLj9cXFxcZCsoPzpbZUVdWystXT9cXFxcZCspPylcXFxccypcIixcbiAgICByZVAgPSBcIlxcXFxzKihbKy1dP1xcXFxkKlxcXFwuP1xcXFxkKyg/OltlRV1bKy1dP1xcXFxkKyk/KSVcXFxccypcIixcbiAgICByZUhleCA9IC9eIyhbMC05YS1mXXszLDh9KSQvLFxuICAgIHJlUmdiSW50ZWdlciA9IG5ldyBSZWdFeHAoXCJecmdiXFxcXChcIiArIFtyZUksIHJlSSwgcmVJXSArIFwiXFxcXCkkXCIpLFxuICAgIHJlUmdiUGVyY2VudCA9IG5ldyBSZWdFeHAoXCJecmdiXFxcXChcIiArIFtyZVAsIHJlUCwgcmVQXSArIFwiXFxcXCkkXCIpLFxuICAgIHJlUmdiYUludGVnZXIgPSBuZXcgUmVnRXhwKFwiXnJnYmFcXFxcKFwiICsgW3JlSSwgcmVJLCByZUksIHJlTl0gKyBcIlxcXFwpJFwiKSxcbiAgICByZVJnYmFQZXJjZW50ID0gbmV3IFJlZ0V4cChcIl5yZ2JhXFxcXChcIiArIFtyZVAsIHJlUCwgcmVQLCByZU5dICsgXCJcXFxcKSRcIiksXG4gICAgcmVIc2xQZXJjZW50ID0gbmV3IFJlZ0V4cChcIl5oc2xcXFxcKFwiICsgW3JlTiwgcmVQLCByZVBdICsgXCJcXFxcKSRcIiksXG4gICAgcmVIc2xhUGVyY2VudCA9IG5ldyBSZWdFeHAoXCJeaHNsYVxcXFwoXCIgKyBbcmVOLCByZVAsIHJlUCwgcmVOXSArIFwiXFxcXCkkXCIpO1xuXG52YXIgbmFtZWQgPSB7XG4gIGFsaWNlYmx1ZTogMHhmMGY4ZmYsXG4gIGFudGlxdWV3aGl0ZTogMHhmYWViZDcsXG4gIGFxdWE6IDB4MDBmZmZmLFxuICBhcXVhbWFyaW5lOiAweDdmZmZkNCxcbiAgYXp1cmU6IDB4ZjBmZmZmLFxuICBiZWlnZTogMHhmNWY1ZGMsXG4gIGJpc3F1ZTogMHhmZmU0YzQsXG4gIGJsYWNrOiAweDAwMDAwMCxcbiAgYmxhbmNoZWRhbG1vbmQ6IDB4ZmZlYmNkLFxuICBibHVlOiAweDAwMDBmZixcbiAgYmx1ZXZpb2xldDogMHg4YTJiZTIsXG4gIGJyb3duOiAweGE1MmEyYSxcbiAgYnVybHl3b29kOiAweGRlYjg4NyxcbiAgY2FkZXRibHVlOiAweDVmOWVhMCxcbiAgY2hhcnRyZXVzZTogMHg3ZmZmMDAsXG4gIGNob2NvbGF0ZTogMHhkMjY5MWUsXG4gIGNvcmFsOiAweGZmN2Y1MCxcbiAgY29ybmZsb3dlcmJsdWU6IDB4NjQ5NWVkLFxuICBjb3Juc2lsazogMHhmZmY4ZGMsXG4gIGNyaW1zb246IDB4ZGMxNDNjLFxuICBjeWFuOiAweDAwZmZmZixcbiAgZGFya2JsdWU6IDB4MDAwMDhiLFxuICBkYXJrY3lhbjogMHgwMDhiOGIsXG4gIGRhcmtnb2xkZW5yb2Q6IDB4Yjg4NjBiLFxuICBkYXJrZ3JheTogMHhhOWE5YTksXG4gIGRhcmtncmVlbjogMHgwMDY0MDAsXG4gIGRhcmtncmV5OiAweGE5YTlhOSxcbiAgZGFya2toYWtpOiAweGJkYjc2YixcbiAgZGFya21hZ2VudGE6IDB4OGIwMDhiLFxuICBkYXJrb2xpdmVncmVlbjogMHg1NTZiMmYsXG4gIGRhcmtvcmFuZ2U6IDB4ZmY4YzAwLFxuICBkYXJrb3JjaGlkOiAweDk5MzJjYyxcbiAgZGFya3JlZDogMHg4YjAwMDAsXG4gIGRhcmtzYWxtb246IDB4ZTk5NjdhLFxuICBkYXJrc2VhZ3JlZW46IDB4OGZiYzhmLFxuICBkYXJrc2xhdGVibHVlOiAweDQ4M2Q4YixcbiAgZGFya3NsYXRlZ3JheTogMHgyZjRmNGYsXG4gIGRhcmtzbGF0ZWdyZXk6IDB4MmY0ZjRmLFxuICBkYXJrdHVycXVvaXNlOiAweDAwY2VkMSxcbiAgZGFya3Zpb2xldDogMHg5NDAwZDMsXG4gIGRlZXBwaW5rOiAweGZmMTQ5MyxcbiAgZGVlcHNreWJsdWU6IDB4MDBiZmZmLFxuICBkaW1ncmF5OiAweDY5Njk2OSxcbiAgZGltZ3JleTogMHg2OTY5NjksXG4gIGRvZGdlcmJsdWU6IDB4MWU5MGZmLFxuICBmaXJlYnJpY2s6IDB4YjIyMjIyLFxuICBmbG9yYWx3aGl0ZTogMHhmZmZhZjAsXG4gIGZvcmVzdGdyZWVuOiAweDIyOGIyMixcbiAgZnVjaHNpYTogMHhmZjAwZmYsXG4gIGdhaW5zYm9ybzogMHhkY2RjZGMsXG4gIGdob3N0d2hpdGU6IDB4ZjhmOGZmLFxuICBnb2xkOiAweGZmZDcwMCxcbiAgZ29sZGVucm9kOiAweGRhYTUyMCxcbiAgZ3JheTogMHg4MDgwODAsXG4gIGdyZWVuOiAweDAwODAwMCxcbiAgZ3JlZW55ZWxsb3c6IDB4YWRmZjJmLFxuICBncmV5OiAweDgwODA4MCxcbiAgaG9uZXlkZXc6IDB4ZjBmZmYwLFxuICBob3RwaW5rOiAweGZmNjliNCxcbiAgaW5kaWFucmVkOiAweGNkNWM1YyxcbiAgaW5kaWdvOiAweDRiMDA4MixcbiAgaXZvcnk6IDB4ZmZmZmYwLFxuICBraGFraTogMHhmMGU2OGMsXG4gIGxhdmVuZGVyOiAweGU2ZTZmYSxcbiAgbGF2ZW5kZXJibHVzaDogMHhmZmYwZjUsXG4gIGxhd25ncmVlbjogMHg3Y2ZjMDAsXG4gIGxlbW9uY2hpZmZvbjogMHhmZmZhY2QsXG4gIGxpZ2h0Ymx1ZTogMHhhZGQ4ZTYsXG4gIGxpZ2h0Y29yYWw6IDB4ZjA4MDgwLFxuICBsaWdodGN5YW46IDB4ZTBmZmZmLFxuICBsaWdodGdvbGRlbnJvZHllbGxvdzogMHhmYWZhZDIsXG4gIGxpZ2h0Z3JheTogMHhkM2QzZDMsXG4gIGxpZ2h0Z3JlZW46IDB4OTBlZTkwLFxuICBsaWdodGdyZXk6IDB4ZDNkM2QzLFxuICBsaWdodHBpbms6IDB4ZmZiNmMxLFxuICBsaWdodHNhbG1vbjogMHhmZmEwN2EsXG4gIGxpZ2h0c2VhZ3JlZW46IDB4MjBiMmFhLFxuICBsaWdodHNreWJsdWU6IDB4ODdjZWZhLFxuICBsaWdodHNsYXRlZ3JheTogMHg3Nzg4OTksXG4gIGxpZ2h0c2xhdGVncmV5OiAweDc3ODg5OSxcbiAgbGlnaHRzdGVlbGJsdWU6IDB4YjBjNGRlLFxuICBsaWdodHllbGxvdzogMHhmZmZmZTAsXG4gIGxpbWU6IDB4MDBmZjAwLFxuICBsaW1lZ3JlZW46IDB4MzJjZDMyLFxuICBsaW5lbjogMHhmYWYwZTYsXG4gIG1hZ2VudGE6IDB4ZmYwMGZmLFxuICBtYXJvb246IDB4ODAwMDAwLFxuICBtZWRpdW1hcXVhbWFyaW5lOiAweDY2Y2RhYSxcbiAgbWVkaXVtYmx1ZTogMHgwMDAwY2QsXG4gIG1lZGl1bW9yY2hpZDogMHhiYTU1ZDMsXG4gIG1lZGl1bXB1cnBsZTogMHg5MzcwZGIsXG4gIG1lZGl1bXNlYWdyZWVuOiAweDNjYjM3MSxcbiAgbWVkaXVtc2xhdGVibHVlOiAweDdiNjhlZSxcbiAgbWVkaXVtc3ByaW5nZ3JlZW46IDB4MDBmYTlhLFxuICBtZWRpdW10dXJxdW9pc2U6IDB4NDhkMWNjLFxuICBtZWRpdW12aW9sZXRyZWQ6IDB4YzcxNTg1LFxuICBtaWRuaWdodGJsdWU6IDB4MTkxOTcwLFxuICBtaW50Y3JlYW06IDB4ZjVmZmZhLFxuICBtaXN0eXJvc2U6IDB4ZmZlNGUxLFxuICBtb2NjYXNpbjogMHhmZmU0YjUsXG4gIG5hdmFqb3doaXRlOiAweGZmZGVhZCxcbiAgbmF2eTogMHgwMDAwODAsXG4gIG9sZGxhY2U6IDB4ZmRmNWU2LFxuICBvbGl2ZTogMHg4MDgwMDAsXG4gIG9saXZlZHJhYjogMHg2YjhlMjMsXG4gIG9yYW5nZTogMHhmZmE1MDAsXG4gIG9yYW5nZXJlZDogMHhmZjQ1MDAsXG4gIG9yY2hpZDogMHhkYTcwZDYsXG4gIHBhbGVnb2xkZW5yb2Q6IDB4ZWVlOGFhLFxuICBwYWxlZ3JlZW46IDB4OThmYjk4LFxuICBwYWxldHVycXVvaXNlOiAweGFmZWVlZSxcbiAgcGFsZXZpb2xldHJlZDogMHhkYjcwOTMsXG4gIHBhcGF5YXdoaXA6IDB4ZmZlZmQ1LFxuICBwZWFjaHB1ZmY6IDB4ZmZkYWI5LFxuICBwZXJ1OiAweGNkODUzZixcbiAgcGluazogMHhmZmMwY2IsXG4gIHBsdW06IDB4ZGRhMGRkLFxuICBwb3dkZXJibHVlOiAweGIwZTBlNixcbiAgcHVycGxlOiAweDgwMDA4MCxcbiAgcmViZWNjYXB1cnBsZTogMHg2NjMzOTksXG4gIHJlZDogMHhmZjAwMDAsXG4gIHJvc3licm93bjogMHhiYzhmOGYsXG4gIHJveWFsYmx1ZTogMHg0MTY5ZTEsXG4gIHNhZGRsZWJyb3duOiAweDhiNDUxMyxcbiAgc2FsbW9uOiAweGZhODA3MixcbiAgc2FuZHlicm93bjogMHhmNGE0NjAsXG4gIHNlYWdyZWVuOiAweDJlOGI1NyxcbiAgc2Vhc2hlbGw6IDB4ZmZmNWVlLFxuICBzaWVubmE6IDB4YTA1MjJkLFxuICBzaWx2ZXI6IDB4YzBjMGMwLFxuICBza3libHVlOiAweDg3Y2VlYixcbiAgc2xhdGVibHVlOiAweDZhNWFjZCxcbiAgc2xhdGVncmF5OiAweDcwODA5MCxcbiAgc2xhdGVncmV5OiAweDcwODA5MCxcbiAgc25vdzogMHhmZmZhZmEsXG4gIHNwcmluZ2dyZWVuOiAweDAwZmY3ZixcbiAgc3RlZWxibHVlOiAweDQ2ODJiNCxcbiAgdGFuOiAweGQyYjQ4YyxcbiAgdGVhbDogMHgwMDgwODAsXG4gIHRoaXN0bGU6IDB4ZDhiZmQ4LFxuICB0b21hdG86IDB4ZmY2MzQ3LFxuICB0dXJxdW9pc2U6IDB4NDBlMGQwLFxuICB2aW9sZXQ6IDB4ZWU4MmVlLFxuICB3aGVhdDogMHhmNWRlYjMsXG4gIHdoaXRlOiAweGZmZmZmZixcbiAgd2hpdGVzbW9rZTogMHhmNWY1ZjUsXG4gIHllbGxvdzogMHhmZmZmMDAsXG4gIHllbGxvd2dyZWVuOiAweDlhY2QzMlxufTtcblxuZGVmaW5lKENvbG9yLCBjb2xvciwge1xuICBjb3B5OiBmdW5jdGlvbihjaGFubmVscykge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKG5ldyB0aGlzLmNvbnN0cnVjdG9yLCB0aGlzLCBjaGFubmVscyk7XG4gIH0sXG4gIGRpc3BsYXlhYmxlOiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5yZ2IoKS5kaXNwbGF5YWJsZSgpO1xuICB9LFxuICBoZXg6IGNvbG9yX2Zvcm1hdEhleCwgLy8gRGVwcmVjYXRlZCEgVXNlIGNvbG9yLmZvcm1hdEhleC5cbiAgZm9ybWF0SGV4OiBjb2xvcl9mb3JtYXRIZXgsXG4gIGZvcm1hdEhzbDogY29sb3JfZm9ybWF0SHNsLFxuICBmb3JtYXRSZ2I6IGNvbG9yX2Zvcm1hdFJnYixcbiAgdG9TdHJpbmc6IGNvbG9yX2Zvcm1hdFJnYlxufSk7XG5cbmZ1bmN0aW9uIGNvbG9yX2Zvcm1hdEhleCgpIHtcbiAgcmV0dXJuIHRoaXMucmdiKCkuZm9ybWF0SGV4KCk7XG59XG5cbmZ1bmN0aW9uIGNvbG9yX2Zvcm1hdEhzbCgpIHtcbiAgcmV0dXJuIGhzbENvbnZlcnQodGhpcykuZm9ybWF0SHNsKCk7XG59XG5cbmZ1bmN0aW9uIGNvbG9yX2Zvcm1hdFJnYigpIHtcbiAgcmV0dXJuIHRoaXMucmdiKCkuZm9ybWF0UmdiKCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNvbG9yKGZvcm1hdCkge1xuICB2YXIgbSwgbDtcbiAgZm9ybWF0ID0gKGZvcm1hdCArIFwiXCIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICByZXR1cm4gKG0gPSByZUhleC5leGVjKGZvcm1hdCkpID8gKGwgPSBtWzFdLmxlbmd0aCwgbSA9IHBhcnNlSW50KG1bMV0sIDE2KSwgbCA9PT0gNiA/IHJnYm4obSkgLy8gI2ZmMDAwMFxuICAgICAgOiBsID09PSAzID8gbmV3IFJnYigobSA+PiA4ICYgMHhmKSB8IChtID4+IDQgJiAweGYwKSwgKG0gPj4gNCAmIDB4ZikgfCAobSAmIDB4ZjApLCAoKG0gJiAweGYpIDw8IDQpIHwgKG0gJiAweGYpLCAxKSAvLyAjZjAwXG4gICAgICA6IGwgPT09IDggPyByZ2JhKG0gPj4gMjQgJiAweGZmLCBtID4+IDE2ICYgMHhmZiwgbSA+PiA4ICYgMHhmZiwgKG0gJiAweGZmKSAvIDB4ZmYpIC8vICNmZjAwMDAwMFxuICAgICAgOiBsID09PSA0ID8gcmdiYSgobSA+PiAxMiAmIDB4ZikgfCAobSA+PiA4ICYgMHhmMCksIChtID4+IDggJiAweGYpIHwgKG0gPj4gNCAmIDB4ZjApLCAobSA+PiA0ICYgMHhmKSB8IChtICYgMHhmMCksICgoKG0gJiAweGYpIDw8IDQpIHwgKG0gJiAweGYpKSAvIDB4ZmYpIC8vICNmMDAwXG4gICAgICA6IG51bGwpIC8vIGludmFsaWQgaGV4XG4gICAgICA6IChtID0gcmVSZ2JJbnRlZ2VyLmV4ZWMoZm9ybWF0KSkgPyBuZXcgUmdiKG1bMV0sIG1bMl0sIG1bM10sIDEpIC8vIHJnYigyNTUsIDAsIDApXG4gICAgICA6IChtID0gcmVSZ2JQZXJjZW50LmV4ZWMoZm9ybWF0KSkgPyBuZXcgUmdiKG1bMV0gKiAyNTUgLyAxMDAsIG1bMl0gKiAyNTUgLyAxMDAsIG1bM10gKiAyNTUgLyAxMDAsIDEpIC8vIHJnYigxMDAlLCAwJSwgMCUpXG4gICAgICA6IChtID0gcmVSZ2JhSW50ZWdlci5leGVjKGZvcm1hdCkpID8gcmdiYShtWzFdLCBtWzJdLCBtWzNdLCBtWzRdKSAvLyByZ2JhKDI1NSwgMCwgMCwgMSlcbiAgICAgIDogKG0gPSByZVJnYmFQZXJjZW50LmV4ZWMoZm9ybWF0KSkgPyByZ2JhKG1bMV0gKiAyNTUgLyAxMDAsIG1bMl0gKiAyNTUgLyAxMDAsIG1bM10gKiAyNTUgLyAxMDAsIG1bNF0pIC8vIHJnYigxMDAlLCAwJSwgMCUsIDEpXG4gICAgICA6IChtID0gcmVIc2xQZXJjZW50LmV4ZWMoZm9ybWF0KSkgPyBoc2xhKG1bMV0sIG1bMl0gLyAxMDAsIG1bM10gLyAxMDAsIDEpIC8vIGhzbCgxMjAsIDUwJSwgNTAlKVxuICAgICAgOiAobSA9IHJlSHNsYVBlcmNlbnQuZXhlYyhmb3JtYXQpKSA/IGhzbGEobVsxXSwgbVsyXSAvIDEwMCwgbVszXSAvIDEwMCwgbVs0XSkgLy8gaHNsYSgxMjAsIDUwJSwgNTAlLCAxKVxuICAgICAgOiBuYW1lZC5oYXNPd25Qcm9wZXJ0eShmb3JtYXQpID8gcmdibihuYW1lZFtmb3JtYXRdKSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xuICAgICAgOiBmb3JtYXQgPT09IFwidHJhbnNwYXJlbnRcIiA/IG5ldyBSZ2IoTmFOLCBOYU4sIE5hTiwgMClcbiAgICAgIDogbnVsbDtcbn1cblxuZnVuY3Rpb24gcmdibihuKSB7XG4gIHJldHVybiBuZXcgUmdiKG4gPj4gMTYgJiAweGZmLCBuID4+IDggJiAweGZmLCBuICYgMHhmZiwgMSk7XG59XG5cbmZ1bmN0aW9uIHJnYmEociwgZywgYiwgYSkge1xuICBpZiAoYSA8PSAwKSByID0gZyA9IGIgPSBOYU47XG4gIHJldHVybiBuZXcgUmdiKHIsIGcsIGIsIGEpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmdiQ29udmVydChvKSB7XG4gIGlmICghKG8gaW5zdGFuY2VvZiBDb2xvcikpIG8gPSBjb2xvcihvKTtcbiAgaWYgKCFvKSByZXR1cm4gbmV3IFJnYjtcbiAgbyA9IG8ucmdiKCk7XG4gIHJldHVybiBuZXcgUmdiKG8uciwgby5nLCBvLmIsIG8ub3BhY2l0eSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZ2IociwgZywgYiwgb3BhY2l0eSkge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/IHJnYkNvbnZlcnQocikgOiBuZXcgUmdiKHIsIGcsIGIsIG9wYWNpdHkgPT0gbnVsbCA/IDEgOiBvcGFjaXR5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFJnYihyLCBnLCBiLCBvcGFjaXR5KSB7XG4gIHRoaXMuciA9ICtyO1xuICB0aGlzLmcgPSArZztcbiAgdGhpcy5iID0gK2I7XG4gIHRoaXMub3BhY2l0eSA9ICtvcGFjaXR5O1xufVxuXG5kZWZpbmUoUmdiLCByZ2IsIGV4dGVuZChDb2xvciwge1xuICBicmlnaHRlcjogZnVuY3Rpb24oaykge1xuICAgIGsgPSBrID09IG51bGwgPyBicmlnaHRlciA6IE1hdGgucG93KGJyaWdodGVyLCBrKTtcbiAgICByZXR1cm4gbmV3IFJnYih0aGlzLnIgKiBrLCB0aGlzLmcgKiBrLCB0aGlzLmIgKiBrLCB0aGlzLm9wYWNpdHkpO1xuICB9LFxuICBkYXJrZXI6IGZ1bmN0aW9uKGspIHtcbiAgICBrID0gayA9PSBudWxsID8gZGFya2VyIDogTWF0aC5wb3coZGFya2VyLCBrKTtcbiAgICByZXR1cm4gbmV3IFJnYih0aGlzLnIgKiBrLCB0aGlzLmcgKiBrLCB0aGlzLmIgKiBrLCB0aGlzLm9wYWNpdHkpO1xuICB9LFxuICByZ2I6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBkaXNwbGF5YWJsZTogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuICgtMC41IDw9IHRoaXMuciAmJiB0aGlzLnIgPCAyNTUuNSlcbiAgICAgICAgJiYgKC0wLjUgPD0gdGhpcy5nICYmIHRoaXMuZyA8IDI1NS41KVxuICAgICAgICAmJiAoLTAuNSA8PSB0aGlzLmIgJiYgdGhpcy5iIDwgMjU1LjUpXG4gICAgICAgICYmICgwIDw9IHRoaXMub3BhY2l0eSAmJiB0aGlzLm9wYWNpdHkgPD0gMSk7XG4gIH0sXG4gIGhleDogcmdiX2Zvcm1hdEhleCwgLy8gRGVwcmVjYXRlZCEgVXNlIGNvbG9yLmZvcm1hdEhleC5cbiAgZm9ybWF0SGV4OiByZ2JfZm9ybWF0SGV4LFxuICBmb3JtYXRSZ2I6IHJnYl9mb3JtYXRSZ2IsXG4gIHRvU3RyaW5nOiByZ2JfZm9ybWF0UmdiXG59KSk7XG5cbmZ1bmN0aW9uIHJnYl9mb3JtYXRIZXgoKSB7XG4gIHJldHVybiBcIiNcIiArIGhleCh0aGlzLnIpICsgaGV4KHRoaXMuZykgKyBoZXgodGhpcy5iKTtcbn1cblxuZnVuY3Rpb24gcmdiX2Zvcm1hdFJnYigpIHtcbiAgdmFyIGEgPSB0aGlzLm9wYWNpdHk7IGEgPSBpc05hTihhKSA/IDEgOiBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCBhKSk7XG4gIHJldHVybiAoYSA9PT0gMSA/IFwicmdiKFwiIDogXCJyZ2JhKFwiKVxuICAgICAgKyBNYXRoLm1heCgwLCBNYXRoLm1pbigyNTUsIE1hdGgucm91bmQodGhpcy5yKSB8fCAwKSkgKyBcIiwgXCJcbiAgICAgICsgTWF0aC5tYXgoMCwgTWF0aC5taW4oMjU1LCBNYXRoLnJvdW5kKHRoaXMuZykgfHwgMCkpICsgXCIsIFwiXG4gICAgICArIE1hdGgubWF4KDAsIE1hdGgubWluKDI1NSwgTWF0aC5yb3VuZCh0aGlzLmIpIHx8IDApKVxuICAgICAgKyAoYSA9PT0gMSA/IFwiKVwiIDogXCIsIFwiICsgYSArIFwiKVwiKTtcbn1cblxuZnVuY3Rpb24gaGV4KHZhbHVlKSB7XG4gIHZhbHVlID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMjU1LCBNYXRoLnJvdW5kKHZhbHVlKSB8fCAwKSk7XG4gIHJldHVybiAodmFsdWUgPCAxNiA/IFwiMFwiIDogXCJcIikgKyB2YWx1ZS50b1N0cmluZygxNik7XG59XG5cbmZ1bmN0aW9uIGhzbGEoaCwgcywgbCwgYSkge1xuICBpZiAoYSA8PSAwKSBoID0gcyA9IGwgPSBOYU47XG4gIGVsc2UgaWYgKGwgPD0gMCB8fCBsID49IDEpIGggPSBzID0gTmFOO1xuICBlbHNlIGlmIChzIDw9IDApIGggPSBOYU47XG4gIHJldHVybiBuZXcgSHNsKGgsIHMsIGwsIGEpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaHNsQ29udmVydChvKSB7XG4gIGlmIChvIGluc3RhbmNlb2YgSHNsKSByZXR1cm4gbmV3IEhzbChvLmgsIG8ucywgby5sLCBvLm9wYWNpdHkpO1xuICBpZiAoIShvIGluc3RhbmNlb2YgQ29sb3IpKSBvID0gY29sb3Iobyk7XG4gIGlmICghbykgcmV0dXJuIG5ldyBIc2w7XG4gIGlmIChvIGluc3RhbmNlb2YgSHNsKSByZXR1cm4gbztcbiAgbyA9IG8ucmdiKCk7XG4gIHZhciByID0gby5yIC8gMjU1LFxuICAgICAgZyA9IG8uZyAvIDI1NSxcbiAgICAgIGIgPSBvLmIgLyAyNTUsXG4gICAgICBtaW4gPSBNYXRoLm1pbihyLCBnLCBiKSxcbiAgICAgIG1heCA9IE1hdGgubWF4KHIsIGcsIGIpLFxuICAgICAgaCA9IE5hTixcbiAgICAgIHMgPSBtYXggLSBtaW4sXG4gICAgICBsID0gKG1heCArIG1pbikgLyAyO1xuICBpZiAocykge1xuICAgIGlmIChyID09PSBtYXgpIGggPSAoZyAtIGIpIC8gcyArIChnIDwgYikgKiA2O1xuICAgIGVsc2UgaWYgKGcgPT09IG1heCkgaCA9IChiIC0gcikgLyBzICsgMjtcbiAgICBlbHNlIGggPSAociAtIGcpIC8gcyArIDQ7XG4gICAgcyAvPSBsIDwgMC41ID8gbWF4ICsgbWluIDogMiAtIG1heCAtIG1pbjtcbiAgICBoICo9IDYwO1xuICB9IGVsc2Uge1xuICAgIHMgPSBsID4gMCAmJiBsIDwgMSA/IDAgOiBoO1xuICB9XG4gIHJldHVybiBuZXcgSHNsKGgsIHMsIGwsIG8ub3BhY2l0eSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoc2woaCwgcywgbCwgb3BhY2l0eSkge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/IGhzbENvbnZlcnQoaCkgOiBuZXcgSHNsKGgsIHMsIGwsIG9wYWNpdHkgPT0gbnVsbCA/IDEgOiBvcGFjaXR5KTtcbn1cblxuZnVuY3Rpb24gSHNsKGgsIHMsIGwsIG9wYWNpdHkpIHtcbiAgdGhpcy5oID0gK2g7XG4gIHRoaXMucyA9ICtzO1xuICB0aGlzLmwgPSArbDtcbiAgdGhpcy5vcGFjaXR5ID0gK29wYWNpdHk7XG59XG5cbmRlZmluZShIc2wsIGhzbCwgZXh0ZW5kKENvbG9yLCB7XG4gIGJyaWdodGVyOiBmdW5jdGlvbihrKSB7XG4gICAgayA9IGsgPT0gbnVsbCA/IGJyaWdodGVyIDogTWF0aC5wb3coYnJpZ2h0ZXIsIGspO1xuICAgIHJldHVybiBuZXcgSHNsKHRoaXMuaCwgdGhpcy5zLCB0aGlzLmwgKiBrLCB0aGlzLm9wYWNpdHkpO1xuICB9LFxuICBkYXJrZXI6IGZ1bmN0aW9uKGspIHtcbiAgICBrID0gayA9PSBudWxsID8gZGFya2VyIDogTWF0aC5wb3coZGFya2VyLCBrKTtcbiAgICByZXR1cm4gbmV3IEhzbCh0aGlzLmgsIHRoaXMucywgdGhpcy5sICogaywgdGhpcy5vcGFjaXR5KTtcbiAgfSxcbiAgcmdiOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgaCA9IHRoaXMuaCAlIDM2MCArICh0aGlzLmggPCAwKSAqIDM2MCxcbiAgICAgICAgcyA9IGlzTmFOKGgpIHx8IGlzTmFOKHRoaXMucykgPyAwIDogdGhpcy5zLFxuICAgICAgICBsID0gdGhpcy5sLFxuICAgICAgICBtMiA9IGwgKyAobCA8IDAuNSA/IGwgOiAxIC0gbCkgKiBzLFxuICAgICAgICBtMSA9IDIgKiBsIC0gbTI7XG4gICAgcmV0dXJuIG5ldyBSZ2IoXG4gICAgICBoc2wycmdiKGggPj0gMjQwID8gaCAtIDI0MCA6IGggKyAxMjAsIG0xLCBtMiksXG4gICAgICBoc2wycmdiKGgsIG0xLCBtMiksXG4gICAgICBoc2wycmdiKGggPCAxMjAgPyBoICsgMjQwIDogaCAtIDEyMCwgbTEsIG0yKSxcbiAgICAgIHRoaXMub3BhY2l0eVxuICAgICk7XG4gIH0sXG4gIGRpc3BsYXlhYmxlOiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gKDAgPD0gdGhpcy5zICYmIHRoaXMucyA8PSAxIHx8IGlzTmFOKHRoaXMucykpXG4gICAgICAgICYmICgwIDw9IHRoaXMubCAmJiB0aGlzLmwgPD0gMSlcbiAgICAgICAgJiYgKDAgPD0gdGhpcy5vcGFjaXR5ICYmIHRoaXMub3BhY2l0eSA8PSAxKTtcbiAgfSxcbiAgZm9ybWF0SHNsOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgYSA9IHRoaXMub3BhY2l0eTsgYSA9IGlzTmFOKGEpID8gMSA6IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIGEpKTtcbiAgICByZXR1cm4gKGEgPT09IDEgPyBcImhzbChcIiA6IFwiaHNsYShcIilcbiAgICAgICAgKyAodGhpcy5oIHx8IDApICsgXCIsIFwiXG4gICAgICAgICsgKHRoaXMucyB8fCAwKSAqIDEwMCArIFwiJSwgXCJcbiAgICAgICAgKyAodGhpcy5sIHx8IDApICogMTAwICsgXCIlXCJcbiAgICAgICAgKyAoYSA9PT0gMSA/IFwiKVwiIDogXCIsIFwiICsgYSArIFwiKVwiKTtcbiAgfVxufSkpO1xuXG4vKiBGcm9tIEZ2RCAxMy4zNywgQ1NTIENvbG9yIE1vZHVsZSBMZXZlbCAzICovXG5mdW5jdGlvbiBoc2wycmdiKGgsIG0xLCBtMikge1xuICByZXR1cm4gKGggPCA2MCA/IG0xICsgKG0yIC0gbTEpICogaCAvIDYwXG4gICAgICA6IGggPCAxODAgPyBtMlxuICAgICAgOiBoIDwgMjQwID8gbTEgKyAobTIgLSBtMSkgKiAoMjQwIC0gaCkgLyA2MFxuICAgICAgOiBtMSkgKiAyNTU7XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gYmFzaXModDEsIHYwLCB2MSwgdjIsIHYzKSB7XG4gIHZhciB0MiA9IHQxICogdDEsIHQzID0gdDIgKiB0MTtcbiAgcmV0dXJuICgoMSAtIDMgKiB0MSArIDMgKiB0MiAtIHQzKSAqIHYwXG4gICAgICArICg0IC0gNiAqIHQyICsgMyAqIHQzKSAqIHYxXG4gICAgICArICgxICsgMyAqIHQxICsgMyAqIHQyIC0gMyAqIHQzKSAqIHYyXG4gICAgICArIHQzICogdjMpIC8gNjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWVzKSB7XG4gIHZhciBuID0gdmFsdWVzLmxlbmd0aCAtIDE7XG4gIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgdmFyIGkgPSB0IDw9IDAgPyAodCA9IDApIDogdCA+PSAxID8gKHQgPSAxLCBuIC0gMSkgOiBNYXRoLmZsb29yKHQgKiBuKSxcbiAgICAgICAgdjEgPSB2YWx1ZXNbaV0sXG4gICAgICAgIHYyID0gdmFsdWVzW2kgKyAxXSxcbiAgICAgICAgdjAgPSBpID4gMCA/IHZhbHVlc1tpIC0gMV0gOiAyICogdjEgLSB2MixcbiAgICAgICAgdjMgPSBpIDwgbiAtIDEgPyB2YWx1ZXNbaSArIDJdIDogMiAqIHYyIC0gdjE7XG4gICAgcmV0dXJuIGJhc2lzKCh0IC0gaSAvIG4pICogbiwgdjAsIHYxLCB2MiwgdjMpO1xuICB9O1xufVxuIiwiaW1wb3J0IHtiYXNpc30gZnJvbSBcIi4vYmFzaXMuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWVzKSB7XG4gIHZhciBuID0gdmFsdWVzLmxlbmd0aDtcbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICB2YXIgaSA9IE1hdGguZmxvb3IoKCh0ICU9IDEpIDwgMCA/ICsrdCA6IHQpICogbiksXG4gICAgICAgIHYwID0gdmFsdWVzWyhpICsgbiAtIDEpICUgbl0sXG4gICAgICAgIHYxID0gdmFsdWVzW2kgJSBuXSxcbiAgICAgICAgdjIgPSB2YWx1ZXNbKGkgKyAxKSAlIG5dLFxuICAgICAgICB2MyA9IHZhbHVlc1soaSArIDIpICUgbl07XG4gICAgcmV0dXJuIGJhc2lzKCh0IC0gaSAvIG4pICogbiwgdjAsIHYxLCB2MiwgdjMpO1xuICB9O1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oeCkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHg7XG4gIH07XG59XG4iLCJpbXBvcnQgY29uc3RhbnQgZnJvbSBcIi4vY29uc3RhbnQuanNcIjtcblxuZnVuY3Rpb24gbGluZWFyKGEsIGQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICByZXR1cm4gYSArIHQgKiBkO1xuICB9O1xufVxuXG5mdW5jdGlvbiBleHBvbmVudGlhbChhLCBiLCB5KSB7XG4gIHJldHVybiBhID0gTWF0aC5wb3coYSwgeSksIGIgPSBNYXRoLnBvdyhiLCB5KSAtIGEsIHkgPSAxIC8geSwgZnVuY3Rpb24odCkge1xuICAgIHJldHVybiBNYXRoLnBvdyhhICsgdCAqIGIsIHkpO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaHVlKGEsIGIpIHtcbiAgdmFyIGQgPSBiIC0gYTtcbiAgcmV0dXJuIGQgPyBsaW5lYXIoYSwgZCA+IDE4MCB8fCBkIDwgLTE4MCA/IGQgLSAzNjAgKiBNYXRoLnJvdW5kKGQgLyAzNjApIDogZCkgOiBjb25zdGFudChpc05hTihhKSA/IGIgOiBhKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdhbW1hKHkpIHtcbiAgcmV0dXJuICh5ID0gK3kpID09PSAxID8gbm9nYW1tYSA6IGZ1bmN0aW9uKGEsIGIpIHtcbiAgICByZXR1cm4gYiAtIGEgPyBleHBvbmVudGlhbChhLCBiLCB5KSA6IGNvbnN0YW50KGlzTmFOKGEpID8gYiA6IGEpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBub2dhbW1hKGEsIGIpIHtcbiAgdmFyIGQgPSBiIC0gYTtcbiAgcmV0dXJuIGQgPyBsaW5lYXIoYSwgZCkgOiBjb25zdGFudChpc05hTihhKSA/IGIgOiBhKTtcbn1cbiIsImltcG9ydCB7cmdiIGFzIGNvbG9yUmdifSBmcm9tIFwiZDMtY29sb3JcIjtcbmltcG9ydCBiYXNpcyBmcm9tIFwiLi9iYXNpcy5qc1wiO1xuaW1wb3J0IGJhc2lzQ2xvc2VkIGZyb20gXCIuL2Jhc2lzQ2xvc2VkLmpzXCI7XG5pbXBvcnQgbm9nYW1tYSwge2dhbW1hfSBmcm9tIFwiLi9jb2xvci5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCAoZnVuY3Rpb24gcmdiR2FtbWEoeSkge1xuICB2YXIgY29sb3IgPSBnYW1tYSh5KTtcblxuICBmdW5jdGlvbiByZ2Ioc3RhcnQsIGVuZCkge1xuICAgIHZhciByID0gY29sb3IoKHN0YXJ0ID0gY29sb3JSZ2Ioc3RhcnQpKS5yLCAoZW5kID0gY29sb3JSZ2IoZW5kKSkuciksXG4gICAgICAgIGcgPSBjb2xvcihzdGFydC5nLCBlbmQuZyksXG4gICAgICAgIGIgPSBjb2xvcihzdGFydC5iLCBlbmQuYiksXG4gICAgICAgIG9wYWNpdHkgPSBub2dhbW1hKHN0YXJ0Lm9wYWNpdHksIGVuZC5vcGFjaXR5KTtcbiAgICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgICAgc3RhcnQuciA9IHIodCk7XG4gICAgICBzdGFydC5nID0gZyh0KTtcbiAgICAgIHN0YXJ0LmIgPSBiKHQpO1xuICAgICAgc3RhcnQub3BhY2l0eSA9IG9wYWNpdHkodCk7XG4gICAgICByZXR1cm4gc3RhcnQgKyBcIlwiO1xuICAgIH07XG4gIH1cblxuICByZ2IuZ2FtbWEgPSByZ2JHYW1tYTtcblxuICByZXR1cm4gcmdiO1xufSkoMSk7XG5cbmZ1bmN0aW9uIHJnYlNwbGluZShzcGxpbmUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKGNvbG9ycykge1xuICAgIHZhciBuID0gY29sb3JzLmxlbmd0aCxcbiAgICAgICAgciA9IG5ldyBBcnJheShuKSxcbiAgICAgICAgZyA9IG5ldyBBcnJheShuKSxcbiAgICAgICAgYiA9IG5ldyBBcnJheShuKSxcbiAgICAgICAgaSwgY29sb3I7XG4gICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgY29sb3IgPSBjb2xvclJnYihjb2xvcnNbaV0pO1xuICAgICAgcltpXSA9IGNvbG9yLnIgfHwgMDtcbiAgICAgIGdbaV0gPSBjb2xvci5nIHx8IDA7XG4gICAgICBiW2ldID0gY29sb3IuYiB8fCAwO1xuICAgIH1cbiAgICByID0gc3BsaW5lKHIpO1xuICAgIGcgPSBzcGxpbmUoZyk7XG4gICAgYiA9IHNwbGluZShiKTtcbiAgICBjb2xvci5vcGFjaXR5ID0gMTtcbiAgICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgICAgY29sb3IuciA9IHIodCk7XG4gICAgICBjb2xvci5nID0gZyh0KTtcbiAgICAgIGNvbG9yLmIgPSBiKHQpO1xuICAgICAgcmV0dXJuIGNvbG9yICsgXCJcIjtcbiAgICB9O1xuICB9O1xufVxuXG5leHBvcnQgdmFyIHJnYkJhc2lzID0gcmdiU3BsaW5lKGJhc2lzKTtcbmV4cG9ydCB2YXIgcmdiQmFzaXNDbG9zZWQgPSByZ2JTcGxpbmUoYmFzaXNDbG9zZWQpO1xuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oYSwgYikge1xuICBpZiAoIWIpIGIgPSBbXTtcbiAgdmFyIG4gPSBhID8gTWF0aC5taW4oYi5sZW5ndGgsIGEubGVuZ3RoKSA6IDAsXG4gICAgICBjID0gYi5zbGljZSgpLFxuICAgICAgaTtcbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSBjW2ldID0gYVtpXSAqICgxIC0gdCkgKyBiW2ldICogdDtcbiAgICByZXR1cm4gYztcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzTnVtYmVyQXJyYXkoeCkge1xuICByZXR1cm4gQXJyYXlCdWZmZXIuaXNWaWV3KHgpICYmICEoeCBpbnN0YW5jZW9mIERhdGFWaWV3KTtcbn1cbiIsImltcG9ydCB2YWx1ZSBmcm9tIFwiLi92YWx1ZS5qc1wiO1xuaW1wb3J0IG51bWJlckFycmF5LCB7aXNOdW1iZXJBcnJheX0gZnJvbSBcIi4vbnVtYmVyQXJyYXkuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oYSwgYikge1xuICByZXR1cm4gKGlzTnVtYmVyQXJyYXkoYikgPyBudW1iZXJBcnJheSA6IGdlbmVyaWNBcnJheSkoYSwgYik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmljQXJyYXkoYSwgYikge1xuICB2YXIgbmIgPSBiID8gYi5sZW5ndGggOiAwLFxuICAgICAgbmEgPSBhID8gTWF0aC5taW4obmIsIGEubGVuZ3RoKSA6IDAsXG4gICAgICB4ID0gbmV3IEFycmF5KG5hKSxcbiAgICAgIGMgPSBuZXcgQXJyYXkobmIpLFxuICAgICAgaTtcblxuICBmb3IgKGkgPSAwOyBpIDwgbmE7ICsraSkgeFtpXSA9IHZhbHVlKGFbaV0sIGJbaV0pO1xuICBmb3IgKDsgaSA8IG5iOyArK2kpIGNbaV0gPSBiW2ldO1xuXG4gIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgZm9yIChpID0gMDsgaSA8IG5hOyArK2kpIGNbaV0gPSB4W2ldKHQpO1xuICAgIHJldHVybiBjO1xuICB9O1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oYSwgYikge1xuICB2YXIgZCA9IG5ldyBEYXRlO1xuICByZXR1cm4gYSA9ICthLCBiID0gK2IsIGZ1bmN0aW9uKHQpIHtcbiAgICByZXR1cm4gZC5zZXRUaW1lKGEgKiAoMSAtIHQpICsgYiAqIHQpLCBkO1xuICB9O1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oYSwgYikge1xuICByZXR1cm4gYSA9ICthLCBiID0gK2IsIGZ1bmN0aW9uKHQpIHtcbiAgICByZXR1cm4gYSAqICgxIC0gdCkgKyBiICogdDtcbiAgfTtcbn1cbiIsImltcG9ydCB2YWx1ZSBmcm9tIFwiLi92YWx1ZS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihhLCBiKSB7XG4gIHZhciBpID0ge30sXG4gICAgICBjID0ge30sXG4gICAgICBrO1xuXG4gIGlmIChhID09PSBudWxsIHx8IHR5cGVvZiBhICE9PSBcIm9iamVjdFwiKSBhID0ge307XG4gIGlmIChiID09PSBudWxsIHx8IHR5cGVvZiBiICE9PSBcIm9iamVjdFwiKSBiID0ge307XG5cbiAgZm9yIChrIGluIGIpIHtcbiAgICBpZiAoayBpbiBhKSB7XG4gICAgICBpW2tdID0gdmFsdWUoYVtrXSwgYltrXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNba10gPSBiW2tdO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgZm9yIChrIGluIGkpIGNba10gPSBpW2tdKHQpO1xuICAgIHJldHVybiBjO1xuICB9O1xufVxuIiwiaW1wb3J0IG51bWJlciBmcm9tIFwiLi9udW1iZXIuanNcIjtcblxudmFyIHJlQSA9IC9bLStdPyg/OlxcZCtcXC4/XFxkKnxcXC4/XFxkKykoPzpbZUVdWy0rXT9cXGQrKT8vZyxcbiAgICByZUIgPSBuZXcgUmVnRXhwKHJlQS5zb3VyY2UsIFwiZ1wiKTtcblxuZnVuY3Rpb24gemVybyhiKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gYjtcbiAgfTtcbn1cblxuZnVuY3Rpb24gb25lKGIpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICByZXR1cm4gYih0KSArIFwiXCI7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGEsIGIpIHtcbiAgdmFyIGJpID0gcmVBLmxhc3RJbmRleCA9IHJlQi5sYXN0SW5kZXggPSAwLCAvLyBzY2FuIGluZGV4IGZvciBuZXh0IG51bWJlciBpbiBiXG4gICAgICBhbSwgLy8gY3VycmVudCBtYXRjaCBpbiBhXG4gICAgICBibSwgLy8gY3VycmVudCBtYXRjaCBpbiBiXG4gICAgICBicywgLy8gc3RyaW5nIHByZWNlZGluZyBjdXJyZW50IG51bWJlciBpbiBiLCBpZiBhbnlcbiAgICAgIGkgPSAtMSwgLy8gaW5kZXggaW4gc1xuICAgICAgcyA9IFtdLCAvLyBzdHJpbmcgY29uc3RhbnRzIGFuZCBwbGFjZWhvbGRlcnNcbiAgICAgIHEgPSBbXTsgLy8gbnVtYmVyIGludGVycG9sYXRvcnNcblxuICAvLyBDb2VyY2UgaW5wdXRzIHRvIHN0cmluZ3MuXG4gIGEgPSBhICsgXCJcIiwgYiA9IGIgKyBcIlwiO1xuXG4gIC8vIEludGVycG9sYXRlIHBhaXJzIG9mIG51bWJlcnMgaW4gYSAmIGIuXG4gIHdoaWxlICgoYW0gPSByZUEuZXhlYyhhKSlcbiAgICAgICYmIChibSA9IHJlQi5leGVjKGIpKSkge1xuICAgIGlmICgoYnMgPSBibS5pbmRleCkgPiBiaSkgeyAvLyBhIHN0cmluZyBwcmVjZWRlcyB0aGUgbmV4dCBudW1iZXIgaW4gYlxuICAgICAgYnMgPSBiLnNsaWNlKGJpLCBicyk7XG4gICAgICBpZiAoc1tpXSkgc1tpXSArPSBiczsgLy8gY29hbGVzY2Ugd2l0aCBwcmV2aW91cyBzdHJpbmdcbiAgICAgIGVsc2Ugc1srK2ldID0gYnM7XG4gICAgfVxuICAgIGlmICgoYW0gPSBhbVswXSkgPT09IChibSA9IGJtWzBdKSkgeyAvLyBudW1iZXJzIGluIGEgJiBiIG1hdGNoXG4gICAgICBpZiAoc1tpXSkgc1tpXSArPSBibTsgLy8gY29hbGVzY2Ugd2l0aCBwcmV2aW91cyBzdHJpbmdcbiAgICAgIGVsc2Ugc1srK2ldID0gYm07XG4gICAgfSBlbHNlIHsgLy8gaW50ZXJwb2xhdGUgbm9uLW1hdGNoaW5nIG51bWJlcnNcbiAgICAgIHNbKytpXSA9IG51bGw7XG4gICAgICBxLnB1c2goe2k6IGksIHg6IG51bWJlcihhbSwgYm0pfSk7XG4gICAgfVxuICAgIGJpID0gcmVCLmxhc3RJbmRleDtcbiAgfVxuXG4gIC8vIEFkZCByZW1haW5zIG9mIGIuXG4gIGlmIChiaSA8IGIubGVuZ3RoKSB7XG4gICAgYnMgPSBiLnNsaWNlKGJpKTtcbiAgICBpZiAoc1tpXSkgc1tpXSArPSBiczsgLy8gY29hbGVzY2Ugd2l0aCBwcmV2aW91cyBzdHJpbmdcbiAgICBlbHNlIHNbKytpXSA9IGJzO1xuICB9XG5cbiAgLy8gU3BlY2lhbCBvcHRpbWl6YXRpb24gZm9yIG9ubHkgYSBzaW5nbGUgbWF0Y2guXG4gIC8vIE90aGVyd2lzZSwgaW50ZXJwb2xhdGUgZWFjaCBvZiB0aGUgbnVtYmVycyBhbmQgcmVqb2luIHRoZSBzdHJpbmcuXG4gIHJldHVybiBzLmxlbmd0aCA8IDIgPyAocVswXVxuICAgICAgPyBvbmUocVswXS54KVxuICAgICAgOiB6ZXJvKGIpKVxuICAgICAgOiAoYiA9IHEubGVuZ3RoLCBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDAsIG87IGkgPCBiOyArK2kpIHNbKG8gPSBxW2ldKS5pXSA9IG8ueCh0KTtcbiAgICAgICAgICByZXR1cm4gcy5qb2luKFwiXCIpO1xuICAgICAgICB9KTtcbn1cbiIsImltcG9ydCB7Y29sb3J9IGZyb20gXCJkMy1jb2xvclwiO1xuaW1wb3J0IHJnYiBmcm9tIFwiLi9yZ2IuanNcIjtcbmltcG9ydCB7Z2VuZXJpY0FycmF5fSBmcm9tIFwiLi9hcnJheS5qc1wiO1xuaW1wb3J0IGRhdGUgZnJvbSBcIi4vZGF0ZS5qc1wiO1xuaW1wb3J0IG51bWJlciBmcm9tIFwiLi9udW1iZXIuanNcIjtcbmltcG9ydCBvYmplY3QgZnJvbSBcIi4vb2JqZWN0LmpzXCI7XG5pbXBvcnQgc3RyaW5nIGZyb20gXCIuL3N0cmluZy5qc1wiO1xuaW1wb3J0IGNvbnN0YW50IGZyb20gXCIuL2NvbnN0YW50LmpzXCI7XG5pbXBvcnQgbnVtYmVyQXJyYXksIHtpc051bWJlckFycmF5fSBmcm9tIFwiLi9udW1iZXJBcnJheS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihhLCBiKSB7XG4gIHZhciB0ID0gdHlwZW9mIGIsIGM7XG4gIHJldHVybiBiID09IG51bGwgfHwgdCA9PT0gXCJib29sZWFuXCIgPyBjb25zdGFudChiKVxuICAgICAgOiAodCA9PT0gXCJudW1iZXJcIiA/IG51bWJlclxuICAgICAgOiB0ID09PSBcInN0cmluZ1wiID8gKChjID0gY29sb3IoYikpID8gKGIgPSBjLCByZ2IpIDogc3RyaW5nKVxuICAgICAgOiBiIGluc3RhbmNlb2YgY29sb3IgPyByZ2JcbiAgICAgIDogYiBpbnN0YW5jZW9mIERhdGUgPyBkYXRlXG4gICAgICA6IGlzTnVtYmVyQXJyYXkoYikgPyBudW1iZXJBcnJheVxuICAgICAgOiBBcnJheS5pc0FycmF5KGIpID8gZ2VuZXJpY0FycmF5XG4gICAgICA6IHR5cGVvZiBiLnZhbHVlT2YgIT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgYi50b1N0cmluZyAhPT0gXCJmdW5jdGlvblwiIHx8IGlzTmFOKGIpID8gb2JqZWN0XG4gICAgICA6IG51bWJlcikoYSwgYik7XG59XG4iLCJleHBvcnQgdmFyIGlzQ29sb3JQcm9wID0gZnVuY3Rpb24gKHByb3ApIHsgcmV0dXJuIFsnZmlsbCcsICdzdHJva2UnLCAnZmlsbFN0eWxlJywgJ3N0cm9rZVN0eWxlJ10uaW5jbHVkZXMocHJvcCk7IH07XG5leHBvcnQgdmFyIGlzR3JhZGllbnRDb2xvciA9IGZ1bmN0aW9uICh2YWwpIHsgcmV0dXJuIC9eW3IsUixMLGxdezF9W1xcc10qXFwoLy50ZXN0KHZhbCk7IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb2xvci5qcy5tYXAiLCJpbXBvcnQgeyBpc0VxdWFsLCBpc051bWJlciwgaXNGdW5jdGlvbiB9IGZyb20gJ0BhbnR2L3V0aWwnO1xuaW1wb3J0ICogYXMgZDNUaW1lciBmcm9tICdkMy10aW1lcic7XG5pbXBvcnQgKiBhcyBkM0Vhc2UgZnJvbSAnZDMtZWFzZSc7XG5pbXBvcnQgeyBpbnRlcnBvbGF0ZSwgaW50ZXJwb2xhdGVBcnJheSB9IGZyb20gJ2QzLWludGVycG9sYXRlJzsgLy8g55uu5YmN5pW05L2T5Yqo55S75Y+q6ZyA6KaB5pWw5YC85ZKM5pWw57uE55qE5beu5YC86K6h566XXG5pbXBvcnQgKiBhcyBQYXRoVXRpbCBmcm9tICcuLi91dGlsL3BhdGgnO1xuaW1wb3J0IHsgaXNDb2xvclByb3AsIGlzR3JhZGllbnRDb2xvciB9IGZyb20gJy4uL3V0aWwvY29sb3InO1xudmFyIElERU5USVRZX01BVFJJWCA9IFsxLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAxXTtcbi8qKlxuICog5L2/55SoIHJhdGlvIOi/m+ihjOaPkuWAvOiuoeeul+adpeabtOaWsOWxnuaAp1xuICogQHBhcmFtIHtJRWxlbWVudH0gIHNoYXBlICAgIOWFg+e0oFxuICogQHBhcmFtIHtBbmltYXRpb259IGFuaW1hdGlvbiDliqjnlLtcbiAqIEBwYXJhbSB7bnVtYmVyfSAgICByYXRpbyAgICDmr5TkvotcbiAqIEByZXR1cm4ge2Jvb2xlYW59ICDliqjnlLvmmK/lkKbmiafooYzlrozmiJBcbiAqL1xuZnVuY3Rpb24gX3VwZGF0ZShzaGFwZSwgYW5pbWF0aW9uLCByYXRpbykge1xuICAgIHZhciBjUHJvcHMgPSB7fTsgLy8g5q2k5Yi75bGe5oCnXG4gICAgdmFyIGZyb21BdHRycyA9IGFuaW1hdGlvbi5mcm9tQXR0cnMsIHRvQXR0cnMgPSBhbmltYXRpb24udG9BdHRycztcbiAgICBpZiAoc2hhcGUuZGVzdHJveWVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIGludGVyZjsgLy8gIOW3ruWAvOWHveaVsFxuICAgIGZvciAodmFyIGsgaW4gdG9BdHRycykge1xuICAgICAgICBpZiAoIWlzRXF1YWwoZnJvbUF0dHJzW2tdLCB0b0F0dHJzW2tdKSkge1xuICAgICAgICAgICAgaWYgKGsgPT09ICdwYXRoJykge1xuICAgICAgICAgICAgICAgIHZhciB0b1BhdGggPSB0b0F0dHJzW2tdO1xuICAgICAgICAgICAgICAgIHZhciBmcm9tUGF0aCA9IGZyb21BdHRyc1trXTtcbiAgICAgICAgICAgICAgICBpZiAodG9QYXRoLmxlbmd0aCA+IGZyb21QYXRoLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICB0b1BhdGggPSBQYXRoVXRpbC5wYXJzZVBhdGhTdHJpbmcodG9BdHRyc1trXSk7IC8vIOe7iOeCueeKtuaAgVxuICAgICAgICAgICAgICAgICAgICBmcm9tUGF0aCA9IFBhdGhVdGlsLnBhcnNlUGF0aFN0cmluZyhmcm9tQXR0cnNba10pOyAvLyDotbflp4vnirbmgIFcbiAgICAgICAgICAgICAgICAgICAgZnJvbVBhdGggPSBQYXRoVXRpbC5maWxsUGF0aEJ5RGlmZihmcm9tUGF0aCwgdG9QYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgZnJvbVBhdGggPSBQYXRoVXRpbC5mb3JtYXRQYXRoKGZyb21QYXRoLCB0b1BhdGgpO1xuICAgICAgICAgICAgICAgICAgICBhbmltYXRpb24uZnJvbUF0dHJzLnBhdGggPSBmcm9tUGF0aDtcbiAgICAgICAgICAgICAgICAgICAgYW5pbWF0aW9uLnRvQXR0cnMucGF0aCA9IHRvUGF0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoIWFuaW1hdGlvbi5wYXRoRm9ybWF0dGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRvUGF0aCA9IFBhdGhVdGlsLnBhcnNlUGF0aFN0cmluZyh0b0F0dHJzW2tdKTtcbiAgICAgICAgICAgICAgICAgICAgZnJvbVBhdGggPSBQYXRoVXRpbC5wYXJzZVBhdGhTdHJpbmcoZnJvbUF0dHJzW2tdKTtcbiAgICAgICAgICAgICAgICAgICAgZnJvbVBhdGggPSBQYXRoVXRpbC5mb3JtYXRQYXRoKGZyb21QYXRoLCB0b1BhdGgpO1xuICAgICAgICAgICAgICAgICAgICBhbmltYXRpb24uZnJvbUF0dHJzLnBhdGggPSBmcm9tUGF0aDtcbiAgICAgICAgICAgICAgICAgICAgYW5pbWF0aW9uLnRvQXR0cnMucGF0aCA9IHRvUGF0aDtcbiAgICAgICAgICAgICAgICAgICAgYW5pbWF0aW9uLnBhdGhGb3JtYXR0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjUHJvcHNba10gPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRvUGF0aC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdG9QYXRoUG9pbnQgPSB0b1BhdGhbaV07XG4gICAgICAgICAgICAgICAgICAgIHZhciBmcm9tUGF0aFBvaW50ID0gZnJvbVBhdGhbaV07XG4gICAgICAgICAgICAgICAgICAgIHZhciBjUGF0aFBvaW50ID0gW107XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdG9QYXRoUG9pbnQubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc051bWJlcih0b1BhdGhQb2ludFtqXSkgJiYgZnJvbVBhdGhQb2ludCAmJiBpc051bWJlcihmcm9tUGF0aFBvaW50W2pdKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZiA9IGludGVycG9sYXRlKGZyb21QYXRoUG9pbnRbal0sIHRvUGF0aFBvaW50W2pdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjUGF0aFBvaW50LnB1c2goaW50ZXJmKHJhdGlvKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjUGF0aFBvaW50LnB1c2godG9QYXRoUG9pbnRbal0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNQcm9wc1trXS5wdXNoKGNQYXRoUG9pbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGsgPT09ICdtYXRyaXgnKSB7XG4gICAgICAgICAgICAgICAgLypcbiAgICAgICAgICAgICAgICAg5a+555+p6Zi16L+b6KGM5o+S5YC85pe277yM6ZyA6KaB5L+d6K+B55+p6Zi15LiN5Li656m677yM5Li656m65YiZ5L2/55So5Y2V5L2N55+p6Zi1XG4gICAgICAgICAgICAgICAgIFRPRE86IOS6jOe7tOWSjOS4iee7tOWcuuaZr+S4i+WNleS9jeefqemYteS4jeWQjO+8jOS5i+WQjiBXZWJHTCDniYjpnIDopoHlgZrov5vkuIDmraXlpITnkIZcbiAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICB2YXIgbWF0cml4Rm4gPSBpbnRlcnBvbGF0ZUFycmF5KGZyb21BdHRyc1trXSB8fCBJREVOVElUWV9NQVRSSVgsIHRvQXR0cnNba10gfHwgSURFTlRJVFlfTUFUUklYKTtcbiAgICAgICAgICAgICAgICB2YXIgY3VycmVudE1hdHJpeCA9IG1hdHJpeEZuKHJhdGlvKTtcbiAgICAgICAgICAgICAgICBjUHJvcHNba10gPSBjdXJyZW50TWF0cml4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaXNDb2xvclByb3AoaykgJiYgaXNHcmFkaWVudENvbG9yKHRvQXR0cnNba10pKSB7XG4gICAgICAgICAgICAgICAgY1Byb3BzW2tdID0gdG9BdHRyc1trXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKCFpc0Z1bmN0aW9uKHRvQXR0cnNba10pKSB7XG4gICAgICAgICAgICAgICAgLy8g6Z2e5Ye95pWw57G75Z6L55qE5YC85omN6IO95YGa5o+S5YC8XG4gICAgICAgICAgICAgICAgaW50ZXJmID0gaW50ZXJwb2xhdGUoZnJvbUF0dHJzW2tdLCB0b0F0dHJzW2tdKTtcbiAgICAgICAgICAgICAgICBjUHJvcHNba10gPSBpbnRlcmYocmF0aW8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHNoYXBlLmF0dHIoY1Byb3BzKTtcbn1cbi8qKlxuICog5qC55o2u6Ieq5a6a5LmJ5bin5Yqo55S75Ye95pWwIG9uRnJhbWUg5p2l5pu05paw5bGe5oCnXG4gKiBAcGFyYW0ge0lFbGVtZW50fSAgc2hhcGUgICAg5YWD57SgXG4gKiBAcGFyYW0ge0FuaW1hdGlvbn0gYW5pbWF0aW9uIOWKqOeUu1xuICogQHBhcmFtIHtudW1iZXJ9ICAgIGVsYXBzZWQgIOWKqOeUu+aJp+ihjOaXtumXtCjmr6vnp5IpXG4gKiBAcmV0dXJuIHtib29sZWFufSAg5Yqo55S75piv5ZCm5omn6KGM5a6M5oiQXG4gKi9cbmZ1bmN0aW9uIHVwZGF0ZShzaGFwZSwgYW5pbWF0aW9uLCBlbGFwc2VkKSB7XG4gICAgdmFyIHN0YXJ0VGltZSA9IGFuaW1hdGlvbi5zdGFydFRpbWUsIGRlbGF5ID0gYW5pbWF0aW9uLmRlbGF5O1xuICAgIC8vIOWmguaenOi/mOayoeacieW8gOWni+aJp+ihjOaIluaaguWBnO+8jOWFiOS4jeabtOaWsFxuICAgIGlmIChlbGFwc2VkIDwgc3RhcnRUaW1lICsgZGVsYXkgfHwgYW5pbWF0aW9uLl9wYXVzZWQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB2YXIgcmF0aW87XG4gICAgdmFyIGR1cmF0aW9uID0gYW5pbWF0aW9uLmR1cmF0aW9uO1xuICAgIHZhciBlYXNpbmcgPSBhbmltYXRpb24uZWFzaW5nO1xuICAgIC8vIOW3suaJp+ihjOaXtumXtFxuICAgIGVsYXBzZWQgPSBlbGFwc2VkIC0gc3RhcnRUaW1lIC0gYW5pbWF0aW9uLmRlbGF5O1xuICAgIGlmIChhbmltYXRpb24ucmVwZWF0KSB7XG4gICAgICAgIC8vIOWmguaenOWKqOeUu+mHjeWkjeaJp+ihjO+8jOWImSBlbGFwc2VkID4gZHVyYXRpb27vvIzorqHnrpcgcmF0aW8g5pe26ZyA5Y+W5qihXG4gICAgICAgIHJhdGlvID0gKGVsYXBzZWQgJSBkdXJhdGlvbikgLyBkdXJhdGlvbjtcbiAgICAgICAgcmF0aW8gPSBkM0Vhc2VbZWFzaW5nXShyYXRpbyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByYXRpbyA9IGVsYXBzZWQgLyBkdXJhdGlvbjtcbiAgICAgICAgaWYgKHJhdGlvIDwgMSkge1xuICAgICAgICAgICAgLy8g5Yqo55S75pyq5omn6KGM5a6MXG4gICAgICAgICAgICByYXRpbyA9IGQzRWFzZVtlYXNpbmddKHJhdGlvKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIOWKqOeUu+W3suaJp+ihjOWujFxuICAgICAgICAgICAgaWYgKGFuaW1hdGlvbi5vbkZyYW1lKSB7XG4gICAgICAgICAgICAgICAgc2hhcGUuYXR0cihhbmltYXRpb24ub25GcmFtZSgxKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBzaGFwZS5hdHRyKGFuaW1hdGlvbi50b0F0dHJzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChhbmltYXRpb24ub25GcmFtZSkge1xuICAgICAgICB2YXIgYXR0cnMgPSBhbmltYXRpb24ub25GcmFtZShyYXRpbyk7XG4gICAgICAgIHNoYXBlLmF0dHIoYXR0cnMpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgX3VwZGF0ZShzaGFwZSwgYW5pbWF0aW9uLCByYXRpbyk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbnZhciBUaW1lbGluZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvKipcbiAgICAgKiDml7bpl7TovbTmnoTpgKDlh73mlbDvvIzkvp3otZbkuo7nlLvluINcbiAgICAgKiBAcGFyYW0ge31cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBUaW1lbGluZShjYW52YXMpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIOaJp+ihjOWKqOeUu+eahOWFg+e0oOWIl+ihqFxuICAgICAgICAgKiBAdHlwZSB7SUVsZW1lbnRbXX1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuYW5pbWF0b3JzID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICAgKiDlvZPliY3ml7bpl7RcbiAgICAgICAgICogQHR5cGUge251bWJlcn1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuY3VycmVudCA9IDA7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiDlrprml7blmahcbiAgICAgICAgICogQHR5cGUge2QzVGltZXIuVGltZXJ9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnRpbWVyID0gbnVsbDtcbiAgICAgICAgdGhpcy5jYW52YXMgPSBjYW52YXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIOWIneWni+WMluWumuaXtuWZqFxuICAgICAqL1xuICAgIFRpbWVsaW5lLnByb3RvdHlwZS5pbml0VGltZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBpc0ZpbmlzaGVkID0gZmFsc2U7XG4gICAgICAgIHZhciBzaGFwZTtcbiAgICAgICAgdmFyIGFuaW1hdGlvbnM7XG4gICAgICAgIHZhciBhbmltYXRpb247XG4gICAgICAgIHRoaXMudGltZXIgPSBkM1RpbWVyLnRpbWVyKGZ1bmN0aW9uIChlbGFwc2VkKSB7XG4gICAgICAgICAgICBfdGhpcy5jdXJyZW50ID0gZWxhcHNlZDtcbiAgICAgICAgICAgIGlmIChfdGhpcy5hbmltYXRvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSBfdGhpcy5hbmltYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgICAgICAgICAgc2hhcGUgPSBfdGhpcy5hbmltYXRvcnNbaV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChzaGFwZS5kZXN0cm95ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIOWmguaenOW3sue7j+iiq+mUgOavge+8jOebtOaOpeenu+WHuumYn+WIl1xuICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMucmVtb3ZlQW5pbWF0b3IoaSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIXNoYXBlLmlzQW5pbWF0ZVBhdXNlZCgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhbmltYXRpb25zID0gc2hhcGUuZ2V0KCdhbmltYXRpb25zJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gYW5pbWF0aW9ucy5sZW5ndGggLSAxOyBqID49IDA7IGotLSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvbiA9IGFuaW1hdGlvbnNbal07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNGaW5pc2hlZCA9IHVwZGF0ZShzaGFwZSwgYW5pbWF0aW9uLCBlbGFwc2VkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNGaW5pc2hlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmltYXRpb25zLnNwbGljZShqLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNGaW5pc2hlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYW5pbWF0aW9uLmNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmltYXRpb24uY2FsbGJhY2soKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoYW5pbWF0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLnJlbW92ZUFuaW1hdG9yKGkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBhdXRvRHJhdyA9IF90aGlzLmNhbnZhcy5nZXQoJ2F1dG9EcmF3Jyk7XG4gICAgICAgICAgICAgICAgLy8g6Z2e6Ieq5Yqo5riy5p+T5qih5byP5LiL77yM5omL5Yqo6LCD55SoIGNhbnZhcy5kcmF3KCkg6YeN5paw5riy5p+TXG4gICAgICAgICAgICAgICAgaWYgKCFhdXRvRHJhdykge1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy5jYW52YXMuZHJhdygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiDlop7liqDliqjnlLvlhYPntKBcbiAgICAgKi9cbiAgICBUaW1lbGluZS5wcm90b3R5cGUuYWRkQW5pbWF0b3IgPSBmdW5jdGlvbiAoc2hhcGUpIHtcbiAgICAgICAgdGhpcy5hbmltYXRvcnMucHVzaChzaGFwZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiDnp7vpmaTliqjnlLvlhYPntKBcbiAgICAgKi9cbiAgICBUaW1lbGluZS5wcm90b3R5cGUucmVtb3ZlQW5pbWF0b3IgPSBmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICAgICAgdGhpcy5hbmltYXRvcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIOaYr+WQpuacieWKqOeUu+WcqOaJp+ihjFxuICAgICAqL1xuICAgIFRpbWVsaW5lLnByb3RvdHlwZS5pc0FuaW1hdGluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5hbmltYXRvcnMubGVuZ3RoO1xuICAgIH07XG4gICAgLyoqXG4gICAgICog5YGc5q2i5a6a5pe25ZmoXG4gICAgICovXG4gICAgVGltZWxpbmUucHJvdG90eXBlLnN0b3AgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLnRpbWVyKSB7XG4gICAgICAgICAgICB0aGlzLnRpbWVyLnN0b3AoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICog5YGc5q2i5pe26Ze06L205LiK5omA5pyJ5YWD57Sg55qE5Yqo55S777yM5bm2572u56m65Yqo55S75YWD57Sg5YiX6KGoXG4gICAgICogQHBhcmFtIHtib29sZWFufSB0b0VuZCDmmK/lkKbliLDliqjnlLvnmoTmnIDnu4jnirbmgIHvvIznlKjmnaXpgI/kvKDnu5nliqjnlLvlhYPntKDnmoQgc3RvcEFuaW1hdGUg5pa55rOVXG4gICAgICovXG4gICAgVGltZWxpbmUucHJvdG90eXBlLnN0b3BBbGxBbmltYXRpb25zID0gZnVuY3Rpb24gKHRvRW5kKSB7XG4gICAgICAgIGlmICh0b0VuZCA9PT0gdm9pZCAwKSB7IHRvRW5kID0gdHJ1ZTsgfVxuICAgICAgICB0aGlzLmFuaW1hdG9ycy5mb3JFYWNoKGZ1bmN0aW9uIChhbmltYXRvcikge1xuICAgICAgICAgICAgYW5pbWF0b3Iuc3RvcEFuaW1hdGUodG9FbmQpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5hbmltYXRvcnMgPSBbXTtcbiAgICAgICAgdGhpcy5jYW52YXMuZHJhdygpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICog6I635Y+W5b2T5YmN5pe26Ze0XG4gICAgICovXG4gICAgVGltZWxpbmUucHJvdG90eXBlLmdldFRpbWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnQ7XG4gICAgfTtcbiAgICByZXR1cm4gVGltZWxpbmU7XG59KCkpO1xuZXhwb3J0IGRlZmF1bHQgVGltZWxpbmU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD10aW1lbGluZS5qcy5tYXAiLCIvKipcbiAqIEBmaWxlb3ZlcnZpZXcg5LqL5Lu25aSE55CG5ZmoXG4gKiBAYXV0aG9yIGR4cTYxM0BnbWFpbC5jb21cbiAqL1xuaW1wb3J0IEdyYXBoRXZlbnQgZnJvbSAnLi9ncmFwaC1ldmVudCc7XG5pbXBvcnQgeyBlYWNoLCBpc1BhcmVudCB9IGZyb20gJy4uL3V0aWwvdXRpbCc7XG52YXIgQ0xJQ0tfT0ZGU0VUID0gNDA7XG52YXIgTEVGVF9CVE5fQ09ERSA9IDA7XG52YXIgREVMRUdBVElPTl9TUExJVCA9ICc6JztcbnZhciBFVkVOVFMgPSBbXG4gICAgJ21vdXNlZG93bicsXG4gICAgJ21vdXNldXAnLFxuICAgICdkYmxjbGljaycsXG4gICAgJ21vdXNlb3V0JyxcbiAgICAnbW91c2VvdmVyJyxcbiAgICAnbW91c2Vtb3ZlJyxcbiAgICAnbW91c2VsZWF2ZScsXG4gICAgJ21vdXNlZW50ZXInLFxuICAgICd0b3VjaHN0YXJ0JyxcbiAgICAndG91Y2htb3ZlJyxcbiAgICAndG91Y2hlbmQnLFxuICAgICdkcmFnZW50ZXInLFxuICAgICdkcmFnb3ZlcicsXG4gICAgJ2RyYWdsZWF2ZScsXG4gICAgJ2Ryb3AnLFxuICAgICdjb250ZXh0bWVudScsXG4gICAgJ21vdXNld2hlZWwnLFxuXTtcbi8vIOaYr+WQpuacieWnlOaJmOS6i+S7tuebkeWQrFxuZnVuY3Rpb24gaGFzRGVsZWdhdGlvbihldmVudHMsIHR5cGUpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gZXZlbnRzKSB7XG4gICAgICAgIGlmIChldmVudHMuaGFzT3duUHJvcGVydHkoa2V5KSAmJiBrZXkuaW5kZXhPZihERUxFR0FUSU9OX1NQTElUICsgdHlwZSkgPj0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuLy8g6Kem5Y+R55uu5qCH5LqL5Lu277yM55uu5qCH5Y+q6IO95pivIHNoYXBlIOaIliBjYW52YXNcbmZ1bmN0aW9uIGVtaXRUYXJnZXRFdmVudCh0YXJnZXQsIHR5cGUsIGV2ZW50T2JqKSB7XG4gICAgZXZlbnRPYmoubmFtZSA9IHR5cGU7XG4gICAgZXZlbnRPYmoudGFyZ2V0ID0gdGFyZ2V0O1xuICAgIGV2ZW50T2JqLmN1cnJlbnRUYXJnZXQgPSB0YXJnZXQ7XG4gICAgZXZlbnRPYmouZGVsZWdhdGVUYXJnZXQgPSB0YXJnZXQ7XG4gICAgdGFyZ2V0LmVtaXQodHlwZSwgZXZlbnRPYmopO1xufVxuLy8g5LqL5Lu25YaS5rOhLCBlbnRlciDlkowgbGVhdmUg6ZyA6KaB5a+5IGZyb21TaGFwZSDlkowgdG9TaGFwZSDov5vooYzliKTlkIxcbmZ1bmN0aW9uIGJ1YmJsZUV2ZW50KGNvbnRhaW5lciwgdHlwZSwgZXZlbnRPYmopIHtcbiAgICBpZiAoZXZlbnRPYmouYnViYmxlcykge1xuICAgICAgICB2YXIgcmVsYXRpdmVTaGFwZSA9IHZvaWQgMDtcbiAgICAgICAgdmFyIGlzT3ZlckV2ZW50ID0gZmFsc2U7XG4gICAgICAgIGlmICh0eXBlID09PSAnbW91c2VlbnRlcicpIHtcbiAgICAgICAgICAgIHJlbGF0aXZlU2hhcGUgPSBldmVudE9iai5mcm9tU2hhcGU7XG4gICAgICAgICAgICBpc092ZXJFdmVudCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gJ21vdXNlbGVhdmUnKSB7XG4gICAgICAgICAgICBpc092ZXJFdmVudCA9IHRydWU7XG4gICAgICAgICAgICByZWxhdGl2ZVNoYXBlID0gZXZlbnRPYmoudG9TaGFwZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBjYW52YXMg5LiK55qEIG1vdXNlZW50ZXLvvIwgbW91c2VsZWF2ZSDkuovku7bvvIzku4XlvZPov5vlhaXmiJbogIXnp7vlh7ogY2FudmFzIOaXtuinpuWPkVxuICAgICAgICBpZiAoY29udGFpbmVyLmlzQ2FudmFzKCkgJiYgaXNPdmVyRXZlbnQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyDlpoLmnpznm7jlhbPlm77lvaLlkIzlvZPliY3lm77lvaLlnKjlkIzkuIDkuKrlrrnlmajlhoXvvIzkuI3op6blj5Hkuovku7ZcbiAgICAgICAgaWYgKHJlbGF0aXZlU2hhcGUgJiYgaXNQYXJlbnQoY29udGFpbmVyLCByZWxhdGl2ZVNoYXBlKSkge1xuICAgICAgICAgICAgLy8g6Zi75q2i57un57ut5ZCR5LiK5YaS5rOhXG4gICAgICAgICAgICBldmVudE9iai5idWJibGVzID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8g5LqL5Lu25ZCN56ew5Y+v6IO95Zyo5aeU5omY6L+H56iL5Lit6KKr5L+u5pS577yM5Zug5q2k5LqL5Lu25YaS5rOh5pe26ZyA6KaB6YeN5paw6K6+572u5LqL5Lu25ZCN56ewXG4gICAgICAgIGV2ZW50T2JqLm5hbWUgPSB0eXBlO1xuICAgICAgICBldmVudE9iai5jdXJyZW50VGFyZ2V0ID0gY29udGFpbmVyO1xuICAgICAgICBldmVudE9iai5kZWxlZ2F0ZVRhcmdldCA9IGNvbnRhaW5lcjtcbiAgICAgICAgY29udGFpbmVyLmVtaXQodHlwZSwgZXZlbnRPYmopO1xuICAgIH1cbn1cbnZhciBFdmVudENvbnRyb2xsZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gRXZlbnRDb250cm9sbGVyKGNmZykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAvLyDmraPlnKjooqvmi5bmi73nmoTlm77lvaJcbiAgICAgICAgdGhpcy5kcmFnZ2luZ1NoYXBlID0gbnVsbDtcbiAgICAgICAgdGhpcy5kcmFnZ2luZyA9IGZhbHNlO1xuICAgICAgICAvLyDlvZPliY3pvKDmoIcvdG91Y2jmiYDlnKjkvY3nva7nmoTlm77lvaJcbiAgICAgICAgdGhpcy5jdXJyZW50U2hhcGUgPSBudWxsO1xuICAgICAgICB0aGlzLm1vdXNlZG93blNoYXBlID0gbnVsbDtcbiAgICAgICAgdGhpcy5tb3VzZWRvd25Qb2ludCA9IG51bGw7XG4gICAgICAgIC8vIOe7n+S4gOWkhOeQhuaJgOacieeahOWbnuiwg1xuICAgICAgICB0aGlzLl9ldmVudENhbGxiYWNrID0gZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgICAgICB2YXIgdHlwZSA9IGV2LnR5cGU7XG4gICAgICAgICAgICBfdGhpcy5fdHJpZ2dlckV2ZW50KHR5cGUsIGV2KTtcbiAgICAgICAgfTtcbiAgICAgICAgLy8g5ZyoIGRvY3VtZW50IOWkhOeQhuaLluaLveWIsOeUu+W4g+WklueahOS6i+S7tu+8jOWkhOeQhuS7juWbvuW9ouS4iuenu+mZpOeUu+W4g+acquiiq+aNleaNieeahOmXrumimFxuICAgICAgICB0aGlzLl9vbkRvY3VtZW50TW92ZSA9IGZ1bmN0aW9uIChldikge1xuICAgICAgICAgICAgdmFyIGNhbnZhcyA9IF90aGlzLmNhbnZhcztcbiAgICAgICAgICAgIHZhciBlbCA9IGNhbnZhcy5nZXQoJ2VsJyk7XG4gICAgICAgICAgICBpZiAoZWwgIT09IGV2LnRhcmdldCkge1xuICAgICAgICAgICAgICAgIC8vIOS4jeWcqCBjYW52YXMg5LiK56e75YqoXG4gICAgICAgICAgICAgICAgaWYgKF90aGlzLmRyYWdnaW5nIHx8IF90aGlzLmN1cnJlbnRTaGFwZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcG9pbnRJbmZvID0gX3RoaXMuX2dldFBvaW50SW5mbyhldik7XG4gICAgICAgICAgICAgICAgICAgIC8vIOi/mOWcqOaLluaLvei/h+eoi+S4rVxuICAgICAgICAgICAgICAgICAgICBpZiAoX3RoaXMuZHJhZ2dpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLl9lbWl0RXZlbnQoJ2RyYWcnLCBldiwgcG9pbnRJbmZvLCBfdGhpcy5kcmFnZ2luZ1NoYXBlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyDor7TmmI7ku47mn5DkuKrlm77lvaLnm7TmjqXnp7vliqjliLDkuobnlLvluIPlpJbpnaLvvIxcbiAgICAgICAgICAgICAgICAgICAgLy8g5L+u5aSN5LqGIG1vdXNlbGVhdmUg55qEIGJ1ZyDlkI7kuI3lho3lh7rnjrDov5nnp43mg4XlhrVcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgKHRoaXMuY3VycmVudFNoYXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vICAgdGhpcy5fZW1pdEV2ZW50KCdtb3VzZWxlYXZlJywgZXYsIHBvaW50SW5mbywgdGhpcy5jdXJyZW50U2hhcGUsIHRoaXMuY3VycmVudFNoYXBlLCBudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gICB0aGlzLmN1cnJlbnRTaGFwZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIC8vIOWcqCBkb2N1bWVudCDkuIrlpITnkIbmi5bmi73liLDlpJbpnaLvvIzph4rmlL7pvKDmoIfml7bop6blj5EgZHJhZ2VuZFxuICAgICAgICB0aGlzLl9vbkRvY3VtZW50TW91c2VVcCA9IGZ1bmN0aW9uIChldikge1xuICAgICAgICAgICAgdmFyIGNhbnZhcyA9IF90aGlzLmNhbnZhcztcbiAgICAgICAgICAgIHZhciBlbCA9IGNhbnZhcy5nZXQoJ2VsJyk7XG4gICAgICAgICAgICBpZiAoZWwgIT09IGV2LnRhcmdldCkge1xuICAgICAgICAgICAgICAgIC8vIOS4jeWcqCBjYW52YXMg5LiK56e75YqoXG4gICAgICAgICAgICAgICAgaWYgKF90aGlzLmRyYWdnaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBwb2ludEluZm8gPSBfdGhpcy5fZ2V0UG9pbnRJbmZvKGV2KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKF90aGlzLmRyYWdnaW5nU2hhcGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIOWmguaenOWtmOWcqOaLluaLveeahOWbvuW9ou+8jOWImeS5n+inpuWPkSBkcm9wIOS6i+S7tlxuICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuX2VtaXRFdmVudCgnZHJvcCcsIGV2LCBwb2ludEluZm8sIG51bGwpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLl9lbWl0RXZlbnQoJ2RyYWdlbmQnLCBldiwgcG9pbnRJbmZvLCBfdGhpcy5kcmFnZ2luZ1NoYXBlKTtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuX2FmdGVyRHJhZyhfdGhpcy5kcmFnZ2luZ1NoYXBlLCBwb2ludEluZm8sIGV2KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuY2FudmFzID0gY2ZnLmNhbnZhcztcbiAgICB9XG4gICAgRXZlbnRDb250cm9sbGVyLnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl9iaW5kRXZlbnRzKCk7XG4gICAgfTtcbiAgICAvLyDms6jlhozkuovku7ZcbiAgICBFdmVudENvbnRyb2xsZXIucHJvdG90eXBlLl9iaW5kRXZlbnRzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgZWwgPSB0aGlzLmNhbnZhcy5nZXQoJ2VsJyk7XG4gICAgICAgIGVhY2goRVZFTlRTLCBmdW5jdGlvbiAoZXZlbnROYW1lKSB7XG4gICAgICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgX3RoaXMuX2V2ZW50Q2FsbGJhY2spO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGRvY3VtZW50KSB7XG4gICAgICAgICAgICAvLyDlpITnkIbnp7vliqjliLDlpJbpnaLmsqHmnInop6blj5Egc2hhcGUgbW91c2UgbGVhdmUg55qE5LqL5Lu2XG4gICAgICAgICAgICAvLyDlpITnkIbmi5bmi73liLDlpJbpg6jnmoTpl67pophcbiAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuX29uRG9jdW1lbnRNb3ZlKTtcbiAgICAgICAgICAgIC8vIOWkhOeQhuaLluaLvei/h+eoi+S4reWcqOWklumDqOmHiuaUvum8oOagh+eahOmXrumimFxuICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuX29uRG9jdW1lbnRNb3VzZVVwKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLy8g5riF55CG5LqL5Lu2XG4gICAgRXZlbnRDb250cm9sbGVyLnByb3RvdHlwZS5fY2xlYXJFdmVudHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBlbCA9IHRoaXMuY2FudmFzLmdldCgnZWwnKTtcbiAgICAgICAgZWFjaChFVkVOVFMsIGZ1bmN0aW9uIChldmVudE5hbWUpIHtcbiAgICAgICAgICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBfdGhpcy5fZXZlbnRDYWxsYmFjayk7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoZG9jdW1lbnQpIHtcbiAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuX29uRG9jdW1lbnRNb3ZlKTtcbiAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLl9vbkRvY3VtZW50TW91c2VVcCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIEV2ZW50Q29udHJvbGxlci5wcm90b3R5cGUuX2dldEV2ZW50T2JqID0gZnVuY3Rpb24gKHR5cGUsIGV2ZW50LCBwb2ludCwgdGFyZ2V0LCBmcm9tU2hhcGUsIHRvU2hhcGUpIHtcbiAgICAgICAgdmFyIGV2ZW50T2JqID0gbmV3IEdyYXBoRXZlbnQodHlwZSwgZXZlbnQpO1xuICAgICAgICBldmVudE9iai5mcm9tU2hhcGUgPSBmcm9tU2hhcGU7XG4gICAgICAgIGV2ZW50T2JqLnRvU2hhcGUgPSB0b1NoYXBlO1xuICAgICAgICBldmVudE9iai54ID0gcG9pbnQueDtcbiAgICAgICAgZXZlbnRPYmoueSA9IHBvaW50Lnk7XG4gICAgICAgIGV2ZW50T2JqLmNsaWVudFggPSBwb2ludC5jbGllbnRYO1xuICAgICAgICBldmVudE9iai5jbGllbnRZID0gcG9pbnQuY2xpZW50WTtcbiAgICAgICAgZXZlbnRPYmoucHJvcGFnYXRpb25QYXRoLnB1c2godGFyZ2V0KTtcbiAgICAgICAgLy8g5LqL5Lu255qEeCx55bqU6K+l5piv5Z+65LqO55S75biD5bem5LiK6KeS55qE77yM5LiOY2FudmFz55qEbWF0cml45peg5YWzXG4gICAgICAgIHJldHVybiBldmVudE9iajtcbiAgICB9O1xuICAgIC8vIOagueaNrueCueiOt+WPluWbvuW9ou+8jOaPkOWPluaIkOeLrOeri+aWueazle+8jOS+v+S6juWQjue7reS8mOWMllxuICAgIEV2ZW50Q29udHJvbGxlci5wcm90b3R5cGUuX2dldFNoYXBlID0gZnVuY3Rpb24gKHBvaW50LCBldikge1xuICAgICAgICByZXR1cm4gdGhpcy5jYW52YXMuZ2V0U2hhcGUocG9pbnQueCwgcG9pbnQueSwgZXYpO1xuICAgIH07XG4gICAgLy8g6I635Y+W5LqL5Lu255qE5b2T5YmN54K555qE5L+h5oGvXG4gICAgRXZlbnRDb250cm9sbGVyLnByb3RvdHlwZS5fZ2V0UG9pbnRJbmZvID0gZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgIHZhciBjYW52YXMgPSB0aGlzLmNhbnZhcztcbiAgICAgICAgdmFyIGNsaWVudFBvaW50ID0gY2FudmFzLmdldENsaWVudEJ5RXZlbnQoZXYpO1xuICAgICAgICB2YXIgcG9pbnQgPSBjYW52YXMuZ2V0UG9pbnRCeUV2ZW50KGV2KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHg6IHBvaW50LngsXG4gICAgICAgICAgICB5OiBwb2ludC55LFxuICAgICAgICAgICAgY2xpZW50WDogY2xpZW50UG9pbnQueCxcbiAgICAgICAgICAgIGNsaWVudFk6IGNsaWVudFBvaW50LnksXG4gICAgICAgIH07XG4gICAgfTtcbiAgICAvLyDop6blj5Hkuovku7ZcbiAgICBFdmVudENvbnRyb2xsZXIucHJvdG90eXBlLl90cmlnZ2VyRXZlbnQgPSBmdW5jdGlvbiAodHlwZSwgZXYpIHtcbiAgICAgICAgdmFyIHBvaW50SW5mbyA9IHRoaXMuX2dldFBvaW50SW5mbyhldik7XG4gICAgICAgIC8vIOavj+asoemDveiOt+WPluWbvuW9ouacieS4gOWumuaIkOacrO+8jOWQjuacn+WPr+S7peiAg+iZkei/m+ihjOe8k+WtmOetlueVpVxuICAgICAgICB2YXIgc2hhcGUgPSB0aGlzLl9nZXRTaGFwZShwb2ludEluZm8sIGV2KTtcbiAgICAgICAgdmFyIG1ldGhvZCA9IHRoaXNbXCJfb25cIiArIHR5cGVdO1xuICAgICAgICB2YXIgbGVhdmVDYW52YXMgPSBmYWxzZTtcbiAgICAgICAgaWYgKG1ldGhvZCkge1xuICAgICAgICAgICAgbWV0aG9kLmNhbGwodGhpcywgcG9pbnRJbmZvLCBzaGFwZSwgZXYpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFyIHByZVNoYXBlID0gdGhpcy5jdXJyZW50U2hhcGU7XG4gICAgICAgICAgICAvLyDlpoLmnpzov5vlhaXjgIHnp7vlh7rnlLvluIPml7blrZjlnKjlm77lvaLvvIzliJnopoHliIbliKvop6blj5Hkuovku7ZcbiAgICAgICAgICAgIGlmICh0eXBlID09PSAnbW91c2VlbnRlcicgfHwgdHlwZSA9PT0gJ2RyYWdlbnRlcicgfHwgdHlwZSA9PT0gJ21vdXNlb3ZlcicpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lbWl0RXZlbnQodHlwZSwgZXYsIHBvaW50SW5mbywgbnVsbCwgbnVsbCwgc2hhcGUpOyAvLyDlhYjov5vlhaXnlLvluINcbiAgICAgICAgICAgICAgICBpZiAoc2hhcGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZW1pdEV2ZW50KHR5cGUsIGV2LCBwb2ludEluZm8sIHNoYXBlLCBudWxsLCBzaGFwZSk7IC8vIOWGjeinpuWPkeWbvuW9oueahOS6i+S7tlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodHlwZSA9PT0gJ21vdXNlZW50ZXInICYmIHRoaXMuZHJhZ2dpbmdTaGFwZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyDlpoLmnpzmraPlnKjmi5bmi73lm77lvaIsIOWImeinpuWPkSBkcmFnbGVhdmVcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZW1pdEV2ZW50KCdkcmFnZW50ZXInLCBldiwgcG9pbnRJbmZvLCBudWxsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0eXBlID09PSAnbW91c2VsZWF2ZScgfHwgdHlwZSA9PT0gJ2RyYWdsZWF2ZScgfHwgdHlwZSA9PT0gJ21vdXNlb3V0Jykge1xuICAgICAgICAgICAgICAgIGxlYXZlQ2FudmFzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAocHJlU2hhcGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZW1pdEV2ZW50KHR5cGUsIGV2LCBwb2ludEluZm8sIHByZVNoYXBlLCBwcmVTaGFwZSwgbnVsbCk7IC8vIOWFiOinpuWPkeWbvuW9oueahOS6i+S7tlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLl9lbWl0RXZlbnQodHlwZSwgZXYsIHBvaW50SW5mbywgbnVsbCwgcHJlU2hhcGUsIG51bGwpOyAvLyDlho3op6blj5HnprvlvIDnlLvluIPkuovku7ZcbiAgICAgICAgICAgICAgICBpZiAodHlwZSA9PT0gJ21vdXNlbGVhdmUnICYmIHRoaXMuZHJhZ2dpbmdTaGFwZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbWl0RXZlbnQoJ2RyYWdsZWF2ZScsIGV2LCBwb2ludEluZm8sIG51bGwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX2VtaXRFdmVudCh0eXBlLCBldiwgcG9pbnRJbmZvLCBzaGFwZSwgbnVsbCwgbnVsbCk7IC8vIOS4gOiIrOS6i+S7tuS4reS4jemcgOimgeiAg+iZkSBmcm9tLCB0b1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghbGVhdmVDYW52YXMpIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFNoYXBlID0gc2hhcGU7XG4gICAgICAgIH1cbiAgICAgICAgLy8g5b2T6byg5qCH5LuO55S75biD56e75Yqo5YiwIHNoYXBlIOaIluiAheS7jiBwcmVTaGFwZSDnp7vliqjliLAgc2hhcGUg5pe277yM5bqU55SoIHNoYXBlIOS4iueahOm8oOagh+agt+W8j1xuICAgICAgICBpZiAoc2hhcGUgJiYgIXNoYXBlLmdldCgnZGVzdHJveWVkJykpIHtcbiAgICAgICAgICAgIHZhciBjYW52YXMgPSB0aGlzLmNhbnZhcztcbiAgICAgICAgICAgIHZhciBlbCA9IGNhbnZhcy5nZXQoJ2VsJyk7XG4gICAgICAgICAgICBlbC5zdHlsZS5jdXJzb3IgPSBzaGFwZS5hdHRyKCdjdXJzb3InKSB8fCBjYW52YXMuZ2V0KCdjdXJzb3InKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLy8g6K6w5b2V5LiL54K55Ye755qE5L2N572u44CB5Zu+5b2i77yM5L6/5LqO5ouW5ou95LqL5Lu244CBY2xpY2sg5LqL5Lu255qE5Yik5a6aXG4gICAgRXZlbnRDb250cm9sbGVyLnByb3RvdHlwZS5fb25tb3VzZWRvd24gPSBmdW5jdGlvbiAocG9pbnRJbmZvLCBzaGFwZSwgZXZlbnQpIHtcbiAgICAgICAgLy8g5Y+q5pyJ6byg5qCH5bem6ZSu55qEIG1vdXNlZG93biDkuovku7bmiY3kvJrorr7nva4gbW91c2Vkb3duU2hhcGUg562J5bGe5oCn77yM6YG/5YWN6byg5qCH5Y+z6ZSu55qEIG1vdXNlZG93biDkuovku7blvJXotbflhbbku5bkuovku7blj5HnlJ9cbiAgICAgICAgaWYgKGV2ZW50LmJ1dHRvbiA9PT0gTEVGVF9CVE5fQ09ERSkge1xuICAgICAgICAgICAgdGhpcy5tb3VzZWRvd25TaGFwZSA9IHNoYXBlO1xuICAgICAgICAgICAgdGhpcy5tb3VzZWRvd25Qb2ludCA9IHBvaW50SW5mbztcbiAgICAgICAgICAgIHRoaXMubW91c2Vkb3duVGltZVN0YW1wID0gZXZlbnQudGltZVN0YW1wO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2VtaXRFdmVudCgnbW91c2Vkb3duJywgZXZlbnQsIHBvaW50SW5mbywgc2hhcGUsIG51bGwsIG51bGwpOyAvLyBtb3VzZWRvd24g5LiN6ICD6JmRZnJvbVNoYXBlLCB0b1NoYXBlXG4gICAgfTtcbiAgICAvLyBtb3VzZWxlYXZlIOWSjCBtb3VzZWVudGVyIOmDveaYr+aIkOWvueWtmOWcqOeahFxuICAgIC8vIG1vdXNlZW50ZXIg5ZKMIG1vdXNlb3ZlciDlkIzml7bop6blj5FcbiAgICBFdmVudENvbnRyb2xsZXIucHJvdG90eXBlLl9lbWl0TW91c2VvdmVyRXZlbnRzID0gZnVuY3Rpb24gKGV2ZW50LCBwb2ludEluZm8sIGZyb21TaGFwZSwgdG9TaGFwZSkge1xuICAgICAgICB2YXIgZWwgPSB0aGlzLmNhbnZhcy5nZXQoJ2VsJyk7XG4gICAgICAgIGlmIChmcm9tU2hhcGUgIT09IHRvU2hhcGUpIHtcbiAgICAgICAgICAgIGlmIChmcm9tU2hhcGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lbWl0RXZlbnQoJ21vdXNlb3V0JywgZXZlbnQsIHBvaW50SW5mbywgZnJvbVNoYXBlLCBmcm9tU2hhcGUsIHRvU2hhcGUpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2VtaXRFdmVudCgnbW91c2VsZWF2ZScsIGV2ZW50LCBwb2ludEluZm8sIGZyb21TaGFwZSwgZnJvbVNoYXBlLCB0b1NoYXBlKTtcbiAgICAgICAgICAgICAgICAvLyDlvZPpvKDmoIfku44gZnJvbVNoYXBlIOenu+WKqOWIsOeUu+W4g+S4iuaXtu+8jOmHjee9rum8oOagh+agt+W8j1xuICAgICAgICAgICAgICAgIGlmICghdG9TaGFwZSB8fCB0b1NoYXBlLmdldCgnZGVzdHJveWVkJykpIHtcbiAgICAgICAgICAgICAgICAgICAgZWwuc3R5bGUuY3Vyc29yID0gdGhpcy5jYW52YXMuZ2V0KCdjdXJzb3InKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodG9TaGFwZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2VtaXRFdmVudCgnbW91c2VvdmVyJywgZXZlbnQsIHBvaW50SW5mbywgdG9TaGFwZSwgZnJvbVNoYXBlLCB0b1NoYXBlKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9lbWl0RXZlbnQoJ21vdXNlZW50ZXInLCBldmVudCwgcG9pbnRJbmZvLCB0b1NoYXBlLCBmcm9tU2hhcGUsIHRvU2hhcGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICAvLyBkcmFnb3ZlciDkuI3nrYnlkIzkuo4gbW91c2VvdmVy77yM6ICM562J5ZCM5LqOIG1vdXNlbW92ZVxuICAgIEV2ZW50Q29udHJvbGxlci5wcm90b3R5cGUuX2VtaXREcmFnb3ZlckV2ZW50cyA9IGZ1bmN0aW9uIChldmVudCwgcG9pbnRJbmZvLCBmcm9tU2hhcGUsIHRvU2hhcGUsIGlzQ2FudmFzRW1pdCkge1xuICAgICAgICBpZiAodG9TaGFwZSkge1xuICAgICAgICAgICAgaWYgKHRvU2hhcGUgIT09IGZyb21TaGFwZSkge1xuICAgICAgICAgICAgICAgIGlmIChmcm9tU2hhcGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZW1pdEV2ZW50KCdkcmFnbGVhdmUnLCBldmVudCwgcG9pbnRJbmZvLCBmcm9tU2hhcGUsIGZyb21TaGFwZSwgdG9TaGFwZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuX2VtaXRFdmVudCgnZHJhZ2VudGVyJywgZXZlbnQsIHBvaW50SW5mbywgdG9TaGFwZSwgZnJvbVNoYXBlLCB0b1NoYXBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghaXNDYW52YXNFbWl0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZW1pdEV2ZW50KCdkcmFnb3ZlcicsIGV2ZW50LCBwb2ludEluZm8sIHRvU2hhcGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGZyb21TaGFwZSkge1xuICAgICAgICAgICAgLy8gVE9ETzog5q2k5aSE5Yik5pat5pyJ6Zeu6aKY77yM5b2TIGRyYWcg5Zu+5b2i5pe277yM5Lmf5Lya6Kem5Y+R5LiA5qyhIGRyYWdsZWF2ZSDkuovku7bvvIzlm6DkuLrmraTml7YgdG9TaGFwZSDkuLogbnVsbO+8jOi/meS4jeaYr+aJgOacn+acm+eahFxuICAgICAgICAgICAgLy8g57uP6L+H56m655m95Yy65Z+fXG4gICAgICAgICAgICB0aGlzLl9lbWl0RXZlbnQoJ2RyYWdsZWF2ZScsIGV2ZW50LCBwb2ludEluZm8sIGZyb21TaGFwZSwgZnJvbVNoYXBlLCB0b1NoYXBlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNDYW52YXNFbWl0KSB7XG4gICAgICAgICAgICB0aGlzLl9lbWl0RXZlbnQoJ2RyYWdvdmVyJywgZXZlbnQsIHBvaW50SW5mbywgdG9TaGFwZSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8vIGRyYWcg5a6M5oiQ5ZCO77yM6ZyA6KaB5YGa5LiA5Lqb5riF55CG5bel5L2cXG4gICAgRXZlbnRDb250cm9sbGVyLnByb3RvdHlwZS5fYWZ0ZXJEcmFnID0gZnVuY3Rpb24gKGRyYWdnaW5nU2hhcGUsIHBvaW50SW5mbywgZXZlbnQpIHtcbiAgICAgICAgaWYgKGRyYWdnaW5nU2hhcGUpIHtcbiAgICAgICAgICAgIGRyYWdnaW5nU2hhcGUuc2V0KCdjYXB0dXJlJywgdHJ1ZSk7IC8vIOaBouWkjeWPr+S7peaLvuWPllxuICAgICAgICAgICAgdGhpcy5kcmFnZ2luZ1NoYXBlID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRyYWdnaW5nID0gZmFsc2U7XG4gICAgICAgIC8vIGRyYWcg5a6M5oiQ5ZCO77yM5pyJ5Y+v6IO9IGRyYWdnaW5nU2hhcGUg5bey57uP56e75Yqo5Yiw5LqG5b2T5YmN5L2N572u77yM5omA5Lul5LiN6IO955u05o6l5Y+W5b2T5YmN5Zu+5b2iXG4gICAgICAgIHZhciBzaGFwZSA9IHRoaXMuX2dldFNoYXBlKHBvaW50SW5mbywgZXZlbnQpO1xuICAgICAgICAvLyDmi5bmi73lrozmiJDlkI7vvIzov5vooYwgZW50ZXLvvIxsZWF2ZSDnmoTliKTlrppcbiAgICAgICAgaWYgKHNoYXBlICE9PSBkcmFnZ2luZ1NoYXBlKSB7XG4gICAgICAgICAgICB0aGlzLl9lbWl0TW91c2VvdmVyRXZlbnRzKGV2ZW50LCBwb2ludEluZm8sIGRyYWdnaW5nU2hhcGUsIHNoYXBlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmN1cnJlbnRTaGFwZSA9IHNoYXBlOyAvLyDmm7TmlrDlvZPliY0gc2hhcGXvvIzlpoLmnpzkuI3lpITnkIblvZPliY3lm77lvaLnmoQgbW91c2VsZWF2ZSDkuovku7blj6/og73kvJrlh7rpl67pophcbiAgICB9O1xuICAgIC8vIOaMiemUruaKrOi1t+aXtu+8jOS8mue7iOatouaLluaLveOAgeinpuWPkeeCueWHu1xuICAgIEV2ZW50Q29udHJvbGxlci5wcm90b3R5cGUuX29ubW91c2V1cCA9IGZ1bmN0aW9uIChwb2ludEluZm8sIHNoYXBlLCBldmVudCkge1xuICAgICAgICAvLyBlZXZlbnQuYnV0dG9uID09PSAwIOihqOekuum8oOagh+W3pumUruS6i+S7tu+8jOatpOWkhOWKoOS4iuWIpOaWreS4u+imgeaYr+S4uuS6humBv+WFjeWPs+mUrum8oOagh+S8muinpuWPkSBtb3VzZXVwIOWSjCBjbGljayDkuovku7ZcbiAgICAgICAgLy8gcmVmOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvTW91c2VFdmVudC9idXR0b25cbiAgICAgICAgaWYgKGV2ZW50LmJ1dHRvbiA9PT0gTEVGVF9CVE5fQ09ERSkge1xuICAgICAgICAgICAgdmFyIGRyYWdnaW5nU2hhcGUgPSB0aGlzLmRyYWdnaW5nU2hhcGU7XG4gICAgICAgICAgICBpZiAodGhpcy5kcmFnZ2luZykge1xuICAgICAgICAgICAgICAgIC8vIOWtmOWcqOWPr+S7peaLluaLveeahOWbvuW9ou+8jOWQjOaXtuaLluaLveWIsOWFtuS7luWbvuW9ouS4iuaXtuinpuWPkSBkcmFnIOS6i+S7tlxuICAgICAgICAgICAgICAgIGlmIChkcmFnZ2luZ1NoYXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2VtaXRFdmVudCgnZHJvcCcsIGV2ZW50LCBwb2ludEluZm8sIHNoYXBlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5fZW1pdEV2ZW50KCdkcmFnZW5kJywgZXZlbnQsIHBvaW50SW5mbywgZHJhZ2dpbmdTaGFwZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fYWZ0ZXJEcmFnKGRyYWdnaW5nU2hhcGUsIHBvaW50SW5mbywgZXZlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZW1pdEV2ZW50KCdtb3VzZXVwJywgZXZlbnQsIHBvaW50SW5mbywgc2hhcGUpOyAvLyDlhYjop6blj5EgbW91c2V1cCDlho3op6blj5EgY2xpY2tcbiAgICAgICAgICAgICAgICBpZiAoc2hhcGUgPT09IHRoaXMubW91c2Vkb3duU2hhcGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZW1pdEV2ZW50KCdjbGljaycsIGV2ZW50LCBwb2ludEluZm8sIHNoYXBlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5tb3VzZWRvd25TaGFwZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgdGhpcy5tb3VzZWRvd25Qb2ludCA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8vIOW9k+inpuWPkea1j+iniOWZqOeahCBkcmFnb3ZlciDkuovku7bml7bvvIzkuI3kvJrlho3op6blj5EgbW91c2Vtb3ZlIO+8jOaJgOS7pei/meaXtuWAmeeahCBkcmFnZW50ZXIsIGRyYWdsZWF2ZSDkuovku7bpnIDopoHph43mlrDlpITnkIZcbiAgICBFdmVudENvbnRyb2xsZXIucHJvdG90eXBlLl9vbmRyYWdvdmVyID0gZnVuY3Rpb24gKHBvaW50SW5mbywgc2hhcGUsIGV2ZW50KSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IC8vIOWmguaenOS4jeWvuSBkcmFnb3ZlciDov5vooYwgcHJldmVudERlZmF1bHTvvIzliJnkuI3kvJrlnKggY2FudmFzIOS4iuinpuWPkSBkcm9wIOS6i+S7tlxuICAgICAgICB2YXIgcHJlU2hhcGUgPSB0aGlzLmN1cnJlbnRTaGFwZTtcbiAgICAgICAgdGhpcy5fZW1pdERyYWdvdmVyRXZlbnRzKGV2ZW50LCBwb2ludEluZm8sIHByZVNoYXBlLCBzaGFwZSwgdHJ1ZSk7XG4gICAgfTtcbiAgICAvLyDlpKfph4/nmoTlm77lvaLkuovku7bvvIzpg73pgJrov4cgbW91c2Vtb3ZlIOaooeaLn1xuICAgIEV2ZW50Q29udHJvbGxlci5wcm90b3R5cGUuX29ubW91c2Vtb3ZlID0gZnVuY3Rpb24gKHBvaW50SW5mbywgc2hhcGUsIGV2ZW50KSB7XG4gICAgICAgIHZhciBjYW52YXMgPSB0aGlzLmNhbnZhcztcbiAgICAgICAgdmFyIHByZVNoYXBlID0gdGhpcy5jdXJyZW50U2hhcGU7XG4gICAgICAgIHZhciBkcmFnZ2luZ1NoYXBlID0gdGhpcy5kcmFnZ2luZ1NoYXBlO1xuICAgICAgICAvLyDmraPlnKjmi5bmi73ml7ZcbiAgICAgICAgaWYgKHRoaXMuZHJhZ2dpbmcpIHtcbiAgICAgICAgICAgIC8vIOato+WcqOaLluaLveS4rVxuICAgICAgICAgICAgaWYgKGRyYWdnaW5nU2hhcGUpIHtcbiAgICAgICAgICAgICAgICAvLyDlpoLmnpzmi5bmi73kuoYgc2hhcGUg5Lya6Kem5Y+RIGRyYWdlbnRlciwgZHJhZ2xlYXZlLCBkcmFnb3ZlciDlkowgZHJhZyDkuovku7ZcbiAgICAgICAgICAgICAgICB0aGlzLl9lbWl0RHJhZ292ZXJFdmVudHMoZXZlbnQsIHBvaW50SW5mbywgcHJlU2hhcGUsIHNoYXBlLCBmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyDlpoLmnpzlrZjlnKggZHJhZ2dpbmdTaGFwZSDliJnkvJrlnKggZHJhZ2dpbmdTaGFwZSDkuIrop6blj5EgZHJhZyDkuovku7bvvIzlhpLms6HliLAgY2FudmFzIOS4ilxuICAgICAgICAgICAgLy8g5ZCm5YiZ5ZyoIGNhbnZhcyDkuIrop6blj5EgZHJhZyDkuovku7ZcbiAgICAgICAgICAgIHRoaXMuX2VtaXRFdmVudCgnZHJhZycsIGV2ZW50LCBwb2ludEluZm8sIGRyYWdnaW5nU2hhcGUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFyIG1vdXNlZG93blBvaW50ID0gdGhpcy5tb3VzZWRvd25Qb2ludDtcbiAgICAgICAgICAgIGlmIChtb3VzZWRvd25Qb2ludCkge1xuICAgICAgICAgICAgICAgIC8vIOW9k+m8oOagh+eCueWHu+S4i+WOu++8jOWQjOaXtuenu+WKqOaXtu+8jOi/m+ihjCBkcmFnIOWIpOWumlxuICAgICAgICAgICAgICAgIHZhciBtb3VzZWRvd25TaGFwZSA9IHRoaXMubW91c2Vkb3duU2hhcGU7XG4gICAgICAgICAgICAgICAgdmFyIG5vdyA9IGV2ZW50LnRpbWVTdGFtcDtcbiAgICAgICAgICAgICAgICB2YXIgdGltZVdpbmRvdyA9IG5vdyAtIHRoaXMubW91c2Vkb3duVGltZVN0YW1wO1xuICAgICAgICAgICAgICAgIHZhciBkeCA9IG1vdXNlZG93blBvaW50LmNsaWVudFggLSBwb2ludEluZm8uY2xpZW50WDtcbiAgICAgICAgICAgICAgICB2YXIgZHkgPSBtb3VzZWRvd25Qb2ludC5jbGllbnRZIC0gcG9pbnRJbmZvLmNsaWVudFk7XG4gICAgICAgICAgICAgICAgdmFyIGRpc3QgPSBkeCAqIGR4ICsgZHkgKiBkeTtcbiAgICAgICAgICAgICAgICBpZiAodGltZVdpbmRvdyA+IDEyMCB8fCBkaXN0ID4gQ0xJQ0tfT0ZGU0VUKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtb3VzZWRvd25TaGFwZSAmJiBtb3VzZWRvd25TaGFwZS5nZXQoJ2RyYWdnYWJsZScpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyDorr7nva7kuoYgZHJhZ2dhYmxlIOeahCBzaGFwZSDmiY3og73op6blj5EgZHJhZyDnm7jlhbPnmoTkuovku7ZcbiAgICAgICAgICAgICAgICAgICAgICAgIGRyYWdnaW5nU2hhcGUgPSB0aGlzLm1vdXNlZG93blNoYXBlOyAvLyDmi5bliqjpvKDmoIfngrnkuIvml7bnmoQgc2hhcGVcbiAgICAgICAgICAgICAgICAgICAgICAgIGRyYWdnaW5nU2hhcGUuc2V0KCdjYXB0dXJlJywgZmFsc2UpOyAvLyDnpoHmraLnu6fnu63mi77lj5bvvIzlkKbliJnml6Dms5Xov5vooYwgZHJhZ292ZXIsZHJhZ2VudGVyLGRyYWdsZWF2ZSxkcm9w55qE5Yik5a6aXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRyYWdnaW5nU2hhcGUgPSBkcmFnZ2luZ1NoYXBlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kcmFnZ2luZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbWl0RXZlbnQoJ2RyYWdzdGFydCcsIGV2ZW50LCBwb2ludEluZm8sIGRyYWdnaW5nU2hhcGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8g5riF55CG5oyJ5LiL6byg5qCH5pe257yT5a2Y55qE5YC8XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1vdXNlZG93blNoYXBlID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubW91c2Vkb3duUG9pbnQgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFtb3VzZWRvd25TaGFwZSAmJiBjYW52YXMuZ2V0KCdkcmFnZ2FibGUnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8g6K6+572u5LqGIGRyYWdnYWJsZSDnmoQgY2FudmFzIOaJjeiDveinpuWPkSBkcmFnIOebuOWFs+eahOS6i+S7tlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kcmFnZ2luZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbWl0RXZlbnQoJ2RyYWdzdGFydCcsIGV2ZW50LCBwb2ludEluZm8sIG51bGwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8g5riF55CG5oyJ5LiL6byg5qCH5pe257yT5a2Y55qE5YC8XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1vdXNlZG93blNoYXBlID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubW91c2Vkb3duUG9pbnQgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZW1pdE1vdXNlb3ZlckV2ZW50cyhldmVudCwgcG9pbnRJbmZvLCBwcmVTaGFwZSwgc2hhcGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZW1pdEV2ZW50KCdtb3VzZW1vdmUnLCBldmVudCwgcG9pbnRJbmZvLCBzaGFwZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2VtaXRNb3VzZW92ZXJFdmVudHMoZXZlbnQsIHBvaW50SW5mbywgcHJlU2hhcGUsIHNoYXBlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZW1pdEV2ZW50KCdtb3VzZW1vdmUnLCBldmVudCwgcG9pbnRJbmZvLCBzaGFwZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8g5rKh5pyJ5oyJ6ZSu5oyJ5LiL5pe277yM5YiZ55u05o6l6Kem5Y+RIG1vdXNlIG92ZXIg55u45YWz55qE5ZCE56eN5LqL5Lu2XG4gICAgICAgICAgICAgICAgdGhpcy5fZW1pdE1vdXNlb3ZlckV2ZW50cyhldmVudCwgcG9pbnRJbmZvLCBwcmVTaGFwZSwgc2hhcGUpO1xuICAgICAgICAgICAgICAgIC8vIOWni+e7iOinpuWPkeenu+WKqFxuICAgICAgICAgICAgICAgIHRoaXMuX2VtaXRFdmVudCgnbW91c2Vtb3ZlJywgZXZlbnQsIHBvaW50SW5mbywgc2hhcGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICAvLyDop6blj5Hkuovku7ZcbiAgICBFdmVudENvbnRyb2xsZXIucHJvdG90eXBlLl9lbWl0RXZlbnQgPSBmdW5jdGlvbiAodHlwZSwgZXZlbnQsIHBvaW50SW5mbywgc2hhcGUsIGZyb21TaGFwZSwgdG9TaGFwZSkge1xuICAgICAgICB2YXIgZXZlbnRPYmogPSB0aGlzLl9nZXRFdmVudE9iaih0eXBlLCBldmVudCwgcG9pbnRJbmZvLCBzaGFwZSwgZnJvbVNoYXBlLCB0b1NoYXBlKTtcbiAgICAgICAgLy8g5a2Y5ZyoIHNoYXBlIOinpuWPke+8jOWImei/m+ihjOWGkuazoeWkhOeQhlxuICAgICAgICBpZiAoc2hhcGUpIHtcbiAgICAgICAgICAgIGV2ZW50T2JqLnNoYXBlID0gc2hhcGU7XG4gICAgICAgICAgICAvLyDop6blj5Egc2hhcGUg5LiK55qE5LqL5Lu2XG4gICAgICAgICAgICBlbWl0VGFyZ2V0RXZlbnQoc2hhcGUsIHR5cGUsIGV2ZW50T2JqKTtcbiAgICAgICAgICAgIHZhciBwYXJlbnRfMSA9IHNoYXBlLmdldFBhcmVudCgpO1xuICAgICAgICAgICAgLy8g5omn6KGM5YaS5rOhXG4gICAgICAgICAgICB3aGlsZSAocGFyZW50XzEpIHtcbiAgICAgICAgICAgICAgICAvLyDlp5TmiZjkuovku7bopoHlhYjop6blj5FcbiAgICAgICAgICAgICAgICBwYXJlbnRfMS5lbWl0RGVsZWdhdGlvbih0eXBlLCBldmVudE9iaik7XG4gICAgICAgICAgICAgICAgLy8g5LqL5Lu25YaS5rOh5YGc5q2i77yM5LiN6IO95aao56KN5aeU5omY5LqL5Lu2XG4gICAgICAgICAgICAgICAgaWYgKCFldmVudE9iai5wcm9wYWdhdGlvblN0b3BwZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgYnViYmxlRXZlbnQocGFyZW50XzEsIHR5cGUsIGV2ZW50T2JqKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZXZlbnRPYmoucHJvcGFnYXRpb25QYXRoLnB1c2gocGFyZW50XzEpO1xuICAgICAgICAgICAgICAgIHBhcmVudF8xID0gcGFyZW50XzEuZ2V0UGFyZW50KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyDlpoLmnpzmsqHmnIkgc2hhcGUg55u05o6l5ZyoIGNhbnZhcyDkuIrop6blj5FcbiAgICAgICAgICAgIHZhciBjYW52YXMgPSB0aGlzLmNhbnZhcztcbiAgICAgICAgICAgIC8vIOebtOaOpeinpuWPkSBjYW52YXMg5LiK55qE5LqL5Lu2XG4gICAgICAgICAgICBlbWl0VGFyZ2V0RXZlbnQoY2FudmFzLCB0eXBlLCBldmVudE9iaik7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIEV2ZW50Q29udHJvbGxlci5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8g5riF55CG5LqL5Lu2XG4gICAgICAgIHRoaXMuX2NsZWFyRXZlbnRzKCk7XG4gICAgICAgIC8vIOa4heeQhue8k+WtmOeahOWvueixoVxuICAgICAgICB0aGlzLmNhbnZhcyA9IG51bGw7XG4gICAgICAgIHRoaXMuY3VycmVudFNoYXBlID0gbnVsbDtcbiAgICAgICAgdGhpcy5kcmFnZ2luZ1NoYXBlID0gbnVsbDtcbiAgICAgICAgdGhpcy5tb3VzZWRvd25Qb2ludCA9IG51bGw7XG4gICAgICAgIHRoaXMubW91c2Vkb3duU2hhcGUgPSBudWxsO1xuICAgICAgICB0aGlzLm1vdXNlZG93blRpbWVTdGFtcCA9IG51bGw7XG4gICAgfTtcbiAgICByZXR1cm4gRXZlbnRDb250cm9sbGVyO1xufSgpKTtcbmV4cG9ydCBkZWZhdWx0IEV2ZW50Q29udHJvbGxlcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWV2ZW50LWNvbnRvbGxlci5qcy5tYXAiLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGRldGVjdCB9IGZyb20gJ2RldGVjdC1icm93c2VyJztcbmltcG9ydCBDb250YWluZXIgZnJvbSAnLi9jb250YWluZXInO1xuaW1wb3J0IHsgaXNCcm93c2VyLCBpc05pbCwgaXNTdHJpbmcgfSBmcm9tICcuLi91dGlsL3V0aWwnO1xuaW1wb3J0IFRpbWVsaW5lIGZyb20gJy4uL2FuaW1hdGUvdGltZWxpbmUnO1xuaW1wb3J0IEV2ZW50Q29udHJvbGxlciBmcm9tICcuLi9ldmVudC9ldmVudC1jb250b2xsZXInO1xudmFyIFBYX1NVRkZJWCA9ICdweCc7XG52YXIgYnJvd3NlciA9IGRldGVjdCgpO1xudmFyIGlzRmlyZWZveCA9IGJyb3dzZXIgJiYgYnJvd3Nlci5uYW1lID09PSAnZmlyZWZveCc7XG52YXIgQ2FudmFzID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhDYW52YXMsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gQ2FudmFzKGNmZykge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBjZmcpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLmluaXRDb250YWluZXIoKTtcbiAgICAgICAgX3RoaXMuaW5pdERvbSgpO1xuICAgICAgICBfdGhpcy5pbml0RXZlbnRzKCk7XG4gICAgICAgIF90aGlzLmluaXRUaW1lbGluZSgpO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIENhbnZhcy5wcm90b3R5cGUuZ2V0RGVmYXVsdENmZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGNmZyA9IF9zdXBlci5wcm90b3R5cGUuZ2V0RGVmYXVsdENmZy5jYWxsKHRoaXMpO1xuICAgICAgICAvLyBzZXQgZGVmYXVsdCBjdXJzb3Igc3R5bGUgZm9yIGNhbnZhc1xuICAgICAgICBjZmdbJ2N1cnNvciddID0gJ2RlZmF1bHQnO1xuICAgICAgICAvLyBDU1MgdHJhbnNmb3JtIOebruWJjeWwmuacque7j+i/h+mVv+aXtumXtOmqjOivge+8jOS4uuS6humBv+WFjeW9seWTjeS4iuWxguS4muWKoe+8jOm7mOiupOWFs+mXre+8jOS4iuWxguaMiemcgOW8gOWQr1xuICAgICAgICBjZmdbJ3N1cHBvcnRDU1NUcmFuc2Zvcm0nXSA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gY2ZnO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqIOWIneWni+WMluWuueWZqFxuICAgICAqL1xuICAgIENhbnZhcy5wcm90b3R5cGUuaW5pdENvbnRhaW5lciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGNvbnRhaW5lciA9IHRoaXMuZ2V0KCdjb250YWluZXInKTtcbiAgICAgICAgaWYgKGlzU3RyaW5nKGNvbnRhaW5lcikpIHtcbiAgICAgICAgICAgIGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGNvbnRhaW5lcik7XG4gICAgICAgICAgICB0aGlzLnNldCgnY29udGFpbmVyJywgY29udGFpbmVyKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqIOWIneWni+WMliBET01cbiAgICAgKi9cbiAgICBDYW52YXMucHJvdG90eXBlLmluaXREb20gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBlbCA9IHRoaXMuY3JlYXRlRG9tKCk7XG4gICAgICAgIHRoaXMuc2V0KCdlbCcsIGVsKTtcbiAgICAgICAgLy8g6ZmE5Yqg5Yiw5a655ZmoXG4gICAgICAgIHZhciBjb250YWluZXIgPSB0aGlzLmdldCgnY29udGFpbmVyJyk7XG4gICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChlbCk7XG4gICAgICAgIC8vIOiuvue9ruWIneWni+WuveW6plxuICAgICAgICB0aGlzLnNldERPTVNpemUodGhpcy5nZXQoJ3dpZHRoJyksIHRoaXMuZ2V0KCdoZWlnaHQnKSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICog5Yid5aeL5YyW57uR5a6a55qE5LqL5Lu2XG4gICAgICovXG4gICAgQ2FudmFzLnByb3RvdHlwZS5pbml0RXZlbnRzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZXZlbnRDb250cm9sbGVyID0gbmV3IEV2ZW50Q29udHJvbGxlcih7XG4gICAgICAgICAgICBjYW52YXM6IHRoaXMsXG4gICAgICAgIH0pO1xuICAgICAgICBldmVudENvbnRyb2xsZXIuaW5pdCgpO1xuICAgICAgICB0aGlzLnNldCgnZXZlbnRDb250cm9sbGVyJywgZXZlbnRDb250cm9sbGVyKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKiDliJ3lp4vljJbml7bpl7TovbRcbiAgICAgKi9cbiAgICBDYW52YXMucHJvdG90eXBlLmluaXRUaW1lbGluZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHRpbWVsaW5lID0gbmV3IFRpbWVsaW5lKHRoaXMpO1xuICAgICAgICB0aGlzLnNldCgndGltZWxpbmUnLCB0aW1lbGluZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICog5L+u5pS555S75biD5a+55bqU55qEIERPTSDnmoTlpKflsI9cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gd2lkdGggIOWuveW6plxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBoZWlnaHQg6auY5bqmXG4gICAgICovXG4gICAgQ2FudmFzLnByb3RvdHlwZS5zZXRET01TaXplID0gZnVuY3Rpb24gKHdpZHRoLCBoZWlnaHQpIHtcbiAgICAgICAgdmFyIGVsID0gdGhpcy5nZXQoJ2VsJyk7XG4gICAgICAgIGlmIChpc0Jyb3dzZXIpIHtcbiAgICAgICAgICAgIGVsLnN0eWxlLndpZHRoID0gd2lkdGggKyBQWF9TVUZGSVg7XG4gICAgICAgICAgICBlbC5zdHlsZS5oZWlnaHQgPSBoZWlnaHQgKyBQWF9TVUZGSVg7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8vIOWunueOsOaOpeWPo1xuICAgIENhbnZhcy5wcm90b3R5cGUuY2hhbmdlU2l6ZSA9IGZ1bmN0aW9uICh3aWR0aCwgaGVpZ2h0KSB7XG4gICAgICAgIHRoaXMuc2V0RE9NU2l6ZSh3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgdGhpcy5zZXQoJ3dpZHRoJywgd2lkdGgpO1xuICAgICAgICB0aGlzLnNldCgnaGVpZ2h0JywgaGVpZ2h0KTtcbiAgICAgICAgdGhpcy5vbkNhbnZhc0NoYW5nZSgnY2hhbmdlU2l6ZScpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICog6I635Y+W5b2T5YmN55qE5riy5p+T5byV5pOOXG4gICAgICogQHJldHVybiB7UmVuZGVyZXJ9IOi/lOWbnuW9k+WJjeeahOa4suafk+W8leaTjlxuICAgICAqL1xuICAgIENhbnZhcy5wcm90b3R5cGUuZ2V0UmVuZGVyZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldCgncmVuZGVyZXInKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIOiOt+WPlueUu+W4g+eahCBjdXJzb3Ig5qC35byPXG4gICAgICogQHJldHVybiB7Q3Vyc29yfVxuICAgICAqL1xuICAgIENhbnZhcy5wcm90b3R5cGUuZ2V0Q3Vyc29yID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXQoJ2N1cnNvcicpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICog6K6+572u55S75biD55qEIGN1cnNvciDmoLflvI9cbiAgICAgKiBAcGFyYW0ge0N1cnNvcn0gY3Vyc29yICBjdXJzb3Ig5qC35byPXG4gICAgICovXG4gICAgQ2FudmFzLnByb3RvdHlwZS5zZXRDdXJzb3IgPSBmdW5jdGlvbiAoY3Vyc29yKSB7XG4gICAgICAgIHRoaXMuc2V0KCdjdXJzb3InLCBjdXJzb3IpO1xuICAgICAgICB2YXIgZWwgPSB0aGlzLmdldCgnZWwnKTtcbiAgICAgICAgaWYgKGlzQnJvd3NlciAmJiBlbCkge1xuICAgICAgICAgICAgLy8g55u05o6l6K6+572u5qC35byP77yM5LiN562J5b6F6byg5qCH56e75Yqo5pe25YaN6K6+572uXG4gICAgICAgICAgICBlbC5zdHlsZS5jdXJzb3IgPSBjdXJzb3I7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8vIOWunueOsOaOpeWPo1xuICAgIENhbnZhcy5wcm90b3R5cGUuZ2V0UG9pbnRCeUV2ZW50ID0gZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgIHZhciBzdXBwb3J0Q1NTVHJhbnNmb3JtID0gdGhpcy5nZXQoJ3N1cHBvcnRDU1NUcmFuc2Zvcm0nKTtcbiAgICAgICAgaWYgKHN1cHBvcnRDU1NUcmFuc2Zvcm0pIHtcbiAgICAgICAgICAgIC8vIEZvciBGaXJlZm94IDw9IDM4XG4gICAgICAgICAgICBpZiAoaXNGaXJlZm94ICYmICFpc05pbChldi5sYXllclgpICYmIGV2LmxheWVyWCAhPT0gZXYub2Zmc2V0WCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHg6IGV2LmxheWVyWCxcbiAgICAgICAgICAgICAgICAgICAgeTogZXYubGF5ZXJZLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWlzTmlsKGV2Lm9mZnNldFgpKSB7XG4gICAgICAgICAgICAgICAgLy8gRm9yIElFNissIEZpcmVmb3ggPj0gMzksIENocm9tZSwgU2FmYXJpLCBPcGVyYVxuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHg6IGV2Lm9mZnNldFgsXG4gICAgICAgICAgICAgICAgICAgIHk6IGV2Lm9mZnNldFksXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBzaG91bGQgY2FsY3VsYXRlIGJ5IHNlbGYgZm9yIG90aGVyIGNhc2VzLCBsaWtlIFNhZmFyaSBpbiBpb3NcbiAgICAgICAgLy8gVE9ETzogc3VwcG9ydCBDU1MgdHJhbnNmb3JtXG4gICAgICAgIHZhciBfYSA9IHRoaXMuZ2V0Q2xpZW50QnlFdmVudChldiksIGNsaWVudFggPSBfYS54LCBjbGllbnRZID0gX2EueTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UG9pbnRCeUNsaWVudChjbGllbnRYLCBjbGllbnRZKTtcbiAgICB9O1xuICAgIC8vIOiOt+WPliB0b3VjaCDkuovku7bnmoQgY2xpZW50WCDlkowgY2xpZW50WSDpnIDopoHljZXni6zlpITnkIZcbiAgICBDYW52YXMucHJvdG90eXBlLmdldENsaWVudEJ5RXZlbnQgPSBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgdmFyIGNsaWVudEluZm8gPSBldjtcbiAgICAgICAgaWYgKGV2LnRvdWNoZXMpIHtcbiAgICAgICAgICAgIGlmIChldi50eXBlID09PSAndG91Y2hlbmQnKSB7XG4gICAgICAgICAgICAgICAgY2xpZW50SW5mbyA9IGV2LmNoYW5nZWRUb3VjaGVzWzBdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY2xpZW50SW5mbyA9IGV2LnRvdWNoZXNbMF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHg6IGNsaWVudEluZm8uY2xpZW50WCxcbiAgICAgICAgICAgIHk6IGNsaWVudEluZm8uY2xpZW50WSxcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIC8vIOWunueOsOaOpeWPo1xuICAgIENhbnZhcy5wcm90b3R5cGUuZ2V0UG9pbnRCeUNsaWVudCA9IGZ1bmN0aW9uIChjbGllbnRYLCBjbGllbnRZKSB7XG4gICAgICAgIHZhciBlbCA9IHRoaXMuZ2V0KCdlbCcpO1xuICAgICAgICB2YXIgYmJveCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeDogY2xpZW50WCAtIGJib3gubGVmdCxcbiAgICAgICAgICAgIHk6IGNsaWVudFkgLSBiYm94LnRvcCxcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIC8vIOWunueOsOaOpeWPo1xuICAgIENhbnZhcy5wcm90b3R5cGUuZ2V0Q2xpZW50QnlQb2ludCA9IGZ1bmN0aW9uICh4LCB5KSB7XG4gICAgICAgIHZhciBlbCA9IHRoaXMuZ2V0KCdlbCcpO1xuICAgICAgICB2YXIgYmJveCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeDogeCArIGJib3gubGVmdCxcbiAgICAgICAgICAgIHk6IHkgKyBiYm94LnRvcCxcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIC8vIOWunueOsOaOpeWPo1xuICAgIENhbnZhcy5wcm90b3R5cGUuZHJhdyA9IGZ1bmN0aW9uICgpIHsgfTtcbiAgICAvKipcbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICog6ZSA5q+BIERPTSDlrrnlmahcbiAgICAgKi9cbiAgICBDYW52YXMucHJvdG90eXBlLnJlbW92ZURvbSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGVsID0gdGhpcy5nZXQoJ2VsJyk7XG4gICAgICAgIGVsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZWwpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqIOa4heeQhuaJgOacieeahOS6i+S7tlxuICAgICAqL1xuICAgIENhbnZhcy5wcm90b3R5cGUuY2xlYXJFdmVudHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBldmVudENvbnRyb2xsZXIgPSB0aGlzLmdldCgnZXZlbnRDb250cm9sbGVyJyk7XG4gICAgICAgIGV2ZW50Q29udHJvbGxlci5kZXN0cm95KCk7XG4gICAgfTtcbiAgICBDYW52YXMucHJvdG90eXBlLmlzQ2FudmFzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuICAgIENhbnZhcy5wcm90b3R5cGUuZ2V0UGFyZW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICAgIENhbnZhcy5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHRpbWVsaW5lID0gdGhpcy5nZXQoJ3RpbWVsaW5lJyk7XG4gICAgICAgIGlmICh0aGlzLmdldCgnZGVzdHJveWVkJykpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICAgIC8vIOWQjOWIneWni+WMluaXtuebuOWPjemhuuW6j+iwg+eUqFxuICAgICAgICBpZiAodGltZWxpbmUpIHtcbiAgICAgICAgICAgIC8vIOeUu+W4g+mUgOavgeaXtuiHquWKqOWBnOatouWKqOeUu1xuICAgICAgICAgICAgdGltZWxpbmUuc3RvcCgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2xlYXJFdmVudHMoKTtcbiAgICAgICAgdGhpcy5yZW1vdmVEb20oKTtcbiAgICAgICAgX3N1cGVyLnByb3RvdHlwZS5kZXN0cm95LmNhbGwodGhpcyk7XG4gICAgfTtcbiAgICByZXR1cm4gQ2FudmFzO1xufShDb250YWluZXIpKTtcbmV4cG9ydCBkZWZhdWx0IENhbnZhcztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNhbnZhcy5qcy5tYXAiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///275\n')},function(module,__webpack_exports__,__webpack_require__){"use strict";eval("\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, \"a\", function() { return /* reexport */ getMethod; });\n\n// CONCATENATED MODULE: ./node_modules/@antv/g-base/esm/bbox/register.js\nvar cache = new Map();\n/**\n * 注册计算包围盒的算法\n * @param type 方法名\n * @param method 方法\n */\nfunction register(type, method) {\n cache.set(type, method);\n}\n/**\n * 获取计算包围盒的算法\n * @param type 方法名\n */\nfunction getMethod(type) {\n return cache.get(type);\n}\n//# sourceMappingURL=register.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-base/esm/bbox/rect.js\n/* harmony default export */ var rect = (function (shape) {\n var attrs = shape.attr();\n var x = attrs.x, y = attrs.y, width = attrs.width, height = attrs.height;\n return {\n x: x,\n y: y,\n width: width,\n height: height,\n };\n});\n//# sourceMappingURL=rect.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-base/esm/bbox/circle.js\n/* harmony default export */ var circle = (function (shape) {\n var _a = shape.attr(), x = _a.x, y = _a.y, r = _a.r;\n return {\n x: x - r,\n y: y - r,\n width: r * 2,\n height: r * 2,\n };\n});\n//# sourceMappingURL=circle.js.map\n// EXTERNAL MODULE: ./node_modules/@antv/g-math/esm/index.js + 10 modules\nvar esm = __webpack_require__(20);\n\n// CONCATENATED MODULE: ./node_modules/@antv/g-base/esm/bbox/util.js\n// 合并包围盒\nfunction mergeBBox(bbox1, bbox2) {\n if (!bbox1 || !bbox2) {\n return bbox1 || bbox2;\n }\n return {\n minX: Math.min(bbox1.minX, bbox2.minX),\n minY: Math.min(bbox1.minY, bbox2.minY),\n maxX: Math.max(bbox1.maxX, bbox2.maxX),\n maxY: Math.max(bbox1.maxY, bbox2.maxY),\n };\n}\n// 合并箭头的包围盒\nfunction mergeArrowBBox(shape, bbox) {\n var startArrowShape = shape.get('startArrowShape');\n var endArrowShape = shape.get('endArrowShape');\n var startArrowBBox = null;\n var endArrowBBox = null;\n if (startArrowShape) {\n startArrowBBox = startArrowShape.getCanvasBBox();\n bbox = mergeBBox(bbox, startArrowBBox);\n }\n if (endArrowShape) {\n endArrowBBox = endArrowShape.getCanvasBBox();\n bbox = mergeBBox(bbox, endArrowBBox);\n }\n return bbox;\n}\n//# sourceMappingURL=util.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-base/esm/bbox/polyline.js\n\n\n/* harmony default export */ var polyline = (function (shape) {\n var attrs = shape.attr();\n var points = attrs.points;\n var xArr = [];\n var yArr = [];\n for (var i = 0; i < points.length; i++) {\n var point = points[i];\n xArr.push(point[0]);\n yArr.push(point[1]);\n }\n var _a = esm[\"f\" /* Util */].getBBoxByArray(xArr, yArr), x = _a.x, y = _a.y, width = _a.width, height = _a.height;\n var bbox = {\n minX: x,\n minY: y,\n maxX: x + width,\n maxY: y + height,\n };\n bbox = mergeArrowBBox(shape, bbox);\n return {\n x: bbox.minX,\n y: bbox.minY,\n width: bbox.maxX - bbox.minX,\n height: bbox.maxY - bbox.minY,\n };\n});\n//# sourceMappingURL=polyline.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-base/esm/bbox/polygon.js\n\n/* harmony default export */ var polygon = (function (shape) {\n var attrs = shape.attr();\n var points = attrs.points;\n var xArr = [];\n var yArr = [];\n for (var i = 0; i < points.length; i++) {\n var point = points[i];\n xArr.push(point[0]);\n yArr.push(point[1]);\n }\n return esm[\"f\" /* Util */].getBBoxByArray(xArr, yArr);\n});\n//# sourceMappingURL=polygon.js.map\n// EXTERNAL MODULE: ./node_modules/@antv/g-base/esm/util/text.js\nvar util_text = __webpack_require__(69);\n\n// CONCATENATED MODULE: ./node_modules/@antv/g-base/esm/bbox/text.js\n\n/* harmony default export */ var bbox_text = (function (shape) {\n var attrs = shape.attr();\n var x = attrs.x, y = attrs.y, text = attrs.text, fontSize = attrs.fontSize, lineHeight = attrs.lineHeight;\n var font = attrs.font;\n if (!font) {\n // 如果未组装 font\n font = Object(util_text[\"a\" /* assembleFont */])(attrs);\n }\n var width = Object(util_text[\"c\" /* getTextWidth */])(text, font);\n var bbox;\n if (!width) {\n // 如果width不存在,四点共其实点\n bbox = {\n x: x,\n y: y,\n width: 0,\n height: 0,\n };\n }\n else {\n var textAlign = attrs.textAlign, textBaseline = attrs.textBaseline;\n var height = Object(util_text[\"b\" /* getTextHeight */])(text, fontSize, lineHeight); // attrs.height\n // 默认左右对齐:left, 默认上下对齐 bottom\n var point = {\n x: x,\n y: y - height,\n };\n if (textAlign) {\n if (textAlign === 'end' || textAlign === 'right') {\n point.x -= width;\n }\n else if (textAlign === 'center') {\n point.x -= width / 2;\n }\n }\n if (textBaseline) {\n if (textBaseline === 'top') {\n point.y += height;\n }\n else if (textBaseline === 'middle') {\n point.y += height / 2;\n }\n }\n bbox = {\n x: point.x,\n y: point.y,\n width: width,\n height: height,\n };\n }\n return bbox;\n});\n//# sourceMappingURL=text.js.map\n// EXTERNAL MODULE: ./node_modules/@antv/path-util/esm/index.js + 22 modules\nvar path_util_esm = __webpack_require__(37);\n\n// EXTERNAL MODULE: ./node_modules/@antv/util/esm/index.js + 110 modules\nvar util_esm = __webpack_require__(0);\n\n// CONCATENATED MODULE: ./node_modules/@antv/g-base/esm/bbox/path.js\n\n\n\n\nfunction getPathBox(segments, lineWidth) {\n var xArr = [];\n var yArr = [];\n var segmentsWithAngle = [];\n for (var i = 0; i < segments.length; i++) {\n var segment = segments[i];\n var currentPoint = segment.currentPoint, params = segment.params, prePoint = segment.prePoint;\n var box = void 0;\n switch (segment.command) {\n case 'Q':\n box = esm[\"e\" /* Quad */].box(prePoint[0], prePoint[1], params[1], params[2], params[3], params[4]);\n break;\n case 'C':\n box = esm[\"b\" /* Cubic */].box(prePoint[0], prePoint[1], params[1], params[2], params[3], params[4], params[5], params[6]);\n break;\n case 'A':\n var arcParams = segment.arcParams;\n box = esm[\"a\" /* Arc */].box(arcParams.cx, arcParams.cy, arcParams.rx, arcParams.ry, arcParams.xRotation, arcParams.startAngle, arcParams.endAngle);\n break;\n default:\n xArr.push(currentPoint[0]);\n yArr.push(currentPoint[1]);\n break;\n }\n if (box) {\n segment.box = box;\n xArr.push(box.x, box.x + box.width);\n yArr.push(box.y, box.y + box.height);\n }\n if (lineWidth && (segment.command === 'L' || segment.command === 'M') && segment.prePoint && segment.nextPoint) {\n segmentsWithAngle.push(segment);\n }\n }\n // bbox calculation should ignore NaN for path attribute\n // ref: https://github.com/antvis/g/issues/210\n xArr = xArr.filter(function (item) { return !Number.isNaN(item); });\n yArr = yArr.filter(function (item) { return !Number.isNaN(item); });\n var minX = Object(util_esm[\"min\"])(xArr);\n var minY = Object(util_esm[\"min\"])(yArr);\n var maxX = Object(util_esm[\"max\"])(xArr);\n var maxY = Object(util_esm[\"max\"])(yArr);\n if (segmentsWithAngle.length === 0) {\n return {\n x: minX,\n y: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n }\n for (var i = 0; i < segmentsWithAngle.length; i++) {\n var segment = segmentsWithAngle[i];\n var currentPoint = segment.currentPoint;\n var extra = void 0;\n if (currentPoint[0] === minX) {\n extra = getExtraFromSegmentWithAngle(segment, lineWidth);\n minX = minX - extra.xExtra;\n }\n else if (currentPoint[0] === maxX) {\n extra = getExtraFromSegmentWithAngle(segment, lineWidth);\n maxX = maxX + extra.xExtra;\n }\n if (currentPoint[1] === minY) {\n extra = getExtraFromSegmentWithAngle(segment, lineWidth);\n minY = minY - extra.yExtra;\n }\n else if (currentPoint[1] === maxY) {\n extra = getExtraFromSegmentWithAngle(segment, lineWidth);\n maxY = maxY + extra.yExtra;\n }\n }\n return {\n x: minX,\n y: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n}\nfunction getExtraFromSegmentWithAngle(segment, lineWidth) {\n var prePoint = segment.prePoint, currentPoint = segment.currentPoint, nextPoint = segment.nextPoint;\n var currentAndPre = Math.pow(currentPoint[0] - prePoint[0], 2) + Math.pow(currentPoint[1] - prePoint[1], 2);\n var currentAndNext = Math.pow(currentPoint[0] - nextPoint[0], 2) + Math.pow(currentPoint[1] - nextPoint[1], 2);\n var preAndNext = Math.pow(prePoint[0] - nextPoint[0], 2) + Math.pow(prePoint[1] - nextPoint[1], 2);\n // 以 currentPoint 为顶点的夹角\n var currentAngle = Math.acos((currentAndPre + currentAndNext - preAndNext) / (2 * Math.sqrt(currentAndPre) * Math.sqrt(currentAndNext)));\n // 夹角为空、 0 或 PI 时,不需要计算夹角处的额外宽度\n // 注意: 由于计算精度问题,夹角为 0 的情况计算出来的角度可能是一个很小的值,还需要判断其与 0 是否近似相等\n if (!currentAngle || Math.sin(currentAngle) === 0 || Object(util_esm[\"isNumberEqual\"])(currentAngle, 0)) {\n return {\n xExtra: 0,\n yExtra: 0,\n };\n }\n var xAngle = Math.abs(Math.atan2(nextPoint[1] - currentPoint[1], nextPoint[0] - currentPoint[0]));\n var yAngle = Math.abs(Math.atan2(nextPoint[0] - currentPoint[0], nextPoint[1] - currentPoint[1]));\n // 将夹角转为锐角\n xAngle = xAngle > Math.PI / 2 ? Math.PI - xAngle : xAngle;\n yAngle = yAngle > Math.PI / 2 ? Math.PI - yAngle : yAngle;\n // 这里不考虑在水平和垂直方向的投影,直接使用最大差值\n // 由于上层统一加减了二分之一线宽,这里需要进行弥补\n var extra = {\n // 水平方向投影\n xExtra: Math.cos(currentAngle / 2 - xAngle) * ((lineWidth / 2) * (1 / Math.sin(currentAngle / 2))) - lineWidth / 2 || 0,\n // 垂直方向投影\n yExtra: Math.cos(yAngle - currentAngle / 2) * ((lineWidth / 2) * (1 / Math.sin(currentAngle / 2))) - lineWidth / 2 || 0,\n };\n return extra;\n}\n/* harmony default export */ var bbox_path = (function (shape) {\n var attrs = shape.attr();\n var path = attrs.path, stroke = attrs.stroke;\n var lineWidth = stroke ? attrs.lineWidth : 0; // 只有有 stroke 时,lineWidth 才生效\n var segments = shape.get('segments') || Object(path_util_esm[\"d\" /* path2Segments */])(path);\n var _a = getPathBox(segments, lineWidth), x = _a.x, y = _a.y, width = _a.width, height = _a.height;\n var bbox = {\n minX: x,\n minY: y,\n maxX: x + width,\n maxY: y + height,\n };\n bbox = mergeArrowBBox(shape, bbox);\n return {\n x: bbox.minX,\n y: bbox.minY,\n width: bbox.maxX - bbox.minX,\n height: bbox.maxY - bbox.minY,\n };\n});\n//# sourceMappingURL=path.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-base/esm/bbox/line.js\n\n/* harmony default export */ var line = (function (shape) {\n var attrs = shape.attr();\n var x1 = attrs.x1, y1 = attrs.y1, x2 = attrs.x2, y2 = attrs.y2;\n var minX = Math.min(x1, x2);\n var maxX = Math.max(x1, x2);\n var minY = Math.min(y1, y2);\n var maxY = Math.max(y1, y2);\n var bbox = {\n minX: minX,\n maxX: maxX,\n minY: minY,\n maxY: maxY,\n };\n bbox = mergeArrowBBox(shape, bbox);\n return {\n x: bbox.minX,\n y: bbox.minY,\n width: bbox.maxX - bbox.minX,\n height: bbox.maxY - bbox.minY,\n };\n});\n//# sourceMappingURL=line.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-base/esm/bbox/ellipse.js\n/* harmony default export */ var ellipse = (function (shape) {\n var attrs = shape.attr();\n var x = attrs.x, y = attrs.y, rx = attrs.rx, ry = attrs.ry;\n return {\n x: x - rx,\n y: y - ry,\n width: rx * 2,\n height: ry * 2,\n };\n});\n//# sourceMappingURL=ellipse.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-base/esm/bbox/index.js\n\n\n\n\n\n\n\n\n\nregister('rect', rect);\nregister('image', rect); // image 使用 rect 的包围盒计算\nregister('circle', circle);\nregister('marker', circle); // marker 使用 circle 的计算方案\nregister('polyline', polyline);\nregister('polygon', polygon);\nregister('text', bbox_text);\nregister('path', bbox_path);\nregister('line', line);\nregister('ellipse', ellipse);\n\n//# sourceMappingURL=index.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy1iYXNlL2VzbS9iYm94L3JlZ2lzdGVyLmpzP2NmZDYiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2ctYmFzZS9lc20vYmJveC9yZWN0LmpzPzFiNTciLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2ctYmFzZS9lc20vYmJveC9jaXJjbGUuanM/NzUyYyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy1iYXNlL2VzbS9iYm94L3V0aWwuanM/NjhhOCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy1iYXNlL2VzbS9iYm94L3BvbHlsaW5lLmpzP2Y3MDciLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2ctYmFzZS9lc20vYmJveC9wb2x5Z29uLmpzP2MxMmMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2ctYmFzZS9lc20vYmJveC90ZXh0LmpzPzVmYWYiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2ctYmFzZS9lc20vYmJveC9wYXRoLmpzP2I3MGIiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2ctYmFzZS9lc20vYmJveC9saW5lLmpzPzU0NzkiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2ctYmFzZS9lc20vYmJveC9lbGxpcHNlLmpzPzQxZjUiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2ctYmFzZS9lc20vYmJveC9pbmRleC5qcz9kNGM2Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQSxvQzs7QUNoQmU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxjQUFjO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRCxnQzs7QUN0QmU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELG1DOztBQ1ZpRDtBQUN2QjtBQUNJO0FBQ0k7QUFDRjtBQUNOO0FBQ0E7QUFDQTtBQUNNO0FBQ2hDLFFBQVEsU0FBUyxJQUFJO0FBQ3JCLFFBQVEsVUFBVSxJQUFJLEVBQUU7QUFDeEIsUUFBUSxXQUFXLE1BQU07QUFDekIsUUFBUSxXQUFXLE1BQU0sRUFBRTtBQUMzQixRQUFRLGFBQWEsUUFBUTtBQUM3QixRQUFRLFlBQVksT0FBTztBQUMzQixRQUFRLFNBQVMsU0FBSTtBQUNyQixRQUFRLFNBQVMsU0FBSTtBQUNyQixRQUFRLFNBQVMsSUFBSTtBQUNyQixRQUFRLFlBQVksT0FBTztBQUNXO0FBQ3RDIiwiZmlsZSI6IjI3Ni5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBjYWNoZSA9IG5ldyBNYXAoKTtcbi8qKlxuICog5rOo5YaM6K6h566X5YyF5Zu055uS55qE566X5rOVXG4gKiBAcGFyYW0gdHlwZSDmlrnms5XlkI1cbiAqIEBwYXJhbSBtZXRob2Qg5pa55rOVXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3Rlcih0eXBlLCBtZXRob2QpIHtcbiAgICBjYWNoZS5zZXQodHlwZSwgbWV0aG9kKTtcbn1cbi8qKlxuICog6I635Y+W6K6h566X5YyF5Zu055uS55qE566X5rOVXG4gKiBAcGFyYW0gdHlwZSDmlrnms5XlkI1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE1ldGhvZCh0eXBlKSB7XG4gICAgcmV0dXJuIGNhY2hlLmdldCh0eXBlKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJlZ2lzdGVyLmpzLm1hcCIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIChzaGFwZSkge1xuICAgIHZhciBhdHRycyA9IHNoYXBlLmF0dHIoKTtcbiAgICB2YXIgeCA9IGF0dHJzLngsIHkgPSBhdHRycy55LCB3aWR0aCA9IGF0dHJzLndpZHRoLCBoZWlnaHQgPSBhdHRycy5oZWlnaHQ7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgeDogeCxcbiAgICAgICAgeTogeSxcbiAgICAgICAgd2lkdGg6IHdpZHRoLFxuICAgICAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmVjdC5qcy5tYXAiLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAoc2hhcGUpIHtcbiAgICB2YXIgX2EgPSBzaGFwZS5hdHRyKCksIHggPSBfYS54LCB5ID0gX2EueSwgciA9IF9hLnI7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgeDogeCAtIHIsXG4gICAgICAgIHk6IHkgLSByLFxuICAgICAgICB3aWR0aDogciAqIDIsXG4gICAgICAgIGhlaWdodDogciAqIDIsXG4gICAgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNpcmNsZS5qcy5tYXAiLCIvLyDlkIjlubbljIXlm7Tnm5JcbmV4cG9ydCBmdW5jdGlvbiBtZXJnZUJCb3goYmJveDEsIGJib3gyKSB7XG4gICAgaWYgKCFiYm94MSB8fCAhYmJveDIpIHtcbiAgICAgICAgcmV0dXJuIGJib3gxIHx8IGJib3gyO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBtaW5YOiBNYXRoLm1pbihiYm94MS5taW5YLCBiYm94Mi5taW5YKSxcbiAgICAgICAgbWluWTogTWF0aC5taW4oYmJveDEubWluWSwgYmJveDIubWluWSksXG4gICAgICAgIG1heFg6IE1hdGgubWF4KGJib3gxLm1heFgsIGJib3gyLm1heFgpLFxuICAgICAgICBtYXhZOiBNYXRoLm1heChiYm94MS5tYXhZLCBiYm94Mi5tYXhZKSxcbiAgICB9O1xufVxuLy8g5ZCI5bm2566t5aS055qE5YyF5Zu055uSXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VBcnJvd0JCb3goc2hhcGUsIGJib3gpIHtcbiAgICB2YXIgc3RhcnRBcnJvd1NoYXBlID0gc2hhcGUuZ2V0KCdzdGFydEFycm93U2hhcGUnKTtcbiAgICB2YXIgZW5kQXJyb3dTaGFwZSA9IHNoYXBlLmdldCgnZW5kQXJyb3dTaGFwZScpO1xuICAgIHZhciBzdGFydEFycm93QkJveCA9IG51bGw7XG4gICAgdmFyIGVuZEFycm93QkJveCA9IG51bGw7XG4gICAgaWYgKHN0YXJ0QXJyb3dTaGFwZSkge1xuICAgICAgICBzdGFydEFycm93QkJveCA9IHN0YXJ0QXJyb3dTaGFwZS5nZXRDYW52YXNCQm94KCk7XG4gICAgICAgIGJib3ggPSBtZXJnZUJCb3goYmJveCwgc3RhcnRBcnJvd0JCb3gpO1xuICAgIH1cbiAgICBpZiAoZW5kQXJyb3dTaGFwZSkge1xuICAgICAgICBlbmRBcnJvd0JCb3ggPSBlbmRBcnJvd1NoYXBlLmdldENhbnZhc0JCb3goKTtcbiAgICAgICAgYmJveCA9IG1lcmdlQkJveChiYm94LCBlbmRBcnJvd0JCb3gpO1xuICAgIH1cbiAgICByZXR1cm4gYmJveDtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXV0aWwuanMubWFwIiwiaW1wb3J0IHsgVXRpbCB9IGZyb20gJ0BhbnR2L2ctbWF0aCc7XG5pbXBvcnQgeyBtZXJnZUFycm93QkJveCB9IGZyb20gJy4vdXRpbCc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAoc2hhcGUpIHtcbiAgICB2YXIgYXR0cnMgPSBzaGFwZS5hdHRyKCk7XG4gICAgdmFyIHBvaW50cyA9IGF0dHJzLnBvaW50cztcbiAgICB2YXIgeEFyciA9IFtdO1xuICAgIHZhciB5QXJyID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb2ludHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHBvaW50ID0gcG9pbnRzW2ldO1xuICAgICAgICB4QXJyLnB1c2gocG9pbnRbMF0pO1xuICAgICAgICB5QXJyLnB1c2gocG9pbnRbMV0pO1xuICAgIH1cbiAgICB2YXIgX2EgPSBVdGlsLmdldEJCb3hCeUFycmF5KHhBcnIsIHlBcnIpLCB4ID0gX2EueCwgeSA9IF9hLnksIHdpZHRoID0gX2Eud2lkdGgsIGhlaWdodCA9IF9hLmhlaWdodDtcbiAgICB2YXIgYmJveCA9IHtcbiAgICAgICAgbWluWDogeCxcbiAgICAgICAgbWluWTogeSxcbiAgICAgICAgbWF4WDogeCArIHdpZHRoLFxuICAgICAgICBtYXhZOiB5ICsgaGVpZ2h0LFxuICAgIH07XG4gICAgYmJveCA9IG1lcmdlQXJyb3dCQm94KHNoYXBlLCBiYm94KTtcbiAgICByZXR1cm4ge1xuICAgICAgICB4OiBiYm94Lm1pblgsXG4gICAgICAgIHk6IGJib3gubWluWSxcbiAgICAgICAgd2lkdGg6IGJib3gubWF4WCAtIGJib3gubWluWCxcbiAgICAgICAgaGVpZ2h0OiBiYm94Lm1heFkgLSBiYm94Lm1pblksXG4gICAgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBvbHlsaW5lLmpzLm1hcCIsImltcG9ydCB7IFV0aWwgfSBmcm9tICdAYW50di9nLW1hdGgnO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKHNoYXBlKSB7XG4gICAgdmFyIGF0dHJzID0gc2hhcGUuYXR0cigpO1xuICAgIHZhciBwb2ludHMgPSBhdHRycy5wb2ludHM7XG4gICAgdmFyIHhBcnIgPSBbXTtcbiAgICB2YXIgeUFyciA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcG9pbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBwb2ludCA9IHBvaW50c1tpXTtcbiAgICAgICAgeEFyci5wdXNoKHBvaW50WzBdKTtcbiAgICAgICAgeUFyci5wdXNoKHBvaW50WzFdKTtcbiAgICB9XG4gICAgcmV0dXJuIFV0aWwuZ2V0QkJveEJ5QXJyYXkoeEFyciwgeUFycik7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wb2x5Z29uLmpzLm1hcCIsImltcG9ydCB7IGdldFRleHRXaWR0aCwgZ2V0VGV4dEhlaWdodCwgYXNzZW1ibGVGb250IH0gZnJvbSAnLi4vdXRpbC90ZXh0JztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIChzaGFwZSkge1xuICAgIHZhciBhdHRycyA9IHNoYXBlLmF0dHIoKTtcbiAgICB2YXIgeCA9IGF0dHJzLngsIHkgPSBhdHRycy55LCB0ZXh0ID0gYXR0cnMudGV4dCwgZm9udFNpemUgPSBhdHRycy5mb250U2l6ZSwgbGluZUhlaWdodCA9IGF0dHJzLmxpbmVIZWlnaHQ7XG4gICAgdmFyIGZvbnQgPSBhdHRycy5mb250O1xuICAgIGlmICghZm9udCkge1xuICAgICAgICAvLyDlpoLmnpzmnKrnu4Too4UgZm9udFxuICAgICAgICBmb250ID0gYXNzZW1ibGVGb250KGF0dHJzKTtcbiAgICB9XG4gICAgdmFyIHdpZHRoID0gZ2V0VGV4dFdpZHRoKHRleHQsIGZvbnQpO1xuICAgIHZhciBiYm94O1xuICAgIGlmICghd2lkdGgpIHtcbiAgICAgICAgLy8g5aaC5p6cd2lkdGjkuI3lrZjlnKjvvIzlm5vngrnlhbHlhbblrp7ngrlcbiAgICAgICAgYmJveCA9IHtcbiAgICAgICAgICAgIHg6IHgsXG4gICAgICAgICAgICB5OiB5LFxuICAgICAgICAgICAgd2lkdGg6IDAsXG4gICAgICAgICAgICBoZWlnaHQ6IDAsXG4gICAgICAgIH07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB2YXIgdGV4dEFsaWduID0gYXR0cnMudGV4dEFsaWduLCB0ZXh0QmFzZWxpbmUgPSBhdHRycy50ZXh0QmFzZWxpbmU7XG4gICAgICAgIHZhciBoZWlnaHQgPSBnZXRUZXh0SGVpZ2h0KHRleHQsIGZvbnRTaXplLCBsaW5lSGVpZ2h0KTsgLy8gYXR0cnMuaGVpZ2h0XG4gICAgICAgIC8vIOm7mOiupOW3puWPs+Wvuem9kO+8mmxlZnQsIOm7mOiupOS4iuS4i+Wvuem9kCBib3R0b21cbiAgICAgICAgdmFyIHBvaW50ID0ge1xuICAgICAgICAgICAgeDogeCxcbiAgICAgICAgICAgIHk6IHkgLSBoZWlnaHQsXG4gICAgICAgIH07XG4gICAgICAgIGlmICh0ZXh0QWxpZ24pIHtcbiAgICAgICAgICAgIGlmICh0ZXh0QWxpZ24gPT09ICdlbmQnIHx8IHRleHRBbGlnbiA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICAgICAgICAgIHBvaW50LnggLT0gd2lkdGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0ZXh0QWxpZ24gPT09ICdjZW50ZXInKSB7XG4gICAgICAgICAgICAgICAgcG9pbnQueCAtPSB3aWR0aCAvIDI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRleHRCYXNlbGluZSkge1xuICAgICAgICAgICAgaWYgKHRleHRCYXNlbGluZSA9PT0gJ3RvcCcpIHtcbiAgICAgICAgICAgICAgICBwb2ludC55ICs9IGhlaWdodDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRleHRCYXNlbGluZSA9PT0gJ21pZGRsZScpIHtcbiAgICAgICAgICAgICAgICBwb2ludC55ICs9IGhlaWdodCAvIDI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYmJveCA9IHtcbiAgICAgICAgICAgIHg6IHBvaW50LngsXG4gICAgICAgICAgICB5OiBwb2ludC55LFxuICAgICAgICAgICAgd2lkdGg6IHdpZHRoLFxuICAgICAgICAgICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBiYm94O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGV4dC5qcy5tYXAiLCJpbXBvcnQgeyBRdWFkIGFzIFF1YWRVdGlsLCBDdWJpYyBhcyBDdWJpY1V0aWwsIEFyYyBhcyBFbGxpcHNlQXJjVXRpbCB9IGZyb20gJ0BhbnR2L2ctbWF0aCc7XG5pbXBvcnQgeyBwYXRoMlNlZ21lbnRzIH0gZnJvbSAnQGFudHYvcGF0aC11dGlsJztcbmltcG9ydCB7IGlzTnVtYmVyRXF1YWwsIG1heCwgbWluIH0gZnJvbSAnQGFudHYvdXRpbCc7XG5pbXBvcnQgeyBtZXJnZUFycm93QkJveCB9IGZyb20gJy4vdXRpbCc7XG5mdW5jdGlvbiBnZXRQYXRoQm94KHNlZ21lbnRzLCBsaW5lV2lkdGgpIHtcbiAgICB2YXIgeEFyciA9IFtdO1xuICAgIHZhciB5QXJyID0gW107XG4gICAgdmFyIHNlZ21lbnRzV2l0aEFuZ2xlID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWdtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgc2VnbWVudCA9IHNlZ21lbnRzW2ldO1xuICAgICAgICB2YXIgY3VycmVudFBvaW50ID0gc2VnbWVudC5jdXJyZW50UG9pbnQsIHBhcmFtcyA9IHNlZ21lbnQucGFyYW1zLCBwcmVQb2ludCA9IHNlZ21lbnQucHJlUG9pbnQ7XG4gICAgICAgIHZhciBib3ggPSB2b2lkIDA7XG4gICAgICAgIHN3aXRjaCAoc2VnbWVudC5jb21tYW5kKSB7XG4gICAgICAgICAgICBjYXNlICdRJzpcbiAgICAgICAgICAgICAgICBib3ggPSBRdWFkVXRpbC5ib3gocHJlUG9pbnRbMF0sIHByZVBvaW50WzFdLCBwYXJhbXNbMV0sIHBhcmFtc1syXSwgcGFyYW1zWzNdLCBwYXJhbXNbNF0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnQyc6XG4gICAgICAgICAgICAgICAgYm94ID0gQ3ViaWNVdGlsLmJveChwcmVQb2ludFswXSwgcHJlUG9pbnRbMV0sIHBhcmFtc1sxXSwgcGFyYW1zWzJdLCBwYXJhbXNbM10sIHBhcmFtc1s0XSwgcGFyYW1zWzVdLCBwYXJhbXNbNl0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnQSc6XG4gICAgICAgICAgICAgICAgdmFyIGFyY1BhcmFtcyA9IHNlZ21lbnQuYXJjUGFyYW1zO1xuICAgICAgICAgICAgICAgIGJveCA9IEVsbGlwc2VBcmNVdGlsLmJveChhcmNQYXJhbXMuY3gsIGFyY1BhcmFtcy5jeSwgYXJjUGFyYW1zLnJ4LCBhcmNQYXJhbXMucnksIGFyY1BhcmFtcy54Um90YXRpb24sIGFyY1BhcmFtcy5zdGFydEFuZ2xlLCBhcmNQYXJhbXMuZW5kQW5nbGUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB4QXJyLnB1c2goY3VycmVudFBvaW50WzBdKTtcbiAgICAgICAgICAgICAgICB5QXJyLnB1c2goY3VycmVudFBvaW50WzFdKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAoYm94KSB7XG4gICAgICAgICAgICBzZWdtZW50LmJveCA9IGJveDtcbiAgICAgICAgICAgIHhBcnIucHVzaChib3gueCwgYm94LnggKyBib3gud2lkdGgpO1xuICAgICAgICAgICAgeUFyci5wdXNoKGJveC55LCBib3gueSArIGJveC5oZWlnaHQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsaW5lV2lkdGggJiYgKHNlZ21lbnQuY29tbWFuZCA9PT0gJ0wnIHx8IHNlZ21lbnQuY29tbWFuZCA9PT0gJ00nKSAmJiBzZWdtZW50LnByZVBvaW50ICYmIHNlZ21lbnQubmV4dFBvaW50KSB7XG4gICAgICAgICAgICBzZWdtZW50c1dpdGhBbmdsZS5wdXNoKHNlZ21lbnQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIGJib3ggY2FsY3VsYXRpb24gc2hvdWxkIGlnbm9yZSBOYU4gZm9yIHBhdGggYXR0cmlidXRlXG4gICAgLy8gcmVmOiBodHRwczovL2dpdGh1Yi5jb20vYW50dmlzL2cvaXNzdWVzLzIxMFxuICAgIHhBcnIgPSB4QXJyLmZpbHRlcihmdW5jdGlvbiAoaXRlbSkgeyByZXR1cm4gIU51bWJlci5pc05hTihpdGVtKTsgfSk7XG4gICAgeUFyciA9IHlBcnIuZmlsdGVyKGZ1bmN0aW9uIChpdGVtKSB7IHJldHVybiAhTnVtYmVyLmlzTmFOKGl0ZW0pOyB9KTtcbiAgICB2YXIgbWluWCA9IG1pbih4QXJyKTtcbiAgICB2YXIgbWluWSA9IG1pbih5QXJyKTtcbiAgICB2YXIgbWF4WCA9IG1heCh4QXJyKTtcbiAgICB2YXIgbWF4WSA9IG1heCh5QXJyKTtcbiAgICBpZiAoc2VnbWVudHNXaXRoQW5nbGUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB4OiBtaW5YLFxuICAgICAgICAgICAgeTogbWluWSxcbiAgICAgICAgICAgIHdpZHRoOiBtYXhYIC0gbWluWCxcbiAgICAgICAgICAgIGhlaWdodDogbWF4WSAtIG1pblksXG4gICAgICAgIH07XG4gICAgfVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VnbWVudHNXaXRoQW5nbGUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHNlZ21lbnQgPSBzZWdtZW50c1dpdGhBbmdsZVtpXTtcbiAgICAgICAgdmFyIGN1cnJlbnRQb2ludCA9IHNlZ21lbnQuY3VycmVudFBvaW50O1xuICAgICAgICB2YXIgZXh0cmEgPSB2b2lkIDA7XG4gICAgICAgIGlmIChjdXJyZW50UG9pbnRbMF0gPT09IG1pblgpIHtcbiAgICAgICAgICAgIGV4dHJhID0gZ2V0RXh0cmFGcm9tU2VnbWVudFdpdGhBbmdsZShzZWdtZW50LCBsaW5lV2lkdGgpO1xuICAgICAgICAgICAgbWluWCA9IG1pblggLSBleHRyYS54RXh0cmE7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY3VycmVudFBvaW50WzBdID09PSBtYXhYKSB7XG4gICAgICAgICAgICBleHRyYSA9IGdldEV4dHJhRnJvbVNlZ21lbnRXaXRoQW5nbGUoc2VnbWVudCwgbGluZVdpZHRoKTtcbiAgICAgICAgICAgIG1heFggPSBtYXhYICsgZXh0cmEueEV4dHJhO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjdXJyZW50UG9pbnRbMV0gPT09IG1pblkpIHtcbiAgICAgICAgICAgIGV4dHJhID0gZ2V0RXh0cmFGcm9tU2VnbWVudFdpdGhBbmdsZShzZWdtZW50LCBsaW5lV2lkdGgpO1xuICAgICAgICAgICAgbWluWSA9IG1pblkgLSBleHRyYS55RXh0cmE7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY3VycmVudFBvaW50WzFdID09PSBtYXhZKSB7XG4gICAgICAgICAgICBleHRyYSA9IGdldEV4dHJhRnJvbVNlZ21lbnRXaXRoQW5nbGUoc2VnbWVudCwgbGluZVdpZHRoKTtcbiAgICAgICAgICAgIG1heFkgPSBtYXhZICsgZXh0cmEueUV4dHJhO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIHg6IG1pblgsXG4gICAgICAgIHk6IG1pblksXG4gICAgICAgIHdpZHRoOiBtYXhYIC0gbWluWCxcbiAgICAgICAgaGVpZ2h0OiBtYXhZIC0gbWluWSxcbiAgICB9O1xufVxuZnVuY3Rpb24gZ2V0RXh0cmFGcm9tU2VnbWVudFdpdGhBbmdsZShzZWdtZW50LCBsaW5lV2lkdGgpIHtcbiAgICB2YXIgcHJlUG9pbnQgPSBzZWdtZW50LnByZVBvaW50LCBjdXJyZW50UG9pbnQgPSBzZWdtZW50LmN1cnJlbnRQb2ludCwgbmV4dFBvaW50ID0gc2VnbWVudC5uZXh0UG9pbnQ7XG4gICAgdmFyIGN1cnJlbnRBbmRQcmUgPSBNYXRoLnBvdyhjdXJyZW50UG9pbnRbMF0gLSBwcmVQb2ludFswXSwgMikgKyBNYXRoLnBvdyhjdXJyZW50UG9pbnRbMV0gLSBwcmVQb2ludFsxXSwgMik7XG4gICAgdmFyIGN1cnJlbnRBbmROZXh0ID0gTWF0aC5wb3coY3VycmVudFBvaW50WzBdIC0gbmV4dFBvaW50WzBdLCAyKSArIE1hdGgucG93KGN1cnJlbnRQb2ludFsxXSAtIG5leHRQb2ludFsxXSwgMik7XG4gICAgdmFyIHByZUFuZE5leHQgPSBNYXRoLnBvdyhwcmVQb2ludFswXSAtIG5leHRQb2ludFswXSwgMikgKyBNYXRoLnBvdyhwcmVQb2ludFsxXSAtIG5leHRQb2ludFsxXSwgMik7XG4gICAgLy8g5LulIGN1cnJlbnRQb2ludCDkuLrpobbngrnnmoTlpLnop5JcbiAgICB2YXIgY3VycmVudEFuZ2xlID0gTWF0aC5hY29zKChjdXJyZW50QW5kUHJlICsgY3VycmVudEFuZE5leHQgLSBwcmVBbmROZXh0KSAvICgyICogTWF0aC5zcXJ0KGN1cnJlbnRBbmRQcmUpICogTWF0aC5zcXJ0KGN1cnJlbnRBbmROZXh0KSkpO1xuICAgIC8vIOWkueinkuS4uuepuuOAgSAwIOaIliBQSSDml7bvvIzkuI3pnIDopoHorqHnrpflpLnop5LlpITnmoTpop3lpJblrr3luqZcbiAgICAvLyDms6jmhI86IOeUseS6juiuoeeul+eyvuW6pumXrumimO+8jOWkueinkuS4uiAwIOeahOaDheWGteiuoeeul+WHuuadpeeahOinkuW6puWPr+iDveaYr+S4gOS4quW+iOWwj+eahOWAvO+8jOi/mOmcgOimgeWIpOaWreWFtuS4jiAwIOaYr+WQpui/keS8vOebuOetiVxuICAgIGlmICghY3VycmVudEFuZ2xlIHx8IE1hdGguc2luKGN1cnJlbnRBbmdsZSkgPT09IDAgfHwgaXNOdW1iZXJFcXVhbChjdXJyZW50QW5nbGUsIDApKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB4RXh0cmE6IDAsXG4gICAgICAgICAgICB5RXh0cmE6IDAsXG4gICAgICAgIH07XG4gICAgfVxuICAgIHZhciB4QW5nbGUgPSBNYXRoLmFicyhNYXRoLmF0YW4yKG5leHRQb2ludFsxXSAtIGN1cnJlbnRQb2ludFsxXSwgbmV4dFBvaW50WzBdIC0gY3VycmVudFBvaW50WzBdKSk7XG4gICAgdmFyIHlBbmdsZSA9IE1hdGguYWJzKE1hdGguYXRhbjIobmV4dFBvaW50WzBdIC0gY3VycmVudFBvaW50WzBdLCBuZXh0UG9pbnRbMV0gLSBjdXJyZW50UG9pbnRbMV0pKTtcbiAgICAvLyDlsIblpLnop5LovazkuLrplJDop5JcbiAgICB4QW5nbGUgPSB4QW5nbGUgPiBNYXRoLlBJIC8gMiA/IE1hdGguUEkgLSB4QW5nbGUgOiB4QW5nbGU7XG4gICAgeUFuZ2xlID0geUFuZ2xlID4gTWF0aC5QSSAvIDIgPyBNYXRoLlBJIC0geUFuZ2xlIDogeUFuZ2xlO1xuICAgIC8vIOi/memHjOS4jeiAg+iZkeWcqOawtOW5s+WSjOWeguebtOaWueWQkeeahOaKleW9se+8jOebtOaOpeS9v+eUqOacgOWkp+W3ruWAvFxuICAgIC8vIOeUseS6juS4iuWxgue7n+S4gOWKoOWHj+S6huS6jOWIhuS5i+S4gOe6v+Wuve+8jOi/memHjOmcgOimgei/m+ihjOW8peihpVxuICAgIHZhciBleHRyYSA9IHtcbiAgICAgICAgLy8g5rC05bmz5pa55ZCR5oqV5b2xXG4gICAgICAgIHhFeHRyYTogTWF0aC5jb3MoY3VycmVudEFuZ2xlIC8gMiAtIHhBbmdsZSkgKiAoKGxpbmVXaWR0aCAvIDIpICogKDEgLyBNYXRoLnNpbihjdXJyZW50QW5nbGUgLyAyKSkpIC0gbGluZVdpZHRoIC8gMiB8fCAwLFxuICAgICAgICAvLyDlnoLnm7TmlrnlkJHmipXlvbFcbiAgICAgICAgeUV4dHJhOiBNYXRoLmNvcyh5QW5nbGUgLSBjdXJyZW50QW5nbGUgLyAyKSAqICgobGluZVdpZHRoIC8gMikgKiAoMSAvIE1hdGguc2luKGN1cnJlbnRBbmdsZSAvIDIpKSkgLSBsaW5lV2lkdGggLyAyIHx8IDAsXG4gICAgfTtcbiAgICByZXR1cm4gZXh0cmE7XG59XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAoc2hhcGUpIHtcbiAgICB2YXIgYXR0cnMgPSBzaGFwZS5hdHRyKCk7XG4gICAgdmFyIHBhdGggPSBhdHRycy5wYXRoLCBzdHJva2UgPSBhdHRycy5zdHJva2U7XG4gICAgdmFyIGxpbmVXaWR0aCA9IHN0cm9rZSA/IGF0dHJzLmxpbmVXaWR0aCA6IDA7IC8vIOWPquacieaciSBzdHJva2Ug5pe277yMbGluZVdpZHRoIOaJjeeUn+aViFxuICAgIHZhciBzZWdtZW50cyA9IHNoYXBlLmdldCgnc2VnbWVudHMnKSB8fCBwYXRoMlNlZ21lbnRzKHBhdGgpO1xuICAgIHZhciBfYSA9IGdldFBhdGhCb3goc2VnbWVudHMsIGxpbmVXaWR0aCksIHggPSBfYS54LCB5ID0gX2EueSwgd2lkdGggPSBfYS53aWR0aCwgaGVpZ2h0ID0gX2EuaGVpZ2h0O1xuICAgIHZhciBiYm94ID0ge1xuICAgICAgICBtaW5YOiB4LFxuICAgICAgICBtaW5ZOiB5LFxuICAgICAgICBtYXhYOiB4ICsgd2lkdGgsXG4gICAgICAgIG1heFk6IHkgKyBoZWlnaHQsXG4gICAgfTtcbiAgICBiYm94ID0gbWVyZ2VBcnJvd0JCb3goc2hhcGUsIGJib3gpO1xuICAgIHJldHVybiB7XG4gICAgICAgIHg6IGJib3gubWluWCxcbiAgICAgICAgeTogYmJveC5taW5ZLFxuICAgICAgICB3aWR0aDogYmJveC5tYXhYIC0gYmJveC5taW5YLFxuICAgICAgICBoZWlnaHQ6IGJib3gubWF4WSAtIGJib3gubWluWSxcbiAgICB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cGF0aC5qcy5tYXAiLCJpbXBvcnQgeyBtZXJnZUFycm93QkJveCB9IGZyb20gJy4vdXRpbCc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAoc2hhcGUpIHtcbiAgICB2YXIgYXR0cnMgPSBzaGFwZS5hdHRyKCk7XG4gICAgdmFyIHgxID0gYXR0cnMueDEsIHkxID0gYXR0cnMueTEsIHgyID0gYXR0cnMueDIsIHkyID0gYXR0cnMueTI7XG4gICAgdmFyIG1pblggPSBNYXRoLm1pbih4MSwgeDIpO1xuICAgIHZhciBtYXhYID0gTWF0aC5tYXgoeDEsIHgyKTtcbiAgICB2YXIgbWluWSA9IE1hdGgubWluKHkxLCB5Mik7XG4gICAgdmFyIG1heFkgPSBNYXRoLm1heCh5MSwgeTIpO1xuICAgIHZhciBiYm94ID0ge1xuICAgICAgICBtaW5YOiBtaW5YLFxuICAgICAgICBtYXhYOiBtYXhYLFxuICAgICAgICBtaW5ZOiBtaW5ZLFxuICAgICAgICBtYXhZOiBtYXhZLFxuICAgIH07XG4gICAgYmJveCA9IG1lcmdlQXJyb3dCQm94KHNoYXBlLCBiYm94KTtcbiAgICByZXR1cm4ge1xuICAgICAgICB4OiBiYm94Lm1pblgsXG4gICAgICAgIHk6IGJib3gubWluWSxcbiAgICAgICAgd2lkdGg6IGJib3gubWF4WCAtIGJib3gubWluWCxcbiAgICAgICAgaGVpZ2h0OiBiYm94Lm1heFkgLSBiYm94Lm1pblksXG4gICAgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWxpbmUuanMubWFwIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKHNoYXBlKSB7XG4gICAgdmFyIGF0dHJzID0gc2hhcGUuYXR0cigpO1xuICAgIHZhciB4ID0gYXR0cnMueCwgeSA9IGF0dHJzLnksIHJ4ID0gYXR0cnMucngsIHJ5ID0gYXR0cnMucnk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgeDogeCAtIHJ4LFxuICAgICAgICB5OiB5IC0gcnksXG4gICAgICAgIHdpZHRoOiByeCAqIDIsXG4gICAgICAgIGhlaWdodDogcnkgKiAyLFxuICAgIH07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1lbGxpcHNlLmpzLm1hcCIsImltcG9ydCB7IHJlZ2lzdGVyLCBnZXRNZXRob2QgfSBmcm9tICcuL3JlZ2lzdGVyJztcbmltcG9ydCByZWN0IGZyb20gJy4vcmVjdCc7XG5pbXBvcnQgY2lyY2xlIGZyb20gJy4vY2lyY2xlJztcbmltcG9ydCBwb2x5bGluZSBmcm9tICcuL3BvbHlsaW5lJztcbmltcG9ydCBwb2x5Z29uIGZyb20gJy4vcG9seWdvbic7XG5pbXBvcnQgdGV4dCBmcm9tICcuL3RleHQnO1xuaW1wb3J0IHBhdGggZnJvbSAnLi9wYXRoJztcbmltcG9ydCBsaW5lIGZyb20gJy4vbGluZSc7XG5pbXBvcnQgZWxsaXBzZSBmcm9tICcuL2VsbGlwc2UnO1xucmVnaXN0ZXIoJ3JlY3QnLCByZWN0KTtcbnJlZ2lzdGVyKCdpbWFnZScsIHJlY3QpOyAvLyBpbWFnZSDkvb/nlKggcmVjdCDnmoTljIXlm7Tnm5LorqHnrpdcbnJlZ2lzdGVyKCdjaXJjbGUnLCBjaXJjbGUpO1xucmVnaXN0ZXIoJ21hcmtlcicsIGNpcmNsZSk7IC8vIG1hcmtlciDkvb/nlKggY2lyY2xlIOeahOiuoeeul+aWueahiFxucmVnaXN0ZXIoJ3BvbHlsaW5lJywgcG9seWxpbmUpO1xucmVnaXN0ZXIoJ3BvbHlnb24nLCBwb2x5Z29uKTtcbnJlZ2lzdGVyKCd0ZXh0JywgdGV4dCk7XG5yZWdpc3RlcigncGF0aCcsIHBhdGgpO1xucmVnaXN0ZXIoJ2xpbmUnLCBsaW5lKTtcbnJlZ2lzdGVyKCdlbGxpcHNlJywgZWxsaXBzZSk7XG5leHBvcnQgeyBnZXRNZXRob2QgYXMgZ2V0QkJveE1ldGhvZCB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///276\n")},function(module,__webpack_exports__,__webpack_require__){"use strict";eval("\n// EXTERNAL MODULE: ./node_modules/tslib/tslib.es6.js\nvar tslib_es6 = __webpack_require__(1);\n\n// EXTERNAL MODULE: ./node_modules/@antv/g-base/esm/index.js\nvar esm = __webpack_require__(21);\n\n// EXTERNAL MODULE: ./node_modules/@antv/g-svg/esm/constant.js\nvar constant = __webpack_require__(17);\n\n// EXTERNAL MODULE: ./node_modules/@antv/g-svg/esm/util/draw.js\nvar draw = __webpack_require__(71);\n\n// EXTERNAL MODULE: ./node_modules/@antv/g-svg/esm/util/svg.js\nvar svg = __webpack_require__(34);\n\n// EXTERNAL MODULE: ./node_modules/@antv/g-svg/esm/util/dom.js\nvar dom = __webpack_require__(26);\n\n// EXTERNAL MODULE: ./node_modules/@antv/g-svg/esm/shape/index.js + 14 modules\nvar esm_shape = __webpack_require__(80);\n\n// EXTERNAL MODULE: ./node_modules/@antv/g-svg/esm/group.js\nvar group = __webpack_require__(78);\n\n// EXTERNAL MODULE: ./node_modules/@antv/util/esm/index.js + 110 modules\nvar util_esm = __webpack_require__(0);\n\n// CONCATENATED MODULE: ./node_modules/@antv/g-svg/esm/defs/gradient.js\n/**\n * @fileoverview gradient\n * @author dengfuping_develop@163.com\n */\n\n\nvar regexLG = /^l\\s*\\(\\s*([\\d.]+)\\s*\\)\\s*(.*)/i;\nvar regexRG = /^r\\s*\\(\\s*([\\d.]+)\\s*,\\s*([\\d.]+)\\s*,\\s*([\\d.]+)\\s*\\)\\s*(.*)/i;\nvar regexColorStop = /[\\d.]+:(#[^\\s]+|[^)]+\\))/gi;\nfunction addStop(steps) {\n var arr = steps.match(regexColorStop);\n if (!arr) {\n return '';\n }\n var stops = '';\n arr.sort(function (a, b) {\n a = a.split(':');\n b = b.split(':');\n return Number(a[0]) - Number(b[0]);\n });\n Object(util_esm[\"each\"])(arr, function (item) {\n item = item.split(':');\n stops += \"\";\n });\n return stops;\n}\nfunction parseLineGradient(color, el) {\n var arr = regexLG.exec(color);\n var angle = Object(util_esm[\"mod\"])(Object(util_esm[\"toRadian\"])(parseFloat(arr[1])), Math.PI * 2);\n var steps = arr[2];\n var start;\n var end;\n if (angle >= 0 && angle < 0.5 * Math.PI) {\n start = {\n x: 0,\n y: 0,\n };\n end = {\n x: 1,\n y: 1,\n };\n }\n else if (0.5 * Math.PI <= angle && angle < Math.PI) {\n start = {\n x: 1,\n y: 0,\n };\n end = {\n x: 0,\n y: 1,\n };\n }\n else if (Math.PI <= angle && angle < 1.5 * Math.PI) {\n start = {\n x: 1,\n y: 1,\n };\n end = {\n x: 0,\n y: 0,\n };\n }\n else {\n start = {\n x: 0,\n y: 1,\n };\n end = {\n x: 1,\n y: 0,\n };\n }\n var tanTheta = Math.tan(angle);\n var tanTheta2 = tanTheta * tanTheta;\n var x = (end.x - start.x + tanTheta * (end.y - start.y)) / (tanTheta2 + 1) + start.x;\n var y = (tanTheta * (end.x - start.x + tanTheta * (end.y - start.y))) / (tanTheta2 + 1) + start.y;\n el.setAttribute('x1', start.x);\n el.setAttribute('y1', start.y);\n el.setAttribute('x2', x);\n el.setAttribute('y2', y);\n el.innerHTML = addStop(steps);\n}\nfunction parseRadialGradient(color, self) {\n var arr = regexRG.exec(color);\n var cx = parseFloat(arr[1]);\n var cy = parseFloat(arr[2]);\n var r = parseFloat(arr[3]);\n var steps = arr[4];\n self.setAttribute('cx', cx);\n self.setAttribute('cy', cy);\n self.setAttribute('r', r);\n self.innerHTML = addStop(steps);\n}\nvar gradient_Gradient = /** @class */ (function () {\n function Gradient(cfg) {\n this.cfg = {};\n var el = null;\n var id = Object(util_esm[\"uniqueId\"])('gradient_');\n if (cfg.toLowerCase()[0] === 'l') {\n el = Object(dom[\"b\" /* createSVGElement */])('linearGradient');\n parseLineGradient(cfg, el);\n }\n else {\n el = Object(dom[\"b\" /* createSVGElement */])('radialGradient');\n parseRadialGradient(cfg, el);\n }\n el.setAttribute('id', id);\n this.el = el;\n this.id = id;\n this.cfg = cfg;\n return this;\n }\n Gradient.prototype.match = function (type, attr) {\n return this.cfg === attr;\n };\n return Gradient;\n}());\n/* harmony default export */ var defs_gradient = (gradient_Gradient);\n//# sourceMappingURL=gradient.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-svg/esm/defs/shadow.js\n/**\n * @fileoverview shadow\n * @author dengfuping_develop@163.com\n */\n\n\nvar ATTR_MAP = {\n shadowColor: 'color',\n shadowOpacity: 'opacity',\n shadowBlur: 'blur',\n shadowOffsetX: 'dx',\n shadowOffsetY: 'dy',\n};\nvar SHADOW_DIMENSION = {\n x: '-40%',\n y: '-40%',\n width: '200%',\n height: '200%',\n};\nvar shadow_Shadow = /** @class */ (function () {\n function Shadow(cfg) {\n this.type = 'filter';\n this.cfg = {};\n this.type = 'filter';\n var el = Object(dom[\"b\" /* createSVGElement */])('filter');\n // expand the filter region to fill in shadows\n Object(util_esm[\"each\"])(SHADOW_DIMENSION, function (v, k) {\n el.setAttribute(k, v);\n });\n this.el = el;\n this.id = Object(util_esm[\"uniqueId\"])('filter_');\n this.el.id = this.id;\n this.cfg = cfg;\n this._parseShadow(cfg, el);\n return this;\n }\n Shadow.prototype.match = function (type, cfg) {\n if (this.type !== type) {\n return false;\n }\n var flag = true;\n var config = this.cfg;\n Object(util_esm[\"each\"])(Object.keys(config), function (attr) {\n if (config[attr] !== cfg[attr]) {\n flag = false;\n return false;\n }\n });\n return flag;\n };\n Shadow.prototype.update = function (name, value) {\n var config = this.cfg;\n config[ATTR_MAP[name]] = value;\n this._parseShadow(config, this.el);\n return this;\n };\n Shadow.prototype._parseShadow = function (config, el) {\n var child = \"\";\n el.innerHTML = child;\n };\n return Shadow;\n}());\n/* harmony default export */ var defs_shadow = (shadow_Shadow);\n//# sourceMappingURL=shadow.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-svg/esm/defs/arrow.js\n/**\n * @fileoverview arrow\n * @author dengfuping_develop@163.com\n */\n\n\nvar arrow_Arrow = /** @class */ (function () {\n function Arrow(attrs, type) {\n this.cfg = {};\n var el = Object(dom[\"b\" /* createSVGElement */])('marker');\n var id = Object(util_esm[\"uniqueId\"])('marker_');\n el.setAttribute('id', id);\n var shape = Object(dom[\"b\" /* createSVGElement */])('path');\n shape.setAttribute('stroke', attrs.stroke || 'none');\n shape.setAttribute('fill', attrs.fill || 'none');\n el.appendChild(shape);\n el.setAttribute('overflow', 'visible');\n el.setAttribute('orient', 'auto-start-reverse');\n this.el = el;\n this.child = shape;\n this.id = id;\n var cfg = attrs[type === 'marker-start' ? 'startArrow' : 'endArrow'];\n this.stroke = attrs.stroke || '#000';\n if (cfg === true) {\n this._setDefaultPath(type, shape);\n }\n else {\n this.cfg = cfg; // when arrow config exists\n this._setMarker(attrs.lineWidth, shape);\n }\n return this;\n }\n Arrow.prototype.match = function () {\n return false;\n };\n Arrow.prototype._setDefaultPath = function (type, el) {\n var parent = this.el;\n // 默认箭头的边长为 10,夹角为 60 度\n el.setAttribute('d', \"M0,0 L\" + 10 * Math.cos(Math.PI / 6) + \",5 L0,10\");\n parent.setAttribute('refX', \"\" + 10 * Math.cos(Math.PI / 6));\n parent.setAttribute('refY', \"\" + 5);\n };\n Arrow.prototype._setMarker = function (r, el) {\n var parent = this.el;\n var path = this.cfg.path;\n var d = this.cfg.d;\n if (Object(util_esm[\"isArray\"])(path)) {\n path = path\n .map(function (segment) {\n return segment.join(' ');\n })\n .join('');\n }\n el.setAttribute('d', path);\n parent.appendChild(el);\n if (d) {\n parent.setAttribute('refX', \"\" + d / r);\n }\n };\n Arrow.prototype.update = function (fill) {\n var child = this.child;\n if (child.attr) {\n child.attr('fill', fill);\n }\n else {\n child.setAttribute('fill', fill);\n }\n };\n return Arrow;\n}());\n/* harmony default export */ var defs_arrow = (arrow_Arrow);\n//# sourceMappingURL=arrow.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-svg/esm/defs/clip.js\n/**\n * @fileoverview clip\n * @author dengfuping_develop@163.com\n */\n\n\nvar clip_Clip = /** @class */ (function () {\n function Clip(cfg) {\n this.type = 'clip';\n this.cfg = {};\n var el = Object(dom[\"b\" /* createSVGElement */])('clipPath');\n this.el = el;\n this.id = Object(util_esm[\"uniqueId\"])('clip_');\n el.id = this.id;\n var shapeEl = cfg.cfg.el;\n el.appendChild(shapeEl);\n this.cfg = cfg;\n return this;\n }\n Clip.prototype.match = function () {\n return false;\n };\n Clip.prototype.remove = function () {\n var el = this.el;\n el.parentNode.removeChild(el);\n };\n return Clip;\n}());\n/* harmony default export */ var defs_clip = (clip_Clip);\n//# sourceMappingURL=clip.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-svg/esm/defs/pattern.js\n/**\n * @fileoverview pattern\n * @author dengfuping_develop@163.com\n */\n\n\nvar regexPR = /^p\\s*\\(\\s*([axyn])\\s*\\)\\s*(.*)/i;\nvar pattern_Pattern = /** @class */ (function () {\n function Pattern(cfg) {\n this.cfg = {};\n var el = Object(dom[\"b\" /* createSVGElement */])('pattern');\n el.setAttribute('patternUnits', 'userSpaceOnUse');\n var child = Object(dom[\"b\" /* createSVGElement */])('image');\n el.appendChild(child);\n var id = Object(util_esm[\"uniqueId\"])('pattern_');\n el.id = id;\n this.el = el;\n this.id = id;\n this.cfg = cfg;\n var arr = regexPR.exec(cfg);\n var source = arr[2];\n child.setAttribute('href', source);\n var img = new Image();\n if (!source.match(/^data:/i)) {\n img.crossOrigin = 'Anonymous';\n }\n img.src = source;\n function onload() {\n el.setAttribute('width', \"\" + img.width);\n el.setAttribute('height', \"\" + img.height);\n }\n if (img.complete) {\n onload();\n }\n else {\n img.onload = onload;\n // Fix onload() bug in IE9\n img.src = img.src;\n }\n return this;\n }\n Pattern.prototype.match = function (type, attr) {\n return this.cfg === attr;\n };\n return Pattern;\n}());\n/* harmony default export */ var defs_pattern = (pattern_Pattern);\n//# sourceMappingURL=pattern.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-svg/esm/defs/index.js\n/**\n * @fileoverview defs\n * @author dengfuping_develop@163.com\n */\n\n\n\n\n\n\n\nvar defs_Defs = /** @class */ (function () {\n function Defs(canvas) {\n var el = Object(dom[\"b\" /* createSVGElement */])('defs');\n var id = Object(util_esm[\"uniqueId\"])('defs_');\n el.id = id;\n canvas.appendChild(el);\n this.children = [];\n this.defaultArrow = {};\n this.el = el;\n this.canvas = canvas;\n }\n Defs.prototype.find = function (type, attr) {\n var children = this.children;\n var result = null;\n for (var i = 0; i < children.length; i++) {\n if (children[i].match(type, attr)) {\n result = children[i].id;\n break;\n }\n }\n return result;\n };\n Defs.prototype.findById = function (id) {\n var children = this.children;\n var flag = null;\n for (var i = 0; i < children.length; i++) {\n if (children[i].id === id) {\n flag = children[i];\n break;\n }\n }\n return flag;\n };\n Defs.prototype.add = function (item) {\n this.children.push(item);\n item.canvas = this.canvas;\n item.parent = this;\n };\n Defs.prototype.getDefaultArrow = function (attrs, name) {\n var stroke = attrs.stroke || attrs.strokeStyle;\n if (this.defaultArrow[stroke]) {\n return this.defaultArrow[stroke].id;\n }\n var arrow = new defs_arrow(attrs, name);\n this.defaultArrow[stroke] = arrow;\n this.el.appendChild(arrow.el);\n this.add(arrow);\n return arrow.id;\n };\n Defs.prototype.addGradient = function (cfg) {\n var gradient = new defs_gradient(cfg);\n this.el.appendChild(gradient.el);\n this.add(gradient);\n return gradient.id;\n };\n Defs.prototype.addArrow = function (attrs, name) {\n var arrow = new defs_arrow(attrs, name);\n this.el.appendChild(arrow.el);\n this.add(arrow);\n return arrow.id;\n };\n Defs.prototype.addShadow = function (cfg) {\n var shadow = new defs_shadow(cfg);\n this.el.appendChild(shadow.el);\n this.add(shadow);\n return shadow.id;\n };\n Defs.prototype.addPattern = function (cfg) {\n var pattern = new defs_pattern(cfg);\n this.el.appendChild(pattern.el);\n this.add(pattern);\n return pattern.id;\n };\n Defs.prototype.addClip = function (cfg) {\n var clip = new defs_clip(cfg);\n this.el.appendChild(clip.el);\n this.add(clip);\n return clip.id;\n };\n return Defs;\n}());\n/* harmony default export */ var defs = (defs_Defs);\n//# sourceMappingURL=index.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-svg/esm/canvas.js\n\n\n\n\n\n\n\n\n\nvar canvas_Canvas = /** @class */ (function (_super) {\n Object(tslib_es6[\"__extends\"])(Canvas, _super);\n function Canvas(cfg) {\n return _super.call(this, Object(tslib_es6[\"__assign\"])(Object(tslib_es6[\"__assign\"])({}, cfg), { autoDraw: true, \n // 设置渲染引擎为 canvas,只读属性\n renderer: 'svg' })) || this;\n }\n Canvas.prototype.getShapeBase = function () {\n return esm_shape;\n };\n Canvas.prototype.getGroupBase = function () {\n return group[\"a\" /* default */];\n };\n // 覆盖 Container 中通过遍历的方式获取 shape 对象的逻辑,直接走 SVG 的 dom 拾取即可\n Canvas.prototype.getShape = function (x, y, ev) {\n var target = ev.target || ev.srcElement;\n if (!constant[\"a\" /* SHAPE_TO_TAGS */][target.tagName]) {\n var parent_1 = target.parentNode;\n while (parent_1 && !constant[\"a\" /* SHAPE_TO_TAGS */][parent_1.tagName]) {\n parent_1 = parent_1.parentNode;\n }\n target = parent_1;\n }\n return this.find(function (child) { return child.get('el') === target; });\n };\n // 复写基类的方法生成标签\n Canvas.prototype.createDom = function () {\n var element = Object(dom[\"b\" /* createSVGElement */])('svg');\n var context = new defs(element);\n element.setAttribute('width', \"\" + this.get('width'));\n element.setAttribute('height', \"\" + this.get('height'));\n // 缓存 context 对象\n this.set('context', context);\n return element;\n };\n /**\n * 一些方法调用会引起画布变化\n * @param {ChangeType} changeType 改变的类型\n */\n Canvas.prototype.onCanvasChange = function (changeType) {\n var context = this.get('context');\n var el = this.get('el');\n if (changeType === 'sort') {\n var children_1 = this.get('children');\n if (children_1 && children_1.length) {\n Object(dom[\"d\" /* sortDom */])(this, function (a, b) {\n return children_1.indexOf(a) - children_1.indexOf(b) ? 1 : 0;\n });\n }\n }\n else if (changeType === 'clear') {\n // el maybe null for canvas\n if (el) {\n // 清空 SVG 元素\n el.innerHTML = '';\n var defsEl = context.el;\n // 清空 defs 元素\n defsEl.innerHTML = '';\n // 将清空后的 defs 元素挂载到 el 下\n el.appendChild(defsEl);\n }\n }\n else if (changeType === 'matrix') {\n Object(svg[\"c\" /* setTransform */])(this);\n }\n else if (changeType === 'clip') {\n Object(svg[\"a\" /* setClip */])(this, context);\n }\n else if (changeType === 'changeSize') {\n el.setAttribute('width', \"\" + this.get('width'));\n el.setAttribute('height', \"\" + this.get('height'));\n }\n };\n // 复写基类的 draw 方法\n Canvas.prototype.draw = function () {\n var context = this.get('context');\n var children = this.getChildren();\n Object(svg[\"a\" /* setClip */])(this, context);\n if (children.length) {\n Object(draw[\"a\" /* drawChildren */])(context, children);\n }\n };\n return Canvas;\n}(esm[\"AbstractCanvas\"]));\n/* harmony default export */ var esm_canvas = __webpack_exports__[\"a\"] = (canvas_Canvas);\n//# sourceMappingURL=canvas.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy1zdmcvZXNtL2RlZnMvZ3JhZGllbnQuanM/YTIxOCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy1zdmcvZXNtL2RlZnMvc2hhZG93LmpzPzE3MjIiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2ctc3ZnL2VzbS9kZWZzL2Fycm93LmpzPzY4MDQiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2ctc3ZnL2VzbS9kZWZzL2NsaXAuanM/MTQxZCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy1zdmcvZXNtL2RlZnMvcGF0dGVybi5qcz8wMGYwIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9nLXN2Zy9lc20vZGVmcy9pbmRleC5qcz9mZTM1Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9nLXN2Zy9lc20vY2FudmFzLmpzP2MwMjkiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUMyRDtBQUNaO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLElBQUksd0JBQUk7QUFDUjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLHVCQUFHLENBQUMsNEJBQVE7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QUFDQTtBQUNBLHNCQUFzQix1Q0FBZ0I7QUFDdEMsMEJBQTBCLElBQUk7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsV0FBVztBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQiw4QkFBTztBQUN2QjtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLG1DQUFZO0FBQ3hCO0FBQ0E7QUFDQSxZQUFZLDhCQUFPO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSw4QkFBTztBQUNmO0FBQ0EsWUFBWSxvQ0FBWTtBQUN4QjtBQUNBO0FBQ0E7QUFDQSxDQUFDLENBQUMscUJBQWM7QUFDRCx1RkFBTSxFQUFDO0FBQ3RCIiwiZmlsZSI6IjI3Ny5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVvdmVydmlldyBncmFkaWVudFxuICogQGF1dGhvciBkZW5nZnVwaW5nX2RldmVsb3BAMTYzLmNvbVxuICovXG5pbXBvcnQgeyBlYWNoLCBtb2QsIHRvUmFkaWFuLCB1bmlxdWVJZCB9IGZyb20gJ0BhbnR2L3V0aWwnO1xuaW1wb3J0IHsgY3JlYXRlU1ZHRWxlbWVudCB9IGZyb20gJy4uL3V0aWwvZG9tJztcbnZhciByZWdleExHID0gL15sXFxzKlxcKFxccyooW1xcZC5dKylcXHMqXFwpXFxzKiguKikvaTtcbnZhciByZWdleFJHID0gL15yXFxzKlxcKFxccyooW1xcZC5dKylcXHMqLFxccyooW1xcZC5dKylcXHMqLFxccyooW1xcZC5dKylcXHMqXFwpXFxzKiguKikvaTtcbnZhciByZWdleENvbG9yU3RvcCA9IC9bXFxkLl0rOigjW15cXHNdK3xbXildK1xcKSkvZ2k7XG5mdW5jdGlvbiBhZGRTdG9wKHN0ZXBzKSB7XG4gICAgdmFyIGFyciA9IHN0ZXBzLm1hdGNoKHJlZ2V4Q29sb3JTdG9wKTtcbiAgICBpZiAoIWFycikge1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIHZhciBzdG9wcyA9ICcnO1xuICAgIGFyci5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgIGEgPSBhLnNwbGl0KCc6Jyk7XG4gICAgICAgIGIgPSBiLnNwbGl0KCc6Jyk7XG4gICAgICAgIHJldHVybiBOdW1iZXIoYVswXSkgLSBOdW1iZXIoYlswXSk7XG4gICAgfSk7XG4gICAgZWFjaChhcnIsIGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgIGl0ZW0gPSBpdGVtLnNwbGl0KCc6Jyk7XG4gICAgICAgIHN0b3BzICs9IFwiPHN0b3Agb2Zmc2V0PVxcXCJcIiArIGl0ZW1bMF0gKyBcIlxcXCIgc3RvcC1jb2xvcj1cXFwiXCIgKyBpdGVtWzFdICsgXCJcXFwiPjwvc3RvcD5cIjtcbiAgICB9KTtcbiAgICByZXR1cm4gc3RvcHM7XG59XG5mdW5jdGlvbiBwYXJzZUxpbmVHcmFkaWVudChjb2xvciwgZWwpIHtcbiAgICB2YXIgYXJyID0gcmVnZXhMRy5leGVjKGNvbG9yKTtcbiAgICB2YXIgYW5nbGUgPSBtb2QodG9SYWRpYW4ocGFyc2VGbG9hdChhcnJbMV0pKSwgTWF0aC5QSSAqIDIpO1xuICAgIHZhciBzdGVwcyA9IGFyclsyXTtcbiAgICB2YXIgc3RhcnQ7XG4gICAgdmFyIGVuZDtcbiAgICBpZiAoYW5nbGUgPj0gMCAmJiBhbmdsZSA8IDAuNSAqIE1hdGguUEkpIHtcbiAgICAgICAgc3RhcnQgPSB7XG4gICAgICAgICAgICB4OiAwLFxuICAgICAgICAgICAgeTogMCxcbiAgICAgICAgfTtcbiAgICAgICAgZW5kID0ge1xuICAgICAgICAgICAgeDogMSxcbiAgICAgICAgICAgIHk6IDEsXG4gICAgICAgIH07XG4gICAgfVxuICAgIGVsc2UgaWYgKDAuNSAqIE1hdGguUEkgPD0gYW5nbGUgJiYgYW5nbGUgPCBNYXRoLlBJKSB7XG4gICAgICAgIHN0YXJ0ID0ge1xuICAgICAgICAgICAgeDogMSxcbiAgICAgICAgICAgIHk6IDAsXG4gICAgICAgIH07XG4gICAgICAgIGVuZCA9IHtcbiAgICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgICB5OiAxLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBlbHNlIGlmIChNYXRoLlBJIDw9IGFuZ2xlICYmIGFuZ2xlIDwgMS41ICogTWF0aC5QSSkge1xuICAgICAgICBzdGFydCA9IHtcbiAgICAgICAgICAgIHg6IDEsXG4gICAgICAgICAgICB5OiAxLFxuICAgICAgICB9O1xuICAgICAgICBlbmQgPSB7XG4gICAgICAgICAgICB4OiAwLFxuICAgICAgICAgICAgeTogMCxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHN0YXJ0ID0ge1xuICAgICAgICAgICAgeDogMCxcbiAgICAgICAgICAgIHk6IDEsXG4gICAgICAgIH07XG4gICAgICAgIGVuZCA9IHtcbiAgICAgICAgICAgIHg6IDEsXG4gICAgICAgICAgICB5OiAwLFxuICAgICAgICB9O1xuICAgIH1cbiAgICB2YXIgdGFuVGhldGEgPSBNYXRoLnRhbihhbmdsZSk7XG4gICAgdmFyIHRhblRoZXRhMiA9IHRhblRoZXRhICogdGFuVGhldGE7XG4gICAgdmFyIHggPSAoZW5kLnggLSBzdGFydC54ICsgdGFuVGhldGEgKiAoZW5kLnkgLSBzdGFydC55KSkgLyAodGFuVGhldGEyICsgMSkgKyBzdGFydC54O1xuICAgIHZhciB5ID0gKHRhblRoZXRhICogKGVuZC54IC0gc3RhcnQueCArIHRhblRoZXRhICogKGVuZC55IC0gc3RhcnQueSkpKSAvICh0YW5UaGV0YTIgKyAxKSArIHN0YXJ0Lnk7XG4gICAgZWwuc2V0QXR0cmlidXRlKCd4MScsIHN0YXJ0LngpO1xuICAgIGVsLnNldEF0dHJpYnV0ZSgneTEnLCBzdGFydC55KTtcbiAgICBlbC5zZXRBdHRyaWJ1dGUoJ3gyJywgeCk7XG4gICAgZWwuc2V0QXR0cmlidXRlKCd5MicsIHkpO1xuICAgIGVsLmlubmVySFRNTCA9IGFkZFN0b3Aoc3RlcHMpO1xufVxuZnVuY3Rpb24gcGFyc2VSYWRpYWxHcmFkaWVudChjb2xvciwgc2VsZikge1xuICAgIHZhciBhcnIgPSByZWdleFJHLmV4ZWMoY29sb3IpO1xuICAgIHZhciBjeCA9IHBhcnNlRmxvYXQoYXJyWzFdKTtcbiAgICB2YXIgY3kgPSBwYXJzZUZsb2F0KGFyclsyXSk7XG4gICAgdmFyIHIgPSBwYXJzZUZsb2F0KGFyclszXSk7XG4gICAgdmFyIHN0ZXBzID0gYXJyWzRdO1xuICAgIHNlbGYuc2V0QXR0cmlidXRlKCdjeCcsIGN4KTtcbiAgICBzZWxmLnNldEF0dHJpYnV0ZSgnY3knLCBjeSk7XG4gICAgc2VsZi5zZXRBdHRyaWJ1dGUoJ3InLCByKTtcbiAgICBzZWxmLmlubmVySFRNTCA9IGFkZFN0b3Aoc3RlcHMpO1xufVxudmFyIEdyYWRpZW50ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEdyYWRpZW50KGNmZykge1xuICAgICAgICB0aGlzLmNmZyA9IHt9O1xuICAgICAgICB2YXIgZWwgPSBudWxsO1xuICAgICAgICB2YXIgaWQgPSB1bmlxdWVJZCgnZ3JhZGllbnRfJyk7XG4gICAgICAgIGlmIChjZmcudG9Mb3dlckNhc2UoKVswXSA9PT0gJ2wnKSB7XG4gICAgICAgICAgICBlbCA9IGNyZWF0ZVNWR0VsZW1lbnQoJ2xpbmVhckdyYWRpZW50Jyk7XG4gICAgICAgICAgICBwYXJzZUxpbmVHcmFkaWVudChjZmcsIGVsKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGVsID0gY3JlYXRlU1ZHRWxlbWVudCgncmFkaWFsR3JhZGllbnQnKTtcbiAgICAgICAgICAgIHBhcnNlUmFkaWFsR3JhZGllbnQoY2ZnLCBlbCk7XG4gICAgICAgIH1cbiAgICAgICAgZWwuc2V0QXR0cmlidXRlKCdpZCcsIGlkKTtcbiAgICAgICAgdGhpcy5lbCA9IGVsO1xuICAgICAgICB0aGlzLmlkID0gaWQ7XG4gICAgICAgIHRoaXMuY2ZnID0gY2ZnO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgR3JhZGllbnQucHJvdG90eXBlLm1hdGNoID0gZnVuY3Rpb24gKHR5cGUsIGF0dHIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2ZnID09PSBhdHRyO1xuICAgIH07XG4gICAgcmV0dXJuIEdyYWRpZW50O1xufSgpKTtcbmV4cG9ydCBkZWZhdWx0IEdyYWRpZW50O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z3JhZGllbnQuanMubWFwIiwiLyoqXG4gKiBAZmlsZW92ZXJ2aWV3IHNoYWRvd1xuICogQGF1dGhvciBkZW5nZnVwaW5nX2RldmVsb3BAMTYzLmNvbVxuICovXG5pbXBvcnQgeyBlYWNoLCB1bmlxdWVJZCB9IGZyb20gJ0BhbnR2L3V0aWwnO1xuaW1wb3J0IHsgY3JlYXRlU1ZHRWxlbWVudCB9IGZyb20gJy4uL3V0aWwvZG9tJztcbnZhciBBVFRSX01BUCA9IHtcbiAgICBzaGFkb3dDb2xvcjogJ2NvbG9yJyxcbiAgICBzaGFkb3dPcGFjaXR5OiAnb3BhY2l0eScsXG4gICAgc2hhZG93Qmx1cjogJ2JsdXInLFxuICAgIHNoYWRvd09mZnNldFg6ICdkeCcsXG4gICAgc2hhZG93T2Zmc2V0WTogJ2R5Jyxcbn07XG52YXIgU0hBRE9XX0RJTUVOU0lPTiA9IHtcbiAgICB4OiAnLTQwJScsXG4gICAgeTogJy00MCUnLFxuICAgIHdpZHRoOiAnMjAwJScsXG4gICAgaGVpZ2h0OiAnMjAwJScsXG59O1xudmFyIFNoYWRvdyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBTaGFkb3coY2ZnKSB7XG4gICAgICAgIHRoaXMudHlwZSA9ICdmaWx0ZXInO1xuICAgICAgICB0aGlzLmNmZyA9IHt9O1xuICAgICAgICB0aGlzLnR5cGUgPSAnZmlsdGVyJztcbiAgICAgICAgdmFyIGVsID0gY3JlYXRlU1ZHRWxlbWVudCgnZmlsdGVyJyk7XG4gICAgICAgIC8vIGV4cGFuZCB0aGUgZmlsdGVyIHJlZ2lvbiB0byBmaWxsIGluIHNoYWRvd3NcbiAgICAgICAgZWFjaChTSEFET1dfRElNRU5TSU9OLCBmdW5jdGlvbiAodiwgaykge1xuICAgICAgICAgICAgZWwuc2V0QXR0cmlidXRlKGssIHYpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5lbCA9IGVsO1xuICAgICAgICB0aGlzLmlkID0gdW5pcXVlSWQoJ2ZpbHRlcl8nKTtcbiAgICAgICAgdGhpcy5lbC5pZCA9IHRoaXMuaWQ7XG4gICAgICAgIHRoaXMuY2ZnID0gY2ZnO1xuICAgICAgICB0aGlzLl9wYXJzZVNoYWRvdyhjZmcsIGVsKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIFNoYWRvdy5wcm90b3R5cGUubWF0Y2ggPSBmdW5jdGlvbiAodHlwZSwgY2ZnKSB7XG4gICAgICAgIGlmICh0aGlzLnR5cGUgIT09IHR5cGUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZmxhZyA9IHRydWU7XG4gICAgICAgIHZhciBjb25maWcgPSB0aGlzLmNmZztcbiAgICAgICAgZWFjaChPYmplY3Qua2V5cyhjb25maWcpLCBmdW5jdGlvbiAoYXR0cikge1xuICAgICAgICAgICAgaWYgKGNvbmZpZ1thdHRyXSAhPT0gY2ZnW2F0dHJdKSB7XG4gICAgICAgICAgICAgICAgZmxhZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBmbGFnO1xuICAgIH07XG4gICAgU2hhZG93LnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHtcbiAgICAgICAgdmFyIGNvbmZpZyA9IHRoaXMuY2ZnO1xuICAgICAgICBjb25maWdbQVRUUl9NQVBbbmFtZV1dID0gdmFsdWU7XG4gICAgICAgIHRoaXMuX3BhcnNlU2hhZG93KGNvbmZpZywgdGhpcy5lbCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgU2hhZG93LnByb3RvdHlwZS5fcGFyc2VTaGFkb3cgPSBmdW5jdGlvbiAoY29uZmlnLCBlbCkge1xuICAgICAgICB2YXIgY2hpbGQgPSBcIjxmZURyb3BTaGFkb3dcXG4gICAgICBkeD1cXFwiXCIgKyAoY29uZmlnLmR4IHx8IDApICsgXCJcXFwiXFxuICAgICAgZHk9XFxcIlwiICsgKGNvbmZpZy5keSB8fCAwKSArIFwiXFxcIlxcbiAgICAgIHN0ZERldmlhdGlvbj1cXFwiXCIgKyAoY29uZmlnLmJsdXIgPyBjb25maWcuYmx1ciAvIDEwIDogMCkgKyBcIlxcXCJcXG4gICAgICBmbG9vZC1jb2xvcj1cXFwiXCIgKyAoY29uZmlnLmNvbG9yID8gY29uZmlnLmNvbG9yIDogJyMwMDAnKSArIFwiXFxcIlxcbiAgICAgIGZsb29kLW9wYWNpdHk9XFxcIlwiICsgKGNvbmZpZy5vcGFjaXR5ID8gY29uZmlnLm9wYWNpdHkgOiAxKSArIFwiXFxcIlxcbiAgICAgIC8+XCI7XG4gICAgICAgIGVsLmlubmVySFRNTCA9IGNoaWxkO1xuICAgIH07XG4gICAgcmV0dXJuIFNoYWRvdztcbn0oKSk7XG5leHBvcnQgZGVmYXVsdCBTaGFkb3c7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zaGFkb3cuanMubWFwIiwiLyoqXG4gKiBAZmlsZW92ZXJ2aWV3IGFycm93XG4gKiBAYXV0aG9yIGRlbmdmdXBpbmdfZGV2ZWxvcEAxNjMuY29tXG4gKi9cbmltcG9ydCB7IGlzQXJyYXksIHVuaXF1ZUlkIH0gZnJvbSAnQGFudHYvdXRpbCc7XG5pbXBvcnQgeyBjcmVhdGVTVkdFbGVtZW50IH0gZnJvbSAnLi4vdXRpbC9kb20nO1xudmFyIEFycm93ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEFycm93KGF0dHJzLCB0eXBlKSB7XG4gICAgICAgIHRoaXMuY2ZnID0ge307XG4gICAgICAgIHZhciBlbCA9IGNyZWF0ZVNWR0VsZW1lbnQoJ21hcmtlcicpO1xuICAgICAgICB2YXIgaWQgPSB1bmlxdWVJZCgnbWFya2VyXycpO1xuICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoJ2lkJywgaWQpO1xuICAgICAgICB2YXIgc2hhcGUgPSBjcmVhdGVTVkdFbGVtZW50KCdwYXRoJyk7XG4gICAgICAgIHNoYXBlLnNldEF0dHJpYnV0ZSgnc3Ryb2tlJywgYXR0cnMuc3Ryb2tlIHx8ICdub25lJyk7XG4gICAgICAgIHNoYXBlLnNldEF0dHJpYnV0ZSgnZmlsbCcsIGF0dHJzLmZpbGwgfHwgJ25vbmUnKTtcbiAgICAgICAgZWwuYXBwZW5kQ2hpbGQoc2hhcGUpO1xuICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoJ292ZXJmbG93JywgJ3Zpc2libGUnKTtcbiAgICAgICAgZWwuc2V0QXR0cmlidXRlKCdvcmllbnQnLCAnYXV0by1zdGFydC1yZXZlcnNlJyk7XG4gICAgICAgIHRoaXMuZWwgPSBlbDtcbiAgICAgICAgdGhpcy5jaGlsZCA9IHNoYXBlO1xuICAgICAgICB0aGlzLmlkID0gaWQ7XG4gICAgICAgIHZhciBjZmcgPSBhdHRyc1t0eXBlID09PSAnbWFya2VyLXN0YXJ0JyA/ICdzdGFydEFycm93JyA6ICdlbmRBcnJvdyddO1xuICAgICAgICB0aGlzLnN0cm9rZSA9IGF0dHJzLnN0cm9rZSB8fCAnIzAwMCc7XG4gICAgICAgIGlmIChjZmcgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHRoaXMuX3NldERlZmF1bHRQYXRoKHR5cGUsIHNoYXBlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY2ZnID0gY2ZnOyAvLyB3aGVuIGFycm93IGNvbmZpZyBleGlzdHNcbiAgICAgICAgICAgIHRoaXMuX3NldE1hcmtlcihhdHRycy5saW5lV2lkdGgsIHNoYXBlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgQXJyb3cucHJvdG90eXBlLm1hdGNoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcbiAgICBBcnJvdy5wcm90b3R5cGUuX3NldERlZmF1bHRQYXRoID0gZnVuY3Rpb24gKHR5cGUsIGVsKSB7XG4gICAgICAgIHZhciBwYXJlbnQgPSB0aGlzLmVsO1xuICAgICAgICAvLyDpu5jorqTnrq3lpLTnmoTovrnplb/kuLogMTDvvIzlpLnop5LkuLogNjAg5bqmXG4gICAgICAgIGVsLnNldEF0dHJpYnV0ZSgnZCcsIFwiTTAsMCBMXCIgKyAxMCAqIE1hdGguY29zKE1hdGguUEkgLyA2KSArIFwiLDUgTDAsMTBcIik7XG4gICAgICAgIHBhcmVudC5zZXRBdHRyaWJ1dGUoJ3JlZlgnLCBcIlwiICsgMTAgKiBNYXRoLmNvcyhNYXRoLlBJIC8gNikpO1xuICAgICAgICBwYXJlbnQuc2V0QXR0cmlidXRlKCdyZWZZJywgXCJcIiArIDUpO1xuICAgIH07XG4gICAgQXJyb3cucHJvdG90eXBlLl9zZXRNYXJrZXIgPSBmdW5jdGlvbiAociwgZWwpIHtcbiAgICAgICAgdmFyIHBhcmVudCA9IHRoaXMuZWw7XG4gICAgICAgIHZhciBwYXRoID0gdGhpcy5jZmcucGF0aDtcbiAgICAgICAgdmFyIGQgPSB0aGlzLmNmZy5kO1xuICAgICAgICBpZiAoaXNBcnJheShwYXRoKSkge1xuICAgICAgICAgICAgcGF0aCA9IHBhdGhcbiAgICAgICAgICAgICAgICAubWFwKGZ1bmN0aW9uIChzZWdtZW50KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNlZ21lbnQuam9pbignICcpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuam9pbignJyk7XG4gICAgICAgIH1cbiAgICAgICAgZWwuc2V0QXR0cmlidXRlKCdkJywgcGF0aCk7XG4gICAgICAgIHBhcmVudC5hcHBlbmRDaGlsZChlbCk7XG4gICAgICAgIGlmIChkKSB7XG4gICAgICAgICAgICBwYXJlbnQuc2V0QXR0cmlidXRlKCdyZWZYJywgXCJcIiArIGQgLyByKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgQXJyb3cucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIChmaWxsKSB7XG4gICAgICAgIHZhciBjaGlsZCA9IHRoaXMuY2hpbGQ7XG4gICAgICAgIGlmIChjaGlsZC5hdHRyKSB7XG4gICAgICAgICAgICBjaGlsZC5hdHRyKCdmaWxsJywgZmlsbCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjaGlsZC5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLCBmaWxsKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIEFycm93O1xufSgpKTtcbmV4cG9ydCBkZWZhdWx0IEFycm93O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YXJyb3cuanMubWFwIiwiLyoqXG4gKiBAZmlsZW92ZXJ2aWV3IGNsaXBcbiAqIEBhdXRob3IgZGVuZ2Z1cGluZ19kZXZlbG9wQDE2My5jb21cbiAqL1xuaW1wb3J0IHsgdW5pcXVlSWQgfSBmcm9tICdAYW50di91dGlsJztcbmltcG9ydCB7IGNyZWF0ZVNWR0VsZW1lbnQgfSBmcm9tICcuLi91dGlsL2RvbSc7XG52YXIgQ2xpcCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBDbGlwKGNmZykge1xuICAgICAgICB0aGlzLnR5cGUgPSAnY2xpcCc7XG4gICAgICAgIHRoaXMuY2ZnID0ge307XG4gICAgICAgIHZhciBlbCA9IGNyZWF0ZVNWR0VsZW1lbnQoJ2NsaXBQYXRoJyk7XG4gICAgICAgIHRoaXMuZWwgPSBlbDtcbiAgICAgICAgdGhpcy5pZCA9IHVuaXF1ZUlkKCdjbGlwXycpO1xuICAgICAgICBlbC5pZCA9IHRoaXMuaWQ7XG4gICAgICAgIHZhciBzaGFwZUVsID0gY2ZnLmNmZy5lbDtcbiAgICAgICAgZWwuYXBwZW5kQ2hpbGQoc2hhcGVFbCk7XG4gICAgICAgIHRoaXMuY2ZnID0gY2ZnO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgQ2xpcC5wcm90b3R5cGUubWF0Y2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICAgIENsaXAucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGVsID0gdGhpcy5lbDtcbiAgICAgICAgZWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlbCk7XG4gICAgfTtcbiAgICByZXR1cm4gQ2xpcDtcbn0oKSk7XG5leHBvcnQgZGVmYXVsdCBDbGlwO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y2xpcC5qcy5tYXAiLCIvKipcbiAqIEBmaWxlb3ZlcnZpZXcgcGF0dGVyblxuICogQGF1dGhvciBkZW5nZnVwaW5nX2RldmVsb3BAMTYzLmNvbVxuICovXG5pbXBvcnQgeyB1bmlxdWVJZCB9IGZyb20gJ0BhbnR2L3V0aWwnO1xuaW1wb3J0IHsgY3JlYXRlU1ZHRWxlbWVudCB9IGZyb20gJy4uL3V0aWwvZG9tJztcbnZhciByZWdleFBSID0gL15wXFxzKlxcKFxccyooW2F4eW5dKVxccypcXClcXHMqKC4qKS9pO1xudmFyIFBhdHRlcm4gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUGF0dGVybihjZmcpIHtcbiAgICAgICAgdGhpcy5jZmcgPSB7fTtcbiAgICAgICAgdmFyIGVsID0gY3JlYXRlU1ZHRWxlbWVudCgncGF0dGVybicpO1xuICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoJ3BhdHRlcm5Vbml0cycsICd1c2VyU3BhY2VPblVzZScpO1xuICAgICAgICB2YXIgY2hpbGQgPSBjcmVhdGVTVkdFbGVtZW50KCdpbWFnZScpO1xuICAgICAgICBlbC5hcHBlbmRDaGlsZChjaGlsZCk7XG4gICAgICAgIHZhciBpZCA9IHVuaXF1ZUlkKCdwYXR0ZXJuXycpO1xuICAgICAgICBlbC5pZCA9IGlkO1xuICAgICAgICB0aGlzLmVsID0gZWw7XG4gICAgICAgIHRoaXMuaWQgPSBpZDtcbiAgICAgICAgdGhpcy5jZmcgPSBjZmc7XG4gICAgICAgIHZhciBhcnIgPSByZWdleFBSLmV4ZWMoY2ZnKTtcbiAgICAgICAgdmFyIHNvdXJjZSA9IGFyclsyXTtcbiAgICAgICAgY2hpbGQuc2V0QXR0cmlidXRlKCdocmVmJywgc291cmNlKTtcbiAgICAgICAgdmFyIGltZyA9IG5ldyBJbWFnZSgpO1xuICAgICAgICBpZiAoIXNvdXJjZS5tYXRjaCgvXmRhdGE6L2kpKSB7XG4gICAgICAgICAgICBpbWcuY3Jvc3NPcmlnaW4gPSAnQW5vbnltb3VzJztcbiAgICAgICAgfVxuICAgICAgICBpbWcuc3JjID0gc291cmNlO1xuICAgICAgICBmdW5jdGlvbiBvbmxvYWQoKSB7XG4gICAgICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgXCJcIiArIGltZy53aWR0aCk7XG4gICAgICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsIFwiXCIgKyBpbWcuaGVpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW1nLmNvbXBsZXRlKSB7XG4gICAgICAgICAgICBvbmxvYWQoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGltZy5vbmxvYWQgPSBvbmxvYWQ7XG4gICAgICAgICAgICAvLyBGaXggb25sb2FkKCkgYnVnIGluIElFOVxuICAgICAgICAgICAgaW1nLnNyYyA9IGltZy5zcmM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIFBhdHRlcm4ucHJvdG90eXBlLm1hdGNoID0gZnVuY3Rpb24gKHR5cGUsIGF0dHIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2ZnID09PSBhdHRyO1xuICAgIH07XG4gICAgcmV0dXJuIFBhdHRlcm47XG59KCkpO1xuZXhwb3J0IGRlZmF1bHQgUGF0dGVybjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBhdHRlcm4uanMubWFwIiwiLyoqXG4gKiBAZmlsZW92ZXJ2aWV3IGRlZnNcbiAqIEBhdXRob3IgZGVuZ2Z1cGluZ19kZXZlbG9wQDE2My5jb21cbiAqL1xuaW1wb3J0IHsgdW5pcXVlSWQgfSBmcm9tICdAYW50di91dGlsJztcbmltcG9ydCBHcmFkaWVudCBmcm9tICcuL2dyYWRpZW50JztcbmltcG9ydCBTaGFkb3cgZnJvbSAnLi9zaGFkb3cnO1xuaW1wb3J0IEFycm93IGZyb20gJy4vYXJyb3cnO1xuaW1wb3J0IENsaXAgZnJvbSAnLi9jbGlwJztcbmltcG9ydCBQYXR0ZXJuIGZyb20gJy4vcGF0dGVybic7XG5pbXBvcnQgeyBjcmVhdGVTVkdFbGVtZW50IH0gZnJvbSAnLi4vdXRpbC9kb20nO1xudmFyIERlZnMgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gRGVmcyhjYW52YXMpIHtcbiAgICAgICAgdmFyIGVsID0gY3JlYXRlU1ZHRWxlbWVudCgnZGVmcycpO1xuICAgICAgICB2YXIgaWQgPSB1bmlxdWVJZCgnZGVmc18nKTtcbiAgICAgICAgZWwuaWQgPSBpZDtcbiAgICAgICAgY2FudmFzLmFwcGVuZENoaWxkKGVsKTtcbiAgICAgICAgdGhpcy5jaGlsZHJlbiA9IFtdO1xuICAgICAgICB0aGlzLmRlZmF1bHRBcnJvdyA9IHt9O1xuICAgICAgICB0aGlzLmVsID0gZWw7XG4gICAgICAgIHRoaXMuY2FudmFzID0gY2FudmFzO1xuICAgIH1cbiAgICBEZWZzLnByb3RvdHlwZS5maW5kID0gZnVuY3Rpb24gKHR5cGUsIGF0dHIpIHtcbiAgICAgICAgdmFyIGNoaWxkcmVuID0gdGhpcy5jaGlsZHJlbjtcbiAgICAgICAgdmFyIHJlc3VsdCA9IG51bGw7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChjaGlsZHJlbltpXS5tYXRjaCh0eXBlLCBhdHRyKSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNoaWxkcmVuW2ldLmlkO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbiAgICBEZWZzLnByb3RvdHlwZS5maW5kQnlJZCA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLmNoaWxkcmVuO1xuICAgICAgICB2YXIgZmxhZyA9IG51bGw7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChjaGlsZHJlbltpXS5pZCA9PT0gaWQpIHtcbiAgICAgICAgICAgICAgICBmbGFnID0gY2hpbGRyZW5baV07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZsYWc7XG4gICAgfTtcbiAgICBEZWZzLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICB0aGlzLmNoaWxkcmVuLnB1c2goaXRlbSk7XG4gICAgICAgIGl0ZW0uY2FudmFzID0gdGhpcy5jYW52YXM7XG4gICAgICAgIGl0ZW0ucGFyZW50ID0gdGhpcztcbiAgICB9O1xuICAgIERlZnMucHJvdG90eXBlLmdldERlZmF1bHRBcnJvdyA9IGZ1bmN0aW9uIChhdHRycywgbmFtZSkge1xuICAgICAgICB2YXIgc3Ryb2tlID0gYXR0cnMuc3Ryb2tlIHx8IGF0dHJzLnN0cm9rZVN0eWxlO1xuICAgICAgICBpZiAodGhpcy5kZWZhdWx0QXJyb3dbc3Ryb2tlXSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdEFycm93W3N0cm9rZV0uaWQ7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGFycm93ID0gbmV3IEFycm93KGF0dHJzLCBuYW1lKTtcbiAgICAgICAgdGhpcy5kZWZhdWx0QXJyb3dbc3Ryb2tlXSA9IGFycm93O1xuICAgICAgICB0aGlzLmVsLmFwcGVuZENoaWxkKGFycm93LmVsKTtcbiAgICAgICAgdGhpcy5hZGQoYXJyb3cpO1xuICAgICAgICByZXR1cm4gYXJyb3cuaWQ7XG4gICAgfTtcbiAgICBEZWZzLnByb3RvdHlwZS5hZGRHcmFkaWVudCA9IGZ1bmN0aW9uIChjZmcpIHtcbiAgICAgICAgdmFyIGdyYWRpZW50ID0gbmV3IEdyYWRpZW50KGNmZyk7XG4gICAgICAgIHRoaXMuZWwuYXBwZW5kQ2hpbGQoZ3JhZGllbnQuZWwpO1xuICAgICAgICB0aGlzLmFkZChncmFkaWVudCk7XG4gICAgICAgIHJldHVybiBncmFkaWVudC5pZDtcbiAgICB9O1xuICAgIERlZnMucHJvdG90eXBlLmFkZEFycm93ID0gZnVuY3Rpb24gKGF0dHJzLCBuYW1lKSB7XG4gICAgICAgIHZhciBhcnJvdyA9IG5ldyBBcnJvdyhhdHRycywgbmFtZSk7XG4gICAgICAgIHRoaXMuZWwuYXBwZW5kQ2hpbGQoYXJyb3cuZWwpO1xuICAgICAgICB0aGlzLmFkZChhcnJvdyk7XG4gICAgICAgIHJldHVybiBhcnJvdy5pZDtcbiAgICB9O1xuICAgIERlZnMucHJvdG90eXBlLmFkZFNoYWRvdyA9IGZ1bmN0aW9uIChjZmcpIHtcbiAgICAgICAgdmFyIHNoYWRvdyA9IG5ldyBTaGFkb3coY2ZnKTtcbiAgICAgICAgdGhpcy5lbC5hcHBlbmRDaGlsZChzaGFkb3cuZWwpO1xuICAgICAgICB0aGlzLmFkZChzaGFkb3cpO1xuICAgICAgICByZXR1cm4gc2hhZG93LmlkO1xuICAgIH07XG4gICAgRGVmcy5wcm90b3R5cGUuYWRkUGF0dGVybiA9IGZ1bmN0aW9uIChjZmcpIHtcbiAgICAgICAgdmFyIHBhdHRlcm4gPSBuZXcgUGF0dGVybihjZmcpO1xuICAgICAgICB0aGlzLmVsLmFwcGVuZENoaWxkKHBhdHRlcm4uZWwpO1xuICAgICAgICB0aGlzLmFkZChwYXR0ZXJuKTtcbiAgICAgICAgcmV0dXJuIHBhdHRlcm4uaWQ7XG4gICAgfTtcbiAgICBEZWZzLnByb3RvdHlwZS5hZGRDbGlwID0gZnVuY3Rpb24gKGNmZykge1xuICAgICAgICB2YXIgY2xpcCA9IG5ldyBDbGlwKGNmZyk7XG4gICAgICAgIHRoaXMuZWwuYXBwZW5kQ2hpbGQoY2xpcC5lbCk7XG4gICAgICAgIHRoaXMuYWRkKGNsaXApO1xuICAgICAgICByZXR1cm4gY2xpcC5pZDtcbiAgICB9O1xuICAgIHJldHVybiBEZWZzO1xufSgpKTtcbmV4cG9ydCBkZWZhdWx0IERlZnM7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJpbXBvcnQgeyBfX2Fzc2lnbiwgX19leHRlbmRzIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBBYnN0cmFjdENhbnZhcyB9IGZyb20gJ0BhbnR2L2ctYmFzZSc7XG5pbXBvcnQgeyBTSEFQRV9UT19UQUdTIH0gZnJvbSAnLi9jb25zdGFudCc7XG5pbXBvcnQgeyBkcmF3Q2hpbGRyZW4gfSBmcm9tICcuL3V0aWwvZHJhdyc7XG5pbXBvcnQgeyBzZXRUcmFuc2Zvcm0sIHNldENsaXAgfSBmcm9tICcuL3V0aWwvc3ZnJztcbmltcG9ydCB7IHNvcnREb20sIGNyZWF0ZVNWR0VsZW1lbnQgfSBmcm9tICcuL3V0aWwvZG9tJztcbmltcG9ydCAqIGFzIFNoYXBlIGZyb20gJy4vc2hhcGUnO1xuaW1wb3J0IEdyb3VwIGZyb20gJy4vZ3JvdXAnO1xuaW1wb3J0IERlZnMgZnJvbSAnLi9kZWZzJztcbnZhciBDYW52YXMgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKENhbnZhcywgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBDYW52YXMoY2ZnKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIuY2FsbCh0aGlzLCBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgY2ZnKSwgeyBhdXRvRHJhdzogdHJ1ZSwgXG4gICAgICAgICAgICAvLyDorr7nva7muLLmn5PlvJXmk47kuLogY2FudmFz77yM5Y+q6K+75bGe5oCnXG4gICAgICAgICAgICByZW5kZXJlcjogJ3N2ZycgfSkpIHx8IHRoaXM7XG4gICAgfVxuICAgIENhbnZhcy5wcm90b3R5cGUuZ2V0U2hhcGVCYXNlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gU2hhcGU7XG4gICAgfTtcbiAgICBDYW52YXMucHJvdG90eXBlLmdldEdyb3VwQmFzZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIEdyb3VwO1xuICAgIH07XG4gICAgLy8g6KaG55uWIENvbnRhaW5lciDkuK3pgJrov4fpgY3ljobnmoTmlrnlvI/ojrflj5Ygc2hhcGUg5a+56LGh55qE6YC76L6R77yM55u05o6l6LWwIFNWRyDnmoQgZG9tIOaLvuWPluWNs+WPr1xuICAgIENhbnZhcy5wcm90b3R5cGUuZ2V0U2hhcGUgPSBmdW5jdGlvbiAoeCwgeSwgZXYpIHtcbiAgICAgICAgdmFyIHRhcmdldCA9IGV2LnRhcmdldCB8fCBldi5zcmNFbGVtZW50O1xuICAgICAgICBpZiAoIVNIQVBFX1RPX1RBR1NbdGFyZ2V0LnRhZ05hbWVdKSB7XG4gICAgICAgICAgICB2YXIgcGFyZW50XzEgPSB0YXJnZXQucGFyZW50Tm9kZTtcbiAgICAgICAgICAgIHdoaWxlIChwYXJlbnRfMSAmJiAhU0hBUEVfVE9fVEFHU1twYXJlbnRfMS50YWdOYW1lXSkge1xuICAgICAgICAgICAgICAgIHBhcmVudF8xID0gcGFyZW50XzEucGFyZW50Tm9kZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRhcmdldCA9IHBhcmVudF8xO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmZpbmQoZnVuY3Rpb24gKGNoaWxkKSB7IHJldHVybiBjaGlsZC5nZXQoJ2VsJykgPT09IHRhcmdldDsgfSk7XG4gICAgfTtcbiAgICAvLyDlpI3lhpnln7rnsbvnmoTmlrnms5XnlJ/miJDmoIfnrb5cbiAgICBDYW52YXMucHJvdG90eXBlLmNyZWF0ZURvbSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGVsZW1lbnQgPSBjcmVhdGVTVkdFbGVtZW50KCdzdmcnKTtcbiAgICAgICAgdmFyIGNvbnRleHQgPSBuZXcgRGVmcyhlbGVtZW50KTtcbiAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgXCJcIiArIHRoaXMuZ2V0KCd3aWR0aCcpKTtcbiAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsIFwiXCIgKyB0aGlzLmdldCgnaGVpZ2h0JykpO1xuICAgICAgICAvLyDnvJPlrZggY29udGV4dCDlr7nosaFcbiAgICAgICAgdGhpcy5zZXQoJ2NvbnRleHQnLCBjb250ZXh0KTtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiDkuIDkupvmlrnms5XosIPnlKjkvJrlvJXotbfnlLvluIPlj5jljJZcbiAgICAgKiBAcGFyYW0ge0NoYW5nZVR5cGV9IGNoYW5nZVR5cGUg5pS55Y+Y55qE57G75Z6LXG4gICAgICovXG4gICAgQ2FudmFzLnByb3RvdHlwZS5vbkNhbnZhc0NoYW5nZSA9IGZ1bmN0aW9uIChjaGFuZ2VUeXBlKSB7XG4gICAgICAgIHZhciBjb250ZXh0ID0gdGhpcy5nZXQoJ2NvbnRleHQnKTtcbiAgICAgICAgdmFyIGVsID0gdGhpcy5nZXQoJ2VsJyk7XG4gICAgICAgIGlmIChjaGFuZ2VUeXBlID09PSAnc29ydCcpIHtcbiAgICAgICAgICAgIHZhciBjaGlsZHJlbl8xID0gdGhpcy5nZXQoJ2NoaWxkcmVuJyk7XG4gICAgICAgICAgICBpZiAoY2hpbGRyZW5fMSAmJiBjaGlsZHJlbl8xLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHNvcnREb20odGhpcywgZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNoaWxkcmVuXzEuaW5kZXhPZihhKSAtIGNoaWxkcmVuXzEuaW5kZXhPZihiKSA/IDEgOiAwO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNoYW5nZVR5cGUgPT09ICdjbGVhcicpIHtcbiAgICAgICAgICAgIC8vIGVsIG1heWJlIG51bGwgZm9yIGNhbnZhc1xuICAgICAgICAgICAgaWYgKGVsKSB7XG4gICAgICAgICAgICAgICAgLy8g5riF56m6IFNWRyDlhYPntKBcbiAgICAgICAgICAgICAgICBlbC5pbm5lckhUTUwgPSAnJztcbiAgICAgICAgICAgICAgICB2YXIgZGVmc0VsID0gY29udGV4dC5lbDtcbiAgICAgICAgICAgICAgICAvLyDmuIXnqbogZGVmcyDlhYPntKBcbiAgICAgICAgICAgICAgICBkZWZzRWwuaW5uZXJIVE1MID0gJyc7XG4gICAgICAgICAgICAgICAgLy8g5bCG5riF56m65ZCO55qEIGRlZnMg5YWD57Sg5oyC6L295YiwIGVsIOS4i1xuICAgICAgICAgICAgICAgIGVsLmFwcGVuZENoaWxkKGRlZnNFbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY2hhbmdlVHlwZSA9PT0gJ21hdHJpeCcpIHtcbiAgICAgICAgICAgIHNldFRyYW5zZm9ybSh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjaGFuZ2VUeXBlID09PSAnY2xpcCcpIHtcbiAgICAgICAgICAgIHNldENsaXAodGhpcywgY29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY2hhbmdlVHlwZSA9PT0gJ2NoYW5nZVNpemUnKSB7XG4gICAgICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgXCJcIiArIHRoaXMuZ2V0KCd3aWR0aCcpKTtcbiAgICAgICAgICAgIGVsLnNldEF0dHJpYnV0ZSgnaGVpZ2h0JywgXCJcIiArIHRoaXMuZ2V0KCdoZWlnaHQnKSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8vIOWkjeWGmeWfuuexu+eahCBkcmF3IOaWueazlVxuICAgIENhbnZhcy5wcm90b3R5cGUuZHJhdyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGNvbnRleHQgPSB0aGlzLmdldCgnY29udGV4dCcpO1xuICAgICAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLmdldENoaWxkcmVuKCk7XG4gICAgICAgIHNldENsaXAodGhpcywgY29udGV4dCk7XG4gICAgICAgIGlmIChjaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgICAgIGRyYXdDaGlsZHJlbihjb250ZXh0LCBjaGlsZHJlbik7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBDYW52YXM7XG59KEFic3RyYWN0Q2FudmFzKSk7XG5leHBvcnQgZGVmYXVsdCBDYW52YXM7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jYW52YXMuanMubWFwIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///277\n")},function(module,__webpack_exports__,__webpack_require__){"use strict";eval("\n// UNUSED EXPORTS: ConfigService, IInteractorEvent, InteractorService\n\n// EXTERNAL MODULE: ./node_modules/@antv/g-webgpu-core/es/services/config/ConfigService.js\nvar ConfigService = __webpack_require__(133);\n\n// CONCATENATED MODULE: ./node_modules/@antv/g-webgpu-core/es/services/config/index.js\n\n//# sourceMappingURL=index.js.map\n// EXTERNAL MODULE: ./node_modules/@antv/g-webgpu-core/es/services/interactor/IteractorService.js\nvar IteractorService = __webpack_require__(134);\n\n// CONCATENATED MODULE: ./node_modules/@antv/g-webgpu-core/es/services/interactor/index.js\n\n//# sourceMappingURL=index.js.map\n// EXTERNAL MODULE: ./node_modules/@antv/g-webgpu-core/es/services/shader-module/ShaderModuleService.js + 2 modules\nvar ShaderModuleService = __webpack_require__(136);\n\n// CONCATENATED MODULE: ./node_modules/@antv/g-webgpu-core/es/services/shader-module/index.js\n\n//# sourceMappingURL=index.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-webgpu-core/es/services/index.js\n\n\n\n//# sourceMappingURL=index.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy13ZWJncHUtY29yZS9lcy9zZXJ2aWNlcy9jb25maWcvaW5kZXguanM/ZTI0MyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy13ZWJncHUtY29yZS9lcy9zZXJ2aWNlcy9pbnRlcmFjdG9yL2luZGV4LmpzP2FlZWIiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2ctd2ViZ3B1LWNvcmUvZXMvc2VydmljZXMvc2hhZGVyLW1vZHVsZS9pbmRleC5qcz85MWZjIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9nLXdlYmdwdS1jb3JlL2VzL3NlcnZpY2VzL2luZGV4LmpzP2YyMzgiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFnQztBQUNoQyxpQzs7Ozs7QUNEbUM7QUFDbkMsaUM7Ozs7O0FDRHNDO0FBQ3RDLGlDOztBQ0R5QjtBQUNJO0FBQ0c7QUFDaEMiLCJmaWxlIjoiMjc4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9Db25maWdTZXJ2aWNlJztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsImV4cG9ydCAqIGZyb20gJy4vSXRlcmFjdG9yU2VydmljZSc7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJleHBvcnQgKiBmcm9tICcuL1NoYWRlck1vZHVsZVNlcnZpY2UnO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiZXhwb3J0ICogZnJvbSAnLi9jb25maWcnO1xuZXhwb3J0ICogZnJvbSAnLi9pbnRlcmFjdG9yJztcbmV4cG9ydCAqIGZyb20gJy4vc2hhZGVyLW1vZHVsZSc7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///278\n")},function(module,__webpack_exports__,__webpack_require__){"use strict";eval('\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, "a", function() { return /* reexport */ AABB["a" /* AABB */]; });\n__webpack_require__.d(__webpack_exports__, "b", function() { return /* reexport */ Frustum["a" /* Frustum */]; });\n\n// UNUSED EXPORTS: BoundingSphere, Mask, Plane, Ray\n\n// EXTERNAL MODULE: ./node_modules/@antv/g-webgpu-core/es/shape/AABB.js\nvar AABB = __webpack_require__(79);\n\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/classCallCheck.js\nvar classCallCheck = __webpack_require__(6);\nvar classCallCheck_default = /*#__PURE__*/__webpack_require__.n(classCallCheck);\n\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/createClass.js\nvar createClass = __webpack_require__(7);\nvar createClass_default = /*#__PURE__*/__webpack_require__.n(createClass);\n\n// EXTERNAL MODULE: ./node_modules/gl-matrix/esm/index.js + 4 modules\nvar esm = __webpack_require__(2);\n\n// CONCATENATED MODULE: ./node_modules/@antv/g-webgpu-core/es/shape/BoundingSphere.js\n\n\n\nvar tmpVecA = esm["e" /* vec3 */].create();\nvar BoundingSphere_BoundingSphere = /*#__PURE__*/function () {\n function BoundingSphere(center, radius) {\n classCallCheck_default()(this, BoundingSphere);\n\n this.center = void 0;\n this.radius = void 0;\n this.center = center || esm["e" /* vec3 */].create();\n this.radius = radius || 0.5;\n }\n\n createClass_default()(BoundingSphere, [{\n key: "containsPoint",\n value: function containsPoint(point) {\n esm["e" /* vec3 */].sub(tmpVecA, point, this.center);\n return esm["e" /* vec3 */].length(tmpVecA) < this.radius * this.radius;\n }\n }, {\n key: "intersects",\n value: function intersects(sphere) {\n esm["e" /* vec3 */].sub(tmpVecA, sphere.center, this.center);\n var totalRadius = sphere.radius + this.radius;\n\n if (esm["e" /* vec3 */].length(tmpVecA) <= totalRadius * totalRadius) {\n return true;\n }\n\n return false;\n }\n }]);\n\n return BoundingSphere;\n}();\n//# sourceMappingURL=BoundingSphere.js.map\n// EXTERNAL MODULE: ./node_modules/@antv/g-webgpu-core/es/shape/Frustum.js\nvar Frustum = __webpack_require__(58);\n\n// EXTERNAL MODULE: ./node_modules/@antv/g-webgpu-core/es/shape/Plane.js\nvar Plane = __webpack_require__(128);\n\n// CONCATENATED MODULE: ./node_modules/@antv/g-webgpu-core/es/shape/Ray.js\n\n\n\nvar Ray_tmpVecA = esm["e" /* vec3 */].create();\nvar tmpVecB = esm["e" /* vec3 */].create();\nvar tmpVecC = esm["e" /* vec3 */].create();\nvar tmpVecD = esm["e" /* vec3 */].create();\nvar tmpVecE = esm["e" /* vec3 */].create();\n/**\n * 包含求交方法:\n * * intersectsShape(Shape, intersection) 返回交点和求交结果\n * @see https://github.com/playcanvas/engine/blob/master/src/shape/bounding-box.js#L161\n * @see https://github.com/mrdoob/three.js/blob/dev/src/math/Ray.js\n */\n\nvar Ray_Ray = /*#__PURE__*/function () {\n function Ray(origin, direction) {\n classCallCheck_default()(this, Ray);\n\n this.origin = void 0;\n this.direction = void 0;\n this.origin = origin || esm["e" /* vec3 */].create();\n this.direction = direction || esm["e" /* vec3 */].fromValues(0, 0, -1);\n }\n\n createClass_default()(Ray, [{\n key: "intersectsAABB",\n value: function intersectsAABB(aabb, intersection) {\n return intersection ? this.intersectAABBWithIntersection(aabb, intersection) : this.intersectsAABBWithoutIntersection(aabb);\n }\n }, {\n key: "intersectsSphere",\n value: function intersectsSphere(sphere, intersection) {\n var m = esm["e" /* vec3 */].sub(Ray_tmpVecA, this.origin, sphere.center);\n esm["e" /* vec3 */].normalize(tmpVecB, esm["e" /* vec3 */].copy(tmpVecB, this.direction));\n var b = esm["e" /* vec3 */].dot(m, tmpVecB);\n var c = esm["e" /* vec3 */].dot(m, m) - sphere.radius * sphere.radius; // exit if ray\'s origin outside of sphere (c > 0) and ray pointing away from s (b > 0)\n\n if (c > 0 && b > 0) {\n return null;\n }\n\n var discr = b * b - c; // a negative discriminant corresponds to ray missing sphere\n\n if (discr < 0) {\n return false;\n } // ray intersects sphere, compute smallest t value of intersection\n\n\n var t = Math.abs(-b - Math.sqrt(discr)); // if t is negative, ray started inside sphere so clamp t to zero\n\n if (intersection) {\n esm["e" /* vec3 */].copy(intersection, this.direction);\n esm["e" /* vec3 */].scaleAndAdd(intersection, this.origin, intersection, t);\n }\n\n return true;\n }\n }, {\n key: "intersectsPlane",\n value: function intersectsPlane(plane, intersection) {\n var t = (plane.distance - esm["e" /* vec3 */].dot(plane.normal, this.origin)) / esm["e" /* vec3 */].dot(plane.normal, this.direction);\n var intersects = t >= 0;\n\n if (intersects && intersection) {\n esm["e" /* vec3 */].scaleAndAdd(intersection, this.origin, this.direction, t);\n }\n\n return intersects;\n }\n /**\n * faster than implements like Three.js\n * @see https://github.com/playcanvas/engine/blob/master/src/shape/bounding-box.js#L161\n */\n\n }, {\n key: "intersectsAABBWithoutIntersection",\n value: function intersectsAABBWithoutIntersection(aabb) {\n var diff = Ray_tmpVecA;\n var cross = tmpVecB;\n var prod = tmpVecC;\n var absDiff = tmpVecD;\n var absDir = tmpVecE;\n var rayDir = this.direction;\n esm["e" /* vec3 */].sub(diff, this.origin, aabb.center);\n esm["e" /* vec3 */].set(absDiff, Math.abs(diff[0]), Math.abs(diff[1]), Math.abs(diff[2]));\n esm["e" /* vec3 */].mul(prod, diff, rayDir);\n\n if (absDiff[0] > aabb.halfExtents[0] && prod[0] >= 0 || absDiff[1] > aabb.halfExtents[1] && prod[1] >= 0 || absDiff[2] > aabb.halfExtents[2] && prod[2] >= 0) {\n return false;\n }\n\n esm["e" /* vec3 */].set(absDir, Math.abs(rayDir[0]), Math.abs(rayDir[1]), Math.abs(rayDir[2]));\n esm["e" /* vec3 */].cross(cross, rayDir, diff);\n esm["e" /* vec3 */].set(cross, Math.abs(cross[0]), Math.abs(cross[1]), Math.abs(cross[2]));\n return !(cross[0] > aabb.halfExtents[1] * absDir[2] + aabb.halfExtents[2] * absDir[1] || cross[1] > aabb.halfExtents[0] * absDir[2] + aabb.halfExtents[2] * absDir[0] || cross[2] > aabb.halfExtents[0] * absDir[1] + aabb.halfExtents[1] * absDir[0]);\n }\n }, {\n key: "intersectAABBWithIntersection",\n value: function intersectAABBWithIntersection(aabb, intersection) {\n var tMin = esm["e" /* vec3 */].copy(esm["e" /* vec3 */].create(), aabb.getMin());\n esm["e" /* vec3 */].sub(tMin, tMin, this.origin);\n var tMax = esm["e" /* vec3 */].copy(esm["e" /* vec3 */].create(), aabb.getMax());\n esm["e" /* vec3 */].sub(tMax, tMax, this.origin);\n var dir = this.direction; // Ensure that we are not dividing it by zero\n\n if (dir[0] === 0) {\n tMin[0] = tMin[0] < 0 ? -Number.MAX_VALUE : Number.MAX_VALUE;\n tMax[0] = tMax[0] < 0 ? -Number.MAX_VALUE : Number.MAX_VALUE;\n } else {\n tMin[0] /= dir[0];\n tMax[0] /= dir[0];\n }\n\n if (dir[1] === 0) {\n tMin[1] = tMin[1] < 0 ? -Number.MAX_VALUE : Number.MAX_VALUE;\n tMax[1] = tMax[1] < 0 ? -Number.MAX_VALUE : Number.MAX_VALUE;\n } else {\n tMin[1] /= dir[1];\n tMax[1] /= dir[1];\n }\n\n if (dir[2] === 0) {\n tMin[2] = tMin[2] < 0 ? -Number.MAX_VALUE : Number.MAX_VALUE;\n tMax[2] = tMax[2] < 0 ? -Number.MAX_VALUE : Number.MAX_VALUE;\n } else {\n tMin[2] /= dir[2];\n tMax[2] /= dir[2];\n }\n\n var realMin = esm["e" /* vec3 */].set(tmpVecC, Math.min(tMin[0], tMax[0]), Math.min(tMin[1], tMax[1]), Math.min(tMin[2], tMax[2]));\n var realMax = esm["e" /* vec3 */].set(tmpVecD, Math.max(tMin[0], tMax[0]), Math.max(tMin[1], tMax[1]), Math.max(tMin[2], tMax[2]));\n var minMax = Math.min(Math.min(realMax[0], realMax[1]), realMax[2]);\n var maxMin = Math.max(Math.max(realMin[0], realMin[1]), realMin[2]);\n var intersects = minMax >= maxMin && maxMin >= 0;\n\n if (intersects) {\n esm["e" /* vec3 */].copy(intersection, this.direction);\n esm["e" /* vec3 */].scaleAndAdd(intersection, this.origin, intersection, maxMin);\n }\n\n return intersects;\n }\n }]);\n\n return Ray;\n}();\n//# sourceMappingURL=Ray.js.map\n// CONCATENATED MODULE: ./node_modules/@antv/g-webgpu-core/es/shape/index.js\n\n\n\n\n\n//# sourceMappingURL=index.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy13ZWJncHUtY29yZS9lcy9zaGFwZS9Cb3VuZGluZ1NwaGVyZS5qcz82OWU1Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9nLXdlYmdwdS1jb3JlL2VzL3NoYXBlL1JheS5qcz9kMjA1Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW50di9nLXdlYmdwdS1jb3JlL2VzL3NoYXBlL2luZGV4LmpzP2UzYzgiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFvRTtBQUNOO0FBQzdCO0FBQ2pDLGNBQWMsbUJBQUk7QUFDWCxJQUFJLDZCQUFjO0FBQ3pCO0FBQ0EsSUFBSSx3QkFBZTs7QUFFbkI7QUFDQTtBQUNBLDRCQUE0QixtQkFBSTtBQUNoQztBQUNBOztBQUVBLEVBQUUscUJBQVk7QUFDZDtBQUNBO0FBQ0EsTUFBTSxtQkFBSTtBQUNWLGFBQWEsbUJBQUk7QUFDakI7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLE1BQU0sbUJBQUk7QUFDVjs7QUFFQSxVQUFVLG1CQUFJO0FBQ2Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBLENBQUM7QUFDRCwwQzs7Ozs7Ozs7QUNwQ29FO0FBQ047QUFDN0I7QUFDakMsSUFBSSxXQUFPLEdBQUcsbUJBQUk7QUFDbEIsY0FBYyxtQkFBSTtBQUNsQixjQUFjLG1CQUFJO0FBQ2xCLGNBQWMsbUJBQUk7QUFDbEIsY0FBYyxtQkFBSTtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRU8sSUFBSSxPQUFHO0FBQ2Q7QUFDQSxJQUFJLHdCQUFlOztBQUVuQjtBQUNBO0FBQ0EsNEJBQTRCLG1CQUFJO0FBQ2hDLGtDQUFrQyxtQkFBSTtBQUN0Qzs7QUFFQSxFQUFFLHFCQUFZO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLGNBQWMsbUJBQUksS0FBSyxXQUFPO0FBQzlCLE1BQU0sbUJBQUksb0JBQW9CLG1CQUFJO0FBQ2xDLGNBQWMsbUJBQUk7QUFDbEIsY0FBYyxtQkFBSSwyQ0FBMkM7O0FBRTdEO0FBQ0E7QUFDQTs7QUFFQSw0QkFBNEI7O0FBRTVCO0FBQ0E7QUFDQSxPQUFPOzs7QUFHUCw4Q0FBOEM7O0FBRTlDO0FBQ0EsUUFBUSxtQkFBSTtBQUNaLFFBQVEsbUJBQUk7QUFDWjs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxnQ0FBZ0MsbUJBQUksbUNBQW1DLG1CQUFJO0FBQzNFOztBQUVBO0FBQ0EsUUFBUSxtQkFBSTtBQUNaOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLGlCQUFpQixXQUFPO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLG1CQUFJO0FBQ1YsTUFBTSxtQkFBSTtBQUNWLE1BQU0sbUJBQUk7O0FBRVY7QUFDQTtBQUNBOztBQUVBLE1BQU0sbUJBQUk7QUFDVixNQUFNLG1CQUFJO0FBQ1YsTUFBTSxtQkFBSTtBQUNWO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLGlCQUFpQixtQkFBSSxNQUFNLG1CQUFJO0FBQy9CLE1BQU0sbUJBQUk7QUFDVixpQkFBaUIsbUJBQUksTUFBTSxtQkFBSTtBQUMvQixNQUFNLG1CQUFJO0FBQ1YsK0JBQStCOztBQUUvQjtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQSxvQkFBb0IsbUJBQUk7QUFDeEIsb0JBQW9CLG1CQUFJO0FBQ3hCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFFBQVEsbUJBQUk7QUFDWixRQUFRLG1CQUFJO0FBQ1o7O0FBRUE7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQSxDQUFDO0FBQ0QsK0I7O0FDbkp1QjtBQUNVO0FBQ1A7QUFDRjtBQUNGO0FBQ3RCIiwiZmlsZSI6IjI3OS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfY2xhc3NDYWxsQ2hlY2sgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2tcIjtcbmltcG9ydCBfY3JlYXRlQ2xhc3MgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlQ2xhc3NcIjtcbmltcG9ydCB7IHZlYzMgfSBmcm9tICdnbC1tYXRyaXgnO1xudmFyIHRtcFZlY0EgPSB2ZWMzLmNyZWF0ZSgpO1xuZXhwb3J0IHZhciBCb3VuZGluZ1NwaGVyZSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEJvdW5kaW5nU3BoZXJlKGNlbnRlciwgcmFkaXVzKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEJvdW5kaW5nU3BoZXJlKTtcblxuICAgIHRoaXMuY2VudGVyID0gdm9pZCAwO1xuICAgIHRoaXMucmFkaXVzID0gdm9pZCAwO1xuICAgIHRoaXMuY2VudGVyID0gY2VudGVyIHx8IHZlYzMuY3JlYXRlKCk7XG4gICAgdGhpcy5yYWRpdXMgPSByYWRpdXMgfHwgMC41O1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKEJvdW5kaW5nU3BoZXJlLCBbe1xuICAgIGtleTogXCJjb250YWluc1BvaW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbnRhaW5zUG9pbnQocG9pbnQpIHtcbiAgICAgIHZlYzMuc3ViKHRtcFZlY0EsIHBvaW50LCB0aGlzLmNlbnRlcik7XG4gICAgICByZXR1cm4gdmVjMy5sZW5ndGgodG1wVmVjQSkgPCB0aGlzLnJhZGl1cyAqIHRoaXMucmFkaXVzO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpbnRlcnNlY3RzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGludGVyc2VjdHMoc3BoZXJlKSB7XG4gICAgICB2ZWMzLnN1Yih0bXBWZWNBLCBzcGhlcmUuY2VudGVyLCB0aGlzLmNlbnRlcik7XG4gICAgICB2YXIgdG90YWxSYWRpdXMgPSBzcGhlcmUucmFkaXVzICsgdGhpcy5yYWRpdXM7XG5cbiAgICAgIGlmICh2ZWMzLmxlbmd0aCh0bXBWZWNBKSA8PSB0b3RhbFJhZGl1cyAqIHRvdGFsUmFkaXVzKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEJvdW5kaW5nU3BoZXJlO1xufSgpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Qm91bmRpbmdTcGhlcmUuanMubWFwIiwiaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzc1wiO1xuaW1wb3J0IHsgdmVjMyB9IGZyb20gJ2dsLW1hdHJpeCc7XG52YXIgdG1wVmVjQSA9IHZlYzMuY3JlYXRlKCk7XG52YXIgdG1wVmVjQiA9IHZlYzMuY3JlYXRlKCk7XG52YXIgdG1wVmVjQyA9IHZlYzMuY3JlYXRlKCk7XG52YXIgdG1wVmVjRCA9IHZlYzMuY3JlYXRlKCk7XG52YXIgdG1wVmVjRSA9IHZlYzMuY3JlYXRlKCk7XG4vKipcbiAqIOWMheWQq+axguS6pOaWueazle+8mlxuICogKiBpbnRlcnNlY3RzU2hhcGUoU2hhcGUsIGludGVyc2VjdGlvbikg6L+U5Zue5Lqk54K55ZKM5rGC5Lqk57uT5p6cXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9wbGF5Y2FudmFzL2VuZ2luZS9ibG9iL21hc3Rlci9zcmMvc2hhcGUvYm91bmRpbmctYm94LmpzI0wxNjFcbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL21yZG9vYi90aHJlZS5qcy9ibG9iL2Rldi9zcmMvbWF0aC9SYXkuanNcbiAqL1xuXG5leHBvcnQgdmFyIFJheSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFJheShvcmlnaW4sIGRpcmVjdGlvbikge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBSYXkpO1xuXG4gICAgdGhpcy5vcmlnaW4gPSB2b2lkIDA7XG4gICAgdGhpcy5kaXJlY3Rpb24gPSB2b2lkIDA7XG4gICAgdGhpcy5vcmlnaW4gPSBvcmlnaW4gfHwgdmVjMy5jcmVhdGUoKTtcbiAgICB0aGlzLmRpcmVjdGlvbiA9IGRpcmVjdGlvbiB8fCB2ZWMzLmZyb21WYWx1ZXMoMCwgMCwgLTEpO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKFJheSwgW3tcbiAgICBrZXk6IFwiaW50ZXJzZWN0c0FBQkJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaW50ZXJzZWN0c0FBQkIoYWFiYiwgaW50ZXJzZWN0aW9uKSB7XG4gICAgICByZXR1cm4gaW50ZXJzZWN0aW9uID8gdGhpcy5pbnRlcnNlY3RBQUJCV2l0aEludGVyc2VjdGlvbihhYWJiLCBpbnRlcnNlY3Rpb24pIDogdGhpcy5pbnRlcnNlY3RzQUFCQldpdGhvdXRJbnRlcnNlY3Rpb24oYWFiYik7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImludGVyc2VjdHNTcGhlcmVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaW50ZXJzZWN0c1NwaGVyZShzcGhlcmUsIGludGVyc2VjdGlvbikge1xuICAgICAgdmFyIG0gPSB2ZWMzLnN1Yih0bXBWZWNBLCB0aGlzLm9yaWdpbiwgc3BoZXJlLmNlbnRlcik7XG4gICAgICB2ZWMzLm5vcm1hbGl6ZSh0bXBWZWNCLCB2ZWMzLmNvcHkodG1wVmVjQiwgdGhpcy5kaXJlY3Rpb24pKTtcbiAgICAgIHZhciBiID0gdmVjMy5kb3QobSwgdG1wVmVjQik7XG4gICAgICB2YXIgYyA9IHZlYzMuZG90KG0sIG0pIC0gc3BoZXJlLnJhZGl1cyAqIHNwaGVyZS5yYWRpdXM7IC8vIGV4aXQgaWYgcmF5J3Mgb3JpZ2luIG91dHNpZGUgb2Ygc3BoZXJlIChjID4gMCkgYW5kIHJheSBwb2ludGluZyBhd2F5IGZyb20gcyAoYiA+IDApXG5cbiAgICAgIGlmIChjID4gMCAmJiBiID4gMCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgdmFyIGRpc2NyID0gYiAqIGIgLSBjOyAvLyBhIG5lZ2F0aXZlIGRpc2NyaW1pbmFudCBjb3JyZXNwb25kcyB0byByYXkgbWlzc2luZyBzcGhlcmVcblxuICAgICAgaWYgKGRpc2NyIDwgMCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9IC8vIHJheSBpbnRlcnNlY3RzIHNwaGVyZSwgY29tcHV0ZSBzbWFsbGVzdCB0IHZhbHVlIG9mIGludGVyc2VjdGlvblxuXG5cbiAgICAgIHZhciB0ID0gTWF0aC5hYnMoLWIgLSBNYXRoLnNxcnQoZGlzY3IpKTsgLy8gaWYgdCBpcyBuZWdhdGl2ZSwgcmF5IHN0YXJ0ZWQgaW5zaWRlIHNwaGVyZSBzbyBjbGFtcCB0IHRvIHplcm9cblxuICAgICAgaWYgKGludGVyc2VjdGlvbikge1xuICAgICAgICB2ZWMzLmNvcHkoaW50ZXJzZWN0aW9uLCB0aGlzLmRpcmVjdGlvbik7XG4gICAgICAgIHZlYzMuc2NhbGVBbmRBZGQoaW50ZXJzZWN0aW9uLCB0aGlzLm9yaWdpbiwgaW50ZXJzZWN0aW9uLCB0KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImludGVyc2VjdHNQbGFuZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpbnRlcnNlY3RzUGxhbmUocGxhbmUsIGludGVyc2VjdGlvbikge1xuICAgICAgdmFyIHQgPSAocGxhbmUuZGlzdGFuY2UgLSB2ZWMzLmRvdChwbGFuZS5ub3JtYWwsIHRoaXMub3JpZ2luKSkgLyB2ZWMzLmRvdChwbGFuZS5ub3JtYWwsIHRoaXMuZGlyZWN0aW9uKTtcbiAgICAgIHZhciBpbnRlcnNlY3RzID0gdCA+PSAwO1xuXG4gICAgICBpZiAoaW50ZXJzZWN0cyAmJiBpbnRlcnNlY3Rpb24pIHtcbiAgICAgICAgdmVjMy5zY2FsZUFuZEFkZChpbnRlcnNlY3Rpb24sIHRoaXMub3JpZ2luLCB0aGlzLmRpcmVjdGlvbiwgdCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBpbnRlcnNlY3RzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBmYXN0ZXIgdGhhbiBpbXBsZW1lbnRzIGxpa2UgVGhyZWUuanNcbiAgICAgKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9wbGF5Y2FudmFzL2VuZ2luZS9ibG9iL21hc3Rlci9zcmMvc2hhcGUvYm91bmRpbmctYm94LmpzI0wxNjFcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImludGVyc2VjdHNBQUJCV2l0aG91dEludGVyc2VjdGlvblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpbnRlcnNlY3RzQUFCQldpdGhvdXRJbnRlcnNlY3Rpb24oYWFiYikge1xuICAgICAgdmFyIGRpZmYgPSB0bXBWZWNBO1xuICAgICAgdmFyIGNyb3NzID0gdG1wVmVjQjtcbiAgICAgIHZhciBwcm9kID0gdG1wVmVjQztcbiAgICAgIHZhciBhYnNEaWZmID0gdG1wVmVjRDtcbiAgICAgIHZhciBhYnNEaXIgPSB0bXBWZWNFO1xuICAgICAgdmFyIHJheURpciA9IHRoaXMuZGlyZWN0aW9uO1xuICAgICAgdmVjMy5zdWIoZGlmZiwgdGhpcy5vcmlnaW4sIGFhYmIuY2VudGVyKTtcbiAgICAgIHZlYzMuc2V0KGFic0RpZmYsIE1hdGguYWJzKGRpZmZbMF0pLCBNYXRoLmFicyhkaWZmWzFdKSwgTWF0aC5hYnMoZGlmZlsyXSkpO1xuICAgICAgdmVjMy5tdWwocHJvZCwgZGlmZiwgcmF5RGlyKTtcblxuICAgICAgaWYgKGFic0RpZmZbMF0gPiBhYWJiLmhhbGZFeHRlbnRzWzBdICYmIHByb2RbMF0gPj0gMCB8fCBhYnNEaWZmWzFdID4gYWFiYi5oYWxmRXh0ZW50c1sxXSAmJiBwcm9kWzFdID49IDAgfHwgYWJzRGlmZlsyXSA+IGFhYmIuaGFsZkV4dGVudHNbMl0gJiYgcHJvZFsyXSA+PSAwKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgdmVjMy5zZXQoYWJzRGlyLCBNYXRoLmFicyhyYXlEaXJbMF0pLCBNYXRoLmFicyhyYXlEaXJbMV0pLCBNYXRoLmFicyhyYXlEaXJbMl0pKTtcbiAgICAgIHZlYzMuY3Jvc3MoY3Jvc3MsIHJheURpciwgZGlmZik7XG4gICAgICB2ZWMzLnNldChjcm9zcywgTWF0aC5hYnMoY3Jvc3NbMF0pLCBNYXRoLmFicyhjcm9zc1sxXSksIE1hdGguYWJzKGNyb3NzWzJdKSk7XG4gICAgICByZXR1cm4gIShjcm9zc1swXSA+IGFhYmIuaGFsZkV4dGVudHNbMV0gKiBhYnNEaXJbMl0gKyBhYWJiLmhhbGZFeHRlbnRzWzJdICogYWJzRGlyWzFdIHx8IGNyb3NzWzFdID4gYWFiYi5oYWxmRXh0ZW50c1swXSAqIGFic0RpclsyXSArIGFhYmIuaGFsZkV4dGVudHNbMl0gKiBhYnNEaXJbMF0gfHwgY3Jvc3NbMl0gPiBhYWJiLmhhbGZFeHRlbnRzWzBdICogYWJzRGlyWzFdICsgYWFiYi5oYWxmRXh0ZW50c1sxXSAqIGFic0RpclswXSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImludGVyc2VjdEFBQkJXaXRoSW50ZXJzZWN0aW9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGludGVyc2VjdEFBQkJXaXRoSW50ZXJzZWN0aW9uKGFhYmIsIGludGVyc2VjdGlvbikge1xuICAgICAgdmFyIHRNaW4gPSB2ZWMzLmNvcHkodmVjMy5jcmVhdGUoKSwgYWFiYi5nZXRNaW4oKSk7XG4gICAgICB2ZWMzLnN1Yih0TWluLCB0TWluLCB0aGlzLm9yaWdpbik7XG4gICAgICB2YXIgdE1heCA9IHZlYzMuY29weSh2ZWMzLmNyZWF0ZSgpLCBhYWJiLmdldE1heCgpKTtcbiAgICAgIHZlYzMuc3ViKHRNYXgsIHRNYXgsIHRoaXMub3JpZ2luKTtcbiAgICAgIHZhciBkaXIgPSB0aGlzLmRpcmVjdGlvbjsgLy8gRW5zdXJlIHRoYXQgd2UgYXJlIG5vdCBkaXZpZGluZyBpdCBieSB6ZXJvXG5cbiAgICAgIGlmIChkaXJbMF0gPT09IDApIHtcbiAgICAgICAgdE1pblswXSA9IHRNaW5bMF0gPCAwID8gLU51bWJlci5NQVhfVkFMVUUgOiBOdW1iZXIuTUFYX1ZBTFVFO1xuICAgICAgICB0TWF4WzBdID0gdE1heFswXSA8IDAgPyAtTnVtYmVyLk1BWF9WQUxVRSA6IE51bWJlci5NQVhfVkFMVUU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0TWluWzBdIC89IGRpclswXTtcbiAgICAgICAgdE1heFswXSAvPSBkaXJbMF07XG4gICAgICB9XG5cbiAgICAgIGlmIChkaXJbMV0gPT09IDApIHtcbiAgICAgICAgdE1pblsxXSA9IHRNaW5bMV0gPCAwID8gLU51bWJlci5NQVhfVkFMVUUgOiBOdW1iZXIuTUFYX1ZBTFVFO1xuICAgICAgICB0TWF4WzFdID0gdE1heFsxXSA8IDAgPyAtTnVtYmVyLk1BWF9WQUxVRSA6IE51bWJlci5NQVhfVkFMVUU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0TWluWzFdIC89IGRpclsxXTtcbiAgICAgICAgdE1heFsxXSAvPSBkaXJbMV07XG4gICAgICB9XG5cbiAgICAgIGlmIChkaXJbMl0gPT09IDApIHtcbiAgICAgICAgdE1pblsyXSA9IHRNaW5bMl0gPCAwID8gLU51bWJlci5NQVhfVkFMVUUgOiBOdW1iZXIuTUFYX1ZBTFVFO1xuICAgICAgICB0TWF4WzJdID0gdE1heFsyXSA8IDAgPyAtTnVtYmVyLk1BWF9WQUxVRSA6IE51bWJlci5NQVhfVkFMVUU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0TWluWzJdIC89IGRpclsyXTtcbiAgICAgICAgdE1heFsyXSAvPSBkaXJbMl07XG4gICAgICB9XG5cbiAgICAgIHZhciByZWFsTWluID0gdmVjMy5zZXQodG1wVmVjQywgTWF0aC5taW4odE1pblswXSwgdE1heFswXSksIE1hdGgubWluKHRNaW5bMV0sIHRNYXhbMV0pLCBNYXRoLm1pbih0TWluWzJdLCB0TWF4WzJdKSk7XG4gICAgICB2YXIgcmVhbE1heCA9IHZlYzMuc2V0KHRtcFZlY0QsIE1hdGgubWF4KHRNaW5bMF0sIHRNYXhbMF0pLCBNYXRoLm1heCh0TWluWzFdLCB0TWF4WzFdKSwgTWF0aC5tYXgodE1pblsyXSwgdE1heFsyXSkpO1xuICAgICAgdmFyIG1pbk1heCA9IE1hdGgubWluKE1hdGgubWluKHJlYWxNYXhbMF0sIHJlYWxNYXhbMV0pLCByZWFsTWF4WzJdKTtcbiAgICAgIHZhciBtYXhNaW4gPSBNYXRoLm1heChNYXRoLm1heChyZWFsTWluWzBdLCByZWFsTWluWzFdKSwgcmVhbE1pblsyXSk7XG4gICAgICB2YXIgaW50ZXJzZWN0cyA9IG1pbk1heCA+PSBtYXhNaW4gJiYgbWF4TWluID49IDA7XG5cbiAgICAgIGlmIChpbnRlcnNlY3RzKSB7XG4gICAgICAgIHZlYzMuY29weShpbnRlcnNlY3Rpb24sIHRoaXMuZGlyZWN0aW9uKTtcbiAgICAgICAgdmVjMy5zY2FsZUFuZEFkZChpbnRlcnNlY3Rpb24sIHRoaXMub3JpZ2luLCBpbnRlcnNlY3Rpb24sIG1heE1pbik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBpbnRlcnNlY3RzO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBSYXk7XG59KCk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1SYXkuanMubWFwIiwiZXhwb3J0ICogZnJvbSAnLi9BQUJCJztcbmV4cG9ydCAqIGZyb20gJy4vQm91bmRpbmdTcGhlcmUnO1xuZXhwb3J0ICogZnJvbSAnLi9GcnVzdHVtJztcbmV4cG9ydCAqIGZyb20gJy4vUGxhbmUnO1xuZXhwb3J0ICogZnJvbSAnLi9SYXknO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///279\n')},function(module,__webpack_exports__,__webpack_require__){"use strict";eval("\n// EXTERNAL MODULE: ./node_modules/tslib/tslib.es6.js\nvar tslib_es6 = __webpack_require__(1);\n\n// EXTERNAL MODULE: ./node_modules/@antv/g-base/esm/index.js\nvar esm = __webpack_require__(21);\n\n// CONCATENATED MODULE: ./node_modules/@antv/g-canvas/esm/util/hit.js\n\nfunction invertFromMatrix(v, matrix) {\n if (matrix) {\n var invertMatrix = Object(esm[\"invert\"])(matrix);\n return Object(esm[\"multiplyVec2\"])(invertMatrix, v);\n }\n return v;\n}\nfunction getRefXY(element, x, y) {\n // @ts-ignore\n var totalMatrix = element.getTotalMatrix();\n if (totalMatrix) {\n var _a = invertFromMatrix([x, y, 1], totalMatrix), refX = _a[0], refY = _a[1];\n return [refX, refY];\n }\n return [x, y];\n}\n// 拾取前的检测,只有通过检测才能继续拾取\nfunction preTest(element, x, y) {\n // @ts-ignore\n if (element.isCanvas && element.isCanvas()) {\n return true;\n }\n // 不允许被拾取,则返回 null\n // @ts-ignore\n if (!Object(esm[\"isAllowCapture\"])(element) || element.cfg.isInView === false) {\n return false;\n }\n if (element.cfg.clipShape) {\n // 如果存在 clip\n var _a = getRefXY(element, x, y), refX = _a[0], refY = _a[1];\n if (element.isClipped(refX, refY)) {\n return false;\n }\n }\n // @ts-ignore ,这个地方调用过于频繁\n var bbox = element.cfg.cacheCanvasBBox || element.getCanvasBBox();\n // 如果没有缓存 bbox,则说明不可见\n // 注释掉的这段可能会加速拾取,上面的语句改写成 const bbox = element.cfg.cacheCanvasBBox;\n // 这时候的拾取假设图形/分组在上一次绘制都在视窗内,但是上面已经判定了 isInView 所以意义不大\n // 现在还调用 element.getCanvasBBox(); 一个很大的原因是便于单元测试\n // if (!bbox) {\n // return false;\n // }\n if (!(x >= bbox.minX && x <= bbox.maxX && y >= bbox.minY && y <= bbox.maxY)) {\n return false;\n }\n return true;\n}\n// 这个方法复写了 g-base 的 getShape\nfunction getShape(container, x, y) {\n // 没有通过检测,则返回 null\n if (!preTest(container, x, y)) {\n return null;\n }\n var shape = null;\n var children = container.getChildren();\n var count = children.length;\n for (var i = count - 1; i >= 0; i--) {\n var child = children[i];\n if (child.isGroup()) {\n shape = getShape(child, x, y);\n }\n else if (preTest(child, x, y)) {\n var curShape = child;\n var _a = getRefXY(child, x, y), refX = _a[0], refY = _a[1];\n // @ts-ignore\n if (curShape.isInShape(refX, refY)) {\n shape = child;\n }\n }\n if (shape) {\n break;\n }\n }\n return shape;\n}\n//# sourceMappingURL=hit.js.map\n// EXTERNAL MODULE: ./node_modules/@antv/g-canvas/esm/shape/index.js + 19 modules\nvar esm_shape = __webpack_require__(57);\n\n// EXTERNAL MODULE: ./node_modules/@antv/g-canvas/esm/group.js\nvar group = __webpack_require__(77);\n\n// EXTERNAL MODULE: ./node_modules/@antv/g-canvas/esm/util/util.js\nvar util = __webpack_require__(16);\n\n// EXTERNAL MODULE: ./node_modules/@antv/g-canvas/esm/util/draw.js\nvar draw = __webpack_require__(30);\n\n// CONCATENATED MODULE: ./node_modules/@antv/g-canvas/esm/canvas.js\n\n\n\n\n\n\n\nvar canvas_Canvas = /** @class */ (function (_super) {\n Object(tslib_es6[\"__extends\"])(Canvas, _super);\n function Canvas() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n Canvas.prototype.getDefaultCfg = function () {\n var cfg = _super.prototype.getDefaultCfg.call(this);\n // 设置渲染引擎为 canvas,只读属性\n cfg['renderer'] = 'canvas';\n // 是否自动绘制,不需要用户调用 draw 方法\n cfg['autoDraw'] = true;\n // 是否允许局部刷新图表\n cfg['localRefresh'] = true;\n cfg['refreshElements'] = [];\n // 是否在视图内自动裁剪\n cfg['clipView'] = true;\n // 是否使用快速拾取的方案,默认为 false,上层可以打开\n cfg['quickHit'] = false;\n return cfg;\n };\n /**\n * 一些方法调用会引起画布变化\n * @param {ChangeType} changeType 改变的类型\n */\n Canvas.prototype.onCanvasChange = function (changeType) {\n /**\n * 触发画布更新的三种 changeType\n * 1. attr: 修改画布的绘图属性\n * 2. sort: 画布排序,图形的层次会发生变化\n * 3. changeSize: 改变画布大小\n */\n if (changeType === 'attr' || changeType === 'sort' || changeType === 'changeSize') {\n this.set('refreshElements', [this]);\n this.draw();\n }\n };\n Canvas.prototype.getShapeBase = function () {\n return esm_shape;\n };\n Canvas.prototype.getGroupBase = function () {\n return group[\"a\" /* default */];\n };\n /**\n * 获取屏幕像素比\n */\n Canvas.prototype.getPixelRatio = function () {\n var pixelRatio = this.get('pixelRatio') || Object(util[\"d\" /* getPixelRatio */])();\n // 不足 1 的取 1,超出 1 的取整\n return pixelRatio >= 1 ? Math.ceil(pixelRatio) : 1;\n };\n Canvas.prototype.getViewRange = function () {\n return {\n minX: 0,\n minY: 0,\n maxX: this.cfg.width,\n maxY: this.cfg.height,\n };\n };\n // 复写基类的方法生成标签\n Canvas.prototype.createDom = function () {\n var element = document.createElement('canvas');\n var context = element.getContext('2d');\n // 缓存 context 对象\n this.set('context', context);\n return element;\n };\n Canvas.prototype.setDOMSize = function (width, height) {\n _super.prototype.setDOMSize.call(this, width, height);\n var context = this.get('context');\n var el = this.get('el');\n var pixelRatio = this.getPixelRatio();\n el.width = pixelRatio * width;\n el.height = pixelRatio * height;\n // 设置 canvas 元素的宽度和高度,会重置缩放,因此 context.scale 需要在每次设置宽、高后调用\n if (pixelRatio > 1) {\n context.scale(pixelRatio, pixelRatio);\n }\n };\n // 复写基类方法\n Canvas.prototype.clear = function () {\n _super.prototype.clear.call(this);\n this._clearFrame(); // 需要清理掉延迟绘制的帧\n var context = this.get('context');\n var element = this.get('el');\n context.clearRect(0, 0, element.width, element.height);\n };\n Canvas.prototype.getShape = function (x, y) {\n var shape;\n if (this.get('quickHit')) {\n shape = getShape(this, x, y);\n }\n else {\n shape = _super.prototype.getShape.call(this, x, y, null);\n }\n return shape;\n };\n // 对绘制区域边缘取整,避免浮点数问题\n Canvas.prototype._getRefreshRegion = function () {\n var elements = this.get('refreshElements');\n var viewRegion = this.getViewRange();\n var region;\n // 如果是当前画布整体发生了变化,则直接重绘整个画布\n if (elements.length && elements[0] === this) {\n region = viewRegion;\n }\n else {\n region = Object(draw[\"f\" /* getMergedRegion */])(elements);\n if (region) {\n region.minX = Math.floor(region.minX);\n region.minY = Math.floor(region.minY);\n region.maxX = Math.ceil(region.maxX);\n region.maxY = Math.ceil(region.maxY);\n region.maxY += 1; // 在很多环境下字体的高低会不一致,附加一像素,避免残影\n var clipView = this.get('clipView');\n // 自动裁剪不在 view 内的区域\n if (clipView) {\n region = Object(draw[\"g\" /* mergeView */])(region, viewRegion);\n }\n }\n }\n return region;\n };\n /**\n * 刷新图形元素,这里仅仅是放入队列,下次绘制时进行绘制\n * @param {IElement} element 图形元素\n */\n Canvas.prototype.refreshElement = function (element) {\n var refreshElements = this.get('refreshElements');\n refreshElements.push(element);\n // if (this.get('autoDraw')) {\n // this._startDraw();\n // }\n };\n // 清理还在进行的绘制\n Canvas.prototype._clearFrame = function () {\n var drawFrame = this.get('drawFrame');\n if (drawFrame) {\n // 如果全部渲染时,存在局部渲染,则抛弃掉局部渲染\n Object(util[\"a\" /* clearAnimationFrame */])(drawFrame);\n this.set('drawFrame', null);\n this.set('refreshElements', []);\n }\n };\n // 手工调用绘制接口\n Canvas.prototype.draw = function () {\n var drawFrame = this.get('drawFrame');\n if (this.get('autoDraw') && drawFrame) {\n return;\n }\n this._startDraw();\n };\n // 绘制所有图形\n Canvas.prototype._drawAll = function () {\n var context = this.get('context');\n var element = this.get('el');\n var children = this.getChildren();\n context.clearRect(0, 0, element.width, element.height);\n Object(draw[\"a\" /* applyAttrsToContext */])(context, this);\n Object(draw[\"d\" /* drawChildren */])(context, children);\n // 对于 https://github.com/antvis/g/issues/422 的场景,全局渲染的模式下也会记录更新的元素队列,因此全局渲染完后也需要置空\n this.set('refreshElements', []);\n };\n // 绘制局部\n Canvas.prototype._drawRegion = function () {\n var context = this.get('context');\n var refreshElements = this.get('refreshElements');\n var children = this.getChildren();\n var region = this._getRefreshRegion();\n // 需要注意可能没有 region 的场景\n // 一般发生在设置了 localRefresh ,在没有图形发生变化的情况下,用户调用了 draw\n if (region) {\n // 清理指定区域\n context.clearRect(region.minX, region.minY, region.maxX - region.minX, region.maxY - region.minY);\n // 保存上下文,设置 clip\n context.save();\n context.beginPath();\n context.rect(region.minX, region.minY, region.maxX - region.minX, region.maxY - region.minY);\n context.clip();\n Object(draw[\"a\" /* applyAttrsToContext */])(context, this);\n // 确认更新的元素,这个优化可以提升 10 倍左右的性能,10W 个带有 group 的节点,局部渲染会从 90ms 下降到 5-6 ms\n Object(draw[\"b\" /* checkRefresh */])(this, children, region);\n // 绘制子元素\n Object(draw[\"d\" /* drawChildren */])(context, children, region);\n context.restore();\n }\n else if (refreshElements.length) {\n // 防止发生改变的 elements 没有 region 的场景,这会发生在多个情况下\n // 1. 空的 group\n // 2. 所有 elements 没有在绘图区域\n // 3. group 下面的 elements 隐藏掉\n // 如果不进行清理 hasChanged 的状态会不正确\n Object(draw[\"c\" /* clearChanged */])(refreshElements);\n }\n Object(util[\"c\" /* each */])(refreshElements, function (element) {\n if (element.get('hasChanged')) {\n // 在视窗外的 Group 元素会加入到更新队列里,但实际却没有执行 draw() 逻辑,也就没有清除 hasChanged 标记\n // 即已经重绘完、但 hasChanged 标记没有清除的元素,需要统一清除掉。主要是 Group 存在问题,具体原因待排查\n element.set('hasChanged', false);\n }\n });\n this.set('refreshElements', []);\n };\n // 触发绘制\n Canvas.prototype._startDraw = function () {\n var _this = this;\n var drawFrame = this.get('drawFrame');\n if (!drawFrame) {\n drawFrame = Object(util[\"n\" /* requestAnimationFrame */])(function () {\n if (_this.get('localRefresh')) {\n _this._drawRegion();\n }\n else {\n _this._drawAll();\n }\n _this.set('drawFrame', null);\n });\n this.set('drawFrame', drawFrame);\n }\n };\n Canvas.prototype.skipDraw = function () { };\n Canvas.prototype.removeDom = function () {\n var el = this.get('el');\n // 需要清理 canvas 画布内容,否则ios下 创建的canvas垃圾未回收,导致Total canvas memory use exceeds问题\n // 相关问题列表\n // https://stackoverflow.com/questions/52532614/total-canvas-memory-use-exceeds-the-maximum-limit-safari-12\n // https://github.com/openlayers/openlayers/issues/9291\n el.width = 0;\n el.height = 0;\n el.parentNode.removeChild(el);\n };\n return Canvas;\n}(esm[\"AbstractCanvas\"]));\n/* harmony default export */ var canvas = __webpack_exports__[\"a\"] = (canvas_Canvas);\n//# sourceMappingURL=canvas.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvZy1jYW52YXMvZXNtL3V0aWwvaGl0LmpzPzk5MmQiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhbnR2L2ctY2FudmFzL2VzbS9jYW52YXMuanM/YjE4MiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFvRTtBQUNwRTtBQUNBO0FBQ0EsMkJBQTJCLHFCQUFNO0FBQ2pDLGVBQWUsMkJBQVk7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsNkJBQWM7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQztBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLFFBQVE7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0I7Ozs7Ozs7Ozs7Ozs7O0FDN0VrQztBQUNZO0FBQ1I7QUFDTDtBQUNMO0FBQ2tFO0FBQzBCO0FBQ3hILElBQUksYUFBTTtBQUNWLElBQUksOEJBQVM7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxXQUFXO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFNBQUs7QUFDcEI7QUFDQTtBQUNBLGVBQWUsd0JBQUs7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1EQUFtRCxxQ0FBYTtBQUNoRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixRQUFRO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLHVDQUFlO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUM7QUFDakM7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCLGlDQUFTO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxTQUFTO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSwyQ0FBbUI7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSwyQ0FBbUI7QUFDM0IsUUFBUSxvQ0FBWTtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksMkNBQW1CO0FBQy9CO0FBQ0EsWUFBWSxvQ0FBWTtBQUN4QjtBQUNBLFlBQVksb0NBQVk7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksb0NBQVk7QUFDeEI7QUFDQSxRQUFRLDRCQUFJO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3Qiw2Q0FBcUI7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLENBQUMscUJBQWM7QUFDRCxtRkFBTSxFQUFDO0FBQ3RCIiwiZmlsZSI6IjI4MC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzQWxsb3dDYXB0dXJlLCBtdWx0aXBseVZlYzIsIGludmVydCB9IGZyb20gJ0BhbnR2L2ctYmFzZSc7XG5mdW5jdGlvbiBpbnZlcnRGcm9tTWF0cml4KHYsIG1hdHJpeCkge1xuICAgIGlmIChtYXRyaXgpIHtcbiAgICAgICAgdmFyIGludmVydE1hdHJpeCA9IGludmVydChtYXRyaXgpO1xuICAgICAgICByZXR1cm4gbXVsdGlwbHlWZWMyKGludmVydE1hdHJpeCwgdik7XG4gICAgfVxuICAgIHJldHVybiB2O1xufVxuZnVuY3Rpb24gZ2V0UmVmWFkoZWxlbWVudCwgeCwgeSkge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB2YXIgdG90YWxNYXRyaXggPSBlbGVtZW50LmdldFRvdGFsTWF0cml4KCk7XG4gICAgaWYgKHRvdGFsTWF0cml4KSB7XG4gICAgICAgIHZhciBfYSA9IGludmVydEZyb21NYXRyaXgoW3gsIHksIDFdLCB0b3RhbE1hdHJpeCksIHJlZlggPSBfYVswXSwgcmVmWSA9IF9hWzFdO1xuICAgICAgICByZXR1cm4gW3JlZlgsIHJlZlldO1xuICAgIH1cbiAgICByZXR1cm4gW3gsIHldO1xufVxuLy8g5ou+5Y+W5YmN55qE5qOA5rWL77yM5Y+q5pyJ6YCa6L+H5qOA5rWL5omN6IO957un57ut5ou+5Y+WXG5mdW5jdGlvbiBwcmVUZXN0KGVsZW1lbnQsIHgsIHkpIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgaWYgKGVsZW1lbnQuaXNDYW52YXMgJiYgZWxlbWVudC5pc0NhbnZhcygpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvLyDkuI3lhYHorrjooqvmi77lj5bvvIzliJnov5Tlm54gbnVsbFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBpZiAoIWlzQWxsb3dDYXB0dXJlKGVsZW1lbnQpIHx8IGVsZW1lbnQuY2ZnLmlzSW5WaWV3ID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChlbGVtZW50LmNmZy5jbGlwU2hhcGUpIHtcbiAgICAgICAgLy8g5aaC5p6c5a2Y5ZyoIGNsaXBcbiAgICAgICAgdmFyIF9hID0gZ2V0UmVmWFkoZWxlbWVudCwgeCwgeSksIHJlZlggPSBfYVswXSwgcmVmWSA9IF9hWzFdO1xuICAgICAgICBpZiAoZWxlbWVudC5pc0NsaXBwZWQocmVmWCwgcmVmWSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBAdHMtaWdub3JlIO+8jOi/meS4quWcsOaWueiwg+eUqOi/h+S6jumikee5gVxuICAgIHZhciBiYm94ID0gZWxlbWVudC5jZmcuY2FjaGVDYW52YXNCQm94IHx8IGVsZW1lbnQuZ2V0Q2FudmFzQkJveCgpO1xuICAgIC8vIOWmguaenOayoeaciee8k+WtmCBiYm9477yM5YiZ6K+05piO5LiN5Y+v6KeBXG4gICAgLy8g5rOo6YeK5o6J55qE6L+Z5q615Y+v6IO95Lya5Yqg6YCf5ou+5Y+W77yM5LiK6Z2i55qE6K+t5Y+l5pS55YaZ5oiQIGNvbnN0IGJib3ggPSBlbGVtZW50LmNmZy5jYWNoZUNhbnZhc0JCb3g7XG4gICAgLy8g6L+Z5pe25YCZ55qE5ou+5Y+W5YGH6K6+5Zu+5b2iL+WIhue7hOWcqOS4iuS4gOasoee7mOWItumDveWcqOinhueql+WGhe+8jOS9huaYr+S4iumdouW3sue7j+WIpOWumuS6hiBpc0luVmlldyDmiYDku6XmhI/kuYnkuI3lpKdcbiAgICAvLyDnjrDlnKjov5josIPnlKggZWxlbWVudC5nZXRDYW52YXNCQm94KCk7IOS4gOS4quW+iOWkp+eahOWOn+WboOaYr+S+v+S6juWNleWFg+a1i+ivlVxuICAgIC8vIGlmICghYmJveCkge1xuICAgIC8vICAgcmV0dXJuIGZhbHNlO1xuICAgIC8vIH1cbiAgICBpZiAoISh4ID49IGJib3gubWluWCAmJiB4IDw9IGJib3gubWF4WCAmJiB5ID49IGJib3gubWluWSAmJiB5IDw9IGJib3gubWF4WSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbi8vIOi/meS4quaWueazleWkjeWGmeS6hiBnLWJhc2Ug55qEIGdldFNoYXBlXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2hhcGUoY29udGFpbmVyLCB4LCB5KSB7XG4gICAgLy8g5rKh5pyJ6YCa6L+H5qOA5rWL77yM5YiZ6L+U5ZueIG51bGxcbiAgICBpZiAoIXByZVRlc3QoY29udGFpbmVyLCB4LCB5KSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgdmFyIHNoYXBlID0gbnVsbDtcbiAgICB2YXIgY2hpbGRyZW4gPSBjb250YWluZXIuZ2V0Q2hpbGRyZW4oKTtcbiAgICB2YXIgY291bnQgPSBjaGlsZHJlbi5sZW5ndGg7XG4gICAgZm9yICh2YXIgaSA9IGNvdW50IC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgdmFyIGNoaWxkID0gY2hpbGRyZW5baV07XG4gICAgICAgIGlmIChjaGlsZC5pc0dyb3VwKCkpIHtcbiAgICAgICAgICAgIHNoYXBlID0gZ2V0U2hhcGUoY2hpbGQsIHgsIHkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHByZVRlc3QoY2hpbGQsIHgsIHkpKSB7XG4gICAgICAgICAgICB2YXIgY3VyU2hhcGUgPSBjaGlsZDtcbiAgICAgICAgICAgIHZhciBfYSA9IGdldFJlZlhZKGNoaWxkLCB4LCB5KSwgcmVmWCA9IF9hWzBdLCByZWZZID0gX2FbMV07XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBpZiAoY3VyU2hhcGUuaXNJblNoYXBlKHJlZlgsIHJlZlkpKSB7XG4gICAgICAgICAgICAgICAgc2hhcGUgPSBjaGlsZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoc2hhcGUpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzaGFwZTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWhpdC5qcy5tYXAiLCJpbXBvcnQgeyBfX2V4dGVuZHMgfSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IEFic3RyYWN0Q2FudmFzIH0gZnJvbSAnQGFudHYvZy1iYXNlJztcbmltcG9ydCB7IGdldFNoYXBlIH0gZnJvbSAnLi91dGlsL2hpdCc7XG5pbXBvcnQgKiBhcyBTaGFwZSBmcm9tICcuL3NoYXBlJztcbmltcG9ydCBHcm91cCBmcm9tICcuL2dyb3VwJztcbmltcG9ydCB7IGVhY2gsIGdldFBpeGVsUmF0aW8sIHJlcXVlc3RBbmltYXRpb25GcmFtZSwgY2xlYXJBbmltYXRpb25GcmFtZSB9IGZyb20gJy4vdXRpbC91dGlsJztcbmltcG9ydCB7IGFwcGx5QXR0cnNUb0NvbnRleHQsIGRyYXdDaGlsZHJlbiwgZ2V0TWVyZ2VkUmVnaW9uLCBtZXJnZVZpZXcsIGNoZWNrUmVmcmVzaCwgY2xlYXJDaGFuZ2VkIH0gZnJvbSAnLi91dGlsL2RyYXcnO1xudmFyIENhbnZhcyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoQ2FudmFzLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIENhbnZhcygpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgIH1cbiAgICBDYW52YXMucHJvdG90eXBlLmdldERlZmF1bHRDZmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBjZmcgPSBfc3VwZXIucHJvdG90eXBlLmdldERlZmF1bHRDZmcuY2FsbCh0aGlzKTtcbiAgICAgICAgLy8g6K6+572u5riy5p+T5byV5pOO5Li6IGNhbnZhc++8jOWPquivu+WxnuaAp1xuICAgICAgICBjZmdbJ3JlbmRlcmVyJ10gPSAnY2FudmFzJztcbiAgICAgICAgLy8g5piv5ZCm6Ieq5Yqo57uY5Yi277yM5LiN6ZyA6KaB55So5oi36LCD55SoIGRyYXcg5pa55rOVXG4gICAgICAgIGNmZ1snYXV0b0RyYXcnXSA9IHRydWU7XG4gICAgICAgIC8vIOaYr+WQpuWFgeiuuOWxgOmDqOWIt+aWsOWbvuihqFxuICAgICAgICBjZmdbJ2xvY2FsUmVmcmVzaCddID0gdHJ1ZTtcbiAgICAgICAgY2ZnWydyZWZyZXNoRWxlbWVudHMnXSA9IFtdO1xuICAgICAgICAvLyDmmK/lkKblnKjop4blm77lhoXoh6rliqjoo4HliapcbiAgICAgICAgY2ZnWydjbGlwVmlldyddID0gdHJ1ZTtcbiAgICAgICAgLy8g5piv5ZCm5L2/55So5b+r6YCf5ou+5Y+W55qE5pa55qGI77yM6buY6K6k5Li6IGZhbHNl77yM5LiK5bGC5Y+v5Lul5omT5byAXG4gICAgICAgIGNmZ1sncXVpY2tIaXQnXSA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gY2ZnO1xuICAgIH07XG4gICAgLyoqXG4gICAgICog5LiA5Lqb5pa55rOV6LCD55So5Lya5byV6LW355S75biD5Y+Y5YyWXG4gICAgICogQHBhcmFtIHtDaGFuZ2VUeXBlfSBjaGFuZ2VUeXBlIOaUueWPmOeahOexu+Wei1xuICAgICAqL1xuICAgIENhbnZhcy5wcm90b3R5cGUub25DYW52YXNDaGFuZ2UgPSBmdW5jdGlvbiAoY2hhbmdlVHlwZSkge1xuICAgICAgICAvKipcbiAgICAgICAgICog6Kem5Y+R55S75biD5pu05paw55qE5LiJ56eNIGNoYW5nZVR5cGVcbiAgICAgICAgICogMS4gYXR0cjog5L+u5pS555S75biD55qE57uY5Zu+5bGe5oCnXG4gICAgICAgICAqIDIuIHNvcnQ6IOeUu+W4g+aOkuW6j++8jOWbvuW9oueahOWxguasoeS8muWPkeeUn+WPmOWMllxuICAgICAgICAgKiAzLiBjaGFuZ2VTaXplOiDmlLnlj5jnlLvluIPlpKflsI9cbiAgICAgICAgICovXG4gICAgICAgIGlmIChjaGFuZ2VUeXBlID09PSAnYXR0cicgfHwgY2hhbmdlVHlwZSA9PT0gJ3NvcnQnIHx8IGNoYW5nZVR5cGUgPT09ICdjaGFuZ2VTaXplJykge1xuICAgICAgICAgICAgdGhpcy5zZXQoJ3JlZnJlc2hFbGVtZW50cycsIFt0aGlzXSk7XG4gICAgICAgICAgICB0aGlzLmRyYXcoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgQ2FudmFzLnByb3RvdHlwZS5nZXRTaGFwZUJhc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBTaGFwZTtcbiAgICB9O1xuICAgIENhbnZhcy5wcm90b3R5cGUuZ2V0R3JvdXBCYXNlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gR3JvdXA7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiDojrflj5blsY/luZXlg4/ntKDmr5RcbiAgICAgKi9cbiAgICBDYW52YXMucHJvdG90eXBlLmdldFBpeGVsUmF0aW8gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBwaXhlbFJhdGlvID0gdGhpcy5nZXQoJ3BpeGVsUmF0aW8nKSB8fCBnZXRQaXhlbFJhdGlvKCk7XG4gICAgICAgIC8vIOS4jei2syAxIOeahOWPliAx77yM6LaF5Ye6IDEg55qE5Y+W5pW0XG4gICAgICAgIHJldHVybiBwaXhlbFJhdGlvID49IDEgPyBNYXRoLmNlaWwocGl4ZWxSYXRpbykgOiAxO1xuICAgIH07XG4gICAgQ2FudmFzLnByb3RvdHlwZS5nZXRWaWV3UmFuZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBtaW5YOiAwLFxuICAgICAgICAgICAgbWluWTogMCxcbiAgICAgICAgICAgIG1heFg6IHRoaXMuY2ZnLndpZHRoLFxuICAgICAgICAgICAgbWF4WTogdGhpcy5jZmcuaGVpZ2h0LFxuICAgICAgICB9O1xuICAgIH07XG4gICAgLy8g5aSN5YaZ5Z+657G755qE5pa55rOV55Sf5oiQ5qCH562+XG4gICAgQ2FudmFzLnByb3RvdHlwZS5jcmVhdGVEb20gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICAgIHZhciBjb250ZXh0ID0gZWxlbWVudC5nZXRDb250ZXh0KCcyZCcpO1xuICAgICAgICAvLyDnvJPlrZggY29udGV4dCDlr7nosaFcbiAgICAgICAgdGhpcy5zZXQoJ2NvbnRleHQnLCBjb250ZXh0KTtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgfTtcbiAgICBDYW52YXMucHJvdG90eXBlLnNldERPTVNpemUgPSBmdW5jdGlvbiAod2lkdGgsIGhlaWdodCkge1xuICAgICAgICBfc3VwZXIucHJvdG90eXBlLnNldERPTVNpemUuY2FsbCh0aGlzLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgdmFyIGNvbnRleHQgPSB0aGlzLmdldCgnY29udGV4dCcpO1xuICAgICAgICB2YXIgZWwgPSB0aGlzLmdldCgnZWwnKTtcbiAgICAgICAgdmFyIHBpeGVsUmF0aW8gPSB0aGlzLmdldFBpeGVsUmF0aW8oKTtcbiAgICAgICAgZWwud2lkdGggPSBwaXhlbFJhdGlvICogd2lkdGg7XG4gICAgICAgIGVsLmhlaWdodCA9IHBpeGVsUmF0aW8gKiBoZWlnaHQ7XG4gICAgICAgIC8vIOiuvue9riBjYW52YXMg5YWD57Sg55qE5a695bqm5ZKM6auY5bqm77yM5Lya6YeN572u57yp5pS+77yM5Zug5q2kIGNvbnRleHQuc2NhbGUg6ZyA6KaB5Zyo5q+P5qyh6K6+572u5a6944CB6auY5ZCO6LCD55SoXG4gICAgICAgIGlmIChwaXhlbFJhdGlvID4gMSkge1xuICAgICAgICAgICAgY29udGV4dC5zY2FsZShwaXhlbFJhdGlvLCBwaXhlbFJhdGlvKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLy8g5aSN5YaZ5Z+657G75pa55rOVXG4gICAgQ2FudmFzLnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgX3N1cGVyLnByb3RvdHlwZS5jbGVhci5jYWxsKHRoaXMpO1xuICAgICAgICB0aGlzLl9jbGVhckZyYW1lKCk7IC8vIOmcgOimgea4heeQhuaOieW7tui/n+e7mOWItueahOW4p1xuICAgICAgICB2YXIgY29udGV4dCA9IHRoaXMuZ2V0KCdjb250ZXh0Jyk7XG4gICAgICAgIHZhciBlbGVtZW50ID0gdGhpcy5nZXQoJ2VsJyk7XG4gICAgICAgIGNvbnRleHQuY2xlYXJSZWN0KDAsIDAsIGVsZW1lbnQud2lkdGgsIGVsZW1lbnQuaGVpZ2h0KTtcbiAgICB9O1xuICAgIENhbnZhcy5wcm90b3R5cGUuZ2V0U2hhcGUgPSBmdW5jdGlvbiAoeCwgeSkge1xuICAgICAgICB2YXIgc2hhcGU7XG4gICAgICAgIGlmICh0aGlzLmdldCgncXVpY2tIaXQnKSkge1xuICAgICAgICAgICAgc2hhcGUgPSBnZXRTaGFwZSh0aGlzLCB4LCB5KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHNoYXBlID0gX3N1cGVyLnByb3RvdHlwZS5nZXRTaGFwZS5jYWxsKHRoaXMsIHgsIHksIG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzaGFwZTtcbiAgICB9O1xuICAgIC8vIOWvuee7mOWItuWMuuWfn+i+uee8mOWPluaVtO+8jOmBv+WFjea1rueCueaVsOmXrumimFxuICAgIENhbnZhcy5wcm90b3R5cGUuX2dldFJlZnJlc2hSZWdpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBlbGVtZW50cyA9IHRoaXMuZ2V0KCdyZWZyZXNoRWxlbWVudHMnKTtcbiAgICAgICAgdmFyIHZpZXdSZWdpb24gPSB0aGlzLmdldFZpZXdSYW5nZSgpO1xuICAgICAgICB2YXIgcmVnaW9uO1xuICAgICAgICAvLyDlpoLmnpzmmK/lvZPliY3nlLvluIPmlbTkvZPlj5HnlJ/kuoblj5jljJbvvIzliJnnm7TmjqXph43nu5jmlbTkuKrnlLvluINcbiAgICAgICAgaWYgKGVsZW1lbnRzLmxlbmd0aCAmJiBlbGVtZW50c1swXSA9PT0gdGhpcykge1xuICAgICAgICAgICAgcmVnaW9uID0gdmlld1JlZ2lvbjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlZ2lvbiA9IGdldE1lcmdlZFJlZ2lvbihlbGVtZW50cyk7XG4gICAgICAgICAgICBpZiAocmVnaW9uKSB7XG4gICAgICAgICAgICAgICAgcmVnaW9uLm1pblggPSBNYXRoLmZsb29yKHJlZ2lvbi5taW5YKTtcbiAgICAgICAgICAgICAgICByZWdpb24ubWluWSA9IE1hdGguZmxvb3IocmVnaW9uLm1pblkpO1xuICAgICAgICAgICAgICAgIHJlZ2lvbi5tYXhYID0gTWF0aC5jZWlsKHJlZ2lvbi5tYXhYKTtcbiAgICAgICAgICAgICAgICByZWdpb24ubWF4WSA9IE1hdGguY2VpbChyZWdpb24ubWF4WSk7XG4gICAgICAgICAgICAgICAgcmVnaW9uLm1heFkgKz0gMTsgLy8g5Zyo5b6I5aSa546v5aKD5LiL5a2X5L2T55qE6auY5L2O5Lya5LiN5LiA6Ie077yM6ZmE5Yqg5LiA5YOP57Sg77yM6YG/5YWN5q6L5b2xXG4gICAgICAgICAgICAgICAgdmFyIGNsaXBWaWV3ID0gdGhpcy5nZXQoJ2NsaXBWaWV3Jyk7XG4gICAgICAgICAgICAgICAgLy8g6Ieq5Yqo6KOB5Ymq5LiN5ZyoIHZpZXcg5YaF55qE5Yy65Z+fXG4gICAgICAgICAgICAgICAgaWYgKGNsaXBWaWV3KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlZ2lvbiA9IG1lcmdlVmlldyhyZWdpb24sIHZpZXdSZWdpb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVnaW9uO1xuICAgIH07XG4gICAgLyoqXG4gICAgICog5Yi35paw5Zu+5b2i5YWD57Sg77yM6L+Z6YeM5LuF5LuF5piv5pS+5YWl6Zif5YiX77yM5LiL5qyh57uY5Yi25pe26L+b6KGM57uY5Yi2XG4gICAgICogQHBhcmFtIHtJRWxlbWVudH0gZWxlbWVudCDlm77lvaLlhYPntKBcbiAgICAgKi9cbiAgICBDYW52YXMucHJvdG90eXBlLnJlZnJlc2hFbGVtZW50ID0gZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgdmFyIHJlZnJlc2hFbGVtZW50cyA9IHRoaXMuZ2V0KCdyZWZyZXNoRWxlbWVudHMnKTtcbiAgICAgICAgcmVmcmVzaEVsZW1lbnRzLnB1c2goZWxlbWVudCk7XG4gICAgICAgIC8vIGlmICh0aGlzLmdldCgnYXV0b0RyYXcnKSkge1xuICAgICAgICAvLyAgIHRoaXMuX3N0YXJ0RHJhdygpO1xuICAgICAgICAvLyB9XG4gICAgfTtcbiAgICAvLyDmuIXnkIbov5jlnKjov5vooYznmoTnu5jliLZcbiAgICBDYW52YXMucHJvdG90eXBlLl9jbGVhckZyYW1lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZHJhd0ZyYW1lID0gdGhpcy5nZXQoJ2RyYXdGcmFtZScpO1xuICAgICAgICBpZiAoZHJhd0ZyYW1lKSB7XG4gICAgICAgICAgICAvLyDlpoLmnpzlhajpg6jmuLLmn5Pml7bvvIzlrZjlnKjlsYDpg6jmuLLmn5PvvIzliJnmipvlvIPmjonlsYDpg6jmuLLmn5NcbiAgICAgICAgICAgIGNsZWFyQW5pbWF0aW9uRnJhbWUoZHJhd0ZyYW1lKTtcbiAgICAgICAgICAgIHRoaXMuc2V0KCdkcmF3RnJhbWUnLCBudWxsKTtcbiAgICAgICAgICAgIHRoaXMuc2V0KCdyZWZyZXNoRWxlbWVudHMnLCBbXSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8vIOaJi+W3peiwg+eUqOe7mOWItuaOpeWPo1xuICAgIENhbnZhcy5wcm90b3R5cGUuZHJhdyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGRyYXdGcmFtZSA9IHRoaXMuZ2V0KCdkcmF3RnJhbWUnKTtcbiAgICAgICAgaWYgKHRoaXMuZ2V0KCdhdXRvRHJhdycpICYmIGRyYXdGcmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3N0YXJ0RHJhdygpO1xuICAgIH07XG4gICAgLy8g57uY5Yi25omA5pyJ5Zu+5b2iXG4gICAgQ2FudmFzLnByb3RvdHlwZS5fZHJhd0FsbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGNvbnRleHQgPSB0aGlzLmdldCgnY29udGV4dCcpO1xuICAgICAgICB2YXIgZWxlbWVudCA9IHRoaXMuZ2V0KCdlbCcpO1xuICAgICAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLmdldENoaWxkcmVuKCk7XG4gICAgICAgIGNvbnRleHQuY2xlYXJSZWN0KDAsIDAsIGVsZW1lbnQud2lkdGgsIGVsZW1lbnQuaGVpZ2h0KTtcbiAgICAgICAgYXBwbHlBdHRyc1RvQ29udGV4dChjb250ZXh0LCB0aGlzKTtcbiAgICAgICAgZHJhd0NoaWxkcmVuKGNvbnRleHQsIGNoaWxkcmVuKTtcbiAgICAgICAgLy8g5a+55LqOIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnR2aXMvZy9pc3N1ZXMvNDIyIOeahOWcuuaZr++8jOWFqOWxgOa4suafk+eahOaooeW8j+S4i+S5n+S8muiusOW9leabtOaWsOeahOWFg+e0oOmYn+WIl++8jOWboOatpOWFqOWxgOa4suafk+WujOWQjuS5n+mcgOimgee9ruepulxuICAgICAgICB0aGlzLnNldCgncmVmcmVzaEVsZW1lbnRzJywgW10pO1xuICAgIH07XG4gICAgLy8g57uY5Yi25bGA6YOoXG4gICAgQ2FudmFzLnByb3RvdHlwZS5fZHJhd1JlZ2lvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGNvbnRleHQgPSB0aGlzLmdldCgnY29udGV4dCcpO1xuICAgICAgICB2YXIgcmVmcmVzaEVsZW1lbnRzID0gdGhpcy5nZXQoJ3JlZnJlc2hFbGVtZW50cycpO1xuICAgICAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLmdldENoaWxkcmVuKCk7XG4gICAgICAgIHZhciByZWdpb24gPSB0aGlzLl9nZXRSZWZyZXNoUmVnaW9uKCk7XG4gICAgICAgIC8vIOmcgOimgeazqOaEj+WPr+iDveayoeaciSByZWdpb24g55qE5Zy65pmvXG4gICAgICAgIC8vIOS4gOiIrOWPkeeUn+WcqOiuvue9ruS6hiBsb2NhbFJlZnJlc2ggLOWcqOayoeacieWbvuW9ouWPkeeUn+WPmOWMlueahOaDheWGteS4i++8jOeUqOaIt+iwg+eUqOS6hiBkcmF3XG4gICAgICAgIGlmIChyZWdpb24pIHtcbiAgICAgICAgICAgIC8vIOa4heeQhuaMh+WumuWMuuWfn1xuICAgICAgICAgICAgY29udGV4dC5jbGVhclJlY3QocmVnaW9uLm1pblgsIHJlZ2lvbi5taW5ZLCByZWdpb24ubWF4WCAtIHJlZ2lvbi5taW5YLCByZWdpb24ubWF4WSAtIHJlZ2lvbi5taW5ZKTtcbiAgICAgICAgICAgIC8vIOS/neWtmOS4iuS4i+aWh++8jOiuvue9riBjbGlwXG4gICAgICAgICAgICBjb250ZXh0LnNhdmUoKTtcbiAgICAgICAgICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XG4gICAgICAgICAgICBjb250ZXh0LnJlY3QocmVnaW9uLm1pblgsIHJlZ2lvbi5taW5ZLCByZWdpb24ubWF4WCAtIHJlZ2lvbi5taW5YLCByZWdpb24ubWF4WSAtIHJlZ2lvbi5taW5ZKTtcbiAgICAgICAgICAgIGNvbnRleHQuY2xpcCgpO1xuICAgICAgICAgICAgYXBwbHlBdHRyc1RvQ29udGV4dChjb250ZXh0LCB0aGlzKTtcbiAgICAgICAgICAgIC8vIOehruiupOabtOaWsOeahOWFg+e0oO+8jOi/meS4quS8mOWMluWPr+S7peaPkOWNhyAxMCDlgI3lt6blj7PnmoTmgKfog73vvIwxMFcg5Liq5bim5pyJIGdyb3VwIOeahOiKgueCue+8jOWxgOmDqOa4suafk+S8muS7jiA5MG1zIOS4i+mZjeWIsCA1LTYgbXNcbiAgICAgICAgICAgIGNoZWNrUmVmcmVzaCh0aGlzLCBjaGlsZHJlbiwgcmVnaW9uKTtcbiAgICAgICAgICAgIC8vIOe7mOWItuWtkOWFg+e0oFxuICAgICAgICAgICAgZHJhd0NoaWxkcmVuKGNvbnRleHQsIGNoaWxkcmVuLCByZWdpb24pO1xuICAgICAgICAgICAgY29udGV4dC5yZXN0b3JlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocmVmcmVzaEVsZW1lbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgLy8g6Ziy5q2i5Y+R55Sf5pS55Y+Y55qEIGVsZW1lbnRzIOayoeaciSByZWdpb24g55qE5Zy65pmv77yM6L+Z5Lya5Y+R55Sf5Zyo5aSa5Liq5oOF5Ya15LiLXG4gICAgICAgICAgICAvLyAxLiDnqbrnmoQgZ3JvdXBcbiAgICAgICAgICAgIC8vIDIuIOaJgOaciSBlbGVtZW50cyDmsqHmnInlnKjnu5jlm77ljLrln59cbiAgICAgICAgICAgIC8vIDMuIGdyb3VwIOS4i+mdoueahCBlbGVtZW50cyDpmpDol4/mjolcbiAgICAgICAgICAgIC8vIOWmguaenOS4jei/m+ihjOa4heeQhiBoYXNDaGFuZ2VkIOeahOeKtuaAgeS8muS4jeato+ehrlxuICAgICAgICAgICAgY2xlYXJDaGFuZ2VkKHJlZnJlc2hFbGVtZW50cyk7XG4gICAgICAgIH1cbiAgICAgICAgZWFjaChyZWZyZXNoRWxlbWVudHMsIGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgICAgICBpZiAoZWxlbWVudC5nZXQoJ2hhc0NoYW5nZWQnKSkge1xuICAgICAgICAgICAgICAgIC8vIOWcqOinhueql+WklueahCBHcm91cCDlhYPntKDkvJrliqDlhaXliLDmm7TmlrDpmJ/liJfph4zvvIzkvYblrp7pmYXljbTmsqHmnInmiafooYwgZHJhdygpIOmAu+i+ke+8jOS5n+Wwseayoeaciea4hemZpCBoYXNDaGFuZ2VkIOagh+iusFxuICAgICAgICAgICAgICAgIC8vIOWNs+W3sue7j+mHjee7mOWujOOAgeS9hiBoYXNDaGFuZ2VkIOagh+iusOayoeaciea4hemZpOeahOWFg+e0oO+8jOmcgOimgee7n+S4gOa4hemZpOaOieOAguS4u+imgeaYryBHcm91cCDlrZjlnKjpl67popjvvIzlhbfkvZPljp/lm6DlvoXmjpLmn6VcbiAgICAgICAgICAgICAgICBlbGVtZW50LnNldCgnaGFzQ2hhbmdlZCcsIGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuc2V0KCdyZWZyZXNoRWxlbWVudHMnLCBbXSk7XG4gICAgfTtcbiAgICAvLyDop6blj5Hnu5jliLZcbiAgICBDYW52YXMucHJvdG90eXBlLl9zdGFydERyYXcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBkcmF3RnJhbWUgPSB0aGlzLmdldCgnZHJhd0ZyYW1lJyk7XG4gICAgICAgIGlmICghZHJhd0ZyYW1lKSB7XG4gICAgICAgICAgICBkcmF3RnJhbWUgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmIChfdGhpcy5nZXQoJ2xvY2FsUmVmcmVzaCcpKSB7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLl9kcmF3UmVnaW9uKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy5fZHJhd0FsbCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBfdGhpcy5zZXQoJ2RyYXdGcmFtZScsIG51bGwpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnNldCgnZHJhd0ZyYW1lJywgZHJhd0ZyYW1lKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgQ2FudmFzLnByb3RvdHlwZS5za2lwRHJhdyA9IGZ1bmN0aW9uICgpIHsgfTtcbiAgICBDYW52YXMucHJvdG90eXBlLnJlbW92ZURvbSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGVsID0gdGhpcy5nZXQoJ2VsJyk7XG4gICAgICAgIC8vIOmcgOimgea4heeQhiBjYW52YXMg55S75biD5YaF5a6577yM5ZCm5YiZaW9z5LiLIOWIm+W7uueahGNhbnZhc+Weg+WcvuacquWbnuaUtu+8jOWvvOiHtFRvdGFsIGNhbnZhcyBtZW1vcnkgdXNlIGV4Y2VlZHPpl67pophcbiAgICAgICAgLy8g55u45YWz6Zeu6aKY5YiX6KGoXG4gICAgICAgIC8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzUyNTMyNjE0L3RvdGFsLWNhbnZhcy1tZW1vcnktdXNlLWV4Y2VlZHMtdGhlLW1heGltdW0tbGltaXQtc2FmYXJpLTEyXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9vcGVubGF5ZXJzL29wZW5sYXllcnMvaXNzdWVzLzkyOTFcbiAgICAgICAgZWwud2lkdGggPSAwO1xuICAgICAgICBlbC5oZWlnaHQgPSAwO1xuICAgICAgICBlbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGVsKTtcbiAgICB9O1xuICAgIHJldHVybiBDYW52YXM7XG59KEFic3RyYWN0Q2FudmFzKSk7XG5leHBvcnQgZGVmYXVsdCBDYW52YXM7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jYW52YXMuanMubWFwIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///280\n")},function(module,exports,__webpack_require__){"use strict";eval('\n\nObject.defineProperty(exports, "__esModule", {\n value: true\n});\nObject.defineProperty(exports, "getAdjMatrixAsync", {\n enumerable: true,\n get: function get() {\n return _index.getAdjMatrixAsync;\n }\n});\nObject.defineProperty(exports, "connectedComponentAsync", {\n enumerable: true,\n get: function get() {\n return _index.connectedComponentAsync;\n }\n});\nObject.defineProperty(exports, "getDegreeAsync", {\n enumerable: true,\n get: function get() {\n return _index.getDegreeAsync;\n }\n});\nObject.defineProperty(exports, "getInDegreeAsync", {\n enumerable: true,\n get: function get() {\n return _index.getInDegreeAsync;\n }\n});\nObject.defineProperty(exports, "getOutDegreeAsync", {\n enumerable: true,\n get: function get() {\n return _index.getOutDegreeAsync;\n }\n});\nObject.defineProperty(exports, "detectCycleAsync", {\n enumerable: true,\n get: function get() {\n return _index.detectCycleAsync;\n }\n});\nObject.defineProperty(exports, "detectAllCyclesAsync", {\n enumerable: true,\n get: function get() {\n return _index.detectAllCyclesAsync;\n }\n});\nObject.defineProperty(exports, "detectAllDirectedCycleAsync", {\n enumerable: true,\n get: function get() {\n return _index.detectAllDirectedCycleAsync;\n }\n});\nObject.defineProperty(exports, "detectAllUndirectedCycleAsync", {\n enumerable: true,\n get: function get() {\n return _index.detectAllUndirectedCycleAsync;\n }\n});\nObject.defineProperty(exports, "dijkstraAsync", {\n enumerable: true,\n get: function get() {\n return _index.dijkstraAsync;\n }\n});\nObject.defineProperty(exports, "findAllPathAsync", {\n enumerable: true,\n get: function get() {\n return _index.findAllPathAsync;\n }\n});\nObject.defineProperty(exports, "findShortestPathAsync", {\n enumerable: true,\n get: function get() {\n return _index.findShortestPathAsync;\n }\n});\nObject.defineProperty(exports, "floydWarshallAsync", {\n enumerable: true,\n get: function get() {\n return _index.floydWarshallAsync;\n }\n});\nObject.defineProperty(exports, "labelPropagationAsync", {\n enumerable: true,\n get: function get() {\n return _index.labelPropagationAsync;\n }\n});\nObject.defineProperty(exports, "louvainAsync", {\n enumerable: true,\n get: function get() {\n return _index.louvainAsync;\n }\n});\nObject.defineProperty(exports, "minimumSpanningTreeAsync", {\n enumerable: true,\n get: function get() {\n return _index.minimumSpanningTreeAsync;\n }\n});\nObject.defineProperty(exports, "pageRankAsync", {\n enumerable: true,\n get: function get() {\n return _index.pageRankAsync;\n }\n});\nObject.defineProperty(exports, "getNeighborsAsync", {\n enumerable: true,\n get: function get() {\n return _index.getNeighborsAsync;\n }\n});\nObject.defineProperty(exports, "GADDIAsync", {\n enumerable: true,\n get: function get() {\n return _index.GADDIAsync;\n }\n});\nexports.default = exports.detectDirectedCycleAsync = void 0;\n\nvar _index = __webpack_require__(296);\n\nvar detectDirectedCycleAsync = _index.detectCycleAsync;\nexports.detectDirectedCycleAsync = detectDirectedCycleAsync;\nvar _default = {\n getAdjMatrixAsync: _index.getAdjMatrixAsync,\n connectedComponentAsync: _index.connectedComponentAsync,\n getDegreeAsync: _index.getDegreeAsync,\n getInDegreeAsync: _index.getInDegreeAsync,\n getOutDegreeAsync: _index.getOutDegreeAsync,\n detectCycleAsync: _index.detectCycleAsync,\n detectDirectedCycleAsync: detectDirectedCycleAsync,\n detectAllCyclesAsync: _index.detectAllCyclesAsync,\n detectAllDirectedCycleAsync: _index.detectAllDirectedCycleAsync,\n detectAllUndirectedCycleAsync: _index.detectAllUndirectedCycleAsync,\n dijkstraAsync: _index.dijkstraAsync,\n findAllPathAsync: _index.findAllPathAsync,\n findShortestPathAsync: _index.findShortestPathAsync,\n floydWarshallAsync: _index.floydWarshallAsync,\n labelPropagationAsync: _index.labelPropagationAsync,\n louvainAsync: _index.louvainAsync,\n minimumSpanningTreeAsync: _index.minimumSpanningTreeAsync,\n pageRankAsync: _index.pageRankAsync,\n getNeighborsAsync: _index.getNeighborsAsync,\n GADDIAsync: _index.GADDIAsync\n};\nexports.default = _default;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvYWxnb3JpdGhtL2xpYi9hc3luY0luZGV4LmpzPzE2ODMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWI7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEOztBQUVBLGFBQWEsbUJBQU8sQ0FBQyxHQUFpQjs7QUFFdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiMjgxLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJnZXRBZGpNYXRyaXhBc3luY1wiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfaW5kZXguZ2V0QWRqTWF0cml4QXN5bmM7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiY29ubmVjdGVkQ29tcG9uZW50QXN5bmNcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX2luZGV4LmNvbm5lY3RlZENvbXBvbmVudEFzeW5jO1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImdldERlZ3JlZUFzeW5jXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9pbmRleC5nZXREZWdyZWVBc3luYztcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJnZXRJbkRlZ3JlZUFzeW5jXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9pbmRleC5nZXRJbkRlZ3JlZUFzeW5jO1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImdldE91dERlZ3JlZUFzeW5jXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9pbmRleC5nZXRPdXREZWdyZWVBc3luYztcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJkZXRlY3RDeWNsZUFzeW5jXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9pbmRleC5kZXRlY3RDeWNsZUFzeW5jO1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImRldGVjdEFsbEN5Y2xlc0FzeW5jXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9pbmRleC5kZXRlY3RBbGxDeWNsZXNBc3luYztcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJkZXRlY3RBbGxEaXJlY3RlZEN5Y2xlQXN5bmNcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX2luZGV4LmRldGVjdEFsbERpcmVjdGVkQ3ljbGVBc3luYztcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJkZXRlY3RBbGxVbmRpcmVjdGVkQ3ljbGVBc3luY1wiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfaW5kZXguZGV0ZWN0QWxsVW5kaXJlY3RlZEN5Y2xlQXN5bmM7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiZGlqa3N0cmFBc3luY1wiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfaW5kZXguZGlqa3N0cmFBc3luYztcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJmaW5kQWxsUGF0aEFzeW5jXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9pbmRleC5maW5kQWxsUGF0aEFzeW5jO1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImZpbmRTaG9ydGVzdFBhdGhBc3luY1wiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfaW5kZXguZmluZFNob3J0ZXN0UGF0aEFzeW5jO1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImZsb3lkV2Fyc2hhbGxBc3luY1wiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfaW5kZXguZmxveWRXYXJzaGFsbEFzeW5jO1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImxhYmVsUHJvcGFnYXRpb25Bc3luY1wiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfaW5kZXgubGFiZWxQcm9wYWdhdGlvbkFzeW5jO1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImxvdXZhaW5Bc3luY1wiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfaW5kZXgubG91dmFpbkFzeW5jO1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIm1pbmltdW1TcGFubmluZ1RyZWVBc3luY1wiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfaW5kZXgubWluaW11bVNwYW5uaW5nVHJlZUFzeW5jO1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcInBhZ2VSYW5rQXN5bmNcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX2luZGV4LnBhZ2VSYW5rQXN5bmM7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiZ2V0TmVpZ2hib3JzQXN5bmNcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX2luZGV4LmdldE5laWdoYm9yc0FzeW5jO1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkdBRERJQXN5bmNcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX2luZGV4LkdBRERJQXN5bmM7XG4gIH1cbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gZXhwb3J0cy5kZXRlY3REaXJlY3RlZEN5Y2xlQXN5bmMgPSB2b2lkIDA7XG5cbnZhciBfaW5kZXggPSByZXF1aXJlKFwiLi93b3JrZXJzL2luZGV4XCIpO1xuXG52YXIgZGV0ZWN0RGlyZWN0ZWRDeWNsZUFzeW5jID0gX2luZGV4LmRldGVjdEN5Y2xlQXN5bmM7XG5leHBvcnRzLmRldGVjdERpcmVjdGVkQ3ljbGVBc3luYyA9IGRldGVjdERpcmVjdGVkQ3ljbGVBc3luYztcbnZhciBfZGVmYXVsdCA9IHtcbiAgZ2V0QWRqTWF0cml4QXN5bmM6IF9pbmRleC5nZXRBZGpNYXRyaXhBc3luYyxcbiAgY29ubmVjdGVkQ29tcG9uZW50QXN5bmM6IF9pbmRleC5jb25uZWN0ZWRDb21wb25lbnRBc3luYyxcbiAgZ2V0RGVncmVlQXN5bmM6IF9pbmRleC5nZXREZWdyZWVBc3luYyxcbiAgZ2V0SW5EZWdyZWVBc3luYzogX2luZGV4LmdldEluRGVncmVlQXN5bmMsXG4gIGdldE91dERlZ3JlZUFzeW5jOiBfaW5kZXguZ2V0T3V0RGVncmVlQXN5bmMsXG4gIGRldGVjdEN5Y2xlQXN5bmM6IF9pbmRleC5kZXRlY3RDeWNsZUFzeW5jLFxuICBkZXRlY3REaXJlY3RlZEN5Y2xlQXN5bmM6IGRldGVjdERpcmVjdGVkQ3ljbGVBc3luYyxcbiAgZGV0ZWN0QWxsQ3ljbGVzQXN5bmM6IF9pbmRleC5kZXRlY3RBbGxDeWNsZXNBc3luYyxcbiAgZGV0ZWN0QWxsRGlyZWN0ZWRDeWNsZUFzeW5jOiBfaW5kZXguZGV0ZWN0QWxsRGlyZWN0ZWRDeWNsZUFzeW5jLFxuICBkZXRlY3RBbGxVbmRpcmVjdGVkQ3ljbGVBc3luYzogX2luZGV4LmRldGVjdEFsbFVuZGlyZWN0ZWRDeWNsZUFzeW5jLFxuICBkaWprc3RyYUFzeW5jOiBfaW5kZXguZGlqa3N0cmFBc3luYyxcbiAgZmluZEFsbFBhdGhBc3luYzogX2luZGV4LmZpbmRBbGxQYXRoQXN5bmMsXG4gIGZpbmRTaG9ydGVzdFBhdGhBc3luYzogX2luZGV4LmZpbmRTaG9ydGVzdFBhdGhBc3luYyxcbiAgZmxveWRXYXJzaGFsbEFzeW5jOiBfaW5kZXguZmxveWRXYXJzaGFsbEFzeW5jLFxuICBsYWJlbFByb3BhZ2F0aW9uQXN5bmM6IF9pbmRleC5sYWJlbFByb3BhZ2F0aW9uQXN5bmMsXG4gIGxvdXZhaW5Bc3luYzogX2luZGV4LmxvdXZhaW5Bc3luYyxcbiAgbWluaW11bVNwYW5uaW5nVHJlZUFzeW5jOiBfaW5kZXgubWluaW11bVNwYW5uaW5nVHJlZUFzeW5jLFxuICBwYWdlUmFua0FzeW5jOiBfaW5kZXgucGFnZVJhbmtBc3luYyxcbiAgZ2V0TmVpZ2hib3JzQXN5bmM6IF9pbmRleC5nZXROZWlnaGJvcnNBc3luYyxcbiAgR0FERElBc3luYzogX2luZGV4LkdBRERJQXN5bmNcbn07XG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///281\n')},function(module,exports,__webpack_require__){"use strict";eval('\nObject.defineProperty(exports, "__esModule", { value: true });\nvar decorators_1 = __webpack_require__(529);\nfunction getDecorators(container, doCache) {\n if (doCache === void 0) { doCache = true; }\n var lazyInject = decorators_1.makePropertyInjectDecorator(container, doCache);\n var lazyInjectNamed = decorators_1.makePropertyInjectNamedDecorator(container, doCache);\n var lazyInjectTagged = decorators_1.makePropertyInjectTaggedDecorator(container, doCache);\n var lazyMultiInject = decorators_1.makePropertyMultiInjectDecorator(container, doCache);\n return {\n lazyInject: lazyInject,\n lazyInjectNamed: lazyInjectNamed,\n lazyInjectTagged: lazyInjectTagged,\n lazyMultiInject: lazyMultiInject\n };\n}\nexports.default = getDecorators;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaW52ZXJzaWZ5LWluamVjdC1kZWNvcmF0b3JzL2xpYi9pbmRleC5qcz8wMGZjIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFhO0FBQ2IsOENBQThDLGNBQWM7QUFDNUQsbUJBQW1CLG1CQUFPLENBQUMsR0FBYztBQUN6QztBQUNBLDZCQUE2QixnQkFBZ0I7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6IjI4Mi5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIGRlY29yYXRvcnNfMSA9IHJlcXVpcmUoXCIuL2RlY29yYXRvcnNcIik7XG5mdW5jdGlvbiBnZXREZWNvcmF0b3JzKGNvbnRhaW5lciwgZG9DYWNoZSkge1xuICAgIGlmIChkb0NhY2hlID09PSB2b2lkIDApIHsgZG9DYWNoZSA9IHRydWU7IH1cbiAgICB2YXIgbGF6eUluamVjdCA9IGRlY29yYXRvcnNfMS5tYWtlUHJvcGVydHlJbmplY3REZWNvcmF0b3IoY29udGFpbmVyLCBkb0NhY2hlKTtcbiAgICB2YXIgbGF6eUluamVjdE5hbWVkID0gZGVjb3JhdG9yc18xLm1ha2VQcm9wZXJ0eUluamVjdE5hbWVkRGVjb3JhdG9yKGNvbnRhaW5lciwgZG9DYWNoZSk7XG4gICAgdmFyIGxhenlJbmplY3RUYWdnZWQgPSBkZWNvcmF0b3JzXzEubWFrZVByb3BlcnR5SW5qZWN0VGFnZ2VkRGVjb3JhdG9yKGNvbnRhaW5lciwgZG9DYWNoZSk7XG4gICAgdmFyIGxhenlNdWx0aUluamVjdCA9IGRlY29yYXRvcnNfMS5tYWtlUHJvcGVydHlNdWx0aUluamVjdERlY29yYXRvcihjb250YWluZXIsIGRvQ2FjaGUpO1xuICAgIHJldHVybiB7XG4gICAgICAgIGxhenlJbmplY3Q6IGxhenlJbmplY3QsXG4gICAgICAgIGxhenlJbmplY3ROYW1lZDogbGF6eUluamVjdE5hbWVkLFxuICAgICAgICBsYXp5SW5qZWN0VGFnZ2VkOiBsYXp5SW5qZWN0VGFnZ2VkLFxuICAgICAgICBsYXp5TXVsdGlJbmplY3Q6IGxhenlNdWx0aUluamVjdFxuICAgIH07XG59XG5leHBvcnRzLmRlZmF1bHQgPSBnZXREZWNvcmF0b3JzO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///282\n')},function(module,exports,__webpack_require__){eval("(function (global, factory) {\n true ? module.exports = factory() :\n undefined;\n}(this, (function () { 'use strict';\n\nvar isTypedArray = function (x) {\n return (\n x instanceof Uint8Array ||\n x instanceof Uint16Array ||\n x instanceof Uint32Array ||\n x instanceof Int8Array ||\n x instanceof Int16Array ||\n x instanceof Int32Array ||\n x instanceof Float32Array ||\n x instanceof Float64Array ||\n x instanceof Uint8ClampedArray\n )\n}\n\nvar extend = function (base, opts) {\n var keys = Object.keys(opts)\n for (var i = 0; i < keys.length; ++i) {\n base[keys[i]] = opts[keys[i]]\n }\n return base\n}\n\n// Error checking and parameter validation.\n//\n// Statements for the form `check.someProcedure(...)` get removed by\n// a browserify transform for optimized/minified bundles.\n//\n/* globals atob */\nvar endl = '\\n'\n\n// only used for extracting shader names. if atob not present, then errors\n// will be slightly crappier\nfunction decodeB64 (str) {\n if (typeof atob !== 'undefined') {\n return atob(str)\n }\n return 'base64:' + str\n}\n\nfunction raise (message) {\n var error = new Error('(regl) ' + message)\n console.error(error)\n throw error\n}\n\nfunction check (pred, message) {\n if (!pred) {\n raise(message)\n }\n}\n\nfunction encolon (message) {\n if (message) {\n return ': ' + message\n }\n return ''\n}\n\nfunction checkParameter (param, possibilities, message) {\n if (!(param in possibilities)) {\n raise('unknown parameter (' + param + ')' + encolon(message) +\n '. possible values: ' + Object.keys(possibilities).join())\n }\n}\n\nfunction checkIsTypedArray (data, message) {\n if (!isTypedArray(data)) {\n raise(\n 'invalid parameter type' + encolon(message) +\n '. must be a typed array')\n }\n}\n\nfunction standardTypeEh (value, type) {\n switch (type) {\n case 'number': return typeof value === 'number'\n case 'object': return typeof value === 'object'\n case 'string': return typeof value === 'string'\n case 'boolean': return typeof value === 'boolean'\n case 'function': return typeof value === 'function'\n case 'undefined': return typeof value === 'undefined'\n case 'symbol': return typeof value === 'symbol'\n }\n}\n\nfunction checkTypeOf (value, type, message) {\n if (!standardTypeEh(value, type)) {\n raise(\n 'invalid parameter type' + encolon(message) +\n '. expected ' + type + ', got ' + (typeof value))\n }\n}\n\nfunction checkNonNegativeInt (value, message) {\n if (!((value >= 0) &&\n ((value | 0) === value))) {\n raise('invalid parameter type, (' + value + ')' + encolon(message) +\n '. must be a nonnegative integer')\n }\n}\n\nfunction checkOneOf (value, list, message) {\n if (list.indexOf(value) < 0) {\n raise('invalid value' + encolon(message) + '. must be one of: ' + list)\n }\n}\n\nvar constructorKeys = [\n 'gl',\n 'canvas',\n 'container',\n 'attributes',\n 'pixelRatio',\n 'extensions',\n 'optionalExtensions',\n 'profile',\n 'onDone'\n]\n\nfunction checkConstructor (obj) {\n Object.keys(obj).forEach(function (key) {\n if (constructorKeys.indexOf(key) < 0) {\n raise('invalid regl constructor argument \"' + key + '\". must be one of ' + constructorKeys)\n }\n })\n}\n\nfunction leftPad (str, n) {\n str = str + ''\n while (str.length < n) {\n str = ' ' + str\n }\n return str\n}\n\nfunction ShaderFile () {\n this.name = 'unknown'\n this.lines = []\n this.index = {}\n this.hasErrors = false\n}\n\nfunction ShaderLine (number, line) {\n this.number = number\n this.line = line\n this.errors = []\n}\n\nfunction ShaderError (fileNumber, lineNumber, message) {\n this.file = fileNumber\n this.line = lineNumber\n this.message = message\n}\n\nfunction guessCommand () {\n var error = new Error()\n var stack = (error.stack || error).toString()\n var pat = /compileProcedure.*\\n\\s*at.*\\((.*)\\)/.exec(stack)\n if (pat) {\n return pat[1]\n }\n var pat2 = /compileProcedure.*\\n\\s*at\\s+(.*)(\\n|$)/.exec(stack)\n if (pat2) {\n return pat2[1]\n }\n return 'unknown'\n}\n\nfunction guessCallSite () {\n var error = new Error()\n var stack = (error.stack || error).toString()\n var pat = /at REGLCommand.*\\n\\s+at.*\\((.*)\\)/.exec(stack)\n if (pat) {\n return pat[1]\n }\n var pat2 = /at REGLCommand.*\\n\\s+at\\s+(.*)\\n/.exec(stack)\n if (pat2) {\n return pat2[1]\n }\n return 'unknown'\n}\n\nfunction parseSource (source, command) {\n var lines = source.split('\\n')\n var lineNumber = 1\n var fileNumber = 0\n var files = {\n unknown: new ShaderFile(),\n 0: new ShaderFile()\n }\n files.unknown.name = files[0].name = command || guessCommand()\n files.unknown.lines.push(new ShaderLine(0, ''))\n for (var i = 0; i < lines.length; ++i) {\n var line = lines[i]\n var parts = /^\\s*#\\s*(\\w+)\\s+(.+)\\s*$/.exec(line)\n if (parts) {\n switch (parts[1]) {\n case 'line':\n var lineNumberInfo = /(\\d+)(\\s+\\d+)?/.exec(parts[2])\n if (lineNumberInfo) {\n lineNumber = lineNumberInfo[1] | 0\n if (lineNumberInfo[2]) {\n fileNumber = lineNumberInfo[2] | 0\n if (!(fileNumber in files)) {\n files[fileNumber] = new ShaderFile()\n }\n }\n }\n break\n case 'define':\n var nameInfo = /SHADER_NAME(_B64)?\\s+(.*)$/.exec(parts[2])\n if (nameInfo) {\n files[fileNumber].name = (nameInfo[1]\n ? decodeB64(nameInfo[2])\n : nameInfo[2])\n }\n break\n }\n }\n files[fileNumber].lines.push(new ShaderLine(lineNumber++, line))\n }\n Object.keys(files).forEach(function (fileNumber) {\n var file = files[fileNumber]\n file.lines.forEach(function (line) {\n file.index[line.number] = line\n })\n })\n return files\n}\n\nfunction parseErrorLog (errLog) {\n var result = []\n errLog.split('\\n').forEach(function (errMsg) {\n if (errMsg.length < 5) {\n return\n }\n var parts = /^ERROR:\\s+(\\d+):(\\d+):\\s*(.*)$/.exec(errMsg)\n if (parts) {\n result.push(new ShaderError(\n parts[1] | 0,\n parts[2] | 0,\n parts[3].trim()))\n } else if (errMsg.length > 0) {\n result.push(new ShaderError('unknown', 0, errMsg))\n }\n })\n return result\n}\n\nfunction annotateFiles (files, errors) {\n errors.forEach(function (error) {\n var file = files[error.file]\n if (file) {\n var line = file.index[error.line]\n if (line) {\n line.errors.push(error)\n file.hasErrors = true\n return\n }\n }\n files.unknown.hasErrors = true\n files.unknown.lines[0].errors.push(error)\n })\n}\n\nfunction checkShaderError (gl, shader, source, type, command) {\n if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n var errLog = gl.getShaderInfoLog(shader)\n var typeName = type === gl.FRAGMENT_SHADER ? 'fragment' : 'vertex'\n checkCommandType(source, 'string', typeName + ' shader source must be a string', command)\n var files = parseSource(source, command)\n var errors = parseErrorLog(errLog)\n annotateFiles(files, errors)\n\n Object.keys(files).forEach(function (fileNumber) {\n var file = files[fileNumber]\n if (!file.hasErrors) {\n return\n }\n\n var strings = ['']\n var styles = ['']\n\n function push (str, style) {\n strings.push(str)\n styles.push(style || '')\n }\n\n push('file number ' + fileNumber + ': ' + file.name + '\\n', 'color:red;text-decoration:underline;font-weight:bold')\n\n file.lines.forEach(function (line) {\n if (line.errors.length > 0) {\n push(leftPad(line.number, 4) + '| ', 'background-color:yellow; font-weight:bold')\n push(line.line + endl, 'color:red; background-color:yellow; font-weight:bold')\n\n // try to guess token\n var offset = 0\n line.errors.forEach(function (error) {\n var message = error.message\n var token = /^\\s*'(.*)'\\s*:\\s*(.*)$/.exec(message)\n if (token) {\n var tokenPat = token[1]\n message = token[2]\n switch (tokenPat) {\n case 'assign':\n tokenPat = '='\n break\n }\n offset = Math.max(line.line.indexOf(tokenPat, offset), 0)\n } else {\n offset = 0\n }\n\n push(leftPad('| ', 6))\n push(leftPad('^^^', offset + 3) + endl, 'font-weight:bold')\n push(leftPad('| ', 6))\n push(message + endl, 'font-weight:bold')\n })\n push(leftPad('| ', 6) + endl)\n } else {\n push(leftPad(line.number, 4) + '| ')\n push(line.line + endl, 'color:red')\n }\n })\n if (typeof document !== 'undefined' && !window.chrome) {\n styles[0] = strings.join('%c')\n console.log.apply(console, styles)\n } else {\n console.log(strings.join(''))\n }\n })\n\n check.raise('Error compiling ' + typeName + ' shader, ' + files[0].name)\n }\n}\n\nfunction checkLinkError (gl, program, fragShader, vertShader, command) {\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n var errLog = gl.getProgramInfoLog(program)\n var fragParse = parseSource(fragShader, command)\n var vertParse = parseSource(vertShader, command)\n\n var header = 'Error linking program with vertex shader, \"' +\n vertParse[0].name + '\", and fragment shader \"' + fragParse[0].name + '\"'\n\n if (typeof document !== 'undefined') {\n console.log('%c' + header + endl + '%c' + errLog,\n 'color:red;text-decoration:underline;font-weight:bold',\n 'color:red')\n } else {\n console.log(header + endl + errLog)\n }\n check.raise(header)\n }\n}\n\nfunction saveCommandRef (object) {\n object._commandRef = guessCommand()\n}\n\nfunction saveDrawCommandInfo (opts, uniforms, attributes, stringStore) {\n saveCommandRef(opts)\n\n function id (str) {\n if (str) {\n return stringStore.id(str)\n }\n return 0\n }\n opts._fragId = id(opts.static.frag)\n opts._vertId = id(opts.static.vert)\n\n function addProps (dict, set) {\n Object.keys(set).forEach(function (u) {\n dict[stringStore.id(u)] = true\n })\n }\n\n var uniformSet = opts._uniformSet = {}\n addProps(uniformSet, uniforms.static)\n addProps(uniformSet, uniforms.dynamic)\n\n var attributeSet = opts._attributeSet = {}\n addProps(attributeSet, attributes.static)\n addProps(attributeSet, attributes.dynamic)\n\n opts._hasCount = (\n 'count' in opts.static ||\n 'count' in opts.dynamic ||\n 'elements' in opts.static ||\n 'elements' in opts.dynamic)\n}\n\nfunction commandRaise (message, command) {\n var callSite = guessCallSite()\n raise(message +\n ' in command ' + (command || guessCommand()) +\n (callSite === 'unknown' ? '' : ' called from ' + callSite))\n}\n\nfunction checkCommand (pred, message, command) {\n if (!pred) {\n commandRaise(message, command || guessCommand())\n }\n}\n\nfunction checkParameterCommand (param, possibilities, message, command) {\n if (!(param in possibilities)) {\n commandRaise(\n 'unknown parameter (' + param + ')' + encolon(message) +\n '. possible values: ' + Object.keys(possibilities).join(),\n command || guessCommand())\n }\n}\n\nfunction checkCommandType (value, type, message, command) {\n if (!standardTypeEh(value, type)) {\n commandRaise(\n 'invalid parameter type' + encolon(message) +\n '. expected ' + type + ', got ' + (typeof value),\n command || guessCommand())\n }\n}\n\nfunction checkOptional (block) {\n block()\n}\n\nfunction checkFramebufferFormat (attachment, texFormats, rbFormats) {\n if (attachment.texture) {\n checkOneOf(\n attachment.texture._texture.internalformat,\n texFormats,\n 'unsupported texture format for attachment')\n } else {\n checkOneOf(\n attachment.renderbuffer._renderbuffer.format,\n rbFormats,\n 'unsupported renderbuffer format for attachment')\n }\n}\n\nvar GL_CLAMP_TO_EDGE = 0x812F\n\nvar GL_NEAREST = 0x2600\nvar GL_NEAREST_MIPMAP_NEAREST = 0x2700\nvar GL_LINEAR_MIPMAP_NEAREST = 0x2701\nvar GL_NEAREST_MIPMAP_LINEAR = 0x2702\nvar GL_LINEAR_MIPMAP_LINEAR = 0x2703\n\nvar GL_BYTE = 5120\nvar GL_UNSIGNED_BYTE = 5121\nvar GL_SHORT = 5122\nvar GL_UNSIGNED_SHORT = 5123\nvar GL_INT = 5124\nvar GL_UNSIGNED_INT = 5125\nvar GL_FLOAT = 5126\n\nvar GL_UNSIGNED_SHORT_4_4_4_4 = 0x8033\nvar GL_UNSIGNED_SHORT_5_5_5_1 = 0x8034\nvar GL_UNSIGNED_SHORT_5_6_5 = 0x8363\nvar GL_UNSIGNED_INT_24_8_WEBGL = 0x84FA\n\nvar GL_HALF_FLOAT_OES = 0x8D61\n\nvar TYPE_SIZE = {}\n\nTYPE_SIZE[GL_BYTE] =\nTYPE_SIZE[GL_UNSIGNED_BYTE] = 1\n\nTYPE_SIZE[GL_SHORT] =\nTYPE_SIZE[GL_UNSIGNED_SHORT] =\nTYPE_SIZE[GL_HALF_FLOAT_OES] =\nTYPE_SIZE[GL_UNSIGNED_SHORT_5_6_5] =\nTYPE_SIZE[GL_UNSIGNED_SHORT_4_4_4_4] =\nTYPE_SIZE[GL_UNSIGNED_SHORT_5_5_5_1] = 2\n\nTYPE_SIZE[GL_INT] =\nTYPE_SIZE[GL_UNSIGNED_INT] =\nTYPE_SIZE[GL_FLOAT] =\nTYPE_SIZE[GL_UNSIGNED_INT_24_8_WEBGL] = 4\n\nfunction pixelSize (type, channels) {\n if (type === GL_UNSIGNED_SHORT_5_5_5_1 ||\n type === GL_UNSIGNED_SHORT_4_4_4_4 ||\n type === GL_UNSIGNED_SHORT_5_6_5) {\n return 2\n } else if (type === GL_UNSIGNED_INT_24_8_WEBGL) {\n return 4\n } else {\n return TYPE_SIZE[type] * channels\n }\n}\n\nfunction isPow2 (v) {\n return !(v & (v - 1)) && (!!v)\n}\n\nfunction checkTexture2D (info, mipData, limits) {\n var i\n var w = mipData.width\n var h = mipData.height\n var c = mipData.channels\n\n // Check texture shape\n check(w > 0 && w <= limits.maxTextureSize &&\n h > 0 && h <= limits.maxTextureSize,\n 'invalid texture shape')\n\n // check wrap mode\n if (info.wrapS !== GL_CLAMP_TO_EDGE || info.wrapT !== GL_CLAMP_TO_EDGE) {\n check(isPow2(w) && isPow2(h),\n 'incompatible wrap mode for texture, both width and height must be power of 2')\n }\n\n if (mipData.mipmask === 1) {\n if (w !== 1 && h !== 1) {\n check(\n info.minFilter !== GL_NEAREST_MIPMAP_NEAREST &&\n info.minFilter !== GL_NEAREST_MIPMAP_LINEAR &&\n info.minFilter !== GL_LINEAR_MIPMAP_NEAREST &&\n info.minFilter !== GL_LINEAR_MIPMAP_LINEAR,\n 'min filter requires mipmap')\n }\n } else {\n // texture must be power of 2\n check(isPow2(w) && isPow2(h),\n 'texture must be a square power of 2 to support mipmapping')\n check(mipData.mipmask === (w << 1) - 1,\n 'missing or incomplete mipmap data')\n }\n\n if (mipData.type === GL_FLOAT) {\n if (limits.extensions.indexOf('oes_texture_float_linear') < 0) {\n check(info.minFilter === GL_NEAREST && info.magFilter === GL_NEAREST,\n 'filter not supported, must enable oes_texture_float_linear')\n }\n check(!info.genMipmaps,\n 'mipmap generation not supported with float textures')\n }\n\n // check image complete\n var mipimages = mipData.images\n for (i = 0; i < 16; ++i) {\n if (mipimages[i]) {\n var mw = w >> i\n var mh = h >> i\n check(mipData.mipmask & (1 << i), 'missing mipmap data')\n\n var img = mipimages[i]\n\n check(\n img.width === mw &&\n img.height === mh,\n 'invalid shape for mip images')\n\n check(\n img.format === mipData.format &&\n img.internalformat === mipData.internalformat &&\n img.type === mipData.type,\n 'incompatible type for mip image')\n\n if (img.compressed) {\n // TODO: check size for compressed images\n } else if (img.data) {\n // check(img.data.byteLength === mw * mh *\n // Math.max(pixelSize(img.type, c), img.unpackAlignment),\n var rowSize = Math.ceil(pixelSize(img.type, c) * mw / img.unpackAlignment) * img.unpackAlignment\n check(img.data.byteLength === rowSize * mh,\n 'invalid data for image, buffer size is inconsistent with image format')\n } else if (img.element) {\n // TODO: check element can be loaded\n } else if (img.copy) {\n // TODO: check compatible format and type\n }\n } else if (!info.genMipmaps) {\n check((mipData.mipmask & (1 << i)) === 0, 'extra mipmap data')\n }\n }\n\n if (mipData.compressed) {\n check(!info.genMipmaps,\n 'mipmap generation for compressed images not supported')\n }\n}\n\nfunction checkTextureCube (texture, info, faces, limits) {\n var w = texture.width\n var h = texture.height\n var c = texture.channels\n\n // Check texture shape\n check(\n w > 0 && w <= limits.maxTextureSize && h > 0 && h <= limits.maxTextureSize,\n 'invalid texture shape')\n check(\n w === h,\n 'cube map must be square')\n check(\n info.wrapS === GL_CLAMP_TO_EDGE && info.wrapT === GL_CLAMP_TO_EDGE,\n 'wrap mode not supported by cube map')\n\n for (var i = 0; i < faces.length; ++i) {\n var face = faces[i]\n check(\n face.width === w && face.height === h,\n 'inconsistent cube map face shape')\n\n if (info.genMipmaps) {\n check(!face.compressed,\n 'can not generate mipmap for compressed textures')\n check(face.mipmask === 1,\n 'can not specify mipmaps and generate mipmaps')\n } else {\n // TODO: check mip and filter mode\n }\n\n var mipmaps = face.images\n for (var j = 0; j < 16; ++j) {\n var img = mipmaps[j]\n if (img) {\n var mw = w >> j\n var mh = h >> j\n check(face.mipmask & (1 << j), 'missing mipmap data')\n check(\n img.width === mw &&\n img.height === mh,\n 'invalid shape for mip images')\n check(\n img.format === texture.format &&\n img.internalformat === texture.internalformat &&\n img.type === texture.type,\n 'incompatible type for mip image')\n\n if (img.compressed) {\n // TODO: check size for compressed images\n } else if (img.data) {\n check(img.data.byteLength === mw * mh *\n Math.max(pixelSize(img.type, c), img.unpackAlignment),\n 'invalid data for image, buffer size is inconsistent with image format')\n } else if (img.element) {\n // TODO: check element can be loaded\n } else if (img.copy) {\n // TODO: check compatible format and type\n }\n }\n }\n }\n}\n\nvar check$1 = extend(check, {\n optional: checkOptional,\n raise: raise,\n commandRaise: commandRaise,\n command: checkCommand,\n parameter: checkParameter,\n commandParameter: checkParameterCommand,\n constructor: checkConstructor,\n type: checkTypeOf,\n commandType: checkCommandType,\n isTypedArray: checkIsTypedArray,\n nni: checkNonNegativeInt,\n oneOf: checkOneOf,\n shaderError: checkShaderError,\n linkError: checkLinkError,\n callSite: guessCallSite,\n saveCommandRef: saveCommandRef,\n saveDrawInfo: saveDrawCommandInfo,\n framebufferFormat: checkFramebufferFormat,\n guessCommand: guessCommand,\n texture2D: checkTexture2D,\n textureCube: checkTextureCube\n});\n\nvar VARIABLE_COUNTER = 0\n\nvar DYN_FUNC = 0\nvar DYN_CONSTANT = 5\nvar DYN_ARRAY = 6\n\nfunction DynamicVariable (type, data) {\n this.id = (VARIABLE_COUNTER++)\n this.type = type\n this.data = data\n}\n\nfunction escapeStr (str) {\n return str.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"')\n}\n\nfunction splitParts (str) {\n if (str.length === 0) {\n return []\n }\n\n var firstChar = str.charAt(0)\n var lastChar = str.charAt(str.length - 1)\n\n if (str.length > 1 &&\n firstChar === lastChar &&\n (firstChar === '\"' || firstChar === \"'\")) {\n return ['\"' + escapeStr(str.substr(1, str.length - 2)) + '\"']\n }\n\n var parts = /\\[(false|true|null|\\d+|'[^']*'|\"[^\"]*\")\\]/.exec(str)\n if (parts) {\n return (\n splitParts(str.substr(0, parts.index))\n .concat(splitParts(parts[1]))\n .concat(splitParts(str.substr(parts.index + parts[0].length)))\n )\n }\n\n var subparts = str.split('.')\n if (subparts.length === 1) {\n return ['\"' + escapeStr(str) + '\"']\n }\n\n var result = []\n for (var i = 0; i < subparts.length; ++i) {\n result = result.concat(splitParts(subparts[i]))\n }\n return result\n}\n\nfunction toAccessorString (str) {\n return '[' + splitParts(str).join('][') + ']'\n}\n\nfunction defineDynamic (type, data) {\n return new DynamicVariable(type, toAccessorString(data + ''))\n}\n\nfunction isDynamic (x) {\n return (typeof x === 'function' && !x._reglType) || (x instanceof DynamicVariable)\n}\n\nfunction unbox (x, path) {\n if (typeof x === 'function') {\n return new DynamicVariable(DYN_FUNC, x)\n } else if (typeof x === 'number' || typeof x === 'boolean') {\n return new DynamicVariable(DYN_CONSTANT, x)\n } else if (Array.isArray(x)) {\n return new DynamicVariable(DYN_ARRAY, x.map((y, i) => unbox(y, path + '[' + i + ']')))\n } else if (x instanceof DynamicVariable) {\n return x\n }\n check$1(false, 'invalid option type in uniform ' + path)\n}\n\nvar dynamic = {\n DynamicVariable: DynamicVariable,\n define: defineDynamic,\n isDynamic: isDynamic,\n unbox: unbox,\n accessor: toAccessorString\n};\n\n/* globals requestAnimationFrame, cancelAnimationFrame */\nvar raf = {\n next: typeof requestAnimationFrame === 'function'\n ? function (cb) { return requestAnimationFrame(cb) }\n : function (cb) { return setTimeout(cb, 16) },\n cancel: typeof cancelAnimationFrame === 'function'\n ? function (raf) { return cancelAnimationFrame(raf) }\n : clearTimeout\n};\n\n/* globals performance */\nvar clock = (typeof performance !== 'undefined' && performance.now)\n ? function () { return performance.now() }\n : function () { return +(new Date()) };\n\nfunction createStringStore () {\n var stringIds = { '': 0 }\n var stringValues = ['']\n return {\n id: function (str) {\n var result = stringIds[str]\n if (result) {\n return result\n }\n result = stringIds[str] = stringValues.length\n stringValues.push(str)\n return result\n },\n\n str: function (id) {\n return stringValues[id]\n }\n }\n}\n\n// Context and canvas creation helper functions\nfunction createCanvas (element, onDone, pixelRatio) {\n var canvas = document.createElement('canvas')\n extend(canvas.style, {\n border: 0,\n margin: 0,\n padding: 0,\n top: 0,\n left: 0\n })\n element.appendChild(canvas)\n\n if (element === document.body) {\n canvas.style.position = 'absolute'\n extend(element.style, {\n margin: 0,\n padding: 0\n })\n }\n\n function resize () {\n var w = window.innerWidth\n var h = window.innerHeight\n if (element !== document.body) {\n var bounds = element.getBoundingClientRect()\n w = bounds.right - bounds.left\n h = bounds.bottom - bounds.top\n }\n canvas.width = pixelRatio * w\n canvas.height = pixelRatio * h\n extend(canvas.style, {\n width: w + 'px',\n height: h + 'px'\n })\n }\n\n var resizeObserver\n if (element !== document.body && typeof ResizeObserver === 'function') {\n // ignore 'ResizeObserver' is not defined\n // eslint-disable-next-line\n resizeObserver = new ResizeObserver(function () {\n // setTimeout to avoid flicker\n setTimeout(resize)\n })\n resizeObserver.observe(element)\n } else {\n window.addEventListener('resize', resize, false)\n }\n\n function onDestroy () {\n if (resizeObserver) {\n resizeObserver.disconnect()\n } else {\n window.removeEventListener('resize', resize)\n }\n element.removeChild(canvas)\n }\n\n resize()\n\n return {\n canvas: canvas,\n onDestroy: onDestroy\n }\n}\n\nfunction createContext (canvas, contextAttributes) {\n function get (name) {\n try {\n return canvas.getContext(name, contextAttributes)\n } catch (e) {\n return null\n }\n }\n return (\n get('webgl') ||\n get('experimental-webgl') ||\n get('webgl-experimental')\n )\n}\n\nfunction isHTMLElement (obj) {\n return (\n typeof obj.nodeName === 'string' &&\n typeof obj.appendChild === 'function' &&\n typeof obj.getBoundingClientRect === 'function'\n )\n}\n\nfunction isWebGLContext (obj) {\n return (\n typeof obj.drawArrays === 'function' ||\n typeof obj.drawElements === 'function'\n )\n}\n\nfunction parseExtensions (input) {\n if (typeof input === 'string') {\n return input.split()\n }\n check$1(Array.isArray(input), 'invalid extension array')\n return input\n}\n\nfunction getElement (desc) {\n if (typeof desc === 'string') {\n check$1(typeof document !== 'undefined', 'not supported outside of DOM')\n return document.querySelector(desc)\n }\n return desc\n}\n\nfunction parseArgs (args_) {\n var args = args_ || {}\n var element, container, canvas, gl\n var contextAttributes = {}\n var extensions = []\n var optionalExtensions = []\n var pixelRatio = (typeof window === 'undefined' ? 1 : window.devicePixelRatio)\n var profile = false\n var onDone = function (err) {\n if (err) {\n check$1.raise(err)\n }\n }\n var onDestroy = function () {}\n if (typeof args === 'string') {\n check$1(\n typeof document !== 'undefined',\n 'selector queries only supported in DOM enviroments')\n element = document.querySelector(args)\n check$1(element, 'invalid query string for element')\n } else if (typeof args === 'object') {\n if (isHTMLElement(args)) {\n element = args\n } else if (isWebGLContext(args)) {\n gl = args\n canvas = gl.canvas\n } else {\n check$1.constructor(args)\n if ('gl' in args) {\n gl = args.gl\n } else if ('canvas' in args) {\n canvas = getElement(args.canvas)\n } else if ('container' in args) {\n container = getElement(args.container)\n }\n if ('attributes' in args) {\n contextAttributes = args.attributes\n check$1.type(contextAttributes, 'object', 'invalid context attributes')\n }\n if ('extensions' in args) {\n extensions = parseExtensions(args.extensions)\n }\n if ('optionalExtensions' in args) {\n optionalExtensions = parseExtensions(args.optionalExtensions)\n }\n if ('onDone' in args) {\n check$1.type(\n args.onDone, 'function',\n 'invalid or missing onDone callback')\n onDone = args.onDone\n }\n if ('profile' in args) {\n profile = !!args.profile\n }\n if ('pixelRatio' in args) {\n pixelRatio = +args.pixelRatio\n check$1(pixelRatio > 0, 'invalid pixel ratio')\n }\n }\n } else {\n check$1.raise('invalid arguments to regl')\n }\n\n if (element) {\n if (element.nodeName.toLowerCase() === 'canvas') {\n canvas = element\n } else {\n container = element\n }\n }\n\n if (!gl) {\n if (!canvas) {\n check$1(\n typeof document !== 'undefined',\n 'must manually specify webgl context outside of DOM environments')\n var result = createCanvas(container || document.body, onDone, pixelRatio)\n if (!result) {\n return null\n }\n canvas = result.canvas\n onDestroy = result.onDestroy\n }\n // workaround for chromium bug, premultiplied alpha value is platform dependent\n if (contextAttributes.premultipliedAlpha === undefined) contextAttributes.premultipliedAlpha = true\n gl = createContext(canvas, contextAttributes)\n }\n\n if (!gl) {\n onDestroy()\n onDone('webgl not supported, try upgrading your browser or graphics drivers http://get.webgl.org')\n return null\n }\n\n return {\n gl: gl,\n canvas: canvas,\n container: container,\n extensions: extensions,\n optionalExtensions: optionalExtensions,\n pixelRatio: pixelRatio,\n profile: profile,\n onDone: onDone,\n onDestroy: onDestroy\n }\n}\n\nfunction createExtensionCache (gl, config) {\n var extensions = {}\n\n function tryLoadExtension (name_) {\n check$1.type(name_, 'string', 'extension name must be string')\n var name = name_.toLowerCase()\n var ext\n try {\n ext = extensions[name] = gl.getExtension(name)\n } catch (e) {}\n return !!ext\n }\n\n for (var i = 0; i < config.extensions.length; ++i) {\n var name = config.extensions[i]\n if (!tryLoadExtension(name)) {\n config.onDestroy()\n config.onDone('\"' + name + '\" extension is not supported by the current WebGL context, try upgrading your system or a different browser')\n return null\n }\n }\n\n config.optionalExtensions.forEach(tryLoadExtension)\n\n return {\n extensions: extensions,\n restore: function () {\n Object.keys(extensions).forEach(function (name) {\n if (extensions[name] && !tryLoadExtension(name)) {\n throw new Error('(regl): error restoring extension ' + name)\n }\n })\n }\n }\n}\n\nfunction loop (n, f) {\n var result = Array(n)\n for (var i = 0; i < n; ++i) {\n result[i] = f(i)\n }\n return result\n}\n\nvar GL_BYTE$1 = 5120\nvar GL_UNSIGNED_BYTE$2 = 5121\nvar GL_SHORT$1 = 5122\nvar GL_UNSIGNED_SHORT$1 = 5123\nvar GL_INT$1 = 5124\nvar GL_UNSIGNED_INT$1 = 5125\nvar GL_FLOAT$2 = 5126\n\nfunction nextPow16 (v) {\n for (var i = 16; i <= (1 << 28); i *= 16) {\n if (v <= i) {\n return i\n }\n }\n return 0\n}\n\nfunction log2 (v) {\n var r, shift\n r = (v > 0xFFFF) << 4\n v >>>= r\n shift = (v > 0xFF) << 3\n v >>>= shift; r |= shift\n shift = (v > 0xF) << 2\n v >>>= shift; r |= shift\n shift = (v > 0x3) << 1\n v >>>= shift; r |= shift\n return r | (v >> 1)\n}\n\nfunction createPool () {\n var bufferPool = loop(8, function () {\n return []\n })\n\n function alloc (n) {\n var sz = nextPow16(n)\n var bin = bufferPool[log2(sz) >> 2]\n if (bin.length > 0) {\n return bin.pop()\n }\n return new ArrayBuffer(sz)\n }\n\n function free (buf) {\n bufferPool[log2(buf.byteLength) >> 2].push(buf)\n }\n\n function allocType (type, n) {\n var result = null\n switch (type) {\n case GL_BYTE$1:\n result = new Int8Array(alloc(n), 0, n)\n break\n case GL_UNSIGNED_BYTE$2:\n result = new Uint8Array(alloc(n), 0, n)\n break\n case GL_SHORT$1:\n result = new Int16Array(alloc(2 * n), 0, n)\n break\n case GL_UNSIGNED_SHORT$1:\n result = new Uint16Array(alloc(2 * n), 0, n)\n break\n case GL_INT$1:\n result = new Int32Array(alloc(4 * n), 0, n)\n break\n case GL_UNSIGNED_INT$1:\n result = new Uint32Array(alloc(4 * n), 0, n)\n break\n case GL_FLOAT$2:\n result = new Float32Array(alloc(4 * n), 0, n)\n break\n default:\n return null\n }\n if (result.length !== n) {\n return result.subarray(0, n)\n }\n return result\n }\n\n function freeType (array) {\n free(array.buffer)\n }\n\n return {\n alloc: alloc,\n free: free,\n allocType: allocType,\n freeType: freeType\n }\n}\n\nvar pool = createPool()\n\n// zero pool for initial zero data\npool.zero = createPool()\n\nvar GL_SUBPIXEL_BITS = 0x0D50\nvar GL_RED_BITS = 0x0D52\nvar GL_GREEN_BITS = 0x0D53\nvar GL_BLUE_BITS = 0x0D54\nvar GL_ALPHA_BITS = 0x0D55\nvar GL_DEPTH_BITS = 0x0D56\nvar GL_STENCIL_BITS = 0x0D57\n\nvar GL_ALIASED_POINT_SIZE_RANGE = 0x846D\nvar GL_ALIASED_LINE_WIDTH_RANGE = 0x846E\n\nvar GL_MAX_TEXTURE_SIZE = 0x0D33\nvar GL_MAX_VIEWPORT_DIMS = 0x0D3A\nvar GL_MAX_VERTEX_ATTRIBS = 0x8869\nvar GL_MAX_VERTEX_UNIFORM_VECTORS = 0x8DFB\nvar GL_MAX_VARYING_VECTORS = 0x8DFC\nvar GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS = 0x8B4D\nvar GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS = 0x8B4C\nvar GL_MAX_TEXTURE_IMAGE_UNITS = 0x8872\nvar GL_MAX_FRAGMENT_UNIFORM_VECTORS = 0x8DFD\nvar GL_MAX_CUBE_MAP_TEXTURE_SIZE = 0x851C\nvar GL_MAX_RENDERBUFFER_SIZE = 0x84E8\n\nvar GL_VENDOR = 0x1F00\nvar GL_RENDERER = 0x1F01\nvar GL_VERSION = 0x1F02\nvar GL_SHADING_LANGUAGE_VERSION = 0x8B8C\n\nvar GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT = 0x84FF\n\nvar GL_MAX_COLOR_ATTACHMENTS_WEBGL = 0x8CDF\nvar GL_MAX_DRAW_BUFFERS_WEBGL = 0x8824\n\nvar GL_TEXTURE_2D = 0x0DE1\nvar GL_TEXTURE_CUBE_MAP = 0x8513\nvar GL_TEXTURE_CUBE_MAP_POSITIVE_X = 0x8515\nvar GL_TEXTURE0 = 0x84C0\nvar GL_RGBA = 0x1908\nvar GL_FLOAT$1 = 0x1406\nvar GL_UNSIGNED_BYTE$1 = 0x1401\nvar GL_FRAMEBUFFER = 0x8D40\nvar GL_FRAMEBUFFER_COMPLETE = 0x8CD5\nvar GL_COLOR_ATTACHMENT0 = 0x8CE0\nvar GL_COLOR_BUFFER_BIT$1 = 0x4000\n\nvar wrapLimits = function (gl, extensions) {\n var maxAnisotropic = 1\n if (extensions.ext_texture_filter_anisotropic) {\n maxAnisotropic = gl.getParameter(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT)\n }\n\n var maxDrawbuffers = 1\n var maxColorAttachments = 1\n if (extensions.webgl_draw_buffers) {\n maxDrawbuffers = gl.getParameter(GL_MAX_DRAW_BUFFERS_WEBGL)\n maxColorAttachments = gl.getParameter(GL_MAX_COLOR_ATTACHMENTS_WEBGL)\n }\n\n // detect if reading float textures is available (Safari doesn't support)\n var readFloat = !!extensions.oes_texture_float\n if (readFloat) {\n var readFloatTexture = gl.createTexture()\n gl.bindTexture(GL_TEXTURE_2D, readFloatTexture)\n gl.texImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_FLOAT$1, null)\n\n var fbo = gl.createFramebuffer()\n gl.bindFramebuffer(GL_FRAMEBUFFER, fbo)\n gl.framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, readFloatTexture, 0)\n gl.bindTexture(GL_TEXTURE_2D, null)\n\n if (gl.checkFramebufferStatus(GL_FRAMEBUFFER) !== GL_FRAMEBUFFER_COMPLETE) readFloat = false\n\n else {\n gl.viewport(0, 0, 1, 1)\n gl.clearColor(1.0, 0.0, 0.0, 1.0)\n gl.clear(GL_COLOR_BUFFER_BIT$1)\n var pixels = pool.allocType(GL_FLOAT$1, 4)\n gl.readPixels(0, 0, 1, 1, GL_RGBA, GL_FLOAT$1, pixels)\n\n if (gl.getError()) readFloat = false\n else {\n gl.deleteFramebuffer(fbo)\n gl.deleteTexture(readFloatTexture)\n\n readFloat = pixels[0] === 1.0\n }\n\n pool.freeType(pixels)\n }\n }\n\n // detect non power of two cube textures support (IE doesn't support)\n var isIE = typeof navigator !== 'undefined' && (/MSIE/.test(navigator.userAgent) || /Trident\\//.test(navigator.appVersion) || /Edge/.test(navigator.userAgent))\n\n var npotTextureCube = true\n\n if (!isIE) {\n var cubeTexture = gl.createTexture()\n var data = pool.allocType(GL_UNSIGNED_BYTE$1, 36)\n gl.activeTexture(GL_TEXTURE0)\n gl.bindTexture(GL_TEXTURE_CUBE_MAP, cubeTexture)\n gl.texImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGBA, 3, 3, 0, GL_RGBA, GL_UNSIGNED_BYTE$1, data)\n pool.freeType(data)\n gl.bindTexture(GL_TEXTURE_CUBE_MAP, null)\n gl.deleteTexture(cubeTexture)\n npotTextureCube = !gl.getError()\n }\n\n return {\n // drawing buffer bit depth\n colorBits: [\n gl.getParameter(GL_RED_BITS),\n gl.getParameter(GL_GREEN_BITS),\n gl.getParameter(GL_BLUE_BITS),\n gl.getParameter(GL_ALPHA_BITS)\n ],\n depthBits: gl.getParameter(GL_DEPTH_BITS),\n stencilBits: gl.getParameter(GL_STENCIL_BITS),\n subpixelBits: gl.getParameter(GL_SUBPIXEL_BITS),\n\n // supported extensions\n extensions: Object.keys(extensions).filter(function (ext) {\n return !!extensions[ext]\n }),\n\n // max aniso samples\n maxAnisotropic: maxAnisotropic,\n\n // max draw buffers\n maxDrawbuffers: maxDrawbuffers,\n maxColorAttachments: maxColorAttachments,\n\n // point and line size ranges\n pointSizeDims: gl.getParameter(GL_ALIASED_POINT_SIZE_RANGE),\n lineWidthDims: gl.getParameter(GL_ALIASED_LINE_WIDTH_RANGE),\n maxViewportDims: gl.getParameter(GL_MAX_VIEWPORT_DIMS),\n maxCombinedTextureUnits: gl.getParameter(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS),\n maxCubeMapSize: gl.getParameter(GL_MAX_CUBE_MAP_TEXTURE_SIZE),\n maxRenderbufferSize: gl.getParameter(GL_MAX_RENDERBUFFER_SIZE),\n maxTextureUnits: gl.getParameter(GL_MAX_TEXTURE_IMAGE_UNITS),\n maxTextureSize: gl.getParameter(GL_MAX_TEXTURE_SIZE),\n maxAttributes: gl.getParameter(GL_MAX_VERTEX_ATTRIBS),\n maxVertexUniforms: gl.getParameter(GL_MAX_VERTEX_UNIFORM_VECTORS),\n maxVertexTextureUnits: gl.getParameter(GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS),\n maxVaryingVectors: gl.getParameter(GL_MAX_VARYING_VECTORS),\n maxFragmentUniforms: gl.getParameter(GL_MAX_FRAGMENT_UNIFORM_VECTORS),\n\n // vendor info\n glsl: gl.getParameter(GL_SHADING_LANGUAGE_VERSION),\n renderer: gl.getParameter(GL_RENDERER),\n vendor: gl.getParameter(GL_VENDOR),\n version: gl.getParameter(GL_VERSION),\n\n // quirks\n readFloat: readFloat,\n npotTextureCube: npotTextureCube\n }\n}\n\nfunction isNDArrayLike (obj) {\n return (\n !!obj &&\n typeof obj === 'object' &&\n Array.isArray(obj.shape) &&\n Array.isArray(obj.stride) &&\n typeof obj.offset === 'number' &&\n obj.shape.length === obj.stride.length &&\n (Array.isArray(obj.data) ||\n isTypedArray(obj.data)))\n}\n\nvar values = function (obj) {\n return Object.keys(obj).map(function (key) { return obj[key] })\n}\n\nvar flattenUtils = {\n shape: arrayShape$1,\n flatten: flattenArray\n};\n\nfunction flatten1D (array, nx, out) {\n for (var i = 0; i < nx; ++i) {\n out[i] = array[i]\n }\n}\n\nfunction flatten2D (array, nx, ny, out) {\n var ptr = 0\n for (var i = 0; i < nx; ++i) {\n var row = array[i]\n for (var j = 0; j < ny; ++j) {\n out[ptr++] = row[j]\n }\n }\n}\n\nfunction flatten3D (array, nx, ny, nz, out, ptr_) {\n var ptr = ptr_\n for (var i = 0; i < nx; ++i) {\n var row = array[i]\n for (var j = 0; j < ny; ++j) {\n var col = row[j]\n for (var k = 0; k < nz; ++k) {\n out[ptr++] = col[k]\n }\n }\n }\n}\n\nfunction flattenRec (array, shape, level, out, ptr) {\n var stride = 1\n for (var i = level + 1; i < shape.length; ++i) {\n stride *= shape[i]\n }\n var n = shape[level]\n if (shape.length - level === 4) {\n var nx = shape[level + 1]\n var ny = shape[level + 2]\n var nz = shape[level + 3]\n for (i = 0; i < n; ++i) {\n flatten3D(array[i], nx, ny, nz, out, ptr)\n ptr += stride\n }\n } else {\n for (i = 0; i < n; ++i) {\n flattenRec(array[i], shape, level + 1, out, ptr)\n ptr += stride\n }\n }\n}\n\nfunction flattenArray (array, shape, type, out_) {\n var sz = 1\n if (shape.length) {\n for (var i = 0; i < shape.length; ++i) {\n sz *= shape[i]\n }\n } else {\n sz = 0\n }\n var out = out_ || pool.allocType(type, sz)\n switch (shape.length) {\n case 0:\n break\n case 1:\n flatten1D(array, shape[0], out)\n break\n case 2:\n flatten2D(array, shape[0], shape[1], out)\n break\n case 3:\n flatten3D(array, shape[0], shape[1], shape[2], out, 0)\n break\n default:\n flattenRec(array, shape, 0, out, 0)\n }\n return out\n}\n\nfunction arrayShape$1 (array_) {\n var shape = []\n for (var array = array_; array.length; array = array[0]) {\n shape.push(array.length)\n }\n return shape\n}\n\nvar arrayTypes = {\n\t\"[object Int8Array]\": 5120,\n\t\"[object Int16Array]\": 5122,\n\t\"[object Int32Array]\": 5124,\n\t\"[object Uint8Array]\": 5121,\n\t\"[object Uint8ClampedArray]\": 5121,\n\t\"[object Uint16Array]\": 5123,\n\t\"[object Uint32Array]\": 5125,\n\t\"[object Float32Array]\": 5126,\n\t\"[object Float64Array]\": 5121,\n\t\"[object ArrayBuffer]\": 5121\n};\n\nvar int8 = 5120;\nvar int16 = 5122;\nvar int32 = 5124;\nvar uint8 = 5121;\nvar uint16 = 5123;\nvar uint32 = 5125;\nvar float = 5126;\nvar float32 = 5126;\nvar glTypes = {\n\tint8: int8,\n\tint16: int16,\n\tint32: int32,\n\tuint8: uint8,\n\tuint16: uint16,\n\tuint32: uint32,\n\tfloat: float,\n\tfloat32: float32\n};\n\nvar dynamic$1 = 35048;\nvar stream = 35040;\nvar usageTypes = {\n\tdynamic: dynamic$1,\n\tstream: stream,\n\t\"static\": 35044\n};\n\nvar arrayFlatten = flattenUtils.flatten\nvar arrayShape = flattenUtils.shape\n\nvar GL_STATIC_DRAW = 0x88E4\nvar GL_STREAM_DRAW = 0x88E0\n\nvar GL_UNSIGNED_BYTE$3 = 5121\nvar GL_FLOAT$3 = 5126\n\nvar DTYPES_SIZES = []\nDTYPES_SIZES[5120] = 1 // int8\nDTYPES_SIZES[5122] = 2 // int16\nDTYPES_SIZES[5124] = 4 // int32\nDTYPES_SIZES[5121] = 1 // uint8\nDTYPES_SIZES[5123] = 2 // uint16\nDTYPES_SIZES[5125] = 4 // uint32\nDTYPES_SIZES[5126] = 4 // float32\n\nfunction typedArrayCode (data) {\n return arrayTypes[Object.prototype.toString.call(data)] | 0\n}\n\nfunction copyArray (out, inp) {\n for (var i = 0; i < inp.length; ++i) {\n out[i] = inp[i]\n }\n}\n\nfunction transpose (\n result, data, shapeX, shapeY, strideX, strideY, offset) {\n var ptr = 0\n for (var i = 0; i < shapeX; ++i) {\n for (var j = 0; j < shapeY; ++j) {\n result[ptr++] = data[strideX * i + strideY * j + offset]\n }\n }\n}\n\nfunction wrapBufferState (gl, stats, config, destroyBuffer) {\n var bufferCount = 0\n var bufferSet = {}\n\n function REGLBuffer (type) {\n this.id = bufferCount++\n this.buffer = gl.createBuffer()\n this.type = type\n this.usage = GL_STATIC_DRAW\n this.byteLength = 0\n this.dimension = 1\n this.dtype = GL_UNSIGNED_BYTE$3\n\n this.persistentData = null\n\n if (config.profile) {\n this.stats = { size: 0 }\n }\n }\n\n REGLBuffer.prototype.bind = function () {\n gl.bindBuffer(this.type, this.buffer)\n }\n\n REGLBuffer.prototype.destroy = function () {\n destroy(this)\n }\n\n var streamPool = []\n\n function createStream (type, data) {\n var buffer = streamPool.pop()\n if (!buffer) {\n buffer = new REGLBuffer(type)\n }\n buffer.bind()\n initBufferFromData(buffer, data, GL_STREAM_DRAW, 0, 1, false)\n return buffer\n }\n\n function destroyStream (stream$$1) {\n streamPool.push(stream$$1)\n }\n\n function initBufferFromTypedArray (buffer, data, usage) {\n buffer.byteLength = data.byteLength\n gl.bufferData(buffer.type, data, usage)\n }\n\n function initBufferFromData (buffer, data, usage, dtype, dimension, persist) {\n var shape\n buffer.usage = usage\n if (Array.isArray(data)) {\n buffer.dtype = dtype || GL_FLOAT$3\n if (data.length > 0) {\n var flatData\n if (Array.isArray(data[0])) {\n shape = arrayShape(data)\n var dim = 1\n for (var i = 1; i < shape.length; ++i) {\n dim *= shape[i]\n }\n buffer.dimension = dim\n flatData = arrayFlatten(data, shape, buffer.dtype)\n initBufferFromTypedArray(buffer, flatData, usage)\n if (persist) {\n buffer.persistentData = flatData\n } else {\n pool.freeType(flatData)\n }\n } else if (typeof data[0] === 'number') {\n buffer.dimension = dimension\n var typedData = pool.allocType(buffer.dtype, data.length)\n copyArray(typedData, data)\n initBufferFromTypedArray(buffer, typedData, usage)\n if (persist) {\n buffer.persistentData = typedData\n } else {\n pool.freeType(typedData)\n }\n } else if (isTypedArray(data[0])) {\n buffer.dimension = data[0].length\n buffer.dtype = dtype || typedArrayCode(data[0]) || GL_FLOAT$3\n flatData = arrayFlatten(\n data,\n [data.length, data[0].length],\n buffer.dtype)\n initBufferFromTypedArray(buffer, flatData, usage)\n if (persist) {\n buffer.persistentData = flatData\n } else {\n pool.freeType(flatData)\n }\n } else {\n check$1.raise('invalid buffer data')\n }\n }\n } else if (isTypedArray(data)) {\n buffer.dtype = dtype || typedArrayCode(data)\n buffer.dimension = dimension\n initBufferFromTypedArray(buffer, data, usage)\n if (persist) {\n buffer.persistentData = new Uint8Array(new Uint8Array(data.buffer))\n }\n } else if (isNDArrayLike(data)) {\n shape = data.shape\n var stride = data.stride\n var offset = data.offset\n\n var shapeX = 0\n var shapeY = 0\n var strideX = 0\n var strideY = 0\n if (shape.length === 1) {\n shapeX = shape[0]\n shapeY = 1\n strideX = stride[0]\n strideY = 0\n } else if (shape.length === 2) {\n shapeX = shape[0]\n shapeY = shape[1]\n strideX = stride[0]\n strideY = stride[1]\n } else {\n check$1.raise('invalid shape')\n }\n\n buffer.dtype = dtype || typedArrayCode(data.data) || GL_FLOAT$3\n buffer.dimension = shapeY\n\n var transposeData = pool.allocType(buffer.dtype, shapeX * shapeY)\n transpose(transposeData,\n data.data,\n shapeX, shapeY,\n strideX, strideY,\n offset)\n initBufferFromTypedArray(buffer, transposeData, usage)\n if (persist) {\n buffer.persistentData = transposeData\n } else {\n pool.freeType(transposeData)\n }\n } else if (data instanceof ArrayBuffer) {\n buffer.dtype = GL_UNSIGNED_BYTE$3\n buffer.dimension = dimension\n initBufferFromTypedArray(buffer, data, usage)\n if (persist) {\n buffer.persistentData = new Uint8Array(new Uint8Array(data))\n }\n } else {\n check$1.raise('invalid buffer data')\n }\n }\n\n function destroy (buffer) {\n stats.bufferCount--\n\n // remove attribute link\n destroyBuffer(buffer)\n\n var handle = buffer.buffer\n check$1(handle, 'buffer must not be deleted already')\n gl.deleteBuffer(handle)\n buffer.buffer = null\n delete bufferSet[buffer.id]\n }\n\n function createBuffer (options, type, deferInit, persistent) {\n stats.bufferCount++\n\n var buffer = new REGLBuffer(type)\n bufferSet[buffer.id] = buffer\n\n function reglBuffer (options) {\n var usage = GL_STATIC_DRAW\n var data = null\n var byteLength = 0\n var dtype = 0\n var dimension = 1\n if (Array.isArray(options) ||\n isTypedArray(options) ||\n isNDArrayLike(options) ||\n options instanceof ArrayBuffer) {\n data = options\n } else if (typeof options === 'number') {\n byteLength = options | 0\n } else if (options) {\n check$1.type(\n options, 'object',\n 'buffer arguments must be an object, a number or an array')\n\n if ('data' in options) {\n check$1(\n data === null ||\n Array.isArray(data) ||\n isTypedArray(data) ||\n isNDArrayLike(data),\n 'invalid data for buffer')\n data = options.data\n }\n\n if ('usage' in options) {\n check$1.parameter(options.usage, usageTypes, 'invalid buffer usage')\n usage = usageTypes[options.usage]\n }\n\n if ('type' in options) {\n check$1.parameter(options.type, glTypes, 'invalid buffer type')\n dtype = glTypes[options.type]\n }\n\n if ('dimension' in options) {\n check$1.type(options.dimension, 'number', 'invalid dimension')\n dimension = options.dimension | 0\n }\n\n if ('length' in options) {\n check$1.nni(byteLength, 'buffer length must be a nonnegative integer')\n byteLength = options.length | 0\n }\n }\n\n buffer.bind()\n if (!data) {\n // #475\n if (byteLength) gl.bufferData(buffer.type, byteLength, usage)\n buffer.dtype = dtype || GL_UNSIGNED_BYTE$3\n buffer.usage = usage\n buffer.dimension = dimension\n buffer.byteLength = byteLength\n } else {\n initBufferFromData(buffer, data, usage, dtype, dimension, persistent)\n }\n\n if (config.profile) {\n buffer.stats.size = buffer.byteLength * DTYPES_SIZES[buffer.dtype]\n }\n\n return reglBuffer\n }\n\n function setSubData (data, offset) {\n check$1(offset + data.byteLength <= buffer.byteLength,\n 'invalid buffer subdata call, buffer is too small. ' + ' Can\\'t write data of size ' + data.byteLength + ' starting from offset ' + offset + ' to a buffer of size ' + buffer.byteLength)\n\n gl.bufferSubData(buffer.type, offset, data)\n }\n\n function subdata (data, offset_) {\n var offset = (offset_ || 0) | 0\n var shape\n buffer.bind()\n if (isTypedArray(data) || data instanceof ArrayBuffer) {\n setSubData(data, offset)\n } else if (Array.isArray(data)) {\n if (data.length > 0) {\n if (typeof data[0] === 'number') {\n var converted = pool.allocType(buffer.dtype, data.length)\n copyArray(converted, data)\n setSubData(converted, offset)\n pool.freeType(converted)\n } else if (Array.isArray(data[0]) || isTypedArray(data[0])) {\n shape = arrayShape(data)\n var flatData = arrayFlatten(data, shape, buffer.dtype)\n setSubData(flatData, offset)\n pool.freeType(flatData)\n } else {\n check$1.raise('invalid buffer data')\n }\n }\n } else if (isNDArrayLike(data)) {\n shape = data.shape\n var stride = data.stride\n\n var shapeX = 0\n var shapeY = 0\n var strideX = 0\n var strideY = 0\n if (shape.length === 1) {\n shapeX = shape[0]\n shapeY = 1\n strideX = stride[0]\n strideY = 0\n } else if (shape.length === 2) {\n shapeX = shape[0]\n shapeY = shape[1]\n strideX = stride[0]\n strideY = stride[1]\n } else {\n check$1.raise('invalid shape')\n }\n var dtype = Array.isArray(data.data)\n ? buffer.dtype\n : typedArrayCode(data.data)\n\n var transposeData = pool.allocType(dtype, shapeX * shapeY)\n transpose(transposeData,\n data.data,\n shapeX, shapeY,\n strideX, strideY,\n data.offset)\n setSubData(transposeData, offset)\n pool.freeType(transposeData)\n } else {\n check$1.raise('invalid data for buffer subdata')\n }\n return reglBuffer\n }\n\n if (!deferInit) {\n reglBuffer(options)\n }\n\n reglBuffer._reglType = 'buffer'\n reglBuffer._buffer = buffer\n reglBuffer.subdata = subdata\n if (config.profile) {\n reglBuffer.stats = buffer.stats\n }\n reglBuffer.destroy = function () { destroy(buffer) }\n\n return reglBuffer\n }\n\n function restoreBuffers () {\n values(bufferSet).forEach(function (buffer) {\n buffer.buffer = gl.createBuffer()\n gl.bindBuffer(buffer.type, buffer.buffer)\n gl.bufferData(\n buffer.type, buffer.persistentData || buffer.byteLength, buffer.usage)\n })\n }\n\n if (config.profile) {\n stats.getTotalBufferSize = function () {\n var total = 0\n // TODO: Right now, the streams are not part of the total count.\n Object.keys(bufferSet).forEach(function (key) {\n total += bufferSet[key].stats.size\n })\n return total\n }\n }\n\n return {\n create: createBuffer,\n\n createStream: createStream,\n destroyStream: destroyStream,\n\n clear: function () {\n values(bufferSet).forEach(destroy)\n streamPool.forEach(destroy)\n },\n\n getBuffer: function (wrapper) {\n if (wrapper && wrapper._buffer instanceof REGLBuffer) {\n return wrapper._buffer\n }\n return null\n },\n\n restore: restoreBuffers,\n\n _initBuffer: initBufferFromData\n }\n}\n\nvar points = 0;\nvar point = 0;\nvar lines = 1;\nvar line = 1;\nvar triangles = 4;\nvar triangle = 4;\nvar primTypes = {\n\tpoints: points,\n\tpoint: point,\n\tlines: lines,\n\tline: line,\n\ttriangles: triangles,\n\ttriangle: triangle,\n\t\"line loop\": 2,\n\t\"line strip\": 3,\n\t\"triangle strip\": 5,\n\t\"triangle fan\": 6\n};\n\nvar GL_POINTS = 0\nvar GL_LINES = 1\nvar GL_TRIANGLES = 4\n\nvar GL_BYTE$2 = 5120\nvar GL_UNSIGNED_BYTE$4 = 5121\nvar GL_SHORT$2 = 5122\nvar GL_UNSIGNED_SHORT$2 = 5123\nvar GL_INT$2 = 5124\nvar GL_UNSIGNED_INT$2 = 5125\n\nvar GL_ELEMENT_ARRAY_BUFFER = 34963\n\nvar GL_STREAM_DRAW$1 = 0x88E0\nvar GL_STATIC_DRAW$1 = 0x88E4\n\nfunction wrapElementsState (gl, extensions, bufferState, stats) {\n var elementSet = {}\n var elementCount = 0\n\n var elementTypes = {\n 'uint8': GL_UNSIGNED_BYTE$4,\n 'uint16': GL_UNSIGNED_SHORT$2\n }\n\n if (extensions.oes_element_index_uint) {\n elementTypes.uint32 = GL_UNSIGNED_INT$2\n }\n\n function REGLElementBuffer (buffer) {\n this.id = elementCount++\n elementSet[this.id] = this\n this.buffer = buffer\n this.primType = GL_TRIANGLES\n this.vertCount = 0\n this.type = 0\n }\n\n REGLElementBuffer.prototype.bind = function () {\n this.buffer.bind()\n }\n\n var bufferPool = []\n\n function createElementStream (data) {\n var result = bufferPool.pop()\n if (!result) {\n result = new REGLElementBuffer(bufferState.create(\n null,\n GL_ELEMENT_ARRAY_BUFFER,\n true,\n false)._buffer)\n }\n initElements(result, data, GL_STREAM_DRAW$1, -1, -1, 0, 0)\n return result\n }\n\n function destroyElementStream (elements) {\n bufferPool.push(elements)\n }\n\n function initElements (\n elements,\n data,\n usage,\n prim,\n count,\n byteLength,\n type) {\n elements.buffer.bind()\n var dtype\n if (data) {\n var predictedType = type\n if (!type && (\n !isTypedArray(data) ||\n (isNDArrayLike(data) && !isTypedArray(data.data)))) {\n predictedType = extensions.oes_element_index_uint\n ? GL_UNSIGNED_INT$2\n : GL_UNSIGNED_SHORT$2\n }\n bufferState._initBuffer(\n elements.buffer,\n data,\n usage,\n predictedType,\n 3)\n } else {\n gl.bufferData(GL_ELEMENT_ARRAY_BUFFER, byteLength, usage)\n elements.buffer.dtype = dtype || GL_UNSIGNED_BYTE$4\n elements.buffer.usage = usage\n elements.buffer.dimension = 3\n elements.buffer.byteLength = byteLength\n }\n\n dtype = type\n if (!type) {\n switch (elements.buffer.dtype) {\n case GL_UNSIGNED_BYTE$4:\n case GL_BYTE$2:\n dtype = GL_UNSIGNED_BYTE$4\n break\n\n case GL_UNSIGNED_SHORT$2:\n case GL_SHORT$2:\n dtype = GL_UNSIGNED_SHORT$2\n break\n\n case GL_UNSIGNED_INT$2:\n case GL_INT$2:\n dtype = GL_UNSIGNED_INT$2\n break\n\n default:\n check$1.raise('unsupported type for element array')\n }\n elements.buffer.dtype = dtype\n }\n elements.type = dtype\n\n // Check oes_element_index_uint extension\n check$1(\n dtype !== GL_UNSIGNED_INT$2 ||\n !!extensions.oes_element_index_uint,\n '32 bit element buffers not supported, enable oes_element_index_uint first')\n\n // try to guess default primitive type and arguments\n var vertCount = count\n if (vertCount < 0) {\n vertCount = elements.buffer.byteLength\n if (dtype === GL_UNSIGNED_SHORT$2) {\n vertCount >>= 1\n } else if (dtype === GL_UNSIGNED_INT$2) {\n vertCount >>= 2\n }\n }\n elements.vertCount = vertCount\n\n // try to guess primitive type from cell dimension\n var primType = prim\n if (prim < 0) {\n primType = GL_TRIANGLES\n var dimension = elements.buffer.dimension\n if (dimension === 1) primType = GL_POINTS\n if (dimension === 2) primType = GL_LINES\n if (dimension === 3) primType = GL_TRIANGLES\n }\n elements.primType = primType\n }\n\n function destroyElements (elements) {\n stats.elementsCount--\n\n check$1(elements.buffer !== null, 'must not double destroy elements')\n delete elementSet[elements.id]\n elements.buffer.destroy()\n elements.buffer = null\n }\n\n function createElements (options, persistent) {\n var buffer = bufferState.create(null, GL_ELEMENT_ARRAY_BUFFER, true)\n var elements = new REGLElementBuffer(buffer._buffer)\n stats.elementsCount++\n\n function reglElements (options) {\n if (!options) {\n buffer()\n elements.primType = GL_TRIANGLES\n elements.vertCount = 0\n elements.type = GL_UNSIGNED_BYTE$4\n } else if (typeof options === 'number') {\n buffer(options)\n elements.primType = GL_TRIANGLES\n elements.vertCount = options | 0\n elements.type = GL_UNSIGNED_BYTE$4\n } else {\n var data = null\n var usage = GL_STATIC_DRAW$1\n var primType = -1\n var vertCount = -1\n var byteLength = 0\n var dtype = 0\n if (Array.isArray(options) ||\n isTypedArray(options) ||\n isNDArrayLike(options)) {\n data = options\n } else {\n check$1.type(options, 'object', 'invalid arguments for elements')\n if ('data' in options) {\n data = options.data\n check$1(\n Array.isArray(data) ||\n isTypedArray(data) ||\n isNDArrayLike(data),\n 'invalid data for element buffer')\n }\n if ('usage' in options) {\n check$1.parameter(\n options.usage,\n usageTypes,\n 'invalid element buffer usage')\n usage = usageTypes[options.usage]\n }\n if ('primitive' in options) {\n check$1.parameter(\n options.primitive,\n primTypes,\n 'invalid element buffer primitive')\n primType = primTypes[options.primitive]\n }\n if ('count' in options) {\n check$1(\n typeof options.count === 'number' && options.count >= 0,\n 'invalid vertex count for elements')\n vertCount = options.count | 0\n }\n if ('type' in options) {\n check$1.parameter(\n options.type,\n elementTypes,\n 'invalid buffer type')\n dtype = elementTypes[options.type]\n }\n if ('length' in options) {\n byteLength = options.length | 0\n } else {\n byteLength = vertCount\n if (dtype === GL_UNSIGNED_SHORT$2 || dtype === GL_SHORT$2) {\n byteLength *= 2\n } else if (dtype === GL_UNSIGNED_INT$2 || dtype === GL_INT$2) {\n byteLength *= 4\n }\n }\n }\n initElements(\n elements,\n data,\n usage,\n primType,\n vertCount,\n byteLength,\n dtype)\n }\n\n return reglElements\n }\n\n reglElements(options)\n\n reglElements._reglType = 'elements'\n reglElements._elements = elements\n reglElements.subdata = function (data, offset) {\n buffer.subdata(data, offset)\n return reglElements\n }\n reglElements.destroy = function () {\n destroyElements(elements)\n }\n\n return reglElements\n }\n\n return {\n create: createElements,\n createStream: createElementStream,\n destroyStream: destroyElementStream,\n getElements: function (elements) {\n if (typeof elements === 'function' &&\n elements._elements instanceof REGLElementBuffer) {\n return elements._elements\n }\n return null\n },\n clear: function () {\n values(elementSet).forEach(destroyElements)\n }\n }\n}\n\nvar FLOAT = new Float32Array(1)\nvar INT = new Uint32Array(FLOAT.buffer)\n\nvar GL_UNSIGNED_SHORT$4 = 5123\n\nfunction convertToHalfFloat (array) {\n var ushorts = pool.allocType(GL_UNSIGNED_SHORT$4, array.length)\n\n for (var i = 0; i < array.length; ++i) {\n if (isNaN(array[i])) {\n ushorts[i] = 0xffff\n } else if (array[i] === Infinity) {\n ushorts[i] = 0x7c00\n } else if (array[i] === -Infinity) {\n ushorts[i] = 0xfc00\n } else {\n FLOAT[0] = array[i]\n var x = INT[0]\n\n var sgn = (x >>> 31) << 15\n var exp = ((x << 1) >>> 24) - 127\n var frac = (x >> 13) & ((1 << 10) - 1)\n\n if (exp < -24) {\n // round non-representable denormals to 0\n ushorts[i] = sgn\n } else if (exp < -14) {\n // handle denormals\n var s = -14 - exp\n ushorts[i] = sgn + ((frac + (1 << 10)) >> s)\n } else if (exp > 15) {\n // round overflow to +/- Infinity\n ushorts[i] = sgn + 0x7c00\n } else {\n // otherwise convert directly\n ushorts[i] = sgn + ((exp + 15) << 10) + frac\n }\n }\n }\n\n return ushorts\n}\n\nfunction isArrayLike (s) {\n return Array.isArray(s) || isTypedArray(s)\n}\n\nvar isPow2$1 = function (v) {\n return !(v & (v - 1)) && (!!v)\n}\n\nvar GL_COMPRESSED_TEXTURE_FORMATS = 0x86A3\n\nvar GL_TEXTURE_2D$1 = 0x0DE1\nvar GL_TEXTURE_CUBE_MAP$1 = 0x8513\nvar GL_TEXTURE_CUBE_MAP_POSITIVE_X$1 = 0x8515\n\nvar GL_RGBA$1 = 0x1908\nvar GL_ALPHA = 0x1906\nvar GL_RGB = 0x1907\nvar GL_LUMINANCE = 0x1909\nvar GL_LUMINANCE_ALPHA = 0x190A\n\nvar GL_RGBA4 = 0x8056\nvar GL_RGB5_A1 = 0x8057\nvar GL_RGB565 = 0x8D62\n\nvar GL_UNSIGNED_SHORT_4_4_4_4$1 = 0x8033\nvar GL_UNSIGNED_SHORT_5_5_5_1$1 = 0x8034\nvar GL_UNSIGNED_SHORT_5_6_5$1 = 0x8363\nvar GL_UNSIGNED_INT_24_8_WEBGL$1 = 0x84FA\n\nvar GL_DEPTH_COMPONENT = 0x1902\nvar GL_DEPTH_STENCIL = 0x84F9\n\nvar GL_SRGB_EXT = 0x8C40\nvar GL_SRGB_ALPHA_EXT = 0x8C42\n\nvar GL_HALF_FLOAT_OES$1 = 0x8D61\n\nvar GL_COMPRESSED_RGB_S3TC_DXT1_EXT = 0x83F0\nvar GL_COMPRESSED_RGBA_S3TC_DXT1_EXT = 0x83F1\nvar GL_COMPRESSED_RGBA_S3TC_DXT3_EXT = 0x83F2\nvar GL_COMPRESSED_RGBA_S3TC_DXT5_EXT = 0x83F3\n\nvar GL_COMPRESSED_RGB_ATC_WEBGL = 0x8C92\nvar GL_COMPRESSED_RGBA_ATC_EXPLICIT_ALPHA_WEBGL = 0x8C93\nvar GL_COMPRESSED_RGBA_ATC_INTERPOLATED_ALPHA_WEBGL = 0x87EE\n\nvar GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG = 0x8C00\nvar GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG = 0x8C01\nvar GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG = 0x8C02\nvar GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG = 0x8C03\n\nvar GL_COMPRESSED_RGB_ETC1_WEBGL = 0x8D64\n\nvar GL_UNSIGNED_BYTE$5 = 0x1401\nvar GL_UNSIGNED_SHORT$3 = 0x1403\nvar GL_UNSIGNED_INT$3 = 0x1405\nvar GL_FLOAT$4 = 0x1406\n\nvar GL_TEXTURE_WRAP_S = 0x2802\nvar GL_TEXTURE_WRAP_T = 0x2803\n\nvar GL_REPEAT = 0x2901\nvar GL_CLAMP_TO_EDGE$1 = 0x812F\nvar GL_MIRRORED_REPEAT = 0x8370\n\nvar GL_TEXTURE_MAG_FILTER = 0x2800\nvar GL_TEXTURE_MIN_FILTER = 0x2801\n\nvar GL_NEAREST$1 = 0x2600\nvar GL_LINEAR = 0x2601\nvar GL_NEAREST_MIPMAP_NEAREST$1 = 0x2700\nvar GL_LINEAR_MIPMAP_NEAREST$1 = 0x2701\nvar GL_NEAREST_MIPMAP_LINEAR$1 = 0x2702\nvar GL_LINEAR_MIPMAP_LINEAR$1 = 0x2703\n\nvar GL_GENERATE_MIPMAP_HINT = 0x8192\nvar GL_DONT_CARE = 0x1100\nvar GL_FASTEST = 0x1101\nvar GL_NICEST = 0x1102\n\nvar GL_TEXTURE_MAX_ANISOTROPY_EXT = 0x84FE\n\nvar GL_UNPACK_ALIGNMENT = 0x0CF5\nvar GL_UNPACK_FLIP_Y_WEBGL = 0x9240\nvar GL_UNPACK_PREMULTIPLY_ALPHA_WEBGL = 0x9241\nvar GL_UNPACK_COLORSPACE_CONVERSION_WEBGL = 0x9243\n\nvar GL_BROWSER_DEFAULT_WEBGL = 0x9244\n\nvar GL_TEXTURE0$1 = 0x84C0\n\nvar MIPMAP_FILTERS = [\n GL_NEAREST_MIPMAP_NEAREST$1,\n GL_NEAREST_MIPMAP_LINEAR$1,\n GL_LINEAR_MIPMAP_NEAREST$1,\n GL_LINEAR_MIPMAP_LINEAR$1\n]\n\nvar CHANNELS_FORMAT = [\n 0,\n GL_LUMINANCE,\n GL_LUMINANCE_ALPHA,\n GL_RGB,\n GL_RGBA$1\n]\n\nvar FORMAT_CHANNELS = {}\nFORMAT_CHANNELS[GL_LUMINANCE] =\nFORMAT_CHANNELS[GL_ALPHA] =\nFORMAT_CHANNELS[GL_DEPTH_COMPONENT] = 1\nFORMAT_CHANNELS[GL_DEPTH_STENCIL] =\nFORMAT_CHANNELS[GL_LUMINANCE_ALPHA] = 2\nFORMAT_CHANNELS[GL_RGB] =\nFORMAT_CHANNELS[GL_SRGB_EXT] = 3\nFORMAT_CHANNELS[GL_RGBA$1] =\nFORMAT_CHANNELS[GL_SRGB_ALPHA_EXT] = 4\n\nfunction objectName (str) {\n return '[object ' + str + ']'\n}\n\nvar CANVAS_CLASS = objectName('HTMLCanvasElement')\nvar OFFSCREENCANVAS_CLASS = objectName('OffscreenCanvas')\nvar CONTEXT2D_CLASS = objectName('CanvasRenderingContext2D')\nvar BITMAP_CLASS = objectName('ImageBitmap')\nvar IMAGE_CLASS = objectName('HTMLImageElement')\nvar VIDEO_CLASS = objectName('HTMLVideoElement')\n\nvar PIXEL_CLASSES = Object.keys(arrayTypes).concat([\n CANVAS_CLASS,\n OFFSCREENCANVAS_CLASS,\n CONTEXT2D_CLASS,\n BITMAP_CLASS,\n IMAGE_CLASS,\n VIDEO_CLASS\n])\n\n// for every texture type, store\n// the size in bytes.\nvar TYPE_SIZES = []\nTYPE_SIZES[GL_UNSIGNED_BYTE$5] = 1\nTYPE_SIZES[GL_FLOAT$4] = 4\nTYPE_SIZES[GL_HALF_FLOAT_OES$1] = 2\n\nTYPE_SIZES[GL_UNSIGNED_SHORT$3] = 2\nTYPE_SIZES[GL_UNSIGNED_INT$3] = 4\n\nvar FORMAT_SIZES_SPECIAL = []\nFORMAT_SIZES_SPECIAL[GL_RGBA4] = 2\nFORMAT_SIZES_SPECIAL[GL_RGB5_A1] = 2\nFORMAT_SIZES_SPECIAL[GL_RGB565] = 2\nFORMAT_SIZES_SPECIAL[GL_DEPTH_STENCIL] = 4\n\nFORMAT_SIZES_SPECIAL[GL_COMPRESSED_RGB_S3TC_DXT1_EXT] = 0.5\nFORMAT_SIZES_SPECIAL[GL_COMPRESSED_RGBA_S3TC_DXT1_EXT] = 0.5\nFORMAT_SIZES_SPECIAL[GL_COMPRESSED_RGBA_S3TC_DXT3_EXT] = 1\nFORMAT_SIZES_SPECIAL[GL_COMPRESSED_RGBA_S3TC_DXT5_EXT] = 1\n\nFORMAT_SIZES_SPECIAL[GL_COMPRESSED_RGB_ATC_WEBGL] = 0.5\nFORMAT_SIZES_SPECIAL[GL_COMPRESSED_RGBA_ATC_EXPLICIT_ALPHA_WEBGL] = 1\nFORMAT_SIZES_SPECIAL[GL_COMPRESSED_RGBA_ATC_INTERPOLATED_ALPHA_WEBGL] = 1\n\nFORMAT_SIZES_SPECIAL[GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG] = 0.5\nFORMAT_SIZES_SPECIAL[GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG] = 0.25\nFORMAT_SIZES_SPECIAL[GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG] = 0.5\nFORMAT_SIZES_SPECIAL[GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG] = 0.25\n\nFORMAT_SIZES_SPECIAL[GL_COMPRESSED_RGB_ETC1_WEBGL] = 0.5\n\nfunction isNumericArray (arr) {\n return (\n Array.isArray(arr) &&\n (arr.length === 0 ||\n typeof arr[0] === 'number'))\n}\n\nfunction isRectArray (arr) {\n if (!Array.isArray(arr)) {\n return false\n }\n var width = arr.length\n if (width === 0 || !isArrayLike(arr[0])) {\n return false\n }\n return true\n}\n\nfunction classString (x) {\n return Object.prototype.toString.call(x)\n}\n\nfunction isCanvasElement (object) {\n return classString(object) === CANVAS_CLASS\n}\n\nfunction isOffscreenCanvas (object) {\n return classString(object) === OFFSCREENCANVAS_CLASS\n}\n\nfunction isContext2D (object) {\n return classString(object) === CONTEXT2D_CLASS\n}\n\nfunction isBitmap (object) {\n return classString(object) === BITMAP_CLASS\n}\n\nfunction isImageElement (object) {\n return classString(object) === IMAGE_CLASS\n}\n\nfunction isVideoElement (object) {\n return classString(object) === VIDEO_CLASS\n}\n\nfunction isPixelData (object) {\n if (!object) {\n return false\n }\n var className = classString(object)\n if (PIXEL_CLASSES.indexOf(className) >= 0) {\n return true\n }\n return (\n isNumericArray(object) ||\n isRectArray(object) ||\n isNDArrayLike(object))\n}\n\nfunction typedArrayCode$1 (data) {\n return arrayTypes[Object.prototype.toString.call(data)] | 0\n}\n\nfunction convertData (result, data) {\n var n = data.length\n switch (result.type) {\n case GL_UNSIGNED_BYTE$5:\n case GL_UNSIGNED_SHORT$3:\n case GL_UNSIGNED_INT$3:\n case GL_FLOAT$4:\n var converted = pool.allocType(result.type, n)\n converted.set(data)\n result.data = converted\n break\n\n case GL_HALF_FLOAT_OES$1:\n result.data = convertToHalfFloat(data)\n break\n\n default:\n check$1.raise('unsupported texture type, must specify a typed array')\n }\n}\n\nfunction preConvert (image, n) {\n return pool.allocType(\n image.type === GL_HALF_FLOAT_OES$1\n ? GL_FLOAT$4\n : image.type, n)\n}\n\nfunction postConvert (image, data) {\n if (image.type === GL_HALF_FLOAT_OES$1) {\n image.data = convertToHalfFloat(data)\n pool.freeType(data)\n } else {\n image.data = data\n }\n}\n\nfunction transposeData (image, array, strideX, strideY, strideC, offset) {\n var w = image.width\n var h = image.height\n var c = image.channels\n var n = w * h * c\n var data = preConvert(image, n)\n\n var p = 0\n for (var i = 0; i < h; ++i) {\n for (var j = 0; j < w; ++j) {\n for (var k = 0; k < c; ++k) {\n data[p++] = array[strideX * j + strideY * i + strideC * k + offset]\n }\n }\n }\n\n postConvert(image, data)\n}\n\nfunction getTextureSize (format, type, width, height, isMipmap, isCube) {\n var s\n if (typeof FORMAT_SIZES_SPECIAL[format] !== 'undefined') {\n // we have a special array for dealing with weird color formats such as RGB5A1\n s = FORMAT_SIZES_SPECIAL[format]\n } else {\n s = FORMAT_CHANNELS[format] * TYPE_SIZES[type]\n }\n\n if (isCube) {\n s *= 6\n }\n\n if (isMipmap) {\n // compute the total size of all the mipmaps.\n var total = 0\n\n var w = width\n while (w >= 1) {\n // we can only use mipmaps on a square image,\n // so we can simply use the width and ignore the height:\n total += s * w * w\n w /= 2\n }\n return total\n } else {\n return s * width * height\n }\n}\n\nfunction createTextureSet (\n gl, extensions, limits, reglPoll, contextState, stats, config) {\n // -------------------------------------------------------\n // Initialize constants and parameter tables here\n // -------------------------------------------------------\n var mipmapHint = {\n \"don't care\": GL_DONT_CARE,\n 'dont care': GL_DONT_CARE,\n 'nice': GL_NICEST,\n 'fast': GL_FASTEST\n }\n\n var wrapModes = {\n 'repeat': GL_REPEAT,\n 'clamp': GL_CLAMP_TO_EDGE$1,\n 'mirror': GL_MIRRORED_REPEAT\n }\n\n var magFilters = {\n 'nearest': GL_NEAREST$1,\n 'linear': GL_LINEAR\n }\n\n var minFilters = extend({\n 'mipmap': GL_LINEAR_MIPMAP_LINEAR$1,\n 'nearest mipmap nearest': GL_NEAREST_MIPMAP_NEAREST$1,\n 'linear mipmap nearest': GL_LINEAR_MIPMAP_NEAREST$1,\n 'nearest mipmap linear': GL_NEAREST_MIPMAP_LINEAR$1,\n 'linear mipmap linear': GL_LINEAR_MIPMAP_LINEAR$1\n }, magFilters)\n\n var colorSpace = {\n 'none': 0,\n 'browser': GL_BROWSER_DEFAULT_WEBGL\n }\n\n var textureTypes = {\n 'uint8': GL_UNSIGNED_BYTE$5,\n 'rgba4': GL_UNSIGNED_SHORT_4_4_4_4$1,\n 'rgb565': GL_UNSIGNED_SHORT_5_6_5$1,\n 'rgb5 a1': GL_UNSIGNED_SHORT_5_5_5_1$1\n }\n\n var textureFormats = {\n 'alpha': GL_ALPHA,\n 'luminance': GL_LUMINANCE,\n 'luminance alpha': GL_LUMINANCE_ALPHA,\n 'rgb': GL_RGB,\n 'rgba': GL_RGBA$1,\n 'rgba4': GL_RGBA4,\n 'rgb5 a1': GL_RGB5_A1,\n 'rgb565': GL_RGB565\n }\n\n var compressedTextureFormats = {}\n\n if (extensions.ext_srgb) {\n textureFormats.srgb = GL_SRGB_EXT\n textureFormats.srgba = GL_SRGB_ALPHA_EXT\n }\n\n if (extensions.oes_texture_float) {\n textureTypes.float32 = textureTypes.float = GL_FLOAT$4\n }\n\n if (extensions.oes_texture_half_float) {\n textureTypes['float16'] = textureTypes['half float'] = GL_HALF_FLOAT_OES$1\n }\n\n if (extensions.webgl_depth_texture) {\n extend(textureFormats, {\n 'depth': GL_DEPTH_COMPONENT,\n 'depth stencil': GL_DEPTH_STENCIL\n })\n\n extend(textureTypes, {\n 'uint16': GL_UNSIGNED_SHORT$3,\n 'uint32': GL_UNSIGNED_INT$3,\n 'depth stencil': GL_UNSIGNED_INT_24_8_WEBGL$1\n })\n }\n\n if (extensions.webgl_compressed_texture_s3tc) {\n extend(compressedTextureFormats, {\n 'rgb s3tc dxt1': GL_COMPRESSED_RGB_S3TC_DXT1_EXT,\n 'rgba s3tc dxt1': GL_COMPRESSED_RGBA_S3TC_DXT1_EXT,\n 'rgba s3tc dxt3': GL_COMPRESSED_RGBA_S3TC_DXT3_EXT,\n 'rgba s3tc dxt5': GL_COMPRESSED_RGBA_S3TC_DXT5_EXT\n })\n }\n\n if (extensions.webgl_compressed_texture_atc) {\n extend(compressedTextureFormats, {\n 'rgb atc': GL_COMPRESSED_RGB_ATC_WEBGL,\n 'rgba atc explicit alpha': GL_COMPRESSED_RGBA_ATC_EXPLICIT_ALPHA_WEBGL,\n 'rgba atc interpolated alpha': GL_COMPRESSED_RGBA_ATC_INTERPOLATED_ALPHA_WEBGL\n })\n }\n\n if (extensions.webgl_compressed_texture_pvrtc) {\n extend(compressedTextureFormats, {\n 'rgb pvrtc 4bppv1': GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG,\n 'rgb pvrtc 2bppv1': GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG,\n 'rgba pvrtc 4bppv1': GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG,\n 'rgba pvrtc 2bppv1': GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG\n })\n }\n\n if (extensions.webgl_compressed_texture_etc1) {\n compressedTextureFormats['rgb etc1'] = GL_COMPRESSED_RGB_ETC1_WEBGL\n }\n\n // Copy over all texture formats\n var supportedCompressedFormats = Array.prototype.slice.call(\n gl.getParameter(GL_COMPRESSED_TEXTURE_FORMATS))\n Object.keys(compressedTextureFormats).forEach(function (name) {\n var format = compressedTextureFormats[name]\n if (supportedCompressedFormats.indexOf(format) >= 0) {\n textureFormats[name] = format\n }\n })\n\n var supportedFormats = Object.keys(textureFormats)\n limits.textureFormats = supportedFormats\n\n // associate with every format string its\n // corresponding GL-value.\n var textureFormatsInvert = []\n Object.keys(textureFormats).forEach(function (key) {\n var val = textureFormats[key]\n textureFormatsInvert[val] = key\n })\n\n // associate with every type string its\n // corresponding GL-value.\n var textureTypesInvert = []\n Object.keys(textureTypes).forEach(function (key) {\n var val = textureTypes[key]\n textureTypesInvert[val] = key\n })\n\n var magFiltersInvert = []\n Object.keys(magFilters).forEach(function (key) {\n var val = magFilters[key]\n magFiltersInvert[val] = key\n })\n\n var minFiltersInvert = []\n Object.keys(minFilters).forEach(function (key) {\n var val = minFilters[key]\n minFiltersInvert[val] = key\n })\n\n var wrapModesInvert = []\n Object.keys(wrapModes).forEach(function (key) {\n var val = wrapModes[key]\n wrapModesInvert[val] = key\n })\n\n // colorFormats[] gives the format (channels) associated to an\n // internalformat\n var colorFormats = supportedFormats.reduce(function (color, key) {\n var glenum = textureFormats[key]\n if (glenum === GL_LUMINANCE ||\n glenum === GL_ALPHA ||\n glenum === GL_LUMINANCE ||\n glenum === GL_LUMINANCE_ALPHA ||\n glenum === GL_DEPTH_COMPONENT ||\n glenum === GL_DEPTH_STENCIL ||\n (extensions.ext_srgb &&\n (glenum === GL_SRGB_EXT ||\n glenum === GL_SRGB_ALPHA_EXT))) {\n color[glenum] = glenum\n } else if (glenum === GL_RGB5_A1 || key.indexOf('rgba') >= 0) {\n color[glenum] = GL_RGBA$1\n } else {\n color[glenum] = GL_RGB\n }\n return color\n }, {})\n\n function TexFlags () {\n // format info\n this.internalformat = GL_RGBA$1\n this.format = GL_RGBA$1\n this.type = GL_UNSIGNED_BYTE$5\n this.compressed = false\n\n // pixel storage\n this.premultiplyAlpha = false\n this.flipY = false\n this.unpackAlignment = 1\n this.colorSpace = GL_BROWSER_DEFAULT_WEBGL\n\n // shape info\n this.width = 0\n this.height = 0\n this.channels = 0\n }\n\n function copyFlags (result, other) {\n result.internalformat = other.internalformat\n result.format = other.format\n result.type = other.type\n result.compressed = other.compressed\n\n result.premultiplyAlpha = other.premultiplyAlpha\n result.flipY = other.flipY\n result.unpackAlignment = other.unpackAlignment\n result.colorSpace = other.colorSpace\n\n result.width = other.width\n result.height = other.height\n result.channels = other.channels\n }\n\n function parseFlags (flags, options) {\n if (typeof options !== 'object' || !options) {\n return\n }\n\n if ('premultiplyAlpha' in options) {\n check$1.type(options.premultiplyAlpha, 'boolean',\n 'invalid premultiplyAlpha')\n flags.premultiplyAlpha = options.premultiplyAlpha\n }\n\n if ('flipY' in options) {\n check$1.type(options.flipY, 'boolean',\n 'invalid texture flip')\n flags.flipY = options.flipY\n }\n\n if ('alignment' in options) {\n check$1.oneOf(options.alignment, [1, 2, 4, 8],\n 'invalid texture unpack alignment')\n flags.unpackAlignment = options.alignment\n }\n\n if ('colorSpace' in options) {\n check$1.parameter(options.colorSpace, colorSpace,\n 'invalid colorSpace')\n flags.colorSpace = colorSpace[options.colorSpace]\n }\n\n if ('type' in options) {\n var type = options.type\n check$1(extensions.oes_texture_float ||\n !(type === 'float' || type === 'float32'),\n 'you must enable the OES_texture_float extension in order to use floating point textures.')\n check$1(extensions.oes_texture_half_float ||\n !(type === 'half float' || type === 'float16'),\n 'you must enable the OES_texture_half_float extension in order to use 16-bit floating point textures.')\n check$1(extensions.webgl_depth_texture ||\n !(type === 'uint16' || type === 'uint32' || type === 'depth stencil'),\n 'you must enable the WEBGL_depth_texture extension in order to use depth/stencil textures.')\n check$1.parameter(type, textureTypes,\n 'invalid texture type')\n flags.type = textureTypes[type]\n }\n\n var w = flags.width\n var h = flags.height\n var c = flags.channels\n var hasChannels = false\n if ('shape' in options) {\n check$1(Array.isArray(options.shape) && options.shape.length >= 2,\n 'shape must be an array')\n w = options.shape[0]\n h = options.shape[1]\n if (options.shape.length === 3) {\n c = options.shape[2]\n check$1(c > 0 && c <= 4, 'invalid number of channels')\n hasChannels = true\n }\n check$1(w >= 0 && w <= limits.maxTextureSize, 'invalid width')\n check$1(h >= 0 && h <= limits.maxTextureSize, 'invalid height')\n } else {\n if ('radius' in options) {\n w = h = options.radius\n check$1(w >= 0 && w <= limits.maxTextureSize, 'invalid radius')\n }\n if ('width' in options) {\n w = options.width\n check$1(w >= 0 && w <= limits.maxTextureSize, 'invalid width')\n }\n if ('height' in options) {\n h = options.height\n check$1(h >= 0 && h <= limits.maxTextureSize, 'invalid height')\n }\n if ('channels' in options) {\n c = options.channels\n check$1(c > 0 && c <= 4, 'invalid number of channels')\n hasChannels = true\n }\n }\n flags.width = w | 0\n flags.height = h | 0\n flags.channels = c | 0\n\n var hasFormat = false\n if ('format' in options) {\n var formatStr = options.format\n check$1(extensions.webgl_depth_texture ||\n !(formatStr === 'depth' || formatStr === 'depth stencil'),\n 'you must enable the WEBGL_depth_texture extension in order to use depth/stencil textures.')\n check$1.parameter(formatStr, textureFormats,\n 'invalid texture format')\n var internalformat = flags.internalformat = textureFormats[formatStr]\n flags.format = colorFormats[internalformat]\n if (formatStr in textureTypes) {\n if (!('type' in options)) {\n flags.type = textureTypes[formatStr]\n }\n }\n if (formatStr in compressedTextureFormats) {\n flags.compressed = true\n }\n hasFormat = true\n }\n\n // Reconcile channels and format\n if (!hasChannels && hasFormat) {\n flags.channels = FORMAT_CHANNELS[flags.format]\n } else if (hasChannels && !hasFormat) {\n if (flags.channels !== CHANNELS_FORMAT[flags.format]) {\n flags.format = flags.internalformat = CHANNELS_FORMAT[flags.channels]\n }\n } else if (hasFormat && hasChannels) {\n check$1(\n flags.channels === FORMAT_CHANNELS[flags.format],\n 'number of channels inconsistent with specified format')\n }\n }\n\n function setFlags (flags) {\n gl.pixelStorei(GL_UNPACK_FLIP_Y_WEBGL, flags.flipY)\n gl.pixelStorei(GL_UNPACK_PREMULTIPLY_ALPHA_WEBGL, flags.premultiplyAlpha)\n gl.pixelStorei(GL_UNPACK_COLORSPACE_CONVERSION_WEBGL, flags.colorSpace)\n gl.pixelStorei(GL_UNPACK_ALIGNMENT, flags.unpackAlignment)\n }\n\n // -------------------------------------------------------\n // Tex image data\n // -------------------------------------------------------\n function TexImage () {\n TexFlags.call(this)\n\n this.xOffset = 0\n this.yOffset = 0\n\n // data\n this.data = null\n this.needsFree = false\n\n // html element\n this.element = null\n\n // copyTexImage info\n this.needsCopy = false\n }\n\n function parseImage (image, options) {\n var data = null\n if (isPixelData(options)) {\n data = options\n } else if (options) {\n check$1.type(options, 'object', 'invalid pixel data type')\n parseFlags(image, options)\n if ('x' in options) {\n image.xOffset = options.x | 0\n }\n if ('y' in options) {\n image.yOffset = options.y | 0\n }\n if (isPixelData(options.data)) {\n data = options.data\n }\n }\n\n check$1(\n !image.compressed ||\n data instanceof Uint8Array,\n 'compressed texture data must be stored in a uint8array')\n\n if (options.copy) {\n check$1(!data, 'can not specify copy and data field for the same texture')\n var viewW = contextState.viewportWidth\n var viewH = contextState.viewportHeight\n image.width = image.width || (viewW - image.xOffset)\n image.height = image.height || (viewH - image.yOffset)\n image.needsCopy = true\n check$1(image.xOffset >= 0 && image.xOffset < viewW &&\n image.yOffset >= 0 && image.yOffset < viewH &&\n image.width > 0 && image.width <= viewW &&\n image.height > 0 && image.height <= viewH,\n 'copy texture read out of bounds')\n } else if (!data) {\n image.width = image.width || 1\n image.height = image.height || 1\n image.channels = image.channels || 4\n } else if (isTypedArray(data)) {\n image.channels = image.channels || 4\n image.data = data\n if (!('type' in options) && image.type === GL_UNSIGNED_BYTE$5) {\n image.type = typedArrayCode$1(data)\n }\n } else if (isNumericArray(data)) {\n image.channels = image.channels || 4\n convertData(image, data)\n image.alignment = 1\n image.needsFree = true\n } else if (isNDArrayLike(data)) {\n var array = data.data\n if (!Array.isArray(array) && image.type === GL_UNSIGNED_BYTE$5) {\n image.type = typedArrayCode$1(array)\n }\n var shape = data.shape\n var stride = data.stride\n var shapeX, shapeY, shapeC, strideX, strideY, strideC\n if (shape.length === 3) {\n shapeC = shape[2]\n strideC = stride[2]\n } else {\n check$1(shape.length === 2, 'invalid ndarray pixel data, must be 2 or 3D')\n shapeC = 1\n strideC = 1\n }\n shapeX = shape[0]\n shapeY = shape[1]\n strideX = stride[0]\n strideY = stride[1]\n image.alignment = 1\n image.width = shapeX\n image.height = shapeY\n image.channels = shapeC\n image.format = image.internalformat = CHANNELS_FORMAT[shapeC]\n image.needsFree = true\n transposeData(image, array, strideX, strideY, strideC, data.offset)\n } else if (isCanvasElement(data) || isOffscreenCanvas(data) || isContext2D(data)) {\n if (isCanvasElement(data) || isOffscreenCanvas(data)) {\n image.element = data\n } else {\n image.element = data.canvas\n }\n image.width = image.element.width\n image.height = image.element.height\n image.channels = 4\n } else if (isBitmap(data)) {\n image.element = data\n image.width = data.width\n image.height = data.height\n image.channels = 4\n } else if (isImageElement(data)) {\n image.element = data\n image.width = data.naturalWidth\n image.height = data.naturalHeight\n image.channels = 4\n } else if (isVideoElement(data)) {\n image.element = data\n image.width = data.videoWidth\n image.height = data.videoHeight\n image.channels = 4\n } else if (isRectArray(data)) {\n var w = image.width || data[0].length\n var h = image.height || data.length\n var c = image.channels\n if (isArrayLike(data[0][0])) {\n c = c || data[0][0].length\n } else {\n c = c || 1\n }\n var arrayShape = flattenUtils.shape(data)\n var n = 1\n for (var dd = 0; dd < arrayShape.length; ++dd) {\n n *= arrayShape[dd]\n }\n var allocData = preConvert(image, n)\n flattenUtils.flatten(data, arrayShape, '', allocData)\n postConvert(image, allocData)\n image.alignment = 1\n image.width = w\n image.height = h\n image.channels = c\n image.format = image.internalformat = CHANNELS_FORMAT[c]\n image.needsFree = true\n }\n\n if (image.type === GL_FLOAT$4) {\n check$1(limits.extensions.indexOf('oes_texture_float') >= 0,\n 'oes_texture_float extension not enabled')\n } else if (image.type === GL_HALF_FLOAT_OES$1) {\n check$1(limits.extensions.indexOf('oes_texture_half_float') >= 0,\n 'oes_texture_half_float extension not enabled')\n }\n\n // do compressed texture validation here.\n }\n\n function setImage (info, target, miplevel) {\n var element = info.element\n var data = info.data\n var internalformat = info.internalformat\n var format = info.format\n var type = info.type\n var width = info.width\n var height = info.height\n\n setFlags(info)\n\n if (element) {\n gl.texImage2D(target, miplevel, format, format, type, element)\n } else if (info.compressed) {\n gl.compressedTexImage2D(target, miplevel, internalformat, width, height, 0, data)\n } else if (info.needsCopy) {\n reglPoll()\n gl.copyTexImage2D(\n target, miplevel, format, info.xOffset, info.yOffset, width, height, 0)\n } else {\n gl.texImage2D(target, miplevel, format, width, height, 0, format, type, data || null)\n }\n }\n\n function setSubImage (info, target, x, y, miplevel) {\n var element = info.element\n var data = info.data\n var internalformat = info.internalformat\n var format = info.format\n var type = info.type\n var width = info.width\n var height = info.height\n\n setFlags(info)\n\n if (element) {\n gl.texSubImage2D(\n target, miplevel, x, y, format, type, element)\n } else if (info.compressed) {\n gl.compressedTexSubImage2D(\n target, miplevel, x, y, internalformat, width, height, data)\n } else if (info.needsCopy) {\n reglPoll()\n gl.copyTexSubImage2D(\n target, miplevel, x, y, info.xOffset, info.yOffset, width, height)\n } else {\n gl.texSubImage2D(\n target, miplevel, x, y, width, height, format, type, data)\n }\n }\n\n // texImage pool\n var imagePool = []\n\n function allocImage () {\n return imagePool.pop() || new TexImage()\n }\n\n function freeImage (image) {\n if (image.needsFree) {\n pool.freeType(image.data)\n }\n TexImage.call(image)\n imagePool.push(image)\n }\n\n // -------------------------------------------------------\n // Mip map\n // -------------------------------------------------------\n function MipMap () {\n TexFlags.call(this)\n\n this.genMipmaps = false\n this.mipmapHint = GL_DONT_CARE\n this.mipmask = 0\n this.images = Array(16)\n }\n\n function parseMipMapFromShape (mipmap, width, height) {\n var img = mipmap.images[0] = allocImage()\n mipmap.mipmask = 1\n img.width = mipmap.width = width\n img.height = mipmap.height = height\n img.channels = mipmap.channels = 4\n }\n\n function parseMipMapFromObject (mipmap, options) {\n var imgData = null\n if (isPixelData(options)) {\n imgData = mipmap.images[0] = allocImage()\n copyFlags(imgData, mipmap)\n parseImage(imgData, options)\n mipmap.mipmask = 1\n } else {\n parseFlags(mipmap, options)\n if (Array.isArray(options.mipmap)) {\n var mipData = options.mipmap\n for (var i = 0; i < mipData.length; ++i) {\n imgData = mipmap.images[i] = allocImage()\n copyFlags(imgData, mipmap)\n imgData.width >>= i\n imgData.height >>= i\n parseImage(imgData, mipData[i])\n mipmap.mipmask |= (1 << i)\n }\n } else {\n imgData = mipmap.images[0] = allocImage()\n copyFlags(imgData, mipmap)\n parseImage(imgData, options)\n mipmap.mipmask = 1\n }\n }\n copyFlags(mipmap, mipmap.images[0])\n\n // For textures of the compressed format WEBGL_compressed_texture_s3tc\n // we must have that\n //\n // \"When level equals zero width and height must be a multiple of 4.\n // When level is greater than 0 width and height must be 0, 1, 2 or a multiple of 4. \"\n //\n // but we do not yet support having multiple mipmap levels for compressed textures,\n // so we only test for level zero.\n\n if (\n mipmap.compressed &&\n (\n mipmap.internalformat === GL_COMPRESSED_RGB_S3TC_DXT1_EXT ||\n mipmap.internalformat === GL_COMPRESSED_RGBA_S3TC_DXT1_EXT ||\n mipmap.internalformat === GL_COMPRESSED_RGBA_S3TC_DXT3_EXT ||\n mipmap.internalformat === GL_COMPRESSED_RGBA_S3TC_DXT5_EXT\n )\n ) {\n check$1(mipmap.width % 4 === 0 && mipmap.height % 4 === 0,\n 'for compressed texture formats, mipmap level 0 must have width and height that are a multiple of 4')\n }\n }\n\n function setMipMap (mipmap, target) {\n var images = mipmap.images\n for (var i = 0; i < images.length; ++i) {\n if (!images[i]) {\n return\n }\n setImage(images[i], target, i)\n }\n }\n\n var mipPool = []\n\n function allocMipMap () {\n var result = mipPool.pop() || new MipMap()\n TexFlags.call(result)\n result.mipmask = 0\n for (var i = 0; i < 16; ++i) {\n result.images[i] = null\n }\n return result\n }\n\n function freeMipMap (mipmap) {\n var images = mipmap.images\n for (var i = 0; i < images.length; ++i) {\n if (images[i]) {\n freeImage(images[i])\n }\n images[i] = null\n }\n mipPool.push(mipmap)\n }\n\n // -------------------------------------------------------\n // Tex info\n // -------------------------------------------------------\n function TexInfo () {\n this.minFilter = GL_NEAREST$1\n this.magFilter = GL_NEAREST$1\n\n this.wrapS = GL_CLAMP_TO_EDGE$1\n this.wrapT = GL_CLAMP_TO_EDGE$1\n\n this.anisotropic = 1\n\n this.genMipmaps = false\n this.mipmapHint = GL_DONT_CARE\n }\n\n function parseTexInfo (info, options) {\n if ('min' in options) {\n var minFilter = options.min\n check$1.parameter(minFilter, minFilters)\n info.minFilter = minFilters[minFilter]\n if (MIPMAP_FILTERS.indexOf(info.minFilter) >= 0 && !('faces' in options)) {\n info.genMipmaps = true\n }\n }\n\n if ('mag' in options) {\n var magFilter = options.mag\n check$1.parameter(magFilter, magFilters)\n info.magFilter = magFilters[magFilter]\n }\n\n var wrapS = info.wrapS\n var wrapT = info.wrapT\n if ('wrap' in options) {\n var wrap = options.wrap\n if (typeof wrap === 'string') {\n check$1.parameter(wrap, wrapModes)\n wrapS = wrapT = wrapModes[wrap]\n } else if (Array.isArray(wrap)) {\n check$1.parameter(wrap[0], wrapModes)\n check$1.parameter(wrap[1], wrapModes)\n wrapS = wrapModes[wrap[0]]\n wrapT = wrapModes[wrap[1]]\n }\n } else {\n if ('wrapS' in options) {\n var optWrapS = options.wrapS\n check$1.parameter(optWrapS, wrapModes)\n wrapS = wrapModes[optWrapS]\n }\n if ('wrapT' in options) {\n var optWrapT = options.wrapT\n check$1.parameter(optWrapT, wrapModes)\n wrapT = wrapModes[optWrapT]\n }\n }\n info.wrapS = wrapS\n info.wrapT = wrapT\n\n if ('anisotropic' in options) {\n var anisotropic = options.anisotropic\n check$1(typeof anisotropic === 'number' &&\n anisotropic >= 1 && anisotropic <= limits.maxAnisotropic,\n 'aniso samples must be between 1 and ')\n info.anisotropic = options.anisotropic\n }\n\n if ('mipmap' in options) {\n var hasMipMap = false\n switch (typeof options.mipmap) {\n case 'string':\n check$1.parameter(options.mipmap, mipmapHint,\n 'invalid mipmap hint')\n info.mipmapHint = mipmapHint[options.mipmap]\n info.genMipmaps = true\n hasMipMap = true\n break\n\n case 'boolean':\n hasMipMap = info.genMipmaps = options.mipmap\n break\n\n case 'object':\n check$1(Array.isArray(options.mipmap), 'invalid mipmap type')\n info.genMipmaps = false\n hasMipMap = true\n break\n\n default:\n check$1.raise('invalid mipmap type')\n }\n if (hasMipMap && !('min' in options)) {\n info.minFilter = GL_NEAREST_MIPMAP_NEAREST$1\n }\n }\n }\n\n function setTexInfo (info, target) {\n gl.texParameteri(target, GL_TEXTURE_MIN_FILTER, info.minFilter)\n gl.texParameteri(target, GL_TEXTURE_MAG_FILTER, info.magFilter)\n gl.texParameteri(target, GL_TEXTURE_WRAP_S, info.wrapS)\n gl.texParameteri(target, GL_TEXTURE_WRAP_T, info.wrapT)\n if (extensions.ext_texture_filter_anisotropic) {\n gl.texParameteri(target, GL_TEXTURE_MAX_ANISOTROPY_EXT, info.anisotropic)\n }\n if (info.genMipmaps) {\n gl.hint(GL_GENERATE_MIPMAP_HINT, info.mipmapHint)\n gl.generateMipmap(target)\n }\n }\n\n // -------------------------------------------------------\n // Full texture object\n // -------------------------------------------------------\n var textureCount = 0\n var textureSet = {}\n var numTexUnits = limits.maxTextureUnits\n var textureUnits = Array(numTexUnits).map(function () {\n return null\n })\n\n function REGLTexture (target) {\n TexFlags.call(this)\n this.mipmask = 0\n this.internalformat = GL_RGBA$1\n\n this.id = textureCount++\n\n this.refCount = 1\n\n this.target = target\n this.texture = gl.createTexture()\n\n this.unit = -1\n this.bindCount = 0\n\n this.texInfo = new TexInfo()\n\n if (config.profile) {\n this.stats = { size: 0 }\n }\n }\n\n function tempBind (texture) {\n gl.activeTexture(GL_TEXTURE0$1)\n gl.bindTexture(texture.target, texture.texture)\n }\n\n function tempRestore () {\n var prev = textureUnits[0]\n if (prev) {\n gl.bindTexture(prev.target, prev.texture)\n } else {\n gl.bindTexture(GL_TEXTURE_2D$1, null)\n }\n }\n\n function destroy (texture) {\n var handle = texture.texture\n check$1(handle, 'must not double destroy texture')\n var unit = texture.unit\n var target = texture.target\n if (unit >= 0) {\n gl.activeTexture(GL_TEXTURE0$1 + unit)\n gl.bindTexture(target, null)\n textureUnits[unit] = null\n }\n gl.deleteTexture(handle)\n texture.texture = null\n texture.params = null\n texture.pixels = null\n texture.refCount = 0\n delete textureSet[texture.id]\n stats.textureCount--\n }\n\n extend(REGLTexture.prototype, {\n bind: function () {\n var texture = this\n texture.bindCount += 1\n var unit = texture.unit\n if (unit < 0) {\n for (var i = 0; i < numTexUnits; ++i) {\n var other = textureUnits[i]\n if (other) {\n if (other.bindCount > 0) {\n continue\n }\n other.unit = -1\n }\n textureUnits[i] = texture\n unit = i\n break\n }\n if (unit >= numTexUnits) {\n check$1.raise('insufficient number of texture units')\n }\n if (config.profile && stats.maxTextureUnits < (unit + 1)) {\n stats.maxTextureUnits = unit + 1 // +1, since the units are zero-based\n }\n texture.unit = unit\n gl.activeTexture(GL_TEXTURE0$1 + unit)\n gl.bindTexture(texture.target, texture.texture)\n }\n return unit\n },\n\n unbind: function () {\n this.bindCount -= 1\n },\n\n decRef: function () {\n if (--this.refCount <= 0) {\n destroy(this)\n }\n }\n })\n\n function createTexture2D (a, b) {\n var texture = new REGLTexture(GL_TEXTURE_2D$1)\n textureSet[texture.id] = texture\n stats.textureCount++\n\n function reglTexture2D (a, b) {\n var texInfo = texture.texInfo\n TexInfo.call(texInfo)\n var mipData = allocMipMap()\n\n if (typeof a === 'number') {\n if (typeof b === 'number') {\n parseMipMapFromShape(mipData, a | 0, b | 0)\n } else {\n parseMipMapFromShape(mipData, a | 0, a | 0)\n }\n } else if (a) {\n check$1.type(a, 'object', 'invalid arguments to regl.texture')\n parseTexInfo(texInfo, a)\n parseMipMapFromObject(mipData, a)\n } else {\n // empty textures get assigned a default shape of 1x1\n parseMipMapFromShape(mipData, 1, 1)\n }\n\n if (texInfo.genMipmaps) {\n mipData.mipmask = (mipData.width << 1) - 1\n }\n texture.mipmask = mipData.mipmask\n\n copyFlags(texture, mipData)\n\n check$1.texture2D(texInfo, mipData, limits)\n texture.internalformat = mipData.internalformat\n\n reglTexture2D.width = mipData.width\n reglTexture2D.height = mipData.height\n\n tempBind(texture)\n setMipMap(mipData, GL_TEXTURE_2D$1)\n setTexInfo(texInfo, GL_TEXTURE_2D$1)\n tempRestore()\n\n freeMipMap(mipData)\n\n if (config.profile) {\n texture.stats.size = getTextureSize(\n texture.internalformat,\n texture.type,\n mipData.width,\n mipData.height,\n texInfo.genMipmaps,\n false)\n }\n reglTexture2D.format = textureFormatsInvert[texture.internalformat]\n reglTexture2D.type = textureTypesInvert[texture.type]\n\n reglTexture2D.mag = magFiltersInvert[texInfo.magFilter]\n reglTexture2D.min = minFiltersInvert[texInfo.minFilter]\n\n reglTexture2D.wrapS = wrapModesInvert[texInfo.wrapS]\n reglTexture2D.wrapT = wrapModesInvert[texInfo.wrapT]\n\n return reglTexture2D\n }\n\n function subimage (image, x_, y_, level_) {\n check$1(!!image, 'must specify image data')\n\n var x = x_ | 0\n var y = y_ | 0\n var level = level_ | 0\n\n var imageData = allocImage()\n copyFlags(imageData, texture)\n imageData.width = 0\n imageData.height = 0\n parseImage(imageData, image)\n imageData.width = imageData.width || ((texture.width >> level) - x)\n imageData.height = imageData.height || ((texture.height >> level) - y)\n\n check$1(\n texture.type === imageData.type &&\n texture.format === imageData.format &&\n texture.internalformat === imageData.internalformat,\n 'incompatible format for texture.subimage')\n check$1(\n x >= 0 && y >= 0 &&\n x + imageData.width <= texture.width &&\n y + imageData.height <= texture.height,\n 'texture.subimage write out of bounds')\n check$1(\n texture.mipmask & (1 << level),\n 'missing mipmap data')\n check$1(\n imageData.data || imageData.element || imageData.needsCopy,\n 'missing image data')\n\n tempBind(texture)\n setSubImage(imageData, GL_TEXTURE_2D$1, x, y, level)\n tempRestore()\n\n freeImage(imageData)\n\n return reglTexture2D\n }\n\n function resize (w_, h_) {\n var w = w_ | 0\n var h = (h_ | 0) || w\n if (w === texture.width && h === texture.height) {\n return reglTexture2D\n }\n\n reglTexture2D.width = texture.width = w\n reglTexture2D.height = texture.height = h\n\n tempBind(texture)\n\n for (var i = 0; texture.mipmask >> i; ++i) {\n var _w = w >> i\n var _h = h >> i\n if (!_w || !_h) break\n gl.texImage2D(\n GL_TEXTURE_2D$1,\n i,\n texture.format,\n _w,\n _h,\n 0,\n texture.format,\n texture.type,\n null)\n }\n tempRestore()\n\n // also, recompute the texture size.\n if (config.profile) {\n texture.stats.size = getTextureSize(\n texture.internalformat,\n texture.type,\n w,\n h,\n false,\n false)\n }\n\n return reglTexture2D\n }\n\n reglTexture2D(a, b)\n\n reglTexture2D.subimage = subimage\n reglTexture2D.resize = resize\n reglTexture2D._reglType = 'texture2d'\n reglTexture2D._texture = texture\n if (config.profile) {\n reglTexture2D.stats = texture.stats\n }\n reglTexture2D.destroy = function () {\n texture.decRef()\n }\n\n return reglTexture2D\n }\n\n function createTextureCube (a0, a1, a2, a3, a4, a5) {\n var texture = new REGLTexture(GL_TEXTURE_CUBE_MAP$1)\n textureSet[texture.id] = texture\n stats.cubeCount++\n\n var faces = new Array(6)\n\n function reglTextureCube (a0, a1, a2, a3, a4, a5) {\n var i\n var texInfo = texture.texInfo\n TexInfo.call(texInfo)\n for (i = 0; i < 6; ++i) {\n faces[i] = allocMipMap()\n }\n\n if (typeof a0 === 'number' || !a0) {\n var s = (a0 | 0) || 1\n for (i = 0; i < 6; ++i) {\n parseMipMapFromShape(faces[i], s, s)\n }\n } else if (typeof a0 === 'object') {\n if (a1) {\n parseMipMapFromObject(faces[0], a0)\n parseMipMapFromObject(faces[1], a1)\n parseMipMapFromObject(faces[2], a2)\n parseMipMapFromObject(faces[3], a3)\n parseMipMapFromObject(faces[4], a4)\n parseMipMapFromObject(faces[5], a5)\n } else {\n parseTexInfo(texInfo, a0)\n parseFlags(texture, a0)\n if ('faces' in a0) {\n var faceInput = a0.faces\n check$1(Array.isArray(faceInput) && faceInput.length === 6,\n 'cube faces must be a length 6 array')\n for (i = 0; i < 6; ++i) {\n check$1(typeof faceInput[i] === 'object' && !!faceInput[i],\n 'invalid input for cube map face')\n copyFlags(faces[i], texture)\n parseMipMapFromObject(faces[i], faceInput[i])\n }\n } else {\n for (i = 0; i < 6; ++i) {\n parseMipMapFromObject(faces[i], a0)\n }\n }\n }\n } else {\n check$1.raise('invalid arguments to cube map')\n }\n\n copyFlags(texture, faces[0])\n\n if (!limits.npotTextureCube) {\n check$1(isPow2$1(texture.width) && isPow2$1(texture.height), 'your browser does not support non power or two texture dimensions')\n }\n\n if (texInfo.genMipmaps) {\n texture.mipmask = (faces[0].width << 1) - 1\n } else {\n texture.mipmask = faces[0].mipmask\n }\n\n check$1.textureCube(texture, texInfo, faces, limits)\n texture.internalformat = faces[0].internalformat\n\n reglTextureCube.width = faces[0].width\n reglTextureCube.height = faces[0].height\n\n tempBind(texture)\n for (i = 0; i < 6; ++i) {\n setMipMap(faces[i], GL_TEXTURE_CUBE_MAP_POSITIVE_X$1 + i)\n }\n setTexInfo(texInfo, GL_TEXTURE_CUBE_MAP$1)\n tempRestore()\n\n if (config.profile) {\n texture.stats.size = getTextureSize(\n texture.internalformat,\n texture.type,\n reglTextureCube.width,\n reglTextureCube.height,\n texInfo.genMipmaps,\n true)\n }\n\n reglTextureCube.format = textureFormatsInvert[texture.internalformat]\n reglTextureCube.type = textureTypesInvert[texture.type]\n\n reglTextureCube.mag = magFiltersInvert[texInfo.magFilter]\n reglTextureCube.min = minFiltersInvert[texInfo.minFilter]\n\n reglTextureCube.wrapS = wrapModesInvert[texInfo.wrapS]\n reglTextureCube.wrapT = wrapModesInvert[texInfo.wrapT]\n\n for (i = 0; i < 6; ++i) {\n freeMipMap(faces[i])\n }\n\n return reglTextureCube\n }\n\n function subimage (face, image, x_, y_, level_) {\n check$1(!!image, 'must specify image data')\n check$1(typeof face === 'number' && face === (face | 0) &&\n face >= 0 && face < 6, 'invalid face')\n\n var x = x_ | 0\n var y = y_ | 0\n var level = level_ | 0\n\n var imageData = allocImage()\n copyFlags(imageData, texture)\n imageData.width = 0\n imageData.height = 0\n parseImage(imageData, image)\n imageData.width = imageData.width || ((texture.width >> level) - x)\n imageData.height = imageData.height || ((texture.height >> level) - y)\n\n check$1(\n texture.type === imageData.type &&\n texture.format === imageData.format &&\n texture.internalformat === imageData.internalformat,\n 'incompatible format for texture.subimage')\n check$1(\n x >= 0 && y >= 0 &&\n x + imageData.width <= texture.width &&\n y + imageData.height <= texture.height,\n 'texture.subimage write out of bounds')\n check$1(\n texture.mipmask & (1 << level),\n 'missing mipmap data')\n check$1(\n imageData.data || imageData.element || imageData.needsCopy,\n 'missing image data')\n\n tempBind(texture)\n setSubImage(imageData, GL_TEXTURE_CUBE_MAP_POSITIVE_X$1 + face, x, y, level)\n tempRestore()\n\n freeImage(imageData)\n\n return reglTextureCube\n }\n\n function resize (radius_) {\n var radius = radius_ | 0\n if (radius === texture.width) {\n return\n }\n\n reglTextureCube.width = texture.width = radius\n reglTextureCube.height = texture.height = radius\n\n tempBind(texture)\n for (var i = 0; i < 6; ++i) {\n for (var j = 0; texture.mipmask >> j; ++j) {\n gl.texImage2D(\n GL_TEXTURE_CUBE_MAP_POSITIVE_X$1 + i,\n j,\n texture.format,\n radius >> j,\n radius >> j,\n 0,\n texture.format,\n texture.type,\n null)\n }\n }\n tempRestore()\n\n if (config.profile) {\n texture.stats.size = getTextureSize(\n texture.internalformat,\n texture.type,\n reglTextureCube.width,\n reglTextureCube.height,\n false,\n true)\n }\n\n return reglTextureCube\n }\n\n reglTextureCube(a0, a1, a2, a3, a4, a5)\n\n reglTextureCube.subimage = subimage\n reglTextureCube.resize = resize\n reglTextureCube._reglType = 'textureCube'\n reglTextureCube._texture = texture\n if (config.profile) {\n reglTextureCube.stats = texture.stats\n }\n reglTextureCube.destroy = function () {\n texture.decRef()\n }\n\n return reglTextureCube\n }\n\n // Called when regl is destroyed\n function destroyTextures () {\n for (var i = 0; i < numTexUnits; ++i) {\n gl.activeTexture(GL_TEXTURE0$1 + i)\n gl.bindTexture(GL_TEXTURE_2D$1, null)\n textureUnits[i] = null\n }\n values(textureSet).forEach(destroy)\n\n stats.cubeCount = 0\n stats.textureCount = 0\n }\n\n if (config.profile) {\n stats.getTotalTextureSize = function () {\n var total = 0\n Object.keys(textureSet).forEach(function (key) {\n total += textureSet[key].stats.size\n })\n return total\n }\n }\n\n function restoreTextures () {\n for (var i = 0; i < numTexUnits; ++i) {\n var tex = textureUnits[i]\n if (tex) {\n tex.bindCount = 0\n tex.unit = -1\n textureUnits[i] = null\n }\n }\n\n values(textureSet).forEach(function (texture) {\n texture.texture = gl.createTexture()\n gl.bindTexture(texture.target, texture.texture)\n for (var i = 0; i < 32; ++i) {\n if ((texture.mipmask & (1 << i)) === 0) {\n continue\n }\n if (texture.target === GL_TEXTURE_2D$1) {\n gl.texImage2D(GL_TEXTURE_2D$1,\n i,\n texture.internalformat,\n texture.width >> i,\n texture.height >> i,\n 0,\n texture.internalformat,\n texture.type,\n null)\n } else {\n for (var j = 0; j < 6; ++j) {\n gl.texImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X$1 + j,\n i,\n texture.internalformat,\n texture.width >> i,\n texture.height >> i,\n 0,\n texture.internalformat,\n texture.type,\n null)\n }\n }\n }\n setTexInfo(texture.texInfo, texture.target)\n })\n }\n\n function refreshTextures () {\n for (var i = 0; i < numTexUnits; ++i) {\n var tex = textureUnits[i]\n if (tex) {\n tex.bindCount = 0\n tex.unit = -1\n textureUnits[i] = null\n }\n gl.activeTexture(GL_TEXTURE0$1 + i)\n gl.bindTexture(GL_TEXTURE_2D$1, null)\n gl.bindTexture(GL_TEXTURE_CUBE_MAP$1, null)\n }\n }\n\n return {\n create2D: createTexture2D,\n createCube: createTextureCube,\n clear: destroyTextures,\n getTexture: function (wrapper) {\n return null\n },\n restore: restoreTextures,\n refresh: refreshTextures\n }\n}\n\nvar GL_RENDERBUFFER = 0x8D41\n\nvar GL_RGBA4$1 = 0x8056\nvar GL_RGB5_A1$1 = 0x8057\nvar GL_RGB565$1 = 0x8D62\nvar GL_DEPTH_COMPONENT16 = 0x81A5\nvar GL_STENCIL_INDEX8 = 0x8D48\nvar GL_DEPTH_STENCIL$1 = 0x84F9\n\nvar GL_SRGB8_ALPHA8_EXT = 0x8C43\n\nvar GL_RGBA32F_EXT = 0x8814\n\nvar GL_RGBA16F_EXT = 0x881A\nvar GL_RGB16F_EXT = 0x881B\n\nvar FORMAT_SIZES = []\n\nFORMAT_SIZES[GL_RGBA4$1] = 2\nFORMAT_SIZES[GL_RGB5_A1$1] = 2\nFORMAT_SIZES[GL_RGB565$1] = 2\n\nFORMAT_SIZES[GL_DEPTH_COMPONENT16] = 2\nFORMAT_SIZES[GL_STENCIL_INDEX8] = 1\nFORMAT_SIZES[GL_DEPTH_STENCIL$1] = 4\n\nFORMAT_SIZES[GL_SRGB8_ALPHA8_EXT] = 4\nFORMAT_SIZES[GL_RGBA32F_EXT] = 16\nFORMAT_SIZES[GL_RGBA16F_EXT] = 8\nFORMAT_SIZES[GL_RGB16F_EXT] = 6\n\nfunction getRenderbufferSize (format, width, height) {\n return FORMAT_SIZES[format] * width * height\n}\n\nvar wrapRenderbuffers = function (gl, extensions, limits, stats, config) {\n var formatTypes = {\n 'rgba4': GL_RGBA4$1,\n 'rgb565': GL_RGB565$1,\n 'rgb5 a1': GL_RGB5_A1$1,\n 'depth': GL_DEPTH_COMPONENT16,\n 'stencil': GL_STENCIL_INDEX8,\n 'depth stencil': GL_DEPTH_STENCIL$1\n }\n\n if (extensions.ext_srgb) {\n formatTypes['srgba'] = GL_SRGB8_ALPHA8_EXT\n }\n\n if (extensions.ext_color_buffer_half_float) {\n formatTypes['rgba16f'] = GL_RGBA16F_EXT\n formatTypes['rgb16f'] = GL_RGB16F_EXT\n }\n\n if (extensions.webgl_color_buffer_float) {\n formatTypes['rgba32f'] = GL_RGBA32F_EXT\n }\n\n var formatTypesInvert = []\n Object.keys(formatTypes).forEach(function (key) {\n var val = formatTypes[key]\n formatTypesInvert[val] = key\n })\n\n var renderbufferCount = 0\n var renderbufferSet = {}\n\n function REGLRenderbuffer (renderbuffer) {\n this.id = renderbufferCount++\n this.refCount = 1\n\n this.renderbuffer = renderbuffer\n\n this.format = GL_RGBA4$1\n this.width = 0\n this.height = 0\n\n if (config.profile) {\n this.stats = { size: 0 }\n }\n }\n\n REGLRenderbuffer.prototype.decRef = function () {\n if (--this.refCount <= 0) {\n destroy(this)\n }\n }\n\n function destroy (rb) {\n var handle = rb.renderbuffer\n check$1(handle, 'must not double destroy renderbuffer')\n gl.bindRenderbuffer(GL_RENDERBUFFER, null)\n gl.deleteRenderbuffer(handle)\n rb.renderbuffer = null\n rb.refCount = 0\n delete renderbufferSet[rb.id]\n stats.renderbufferCount--\n }\n\n function createRenderbuffer (a, b) {\n var renderbuffer = new REGLRenderbuffer(gl.createRenderbuffer())\n renderbufferSet[renderbuffer.id] = renderbuffer\n stats.renderbufferCount++\n\n function reglRenderbuffer (a, b) {\n var w = 0\n var h = 0\n var format = GL_RGBA4$1\n\n if (typeof a === 'object' && a) {\n var options = a\n if ('shape' in options) {\n var shape = options.shape\n check$1(Array.isArray(shape) && shape.length >= 2,\n 'invalid renderbuffer shape')\n w = shape[0] | 0\n h = shape[1] | 0\n } else {\n if ('radius' in options) {\n w = h = options.radius | 0\n }\n if ('width' in options) {\n w = options.width | 0\n }\n if ('height' in options) {\n h = options.height | 0\n }\n }\n if ('format' in options) {\n check$1.parameter(options.format, formatTypes,\n 'invalid renderbuffer format')\n format = formatTypes[options.format]\n }\n } else if (typeof a === 'number') {\n w = a | 0\n if (typeof b === 'number') {\n h = b | 0\n } else {\n h = w\n }\n } else if (!a) {\n w = h = 1\n } else {\n check$1.raise('invalid arguments to renderbuffer constructor')\n }\n\n // check shape\n check$1(\n w > 0 && h > 0 &&\n w <= limits.maxRenderbufferSize && h <= limits.maxRenderbufferSize,\n 'invalid renderbuffer size')\n\n if (w === renderbuffer.width &&\n h === renderbuffer.height &&\n format === renderbuffer.format) {\n return\n }\n\n reglRenderbuffer.width = renderbuffer.width = w\n reglRenderbuffer.height = renderbuffer.height = h\n renderbuffer.format = format\n\n gl.bindRenderbuffer(GL_RENDERBUFFER, renderbuffer.renderbuffer)\n gl.renderbufferStorage(GL_RENDERBUFFER, format, w, h)\n\n check$1(\n gl.getError() === 0,\n 'invalid render buffer format')\n\n if (config.profile) {\n renderbuffer.stats.size = getRenderbufferSize(renderbuffer.format, renderbuffer.width, renderbuffer.height)\n }\n reglRenderbuffer.format = formatTypesInvert[renderbuffer.format]\n\n return reglRenderbuffer\n }\n\n function resize (w_, h_) {\n var w = w_ | 0\n var h = (h_ | 0) || w\n\n if (w === renderbuffer.width && h === renderbuffer.height) {\n return reglRenderbuffer\n }\n\n // check shape\n check$1(\n w > 0 && h > 0 &&\n w <= limits.maxRenderbufferSize && h <= limits.maxRenderbufferSize,\n 'invalid renderbuffer size')\n\n reglRenderbuffer.width = renderbuffer.width = w\n reglRenderbuffer.height = renderbuffer.height = h\n\n gl.bindRenderbuffer(GL_RENDERBUFFER, renderbuffer.renderbuffer)\n gl.renderbufferStorage(GL_RENDERBUFFER, renderbuffer.format, w, h)\n\n check$1(\n gl.getError() === 0,\n 'invalid render buffer format')\n\n // also, recompute size.\n if (config.profile) {\n renderbuffer.stats.size = getRenderbufferSize(\n renderbuffer.format, renderbuffer.width, renderbuffer.height)\n }\n\n return reglRenderbuffer\n }\n\n reglRenderbuffer(a, b)\n\n reglRenderbuffer.resize = resize\n reglRenderbuffer._reglType = 'renderbuffer'\n reglRenderbuffer._renderbuffer = renderbuffer\n if (config.profile) {\n reglRenderbuffer.stats = renderbuffer.stats\n }\n reglRenderbuffer.destroy = function () {\n renderbuffer.decRef()\n }\n\n return reglRenderbuffer\n }\n\n if (config.profile) {\n stats.getTotalRenderbufferSize = function () {\n var total = 0\n Object.keys(renderbufferSet).forEach(function (key) {\n total += renderbufferSet[key].stats.size\n })\n return total\n }\n }\n\n function restoreRenderbuffers () {\n values(renderbufferSet).forEach(function (rb) {\n rb.renderbuffer = gl.createRenderbuffer()\n gl.bindRenderbuffer(GL_RENDERBUFFER, rb.renderbuffer)\n gl.renderbufferStorage(GL_RENDERBUFFER, rb.format, rb.width, rb.height)\n })\n gl.bindRenderbuffer(GL_RENDERBUFFER, null)\n }\n\n return {\n create: createRenderbuffer,\n clear: function () {\n values(renderbufferSet).forEach(destroy)\n },\n restore: restoreRenderbuffers\n }\n}\n\n// We store these constants so that the minifier can inline them\nvar GL_FRAMEBUFFER$1 = 0x8D40\nvar GL_RENDERBUFFER$1 = 0x8D41\n\nvar GL_TEXTURE_2D$2 = 0x0DE1\nvar GL_TEXTURE_CUBE_MAP_POSITIVE_X$2 = 0x8515\n\nvar GL_COLOR_ATTACHMENT0$1 = 0x8CE0\nvar GL_DEPTH_ATTACHMENT = 0x8D00\nvar GL_STENCIL_ATTACHMENT = 0x8D20\nvar GL_DEPTH_STENCIL_ATTACHMENT = 0x821A\n\nvar GL_FRAMEBUFFER_COMPLETE$1 = 0x8CD5\nvar GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT = 0x8CD6\nvar GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT = 0x8CD7\nvar GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS = 0x8CD9\nvar GL_FRAMEBUFFER_UNSUPPORTED = 0x8CDD\n\nvar GL_HALF_FLOAT_OES$2 = 0x8D61\nvar GL_UNSIGNED_BYTE$6 = 0x1401\nvar GL_FLOAT$5 = 0x1406\n\nvar GL_RGB$1 = 0x1907\nvar GL_RGBA$2 = 0x1908\n\nvar GL_DEPTH_COMPONENT$1 = 0x1902\n\nvar colorTextureFormatEnums = [\n GL_RGB$1,\n GL_RGBA$2\n]\n\n// for every texture format, store\n// the number of channels\nvar textureFormatChannels = []\ntextureFormatChannels[GL_RGBA$2] = 4\ntextureFormatChannels[GL_RGB$1] = 3\n\n// for every texture type, store\n// the size in bytes.\nvar textureTypeSizes = []\ntextureTypeSizes[GL_UNSIGNED_BYTE$6] = 1\ntextureTypeSizes[GL_FLOAT$5] = 4\ntextureTypeSizes[GL_HALF_FLOAT_OES$2] = 2\n\nvar GL_RGBA4$2 = 0x8056\nvar GL_RGB5_A1$2 = 0x8057\nvar GL_RGB565$2 = 0x8D62\nvar GL_DEPTH_COMPONENT16$1 = 0x81A5\nvar GL_STENCIL_INDEX8$1 = 0x8D48\nvar GL_DEPTH_STENCIL$2 = 0x84F9\n\nvar GL_SRGB8_ALPHA8_EXT$1 = 0x8C43\n\nvar GL_RGBA32F_EXT$1 = 0x8814\n\nvar GL_RGBA16F_EXT$1 = 0x881A\nvar GL_RGB16F_EXT$1 = 0x881B\n\nvar colorRenderbufferFormatEnums = [\n GL_RGBA4$2,\n GL_RGB5_A1$2,\n GL_RGB565$2,\n GL_SRGB8_ALPHA8_EXT$1,\n GL_RGBA16F_EXT$1,\n GL_RGB16F_EXT$1,\n GL_RGBA32F_EXT$1\n]\n\nvar statusCode = {}\nstatusCode[GL_FRAMEBUFFER_COMPLETE$1] = 'complete'\nstatusCode[GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT] = 'incomplete attachment'\nstatusCode[GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS] = 'incomplete dimensions'\nstatusCode[GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT] = 'incomplete, missing attachment'\nstatusCode[GL_FRAMEBUFFER_UNSUPPORTED] = 'unsupported'\n\nfunction wrapFBOState (\n gl,\n extensions,\n limits,\n textureState,\n renderbufferState,\n stats) {\n var framebufferState = {\n cur: null,\n next: null,\n dirty: false,\n setFBO: null\n }\n\n var colorTextureFormats = ['rgba']\n var colorRenderbufferFormats = ['rgba4', 'rgb565', 'rgb5 a1']\n\n if (extensions.ext_srgb) {\n colorRenderbufferFormats.push('srgba')\n }\n\n if (extensions.ext_color_buffer_half_float) {\n colorRenderbufferFormats.push('rgba16f', 'rgb16f')\n }\n\n if (extensions.webgl_color_buffer_float) {\n colorRenderbufferFormats.push('rgba32f')\n }\n\n var colorTypes = ['uint8']\n if (extensions.oes_texture_half_float) {\n colorTypes.push('half float', 'float16')\n }\n if (extensions.oes_texture_float) {\n colorTypes.push('float', 'float32')\n }\n\n function FramebufferAttachment (target, texture, renderbuffer) {\n this.target = target\n this.texture = texture\n this.renderbuffer = renderbuffer\n\n var w = 0\n var h = 0\n if (texture) {\n w = texture.width\n h = texture.height\n } else if (renderbuffer) {\n w = renderbuffer.width\n h = renderbuffer.height\n }\n this.width = w\n this.height = h\n }\n\n function decRef (attachment) {\n if (attachment) {\n if (attachment.texture) {\n attachment.texture._texture.decRef()\n }\n if (attachment.renderbuffer) {\n attachment.renderbuffer._renderbuffer.decRef()\n }\n }\n }\n\n function incRefAndCheckShape (attachment, width, height) {\n if (!attachment) {\n return\n }\n if (attachment.texture) {\n var texture = attachment.texture._texture\n var tw = Math.max(1, texture.width)\n var th = Math.max(1, texture.height)\n check$1(tw === width && th === height,\n 'inconsistent width/height for supplied texture')\n texture.refCount += 1\n } else {\n var renderbuffer = attachment.renderbuffer._renderbuffer\n check$1(\n renderbuffer.width === width && renderbuffer.height === height,\n 'inconsistent width/height for renderbuffer')\n renderbuffer.refCount += 1\n }\n }\n\n function attach (location, attachment) {\n if (attachment) {\n if (attachment.texture) {\n gl.framebufferTexture2D(\n GL_FRAMEBUFFER$1,\n location,\n attachment.target,\n attachment.texture._texture.texture,\n 0)\n } else {\n gl.framebufferRenderbuffer(\n GL_FRAMEBUFFER$1,\n location,\n GL_RENDERBUFFER$1,\n attachment.renderbuffer._renderbuffer.renderbuffer)\n }\n }\n }\n\n function parseAttachment (attachment) {\n var target = GL_TEXTURE_2D$2\n var texture = null\n var renderbuffer = null\n\n var data = attachment\n if (typeof attachment === 'object') {\n data = attachment.data\n if ('target' in attachment) {\n target = attachment.target | 0\n }\n }\n\n check$1.type(data, 'function', 'invalid attachment data')\n\n var type = data._reglType\n if (type === 'texture2d') {\n texture = data\n check$1(target === GL_TEXTURE_2D$2)\n } else if (type === 'textureCube') {\n texture = data\n check$1(\n target >= GL_TEXTURE_CUBE_MAP_POSITIVE_X$2 &&\n target < GL_TEXTURE_CUBE_MAP_POSITIVE_X$2 + 6,\n 'invalid cube map target')\n } else if (type === 'renderbuffer') {\n renderbuffer = data\n target = GL_RENDERBUFFER$1\n } else {\n check$1.raise('invalid regl object for attachment')\n }\n\n return new FramebufferAttachment(target, texture, renderbuffer)\n }\n\n function allocAttachment (\n width,\n height,\n isTexture,\n format,\n type) {\n if (isTexture) {\n var texture = textureState.create2D({\n width: width,\n height: height,\n format: format,\n type: type\n })\n texture._texture.refCount = 0\n return new FramebufferAttachment(GL_TEXTURE_2D$2, texture, null)\n } else {\n var rb = renderbufferState.create({\n width: width,\n height: height,\n format: format\n })\n rb._renderbuffer.refCount = 0\n return new FramebufferAttachment(GL_RENDERBUFFER$1, null, rb)\n }\n }\n\n function unwrapAttachment (attachment) {\n return attachment && (attachment.texture || attachment.renderbuffer)\n }\n\n function resizeAttachment (attachment, w, h) {\n if (attachment) {\n if (attachment.texture) {\n attachment.texture.resize(w, h)\n } else if (attachment.renderbuffer) {\n attachment.renderbuffer.resize(w, h)\n }\n attachment.width = w\n attachment.height = h\n }\n }\n\n var framebufferCount = 0\n var framebufferSet = {}\n\n function REGLFramebuffer () {\n this.id = framebufferCount++\n framebufferSet[this.id] = this\n\n this.framebuffer = gl.createFramebuffer()\n this.width = 0\n this.height = 0\n\n this.colorAttachments = []\n this.depthAttachment = null\n this.stencilAttachment = null\n this.depthStencilAttachment = null\n }\n\n function decFBORefs (framebuffer) {\n framebuffer.colorAttachments.forEach(decRef)\n decRef(framebuffer.depthAttachment)\n decRef(framebuffer.stencilAttachment)\n decRef(framebuffer.depthStencilAttachment)\n }\n\n function destroy (framebuffer) {\n var handle = framebuffer.framebuffer\n check$1(handle, 'must not double destroy framebuffer')\n gl.deleteFramebuffer(handle)\n framebuffer.framebuffer = null\n stats.framebufferCount--\n delete framebufferSet[framebuffer.id]\n }\n\n function updateFramebuffer (framebuffer) {\n var i\n\n gl.bindFramebuffer(GL_FRAMEBUFFER$1, framebuffer.framebuffer)\n var colorAttachments = framebuffer.colorAttachments\n for (i = 0; i < colorAttachments.length; ++i) {\n attach(GL_COLOR_ATTACHMENT0$1 + i, colorAttachments[i])\n }\n for (i = colorAttachments.length; i < limits.maxColorAttachments; ++i) {\n gl.framebufferTexture2D(\n GL_FRAMEBUFFER$1,\n GL_COLOR_ATTACHMENT0$1 + i,\n GL_TEXTURE_2D$2,\n null,\n 0)\n }\n\n gl.framebufferTexture2D(\n GL_FRAMEBUFFER$1,\n GL_DEPTH_STENCIL_ATTACHMENT,\n GL_TEXTURE_2D$2,\n null,\n 0)\n gl.framebufferTexture2D(\n GL_FRAMEBUFFER$1,\n GL_DEPTH_ATTACHMENT,\n GL_TEXTURE_2D$2,\n null,\n 0)\n gl.framebufferTexture2D(\n GL_FRAMEBUFFER$1,\n GL_STENCIL_ATTACHMENT,\n GL_TEXTURE_2D$2,\n null,\n 0)\n\n attach(GL_DEPTH_ATTACHMENT, framebuffer.depthAttachment)\n attach(GL_STENCIL_ATTACHMENT, framebuffer.stencilAttachment)\n attach(GL_DEPTH_STENCIL_ATTACHMENT, framebuffer.depthStencilAttachment)\n\n // Check status code\n var status = gl.checkFramebufferStatus(GL_FRAMEBUFFER$1)\n if (!gl.isContextLost() && status !== GL_FRAMEBUFFER_COMPLETE$1) {\n check$1.raise('framebuffer configuration not supported, status = ' +\n statusCode[status])\n }\n\n gl.bindFramebuffer(GL_FRAMEBUFFER$1, framebufferState.next ? framebufferState.next.framebuffer : null)\n framebufferState.cur = framebufferState.next\n\n // FIXME: Clear error code here. This is a work around for a bug in\n // headless-gl\n gl.getError()\n }\n\n function createFBO (a0, a1) {\n var framebuffer = new REGLFramebuffer()\n stats.framebufferCount++\n\n function reglFramebuffer (a, b) {\n var i\n\n check$1(framebufferState.next !== framebuffer,\n 'can not update framebuffer which is currently in use')\n\n var width = 0\n var height = 0\n\n var needsDepth = true\n var needsStencil = true\n\n var colorBuffer = null\n var colorTexture = true\n var colorFormat = 'rgba'\n var colorType = 'uint8'\n var colorCount = 1\n\n var depthBuffer = null\n var stencilBuffer = null\n var depthStencilBuffer = null\n var depthStencilTexture = false\n\n if (typeof a === 'number') {\n width = a | 0\n height = (b | 0) || width\n } else if (!a) {\n width = height = 1\n } else {\n check$1.type(a, 'object', 'invalid arguments for framebuffer')\n var options = a\n\n if ('shape' in options) {\n var shape = options.shape\n check$1(Array.isArray(shape) && shape.length >= 2,\n 'invalid shape for framebuffer')\n width = shape[0]\n height = shape[1]\n } else {\n if ('radius' in options) {\n width = height = options.radius\n }\n if ('width' in options) {\n width = options.width\n }\n if ('height' in options) {\n height = options.height\n }\n }\n\n if ('color' in options ||\n 'colors' in options) {\n colorBuffer =\n options.color ||\n options.colors\n if (Array.isArray(colorBuffer)) {\n check$1(\n colorBuffer.length === 1 || extensions.webgl_draw_buffers,\n 'multiple render targets not supported')\n }\n }\n\n if (!colorBuffer) {\n if ('colorCount' in options) {\n colorCount = options.colorCount | 0\n check$1(colorCount > 0, 'invalid color buffer count')\n }\n\n if ('colorTexture' in options) {\n colorTexture = !!options.colorTexture\n colorFormat = 'rgba4'\n }\n\n if ('colorType' in options) {\n colorType = options.colorType\n if (!colorTexture) {\n if (colorType === 'half float' || colorType === 'float16') {\n check$1(extensions.ext_color_buffer_half_float,\n 'you must enable EXT_color_buffer_half_float to use 16-bit render buffers')\n colorFormat = 'rgba16f'\n } else if (colorType === 'float' || colorType === 'float32') {\n check$1(extensions.webgl_color_buffer_float,\n 'you must enable WEBGL_color_buffer_float in order to use 32-bit floating point renderbuffers')\n colorFormat = 'rgba32f'\n }\n } else {\n check$1(extensions.oes_texture_float ||\n !(colorType === 'float' || colorType === 'float32'),\n 'you must enable OES_texture_float in order to use floating point framebuffer objects')\n check$1(extensions.oes_texture_half_float ||\n !(colorType === 'half float' || colorType === 'float16'),\n 'you must enable OES_texture_half_float in order to use 16-bit floating point framebuffer objects')\n }\n check$1.oneOf(colorType, colorTypes, 'invalid color type')\n }\n\n if ('colorFormat' in options) {\n colorFormat = options.colorFormat\n if (colorTextureFormats.indexOf(colorFormat) >= 0) {\n colorTexture = true\n } else if (colorRenderbufferFormats.indexOf(colorFormat) >= 0) {\n colorTexture = false\n } else {\n if (colorTexture) {\n check$1.oneOf(\n options.colorFormat, colorTextureFormats,\n 'invalid color format for texture')\n } else {\n check$1.oneOf(\n options.colorFormat, colorRenderbufferFormats,\n 'invalid color format for renderbuffer')\n }\n }\n }\n }\n\n if ('depthTexture' in options || 'depthStencilTexture' in options) {\n depthStencilTexture = !!(options.depthTexture ||\n options.depthStencilTexture)\n check$1(!depthStencilTexture || extensions.webgl_depth_texture,\n 'webgl_depth_texture extension not supported')\n }\n\n if ('depth' in options) {\n if (typeof options.depth === 'boolean') {\n needsDepth = options.depth\n } else {\n depthBuffer = options.depth\n needsStencil = false\n }\n }\n\n if ('stencil' in options) {\n if (typeof options.stencil === 'boolean') {\n needsStencil = options.stencil\n } else {\n stencilBuffer = options.stencil\n needsDepth = false\n }\n }\n\n if ('depthStencil' in options) {\n if (typeof options.depthStencil === 'boolean') {\n needsDepth = needsStencil = options.depthStencil\n } else {\n depthStencilBuffer = options.depthStencil\n needsDepth = false\n needsStencil = false\n }\n }\n }\n\n // parse attachments\n var colorAttachments = null\n var depthAttachment = null\n var stencilAttachment = null\n var depthStencilAttachment = null\n\n // Set up color attachments\n if (Array.isArray(colorBuffer)) {\n colorAttachments = colorBuffer.map(parseAttachment)\n } else if (colorBuffer) {\n colorAttachments = [parseAttachment(colorBuffer)]\n } else {\n colorAttachments = new Array(colorCount)\n for (i = 0; i < colorCount; ++i) {\n colorAttachments[i] = allocAttachment(\n width,\n height,\n colorTexture,\n colorFormat,\n colorType)\n }\n }\n\n check$1(extensions.webgl_draw_buffers || colorAttachments.length <= 1,\n 'you must enable the WEBGL_draw_buffers extension in order to use multiple color buffers.')\n check$1(colorAttachments.length <= limits.maxColorAttachments,\n 'too many color attachments, not supported')\n\n width = width || colorAttachments[0].width\n height = height || colorAttachments[0].height\n\n if (depthBuffer) {\n depthAttachment = parseAttachment(depthBuffer)\n } else if (needsDepth && !needsStencil) {\n depthAttachment = allocAttachment(\n width,\n height,\n depthStencilTexture,\n 'depth',\n 'uint32')\n }\n\n if (stencilBuffer) {\n stencilAttachment = parseAttachment(stencilBuffer)\n } else if (needsStencil && !needsDepth) {\n stencilAttachment = allocAttachment(\n width,\n height,\n false,\n 'stencil',\n 'uint8')\n }\n\n if (depthStencilBuffer) {\n depthStencilAttachment = parseAttachment(depthStencilBuffer)\n } else if (!depthBuffer && !stencilBuffer && needsStencil && needsDepth) {\n depthStencilAttachment = allocAttachment(\n width,\n height,\n depthStencilTexture,\n 'depth stencil',\n 'depth stencil')\n }\n\n check$1(\n (!!depthBuffer) + (!!stencilBuffer) + (!!depthStencilBuffer) <= 1,\n 'invalid framebuffer configuration, can specify exactly one depth/stencil attachment')\n\n var commonColorAttachmentSize = null\n\n for (i = 0; i < colorAttachments.length; ++i) {\n incRefAndCheckShape(colorAttachments[i], width, height)\n check$1(!colorAttachments[i] ||\n (colorAttachments[i].texture &&\n colorTextureFormatEnums.indexOf(colorAttachments[i].texture._texture.format) >= 0) ||\n (colorAttachments[i].renderbuffer &&\n colorRenderbufferFormatEnums.indexOf(colorAttachments[i].renderbuffer._renderbuffer.format) >= 0),\n 'framebuffer color attachment ' + i + ' is invalid')\n\n if (colorAttachments[i] && colorAttachments[i].texture) {\n var colorAttachmentSize =\n textureFormatChannels[colorAttachments[i].texture._texture.format] *\n textureTypeSizes[colorAttachments[i].texture._texture.type]\n\n if (commonColorAttachmentSize === null) {\n commonColorAttachmentSize = colorAttachmentSize\n } else {\n // We need to make sure that all color attachments have the same number of bitplanes\n // (that is, the same numer of bits per pixel)\n // This is required by the GLES2.0 standard. See the beginning of Chapter 4 in that document.\n check$1(commonColorAttachmentSize === colorAttachmentSize,\n 'all color attachments much have the same number of bits per pixel.')\n }\n }\n }\n incRefAndCheckShape(depthAttachment, width, height)\n check$1(!depthAttachment ||\n (depthAttachment.texture &&\n depthAttachment.texture._texture.format === GL_DEPTH_COMPONENT$1) ||\n (depthAttachment.renderbuffer &&\n depthAttachment.renderbuffer._renderbuffer.format === GL_DEPTH_COMPONENT16$1),\n 'invalid depth attachment for framebuffer object')\n incRefAndCheckShape(stencilAttachment, width, height)\n check$1(!stencilAttachment ||\n (stencilAttachment.renderbuffer &&\n stencilAttachment.renderbuffer._renderbuffer.format === GL_STENCIL_INDEX8$1),\n 'invalid stencil attachment for framebuffer object')\n incRefAndCheckShape(depthStencilAttachment, width, height)\n check$1(!depthStencilAttachment ||\n (depthStencilAttachment.texture &&\n depthStencilAttachment.texture._texture.format === GL_DEPTH_STENCIL$2) ||\n (depthStencilAttachment.renderbuffer &&\n depthStencilAttachment.renderbuffer._renderbuffer.format === GL_DEPTH_STENCIL$2),\n 'invalid depth-stencil attachment for framebuffer object')\n\n // decrement references\n decFBORefs(framebuffer)\n\n framebuffer.width = width\n framebuffer.height = height\n\n framebuffer.colorAttachments = colorAttachments\n framebuffer.depthAttachment = depthAttachment\n framebuffer.stencilAttachment = stencilAttachment\n framebuffer.depthStencilAttachment = depthStencilAttachment\n\n reglFramebuffer.color = colorAttachments.map(unwrapAttachment)\n reglFramebuffer.depth = unwrapAttachment(depthAttachment)\n reglFramebuffer.stencil = unwrapAttachment(stencilAttachment)\n reglFramebuffer.depthStencil = unwrapAttachment(depthStencilAttachment)\n\n reglFramebuffer.width = framebuffer.width\n reglFramebuffer.height = framebuffer.height\n\n updateFramebuffer(framebuffer)\n\n return reglFramebuffer\n }\n\n function resize (w_, h_) {\n check$1(framebufferState.next !== framebuffer,\n 'can not resize a framebuffer which is currently in use')\n\n var w = Math.max(w_ | 0, 1)\n var h = Math.max((h_ | 0) || w, 1)\n if (w === framebuffer.width && h === framebuffer.height) {\n return reglFramebuffer\n }\n\n // resize all buffers\n var colorAttachments = framebuffer.colorAttachments\n for (var i = 0; i < colorAttachments.length; ++i) {\n resizeAttachment(colorAttachments[i], w, h)\n }\n resizeAttachment(framebuffer.depthAttachment, w, h)\n resizeAttachment(framebuffer.stencilAttachment, w, h)\n resizeAttachment(framebuffer.depthStencilAttachment, w, h)\n\n framebuffer.width = reglFramebuffer.width = w\n framebuffer.height = reglFramebuffer.height = h\n\n updateFramebuffer(framebuffer)\n\n return reglFramebuffer\n }\n\n reglFramebuffer(a0, a1)\n\n return extend(reglFramebuffer, {\n resize: resize,\n _reglType: 'framebuffer',\n _framebuffer: framebuffer,\n destroy: function () {\n destroy(framebuffer)\n decFBORefs(framebuffer)\n },\n use: function (block) {\n framebufferState.setFBO({\n framebuffer: reglFramebuffer\n }, block)\n }\n })\n }\n\n function createCubeFBO (options) {\n var faces = Array(6)\n\n function reglFramebufferCube (a) {\n var i\n\n check$1(faces.indexOf(framebufferState.next) < 0,\n 'can not update framebuffer which is currently in use')\n\n var params = {\n color: null\n }\n\n var radius = 0\n\n var colorBuffer = null\n var colorFormat = 'rgba'\n var colorType = 'uint8'\n var colorCount = 1\n\n if (typeof a === 'number') {\n radius = a | 0\n } else if (!a) {\n radius = 1\n } else {\n check$1.type(a, 'object', 'invalid arguments for framebuffer')\n var options = a\n\n if ('shape' in options) {\n var shape = options.shape\n check$1(\n Array.isArray(shape) && shape.length >= 2,\n 'invalid shape for framebuffer')\n check$1(\n shape[0] === shape[1],\n 'cube framebuffer must be square')\n radius = shape[0]\n } else {\n if ('radius' in options) {\n radius = options.radius | 0\n }\n if ('width' in options) {\n radius = options.width | 0\n if ('height' in options) {\n check$1(options.height === radius, 'must be square')\n }\n } else if ('height' in options) {\n radius = options.height | 0\n }\n }\n\n if ('color' in options ||\n 'colors' in options) {\n colorBuffer =\n options.color ||\n options.colors\n if (Array.isArray(colorBuffer)) {\n check$1(\n colorBuffer.length === 1 || extensions.webgl_draw_buffers,\n 'multiple render targets not supported')\n }\n }\n\n if (!colorBuffer) {\n if ('colorCount' in options) {\n colorCount = options.colorCount | 0\n check$1(colorCount > 0, 'invalid color buffer count')\n }\n\n if ('colorType' in options) {\n check$1.oneOf(\n options.colorType, colorTypes,\n 'invalid color type')\n colorType = options.colorType\n }\n\n if ('colorFormat' in options) {\n colorFormat = options.colorFormat\n check$1.oneOf(\n options.colorFormat, colorTextureFormats,\n 'invalid color format for texture')\n }\n }\n\n if ('depth' in options) {\n params.depth = options.depth\n }\n\n if ('stencil' in options) {\n params.stencil = options.stencil\n }\n\n if ('depthStencil' in options) {\n params.depthStencil = options.depthStencil\n }\n }\n\n var colorCubes\n if (colorBuffer) {\n if (Array.isArray(colorBuffer)) {\n colorCubes = []\n for (i = 0; i < colorBuffer.length; ++i) {\n colorCubes[i] = colorBuffer[i]\n }\n } else {\n colorCubes = [ colorBuffer ]\n }\n } else {\n colorCubes = Array(colorCount)\n var cubeMapParams = {\n radius: radius,\n format: colorFormat,\n type: colorType\n }\n for (i = 0; i < colorCount; ++i) {\n colorCubes[i] = textureState.createCube(cubeMapParams)\n }\n }\n\n // Check color cubes\n params.color = Array(colorCubes.length)\n for (i = 0; i < colorCubes.length; ++i) {\n var cube = colorCubes[i]\n check$1(\n typeof cube === 'function' && cube._reglType === 'textureCube',\n 'invalid cube map')\n radius = radius || cube.width\n check$1(\n cube.width === radius && cube.height === radius,\n 'invalid cube map shape')\n params.color[i] = {\n target: GL_TEXTURE_CUBE_MAP_POSITIVE_X$2,\n data: colorCubes[i]\n }\n }\n\n for (i = 0; i < 6; ++i) {\n for (var j = 0; j < colorCubes.length; ++j) {\n params.color[j].target = GL_TEXTURE_CUBE_MAP_POSITIVE_X$2 + i\n }\n // reuse depth-stencil attachments across all cube maps\n if (i > 0) {\n params.depth = faces[0].depth\n params.stencil = faces[0].stencil\n params.depthStencil = faces[0].depthStencil\n }\n if (faces[i]) {\n (faces[i])(params)\n } else {\n faces[i] = createFBO(params)\n }\n }\n\n return extend(reglFramebufferCube, {\n width: radius,\n height: radius,\n color: colorCubes\n })\n }\n\n function resize (radius_) {\n var i\n var radius = radius_ | 0\n check$1(radius > 0 && radius <= limits.maxCubeMapSize,\n 'invalid radius for cube fbo')\n\n if (radius === reglFramebufferCube.width) {\n return reglFramebufferCube\n }\n\n var colors = reglFramebufferCube.color\n for (i = 0; i < colors.length; ++i) {\n colors[i].resize(radius)\n }\n\n for (i = 0; i < 6; ++i) {\n faces[i].resize(radius)\n }\n\n reglFramebufferCube.width = reglFramebufferCube.height = radius\n\n return reglFramebufferCube\n }\n\n reglFramebufferCube(options)\n\n return extend(reglFramebufferCube, {\n faces: faces,\n resize: resize,\n _reglType: 'framebufferCube',\n destroy: function () {\n faces.forEach(function (f) {\n f.destroy()\n })\n }\n })\n }\n\n function restoreFramebuffers () {\n framebufferState.cur = null\n framebufferState.next = null\n framebufferState.dirty = true\n values(framebufferSet).forEach(function (fb) {\n fb.framebuffer = gl.createFramebuffer()\n updateFramebuffer(fb)\n })\n }\n\n return extend(framebufferState, {\n getFramebuffer: function (object) {\n if (typeof object === 'function' && object._reglType === 'framebuffer') {\n var fbo = object._framebuffer\n if (fbo instanceof REGLFramebuffer) {\n return fbo\n }\n }\n return null\n },\n create: createFBO,\n createCube: createCubeFBO,\n clear: function () {\n values(framebufferSet).forEach(destroy)\n },\n restore: restoreFramebuffers\n })\n}\n\nvar GL_FLOAT$6 = 5126\nvar GL_ARRAY_BUFFER$1 = 34962\n\nfunction AttributeRecord () {\n this.state = 0\n\n this.x = 0.0\n this.y = 0.0\n this.z = 0.0\n this.w = 0.0\n\n this.buffer = null\n this.size = 0\n this.normalized = false\n this.type = GL_FLOAT$6\n this.offset = 0\n this.stride = 0\n this.divisor = 0\n}\n\nfunction wrapAttributeState (\n gl,\n extensions,\n limits,\n stats,\n bufferState) {\n var NUM_ATTRIBUTES = limits.maxAttributes\n var attributeBindings = new Array(NUM_ATTRIBUTES)\n for (var i = 0; i < NUM_ATTRIBUTES; ++i) {\n attributeBindings[i] = new AttributeRecord()\n }\n var vaoCount = 0\n var vaoSet = {}\n\n var state = {\n Record: AttributeRecord,\n scope: {},\n state: attributeBindings,\n currentVAO: null,\n targetVAO: null,\n restore: extVAO() ? restoreVAO : function () {},\n createVAO: createVAO,\n getVAO: getVAO,\n destroyBuffer: destroyBuffer,\n setVAO: extVAO() ? setVAOEXT : setVAOEmulated,\n clear: extVAO() ? destroyVAOEXT : function () {}\n }\n\n function destroyBuffer (buffer) {\n for (var i = 0; i < attributeBindings.length; ++i) {\n var record = attributeBindings[i]\n if (record.buffer === buffer) {\n gl.disableVertexAttribArray(i)\n record.buffer = null\n }\n }\n }\n\n function extVAO () {\n return extensions.oes_vertex_array_object\n }\n\n function extInstanced () {\n return extensions.angle_instanced_arrays\n }\n\n function getVAO (vao) {\n if (typeof vao === 'function' && vao._vao) {\n return vao._vao\n }\n return null\n }\n\n function setVAOEXT (vao) {\n if (vao === state.currentVAO) {\n return\n }\n var ext = extVAO()\n if (vao) {\n ext.bindVertexArrayOES(vao.vao)\n } else {\n ext.bindVertexArrayOES(null)\n }\n state.currentVAO = vao\n }\n\n function setVAOEmulated (vao) {\n if (vao === state.currentVAO) {\n return\n }\n if (vao) {\n vao.bindAttrs()\n } else {\n var exti = extInstanced()\n for (var i = 0; i < attributeBindings.length; ++i) {\n var binding = attributeBindings[i]\n if (binding.buffer) {\n gl.enableVertexAttribArray(i)\n gl.vertexAttribPointer(i, binding.size, binding.type, binding.normalized, binding.stride, binding.offfset)\n if (exti && binding.divisor) {\n exti.vertexAttribDivisorANGLE(i, binding.divisor)\n }\n } else {\n gl.disableVertexAttribArray(i)\n gl.vertexAttrib4f(i, binding.x, binding.y, binding.z, binding.w)\n }\n }\n }\n state.currentVAO = vao\n }\n\n function destroyVAOEXT () {\n values(vaoSet).forEach(function (vao) {\n vao.destroy()\n })\n }\n\n function REGLVAO () {\n this.id = ++vaoCount\n this.attributes = []\n var extension = extVAO()\n if (extension) {\n this.vao = extension.createVertexArrayOES()\n } else {\n this.vao = null\n }\n vaoSet[this.id] = this\n this.buffers = []\n }\n\n REGLVAO.prototype.bindAttrs = function () {\n var exti = extInstanced()\n var attributes = this.attributes\n for (var i = 0; i < attributes.length; ++i) {\n var attr = attributes[i]\n if (attr.buffer) {\n gl.enableVertexAttribArray(i)\n gl.bindBuffer(GL_ARRAY_BUFFER$1, attr.buffer.buffer)\n gl.vertexAttribPointer(i, attr.size, attr.type, attr.normalized, attr.stride, attr.offset)\n if (exti && attr.divisor) {\n exti.vertexAttribDivisorANGLE(i, attr.divisor)\n }\n } else {\n gl.disableVertexAttribArray(i)\n gl.vertexAttrib4f(i, attr.x, attr.y, attr.z, attr.w)\n }\n }\n for (var j = attributes.length; j < NUM_ATTRIBUTES; ++j) {\n gl.disableVertexAttribArray(j)\n }\n }\n\n REGLVAO.prototype.refresh = function () {\n var ext = extVAO()\n if (ext) {\n ext.bindVertexArrayOES(this.vao)\n this.bindAttrs()\n state.currentVAO = this\n }\n }\n\n REGLVAO.prototype.destroy = function () {\n if (this.vao) {\n var extension = extVAO()\n if (this === state.currentVAO) {\n state.currentVAO = null\n extension.bindVertexArrayOES(null)\n }\n extension.deleteVertexArrayOES(this.vao)\n this.vao = null\n }\n if (vaoSet[this.id]) {\n delete vaoSet[this.id]\n stats.vaoCount -= 1\n }\n }\n\n function restoreVAO () {\n var ext = extVAO()\n if (ext) {\n values(vaoSet).forEach(function (vao) {\n vao.refresh()\n })\n }\n }\n\n function createVAO (_attr) {\n var vao = new REGLVAO()\n stats.vaoCount += 1\n\n function updateVAO (attributes) {\n check$1(Array.isArray(attributes), 'arguments to vertex array constructor must be an array')\n check$1(attributes.length < NUM_ATTRIBUTES, 'too many attributes')\n check$1(attributes.length > 0, 'must specify at least one attribute')\n\n var bufUpdated = {}\n var nattributes = vao.attributes\n nattributes.length = attributes.length\n for (var i = 0; i < attributes.length; ++i) {\n var spec = attributes[i]\n var rec = nattributes[i] = new AttributeRecord()\n var data = spec.data || spec\n if (Array.isArray(data) || isTypedArray(data) || isNDArrayLike(data)) {\n var buf\n if (vao.buffers[i]) {\n buf = vao.buffers[i]\n if (isTypedArray(data) && buf._buffer.byteLength >= data.byteLength) {\n buf.subdata(data)\n } else {\n buf.destroy()\n vao.buffers[i] = null\n }\n }\n if (!vao.buffers[i]) {\n buf = vao.buffers[i] = bufferState.create(spec, GL_ARRAY_BUFFER$1, false, true)\n }\n rec.buffer = bufferState.getBuffer(buf)\n rec.size = rec.buffer.dimension | 0\n rec.normalized = false\n rec.type = rec.buffer.dtype\n rec.offset = 0\n rec.stride = 0\n rec.divisor = 0\n rec.state = 1\n bufUpdated[i] = 1\n } else if (bufferState.getBuffer(spec)) {\n rec.buffer = bufferState.getBuffer(spec)\n rec.size = rec.buffer.dimension | 0\n rec.normalized = false\n rec.type = rec.buffer.dtype\n rec.offset = 0\n rec.stride = 0\n rec.divisor = 0\n rec.state = 1\n } else if (bufferState.getBuffer(spec.buffer)) {\n rec.buffer = bufferState.getBuffer(spec.buffer)\n rec.size = ((+spec.size) || rec.buffer.dimension) | 0\n rec.normalized = !!spec.normalized || false\n if ('type' in spec) {\n check$1.parameter(spec.type, glTypes, 'invalid buffer type')\n rec.type = glTypes[spec.type]\n } else {\n rec.type = rec.buffer.dtype\n }\n rec.offset = (spec.offset || 0) | 0\n rec.stride = (spec.stride || 0) | 0\n rec.divisor = (spec.divisor || 0) | 0\n rec.state = 1\n\n check$1(rec.size >= 1 && rec.size <= 4, 'size must be between 1 and 4')\n check$1(rec.offset >= 0, 'invalid offset')\n check$1(rec.stride >= 0 && rec.stride <= 255, 'stride must be between 0 and 255')\n check$1(rec.divisor >= 0, 'divisor must be positive')\n check$1(!rec.divisor || !!extensions.angle_instanced_arrays, 'ANGLE_instanced_arrays must be enabled to use divisor')\n } else if ('x' in spec) {\n check$1(i > 0, 'first attribute must not be a constant')\n rec.x = +spec.x || 0\n rec.y = +spec.y || 0\n rec.z = +spec.z || 0\n rec.w = +spec.w || 0\n rec.state = 2\n } else {\n check$1(false, 'invalid attribute spec for location ' + i)\n }\n }\n\n // retire unused buffers\n for (var j = 0; j < vao.buffers.length; ++j) {\n if (!bufUpdated[j] && vao.buffers[j]) {\n vao.buffers[j].destroy()\n vao.buffers[j] = null\n }\n }\n\n vao.refresh()\n return updateVAO\n }\n\n updateVAO.destroy = function () {\n for (var j = 0; j < vao.buffers.length; ++j) {\n if (vao.buffers[j]) {\n vao.buffers[j].destroy()\n }\n }\n vao.buffers.length = 0\n vao.destroy()\n }\n\n updateVAO._vao = vao\n updateVAO._reglType = 'vao'\n\n return updateVAO(_attr)\n }\n\n return state\n}\n\nvar GL_FRAGMENT_SHADER = 35632\nvar GL_VERTEX_SHADER = 35633\n\nvar GL_ACTIVE_UNIFORMS = 0x8B86\nvar GL_ACTIVE_ATTRIBUTES = 0x8B89\n\nfunction wrapShaderState (gl, stringStore, stats, config) {\n // ===================================================\n // glsl compilation and linking\n // ===================================================\n var fragShaders = {}\n var vertShaders = {}\n\n function ActiveInfo (name, id, location, info) {\n this.name = name\n this.id = id\n this.location = location\n this.info = info\n }\n\n function insertActiveInfo (list, info) {\n for (var i = 0; i < list.length; ++i) {\n if (list[i].id === info.id) {\n list[i].location = info.location\n return\n }\n }\n list.push(info)\n }\n\n function getShader (type, id, command) {\n var cache = type === GL_FRAGMENT_SHADER ? fragShaders : vertShaders\n var shader = cache[id]\n\n if (!shader) {\n var source = stringStore.str(id)\n shader = gl.createShader(type)\n gl.shaderSource(shader, source)\n gl.compileShader(shader)\n check$1.shaderError(gl, shader, source, type, command)\n cache[id] = shader\n }\n\n return shader\n }\n\n // ===================================================\n // program linking\n // ===================================================\n var programCache = {}\n var programList = []\n\n var PROGRAM_COUNTER = 0\n\n function REGLProgram (fragId, vertId) {\n this.id = PROGRAM_COUNTER++\n this.fragId = fragId\n this.vertId = vertId\n this.program = null\n this.uniforms = []\n this.attributes = []\n this.refCount = 1\n\n if (config.profile) {\n this.stats = {\n uniformsCount: 0,\n attributesCount: 0\n }\n }\n }\n\n function linkProgram (desc, command, attributeLocations) {\n var i, info\n\n // -------------------------------\n // compile & link\n // -------------------------------\n var fragShader = getShader(GL_FRAGMENT_SHADER, desc.fragId)\n var vertShader = getShader(GL_VERTEX_SHADER, desc.vertId)\n\n var program = desc.program = gl.createProgram()\n gl.attachShader(program, fragShader)\n gl.attachShader(program, vertShader)\n if (attributeLocations) {\n for (i = 0; i < attributeLocations.length; ++i) {\n var binding = attributeLocations[i]\n gl.bindAttribLocation(program, binding[0], binding[1])\n }\n }\n\n gl.linkProgram(program)\n check$1.linkError(\n gl,\n program,\n stringStore.str(desc.fragId),\n stringStore.str(desc.vertId),\n command)\n\n // -------------------------------\n // grab uniforms\n // -------------------------------\n var numUniforms = gl.getProgramParameter(program, GL_ACTIVE_UNIFORMS)\n if (config.profile) {\n desc.stats.uniformsCount = numUniforms\n }\n var uniforms = desc.uniforms\n for (i = 0; i < numUniforms; ++i) {\n info = gl.getActiveUniform(program, i)\n if (info) {\n if (info.size > 1) {\n for (var j = 0; j < info.size; ++j) {\n var name = info.name.replace('[0]', '[' + j + ']')\n insertActiveInfo(uniforms, new ActiveInfo(\n name,\n stringStore.id(name),\n gl.getUniformLocation(program, name),\n info))\n }\n } else {\n insertActiveInfo(uniforms, new ActiveInfo(\n info.name,\n stringStore.id(info.name),\n gl.getUniformLocation(program, info.name),\n info))\n }\n }\n }\n\n // -------------------------------\n // grab attributes\n // -------------------------------\n var numAttributes = gl.getProgramParameter(program, GL_ACTIVE_ATTRIBUTES)\n if (config.profile) {\n desc.stats.attributesCount = numAttributes\n }\n\n var attributes = desc.attributes\n for (i = 0; i < numAttributes; ++i) {\n info = gl.getActiveAttrib(program, i)\n if (info) {\n insertActiveInfo(attributes, new ActiveInfo(\n info.name,\n stringStore.id(info.name),\n gl.getAttribLocation(program, info.name),\n info))\n }\n }\n }\n\n if (config.profile) {\n stats.getMaxUniformsCount = function () {\n var m = 0\n programList.forEach(function (desc) {\n if (desc.stats.uniformsCount > m) {\n m = desc.stats.uniformsCount\n }\n })\n return m\n }\n\n stats.getMaxAttributesCount = function () {\n var m = 0\n programList.forEach(function (desc) {\n if (desc.stats.attributesCount > m) {\n m = desc.stats.attributesCount\n }\n })\n return m\n }\n }\n\n function restoreShaders () {\n fragShaders = {}\n vertShaders = {}\n for (var i = 0; i < programList.length; ++i) {\n linkProgram(programList[i], null, programList[i].attributes.map(function (info) {\n return [info.location, info.name]\n }))\n }\n }\n\n return {\n clear: function () {\n var deleteShader = gl.deleteShader.bind(gl)\n values(fragShaders).forEach(deleteShader)\n fragShaders = {}\n values(vertShaders).forEach(deleteShader)\n vertShaders = {}\n\n programList.forEach(function (desc) {\n gl.deleteProgram(desc.program)\n })\n programList.length = 0\n programCache = {}\n\n stats.shaderCount = 0\n },\n\n program: function (vertId, fragId, command, attribLocations) {\n check$1.command(vertId >= 0, 'missing vertex shader', command)\n check$1.command(fragId >= 0, 'missing fragment shader', command)\n\n var cache = programCache[fragId]\n if (!cache) {\n cache = programCache[fragId] = {}\n }\n var prevProgram = cache[vertId]\n if (prevProgram) {\n prevProgram.refCount++\n if (!attribLocations) {\n return prevProgram\n }\n }\n var program = new REGLProgram(fragId, vertId)\n stats.shaderCount++\n linkProgram(program, command, attribLocations)\n if (!prevProgram) {\n cache[vertId] = program\n }\n programList.push(program)\n return extend(program, {\n destroy: function () {\n program.refCount--\n if (program.refCount <= 0) {\n gl.deleteProgram(program.program)\n var idx = programList.indexOf(program)\n programList.splice(idx, 1)\n stats.shaderCount--\n }\n // no program is linked to this vert anymore\n if (cache[program.vertId].refCount <= 0) {\n gl.deleteShader(vertShaders[program.vertId])\n delete vertShaders[program.vertId]\n delete programCache[program.fragId][program.vertId]\n }\n // no program is linked to this frag anymore\n if (!Object.keys(programCache[program.fragId]).length) {\n gl.deleteShader(fragShaders[program.fragId])\n delete fragShaders[program.fragId]\n delete programCache[program.fragId]\n }\n }\n })\n },\n\n restore: restoreShaders,\n\n shader: getShader,\n\n frag: -1,\n vert: -1\n }\n}\n\nvar GL_RGBA$3 = 6408\nvar GL_UNSIGNED_BYTE$7 = 5121\nvar GL_PACK_ALIGNMENT = 0x0D05\nvar GL_FLOAT$7 = 0x1406 // 5126\n\nfunction wrapReadPixels (\n gl,\n framebufferState,\n reglPoll,\n context,\n glAttributes,\n extensions,\n limits) {\n function readPixelsImpl (input) {\n var type\n if (framebufferState.next === null) {\n check$1(\n glAttributes.preserveDrawingBuffer,\n 'you must create a webgl context with \"preserveDrawingBuffer\":true in order to read pixels from the drawing buffer')\n type = GL_UNSIGNED_BYTE$7\n } else {\n check$1(\n framebufferState.next.colorAttachments[0].texture !== null,\n 'You cannot read from a renderbuffer')\n type = framebufferState.next.colorAttachments[0].texture._texture.type\n\n if (extensions.oes_texture_float) {\n check$1(\n type === GL_UNSIGNED_BYTE$7 || type === GL_FLOAT$7,\n 'Reading from a framebuffer is only allowed for the types \\'uint8\\' and \\'float\\'')\n\n if (type === GL_FLOAT$7) {\n check$1(limits.readFloat, 'Reading \\'float\\' values is not permitted in your browser. For a fallback, please see: https://www.npmjs.com/package/glsl-read-float')\n }\n } else {\n check$1(\n type === GL_UNSIGNED_BYTE$7,\n 'Reading from a framebuffer is only allowed for the type \\'uint8\\'')\n }\n }\n\n var x = 0\n var y = 0\n var width = context.framebufferWidth\n var height = context.framebufferHeight\n var data = null\n\n if (isTypedArray(input)) {\n data = input\n } else if (input) {\n check$1.type(input, 'object', 'invalid arguments to regl.read()')\n x = input.x | 0\n y = input.y | 0\n check$1(\n x >= 0 && x < context.framebufferWidth,\n 'invalid x offset for regl.read')\n check$1(\n y >= 0 && y < context.framebufferHeight,\n 'invalid y offset for regl.read')\n width = (input.width || (context.framebufferWidth - x)) | 0\n height = (input.height || (context.framebufferHeight - y)) | 0\n data = input.data || null\n }\n\n // sanity check input.data\n if (data) {\n if (type === GL_UNSIGNED_BYTE$7) {\n check$1(\n data instanceof Uint8Array,\n 'buffer must be \\'Uint8Array\\' when reading from a framebuffer of type \\'uint8\\'')\n } else if (type === GL_FLOAT$7) {\n check$1(\n data instanceof Float32Array,\n 'buffer must be \\'Float32Array\\' when reading from a framebuffer of type \\'float\\'')\n }\n }\n\n check$1(\n width > 0 && width + x <= context.framebufferWidth,\n 'invalid width for read pixels')\n check$1(\n height > 0 && height + y <= context.framebufferHeight,\n 'invalid height for read pixels')\n\n // Update WebGL state\n reglPoll()\n\n // Compute size\n var size = width * height * 4\n\n // Allocate data\n if (!data) {\n if (type === GL_UNSIGNED_BYTE$7) {\n data = new Uint8Array(size)\n } else if (type === GL_FLOAT$7) {\n data = data || new Float32Array(size)\n }\n }\n\n // Type check\n check$1.isTypedArray(data, 'data buffer for regl.read() must be a typedarray')\n check$1(data.byteLength >= size, 'data buffer for regl.read() too small')\n\n // Run read pixels\n gl.pixelStorei(GL_PACK_ALIGNMENT, 4)\n gl.readPixels(x, y, width, height, GL_RGBA$3,\n type,\n data)\n\n return data\n }\n\n function readPixelsFBO (options) {\n var result\n framebufferState.setFBO({\n framebuffer: options.framebuffer\n }, function () {\n result = readPixelsImpl(options)\n })\n return result\n }\n\n function readPixels (options) {\n if (!options || !('framebuffer' in options)) {\n return readPixelsImpl(options)\n } else {\n return readPixelsFBO(options)\n }\n }\n\n return readPixels\n}\n\nfunction slice (x) {\n return Array.prototype.slice.call(x)\n}\n\nfunction join (x) {\n return slice(x).join('')\n}\n\nfunction createEnvironment () {\n // Unique variable id counter\n var varCounter = 0\n\n // Linked values are passed from this scope into the generated code block\n // Calling link() passes a value into the generated scope and returns\n // the variable name which it is bound to\n var linkedNames = []\n var linkedValues = []\n function link (value) {\n for (var i = 0; i < linkedValues.length; ++i) {\n if (linkedValues[i] === value) {\n return linkedNames[i]\n }\n }\n\n var name = 'g' + (varCounter++)\n linkedNames.push(name)\n linkedValues.push(value)\n return name\n }\n\n // create a code block\n function block () {\n var code = []\n function push () {\n code.push.apply(code, slice(arguments))\n }\n\n var vars = []\n function def () {\n var name = 'v' + (varCounter++)\n vars.push(name)\n\n if (arguments.length > 0) {\n code.push(name, '=')\n code.push.apply(code, slice(arguments))\n code.push(';')\n }\n\n return name\n }\n\n return extend(push, {\n def: def,\n toString: function () {\n return join([\n (vars.length > 0 ? 'var ' + vars.join(',') + ';' : ''),\n join(code)\n ])\n }\n })\n }\n\n function scope () {\n var entry = block()\n var exit = block()\n\n var entryToString = entry.toString\n var exitToString = exit.toString\n\n function save (object, prop) {\n exit(object, prop, '=', entry.def(object, prop), ';')\n }\n\n return extend(function () {\n entry.apply(entry, slice(arguments))\n }, {\n def: entry.def,\n entry: entry,\n exit: exit,\n save: save,\n set: function (object, prop, value) {\n save(object, prop)\n entry(object, prop, '=', value, ';')\n },\n toString: function () {\n return entryToString() + exitToString()\n }\n })\n }\n\n function conditional () {\n var pred = join(arguments)\n var thenBlock = scope()\n var elseBlock = scope()\n\n var thenToString = thenBlock.toString\n var elseToString = elseBlock.toString\n\n return extend(thenBlock, {\n then: function () {\n thenBlock.apply(thenBlock, slice(arguments))\n return this\n },\n else: function () {\n elseBlock.apply(elseBlock, slice(arguments))\n return this\n },\n toString: function () {\n var elseClause = elseToString()\n if (elseClause) {\n elseClause = 'else{' + elseClause + '}'\n }\n return join([\n 'if(', pred, '){',\n thenToString(),\n '}', elseClause\n ])\n }\n })\n }\n\n // procedure list\n var globalBlock = block()\n var procedures = {}\n function proc (name, count) {\n var args = []\n function arg () {\n var name = 'a' + args.length\n args.push(name)\n return name\n }\n\n count = count || 0\n for (var i = 0; i < count; ++i) {\n arg()\n }\n\n var body = scope()\n var bodyToString = body.toString\n\n var result = procedures[name] = extend(body, {\n arg: arg,\n toString: function () {\n return join([\n 'function(', args.join(), '){',\n bodyToString(),\n '}'\n ])\n }\n })\n\n return result\n }\n\n function compile () {\n var code = ['\"use strict\";',\n globalBlock,\n 'return {']\n Object.keys(procedures).forEach(function (name) {\n code.push('\"', name, '\":', procedures[name].toString(), ',')\n })\n code.push('}')\n var src = join(code)\n .replace(/;/g, ';\\n')\n .replace(/}/g, '}\\n')\n .replace(/{/g, '{\\n')\n var proc = Function.apply(null, linkedNames.concat(src))\n return proc.apply(null, linkedValues)\n }\n\n return {\n global: globalBlock,\n link: link,\n block: block,\n proc: proc,\n scope: scope,\n cond: conditional,\n compile: compile\n }\n}\n\n// \"cute\" names for vector components\nvar CUTE_COMPONENTS = 'xyzw'.split('')\n\nvar GL_UNSIGNED_BYTE$8 = 5121\n\nvar ATTRIB_STATE_POINTER = 1\nvar ATTRIB_STATE_CONSTANT = 2\n\nvar DYN_FUNC$1 = 0\nvar DYN_PROP$1 = 1\nvar DYN_CONTEXT$1 = 2\nvar DYN_STATE$1 = 3\nvar DYN_THUNK = 4\nvar DYN_CONSTANT$1 = 5\nvar DYN_ARRAY$1 = 6\n\nvar S_DITHER = 'dither'\nvar S_BLEND_ENABLE = 'blend.enable'\nvar S_BLEND_COLOR = 'blend.color'\nvar S_BLEND_EQUATION = 'blend.equation'\nvar S_BLEND_FUNC = 'blend.func'\nvar S_DEPTH_ENABLE = 'depth.enable'\nvar S_DEPTH_FUNC = 'depth.func'\nvar S_DEPTH_RANGE = 'depth.range'\nvar S_DEPTH_MASK = 'depth.mask'\nvar S_COLOR_MASK = 'colorMask'\nvar S_CULL_ENABLE = 'cull.enable'\nvar S_CULL_FACE = 'cull.face'\nvar S_FRONT_FACE = 'frontFace'\nvar S_LINE_WIDTH = 'lineWidth'\nvar S_POLYGON_OFFSET_ENABLE = 'polygonOffset.enable'\nvar S_POLYGON_OFFSET_OFFSET = 'polygonOffset.offset'\nvar S_SAMPLE_ALPHA = 'sample.alpha'\nvar S_SAMPLE_ENABLE = 'sample.enable'\nvar S_SAMPLE_COVERAGE = 'sample.coverage'\nvar S_STENCIL_ENABLE = 'stencil.enable'\nvar S_STENCIL_MASK = 'stencil.mask'\nvar S_STENCIL_FUNC = 'stencil.func'\nvar S_STENCIL_OPFRONT = 'stencil.opFront'\nvar S_STENCIL_OPBACK = 'stencil.opBack'\nvar S_SCISSOR_ENABLE = 'scissor.enable'\nvar S_SCISSOR_BOX = 'scissor.box'\nvar S_VIEWPORT = 'viewport'\n\nvar S_PROFILE = 'profile'\n\nvar S_FRAMEBUFFER = 'framebuffer'\nvar S_VERT = 'vert'\nvar S_FRAG = 'frag'\nvar S_ELEMENTS = 'elements'\nvar S_PRIMITIVE = 'primitive'\nvar S_COUNT = 'count'\nvar S_OFFSET = 'offset'\nvar S_INSTANCES = 'instances'\nvar S_VAO = 'vao'\n\nvar SUFFIX_WIDTH = 'Width'\nvar SUFFIX_HEIGHT = 'Height'\n\nvar S_FRAMEBUFFER_WIDTH = S_FRAMEBUFFER + SUFFIX_WIDTH\nvar S_FRAMEBUFFER_HEIGHT = S_FRAMEBUFFER + SUFFIX_HEIGHT\nvar S_VIEWPORT_WIDTH = S_VIEWPORT + SUFFIX_WIDTH\nvar S_VIEWPORT_HEIGHT = S_VIEWPORT + SUFFIX_HEIGHT\nvar S_DRAWINGBUFFER = 'drawingBuffer'\nvar S_DRAWINGBUFFER_WIDTH = S_DRAWINGBUFFER + SUFFIX_WIDTH\nvar S_DRAWINGBUFFER_HEIGHT = S_DRAWINGBUFFER + SUFFIX_HEIGHT\n\nvar NESTED_OPTIONS = [\n S_BLEND_FUNC,\n S_BLEND_EQUATION,\n S_STENCIL_FUNC,\n S_STENCIL_OPFRONT,\n S_STENCIL_OPBACK,\n S_SAMPLE_COVERAGE,\n S_VIEWPORT,\n S_SCISSOR_BOX,\n S_POLYGON_OFFSET_OFFSET\n]\n\nvar GL_ARRAY_BUFFER$2 = 34962\nvar GL_ELEMENT_ARRAY_BUFFER$1 = 34963\n\nvar GL_FRAGMENT_SHADER$1 = 35632\nvar GL_VERTEX_SHADER$1 = 35633\n\nvar GL_TEXTURE_2D$3 = 0x0DE1\nvar GL_TEXTURE_CUBE_MAP$2 = 0x8513\n\nvar GL_CULL_FACE = 0x0B44\nvar GL_BLEND = 0x0BE2\nvar GL_DITHER = 0x0BD0\nvar GL_STENCIL_TEST = 0x0B90\nvar GL_DEPTH_TEST = 0x0B71\nvar GL_SCISSOR_TEST = 0x0C11\nvar GL_POLYGON_OFFSET_FILL = 0x8037\nvar GL_SAMPLE_ALPHA_TO_COVERAGE = 0x809E\nvar GL_SAMPLE_COVERAGE = 0x80A0\n\nvar GL_FLOAT$8 = 5126\nvar GL_FLOAT_VEC2 = 35664\nvar GL_FLOAT_VEC3 = 35665\nvar GL_FLOAT_VEC4 = 35666\nvar GL_INT$3 = 5124\nvar GL_INT_VEC2 = 35667\nvar GL_INT_VEC3 = 35668\nvar GL_INT_VEC4 = 35669\nvar GL_BOOL = 35670\nvar GL_BOOL_VEC2 = 35671\nvar GL_BOOL_VEC3 = 35672\nvar GL_BOOL_VEC4 = 35673\nvar GL_FLOAT_MAT2 = 35674\nvar GL_FLOAT_MAT3 = 35675\nvar GL_FLOAT_MAT4 = 35676\nvar GL_SAMPLER_2D = 35678\nvar GL_SAMPLER_CUBE = 35680\n\nvar GL_TRIANGLES$1 = 4\n\nvar GL_FRONT = 1028\nvar GL_BACK = 1029\nvar GL_CW = 0x0900\nvar GL_CCW = 0x0901\nvar GL_MIN_EXT = 0x8007\nvar GL_MAX_EXT = 0x8008\nvar GL_ALWAYS = 519\nvar GL_KEEP = 7680\nvar GL_ZERO = 0\nvar GL_ONE = 1\nvar GL_FUNC_ADD = 0x8006\nvar GL_LESS = 513\n\nvar GL_FRAMEBUFFER$2 = 0x8D40\nvar GL_COLOR_ATTACHMENT0$2 = 0x8CE0\n\nvar blendFuncs = {\n '0': 0,\n '1': 1,\n 'zero': 0,\n 'one': 1,\n 'src color': 768,\n 'one minus src color': 769,\n 'src alpha': 770,\n 'one minus src alpha': 771,\n 'dst color': 774,\n 'one minus dst color': 775,\n 'dst alpha': 772,\n 'one minus dst alpha': 773,\n 'constant color': 32769,\n 'one minus constant color': 32770,\n 'constant alpha': 32771,\n 'one minus constant alpha': 32772,\n 'src alpha saturate': 776\n}\n\n// There are invalid values for srcRGB and dstRGB. See:\n// https://www.khronos.org/registry/webgl/specs/1.0/#6.13\n// https://github.com/KhronosGroup/WebGL/blob/0d3201f5f7ec3c0060bc1f04077461541f1987b9/conformance-suites/1.0.3/conformance/misc/webgl-specific.html#L56\nvar invalidBlendCombinations = [\n 'constant color, constant alpha',\n 'one minus constant color, constant alpha',\n 'constant color, one minus constant alpha',\n 'one minus constant color, one minus constant alpha',\n 'constant alpha, constant color',\n 'constant alpha, one minus constant color',\n 'one minus constant alpha, constant color',\n 'one minus constant alpha, one minus constant color'\n]\n\nvar compareFuncs = {\n 'never': 512,\n 'less': 513,\n '<': 513,\n 'equal': 514,\n '=': 514,\n '==': 514,\n '===': 514,\n 'lequal': 515,\n '<=': 515,\n 'greater': 516,\n '>': 516,\n 'notequal': 517,\n '!=': 517,\n '!==': 517,\n 'gequal': 518,\n '>=': 518,\n 'always': 519\n}\n\nvar stencilOps = {\n '0': 0,\n 'zero': 0,\n 'keep': 7680,\n 'replace': 7681,\n 'increment': 7682,\n 'decrement': 7683,\n 'increment wrap': 34055,\n 'decrement wrap': 34056,\n 'invert': 5386\n}\n\nvar shaderType = {\n 'frag': GL_FRAGMENT_SHADER$1,\n 'vert': GL_VERTEX_SHADER$1\n}\n\nvar orientationType = {\n 'cw': GL_CW,\n 'ccw': GL_CCW\n}\n\nfunction isBufferArgs (x) {\n return Array.isArray(x) ||\n isTypedArray(x) ||\n isNDArrayLike(x)\n}\n\n// Make sure viewport is processed first\nfunction sortState (state) {\n return state.sort(function (a, b) {\n if (a === S_VIEWPORT) {\n return -1\n } else if (b === S_VIEWPORT) {\n return 1\n }\n return (a < b) ? -1 : 1\n })\n}\n\nfunction Declaration (thisDep, contextDep, propDep, append) {\n this.thisDep = thisDep\n this.contextDep = contextDep\n this.propDep = propDep\n this.append = append\n}\n\nfunction isStatic (decl) {\n return decl && !(decl.thisDep || decl.contextDep || decl.propDep)\n}\n\nfunction createStaticDecl (append) {\n return new Declaration(false, false, false, append)\n}\n\nfunction createDynamicDecl (dyn, append) {\n var type = dyn.type\n if (type === DYN_FUNC$1) {\n var numArgs = dyn.data.length\n return new Declaration(\n true,\n numArgs >= 1,\n numArgs >= 2,\n append)\n } else if (type === DYN_THUNK) {\n var data = dyn.data\n return new Declaration(\n data.thisDep,\n data.contextDep,\n data.propDep,\n append)\n } else if (type === DYN_CONSTANT$1) {\n return new Declaration(\n false,\n false,\n false,\n append)\n } else if (type === DYN_ARRAY$1) {\n var thisDep = false\n var contextDep = false\n var propDep = false\n for (var i = 0; i < dyn.data.length; ++i) {\n var subDyn = dyn.data[i]\n if (subDyn.type === DYN_PROP$1) {\n propDep = true\n } else if (subDyn.type === DYN_CONTEXT$1) {\n contextDep = true\n } else if (subDyn.type === DYN_STATE$1) {\n thisDep = true\n } else if (subDyn.type === DYN_FUNC$1) {\n thisDep = true\n var subArgs = subDyn.data\n if (subArgs >= 1) {\n contextDep = true\n }\n if (subArgs >= 2) {\n propDep = true\n }\n } else if (subDyn.type === DYN_THUNK) {\n thisDep = thisDep || subDyn.data.thisDep\n contextDep = contextDep || subDyn.data.contextDep\n propDep = propDep || subDyn.data.propDep\n }\n }\n return new Declaration(\n thisDep,\n contextDep,\n propDep,\n append)\n } else {\n return new Declaration(\n type === DYN_STATE$1,\n type === DYN_CONTEXT$1,\n type === DYN_PROP$1,\n append)\n }\n}\n\nvar SCOPE_DECL = new Declaration(false, false, false, function () {})\n\nfunction reglCore (\n gl,\n stringStore,\n extensions,\n limits,\n bufferState,\n elementState,\n textureState,\n framebufferState,\n uniformState,\n attributeState,\n shaderState,\n drawState,\n contextState,\n timer,\n config) {\n var AttributeRecord = attributeState.Record\n\n var blendEquations = {\n 'add': 32774,\n 'subtract': 32778,\n 'reverse subtract': 32779\n }\n if (extensions.ext_blend_minmax) {\n blendEquations.min = GL_MIN_EXT\n blendEquations.max = GL_MAX_EXT\n }\n\n var extInstancing = extensions.angle_instanced_arrays\n var extDrawBuffers = extensions.webgl_draw_buffers\n\n // ===================================================\n // ===================================================\n // WEBGL STATE\n // ===================================================\n // ===================================================\n var currentState = {\n dirty: true,\n profile: config.profile\n }\n var nextState = {}\n var GL_STATE_NAMES = []\n var GL_FLAGS = {}\n var GL_VARIABLES = {}\n\n function propName (name) {\n return name.replace('.', '_')\n }\n\n function stateFlag (sname, cap, init) {\n var name = propName(sname)\n GL_STATE_NAMES.push(sname)\n nextState[name] = currentState[name] = !!init\n GL_FLAGS[name] = cap\n }\n\n function stateVariable (sname, func, init) {\n var name = propName(sname)\n GL_STATE_NAMES.push(sname)\n if (Array.isArray(init)) {\n currentState[name] = init.slice()\n nextState[name] = init.slice()\n } else {\n currentState[name] = nextState[name] = init\n }\n GL_VARIABLES[name] = func\n }\n\n // Dithering\n stateFlag(S_DITHER, GL_DITHER)\n\n // Blending\n stateFlag(S_BLEND_ENABLE, GL_BLEND)\n stateVariable(S_BLEND_COLOR, 'blendColor', [0, 0, 0, 0])\n stateVariable(S_BLEND_EQUATION, 'blendEquationSeparate',\n [GL_FUNC_ADD, GL_FUNC_ADD])\n stateVariable(S_BLEND_FUNC, 'blendFuncSeparate',\n [GL_ONE, GL_ZERO, GL_ONE, GL_ZERO])\n\n // Depth\n stateFlag(S_DEPTH_ENABLE, GL_DEPTH_TEST, true)\n stateVariable(S_DEPTH_FUNC, 'depthFunc', GL_LESS)\n stateVariable(S_DEPTH_RANGE, 'depthRange', [0, 1])\n stateVariable(S_DEPTH_MASK, 'depthMask', true)\n\n // Color mask\n stateVariable(S_COLOR_MASK, S_COLOR_MASK, [true, true, true, true])\n\n // Face culling\n stateFlag(S_CULL_ENABLE, GL_CULL_FACE)\n stateVariable(S_CULL_FACE, 'cullFace', GL_BACK)\n\n // Front face orientation\n stateVariable(S_FRONT_FACE, S_FRONT_FACE, GL_CCW)\n\n // Line width\n stateVariable(S_LINE_WIDTH, S_LINE_WIDTH, 1)\n\n // Polygon offset\n stateFlag(S_POLYGON_OFFSET_ENABLE, GL_POLYGON_OFFSET_FILL)\n stateVariable(S_POLYGON_OFFSET_OFFSET, 'polygonOffset', [0, 0])\n\n // Sample coverage\n stateFlag(S_SAMPLE_ALPHA, GL_SAMPLE_ALPHA_TO_COVERAGE)\n stateFlag(S_SAMPLE_ENABLE, GL_SAMPLE_COVERAGE)\n stateVariable(S_SAMPLE_COVERAGE, 'sampleCoverage', [1, false])\n\n // Stencil\n stateFlag(S_STENCIL_ENABLE, GL_STENCIL_TEST)\n stateVariable(S_STENCIL_MASK, 'stencilMask', -1)\n stateVariable(S_STENCIL_FUNC, 'stencilFunc', [GL_ALWAYS, 0, -1])\n stateVariable(S_STENCIL_OPFRONT, 'stencilOpSeparate',\n [GL_FRONT, GL_KEEP, GL_KEEP, GL_KEEP])\n stateVariable(S_STENCIL_OPBACK, 'stencilOpSeparate',\n [GL_BACK, GL_KEEP, GL_KEEP, GL_KEEP])\n\n // Scissor\n stateFlag(S_SCISSOR_ENABLE, GL_SCISSOR_TEST)\n stateVariable(S_SCISSOR_BOX, 'scissor',\n [0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight])\n\n // Viewport\n stateVariable(S_VIEWPORT, S_VIEWPORT,\n [0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight])\n\n // ===================================================\n // ===================================================\n // ENVIRONMENT\n // ===================================================\n // ===================================================\n var sharedState = {\n gl: gl,\n context: contextState,\n strings: stringStore,\n next: nextState,\n current: currentState,\n draw: drawState,\n elements: elementState,\n buffer: bufferState,\n shader: shaderState,\n attributes: attributeState.state,\n vao: attributeState,\n uniforms: uniformState,\n framebuffer: framebufferState,\n extensions: extensions,\n\n timer: timer,\n isBufferArgs: isBufferArgs\n }\n\n var sharedConstants = {\n primTypes: primTypes,\n compareFuncs: compareFuncs,\n blendFuncs: blendFuncs,\n blendEquations: blendEquations,\n stencilOps: stencilOps,\n glTypes: glTypes,\n orientationType: orientationType\n }\n\n check$1.optional(function () {\n sharedState.isArrayLike = isArrayLike\n })\n\n if (extDrawBuffers) {\n sharedConstants.backBuffer = [GL_BACK]\n sharedConstants.drawBuffer = loop(limits.maxDrawbuffers, function (i) {\n if (i === 0) {\n return [0]\n }\n return loop(i, function (j) {\n return GL_COLOR_ATTACHMENT0$2 + j\n })\n })\n }\n\n var drawCallCounter = 0\n function createREGLEnvironment () {\n var env = createEnvironment()\n var link = env.link\n var global = env.global\n env.id = drawCallCounter++\n\n env.batchId = '0'\n\n // link shared state\n var SHARED = link(sharedState)\n var shared = env.shared = {\n props: 'a0'\n }\n Object.keys(sharedState).forEach(function (prop) {\n shared[prop] = global.def(SHARED, '.', prop)\n })\n\n // Inject runtime assertion stuff for debug builds\n check$1.optional(function () {\n env.CHECK = link(check$1)\n env.commandStr = check$1.guessCommand()\n env.command = link(env.commandStr)\n env.assert = function (block, pred, message) {\n block(\n 'if(!(', pred, '))',\n this.CHECK, '.commandRaise(', link(message), ',', this.command, ');')\n }\n\n sharedConstants.invalidBlendCombinations = invalidBlendCombinations\n })\n\n // Copy GL state variables over\n var nextVars = env.next = {}\n var currentVars = env.current = {}\n Object.keys(GL_VARIABLES).forEach(function (variable) {\n if (Array.isArray(currentState[variable])) {\n nextVars[variable] = global.def(shared.next, '.', variable)\n currentVars[variable] = global.def(shared.current, '.', variable)\n }\n })\n\n // Initialize shared constants\n var constants = env.constants = {}\n Object.keys(sharedConstants).forEach(function (name) {\n constants[name] = global.def(JSON.stringify(sharedConstants[name]))\n })\n\n // Helper function for calling a block\n env.invoke = function (block, x) {\n switch (x.type) {\n case DYN_FUNC$1:\n var argList = [\n 'this',\n shared.context,\n shared.props,\n env.batchId\n ]\n return block.def(\n link(x.data), '.call(',\n argList.slice(0, Math.max(x.data.length + 1, 4)),\n ')')\n case DYN_PROP$1:\n return block.def(shared.props, x.data)\n case DYN_CONTEXT$1:\n return block.def(shared.context, x.data)\n case DYN_STATE$1:\n return block.def('this', x.data)\n case DYN_THUNK:\n x.data.append(env, block)\n return x.data.ref\n case DYN_CONSTANT$1:\n return x.data.toString()\n case DYN_ARRAY$1:\n return x.data.map(function (y) {\n return env.invoke(block, y)\n })\n }\n }\n\n env.attribCache = {}\n\n var scopeAttribs = {}\n env.scopeAttrib = function (name) {\n var id = stringStore.id(name)\n if (id in scopeAttribs) {\n return scopeAttribs[id]\n }\n var binding = attributeState.scope[id]\n if (!binding) {\n binding = attributeState.scope[id] = new AttributeRecord()\n }\n var result = scopeAttribs[id] = link(binding)\n return result\n }\n\n return env\n }\n\n // ===================================================\n // ===================================================\n // PARSING\n // ===================================================\n // ===================================================\n function parseProfile (options) {\n var staticOptions = options.static\n var dynamicOptions = options.dynamic\n\n var profileEnable\n if (S_PROFILE in staticOptions) {\n var value = !!staticOptions[S_PROFILE]\n profileEnable = createStaticDecl(function (env, scope) {\n return value\n })\n profileEnable.enable = value\n } else if (S_PROFILE in dynamicOptions) {\n var dyn = dynamicOptions[S_PROFILE]\n profileEnable = createDynamicDecl(dyn, function (env, scope) {\n return env.invoke(scope, dyn)\n })\n }\n\n return profileEnable\n }\n\n function parseFramebuffer (options, env) {\n var staticOptions = options.static\n var dynamicOptions = options.dynamic\n\n if (S_FRAMEBUFFER in staticOptions) {\n var framebuffer = staticOptions[S_FRAMEBUFFER]\n if (framebuffer) {\n framebuffer = framebufferState.getFramebuffer(framebuffer)\n check$1.command(framebuffer, 'invalid framebuffer object')\n return createStaticDecl(function (env, block) {\n var FRAMEBUFFER = env.link(framebuffer)\n var shared = env.shared\n block.set(\n shared.framebuffer,\n '.next',\n FRAMEBUFFER)\n var CONTEXT = shared.context\n block.set(\n CONTEXT,\n '.' + S_FRAMEBUFFER_WIDTH,\n FRAMEBUFFER + '.width')\n block.set(\n CONTEXT,\n '.' + S_FRAMEBUFFER_HEIGHT,\n FRAMEBUFFER + '.height')\n return FRAMEBUFFER\n })\n } else {\n return createStaticDecl(function (env, scope) {\n var shared = env.shared\n scope.set(\n shared.framebuffer,\n '.next',\n 'null')\n var CONTEXT = shared.context\n scope.set(\n CONTEXT,\n '.' + S_FRAMEBUFFER_WIDTH,\n CONTEXT + '.' + S_DRAWINGBUFFER_WIDTH)\n scope.set(\n CONTEXT,\n '.' + S_FRAMEBUFFER_HEIGHT,\n CONTEXT + '.' + S_DRAWINGBUFFER_HEIGHT)\n return 'null'\n })\n }\n } else if (S_FRAMEBUFFER in dynamicOptions) {\n var dyn = dynamicOptions[S_FRAMEBUFFER]\n return createDynamicDecl(dyn, function (env, scope) {\n var FRAMEBUFFER_FUNC = env.invoke(scope, dyn)\n var shared = env.shared\n var FRAMEBUFFER_STATE = shared.framebuffer\n var FRAMEBUFFER = scope.def(\n FRAMEBUFFER_STATE, '.getFramebuffer(', FRAMEBUFFER_FUNC, ')')\n\n check$1.optional(function () {\n env.assert(scope,\n '!' + FRAMEBUFFER_FUNC + '||' + FRAMEBUFFER,\n 'invalid framebuffer object')\n })\n\n scope.set(\n FRAMEBUFFER_STATE,\n '.next',\n FRAMEBUFFER)\n var CONTEXT = shared.context\n scope.set(\n CONTEXT,\n '.' + S_FRAMEBUFFER_WIDTH,\n FRAMEBUFFER + '?' + FRAMEBUFFER + '.width:' +\n CONTEXT + '.' + S_DRAWINGBUFFER_WIDTH)\n scope.set(\n CONTEXT,\n '.' + S_FRAMEBUFFER_HEIGHT,\n FRAMEBUFFER +\n '?' + FRAMEBUFFER + '.height:' +\n CONTEXT + '.' + S_DRAWINGBUFFER_HEIGHT)\n return FRAMEBUFFER\n })\n } else {\n return null\n }\n }\n\n function parseViewportScissor (options, framebuffer, env) {\n var staticOptions = options.static\n var dynamicOptions = options.dynamic\n\n function parseBox (param) {\n if (param in staticOptions) {\n var box = staticOptions[param]\n check$1.commandType(box, 'object', 'invalid ' + param, env.commandStr)\n\n var isStatic = true\n var x = box.x | 0\n var y = box.y | 0\n var w, h\n if ('width' in box) {\n w = box.width | 0\n check$1.command(w >= 0, 'invalid ' + param, env.commandStr)\n } else {\n isStatic = false\n }\n if ('height' in box) {\n h = box.height | 0\n check$1.command(h >= 0, 'invalid ' + param, env.commandStr)\n } else {\n isStatic = false\n }\n\n return new Declaration(\n !isStatic && framebuffer && framebuffer.thisDep,\n !isStatic && framebuffer && framebuffer.contextDep,\n !isStatic && framebuffer && framebuffer.propDep,\n function (env, scope) {\n var CONTEXT = env.shared.context\n var BOX_W = w\n if (!('width' in box)) {\n BOX_W = scope.def(CONTEXT, '.', S_FRAMEBUFFER_WIDTH, '-', x)\n }\n var BOX_H = h\n if (!('height' in box)) {\n BOX_H = scope.def(CONTEXT, '.', S_FRAMEBUFFER_HEIGHT, '-', y)\n }\n return [x, y, BOX_W, BOX_H]\n })\n } else if (param in dynamicOptions) {\n var dynBox = dynamicOptions[param]\n var result = createDynamicDecl(dynBox, function (env, scope) {\n var BOX = env.invoke(scope, dynBox)\n\n check$1.optional(function () {\n env.assert(scope,\n BOX + '&&typeof ' + BOX + '===\"object\"',\n 'invalid ' + param)\n })\n\n var CONTEXT = env.shared.context\n var BOX_X = scope.def(BOX, '.x|0')\n var BOX_Y = scope.def(BOX, '.y|0')\n var BOX_W = scope.def(\n '\"width\" in ', BOX, '?', BOX, '.width|0:',\n '(', CONTEXT, '.', S_FRAMEBUFFER_WIDTH, '-', BOX_X, ')')\n var BOX_H = scope.def(\n '\"height\" in ', BOX, '?', BOX, '.height|0:',\n '(', CONTEXT, '.', S_FRAMEBUFFER_HEIGHT, '-', BOX_Y, ')')\n\n check$1.optional(function () {\n env.assert(scope,\n BOX_W + '>=0&&' +\n BOX_H + '>=0',\n 'invalid ' + param)\n })\n\n return [BOX_X, BOX_Y, BOX_W, BOX_H]\n })\n if (framebuffer) {\n result.thisDep = result.thisDep || framebuffer.thisDep\n result.contextDep = result.contextDep || framebuffer.contextDep\n result.propDep = result.propDep || framebuffer.propDep\n }\n return result\n } else if (framebuffer) {\n return new Declaration(\n framebuffer.thisDep,\n framebuffer.contextDep,\n framebuffer.propDep,\n function (env, scope) {\n var CONTEXT = env.shared.context\n return [\n 0, 0,\n scope.def(CONTEXT, '.', S_FRAMEBUFFER_WIDTH),\n scope.def(CONTEXT, '.', S_FRAMEBUFFER_HEIGHT)]\n })\n } else {\n return null\n }\n }\n\n var viewport = parseBox(S_VIEWPORT)\n\n if (viewport) {\n var prevViewport = viewport\n viewport = new Declaration(\n viewport.thisDep,\n viewport.contextDep,\n viewport.propDep,\n function (env, scope) {\n var VIEWPORT = prevViewport.append(env, scope)\n var CONTEXT = env.shared.context\n scope.set(\n CONTEXT,\n '.' + S_VIEWPORT_WIDTH,\n VIEWPORT[2])\n scope.set(\n CONTEXT,\n '.' + S_VIEWPORT_HEIGHT,\n VIEWPORT[3])\n return VIEWPORT\n })\n }\n\n return {\n viewport: viewport,\n scissor_box: parseBox(S_SCISSOR_BOX)\n }\n }\n\n function parseAttribLocations (options, attributes) {\n var staticOptions = options.static\n var staticProgram =\n typeof staticOptions[S_FRAG] === 'string' &&\n typeof staticOptions[S_VERT] === 'string'\n if (staticProgram) {\n if (Object.keys(attributes.dynamic).length > 0) {\n return null\n }\n var staticAttributes = attributes.static\n var sAttributes = Object.keys(staticAttributes)\n if (sAttributes.length > 0 && typeof staticAttributes[sAttributes[0]] === 'number') {\n var bindings = []\n for (var i = 0; i < sAttributes.length; ++i) {\n check$1(typeof staticAttributes[sAttributes[i]] === 'number', 'must specify all vertex attribute locations when using vaos')\n bindings.push([staticAttributes[sAttributes[i]] | 0, sAttributes[i]])\n }\n return bindings\n }\n }\n return null\n }\n\n function parseProgram (options, env, attribLocations) {\n var staticOptions = options.static\n var dynamicOptions = options.dynamic\n\n function parseShader (name) {\n if (name in staticOptions) {\n var id = stringStore.id(staticOptions[name])\n check$1.optional(function () {\n shaderState.shader(shaderType[name], id, check$1.guessCommand())\n })\n var result = createStaticDecl(function () {\n return id\n })\n result.id = id\n return result\n } else if (name in dynamicOptions) {\n var dyn = dynamicOptions[name]\n return createDynamicDecl(dyn, function (env, scope) {\n var str = env.invoke(scope, dyn)\n var id = scope.def(env.shared.strings, '.id(', str, ')')\n check$1.optional(function () {\n scope(\n env.shared.shader, '.shader(',\n shaderType[name], ',',\n id, ',',\n env.command, ');')\n })\n return id\n })\n }\n return null\n }\n\n var frag = parseShader(S_FRAG)\n var vert = parseShader(S_VERT)\n\n var program = null\n var progVar\n if (isStatic(frag) && isStatic(vert)) {\n program = shaderState.program(vert.id, frag.id, null, attribLocations)\n progVar = createStaticDecl(function (env, scope) {\n return env.link(program)\n })\n } else {\n progVar = new Declaration(\n (frag && frag.thisDep) || (vert && vert.thisDep),\n (frag && frag.contextDep) || (vert && vert.contextDep),\n (frag && frag.propDep) || (vert && vert.propDep),\n function (env, scope) {\n var SHADER_STATE = env.shared.shader\n var fragId\n if (frag) {\n fragId = frag.append(env, scope)\n } else {\n fragId = scope.def(SHADER_STATE, '.', S_FRAG)\n }\n var vertId\n if (vert) {\n vertId = vert.append(env, scope)\n } else {\n vertId = scope.def(SHADER_STATE, '.', S_VERT)\n }\n var progDef = SHADER_STATE + '.program(' + vertId + ',' + fragId\n check$1.optional(function () {\n progDef += ',' + env.command\n })\n return scope.def(progDef + ')')\n })\n }\n\n return {\n frag: frag,\n vert: vert,\n progVar: progVar,\n program: program\n }\n }\n\n function parseDraw (options, env) {\n var staticOptions = options.static\n var dynamicOptions = options.dynamic\n\n function parseElements () {\n if (S_ELEMENTS in staticOptions) {\n var elements = staticOptions[S_ELEMENTS]\n if (isBufferArgs(elements)) {\n elements = elementState.getElements(elementState.create(elements, true))\n } else if (elements) {\n elements = elementState.getElements(elements)\n check$1.command(elements, 'invalid elements', env.commandStr)\n }\n var result = createStaticDecl(function (env, scope) {\n if (elements) {\n var result = env.link(elements)\n env.ELEMENTS = result\n return result\n }\n env.ELEMENTS = null\n return null\n })\n result.value = elements\n return result\n } else if (S_ELEMENTS in dynamicOptions) {\n var dyn = dynamicOptions[S_ELEMENTS]\n return createDynamicDecl(dyn, function (env, scope) {\n var shared = env.shared\n\n var IS_BUFFER_ARGS = shared.isBufferArgs\n var ELEMENT_STATE = shared.elements\n\n var elementDefn = env.invoke(scope, dyn)\n var elements = scope.def('null')\n var elementStream = scope.def(IS_BUFFER_ARGS, '(', elementDefn, ')')\n\n var ifte = env.cond(elementStream)\n .then(elements, '=', ELEMENT_STATE, '.createStream(', elementDefn, ');')\n .else(elements, '=', ELEMENT_STATE, '.getElements(', elementDefn, ');')\n\n check$1.optional(function () {\n env.assert(ifte.else,\n '!' + elementDefn + '||' + elements,\n 'invalid elements')\n })\n\n scope.entry(ifte)\n scope.exit(\n env.cond(elementStream)\n .then(ELEMENT_STATE, '.destroyStream(', elements, ');'))\n\n env.ELEMENTS = elements\n\n return elements\n })\n }\n\n return null\n }\n\n var elements = parseElements()\n\n function parsePrimitive () {\n if (S_PRIMITIVE in staticOptions) {\n var primitive = staticOptions[S_PRIMITIVE]\n check$1.commandParameter(primitive, primTypes, 'invalid primitve', env.commandStr)\n return createStaticDecl(function (env, scope) {\n return primTypes[primitive]\n })\n } else if (S_PRIMITIVE in dynamicOptions) {\n var dynPrimitive = dynamicOptions[S_PRIMITIVE]\n return createDynamicDecl(dynPrimitive, function (env, scope) {\n var PRIM_TYPES = env.constants.primTypes\n var prim = env.invoke(scope, dynPrimitive)\n check$1.optional(function () {\n env.assert(scope,\n prim + ' in ' + PRIM_TYPES,\n 'invalid primitive, must be one of ' + Object.keys(primTypes))\n })\n return scope.def(PRIM_TYPES, '[', prim, ']')\n })\n } else if (elements) {\n if (isStatic(elements)) {\n if (elements.value) {\n return createStaticDecl(function (env, scope) {\n return scope.def(env.ELEMENTS, '.primType')\n })\n } else {\n return createStaticDecl(function () {\n return GL_TRIANGLES$1\n })\n }\n } else {\n return new Declaration(\n elements.thisDep,\n elements.contextDep,\n elements.propDep,\n function (env, scope) {\n var elements = env.ELEMENTS\n return scope.def(elements, '?', elements, '.primType:', GL_TRIANGLES$1)\n })\n }\n }\n return null\n }\n\n function parseParam (param, isOffset) {\n if (param in staticOptions) {\n var value = staticOptions[param] | 0\n check$1.command(!isOffset || value >= 0, 'invalid ' + param, env.commandStr)\n return createStaticDecl(function (env, scope) {\n if (isOffset) {\n env.OFFSET = value\n }\n return value\n })\n } else if (param in dynamicOptions) {\n var dynValue = dynamicOptions[param]\n return createDynamicDecl(dynValue, function (env, scope) {\n var result = env.invoke(scope, dynValue)\n if (isOffset) {\n env.OFFSET = result\n check$1.optional(function () {\n env.assert(scope,\n result + '>=0',\n 'invalid ' + param)\n })\n }\n return result\n })\n } else if (isOffset && elements) {\n return createStaticDecl(function (env, scope) {\n env.OFFSET = '0'\n return 0\n })\n }\n return null\n }\n\n var OFFSET = parseParam(S_OFFSET, true)\n\n function parseVertCount () {\n if (S_COUNT in staticOptions) {\n var count = staticOptions[S_COUNT] | 0\n check$1.command(\n typeof count === 'number' && count >= 0, 'invalid vertex count', env.commandStr)\n return createStaticDecl(function () {\n return count\n })\n } else if (S_COUNT in dynamicOptions) {\n var dynCount = dynamicOptions[S_COUNT]\n return createDynamicDecl(dynCount, function (env, scope) {\n var result = env.invoke(scope, dynCount)\n check$1.optional(function () {\n env.assert(scope,\n 'typeof ' + result + '===\"number\"&&' +\n result + '>=0&&' +\n result + '===(' + result + '|0)',\n 'invalid vertex count')\n })\n return result\n })\n } else if (elements) {\n if (isStatic(elements)) {\n if (elements) {\n if (OFFSET) {\n return new Declaration(\n OFFSET.thisDep,\n OFFSET.contextDep,\n OFFSET.propDep,\n function (env, scope) {\n var result = scope.def(\n env.ELEMENTS, '.vertCount-', env.OFFSET)\n\n check$1.optional(function () {\n env.assert(scope,\n result + '>=0',\n 'invalid vertex offset/element buffer too small')\n })\n\n return result\n })\n } else {\n return createStaticDecl(function (env, scope) {\n return scope.def(env.ELEMENTS, '.vertCount')\n })\n }\n } else {\n var result = createStaticDecl(function () {\n return -1\n })\n check$1.optional(function () {\n result.MISSING = true\n })\n return result\n }\n } else {\n var variable = new Declaration(\n elements.thisDep || OFFSET.thisDep,\n elements.contextDep || OFFSET.contextDep,\n elements.propDep || OFFSET.propDep,\n function (env, scope) {\n var elements = env.ELEMENTS\n if (env.OFFSET) {\n return scope.def(elements, '?', elements, '.vertCount-',\n env.OFFSET, ':-1')\n }\n return scope.def(elements, '?', elements, '.vertCount:-1')\n })\n check$1.optional(function () {\n variable.DYNAMIC = true\n })\n return variable\n }\n }\n return null\n }\n\n return {\n elements: elements,\n primitive: parsePrimitive(),\n count: parseVertCount(),\n instances: parseParam(S_INSTANCES, false),\n offset: OFFSET\n }\n }\n\n function parseGLState (options, env) {\n var staticOptions = options.static\n var dynamicOptions = options.dynamic\n\n var STATE = {}\n\n GL_STATE_NAMES.forEach(function (prop) {\n var param = propName(prop)\n\n function parseParam (parseStatic, parseDynamic) {\n if (prop in staticOptions) {\n var value = parseStatic(staticOptions[prop])\n STATE[param] = createStaticDecl(function () {\n return value\n })\n } else if (prop in dynamicOptions) {\n var dyn = dynamicOptions[prop]\n STATE[param] = createDynamicDecl(dyn, function (env, scope) {\n return parseDynamic(env, scope, env.invoke(scope, dyn))\n })\n }\n }\n\n switch (prop) {\n case S_CULL_ENABLE:\n case S_BLEND_ENABLE:\n case S_DITHER:\n case S_STENCIL_ENABLE:\n case S_DEPTH_ENABLE:\n case S_SCISSOR_ENABLE:\n case S_POLYGON_OFFSET_ENABLE:\n case S_SAMPLE_ALPHA:\n case S_SAMPLE_ENABLE:\n case S_DEPTH_MASK:\n return parseParam(\n function (value) {\n check$1.commandType(value, 'boolean', prop, env.commandStr)\n return value\n },\n function (env, scope, value) {\n check$1.optional(function () {\n env.assert(scope,\n 'typeof ' + value + '===\"boolean\"',\n 'invalid flag ' + prop, env.commandStr)\n })\n return value\n })\n\n case S_DEPTH_FUNC:\n return parseParam(\n function (value) {\n check$1.commandParameter(value, compareFuncs, 'invalid ' + prop, env.commandStr)\n return compareFuncs[value]\n },\n function (env, scope, value) {\n var COMPARE_FUNCS = env.constants.compareFuncs\n check$1.optional(function () {\n env.assert(scope,\n value + ' in ' + COMPARE_FUNCS,\n 'invalid ' + prop + ', must be one of ' + Object.keys(compareFuncs))\n })\n return scope.def(COMPARE_FUNCS, '[', value, ']')\n })\n\n case S_DEPTH_RANGE:\n return parseParam(\n function (value) {\n check$1.command(\n isArrayLike(value) &&\n value.length === 2 &&\n typeof value[0] === 'number' &&\n typeof value[1] === 'number' &&\n value[0] <= value[1],\n 'depth range is 2d array',\n env.commandStr)\n return value\n },\n function (env, scope, value) {\n check$1.optional(function () {\n env.assert(scope,\n env.shared.isArrayLike + '(' + value + ')&&' +\n value + '.length===2&&' +\n 'typeof ' + value + '[0]===\"number\"&&' +\n 'typeof ' + value + '[1]===\"number\"&&' +\n value + '[0]<=' + value + '[1]',\n 'depth range must be a 2d array')\n })\n\n var Z_NEAR = scope.def('+', value, '[0]')\n var Z_FAR = scope.def('+', value, '[1]')\n return [Z_NEAR, Z_FAR]\n })\n\n case S_BLEND_FUNC:\n return parseParam(\n function (value) {\n check$1.commandType(value, 'object', 'blend.func', env.commandStr)\n var srcRGB = ('srcRGB' in value ? value.srcRGB : value.src)\n var srcAlpha = ('srcAlpha' in value ? value.srcAlpha : value.src)\n var dstRGB = ('dstRGB' in value ? value.dstRGB : value.dst)\n var dstAlpha = ('dstAlpha' in value ? value.dstAlpha : value.dst)\n check$1.commandParameter(srcRGB, blendFuncs, param + '.srcRGB', env.commandStr)\n check$1.commandParameter(srcAlpha, blendFuncs, param + '.srcAlpha', env.commandStr)\n check$1.commandParameter(dstRGB, blendFuncs, param + '.dstRGB', env.commandStr)\n check$1.commandParameter(dstAlpha, blendFuncs, param + '.dstAlpha', env.commandStr)\n\n check$1.command(\n (invalidBlendCombinations.indexOf(srcRGB + ', ' + dstRGB) === -1),\n 'unallowed blending combination (srcRGB, dstRGB) = (' + srcRGB + ', ' + dstRGB + ')', env.commandStr)\n\n return [\n blendFuncs[srcRGB],\n blendFuncs[dstRGB],\n blendFuncs[srcAlpha],\n blendFuncs[dstAlpha]\n ]\n },\n function (env, scope, value) {\n var BLEND_FUNCS = env.constants.blendFuncs\n\n check$1.optional(function () {\n env.assert(scope,\n value + '&&typeof ' + value + '===\"object\"',\n 'invalid blend func, must be an object')\n })\n\n function read (prefix, suffix) {\n var func = scope.def(\n '\"', prefix, suffix, '\" in ', value,\n '?', value, '.', prefix, suffix,\n ':', value, '.', prefix)\n\n check$1.optional(function () {\n env.assert(scope,\n func + ' in ' + BLEND_FUNCS,\n 'invalid ' + prop + '.' + prefix + suffix + ', must be one of ' + Object.keys(blendFuncs))\n })\n\n return func\n }\n\n var srcRGB = read('src', 'RGB')\n var dstRGB = read('dst', 'RGB')\n\n check$1.optional(function () {\n var INVALID_BLEND_COMBINATIONS = env.constants.invalidBlendCombinations\n\n env.assert(scope,\n INVALID_BLEND_COMBINATIONS +\n '.indexOf(' + srcRGB + '+\", \"+' + dstRGB + ') === -1 ',\n 'unallowed blending combination for (srcRGB, dstRGB)'\n )\n })\n\n var SRC_RGB = scope.def(BLEND_FUNCS, '[', srcRGB, ']')\n var SRC_ALPHA = scope.def(BLEND_FUNCS, '[', read('src', 'Alpha'), ']')\n var DST_RGB = scope.def(BLEND_FUNCS, '[', dstRGB, ']')\n var DST_ALPHA = scope.def(BLEND_FUNCS, '[', read('dst', 'Alpha'), ']')\n\n return [SRC_RGB, DST_RGB, SRC_ALPHA, DST_ALPHA]\n })\n\n case S_BLEND_EQUATION:\n return parseParam(\n function (value) {\n if (typeof value === 'string') {\n check$1.commandParameter(value, blendEquations, 'invalid ' + prop, env.commandStr)\n return [\n blendEquations[value],\n blendEquations[value]\n ]\n } else if (typeof value === 'object') {\n check$1.commandParameter(\n value.rgb, blendEquations, prop + '.rgb', env.commandStr)\n check$1.commandParameter(\n value.alpha, blendEquations, prop + '.alpha', env.commandStr)\n return [\n blendEquations[value.rgb],\n blendEquations[value.alpha]\n ]\n } else {\n check$1.commandRaise('invalid blend.equation', env.commandStr)\n }\n },\n function (env, scope, value) {\n var BLEND_EQUATIONS = env.constants.blendEquations\n\n var RGB = scope.def()\n var ALPHA = scope.def()\n\n var ifte = env.cond('typeof ', value, '===\"string\"')\n\n check$1.optional(function () {\n function checkProp (block, name, value) {\n env.assert(block,\n value + ' in ' + BLEND_EQUATIONS,\n 'invalid ' + name + ', must be one of ' + Object.keys(blendEquations))\n }\n checkProp(ifte.then, prop, value)\n\n env.assert(ifte.else,\n value + '&&typeof ' + value + '===\"object\"',\n 'invalid ' + prop)\n checkProp(ifte.else, prop + '.rgb', value + '.rgb')\n checkProp(ifte.else, prop + '.alpha', value + '.alpha')\n })\n\n ifte.then(\n RGB, '=', ALPHA, '=', BLEND_EQUATIONS, '[', value, '];')\n ifte.else(\n RGB, '=', BLEND_EQUATIONS, '[', value, '.rgb];',\n ALPHA, '=', BLEND_EQUATIONS, '[', value, '.alpha];')\n\n scope(ifte)\n\n return [RGB, ALPHA]\n })\n\n case S_BLEND_COLOR:\n return parseParam(\n function (value) {\n check$1.command(\n isArrayLike(value) &&\n value.length === 4,\n 'blend.color must be a 4d array', env.commandStr)\n return loop(4, function (i) {\n return +value[i]\n })\n },\n function (env, scope, value) {\n check$1.optional(function () {\n env.assert(scope,\n env.shared.isArrayLike + '(' + value + ')&&' +\n value + '.length===4',\n 'blend.color must be a 4d array')\n })\n return loop(4, function (i) {\n return scope.def('+', value, '[', i, ']')\n })\n })\n\n case S_STENCIL_MASK:\n return parseParam(\n function (value) {\n check$1.commandType(value, 'number', param, env.commandStr)\n return value | 0\n },\n function (env, scope, value) {\n check$1.optional(function () {\n env.assert(scope,\n 'typeof ' + value + '===\"number\"',\n 'invalid stencil.mask')\n })\n return scope.def(value, '|0')\n })\n\n case S_STENCIL_FUNC:\n return parseParam(\n function (value) {\n check$1.commandType(value, 'object', param, env.commandStr)\n var cmp = value.cmp || 'keep'\n var ref = value.ref || 0\n var mask = 'mask' in value ? value.mask : -1\n check$1.commandParameter(cmp, compareFuncs, prop + '.cmp', env.commandStr)\n check$1.commandType(ref, 'number', prop + '.ref', env.commandStr)\n check$1.commandType(mask, 'number', prop + '.mask', env.commandStr)\n return [\n compareFuncs[cmp],\n ref,\n mask\n ]\n },\n function (env, scope, value) {\n var COMPARE_FUNCS = env.constants.compareFuncs\n check$1.optional(function () {\n function assert () {\n env.assert(scope,\n Array.prototype.join.call(arguments, ''),\n 'invalid stencil.func')\n }\n assert(value + '&&typeof ', value, '===\"object\"')\n assert('!(\"cmp\" in ', value, ')||(',\n value, '.cmp in ', COMPARE_FUNCS, ')')\n })\n var cmp = scope.def(\n '\"cmp\" in ', value,\n '?', COMPARE_FUNCS, '[', value, '.cmp]',\n ':', GL_KEEP)\n var ref = scope.def(value, '.ref|0')\n var mask = scope.def(\n '\"mask\" in ', value,\n '?', value, '.mask|0:-1')\n return [cmp, ref, mask]\n })\n\n case S_STENCIL_OPFRONT:\n case S_STENCIL_OPBACK:\n return parseParam(\n function (value) {\n check$1.commandType(value, 'object', param, env.commandStr)\n var fail = value.fail || 'keep'\n var zfail = value.zfail || 'keep'\n var zpass = value.zpass || 'keep'\n check$1.commandParameter(fail, stencilOps, prop + '.fail', env.commandStr)\n check$1.commandParameter(zfail, stencilOps, prop + '.zfail', env.commandStr)\n check$1.commandParameter(zpass, stencilOps, prop + '.zpass', env.commandStr)\n return [\n prop === S_STENCIL_OPBACK ? GL_BACK : GL_FRONT,\n stencilOps[fail],\n stencilOps[zfail],\n stencilOps[zpass]\n ]\n },\n function (env, scope, value) {\n var STENCIL_OPS = env.constants.stencilOps\n\n check$1.optional(function () {\n env.assert(scope,\n value + '&&typeof ' + value + '===\"object\"',\n 'invalid ' + prop)\n })\n\n function read (name) {\n check$1.optional(function () {\n env.assert(scope,\n '!(\"' + name + '\" in ' + value + ')||' +\n '(' + value + '.' + name + ' in ' + STENCIL_OPS + ')',\n 'invalid ' + prop + '.' + name + ', must be one of ' + Object.keys(stencilOps))\n })\n\n return scope.def(\n '\"', name, '\" in ', value,\n '?', STENCIL_OPS, '[', value, '.', name, ']:',\n GL_KEEP)\n }\n\n return [\n prop === S_STENCIL_OPBACK ? GL_BACK : GL_FRONT,\n read('fail'),\n read('zfail'),\n read('zpass')\n ]\n })\n\n case S_POLYGON_OFFSET_OFFSET:\n return parseParam(\n function (value) {\n check$1.commandType(value, 'object', param, env.commandStr)\n var factor = value.factor | 0\n var units = value.units | 0\n check$1.commandType(factor, 'number', param + '.factor', env.commandStr)\n check$1.commandType(units, 'number', param + '.units', env.commandStr)\n return [factor, units]\n },\n function (env, scope, value) {\n check$1.optional(function () {\n env.assert(scope,\n value + '&&typeof ' + value + '===\"object\"',\n 'invalid ' + prop)\n })\n\n var FACTOR = scope.def(value, '.factor|0')\n var UNITS = scope.def(value, '.units|0')\n\n return [FACTOR, UNITS]\n })\n\n case S_CULL_FACE:\n return parseParam(\n function (value) {\n var face = 0\n if (value === 'front') {\n face = GL_FRONT\n } else if (value === 'back') {\n face = GL_BACK\n }\n check$1.command(!!face, param, env.commandStr)\n return face\n },\n function (env, scope, value) {\n check$1.optional(function () {\n env.assert(scope,\n value + '===\"front\"||' +\n value + '===\"back\"',\n 'invalid cull.face')\n })\n return scope.def(value, '===\"front\"?', GL_FRONT, ':', GL_BACK)\n })\n\n case S_LINE_WIDTH:\n return parseParam(\n function (value) {\n check$1.command(\n typeof value === 'number' &&\n value >= limits.lineWidthDims[0] &&\n value <= limits.lineWidthDims[1],\n 'invalid line width, must be a positive number between ' +\n limits.lineWidthDims[0] + ' and ' + limits.lineWidthDims[1], env.commandStr)\n return value\n },\n function (env, scope, value) {\n check$1.optional(function () {\n env.assert(scope,\n 'typeof ' + value + '===\"number\"&&' +\n value + '>=' + limits.lineWidthDims[0] + '&&' +\n value + '<=' + limits.lineWidthDims[1],\n 'invalid line width')\n })\n\n return value\n })\n\n case S_FRONT_FACE:\n return parseParam(\n function (value) {\n check$1.commandParameter(value, orientationType, param, env.commandStr)\n return orientationType[value]\n },\n function (env, scope, value) {\n check$1.optional(function () {\n env.assert(scope,\n value + '===\"cw\"||' +\n value + '===\"ccw\"',\n 'invalid frontFace, must be one of cw,ccw')\n })\n return scope.def(value + '===\"cw\"?' + GL_CW + ':' + GL_CCW)\n })\n\n case S_COLOR_MASK:\n return parseParam(\n function (value) {\n check$1.command(\n isArrayLike(value) && value.length === 4,\n 'color.mask must be length 4 array', env.commandStr)\n return value.map(function (v) { return !!v })\n },\n function (env, scope, value) {\n check$1.optional(function () {\n env.assert(scope,\n env.shared.isArrayLike + '(' + value + ')&&' +\n value + '.length===4',\n 'invalid color.mask')\n })\n return loop(4, function (i) {\n return '!!' + value + '[' + i + ']'\n })\n })\n\n case S_SAMPLE_COVERAGE:\n return parseParam(\n function (value) {\n check$1.command(typeof value === 'object' && value, param, env.commandStr)\n var sampleValue = 'value' in value ? value.value : 1\n var sampleInvert = !!value.invert\n check$1.command(\n typeof sampleValue === 'number' &&\n sampleValue >= 0 && sampleValue <= 1,\n 'sample.coverage.value must be a number between 0 and 1', env.commandStr)\n return [sampleValue, sampleInvert]\n },\n function (env, scope, value) {\n check$1.optional(function () {\n env.assert(scope,\n value + '&&typeof ' + value + '===\"object\"',\n 'invalid sample.coverage')\n })\n var VALUE = scope.def(\n '\"value\" in ', value, '?+', value, '.value:1')\n var INVERT = scope.def('!!', value, '.invert')\n return [VALUE, INVERT]\n })\n }\n })\n\n return STATE\n }\n\n function parseUniforms (uniforms, env) {\n var staticUniforms = uniforms.static\n var dynamicUniforms = uniforms.dynamic\n\n var UNIFORMS = {}\n\n Object.keys(staticUniforms).forEach(function (name) {\n var value = staticUniforms[name]\n var result\n if (typeof value === 'number' ||\n typeof value === 'boolean') {\n result = createStaticDecl(function () {\n return value\n })\n } else if (typeof value === 'function') {\n var reglType = value._reglType\n if (reglType === 'texture2d' ||\n reglType === 'textureCube') {\n result = createStaticDecl(function (env) {\n return env.link(value)\n })\n } else if (reglType === 'framebuffer' ||\n reglType === 'framebufferCube') {\n check$1.command(value.color.length > 0,\n 'missing color attachment for framebuffer sent to uniform \"' + name + '\"', env.commandStr)\n result = createStaticDecl(function (env) {\n return env.link(value.color[0])\n })\n } else {\n check$1.commandRaise('invalid data for uniform \"' + name + '\"', env.commandStr)\n }\n } else if (isArrayLike(value)) {\n result = createStaticDecl(function (env) {\n var ITEM = env.global.def('[',\n loop(value.length, function (i) {\n check$1.command(\n typeof value[i] === 'number' ||\n typeof value[i] === 'boolean',\n 'invalid uniform ' + name, env.commandStr)\n return value[i]\n }), ']')\n return ITEM\n })\n } else {\n check$1.commandRaise('invalid or missing data for uniform \"' + name + '\"', env.commandStr)\n }\n result.value = value\n UNIFORMS[name] = result\n })\n\n Object.keys(dynamicUniforms).forEach(function (key) {\n var dyn = dynamicUniforms[key]\n UNIFORMS[key] = createDynamicDecl(dyn, function (env, scope) {\n return env.invoke(scope, dyn)\n })\n })\n\n return UNIFORMS\n }\n\n function parseAttributes (attributes, env) {\n var staticAttributes = attributes.static\n var dynamicAttributes = attributes.dynamic\n\n var attributeDefs = {}\n\n Object.keys(staticAttributes).forEach(function (attribute) {\n var value = staticAttributes[attribute]\n var id = stringStore.id(attribute)\n\n var record = new AttributeRecord()\n if (isBufferArgs(value)) {\n record.state = ATTRIB_STATE_POINTER\n record.buffer = bufferState.getBuffer(\n bufferState.create(value, GL_ARRAY_BUFFER$2, false, true))\n record.type = 0\n } else {\n var buffer = bufferState.getBuffer(value)\n if (buffer) {\n record.state = ATTRIB_STATE_POINTER\n record.buffer = buffer\n record.type = 0\n } else {\n check$1.command(typeof value === 'object' && value,\n 'invalid data for attribute ' + attribute, env.commandStr)\n if ('constant' in value) {\n var constant = value.constant\n record.buffer = 'null'\n record.state = ATTRIB_STATE_CONSTANT\n if (typeof constant === 'number') {\n record.x = constant\n } else {\n check$1.command(\n isArrayLike(constant) &&\n constant.length > 0 &&\n constant.length <= 4,\n 'invalid constant for attribute ' + attribute, env.commandStr)\n CUTE_COMPONENTS.forEach(function (c, i) {\n if (i < constant.length) {\n record[c] = constant[i]\n }\n })\n }\n } else {\n if (isBufferArgs(value.buffer)) {\n buffer = bufferState.getBuffer(\n bufferState.create(value.buffer, GL_ARRAY_BUFFER$2, false, true))\n } else {\n buffer = bufferState.getBuffer(value.buffer)\n }\n check$1.command(!!buffer, 'missing buffer for attribute \"' + attribute + '\"', env.commandStr)\n\n var offset = value.offset | 0\n check$1.command(offset >= 0,\n 'invalid offset for attribute \"' + attribute + '\"', env.commandStr)\n\n var stride = value.stride | 0\n check$1.command(stride >= 0 && stride < 256,\n 'invalid stride for attribute \"' + attribute + '\", must be integer betweeen [0, 255]', env.commandStr)\n\n var size = value.size | 0\n check$1.command(!('size' in value) || (size > 0 && size <= 4),\n 'invalid size for attribute \"' + attribute + '\", must be 1,2,3,4', env.commandStr)\n\n var normalized = !!value.normalized\n\n var type = 0\n if ('type' in value) {\n check$1.commandParameter(\n value.type, glTypes,\n 'invalid type for attribute ' + attribute, env.commandStr)\n type = glTypes[value.type]\n }\n\n var divisor = value.divisor | 0\n if ('divisor' in value) {\n check$1.command(divisor === 0 || extInstancing,\n 'cannot specify divisor for attribute \"' + attribute + '\", instancing not supported', env.commandStr)\n check$1.command(divisor >= 0,\n 'invalid divisor for attribute \"' + attribute + '\"', env.commandStr)\n }\n\n check$1.optional(function () {\n var command = env.commandStr\n\n var VALID_KEYS = [\n 'buffer',\n 'offset',\n 'divisor',\n 'normalized',\n 'type',\n 'size',\n 'stride'\n ]\n\n Object.keys(value).forEach(function (prop) {\n check$1.command(\n VALID_KEYS.indexOf(prop) >= 0,\n 'unknown parameter \"' + prop + '\" for attribute pointer \"' + attribute + '\" (valid parameters are ' + VALID_KEYS + ')',\n command)\n })\n })\n\n record.buffer = buffer\n record.state = ATTRIB_STATE_POINTER\n record.size = size\n record.normalized = normalized\n record.type = type || buffer.dtype\n record.offset = offset\n record.stride = stride\n record.divisor = divisor\n }\n }\n }\n\n attributeDefs[attribute] = createStaticDecl(function (env, scope) {\n var cache = env.attribCache\n if (id in cache) {\n return cache[id]\n }\n var result = {\n isStream: false\n }\n Object.keys(record).forEach(function (key) {\n result[key] = record[key]\n })\n if (record.buffer) {\n result.buffer = env.link(record.buffer)\n result.type = result.type || (result.buffer + '.dtype')\n }\n cache[id] = result\n return result\n })\n })\n\n Object.keys(dynamicAttributes).forEach(function (attribute) {\n var dyn = dynamicAttributes[attribute]\n\n function appendAttributeCode (env, block) {\n var VALUE = env.invoke(block, dyn)\n\n var shared = env.shared\n var constants = env.constants\n\n var IS_BUFFER_ARGS = shared.isBufferArgs\n var BUFFER_STATE = shared.buffer\n\n // Perform validation on attribute\n check$1.optional(function () {\n env.assert(block,\n VALUE + '&&(typeof ' + VALUE + '===\"object\"||typeof ' +\n VALUE + '===\"function\")&&(' +\n IS_BUFFER_ARGS + '(' + VALUE + ')||' +\n BUFFER_STATE + '.getBuffer(' + VALUE + ')||' +\n BUFFER_STATE + '.getBuffer(' + VALUE + '.buffer)||' +\n IS_BUFFER_ARGS + '(' + VALUE + '.buffer)||' +\n '(\"constant\" in ' + VALUE +\n '&&(typeof ' + VALUE + '.constant===\"number\"||' +\n shared.isArrayLike + '(' + VALUE + '.constant))))',\n 'invalid dynamic attribute \"' + attribute + '\"')\n })\n\n // allocate names for result\n var result = {\n isStream: block.def(false)\n }\n var defaultRecord = new AttributeRecord()\n defaultRecord.state = ATTRIB_STATE_POINTER\n Object.keys(defaultRecord).forEach(function (key) {\n result[key] = block.def('' + defaultRecord[key])\n })\n\n var BUFFER = result.buffer\n var TYPE = result.type\n block(\n 'if(', IS_BUFFER_ARGS, '(', VALUE, ')){',\n result.isStream, '=true;',\n BUFFER, '=', BUFFER_STATE, '.createStream(', GL_ARRAY_BUFFER$2, ',', VALUE, ');',\n TYPE, '=', BUFFER, '.dtype;',\n '}else{',\n BUFFER, '=', BUFFER_STATE, '.getBuffer(', VALUE, ');',\n 'if(', BUFFER, '){',\n TYPE, '=', BUFFER, '.dtype;',\n '}else if(\"constant\" in ', VALUE, '){',\n result.state, '=', ATTRIB_STATE_CONSTANT, ';',\n 'if(typeof ' + VALUE + '.constant === \"number\"){',\n result[CUTE_COMPONENTS[0]], '=', VALUE, '.constant;',\n CUTE_COMPONENTS.slice(1).map(function (n) {\n return result[n]\n }).join('='), '=0;',\n '}else{',\n CUTE_COMPONENTS.map(function (name, i) {\n return (\n result[name] + '=' + VALUE + '.constant.length>' + i +\n '?' + VALUE + '.constant[' + i + ']:0;'\n )\n }).join(''),\n '}}else{',\n 'if(', IS_BUFFER_ARGS, '(', VALUE, '.buffer)){',\n BUFFER, '=', BUFFER_STATE, '.createStream(', GL_ARRAY_BUFFER$2, ',', VALUE, '.buffer);',\n '}else{',\n BUFFER, '=', BUFFER_STATE, '.getBuffer(', VALUE, '.buffer);',\n '}',\n TYPE, '=\"type\" in ', VALUE, '?',\n constants.glTypes, '[', VALUE, '.type]:', BUFFER, '.dtype;',\n result.normalized, '=!!', VALUE, '.normalized;')\n function emitReadRecord (name) {\n block(result[name], '=', VALUE, '.', name, '|0;')\n }\n emitReadRecord('size')\n emitReadRecord('offset')\n emitReadRecord('stride')\n emitReadRecord('divisor')\n\n block('}}')\n\n block.exit(\n 'if(', result.isStream, '){',\n BUFFER_STATE, '.destroyStream(', BUFFER, ');',\n '}')\n\n return result\n }\n\n attributeDefs[attribute] = createDynamicDecl(dyn, appendAttributeCode)\n })\n\n return attributeDefs\n }\n\n function parseVAO (options, env) {\n var staticOptions = options.static\n var dynamicOptions = options.dynamic\n if (S_VAO in staticOptions) {\n var vao = staticOptions[S_VAO]\n if (vao !== null && attributeState.getVAO(vao) === null) {\n vao = attributeState.createVAO(vao)\n }\n return createStaticDecl(function (env) {\n return env.link(attributeState.getVAO(vao))\n })\n } else if (S_VAO in dynamicOptions) {\n var dyn = dynamicOptions[S_VAO]\n return createDynamicDecl(dyn, function (env, scope) {\n var vaoRef = env.invoke(scope, dyn)\n return scope.def(env.shared.vao + '.getVAO(' + vaoRef + ')')\n })\n }\n return null\n }\n\n function parseContext (context) {\n var staticContext = context.static\n var dynamicContext = context.dynamic\n var result = {}\n\n Object.keys(staticContext).forEach(function (name) {\n var value = staticContext[name]\n result[name] = createStaticDecl(function (env, scope) {\n if (typeof value === 'number' || typeof value === 'boolean') {\n return '' + value\n } else {\n return env.link(value)\n }\n })\n })\n\n Object.keys(dynamicContext).forEach(function (name) {\n var dyn = dynamicContext[name]\n result[name] = createDynamicDecl(dyn, function (env, scope) {\n return env.invoke(scope, dyn)\n })\n })\n\n return result\n }\n\n function parseArguments (options, attributes, uniforms, context, env) {\n var staticOptions = options.static\n var dynamicOptions = options.dynamic\n\n check$1.optional(function () {\n var KEY_NAMES = [\n S_FRAMEBUFFER,\n S_VERT,\n S_FRAG,\n S_ELEMENTS,\n S_PRIMITIVE,\n S_OFFSET,\n S_COUNT,\n S_INSTANCES,\n S_PROFILE,\n S_VAO\n ].concat(GL_STATE_NAMES)\n\n function checkKeys (dict) {\n Object.keys(dict).forEach(function (key) {\n check$1.command(\n KEY_NAMES.indexOf(key) >= 0,\n 'unknown parameter \"' + key + '\"',\n env.commandStr)\n })\n }\n\n checkKeys(staticOptions)\n checkKeys(dynamicOptions)\n })\n\n var attribLocations = parseAttribLocations(options, attributes)\n\n var framebuffer = parseFramebuffer(options, env)\n var viewportAndScissor = parseViewportScissor(options, framebuffer, env)\n var draw = parseDraw(options, env)\n var state = parseGLState(options, env)\n var shader = parseProgram(options, env, attribLocations)\n\n function copyBox (name) {\n var defn = viewportAndScissor[name]\n if (defn) {\n state[name] = defn\n }\n }\n copyBox(S_VIEWPORT)\n copyBox(propName(S_SCISSOR_BOX))\n\n var dirty = Object.keys(state).length > 0\n\n var result = {\n framebuffer: framebuffer,\n draw: draw,\n shader: shader,\n state: state,\n dirty: dirty,\n scopeVAO: null,\n drawVAO: null,\n useVAO: false,\n attributes: {}\n }\n\n result.profile = parseProfile(options, env)\n result.uniforms = parseUniforms(uniforms, env)\n result.drawVAO = result.scopeVAO = parseVAO(options, env)\n // special case: check if we can statically allocate a vertex array object for this program\n if (!result.drawVAO && shader.program && !attribLocations && extensions.angle_instanced_arrays) {\n var useVAO = true\n var staticBindings = shader.program.attributes.map(function (attr) {\n var binding = attributes.static[attr]\n useVAO = useVAO && !!binding\n return binding\n })\n if (useVAO && staticBindings.length > 0) {\n var vao = attributeState.getVAO(attributeState.createVAO(staticBindings))\n result.drawVAO = new Declaration(null, null, null, function (env, scope) {\n return env.link(vao)\n })\n result.useVAO = true\n }\n }\n if (attribLocations) {\n result.useVAO = true\n } else {\n result.attributes = parseAttributes(attributes, env)\n }\n result.context = parseContext(context, env)\n return result\n }\n\n // ===================================================\n // ===================================================\n // COMMON UPDATE FUNCTIONS\n // ===================================================\n // ===================================================\n function emitContext (env, scope, context) {\n var shared = env.shared\n var CONTEXT = shared.context\n\n var contextEnter = env.scope()\n\n Object.keys(context).forEach(function (name) {\n scope.save(CONTEXT, '.' + name)\n var defn = context[name]\n var value = defn.append(env, scope)\n if (Array.isArray(value)) {\n contextEnter(CONTEXT, '.', name, '=[', value.join(), '];')\n } else {\n contextEnter(CONTEXT, '.', name, '=', value, ';')\n }\n })\n\n scope(contextEnter)\n }\n\n // ===================================================\n // ===================================================\n // COMMON DRAWING FUNCTIONS\n // ===================================================\n // ===================================================\n function emitPollFramebuffer (env, scope, framebuffer, skipCheck) {\n var shared = env.shared\n\n var GL = shared.gl\n var FRAMEBUFFER_STATE = shared.framebuffer\n var EXT_DRAW_BUFFERS\n if (extDrawBuffers) {\n EXT_DRAW_BUFFERS = scope.def(shared.extensions, '.webgl_draw_buffers')\n }\n\n var constants = env.constants\n\n var DRAW_BUFFERS = constants.drawBuffer\n var BACK_BUFFER = constants.backBuffer\n\n var NEXT\n if (framebuffer) {\n NEXT = framebuffer.append(env, scope)\n } else {\n NEXT = scope.def(FRAMEBUFFER_STATE, '.next')\n }\n\n if (!skipCheck) {\n scope('if(', NEXT, '!==', FRAMEBUFFER_STATE, '.cur){')\n }\n scope(\n 'if(', NEXT, '){',\n GL, '.bindFramebuffer(', GL_FRAMEBUFFER$2, ',', NEXT, '.framebuffer);')\n if (extDrawBuffers) {\n scope(EXT_DRAW_BUFFERS, '.drawBuffersWEBGL(',\n DRAW_BUFFERS, '[', NEXT, '.colorAttachments.length]);')\n }\n scope('}else{',\n GL, '.bindFramebuffer(', GL_FRAMEBUFFER$2, ',null);')\n if (extDrawBuffers) {\n scope(EXT_DRAW_BUFFERS, '.drawBuffersWEBGL(', BACK_BUFFER, ');')\n }\n scope(\n '}',\n FRAMEBUFFER_STATE, '.cur=', NEXT, ';')\n if (!skipCheck) {\n scope('}')\n }\n }\n\n function emitPollState (env, scope, args) {\n var shared = env.shared\n\n var GL = shared.gl\n\n var CURRENT_VARS = env.current\n var NEXT_VARS = env.next\n var CURRENT_STATE = shared.current\n var NEXT_STATE = shared.next\n\n var block = env.cond(CURRENT_STATE, '.dirty')\n\n GL_STATE_NAMES.forEach(function (prop) {\n var param = propName(prop)\n if (param in args.state) {\n return\n }\n\n var NEXT, CURRENT\n if (param in NEXT_VARS) {\n NEXT = NEXT_VARS[param]\n CURRENT = CURRENT_VARS[param]\n var parts = loop(currentState[param].length, function (i) {\n return block.def(NEXT, '[', i, ']')\n })\n block(env.cond(parts.map(function (p, i) {\n return p + '!==' + CURRENT + '[' + i + ']'\n }).join('||'))\n .then(\n GL, '.', GL_VARIABLES[param], '(', parts, ');',\n parts.map(function (p, i) {\n return CURRENT + '[' + i + ']=' + p\n }).join(';'), ';'))\n } else {\n NEXT = block.def(NEXT_STATE, '.', param)\n var ifte = env.cond(NEXT, '!==', CURRENT_STATE, '.', param)\n block(ifte)\n if (param in GL_FLAGS) {\n ifte(\n env.cond(NEXT)\n .then(GL, '.enable(', GL_FLAGS[param], ');')\n .else(GL, '.disable(', GL_FLAGS[param], ');'),\n CURRENT_STATE, '.', param, '=', NEXT, ';')\n } else {\n ifte(\n GL, '.', GL_VARIABLES[param], '(', NEXT, ');',\n CURRENT_STATE, '.', param, '=', NEXT, ';')\n }\n }\n })\n if (Object.keys(args.state).length === 0) {\n block(CURRENT_STATE, '.dirty=false;')\n }\n scope(block)\n }\n\n function emitSetOptions (env, scope, options, filter) {\n var shared = env.shared\n var CURRENT_VARS = env.current\n var CURRENT_STATE = shared.current\n var GL = shared.gl\n sortState(Object.keys(options)).forEach(function (param) {\n var defn = options[param]\n if (filter && !filter(defn)) {\n return\n }\n var variable = defn.append(env, scope)\n if (GL_FLAGS[param]) {\n var flag = GL_FLAGS[param]\n if (isStatic(defn)) {\n if (variable) {\n scope(GL, '.enable(', flag, ');')\n } else {\n scope(GL, '.disable(', flag, ');')\n }\n } else {\n scope(env.cond(variable)\n .then(GL, '.enable(', flag, ');')\n .else(GL, '.disable(', flag, ');'))\n }\n scope(CURRENT_STATE, '.', param, '=', variable, ';')\n } else if (isArrayLike(variable)) {\n var CURRENT = CURRENT_VARS[param]\n scope(\n GL, '.', GL_VARIABLES[param], '(', variable, ');',\n variable.map(function (v, i) {\n return CURRENT + '[' + i + ']=' + v\n }).join(';'), ';')\n } else {\n scope(\n GL, '.', GL_VARIABLES[param], '(', variable, ');',\n CURRENT_STATE, '.', param, '=', variable, ';')\n }\n })\n }\n\n function injectExtensions (env, scope) {\n if (extInstancing) {\n env.instancing = scope.def(\n env.shared.extensions, '.angle_instanced_arrays')\n }\n }\n\n function emitProfile (env, scope, args, useScope, incrementCounter) {\n var shared = env.shared\n var STATS = env.stats\n var CURRENT_STATE = shared.current\n var TIMER = shared.timer\n var profileArg = args.profile\n\n function perfCounter () {\n if (typeof performance === 'undefined') {\n return 'Date.now()'\n } else {\n return 'performance.now()'\n }\n }\n\n var CPU_START, QUERY_COUNTER\n function emitProfileStart (block) {\n CPU_START = scope.def()\n block(CPU_START, '=', perfCounter(), ';')\n if (typeof incrementCounter === 'string') {\n block(STATS, '.count+=', incrementCounter, ';')\n } else {\n block(STATS, '.count++;')\n }\n if (timer) {\n if (useScope) {\n QUERY_COUNTER = scope.def()\n block(QUERY_COUNTER, '=', TIMER, '.getNumPendingQueries();')\n } else {\n block(TIMER, '.beginQuery(', STATS, ');')\n }\n }\n }\n\n function emitProfileEnd (block) {\n block(STATS, '.cpuTime+=', perfCounter(), '-', CPU_START, ';')\n if (timer) {\n if (useScope) {\n block(TIMER, '.pushScopeStats(',\n QUERY_COUNTER, ',',\n TIMER, '.getNumPendingQueries(),',\n STATS, ');')\n } else {\n block(TIMER, '.endQuery();')\n }\n }\n }\n\n function scopeProfile (value) {\n var prev = scope.def(CURRENT_STATE, '.profile')\n scope(CURRENT_STATE, '.profile=', value, ';')\n scope.exit(CURRENT_STATE, '.profile=', prev, ';')\n }\n\n var USE_PROFILE\n if (profileArg) {\n if (isStatic(profileArg)) {\n if (profileArg.enable) {\n emitProfileStart(scope)\n emitProfileEnd(scope.exit)\n scopeProfile('true')\n } else {\n scopeProfile('false')\n }\n return\n }\n USE_PROFILE = profileArg.append(env, scope)\n scopeProfile(USE_PROFILE)\n } else {\n USE_PROFILE = scope.def(CURRENT_STATE, '.profile')\n }\n\n var start = env.block()\n emitProfileStart(start)\n scope('if(', USE_PROFILE, '){', start, '}')\n var end = env.block()\n emitProfileEnd(end)\n scope.exit('if(', USE_PROFILE, '){', end, '}')\n }\n\n function emitAttributes (env, scope, args, attributes, filter) {\n var shared = env.shared\n\n function typeLength (x) {\n switch (x) {\n case GL_FLOAT_VEC2:\n case GL_INT_VEC2:\n case GL_BOOL_VEC2:\n return 2\n case GL_FLOAT_VEC3:\n case GL_INT_VEC3:\n case GL_BOOL_VEC3:\n return 3\n case GL_FLOAT_VEC4:\n case GL_INT_VEC4:\n case GL_BOOL_VEC4:\n return 4\n default:\n return 1\n }\n }\n\n function emitBindAttribute (ATTRIBUTE, size, record) {\n var GL = shared.gl\n\n var LOCATION = scope.def(ATTRIBUTE, '.location')\n var BINDING = scope.def(shared.attributes, '[', LOCATION, ']')\n\n var STATE = record.state\n var BUFFER = record.buffer\n var CONST_COMPONENTS = [\n record.x,\n record.y,\n record.z,\n record.w\n ]\n\n var COMMON_KEYS = [\n 'buffer',\n 'normalized',\n 'offset',\n 'stride'\n ]\n\n function emitBuffer () {\n scope(\n 'if(!', BINDING, '.buffer){',\n GL, '.enableVertexAttribArray(', LOCATION, ');}')\n\n var TYPE = record.type\n var SIZE\n if (!record.size) {\n SIZE = size\n } else {\n SIZE = scope.def(record.size, '||', size)\n }\n\n scope('if(',\n BINDING, '.type!==', TYPE, '||',\n BINDING, '.size!==', SIZE, '||',\n COMMON_KEYS.map(function (key) {\n return BINDING + '.' + key + '!==' + record[key]\n }).join('||'),\n '){',\n GL, '.bindBuffer(', GL_ARRAY_BUFFER$2, ',', BUFFER, '.buffer);',\n GL, '.vertexAttribPointer(', [\n LOCATION,\n SIZE,\n TYPE,\n record.normalized,\n record.stride,\n record.offset\n ], ');',\n BINDING, '.type=', TYPE, ';',\n BINDING, '.size=', SIZE, ';',\n COMMON_KEYS.map(function (key) {\n return BINDING + '.' + key + '=' + record[key] + ';'\n }).join(''),\n '}')\n\n if (extInstancing) {\n var DIVISOR = record.divisor\n scope(\n 'if(', BINDING, '.divisor!==', DIVISOR, '){',\n env.instancing, '.vertexAttribDivisorANGLE(', [LOCATION, DIVISOR], ');',\n BINDING, '.divisor=', DIVISOR, ';}')\n }\n }\n\n function emitConstant () {\n scope(\n 'if(', BINDING, '.buffer){',\n GL, '.disableVertexAttribArray(', LOCATION, ');',\n BINDING, '.buffer=null;',\n '}if(', CUTE_COMPONENTS.map(function (c, i) {\n return BINDING + '.' + c + '!==' + CONST_COMPONENTS[i]\n }).join('||'), '){',\n GL, '.vertexAttrib4f(', LOCATION, ',', CONST_COMPONENTS, ');',\n CUTE_COMPONENTS.map(function (c, i) {\n return BINDING + '.' + c + '=' + CONST_COMPONENTS[i] + ';'\n }).join(''),\n '}')\n }\n\n if (STATE === ATTRIB_STATE_POINTER) {\n emitBuffer()\n } else if (STATE === ATTRIB_STATE_CONSTANT) {\n emitConstant()\n } else {\n scope('if(', STATE, '===', ATTRIB_STATE_POINTER, '){')\n emitBuffer()\n scope('}else{')\n emitConstant()\n scope('}')\n }\n }\n\n attributes.forEach(function (attribute) {\n var name = attribute.name\n var arg = args.attributes[name]\n var record\n if (arg) {\n if (!filter(arg)) {\n return\n }\n record = arg.append(env, scope)\n } else {\n if (!filter(SCOPE_DECL)) {\n return\n }\n var scopeAttrib = env.scopeAttrib(name)\n check$1.optional(function () {\n env.assert(scope,\n scopeAttrib + '.state',\n 'missing attribute ' + name)\n })\n record = {}\n Object.keys(new AttributeRecord()).forEach(function (key) {\n record[key] = scope.def(scopeAttrib, '.', key)\n })\n }\n emitBindAttribute(\n env.link(attribute), typeLength(attribute.info.type), record)\n })\n }\n\n function emitUniforms (env, scope, args, uniforms, filter) {\n var shared = env.shared\n var GL = shared.gl\n\n var infix\n for (var i = 0; i < uniforms.length; ++i) {\n var uniform = uniforms[i]\n var name = uniform.name\n var type = uniform.info.type\n var arg = args.uniforms[name]\n var UNIFORM = env.link(uniform)\n var LOCATION = UNIFORM + '.location'\n\n var VALUE\n if (arg) {\n if (!filter(arg)) {\n continue\n }\n if (isStatic(arg)) {\n var value = arg.value\n check$1.command(\n value !== null && typeof value !== 'undefined',\n 'missing uniform \"' + name + '\"', env.commandStr)\n if (type === GL_SAMPLER_2D || type === GL_SAMPLER_CUBE) {\n check$1.command(\n typeof value === 'function' &&\n ((type === GL_SAMPLER_2D &&\n (value._reglType === 'texture2d' ||\n value._reglType === 'framebuffer')) ||\n (type === GL_SAMPLER_CUBE &&\n (value._reglType === 'textureCube' ||\n value._reglType === 'framebufferCube'))),\n 'invalid texture for uniform ' + name, env.commandStr)\n var TEX_VALUE = env.link(value._texture || value.color[0]._texture)\n scope(GL, '.uniform1i(', LOCATION, ',', TEX_VALUE + '.bind());')\n scope.exit(TEX_VALUE, '.unbind();')\n } else if (\n type === GL_FLOAT_MAT2 ||\n type === GL_FLOAT_MAT3 ||\n type === GL_FLOAT_MAT4) {\n check$1.optional(function () {\n check$1.command(isArrayLike(value),\n 'invalid matrix for uniform ' + name, env.commandStr)\n check$1.command(\n (type === GL_FLOAT_MAT2 && value.length === 4) ||\n (type === GL_FLOAT_MAT3 && value.length === 9) ||\n (type === GL_FLOAT_MAT4 && value.length === 16),\n 'invalid length for matrix uniform ' + name, env.commandStr)\n })\n var MAT_VALUE = env.global.def('new Float32Array([' +\n Array.prototype.slice.call(value) + '])')\n var dim = 2\n if (type === GL_FLOAT_MAT3) {\n dim = 3\n } else if (type === GL_FLOAT_MAT4) {\n dim = 4\n }\n scope(\n GL, '.uniformMatrix', dim, 'fv(',\n LOCATION, ',false,', MAT_VALUE, ');')\n } else {\n switch (type) {\n case GL_FLOAT$8:\n check$1.commandType(value, 'number', 'uniform ' + name, env.commandStr)\n infix = '1f'\n break\n case GL_FLOAT_VEC2:\n check$1.command(\n isArrayLike(value) && value.length === 2,\n 'uniform ' + name, env.commandStr)\n infix = '2f'\n break\n case GL_FLOAT_VEC3:\n check$1.command(\n isArrayLike(value) && value.length === 3,\n 'uniform ' + name, env.commandStr)\n infix = '3f'\n break\n case GL_FLOAT_VEC4:\n check$1.command(\n isArrayLike(value) && value.length === 4,\n 'uniform ' + name, env.commandStr)\n infix = '4f'\n break\n case GL_BOOL:\n check$1.commandType(value, 'boolean', 'uniform ' + name, env.commandStr)\n infix = '1i'\n break\n case GL_INT$3:\n check$1.commandType(value, 'number', 'uniform ' + name, env.commandStr)\n infix = '1i'\n break\n case GL_BOOL_VEC2:\n check$1.command(\n isArrayLike(value) && value.length === 2,\n 'uniform ' + name, env.commandStr)\n infix = '2i'\n break\n case GL_INT_VEC2:\n check$1.command(\n isArrayLike(value) && value.length === 2,\n 'uniform ' + name, env.commandStr)\n infix = '2i'\n break\n case GL_BOOL_VEC3:\n check$1.command(\n isArrayLike(value) && value.length === 3,\n 'uniform ' + name, env.commandStr)\n infix = '3i'\n break\n case GL_INT_VEC3:\n check$1.command(\n isArrayLike(value) && value.length === 3,\n 'uniform ' + name, env.commandStr)\n infix = '3i'\n break\n case GL_BOOL_VEC4:\n check$1.command(\n isArrayLike(value) && value.length === 4,\n 'uniform ' + name, env.commandStr)\n infix = '4i'\n break\n case GL_INT_VEC4:\n check$1.command(\n isArrayLike(value) && value.length === 4,\n 'uniform ' + name, env.commandStr)\n infix = '4i'\n break\n }\n scope(GL, '.uniform', infix, '(', LOCATION, ',',\n isArrayLike(value) ? Array.prototype.slice.call(value) : value,\n ');')\n }\n continue\n } else {\n VALUE = arg.append(env, scope)\n }\n } else {\n if (!filter(SCOPE_DECL)) {\n continue\n }\n VALUE = scope.def(shared.uniforms, '[', stringStore.id(name), ']')\n }\n\n if (type === GL_SAMPLER_2D) {\n check$1(!Array.isArray(VALUE), 'must specify a scalar prop for textures')\n scope(\n 'if(', VALUE, '&&', VALUE, '._reglType===\"framebuffer\"){',\n VALUE, '=', VALUE, '.color[0];',\n '}')\n } else if (type === GL_SAMPLER_CUBE) {\n check$1(!Array.isArray(VALUE), 'must specify a scalar prop for cube maps')\n scope(\n 'if(', VALUE, '&&', VALUE, '._reglType===\"framebufferCube\"){',\n VALUE, '=', VALUE, '.color[0];',\n '}')\n }\n\n // perform type validation\n check$1.optional(function () {\n function emitCheck (pred, message) {\n env.assert(scope, pred,\n 'bad data or missing for uniform \"' + name + '\". ' + message)\n }\n\n function checkType (type) {\n check$1(!Array.isArray(VALUE), 'must not specify an array type for uniform')\n emitCheck(\n 'typeof ' + VALUE + '===\"' + type + '\"',\n 'invalid type, expected ' + type)\n }\n\n function checkVector (n, type) {\n if (Array.isArray(VALUE)) {\n check$1(VALUE.length === n, 'must have length ' + n)\n } else {\n emitCheck(\n shared.isArrayLike + '(' + VALUE + ')&&' + VALUE + '.length===' + n,\n 'invalid vector, should have length ' + n, env.commandStr)\n }\n }\n\n function checkTexture (target) {\n check$1(!Array.isArray(VALUE), 'must not specify a value type')\n emitCheck(\n 'typeof ' + VALUE + '===\"function\"&&' +\n VALUE + '._reglType===\"texture' +\n (target === GL_TEXTURE_2D$3 ? '2d' : 'Cube') + '\"',\n 'invalid texture type', env.commandStr)\n }\n\n switch (type) {\n case GL_INT$3:\n checkType('number')\n break\n case GL_INT_VEC2:\n checkVector(2, 'number')\n break\n case GL_INT_VEC3:\n checkVector(3, 'number')\n break\n case GL_INT_VEC4:\n checkVector(4, 'number')\n break\n case GL_FLOAT$8:\n checkType('number')\n break\n case GL_FLOAT_VEC2:\n checkVector(2, 'number')\n break\n case GL_FLOAT_VEC3:\n checkVector(3, 'number')\n break\n case GL_FLOAT_VEC4:\n checkVector(4, 'number')\n break\n case GL_BOOL:\n checkType('boolean')\n break\n case GL_BOOL_VEC2:\n checkVector(2, 'boolean')\n break\n case GL_BOOL_VEC3:\n checkVector(3, 'boolean')\n break\n case GL_BOOL_VEC4:\n checkVector(4, 'boolean')\n break\n case GL_FLOAT_MAT2:\n checkVector(4, 'number')\n break\n case GL_FLOAT_MAT3:\n checkVector(9, 'number')\n break\n case GL_FLOAT_MAT4:\n checkVector(16, 'number')\n break\n case GL_SAMPLER_2D:\n checkTexture(GL_TEXTURE_2D$3)\n break\n case GL_SAMPLER_CUBE:\n checkTexture(GL_TEXTURE_CUBE_MAP$2)\n break\n }\n })\n\n var unroll = 1\n switch (type) {\n case GL_SAMPLER_2D:\n case GL_SAMPLER_CUBE:\n var TEX = scope.def(VALUE, '._texture')\n scope(GL, '.uniform1i(', LOCATION, ',', TEX, '.bind());')\n scope.exit(TEX, '.unbind();')\n continue\n\n case GL_INT$3:\n case GL_BOOL:\n infix = '1i'\n break\n\n case GL_INT_VEC2:\n case GL_BOOL_VEC2:\n infix = '2i'\n unroll = 2\n break\n\n case GL_INT_VEC3:\n case GL_BOOL_VEC3:\n infix = '3i'\n unroll = 3\n break\n\n case GL_INT_VEC4:\n case GL_BOOL_VEC4:\n infix = '4i'\n unroll = 4\n break\n\n case GL_FLOAT$8:\n infix = '1f'\n break\n\n case GL_FLOAT_VEC2:\n infix = '2f'\n unroll = 2\n break\n\n case GL_FLOAT_VEC3:\n infix = '3f'\n unroll = 3\n break\n\n case GL_FLOAT_VEC4:\n infix = '4f'\n unroll = 4\n break\n\n case GL_FLOAT_MAT2:\n infix = 'Matrix2fv'\n break\n\n case GL_FLOAT_MAT3:\n infix = 'Matrix3fv'\n break\n\n case GL_FLOAT_MAT4:\n infix = 'Matrix4fv'\n break\n }\n\n scope(GL, '.uniform', infix, '(', LOCATION, ',')\n if (infix.charAt(0) === 'M') {\n var matSize = Math.pow(type - GL_FLOAT_MAT2 + 2, 2)\n var STORAGE = env.global.def('new Float32Array(', matSize, ')')\n if (Array.isArray(VALUE)) {\n scope(\n 'false,(',\n loop(matSize, function (i) {\n return STORAGE + '[' + i + ']=' + VALUE[i]\n }), ',', STORAGE, ')')\n } else {\n scope(\n 'false,(Array.isArray(', VALUE, ')||', VALUE, ' instanceof Float32Array)?', VALUE, ':(',\n loop(matSize, function (i) {\n return STORAGE + '[' + i + ']=' + VALUE + '[' + i + ']'\n }), ',', STORAGE, ')')\n }\n } else if (unroll > 1) {\n scope(loop(unroll, function (i) {\n return Array.isArray(VALUE) ? VALUE[i] : VALUE + '[' + i + ']'\n }))\n } else {\n check$1(!Array.isArray(VALUE), 'uniform value must not be an array')\n scope(VALUE)\n }\n scope(');')\n }\n }\n\n function emitDraw (env, outer, inner, args) {\n var shared = env.shared\n var GL = shared.gl\n var DRAW_STATE = shared.draw\n\n var drawOptions = args.draw\n\n function emitElements () {\n var defn = drawOptions.elements\n var ELEMENTS\n var scope = outer\n if (defn) {\n if ((defn.contextDep && args.contextDynamic) || defn.propDep) {\n scope = inner\n }\n ELEMENTS = defn.append(env, scope)\n } else {\n ELEMENTS = scope.def(DRAW_STATE, '.', S_ELEMENTS)\n }\n if (ELEMENTS) {\n scope(\n 'if(' + ELEMENTS + ')' +\n GL + '.bindBuffer(' + GL_ELEMENT_ARRAY_BUFFER$1 + ',' + ELEMENTS + '.buffer.buffer);')\n }\n return ELEMENTS\n }\n\n function emitCount () {\n var defn = drawOptions.count\n var COUNT\n var scope = outer\n if (defn) {\n if ((defn.contextDep && args.contextDynamic) || defn.propDep) {\n scope = inner\n }\n COUNT = defn.append(env, scope)\n check$1.optional(function () {\n if (defn.MISSING) {\n env.assert(outer, 'false', 'missing vertex count')\n }\n if (defn.DYNAMIC) {\n env.assert(scope, COUNT + '>=0', 'missing vertex count')\n }\n })\n } else {\n COUNT = scope.def(DRAW_STATE, '.', S_COUNT)\n check$1.optional(function () {\n env.assert(scope, COUNT + '>=0', 'missing vertex count')\n })\n }\n return COUNT\n }\n\n var ELEMENTS = emitElements()\n function emitValue (name) {\n var defn = drawOptions[name]\n if (defn) {\n if ((defn.contextDep && args.contextDynamic) || defn.propDep) {\n return defn.append(env, inner)\n } else {\n return defn.append(env, outer)\n }\n } else {\n return outer.def(DRAW_STATE, '.', name)\n }\n }\n\n var PRIMITIVE = emitValue(S_PRIMITIVE)\n var OFFSET = emitValue(S_OFFSET)\n\n var COUNT = emitCount()\n if (typeof COUNT === 'number') {\n if (COUNT === 0) {\n return\n }\n } else {\n inner('if(', COUNT, '){')\n inner.exit('}')\n }\n\n var INSTANCES, EXT_INSTANCING\n if (extInstancing) {\n INSTANCES = emitValue(S_INSTANCES)\n EXT_INSTANCING = env.instancing\n }\n\n var ELEMENT_TYPE = ELEMENTS + '.type'\n\n var elementsStatic = drawOptions.elements && isStatic(drawOptions.elements)\n\n function emitInstancing () {\n function drawElements () {\n inner(EXT_INSTANCING, '.drawElementsInstancedANGLE(', [\n PRIMITIVE,\n COUNT,\n ELEMENT_TYPE,\n OFFSET + '<<((' + ELEMENT_TYPE + '-' + GL_UNSIGNED_BYTE$8 + ')>>1)',\n INSTANCES\n ], ');')\n }\n\n function drawArrays () {\n inner(EXT_INSTANCING, '.drawArraysInstancedANGLE(',\n [PRIMITIVE, OFFSET, COUNT, INSTANCES], ');')\n }\n\n if (ELEMENTS) {\n if (!elementsStatic) {\n inner('if(', ELEMENTS, '){')\n drawElements()\n inner('}else{')\n drawArrays()\n inner('}')\n } else {\n drawElements()\n }\n } else {\n drawArrays()\n }\n }\n\n function emitRegular () {\n function drawElements () {\n inner(GL + '.drawElements(' + [\n PRIMITIVE,\n COUNT,\n ELEMENT_TYPE,\n OFFSET + '<<((' + ELEMENT_TYPE + '-' + GL_UNSIGNED_BYTE$8 + ')>>1)'\n ] + ');')\n }\n\n function drawArrays () {\n inner(GL + '.drawArrays(' + [PRIMITIVE, OFFSET, COUNT] + ');')\n }\n\n if (ELEMENTS) {\n if (!elementsStatic) {\n inner('if(', ELEMENTS, '){')\n drawElements()\n inner('}else{')\n drawArrays()\n inner('}')\n } else {\n drawElements()\n }\n } else {\n drawArrays()\n }\n }\n\n if (extInstancing && (typeof INSTANCES !== 'number' || INSTANCES >= 0)) {\n if (typeof INSTANCES === 'string') {\n inner('if(', INSTANCES, '>0){')\n emitInstancing()\n inner('}else if(', INSTANCES, '<0){')\n emitRegular()\n inner('}')\n } else {\n emitInstancing()\n }\n } else {\n emitRegular()\n }\n }\n\n function createBody (emitBody, parentEnv, args, program, count) {\n var env = createREGLEnvironment()\n var scope = env.proc('body', count)\n check$1.optional(function () {\n env.commandStr = parentEnv.commandStr\n env.command = env.link(parentEnv.commandStr)\n })\n if (extInstancing) {\n env.instancing = scope.def(\n env.shared.extensions, '.angle_instanced_arrays')\n }\n emitBody(env, scope, args, program)\n return env.compile().body\n }\n\n // ===================================================\n // ===================================================\n // DRAW PROC\n // ===================================================\n // ===================================================\n function emitDrawBody (env, draw, args, program) {\n injectExtensions(env, draw)\n if (args.useVAO) {\n if (args.drawVAO) {\n draw(env.shared.vao, '.setVAO(', args.drawVAO.append(env, draw), ');')\n } else {\n draw(env.shared.vao, '.setVAO(', env.shared.vao, '.targetVAO);')\n }\n } else {\n draw(env.shared.vao, '.setVAO(null);')\n emitAttributes(env, draw, args, program.attributes, function () {\n return true\n })\n }\n emitUniforms(env, draw, args, program.uniforms, function () {\n return true\n })\n emitDraw(env, draw, draw, args)\n }\n\n function emitDrawProc (env, args) {\n var draw = env.proc('draw', 1)\n\n injectExtensions(env, draw)\n\n emitContext(env, draw, args.context)\n emitPollFramebuffer(env, draw, args.framebuffer)\n\n emitPollState(env, draw, args)\n emitSetOptions(env, draw, args.state)\n\n emitProfile(env, draw, args, false, true)\n\n var program = args.shader.progVar.append(env, draw)\n draw(env.shared.gl, '.useProgram(', program, '.program);')\n\n if (args.shader.program) {\n emitDrawBody(env, draw, args, args.shader.program)\n } else {\n draw(env.shared.vao, '.setVAO(null);')\n var drawCache = env.global.def('{}')\n var PROG_ID = draw.def(program, '.id')\n var CACHED_PROC = draw.def(drawCache, '[', PROG_ID, ']')\n draw(\n env.cond(CACHED_PROC)\n .then(CACHED_PROC, '.call(this,a0);')\n .else(\n CACHED_PROC, '=', drawCache, '[', PROG_ID, ']=',\n env.link(function (program) {\n return createBody(emitDrawBody, env, args, program, 1)\n }), '(', program, ');',\n CACHED_PROC, '.call(this,a0);'))\n }\n\n if (Object.keys(args.state).length > 0) {\n draw(env.shared.current, '.dirty=true;')\n }\n }\n\n // ===================================================\n // ===================================================\n // BATCH PROC\n // ===================================================\n // ===================================================\n\n function emitBatchDynamicShaderBody (env, scope, args, program) {\n env.batchId = 'a1'\n\n injectExtensions(env, scope)\n\n function all () {\n return true\n }\n\n emitAttributes(env, scope, args, program.attributes, all)\n emitUniforms(env, scope, args, program.uniforms, all)\n emitDraw(env, scope, scope, args)\n }\n\n function emitBatchBody (env, scope, args, program) {\n injectExtensions(env, scope)\n\n var contextDynamic = args.contextDep\n\n var BATCH_ID = scope.def()\n var PROP_LIST = 'a0'\n var NUM_PROPS = 'a1'\n var PROPS = scope.def()\n env.shared.props = PROPS\n env.batchId = BATCH_ID\n\n var outer = env.scope()\n var inner = env.scope()\n\n scope(\n outer.entry,\n 'for(', BATCH_ID, '=0;', BATCH_ID, '<', NUM_PROPS, ';++', BATCH_ID, '){',\n PROPS, '=', PROP_LIST, '[', BATCH_ID, '];',\n inner,\n '}',\n outer.exit)\n\n function isInnerDefn (defn) {\n return ((defn.contextDep && contextDynamic) || defn.propDep)\n }\n\n function isOuterDefn (defn) {\n return !isInnerDefn(defn)\n }\n\n if (args.needsContext) {\n emitContext(env, inner, args.context)\n }\n if (args.needsFramebuffer) {\n emitPollFramebuffer(env, inner, args.framebuffer)\n }\n emitSetOptions(env, inner, args.state, isInnerDefn)\n\n if (args.profile && isInnerDefn(args.profile)) {\n emitProfile(env, inner, args, false, true)\n }\n\n if (!program) {\n var progCache = env.global.def('{}')\n var PROGRAM = args.shader.progVar.append(env, inner)\n var PROG_ID = inner.def(PROGRAM, '.id')\n var CACHED_PROC = inner.def(progCache, '[', PROG_ID, ']')\n inner(\n env.shared.gl, '.useProgram(', PROGRAM, '.program);',\n 'if(!', CACHED_PROC, '){',\n CACHED_PROC, '=', progCache, '[', PROG_ID, ']=',\n env.link(function (program) {\n return createBody(\n emitBatchDynamicShaderBody, env, args, program, 2)\n }), '(', PROGRAM, ');}',\n CACHED_PROC, '.call(this,a0[', BATCH_ID, '],', BATCH_ID, ');')\n } else {\n if (args.useVAO) {\n if (args.drawVAO) {\n if (isInnerDefn(args.drawVAO)) {\n // vao is a prop\n inner(env.shared.vao, '.setVAO(', args.drawVAO.append(env, inner), ');')\n } else {\n // vao is invariant\n outer(env.shared.vao, '.setVAO(', args.drawVAO.append(env, outer), ');')\n }\n } else {\n // scoped vao binding\n outer(env.shared.vao, '.setVAO(', env.shared.vao, '.targetVAO);')\n }\n } else {\n outer(env.shared.vao, '.setVAO(null);')\n emitAttributes(env, outer, args, program.attributes, isOuterDefn)\n emitAttributes(env, inner, args, program.attributes, isInnerDefn)\n }\n emitUniforms(env, outer, args, program.uniforms, isOuterDefn)\n emitUniforms(env, inner, args, program.uniforms, isInnerDefn)\n emitDraw(env, outer, inner, args)\n }\n }\n\n function emitBatchProc (env, args) {\n var batch = env.proc('batch', 2)\n env.batchId = '0'\n\n injectExtensions(env, batch)\n\n // Check if any context variables depend on props\n var contextDynamic = false\n var needsContext = true\n Object.keys(args.context).forEach(function (name) {\n contextDynamic = contextDynamic || args.context[name].propDep\n })\n if (!contextDynamic) {\n emitContext(env, batch, args.context)\n needsContext = false\n }\n\n // framebuffer state affects framebufferWidth/height context vars\n var framebuffer = args.framebuffer\n var needsFramebuffer = false\n if (framebuffer) {\n if (framebuffer.propDep) {\n contextDynamic = needsFramebuffer = true\n } else if (framebuffer.contextDep && contextDynamic) {\n needsFramebuffer = true\n }\n if (!needsFramebuffer) {\n emitPollFramebuffer(env, batch, framebuffer)\n }\n } else {\n emitPollFramebuffer(env, batch, null)\n }\n\n // viewport is weird because it can affect context vars\n if (args.state.viewport && args.state.viewport.propDep) {\n contextDynamic = true\n }\n\n function isInnerDefn (defn) {\n return (defn.contextDep && contextDynamic) || defn.propDep\n }\n\n // set webgl options\n emitPollState(env, batch, args)\n emitSetOptions(env, batch, args.state, function (defn) {\n return !isInnerDefn(defn)\n })\n\n if (!args.profile || !isInnerDefn(args.profile)) {\n emitProfile(env, batch, args, false, 'a1')\n }\n\n // Save these values to args so that the batch body routine can use them\n args.contextDep = contextDynamic\n args.needsContext = needsContext\n args.needsFramebuffer = needsFramebuffer\n\n // determine if shader is dynamic\n var progDefn = args.shader.progVar\n if ((progDefn.contextDep && contextDynamic) || progDefn.propDep) {\n emitBatchBody(\n env,\n batch,\n args,\n null)\n } else {\n var PROGRAM = progDefn.append(env, batch)\n batch(env.shared.gl, '.useProgram(', PROGRAM, '.program);')\n if (args.shader.program) {\n emitBatchBody(\n env,\n batch,\n args,\n args.shader.program)\n } else {\n batch(env.shared.vao, '.setVAO(null);')\n var batchCache = env.global.def('{}')\n var PROG_ID = batch.def(PROGRAM, '.id')\n var CACHED_PROC = batch.def(batchCache, '[', PROG_ID, ']')\n batch(\n env.cond(CACHED_PROC)\n .then(CACHED_PROC, '.call(this,a0,a1);')\n .else(\n CACHED_PROC, '=', batchCache, '[', PROG_ID, ']=',\n env.link(function (program) {\n return createBody(emitBatchBody, env, args, program, 2)\n }), '(', PROGRAM, ');',\n CACHED_PROC, '.call(this,a0,a1);'))\n }\n }\n\n if (Object.keys(args.state).length > 0) {\n batch(env.shared.current, '.dirty=true;')\n }\n }\n\n // ===================================================\n // ===================================================\n // SCOPE COMMAND\n // ===================================================\n // ===================================================\n function emitScopeProc (env, args) {\n var scope = env.proc('scope', 3)\n env.batchId = 'a2'\n\n var shared = env.shared\n var CURRENT_STATE = shared.current\n\n emitContext(env, scope, args.context)\n\n if (args.framebuffer) {\n args.framebuffer.append(env, scope)\n }\n\n sortState(Object.keys(args.state)).forEach(function (name) {\n var defn = args.state[name]\n var value = defn.append(env, scope)\n if (isArrayLike(value)) {\n value.forEach(function (v, i) {\n scope.set(env.next[name], '[' + i + ']', v)\n })\n } else {\n scope.set(shared.next, '.' + name, value)\n }\n })\n\n emitProfile(env, scope, args, true, true)\n\n ;[S_ELEMENTS, S_OFFSET, S_COUNT, S_INSTANCES, S_PRIMITIVE].forEach(\n function (opt) {\n var variable = args.draw[opt]\n if (!variable) {\n return\n }\n scope.set(shared.draw, '.' + opt, '' + variable.append(env, scope))\n })\n\n Object.keys(args.uniforms).forEach(function (opt) {\n var value = args.uniforms[opt].append(env, scope)\n if (Array.isArray(value)) {\n value = '[' + value.join() + ']'\n }\n scope.set(\n shared.uniforms,\n '[' + stringStore.id(opt) + ']',\n value)\n })\n\n Object.keys(args.attributes).forEach(function (name) {\n var record = args.attributes[name].append(env, scope)\n var scopeAttrib = env.scopeAttrib(name)\n Object.keys(new AttributeRecord()).forEach(function (prop) {\n scope.set(scopeAttrib, '.' + prop, record[prop])\n })\n })\n\n if (args.scopeVAO) {\n scope.set(shared.vao, '.targetVAO', args.scopeVAO.append(env, scope))\n }\n\n function saveShader (name) {\n var shader = args.shader[name]\n if (shader) {\n scope.set(shared.shader, '.' + name, shader.append(env, scope))\n }\n }\n saveShader(S_VERT)\n saveShader(S_FRAG)\n\n if (Object.keys(args.state).length > 0) {\n scope(CURRENT_STATE, '.dirty=true;')\n scope.exit(CURRENT_STATE, '.dirty=true;')\n }\n\n scope('a1(', env.shared.context, ',a0,', env.batchId, ');')\n }\n\n function isDynamicObject (object) {\n if (typeof object !== 'object' || isArrayLike(object)) {\n return\n }\n var props = Object.keys(object)\n for (var i = 0; i < props.length; ++i) {\n if (dynamic.isDynamic(object[props[i]])) {\n return true\n }\n }\n return false\n }\n\n function splatObject (env, options, name) {\n var object = options.static[name]\n if (!object || !isDynamicObject(object)) {\n return\n }\n\n var globals = env.global\n var keys = Object.keys(object)\n var thisDep = false\n var contextDep = false\n var propDep = false\n var objectRef = env.global.def('{}')\n keys.forEach(function (key) {\n var value = object[key]\n if (dynamic.isDynamic(value)) {\n if (typeof value === 'function') {\n value = object[key] = dynamic.unbox(value)\n }\n var deps = createDynamicDecl(value, null)\n thisDep = thisDep || deps.thisDep\n propDep = propDep || deps.propDep\n contextDep = contextDep || deps.contextDep\n } else {\n globals(objectRef, '.', key, '=')\n switch (typeof value) {\n case 'number':\n globals(value)\n break\n case 'string':\n globals('\"', value, '\"')\n break\n case 'object':\n if (Array.isArray(value)) {\n globals('[', value.join(), ']')\n }\n break\n default:\n globals(env.link(value))\n break\n }\n globals(';')\n }\n })\n\n function appendBlock (env, block) {\n keys.forEach(function (key) {\n var value = object[key]\n if (!dynamic.isDynamic(value)) {\n return\n }\n var ref = env.invoke(block, value)\n block(objectRef, '.', key, '=', ref, ';')\n })\n }\n\n options.dynamic[name] = new dynamic.DynamicVariable(DYN_THUNK, {\n thisDep: thisDep,\n contextDep: contextDep,\n propDep: propDep,\n ref: objectRef,\n append: appendBlock\n })\n delete options.static[name]\n }\n\n // ===========================================================================\n // ===========================================================================\n // MAIN DRAW COMMAND\n // ===========================================================================\n // ===========================================================================\n function compileCommand (options, attributes, uniforms, context, stats) {\n var env = createREGLEnvironment()\n\n // link stats, so that we can easily access it in the program.\n env.stats = env.link(stats)\n\n // splat options and attributes to allow for dynamic nested properties\n Object.keys(attributes.static).forEach(function (key) {\n splatObject(env, attributes, key)\n })\n NESTED_OPTIONS.forEach(function (name) {\n splatObject(env, options, name)\n })\n\n var args = parseArguments(options, attributes, uniforms, context, env)\n\n emitDrawProc(env, args)\n emitScopeProc(env, args)\n emitBatchProc(env, args)\n\n return extend(env.compile(), {\n destroy: function () {\n args.shader.program.destroy()\n }\n })\n }\n\n // ===========================================================================\n // ===========================================================================\n // POLL / REFRESH\n // ===========================================================================\n // ===========================================================================\n return {\n next: nextState,\n current: currentState,\n procs: (function () {\n var env = createREGLEnvironment()\n var poll = env.proc('poll')\n var refresh = env.proc('refresh')\n var common = env.block()\n poll(common)\n refresh(common)\n\n var shared = env.shared\n var GL = shared.gl\n var NEXT_STATE = shared.next\n var CURRENT_STATE = shared.current\n\n common(CURRENT_STATE, '.dirty=false;')\n\n emitPollFramebuffer(env, poll)\n emitPollFramebuffer(env, refresh, null, true)\n\n // Refresh updates all attribute state changes\n var INSTANCING\n if (extInstancing) {\n INSTANCING = env.link(extInstancing)\n }\n\n // update vertex array bindings\n if (extensions.oes_vertex_array_object) {\n refresh(env.link(extensions.oes_vertex_array_object), '.bindVertexArrayOES(null);')\n }\n for (var i = 0; i < limits.maxAttributes; ++i) {\n var BINDING = refresh.def(shared.attributes, '[', i, ']')\n var ifte = env.cond(BINDING, '.buffer')\n ifte.then(\n GL, '.enableVertexAttribArray(', i, ');',\n GL, '.bindBuffer(',\n GL_ARRAY_BUFFER$2, ',',\n BINDING, '.buffer.buffer);',\n GL, '.vertexAttribPointer(',\n i, ',',\n BINDING, '.size,',\n BINDING, '.type,',\n BINDING, '.normalized,',\n BINDING, '.stride,',\n BINDING, '.offset);'\n ).else(\n GL, '.disableVertexAttribArray(', i, ');',\n GL, '.vertexAttrib4f(',\n i, ',',\n BINDING, '.x,',\n BINDING, '.y,',\n BINDING, '.z,',\n BINDING, '.w);',\n BINDING, '.buffer=null;')\n refresh(ifte)\n if (extInstancing) {\n refresh(\n INSTANCING, '.vertexAttribDivisorANGLE(',\n i, ',',\n BINDING, '.divisor);')\n }\n }\n refresh(\n env.shared.vao, '.currentVAO=null;',\n env.shared.vao, '.setVAO(', env.shared.vao, '.targetVAO);')\n\n Object.keys(GL_FLAGS).forEach(function (flag) {\n var cap = GL_FLAGS[flag]\n var NEXT = common.def(NEXT_STATE, '.', flag)\n var block = env.block()\n block('if(', NEXT, '){',\n GL, '.enable(', cap, ')}else{',\n GL, '.disable(', cap, ')}',\n CURRENT_STATE, '.', flag, '=', NEXT, ';')\n refresh(block)\n poll(\n 'if(', NEXT, '!==', CURRENT_STATE, '.', flag, '){',\n block,\n '}')\n })\n\n Object.keys(GL_VARIABLES).forEach(function (name) {\n var func = GL_VARIABLES[name]\n var init = currentState[name]\n var NEXT, CURRENT\n var block = env.block()\n block(GL, '.', func, '(')\n if (isArrayLike(init)) {\n var n = init.length\n NEXT = env.global.def(NEXT_STATE, '.', name)\n CURRENT = env.global.def(CURRENT_STATE, '.', name)\n block(\n loop(n, function (i) {\n return NEXT + '[' + i + ']'\n }), ');',\n loop(n, function (i) {\n return CURRENT + '[' + i + ']=' + NEXT + '[' + i + '];'\n }).join(''))\n poll(\n 'if(', loop(n, function (i) {\n return NEXT + '[' + i + ']!==' + CURRENT + '[' + i + ']'\n }).join('||'), '){',\n block,\n '}')\n } else {\n NEXT = common.def(NEXT_STATE, '.', name)\n CURRENT = common.def(CURRENT_STATE, '.', name)\n block(\n NEXT, ');',\n CURRENT_STATE, '.', name, '=', NEXT, ';')\n poll(\n 'if(', NEXT, '!==', CURRENT, '){',\n block,\n '}')\n }\n refresh(block)\n })\n\n return env.compile()\n })(),\n compile: compileCommand\n }\n}\n\nfunction stats () {\n return {\n vaoCount: 0,\n bufferCount: 0,\n elementsCount: 0,\n framebufferCount: 0,\n shaderCount: 0,\n textureCount: 0,\n cubeCount: 0,\n renderbufferCount: 0,\n maxTextureUnits: 0\n }\n}\n\nvar GL_QUERY_RESULT_EXT = 0x8866\nvar GL_QUERY_RESULT_AVAILABLE_EXT = 0x8867\nvar GL_TIME_ELAPSED_EXT = 0x88BF\n\nvar createTimer = function (gl, extensions) {\n if (!extensions.ext_disjoint_timer_query) {\n return null\n }\n\n // QUERY POOL BEGIN\n var queryPool = []\n function allocQuery () {\n return queryPool.pop() || extensions.ext_disjoint_timer_query.createQueryEXT()\n }\n function freeQuery (query) {\n queryPool.push(query)\n }\n // QUERY POOL END\n\n var pendingQueries = []\n function beginQuery (stats) {\n var query = allocQuery()\n extensions.ext_disjoint_timer_query.beginQueryEXT(GL_TIME_ELAPSED_EXT, query)\n pendingQueries.push(query)\n pushScopeStats(pendingQueries.length - 1, pendingQueries.length, stats)\n }\n\n function endQuery () {\n extensions.ext_disjoint_timer_query.endQueryEXT(GL_TIME_ELAPSED_EXT)\n }\n\n //\n // Pending stats pool.\n //\n function PendingStats () {\n this.startQueryIndex = -1\n this.endQueryIndex = -1\n this.sum = 0\n this.stats = null\n }\n var pendingStatsPool = []\n function allocPendingStats () {\n return pendingStatsPool.pop() || new PendingStats()\n }\n function freePendingStats (pendingStats) {\n pendingStatsPool.push(pendingStats)\n }\n // Pending stats pool end\n\n var pendingStats = []\n function pushScopeStats (start, end, stats) {\n var ps = allocPendingStats()\n ps.startQueryIndex = start\n ps.endQueryIndex = end\n ps.sum = 0\n ps.stats = stats\n pendingStats.push(ps)\n }\n\n // we should call this at the beginning of the frame,\n // in order to update gpuTime\n var timeSum = []\n var queryPtr = []\n function update () {\n var ptr, i\n\n var n = pendingQueries.length\n if (n === 0) {\n return\n }\n\n // Reserve space\n queryPtr.length = Math.max(queryPtr.length, n + 1)\n timeSum.length = Math.max(timeSum.length, n + 1)\n timeSum[0] = 0\n queryPtr[0] = 0\n\n // Update all pending timer queries\n var queryTime = 0\n ptr = 0\n for (i = 0; i < pendingQueries.length; ++i) {\n var query = pendingQueries[i]\n if (extensions.ext_disjoint_timer_query.getQueryObjectEXT(query, GL_QUERY_RESULT_AVAILABLE_EXT)) {\n queryTime += extensions.ext_disjoint_timer_query.getQueryObjectEXT(query, GL_QUERY_RESULT_EXT)\n freeQuery(query)\n } else {\n pendingQueries[ptr++] = query\n }\n timeSum[i + 1] = queryTime\n queryPtr[i + 1] = ptr\n }\n pendingQueries.length = ptr\n\n // Update all pending stat queries\n ptr = 0\n for (i = 0; i < pendingStats.length; ++i) {\n var stats = pendingStats[i]\n var start = stats.startQueryIndex\n var end = stats.endQueryIndex\n stats.sum += timeSum[end] - timeSum[start]\n var startPtr = queryPtr[start]\n var endPtr = queryPtr[end]\n if (endPtr === startPtr) {\n stats.stats.gpuTime += stats.sum / 1e6\n freePendingStats(stats)\n } else {\n stats.startQueryIndex = startPtr\n stats.endQueryIndex = endPtr\n pendingStats[ptr++] = stats\n }\n }\n pendingStats.length = ptr\n }\n\n return {\n beginQuery: beginQuery,\n endQuery: endQuery,\n pushScopeStats: pushScopeStats,\n update: update,\n getNumPendingQueries: function () {\n return pendingQueries.length\n },\n clear: function () {\n queryPool.push.apply(queryPool, pendingQueries)\n for (var i = 0; i < queryPool.length; i++) {\n extensions.ext_disjoint_timer_query.deleteQueryEXT(queryPool[i])\n }\n pendingQueries.length = 0\n queryPool.length = 0\n },\n restore: function () {\n pendingQueries.length = 0\n queryPool.length = 0\n }\n }\n}\n\nvar GL_COLOR_BUFFER_BIT = 16384\nvar GL_DEPTH_BUFFER_BIT = 256\nvar GL_STENCIL_BUFFER_BIT = 1024\n\nvar GL_ARRAY_BUFFER = 34962\n\nvar CONTEXT_LOST_EVENT = 'webglcontextlost'\nvar CONTEXT_RESTORED_EVENT = 'webglcontextrestored'\n\nvar DYN_PROP = 1\nvar DYN_CONTEXT = 2\nvar DYN_STATE = 3\n\nfunction find (haystack, needle) {\n for (var i = 0; i < haystack.length; ++i) {\n if (haystack[i] === needle) {\n return i\n }\n }\n return -1\n}\n\nfunction wrapREGL (args) {\n var config = parseArgs(args)\n if (!config) {\n return null\n }\n\n var gl = config.gl\n var glAttributes = gl.getContextAttributes()\n var contextLost = gl.isContextLost()\n\n var extensionState = createExtensionCache(gl, config)\n if (!extensionState) {\n return null\n }\n\n var stringStore = createStringStore()\n var stats$$1 = stats()\n var extensions = extensionState.extensions\n var timer = createTimer(gl, extensions)\n\n var START_TIME = clock()\n var WIDTH = gl.drawingBufferWidth\n var HEIGHT = gl.drawingBufferHeight\n\n var contextState = {\n tick: 0,\n time: 0,\n viewportWidth: WIDTH,\n viewportHeight: HEIGHT,\n framebufferWidth: WIDTH,\n framebufferHeight: HEIGHT,\n drawingBufferWidth: WIDTH,\n drawingBufferHeight: HEIGHT,\n pixelRatio: config.pixelRatio\n }\n var uniformState = {}\n var drawState = {\n elements: null,\n primitive: 4, // GL_TRIANGLES\n count: -1,\n offset: 0,\n instances: -1\n }\n\n var limits = wrapLimits(gl, extensions)\n var bufferState = wrapBufferState(\n gl,\n stats$$1,\n config,\n destroyBuffer)\n var attributeState = wrapAttributeState(\n gl,\n extensions,\n limits,\n stats$$1,\n bufferState)\n function destroyBuffer (buffer) {\n return attributeState.destroyBuffer(buffer)\n }\n var elementState = wrapElementsState(gl, extensions, bufferState, stats$$1)\n var shaderState = wrapShaderState(gl, stringStore, stats$$1, config)\n var textureState = createTextureSet(\n gl,\n extensions,\n limits,\n function () { core.procs.poll() },\n contextState,\n stats$$1,\n config)\n var renderbufferState = wrapRenderbuffers(gl, extensions, limits, stats$$1, config)\n var framebufferState = wrapFBOState(\n gl,\n extensions,\n limits,\n textureState,\n renderbufferState,\n stats$$1)\n var core = reglCore(\n gl,\n stringStore,\n extensions,\n limits,\n bufferState,\n elementState,\n textureState,\n framebufferState,\n uniformState,\n attributeState,\n shaderState,\n drawState,\n contextState,\n timer,\n config)\n var readPixels = wrapReadPixels(\n gl,\n framebufferState,\n core.procs.poll,\n contextState,\n glAttributes, extensions, limits)\n\n var nextState = core.next\n var canvas = gl.canvas\n\n var rafCallbacks = []\n var lossCallbacks = []\n var restoreCallbacks = []\n var destroyCallbacks = [config.onDestroy]\n\n var activeRAF = null\n function handleRAF () {\n if (rafCallbacks.length === 0) {\n if (timer) {\n timer.update()\n }\n activeRAF = null\n return\n }\n\n // schedule next animation frame\n activeRAF = raf.next(handleRAF)\n\n // poll for changes\n poll()\n\n // fire a callback for all pending rafs\n for (var i = rafCallbacks.length - 1; i >= 0; --i) {\n var cb = rafCallbacks[i]\n if (cb) {\n cb(contextState, null, 0)\n }\n }\n\n // flush all pending webgl calls\n gl.flush()\n\n // poll GPU timers *after* gl.flush so we don't delay command dispatch\n if (timer) {\n timer.update()\n }\n }\n\n function startRAF () {\n if (!activeRAF && rafCallbacks.length > 0) {\n activeRAF = raf.next(handleRAF)\n }\n }\n\n function stopRAF () {\n if (activeRAF) {\n raf.cancel(handleRAF)\n activeRAF = null\n }\n }\n\n function handleContextLoss (event) {\n event.preventDefault()\n\n // set context lost flag\n contextLost = true\n\n // pause request animation frame\n stopRAF()\n\n // lose context\n lossCallbacks.forEach(function (cb) {\n cb()\n })\n }\n\n function handleContextRestored (event) {\n // clear error code\n gl.getError()\n\n // clear context lost flag\n contextLost = false\n\n // refresh state\n extensionState.restore()\n shaderState.restore()\n bufferState.restore()\n textureState.restore()\n renderbufferState.restore()\n framebufferState.restore()\n attributeState.restore()\n if (timer) {\n timer.restore()\n }\n\n // refresh state\n core.procs.refresh()\n\n // restart RAF\n startRAF()\n\n // restore context\n restoreCallbacks.forEach(function (cb) {\n cb()\n })\n }\n\n if (canvas) {\n canvas.addEventListener(CONTEXT_LOST_EVENT, handleContextLoss, false)\n canvas.addEventListener(CONTEXT_RESTORED_EVENT, handleContextRestored, false)\n }\n\n function destroy () {\n rafCallbacks.length = 0\n stopRAF()\n\n if (canvas) {\n canvas.removeEventListener(CONTEXT_LOST_EVENT, handleContextLoss)\n canvas.removeEventListener(CONTEXT_RESTORED_EVENT, handleContextRestored)\n }\n\n shaderState.clear()\n framebufferState.clear()\n renderbufferState.clear()\n textureState.clear()\n elementState.clear()\n bufferState.clear()\n attributeState.clear()\n\n if (timer) {\n timer.clear()\n }\n\n destroyCallbacks.forEach(function (cb) {\n cb()\n })\n }\n\n function compileProcedure (options) {\n check$1(!!options, 'invalid args to regl({...})')\n check$1.type(options, 'object', 'invalid args to regl({...})')\n\n function flattenNestedOptions (options) {\n var result = extend({}, options)\n delete result.uniforms\n delete result.attributes\n delete result.context\n delete result.vao\n\n if ('stencil' in result && result.stencil.op) {\n result.stencil.opBack = result.stencil.opFront = result.stencil.op\n delete result.stencil.op\n }\n\n function merge (name) {\n if (name in result) {\n var child = result[name]\n delete result[name]\n Object.keys(child).forEach(function (prop) {\n result[name + '.' + prop] = child[prop]\n })\n }\n }\n merge('blend')\n merge('depth')\n merge('cull')\n merge('stencil')\n merge('polygonOffset')\n merge('scissor')\n merge('sample')\n\n if ('vao' in options) {\n result.vao = options.vao\n }\n\n return result\n }\n\n function separateDynamic (object, useArrays) {\n var staticItems = {}\n var dynamicItems = {}\n Object.keys(object).forEach(function (option) {\n var value = object[option]\n if (dynamic.isDynamic(value)) {\n dynamicItems[option] = dynamic.unbox(value, option)\n return\n } else if (useArrays && Array.isArray(value)) {\n for (var i = 0; i < value.length; ++i) {\n if (dynamic.isDynamic(value[i])) {\n dynamicItems[option] = dynamic.unbox(value, option)\n return\n }\n }\n }\n staticItems[option] = value\n })\n return {\n dynamic: dynamicItems,\n static: staticItems\n }\n }\n\n // Treat context variables separate from other dynamic variables\n var context = separateDynamic(options.context || {}, true)\n var uniforms = separateDynamic(options.uniforms || {}, true)\n var attributes = separateDynamic(options.attributes || {}, false)\n var opts = separateDynamic(flattenNestedOptions(options), false)\n\n var stats$$1 = {\n gpuTime: 0.0,\n cpuTime: 0.0,\n count: 0\n }\n\n var compiled = core.compile(opts, attributes, uniforms, context, stats$$1)\n\n var draw = compiled.draw\n var batch = compiled.batch\n var scope = compiled.scope\n\n // FIXME: we should modify code generation for batch commands so this\n // isn't necessary\n var EMPTY_ARRAY = []\n function reserve (count) {\n while (EMPTY_ARRAY.length < count) {\n EMPTY_ARRAY.push(null)\n }\n return EMPTY_ARRAY\n }\n\n function REGLCommand (args, body) {\n var i\n if (contextLost) {\n check$1.raise('context lost')\n }\n if (typeof args === 'function') {\n return scope.call(this, null, args, 0)\n } else if (typeof body === 'function') {\n if (typeof args === 'number') {\n for (i = 0; i < args; ++i) {\n scope.call(this, null, body, i)\n }\n } else if (Array.isArray(args)) {\n for (i = 0; i < args.length; ++i) {\n scope.call(this, args[i], body, i)\n }\n } else {\n return scope.call(this, args, body, 0)\n }\n } else if (typeof args === 'number') {\n if (args > 0) {\n return batch.call(this, reserve(args | 0), args | 0)\n }\n } else if (Array.isArray(args)) {\n if (args.length) {\n return batch.call(this, args, args.length)\n }\n } else {\n return draw.call(this, args)\n }\n }\n\n return extend(REGLCommand, {\n stats: stats$$1,\n destroy: function () {\n compiled.destroy()\n }\n })\n }\n\n var setFBO = framebufferState.setFBO = compileProcedure({\n framebuffer: dynamic.define.call(null, DYN_PROP, 'framebuffer')\n })\n\n function clearImpl (_, options) {\n var clearFlags = 0\n core.procs.poll()\n\n var c = options.color\n if (c) {\n gl.clearColor(+c[0] || 0, +c[1] || 0, +c[2] || 0, +c[3] || 0)\n clearFlags |= GL_COLOR_BUFFER_BIT\n }\n if ('depth' in options) {\n gl.clearDepth(+options.depth)\n clearFlags |= GL_DEPTH_BUFFER_BIT\n }\n if ('stencil' in options) {\n gl.clearStencil(options.stencil | 0)\n clearFlags |= GL_STENCIL_BUFFER_BIT\n }\n\n check$1(!!clearFlags, 'called regl.clear with no buffer specified')\n gl.clear(clearFlags)\n }\n\n function clear (options) {\n check$1(\n typeof options === 'object' && options,\n 'regl.clear() takes an object as input')\n if ('framebuffer' in options) {\n if (options.framebuffer &&\n options.framebuffer_reglType === 'framebufferCube') {\n for (var i = 0; i < 6; ++i) {\n setFBO(extend({\n framebuffer: options.framebuffer.faces[i]\n }, options), clearImpl)\n }\n } else {\n setFBO(options, clearImpl)\n }\n } else {\n clearImpl(null, options)\n }\n }\n\n function frame (cb) {\n check$1.type(cb, 'function', 'regl.frame() callback must be a function')\n rafCallbacks.push(cb)\n\n function cancel () {\n // FIXME: should we check something other than equals cb here?\n // what if a user calls frame twice with the same callback...\n //\n var i = find(rafCallbacks, cb)\n check$1(i >= 0, 'cannot cancel a frame twice')\n function pendingCancel () {\n var index = find(rafCallbacks, pendingCancel)\n rafCallbacks[index] = rafCallbacks[rafCallbacks.length - 1]\n rafCallbacks.length -= 1\n if (rafCallbacks.length <= 0) {\n stopRAF()\n }\n }\n rafCallbacks[i] = pendingCancel\n }\n\n startRAF()\n\n return {\n cancel: cancel\n }\n }\n\n // poll viewport\n function pollViewport () {\n var viewport = nextState.viewport\n var scissorBox = nextState.scissor_box\n viewport[0] = viewport[1] = scissorBox[0] = scissorBox[1] = 0\n contextState.viewportWidth =\n contextState.framebufferWidth =\n contextState.drawingBufferWidth =\n viewport[2] =\n scissorBox[2] = gl.drawingBufferWidth\n contextState.viewportHeight =\n contextState.framebufferHeight =\n contextState.drawingBufferHeight =\n viewport[3] =\n scissorBox[3] = gl.drawingBufferHeight\n }\n\n function poll () {\n contextState.tick += 1\n contextState.time = now()\n pollViewport()\n core.procs.poll()\n }\n\n function refresh () {\n textureState.refresh()\n pollViewport()\n core.procs.refresh()\n if (timer) {\n timer.update()\n }\n }\n\n function now () {\n return (clock() - START_TIME) / 1000.0\n }\n\n refresh()\n\n function addListener (event, callback) {\n check$1.type(callback, 'function', 'listener callback must be a function')\n\n var callbacks\n switch (event) {\n case 'frame':\n return frame(callback)\n case 'lost':\n callbacks = lossCallbacks\n break\n case 'restore':\n callbacks = restoreCallbacks\n break\n case 'destroy':\n callbacks = destroyCallbacks\n break\n default:\n check$1.raise('invalid event, must be one of frame,lost,restore,destroy')\n }\n\n callbacks.push(callback)\n return {\n cancel: function () {\n for (var i = 0; i < callbacks.length; ++i) {\n if (callbacks[i] === callback) {\n callbacks[i] = callbacks[callbacks.length - 1]\n callbacks.pop()\n return\n }\n }\n }\n }\n }\n\n var regl = extend(compileProcedure, {\n // Clear current FBO\n clear: clear,\n\n // Short cuts for dynamic variables\n prop: dynamic.define.bind(null, DYN_PROP),\n context: dynamic.define.bind(null, DYN_CONTEXT),\n this: dynamic.define.bind(null, DYN_STATE),\n\n // executes an empty draw command\n draw: compileProcedure({}),\n\n // Resources\n buffer: function (options) {\n return bufferState.create(options, GL_ARRAY_BUFFER, false, false)\n },\n elements: function (options) {\n return elementState.create(options, false)\n },\n texture: textureState.create2D,\n cube: textureState.createCube,\n renderbuffer: renderbufferState.create,\n framebuffer: framebufferState.create,\n framebufferCube: framebufferState.createCube,\n vao: attributeState.createVAO,\n\n // Expose context attributes\n attributes: glAttributes,\n\n // Frame rendering\n frame: frame,\n on: addListener,\n\n // System limits\n limits: limits,\n hasExtension: function (name) {\n return limits.extensions.indexOf(name.toLowerCase()) >= 0\n },\n\n // Read pixels\n read: readPixels,\n\n // Destroy regl and all associated resources\n destroy: destroy,\n\n // Direct GL state manipulation\n _gl: gl,\n _refresh: refresh,\n\n poll: function () {\n poll()\n if (timer) {\n timer.update()\n }\n },\n\n // Current time\n now: now,\n\n // regl Statistics Information\n stats: stats$$1\n })\n\n config.onDone(null, regl)\n\n return regl\n}\n\nreturn wrapREGL;\n\n})));\n//# sourceMappingURL=regl.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVnbC9kaXN0L3JlZ2wuanM/N2RiYiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBLElBQUksS0FBNEQ7QUFDaEUsSUFBSSxTQUMrQjtBQUNuQyxDQUFDLHFCQUFxQjs7QUFFdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGlCQUFpQixpQkFBaUI7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsa0JBQWtCO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSw2RUFBNkUsMEJBQTBCOztBQUV2RztBQUNBO0FBQ0EseUVBQXlFO0FBQ3pFLDRDQUE0Qyx5QkFBeUI7O0FBRXJFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG1CQUFtQiwwQkFBMEI7QUFDN0M7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsaUJBQWlCLGtCQUFrQjtBQUNuQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQSxtQkFBbUIsUUFBUTtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsaUJBQWlCLHFCQUFxQjtBQUN0QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCLHFCQUFxQiw0QkFBNEI7QUFDakQ7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CLG1CQUFtQjs7QUFFbkI7QUFDQSxtQkFBbUI7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBLGlCQUFpQiw4QkFBOEI7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxpQkFBaUIsT0FBTztBQUN4QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGtCQUFrQixnQkFBZ0I7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQSxlQUFlO0FBQ2Y7QUFDQSxlQUFlO0FBQ2Y7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7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QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0M7O0FBRXRDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUEsaUJBQWlCLGtCQUFrQjtBQUNuQztBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsaUJBQWlCLE9BQU87QUFDeEIsbUJBQW1CLE9BQU87QUFDMUIscUJBQXFCLE9BQU87QUFDNUI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEdBQUcsSUFBSTs7QUFFUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLHdCQUF3QjtBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsb0JBQW9CO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG1CQUFtQixtQkFBbUI7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLFFBQVE7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG1CQUFtQixtQkFBbUI7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxvQkFBb0I7QUFDcEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixpQkFBaUI7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FB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UDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxlQUFlLDZCQUE2QjtBQUM1QztBQUNBO0FBQ0EscUNBQXFDLGdDQUFnQztBQUNyRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FB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Q0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGVBQWUsbUJBQW1CO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsd0JBQXdCO0FBQzNDO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLOztBQUVMOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLHFCQUFxQjtBQUN4QztBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxvRUFBb0U7O0FBRXBFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZFQUE2RTtBQUM3RTs7QUFFQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXOztBQUVYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVzs7QUFFWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFD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Q0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0EsYUFBYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBLGFBQWE7O0FBRWI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7O0FBRWY7QUFDQTtBQUNBO0FBQ0EsYUFBYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTs7QUFFZjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCOztBQUVqQjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTs7QUFFZjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGFBQWE7O0FBRWI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7O0FBRWY7QUFDQSxzRUFBc0U7QUFDdEU7QUFDQSw4REFBOEQ7QUFDOUQsa0VBQWtFOztBQUVsRTs7QUFFQTtBQUNBLGFBQWE7O0FBRWI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBLGVBQWU7QUFDZixhQUFhOztBQUViO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBLGFBQWE7O0FBRWI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlOztBQUVmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjs7QUFFakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhOztBQUViO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTs7QUFFZjtBQUNBOztBQUVBO0FBQ0EsYUFBYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0EsYUFBYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7O0FBRWY7QUFDQSxhQUFhOztBQUViO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0EsYUFBYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2Q0FBNkMsYUFBYTtBQUMxRCxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQSxlQUFlO0FBQ2YsYUFBYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQSxLQUFLOztBQUVMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYLFNBQVM7QUFDVDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLOztBQUVMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2YsYUFBYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLOztBQUVMO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVB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SztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxpQkFBaUIscUJBQXFCO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLG9CQUFvQjtBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EseUNBQXlDLFFBQVE7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQSw4Q0FBOEMsSUFBSTtBQUNsRCwyREFBMkQsSUFBSTs7QUFFL0Q7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULHlCQUF5QixrQkFBa0I7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHVEQUF1RDtBQUN2RCx5REFBeUQ7QUFDekQsNkRBQTZEO0FBQzdEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLHFCQUFxQixVQUFVO0FBQy9CO0FBQ0E7QUFDQSxTQUFTO0FBQ1QscUJBQXFCLGlCQUFpQjtBQUN0QztBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLE9BQU87QUFDOUI7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLHNCQUFzQjtBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsNkJBQTZCOztBQUU3QjtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDs7QUFFQTtBQUNBOztBQUVBOztBQUVBLENBQUM7QUFDRCIsImZpbGUiOiIyODMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpIDpcbiAgICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoZmFjdG9yeSkgOlxuICAgIChnbG9iYWwuY3JlYXRlUkVHTCA9IGZhY3RvcnkoKSk7XG59KHRoaXMsIChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JztcblxudmFyIGlzVHlwZWRBcnJheSA9IGZ1bmN0aW9uICh4KSB7XG4gIHJldHVybiAoXG4gICAgeCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgfHxcbiAgICB4IGluc3RhbmNlb2YgVWludDE2QXJyYXkgfHxcbiAgICB4IGluc3RhbmNlb2YgVWludDMyQXJyYXkgfHxcbiAgICB4IGluc3RhbmNlb2YgSW50OEFycmF5IHx8XG4gICAgeCBpbnN0YW5jZW9mIEludDE2QXJyYXkgfHxcbiAgICB4IGluc3RhbmNlb2YgSW50MzJBcnJheSB8fFxuICAgIHggaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXkgfHxcbiAgICB4IGluc3RhbmNlb2YgRmxvYXQ2NEFycmF5IHx8XG4gICAgeCBpbnN0YW5jZW9mIFVpbnQ4Q2xhbXBlZEFycmF5XG4gIClcbn1cblxudmFyIGV4dGVuZCA9IGZ1bmN0aW9uIChiYXNlLCBvcHRzKSB7XG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMob3B0cylcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgKytpKSB7XG4gICAgYmFzZVtrZXlzW2ldXSA9IG9wdHNba2V5c1tpXV1cbiAgfVxuICByZXR1cm4gYmFzZVxufVxuXG4vLyBFcnJvciBjaGVja2luZyBhbmQgcGFyYW1ldGVyIHZhbGlkYXRpb24uXG4vL1xuLy8gU3RhdGVtZW50cyBmb3IgdGhlIGZvcm0gYGNoZWNrLnNvbWVQcm9jZWR1cmUoLi4uKWAgZ2V0IHJlbW92ZWQgYnlcbi8vIGEgYnJvd3NlcmlmeSB0cmFuc2Zvcm0gZm9yIG9wdGltaXplZC9taW5pZmllZCBidW5kbGVzLlxuLy9cbi8qIGdsb2JhbHMgYXRvYiAqL1xudmFyIGVuZGwgPSAnXFxuJ1xuXG4vLyBvbmx5IHVzZWQgZm9yIGV4dHJhY3Rpbmcgc2hhZGVyIG5hbWVzLiAgaWYgYXRvYiBub3QgcHJlc2VudCwgdGhlbiBlcnJvcnNcbi8vIHdpbGwgYmUgc2xpZ2h0bHkgY3JhcHBpZXJcbmZ1bmN0aW9uIGRlY29kZUI2NCAoc3RyKSB7XG4gIGlmICh0eXBlb2YgYXRvYiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gYXRvYihzdHIpXG4gIH1cbiAgcmV0dXJuICdiYXNlNjQ6JyArIHN0clxufVxuXG5mdW5jdGlvbiByYWlzZSAobWVzc2FnZSkge1xuICB2YXIgZXJyb3IgPSBuZXcgRXJyb3IoJyhyZWdsKSAnICsgbWVzc2FnZSlcbiAgY29uc29sZS5lcnJvcihlcnJvcilcbiAgdGhyb3cgZXJyb3Jcbn1cblxuZnVuY3Rpb24gY2hlY2sgKHByZWQsIG1lc3NhZ2UpIHtcbiAgaWYgKCFwcmVkKSB7XG4gICAgcmFpc2UobWVzc2FnZSlcbiAgfVxufVxuXG5mdW5jdGlvbiBlbmNvbG9uIChtZXNzYWdlKSB7XG4gIGlmIChtZXNzYWdlKSB7XG4gICAgcmV0dXJuICc6ICcgKyBtZXNzYWdlXG4gIH1cbiAgcmV0dXJuICcnXG59XG5cbmZ1bmN0aW9uIGNoZWNrUGFyYW1ldGVyIChwYXJhbSwgcG9zc2liaWxpdGllcywgbWVzc2FnZSkge1xuICBpZiAoIShwYXJhbSBpbiBwb3NzaWJpbGl0aWVzKSkge1xuICAgIHJhaXNlKCd1bmtub3duIHBhcmFtZXRlciAoJyArIHBhcmFtICsgJyknICsgZW5jb2xvbihtZXNzYWdlKSArXG4gICAgICAgICAgJy4gcG9zc2libGUgdmFsdWVzOiAnICsgT2JqZWN0LmtleXMocG9zc2liaWxpdGllcykuam9pbigpKVxuICB9XG59XG5cbmZ1bmN0aW9uIGNoZWNrSXNUeXBlZEFycmF5IChkYXRhLCBtZXNzYWdlKSB7XG4gIGlmICghaXNUeXBlZEFycmF5KGRhdGEpKSB7XG4gICAgcmFpc2UoXG4gICAgICAnaW52YWxpZCBwYXJhbWV0ZXIgdHlwZScgKyBlbmNvbG9uKG1lc3NhZ2UpICtcbiAgICAgICcuIG11c3QgYmUgYSB0eXBlZCBhcnJheScpXG4gIH1cbn1cblxuZnVuY3Rpb24gc3RhbmRhcmRUeXBlRWggKHZhbHVlLCB0eXBlKSB7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ251bWJlcic6IHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInXG4gICAgY2FzZSAnb2JqZWN0JzogcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCdcbiAgICBjYXNlICdzdHJpbmcnOiByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJ1xuICAgIGNhc2UgJ2Jvb2xlYW4nOiByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbidcbiAgICBjYXNlICdmdW5jdGlvbic6IHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbidcbiAgICBjYXNlICd1bmRlZmluZWQnOiByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJ1xuICAgIGNhc2UgJ3N5bWJvbCc6IHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzeW1ib2wnXG4gIH1cbn1cblxuZnVuY3Rpb24gY2hlY2tUeXBlT2YgKHZhbHVlLCB0eXBlLCBtZXNzYWdlKSB7XG4gIGlmICghc3RhbmRhcmRUeXBlRWgodmFsdWUsIHR5cGUpKSB7XG4gICAgcmFpc2UoXG4gICAgICAnaW52YWxpZCBwYXJhbWV0ZXIgdHlwZScgKyBlbmNvbG9uKG1lc3NhZ2UpICtcbiAgICAgICcuIGV4cGVjdGVkICcgKyB0eXBlICsgJywgZ290ICcgKyAodHlwZW9mIHZhbHVlKSlcbiAgfVxufVxuXG5mdW5jdGlvbiBjaGVja05vbk5lZ2F0aXZlSW50ICh2YWx1ZSwgbWVzc2FnZSkge1xuICBpZiAoISgodmFsdWUgPj0gMCkgJiZcbiAgICAgICAgKCh2YWx1ZSB8IDApID09PSB2YWx1ZSkpKSB7XG4gICAgcmFpc2UoJ2ludmFsaWQgcGFyYW1ldGVyIHR5cGUsICgnICsgdmFsdWUgKyAnKScgKyBlbmNvbG9uKG1lc3NhZ2UpICtcbiAgICAgICAgICAnLiBtdXN0IGJlIGEgbm9ubmVnYXRpdmUgaW50ZWdlcicpXG4gIH1cbn1cblxuZnVuY3Rpb24gY2hlY2tPbmVPZiAodmFsdWUsIGxpc3QsIG1lc3NhZ2UpIHtcbiAgaWYgKGxpc3QuaW5kZXhPZih2YWx1ZSkgPCAwKSB7XG4gICAgcmFpc2UoJ2ludmFsaWQgdmFsdWUnICsgZW5jb2xvbihtZXNzYWdlKSArICcuIG11c3QgYmUgb25lIG9mOiAnICsgbGlzdClcbiAgfVxufVxuXG52YXIgY29uc3RydWN0b3JLZXlzID0gW1xuICAnZ2wnLFxuICAnY2FudmFzJyxcbiAgJ2NvbnRhaW5lcicsXG4gICdhdHRyaWJ1dGVzJyxcbiAgJ3BpeGVsUmF0aW8nLFxuICAnZXh0ZW5zaW9ucycsXG4gICdvcHRpb25hbEV4dGVuc2lvbnMnLFxuICAncHJvZmlsZScsXG4gICdvbkRvbmUnXG5dXG5cbmZ1bmN0aW9uIGNoZWNrQ29uc3RydWN0b3IgKG9iaikge1xuICBPYmplY3Qua2V5cyhvYmopLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgIGlmIChjb25zdHJ1Y3RvcktleXMuaW5kZXhPZihrZXkpIDwgMCkge1xuICAgICAgcmFpc2UoJ2ludmFsaWQgcmVnbCBjb25zdHJ1Y3RvciBhcmd1bWVudCBcIicgKyBrZXkgKyAnXCIuIG11c3QgYmUgb25lIG9mICcgKyBjb25zdHJ1Y3RvcktleXMpXG4gICAgfVxuICB9KVxufVxuXG5mdW5jdGlvbiBsZWZ0UGFkIChzdHIsIG4pIHtcbiAgc3RyID0gc3RyICsgJydcbiAgd2hpbGUgKHN0ci5sZW5ndGggPCBuKSB7XG4gICAgc3RyID0gJyAnICsgc3RyXG4gIH1cbiAgcmV0dXJuIHN0clxufVxuXG5mdW5jdGlvbiBTaGFkZXJGaWxlICgpIHtcbiAgdGhpcy5uYW1lID0gJ3Vua25vd24nXG4gIHRoaXMubGluZXMgPSBbXVxuICB0aGlzLmluZGV4ID0ge31cbiAgdGhpcy5oYXNFcnJvcnMgPSBmYWxzZVxufVxuXG5mdW5jdGlvbiBTaGFkZXJMaW5lIChudW1iZXIsIGxpbmUpIHtcbiAgdGhpcy5udW1iZXIgPSBudW1iZXJcbiAgdGhpcy5saW5lID0gbGluZVxuICB0aGlzLmVycm9ycyA9IFtdXG59XG5cbmZ1bmN0aW9uIFNoYWRlckVycm9yIChmaWxlTnVtYmVyLCBsaW5lTnVtYmVyLCBtZXNzYWdlKSB7XG4gIHRoaXMuZmlsZSA9IGZpbGVOdW1iZXJcbiAgdGhpcy5saW5lID0gbGluZU51bWJlclxuICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlXG59XG5cbmZ1bmN0aW9uIGd1ZXNzQ29tbWFuZCAoKSB7XG4gIHZhciBlcnJvciA9IG5ldyBFcnJvcigpXG4gIHZhciBzdGFjayA9IChlcnJvci5zdGFjayB8fCBlcnJvcikudG9TdHJpbmcoKVxuICB2YXIgcGF0ID0gL2NvbXBpbGVQcm9jZWR1cmUuKlxcblxccyphdC4qXFwoKC4qKVxcKS8uZXhlYyhzdGFjaylcbiAgaWYgKHBhdCkge1xuICAgIHJldHVybiBwYXRbMV1cbiAgfVxuICB2YXIgcGF0MiA9IC9jb21waWxlUHJvY2VkdXJlLipcXG5cXHMqYXRcXHMrKC4qKShcXG58JCkvLmV4ZWMoc3RhY2spXG4gIGlmIChwYXQyKSB7XG4gICAgcmV0dXJuIHBhdDJbMV1cbiAgfVxuICByZXR1cm4gJ3Vua25vd24nXG59XG5cbmZ1bmN0aW9uIGd1ZXNzQ2FsbFNpdGUgKCkge1xuICB2YXIgZXJyb3IgPSBuZXcgRXJyb3IoKVxuICB2YXIgc3RhY2sgPSAoZXJyb3Iuc3RhY2sgfHwgZXJyb3IpLnRvU3RyaW5nKClcbiAgdmFyIHBhdCA9IC9hdCBSRUdMQ29tbWFuZC4qXFxuXFxzK2F0LipcXCgoLiopXFwpLy5leGVjKHN0YWNrKVxuICBpZiAocGF0KSB7XG4gICAgcmV0dXJuIHBhdFsxXVxuICB9XG4gIHZhciBwYXQyID0gL2F0IFJFR0xDb21tYW5kLipcXG5cXHMrYXRcXHMrKC4qKVxcbi8uZXhlYyhzdGFjaylcbiAgaWYgKHBhdDIpIHtcbiAgICByZXR1cm4gcGF0MlsxXVxuICB9XG4gIHJldHVybiAndW5rbm93bidcbn1cblxuZnVuY3Rpb24gcGFyc2VTb3VyY2UgKHNvdXJjZSwgY29tbWFuZCkge1xuICB2YXIgbGluZXMgPSBzb3VyY2Uuc3BsaXQoJ1xcbicpXG4gIHZhciBsaW5lTnVtYmVyID0gMVxuICB2YXIgZmlsZU51bWJlciA9IDBcbiAgdmFyIGZpbGVzID0ge1xuICAgIHVua25vd246IG5ldyBTaGFkZXJGaWxlKCksXG4gICAgMDogbmV3IFNoYWRlckZpbGUoKVxuICB9XG4gIGZpbGVzLnVua25vd24ubmFtZSA9IGZpbGVzWzBdLm5hbWUgPSBjb21tYW5kIHx8IGd1ZXNzQ29tbWFuZCgpXG4gIGZpbGVzLnVua25vd24ubGluZXMucHVzaChuZXcgU2hhZGVyTGluZSgwLCAnJykpXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyArK2kpIHtcbiAgICB2YXIgbGluZSA9IGxpbmVzW2ldXG4gICAgdmFyIHBhcnRzID0gL15cXHMqI1xccyooXFx3KylcXHMrKC4rKVxccyokLy5leGVjKGxpbmUpXG4gICAgaWYgKHBhcnRzKSB7XG4gICAgICBzd2l0Y2ggKHBhcnRzWzFdKSB7XG4gICAgICAgIGNhc2UgJ2xpbmUnOlxuICAgICAgICAgIHZhciBsaW5lTnVtYmVySW5mbyA9IC8oXFxkKykoXFxzK1xcZCspPy8uZXhlYyhwYXJ0c1syXSlcbiAgICAgICAgICBpZiAobGluZU51bWJlckluZm8pIHtcbiAgICAgICAgICAgIGxpbmVOdW1iZXIgPSBsaW5lTnVtYmVySW5mb1sxXSB8IDBcbiAgICAgICAgICAgIGlmIChsaW5lTnVtYmVySW5mb1syXSkge1xuICAgICAgICAgICAgICBmaWxlTnVtYmVyID0gbGluZU51bWJlckluZm9bMl0gfCAwXG4gICAgICAgICAgICAgIGlmICghKGZpbGVOdW1iZXIgaW4gZmlsZXMpKSB7XG4gICAgICAgICAgICAgICAgZmlsZXNbZmlsZU51bWJlcl0gPSBuZXcgU2hhZGVyRmlsZSgpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAnZGVmaW5lJzpcbiAgICAgICAgICB2YXIgbmFtZUluZm8gPSAvU0hBREVSX05BTUUoX0I2NCk/XFxzKyguKikkLy5leGVjKHBhcnRzWzJdKVxuICAgICAgICAgIGlmIChuYW1lSW5mbykge1xuICAgICAgICAgICAgZmlsZXNbZmlsZU51bWJlcl0ubmFtZSA9IChuYW1lSW5mb1sxXVxuICAgICAgICAgICAgICA/IGRlY29kZUI2NChuYW1lSW5mb1syXSlcbiAgICAgICAgICAgICAgOiBuYW1lSW5mb1syXSlcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG4gICAgZmlsZXNbZmlsZU51bWJlcl0ubGluZXMucHVzaChuZXcgU2hhZGVyTGluZShsaW5lTnVtYmVyKyssIGxpbmUpKVxuICB9XG4gIE9iamVjdC5rZXlzKGZpbGVzKS5mb3JFYWNoKGZ1bmN0aW9uIChmaWxlTnVtYmVyKSB7XG4gICAgdmFyIGZpbGUgPSBmaWxlc1tmaWxlTnVtYmVyXVxuICAgIGZpbGUubGluZXMuZm9yRWFjaChmdW5jdGlvbiAobGluZSkge1xuICAgICAgZmlsZS5pbmRleFtsaW5lLm51bWJlcl0gPSBsaW5lXG4gICAgfSlcbiAgfSlcbiAgcmV0dXJuIGZpbGVzXG59XG5cbmZ1bmN0aW9uIHBhcnNlRXJyb3JMb2cgKGVyckxvZykge1xuICB2YXIgcmVzdWx0ID0gW11cbiAgZXJyTG9nLnNwbGl0KCdcXG4nKS5mb3JFYWNoKGZ1bmN0aW9uIChlcnJNc2cpIHtcbiAgICBpZiAoZXJyTXNnLmxlbmd0aCA8IDUpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICB2YXIgcGFydHMgPSAvXkVSUk9SOlxccysoXFxkKyk6KFxcZCspOlxccyooLiopJC8uZXhlYyhlcnJNc2cpXG4gICAgaWYgKHBhcnRzKSB7XG4gICAgICByZXN1bHQucHVzaChuZXcgU2hhZGVyRXJyb3IoXG4gICAgICAgIHBhcnRzWzFdIHwgMCxcbiAgICAgICAgcGFydHNbMl0gfCAwLFxuICAgICAgICBwYXJ0c1szXS50cmltKCkpKVxuICAgIH0gZWxzZSBpZiAoZXJyTXNnLmxlbmd0aCA+IDApIHtcbiAgICAgIHJlc3VsdC5wdXNoKG5ldyBTaGFkZXJFcnJvcigndW5rbm93bicsIDAsIGVyck1zZykpXG4gICAgfVxuICB9KVxuICByZXR1cm4gcmVzdWx0XG59XG5cbmZ1bmN0aW9uIGFubm90YXRlRmlsZXMgKGZpbGVzLCBlcnJvcnMpIHtcbiAgZXJyb3JzLmZvckVhY2goZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgdmFyIGZpbGUgPSBmaWxlc1tlcnJvci5maWxlXVxuICAgIGlmIChmaWxlKSB7XG4gICAgICB2YXIgbGluZSA9IGZpbGUuaW5kZXhbZXJyb3IubGluZV1cbiAgICAgIGlmIChsaW5lKSB7XG4gICAgICAgIGxpbmUuZXJyb3JzLnB1c2goZXJyb3IpXG4gICAgICAgIGZpbGUuaGFzRXJyb3JzID0gdHJ1ZVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICB9XG4gICAgZmlsZXMudW5rbm93bi5oYXNFcnJvcnMgPSB0cnVlXG4gICAgZmlsZXMudW5rbm93bi5saW5lc1swXS5lcnJvcnMucHVzaChlcnJvcilcbiAgfSlcbn1cblxuZnVuY3Rpb24gY2hlY2tTaGFkZXJFcnJvciAoZ2wsIHNoYWRlciwgc291cmNlLCB0eXBlLCBjb21tYW5kKSB7XG4gIGlmICghZ2wuZ2V0U2hhZGVyUGFyYW1ldGVyKHNoYWRlciwgZ2wuQ09NUElMRV9TVEFUVVMpKSB7XG4gICAgdmFyIGVyckxvZyA9IGdsLmdldFNoYWRlckluZm9Mb2coc2hhZGVyKVxuICAgIHZhciB0eXBlTmFtZSA9IHR5cGUgPT09IGdsLkZSQUdNRU5UX1NIQURFUiA/ICdmcmFnbWVudCcgOiAndmVydGV4J1xuICAgIGNoZWNrQ29tbWFuZFR5cGUoc291cmNlLCAnc3RyaW5nJywgdHlwZU5hbWUgKyAnIHNoYWRlciBzb3VyY2UgbXVzdCBiZSBhIHN0cmluZycsIGNvbW1hbmQpXG4gICAgdmFyIGZpbGVzID0gcGFyc2VTb3VyY2Uoc291cmNlLCBjb21tYW5kKVxuICAgIHZhciBlcnJvcnMgPSBwYXJzZUVycm9yTG9nKGVyckxvZylcbiAgICBhbm5vdGF0ZUZpbGVzKGZpbGVzLCBlcnJvcnMpXG5cbiAgICBPYmplY3Qua2V5cyhmaWxlcykuZm9yRWFjaChmdW5jdGlvbiAoZmlsZU51bWJlcikge1xuICAgICAgdmFyIGZpbGUgPSBmaWxlc1tmaWxlTnVtYmVyXVxuICAgICAgaWYgKCFmaWxlLmhhc0Vycm9ycykge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgdmFyIHN0cmluZ3MgPSBbJyddXG4gICAgICB2YXIgc3R5bGVzID0gWycnXVxuXG4gICAgICBmdW5jdGlvbiBwdXNoIChzdHIsIHN0eWxlKSB7XG4gICAgICAgIHN0cmluZ3MucHVzaChzdHIpXG4gICAgICAgIHN0eWxlcy5wdXNoKHN0eWxlIHx8ICcnKVxuICAgICAgfVxuXG4gICAgICBwdXNoKCdmaWxlIG51bWJlciAnICsgZmlsZU51bWJlciArICc6ICcgKyBmaWxlLm5hbWUgKyAnXFxuJywgJ2NvbG9yOnJlZDt0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO2ZvbnQtd2VpZ2h0OmJvbGQnKVxuXG4gICAgICBmaWxlLmxpbmVzLmZvckVhY2goZnVuY3Rpb24gKGxpbmUpIHtcbiAgICAgICAgaWYgKGxpbmUuZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBwdXNoKGxlZnRQYWQobGluZS5udW1iZXIsIDQpICsgJ3wgICcsICdiYWNrZ3JvdW5kLWNvbG9yOnllbGxvdzsgZm9udC13ZWlnaHQ6Ym9sZCcpXG4gICAgICAgICAgcHVzaChsaW5lLmxpbmUgKyBlbmRsLCAnY29sb3I6cmVkOyBiYWNrZ3JvdW5kLWNvbG9yOnllbGxvdzsgZm9udC13ZWlnaHQ6Ym9sZCcpXG5cbiAgICAgICAgICAvLyB0cnkgdG8gZ3Vlc3MgdG9rZW5cbiAgICAgICAgICB2YXIgb2Zmc2V0ID0gMFxuICAgICAgICAgIGxpbmUuZXJyb3JzLmZvckVhY2goZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgICB2YXIgbWVzc2FnZSA9IGVycm9yLm1lc3NhZ2VcbiAgICAgICAgICAgIHZhciB0b2tlbiA9IC9eXFxzKicoLiopJ1xccyo6XFxzKiguKikkLy5leGVjKG1lc3NhZ2UpXG4gICAgICAgICAgICBpZiAodG9rZW4pIHtcbiAgICAgICAgICAgICAgdmFyIHRva2VuUGF0ID0gdG9rZW5bMV1cbiAgICAgICAgICAgICAgbWVzc2FnZSA9IHRva2VuWzJdXG4gICAgICAgICAgICAgIHN3aXRjaCAodG9rZW5QYXQpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdhc3NpZ24nOlxuICAgICAgICAgICAgICAgICAgdG9rZW5QYXQgPSAnPSdcbiAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgb2Zmc2V0ID0gTWF0aC5tYXgobGluZS5saW5lLmluZGV4T2YodG9rZW5QYXQsIG9mZnNldCksIDApXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBvZmZzZXQgPSAwXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHB1c2gobGVmdFBhZCgnfCAnLCA2KSlcbiAgICAgICAgICAgIHB1c2gobGVmdFBhZCgnXl5eJywgb2Zmc2V0ICsgMykgKyBlbmRsLCAnZm9udC13ZWlnaHQ6Ym9sZCcpXG4gICAgICAgICAgICBwdXNoKGxlZnRQYWQoJ3wgJywgNikpXG4gICAgICAgICAgICBwdXNoKG1lc3NhZ2UgKyBlbmRsLCAnZm9udC13ZWlnaHQ6Ym9sZCcpXG4gICAgICAgICAgfSlcbiAgICAgICAgICBwdXNoKGxlZnRQYWQoJ3wgJywgNikgKyBlbmRsKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHB1c2gobGVmdFBhZChsaW5lLm51bWJlciwgNCkgKyAnfCAgJylcbiAgICAgICAgICBwdXNoKGxpbmUubGluZSArIGVuZGwsICdjb2xvcjpyZWQnKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgaWYgKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgIXdpbmRvdy5jaHJvbWUpIHtcbiAgICAgICAgc3R5bGVzWzBdID0gc3RyaW5ncy5qb2luKCclYycpXG4gICAgICAgIGNvbnNvbGUubG9nLmFwcGx5KGNvbnNvbGUsIHN0eWxlcylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKHN0cmluZ3Muam9pbignJykpXG4gICAgICB9XG4gICAgfSlcblxuICAgIGNoZWNrLnJhaXNlKCdFcnJvciBjb21waWxpbmcgJyArIHR5cGVOYW1lICsgJyBzaGFkZXIsICcgKyBmaWxlc1swXS5uYW1lKVxuICB9XG59XG5cbmZ1bmN0aW9uIGNoZWNrTGlua0Vycm9yIChnbCwgcHJvZ3JhbSwgZnJhZ1NoYWRlciwgdmVydFNoYWRlciwgY29tbWFuZCkge1xuICBpZiAoIWdsLmdldFByb2dyYW1QYXJhbWV0ZXIocHJvZ3JhbSwgZ2wuTElOS19TVEFUVVMpKSB7XG4gICAgdmFyIGVyckxvZyA9IGdsLmdldFByb2dyYW1JbmZvTG9nKHByb2dyYW0pXG4gICAgdmFyIGZyYWdQYXJzZSA9IHBhcnNlU291cmNlKGZyYWdTaGFkZXIsIGNvbW1hbmQpXG4gICAgdmFyIHZlcnRQYXJzZSA9IHBhcnNlU291cmNlKHZlcnRTaGFkZXIsIGNvbW1hbmQpXG5cbiAgICB2YXIgaGVhZGVyID0gJ0Vycm9yIGxpbmtpbmcgcHJvZ3JhbSB3aXRoIHZlcnRleCBzaGFkZXIsIFwiJyArXG4gICAgICB2ZXJ0UGFyc2VbMF0ubmFtZSArICdcIiwgYW5kIGZyYWdtZW50IHNoYWRlciBcIicgKyBmcmFnUGFyc2VbMF0ubmFtZSArICdcIidcblxuICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBjb25zb2xlLmxvZygnJWMnICsgaGVhZGVyICsgZW5kbCArICclYycgKyBlcnJMb2csXG4gICAgICAgICdjb2xvcjpyZWQ7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTtmb250LXdlaWdodDpib2xkJyxcbiAgICAgICAgJ2NvbG9yOnJlZCcpXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUubG9nKGhlYWRlciArIGVuZGwgKyBlcnJMb2cpXG4gICAgfVxuICAgIGNoZWNrLnJhaXNlKGhlYWRlcilcbiAgfVxufVxuXG5mdW5jdGlvbiBzYXZlQ29tbWFuZFJlZiAob2JqZWN0KSB7XG4gIG9iamVjdC5fY29tbWFuZFJlZiA9IGd1ZXNzQ29tbWFuZCgpXG59XG5cbmZ1bmN0aW9uIHNhdmVEcmF3Q29tbWFuZEluZm8gKG9wdHMsIHVuaWZvcm1zLCBhdHRyaWJ1dGVzLCBzdHJpbmdTdG9yZSkge1xuICBzYXZlQ29tbWFuZFJlZihvcHRzKVxuXG4gIGZ1bmN0aW9uIGlkIChzdHIpIHtcbiAgICBpZiAoc3RyKSB7XG4gICAgICByZXR1cm4gc3RyaW5nU3RvcmUuaWQoc3RyKVxuICAgIH1cbiAgICByZXR1cm4gMFxuICB9XG4gIG9wdHMuX2ZyYWdJZCA9IGlkKG9wdHMuc3RhdGljLmZyYWcpXG4gIG9wdHMuX3ZlcnRJZCA9IGlkKG9wdHMuc3RhdGljLnZlcnQpXG5cbiAgZnVuY3Rpb24gYWRkUHJvcHMgKGRpY3QsIHNldCkge1xuICAgIE9iamVjdC5rZXlzKHNldCkuZm9yRWFjaChmdW5jdGlvbiAodSkge1xuICAgICAgZGljdFtzdHJpbmdTdG9yZS5pZCh1KV0gPSB0cnVlXG4gICAgfSlcbiAgfVxuXG4gIHZhciB1bmlmb3JtU2V0ID0gb3B0cy5fdW5pZm9ybVNldCA9IHt9XG4gIGFkZFByb3BzKHVuaWZvcm1TZXQsIHVuaWZvcm1zLnN0YXRpYylcbiAgYWRkUHJvcHModW5pZm9ybVNldCwgdW5pZm9ybXMuZHluYW1pYylcblxuICB2YXIgYXR0cmlidXRlU2V0ID0gb3B0cy5fYXR0cmlidXRlU2V0ID0ge31cbiAgYWRkUHJvcHMoYXR0cmlidXRlU2V0LCBhdHRyaWJ1dGVzLnN0YXRpYylcbiAgYWRkUHJvcHMoYXR0cmlidXRlU2V0LCBhdHRyaWJ1dGVzLmR5bmFtaWMpXG5cbiAgb3B0cy5faGFzQ291bnQgPSAoXG4gICAgJ2NvdW50JyBpbiBvcHRzLnN0YXRpYyB8fFxuICAgICdjb3VudCcgaW4gb3B0cy5keW5hbWljIHx8XG4gICAgJ2VsZW1lbnRzJyBpbiBvcHRzLnN0YXRpYyB8fFxuICAgICdlbGVtZW50cycgaW4gb3B0cy5keW5hbWljKVxufVxuXG5mdW5jdGlvbiBjb21tYW5kUmFpc2UgKG1lc3NhZ2UsIGNvbW1hbmQpIHtcbiAgdmFyIGNhbGxTaXRlID0gZ3Vlc3NDYWxsU2l0ZSgpXG4gIHJhaXNlKG1lc3NhZ2UgK1xuICAgICcgaW4gY29tbWFuZCAnICsgKGNvbW1hbmQgfHwgZ3Vlc3NDb21tYW5kKCkpICtcbiAgICAoY2FsbFNpdGUgPT09ICd1bmtub3duJyA/ICcnIDogJyBjYWxsZWQgZnJvbSAnICsgY2FsbFNpdGUpKVxufVxuXG5mdW5jdGlvbiBjaGVja0NvbW1hbmQgKHByZWQsIG1lc3NhZ2UsIGNvbW1hbmQpIHtcbiAgaWYgKCFwcmVkKSB7XG4gICAgY29tbWFuZFJhaXNlKG1lc3NhZ2UsIGNvbW1hbmQgfHwgZ3Vlc3NDb21tYW5kKCkpXG4gIH1cbn1cblxuZnVuY3Rpb24gY2hlY2tQYXJhbWV0ZXJDb21tYW5kIChwYXJhbSwgcG9zc2liaWxpdGllcywgbWVzc2FnZSwgY29tbWFuZCkge1xuICBpZiAoIShwYXJhbSBpbiBwb3NzaWJpbGl0aWVzKSkge1xuICAgIGNvbW1hbmRSYWlzZShcbiAgICAgICd1bmtub3duIHBhcmFtZXRlciAoJyArIHBhcmFtICsgJyknICsgZW5jb2xvbihtZXNzYWdlKSArXG4gICAgICAnLiBwb3NzaWJsZSB2YWx1ZXM6ICcgKyBPYmplY3Qua2V5cyhwb3NzaWJpbGl0aWVzKS5qb2luKCksXG4gICAgICBjb21tYW5kIHx8IGd1ZXNzQ29tbWFuZCgpKVxuICB9XG59XG5cbmZ1bmN0aW9uIGNoZWNrQ29tbWFuZFR5cGUgKHZhbHVlLCB0eXBlLCBtZXNzYWdlLCBjb21tYW5kKSB7XG4gIGlmICghc3RhbmRhcmRUeXBlRWgodmFsdWUsIHR5cGUpKSB7XG4gICAgY29tbWFuZFJhaXNlKFxuICAgICAgJ2ludmFsaWQgcGFyYW1ldGVyIHR5cGUnICsgZW5jb2xvbihtZXNzYWdlKSArXG4gICAgICAnLiBleHBlY3RlZCAnICsgdHlwZSArICcsIGdvdCAnICsgKHR5cGVvZiB2YWx1ZSksXG4gICAgICBjb21tYW5kIHx8IGd1ZXNzQ29tbWFuZCgpKVxuICB9XG59XG5cbmZ1bmN0aW9uIGNoZWNrT3B0aW9uYWwgKGJsb2NrKSB7XG4gIGJsb2NrKClcbn1cblxuZnVuY3Rpb24gY2hlY2tGcmFtZWJ1ZmZlckZvcm1hdCAoYXR0YWNobWVudCwgdGV4Rm9ybWF0cywgcmJGb3JtYXRzKSB7XG4gIGlmIChhdHRhY2htZW50LnRleHR1cmUpIHtcbiAgICBjaGVja09uZU9mKFxuICAgICAgYXR0YWNobWVudC50ZXh0dXJlLl90ZXh0dXJlLmludGVybmFsZm9ybWF0LFxuICAgICAgdGV4Rm9ybWF0cyxcbiAgICAgICd1bnN1cHBvcnRlZCB0ZXh0dXJlIGZvcm1hdCBmb3IgYXR0YWNobWVudCcpXG4gIH0gZWxzZSB7XG4gICAgY2hlY2tPbmVPZihcbiAgICAgIGF0dGFjaG1lbnQucmVuZGVyYnVmZmVyLl9yZW5kZXJidWZmZXIuZm9ybWF0LFxuICAgICAgcmJGb3JtYXRzLFxuICAgICAgJ3Vuc3VwcG9ydGVkIHJlbmRlcmJ1ZmZlciBmb3JtYXQgZm9yIGF0dGFjaG1lbnQnKVxuICB9XG59XG5cbnZhciBHTF9DTEFNUF9UT19FREdFID0gMHg4MTJGXG5cbnZhciBHTF9ORUFSRVNUID0gMHgyNjAwXG52YXIgR0xfTkVBUkVTVF9NSVBNQVBfTkVBUkVTVCA9IDB4MjcwMFxudmFyIEdMX0xJTkVBUl9NSVBNQVBfTkVBUkVTVCA9IDB4MjcwMVxudmFyIEdMX05FQVJFU1RfTUlQTUFQX0xJTkVBUiA9IDB4MjcwMlxudmFyIEdMX0xJTkVBUl9NSVBNQVBfTElORUFSID0gMHgyNzAzXG5cbnZhciBHTF9CWVRFID0gNTEyMFxudmFyIEdMX1VOU0lHTkVEX0JZVEUgPSA1MTIxXG52YXIgR0xfU0hPUlQgPSA1MTIyXG52YXIgR0xfVU5TSUdORURfU0hPUlQgPSA1MTIzXG52YXIgR0xfSU5UID0gNTEyNFxudmFyIEdMX1VOU0lHTkVEX0lOVCA9IDUxMjVcbnZhciBHTF9GTE9BVCA9IDUxMjZcblxudmFyIEdMX1VOU0lHTkVEX1NIT1JUXzRfNF80XzQgPSAweDgwMzNcbnZhciBHTF9VTlNJR05FRF9TSE9SVF81XzVfNV8xID0gMHg4MDM0XG52YXIgR0xfVU5TSUdORURfU0hPUlRfNV82XzUgPSAweDgzNjNcbnZhciBHTF9VTlNJR05FRF9JTlRfMjRfOF9XRUJHTCA9IDB4ODRGQVxuXG52YXIgR0xfSEFMRl9GTE9BVF9PRVMgPSAweDhENjFcblxudmFyIFRZUEVfU0laRSA9IHt9XG5cblRZUEVfU0laRVtHTF9CWVRFXSA9XG5UWVBFX1NJWkVbR0xfVU5TSUdORURfQllURV0gPSAxXG5cblRZUEVfU0laRVtHTF9TSE9SVF0gPVxuVFlQRV9TSVpFW0dMX1VOU0lHTkVEX1NIT1JUXSA9XG5UWVBFX1NJWkVbR0xfSEFMRl9GTE9BVF9PRVNdID1cblRZUEVfU0laRVtHTF9VTlNJR05FRF9TSE9SVF81XzZfNV0gPVxuVFlQRV9TSVpFW0dMX1VOU0lHTkVEX1NIT1JUXzRfNF80XzRdID1cblRZUEVfU0laRVtHTF9VTlNJR05FRF9TSE9SVF81XzVfNV8xXSA9IDJcblxuVFlQRV9TSVpFW0dMX0lOVF0gPVxuVFlQRV9TSVpFW0dMX1VOU0lHTkVEX0lOVF0gPVxuVFlQRV9TSVpFW0dMX0ZMT0FUXSA9XG5UWVBFX1NJWkVbR0xfVU5TSUdORURfSU5UXzI0XzhfV0VCR0xdID0gNFxuXG5mdW5jdGlvbiBwaXhlbFNpemUgKHR5cGUsIGNoYW5uZWxzKSB7XG4gIGlmICh0eXBlID09PSBHTF9VTlNJR05FRF9TSE9SVF81XzVfNV8xIHx8XG4gICAgICB0eXBlID09PSBHTF9VTlNJR05FRF9TSE9SVF80XzRfNF80IHx8XG4gICAgICB0eXBlID09PSBHTF9VTlNJR05FRF9TSE9SVF81XzZfNSkge1xuICAgIHJldHVybiAyXG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gR0xfVU5TSUdORURfSU5UXzI0XzhfV0VCR0wpIHtcbiAgICByZXR1cm4gNFxuICB9IGVsc2Uge1xuICAgIHJldHVybiBUWVBFX1NJWkVbdHlwZV0gKiBjaGFubmVsc1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzUG93MiAodikge1xuICByZXR1cm4gISh2ICYgKHYgLSAxKSkgJiYgKCEhdilcbn1cblxuZnVuY3Rpb24gY2hlY2tUZXh0dXJlMkQgKGluZm8sIG1pcERhdGEsIGxpbWl0cykge1xuICB2YXIgaVxuICB2YXIgdyA9IG1pcERhdGEud2lkdGhcbiAgdmFyIGggPSBtaXBEYXRhLmhlaWdodFxuICB2YXIgYyA9IG1pcERhdGEuY2hhbm5lbHNcblxuICAvLyBDaGVjayB0ZXh0dXJlIHNoYXBlXG4gIGNoZWNrKHcgPiAwICYmIHcgPD0gbGltaXRzLm1heFRleHR1cmVTaXplICYmXG4gICAgICAgIGggPiAwICYmIGggPD0gbGltaXRzLm1heFRleHR1cmVTaXplLFxuICAnaW52YWxpZCB0ZXh0dXJlIHNoYXBlJylcblxuICAvLyBjaGVjayB3cmFwIG1vZGVcbiAgaWYgKGluZm8ud3JhcFMgIT09IEdMX0NMQU1QX1RPX0VER0UgfHwgaW5mby53cmFwVCAhPT0gR0xfQ0xBTVBfVE9fRURHRSkge1xuICAgIGNoZWNrKGlzUG93Mih3KSAmJiBpc1BvdzIoaCksXG4gICAgICAnaW5jb21wYXRpYmxlIHdyYXAgbW9kZSBmb3IgdGV4dHVyZSwgYm90aCB3aWR0aCBhbmQgaGVpZ2h0IG11c3QgYmUgcG93ZXIgb2YgMicpXG4gIH1cblxuICBpZiAobWlwRGF0YS5taXBtYXNrID09PSAxKSB7XG4gICAgaWYgKHcgIT09IDEgJiYgaCAhPT0gMSkge1xuICAgICAgY2hlY2soXG4gICAgICAgIGluZm8ubWluRmlsdGVyICE9PSBHTF9ORUFSRVNUX01JUE1BUF9ORUFSRVNUICYmXG4gICAgICAgIGluZm8ubWluRmlsdGVyICE9PSBHTF9ORUFSRVNUX01JUE1BUF9MSU5FQVIgJiZcbiAgICAgICAgaW5mby5taW5GaWx0ZXIgIT09IEdMX0xJTkVBUl9NSVBNQVBfTkVBUkVTVCAmJlxuICAgICAgICBpbmZvLm1pbkZpbHRlciAhPT0gR0xfTElORUFSX01JUE1BUF9MSU5FQVIsXG4gICAgICAgICdtaW4gZmlsdGVyIHJlcXVpcmVzIG1pcG1hcCcpXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIHRleHR1cmUgbXVzdCBiZSBwb3dlciBvZiAyXG4gICAgY2hlY2soaXNQb3cyKHcpICYmIGlzUG93MihoKSxcbiAgICAgICd0ZXh0dXJlIG11c3QgYmUgYSBzcXVhcmUgcG93ZXIgb2YgMiB0byBzdXBwb3J0IG1pcG1hcHBpbmcnKVxuICAgIGNoZWNrKG1pcERhdGEubWlwbWFzayA9PT0gKHcgPDwgMSkgLSAxLFxuICAgICAgJ21pc3Npbmcgb3IgaW5jb21wbGV0ZSBtaXBtYXAgZGF0YScpXG4gIH1cblxuICBpZiAobWlwRGF0YS50eXBlID09PSBHTF9GTE9BVCkge1xuICAgIGlmIChsaW1pdHMuZXh0ZW5zaW9ucy5pbmRleE9mKCdvZXNfdGV4dHVyZV9mbG9hdF9saW5lYXInKSA8IDApIHtcbiAgICAgIGNoZWNrKGluZm8ubWluRmlsdGVyID09PSBHTF9ORUFSRVNUICYmIGluZm8ubWFnRmlsdGVyID09PSBHTF9ORUFSRVNULFxuICAgICAgICAnZmlsdGVyIG5vdCBzdXBwb3J0ZWQsIG11c3QgZW5hYmxlIG9lc190ZXh0dXJlX2Zsb2F0X2xpbmVhcicpXG4gICAgfVxuICAgIGNoZWNrKCFpbmZvLmdlbk1pcG1hcHMsXG4gICAgICAnbWlwbWFwIGdlbmVyYXRpb24gbm90IHN1cHBvcnRlZCB3aXRoIGZsb2F0IHRleHR1cmVzJylcbiAgfVxuXG4gIC8vIGNoZWNrIGltYWdlIGNvbXBsZXRlXG4gIHZhciBtaXBpbWFnZXMgPSBtaXBEYXRhLmltYWdlc1xuICBmb3IgKGkgPSAwOyBpIDwgMTY7ICsraSkge1xuICAgIGlmIChtaXBpbWFnZXNbaV0pIHtcbiAgICAgIHZhciBtdyA9IHcgPj4gaVxuICAgICAgdmFyIG1oID0gaCA+PiBpXG4gICAgICBjaGVjayhtaXBEYXRhLm1pcG1hc2sgJiAoMSA8PCBpKSwgJ21pc3NpbmcgbWlwbWFwIGRhdGEnKVxuXG4gICAgICB2YXIgaW1nID0gbWlwaW1hZ2VzW2ldXG5cbiAgICAgIGNoZWNrKFxuICAgICAgICBpbWcud2lkdGggPT09IG13ICYmXG4gICAgICAgIGltZy5oZWlnaHQgPT09IG1oLFxuICAgICAgICAnaW52YWxpZCBzaGFwZSBmb3IgbWlwIGltYWdlcycpXG5cbiAgICAgIGNoZWNrKFxuICAgICAgICBpbWcuZm9ybWF0ID09PSBtaXBEYXRhLmZvcm1hdCAmJlxuICAgICAgICBpbWcuaW50ZXJuYWxmb3JtYXQgPT09IG1pcERhdGEuaW50ZXJuYWxmb3JtYXQgJiZcbiAgICAgICAgaW1nLnR5cGUgPT09IG1pcERhdGEudHlwZSxcbiAgICAgICAgJ2luY29tcGF0aWJsZSB0eXBlIGZvciBtaXAgaW1hZ2UnKVxuXG4gICAgICBpZiAoaW1nLmNvbXByZXNzZWQpIHtcbiAgICAgICAgLy8gVE9ETzogY2hlY2sgc2l6ZSBmb3IgY29tcHJlc3NlZCBpbWFnZXNcbiAgICAgIH0gZWxzZSBpZiAoaW1nLmRhdGEpIHtcbiAgICAgICAgLy8gY2hlY2soaW1nLmRhdGEuYnl0ZUxlbmd0aCA9PT0gbXcgKiBtaCAqXG4gICAgICAgIC8vIE1hdGgubWF4KHBpeGVsU2l6ZShpbWcudHlwZSwgYyksIGltZy51bnBhY2tBbGlnbm1lbnQpLFxuICAgICAgICB2YXIgcm93U2l6ZSA9IE1hdGguY2VpbChwaXhlbFNpemUoaW1nLnR5cGUsIGMpICogbXcgLyBpbWcudW5wYWNrQWxpZ25tZW50KSAqIGltZy51bnBhY2tBbGlnbm1lbnRcbiAgICAgICAgY2hlY2soaW1nLmRhdGEuYnl0ZUxlbmd0aCA9PT0gcm93U2l6ZSAqIG1oLFxuICAgICAgICAgICdpbnZhbGlkIGRhdGEgZm9yIGltYWdlLCBidWZmZXIgc2l6ZSBpcyBpbmNvbnNpc3RlbnQgd2l0aCBpbWFnZSBmb3JtYXQnKVxuICAgICAgfSBlbHNlIGlmIChpbWcuZWxlbWVudCkge1xuICAgICAgICAvLyBUT0RPOiBjaGVjayBlbGVtZW50IGNhbiBiZSBsb2FkZWRcbiAgICAgIH0gZWxzZSBpZiAoaW1nLmNvcHkpIHtcbiAgICAgICAgLy8gVE9ETzogY2hlY2sgY29tcGF0aWJsZSBmb3JtYXQgYW5kIHR5cGVcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCFpbmZvLmdlbk1pcG1hcHMpIHtcbiAgICAgIGNoZWNrKChtaXBEYXRhLm1pcG1hc2sgJiAoMSA8PCBpKSkgPT09IDAsICdleHRyYSBtaXBtYXAgZGF0YScpXG4gICAgfVxuICB9XG5cbiAgaWYgKG1pcERhdGEuY29tcHJlc3NlZCkge1xuICAgIGNoZWNrKCFpbmZvLmdlbk1pcG1hcHMsXG4gICAgICAnbWlwbWFwIGdlbmVyYXRpb24gZm9yIGNvbXByZXNzZWQgaW1hZ2VzIG5vdCBzdXBwb3J0ZWQnKVxuICB9XG59XG5cbmZ1bmN0aW9uIGNoZWNrVGV4dHVyZUN1YmUgKHRleHR1cmUsIGluZm8sIGZhY2VzLCBsaW1pdHMpIHtcbiAgdmFyIHcgPSB0ZXh0dXJlLndpZHRoXG4gIHZhciBoID0gdGV4dHVyZS5oZWlnaHRcbiAgdmFyIGMgPSB0ZXh0dXJlLmNoYW5uZWxzXG5cbiAgLy8gQ2hlY2sgdGV4dHVyZSBzaGFwZVxuICBjaGVjayhcbiAgICB3ID4gMCAmJiB3IDw9IGxpbWl0cy5tYXhUZXh0dXJlU2l6ZSAmJiBoID4gMCAmJiBoIDw9IGxpbWl0cy5tYXhUZXh0dXJlU2l6ZSxcbiAgICAnaW52YWxpZCB0ZXh0dXJlIHNoYXBlJylcbiAgY2hlY2soXG4gICAgdyA9PT0gaCxcbiAgICAnY3ViZSBtYXAgbXVzdCBiZSBzcXVhcmUnKVxuICBjaGVjayhcbiAgICBpbmZvLndyYXBTID09PSBHTF9DTEFNUF9UT19FREdFICYmIGluZm8ud3JhcFQgPT09IEdMX0NMQU1QX1RPX0VER0UsXG4gICAgJ3dyYXAgbW9kZSBub3Qgc3VwcG9ydGVkIGJ5IGN1YmUgbWFwJylcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGZhY2VzLmxlbmd0aDsgKytpKSB7XG4gICAgdmFyIGZhY2UgPSBmYWNlc1tpXVxuICAgIGNoZWNrKFxuICAgICAgZmFjZS53aWR0aCA9PT0gdyAmJiBmYWNlLmhlaWdodCA9PT0gaCxcbiAgICAgICdpbmNvbnNpc3RlbnQgY3ViZSBtYXAgZmFjZSBzaGFwZScpXG5cbiAgICBpZiAoaW5mby5nZW5NaXBtYXBzKSB7XG4gICAgICBjaGVjayghZmFjZS5jb21wcmVzc2VkLFxuICAgICAgICAnY2FuIG5vdCBnZW5lcmF0ZSBtaXBtYXAgZm9yIGNvbXByZXNzZWQgdGV4dHVyZXMnKVxuICAgICAgY2hlY2soZmFjZS5taXBtYXNrID09PSAxLFxuICAgICAgICAnY2FuIG5vdCBzcGVjaWZ5IG1pcG1hcHMgYW5kIGdlbmVyYXRlIG1pcG1hcHMnKVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUT0RPOiBjaGVjayBtaXAgYW5kIGZpbHRlciBtb2RlXG4gICAgfVxuXG4gICAgdmFyIG1pcG1hcHMgPSBmYWNlLmltYWdlc1xuICAgIGZvciAodmFyIGogPSAwOyBqIDwgMTY7ICsraikge1xuICAgICAgdmFyIGltZyA9IG1pcG1hcHNbal1cbiAgICAgIGlmIChpbWcpIHtcbiAgICAgICAgdmFyIG13ID0gdyA+PiBqXG4gICAgICAgIHZhciBtaCA9IGggPj4galxuICAgICAgICBjaGVjayhmYWNlLm1pcG1hc2sgJiAoMSA8PCBqKSwgJ21pc3NpbmcgbWlwbWFwIGRhdGEnKVxuICAgICAgICBjaGVjayhcbiAgICAgICAgICBpbWcud2lkdGggPT09IG13ICYmXG4gICAgICAgICAgaW1nLmhlaWdodCA9PT0gbWgsXG4gICAgICAgICAgJ2ludmFsaWQgc2hhcGUgZm9yIG1pcCBpbWFnZXMnKVxuICAgICAgICBjaGVjayhcbiAgICAgICAgICBpbWcuZm9ybWF0ID09PSB0ZXh0dXJlLmZvcm1hdCAmJlxuICAgICAgICAgIGltZy5pbnRlcm5hbGZvcm1hdCA9PT0gdGV4dHVyZS5pbnRlcm5hbGZvcm1hdCAmJlxuICAgICAgICAgIGltZy50eXBlID09PSB0ZXh0dXJlLnR5cGUsXG4gICAgICAgICAgJ2luY29tcGF0aWJsZSB0eXBlIGZvciBtaXAgaW1hZ2UnKVxuXG4gICAgICAgIGlmIChpbWcuY29tcHJlc3NlZCkge1xuICAgICAgICAgIC8vIFRPRE86IGNoZWNrIHNpemUgZm9yIGNvbXByZXNzZWQgaW1hZ2VzXG4gICAgICAgIH0gZWxzZSBpZiAoaW1nLmRhdGEpIHtcbiAgICAgICAgICBjaGVjayhpbWcuZGF0YS5ieXRlTGVuZ3RoID09PSBtdyAqIG1oICpcbiAgICAgICAgICAgIE1hdGgubWF4KHBpeGVsU2l6ZShpbWcudHlwZSwgYyksIGltZy51bnBhY2tBbGlnbm1lbnQpLFxuICAgICAgICAgICdpbnZhbGlkIGRhdGEgZm9yIGltYWdlLCBidWZmZXIgc2l6ZSBpcyBpbmNvbnNpc3RlbnQgd2l0aCBpbWFnZSBmb3JtYXQnKVxuICAgICAgICB9IGVsc2UgaWYgKGltZy5lbGVtZW50KSB7XG4gICAgICAgICAgLy8gVE9ETzogY2hlY2sgZWxlbWVudCBjYW4gYmUgbG9hZGVkXG4gICAgICAgIH0gZWxzZSBpZiAoaW1nLmNvcHkpIHtcbiAgICAgICAgICAvLyBUT0RPOiBjaGVjayBjb21wYXRpYmxlIGZvcm1hdCBhbmQgdHlwZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbnZhciBjaGVjayQxID0gZXh0ZW5kKGNoZWNrLCB7XG4gIG9wdGlvbmFsOiBjaGVja09wdGlvbmFsLFxuICByYWlzZTogcmFpc2UsXG4gIGNvbW1hbmRSYWlzZTogY29tbWFuZFJhaXNlLFxuICBjb21tYW5kOiBjaGVja0NvbW1hbmQsXG4gIHBhcmFtZXRlcjogY2hlY2tQYXJhbWV0ZXIsXG4gIGNvbW1hbmRQYXJhbWV0ZXI6IGNoZWNrUGFyYW1ldGVyQ29tbWFuZCxcbiAgY29uc3RydWN0b3I6IGNoZWNrQ29uc3RydWN0b3IsXG4gIHR5cGU6IGNoZWNrVHlwZU9mLFxuICBjb21tYW5kVHlwZTogY2hlY2tDb21tYW5kVHlwZSxcbiAgaXNUeXBlZEFycmF5OiBjaGVja0lzVHlwZWRBcnJheSxcbiAgbm5pOiBjaGVja05vbk5lZ2F0aXZlSW50LFxuICBvbmVPZjogY2hlY2tPbmVPZixcbiAgc2hhZGVyRXJyb3I6IGNoZWNrU2hhZGVyRXJyb3IsXG4gIGxpbmtFcnJvcjogY2hlY2tMaW5rRXJyb3IsXG4gIGNhbGxTaXRlOiBndWVzc0NhbGxTaXRlLFxuICBzYXZlQ29tbWFuZFJlZjogc2F2ZUNvbW1hbmRSZWYsXG4gIHNhdmVEcmF3SW5mbzogc2F2ZURyYXdDb21tYW5kSW5mbyxcbiAgZnJhbWVidWZmZXJGb3JtYXQ6IGNoZWNrRnJhbWVidWZmZXJGb3JtYXQsXG4gIGd1ZXNzQ29tbWFuZDogZ3Vlc3NDb21tYW5kLFxuICB0ZXh0dXJlMkQ6IGNoZWNrVGV4dHVyZTJELFxuICB0ZXh0dXJlQ3ViZTogY2hlY2tUZXh0dXJlQ3ViZVxufSk7XG5cbnZhciBWQVJJQUJMRV9DT1VOVEVSID0gMFxuXG52YXIgRFlOX0ZVTkMgPSAwXG52YXIgRFlOX0NPTlNUQU5UID0gNVxudmFyIERZTl9BUlJBWSA9IDZcblxuZnVuY3Rpb24gRHluYW1pY1ZhcmlhYmxlICh0eXBlLCBkYXRhKSB7XG4gIHRoaXMuaWQgPSAoVkFSSUFCTEVfQ09VTlRFUisrKVxuICB0aGlzLnR5cGUgPSB0eXBlXG4gIHRoaXMuZGF0YSA9IGRhdGFcbn1cblxuZnVuY3Rpb24gZXNjYXBlU3RyIChzdHIpIHtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC9cXFxcL2csICdcXFxcXFxcXCcpLnJlcGxhY2UoL1wiL2csICdcXFxcXCInKVxufVxuXG5mdW5jdGlvbiBzcGxpdFBhcnRzIChzdHIpIHtcbiAgaWYgKHN0ci5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gW11cbiAgfVxuXG4gIHZhciBmaXJzdENoYXIgPSBzdHIuY2hhckF0KDApXG4gIHZhciBsYXN0Q2hhciA9IHN0ci5jaGFyQXQoc3RyLmxlbmd0aCAtIDEpXG5cbiAgaWYgKHN0ci5sZW5ndGggPiAxICYmXG4gICAgICBmaXJzdENoYXIgPT09IGxhc3RDaGFyICYmXG4gICAgICAoZmlyc3RDaGFyID09PSAnXCInIHx8IGZpcnN0Q2hhciA9PT0gXCInXCIpKSB7XG4gICAgcmV0dXJuIFsnXCInICsgZXNjYXBlU3RyKHN0ci5zdWJzdHIoMSwgc3RyLmxlbmd0aCAtIDIpKSArICdcIiddXG4gIH1cblxuICB2YXIgcGFydHMgPSAvXFxbKGZhbHNlfHRydWV8bnVsbHxcXGQrfCdbXiddKid8XCJbXlwiXSpcIilcXF0vLmV4ZWMoc3RyKVxuICBpZiAocGFydHMpIHtcbiAgICByZXR1cm4gKFxuICAgICAgc3BsaXRQYXJ0cyhzdHIuc3Vic3RyKDAsIHBhcnRzLmluZGV4KSlcbiAgICAgICAgLmNvbmNhdChzcGxpdFBhcnRzKHBhcnRzWzFdKSlcbiAgICAgICAgLmNvbmNhdChzcGxpdFBhcnRzKHN0ci5zdWJzdHIocGFydHMuaW5kZXggKyBwYXJ0c1swXS5sZW5ndGgpKSlcbiAgICApXG4gIH1cblxuICB2YXIgc3VicGFydHMgPSBzdHIuc3BsaXQoJy4nKVxuICBpZiAoc3VicGFydHMubGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIFsnXCInICsgZXNjYXBlU3RyKHN0cikgKyAnXCInXVxuICB9XG5cbiAgdmFyIHJlc3VsdCA9IFtdXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3VicGFydHMubGVuZ3RoOyArK2kpIHtcbiAgICByZXN1bHQgPSByZXN1bHQuY29uY2F0KHNwbGl0UGFydHMoc3VicGFydHNbaV0pKVxuICB9XG4gIHJldHVybiByZXN1bHRcbn1cblxuZnVuY3Rpb24gdG9BY2Nlc3NvclN0cmluZyAoc3RyKSB7XG4gIHJldHVybiAnWycgKyBzcGxpdFBhcnRzKHN0cikuam9pbignXVsnKSArICddJ1xufVxuXG5mdW5jdGlvbiBkZWZpbmVEeW5hbWljICh0eXBlLCBkYXRhKSB7XG4gIHJldHVybiBuZXcgRHluYW1pY1ZhcmlhYmxlKHR5cGUsIHRvQWNjZXNzb3JTdHJpbmcoZGF0YSArICcnKSlcbn1cblxuZnVuY3Rpb24gaXNEeW5hbWljICh4KSB7XG4gIHJldHVybiAodHlwZW9mIHggPT09ICdmdW5jdGlvbicgJiYgIXguX3JlZ2xUeXBlKSB8fCAoeCBpbnN0YW5jZW9mIER5bmFtaWNWYXJpYWJsZSlcbn1cblxuZnVuY3Rpb24gdW5ib3ggKHgsIHBhdGgpIHtcbiAgaWYgKHR5cGVvZiB4ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIG5ldyBEeW5hbWljVmFyaWFibGUoRFlOX0ZVTkMsIHgpXG4gIH0gZWxzZSBpZiAodHlwZW9mIHggPT09ICdudW1iZXInIHx8IHR5cGVvZiB4ID09PSAnYm9vbGVhbicpIHtcbiAgICByZXR1cm4gbmV3IER5bmFtaWNWYXJpYWJsZShEWU5fQ09OU1RBTlQsIHgpXG4gIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh4KSkge1xuICAgIHJldHVybiBuZXcgRHluYW1pY1ZhcmlhYmxlKERZTl9BUlJBWSwgeC5tYXAoKHksIGkpID0+IHVuYm94KHksIHBhdGggKyAnWycgKyBpICsgJ10nKSkpXG4gIH0gZWxzZSBpZiAoeCBpbnN0YW5jZW9mIER5bmFtaWNWYXJpYWJsZSkge1xuICAgIHJldHVybiB4XG4gIH1cbiAgY2hlY2skMShmYWxzZSwgJ2ludmFsaWQgb3B0aW9uIHR5cGUgaW4gdW5pZm9ybSAnICsgcGF0aClcbn1cblxudmFyIGR5bmFtaWMgPSB7XG4gIER5bmFtaWNWYXJpYWJsZTogRHluYW1pY1ZhcmlhYmxlLFxuICBkZWZpbmU6IGRlZmluZUR5bmFtaWMsXG4gIGlzRHluYW1pYzogaXNEeW5hbWljLFxuICB1bmJveDogdW5ib3gsXG4gIGFjY2Vzc29yOiB0b0FjY2Vzc29yU3RyaW5nXG59O1xuXG4vKiBnbG9iYWxzIHJlcXVlc3RBbmltYXRpb25GcmFtZSwgY2FuY2VsQW5pbWF0aW9uRnJhbWUgKi9cbnZhciByYWYgPSB7XG4gIG5leHQ6IHR5cGVvZiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPT09ICdmdW5jdGlvbidcbiAgICA/IGZ1bmN0aW9uIChjYikgeyByZXR1cm4gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGNiKSB9XG4gICAgOiBmdW5jdGlvbiAoY2IpIHsgcmV0dXJuIHNldFRpbWVvdXQoY2IsIDE2KSB9LFxuICBjYW5jZWw6IHR5cGVvZiBjYW5jZWxBbmltYXRpb25GcmFtZSA9PT0gJ2Z1bmN0aW9uJ1xuICAgID8gZnVuY3Rpb24gKHJhZikgeyByZXR1cm4gY2FuY2VsQW5pbWF0aW9uRnJhbWUocmFmKSB9XG4gICAgOiBjbGVhclRpbWVvdXRcbn07XG5cbi8qIGdsb2JhbHMgcGVyZm9ybWFuY2UgKi9cbnZhciBjbG9jayA9ICh0eXBlb2YgcGVyZm9ybWFuY2UgIT09ICd1bmRlZmluZWQnICYmIHBlcmZvcm1hbmNlLm5vdylcbiAgICA/IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHBlcmZvcm1hbmNlLm5vdygpIH1cbiAgICA6IGZ1bmN0aW9uICgpIHsgcmV0dXJuICsobmV3IERhdGUoKSkgfTtcblxuZnVuY3Rpb24gY3JlYXRlU3RyaW5nU3RvcmUgKCkge1xuICB2YXIgc3RyaW5nSWRzID0geyAnJzogMCB9XG4gIHZhciBzdHJpbmdWYWx1ZXMgPSBbJyddXG4gIHJldHVybiB7XG4gICAgaWQ6IGZ1bmN0aW9uIChzdHIpIHtcbiAgICAgIHZhciByZXN1bHQgPSBzdHJpbmdJZHNbc3RyXVxuICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgICB9XG4gICAgICByZXN1bHQgPSBzdHJpbmdJZHNbc3RyXSA9IHN0cmluZ1ZhbHVlcy5sZW5ndGhcbiAgICAgIHN0cmluZ1ZhbHVlcy5wdXNoKHN0cilcbiAgICAgIHJldHVybiByZXN1bHRcbiAgICB9LFxuXG4gICAgc3RyOiBmdW5jdGlvbiAoaWQpIHtcbiAgICAgIHJldHVybiBzdHJpbmdWYWx1ZXNbaWRdXG4gICAgfVxuICB9XG59XG5cbi8vIENvbnRleHQgYW5kIGNhbnZhcyBjcmVhdGlvbiBoZWxwZXIgZnVuY3Rpb25zXG5mdW5jdGlvbiBjcmVhdGVDYW52YXMgKGVsZW1lbnQsIG9uRG9uZSwgcGl4ZWxSYXRpbykge1xuICB2YXIgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJylcbiAgZXh0ZW5kKGNhbnZhcy5zdHlsZSwge1xuICAgIGJvcmRlcjogMCxcbiAgICBtYXJnaW46IDAsXG4gICAgcGFkZGluZzogMCxcbiAgICB0b3A6IDAsXG4gICAgbGVmdDogMFxuICB9KVxuICBlbGVtZW50LmFwcGVuZENoaWxkKGNhbnZhcylcblxuICBpZiAoZWxlbWVudCA9PT0gZG9jdW1lbnQuYm9keSkge1xuICAgIGNhbnZhcy5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSdcbiAgICBleHRlbmQoZWxlbWVudC5zdHlsZSwge1xuICAgICAgbWFyZ2luOiAwLFxuICAgICAgcGFkZGluZzogMFxuICAgIH0pXG4gIH1cblxuICBmdW5jdGlvbiByZXNpemUgKCkge1xuICAgIHZhciB3ID0gd2luZG93LmlubmVyV2lkdGhcbiAgICB2YXIgaCA9IHdpbmRvdy5pbm5lckhlaWdodFxuICAgIGlmIChlbGVtZW50ICE9PSBkb2N1bWVudC5ib2R5KSB7XG4gICAgICB2YXIgYm91bmRzID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICAgICAgdyA9IGJvdW5kcy5yaWdodCAtIGJvdW5kcy5sZWZ0XG4gICAgICBoID0gYm91bmRzLmJvdHRvbSAtIGJvdW5kcy50b3BcbiAgICB9XG4gICAgY2FudmFzLndpZHRoID0gcGl4ZWxSYXRpbyAqIHdcbiAgICBjYW52YXMuaGVpZ2h0ID0gcGl4ZWxSYXRpbyAqIGhcbiAgICBleHRlbmQoY2FudmFzLnN0eWxlLCB7XG4gICAgICB3aWR0aDogdyArICdweCcsXG4gICAgICBoZWlnaHQ6IGggKyAncHgnXG4gICAgfSlcbiAgfVxuXG4gIHZhciByZXNpemVPYnNlcnZlclxuICBpZiAoZWxlbWVudCAhPT0gZG9jdW1lbnQuYm9keSAmJiB0eXBlb2YgUmVzaXplT2JzZXJ2ZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAvLyBpZ25vcmUgJ1Jlc2l6ZU9ic2VydmVyJyBpcyBub3QgZGVmaW5lZFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgIHJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIHNldFRpbWVvdXQgdG8gYXZvaWQgZmxpY2tlclxuICAgICAgc2V0VGltZW91dChyZXNpemUpXG4gICAgfSlcbiAgICByZXNpemVPYnNlcnZlci5vYnNlcnZlKGVsZW1lbnQpXG4gIH0gZWxzZSB7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHJlc2l6ZSwgZmFsc2UpXG4gIH1cblxuICBmdW5jdGlvbiBvbkRlc3Ryb3kgKCkge1xuICAgIGlmIChyZXNpemVPYnNlcnZlcikge1xuICAgICAgcmVzaXplT2JzZXJ2ZXIuZGlzY29ubmVjdCgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCByZXNpemUpXG4gICAgfVxuICAgIGVsZW1lbnQucmVtb3ZlQ2hpbGQoY2FudmFzKVxuICB9XG5cbiAgcmVzaXplKClcblxuICByZXR1cm4ge1xuICAgIGNhbnZhczogY2FudmFzLFxuICAgIG9uRGVzdHJveTogb25EZXN0cm95XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlQ29udGV4dCAoY2FudmFzLCBjb250ZXh0QXR0cmlidXRlcykge1xuICBmdW5jdGlvbiBnZXQgKG5hbWUpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGNhbnZhcy5nZXRDb250ZXh0KG5hbWUsIGNvbnRleHRBdHRyaWJ1dGVzKVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuICB9XG4gIHJldHVybiAoXG4gICAgZ2V0KCd3ZWJnbCcpIHx8XG4gICAgZ2V0KCdleHBlcmltZW50YWwtd2ViZ2wnKSB8fFxuICAgIGdldCgnd2ViZ2wtZXhwZXJpbWVudGFsJylcbiAgKVxufVxuXG5mdW5jdGlvbiBpc0hUTUxFbGVtZW50IChvYmopIHtcbiAgcmV0dXJuIChcbiAgICB0eXBlb2Ygb2JqLm5vZGVOYW1lID09PSAnc3RyaW5nJyAmJlxuICAgIHR5cGVvZiBvYmouYXBwZW5kQ2hpbGQgPT09ICdmdW5jdGlvbicgJiZcbiAgICB0eXBlb2Ygb2JqLmdldEJvdW5kaW5nQ2xpZW50UmVjdCA9PT0gJ2Z1bmN0aW9uJ1xuICApXG59XG5cbmZ1bmN0aW9uIGlzV2ViR0xDb250ZXh0IChvYmopIHtcbiAgcmV0dXJuIChcbiAgICB0eXBlb2Ygb2JqLmRyYXdBcnJheXMgPT09ICdmdW5jdGlvbicgfHxcbiAgICB0eXBlb2Ygb2JqLmRyYXdFbGVtZW50cyA9PT0gJ2Z1bmN0aW9uJ1xuICApXG59XG5cbmZ1bmN0aW9uIHBhcnNlRXh0ZW5zaW9ucyAoaW5wdXQpIHtcbiAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gaW5wdXQuc3BsaXQoKVxuICB9XG4gIGNoZWNrJDEoQXJyYXkuaXNBcnJheShpbnB1dCksICdpbnZhbGlkIGV4dGVuc2lvbiBhcnJheScpXG4gIHJldHVybiBpbnB1dFxufVxuXG5mdW5jdGlvbiBnZXRFbGVtZW50IChkZXNjKSB7XG4gIGlmICh0eXBlb2YgZGVzYyA9PT0gJ3N0cmluZycpIHtcbiAgICBjaGVjayQxKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcsICdub3Qgc3VwcG9ydGVkIG91dHNpZGUgb2YgRE9NJylcbiAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihkZXNjKVxuICB9XG4gIHJldHVybiBkZXNjXG59XG5cbmZ1bmN0aW9uIHBhcnNlQXJncyAoYXJnc18pIHtcbiAgdmFyIGFyZ3MgPSBhcmdzXyB8fCB7fVxuICB2YXIgZWxlbWVudCwgY29udGFpbmVyLCBjYW52YXMsIGdsXG4gIHZhciBjb250ZXh0QXR0cmlidXRlcyA9IHt9XG4gIHZhciBleHRlbnNpb25zID0gW11cbiAgdmFyIG9wdGlvbmFsRXh0ZW5zaW9ucyA9IFtdXG4gIHZhciBwaXhlbFJhdGlvID0gKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnID8gMSA6IHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvKVxuICB2YXIgcHJvZmlsZSA9IGZhbHNlXG4gIHZhciBvbkRvbmUgPSBmdW5jdGlvbiAoZXJyKSB7XG4gICAgaWYgKGVycikge1xuICAgICAgY2hlY2skMS5yYWlzZShlcnIpXG4gICAgfVxuICB9XG4gIHZhciBvbkRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7fVxuICBpZiAodHlwZW9mIGFyZ3MgPT09ICdzdHJpbmcnKSB7XG4gICAgY2hlY2skMShcbiAgICAgIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcsXG4gICAgICAnc2VsZWN0b3IgcXVlcmllcyBvbmx5IHN1cHBvcnRlZCBpbiBET00gZW52aXJvbWVudHMnKVxuICAgIGVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGFyZ3MpXG4gICAgY2hlY2skMShlbGVtZW50LCAnaW52YWxpZCBxdWVyeSBzdHJpbmcgZm9yIGVsZW1lbnQnKVxuICB9IGVsc2UgaWYgKHR5cGVvZiBhcmdzID09PSAnb2JqZWN0Jykge1xuICAgIGlmIChpc0hUTUxFbGVtZW50KGFyZ3MpKSB7XG4gICAgICBlbGVtZW50ID0gYXJnc1xuICAgIH0gZWxzZSBpZiAoaXNXZWJHTENvbnRleHQoYXJncykpIHtcbiAgICAgIGdsID0gYXJnc1xuICAgICAgY2FudmFzID0gZ2wuY2FudmFzXG4gICAgfSBlbHNlIHtcbiAgICAgIGNoZWNrJDEuY29uc3RydWN0b3IoYXJncylcbiAgICAgIGlmICgnZ2wnIGluIGFyZ3MpIHtcbiAgICAgICAgZ2wgPSBhcmdzLmdsXG4gICAgICB9IGVsc2UgaWYgKCdjYW52YXMnIGluIGFyZ3MpIHtcbiAgICAgICAgY2FudmFzID0gZ2V0RWxlbWVudChhcmdzLmNhbnZhcylcbiAgICAgIH0gZWxzZSBpZiAoJ2NvbnRhaW5lcicgaW4gYXJncykge1xuICAgICAgICBjb250YWluZXIgPSBnZXRFbGVtZW50KGFyZ3MuY29udGFpbmVyKVxuICAgICAgfVxuICAgICAgaWYgKCdhdHRyaWJ1dGVzJyBpbiBhcmdzKSB7XG4gICAgICAgIGNvbnRleHRBdHRyaWJ1dGVzID0gYXJncy5hdHRyaWJ1dGVzXG4gICAgICAgIGNoZWNrJDEudHlwZShjb250ZXh0QXR0cmlidXRlcywgJ29iamVjdCcsICdpbnZhbGlkIGNvbnRleHQgYXR0cmlidXRlcycpXG4gICAgICB9XG4gICAgICBpZiAoJ2V4dGVuc2lvbnMnIGluIGFyZ3MpIHtcbiAgICAgICAgZXh0ZW5zaW9ucyA9IHBhcnNlRXh0ZW5zaW9ucyhhcmdzLmV4dGVuc2lvbnMpXG4gICAgICB9XG4gICAgICBpZiAoJ29wdGlvbmFsRXh0ZW5zaW9ucycgaW4gYXJncykge1xuICAgICAgICBvcHRpb25hbEV4dGVuc2lvbnMgPSBwYXJzZUV4dGVuc2lvbnMoYXJncy5vcHRpb25hbEV4dGVuc2lvbnMpXG4gICAgICB9XG4gICAgICBpZiAoJ29uRG9uZScgaW4gYXJncykge1xuICAgICAgICBjaGVjayQxLnR5cGUoXG4gICAgICAgICAgYXJncy5vbkRvbmUsICdmdW5jdGlvbicsXG4gICAgICAgICAgJ2ludmFsaWQgb3IgbWlzc2luZyBvbkRvbmUgY2FsbGJhY2snKVxuICAgICAgICBvbkRvbmUgPSBhcmdzLm9uRG9uZVxuICAgICAgfVxuICAgICAgaWYgKCdwcm9maWxlJyBpbiBhcmdzKSB7XG4gICAgICAgIHByb2ZpbGUgPSAhIWFyZ3MucHJvZmlsZVxuICAgICAgfVxuICAgICAgaWYgKCdwaXhlbFJhdGlvJyBpbiBhcmdzKSB7XG4gICAgICAgIHBpeGVsUmF0aW8gPSArYXJncy5waXhlbFJhdGlvXG4gICAgICAgIGNoZWNrJDEocGl4ZWxSYXRpbyA+IDAsICdpbnZhbGlkIHBpeGVsIHJhdGlvJylcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgY2hlY2skMS5yYWlzZSgnaW52YWxpZCBhcmd1bWVudHMgdG8gcmVnbCcpXG4gIH1cblxuICBpZiAoZWxlbWVudCkge1xuICAgIGlmIChlbGVtZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdjYW52YXMnKSB7XG4gICAgICBjYW52YXMgPSBlbGVtZW50XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRhaW5lciA9IGVsZW1lbnRcbiAgICB9XG4gIH1cblxuICBpZiAoIWdsKSB7XG4gICAgaWYgKCFjYW52YXMpIHtcbiAgICAgIGNoZWNrJDEoXG4gICAgICAgIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcsXG4gICAgICAgICdtdXN0IG1hbnVhbGx5IHNwZWNpZnkgd2ViZ2wgY29udGV4dCBvdXRzaWRlIG9mIERPTSBlbnZpcm9ubWVudHMnKVxuICAgICAgdmFyIHJlc3VsdCA9IGNyZWF0ZUNhbnZhcyhjb250YWluZXIgfHwgZG9jdW1lbnQuYm9keSwgb25Eb25lLCBwaXhlbFJhdGlvKVxuICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgIH1cbiAgICAgIGNhbnZhcyA9IHJlc3VsdC5jYW52YXNcbiAgICAgIG9uRGVzdHJveSA9IHJlc3VsdC5vbkRlc3Ryb3lcbiAgICB9XG4gICAgLy8gd29ya2Fyb3VuZCBmb3IgY2hyb21pdW0gYnVnLCBwcmVtdWx0aXBsaWVkIGFscGhhIHZhbHVlIGlzIHBsYXRmb3JtIGRlcGVuZGVudFxuICAgIGlmIChjb250ZXh0QXR0cmlidXRlcy5wcmVtdWx0aXBsaWVkQWxwaGEgPT09IHVuZGVmaW5lZCkgY29udGV4dEF0dHJpYnV0ZXMucHJlbXVsdGlwbGllZEFscGhhID0gdHJ1ZVxuICAgIGdsID0gY3JlYXRlQ29udGV4dChjYW52YXMsIGNvbnRleHRBdHRyaWJ1dGVzKVxuICB9XG5cbiAgaWYgKCFnbCkge1xuICAgIG9uRGVzdHJveSgpXG4gICAgb25Eb25lKCd3ZWJnbCBub3Qgc3VwcG9ydGVkLCB0cnkgdXBncmFkaW5nIHlvdXIgYnJvd3NlciBvciBncmFwaGljcyBkcml2ZXJzIGh0dHA6Ly9nZXQud2ViZ2wub3JnJylcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBnbDogZ2wsXG4gICAgY2FudmFzOiBjYW52YXMsXG4gICAgY29udGFpbmVyOiBjb250YWluZXIsXG4gICAgZXh0ZW5zaW9uczogZXh0ZW5zaW9ucyxcbiAgICBvcHRpb25hbEV4dGVuc2lvbnM6IG9wdGlvbmFsRXh0ZW5zaW9ucyxcbiAgICBwaXhlbFJhdGlvOiBwaXhlbFJhdGlvLFxuICAgIHByb2ZpbGU6IHByb2ZpbGUsXG4gICAgb25Eb25lOiBvbkRvbmUsXG4gICAgb25EZXN0cm95OiBvbkRlc3Ryb3lcbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVFeHRlbnNpb25DYWNoZSAoZ2wsIGNvbmZpZykge1xuICB2YXIgZXh0ZW5zaW9ucyA9IHt9XG5cbiAgZnVuY3Rpb24gdHJ5TG9hZEV4dGVuc2lvbiAobmFtZV8pIHtcbiAgICBjaGVjayQxLnR5cGUobmFtZV8sICdzdHJpbmcnLCAnZXh0ZW5zaW9uIG5hbWUgbXVzdCBiZSBzdHJpbmcnKVxuICAgIHZhciBuYW1lID0gbmFtZV8udG9Mb3dlckNhc2UoKVxuICAgIHZhciBleHRcbiAgICB0cnkge1xuICAgICAgZXh0ID0gZXh0ZW5zaW9uc1tuYW1lXSA9IGdsLmdldEV4dGVuc2lvbihuYW1lKVxuICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgcmV0dXJuICEhZXh0XG4gIH1cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbmZpZy5leHRlbnNpb25zLmxlbmd0aDsgKytpKSB7XG4gICAgdmFyIG5hbWUgPSBjb25maWcuZXh0ZW5zaW9uc1tpXVxuICAgIGlmICghdHJ5TG9hZEV4dGVuc2lvbihuYW1lKSkge1xuICAgICAgY29uZmlnLm9uRGVzdHJveSgpXG4gICAgICBjb25maWcub25Eb25lKCdcIicgKyBuYW1lICsgJ1wiIGV4dGVuc2lvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBjdXJyZW50IFdlYkdMIGNvbnRleHQsIHRyeSB1cGdyYWRpbmcgeW91ciBzeXN0ZW0gb3IgYSBkaWZmZXJlbnQgYnJvd3NlcicpXG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxuXG4gIGNvbmZpZy5vcHRpb25hbEV4dGVuc2lvbnMuZm9yRWFjaCh0cnlMb2FkRXh0ZW5zaW9uKVxuXG4gIHJldHVybiB7XG4gICAgZXh0ZW5zaW9uczogZXh0ZW5zaW9ucyxcbiAgICByZXN0b3JlOiBmdW5jdGlvbiAoKSB7XG4gICAgICBPYmplY3Qua2V5cyhleHRlbnNpb25zKS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIGlmIChleHRlbnNpb25zW25hbWVdICYmICF0cnlMb2FkRXh0ZW5zaW9uKG5hbWUpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCcocmVnbCk6IGVycm9yIHJlc3RvcmluZyBleHRlbnNpb24gJyArIG5hbWUpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGxvb3AgKG4sIGYpIHtcbiAgdmFyIHJlc3VsdCA9IEFycmF5KG4pXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgcmVzdWx0W2ldID0gZihpKVxuICB9XG4gIHJldHVybiByZXN1bHRcbn1cblxudmFyIEdMX0JZVEUkMSA9IDUxMjBcbnZhciBHTF9VTlNJR05FRF9CWVRFJDIgPSA1MTIxXG52YXIgR0xfU0hPUlQkMSA9IDUxMjJcbnZhciBHTF9VTlNJR05FRF9TSE9SVCQxID0gNTEyM1xudmFyIEdMX0lOVCQxID0gNTEyNFxudmFyIEdMX1VOU0lHTkVEX0lOVCQxID0gNTEyNVxudmFyIEdMX0ZMT0FUJDIgPSA1MTI2XG5cbmZ1bmN0aW9uIG5leHRQb3cxNiAodikge1xuICBmb3IgKHZhciBpID0gMTY7IGkgPD0gKDEgPDwgMjgpOyBpICo9IDE2KSB7XG4gICAgaWYgKHYgPD0gaSkge1xuICAgICAgcmV0dXJuIGlcbiAgICB9XG4gIH1cbiAgcmV0dXJuIDBcbn1cblxuZnVuY3Rpb24gbG9nMiAodikge1xuICB2YXIgciwgc2hpZnRcbiAgciA9ICh2ID4gMHhGRkZGKSA8PCA0XG4gIHYgPj4+PSByXG4gIHNoaWZ0ID0gKHYgPiAweEZGKSA8PCAzXG4gIHYgPj4+PSBzaGlmdDsgciB8PSBzaGlmdFxuICBzaGlmdCA9ICh2ID4gMHhGKSA8PCAyXG4gIHYgPj4+PSBzaGlmdDsgciB8PSBzaGlmdFxuICBzaGlmdCA9ICh2ID4gMHgzKSA8PCAxXG4gIHYgPj4+PSBzaGlmdDsgciB8PSBzaGlmdFxuICByZXR1cm4gciB8ICh2ID4+IDEpXG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVBvb2wgKCkge1xuICB2YXIgYnVmZmVyUG9vbCA9IGxvb3AoOCwgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBbXVxuICB9KVxuXG4gIGZ1bmN0aW9uIGFsbG9jIChuKSB7XG4gICAgdmFyIHN6ID0gbmV4dFBvdzE2KG4pXG4gICAgdmFyIGJpbiA9IGJ1ZmZlclBvb2xbbG9nMihzeikgPj4gMl1cbiAgICBpZiAoYmluLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBiaW4ucG9wKClcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBBcnJheUJ1ZmZlcihzeilcbiAgfVxuXG4gIGZ1bmN0aW9uIGZyZWUgKGJ1Zikge1xuICAgIGJ1ZmZlclBvb2xbbG9nMihidWYuYnl0ZUxlbmd0aCkgPj4gMl0ucHVzaChidWYpXG4gIH1cblxuICBmdW5jdGlvbiBhbGxvY1R5cGUgKHR5cGUsIG4pIHtcbiAgICB2YXIgcmVzdWx0ID0gbnVsbFxuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBHTF9CWVRFJDE6XG4gICAgICAgIHJlc3VsdCA9IG5ldyBJbnQ4QXJyYXkoYWxsb2MobiksIDAsIG4pXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIEdMX1VOU0lHTkVEX0JZVEUkMjpcbiAgICAgICAgcmVzdWx0ID0gbmV3IFVpbnQ4QXJyYXkoYWxsb2MobiksIDAsIG4pXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIEdMX1NIT1JUJDE6XG4gICAgICAgIHJlc3VsdCA9IG5ldyBJbnQxNkFycmF5KGFsbG9jKDIgKiBuKSwgMCwgbilcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgR0xfVU5TSUdORURfU0hPUlQkMTpcbiAgICAgICAgcmVzdWx0ID0gbmV3IFVpbnQxNkFycmF5KGFsbG9jKDIgKiBuKSwgMCwgbilcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgR0xfSU5UJDE6XG4gICAgICAgIHJlc3VsdCA9IG5ldyBJbnQzMkFycmF5KGFsbG9jKDQgKiBuKSwgMCwgbilcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgR0xfVU5TSUdORURfSU5UJDE6XG4gICAgICAgIHJlc3VsdCA9IG5ldyBVaW50MzJBcnJheShhbGxvYyg0ICogbiksIDAsIG4pXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIEdMX0ZMT0FUJDI6XG4gICAgICAgIHJlc3VsdCA9IG5ldyBGbG9hdDMyQXJyYXkoYWxsb2MoNCAqIG4pLCAwLCBuKVxuICAgICAgICBicmVha1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gICAgaWYgKHJlc3VsdC5sZW5ndGggIT09IG4pIHtcbiAgICAgIHJldHVybiByZXN1bHQuc3ViYXJyYXkoMCwgbilcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgZnVuY3Rpb24gZnJlZVR5cGUgKGFycmF5KSB7XG4gICAgZnJlZShhcnJheS5idWZmZXIpXG4gIH1cblxuICByZXR1cm4ge1xuICAgIGFsbG9jOiBhbGxvYyxcbiAgICBmcmVlOiBmcmVlLFxuICAgIGFsbG9jVHlwZTogYWxsb2NUeXBlLFxuICAgIGZyZWVUeXBlOiBmcmVlVHlwZVxuICB9XG59XG5cbnZhciBwb29sID0gY3JlYXRlUG9vbCgpXG5cbi8vIHplcm8gcG9vbCBmb3IgaW5pdGlhbCB6ZXJvIGRhdGFcbnBvb2wuemVybyA9IGNyZWF0ZVBvb2woKVxuXG52YXIgR0xfU1VCUElYRUxfQklUUyA9IDB4MEQ1MFxudmFyIEdMX1JFRF9CSVRTID0gMHgwRDUyXG52YXIgR0xfR1JFRU5fQklUUyA9IDB4MEQ1M1xudmFyIEdMX0JMVUVfQklUUyA9IDB4MEQ1NFxudmFyIEdMX0FMUEhBX0JJVFMgPSAweDBENTVcbnZhciBHTF9ERVBUSF9CSVRTID0gMHgwRDU2XG52YXIgR0xfU1RFTkNJTF9CSVRTID0gMHgwRDU3XG5cbnZhciBHTF9BTElBU0VEX1BPSU5UX1NJWkVfUkFOR0UgPSAweDg0NkRcbnZhciBHTF9BTElBU0VEX0xJTkVfV0lEVEhfUkFOR0UgPSAweDg0NkVcblxudmFyIEdMX01BWF9URVhUVVJFX1NJWkUgPSAweDBEMzNcbnZhciBHTF9NQVhfVklFV1BPUlRfRElNUyA9IDB4MEQzQVxudmFyIEdMX01BWF9WRVJURVhfQVRUUklCUyA9IDB4ODg2OVxudmFyIEdMX01BWF9WRVJURVhfVU5JRk9STV9WRUNUT1JTID0gMHg4REZCXG52YXIgR0xfTUFYX1ZBUllJTkdfVkVDVE9SUyA9IDB4OERGQ1xudmFyIEdMX01BWF9DT01CSU5FRF9URVhUVVJFX0lNQUdFX1VOSVRTID0gMHg4QjREXG52YXIgR0xfTUFYX1ZFUlRFWF9URVhUVVJFX0lNQUdFX1VOSVRTID0gMHg4QjRDXG52YXIgR0xfTUFYX1RFWFRVUkVfSU1BR0VfVU5JVFMgPSAweDg4NzJcbnZhciBHTF9NQVhfRlJBR01FTlRfVU5JRk9STV9WRUNUT1JTID0gMHg4REZEXG52YXIgR0xfTUFYX0NVQkVfTUFQX1RFWFRVUkVfU0laRSA9IDB4ODUxQ1xudmFyIEdMX01BWF9SRU5ERVJCVUZGRVJfU0laRSA9IDB4ODRFOFxuXG52YXIgR0xfVkVORE9SID0gMHgxRjAwXG52YXIgR0xfUkVOREVSRVIgPSAweDFGMDFcbnZhciBHTF9WRVJTSU9OID0gMHgxRjAyXG52YXIgR0xfU0hBRElOR19MQU5HVUFHRV9WRVJTSU9OID0gMHg4QjhDXG5cbnZhciBHTF9NQVhfVEVYVFVSRV9NQVhfQU5JU09UUk9QWV9FWFQgPSAweDg0RkZcblxudmFyIEdMX01BWF9DT0xPUl9BVFRBQ0hNRU5UU19XRUJHTCA9IDB4OENERlxudmFyIEdMX01BWF9EUkFXX0JVRkZFUlNfV0VCR0wgPSAweDg4MjRcblxudmFyIEdMX1RFWFRVUkVfMkQgPSAweDBERTFcbnZhciBHTF9URVhUVVJFX0NVQkVfTUFQID0gMHg4NTEzXG52YXIgR0xfVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YID0gMHg4NTE1XG52YXIgR0xfVEVYVFVSRTAgPSAweDg0QzBcbnZhciBHTF9SR0JBID0gMHgxOTA4XG52YXIgR0xfRkxPQVQkMSA9IDB4MTQwNlxudmFyIEdMX1VOU0lHTkVEX0JZVEUkMSA9IDB4MTQwMVxudmFyIEdMX0ZSQU1FQlVGRkVSID0gMHg4RDQwXG52YXIgR0xfRlJBTUVCVUZGRVJfQ09NUExFVEUgPSAweDhDRDVcbnZhciBHTF9DT0xPUl9BVFRBQ0hNRU5UMCA9IDB4OENFMFxudmFyIEdMX0NPTE9SX0JVRkZFUl9CSVQkMSA9IDB4NDAwMFxuXG52YXIgd3JhcExpbWl0cyA9IGZ1bmN0aW9uIChnbCwgZXh0ZW5zaW9ucykge1xuICB2YXIgbWF4QW5pc290cm9waWMgPSAxXG4gIGlmIChleHRlbnNpb25zLmV4dF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYykge1xuICAgIG1heEFuaXNvdHJvcGljID0gZ2wuZ2V0UGFyYW1ldGVyKEdMX01BWF9URVhUVVJFX01BWF9BTklTT1RST1BZX0VYVClcbiAgfVxuXG4gIHZhciBtYXhEcmF3YnVmZmVycyA9IDFcbiAgdmFyIG1heENvbG9yQXR0YWNobWVudHMgPSAxXG4gIGlmIChleHRlbnNpb25zLndlYmdsX2RyYXdfYnVmZmVycykge1xuICAgIG1heERyYXdidWZmZXJzID0gZ2wuZ2V0UGFyYW1ldGVyKEdMX01BWF9EUkFXX0JVRkZFUlNfV0VCR0wpXG4gICAgbWF4Q29sb3JBdHRhY2htZW50cyA9IGdsLmdldFBhcmFtZXRlcihHTF9NQVhfQ09MT1JfQVRUQUNITUVOVFNfV0VCR0wpXG4gIH1cblxuICAvLyBkZXRlY3QgaWYgcmVhZGluZyBmbG9hdCB0ZXh0dXJlcyBpcyBhdmFpbGFibGUgKFNhZmFyaSBkb2Vzbid0IHN1cHBvcnQpXG4gIHZhciByZWFkRmxvYXQgPSAhIWV4dGVuc2lvbnMub2VzX3RleHR1cmVfZmxvYXRcbiAgaWYgKHJlYWRGbG9hdCkge1xuICAgIHZhciByZWFkRmxvYXRUZXh0dXJlID0gZ2wuY3JlYXRlVGV4dHVyZSgpXG4gICAgZ2wuYmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgcmVhZEZsb2F0VGV4dHVyZSlcbiAgICBnbC50ZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX1JHQkEsIDEsIDEsIDAsIEdMX1JHQkEsIEdMX0ZMT0FUJDEsIG51bGwpXG5cbiAgICB2YXIgZmJvID0gZ2wuY3JlYXRlRnJhbWVidWZmZXIoKVxuICAgIGdsLmJpbmRGcmFtZWJ1ZmZlcihHTF9GUkFNRUJVRkZFUiwgZmJvKVxuICAgIGdsLmZyYW1lYnVmZmVyVGV4dHVyZTJEKEdMX0ZSQU1FQlVGRkVSLCBHTF9DT0xPUl9BVFRBQ0hNRU5UMCwgR0xfVEVYVFVSRV8yRCwgcmVhZEZsb2F0VGV4dHVyZSwgMClcbiAgICBnbC5iaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCBudWxsKVxuXG4gICAgaWYgKGdsLmNoZWNrRnJhbWVidWZmZXJTdGF0dXMoR0xfRlJBTUVCVUZGRVIpICE9PSBHTF9GUkFNRUJVRkZFUl9DT01QTEVURSkgcmVhZEZsb2F0ID0gZmFsc2VcblxuICAgIGVsc2Uge1xuICAgICAgZ2wudmlld3BvcnQoMCwgMCwgMSwgMSlcbiAgICAgIGdsLmNsZWFyQ29sb3IoMS4wLCAwLjAsIDAuMCwgMS4wKVxuICAgICAgZ2wuY2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCQxKVxuICAgICAgdmFyIHBpeGVscyA9IHBvb2wuYWxsb2NUeXBlKEdMX0ZMT0FUJDEsIDQpXG4gICAgICBnbC5yZWFkUGl4ZWxzKDAsIDAsIDEsIDEsIEdMX1JHQkEsIEdMX0ZMT0FUJDEsIHBpeGVscylcblxuICAgICAgaWYgKGdsLmdldEVycm9yKCkpIHJlYWRGbG9hdCA9IGZhbHNlXG4gICAgICBlbHNlIHtcbiAgICAgICAgZ2wuZGVsZXRlRnJhbWVidWZmZXIoZmJvKVxuICAgICAgICBnbC5kZWxldGVUZXh0dXJlKHJlYWRGbG9hdFRleHR1cmUpXG5cbiAgICAgICAgcmVhZEZsb2F0ID0gcGl4ZWxzWzBdID09PSAxLjBcbiAgICAgIH1cblxuICAgICAgcG9vbC5mcmVlVHlwZShwaXhlbHMpXG4gICAgfVxuICB9XG5cbiAgLy8gZGV0ZWN0IG5vbiBwb3dlciBvZiB0d28gY3ViZSB0ZXh0dXJlcyBzdXBwb3J0IChJRSBkb2Vzbid0IHN1cHBvcnQpXG4gIHZhciBpc0lFID0gdHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgKC9NU0lFLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpIHx8IC9UcmlkZW50XFwvLy50ZXN0KG5hdmlnYXRvci5hcHBWZXJzaW9uKSB8fCAvRWRnZS8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSlcblxuICB2YXIgbnBvdFRleHR1cmVDdWJlID0gdHJ1ZVxuXG4gIGlmICghaXNJRSkge1xuICAgIHZhciBjdWJlVGV4dHVyZSA9IGdsLmNyZWF0ZVRleHR1cmUoKVxuICAgIHZhciBkYXRhID0gcG9vbC5hbGxvY1R5cGUoR0xfVU5TSUdORURfQllURSQxLCAzNilcbiAgICBnbC5hY3RpdmVUZXh0dXJlKEdMX1RFWFRVUkUwKVxuICAgIGdsLmJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfQ1VCRV9NQVAsIGN1YmVUZXh0dXJlKVxuICAgIGdsLnRleEltYWdlMkQoR0xfVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YLCAwLCBHTF9SR0JBLCAzLCAzLCAwLCBHTF9SR0JBLCBHTF9VTlNJR05FRF9CWVRFJDEsIGRhdGEpXG4gICAgcG9vbC5mcmVlVHlwZShkYXRhKVxuICAgIGdsLmJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfQ1VCRV9NQVAsIG51bGwpXG4gICAgZ2wuZGVsZXRlVGV4dHVyZShjdWJlVGV4dHVyZSlcbiAgICBucG90VGV4dHVyZUN1YmUgPSAhZ2wuZ2V0RXJyb3IoKVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAvLyBkcmF3aW5nIGJ1ZmZlciBiaXQgZGVwdGhcbiAgICBjb2xvckJpdHM6IFtcbiAgICAgIGdsLmdldFBhcmFtZXRlcihHTF9SRURfQklUUyksXG4gICAgICBnbC5nZXRQYXJhbWV0ZXIoR0xfR1JFRU5fQklUUyksXG4gICAgICBnbC5nZXRQYXJhbWV0ZXIoR0xfQkxVRV9CSVRTKSxcbiAgICAgIGdsLmdldFBhcmFtZXRlcihHTF9BTFBIQV9CSVRTKVxuICAgIF0sXG4gICAgZGVwdGhCaXRzOiBnbC5nZXRQYXJhbWV0ZXIoR0xfREVQVEhfQklUUyksXG4gICAgc3RlbmNpbEJpdHM6IGdsLmdldFBhcmFtZXRlcihHTF9TVEVOQ0lMX0JJVFMpLFxuICAgIHN1YnBpeGVsQml0czogZ2wuZ2V0UGFyYW1ldGVyKEdMX1NVQlBJWEVMX0JJVFMpLFxuXG4gICAgLy8gc3VwcG9ydGVkIGV4dGVuc2lvbnNcbiAgICBleHRlbnNpb25zOiBPYmplY3Qua2V5cyhleHRlbnNpb25zKS5maWx0ZXIoZnVuY3Rpb24gKGV4dCkge1xuICAgICAgcmV0dXJuICEhZXh0ZW5zaW9uc1tleHRdXG4gICAgfSksXG5cbiAgICAvLyBtYXggYW5pc28gc2FtcGxlc1xuICAgIG1heEFuaXNvdHJvcGljOiBtYXhBbmlzb3Ryb3BpYyxcblxuICAgIC8vIG1heCBkcmF3IGJ1ZmZlcnNcbiAgICBtYXhEcmF3YnVmZmVyczogbWF4RHJhd2J1ZmZlcnMsXG4gICAgbWF4Q29sb3JBdHRhY2htZW50czogbWF4Q29sb3JBdHRhY2htZW50cyxcblxuICAgIC8vIHBvaW50IGFuZCBsaW5lIHNpemUgcmFuZ2VzXG4gICAgcG9pbnRTaXplRGltczogZ2wuZ2V0UGFyYW1ldGVyKEdMX0FMSUFTRURfUE9JTlRfU0laRV9SQU5HRSksXG4gICAgbGluZVdpZHRoRGltczogZ2wuZ2V0UGFyYW1ldGVyKEdMX0FMSUFTRURfTElORV9XSURUSF9SQU5HRSksXG4gICAgbWF4Vmlld3BvcnREaW1zOiBnbC5nZXRQYXJhbWV0ZXIoR0xfTUFYX1ZJRVdQT1JUX0RJTVMpLFxuICAgIG1heENvbWJpbmVkVGV4dHVyZVVuaXRzOiBnbC5nZXRQYXJhbWV0ZXIoR0xfTUFYX0NPTUJJTkVEX1RFWFRVUkVfSU1BR0VfVU5JVFMpLFxuICAgIG1heEN1YmVNYXBTaXplOiBnbC5nZXRQYXJhbWV0ZXIoR0xfTUFYX0NVQkVfTUFQX1RFWFRVUkVfU0laRSksXG4gICAgbWF4UmVuZGVyYnVmZmVyU2l6ZTogZ2wuZ2V0UGFyYW1ldGVyKEdMX01BWF9SRU5ERVJCVUZGRVJfU0laRSksXG4gICAgbWF4VGV4dHVyZVVuaXRzOiBnbC5nZXRQYXJhbWV0ZXIoR0xfTUFYX1RFWFRVUkVfSU1BR0VfVU5JVFMpLFxuICAgIG1heFRleHR1cmVTaXplOiBnbC5nZXRQYXJhbWV0ZXIoR0xfTUFYX1RFWFRVUkVfU0laRSksXG4gICAgbWF4QXR0cmlidXRlczogZ2wuZ2V0UGFyYW1ldGVyKEdMX01BWF9WRVJURVhfQVRUUklCUyksXG4gICAgbWF4VmVydGV4VW5pZm9ybXM6IGdsLmdldFBhcmFtZXRlcihHTF9NQVhfVkVSVEVYX1VOSUZPUk1fVkVDVE9SUyksXG4gICAgbWF4VmVydGV4VGV4dHVyZVVuaXRzOiBnbC5nZXRQYXJhbWV0ZXIoR0xfTUFYX1ZFUlRFWF9URVhUVVJFX0lNQUdFX1VOSVRTKSxcbiAgICBtYXhWYXJ5aW5nVmVjdG9yczogZ2wuZ2V0UGFyYW1ldGVyKEdMX01BWF9WQVJZSU5HX1ZFQ1RPUlMpLFxuICAgIG1heEZyYWdtZW50VW5pZm9ybXM6IGdsLmdldFBhcmFtZXRlcihHTF9NQVhfRlJBR01FTlRfVU5JRk9STV9WRUNUT1JTKSxcblxuICAgIC8vIHZlbmRvciBpbmZvXG4gICAgZ2xzbDogZ2wuZ2V0UGFyYW1ldGVyKEdMX1NIQURJTkdfTEFOR1VBR0VfVkVSU0lPTiksXG4gICAgcmVuZGVyZXI6IGdsLmdldFBhcmFtZXRlcihHTF9SRU5ERVJFUiksXG4gICAgdmVuZG9yOiBnbC5nZXRQYXJhbWV0ZXIoR0xfVkVORE9SKSxcbiAgICB2ZXJzaW9uOiBnbC5nZXRQYXJhbWV0ZXIoR0xfVkVSU0lPTiksXG5cbiAgICAvLyBxdWlya3NcbiAgICByZWFkRmxvYXQ6IHJlYWRGbG9hdCxcbiAgICBucG90VGV4dHVyZUN1YmU6IG5wb3RUZXh0dXJlQ3ViZVxuICB9XG59XG5cbmZ1bmN0aW9uIGlzTkRBcnJheUxpa2UgKG9iaikge1xuICByZXR1cm4gKFxuICAgICEhb2JqICYmXG4gICAgdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiZcbiAgICBBcnJheS5pc0FycmF5KG9iai5zaGFwZSkgJiZcbiAgICBBcnJheS5pc0FycmF5KG9iai5zdHJpZGUpICYmXG4gICAgdHlwZW9mIG9iai5vZmZzZXQgPT09ICdudW1iZXInICYmXG4gICAgb2JqLnNoYXBlLmxlbmd0aCA9PT0gb2JqLnN0cmlkZS5sZW5ndGggJiZcbiAgICAoQXJyYXkuaXNBcnJheShvYmouZGF0YSkgfHxcbiAgICAgIGlzVHlwZWRBcnJheShvYmouZGF0YSkpKVxufVxuXG52YXIgdmFsdWVzID0gZnVuY3Rpb24gKG9iaikge1xuICByZXR1cm4gT2JqZWN0LmtleXMob2JqKS5tYXAoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4gb2JqW2tleV0gfSlcbn1cblxudmFyIGZsYXR0ZW5VdGlscyA9IHtcbiAgc2hhcGU6IGFycmF5U2hhcGUkMSxcbiAgZmxhdHRlbjogZmxhdHRlbkFycmF5XG59O1xuXG5mdW5jdGlvbiBmbGF0dGVuMUQgKGFycmF5LCBueCwgb3V0KSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbng7ICsraSkge1xuICAgIG91dFtpXSA9IGFycmF5W2ldXG4gIH1cbn1cblxuZnVuY3Rpb24gZmxhdHRlbjJEIChhcnJheSwgbngsIG55LCBvdXQpIHtcbiAgdmFyIHB0ciA9IDBcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBueDsgKytpKSB7XG4gICAgdmFyIHJvdyA9IGFycmF5W2ldXG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBueTsgKytqKSB7XG4gICAgICBvdXRbcHRyKytdID0gcm93W2pdXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGZsYXR0ZW4zRCAoYXJyYXksIG54LCBueSwgbnosIG91dCwgcHRyXykge1xuICB2YXIgcHRyID0gcHRyX1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG54OyArK2kpIHtcbiAgICB2YXIgcm93ID0gYXJyYXlbaV1cbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IG55OyArK2opIHtcbiAgICAgIHZhciBjb2wgPSByb3dbal1cbiAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgbno7ICsraykge1xuICAgICAgICBvdXRbcHRyKytdID0gY29sW2tdXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGZsYXR0ZW5SZWMgKGFycmF5LCBzaGFwZSwgbGV2ZWwsIG91dCwgcHRyKSB7XG4gIHZhciBzdHJpZGUgPSAxXG4gIGZvciAodmFyIGkgPSBsZXZlbCArIDE7IGkgPCBzaGFwZS5sZW5ndGg7ICsraSkge1xuICAgIHN0cmlkZSAqPSBzaGFwZVtpXVxuICB9XG4gIHZhciBuID0gc2hhcGVbbGV2ZWxdXG4gIGlmIChzaGFwZS5sZW5ndGggLSBsZXZlbCA9PT0gNCkge1xuICAgIHZhciBueCA9IHNoYXBlW2xldmVsICsgMV1cbiAgICB2YXIgbnkgPSBzaGFwZVtsZXZlbCArIDJdXG4gICAgdmFyIG56ID0gc2hhcGVbbGV2ZWwgKyAzXVxuICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGZsYXR0ZW4zRChhcnJheVtpXSwgbngsIG55LCBueiwgb3V0LCBwdHIpXG4gICAgICBwdHIgKz0gc3RyaWRlXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGZsYXR0ZW5SZWMoYXJyYXlbaV0sIHNoYXBlLCBsZXZlbCArIDEsIG91dCwgcHRyKVxuICAgICAgcHRyICs9IHN0cmlkZVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBmbGF0dGVuQXJyYXkgKGFycmF5LCBzaGFwZSwgdHlwZSwgb3V0Xykge1xuICB2YXIgc3ogPSAxXG4gIGlmIChzaGFwZS5sZW5ndGgpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNoYXBlLmxlbmd0aDsgKytpKSB7XG4gICAgICBzeiAqPSBzaGFwZVtpXVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBzeiA9IDBcbiAgfVxuICB2YXIgb3V0ID0gb3V0XyB8fCBwb29sLmFsbG9jVHlwZSh0eXBlLCBzeilcbiAgc3dpdGNoIChzaGFwZS5sZW5ndGgpIHtcbiAgICBjYXNlIDA6XG4gICAgICBicmVha1xuICAgIGNhc2UgMTpcbiAgICAgIGZsYXR0ZW4xRChhcnJheSwgc2hhcGVbMF0sIG91dClcbiAgICAgIGJyZWFrXG4gICAgY2FzZSAyOlxuICAgICAgZmxhdHRlbjJEKGFycmF5LCBzaGFwZVswXSwgc2hhcGVbMV0sIG91dClcbiAgICAgIGJyZWFrXG4gICAgY2FzZSAzOlxuICAgICAgZmxhdHRlbjNEKGFycmF5LCBzaGFwZVswXSwgc2hhcGVbMV0sIHNoYXBlWzJdLCBvdXQsIDApXG4gICAgICBicmVha1xuICAgIGRlZmF1bHQ6XG4gICAgICBmbGF0dGVuUmVjKGFycmF5LCBzaGFwZSwgMCwgb3V0LCAwKVxuICB9XG4gIHJldHVybiBvdXRcbn1cblxuZnVuY3Rpb24gYXJyYXlTaGFwZSQxIChhcnJheV8pIHtcbiAgdmFyIHNoYXBlID0gW11cbiAgZm9yICh2YXIgYXJyYXkgPSBhcnJheV87IGFycmF5Lmxlbmd0aDsgYXJyYXkgPSBhcnJheVswXSkge1xuICAgIHNoYXBlLnB1c2goYXJyYXkubGVuZ3RoKVxuICB9XG4gIHJldHVybiBzaGFwZVxufVxuXG52YXIgYXJyYXlUeXBlcyA9ICB7XG5cdFwiW29iamVjdCBJbnQ4QXJyYXldXCI6IDUxMjAsXG5cdFwiW29iamVjdCBJbnQxNkFycmF5XVwiOiA1MTIyLFxuXHRcIltvYmplY3QgSW50MzJBcnJheV1cIjogNTEyNCxcblx0XCJbb2JqZWN0IFVpbnQ4QXJyYXldXCI6IDUxMjEsXG5cdFwiW29iamVjdCBVaW50OENsYW1wZWRBcnJheV1cIjogNTEyMSxcblx0XCJbb2JqZWN0IFVpbnQxNkFycmF5XVwiOiA1MTIzLFxuXHRcIltvYmplY3QgVWludDMyQXJyYXldXCI6IDUxMjUsXG5cdFwiW29iamVjdCBGbG9hdDMyQXJyYXldXCI6IDUxMjYsXG5cdFwiW29iamVjdCBGbG9hdDY0QXJyYXldXCI6IDUxMjEsXG5cdFwiW29iamVjdCBBcnJheUJ1ZmZlcl1cIjogNTEyMVxufTtcblxudmFyIGludDggPSA1MTIwO1xudmFyIGludDE2ID0gNTEyMjtcbnZhciBpbnQzMiA9IDUxMjQ7XG52YXIgdWludDggPSA1MTIxO1xudmFyIHVpbnQxNiA9IDUxMjM7XG52YXIgdWludDMyID0gNTEyNTtcbnZhciBmbG9hdCA9IDUxMjY7XG52YXIgZmxvYXQzMiA9IDUxMjY7XG52YXIgZ2xUeXBlcyA9IHtcblx0aW50ODogaW50OCxcblx0aW50MTY6IGludDE2LFxuXHRpbnQzMjogaW50MzIsXG5cdHVpbnQ4OiB1aW50OCxcblx0dWludDE2OiB1aW50MTYsXG5cdHVpbnQzMjogdWludDMyLFxuXHRmbG9hdDogZmxvYXQsXG5cdGZsb2F0MzI6IGZsb2F0MzJcbn07XG5cbnZhciBkeW5hbWljJDEgPSAzNTA0ODtcbnZhciBzdHJlYW0gPSAzNTA0MDtcbnZhciB1c2FnZVR5cGVzID0ge1xuXHRkeW5hbWljOiBkeW5hbWljJDEsXG5cdHN0cmVhbTogc3RyZWFtLFxuXHRcInN0YXRpY1wiOiAzNTA0NFxufTtcblxudmFyIGFycmF5RmxhdHRlbiA9IGZsYXR0ZW5VdGlscy5mbGF0dGVuXG52YXIgYXJyYXlTaGFwZSA9IGZsYXR0ZW5VdGlscy5zaGFwZVxuXG52YXIgR0xfU1RBVElDX0RSQVcgPSAweDg4RTRcbnZhciBHTF9TVFJFQU1fRFJBVyA9IDB4ODhFMFxuXG52YXIgR0xfVU5TSUdORURfQllURSQzID0gNTEyMVxudmFyIEdMX0ZMT0FUJDMgPSA1MTI2XG5cbnZhciBEVFlQRVNfU0laRVMgPSBbXVxuRFRZUEVTX1NJWkVTWzUxMjBdID0gMSAvLyBpbnQ4XG5EVFlQRVNfU0laRVNbNTEyMl0gPSAyIC8vIGludDE2XG5EVFlQRVNfU0laRVNbNTEyNF0gPSA0IC8vIGludDMyXG5EVFlQRVNfU0laRVNbNTEyMV0gPSAxIC8vIHVpbnQ4XG5EVFlQRVNfU0laRVNbNTEyM10gPSAyIC8vIHVpbnQxNlxuRFRZUEVTX1NJWkVTWzUxMjVdID0gNCAvLyB1aW50MzJcbkRUWVBFU19TSVpFU1s1MTI2XSA9IDQgLy8gZmxvYXQzMlxuXG5mdW5jdGlvbiB0eXBlZEFycmF5Q29kZSAoZGF0YSkge1xuICByZXR1cm4gYXJyYXlUeXBlc1tPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZGF0YSldIHwgMFxufVxuXG5mdW5jdGlvbiBjb3B5QXJyYXkgKG91dCwgaW5wKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgaW5wLmxlbmd0aDsgKytpKSB7XG4gICAgb3V0W2ldID0gaW5wW2ldXG4gIH1cbn1cblxuZnVuY3Rpb24gdHJhbnNwb3NlIChcbiAgcmVzdWx0LCBkYXRhLCBzaGFwZVgsIHNoYXBlWSwgc3RyaWRlWCwgc3RyaWRlWSwgb2Zmc2V0KSB7XG4gIHZhciBwdHIgPSAwXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc2hhcGVYOyArK2kpIHtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IHNoYXBlWTsgKytqKSB7XG4gICAgICByZXN1bHRbcHRyKytdID0gZGF0YVtzdHJpZGVYICogaSArIHN0cmlkZVkgKiBqICsgb2Zmc2V0XVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB3cmFwQnVmZmVyU3RhdGUgKGdsLCBzdGF0cywgY29uZmlnLCBkZXN0cm95QnVmZmVyKSB7XG4gIHZhciBidWZmZXJDb3VudCA9IDBcbiAgdmFyIGJ1ZmZlclNldCA9IHt9XG5cbiAgZnVuY3Rpb24gUkVHTEJ1ZmZlciAodHlwZSkge1xuICAgIHRoaXMuaWQgPSBidWZmZXJDb3VudCsrXG4gICAgdGhpcy5idWZmZXIgPSBnbC5jcmVhdGVCdWZmZXIoKVxuICAgIHRoaXMudHlwZSA9IHR5cGVcbiAgICB0aGlzLnVzYWdlID0gR0xfU1RBVElDX0RSQVdcbiAgICB0aGlzLmJ5dGVMZW5ndGggPSAwXG4gICAgdGhpcy5kaW1lbnNpb24gPSAxXG4gICAgdGhpcy5kdHlwZSA9IEdMX1VOU0lHTkVEX0JZVEUkM1xuXG4gICAgdGhpcy5wZXJzaXN0ZW50RGF0YSA9IG51bGxcblxuICAgIGlmIChjb25maWcucHJvZmlsZSkge1xuICAgICAgdGhpcy5zdGF0cyA9IHsgc2l6ZTogMCB9XG4gICAgfVxuICB9XG5cbiAgUkVHTEJ1ZmZlci5wcm90b3R5cGUuYmluZCA9IGZ1bmN0aW9uICgpIHtcbiAgICBnbC5iaW5kQnVmZmVyKHRoaXMudHlwZSwgdGhpcy5idWZmZXIpXG4gIH1cblxuICBSRUdMQnVmZmVyLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuICAgIGRlc3Ryb3kodGhpcylcbiAgfVxuXG4gIHZhciBzdHJlYW1Qb29sID0gW11cblxuICBmdW5jdGlvbiBjcmVhdGVTdHJlYW0gKHR5cGUsIGRhdGEpIHtcbiAgICB2YXIgYnVmZmVyID0gc3RyZWFtUG9vbC5wb3AoKVxuICAgIGlmICghYnVmZmVyKSB7XG4gICAgICBidWZmZXIgPSBuZXcgUkVHTEJ1ZmZlcih0eXBlKVxuICAgIH1cbiAgICBidWZmZXIuYmluZCgpXG4gICAgaW5pdEJ1ZmZlckZyb21EYXRhKGJ1ZmZlciwgZGF0YSwgR0xfU1RSRUFNX0RSQVcsIDAsIDEsIGZhbHNlKVxuICAgIHJldHVybiBidWZmZXJcbiAgfVxuXG4gIGZ1bmN0aW9uIGRlc3Ryb3lTdHJlYW0gKHN0cmVhbSQkMSkge1xuICAgIHN0cmVhbVBvb2wucHVzaChzdHJlYW0kJDEpXG4gIH1cblxuICBmdW5jdGlvbiBpbml0QnVmZmVyRnJvbVR5cGVkQXJyYXkgKGJ1ZmZlciwgZGF0YSwgdXNhZ2UpIHtcbiAgICBidWZmZXIuYnl0ZUxlbmd0aCA9IGRhdGEuYnl0ZUxlbmd0aFxuICAgIGdsLmJ1ZmZlckRhdGEoYnVmZmVyLnR5cGUsIGRhdGEsIHVzYWdlKVxuICB9XG5cbiAgZnVuY3Rpb24gaW5pdEJ1ZmZlckZyb21EYXRhIChidWZmZXIsIGRhdGEsIHVzYWdlLCBkdHlwZSwgZGltZW5zaW9uLCBwZXJzaXN0KSB7XG4gICAgdmFyIHNoYXBlXG4gICAgYnVmZmVyLnVzYWdlID0gdXNhZ2VcbiAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgYnVmZmVyLmR0eXBlID0gZHR5cGUgfHwgR0xfRkxPQVQkM1xuICAgICAgaWYgKGRhdGEubGVuZ3RoID4gMCkge1xuICAgICAgICB2YXIgZmxhdERhdGFcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YVswXSkpIHtcbiAgICAgICAgICBzaGFwZSA9IGFycmF5U2hhcGUoZGF0YSlcbiAgICAgICAgICB2YXIgZGltID0gMVxuICAgICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgc2hhcGUubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGRpbSAqPSBzaGFwZVtpXVxuICAgICAgICAgIH1cbiAgICAgICAgICBidWZmZXIuZGltZW5zaW9uID0gZGltXG4gICAgICAgICAgZmxhdERhdGEgPSBhcnJheUZsYXR0ZW4oZGF0YSwgc2hhcGUsIGJ1ZmZlci5kdHlwZSlcbiAgICAgICAgICBpbml0QnVmZmVyRnJvbVR5cGVkQXJyYXkoYnVmZmVyLCBmbGF0RGF0YSwgdXNhZ2UpXG4gICAgICAgICAgaWYgKHBlcnNpc3QpIHtcbiAgICAgICAgICAgIGJ1ZmZlci5wZXJzaXN0ZW50RGF0YSA9IGZsYXREYXRhXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBvb2wuZnJlZVR5cGUoZmxhdERhdGEpXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBkYXRhWzBdID09PSAnbnVtYmVyJykge1xuICAgICAgICAgIGJ1ZmZlci5kaW1lbnNpb24gPSBkaW1lbnNpb25cbiAgICAgICAgICB2YXIgdHlwZWREYXRhID0gcG9vbC5hbGxvY1R5cGUoYnVmZmVyLmR0eXBlLCBkYXRhLmxlbmd0aClcbiAgICAgICAgICBjb3B5QXJyYXkodHlwZWREYXRhLCBkYXRhKVxuICAgICAgICAgIGluaXRCdWZmZXJGcm9tVHlwZWRBcnJheShidWZmZXIsIHR5cGVkRGF0YSwgdXNhZ2UpXG4gICAgICAgICAgaWYgKHBlcnNpc3QpIHtcbiAgICAgICAgICAgIGJ1ZmZlci5wZXJzaXN0ZW50RGF0YSA9IHR5cGVkRGF0YVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwb29sLmZyZWVUeXBlKHR5cGVkRGF0YSlcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoaXNUeXBlZEFycmF5KGRhdGFbMF0pKSB7XG4gICAgICAgICAgYnVmZmVyLmRpbWVuc2lvbiA9IGRhdGFbMF0ubGVuZ3RoXG4gICAgICAgICAgYnVmZmVyLmR0eXBlID0gZHR5cGUgfHwgdHlwZWRBcnJheUNvZGUoZGF0YVswXSkgfHwgR0xfRkxPQVQkM1xuICAgICAgICAgIGZsYXREYXRhID0gYXJyYXlGbGF0dGVuKFxuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgIFtkYXRhLmxlbmd0aCwgZGF0YVswXS5sZW5ndGhdLFxuICAgICAgICAgICAgYnVmZmVyLmR0eXBlKVxuICAgICAgICAgIGluaXRCdWZmZXJGcm9tVHlwZWRBcnJheShidWZmZXIsIGZsYXREYXRhLCB1c2FnZSlcbiAgICAgICAgICBpZiAocGVyc2lzdCkge1xuICAgICAgICAgICAgYnVmZmVyLnBlcnNpc3RlbnREYXRhID0gZmxhdERhdGFcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcG9vbC5mcmVlVHlwZShmbGF0RGF0YSlcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2hlY2skMS5yYWlzZSgnaW52YWxpZCBidWZmZXIgZGF0YScpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzVHlwZWRBcnJheShkYXRhKSkge1xuICAgICAgYnVmZmVyLmR0eXBlID0gZHR5cGUgfHwgdHlwZWRBcnJheUNvZGUoZGF0YSlcbiAgICAgIGJ1ZmZlci5kaW1lbnNpb24gPSBkaW1lbnNpb25cbiAgICAgIGluaXRCdWZmZXJGcm9tVHlwZWRBcnJheShidWZmZXIsIGRhdGEsIHVzYWdlKVxuICAgICAgaWYgKHBlcnNpc3QpIHtcbiAgICAgICAgYnVmZmVyLnBlcnNpc3RlbnREYXRhID0gbmV3IFVpbnQ4QXJyYXkobmV3IFVpbnQ4QXJyYXkoZGF0YS5idWZmZXIpKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXNOREFycmF5TGlrZShkYXRhKSkge1xuICAgICAgc2hhcGUgPSBkYXRhLnNoYXBlXG4gICAgICB2YXIgc3RyaWRlID0gZGF0YS5zdHJpZGVcbiAgICAgIHZhciBvZmZzZXQgPSBkYXRhLm9mZnNldFxuXG4gICAgICB2YXIgc2hhcGVYID0gMFxuICAgICAgdmFyIHNoYXBlWSA9IDBcbiAgICAgIHZhciBzdHJpZGVYID0gMFxuICAgICAgdmFyIHN0cmlkZVkgPSAwXG4gICAgICBpZiAoc2hhcGUubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHNoYXBlWCA9IHNoYXBlWzBdXG4gICAgICAgIHNoYXBlWSA9IDFcbiAgICAgICAgc3RyaWRlWCA9IHN0cmlkZVswXVxuICAgICAgICBzdHJpZGVZID0gMFxuICAgICAgfSBlbHNlIGlmIChzaGFwZS5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgc2hhcGVYID0gc2hhcGVbMF1cbiAgICAgICAgc2hhcGVZID0gc2hhcGVbMV1cbiAgICAgICAgc3RyaWRlWCA9IHN0cmlkZVswXVxuICAgICAgICBzdHJpZGVZID0gc3RyaWRlWzFdXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjaGVjayQxLnJhaXNlKCdpbnZhbGlkIHNoYXBlJylcbiAgICAgIH1cblxuICAgICAgYnVmZmVyLmR0eXBlID0gZHR5cGUgfHwgdHlwZWRBcnJheUNvZGUoZGF0YS5kYXRhKSB8fCBHTF9GTE9BVCQzXG4gICAgICBidWZmZXIuZGltZW5zaW9uID0gc2hhcGVZXG5cbiAgICAgIHZhciB0cmFuc3Bvc2VEYXRhID0gcG9vbC5hbGxvY1R5cGUoYnVmZmVyLmR0eXBlLCBzaGFwZVggKiBzaGFwZVkpXG4gICAgICB0cmFuc3Bvc2UodHJhbnNwb3NlRGF0YSxcbiAgICAgICAgZGF0YS5kYXRhLFxuICAgICAgICBzaGFwZVgsIHNoYXBlWSxcbiAgICAgICAgc3RyaWRlWCwgc3RyaWRlWSxcbiAgICAgICAgb2Zmc2V0KVxuICAgICAgaW5pdEJ1ZmZlckZyb21UeXBlZEFycmF5KGJ1ZmZlciwgdHJhbnNwb3NlRGF0YSwgdXNhZ2UpXG4gICAgICBpZiAocGVyc2lzdCkge1xuICAgICAgICBidWZmZXIucGVyc2lzdGVudERhdGEgPSB0cmFuc3Bvc2VEYXRhXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwb29sLmZyZWVUeXBlKHRyYW5zcG9zZURhdGEpXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChkYXRhIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICAgIGJ1ZmZlci5kdHlwZSA9IEdMX1VOU0lHTkVEX0JZVEUkM1xuICAgICAgYnVmZmVyLmRpbWVuc2lvbiA9IGRpbWVuc2lvblxuICAgICAgaW5pdEJ1ZmZlckZyb21UeXBlZEFycmF5KGJ1ZmZlciwgZGF0YSwgdXNhZ2UpXG4gICAgICBpZiAocGVyc2lzdCkge1xuICAgICAgICBidWZmZXIucGVyc2lzdGVudERhdGEgPSBuZXcgVWludDhBcnJheShuZXcgVWludDhBcnJheShkYXRhKSlcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY2hlY2skMS5yYWlzZSgnaW52YWxpZCBidWZmZXIgZGF0YScpXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZGVzdHJveSAoYnVmZmVyKSB7XG4gICAgc3RhdHMuYnVmZmVyQ291bnQtLVxuXG4gICAgLy8gcmVtb3ZlIGF0dHJpYnV0ZSBsaW5rXG4gICAgZGVzdHJveUJ1ZmZlcihidWZmZXIpXG5cbiAgICB2YXIgaGFuZGxlID0gYnVmZmVyLmJ1ZmZlclxuICAgIGNoZWNrJDEoaGFuZGxlLCAnYnVmZmVyIG11c3Qgbm90IGJlIGRlbGV0ZWQgYWxyZWFkeScpXG4gICAgZ2wuZGVsZXRlQnVmZmVyKGhhbmRsZSlcbiAgICBidWZmZXIuYnVmZmVyID0gbnVsbFxuICAgIGRlbGV0ZSBidWZmZXJTZXRbYnVmZmVyLmlkXVxuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlQnVmZmVyIChvcHRpb25zLCB0eXBlLCBkZWZlckluaXQsIHBlcnNpc3RlbnQpIHtcbiAgICBzdGF0cy5idWZmZXJDb3VudCsrXG5cbiAgICB2YXIgYnVmZmVyID0gbmV3IFJFR0xCdWZmZXIodHlwZSlcbiAgICBidWZmZXJTZXRbYnVmZmVyLmlkXSA9IGJ1ZmZlclxuXG4gICAgZnVuY3Rpb24gcmVnbEJ1ZmZlciAob3B0aW9ucykge1xuICAgICAgdmFyIHVzYWdlID0gR0xfU1RBVElDX0RSQVdcbiAgICAgIHZhciBkYXRhID0gbnVsbFxuICAgICAgdmFyIGJ5dGVMZW5ndGggPSAwXG4gICAgICB2YXIgZHR5cGUgPSAwXG4gICAgICB2YXIgZGltZW5zaW9uID0gMVxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkob3B0aW9ucykgfHxcbiAgICAgICAgICBpc1R5cGVkQXJyYXkob3B0aW9ucykgfHxcbiAgICAgICAgICBpc05EQXJyYXlMaWtlKG9wdGlvbnMpIHx8XG4gICAgICAgICAgb3B0aW9ucyBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7XG4gICAgICAgIGRhdGEgPSBvcHRpb25zXG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnbnVtYmVyJykge1xuICAgICAgICBieXRlTGVuZ3RoID0gb3B0aW9ucyB8IDBcbiAgICAgIH0gZWxzZSBpZiAob3B0aW9ucykge1xuICAgICAgICBjaGVjayQxLnR5cGUoXG4gICAgICAgICAgb3B0aW9ucywgJ29iamVjdCcsXG4gICAgICAgICAgJ2J1ZmZlciBhcmd1bWVudHMgbXVzdCBiZSBhbiBvYmplY3QsIGEgbnVtYmVyIG9yIGFuIGFycmF5JylcblxuICAgICAgICBpZiAoJ2RhdGEnIGluIG9wdGlvbnMpIHtcbiAgICAgICAgICBjaGVjayQxKFxuICAgICAgICAgICAgZGF0YSA9PT0gbnVsbCB8fFxuICAgICAgICAgICAgQXJyYXkuaXNBcnJheShkYXRhKSB8fFxuICAgICAgICAgICAgaXNUeXBlZEFycmF5KGRhdGEpIHx8XG4gICAgICAgICAgICBpc05EQXJyYXlMaWtlKGRhdGEpLFxuICAgICAgICAgICAgJ2ludmFsaWQgZGF0YSBmb3IgYnVmZmVyJylcbiAgICAgICAgICBkYXRhID0gb3B0aW9ucy5kYXRhXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoJ3VzYWdlJyBpbiBvcHRpb25zKSB7XG4gICAgICAgICAgY2hlY2skMS5wYXJhbWV0ZXIob3B0aW9ucy51c2FnZSwgdXNhZ2VUeXBlcywgJ2ludmFsaWQgYnVmZmVyIHVzYWdlJylcbiAgICAgICAgICB1c2FnZSA9IHVzYWdlVHlwZXNbb3B0aW9ucy51c2FnZV1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgndHlwZScgaW4gb3B0aW9ucykge1xuICAgICAgICAgIGNoZWNrJDEucGFyYW1ldGVyKG9wdGlvbnMudHlwZSwgZ2xUeXBlcywgJ2ludmFsaWQgYnVmZmVyIHR5cGUnKVxuICAgICAgICAgIGR0eXBlID0gZ2xUeXBlc1tvcHRpb25zLnR5cGVdXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoJ2RpbWVuc2lvbicgaW4gb3B0aW9ucykge1xuICAgICAgICAgIGNoZWNrJDEudHlwZShvcHRpb25zLmRpbWVuc2lvbiwgJ251bWJlcicsICdpbnZhbGlkIGRpbWVuc2lvbicpXG4gICAgICAgICAgZGltZW5zaW9uID0gb3B0aW9ucy5kaW1lbnNpb24gfCAwXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoJ2xlbmd0aCcgaW4gb3B0aW9ucykge1xuICAgICAgICAgIGNoZWNrJDEubm5pKGJ5dGVMZW5ndGgsICdidWZmZXIgbGVuZ3RoIG11c3QgYmUgYSBub25uZWdhdGl2ZSBpbnRlZ2VyJylcbiAgICAgICAgICBieXRlTGVuZ3RoID0gb3B0aW9ucy5sZW5ndGggfCAwXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgYnVmZmVyLmJpbmQoKVxuICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgIC8vICM0NzVcbiAgICAgICAgaWYgKGJ5dGVMZW5ndGgpIGdsLmJ1ZmZlckRhdGEoYnVmZmVyLnR5cGUsIGJ5dGVMZW5ndGgsIHVzYWdlKVxuICAgICAgICBidWZmZXIuZHR5cGUgPSBkdHlwZSB8fCBHTF9VTlNJR05FRF9CWVRFJDNcbiAgICAgICAgYnVmZmVyLnVzYWdlID0gdXNhZ2VcbiAgICAgICAgYnVmZmVyLmRpbWVuc2lvbiA9IGRpbWVuc2lvblxuICAgICAgICBidWZmZXIuYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGhcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGluaXRCdWZmZXJGcm9tRGF0YShidWZmZXIsIGRhdGEsIHVzYWdlLCBkdHlwZSwgZGltZW5zaW9uLCBwZXJzaXN0ZW50KVxuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLnByb2ZpbGUpIHtcbiAgICAgICAgYnVmZmVyLnN0YXRzLnNpemUgPSBidWZmZXIuYnl0ZUxlbmd0aCAqIERUWVBFU19TSVpFU1tidWZmZXIuZHR5cGVdXG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZWdsQnVmZmVyXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2V0U3ViRGF0YSAoZGF0YSwgb2Zmc2V0KSB7XG4gICAgICBjaGVjayQxKG9mZnNldCArIGRhdGEuYnl0ZUxlbmd0aCA8PSBidWZmZXIuYnl0ZUxlbmd0aCxcbiAgICAgICAgJ2ludmFsaWQgYnVmZmVyIHN1YmRhdGEgY2FsbCwgYnVmZmVyIGlzIHRvbyBzbWFsbC4gJyArICcgQ2FuXFwndCB3cml0ZSBkYXRhIG9mIHNpemUgJyArIGRhdGEuYnl0ZUxlbmd0aCArICcgc3RhcnRpbmcgZnJvbSBvZmZzZXQgJyArIG9mZnNldCArICcgdG8gYSBidWZmZXIgb2Ygc2l6ZSAnICsgYnVmZmVyLmJ5dGVMZW5ndGgpXG5cbiAgICAgIGdsLmJ1ZmZlclN1YkRhdGEoYnVmZmVyLnR5cGUsIG9mZnNldCwgZGF0YSlcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzdWJkYXRhIChkYXRhLCBvZmZzZXRfKSB7XG4gICAgICB2YXIgb2Zmc2V0ID0gKG9mZnNldF8gfHwgMCkgfCAwXG4gICAgICB2YXIgc2hhcGVcbiAgICAgIGJ1ZmZlci5iaW5kKClcbiAgICAgIGlmIChpc1R5cGVkQXJyYXkoZGF0YSkgfHwgZGF0YSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7XG4gICAgICAgIHNldFN1YkRhdGEoZGF0YSwgb2Zmc2V0KVxuICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICAgIGlmIChkYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGRhdGFbMF0gPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICB2YXIgY29udmVydGVkID0gcG9vbC5hbGxvY1R5cGUoYnVmZmVyLmR0eXBlLCBkYXRhLmxlbmd0aClcbiAgICAgICAgICAgIGNvcHlBcnJheShjb252ZXJ0ZWQsIGRhdGEpXG4gICAgICAgICAgICBzZXRTdWJEYXRhKGNvbnZlcnRlZCwgb2Zmc2V0KVxuICAgICAgICAgICAgcG9vbC5mcmVlVHlwZShjb252ZXJ0ZWQpXG4gICAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGRhdGFbMF0pIHx8IGlzVHlwZWRBcnJheShkYXRhWzBdKSkge1xuICAgICAgICAgICAgc2hhcGUgPSBhcnJheVNoYXBlKGRhdGEpXG4gICAgICAgICAgICB2YXIgZmxhdERhdGEgPSBhcnJheUZsYXR0ZW4oZGF0YSwgc2hhcGUsIGJ1ZmZlci5kdHlwZSlcbiAgICAgICAgICAgIHNldFN1YkRhdGEoZmxhdERhdGEsIG9mZnNldClcbiAgICAgICAgICAgIHBvb2wuZnJlZVR5cGUoZmxhdERhdGEpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNoZWNrJDEucmFpc2UoJ2ludmFsaWQgYnVmZmVyIGRhdGEnKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChpc05EQXJyYXlMaWtlKGRhdGEpKSB7XG4gICAgICAgIHNoYXBlID0gZGF0YS5zaGFwZVxuICAgICAgICB2YXIgc3RyaWRlID0gZGF0YS5zdHJpZGVcblxuICAgICAgICB2YXIgc2hhcGVYID0gMFxuICAgICAgICB2YXIgc2hhcGVZID0gMFxuICAgICAgICB2YXIgc3RyaWRlWCA9IDBcbiAgICAgICAgdmFyIHN0cmlkZVkgPSAwXG4gICAgICAgIGlmIChzaGFwZS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICBzaGFwZVggPSBzaGFwZVswXVxuICAgICAgICAgIHNoYXBlWSA9IDFcbiAgICAgICAgICBzdHJpZGVYID0gc3RyaWRlWzBdXG4gICAgICAgICAgc3RyaWRlWSA9IDBcbiAgICAgICAgfSBlbHNlIGlmIChzaGFwZS5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICBzaGFwZVggPSBzaGFwZVswXVxuICAgICAgICAgIHNoYXBlWSA9IHNoYXBlWzFdXG4gICAgICAgICAgc3RyaWRlWCA9IHN0cmlkZVswXVxuICAgICAgICAgIHN0cmlkZVkgPSBzdHJpZGVbMV1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjaGVjayQxLnJhaXNlKCdpbnZhbGlkIHNoYXBlJylcbiAgICAgICAgfVxuICAgICAgICB2YXIgZHR5cGUgPSBBcnJheS5pc0FycmF5KGRhdGEuZGF0YSlcbiAgICAgICAgICA/IGJ1ZmZlci5kdHlwZVxuICAgICAgICAgIDogdHlwZWRBcnJheUNvZGUoZGF0YS5kYXRhKVxuXG4gICAgICAgIHZhciB0cmFuc3Bvc2VEYXRhID0gcG9vbC5hbGxvY1R5cGUoZHR5cGUsIHNoYXBlWCAqIHNoYXBlWSlcbiAgICAgICAgdHJhbnNwb3NlKHRyYW5zcG9zZURhdGEsXG4gICAgICAgICAgZGF0YS5kYXRhLFxuICAgICAgICAgIHNoYXBlWCwgc2hhcGVZLFxuICAgICAgICAgIHN0cmlkZVgsIHN0cmlkZVksXG4gICAgICAgICAgZGF0YS5vZmZzZXQpXG4gICAgICAgIHNldFN1YkRhdGEodHJhbnNwb3NlRGF0YSwgb2Zmc2V0KVxuICAgICAgICBwb29sLmZyZWVUeXBlKHRyYW5zcG9zZURhdGEpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjaGVjayQxLnJhaXNlKCdpbnZhbGlkIGRhdGEgZm9yIGJ1ZmZlciBzdWJkYXRhJylcbiAgICAgIH1cbiAgICAgIHJldHVybiByZWdsQnVmZmVyXG4gICAgfVxuXG4gICAgaWYgKCFkZWZlckluaXQpIHtcbiAgICAgIHJlZ2xCdWZmZXIob3B0aW9ucylcbiAgICB9XG5cbiAgICByZWdsQnVmZmVyLl9yZWdsVHlwZSA9ICdidWZmZXInXG4gICAgcmVnbEJ1ZmZlci5fYnVmZmVyID0gYnVmZmVyXG4gICAgcmVnbEJ1ZmZlci5zdWJkYXRhID0gc3ViZGF0YVxuICAgIGlmIChjb25maWcucHJvZmlsZSkge1xuICAgICAgcmVnbEJ1ZmZlci5zdGF0cyA9IGJ1ZmZlci5zdGF0c1xuICAgIH1cbiAgICByZWdsQnVmZmVyLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7IGRlc3Ryb3koYnVmZmVyKSB9XG5cbiAgICByZXR1cm4gcmVnbEJ1ZmZlclxuICB9XG5cbiAgZnVuY3Rpb24gcmVzdG9yZUJ1ZmZlcnMgKCkge1xuICAgIHZhbHVlcyhidWZmZXJTZXQpLmZvckVhY2goZnVuY3Rpb24gKGJ1ZmZlcikge1xuICAgICAgYnVmZmVyLmJ1ZmZlciA9IGdsLmNyZWF0ZUJ1ZmZlcigpXG4gICAgICBnbC5iaW5kQnVmZmVyKGJ1ZmZlci50eXBlLCBidWZmZXIuYnVmZmVyKVxuICAgICAgZ2wuYnVmZmVyRGF0YShcbiAgICAgICAgYnVmZmVyLnR5cGUsIGJ1ZmZlci5wZXJzaXN0ZW50RGF0YSB8fCBidWZmZXIuYnl0ZUxlbmd0aCwgYnVmZmVyLnVzYWdlKVxuICAgIH0pXG4gIH1cblxuICBpZiAoY29uZmlnLnByb2ZpbGUpIHtcbiAgICBzdGF0cy5nZXRUb3RhbEJ1ZmZlclNpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgdG90YWwgPSAwXG4gICAgICAvLyBUT0RPOiBSaWdodCBub3csIHRoZSBzdHJlYW1zIGFyZSBub3QgcGFydCBvZiB0aGUgdG90YWwgY291bnQuXG4gICAgICBPYmplY3Qua2V5cyhidWZmZXJTZXQpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICB0b3RhbCArPSBidWZmZXJTZXRba2V5XS5zdGF0cy5zaXplXG4gICAgICB9KVxuICAgICAgcmV0dXJuIHRvdGFsXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBjcmVhdGU6IGNyZWF0ZUJ1ZmZlcixcblxuICAgIGNyZWF0ZVN0cmVhbTogY3JlYXRlU3RyZWFtLFxuICAgIGRlc3Ryb3lTdHJlYW06IGRlc3Ryb3lTdHJlYW0sXG5cbiAgICBjbGVhcjogZnVuY3Rpb24gKCkge1xuICAgICAgdmFsdWVzKGJ1ZmZlclNldCkuZm9yRWFjaChkZXN0cm95KVxuICAgICAgc3RyZWFtUG9vbC5mb3JFYWNoKGRlc3Ryb3kpXG4gICAgfSxcblxuICAgIGdldEJ1ZmZlcjogZnVuY3Rpb24gKHdyYXBwZXIpIHtcbiAgICAgIGlmICh3cmFwcGVyICYmIHdyYXBwZXIuX2J1ZmZlciBpbnN0YW5jZW9mIFJFR0xCdWZmZXIpIHtcbiAgICAgICAgcmV0dXJuIHdyYXBwZXIuX2J1ZmZlclxuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGxcbiAgICB9LFxuXG4gICAgcmVzdG9yZTogcmVzdG9yZUJ1ZmZlcnMsXG5cbiAgICBfaW5pdEJ1ZmZlcjogaW5pdEJ1ZmZlckZyb21EYXRhXG4gIH1cbn1cblxudmFyIHBvaW50cyA9IDA7XG52YXIgcG9pbnQgPSAwO1xudmFyIGxpbmVzID0gMTtcbnZhciBsaW5lID0gMTtcbnZhciB0cmlhbmdsZXMgPSA0O1xudmFyIHRyaWFuZ2xlID0gNDtcbnZhciBwcmltVHlwZXMgPSB7XG5cdHBvaW50czogcG9pbnRzLFxuXHRwb2ludDogcG9pbnQsXG5cdGxpbmVzOiBsaW5lcyxcblx0bGluZTogbGluZSxcblx0dHJpYW5nbGVzOiB0cmlhbmdsZXMsXG5cdHRyaWFuZ2xlOiB0cmlhbmdsZSxcblx0XCJsaW5lIGxvb3BcIjogMixcblx0XCJsaW5lIHN0cmlwXCI6IDMsXG5cdFwidHJpYW5nbGUgc3RyaXBcIjogNSxcblx0XCJ0cmlhbmdsZSBmYW5cIjogNlxufTtcblxudmFyIEdMX1BPSU5UUyA9IDBcbnZhciBHTF9MSU5FUyA9IDFcbnZhciBHTF9UUklBTkdMRVMgPSA0XG5cbnZhciBHTF9CWVRFJDIgPSA1MTIwXG52YXIgR0xfVU5TSUdORURfQllURSQ0ID0gNTEyMVxudmFyIEdMX1NIT1JUJDIgPSA1MTIyXG52YXIgR0xfVU5TSUdORURfU0hPUlQkMiA9IDUxMjNcbnZhciBHTF9JTlQkMiA9IDUxMjRcbnZhciBHTF9VTlNJR05FRF9JTlQkMiA9IDUxMjVcblxudmFyIEdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSID0gMzQ5NjNcblxudmFyIEdMX1NUUkVBTV9EUkFXJDEgPSAweDg4RTBcbnZhciBHTF9TVEFUSUNfRFJBVyQxID0gMHg4OEU0XG5cbmZ1bmN0aW9uIHdyYXBFbGVtZW50c1N0YXRlIChnbCwgZXh0ZW5zaW9ucywgYnVmZmVyU3RhdGUsIHN0YXRzKSB7XG4gIHZhciBlbGVtZW50U2V0ID0ge31cbiAgdmFyIGVsZW1lbnRDb3VudCA9IDBcblxuICB2YXIgZWxlbWVudFR5cGVzID0ge1xuICAgICd1aW50OCc6IEdMX1VOU0lHTkVEX0JZVEUkNCxcbiAgICAndWludDE2JzogR0xfVU5TSUdORURfU0hPUlQkMlxuICB9XG5cbiAgaWYgKGV4dGVuc2lvbnMub2VzX2VsZW1lbnRfaW5kZXhfdWludCkge1xuICAgIGVsZW1lbnRUeXBlcy51aW50MzIgPSBHTF9VTlNJR05FRF9JTlQkMlxuICB9XG5cbiAgZnVuY3Rpb24gUkVHTEVsZW1lbnRCdWZmZXIgKGJ1ZmZlcikge1xuICAgIHRoaXMuaWQgPSBlbGVtZW50Q291bnQrK1xuICAgIGVsZW1lbnRTZXRbdGhpcy5pZF0gPSB0aGlzXG4gICAgdGhpcy5idWZmZXIgPSBidWZmZXJcbiAgICB0aGlzLnByaW1UeXBlID0gR0xfVFJJQU5HTEVTXG4gICAgdGhpcy52ZXJ0Q291bnQgPSAwXG4gICAgdGhpcy50eXBlID0gMFxuICB9XG5cbiAgUkVHTEVsZW1lbnRCdWZmZXIucHJvdG90eXBlLmJpbmQgPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5idWZmZXIuYmluZCgpXG4gIH1cblxuICB2YXIgYnVmZmVyUG9vbCA9IFtdXG5cbiAgZnVuY3Rpb24gY3JlYXRlRWxlbWVudFN0cmVhbSAoZGF0YSkge1xuICAgIHZhciByZXN1bHQgPSBidWZmZXJQb29sLnBvcCgpXG4gICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgIHJlc3VsdCA9IG5ldyBSRUdMRWxlbWVudEJ1ZmZlcihidWZmZXJTdGF0ZS5jcmVhdGUoXG4gICAgICAgIG51bGwsXG4gICAgICAgIEdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSLFxuICAgICAgICB0cnVlLFxuICAgICAgICBmYWxzZSkuX2J1ZmZlcilcbiAgICB9XG4gICAgaW5pdEVsZW1lbnRzKHJlc3VsdCwgZGF0YSwgR0xfU1RSRUFNX0RSQVckMSwgLTEsIC0xLCAwLCAwKVxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIGZ1bmN0aW9uIGRlc3Ryb3lFbGVtZW50U3RyZWFtIChlbGVtZW50cykge1xuICAgIGJ1ZmZlclBvb2wucHVzaChlbGVtZW50cylcbiAgfVxuXG4gIGZ1bmN0aW9uIGluaXRFbGVtZW50cyAoXG4gICAgZWxlbWVudHMsXG4gICAgZGF0YSxcbiAgICB1c2FnZSxcbiAgICBwcmltLFxuICAgIGNvdW50LFxuICAgIGJ5dGVMZW5ndGgsXG4gICAgdHlwZSkge1xuICAgIGVsZW1lbnRzLmJ1ZmZlci5iaW5kKClcbiAgICB2YXIgZHR5cGVcbiAgICBpZiAoZGF0YSkge1xuICAgICAgdmFyIHByZWRpY3RlZFR5cGUgPSB0eXBlXG4gICAgICBpZiAoIXR5cGUgJiYgKFxuICAgICAgICAhaXNUeXBlZEFycmF5KGRhdGEpIHx8XG4gICAgICAgICAoaXNOREFycmF5TGlrZShkYXRhKSAmJiAhaXNUeXBlZEFycmF5KGRhdGEuZGF0YSkpKSkge1xuICAgICAgICBwcmVkaWN0ZWRUeXBlID0gZXh0ZW5zaW9ucy5vZXNfZWxlbWVudF9pbmRleF91aW50XG4gICAgICAgICAgPyBHTF9VTlNJR05FRF9JTlQkMlxuICAgICAgICAgIDogR0xfVU5TSUdORURfU0hPUlQkMlxuICAgICAgfVxuICAgICAgYnVmZmVyU3RhdGUuX2luaXRCdWZmZXIoXG4gICAgICAgIGVsZW1lbnRzLmJ1ZmZlcixcbiAgICAgICAgZGF0YSxcbiAgICAgICAgdXNhZ2UsXG4gICAgICAgIHByZWRpY3RlZFR5cGUsXG4gICAgICAgIDMpXG4gICAgfSBlbHNlIHtcbiAgICAgIGdsLmJ1ZmZlckRhdGEoR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVIsIGJ5dGVMZW5ndGgsIHVzYWdlKVxuICAgICAgZWxlbWVudHMuYnVmZmVyLmR0eXBlID0gZHR5cGUgfHwgR0xfVU5TSUdORURfQllURSQ0XG4gICAgICBlbGVtZW50cy5idWZmZXIudXNhZ2UgPSB1c2FnZVxuICAgICAgZWxlbWVudHMuYnVmZmVyLmRpbWVuc2lvbiA9IDNcbiAgICAgIGVsZW1lbnRzLmJ1ZmZlci5ieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aFxuICAgIH1cblxuICAgIGR0eXBlID0gdHlwZVxuICAgIGlmICghdHlwZSkge1xuICAgICAgc3dpdGNoIChlbGVtZW50cy5idWZmZXIuZHR5cGUpIHtcbiAgICAgICAgY2FzZSBHTF9VTlNJR05FRF9CWVRFJDQ6XG4gICAgICAgIGNhc2UgR0xfQllURSQyOlxuICAgICAgICAgIGR0eXBlID0gR0xfVU5TSUdORURfQllURSQ0XG4gICAgICAgICAgYnJlYWtcblxuICAgICAgICBjYXNlIEdMX1VOU0lHTkVEX1NIT1JUJDI6XG4gICAgICAgIGNhc2UgR0xfU0hPUlQkMjpcbiAgICAgICAgICBkdHlwZSA9IEdMX1VOU0lHTkVEX1NIT1JUJDJcbiAgICAgICAgICBicmVha1xuXG4gICAgICAgIGNhc2UgR0xfVU5TSUdORURfSU5UJDI6XG4gICAgICAgIGNhc2UgR0xfSU5UJDI6XG4gICAgICAgICAgZHR5cGUgPSBHTF9VTlNJR05FRF9JTlQkMlxuICAgICAgICAgIGJyZWFrXG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBjaGVjayQxLnJhaXNlKCd1bnN1cHBvcnRlZCB0eXBlIGZvciBlbGVtZW50IGFycmF5JylcbiAgICAgIH1cbiAgICAgIGVsZW1lbnRzLmJ1ZmZlci5kdHlwZSA9IGR0eXBlXG4gICAgfVxuICAgIGVsZW1lbnRzLnR5cGUgPSBkdHlwZVxuXG4gICAgLy8gQ2hlY2sgb2VzX2VsZW1lbnRfaW5kZXhfdWludCBleHRlbnNpb25cbiAgICBjaGVjayQxKFxuICAgICAgZHR5cGUgIT09IEdMX1VOU0lHTkVEX0lOVCQyIHx8XG4gICAgICAhIWV4dGVuc2lvbnMub2VzX2VsZW1lbnRfaW5kZXhfdWludCxcbiAgICAgICczMiBiaXQgZWxlbWVudCBidWZmZXJzIG5vdCBzdXBwb3J0ZWQsIGVuYWJsZSBvZXNfZWxlbWVudF9pbmRleF91aW50IGZpcnN0JylcblxuICAgIC8vIHRyeSB0byBndWVzcyBkZWZhdWx0IHByaW1pdGl2ZSB0eXBlIGFuZCBhcmd1bWVudHNcbiAgICB2YXIgdmVydENvdW50ID0gY291bnRcbiAgICBpZiAodmVydENvdW50IDwgMCkge1xuICAgICAgdmVydENvdW50ID0gZWxlbWVudHMuYnVmZmVyLmJ5dGVMZW5ndGhcbiAgICAgIGlmIChkdHlwZSA9PT0gR0xfVU5TSUdORURfU0hPUlQkMikge1xuICAgICAgICB2ZXJ0Q291bnQgPj49IDFcbiAgICAgIH0gZWxzZSBpZiAoZHR5cGUgPT09IEdMX1VOU0lHTkVEX0lOVCQyKSB7XG4gICAgICAgIHZlcnRDb3VudCA+Pj0gMlxuICAgICAgfVxuICAgIH1cbiAgICBlbGVtZW50cy52ZXJ0Q291bnQgPSB2ZXJ0Q291bnRcblxuICAgIC8vIHRyeSB0byBndWVzcyBwcmltaXRpdmUgdHlwZSBmcm9tIGNlbGwgZGltZW5zaW9uXG4gICAgdmFyIHByaW1UeXBlID0gcHJpbVxuICAgIGlmIChwcmltIDwgMCkge1xuICAgICAgcHJpbVR5cGUgPSBHTF9UUklBTkdMRVNcbiAgICAgIHZhciBkaW1lbnNpb24gPSBlbGVtZW50cy5idWZmZXIuZGltZW5zaW9uXG4gICAgICBpZiAoZGltZW5zaW9uID09PSAxKSBwcmltVHlwZSA9IEdMX1BPSU5UU1xuICAgICAgaWYgKGRpbWVuc2lvbiA9PT0gMikgcHJpbVR5cGUgPSBHTF9MSU5FU1xuICAgICAgaWYgKGRpbWVuc2lvbiA9PT0gMykgcHJpbVR5cGUgPSBHTF9UUklBTkdMRVNcbiAgICB9XG4gICAgZWxlbWVudHMucHJpbVR5cGUgPSBwcmltVHlwZVxuICB9XG5cbiAgZnVuY3Rpb24gZGVzdHJveUVsZW1lbnRzIChlbGVtZW50cykge1xuICAgIHN0YXRzLmVsZW1lbnRzQ291bnQtLVxuXG4gICAgY2hlY2skMShlbGVtZW50cy5idWZmZXIgIT09IG51bGwsICdtdXN0IG5vdCBkb3VibGUgZGVzdHJveSBlbGVtZW50cycpXG4gICAgZGVsZXRlIGVsZW1lbnRTZXRbZWxlbWVudHMuaWRdXG4gICAgZWxlbWVudHMuYnVmZmVyLmRlc3Ryb3koKVxuICAgIGVsZW1lbnRzLmJ1ZmZlciA9IG51bGxcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnRzIChvcHRpb25zLCBwZXJzaXN0ZW50KSB7XG4gICAgdmFyIGJ1ZmZlciA9IGJ1ZmZlclN0YXRlLmNyZWF0ZShudWxsLCBHTF9FTEVNRU5UX0FSUkFZX0JVRkZFUiwgdHJ1ZSlcbiAgICB2YXIgZWxlbWVudHMgPSBuZXcgUkVHTEVsZW1lbnRCdWZmZXIoYnVmZmVyLl9idWZmZXIpXG4gICAgc3RhdHMuZWxlbWVudHNDb3VudCsrXG5cbiAgICBmdW5jdGlvbiByZWdsRWxlbWVudHMgKG9wdGlvbnMpIHtcbiAgICAgIGlmICghb3B0aW9ucykge1xuICAgICAgICBidWZmZXIoKVxuICAgICAgICBlbGVtZW50cy5wcmltVHlwZSA9IEdMX1RSSUFOR0xFU1xuICAgICAgICBlbGVtZW50cy52ZXJ0Q291bnQgPSAwXG4gICAgICAgIGVsZW1lbnRzLnR5cGUgPSBHTF9VTlNJR05FRF9CWVRFJDRcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdudW1iZXInKSB7XG4gICAgICAgIGJ1ZmZlcihvcHRpb25zKVxuICAgICAgICBlbGVtZW50cy5wcmltVHlwZSA9IEdMX1RSSUFOR0xFU1xuICAgICAgICBlbGVtZW50cy52ZXJ0Q291bnQgPSBvcHRpb25zIHwgMFxuICAgICAgICBlbGVtZW50cy50eXBlID0gR0xfVU5TSUdORURfQllURSQ0XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgZGF0YSA9IG51bGxcbiAgICAgICAgdmFyIHVzYWdlID0gR0xfU1RBVElDX0RSQVckMVxuICAgICAgICB2YXIgcHJpbVR5cGUgPSAtMVxuICAgICAgICB2YXIgdmVydENvdW50ID0gLTFcbiAgICAgICAgdmFyIGJ5dGVMZW5ndGggPSAwXG4gICAgICAgIHZhciBkdHlwZSA9IDBcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkob3B0aW9ucykgfHxcbiAgICAgICAgICAgIGlzVHlwZWRBcnJheShvcHRpb25zKSB8fFxuICAgICAgICAgICAgaXNOREFycmF5TGlrZShvcHRpb25zKSkge1xuICAgICAgICAgIGRhdGEgPSBvcHRpb25zXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2hlY2skMS50eXBlKG9wdGlvbnMsICdvYmplY3QnLCAnaW52YWxpZCBhcmd1bWVudHMgZm9yIGVsZW1lbnRzJylcbiAgICAgICAgICBpZiAoJ2RhdGEnIGluIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIGRhdGEgPSBvcHRpb25zLmRhdGFcbiAgICAgICAgICAgIGNoZWNrJDEoXG4gICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkoZGF0YSkgfHxcbiAgICAgICAgICAgICAgICBpc1R5cGVkQXJyYXkoZGF0YSkgfHxcbiAgICAgICAgICAgICAgICBpc05EQXJyYXlMaWtlKGRhdGEpLFxuICAgICAgICAgICAgICAnaW52YWxpZCBkYXRhIGZvciBlbGVtZW50IGJ1ZmZlcicpXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICgndXNhZ2UnIGluIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIGNoZWNrJDEucGFyYW1ldGVyKFxuICAgICAgICAgICAgICBvcHRpb25zLnVzYWdlLFxuICAgICAgICAgICAgICB1c2FnZVR5cGVzLFxuICAgICAgICAgICAgICAnaW52YWxpZCBlbGVtZW50IGJ1ZmZlciB1c2FnZScpXG4gICAgICAgICAgICB1c2FnZSA9IHVzYWdlVHlwZXNbb3B0aW9ucy51c2FnZV1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCdwcmltaXRpdmUnIGluIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIGNoZWNrJDEucGFyYW1ldGVyKFxuICAgICAgICAgICAgICBvcHRpb25zLnByaW1pdGl2ZSxcbiAgICAgICAgICAgICAgcHJpbVR5cGVzLFxuICAgICAgICAgICAgICAnaW52YWxpZCBlbGVtZW50IGJ1ZmZlciBwcmltaXRpdmUnKVxuICAgICAgICAgICAgcHJpbVR5cGUgPSBwcmltVHlwZXNbb3B0aW9ucy5wcmltaXRpdmVdXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICgnY291bnQnIGluIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIGNoZWNrJDEoXG4gICAgICAgICAgICAgIHR5cGVvZiBvcHRpb25zLmNvdW50ID09PSAnbnVtYmVyJyAmJiBvcHRpb25zLmNvdW50ID49IDAsXG4gICAgICAgICAgICAgICdpbnZhbGlkIHZlcnRleCBjb3VudCBmb3IgZWxlbWVudHMnKVxuICAgICAgICAgICAgdmVydENvdW50ID0gb3B0aW9ucy5jb3VudCB8IDBcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCd0eXBlJyBpbiBvcHRpb25zKSB7XG4gICAgICAgICAgICBjaGVjayQxLnBhcmFtZXRlcihcbiAgICAgICAgICAgICAgb3B0aW9ucy50eXBlLFxuICAgICAgICAgICAgICBlbGVtZW50VHlwZXMsXG4gICAgICAgICAgICAgICdpbnZhbGlkIGJ1ZmZlciB0eXBlJylcbiAgICAgICAgICAgIGR0eXBlID0gZWxlbWVudFR5cGVzW29wdGlvbnMudHlwZV1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCdsZW5ndGgnIGluIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIGJ5dGVMZW5ndGggPSBvcHRpb25zLmxlbmd0aCB8IDBcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYnl0ZUxlbmd0aCA9IHZlcnRDb3VudFxuICAgICAgICAgICAgaWYgKGR0eXBlID09PSBHTF9VTlNJR05FRF9TSE9SVCQyIHx8IGR0eXBlID09PSBHTF9TSE9SVCQyKSB7XG4gICAgICAgICAgICAgIGJ5dGVMZW5ndGggKj0gMlxuICAgICAgICAgICAgfSBlbHNlIGlmIChkdHlwZSA9PT0gR0xfVU5TSUdORURfSU5UJDIgfHwgZHR5cGUgPT09IEdMX0lOVCQyKSB7XG4gICAgICAgICAgICAgIGJ5dGVMZW5ndGggKj0gNFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpbml0RWxlbWVudHMoXG4gICAgICAgICAgZWxlbWVudHMsXG4gICAgICAgICAgZGF0YSxcbiAgICAgICAgICB1c2FnZSxcbiAgICAgICAgICBwcmltVHlwZSxcbiAgICAgICAgICB2ZXJ0Q291bnQsXG4gICAgICAgICAgYnl0ZUxlbmd0aCxcbiAgICAgICAgICBkdHlwZSlcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlZ2xFbGVtZW50c1xuICAgIH1cblxuICAgIHJlZ2xFbGVtZW50cyhvcHRpb25zKVxuXG4gICAgcmVnbEVsZW1lbnRzLl9yZWdsVHlwZSA9ICdlbGVtZW50cydcbiAgICByZWdsRWxlbWVudHMuX2VsZW1lbnRzID0gZWxlbWVudHNcbiAgICByZWdsRWxlbWVudHMuc3ViZGF0YSA9IGZ1bmN0aW9uIChkYXRhLCBvZmZzZXQpIHtcbiAgICAgIGJ1ZmZlci5zdWJkYXRhKGRhdGEsIG9mZnNldClcbiAgICAgIHJldHVybiByZWdsRWxlbWVudHNcbiAgICB9XG4gICAgcmVnbEVsZW1lbnRzLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBkZXN0cm95RWxlbWVudHMoZWxlbWVudHMpXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlZ2xFbGVtZW50c1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBjcmVhdGU6IGNyZWF0ZUVsZW1lbnRzLFxuICAgIGNyZWF0ZVN0cmVhbTogY3JlYXRlRWxlbWVudFN0cmVhbSxcbiAgICBkZXN0cm95U3RyZWFtOiBkZXN0cm95RWxlbWVudFN0cmVhbSxcbiAgICBnZXRFbGVtZW50czogZnVuY3Rpb24gKGVsZW1lbnRzKSB7XG4gICAgICBpZiAodHlwZW9mIGVsZW1lbnRzID09PSAnZnVuY3Rpb24nICYmXG4gICAgICAgICAgZWxlbWVudHMuX2VsZW1lbnRzIGluc3RhbmNlb2YgUkVHTEVsZW1lbnRCdWZmZXIpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnRzLl9lbGVtZW50c1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGxcbiAgICB9LFxuICAgIGNsZWFyOiBmdW5jdGlvbiAoKSB7XG4gICAgICB2YWx1ZXMoZWxlbWVudFNldCkuZm9yRWFjaChkZXN0cm95RWxlbWVudHMpXG4gICAgfVxuICB9XG59XG5cbnZhciBGTE9BVCA9IG5ldyBGbG9hdDMyQXJyYXkoMSlcbnZhciBJTlQgPSBuZXcgVWludDMyQXJyYXkoRkxPQVQuYnVmZmVyKVxuXG52YXIgR0xfVU5TSUdORURfU0hPUlQkNCA9IDUxMjNcblxuZnVuY3Rpb24gY29udmVydFRvSGFsZkZsb2F0IChhcnJheSkge1xuICB2YXIgdXNob3J0cyA9IHBvb2wuYWxsb2NUeXBlKEdMX1VOU0lHTkVEX1NIT1JUJDQsIGFycmF5Lmxlbmd0aClcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgKytpKSB7XG4gICAgaWYgKGlzTmFOKGFycmF5W2ldKSkge1xuICAgICAgdXNob3J0c1tpXSA9IDB4ZmZmZlxuICAgIH0gZWxzZSBpZiAoYXJyYXlbaV0gPT09IEluZmluaXR5KSB7XG4gICAgICB1c2hvcnRzW2ldID0gMHg3YzAwXG4gICAgfSBlbHNlIGlmIChhcnJheVtpXSA9PT0gLUluZmluaXR5KSB7XG4gICAgICB1c2hvcnRzW2ldID0gMHhmYzAwXG4gICAgfSBlbHNlIHtcbiAgICAgIEZMT0FUWzBdID0gYXJyYXlbaV1cbiAgICAgIHZhciB4ID0gSU5UWzBdXG5cbiAgICAgIHZhciBzZ24gPSAoeCA+Pj4gMzEpIDw8IDE1XG4gICAgICB2YXIgZXhwID0gKCh4IDw8IDEpID4+PiAyNCkgLSAxMjdcbiAgICAgIHZhciBmcmFjID0gKHggPj4gMTMpICYgKCgxIDw8IDEwKSAtIDEpXG5cbiAgICAgIGlmIChleHAgPCAtMjQpIHtcbiAgICAgICAgLy8gcm91bmQgbm9uLXJlcHJlc2VudGFibGUgZGVub3JtYWxzIHRvIDBcbiAgICAgICAgdXNob3J0c1tpXSA9IHNnblxuICAgICAgfSBlbHNlIGlmIChleHAgPCAtMTQpIHtcbiAgICAgICAgLy8gaGFuZGxlIGRlbm9ybWFsc1xuICAgICAgICB2YXIgcyA9IC0xNCAtIGV4cFxuICAgICAgICB1c2hvcnRzW2ldID0gc2duICsgKChmcmFjICsgKDEgPDwgMTApKSA+PiBzKVxuICAgICAgfSBlbHNlIGlmIChleHAgPiAxNSkge1xuICAgICAgICAvLyByb3VuZCBvdmVyZmxvdyB0byArLy0gSW5maW5pdHlcbiAgICAgICAgdXNob3J0c1tpXSA9IHNnbiArIDB4N2MwMFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gb3RoZXJ3aXNlIGNvbnZlcnQgZGlyZWN0bHlcbiAgICAgICAgdXNob3J0c1tpXSA9IHNnbiArICgoZXhwICsgMTUpIDw8IDEwKSArIGZyYWNcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdXNob3J0c1xufVxuXG5mdW5jdGlvbiBpc0FycmF5TGlrZSAocykge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShzKSB8fCBpc1R5cGVkQXJyYXkocylcbn1cblxudmFyIGlzUG93MiQxID0gZnVuY3Rpb24gKHYpIHtcbiAgcmV0dXJuICEodiAmICh2IC0gMSkpICYmICghIXYpXG59XG5cbnZhciBHTF9DT01QUkVTU0VEX1RFWFRVUkVfRk9STUFUUyA9IDB4ODZBM1xuXG52YXIgR0xfVEVYVFVSRV8yRCQxID0gMHgwREUxXG52YXIgR0xfVEVYVFVSRV9DVUJFX01BUCQxID0gMHg4NTEzXG52YXIgR0xfVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YJDEgPSAweDg1MTVcblxudmFyIEdMX1JHQkEkMSA9IDB4MTkwOFxudmFyIEdMX0FMUEhBID0gMHgxOTA2XG52YXIgR0xfUkdCID0gMHgxOTA3XG52YXIgR0xfTFVNSU5BTkNFID0gMHgxOTA5XG52YXIgR0xfTFVNSU5BTkNFX0FMUEhBID0gMHgxOTBBXG5cbnZhciBHTF9SR0JBNCA9IDB4ODA1NlxudmFyIEdMX1JHQjVfQTEgPSAweDgwNTdcbnZhciBHTF9SR0I1NjUgPSAweDhENjJcblxudmFyIEdMX1VOU0lHTkVEX1NIT1JUXzRfNF80XzQkMSA9IDB4ODAzM1xudmFyIEdMX1VOU0lHTkVEX1NIT1JUXzVfNV81XzEkMSA9IDB4ODAzNFxudmFyIEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81JDEgPSAweDgzNjNcbnZhciBHTF9VTlNJR05FRF9JTlRfMjRfOF9XRUJHTCQxID0gMHg4NEZBXG5cbnZhciBHTF9ERVBUSF9DT01QT05FTlQgPSAweDE5MDJcbnZhciBHTF9ERVBUSF9TVEVOQ0lMID0gMHg4NEY5XG5cbnZhciBHTF9TUkdCX0VYVCA9IDB4OEM0MFxudmFyIEdMX1NSR0JfQUxQSEFfRVhUID0gMHg4QzQyXG5cbnZhciBHTF9IQUxGX0ZMT0FUX09FUyQxID0gMHg4RDYxXG5cbnZhciBHTF9DT01QUkVTU0VEX1JHQl9TM1RDX0RYVDFfRVhUID0gMHg4M0YwXG52YXIgR0xfQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUMV9FWFQgPSAweDgzRjFcbnZhciBHTF9DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQzX0VYVCA9IDB4ODNGMlxudmFyIEdMX0NPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDVfRVhUID0gMHg4M0YzXG5cbnZhciBHTF9DT01QUkVTU0VEX1JHQl9BVENfV0VCR0wgPSAweDhDOTJcbnZhciBHTF9DT01QUkVTU0VEX1JHQkFfQVRDX0VYUExJQ0lUX0FMUEhBX1dFQkdMID0gMHg4QzkzXG52YXIgR0xfQ09NUFJFU1NFRF9SR0JBX0FUQ19JTlRFUlBPTEFURURfQUxQSEFfV0VCR0wgPSAweDg3RUVcblxudmFyIEdMX0NPTVBSRVNTRURfUkdCX1BWUlRDXzRCUFBWMV9JTUcgPSAweDhDMDBcbnZhciBHTF9DT01QUkVTU0VEX1JHQl9QVlJUQ18yQlBQVjFfSU1HID0gMHg4QzAxXG52YXIgR0xfQ09NUFJFU1NFRF9SR0JBX1BWUlRDXzRCUFBWMV9JTUcgPSAweDhDMDJcbnZhciBHTF9DT01QUkVTU0VEX1JHQkFfUFZSVENfMkJQUFYxX0lNRyA9IDB4OEMwM1xuXG52YXIgR0xfQ09NUFJFU1NFRF9SR0JfRVRDMV9XRUJHTCA9IDB4OEQ2NFxuXG52YXIgR0xfVU5TSUdORURfQllURSQ1ID0gMHgxNDAxXG52YXIgR0xfVU5TSUdORURfU0hPUlQkMyA9IDB4MTQwM1xudmFyIEdMX1VOU0lHTkVEX0lOVCQzID0gMHgxNDA1XG52YXIgR0xfRkxPQVQkNCA9IDB4MTQwNlxuXG52YXIgR0xfVEVYVFVSRV9XUkFQX1MgPSAweDI4MDJcbnZhciBHTF9URVhUVVJFX1dSQVBfVCA9IDB4MjgwM1xuXG52YXIgR0xfUkVQRUFUID0gMHgyOTAxXG52YXIgR0xfQ0xBTVBfVE9fRURHRSQxID0gMHg4MTJGXG52YXIgR0xfTUlSUk9SRURfUkVQRUFUID0gMHg4MzcwXG5cbnZhciBHTF9URVhUVVJFX01BR19GSUxURVIgPSAweDI4MDBcbnZhciBHTF9URVhUVVJFX01JTl9GSUxURVIgPSAweDI4MDFcblxudmFyIEdMX05FQVJFU1QkMSA9IDB4MjYwMFxudmFyIEdMX0xJTkVBUiA9IDB4MjYwMVxudmFyIEdMX05FQVJFU1RfTUlQTUFQX05FQVJFU1QkMSA9IDB4MjcwMFxudmFyIEdMX0xJTkVBUl9NSVBNQVBfTkVBUkVTVCQxID0gMHgyNzAxXG52YXIgR0xfTkVBUkVTVF9NSVBNQVBfTElORUFSJDEgPSAweDI3MDJcbnZhciBHTF9MSU5FQVJfTUlQTUFQX0xJTkVBUiQxID0gMHgyNzAzXG5cbnZhciBHTF9HRU5FUkFURV9NSVBNQVBfSElOVCA9IDB4ODE5MlxudmFyIEdMX0RPTlRfQ0FSRSA9IDB4MTEwMFxudmFyIEdMX0ZBU1RFU1QgPSAweDExMDFcbnZhciBHTF9OSUNFU1QgPSAweDExMDJcblxudmFyIEdMX1RFWFRVUkVfTUFYX0FOSVNPVFJPUFlfRVhUID0gMHg4NEZFXG5cbnZhciBHTF9VTlBBQ0tfQUxJR05NRU5UID0gMHgwQ0Y1XG52YXIgR0xfVU5QQUNLX0ZMSVBfWV9XRUJHTCA9IDB4OTI0MFxudmFyIEdMX1VOUEFDS19QUkVNVUxUSVBMWV9BTFBIQV9XRUJHTCA9IDB4OTI0MVxudmFyIEdMX1VOUEFDS19DT0xPUlNQQUNFX0NPTlZFUlNJT05fV0VCR0wgPSAweDkyNDNcblxudmFyIEdMX0JST1dTRVJfREVGQVVMVF9XRUJHTCA9IDB4OTI0NFxuXG52YXIgR0xfVEVYVFVSRTAkMSA9IDB4ODRDMFxuXG52YXIgTUlQTUFQX0ZJTFRFUlMgPSBbXG4gIEdMX05FQVJFU1RfTUlQTUFQX05FQVJFU1QkMSxcbiAgR0xfTkVBUkVTVF9NSVBNQVBfTElORUFSJDEsXG4gIEdMX0xJTkVBUl9NSVBNQVBfTkVBUkVTVCQxLFxuICBHTF9MSU5FQVJfTUlQTUFQX0xJTkVBUiQxXG5dXG5cbnZhciBDSEFOTkVMU19GT1JNQVQgPSBbXG4gIDAsXG4gIEdMX0xVTUlOQU5DRSxcbiAgR0xfTFVNSU5BTkNFX0FMUEhBLFxuICBHTF9SR0IsXG4gIEdMX1JHQkEkMVxuXVxuXG52YXIgRk9STUFUX0NIQU5ORUxTID0ge31cbkZPUk1BVF9DSEFOTkVMU1tHTF9MVU1JTkFOQ0VdID1cbkZPUk1BVF9DSEFOTkVMU1tHTF9BTFBIQV0gPVxuRk9STUFUX0NIQU5ORUxTW0dMX0RFUFRIX0NPTVBPTkVOVF0gPSAxXG5GT1JNQVRfQ0hBTk5FTFNbR0xfREVQVEhfU1RFTkNJTF0gPVxuRk9STUFUX0NIQU5ORUxTW0dMX0xVTUlOQU5DRV9BTFBIQV0gPSAyXG5GT1JNQVRfQ0hBTk5FTFNbR0xfUkdCXSA9XG5GT1JNQVRfQ0hBTk5FTFNbR0xfU1JHQl9FWFRdID0gM1xuRk9STUFUX0NIQU5ORUxTW0dMX1JHQkEkMV0gPVxuRk9STUFUX0NIQU5ORUxTW0dMX1NSR0JfQUxQSEFfRVhUXSA9IDRcblxuZnVuY3Rpb24gb2JqZWN0TmFtZSAoc3RyKSB7XG4gIHJldHVybiAnW29iamVjdCAnICsgc3RyICsgJ10nXG59XG5cbnZhciBDQU5WQVNfQ0xBU1MgPSBvYmplY3ROYW1lKCdIVE1MQ2FudmFzRWxlbWVudCcpXG52YXIgT0ZGU0NSRUVOQ0FOVkFTX0NMQVNTID0gb2JqZWN0TmFtZSgnT2Zmc2NyZWVuQ2FudmFzJylcbnZhciBDT05URVhUMkRfQ0xBU1MgPSBvYmplY3ROYW1lKCdDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQnKVxudmFyIEJJVE1BUF9DTEFTUyA9IG9iamVjdE5hbWUoJ0ltYWdlQml0bWFwJylcbnZhciBJTUFHRV9DTEFTUyA9IG9iamVjdE5hbWUoJ0hUTUxJbWFnZUVsZW1lbnQnKVxudmFyIFZJREVPX0NMQVNTID0gb2JqZWN0TmFtZSgnSFRNTFZpZGVvRWxlbWVudCcpXG5cbnZhciBQSVhFTF9DTEFTU0VTID0gT2JqZWN0LmtleXMoYXJyYXlUeXBlcykuY29uY2F0KFtcbiAgQ0FOVkFTX0NMQVNTLFxuICBPRkZTQ1JFRU5DQU5WQVNfQ0xBU1MsXG4gIENPTlRFWFQyRF9DTEFTUyxcbiAgQklUTUFQX0NMQVNTLFxuICBJTUFHRV9DTEFTUyxcbiAgVklERU9fQ0xBU1Ncbl0pXG5cbi8vIGZvciBldmVyeSB0ZXh0dXJlIHR5cGUsIHN0b3JlXG4vLyB0aGUgc2l6ZSBpbiBieXRlcy5cbnZhciBUWVBFX1NJWkVTID0gW11cblRZUEVfU0laRVNbR0xfVU5TSUdORURfQllURSQ1XSA9IDFcblRZUEVfU0laRVNbR0xfRkxPQVQkNF0gPSA0XG5UWVBFX1NJWkVTW0dMX0hBTEZfRkxPQVRfT0VTJDFdID0gMlxuXG5UWVBFX1NJWkVTW0dMX1VOU0lHTkVEX1NIT1JUJDNdID0gMlxuVFlQRV9TSVpFU1tHTF9VTlNJR05FRF9JTlQkM10gPSA0XG5cbnZhciBGT1JNQVRfU0laRVNfU1BFQ0lBTCA9IFtdXG5GT1JNQVRfU0laRVNfU1BFQ0lBTFtHTF9SR0JBNF0gPSAyXG5GT1JNQVRfU0laRVNfU1BFQ0lBTFtHTF9SR0I1X0ExXSA9IDJcbkZPUk1BVF9TSVpFU19TUEVDSUFMW0dMX1JHQjU2NV0gPSAyXG5GT1JNQVRfU0laRVNfU1BFQ0lBTFtHTF9ERVBUSF9TVEVOQ0lMXSA9IDRcblxuRk9STUFUX1NJWkVTX1NQRUNJQUxbR0xfQ09NUFJFU1NFRF9SR0JfUzNUQ19EWFQxX0VYVF0gPSAwLjVcbkZPUk1BVF9TSVpFU19TUEVDSUFMW0dMX0NPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDFfRVhUXSA9IDAuNVxuRk9STUFUX1NJWkVTX1NQRUNJQUxbR0xfQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUM19FWFRdID0gMVxuRk9STUFUX1NJWkVTX1NQRUNJQUxbR0xfQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUNV9FWFRdID0gMVxuXG5GT1JNQVRfU0laRVNfU1BFQ0lBTFtHTF9DT01QUkVTU0VEX1JHQl9BVENfV0VCR0xdID0gMC41XG5GT1JNQVRfU0laRVNfU1BFQ0lBTFtHTF9DT01QUkVTU0VEX1JHQkFfQVRDX0VYUExJQ0lUX0FMUEhBX1dFQkdMXSA9IDFcbkZPUk1BVF9TSVpFU19TUEVDSUFMW0dMX0NPTVBSRVNTRURfUkdCQV9BVENfSU5URVJQT0xBVEVEX0FMUEhBX1dFQkdMXSA9IDFcblxuRk9STUFUX1NJWkVTX1NQRUNJQUxbR0xfQ09NUFJFU1NFRF9SR0JfUFZSVENfNEJQUFYxX0lNR10gPSAwLjVcbkZPUk1BVF9TSVpFU19TUEVDSUFMW0dMX0NPTVBSRVNTRURfUkdCX1BWUlRDXzJCUFBWMV9JTUddID0gMC4yNVxuRk9STUFUX1NJWkVTX1NQRUNJQUxbR0xfQ09NUFJFU1NFRF9SR0JBX1BWUlRDXzRCUFBWMV9JTUddID0gMC41XG5GT1JNQVRfU0laRVNfU1BFQ0lBTFtHTF9DT01QUkVTU0VEX1JHQkFfUFZSVENfMkJQUFYxX0lNR10gPSAwLjI1XG5cbkZPUk1BVF9TSVpFU19TUEVDSUFMW0dMX0NPTVBSRVNTRURfUkdCX0VUQzFfV0VCR0xdID0gMC41XG5cbmZ1bmN0aW9uIGlzTnVtZXJpY0FycmF5IChhcnIpIHtcbiAgcmV0dXJuIChcbiAgICBBcnJheS5pc0FycmF5KGFycikgJiZcbiAgICAoYXJyLmxlbmd0aCA9PT0gMCB8fFxuICAgIHR5cGVvZiBhcnJbMF0gPT09ICdudW1iZXInKSlcbn1cblxuZnVuY3Rpb24gaXNSZWN0QXJyYXkgKGFycikge1xuICBpZiAoIUFycmF5LmlzQXJyYXkoYXJyKSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG4gIHZhciB3aWR0aCA9IGFyci5sZW5ndGhcbiAgaWYgKHdpZHRoID09PSAwIHx8ICFpc0FycmF5TGlrZShhcnJbMF0pKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgcmV0dXJuIHRydWVcbn1cblxuZnVuY3Rpb24gY2xhc3NTdHJpbmcgKHgpIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh4KVxufVxuXG5mdW5jdGlvbiBpc0NhbnZhc0VsZW1lbnQgKG9iamVjdCkge1xuICByZXR1cm4gY2xhc3NTdHJpbmcob2JqZWN0KSA9PT0gQ0FOVkFTX0NMQVNTXG59XG5cbmZ1bmN0aW9uIGlzT2Zmc2NyZWVuQ2FudmFzIChvYmplY3QpIHtcbiAgcmV0dXJuIGNsYXNzU3RyaW5nKG9iamVjdCkgPT09IE9GRlNDUkVFTkNBTlZBU19DTEFTU1xufVxuXG5mdW5jdGlvbiBpc0NvbnRleHQyRCAob2JqZWN0KSB7XG4gIHJldHVybiBjbGFzc1N0cmluZyhvYmplY3QpID09PSBDT05URVhUMkRfQ0xBU1Ncbn1cblxuZnVuY3Rpb24gaXNCaXRtYXAgKG9iamVjdCkge1xuICByZXR1cm4gY2xhc3NTdHJpbmcob2JqZWN0KSA9PT0gQklUTUFQX0NMQVNTXG59XG5cbmZ1bmN0aW9uIGlzSW1hZ2VFbGVtZW50IChvYmplY3QpIHtcbiAgcmV0dXJuIGNsYXNzU3RyaW5nKG9iamVjdCkgPT09IElNQUdFX0NMQVNTXG59XG5cbmZ1bmN0aW9uIGlzVmlkZW9FbGVtZW50IChvYmplY3QpIHtcbiAgcmV0dXJuIGNsYXNzU3RyaW5nKG9iamVjdCkgPT09IFZJREVPX0NMQVNTXG59XG5cbmZ1bmN0aW9uIGlzUGl4ZWxEYXRhIChvYmplY3QpIHtcbiAgaWYgKCFvYmplY3QpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuICB2YXIgY2xhc3NOYW1lID0gY2xhc3NTdHJpbmcob2JqZWN0KVxuICBpZiAoUElYRUxfQ0xBU1NFUy5pbmRleE9mKGNsYXNzTmFtZSkgPj0gMCkge1xuICAgIHJldHVybiB0cnVlXG4gIH1cbiAgcmV0dXJuIChcbiAgICBpc051bWVyaWNBcnJheShvYmplY3QpIHx8XG4gICAgaXNSZWN0QXJyYXkob2JqZWN0KSB8fFxuICAgIGlzTkRBcnJheUxpa2Uob2JqZWN0KSlcbn1cblxuZnVuY3Rpb24gdHlwZWRBcnJheUNvZGUkMSAoZGF0YSkge1xuICByZXR1cm4gYXJyYXlUeXBlc1tPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZGF0YSldIHwgMFxufVxuXG5mdW5jdGlvbiBjb252ZXJ0RGF0YSAocmVzdWx0LCBkYXRhKSB7XG4gIHZhciBuID0gZGF0YS5sZW5ndGhcbiAgc3dpdGNoIChyZXN1bHQudHlwZSkge1xuICAgIGNhc2UgR0xfVU5TSUdORURfQllURSQ1OlxuICAgIGNhc2UgR0xfVU5TSUdORURfU0hPUlQkMzpcbiAgICBjYXNlIEdMX1VOU0lHTkVEX0lOVCQzOlxuICAgIGNhc2UgR0xfRkxPQVQkNDpcbiAgICAgIHZhciBjb252ZXJ0ZWQgPSBwb29sLmFsbG9jVHlwZShyZXN1bHQudHlwZSwgbilcbiAgICAgIGNvbnZlcnRlZC5zZXQoZGF0YSlcbiAgICAgIHJlc3VsdC5kYXRhID0gY29udmVydGVkXG4gICAgICBicmVha1xuXG4gICAgY2FzZSBHTF9IQUxGX0ZMT0FUX09FUyQxOlxuICAgICAgcmVzdWx0LmRhdGEgPSBjb252ZXJ0VG9IYWxmRmxvYXQoZGF0YSlcbiAgICAgIGJyZWFrXG5cbiAgICBkZWZhdWx0OlxuICAgICAgY2hlY2skMS5yYWlzZSgndW5zdXBwb3J0ZWQgdGV4dHVyZSB0eXBlLCBtdXN0IHNwZWNpZnkgYSB0eXBlZCBhcnJheScpXG4gIH1cbn1cblxuZnVuY3Rpb24gcHJlQ29udmVydCAoaW1hZ2UsIG4pIHtcbiAgcmV0dXJuIHBvb2wuYWxsb2NUeXBlKFxuICAgIGltYWdlLnR5cGUgPT09IEdMX0hBTEZfRkxPQVRfT0VTJDFcbiAgICAgID8gR0xfRkxPQVQkNFxuICAgICAgOiBpbWFnZS50eXBlLCBuKVxufVxuXG5mdW5jdGlvbiBwb3N0Q29udmVydCAoaW1hZ2UsIGRhdGEpIHtcbiAgaWYgKGltYWdlLnR5cGUgPT09IEdMX0hBTEZfRkxPQVRfT0VTJDEpIHtcbiAgICBpbWFnZS5kYXRhID0gY29udmVydFRvSGFsZkZsb2F0KGRhdGEpXG4gICAgcG9vbC5mcmVlVHlwZShkYXRhKVxuICB9IGVsc2Uge1xuICAgIGltYWdlLmRhdGEgPSBkYXRhXG4gIH1cbn1cblxuZnVuY3Rpb24gdHJhbnNwb3NlRGF0YSAoaW1hZ2UsIGFycmF5LCBzdHJpZGVYLCBzdHJpZGVZLCBzdHJpZGVDLCBvZmZzZXQpIHtcbiAgdmFyIHcgPSBpbWFnZS53aWR0aFxuICB2YXIgaCA9IGltYWdlLmhlaWdodFxuICB2YXIgYyA9IGltYWdlLmNoYW5uZWxzXG4gIHZhciBuID0gdyAqIGggKiBjXG4gIHZhciBkYXRhID0gcHJlQ29udmVydChpbWFnZSwgbilcblxuICB2YXIgcCA9IDBcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBoOyArK2kpIHtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IHc7ICsraikge1xuICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBjOyArK2spIHtcbiAgICAgICAgZGF0YVtwKytdID0gYXJyYXlbc3RyaWRlWCAqIGogKyBzdHJpZGVZICogaSArIHN0cmlkZUMgKiBrICsgb2Zmc2V0XVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHBvc3RDb252ZXJ0KGltYWdlLCBkYXRhKVxufVxuXG5mdW5jdGlvbiBnZXRUZXh0dXJlU2l6ZSAoZm9ybWF0LCB0eXBlLCB3aWR0aCwgaGVpZ2h0LCBpc01pcG1hcCwgaXNDdWJlKSB7XG4gIHZhciBzXG4gIGlmICh0eXBlb2YgRk9STUFUX1NJWkVTX1NQRUNJQUxbZm9ybWF0XSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAvLyB3ZSBoYXZlIGEgc3BlY2lhbCBhcnJheSBmb3IgZGVhbGluZyB3aXRoIHdlaXJkIGNvbG9yIGZvcm1hdHMgc3VjaCBhcyBSR0I1QTFcbiAgICBzID0gRk9STUFUX1NJWkVTX1NQRUNJQUxbZm9ybWF0XVxuICB9IGVsc2Uge1xuICAgIHMgPSBGT1JNQVRfQ0hBTk5FTFNbZm9ybWF0XSAqIFRZUEVfU0laRVNbdHlwZV1cbiAgfVxuXG4gIGlmIChpc0N1YmUpIHtcbiAgICBzICo9IDZcbiAgfVxuXG4gIGlmIChpc01pcG1hcCkge1xuICAgIC8vIGNvbXB1dGUgdGhlIHRvdGFsIHNpemUgb2YgYWxsIHRoZSBtaXBtYXBzLlxuICAgIHZhciB0b3RhbCA9IDBcblxuICAgIHZhciB3ID0gd2lkdGhcbiAgICB3aGlsZSAodyA+PSAxKSB7XG4gICAgICAvLyB3ZSBjYW4gb25seSB1c2UgbWlwbWFwcyBvbiBhIHNxdWFyZSBpbWFnZSxcbiAgICAgIC8vIHNvIHdlIGNhbiBzaW1wbHkgdXNlIHRoZSB3aWR0aCBhbmQgaWdub3JlIHRoZSBoZWlnaHQ6XG4gICAgICB0b3RhbCArPSBzICogdyAqIHdcbiAgICAgIHcgLz0gMlxuICAgIH1cbiAgICByZXR1cm4gdG90YWxcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gcyAqIHdpZHRoICogaGVpZ2h0XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlVGV4dHVyZVNldCAoXG4gIGdsLCBleHRlbnNpb25zLCBsaW1pdHMsIHJlZ2xQb2xsLCBjb250ZXh0U3RhdGUsIHN0YXRzLCBjb25maWcpIHtcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBJbml0aWFsaXplIGNvbnN0YW50cyBhbmQgcGFyYW1ldGVyIHRhYmxlcyBoZXJlXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgdmFyIG1pcG1hcEhpbnQgPSB7XG4gICAgXCJkb24ndCBjYXJlXCI6IEdMX0RPTlRfQ0FSRSxcbiAgICAnZG9udCBjYXJlJzogR0xfRE9OVF9DQVJFLFxuICAgICduaWNlJzogR0xfTklDRVNULFxuICAgICdmYXN0JzogR0xfRkFTVEVTVFxuICB9XG5cbiAgdmFyIHdyYXBNb2RlcyA9IHtcbiAgICAncmVwZWF0JzogR0xfUkVQRUFULFxuICAgICdjbGFtcCc6IEdMX0NMQU1QX1RPX0VER0UkMSxcbiAgICAnbWlycm9yJzogR0xfTUlSUk9SRURfUkVQRUFUXG4gIH1cblxuICB2YXIgbWFnRmlsdGVycyA9IHtcbiAgICAnbmVhcmVzdCc6IEdMX05FQVJFU1QkMSxcbiAgICAnbGluZWFyJzogR0xfTElORUFSXG4gIH1cblxuICB2YXIgbWluRmlsdGVycyA9IGV4dGVuZCh7XG4gICAgJ21pcG1hcCc6IEdMX0xJTkVBUl9NSVBNQVBfTElORUFSJDEsXG4gICAgJ25lYXJlc3QgbWlwbWFwIG5lYXJlc3QnOiBHTF9ORUFSRVNUX01JUE1BUF9ORUFSRVNUJDEsXG4gICAgJ2xpbmVhciBtaXBtYXAgbmVhcmVzdCc6IEdMX0xJTkVBUl9NSVBNQVBfTkVBUkVTVCQxLFxuICAgICduZWFyZXN0IG1pcG1hcCBsaW5lYXInOiBHTF9ORUFSRVNUX01JUE1BUF9MSU5FQVIkMSxcbiAgICAnbGluZWFyIG1pcG1hcCBsaW5lYXInOiBHTF9MSU5FQVJfTUlQTUFQX0xJTkVBUiQxXG4gIH0sIG1hZ0ZpbHRlcnMpXG5cbiAgdmFyIGNvbG9yU3BhY2UgPSB7XG4gICAgJ25vbmUnOiAwLFxuICAgICdicm93c2VyJzogR0xfQlJPV1NFUl9ERUZBVUxUX1dFQkdMXG4gIH1cblxuICB2YXIgdGV4dHVyZVR5cGVzID0ge1xuICAgICd1aW50OCc6IEdMX1VOU0lHTkVEX0JZVEUkNSxcbiAgICAncmdiYTQnOiBHTF9VTlNJR05FRF9TSE9SVF80XzRfNF80JDEsXG4gICAgJ3JnYjU2NSc6IEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81JDEsXG4gICAgJ3JnYjUgYTEnOiBHTF9VTlNJR05FRF9TSE9SVF81XzVfNV8xJDFcbiAgfVxuXG4gIHZhciB0ZXh0dXJlRm9ybWF0cyA9IHtcbiAgICAnYWxwaGEnOiBHTF9BTFBIQSxcbiAgICAnbHVtaW5hbmNlJzogR0xfTFVNSU5BTkNFLFxuICAgICdsdW1pbmFuY2UgYWxwaGEnOiBHTF9MVU1JTkFOQ0VfQUxQSEEsXG4gICAgJ3JnYic6IEdMX1JHQixcbiAgICAncmdiYSc6IEdMX1JHQkEkMSxcbiAgICAncmdiYTQnOiBHTF9SR0JBNCxcbiAgICAncmdiNSBhMSc6IEdMX1JHQjVfQTEsXG4gICAgJ3JnYjU2NSc6IEdMX1JHQjU2NVxuICB9XG5cbiAgdmFyIGNvbXByZXNzZWRUZXh0dXJlRm9ybWF0cyA9IHt9XG5cbiAgaWYgKGV4dGVuc2lvbnMuZXh0X3NyZ2IpIHtcbiAgICB0ZXh0dXJlRm9ybWF0cy5zcmdiID0gR0xfU1JHQl9FWFRcbiAgICB0ZXh0dXJlRm9ybWF0cy5zcmdiYSA9IEdMX1NSR0JfQUxQSEFfRVhUXG4gIH1cblxuICBpZiAoZXh0ZW5zaW9ucy5vZXNfdGV4dHVyZV9mbG9hdCkge1xuICAgIHRleHR1cmVUeXBlcy5mbG9hdDMyID0gdGV4dHVyZVR5cGVzLmZsb2F0ID0gR0xfRkxPQVQkNFxuICB9XG5cbiAgaWYgKGV4dGVuc2lvbnMub2VzX3RleHR1cmVfaGFsZl9mbG9hdCkge1xuICAgIHRleHR1cmVUeXBlc1snZmxvYXQxNiddID0gdGV4dHVyZVR5cGVzWydoYWxmIGZsb2F0J10gPSBHTF9IQUxGX0ZMT0FUX09FUyQxXG4gIH1cblxuICBpZiAoZXh0ZW5zaW9ucy53ZWJnbF9kZXB0aF90ZXh0dXJlKSB7XG4gICAgZXh0ZW5kKHRleHR1cmVGb3JtYXRzLCB7XG4gICAgICAnZGVwdGgnOiBHTF9ERVBUSF9DT01QT05FTlQsXG4gICAgICAnZGVwdGggc3RlbmNpbCc6IEdMX0RFUFRIX1NURU5DSUxcbiAgICB9KVxuXG4gICAgZXh0ZW5kKHRleHR1cmVUeXBlcywge1xuICAgICAgJ3VpbnQxNic6IEdMX1VOU0lHTkVEX1NIT1JUJDMsXG4gICAgICAndWludDMyJzogR0xfVU5TSUdORURfSU5UJDMsXG4gICAgICAnZGVwdGggc3RlbmNpbCc6IEdMX1VOU0lHTkVEX0lOVF8yNF84X1dFQkdMJDFcbiAgICB9KVxuICB9XG5cbiAgaWYgKGV4dGVuc2lvbnMud2ViZ2xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMpIHtcbiAgICBleHRlbmQoY29tcHJlc3NlZFRleHR1cmVGb3JtYXRzLCB7XG4gICAgICAncmdiIHMzdGMgZHh0MSc6IEdMX0NPTVBSRVNTRURfUkdCX1MzVENfRFhUMV9FWFQsXG4gICAgICAncmdiYSBzM3RjIGR4dDEnOiBHTF9DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQxX0VYVCxcbiAgICAgICdyZ2JhIHMzdGMgZHh0Myc6IEdMX0NPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDNfRVhULFxuICAgICAgJ3JnYmEgczN0YyBkeHQ1JzogR0xfQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUNV9FWFRcbiAgICB9KVxuICB9XG5cbiAgaWYgKGV4dGVuc2lvbnMud2ViZ2xfY29tcHJlc3NlZF90ZXh0dXJlX2F0Yykge1xuICAgIGV4dGVuZChjb21wcmVzc2VkVGV4dHVyZUZvcm1hdHMsIHtcbiAgICAgICdyZ2IgYXRjJzogR0xfQ09NUFJFU1NFRF9SR0JfQVRDX1dFQkdMLFxuICAgICAgJ3JnYmEgYXRjIGV4cGxpY2l0IGFscGhhJzogR0xfQ09NUFJFU1NFRF9SR0JBX0FUQ19FWFBMSUNJVF9BTFBIQV9XRUJHTCxcbiAgICAgICdyZ2JhIGF0YyBpbnRlcnBvbGF0ZWQgYWxwaGEnOiBHTF9DT01QUkVTU0VEX1JHQkFfQVRDX0lOVEVSUE9MQVRFRF9BTFBIQV9XRUJHTFxuICAgIH0pXG4gIH1cblxuICBpZiAoZXh0ZW5zaW9ucy53ZWJnbF9jb21wcmVzc2VkX3RleHR1cmVfcHZydGMpIHtcbiAgICBleHRlbmQoY29tcHJlc3NlZFRleHR1cmVGb3JtYXRzLCB7XG4gICAgICAncmdiIHB2cnRjIDRicHB2MSc6IEdMX0NPTVBSRVNTRURfUkdCX1BWUlRDXzRCUFBWMV9JTUcsXG4gICAgICAncmdiIHB2cnRjIDJicHB2MSc6IEdMX0NPTVBSRVNTRURfUkdCX1BWUlRDXzJCUFBWMV9JTUcsXG4gICAgICAncmdiYSBwdnJ0YyA0YnBwdjEnOiBHTF9DT01QUkVTU0VEX1JHQkFfUFZSVENfNEJQUFYxX0lNRyxcbiAgICAgICdyZ2JhIHB2cnRjIDJicHB2MSc6IEdMX0NPTVBSRVNTRURfUkdCQV9QVlJUQ18yQlBQVjFfSU1HXG4gICAgfSlcbiAgfVxuXG4gIGlmIChleHRlbnNpb25zLndlYmdsX2NvbXByZXNzZWRfdGV4dHVyZV9ldGMxKSB7XG4gICAgY29tcHJlc3NlZFRleHR1cmVGb3JtYXRzWydyZ2IgZXRjMSddID0gR0xfQ09NUFJFU1NFRF9SR0JfRVRDMV9XRUJHTFxuICB9XG5cbiAgLy8gQ29weSBvdmVyIGFsbCB0ZXh0dXJlIGZvcm1hdHNcbiAgdmFyIHN1cHBvcnRlZENvbXByZXNzZWRGb3JtYXRzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoXG4gICAgZ2wuZ2V0UGFyYW1ldGVyKEdMX0NPTVBSRVNTRURfVEVYVFVSRV9GT1JNQVRTKSlcbiAgT2JqZWN0LmtleXMoY29tcHJlc3NlZFRleHR1cmVGb3JtYXRzKS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgdmFyIGZvcm1hdCA9IGNvbXByZXNzZWRUZXh0dXJlRm9ybWF0c1tuYW1lXVxuICAgIGlmIChzdXBwb3J0ZWRDb21wcmVzc2VkRm9ybWF0cy5pbmRleE9mKGZvcm1hdCkgPj0gMCkge1xuICAgICAgdGV4dHVyZUZvcm1hdHNbbmFtZV0gPSBmb3JtYXRcbiAgICB9XG4gIH0pXG5cbiAgdmFyIHN1cHBvcnRlZEZvcm1hdHMgPSBPYmplY3Qua2V5cyh0ZXh0dXJlRm9ybWF0cylcbiAgbGltaXRzLnRleHR1cmVGb3JtYXRzID0gc3VwcG9ydGVkRm9ybWF0c1xuXG4gIC8vIGFzc29jaWF0ZSB3aXRoIGV2ZXJ5IGZvcm1hdCBzdHJpbmcgaXRzXG4gIC8vIGNvcnJlc3BvbmRpbmcgR0wtdmFsdWUuXG4gIHZhciB0ZXh0dXJlRm9ybWF0c0ludmVydCA9IFtdXG4gIE9iamVjdC5rZXlzKHRleHR1cmVGb3JtYXRzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICB2YXIgdmFsID0gdGV4dHVyZUZvcm1hdHNba2V5XVxuICAgIHRleHR1cmVGb3JtYXRzSW52ZXJ0W3ZhbF0gPSBrZXlcbiAgfSlcblxuICAvLyBhc3NvY2lhdGUgd2l0aCBldmVyeSB0eXBlIHN0cmluZyBpdHNcbiAgLy8gY29ycmVzcG9uZGluZyBHTC12YWx1ZS5cbiAgdmFyIHRleHR1cmVUeXBlc0ludmVydCA9IFtdXG4gIE9iamVjdC5rZXlzKHRleHR1cmVUeXBlcykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgdmFyIHZhbCA9IHRleHR1cmVUeXBlc1trZXldXG4gICAgdGV4dHVyZVR5cGVzSW52ZXJ0W3ZhbF0gPSBrZXlcbiAgfSlcblxuICB2YXIgbWFnRmlsdGVyc0ludmVydCA9IFtdXG4gIE9iamVjdC5rZXlzKG1hZ0ZpbHRlcnMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgIHZhciB2YWwgPSBtYWdGaWx0ZXJzW2tleV1cbiAgICBtYWdGaWx0ZXJzSW52ZXJ0W3ZhbF0gPSBrZXlcbiAgfSlcblxuICB2YXIgbWluRmlsdGVyc0ludmVydCA9IFtdXG4gIE9iamVjdC5rZXlzKG1pbkZpbHRlcnMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgIHZhciB2YWwgPSBtaW5GaWx0ZXJzW2tleV1cbiAgICBtaW5GaWx0ZXJzSW52ZXJ0W3ZhbF0gPSBrZXlcbiAgfSlcblxuICB2YXIgd3JhcE1vZGVzSW52ZXJ0ID0gW11cbiAgT2JqZWN0LmtleXMod3JhcE1vZGVzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICB2YXIgdmFsID0gd3JhcE1vZGVzW2tleV1cbiAgICB3cmFwTW9kZXNJbnZlcnRbdmFsXSA9IGtleVxuICB9KVxuXG4gIC8vIGNvbG9yRm9ybWF0c1tdIGdpdmVzIHRoZSBmb3JtYXQgKGNoYW5uZWxzKSBhc3NvY2lhdGVkIHRvIGFuXG4gIC8vIGludGVybmFsZm9ybWF0XG4gIHZhciBjb2xvckZvcm1hdHMgPSBzdXBwb3J0ZWRGb3JtYXRzLnJlZHVjZShmdW5jdGlvbiAoY29sb3IsIGtleSkge1xuICAgIHZhciBnbGVudW0gPSB0ZXh0dXJlRm9ybWF0c1trZXldXG4gICAgaWYgKGdsZW51bSA9PT0gR0xfTFVNSU5BTkNFIHx8XG4gICAgICAgIGdsZW51bSA9PT0gR0xfQUxQSEEgfHxcbiAgICAgICAgZ2xlbnVtID09PSBHTF9MVU1JTkFOQ0UgfHxcbiAgICAgICAgZ2xlbnVtID09PSBHTF9MVU1JTkFOQ0VfQUxQSEEgfHxcbiAgICAgICAgZ2xlbnVtID09PSBHTF9ERVBUSF9DT01QT05FTlQgfHxcbiAgICAgICAgZ2xlbnVtID09PSBHTF9ERVBUSF9TVEVOQ0lMIHx8XG4gICAgICAgIChleHRlbnNpb25zLmV4dF9zcmdiICYmXG4gICAgICAgICAgICAgICAgKGdsZW51bSA9PT0gR0xfU1JHQl9FWFQgfHxcbiAgICAgICAgICAgICAgICAgZ2xlbnVtID09PSBHTF9TUkdCX0FMUEhBX0VYVCkpKSB7XG4gICAgICBjb2xvcltnbGVudW1dID0gZ2xlbnVtXG4gICAgfSBlbHNlIGlmIChnbGVudW0gPT09IEdMX1JHQjVfQTEgfHwga2V5LmluZGV4T2YoJ3JnYmEnKSA+PSAwKSB7XG4gICAgICBjb2xvcltnbGVudW1dID0gR0xfUkdCQSQxXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbG9yW2dsZW51bV0gPSBHTF9SR0JcbiAgICB9XG4gICAgcmV0dXJuIGNvbG9yXG4gIH0sIHt9KVxuXG4gIGZ1bmN0aW9uIFRleEZsYWdzICgpIHtcbiAgICAvLyBmb3JtYXQgaW5mb1xuICAgIHRoaXMuaW50ZXJuYWxmb3JtYXQgPSBHTF9SR0JBJDFcbiAgICB0aGlzLmZvcm1hdCA9IEdMX1JHQkEkMVxuICAgIHRoaXMudHlwZSA9IEdMX1VOU0lHTkVEX0JZVEUkNVxuICAgIHRoaXMuY29tcHJlc3NlZCA9IGZhbHNlXG5cbiAgICAvLyBwaXhlbCBzdG9yYWdlXG4gICAgdGhpcy5wcmVtdWx0aXBseUFscGhhID0gZmFsc2VcbiAgICB0aGlzLmZsaXBZID0gZmFsc2VcbiAgICB0aGlzLnVucGFja0FsaWdubWVudCA9IDFcbiAgICB0aGlzLmNvbG9yU3BhY2UgPSBHTF9CUk9XU0VSX0RFRkFVTFRfV0VCR0xcblxuICAgIC8vIHNoYXBlIGluZm9cbiAgICB0aGlzLndpZHRoID0gMFxuICAgIHRoaXMuaGVpZ2h0ID0gMFxuICAgIHRoaXMuY2hhbm5lbHMgPSAwXG4gIH1cblxuICBmdW5jdGlvbiBjb3B5RmxhZ3MgKHJlc3VsdCwgb3RoZXIpIHtcbiAgICByZXN1bHQuaW50ZXJuYWxmb3JtYXQgPSBvdGhlci5pbnRlcm5hbGZvcm1hdFxuICAgIHJlc3VsdC5mb3JtYXQgPSBvdGhlci5mb3JtYXRcbiAgICByZXN1bHQudHlwZSA9IG90aGVyLnR5cGVcbiAgICByZXN1bHQuY29tcHJlc3NlZCA9IG90aGVyLmNvbXByZXNzZWRcblxuICAgIHJlc3VsdC5wcmVtdWx0aXBseUFscGhhID0gb3RoZXIucHJlbXVsdGlwbHlBbHBoYVxuICAgIHJlc3VsdC5mbGlwWSA9IG90aGVyLmZsaXBZXG4gICAgcmVzdWx0LnVucGFja0FsaWdubWVudCA9IG90aGVyLnVucGFja0FsaWdubWVudFxuICAgIHJlc3VsdC5jb2xvclNwYWNlID0gb3RoZXIuY29sb3JTcGFjZVxuXG4gICAgcmVzdWx0LndpZHRoID0gb3RoZXIud2lkdGhcbiAgICByZXN1bHQuaGVpZ2h0ID0gb3RoZXIuaGVpZ2h0XG4gICAgcmVzdWx0LmNoYW5uZWxzID0gb3RoZXIuY2hhbm5lbHNcbiAgfVxuXG4gIGZ1bmN0aW9uIHBhcnNlRmxhZ3MgKGZsYWdzLCBvcHRpb25zKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zICE9PSAnb2JqZWN0JyB8fCAhb3B0aW9ucykge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKCdwcmVtdWx0aXBseUFscGhhJyBpbiBvcHRpb25zKSB7XG4gICAgICBjaGVjayQxLnR5cGUob3B0aW9ucy5wcmVtdWx0aXBseUFscGhhLCAnYm9vbGVhbicsXG4gICAgICAgICdpbnZhbGlkIHByZW11bHRpcGx5QWxwaGEnKVxuICAgICAgZmxhZ3MucHJlbXVsdGlwbHlBbHBoYSA9IG9wdGlvbnMucHJlbXVsdGlwbHlBbHBoYVxuICAgIH1cblxuICAgIGlmICgnZmxpcFknIGluIG9wdGlvbnMpIHtcbiAgICAgIGNoZWNrJDEudHlwZShvcHRpb25zLmZsaXBZLCAnYm9vbGVhbicsXG4gICAgICAgICdpbnZhbGlkIHRleHR1cmUgZmxpcCcpXG4gICAgICBmbGFncy5mbGlwWSA9IG9wdGlvbnMuZmxpcFlcbiAgICB9XG5cbiAgICBpZiAoJ2FsaWdubWVudCcgaW4gb3B0aW9ucykge1xuICAgICAgY2hlY2skMS5vbmVPZihvcHRpb25zLmFsaWdubWVudCwgWzEsIDIsIDQsIDhdLFxuICAgICAgICAnaW52YWxpZCB0ZXh0dXJlIHVucGFjayBhbGlnbm1lbnQnKVxuICAgICAgZmxhZ3MudW5wYWNrQWxpZ25tZW50ID0gb3B0aW9ucy5hbGlnbm1lbnRcbiAgICB9XG5cbiAgICBpZiAoJ2NvbG9yU3BhY2UnIGluIG9wdGlvbnMpIHtcbiAgICAgIGNoZWNrJDEucGFyYW1ldGVyKG9wdGlvbnMuY29sb3JTcGFjZSwgY29sb3JTcGFjZSxcbiAgICAgICAgJ2ludmFsaWQgY29sb3JTcGFjZScpXG4gICAgICBmbGFncy5jb2xvclNwYWNlID0gY29sb3JTcGFjZVtvcHRpb25zLmNvbG9yU3BhY2VdXG4gICAgfVxuXG4gICAgaWYgKCd0eXBlJyBpbiBvcHRpb25zKSB7XG4gICAgICB2YXIgdHlwZSA9IG9wdGlvbnMudHlwZVxuICAgICAgY2hlY2skMShleHRlbnNpb25zLm9lc190ZXh0dXJlX2Zsb2F0IHx8XG4gICAgICAgICEodHlwZSA9PT0gJ2Zsb2F0JyB8fCB0eXBlID09PSAnZmxvYXQzMicpLFxuICAgICAgJ3lvdSBtdXN0IGVuYWJsZSB0aGUgT0VTX3RleHR1cmVfZmxvYXQgZXh0ZW5zaW9uIGluIG9yZGVyIHRvIHVzZSBmbG9hdGluZyBwb2ludCB0ZXh0dXJlcy4nKVxuICAgICAgY2hlY2skMShleHRlbnNpb25zLm9lc190ZXh0dXJlX2hhbGZfZmxvYXQgfHxcbiAgICAgICAgISh0eXBlID09PSAnaGFsZiBmbG9hdCcgfHwgdHlwZSA9PT0gJ2Zsb2F0MTYnKSxcbiAgICAgICd5b3UgbXVzdCBlbmFibGUgdGhlIE9FU190ZXh0dXJlX2hhbGZfZmxvYXQgZXh0ZW5zaW9uIGluIG9yZGVyIHRvIHVzZSAxNi1iaXQgZmxvYXRpbmcgcG9pbnQgdGV4dHVyZXMuJylcbiAgICAgIGNoZWNrJDEoZXh0ZW5zaW9ucy53ZWJnbF9kZXB0aF90ZXh0dXJlIHx8XG4gICAgICAgICEodHlwZSA9PT0gJ3VpbnQxNicgfHwgdHlwZSA9PT0gJ3VpbnQzMicgfHwgdHlwZSA9PT0gJ2RlcHRoIHN0ZW5jaWwnKSxcbiAgICAgICd5b3UgbXVzdCBlbmFibGUgdGhlIFdFQkdMX2RlcHRoX3RleHR1cmUgZXh0ZW5zaW9uIGluIG9yZGVyIHRvIHVzZSBkZXB0aC9zdGVuY2lsIHRleHR1cmVzLicpXG4gICAgICBjaGVjayQxLnBhcmFtZXRlcih0eXBlLCB0ZXh0dXJlVHlwZXMsXG4gICAgICAgICdpbnZhbGlkIHRleHR1cmUgdHlwZScpXG4gICAgICBmbGFncy50eXBlID0gdGV4dHVyZVR5cGVzW3R5cGVdXG4gICAgfVxuXG4gICAgdmFyIHcgPSBmbGFncy53aWR0aFxuICAgIHZhciBoID0gZmxhZ3MuaGVpZ2h0XG4gICAgdmFyIGMgPSBmbGFncy5jaGFubmVsc1xuICAgIHZhciBoYXNDaGFubmVscyA9IGZhbHNlXG4gICAgaWYgKCdzaGFwZScgaW4gb3B0aW9ucykge1xuICAgICAgY2hlY2skMShBcnJheS5pc0FycmF5KG9wdGlvbnMuc2hhcGUpICYmIG9wdGlvbnMuc2hhcGUubGVuZ3RoID49IDIsXG4gICAgICAgICdzaGFwZSBtdXN0IGJlIGFuIGFycmF5JylcbiAgICAgIHcgPSBvcHRpb25zLnNoYXBlWzBdXG4gICAgICBoID0gb3B0aW9ucy5zaGFwZVsxXVxuICAgICAgaWYgKG9wdGlvbnMuc2hhcGUubGVuZ3RoID09PSAzKSB7XG4gICAgICAgIGMgPSBvcHRpb25zLnNoYXBlWzJdXG4gICAgICAgIGNoZWNrJDEoYyA+IDAgJiYgYyA8PSA0LCAnaW52YWxpZCBudW1iZXIgb2YgY2hhbm5lbHMnKVxuICAgICAgICBoYXNDaGFubmVscyA9IHRydWVcbiAgICAgIH1cbiAgICAgIGNoZWNrJDEodyA+PSAwICYmIHcgPD0gbGltaXRzLm1heFRleHR1cmVTaXplLCAnaW52YWxpZCB3aWR0aCcpXG4gICAgICBjaGVjayQxKGggPj0gMCAmJiBoIDw9IGxpbWl0cy5tYXhUZXh0dXJlU2l6ZSwgJ2ludmFsaWQgaGVpZ2h0JylcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCdyYWRpdXMnIGluIG9wdGlvbnMpIHtcbiAgICAgICAgdyA9IGggPSBvcHRpb25zLnJhZGl1c1xuICAgICAgICBjaGVjayQxKHcgPj0gMCAmJiB3IDw9IGxpbWl0cy5tYXhUZXh0dXJlU2l6ZSwgJ2ludmFsaWQgcmFkaXVzJylcbiAgICAgIH1cbiAgICAgIGlmICgnd2lkdGgnIGluIG9wdGlvbnMpIHtcbiAgICAgICAgdyA9IG9wdGlvbnMud2lkdGhcbiAgICAgICAgY2hlY2skMSh3ID49IDAgJiYgdyA8PSBsaW1pdHMubWF4VGV4dHVyZVNpemUsICdpbnZhbGlkIHdpZHRoJylcbiAgICAgIH1cbiAgICAgIGlmICgnaGVpZ2h0JyBpbiBvcHRpb25zKSB7XG4gICAgICAgIGggPSBvcHRpb25zLmhlaWdodFxuICAgICAgICBjaGVjayQxKGggPj0gMCAmJiBoIDw9IGxpbWl0cy5tYXhUZXh0dXJlU2l6ZSwgJ2ludmFsaWQgaGVpZ2h0JylcbiAgICAgIH1cbiAgICAgIGlmICgnY2hhbm5lbHMnIGluIG9wdGlvbnMpIHtcbiAgICAgICAgYyA9IG9wdGlvbnMuY2hhbm5lbHNcbiAgICAgICAgY2hlY2skMShjID4gMCAmJiBjIDw9IDQsICdpbnZhbGlkIG51bWJlciBvZiBjaGFubmVscycpXG4gICAgICAgIGhhc0NoYW5uZWxzID0gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICBmbGFncy53aWR0aCA9IHcgfCAwXG4gICAgZmxhZ3MuaGVpZ2h0ID0gaCB8IDBcbiAgICBmbGFncy5jaGFubmVscyA9IGMgfCAwXG5cbiAgICB2YXIgaGFzRm9ybWF0ID0gZmFsc2VcbiAgICBpZiAoJ2Zvcm1hdCcgaW4gb3B0aW9ucykge1xuICAgICAgdmFyIGZvcm1hdFN0ciA9IG9wdGlvbnMuZm9ybWF0XG4gICAgICBjaGVjayQxKGV4dGVuc2lvbnMud2ViZ2xfZGVwdGhfdGV4dHVyZSB8fFxuICAgICAgICAhKGZvcm1hdFN0ciA9PT0gJ2RlcHRoJyB8fCBmb3JtYXRTdHIgPT09ICdkZXB0aCBzdGVuY2lsJyksXG4gICAgICAneW91IG11c3QgZW5hYmxlIHRoZSBXRUJHTF9kZXB0aF90ZXh0dXJlIGV4dGVuc2lvbiBpbiBvcmRlciB0byB1c2UgZGVwdGgvc3RlbmNpbCB0ZXh0dXJlcy4nKVxuICAgICAgY2hlY2skMS5wYXJhbWV0ZXIoZm9ybWF0U3RyLCB0ZXh0dXJlRm9ybWF0cyxcbiAgICAgICAgJ2ludmFsaWQgdGV4dHVyZSBmb3JtYXQnKVxuICAgICAgdmFyIGludGVybmFsZm9ybWF0ID0gZmxhZ3MuaW50ZXJuYWxmb3JtYXQgPSB0ZXh0dXJlRm9ybWF0c1tmb3JtYXRTdHJdXG4gICAgICBmbGFncy5mb3JtYXQgPSBjb2xvckZvcm1hdHNbaW50ZXJuYWxmb3JtYXRdXG4gICAgICBpZiAoZm9ybWF0U3RyIGluIHRleHR1cmVUeXBlcykge1xuICAgICAgICBpZiAoISgndHlwZScgaW4gb3B0aW9ucykpIHtcbiAgICAgICAgICBmbGFncy50eXBlID0gdGV4dHVyZVR5cGVzW2Zvcm1hdFN0cl1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGZvcm1hdFN0ciBpbiBjb21wcmVzc2VkVGV4dHVyZUZvcm1hdHMpIHtcbiAgICAgICAgZmxhZ3MuY29tcHJlc3NlZCA9IHRydWVcbiAgICAgIH1cbiAgICAgIGhhc0Zvcm1hdCA9IHRydWVcbiAgICB9XG5cbiAgICAvLyBSZWNvbmNpbGUgY2hhbm5lbHMgYW5kIGZvcm1hdFxuICAgIGlmICghaGFzQ2hhbm5lbHMgJiYgaGFzRm9ybWF0KSB7XG4gICAgICBmbGFncy5jaGFubmVscyA9IEZPUk1BVF9DSEFOTkVMU1tmbGFncy5mb3JtYXRdXG4gICAgfSBlbHNlIGlmIChoYXNDaGFubmVscyAmJiAhaGFzRm9ybWF0KSB7XG4gICAgICBpZiAoZmxhZ3MuY2hhbm5lbHMgIT09IENIQU5ORUxTX0ZPUk1BVFtmbGFncy5mb3JtYXRdKSB7XG4gICAgICAgIGZsYWdzLmZvcm1hdCA9IGZsYWdzLmludGVybmFsZm9ybWF0ID0gQ0hBTk5FTFNfRk9STUFUW2ZsYWdzLmNoYW5uZWxzXVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaGFzRm9ybWF0ICYmIGhhc0NoYW5uZWxzKSB7XG4gICAgICBjaGVjayQxKFxuICAgICAgICBmbGFncy5jaGFubmVscyA9PT0gRk9STUFUX0NIQU5ORUxTW2ZsYWdzLmZvcm1hdF0sXG4gICAgICAgICdudW1iZXIgb2YgY2hhbm5lbHMgaW5jb25zaXN0ZW50IHdpdGggc3BlY2lmaWVkIGZvcm1hdCcpXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gc2V0RmxhZ3MgKGZsYWdzKSB7XG4gICAgZ2wucGl4ZWxTdG9yZWkoR0xfVU5QQUNLX0ZMSVBfWV9XRUJHTCwgZmxhZ3MuZmxpcFkpXG4gICAgZ2wucGl4ZWxTdG9yZWkoR0xfVU5QQUNLX1BSRU1VTFRJUExZX0FMUEhBX1dFQkdMLCBmbGFncy5wcmVtdWx0aXBseUFscGhhKVxuICAgIGdsLnBpeGVsU3RvcmVpKEdMX1VOUEFDS19DT0xPUlNQQUNFX0NPTlZFUlNJT05fV0VCR0wsIGZsYWdzLmNvbG9yU3BhY2UpXG4gICAgZ2wucGl4ZWxTdG9yZWkoR0xfVU5QQUNLX0FMSUdOTUVOVCwgZmxhZ3MudW5wYWNrQWxpZ25tZW50KVxuICB9XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBUZXggaW1hZ2UgZGF0YVxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIGZ1bmN0aW9uIFRleEltYWdlICgpIHtcbiAgICBUZXhGbGFncy5jYWxsKHRoaXMpXG5cbiAgICB0aGlzLnhPZmZzZXQgPSAwXG4gICAgdGhpcy55T2Zmc2V0ID0gMFxuXG4gICAgLy8gZGF0YVxuICAgIHRoaXMuZGF0YSA9IG51bGxcbiAgICB0aGlzLm5lZWRzRnJlZSA9IGZhbHNlXG5cbiAgICAvLyBodG1sIGVsZW1lbnRcbiAgICB0aGlzLmVsZW1lbnQgPSBudWxsXG5cbiAgICAvLyBjb3B5VGV4SW1hZ2UgaW5mb1xuICAgIHRoaXMubmVlZHNDb3B5ID0gZmFsc2VcbiAgfVxuXG4gIGZ1bmN0aW9uIHBhcnNlSW1hZ2UgKGltYWdlLCBvcHRpb25zKSB7XG4gICAgdmFyIGRhdGEgPSBudWxsXG4gICAgaWYgKGlzUGl4ZWxEYXRhKG9wdGlvbnMpKSB7XG4gICAgICBkYXRhID0gb3B0aW9uc1xuICAgIH0gZWxzZSBpZiAob3B0aW9ucykge1xuICAgICAgY2hlY2skMS50eXBlKG9wdGlvbnMsICdvYmplY3QnLCAnaW52YWxpZCBwaXhlbCBkYXRhIHR5cGUnKVxuICAgICAgcGFyc2VGbGFncyhpbWFnZSwgb3B0aW9ucylcbiAgICAgIGlmICgneCcgaW4gb3B0aW9ucykge1xuICAgICAgICBpbWFnZS54T2Zmc2V0ID0gb3B0aW9ucy54IHwgMFxuICAgICAgfVxuICAgICAgaWYgKCd5JyBpbiBvcHRpb25zKSB7XG4gICAgICAgIGltYWdlLnlPZmZzZXQgPSBvcHRpb25zLnkgfCAwXG4gICAgICB9XG4gICAgICBpZiAoaXNQaXhlbERhdGEob3B0aW9ucy5kYXRhKSkge1xuICAgICAgICBkYXRhID0gb3B0aW9ucy5kYXRhXG4gICAgICB9XG4gICAgfVxuXG4gICAgY2hlY2skMShcbiAgICAgICFpbWFnZS5jb21wcmVzc2VkIHx8XG4gICAgICBkYXRhIGluc3RhbmNlb2YgVWludDhBcnJheSxcbiAgICAgICdjb21wcmVzc2VkIHRleHR1cmUgZGF0YSBtdXN0IGJlIHN0b3JlZCBpbiBhIHVpbnQ4YXJyYXknKVxuXG4gICAgaWYgKG9wdGlvbnMuY29weSkge1xuICAgICAgY2hlY2skMSghZGF0YSwgJ2NhbiBub3Qgc3BlY2lmeSBjb3B5IGFuZCBkYXRhIGZpZWxkIGZvciB0aGUgc2FtZSB0ZXh0dXJlJylcbiAgICAgIHZhciB2aWV3VyA9IGNvbnRleHRTdGF0ZS52aWV3cG9ydFdpZHRoXG4gICAgICB2YXIgdmlld0ggPSBjb250ZXh0U3RhdGUudmlld3BvcnRIZWlnaHRcbiAgICAgIGltYWdlLndpZHRoID0gaW1hZ2Uud2lkdGggfHwgKHZpZXdXIC0gaW1hZ2UueE9mZnNldClcbiAgICAgIGltYWdlLmhlaWdodCA9IGltYWdlLmhlaWdodCB8fCAodmlld0ggLSBpbWFnZS55T2Zmc2V0KVxuICAgICAgaW1hZ2UubmVlZHNDb3B5ID0gdHJ1ZVxuICAgICAgY2hlY2skMShpbWFnZS54T2Zmc2V0ID49IDAgJiYgaW1hZ2UueE9mZnNldCA8IHZpZXdXICYmXG4gICAgICAgICAgICBpbWFnZS55T2Zmc2V0ID49IDAgJiYgaW1hZ2UueU9mZnNldCA8IHZpZXdIICYmXG4gICAgICAgICAgICBpbWFnZS53aWR0aCA+IDAgJiYgaW1hZ2Uud2lkdGggPD0gdmlld1cgJiZcbiAgICAgICAgICAgIGltYWdlLmhlaWdodCA+IDAgJiYgaW1hZ2UuaGVpZ2h0IDw9IHZpZXdILFxuICAgICAgJ2NvcHkgdGV4dHVyZSByZWFkIG91dCBvZiBib3VuZHMnKVxuICAgIH0gZWxzZSBpZiAoIWRhdGEpIHtcbiAgICAgIGltYWdlLndpZHRoID0gaW1hZ2Uud2lkdGggfHwgMVxuICAgICAgaW1hZ2UuaGVpZ2h0ID0gaW1hZ2UuaGVpZ2h0IHx8IDFcbiAgICAgIGltYWdlLmNoYW5uZWxzID0gaW1hZ2UuY2hhbm5lbHMgfHwgNFxuICAgIH0gZWxzZSBpZiAoaXNUeXBlZEFycmF5KGRhdGEpKSB7XG4gICAgICBpbWFnZS5jaGFubmVscyA9IGltYWdlLmNoYW5uZWxzIHx8IDRcbiAgICAgIGltYWdlLmRhdGEgPSBkYXRhXG4gICAgICBpZiAoISgndHlwZScgaW4gb3B0aW9ucykgJiYgaW1hZ2UudHlwZSA9PT0gR0xfVU5TSUdORURfQllURSQ1KSB7XG4gICAgICAgIGltYWdlLnR5cGUgPSB0eXBlZEFycmF5Q29kZSQxKGRhdGEpXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc051bWVyaWNBcnJheShkYXRhKSkge1xuICAgICAgaW1hZ2UuY2hhbm5lbHMgPSBpbWFnZS5jaGFubmVscyB8fCA0XG4gICAgICBjb252ZXJ0RGF0YShpbWFnZSwgZGF0YSlcbiAgICAgIGltYWdlLmFsaWdubWVudCA9IDFcbiAgICAgIGltYWdlLm5lZWRzRnJlZSA9IHRydWVcbiAgICB9IGVsc2UgaWYgKGlzTkRBcnJheUxpa2UoZGF0YSkpIHtcbiAgICAgIHZhciBhcnJheSA9IGRhdGEuZGF0YVxuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGFycmF5KSAmJiBpbWFnZS50eXBlID09PSBHTF9VTlNJR05FRF9CWVRFJDUpIHtcbiAgICAgICAgaW1hZ2UudHlwZSA9IHR5cGVkQXJyYXlDb2RlJDEoYXJyYXkpXG4gICAgICB9XG4gICAgICB2YXIgc2hhcGUgPSBkYXRhLnNoYXBlXG4gICAgICB2YXIgc3RyaWRlID0gZGF0YS5zdHJpZGVcbiAgICAgIHZhciBzaGFwZVgsIHNoYXBlWSwgc2hhcGVDLCBzdHJpZGVYLCBzdHJpZGVZLCBzdHJpZGVDXG4gICAgICBpZiAoc2hhcGUubGVuZ3RoID09PSAzKSB7XG4gICAgICAgIHNoYXBlQyA9IHNoYXBlWzJdXG4gICAgICAgIHN0cmlkZUMgPSBzdHJpZGVbMl1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNoZWNrJDEoc2hhcGUubGVuZ3RoID09PSAyLCAnaW52YWxpZCBuZGFycmF5IHBpeGVsIGRhdGEsIG11c3QgYmUgMiBvciAzRCcpXG4gICAgICAgIHNoYXBlQyA9IDFcbiAgICAgICAgc3RyaWRlQyA9IDFcbiAgICAgIH1cbiAgICAgIHNoYXBlWCA9IHNoYXBlWzBdXG4gICAgICBzaGFwZVkgPSBzaGFwZVsxXVxuICAgICAgc3RyaWRlWCA9IHN0cmlkZVswXVxuICAgICAgc3RyaWRlWSA9IHN0cmlkZVsxXVxuICAgICAgaW1hZ2UuYWxpZ25tZW50ID0gMVxuICAgICAgaW1hZ2Uud2lkdGggPSBzaGFwZVhcbiAgICAgIGltYWdlLmhlaWdodCA9IHNoYXBlWVxuICAgICAgaW1hZ2UuY2hhbm5lbHMgPSBzaGFwZUNcbiAgICAgIGltYWdlLmZvcm1hdCA9IGltYWdlLmludGVybmFsZm9ybWF0ID0gQ0hBTk5FTFNfRk9STUFUW3NoYXBlQ11cbiAgICAgIGltYWdlLm5lZWRzRnJlZSA9IHRydWVcbiAgICAgIHRyYW5zcG9zZURhdGEoaW1hZ2UsIGFycmF5LCBzdHJpZGVYLCBzdHJpZGVZLCBzdHJpZGVDLCBkYXRhLm9mZnNldClcbiAgICB9IGVsc2UgaWYgKGlzQ2FudmFzRWxlbWVudChkYXRhKSB8fCBpc09mZnNjcmVlbkNhbnZhcyhkYXRhKSB8fCBpc0NvbnRleHQyRChkYXRhKSkge1xuICAgICAgaWYgKGlzQ2FudmFzRWxlbWVudChkYXRhKSB8fCBpc09mZnNjcmVlbkNhbnZhcyhkYXRhKSkge1xuICAgICAgICBpbWFnZS5lbGVtZW50ID0gZGF0YVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW1hZ2UuZWxlbWVudCA9IGRhdGEuY2FudmFzXG4gICAgICB9XG4gICAgICBpbWFnZS53aWR0aCA9IGltYWdlLmVsZW1lbnQud2lkdGhcbiAgICAgIGltYWdlLmhlaWdodCA9IGltYWdlLmVsZW1lbnQuaGVpZ2h0XG4gICAgICBpbWFnZS5jaGFubmVscyA9IDRcbiAgICB9IGVsc2UgaWYgKGlzQml0bWFwKGRhdGEpKSB7XG4gICAgICBpbWFnZS5lbGVtZW50ID0gZGF0YVxuICAgICAgaW1hZ2Uud2lkdGggPSBkYXRhLndpZHRoXG4gICAgICBpbWFnZS5oZWlnaHQgPSBkYXRhLmhlaWdodFxuICAgICAgaW1hZ2UuY2hhbm5lbHMgPSA0XG4gICAgfSBlbHNlIGlmIChpc0ltYWdlRWxlbWVudChkYXRhKSkge1xuICAgICAgaW1hZ2UuZWxlbWVudCA9IGRhdGFcbiAgICAgIGltYWdlLndpZHRoID0gZGF0YS5uYXR1cmFsV2lkdGhcbiAgICAgIGltYWdlLmhlaWdodCA9IGRhdGEubmF0dXJhbEhlaWdodFxuICAgICAgaW1hZ2UuY2hhbm5lbHMgPSA0XG4gICAgfSBlbHNlIGlmIChpc1ZpZGVvRWxlbWVudChkYXRhKSkge1xuICAgICAgaW1hZ2UuZWxlbWVudCA9IGRhdGFcbiAgICAgIGltYWdlLndpZHRoID0gZGF0YS52aWRlb1dpZHRoXG4gICAgICBpbWFnZS5oZWlnaHQgPSBkYXRhLnZpZGVvSGVpZ2h0XG4gICAgICBpbWFnZS5jaGFubmVscyA9IDRcbiAgICB9IGVsc2UgaWYgKGlzUmVjdEFycmF5KGRhdGEpKSB7XG4gICAgICB2YXIgdyA9IGltYWdlLndpZHRoIHx8IGRhdGFbMF0ubGVuZ3RoXG4gICAgICB2YXIgaCA9IGltYWdlLmhlaWdodCB8fCBkYXRhLmxlbmd0aFxuICAgICAgdmFyIGMgPSBpbWFnZS5jaGFubmVsc1xuICAgICAgaWYgKGlzQXJyYXlMaWtlKGRhdGFbMF1bMF0pKSB7XG4gICAgICAgIGMgPSBjIHx8IGRhdGFbMF1bMF0ubGVuZ3RoXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjID0gYyB8fCAxXG4gICAgICB9XG4gICAgICB2YXIgYXJyYXlTaGFwZSA9IGZsYXR0ZW5VdGlscy5zaGFwZShkYXRhKVxuICAgICAgdmFyIG4gPSAxXG4gICAgICBmb3IgKHZhciBkZCA9IDA7IGRkIDwgYXJyYXlTaGFwZS5sZW5ndGg7ICsrZGQpIHtcbiAgICAgICAgbiAqPSBhcnJheVNoYXBlW2RkXVxuICAgICAgfVxuICAgICAgdmFyIGFsbG9jRGF0YSA9IHByZUNvbnZlcnQoaW1hZ2UsIG4pXG4gICAgICBmbGF0dGVuVXRpbHMuZmxhdHRlbihkYXRhLCBhcnJheVNoYXBlLCAnJywgYWxsb2NEYXRhKVxuICAgICAgcG9zdENvbnZlcnQoaW1hZ2UsIGFsbG9jRGF0YSlcbiAgICAgIGltYWdlLmFsaWdubWVudCA9IDFcbiAgICAgIGltYWdlLndpZHRoID0gd1xuICAgICAgaW1hZ2UuaGVpZ2h0ID0gaFxuICAgICAgaW1hZ2UuY2hhbm5lbHMgPSBjXG4gICAgICBpbWFnZS5mb3JtYXQgPSBpbWFnZS5pbnRlcm5hbGZvcm1hdCA9IENIQU5ORUxTX0ZPUk1BVFtjXVxuICAgICAgaW1hZ2UubmVlZHNGcmVlID0gdHJ1ZVxuICAgIH1cblxuICAgIGlmIChpbWFnZS50eXBlID09PSBHTF9GTE9BVCQ0KSB7XG4gICAgICBjaGVjayQxKGxpbWl0cy5leHRlbnNpb25zLmluZGV4T2YoJ29lc190ZXh0dXJlX2Zsb2F0JykgPj0gMCxcbiAgICAgICAgJ29lc190ZXh0dXJlX2Zsb2F0IGV4dGVuc2lvbiBub3QgZW5hYmxlZCcpXG4gICAgfSBlbHNlIGlmIChpbWFnZS50eXBlID09PSBHTF9IQUxGX0ZMT0FUX09FUyQxKSB7XG4gICAgICBjaGVjayQxKGxpbWl0cy5leHRlbnNpb25zLmluZGV4T2YoJ29lc190ZXh0dXJlX2hhbGZfZmxvYXQnKSA+PSAwLFxuICAgICAgICAnb2VzX3RleHR1cmVfaGFsZl9mbG9hdCBleHRlbnNpb24gbm90IGVuYWJsZWQnKVxuICAgIH1cblxuICAgIC8vIGRvIGNvbXByZXNzZWQgdGV4dHVyZSAgdmFsaWRhdGlvbiBoZXJlLlxuICB9XG5cbiAgZnVuY3Rpb24gc2V0SW1hZ2UgKGluZm8sIHRhcmdldCwgbWlwbGV2ZWwpIHtcbiAgICB2YXIgZWxlbWVudCA9IGluZm8uZWxlbWVudFxuICAgIHZhciBkYXRhID0gaW5mby5kYXRhXG4gICAgdmFyIGludGVybmFsZm9ybWF0ID0gaW5mby5pbnRlcm5hbGZvcm1hdFxuICAgIHZhciBmb3JtYXQgPSBpbmZvLmZvcm1hdFxuICAgIHZhciB0eXBlID0gaW5mby50eXBlXG4gICAgdmFyIHdpZHRoID0gaW5mby53aWR0aFxuICAgIHZhciBoZWlnaHQgPSBpbmZvLmhlaWdodFxuXG4gICAgc2V0RmxhZ3MoaW5mbylcblxuICAgIGlmIChlbGVtZW50KSB7XG4gICAgICBnbC50ZXhJbWFnZTJEKHRhcmdldCwgbWlwbGV2ZWwsIGZvcm1hdCwgZm9ybWF0LCB0eXBlLCBlbGVtZW50KVxuICAgIH0gZWxzZSBpZiAoaW5mby5jb21wcmVzc2VkKSB7XG4gICAgICBnbC5jb21wcmVzc2VkVGV4SW1hZ2UyRCh0YXJnZXQsIG1pcGxldmVsLCBpbnRlcm5hbGZvcm1hdCwgd2lkdGgsIGhlaWdodCwgMCwgZGF0YSlcbiAgICB9IGVsc2UgaWYgKGluZm8ubmVlZHNDb3B5KSB7XG4gICAgICByZWdsUG9sbCgpXG4gICAgICBnbC5jb3B5VGV4SW1hZ2UyRChcbiAgICAgICAgdGFyZ2V0LCBtaXBsZXZlbCwgZm9ybWF0LCBpbmZvLnhPZmZzZXQsIGluZm8ueU9mZnNldCwgd2lkdGgsIGhlaWdodCwgMClcbiAgICB9IGVsc2Uge1xuICAgICAgZ2wudGV4SW1hZ2UyRCh0YXJnZXQsIG1pcGxldmVsLCBmb3JtYXQsIHdpZHRoLCBoZWlnaHQsIDAsIGZvcm1hdCwgdHlwZSwgZGF0YSB8fCBudWxsKVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHNldFN1YkltYWdlIChpbmZvLCB0YXJnZXQsIHgsIHksIG1pcGxldmVsKSB7XG4gICAgdmFyIGVsZW1lbnQgPSBpbmZvLmVsZW1lbnRcbiAgICB2YXIgZGF0YSA9IGluZm8uZGF0YVxuICAgIHZhciBpbnRlcm5hbGZvcm1hdCA9IGluZm8uaW50ZXJuYWxmb3JtYXRcbiAgICB2YXIgZm9ybWF0ID0gaW5mby5mb3JtYXRcbiAgICB2YXIgdHlwZSA9IGluZm8udHlwZVxuICAgIHZhciB3aWR0aCA9IGluZm8ud2lkdGhcbiAgICB2YXIgaGVpZ2h0ID0gaW5mby5oZWlnaHRcblxuICAgIHNldEZsYWdzKGluZm8pXG5cbiAgICBpZiAoZWxlbWVudCkge1xuICAgICAgZ2wudGV4U3ViSW1hZ2UyRChcbiAgICAgICAgdGFyZ2V0LCBtaXBsZXZlbCwgeCwgeSwgZm9ybWF0LCB0eXBlLCBlbGVtZW50KVxuICAgIH0gZWxzZSBpZiAoaW5mby5jb21wcmVzc2VkKSB7XG4gICAgICBnbC5jb21wcmVzc2VkVGV4U3ViSW1hZ2UyRChcbiAgICAgICAgdGFyZ2V0LCBtaXBsZXZlbCwgeCwgeSwgaW50ZXJuYWxmb3JtYXQsIHdpZHRoLCBoZWlnaHQsIGRhdGEpXG4gICAgfSBlbHNlIGlmIChpbmZvLm5lZWRzQ29weSkge1xuICAgICAgcmVnbFBvbGwoKVxuICAgICAgZ2wuY29weVRleFN1YkltYWdlMkQoXG4gICAgICAgIHRhcmdldCwgbWlwbGV2ZWwsIHgsIHksIGluZm8ueE9mZnNldCwgaW5mby55T2Zmc2V0LCB3aWR0aCwgaGVpZ2h0KVxuICAgIH0gZWxzZSB7XG4gICAgICBnbC50ZXhTdWJJbWFnZTJEKFxuICAgICAgICB0YXJnZXQsIG1pcGxldmVsLCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHR5cGUsIGRhdGEpXG4gICAgfVxuICB9XG5cbiAgLy8gdGV4SW1hZ2UgcG9vbFxuICB2YXIgaW1hZ2VQb29sID0gW11cblxuICBmdW5jdGlvbiBhbGxvY0ltYWdlICgpIHtcbiAgICByZXR1cm4gaW1hZ2VQb29sLnBvcCgpIHx8IG5ldyBUZXhJbWFnZSgpXG4gIH1cblxuICBmdW5jdGlvbiBmcmVlSW1hZ2UgKGltYWdlKSB7XG4gICAgaWYgKGltYWdlLm5lZWRzRnJlZSkge1xuICAgICAgcG9vbC5mcmVlVHlwZShpbWFnZS5kYXRhKVxuICAgIH1cbiAgICBUZXhJbWFnZS5jYWxsKGltYWdlKVxuICAgIGltYWdlUG9vbC5wdXNoKGltYWdlKVxuICB9XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBNaXAgbWFwXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgZnVuY3Rpb24gTWlwTWFwICgpIHtcbiAgICBUZXhGbGFncy5jYWxsKHRoaXMpXG5cbiAgICB0aGlzLmdlbk1pcG1hcHMgPSBmYWxzZVxuICAgIHRoaXMubWlwbWFwSGludCA9IEdMX0RPTlRfQ0FSRVxuICAgIHRoaXMubWlwbWFzayA9IDBcbiAgICB0aGlzLmltYWdlcyA9IEFycmF5KDE2KVxuICB9XG5cbiAgZnVuY3Rpb24gcGFyc2VNaXBNYXBGcm9tU2hhcGUgKG1pcG1hcCwgd2lkdGgsIGhlaWdodCkge1xuICAgIHZhciBpbWcgPSBtaXBtYXAuaW1hZ2VzWzBdID0gYWxsb2NJbWFnZSgpXG4gICAgbWlwbWFwLm1pcG1hc2sgPSAxXG4gICAgaW1nLndpZHRoID0gbWlwbWFwLndpZHRoID0gd2lkdGhcbiAgICBpbWcuaGVpZ2h0ID0gbWlwbWFwLmhlaWdodCA9IGhlaWdodFxuICAgIGltZy5jaGFubmVscyA9IG1pcG1hcC5jaGFubmVscyA9IDRcbiAgfVxuXG4gIGZ1bmN0aW9uIHBhcnNlTWlwTWFwRnJvbU9iamVjdCAobWlwbWFwLCBvcHRpb25zKSB7XG4gICAgdmFyIGltZ0RhdGEgPSBudWxsXG4gICAgaWYgKGlzUGl4ZWxEYXRhKG9wdGlvbnMpKSB7XG4gICAgICBpbWdEYXRhID0gbWlwbWFwLmltYWdlc1swXSA9IGFsbG9jSW1hZ2UoKVxuICAgICAgY29weUZsYWdzKGltZ0RhdGEsIG1pcG1hcClcbiAgICAgIHBhcnNlSW1hZ2UoaW1nRGF0YSwgb3B0aW9ucylcbiAgICAgIG1pcG1hcC5taXBtYXNrID0gMVxuICAgIH0gZWxzZSB7XG4gICAgICBwYXJzZUZsYWdzKG1pcG1hcCwgb3B0aW9ucylcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KG9wdGlvbnMubWlwbWFwKSkge1xuICAgICAgICB2YXIgbWlwRGF0YSA9IG9wdGlvbnMubWlwbWFwXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWlwRGF0YS5sZW5ndGg7ICsraSkge1xuICAgICAgICAgIGltZ0RhdGEgPSBtaXBtYXAuaW1hZ2VzW2ldID0gYWxsb2NJbWFnZSgpXG4gICAgICAgICAgY29weUZsYWdzKGltZ0RhdGEsIG1pcG1hcClcbiAgICAgICAgICBpbWdEYXRhLndpZHRoID4+PSBpXG4gICAgICAgICAgaW1nRGF0YS5oZWlnaHQgPj49IGlcbiAgICAgICAgICBwYXJzZUltYWdlKGltZ0RhdGEsIG1pcERhdGFbaV0pXG4gICAgICAgICAgbWlwbWFwLm1pcG1hc2sgfD0gKDEgPDwgaSlcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW1nRGF0YSA9IG1pcG1hcC5pbWFnZXNbMF0gPSBhbGxvY0ltYWdlKClcbiAgICAgICAgY29weUZsYWdzKGltZ0RhdGEsIG1pcG1hcClcbiAgICAgICAgcGFyc2VJbWFnZShpbWdEYXRhLCBvcHRpb25zKVxuICAgICAgICBtaXBtYXAubWlwbWFzayA9IDFcbiAgICAgIH1cbiAgICB9XG4gICAgY29weUZsYWdzKG1pcG1hcCwgbWlwbWFwLmltYWdlc1swXSlcblxuICAgIC8vIEZvciB0ZXh0dXJlcyBvZiB0aGUgY29tcHJlc3NlZCBmb3JtYXQgV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGNcbiAgICAvLyB3ZSBtdXN0IGhhdmUgdGhhdFxuICAgIC8vXG4gICAgLy8gXCJXaGVuIGxldmVsIGVxdWFscyB6ZXJvIHdpZHRoIGFuZCBoZWlnaHQgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuXG4gICAgLy8gV2hlbiBsZXZlbCBpcyBncmVhdGVyIHRoYW4gMCB3aWR0aCBhbmQgaGVpZ2h0IG11c3QgYmUgMCwgMSwgMiBvciBhIG11bHRpcGxlIG9mIDQuIFwiXG4gICAgLy9cbiAgICAvLyBidXQgd2UgZG8gbm90IHlldCBzdXBwb3J0IGhhdmluZyBtdWx0aXBsZSBtaXBtYXAgbGV2ZWxzIGZvciBjb21wcmVzc2VkIHRleHR1cmVzLFxuICAgIC8vIHNvIHdlIG9ubHkgdGVzdCBmb3IgbGV2ZWwgemVyby5cblxuICAgIGlmIChcbiAgICAgIG1pcG1hcC5jb21wcmVzc2VkICYmXG4gICAgICAoXG4gICAgICAgIG1pcG1hcC5pbnRlcm5hbGZvcm1hdCA9PT0gR0xfQ09NUFJFU1NFRF9SR0JfUzNUQ19EWFQxX0VYVCB8fFxuICAgICAgICBtaXBtYXAuaW50ZXJuYWxmb3JtYXQgPT09IEdMX0NPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDFfRVhUIHx8XG4gICAgICAgIG1pcG1hcC5pbnRlcm5hbGZvcm1hdCA9PT0gR0xfQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUM19FWFQgfHxcbiAgICAgICAgbWlwbWFwLmludGVybmFsZm9ybWF0ID09PSBHTF9DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQ1X0VYVFxuICAgICAgKVxuICAgICkge1xuICAgICAgY2hlY2skMShtaXBtYXAud2lkdGggJSA0ID09PSAwICYmIG1pcG1hcC5oZWlnaHQgJSA0ID09PSAwLFxuICAgICAgICAnZm9yIGNvbXByZXNzZWQgdGV4dHVyZSBmb3JtYXRzLCBtaXBtYXAgbGV2ZWwgMCBtdXN0IGhhdmUgd2lkdGggYW5kIGhlaWdodCB0aGF0IGFyZSBhIG11bHRpcGxlIG9mIDQnKVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHNldE1pcE1hcCAobWlwbWFwLCB0YXJnZXQpIHtcbiAgICB2YXIgaW1hZ2VzID0gbWlwbWFwLmltYWdlc1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW1hZ2VzLmxlbmd0aDsgKytpKSB7XG4gICAgICBpZiAoIWltYWdlc1tpXSkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIHNldEltYWdlKGltYWdlc1tpXSwgdGFyZ2V0LCBpKVxuICAgIH1cbiAgfVxuXG4gIHZhciBtaXBQb29sID0gW11cblxuICBmdW5jdGlvbiBhbGxvY01pcE1hcCAoKSB7XG4gICAgdmFyIHJlc3VsdCA9IG1pcFBvb2wucG9wKCkgfHwgbmV3IE1pcE1hcCgpXG4gICAgVGV4RmxhZ3MuY2FsbChyZXN1bHQpXG4gICAgcmVzdWx0Lm1pcG1hc2sgPSAwXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCAxNjsgKytpKSB7XG4gICAgICByZXN1bHQuaW1hZ2VzW2ldID0gbnVsbFxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICBmdW5jdGlvbiBmcmVlTWlwTWFwIChtaXBtYXApIHtcbiAgICB2YXIgaW1hZ2VzID0gbWlwbWFwLmltYWdlc1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW1hZ2VzLmxlbmd0aDsgKytpKSB7XG4gICAgICBpZiAoaW1hZ2VzW2ldKSB7XG4gICAgICAgIGZyZWVJbWFnZShpbWFnZXNbaV0pXG4gICAgICB9XG4gICAgICBpbWFnZXNbaV0gPSBudWxsXG4gICAgfVxuICAgIG1pcFBvb2wucHVzaChtaXBtYXApXG4gIH1cblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIFRleCBpbmZvXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgZnVuY3Rpb24gVGV4SW5mbyAoKSB7XG4gICAgdGhpcy5taW5GaWx0ZXIgPSBHTF9ORUFSRVNUJDFcbiAgICB0aGlzLm1hZ0ZpbHRlciA9IEdMX05FQVJFU1QkMVxuXG4gICAgdGhpcy53cmFwUyA9IEdMX0NMQU1QX1RPX0VER0UkMVxuICAgIHRoaXMud3JhcFQgPSBHTF9DTEFNUF9UT19FREdFJDFcblxuICAgIHRoaXMuYW5pc290cm9waWMgPSAxXG5cbiAgICB0aGlzLmdlbk1pcG1hcHMgPSBmYWxzZVxuICAgIHRoaXMubWlwbWFwSGludCA9IEdMX0RPTlRfQ0FSRVxuICB9XG5cbiAgZnVuY3Rpb24gcGFyc2VUZXhJbmZvIChpbmZvLCBvcHRpb25zKSB7XG4gICAgaWYgKCdtaW4nIGluIG9wdGlvbnMpIHtcbiAgICAgIHZhciBtaW5GaWx0ZXIgPSBvcHRpb25zLm1pblxuICAgICAgY2hlY2skMS5wYXJhbWV0ZXIobWluRmlsdGVyLCBtaW5GaWx0ZXJzKVxuICAgICAgaW5mby5taW5GaWx0ZXIgPSBtaW5GaWx0ZXJzW21pbkZpbHRlcl1cbiAgICAgIGlmIChNSVBNQVBfRklMVEVSUy5pbmRleE9mKGluZm8ubWluRmlsdGVyKSA+PSAwICYmICEoJ2ZhY2VzJyBpbiBvcHRpb25zKSkge1xuICAgICAgICBpbmZvLmdlbk1pcG1hcHMgPSB0cnVlXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCdtYWcnIGluIG9wdGlvbnMpIHtcbiAgICAgIHZhciBtYWdGaWx0ZXIgPSBvcHRpb25zLm1hZ1xuICAgICAgY2hlY2skMS5wYXJhbWV0ZXIobWFnRmlsdGVyLCBtYWdGaWx0ZXJzKVxuICAgICAgaW5mby5tYWdGaWx0ZXIgPSBtYWdGaWx0ZXJzW21hZ0ZpbHRlcl1cbiAgICB9XG5cbiAgICB2YXIgd3JhcFMgPSBpbmZvLndyYXBTXG4gICAgdmFyIHdyYXBUID0gaW5mby53cmFwVFxuICAgIGlmICgnd3JhcCcgaW4gb3B0aW9ucykge1xuICAgICAgdmFyIHdyYXAgPSBvcHRpb25zLndyYXBcbiAgICAgIGlmICh0eXBlb2Ygd3JhcCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY2hlY2skMS5wYXJhbWV0ZXIod3JhcCwgd3JhcE1vZGVzKVxuICAgICAgICB3cmFwUyA9IHdyYXBUID0gd3JhcE1vZGVzW3dyYXBdXG4gICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkod3JhcCkpIHtcbiAgICAgICAgY2hlY2skMS5wYXJhbWV0ZXIod3JhcFswXSwgd3JhcE1vZGVzKVxuICAgICAgICBjaGVjayQxLnBhcmFtZXRlcih3cmFwWzFdLCB3cmFwTW9kZXMpXG4gICAgICAgIHdyYXBTID0gd3JhcE1vZGVzW3dyYXBbMF1dXG4gICAgICAgIHdyYXBUID0gd3JhcE1vZGVzW3dyYXBbMV1dXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICgnd3JhcFMnIGluIG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIG9wdFdyYXBTID0gb3B0aW9ucy53cmFwU1xuICAgICAgICBjaGVjayQxLnBhcmFtZXRlcihvcHRXcmFwUywgd3JhcE1vZGVzKVxuICAgICAgICB3cmFwUyA9IHdyYXBNb2Rlc1tvcHRXcmFwU11cbiAgICAgIH1cbiAgICAgIGlmICgnd3JhcFQnIGluIG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIG9wdFdyYXBUID0gb3B0aW9ucy53cmFwVFxuICAgICAgICBjaGVjayQxLnBhcmFtZXRlcihvcHRXcmFwVCwgd3JhcE1vZGVzKVxuICAgICAgICB3cmFwVCA9IHdyYXBNb2Rlc1tvcHRXcmFwVF1cbiAgICAgIH1cbiAgICB9XG4gICAgaW5mby53cmFwUyA9IHdyYXBTXG4gICAgaW5mby53cmFwVCA9IHdyYXBUXG5cbiAgICBpZiAoJ2FuaXNvdHJvcGljJyBpbiBvcHRpb25zKSB7XG4gICAgICB2YXIgYW5pc290cm9waWMgPSBvcHRpb25zLmFuaXNvdHJvcGljXG4gICAgICBjaGVjayQxKHR5cGVvZiBhbmlzb3Ryb3BpYyA9PT0gJ251bWJlcicgJiZcbiAgICAgICAgIGFuaXNvdHJvcGljID49IDEgJiYgYW5pc290cm9waWMgPD0gbGltaXRzLm1heEFuaXNvdHJvcGljLFxuICAgICAgJ2FuaXNvIHNhbXBsZXMgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kICcpXG4gICAgICBpbmZvLmFuaXNvdHJvcGljID0gb3B0aW9ucy5hbmlzb3Ryb3BpY1xuICAgIH1cblxuICAgIGlmICgnbWlwbWFwJyBpbiBvcHRpb25zKSB7XG4gICAgICB2YXIgaGFzTWlwTWFwID0gZmFsc2VcbiAgICAgIHN3aXRjaCAodHlwZW9mIG9wdGlvbnMubWlwbWFwKSB7XG4gICAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgICAgY2hlY2skMS5wYXJhbWV0ZXIob3B0aW9ucy5taXBtYXAsIG1pcG1hcEhpbnQsXG4gICAgICAgICAgICAnaW52YWxpZCBtaXBtYXAgaGludCcpXG4gICAgICAgICAgaW5mby5taXBtYXBIaW50ID0gbWlwbWFwSGludFtvcHRpb25zLm1pcG1hcF1cbiAgICAgICAgICBpbmZvLmdlbk1pcG1hcHMgPSB0cnVlXG4gICAgICAgICAgaGFzTWlwTWFwID0gdHJ1ZVxuICAgICAgICAgIGJyZWFrXG5cbiAgICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICAgICAgaGFzTWlwTWFwID0gaW5mby5nZW5NaXBtYXBzID0gb3B0aW9ucy5taXBtYXBcbiAgICAgICAgICBicmVha1xuXG4gICAgICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICAgICAgY2hlY2skMShBcnJheS5pc0FycmF5KG9wdGlvbnMubWlwbWFwKSwgJ2ludmFsaWQgbWlwbWFwIHR5cGUnKVxuICAgICAgICAgIGluZm8uZ2VuTWlwbWFwcyA9IGZhbHNlXG4gICAgICAgICAgaGFzTWlwTWFwID0gdHJ1ZVxuICAgICAgICAgIGJyZWFrXG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBjaGVjayQxLnJhaXNlKCdpbnZhbGlkIG1pcG1hcCB0eXBlJylcbiAgICAgIH1cbiAgICAgIGlmIChoYXNNaXBNYXAgJiYgISgnbWluJyBpbiBvcHRpb25zKSkge1xuICAgICAgICBpbmZvLm1pbkZpbHRlciA9IEdMX05FQVJFU1RfTUlQTUFQX05FQVJFU1QkMVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHNldFRleEluZm8gKGluZm8sIHRhcmdldCkge1xuICAgIGdsLnRleFBhcmFtZXRlcmkodGFyZ2V0LCBHTF9URVhUVVJFX01JTl9GSUxURVIsIGluZm8ubWluRmlsdGVyKVxuICAgIGdsLnRleFBhcmFtZXRlcmkodGFyZ2V0LCBHTF9URVhUVVJFX01BR19GSUxURVIsIGluZm8ubWFnRmlsdGVyKVxuICAgIGdsLnRleFBhcmFtZXRlcmkodGFyZ2V0LCBHTF9URVhUVVJFX1dSQVBfUywgaW5mby53cmFwUylcbiAgICBnbC50ZXhQYXJhbWV0ZXJpKHRhcmdldCwgR0xfVEVYVFVSRV9XUkFQX1QsIGluZm8ud3JhcFQpXG4gICAgaWYgKGV4dGVuc2lvbnMuZXh0X3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljKSB7XG4gICAgICBnbC50ZXhQYXJhbWV0ZXJpKHRhcmdldCwgR0xfVEVYVFVSRV9NQVhfQU5JU09UUk9QWV9FWFQsIGluZm8uYW5pc290cm9waWMpXG4gICAgfVxuICAgIGlmIChpbmZvLmdlbk1pcG1hcHMpIHtcbiAgICAgIGdsLmhpbnQoR0xfR0VORVJBVEVfTUlQTUFQX0hJTlQsIGluZm8ubWlwbWFwSGludClcbiAgICAgIGdsLmdlbmVyYXRlTWlwbWFwKHRhcmdldClcbiAgICB9XG4gIH1cblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIEZ1bGwgdGV4dHVyZSBvYmplY3RcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICB2YXIgdGV4dHVyZUNvdW50ID0gMFxuICB2YXIgdGV4dHVyZVNldCA9IHt9XG4gIHZhciBudW1UZXhVbml0cyA9IGxpbWl0cy5tYXhUZXh0dXJlVW5pdHNcbiAgdmFyIHRleHR1cmVVbml0cyA9IEFycmF5KG51bVRleFVuaXRzKS5tYXAoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBudWxsXG4gIH0pXG5cbiAgZnVuY3Rpb24gUkVHTFRleHR1cmUgKHRhcmdldCkge1xuICAgIFRleEZsYWdzLmNhbGwodGhpcylcbiAgICB0aGlzLm1pcG1hc2sgPSAwXG4gICAgdGhpcy5pbnRlcm5hbGZvcm1hdCA9IEdMX1JHQkEkMVxuXG4gICAgdGhpcy5pZCA9IHRleHR1cmVDb3VudCsrXG5cbiAgICB0aGlzLnJlZkNvdW50ID0gMVxuXG4gICAgdGhpcy50YXJnZXQgPSB0YXJnZXRcbiAgICB0aGlzLnRleHR1cmUgPSBnbC5jcmVhdGVUZXh0dXJlKClcblxuICAgIHRoaXMudW5pdCA9IC0xXG4gICAgdGhpcy5iaW5kQ291bnQgPSAwXG5cbiAgICB0aGlzLnRleEluZm8gPSBuZXcgVGV4SW5mbygpXG5cbiAgICBpZiAoY29uZmlnLnByb2ZpbGUpIHtcbiAgICAgIHRoaXMuc3RhdHMgPSB7IHNpemU6IDAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHRlbXBCaW5kICh0ZXh0dXJlKSB7XG4gICAgZ2wuYWN0aXZlVGV4dHVyZShHTF9URVhUVVJFMCQxKVxuICAgIGdsLmJpbmRUZXh0dXJlKHRleHR1cmUudGFyZ2V0LCB0ZXh0dXJlLnRleHR1cmUpXG4gIH1cblxuICBmdW5jdGlvbiB0ZW1wUmVzdG9yZSAoKSB7XG4gICAgdmFyIHByZXYgPSB0ZXh0dXJlVW5pdHNbMF1cbiAgICBpZiAocHJldikge1xuICAgICAgZ2wuYmluZFRleHR1cmUocHJldi50YXJnZXQsIHByZXYudGV4dHVyZSlcbiAgICB9IGVsc2Uge1xuICAgICAgZ2wuYmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCQxLCBudWxsKVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGRlc3Ryb3kgKHRleHR1cmUpIHtcbiAgICB2YXIgaGFuZGxlID0gdGV4dHVyZS50ZXh0dXJlXG4gICAgY2hlY2skMShoYW5kbGUsICdtdXN0IG5vdCBkb3VibGUgZGVzdHJveSB0ZXh0dXJlJylcbiAgICB2YXIgdW5pdCA9IHRleHR1cmUudW5pdFxuICAgIHZhciB0YXJnZXQgPSB0ZXh0dXJlLnRhcmdldFxuICAgIGlmICh1bml0ID49IDApIHtcbiAgICAgIGdsLmFjdGl2ZVRleHR1cmUoR0xfVEVYVFVSRTAkMSArIHVuaXQpXG4gICAgICBnbC5iaW5kVGV4dHVyZSh0YXJnZXQsIG51bGwpXG4gICAgICB0ZXh0dXJlVW5pdHNbdW5pdF0gPSBudWxsXG4gICAgfVxuICAgIGdsLmRlbGV0ZVRleHR1cmUoaGFuZGxlKVxuICAgIHRleHR1cmUudGV4dHVyZSA9IG51bGxcbiAgICB0ZXh0dXJlLnBhcmFtcyA9IG51bGxcbiAgICB0ZXh0dXJlLnBpeGVscyA9IG51bGxcbiAgICB0ZXh0dXJlLnJlZkNvdW50ID0gMFxuICAgIGRlbGV0ZSB0ZXh0dXJlU2V0W3RleHR1cmUuaWRdXG4gICAgc3RhdHMudGV4dHVyZUNvdW50LS1cbiAgfVxuXG4gIGV4dGVuZChSRUdMVGV4dHVyZS5wcm90b3R5cGUsIHtcbiAgICBiaW5kOiBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgdGV4dHVyZSA9IHRoaXNcbiAgICAgIHRleHR1cmUuYmluZENvdW50ICs9IDFcbiAgICAgIHZhciB1bml0ID0gdGV4dHVyZS51bml0XG4gICAgICBpZiAodW5pdCA8IDApIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1UZXhVbml0czsgKytpKSB7XG4gICAgICAgICAgdmFyIG90aGVyID0gdGV4dHVyZVVuaXRzW2ldXG4gICAgICAgICAgaWYgKG90aGVyKSB7XG4gICAgICAgICAgICBpZiAob3RoZXIuYmluZENvdW50ID4gMCkge1xuICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3RoZXIudW5pdCA9IC0xXG4gICAgICAgICAgfVxuICAgICAgICAgIHRleHR1cmVVbml0c1tpXSA9IHRleHR1cmVcbiAgICAgICAgICB1bml0ID0gaVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVuaXQgPj0gbnVtVGV4VW5pdHMpIHtcbiAgICAgICAgICBjaGVjayQxLnJhaXNlKCdpbnN1ZmZpY2llbnQgbnVtYmVyIG9mIHRleHR1cmUgdW5pdHMnKVxuICAgICAgICB9XG4gICAgICAgIGlmIChjb25maWcucHJvZmlsZSAmJiBzdGF0cy5tYXhUZXh0dXJlVW5pdHMgPCAodW5pdCArIDEpKSB7XG4gICAgICAgICAgc3RhdHMubWF4VGV4dHVyZVVuaXRzID0gdW5pdCArIDEgLy8gKzEsIHNpbmNlIHRoZSB1bml0cyBhcmUgemVyby1iYXNlZFxuICAgICAgICB9XG4gICAgICAgIHRleHR1cmUudW5pdCA9IHVuaXRcbiAgICAgICAgZ2wuYWN0aXZlVGV4dHVyZShHTF9URVhUVVJFMCQxICsgdW5pdClcbiAgICAgICAgZ2wuYmluZFRleHR1cmUodGV4dHVyZS50YXJnZXQsIHRleHR1cmUudGV4dHVyZSlcbiAgICAgIH1cbiAgICAgIHJldHVybiB1bml0XG4gICAgfSxcblxuICAgIHVuYmluZDogZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5iaW5kQ291bnQgLT0gMVxuICAgIH0sXG5cbiAgICBkZWNSZWY6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICgtLXRoaXMucmVmQ291bnQgPD0gMCkge1xuICAgICAgICBkZXN0cm95KHRoaXMpXG4gICAgICB9XG4gICAgfVxuICB9KVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZVRleHR1cmUyRCAoYSwgYikge1xuICAgIHZhciB0ZXh0dXJlID0gbmV3IFJFR0xUZXh0dXJlKEdMX1RFWFRVUkVfMkQkMSlcbiAgICB0ZXh0dXJlU2V0W3RleHR1cmUuaWRdID0gdGV4dHVyZVxuICAgIHN0YXRzLnRleHR1cmVDb3VudCsrXG5cbiAgICBmdW5jdGlvbiByZWdsVGV4dHVyZTJEIChhLCBiKSB7XG4gICAgICB2YXIgdGV4SW5mbyA9IHRleHR1cmUudGV4SW5mb1xuICAgICAgVGV4SW5mby5jYWxsKHRleEluZm8pXG4gICAgICB2YXIgbWlwRGF0YSA9IGFsbG9jTWlwTWFwKClcblxuICAgICAgaWYgKHR5cGVvZiBhID09PSAnbnVtYmVyJykge1xuICAgICAgICBpZiAodHlwZW9mIGIgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgcGFyc2VNaXBNYXBGcm9tU2hhcGUobWlwRGF0YSwgYSB8IDAsIGIgfCAwKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBhcnNlTWlwTWFwRnJvbVNoYXBlKG1pcERhdGEsIGEgfCAwLCBhIHwgMClcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChhKSB7XG4gICAgICAgIGNoZWNrJDEudHlwZShhLCAnb2JqZWN0JywgJ2ludmFsaWQgYXJndW1lbnRzIHRvIHJlZ2wudGV4dHVyZScpXG4gICAgICAgIHBhcnNlVGV4SW5mbyh0ZXhJbmZvLCBhKVxuICAgICAgICBwYXJzZU1pcE1hcEZyb21PYmplY3QobWlwRGF0YSwgYSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGVtcHR5IHRleHR1cmVzIGdldCBhc3NpZ25lZCBhIGRlZmF1bHQgc2hhcGUgb2YgMXgxXG4gICAgICAgIHBhcnNlTWlwTWFwRnJvbVNoYXBlKG1pcERhdGEsIDEsIDEpXG4gICAgICB9XG5cbiAgICAgIGlmICh0ZXhJbmZvLmdlbk1pcG1hcHMpIHtcbiAgICAgICAgbWlwRGF0YS5taXBtYXNrID0gKG1pcERhdGEud2lkdGggPDwgMSkgLSAxXG4gICAgICB9XG4gICAgICB0ZXh0dXJlLm1pcG1hc2sgPSBtaXBEYXRhLm1pcG1hc2tcblxuICAgICAgY29weUZsYWdzKHRleHR1cmUsIG1pcERhdGEpXG5cbiAgICAgIGNoZWNrJDEudGV4dHVyZTJEKHRleEluZm8sIG1pcERhdGEsIGxpbWl0cylcbiAgICAgIHRleHR1cmUuaW50ZXJuYWxmb3JtYXQgPSBtaXBEYXRhLmludGVybmFsZm9ybWF0XG5cbiAgICAgIHJlZ2xUZXh0dXJlMkQud2lkdGggPSBtaXBEYXRhLndpZHRoXG4gICAgICByZWdsVGV4dHVyZTJELmhlaWdodCA9IG1pcERhdGEuaGVpZ2h0XG5cbiAgICAgIHRlbXBCaW5kKHRleHR1cmUpXG4gICAgICBzZXRNaXBNYXAobWlwRGF0YSwgR0xfVEVYVFVSRV8yRCQxKVxuICAgICAgc2V0VGV4SW5mbyh0ZXhJbmZvLCBHTF9URVhUVVJFXzJEJDEpXG4gICAgICB0ZW1wUmVzdG9yZSgpXG5cbiAgICAgIGZyZWVNaXBNYXAobWlwRGF0YSlcblxuICAgICAgaWYgKGNvbmZpZy5wcm9maWxlKSB7XG4gICAgICAgIHRleHR1cmUuc3RhdHMuc2l6ZSA9IGdldFRleHR1cmVTaXplKFxuICAgICAgICAgIHRleHR1cmUuaW50ZXJuYWxmb3JtYXQsXG4gICAgICAgICAgdGV4dHVyZS50eXBlLFxuICAgICAgICAgIG1pcERhdGEud2lkdGgsXG4gICAgICAgICAgbWlwRGF0YS5oZWlnaHQsXG4gICAgICAgICAgdGV4SW5mby5nZW5NaXBtYXBzLFxuICAgICAgICAgIGZhbHNlKVxuICAgICAgfVxuICAgICAgcmVnbFRleHR1cmUyRC5mb3JtYXQgPSB0ZXh0dXJlRm9ybWF0c0ludmVydFt0ZXh0dXJlLmludGVybmFsZm9ybWF0XVxuICAgICAgcmVnbFRleHR1cmUyRC50eXBlID0gdGV4dHVyZVR5cGVzSW52ZXJ0W3RleHR1cmUudHlwZV1cblxuICAgICAgcmVnbFRleHR1cmUyRC5tYWcgPSBtYWdGaWx0ZXJzSW52ZXJ0W3RleEluZm8ubWFnRmlsdGVyXVxuICAgICAgcmVnbFRleHR1cmUyRC5taW4gPSBtaW5GaWx0ZXJzSW52ZXJ0W3RleEluZm8ubWluRmlsdGVyXVxuXG4gICAgICByZWdsVGV4dHVyZTJELndyYXBTID0gd3JhcE1vZGVzSW52ZXJ0W3RleEluZm8ud3JhcFNdXG4gICAgICByZWdsVGV4dHVyZTJELndyYXBUID0gd3JhcE1vZGVzSW52ZXJ0W3RleEluZm8ud3JhcFRdXG5cbiAgICAgIHJldHVybiByZWdsVGV4dHVyZTJEXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc3ViaW1hZ2UgKGltYWdlLCB4XywgeV8sIGxldmVsXykge1xuICAgICAgY2hlY2skMSghIWltYWdlLCAnbXVzdCBzcGVjaWZ5IGltYWdlIGRhdGEnKVxuXG4gICAgICB2YXIgeCA9IHhfIHwgMFxuICAgICAgdmFyIHkgPSB5XyB8IDBcbiAgICAgIHZhciBsZXZlbCA9IGxldmVsXyB8IDBcblxuICAgICAgdmFyIGltYWdlRGF0YSA9IGFsbG9jSW1hZ2UoKVxuICAgICAgY29weUZsYWdzKGltYWdlRGF0YSwgdGV4dHVyZSlcbiAgICAgIGltYWdlRGF0YS53aWR0aCA9IDBcbiAgICAgIGltYWdlRGF0YS5oZWlnaHQgPSAwXG4gICAgICBwYXJzZUltYWdlKGltYWdlRGF0YSwgaW1hZ2UpXG4gICAgICBpbWFnZURhdGEud2lkdGggPSBpbWFnZURhdGEud2lkdGggfHwgKCh0ZXh0dXJlLndpZHRoID4+IGxldmVsKSAtIHgpXG4gICAgICBpbWFnZURhdGEuaGVpZ2h0ID0gaW1hZ2VEYXRhLmhlaWdodCB8fCAoKHRleHR1cmUuaGVpZ2h0ID4+IGxldmVsKSAtIHkpXG5cbiAgICAgIGNoZWNrJDEoXG4gICAgICAgIHRleHR1cmUudHlwZSA9PT0gaW1hZ2VEYXRhLnR5cGUgJiZcbiAgICAgICAgdGV4dHVyZS5mb3JtYXQgPT09IGltYWdlRGF0YS5mb3JtYXQgJiZcbiAgICAgICAgdGV4dHVyZS5pbnRlcm5hbGZvcm1hdCA9PT0gaW1hZ2VEYXRhLmludGVybmFsZm9ybWF0LFxuICAgICAgICAnaW5jb21wYXRpYmxlIGZvcm1hdCBmb3IgdGV4dHVyZS5zdWJpbWFnZScpXG4gICAgICBjaGVjayQxKFxuICAgICAgICB4ID49IDAgJiYgeSA+PSAwICYmXG4gICAgICAgIHggKyBpbWFnZURhdGEud2lkdGggPD0gdGV4dHVyZS53aWR0aCAmJlxuICAgICAgICB5ICsgaW1hZ2VEYXRhLmhlaWdodCA8PSB0ZXh0dXJlLmhlaWdodCxcbiAgICAgICAgJ3RleHR1cmUuc3ViaW1hZ2Ugd3JpdGUgb3V0IG9mIGJvdW5kcycpXG4gICAgICBjaGVjayQxKFxuICAgICAgICB0ZXh0dXJlLm1pcG1hc2sgJiAoMSA8PCBsZXZlbCksXG4gICAgICAgICdtaXNzaW5nIG1pcG1hcCBkYXRhJylcbiAgICAgIGNoZWNrJDEoXG4gICAgICAgIGltYWdlRGF0YS5kYXRhIHx8IGltYWdlRGF0YS5lbGVtZW50IHx8IGltYWdlRGF0YS5uZWVkc0NvcHksXG4gICAgICAgICdtaXNzaW5nIGltYWdlIGRhdGEnKVxuXG4gICAgICB0ZW1wQmluZCh0ZXh0dXJlKVxuICAgICAgc2V0U3ViSW1hZ2UoaW1hZ2VEYXRhLCBHTF9URVhUVVJFXzJEJDEsIHgsIHksIGxldmVsKVxuICAgICAgdGVtcFJlc3RvcmUoKVxuXG4gICAgICBmcmVlSW1hZ2UoaW1hZ2VEYXRhKVxuXG4gICAgICByZXR1cm4gcmVnbFRleHR1cmUyRFxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlc2l6ZSAod18sIGhfKSB7XG4gICAgICB2YXIgdyA9IHdfIHwgMFxuICAgICAgdmFyIGggPSAoaF8gfCAwKSB8fCB3XG4gICAgICBpZiAodyA9PT0gdGV4dHVyZS53aWR0aCAmJiBoID09PSB0ZXh0dXJlLmhlaWdodCkge1xuICAgICAgICByZXR1cm4gcmVnbFRleHR1cmUyRFxuICAgICAgfVxuXG4gICAgICByZWdsVGV4dHVyZTJELndpZHRoID0gdGV4dHVyZS53aWR0aCA9IHdcbiAgICAgIHJlZ2xUZXh0dXJlMkQuaGVpZ2h0ID0gdGV4dHVyZS5oZWlnaHQgPSBoXG5cbiAgICAgIHRlbXBCaW5kKHRleHR1cmUpXG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyB0ZXh0dXJlLm1pcG1hc2sgPj4gaTsgKytpKSB7XG4gICAgICAgIHZhciBfdyA9IHcgPj4gaVxuICAgICAgICB2YXIgX2ggPSBoID4+IGlcbiAgICAgICAgaWYgKCFfdyB8fCAhX2gpIGJyZWFrXG4gICAgICAgIGdsLnRleEltYWdlMkQoXG4gICAgICAgICAgR0xfVEVYVFVSRV8yRCQxLFxuICAgICAgICAgIGksXG4gICAgICAgICAgdGV4dHVyZS5mb3JtYXQsXG4gICAgICAgICAgX3csXG4gICAgICAgICAgX2gsXG4gICAgICAgICAgMCxcbiAgICAgICAgICB0ZXh0dXJlLmZvcm1hdCxcbiAgICAgICAgICB0ZXh0dXJlLnR5cGUsXG4gICAgICAgICAgbnVsbClcbiAgICAgIH1cbiAgICAgIHRlbXBSZXN0b3JlKClcblxuICAgICAgLy8gYWxzbywgcmVjb21wdXRlIHRoZSB0ZXh0dXJlIHNpemUuXG4gICAgICBpZiAoY29uZmlnLnByb2ZpbGUpIHtcbiAgICAgICAgdGV4dHVyZS5zdGF0cy5zaXplID0gZ2V0VGV4dHVyZVNpemUoXG4gICAgICAgICAgdGV4dHVyZS5pbnRlcm5hbGZvcm1hdCxcbiAgICAgICAgICB0ZXh0dXJlLnR5cGUsXG4gICAgICAgICAgdyxcbiAgICAgICAgICBoLFxuICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgIGZhbHNlKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVnbFRleHR1cmUyRFxuICAgIH1cblxuICAgIHJlZ2xUZXh0dXJlMkQoYSwgYilcblxuICAgIHJlZ2xUZXh0dXJlMkQuc3ViaW1hZ2UgPSBzdWJpbWFnZVxuICAgIHJlZ2xUZXh0dXJlMkQucmVzaXplID0gcmVzaXplXG4gICAgcmVnbFRleHR1cmUyRC5fcmVnbFR5cGUgPSAndGV4dHVyZTJkJ1xuICAgIHJlZ2xUZXh0dXJlMkQuX3RleHR1cmUgPSB0ZXh0dXJlXG4gICAgaWYgKGNvbmZpZy5wcm9maWxlKSB7XG4gICAgICByZWdsVGV4dHVyZTJELnN0YXRzID0gdGV4dHVyZS5zdGF0c1xuICAgIH1cbiAgICByZWdsVGV4dHVyZTJELmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0ZXh0dXJlLmRlY1JlZigpXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlZ2xUZXh0dXJlMkRcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZVRleHR1cmVDdWJlIChhMCwgYTEsIGEyLCBhMywgYTQsIGE1KSB7XG4gICAgdmFyIHRleHR1cmUgPSBuZXcgUkVHTFRleHR1cmUoR0xfVEVYVFVSRV9DVUJFX01BUCQxKVxuICAgIHRleHR1cmVTZXRbdGV4dHVyZS5pZF0gPSB0ZXh0dXJlXG4gICAgc3RhdHMuY3ViZUNvdW50KytcblxuICAgIHZhciBmYWNlcyA9IG5ldyBBcnJheSg2KVxuXG4gICAgZnVuY3Rpb24gcmVnbFRleHR1cmVDdWJlIChhMCwgYTEsIGEyLCBhMywgYTQsIGE1KSB7XG4gICAgICB2YXIgaVxuICAgICAgdmFyIHRleEluZm8gPSB0ZXh0dXJlLnRleEluZm9cbiAgICAgIFRleEluZm8uY2FsbCh0ZXhJbmZvKVxuICAgICAgZm9yIChpID0gMDsgaSA8IDY7ICsraSkge1xuICAgICAgICBmYWNlc1tpXSA9IGFsbG9jTWlwTWFwKClcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBhMCA9PT0gJ251bWJlcicgfHwgIWEwKSB7XG4gICAgICAgIHZhciBzID0gKGEwIHwgMCkgfHwgMVxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjsgKytpKSB7XG4gICAgICAgICAgcGFyc2VNaXBNYXBGcm9tU2hhcGUoZmFjZXNbaV0sIHMsIHMpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGEwID09PSAnb2JqZWN0Jykge1xuICAgICAgICBpZiAoYTEpIHtcbiAgICAgICAgICBwYXJzZU1pcE1hcEZyb21PYmplY3QoZmFjZXNbMF0sIGEwKVxuICAgICAgICAgIHBhcnNlTWlwTWFwRnJvbU9iamVjdChmYWNlc1sxXSwgYTEpXG4gICAgICAgICAgcGFyc2VNaXBNYXBGcm9tT2JqZWN0KGZhY2VzWzJdLCBhMilcbiAgICAgICAgICBwYXJzZU1pcE1hcEZyb21PYmplY3QoZmFjZXNbM10sIGEzKVxuICAgICAgICAgIHBhcnNlTWlwTWFwRnJvbU9iamVjdChmYWNlc1s0XSwgYTQpXG4gICAgICAgICAgcGFyc2VNaXBNYXBGcm9tT2JqZWN0KGZhY2VzWzVdLCBhNSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwYXJzZVRleEluZm8odGV4SW5mbywgYTApXG4gICAgICAgICAgcGFyc2VGbGFncyh0ZXh0dXJlLCBhMClcbiAgICAgICAgICBpZiAoJ2ZhY2VzJyBpbiBhMCkge1xuICAgICAgICAgICAgdmFyIGZhY2VJbnB1dCA9IGEwLmZhY2VzXG4gICAgICAgICAgICBjaGVjayQxKEFycmF5LmlzQXJyYXkoZmFjZUlucHV0KSAmJiBmYWNlSW5wdXQubGVuZ3RoID09PSA2LFxuICAgICAgICAgICAgICAnY3ViZSBmYWNlcyBtdXN0IGJlIGEgbGVuZ3RoIDYgYXJyYXknKVxuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDY7ICsraSkge1xuICAgICAgICAgICAgICBjaGVjayQxKHR5cGVvZiBmYWNlSW5wdXRbaV0gPT09ICdvYmplY3QnICYmICEhZmFjZUlucHV0W2ldLFxuICAgICAgICAgICAgICAgICdpbnZhbGlkIGlucHV0IGZvciBjdWJlIG1hcCBmYWNlJylcbiAgICAgICAgICAgICAgY29weUZsYWdzKGZhY2VzW2ldLCB0ZXh0dXJlKVxuICAgICAgICAgICAgICBwYXJzZU1pcE1hcEZyb21PYmplY3QoZmFjZXNbaV0sIGZhY2VJbnB1dFtpXSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDY7ICsraSkge1xuICAgICAgICAgICAgICBwYXJzZU1pcE1hcEZyb21PYmplY3QoZmFjZXNbaV0sIGEwKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2hlY2skMS5yYWlzZSgnaW52YWxpZCBhcmd1bWVudHMgdG8gY3ViZSBtYXAnKVxuICAgICAgfVxuXG4gICAgICBjb3B5RmxhZ3ModGV4dHVyZSwgZmFjZXNbMF0pXG5cbiAgICAgIGlmICghbGltaXRzLm5wb3RUZXh0dXJlQ3ViZSkge1xuICAgICAgICBjaGVjayQxKGlzUG93MiQxKHRleHR1cmUud2lkdGgpICYmIGlzUG93MiQxKHRleHR1cmUuaGVpZ2h0KSwgJ3lvdXIgYnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IG5vbiBwb3dlciBvciB0d28gdGV4dHVyZSBkaW1lbnNpb25zJylcbiAgICAgIH1cblxuICAgICAgaWYgKHRleEluZm8uZ2VuTWlwbWFwcykge1xuICAgICAgICB0ZXh0dXJlLm1pcG1hc2sgPSAoZmFjZXNbMF0ud2lkdGggPDwgMSkgLSAxXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0ZXh0dXJlLm1pcG1hc2sgPSBmYWNlc1swXS5taXBtYXNrXG4gICAgICB9XG5cbiAgICAgIGNoZWNrJDEudGV4dHVyZUN1YmUodGV4dHVyZSwgdGV4SW5mbywgZmFjZXMsIGxpbWl0cylcbiAgICAgIHRleHR1cmUuaW50ZXJuYWxmb3JtYXQgPSBmYWNlc1swXS5pbnRlcm5hbGZvcm1hdFxuXG4gICAgICByZWdsVGV4dHVyZUN1YmUud2lkdGggPSBmYWNlc1swXS53aWR0aFxuICAgICAgcmVnbFRleHR1cmVDdWJlLmhlaWdodCA9IGZhY2VzWzBdLmhlaWdodFxuXG4gICAgICB0ZW1wQmluZCh0ZXh0dXJlKVxuICAgICAgZm9yIChpID0gMDsgaSA8IDY7ICsraSkge1xuICAgICAgICBzZXRNaXBNYXAoZmFjZXNbaV0sIEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCQxICsgaSlcbiAgICAgIH1cbiAgICAgIHNldFRleEluZm8odGV4SW5mbywgR0xfVEVYVFVSRV9DVUJFX01BUCQxKVxuICAgICAgdGVtcFJlc3RvcmUoKVxuXG4gICAgICBpZiAoY29uZmlnLnByb2ZpbGUpIHtcbiAgICAgICAgdGV4dHVyZS5zdGF0cy5zaXplID0gZ2V0VGV4dHVyZVNpemUoXG4gICAgICAgICAgdGV4dHVyZS5pbnRlcm5hbGZvcm1hdCxcbiAgICAgICAgICB0ZXh0dXJlLnR5cGUsXG4gICAgICAgICAgcmVnbFRleHR1cmVDdWJlLndpZHRoLFxuICAgICAgICAgIHJlZ2xUZXh0dXJlQ3ViZS5oZWlnaHQsXG4gICAgICAgICAgdGV4SW5mby5nZW5NaXBtYXBzLFxuICAgICAgICAgIHRydWUpXG4gICAgICB9XG5cbiAgICAgIHJlZ2xUZXh0dXJlQ3ViZS5mb3JtYXQgPSB0ZXh0dXJlRm9ybWF0c0ludmVydFt0ZXh0dXJlLmludGVybmFsZm9ybWF0XVxuICAgICAgcmVnbFRleHR1cmVDdWJlLnR5cGUgPSB0ZXh0dXJlVHlwZXNJbnZlcnRbdGV4dHVyZS50eXBlXVxuXG4gICAgICByZWdsVGV4dHVyZUN1YmUubWFnID0gbWFnRmlsdGVyc0ludmVydFt0ZXhJbmZvLm1hZ0ZpbHRlcl1cbiAgICAgIHJlZ2xUZXh0dXJlQ3ViZS5taW4gPSBtaW5GaWx0ZXJzSW52ZXJ0W3RleEluZm8ubWluRmlsdGVyXVxuXG4gICAgICByZWdsVGV4dHVyZUN1YmUud3JhcFMgPSB3cmFwTW9kZXNJbnZlcnRbdGV4SW5mby53cmFwU11cbiAgICAgIHJlZ2xUZXh0dXJlQ3ViZS53cmFwVCA9IHdyYXBNb2Rlc0ludmVydFt0ZXhJbmZvLndyYXBUXVxuXG4gICAgICBmb3IgKGkgPSAwOyBpIDwgNjsgKytpKSB7XG4gICAgICAgIGZyZWVNaXBNYXAoZmFjZXNbaV0pXG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZWdsVGV4dHVyZUN1YmVcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzdWJpbWFnZSAoZmFjZSwgaW1hZ2UsIHhfLCB5XywgbGV2ZWxfKSB7XG4gICAgICBjaGVjayQxKCEhaW1hZ2UsICdtdXN0IHNwZWNpZnkgaW1hZ2UgZGF0YScpXG4gICAgICBjaGVjayQxKHR5cGVvZiBmYWNlID09PSAnbnVtYmVyJyAmJiBmYWNlID09PSAoZmFjZSB8IDApICYmXG4gICAgICAgIGZhY2UgPj0gMCAmJiBmYWNlIDwgNiwgJ2ludmFsaWQgZmFjZScpXG5cbiAgICAgIHZhciB4ID0geF8gfCAwXG4gICAgICB2YXIgeSA9IHlfIHwgMFxuICAgICAgdmFyIGxldmVsID0gbGV2ZWxfIHwgMFxuXG4gICAgICB2YXIgaW1hZ2VEYXRhID0gYWxsb2NJbWFnZSgpXG4gICAgICBjb3B5RmxhZ3MoaW1hZ2VEYXRhLCB0ZXh0dXJlKVxuICAgICAgaW1hZ2VEYXRhLndpZHRoID0gMFxuICAgICAgaW1hZ2VEYXRhLmhlaWdodCA9IDBcbiAgICAgIHBhcnNlSW1hZ2UoaW1hZ2VEYXRhLCBpbWFnZSlcbiAgICAgIGltYWdlRGF0YS53aWR0aCA9IGltYWdlRGF0YS53aWR0aCB8fCAoKHRleHR1cmUud2lkdGggPj4gbGV2ZWwpIC0geClcbiAgICAgIGltYWdlRGF0YS5oZWlnaHQgPSBpbWFnZURhdGEuaGVpZ2h0IHx8ICgodGV4dHVyZS5oZWlnaHQgPj4gbGV2ZWwpIC0geSlcblxuICAgICAgY2hlY2skMShcbiAgICAgICAgdGV4dHVyZS50eXBlID09PSBpbWFnZURhdGEudHlwZSAmJlxuICAgICAgICB0ZXh0dXJlLmZvcm1hdCA9PT0gaW1hZ2VEYXRhLmZvcm1hdCAmJlxuICAgICAgICB0ZXh0dXJlLmludGVybmFsZm9ybWF0ID09PSBpbWFnZURhdGEuaW50ZXJuYWxmb3JtYXQsXG4gICAgICAgICdpbmNvbXBhdGlibGUgZm9ybWF0IGZvciB0ZXh0dXJlLnN1YmltYWdlJylcbiAgICAgIGNoZWNrJDEoXG4gICAgICAgIHggPj0gMCAmJiB5ID49IDAgJiZcbiAgICAgICAgeCArIGltYWdlRGF0YS53aWR0aCA8PSB0ZXh0dXJlLndpZHRoICYmXG4gICAgICAgIHkgKyBpbWFnZURhdGEuaGVpZ2h0IDw9IHRleHR1cmUuaGVpZ2h0LFxuICAgICAgICAndGV4dHVyZS5zdWJpbWFnZSB3cml0ZSBvdXQgb2YgYm91bmRzJylcbiAgICAgIGNoZWNrJDEoXG4gICAgICAgIHRleHR1cmUubWlwbWFzayAmICgxIDw8IGxldmVsKSxcbiAgICAgICAgJ21pc3NpbmcgbWlwbWFwIGRhdGEnKVxuICAgICAgY2hlY2skMShcbiAgICAgICAgaW1hZ2VEYXRhLmRhdGEgfHwgaW1hZ2VEYXRhLmVsZW1lbnQgfHwgaW1hZ2VEYXRhLm5lZWRzQ29weSxcbiAgICAgICAgJ21pc3NpbmcgaW1hZ2UgZGF0YScpXG5cbiAgICAgIHRlbXBCaW5kKHRleHR1cmUpXG4gICAgICBzZXRTdWJJbWFnZShpbWFnZURhdGEsIEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCQxICsgZmFjZSwgeCwgeSwgbGV2ZWwpXG4gICAgICB0ZW1wUmVzdG9yZSgpXG5cbiAgICAgIGZyZWVJbWFnZShpbWFnZURhdGEpXG5cbiAgICAgIHJldHVybiByZWdsVGV4dHVyZUN1YmVcbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZXNpemUgKHJhZGl1c18pIHtcbiAgICAgIHZhciByYWRpdXMgPSByYWRpdXNfIHwgMFxuICAgICAgaWYgKHJhZGl1cyA9PT0gdGV4dHVyZS53aWR0aCkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgcmVnbFRleHR1cmVDdWJlLndpZHRoID0gdGV4dHVyZS53aWR0aCA9IHJhZGl1c1xuICAgICAgcmVnbFRleHR1cmVDdWJlLmhlaWdodCA9IHRleHR1cmUuaGVpZ2h0ID0gcmFkaXVzXG5cbiAgICAgIHRlbXBCaW5kKHRleHR1cmUpXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDY7ICsraSkge1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgdGV4dHVyZS5taXBtYXNrID4+IGo7ICsraikge1xuICAgICAgICAgIGdsLnRleEltYWdlMkQoXG4gICAgICAgICAgICBHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1gkMSArIGksXG4gICAgICAgICAgICBqLFxuICAgICAgICAgICAgdGV4dHVyZS5mb3JtYXQsXG4gICAgICAgICAgICByYWRpdXMgPj4gaixcbiAgICAgICAgICAgIHJhZGl1cyA+PiBqLFxuICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIHRleHR1cmUuZm9ybWF0LFxuICAgICAgICAgICAgdGV4dHVyZS50eXBlLFxuICAgICAgICAgICAgbnVsbClcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGVtcFJlc3RvcmUoKVxuXG4gICAgICBpZiAoY29uZmlnLnByb2ZpbGUpIHtcbiAgICAgICAgdGV4dHVyZS5zdGF0cy5zaXplID0gZ2V0VGV4dHVyZVNpemUoXG4gICAgICAgICAgdGV4dHVyZS5pbnRlcm5hbGZvcm1hdCxcbiAgICAgICAgICB0ZXh0dXJlLnR5cGUsXG4gICAgICAgICAgcmVnbFRleHR1cmVDdWJlLndpZHRoLFxuICAgICAgICAgIHJlZ2xUZXh0dXJlQ3ViZS5oZWlnaHQsXG4gICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgdHJ1ZSlcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlZ2xUZXh0dXJlQ3ViZVxuICAgIH1cblxuICAgIHJlZ2xUZXh0dXJlQ3ViZShhMCwgYTEsIGEyLCBhMywgYTQsIGE1KVxuXG4gICAgcmVnbFRleHR1cmVDdWJlLnN1YmltYWdlID0gc3ViaW1hZ2VcbiAgICByZWdsVGV4dHVyZUN1YmUucmVzaXplID0gcmVzaXplXG4gICAgcmVnbFRleHR1cmVDdWJlLl9yZWdsVHlwZSA9ICd0ZXh0dXJlQ3ViZSdcbiAgICByZWdsVGV4dHVyZUN1YmUuX3RleHR1cmUgPSB0ZXh0dXJlXG4gICAgaWYgKGNvbmZpZy5wcm9maWxlKSB7XG4gICAgICByZWdsVGV4dHVyZUN1YmUuc3RhdHMgPSB0ZXh0dXJlLnN0YXRzXG4gICAgfVxuICAgIHJlZ2xUZXh0dXJlQ3ViZS5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGV4dHVyZS5kZWNSZWYoKVxuICAgIH1cblxuICAgIHJldHVybiByZWdsVGV4dHVyZUN1YmVcbiAgfVxuXG4gIC8vIENhbGxlZCB3aGVuIHJlZ2wgaXMgZGVzdHJveWVkXG4gIGZ1bmN0aW9uIGRlc3Ryb3lUZXh0dXJlcyAoKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1UZXhVbml0czsgKytpKSB7XG4gICAgICBnbC5hY3RpdmVUZXh0dXJlKEdMX1RFWFRVUkUwJDEgKyBpKVxuICAgICAgZ2wuYmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCQxLCBudWxsKVxuICAgICAgdGV4dHVyZVVuaXRzW2ldID0gbnVsbFxuICAgIH1cbiAgICB2YWx1ZXModGV4dHVyZVNldCkuZm9yRWFjaChkZXN0cm95KVxuXG4gICAgc3RhdHMuY3ViZUNvdW50ID0gMFxuICAgIHN0YXRzLnRleHR1cmVDb3VudCA9IDBcbiAgfVxuXG4gIGlmIChjb25maWcucHJvZmlsZSkge1xuICAgIHN0YXRzLmdldFRvdGFsVGV4dHVyZVNpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgdG90YWwgPSAwXG4gICAgICBPYmplY3Qua2V5cyh0ZXh0dXJlU2V0KS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgdG90YWwgKz0gdGV4dHVyZVNldFtrZXldLnN0YXRzLnNpemVcbiAgICAgIH0pXG4gICAgICByZXR1cm4gdG90YWxcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiByZXN0b3JlVGV4dHVyZXMgKCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtVGV4VW5pdHM7ICsraSkge1xuICAgICAgdmFyIHRleCA9IHRleHR1cmVVbml0c1tpXVxuICAgICAgaWYgKHRleCkge1xuICAgICAgICB0ZXguYmluZENvdW50ID0gMFxuICAgICAgICB0ZXgudW5pdCA9IC0xXG4gICAgICAgIHRleHR1cmVVbml0c1tpXSA9IG51bGxcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YWx1ZXModGV4dHVyZVNldCkuZm9yRWFjaChmdW5jdGlvbiAodGV4dHVyZSkge1xuICAgICAgdGV4dHVyZS50ZXh0dXJlID0gZ2wuY3JlYXRlVGV4dHVyZSgpXG4gICAgICBnbC5iaW5kVGV4dHVyZSh0ZXh0dXJlLnRhcmdldCwgdGV4dHVyZS50ZXh0dXJlKVxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAzMjsgKytpKSB7XG4gICAgICAgIGlmICgodGV4dHVyZS5taXBtYXNrICYgKDEgPDwgaSkpID09PSAwKSB7XG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgICBpZiAodGV4dHVyZS50YXJnZXQgPT09IEdMX1RFWFRVUkVfMkQkMSkge1xuICAgICAgICAgIGdsLnRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCQxLFxuICAgICAgICAgICAgaSxcbiAgICAgICAgICAgIHRleHR1cmUuaW50ZXJuYWxmb3JtYXQsXG4gICAgICAgICAgICB0ZXh0dXJlLndpZHRoID4+IGksXG4gICAgICAgICAgICB0ZXh0dXJlLmhlaWdodCA+PiBpLFxuICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIHRleHR1cmUuaW50ZXJuYWxmb3JtYXQsXG4gICAgICAgICAgICB0ZXh0dXJlLnR5cGUsXG4gICAgICAgICAgICBudWxsKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgNjsgKytqKSB7XG4gICAgICAgICAgICBnbC50ZXhJbWFnZTJEKEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCQxICsgaixcbiAgICAgICAgICAgICAgaSxcbiAgICAgICAgICAgICAgdGV4dHVyZS5pbnRlcm5hbGZvcm1hdCxcbiAgICAgICAgICAgICAgdGV4dHVyZS53aWR0aCA+PiBpLFxuICAgICAgICAgICAgICB0ZXh0dXJlLmhlaWdodCA+PiBpLFxuICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICB0ZXh0dXJlLmludGVybmFsZm9ybWF0LFxuICAgICAgICAgICAgICB0ZXh0dXJlLnR5cGUsXG4gICAgICAgICAgICAgIG51bGwpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBzZXRUZXhJbmZvKHRleHR1cmUudGV4SW5mbywgdGV4dHVyZS50YXJnZXQpXG4gICAgfSlcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlZnJlc2hUZXh0dXJlcyAoKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1UZXhVbml0czsgKytpKSB7XG4gICAgICB2YXIgdGV4ID0gdGV4dHVyZVVuaXRzW2ldXG4gICAgICBpZiAodGV4KSB7XG4gICAgICAgIHRleC5iaW5kQ291bnQgPSAwXG4gICAgICAgIHRleC51bml0ID0gLTFcbiAgICAgICAgdGV4dHVyZVVuaXRzW2ldID0gbnVsbFxuICAgICAgfVxuICAgICAgZ2wuYWN0aXZlVGV4dHVyZShHTF9URVhUVVJFMCQxICsgaSlcbiAgICAgIGdsLmJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQkMSwgbnVsbClcbiAgICAgIGdsLmJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfQ1VCRV9NQVAkMSwgbnVsbClcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGNyZWF0ZTJEOiBjcmVhdGVUZXh0dXJlMkQsXG4gICAgY3JlYXRlQ3ViZTogY3JlYXRlVGV4dHVyZUN1YmUsXG4gICAgY2xlYXI6IGRlc3Ryb3lUZXh0dXJlcyxcbiAgICBnZXRUZXh0dXJlOiBmdW5jdGlvbiAod3JhcHBlcikge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9LFxuICAgIHJlc3RvcmU6IHJlc3RvcmVUZXh0dXJlcyxcbiAgICByZWZyZXNoOiByZWZyZXNoVGV4dHVyZXNcbiAgfVxufVxuXG52YXIgR0xfUkVOREVSQlVGRkVSID0gMHg4RDQxXG5cbnZhciBHTF9SR0JBNCQxID0gMHg4MDU2XG52YXIgR0xfUkdCNV9BMSQxID0gMHg4MDU3XG52YXIgR0xfUkdCNTY1JDEgPSAweDhENjJcbnZhciBHTF9ERVBUSF9DT01QT05FTlQxNiA9IDB4ODFBNVxudmFyIEdMX1NURU5DSUxfSU5ERVg4ID0gMHg4RDQ4XG52YXIgR0xfREVQVEhfU1RFTkNJTCQxID0gMHg4NEY5XG5cbnZhciBHTF9TUkdCOF9BTFBIQThfRVhUID0gMHg4QzQzXG5cbnZhciBHTF9SR0JBMzJGX0VYVCA9IDB4ODgxNFxuXG52YXIgR0xfUkdCQTE2Rl9FWFQgPSAweDg4MUFcbnZhciBHTF9SR0IxNkZfRVhUID0gMHg4ODFCXG5cbnZhciBGT1JNQVRfU0laRVMgPSBbXVxuXG5GT1JNQVRfU0laRVNbR0xfUkdCQTQkMV0gPSAyXG5GT1JNQVRfU0laRVNbR0xfUkdCNV9BMSQxXSA9IDJcbkZPUk1BVF9TSVpFU1tHTF9SR0I1NjUkMV0gPSAyXG5cbkZPUk1BVF9TSVpFU1tHTF9ERVBUSF9DT01QT05FTlQxNl0gPSAyXG5GT1JNQVRfU0laRVNbR0xfU1RFTkNJTF9JTkRFWDhdID0gMVxuRk9STUFUX1NJWkVTW0dMX0RFUFRIX1NURU5DSUwkMV0gPSA0XG5cbkZPUk1BVF9TSVpFU1tHTF9TUkdCOF9BTFBIQThfRVhUXSA9IDRcbkZPUk1BVF9TSVpFU1tHTF9SR0JBMzJGX0VYVF0gPSAxNlxuRk9STUFUX1NJWkVTW0dMX1JHQkExNkZfRVhUXSA9IDhcbkZPUk1BVF9TSVpFU1tHTF9SR0IxNkZfRVhUXSA9IDZcblxuZnVuY3Rpb24gZ2V0UmVuZGVyYnVmZmVyU2l6ZSAoZm9ybWF0LCB3aWR0aCwgaGVpZ2h0KSB7XG4gIHJldHVybiBGT1JNQVRfU0laRVNbZm9ybWF0XSAqIHdpZHRoICogaGVpZ2h0XG59XG5cbnZhciB3cmFwUmVuZGVyYnVmZmVycyA9IGZ1bmN0aW9uIChnbCwgZXh0ZW5zaW9ucywgbGltaXRzLCBzdGF0cywgY29uZmlnKSB7XG4gIHZhciBmb3JtYXRUeXBlcyA9IHtcbiAgICAncmdiYTQnOiBHTF9SR0JBNCQxLFxuICAgICdyZ2I1NjUnOiBHTF9SR0I1NjUkMSxcbiAgICAncmdiNSBhMSc6IEdMX1JHQjVfQTEkMSxcbiAgICAnZGVwdGgnOiBHTF9ERVBUSF9DT01QT05FTlQxNixcbiAgICAnc3RlbmNpbCc6IEdMX1NURU5DSUxfSU5ERVg4LFxuICAgICdkZXB0aCBzdGVuY2lsJzogR0xfREVQVEhfU1RFTkNJTCQxXG4gIH1cblxuICBpZiAoZXh0ZW5zaW9ucy5leHRfc3JnYikge1xuICAgIGZvcm1hdFR5cGVzWydzcmdiYSddID0gR0xfU1JHQjhfQUxQSEE4X0VYVFxuICB9XG5cbiAgaWYgKGV4dGVuc2lvbnMuZXh0X2NvbG9yX2J1ZmZlcl9oYWxmX2Zsb2F0KSB7XG4gICAgZm9ybWF0VHlwZXNbJ3JnYmExNmYnXSA9IEdMX1JHQkExNkZfRVhUXG4gICAgZm9ybWF0VHlwZXNbJ3JnYjE2ZiddID0gR0xfUkdCMTZGX0VYVFxuICB9XG5cbiAgaWYgKGV4dGVuc2lvbnMud2ViZ2xfY29sb3JfYnVmZmVyX2Zsb2F0KSB7XG4gICAgZm9ybWF0VHlwZXNbJ3JnYmEzMmYnXSA9IEdMX1JHQkEzMkZfRVhUXG4gIH1cblxuICB2YXIgZm9ybWF0VHlwZXNJbnZlcnQgPSBbXVxuICBPYmplY3Qua2V5cyhmb3JtYXRUeXBlcykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgdmFyIHZhbCA9IGZvcm1hdFR5cGVzW2tleV1cbiAgICBmb3JtYXRUeXBlc0ludmVydFt2YWxdID0ga2V5XG4gIH0pXG5cbiAgdmFyIHJlbmRlcmJ1ZmZlckNvdW50ID0gMFxuICB2YXIgcmVuZGVyYnVmZmVyU2V0ID0ge31cblxuICBmdW5jdGlvbiBSRUdMUmVuZGVyYnVmZmVyIChyZW5kZXJidWZmZXIpIHtcbiAgICB0aGlzLmlkID0gcmVuZGVyYnVmZmVyQ291bnQrK1xuICAgIHRoaXMucmVmQ291bnQgPSAxXG5cbiAgICB0aGlzLnJlbmRlcmJ1ZmZlciA9IHJlbmRlcmJ1ZmZlclxuXG4gICAgdGhpcy5mb3JtYXQgPSBHTF9SR0JBNCQxXG4gICAgdGhpcy53aWR0aCA9IDBcbiAgICB0aGlzLmhlaWdodCA9IDBcblxuICAgIGlmIChjb25maWcucHJvZmlsZSkge1xuICAgICAgdGhpcy5zdGF0cyA9IHsgc2l6ZTogMCB9XG4gICAgfVxuICB9XG5cbiAgUkVHTFJlbmRlcmJ1ZmZlci5wcm90b3R5cGUuZGVjUmVmID0gZnVuY3Rpb24gKCkge1xuICAgIGlmICgtLXRoaXMucmVmQ291bnQgPD0gMCkge1xuICAgICAgZGVzdHJveSh0aGlzKVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGRlc3Ryb3kgKHJiKSB7XG4gICAgdmFyIGhhbmRsZSA9IHJiLnJlbmRlcmJ1ZmZlclxuICAgIGNoZWNrJDEoaGFuZGxlLCAnbXVzdCBub3QgZG91YmxlIGRlc3Ryb3kgcmVuZGVyYnVmZmVyJylcbiAgICBnbC5iaW5kUmVuZGVyYnVmZmVyKEdMX1JFTkRFUkJVRkZFUiwgbnVsbClcbiAgICBnbC5kZWxldGVSZW5kZXJidWZmZXIoaGFuZGxlKVxuICAgIHJiLnJlbmRlcmJ1ZmZlciA9IG51bGxcbiAgICByYi5yZWZDb3VudCA9IDBcbiAgICBkZWxldGUgcmVuZGVyYnVmZmVyU2V0W3JiLmlkXVxuICAgIHN0YXRzLnJlbmRlcmJ1ZmZlckNvdW50LS1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZVJlbmRlcmJ1ZmZlciAoYSwgYikge1xuICAgIHZhciByZW5kZXJidWZmZXIgPSBuZXcgUkVHTFJlbmRlcmJ1ZmZlcihnbC5jcmVhdGVSZW5kZXJidWZmZXIoKSlcbiAgICByZW5kZXJidWZmZXJTZXRbcmVuZGVyYnVmZmVyLmlkXSA9IHJlbmRlcmJ1ZmZlclxuICAgIHN0YXRzLnJlbmRlcmJ1ZmZlckNvdW50KytcblxuICAgIGZ1bmN0aW9uIHJlZ2xSZW5kZXJidWZmZXIgKGEsIGIpIHtcbiAgICAgIHZhciB3ID0gMFxuICAgICAgdmFyIGggPSAwXG4gICAgICB2YXIgZm9ybWF0ID0gR0xfUkdCQTQkMVxuXG4gICAgICBpZiAodHlwZW9mIGEgPT09ICdvYmplY3QnICYmIGEpIHtcbiAgICAgICAgdmFyIG9wdGlvbnMgPSBhXG4gICAgICAgIGlmICgnc2hhcGUnIGluIG9wdGlvbnMpIHtcbiAgICAgICAgICB2YXIgc2hhcGUgPSBvcHRpb25zLnNoYXBlXG4gICAgICAgICAgY2hlY2skMShBcnJheS5pc0FycmF5KHNoYXBlKSAmJiBzaGFwZS5sZW5ndGggPj0gMixcbiAgICAgICAgICAgICdpbnZhbGlkIHJlbmRlcmJ1ZmZlciBzaGFwZScpXG4gICAgICAgICAgdyA9IHNoYXBlWzBdIHwgMFxuICAgICAgICAgIGggPSBzaGFwZVsxXSB8IDBcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoJ3JhZGl1cycgaW4gb3B0aW9ucykge1xuICAgICAgICAgICAgdyA9IGggPSBvcHRpb25zLnJhZGl1cyB8IDBcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCd3aWR0aCcgaW4gb3B0aW9ucykge1xuICAgICAgICAgICAgdyA9IG9wdGlvbnMud2lkdGggfCAwXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICgnaGVpZ2h0JyBpbiBvcHRpb25zKSB7XG4gICAgICAgICAgICBoID0gb3B0aW9ucy5oZWlnaHQgfCAwXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICgnZm9ybWF0JyBpbiBvcHRpb25zKSB7XG4gICAgICAgICAgY2hlY2skMS5wYXJhbWV0ZXIob3B0aW9ucy5mb3JtYXQsIGZvcm1hdFR5cGVzLFxuICAgICAgICAgICAgJ2ludmFsaWQgcmVuZGVyYnVmZmVyIGZvcm1hdCcpXG4gICAgICAgICAgZm9ybWF0ID0gZm9ybWF0VHlwZXNbb3B0aW9ucy5mb3JtYXRdXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGEgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHcgPSBhIHwgMFxuICAgICAgICBpZiAodHlwZW9mIGIgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgaCA9IGIgfCAwXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaCA9IHdcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICghYSkge1xuICAgICAgICB3ID0gaCA9IDFcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNoZWNrJDEucmFpc2UoJ2ludmFsaWQgYXJndW1lbnRzIHRvIHJlbmRlcmJ1ZmZlciBjb25zdHJ1Y3RvcicpXG4gICAgICB9XG5cbiAgICAgIC8vIGNoZWNrIHNoYXBlXG4gICAgICBjaGVjayQxKFxuICAgICAgICB3ID4gMCAmJiBoID4gMCAmJlxuICAgICAgICB3IDw9IGxpbWl0cy5tYXhSZW5kZXJidWZmZXJTaXplICYmIGggPD0gbGltaXRzLm1heFJlbmRlcmJ1ZmZlclNpemUsXG4gICAgICAgICdpbnZhbGlkIHJlbmRlcmJ1ZmZlciBzaXplJylcblxuICAgICAgaWYgKHcgPT09IHJlbmRlcmJ1ZmZlci53aWR0aCAmJlxuICAgICAgICAgIGggPT09IHJlbmRlcmJ1ZmZlci5oZWlnaHQgJiZcbiAgICAgICAgICBmb3JtYXQgPT09IHJlbmRlcmJ1ZmZlci5mb3JtYXQpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIHJlZ2xSZW5kZXJidWZmZXIud2lkdGggPSByZW5kZXJidWZmZXIud2lkdGggPSB3XG4gICAgICByZWdsUmVuZGVyYnVmZmVyLmhlaWdodCA9IHJlbmRlcmJ1ZmZlci5oZWlnaHQgPSBoXG4gICAgICByZW5kZXJidWZmZXIuZm9ybWF0ID0gZm9ybWF0XG5cbiAgICAgIGdsLmJpbmRSZW5kZXJidWZmZXIoR0xfUkVOREVSQlVGRkVSLCByZW5kZXJidWZmZXIucmVuZGVyYnVmZmVyKVxuICAgICAgZ2wucmVuZGVyYnVmZmVyU3RvcmFnZShHTF9SRU5ERVJCVUZGRVIsIGZvcm1hdCwgdywgaClcblxuICAgICAgY2hlY2skMShcbiAgICAgICAgZ2wuZ2V0RXJyb3IoKSA9PT0gMCxcbiAgICAgICAgJ2ludmFsaWQgcmVuZGVyIGJ1ZmZlciBmb3JtYXQnKVxuXG4gICAgICBpZiAoY29uZmlnLnByb2ZpbGUpIHtcbiAgICAgICAgcmVuZGVyYnVmZmVyLnN0YXRzLnNpemUgPSBnZXRSZW5kZXJidWZmZXJTaXplKHJlbmRlcmJ1ZmZlci5mb3JtYXQsIHJlbmRlcmJ1ZmZlci53aWR0aCwgcmVuZGVyYnVmZmVyLmhlaWdodClcbiAgICAgIH1cbiAgICAgIHJlZ2xSZW5kZXJidWZmZXIuZm9ybWF0ID0gZm9ybWF0VHlwZXNJbnZlcnRbcmVuZGVyYnVmZmVyLmZvcm1hdF1cblxuICAgICAgcmV0dXJuIHJlZ2xSZW5kZXJidWZmZXJcbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZXNpemUgKHdfLCBoXykge1xuICAgICAgdmFyIHcgPSB3XyB8IDBcbiAgICAgIHZhciBoID0gKGhfIHwgMCkgfHwgd1xuXG4gICAgICBpZiAodyA9PT0gcmVuZGVyYnVmZmVyLndpZHRoICYmIGggPT09IHJlbmRlcmJ1ZmZlci5oZWlnaHQpIHtcbiAgICAgICAgcmV0dXJuIHJlZ2xSZW5kZXJidWZmZXJcbiAgICAgIH1cblxuICAgICAgLy8gY2hlY2sgc2hhcGVcbiAgICAgIGNoZWNrJDEoXG4gICAgICAgIHcgPiAwICYmIGggPiAwICYmXG4gICAgICAgIHcgPD0gbGltaXRzLm1heFJlbmRlcmJ1ZmZlclNpemUgJiYgaCA8PSBsaW1pdHMubWF4UmVuZGVyYnVmZmVyU2l6ZSxcbiAgICAgICAgJ2ludmFsaWQgcmVuZGVyYnVmZmVyIHNpemUnKVxuXG4gICAgICByZWdsUmVuZGVyYnVmZmVyLndpZHRoID0gcmVuZGVyYnVmZmVyLndpZHRoID0gd1xuICAgICAgcmVnbFJlbmRlcmJ1ZmZlci5oZWlnaHQgPSByZW5kZXJidWZmZXIuaGVpZ2h0ID0gaFxuXG4gICAgICBnbC5iaW5kUmVuZGVyYnVmZmVyKEdMX1JFTkRFUkJVRkZFUiwgcmVuZGVyYnVmZmVyLnJlbmRlcmJ1ZmZlcilcbiAgICAgIGdsLnJlbmRlcmJ1ZmZlclN0b3JhZ2UoR0xfUkVOREVSQlVGRkVSLCByZW5kZXJidWZmZXIuZm9ybWF0LCB3LCBoKVxuXG4gICAgICBjaGVjayQxKFxuICAgICAgICBnbC5nZXRFcnJvcigpID09PSAwLFxuICAgICAgICAnaW52YWxpZCByZW5kZXIgYnVmZmVyIGZvcm1hdCcpXG5cbiAgICAgIC8vIGFsc28sIHJlY29tcHV0ZSBzaXplLlxuICAgICAgaWYgKGNvbmZpZy5wcm9maWxlKSB7XG4gICAgICAgIHJlbmRlcmJ1ZmZlci5zdGF0cy5zaXplID0gZ2V0UmVuZGVyYnVmZmVyU2l6ZShcbiAgICAgICAgICByZW5kZXJidWZmZXIuZm9ybWF0LCByZW5kZXJidWZmZXIud2lkdGgsIHJlbmRlcmJ1ZmZlci5oZWlnaHQpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZWdsUmVuZGVyYnVmZmVyXG4gICAgfVxuXG4gICAgcmVnbFJlbmRlcmJ1ZmZlcihhLCBiKVxuXG4gICAgcmVnbFJlbmRlcmJ1ZmZlci5yZXNpemUgPSByZXNpemVcbiAgICByZWdsUmVuZGVyYnVmZmVyLl9yZWdsVHlwZSA9ICdyZW5kZXJidWZmZXInXG4gICAgcmVnbFJlbmRlcmJ1ZmZlci5fcmVuZGVyYnVmZmVyID0gcmVuZGVyYnVmZmVyXG4gICAgaWYgKGNvbmZpZy5wcm9maWxlKSB7XG4gICAgICByZWdsUmVuZGVyYnVmZmVyLnN0YXRzID0gcmVuZGVyYnVmZmVyLnN0YXRzXG4gICAgfVxuICAgIHJlZ2xSZW5kZXJidWZmZXIuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJlbmRlcmJ1ZmZlci5kZWNSZWYoKVxuICAgIH1cblxuICAgIHJldHVybiByZWdsUmVuZGVyYnVmZmVyXG4gIH1cblxuICBpZiAoY29uZmlnLnByb2ZpbGUpIHtcbiAgICBzdGF0cy5nZXRUb3RhbFJlbmRlcmJ1ZmZlclNpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgdG90YWwgPSAwXG4gICAgICBPYmplY3Qua2V5cyhyZW5kZXJidWZmZXJTZXQpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICB0b3RhbCArPSByZW5kZXJidWZmZXJTZXRba2V5XS5zdGF0cy5zaXplXG4gICAgICB9KVxuICAgICAgcmV0dXJuIHRvdGFsXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcmVzdG9yZVJlbmRlcmJ1ZmZlcnMgKCkge1xuICAgIHZhbHVlcyhyZW5kZXJidWZmZXJTZXQpLmZvckVhY2goZnVuY3Rpb24gKHJiKSB7XG4gICAgICByYi5yZW5kZXJidWZmZXIgPSBnbC5jcmVhdGVSZW5kZXJidWZmZXIoKVxuICAgICAgZ2wuYmluZFJlbmRlcmJ1ZmZlcihHTF9SRU5ERVJCVUZGRVIsIHJiLnJlbmRlcmJ1ZmZlcilcbiAgICAgIGdsLnJlbmRlcmJ1ZmZlclN0b3JhZ2UoR0xfUkVOREVSQlVGRkVSLCByYi5mb3JtYXQsIHJiLndpZHRoLCByYi5oZWlnaHQpXG4gICAgfSlcbiAgICBnbC5iaW5kUmVuZGVyYnVmZmVyKEdMX1JFTkRFUkJVRkZFUiwgbnVsbClcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgY3JlYXRlOiBjcmVhdGVSZW5kZXJidWZmZXIsXG4gICAgY2xlYXI6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhbHVlcyhyZW5kZXJidWZmZXJTZXQpLmZvckVhY2goZGVzdHJveSlcbiAgICB9LFxuICAgIHJlc3RvcmU6IHJlc3RvcmVSZW5kZXJidWZmZXJzXG4gIH1cbn1cblxuLy8gV2Ugc3RvcmUgdGhlc2UgY29uc3RhbnRzIHNvIHRoYXQgdGhlIG1pbmlmaWVyIGNhbiBpbmxpbmUgdGhlbVxudmFyIEdMX0ZSQU1FQlVGRkVSJDEgPSAweDhENDBcbnZhciBHTF9SRU5ERVJCVUZGRVIkMSA9IDB4OEQ0MVxuXG52YXIgR0xfVEVYVFVSRV8yRCQyID0gMHgwREUxXG52YXIgR0xfVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YJDIgPSAweDg1MTVcblxudmFyIEdMX0NPTE9SX0FUVEFDSE1FTlQwJDEgPSAweDhDRTBcbnZhciBHTF9ERVBUSF9BVFRBQ0hNRU5UID0gMHg4RDAwXG52YXIgR0xfU1RFTkNJTF9BVFRBQ0hNRU5UID0gMHg4RDIwXG52YXIgR0xfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UID0gMHg4MjFBXG5cbnZhciBHTF9GUkFNRUJVRkZFUl9DT01QTEVURSQxID0gMHg4Q0Q1XG52YXIgR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9BVFRBQ0hNRU5UID0gMHg4Q0Q2XG52YXIgR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9NSVNTSU5HX0FUVEFDSE1FTlQgPSAweDhDRDdcbnZhciBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0RJTUVOU0lPTlMgPSAweDhDRDlcbnZhciBHTF9GUkFNRUJVRkZFUl9VTlNVUFBPUlRFRCA9IDB4OENERFxuXG52YXIgR0xfSEFMRl9GTE9BVF9PRVMkMiA9IDB4OEQ2MVxudmFyIEdMX1VOU0lHTkVEX0JZVEUkNiA9IDB4MTQwMVxudmFyIEdMX0ZMT0FUJDUgPSAweDE0MDZcblxudmFyIEdMX1JHQiQxID0gMHgxOTA3XG52YXIgR0xfUkdCQSQyID0gMHgxOTA4XG5cbnZhciBHTF9ERVBUSF9DT01QT05FTlQkMSA9IDB4MTkwMlxuXG52YXIgY29sb3JUZXh0dXJlRm9ybWF0RW51bXMgPSBbXG4gIEdMX1JHQiQxLFxuICBHTF9SR0JBJDJcbl1cblxuLy8gZm9yIGV2ZXJ5IHRleHR1cmUgZm9ybWF0LCBzdG9yZVxuLy8gdGhlIG51bWJlciBvZiBjaGFubmVsc1xudmFyIHRleHR1cmVGb3JtYXRDaGFubmVscyA9IFtdXG50ZXh0dXJlRm9ybWF0Q2hhbm5lbHNbR0xfUkdCQSQyXSA9IDRcbnRleHR1cmVGb3JtYXRDaGFubmVsc1tHTF9SR0IkMV0gPSAzXG5cbi8vIGZvciBldmVyeSB0ZXh0dXJlIHR5cGUsIHN0b3JlXG4vLyB0aGUgc2l6ZSBpbiBieXRlcy5cbnZhciB0ZXh0dXJlVHlwZVNpemVzID0gW11cbnRleHR1cmVUeXBlU2l6ZXNbR0xfVU5TSUdORURfQllURSQ2XSA9IDFcbnRleHR1cmVUeXBlU2l6ZXNbR0xfRkxPQVQkNV0gPSA0XG50ZXh0dXJlVHlwZVNpemVzW0dMX0hBTEZfRkxPQVRfT0VTJDJdID0gMlxuXG52YXIgR0xfUkdCQTQkMiA9IDB4ODA1NlxudmFyIEdMX1JHQjVfQTEkMiA9IDB4ODA1N1xudmFyIEdMX1JHQjU2NSQyID0gMHg4RDYyXG52YXIgR0xfREVQVEhfQ09NUE9ORU5UMTYkMSA9IDB4ODFBNVxudmFyIEdMX1NURU5DSUxfSU5ERVg4JDEgPSAweDhENDhcbnZhciBHTF9ERVBUSF9TVEVOQ0lMJDIgPSAweDg0RjlcblxudmFyIEdMX1NSR0I4X0FMUEhBOF9FWFQkMSA9IDB4OEM0M1xuXG52YXIgR0xfUkdCQTMyRl9FWFQkMSA9IDB4ODgxNFxuXG52YXIgR0xfUkdCQTE2Rl9FWFQkMSA9IDB4ODgxQVxudmFyIEdMX1JHQjE2Rl9FWFQkMSA9IDB4ODgxQlxuXG52YXIgY29sb3JSZW5kZXJidWZmZXJGb3JtYXRFbnVtcyA9IFtcbiAgR0xfUkdCQTQkMixcbiAgR0xfUkdCNV9BMSQyLFxuICBHTF9SR0I1NjUkMixcbiAgR0xfU1JHQjhfQUxQSEE4X0VYVCQxLFxuICBHTF9SR0JBMTZGX0VYVCQxLFxuICBHTF9SR0IxNkZfRVhUJDEsXG4gIEdMX1JHQkEzMkZfRVhUJDFcbl1cblxudmFyIHN0YXR1c0NvZGUgPSB7fVxuc3RhdHVzQ29kZVtHTF9GUkFNRUJVRkZFUl9DT01QTEVURSQxXSA9ICdjb21wbGV0ZSdcbnN0YXR1c0NvZGVbR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9BVFRBQ0hNRU5UXSA9ICdpbmNvbXBsZXRlIGF0dGFjaG1lbnQnXG5zdGF0dXNDb2RlW0dMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfRElNRU5TSU9OU10gPSAnaW5jb21wbGV0ZSBkaW1lbnNpb25zJ1xuc3RhdHVzQ29kZVtHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX01JU1NJTkdfQVRUQUNITUVOVF0gPSAnaW5jb21wbGV0ZSwgbWlzc2luZyBhdHRhY2htZW50J1xuc3RhdHVzQ29kZVtHTF9GUkFNRUJVRkZFUl9VTlNVUFBPUlRFRF0gPSAndW5zdXBwb3J0ZWQnXG5cbmZ1bmN0aW9uIHdyYXBGQk9TdGF0ZSAoXG4gIGdsLFxuICBleHRlbnNpb25zLFxuICBsaW1pdHMsXG4gIHRleHR1cmVTdGF0ZSxcbiAgcmVuZGVyYnVmZmVyU3RhdGUsXG4gIHN0YXRzKSB7XG4gIHZhciBmcmFtZWJ1ZmZlclN0YXRlID0ge1xuICAgIGN1cjogbnVsbCxcbiAgICBuZXh0OiBudWxsLFxuICAgIGRpcnR5OiBmYWxzZSxcbiAgICBzZXRGQk86IG51bGxcbiAgfVxuXG4gIHZhciBjb2xvclRleHR1cmVGb3JtYXRzID0gWydyZ2JhJ11cbiAgdmFyIGNvbG9yUmVuZGVyYnVmZmVyRm9ybWF0cyA9IFsncmdiYTQnLCAncmdiNTY1JywgJ3JnYjUgYTEnXVxuXG4gIGlmIChleHRlbnNpb25zLmV4dF9zcmdiKSB7XG4gICAgY29sb3JSZW5kZXJidWZmZXJGb3JtYXRzLnB1c2goJ3NyZ2JhJylcbiAgfVxuXG4gIGlmIChleHRlbnNpb25zLmV4dF9jb2xvcl9idWZmZXJfaGFsZl9mbG9hdCkge1xuICAgIGNvbG9yUmVuZGVyYnVmZmVyRm9ybWF0cy5wdXNoKCdyZ2JhMTZmJywgJ3JnYjE2ZicpXG4gIH1cblxuICBpZiAoZXh0ZW5zaW9ucy53ZWJnbF9jb2xvcl9idWZmZXJfZmxvYXQpIHtcbiAgICBjb2xvclJlbmRlcmJ1ZmZlckZvcm1hdHMucHVzaCgncmdiYTMyZicpXG4gIH1cblxuICB2YXIgY29sb3JUeXBlcyA9IFsndWludDgnXVxuICBpZiAoZXh0ZW5zaW9ucy5vZXNfdGV4dHVyZV9oYWxmX2Zsb2F0KSB7XG4gICAgY29sb3JUeXBlcy5wdXNoKCdoYWxmIGZsb2F0JywgJ2Zsb2F0MTYnKVxuICB9XG4gIGlmIChleHRlbnNpb25zLm9lc190ZXh0dXJlX2Zsb2F0KSB7XG4gICAgY29sb3JUeXBlcy5wdXNoKCdmbG9hdCcsICdmbG9hdDMyJylcbiAgfVxuXG4gIGZ1bmN0aW9uIEZyYW1lYnVmZmVyQXR0YWNobWVudCAodGFyZ2V0LCB0ZXh0dXJlLCByZW5kZXJidWZmZXIpIHtcbiAgICB0aGlzLnRhcmdldCA9IHRhcmdldFxuICAgIHRoaXMudGV4dHVyZSA9IHRleHR1cmVcbiAgICB0aGlzLnJlbmRlcmJ1ZmZlciA9IHJlbmRlcmJ1ZmZlclxuXG4gICAgdmFyIHcgPSAwXG4gICAgdmFyIGggPSAwXG4gICAgaWYgKHRleHR1cmUpIHtcbiAgICAgIHcgPSB0ZXh0dXJlLndpZHRoXG4gICAgICBoID0gdGV4dHVyZS5oZWlnaHRcbiAgICB9IGVsc2UgaWYgKHJlbmRlcmJ1ZmZlcikge1xuICAgICAgdyA9IHJlbmRlcmJ1ZmZlci53aWR0aFxuICAgICAgaCA9IHJlbmRlcmJ1ZmZlci5oZWlnaHRcbiAgICB9XG4gICAgdGhpcy53aWR0aCA9IHdcbiAgICB0aGlzLmhlaWdodCA9IGhcbiAgfVxuXG4gIGZ1bmN0aW9uIGRlY1JlZiAoYXR0YWNobWVudCkge1xuICAgIGlmIChhdHRhY2htZW50KSB7XG4gICAgICBpZiAoYXR0YWNobWVudC50ZXh0dXJlKSB7XG4gICAgICAgIGF0dGFjaG1lbnQudGV4dHVyZS5fdGV4dHVyZS5kZWNSZWYoKVxuICAgICAgfVxuICAgICAgaWYgKGF0dGFjaG1lbnQucmVuZGVyYnVmZmVyKSB7XG4gICAgICAgIGF0dGFjaG1lbnQucmVuZGVyYnVmZmVyLl9yZW5kZXJidWZmZXIuZGVjUmVmKClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBpbmNSZWZBbmRDaGVja1NoYXBlIChhdHRhY2htZW50LCB3aWR0aCwgaGVpZ2h0KSB7XG4gICAgaWYgKCFhdHRhY2htZW50KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKGF0dGFjaG1lbnQudGV4dHVyZSkge1xuICAgICAgdmFyIHRleHR1cmUgPSBhdHRhY2htZW50LnRleHR1cmUuX3RleHR1cmVcbiAgICAgIHZhciB0dyA9IE1hdGgubWF4KDEsIHRleHR1cmUud2lkdGgpXG4gICAgICB2YXIgdGggPSBNYXRoLm1heCgxLCB0ZXh0dXJlLmhlaWdodClcbiAgICAgIGNoZWNrJDEodHcgPT09IHdpZHRoICYmIHRoID09PSBoZWlnaHQsXG4gICAgICAgICdpbmNvbnNpc3RlbnQgd2lkdGgvaGVpZ2h0IGZvciBzdXBwbGllZCB0ZXh0dXJlJylcbiAgICAgIHRleHR1cmUucmVmQ291bnQgKz0gMVxuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgcmVuZGVyYnVmZmVyID0gYXR0YWNobWVudC5yZW5kZXJidWZmZXIuX3JlbmRlcmJ1ZmZlclxuICAgICAgY2hlY2skMShcbiAgICAgICAgcmVuZGVyYnVmZmVyLndpZHRoID09PSB3aWR0aCAmJiByZW5kZXJidWZmZXIuaGVpZ2h0ID09PSBoZWlnaHQsXG4gICAgICAgICdpbmNvbnNpc3RlbnQgd2lkdGgvaGVpZ2h0IGZvciByZW5kZXJidWZmZXInKVxuICAgICAgcmVuZGVyYnVmZmVyLnJlZkNvdW50ICs9IDFcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBhdHRhY2ggKGxvY2F0aW9uLCBhdHRhY2htZW50KSB7XG4gICAgaWYgKGF0dGFjaG1lbnQpIHtcbiAgICAgIGlmIChhdHRhY2htZW50LnRleHR1cmUpIHtcbiAgICAgICAgZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoXG4gICAgICAgICAgR0xfRlJBTUVCVUZGRVIkMSxcbiAgICAgICAgICBsb2NhdGlvbixcbiAgICAgICAgICBhdHRhY2htZW50LnRhcmdldCxcbiAgICAgICAgICBhdHRhY2htZW50LnRleHR1cmUuX3RleHR1cmUudGV4dHVyZSxcbiAgICAgICAgICAwKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZ2wuZnJhbWVidWZmZXJSZW5kZXJidWZmZXIoXG4gICAgICAgICAgR0xfRlJBTUVCVUZGRVIkMSxcbiAgICAgICAgICBsb2NhdGlvbixcbiAgICAgICAgICBHTF9SRU5ERVJCVUZGRVIkMSxcbiAgICAgICAgICBhdHRhY2htZW50LnJlbmRlcmJ1ZmZlci5fcmVuZGVyYnVmZmVyLnJlbmRlcmJ1ZmZlcilcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBwYXJzZUF0dGFjaG1lbnQgKGF0dGFjaG1lbnQpIHtcbiAgICB2YXIgdGFyZ2V0ID0gR0xfVEVYVFVSRV8yRCQyXG4gICAgdmFyIHRleHR1cmUgPSBudWxsXG4gICAgdmFyIHJlbmRlcmJ1ZmZlciA9IG51bGxcblxuICAgIHZhciBkYXRhID0gYXR0YWNobWVudFxuICAgIGlmICh0eXBlb2YgYXR0YWNobWVudCA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGRhdGEgPSBhdHRhY2htZW50LmRhdGFcbiAgICAgIGlmICgndGFyZ2V0JyBpbiBhdHRhY2htZW50KSB7XG4gICAgICAgIHRhcmdldCA9IGF0dGFjaG1lbnQudGFyZ2V0IHwgMFxuICAgICAgfVxuICAgIH1cblxuICAgIGNoZWNrJDEudHlwZShkYXRhLCAnZnVuY3Rpb24nLCAnaW52YWxpZCBhdHRhY2htZW50IGRhdGEnKVxuXG4gICAgdmFyIHR5cGUgPSBkYXRhLl9yZWdsVHlwZVxuICAgIGlmICh0eXBlID09PSAndGV4dHVyZTJkJykge1xuICAgICAgdGV4dHVyZSA9IGRhdGFcbiAgICAgIGNoZWNrJDEodGFyZ2V0ID09PSBHTF9URVhUVVJFXzJEJDIpXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAndGV4dHVyZUN1YmUnKSB7XG4gICAgICB0ZXh0dXJlID0gZGF0YVxuICAgICAgY2hlY2skMShcbiAgICAgICAgdGFyZ2V0ID49IEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCQyICYmXG4gICAgICAgIHRhcmdldCA8IEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCQyICsgNixcbiAgICAgICAgJ2ludmFsaWQgY3ViZSBtYXAgdGFyZ2V0JylcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdyZW5kZXJidWZmZXInKSB7XG4gICAgICByZW5kZXJidWZmZXIgPSBkYXRhXG4gICAgICB0YXJnZXQgPSBHTF9SRU5ERVJCVUZGRVIkMVxuICAgIH0gZWxzZSB7XG4gICAgICBjaGVjayQxLnJhaXNlKCdpbnZhbGlkIHJlZ2wgb2JqZWN0IGZvciBhdHRhY2htZW50JylcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IEZyYW1lYnVmZmVyQXR0YWNobWVudCh0YXJnZXQsIHRleHR1cmUsIHJlbmRlcmJ1ZmZlcilcbiAgfVxuXG4gIGZ1bmN0aW9uIGFsbG9jQXR0YWNobWVudCAoXG4gICAgd2lkdGgsXG4gICAgaGVpZ2h0LFxuICAgIGlzVGV4dHVyZSxcbiAgICBmb3JtYXQsXG4gICAgdHlwZSkge1xuICAgIGlmIChpc1RleHR1cmUpIHtcbiAgICAgIHZhciB0ZXh0dXJlID0gdGV4dHVyZVN0YXRlLmNyZWF0ZTJEKHtcbiAgICAgICAgd2lkdGg6IHdpZHRoLFxuICAgICAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICAgICAgZm9ybWF0OiBmb3JtYXQsXG4gICAgICAgIHR5cGU6IHR5cGVcbiAgICAgIH0pXG4gICAgICB0ZXh0dXJlLl90ZXh0dXJlLnJlZkNvdW50ID0gMFxuICAgICAgcmV0dXJuIG5ldyBGcmFtZWJ1ZmZlckF0dGFjaG1lbnQoR0xfVEVYVFVSRV8yRCQyLCB0ZXh0dXJlLCBudWxsKVxuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgcmIgPSByZW5kZXJidWZmZXJTdGF0ZS5jcmVhdGUoe1xuICAgICAgICB3aWR0aDogd2lkdGgsXG4gICAgICAgIGhlaWdodDogaGVpZ2h0LFxuICAgICAgICBmb3JtYXQ6IGZvcm1hdFxuICAgICAgfSlcbiAgICAgIHJiLl9yZW5kZXJidWZmZXIucmVmQ291bnQgPSAwXG4gICAgICByZXR1cm4gbmV3IEZyYW1lYnVmZmVyQXR0YWNobWVudChHTF9SRU5ERVJCVUZGRVIkMSwgbnVsbCwgcmIpXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdW53cmFwQXR0YWNobWVudCAoYXR0YWNobWVudCkge1xuICAgIHJldHVybiBhdHRhY2htZW50ICYmIChhdHRhY2htZW50LnRleHR1cmUgfHwgYXR0YWNobWVudC5yZW5kZXJidWZmZXIpXG4gIH1cblxuICBmdW5jdGlvbiByZXNpemVBdHRhY2htZW50IChhdHRhY2htZW50LCB3LCBoKSB7XG4gICAgaWYgKGF0dGFjaG1lbnQpIHtcbiAgICAgIGlmIChhdHRhY2htZW50LnRleHR1cmUpIHtcbiAgICAgICAgYXR0YWNobWVudC50ZXh0dXJlLnJlc2l6ZSh3LCBoKVxuICAgICAgfSBlbHNlIGlmIChhdHRhY2htZW50LnJlbmRlcmJ1ZmZlcikge1xuICAgICAgICBhdHRhY2htZW50LnJlbmRlcmJ1ZmZlci5yZXNpemUodywgaClcbiAgICAgIH1cbiAgICAgIGF0dGFjaG1lbnQud2lkdGggPSB3XG4gICAgICBhdHRhY2htZW50LmhlaWdodCA9IGhcbiAgICB9XG4gIH1cblxuICB2YXIgZnJhbWVidWZmZXJDb3VudCA9IDBcbiAgdmFyIGZyYW1lYnVmZmVyU2V0ID0ge31cblxuICBmdW5jdGlvbiBSRUdMRnJhbWVidWZmZXIgKCkge1xuICAgIHRoaXMuaWQgPSBmcmFtZWJ1ZmZlckNvdW50KytcbiAgICBmcmFtZWJ1ZmZlclNldFt0aGlzLmlkXSA9IHRoaXNcblxuICAgIHRoaXMuZnJhbWVidWZmZXIgPSBnbC5jcmVhdGVGcmFtZWJ1ZmZlcigpXG4gICAgdGhpcy53aWR0aCA9IDBcbiAgICB0aGlzLmhlaWdodCA9IDBcblxuICAgIHRoaXMuY29sb3JBdHRhY2htZW50cyA9IFtdXG4gICAgdGhpcy5kZXB0aEF0dGFjaG1lbnQgPSBudWxsXG4gICAgdGhpcy5zdGVuY2lsQXR0YWNobWVudCA9IG51bGxcbiAgICB0aGlzLmRlcHRoU3RlbmNpbEF0dGFjaG1lbnQgPSBudWxsXG4gIH1cblxuICBmdW5jdGlvbiBkZWNGQk9SZWZzIChmcmFtZWJ1ZmZlcikge1xuICAgIGZyYW1lYnVmZmVyLmNvbG9yQXR0YWNobWVudHMuZm9yRWFjaChkZWNSZWYpXG4gICAgZGVjUmVmKGZyYW1lYnVmZmVyLmRlcHRoQXR0YWNobWVudClcbiAgICBkZWNSZWYoZnJhbWVidWZmZXIuc3RlbmNpbEF0dGFjaG1lbnQpXG4gICAgZGVjUmVmKGZyYW1lYnVmZmVyLmRlcHRoU3RlbmNpbEF0dGFjaG1lbnQpXG4gIH1cblxuICBmdW5jdGlvbiBkZXN0cm95IChmcmFtZWJ1ZmZlcikge1xuICAgIHZhciBoYW5kbGUgPSBmcmFtZWJ1ZmZlci5mcmFtZWJ1ZmZlclxuICAgIGNoZWNrJDEoaGFuZGxlLCAnbXVzdCBub3QgZG91YmxlIGRlc3Ryb3kgZnJhbWVidWZmZXInKVxuICAgIGdsLmRlbGV0ZUZyYW1lYnVmZmVyKGhhbmRsZSlcbiAgICBmcmFtZWJ1ZmZlci5mcmFtZWJ1ZmZlciA9IG51bGxcbiAgICBzdGF0cy5mcmFtZWJ1ZmZlckNvdW50LS1cbiAgICBkZWxldGUgZnJhbWVidWZmZXJTZXRbZnJhbWVidWZmZXIuaWRdXG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVGcmFtZWJ1ZmZlciAoZnJhbWVidWZmZXIpIHtcbiAgICB2YXIgaVxuXG4gICAgZ2wuYmluZEZyYW1lYnVmZmVyKEdMX0ZSQU1FQlVGRkVSJDEsIGZyYW1lYnVmZmVyLmZyYW1lYnVmZmVyKVxuICAgIHZhciBjb2xvckF0dGFjaG1lbnRzID0gZnJhbWVidWZmZXIuY29sb3JBdHRhY2htZW50c1xuICAgIGZvciAoaSA9IDA7IGkgPCBjb2xvckF0dGFjaG1lbnRzLmxlbmd0aDsgKytpKSB7XG4gICAgICBhdHRhY2goR0xfQ09MT1JfQVRUQUNITUVOVDAkMSArIGksIGNvbG9yQXR0YWNobWVudHNbaV0pXG4gICAgfVxuICAgIGZvciAoaSA9IGNvbG9yQXR0YWNobWVudHMubGVuZ3RoOyBpIDwgbGltaXRzLm1heENvbG9yQXR0YWNobWVudHM7ICsraSkge1xuICAgICAgZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoXG4gICAgICAgIEdMX0ZSQU1FQlVGRkVSJDEsXG4gICAgICAgIEdMX0NPTE9SX0FUVEFDSE1FTlQwJDEgKyBpLFxuICAgICAgICBHTF9URVhUVVJFXzJEJDIsXG4gICAgICAgIG51bGwsXG4gICAgICAgIDApXG4gICAgfVxuXG4gICAgZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoXG4gICAgICBHTF9GUkFNRUJVRkZFUiQxLFxuICAgICAgR0xfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5ULFxuICAgICAgR0xfVEVYVFVSRV8yRCQyLFxuICAgICAgbnVsbCxcbiAgICAgIDApXG4gICAgZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoXG4gICAgICBHTF9GUkFNRUJVRkZFUiQxLFxuICAgICAgR0xfREVQVEhfQVRUQUNITUVOVCxcbiAgICAgIEdMX1RFWFRVUkVfMkQkMixcbiAgICAgIG51bGwsXG4gICAgICAwKVxuICAgIGdsLmZyYW1lYnVmZmVyVGV4dHVyZTJEKFxuICAgICAgR0xfRlJBTUVCVUZGRVIkMSxcbiAgICAgIEdMX1NURU5DSUxfQVRUQUNITUVOVCxcbiAgICAgIEdMX1RFWFRVUkVfMkQkMixcbiAgICAgIG51bGwsXG4gICAgICAwKVxuXG4gICAgYXR0YWNoKEdMX0RFUFRIX0FUVEFDSE1FTlQsIGZyYW1lYnVmZmVyLmRlcHRoQXR0YWNobWVudClcbiAgICBhdHRhY2goR0xfU1RFTkNJTF9BVFRBQ0hNRU5ULCBmcmFtZWJ1ZmZlci5zdGVuY2lsQXR0YWNobWVudClcbiAgICBhdHRhY2goR0xfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5ULCBmcmFtZWJ1ZmZlci5kZXB0aFN0ZW5jaWxBdHRhY2htZW50KVxuXG4gICAgLy8gQ2hlY2sgc3RhdHVzIGNvZGVcbiAgICB2YXIgc3RhdHVzID0gZ2wuY2hlY2tGcmFtZWJ1ZmZlclN0YXR1cyhHTF9GUkFNRUJVRkZFUiQxKVxuICAgIGlmICghZ2wuaXNDb250ZXh0TG9zdCgpICYmIHN0YXR1cyAhPT0gR0xfRlJBTUVCVUZGRVJfQ09NUExFVEUkMSkge1xuICAgICAgY2hlY2skMS5yYWlzZSgnZnJhbWVidWZmZXIgY29uZmlndXJhdGlvbiBub3Qgc3VwcG9ydGVkLCBzdGF0dXMgPSAnICtcbiAgICAgICAgc3RhdHVzQ29kZVtzdGF0dXNdKVxuICAgIH1cblxuICAgIGdsLmJpbmRGcmFtZWJ1ZmZlcihHTF9GUkFNRUJVRkZFUiQxLCBmcmFtZWJ1ZmZlclN0YXRlLm5leHQgPyBmcmFtZWJ1ZmZlclN0YXRlLm5leHQuZnJhbWVidWZmZXIgOiBudWxsKVxuICAgIGZyYW1lYnVmZmVyU3RhdGUuY3VyID0gZnJhbWVidWZmZXJTdGF0ZS5uZXh0XG5cbiAgICAvLyBGSVhNRTogQ2xlYXIgZXJyb3IgY29kZSBoZXJlLiAgVGhpcyBpcyBhIHdvcmsgYXJvdW5kIGZvciBhIGJ1ZyBpblxuICAgIC8vIGhlYWRsZXNzLWdsXG4gICAgZ2wuZ2V0RXJyb3IoKVxuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlRkJPIChhMCwgYTEpIHtcbiAgICB2YXIgZnJhbWVidWZmZXIgPSBuZXcgUkVHTEZyYW1lYnVmZmVyKClcbiAgICBzdGF0cy5mcmFtZWJ1ZmZlckNvdW50KytcblxuICAgIGZ1bmN0aW9uIHJlZ2xGcmFtZWJ1ZmZlciAoYSwgYikge1xuICAgICAgdmFyIGlcblxuICAgICAgY2hlY2skMShmcmFtZWJ1ZmZlclN0YXRlLm5leHQgIT09IGZyYW1lYnVmZmVyLFxuICAgICAgICAnY2FuIG5vdCB1cGRhdGUgZnJhbWVidWZmZXIgd2hpY2ggaXMgY3VycmVudGx5IGluIHVzZScpXG5cbiAgICAgIHZhciB3aWR0aCA9IDBcbiAgICAgIHZhciBoZWlnaHQgPSAwXG5cbiAgICAgIHZhciBuZWVkc0RlcHRoID0gdHJ1ZVxuICAgICAgdmFyIG5lZWRzU3RlbmNpbCA9IHRydWVcblxuICAgICAgdmFyIGNvbG9yQnVmZmVyID0gbnVsbFxuICAgICAgdmFyIGNvbG9yVGV4dHVyZSA9IHRydWVcbiAgICAgIHZhciBjb2xvckZvcm1hdCA9ICdyZ2JhJ1xuICAgICAgdmFyIGNvbG9yVHlwZSA9ICd1aW50OCdcbiAgICAgIHZhciBjb2xvckNvdW50ID0gMVxuXG4gICAgICB2YXIgZGVwdGhCdWZmZXIgPSBudWxsXG4gICAgICB2YXIgc3RlbmNpbEJ1ZmZlciA9IG51bGxcbiAgICAgIHZhciBkZXB0aFN0ZW5jaWxCdWZmZXIgPSBudWxsXG4gICAgICB2YXIgZGVwdGhTdGVuY2lsVGV4dHVyZSA9IGZhbHNlXG5cbiAgICAgIGlmICh0eXBlb2YgYSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgd2lkdGggPSBhIHwgMFxuICAgICAgICBoZWlnaHQgPSAoYiB8IDApIHx8IHdpZHRoXG4gICAgICB9IGVsc2UgaWYgKCFhKSB7XG4gICAgICAgIHdpZHRoID0gaGVpZ2h0ID0gMVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2hlY2skMS50eXBlKGEsICdvYmplY3QnLCAnaW52YWxpZCBhcmd1bWVudHMgZm9yIGZyYW1lYnVmZmVyJylcbiAgICAgICAgdmFyIG9wdGlvbnMgPSBhXG5cbiAgICAgICAgaWYgKCdzaGFwZScgaW4gb3B0aW9ucykge1xuICAgICAgICAgIHZhciBzaGFwZSA9IG9wdGlvbnMuc2hhcGVcbiAgICAgICAgICBjaGVjayQxKEFycmF5LmlzQXJyYXkoc2hhcGUpICYmIHNoYXBlLmxlbmd0aCA+PSAyLFxuICAgICAgICAgICAgJ2ludmFsaWQgc2hhcGUgZm9yIGZyYW1lYnVmZmVyJylcbiAgICAgICAgICB3aWR0aCA9IHNoYXBlWzBdXG4gICAgICAgICAgaGVpZ2h0ID0gc2hhcGVbMV1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoJ3JhZGl1cycgaW4gb3B0aW9ucykge1xuICAgICAgICAgICAgd2lkdGggPSBoZWlnaHQgPSBvcHRpb25zLnJhZGl1c1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoJ3dpZHRoJyBpbiBvcHRpb25zKSB7XG4gICAgICAgICAgICB3aWR0aCA9IG9wdGlvbnMud2lkdGhcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCdoZWlnaHQnIGluIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIGhlaWdodCA9IG9wdGlvbnMuaGVpZ2h0XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCdjb2xvcicgaW4gb3B0aW9ucyB8fFxuICAgICAgICAgICAgJ2NvbG9ycycgaW4gb3B0aW9ucykge1xuICAgICAgICAgIGNvbG9yQnVmZmVyID1cbiAgICAgICAgICAgIG9wdGlvbnMuY29sb3IgfHxcbiAgICAgICAgICAgIG9wdGlvbnMuY29sb3JzXG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY29sb3JCdWZmZXIpKSB7XG4gICAgICAgICAgICBjaGVjayQxKFxuICAgICAgICAgICAgICBjb2xvckJ1ZmZlci5sZW5ndGggPT09IDEgfHwgZXh0ZW5zaW9ucy53ZWJnbF9kcmF3X2J1ZmZlcnMsXG4gICAgICAgICAgICAgICdtdWx0aXBsZSByZW5kZXIgdGFyZ2V0cyBub3Qgc3VwcG9ydGVkJylcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWNvbG9yQnVmZmVyKSB7XG4gICAgICAgICAgaWYgKCdjb2xvckNvdW50JyBpbiBvcHRpb25zKSB7XG4gICAgICAgICAgICBjb2xvckNvdW50ID0gb3B0aW9ucy5jb2xvckNvdW50IHwgMFxuICAgICAgICAgICAgY2hlY2skMShjb2xvckNvdW50ID4gMCwgJ2ludmFsaWQgY29sb3IgYnVmZmVyIGNvdW50JylcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoJ2NvbG9yVGV4dHVyZScgaW4gb3B0aW9ucykge1xuICAgICAgICAgICAgY29sb3JUZXh0dXJlID0gISFvcHRpb25zLmNvbG9yVGV4dHVyZVxuICAgICAgICAgICAgY29sb3JGb3JtYXQgPSAncmdiYTQnXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCdjb2xvclR5cGUnIGluIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIGNvbG9yVHlwZSA9IG9wdGlvbnMuY29sb3JUeXBlXG4gICAgICAgICAgICBpZiAoIWNvbG9yVGV4dHVyZSkge1xuICAgICAgICAgICAgICBpZiAoY29sb3JUeXBlID09PSAnaGFsZiBmbG9hdCcgfHwgY29sb3JUeXBlID09PSAnZmxvYXQxNicpIHtcbiAgICAgICAgICAgICAgICBjaGVjayQxKGV4dGVuc2lvbnMuZXh0X2NvbG9yX2J1ZmZlcl9oYWxmX2Zsb2F0LFxuICAgICAgICAgICAgICAgICAgJ3lvdSBtdXN0IGVuYWJsZSBFWFRfY29sb3JfYnVmZmVyX2hhbGZfZmxvYXQgdG8gdXNlIDE2LWJpdCByZW5kZXIgYnVmZmVycycpXG4gICAgICAgICAgICAgICAgY29sb3JGb3JtYXQgPSAncmdiYTE2ZidcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb2xvclR5cGUgPT09ICdmbG9hdCcgfHwgY29sb3JUeXBlID09PSAnZmxvYXQzMicpIHtcbiAgICAgICAgICAgICAgICBjaGVjayQxKGV4dGVuc2lvbnMud2ViZ2xfY29sb3JfYnVmZmVyX2Zsb2F0LFxuICAgICAgICAgICAgICAgICAgJ3lvdSBtdXN0IGVuYWJsZSBXRUJHTF9jb2xvcl9idWZmZXJfZmxvYXQgaW4gb3JkZXIgdG8gdXNlIDMyLWJpdCBmbG9hdGluZyBwb2ludCByZW5kZXJidWZmZXJzJylcbiAgICAgICAgICAgICAgICBjb2xvckZvcm1hdCA9ICdyZ2JhMzJmJ1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjaGVjayQxKGV4dGVuc2lvbnMub2VzX3RleHR1cmVfZmxvYXQgfHxcbiAgICAgICAgICAgICAgICAhKGNvbG9yVHlwZSA9PT0gJ2Zsb2F0JyB8fCBjb2xvclR5cGUgPT09ICdmbG9hdDMyJyksXG4gICAgICAgICAgICAgICd5b3UgbXVzdCBlbmFibGUgT0VTX3RleHR1cmVfZmxvYXQgaW4gb3JkZXIgdG8gdXNlIGZsb2F0aW5nIHBvaW50IGZyYW1lYnVmZmVyIG9iamVjdHMnKVxuICAgICAgICAgICAgICBjaGVjayQxKGV4dGVuc2lvbnMub2VzX3RleHR1cmVfaGFsZl9mbG9hdCB8fFxuICAgICAgICAgICAgICAgICEoY29sb3JUeXBlID09PSAnaGFsZiBmbG9hdCcgfHwgY29sb3JUeXBlID09PSAnZmxvYXQxNicpLFxuICAgICAgICAgICAgICAneW91IG11c3QgZW5hYmxlIE9FU190ZXh0dXJlX2hhbGZfZmxvYXQgaW4gb3JkZXIgdG8gdXNlIDE2LWJpdCBmbG9hdGluZyBwb2ludCBmcmFtZWJ1ZmZlciBvYmplY3RzJylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNoZWNrJDEub25lT2YoY29sb3JUeXBlLCBjb2xvclR5cGVzLCAnaW52YWxpZCBjb2xvciB0eXBlJylcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoJ2NvbG9yRm9ybWF0JyBpbiBvcHRpb25zKSB7XG4gICAgICAgICAgICBjb2xvckZvcm1hdCA9IG9wdGlvbnMuY29sb3JGb3JtYXRcbiAgICAgICAgICAgIGlmIChjb2xvclRleHR1cmVGb3JtYXRzLmluZGV4T2YoY29sb3JGb3JtYXQpID49IDApIHtcbiAgICAgICAgICAgICAgY29sb3JUZXh0dXJlID0gdHJ1ZVxuICAgICAgICAgICAgfSBlbHNlIGlmIChjb2xvclJlbmRlcmJ1ZmZlckZvcm1hdHMuaW5kZXhPZihjb2xvckZvcm1hdCkgPj0gMCkge1xuICAgICAgICAgICAgICBjb2xvclRleHR1cmUgPSBmYWxzZVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgaWYgKGNvbG9yVGV4dHVyZSkge1xuICAgICAgICAgICAgICAgIGNoZWNrJDEub25lT2YoXG4gICAgICAgICAgICAgICAgICBvcHRpb25zLmNvbG9yRm9ybWF0LCBjb2xvclRleHR1cmVGb3JtYXRzLFxuICAgICAgICAgICAgICAgICAgJ2ludmFsaWQgY29sb3IgZm9ybWF0IGZvciB0ZXh0dXJlJylcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjaGVjayQxLm9uZU9mKFxuICAgICAgICAgICAgICAgICAgb3B0aW9ucy5jb2xvckZvcm1hdCwgY29sb3JSZW5kZXJidWZmZXJGb3JtYXRzLFxuICAgICAgICAgICAgICAgICAgJ2ludmFsaWQgY29sb3IgZm9ybWF0IGZvciByZW5kZXJidWZmZXInKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCdkZXB0aFRleHR1cmUnIGluIG9wdGlvbnMgfHwgJ2RlcHRoU3RlbmNpbFRleHR1cmUnIGluIG9wdGlvbnMpIHtcbiAgICAgICAgICBkZXB0aFN0ZW5jaWxUZXh0dXJlID0gISEob3B0aW9ucy5kZXB0aFRleHR1cmUgfHxcbiAgICAgICAgICAgIG9wdGlvbnMuZGVwdGhTdGVuY2lsVGV4dHVyZSlcbiAgICAgICAgICBjaGVjayQxKCFkZXB0aFN0ZW5jaWxUZXh0dXJlIHx8IGV4dGVuc2lvbnMud2ViZ2xfZGVwdGhfdGV4dHVyZSxcbiAgICAgICAgICAgICd3ZWJnbF9kZXB0aF90ZXh0dXJlIGV4dGVuc2lvbiBub3Qgc3VwcG9ydGVkJylcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgnZGVwdGgnIGluIG9wdGlvbnMpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMuZGVwdGggPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgbmVlZHNEZXB0aCA9IG9wdGlvbnMuZGVwdGhcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGVwdGhCdWZmZXIgPSBvcHRpb25zLmRlcHRoXG4gICAgICAgICAgICBuZWVkc1N0ZW5jaWwgPSBmYWxzZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgnc3RlbmNpbCcgaW4gb3B0aW9ucykge1xuICAgICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5zdGVuY2lsID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgIG5lZWRzU3RlbmNpbCA9IG9wdGlvbnMuc3RlbmNpbFxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdGVuY2lsQnVmZmVyID0gb3B0aW9ucy5zdGVuY2lsXG4gICAgICAgICAgICBuZWVkc0RlcHRoID0gZmFsc2VcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoJ2RlcHRoU3RlbmNpbCcgaW4gb3B0aW9ucykge1xuICAgICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5kZXB0aFN0ZW5jaWwgPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgbmVlZHNEZXB0aCA9IG5lZWRzU3RlbmNpbCA9IG9wdGlvbnMuZGVwdGhTdGVuY2lsXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRlcHRoU3RlbmNpbEJ1ZmZlciA9IG9wdGlvbnMuZGVwdGhTdGVuY2lsXG4gICAgICAgICAgICBuZWVkc0RlcHRoID0gZmFsc2VcbiAgICAgICAgICAgIG5lZWRzU3RlbmNpbCA9IGZhbHNlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIHBhcnNlIGF0dGFjaG1lbnRzXG4gICAgICB2YXIgY29sb3JBdHRhY2htZW50cyA9IG51bGxcbiAgICAgIHZhciBkZXB0aEF0dGFjaG1lbnQgPSBudWxsXG4gICAgICB2YXIgc3RlbmNpbEF0dGFjaG1lbnQgPSBudWxsXG4gICAgICB2YXIgZGVwdGhTdGVuY2lsQXR0YWNobWVudCA9IG51bGxcblxuICAgICAgLy8gU2V0IHVwIGNvbG9yIGF0dGFjaG1lbnRzXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShjb2xvckJ1ZmZlcikpIHtcbiAgICAgICAgY29sb3JBdHRhY2htZW50cyA9IGNvbG9yQnVmZmVyLm1hcChwYXJzZUF0dGFjaG1lbnQpXG4gICAgICB9IGVsc2UgaWYgKGNvbG9yQnVmZmVyKSB7XG4gICAgICAgIGNvbG9yQXR0YWNobWVudHMgPSBbcGFyc2VBdHRhY2htZW50KGNvbG9yQnVmZmVyKV1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbG9yQXR0YWNobWVudHMgPSBuZXcgQXJyYXkoY29sb3JDb3VudClcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvbG9yQ291bnQ7ICsraSkge1xuICAgICAgICAgIGNvbG9yQXR0YWNobWVudHNbaV0gPSBhbGxvY0F0dGFjaG1lbnQoXG4gICAgICAgICAgICB3aWR0aCxcbiAgICAgICAgICAgIGhlaWdodCxcbiAgICAgICAgICAgIGNvbG9yVGV4dHVyZSxcbiAgICAgICAgICAgIGNvbG9yRm9ybWF0LFxuICAgICAgICAgICAgY29sb3JUeXBlKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNoZWNrJDEoZXh0ZW5zaW9ucy53ZWJnbF9kcmF3X2J1ZmZlcnMgfHwgY29sb3JBdHRhY2htZW50cy5sZW5ndGggPD0gMSxcbiAgICAgICAgJ3lvdSBtdXN0IGVuYWJsZSB0aGUgV0VCR0xfZHJhd19idWZmZXJzIGV4dGVuc2lvbiBpbiBvcmRlciB0byB1c2UgbXVsdGlwbGUgY29sb3IgYnVmZmVycy4nKVxuICAgICAgY2hlY2skMShjb2xvckF0dGFjaG1lbnRzLmxlbmd0aCA8PSBsaW1pdHMubWF4Q29sb3JBdHRhY2htZW50cyxcbiAgICAgICAgJ3RvbyBtYW55IGNvbG9yIGF0dGFjaG1lbnRzLCBub3Qgc3VwcG9ydGVkJylcblxuICAgICAgd2lkdGggPSB3aWR0aCB8fCBjb2xvckF0dGFjaG1lbnRzWzBdLndpZHRoXG4gICAgICBoZWlnaHQgPSBoZWlnaHQgfHwgY29sb3JBdHRhY2htZW50c1swXS5oZWlnaHRcblxuICAgICAgaWYgKGRlcHRoQnVmZmVyKSB7XG4gICAgICAgIGRlcHRoQXR0YWNobWVudCA9IHBhcnNlQXR0YWNobWVudChkZXB0aEJ1ZmZlcilcbiAgICAgIH0gZWxzZSBpZiAobmVlZHNEZXB0aCAmJiAhbmVlZHNTdGVuY2lsKSB7XG4gICAgICAgIGRlcHRoQXR0YWNobWVudCA9IGFsbG9jQXR0YWNobWVudChcbiAgICAgICAgICB3aWR0aCxcbiAgICAgICAgICBoZWlnaHQsXG4gICAgICAgICAgZGVwdGhTdGVuY2lsVGV4dHVyZSxcbiAgICAgICAgICAnZGVwdGgnLFxuICAgICAgICAgICd1aW50MzInKVxuICAgICAgfVxuXG4gICAgICBpZiAoc3RlbmNpbEJ1ZmZlcikge1xuICAgICAgICBzdGVuY2lsQXR0YWNobWVudCA9IHBhcnNlQXR0YWNobWVudChzdGVuY2lsQnVmZmVyKVxuICAgICAgfSBlbHNlIGlmIChuZWVkc1N0ZW5jaWwgJiYgIW5lZWRzRGVwdGgpIHtcbiAgICAgICAgc3RlbmNpbEF0dGFjaG1lbnQgPSBhbGxvY0F0dGFjaG1lbnQoXG4gICAgICAgICAgd2lkdGgsXG4gICAgICAgICAgaGVpZ2h0LFxuICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICdzdGVuY2lsJyxcbiAgICAgICAgICAndWludDgnKVxuICAgICAgfVxuXG4gICAgICBpZiAoZGVwdGhTdGVuY2lsQnVmZmVyKSB7XG4gICAgICAgIGRlcHRoU3RlbmNpbEF0dGFjaG1lbnQgPSBwYXJzZUF0dGFjaG1lbnQoZGVwdGhTdGVuY2lsQnVmZmVyKVxuICAgICAgfSBlbHNlIGlmICghZGVwdGhCdWZmZXIgJiYgIXN0ZW5jaWxCdWZmZXIgJiYgbmVlZHNTdGVuY2lsICYmIG5lZWRzRGVwdGgpIHtcbiAgICAgICAgZGVwdGhTdGVuY2lsQXR0YWNobWVudCA9IGFsbG9jQXR0YWNobWVudChcbiAgICAgICAgICB3aWR0aCxcbiAgICAgICAgICBoZWlnaHQsXG4gICAgICAgICAgZGVwdGhTdGVuY2lsVGV4dHVyZSxcbiAgICAgICAgICAnZGVwdGggc3RlbmNpbCcsXG4gICAgICAgICAgJ2RlcHRoIHN0ZW5jaWwnKVxuICAgICAgfVxuXG4gICAgICBjaGVjayQxKFxuICAgICAgICAoISFkZXB0aEJ1ZmZlcikgKyAoISFzdGVuY2lsQnVmZmVyKSArICghIWRlcHRoU3RlbmNpbEJ1ZmZlcikgPD0gMSxcbiAgICAgICAgJ2ludmFsaWQgZnJhbWVidWZmZXIgY29uZmlndXJhdGlvbiwgY2FuIHNwZWNpZnkgZXhhY3RseSBvbmUgZGVwdGgvc3RlbmNpbCBhdHRhY2htZW50JylcblxuICAgICAgdmFyIGNvbW1vbkNvbG9yQXR0YWNobWVudFNpemUgPSBudWxsXG5cbiAgICAgIGZvciAoaSA9IDA7IGkgPCBjb2xvckF0dGFjaG1lbnRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGluY1JlZkFuZENoZWNrU2hhcGUoY29sb3JBdHRhY2htZW50c1tpXSwgd2lkdGgsIGhlaWdodClcbiAgICAgICAgY2hlY2skMSghY29sb3JBdHRhY2htZW50c1tpXSB8fFxuICAgICAgICAgIChjb2xvckF0dGFjaG1lbnRzW2ldLnRleHR1cmUgJiZcbiAgICAgICAgICAgIGNvbG9yVGV4dHVyZUZvcm1hdEVudW1zLmluZGV4T2YoY29sb3JBdHRhY2htZW50c1tpXS50ZXh0dXJlLl90ZXh0dXJlLmZvcm1hdCkgPj0gMCkgfHxcbiAgICAgICAgICAoY29sb3JBdHRhY2htZW50c1tpXS5yZW5kZXJidWZmZXIgJiZcbiAgICAgICAgICAgIGNvbG9yUmVuZGVyYnVmZmVyRm9ybWF0RW51bXMuaW5kZXhPZihjb2xvckF0dGFjaG1lbnRzW2ldLnJlbmRlcmJ1ZmZlci5fcmVuZGVyYnVmZmVyLmZvcm1hdCkgPj0gMCksXG4gICAgICAgICdmcmFtZWJ1ZmZlciBjb2xvciBhdHRhY2htZW50ICcgKyBpICsgJyBpcyBpbnZhbGlkJylcblxuICAgICAgICBpZiAoY29sb3JBdHRhY2htZW50c1tpXSAmJiBjb2xvckF0dGFjaG1lbnRzW2ldLnRleHR1cmUpIHtcbiAgICAgICAgICB2YXIgY29sb3JBdHRhY2htZW50U2l6ZSA9XG4gICAgICAgICAgICAgIHRleHR1cmVGb3JtYXRDaGFubmVsc1tjb2xvckF0dGFjaG1lbnRzW2ldLnRleHR1cmUuX3RleHR1cmUuZm9ybWF0XSAqXG4gICAgICAgICAgICAgIHRleHR1cmVUeXBlU2l6ZXNbY29sb3JBdHRhY2htZW50c1tpXS50ZXh0dXJlLl90ZXh0dXJlLnR5cGVdXG5cbiAgICAgICAgICBpZiAoY29tbW9uQ29sb3JBdHRhY2htZW50U2l6ZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgY29tbW9uQ29sb3JBdHRhY2htZW50U2l6ZSA9IGNvbG9yQXR0YWNobWVudFNpemVcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCBhbGwgY29sb3IgYXR0YWNobWVudHMgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2YgYml0cGxhbmVzXG4gICAgICAgICAgICAvLyAodGhhdCBpcywgdGhlIHNhbWUgbnVtZXIgb2YgYml0cyBwZXIgcGl4ZWwpXG4gICAgICAgICAgICAvLyBUaGlzIGlzIHJlcXVpcmVkIGJ5IHRoZSBHTEVTMi4wIHN0YW5kYXJkLiBTZWUgdGhlIGJlZ2lubmluZyBvZiBDaGFwdGVyIDQgaW4gdGhhdCBkb2N1bWVudC5cbiAgICAgICAgICAgIGNoZWNrJDEoY29tbW9uQ29sb3JBdHRhY2htZW50U2l6ZSA9PT0gY29sb3JBdHRhY2htZW50U2l6ZSxcbiAgICAgICAgICAgICAgJ2FsbCBjb2xvciBhdHRhY2htZW50cyBtdWNoIGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIGJpdHMgcGVyIHBpeGVsLicpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpbmNSZWZBbmRDaGVja1NoYXBlKGRlcHRoQXR0YWNobWVudCwgd2lkdGgsIGhlaWdodClcbiAgICAgIGNoZWNrJDEoIWRlcHRoQXR0YWNobWVudCB8fFxuICAgICAgICAoZGVwdGhBdHRhY2htZW50LnRleHR1cmUgJiZcbiAgICAgICAgICBkZXB0aEF0dGFjaG1lbnQudGV4dHVyZS5fdGV4dHVyZS5mb3JtYXQgPT09IEdMX0RFUFRIX0NPTVBPTkVOVCQxKSB8fFxuICAgICAgICAoZGVwdGhBdHRhY2htZW50LnJlbmRlcmJ1ZmZlciAmJlxuICAgICAgICAgIGRlcHRoQXR0YWNobWVudC5yZW5kZXJidWZmZXIuX3JlbmRlcmJ1ZmZlci5mb3JtYXQgPT09IEdMX0RFUFRIX0NPTVBPTkVOVDE2JDEpLFxuICAgICAgJ2ludmFsaWQgZGVwdGggYXR0YWNobWVudCBmb3IgZnJhbWVidWZmZXIgb2JqZWN0JylcbiAgICAgIGluY1JlZkFuZENoZWNrU2hhcGUoc3RlbmNpbEF0dGFjaG1lbnQsIHdpZHRoLCBoZWlnaHQpXG4gICAgICBjaGVjayQxKCFzdGVuY2lsQXR0YWNobWVudCB8fFxuICAgICAgICAoc3RlbmNpbEF0dGFjaG1lbnQucmVuZGVyYnVmZmVyICYmXG4gICAgICAgICAgc3RlbmNpbEF0dGFjaG1lbnQucmVuZGVyYnVmZmVyLl9yZW5kZXJidWZmZXIuZm9ybWF0ID09PSBHTF9TVEVOQ0lMX0lOREVYOCQxKSxcbiAgICAgICdpbnZhbGlkIHN0ZW5jaWwgYXR0YWNobWVudCBmb3IgZnJhbWVidWZmZXIgb2JqZWN0JylcbiAgICAgIGluY1JlZkFuZENoZWNrU2hhcGUoZGVwdGhTdGVuY2lsQXR0YWNobWVudCwgd2lkdGgsIGhlaWdodClcbiAgICAgIGNoZWNrJDEoIWRlcHRoU3RlbmNpbEF0dGFjaG1lbnQgfHxcbiAgICAgICAgKGRlcHRoU3RlbmNpbEF0dGFjaG1lbnQudGV4dHVyZSAmJlxuICAgICAgICAgIGRlcHRoU3RlbmNpbEF0dGFjaG1lbnQudGV4dHVyZS5fdGV4dHVyZS5mb3JtYXQgPT09IEdMX0RFUFRIX1NURU5DSUwkMikgfHxcbiAgICAgICAgKGRlcHRoU3RlbmNpbEF0dGFjaG1lbnQucmVuZGVyYnVmZmVyICYmXG4gICAgICAgICAgZGVwdGhTdGVuY2lsQXR0YWNobWVudC5yZW5kZXJidWZmZXIuX3JlbmRlcmJ1ZmZlci5mb3JtYXQgPT09IEdMX0RFUFRIX1NURU5DSUwkMiksXG4gICAgICAnaW52YWxpZCBkZXB0aC1zdGVuY2lsIGF0dGFjaG1lbnQgZm9yIGZyYW1lYnVmZmVyIG9iamVjdCcpXG5cbiAgICAgIC8vIGRlY3JlbWVudCByZWZlcmVuY2VzXG4gICAgICBkZWNGQk9SZWZzKGZyYW1lYnVmZmVyKVxuXG4gICAgICBmcmFtZWJ1ZmZlci53aWR0aCA9IHdpZHRoXG4gICAgICBmcmFtZWJ1ZmZlci5oZWlnaHQgPSBoZWlnaHRcblxuICAgICAgZnJhbWVidWZmZXIuY29sb3JBdHRhY2htZW50cyA9IGNvbG9yQXR0YWNobWVudHNcbiAgICAgIGZyYW1lYnVmZmVyLmRlcHRoQXR0YWNobWVudCA9IGRlcHRoQXR0YWNobWVudFxuICAgICAgZnJhbWVidWZmZXIuc3RlbmNpbEF0dGFjaG1lbnQgPSBzdGVuY2lsQXR0YWNobWVudFxuICAgICAgZnJhbWVidWZmZXIuZGVwdGhTdGVuY2lsQXR0YWNobWVudCA9IGRlcHRoU3RlbmNpbEF0dGFjaG1lbnRcblxuICAgICAgcmVnbEZyYW1lYnVmZmVyLmNvbG9yID0gY29sb3JBdHRhY2htZW50cy5tYXAodW53cmFwQXR0YWNobWVudClcbiAgICAgIHJlZ2xGcmFtZWJ1ZmZlci5kZXB0aCA9IHVud3JhcEF0dGFjaG1lbnQoZGVwdGhBdHRhY2htZW50KVxuICAgICAgcmVnbEZyYW1lYnVmZmVyLnN0ZW5jaWwgPSB1bndyYXBBdHRhY2htZW50KHN0ZW5jaWxBdHRhY2htZW50KVxuICAgICAgcmVnbEZyYW1lYnVmZmVyLmRlcHRoU3RlbmNpbCA9IHVud3JhcEF0dGFjaG1lbnQoZGVwdGhTdGVuY2lsQXR0YWNobWVudClcblxuICAgICAgcmVnbEZyYW1lYnVmZmVyLndpZHRoID0gZnJhbWVidWZmZXIud2lkdGhcbiAgICAgIHJlZ2xGcmFtZWJ1ZmZlci5oZWlnaHQgPSBmcmFtZWJ1ZmZlci5oZWlnaHRcblxuICAgICAgdXBkYXRlRnJhbWVidWZmZXIoZnJhbWVidWZmZXIpXG5cbiAgICAgIHJldHVybiByZWdsRnJhbWVidWZmZXJcbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZXNpemUgKHdfLCBoXykge1xuICAgICAgY2hlY2skMShmcmFtZWJ1ZmZlclN0YXRlLm5leHQgIT09IGZyYW1lYnVmZmVyLFxuICAgICAgICAnY2FuIG5vdCByZXNpemUgYSBmcmFtZWJ1ZmZlciB3aGljaCBpcyBjdXJyZW50bHkgaW4gdXNlJylcblxuICAgICAgdmFyIHcgPSBNYXRoLm1heCh3XyB8IDAsIDEpXG4gICAgICB2YXIgaCA9IE1hdGgubWF4KChoXyB8IDApIHx8IHcsIDEpXG4gICAgICBpZiAodyA9PT0gZnJhbWVidWZmZXIud2lkdGggJiYgaCA9PT0gZnJhbWVidWZmZXIuaGVpZ2h0KSB7XG4gICAgICAgIHJldHVybiByZWdsRnJhbWVidWZmZXJcbiAgICAgIH1cblxuICAgICAgLy8gcmVzaXplIGFsbCBidWZmZXJzXG4gICAgICB2YXIgY29sb3JBdHRhY2htZW50cyA9IGZyYW1lYnVmZmVyLmNvbG9yQXR0YWNobWVudHNcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29sb3JBdHRhY2htZW50cy5sZW5ndGg7ICsraSkge1xuICAgICAgICByZXNpemVBdHRhY2htZW50KGNvbG9yQXR0YWNobWVudHNbaV0sIHcsIGgpXG4gICAgICB9XG4gICAgICByZXNpemVBdHRhY2htZW50KGZyYW1lYnVmZmVyLmRlcHRoQXR0YWNobWVudCwgdywgaClcbiAgICAgIHJlc2l6ZUF0dGFjaG1lbnQoZnJhbWVidWZmZXIuc3RlbmNpbEF0dGFjaG1lbnQsIHcsIGgpXG4gICAgICByZXNpemVBdHRhY2htZW50KGZyYW1lYnVmZmVyLmRlcHRoU3RlbmNpbEF0dGFjaG1lbnQsIHcsIGgpXG5cbiAgICAgIGZyYW1lYnVmZmVyLndpZHRoID0gcmVnbEZyYW1lYnVmZmVyLndpZHRoID0gd1xuICAgICAgZnJhbWVidWZmZXIuaGVpZ2h0ID0gcmVnbEZyYW1lYnVmZmVyLmhlaWdodCA9IGhcblxuICAgICAgdXBkYXRlRnJhbWVidWZmZXIoZnJhbWVidWZmZXIpXG5cbiAgICAgIHJldHVybiByZWdsRnJhbWVidWZmZXJcbiAgICB9XG5cbiAgICByZWdsRnJhbWVidWZmZXIoYTAsIGExKVxuXG4gICAgcmV0dXJuIGV4dGVuZChyZWdsRnJhbWVidWZmZXIsIHtcbiAgICAgIHJlc2l6ZTogcmVzaXplLFxuICAgICAgX3JlZ2xUeXBlOiAnZnJhbWVidWZmZXInLFxuICAgICAgX2ZyYW1lYnVmZmVyOiBmcmFtZWJ1ZmZlcixcbiAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZGVzdHJveShmcmFtZWJ1ZmZlcilcbiAgICAgICAgZGVjRkJPUmVmcyhmcmFtZWJ1ZmZlcilcbiAgICAgIH0sXG4gICAgICB1c2U6IGZ1bmN0aW9uIChibG9jaykge1xuICAgICAgICBmcmFtZWJ1ZmZlclN0YXRlLnNldEZCTyh7XG4gICAgICAgICAgZnJhbWVidWZmZXI6IHJlZ2xGcmFtZWJ1ZmZlclxuICAgICAgICB9LCBibG9jaylcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlQ3ViZUZCTyAob3B0aW9ucykge1xuICAgIHZhciBmYWNlcyA9IEFycmF5KDYpXG5cbiAgICBmdW5jdGlvbiByZWdsRnJhbWVidWZmZXJDdWJlIChhKSB7XG4gICAgICB2YXIgaVxuXG4gICAgICBjaGVjayQxKGZhY2VzLmluZGV4T2YoZnJhbWVidWZmZXJTdGF0ZS5uZXh0KSA8IDAsXG4gICAgICAgICdjYW4gbm90IHVwZGF0ZSBmcmFtZWJ1ZmZlciB3aGljaCBpcyBjdXJyZW50bHkgaW4gdXNlJylcblxuICAgICAgdmFyIHBhcmFtcyA9IHtcbiAgICAgICAgY29sb3I6IG51bGxcbiAgICAgIH1cblxuICAgICAgdmFyIHJhZGl1cyA9IDBcblxuICAgICAgdmFyIGNvbG9yQnVmZmVyID0gbnVsbFxuICAgICAgdmFyIGNvbG9yRm9ybWF0ID0gJ3JnYmEnXG4gICAgICB2YXIgY29sb3JUeXBlID0gJ3VpbnQ4J1xuICAgICAgdmFyIGNvbG9yQ291bnQgPSAxXG5cbiAgICAgIGlmICh0eXBlb2YgYSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgcmFkaXVzID0gYSB8IDBcbiAgICAgIH0gZWxzZSBpZiAoIWEpIHtcbiAgICAgICAgcmFkaXVzID0gMVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2hlY2skMS50eXBlKGEsICdvYmplY3QnLCAnaW52YWxpZCBhcmd1bWVudHMgZm9yIGZyYW1lYnVmZmVyJylcbiAgICAgICAgdmFyIG9wdGlvbnMgPSBhXG5cbiAgICAgICAgaWYgKCdzaGFwZScgaW4gb3B0aW9ucykge1xuICAgICAgICAgIHZhciBzaGFwZSA9IG9wdGlvbnMuc2hhcGVcbiAgICAgICAgICBjaGVjayQxKFxuICAgICAgICAgICAgQXJyYXkuaXNBcnJheShzaGFwZSkgJiYgc2hhcGUubGVuZ3RoID49IDIsXG4gICAgICAgICAgICAnaW52YWxpZCBzaGFwZSBmb3IgZnJhbWVidWZmZXInKVxuICAgICAgICAgIGNoZWNrJDEoXG4gICAgICAgICAgICBzaGFwZVswXSA9PT0gc2hhcGVbMV0sXG4gICAgICAgICAgICAnY3ViZSBmcmFtZWJ1ZmZlciBtdXN0IGJlIHNxdWFyZScpXG4gICAgICAgICAgcmFkaXVzID0gc2hhcGVbMF1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoJ3JhZGl1cycgaW4gb3B0aW9ucykge1xuICAgICAgICAgICAgcmFkaXVzID0gb3B0aW9ucy5yYWRpdXMgfCAwXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICgnd2lkdGgnIGluIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIHJhZGl1cyA9IG9wdGlvbnMud2lkdGggfCAwXG4gICAgICAgICAgICBpZiAoJ2hlaWdodCcgaW4gb3B0aW9ucykge1xuICAgICAgICAgICAgICBjaGVjayQxKG9wdGlvbnMuaGVpZ2h0ID09PSByYWRpdXMsICdtdXN0IGJlIHNxdWFyZScpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmICgnaGVpZ2h0JyBpbiBvcHRpb25zKSB7XG4gICAgICAgICAgICByYWRpdXMgPSBvcHRpb25zLmhlaWdodCB8IDBcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoJ2NvbG9yJyBpbiBvcHRpb25zIHx8XG4gICAgICAgICAgICAnY29sb3JzJyBpbiBvcHRpb25zKSB7XG4gICAgICAgICAgY29sb3JCdWZmZXIgPVxuICAgICAgICAgICAgb3B0aW9ucy5jb2xvciB8fFxuICAgICAgICAgICAgb3B0aW9ucy5jb2xvcnNcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjb2xvckJ1ZmZlcikpIHtcbiAgICAgICAgICAgIGNoZWNrJDEoXG4gICAgICAgICAgICAgIGNvbG9yQnVmZmVyLmxlbmd0aCA9PT0gMSB8fCBleHRlbnNpb25zLndlYmdsX2RyYXdfYnVmZmVycyxcbiAgICAgICAgICAgICAgJ211bHRpcGxlIHJlbmRlciB0YXJnZXRzIG5vdCBzdXBwb3J0ZWQnKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghY29sb3JCdWZmZXIpIHtcbiAgICAgICAgICBpZiAoJ2NvbG9yQ291bnQnIGluIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIGNvbG9yQ291bnQgPSBvcHRpb25zLmNvbG9yQ291bnQgfCAwXG4gICAgICAgICAgICBjaGVjayQxKGNvbG9yQ291bnQgPiAwLCAnaW52YWxpZCBjb2xvciBidWZmZXIgY291bnQnKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICgnY29sb3JUeXBlJyBpbiBvcHRpb25zKSB7XG4gICAgICAgICAgICBjaGVjayQxLm9uZU9mKFxuICAgICAgICAgICAgICBvcHRpb25zLmNvbG9yVHlwZSwgY29sb3JUeXBlcyxcbiAgICAgICAgICAgICAgJ2ludmFsaWQgY29sb3IgdHlwZScpXG4gICAgICAgICAgICBjb2xvclR5cGUgPSBvcHRpb25zLmNvbG9yVHlwZVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICgnY29sb3JGb3JtYXQnIGluIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIGNvbG9yRm9ybWF0ID0gb3B0aW9ucy5jb2xvckZvcm1hdFxuICAgICAgICAgICAgY2hlY2skMS5vbmVPZihcbiAgICAgICAgICAgICAgb3B0aW9ucy5jb2xvckZvcm1hdCwgY29sb3JUZXh0dXJlRm9ybWF0cyxcbiAgICAgICAgICAgICAgJ2ludmFsaWQgY29sb3IgZm9ybWF0IGZvciB0ZXh0dXJlJylcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoJ2RlcHRoJyBpbiBvcHRpb25zKSB7XG4gICAgICAgICAgcGFyYW1zLmRlcHRoID0gb3B0aW9ucy5kZXB0aFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCdzdGVuY2lsJyBpbiBvcHRpb25zKSB7XG4gICAgICAgICAgcGFyYW1zLnN0ZW5jaWwgPSBvcHRpb25zLnN0ZW5jaWxcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgnZGVwdGhTdGVuY2lsJyBpbiBvcHRpb25zKSB7XG4gICAgICAgICAgcGFyYW1zLmRlcHRoU3RlbmNpbCA9IG9wdGlvbnMuZGVwdGhTdGVuY2lsXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIGNvbG9yQ3ViZXNcbiAgICAgIGlmIChjb2xvckJ1ZmZlcikge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjb2xvckJ1ZmZlcikpIHtcbiAgICAgICAgICBjb2xvckN1YmVzID0gW11cbiAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29sb3JCdWZmZXIubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGNvbG9yQ3ViZXNbaV0gPSBjb2xvckJ1ZmZlcltpXVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb2xvckN1YmVzID0gWyBjb2xvckJ1ZmZlciBdXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbG9yQ3ViZXMgPSBBcnJheShjb2xvckNvdW50KVxuICAgICAgICB2YXIgY3ViZU1hcFBhcmFtcyA9IHtcbiAgICAgICAgICByYWRpdXM6IHJhZGl1cyxcbiAgICAgICAgICBmb3JtYXQ6IGNvbG9yRm9ybWF0LFxuICAgICAgICAgIHR5cGU6IGNvbG9yVHlwZVxuICAgICAgICB9XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb2xvckNvdW50OyArK2kpIHtcbiAgICAgICAgICBjb2xvckN1YmVzW2ldID0gdGV4dHVyZVN0YXRlLmNyZWF0ZUN1YmUoY3ViZU1hcFBhcmFtcylcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBjb2xvciBjdWJlc1xuICAgICAgcGFyYW1zLmNvbG9yID0gQXJyYXkoY29sb3JDdWJlcy5sZW5ndGgpXG4gICAgICBmb3IgKGkgPSAwOyBpIDwgY29sb3JDdWJlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICB2YXIgY3ViZSA9IGNvbG9yQ3ViZXNbaV1cbiAgICAgICAgY2hlY2skMShcbiAgICAgICAgICB0eXBlb2YgY3ViZSA9PT0gJ2Z1bmN0aW9uJyAmJiBjdWJlLl9yZWdsVHlwZSA9PT0gJ3RleHR1cmVDdWJlJyxcbiAgICAgICAgICAnaW52YWxpZCBjdWJlIG1hcCcpXG4gICAgICAgIHJhZGl1cyA9IHJhZGl1cyB8fCBjdWJlLndpZHRoXG4gICAgICAgIGNoZWNrJDEoXG4gICAgICAgICAgY3ViZS53aWR0aCA9PT0gcmFkaXVzICYmIGN1YmUuaGVpZ2h0ID09PSByYWRpdXMsXG4gICAgICAgICAgJ2ludmFsaWQgY3ViZSBtYXAgc2hhcGUnKVxuICAgICAgICBwYXJhbXMuY29sb3JbaV0gPSB7XG4gICAgICAgICAgdGFyZ2V0OiBHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1gkMixcbiAgICAgICAgICBkYXRhOiBjb2xvckN1YmVzW2ldXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZm9yIChpID0gMDsgaSA8IDY7ICsraSkge1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGNvbG9yQ3ViZXMubGVuZ3RoOyArK2opIHtcbiAgICAgICAgICBwYXJhbXMuY29sb3Jbal0udGFyZ2V0ID0gR0xfVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YJDIgKyBpXG4gICAgICAgIH1cbiAgICAgICAgLy8gcmV1c2UgZGVwdGgtc3RlbmNpbCBhdHRhY2htZW50cyBhY3Jvc3MgYWxsIGN1YmUgbWFwc1xuICAgICAgICBpZiAoaSA+IDApIHtcbiAgICAgICAgICBwYXJhbXMuZGVwdGggPSBmYWNlc1swXS5kZXB0aFxuICAgICAgICAgIHBhcmFtcy5zdGVuY2lsID0gZmFjZXNbMF0uc3RlbmNpbFxuICAgICAgICAgIHBhcmFtcy5kZXB0aFN0ZW5jaWwgPSBmYWNlc1swXS5kZXB0aFN0ZW5jaWxcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmFjZXNbaV0pIHtcbiAgICAgICAgICAoZmFjZXNbaV0pKHBhcmFtcylcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmYWNlc1tpXSA9IGNyZWF0ZUZCTyhwYXJhbXMpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGV4dGVuZChyZWdsRnJhbWVidWZmZXJDdWJlLCB7XG4gICAgICAgIHdpZHRoOiByYWRpdXMsXG4gICAgICAgIGhlaWdodDogcmFkaXVzLFxuICAgICAgICBjb2xvcjogY29sb3JDdWJlc1xuICAgICAgfSlcbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZXNpemUgKHJhZGl1c18pIHtcbiAgICAgIHZhciBpXG4gICAgICB2YXIgcmFkaXVzID0gcmFkaXVzXyB8IDBcbiAgICAgIGNoZWNrJDEocmFkaXVzID4gMCAmJiByYWRpdXMgPD0gbGltaXRzLm1heEN1YmVNYXBTaXplLFxuICAgICAgICAnaW52YWxpZCByYWRpdXMgZm9yIGN1YmUgZmJvJylcblxuICAgICAgaWYgKHJhZGl1cyA9PT0gcmVnbEZyYW1lYnVmZmVyQ3ViZS53aWR0aCkge1xuICAgICAgICByZXR1cm4gcmVnbEZyYW1lYnVmZmVyQ3ViZVxuICAgICAgfVxuXG4gICAgICB2YXIgY29sb3JzID0gcmVnbEZyYW1lYnVmZmVyQ3ViZS5jb2xvclxuICAgICAgZm9yIChpID0gMDsgaSA8IGNvbG9ycy5sZW5ndGg7ICsraSkge1xuICAgICAgICBjb2xvcnNbaV0ucmVzaXplKHJhZGl1cylcbiAgICAgIH1cblxuICAgICAgZm9yIChpID0gMDsgaSA8IDY7ICsraSkge1xuICAgICAgICBmYWNlc1tpXS5yZXNpemUocmFkaXVzKVxuICAgICAgfVxuXG4gICAgICByZWdsRnJhbWVidWZmZXJDdWJlLndpZHRoID0gcmVnbEZyYW1lYnVmZmVyQ3ViZS5oZWlnaHQgPSByYWRpdXNcblxuICAgICAgcmV0dXJuIHJlZ2xGcmFtZWJ1ZmZlckN1YmVcbiAgICB9XG5cbiAgICByZWdsRnJhbWVidWZmZXJDdWJlKG9wdGlvbnMpXG5cbiAgICByZXR1cm4gZXh0ZW5kKHJlZ2xGcmFtZWJ1ZmZlckN1YmUsIHtcbiAgICAgIGZhY2VzOiBmYWNlcyxcbiAgICAgIHJlc2l6ZTogcmVzaXplLFxuICAgICAgX3JlZ2xUeXBlOiAnZnJhbWVidWZmZXJDdWJlJyxcbiAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZmFjZXMuZm9yRWFjaChmdW5jdGlvbiAoZikge1xuICAgICAgICAgIGYuZGVzdHJveSgpXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlc3RvcmVGcmFtZWJ1ZmZlcnMgKCkge1xuICAgIGZyYW1lYnVmZmVyU3RhdGUuY3VyID0gbnVsbFxuICAgIGZyYW1lYnVmZmVyU3RhdGUubmV4dCA9IG51bGxcbiAgICBmcmFtZWJ1ZmZlclN0YXRlLmRpcnR5ID0gdHJ1ZVxuICAgIHZhbHVlcyhmcmFtZWJ1ZmZlclNldCkuZm9yRWFjaChmdW5jdGlvbiAoZmIpIHtcbiAgICAgIGZiLmZyYW1lYnVmZmVyID0gZ2wuY3JlYXRlRnJhbWVidWZmZXIoKVxuICAgICAgdXBkYXRlRnJhbWVidWZmZXIoZmIpXG4gICAgfSlcbiAgfVxuXG4gIHJldHVybiBleHRlbmQoZnJhbWVidWZmZXJTdGF0ZSwge1xuICAgIGdldEZyYW1lYnVmZmVyOiBmdW5jdGlvbiAob2JqZWN0KSB7XG4gICAgICBpZiAodHlwZW9mIG9iamVjdCA9PT0gJ2Z1bmN0aW9uJyAmJiBvYmplY3QuX3JlZ2xUeXBlID09PSAnZnJhbWVidWZmZXInKSB7XG4gICAgICAgIHZhciBmYm8gPSBvYmplY3QuX2ZyYW1lYnVmZmVyXG4gICAgICAgIGlmIChmYm8gaW5zdGFuY2VvZiBSRUdMRnJhbWVidWZmZXIpIHtcbiAgICAgICAgICByZXR1cm4gZmJvXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsXG4gICAgfSxcbiAgICBjcmVhdGU6IGNyZWF0ZUZCTyxcbiAgICBjcmVhdGVDdWJlOiBjcmVhdGVDdWJlRkJPLFxuICAgIGNsZWFyOiBmdW5jdGlvbiAoKSB7XG4gICAgICB2YWx1ZXMoZnJhbWVidWZmZXJTZXQpLmZvckVhY2goZGVzdHJveSlcbiAgICB9LFxuICAgIHJlc3RvcmU6IHJlc3RvcmVGcmFtZWJ1ZmZlcnNcbiAgfSlcbn1cblxudmFyIEdMX0ZMT0FUJDYgPSA1MTI2XG52YXIgR0xfQVJSQVlfQlVGRkVSJDEgPSAzNDk2MlxuXG5mdW5jdGlvbiBBdHRyaWJ1dGVSZWNvcmQgKCkge1xuICB0aGlzLnN0YXRlID0gMFxuXG4gIHRoaXMueCA9IDAuMFxuICB0aGlzLnkgPSAwLjBcbiAgdGhpcy56ID0gMC4wXG4gIHRoaXMudyA9IDAuMFxuXG4gIHRoaXMuYnVmZmVyID0gbnVsbFxuICB0aGlzLnNpemUgPSAwXG4gIHRoaXMubm9ybWFsaXplZCA9IGZhbHNlXG4gIHRoaXMudHlwZSA9IEdMX0ZMT0FUJDZcbiAgdGhpcy5vZmZzZXQgPSAwXG4gIHRoaXMuc3RyaWRlID0gMFxuICB0aGlzLmRpdmlzb3IgPSAwXG59XG5cbmZ1bmN0aW9uIHdyYXBBdHRyaWJ1dGVTdGF0ZSAoXG4gIGdsLFxuICBleHRlbnNpb25zLFxuICBsaW1pdHMsXG4gIHN0YXRzLFxuICBidWZmZXJTdGF0ZSkge1xuICB2YXIgTlVNX0FUVFJJQlVURVMgPSBsaW1pdHMubWF4QXR0cmlidXRlc1xuICB2YXIgYXR0cmlidXRlQmluZGluZ3MgPSBuZXcgQXJyYXkoTlVNX0FUVFJJQlVURVMpXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgTlVNX0FUVFJJQlVURVM7ICsraSkge1xuICAgIGF0dHJpYnV0ZUJpbmRpbmdzW2ldID0gbmV3IEF0dHJpYnV0ZVJlY29yZCgpXG4gIH1cbiAgdmFyIHZhb0NvdW50ID0gMFxuICB2YXIgdmFvU2V0ID0ge31cblxuICB2YXIgc3RhdGUgPSB7XG4gICAgUmVjb3JkOiBBdHRyaWJ1dGVSZWNvcmQsXG4gICAgc2NvcGU6IHt9LFxuICAgIHN0YXRlOiBhdHRyaWJ1dGVCaW5kaW5ncyxcbiAgICBjdXJyZW50VkFPOiBudWxsLFxuICAgIHRhcmdldFZBTzogbnVsbCxcbiAgICByZXN0b3JlOiBleHRWQU8oKSA/IHJlc3RvcmVWQU8gOiBmdW5jdGlvbiAoKSB7fSxcbiAgICBjcmVhdGVWQU86IGNyZWF0ZVZBTyxcbiAgICBnZXRWQU86IGdldFZBTyxcbiAgICBkZXN0cm95QnVmZmVyOiBkZXN0cm95QnVmZmVyLFxuICAgIHNldFZBTzogZXh0VkFPKCkgPyBzZXRWQU9FWFQgOiBzZXRWQU9FbXVsYXRlZCxcbiAgICBjbGVhcjogZXh0VkFPKCkgPyBkZXN0cm95VkFPRVhUIDogZnVuY3Rpb24gKCkge31cbiAgfVxuXG4gIGZ1bmN0aW9uIGRlc3Ryb3lCdWZmZXIgKGJ1ZmZlcikge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXR0cmlidXRlQmluZGluZ3MubGVuZ3RoOyArK2kpIHtcbiAgICAgIHZhciByZWNvcmQgPSBhdHRyaWJ1dGVCaW5kaW5nc1tpXVxuICAgICAgaWYgKHJlY29yZC5idWZmZXIgPT09IGJ1ZmZlcikge1xuICAgICAgICBnbC5kaXNhYmxlVmVydGV4QXR0cmliQXJyYXkoaSlcbiAgICAgICAgcmVjb3JkLmJ1ZmZlciA9IG51bGxcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBleHRWQU8gKCkge1xuICAgIHJldHVybiBleHRlbnNpb25zLm9lc192ZXJ0ZXhfYXJyYXlfb2JqZWN0XG4gIH1cblxuICBmdW5jdGlvbiBleHRJbnN0YW5jZWQgKCkge1xuICAgIHJldHVybiBleHRlbnNpb25zLmFuZ2xlX2luc3RhbmNlZF9hcnJheXNcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFZBTyAodmFvKSB7XG4gICAgaWYgKHR5cGVvZiB2YW8gPT09ICdmdW5jdGlvbicgJiYgdmFvLl92YW8pIHtcbiAgICAgIHJldHVybiB2YW8uX3Zhb1xuICAgIH1cbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgZnVuY3Rpb24gc2V0VkFPRVhUICh2YW8pIHtcbiAgICBpZiAodmFvID09PSBzdGF0ZS5jdXJyZW50VkFPKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgdmFyIGV4dCA9IGV4dFZBTygpXG4gICAgaWYgKHZhbykge1xuICAgICAgZXh0LmJpbmRWZXJ0ZXhBcnJheU9FUyh2YW8udmFvKVxuICAgIH0gZWxzZSB7XG4gICAgICBleHQuYmluZFZlcnRleEFycmF5T0VTKG51bGwpXG4gICAgfVxuICAgIHN0YXRlLmN1cnJlbnRWQU8gPSB2YW9cbiAgfVxuXG4gIGZ1bmN0aW9uIHNldFZBT0VtdWxhdGVkICh2YW8pIHtcbiAgICBpZiAodmFvID09PSBzdGF0ZS5jdXJyZW50VkFPKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKHZhbykge1xuICAgICAgdmFvLmJpbmRBdHRycygpXG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBleHRpID0gZXh0SW5zdGFuY2VkKClcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXR0cmlidXRlQmluZGluZ3MubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgdmFyIGJpbmRpbmcgPSBhdHRyaWJ1dGVCaW5kaW5nc1tpXVxuICAgICAgICBpZiAoYmluZGluZy5idWZmZXIpIHtcbiAgICAgICAgICBnbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShpKVxuICAgICAgICAgIGdsLnZlcnRleEF0dHJpYlBvaW50ZXIoaSwgYmluZGluZy5zaXplLCBiaW5kaW5nLnR5cGUsIGJpbmRpbmcubm9ybWFsaXplZCwgYmluZGluZy5zdHJpZGUsIGJpbmRpbmcub2ZmZnNldClcbiAgICAgICAgICBpZiAoZXh0aSAmJiBiaW5kaW5nLmRpdmlzb3IpIHtcbiAgICAgICAgICAgIGV4dGkudmVydGV4QXR0cmliRGl2aXNvckFOR0xFKGksIGJpbmRpbmcuZGl2aXNvcilcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZ2wuZGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KGkpXG4gICAgICAgICAgZ2wudmVydGV4QXR0cmliNGYoaSwgYmluZGluZy54LCBiaW5kaW5nLnksIGJpbmRpbmcueiwgYmluZGluZy53KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHN0YXRlLmN1cnJlbnRWQU8gPSB2YW9cbiAgfVxuXG4gIGZ1bmN0aW9uIGRlc3Ryb3lWQU9FWFQgKCkge1xuICAgIHZhbHVlcyh2YW9TZXQpLmZvckVhY2goZnVuY3Rpb24gKHZhbykge1xuICAgICAgdmFvLmRlc3Ryb3koKVxuICAgIH0pXG4gIH1cblxuICBmdW5jdGlvbiBSRUdMVkFPICgpIHtcbiAgICB0aGlzLmlkID0gKyt2YW9Db3VudFxuICAgIHRoaXMuYXR0cmlidXRlcyA9IFtdXG4gICAgdmFyIGV4dGVuc2lvbiA9IGV4dFZBTygpXG4gICAgaWYgKGV4dGVuc2lvbikge1xuICAgICAgdGhpcy52YW8gPSBleHRlbnNpb24uY3JlYXRlVmVydGV4QXJyYXlPRVMoKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnZhbyA9IG51bGxcbiAgICB9XG4gICAgdmFvU2V0W3RoaXMuaWRdID0gdGhpc1xuICAgIHRoaXMuYnVmZmVycyA9IFtdXG4gIH1cblxuICBSRUdMVkFPLnByb3RvdHlwZS5iaW5kQXR0cnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGV4dGkgPSBleHRJbnN0YW5jZWQoKVxuICAgIHZhciBhdHRyaWJ1dGVzID0gdGhpcy5hdHRyaWJ1dGVzXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzLmxlbmd0aDsgKytpKSB7XG4gICAgICB2YXIgYXR0ciA9IGF0dHJpYnV0ZXNbaV1cbiAgICAgIGlmIChhdHRyLmJ1ZmZlcikge1xuICAgICAgICBnbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShpKVxuICAgICAgICBnbC5iaW5kQnVmZmVyKEdMX0FSUkFZX0JVRkZFUiQxLCBhdHRyLmJ1ZmZlci5idWZmZXIpXG4gICAgICAgIGdsLnZlcnRleEF0dHJpYlBvaW50ZXIoaSwgYXR0ci5zaXplLCBhdHRyLnR5cGUsIGF0dHIubm9ybWFsaXplZCwgYXR0ci5zdHJpZGUsIGF0dHIub2Zmc2V0KVxuICAgICAgICBpZiAoZXh0aSAmJiBhdHRyLmRpdmlzb3IpIHtcbiAgICAgICAgICBleHRpLnZlcnRleEF0dHJpYkRpdmlzb3JBTkdMRShpLCBhdHRyLmRpdmlzb3IpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGdsLmRpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheShpKVxuICAgICAgICBnbC52ZXJ0ZXhBdHRyaWI0ZihpLCBhdHRyLngsIGF0dHIueSwgYXR0ci56LCBhdHRyLncpXG4gICAgICB9XG4gICAgfVxuICAgIGZvciAodmFyIGogPSBhdHRyaWJ1dGVzLmxlbmd0aDsgaiA8IE5VTV9BVFRSSUJVVEVTOyArK2opIHtcbiAgICAgIGdsLmRpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheShqKVxuICAgIH1cbiAgfVxuXG4gIFJFR0xWQU8ucHJvdG90eXBlLnJlZnJlc2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGV4dCA9IGV4dFZBTygpXG4gICAgaWYgKGV4dCkge1xuICAgICAgZXh0LmJpbmRWZXJ0ZXhBcnJheU9FUyh0aGlzLnZhbylcbiAgICAgIHRoaXMuYmluZEF0dHJzKClcbiAgICAgIHN0YXRlLmN1cnJlbnRWQU8gPSB0aGlzXG4gICAgfVxuICB9XG5cbiAgUkVHTFZBTy5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodGhpcy52YW8pIHtcbiAgICAgIHZhciBleHRlbnNpb24gPSBleHRWQU8oKVxuICAgICAgaWYgKHRoaXMgPT09IHN0YXRlLmN1cnJlbnRWQU8pIHtcbiAgICAgICAgc3RhdGUuY3VycmVudFZBTyA9IG51bGxcbiAgICAgICAgZXh0ZW5zaW9uLmJpbmRWZXJ0ZXhBcnJheU9FUyhudWxsKVxuICAgICAgfVxuICAgICAgZXh0ZW5zaW9uLmRlbGV0ZVZlcnRleEFycmF5T0VTKHRoaXMudmFvKVxuICAgICAgdGhpcy52YW8gPSBudWxsXG4gICAgfVxuICAgIGlmICh2YW9TZXRbdGhpcy5pZF0pIHtcbiAgICAgIGRlbGV0ZSB2YW9TZXRbdGhpcy5pZF1cbiAgICAgIHN0YXRzLnZhb0NvdW50IC09IDFcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiByZXN0b3JlVkFPICgpIHtcbiAgICB2YXIgZXh0ID0gZXh0VkFPKClcbiAgICBpZiAoZXh0KSB7XG4gICAgICB2YWx1ZXModmFvU2V0KS5mb3JFYWNoKGZ1bmN0aW9uICh2YW8pIHtcbiAgICAgICAgdmFvLnJlZnJlc2goKVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVWQU8gKF9hdHRyKSB7XG4gICAgdmFyIHZhbyA9IG5ldyBSRUdMVkFPKClcbiAgICBzdGF0cy52YW9Db3VudCArPSAxXG5cbiAgICBmdW5jdGlvbiB1cGRhdGVWQU8gKGF0dHJpYnV0ZXMpIHtcbiAgICAgIGNoZWNrJDEoQXJyYXkuaXNBcnJheShhdHRyaWJ1dGVzKSwgJ2FyZ3VtZW50cyB0byB2ZXJ0ZXggYXJyYXkgY29uc3RydWN0b3IgbXVzdCBiZSBhbiBhcnJheScpXG4gICAgICBjaGVjayQxKGF0dHJpYnV0ZXMubGVuZ3RoIDwgTlVNX0FUVFJJQlVURVMsICd0b28gbWFueSBhdHRyaWJ1dGVzJylcbiAgICAgIGNoZWNrJDEoYXR0cmlidXRlcy5sZW5ndGggPiAwLCAnbXVzdCBzcGVjaWZ5IGF0IGxlYXN0IG9uZSBhdHRyaWJ1dGUnKVxuXG4gICAgICB2YXIgYnVmVXBkYXRlZCA9IHt9XG4gICAgICB2YXIgbmF0dHJpYnV0ZXMgPSB2YW8uYXR0cmlidXRlc1xuICAgICAgbmF0dHJpYnV0ZXMubGVuZ3RoID0gYXR0cmlidXRlcy5sZW5ndGhcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXR0cmlidXRlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICB2YXIgc3BlYyA9IGF0dHJpYnV0ZXNbaV1cbiAgICAgICAgdmFyIHJlYyA9IG5hdHRyaWJ1dGVzW2ldID0gbmV3IEF0dHJpYnV0ZVJlY29yZCgpXG4gICAgICAgIHZhciBkYXRhID0gc3BlYy5kYXRhIHx8IHNwZWNcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkgfHwgaXNUeXBlZEFycmF5KGRhdGEpIHx8IGlzTkRBcnJheUxpa2UoZGF0YSkpIHtcbiAgICAgICAgICB2YXIgYnVmXG4gICAgICAgICAgaWYgKHZhby5idWZmZXJzW2ldKSB7XG4gICAgICAgICAgICBidWYgPSB2YW8uYnVmZmVyc1tpXVxuICAgICAgICAgICAgaWYgKGlzVHlwZWRBcnJheShkYXRhKSAmJiBidWYuX2J1ZmZlci5ieXRlTGVuZ3RoID49IGRhdGEuYnl0ZUxlbmd0aCkge1xuICAgICAgICAgICAgICBidWYuc3ViZGF0YShkYXRhKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgYnVmLmRlc3Ryb3koKVxuICAgICAgICAgICAgICB2YW8uYnVmZmVyc1tpXSA9IG51bGxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCF2YW8uYnVmZmVyc1tpXSkge1xuICAgICAgICAgICAgYnVmID0gdmFvLmJ1ZmZlcnNbaV0gPSBidWZmZXJTdGF0ZS5jcmVhdGUoc3BlYywgR0xfQVJSQVlfQlVGRkVSJDEsIGZhbHNlLCB0cnVlKVxuICAgICAgICAgIH1cbiAgICAgICAgICByZWMuYnVmZmVyID0gYnVmZmVyU3RhdGUuZ2V0QnVmZmVyKGJ1ZilcbiAgICAgICAgICByZWMuc2l6ZSA9IHJlYy5idWZmZXIuZGltZW5zaW9uIHwgMFxuICAgICAgICAgIHJlYy5ub3JtYWxpemVkID0gZmFsc2VcbiAgICAgICAgICByZWMudHlwZSA9IHJlYy5idWZmZXIuZHR5cGVcbiAgICAgICAgICByZWMub2Zmc2V0ID0gMFxuICAgICAgICAgIHJlYy5zdHJpZGUgPSAwXG4gICAgICAgICAgcmVjLmRpdmlzb3IgPSAwXG4gICAgICAgICAgcmVjLnN0YXRlID0gMVxuICAgICAgICAgIGJ1ZlVwZGF0ZWRbaV0gPSAxXG4gICAgICAgIH0gZWxzZSBpZiAoYnVmZmVyU3RhdGUuZ2V0QnVmZmVyKHNwZWMpKSB7XG4gICAgICAgICAgcmVjLmJ1ZmZlciA9IGJ1ZmZlclN0YXRlLmdldEJ1ZmZlcihzcGVjKVxuICAgICAgICAgIHJlYy5zaXplID0gcmVjLmJ1ZmZlci5kaW1lbnNpb24gfCAwXG4gICAgICAgICAgcmVjLm5vcm1hbGl6ZWQgPSBmYWxzZVxuICAgICAgICAgIHJlYy50eXBlID0gcmVjLmJ1ZmZlci5kdHlwZVxuICAgICAgICAgIHJlYy5vZmZzZXQgPSAwXG4gICAgICAgICAgcmVjLnN0cmlkZSA9IDBcbiAgICAgICAgICByZWMuZGl2aXNvciA9IDBcbiAgICAgICAgICByZWMuc3RhdGUgPSAxXG4gICAgICAgIH0gZWxzZSBpZiAoYnVmZmVyU3RhdGUuZ2V0QnVmZmVyKHNwZWMuYnVmZmVyKSkge1xuICAgICAgICAgIHJlYy5idWZmZXIgPSBidWZmZXJTdGF0ZS5nZXRCdWZmZXIoc3BlYy5idWZmZXIpXG4gICAgICAgICAgcmVjLnNpemUgPSAoKCtzcGVjLnNpemUpIHx8IHJlYy5idWZmZXIuZGltZW5zaW9uKSB8IDBcbiAgICAgICAgICByZWMubm9ybWFsaXplZCA9ICEhc3BlYy5ub3JtYWxpemVkIHx8IGZhbHNlXG4gICAgICAgICAgaWYgKCd0eXBlJyBpbiBzcGVjKSB7XG4gICAgICAgICAgICBjaGVjayQxLnBhcmFtZXRlcihzcGVjLnR5cGUsIGdsVHlwZXMsICdpbnZhbGlkIGJ1ZmZlciB0eXBlJylcbiAgICAgICAgICAgIHJlYy50eXBlID0gZ2xUeXBlc1tzcGVjLnR5cGVdXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlYy50eXBlID0gcmVjLmJ1ZmZlci5kdHlwZVxuICAgICAgICAgIH1cbiAgICAgICAgICByZWMub2Zmc2V0ID0gKHNwZWMub2Zmc2V0IHx8IDApIHwgMFxuICAgICAgICAgIHJlYy5zdHJpZGUgPSAoc3BlYy5zdHJpZGUgfHwgMCkgfCAwXG4gICAgICAgICAgcmVjLmRpdmlzb3IgPSAoc3BlYy5kaXZpc29yIHx8IDApIHwgMFxuICAgICAgICAgIHJlYy5zdGF0ZSA9IDFcblxuICAgICAgICAgIGNoZWNrJDEocmVjLnNpemUgPj0gMSAmJiByZWMuc2l6ZSA8PSA0LCAnc2l6ZSBtdXN0IGJlIGJldHdlZW4gMSBhbmQgNCcpXG4gICAgICAgICAgY2hlY2skMShyZWMub2Zmc2V0ID49IDAsICdpbnZhbGlkIG9mZnNldCcpXG4gICAgICAgICAgY2hlY2skMShyZWMuc3RyaWRlID49IDAgJiYgcmVjLnN0cmlkZSA8PSAyNTUsICdzdHJpZGUgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDI1NScpXG4gICAgICAgICAgY2hlY2skMShyZWMuZGl2aXNvciA+PSAwLCAnZGl2aXNvciBtdXN0IGJlIHBvc2l0aXZlJylcbiAgICAgICAgICBjaGVjayQxKCFyZWMuZGl2aXNvciB8fCAhIWV4dGVuc2lvbnMuYW5nbGVfaW5zdGFuY2VkX2FycmF5cywgJ0FOR0xFX2luc3RhbmNlZF9hcnJheXMgbXVzdCBiZSBlbmFibGVkIHRvIHVzZSBkaXZpc29yJylcbiAgICAgICAgfSBlbHNlIGlmICgneCcgaW4gc3BlYykge1xuICAgICAgICAgIGNoZWNrJDEoaSA+IDAsICdmaXJzdCBhdHRyaWJ1dGUgbXVzdCBub3QgYmUgYSBjb25zdGFudCcpXG4gICAgICAgICAgcmVjLnggPSArc3BlYy54IHx8IDBcbiAgICAgICAgICByZWMueSA9ICtzcGVjLnkgfHwgMFxuICAgICAgICAgIHJlYy56ID0gK3NwZWMueiB8fCAwXG4gICAgICAgICAgcmVjLncgPSArc3BlYy53IHx8IDBcbiAgICAgICAgICByZWMuc3RhdGUgPSAyXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2hlY2skMShmYWxzZSwgJ2ludmFsaWQgYXR0cmlidXRlIHNwZWMgZm9yIGxvY2F0aW9uICcgKyBpKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIHJldGlyZSB1bnVzZWQgYnVmZmVyc1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB2YW8uYnVmZmVycy5sZW5ndGg7ICsraikge1xuICAgICAgICBpZiAoIWJ1ZlVwZGF0ZWRbal0gJiYgdmFvLmJ1ZmZlcnNbal0pIHtcbiAgICAgICAgICB2YW8uYnVmZmVyc1tqXS5kZXN0cm95KClcbiAgICAgICAgICB2YW8uYnVmZmVyc1tqXSA9IG51bGxcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YW8ucmVmcmVzaCgpXG4gICAgICByZXR1cm4gdXBkYXRlVkFPXG4gICAgfVxuXG4gICAgdXBkYXRlVkFPLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHZhby5idWZmZXJzLmxlbmd0aDsgKytqKSB7XG4gICAgICAgIGlmICh2YW8uYnVmZmVyc1tqXSkge1xuICAgICAgICAgIHZhby5idWZmZXJzW2pdLmRlc3Ryb3koKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB2YW8uYnVmZmVycy5sZW5ndGggPSAwXG4gICAgICB2YW8uZGVzdHJveSgpXG4gICAgfVxuXG4gICAgdXBkYXRlVkFPLl92YW8gPSB2YW9cbiAgICB1cGRhdGVWQU8uX3JlZ2xUeXBlID0gJ3ZhbydcblxuICAgIHJldHVybiB1cGRhdGVWQU8oX2F0dHIpXG4gIH1cblxuICByZXR1cm4gc3RhdGVcbn1cblxudmFyIEdMX0ZSQUdNRU5UX1NIQURFUiA9IDM1NjMyXG52YXIgR0xfVkVSVEVYX1NIQURFUiA9IDM1NjMzXG5cbnZhciBHTF9BQ1RJVkVfVU5JRk9STVMgPSAweDhCODZcbnZhciBHTF9BQ1RJVkVfQVRUUklCVVRFUyA9IDB4OEI4OVxuXG5mdW5jdGlvbiB3cmFwU2hhZGVyU3RhdGUgKGdsLCBzdHJpbmdTdG9yZSwgc3RhdHMsIGNvbmZpZykge1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gZ2xzbCBjb21waWxhdGlvbiBhbmQgbGlua2luZ1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIGZyYWdTaGFkZXJzID0ge31cbiAgdmFyIHZlcnRTaGFkZXJzID0ge31cblxuICBmdW5jdGlvbiBBY3RpdmVJbmZvIChuYW1lLCBpZCwgbG9jYXRpb24sIGluZm8pIHtcbiAgICB0aGlzLm5hbWUgPSBuYW1lXG4gICAgdGhpcy5pZCA9IGlkXG4gICAgdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uXG4gICAgdGhpcy5pbmZvID0gaW5mb1xuICB9XG5cbiAgZnVuY3Rpb24gaW5zZXJ0QWN0aXZlSW5mbyAobGlzdCwgaW5mbykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7ICsraSkge1xuICAgICAgaWYgKGxpc3RbaV0uaWQgPT09IGluZm8uaWQpIHtcbiAgICAgICAgbGlzdFtpXS5sb2NhdGlvbiA9IGluZm8ubG9jYXRpb25cbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgfVxuICAgIGxpc3QucHVzaChpbmZvKVxuICB9XG5cbiAgZnVuY3Rpb24gZ2V0U2hhZGVyICh0eXBlLCBpZCwgY29tbWFuZCkge1xuICAgIHZhciBjYWNoZSA9IHR5cGUgPT09IEdMX0ZSQUdNRU5UX1NIQURFUiA/IGZyYWdTaGFkZXJzIDogdmVydFNoYWRlcnNcbiAgICB2YXIgc2hhZGVyID0gY2FjaGVbaWRdXG5cbiAgICBpZiAoIXNoYWRlcikge1xuICAgICAgdmFyIHNvdXJjZSA9IHN0cmluZ1N0b3JlLnN0cihpZClcbiAgICAgIHNoYWRlciA9IGdsLmNyZWF0ZVNoYWRlcih0eXBlKVxuICAgICAgZ2wuc2hhZGVyU291cmNlKHNoYWRlciwgc291cmNlKVxuICAgICAgZ2wuY29tcGlsZVNoYWRlcihzaGFkZXIpXG4gICAgICBjaGVjayQxLnNoYWRlckVycm9yKGdsLCBzaGFkZXIsIHNvdXJjZSwgdHlwZSwgY29tbWFuZClcbiAgICAgIGNhY2hlW2lkXSA9IHNoYWRlclxuICAgIH1cblxuICAgIHJldHVybiBzaGFkZXJcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBwcm9ncmFtIGxpbmtpbmdcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBwcm9ncmFtQ2FjaGUgPSB7fVxuICB2YXIgcHJvZ3JhbUxpc3QgPSBbXVxuXG4gIHZhciBQUk9HUkFNX0NPVU5URVIgPSAwXG5cbiAgZnVuY3Rpb24gUkVHTFByb2dyYW0gKGZyYWdJZCwgdmVydElkKSB7XG4gICAgdGhpcy5pZCA9IFBST0dSQU1fQ09VTlRFUisrXG4gICAgdGhpcy5mcmFnSWQgPSBmcmFnSWRcbiAgICB0aGlzLnZlcnRJZCA9IHZlcnRJZFxuICAgIHRoaXMucHJvZ3JhbSA9IG51bGxcbiAgICB0aGlzLnVuaWZvcm1zID0gW11cbiAgICB0aGlzLmF0dHJpYnV0ZXMgPSBbXVxuICAgIHRoaXMucmVmQ291bnQgPSAxXG5cbiAgICBpZiAoY29uZmlnLnByb2ZpbGUpIHtcbiAgICAgIHRoaXMuc3RhdHMgPSB7XG4gICAgICAgIHVuaWZvcm1zQ291bnQ6IDAsXG4gICAgICAgIGF0dHJpYnV0ZXNDb3VudDogMFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGxpbmtQcm9ncmFtIChkZXNjLCBjb21tYW5kLCBhdHRyaWJ1dGVMb2NhdGlvbnMpIHtcbiAgICB2YXIgaSwgaW5mb1xuXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIGNvbXBpbGUgJiBsaW5rXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIHZhciBmcmFnU2hhZGVyID0gZ2V0U2hhZGVyKEdMX0ZSQUdNRU5UX1NIQURFUiwgZGVzYy5mcmFnSWQpXG4gICAgdmFyIHZlcnRTaGFkZXIgPSBnZXRTaGFkZXIoR0xfVkVSVEVYX1NIQURFUiwgZGVzYy52ZXJ0SWQpXG5cbiAgICB2YXIgcHJvZ3JhbSA9IGRlc2MucHJvZ3JhbSA9IGdsLmNyZWF0ZVByb2dyYW0oKVxuICAgIGdsLmF0dGFjaFNoYWRlcihwcm9ncmFtLCBmcmFnU2hhZGVyKVxuICAgIGdsLmF0dGFjaFNoYWRlcihwcm9ncmFtLCB2ZXJ0U2hhZGVyKVxuICAgIGlmIChhdHRyaWJ1dGVMb2NhdGlvbnMpIHtcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBhdHRyaWJ1dGVMb2NhdGlvbnMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgdmFyIGJpbmRpbmcgPSBhdHRyaWJ1dGVMb2NhdGlvbnNbaV1cbiAgICAgICAgZ2wuYmluZEF0dHJpYkxvY2F0aW9uKHByb2dyYW0sIGJpbmRpbmdbMF0sIGJpbmRpbmdbMV0pXG4gICAgICB9XG4gICAgfVxuXG4gICAgZ2wubGlua1Byb2dyYW0ocHJvZ3JhbSlcbiAgICBjaGVjayQxLmxpbmtFcnJvcihcbiAgICAgIGdsLFxuICAgICAgcHJvZ3JhbSxcbiAgICAgIHN0cmluZ1N0b3JlLnN0cihkZXNjLmZyYWdJZCksXG4gICAgICBzdHJpbmdTdG9yZS5zdHIoZGVzYy52ZXJ0SWQpLFxuICAgICAgY29tbWFuZClcblxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBncmFiIHVuaWZvcm1zXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIHZhciBudW1Vbmlmb3JtcyA9IGdsLmdldFByb2dyYW1QYXJhbWV0ZXIocHJvZ3JhbSwgR0xfQUNUSVZFX1VOSUZPUk1TKVxuICAgIGlmIChjb25maWcucHJvZmlsZSkge1xuICAgICAgZGVzYy5zdGF0cy51bmlmb3Jtc0NvdW50ID0gbnVtVW5pZm9ybXNcbiAgICB9XG4gICAgdmFyIHVuaWZvcm1zID0gZGVzYy51bmlmb3Jtc1xuICAgIGZvciAoaSA9IDA7IGkgPCBudW1Vbmlmb3JtczsgKytpKSB7XG4gICAgICBpbmZvID0gZ2wuZ2V0QWN0aXZlVW5pZm9ybShwcm9ncmFtLCBpKVxuICAgICAgaWYgKGluZm8pIHtcbiAgICAgICAgaWYgKGluZm8uc2l6ZSA+IDEpIHtcbiAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGluZm8uc2l6ZTsgKytqKSB7XG4gICAgICAgICAgICB2YXIgbmFtZSA9IGluZm8ubmFtZS5yZXBsYWNlKCdbMF0nLCAnWycgKyBqICsgJ10nKVxuICAgICAgICAgICAgaW5zZXJ0QWN0aXZlSW5mbyh1bmlmb3JtcywgbmV3IEFjdGl2ZUluZm8oXG4gICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgIHN0cmluZ1N0b3JlLmlkKG5hbWUpLFxuICAgICAgICAgICAgICBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgbmFtZSksXG4gICAgICAgICAgICAgIGluZm8pKVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpbnNlcnRBY3RpdmVJbmZvKHVuaWZvcm1zLCBuZXcgQWN0aXZlSW5mbyhcbiAgICAgICAgICAgIGluZm8ubmFtZSxcbiAgICAgICAgICAgIHN0cmluZ1N0b3JlLmlkKGluZm8ubmFtZSksXG4gICAgICAgICAgICBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgaW5mby5uYW1lKSxcbiAgICAgICAgICAgIGluZm8pKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIGdyYWIgYXR0cmlidXRlc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICB2YXIgbnVtQXR0cmlidXRlcyA9IGdsLmdldFByb2dyYW1QYXJhbWV0ZXIocHJvZ3JhbSwgR0xfQUNUSVZFX0FUVFJJQlVURVMpXG4gICAgaWYgKGNvbmZpZy5wcm9maWxlKSB7XG4gICAgICBkZXNjLnN0YXRzLmF0dHJpYnV0ZXNDb3VudCA9IG51bUF0dHJpYnV0ZXNcbiAgICB9XG5cbiAgICB2YXIgYXR0cmlidXRlcyA9IGRlc2MuYXR0cmlidXRlc1xuICAgIGZvciAoaSA9IDA7IGkgPCBudW1BdHRyaWJ1dGVzOyArK2kpIHtcbiAgICAgIGluZm8gPSBnbC5nZXRBY3RpdmVBdHRyaWIocHJvZ3JhbSwgaSlcbiAgICAgIGlmIChpbmZvKSB7XG4gICAgICAgIGluc2VydEFjdGl2ZUluZm8oYXR0cmlidXRlcywgbmV3IEFjdGl2ZUluZm8oXG4gICAgICAgICAgaW5mby5uYW1lLFxuICAgICAgICAgIHN0cmluZ1N0b3JlLmlkKGluZm8ubmFtZSksXG4gICAgICAgICAgZ2wuZ2V0QXR0cmliTG9jYXRpb24ocHJvZ3JhbSwgaW5mby5uYW1lKSxcbiAgICAgICAgICBpbmZvKSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoY29uZmlnLnByb2ZpbGUpIHtcbiAgICBzdGF0cy5nZXRNYXhVbmlmb3Jtc0NvdW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIG0gPSAwXG4gICAgICBwcm9ncmFtTGlzdC5mb3JFYWNoKGZ1bmN0aW9uIChkZXNjKSB7XG4gICAgICAgIGlmIChkZXNjLnN0YXRzLnVuaWZvcm1zQ291bnQgPiBtKSB7XG4gICAgICAgICAgbSA9IGRlc2Muc3RhdHMudW5pZm9ybXNDb3VudFxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgcmV0dXJuIG1cbiAgICB9XG5cbiAgICBzdGF0cy5nZXRNYXhBdHRyaWJ1dGVzQ291bnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgbSA9IDBcbiAgICAgIHByb2dyYW1MaXN0LmZvckVhY2goZnVuY3Rpb24gKGRlc2MpIHtcbiAgICAgICAgaWYgKGRlc2Muc3RhdHMuYXR0cmlidXRlc0NvdW50ID4gbSkge1xuICAgICAgICAgIG0gPSBkZXNjLnN0YXRzLmF0dHJpYnV0ZXNDb3VudFxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgcmV0dXJuIG1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiByZXN0b3JlU2hhZGVycyAoKSB7XG4gICAgZnJhZ1NoYWRlcnMgPSB7fVxuICAgIHZlcnRTaGFkZXJzID0ge31cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb2dyYW1MaXN0Lmxlbmd0aDsgKytpKSB7XG4gICAgICBsaW5rUHJvZ3JhbShwcm9ncmFtTGlzdFtpXSwgbnVsbCwgcHJvZ3JhbUxpc3RbaV0uYXR0cmlidXRlcy5tYXAoZnVuY3Rpb24gKGluZm8pIHtcbiAgICAgICAgcmV0dXJuIFtpbmZvLmxvY2F0aW9uLCBpbmZvLm5hbWVdXG4gICAgICB9KSlcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGNsZWFyOiBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgZGVsZXRlU2hhZGVyID0gZ2wuZGVsZXRlU2hhZGVyLmJpbmQoZ2wpXG4gICAgICB2YWx1ZXMoZnJhZ1NoYWRlcnMpLmZvckVhY2goZGVsZXRlU2hhZGVyKVxuICAgICAgZnJhZ1NoYWRlcnMgPSB7fVxuICAgICAgdmFsdWVzKHZlcnRTaGFkZXJzKS5mb3JFYWNoKGRlbGV0ZVNoYWRlcilcbiAgICAgIHZlcnRTaGFkZXJzID0ge31cblxuICAgICAgcHJvZ3JhbUxpc3QuZm9yRWFjaChmdW5jdGlvbiAoZGVzYykge1xuICAgICAgICBnbC5kZWxldGVQcm9ncmFtKGRlc2MucHJvZ3JhbSlcbiAgICAgIH0pXG4gICAgICBwcm9ncmFtTGlzdC5sZW5ndGggPSAwXG4gICAgICBwcm9ncmFtQ2FjaGUgPSB7fVxuXG4gICAgICBzdGF0cy5zaGFkZXJDb3VudCA9IDBcbiAgICB9LFxuXG4gICAgcHJvZ3JhbTogZnVuY3Rpb24gKHZlcnRJZCwgZnJhZ0lkLCBjb21tYW5kLCBhdHRyaWJMb2NhdGlvbnMpIHtcbiAgICAgIGNoZWNrJDEuY29tbWFuZCh2ZXJ0SWQgPj0gMCwgJ21pc3NpbmcgdmVydGV4IHNoYWRlcicsIGNvbW1hbmQpXG4gICAgICBjaGVjayQxLmNvbW1hbmQoZnJhZ0lkID49IDAsICdtaXNzaW5nIGZyYWdtZW50IHNoYWRlcicsIGNvbW1hbmQpXG5cbiAgICAgIHZhciBjYWNoZSA9IHByb2dyYW1DYWNoZVtmcmFnSWRdXG4gICAgICBpZiAoIWNhY2hlKSB7XG4gICAgICAgIGNhY2hlID0gcHJvZ3JhbUNhY2hlW2ZyYWdJZF0gPSB7fVxuICAgICAgfVxuICAgICAgdmFyIHByZXZQcm9ncmFtID0gY2FjaGVbdmVydElkXVxuICAgICAgaWYgKHByZXZQcm9ncmFtKSB7XG4gICAgICAgIHByZXZQcm9ncmFtLnJlZkNvdW50KytcbiAgICAgICAgaWYgKCFhdHRyaWJMb2NhdGlvbnMpIHtcbiAgICAgICAgICByZXR1cm4gcHJldlByb2dyYW1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdmFyIHByb2dyYW0gPSBuZXcgUkVHTFByb2dyYW0oZnJhZ0lkLCB2ZXJ0SWQpXG4gICAgICBzdGF0cy5zaGFkZXJDb3VudCsrXG4gICAgICBsaW5rUHJvZ3JhbShwcm9ncmFtLCBjb21tYW5kLCBhdHRyaWJMb2NhdGlvbnMpXG4gICAgICBpZiAoIXByZXZQcm9ncmFtKSB7XG4gICAgICAgIGNhY2hlW3ZlcnRJZF0gPSBwcm9ncmFtXG4gICAgICB9XG4gICAgICBwcm9ncmFtTGlzdC5wdXNoKHByb2dyYW0pXG4gICAgICByZXR1cm4gZXh0ZW5kKHByb2dyYW0sIHtcbiAgICAgICAgZGVzdHJveTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHByb2dyYW0ucmVmQ291bnQtLVxuICAgICAgICAgIGlmIChwcm9ncmFtLnJlZkNvdW50IDw9IDApIHtcbiAgICAgICAgICAgIGdsLmRlbGV0ZVByb2dyYW0ocHJvZ3JhbS5wcm9ncmFtKVxuICAgICAgICAgICAgdmFyIGlkeCA9IHByb2dyYW1MaXN0LmluZGV4T2YocHJvZ3JhbSlcbiAgICAgICAgICAgIHByb2dyYW1MaXN0LnNwbGljZShpZHgsIDEpXG4gICAgICAgICAgICBzdGF0cy5zaGFkZXJDb3VudC0tXG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIG5vIHByb2dyYW0gaXMgbGlua2VkIHRvIHRoaXMgdmVydCBhbnltb3JlXG4gICAgICAgICAgaWYgKGNhY2hlW3Byb2dyYW0udmVydElkXS5yZWZDb3VudCA8PSAwKSB7XG4gICAgICAgICAgICBnbC5kZWxldGVTaGFkZXIodmVydFNoYWRlcnNbcHJvZ3JhbS52ZXJ0SWRdKVxuICAgICAgICAgICAgZGVsZXRlIHZlcnRTaGFkZXJzW3Byb2dyYW0udmVydElkXVxuICAgICAgICAgICAgZGVsZXRlIHByb2dyYW1DYWNoZVtwcm9ncmFtLmZyYWdJZF1bcHJvZ3JhbS52ZXJ0SWRdXG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIG5vIHByb2dyYW0gaXMgbGlua2VkIHRvIHRoaXMgZnJhZyBhbnltb3JlXG4gICAgICAgICAgaWYgKCFPYmplY3Qua2V5cyhwcm9ncmFtQ2FjaGVbcHJvZ3JhbS5mcmFnSWRdKS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGdsLmRlbGV0ZVNoYWRlcihmcmFnU2hhZGVyc1twcm9ncmFtLmZyYWdJZF0pXG4gICAgICAgICAgICBkZWxldGUgZnJhZ1NoYWRlcnNbcHJvZ3JhbS5mcmFnSWRdXG4gICAgICAgICAgICBkZWxldGUgcHJvZ3JhbUNhY2hlW3Byb2dyYW0uZnJhZ0lkXVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgcmVzdG9yZTogcmVzdG9yZVNoYWRlcnMsXG5cbiAgICBzaGFkZXI6IGdldFNoYWRlcixcblxuICAgIGZyYWc6IC0xLFxuICAgIHZlcnQ6IC0xXG4gIH1cbn1cblxudmFyIEdMX1JHQkEkMyA9IDY0MDhcbnZhciBHTF9VTlNJR05FRF9CWVRFJDcgPSA1MTIxXG52YXIgR0xfUEFDS19BTElHTk1FTlQgPSAweDBEMDVcbnZhciBHTF9GTE9BVCQ3ID0gMHgxNDA2IC8vIDUxMjZcblxuZnVuY3Rpb24gd3JhcFJlYWRQaXhlbHMgKFxuICBnbCxcbiAgZnJhbWVidWZmZXJTdGF0ZSxcbiAgcmVnbFBvbGwsXG4gIGNvbnRleHQsXG4gIGdsQXR0cmlidXRlcyxcbiAgZXh0ZW5zaW9ucyxcbiAgbGltaXRzKSB7XG4gIGZ1bmN0aW9uIHJlYWRQaXhlbHNJbXBsIChpbnB1dCkge1xuICAgIHZhciB0eXBlXG4gICAgaWYgKGZyYW1lYnVmZmVyU3RhdGUubmV4dCA9PT0gbnVsbCkge1xuICAgICAgY2hlY2skMShcbiAgICAgICAgZ2xBdHRyaWJ1dGVzLnByZXNlcnZlRHJhd2luZ0J1ZmZlcixcbiAgICAgICAgJ3lvdSBtdXN0IGNyZWF0ZSBhIHdlYmdsIGNvbnRleHQgd2l0aCBcInByZXNlcnZlRHJhd2luZ0J1ZmZlclwiOnRydWUgaW4gb3JkZXIgdG8gcmVhZCBwaXhlbHMgZnJvbSB0aGUgZHJhd2luZyBidWZmZXInKVxuICAgICAgdHlwZSA9IEdMX1VOU0lHTkVEX0JZVEUkN1xuICAgIH0gZWxzZSB7XG4gICAgICBjaGVjayQxKFxuICAgICAgICBmcmFtZWJ1ZmZlclN0YXRlLm5leHQuY29sb3JBdHRhY2htZW50c1swXS50ZXh0dXJlICE9PSBudWxsLFxuICAgICAgICAnWW91IGNhbm5vdCByZWFkIGZyb20gYSByZW5kZXJidWZmZXInKVxuICAgICAgdHlwZSA9IGZyYW1lYnVmZmVyU3RhdGUubmV4dC5jb2xvckF0dGFjaG1lbnRzWzBdLnRleHR1cmUuX3RleHR1cmUudHlwZVxuXG4gICAgICBpZiAoZXh0ZW5zaW9ucy5vZXNfdGV4dHVyZV9mbG9hdCkge1xuICAgICAgICBjaGVjayQxKFxuICAgICAgICAgIHR5cGUgPT09IEdMX1VOU0lHTkVEX0JZVEUkNyB8fCB0eXBlID09PSBHTF9GTE9BVCQ3LFxuICAgICAgICAgICdSZWFkaW5nIGZyb20gYSBmcmFtZWJ1ZmZlciBpcyBvbmx5IGFsbG93ZWQgZm9yIHRoZSB0eXBlcyBcXCd1aW50OFxcJyBhbmQgXFwnZmxvYXRcXCcnKVxuXG4gICAgICAgIGlmICh0eXBlID09PSBHTF9GTE9BVCQ3KSB7XG4gICAgICAgICAgY2hlY2skMShsaW1pdHMucmVhZEZsb2F0LCAnUmVhZGluZyBcXCdmbG9hdFxcJyB2YWx1ZXMgaXMgbm90IHBlcm1pdHRlZCBpbiB5b3VyIGJyb3dzZXIuIEZvciBhIGZhbGxiYWNrLCBwbGVhc2Ugc2VlOiBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9nbHNsLXJlYWQtZmxvYXQnKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjaGVjayQxKFxuICAgICAgICAgIHR5cGUgPT09IEdMX1VOU0lHTkVEX0JZVEUkNyxcbiAgICAgICAgICAnUmVhZGluZyBmcm9tIGEgZnJhbWVidWZmZXIgaXMgb25seSBhbGxvd2VkIGZvciB0aGUgdHlwZSBcXCd1aW50OFxcJycpXG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHggPSAwXG4gICAgdmFyIHkgPSAwXG4gICAgdmFyIHdpZHRoID0gY29udGV4dC5mcmFtZWJ1ZmZlcldpZHRoXG4gICAgdmFyIGhlaWdodCA9IGNvbnRleHQuZnJhbWVidWZmZXJIZWlnaHRcbiAgICB2YXIgZGF0YSA9IG51bGxcblxuICAgIGlmIChpc1R5cGVkQXJyYXkoaW5wdXQpKSB7XG4gICAgICBkYXRhID0gaW5wdXRcbiAgICB9IGVsc2UgaWYgKGlucHV0KSB7XG4gICAgICBjaGVjayQxLnR5cGUoaW5wdXQsICdvYmplY3QnLCAnaW52YWxpZCBhcmd1bWVudHMgdG8gcmVnbC5yZWFkKCknKVxuICAgICAgeCA9IGlucHV0LnggfCAwXG4gICAgICB5ID0gaW5wdXQueSB8IDBcbiAgICAgIGNoZWNrJDEoXG4gICAgICAgIHggPj0gMCAmJiB4IDwgY29udGV4dC5mcmFtZWJ1ZmZlcldpZHRoLFxuICAgICAgICAnaW52YWxpZCB4IG9mZnNldCBmb3IgcmVnbC5yZWFkJylcbiAgICAgIGNoZWNrJDEoXG4gICAgICAgIHkgPj0gMCAmJiB5IDwgY29udGV4dC5mcmFtZWJ1ZmZlckhlaWdodCxcbiAgICAgICAgJ2ludmFsaWQgeSBvZmZzZXQgZm9yIHJlZ2wucmVhZCcpXG4gICAgICB3aWR0aCA9IChpbnB1dC53aWR0aCB8fCAoY29udGV4dC5mcmFtZWJ1ZmZlcldpZHRoIC0geCkpIHwgMFxuICAgICAgaGVpZ2h0ID0gKGlucHV0LmhlaWdodCB8fCAoY29udGV4dC5mcmFtZWJ1ZmZlckhlaWdodCAtIHkpKSB8IDBcbiAgICAgIGRhdGEgPSBpbnB1dC5kYXRhIHx8IG51bGxcbiAgICB9XG5cbiAgICAvLyBzYW5pdHkgY2hlY2sgaW5wdXQuZGF0YVxuICAgIGlmIChkYXRhKSB7XG4gICAgICBpZiAodHlwZSA9PT0gR0xfVU5TSUdORURfQllURSQ3KSB7XG4gICAgICAgIGNoZWNrJDEoXG4gICAgICAgICAgZGF0YSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXksXG4gICAgICAgICAgJ2J1ZmZlciBtdXN0IGJlIFxcJ1VpbnQ4QXJyYXlcXCcgd2hlbiByZWFkaW5nIGZyb20gYSBmcmFtZWJ1ZmZlciBvZiB0eXBlIFxcJ3VpbnQ4XFwnJylcbiAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gR0xfRkxPQVQkNykge1xuICAgICAgICBjaGVjayQxKFxuICAgICAgICAgIGRhdGEgaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXksXG4gICAgICAgICAgJ2J1ZmZlciBtdXN0IGJlIFxcJ0Zsb2F0MzJBcnJheVxcJyB3aGVuIHJlYWRpbmcgZnJvbSBhIGZyYW1lYnVmZmVyIG9mIHR5cGUgXFwnZmxvYXRcXCcnKVxuICAgICAgfVxuICAgIH1cblxuICAgIGNoZWNrJDEoXG4gICAgICB3aWR0aCA+IDAgJiYgd2lkdGggKyB4IDw9IGNvbnRleHQuZnJhbWVidWZmZXJXaWR0aCxcbiAgICAgICdpbnZhbGlkIHdpZHRoIGZvciByZWFkIHBpeGVscycpXG4gICAgY2hlY2skMShcbiAgICAgIGhlaWdodCA+IDAgJiYgaGVpZ2h0ICsgeSA8PSBjb250ZXh0LmZyYW1lYnVmZmVySGVpZ2h0LFxuICAgICAgJ2ludmFsaWQgaGVpZ2h0IGZvciByZWFkIHBpeGVscycpXG5cbiAgICAvLyBVcGRhdGUgV2ViR0wgc3RhdGVcbiAgICByZWdsUG9sbCgpXG5cbiAgICAvLyBDb21wdXRlIHNpemVcbiAgICB2YXIgc2l6ZSA9IHdpZHRoICogaGVpZ2h0ICogNFxuXG4gICAgLy8gQWxsb2NhdGUgZGF0YVxuICAgIGlmICghZGF0YSkge1xuICAgICAgaWYgKHR5cGUgPT09IEdMX1VOU0lHTkVEX0JZVEUkNykge1xuICAgICAgICBkYXRhID0gbmV3IFVpbnQ4QXJyYXkoc2l6ZSlcbiAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gR0xfRkxPQVQkNykge1xuICAgICAgICBkYXRhID0gZGF0YSB8fCBuZXcgRmxvYXQzMkFycmF5KHNpemUpXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVHlwZSBjaGVja1xuICAgIGNoZWNrJDEuaXNUeXBlZEFycmF5KGRhdGEsICdkYXRhIGJ1ZmZlciBmb3IgcmVnbC5yZWFkKCkgbXVzdCBiZSBhIHR5cGVkYXJyYXknKVxuICAgIGNoZWNrJDEoZGF0YS5ieXRlTGVuZ3RoID49IHNpemUsICdkYXRhIGJ1ZmZlciBmb3IgcmVnbC5yZWFkKCkgdG9vIHNtYWxsJylcblxuICAgIC8vIFJ1biByZWFkIHBpeGVsc1xuICAgIGdsLnBpeGVsU3RvcmVpKEdMX1BBQ0tfQUxJR05NRU5ULCA0KVxuICAgIGdsLnJlYWRQaXhlbHMoeCwgeSwgd2lkdGgsIGhlaWdodCwgR0xfUkdCQSQzLFxuICAgICAgdHlwZSxcbiAgICAgIGRhdGEpXG5cbiAgICByZXR1cm4gZGF0YVxuICB9XG5cbiAgZnVuY3Rpb24gcmVhZFBpeGVsc0ZCTyAob3B0aW9ucykge1xuICAgIHZhciByZXN1bHRcbiAgICBmcmFtZWJ1ZmZlclN0YXRlLnNldEZCTyh7XG4gICAgICBmcmFtZWJ1ZmZlcjogb3B0aW9ucy5mcmFtZWJ1ZmZlclxuICAgIH0sIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJlc3VsdCA9IHJlYWRQaXhlbHNJbXBsKG9wdGlvbnMpXG4gICAgfSlcbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICBmdW5jdGlvbiByZWFkUGl4ZWxzIChvcHRpb25zKSB7XG4gICAgaWYgKCFvcHRpb25zIHx8ICEoJ2ZyYW1lYnVmZmVyJyBpbiBvcHRpb25zKSkge1xuICAgICAgcmV0dXJuIHJlYWRQaXhlbHNJbXBsKG9wdGlvbnMpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiByZWFkUGl4ZWxzRkJPKG9wdGlvbnMpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlYWRQaXhlbHNcbn1cblxuZnVuY3Rpb24gc2xpY2UgKHgpIHtcbiAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHgpXG59XG5cbmZ1bmN0aW9uIGpvaW4gKHgpIHtcbiAgcmV0dXJuIHNsaWNlKHgpLmpvaW4oJycpXG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUVudmlyb25tZW50ICgpIHtcbiAgLy8gVW5pcXVlIHZhcmlhYmxlIGlkIGNvdW50ZXJcbiAgdmFyIHZhckNvdW50ZXIgPSAwXG5cbiAgLy8gTGlua2VkIHZhbHVlcyBhcmUgcGFzc2VkIGZyb20gdGhpcyBzY29wZSBpbnRvIHRoZSBnZW5lcmF0ZWQgY29kZSBibG9ja1xuICAvLyBDYWxsaW5nIGxpbmsoKSBwYXNzZXMgYSB2YWx1ZSBpbnRvIHRoZSBnZW5lcmF0ZWQgc2NvcGUgYW5kIHJldHVybnNcbiAgLy8gdGhlIHZhcmlhYmxlIG5hbWUgd2hpY2ggaXQgaXMgYm91bmQgdG9cbiAgdmFyIGxpbmtlZE5hbWVzID0gW11cbiAgdmFyIGxpbmtlZFZhbHVlcyA9IFtdXG4gIGZ1bmN0aW9uIGxpbmsgKHZhbHVlKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaW5rZWRWYWx1ZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgIGlmIChsaW5rZWRWYWx1ZXNbaV0gPT09IHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBsaW5rZWROYW1lc1tpXVxuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBuYW1lID0gJ2cnICsgKHZhckNvdW50ZXIrKylcbiAgICBsaW5rZWROYW1lcy5wdXNoKG5hbWUpXG4gICAgbGlua2VkVmFsdWVzLnB1c2godmFsdWUpXG4gICAgcmV0dXJuIG5hbWVcbiAgfVxuXG4gIC8vIGNyZWF0ZSBhIGNvZGUgYmxvY2tcbiAgZnVuY3Rpb24gYmxvY2sgKCkge1xuICAgIHZhciBjb2RlID0gW11cbiAgICBmdW5jdGlvbiBwdXNoICgpIHtcbiAgICAgIGNvZGUucHVzaC5hcHBseShjb2RlLCBzbGljZShhcmd1bWVudHMpKVxuICAgIH1cblxuICAgIHZhciB2YXJzID0gW11cbiAgICBmdW5jdGlvbiBkZWYgKCkge1xuICAgICAgdmFyIG5hbWUgPSAndicgKyAodmFyQ291bnRlcisrKVxuICAgICAgdmFycy5wdXNoKG5hbWUpXG5cbiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb2RlLnB1c2gobmFtZSwgJz0nKVxuICAgICAgICBjb2RlLnB1c2guYXBwbHkoY29kZSwgc2xpY2UoYXJndW1lbnRzKSlcbiAgICAgICAgY29kZS5wdXNoKCc7JylcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5hbWVcbiAgICB9XG5cbiAgICByZXR1cm4gZXh0ZW5kKHB1c2gsIHtcbiAgICAgIGRlZjogZGVmLFxuICAgICAgdG9TdHJpbmc6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGpvaW4oW1xuICAgICAgICAgICh2YXJzLmxlbmd0aCA+IDAgPyAndmFyICcgKyB2YXJzLmpvaW4oJywnKSArICc7JyA6ICcnKSxcbiAgICAgICAgICBqb2luKGNvZGUpXG4gICAgICAgIF0pXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGZ1bmN0aW9uIHNjb3BlICgpIHtcbiAgICB2YXIgZW50cnkgPSBibG9jaygpXG4gICAgdmFyIGV4aXQgPSBibG9jaygpXG5cbiAgICB2YXIgZW50cnlUb1N0cmluZyA9IGVudHJ5LnRvU3RyaW5nXG4gICAgdmFyIGV4aXRUb1N0cmluZyA9IGV4aXQudG9TdHJpbmdcblxuICAgIGZ1bmN0aW9uIHNhdmUgKG9iamVjdCwgcHJvcCkge1xuICAgICAgZXhpdChvYmplY3QsIHByb3AsICc9JywgZW50cnkuZGVmKG9iamVjdCwgcHJvcCksICc7JylcbiAgICB9XG5cbiAgICByZXR1cm4gZXh0ZW5kKGZ1bmN0aW9uICgpIHtcbiAgICAgIGVudHJ5LmFwcGx5KGVudHJ5LCBzbGljZShhcmd1bWVudHMpKVxuICAgIH0sIHtcbiAgICAgIGRlZjogZW50cnkuZGVmLFxuICAgICAgZW50cnk6IGVudHJ5LFxuICAgICAgZXhpdDogZXhpdCxcbiAgICAgIHNhdmU6IHNhdmUsXG4gICAgICBzZXQ6IGZ1bmN0aW9uIChvYmplY3QsIHByb3AsIHZhbHVlKSB7XG4gICAgICAgIHNhdmUob2JqZWN0LCBwcm9wKVxuICAgICAgICBlbnRyeShvYmplY3QsIHByb3AsICc9JywgdmFsdWUsICc7JylcbiAgICAgIH0sXG4gICAgICB0b1N0cmluZzogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gZW50cnlUb1N0cmluZygpICsgZXhpdFRvU3RyaW5nKClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgZnVuY3Rpb24gY29uZGl0aW9uYWwgKCkge1xuICAgIHZhciBwcmVkID0gam9pbihhcmd1bWVudHMpXG4gICAgdmFyIHRoZW5CbG9jayA9IHNjb3BlKClcbiAgICB2YXIgZWxzZUJsb2NrID0gc2NvcGUoKVxuXG4gICAgdmFyIHRoZW5Ub1N0cmluZyA9IHRoZW5CbG9jay50b1N0cmluZ1xuICAgIHZhciBlbHNlVG9TdHJpbmcgPSBlbHNlQmxvY2sudG9TdHJpbmdcblxuICAgIHJldHVybiBleHRlbmQodGhlbkJsb2NrLCB7XG4gICAgICB0aGVuOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoZW5CbG9jay5hcHBseSh0aGVuQmxvY2ssIHNsaWNlKGFyZ3VtZW50cykpXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgICB9LFxuICAgICAgZWxzZTogZnVuY3Rpb24gKCkge1xuICAgICAgICBlbHNlQmxvY2suYXBwbHkoZWxzZUJsb2NrLCBzbGljZShhcmd1bWVudHMpKVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgICAgfSxcbiAgICAgIHRvU3RyaW5nOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBlbHNlQ2xhdXNlID0gZWxzZVRvU3RyaW5nKClcbiAgICAgICAgaWYgKGVsc2VDbGF1c2UpIHtcbiAgICAgICAgICBlbHNlQ2xhdXNlID0gJ2Vsc2V7JyArIGVsc2VDbGF1c2UgKyAnfSdcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gam9pbihbXG4gICAgICAgICAgJ2lmKCcsIHByZWQsICcpeycsXG4gICAgICAgICAgdGhlblRvU3RyaW5nKCksXG4gICAgICAgICAgJ30nLCBlbHNlQ2xhdXNlXG4gICAgICAgIF0pXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8vIHByb2NlZHVyZSBsaXN0XG4gIHZhciBnbG9iYWxCbG9jayA9IGJsb2NrKClcbiAgdmFyIHByb2NlZHVyZXMgPSB7fVxuICBmdW5jdGlvbiBwcm9jIChuYW1lLCBjb3VudCkge1xuICAgIHZhciBhcmdzID0gW11cbiAgICBmdW5jdGlvbiBhcmcgKCkge1xuICAgICAgdmFyIG5hbWUgPSAnYScgKyBhcmdzLmxlbmd0aFxuICAgICAgYXJncy5wdXNoKG5hbWUpXG4gICAgICByZXR1cm4gbmFtZVxuICAgIH1cblxuICAgIGNvdW50ID0gY291bnQgfHwgMFxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY291bnQ7ICsraSkge1xuICAgICAgYXJnKClcbiAgICB9XG5cbiAgICB2YXIgYm9keSA9IHNjb3BlKClcbiAgICB2YXIgYm9keVRvU3RyaW5nID0gYm9keS50b1N0cmluZ1xuXG4gICAgdmFyIHJlc3VsdCA9IHByb2NlZHVyZXNbbmFtZV0gPSBleHRlbmQoYm9keSwge1xuICAgICAgYXJnOiBhcmcsXG4gICAgICB0b1N0cmluZzogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gam9pbihbXG4gICAgICAgICAgJ2Z1bmN0aW9uKCcsIGFyZ3Muam9pbigpLCAnKXsnLFxuICAgICAgICAgIGJvZHlUb1N0cmluZygpLFxuICAgICAgICAgICd9J1xuICAgICAgICBdKVxuICAgICAgfVxuICAgIH0pXG5cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICBmdW5jdGlvbiBjb21waWxlICgpIHtcbiAgICB2YXIgY29kZSA9IFsnXCJ1c2Ugc3RyaWN0XCI7JyxcbiAgICAgIGdsb2JhbEJsb2NrLFxuICAgICAgJ3JldHVybiB7J11cbiAgICBPYmplY3Qua2V5cyhwcm9jZWR1cmVzKS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICBjb2RlLnB1c2goJ1wiJywgbmFtZSwgJ1wiOicsIHByb2NlZHVyZXNbbmFtZV0udG9TdHJpbmcoKSwgJywnKVxuICAgIH0pXG4gICAgY29kZS5wdXNoKCd9JylcbiAgICB2YXIgc3JjID0gam9pbihjb2RlKVxuICAgICAgLnJlcGxhY2UoLzsvZywgJztcXG4nKVxuICAgICAgLnJlcGxhY2UoL30vZywgJ31cXG4nKVxuICAgICAgLnJlcGxhY2UoL3svZywgJ3tcXG4nKVxuICAgIHZhciBwcm9jID0gRnVuY3Rpb24uYXBwbHkobnVsbCwgbGlua2VkTmFtZXMuY29uY2F0KHNyYykpXG4gICAgcmV0dXJuIHByb2MuYXBwbHkobnVsbCwgbGlua2VkVmFsdWVzKVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBnbG9iYWw6IGdsb2JhbEJsb2NrLFxuICAgIGxpbms6IGxpbmssXG4gICAgYmxvY2s6IGJsb2NrLFxuICAgIHByb2M6IHByb2MsXG4gICAgc2NvcGU6IHNjb3BlLFxuICAgIGNvbmQ6IGNvbmRpdGlvbmFsLFxuICAgIGNvbXBpbGU6IGNvbXBpbGVcbiAgfVxufVxuXG4vLyBcImN1dGVcIiBuYW1lcyBmb3IgdmVjdG9yIGNvbXBvbmVudHNcbnZhciBDVVRFX0NPTVBPTkVOVFMgPSAneHl6dycuc3BsaXQoJycpXG5cbnZhciBHTF9VTlNJR05FRF9CWVRFJDggPSA1MTIxXG5cbnZhciBBVFRSSUJfU1RBVEVfUE9JTlRFUiA9IDFcbnZhciBBVFRSSUJfU1RBVEVfQ09OU1RBTlQgPSAyXG5cbnZhciBEWU5fRlVOQyQxID0gMFxudmFyIERZTl9QUk9QJDEgPSAxXG52YXIgRFlOX0NPTlRFWFQkMSA9IDJcbnZhciBEWU5fU1RBVEUkMSA9IDNcbnZhciBEWU5fVEhVTksgPSA0XG52YXIgRFlOX0NPTlNUQU5UJDEgPSA1XG52YXIgRFlOX0FSUkFZJDEgPSA2XG5cbnZhciBTX0RJVEhFUiA9ICdkaXRoZXInXG52YXIgU19CTEVORF9FTkFCTEUgPSAnYmxlbmQuZW5hYmxlJ1xudmFyIFNfQkxFTkRfQ09MT1IgPSAnYmxlbmQuY29sb3InXG52YXIgU19CTEVORF9FUVVBVElPTiA9ICdibGVuZC5lcXVhdGlvbidcbnZhciBTX0JMRU5EX0ZVTkMgPSAnYmxlbmQuZnVuYydcbnZhciBTX0RFUFRIX0VOQUJMRSA9ICdkZXB0aC5lbmFibGUnXG52YXIgU19ERVBUSF9GVU5DID0gJ2RlcHRoLmZ1bmMnXG52YXIgU19ERVBUSF9SQU5HRSA9ICdkZXB0aC5yYW5nZSdcbnZhciBTX0RFUFRIX01BU0sgPSAnZGVwdGgubWFzaydcbnZhciBTX0NPTE9SX01BU0sgPSAnY29sb3JNYXNrJ1xudmFyIFNfQ1VMTF9FTkFCTEUgPSAnY3VsbC5lbmFibGUnXG52YXIgU19DVUxMX0ZBQ0UgPSAnY3VsbC5mYWNlJ1xudmFyIFNfRlJPTlRfRkFDRSA9ICdmcm9udEZhY2UnXG52YXIgU19MSU5FX1dJRFRIID0gJ2xpbmVXaWR0aCdcbnZhciBTX1BPTFlHT05fT0ZGU0VUX0VOQUJMRSA9ICdwb2x5Z29uT2Zmc2V0LmVuYWJsZSdcbnZhciBTX1BPTFlHT05fT0ZGU0VUX09GRlNFVCA9ICdwb2x5Z29uT2Zmc2V0Lm9mZnNldCdcbnZhciBTX1NBTVBMRV9BTFBIQSA9ICdzYW1wbGUuYWxwaGEnXG52YXIgU19TQU1QTEVfRU5BQkxFID0gJ3NhbXBsZS5lbmFibGUnXG52YXIgU19TQU1QTEVfQ09WRVJBR0UgPSAnc2FtcGxlLmNvdmVyYWdlJ1xudmFyIFNfU1RFTkNJTF9FTkFCTEUgPSAnc3RlbmNpbC5lbmFibGUnXG52YXIgU19TVEVOQ0lMX01BU0sgPSAnc3RlbmNpbC5tYXNrJ1xudmFyIFNfU1RFTkNJTF9GVU5DID0gJ3N0ZW5jaWwuZnVuYydcbnZhciBTX1NURU5DSUxfT1BGUk9OVCA9ICdzdGVuY2lsLm9wRnJvbnQnXG52YXIgU19TVEVOQ0lMX09QQkFDSyA9ICdzdGVuY2lsLm9wQmFjaydcbnZhciBTX1NDSVNTT1JfRU5BQkxFID0gJ3NjaXNzb3IuZW5hYmxlJ1xudmFyIFNfU0NJU1NPUl9CT1ggPSAnc2Npc3Nvci5ib3gnXG52YXIgU19WSUVXUE9SVCA9ICd2aWV3cG9ydCdcblxudmFyIFNfUFJPRklMRSA9ICdwcm9maWxlJ1xuXG52YXIgU19GUkFNRUJVRkZFUiA9ICdmcmFtZWJ1ZmZlcidcbnZhciBTX1ZFUlQgPSAndmVydCdcbnZhciBTX0ZSQUcgPSAnZnJhZydcbnZhciBTX0VMRU1FTlRTID0gJ2VsZW1lbnRzJ1xudmFyIFNfUFJJTUlUSVZFID0gJ3ByaW1pdGl2ZSdcbnZhciBTX0NPVU5UID0gJ2NvdW50J1xudmFyIFNfT0ZGU0VUID0gJ29mZnNldCdcbnZhciBTX0lOU1RBTkNFUyA9ICdpbnN0YW5jZXMnXG52YXIgU19WQU8gPSAndmFvJ1xuXG52YXIgU1VGRklYX1dJRFRIID0gJ1dpZHRoJ1xudmFyIFNVRkZJWF9IRUlHSFQgPSAnSGVpZ2h0J1xuXG52YXIgU19GUkFNRUJVRkZFUl9XSURUSCA9IFNfRlJBTUVCVUZGRVIgKyBTVUZGSVhfV0lEVEhcbnZhciBTX0ZSQU1FQlVGRkVSX0hFSUdIVCA9IFNfRlJBTUVCVUZGRVIgKyBTVUZGSVhfSEVJR0hUXG52YXIgU19WSUVXUE9SVF9XSURUSCA9IFNfVklFV1BPUlQgKyBTVUZGSVhfV0lEVEhcbnZhciBTX1ZJRVdQT1JUX0hFSUdIVCA9IFNfVklFV1BPUlQgKyBTVUZGSVhfSEVJR0hUXG52YXIgU19EUkFXSU5HQlVGRkVSID0gJ2RyYXdpbmdCdWZmZXInXG52YXIgU19EUkFXSU5HQlVGRkVSX1dJRFRIID0gU19EUkFXSU5HQlVGRkVSICsgU1VGRklYX1dJRFRIXG52YXIgU19EUkFXSU5HQlVGRkVSX0hFSUdIVCA9IFNfRFJBV0lOR0JVRkZFUiArIFNVRkZJWF9IRUlHSFRcblxudmFyIE5FU1RFRF9PUFRJT05TID0gW1xuICBTX0JMRU5EX0ZVTkMsXG4gIFNfQkxFTkRfRVFVQVRJT04sXG4gIFNfU1RFTkNJTF9GVU5DLFxuICBTX1NURU5DSUxfT1BGUk9OVCxcbiAgU19TVEVOQ0lMX09QQkFDSyxcbiAgU19TQU1QTEVfQ09WRVJBR0UsXG4gIFNfVklFV1BPUlQsXG4gIFNfU0NJU1NPUl9CT1gsXG4gIFNfUE9MWUdPTl9PRkZTRVRfT0ZGU0VUXG5dXG5cbnZhciBHTF9BUlJBWV9CVUZGRVIkMiA9IDM0OTYyXG52YXIgR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVIkMSA9IDM0OTYzXG5cbnZhciBHTF9GUkFHTUVOVF9TSEFERVIkMSA9IDM1NjMyXG52YXIgR0xfVkVSVEVYX1NIQURFUiQxID0gMzU2MzNcblxudmFyIEdMX1RFWFRVUkVfMkQkMyA9IDB4MERFMVxudmFyIEdMX1RFWFRVUkVfQ1VCRV9NQVAkMiA9IDB4ODUxM1xuXG52YXIgR0xfQ1VMTF9GQUNFID0gMHgwQjQ0XG52YXIgR0xfQkxFTkQgPSAweDBCRTJcbnZhciBHTF9ESVRIRVIgPSAweDBCRDBcbnZhciBHTF9TVEVOQ0lMX1RFU1QgPSAweDBCOTBcbnZhciBHTF9ERVBUSF9URVNUID0gMHgwQjcxXG52YXIgR0xfU0NJU1NPUl9URVNUID0gMHgwQzExXG52YXIgR0xfUE9MWUdPTl9PRkZTRVRfRklMTCA9IDB4ODAzN1xudmFyIEdMX1NBTVBMRV9BTFBIQV9UT19DT1ZFUkFHRSA9IDB4ODA5RVxudmFyIEdMX1NBTVBMRV9DT1ZFUkFHRSA9IDB4ODBBMFxuXG52YXIgR0xfRkxPQVQkOCA9IDUxMjZcbnZhciBHTF9GTE9BVF9WRUMyID0gMzU2NjRcbnZhciBHTF9GTE9BVF9WRUMzID0gMzU2NjVcbnZhciBHTF9GTE9BVF9WRUM0ID0gMzU2NjZcbnZhciBHTF9JTlQkMyA9IDUxMjRcbnZhciBHTF9JTlRfVkVDMiA9IDM1NjY3XG52YXIgR0xfSU5UX1ZFQzMgPSAzNTY2OFxudmFyIEdMX0lOVF9WRUM0ID0gMzU2NjlcbnZhciBHTF9CT09MID0gMzU2NzBcbnZhciBHTF9CT09MX1ZFQzIgPSAzNTY3MVxudmFyIEdMX0JPT0xfVkVDMyA9IDM1NjcyXG52YXIgR0xfQk9PTF9WRUM0ID0gMzU2NzNcbnZhciBHTF9GTE9BVF9NQVQyID0gMzU2NzRcbnZhciBHTF9GTE9BVF9NQVQzID0gMzU2NzVcbnZhciBHTF9GTE9BVF9NQVQ0ID0gMzU2NzZcbnZhciBHTF9TQU1QTEVSXzJEID0gMzU2NzhcbnZhciBHTF9TQU1QTEVSX0NVQkUgPSAzNTY4MFxuXG52YXIgR0xfVFJJQU5HTEVTJDEgPSA0XG5cbnZhciBHTF9GUk9OVCA9IDEwMjhcbnZhciBHTF9CQUNLID0gMTAyOVxudmFyIEdMX0NXID0gMHgwOTAwXG52YXIgR0xfQ0NXID0gMHgwOTAxXG52YXIgR0xfTUlOX0VYVCA9IDB4ODAwN1xudmFyIEdMX01BWF9FWFQgPSAweDgwMDhcbnZhciBHTF9BTFdBWVMgPSA1MTlcbnZhciBHTF9LRUVQID0gNzY4MFxudmFyIEdMX1pFUk8gPSAwXG52YXIgR0xfT05FID0gMVxudmFyIEdMX0ZVTkNfQUREID0gMHg4MDA2XG52YXIgR0xfTEVTUyA9IDUxM1xuXG52YXIgR0xfRlJBTUVCVUZGRVIkMiA9IDB4OEQ0MFxudmFyIEdMX0NPTE9SX0FUVEFDSE1FTlQwJDIgPSAweDhDRTBcblxudmFyIGJsZW5kRnVuY3MgPSB7XG4gICcwJzogMCxcbiAgJzEnOiAxLFxuICAnemVybyc6IDAsXG4gICdvbmUnOiAxLFxuICAnc3JjIGNvbG9yJzogNzY4LFxuICAnb25lIG1pbnVzIHNyYyBjb2xvcic6IDc2OSxcbiAgJ3NyYyBhbHBoYSc6IDc3MCxcbiAgJ29uZSBtaW51cyBzcmMgYWxwaGEnOiA3NzEsXG4gICdkc3QgY29sb3InOiA3NzQsXG4gICdvbmUgbWludXMgZHN0IGNvbG9yJzogNzc1LFxuICAnZHN0IGFscGhhJzogNzcyLFxuICAnb25lIG1pbnVzIGRzdCBhbHBoYSc6IDc3MyxcbiAgJ2NvbnN0YW50IGNvbG9yJzogMzI3NjksXG4gICdvbmUgbWludXMgY29uc3RhbnQgY29sb3InOiAzMjc3MCxcbiAgJ2NvbnN0YW50IGFscGhhJzogMzI3NzEsXG4gICdvbmUgbWludXMgY29uc3RhbnQgYWxwaGEnOiAzMjc3MixcbiAgJ3NyYyBhbHBoYSBzYXR1cmF0ZSc6IDc3NlxufVxuXG4vLyBUaGVyZSBhcmUgaW52YWxpZCB2YWx1ZXMgZm9yIHNyY1JHQiBhbmQgZHN0UkdCLiBTZWU6XG4vLyBodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS93ZWJnbC9zcGVjcy8xLjAvIzYuMTNcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9LaHJvbm9zR3JvdXAvV2ViR0wvYmxvYi8wZDMyMDFmNWY3ZWMzYzAwNjBiYzFmMDQwNzc0NjE1NDFmMTk4N2I5L2NvbmZvcm1hbmNlLXN1aXRlcy8xLjAuMy9jb25mb3JtYW5jZS9taXNjL3dlYmdsLXNwZWNpZmljLmh0bWwjTDU2XG52YXIgaW52YWxpZEJsZW5kQ29tYmluYXRpb25zID0gW1xuICAnY29uc3RhbnQgY29sb3IsIGNvbnN0YW50IGFscGhhJyxcbiAgJ29uZSBtaW51cyBjb25zdGFudCBjb2xvciwgY29uc3RhbnQgYWxwaGEnLFxuICAnY29uc3RhbnQgY29sb3IsIG9uZSBtaW51cyBjb25zdGFudCBhbHBoYScsXG4gICdvbmUgbWludXMgY29uc3RhbnQgY29sb3IsIG9uZSBtaW51cyBjb25zdGFudCBhbHBoYScsXG4gICdjb25zdGFudCBhbHBoYSwgY29uc3RhbnQgY29sb3InLFxuICAnY29uc3RhbnQgYWxwaGEsIG9uZSBtaW51cyBjb25zdGFudCBjb2xvcicsXG4gICdvbmUgbWludXMgY29uc3RhbnQgYWxwaGEsIGNvbnN0YW50IGNvbG9yJyxcbiAgJ29uZSBtaW51cyBjb25zdGFudCBhbHBoYSwgb25lIG1pbnVzIGNvbnN0YW50IGNvbG9yJ1xuXVxuXG52YXIgY29tcGFyZUZ1bmNzID0ge1xuICAnbmV2ZXInOiA1MTIsXG4gICdsZXNzJzogNTEzLFxuICAnPCc6IDUxMyxcbiAgJ2VxdWFsJzogNTE0LFxuICAnPSc6IDUxNCxcbiAgJz09JzogNTE0LFxuICAnPT09JzogNTE0LFxuICAnbGVxdWFsJzogNTE1LFxuICAnPD0nOiA1MTUsXG4gICdncmVhdGVyJzogNTE2LFxuICAnPic6IDUxNixcbiAgJ25vdGVxdWFsJzogNTE3LFxuICAnIT0nOiA1MTcsXG4gICchPT0nOiA1MTcsXG4gICdnZXF1YWwnOiA1MTgsXG4gICc+PSc6IDUxOCxcbiAgJ2Fsd2F5cyc6IDUxOVxufVxuXG52YXIgc3RlbmNpbE9wcyA9IHtcbiAgJzAnOiAwLFxuICAnemVybyc6IDAsXG4gICdrZWVwJzogNzY4MCxcbiAgJ3JlcGxhY2UnOiA3NjgxLFxuICAnaW5jcmVtZW50JzogNzY4MixcbiAgJ2RlY3JlbWVudCc6IDc2ODMsXG4gICdpbmNyZW1lbnQgd3JhcCc6IDM0MDU1LFxuICAnZGVjcmVtZW50IHdyYXAnOiAzNDA1NixcbiAgJ2ludmVydCc6IDUzODZcbn1cblxudmFyIHNoYWRlclR5cGUgPSB7XG4gICdmcmFnJzogR0xfRlJBR01FTlRfU0hBREVSJDEsXG4gICd2ZXJ0JzogR0xfVkVSVEVYX1NIQURFUiQxXG59XG5cbnZhciBvcmllbnRhdGlvblR5cGUgPSB7XG4gICdjdyc6IEdMX0NXLFxuICAnY2N3JzogR0xfQ0NXXG59XG5cbmZ1bmN0aW9uIGlzQnVmZmVyQXJncyAoeCkge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheSh4KSB8fFxuICAgIGlzVHlwZWRBcnJheSh4KSB8fFxuICAgIGlzTkRBcnJheUxpa2UoeClcbn1cblxuLy8gTWFrZSBzdXJlIHZpZXdwb3J0IGlzIHByb2Nlc3NlZCBmaXJzdFxuZnVuY3Rpb24gc29ydFN0YXRlIChzdGF0ZSkge1xuICByZXR1cm4gc3RhdGUuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgIGlmIChhID09PSBTX1ZJRVdQT1JUKSB7XG4gICAgICByZXR1cm4gLTFcbiAgICB9IGVsc2UgaWYgKGIgPT09IFNfVklFV1BPUlQpIHtcbiAgICAgIHJldHVybiAxXG4gICAgfVxuICAgIHJldHVybiAoYSA8IGIpID8gLTEgOiAxXG4gIH0pXG59XG5cbmZ1bmN0aW9uIERlY2xhcmF0aW9uICh0aGlzRGVwLCBjb250ZXh0RGVwLCBwcm9wRGVwLCBhcHBlbmQpIHtcbiAgdGhpcy50aGlzRGVwID0gdGhpc0RlcFxuICB0aGlzLmNvbnRleHREZXAgPSBjb250ZXh0RGVwXG4gIHRoaXMucHJvcERlcCA9IHByb3BEZXBcbiAgdGhpcy5hcHBlbmQgPSBhcHBlbmRcbn1cblxuZnVuY3Rpb24gaXNTdGF0aWMgKGRlY2wpIHtcbiAgcmV0dXJuIGRlY2wgJiYgIShkZWNsLnRoaXNEZXAgfHwgZGVjbC5jb250ZXh0RGVwIHx8IGRlY2wucHJvcERlcClcbn1cblxuZnVuY3Rpb24gY3JlYXRlU3RhdGljRGVjbCAoYXBwZW5kKSB7XG4gIHJldHVybiBuZXcgRGVjbGFyYXRpb24oZmFsc2UsIGZhbHNlLCBmYWxzZSwgYXBwZW5kKVxufVxuXG5mdW5jdGlvbiBjcmVhdGVEeW5hbWljRGVjbCAoZHluLCBhcHBlbmQpIHtcbiAgdmFyIHR5cGUgPSBkeW4udHlwZVxuICBpZiAodHlwZSA9PT0gRFlOX0ZVTkMkMSkge1xuICAgIHZhciBudW1BcmdzID0gZHluLmRhdGEubGVuZ3RoXG4gICAgcmV0dXJuIG5ldyBEZWNsYXJhdGlvbihcbiAgICAgIHRydWUsXG4gICAgICBudW1BcmdzID49IDEsXG4gICAgICBudW1BcmdzID49IDIsXG4gICAgICBhcHBlbmQpXG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gRFlOX1RIVU5LKSB7XG4gICAgdmFyIGRhdGEgPSBkeW4uZGF0YVxuICAgIHJldHVybiBuZXcgRGVjbGFyYXRpb24oXG4gICAgICBkYXRhLnRoaXNEZXAsXG4gICAgICBkYXRhLmNvbnRleHREZXAsXG4gICAgICBkYXRhLnByb3BEZXAsXG4gICAgICBhcHBlbmQpXG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gRFlOX0NPTlNUQU5UJDEpIHtcbiAgICByZXR1cm4gbmV3IERlY2xhcmF0aW9uKFxuICAgICAgZmFsc2UsXG4gICAgICBmYWxzZSxcbiAgICAgIGZhbHNlLFxuICAgICAgYXBwZW5kKVxuICB9IGVsc2UgaWYgKHR5cGUgPT09IERZTl9BUlJBWSQxKSB7XG4gICAgdmFyIHRoaXNEZXAgPSBmYWxzZVxuICAgIHZhciBjb250ZXh0RGVwID0gZmFsc2VcbiAgICB2YXIgcHJvcERlcCA9IGZhbHNlXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkeW4uZGF0YS5sZW5ndGg7ICsraSkge1xuICAgICAgdmFyIHN1YkR5biA9IGR5bi5kYXRhW2ldXG4gICAgICBpZiAoc3ViRHluLnR5cGUgPT09IERZTl9QUk9QJDEpIHtcbiAgICAgICAgcHJvcERlcCA9IHRydWVcbiAgICAgIH0gZWxzZSBpZiAoc3ViRHluLnR5cGUgPT09IERZTl9DT05URVhUJDEpIHtcbiAgICAgICAgY29udGV4dERlcCA9IHRydWVcbiAgICAgIH0gZWxzZSBpZiAoc3ViRHluLnR5cGUgPT09IERZTl9TVEFURSQxKSB7XG4gICAgICAgIHRoaXNEZXAgPSB0cnVlXG4gICAgICB9IGVsc2UgaWYgKHN1YkR5bi50eXBlID09PSBEWU5fRlVOQyQxKSB7XG4gICAgICAgIHRoaXNEZXAgPSB0cnVlXG4gICAgICAgIHZhciBzdWJBcmdzID0gc3ViRHluLmRhdGFcbiAgICAgICAgaWYgKHN1YkFyZ3MgPj0gMSkge1xuICAgICAgICAgIGNvbnRleHREZXAgPSB0cnVlXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN1YkFyZ3MgPj0gMikge1xuICAgICAgICAgIHByb3BEZXAgPSB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoc3ViRHluLnR5cGUgPT09IERZTl9USFVOSykge1xuICAgICAgICB0aGlzRGVwID0gdGhpc0RlcCB8fCBzdWJEeW4uZGF0YS50aGlzRGVwXG4gICAgICAgIGNvbnRleHREZXAgPSBjb250ZXh0RGVwIHx8IHN1YkR5bi5kYXRhLmNvbnRleHREZXBcbiAgICAgICAgcHJvcERlcCA9IHByb3BEZXAgfHwgc3ViRHluLmRhdGEucHJvcERlcFxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbmV3IERlY2xhcmF0aW9uKFxuICAgICAgdGhpc0RlcCxcbiAgICAgIGNvbnRleHREZXAsXG4gICAgICBwcm9wRGVwLFxuICAgICAgYXBwZW5kKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBuZXcgRGVjbGFyYXRpb24oXG4gICAgICB0eXBlID09PSBEWU5fU1RBVEUkMSxcbiAgICAgIHR5cGUgPT09IERZTl9DT05URVhUJDEsXG4gICAgICB0eXBlID09PSBEWU5fUFJPUCQxLFxuICAgICAgYXBwZW5kKVxuICB9XG59XG5cbnZhciBTQ09QRV9ERUNMID0gbmV3IERlY2xhcmF0aW9uKGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZ1bmN0aW9uICgpIHt9KVxuXG5mdW5jdGlvbiByZWdsQ29yZSAoXG4gIGdsLFxuICBzdHJpbmdTdG9yZSxcbiAgZXh0ZW5zaW9ucyxcbiAgbGltaXRzLFxuICBidWZmZXJTdGF0ZSxcbiAgZWxlbWVudFN0YXRlLFxuICB0ZXh0dXJlU3RhdGUsXG4gIGZyYW1lYnVmZmVyU3RhdGUsXG4gIHVuaWZvcm1TdGF0ZSxcbiAgYXR0cmlidXRlU3RhdGUsXG4gIHNoYWRlclN0YXRlLFxuICBkcmF3U3RhdGUsXG4gIGNvbnRleHRTdGF0ZSxcbiAgdGltZXIsXG4gIGNvbmZpZykge1xuICB2YXIgQXR0cmlidXRlUmVjb3JkID0gYXR0cmlidXRlU3RhdGUuUmVjb3JkXG5cbiAgdmFyIGJsZW5kRXF1YXRpb25zID0ge1xuICAgICdhZGQnOiAzMjc3NCxcbiAgICAnc3VidHJhY3QnOiAzMjc3OCxcbiAgICAncmV2ZXJzZSBzdWJ0cmFjdCc6IDMyNzc5XG4gIH1cbiAgaWYgKGV4dGVuc2lvbnMuZXh0X2JsZW5kX21pbm1heCkge1xuICAgIGJsZW5kRXF1YXRpb25zLm1pbiA9IEdMX01JTl9FWFRcbiAgICBibGVuZEVxdWF0aW9ucy5tYXggPSBHTF9NQVhfRVhUXG4gIH1cblxuICB2YXIgZXh0SW5zdGFuY2luZyA9IGV4dGVuc2lvbnMuYW5nbGVfaW5zdGFuY2VkX2FycmF5c1xuICB2YXIgZXh0RHJhd0J1ZmZlcnMgPSBleHRlbnNpb25zLndlYmdsX2RyYXdfYnVmZmVyc1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gV0VCR0wgU1RBVEVcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgY3VycmVudFN0YXRlID0ge1xuICAgIGRpcnR5OiB0cnVlLFxuICAgIHByb2ZpbGU6IGNvbmZpZy5wcm9maWxlXG4gIH1cbiAgdmFyIG5leHRTdGF0ZSA9IHt9XG4gIHZhciBHTF9TVEFURV9OQU1FUyA9IFtdXG4gIHZhciBHTF9GTEFHUyA9IHt9XG4gIHZhciBHTF9WQVJJQUJMRVMgPSB7fVxuXG4gIGZ1bmN0aW9uIHByb3BOYW1lIChuYW1lKSB7XG4gICAgcmV0dXJuIG5hbWUucmVwbGFjZSgnLicsICdfJylcbiAgfVxuXG4gIGZ1bmN0aW9uIHN0YXRlRmxhZyAoc25hbWUsIGNhcCwgaW5pdCkge1xuICAgIHZhciBuYW1lID0gcHJvcE5hbWUoc25hbWUpXG4gICAgR0xfU1RBVEVfTkFNRVMucHVzaChzbmFtZSlcbiAgICBuZXh0U3RhdGVbbmFtZV0gPSBjdXJyZW50U3RhdGVbbmFtZV0gPSAhIWluaXRcbiAgICBHTF9GTEFHU1tuYW1lXSA9IGNhcFxuICB9XG5cbiAgZnVuY3Rpb24gc3RhdGVWYXJpYWJsZSAoc25hbWUsIGZ1bmMsIGluaXQpIHtcbiAgICB2YXIgbmFtZSA9IHByb3BOYW1lKHNuYW1lKVxuICAgIEdMX1NUQVRFX05BTUVTLnB1c2goc25hbWUpXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoaW5pdCkpIHtcbiAgICAgIGN1cnJlbnRTdGF0ZVtuYW1lXSA9IGluaXQuc2xpY2UoKVxuICAgICAgbmV4dFN0YXRlW25hbWVdID0gaW5pdC5zbGljZSgpXG4gICAgfSBlbHNlIHtcbiAgICAgIGN1cnJlbnRTdGF0ZVtuYW1lXSA9IG5leHRTdGF0ZVtuYW1lXSA9IGluaXRcbiAgICB9XG4gICAgR0xfVkFSSUFCTEVTW25hbWVdID0gZnVuY1xuICB9XG5cbiAgLy8gRGl0aGVyaW5nXG4gIHN0YXRlRmxhZyhTX0RJVEhFUiwgR0xfRElUSEVSKVxuXG4gIC8vIEJsZW5kaW5nXG4gIHN0YXRlRmxhZyhTX0JMRU5EX0VOQUJMRSwgR0xfQkxFTkQpXG4gIHN0YXRlVmFyaWFibGUoU19CTEVORF9DT0xPUiwgJ2JsZW5kQ29sb3InLCBbMCwgMCwgMCwgMF0pXG4gIHN0YXRlVmFyaWFibGUoU19CTEVORF9FUVVBVElPTiwgJ2JsZW5kRXF1YXRpb25TZXBhcmF0ZScsXG4gICAgW0dMX0ZVTkNfQURELCBHTF9GVU5DX0FERF0pXG4gIHN0YXRlVmFyaWFibGUoU19CTEVORF9GVU5DLCAnYmxlbmRGdW5jU2VwYXJhdGUnLFxuICAgIFtHTF9PTkUsIEdMX1pFUk8sIEdMX09ORSwgR0xfWkVST10pXG5cbiAgLy8gRGVwdGhcbiAgc3RhdGVGbGFnKFNfREVQVEhfRU5BQkxFLCBHTF9ERVBUSF9URVNULCB0cnVlKVxuICBzdGF0ZVZhcmlhYmxlKFNfREVQVEhfRlVOQywgJ2RlcHRoRnVuYycsIEdMX0xFU1MpXG4gIHN0YXRlVmFyaWFibGUoU19ERVBUSF9SQU5HRSwgJ2RlcHRoUmFuZ2UnLCBbMCwgMV0pXG4gIHN0YXRlVmFyaWFibGUoU19ERVBUSF9NQVNLLCAnZGVwdGhNYXNrJywgdHJ1ZSlcblxuICAvLyBDb2xvciBtYXNrXG4gIHN0YXRlVmFyaWFibGUoU19DT0xPUl9NQVNLLCBTX0NPTE9SX01BU0ssIFt0cnVlLCB0cnVlLCB0cnVlLCB0cnVlXSlcblxuICAvLyBGYWNlIGN1bGxpbmdcbiAgc3RhdGVGbGFnKFNfQ1VMTF9FTkFCTEUsIEdMX0NVTExfRkFDRSlcbiAgc3RhdGVWYXJpYWJsZShTX0NVTExfRkFDRSwgJ2N1bGxGYWNlJywgR0xfQkFDSylcblxuICAvLyBGcm9udCBmYWNlIG9yaWVudGF0aW9uXG4gIHN0YXRlVmFyaWFibGUoU19GUk9OVF9GQUNFLCBTX0ZST05UX0ZBQ0UsIEdMX0NDVylcblxuICAvLyBMaW5lIHdpZHRoXG4gIHN0YXRlVmFyaWFibGUoU19MSU5FX1dJRFRILCBTX0xJTkVfV0lEVEgsIDEpXG5cbiAgLy8gUG9seWdvbiBvZmZzZXRcbiAgc3RhdGVGbGFnKFNfUE9MWUdPTl9PRkZTRVRfRU5BQkxFLCBHTF9QT0xZR09OX09GRlNFVF9GSUxMKVxuICBzdGF0ZVZhcmlhYmxlKFNfUE9MWUdPTl9PRkZTRVRfT0ZGU0VULCAncG9seWdvbk9mZnNldCcsIFswLCAwXSlcblxuICAvLyBTYW1wbGUgY292ZXJhZ2VcbiAgc3RhdGVGbGFnKFNfU0FNUExFX0FMUEhBLCBHTF9TQU1QTEVfQUxQSEFfVE9fQ09WRVJBR0UpXG4gIHN0YXRlRmxhZyhTX1NBTVBMRV9FTkFCTEUsIEdMX1NBTVBMRV9DT1ZFUkFHRSlcbiAgc3RhdGVWYXJpYWJsZShTX1NBTVBMRV9DT1ZFUkFHRSwgJ3NhbXBsZUNvdmVyYWdlJywgWzEsIGZhbHNlXSlcblxuICAvLyBTdGVuY2lsXG4gIHN0YXRlRmxhZyhTX1NURU5DSUxfRU5BQkxFLCBHTF9TVEVOQ0lMX1RFU1QpXG4gIHN0YXRlVmFyaWFibGUoU19TVEVOQ0lMX01BU0ssICdzdGVuY2lsTWFzaycsIC0xKVxuICBzdGF0ZVZhcmlhYmxlKFNfU1RFTkNJTF9GVU5DLCAnc3RlbmNpbEZ1bmMnLCBbR0xfQUxXQVlTLCAwLCAtMV0pXG4gIHN0YXRlVmFyaWFibGUoU19TVEVOQ0lMX09QRlJPTlQsICdzdGVuY2lsT3BTZXBhcmF0ZScsXG4gICAgW0dMX0ZST05ULCBHTF9LRUVQLCBHTF9LRUVQLCBHTF9LRUVQXSlcbiAgc3RhdGVWYXJpYWJsZShTX1NURU5DSUxfT1BCQUNLLCAnc3RlbmNpbE9wU2VwYXJhdGUnLFxuICAgIFtHTF9CQUNLLCBHTF9LRUVQLCBHTF9LRUVQLCBHTF9LRUVQXSlcblxuICAvLyBTY2lzc29yXG4gIHN0YXRlRmxhZyhTX1NDSVNTT1JfRU5BQkxFLCBHTF9TQ0lTU09SX1RFU1QpXG4gIHN0YXRlVmFyaWFibGUoU19TQ0lTU09SX0JPWCwgJ3NjaXNzb3InLFxuICAgIFswLCAwLCBnbC5kcmF3aW5nQnVmZmVyV2lkdGgsIGdsLmRyYXdpbmdCdWZmZXJIZWlnaHRdKVxuXG4gIC8vIFZpZXdwb3J0XG4gIHN0YXRlVmFyaWFibGUoU19WSUVXUE9SVCwgU19WSUVXUE9SVCxcbiAgICBbMCwgMCwgZ2wuZHJhd2luZ0J1ZmZlcldpZHRoLCBnbC5kcmF3aW5nQnVmZmVySGVpZ2h0XSlcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEVOVklST05NRU5UXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIHNoYXJlZFN0YXRlID0ge1xuICAgIGdsOiBnbCxcbiAgICBjb250ZXh0OiBjb250ZXh0U3RhdGUsXG4gICAgc3RyaW5nczogc3RyaW5nU3RvcmUsXG4gICAgbmV4dDogbmV4dFN0YXRlLFxuICAgIGN1cnJlbnQ6IGN1cnJlbnRTdGF0ZSxcbiAgICBkcmF3OiBkcmF3U3RhdGUsXG4gICAgZWxlbWVudHM6IGVsZW1lbnRTdGF0ZSxcbiAgICBidWZmZXI6IGJ1ZmZlclN0YXRlLFxuICAgIHNoYWRlcjogc2hhZGVyU3RhdGUsXG4gICAgYXR0cmlidXRlczogYXR0cmlidXRlU3RhdGUuc3RhdGUsXG4gICAgdmFvOiBhdHRyaWJ1dGVTdGF0ZSxcbiAgICB1bmlmb3JtczogdW5pZm9ybVN0YXRlLFxuICAgIGZyYW1lYnVmZmVyOiBmcmFtZWJ1ZmZlclN0YXRlLFxuICAgIGV4dGVuc2lvbnM6IGV4dGVuc2lvbnMsXG5cbiAgICB0aW1lcjogdGltZXIsXG4gICAgaXNCdWZmZXJBcmdzOiBpc0J1ZmZlckFyZ3NcbiAgfVxuXG4gIHZhciBzaGFyZWRDb25zdGFudHMgPSB7XG4gICAgcHJpbVR5cGVzOiBwcmltVHlwZXMsXG4gICAgY29tcGFyZUZ1bmNzOiBjb21wYXJlRnVuY3MsXG4gICAgYmxlbmRGdW5jczogYmxlbmRGdW5jcyxcbiAgICBibGVuZEVxdWF0aW9uczogYmxlbmRFcXVhdGlvbnMsXG4gICAgc3RlbmNpbE9wczogc3RlbmNpbE9wcyxcbiAgICBnbFR5cGVzOiBnbFR5cGVzLFxuICAgIG9yaWVudGF0aW9uVHlwZTogb3JpZW50YXRpb25UeXBlXG4gIH1cblxuICBjaGVjayQxLm9wdGlvbmFsKGZ1bmN0aW9uICgpIHtcbiAgICBzaGFyZWRTdGF0ZS5pc0FycmF5TGlrZSA9IGlzQXJyYXlMaWtlXG4gIH0pXG5cbiAgaWYgKGV4dERyYXdCdWZmZXJzKSB7XG4gICAgc2hhcmVkQ29uc3RhbnRzLmJhY2tCdWZmZXIgPSBbR0xfQkFDS11cbiAgICBzaGFyZWRDb25zdGFudHMuZHJhd0J1ZmZlciA9IGxvb3AobGltaXRzLm1heERyYXdidWZmZXJzLCBmdW5jdGlvbiAoaSkge1xuICAgICAgaWYgKGkgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIFswXVxuICAgICAgfVxuICAgICAgcmV0dXJuIGxvb3AoaSwgZnVuY3Rpb24gKGopIHtcbiAgICAgICAgcmV0dXJuIEdMX0NPTE9SX0FUVEFDSE1FTlQwJDIgKyBqXG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICB2YXIgZHJhd0NhbGxDb3VudGVyID0gMFxuICBmdW5jdGlvbiBjcmVhdGVSRUdMRW52aXJvbm1lbnQgKCkge1xuICAgIHZhciBlbnYgPSBjcmVhdGVFbnZpcm9ubWVudCgpXG4gICAgdmFyIGxpbmsgPSBlbnYubGlua1xuICAgIHZhciBnbG9iYWwgPSBlbnYuZ2xvYmFsXG4gICAgZW52LmlkID0gZHJhd0NhbGxDb3VudGVyKytcblxuICAgIGVudi5iYXRjaElkID0gJzAnXG5cbiAgICAvLyBsaW5rIHNoYXJlZCBzdGF0ZVxuICAgIHZhciBTSEFSRUQgPSBsaW5rKHNoYXJlZFN0YXRlKVxuICAgIHZhciBzaGFyZWQgPSBlbnYuc2hhcmVkID0ge1xuICAgICAgcHJvcHM6ICdhMCdcbiAgICB9XG4gICAgT2JqZWN0LmtleXMoc2hhcmVkU3RhdGUpLmZvckVhY2goZnVuY3Rpb24gKHByb3ApIHtcbiAgICAgIHNoYXJlZFtwcm9wXSA9IGdsb2JhbC5kZWYoU0hBUkVELCAnLicsIHByb3ApXG4gICAgfSlcblxuICAgIC8vIEluamVjdCBydW50aW1lIGFzc2VydGlvbiBzdHVmZiBmb3IgZGVidWcgYnVpbGRzXG4gICAgY2hlY2skMS5vcHRpb25hbChmdW5jdGlvbiAoKSB7XG4gICAgICBlbnYuQ0hFQ0sgPSBsaW5rKGNoZWNrJDEpXG4gICAgICBlbnYuY29tbWFuZFN0ciA9IGNoZWNrJDEuZ3Vlc3NDb21tYW5kKClcbiAgICAgIGVudi5jb21tYW5kID0gbGluayhlbnYuY29tbWFuZFN0cilcbiAgICAgIGVudi5hc3NlcnQgPSBmdW5jdGlvbiAoYmxvY2ssIHByZWQsIG1lc3NhZ2UpIHtcbiAgICAgICAgYmxvY2soXG4gICAgICAgICAgJ2lmKCEoJywgcHJlZCwgJykpJyxcbiAgICAgICAgICB0aGlzLkNIRUNLLCAnLmNvbW1hbmRSYWlzZSgnLCBsaW5rKG1lc3NhZ2UpLCAnLCcsIHRoaXMuY29tbWFuZCwgJyk7JylcbiAgICAgIH1cblxuICAgICAgc2hhcmVkQ29uc3RhbnRzLmludmFsaWRCbGVuZENvbWJpbmF0aW9ucyA9IGludmFsaWRCbGVuZENvbWJpbmF0aW9uc1xuICAgIH0pXG5cbiAgICAvLyBDb3B5IEdMIHN0YXRlIHZhcmlhYmxlcyBvdmVyXG4gICAgdmFyIG5leHRWYXJzID0gZW52Lm5leHQgPSB7fVxuICAgIHZhciBjdXJyZW50VmFycyA9IGVudi5jdXJyZW50ID0ge31cbiAgICBPYmplY3Qua2V5cyhHTF9WQVJJQUJMRVMpLmZvckVhY2goZnVuY3Rpb24gKHZhcmlhYmxlKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShjdXJyZW50U3RhdGVbdmFyaWFibGVdKSkge1xuICAgICAgICBuZXh0VmFyc1t2YXJpYWJsZV0gPSBnbG9iYWwuZGVmKHNoYXJlZC5uZXh0LCAnLicsIHZhcmlhYmxlKVxuICAgICAgICBjdXJyZW50VmFyc1t2YXJpYWJsZV0gPSBnbG9iYWwuZGVmKHNoYXJlZC5jdXJyZW50LCAnLicsIHZhcmlhYmxlKVxuICAgICAgfVxuICAgIH0pXG5cbiAgICAvLyBJbml0aWFsaXplIHNoYXJlZCBjb25zdGFudHNcbiAgICB2YXIgY29uc3RhbnRzID0gZW52LmNvbnN0YW50cyA9IHt9XG4gICAgT2JqZWN0LmtleXMoc2hhcmVkQ29uc3RhbnRzKS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICBjb25zdGFudHNbbmFtZV0gPSBnbG9iYWwuZGVmKEpTT04uc3RyaW5naWZ5KHNoYXJlZENvbnN0YW50c1tuYW1lXSkpXG4gICAgfSlcblxuICAgIC8vIEhlbHBlciBmdW5jdGlvbiBmb3IgY2FsbGluZyBhIGJsb2NrXG4gICAgZW52Lmludm9rZSA9IGZ1bmN0aW9uIChibG9jaywgeCkge1xuICAgICAgc3dpdGNoICh4LnR5cGUpIHtcbiAgICAgICAgY2FzZSBEWU5fRlVOQyQxOlxuICAgICAgICAgIHZhciBhcmdMaXN0ID0gW1xuICAgICAgICAgICAgJ3RoaXMnLFxuICAgICAgICAgICAgc2hhcmVkLmNvbnRleHQsXG4gICAgICAgICAgICBzaGFyZWQucHJvcHMsXG4gICAgICAgICAgICBlbnYuYmF0Y2hJZFxuICAgICAgICAgIF1cbiAgICAgICAgICByZXR1cm4gYmxvY2suZGVmKFxuICAgICAgICAgICAgbGluayh4LmRhdGEpLCAnLmNhbGwoJyxcbiAgICAgICAgICAgIGFyZ0xpc3Quc2xpY2UoMCwgTWF0aC5tYXgoeC5kYXRhLmxlbmd0aCArIDEsIDQpKSxcbiAgICAgICAgICAgICcpJylcbiAgICAgICAgY2FzZSBEWU5fUFJPUCQxOlxuICAgICAgICAgIHJldHVybiBibG9jay5kZWYoc2hhcmVkLnByb3BzLCB4LmRhdGEpXG4gICAgICAgIGNhc2UgRFlOX0NPTlRFWFQkMTpcbiAgICAgICAgICByZXR1cm4gYmxvY2suZGVmKHNoYXJlZC5jb250ZXh0LCB4LmRhdGEpXG4gICAgICAgIGNhc2UgRFlOX1NUQVRFJDE6XG4gICAgICAgICAgcmV0dXJuIGJsb2NrLmRlZigndGhpcycsIHguZGF0YSlcbiAgICAgICAgY2FzZSBEWU5fVEhVTks6XG4gICAgICAgICAgeC5kYXRhLmFwcGVuZChlbnYsIGJsb2NrKVxuICAgICAgICAgIHJldHVybiB4LmRhdGEucmVmXG4gICAgICAgIGNhc2UgRFlOX0NPTlNUQU5UJDE6XG4gICAgICAgICAgcmV0dXJuIHguZGF0YS50b1N0cmluZygpXG4gICAgICAgIGNhc2UgRFlOX0FSUkFZJDE6XG4gICAgICAgICAgcmV0dXJuIHguZGF0YS5tYXAoZnVuY3Rpb24gKHkpIHtcbiAgICAgICAgICAgIHJldHVybiBlbnYuaW52b2tlKGJsb2NrLCB5KVxuICAgICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuXG4gICAgZW52LmF0dHJpYkNhY2hlID0ge31cblxuICAgIHZhciBzY29wZUF0dHJpYnMgPSB7fVxuICAgIGVudi5zY29wZUF0dHJpYiA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICB2YXIgaWQgPSBzdHJpbmdTdG9yZS5pZChuYW1lKVxuICAgICAgaWYgKGlkIGluIHNjb3BlQXR0cmlicykge1xuICAgICAgICByZXR1cm4gc2NvcGVBdHRyaWJzW2lkXVxuICAgICAgfVxuICAgICAgdmFyIGJpbmRpbmcgPSBhdHRyaWJ1dGVTdGF0ZS5zY29wZVtpZF1cbiAgICAgIGlmICghYmluZGluZykge1xuICAgICAgICBiaW5kaW5nID0gYXR0cmlidXRlU3RhdGUuc2NvcGVbaWRdID0gbmV3IEF0dHJpYnV0ZVJlY29yZCgpXG4gICAgICB9XG4gICAgICB2YXIgcmVzdWx0ID0gc2NvcGVBdHRyaWJzW2lkXSA9IGxpbmsoYmluZGluZylcbiAgICAgIHJldHVybiByZXN1bHRcbiAgICB9XG5cbiAgICByZXR1cm4gZW52XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFBBUlNJTkdcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBmdW5jdGlvbiBwYXJzZVByb2ZpbGUgKG9wdGlvbnMpIHtcbiAgICB2YXIgc3RhdGljT3B0aW9ucyA9IG9wdGlvbnMuc3RhdGljXG4gICAgdmFyIGR5bmFtaWNPcHRpb25zID0gb3B0aW9ucy5keW5hbWljXG5cbiAgICB2YXIgcHJvZmlsZUVuYWJsZVxuICAgIGlmIChTX1BST0ZJTEUgaW4gc3RhdGljT3B0aW9ucykge1xuICAgICAgdmFyIHZhbHVlID0gISFzdGF0aWNPcHRpb25zW1NfUFJPRklMRV1cbiAgICAgIHByb2ZpbGVFbmFibGUgPSBjcmVhdGVTdGF0aWNEZWNsKGZ1bmN0aW9uIChlbnYsIHNjb3BlKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZVxuICAgICAgfSlcbiAgICAgIHByb2ZpbGVFbmFibGUuZW5hYmxlID0gdmFsdWVcbiAgICB9IGVsc2UgaWYgKFNfUFJPRklMRSBpbiBkeW5hbWljT3B0aW9ucykge1xuICAgICAgdmFyIGR5biA9IGR5bmFtaWNPcHRpb25zW1NfUFJPRklMRV1cbiAgICAgIHByb2ZpbGVFbmFibGUgPSBjcmVhdGVEeW5hbWljRGVjbChkeW4sIGZ1bmN0aW9uIChlbnYsIHNjb3BlKSB7XG4gICAgICAgIHJldHVybiBlbnYuaW52b2tlKHNjb3BlLCBkeW4pXG4gICAgICB9KVxuICAgIH1cblxuICAgIHJldHVybiBwcm9maWxlRW5hYmxlXG4gIH1cblxuICBmdW5jdGlvbiBwYXJzZUZyYW1lYnVmZmVyIChvcHRpb25zLCBlbnYpIHtcbiAgICB2YXIgc3RhdGljT3B0aW9ucyA9IG9wdGlvbnMuc3RhdGljXG4gICAgdmFyIGR5bmFtaWNPcHRpb25zID0gb3B0aW9ucy5keW5hbWljXG5cbiAgICBpZiAoU19GUkFNRUJVRkZFUiBpbiBzdGF0aWNPcHRpb25zKSB7XG4gICAgICB2YXIgZnJhbWVidWZmZXIgPSBzdGF0aWNPcHRpb25zW1NfRlJBTUVCVUZGRVJdXG4gICAgICBpZiAoZnJhbWVidWZmZXIpIHtcbiAgICAgICAgZnJhbWVidWZmZXIgPSBmcmFtZWJ1ZmZlclN0YXRlLmdldEZyYW1lYnVmZmVyKGZyYW1lYnVmZmVyKVxuICAgICAgICBjaGVjayQxLmNvbW1hbmQoZnJhbWVidWZmZXIsICdpbnZhbGlkIGZyYW1lYnVmZmVyIG9iamVjdCcpXG4gICAgICAgIHJldHVybiBjcmVhdGVTdGF0aWNEZWNsKGZ1bmN0aW9uIChlbnYsIGJsb2NrKSB7XG4gICAgICAgICAgdmFyIEZSQU1FQlVGRkVSID0gZW52LmxpbmsoZnJhbWVidWZmZXIpXG4gICAgICAgICAgdmFyIHNoYXJlZCA9IGVudi5zaGFyZWRcbiAgICAgICAgICBibG9jay5zZXQoXG4gICAgICAgICAgICBzaGFyZWQuZnJhbWVidWZmZXIsXG4gICAgICAgICAgICAnLm5leHQnLFxuICAgICAgICAgICAgRlJBTUVCVUZGRVIpXG4gICAgICAgICAgdmFyIENPTlRFWFQgPSBzaGFyZWQuY29udGV4dFxuICAgICAgICAgIGJsb2NrLnNldChcbiAgICAgICAgICAgIENPTlRFWFQsXG4gICAgICAgICAgICAnLicgKyBTX0ZSQU1FQlVGRkVSX1dJRFRILFxuICAgICAgICAgICAgRlJBTUVCVUZGRVIgKyAnLndpZHRoJylcbiAgICAgICAgICBibG9jay5zZXQoXG4gICAgICAgICAgICBDT05URVhULFxuICAgICAgICAgICAgJy4nICsgU19GUkFNRUJVRkZFUl9IRUlHSFQsXG4gICAgICAgICAgICBGUkFNRUJVRkZFUiArICcuaGVpZ2h0JylcbiAgICAgICAgICByZXR1cm4gRlJBTUVCVUZGRVJcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVTdGF0aWNEZWNsKGZ1bmN0aW9uIChlbnYsIHNjb3BlKSB7XG4gICAgICAgICAgdmFyIHNoYXJlZCA9IGVudi5zaGFyZWRcbiAgICAgICAgICBzY29wZS5zZXQoXG4gICAgICAgICAgICBzaGFyZWQuZnJhbWVidWZmZXIsXG4gICAgICAgICAgICAnLm5leHQnLFxuICAgICAgICAgICAgJ251bGwnKVxuICAgICAgICAgIHZhciBDT05URVhUID0gc2hhcmVkLmNvbnRleHRcbiAgICAgICAgICBzY29wZS5zZXQoXG4gICAgICAgICAgICBDT05URVhULFxuICAgICAgICAgICAgJy4nICsgU19GUkFNRUJVRkZFUl9XSURUSCxcbiAgICAgICAgICAgIENPTlRFWFQgKyAnLicgKyBTX0RSQVdJTkdCVUZGRVJfV0lEVEgpXG4gICAgICAgICAgc2NvcGUuc2V0KFxuICAgICAgICAgICAgQ09OVEVYVCxcbiAgICAgICAgICAgICcuJyArIFNfRlJBTUVCVUZGRVJfSEVJR0hULFxuICAgICAgICAgICAgQ09OVEVYVCArICcuJyArIFNfRFJBV0lOR0JVRkZFUl9IRUlHSFQpXG4gICAgICAgICAgcmV0dXJuICdudWxsJ1xuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoU19GUkFNRUJVRkZFUiBpbiBkeW5hbWljT3B0aW9ucykge1xuICAgICAgdmFyIGR5biA9IGR5bmFtaWNPcHRpb25zW1NfRlJBTUVCVUZGRVJdXG4gICAgICByZXR1cm4gY3JlYXRlRHluYW1pY0RlY2woZHluLCBmdW5jdGlvbiAoZW52LCBzY29wZSkge1xuICAgICAgICB2YXIgRlJBTUVCVUZGRVJfRlVOQyA9IGVudi5pbnZva2Uoc2NvcGUsIGR5bilcbiAgICAgICAgdmFyIHNoYXJlZCA9IGVudi5zaGFyZWRcbiAgICAgICAgdmFyIEZSQU1FQlVGRkVSX1NUQVRFID0gc2hhcmVkLmZyYW1lYnVmZmVyXG4gICAgICAgIHZhciBGUkFNRUJVRkZFUiA9IHNjb3BlLmRlZihcbiAgICAgICAgICBGUkFNRUJVRkZFUl9TVEFURSwgJy5nZXRGcmFtZWJ1ZmZlcignLCBGUkFNRUJVRkZFUl9GVU5DLCAnKScpXG5cbiAgICAgICAgY2hlY2skMS5vcHRpb25hbChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgZW52LmFzc2VydChzY29wZSxcbiAgICAgICAgICAgICchJyArIEZSQU1FQlVGRkVSX0ZVTkMgKyAnfHwnICsgRlJBTUVCVUZGRVIsXG4gICAgICAgICAgICAnaW52YWxpZCBmcmFtZWJ1ZmZlciBvYmplY3QnKVxuICAgICAgICB9KVxuXG4gICAgICAgIHNjb3BlLnNldChcbiAgICAgICAgICBGUkFNRUJVRkZFUl9TVEFURSxcbiAgICAgICAgICAnLm5leHQnLFxuICAgICAgICAgIEZSQU1FQlVGRkVSKVxuICAgICAgICB2YXIgQ09OVEVYVCA9IHNoYXJlZC5jb250ZXh0XG4gICAgICAgIHNjb3BlLnNldChcbiAgICAgICAgICBDT05URVhULFxuICAgICAgICAgICcuJyArIFNfRlJBTUVCVUZGRVJfV0lEVEgsXG4gICAgICAgICAgRlJBTUVCVUZGRVIgKyAnPycgKyBGUkFNRUJVRkZFUiArICcud2lkdGg6JyArXG4gICAgICAgICAgQ09OVEVYVCArICcuJyArIFNfRFJBV0lOR0JVRkZFUl9XSURUSClcbiAgICAgICAgc2NvcGUuc2V0KFxuICAgICAgICAgIENPTlRFWFQsXG4gICAgICAgICAgJy4nICsgU19GUkFNRUJVRkZFUl9IRUlHSFQsXG4gICAgICAgICAgRlJBTUVCVUZGRVIgK1xuICAgICAgICAgICc/JyArIEZSQU1FQlVGRkVSICsgJy5oZWlnaHQ6JyArXG4gICAgICAgICAgQ09OVEVYVCArICcuJyArIFNfRFJBV0lOR0JVRkZFUl9IRUlHSFQpXG4gICAgICAgIHJldHVybiBGUkFNRUJVRkZFUlxuICAgICAgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBwYXJzZVZpZXdwb3J0U2Npc3NvciAob3B0aW9ucywgZnJhbWVidWZmZXIsIGVudikge1xuICAgIHZhciBzdGF0aWNPcHRpb25zID0gb3B0aW9ucy5zdGF0aWNcbiAgICB2YXIgZHluYW1pY09wdGlvbnMgPSBvcHRpb25zLmR5bmFtaWNcblxuICAgIGZ1bmN0aW9uIHBhcnNlQm94IChwYXJhbSkge1xuICAgICAgaWYgKHBhcmFtIGluIHN0YXRpY09wdGlvbnMpIHtcbiAgICAgICAgdmFyIGJveCA9IHN0YXRpY09wdGlvbnNbcGFyYW1dXG4gICAgICAgIGNoZWNrJDEuY29tbWFuZFR5cGUoYm94LCAnb2JqZWN0JywgJ2ludmFsaWQgJyArIHBhcmFtLCBlbnYuY29tbWFuZFN0cilcblxuICAgICAgICB2YXIgaXNTdGF0aWMgPSB0cnVlXG4gICAgICAgIHZhciB4ID0gYm94LnggfCAwXG4gICAgICAgIHZhciB5ID0gYm94LnkgfCAwXG4gICAgICAgIHZhciB3LCBoXG4gICAgICAgIGlmICgnd2lkdGgnIGluIGJveCkge1xuICAgICAgICAgIHcgPSBib3gud2lkdGggfCAwXG4gICAgICAgICAgY2hlY2skMS5jb21tYW5kKHcgPj0gMCwgJ2ludmFsaWQgJyArIHBhcmFtLCBlbnYuY29tbWFuZFN0cilcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpc1N0YXRpYyA9IGZhbHNlXG4gICAgICAgIH1cbiAgICAgICAgaWYgKCdoZWlnaHQnIGluIGJveCkge1xuICAgICAgICAgIGggPSBib3guaGVpZ2h0IHwgMFxuICAgICAgICAgIGNoZWNrJDEuY29tbWFuZChoID49IDAsICdpbnZhbGlkICcgKyBwYXJhbSwgZW52LmNvbW1hbmRTdHIpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaXNTdGF0aWMgPSBmYWxzZVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBEZWNsYXJhdGlvbihcbiAgICAgICAgICAhaXNTdGF0aWMgJiYgZnJhbWVidWZmZXIgJiYgZnJhbWVidWZmZXIudGhpc0RlcCxcbiAgICAgICAgICAhaXNTdGF0aWMgJiYgZnJhbWVidWZmZXIgJiYgZnJhbWVidWZmZXIuY29udGV4dERlcCxcbiAgICAgICAgICAhaXNTdGF0aWMgJiYgZnJhbWVidWZmZXIgJiYgZnJhbWVidWZmZXIucHJvcERlcCxcbiAgICAgICAgICBmdW5jdGlvbiAoZW52LCBzY29wZSkge1xuICAgICAgICAgICAgdmFyIENPTlRFWFQgPSBlbnYuc2hhcmVkLmNvbnRleHRcbiAgICAgICAgICAgIHZhciBCT1hfVyA9IHdcbiAgICAgICAgICAgIGlmICghKCd3aWR0aCcgaW4gYm94KSkge1xuICAgICAgICAgICAgICBCT1hfVyA9IHNjb3BlLmRlZihDT05URVhULCAnLicsIFNfRlJBTUVCVUZGRVJfV0lEVEgsICctJywgeClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBCT1hfSCA9IGhcbiAgICAgICAgICAgIGlmICghKCdoZWlnaHQnIGluIGJveCkpIHtcbiAgICAgICAgICAgICAgQk9YX0ggPSBzY29wZS5kZWYoQ09OVEVYVCwgJy4nLCBTX0ZSQU1FQlVGRkVSX0hFSUdIVCwgJy0nLCB5KVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFt4LCB5LCBCT1hfVywgQk9YX0hdXG4gICAgICAgICAgfSlcbiAgICAgIH0gZWxzZSBpZiAocGFyYW0gaW4gZHluYW1pY09wdGlvbnMpIHtcbiAgICAgICAgdmFyIGR5bkJveCA9IGR5bmFtaWNPcHRpb25zW3BhcmFtXVxuICAgICAgICB2YXIgcmVzdWx0ID0gY3JlYXRlRHluYW1pY0RlY2woZHluQm94LCBmdW5jdGlvbiAoZW52LCBzY29wZSkge1xuICAgICAgICAgIHZhciBCT1ggPSBlbnYuaW52b2tlKHNjb3BlLCBkeW5Cb3gpXG5cbiAgICAgICAgICBjaGVjayQxLm9wdGlvbmFsKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGVudi5hc3NlcnQoc2NvcGUsXG4gICAgICAgICAgICAgIEJPWCArICcmJnR5cGVvZiAnICsgQk9YICsgJz09PVwib2JqZWN0XCInLFxuICAgICAgICAgICAgICAnaW52YWxpZCAnICsgcGFyYW0pXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIHZhciBDT05URVhUID0gZW52LnNoYXJlZC5jb250ZXh0XG4gICAgICAgICAgdmFyIEJPWF9YID0gc2NvcGUuZGVmKEJPWCwgJy54fDAnKVxuICAgICAgICAgIHZhciBCT1hfWSA9IHNjb3BlLmRlZihCT1gsICcueXwwJylcbiAgICAgICAgICB2YXIgQk9YX1cgPSBzY29wZS5kZWYoXG4gICAgICAgICAgICAnXCJ3aWR0aFwiIGluICcsIEJPWCwgJz8nLCBCT1gsICcud2lkdGh8MDonLFxuICAgICAgICAgICAgJygnLCBDT05URVhULCAnLicsIFNfRlJBTUVCVUZGRVJfV0lEVEgsICctJywgQk9YX1gsICcpJylcbiAgICAgICAgICB2YXIgQk9YX0ggPSBzY29wZS5kZWYoXG4gICAgICAgICAgICAnXCJoZWlnaHRcIiBpbiAnLCBCT1gsICc/JywgQk9YLCAnLmhlaWdodHwwOicsXG4gICAgICAgICAgICAnKCcsIENPTlRFWFQsICcuJywgU19GUkFNRUJVRkZFUl9IRUlHSFQsICctJywgQk9YX1ksICcpJylcblxuICAgICAgICAgIGNoZWNrJDEub3B0aW9uYWwoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZW52LmFzc2VydChzY29wZSxcbiAgICAgICAgICAgICAgQk9YX1cgKyAnPj0wJiYnICtcbiAgICAgICAgICAgICAgQk9YX0ggKyAnPj0wJyxcbiAgICAgICAgICAgICAgJ2ludmFsaWQgJyArIHBhcmFtKVxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICByZXR1cm4gW0JPWF9YLCBCT1hfWSwgQk9YX1csIEJPWF9IXVxuICAgICAgICB9KVxuICAgICAgICBpZiAoZnJhbWVidWZmZXIpIHtcbiAgICAgICAgICByZXN1bHQudGhpc0RlcCA9IHJlc3VsdC50aGlzRGVwIHx8IGZyYW1lYnVmZmVyLnRoaXNEZXBcbiAgICAgICAgICByZXN1bHQuY29udGV4dERlcCA9IHJlc3VsdC5jb250ZXh0RGVwIHx8IGZyYW1lYnVmZmVyLmNvbnRleHREZXBcbiAgICAgICAgICByZXN1bHQucHJvcERlcCA9IHJlc3VsdC5wcm9wRGVwIHx8IGZyYW1lYnVmZmVyLnByb3BEZXBcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgICB9IGVsc2UgaWYgKGZyYW1lYnVmZmVyKSB7XG4gICAgICAgIHJldHVybiBuZXcgRGVjbGFyYXRpb24oXG4gICAgICAgICAgZnJhbWVidWZmZXIudGhpc0RlcCxcbiAgICAgICAgICBmcmFtZWJ1ZmZlci5jb250ZXh0RGVwLFxuICAgICAgICAgIGZyYW1lYnVmZmVyLnByb3BEZXAsXG4gICAgICAgICAgZnVuY3Rpb24gKGVudiwgc2NvcGUpIHtcbiAgICAgICAgICAgIHZhciBDT05URVhUID0gZW52LnNoYXJlZC5jb250ZXh0XG4gICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAwLCAwLFxuICAgICAgICAgICAgICBzY29wZS5kZWYoQ09OVEVYVCwgJy4nLCBTX0ZSQU1FQlVGRkVSX1dJRFRIKSxcbiAgICAgICAgICAgICAgc2NvcGUuZGVmKENPTlRFWFQsICcuJywgU19GUkFNRUJVRkZFUl9IRUlHSFQpXVxuICAgICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgfVxuICAgIH1cblxuICAgIHZhciB2aWV3cG9ydCA9IHBhcnNlQm94KFNfVklFV1BPUlQpXG5cbiAgICBpZiAodmlld3BvcnQpIHtcbiAgICAgIHZhciBwcmV2Vmlld3BvcnQgPSB2aWV3cG9ydFxuICAgICAgdmlld3BvcnQgPSBuZXcgRGVjbGFyYXRpb24oXG4gICAgICAgIHZpZXdwb3J0LnRoaXNEZXAsXG4gICAgICAgIHZpZXdwb3J0LmNvbnRleHREZXAsXG4gICAgICAgIHZpZXdwb3J0LnByb3BEZXAsXG4gICAgICAgIGZ1bmN0aW9uIChlbnYsIHNjb3BlKSB7XG4gICAgICAgICAgdmFyIFZJRVdQT1JUID0gcHJldlZpZXdwb3J0LmFwcGVuZChlbnYsIHNjb3BlKVxuICAgICAgICAgIHZhciBDT05URVhUID0gZW52LnNoYXJlZC5jb250ZXh0XG4gICAgICAgICAgc2NvcGUuc2V0KFxuICAgICAgICAgICAgQ09OVEVYVCxcbiAgICAgICAgICAgICcuJyArIFNfVklFV1BPUlRfV0lEVEgsXG4gICAgICAgICAgICBWSUVXUE9SVFsyXSlcbiAgICAgICAgICBzY29wZS5zZXQoXG4gICAgICAgICAgICBDT05URVhULFxuICAgICAgICAgICAgJy4nICsgU19WSUVXUE9SVF9IRUlHSFQsXG4gICAgICAgICAgICBWSUVXUE9SVFszXSlcbiAgICAgICAgICByZXR1cm4gVklFV1BPUlRcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgdmlld3BvcnQ6IHZpZXdwb3J0LFxuICAgICAgc2Npc3Nvcl9ib3g6IHBhcnNlQm94KFNfU0NJU1NPUl9CT1gpXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcGFyc2VBdHRyaWJMb2NhdGlvbnMgKG9wdGlvbnMsIGF0dHJpYnV0ZXMpIHtcbiAgICB2YXIgc3RhdGljT3B0aW9ucyA9IG9wdGlvbnMuc3RhdGljXG4gICAgdmFyIHN0YXRpY1Byb2dyYW0gPVxuICAgICAgdHlwZW9mIHN0YXRpY09wdGlvbnNbU19GUkFHXSA9PT0gJ3N0cmluZycgJiZcbiAgICAgIHR5cGVvZiBzdGF0aWNPcHRpb25zW1NfVkVSVF0gPT09ICdzdHJpbmcnXG4gICAgaWYgKHN0YXRpY1Byb2dyYW0pIHtcbiAgICAgIGlmIChPYmplY3Qua2V5cyhhdHRyaWJ1dGVzLmR5bmFtaWMpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgIH1cbiAgICAgIHZhciBzdGF0aWNBdHRyaWJ1dGVzID0gYXR0cmlidXRlcy5zdGF0aWNcbiAgICAgIHZhciBzQXR0cmlidXRlcyA9IE9iamVjdC5rZXlzKHN0YXRpY0F0dHJpYnV0ZXMpXG4gICAgICBpZiAoc0F0dHJpYnV0ZXMubGVuZ3RoID4gMCAmJiB0eXBlb2Ygc3RhdGljQXR0cmlidXRlc1tzQXR0cmlidXRlc1swXV0gPT09ICdudW1iZXInKSB7XG4gICAgICAgIHZhciBiaW5kaW5ncyA9IFtdXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc0F0dHJpYnV0ZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICBjaGVjayQxKHR5cGVvZiBzdGF0aWNBdHRyaWJ1dGVzW3NBdHRyaWJ1dGVzW2ldXSA9PT0gJ251bWJlcicsICdtdXN0IHNwZWNpZnkgYWxsIHZlcnRleCBhdHRyaWJ1dGUgbG9jYXRpb25zIHdoZW4gdXNpbmcgdmFvcycpXG4gICAgICAgICAgYmluZGluZ3MucHVzaChbc3RhdGljQXR0cmlidXRlc1tzQXR0cmlidXRlc1tpXV0gfCAwLCBzQXR0cmlidXRlc1tpXV0pXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJpbmRpbmdzXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBmdW5jdGlvbiBwYXJzZVByb2dyYW0gKG9wdGlvbnMsIGVudiwgYXR0cmliTG9jYXRpb25zKSB7XG4gICAgdmFyIHN0YXRpY09wdGlvbnMgPSBvcHRpb25zLnN0YXRpY1xuICAgIHZhciBkeW5hbWljT3B0aW9ucyA9IG9wdGlvbnMuZHluYW1pY1xuXG4gICAgZnVuY3Rpb24gcGFyc2VTaGFkZXIgKG5hbWUpIHtcbiAgICAgIGlmIChuYW1lIGluIHN0YXRpY09wdGlvbnMpIHtcbiAgICAgICAgdmFyIGlkID0gc3RyaW5nU3RvcmUuaWQoc3RhdGljT3B0aW9uc1tuYW1lXSlcbiAgICAgICAgY2hlY2skMS5vcHRpb25hbChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgc2hhZGVyU3RhdGUuc2hhZGVyKHNoYWRlclR5cGVbbmFtZV0sIGlkLCBjaGVjayQxLmd1ZXNzQ29tbWFuZCgpKVxuICAgICAgICB9KVxuICAgICAgICB2YXIgcmVzdWx0ID0gY3JlYXRlU3RhdGljRGVjbChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIGlkXG4gICAgICAgIH0pXG4gICAgICAgIHJlc3VsdC5pZCA9IGlkXG4gICAgICAgIHJldHVybiByZXN1bHRcbiAgICAgIH0gZWxzZSBpZiAobmFtZSBpbiBkeW5hbWljT3B0aW9ucykge1xuICAgICAgICB2YXIgZHluID0gZHluYW1pY09wdGlvbnNbbmFtZV1cbiAgICAgICAgcmV0dXJuIGNyZWF0ZUR5bmFtaWNEZWNsKGR5biwgZnVuY3Rpb24gKGVudiwgc2NvcGUpIHtcbiAgICAgICAgICB2YXIgc3RyID0gZW52Lmludm9rZShzY29wZSwgZHluKVxuICAgICAgICAgIHZhciBpZCA9IHNjb3BlLmRlZihlbnYuc2hhcmVkLnN0cmluZ3MsICcuaWQoJywgc3RyLCAnKScpXG4gICAgICAgICAgY2hlY2skMS5vcHRpb25hbChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBzY29wZShcbiAgICAgICAgICAgICAgZW52LnNoYXJlZC5zaGFkZXIsICcuc2hhZGVyKCcsXG4gICAgICAgICAgICAgIHNoYWRlclR5cGVbbmFtZV0sICcsJyxcbiAgICAgICAgICAgICAgaWQsICcsJyxcbiAgICAgICAgICAgICAgZW52LmNvbW1hbmQsICcpOycpXG4gICAgICAgICAgfSlcbiAgICAgICAgICByZXR1cm4gaWRcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgdmFyIGZyYWcgPSBwYXJzZVNoYWRlcihTX0ZSQUcpXG4gICAgdmFyIHZlcnQgPSBwYXJzZVNoYWRlcihTX1ZFUlQpXG5cbiAgICB2YXIgcHJvZ3JhbSA9IG51bGxcbiAgICB2YXIgcHJvZ1ZhclxuICAgIGlmIChpc1N0YXRpYyhmcmFnKSAmJiBpc1N0YXRpYyh2ZXJ0KSkge1xuICAgICAgcHJvZ3JhbSA9IHNoYWRlclN0YXRlLnByb2dyYW0odmVydC5pZCwgZnJhZy5pZCwgbnVsbCwgYXR0cmliTG9jYXRpb25zKVxuICAgICAgcHJvZ1ZhciA9IGNyZWF0ZVN0YXRpY0RlY2woZnVuY3Rpb24gKGVudiwgc2NvcGUpIHtcbiAgICAgICAgcmV0dXJuIGVudi5saW5rKHByb2dyYW0pXG4gICAgICB9KVxuICAgIH0gZWxzZSB7XG4gICAgICBwcm9nVmFyID0gbmV3IERlY2xhcmF0aW9uKFxuICAgICAgICAoZnJhZyAmJiBmcmFnLnRoaXNEZXApIHx8ICh2ZXJ0ICYmIHZlcnQudGhpc0RlcCksXG4gICAgICAgIChmcmFnICYmIGZyYWcuY29udGV4dERlcCkgfHwgKHZlcnQgJiYgdmVydC5jb250ZXh0RGVwKSxcbiAgICAgICAgKGZyYWcgJiYgZnJhZy5wcm9wRGVwKSB8fCAodmVydCAmJiB2ZXJ0LnByb3BEZXApLFxuICAgICAgICBmdW5jdGlvbiAoZW52LCBzY29wZSkge1xuICAgICAgICAgIHZhciBTSEFERVJfU1RBVEUgPSBlbnYuc2hhcmVkLnNoYWRlclxuICAgICAgICAgIHZhciBmcmFnSWRcbiAgICAgICAgICBpZiAoZnJhZykge1xuICAgICAgICAgICAgZnJhZ0lkID0gZnJhZy5hcHBlbmQoZW52LCBzY29wZSlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZnJhZ0lkID0gc2NvcGUuZGVmKFNIQURFUl9TVEFURSwgJy4nLCBTX0ZSQUcpXG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciB2ZXJ0SWRcbiAgICAgICAgICBpZiAodmVydCkge1xuICAgICAgICAgICAgdmVydElkID0gdmVydC5hcHBlbmQoZW52LCBzY29wZSlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmVydElkID0gc2NvcGUuZGVmKFNIQURFUl9TVEFURSwgJy4nLCBTX1ZFUlQpXG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciBwcm9nRGVmID0gU0hBREVSX1NUQVRFICsgJy5wcm9ncmFtKCcgKyB2ZXJ0SWQgKyAnLCcgKyBmcmFnSWRcbiAgICAgICAgICBjaGVjayQxLm9wdGlvbmFsKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHByb2dEZWYgKz0gJywnICsgZW52LmNvbW1hbmRcbiAgICAgICAgICB9KVxuICAgICAgICAgIHJldHVybiBzY29wZS5kZWYocHJvZ0RlZiArICcpJylcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgZnJhZzogZnJhZyxcbiAgICAgIHZlcnQ6IHZlcnQsXG4gICAgICBwcm9nVmFyOiBwcm9nVmFyLFxuICAgICAgcHJvZ3JhbTogcHJvZ3JhbVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHBhcnNlRHJhdyAob3B0aW9ucywgZW52KSB7XG4gICAgdmFyIHN0YXRpY09wdGlvbnMgPSBvcHRpb25zLnN0YXRpY1xuICAgIHZhciBkeW5hbWljT3B0aW9ucyA9IG9wdGlvbnMuZHluYW1pY1xuXG4gICAgZnVuY3Rpb24gcGFyc2VFbGVtZW50cyAoKSB7XG4gICAgICBpZiAoU19FTEVNRU5UUyBpbiBzdGF0aWNPcHRpb25zKSB7XG4gICAgICAgIHZhciBlbGVtZW50cyA9IHN0YXRpY09wdGlvbnNbU19FTEVNRU5UU11cbiAgICAgICAgaWYgKGlzQnVmZmVyQXJncyhlbGVtZW50cykpIHtcbiAgICAgICAgICBlbGVtZW50cyA9IGVsZW1lbnRTdGF0ZS5nZXRFbGVtZW50cyhlbGVtZW50U3RhdGUuY3JlYXRlKGVsZW1lbnRzLCB0cnVlKSlcbiAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50cykge1xuICAgICAgICAgIGVsZW1lbnRzID0gZWxlbWVudFN0YXRlLmdldEVsZW1lbnRzKGVsZW1lbnRzKVxuICAgICAgICAgIGNoZWNrJDEuY29tbWFuZChlbGVtZW50cywgJ2ludmFsaWQgZWxlbWVudHMnLCBlbnYuY29tbWFuZFN0cilcbiAgICAgICAgfVxuICAgICAgICB2YXIgcmVzdWx0ID0gY3JlYXRlU3RhdGljRGVjbChmdW5jdGlvbiAoZW52LCBzY29wZSkge1xuICAgICAgICAgIGlmIChlbGVtZW50cykge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGVudi5saW5rKGVsZW1lbnRzKVxuICAgICAgICAgICAgZW52LkVMRU1FTlRTID0gcmVzdWx0XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgICAgICAgfVxuICAgICAgICAgIGVudi5FTEVNRU5UUyA9IG51bGxcbiAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICB9KVxuICAgICAgICByZXN1bHQudmFsdWUgPSBlbGVtZW50c1xuICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgICB9IGVsc2UgaWYgKFNfRUxFTUVOVFMgaW4gZHluYW1pY09wdGlvbnMpIHtcbiAgICAgICAgdmFyIGR5biA9IGR5bmFtaWNPcHRpb25zW1NfRUxFTUVOVFNdXG4gICAgICAgIHJldHVybiBjcmVhdGVEeW5hbWljRGVjbChkeW4sIGZ1bmN0aW9uIChlbnYsIHNjb3BlKSB7XG4gICAgICAgICAgdmFyIHNoYXJlZCA9IGVudi5zaGFyZWRcblxuICAgICAgICAgIHZhciBJU19CVUZGRVJfQVJHUyA9IHNoYXJlZC5pc0J1ZmZlckFyZ3NcbiAgICAgICAgICB2YXIgRUxFTUVOVF9TVEFURSA9IHNoYXJlZC5lbGVtZW50c1xuXG4gICAgICAgICAgdmFyIGVsZW1lbnREZWZuID0gZW52Lmludm9rZShzY29wZSwgZHluKVxuICAgICAgICAgIHZhciBlbGVtZW50cyA9IHNjb3BlLmRlZignbnVsbCcpXG4gICAgICAgICAgdmFyIGVsZW1lbnRTdHJlYW0gPSBzY29wZS5kZWYoSVNfQlVGRkVSX0FSR1MsICcoJywgZWxlbWVudERlZm4sICcpJylcblxuICAgICAgICAgIHZhciBpZnRlID0gZW52LmNvbmQoZWxlbWVudFN0cmVhbSlcbiAgICAgICAgICAgIC50aGVuKGVsZW1lbnRzLCAnPScsIEVMRU1FTlRfU1RBVEUsICcuY3JlYXRlU3RyZWFtKCcsIGVsZW1lbnREZWZuLCAnKTsnKVxuICAgICAgICAgICAgLmVsc2UoZWxlbWVudHMsICc9JywgRUxFTUVOVF9TVEFURSwgJy5nZXRFbGVtZW50cygnLCBlbGVtZW50RGVmbiwgJyk7JylcblxuICAgICAgICAgIGNoZWNrJDEub3B0aW9uYWwoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZW52LmFzc2VydChpZnRlLmVsc2UsXG4gICAgICAgICAgICAgICchJyArIGVsZW1lbnREZWZuICsgJ3x8JyArIGVsZW1lbnRzLFxuICAgICAgICAgICAgICAnaW52YWxpZCBlbGVtZW50cycpXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIHNjb3BlLmVudHJ5KGlmdGUpXG4gICAgICAgICAgc2NvcGUuZXhpdChcbiAgICAgICAgICAgIGVudi5jb25kKGVsZW1lbnRTdHJlYW0pXG4gICAgICAgICAgICAgIC50aGVuKEVMRU1FTlRfU1RBVEUsICcuZGVzdHJveVN0cmVhbSgnLCBlbGVtZW50cywgJyk7JykpXG5cbiAgICAgICAgICBlbnYuRUxFTUVOVFMgPSBlbGVtZW50c1xuXG4gICAgICAgICAgcmV0dXJuIGVsZW1lbnRzXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgdmFyIGVsZW1lbnRzID0gcGFyc2VFbGVtZW50cygpXG5cbiAgICBmdW5jdGlvbiBwYXJzZVByaW1pdGl2ZSAoKSB7XG4gICAgICBpZiAoU19QUklNSVRJVkUgaW4gc3RhdGljT3B0aW9ucykge1xuICAgICAgICB2YXIgcHJpbWl0aXZlID0gc3RhdGljT3B0aW9uc1tTX1BSSU1JVElWRV1cbiAgICAgICAgY2hlY2skMS5jb21tYW5kUGFyYW1ldGVyKHByaW1pdGl2ZSwgcHJpbVR5cGVzLCAnaW52YWxpZCBwcmltaXR2ZScsIGVudi5jb21tYW5kU3RyKVxuICAgICAgICByZXR1cm4gY3JlYXRlU3RhdGljRGVjbChmdW5jdGlvbiAoZW52LCBzY29wZSkge1xuICAgICAgICAgIHJldHVybiBwcmltVHlwZXNbcHJpbWl0aXZlXVxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIGlmIChTX1BSSU1JVElWRSBpbiBkeW5hbWljT3B0aW9ucykge1xuICAgICAgICB2YXIgZHluUHJpbWl0aXZlID0gZHluYW1pY09wdGlvbnNbU19QUklNSVRJVkVdXG4gICAgICAgIHJldHVybiBjcmVhdGVEeW5hbWljRGVjbChkeW5QcmltaXRpdmUsIGZ1bmN0aW9uIChlbnYsIHNjb3BlKSB7XG4gICAgICAgICAgdmFyIFBSSU1fVFlQRVMgPSBlbnYuY29uc3RhbnRzLnByaW1UeXBlc1xuICAgICAgICAgIHZhciBwcmltID0gZW52Lmludm9rZShzY29wZSwgZHluUHJpbWl0aXZlKVxuICAgICAgICAgIGNoZWNrJDEub3B0aW9uYWwoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZW52LmFzc2VydChzY29wZSxcbiAgICAgICAgICAgICAgcHJpbSArICcgaW4gJyArIFBSSU1fVFlQRVMsXG4gICAgICAgICAgICAgICdpbnZhbGlkIHByaW1pdGl2ZSwgbXVzdCBiZSBvbmUgb2YgJyArIE9iamVjdC5rZXlzKHByaW1UeXBlcykpXG4gICAgICAgICAgfSlcbiAgICAgICAgICByZXR1cm4gc2NvcGUuZGVmKFBSSU1fVFlQRVMsICdbJywgcHJpbSwgJ10nKVxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIGlmIChlbGVtZW50cykge1xuICAgICAgICBpZiAoaXNTdGF0aWMoZWxlbWVudHMpKSB7XG4gICAgICAgICAgaWYgKGVsZW1lbnRzLnZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlU3RhdGljRGVjbChmdW5jdGlvbiAoZW52LCBzY29wZSkge1xuICAgICAgICAgICAgICByZXR1cm4gc2NvcGUuZGVmKGVudi5FTEVNRU5UUywgJy5wcmltVHlwZScpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlU3RhdGljRGVjbChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIHJldHVybiBHTF9UUklBTkdMRVMkMVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBEZWNsYXJhdGlvbihcbiAgICAgICAgICAgIGVsZW1lbnRzLnRoaXNEZXAsXG4gICAgICAgICAgICBlbGVtZW50cy5jb250ZXh0RGVwLFxuICAgICAgICAgICAgZWxlbWVudHMucHJvcERlcCxcbiAgICAgICAgICAgIGZ1bmN0aW9uIChlbnYsIHNjb3BlKSB7XG4gICAgICAgICAgICAgIHZhciBlbGVtZW50cyA9IGVudi5FTEVNRU5UU1xuICAgICAgICAgICAgICByZXR1cm4gc2NvcGUuZGVmKGVsZW1lbnRzLCAnPycsIGVsZW1lbnRzLCAnLnByaW1UeXBlOicsIEdMX1RSSUFOR0xFUyQxKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwYXJzZVBhcmFtIChwYXJhbSwgaXNPZmZzZXQpIHtcbiAgICAgIGlmIChwYXJhbSBpbiBzdGF0aWNPcHRpb25zKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IHN0YXRpY09wdGlvbnNbcGFyYW1dIHwgMFxuICAgICAgICBjaGVjayQxLmNvbW1hbmQoIWlzT2Zmc2V0IHx8IHZhbHVlID49IDAsICdpbnZhbGlkICcgKyBwYXJhbSwgZW52LmNvbW1hbmRTdHIpXG4gICAgICAgIHJldHVybiBjcmVhdGVTdGF0aWNEZWNsKGZ1bmN0aW9uIChlbnYsIHNjb3BlKSB7XG4gICAgICAgICAgaWYgKGlzT2Zmc2V0KSB7XG4gICAgICAgICAgICBlbnYuT0ZGU0VUID0gdmFsdWVcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHZhbHVlXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2UgaWYgKHBhcmFtIGluIGR5bmFtaWNPcHRpb25zKSB7XG4gICAgICAgIHZhciBkeW5WYWx1ZSA9IGR5bmFtaWNPcHRpb25zW3BhcmFtXVxuICAgICAgICByZXR1cm4gY3JlYXRlRHluYW1pY0RlY2woZHluVmFsdWUsIGZ1bmN0aW9uIChlbnYsIHNjb3BlKSB7XG4gICAgICAgICAgdmFyIHJlc3VsdCA9IGVudi5pbnZva2Uoc2NvcGUsIGR5blZhbHVlKVxuICAgICAgICAgIGlmIChpc09mZnNldCkge1xuICAgICAgICAgICAgZW52Lk9GRlNFVCA9IHJlc3VsdFxuICAgICAgICAgICAgY2hlY2skMS5vcHRpb25hbChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIGVudi5hc3NlcnQoc2NvcGUsXG4gICAgICAgICAgICAgICAgcmVzdWx0ICsgJz49MCcsXG4gICAgICAgICAgICAgICAgJ2ludmFsaWQgJyArIHBhcmFtKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIGlmIChpc09mZnNldCAmJiBlbGVtZW50cykge1xuICAgICAgICByZXR1cm4gY3JlYXRlU3RhdGljRGVjbChmdW5jdGlvbiAoZW52LCBzY29wZSkge1xuICAgICAgICAgIGVudi5PRkZTRVQgPSAnMCdcbiAgICAgICAgICByZXR1cm4gMFxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICB2YXIgT0ZGU0VUID0gcGFyc2VQYXJhbShTX09GRlNFVCwgdHJ1ZSlcblxuICAgIGZ1bmN0aW9uIHBhcnNlVmVydENvdW50ICgpIHtcbiAgICAgIGlmIChTX0NPVU5UIGluIHN0YXRpY09wdGlvbnMpIHtcbiAgICAgICAgdmFyIGNvdW50ID0gc3RhdGljT3B0aW9uc1tTX0NPVU5UXSB8IDBcbiAgICAgICAgY2hlY2skMS5jb21tYW5kKFxuICAgICAgICAgIHR5cGVvZiBjb3VudCA9PT0gJ251bWJlcicgJiYgY291bnQgPj0gMCwgJ2ludmFsaWQgdmVydGV4IGNvdW50JywgZW52LmNvbW1hbmRTdHIpXG4gICAgICAgIHJldHVybiBjcmVhdGVTdGF0aWNEZWNsKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gY291bnRcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSBpZiAoU19DT1VOVCBpbiBkeW5hbWljT3B0aW9ucykge1xuICAgICAgICB2YXIgZHluQ291bnQgPSBkeW5hbWljT3B0aW9uc1tTX0NPVU5UXVxuICAgICAgICByZXR1cm4gY3JlYXRlRHluYW1pY0RlY2woZHluQ291bnQsIGZ1bmN0aW9uIChlbnYsIHNjb3BlKSB7XG4gICAgICAgICAgdmFyIHJlc3VsdCA9IGVudi5pbnZva2Uoc2NvcGUsIGR5bkNvdW50KVxuICAgICAgICAgIGNoZWNrJDEub3B0aW9uYWwoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZW52LmFzc2VydChzY29wZSxcbiAgICAgICAgICAgICAgJ3R5cGVvZiAnICsgcmVzdWx0ICsgJz09PVwibnVtYmVyXCImJicgK1xuICAgICAgICAgICAgICByZXN1bHQgKyAnPj0wJiYnICtcbiAgICAgICAgICAgICAgcmVzdWx0ICsgJz09PSgnICsgcmVzdWx0ICsgJ3wwKScsXG4gICAgICAgICAgICAgICdpbnZhbGlkIHZlcnRleCBjb3VudCcpXG4gICAgICAgICAgfSlcbiAgICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgICAgIH0pXG4gICAgICB9IGVsc2UgaWYgKGVsZW1lbnRzKSB7XG4gICAgICAgIGlmIChpc1N0YXRpYyhlbGVtZW50cykpIHtcbiAgICAgICAgICBpZiAoZWxlbWVudHMpIHtcbiAgICAgICAgICAgIGlmIChPRkZTRVQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEZWNsYXJhdGlvbihcbiAgICAgICAgICAgICAgICBPRkZTRVQudGhpc0RlcCxcbiAgICAgICAgICAgICAgICBPRkZTRVQuY29udGV4dERlcCxcbiAgICAgICAgICAgICAgICBPRkZTRVQucHJvcERlcCxcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZW52LCBzY29wZSkge1xuICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHNjb3BlLmRlZihcbiAgICAgICAgICAgICAgICAgICAgZW52LkVMRU1FTlRTLCAnLnZlcnRDb3VudC0nLCBlbnYuT0ZGU0VUKVxuXG4gICAgICAgICAgICAgICAgICBjaGVjayQxLm9wdGlvbmFsKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgZW52LmFzc2VydChzY29wZSxcbiAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKyAnPj0wJyxcbiAgICAgICAgICAgICAgICAgICAgICAnaW52YWxpZCB2ZXJ0ZXggb2Zmc2V0L2VsZW1lbnQgYnVmZmVyIHRvbyBzbWFsbCcpXG4gICAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiBjcmVhdGVTdGF0aWNEZWNsKGZ1bmN0aW9uIChlbnYsIHNjb3BlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNjb3BlLmRlZihlbnYuRUxFTUVOVFMsICcudmVydENvdW50JylcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGNyZWF0ZVN0YXRpY0RlY2woZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICByZXR1cm4gLTFcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBjaGVjayQxLm9wdGlvbmFsKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgcmVzdWx0Lk1JU1NJTkcgPSB0cnVlXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgdmFyaWFibGUgPSBuZXcgRGVjbGFyYXRpb24oXG4gICAgICAgICAgICBlbGVtZW50cy50aGlzRGVwIHx8IE9GRlNFVC50aGlzRGVwLFxuICAgICAgICAgICAgZWxlbWVudHMuY29udGV4dERlcCB8fCBPRkZTRVQuY29udGV4dERlcCxcbiAgICAgICAgICAgIGVsZW1lbnRzLnByb3BEZXAgfHwgT0ZGU0VULnByb3BEZXAsXG4gICAgICAgICAgICBmdW5jdGlvbiAoZW52LCBzY29wZSkge1xuICAgICAgICAgICAgICB2YXIgZWxlbWVudHMgPSBlbnYuRUxFTUVOVFNcbiAgICAgICAgICAgICAgaWYgKGVudi5PRkZTRVQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc2NvcGUuZGVmKGVsZW1lbnRzLCAnPycsIGVsZW1lbnRzLCAnLnZlcnRDb3VudC0nLFxuICAgICAgICAgICAgICAgICAgZW52Lk9GRlNFVCwgJzotMScpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIHNjb3BlLmRlZihlbGVtZW50cywgJz8nLCBlbGVtZW50cywgJy52ZXJ0Q291bnQ6LTEnKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICBjaGVjayQxLm9wdGlvbmFsKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhcmlhYmxlLkRZTkFNSUMgPSB0cnVlXG4gICAgICAgICAgfSlcbiAgICAgICAgICByZXR1cm4gdmFyaWFibGVcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgZWxlbWVudHM6IGVsZW1lbnRzLFxuICAgICAgcHJpbWl0aXZlOiBwYXJzZVByaW1pdGl2ZSgpLFxuICAgICAgY291bnQ6IHBhcnNlVmVydENvdW50KCksXG4gICAgICBpbnN0YW5jZXM6IHBhcnNlUGFyYW0oU19JTlNUQU5DRVMsIGZhbHNlKSxcbiAgICAgIG9mZnNldDogT0ZGU0VUXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcGFyc2VHTFN0YXRlIChvcHRpb25zLCBlbnYpIHtcbiAgICB2YXIgc3RhdGljT3B0aW9ucyA9IG9wdGlvbnMuc3RhdGljXG4gICAgdmFyIGR5bmFtaWNPcHRpb25zID0gb3B0aW9ucy5keW5hbWljXG5cbiAgICB2YXIgU1RBVEUgPSB7fVxuXG4gICAgR0xfU1RBVEVfTkFNRVMuZm9yRWFjaChmdW5jdGlvbiAocHJvcCkge1xuICAgICAgdmFyIHBhcmFtID0gcHJvcE5hbWUocHJvcClcblxuICAgICAgZnVuY3Rpb24gcGFyc2VQYXJhbSAocGFyc2VTdGF0aWMsIHBhcnNlRHluYW1pYykge1xuICAgICAgICBpZiAocHJvcCBpbiBzdGF0aWNPcHRpb25zKSB7XG4gICAgICAgICAgdmFyIHZhbHVlID0gcGFyc2VTdGF0aWMoc3RhdGljT3B0aW9uc1twcm9wXSlcbiAgICAgICAgICBTVEFURVtwYXJhbV0gPSBjcmVhdGVTdGF0aWNEZWNsKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZVxuICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSBpZiAocHJvcCBpbiBkeW5hbWljT3B0aW9ucykge1xuICAgICAgICAgIHZhciBkeW4gPSBkeW5hbWljT3B0aW9uc1twcm9wXVxuICAgICAgICAgIFNUQVRFW3BhcmFtXSA9IGNyZWF0ZUR5bmFtaWNEZWNsKGR5biwgZnVuY3Rpb24gKGVudiwgc2NvcGUpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJzZUR5bmFtaWMoZW52LCBzY29wZSwgZW52Lmludm9rZShzY29wZSwgZHluKSlcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHN3aXRjaCAocHJvcCkge1xuICAgICAgICBjYXNlIFNfQ1VMTF9FTkFCTEU6XG4gICAgICAgIGNhc2UgU19CTEVORF9FTkFCTEU6XG4gICAgICAgIGNhc2UgU19ESVRIRVI6XG4gICAgICAgIGNhc2UgU19TVEVOQ0lMX0VOQUJMRTpcbiAgICAgICAgY2FzZSBTX0RFUFRIX0VOQUJMRTpcbiAgICAgICAgY2FzZSBTX1NDSVNTT1JfRU5BQkxFOlxuICAgICAgICBjYXNlIFNfUE9MWUdPTl9PRkZTRVRfRU5BQkxFOlxuICAgICAgICBjYXNlIFNfU0FNUExFX0FMUEhBOlxuICAgICAgICBjYXNlIFNfU0FNUExFX0VOQUJMRTpcbiAgICAgICAgY2FzZSBTX0RFUFRIX01BU0s6XG4gICAgICAgICAgcmV0dXJuIHBhcnNlUGFyYW0oXG4gICAgICAgICAgICBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgY2hlY2skMS5jb21tYW5kVHlwZSh2YWx1ZSwgJ2Jvb2xlYW4nLCBwcm9wLCBlbnYuY29tbWFuZFN0cilcbiAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZnVuY3Rpb24gKGVudiwgc2NvcGUsIHZhbHVlKSB7XG4gICAgICAgICAgICAgIGNoZWNrJDEub3B0aW9uYWwoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGVudi5hc3NlcnQoc2NvcGUsXG4gICAgICAgICAgICAgICAgICAndHlwZW9mICcgKyB2YWx1ZSArICc9PT1cImJvb2xlYW5cIicsXG4gICAgICAgICAgICAgICAgICAnaW52YWxpZCBmbGFnICcgKyBwcm9wLCBlbnYuY29tbWFuZFN0cilcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgIGNhc2UgU19ERVBUSF9GVU5DOlxuICAgICAgICAgIHJldHVybiBwYXJzZVBhcmFtKFxuICAgICAgICAgICAgZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgIGNoZWNrJDEuY29tbWFuZFBhcmFtZXRlcih2YWx1ZSwgY29tcGFyZUZ1bmNzLCAnaW52YWxpZCAnICsgcHJvcCwgZW52LmNvbW1hbmRTdHIpXG4gICAgICAgICAgICAgIHJldHVybiBjb21wYXJlRnVuY3NbdmFsdWVdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZnVuY3Rpb24gKGVudiwgc2NvcGUsIHZhbHVlKSB7XG4gICAgICAgICAgICAgIHZhciBDT01QQVJFX0ZVTkNTID0gZW52LmNvbnN0YW50cy5jb21wYXJlRnVuY3NcbiAgICAgICAgICAgICAgY2hlY2skMS5vcHRpb25hbChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgZW52LmFzc2VydChzY29wZSxcbiAgICAgICAgICAgICAgICAgIHZhbHVlICsgJyBpbiAnICsgQ09NUEFSRV9GVU5DUyxcbiAgICAgICAgICAgICAgICAgICdpbnZhbGlkICcgKyBwcm9wICsgJywgbXVzdCBiZSBvbmUgb2YgJyArIE9iamVjdC5rZXlzKGNvbXBhcmVGdW5jcykpXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIHJldHVybiBzY29wZS5kZWYoQ09NUEFSRV9GVU5DUywgJ1snLCB2YWx1ZSwgJ10nKVxuICAgICAgICAgICAgfSlcblxuICAgICAgICBjYXNlIFNfREVQVEhfUkFOR0U6XG4gICAgICAgICAgcmV0dXJuIHBhcnNlUGFyYW0oXG4gICAgICAgICAgICBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgY2hlY2skMS5jb21tYW5kKFxuICAgICAgICAgICAgICAgIGlzQXJyYXlMaWtlKHZhbHVlKSAmJlxuICAgICAgICAgICAgICAgIHZhbHVlLmxlbmd0aCA9PT0gMiAmJlxuICAgICAgICAgICAgICAgIHR5cGVvZiB2YWx1ZVswXSA9PT0gJ251bWJlcicgJiZcbiAgICAgICAgICAgICAgICB0eXBlb2YgdmFsdWVbMV0gPT09ICdudW1iZXInICYmXG4gICAgICAgICAgICAgICAgdmFsdWVbMF0gPD0gdmFsdWVbMV0sXG4gICAgICAgICAgICAgICAgJ2RlcHRoIHJhbmdlIGlzIDJkIGFycmF5JyxcbiAgICAgICAgICAgICAgICBlbnYuY29tbWFuZFN0cilcbiAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZnVuY3Rpb24gKGVudiwgc2NvcGUsIHZhbHVlKSB7XG4gICAgICAgICAgICAgIGNoZWNrJDEub3B0aW9uYWwoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGVudi5hc3NlcnQoc2NvcGUsXG4gICAgICAgICAgICAgICAgICBlbnYuc2hhcmVkLmlzQXJyYXlMaWtlICsgJygnICsgdmFsdWUgKyAnKSYmJyArXG4gICAgICAgICAgICAgICAgICB2YWx1ZSArICcubGVuZ3RoPT09MiYmJyArXG4gICAgICAgICAgICAgICAgICAndHlwZW9mICcgKyB2YWx1ZSArICdbMF09PT1cIm51bWJlclwiJiYnICtcbiAgICAgICAgICAgICAgICAgICd0eXBlb2YgJyArIHZhbHVlICsgJ1sxXT09PVwibnVtYmVyXCImJicgK1xuICAgICAgICAgICAgICAgICAgdmFsdWUgKyAnWzBdPD0nICsgdmFsdWUgKyAnWzFdJyxcbiAgICAgICAgICAgICAgICAgICdkZXB0aCByYW5nZSBtdXN0IGJlIGEgMmQgYXJyYXknKVxuICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgIHZhciBaX05FQVIgPSBzY29wZS5kZWYoJysnLCB2YWx1ZSwgJ1swXScpXG4gICAgICAgICAgICAgIHZhciBaX0ZBUiA9IHNjb3BlLmRlZignKycsIHZhbHVlLCAnWzFdJylcbiAgICAgICAgICAgICAgcmV0dXJuIFtaX05FQVIsIFpfRkFSXVxuICAgICAgICAgICAgfSlcblxuICAgICAgICBjYXNlIFNfQkxFTkRfRlVOQzpcbiAgICAgICAgICByZXR1cm4gcGFyc2VQYXJhbShcbiAgICAgICAgICAgIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICBjaGVjayQxLmNvbW1hbmRUeXBlKHZhbHVlLCAnb2JqZWN0JywgJ2JsZW5kLmZ1bmMnLCBlbnYuY29tbWFuZFN0cilcbiAgICAgICAgICAgICAgdmFyIHNyY1JHQiA9ICgnc3JjUkdCJyBpbiB2YWx1ZSA/IHZhbHVlLnNyY1JHQiA6IHZhbHVlLnNyYylcbiAgICAgICAgICAgICAgdmFyIHNyY0FscGhhID0gKCdzcmNBbHBoYScgaW4gdmFsdWUgPyB2YWx1ZS5zcmNBbHBoYSA6IHZhbHVlLnNyYylcbiAgICAgICAgICAgICAgdmFyIGRzdFJHQiA9ICgnZHN0UkdCJyBpbiB2YWx1ZSA/IHZhbHVlLmRzdFJHQiA6IHZhbHVlLmRzdClcbiAgICAgICAgICAgICAgdmFyIGRzdEFscGhhID0gKCdkc3RBbHBoYScgaW4gdmFsdWUgPyB2YWx1ZS5kc3RBbHBoYSA6IHZhbHVlLmRzdClcbiAgICAgICAgICAgICAgY2hlY2skMS5jb21tYW5kUGFyYW1ldGVyKHNyY1JHQiwgYmxlbmRGdW5jcywgcGFyYW0gKyAnLnNyY1JHQicsIGVudi5jb21tYW5kU3RyKVxuICAgICAgICAgICAgICBjaGVjayQxLmNvbW1hbmRQYXJhbWV0ZXIoc3JjQWxwaGEsIGJsZW5kRnVuY3MsIHBhcmFtICsgJy5zcmNBbHBoYScsIGVudi5jb21tYW5kU3RyKVxuICAgICAgICAgICAgICBjaGVjayQxLmNvbW1hbmRQYXJhbWV0ZXIoZHN0UkdCLCBibGVuZEZ1bmNzLCBwYXJhbSArICcuZHN0UkdCJywgZW52LmNvbW1hbmRTdHIpXG4gICAgICAgICAgICAgIGNoZWNrJDEuY29tbWFuZFBhcmFtZXRlcihkc3RBbHBoYSwgYmxlbmRGdW5jcywgcGFyYW0gKyAnLmRzdEFscGhhJywgZW52LmNvbW1hbmRTdHIpXG5cbiAgICAgICAgICAgICAgY2hlY2skMS5jb21tYW5kKFxuICAgICAgICAgICAgICAgIChpbnZhbGlkQmxlbmRDb21iaW5hdGlvbnMuaW5kZXhPZihzcmNSR0IgKyAnLCAnICsgZHN0UkdCKSA9PT0gLTEpLFxuICAgICAgICAgICAgICAgICd1bmFsbG93ZWQgYmxlbmRpbmcgY29tYmluYXRpb24gKHNyY1JHQiwgZHN0UkdCKSA9ICgnICsgc3JjUkdCICsgJywgJyArIGRzdFJHQiArICcpJywgZW52LmNvbW1hbmRTdHIpXG5cbiAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICBibGVuZEZ1bmNzW3NyY1JHQl0sXG4gICAgICAgICAgICAgICAgYmxlbmRGdW5jc1tkc3RSR0JdLFxuICAgICAgICAgICAgICAgIGJsZW5kRnVuY3Nbc3JjQWxwaGFdLFxuICAgICAgICAgICAgICAgIGJsZW5kRnVuY3NbZHN0QWxwaGFdXG4gICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBmdW5jdGlvbiAoZW52LCBzY29wZSwgdmFsdWUpIHtcbiAgICAgICAgICAgICAgdmFyIEJMRU5EX0ZVTkNTID0gZW52LmNvbnN0YW50cy5ibGVuZEZ1bmNzXG5cbiAgICAgICAgICAgICAgY2hlY2skMS5vcHRpb25hbChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgZW52LmFzc2VydChzY29wZSxcbiAgICAgICAgICAgICAgICAgIHZhbHVlICsgJyYmdHlwZW9mICcgKyB2YWx1ZSArICc9PT1cIm9iamVjdFwiJyxcbiAgICAgICAgICAgICAgICAgICdpbnZhbGlkIGJsZW5kIGZ1bmMsIG11c3QgYmUgYW4gb2JqZWN0JylcbiAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICBmdW5jdGlvbiByZWFkIChwcmVmaXgsIHN1ZmZpeCkge1xuICAgICAgICAgICAgICAgIHZhciBmdW5jID0gc2NvcGUuZGVmKFxuICAgICAgICAgICAgICAgICAgJ1wiJywgcHJlZml4LCBzdWZmaXgsICdcIiBpbiAnLCB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICc/JywgdmFsdWUsICcuJywgcHJlZml4LCBzdWZmaXgsXG4gICAgICAgICAgICAgICAgICAnOicsIHZhbHVlLCAnLicsIHByZWZpeClcblxuICAgICAgICAgICAgICAgIGNoZWNrJDEub3B0aW9uYWwoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgZW52LmFzc2VydChzY29wZSxcbiAgICAgICAgICAgICAgICAgICAgZnVuYyArICcgaW4gJyArIEJMRU5EX0ZVTkNTLFxuICAgICAgICAgICAgICAgICAgICAnaW52YWxpZCAnICsgcHJvcCArICcuJyArIHByZWZpeCArIHN1ZmZpeCArICcsIG11c3QgYmUgb25lIG9mICcgKyBPYmplY3Qua2V5cyhibGVuZEZ1bmNzKSlcbiAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmNcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHZhciBzcmNSR0IgPSByZWFkKCdzcmMnLCAnUkdCJylcbiAgICAgICAgICAgICAgdmFyIGRzdFJHQiA9IHJlYWQoJ2RzdCcsICdSR0InKVxuXG4gICAgICAgICAgICAgIGNoZWNrJDEub3B0aW9uYWwoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHZhciBJTlZBTElEX0JMRU5EX0NPTUJJTkFUSU9OUyA9IGVudi5jb25zdGFudHMuaW52YWxpZEJsZW5kQ29tYmluYXRpb25zXG5cbiAgICAgICAgICAgICAgICBlbnYuYXNzZXJ0KHNjb3BlLFxuICAgICAgICAgICAgICAgICAgSU5WQUxJRF9CTEVORF9DT01CSU5BVElPTlMgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgJy5pbmRleE9mKCcgKyBzcmNSR0IgKyAnK1wiLCBcIisnICsgZHN0UkdCICsgJykgPT09IC0xICcsXG4gICAgICAgICAgICAgICAgICAndW5hbGxvd2VkIGJsZW5kaW5nIGNvbWJpbmF0aW9uIGZvciAoc3JjUkdCLCBkc3RSR0IpJ1xuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICB2YXIgU1JDX1JHQiA9IHNjb3BlLmRlZihCTEVORF9GVU5DUywgJ1snLCBzcmNSR0IsICddJylcbiAgICAgICAgICAgICAgdmFyIFNSQ19BTFBIQSA9IHNjb3BlLmRlZihCTEVORF9GVU5DUywgJ1snLCByZWFkKCdzcmMnLCAnQWxwaGEnKSwgJ10nKVxuICAgICAgICAgICAgICB2YXIgRFNUX1JHQiA9IHNjb3BlLmRlZihCTEVORF9GVU5DUywgJ1snLCBkc3RSR0IsICddJylcbiAgICAgICAgICAgICAgdmFyIERTVF9BTFBIQSA9IHNjb3BlLmRlZihCTEVORF9GVU5DUywgJ1snLCByZWFkKCdkc3QnLCAnQWxwaGEnKSwgJ10nKVxuXG4gICAgICAgICAgICAgIHJldHVybiBbU1JDX1JHQiwgRFNUX1JHQiwgU1JDX0FMUEhBLCBEU1RfQUxQSEFdXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgIGNhc2UgU19CTEVORF9FUVVBVElPTjpcbiAgICAgICAgICByZXR1cm4gcGFyc2VQYXJhbShcbiAgICAgICAgICAgIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGNoZWNrJDEuY29tbWFuZFBhcmFtZXRlcih2YWx1ZSwgYmxlbmRFcXVhdGlvbnMsICdpbnZhbGlkICcgKyBwcm9wLCBlbnYuY29tbWFuZFN0cilcbiAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgYmxlbmRFcXVhdGlvbnNbdmFsdWVdLFxuICAgICAgICAgICAgICAgICAgYmxlbmRFcXVhdGlvbnNbdmFsdWVdXG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICBjaGVjayQxLmNvbW1hbmRQYXJhbWV0ZXIoXG4gICAgICAgICAgICAgICAgICB2YWx1ZS5yZ2IsIGJsZW5kRXF1YXRpb25zLCBwcm9wICsgJy5yZ2InLCBlbnYuY29tbWFuZFN0cilcbiAgICAgICAgICAgICAgICBjaGVjayQxLmNvbW1hbmRQYXJhbWV0ZXIoXG4gICAgICAgICAgICAgICAgICB2YWx1ZS5hbHBoYSwgYmxlbmRFcXVhdGlvbnMsIHByb3AgKyAnLmFscGhhJywgZW52LmNvbW1hbmRTdHIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgIGJsZW5kRXF1YXRpb25zW3ZhbHVlLnJnYl0sXG4gICAgICAgICAgICAgICAgICBibGVuZEVxdWF0aW9uc1t2YWx1ZS5hbHBoYV1cbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY2hlY2skMS5jb21tYW5kUmFpc2UoJ2ludmFsaWQgYmxlbmQuZXF1YXRpb24nLCBlbnYuY29tbWFuZFN0cilcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZ1bmN0aW9uIChlbnYsIHNjb3BlLCB2YWx1ZSkge1xuICAgICAgICAgICAgICB2YXIgQkxFTkRfRVFVQVRJT05TID0gZW52LmNvbnN0YW50cy5ibGVuZEVxdWF0aW9uc1xuXG4gICAgICAgICAgICAgIHZhciBSR0IgPSBzY29wZS5kZWYoKVxuICAgICAgICAgICAgICB2YXIgQUxQSEEgPSBzY29wZS5kZWYoKVxuXG4gICAgICAgICAgICAgIHZhciBpZnRlID0gZW52LmNvbmQoJ3R5cGVvZiAnLCB2YWx1ZSwgJz09PVwic3RyaW5nXCInKVxuXG4gICAgICAgICAgICAgIGNoZWNrJDEub3B0aW9uYWwoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGNoZWNrUHJvcCAoYmxvY2ssIG5hbWUsIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICBlbnYuYXNzZXJ0KGJsb2NrLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSArICcgaW4gJyArIEJMRU5EX0VRVUFUSU9OUyxcbiAgICAgICAgICAgICAgICAgICAgJ2ludmFsaWQgJyArIG5hbWUgKyAnLCBtdXN0IGJlIG9uZSBvZiAnICsgT2JqZWN0LmtleXMoYmxlbmRFcXVhdGlvbnMpKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjaGVja1Byb3AoaWZ0ZS50aGVuLCBwcm9wLCB2YWx1ZSlcblxuICAgICAgICAgICAgICAgIGVudi5hc3NlcnQoaWZ0ZS5lbHNlLFxuICAgICAgICAgICAgICAgICAgdmFsdWUgKyAnJiZ0eXBlb2YgJyArIHZhbHVlICsgJz09PVwib2JqZWN0XCInLFxuICAgICAgICAgICAgICAgICAgJ2ludmFsaWQgJyArIHByb3ApXG4gICAgICAgICAgICAgICAgY2hlY2tQcm9wKGlmdGUuZWxzZSwgcHJvcCArICcucmdiJywgdmFsdWUgKyAnLnJnYicpXG4gICAgICAgICAgICAgICAgY2hlY2tQcm9wKGlmdGUuZWxzZSwgcHJvcCArICcuYWxwaGEnLCB2YWx1ZSArICcuYWxwaGEnKVxuICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgIGlmdGUudGhlbihcbiAgICAgICAgICAgICAgICBSR0IsICc9JywgQUxQSEEsICc9JywgQkxFTkRfRVFVQVRJT05TLCAnWycsIHZhbHVlLCAnXTsnKVxuICAgICAgICAgICAgICBpZnRlLmVsc2UoXG4gICAgICAgICAgICAgICAgUkdCLCAnPScsIEJMRU5EX0VRVUFUSU9OUywgJ1snLCB2YWx1ZSwgJy5yZ2JdOycsXG4gICAgICAgICAgICAgICAgQUxQSEEsICc9JywgQkxFTkRfRVFVQVRJT05TLCAnWycsIHZhbHVlLCAnLmFscGhhXTsnKVxuXG4gICAgICAgICAgICAgIHNjb3BlKGlmdGUpXG5cbiAgICAgICAgICAgICAgcmV0dXJuIFtSR0IsIEFMUEhBXVxuICAgICAgICAgICAgfSlcblxuICAgICAgICBjYXNlIFNfQkxFTkRfQ09MT1I6XG4gICAgICAgICAgcmV0dXJuIHBhcnNlUGFyYW0oXG4gICAgICAgICAgICBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgY2hlY2skMS5jb21tYW5kKFxuICAgICAgICAgICAgICAgIGlzQXJyYXlMaWtlKHZhbHVlKSAmJlxuICAgICAgICAgICAgICAgIHZhbHVlLmxlbmd0aCA9PT0gNCxcbiAgICAgICAgICAgICAgICAnYmxlbmQuY29sb3IgbXVzdCBiZSBhIDRkIGFycmF5JywgZW52LmNvbW1hbmRTdHIpXG4gICAgICAgICAgICAgIHJldHVybiBsb29wKDQsIGZ1bmN0aW9uIChpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICt2YWx1ZVtpXVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZ1bmN0aW9uIChlbnYsIHNjb3BlLCB2YWx1ZSkge1xuICAgICAgICAgICAgICBjaGVjayQxLm9wdGlvbmFsKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBlbnYuYXNzZXJ0KHNjb3BlLFxuICAgICAgICAgICAgICAgICAgZW52LnNoYXJlZC5pc0FycmF5TGlrZSArICcoJyArIHZhbHVlICsgJykmJicgK1xuICAgICAgICAgICAgICAgICAgdmFsdWUgKyAnLmxlbmd0aD09PTQnLFxuICAgICAgICAgICAgICAgICAgJ2JsZW5kLmNvbG9yIG11c3QgYmUgYSA0ZCBhcnJheScpXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIHJldHVybiBsb29wKDQsIGZ1bmN0aW9uIChpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNjb3BlLmRlZignKycsIHZhbHVlLCAnWycsIGksICddJylcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgY2FzZSBTX1NURU5DSUxfTUFTSzpcbiAgICAgICAgICByZXR1cm4gcGFyc2VQYXJhbShcbiAgICAgICAgICAgIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICBjaGVjayQxLmNvbW1hbmRUeXBlKHZhbHVlLCAnbnVtYmVyJywgcGFyYW0sIGVudi5jb21tYW5kU3RyKVxuICAgICAgICAgICAgICByZXR1cm4gdmFsdWUgfCAwXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZnVuY3Rpb24gKGVudiwgc2NvcGUsIHZhbHVlKSB7XG4gICAgICAgICAgICAgIGNoZWNrJDEub3B0aW9uYWwoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGVudi5hc3NlcnQoc2NvcGUsXG4gICAgICAgICAgICAgICAgICAndHlwZW9mICcgKyB2YWx1ZSArICc9PT1cIm51bWJlclwiJyxcbiAgICAgICAgICAgICAgICAgICdpbnZhbGlkIHN0ZW5jaWwubWFzaycpXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIHJldHVybiBzY29wZS5kZWYodmFsdWUsICd8MCcpXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgIGNhc2UgU19TVEVOQ0lMX0ZVTkM6XG4gICAgICAgICAgcmV0dXJuIHBhcnNlUGFyYW0oXG4gICAgICAgICAgICBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgY2hlY2skMS5jb21tYW5kVHlwZSh2YWx1ZSwgJ29iamVjdCcsIHBhcmFtLCBlbnYuY29tbWFuZFN0cilcbiAgICAgICAgICAgICAgdmFyIGNtcCA9IHZhbHVlLmNtcCB8fCAna2VlcCdcbiAgICAgICAgICAgICAgdmFyIHJlZiA9IHZhbHVlLnJlZiB8fCAwXG4gICAgICAgICAgICAgIHZhciBtYXNrID0gJ21hc2snIGluIHZhbHVlID8gdmFsdWUubWFzayA6IC0xXG4gICAgICAgICAgICAgIGNoZWNrJDEuY29tbWFuZFBhcmFtZXRlcihjbXAsIGNvbXBhcmVGdW5jcywgcHJvcCArICcuY21wJywgZW52LmNvbW1hbmRTdHIpXG4gICAgICAgICAgICAgIGNoZWNrJDEuY29tbWFuZFR5cGUocmVmLCAnbnVtYmVyJywgcHJvcCArICcucmVmJywgZW52LmNvbW1hbmRTdHIpXG4gICAgICAgICAgICAgIGNoZWNrJDEuY29tbWFuZFR5cGUobWFzaywgJ251bWJlcicsIHByb3AgKyAnLm1hc2snLCBlbnYuY29tbWFuZFN0cilcbiAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICBjb21wYXJlRnVuY3NbY21wXSxcbiAgICAgICAgICAgICAgICByZWYsXG4gICAgICAgICAgICAgICAgbWFza1xuICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZnVuY3Rpb24gKGVudiwgc2NvcGUsIHZhbHVlKSB7XG4gICAgICAgICAgICAgIHZhciBDT01QQVJFX0ZVTkNTID0gZW52LmNvbnN0YW50cy5jb21wYXJlRnVuY3NcbiAgICAgICAgICAgICAgY2hlY2skMS5vcHRpb25hbChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gYXNzZXJ0ICgpIHtcbiAgICAgICAgICAgICAgICAgIGVudi5hc3NlcnQoc2NvcGUsXG4gICAgICAgICAgICAgICAgICAgIEFycmF5LnByb3RvdHlwZS5qb2luLmNhbGwoYXJndW1lbnRzLCAnJyksXG4gICAgICAgICAgICAgICAgICAgICdpbnZhbGlkIHN0ZW5jaWwuZnVuYycpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGFzc2VydCh2YWx1ZSArICcmJnR5cGVvZiAnLCB2YWx1ZSwgJz09PVwib2JqZWN0XCInKVxuICAgICAgICAgICAgICAgIGFzc2VydCgnIShcImNtcFwiIGluICcsIHZhbHVlLCAnKXx8KCcsXG4gICAgICAgICAgICAgICAgICB2YWx1ZSwgJy5jbXAgaW4gJywgQ09NUEFSRV9GVU5DUywgJyknKVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICB2YXIgY21wID0gc2NvcGUuZGVmKFxuICAgICAgICAgICAgICAgICdcImNtcFwiIGluICcsIHZhbHVlLFxuICAgICAgICAgICAgICAgICc/JywgQ09NUEFSRV9GVU5DUywgJ1snLCB2YWx1ZSwgJy5jbXBdJyxcbiAgICAgICAgICAgICAgICAnOicsIEdMX0tFRVApXG4gICAgICAgICAgICAgIHZhciByZWYgPSBzY29wZS5kZWYodmFsdWUsICcucmVmfDAnKVxuICAgICAgICAgICAgICB2YXIgbWFzayA9IHNjb3BlLmRlZihcbiAgICAgICAgICAgICAgICAnXCJtYXNrXCIgaW4gJywgdmFsdWUsXG4gICAgICAgICAgICAgICAgJz8nLCB2YWx1ZSwgJy5tYXNrfDA6LTEnKVxuICAgICAgICAgICAgICByZXR1cm4gW2NtcCwgcmVmLCBtYXNrXVxuICAgICAgICAgICAgfSlcblxuICAgICAgICBjYXNlIFNfU1RFTkNJTF9PUEZST05UOlxuICAgICAgICBjYXNlIFNfU1RFTkNJTF9PUEJBQ0s6XG4gICAgICAgICAgcmV0dXJuIHBhcnNlUGFyYW0oXG4gICAgICAgICAgICBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgY2hlY2skMS5jb21tYW5kVHlwZSh2YWx1ZSwgJ29iamVjdCcsIHBhcmFtLCBlbnYuY29tbWFuZFN0cilcbiAgICAgICAgICAgICAgdmFyIGZhaWwgPSB2YWx1ZS5mYWlsIHx8ICdrZWVwJ1xuICAgICAgICAgICAgICB2YXIgemZhaWwgPSB2YWx1ZS56ZmFpbCB8fCAna2VlcCdcbiAgICAgICAgICAgICAgdmFyIHpwYXNzID0gdmFsdWUuenBhc3MgfHwgJ2tlZXAnXG4gICAgICAgICAgICAgIGNoZWNrJDEuY29tbWFuZFBhcmFtZXRlcihmYWlsLCBzdGVuY2lsT3BzLCBwcm9wICsgJy5mYWlsJywgZW52LmNvbW1hbmRTdHIpXG4gICAgICAgICAgICAgIGNoZWNrJDEuY29tbWFuZFBhcmFtZXRlcih6ZmFpbCwgc3RlbmNpbE9wcywgcHJvcCArICcuemZhaWwnLCBlbnYuY29tbWFuZFN0cilcbiAgICAgICAgICAgICAgY2hlY2skMS5jb21tYW5kUGFyYW1ldGVyKHpwYXNzLCBzdGVuY2lsT3BzLCBwcm9wICsgJy56cGFzcycsIGVudi5jb21tYW5kU3RyKVxuICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgIHByb3AgPT09IFNfU1RFTkNJTF9PUEJBQ0sgPyBHTF9CQUNLIDogR0xfRlJPTlQsXG4gICAgICAgICAgICAgICAgc3RlbmNpbE9wc1tmYWlsXSxcbiAgICAgICAgICAgICAgICBzdGVuY2lsT3BzW3pmYWlsXSxcbiAgICAgICAgICAgICAgICBzdGVuY2lsT3BzW3pwYXNzXVxuICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZnVuY3Rpb24gKGVudiwgc2NvcGUsIHZhbHVlKSB7XG4gICAgICAgICAgICAgIHZhciBTVEVOQ0lMX09QUyA9IGVudi5jb25zdGFudHMuc3RlbmNpbE9wc1xuXG4gICAgICAgICAgICAgIGNoZWNrJDEub3B0aW9uYWwoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGVudi5hc3NlcnQoc2NvcGUsXG4gICAgICAgICAgICAgICAgICB2YWx1ZSArICcmJnR5cGVvZiAnICsgdmFsdWUgKyAnPT09XCJvYmplY3RcIicsXG4gICAgICAgICAgICAgICAgICAnaW52YWxpZCAnICsgcHJvcClcbiAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICBmdW5jdGlvbiByZWFkIChuYW1lKSB7XG4gICAgICAgICAgICAgICAgY2hlY2skMS5vcHRpb25hbChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICBlbnYuYXNzZXJ0KHNjb3BlLFxuICAgICAgICAgICAgICAgICAgICAnIShcIicgKyBuYW1lICsgJ1wiIGluICcgKyB2YWx1ZSArICcpfHwnICtcbiAgICAgICAgICAgICAgICAgICAgJygnICsgdmFsdWUgKyAnLicgKyBuYW1lICsgJyBpbiAnICsgU1RFTkNJTF9PUFMgKyAnKScsXG4gICAgICAgICAgICAgICAgICAgICdpbnZhbGlkICcgKyBwcm9wICsgJy4nICsgbmFtZSArICcsIG11c3QgYmUgb25lIG9mICcgKyBPYmplY3Qua2V5cyhzdGVuY2lsT3BzKSlcbiAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHNjb3BlLmRlZihcbiAgICAgICAgICAgICAgICAgICdcIicsIG5hbWUsICdcIiBpbiAnLCB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICc/JywgU1RFTkNJTF9PUFMsICdbJywgdmFsdWUsICcuJywgbmFtZSwgJ106JyxcbiAgICAgICAgICAgICAgICAgIEdMX0tFRVApXG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgIHByb3AgPT09IFNfU1RFTkNJTF9PUEJBQ0sgPyBHTF9CQUNLIDogR0xfRlJPTlQsXG4gICAgICAgICAgICAgICAgcmVhZCgnZmFpbCcpLFxuICAgICAgICAgICAgICAgIHJlYWQoJ3pmYWlsJyksXG4gICAgICAgICAgICAgICAgcmVhZCgnenBhc3MnKVxuICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgIGNhc2UgU19QT0xZR09OX09GRlNFVF9PRkZTRVQ6XG4gICAgICAgICAgcmV0dXJuIHBhcnNlUGFyYW0oXG4gICAgICAgICAgICBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgY2hlY2skMS5jb21tYW5kVHlwZSh2YWx1ZSwgJ29iamVjdCcsIHBhcmFtLCBlbnYuY29tbWFuZFN0cilcbiAgICAgICAgICAgICAgdmFyIGZhY3RvciA9IHZhbHVlLmZhY3RvciB8IDBcbiAgICAgICAgICAgICAgdmFyIHVuaXRzID0gdmFsdWUudW5pdHMgfCAwXG4gICAgICAgICAgICAgIGNoZWNrJDEuY29tbWFuZFR5cGUoZmFjdG9yLCAnbnVtYmVyJywgcGFyYW0gKyAnLmZhY3RvcicsIGVudi5jb21tYW5kU3RyKVxuICAgICAgICAgICAgICBjaGVjayQxLmNvbW1hbmRUeXBlKHVuaXRzLCAnbnVtYmVyJywgcGFyYW0gKyAnLnVuaXRzJywgZW52LmNvbW1hbmRTdHIpXG4gICAgICAgICAgICAgIHJldHVybiBbZmFjdG9yLCB1bml0c11cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBmdW5jdGlvbiAoZW52LCBzY29wZSwgdmFsdWUpIHtcbiAgICAgICAgICAgICAgY2hlY2skMS5vcHRpb25hbChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgZW52LmFzc2VydChzY29wZSxcbiAgICAgICAgICAgICAgICAgIHZhbHVlICsgJyYmdHlwZW9mICcgKyB2YWx1ZSArICc9PT1cIm9iamVjdFwiJyxcbiAgICAgICAgICAgICAgICAgICdpbnZhbGlkICcgKyBwcm9wKVxuICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgIHZhciBGQUNUT1IgPSBzY29wZS5kZWYodmFsdWUsICcuZmFjdG9yfDAnKVxuICAgICAgICAgICAgICB2YXIgVU5JVFMgPSBzY29wZS5kZWYodmFsdWUsICcudW5pdHN8MCcpXG5cbiAgICAgICAgICAgICAgcmV0dXJuIFtGQUNUT1IsIFVOSVRTXVxuICAgICAgICAgICAgfSlcblxuICAgICAgICBjYXNlIFNfQ1VMTF9GQUNFOlxuICAgICAgICAgIHJldHVybiBwYXJzZVBhcmFtKFxuICAgICAgICAgICAgZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgIHZhciBmYWNlID0gMFxuICAgICAgICAgICAgICBpZiAodmFsdWUgPT09ICdmcm9udCcpIHtcbiAgICAgICAgICAgICAgICBmYWNlID0gR0xfRlJPTlRcbiAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gJ2JhY2snKSB7XG4gICAgICAgICAgICAgICAgZmFjZSA9IEdMX0JBQ0tcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjaGVjayQxLmNvbW1hbmQoISFmYWNlLCBwYXJhbSwgZW52LmNvbW1hbmRTdHIpXG4gICAgICAgICAgICAgIHJldHVybiBmYWNlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZnVuY3Rpb24gKGVudiwgc2NvcGUsIHZhbHVlKSB7XG4gICAgICAgICAgICAgIGNoZWNrJDEub3B0aW9uYWwoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGVudi5hc3NlcnQoc2NvcGUsXG4gICAgICAgICAgICAgICAgICB2YWx1ZSArICc9PT1cImZyb250XCJ8fCcgK1xuICAgICAgICAgICAgICAgICAgdmFsdWUgKyAnPT09XCJiYWNrXCInLFxuICAgICAgICAgICAgICAgICAgJ2ludmFsaWQgY3VsbC5mYWNlJylcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgcmV0dXJuIHNjb3BlLmRlZih2YWx1ZSwgJz09PVwiZnJvbnRcIj8nLCBHTF9GUk9OVCwgJzonLCBHTF9CQUNLKVxuICAgICAgICAgICAgfSlcblxuICAgICAgICBjYXNlIFNfTElORV9XSURUSDpcbiAgICAgICAgICByZXR1cm4gcGFyc2VQYXJhbShcbiAgICAgICAgICAgIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICBjaGVjayQxLmNvbW1hbmQoXG4gICAgICAgICAgICAgICAgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJlxuICAgICAgICAgICAgICAgIHZhbHVlID49IGxpbWl0cy5saW5lV2lkdGhEaW1zWzBdICYmXG4gICAgICAgICAgICAgICAgdmFsdWUgPD0gbGltaXRzLmxpbmVXaWR0aERpbXNbMV0sXG4gICAgICAgICAgICAgICAgJ2ludmFsaWQgbGluZSB3aWR0aCwgbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlciBiZXR3ZWVuICcgK1xuICAgICAgICAgICAgICAgIGxpbWl0cy5saW5lV2lkdGhEaW1zWzBdICsgJyBhbmQgJyArIGxpbWl0cy5saW5lV2lkdGhEaW1zWzFdLCBlbnYuY29tbWFuZFN0cilcbiAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZnVuY3Rpb24gKGVudiwgc2NvcGUsIHZhbHVlKSB7XG4gICAgICAgICAgICAgIGNoZWNrJDEub3B0aW9uYWwoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGVudi5hc3NlcnQoc2NvcGUsXG4gICAgICAgICAgICAgICAgICAndHlwZW9mICcgKyB2YWx1ZSArICc9PT1cIm51bWJlclwiJiYnICtcbiAgICAgICAgICAgICAgICAgIHZhbHVlICsgJz49JyArIGxpbWl0cy5saW5lV2lkdGhEaW1zWzBdICsgJyYmJyArXG4gICAgICAgICAgICAgICAgICB2YWx1ZSArICc8PScgKyBsaW1pdHMubGluZVdpZHRoRGltc1sxXSxcbiAgICAgICAgICAgICAgICAgICdpbnZhbGlkIGxpbmUgd2lkdGgnKVxuICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgIHJldHVybiB2YWx1ZVxuICAgICAgICAgICAgfSlcblxuICAgICAgICBjYXNlIFNfRlJPTlRfRkFDRTpcbiAgICAgICAgICByZXR1cm4gcGFyc2VQYXJhbShcbiAgICAgICAgICAgIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICBjaGVjayQxLmNvbW1hbmRQYXJhbWV0ZXIodmFsdWUsIG9yaWVudGF0aW9uVHlwZSwgcGFyYW0sIGVudi5jb21tYW5kU3RyKVxuICAgICAgICAgICAgICByZXR1cm4gb3JpZW50YXRpb25UeXBlW3ZhbHVlXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZ1bmN0aW9uIChlbnYsIHNjb3BlLCB2YWx1ZSkge1xuICAgICAgICAgICAgICBjaGVjayQxLm9wdGlvbmFsKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBlbnYuYXNzZXJ0KHNjb3BlLFxuICAgICAgICAgICAgICAgICAgdmFsdWUgKyAnPT09XCJjd1wifHwnICtcbiAgICAgICAgICAgICAgICAgIHZhbHVlICsgJz09PVwiY2N3XCInLFxuICAgICAgICAgICAgICAgICAgJ2ludmFsaWQgZnJvbnRGYWNlLCBtdXN0IGJlIG9uZSBvZiBjdyxjY3cnKVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICByZXR1cm4gc2NvcGUuZGVmKHZhbHVlICsgJz09PVwiY3dcIj8nICsgR0xfQ1cgKyAnOicgKyBHTF9DQ1cpXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgIGNhc2UgU19DT0xPUl9NQVNLOlxuICAgICAgICAgIHJldHVybiBwYXJzZVBhcmFtKFxuICAgICAgICAgICAgZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgIGNoZWNrJDEuY29tbWFuZChcbiAgICAgICAgICAgICAgICBpc0FycmF5TGlrZSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID09PSA0LFxuICAgICAgICAgICAgICAgICdjb2xvci5tYXNrIG11c3QgYmUgbGVuZ3RoIDQgYXJyYXknLCBlbnYuY29tbWFuZFN0cilcbiAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLm1hcChmdW5jdGlvbiAodikgeyByZXR1cm4gISF2IH0pXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZnVuY3Rpb24gKGVudiwgc2NvcGUsIHZhbHVlKSB7XG4gICAgICAgICAgICAgIGNoZWNrJDEub3B0aW9uYWwoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGVudi5hc3NlcnQoc2NvcGUsXG4gICAgICAgICAgICAgICAgICBlbnYuc2hhcmVkLmlzQXJyYXlMaWtlICsgJygnICsgdmFsdWUgKyAnKSYmJyArXG4gICAgICAgICAgICAgICAgICB2YWx1ZSArICcubGVuZ3RoPT09NCcsXG4gICAgICAgICAgICAgICAgICAnaW52YWxpZCBjb2xvci5tYXNrJylcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgcmV0dXJuIGxvb3AoNCwgZnVuY3Rpb24gKGkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJyEhJyArIHZhbHVlICsgJ1snICsgaSArICddJ1xuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSlcblxuICAgICAgICBjYXNlIFNfU0FNUExFX0NPVkVSQUdFOlxuICAgICAgICAgIHJldHVybiBwYXJzZVBhcmFtKFxuICAgICAgICAgICAgZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgIGNoZWNrJDEuY29tbWFuZCh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlLCBwYXJhbSwgZW52LmNvbW1hbmRTdHIpXG4gICAgICAgICAgICAgIHZhciBzYW1wbGVWYWx1ZSA9ICd2YWx1ZScgaW4gdmFsdWUgPyB2YWx1ZS52YWx1ZSA6IDFcbiAgICAgICAgICAgICAgdmFyIHNhbXBsZUludmVydCA9ICEhdmFsdWUuaW52ZXJ0XG4gICAgICAgICAgICAgIGNoZWNrJDEuY29tbWFuZChcbiAgICAgICAgICAgICAgICB0eXBlb2Ygc2FtcGxlVmFsdWUgPT09ICdudW1iZXInICYmXG4gICAgICAgICAgICAgICAgc2FtcGxlVmFsdWUgPj0gMCAmJiBzYW1wbGVWYWx1ZSA8PSAxLFxuICAgICAgICAgICAgICAgICdzYW1wbGUuY292ZXJhZ2UudmFsdWUgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDEnLCBlbnYuY29tbWFuZFN0cilcbiAgICAgICAgICAgICAgcmV0dXJuIFtzYW1wbGVWYWx1ZSwgc2FtcGxlSW52ZXJ0XVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZ1bmN0aW9uIChlbnYsIHNjb3BlLCB2YWx1ZSkge1xuICAgICAgICAgICAgICBjaGVjayQxLm9wdGlvbmFsKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBlbnYuYXNzZXJ0KHNjb3BlLFxuICAgICAgICAgICAgICAgICAgdmFsdWUgKyAnJiZ0eXBlb2YgJyArIHZhbHVlICsgJz09PVwib2JqZWN0XCInLFxuICAgICAgICAgICAgICAgICAgJ2ludmFsaWQgc2FtcGxlLmNvdmVyYWdlJylcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgdmFyIFZBTFVFID0gc2NvcGUuZGVmKFxuICAgICAgICAgICAgICAgICdcInZhbHVlXCIgaW4gJywgdmFsdWUsICc/KycsIHZhbHVlLCAnLnZhbHVlOjEnKVxuICAgICAgICAgICAgICB2YXIgSU5WRVJUID0gc2NvcGUuZGVmKCchIScsIHZhbHVlLCAnLmludmVydCcpXG4gICAgICAgICAgICAgIHJldHVybiBbVkFMVUUsIElOVkVSVF1cbiAgICAgICAgICAgIH0pXG4gICAgICB9XG4gICAgfSlcblxuICAgIHJldHVybiBTVEFURVxuICB9XG5cbiAgZnVuY3Rpb24gcGFyc2VVbmlmb3JtcyAodW5pZm9ybXMsIGVudikge1xuICAgIHZhciBzdGF0aWNVbmlmb3JtcyA9IHVuaWZvcm1zLnN0YXRpY1xuICAgIHZhciBkeW5hbWljVW5pZm9ybXMgPSB1bmlmb3Jtcy5keW5hbWljXG5cbiAgICB2YXIgVU5JRk9STVMgPSB7fVxuXG4gICAgT2JqZWN0LmtleXMoc3RhdGljVW5pZm9ybXMpLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgIHZhciB2YWx1ZSA9IHN0YXRpY1VuaWZvcm1zW25hbWVdXG4gICAgICB2YXIgcmVzdWx0XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyB8fFxuICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHJlc3VsdCA9IGNyZWF0ZVN0YXRpY0RlY2woZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiB2YWx1ZVxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdmFyIHJlZ2xUeXBlID0gdmFsdWUuX3JlZ2xUeXBlXG4gICAgICAgIGlmIChyZWdsVHlwZSA9PT0gJ3RleHR1cmUyZCcgfHxcbiAgICAgICAgICAgIHJlZ2xUeXBlID09PSAndGV4dHVyZUN1YmUnKSB7XG4gICAgICAgICAgcmVzdWx0ID0gY3JlYXRlU3RhdGljRGVjbChmdW5jdGlvbiAoZW52KSB7XG4gICAgICAgICAgICByZXR1cm4gZW52LmxpbmsodmFsdWUpXG4gICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIGlmIChyZWdsVHlwZSA9PT0gJ2ZyYW1lYnVmZmVyJyB8fFxuICAgICAgICAgICAgICAgICAgIHJlZ2xUeXBlID09PSAnZnJhbWVidWZmZXJDdWJlJykge1xuICAgICAgICAgIGNoZWNrJDEuY29tbWFuZCh2YWx1ZS5jb2xvci5sZW5ndGggPiAwLFxuICAgICAgICAgICAgJ21pc3NpbmcgY29sb3IgYXR0YWNobWVudCBmb3IgZnJhbWVidWZmZXIgc2VudCB0byB1bmlmb3JtIFwiJyArIG5hbWUgKyAnXCInLCBlbnYuY29tbWFuZFN0cilcbiAgICAgICAgICByZXN1bHQgPSBjcmVhdGVTdGF0aWNEZWNsKGZ1bmN0aW9uIChlbnYpIHtcbiAgICAgICAgICAgIHJldHVybiBlbnYubGluayh2YWx1ZS5jb2xvclswXSlcbiAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNoZWNrJDEuY29tbWFuZFJhaXNlKCdpbnZhbGlkIGRhdGEgZm9yIHVuaWZvcm0gXCInICsgbmFtZSArICdcIicsIGVudi5jb21tYW5kU3RyKVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGlzQXJyYXlMaWtlKHZhbHVlKSkge1xuICAgICAgICByZXN1bHQgPSBjcmVhdGVTdGF0aWNEZWNsKGZ1bmN0aW9uIChlbnYpIHtcbiAgICAgICAgICB2YXIgSVRFTSA9IGVudi5nbG9iYWwuZGVmKCdbJyxcbiAgICAgICAgICAgIGxvb3AodmFsdWUubGVuZ3RoLCBmdW5jdGlvbiAoaSkge1xuICAgICAgICAgICAgICBjaGVjayQxLmNvbW1hbmQoXG4gICAgICAgICAgICAgICAgdHlwZW9mIHZhbHVlW2ldID09PSAnbnVtYmVyJyB8fFxuICAgICAgICAgICAgICAgIHR5cGVvZiB2YWx1ZVtpXSA9PT0gJ2Jvb2xlYW4nLFxuICAgICAgICAgICAgICAgICdpbnZhbGlkIHVuaWZvcm0gJyArIG5hbWUsIGVudi5jb21tYW5kU3RyKVxuICAgICAgICAgICAgICByZXR1cm4gdmFsdWVbaV1cbiAgICAgICAgICAgIH0pLCAnXScpXG4gICAgICAgICAgcmV0dXJuIElURU1cbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNoZWNrJDEuY29tbWFuZFJhaXNlKCdpbnZhbGlkIG9yIG1pc3NpbmcgZGF0YSBmb3IgdW5pZm9ybSBcIicgKyBuYW1lICsgJ1wiJywgZW52LmNvbW1hbmRTdHIpXG4gICAgICB9XG4gICAgICByZXN1bHQudmFsdWUgPSB2YWx1ZVxuICAgICAgVU5JRk9STVNbbmFtZV0gPSByZXN1bHRcbiAgICB9KVxuXG4gICAgT2JqZWN0LmtleXMoZHluYW1pY1VuaWZvcm1zKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIHZhciBkeW4gPSBkeW5hbWljVW5pZm9ybXNba2V5XVxuICAgICAgVU5JRk9STVNba2V5XSA9IGNyZWF0ZUR5bmFtaWNEZWNsKGR5biwgZnVuY3Rpb24gKGVudiwgc2NvcGUpIHtcbiAgICAgICAgcmV0dXJuIGVudi5pbnZva2Uoc2NvcGUsIGR5bilcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIHJldHVybiBVTklGT1JNU1xuICB9XG5cbiAgZnVuY3Rpb24gcGFyc2VBdHRyaWJ1dGVzIChhdHRyaWJ1dGVzLCBlbnYpIHtcbiAgICB2YXIgc3RhdGljQXR0cmlidXRlcyA9IGF0dHJpYnV0ZXMuc3RhdGljXG4gICAgdmFyIGR5bmFtaWNBdHRyaWJ1dGVzID0gYXR0cmlidXRlcy5keW5hbWljXG5cbiAgICB2YXIgYXR0cmlidXRlRGVmcyA9IHt9XG5cbiAgICBPYmplY3Qua2V5cyhzdGF0aWNBdHRyaWJ1dGVzKS5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyaWJ1dGUpIHtcbiAgICAgIHZhciB2YWx1ZSA9IHN0YXRpY0F0dHJpYnV0ZXNbYXR0cmlidXRlXVxuICAgICAgdmFyIGlkID0gc3RyaW5nU3RvcmUuaWQoYXR0cmlidXRlKVxuXG4gICAgICB2YXIgcmVjb3JkID0gbmV3IEF0dHJpYnV0ZVJlY29yZCgpXG4gICAgICBpZiAoaXNCdWZmZXJBcmdzKHZhbHVlKSkge1xuICAgICAgICByZWNvcmQuc3RhdGUgPSBBVFRSSUJfU1RBVEVfUE9JTlRFUlxuICAgICAgICByZWNvcmQuYnVmZmVyID0gYnVmZmVyU3RhdGUuZ2V0QnVmZmVyKFxuICAgICAgICAgIGJ1ZmZlclN0YXRlLmNyZWF0ZSh2YWx1ZSwgR0xfQVJSQVlfQlVGRkVSJDIsIGZhbHNlLCB0cnVlKSlcbiAgICAgICAgcmVjb3JkLnR5cGUgPSAwXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgYnVmZmVyID0gYnVmZmVyU3RhdGUuZ2V0QnVmZmVyKHZhbHVlKVxuICAgICAgICBpZiAoYnVmZmVyKSB7XG4gICAgICAgICAgcmVjb3JkLnN0YXRlID0gQVRUUklCX1NUQVRFX1BPSU5URVJcbiAgICAgICAgICByZWNvcmQuYnVmZmVyID0gYnVmZmVyXG4gICAgICAgICAgcmVjb3JkLnR5cGUgPSAwXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2hlY2skMS5jb21tYW5kKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUsXG4gICAgICAgICAgICAnaW52YWxpZCBkYXRhIGZvciBhdHRyaWJ1dGUgJyArIGF0dHJpYnV0ZSwgZW52LmNvbW1hbmRTdHIpXG4gICAgICAgICAgaWYgKCdjb25zdGFudCcgaW4gdmFsdWUpIHtcbiAgICAgICAgICAgIHZhciBjb25zdGFudCA9IHZhbHVlLmNvbnN0YW50XG4gICAgICAgICAgICByZWNvcmQuYnVmZmVyID0gJ251bGwnXG4gICAgICAgICAgICByZWNvcmQuc3RhdGUgPSBBVFRSSUJfU1RBVEVfQ09OU1RBTlRcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY29uc3RhbnQgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgIHJlY29yZC54ID0gY29uc3RhbnRcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNoZWNrJDEuY29tbWFuZChcbiAgICAgICAgICAgICAgICBpc0FycmF5TGlrZShjb25zdGFudCkgJiZcbiAgICAgICAgICAgICAgICBjb25zdGFudC5sZW5ndGggPiAwICYmXG4gICAgICAgICAgICAgICAgY29uc3RhbnQubGVuZ3RoIDw9IDQsXG4gICAgICAgICAgICAgICAgJ2ludmFsaWQgY29uc3RhbnQgZm9yIGF0dHJpYnV0ZSAnICsgYXR0cmlidXRlLCBlbnYuY29tbWFuZFN0cilcbiAgICAgICAgICAgICAgQ1VURV9DT01QT05FTlRTLmZvckVhY2goZnVuY3Rpb24gKGMsIGkpIHtcbiAgICAgICAgICAgICAgICBpZiAoaSA8IGNvbnN0YW50Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgcmVjb3JkW2NdID0gY29uc3RhbnRbaV1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChpc0J1ZmZlckFyZ3ModmFsdWUuYnVmZmVyKSkge1xuICAgICAgICAgICAgICBidWZmZXIgPSBidWZmZXJTdGF0ZS5nZXRCdWZmZXIoXG4gICAgICAgICAgICAgICAgYnVmZmVyU3RhdGUuY3JlYXRlKHZhbHVlLmJ1ZmZlciwgR0xfQVJSQVlfQlVGRkVSJDIsIGZhbHNlLCB0cnVlKSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGJ1ZmZlciA9IGJ1ZmZlclN0YXRlLmdldEJ1ZmZlcih2YWx1ZS5idWZmZXIpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjaGVjayQxLmNvbW1hbmQoISFidWZmZXIsICdtaXNzaW5nIGJ1ZmZlciBmb3IgYXR0cmlidXRlIFwiJyArIGF0dHJpYnV0ZSArICdcIicsIGVudi5jb21tYW5kU3RyKVxuXG4gICAgICAgICAgICB2YXIgb2Zmc2V0ID0gdmFsdWUub2Zmc2V0IHwgMFxuICAgICAgICAgICAgY2hlY2skMS5jb21tYW5kKG9mZnNldCA+PSAwLFxuICAgICAgICAgICAgICAnaW52YWxpZCBvZmZzZXQgZm9yIGF0dHJpYnV0ZSBcIicgKyBhdHRyaWJ1dGUgKyAnXCInLCBlbnYuY29tbWFuZFN0cilcblxuICAgICAgICAgICAgdmFyIHN0cmlkZSA9IHZhbHVlLnN0cmlkZSB8IDBcbiAgICAgICAgICAgIGNoZWNrJDEuY29tbWFuZChzdHJpZGUgPj0gMCAmJiBzdHJpZGUgPCAyNTYsXG4gICAgICAgICAgICAgICdpbnZhbGlkIHN0cmlkZSBmb3IgYXR0cmlidXRlIFwiJyArIGF0dHJpYnV0ZSArICdcIiwgbXVzdCBiZSBpbnRlZ2VyIGJldHdlZWVuIFswLCAyNTVdJywgZW52LmNvbW1hbmRTdHIpXG5cbiAgICAgICAgICAgIHZhciBzaXplID0gdmFsdWUuc2l6ZSB8IDBcbiAgICAgICAgICAgIGNoZWNrJDEuY29tbWFuZCghKCdzaXplJyBpbiB2YWx1ZSkgfHwgKHNpemUgPiAwICYmIHNpemUgPD0gNCksXG4gICAgICAgICAgICAgICdpbnZhbGlkIHNpemUgZm9yIGF0dHJpYnV0ZSBcIicgKyBhdHRyaWJ1dGUgKyAnXCIsIG11c3QgYmUgMSwyLDMsNCcsIGVudi5jb21tYW5kU3RyKVxuXG4gICAgICAgICAgICB2YXIgbm9ybWFsaXplZCA9ICEhdmFsdWUubm9ybWFsaXplZFxuXG4gICAgICAgICAgICB2YXIgdHlwZSA9IDBcbiAgICAgICAgICAgIGlmICgndHlwZScgaW4gdmFsdWUpIHtcbiAgICAgICAgICAgICAgY2hlY2skMS5jb21tYW5kUGFyYW1ldGVyKFxuICAgICAgICAgICAgICAgIHZhbHVlLnR5cGUsIGdsVHlwZXMsXG4gICAgICAgICAgICAgICAgJ2ludmFsaWQgdHlwZSBmb3IgYXR0cmlidXRlICcgKyBhdHRyaWJ1dGUsIGVudi5jb21tYW5kU3RyKVxuICAgICAgICAgICAgICB0eXBlID0gZ2xUeXBlc1t2YWx1ZS50eXBlXVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgZGl2aXNvciA9IHZhbHVlLmRpdmlzb3IgfCAwXG4gICAgICAgICAgICBpZiAoJ2Rpdmlzb3InIGluIHZhbHVlKSB7XG4gICAgICAgICAgICAgIGNoZWNrJDEuY29tbWFuZChkaXZpc29yID09PSAwIHx8IGV4dEluc3RhbmNpbmcsXG4gICAgICAgICAgICAgICAgJ2Nhbm5vdCBzcGVjaWZ5IGRpdmlzb3IgZm9yIGF0dHJpYnV0ZSBcIicgKyBhdHRyaWJ1dGUgKyAnXCIsIGluc3RhbmNpbmcgbm90IHN1cHBvcnRlZCcsIGVudi5jb21tYW5kU3RyKVxuICAgICAgICAgICAgICBjaGVjayQxLmNvbW1hbmQoZGl2aXNvciA+PSAwLFxuICAgICAgICAgICAgICAgICdpbnZhbGlkIGRpdmlzb3IgZm9yIGF0dHJpYnV0ZSBcIicgKyBhdHRyaWJ1dGUgKyAnXCInLCBlbnYuY29tbWFuZFN0cilcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2hlY2skMS5vcHRpb25hbChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIHZhciBjb21tYW5kID0gZW52LmNvbW1hbmRTdHJcblxuICAgICAgICAgICAgICB2YXIgVkFMSURfS0VZUyA9IFtcbiAgICAgICAgICAgICAgICAnYnVmZmVyJyxcbiAgICAgICAgICAgICAgICAnb2Zmc2V0JyxcbiAgICAgICAgICAgICAgICAnZGl2aXNvcicsXG4gICAgICAgICAgICAgICAgJ25vcm1hbGl6ZWQnLFxuICAgICAgICAgICAgICAgICd0eXBlJyxcbiAgICAgICAgICAgICAgICAnc2l6ZScsXG4gICAgICAgICAgICAgICAgJ3N0cmlkZSdcbiAgICAgICAgICAgICAgXVxuXG4gICAgICAgICAgICAgIE9iamVjdC5rZXlzKHZhbHVlKS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgICAgICAgICAgICAgY2hlY2skMS5jb21tYW5kKFxuICAgICAgICAgICAgICAgICAgVkFMSURfS0VZUy5pbmRleE9mKHByb3ApID49IDAsXG4gICAgICAgICAgICAgICAgICAndW5rbm93biBwYXJhbWV0ZXIgXCInICsgcHJvcCArICdcIiBmb3IgYXR0cmlidXRlIHBvaW50ZXIgXCInICsgYXR0cmlidXRlICsgJ1wiICh2YWxpZCBwYXJhbWV0ZXJzIGFyZSAnICsgVkFMSURfS0VZUyArICcpJyxcbiAgICAgICAgICAgICAgICAgIGNvbW1hbmQpXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICByZWNvcmQuYnVmZmVyID0gYnVmZmVyXG4gICAgICAgICAgICByZWNvcmQuc3RhdGUgPSBBVFRSSUJfU1RBVEVfUE9JTlRFUlxuICAgICAgICAgICAgcmVjb3JkLnNpemUgPSBzaXplXG4gICAgICAgICAgICByZWNvcmQubm9ybWFsaXplZCA9IG5vcm1hbGl6ZWRcbiAgICAgICAgICAgIHJlY29yZC50eXBlID0gdHlwZSB8fCBidWZmZXIuZHR5cGVcbiAgICAgICAgICAgIHJlY29yZC5vZmZzZXQgPSBvZmZzZXRcbiAgICAgICAgICAgIHJlY29yZC5zdHJpZGUgPSBzdHJpZGVcbiAgICAgICAgICAgIHJlY29yZC5kaXZpc29yID0gZGl2aXNvclxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhdHRyaWJ1dGVEZWZzW2F0dHJpYnV0ZV0gPSBjcmVhdGVTdGF0aWNEZWNsKGZ1bmN0aW9uIChlbnYsIHNjb3BlKSB7XG4gICAgICAgIHZhciBjYWNoZSA9IGVudi5hdHRyaWJDYWNoZVxuICAgICAgICBpZiAoaWQgaW4gY2FjaGUpIHtcbiAgICAgICAgICByZXR1cm4gY2FjaGVbaWRdXG4gICAgICAgIH1cbiAgICAgICAgdmFyIHJlc3VsdCA9IHtcbiAgICAgICAgICBpc1N0cmVhbTogZmFsc2VcbiAgICAgICAgfVxuICAgICAgICBPYmplY3Qua2V5cyhyZWNvcmQpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgIHJlc3VsdFtrZXldID0gcmVjb3JkW2tleV1cbiAgICAgICAgfSlcbiAgICAgICAgaWYgKHJlY29yZC5idWZmZXIpIHtcbiAgICAgICAgICByZXN1bHQuYnVmZmVyID0gZW52LmxpbmsocmVjb3JkLmJ1ZmZlcilcbiAgICAgICAgICByZXN1bHQudHlwZSA9IHJlc3VsdC50eXBlIHx8IChyZXN1bHQuYnVmZmVyICsgJy5kdHlwZScpXG4gICAgICAgIH1cbiAgICAgICAgY2FjaGVbaWRdID0gcmVzdWx0XG4gICAgICAgIHJldHVybiByZXN1bHRcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIE9iamVjdC5rZXlzKGR5bmFtaWNBdHRyaWJ1dGVzKS5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyaWJ1dGUpIHtcbiAgICAgIHZhciBkeW4gPSBkeW5hbWljQXR0cmlidXRlc1thdHRyaWJ1dGVdXG5cbiAgICAgIGZ1bmN0aW9uIGFwcGVuZEF0dHJpYnV0ZUNvZGUgKGVudiwgYmxvY2spIHtcbiAgICAgICAgdmFyIFZBTFVFID0gZW52Lmludm9rZShibG9jaywgZHluKVxuXG4gICAgICAgIHZhciBzaGFyZWQgPSBlbnYuc2hhcmVkXG4gICAgICAgIHZhciBjb25zdGFudHMgPSBlbnYuY29uc3RhbnRzXG5cbiAgICAgICAgdmFyIElTX0JVRkZFUl9BUkdTID0gc2hhcmVkLmlzQnVmZmVyQXJnc1xuICAgICAgICB2YXIgQlVGRkVSX1NUQVRFID0gc2hhcmVkLmJ1ZmZlclxuXG4gICAgICAgIC8vIFBlcmZvcm0gdmFsaWRhdGlvbiBvbiBhdHRyaWJ1dGVcbiAgICAgICAgY2hlY2skMS5vcHRpb25hbChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgZW52LmFzc2VydChibG9jayxcbiAgICAgICAgICAgIFZBTFVFICsgJyYmKHR5cGVvZiAnICsgVkFMVUUgKyAnPT09XCJvYmplY3RcInx8dHlwZW9mICcgK1xuICAgICAgICAgICAgVkFMVUUgKyAnPT09XCJmdW5jdGlvblwiKSYmKCcgK1xuICAgICAgICAgICAgSVNfQlVGRkVSX0FSR1MgKyAnKCcgKyBWQUxVRSArICcpfHwnICtcbiAgICAgICAgICAgIEJVRkZFUl9TVEFURSArICcuZ2V0QnVmZmVyKCcgKyBWQUxVRSArICcpfHwnICtcbiAgICAgICAgICAgIEJVRkZFUl9TVEFURSArICcuZ2V0QnVmZmVyKCcgKyBWQUxVRSArICcuYnVmZmVyKXx8JyArXG4gICAgICAgICAgICBJU19CVUZGRVJfQVJHUyArICcoJyArIFZBTFVFICsgJy5idWZmZXIpfHwnICtcbiAgICAgICAgICAgICcoXCJjb25zdGFudFwiIGluICcgKyBWQUxVRSArXG4gICAgICAgICAgICAnJiYodHlwZW9mICcgKyBWQUxVRSArICcuY29uc3RhbnQ9PT1cIm51bWJlclwifHwnICtcbiAgICAgICAgICAgIHNoYXJlZC5pc0FycmF5TGlrZSArICcoJyArIFZBTFVFICsgJy5jb25zdGFudCkpKSknLFxuICAgICAgICAgICAgJ2ludmFsaWQgZHluYW1pYyBhdHRyaWJ1dGUgXCInICsgYXR0cmlidXRlICsgJ1wiJylcbiAgICAgICAgfSlcblxuICAgICAgICAvLyBhbGxvY2F0ZSBuYW1lcyBmb3IgcmVzdWx0XG4gICAgICAgIHZhciByZXN1bHQgPSB7XG4gICAgICAgICAgaXNTdHJlYW06IGJsb2NrLmRlZihmYWxzZSlcbiAgICAgICAgfVxuICAgICAgICB2YXIgZGVmYXVsdFJlY29yZCA9IG5ldyBBdHRyaWJ1dGVSZWNvcmQoKVxuICAgICAgICBkZWZhdWx0UmVjb3JkLnN0YXRlID0gQVRUUklCX1NUQVRFX1BPSU5URVJcbiAgICAgICAgT2JqZWN0LmtleXMoZGVmYXVsdFJlY29yZCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgcmVzdWx0W2tleV0gPSBibG9jay5kZWYoJycgKyBkZWZhdWx0UmVjb3JkW2tleV0pXG4gICAgICAgIH0pXG5cbiAgICAgICAgdmFyIEJVRkZFUiA9IHJlc3VsdC5idWZmZXJcbiAgICAgICAgdmFyIFRZUEUgPSByZXN1bHQudHlwZVxuICAgICAgICBibG9jayhcbiAgICAgICAgICAnaWYoJywgSVNfQlVGRkVSX0FSR1MsICcoJywgVkFMVUUsICcpKXsnLFxuICAgICAgICAgIHJlc3VsdC5pc1N0cmVhbSwgJz10cnVlOycsXG4gICAgICAgICAgQlVGRkVSLCAnPScsIEJVRkZFUl9TVEFURSwgJy5jcmVhdGVTdHJlYW0oJywgR0xfQVJSQVlfQlVGRkVSJDIsICcsJywgVkFMVUUsICcpOycsXG4gICAgICAgICAgVFlQRSwgJz0nLCBCVUZGRVIsICcuZHR5cGU7JyxcbiAgICAgICAgICAnfWVsc2V7JyxcbiAgICAgICAgICBCVUZGRVIsICc9JywgQlVGRkVSX1NUQVRFLCAnLmdldEJ1ZmZlcignLCBWQUxVRSwgJyk7JyxcbiAgICAgICAgICAnaWYoJywgQlVGRkVSLCAnKXsnLFxuICAgICAgICAgIFRZUEUsICc9JywgQlVGRkVSLCAnLmR0eXBlOycsXG4gICAgICAgICAgJ31lbHNlIGlmKFwiY29uc3RhbnRcIiBpbiAnLCBWQUxVRSwgJyl7JyxcbiAgICAgICAgICByZXN1bHQuc3RhdGUsICc9JywgQVRUUklCX1NUQVRFX0NPTlNUQU5ULCAnOycsXG4gICAgICAgICAgJ2lmKHR5cGVvZiAnICsgVkFMVUUgKyAnLmNvbnN0YW50ID09PSBcIm51bWJlclwiKXsnLFxuICAgICAgICAgIHJlc3VsdFtDVVRFX0NPTVBPTkVOVFNbMF1dLCAnPScsIFZBTFVFLCAnLmNvbnN0YW50OycsXG4gICAgICAgICAgQ1VURV9DT01QT05FTlRTLnNsaWNlKDEpLm1hcChmdW5jdGlvbiAobikge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdFtuXVxuICAgICAgICAgIH0pLmpvaW4oJz0nKSwgJz0wOycsXG4gICAgICAgICAgJ31lbHNleycsXG4gICAgICAgICAgQ1VURV9DT01QT05FTlRTLm1hcChmdW5jdGlvbiAobmFtZSwgaSkge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgcmVzdWx0W25hbWVdICsgJz0nICsgVkFMVUUgKyAnLmNvbnN0YW50Lmxlbmd0aD4nICsgaSArXG4gICAgICAgICAgICAgICc/JyArIFZBTFVFICsgJy5jb25zdGFudFsnICsgaSArICddOjA7J1xuICAgICAgICAgICAgKVxuICAgICAgICAgIH0pLmpvaW4oJycpLFxuICAgICAgICAgICd9fWVsc2V7JyxcbiAgICAgICAgICAnaWYoJywgSVNfQlVGRkVSX0FSR1MsICcoJywgVkFMVUUsICcuYnVmZmVyKSl7JyxcbiAgICAgICAgICBCVUZGRVIsICc9JywgQlVGRkVSX1NUQVRFLCAnLmNyZWF0ZVN0cmVhbSgnLCBHTF9BUlJBWV9CVUZGRVIkMiwgJywnLCBWQUxVRSwgJy5idWZmZXIpOycsXG4gICAgICAgICAgJ31lbHNleycsXG4gICAgICAgICAgQlVGRkVSLCAnPScsIEJVRkZFUl9TVEFURSwgJy5nZXRCdWZmZXIoJywgVkFMVUUsICcuYnVmZmVyKTsnLFxuICAgICAgICAgICd9JyxcbiAgICAgICAgICBUWVBFLCAnPVwidHlwZVwiIGluICcsIFZBTFVFLCAnPycsXG4gICAgICAgICAgY29uc3RhbnRzLmdsVHlwZXMsICdbJywgVkFMVUUsICcudHlwZV06JywgQlVGRkVSLCAnLmR0eXBlOycsXG4gICAgICAgICAgcmVzdWx0Lm5vcm1hbGl6ZWQsICc9ISEnLCBWQUxVRSwgJy5ub3JtYWxpemVkOycpXG4gICAgICAgIGZ1bmN0aW9uIGVtaXRSZWFkUmVjb3JkIChuYW1lKSB7XG4gICAgICAgICAgYmxvY2socmVzdWx0W25hbWVdLCAnPScsIFZBTFVFLCAnLicsIG5hbWUsICd8MDsnKVxuICAgICAgICB9XG4gICAgICAgIGVtaXRSZWFkUmVjb3JkKCdzaXplJylcbiAgICAgICAgZW1pdFJlYWRSZWNvcmQoJ29mZnNldCcpXG4gICAgICAgIGVtaXRSZWFkUmVjb3JkKCdzdHJpZGUnKVxuICAgICAgICBlbWl0UmVhZFJlY29yZCgnZGl2aXNvcicpXG5cbiAgICAgICAgYmxvY2soJ319JylcblxuICAgICAgICBibG9jay5leGl0KFxuICAgICAgICAgICdpZignLCByZXN1bHQuaXNTdHJlYW0sICcpeycsXG4gICAgICAgICAgQlVGRkVSX1NUQVRFLCAnLmRlc3Ryb3lTdHJlYW0oJywgQlVGRkVSLCAnKTsnLFxuICAgICAgICAgICd9JylcblxuICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgICB9XG5cbiAgICAgIGF0dHJpYnV0ZURlZnNbYXR0cmlidXRlXSA9IGNyZWF0ZUR5bmFtaWNEZWNsKGR5biwgYXBwZW5kQXR0cmlidXRlQ29kZSlcbiAgICB9KVxuXG4gICAgcmV0dXJuIGF0dHJpYnV0ZURlZnNcbiAgfVxuXG4gIGZ1bmN0aW9uIHBhcnNlVkFPIChvcHRpb25zLCBlbnYpIHtcbiAgICB2YXIgc3RhdGljT3B0aW9ucyA9IG9wdGlvbnMuc3RhdGljXG4gICAgdmFyIGR5bmFtaWNPcHRpb25zID0gb3B0aW9ucy5keW5hbWljXG4gICAgaWYgKFNfVkFPIGluIHN0YXRpY09wdGlvbnMpIHtcbiAgICAgIHZhciB2YW8gPSBzdGF0aWNPcHRpb25zW1NfVkFPXVxuICAgICAgaWYgKHZhbyAhPT0gbnVsbCAmJiBhdHRyaWJ1dGVTdGF0ZS5nZXRWQU8odmFvKSA9PT0gbnVsbCkge1xuICAgICAgICB2YW8gPSBhdHRyaWJ1dGVTdGF0ZS5jcmVhdGVWQU8odmFvKVxuICAgICAgfVxuICAgICAgcmV0dXJuIGNyZWF0ZVN0YXRpY0RlY2woZnVuY3Rpb24gKGVudikge1xuICAgICAgICByZXR1cm4gZW52LmxpbmsoYXR0cmlidXRlU3RhdGUuZ2V0VkFPKHZhbykpXG4gICAgICB9KVxuICAgIH0gZWxzZSBpZiAoU19WQU8gaW4gZHluYW1pY09wdGlvbnMpIHtcbiAgICAgIHZhciBkeW4gPSBkeW5hbWljT3B0aW9uc1tTX1ZBT11cbiAgICAgIHJldHVybiBjcmVhdGVEeW5hbWljRGVjbChkeW4sIGZ1bmN0aW9uIChlbnYsIHNjb3BlKSB7XG4gICAgICAgIHZhciB2YW9SZWYgPSBlbnYuaW52b2tlKHNjb3BlLCBkeW4pXG4gICAgICAgIHJldHVybiBzY29wZS5kZWYoZW52LnNoYXJlZC52YW8gKyAnLmdldFZBTygnICsgdmFvUmVmICsgJyknKVxuICAgICAgfSlcbiAgICB9XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIGZ1bmN0aW9uIHBhcnNlQ29udGV4dCAoY29udGV4dCkge1xuICAgIHZhciBzdGF0aWNDb250ZXh0ID0gY29udGV4dC5zdGF0aWNcbiAgICB2YXIgZHluYW1pY0NvbnRleHQgPSBjb250ZXh0LmR5bmFtaWNcbiAgICB2YXIgcmVzdWx0ID0ge31cblxuICAgIE9iamVjdC5rZXlzKHN0YXRpY0NvbnRleHQpLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgIHZhciB2YWx1ZSA9IHN0YXRpY0NvbnRleHRbbmFtZV1cbiAgICAgIHJlc3VsdFtuYW1lXSA9IGNyZWF0ZVN0YXRpY0RlY2woZnVuY3Rpb24gKGVudiwgc2NvcGUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgfHwgdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICByZXR1cm4gJycgKyB2YWx1ZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBlbnYubGluayh2YWx1ZSlcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9KVxuXG4gICAgT2JqZWN0LmtleXMoZHluYW1pY0NvbnRleHQpLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgIHZhciBkeW4gPSBkeW5hbWljQ29udGV4dFtuYW1lXVxuICAgICAgcmVzdWx0W25hbWVdID0gY3JlYXRlRHluYW1pY0RlY2woZHluLCBmdW5jdGlvbiAoZW52LCBzY29wZSkge1xuICAgICAgICByZXR1cm4gZW52Lmludm9rZShzY29wZSwgZHluKVxuICAgICAgfSlcbiAgICB9KVxuXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgZnVuY3Rpb24gcGFyc2VBcmd1bWVudHMgKG9wdGlvbnMsIGF0dHJpYnV0ZXMsIHVuaWZvcm1zLCBjb250ZXh0LCBlbnYpIHtcbiAgICB2YXIgc3RhdGljT3B0aW9ucyA9IG9wdGlvbnMuc3RhdGljXG4gICAgdmFyIGR5bmFtaWNPcHRpb25zID0gb3B0aW9ucy5keW5hbWljXG5cbiAgICBjaGVjayQxLm9wdGlvbmFsKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBLRVlfTkFNRVMgPSBbXG4gICAgICAgIFNfRlJBTUVCVUZGRVIsXG4gICAgICAgIFNfVkVSVCxcbiAgICAgICAgU19GUkFHLFxuICAgICAgICBTX0VMRU1FTlRTLFxuICAgICAgICBTX1BSSU1JVElWRSxcbiAgICAgICAgU19PRkZTRVQsXG4gICAgICAgIFNfQ09VTlQsXG4gICAgICAgIFNfSU5TVEFOQ0VTLFxuICAgICAgICBTX1BST0ZJTEUsXG4gICAgICAgIFNfVkFPXG4gICAgICBdLmNvbmNhdChHTF9TVEFURV9OQU1FUylcblxuICAgICAgZnVuY3Rpb24gY2hlY2tLZXlzIChkaWN0KSB7XG4gICAgICAgIE9iamVjdC5rZXlzKGRpY3QpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgIGNoZWNrJDEuY29tbWFuZChcbiAgICAgICAgICAgIEtFWV9OQU1FUy5pbmRleE9mKGtleSkgPj0gMCxcbiAgICAgICAgICAgICd1bmtub3duIHBhcmFtZXRlciBcIicgKyBrZXkgKyAnXCInLFxuICAgICAgICAgICAgZW52LmNvbW1hbmRTdHIpXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGNoZWNrS2V5cyhzdGF0aWNPcHRpb25zKVxuICAgICAgY2hlY2tLZXlzKGR5bmFtaWNPcHRpb25zKVxuICAgIH0pXG5cbiAgICB2YXIgYXR0cmliTG9jYXRpb25zID0gcGFyc2VBdHRyaWJMb2NhdGlvbnMob3B0aW9ucywgYXR0cmlidXRlcylcblxuICAgIHZhciBmcmFtZWJ1ZmZlciA9IHBhcnNlRnJhbWVidWZmZXIob3B0aW9ucywgZW52KVxuICAgIHZhciB2aWV3cG9ydEFuZFNjaXNzb3IgPSBwYXJzZVZpZXdwb3J0U2Npc3NvcihvcHRpb25zLCBmcmFtZWJ1ZmZlciwgZW52KVxuICAgIHZhciBkcmF3ID0gcGFyc2VEcmF3KG9wdGlvbnMsIGVudilcbiAgICB2YXIgc3RhdGUgPSBwYXJzZUdMU3RhdGUob3B0aW9ucywgZW52KVxuICAgIHZhciBzaGFkZXIgPSBwYXJzZVByb2dyYW0ob3B0aW9ucywgZW52LCBhdHRyaWJMb2NhdGlvbnMpXG5cbiAgICBmdW5jdGlvbiBjb3B5Qm94IChuYW1lKSB7XG4gICAgICB2YXIgZGVmbiA9IHZpZXdwb3J0QW5kU2Npc3NvcltuYW1lXVxuICAgICAgaWYgKGRlZm4pIHtcbiAgICAgICAgc3RhdGVbbmFtZV0gPSBkZWZuXG4gICAgICB9XG4gICAgfVxuICAgIGNvcHlCb3goU19WSUVXUE9SVClcbiAgICBjb3B5Qm94KHByb3BOYW1lKFNfU0NJU1NPUl9CT1gpKVxuXG4gICAgdmFyIGRpcnR5ID0gT2JqZWN0LmtleXMoc3RhdGUpLmxlbmd0aCA+IDBcblxuICAgIHZhciByZXN1bHQgPSB7XG4gICAgICBmcmFtZWJ1ZmZlcjogZnJhbWVidWZmZXIsXG4gICAgICBkcmF3OiBkcmF3LFxuICAgICAgc2hhZGVyOiBzaGFkZXIsXG4gICAgICBzdGF0ZTogc3RhdGUsXG4gICAgICBkaXJ0eTogZGlydHksXG4gICAgICBzY29wZVZBTzogbnVsbCxcbiAgICAgIGRyYXdWQU86IG51bGwsXG4gICAgICB1c2VWQU86IGZhbHNlLFxuICAgICAgYXR0cmlidXRlczoge31cbiAgICB9XG5cbiAgICByZXN1bHQucHJvZmlsZSA9IHBhcnNlUHJvZmlsZShvcHRpb25zLCBlbnYpXG4gICAgcmVzdWx0LnVuaWZvcm1zID0gcGFyc2VVbmlmb3Jtcyh1bmlmb3JtcywgZW52KVxuICAgIHJlc3VsdC5kcmF3VkFPID0gcmVzdWx0LnNjb3BlVkFPID0gcGFyc2VWQU8ob3B0aW9ucywgZW52KVxuICAgIC8vIHNwZWNpYWwgY2FzZTogY2hlY2sgaWYgd2UgY2FuIHN0YXRpY2FsbHkgYWxsb2NhdGUgYSB2ZXJ0ZXggYXJyYXkgb2JqZWN0IGZvciB0aGlzIHByb2dyYW1cbiAgICBpZiAoIXJlc3VsdC5kcmF3VkFPICYmIHNoYWRlci5wcm9ncmFtICYmICFhdHRyaWJMb2NhdGlvbnMgJiYgZXh0ZW5zaW9ucy5hbmdsZV9pbnN0YW5jZWRfYXJyYXlzKSB7XG4gICAgICB2YXIgdXNlVkFPID0gdHJ1ZVxuICAgICAgdmFyIHN0YXRpY0JpbmRpbmdzID0gc2hhZGVyLnByb2dyYW0uYXR0cmlidXRlcy5tYXAoZnVuY3Rpb24gKGF0dHIpIHtcbiAgICAgICAgdmFyIGJpbmRpbmcgPSBhdHRyaWJ1dGVzLnN0YXRpY1thdHRyXVxuICAgICAgICB1c2VWQU8gPSB1c2VWQU8gJiYgISFiaW5kaW5nXG4gICAgICAgIHJldHVybiBiaW5kaW5nXG4gICAgICB9KVxuICAgICAgaWYgKHVzZVZBTyAmJiBzdGF0aWNCaW5kaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHZhciB2YW8gPSBhdHRyaWJ1dGVTdGF0ZS5nZXRWQU8oYXR0cmlidXRlU3RhdGUuY3JlYXRlVkFPKHN0YXRpY0JpbmRpbmdzKSlcbiAgICAgICAgcmVzdWx0LmRyYXdWQU8gPSBuZXcgRGVjbGFyYXRpb24obnVsbCwgbnVsbCwgbnVsbCwgZnVuY3Rpb24gKGVudiwgc2NvcGUpIHtcbiAgICAgICAgICByZXR1cm4gZW52LmxpbmsodmFvKVxuICAgICAgICB9KVxuICAgICAgICByZXN1bHQudXNlVkFPID0gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoYXR0cmliTG9jYXRpb25zKSB7XG4gICAgICByZXN1bHQudXNlVkFPID0gdHJ1ZVxuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQuYXR0cmlidXRlcyA9IHBhcnNlQXR0cmlidXRlcyhhdHRyaWJ1dGVzLCBlbnYpXG4gICAgfVxuICAgIHJlc3VsdC5jb250ZXh0ID0gcGFyc2VDb250ZXh0KGNvbnRleHQsIGVudilcbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIENPTU1PTiBVUERBVEUgRlVOQ1RJT05TXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgZnVuY3Rpb24gZW1pdENvbnRleHQgKGVudiwgc2NvcGUsIGNvbnRleHQpIHtcbiAgICB2YXIgc2hhcmVkID0gZW52LnNoYXJlZFxuICAgIHZhciBDT05URVhUID0gc2hhcmVkLmNvbnRleHRcblxuICAgIHZhciBjb250ZXh0RW50ZXIgPSBlbnYuc2NvcGUoKVxuXG4gICAgT2JqZWN0LmtleXMoY29udGV4dCkuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgICAgc2NvcGUuc2F2ZShDT05URVhULCAnLicgKyBuYW1lKVxuICAgICAgdmFyIGRlZm4gPSBjb250ZXh0W25hbWVdXG4gICAgICB2YXIgdmFsdWUgPSBkZWZuLmFwcGVuZChlbnYsIHNjb3BlKVxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIGNvbnRleHRFbnRlcihDT05URVhULCAnLicsIG5hbWUsICc9WycsIHZhbHVlLmpvaW4oKSwgJ107JylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnRleHRFbnRlcihDT05URVhULCAnLicsIG5hbWUsICc9JywgdmFsdWUsICc7JylcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgc2NvcGUoY29udGV4dEVudGVyKVxuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBDT01NT04gRFJBV0lORyBGVU5DVElPTlNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBmdW5jdGlvbiBlbWl0UG9sbEZyYW1lYnVmZmVyIChlbnYsIHNjb3BlLCBmcmFtZWJ1ZmZlciwgc2tpcENoZWNrKSB7XG4gICAgdmFyIHNoYXJlZCA9IGVudi5zaGFyZWRcblxuICAgIHZhciBHTCA9IHNoYXJlZC5nbFxuICAgIHZhciBGUkFNRUJVRkZFUl9TVEFURSA9IHNoYXJlZC5mcmFtZWJ1ZmZlclxuICAgIHZhciBFWFRfRFJBV19CVUZGRVJTXG4gICAgaWYgKGV4dERyYXdCdWZmZXJzKSB7XG4gICAgICBFWFRfRFJBV19CVUZGRVJTID0gc2NvcGUuZGVmKHNoYXJlZC5leHRlbnNpb25zLCAnLndlYmdsX2RyYXdfYnVmZmVycycpXG4gICAgfVxuXG4gICAgdmFyIGNvbnN0YW50cyA9IGVudi5jb25zdGFudHNcblxuICAgIHZhciBEUkFXX0JVRkZFUlMgPSBjb25zdGFudHMuZHJhd0J1ZmZlclxuICAgIHZhciBCQUNLX0JVRkZFUiA9IGNvbnN0YW50cy5iYWNrQnVmZmVyXG5cbiAgICB2YXIgTkVYVFxuICAgIGlmIChmcmFtZWJ1ZmZlcikge1xuICAgICAgTkVYVCA9IGZyYW1lYnVmZmVyLmFwcGVuZChlbnYsIHNjb3BlKVxuICAgIH0gZWxzZSB7XG4gICAgICBORVhUID0gc2NvcGUuZGVmKEZSQU1FQlVGRkVSX1NUQVRFLCAnLm5leHQnKVxuICAgIH1cblxuICAgIGlmICghc2tpcENoZWNrKSB7XG4gICAgICBzY29wZSgnaWYoJywgTkVYVCwgJyE9PScsIEZSQU1FQlVGRkVSX1NUQVRFLCAnLmN1cil7JylcbiAgICB9XG4gICAgc2NvcGUoXG4gICAgICAnaWYoJywgTkVYVCwgJyl7JyxcbiAgICAgIEdMLCAnLmJpbmRGcmFtZWJ1ZmZlcignLCBHTF9GUkFNRUJVRkZFUiQyLCAnLCcsIE5FWFQsICcuZnJhbWVidWZmZXIpOycpXG4gICAgaWYgKGV4dERyYXdCdWZmZXJzKSB7XG4gICAgICBzY29wZShFWFRfRFJBV19CVUZGRVJTLCAnLmRyYXdCdWZmZXJzV0VCR0woJyxcbiAgICAgICAgRFJBV19CVUZGRVJTLCAnWycsIE5FWFQsICcuY29sb3JBdHRhY2htZW50cy5sZW5ndGhdKTsnKVxuICAgIH1cbiAgICBzY29wZSgnfWVsc2V7JyxcbiAgICAgIEdMLCAnLmJpbmRGcmFtZWJ1ZmZlcignLCBHTF9GUkFNRUJVRkZFUiQyLCAnLG51bGwpOycpXG4gICAgaWYgKGV4dERyYXdCdWZmZXJzKSB7XG4gICAgICBzY29wZShFWFRfRFJBV19CVUZGRVJTLCAnLmRyYXdCdWZmZXJzV0VCR0woJywgQkFDS19CVUZGRVIsICcpOycpXG4gICAgfVxuICAgIHNjb3BlKFxuICAgICAgJ30nLFxuICAgICAgRlJBTUVCVUZGRVJfU1RBVEUsICcuY3VyPScsIE5FWFQsICc7JylcbiAgICBpZiAoIXNraXBDaGVjaykge1xuICAgICAgc2NvcGUoJ30nKVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGVtaXRQb2xsU3RhdGUgKGVudiwgc2NvcGUsIGFyZ3MpIHtcbiAgICB2YXIgc2hhcmVkID0gZW52LnNoYXJlZFxuXG4gICAgdmFyIEdMID0gc2hhcmVkLmdsXG5cbiAgICB2YXIgQ1VSUkVOVF9WQVJTID0gZW52LmN1cnJlbnRcbiAgICB2YXIgTkVYVF9WQVJTID0gZW52Lm5leHRcbiAgICB2YXIgQ1VSUkVOVF9TVEFURSA9IHNoYXJlZC5jdXJyZW50XG4gICAgdmFyIE5FWFRfU1RBVEUgPSBzaGFyZWQubmV4dFxuXG4gICAgdmFyIGJsb2NrID0gZW52LmNvbmQoQ1VSUkVOVF9TVEFURSwgJy5kaXJ0eScpXG5cbiAgICBHTF9TVEFURV9OQU1FUy5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgICB2YXIgcGFyYW0gPSBwcm9wTmFtZShwcm9wKVxuICAgICAgaWYgKHBhcmFtIGluIGFyZ3Muc3RhdGUpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIHZhciBORVhULCBDVVJSRU5UXG4gICAgICBpZiAocGFyYW0gaW4gTkVYVF9WQVJTKSB7XG4gICAgICAgIE5FWFQgPSBORVhUX1ZBUlNbcGFyYW1dXG4gICAgICAgIENVUlJFTlQgPSBDVVJSRU5UX1ZBUlNbcGFyYW1dXG4gICAgICAgIHZhciBwYXJ0cyA9IGxvb3AoY3VycmVudFN0YXRlW3BhcmFtXS5sZW5ndGgsIGZ1bmN0aW9uIChpKSB7XG4gICAgICAgICAgcmV0dXJuIGJsb2NrLmRlZihORVhULCAnWycsIGksICddJylcbiAgICAgICAgfSlcbiAgICAgICAgYmxvY2soZW52LmNvbmQocGFydHMubWFwKGZ1bmN0aW9uIChwLCBpKSB7XG4gICAgICAgICAgcmV0dXJuIHAgKyAnIT09JyArIENVUlJFTlQgKyAnWycgKyBpICsgJ10nXG4gICAgICAgIH0pLmpvaW4oJ3x8JykpXG4gICAgICAgICAgLnRoZW4oXG4gICAgICAgICAgICBHTCwgJy4nLCBHTF9WQVJJQUJMRVNbcGFyYW1dLCAnKCcsIHBhcnRzLCAnKTsnLFxuICAgICAgICAgICAgcGFydHMubWFwKGZ1bmN0aW9uIChwLCBpKSB7XG4gICAgICAgICAgICAgIHJldHVybiBDVVJSRU5UICsgJ1snICsgaSArICddPScgKyBwXG4gICAgICAgICAgICB9KS5qb2luKCc7JyksICc7JykpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBORVhUID0gYmxvY2suZGVmKE5FWFRfU1RBVEUsICcuJywgcGFyYW0pXG4gICAgICAgIHZhciBpZnRlID0gZW52LmNvbmQoTkVYVCwgJyE9PScsIENVUlJFTlRfU1RBVEUsICcuJywgcGFyYW0pXG4gICAgICAgIGJsb2NrKGlmdGUpXG4gICAgICAgIGlmIChwYXJhbSBpbiBHTF9GTEFHUykge1xuICAgICAgICAgIGlmdGUoXG4gICAgICAgICAgICBlbnYuY29uZChORVhUKVxuICAgICAgICAgICAgICAudGhlbihHTCwgJy5lbmFibGUoJywgR0xfRkxBR1NbcGFyYW1dLCAnKTsnKVxuICAgICAgICAgICAgICAuZWxzZShHTCwgJy5kaXNhYmxlKCcsIEdMX0ZMQUdTW3BhcmFtXSwgJyk7JyksXG4gICAgICAgICAgICBDVVJSRU5UX1NUQVRFLCAnLicsIHBhcmFtLCAnPScsIE5FWFQsICc7JylcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZnRlKFxuICAgICAgICAgICAgR0wsICcuJywgR0xfVkFSSUFCTEVTW3BhcmFtXSwgJygnLCBORVhULCAnKTsnLFxuICAgICAgICAgICAgQ1VSUkVOVF9TVEFURSwgJy4nLCBwYXJhbSwgJz0nLCBORVhULCAnOycpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICAgIGlmIChPYmplY3Qua2V5cyhhcmdzLnN0YXRlKS5sZW5ndGggPT09IDApIHtcbiAgICAgIGJsb2NrKENVUlJFTlRfU1RBVEUsICcuZGlydHk9ZmFsc2U7JylcbiAgICB9XG4gICAgc2NvcGUoYmxvY2spXG4gIH1cblxuICBmdW5jdGlvbiBlbWl0U2V0T3B0aW9ucyAoZW52LCBzY29wZSwgb3B0aW9ucywgZmlsdGVyKSB7XG4gICAgdmFyIHNoYXJlZCA9IGVudi5zaGFyZWRcbiAgICB2YXIgQ1VSUkVOVF9WQVJTID0gZW52LmN1cnJlbnRcbiAgICB2YXIgQ1VSUkVOVF9TVEFURSA9IHNoYXJlZC5jdXJyZW50XG4gICAgdmFyIEdMID0gc2hhcmVkLmdsXG4gICAgc29ydFN0YXRlKE9iamVjdC5rZXlzKG9wdGlvbnMpKS5mb3JFYWNoKGZ1bmN0aW9uIChwYXJhbSkge1xuICAgICAgdmFyIGRlZm4gPSBvcHRpb25zW3BhcmFtXVxuICAgICAgaWYgKGZpbHRlciAmJiAhZmlsdGVyKGRlZm4pKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgdmFyIHZhcmlhYmxlID0gZGVmbi5hcHBlbmQoZW52LCBzY29wZSlcbiAgICAgIGlmIChHTF9GTEFHU1twYXJhbV0pIHtcbiAgICAgICAgdmFyIGZsYWcgPSBHTF9GTEFHU1twYXJhbV1cbiAgICAgICAgaWYgKGlzU3RhdGljKGRlZm4pKSB7XG4gICAgICAgICAgaWYgKHZhcmlhYmxlKSB7XG4gICAgICAgICAgICBzY29wZShHTCwgJy5lbmFibGUoJywgZmxhZywgJyk7JylcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2NvcGUoR0wsICcuZGlzYWJsZSgnLCBmbGFnLCAnKTsnKVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzY29wZShlbnYuY29uZCh2YXJpYWJsZSlcbiAgICAgICAgICAgIC50aGVuKEdMLCAnLmVuYWJsZSgnLCBmbGFnLCAnKTsnKVxuICAgICAgICAgICAgLmVsc2UoR0wsICcuZGlzYWJsZSgnLCBmbGFnLCAnKTsnKSlcbiAgICAgICAgfVxuICAgICAgICBzY29wZShDVVJSRU5UX1NUQVRFLCAnLicsIHBhcmFtLCAnPScsIHZhcmlhYmxlLCAnOycpXG4gICAgICB9IGVsc2UgaWYgKGlzQXJyYXlMaWtlKHZhcmlhYmxlKSkge1xuICAgICAgICB2YXIgQ1VSUkVOVCA9IENVUlJFTlRfVkFSU1twYXJhbV1cbiAgICAgICAgc2NvcGUoXG4gICAgICAgICAgR0wsICcuJywgR0xfVkFSSUFCTEVTW3BhcmFtXSwgJygnLCB2YXJpYWJsZSwgJyk7JyxcbiAgICAgICAgICB2YXJpYWJsZS5tYXAoZnVuY3Rpb24gKHYsIGkpIHtcbiAgICAgICAgICAgIHJldHVybiBDVVJSRU5UICsgJ1snICsgaSArICddPScgKyB2XG4gICAgICAgICAgfSkuam9pbignOycpLCAnOycpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzY29wZShcbiAgICAgICAgICBHTCwgJy4nLCBHTF9WQVJJQUJMRVNbcGFyYW1dLCAnKCcsIHZhcmlhYmxlLCAnKTsnLFxuICAgICAgICAgIENVUlJFTlRfU1RBVEUsICcuJywgcGFyYW0sICc9JywgdmFyaWFibGUsICc7JylcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgZnVuY3Rpb24gaW5qZWN0RXh0ZW5zaW9ucyAoZW52LCBzY29wZSkge1xuICAgIGlmIChleHRJbnN0YW5jaW5nKSB7XG4gICAgICBlbnYuaW5zdGFuY2luZyA9IHNjb3BlLmRlZihcbiAgICAgICAgZW52LnNoYXJlZC5leHRlbnNpb25zLCAnLmFuZ2xlX2luc3RhbmNlZF9hcnJheXMnKVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGVtaXRQcm9maWxlIChlbnYsIHNjb3BlLCBhcmdzLCB1c2VTY29wZSwgaW5jcmVtZW50Q291bnRlcikge1xuICAgIHZhciBzaGFyZWQgPSBlbnYuc2hhcmVkXG4gICAgdmFyIFNUQVRTID0gZW52LnN0YXRzXG4gICAgdmFyIENVUlJFTlRfU1RBVEUgPSBzaGFyZWQuY3VycmVudFxuICAgIHZhciBUSU1FUiA9IHNoYXJlZC50aW1lclxuICAgIHZhciBwcm9maWxlQXJnID0gYXJncy5wcm9maWxlXG5cbiAgICBmdW5jdGlvbiBwZXJmQ291bnRlciAoKSB7XG4gICAgICBpZiAodHlwZW9mIHBlcmZvcm1hbmNlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gJ0RhdGUubm93KCknXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gJ3BlcmZvcm1hbmNlLm5vdygpJ1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBDUFVfU1RBUlQsIFFVRVJZX0NPVU5URVJcbiAgICBmdW5jdGlvbiBlbWl0UHJvZmlsZVN0YXJ0IChibG9jaykge1xuICAgICAgQ1BVX1NUQVJUID0gc2NvcGUuZGVmKClcbiAgICAgIGJsb2NrKENQVV9TVEFSVCwgJz0nLCBwZXJmQ291bnRlcigpLCAnOycpXG4gICAgICBpZiAodHlwZW9mIGluY3JlbWVudENvdW50ZXIgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGJsb2NrKFNUQVRTLCAnLmNvdW50Kz0nLCBpbmNyZW1lbnRDb3VudGVyLCAnOycpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBibG9jayhTVEFUUywgJy5jb3VudCsrOycpXG4gICAgICB9XG4gICAgICBpZiAodGltZXIpIHtcbiAgICAgICAgaWYgKHVzZVNjb3BlKSB7XG4gICAgICAgICAgUVVFUllfQ09VTlRFUiA9IHNjb3BlLmRlZigpXG4gICAgICAgICAgYmxvY2soUVVFUllfQ09VTlRFUiwgJz0nLCBUSU1FUiwgJy5nZXROdW1QZW5kaW5nUXVlcmllcygpOycpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYmxvY2soVElNRVIsICcuYmVnaW5RdWVyeSgnLCBTVEFUUywgJyk7JylcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGVtaXRQcm9maWxlRW5kIChibG9jaykge1xuICAgICAgYmxvY2soU1RBVFMsICcuY3B1VGltZSs9JywgcGVyZkNvdW50ZXIoKSwgJy0nLCBDUFVfU1RBUlQsICc7JylcbiAgICAgIGlmICh0aW1lcikge1xuICAgICAgICBpZiAodXNlU2NvcGUpIHtcbiAgICAgICAgICBibG9jayhUSU1FUiwgJy5wdXNoU2NvcGVTdGF0cygnLFxuICAgICAgICAgICAgUVVFUllfQ09VTlRFUiwgJywnLFxuICAgICAgICAgICAgVElNRVIsICcuZ2V0TnVtUGVuZGluZ1F1ZXJpZXMoKSwnLFxuICAgICAgICAgICAgU1RBVFMsICcpOycpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYmxvY2soVElNRVIsICcuZW5kUXVlcnkoKTsnKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2NvcGVQcm9maWxlICh2YWx1ZSkge1xuICAgICAgdmFyIHByZXYgPSBzY29wZS5kZWYoQ1VSUkVOVF9TVEFURSwgJy5wcm9maWxlJylcbiAgICAgIHNjb3BlKENVUlJFTlRfU1RBVEUsICcucHJvZmlsZT0nLCB2YWx1ZSwgJzsnKVxuICAgICAgc2NvcGUuZXhpdChDVVJSRU5UX1NUQVRFLCAnLnByb2ZpbGU9JywgcHJldiwgJzsnKVxuICAgIH1cblxuICAgIHZhciBVU0VfUFJPRklMRVxuICAgIGlmIChwcm9maWxlQXJnKSB7XG4gICAgICBpZiAoaXNTdGF0aWMocHJvZmlsZUFyZykpIHtcbiAgICAgICAgaWYgKHByb2ZpbGVBcmcuZW5hYmxlKSB7XG4gICAgICAgICAgZW1pdFByb2ZpbGVTdGFydChzY29wZSlcbiAgICAgICAgICBlbWl0UHJvZmlsZUVuZChzY29wZS5leGl0KVxuICAgICAgICAgIHNjb3BlUHJvZmlsZSgndHJ1ZScpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2NvcGVQcm9maWxlKCdmYWxzZScpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBVU0VfUFJPRklMRSA9IHByb2ZpbGVBcmcuYXBwZW5kKGVudiwgc2NvcGUpXG4gICAgICBzY29wZVByb2ZpbGUoVVNFX1BST0ZJTEUpXG4gICAgfSBlbHNlIHtcbiAgICAgIFVTRV9QUk9GSUxFID0gc2NvcGUuZGVmKENVUlJFTlRfU1RBVEUsICcucHJvZmlsZScpXG4gICAgfVxuXG4gICAgdmFyIHN0YXJ0ID0gZW52LmJsb2NrKClcbiAgICBlbWl0UHJvZmlsZVN0YXJ0KHN0YXJ0KVxuICAgIHNjb3BlKCdpZignLCBVU0VfUFJPRklMRSwgJyl7Jywgc3RhcnQsICd9JylcbiAgICB2YXIgZW5kID0gZW52LmJsb2NrKClcbiAgICBlbWl0UHJvZmlsZUVuZChlbmQpXG4gICAgc2NvcGUuZXhpdCgnaWYoJywgVVNFX1BST0ZJTEUsICcpeycsIGVuZCwgJ30nKVxuICB9XG5cbiAgZnVuY3Rpb24gZW1pdEF0dHJpYnV0ZXMgKGVudiwgc2NvcGUsIGFyZ3MsIGF0dHJpYnV0ZXMsIGZpbHRlcikge1xuICAgIHZhciBzaGFyZWQgPSBlbnYuc2hhcmVkXG5cbiAgICBmdW5jdGlvbiB0eXBlTGVuZ3RoICh4KSB7XG4gICAgICBzd2l0Y2ggKHgpIHtcbiAgICAgICAgY2FzZSBHTF9GTE9BVF9WRUMyOlxuICAgICAgICBjYXNlIEdMX0lOVF9WRUMyOlxuICAgICAgICBjYXNlIEdMX0JPT0xfVkVDMjpcbiAgICAgICAgICByZXR1cm4gMlxuICAgICAgICBjYXNlIEdMX0ZMT0FUX1ZFQzM6XG4gICAgICAgIGNhc2UgR0xfSU5UX1ZFQzM6XG4gICAgICAgIGNhc2UgR0xfQk9PTF9WRUMzOlxuICAgICAgICAgIHJldHVybiAzXG4gICAgICAgIGNhc2UgR0xfRkxPQVRfVkVDNDpcbiAgICAgICAgY2FzZSBHTF9JTlRfVkVDNDpcbiAgICAgICAgY2FzZSBHTF9CT09MX1ZFQzQ6XG4gICAgICAgICAgcmV0dXJuIDRcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gMVxuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGVtaXRCaW5kQXR0cmlidXRlIChBVFRSSUJVVEUsIHNpemUsIHJlY29yZCkge1xuICAgICAgdmFyIEdMID0gc2hhcmVkLmdsXG5cbiAgICAgIHZhciBMT0NBVElPTiA9IHNjb3BlLmRlZihBVFRSSUJVVEUsICcubG9jYXRpb24nKVxuICAgICAgdmFyIEJJTkRJTkcgPSBzY29wZS5kZWYoc2hhcmVkLmF0dHJpYnV0ZXMsICdbJywgTE9DQVRJT04sICddJylcblxuICAgICAgdmFyIFNUQVRFID0gcmVjb3JkLnN0YXRlXG4gICAgICB2YXIgQlVGRkVSID0gcmVjb3JkLmJ1ZmZlclxuICAgICAgdmFyIENPTlNUX0NPTVBPTkVOVFMgPSBbXG4gICAgICAgIHJlY29yZC54LFxuICAgICAgICByZWNvcmQueSxcbiAgICAgICAgcmVjb3JkLnosXG4gICAgICAgIHJlY29yZC53XG4gICAgICBdXG5cbiAgICAgIHZhciBDT01NT05fS0VZUyA9IFtcbiAgICAgICAgJ2J1ZmZlcicsXG4gICAgICAgICdub3JtYWxpemVkJyxcbiAgICAgICAgJ29mZnNldCcsXG4gICAgICAgICdzdHJpZGUnXG4gICAgICBdXG5cbiAgICAgIGZ1bmN0aW9uIGVtaXRCdWZmZXIgKCkge1xuICAgICAgICBzY29wZShcbiAgICAgICAgICAnaWYoIScsIEJJTkRJTkcsICcuYnVmZmVyKXsnLFxuICAgICAgICAgIEdMLCAnLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KCcsIExPQ0FUSU9OLCAnKTt9JylcblxuICAgICAgICB2YXIgVFlQRSA9IHJlY29yZC50eXBlXG4gICAgICAgIHZhciBTSVpFXG4gICAgICAgIGlmICghcmVjb3JkLnNpemUpIHtcbiAgICAgICAgICBTSVpFID0gc2l6ZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIFNJWkUgPSBzY29wZS5kZWYocmVjb3JkLnNpemUsICd8fCcsIHNpemUpXG4gICAgICAgIH1cblxuICAgICAgICBzY29wZSgnaWYoJyxcbiAgICAgICAgICBCSU5ESU5HLCAnLnR5cGUhPT0nLCBUWVBFLCAnfHwnLFxuICAgICAgICAgIEJJTkRJTkcsICcuc2l6ZSE9PScsIFNJWkUsICd8fCcsXG4gICAgICAgICAgQ09NTU9OX0tFWVMubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgIHJldHVybiBCSU5ESU5HICsgJy4nICsga2V5ICsgJyE9PScgKyByZWNvcmRba2V5XVxuICAgICAgICAgIH0pLmpvaW4oJ3x8JyksXG4gICAgICAgICAgJyl7JyxcbiAgICAgICAgICBHTCwgJy5iaW5kQnVmZmVyKCcsIEdMX0FSUkFZX0JVRkZFUiQyLCAnLCcsIEJVRkZFUiwgJy5idWZmZXIpOycsXG4gICAgICAgICAgR0wsICcudmVydGV4QXR0cmliUG9pbnRlcignLCBbXG4gICAgICAgICAgICBMT0NBVElPTixcbiAgICAgICAgICAgIFNJWkUsXG4gICAgICAgICAgICBUWVBFLFxuICAgICAgICAgICAgcmVjb3JkLm5vcm1hbGl6ZWQsXG4gICAgICAgICAgICByZWNvcmQuc3RyaWRlLFxuICAgICAgICAgICAgcmVjb3JkLm9mZnNldFxuICAgICAgICAgIF0sICcpOycsXG4gICAgICAgICAgQklORElORywgJy50eXBlPScsIFRZUEUsICc7JyxcbiAgICAgICAgICBCSU5ESU5HLCAnLnNpemU9JywgU0laRSwgJzsnLFxuICAgICAgICAgIENPTU1PTl9LRVlTLm1hcChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICByZXR1cm4gQklORElORyArICcuJyArIGtleSArICc9JyArIHJlY29yZFtrZXldICsgJzsnXG4gICAgICAgICAgfSkuam9pbignJyksXG4gICAgICAgICAgJ30nKVxuXG4gICAgICAgIGlmIChleHRJbnN0YW5jaW5nKSB7XG4gICAgICAgICAgdmFyIERJVklTT1IgPSByZWNvcmQuZGl2aXNvclxuICAgICAgICAgIHNjb3BlKFxuICAgICAgICAgICAgJ2lmKCcsIEJJTkRJTkcsICcuZGl2aXNvciE9PScsIERJVklTT1IsICcpeycsXG4gICAgICAgICAgICBlbnYuaW5zdGFuY2luZywgJy52ZXJ0ZXhBdHRyaWJEaXZpc29yQU5HTEUoJywgW0xPQ0FUSU9OLCBESVZJU09SXSwgJyk7JyxcbiAgICAgICAgICAgIEJJTkRJTkcsICcuZGl2aXNvcj0nLCBESVZJU09SLCAnO30nKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGVtaXRDb25zdGFudCAoKSB7XG4gICAgICAgIHNjb3BlKFxuICAgICAgICAgICdpZignLCBCSU5ESU5HLCAnLmJ1ZmZlcil7JyxcbiAgICAgICAgICBHTCwgJy5kaXNhYmxlVmVydGV4QXR0cmliQXJyYXkoJywgTE9DQVRJT04sICcpOycsXG4gICAgICAgICAgQklORElORywgJy5idWZmZXI9bnVsbDsnLFxuICAgICAgICAgICd9aWYoJywgQ1VURV9DT01QT05FTlRTLm1hcChmdW5jdGlvbiAoYywgaSkge1xuICAgICAgICAgICAgcmV0dXJuIEJJTkRJTkcgKyAnLicgKyBjICsgJyE9PScgKyBDT05TVF9DT01QT05FTlRTW2ldXG4gICAgICAgICAgfSkuam9pbignfHwnKSwgJyl7JyxcbiAgICAgICAgICBHTCwgJy52ZXJ0ZXhBdHRyaWI0ZignLCBMT0NBVElPTiwgJywnLCBDT05TVF9DT01QT05FTlRTLCAnKTsnLFxuICAgICAgICAgIENVVEVfQ09NUE9ORU5UUy5tYXAoZnVuY3Rpb24gKGMsIGkpIHtcbiAgICAgICAgICAgIHJldHVybiBCSU5ESU5HICsgJy4nICsgYyArICc9JyArIENPTlNUX0NPTVBPTkVOVFNbaV0gKyAnOydcbiAgICAgICAgICB9KS5qb2luKCcnKSxcbiAgICAgICAgICAnfScpXG4gICAgICB9XG5cbiAgICAgIGlmIChTVEFURSA9PT0gQVRUUklCX1NUQVRFX1BPSU5URVIpIHtcbiAgICAgICAgZW1pdEJ1ZmZlcigpXG4gICAgICB9IGVsc2UgaWYgKFNUQVRFID09PSBBVFRSSUJfU1RBVEVfQ09OU1RBTlQpIHtcbiAgICAgICAgZW1pdENvbnN0YW50KClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNjb3BlKCdpZignLCBTVEFURSwgJz09PScsIEFUVFJJQl9TVEFURV9QT0lOVEVSLCAnKXsnKVxuICAgICAgICBlbWl0QnVmZmVyKClcbiAgICAgICAgc2NvcGUoJ31lbHNleycpXG4gICAgICAgIGVtaXRDb25zdGFudCgpXG4gICAgICAgIHNjb3BlKCd9JylcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhdHRyaWJ1dGVzLmZvckVhY2goZnVuY3Rpb24gKGF0dHJpYnV0ZSkge1xuICAgICAgdmFyIG5hbWUgPSBhdHRyaWJ1dGUubmFtZVxuICAgICAgdmFyIGFyZyA9IGFyZ3MuYXR0cmlidXRlc1tuYW1lXVxuICAgICAgdmFyIHJlY29yZFxuICAgICAgaWYgKGFyZykge1xuICAgICAgICBpZiAoIWZpbHRlcihhcmcpKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgcmVjb3JkID0gYXJnLmFwcGVuZChlbnYsIHNjb3BlKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCFmaWx0ZXIoU0NPUEVfREVDTCkpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICB2YXIgc2NvcGVBdHRyaWIgPSBlbnYuc2NvcGVBdHRyaWIobmFtZSlcbiAgICAgICAgY2hlY2skMS5vcHRpb25hbChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgZW52LmFzc2VydChzY29wZSxcbiAgICAgICAgICAgIHNjb3BlQXR0cmliICsgJy5zdGF0ZScsXG4gICAgICAgICAgICAnbWlzc2luZyBhdHRyaWJ1dGUgJyArIG5hbWUpXG4gICAgICAgIH0pXG4gICAgICAgIHJlY29yZCA9IHt9XG4gICAgICAgIE9iamVjdC5rZXlzKG5ldyBBdHRyaWJ1dGVSZWNvcmQoKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgcmVjb3JkW2tleV0gPSBzY29wZS5kZWYoc2NvcGVBdHRyaWIsICcuJywga2V5KVxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgZW1pdEJpbmRBdHRyaWJ1dGUoXG4gICAgICAgIGVudi5saW5rKGF0dHJpYnV0ZSksIHR5cGVMZW5ndGgoYXR0cmlidXRlLmluZm8udHlwZSksIHJlY29yZClcbiAgICB9KVxuICB9XG5cbiAgZnVuY3Rpb24gZW1pdFVuaWZvcm1zIChlbnYsIHNjb3BlLCBhcmdzLCB1bmlmb3JtcywgZmlsdGVyKSB7XG4gICAgdmFyIHNoYXJlZCA9IGVudi5zaGFyZWRcbiAgICB2YXIgR0wgPSBzaGFyZWQuZ2xcblxuICAgIHZhciBpbmZpeFxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdW5pZm9ybXMubGVuZ3RoOyArK2kpIHtcbiAgICAgIHZhciB1bmlmb3JtID0gdW5pZm9ybXNbaV1cbiAgICAgIHZhciBuYW1lID0gdW5pZm9ybS5uYW1lXG4gICAgICB2YXIgdHlwZSA9IHVuaWZvcm0uaW5mby50eXBlXG4gICAgICB2YXIgYXJnID0gYXJncy51bmlmb3Jtc1tuYW1lXVxuICAgICAgdmFyIFVOSUZPUk0gPSBlbnYubGluayh1bmlmb3JtKVxuICAgICAgdmFyIExPQ0FUSU9OID0gVU5JRk9STSArICcubG9jYXRpb24nXG5cbiAgICAgIHZhciBWQUxVRVxuICAgICAgaWYgKGFyZykge1xuICAgICAgICBpZiAoIWZpbHRlcihhcmcpKSB7XG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNTdGF0aWMoYXJnKSkge1xuICAgICAgICAgIHZhciB2YWx1ZSA9IGFyZy52YWx1ZVxuICAgICAgICAgIGNoZWNrJDEuY29tbWFuZChcbiAgICAgICAgICAgIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSAhPT0gJ3VuZGVmaW5lZCcsXG4gICAgICAgICAgICAnbWlzc2luZyB1bmlmb3JtIFwiJyArIG5hbWUgKyAnXCInLCBlbnYuY29tbWFuZFN0cilcbiAgICAgICAgICBpZiAodHlwZSA9PT0gR0xfU0FNUExFUl8yRCB8fCB0eXBlID09PSBHTF9TQU1QTEVSX0NVQkUpIHtcbiAgICAgICAgICAgIGNoZWNrJDEuY29tbWFuZChcbiAgICAgICAgICAgICAgdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nICYmXG4gICAgICAgICAgICAgICgodHlwZSA9PT0gR0xfU0FNUExFUl8yRCAmJlxuICAgICAgICAgICAgICAgICh2YWx1ZS5fcmVnbFR5cGUgPT09ICd0ZXh0dXJlMmQnIHx8XG4gICAgICAgICAgICAgICAgdmFsdWUuX3JlZ2xUeXBlID09PSAnZnJhbWVidWZmZXInKSkgfHxcbiAgICAgICAgICAgICAgKHR5cGUgPT09IEdMX1NBTVBMRVJfQ1VCRSAmJlxuICAgICAgICAgICAgICAgICh2YWx1ZS5fcmVnbFR5cGUgPT09ICd0ZXh0dXJlQ3ViZScgfHxcbiAgICAgICAgICAgICAgICB2YWx1ZS5fcmVnbFR5cGUgPT09ICdmcmFtZWJ1ZmZlckN1YmUnKSkpLFxuICAgICAgICAgICAgICAnaW52YWxpZCB0ZXh0dXJlIGZvciB1bmlmb3JtICcgKyBuYW1lLCBlbnYuY29tbWFuZFN0cilcbiAgICAgICAgICAgIHZhciBURVhfVkFMVUUgPSBlbnYubGluayh2YWx1ZS5fdGV4dHVyZSB8fCB2YWx1ZS5jb2xvclswXS5fdGV4dHVyZSlcbiAgICAgICAgICAgIHNjb3BlKEdMLCAnLnVuaWZvcm0xaSgnLCBMT0NBVElPTiwgJywnLCBURVhfVkFMVUUgKyAnLmJpbmQoKSk7JylcbiAgICAgICAgICAgIHNjb3BlLmV4aXQoVEVYX1ZBTFVFLCAnLnVuYmluZCgpOycpXG4gICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgIHR5cGUgPT09IEdMX0ZMT0FUX01BVDIgfHxcbiAgICAgICAgICAgIHR5cGUgPT09IEdMX0ZMT0FUX01BVDMgfHxcbiAgICAgICAgICAgIHR5cGUgPT09IEdMX0ZMT0FUX01BVDQpIHtcbiAgICAgICAgICAgIGNoZWNrJDEub3B0aW9uYWwoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICBjaGVjayQxLmNvbW1hbmQoaXNBcnJheUxpa2UodmFsdWUpLFxuICAgICAgICAgICAgICAgICdpbnZhbGlkIG1hdHJpeCBmb3IgdW5pZm9ybSAnICsgbmFtZSwgZW52LmNvbW1hbmRTdHIpXG4gICAgICAgICAgICAgIGNoZWNrJDEuY29tbWFuZChcbiAgICAgICAgICAgICAgICAodHlwZSA9PT0gR0xfRkxPQVRfTUFUMiAmJiB2YWx1ZS5sZW5ndGggPT09IDQpIHx8XG4gICAgICAgICAgICAgICAgKHR5cGUgPT09IEdMX0ZMT0FUX01BVDMgJiYgdmFsdWUubGVuZ3RoID09PSA5KSB8fFxuICAgICAgICAgICAgICAgICh0eXBlID09PSBHTF9GTE9BVF9NQVQ0ICYmIHZhbHVlLmxlbmd0aCA9PT0gMTYpLFxuICAgICAgICAgICAgICAgICdpbnZhbGlkIGxlbmd0aCBmb3IgbWF0cml4IHVuaWZvcm0gJyArIG5hbWUsIGVudi5jb21tYW5kU3RyKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHZhciBNQVRfVkFMVUUgPSBlbnYuZ2xvYmFsLmRlZignbmV3IEZsb2F0MzJBcnJheShbJyArXG4gICAgICAgICAgICAgIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHZhbHVlKSArICddKScpXG4gICAgICAgICAgICB2YXIgZGltID0gMlxuICAgICAgICAgICAgaWYgKHR5cGUgPT09IEdMX0ZMT0FUX01BVDMpIHtcbiAgICAgICAgICAgICAgZGltID0gM1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSBHTF9GTE9BVF9NQVQ0KSB7XG4gICAgICAgICAgICAgIGRpbSA9IDRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNjb3BlKFxuICAgICAgICAgICAgICBHTCwgJy51bmlmb3JtTWF0cml4JywgZGltLCAnZnYoJyxcbiAgICAgICAgICAgICAgTE9DQVRJT04sICcsZmFsc2UsJywgTUFUX1ZBTFVFLCAnKTsnKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgICAgY2FzZSBHTF9GTE9BVCQ4OlxuICAgICAgICAgICAgICAgIGNoZWNrJDEuY29tbWFuZFR5cGUodmFsdWUsICdudW1iZXInLCAndW5pZm9ybSAnICsgbmFtZSwgZW52LmNvbW1hbmRTdHIpXG4gICAgICAgICAgICAgICAgaW5maXggPSAnMWYnXG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgY2FzZSBHTF9GTE9BVF9WRUMyOlxuICAgICAgICAgICAgICAgIGNoZWNrJDEuY29tbWFuZChcbiAgICAgICAgICAgICAgICAgIGlzQXJyYXlMaWtlKHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPT09IDIsXG4gICAgICAgICAgICAgICAgICAndW5pZm9ybSAnICsgbmFtZSwgZW52LmNvbW1hbmRTdHIpXG4gICAgICAgICAgICAgICAgaW5maXggPSAnMmYnXG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgY2FzZSBHTF9GTE9BVF9WRUMzOlxuICAgICAgICAgICAgICAgIGNoZWNrJDEuY29tbWFuZChcbiAgICAgICAgICAgICAgICAgIGlzQXJyYXlMaWtlKHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPT09IDMsXG4gICAgICAgICAgICAgICAgICAndW5pZm9ybSAnICsgbmFtZSwgZW52LmNvbW1hbmRTdHIpXG4gICAgICAgICAgICAgICAgaW5maXggPSAnM2YnXG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgY2FzZSBHTF9GTE9BVF9WRUM0OlxuICAgICAgICAgICAgICAgIGNoZWNrJDEuY29tbWFuZChcbiAgICAgICAgICAgICAgICAgIGlzQXJyYXlMaWtlKHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPT09IDQsXG4gICAgICAgICAgICAgICAgICAndW5pZm9ybSAnICsgbmFtZSwgZW52LmNvbW1hbmRTdHIpXG4gICAgICAgICAgICAgICAgaW5maXggPSAnNGYnXG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgY2FzZSBHTF9CT09MOlxuICAgICAgICAgICAgICAgIGNoZWNrJDEuY29tbWFuZFR5cGUodmFsdWUsICdib29sZWFuJywgJ3VuaWZvcm0gJyArIG5hbWUsIGVudi5jb21tYW5kU3RyKVxuICAgICAgICAgICAgICAgIGluZml4ID0gJzFpJ1xuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgIGNhc2UgR0xfSU5UJDM6XG4gICAgICAgICAgICAgICAgY2hlY2skMS5jb21tYW5kVHlwZSh2YWx1ZSwgJ251bWJlcicsICd1bmlmb3JtICcgKyBuYW1lLCBlbnYuY29tbWFuZFN0cilcbiAgICAgICAgICAgICAgICBpbmZpeCA9ICcxaSdcbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICBjYXNlIEdMX0JPT0xfVkVDMjpcbiAgICAgICAgICAgICAgICBjaGVjayQxLmNvbW1hbmQoXG4gICAgICAgICAgICAgICAgICBpc0FycmF5TGlrZSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID09PSAyLFxuICAgICAgICAgICAgICAgICAgJ3VuaWZvcm0gJyArIG5hbWUsIGVudi5jb21tYW5kU3RyKVxuICAgICAgICAgICAgICAgIGluZml4ID0gJzJpJ1xuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgIGNhc2UgR0xfSU5UX1ZFQzI6XG4gICAgICAgICAgICAgICAgY2hlY2skMS5jb21tYW5kKFxuICAgICAgICAgICAgICAgICAgaXNBcnJheUxpa2UodmFsdWUpICYmIHZhbHVlLmxlbmd0aCA9PT0gMixcbiAgICAgICAgICAgICAgICAgICd1bmlmb3JtICcgKyBuYW1lLCBlbnYuY29tbWFuZFN0cilcbiAgICAgICAgICAgICAgICBpbmZpeCA9ICcyaSdcbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICBjYXNlIEdMX0JPT0xfVkVDMzpcbiAgICAgICAgICAgICAgICBjaGVjayQxLmNvbW1hbmQoXG4gICAgICAgICAgICAgICAgICBpc0FycmF5TGlrZSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID09PSAzLFxuICAgICAgICAgICAgICAgICAgJ3VuaWZvcm0gJyArIG5hbWUsIGVudi5jb21tYW5kU3RyKVxuICAgICAgICAgICAgICAgIGluZml4ID0gJzNpJ1xuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgIGNhc2UgR0xfSU5UX1ZFQzM6XG4gICAgICAgICAgICAgICAgY2hlY2skMS5jb21tYW5kKFxuICAgICAgICAgICAgICAgICAgaXNBcnJheUxpa2UodmFsdWUpICYmIHZhbHVlLmxlbmd0aCA9PT0gMyxcbiAgICAgICAgICAgICAgICAgICd1bmlmb3JtICcgKyBuYW1lLCBlbnYuY29tbWFuZFN0cilcbiAgICAgICAgICAgICAgICBpbmZpeCA9ICczaSdcbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICBjYXNlIEdMX0JPT0xfVkVDNDpcbiAgICAgICAgICAgICAgICBjaGVjayQxLmNvbW1hbmQoXG4gICAgICAgICAgICAgICAgICBpc0FycmF5TGlrZSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID09PSA0LFxuICAgICAgICAgICAgICAgICAgJ3VuaWZvcm0gJyArIG5hbWUsIGVudi5jb21tYW5kU3RyKVxuICAgICAgICAgICAgICAgIGluZml4ID0gJzRpJ1xuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgIGNhc2UgR0xfSU5UX1ZFQzQ6XG4gICAgICAgICAgICAgICAgY2hlY2skMS5jb21tYW5kKFxuICAgICAgICAgICAgICAgICAgaXNBcnJheUxpa2UodmFsdWUpICYmIHZhbHVlLmxlbmd0aCA9PT0gNCxcbiAgICAgICAgICAgICAgICAgICd1bmlmb3JtICcgKyBuYW1lLCBlbnYuY29tbWFuZFN0cilcbiAgICAgICAgICAgICAgICBpbmZpeCA9ICc0aSdcbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2NvcGUoR0wsICcudW5pZm9ybScsIGluZml4LCAnKCcsIExPQ0FUSU9OLCAnLCcsXG4gICAgICAgICAgICAgIGlzQXJyYXlMaWtlKHZhbHVlKSA/IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHZhbHVlKSA6IHZhbHVlLFxuICAgICAgICAgICAgICAnKTsnKVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIFZBTFVFID0gYXJnLmFwcGVuZChlbnYsIHNjb3BlKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoIWZpbHRlcihTQ09QRV9ERUNMKSkge1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgICAgVkFMVUUgPSBzY29wZS5kZWYoc2hhcmVkLnVuaWZvcm1zLCAnWycsIHN0cmluZ1N0b3JlLmlkKG5hbWUpLCAnXScpXG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlID09PSBHTF9TQU1QTEVSXzJEKSB7XG4gICAgICAgIGNoZWNrJDEoIUFycmF5LmlzQXJyYXkoVkFMVUUpLCAnbXVzdCBzcGVjaWZ5IGEgc2NhbGFyIHByb3AgZm9yIHRleHR1cmVzJylcbiAgICAgICAgc2NvcGUoXG4gICAgICAgICAgJ2lmKCcsIFZBTFVFLCAnJiYnLCBWQUxVRSwgJy5fcmVnbFR5cGU9PT1cImZyYW1lYnVmZmVyXCIpeycsXG4gICAgICAgICAgVkFMVUUsICc9JywgVkFMVUUsICcuY29sb3JbMF07JyxcbiAgICAgICAgICAnfScpXG4gICAgICB9IGVsc2UgaWYgKHR5cGUgPT09IEdMX1NBTVBMRVJfQ1VCRSkge1xuICAgICAgICBjaGVjayQxKCFBcnJheS5pc0FycmF5KFZBTFVFKSwgJ211c3Qgc3BlY2lmeSBhIHNjYWxhciBwcm9wIGZvciBjdWJlIG1hcHMnKVxuICAgICAgICBzY29wZShcbiAgICAgICAgICAnaWYoJywgVkFMVUUsICcmJicsIFZBTFVFLCAnLl9yZWdsVHlwZT09PVwiZnJhbWVidWZmZXJDdWJlXCIpeycsXG4gICAgICAgICAgVkFMVUUsICc9JywgVkFMVUUsICcuY29sb3JbMF07JyxcbiAgICAgICAgICAnfScpXG4gICAgICB9XG5cbiAgICAgIC8vIHBlcmZvcm0gdHlwZSB2YWxpZGF0aW9uXG4gICAgICBjaGVjayQxLm9wdGlvbmFsKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZnVuY3Rpb24gZW1pdENoZWNrIChwcmVkLCBtZXNzYWdlKSB7XG4gICAgICAgICAgZW52LmFzc2VydChzY29wZSwgcHJlZCxcbiAgICAgICAgICAgICdiYWQgZGF0YSBvciBtaXNzaW5nIGZvciB1bmlmb3JtIFwiJyArIG5hbWUgKyAnXCIuICAnICsgbWVzc2FnZSlcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGNoZWNrVHlwZSAodHlwZSkge1xuICAgICAgICAgIGNoZWNrJDEoIUFycmF5LmlzQXJyYXkoVkFMVUUpLCAnbXVzdCBub3Qgc3BlY2lmeSBhbiBhcnJheSB0eXBlIGZvciB1bmlmb3JtJylcbiAgICAgICAgICBlbWl0Q2hlY2soXG4gICAgICAgICAgICAndHlwZW9mICcgKyBWQUxVRSArICc9PT1cIicgKyB0eXBlICsgJ1wiJyxcbiAgICAgICAgICAgICdpbnZhbGlkIHR5cGUsIGV4cGVjdGVkICcgKyB0eXBlKVxuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gY2hlY2tWZWN0b3IgKG4sIHR5cGUpIHtcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShWQUxVRSkpIHtcbiAgICAgICAgICAgIGNoZWNrJDEoVkFMVUUubGVuZ3RoID09PSBuLCAnbXVzdCBoYXZlIGxlbmd0aCAnICsgbilcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZW1pdENoZWNrKFxuICAgICAgICAgICAgICBzaGFyZWQuaXNBcnJheUxpa2UgKyAnKCcgKyBWQUxVRSArICcpJiYnICsgVkFMVUUgKyAnLmxlbmd0aD09PScgKyBuLFxuICAgICAgICAgICAgICAnaW52YWxpZCB2ZWN0b3IsIHNob3VsZCBoYXZlIGxlbmd0aCAnICsgbiwgZW52LmNvbW1hbmRTdHIpXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gY2hlY2tUZXh0dXJlICh0YXJnZXQpIHtcbiAgICAgICAgICBjaGVjayQxKCFBcnJheS5pc0FycmF5KFZBTFVFKSwgJ211c3Qgbm90IHNwZWNpZnkgYSB2YWx1ZSB0eXBlJylcbiAgICAgICAgICBlbWl0Q2hlY2soXG4gICAgICAgICAgICAndHlwZW9mICcgKyBWQUxVRSArICc9PT1cImZ1bmN0aW9uXCImJicgK1xuICAgICAgICAgICAgVkFMVUUgKyAnLl9yZWdsVHlwZT09PVwidGV4dHVyZScgK1xuICAgICAgICAgICAgKHRhcmdldCA9PT0gR0xfVEVYVFVSRV8yRCQzID8gJzJkJyA6ICdDdWJlJykgKyAnXCInLFxuICAgICAgICAgICAgJ2ludmFsaWQgdGV4dHVyZSB0eXBlJywgZW52LmNvbW1hbmRTdHIpXG4gICAgICAgIH1cblxuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICBjYXNlIEdMX0lOVCQzOlxuICAgICAgICAgICAgY2hlY2tUeXBlKCdudW1iZXInKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICBjYXNlIEdMX0lOVF9WRUMyOlxuICAgICAgICAgICAgY2hlY2tWZWN0b3IoMiwgJ251bWJlcicpXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIGNhc2UgR0xfSU5UX1ZFQzM6XG4gICAgICAgICAgICBjaGVja1ZlY3RvcigzLCAnbnVtYmVyJylcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgY2FzZSBHTF9JTlRfVkVDNDpcbiAgICAgICAgICAgIGNoZWNrVmVjdG9yKDQsICdudW1iZXInKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICBjYXNlIEdMX0ZMT0FUJDg6XG4gICAgICAgICAgICBjaGVja1R5cGUoJ251bWJlcicpXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIGNhc2UgR0xfRkxPQVRfVkVDMjpcbiAgICAgICAgICAgIGNoZWNrVmVjdG9yKDIsICdudW1iZXInKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICBjYXNlIEdMX0ZMT0FUX1ZFQzM6XG4gICAgICAgICAgICBjaGVja1ZlY3RvcigzLCAnbnVtYmVyJylcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgY2FzZSBHTF9GTE9BVF9WRUM0OlxuICAgICAgICAgICAgY2hlY2tWZWN0b3IoNCwgJ251bWJlcicpXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIGNhc2UgR0xfQk9PTDpcbiAgICAgICAgICAgIGNoZWNrVHlwZSgnYm9vbGVhbicpXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIGNhc2UgR0xfQk9PTF9WRUMyOlxuICAgICAgICAgICAgY2hlY2tWZWN0b3IoMiwgJ2Jvb2xlYW4nKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICBjYXNlIEdMX0JPT0xfVkVDMzpcbiAgICAgICAgICAgIGNoZWNrVmVjdG9yKDMsICdib29sZWFuJylcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgY2FzZSBHTF9CT09MX1ZFQzQ6XG4gICAgICAgICAgICBjaGVja1ZlY3Rvcig0LCAnYm9vbGVhbicpXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIGNhc2UgR0xfRkxPQVRfTUFUMjpcbiAgICAgICAgICAgIGNoZWNrVmVjdG9yKDQsICdudW1iZXInKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICBjYXNlIEdMX0ZMT0FUX01BVDM6XG4gICAgICAgICAgICBjaGVja1ZlY3Rvcig5LCAnbnVtYmVyJylcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgY2FzZSBHTF9GTE9BVF9NQVQ0OlxuICAgICAgICAgICAgY2hlY2tWZWN0b3IoMTYsICdudW1iZXInKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICBjYXNlIEdMX1NBTVBMRVJfMkQ6XG4gICAgICAgICAgICBjaGVja1RleHR1cmUoR0xfVEVYVFVSRV8yRCQzKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICBjYXNlIEdMX1NBTVBMRVJfQ1VCRTpcbiAgICAgICAgICAgIGNoZWNrVGV4dHVyZShHTF9URVhUVVJFX0NVQkVfTUFQJDIpXG4gICAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgICB2YXIgdW5yb2xsID0gMVxuICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgR0xfU0FNUExFUl8yRDpcbiAgICAgICAgY2FzZSBHTF9TQU1QTEVSX0NVQkU6XG4gICAgICAgICAgdmFyIFRFWCA9IHNjb3BlLmRlZihWQUxVRSwgJy5fdGV4dHVyZScpXG4gICAgICAgICAgc2NvcGUoR0wsICcudW5pZm9ybTFpKCcsIExPQ0FUSU9OLCAnLCcsIFRFWCwgJy5iaW5kKCkpOycpXG4gICAgICAgICAgc2NvcGUuZXhpdChURVgsICcudW5iaW5kKCk7JylcbiAgICAgICAgICBjb250aW51ZVxuXG4gICAgICAgIGNhc2UgR0xfSU5UJDM6XG4gICAgICAgIGNhc2UgR0xfQk9PTDpcbiAgICAgICAgICBpbmZpeCA9ICcxaSdcbiAgICAgICAgICBicmVha1xuXG4gICAgICAgIGNhc2UgR0xfSU5UX1ZFQzI6XG4gICAgICAgIGNhc2UgR0xfQk9PTF9WRUMyOlxuICAgICAgICAgIGluZml4ID0gJzJpJ1xuICAgICAgICAgIHVucm9sbCA9IDJcbiAgICAgICAgICBicmVha1xuXG4gICAgICAgIGNhc2UgR0xfSU5UX1ZFQzM6XG4gICAgICAgIGNhc2UgR0xfQk9PTF9WRUMzOlxuICAgICAgICAgIGluZml4ID0gJzNpJ1xuICAgICAgICAgIHVucm9sbCA9IDNcbiAgICAgICAgICBicmVha1xuXG4gICAgICAgIGNhc2UgR0xfSU5UX1ZFQzQ6XG4gICAgICAgIGNhc2UgR0xfQk9PTF9WRUM0OlxuICAgICAgICAgIGluZml4ID0gJzRpJ1xuICAgICAgICAgIHVucm9sbCA9IDRcbiAgICAgICAgICBicmVha1xuXG4gICAgICAgIGNhc2UgR0xfRkxPQVQkODpcbiAgICAgICAgICBpbmZpeCA9ICcxZidcbiAgICAgICAgICBicmVha1xuXG4gICAgICAgIGNhc2UgR0xfRkxPQVRfVkVDMjpcbiAgICAgICAgICBpbmZpeCA9ICcyZidcbiAgICAgICAgICB1bnJvbGwgPSAyXG4gICAgICAgICAgYnJlYWtcblxuICAgICAgICBjYXNlIEdMX0ZMT0FUX1ZFQzM6XG4gICAgICAgICAgaW5maXggPSAnM2YnXG4gICAgICAgICAgdW5yb2xsID0gM1xuICAgICAgICAgIGJyZWFrXG5cbiAgICAgICAgY2FzZSBHTF9GTE9BVF9WRUM0OlxuICAgICAgICAgIGluZml4ID0gJzRmJ1xuICAgICAgICAgIHVucm9sbCA9IDRcbiAgICAgICAgICBicmVha1xuXG4gICAgICAgIGNhc2UgR0xfRkxPQVRfTUFUMjpcbiAgICAgICAgICBpbmZpeCA9ICdNYXRyaXgyZnYnXG4gICAgICAgICAgYnJlYWtcblxuICAgICAgICBjYXNlIEdMX0ZMT0FUX01BVDM6XG4gICAgICAgICAgaW5maXggPSAnTWF0cml4M2Z2J1xuICAgICAgICAgIGJyZWFrXG5cbiAgICAgICAgY2FzZSBHTF9GTE9BVF9NQVQ0OlxuICAgICAgICAgIGluZml4ID0gJ01hdHJpeDRmdidcbiAgICAgICAgICBicmVha1xuICAgICAgfVxuXG4gICAgICBzY29wZShHTCwgJy51bmlmb3JtJywgaW5maXgsICcoJywgTE9DQVRJT04sICcsJylcbiAgICAgIGlmIChpbmZpeC5jaGFyQXQoMCkgPT09ICdNJykge1xuICAgICAgICB2YXIgbWF0U2l6ZSA9IE1hdGgucG93KHR5cGUgLSBHTF9GTE9BVF9NQVQyICsgMiwgMilcbiAgICAgICAgdmFyIFNUT1JBR0UgPSBlbnYuZ2xvYmFsLmRlZignbmV3IEZsb2F0MzJBcnJheSgnLCBtYXRTaXplLCAnKScpXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KFZBTFVFKSkge1xuICAgICAgICAgIHNjb3BlKFxuICAgICAgICAgICAgJ2ZhbHNlLCgnLFxuICAgICAgICAgICAgbG9vcChtYXRTaXplLCBmdW5jdGlvbiAoaSkge1xuICAgICAgICAgICAgICByZXR1cm4gU1RPUkFHRSArICdbJyArIGkgKyAnXT0nICsgVkFMVUVbaV1cbiAgICAgICAgICAgIH0pLCAnLCcsIFNUT1JBR0UsICcpJylcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzY29wZShcbiAgICAgICAgICAgICdmYWxzZSwoQXJyYXkuaXNBcnJheSgnLCBWQUxVRSwgJyl8fCcsIFZBTFVFLCAnIGluc3RhbmNlb2YgRmxvYXQzMkFycmF5KT8nLCBWQUxVRSwgJzooJyxcbiAgICAgICAgICAgIGxvb3AobWF0U2l6ZSwgZnVuY3Rpb24gKGkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIFNUT1JBR0UgKyAnWycgKyBpICsgJ109JyArIFZBTFVFICsgJ1snICsgaSArICddJ1xuICAgICAgICAgICAgfSksICcsJywgU1RPUkFHRSwgJyknKVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHVucm9sbCA+IDEpIHtcbiAgICAgICAgc2NvcGUobG9vcCh1bnJvbGwsIGZ1bmN0aW9uIChpKSB7XG4gICAgICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoVkFMVUUpID8gVkFMVUVbaV0gOiBWQUxVRSArICdbJyArIGkgKyAnXSdcbiAgICAgICAgfSkpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjaGVjayQxKCFBcnJheS5pc0FycmF5KFZBTFVFKSwgJ3VuaWZvcm0gdmFsdWUgbXVzdCBub3QgYmUgYW4gYXJyYXknKVxuICAgICAgICBzY29wZShWQUxVRSlcbiAgICAgIH1cbiAgICAgIHNjb3BlKCcpOycpXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZW1pdERyYXcgKGVudiwgb3V0ZXIsIGlubmVyLCBhcmdzKSB7XG4gICAgdmFyIHNoYXJlZCA9IGVudi5zaGFyZWRcbiAgICB2YXIgR0wgPSBzaGFyZWQuZ2xcbiAgICB2YXIgRFJBV19TVEFURSA9IHNoYXJlZC5kcmF3XG5cbiAgICB2YXIgZHJhd09wdGlvbnMgPSBhcmdzLmRyYXdcblxuICAgIGZ1bmN0aW9uIGVtaXRFbGVtZW50cyAoKSB7XG4gICAgICB2YXIgZGVmbiA9IGRyYXdPcHRpb25zLmVsZW1lbnRzXG4gICAgICB2YXIgRUxFTUVOVFNcbiAgICAgIHZhciBzY29wZSA9IG91dGVyXG4gICAgICBpZiAoZGVmbikge1xuICAgICAgICBpZiAoKGRlZm4uY29udGV4dERlcCAmJiBhcmdzLmNvbnRleHREeW5hbWljKSB8fCBkZWZuLnByb3BEZXApIHtcbiAgICAgICAgICBzY29wZSA9IGlubmVyXG4gICAgICAgIH1cbiAgICAgICAgRUxFTUVOVFMgPSBkZWZuLmFwcGVuZChlbnYsIHNjb3BlKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgRUxFTUVOVFMgPSBzY29wZS5kZWYoRFJBV19TVEFURSwgJy4nLCBTX0VMRU1FTlRTKVxuICAgICAgfVxuICAgICAgaWYgKEVMRU1FTlRTKSB7XG4gICAgICAgIHNjb3BlKFxuICAgICAgICAgICdpZignICsgRUxFTUVOVFMgKyAnKScgK1xuICAgICAgICAgIEdMICsgJy5iaW5kQnVmZmVyKCcgKyBHTF9FTEVNRU5UX0FSUkFZX0JVRkZFUiQxICsgJywnICsgRUxFTUVOVFMgKyAnLmJ1ZmZlci5idWZmZXIpOycpXG4gICAgICB9XG4gICAgICByZXR1cm4gRUxFTUVOVFNcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBlbWl0Q291bnQgKCkge1xuICAgICAgdmFyIGRlZm4gPSBkcmF3T3B0aW9ucy5jb3VudFxuICAgICAgdmFyIENPVU5UXG4gICAgICB2YXIgc2NvcGUgPSBvdXRlclxuICAgICAgaWYgKGRlZm4pIHtcbiAgICAgICAgaWYgKChkZWZuLmNvbnRleHREZXAgJiYgYXJncy5jb250ZXh0RHluYW1pYykgfHwgZGVmbi5wcm9wRGVwKSB7XG4gICAgICAgICAgc2NvcGUgPSBpbm5lclxuICAgICAgICB9XG4gICAgICAgIENPVU5UID0gZGVmbi5hcHBlbmQoZW52LCBzY29wZSlcbiAgICAgICAgY2hlY2skMS5vcHRpb25hbChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKGRlZm4uTUlTU0lORykge1xuICAgICAgICAgICAgZW52LmFzc2VydChvdXRlciwgJ2ZhbHNlJywgJ21pc3NpbmcgdmVydGV4IGNvdW50JylcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGRlZm4uRFlOQU1JQykge1xuICAgICAgICAgICAgZW52LmFzc2VydChzY29wZSwgQ09VTlQgKyAnPj0wJywgJ21pc3NpbmcgdmVydGV4IGNvdW50JylcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBDT1VOVCA9IHNjb3BlLmRlZihEUkFXX1NUQVRFLCAnLicsIFNfQ09VTlQpXG4gICAgICAgIGNoZWNrJDEub3B0aW9uYWwoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGVudi5hc3NlcnQoc2NvcGUsIENPVU5UICsgJz49MCcsICdtaXNzaW5nIHZlcnRleCBjb3VudCcpXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICByZXR1cm4gQ09VTlRcbiAgICB9XG5cbiAgICB2YXIgRUxFTUVOVFMgPSBlbWl0RWxlbWVudHMoKVxuICAgIGZ1bmN0aW9uIGVtaXRWYWx1ZSAobmFtZSkge1xuICAgICAgdmFyIGRlZm4gPSBkcmF3T3B0aW9uc1tuYW1lXVxuICAgICAgaWYgKGRlZm4pIHtcbiAgICAgICAgaWYgKChkZWZuLmNvbnRleHREZXAgJiYgYXJncy5jb250ZXh0RHluYW1pYykgfHwgZGVmbi5wcm9wRGVwKSB7XG4gICAgICAgICAgcmV0dXJuIGRlZm4uYXBwZW5kKGVudiwgaW5uZXIpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIGRlZm4uYXBwZW5kKGVudiwgb3V0ZXIpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBvdXRlci5kZWYoRFJBV19TVEFURSwgJy4nLCBuYW1lKVxuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBQUklNSVRJVkUgPSBlbWl0VmFsdWUoU19QUklNSVRJVkUpXG4gICAgdmFyIE9GRlNFVCA9IGVtaXRWYWx1ZShTX09GRlNFVClcblxuICAgIHZhciBDT1VOVCA9IGVtaXRDb3VudCgpXG4gICAgaWYgKHR5cGVvZiBDT1VOVCA9PT0gJ251bWJlcicpIHtcbiAgICAgIGlmIChDT1VOVCA9PT0gMCkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaW5uZXIoJ2lmKCcsIENPVU5ULCAnKXsnKVxuICAgICAgaW5uZXIuZXhpdCgnfScpXG4gICAgfVxuXG4gICAgdmFyIElOU1RBTkNFUywgRVhUX0lOU1RBTkNJTkdcbiAgICBpZiAoZXh0SW5zdGFuY2luZykge1xuICAgICAgSU5TVEFOQ0VTID0gZW1pdFZhbHVlKFNfSU5TVEFOQ0VTKVxuICAgICAgRVhUX0lOU1RBTkNJTkcgPSBlbnYuaW5zdGFuY2luZ1xuICAgIH1cblxuICAgIHZhciBFTEVNRU5UX1RZUEUgPSBFTEVNRU5UUyArICcudHlwZSdcblxuICAgIHZhciBlbGVtZW50c1N0YXRpYyA9IGRyYXdPcHRpb25zLmVsZW1lbnRzICYmIGlzU3RhdGljKGRyYXdPcHRpb25zLmVsZW1lbnRzKVxuXG4gICAgZnVuY3Rpb24gZW1pdEluc3RhbmNpbmcgKCkge1xuICAgICAgZnVuY3Rpb24gZHJhd0VsZW1lbnRzICgpIHtcbiAgICAgICAgaW5uZXIoRVhUX0lOU1RBTkNJTkcsICcuZHJhd0VsZW1lbnRzSW5zdGFuY2VkQU5HTEUoJywgW1xuICAgICAgICAgIFBSSU1JVElWRSxcbiAgICAgICAgICBDT1VOVCxcbiAgICAgICAgICBFTEVNRU5UX1RZUEUsXG4gICAgICAgICAgT0ZGU0VUICsgJzw8KCgnICsgRUxFTUVOVF9UWVBFICsgJy0nICsgR0xfVU5TSUdORURfQllURSQ4ICsgJyk+PjEpJyxcbiAgICAgICAgICBJTlNUQU5DRVNcbiAgICAgICAgXSwgJyk7JylcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gZHJhd0FycmF5cyAoKSB7XG4gICAgICAgIGlubmVyKEVYVF9JTlNUQU5DSU5HLCAnLmRyYXdBcnJheXNJbnN0YW5jZWRBTkdMRSgnLFxuICAgICAgICAgIFtQUklNSVRJVkUsIE9GRlNFVCwgQ09VTlQsIElOU1RBTkNFU10sICcpOycpXG4gICAgICB9XG5cbiAgICAgIGlmIChFTEVNRU5UUykge1xuICAgICAgICBpZiAoIWVsZW1lbnRzU3RhdGljKSB7XG4gICAgICAgICAgaW5uZXIoJ2lmKCcsIEVMRU1FTlRTLCAnKXsnKVxuICAgICAgICAgIGRyYXdFbGVtZW50cygpXG4gICAgICAgICAgaW5uZXIoJ31lbHNleycpXG4gICAgICAgICAgZHJhd0FycmF5cygpXG4gICAgICAgICAgaW5uZXIoJ30nKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRyYXdFbGVtZW50cygpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRyYXdBcnJheXMoKVxuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGVtaXRSZWd1bGFyICgpIHtcbiAgICAgIGZ1bmN0aW9uIGRyYXdFbGVtZW50cyAoKSB7XG4gICAgICAgIGlubmVyKEdMICsgJy5kcmF3RWxlbWVudHMoJyArIFtcbiAgICAgICAgICBQUklNSVRJVkUsXG4gICAgICAgICAgQ09VTlQsXG4gICAgICAgICAgRUxFTUVOVF9UWVBFLFxuICAgICAgICAgIE9GRlNFVCArICc8PCgoJyArIEVMRU1FTlRfVFlQRSArICctJyArIEdMX1VOU0lHTkVEX0JZVEUkOCArICcpPj4xKSdcbiAgICAgICAgXSArICcpOycpXG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGRyYXdBcnJheXMgKCkge1xuICAgICAgICBpbm5lcihHTCArICcuZHJhd0FycmF5cygnICsgW1BSSU1JVElWRSwgT0ZGU0VULCBDT1VOVF0gKyAnKTsnKVxuICAgICAgfVxuXG4gICAgICBpZiAoRUxFTUVOVFMpIHtcbiAgICAgICAgaWYgKCFlbGVtZW50c1N0YXRpYykge1xuICAgICAgICAgIGlubmVyKCdpZignLCBFTEVNRU5UUywgJyl7JylcbiAgICAgICAgICBkcmF3RWxlbWVudHMoKVxuICAgICAgICAgIGlubmVyKCd9ZWxzZXsnKVxuICAgICAgICAgIGRyYXdBcnJheXMoKVxuICAgICAgICAgIGlubmVyKCd9JylcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkcmF3RWxlbWVudHMoKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkcmF3QXJyYXlzKClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZXh0SW5zdGFuY2luZyAmJiAodHlwZW9mIElOU1RBTkNFUyAhPT0gJ251bWJlcicgfHwgSU5TVEFOQ0VTID49IDApKSB7XG4gICAgICBpZiAodHlwZW9mIElOU1RBTkNFUyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgaW5uZXIoJ2lmKCcsIElOU1RBTkNFUywgJz4wKXsnKVxuICAgICAgICBlbWl0SW5zdGFuY2luZygpXG4gICAgICAgIGlubmVyKCd9ZWxzZSBpZignLCBJTlNUQU5DRVMsICc8MCl7JylcbiAgICAgICAgZW1pdFJlZ3VsYXIoKVxuICAgICAgICBpbm5lcignfScpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbWl0SW5zdGFuY2luZygpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGVtaXRSZWd1bGFyKClcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVCb2R5IChlbWl0Qm9keSwgcGFyZW50RW52LCBhcmdzLCBwcm9ncmFtLCBjb3VudCkge1xuICAgIHZhciBlbnYgPSBjcmVhdGVSRUdMRW52aXJvbm1lbnQoKVxuICAgIHZhciBzY29wZSA9IGVudi5wcm9jKCdib2R5JywgY291bnQpXG4gICAgY2hlY2skMS5vcHRpb25hbChmdW5jdGlvbiAoKSB7XG4gICAgICBlbnYuY29tbWFuZFN0ciA9IHBhcmVudEVudi5jb21tYW5kU3RyXG4gICAgICBlbnYuY29tbWFuZCA9IGVudi5saW5rKHBhcmVudEVudi5jb21tYW5kU3RyKVxuICAgIH0pXG4gICAgaWYgKGV4dEluc3RhbmNpbmcpIHtcbiAgICAgIGVudi5pbnN0YW5jaW5nID0gc2NvcGUuZGVmKFxuICAgICAgICBlbnYuc2hhcmVkLmV4dGVuc2lvbnMsICcuYW5nbGVfaW5zdGFuY2VkX2FycmF5cycpXG4gICAgfVxuICAgIGVtaXRCb2R5KGVudiwgc2NvcGUsIGFyZ3MsIHByb2dyYW0pXG4gICAgcmV0dXJuIGVudi5jb21waWxlKCkuYm9keVxuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBEUkFXIFBST0NcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBmdW5jdGlvbiBlbWl0RHJhd0JvZHkgKGVudiwgZHJhdywgYXJncywgcHJvZ3JhbSkge1xuICAgIGluamVjdEV4dGVuc2lvbnMoZW52LCBkcmF3KVxuICAgIGlmIChhcmdzLnVzZVZBTykge1xuICAgICAgaWYgKGFyZ3MuZHJhd1ZBTykge1xuICAgICAgICBkcmF3KGVudi5zaGFyZWQudmFvLCAnLnNldFZBTygnLCBhcmdzLmRyYXdWQU8uYXBwZW5kKGVudiwgZHJhdyksICcpOycpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkcmF3KGVudi5zaGFyZWQudmFvLCAnLnNldFZBTygnLCBlbnYuc2hhcmVkLnZhbywgJy50YXJnZXRWQU8pOycpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGRyYXcoZW52LnNoYXJlZC52YW8sICcuc2V0VkFPKG51bGwpOycpXG4gICAgICBlbWl0QXR0cmlidXRlcyhlbnYsIGRyYXcsIGFyZ3MsIHByb2dyYW0uYXR0cmlidXRlcywgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfSlcbiAgICB9XG4gICAgZW1pdFVuaWZvcm1zKGVudiwgZHJhdywgYXJncywgcHJvZ3JhbS51bmlmb3JtcywgZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9KVxuICAgIGVtaXREcmF3KGVudiwgZHJhdywgZHJhdywgYXJncylcbiAgfVxuXG4gIGZ1bmN0aW9uIGVtaXREcmF3UHJvYyAoZW52LCBhcmdzKSB7XG4gICAgdmFyIGRyYXcgPSBlbnYucHJvYygnZHJhdycsIDEpXG5cbiAgICBpbmplY3RFeHRlbnNpb25zKGVudiwgZHJhdylcblxuICAgIGVtaXRDb250ZXh0KGVudiwgZHJhdywgYXJncy5jb250ZXh0KVxuICAgIGVtaXRQb2xsRnJhbWVidWZmZXIoZW52LCBkcmF3LCBhcmdzLmZyYW1lYnVmZmVyKVxuXG4gICAgZW1pdFBvbGxTdGF0ZShlbnYsIGRyYXcsIGFyZ3MpXG4gICAgZW1pdFNldE9wdGlvbnMoZW52LCBkcmF3LCBhcmdzLnN0YXRlKVxuXG4gICAgZW1pdFByb2ZpbGUoZW52LCBkcmF3LCBhcmdzLCBmYWxzZSwgdHJ1ZSlcblxuICAgIHZhciBwcm9ncmFtID0gYXJncy5zaGFkZXIucHJvZ1Zhci5hcHBlbmQoZW52LCBkcmF3KVxuICAgIGRyYXcoZW52LnNoYXJlZC5nbCwgJy51c2VQcm9ncmFtKCcsIHByb2dyYW0sICcucHJvZ3JhbSk7JylcblxuICAgIGlmIChhcmdzLnNoYWRlci5wcm9ncmFtKSB7XG4gICAgICBlbWl0RHJhd0JvZHkoZW52LCBkcmF3LCBhcmdzLCBhcmdzLnNoYWRlci5wcm9ncmFtKVxuICAgIH0gZWxzZSB7XG4gICAgICBkcmF3KGVudi5zaGFyZWQudmFvLCAnLnNldFZBTyhudWxsKTsnKVxuICAgICAgdmFyIGRyYXdDYWNoZSA9IGVudi5nbG9iYWwuZGVmKCd7fScpXG4gICAgICB2YXIgUFJPR19JRCA9IGRyYXcuZGVmKHByb2dyYW0sICcuaWQnKVxuICAgICAgdmFyIENBQ0hFRF9QUk9DID0gZHJhdy5kZWYoZHJhd0NhY2hlLCAnWycsIFBST0dfSUQsICddJylcbiAgICAgIGRyYXcoXG4gICAgICAgIGVudi5jb25kKENBQ0hFRF9QUk9DKVxuICAgICAgICAgIC50aGVuKENBQ0hFRF9QUk9DLCAnLmNhbGwodGhpcyxhMCk7JylcbiAgICAgICAgICAuZWxzZShcbiAgICAgICAgICAgIENBQ0hFRF9QUk9DLCAnPScsIGRyYXdDYWNoZSwgJ1snLCBQUk9HX0lELCAnXT0nLFxuICAgICAgICAgICAgZW52LmxpbmsoZnVuY3Rpb24gKHByb2dyYW0pIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUJvZHkoZW1pdERyYXdCb2R5LCBlbnYsIGFyZ3MsIHByb2dyYW0sIDEpXG4gICAgICAgICAgICB9KSwgJygnLCBwcm9ncmFtLCAnKTsnLFxuICAgICAgICAgICAgQ0FDSEVEX1BST0MsICcuY2FsbCh0aGlzLGEwKTsnKSlcbiAgICB9XG5cbiAgICBpZiAoT2JqZWN0LmtleXMoYXJncy5zdGF0ZSkubGVuZ3RoID4gMCkge1xuICAgICAgZHJhdyhlbnYuc2hhcmVkLmN1cnJlbnQsICcuZGlydHk9dHJ1ZTsnKVxuICAgIH1cbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQkFUQ0ggUFJPQ1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgZnVuY3Rpb24gZW1pdEJhdGNoRHluYW1pY1NoYWRlckJvZHkgKGVudiwgc2NvcGUsIGFyZ3MsIHByb2dyYW0pIHtcbiAgICBlbnYuYmF0Y2hJZCA9ICdhMSdcblxuICAgIGluamVjdEV4dGVuc2lvbnMoZW52LCBzY29wZSlcblxuICAgIGZ1bmN0aW9uIGFsbCAoKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIGVtaXRBdHRyaWJ1dGVzKGVudiwgc2NvcGUsIGFyZ3MsIHByb2dyYW0uYXR0cmlidXRlcywgYWxsKVxuICAgIGVtaXRVbmlmb3JtcyhlbnYsIHNjb3BlLCBhcmdzLCBwcm9ncmFtLnVuaWZvcm1zLCBhbGwpXG4gICAgZW1pdERyYXcoZW52LCBzY29wZSwgc2NvcGUsIGFyZ3MpXG4gIH1cblxuICBmdW5jdGlvbiBlbWl0QmF0Y2hCb2R5IChlbnYsIHNjb3BlLCBhcmdzLCBwcm9ncmFtKSB7XG4gICAgaW5qZWN0RXh0ZW5zaW9ucyhlbnYsIHNjb3BlKVxuXG4gICAgdmFyIGNvbnRleHREeW5hbWljID0gYXJncy5jb250ZXh0RGVwXG5cbiAgICB2YXIgQkFUQ0hfSUQgPSBzY29wZS5kZWYoKVxuICAgIHZhciBQUk9QX0xJU1QgPSAnYTAnXG4gICAgdmFyIE5VTV9QUk9QUyA9ICdhMSdcbiAgICB2YXIgUFJPUFMgPSBzY29wZS5kZWYoKVxuICAgIGVudi5zaGFyZWQucHJvcHMgPSBQUk9QU1xuICAgIGVudi5iYXRjaElkID0gQkFUQ0hfSURcblxuICAgIHZhciBvdXRlciA9IGVudi5zY29wZSgpXG4gICAgdmFyIGlubmVyID0gZW52LnNjb3BlKClcblxuICAgIHNjb3BlKFxuICAgICAgb3V0ZXIuZW50cnksXG4gICAgICAnZm9yKCcsIEJBVENIX0lELCAnPTA7JywgQkFUQ0hfSUQsICc8JywgTlVNX1BST1BTLCAnOysrJywgQkFUQ0hfSUQsICcpeycsXG4gICAgICBQUk9QUywgJz0nLCBQUk9QX0xJU1QsICdbJywgQkFUQ0hfSUQsICddOycsXG4gICAgICBpbm5lcixcbiAgICAgICd9JyxcbiAgICAgIG91dGVyLmV4aXQpXG5cbiAgICBmdW5jdGlvbiBpc0lubmVyRGVmbiAoZGVmbikge1xuICAgICAgcmV0dXJuICgoZGVmbi5jb250ZXh0RGVwICYmIGNvbnRleHREeW5hbWljKSB8fCBkZWZuLnByb3BEZXApXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNPdXRlckRlZm4gKGRlZm4pIHtcbiAgICAgIHJldHVybiAhaXNJbm5lckRlZm4oZGVmbilcbiAgICB9XG5cbiAgICBpZiAoYXJncy5uZWVkc0NvbnRleHQpIHtcbiAgICAgIGVtaXRDb250ZXh0KGVudiwgaW5uZXIsIGFyZ3MuY29udGV4dClcbiAgICB9XG4gICAgaWYgKGFyZ3MubmVlZHNGcmFtZWJ1ZmZlcikge1xuICAgICAgZW1pdFBvbGxGcmFtZWJ1ZmZlcihlbnYsIGlubmVyLCBhcmdzLmZyYW1lYnVmZmVyKVxuICAgIH1cbiAgICBlbWl0U2V0T3B0aW9ucyhlbnYsIGlubmVyLCBhcmdzLnN0YXRlLCBpc0lubmVyRGVmbilcblxuICAgIGlmIChhcmdzLnByb2ZpbGUgJiYgaXNJbm5lckRlZm4oYXJncy5wcm9maWxlKSkge1xuICAgICAgZW1pdFByb2ZpbGUoZW52LCBpbm5lciwgYXJncywgZmFsc2UsIHRydWUpXG4gICAgfVxuXG4gICAgaWYgKCFwcm9ncmFtKSB7XG4gICAgICB2YXIgcHJvZ0NhY2hlID0gZW52Lmdsb2JhbC5kZWYoJ3t9JylcbiAgICAgIHZhciBQUk9HUkFNID0gYXJncy5zaGFkZXIucHJvZ1Zhci5hcHBlbmQoZW52LCBpbm5lcilcbiAgICAgIHZhciBQUk9HX0lEID0gaW5uZXIuZGVmKFBST0dSQU0sICcuaWQnKVxuICAgICAgdmFyIENBQ0hFRF9QUk9DID0gaW5uZXIuZGVmKHByb2dDYWNoZSwgJ1snLCBQUk9HX0lELCAnXScpXG4gICAgICBpbm5lcihcbiAgICAgICAgZW52LnNoYXJlZC5nbCwgJy51c2VQcm9ncmFtKCcsIFBST0dSQU0sICcucHJvZ3JhbSk7JyxcbiAgICAgICAgJ2lmKCEnLCBDQUNIRURfUFJPQywgJyl7JyxcbiAgICAgICAgQ0FDSEVEX1BST0MsICc9JywgcHJvZ0NhY2hlLCAnWycsIFBST0dfSUQsICddPScsXG4gICAgICAgIGVudi5saW5rKGZ1bmN0aW9uIChwcm9ncmFtKSB7XG4gICAgICAgICAgcmV0dXJuIGNyZWF0ZUJvZHkoXG4gICAgICAgICAgICBlbWl0QmF0Y2hEeW5hbWljU2hhZGVyQm9keSwgZW52LCBhcmdzLCBwcm9ncmFtLCAyKVxuICAgICAgICB9KSwgJygnLCBQUk9HUkFNLCAnKTt9JyxcbiAgICAgICAgQ0FDSEVEX1BST0MsICcuY2FsbCh0aGlzLGEwWycsIEJBVENIX0lELCAnXSwnLCBCQVRDSF9JRCwgJyk7JylcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGFyZ3MudXNlVkFPKSB7XG4gICAgICAgIGlmIChhcmdzLmRyYXdWQU8pIHtcbiAgICAgICAgICBpZiAoaXNJbm5lckRlZm4oYXJncy5kcmF3VkFPKSkge1xuICAgICAgICAgICAgLy8gdmFvIGlzIGEgcHJvcFxuICAgICAgICAgICAgaW5uZXIoZW52LnNoYXJlZC52YW8sICcuc2V0VkFPKCcsIGFyZ3MuZHJhd1ZBTy5hcHBlbmQoZW52LCBpbm5lciksICcpOycpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHZhbyBpcyBpbnZhcmlhbnRcbiAgICAgICAgICAgIG91dGVyKGVudi5zaGFyZWQudmFvLCAnLnNldFZBTygnLCBhcmdzLmRyYXdWQU8uYXBwZW5kKGVudiwgb3V0ZXIpLCAnKTsnKVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBzY29wZWQgdmFvIGJpbmRpbmdcbiAgICAgICAgICBvdXRlcihlbnYuc2hhcmVkLnZhbywgJy5zZXRWQU8oJywgZW52LnNoYXJlZC52YW8sICcudGFyZ2V0VkFPKTsnKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXRlcihlbnYuc2hhcmVkLnZhbywgJy5zZXRWQU8obnVsbCk7JylcbiAgICAgICAgZW1pdEF0dHJpYnV0ZXMoZW52LCBvdXRlciwgYXJncywgcHJvZ3JhbS5hdHRyaWJ1dGVzLCBpc091dGVyRGVmbilcbiAgICAgICAgZW1pdEF0dHJpYnV0ZXMoZW52LCBpbm5lciwgYXJncywgcHJvZ3JhbS5hdHRyaWJ1dGVzLCBpc0lubmVyRGVmbilcbiAgICAgIH1cbiAgICAgIGVtaXRVbmlmb3JtcyhlbnYsIG91dGVyLCBhcmdzLCBwcm9ncmFtLnVuaWZvcm1zLCBpc091dGVyRGVmbilcbiAgICAgIGVtaXRVbmlmb3JtcyhlbnYsIGlubmVyLCBhcmdzLCBwcm9ncmFtLnVuaWZvcm1zLCBpc0lubmVyRGVmbilcbiAgICAgIGVtaXREcmF3KGVudiwgb3V0ZXIsIGlubmVyLCBhcmdzKVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGVtaXRCYXRjaFByb2MgKGVudiwgYXJncykge1xuICAgIHZhciBiYXRjaCA9IGVudi5wcm9jKCdiYXRjaCcsIDIpXG4gICAgZW52LmJhdGNoSWQgPSAnMCdcblxuICAgIGluamVjdEV4dGVuc2lvbnMoZW52LCBiYXRjaClcblxuICAgIC8vIENoZWNrIGlmIGFueSBjb250ZXh0IHZhcmlhYmxlcyBkZXBlbmQgb24gcHJvcHNcbiAgICB2YXIgY29udGV4dER5bmFtaWMgPSBmYWxzZVxuICAgIHZhciBuZWVkc0NvbnRleHQgPSB0cnVlXG4gICAgT2JqZWN0LmtleXMoYXJncy5jb250ZXh0KS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICBjb250ZXh0RHluYW1pYyA9IGNvbnRleHREeW5hbWljIHx8IGFyZ3MuY29udGV4dFtuYW1lXS5wcm9wRGVwXG4gICAgfSlcbiAgICBpZiAoIWNvbnRleHREeW5hbWljKSB7XG4gICAgICBlbWl0Q29udGV4dChlbnYsIGJhdGNoLCBhcmdzLmNvbnRleHQpXG4gICAgICBuZWVkc0NvbnRleHQgPSBmYWxzZVxuICAgIH1cblxuICAgIC8vIGZyYW1lYnVmZmVyIHN0YXRlIGFmZmVjdHMgZnJhbWVidWZmZXJXaWR0aC9oZWlnaHQgY29udGV4dCB2YXJzXG4gICAgdmFyIGZyYW1lYnVmZmVyID0gYXJncy5mcmFtZWJ1ZmZlclxuICAgIHZhciBuZWVkc0ZyYW1lYnVmZmVyID0gZmFsc2VcbiAgICBpZiAoZnJhbWVidWZmZXIpIHtcbiAgICAgIGlmIChmcmFtZWJ1ZmZlci5wcm9wRGVwKSB7XG4gICAgICAgIGNvbnRleHREeW5hbWljID0gbmVlZHNGcmFtZWJ1ZmZlciA9IHRydWVcbiAgICAgIH0gZWxzZSBpZiAoZnJhbWVidWZmZXIuY29udGV4dERlcCAmJiBjb250ZXh0RHluYW1pYykge1xuICAgICAgICBuZWVkc0ZyYW1lYnVmZmVyID0gdHJ1ZVxuICAgICAgfVxuICAgICAgaWYgKCFuZWVkc0ZyYW1lYnVmZmVyKSB7XG4gICAgICAgIGVtaXRQb2xsRnJhbWVidWZmZXIoZW52LCBiYXRjaCwgZnJhbWVidWZmZXIpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGVtaXRQb2xsRnJhbWVidWZmZXIoZW52LCBiYXRjaCwgbnVsbClcbiAgICB9XG5cbiAgICAvLyB2aWV3cG9ydCBpcyB3ZWlyZCBiZWNhdXNlIGl0IGNhbiBhZmZlY3QgY29udGV4dCB2YXJzXG4gICAgaWYgKGFyZ3Muc3RhdGUudmlld3BvcnQgJiYgYXJncy5zdGF0ZS52aWV3cG9ydC5wcm9wRGVwKSB7XG4gICAgICBjb250ZXh0RHluYW1pYyA9IHRydWVcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0lubmVyRGVmbiAoZGVmbikge1xuICAgICAgcmV0dXJuIChkZWZuLmNvbnRleHREZXAgJiYgY29udGV4dER5bmFtaWMpIHx8IGRlZm4ucHJvcERlcFxuICAgIH1cblxuICAgIC8vIHNldCB3ZWJnbCBvcHRpb25zXG4gICAgZW1pdFBvbGxTdGF0ZShlbnYsIGJhdGNoLCBhcmdzKVxuICAgIGVtaXRTZXRPcHRpb25zKGVudiwgYmF0Y2gsIGFyZ3Muc3RhdGUsIGZ1bmN0aW9uIChkZWZuKSB7XG4gICAgICByZXR1cm4gIWlzSW5uZXJEZWZuKGRlZm4pXG4gICAgfSlcblxuICAgIGlmICghYXJncy5wcm9maWxlIHx8ICFpc0lubmVyRGVmbihhcmdzLnByb2ZpbGUpKSB7XG4gICAgICBlbWl0UHJvZmlsZShlbnYsIGJhdGNoLCBhcmdzLCBmYWxzZSwgJ2ExJylcbiAgICB9XG5cbiAgICAvLyBTYXZlIHRoZXNlIHZhbHVlcyB0byBhcmdzIHNvIHRoYXQgdGhlIGJhdGNoIGJvZHkgcm91dGluZSBjYW4gdXNlIHRoZW1cbiAgICBhcmdzLmNvbnRleHREZXAgPSBjb250ZXh0RHluYW1pY1xuICAgIGFyZ3MubmVlZHNDb250ZXh0ID0gbmVlZHNDb250ZXh0XG4gICAgYXJncy5uZWVkc0ZyYW1lYnVmZmVyID0gbmVlZHNGcmFtZWJ1ZmZlclxuXG4gICAgLy8gZGV0ZXJtaW5lIGlmIHNoYWRlciBpcyBkeW5hbWljXG4gICAgdmFyIHByb2dEZWZuID0gYXJncy5zaGFkZXIucHJvZ1ZhclxuICAgIGlmICgocHJvZ0RlZm4uY29udGV4dERlcCAmJiBjb250ZXh0RHluYW1pYykgfHwgcHJvZ0RlZm4ucHJvcERlcCkge1xuICAgICAgZW1pdEJhdGNoQm9keShcbiAgICAgICAgZW52LFxuICAgICAgICBiYXRjaCxcbiAgICAgICAgYXJncyxcbiAgICAgICAgbnVsbClcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIFBST0dSQU0gPSBwcm9nRGVmbi5hcHBlbmQoZW52LCBiYXRjaClcbiAgICAgIGJhdGNoKGVudi5zaGFyZWQuZ2wsICcudXNlUHJvZ3JhbSgnLCBQUk9HUkFNLCAnLnByb2dyYW0pOycpXG4gICAgICBpZiAoYXJncy5zaGFkZXIucHJvZ3JhbSkge1xuICAgICAgICBlbWl0QmF0Y2hCb2R5KFxuICAgICAgICAgIGVudixcbiAgICAgICAgICBiYXRjaCxcbiAgICAgICAgICBhcmdzLFxuICAgICAgICAgIGFyZ3Muc2hhZGVyLnByb2dyYW0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBiYXRjaChlbnYuc2hhcmVkLnZhbywgJy5zZXRWQU8obnVsbCk7JylcbiAgICAgICAgdmFyIGJhdGNoQ2FjaGUgPSBlbnYuZ2xvYmFsLmRlZigne30nKVxuICAgICAgICB2YXIgUFJPR19JRCA9IGJhdGNoLmRlZihQUk9HUkFNLCAnLmlkJylcbiAgICAgICAgdmFyIENBQ0hFRF9QUk9DID0gYmF0Y2guZGVmKGJhdGNoQ2FjaGUsICdbJywgUFJPR19JRCwgJ10nKVxuICAgICAgICBiYXRjaChcbiAgICAgICAgICBlbnYuY29uZChDQUNIRURfUFJPQylcbiAgICAgICAgICAgIC50aGVuKENBQ0hFRF9QUk9DLCAnLmNhbGwodGhpcyxhMCxhMSk7JylcbiAgICAgICAgICAgIC5lbHNlKFxuICAgICAgICAgICAgICBDQUNIRURfUFJPQywgJz0nLCBiYXRjaENhY2hlLCAnWycsIFBST0dfSUQsICddPScsXG4gICAgICAgICAgICAgIGVudi5saW5rKGZ1bmN0aW9uIChwcm9ncmFtKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUJvZHkoZW1pdEJhdGNoQm9keSwgZW52LCBhcmdzLCBwcm9ncmFtLCAyKVxuICAgICAgICAgICAgICB9KSwgJygnLCBQUk9HUkFNLCAnKTsnLFxuICAgICAgICAgICAgICBDQUNIRURfUFJPQywgJy5jYWxsKHRoaXMsYTAsYTEpOycpKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChPYmplY3Qua2V5cyhhcmdzLnN0YXRlKS5sZW5ndGggPiAwKSB7XG4gICAgICBiYXRjaChlbnYuc2hhcmVkLmN1cnJlbnQsICcuZGlydHk9dHJ1ZTsnKVxuICAgIH1cbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gU0NPUEUgQ09NTUFORFxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGZ1bmN0aW9uIGVtaXRTY29wZVByb2MgKGVudiwgYXJncykge1xuICAgIHZhciBzY29wZSA9IGVudi5wcm9jKCdzY29wZScsIDMpXG4gICAgZW52LmJhdGNoSWQgPSAnYTInXG5cbiAgICB2YXIgc2hhcmVkID0gZW52LnNoYXJlZFxuICAgIHZhciBDVVJSRU5UX1NUQVRFID0gc2hhcmVkLmN1cnJlbnRcblxuICAgIGVtaXRDb250ZXh0KGVudiwgc2NvcGUsIGFyZ3MuY29udGV4dClcblxuICAgIGlmIChhcmdzLmZyYW1lYnVmZmVyKSB7XG4gICAgICBhcmdzLmZyYW1lYnVmZmVyLmFwcGVuZChlbnYsIHNjb3BlKVxuICAgIH1cblxuICAgIHNvcnRTdGF0ZShPYmplY3Qua2V5cyhhcmdzLnN0YXRlKSkuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgICAgdmFyIGRlZm4gPSBhcmdzLnN0YXRlW25hbWVdXG4gICAgICB2YXIgdmFsdWUgPSBkZWZuLmFwcGVuZChlbnYsIHNjb3BlKVxuICAgICAgaWYgKGlzQXJyYXlMaWtlKHZhbHVlKSkge1xuICAgICAgICB2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uICh2LCBpKSB7XG4gICAgICAgICAgc2NvcGUuc2V0KGVudi5uZXh0W25hbWVdLCAnWycgKyBpICsgJ10nLCB2KVxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2NvcGUuc2V0KHNoYXJlZC5uZXh0LCAnLicgKyBuYW1lLCB2YWx1ZSlcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgZW1pdFByb2ZpbGUoZW52LCBzY29wZSwgYXJncywgdHJ1ZSwgdHJ1ZSlcblxuICAgIDtbU19FTEVNRU5UUywgU19PRkZTRVQsIFNfQ09VTlQsIFNfSU5TVEFOQ0VTLCBTX1BSSU1JVElWRV0uZm9yRWFjaChcbiAgICAgIGZ1bmN0aW9uIChvcHQpIHtcbiAgICAgICAgdmFyIHZhcmlhYmxlID0gYXJncy5kcmF3W29wdF1cbiAgICAgICAgaWYgKCF2YXJpYWJsZSkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIHNjb3BlLnNldChzaGFyZWQuZHJhdywgJy4nICsgb3B0LCAnJyArIHZhcmlhYmxlLmFwcGVuZChlbnYsIHNjb3BlKSlcbiAgICAgIH0pXG5cbiAgICBPYmplY3Qua2V5cyhhcmdzLnVuaWZvcm1zKS5mb3JFYWNoKGZ1bmN0aW9uIChvcHQpIHtcbiAgICAgIHZhciB2YWx1ZSA9IGFyZ3MudW5pZm9ybXNbb3B0XS5hcHBlbmQoZW52LCBzY29wZSlcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICB2YWx1ZSA9ICdbJyArIHZhbHVlLmpvaW4oKSArICddJ1xuICAgICAgfVxuICAgICAgc2NvcGUuc2V0KFxuICAgICAgICBzaGFyZWQudW5pZm9ybXMsXG4gICAgICAgICdbJyArIHN0cmluZ1N0b3JlLmlkKG9wdCkgKyAnXScsXG4gICAgICAgIHZhbHVlKVxuICAgIH0pXG5cbiAgICBPYmplY3Qua2V5cyhhcmdzLmF0dHJpYnV0ZXMpLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgIHZhciByZWNvcmQgPSBhcmdzLmF0dHJpYnV0ZXNbbmFtZV0uYXBwZW5kKGVudiwgc2NvcGUpXG4gICAgICB2YXIgc2NvcGVBdHRyaWIgPSBlbnYuc2NvcGVBdHRyaWIobmFtZSlcbiAgICAgIE9iamVjdC5rZXlzKG5ldyBBdHRyaWJ1dGVSZWNvcmQoKSkuZm9yRWFjaChmdW5jdGlvbiAocHJvcCkge1xuICAgICAgICBzY29wZS5zZXQoc2NvcGVBdHRyaWIsICcuJyArIHByb3AsIHJlY29yZFtwcm9wXSlcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIGlmIChhcmdzLnNjb3BlVkFPKSB7XG4gICAgICBzY29wZS5zZXQoc2hhcmVkLnZhbywgJy50YXJnZXRWQU8nLCBhcmdzLnNjb3BlVkFPLmFwcGVuZChlbnYsIHNjb3BlKSlcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzYXZlU2hhZGVyIChuYW1lKSB7XG4gICAgICB2YXIgc2hhZGVyID0gYXJncy5zaGFkZXJbbmFtZV1cbiAgICAgIGlmIChzaGFkZXIpIHtcbiAgICAgICAgc2NvcGUuc2V0KHNoYXJlZC5zaGFkZXIsICcuJyArIG5hbWUsIHNoYWRlci5hcHBlbmQoZW52LCBzY29wZSkpXG4gICAgICB9XG4gICAgfVxuICAgIHNhdmVTaGFkZXIoU19WRVJUKVxuICAgIHNhdmVTaGFkZXIoU19GUkFHKVxuXG4gICAgaWYgKE9iamVjdC5rZXlzKGFyZ3Muc3RhdGUpLmxlbmd0aCA+IDApIHtcbiAgICAgIHNjb3BlKENVUlJFTlRfU1RBVEUsICcuZGlydHk9dHJ1ZTsnKVxuICAgICAgc2NvcGUuZXhpdChDVVJSRU5UX1NUQVRFLCAnLmRpcnR5PXRydWU7JylcbiAgICB9XG5cbiAgICBzY29wZSgnYTEoJywgZW52LnNoYXJlZC5jb250ZXh0LCAnLGEwLCcsIGVudi5iYXRjaElkLCAnKTsnKVxuICB9XG5cbiAgZnVuY3Rpb24gaXNEeW5hbWljT2JqZWN0IChvYmplY3QpIHtcbiAgICBpZiAodHlwZW9mIG9iamVjdCAhPT0gJ29iamVjdCcgfHwgaXNBcnJheUxpa2Uob2JqZWN0KSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHZhciBwcm9wcyA9IE9iamVjdC5rZXlzKG9iamVjdClcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgKytpKSB7XG4gICAgICBpZiAoZHluYW1pYy5pc0R5bmFtaWMob2JqZWN0W3Byb3BzW2ldXSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBmdW5jdGlvbiBzcGxhdE9iamVjdCAoZW52LCBvcHRpb25zLCBuYW1lKSB7XG4gICAgdmFyIG9iamVjdCA9IG9wdGlvbnMuc3RhdGljW25hbWVdXG4gICAgaWYgKCFvYmplY3QgfHwgIWlzRHluYW1pY09iamVjdChvYmplY3QpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB2YXIgZ2xvYmFscyA9IGVudi5nbG9iYWxcbiAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdClcbiAgICB2YXIgdGhpc0RlcCA9IGZhbHNlXG4gICAgdmFyIGNvbnRleHREZXAgPSBmYWxzZVxuICAgIHZhciBwcm9wRGVwID0gZmFsc2VcbiAgICB2YXIgb2JqZWN0UmVmID0gZW52Lmdsb2JhbC5kZWYoJ3t9JylcbiAgICBrZXlzLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgdmFyIHZhbHVlID0gb2JqZWN0W2tleV1cbiAgICAgIGlmIChkeW5hbWljLmlzRHluYW1pYyh2YWx1ZSkpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHZhbHVlID0gb2JqZWN0W2tleV0gPSBkeW5hbWljLnVuYm94KHZhbHVlKVxuICAgICAgICB9XG4gICAgICAgIHZhciBkZXBzID0gY3JlYXRlRHluYW1pY0RlY2wodmFsdWUsIG51bGwpXG4gICAgICAgIHRoaXNEZXAgPSB0aGlzRGVwIHx8IGRlcHMudGhpc0RlcFxuICAgICAgICBwcm9wRGVwID0gcHJvcERlcCB8fCBkZXBzLnByb3BEZXBcbiAgICAgICAgY29udGV4dERlcCA9IGNvbnRleHREZXAgfHwgZGVwcy5jb250ZXh0RGVwXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBnbG9iYWxzKG9iamVjdFJlZiwgJy4nLCBrZXksICc9JylcbiAgICAgICAgc3dpdGNoICh0eXBlb2YgdmFsdWUpIHtcbiAgICAgICAgICBjYXNlICdudW1iZXInOlxuICAgICAgICAgICAgZ2xvYmFscyh2YWx1ZSlcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgICAgICAgIGdsb2JhbHMoJ1wiJywgdmFsdWUsICdcIicpXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgZ2xvYmFscygnWycsIHZhbHVlLmpvaW4oKSwgJ10nKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgZ2xvYmFscyhlbnYubGluayh2YWx1ZSkpXG4gICAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGdsb2JhbHMoJzsnKVxuICAgICAgfVxuICAgIH0pXG5cbiAgICBmdW5jdGlvbiBhcHBlbmRCbG9jayAoZW52LCBibG9jaykge1xuICAgICAga2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gb2JqZWN0W2tleV1cbiAgICAgICAgaWYgKCFkeW5hbWljLmlzRHluYW1pYyh2YWx1ZSkpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICB2YXIgcmVmID0gZW52Lmludm9rZShibG9jaywgdmFsdWUpXG4gICAgICAgIGJsb2NrKG9iamVjdFJlZiwgJy4nLCBrZXksICc9JywgcmVmLCAnOycpXG4gICAgICB9KVxuICAgIH1cblxuICAgIG9wdGlvbnMuZHluYW1pY1tuYW1lXSA9IG5ldyBkeW5hbWljLkR5bmFtaWNWYXJpYWJsZShEWU5fVEhVTkssIHtcbiAgICAgIHRoaXNEZXA6IHRoaXNEZXAsXG4gICAgICBjb250ZXh0RGVwOiBjb250ZXh0RGVwLFxuICAgICAgcHJvcERlcDogcHJvcERlcCxcbiAgICAgIHJlZjogb2JqZWN0UmVmLFxuICAgICAgYXBwZW5kOiBhcHBlbmRCbG9ja1xuICAgIH0pXG4gICAgZGVsZXRlIG9wdGlvbnMuc3RhdGljW25hbWVdXG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIE1BSU4gRFJBVyBDT01NQU5EXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgZnVuY3Rpb24gY29tcGlsZUNvbW1hbmQgKG9wdGlvbnMsIGF0dHJpYnV0ZXMsIHVuaWZvcm1zLCBjb250ZXh0LCBzdGF0cykge1xuICAgIHZhciBlbnYgPSBjcmVhdGVSRUdMRW52aXJvbm1lbnQoKVxuXG4gICAgLy8gbGluayBzdGF0cywgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGFjY2VzcyBpdCBpbiB0aGUgcHJvZ3JhbS5cbiAgICBlbnYuc3RhdHMgPSBlbnYubGluayhzdGF0cylcblxuICAgIC8vIHNwbGF0IG9wdGlvbnMgYW5kIGF0dHJpYnV0ZXMgdG8gYWxsb3cgZm9yIGR5bmFtaWMgbmVzdGVkIHByb3BlcnRpZXNcbiAgICBPYmplY3Qua2V5cyhhdHRyaWJ1dGVzLnN0YXRpYykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICBzcGxhdE9iamVjdChlbnYsIGF0dHJpYnV0ZXMsIGtleSlcbiAgICB9KVxuICAgIE5FU1RFRF9PUFRJT05TLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgIHNwbGF0T2JqZWN0KGVudiwgb3B0aW9ucywgbmFtZSlcbiAgICB9KVxuXG4gICAgdmFyIGFyZ3MgPSBwYXJzZUFyZ3VtZW50cyhvcHRpb25zLCBhdHRyaWJ1dGVzLCB1bmlmb3JtcywgY29udGV4dCwgZW52KVxuXG4gICAgZW1pdERyYXdQcm9jKGVudiwgYXJncylcbiAgICBlbWl0U2NvcGVQcm9jKGVudiwgYXJncylcbiAgICBlbWl0QmF0Y2hQcm9jKGVudiwgYXJncylcblxuICAgIHJldHVybiBleHRlbmQoZW52LmNvbXBpbGUoKSwge1xuICAgICAgZGVzdHJveTogZnVuY3Rpb24gKCkge1xuICAgICAgICBhcmdzLnNoYWRlci5wcm9ncmFtLmRlc3Ryb3koKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFBPTEwgLyBSRUZSRVNIXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgcmV0dXJuIHtcbiAgICBuZXh0OiBuZXh0U3RhdGUsXG4gICAgY3VycmVudDogY3VycmVudFN0YXRlLFxuICAgIHByb2NzOiAoZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGVudiA9IGNyZWF0ZVJFR0xFbnZpcm9ubWVudCgpXG4gICAgICB2YXIgcG9sbCA9IGVudi5wcm9jKCdwb2xsJylcbiAgICAgIHZhciByZWZyZXNoID0gZW52LnByb2MoJ3JlZnJlc2gnKVxuICAgICAgdmFyIGNvbW1vbiA9IGVudi5ibG9jaygpXG4gICAgICBwb2xsKGNvbW1vbilcbiAgICAgIHJlZnJlc2goY29tbW9uKVxuXG4gICAgICB2YXIgc2hhcmVkID0gZW52LnNoYXJlZFxuICAgICAgdmFyIEdMID0gc2hhcmVkLmdsXG4gICAgICB2YXIgTkVYVF9TVEFURSA9IHNoYXJlZC5uZXh0XG4gICAgICB2YXIgQ1VSUkVOVF9TVEFURSA9IHNoYXJlZC5jdXJyZW50XG5cbiAgICAgIGNvbW1vbihDVVJSRU5UX1NUQVRFLCAnLmRpcnR5PWZhbHNlOycpXG5cbiAgICAgIGVtaXRQb2xsRnJhbWVidWZmZXIoZW52LCBwb2xsKVxuICAgICAgZW1pdFBvbGxGcmFtZWJ1ZmZlcihlbnYsIHJlZnJlc2gsIG51bGwsIHRydWUpXG5cbiAgICAgIC8vIFJlZnJlc2ggdXBkYXRlcyBhbGwgYXR0cmlidXRlIHN0YXRlIGNoYW5nZXNcbiAgICAgIHZhciBJTlNUQU5DSU5HXG4gICAgICBpZiAoZXh0SW5zdGFuY2luZykge1xuICAgICAgICBJTlNUQU5DSU5HID0gZW52LmxpbmsoZXh0SW5zdGFuY2luZylcbiAgICAgIH1cblxuICAgICAgLy8gdXBkYXRlIHZlcnRleCBhcnJheSBiaW5kaW5nc1xuICAgICAgaWYgKGV4dGVuc2lvbnMub2VzX3ZlcnRleF9hcnJheV9vYmplY3QpIHtcbiAgICAgICAgcmVmcmVzaChlbnYubGluayhleHRlbnNpb25zLm9lc192ZXJ0ZXhfYXJyYXlfb2JqZWN0KSwgJy5iaW5kVmVydGV4QXJyYXlPRVMobnVsbCk7JylcbiAgICAgIH1cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGltaXRzLm1heEF0dHJpYnV0ZXM7ICsraSkge1xuICAgICAgICB2YXIgQklORElORyA9IHJlZnJlc2guZGVmKHNoYXJlZC5hdHRyaWJ1dGVzLCAnWycsIGksICddJylcbiAgICAgICAgdmFyIGlmdGUgPSBlbnYuY29uZChCSU5ESU5HLCAnLmJ1ZmZlcicpXG4gICAgICAgIGlmdGUudGhlbihcbiAgICAgICAgICBHTCwgJy5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSgnLCBpLCAnKTsnLFxuICAgICAgICAgIEdMLCAnLmJpbmRCdWZmZXIoJyxcbiAgICAgICAgICBHTF9BUlJBWV9CVUZGRVIkMiwgJywnLFxuICAgICAgICAgIEJJTkRJTkcsICcuYnVmZmVyLmJ1ZmZlcik7JyxcbiAgICAgICAgICBHTCwgJy52ZXJ0ZXhBdHRyaWJQb2ludGVyKCcsXG4gICAgICAgICAgaSwgJywnLFxuICAgICAgICAgIEJJTkRJTkcsICcuc2l6ZSwnLFxuICAgICAgICAgIEJJTkRJTkcsICcudHlwZSwnLFxuICAgICAgICAgIEJJTkRJTkcsICcubm9ybWFsaXplZCwnLFxuICAgICAgICAgIEJJTkRJTkcsICcuc3RyaWRlLCcsXG4gICAgICAgICAgQklORElORywgJy5vZmZzZXQpOydcbiAgICAgICAgKS5lbHNlKFxuICAgICAgICAgIEdMLCAnLmRpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheSgnLCBpLCAnKTsnLFxuICAgICAgICAgIEdMLCAnLnZlcnRleEF0dHJpYjRmKCcsXG4gICAgICAgICAgaSwgJywnLFxuICAgICAgICAgIEJJTkRJTkcsICcueCwnLFxuICAgICAgICAgIEJJTkRJTkcsICcueSwnLFxuICAgICAgICAgIEJJTkRJTkcsICcueiwnLFxuICAgICAgICAgIEJJTkRJTkcsICcudyk7JyxcbiAgICAgICAgICBCSU5ESU5HLCAnLmJ1ZmZlcj1udWxsOycpXG4gICAgICAgIHJlZnJlc2goaWZ0ZSlcbiAgICAgICAgaWYgKGV4dEluc3RhbmNpbmcpIHtcbiAgICAgICAgICByZWZyZXNoKFxuICAgICAgICAgICAgSU5TVEFOQ0lORywgJy52ZXJ0ZXhBdHRyaWJEaXZpc29yQU5HTEUoJyxcbiAgICAgICAgICAgIGksICcsJyxcbiAgICAgICAgICAgIEJJTkRJTkcsICcuZGl2aXNvcik7JylcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmVmcmVzaChcbiAgICAgICAgZW52LnNoYXJlZC52YW8sICcuY3VycmVudFZBTz1udWxsOycsXG4gICAgICAgIGVudi5zaGFyZWQudmFvLCAnLnNldFZBTygnLCBlbnYuc2hhcmVkLnZhbywgJy50YXJnZXRWQU8pOycpXG5cbiAgICAgIE9iamVjdC5rZXlzKEdMX0ZMQUdTKS5mb3JFYWNoKGZ1bmN0aW9uIChmbGFnKSB7XG4gICAgICAgIHZhciBjYXAgPSBHTF9GTEFHU1tmbGFnXVxuICAgICAgICB2YXIgTkVYVCA9IGNvbW1vbi5kZWYoTkVYVF9TVEFURSwgJy4nLCBmbGFnKVxuICAgICAgICB2YXIgYmxvY2sgPSBlbnYuYmxvY2soKVxuICAgICAgICBibG9jaygnaWYoJywgTkVYVCwgJyl7JyxcbiAgICAgICAgICBHTCwgJy5lbmFibGUoJywgY2FwLCAnKX1lbHNleycsXG4gICAgICAgICAgR0wsICcuZGlzYWJsZSgnLCBjYXAsICcpfScsXG4gICAgICAgICAgQ1VSUkVOVF9TVEFURSwgJy4nLCBmbGFnLCAnPScsIE5FWFQsICc7JylcbiAgICAgICAgcmVmcmVzaChibG9jaylcbiAgICAgICAgcG9sbChcbiAgICAgICAgICAnaWYoJywgTkVYVCwgJyE9PScsIENVUlJFTlRfU1RBVEUsICcuJywgZmxhZywgJyl7JyxcbiAgICAgICAgICBibG9jayxcbiAgICAgICAgICAnfScpXG4gICAgICB9KVxuXG4gICAgICBPYmplY3Qua2V5cyhHTF9WQVJJQUJMRVMpLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgdmFyIGZ1bmMgPSBHTF9WQVJJQUJMRVNbbmFtZV1cbiAgICAgICAgdmFyIGluaXQgPSBjdXJyZW50U3RhdGVbbmFtZV1cbiAgICAgICAgdmFyIE5FWFQsIENVUlJFTlRcbiAgICAgICAgdmFyIGJsb2NrID0gZW52LmJsb2NrKClcbiAgICAgICAgYmxvY2soR0wsICcuJywgZnVuYywgJygnKVxuICAgICAgICBpZiAoaXNBcnJheUxpa2UoaW5pdCkpIHtcbiAgICAgICAgICB2YXIgbiA9IGluaXQubGVuZ3RoXG4gICAgICAgICAgTkVYVCA9IGVudi5nbG9iYWwuZGVmKE5FWFRfU1RBVEUsICcuJywgbmFtZSlcbiAgICAgICAgICBDVVJSRU5UID0gZW52Lmdsb2JhbC5kZWYoQ1VSUkVOVF9TVEFURSwgJy4nLCBuYW1lKVxuICAgICAgICAgIGJsb2NrKFxuICAgICAgICAgICAgbG9vcChuLCBmdW5jdGlvbiAoaSkge1xuICAgICAgICAgICAgICByZXR1cm4gTkVYVCArICdbJyArIGkgKyAnXSdcbiAgICAgICAgICAgIH0pLCAnKTsnLFxuICAgICAgICAgICAgbG9vcChuLCBmdW5jdGlvbiAoaSkge1xuICAgICAgICAgICAgICByZXR1cm4gQ1VSUkVOVCArICdbJyArIGkgKyAnXT0nICsgTkVYVCArICdbJyArIGkgKyAnXTsnXG4gICAgICAgICAgICB9KS5qb2luKCcnKSlcbiAgICAgICAgICBwb2xsKFxuICAgICAgICAgICAgJ2lmKCcsIGxvb3AobiwgZnVuY3Rpb24gKGkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIE5FWFQgKyAnWycgKyBpICsgJ10hPT0nICsgQ1VSUkVOVCArICdbJyArIGkgKyAnXSdcbiAgICAgICAgICAgIH0pLmpvaW4oJ3x8JyksICcpeycsXG4gICAgICAgICAgICBibG9jayxcbiAgICAgICAgICAgICd9JylcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBORVhUID0gY29tbW9uLmRlZihORVhUX1NUQVRFLCAnLicsIG5hbWUpXG4gICAgICAgICAgQ1VSUkVOVCA9IGNvbW1vbi5kZWYoQ1VSUkVOVF9TVEFURSwgJy4nLCBuYW1lKVxuICAgICAgICAgIGJsb2NrKFxuICAgICAgICAgICAgTkVYVCwgJyk7JyxcbiAgICAgICAgICAgIENVUlJFTlRfU1RBVEUsICcuJywgbmFtZSwgJz0nLCBORVhULCAnOycpXG4gICAgICAgICAgcG9sbChcbiAgICAgICAgICAgICdpZignLCBORVhULCAnIT09JywgQ1VSUkVOVCwgJyl7JyxcbiAgICAgICAgICAgIGJsb2NrLFxuICAgICAgICAgICAgJ30nKVxuICAgICAgICB9XG4gICAgICAgIHJlZnJlc2goYmxvY2spXG4gICAgICB9KVxuXG4gICAgICByZXR1cm4gZW52LmNvbXBpbGUoKVxuICAgIH0pKCksXG4gICAgY29tcGlsZTogY29tcGlsZUNvbW1hbmRcbiAgfVxufVxuXG5mdW5jdGlvbiBzdGF0cyAoKSB7XG4gIHJldHVybiB7XG4gICAgdmFvQ291bnQ6IDAsXG4gICAgYnVmZmVyQ291bnQ6IDAsXG4gICAgZWxlbWVudHNDb3VudDogMCxcbiAgICBmcmFtZWJ1ZmZlckNvdW50OiAwLFxuICAgIHNoYWRlckNvdW50OiAwLFxuICAgIHRleHR1cmVDb3VudDogMCxcbiAgICBjdWJlQ291bnQ6IDAsXG4gICAgcmVuZGVyYnVmZmVyQ291bnQ6IDAsXG4gICAgbWF4VGV4dHVyZVVuaXRzOiAwXG4gIH1cbn1cblxudmFyIEdMX1FVRVJZX1JFU1VMVF9FWFQgPSAweDg4NjZcbnZhciBHTF9RVUVSWV9SRVNVTFRfQVZBSUxBQkxFX0VYVCA9IDB4ODg2N1xudmFyIEdMX1RJTUVfRUxBUFNFRF9FWFQgPSAweDg4QkZcblxudmFyIGNyZWF0ZVRpbWVyID0gZnVuY3Rpb24gKGdsLCBleHRlbnNpb25zKSB7XG4gIGlmICghZXh0ZW5zaW9ucy5leHRfZGlzam9pbnRfdGltZXJfcXVlcnkpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgLy8gUVVFUlkgUE9PTCBCRUdJTlxuICB2YXIgcXVlcnlQb29sID0gW11cbiAgZnVuY3Rpb24gYWxsb2NRdWVyeSAoKSB7XG4gICAgcmV0dXJuIHF1ZXJ5UG9vbC5wb3AoKSB8fCBleHRlbnNpb25zLmV4dF9kaXNqb2ludF90aW1lcl9xdWVyeS5jcmVhdGVRdWVyeUVYVCgpXG4gIH1cbiAgZnVuY3Rpb24gZnJlZVF1ZXJ5IChxdWVyeSkge1xuICAgIHF1ZXJ5UG9vbC5wdXNoKHF1ZXJ5KVxuICB9XG4gIC8vIFFVRVJZIFBPT0wgRU5EXG5cbiAgdmFyIHBlbmRpbmdRdWVyaWVzID0gW11cbiAgZnVuY3Rpb24gYmVnaW5RdWVyeSAoc3RhdHMpIHtcbiAgICB2YXIgcXVlcnkgPSBhbGxvY1F1ZXJ5KClcbiAgICBleHRlbnNpb25zLmV4dF9kaXNqb2ludF90aW1lcl9xdWVyeS5iZWdpblF1ZXJ5RVhUKEdMX1RJTUVfRUxBUFNFRF9FWFQsIHF1ZXJ5KVxuICAgIHBlbmRpbmdRdWVyaWVzLnB1c2gocXVlcnkpXG4gICAgcHVzaFNjb3BlU3RhdHMocGVuZGluZ1F1ZXJpZXMubGVuZ3RoIC0gMSwgcGVuZGluZ1F1ZXJpZXMubGVuZ3RoLCBzdGF0cylcbiAgfVxuXG4gIGZ1bmN0aW9uIGVuZFF1ZXJ5ICgpIHtcbiAgICBleHRlbnNpb25zLmV4dF9kaXNqb2ludF90aW1lcl9xdWVyeS5lbmRRdWVyeUVYVChHTF9USU1FX0VMQVBTRURfRVhUKVxuICB9XG5cbiAgLy9cbiAgLy8gUGVuZGluZyBzdGF0cyBwb29sLlxuICAvL1xuICBmdW5jdGlvbiBQZW5kaW5nU3RhdHMgKCkge1xuICAgIHRoaXMuc3RhcnRRdWVyeUluZGV4ID0gLTFcbiAgICB0aGlzLmVuZFF1ZXJ5SW5kZXggPSAtMVxuICAgIHRoaXMuc3VtID0gMFxuICAgIHRoaXMuc3RhdHMgPSBudWxsXG4gIH1cbiAgdmFyIHBlbmRpbmdTdGF0c1Bvb2wgPSBbXVxuICBmdW5jdGlvbiBhbGxvY1BlbmRpbmdTdGF0cyAoKSB7XG4gICAgcmV0dXJuIHBlbmRpbmdTdGF0c1Bvb2wucG9wKCkgfHwgbmV3IFBlbmRpbmdTdGF0cygpXG4gIH1cbiAgZnVuY3Rpb24gZnJlZVBlbmRpbmdTdGF0cyAocGVuZGluZ1N0YXRzKSB7XG4gICAgcGVuZGluZ1N0YXRzUG9vbC5wdXNoKHBlbmRpbmdTdGF0cylcbiAgfVxuICAvLyBQZW5kaW5nIHN0YXRzIHBvb2wgZW5kXG5cbiAgdmFyIHBlbmRpbmdTdGF0cyA9IFtdXG4gIGZ1bmN0aW9uIHB1c2hTY29wZVN0YXRzIChzdGFydCwgZW5kLCBzdGF0cykge1xuICAgIHZhciBwcyA9IGFsbG9jUGVuZGluZ1N0YXRzKClcbiAgICBwcy5zdGFydFF1ZXJ5SW5kZXggPSBzdGFydFxuICAgIHBzLmVuZFF1ZXJ5SW5kZXggPSBlbmRcbiAgICBwcy5zdW0gPSAwXG4gICAgcHMuc3RhdHMgPSBzdGF0c1xuICAgIHBlbmRpbmdTdGF0cy5wdXNoKHBzKVxuICB9XG5cbiAgLy8gd2Ugc2hvdWxkIGNhbGwgdGhpcyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmcmFtZSxcbiAgLy8gaW4gb3JkZXIgdG8gdXBkYXRlIGdwdVRpbWVcbiAgdmFyIHRpbWVTdW0gPSBbXVxuICB2YXIgcXVlcnlQdHIgPSBbXVxuICBmdW5jdGlvbiB1cGRhdGUgKCkge1xuICAgIHZhciBwdHIsIGlcblxuICAgIHZhciBuID0gcGVuZGluZ1F1ZXJpZXMubGVuZ3RoXG4gICAgaWYgKG4gPT09IDApIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIFJlc2VydmUgc3BhY2VcbiAgICBxdWVyeVB0ci5sZW5ndGggPSBNYXRoLm1heChxdWVyeVB0ci5sZW5ndGgsIG4gKyAxKVxuICAgIHRpbWVTdW0ubGVuZ3RoID0gTWF0aC5tYXgodGltZVN1bS5sZW5ndGgsIG4gKyAxKVxuICAgIHRpbWVTdW1bMF0gPSAwXG4gICAgcXVlcnlQdHJbMF0gPSAwXG5cbiAgICAvLyBVcGRhdGUgYWxsIHBlbmRpbmcgdGltZXIgcXVlcmllc1xuICAgIHZhciBxdWVyeVRpbWUgPSAwXG4gICAgcHRyID0gMFxuICAgIGZvciAoaSA9IDA7IGkgPCBwZW5kaW5nUXVlcmllcy5sZW5ndGg7ICsraSkge1xuICAgICAgdmFyIHF1ZXJ5ID0gcGVuZGluZ1F1ZXJpZXNbaV1cbiAgICAgIGlmIChleHRlbnNpb25zLmV4dF9kaXNqb2ludF90aW1lcl9xdWVyeS5nZXRRdWVyeU9iamVjdEVYVChxdWVyeSwgR0xfUVVFUllfUkVTVUxUX0FWQUlMQUJMRV9FWFQpKSB7XG4gICAgICAgIHF1ZXJ5VGltZSArPSBleHRlbnNpb25zLmV4dF9kaXNqb2ludF90aW1lcl9xdWVyeS5nZXRRdWVyeU9iamVjdEVYVChxdWVyeSwgR0xfUVVFUllfUkVTVUxUX0VYVClcbiAgICAgICAgZnJlZVF1ZXJ5KHF1ZXJ5KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVuZGluZ1F1ZXJpZXNbcHRyKytdID0gcXVlcnlcbiAgICAgIH1cbiAgICAgIHRpbWVTdW1baSArIDFdID0gcXVlcnlUaW1lXG4gICAgICBxdWVyeVB0cltpICsgMV0gPSBwdHJcbiAgICB9XG4gICAgcGVuZGluZ1F1ZXJpZXMubGVuZ3RoID0gcHRyXG5cbiAgICAvLyBVcGRhdGUgYWxsIHBlbmRpbmcgc3RhdCBxdWVyaWVzXG4gICAgcHRyID0gMFxuICAgIGZvciAoaSA9IDA7IGkgPCBwZW5kaW5nU3RhdHMubGVuZ3RoOyArK2kpIHtcbiAgICAgIHZhciBzdGF0cyA9IHBlbmRpbmdTdGF0c1tpXVxuICAgICAgdmFyIHN0YXJ0ID0gc3RhdHMuc3RhcnRRdWVyeUluZGV4XG4gICAgICB2YXIgZW5kID0gc3RhdHMuZW5kUXVlcnlJbmRleFxuICAgICAgc3RhdHMuc3VtICs9IHRpbWVTdW1bZW5kXSAtIHRpbWVTdW1bc3RhcnRdXG4gICAgICB2YXIgc3RhcnRQdHIgPSBxdWVyeVB0cltzdGFydF1cbiAgICAgIHZhciBlbmRQdHIgPSBxdWVyeVB0cltlbmRdXG4gICAgICBpZiAoZW5kUHRyID09PSBzdGFydFB0cikge1xuICAgICAgICBzdGF0cy5zdGF0cy5ncHVUaW1lICs9IHN0YXRzLnN1bSAvIDFlNlxuICAgICAgICBmcmVlUGVuZGluZ1N0YXRzKHN0YXRzKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhdHMuc3RhcnRRdWVyeUluZGV4ID0gc3RhcnRQdHJcbiAgICAgICAgc3RhdHMuZW5kUXVlcnlJbmRleCA9IGVuZFB0clxuICAgICAgICBwZW5kaW5nU3RhdHNbcHRyKytdID0gc3RhdHNcbiAgICAgIH1cbiAgICB9XG4gICAgcGVuZGluZ1N0YXRzLmxlbmd0aCA9IHB0clxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBiZWdpblF1ZXJ5OiBiZWdpblF1ZXJ5LFxuICAgIGVuZFF1ZXJ5OiBlbmRRdWVyeSxcbiAgICBwdXNoU2NvcGVTdGF0czogcHVzaFNjb3BlU3RhdHMsXG4gICAgdXBkYXRlOiB1cGRhdGUsXG4gICAgZ2V0TnVtUGVuZGluZ1F1ZXJpZXM6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBwZW5kaW5nUXVlcmllcy5sZW5ndGhcbiAgICB9LFxuICAgIGNsZWFyOiBmdW5jdGlvbiAoKSB7XG4gICAgICBxdWVyeVBvb2wucHVzaC5hcHBseShxdWVyeVBvb2wsIHBlbmRpbmdRdWVyaWVzKVxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBxdWVyeVBvb2wubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZXh0ZW5zaW9ucy5leHRfZGlzam9pbnRfdGltZXJfcXVlcnkuZGVsZXRlUXVlcnlFWFQocXVlcnlQb29sW2ldKVxuICAgICAgfVxuICAgICAgcGVuZGluZ1F1ZXJpZXMubGVuZ3RoID0gMFxuICAgICAgcXVlcnlQb29sLmxlbmd0aCA9IDBcbiAgICB9LFxuICAgIHJlc3RvcmU6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHBlbmRpbmdRdWVyaWVzLmxlbmd0aCA9IDBcbiAgICAgIHF1ZXJ5UG9vbC5sZW5ndGggPSAwXG4gICAgfVxuICB9XG59XG5cbnZhciBHTF9DT0xPUl9CVUZGRVJfQklUID0gMTYzODRcbnZhciBHTF9ERVBUSF9CVUZGRVJfQklUID0gMjU2XG52YXIgR0xfU1RFTkNJTF9CVUZGRVJfQklUID0gMTAyNFxuXG52YXIgR0xfQVJSQVlfQlVGRkVSID0gMzQ5NjJcblxudmFyIENPTlRFWFRfTE9TVF9FVkVOVCA9ICd3ZWJnbGNvbnRleHRsb3N0J1xudmFyIENPTlRFWFRfUkVTVE9SRURfRVZFTlQgPSAnd2ViZ2xjb250ZXh0cmVzdG9yZWQnXG5cbnZhciBEWU5fUFJPUCA9IDFcbnZhciBEWU5fQ09OVEVYVCA9IDJcbnZhciBEWU5fU1RBVEUgPSAzXG5cbmZ1bmN0aW9uIGZpbmQgKGhheXN0YWNrLCBuZWVkbGUpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBoYXlzdGFjay5sZW5ndGg7ICsraSkge1xuICAgIGlmIChoYXlzdGFja1tpXSA9PT0gbmVlZGxlKSB7XG4gICAgICByZXR1cm4gaVxuICAgIH1cbiAgfVxuICByZXR1cm4gLTFcbn1cblxuZnVuY3Rpb24gd3JhcFJFR0wgKGFyZ3MpIHtcbiAgdmFyIGNvbmZpZyA9IHBhcnNlQXJncyhhcmdzKVxuICBpZiAoIWNvbmZpZykge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICB2YXIgZ2wgPSBjb25maWcuZ2xcbiAgdmFyIGdsQXR0cmlidXRlcyA9IGdsLmdldENvbnRleHRBdHRyaWJ1dGVzKClcbiAgdmFyIGNvbnRleHRMb3N0ID0gZ2wuaXNDb250ZXh0TG9zdCgpXG5cbiAgdmFyIGV4dGVuc2lvblN0YXRlID0gY3JlYXRlRXh0ZW5zaW9uQ2FjaGUoZ2wsIGNvbmZpZylcbiAgaWYgKCFleHRlbnNpb25TdGF0ZSkge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICB2YXIgc3RyaW5nU3RvcmUgPSBjcmVhdGVTdHJpbmdTdG9yZSgpXG4gIHZhciBzdGF0cyQkMSA9IHN0YXRzKClcbiAgdmFyIGV4dGVuc2lvbnMgPSBleHRlbnNpb25TdGF0ZS5leHRlbnNpb25zXG4gIHZhciB0aW1lciA9IGNyZWF0ZVRpbWVyKGdsLCBleHRlbnNpb25zKVxuXG4gIHZhciBTVEFSVF9USU1FID0gY2xvY2soKVxuICB2YXIgV0lEVEggPSBnbC5kcmF3aW5nQnVmZmVyV2lkdGhcbiAgdmFyIEhFSUdIVCA9IGdsLmRyYXdpbmdCdWZmZXJIZWlnaHRcblxuICB2YXIgY29udGV4dFN0YXRlID0ge1xuICAgIHRpY2s6IDAsXG4gICAgdGltZTogMCxcbiAgICB2aWV3cG9ydFdpZHRoOiBXSURUSCxcbiAgICB2aWV3cG9ydEhlaWdodDogSEVJR0hULFxuICAgIGZyYW1lYnVmZmVyV2lkdGg6IFdJRFRILFxuICAgIGZyYW1lYnVmZmVySGVpZ2h0OiBIRUlHSFQsXG4gICAgZHJhd2luZ0J1ZmZlcldpZHRoOiBXSURUSCxcbiAgICBkcmF3aW5nQnVmZmVySGVpZ2h0OiBIRUlHSFQsXG4gICAgcGl4ZWxSYXRpbzogY29uZmlnLnBpeGVsUmF0aW9cbiAgfVxuICB2YXIgdW5pZm9ybVN0YXRlID0ge31cbiAgdmFyIGRyYXdTdGF0ZSA9IHtcbiAgICBlbGVtZW50czogbnVsbCxcbiAgICBwcmltaXRpdmU6IDQsIC8vIEdMX1RSSUFOR0xFU1xuICAgIGNvdW50OiAtMSxcbiAgICBvZmZzZXQ6IDAsXG4gICAgaW5zdGFuY2VzOiAtMVxuICB9XG5cbiAgdmFyIGxpbWl0cyA9IHdyYXBMaW1pdHMoZ2wsIGV4dGVuc2lvbnMpXG4gIHZhciBidWZmZXJTdGF0ZSA9IHdyYXBCdWZmZXJTdGF0ZShcbiAgICBnbCxcbiAgICBzdGF0cyQkMSxcbiAgICBjb25maWcsXG4gICAgZGVzdHJveUJ1ZmZlcilcbiAgdmFyIGF0dHJpYnV0ZVN0YXRlID0gd3JhcEF0dHJpYnV0ZVN0YXRlKFxuICAgIGdsLFxuICAgIGV4dGVuc2lvbnMsXG4gICAgbGltaXRzLFxuICAgIHN0YXRzJCQxLFxuICAgIGJ1ZmZlclN0YXRlKVxuICBmdW5jdGlvbiBkZXN0cm95QnVmZmVyIChidWZmZXIpIHtcbiAgICByZXR1cm4gYXR0cmlidXRlU3RhdGUuZGVzdHJveUJ1ZmZlcihidWZmZXIpXG4gIH1cbiAgdmFyIGVsZW1lbnRTdGF0ZSA9IHdyYXBFbGVtZW50c1N0YXRlKGdsLCBleHRlbnNpb25zLCBidWZmZXJTdGF0ZSwgc3RhdHMkJDEpXG4gIHZhciBzaGFkZXJTdGF0ZSA9IHdyYXBTaGFkZXJTdGF0ZShnbCwgc3RyaW5nU3RvcmUsIHN0YXRzJCQxLCBjb25maWcpXG4gIHZhciB0ZXh0dXJlU3RhdGUgPSBjcmVhdGVUZXh0dXJlU2V0KFxuICAgIGdsLFxuICAgIGV4dGVuc2lvbnMsXG4gICAgbGltaXRzLFxuICAgIGZ1bmN0aW9uICgpIHsgY29yZS5wcm9jcy5wb2xsKCkgfSxcbiAgICBjb250ZXh0U3RhdGUsXG4gICAgc3RhdHMkJDEsXG4gICAgY29uZmlnKVxuICB2YXIgcmVuZGVyYnVmZmVyU3RhdGUgPSB3cmFwUmVuZGVyYnVmZmVycyhnbCwgZXh0ZW5zaW9ucywgbGltaXRzLCBzdGF0cyQkMSwgY29uZmlnKVxuICB2YXIgZnJhbWVidWZmZXJTdGF0ZSA9IHdyYXBGQk9TdGF0ZShcbiAgICBnbCxcbiAgICBleHRlbnNpb25zLFxuICAgIGxpbWl0cyxcbiAgICB0ZXh0dXJlU3RhdGUsXG4gICAgcmVuZGVyYnVmZmVyU3RhdGUsXG4gICAgc3RhdHMkJDEpXG4gIHZhciBjb3JlID0gcmVnbENvcmUoXG4gICAgZ2wsXG4gICAgc3RyaW5nU3RvcmUsXG4gICAgZXh0ZW5zaW9ucyxcbiAgICBsaW1pdHMsXG4gICAgYnVmZmVyU3RhdGUsXG4gICAgZWxlbWVudFN0YXRlLFxuICAgIHRleHR1cmVTdGF0ZSxcbiAgICBmcmFtZWJ1ZmZlclN0YXRlLFxuICAgIHVuaWZvcm1TdGF0ZSxcbiAgICBhdHRyaWJ1dGVTdGF0ZSxcbiAgICBzaGFkZXJTdGF0ZSxcbiAgICBkcmF3U3RhdGUsXG4gICAgY29udGV4dFN0YXRlLFxuICAgIHRpbWVyLFxuICAgIGNvbmZpZylcbiAgdmFyIHJlYWRQaXhlbHMgPSB3cmFwUmVhZFBpeGVscyhcbiAgICBnbCxcbiAgICBmcmFtZWJ1ZmZlclN0YXRlLFxuICAgIGNvcmUucHJvY3MucG9sbCxcbiAgICBjb250ZXh0U3RhdGUsXG4gICAgZ2xBdHRyaWJ1dGVzLCBleHRlbnNpb25zLCBsaW1pdHMpXG5cbiAgdmFyIG5leHRTdGF0ZSA9IGNvcmUubmV4dFxuICB2YXIgY2FudmFzID0gZ2wuY2FudmFzXG5cbiAgdmFyIHJhZkNhbGxiYWNrcyA9IFtdXG4gIHZhciBsb3NzQ2FsbGJhY2tzID0gW11cbiAgdmFyIHJlc3RvcmVDYWxsYmFja3MgPSBbXVxuICB2YXIgZGVzdHJveUNhbGxiYWNrcyA9IFtjb25maWcub25EZXN0cm95XVxuXG4gIHZhciBhY3RpdmVSQUYgPSBudWxsXG4gIGZ1bmN0aW9uIGhhbmRsZVJBRiAoKSB7XG4gICAgaWYgKHJhZkNhbGxiYWNrcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGlmICh0aW1lcikge1xuICAgICAgICB0aW1lci51cGRhdGUoKVxuICAgICAgfVxuICAgICAgYWN0aXZlUkFGID0gbnVsbFxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gc2NoZWR1bGUgbmV4dCBhbmltYXRpb24gZnJhbWVcbiAgICBhY3RpdmVSQUYgPSByYWYubmV4dChoYW5kbGVSQUYpXG5cbiAgICAvLyBwb2xsIGZvciBjaGFuZ2VzXG4gICAgcG9sbCgpXG5cbiAgICAvLyBmaXJlIGEgY2FsbGJhY2sgZm9yIGFsbCBwZW5kaW5nIHJhZnNcbiAgICBmb3IgKHZhciBpID0gcmFmQ2FsbGJhY2tzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICB2YXIgY2IgPSByYWZDYWxsYmFja3NbaV1cbiAgICAgIGlmIChjYikge1xuICAgICAgICBjYihjb250ZXh0U3RhdGUsIG51bGwsIDApXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gZmx1c2ggYWxsIHBlbmRpbmcgd2ViZ2wgY2FsbHNcbiAgICBnbC5mbHVzaCgpXG5cbiAgICAvLyBwb2xsIEdQVSB0aW1lcnMgKmFmdGVyKiBnbC5mbHVzaCBzbyB3ZSBkb24ndCBkZWxheSBjb21tYW5kIGRpc3BhdGNoXG4gICAgaWYgKHRpbWVyKSB7XG4gICAgICB0aW1lci51cGRhdGUoKVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHN0YXJ0UkFGICgpIHtcbiAgICBpZiAoIWFjdGl2ZVJBRiAmJiByYWZDYWxsYmFja3MubGVuZ3RoID4gMCkge1xuICAgICAgYWN0aXZlUkFGID0gcmFmLm5leHQoaGFuZGxlUkFGKVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHN0b3BSQUYgKCkge1xuICAgIGlmIChhY3RpdmVSQUYpIHtcbiAgICAgIHJhZi5jYW5jZWwoaGFuZGxlUkFGKVxuICAgICAgYWN0aXZlUkFGID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGhhbmRsZUNvbnRleHRMb3NzIChldmVudCkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcblxuICAgIC8vIHNldCBjb250ZXh0IGxvc3QgZmxhZ1xuICAgIGNvbnRleHRMb3N0ID0gdHJ1ZVxuXG4gICAgLy8gcGF1c2UgcmVxdWVzdCBhbmltYXRpb24gZnJhbWVcbiAgICBzdG9wUkFGKClcblxuICAgIC8vIGxvc2UgY29udGV4dFxuICAgIGxvc3NDYWxsYmFja3MuZm9yRWFjaChmdW5jdGlvbiAoY2IpIHtcbiAgICAgIGNiKClcbiAgICB9KVxuICB9XG5cbiAgZnVuY3Rpb24gaGFuZGxlQ29udGV4dFJlc3RvcmVkIChldmVudCkge1xuICAgIC8vIGNsZWFyIGVycm9yIGNvZGVcbiAgICBnbC5nZXRFcnJvcigpXG5cbiAgICAvLyBjbGVhciBjb250ZXh0IGxvc3QgZmxhZ1xuICAgIGNvbnRleHRMb3N0ID0gZmFsc2VcblxuICAgIC8vIHJlZnJlc2ggc3RhdGVcbiAgICBleHRlbnNpb25TdGF0ZS5yZXN0b3JlKClcbiAgICBzaGFkZXJTdGF0ZS5yZXN0b3JlKClcbiAgICBidWZmZXJTdGF0ZS5yZXN0b3JlKClcbiAgICB0ZXh0dXJlU3RhdGUucmVzdG9yZSgpXG4gICAgcmVuZGVyYnVmZmVyU3RhdGUucmVzdG9yZSgpXG4gICAgZnJhbWVidWZmZXJTdGF0ZS5yZXN0b3JlKClcbiAgICBhdHRyaWJ1dGVTdGF0ZS5yZXN0b3JlKClcbiAgICBpZiAodGltZXIpIHtcbiAgICAgIHRpbWVyLnJlc3RvcmUoKVxuICAgIH1cblxuICAgIC8vIHJlZnJlc2ggc3RhdGVcbiAgICBjb3JlLnByb2NzLnJlZnJlc2goKVxuXG4gICAgLy8gcmVzdGFydCBSQUZcbiAgICBzdGFydFJBRigpXG5cbiAgICAvLyByZXN0b3JlIGNvbnRleHRcbiAgICByZXN0b3JlQ2FsbGJhY2tzLmZvckVhY2goZnVuY3Rpb24gKGNiKSB7XG4gICAgICBjYigpXG4gICAgfSlcbiAgfVxuXG4gIGlmIChjYW52YXMpIHtcbiAgICBjYW52YXMuYWRkRXZlbnRMaXN0ZW5lcihDT05URVhUX0xPU1RfRVZFTlQsIGhhbmRsZUNvbnRleHRMb3NzLCBmYWxzZSlcbiAgICBjYW52YXMuYWRkRXZlbnRMaXN0ZW5lcihDT05URVhUX1JFU1RPUkVEX0VWRU5ULCBoYW5kbGVDb250ZXh0UmVzdG9yZWQsIGZhbHNlKVxuICB9XG5cbiAgZnVuY3Rpb24gZGVzdHJveSAoKSB7XG4gICAgcmFmQ2FsbGJhY2tzLmxlbmd0aCA9IDBcbiAgICBzdG9wUkFGKClcblxuICAgIGlmIChjYW52YXMpIHtcbiAgICAgIGNhbnZhcy5yZW1vdmVFdmVudExpc3RlbmVyKENPTlRFWFRfTE9TVF9FVkVOVCwgaGFuZGxlQ29udGV4dExvc3MpXG4gICAgICBjYW52YXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihDT05URVhUX1JFU1RPUkVEX0VWRU5ULCBoYW5kbGVDb250ZXh0UmVzdG9yZWQpXG4gICAgfVxuXG4gICAgc2hhZGVyU3RhdGUuY2xlYXIoKVxuICAgIGZyYW1lYnVmZmVyU3RhdGUuY2xlYXIoKVxuICAgIHJlbmRlcmJ1ZmZlclN0YXRlLmNsZWFyKClcbiAgICB0ZXh0dXJlU3RhdGUuY2xlYXIoKVxuICAgIGVsZW1lbnRTdGF0ZS5jbGVhcigpXG4gICAgYnVmZmVyU3RhdGUuY2xlYXIoKVxuICAgIGF0dHJpYnV0ZVN0YXRlLmNsZWFyKClcblxuICAgIGlmICh0aW1lcikge1xuICAgICAgdGltZXIuY2xlYXIoKVxuICAgIH1cblxuICAgIGRlc3Ryb3lDYWxsYmFja3MuZm9yRWFjaChmdW5jdGlvbiAoY2IpIHtcbiAgICAgIGNiKClcbiAgICB9KVxuICB9XG5cbiAgZnVuY3Rpb24gY29tcGlsZVByb2NlZHVyZSAob3B0aW9ucykge1xuICAgIGNoZWNrJDEoISFvcHRpb25zLCAnaW52YWxpZCBhcmdzIHRvIHJlZ2woey4uLn0pJylcbiAgICBjaGVjayQxLnR5cGUob3B0aW9ucywgJ29iamVjdCcsICdpbnZhbGlkIGFyZ3MgdG8gcmVnbCh7Li4ufSknKVxuXG4gICAgZnVuY3Rpb24gZmxhdHRlbk5lc3RlZE9wdGlvbnMgKG9wdGlvbnMpIHtcbiAgICAgIHZhciByZXN1bHQgPSBleHRlbmQoe30sIG9wdGlvbnMpXG4gICAgICBkZWxldGUgcmVzdWx0LnVuaWZvcm1zXG4gICAgICBkZWxldGUgcmVzdWx0LmF0dHJpYnV0ZXNcbiAgICAgIGRlbGV0ZSByZXN1bHQuY29udGV4dFxuICAgICAgZGVsZXRlIHJlc3VsdC52YW9cblxuICAgICAgaWYgKCdzdGVuY2lsJyBpbiByZXN1bHQgJiYgcmVzdWx0LnN0ZW5jaWwub3ApIHtcbiAgICAgICAgcmVzdWx0LnN0ZW5jaWwub3BCYWNrID0gcmVzdWx0LnN0ZW5jaWwub3BGcm9udCA9IHJlc3VsdC5zdGVuY2lsLm9wXG4gICAgICAgIGRlbGV0ZSByZXN1bHQuc3RlbmNpbC5vcFxuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBtZXJnZSAobmFtZSkge1xuICAgICAgICBpZiAobmFtZSBpbiByZXN1bHQpIHtcbiAgICAgICAgICB2YXIgY2hpbGQgPSByZXN1bHRbbmFtZV1cbiAgICAgICAgICBkZWxldGUgcmVzdWx0W25hbWVdXG4gICAgICAgICAgT2JqZWN0LmtleXMoY2hpbGQpLmZvckVhY2goZnVuY3Rpb24gKHByb3ApIHtcbiAgICAgICAgICAgIHJlc3VsdFtuYW1lICsgJy4nICsgcHJvcF0gPSBjaGlsZFtwcm9wXVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIG1lcmdlKCdibGVuZCcpXG4gICAgICBtZXJnZSgnZGVwdGgnKVxuICAgICAgbWVyZ2UoJ2N1bGwnKVxuICAgICAgbWVyZ2UoJ3N0ZW5jaWwnKVxuICAgICAgbWVyZ2UoJ3BvbHlnb25PZmZzZXQnKVxuICAgICAgbWVyZ2UoJ3NjaXNzb3InKVxuICAgICAgbWVyZ2UoJ3NhbXBsZScpXG5cbiAgICAgIGlmICgndmFvJyBpbiBvcHRpb25zKSB7XG4gICAgICAgIHJlc3VsdC52YW8gPSBvcHRpb25zLnZhb1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2VwYXJhdGVEeW5hbWljIChvYmplY3QsIHVzZUFycmF5cykge1xuICAgICAgdmFyIHN0YXRpY0l0ZW1zID0ge31cbiAgICAgIHZhciBkeW5hbWljSXRlbXMgPSB7fVxuICAgICAgT2JqZWN0LmtleXMob2JqZWN0KS5mb3JFYWNoKGZ1bmN0aW9uIChvcHRpb24pIHtcbiAgICAgICAgdmFyIHZhbHVlID0gb2JqZWN0W29wdGlvbl1cbiAgICAgICAgaWYgKGR5bmFtaWMuaXNEeW5hbWljKHZhbHVlKSkge1xuICAgICAgICAgIGR5bmFtaWNJdGVtc1tvcHRpb25dID0gZHluYW1pYy51bmJveCh2YWx1ZSwgb3B0aW9uKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9IGVsc2UgaWYgKHVzZUFycmF5cyAmJiBBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGlmIChkeW5hbWljLmlzRHluYW1pYyh2YWx1ZVtpXSkpIHtcbiAgICAgICAgICAgICAgZHluYW1pY0l0ZW1zW29wdGlvbl0gPSBkeW5hbWljLnVuYm94KHZhbHVlLCBvcHRpb24pXG4gICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzdGF0aWNJdGVtc1tvcHRpb25dID0gdmFsdWVcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBkeW5hbWljOiBkeW5hbWljSXRlbXMsXG4gICAgICAgIHN0YXRpYzogc3RhdGljSXRlbXNcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUcmVhdCBjb250ZXh0IHZhcmlhYmxlcyBzZXBhcmF0ZSBmcm9tIG90aGVyIGR5bmFtaWMgdmFyaWFibGVzXG4gICAgdmFyIGNvbnRleHQgPSBzZXBhcmF0ZUR5bmFtaWMob3B0aW9ucy5jb250ZXh0IHx8IHt9LCB0cnVlKVxuICAgIHZhciB1bmlmb3JtcyA9IHNlcGFyYXRlRHluYW1pYyhvcHRpb25zLnVuaWZvcm1zIHx8IHt9LCB0cnVlKVxuICAgIHZhciBhdHRyaWJ1dGVzID0gc2VwYXJhdGVEeW5hbWljKG9wdGlvbnMuYXR0cmlidXRlcyB8fCB7fSwgZmFsc2UpXG4gICAgdmFyIG9wdHMgPSBzZXBhcmF0ZUR5bmFtaWMoZmxhdHRlbk5lc3RlZE9wdGlvbnMob3B0aW9ucyksIGZhbHNlKVxuXG4gICAgdmFyIHN0YXRzJCQxID0ge1xuICAgICAgZ3B1VGltZTogMC4wLFxuICAgICAgY3B1VGltZTogMC4wLFxuICAgICAgY291bnQ6IDBcbiAgICB9XG5cbiAgICB2YXIgY29tcGlsZWQgPSBjb3JlLmNvbXBpbGUob3B0cywgYXR0cmlidXRlcywgdW5pZm9ybXMsIGNvbnRleHQsIHN0YXRzJCQxKVxuXG4gICAgdmFyIGRyYXcgPSBjb21waWxlZC5kcmF3XG4gICAgdmFyIGJhdGNoID0gY29tcGlsZWQuYmF0Y2hcbiAgICB2YXIgc2NvcGUgPSBjb21waWxlZC5zY29wZVxuXG4gICAgLy8gRklYTUU6IHdlIHNob3VsZCBtb2RpZnkgY29kZSBnZW5lcmF0aW9uIGZvciBiYXRjaCBjb21tYW5kcyBzbyB0aGlzXG4gICAgLy8gaXNuJ3QgbmVjZXNzYXJ5XG4gICAgdmFyIEVNUFRZX0FSUkFZID0gW11cbiAgICBmdW5jdGlvbiByZXNlcnZlIChjb3VudCkge1xuICAgICAgd2hpbGUgKEVNUFRZX0FSUkFZLmxlbmd0aCA8IGNvdW50KSB7XG4gICAgICAgIEVNUFRZX0FSUkFZLnB1c2gobnVsbClcbiAgICAgIH1cbiAgICAgIHJldHVybiBFTVBUWV9BUlJBWVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIFJFR0xDb21tYW5kIChhcmdzLCBib2R5KSB7XG4gICAgICB2YXIgaVxuICAgICAgaWYgKGNvbnRleHRMb3N0KSB7XG4gICAgICAgIGNoZWNrJDEucmFpc2UoJ2NvbnRleHQgbG9zdCcpXG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIGFyZ3MgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIHNjb3BlLmNhbGwodGhpcywgbnVsbCwgYXJncywgMClcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGJvZHkgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBhcmdzID09PSAnbnVtYmVyJykge1xuICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhcmdzOyArK2kpIHtcbiAgICAgICAgICAgIHNjb3BlLmNhbGwodGhpcywgbnVsbCwgYm9keSwgaSlcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShhcmdzKSkge1xuICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBzY29wZS5jYWxsKHRoaXMsIGFyZ3NbaV0sIGJvZHksIGkpXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBzY29wZS5jYWxsKHRoaXMsIGFyZ3MsIGJvZHksIDApXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGFyZ3MgPT09ICdudW1iZXInKSB7XG4gICAgICAgIGlmIChhcmdzID4gMCkge1xuICAgICAgICAgIHJldHVybiBiYXRjaC5jYWxsKHRoaXMsIHJlc2VydmUoYXJncyB8IDApLCBhcmdzIHwgMClcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGFyZ3MpKSB7XG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCkge1xuICAgICAgICAgIHJldHVybiBiYXRjaC5jYWxsKHRoaXMsIGFyZ3MsIGFyZ3MubGVuZ3RoKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZHJhdy5jYWxsKHRoaXMsIGFyZ3MpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGV4dGVuZChSRUdMQ29tbWFuZCwge1xuICAgICAgc3RhdHM6IHN0YXRzJCQxLFxuICAgICAgZGVzdHJveTogZnVuY3Rpb24gKCkge1xuICAgICAgICBjb21waWxlZC5kZXN0cm95KClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgdmFyIHNldEZCTyA9IGZyYW1lYnVmZmVyU3RhdGUuc2V0RkJPID0gY29tcGlsZVByb2NlZHVyZSh7XG4gICAgZnJhbWVidWZmZXI6IGR5bmFtaWMuZGVmaW5lLmNhbGwobnVsbCwgRFlOX1BST1AsICdmcmFtZWJ1ZmZlcicpXG4gIH0pXG5cbiAgZnVuY3Rpb24gY2xlYXJJbXBsIChfLCBvcHRpb25zKSB7XG4gICAgdmFyIGNsZWFyRmxhZ3MgPSAwXG4gICAgY29yZS5wcm9jcy5wb2xsKClcblxuICAgIHZhciBjID0gb3B0aW9ucy5jb2xvclxuICAgIGlmIChjKSB7XG4gICAgICBnbC5jbGVhckNvbG9yKCtjWzBdIHx8IDAsICtjWzFdIHx8IDAsICtjWzJdIHx8IDAsICtjWzNdIHx8IDApXG4gICAgICBjbGVhckZsYWdzIHw9IEdMX0NPTE9SX0JVRkZFUl9CSVRcbiAgICB9XG4gICAgaWYgKCdkZXB0aCcgaW4gb3B0aW9ucykge1xuICAgICAgZ2wuY2xlYXJEZXB0aCgrb3B0aW9ucy5kZXB0aClcbiAgICAgIGNsZWFyRmxhZ3MgfD0gR0xfREVQVEhfQlVGRkVSX0JJVFxuICAgIH1cbiAgICBpZiAoJ3N0ZW5jaWwnIGluIG9wdGlvbnMpIHtcbiAgICAgIGdsLmNsZWFyU3RlbmNpbChvcHRpb25zLnN0ZW5jaWwgfCAwKVxuICAgICAgY2xlYXJGbGFncyB8PSBHTF9TVEVOQ0lMX0JVRkZFUl9CSVRcbiAgICB9XG5cbiAgICBjaGVjayQxKCEhY2xlYXJGbGFncywgJ2NhbGxlZCByZWdsLmNsZWFyIHdpdGggbm8gYnVmZmVyIHNwZWNpZmllZCcpXG4gICAgZ2wuY2xlYXIoY2xlYXJGbGFncylcbiAgfVxuXG4gIGZ1bmN0aW9uIGNsZWFyIChvcHRpb25zKSB7XG4gICAgY2hlY2skMShcbiAgICAgIHR5cGVvZiBvcHRpb25zID09PSAnb2JqZWN0JyAmJiBvcHRpb25zLFxuICAgICAgJ3JlZ2wuY2xlYXIoKSB0YWtlcyBhbiBvYmplY3QgYXMgaW5wdXQnKVxuICAgIGlmICgnZnJhbWVidWZmZXInIGluIG9wdGlvbnMpIHtcbiAgICAgIGlmIChvcHRpb25zLmZyYW1lYnVmZmVyICYmXG4gICAgICAgICAgb3B0aW9ucy5mcmFtZWJ1ZmZlcl9yZWdsVHlwZSA9PT0gJ2ZyYW1lYnVmZmVyQ3ViZScpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCA2OyArK2kpIHtcbiAgICAgICAgICBzZXRGQk8oZXh0ZW5kKHtcbiAgICAgICAgICAgIGZyYW1lYnVmZmVyOiBvcHRpb25zLmZyYW1lYnVmZmVyLmZhY2VzW2ldXG4gICAgICAgICAgfSwgb3B0aW9ucyksIGNsZWFySW1wbClcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2V0RkJPKG9wdGlvbnMsIGNsZWFySW1wbClcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY2xlYXJJbXBsKG51bGwsIG9wdGlvbnMpXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZnJhbWUgKGNiKSB7XG4gICAgY2hlY2skMS50eXBlKGNiLCAnZnVuY3Rpb24nLCAncmVnbC5mcmFtZSgpIGNhbGxiYWNrIG11c3QgYmUgYSBmdW5jdGlvbicpXG4gICAgcmFmQ2FsbGJhY2tzLnB1c2goY2IpXG5cbiAgICBmdW5jdGlvbiBjYW5jZWwgKCkge1xuICAgICAgLy8gRklYTUU6ICBzaG91bGQgd2UgY2hlY2sgc29tZXRoaW5nIG90aGVyIHRoYW4gZXF1YWxzIGNiIGhlcmU/XG4gICAgICAvLyB3aGF0IGlmIGEgdXNlciBjYWxscyBmcmFtZSB0d2ljZSB3aXRoIHRoZSBzYW1lIGNhbGxiYWNrLi4uXG4gICAgICAvL1xuICAgICAgdmFyIGkgPSBmaW5kKHJhZkNhbGxiYWNrcywgY2IpXG4gICAgICBjaGVjayQxKGkgPj0gMCwgJ2Nhbm5vdCBjYW5jZWwgYSBmcmFtZSB0d2ljZScpXG4gICAgICBmdW5jdGlvbiBwZW5kaW5nQ2FuY2VsICgpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gZmluZChyYWZDYWxsYmFja3MsIHBlbmRpbmdDYW5jZWwpXG4gICAgICAgIHJhZkNhbGxiYWNrc1tpbmRleF0gPSByYWZDYWxsYmFja3NbcmFmQ2FsbGJhY2tzLmxlbmd0aCAtIDFdXG4gICAgICAgIHJhZkNhbGxiYWNrcy5sZW5ndGggLT0gMVxuICAgICAgICBpZiAocmFmQ2FsbGJhY2tzLmxlbmd0aCA8PSAwKSB7XG4gICAgICAgICAgc3RvcFJBRigpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJhZkNhbGxiYWNrc1tpXSA9IHBlbmRpbmdDYW5jZWxcbiAgICB9XG5cbiAgICBzdGFydFJBRigpXG5cbiAgICByZXR1cm4ge1xuICAgICAgY2FuY2VsOiBjYW5jZWxcbiAgICB9XG4gIH1cblxuICAvLyBwb2xsIHZpZXdwb3J0XG4gIGZ1bmN0aW9uIHBvbGxWaWV3cG9ydCAoKSB7XG4gICAgdmFyIHZpZXdwb3J0ID0gbmV4dFN0YXRlLnZpZXdwb3J0XG4gICAgdmFyIHNjaXNzb3JCb3ggPSBuZXh0U3RhdGUuc2Npc3Nvcl9ib3hcbiAgICB2aWV3cG9ydFswXSA9IHZpZXdwb3J0WzFdID0gc2Npc3NvckJveFswXSA9IHNjaXNzb3JCb3hbMV0gPSAwXG4gICAgY29udGV4dFN0YXRlLnZpZXdwb3J0V2lkdGggPVxuICAgICAgY29udGV4dFN0YXRlLmZyYW1lYnVmZmVyV2lkdGggPVxuICAgICAgY29udGV4dFN0YXRlLmRyYXdpbmdCdWZmZXJXaWR0aCA9XG4gICAgICB2aWV3cG9ydFsyXSA9XG4gICAgICBzY2lzc29yQm94WzJdID0gZ2wuZHJhd2luZ0J1ZmZlcldpZHRoXG4gICAgY29udGV4dFN0YXRlLnZpZXdwb3J0SGVpZ2h0ID1cbiAgICAgIGNvbnRleHRTdGF0ZS5mcmFtZWJ1ZmZlckhlaWdodCA9XG4gICAgICBjb250ZXh0U3RhdGUuZHJhd2luZ0J1ZmZlckhlaWdodCA9XG4gICAgICB2aWV3cG9ydFszXSA9XG4gICAgICBzY2lzc29yQm94WzNdID0gZ2wuZHJhd2luZ0J1ZmZlckhlaWdodFxuICB9XG5cbiAgZnVuY3Rpb24gcG9sbCAoKSB7XG4gICAgY29udGV4dFN0YXRlLnRpY2sgKz0gMVxuICAgIGNvbnRleHRTdGF0ZS50aW1lID0gbm93KClcbiAgICBwb2xsVmlld3BvcnQoKVxuICAgIGNvcmUucHJvY3MucG9sbCgpXG4gIH1cblxuICBmdW5jdGlvbiByZWZyZXNoICgpIHtcbiAgICB0ZXh0dXJlU3RhdGUucmVmcmVzaCgpXG4gICAgcG9sbFZpZXdwb3J0KClcbiAgICBjb3JlLnByb2NzLnJlZnJlc2goKVxuICAgIGlmICh0aW1lcikge1xuICAgICAgdGltZXIudXBkYXRlKClcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBub3cgKCkge1xuICAgIHJldHVybiAoY2xvY2soKSAtIFNUQVJUX1RJTUUpIC8gMTAwMC4wXG4gIH1cblxuICByZWZyZXNoKClcblxuICBmdW5jdGlvbiBhZGRMaXN0ZW5lciAoZXZlbnQsIGNhbGxiYWNrKSB7XG4gICAgY2hlY2skMS50eXBlKGNhbGxiYWNrLCAnZnVuY3Rpb24nLCAnbGlzdGVuZXIgY2FsbGJhY2sgbXVzdCBiZSBhIGZ1bmN0aW9uJylcblxuICAgIHZhciBjYWxsYmFja3NcbiAgICBzd2l0Y2ggKGV2ZW50KSB7XG4gICAgICBjYXNlICdmcmFtZSc6XG4gICAgICAgIHJldHVybiBmcmFtZShjYWxsYmFjaylcbiAgICAgIGNhc2UgJ2xvc3QnOlxuICAgICAgICBjYWxsYmFja3MgPSBsb3NzQ2FsbGJhY2tzXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlICdyZXN0b3JlJzpcbiAgICAgICAgY2FsbGJhY2tzID0gcmVzdG9yZUNhbGxiYWNrc1xuICAgICAgICBicmVha1xuICAgICAgY2FzZSAnZGVzdHJveSc6XG4gICAgICAgIGNhbGxiYWNrcyA9IGRlc3Ryb3lDYWxsYmFja3NcbiAgICAgICAgYnJlYWtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGNoZWNrJDEucmFpc2UoJ2ludmFsaWQgZXZlbnQsIG11c3QgYmUgb25lIG9mIGZyYW1lLGxvc3QscmVzdG9yZSxkZXN0cm95JylcbiAgICB9XG5cbiAgICBjYWxsYmFja3MucHVzaChjYWxsYmFjaylcbiAgICByZXR1cm4ge1xuICAgICAgY2FuY2VsOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2FsbGJhY2tzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgaWYgKGNhbGxiYWNrc1tpXSA9PT0gY2FsbGJhY2spIHtcbiAgICAgICAgICAgIGNhbGxiYWNrc1tpXSA9IGNhbGxiYWNrc1tjYWxsYmFja3MubGVuZ3RoIC0gMV1cbiAgICAgICAgICAgIGNhbGxiYWNrcy5wb3AoKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIHJlZ2wgPSBleHRlbmQoY29tcGlsZVByb2NlZHVyZSwge1xuICAgIC8vIENsZWFyIGN1cnJlbnQgRkJPXG4gICAgY2xlYXI6IGNsZWFyLFxuXG4gICAgLy8gU2hvcnQgY3V0cyBmb3IgZHluYW1pYyB2YXJpYWJsZXNcbiAgICBwcm9wOiBkeW5hbWljLmRlZmluZS5iaW5kKG51bGwsIERZTl9QUk9QKSxcbiAgICBjb250ZXh0OiBkeW5hbWljLmRlZmluZS5iaW5kKG51bGwsIERZTl9DT05URVhUKSxcbiAgICB0aGlzOiBkeW5hbWljLmRlZmluZS5iaW5kKG51bGwsIERZTl9TVEFURSksXG5cbiAgICAvLyBleGVjdXRlcyBhbiBlbXB0eSBkcmF3IGNvbW1hbmRcbiAgICBkcmF3OiBjb21waWxlUHJvY2VkdXJlKHt9KSxcblxuICAgIC8vIFJlc291cmNlc1xuICAgIGJ1ZmZlcjogZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBidWZmZXJTdGF0ZS5jcmVhdGUob3B0aW9ucywgR0xfQVJSQVlfQlVGRkVSLCBmYWxzZSwgZmFsc2UpXG4gICAgfSxcbiAgICBlbGVtZW50czogZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBlbGVtZW50U3RhdGUuY3JlYXRlKG9wdGlvbnMsIGZhbHNlKVxuICAgIH0sXG4gICAgdGV4dHVyZTogdGV4dHVyZVN0YXRlLmNyZWF0ZTJELFxuICAgIGN1YmU6IHRleHR1cmVTdGF0ZS5jcmVhdGVDdWJlLFxuICAgIHJlbmRlcmJ1ZmZlcjogcmVuZGVyYnVmZmVyU3RhdGUuY3JlYXRlLFxuICAgIGZyYW1lYnVmZmVyOiBmcmFtZWJ1ZmZlclN0YXRlLmNyZWF0ZSxcbiAgICBmcmFtZWJ1ZmZlckN1YmU6IGZyYW1lYnVmZmVyU3RhdGUuY3JlYXRlQ3ViZSxcbiAgICB2YW86IGF0dHJpYnV0ZVN0YXRlLmNyZWF0ZVZBTyxcblxuICAgIC8vIEV4cG9zZSBjb250ZXh0IGF0dHJpYnV0ZXNcbiAgICBhdHRyaWJ1dGVzOiBnbEF0dHJpYnV0ZXMsXG5cbiAgICAvLyBGcmFtZSByZW5kZXJpbmdcbiAgICBmcmFtZTogZnJhbWUsXG4gICAgb246IGFkZExpc3RlbmVyLFxuXG4gICAgLy8gU3lzdGVtIGxpbWl0c1xuICAgIGxpbWl0czogbGltaXRzLFxuICAgIGhhc0V4dGVuc2lvbjogZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgIHJldHVybiBsaW1pdHMuZXh0ZW5zaW9ucy5pbmRleE9mKG5hbWUudG9Mb3dlckNhc2UoKSkgPj0gMFxuICAgIH0sXG5cbiAgICAvLyBSZWFkIHBpeGVsc1xuICAgIHJlYWQ6IHJlYWRQaXhlbHMsXG5cbiAgICAvLyBEZXN0cm95IHJlZ2wgYW5kIGFsbCBhc3NvY2lhdGVkIHJlc291cmNlc1xuICAgIGRlc3Ryb3k6IGRlc3Ryb3ksXG5cbiAgICAvLyBEaXJlY3QgR0wgc3RhdGUgbWFuaXB1bGF0aW9uXG4gICAgX2dsOiBnbCxcbiAgICBfcmVmcmVzaDogcmVmcmVzaCxcblxuICAgIHBvbGw6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHBvbGwoKVxuICAgICAgaWYgKHRpbWVyKSB7XG4gICAgICAgIHRpbWVyLnVwZGF0ZSgpXG4gICAgICB9XG4gICAgfSxcblxuICAgIC8vIEN1cnJlbnQgdGltZVxuICAgIG5vdzogbm93LFxuXG4gICAgLy8gcmVnbCBTdGF0aXN0aWNzIEluZm9ybWF0aW9uXG4gICAgc3RhdHM6IHN0YXRzJCQxXG4gIH0pXG5cbiAgY29uZmlnLm9uRG9uZShudWxsLCByZWdsKVxuXG4gIHJldHVybiByZWdsXG59XG5cbnJldHVybiB3cmFwUkVHTDtcblxufSkpKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJlZ2wuanMubWFwXG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///283\n")},,,,,,,,function(module,exports,__webpack_require__){"use strict";eval("\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.Engine = void 0;\r\nconst modelConstructor_1 = __webpack_require__(292);\r\nconst StructV_1 = __webpack_require__(96);\r\nconst eventBus_1 = __webpack_require__(97);\r\nconst viewContainer_1 = __webpack_require__(293);\r\nclass Engine {\r\n constructor(DOMContainer, engineOptions) {\r\n this.modelConstructor = null;\r\n this.optionsTable = {};\r\n this.engineOptions = Object.assign({}, engineOptions);\r\n this.viewOptions = Object.assign({\r\n fitCenter: true,\r\n fitView: false,\r\n groupPadding: 20,\r\n leakAreaHeight: 0.3,\r\n updateHighlight: '#fc5185'\r\n }, engineOptions.view);\r\n this.animationOptions = Object.assign({\r\n enable: true,\r\n duration: 750,\r\n timingFunction: 'easePolyOut'\r\n }, engineOptions.animation);\r\n this.interactionOptions = Object.assign({\r\n drag: true,\r\n zoom: true,\r\n dragNode: true,\r\n selectNode: true\r\n }, engineOptions.interaction);\r\n Object.keys(StructV_1.SV.registeredLayout).forEach(layout => {\r\n if (this.optionsTable[layout] === undefined) {\r\n const options = StructV_1.SV.registeredLayout[layout].defineOptions();\r\n options.behavior = Object.assign({\r\n dragNode: true,\r\n selectNode: true\r\n }, options.behavior);\r\n this.optionsTable[layout] = options;\r\n }\r\n });\r\n this.modelConstructor = new modelConstructor_1.ModelConstructor(this);\r\n this.viewContainer = new viewContainer_1.ViewContainer(this, DOMContainer);\r\n }\r\n render(sourceData) {\r\n if (sourceData === undefined || sourceData === null) {\r\n return;\r\n }\r\n if (this.viewContainer.getG6Instance().isAnimating()) {\r\n return;\r\n }\r\n let stringSourceData = JSON.stringify(sourceData);\r\n if (this.prevStringSourceData === stringSourceData) {\r\n return;\r\n }\r\n this.prevStringSourceData = stringSourceData;\r\n const layoutGroupTable = this.modelConstructor.construct(sourceData);\r\n this.viewContainer.render(layoutGroupTable);\r\n }\r\n reLayout() {\r\n this.viewContainer.reLayout();\r\n }\r\n getGraphInstance() {\r\n return this.viewContainer.getG6Instance();\r\n }\r\n getNodes(group) {\r\n const layoutGroupTable = this.modelConstructor.getLayoutGroupTable();\r\n if (group && layoutGroupTable.has('group')) {\r\n return layoutGroupTable.get('group').node;\r\n }\r\n const nodes = [];\r\n layoutGroupTable.forEach(item => {\r\n nodes.push(...item.node);\r\n });\r\n return nodes;\r\n }\r\n getMarkers(group) {\r\n const layoutGroupTable = this.modelConstructor.getLayoutGroupTable();\r\n if (group && layoutGroupTable.has('group')) {\r\n return layoutGroupTable.get('group').marker;\r\n }\r\n const markers = [];\r\n layoutGroupTable.forEach(item => {\r\n markers.push(...item.marker);\r\n });\r\n return markers;\r\n }\r\n getLinks(group) {\r\n const layoutGroupTable = this.modelConstructor.getLayoutGroupTable();\r\n if (group && layoutGroupTable.has('group')) {\r\n return layoutGroupTable.get('group').link;\r\n }\r\n const links = [];\r\n layoutGroupTable.forEach(item => {\r\n links.push(...item.link);\r\n });\r\n return links;\r\n }\r\n hideGroups(groupNames) {\r\n const names = Array.isArray(groupNames) ? groupNames : [groupNames], instance = this.viewContainer.getG6Instance(), layoutGroupTable = this.modelConstructor.getLayoutGroupTable();\r\n layoutGroupTable.forEach(item => {\r\n const hasName = names.find(name => name === item.layout);\r\n if (hasName && !item.isHide) {\r\n item.modelList.forEach(model => instance.hideItem(model.G6Item));\r\n item.isHide = true;\r\n }\r\n if (!hasName && item.isHide) {\r\n item.modelList.forEach(model => instance.showItem(model.G6Item));\r\n item.isHide = false;\r\n }\r\n });\r\n }\r\n findElement(id) {\r\n const elements = this.getNodes();\r\n const stringId = id.toString();\r\n const targetElement = elements.find(item => item.sourceId === stringId);\r\n return targetElement;\r\n }\r\n resize(width, height) {\r\n this.viewContainer.resize(width, height);\r\n }\r\n on(eventName, callback) {\r\n if (typeof callback !== 'function') {\r\n return;\r\n }\r\n if (eventName === 'onFreed' || eventName === 'onLeak') {\r\n eventBus_1.EventBus.on(eventName, callback);\r\n return;\r\n }\r\n if (eventName === 'onLeakAreaUpdate') {\r\n eventBus_1.EventBus.on(eventName, callback);\r\n return;\r\n }\r\n this.viewContainer.getG6Instance().on(eventName, event => {\r\n callback(event.item['SVModel']);\r\n });\r\n }\r\n destroy() {\r\n this.modelConstructor.destroy();\r\n this.viewContainer.destroy();\r\n }\r\n}\r\nexports.Engine = Engine;\r\n;\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvZW5naW5lLnRzPzIyZWMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0Esb0RBQTREO0FBRTVELDBDQUErQjtBQUMvQiwyQ0FBNkM7QUFDN0MsaURBQXFEO0FBTXJELE1BQWEsTUFBTTtJQVlmLFlBQVksWUFBeUIsRUFBRSxhQUE0QjtRQVgzRCxxQkFBZ0IsR0FBcUIsSUFBSSxDQUFDO1FBWTlDLElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxhQUFhLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFFdEQsSUFBSSxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO1lBQzdCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsT0FBTyxFQUFFLEtBQUs7WUFDZCxZQUFZLEVBQUUsRUFBRTtZQUNoQixjQUFjLEVBQUUsR0FBRztZQUNuQixlQUFlLEVBQUUsU0FBUztTQUM3QixFQUFFLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV2QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztZQUNsQyxNQUFNLEVBQUUsSUFBSTtZQUNaLFFBQVEsRUFBRSxHQUFHO1lBQ2IsY0FBYyxFQUFFLGFBQWE7U0FDaEMsRUFBRSxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFNUIsSUFBSSxDQUFDLGtCQUFrQixHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7WUFDcEMsSUFBSSxFQUFFLElBQUk7WUFDVixJQUFJLEVBQUUsSUFBSTtZQUNWLFFBQVEsRUFBRSxJQUFJO1lBQ2QsVUFBVSxFQUFFLElBQUk7U0FDbkIsRUFBRSxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUM7UUFHOUIsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFFLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDOUMsSUFBRyxJ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U0FDVjtRQUVELElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxFQUFFLENBQUMsRUFBRSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsRUFBRTtZQUNyRCxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQ3BDLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUtNLE9BQU87UUFDVixJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDaEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNqQyxDQUFDO0NBQ0o7QUFsUEQsd0JBa1BDO0FBQUEsQ0FBQyIsImZpbGUiOiIyOTEuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTb3VyY2VzIH0gZnJvbSBcIi4vc291cmNlc1wiO1xyXG5pbXBvcnQgeyBNb2RlbENvbnN0cnVjdG9yIH0gZnJvbSBcIi4vTW9kZWwvbW9kZWxDb25zdHJ1Y3RvclwiO1xyXG5pbXBvcnQgeyBBbmltYXRpb25PcHRpb25zLCBFbmdpbmVPcHRpb25zLCBJbnRlcmFjdGlvbk9wdGlvbnMsIExheW91dEdyb3VwT3B0aW9ucywgVmlld09wdGlvbnMgfSBmcm9tIFwiLi9vcHRpb25zXCI7XHJcbmltcG9ydCB7IFNWIH0gZnJvbSBcIi4vU3RydWN0VlwiO1xyXG5pbXBvcnQgeyBFdmVudEJ1cyB9IGZyb20gXCIuL0NvbW1vbi9ldmVudEJ1c1wiO1xyXG5pbXBvcnQgeyBWaWV3Q29udGFpbmVyIH0gZnJvbSBcIi4vVmlldy92aWV3Q29udGFpbmVyXCI7XHJcbmltcG9ydCB7IFNWTGluayB9IGZyb20gXCIuL01vZGVsL1NWTGlua1wiO1xyXG5pbXBvcnQgeyBTVk5vZGUgfSBmcm9tIFwiLi9Nb2RlbC9TVk5vZGVcIjtcclxuaW1wb3J0IHsgU1ZNYXJrZXIgfSBmcm9tIFwiLi9Nb2RlbC9TVk1hcmtlclwiO1xyXG5cclxuXHJcbmV4cG9ydCBjbGFzcyBFbmdpbmUgeyBcclxuICAgIHByaXZhdGUgbW9kZWxDb25zdHJ1Y3RvcjogTW9kZWxDb25zdHJ1Y3RvciA9IG51bGw7XHJcbiAgICBwcml2YXRlIHZpZXdDb250YWluZXI6IFZpZXdDb250YWluZXJcclxuICAgIHByaXZhdGUgcHJldlN0cmluZ1NvdXJjZURhdGE6IHN0cmluZztcclxuICAgIFxyXG4gICAgcHVibGljIGVuZ2luZU9wdGlvbnM6IEVuZ2luZU9wdGlvbnM7XHJcbiAgICBwdWJsaWMgdmlld09wdGlvbnM6IFZpZXdPcHRpb25zO1xyXG4gICAgcHVibGljIGFuaW1hdGlvbk9wdGlvbnM6IEFuaW1hdGlvbk9wdGlvbnM7XHJcbiAgICBwdWJsaWMgaW50ZXJhY3Rpb25PcHRpb25zOiBJbnRlcmFjdGlvbk9wdGlvbnM7XHJcblxyXG4gICAgcHVibGljIG9wdGlvbnNUYWJsZTogeyBba2V5OiBzdHJpbmddOiBMYXlvdXRHcm91cE9wdGlvbnMgfTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihET01Db250YWluZXI6IEhUTUxFbGVtZW50LCBlbmdpbmVPcHRpb25zOiBFbmdpbmVPcHRpb25zKSB7XHJcbiAgICAgICAgdGhpcy5vcHRpb25zVGFibGUgPSB7fTtcclxuICAgICAgICB0aGlzLmVuZ2luZU9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBlbmdpbmVPcHRpb25zKTtcclxuXHJcbiAgICAgICAgdGhpcy52aWV3T3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe1xyXG4gICAgICAgICAgICBmaXRDZW50ZXI6IHRydWUsXHJcbiAgICAgICAgICAgIGZpdFZpZXc6IGZhbHNlLFxyXG4gICAgICAgICAgICBncm91cFBhZGRpbmc6IDIwLFxyXG4gICAgICAgICAgICBsZWFrQXJlYUhlaWdodDogMC4zLFxyXG4gICAgICAgICAgICB1cGRhdGVIaWdobGlnaHQ6ICcjZmM1MTg1J1xyXG4gICAgICAgIH0sIGVuZ2luZU9wdGlvbnMudmlldyk7XHJcblxyXG4gICAgICAgIHRoaXMuYW5pbWF0aW9uT3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe1xyXG4gICAgICAgICAgICBlbmFibGU6IHRydWUsXHJcbiAgICAgICAgICAgIGR1cmF0aW9uOiA3NTAsXHJcbiAgICAgICAgICAgIHRpbWluZ0Z1bmN0aW9uOiAnZWFzZVBvbHlPdXQnXHJcbiAgICAgICAgfSwgZW5naW5lT3B0aW9ucy5hbmltYXRpb24pO1xyXG5cclxuICAgICAgICB0aGlzLmludGVyYWN0aW9uT3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe1xyXG4gICAgICAgICAgICBkcmFnOiB0cnVlLFxyXG4gICAgICAgICAgICB6b29tOiB0cnVlLFxyXG4gICAgICAgICAgICBkcmFnTm9kZTogdHJ1ZSxcclxuICAgICAgICAgICAgc2VsZWN0Tm9kZTogdHJ1ZVxyXG4gICAgICAgIH0sIGVuZ2luZU9wdGlvbnMuaW50ZXJhY3Rpb24pO1xyXG5cclxuICAgICAgICAvLyDliJ3lp4vljJbluIPlsYDlmajphY3nva7poblcclxuICAgICAgICBPYmplY3Qua2V5cyhTVi5yZWdpc3RlcmVkTGF5b3V0KS5mb3JFYWNoKGxheW91dCA9PiB7XHJcbiAgICAgICAgICAgIGlmKHRoaXMub3B0aW9uc1RhYmxlW2xheW91dF0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgIGNvbnN0IG9wdGlvbnM6IExheW91dEdyb3VwT3B0aW9ucyA9IFNWLnJlZ2lzdGVyZWRMYXlvdXRbbGF5b3V0XS5kZWZpbmVPcHRpb25zKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgIG9wdGlvbnMuYmVoYXZpb3IgPSBPYmplY3QuYXNzaWduKHtcclxuICAgICAgICAgICAgICAgICAgICAgZHJhZ05vZGU6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgIHNlbGVjdE5vZGU6IHRydWVcclxuICAgICAgICAgICAgICAgICB9LCBvcHRpb25zLmJlaGF2aW9yKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zVGFibGVbbGF5b3V0XSA9IG9wdGlvbnM7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5tb2RlbENvbnN0cnVjdG9yID0gbmV3IE1vZGVsQ29uc3RydWN0b3IodGhpcyk7XHJcbiAgICAgICAgdGhpcy52aWV3Q29udGFpbmVyID0gbmV3IFZpZXdDb250YWluZXIodGhpcywgRE9NQ29udGFpbmVyKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOi+k+WFpeaVsOaNrui/m+ihjOa4suafk1xyXG4gICAgICogQHBhcmFtIHNvdXJjZXNEYXRhIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcmVuZGVyKHNvdXJjZURhdGE6IFNvdXJjZXMpIHtcclxuICAgICAgICBpZihzb3VyY2VEYXRhID09PSB1bmRlZmluZWQgfHwgc291cmNlRGF0YSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZih0aGlzLnZpZXdDb250YWluZXIuZ2V0RzZJbnN0YW5jZSgpLmlzQW5pbWF0aW5nKCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHN0cmluZ1NvdXJjZURhdGEgPSBKU09OLnN0cmluZ2lmeShzb3VyY2VEYXRhKTtcclxuICAgICAgICBpZih0aGlzLnByZXZTdHJpbmdTb3VyY2VEYXRhID09PSBzdHJpbmdTb3VyY2VEYXRhKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5wcmV2U3RyaW5nU291cmNlRGF0YSA9IHN0cmluZ1NvdXJjZURhdGE7XHJcblxyXG4gICAgICAgIC8vIDEg6L2s5o2i5qih5Z6L77yIZGF0YSA9PiBtb2RlbO+8iVxyXG4gICAgICAgIGNvbnN0IGxheW91dEdyb3VwVGFibGUgPSB0aGlzLm1vZGVsQ29uc3RydWN0b3IuY29uc3RydWN0KHNvdXJjZURhdGEpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIDIg5riy5p+T77yI5L2/55SoZzbov5vooYzmuLLmn5PvvIlcclxuICAgICAgICB0aGlzLnZpZXdDb250YWluZXIucmVuZGVyKGxheW91dEdyb3VwVGFibGUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6YeN5paw5biD5bGAXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZUxheW91dCgpIHtcclxuICAgICAgICB0aGlzLnZpZXdDb250YWluZXIucmVMYXlvdXQoKTtcclxuXHJcbiAgICAgICAgLy8gbGF5b3V0R3JvdXBUYWJsZS5mb3JFYWNoKGdyb3VwID0+IHtcclxuICAgICAgICAvLyAgICAgZ3JvdXAubW9kZWxMaXN0LmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgLy8gICAgICAgICBpZihpdGVtIGluc3RhbmNlb2YgU1ZMaW5rKSByZXR1cm47XHJcblxyXG4gICAgICAgIC8vICAgICAgICAgbGV0IG1vZGVsID0gaXRlbS5HNkl0ZW0uZ2V0TW9kZWwoKSxcclxuICAgICAgICAvLyAgICAgICAgICAgICB4ID0gaXRlbS5nZXQoJ3gnKSxcclxuICAgICAgICAvLyAgICAgICAgICAgICB5ID0gaXRlbS5nZXQoJ3knKTtcclxuXHJcbiAgICAgICAgLy8gICAgICAgICBtb2RlbC54ID0geDtcclxuICAgICAgICAvLyAgICAgICAgIG1vZGVsLnkgPSB5O1xyXG4gICAgICAgIC8vICAgICB9KTtcclxuICAgICAgICAvLyB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOiOt+WPliBHNiDlrp7kvotcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEdyYXBoSW5zdGFuY2UoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudmlld0NvbnRhaW5lci5nZXRHNkluc3RhbmNlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDojrflj5bmiYDmnIkgZWxlbWVudFxyXG4gICAgICogQHBhcmFtICBncm91cFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0Tm9kZXMoZ3JvdXA/OiBzdHJpbmcpOiBTVk5vZGVbXSB7XHJcbiAgICAgICAgY29uc3QgbGF5b3V0R3JvdXBUYWJsZSA9IHRoaXMubW9kZWxDb25zdHJ1Y3Rvci5nZXRMYXlvdXRHcm91cFRhYmxlKCk7XHJcblxyXG4gICAgICAgIGlmKGdyb3VwICYmIGxheW91dEdyb3VwVGFibGUuaGFzKCdncm91cCcpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBsYXlvdXRHcm91cFRhYmxlLmdldCgnZ3JvdXAnKS5ub2RlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3Qgbm9kZXM6IFNWTm9kZVtdID0gW107XHJcbiAgICAgICAgbGF5b3V0R3JvdXBUYWJsZS5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICBub2Rlcy5wdXNoKC4uLml0ZW0ubm9kZSk7XHJcbiAgICAgICAgfSlcclxuXHJcbiAgICAgICAgcmV0dXJuIG5vZGVzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6I635Y+W5omA5pyJIG1hcmtlclxyXG4gICAgICogQHBhcmFtICBncm91cFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0TWFya2Vycyhncm91cD86IHN0cmluZyk6IFNWTWFya2VyW10ge1xyXG4gICAgICAgIGNvbnN0IGxheW91dEdyb3VwVGFibGUgPSB0aGlzLm1vZGVsQ29uc3RydWN0b3IuZ2V0TGF5b3V0R3JvdXBUYWJsZSgpO1xyXG5cclxuICAgICAgICBpZihncm91cCAmJiBsYXlvdXRHcm91cFRhYmxlLmhhcygnZ3JvdXAnKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gbGF5b3V0R3JvdXBUYWJsZS5nZXQoJ2dyb3VwJykubWFya2VyO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgbWFya2VyczogU1ZNYXJrZXJbXSA9IFtdO1xyXG4gICAgICAgIGxheW91dEdyb3VwVGFibGUuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICAgICAgbWFya2Vycy5wdXNoKC4uLml0ZW0ubWFya2VyKTtcclxuICAgICAgICB9KVxyXG5cclxuICAgICAgICByZXR1cm4gbWFya2VycztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOiOt+WPluaJgOaciSBsaW5rXHJcbiAgICAgKiBAcGFyYW0gIGdyb3VwXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRMaW5rcyhncm91cD86IHN0cmluZyk6IFNWTGlua1tdIHtcclxuICAgICAgICBjb25zdCBsYXlvdXRHcm91cFRhYmxlID0gdGhpcy5tb2RlbENvbnN0cnVjdG9yLmdldExheW91dEdyb3VwVGFibGUoKTtcclxuXHJcbiAgICAgICAgaWYoZ3JvdXAgJiYgbGF5b3V0R3JvdXBUYWJsZS5oYXMoJ2dyb3VwJykpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGxheW91dEdyb3VwVGFibGUuZ2V0KCdncm91cCcpLmxpbms7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBsaW5rczogU1ZMaW5rW10gPSBbXTtcclxuICAgICAgICBsYXlvdXRHcm91cFRhYmxlLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgICAgIGxpbmtzLnB1c2goLi4uaXRlbS5saW5rKTtcclxuICAgICAgICB9KVxyXG5cclxuICAgICAgICByZXR1cm4gbGlua3M7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDpmpDol4/mn5Dkupvnu4RcclxuICAgICAqIEBwYXJhbSBncm91cE5hbWVzIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaGlkZUdyb3Vwcyhncm91cE5hbWVzOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xyXG4gICAgICAgIGNvbnN0IG5hbWVzID0gQXJyYXkuaXNBcnJheShncm91cE5hbWVzKT8gZ3JvdXBOYW1lczogW2dyb3VwTmFtZXNdLFxyXG4gICAgICAgICAgICAgIGluc3RhbmNlID0gdGhpcy52aWV3Q29udGFpbmVyLmdldEc2SW5zdGFuY2UoKSxcclxuICAgICAgICAgICAgICBsYXlvdXRHcm91cFRhYmxlID0gdGhpcy5tb2RlbENvbnN0cnVjdG9yLmdldExheW91dEdyb3VwVGFibGUoKTtcclxuXHJcbiAgICAgICAgbGF5b3V0R3JvdXBUYWJsZS5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBoYXNOYW1lID0gbmFtZXMuZmluZChuYW1lID0+IG5hbWUgPT09IGl0ZW0ubGF5b3V0KTtcclxuXHJcbiAgICAgICAgICAgIGlmKGhhc05hbWUgJiYgIWl0ZW0uaXNIaWRlKSB7XHJcbiAgICAgICAgICAgICAgICBpdGVtLm1vZGVsTGlzdC5mb3JFYWNoKG1vZGVsID0+IGluc3RhbmNlLmhpZGVJdGVtKG1vZGVsLkc2SXRlbSkpO1xyXG4gICAgICAgICAgICAgICAgaXRlbS5pc0hpZGUgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZighaGFzTmFtZSAmJiBpdGVtLmlzSGlkZSkge1xyXG4gICAgICAgICAgICAgICAgaXRlbS5tb2RlbExpc3QuZm9yRWFjaChtb2RlbCA9PiBpbnN0YW5jZS5zaG93SXRlbShtb2RlbC5HNkl0ZW0pKTtcclxuICAgICAgICAgICAgICAgIGl0ZW0uaXNIaWRlID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOS9v+eUqGlk5p+l5om+5p+Q5Liq6IqC54K5XHJcbiAgICAgKiBAcGFyYW0gaWQgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBmaW5kRWxlbWVudChpZDogc3RyaW5nKSB7XHJcbiAgICAgICAgY29uc3QgZWxlbWVudHMgPSB0aGlzLmdldE5vZGVzKCk7XHJcbiAgICAgICAgY29uc3Qgc3RyaW5nSWQgPSBpZC50b1N0cmluZygpO1xyXG4gICAgICAgIGNvbnN0IHRhcmdldEVsZW1lbnQgPSBlbGVtZW50cy5maW5kKGl0ZW0gPT4gaXRlbS5zb3VyY2VJZCA9PT0gc3RyaW5nSWQpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGFyZ2V0RWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOiwg+aVtOWuueWZqOWwuuWvuFxyXG4gICAgICogQHBhcmFtIHdpZHRoIFxyXG4gICAgICogQHBhcmFtIGhlaWdodCBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlc2l6ZSh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcikge1xyXG4gICAgICAgIHRoaXMudmlld0NvbnRhaW5lci5yZXNpemUod2lkdGgsIGhlaWdodCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDnu5HlrpogRzYg5LqL5Lu2XHJcbiAgICAgKiBAcGFyYW0gZXZlbnROYW1lIFxyXG4gICAgICogQHBhcmFtIGNhbGxiYWNrIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb24oZXZlbnROYW1lOiBzdHJpbmcsIGNhbGxiYWNrOiBGdW5jdGlvbikge1xyXG4gICAgICAgIGlmKHR5cGVvZiBjYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZihldmVudE5hbWUgPT09ICdvbkZyZWVkJyB8fCBldmVudE5hbWUgPT09ICdvbkxlYWsnKSB7XHJcbiAgICAgICAgICAgIEV2ZW50QnVzLm9uKGV2ZW50TmFtZSwgY2FsbGJhY2spO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZihldmVudE5hbWUgPT09ICdvbkxlYWtBcmVhVXBkYXRlJykge1xyXG4gICAgICAgICAgICBFdmVudEJ1cy5vbihldmVudE5hbWUsIGNhbGxiYWNrKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy52aWV3Q29udGFpbmVyLmdldEc2SW5zdGFuY2UoKS5vbihldmVudE5hbWUsIGV2ZW50ID0+IHtcclxuICAgICAgICAgICAgY2FsbGJhY2soZXZlbnQuaXRlbVsnU1ZNb2RlbCddKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOmUgOavgeW8leaTjlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZGVzdHJveSgpIHtcclxuICAgICAgICB0aGlzLm1vZGVsQ29uc3RydWN0b3IuZGVzdHJveSgpO1xyXG4gICAgICAgIHRoaXMudmlld0NvbnRhaW5lci5kZXN0cm95KCk7XHJcbiAgICB9XHJcbn07Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///291\n")},function(module,exports,__webpack_require__){"use strict";eval("\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.ModelConstructor = void 0;\r\nconst util_1 = __webpack_require__(53);\r\nconst StructV_1 = __webpack_require__(96);\r\nconst SVLink_1 = __webpack_require__(145);\r\nconst SVMarker_1 = __webpack_require__(173);\r\nconst SVNode_1 = __webpack_require__(174);\r\nclass ModelConstructor {\r\n constructor(engine) {\r\n this.engine = engine;\r\n this.prevSourcesStringMap = {};\r\n }\r\n construct(sources) {\r\n const layoutGroupTable = new Map(), layoutMap = StructV_1.SV.registeredLayout, optionsTable = this.engine.optionsTable;\r\n Object.keys(sources).forEach(group => {\r\n let sourceGroup = sources[group], layout = sourceGroup.layouter, layoutCreator = layoutMap[layout];\r\n if (!layout || !layoutCreator) {\r\n return;\r\n }\r\n let sourceDataString = JSON.stringify(sourceGroup.data), prevString = this.prevSourcesStringMap[group], nodeList = [], freedLabelList = [], leakAddress = [], markerList = [];\r\n if (prevString === sourceDataString) {\r\n return;\r\n }\r\n const options = optionsTable[layout], sourceData = layoutCreator.sourcesPreprocess(sourceGroup.data, options), nodeOptions = options.node || options['element'] || {}, markerOptions = options.marker || {};\r\n nodeList = this.constructNodes(nodeOptions, group, sourceData, layout);\r\n leakAddress = nodeList.map(item => item.leakAddress);\r\n markerList = this.constructMarkers(group, layout, markerOptions, nodeList);\r\n nodeList.forEach(item => {\r\n if (item.freedLabel) {\r\n freedLabelList.push(item.freedLabel);\r\n }\r\n });\r\n layoutGroupTable.set(group, {\r\n name: group,\r\n node: nodeList,\r\n freedLabel: freedLabelList,\r\n leakAddress: leakAddress,\r\n link: [],\r\n marker: markerList,\r\n options: options,\r\n layoutCreator,\r\n modelList: [...nodeList, ...markerList, ...freedLabelList, ...leakAddress],\r\n layout,\r\n isHide: false\r\n });\r\n });\r\n layoutGroupTable.forEach((layoutGroup, group) => {\r\n const linkOptions = layoutGroup.options.link || {}, linkList = this.constructLinks(linkOptions, layoutGroup.node, layoutGroupTable, group, layoutGroup.layout);\r\n layoutGroup.link = linkList;\r\n layoutGroup.modelList.push(...linkList);\r\n });\r\n this.layoutGroupTable = layoutGroupTable;\r\n return this.layoutGroupTable;\r\n }\r\n getLayoutGroupTable() {\r\n return this.layoutGroupTable;\r\n }\r\n constructNodes(nodeOptions, group, sourceList, layout) {\r\n let defaultSourceNodeType = 'default', nodeList = [];\r\n sourceList.forEach(item => {\r\n if (item === null) {\r\n return;\r\n }\r\n if (item.type === undefined || item.type === null) {\r\n item.type = defaultSourceNodeType;\r\n }\r\n nodeList.push(this.createNode(item, item.type, group, layout, nodeOptions[item.type]));\r\n });\r\n return nodeList;\r\n }\r\n constructLinks(linkOptions, nodes, layoutGroupTable, group, layout) {\r\n let linkList = [], linkNames = Object.keys(linkOptions);\r\n linkNames.forEach(name => {\r\n for (let i = 0; i < nodes.length; i++) {\r\n let node = nodes[i], sourceLinkData = node.sourceNode[name], targetNode = null, link = null;\r\n if (sourceLinkData === undefined || sourceLinkData === null) {\r\n node[name] = null;\r\n continue;\r\n }\r\n if (Array.isArray(sourceLinkData)) {\r\n node[name] = sourceLinkData.map((item, index) => {\r\n targetNode = this.fetchTargetNodes(layoutGroupTable, node, item);\r\n let isGeneralLink = this.isGeneralLink(sourceLinkData.toString());\r\n if (targetNode) {\r\n link = this.createLink(name, group, layout, node, targetNode, index, linkOptions[name]);\r\n linkList.push(link);\r\n }\r\n return isGeneralLink ? targetNode : null;\r\n });\r\n }\r\n else {\r\n targetNode = this.fetchTargetNodes(layoutGroupTable, node, sourceLinkData);\r\n let isGeneralLink = this.isGeneralLink(sourceLinkData.toString());\r\n if (targetNode) {\r\n link = this.createLink(name, group, layout, node, targetNode, null, linkOptions[name]);\r\n linkList.push(link);\r\n }\r\n node[name] = isGeneralLink ? targetNode : null;\r\n }\r\n }\r\n });\r\n return linkList;\r\n }\r\n constructMarkers(group, layout, markerOptions, nodes) {\r\n let markerList = [], markerNames = Object.keys(markerOptions);\r\n markerNames.forEach(name => {\r\n for (let i = 0; i < nodes.length; i++) {\r\n let node = nodes[i], markerData = node[name];\r\n if (!markerData)\r\n continue;\r\n let id = `${group}.${name}.${Array.isArray(markerData) ? markerData.join('-') : markerData}`, marker = this.createMarker(id, name, markerData, group, layout, node, markerOptions[name]);\r\n markerList.push(marker);\r\n }\r\n });\r\n return markerList;\r\n }\r\n resolveNodeLabel(label, sourceNode) {\r\n let targetLabel = '';\r\n if (Array.isArray(label)) {\r\n targetLabel = label.map(item => { var _a; return (_a = this.parserNodeContent(sourceNode, item)) !== null && _a !== void 0 ? _a : ''; });\r\n }\r\n else {\r\n targetLabel = this.parserNodeContent(sourceNode, label);\r\n }\r\n if (targetLabel === 'undefined') {\r\n targetLabel = '';\r\n }\r\n return targetLabel !== null && targetLabel !== void 0 ? targetLabel : '';\r\n }\r\n createNode(sourceNode, sourceNodeType, group, layout, options) {\r\n let label = this.resolveNodeLabel(options.label, sourceNode), id = sourceNodeType + '.' + sourceNode.id.toString(), node = new SVNode_1.SVNode(id, sourceNodeType, group, layout, sourceNode, label, options);\r\n node.leakAddress = new SVNode_1.SVLeakAddress(`${id}-leak-adress`, sourceNodeType, group, layout, node);\r\n if (node.freed) {\r\n node.freedLabel = new SVNode_1.SVFreedLabel(`${id}-freed-label`, sourceNodeType, group, layout, node);\r\n }\r\n return node;\r\n }\r\n createMarker(id, markerName, markerData, group, layout, target, options) {\r\n return new SVMarker_1.SVMarker(id, markerName, group, layout, markerData, target, options);\r\n ;\r\n }\r\n ;\r\n createLink(linkName, group, layout, node, target, index, options) {\r\n let id = `${linkName}(${node.id}-${target.id})`;\r\n return new SVLink_1.SVLink(id, linkName, group, layout, node, target, index, options);\r\n }\r\n parserNodeContent(sourceNode, formatLabel) {\r\n let fields = util_1.Util.textParser(formatLabel);\r\n if (Array.isArray(fields)) {\r\n let values = fields.map(item => sourceNode[item]);\r\n values.map((item, index) => {\r\n formatLabel = formatLabel.replace('[' + fields[index] + ']', item);\r\n });\r\n }\r\n return formatLabel;\r\n }\r\n fetchTargetNodes(layoutGroupTable, node, linkTarget) {\r\n let group = node.group, sourceNodeType = node.sourceType, nodeList, targetId = linkTarget, targetGroupName = group, targetNode = null;\r\n if (linkTarget === null || linkTarget === undefined) {\r\n return null;\r\n }\r\n if (typeof linkTarget === 'number' || (typeof linkTarget === 'string' && !linkTarget.includes('#'))) {\r\n linkTarget = 'default#' + linkTarget;\r\n }\r\n let info = linkTarget.split('#');\r\n targetId = info.pop();\r\n if (info.length > 1) {\r\n sourceNodeType = info.pop();\r\n targetGroupName = info.pop();\r\n }\r\n else {\r\n let field = info.pop();\r\n if (layoutGroupTable.get(targetGroupName).node.find(item => item.sourceType === field)) {\r\n sourceNodeType = field;\r\n }\r\n else if (layoutGroupTable.has(field)) {\r\n targetGroupName = field;\r\n }\r\n else {\r\n return null;\r\n }\r\n }\r\n nodeList = layoutGroupTable.get(targetGroupName).node.filter(item => item.sourceType === sourceNodeType);\r\n if (nodeList === undefined) {\r\n return null;\r\n }\r\n targetNode = nodeList.find(item => item.sourceId === targetId);\r\n return targetNode || null;\r\n }\r\n isGeneralLink(linkId) {\r\n let counter = 0;\r\n for (let i = 0; i < linkId.length; i++) {\r\n if (linkId[i] === '#') {\r\n counter++;\r\n }\r\n }\r\n return counter <= 2;\r\n }\r\n destroy() {\r\n this.layoutGroupTable = null;\r\n }\r\n}\r\nexports.ModelConstructor = ModelConstructor;\r\n;\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvTW9kZWwvbW9kZWxDb25zdHJ1Y3Rvci50cz82Y2U0Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHVDQUFzQztBQUl0QywwQ0FBZ0M7QUFDaEMsMENBQWtDO0FBQ2xDLDRDQUFzQztBQUV0QywwQ0FBK0Q7QUFxQi9ELE1BQWEsZ0JBQWdCO0lBS3pCLFlBQVksTUFBYztRQUN0QixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixJQUFJLENBQUMsb0JBQW9CLEdBQUcsRUFBRSxDQUFDO0lBQ25DLENBQUM7SUFNTSxTQUFTLENBQUMsT0FBZ0I7UUFDN0IsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLEdBQUcsRUFBdUIsRUFDbkQsU0FBUyxHQUFxQyxZQUFFLENBQUMsZ0JBQWdCLEVBQ2pFLFlBQVksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQztRQUU1QyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNqQyxJQUFJLFdBQVcsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQzVCLE1BQU0sR0FBRyxXQUFXLENBQUMsUUFBUSxFQUM3QixhQUFhLEdBQWtCLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUVyRCxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsYUFBYSxFQUFFO2dCQUMzQixPQUFPO2FBQ1Y7WUFFRCxJQUFJLGdCQUFnQixHQUFXLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUMzRCxVQUFVLEdBQVcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxFQUNyRCxRQUFRLEdBQWEsRUFBRSxFQUN2QixjQUFjLEdBQW1CLEVBQUUsRUFDbkMsV0FBVyxHQUFvQixFQUFFLEVBQ2pDLFVBQVUsR0FBZSxFQUFFLENBQUM7WUFFaEMsSUFBSSxVQUFVLEtBQUssZ0JBQWdCLEVBQUU7Z0JB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QUVELFFBQVEsR0FBRyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLEtBQUssY0FBYyxDQUFDLENBQUM7UUFHekcsSUFBSSxRQUFRLEtBQUssU0FBUyxFQUFFO1lBQ3hCLE9BQU8sSUFBSSxDQUFDO1NBQ2Y7UUFFRCxVQUFVLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLEtBQUssUUFBUSxDQUFDLENBQUM7UUFDL0QsT0FBTyxVQUFVLElBQUksSUFBSSxDQUFDO0lBQzlCLENBQUM7SUFNTyxhQUFhLENBQUMsTUFBYztRQUNoQyxJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUM7UUFFaEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDcEMsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUFFO2dCQUNuQixPQUFPLEVBQUUsQ0FBQzthQUNiO1NBQ0o7UUFFRCxPQUFPLE9BQU8sSUFBSSxDQUFDLENBQUM7SUFDeEIsQ0FBQztJQUtELE9BQU87UUFDSCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO0lBQ2pDLENBQUM7Q0FDSjtBQS9XRCw0Q0ErV0M7QUFBQSxDQUFDIiwiZmlsZSI6IjI5Mi5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFV0aWwgfSBmcm9tIFwiLi4vQ29tbW9uL3V0aWxcIjtcclxuaW1wb3J0IHsgRW5naW5lIH0gZnJvbSBcIi4uL2VuZ2luZVwiO1xyXG5pbXBvcnQgeyBMYXlvdXRDcmVhdG9yLCBMYXlvdXRHcm91cE9wdGlvbnMsIExpbmtPcHRpb24sIE1hcmtlck9wdGlvbiwgTm9kZU9wdGlvbiB9IGZyb20gXCIuLi9vcHRpb25zXCI7XHJcbmltcG9ydCB7IHNvdXJjZUxpbmtEYXRhLCBMaW5rVGFyZ2V0LCBTb3VyY2VzLCBTb3VyY2VOb2RlIH0gZnJvbSBcIi4uL3NvdXJjZXNcIjtcclxuaW1wb3J0IHsgU1YgfSBmcm9tIFwiLi4vU3RydWN0VlwiO1xyXG5pbXBvcnQgeyBTVkxpbmsgfSBmcm9tIFwiLi9TVkxpbmtcIjtcclxuaW1wb3J0IHsgU1ZNYXJrZXIgfSBmcm9tIFwiLi9TVk1hcmtlclwiO1xyXG5pbXBvcnQgeyBTVk1vZGVsIH0gZnJvbSBcIi4vU1ZNb2RlbFwiO1xyXG5pbXBvcnQgeyBTVkZyZWVkTGFiZWwsIFNWTGVha0FkZHJlc3MsIFNWTm9kZSB9IGZyb20gXCIuL1NWTm9kZVwiO1xyXG5cclxuXHJcbmV4cG9ydCB0eXBlIExheW91dEdyb3VwID0ge1xyXG4gICAgbmFtZTogc3RyaW5nO1xyXG4gICAgbm9kZTogU1ZOb2RlW107XHJcbiAgICBmcmVlZExhYmVsOiBTVkZyZWVkTGFiZWxbXTtcclxuICAgIGxlYWtBZGRyZXNzOiBTVkxlYWtBZGRyZXNzW107XHJcbiAgICBsaW5rOiBTVkxpbmtbXTtcclxuICAgIG1hcmtlcjogU1ZNYXJrZXJbXTtcclxuICAgIGxheW91dENyZWF0b3I6IExheW91dENyZWF0b3I7XHJcbiAgICBsYXlvdXQ6IHN0cmluZztcclxuICAgIG9wdGlvbnM6IExheW91dEdyb3VwT3B0aW9ucztcclxuICAgIG1vZGVsTGlzdDogU1ZNb2RlbFtdO1xyXG4gICAgaXNIaWRlOiBib29sZWFuO1xyXG59O1xyXG5cclxuXHJcbmV4cG9ydCB0eXBlIExheW91dEdyb3VwVGFibGUgPSBNYXA8c3RyaW5nLCBMYXlvdXRHcm91cD47XHJcblxyXG5cclxuZXhwb3J0IGNsYXNzIE1vZGVsQ29uc3RydWN0b3Ige1xyXG4gICAgcHJpdmF0ZSBlbmdpbmU6IEVuZ2luZTtcclxuICAgIHByaXZhdGUgbGF5b3V0R3JvdXBUYWJsZTogTGF5b3V0R3JvdXBUYWJsZTtcclxuICAgIHByaXZhdGUgcHJldlNvdXJjZXNTdHJpbmdNYXA6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07ICAgLy8g5L+d5a2Y5LiK5LiA5qyh5rqQ5pWw5o2u6L2s5o2i5Li65a2X56ym5Liy5LmL5ZCO55qE5YC877yM55So5L2c5q+U6L6D6K+l5qyh5rqQ5pWw5o2u5ZKM5LiK5LiA5qyh5rqQ5pWw5o2u5piv5ZCm5pyJ5beu5byC77yM6Iul55u45ZCM77yM5YiZ5Y+v6Lez6L+H6YeN5aSN5p6E5bu66L+H56iLXHJcblxyXG4gICAgY29uc3RydWN0b3IoZW5naW5lOiBFbmdpbmUpIHtcclxuICAgICAgICB0aGlzLmVuZ2luZSA9IGVuZ2luZTtcclxuICAgICAgICB0aGlzLnByZXZTb3VyY2VzU3RyaW5nTWFwID0ge307XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmnoTlu7pzdm5vZGXvvIxzdmxpbmsg5ZKMIHN2bWFya2VyXHJcbiAgICAgKiBAcGFyYW0gc291cmNlTGlzdCBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGNvbnN0cnVjdChzb3VyY2VzOiBTb3VyY2VzKTogTGF5b3V0R3JvdXBUYWJsZSB7XHJcbiAgICAgICAgY29uc3QgbGF5b3V0R3JvdXBUYWJsZSA9IG5ldyBNYXA8c3RyaW5nLCBMYXlvdXRHcm91cD4oKSxcclxuICAgICAgICAgICAgbGF5b3V0TWFwOiB7IFtrZXk6IHN0cmluZ106IExheW91dENyZWF0b3IgfSA9IFNWLnJlZ2lzdGVyZWRMYXlvdXQsXHJcbiAgICAgICAgICAgIG9wdGlvbnNUYWJsZSA9IHRoaXMuZW5naW5lLm9wdGlvbnNUYWJsZTtcclxuXHJcbiAgICAgICAgT2JqZWN0LmtleXMoc291cmNlcykuZm9yRWFjaChncm91cCA9PiB7XHJcbiAgICAgICAgICAgIGxldCBzb3VyY2VHcm91cCA9IHNvdXJjZXNbZ3JvdXBdLFxyXG4gICAgICAgICAgICAgICAgbGF5b3V0ID0gc291cmNlR3JvdXAubGF5b3V0ZXIsXHJcbiAgICAgICAgICAgICAgICBsYXlvdXRDcmVhdG9yOiBMYXlvdXRDcmVhdG9yID0gbGF5b3V0TWFwW2xheW91dF07XHJcblxyXG4gICAgICAgICAgICBpZiAoIWxheW91dCB8fCAhbGF5b3V0Q3JlYXRvcikge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsZXQgc291cmNlRGF0YVN0cmluZzogc3RyaW5nID0gSlNPTi5zdHJpbmdpZnkoc291cmNlR3JvdXAuZGF0YSksXHJcbiAgICAgICAgICAgICAgICBwcmV2U3RyaW5nOiBzdHJpbmcgPSB0aGlzLnByZXZTb3VyY2VzU3RyaW5nTWFwW2dyb3VwXSxcclxuICAgICAgICAgICAgICAgIG5vZGVMaXN0OiBTVk5vZGVbXSA9IFtdLFxyXG4gICAgICAgICAgICAgICAgZnJlZWRMYWJlbExpc3Q6IFNWRnJlZWRMYWJlbFtdID0gW10sXHJcbiAgICAgICAgICAgICAgICBsZWFrQWRkcmVzczogU1ZMZWFrQWRkcmVzc1tdID0gW10sXHJcbiAgICAgICAgICAgICAgICBtYXJrZXJMaXN0OiBTVk1hcmtlcltdID0gW107XHJcblxyXG4gICAgICAgICAgICBpZiAocHJldlN0cmluZyA9PT0gc291cmNlRGF0YVN0cmluZykge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCBvcHRpb25zOiBMYXlvdXRHcm91cE9wdGlvbnMgPSBvcHRpb25zVGFibGVbbGF5b3V0XSxcclxuICAgICAgICAgICAgICAgIHNvdXJjZURhdGEgPSBsYXlvdXRDcmVhdG9yLnNvdXJjZXNQcmVwcm9jZXNzKHNvdXJjZUdyb3VwLmRhdGEsIG9wdGlvbnMpLFxyXG4gICAgICAgICAgICAgICAgbm9kZU9wdGlvbnMgPSBvcHRpb25zLm5vZGUgfHwgb3B0aW9uc1snZWxlbWVudCddIHx8IHt9LFxyXG4gICAgICAgICAgICAgICAgbWFya2VyT3B0aW9ucyA9IG9wdGlvbnMubWFya2VyIHx8IHt9O1xyXG5cclxuICAgICAgICAgICAgbm9kZUxpc3QgPSB0aGlzLmNvbnN0cnVjdE5vZGVzKG5vZGVPcHRpb25zLCBncm91cCwgc291cmNlRGF0YSwgbGF5b3V0KTtcclxuICAgICAgICAgICAgbGVha0FkZHJlc3MgPSBub2RlTGlzdC5tYXAoaXRlbSA9PiBpdGVtLmxlYWtBZGRyZXNzKTtcclxuICAgICAgICAgICAgbWFya2VyTGlzdCA9IHRoaXMuY29uc3RydWN0TWFya2Vycyhncm91cCwgbGF5b3V0LCBtYXJrZXJPcHRpb25zLCBub2RlTGlzdCk7XHJcbiAgICAgICAgICAgIG5vZGVMaXN0LmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZihpdGVtLmZyZWVkTGFiZWwpIHtcclxuICAgICAgICAgICAgICAgICAgICBmcmVlZExhYmVsTGlzdC5wdXNoKGl0ZW0uZnJlZWRMYWJlbCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgbGF5b3V0R3JvdXBUYWJsZS5zZXQoZ3JvdXAsIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IGdyb3VwLFxyXG4gICAgICAgICAgICAgICAgbm9kZTogbm9kZUxpc3QsXHJcbiAgICAgICAgICAgICAgICBmcmVlZExhYmVsOiBmcmVlZExhYmVsTGlzdCwgXHJcbiAgICAgICAgICAgICAgICBsZWFrQWRkcmVzczogbGVha0FkZHJlc3MsXHJcbiAgICAgICAgICAgICAgICBsaW5rOiBbXSxcclxuICAgICAgICAgICAgICAgIG1hcmtlcjogbWFya2VyTGlzdCxcclxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IG9wdGlvbnMsXHJcbiAgICAgICAgICAgICAgICBsYXlvdXRDcmVhdG9yLFxyXG4gICAgICAgICAgICAgICAgbW9kZWxMaXN0OiBbLi4ubm9kZUxpc3QsIC4uLm1hcmtlckxpc3QsIC4uLmZyZWVkTGFiZWxMaXN0LCAuLi5sZWFrQWRkcmVzc10sXHJcbiAgICAgICAgICAgICAgICBsYXlvdXQsXHJcbiAgICAgICAgICAgICAgICBpc0hpZGU6IGZhbHNlXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBsYXlvdXRHcm91cFRhYmxlLmZvckVhY2goKGxheW91dEdyb3VwOiBMYXlvdXRHcm91cCwgZ3JvdXA6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBsaW5rT3B0aW9ucyA9IGxheW91dEdyb3VwLm9wdGlvbnMubGluayB8fCB7fSxcclxuICAgICAgICAgICAgICAgIGxpbmtMaXN0OiBTVkxpbmtbXSA9IHRoaXMuY29uc3RydWN0TGlua3MobGlua09wdGlvbnMsIGxheW91dEdyb3VwLm5vZGUsIGxheW91dEdyb3VwVGFibGUsIGdyb3VwLCBsYXlvdXRHcm91cC5sYXlvdXQsICk7XHJcblxyXG4gICAgICAgICAgICBsYXlvdXRHcm91cC5saW5rID0gbGlua0xpc3Q7XHJcbiAgICAgICAgICAgIGxheW91dEdyb3VwLm1vZGVsTGlzdC5wdXNoKC4uLmxpbmtMaXN0KTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5sYXlvdXRHcm91cFRhYmxlID0gbGF5b3V0R3JvdXBUYWJsZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMubGF5b3V0R3JvdXBUYWJsZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRMYXlvdXRHcm91cFRhYmxlKCk6IExheW91dEdyb3VwVGFibGUge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmxheW91dEdyb3VwVGFibGU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDku47mupDmlbDmja7mnoTlu7ogbm9kZSDpm4ZcclxuICAgICAqIEBwYXJhbSBub2RlT3B0aW9ucyBcclxuICAgICAqIEBwYXJhbSBncm91cFxyXG4gICAgICogQHBhcmFtIHNvdXJjZUxpc3QgXHJcbiAgICAgKiBAcGFyYW0gbGF5b3V0XHJcbiAgICAgKiBAcmV0dXJucyBcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3ROb2Rlcyhub2RlT3B0aW9uczogeyBba2V5OiBzdHJpbmddOiBOb2RlT3B0aW9uIH0sIGdyb3VwOiBzdHJpbmcsIHNvdXJjZUxpc3Q6IFNvdXJjZU5vZGVbXSwgbGF5b3V0OiBzdHJpbmcpOiBTVk5vZGVbXSB7XHJcbiAgICAgICAgbGV0IGRlZmF1bHRTb3VyY2VOb2RlVHlwZTogc3RyaW5nID0gJ2RlZmF1bHQnLFxyXG4gICAgICAgICAgICBub2RlTGlzdDogU1ZOb2RlW10gPSBbXTtcclxuXHJcbiAgICAgICAgc291cmNlTGlzdC5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICBpZiAoaXRlbSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoaXRlbS50eXBlID09PSB1bmRlZmluZWQgfHwgaXRlbS50eXBlID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBpdGVtLnR5cGUgPSBkZWZhdWx0U291cmNlTm9kZVR5cGU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIG5vZGVMaXN0LnB1c2godGhpcy5jcmVhdGVOb2RlKGl0ZW0sIGl0ZW0udHlwZSwgZ3JvdXAsIGxheW91dCwgbm9kZU9wdGlvbnNbaXRlbS50eXBlXSkpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gbm9kZUxpc3Q7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDku47phY3nva7lkowgbm9kZSDpm4bmnoTlu7ogbGluayDpm4ZcclxuICAgICAqIEBwYXJhbSBsaW5rT3B0aW9ucyBcclxuICAgICAqIEBwYXJhbSBub2RlcyBcclxuICAgICAqIEBwYXJhbSBsYXlvdXRHcm91cFRhYmxlXHJcbiAgICAgKiBAcmV0dXJucyBcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RMaW5rcyhsaW5rT3B0aW9uczogeyBba2V5OiBzdHJpbmddOiBMaW5rT3B0aW9uIH0sIG5vZGVzOiBTVk5vZGVbXSwgbGF5b3V0R3JvdXBUYWJsZTogTGF5b3V0R3JvdXBUYWJsZSwgZ3JvdXA6IHN0cmluZywgbGF5b3V0OiBzdHJpbmcpOiBTVkxpbmtbXSB7XHJcbiAgICAgICAgbGV0IGxpbmtMaXN0OiBTVkxpbmtbXSA9IFtdLFxyXG4gICAgICAgICAgICBsaW5rTmFtZXMgPSBPYmplY3Qua2V5cyhsaW5rT3B0aW9ucyk7XHJcblxyXG4gICAgICAgIGxpbmtOYW1lcy5mb3JFYWNoKG5hbWUgPT4ge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgbm9kZTogU1ZOb2RlID0gbm9kZXNbaV0sXHJcbiAgICAgICAgICAgICAgICAgICAgc291cmNlTGlua0RhdGE6IHNvdXJjZUxpbmtEYXRhID0gbm9kZS5zb3VyY2VOb2RlW25hbWVdLFxyXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldE5vZGU6IFNWTm9kZSB8IFNWTm9kZVtdID0gbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICBsaW5rOiBTVkxpbmsgPSBudWxsO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChzb3VyY2VMaW5rRGF0YSA9PT0gdW5kZWZpbmVkIHx8IHNvdXJjZUxpbmtEYXRhID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbm9kZVtuYW1lXSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gIC0tLS0tLS0tLS0tLS0tLS0tLS0g5bCG6L+e5o6l5aOw5piO5a2X5q61IHNvdXJjZUxpbmtEYXRhIOS7jiBpZCDlj5jkuLogU1ZOb2RlIC0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHNvdXJjZUxpbmtEYXRhKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIG5vZGVbbmFtZV0gPSBzb3VyY2VMaW5rRGF0YS5tYXAoKGl0ZW0sIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldE5vZGUgPSB0aGlzLmZldGNoVGFyZ2V0Tm9kZXMobGF5b3V0R3JvdXBUYWJsZSwgbm9kZSwgaXRlbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpc0dlbmVyYWxMaW5rID0gdGhpcy5pc0dlbmVyYWxMaW5rKHNvdXJjZUxpbmtEYXRhLnRvU3RyaW5nKCkpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldE5vZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmsgPSB0aGlzLmNyZWF0ZUxpbmsobmFtZSwgZ3JvdXAsIGxheW91dCwgbm9kZSwgdGFyZ2V0Tm9kZSwgaW5kZXgsIGxpbmtPcHRpb25zW25hbWVdKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtMaXN0LnB1c2gobGluayk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpc0dlbmVyYWxMaW5rID8gdGFyZ2V0Tm9kZSA6IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0YXJnZXROb2RlID0gdGhpcy5mZXRjaFRhcmdldE5vZGVzKGxheW91dEdyb3VwVGFibGUsIG5vZGUsIHNvdXJjZUxpbmtEYXRhKTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgaXNHZW5lcmFsTGluayA9IHRoaXMuaXNHZW5lcmFsTGluayhzb3VyY2VMaW5rRGF0YS50b1N0cmluZygpKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldE5vZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGluayA9IHRoaXMuY3JlYXRlTGluayhuYW1lLCBncm91cCwgbGF5b3V0LCBub2RlLCB0YXJnZXROb2RlLCBudWxsLCBsaW5rT3B0aW9uc1tuYW1lXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtMaXN0LnB1c2gobGluayk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBub2RlW25hbWVdID0gaXNHZW5lcmFsTGluayA/IHRhcmdldE5vZGUgOiBudWxsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiBsaW5rTGlzdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOS7jumFjee9ruWSjCBub2RlIOmbhuaehOW7uiBtYXJrZXIg6ZuGXHJcbiAgICAgKiBAcGFyYW0gbWFya2VyT3B0aW9ucyBcclxuICAgICAqIEBwYXJhbSBub2Rlc1xyXG4gICAgICogQHJldHVybnMgXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgY29uc3RydWN0TWFya2Vycyhncm91cDogc3RyaW5nLCBsYXlvdXQ6IHN0cmluZywgbWFya2VyT3B0aW9uczogeyBba2V5OiBzdHJpbmddOiBNYXJrZXJPcHRpb24gfSwgbm9kZXM6IFNWTm9kZVtdKTogU1ZNYXJrZXJbXSB7XHJcbiAgICAgICAgbGV0IG1hcmtlckxpc3Q6IFNWTWFya2VyW10gPSBbXSxcclxuICAgICAgICAgICAgbWFya2VyTmFtZXMgPSBPYmplY3Qua2V5cyhtYXJrZXJPcHRpb25zKTtcclxuXHJcbiAgICAgICAgbWFya2VyTmFtZXMuZm9yRWFjaChuYW1lID0+IHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgbGV0IG5vZGUgPSBub2Rlc1tpXSxcclxuICAgICAgICAgICAgICAgICAgICBtYXJrZXJEYXRhID0gbm9kZVtuYW1lXTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyDoi6XmsqHmnInmjIfpkojlrZfmrrXnmoTnu5PngrnliJnot7Pov4dcclxuICAgICAgICAgICAgICAgIGlmICghbWFya2VyRGF0YSkgY29udGludWU7XHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IGlkID0gYCR7Z3JvdXB9LiR7bmFtZX0uJHtBcnJheS5pc0FycmF5KG1hcmtlckRhdGEpID8gbWFya2VyRGF0YS5qb2luKCctJykgOiBtYXJrZXJEYXRhfWAsXHJcbiAgICAgICAgICAgICAgICAgICAgbWFya2VyID0gdGhpcy5jcmVhdGVNYXJrZXIoaWQsIG5hbWUsIG1hcmtlckRhdGEsIGdyb3VwLCBsYXlvdXQsIG5vZGUsIG1hcmtlck9wdGlvbnNbbmFtZV0pO1xyXG5cclxuICAgICAgICAgICAgICAgIG1hcmtlckxpc3QucHVzaChtYXJrZXIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiBtYXJrZXJMaXN0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5rGC6KejbGFiZWzmlofmnKxcclxuICAgICAqIEBwYXJhbSBsYWJlbCBcclxuICAgICAqIEBwYXJhbSBzb3VyY2VOb2RlIFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHJlc29sdmVOb2RlTGFiZWwobGFiZWw6IHN0cmluZyB8IHN0cmluZ1tdLCBzb3VyY2VOb2RlOiBTb3VyY2VOb2RlKTogc3RyaW5nIHtcclxuICAgICAgICBsZXQgdGFyZ2V0TGFiZWw6IGFueSA9ICcnO1xyXG5cclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShsYWJlbCkpIHtcclxuICAgICAgICAgICAgdGFyZ2V0TGFiZWwgPSBsYWJlbC5tYXAoaXRlbSA9PiB0aGlzLnBhcnNlck5vZGVDb250ZW50KHNvdXJjZU5vZGUsIGl0ZW0pID8/ICcnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRhcmdldExhYmVsID0gdGhpcy5wYXJzZXJOb2RlQ29udGVudChzb3VyY2VOb2RlLCBsYWJlbCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGFyZ2V0TGFiZWwgPT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgIHRhcmdldExhYmVsID0gJyc7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGFyZ2V0TGFiZWwgPz8gJyc7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDlhYPntKDlt6XljoLvvIzliJvlu7ogTm9kZVxyXG4gICAgICogQHBhcmFtIHNvdXJjZU5vZGVcclxuICAgICAqIEBwYXJhbSBzb3VyY2VOb2RlVHlwZVxyXG4gICAgICogQHBhcmFtIGdyb3VwXHJcbiAgICAgKiBAcGFyYW0gbGF5b3V0XHJcbiAgICAgKiBAcGFyYW0gb3B0aW9uc1xyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGNyZWF0ZU5vZGUoc291cmNlTm9kZTogU291cmNlTm9kZSwgc291cmNlTm9kZVR5cGU6IHN0cmluZywgZ3JvdXA6IHN0cmluZywgbGF5b3V0OiBzdHJpbmcsIG9wdGlvbnM6IE5vZGVPcHRpb24pOiBTVk5vZGUge1xyXG4gICAgICAgIGxldCBsYWJlbDogc3RyaW5nIHwgc3RyaW5nW10gPSB0aGlzLnJlc29sdmVOb2RlTGFiZWwob3B0aW9ucy5sYWJlbCwgc291cmNlTm9kZSksXHJcbiAgICAgICAgICAgIGlkID0gc291cmNlTm9kZVR5cGUgKyAnLicgKyBzb3VyY2VOb2RlLmlkLnRvU3RyaW5nKCksXHJcbiAgICAgICAgICAgIG5vZGUgPSBuZXcgU1ZOb2RlKGlkLCBzb3VyY2VOb2RlVHlwZSwgZ3JvdXAsIGxheW91dCwgc291cmNlTm9kZSwgbGFiZWwsIG9wdGlvbnMpO1xyXG4gICAgICAgICAgICBub2RlLmxlYWtBZGRyZXNzID0gbmV3IFNWTGVha0FkZHJlc3MoYCR7aWR9LWxlYWstYWRyZXNzYCwgc291cmNlTm9kZVR5cGUsIGdyb3VwLCBsYXlvdXQsIG5vZGUpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGlmKG5vZGUuZnJlZWQpIHtcclxuICAgICAgICAgICAgbm9kZS5mcmVlZExhYmVsID0gbmV3IFNWRnJlZWRMYWJlbChgJHtpZH0tZnJlZWQtbGFiZWxgLCBzb3VyY2VOb2RlVHlwZSwgZ3JvdXAsIGxheW91dCwgbm9kZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbm9kZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOWklumDqOaMh+mSiOW3peWOgu+8jOWIm+W7um1hcmtlclxyXG4gICAgICogQHBhcmFtIGlkIFxyXG4gICAgICogQHBhcmFtIG1hcmtlck5hbWUgXHJcbiAgICAgKiBAcGFyYW0gbWFya2VyRGF0YSBcclxuICAgICAqIEBwYXJhbSBncm91cCBcclxuICAgICAqIEBwYXJhbSBsYXlvdXQgXHJcbiAgICAgKiBAcGFyYW0gdGFyZ2V0IFxyXG4gICAgICogQHBhcmFtIG9wdGlvbnMgXHJcbiAgICAgKiBAcmV0dXJucyBcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBjcmVhdGVNYXJrZXIoaWQ6IHN0cmluZywgbWFya2VyTmFtZTogc3RyaW5nLCBtYXJrZXJEYXRhOiBzdHJpbmcgfCBzdHJpbmdbXSwgZ3JvdXA6IHN0cmluZywgbGF5b3V0OiBzdHJpbmcsIHRhcmdldDogU1ZOb2RlLCBvcHRpb25zOiBNYXJrZXJPcHRpb24pOiBTVk1hcmtlciB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBTVk1hcmtlcihpZCwgbWFya2VyTmFtZSwgZ3JvdXAsIGxheW91dCwgbWFya2VyRGF0YSwgdGFyZ2V0LCBvcHRpb25zKTs7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICog6L+e57q/5bel5Y6C77yM5Yib5bu6TGlua1xyXG4gICAgICogQHBhcmFtIGxpbmtOYW1lIFxyXG4gICAgICogQHBhcmFtIGdyb3VwIFxyXG4gICAgICogQHBhcmFtIGxheW91dCBcclxuICAgICAqIEBwYXJhbSBub2RlIFxyXG4gICAgICogQHBhcmFtIHRhcmdldCBcclxuICAgICAqIEBwYXJhbSBpbmRleCBcclxuICAgICAqIEBwYXJhbSBvcHRpb25zIFxyXG4gICAgICogQHJldHVybnMgXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgY3JlYXRlTGluayhsaW5rTmFtZTogc3RyaW5nLCBncm91cDogc3RyaW5nLCBsYXlvdXQ6IHN0cmluZywgbm9kZTogU1ZOb2RlLCB0YXJnZXQ6IFNWTm9kZSwgaW5kZXg6IG51bWJlciwgb3B0aW9uczogTGlua09wdGlvbik6IFNWTGluayB7XHJcbiAgICAgICAgbGV0IGlkID0gYCR7bGlua05hbWV9KCR7bm9kZS5pZH0tJHt0YXJnZXQuaWR9KWA7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBTVkxpbmsoaWQsIGxpbmtOYW1lLCBncm91cCwgbGF5b3V0LCBub2RlLCB0YXJnZXQsIGluZGV4LCBvcHRpb25zKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOino+aekOWFg+e0oOaWh+acrOWGheWuuVxyXG4gICAgICogQHBhcmFtIHNvdXJjZU5vZGVcclxuICAgICAqIEBwYXJhbSBmb3JtYXRMYWJlbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHBhcnNlck5vZGVDb250ZW50KHNvdXJjZU5vZGU6IFNvdXJjZU5vZGUsIGZvcm1hdExhYmVsOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgICAgIGxldCBmaWVsZHMgPSBVdGlsLnRleHRQYXJzZXIoZm9ybWF0TGFiZWwpO1xyXG5cclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShmaWVsZHMpKSB7XHJcbiAgICAgICAgICAgIGxldCB2YWx1ZXMgPSBmaWVsZHMubWFwKGl0ZW0gPT4gc291cmNlTm9kZVtpdGVtXSk7XHJcblxyXG4gICAgICAgICAgICB2YWx1ZXMubWFwKChpdGVtLCBpbmRleCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgZm9ybWF0TGFiZWwgPSBmb3JtYXRMYWJlbC5yZXBsYWNlKCdbJyArIGZpZWxkc1tpbmRleF0gKyAnXScsIGl0ZW0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBmb3JtYXRMYWJlbDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOeUsXNvdXJjZeS4reeahOi/nuaOpeWtl+auteiOt+WPluecn+WunueahOi/nuaOpeebruagh+WFg+e0oFxyXG4gICAgICogQHBhcmFtIG5vZGVDb250YWluZXJcclxuICAgICAqIEBwYXJhbSBub2RlXHJcbiAgICAgKiBAcGFyYW0gbGlua1RhcmdldCBcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBmZXRjaFRhcmdldE5vZGVzKGxheW91dEdyb3VwVGFibGU6IExheW91dEdyb3VwVGFibGUsIG5vZGU6IFNWTm9kZSwgbGlua1RhcmdldDogTGlua1RhcmdldCk6IFNWTm9kZSB7XHJcbiAgICAgICAgbGV0IGdyb3VwOiBzdHJpbmcgPSBub2RlLmdyb3VwLFxyXG4gICAgICAgICAgICBzb3VyY2VOb2RlVHlwZSA9IG5vZGUuc291cmNlVHlwZSxcclxuICAgICAgICAgICAgbm9kZUxpc3Q6IFNWTm9kZVtdLFxyXG4gICAgICAgICAgICB0YXJnZXRJZCA9IGxpbmtUYXJnZXQsXHJcbiAgICAgICAgICAgIHRhcmdldEdyb3VwTmFtZSA9IGdyb3VwLFxyXG4gICAgICAgICAgICB0YXJnZXROb2RlID0gbnVsbDtcclxuXHJcbiAgICAgICAgaWYgKGxpbmtUYXJnZXQgPT09IG51bGwgfHwgbGlua1RhcmdldCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHR5cGVvZiBsaW5rVGFyZ2V0ID09PSAnbnVtYmVyJyB8fCAodHlwZW9mIGxpbmtUYXJnZXQgPT09ICdzdHJpbmcnICYmICFsaW5rVGFyZ2V0LmluY2x1ZGVzKCcjJykpKSB7XHJcbiAgICAgICAgICAgIGxpbmtUYXJnZXQgPSAnZGVmYXVsdCMnICsgbGlua1RhcmdldDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBpbmZvID0gbGlua1RhcmdldC5zcGxpdCgnIycpO1xyXG5cclxuICAgICAgICB0YXJnZXRJZCA9IGluZm8ucG9wKCk7XHJcblxyXG4gICAgICAgIGlmIChpbmZvLmxlbmd0aCA+IDEpIHtcclxuICAgICAgICAgICAgc291cmNlTm9kZVR5cGUgPSBpbmZvLnBvcCgpO1xyXG4gICAgICAgICAgICB0YXJnZXRHcm91cE5hbWUgPSBpbmZvLnBvcCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgbGV0IGZpZWxkID0gaW5mby5wb3AoKTtcclxuICAgICAgICAgICAgaWYgKGxheW91dEdyb3VwVGFibGUuZ2V0KHRhcmdldEdyb3VwTmFtZSkubm9kZS5maW5kKGl0ZW0gPT4gaXRlbS5zb3VyY2VUeXBlID09PSBmaWVsZCkpIHtcclxuICAgICAgICAgICAgICAgIHNvdXJjZU5vZGVUeXBlID0gZmllbGQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAobGF5b3V0R3JvdXBUYWJsZS5oYXMoZmllbGQpKSB7XHJcbiAgICAgICAgICAgICAgICB0YXJnZXRHcm91cE5hbWUgPSBmaWVsZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBub2RlTGlzdCA9IGxheW91dEdyb3VwVGFibGUuZ2V0KHRhcmdldEdyb3VwTmFtZSkubm9kZS5maWx0ZXIoaXRlbSA9PiBpdGVtLnNvdXJjZVR5cGUgPT09IHNvdXJjZU5vZGVUeXBlKTtcclxuXHJcbiAgICAgICAgLy8g6Iul55uu5qCHbm9kZeS4jeWtmOWcqO+8jOi/lOWbnm51bGxcclxuICAgICAgICBpZiAobm9kZUxpc3QgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRhcmdldE5vZGUgPSBub2RlTGlzdC5maW5kKGl0ZW0gPT4gaXRlbS5zb3VyY2VJZCA9PT0gdGFyZ2V0SWQpO1xyXG4gICAgICAgIHJldHVybiB0YXJnZXROb2RlIHx8IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmo4DmtYvmlLnmjIfpkojmmK/lkKbkuLrluLjop4TmjIfpkojvvIjmjIflkJHlj6bkuIDkuKpncm91cO+8iVxyXG4gICAgICogQHBhcmFtIGxpbmtJZCBcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBpc0dlbmVyYWxMaW5rKGxpbmtJZDogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICAgICAgbGV0IGNvdW50ZXIgPSAwO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmtJZC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAobGlua0lkW2ldID09PSAnIycpIHtcclxuICAgICAgICAgICAgICAgIGNvdW50ZXIrKztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGNvdW50ZXIgPD0gMjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOmUgOavgVxyXG4gICAgICovXHJcbiAgICBkZXN0cm95KCkge1xyXG4gICAgICAgIHRoaXMubGF5b3V0R3JvdXBUYWJsZSA9IG51bGw7XHJcbiAgICB9XHJcbn07Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///292\n")},function(module,exports,__webpack_require__){"use strict";eval("\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.ViewContainer = void 0;\r\nconst layoutProvider_1 = __webpack_require__(294);\r\nconst util_1 = __webpack_require__(53);\r\nconst renderer_1 = __webpack_require__(295);\r\nconst reconcile_1 = __webpack_require__(565);\r\nconst fixNodeMarkerDrag_1 = __webpack_require__(567);\r\nconst dragCanavsWithLeak_1 = __webpack_require__(568);\r\nconst eventBus_1 = __webpack_require__(97);\r\nconst group_1 = __webpack_require__(149);\r\nclass ViewContainer {\r\n constructor(engine, DOMContainer) {\r\n this.engine = engine;\r\n this.layoutProvider = new layoutProvider_1.LayoutProvider(engine, this);\r\n this.renderer = new renderer_1.Renderer(engine, DOMContainer);\r\n this.reconcile = new reconcile_1.Reconcile(engine, this.renderer);\r\n this.prevLayoutGroupTable = new Map();\r\n this.prevModelList = [];\r\n this.accumulateLeakModels = [];\r\n this.hasLeak = false;\r\n const g6Instance = this.renderer.getG6Instance(), leakAreaHeight = this.engine.viewOptions.leakAreaHeight, height = this.getG6Instance().getHeight(), { drag, zoom } = this.engine.interactionOptions;\r\n this.leakAreaY = height * (1 - leakAreaHeight);\r\n if (drag) {\r\n dragCanavsWithLeak_1.InitDragCanvasWithLeak(this);\r\n }\r\n if (zoom) {\r\n }\r\n fixNodeMarkerDrag_1.FixNodeMarkerDrag(g6Instance, this.engine.optionsTable);\r\n }\r\n reLayout() {\r\n this.layoutProvider.layoutAll(this.prevLayoutGroupTable, [], this.accumulateLeakModels);\r\n }\r\n getG6Instance() {\r\n return this.renderer.getG6Instance();\r\n }\r\n refresh() {\r\n this.renderer.getG6Instance().refresh();\r\n }\r\n resize(width, height) {\r\n this.renderer.getG6Instance().changeSize(width, height);\r\n const containerHeight = this.getG6Instance().getHeight(), leakAreaHeight = this.engine.viewOptions.leakAreaHeight, targetY = containerHeight * (1 - leakAreaHeight);\r\n const accumulateLeakGroup = new group_1.Group();\r\n accumulateLeakGroup.add(...this.accumulateLeakModels);\r\n accumulateLeakGroup.translate(0, targetY - this.leakAreaY);\r\n this.leakAreaY = targetY;\r\n eventBus_1.EventBus.emit('onLeakAreaUpdate', {\r\n leakAreaY: this.leakAreaY,\r\n hasLeak: this.hasLeak\r\n });\r\n }\r\n render(layoutGroupTable) {\r\n const modelList = util_1.Util.convertGroupTable2ModelList(layoutGroupTable), diffResult = this.reconcile.diff(this.prevModelList, modelList, this.accumulateLeakModels), renderModelList = [\r\n ...modelList,\r\n ...diffResult.REMOVE,\r\n ...diffResult.LEAKED,\r\n ...diffResult.ACCUMULATE_LEAK\r\n ];\r\n if (this.hasLeak === true && this.accumulateLeakModels.length === 0) {\r\n this.hasLeak = false;\r\n eventBus_1.EventBus.emit('onLeakAreaUpdate', {\r\n leakAreaY: this.leakAreaY,\r\n hasLeak: this.hasLeak\r\n });\r\n }\r\n if (diffResult.LEAKED.length) {\r\n this.hasLeak = true;\r\n eventBus_1.EventBus.emit('onLeakAreaUpdate', {\r\n leakAreaY: this.leakAreaY,\r\n hasLeak: this.hasLeak\r\n });\r\n }\r\n this.renderer.build(renderModelList);\r\n this.layoutProvider.layoutAll(layoutGroupTable, this.accumulateLeakModels, diffResult.LEAKED);\r\n this.beforeRender();\r\n this.renderer.render(renderModelList);\r\n this.reconcile.patch(diffResult);\r\n this.afterRender();\r\n this.accumulateLeakModels.push(...diffResult.LEAKED);\r\n this.prevLayoutGroupTable = layoutGroupTable;\r\n this.prevModelList = modelList;\r\n }\r\n destroy() {\r\n this.renderer.destroy();\r\n }\r\n afterRender() {\r\n const g6Instance = this.renderer.getG6Instance();\r\n g6Instance.getEdges().forEach(item => item.toFront());\r\n g6Instance.paint();\r\n this.prevModelList.forEach(item => {\r\n if (item.leaked === false) {\r\n item.discarded = true;\r\n }\r\n });\r\n }\r\n beforeRender() {\r\n }\r\n}\r\nexports.ViewContainer = ViewContainer;\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvVmlldy92aWV3Q29udGFpbmVyLnRzPzRhNjIiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0Esa0RBQWtEO0FBRWxELHVDQUFzQztBQUV0Qyw0Q0FBc0M7QUFDdEMsNkNBQXdDO0FBQ3hDLHFEQUF3RTtBQUN4RSxzREFBOEU7QUFDOUUsMkNBQThDO0FBQzlDLHlDQUF3QztBQUl4QyxNQUFhLGFBQWE7SUFhdEIsWUFBWSxNQUFjLEVBQUUsWUFBeUI7UUFDakQsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLCtCQUFjLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3ZELElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxtQkFBUSxDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUMsQ0FBQztRQUNuRCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUkscUJBQVMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3RELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ3RDLElBQUksQ0FBQyxhQUFhLEdBQUcsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxFQUFFLENBQUM7UUFDL0IsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7UUFFckIsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUUsRUFDNUMsY0FBYyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLGNBQWMsRUFDdkQsTUFBTSxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxTQUFTLEVBQUUsRUFDekMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQztRQUVwRCxJQUFJLENBQUMsU0FBUyxHQUFHLE1BQU0s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RCxzQ0E0S0MiLCJmaWxlIjoiMjkzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRW5naW5lIH0gZnJvbSBcIi4uL2VuZ2luZVwiO1xyXG5pbXBvcnQgeyBMYXlvdXRQcm92aWRlciB9IGZyb20gXCIuL2xheW91dFByb3ZpZGVyXCI7XHJcbmltcG9ydCB7IExheW91dEdyb3VwVGFibGUgfSBmcm9tIFwiLi4vTW9kZWwvbW9kZWxDb25zdHJ1Y3RvclwiO1xyXG5pbXBvcnQgeyBVdGlsIH0gZnJvbSBcIi4uL0NvbW1vbi91dGlsXCI7XHJcbmltcG9ydCB7IFNWTW9kZWwgfSBmcm9tIFwiLi4vTW9kZWwvU1ZNb2RlbFwiO1xyXG5pbXBvcnQgeyBSZW5kZXJlciB9IGZyb20gXCIuL3JlbmRlcmVyXCI7XHJcbmltcG9ydCB7IFJlY29uY2lsZSB9IGZyb20gXCIuL3JlY29uY2lsZVwiO1xyXG5pbXBvcnQgeyBGaXhOb2RlTWFya2VyRHJhZyB9IGZyb20gXCIuLi9CZWhhdmlvckhlbHBlci9maXhOb2RlTWFya2VyRHJhZ1wiO1xyXG5pbXBvcnQgeyBJbml0RHJhZ0NhbnZhc1dpdGhMZWFrIH0gZnJvbSBcIi4uL0JlaGF2aW9ySGVscGVyL2RyYWdDYW5hdnNXaXRoTGVha1wiO1xyXG5pbXBvcnQgeyBFdmVudEJ1cyB9IGZyb20gXCIuLi9Db21tb24vZXZlbnRCdXNcIjtcclxuaW1wb3J0IHsgR3JvdXAgfSBmcm9tIFwiLi4vQ29tbW9uL2dyb3VwXCI7XHJcblxyXG5cclxuXHJcbmV4cG9ydCBjbGFzcyBWaWV3Q29udGFpbmVyIHtcclxuICAgIHByaXZhdGUgZW5naW5lOiBFbmdpbmU7XHJcbiAgICBwcml2YXRlIGxheW91dFByb3ZpZGVyOiBMYXlvdXRQcm92aWRlcjtcclxuICAgIHByaXZhdGUgcmVjb25jaWxlOiBSZWNvbmNpbGU7XHJcbiAgICBwdWJsaWMgcmVuZGVyZXI6IFJlbmRlcmVyO1xyXG5cclxuICAgIHByaXZhdGUgcHJldkxheW91dEdyb3VwVGFibGU6IExheW91dEdyb3VwVGFibGU7XHJcbiAgICBwcml2YXRlIHByZXZNb2RlbExpc3Q6IFNWTW9kZWxbXTtcclxuICAgIHByaXZhdGUgYWNjdW11bGF0ZUxlYWtNb2RlbHM6IFNWTW9kZWxbXTtcclxuXHJcbiAgICBwdWJsaWMgaGFzTGVhazogYm9vbGVhbjtcclxuICAgIHB1YmxpYyBsZWFrQXJlYVk6IG51bWJlcjtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihlbmdpbmU6IEVuZ2luZSwgRE9NQ29udGFpbmVyOiBIVE1MRWxlbWVudCkge1xyXG4gICAgICAgIHRoaXMuZW5naW5lID0gZW5naW5lO1xyXG4gICAgICAgIHRoaXMubGF5b3V0UHJvdmlkZXIgPSBuZXcgTGF5b3V0UHJvdmlkZXIoZW5naW5lLCB0aGlzKTtcclxuICAgICAgICB0aGlzLnJlbmRlcmVyID0gbmV3IFJlbmRlcmVyKGVuZ2luZSwgRE9NQ29udGFpbmVyKTtcclxuICAgICAgICB0aGlzLnJlY29uY2lsZSA9IG5ldyBSZWNvbmNpbGUoZW5naW5lLCB0aGlzLnJlbmRlcmVyKTtcclxuICAgICAgICB0aGlzLnByZXZMYXlvdXRHcm91cFRhYmxlID0gbmV3IE1hcCgpO1xyXG4gICAgICAgIHRoaXMucHJldk1vZGVsTGlzdCA9IFtdO1xyXG4gICAgICAgIHRoaXMuYWNjdW11bGF0ZUxlYWtNb2RlbHMgPSBbXTtcclxuICAgICAgICB0aGlzLmhhc0xlYWsgPSBmYWxzZTsgLy8g5Yik5pat5piv5ZCm5bey57uP5Y+R55Sf6L+H5rOE5ryPXHJcblxyXG4gICAgICAgIGNvbnN0IGc2SW5zdGFuY2UgPSB0aGlzLnJlbmRlcmVyLmdldEc2SW5zdGFuY2UoKSxcclxuICAgICAgICAgICAgbGVha0FyZWFIZWlnaHQgPSB0aGlzLmVuZ2luZS52aWV3T3B0aW9ucy5sZWFrQXJlYUhlaWdodCxcclxuICAgICAgICAgICAgaGVpZ2h0ID0gdGhpcy5nZXRHNkluc3RhbmNlKCkuZ2V0SGVpZ2h0KCksXHJcbiAgICAgICAgICAgIHsgZHJhZywgem9vbSB9ID0gdGhpcy5lbmdpbmUuaW50ZXJhY3Rpb25PcHRpb25zO1xyXG5cclxuICAgICAgICB0aGlzLmxlYWtBcmVhWSA9IGhlaWdodCAqICgxIC0gbGVha0FyZWFIZWlnaHQpO1xyXG5cclxuICAgICAgICBpZiAoZHJhZykge1xyXG4gICAgICAgICAgICBJbml0RHJhZ0NhbnZhc1dpdGhMZWFrKHRoaXMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHpvb20pIHtcclxuICAgICAgICAgICAgLy8gSW5pdFpvb21DYW52YXMoZzZJbnN0YW5jZSwgZzZHZW5lcmFsR3JvdXApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgRml4Tm9kZU1hcmtlckRyYWcoZzZJbnN0YW5jZSwgdGhpcy5lbmdpbmUub3B0aW9uc1RhYmxlKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5a+55Li76KeG5Zu+6L+b6KGM6YeN5paw5biD5bGAXHJcbiAgICAgKi9cclxuICAgIHJlTGF5b3V0KCkge1xyXG4gICAgICAgIHRoaXMubGF5b3V0UHJvdmlkZXIubGF5b3V0QWxsKHRoaXMucHJldkxheW91dEdyb3VwVGFibGUsIFtdLCB0aGlzLmFjY3VtdWxhdGVMZWFrTW9kZWxzKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDojrflj5YgZzYg5a6e5L6LXHJcbiAgICAgKi9cclxuICAgIGdldEc2SW5zdGFuY2UoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyZXIuZ2V0RzZJbnN0YW5jZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5Yi35paw6KeG5Zu+XHJcbiAgICAgKi9cclxuICAgIHJlZnJlc2goKSB7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5nZXRHNkluc3RhbmNlKCkucmVmcmVzaCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6YeN5paw6LCD5pW05a655Zmo5bC65a+4XHJcbiAgICAgKiBAcGFyYW0gd2lkdGggXHJcbiAgICAgKiBAcGFyYW0gaGVpZ2h0IFxyXG4gICAgICovXHJcbiAgICByZXNpemUod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpIHtcclxuICAgICAgICB0aGlzLnJlbmRlcmVyLmdldEc2SW5zdGFuY2UoKS5jaGFuZ2VTaXplKHdpZHRoLCBoZWlnaHQpO1xyXG5cclxuICAgICAgICBjb25zdCBjb250YWluZXJIZWlnaHQgPSB0aGlzLmdldEc2SW5zdGFuY2UoKS5nZXRIZWlnaHQoKSxcclxuICAgICAgICAgICAgbGVha0FyZWFIZWlnaHQgPSB0aGlzLmVuZ2luZS52aWV3T3B0aW9ucy5sZWFrQXJlYUhlaWdodCxcclxuICAgICAgICAgICAgdGFyZ2V0WSA9IGNvbnRhaW5lckhlaWdodCAqICgxIC0gbGVha0FyZWFIZWlnaHQpO1xyXG5cclxuICAgICAgICBjb25zdCBhY2N1bXVsYXRlTGVha0dyb3VwID0gbmV3IEdyb3VwKCk7XHJcbiAgICAgICAgYWNjdW11bGF0ZUxlYWtHcm91cC5hZGQoLi4udGhpcy5hY2N1bXVsYXRlTGVha01vZGVscyk7XHJcbiAgICAgICAgYWNjdW11bGF0ZUxlYWtHcm91cC50cmFuc2xhdGUoMCwgdGFyZ2V0WSAtIHRoaXMubGVha0FyZWFZKTtcclxuICAgICAgICB0aGlzLmxlYWtBcmVhWSA9IHRhcmdldFk7XHJcblxyXG4gICAgICAgIEV2ZW50QnVzLmVtaXQoJ29uTGVha0FyZWFVcGRhdGUnLCB7XHJcbiAgICAgICAgICAgIGxlYWtBcmVhWTogdGhpcy5sZWFrQXJlYVksXHJcbiAgICAgICAgICAgIGhhc0xlYWs6IHRoaXMuaGFzTGVha1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5riy5p+T5omA5pyJ6KeG5Zu+XHJcbiAgICAgKiBAcGFyYW0gbW9kZWxzIFxyXG4gICAgICogQHBhcmFtIGxheW91dEZuIFxyXG4gICAgICovXHJcbiAgICByZW5kZXIobGF5b3V0R3JvdXBUYWJsZTogTGF5b3V0R3JvdXBUYWJsZSkge1xyXG4gICAgICAgIGNvbnN0IG1vZGVsTGlzdCA9IFV0aWwuY29udmVydEdyb3VwVGFibGUyTW9kZWxMaXN0KGxheW91dEdyb3VwVGFibGUpLFxyXG4gICAgICAgICAgICBkaWZmUmVzdWx0ID0gdGhpcy5yZWNvbmNpbGUuZGlmZih0aGlzLnByZXZNb2RlbExpc3QsIG1vZGVsTGlzdCwgdGhpcy5hY2N1bXVsYXRlTGVha01vZGVscyksXHJcbiAgICAgICAgICAgIHJlbmRlck1vZGVsTGlzdCA9IFtcclxuICAgICAgICAgICAgICAgIC4uLm1vZGVsTGlzdCxcclxuICAgICAgICAgICAgICAgIC4uLmRpZmZSZXN1bHQuUkVNT1ZFLFxyXG4gICAgICAgICAgICAgICAgLi4uZGlmZlJlc3VsdC5MRUFLRUQsXHJcbiAgICAgICAgICAgICAgICAuLi5kaWZmUmVzdWx0LkFDQ1VNVUxBVEVfTEVBS1xyXG4gICAgICAgICAgICBdO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5oYXNMZWFrID09PSB0cnVlICYmIHRoaXMuYWNjdW11bGF0ZUxlYWtNb2RlbHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaGFzTGVhayA9IGZhbHNlO1xyXG4gICAgICAgICAgICBFdmVudEJ1cy5lbWl0KCdvbkxlYWtBcmVhVXBkYXRlJywge1xyXG4gICAgICAgICAgICAgICAgbGVha0FyZWFZOiB0aGlzLmxlYWtBcmVhWSxcclxuICAgICAgICAgICAgICAgIGhhc0xlYWs6IHRoaXMuaGFzTGVha1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChkaWZmUmVzdWx0LkxFQUtFRC5sZW5ndGgpIHtcclxuICAgICAgICAgICAgdGhpcy5oYXNMZWFrID0gdHJ1ZTtcclxuICAgICAgICAgICAgRXZlbnRCdXMuZW1pdCgnb25MZWFrQXJlYVVwZGF0ZScsIHtcclxuICAgICAgICAgICAgICAgIGxlYWtBcmVhWTogdGhpcy5sZWFrQXJlYVksXHJcbiAgICAgICAgICAgICAgICBoYXNMZWFrOiB0aGlzLmhhc0xlYWtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuYnVpbGQocmVuZGVyTW9kZWxMaXN0KTsgLy8g6aaW5YWI5Zyo56a75bGPY2FudmFz5riy5p+T5YWIXHJcbiAgICAgICAgdGhpcy5sYXlvdXRQcm92aWRlci5sYXlvdXRBbGwobGF5b3V0R3JvdXBUYWJsZSwgdGhpcy5hY2N1bXVsYXRlTGVha01vZGVscywgZGlmZlJlc3VsdC5MRUFLRUQpOyAvLyDov5vooYzluIPlsYDvvIjorr7nva5tb2RlbOeahHjvvIx577yM5qC35byP562J77yJXHJcblxyXG4gICAgICAgIHRoaXMuYmVmb3JlUmVuZGVyKCk7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5yZW5kZXIocmVuZGVyTW9kZWxMaXN0KTsgLy8g5riy5p+T6KeG5Zu+XHJcbiAgICAgICAgdGhpcy5yZWNvbmNpbGUucGF0Y2goZGlmZlJlc3VsdCk7IC8vIOWvueinhuWbvuS4iueahOafkOS6m+WPmOWMlui/m+ihjOWvueW6lOeahOWKqOS9nO+8jOavlOWmgu+8muiKgueCueWIm+W7uuWKqOeUu++8jOiKgueCuea2iOWkseWKqOeUu+etiVxyXG4gICAgICAgIHRoaXMuYWZ0ZXJSZW5kZXIoKTtcclxuXHJcbiAgICAgICAgdGhpcy5hY2N1bXVsYXRlTGVha01vZGVscy5wdXNoKC4uLmRpZmZSZXN1bHQuTEVBS0VEKTsgIC8vIOWvueazhOa8j+iKgueCuei/m+ihjOe0r+enr1xyXG5cclxuICAgICAgICB0aGlzLnByZXZMYXlvdXRHcm91cFRhYmxlID0gbGF5b3V0R3JvdXBUYWJsZTtcclxuICAgICAgICB0aGlzLnByZXZNb2RlbExpc3QgPSBtb2RlbExpc3Q7XHJcblxyXG4gICAgICAgIC8vIG1vZGVsTGlzdC5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgIC8vICAgICBjb25zb2xlLmxvZyhpdGVtLmdldE1vZGVsVHlwZSgpLCBpdGVtLmdldEJvdW5kKCkpO1xyXG4gICAgICAgIC8vIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6ZSA5q+BXHJcbiAgICAgKi9cclxuICAgIGRlc3Ryb3koKSB7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5kZXN0cm95KCk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIOaKiua4suafk+WJjeimgeinpuWPkeeahOmAu+i+keaUvuWcqOi/memHjFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGFmdGVyUmVuZGVyKCkge1xyXG4gICAgICAgIGNvbnN0IGc2SW5zdGFuY2UgPSB0aGlzLnJlbmRlcmVyLmdldEc2SW5zdGFuY2UoKTtcclxuXHJcbiAgICAgICAgLy8g5oqK5omA5pyJ6L+e57q/572u6aG2XHJcbiAgICAgICAgZzZJbnN0YW5jZS5nZXRFZGdlcygpLmZvckVhY2goaXRlbSA9PiBpdGVtLnRvRnJvbnQoKSk7XHJcbiAgICAgICAgZzZJbnN0YW5jZS5wYWludCgpO1xyXG5cclxuICAgICAgICB0aGlzLnByZXZNb2RlbExpc3QuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICAgICAgaWYgKGl0ZW0ubGVha2VkID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgICAgICAgaXRlbS5kaXNjYXJkZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmiormuLLmn5PlkI7opoHop6blj5HnmoTpgLvovpHmlL7lnKjov5nph4xcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBiZWZvcmVSZW5kZXIoKSB7XHJcblxyXG4gICAgfVxyXG59XHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG5cclxuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///293\n")},function(module,exports,__webpack_require__){"use strict";eval("\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.LayoutProvider = void 0;\r\nconst boundingRect_1 = __webpack_require__(147);\r\nconst group_1 = __webpack_require__(149);\r\nconst vector_1 = __webpack_require__(148);\r\nclass LayoutProvider {\r\n constructor(engine, viewContainer) {\r\n this.engine = engine;\r\n this.viewOptions = this.engine.viewOptions;\r\n this.viewContainer = viewContainer;\r\n }\r\n initLayoutValue(nodes, markers) {\r\n [...nodes, ...markers].forEach(item => {\r\n item.set('rotation', item.get('rotation'));\r\n item.set({ x: 0, y: 0 });\r\n });\r\n }\r\n layoutMarker(markers, markerOptions) {\r\n markers.forEach(item => {\r\n var _a, _b, _c;\r\n const options = markerOptions[item.sourceType], offset = (_a = options.offset) !== null && _a !== void 0 ? _a : 8, anchor = (_b = item.anchor) !== null && _b !== void 0 ? _b : 0, labelOffset = (_c = options.labelOffset) !== null && _c !== void 0 ? _c : 2;\r\n let target = item.target, targetBound = target.getBound(), g6AnchorPosition = item.target.shadowG6Item.getAnchorPoints()[anchor], center = [targetBound.x + targetBound.width / 2, targetBound.y + targetBound.height / 2], markerPosition, markerEndPosition;\r\n let anchorPosition = [g6AnchorPosition.x, g6AnchorPosition.y];\r\n let anchorVector = vector_1.Vector.subtract(anchorPosition, center), angle = 0, len = vector_1.Vector.length(anchorVector) + offset;\r\n if (anchorVector[0] === 0) {\r\n angle = anchorVector[1] > 0 ? -Math.PI : 0;\r\n }\r\n else {\r\n angle = Math.sign(anchorVector[0]) * (Math.PI / 2 - Math.atan(anchorVector[1] / anchorVector[0]));\r\n }\r\n const markerHeight = item.get('size')[1], labelRadius = item.getLabelSizeRadius() / 2;\r\n anchorVector = vector_1.Vector.normalize(anchorVector);\r\n markerPosition = vector_1.Vector.location(center, anchorVector, len);\r\n markerEndPosition = vector_1.Vector.location(center, anchorVector, markerHeight + len + labelRadius + labelOffset);\r\n markerEndPosition = vector_1.Vector.subtract(markerEndPosition, markerPosition);\r\n item.set({\r\n x: markerPosition[0],\r\n y: markerPosition[1],\r\n rotation: angle,\r\n markerEndPosition\r\n });\r\n });\r\n }\r\n layoutFreedLabel(freedLabels) {\r\n freedLabels.forEach(item => {\r\n const freedNodeBound = item.node.getBound();\r\n item.set({\r\n x: freedNodeBound.x + freedNodeBound.width / 2,\r\n y: freedNodeBound.y + freedNodeBound.height * 1.5,\r\n size: [freedNodeBound.width, 0]\r\n });\r\n });\r\n }\r\n layoutLeakAddress(leakAddress) {\r\n leakAddress.forEach(item => {\r\n const nodeBound = item.node.getBound();\r\n item.set({\r\n x: nodeBound.x + nodeBound.width / 2,\r\n y: nodeBound.y - 16,\r\n size: [nodeBound.width, 0]\r\n });\r\n });\r\n }\r\n layoutModels(layoutGroupTable) {\r\n const modelGroupList = [];\r\n layoutGroupTable.forEach(group => {\r\n const options = group.options.layout, modelList = group.modelList, modelGroup = new group_1.Group();\r\n modelList.forEach(item => {\r\n modelGroup.add(item);\r\n });\r\n this.initLayoutValue(group.node, group.marker);\r\n group.layoutCreator.layout(group.node, options);\r\n modelGroupList.push(modelGroup);\r\n });\r\n layoutGroupTable.forEach(group => {\r\n this.layoutFreedLabel(group.freedLabel);\r\n this.layoutLeakAddress(group.leakAddress);\r\n this.layoutMarker(group.marker, group.options.marker);\r\n });\r\n return modelGroupList;\r\n }\r\n layoutLeakModels(leakModels, accumulateLeakModels) {\r\n const group = new group_1.Group(), containerHeight = this.viewContainer.getG6Instance().getHeight(), leakAreaHeightRatio = this.engine.viewOptions.leakAreaHeight, leakAreaY = containerHeight * (1 - leakAreaHeightRatio), xOffset = 50;\r\n group.add(...leakModels);\r\n const currentLeakGroupBound = group.getBound(), globalLeakGroupBound = accumulateLeakModels.length ?\r\n boundingRect_1.Bound.union(...accumulateLeakModels.map(item => item.getBound())) :\r\n { x: 0, y: leakAreaY, width: 0, height: 0 };\r\n const { x: groupX, y: groupY } = currentLeakGroupBound, dx = globalLeakGroupBound.x + globalLeakGroupBound.width + xOffset - groupX, dy = globalLeakGroupBound.y - groupY;\r\n group.translate(dx, dy);\r\n }\r\n layoutGroups(modelGroupList) {\r\n let wrapperGroup = new group_1.Group(), group, prevBound, bound, boundList = [], maxHeight = -Infinity, dx = 0, dy = 0;\r\n for (let i = 0; i < modelGroupList.length; i++) {\r\n group = modelGroupList[i];\r\n bound = group.getPaddingBound(this.viewOptions.groupPadding);\r\n if (prevBound) {\r\n dx = prevBound.x + prevBound.width - bound.x;\r\n }\r\n else {\r\n dx = bound.x;\r\n }\r\n if (bound.height > maxHeight) {\r\n maxHeight = bound.height;\r\n }\r\n group.translate(dx, 0);\r\n boundingRect_1.Bound.translate(bound, dx, 0);\r\n boundList.push(bound);\r\n wrapperGroup.add(group);\r\n prevBound = bound;\r\n }\r\n for (let i = 0; i < modelGroupList.length; i++) {\r\n group = modelGroupList[i];\r\n bound = boundList[i];\r\n dy = maxHeight / 2 - bound.height / 2;\r\n group.translate(0, dy);\r\n boundingRect_1.Bound.translate(bound, 0, dy);\r\n }\r\n return wrapperGroup;\r\n }\r\n fitCenter(group) {\r\n let width = this.viewContainer.getG6Instance().getWidth(), height = this.viewContainer.getG6Instance().getHeight(), leakAreaHeightRatio = this.engine.viewOptions.leakAreaHeight;\r\n if (this.viewContainer.hasLeak) {\r\n height = height * (1 - leakAreaHeightRatio);\r\n }\r\n const viewBound = group.getBound(), centerX = width / 2, centerY = height / 2, boundCenterX = viewBound.x + viewBound.width / 2, boundCenterY = viewBound.y + viewBound.height / 2, dx = centerX - boundCenterX, dy = centerY - boundCenterY;\r\n group.translate(dx, dy);\r\n }\r\n layoutAll(layoutGroupTable, accumulateLeakModels, leakModels) {\r\n const modelGroupList = this.layoutModels(layoutGroupTable);\r\n const globalGroup = this.layoutGroups(modelGroupList);\r\n if (leakModels.length) {\r\n this.layoutLeakModels(leakModels, accumulateLeakModels);\r\n }\r\n this.fitCenter(globalGroup);\r\n }\r\n}\r\nexports.LayoutProvider = LayoutProvider;\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvVmlldy9sYXlvdXRQcm92aWRlci50cz83NTlhIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLGdEQUE2RDtBQUM3RCx5Q0FBd0M7QUFDeEMsMENBQTBDO0FBVTFDLE1BQWEsY0FBYztJQUt2QixZQUFZLE1BQWMsRUFBRSxhQUE0QjtRQUNwRCxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDO1FBQzNDLElBQUksQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFDO0lBQ3ZDLENBQUM7SUFRTyxlQUFlLENBQUMsS0FBZSxFQUFFLE9BQW1CO1FBQ3hELENBQUMsR0FBRyxLQUFLLEVBQUUsR0FBRyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDbEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1lBQzNDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzdCLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQU9PLFlBQVksQ0FBQyxPQUFtQixFQUFFLGFBQThDO1FBQ3BGLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7O1lBQ25CLE1BQU0sT0FBTyxHQUFpQixhQUFhLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUN4RCxNQUFNLFNBQUcsT0FBTyxDQUFDLE1BQU0sbUNBQUksQ0FBQyxFQUM1QixNQUFNLFNBQUcsSUFBSSxDQUFDLE1BQU0sbUNBQUksQ0FBQyxFQUN6QixXQUFXLFNBQUcsT0FBTyxDQUFDLFdBQVcsbUNBQUksQ0FBQyxDQUFDO1lBRTNDLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFN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QUFPLEdBQUcsTUFBTSxHQUFHLENBQUMsRUFDekMsWUFBWSxHQUFHLFNBQVMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQ2hELFlBQVksR0FBRyxTQUFTLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUNqRCxFQUFFLEdBQUcsT0FBTyxHQUFHLFlBQVksRUFDM0IsRUFBRSxHQUFHLE9BQU8sR0FBRyxZQUFZLENBQUM7UUFFaEMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQVFNLFNBQVMsQ0FBQyxnQkFBa0MsRUFBRSxvQkFBK0IsRUFBRSxVQUFxQjtRQUN2RyxNQUFNLGNBQWMsR0FBWSxJQUFJLENBQUMsWUFBWSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDcEUsTUFBTSxXQUFXLEdBQVUsSUFBSSxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUU3RCxJQUFJLFVBQVUsQ0FBQyxNQUFNLEVBQUU7WUFDbkIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO1NBQzNEO1FBRUQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNoQyxDQUFDO0NBQ0o7QUExUEQsd0NBMFBDIiwiZmlsZSI6IjI5NC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IElQb2ludCB9IGZyb20gJ0BhbnR2L2c2LWNvcmUnO1xyXG5pbXBvcnQgeyBCb3VuZCwgQm91bmRpbmdSZWN0IH0gZnJvbSAnLi4vQ29tbW9uL2JvdW5kaW5nUmVjdCc7XHJcbmltcG9ydCB7IEdyb3VwIH0gZnJvbSAnLi4vQ29tbW9uL2dyb3VwJztcclxuaW1wb3J0IHsgVmVjdG9yIH0gZnJvbSAnLi4vQ29tbW9uL3ZlY3Rvcic7XHJcbmltcG9ydCB7IEVuZ2luZSB9IGZyb20gJy4uL2VuZ2luZSc7XHJcbmltcG9ydCB7IExheW91dEdyb3VwVGFibGUgfSBmcm9tICcuLi9Nb2RlbC9tb2RlbENvbnN0cnVjdG9yJztcclxuaW1wb3J0IHsgU1ZNYXJrZXIgfSBmcm9tICcuLi9Nb2RlbC9TVk1hcmtlcic7XHJcbmltcG9ydCB7IFNWTW9kZWwgfSBmcm9tICcuLi9Nb2RlbC9TVk1vZGVsJztcclxuaW1wb3J0IHsgU1ZGcmVlZExhYmVsLCBTVkxlYWtBZGRyZXNzLCBTVk5vZGUgfSBmcm9tICcuLi9Nb2RlbC9TVk5vZGUnO1xyXG5pbXBvcnQgeyBMYXlvdXRPcHRpb25zLCBNYXJrZXJPcHRpb24sIFZpZXdPcHRpb25zIH0gZnJvbSAnLi4vb3B0aW9ucyc7XHJcbmltcG9ydCB7IFZpZXdDb250YWluZXIgfSBmcm9tICcuL3ZpZXdDb250YWluZXInO1xyXG5cclxuXHJcbmV4cG9ydCBjbGFzcyBMYXlvdXRQcm92aWRlciB7XHJcbiAgICBwcml2YXRlIGVuZ2luZTogRW5naW5lO1xyXG4gICAgcHJpdmF0ZSB2aWV3T3B0aW9uczogVmlld09wdGlvbnM7XHJcbiAgICBwcml2YXRlIHZpZXdDb250YWluZXI6IFZpZXdDb250YWluZXI7XHJcblxyXG4gICAgY29uc3RydWN0b3IoZW5naW5lOiBFbmdpbmUsIHZpZXdDb250YWluZXI6IFZpZXdDb250YWluZXIpIHtcclxuICAgICAgICB0aGlzLmVuZ2luZSA9IGVuZ2luZTtcclxuICAgICAgICB0aGlzLnZpZXdPcHRpb25zID0gdGhpcy5lbmdpbmUudmlld09wdGlvbnM7XHJcbiAgICAgICAgdGhpcy52aWV3Q29udGFpbmVyID0gdmlld0NvbnRhaW5lcjtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDliJ3lp4vljJbluIPlsYDlj4LmlbBcclxuICAgICAqIEBwYXJhbSBub2RlcyBcclxuICAgICAqIEBwYXJhbSBtYXJrZXJzIFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGluaXRMYXlvdXRWYWx1ZShub2RlczogU1ZOb2RlW10sIG1hcmtlcnM6IFNWTWFya2VyW10pIHtcclxuICAgICAgICBbLi4ubm9kZXMsIC4uLm1hcmtlcnNdLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgICAgIGl0ZW0uc2V0KCdyb3RhdGlvbicsIGl0ZW0uZ2V0KCdyb3RhdGlvbicpKTtcclxuICAgICAgICAgICAgaXRlbS5zZXQoeyB4OiAwLCB5OiAwIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5biD5bGA5aSW6YOo5oyH6ZKIXHJcbiAgICAgKiBAcGFyYW0gbWFya2VyIFxyXG4gICAgICogQHBhcmFtIG1hcmtlck9wdGlvbnNcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBsYXlvdXRNYXJrZXIobWFya2VyczogU1ZNYXJrZXJbXSwgbWFya2VyT3B0aW9uczogeyBba2V5OiBzdHJpbmddOiBNYXJrZXJPcHRpb24gfSkge1xyXG4gICAgICAgIG1hcmtlcnMuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICAgICAgY29uc3Qgb3B0aW9uczogTWFya2VyT3B0aW9uID0gbWFya2VyT3B0aW9uc1tpdGVtLnNvdXJjZVR5cGVdLFxyXG4gICAgICAgICAgICAgICAgb2Zmc2V0ID0gb3B0aW9ucy5vZmZzZXQgPz8gOCxcclxuICAgICAgICAgICAgICAgIGFuY2hvciA9IGl0ZW0uYW5jaG9yID8/IDAsXHJcbiAgICAgICAgICAgICAgICBsYWJlbE9mZnNldCA9IG9wdGlvbnMubGFiZWxPZmZzZXQgPz8gMjtcclxuXHJcbiAgICAgICAgICAgIGxldCB0YXJnZXQgPSBpdGVtLnRhcmdldCxcclxuICAgICAgICAgICAgICAgIHRhcmdldEJvdW5kOiBCb3VuZGluZ1JlY3QgPSB0YXJnZXQuZ2V0Qm91bmQoKSxcclxuICAgICAgICAgICAgICAgIGc2QW5jaG9yUG9zaXRpb24gPSBpdGVtLnRhcmdldC5zaGFkb3dHNkl0ZW0uZ2V0QW5jaG9yUG9pbnRzKClbYW5jaG9yXSBhcyBJUG9pbnQsXHJcbiAgICAgICAgICAgICAgICBjZW50ZXI6IFtudW1iZXIsIG51bWJlcl0gPSBbdGFyZ2V0Qm91bmQueCArIHRhcmdldEJvdW5kLndpZHRoIC8gMiwgdGFyZ2V0Qm91bmQueSArIHRhcmdldEJvdW5kLmhlaWdodCAvIDJdLFxyXG4gICAgICAgICAgICAgICAgbWFya2VyUG9zaXRpb246IFtudW1iZXIsIG51bWJlcl0sXHJcbiAgICAgICAgICAgICAgICBtYXJrZXJFbmRQb3NpdGlvbjogW251bWJlciwgbnVtYmVyXTtcclxuXHJcbiAgICAgICAgICAgIGxldCBhbmNob3JQb3NpdGlvbjogW251bWJlciwgbnVtYmVyXSA9IFtnNkFuY2hvclBvc2l0aW9uLngsIGc2QW5jaG9yUG9zaXRpb24ueV07XHJcblxyXG4gICAgICAgICAgICBsZXQgYW5jaG9yVmVjdG9yID0gVmVjdG9yLnN1YnRyYWN0KGFuY2hvclBvc2l0aW9uLCBjZW50ZXIpLFxyXG4gICAgICAgICAgICAgICAgYW5nbGUgPSAwLCBsZW4gPSBWZWN0b3IubGVuZ3RoKGFuY2hvclZlY3RvcikgKyBvZmZzZXQ7XHJcblxyXG4gICAgICAgICAgICBpZiAoYW5jaG9yVmVjdG9yWzBdID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICBhbmdsZSA9IGFuY2hvclZlY3RvclsxXSA+IDAgPyAtTWF0aC5QSSA6IDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBhbmdsZSA9IE1hdGguc2lnbihhbmNob3JWZWN0b3JbMF0pICogKE1hdGguUEkgLyAyIC0gTWF0aC5hdGFuKGFuY2hvclZlY3RvclsxXSAvIGFuY2hvclZlY3RvclswXSkpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCBtYXJrZXJIZWlnaHQgPSBpdGVtLmdldCgnc2l6ZScpWzFdLFxyXG4gICAgICAgICAgICAgICAgbGFiZWxSYWRpdXMgPSBpdGVtLmdldExhYmVsU2l6ZVJhZGl1cygpIC8gMjtcclxuXHJcbiAgICAgICAgICAgIGFuY2hvclZlY3RvciA9IFZlY3Rvci5ub3JtYWxpemUoYW5jaG9yVmVjdG9yKTtcclxuICAgICAgICAgICAgbWFya2VyUG9zaXRpb24gPSBWZWN0b3IubG9jYXRpb24oY2VudGVyLCBhbmNob3JWZWN0b3IsIGxlbik7XHJcbiAgICAgICAgICAgIG1hcmtlckVuZFBvc2l0aW9uID0gVmVjdG9yLmxvY2F0aW9uKGNlbnRlciwgYW5jaG9yVmVjdG9yLCBtYXJrZXJIZWlnaHQgKyBsZW4gKyBsYWJlbFJhZGl1cyArIGxhYmVsT2Zmc2V0KTtcclxuICAgICAgICAgICAgbWFya2VyRW5kUG9zaXRpb24gPSBWZWN0b3Iuc3VidHJhY3QobWFya2VyRW5kUG9zaXRpb24sIG1hcmtlclBvc2l0aW9uKTtcclxuXHJcbiAgICAgICAgICAgIGl0ZW0uc2V0KHtcclxuICAgICAgICAgICAgICAgIHg6IG1hcmtlclBvc2l0aW9uWzBdLFxyXG4gICAgICAgICAgICAgICAgeTogbWFya2VyUG9zaXRpb25bMV0sXHJcbiAgICAgICAgICAgICAgICByb3RhdGlvbjogYW5nbGUsXHJcbiAgICAgICAgICAgICAgICBtYXJrZXJFbmRQb3NpdGlvblxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOW4g+WxgOiKgueCueeahOKAmOW3sumHiuaUvuKAmeaWh+acrFxyXG4gICAgICogQHBhcmFtIGZyZWVkTGFiZWxzIFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGxheW91dEZyZWVkTGFiZWwoZnJlZWRMYWJlbHM6IFNWRnJlZWRMYWJlbFtdKSB7XHJcbiAgICAgICAgZnJlZWRMYWJlbHMuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICAgICAgY29uc3QgZnJlZWROb2RlQm91bmQgPSBpdGVtLm5vZGUuZ2V0Qm91bmQoKTtcclxuXHJcbiAgICAgICAgICAgIGl0ZW0uc2V0KHtcclxuICAgICAgICAgICAgICAgIHg6IGZyZWVkTm9kZUJvdW5kLnggKyBmcmVlZE5vZGVCb3VuZC53aWR0aCAvIDIsXHJcbiAgICAgICAgICAgICAgICB5OiBmcmVlZE5vZGVCb3VuZC55ICsgZnJlZWROb2RlQm91bmQuaGVpZ2h0ICogMS41LFxyXG4gICAgICAgICAgICAgICAgc2l6ZTogW2ZyZWVkTm9kZUJvdW5kLndpZHRoLCAwXVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOW4g+WxgOazhOa8j+WMuuiKgueCueS4iumdoueahGFkZHJlc3MgbGFiZWxcclxuICAgICAqIEBwYXJhbSBsZWFrQWRkcmVzc1xyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGxheW91dExlYWtBZGRyZXNzKGxlYWtBZGRyZXNzOiBTVkxlYWtBZGRyZXNzW10pIHtcclxuICAgICAgICBsZWFrQWRkcmVzcy5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBub2RlQm91bmQgPSBpdGVtLm5vZGUuZ2V0Qm91bmQoKTtcclxuXHJcbiAgICAgICAgICAgIGl0ZW0uc2V0KHtcclxuICAgICAgICAgICAgICAgIHg6IG5vZGVCb3VuZC54ICsgbm9kZUJvdW5kLndpZHRoIC8gMixcclxuICAgICAgICAgICAgICAgIHk6IG5vZGVCb3VuZC55IC0gMTYsXHJcbiAgICAgICAgICAgICAgICBzaXplOiBbbm9kZUJvdW5kLndpZHRoLCAwXVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDlr7nmr4/kuKrnu4TlhoXpg6jnmoRtb2RlbOi/m+ihjOW4g+WxgFxyXG4gICAgICogQHBhcmFtIGxheW91dEdyb3VwVGFibGVcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBsYXlvdXRNb2RlbHMobGF5b3V0R3JvdXBUYWJsZTogTGF5b3V0R3JvdXBUYWJsZSk6IEdyb3VwW10ge1xyXG4gICAgICAgIGNvbnN0IG1vZGVsR3JvdXBMaXN0OiBHcm91cFtdID0gW107XHJcblxyXG4gICAgICAgIGxheW91dEdyb3VwVGFibGUuZm9yRWFjaChncm91cCA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IG9wdGlvbnM6IExheW91dE9wdGlvbnMgPSBncm91cC5vcHRpb25zLmxheW91dCxcclxuICAgICAgICAgICAgICAgIG1vZGVsTGlzdDogU1ZNb2RlbFtdID0gZ3JvdXAubW9kZWxMaXN0LFxyXG4gICAgICAgICAgICAgICAgbW9kZWxHcm91cDogR3JvdXAgPSBuZXcgR3JvdXAoKTtcclxuXHJcbiAgICAgICAgICAgIG1vZGVsTGlzdC5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICAgICAgbW9kZWxHcm91cC5hZGQoaXRlbSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5pbml0TGF5b3V0VmFsdWUoZ3JvdXAubm9kZSwgZ3JvdXAubWFya2VyKTsgLy8g5Yid5aeL5YyW5biD5bGA5Y+C5pWwXHJcbiAgICAgICAgICAgIGdyb3VwLmxheW91dENyZWF0b3IubGF5b3V0KGdyb3VwLm5vZGUsIG9wdGlvbnMpOyAgLy8g5biD5bGA6IqC54K5XHJcbiAgICAgICAgICAgIG1vZGVsR3JvdXBMaXN0LnB1c2gobW9kZWxHcm91cCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGxheW91dEdyb3VwVGFibGUuZm9yRWFjaChncm91cCA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubGF5b3V0RnJlZWRMYWJlbChncm91cC5mcmVlZExhYmVsKTtcclxuICAgICAgICAgICAgdGhpcy5sYXlvdXRMZWFrQWRkcmVzcyhncm91cC5sZWFrQWRkcmVzcyk7XHJcbiAgICAgICAgICAgIHRoaXMubGF5b3V0TWFya2VyKGdyb3VwLm1hcmtlciwgZ3JvdXAub3B0aW9ucy5tYXJrZXIpOyAgLy8g5biD5bGA5aSW6YOo5oyH6ZKIXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiBtb2RlbEdyb3VwTGlzdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOWvueazhOa8j+WMuui/m+ihjOW4g+WxgFxyXG4gICAgICogQHBhcmFtIGxlYWtNb2RlbHMgXHJcbiAgICAgKiBAcGFyYW0gYWNjdW11bGF0ZUxlYWtNb2RlbHNcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBsYXlvdXRMZWFrTW9kZWxzKGxlYWtNb2RlbHM6IFNWTW9kZWxbXSwgYWNjdW11bGF0ZUxlYWtNb2RlbHM6IFNWTW9kZWxbXSkge1xyXG4gICAgICAgIGNvbnN0IGdyb3VwOiBHcm91cCA9IG5ldyBHcm91cCgpLFxyXG4gICAgICAgICAgICBjb250YWluZXJIZWlnaHQgPSB0aGlzLnZpZXdDb250YWluZXIuZ2V0RzZJbnN0YW5jZSgpLmdldEhlaWdodCgpLFxyXG4gICAgICAgICAgICBsZWFrQXJlYUhlaWdodFJhdGlvID0gdGhpcy5lbmdpbmUudmlld09wdGlvbnMubGVha0FyZWFIZWlnaHQsXHJcbiAgICAgICAgICAgIGxlYWtBcmVhWSA9IGNvbnRhaW5lckhlaWdodCAqICgxIC0gbGVha0FyZWFIZWlnaHRSYXRpbyksXHJcbiAgICAgICAgICAgIHhPZmZzZXQgPSA1MDtcclxuXHJcbiAgICAgICAgZ3JvdXAuYWRkKC4uLmxlYWtNb2RlbHMpO1xyXG4gICAgICAgIGNvbnN0IGN1cnJlbnRMZWFrR3JvdXBCb3VuZDogQm91bmRpbmdSZWN0ID0gZ3JvdXAuZ2V0Qm91bmQoKSxcclxuICAgICAgICAgICAgZ2xvYmFsTGVha0dyb3VwQm91bmQ6IEJvdW5kaW5nUmVjdCA9IGFjY3VtdWxhdGVMZWFrTW9kZWxzLmxlbmd0aCA/XHJcbiAgICAgICAgICAgICAgICBCb3VuZC51bmlvbiguLi5hY2N1bXVsYXRlTGVha01vZGVscy5tYXAoaXRlbSA9PiBpdGVtLmdldEJvdW5kKCkpKSA6XHJcbiAgICAgICAgICAgICAgICB7IHg6IDAsIHk6IGxlYWtBcmVhWSwgd2lkdGg6IDAsIGhlaWdodDogMCB9O1xyXG5cclxuICAgICAgICBjb25zdCB7IHg6IGdyb3VwWCwgeTogZ3JvdXBZIH0gPSBjdXJyZW50TGVha0dyb3VwQm91bmQsXHJcbiAgICAgICAgICAgIGR4ID0gZ2xvYmFsTGVha0dyb3VwQm91bmQueCArIGdsb2JhbExlYWtHcm91cEJvdW5kLndpZHRoICsgeE9mZnNldCAtIGdyb3VwWCxcclxuICAgICAgICAgICAgZHkgPSBnbG9iYWxMZWFrR3JvdXBCb3VuZC55IC0gZ3JvdXBZO1xyXG5cclxuICAgICAgICBncm91cC50cmFuc2xhdGUoZHgsIGR5KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOWvueaJgOaciee7hOi/m+ihjOebuOS6kuW4g+WxgFxyXG4gICAgICogQHBhcmFtIG1vZGVsR3JvdXBUYWJsZSBcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBsYXlvdXRHcm91cHMobW9kZWxHcm91cExpc3Q6IEdyb3VwW10pOiBHcm91cCB7XHJcbiAgICAgICAgbGV0IHdyYXBwZXJHcm91cDogR3JvdXAgPSBuZXcgR3JvdXAoKSxcclxuICAgICAgICAgICAgZ3JvdXA6IEdyb3VwLFxyXG4gICAgICAgICAgICBwcmV2Qm91bmQ6IEJvdW5kaW5nUmVjdCxcclxuICAgICAgICAgICAgYm91bmQ6IEJvdW5kaW5nUmVjdCxcclxuICAgICAgICAgICAgYm91bmRMaXN0OiBCb3VuZGluZ1JlY3RbXSA9IFtdLFxyXG4gICAgICAgICAgICBtYXhIZWlnaHQ6IG51bWJlciA9IC1JbmZpbml0eSxcclxuICAgICAgICAgICAgZHggPSAwLCBkeSA9IDA7XHJcblxyXG4gICAgICAgIC8vIOW3puW+gOWPs+W4g+WxgFxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbW9kZWxHcm91cExpc3QubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgZ3JvdXAgPSBtb2RlbEdyb3VwTGlzdFtpXTtcclxuICAgICAgICAgICAgYm91bmQgPSBncm91cC5nZXRQYWRkaW5nQm91bmQodGhpcy52aWV3T3B0aW9ucy5ncm91cFBhZGRpbmcpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHByZXZCb3VuZCkge1xyXG4gICAgICAgICAgICAgICAgZHggPSBwcmV2Qm91bmQueCArIHByZXZCb3VuZC53aWR0aCAtIGJvdW5kLng7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBkeCA9IGJvdW5kLng7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChib3VuZC5oZWlnaHQgPiBtYXhIZWlnaHQpIHtcclxuICAgICAgICAgICAgICAgIG1heEhlaWdodCA9IGJvdW5kLmhlaWdodDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZ3JvdXAudHJhbnNsYXRlKGR4LCAwKTtcclxuICAgICAgICAgICAgQm91bmQudHJhbnNsYXRlKGJvdW5kLCBkeCwgMCk7XHJcbiAgICAgICAgICAgIGJvdW5kTGlzdC5wdXNoKGJvdW5kKTtcclxuICAgICAgICAgICAgd3JhcHBlckdyb3VwLmFkZChncm91cCk7XHJcbiAgICAgICAgICAgIHByZXZCb3VuZCA9IGJvdW5kO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8g5bGF5Lit5a+56b2Q5biD5bGAXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtb2RlbEdyb3VwTGlzdC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBncm91cCA9IG1vZGVsR3JvdXBMaXN0W2ldO1xyXG4gICAgICAgICAgICBib3VuZCA9IGJvdW5kTGlzdFtpXTtcclxuXHJcbiAgICAgICAgICAgIGR5ID0gbWF4SGVpZ2h0IC8gMiAtIGJvdW5kLmhlaWdodCAvIDI7XHJcbiAgICAgICAgICAgIGdyb3VwLnRyYW5zbGF0ZSgwLCBkeSk7XHJcbiAgICAgICAgICAgIEJvdW5kLnRyYW5zbGF0ZShib3VuZCwgMCwgZHkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHdyYXBwZXJHcm91cDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDlsIbop4blm77osIPmlbToh7PnlLvluIPkuK3lv4NcclxuICAgICAqIEBwYXJhbSBtb2RlbHNcclxuICAgICAqIEBwYXJhbSBsZWFrQXJlYUhlaWdodFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGZpdENlbnRlcihncm91cDogR3JvdXApIHtcclxuICAgICAgICBsZXQgd2lkdGggPSB0aGlzLnZpZXdDb250YWluZXIuZ2V0RzZJbnN0YW5jZSgpLmdldFdpZHRoKCksXHJcbiAgICAgICAgICAgIGhlaWdodCA9IHRoaXMudmlld0NvbnRhaW5lci5nZXRHNkluc3RhbmNlKCkuZ2V0SGVpZ2h0KCksXHJcbiAgICAgICAgICAgIGxlYWtBcmVhSGVpZ2h0UmF0aW8gPSB0aGlzLmVuZ2luZS52aWV3T3B0aW9ucy5sZWFrQXJlYUhlaWdodDtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMudmlld0NvbnRhaW5lci5oYXNMZWFrKSB7XHJcbiAgICAgICAgICAgIGhlaWdodCA9IGhlaWdodCAqICgxIC0gbGVha0FyZWFIZWlnaHRSYXRpbyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCB2aWV3Qm91bmQ6IEJvdW5kaW5nUmVjdCA9IGdyb3VwLmdldEJvdW5kKCksXHJcbiAgICAgICAgICAgIGNlbnRlclggPSB3aWR0aCAvIDIsIGNlbnRlclkgPSBoZWlnaHQgLyAyLFxyXG4gICAgICAgICAgICBib3VuZENlbnRlclggPSB2aWV3Qm91bmQueCArIHZpZXdCb3VuZC53aWR0aCAvIDIsXHJcbiAgICAgICAgICAgIGJvdW5kQ2VudGVyWSA9IHZpZXdCb3VuZC55ICsgdmlld0JvdW5kLmhlaWdodCAvIDIsXHJcbiAgICAgICAgICAgIGR4ID0gY2VudGVyWCAtIGJvdW5kQ2VudGVyWCxcclxuICAgICAgICAgICAgZHkgPSBjZW50ZXJZIC0gYm91bmRDZW50ZXJZO1xyXG5cclxuICAgICAgICBncm91cC50cmFuc2xhdGUoZHgsIGR5KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOW4g+WxgFxyXG4gICAgICogQHBhcmFtIGxheW91dEdyb3VwVGFibGUgXHJcbiAgICAgKiBAcGFyYW0gbGVha01vZGVsc1xyXG4gICAgICogQHBhcmFtIGhhc0xlYWtcclxuICAgICAqL1xyXG4gICAgcHVibGljIGxheW91dEFsbChsYXlvdXRHcm91cFRhYmxlOiBMYXlvdXRHcm91cFRhYmxlLCBhY2N1bXVsYXRlTGVha01vZGVsczogU1ZNb2RlbFtdLCBsZWFrTW9kZWxzOiBTVk1vZGVsW10pIHtcclxuICAgICAgICBjb25zdCBtb2RlbEdyb3VwTGlzdDogR3JvdXBbXSA9IHRoaXMubGF5b3V0TW9kZWxzKGxheW91dEdyb3VwVGFibGUpO1xyXG4gICAgICAgIGNvbnN0IGdsb2JhbEdyb3VwOiBHcm91cCA9IHRoaXMubGF5b3V0R3JvdXBzKG1vZGVsR3JvdXBMaXN0KTtcclxuXHJcbiAgICAgICAgaWYgKGxlYWtNb2RlbHMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHRoaXMubGF5b3V0TGVha01vZGVscyhsZWFrTW9kZWxzLCBhY2N1bXVsYXRlTGVha01vZGVscyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmZpdENlbnRlcihnbG9iYWxHcm91cCk7XHJcbiAgICB9XHJcbn0iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///294\n")},function(module,exports,__webpack_require__){"use strict";eval("\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.Renderer = void 0;\r\nconst util_1 = __webpack_require__(53);\r\nconst g6_1 = __webpack_require__(50);\r\nconst initViewBehaviors_1 = __webpack_require__(564);\r\nclass Renderer {\r\n constructor(engine, DOMContainer) {\r\n this.engine = engine;\r\n const enable = this.engine.animationOptions.enable, duration = this.engine.animationOptions.duration, timingFunction = this.engine.animationOptions.timingFunction;\r\n const tooltip = new g6_1.default.Tooltip({\r\n offsetX: 10,\r\n offsetY: 20,\r\n shouldBegin(event) {\r\n return event.item['SVModel'].isNode();\r\n },\r\n getContent: event => this.getTooltipContent(event.item['SVModel'], { address: 'sourceId', data: 'data' }),\r\n itemTypes: ['node']\r\n });\r\n this.shadowG6Instance = new g6_1.default.Graph({\r\n container: DOMContainer.cloneNode()\r\n });\r\n this.g6Instance = new g6_1.default.Graph({\r\n container: DOMContainer,\r\n width: DOMContainer.offsetWidth,\r\n height: DOMContainer.offsetHeight,\r\n groupByTypes: false,\r\n animate: enable,\r\n animateCfg: {\r\n duration: duration,\r\n easing: timingFunction\r\n },\r\n fitView: false,\r\n modes: {\r\n default: initViewBehaviors_1.InitViewBehaviors(this.engine.optionsTable)\r\n },\r\n plugins: [tooltip]\r\n });\r\n }\r\n getTooltipContent(model, items) {\r\n const wrapper = document.createElement('div');\r\n if (model === null || model === undefined) {\r\n return wrapper;\r\n }\r\n Object.keys(items).map(key => {\r\n let value = model[items[key]];\r\n if (value !== undefined && value !== null) {\r\n let item = document.createElement('div');\r\n item.innerHTML = `${key}:${value}`;\r\n wrapper.appendChild(item);\r\n }\r\n });\r\n return wrapper;\r\n }\r\n build(renderModelList) {\r\n const g6Data = util_1.Util.convertModelList2G6Data(renderModelList);\r\n this.shadowG6Instance.clear();\r\n this.shadowG6Instance.read(g6Data);\r\n renderModelList.forEach(item => {\r\n item.shadowG6Item = this.shadowG6Instance.findById(item.id);\r\n });\r\n }\r\n render(renderModelList) {\r\n const renderData = util_1.Util.convertModelList2G6Data(renderModelList);\r\n this.g6Instance.changeData(renderData);\r\n renderModelList.forEach(item => {\r\n item.G6Item = this.g6Instance.findById(item.id);\r\n item.G6Item['SVModel'] = item;\r\n });\r\n }\r\n removeModel(model) {\r\n this.g6Instance.removeItem(model.G6Item);\r\n this.shadowG6Instance.removeItem(model.shadowG6Item);\r\n }\r\n getG6Instance() {\r\n return this.g6Instance;\r\n }\r\n destroy() {\r\n this.shadowG6Instance.destroy();\r\n this.g6Instance.destroy();\r\n }\r\n}\r\nexports.Renderer = Renderer;\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvVmlldy9yZW5kZXJlci50cz9jYzA4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUVBLHVDQUFzQztBQUN0QyxxQ0FBMEI7QUFDMUIscURBQXdFO0FBY3hFLE1BQWEsUUFBUTtJQUtqQixZQUFZLE1BQWMsRUFBRSxZQUF5QjtRQUNqRCxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUVyQixNQUFNLE1BQU0sR0FBWSxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFDdkQsUUFBUSxHQUFXLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxFQUN4RCxjQUFjLEdBQVcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLENBQUM7UUFFekUsTUFBTSxPQUFPLEdBQUcsSUFBSSxZQUFFLENBQUMsT0FBTyxDQUFDO1lBQzNCLE9BQU8sRUFBRSxFQUFFO1lBQ1gsT0FBTyxFQUFFLEVBQUU7WUFDWCxXQUFXLENBQUMsS0FBSztnQkFDYixPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDMUMsQ0FBQztZQUNELFVBQVUsRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7WUFDekcsU0FBUyxFQUFFLENBQUMsTUFBTSxDQUFDO1NBQ3RCLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLFlBQUUsQ0FBQyxLQUFLLENBQUM7WUFDakMsU0FBUyxFQUFFLFlBQVksQ0FBQyxTQUFTLEVBQWlCO1NBQ3JELENBQUMsQ0FBQztRQUdILElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxZQUFFLENBQUMsS0FBSyxDQUFD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QUFnQixDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDOUIsQ0FBQztDQUNKO0FBM0hELDRCQTJIQyIsImZpbGUiOiIyOTUuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbmdpbmUgfSBmcm9tICcuLi9lbmdpbmUnO1xyXG5pbXBvcnQgeyBTVk1vZGVsIH0gZnJvbSAnLi4vTW9kZWwvU1ZNb2RlbCc7XHJcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuLi9Db21tb24vdXRpbCc7XHJcbmltcG9ydCBHNiBmcm9tICdAYW50di9nNic7XHJcbmltcG9ydCB7IEluaXRWaWV3QmVoYXZpb3JzIH0gZnJvbSAnLi4vQmVoYXZpb3JIZWxwZXIvaW5pdFZpZXdCZWhhdmlvcnMnO1xyXG5pbXBvcnQgeyBHcmFwaCwgR3JhcGhEYXRhLCBJR3JvdXAgfSBmcm9tICdAYW50di9nNi1wYyc7XHJcblxyXG5cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgUmVuZGVyTW9kZWxQYWNrIHtcclxuICAgIGxlYUtNb2RlbHM6IFNWTW9kZWxbXTtcclxuICAgIGdlbmVyYWxNb2RlbDogU1ZNb2RlbFtdO1xyXG59XHJcblxyXG5cclxuZXhwb3J0IHR5cGUgZzZCZWhhdmlvciA9IHN0cmluZyB8IHsgdHlwZTogc3RyaW5nOyBzaG91bGRCZWdpbj86IEZ1bmN0aW9uOyBzaG91bGRVcGRhdGU/OiBGdW5jdGlvbjsgc2hvdWxkRW5kPzogRnVuY3Rpb247IH07XHJcblxyXG5cclxuZXhwb3J0IGNsYXNzIFJlbmRlcmVyIHtcclxuICAgIHByaXZhdGUgZW5naW5lOiBFbmdpbmU7XHJcbiAgICBwcml2YXRlIGc2SW5zdGFuY2U6IEdyYXBoOyAvLyBnNiDlrp7kvotcclxuICAgIHByaXZhdGUgc2hhZG93RzZJbnN0YW5jZTogR3JhcGg7XHJcblxyXG4gICAgY29uc3RydWN0b3IoZW5naW5lOiBFbmdpbmUsIERPTUNvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcclxuICAgICAgICB0aGlzLmVuZ2luZSA9IGVuZ2luZTtcclxuXHJcbiAgICAgICAgY29uc3QgZW5hYmxlOiBib29sZWFuID0gdGhpcy5lbmdpbmUuYW5pbWF0aW9uT3B0aW9ucy5lbmFibGUsXHJcbiAgICAgICAgICAgIGR1cmF0aW9uOiBudW1iZXIgPSB0aGlzLmVuZ2luZS5hbmltYXRpb25PcHRpb25zLmR1cmF0aW9uLFxyXG4gICAgICAgICAgICB0aW1pbmdGdW5jdGlvbjogc3RyaW5nID0gdGhpcy5lbmdpbmUuYW5pbWF0aW9uT3B0aW9ucy50aW1pbmdGdW5jdGlvbjtcclxuXHJcbiAgICAgICAgY29uc3QgdG9vbHRpcCA9IG5ldyBHNi5Ub29sdGlwKHtcclxuICAgICAgICAgICAgb2Zmc2V0WDogMTAsXHJcbiAgICAgICAgICAgIG9mZnNldFk6IDIwLFxyXG4gICAgICAgICAgICBzaG91bGRCZWdpbihldmVudCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGV2ZW50Lml0ZW1bJ1NWTW9kZWwnXS5pc05vZGUoKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZ2V0Q29udGVudDogZXZlbnQgPT4gdGhpcy5nZXRUb29sdGlwQ29udGVudChldmVudC5pdGVtWydTVk1vZGVsJ10sIHsgYWRkcmVzczogJ3NvdXJjZUlkJywgZGF0YTogJ2RhdGEnIH0pLFxyXG4gICAgICAgICAgICBpdGVtVHlwZXM6IFsnbm9kZSddXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuc2hhZG93RzZJbnN0YW5jZSA9IG5ldyBHNi5HcmFwaCh7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lcjogRE9NQ29udGFpbmVyLmNsb25lTm9kZSgpIGFzIEhUTUxFbGVtZW50XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIOWIneWni+WMlmc25a6e5L6LXHJcbiAgICAgICAgdGhpcy5nNkluc3RhbmNlID0gbmV3IEc2LkdyYXBoKHtcclxuICAgICAgICAgICAgY29udGFpbmVyOiBET01Db250YWluZXIsXHJcbiAgICAgICAgICAgIHdpZHRoOiBET01Db250YWluZXIub2Zmc2V0V2lkdGgsXHJcbiAgICAgICAgICAgIGhlaWdodDogRE9NQ29udGFpbmVyLm9mZnNldEhlaWdodCxcclxuICAgICAgICAgICAgZ3JvdXBCeVR5cGVzOiBmYWxzZSxcclxuICAgICAgICAgICAgYW5pbWF0ZTogZW5hYmxlLFxyXG4gICAgICAgICAgICBhbmltYXRlQ2ZnOiB7XHJcbiAgICAgICAgICAgICAgICBkdXJhdGlvbjogZHVyYXRpb24sXHJcbiAgICAgICAgICAgICAgICBlYXNpbmc6IHRpbWluZ0Z1bmN0aW9uXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGZpdFZpZXc6IGZhbHNlLFxyXG4gICAgICAgICAgICBtb2Rlczoge1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDogSW5pdFZpZXdCZWhhdmlvcnModGhpcy5lbmdpbmUub3B0aW9uc1RhYmxlKVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBwbHVnaW5zOiBbdG9vbHRpcF1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOWIm+mAoHRvb2x0aXDlhYPntKBcclxuICAgICAqIEBwYXJhbSBtb2RlbCBcclxuICAgICAqIEBwYXJhbSBpdGVtcyBcclxuICAgICAqIEByZXR1cm5zIFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGdldFRvb2x0aXBDb250ZW50KG1vZGVsOiBTVk1vZGVsLCBpdGVtczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSk6IEhUTUxEaXZFbGVtZW50IHtcclxuICAgICAgICBjb25zdCB3cmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcblxyXG4gICAgICAgIGlmKG1vZGVsID09PSBudWxsIHx8IG1vZGVsID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHdyYXBwZXI7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBPYmplY3Qua2V5cyhpdGVtcykubWFwKGtleSA9PiB7XHJcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IG1vZGVsW2l0ZW1zW2tleV1dO1xyXG4gICAgICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgbGV0IGl0ZW0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgICAgICAgICAgIGl0ZW0uaW5uZXJIVE1MID0gYCR7a2V5fe+8miR7dmFsdWV9YDtcclxuICAgICAgICAgICAgICAgIHdyYXBwZXIuYXBwZW5kQ2hpbGQoaXRlbSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHdyYXBwZXI7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDlr7nmr4/kuIDkuKogbW9kZWwg5Zyo56a75bGPIENhbnZhcyDkuIrmnoTlu7ogRzYgaXRlbe+8jOeUqOS9nOW4g+WxgFxyXG4gICAgICogQHBhcmFtIHJlbmRlck1vZGVsTGlzdFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYnVpbGQocmVuZGVyTW9kZWxMaXN0OiBTVk1vZGVsW10pIHtcclxuICAgICAgICBjb25zdCBnNkRhdGE6IEdyYXBoRGF0YSA9IFV0aWwuY29udmVydE1vZGVsTGlzdDJHNkRhdGEocmVuZGVyTW9kZWxMaXN0KTtcclxuXHJcbiAgICAgICAgdGhpcy5zaGFkb3dHNkluc3RhbmNlLmNsZWFyKCk7XHJcbiAgICAgICAgdGhpcy5zaGFkb3dHNkluc3RhbmNlLnJlYWQoZzZEYXRhKTtcclxuICAgICAgICByZW5kZXJNb2RlbExpc3QuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICAgICAgaXRlbS5zaGFkb3dHNkl0ZW0gPSB0aGlzLnNoYWRvd0c2SW5zdGFuY2UuZmluZEJ5SWQoaXRlbS5pZCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmuLLmn5Plh73mlbBcclxuICAgICAqIEBwYXJhbSByZW5kZXJNb2RlbExpc3QgXHJcbiAgICAgKiBAcGFyYW0gaXNGaXJzdFJlbmRlciBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlbmRlcihyZW5kZXJNb2RlbExpc3Q6IFNWTW9kZWxbXSkge1xyXG4gICAgICAgIGNvbnN0IHJlbmRlckRhdGE6IEdyYXBoRGF0YSA9IFV0aWwuY29udmVydE1vZGVsTGlzdDJHNkRhdGEocmVuZGVyTW9kZWxMaXN0KTtcclxuXHJcbiAgICAgICAgdGhpcy5nNkluc3RhbmNlLmNoYW5nZURhdGEocmVuZGVyRGF0YSk7XHJcblxyXG4gICAgICAgIHJlbmRlck1vZGVsTGlzdC5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICBpdGVtLkc2SXRlbSA9IHRoaXMuZzZJbnN0YW5jZS5maW5kQnlJZChpdGVtLmlkKTtcclxuICAgICAgICAgICAgaXRlbS5HNkl0ZW1bJ1NWTW9kZWwnXSA9IGl0ZW07XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDku47op4blm77kuK3np7vpmaTkuIDkuKogTW9kZWxcclxuICAgICAqIEBwYXJhbSBtb2RlbCBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlbW92ZU1vZGVsKG1vZGVsOiBTVk1vZGVsKSB7XHJcbiAgICAgICAgdGhpcy5nNkluc3RhbmNlLnJlbW92ZUl0ZW0obW9kZWwuRzZJdGVtKTtcclxuICAgICAgICB0aGlzLnNoYWRvd0c2SW5zdGFuY2UucmVtb3ZlSXRlbShtb2RlbC5zaGFkb3dHNkl0ZW0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6I635Y+WIEc2IOWunuS+i1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0RzZJbnN0YW5jZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5nNkluc3RhbmNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6ZSA5q+BXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBkZXN0cm95KCkge1xyXG4gICAgICAgIHRoaXMuc2hhZG93RzZJbnN0YW5jZS5kZXN0cm95KCk7XHJcbiAgICAgICAgdGhpcy5nNkluc3RhbmNlLmRlc3Ryb3koKTtcclxuICAgIH1cclxufSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///295\n")},function(module,exports,__webpack_require__){"use strict";eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.GADDIAsync = exports.getNeighborsAsync = exports.pageRankAsync = exports.minimumSpanningTreeAsync = exports.louvainAsync = exports.labelPropagationAsync = exports.floydWarshallAsync = exports.findShortestPathAsync = exports.findAllPathAsync = exports.dijkstraAsync = exports.detectAllUndirectedCycleAsync = exports.detectAllDirectedCycleAsync = exports.detectAllCyclesAsync = exports.detectCycleAsync = exports.getOutDegreeAsync = exports.getInDegreeAsync = exports.getDegreeAsync = exports.connectedComponentAsync = exports.getAdjMatrixAsync = void 0;\n\nvar _createWorker = _interopRequireDefault(__webpack_require__(297));\n\nvar _constant = __webpack_require__(150);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * @param graphData 图数据\n * @param directed 是否为有向图\n */\nvar getAdjMatrixAsync = function getAdjMatrixAsync(graphData, directed) {\n return (0, _createWorker.default)(_constant.ALGORITHM.getAdjMatrix).apply(void 0, [graphData, directed]);\n};\n/**\n * 图的连通分量\n * @param graphData 图数据\n * @param directed 是否为有向图\n */\n\n\nexports.getAdjMatrixAsync = getAdjMatrixAsync;\n\nvar connectedComponentAsync = function connectedComponentAsync(graphData, directed) {\n return (0, _createWorker.default)(_constant.ALGORITHM.connectedComponent).apply(void 0, [graphData, directed]);\n};\n/**\n * 获取节点的度\n * @param graphData 图数据\n */\n\n\nexports.connectedComponentAsync = connectedComponentAsync;\n\nvar getDegreeAsync = function getDegreeAsync(graphData) {\n return (0, _createWorker.default)(_constant.ALGORITHM.getDegree)(graphData);\n};\n/**\n * 获取节点的入度\n * @param graphData 图数据\n * @param nodeId 节点ID\n */\n\n\nexports.getDegreeAsync = getDegreeAsync;\n\nvar getInDegreeAsync = function getInDegreeAsync(graphData, nodeId) {\n return (0, _createWorker.default)(_constant.ALGORITHM.getInDegree)(graphData, nodeId);\n};\n/**\n * 获取节点的出度\n * @param graphData 图数据\n * @param nodeId 节点ID\n */\n\n\nexports.getInDegreeAsync = getInDegreeAsync;\n\nvar getOutDegreeAsync = function getOutDegreeAsync(graphData, nodeId) {\n return (0, _createWorker.default)(_constant.ALGORITHM.getOutDegree)(graphData, nodeId);\n};\n/**\n * 检测图中的(有向) Cycle\n * @param graphData 图数据\n */\n\n\nexports.getOutDegreeAsync = getOutDegreeAsync;\n\nvar detectCycleAsync = function detectCycleAsync(graphData) {\n return (0, _createWorker.default)(_constant.ALGORITHM.detectCycle)(graphData);\n};\n/**\n * 检测图中的(无向) Cycle\n * @param graphData 图数据\n */\n\n\nexports.detectCycleAsync = detectCycleAsync;\n\nvar detectAllCyclesAsync = function detectAllCyclesAsync(graphData) {\n return (0, _createWorker.default)(_constant.ALGORITHM.detectAllCycles)(graphData);\n};\n/**\n * 检测图中的所有(有向) Cycle\n * @param graphData 图数据\n */\n\n\nexports.detectAllCyclesAsync = detectAllCyclesAsync;\n\nvar detectAllDirectedCycleAsync = function detectAllDirectedCycleAsync(graphData) {\n return (0, _createWorker.default)(_constant.ALGORITHM.detectAllDirectedCycle)(graphData);\n};\n/**\n * 检测图中的所有(无向) Cycle\n * @param graphData 图数据\n */\n\n\nexports.detectAllDirectedCycleAsync = detectAllDirectedCycleAsync;\n\nvar detectAllUndirectedCycleAsync = function detectAllUndirectedCycleAsync(graphData) {\n return (0, _createWorker.default)(_constant.ALGORITHM.detectAllUndirectedCycle)(graphData);\n};\n/**\n * Dijkstra's algorithm, See {@link https://en.wikipedia.org/wiki/Dijkstra%27s_algorithm}\n * @param graphData 图数据\n */\n\n\nexports.detectAllUndirectedCycleAsync = detectAllUndirectedCycleAsync;\n\nvar dijkstraAsync = function dijkstraAsync(graphData, source, directed, weightPropertyName) {\n return (0, _createWorker.default)(_constant.ALGORITHM.dijkstra).apply(void 0, [graphData, source, directed, weightPropertyName]);\n};\n/**\n * 查找两点之间的所有路径\n * @param graphData 图数据\n * @param start 路径起始点ID\n * @param end 路径终点ID\n * @param directed 是否为有向图\n */\n\n\nexports.dijkstraAsync = dijkstraAsync;\n\nvar findAllPathAsync = function findAllPathAsync(graphData, start, end, directed) {\n return (0, _createWorker.default)(_constant.ALGORITHM.findAllPath).apply(void 0, [graphData, start, end, directed]);\n};\n/**\n * 查找两点之间的所有路径\n * @param graphData 图数据\n * @param start 路径起始点ID\n * @param end 路径终点ID\n * @param directed 是否为有向图\n * @param weightPropertyName 边权重的属名称,若数据中没有权重,则默认每条边权重为 1\n */\n\n\nexports.findAllPathAsync = findAllPathAsync;\n\nvar findShortestPathAsync = function findShortestPathAsync(graphData, start, end, directed, weightPropertyName) {\n return (0, _createWorker.default)(_constant.ALGORITHM.findShortestPath).apply(void 0, [graphData, start, end, directed, weightPropertyName]);\n};\n/**\n * Floyd–Warshall algorithm, See {@link https://en.wikipedia.org/wiki/Floyd%E2%80%93Warshall_algorithm}\n * @param graphData 图数据\n * @param directed 是否为有向图\n */\n\n\nexports.findShortestPathAsync = findShortestPathAsync;\n\nvar floydWarshallAsync = function floydWarshallAsync(graphData, directed) {\n return (0, _createWorker.default)(_constant.ALGORITHM.floydWarshall).apply(void 0, [graphData, directed]);\n};\n/**\n * 标签传播算法\n * @param graphData 图数据\n * @param directed 是否有向图,默认为 false\n * @param weightPropertyName 权重的属性字段\n * @param maxIteration 最大迭代次数\n */\n\n\nexports.floydWarshallAsync = floydWarshallAsync;\n\nvar labelPropagationAsync = function labelPropagationAsync(graphData, directed, weightPropertyName, maxIteration) {\n if (maxIteration === void 0) {\n maxIteration = 1000;\n }\n\n return (0, _createWorker.default)(_constant.ALGORITHM.labelPropagation)(graphData, directed, weightPropertyName, maxIteration);\n};\n/**\n * 社区发现 louvain 算法\n * @param graphData 图数据\n * @param directed 是否有向图,默认为 false\n * @param weightPropertyName 权重的属性字段\n * @param threshold\n */\n\n\nexports.labelPropagationAsync = labelPropagationAsync;\n\nvar louvainAsync = function louvainAsync(graphData, directed, weightPropertyName, threshold) {\n return (0, _createWorker.default)(_constant.ALGORITHM.louvain)(graphData, directed, weightPropertyName, threshold);\n};\n/**\n * 最小生成树,See {@link https://en.wikipedia.org/wiki/Kruskal%27s_algorithm}\n * @param graph\n * @param weight 指定用于作为边权重的属性,若不指定,则认为所有边权重一致\n * @param algo 'prim' | 'kruskal' 算法类型\n * @return EdgeConfig[] 返回构成MST的边的数组\n */\n\n\nexports.louvainAsync = louvainAsync;\n\nvar minimumSpanningTreeAsync = function minimumSpanningTreeAsync(graphData, weight, algo) {\n return (0, _createWorker.default)(_constant.ALGORITHM.minimumSpanningTree).apply(void 0, [graphData, weight, algo]);\n};\n/**\n * PageRank https://en.wikipedia.org/wiki/PageRank\n * refer: https://github.com/anvaka/ngraph.pagerank\n * @param graph\n * @param epsilon 判断是否收敛的精度值,默认 0.000001\n * @param linkProb 阻尼系数(dumping factor),指任意时刻,用户访问到某节点后继续访问该节点链接的下一个节点的概率,经验值 0.85\n */\n\n\nexports.minimumSpanningTreeAsync = minimumSpanningTreeAsync;\n\nvar pageRankAsync = function pageRankAsync(graphData, epsilon, linkProb) {\n return (0, _createWorker.default)(_constant.ALGORITHM.pageRank).apply(void 0, [graphData, epsilon, linkProb]);\n};\n/**\n * 获取指定节点的所有邻居\n * @param nodeId 节点 ID\n * @param edges 图中的所有边数据\n * @param type 邻居类型\n */\n\n\nexports.pageRankAsync = pageRankAsync;\n\nvar getNeighborsAsync = function getNeighborsAsync(nodeId, edges, type) {\n return (0, _createWorker.default)(_constant.ALGORITHM.getNeighbors).apply(void 0, [nodeId, edges, type]);\n};\n/**\n * GADDI 图模式匹配\n * @param graphData 原图数据\n * @param pattern 搜索图(需要在原图上搜索的模式)数据\n * @param directed 是否计算有向图,默认 false\n * @param k 参数 k,表示 k-近邻\n * @param length 参数 length\n * @param nodeLabelProp 节点数据中代表节点标签(分类信息)的属性名。默认为 cluster\n * @param edgeLabelProp 边数据中代表边标签(分类信息)的属性名。默认为 cluster\n */\n\n\nexports.getNeighborsAsync = getNeighborsAsync;\n\nvar GADDIAsync = function GADDIAsync(graphData, pattern, directed, k, length, nodeLabelProp, edgeLabelProp) {\n if (directed === void 0) {\n directed = false;\n }\n\n if (nodeLabelProp === void 0) {\n nodeLabelProp = 'cluster';\n }\n\n if (edgeLabelProp === void 0) {\n edgeLabelProp = 'cluster';\n }\n\n return (0, _createWorker.default)(_constant.ALGORITHM.GADDI).apply(void 0, [graphData, pattern, directed, k, length, nodeLabelProp, edgeLabelProp]);\n};\n\nexports.GADDIAsync = GADDIAsync;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvYWxnb3JpdGhtL2xpYi93b3JrZXJzL2luZGV4LmpzP2U5OGQiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWI7QUFDQTtBQUNBLENBQUM7QUFDRDs7QUFFQSwyQ0FBMkMsbUJBQU8sQ0FBQyxHQUFnQjs7QUFFbkUsZ0JBQWdCLG1CQUFPLENBQUMsR0FBWTs7QUFFcEMsc0NBQXNDLHVDQUF1QyxnQkFBZ0I7O0FBRTdGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QjtBQUM5QjtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0M7QUFDbEM7QUFDQTtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBIiwiZmlsZSI6IjI5Ni5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5HQURESUFzeW5jID0gZXhwb3J0cy5nZXROZWlnaGJvcnNBc3luYyA9IGV4cG9ydHMucGFnZVJhbmtBc3luYyA9IGV4cG9ydHMubWluaW11bVNwYW5uaW5nVHJlZUFzeW5jID0gZXhwb3J0cy5sb3V2YWluQXN5bmMgPSBleHBvcnRzLmxhYmVsUHJvcGFnYXRpb25Bc3luYyA9IGV4cG9ydHMuZmxveWRXYXJzaGFsbEFzeW5jID0gZXhwb3J0cy5maW5kU2hvcnRlc3RQYXRoQXN5bmMgPSBleHBvcnRzLmZpbmRBbGxQYXRoQXN5bmMgPSBleHBvcnRzLmRpamtzdHJhQXN5bmMgPSBleHBvcnRzLmRldGVjdEFsbFVuZGlyZWN0ZWRDeWNsZUFzeW5jID0gZXhwb3J0cy5kZXRlY3RBbGxEaXJlY3RlZEN5Y2xlQXN5bmMgPSBleHBvcnRzLmRldGVjdEFsbEN5Y2xlc0FzeW5jID0gZXhwb3J0cy5kZXRlY3RDeWNsZUFzeW5jID0gZXhwb3J0cy5nZXRPdXREZWdyZWVBc3luYyA9IGV4cG9ydHMuZ2V0SW5EZWdyZWVBc3luYyA9IGV4cG9ydHMuZ2V0RGVncmVlQXN5bmMgPSBleHBvcnRzLmNvbm5lY3RlZENvbXBvbmVudEFzeW5jID0gZXhwb3J0cy5nZXRBZGpNYXRyaXhBc3luYyA9IHZvaWQgMDtcblxudmFyIF9jcmVhdGVXb3JrZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2NyZWF0ZVdvcmtlclwiKSk7XG5cbnZhciBfY29uc3RhbnQgPSByZXF1aXJlKFwiLi9jb25zdGFudFwiKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuLyoqXG4gKiBAcGFyYW0gZ3JhcGhEYXRhIOWbvuaVsOaNrlxuICogQHBhcmFtIGRpcmVjdGVkIOaYr+WQpuS4uuacieWQkeWbvlxuICovXG52YXIgZ2V0QWRqTWF0cml4QXN5bmMgPSBmdW5jdGlvbiBnZXRBZGpNYXRyaXhBc3luYyhncmFwaERhdGEsIGRpcmVjdGVkKSB7XG4gIHJldHVybiAoMCwgX2NyZWF0ZVdvcmtlci5kZWZhdWx0KShfY29uc3RhbnQuQUxHT1JJVEhNLmdldEFkak1hdHJpeCkuYXBwbHkodm9pZCAwLCBbZ3JhcGhEYXRhLCBkaXJlY3RlZF0pO1xufTtcbi8qKlxuICog5Zu+55qE6L+e6YCa5YiG6YePXG4gKiBAcGFyYW0gZ3JhcGhEYXRhIOWbvuaVsOaNrlxuICogQHBhcmFtIGRpcmVjdGVkIOaYr+WQpuS4uuacieWQkeWbvlxuICovXG5cblxuZXhwb3J0cy5nZXRBZGpNYXRyaXhBc3luYyA9IGdldEFkak1hdHJpeEFzeW5jO1xuXG52YXIgY29ubmVjdGVkQ29tcG9uZW50QXN5bmMgPSBmdW5jdGlvbiBjb25uZWN0ZWRDb21wb25lbnRBc3luYyhncmFwaERhdGEsIGRpcmVjdGVkKSB7XG4gIHJldHVybiAoMCwgX2NyZWF0ZVdvcmtlci5kZWZhdWx0KShfY29uc3RhbnQuQUxHT1JJVEhNLmNvbm5lY3RlZENvbXBvbmVudCkuYXBwbHkodm9pZCAwLCBbZ3JhcGhEYXRhLCBkaXJlY3RlZF0pO1xufTtcbi8qKlxuICog6I635Y+W6IqC54K555qE5bqmXG4gKiBAcGFyYW0gZ3JhcGhEYXRhIOWbvuaVsOaNrlxuICovXG5cblxuZXhwb3J0cy5jb25uZWN0ZWRDb21wb25lbnRBc3luYyA9IGNvbm5lY3RlZENvbXBvbmVudEFzeW5jO1xuXG52YXIgZ2V0RGVncmVlQXN5bmMgPSBmdW5jdGlvbiBnZXREZWdyZWVBc3luYyhncmFwaERhdGEpIHtcbiAgcmV0dXJuICgwLCBfY3JlYXRlV29ya2VyLmRlZmF1bHQpKF9jb25zdGFudC5BTEdPUklUSE0uZ2V0RGVncmVlKShncmFwaERhdGEpO1xufTtcbi8qKlxuICog6I635Y+W6IqC54K555qE5YWl5bqmXG4gKiBAcGFyYW0gZ3JhcGhEYXRhIOWbvuaVsOaNrlxuICogQHBhcmFtIG5vZGVJZCDoioLngrlJRFxuICovXG5cblxuZXhwb3J0cy5nZXREZWdyZWVBc3luYyA9IGdldERlZ3JlZUFzeW5jO1xuXG52YXIgZ2V0SW5EZWdyZWVBc3luYyA9IGZ1bmN0aW9uIGdldEluRGVncmVlQXN5bmMoZ3JhcGhEYXRhLCBub2RlSWQpIHtcbiAgcmV0dXJuICgwLCBfY3JlYXRlV29ya2VyLmRlZmF1bHQpKF9jb25zdGFudC5BTEdPUklUSE0uZ2V0SW5EZWdyZWUpKGdyYXBoRGF0YSwgbm9kZUlkKTtcbn07XG4vKipcbiAqIOiOt+WPluiKgueCueeahOWHuuW6plxuICogQHBhcmFtIGdyYXBoRGF0YSDlm77mlbDmja5cbiAqIEBwYXJhbSBub2RlSWQg6IqC54K5SURcbiAqL1xuXG5cbmV4cG9ydHMuZ2V0SW5EZWdyZWVBc3luYyA9IGdldEluRGVncmVlQXN5bmM7XG5cbnZhciBnZXRPdXREZWdyZWVBc3luYyA9IGZ1bmN0aW9uIGdldE91dERlZ3JlZUFzeW5jKGdyYXBoRGF0YSwgbm9kZUlkKSB7XG4gIHJldHVybiAoMCwgX2NyZWF0ZVdvcmtlci5kZWZhdWx0KShfY29uc3RhbnQuQUxHT1JJVEhNLmdldE91dERlZ3JlZSkoZ3JhcGhEYXRhLCBub2RlSWQpO1xufTtcbi8qKlxuICog5qOA5rWL5Zu+5Lit55qEKOacieWQkSkgQ3ljbGVcbiAqIEBwYXJhbSBncmFwaERhdGEg5Zu+5pWw5o2uXG4gKi9cblxuXG5leHBvcnRzLmdldE91dERlZ3JlZUFzeW5jID0gZ2V0T3V0RGVncmVlQXN5bmM7XG5cbnZhciBkZXRlY3RDeWNsZUFzeW5jID0gZnVuY3Rpb24gZGV0ZWN0Q3ljbGVBc3luYyhncmFwaERhdGEpIHtcbiAgcmV0dXJuICgwLCBfY3JlYXRlV29ya2VyLmRlZmF1bHQpKF9jb25zdGFudC5BTEdPUklUSE0uZGV0ZWN0Q3ljbGUpKGdyYXBoRGF0YSk7XG59O1xuLyoqXG4gKiDmo4DmtYvlm77kuK3nmoQo5peg5ZCRKSBDeWNsZVxuICogQHBhcmFtIGdyYXBoRGF0YSDlm77mlbDmja5cbiAqL1xuXG5cbmV4cG9ydHMuZGV0ZWN0Q3ljbGVBc3luYyA9IGRldGVjdEN5Y2xlQXN5bmM7XG5cbnZhciBkZXRlY3RBbGxDeWNsZXNBc3luYyA9IGZ1bmN0aW9uIGRldGVjdEFsbEN5Y2xlc0FzeW5jKGdyYXBoRGF0YSkge1xuICByZXR1cm4gKDAsIF9jcmVhdGVXb3JrZXIuZGVmYXVsdCkoX2NvbnN0YW50LkFMR09SSVRITS5kZXRlY3RBbGxDeWNsZXMpKGdyYXBoRGF0YSk7XG59O1xuLyoqXG4gKiDmo4DmtYvlm77kuK3nmoTmiYDmnIko5pyJ5ZCRKSBDeWNsZVxuICogQHBhcmFtIGdyYXBoRGF0YSDlm77mlbDmja5cbiAqL1xuXG5cbmV4cG9ydHMuZGV0ZWN0QWxsQ3ljbGVzQXN5bmMgPSBkZXRlY3RBbGxDeWNsZXNBc3luYztcblxudmFyIGRldGVjdEFsbERpcmVjdGVkQ3ljbGVBc3luYyA9IGZ1bmN0aW9uIGRldGVjdEFsbERpcmVjdGVkQ3ljbGVBc3luYyhncmFwaERhdGEpIHtcbiAgcmV0dXJuICgwLCBfY3JlYXRlV29ya2VyLmRlZmF1bHQpKF9jb25zdGFudC5BTEdPUklUSE0uZGV0ZWN0QWxsRGlyZWN0ZWRDeWNsZSkoZ3JhcGhEYXRhKTtcbn07XG4vKipcbiAqIOajgOa1i+WbvuS4reeahOaJgOaciSjml6DlkJEpIEN5Y2xlXG4gKiBAcGFyYW0gZ3JhcGhEYXRhIOWbvuaVsOaNrlxuICovXG5cblxuZXhwb3J0cy5kZXRlY3RBbGxEaXJlY3RlZEN5Y2xlQXN5bmMgPSBkZXRlY3RBbGxEaXJlY3RlZEN5Y2xlQXN5bmM7XG5cbnZhciBkZXRlY3RBbGxVbmRpcmVjdGVkQ3ljbGVBc3luYyA9IGZ1bmN0aW9uIGRldGVjdEFsbFVuZGlyZWN0ZWRDeWNsZUFzeW5jKGdyYXBoRGF0YSkge1xuICByZXR1cm4gKDAsIF9jcmVhdGVXb3JrZXIuZGVmYXVsdCkoX2NvbnN0YW50LkFMR09SSVRITS5kZXRlY3RBbGxVbmRpcmVjdGVkQ3ljbGUpKGdyYXBoRGF0YSk7XG59O1xuLyoqXG4gKiBEaWprc3RyYSdzIGFsZ29yaXRobSwgU2VlIHtAbGluayBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9EaWprc3RyYSUyN3NfYWxnb3JpdGhtfVxuICogQHBhcmFtIGdyYXBoRGF0YSDlm77mlbDmja5cbiAqL1xuXG5cbmV4cG9ydHMuZGV0ZWN0QWxsVW5kaXJlY3RlZEN5Y2xlQXN5bmMgPSBkZXRlY3RBbGxVbmRpcmVjdGVkQ3ljbGVBc3luYztcblxudmFyIGRpamtzdHJhQXN5bmMgPSBmdW5jdGlvbiBkaWprc3RyYUFzeW5jKGdyYXBoRGF0YSwgc291cmNlLCBkaXJlY3RlZCwgd2VpZ2h0UHJvcGVydHlOYW1lKSB7XG4gIHJldHVybiAoMCwgX2NyZWF0ZVdvcmtlci5kZWZhdWx0KShfY29uc3RhbnQuQUxHT1JJVEhNLmRpamtzdHJhKS5hcHBseSh2b2lkIDAsIFtncmFwaERhdGEsIHNvdXJjZSwgZGlyZWN0ZWQsIHdlaWdodFByb3BlcnR5TmFtZV0pO1xufTtcbi8qKlxuICog5p+l5om+5Lik54K55LmL6Ze055qE5omA5pyJ6Lev5b6EXG4gKiBAcGFyYW0gZ3JhcGhEYXRhIOWbvuaVsOaNrlxuICogQHBhcmFtIHN0YXJ0IOi3r+W+hOi1t+Wni+eCuUlEXG4gKiBAcGFyYW0gZW5kIOi3r+W+hOe7iOeCuUlEXG4gKiBAcGFyYW0gZGlyZWN0ZWQg5piv5ZCm5Li65pyJ5ZCR5Zu+XG4gKi9cblxuXG5leHBvcnRzLmRpamtzdHJhQXN5bmMgPSBkaWprc3RyYUFzeW5jO1xuXG52YXIgZmluZEFsbFBhdGhBc3luYyA9IGZ1bmN0aW9uIGZpbmRBbGxQYXRoQXN5bmMoZ3JhcGhEYXRhLCBzdGFydCwgZW5kLCBkaXJlY3RlZCkge1xuICByZXR1cm4gKDAsIF9jcmVhdGVXb3JrZXIuZGVmYXVsdCkoX2NvbnN0YW50LkFMR09SSVRITS5maW5kQWxsUGF0aCkuYXBwbHkodm9pZCAwLCBbZ3JhcGhEYXRhLCBzdGFydCwgZW5kLCBkaXJlY3RlZF0pO1xufTtcbi8qKlxuICog5p+l5om+5Lik54K55LmL6Ze055qE5omA5pyJ6Lev5b6EXG4gKiBAcGFyYW0gZ3JhcGhEYXRhIOWbvuaVsOaNrlxuICogQHBhcmFtIHN0YXJ0IOi3r+W+hOi1t+Wni+eCuUlEXG4gKiBAcGFyYW0gZW5kIOi3r+W+hOe7iOeCuUlEXG4gKiBAcGFyYW0gZGlyZWN0ZWQg5piv5ZCm5Li65pyJ5ZCR5Zu+XG4gKiBAcGFyYW0gd2VpZ2h0UHJvcGVydHlOYW1lIOi+ueadg+mHjeeahOWxnuWQjeensO+8jOiLpeaVsOaNruS4reayoeacieadg+mHje+8jOWImem7mOiupOavj+adoei+ueadg+mHjeS4uiAxXG4gKi9cblxuXG5leHBvcnRzLmZpbmRBbGxQYXRoQXN5bmMgPSBmaW5kQWxsUGF0aEFzeW5jO1xuXG52YXIgZmluZFNob3J0ZXN0UGF0aEFzeW5jID0gZnVuY3Rpb24gZmluZFNob3J0ZXN0UGF0aEFzeW5jKGdyYXBoRGF0YSwgc3RhcnQsIGVuZCwgZGlyZWN0ZWQsIHdlaWdodFByb3BlcnR5TmFtZSkge1xuICByZXR1cm4gKDAsIF9jcmVhdGVXb3JrZXIuZGVmYXVsdCkoX2NvbnN0YW50LkFMR09SSVRITS5maW5kU2hvcnRlc3RQYXRoKS5hcHBseSh2b2lkIDAsIFtncmFwaERhdGEsIHN0YXJ0LCBlbmQsIGRpcmVjdGVkLCB3ZWlnaHRQcm9wZXJ0eU5hbWVdKTtcbn07XG4vKipcbiAqIEZsb3lk4oCTV2Fyc2hhbGwgYWxnb3JpdGhtLCBTZWUge0BsaW5rIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0Zsb3lkJUUyJTgwJTkzV2Fyc2hhbGxfYWxnb3JpdGhtfVxuICogQHBhcmFtIGdyYXBoRGF0YSDlm77mlbDmja5cbiAqIEBwYXJhbSBkaXJlY3RlZCDmmK/lkKbkuLrmnInlkJHlm75cbiAqL1xuXG5cbmV4cG9ydHMuZmluZFNob3J0ZXN0UGF0aEFzeW5jID0gZmluZFNob3J0ZXN0UGF0aEFzeW5jO1xuXG52YXIgZmxveWRXYXJzaGFsbEFzeW5jID0gZnVuY3Rpb24gZmxveWRXYXJzaGFsbEFzeW5jKGdyYXBoRGF0YSwgZGlyZWN0ZWQpIHtcbiAgcmV0dXJuICgwLCBfY3JlYXRlV29ya2VyLmRlZmF1bHQpKF9jb25zdGFudC5BTEdPUklUSE0uZmxveWRXYXJzaGFsbCkuYXBwbHkodm9pZCAwLCBbZ3JhcGhEYXRhLCBkaXJlY3RlZF0pO1xufTtcbi8qKlxuICog5qCH562+5Lyg5pKt566X5rOVXG4gKiBAcGFyYW0gZ3JhcGhEYXRhIOWbvuaVsOaNrlxuICogQHBhcmFtIGRpcmVjdGVkIOaYr+WQpuacieWQkeWbvu+8jOm7mOiupOS4uiBmYWxzZVxuICogQHBhcmFtIHdlaWdodFByb3BlcnR5TmFtZSDmnYPph43nmoTlsZ7mgKflrZfmrrVcbiAqIEBwYXJhbSBtYXhJdGVyYXRpb24g5pyA5aSn6L+t5Luj5qyh5pWwXG4gKi9cblxuXG5leHBvcnRzLmZsb3lkV2Fyc2hhbGxBc3luYyA9IGZsb3lkV2Fyc2hhbGxBc3luYztcblxudmFyIGxhYmVsUHJvcGFnYXRpb25Bc3luYyA9IGZ1bmN0aW9uIGxhYmVsUHJvcGFnYXRpb25Bc3luYyhncmFwaERhdGEsIGRpcmVjdGVkLCB3ZWlnaHRQcm9wZXJ0eU5hbWUsIG1heEl0ZXJhdGlvbikge1xuICBpZiAobWF4SXRlcmF0aW9uID09PSB2b2lkIDApIHtcbiAgICBtYXhJdGVyYXRpb24gPSAxMDAwO1xuICB9XG5cbiAgcmV0dXJuICgwLCBfY3JlYXRlV29ya2VyLmRlZmF1bHQpKF9jb25zdGFudC5BTEdPUklUSE0ubGFiZWxQcm9wYWdhdGlvbikoZ3JhcGhEYXRhLCBkaXJlY3RlZCwgd2VpZ2h0UHJvcGVydHlOYW1lLCBtYXhJdGVyYXRpb24pO1xufTtcbi8qKlxuICog56S+5Yy65Y+R546wIGxvdXZhaW4g566X5rOVXG4gKiBAcGFyYW0gZ3JhcGhEYXRhIOWbvuaVsOaNrlxuICogQHBhcmFtIGRpcmVjdGVkIOaYr+WQpuacieWQkeWbvu+8jOm7mOiupOS4uiBmYWxzZVxuICogQHBhcmFtIHdlaWdodFByb3BlcnR5TmFtZSDmnYPph43nmoTlsZ7mgKflrZfmrrVcbiAqIEBwYXJhbSB0aHJlc2hvbGRcbiAqL1xuXG5cbmV4cG9ydHMubGFiZWxQcm9wYWdhdGlvbkFzeW5jID0gbGFiZWxQcm9wYWdhdGlvbkFzeW5jO1xuXG52YXIgbG91dmFpbkFzeW5jID0gZnVuY3Rpb24gbG91dmFpbkFzeW5jKGdyYXBoRGF0YSwgZGlyZWN0ZWQsIHdlaWdodFByb3BlcnR5TmFtZSwgdGhyZXNob2xkKSB7XG4gIHJldHVybiAoMCwgX2NyZWF0ZVdvcmtlci5kZWZhdWx0KShfY29uc3RhbnQuQUxHT1JJVEhNLmxvdXZhaW4pKGdyYXBoRGF0YSwgZGlyZWN0ZWQsIHdlaWdodFByb3BlcnR5TmFtZSwgdGhyZXNob2xkKTtcbn07XG4vKipcbiAqIOacgOWwj+eUn+aIkOagke+8jFNlZSB7QGxpbmsgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvS3J1c2thbCUyN3NfYWxnb3JpdGhtfVxuICogQHBhcmFtIGdyYXBoXG4gKiBAcGFyYW0gd2VpZ2h0IOaMh+WumueUqOS6juS9nOS4uui+ueadg+mHjeeahOWxnuaAp++8jOiLpeS4jeaMh+Wumu+8jOWImeiupOS4uuaJgOaciei+ueadg+mHjeS4gOiHtFxuICogQHBhcmFtIGFsZ28gJ3ByaW0nIHwgJ2tydXNrYWwnIOeul+azleexu+Wei1xuICogQHJldHVybiBFZGdlQ29uZmlnW10g6L+U5Zue5p6E5oiQTVNU55qE6L6555qE5pWw57uEXG4gKi9cblxuXG5leHBvcnRzLmxvdXZhaW5Bc3luYyA9IGxvdXZhaW5Bc3luYztcblxudmFyIG1pbmltdW1TcGFubmluZ1RyZWVBc3luYyA9IGZ1bmN0aW9uIG1pbmltdW1TcGFubmluZ1RyZWVBc3luYyhncmFwaERhdGEsIHdlaWdodCwgYWxnbykge1xuICByZXR1cm4gKDAsIF9jcmVhdGVXb3JrZXIuZGVmYXVsdCkoX2NvbnN0YW50LkFMR09SSVRITS5taW5pbXVtU3Bhbm5pbmdUcmVlKS5hcHBseSh2b2lkIDAsIFtncmFwaERhdGEsIHdlaWdodCwgYWxnb10pO1xufTtcbi8qKlxuICogUGFnZVJhbmsgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvUGFnZVJhbmtcbiAqIHJlZmVyOiBodHRwczovL2dpdGh1Yi5jb20vYW52YWthL25ncmFwaC5wYWdlcmFua1xuICogQHBhcmFtIGdyYXBoXG4gKiBAcGFyYW0gZXBzaWxvbiDliKTmlq3mmK/lkKbmlLbmlZvnmoTnsr7luqblgLzvvIzpu5jorqQgMC4wMDAwMDFcbiAqIEBwYXJhbSBsaW5rUHJvYiDpmLvlsLzns7vmlbDvvIhkdW1waW5nIGZhY3Rvcu+8ie+8jOaMh+S7u+aEj+aXtuWIu++8jOeUqOaIt+iuv+mXruWIsOafkOiKgueCueWQjue7p+e7reiuv+mXruivpeiKgueCuemTvuaOpeeahOS4i+S4gOS4quiKgueCueeahOamgueOh++8jOe7j+mqjOWAvCAwLjg1XG4gKi9cblxuXG5leHBvcnRzLm1pbmltdW1TcGFubmluZ1RyZWVBc3luYyA9IG1pbmltdW1TcGFubmluZ1RyZWVBc3luYztcblxudmFyIHBhZ2VSYW5rQXN5bmMgPSBmdW5jdGlvbiBwYWdlUmFua0FzeW5jKGdyYXBoRGF0YSwgZXBzaWxvbiwgbGlua1Byb2IpIHtcbiAgcmV0dXJuICgwLCBfY3JlYXRlV29ya2VyLmRlZmF1bHQpKF9jb25zdGFudC5BTEdPUklUSE0ucGFnZVJhbmspLmFwcGx5KHZvaWQgMCwgW2dyYXBoRGF0YSwgZXBzaWxvbiwgbGlua1Byb2JdKTtcbn07XG4vKipcbiAqIOiOt+WPluaMh+WumuiKgueCueeahOaJgOaciemCu+WxhVxuICogQHBhcmFtIG5vZGVJZCDoioLngrkgSURcbiAqIEBwYXJhbSBlZGdlcyDlm77kuK3nmoTmiYDmnInovrnmlbDmja5cbiAqIEBwYXJhbSB0eXBlIOmCu+Wxheexu+Wei1xuICovXG5cblxuZXhwb3J0cy5wYWdlUmFua0FzeW5jID0gcGFnZVJhbmtBc3luYztcblxudmFyIGdldE5laWdoYm9yc0FzeW5jID0gZnVuY3Rpb24gZ2V0TmVpZ2hib3JzQXN5bmMobm9kZUlkLCBlZGdlcywgdHlwZSkge1xuICByZXR1cm4gKDAsIF9jcmVhdGVXb3JrZXIuZGVmYXVsdCkoX2NvbnN0YW50LkFMR09SSVRITS5nZXROZWlnaGJvcnMpLmFwcGx5KHZvaWQgMCwgW25vZGVJZCwgZWRnZXMsIHR5cGVdKTtcbn07XG4vKipcbiAqIEdBRERJIOWbvuaooeW8j+WMuemFjVxuICogQHBhcmFtIGdyYXBoRGF0YSDljp/lm77mlbDmja5cbiAqIEBwYXJhbSBwYXR0ZXJuIOaQnOe0ouWbvu+8iOmcgOimgeWcqOWOn+WbvuS4iuaQnOe0oueahOaooeW8j++8ieaVsOaNrlxuICogQHBhcmFtIGRpcmVjdGVkIOaYr+WQpuiuoeeul+acieWQkeWbvu+8jOm7mOiupCBmYWxzZVxuICogQHBhcmFtIGsg5Y+C5pWwIGvvvIzooajnpLogay3ov5HpgrtcbiAqIEBwYXJhbSBsZW5ndGgg5Y+C5pWwIGxlbmd0aFxuICogQHBhcmFtIG5vZGVMYWJlbFByb3Ag6IqC54K55pWw5o2u5Lit5Luj6KGo6IqC54K55qCH562+77yI5YiG57G75L+h5oGv77yJ55qE5bGe5oCn5ZCN44CC6buY6K6k5Li6IGNsdXN0ZXJcbiAqIEBwYXJhbSBlZGdlTGFiZWxQcm9wIOi+ueaVsOaNruS4reS7o+ihqOi+ueagh+etvu+8iOWIhuexu+S/oeaBr++8ieeahOWxnuaAp+WQjeOAgum7mOiupOS4uiBjbHVzdGVyXG4gKi9cblxuXG5leHBvcnRzLmdldE5laWdoYm9yc0FzeW5jID0gZ2V0TmVpZ2hib3JzQXN5bmM7XG5cbnZhciBHQURESUFzeW5jID0gZnVuY3Rpb24gR0FERElBc3luYyhncmFwaERhdGEsIHBhdHRlcm4sIGRpcmVjdGVkLCBrLCBsZW5ndGgsIG5vZGVMYWJlbFByb3AsIGVkZ2VMYWJlbFByb3ApIHtcbiAgaWYgKGRpcmVjdGVkID09PSB2b2lkIDApIHtcbiAgICBkaXJlY3RlZCA9IGZhbHNlO1xuICB9XG5cbiAgaWYgKG5vZGVMYWJlbFByb3AgPT09IHZvaWQgMCkge1xuICAgIG5vZGVMYWJlbFByb3AgPSAnY2x1c3Rlcic7XG4gIH1cblxuICBpZiAoZWRnZUxhYmVsUHJvcCA9PT0gdm9pZCAwKSB7XG4gICAgZWRnZUxhYmVsUHJvcCA9ICdjbHVzdGVyJztcbiAgfVxuXG4gIHJldHVybiAoMCwgX2NyZWF0ZVdvcmtlci5kZWZhdWx0KShfY29uc3RhbnQuQUxHT1JJVEhNLkdBRERJKS5hcHBseSh2b2lkIDAsIFtncmFwaERhdGEsIHBhdHRlcm4sIGRpcmVjdGVkLCBrLCBsZW5ndGgsIG5vZGVMYWJlbFByb3AsIGVkZ2VMYWJlbFByb3BdKTtcbn07XG5cbmV4cG9ydHMuR0FERElBc3luYyA9IEdBRERJQXN5bmM7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///296\n")},function(module,exports,__webpack_require__){"use strict";eval('\n\nObject.defineProperty(exports, "__esModule", {\n value: true\n});\nexports.default = void 0;\n\nvar _constant = __webpack_require__(150);\n\nvar _index = _interopRequireDefault(__webpack_require__(298));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * 创建一个在worker中运行的算法\n * @param type 算法类型\n */\nvar createWorker = function createWorker(type) {\n return function () {\n var data = [];\n\n for (var _i = 0; _i < arguments.length; _i++) {\n data[_i] = arguments[_i];\n }\n\n return new Promise(function (resolve, reject) {\n var worker = new _index.default();\n worker.postMessage({\n _algorithmType: type,\n data: data\n });\n\n worker.onmessage = function (event) {\n var _a = event.data,\n data = _a.data,\n _algorithmType = _a._algorithmType;\n\n if (_constant.MESSAGE.SUCCESS === _algorithmType) {\n resolve(data);\n } else {\n reject();\n }\n\n worker.terminate();\n };\n });\n };\n};\n\nvar _default = createWorker;\nexports.default = _default;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvYWxnb3JpdGhtL2xpYi93b3JrZXJzL2NyZWF0ZVdvcmtlci5qcz9jMGQyIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFhOztBQUViO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7O0FBRUEsZ0JBQWdCLG1CQUFPLENBQUMsR0FBWTs7QUFFcEMsb0NBQW9DLG1CQUFPLENBQUMsR0FBZ0I7O0FBRTVELHNDQUFzQyx1Q0FBdUMsZ0JBQWdCOztBQUU3RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxvQkFBb0IsdUJBQXVCO0FBQzNDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBIiwiZmlsZSI6IjI5Ny5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgX2NvbnN0YW50ID0gcmVxdWlyZShcIi4vY29uc3RhbnRcIik7XG5cbnZhciBfaW5kZXggPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2luZGV4LndvcmtlclwiKSk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbi8qKlxuICog5Yib5bu65LiA5Liq5Zyod29ya2Vy5Lit6L+Q6KGM55qE566X5rOVXG4gKiBAcGFyYW0gdHlwZSDnrpfms5XnsbvlnotcbiAqL1xudmFyIGNyZWF0ZVdvcmtlciA9IGZ1bmN0aW9uIGNyZWF0ZVdvcmtlcih0eXBlKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGRhdGEgPSBbXTtcblxuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICBkYXRhW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIHZhciB3b3JrZXIgPSBuZXcgX2luZGV4LmRlZmF1bHQoKTtcbiAgICAgIHdvcmtlci5wb3N0TWVzc2FnZSh7XG4gICAgICAgIF9hbGdvcml0aG1UeXBlOiB0eXBlLFxuICAgICAgICBkYXRhOiBkYXRhXG4gICAgICB9KTtcblxuICAgICAgd29ya2VyLm9ubWVzc2FnZSA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICB2YXIgX2EgPSBldmVudC5kYXRhLFxuICAgICAgICAgICAgZGF0YSA9IF9hLmRhdGEsXG4gICAgICAgICAgICBfYWxnb3JpdGhtVHlwZSA9IF9hLl9hbGdvcml0aG1UeXBlO1xuXG4gICAgICAgIGlmIChfY29uc3RhbnQuTUVTU0FHRS5TVUNDRVNTID09PSBfYWxnb3JpdGhtVHlwZSkge1xuICAgICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVqZWN0KCk7XG4gICAgICAgIH1cblxuICAgICAgICB3b3JrZXIudGVybWluYXRlKCk7XG4gICAgICB9O1xuICAgIH0pO1xuICB9O1xufTtcblxudmFyIF9kZWZhdWx0ID0gY3JlYXRlV29ya2VyO1xuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///297\n')},function(module,exports,__webpack_require__){"use strict";eval('\n\nfunction _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }\n\nObject.defineProperty(exports, "__esModule", {\n value: true\n});\nexports.default = void 0;\n\nvar algorithm = _interopRequireWildcard(__webpack_require__(299));\n\nvar _constant = __webpack_require__(150);\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nvar ctx = typeof self !== \'undefined\' ? self : {};\n\nctx.onmessage = function (event) {\n var _a = event.data,\n _algorithmType = _a._algorithmType,\n data = _a.data; // 如果发送内容没有私有类型。说明不是自己发的。不管\n // fix: https://github.com/antvis/algorithm/issues/25\n\n if (!_algorithmType) {\n return;\n }\n\n if (typeof algorithm[_algorithmType] === \'function\') {\n var result = algorithm[_algorithmType].apply(algorithm, data);\n\n ctx.postMessage({\n _algorithmType: _constant.MESSAGE.SUCCESS,\n data: result\n });\n return;\n }\n\n ctx.postMessage({\n _algorithmType: _constant.MESSAGE.FAILURE\n });\n}; // https://stackoverflow.com/questions/50210416/webpack-worker-loader-fails-to-compile-typescript-worker\n\n\nvar _default = null;\nexports.default = _default;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvYWxnb3JpdGhtL2xpYi93b3JrZXJzL2luZGV4Lndvcmtlci5qcz85ZmJhIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFhOztBQUViLHVCQUF1QiwyQkFBMkIsMkVBQTJFLGtDQUFrQyxtQkFBbUIsR0FBRyxFQUFFLE9BQU8sa0NBQWtDLDhIQUE4SCxHQUFHLEVBQUUscUJBQXFCOztBQUV4WDtBQUNBO0FBQ0EsQ0FBQztBQUNEOztBQUVBLHdDQUF3QyxtQkFBTyxDQUFDLEdBQWE7O0FBRTdELGdCQUFnQixtQkFBTyxDQUFDLEdBQVk7O0FBRXBDLHFDQUFxQyxnREFBZ0QsMkJBQTJCLGlFQUFpRSxjQUFjLEdBQUcsY0FBYzs7QUFFaE4sdUNBQXVDLDZCQUE2QixZQUFZLEVBQUUsOEVBQThFLFNBQVMsZ0JBQWdCLEVBQUUsd0NBQXdDLCtCQUErQix1QkFBdUIsRUFBRSxpQkFBaUIsc0ZBQXNGLHVCQUF1QixzREFBc0QscUZBQXFGLHNDQUFzQywwQ0FBMEMsRUFBRSxPQUFPLHdCQUF3QixFQUFFLEVBQUUsRUFBRSxzQkFBc0IsYUFBYSx3QkFBd0IsRUFBRSxlQUFlOztBQUV2dUI7O0FBRUE7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsRUFBRTs7O0FBR0Y7QUFDQSIsImZpbGUiOiIyOTguanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiOyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIpIHsgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9OyB9IGVsc2UgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07IH0gcmV0dXJuIF90eXBlb2Yob2JqKTsgfVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgYWxnb3JpdGhtID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcIi4vYWxnb3JpdGhtXCIpKTtcblxudmFyIF9jb25zdGFudCA9IHJlcXVpcmUoXCIuL2NvbnN0YW50XCIpO1xuXG5mdW5jdGlvbiBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUoKSB7IGlmICh0eXBlb2YgV2Vha01hcCAhPT0gXCJmdW5jdGlvblwiKSByZXR1cm4gbnVsbDsgdmFyIGNhY2hlID0gbmV3IFdlYWtNYXAoKTsgX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlID0gZnVuY3Rpb24gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKCkgeyByZXR1cm4gY2FjaGU7IH07IHJldHVybiBjYWNoZTsgfVxuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChvYmopIHsgaWYgKG9iaiAmJiBvYmouX19lc01vZHVsZSkgeyByZXR1cm4gb2JqOyB9IGlmIChvYmogPT09IG51bGwgfHwgX3R5cGVvZihvYmopICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiBvYmogIT09IFwiZnVuY3Rpb25cIikgeyByZXR1cm4geyBkZWZhdWx0OiBvYmogfTsgfSB2YXIgY2FjaGUgPSBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUoKTsgaWYgKGNhY2hlICYmIGNhY2hlLmhhcyhvYmopKSB7IHJldHVybiBjYWNoZS5nZXQob2JqKTsgfSB2YXIgbmV3T2JqID0ge307IHZhciBoYXNQcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZGVmaW5lUHJvcGVydHkgJiYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjsgZm9yICh2YXIga2V5IGluIG9iaikgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkgeyB2YXIgZGVzYyA9IGhhc1Byb3BlcnR5RGVzY3JpcHRvciA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBrZXkpIDogbnVsbDsgaWYgKGRlc2MgJiYgKGRlc2MuZ2V0IHx8IGRlc2Muc2V0KSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkobmV3T2JqLCBrZXksIGRlc2MpOyB9IGVsc2UgeyBuZXdPYmpba2V5XSA9IG9ialtrZXldOyB9IH0gfSBuZXdPYmouZGVmYXVsdCA9IG9iajsgaWYgKGNhY2hlKSB7IGNhY2hlLnNldChvYmosIG5ld09iaik7IH0gcmV0dXJuIG5ld09iajsgfVxuXG52YXIgY3R4ID0gdHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnID8gc2VsZiA6IHt9O1xuXG5jdHgub25tZXNzYWdlID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gIHZhciBfYSA9IGV2ZW50LmRhdGEsXG4gICAgICBfYWxnb3JpdGhtVHlwZSA9IF9hLl9hbGdvcml0aG1UeXBlLFxuICAgICAgZGF0YSA9IF9hLmRhdGE7IC8vIOWmguaenOWPkemAgeWGheWuueayoeacieengeacieexu+Wei+OAguivtOaYjuS4jeaYr+iHquW3seWPkeeahOOAguS4jeeuoVxuICAvLyBmaXg6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbnR2aXMvYWxnb3JpdGhtL2lzc3Vlcy8yNVxuXG4gIGlmICghX2FsZ29yaXRobVR5cGUpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAodHlwZW9mIGFsZ29yaXRobVtfYWxnb3JpdGhtVHlwZV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgcmVzdWx0ID0gYWxnb3JpdGhtW19hbGdvcml0aG1UeXBlXS5hcHBseShhbGdvcml0aG0sIGRhdGEpO1xuXG4gICAgY3R4LnBvc3RNZXNzYWdlKHtcbiAgICAgIF9hbGdvcml0aG1UeXBlOiBfY29uc3RhbnQuTUVTU0FHRS5TVUNDRVNTLFxuICAgICAgZGF0YTogcmVzdWx0XG4gICAgfSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY3R4LnBvc3RNZXNzYWdlKHtcbiAgICBfYWxnb3JpdGhtVHlwZTogX2NvbnN0YW50Lk1FU1NBR0UuRkFJTFVSRVxuICB9KTtcbn07IC8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzUwMjEwNDE2L3dlYnBhY2std29ya2VyLWxvYWRlci1mYWlscy10by1jb21waWxlLXR5cGVzY3JpcHQtd29ya2VyXG5cblxudmFyIF9kZWZhdWx0ID0gbnVsbDtcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///298\n')},function(module,exports,__webpack_require__){"use strict";eval('\n\nfunction _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }\n\nObject.defineProperty(exports, "__esModule", {\n value: true\n});\nObject.defineProperty(exports, "getAdjMatrix", {\n enumerable: true,\n get: function get() {\n return _adjacentMatrix.default;\n }\n});\nObject.defineProperty(exports, "breadthFirstSearch", {\n enumerable: true,\n get: function get() {\n return _bfs.default;\n }\n});\nObject.defineProperty(exports, "connectedComponent", {\n enumerable: true,\n get: function get() {\n return _connectedComponent.default;\n }\n});\nObject.defineProperty(exports, "getDegree", {\n enumerable: true,\n get: function get() {\n return _degree.default;\n }\n});\nObject.defineProperty(exports, "getInDegree", {\n enumerable: true,\n get: function get() {\n return _degree.getInDegree;\n }\n});\nObject.defineProperty(exports, "getOutDegree", {\n enumerable: true,\n get: function get() {\n return _degree.getOutDegree;\n }\n});\nObject.defineProperty(exports, "detectCycle", {\n enumerable: true,\n get: function get() {\n return _detectCycle.default;\n }\n});\nObject.defineProperty(exports, "depthFirstSearch", {\n enumerable: true,\n get: function get() {\n return _dfs.default;\n }\n});\nObject.defineProperty(exports, "dijkstra", {\n enumerable: true,\n get: function get() {\n return _dijkstra.default;\n }\n});\nObject.defineProperty(exports, "findAllPath", {\n enumerable: true,\n get: function get() {\n return _findPath.findAllPath;\n }\n});\nObject.defineProperty(exports, "findShortestPath", {\n enumerable: true,\n get: function get() {\n return _findPath.findShortestPath;\n }\n});\nObject.defineProperty(exports, "floydWarshall", {\n enumerable: true,\n get: function get() {\n return _floydWarshall.default;\n }\n});\nObject.defineProperty(exports, "labelPropagation", {\n enumerable: true,\n get: function get() {\n return _labelPropagation.default;\n }\n});\nObject.defineProperty(exports, "louvain", {\n enumerable: true,\n get: function get() {\n return _louvain.default;\n }\n});\nObject.defineProperty(exports, "minimumSpanningTree", {\n enumerable: true,\n get: function get() {\n return _mts.default;\n }\n});\nObject.defineProperty(exports, "pageRank", {\n enumerable: true,\n get: function get() {\n return _pageRank.default;\n }\n});\nObject.defineProperty(exports, "GADDI", {\n enumerable: true,\n get: function get() {\n return _gaddi.default;\n }\n});\nObject.defineProperty(exports, "getNeighbors", {\n enumerable: true,\n get: function get() {\n return _util.getNeighbors;\n }\n});\n\nvar _adjacentMatrix = _interopRequireDefault(__webpack_require__(98));\n\nvar _bfs = _interopRequireDefault(__webpack_require__(300));\n\nvar _connectedComponent = _interopRequireDefault(__webpack_require__(180));\n\nvar _degree = _interopRequireWildcard(__webpack_require__(181));\n\nvar _detectCycle = _interopRequireDefault(__webpack_require__(303));\n\nvar _dfs = _interopRequireDefault(__webpack_require__(182));\n\nvar _dijkstra = _interopRequireDefault(__webpack_require__(151));\n\nvar _findPath = __webpack_require__(304);\n\nvar _floydWarshall = _interopRequireDefault(__webpack_require__(183));\n\nvar _labelPropagation = _interopRequireDefault(__webpack_require__(305));\n\nvar _louvain = _interopRequireDefault(__webpack_require__(306));\n\nvar _mts = _interopRequireDefault(__webpack_require__(307));\n\nvar _pageRank = _interopRequireDefault(__webpack_require__(310));\n\nvar _gaddi = _interopRequireDefault(__webpack_require__(311));\n\nvar _util = __webpack_require__(45);\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvYWxnb3JpdGhtL2xpYi93b3JrZXJzL2FsZ29yaXRobS5qcz8yNjRlIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFhOztBQUViLHVCQUF1QiwyQkFBMkIsMkVBQTJFLGtDQUFrQyxtQkFBbUIsR0FBRyxFQUFFLE9BQU8sa0NBQWtDLDhIQUE4SCxHQUFHLEVBQUUscUJBQXFCOztBQUV4WDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRCw2Q0FBNkMsbUJBQU8sQ0FBQyxFQUFvQjs7QUFFekUsa0NBQWtDLG1CQUFPLENBQUMsR0FBUTs7QUFFbEQsaURBQWlELG1CQUFPLENBQUMsR0FBd0I7O0FBRWpGLHNDQUFzQyxtQkFBTyxDQUFDLEdBQVc7O0FBRXpELDBDQUEwQyxtQkFBTyxDQUFDLEdBQWlCOztBQUVuRSxrQ0FBa0MsbUJBQU8sQ0FBQyxHQUFROztBQUVsRCx1Q0FBdUMsbUJBQU8sQ0FBQyxHQUFhOztBQUU1RCxnQkFBZ0IsbUJBQU8sQ0FBQyxHQUFjOztBQUV0Qyw0Q0FBNEMsbUJBQU8sQ0FBQyxHQUFrQjs7QUFFdEUsK0NBQStDLG1CQUFPLENBQUMsR0FBc0I7O0FBRTdFLHNDQUFzQyxtQkFBTyxDQUFDLEdBQVk7O0FBRTFELGtDQUFrQyxtQkFBTyxDQUFDLEdBQVE7O0FBRWxELHVDQUF1QyxtQkFBTyxDQUFDLEdBQWE7O0FBRTVELG9DQUFvQyxtQkFBTyxDQUFDLEdBQVU7O0FBRXRELFlBQVksbUJBQU8sQ0FBQyxFQUFTOztBQUU3QixxQ0FBcUMsZ0RBQWdELDJCQUEyQixpRUFBaUUsY0FBYyxHQUFHLGNBQWM7O0FBRWhOLHVDQUF1Qyw2QkFBNkIsWUFBWSxFQUFFLDhFQUE4RSxTQUFTLGdCQUFnQixFQUFFLHdDQUF3QywrQkFBK0IsdUJBQXVCLEVBQUUsaUJBQWlCLHNGQUFzRix1QkFBdUIsc0RBQXNELHFGQUFxRixzQ0FBc0MsMENBQTBDLEVBQUUsT0FBTyx3QkFBd0IsRUFBRSxFQUFFLEVBQUUsc0JBQXNCLGFBQWEsd0JBQXdCLEVBQUUsZUFBZTs7QUFFdnVCLHNDQUFzQyx1Q0FBdUMsZ0JBQWdCIiwiZmlsZSI6IjI5OS5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5mdW5jdGlvbiBfdHlwZW9mKG9iaikgeyBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIikgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH07IH0gZWxzZSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTsgfSByZXR1cm4gX3R5cGVvZihvYmopOyB9XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJnZXRBZGpNYXRyaXhcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX2FkamFjZW50TWF0cml4LmRlZmF1bHQ7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiYnJlYWR0aEZpcnN0U2VhcmNoXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9iZnMuZGVmYXVsdDtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJjb25uZWN0ZWRDb21wb25lbnRcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX2Nvbm5lY3RlZENvbXBvbmVudC5kZWZhdWx0O1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImdldERlZ3JlZVwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfZGVncmVlLmRlZmF1bHQ7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiZ2V0SW5EZWdyZWVcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX2RlZ3JlZS5nZXRJbkRlZ3JlZTtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJnZXRPdXREZWdyZWVcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX2RlZ3JlZS5nZXRPdXREZWdyZWU7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiZGV0ZWN0Q3ljbGVcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX2RldGVjdEN5Y2xlLmRlZmF1bHQ7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiZGVwdGhGaXJzdFNlYXJjaFwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfZGZzLmRlZmF1bHQ7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiZGlqa3N0cmFcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX2RpamtzdHJhLmRlZmF1bHQ7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiZmluZEFsbFBhdGhcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX2ZpbmRQYXRoLmZpbmRBbGxQYXRoO1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImZpbmRTaG9ydGVzdFBhdGhcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX2ZpbmRQYXRoLmZpbmRTaG9ydGVzdFBhdGg7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiZmxveWRXYXJzaGFsbFwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfZmxveWRXYXJzaGFsbC5kZWZhdWx0O1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImxhYmVsUHJvcGFnYXRpb25cIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX2xhYmVsUHJvcGFnYXRpb24uZGVmYXVsdDtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJsb3V2YWluXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9sb3V2YWluLmRlZmF1bHQ7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwibWluaW11bVNwYW5uaW5nVHJlZVwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfbXRzLmRlZmF1bHQ7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwicGFnZVJhbmtcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX3BhZ2VSYW5rLmRlZmF1bHQ7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiR0FERElcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX2dhZGRpLmRlZmF1bHQ7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiZ2V0TmVpZ2hib3JzXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF91dGlsLmdldE5laWdoYm9ycztcbiAgfVxufSk7XG5cbnZhciBfYWRqYWNlbnRNYXRyaXggPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9hZGphY2VudC1tYXRyaXhcIikpO1xuXG52YXIgX2JmcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL2Jmc1wiKSk7XG5cbnZhciBfY29ubmVjdGVkQ29tcG9uZW50ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vY29ubmVjdGVkLWNvbXBvbmVudFwiKSk7XG5cbnZhciBfZGVncmVlID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcIi4uL2RlZ3JlZVwiKSk7XG5cbnZhciBfZGV0ZWN0Q3ljbGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9kZXRlY3QtY3ljbGVcIikpO1xuXG52YXIgX2RmcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL2Rmc1wiKSk7XG5cbnZhciBfZGlqa3N0cmEgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9kaWprc3RyYVwiKSk7XG5cbnZhciBfZmluZFBhdGggPSByZXF1aXJlKFwiLi4vZmluZC1wYXRoXCIpO1xuXG52YXIgX2Zsb3lkV2Fyc2hhbGwgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9mbG95ZFdhcnNoYWxsXCIpKTtcblxudmFyIF9sYWJlbFByb3BhZ2F0aW9uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vbGFiZWwtcHJvcGFnYXRpb25cIikpO1xuXG52YXIgX2xvdXZhaW4gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9sb3V2YWluXCIpKTtcblxudmFyIF9tdHMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9tdHNcIikpO1xuXG52YXIgX3BhZ2VSYW5rID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vcGFnZVJhbmtcIikpO1xuXG52YXIgX2dhZGRpID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vZ2FkZGlcIikpO1xuXG52YXIgX3V0aWwgPSByZXF1aXJlKFwiLi4vdXRpbFwiKTtcblxuZnVuY3Rpb24gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKCkgeyBpZiAodHlwZW9mIFdlYWtNYXAgIT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIG51bGw7IHZhciBjYWNoZSA9IG5ldyBXZWFrTWFwKCk7IF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSA9IGZ1bmN0aW9uIF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSgpIHsgcmV0dXJuIGNhY2hlOyB9OyByZXR1cm4gY2FjaGU7IH1cblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQob2JqKSB7IGlmIChvYmogJiYgb2JqLl9fZXNNb2R1bGUpIHsgcmV0dXJuIG9iajsgfSBpZiAob2JqID09PSBudWxsIHx8IF90eXBlb2Yob2JqKSAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2Ygb2JqICE9PSBcImZ1bmN0aW9uXCIpIHsgcmV0dXJuIHsgZGVmYXVsdDogb2JqIH07IH0gdmFyIGNhY2hlID0gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKCk7IGlmIChjYWNoZSAmJiBjYWNoZS5oYXMob2JqKSkgeyByZXR1cm4gY2FjaGUuZ2V0KG9iaik7IH0gdmFyIG5ld09iaiA9IHt9OyB2YXIgaGFzUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmRlZmluZVByb3BlcnR5ICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7IGZvciAodmFyIGtleSBpbiBvYmopIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIHsgdmFyIGRlc2MgPSBoYXNQcm9wZXJ0eURlc2NyaXB0b3IgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwga2V5KSA6IG51bGw7IGlmIChkZXNjICYmIChkZXNjLmdldCB8fCBkZXNjLnNldCkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG5ld09iaiwga2V5LCBkZXNjKTsgfSBlbHNlIHsgbmV3T2JqW2tleV0gPSBvYmpba2V5XTsgfSB9IH0gbmV3T2JqLmRlZmF1bHQgPSBvYmo7IGlmIChjYWNoZSkgeyBjYWNoZS5zZXQob2JqLCBuZXdPYmopOyB9IHJldHVybiBuZXdPYmo7IH1cblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH0iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///299\n')},function(module,exports,__webpack_require__){"use strict";eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _queue = _interopRequireDefault(__webpack_require__(301));\n\nvar _util = __webpack_require__(45);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n *\n * @param callbacks\n * allowTraversal: 确定 BFS 是否从顶点沿着边遍历到其邻居,默认情况下,同一个节点只能遍历一次\n * enterNode: 当 BFS 访问某个节点时调用\n * leaveNode: 当 BFS 访问访问结束某个节点时调用\n */\nfunction initCallbacks(callbacks) {\n if (callbacks === void 0) {\n callbacks = {};\n }\n\n var initiatedCallback = callbacks;\n\n var stubCallback = function stubCallback() {};\n\n var allowTraversalCallback = function () {\n var seen = {};\n return function (_a) {\n var next = _a.next;\n var id = next;\n\n if (!seen[id]) {\n seen[id] = true;\n return true;\n }\n\n return false;\n };\n }();\n\n initiatedCallback.allowTraversal = callbacks.allowTraversal || allowTraversalCallback;\n initiatedCallback.enter = callbacks.enter || stubCallback;\n initiatedCallback.leave = callbacks.leave || stubCallback;\n return initiatedCallback;\n}\n/**\n * 广度优先遍历图\n * @param graph Graph 图实例\n * @param startNode 开始遍历的节点\n * @param originalCallbacks 回调\n */\n\n\nvar breadthFirstSearch = function breadthFirstSearch(graphData, startNodeId, originalCallbacks, directed) {\n if (directed === void 0) {\n directed = true;\n }\n\n var callbacks = initCallbacks(originalCallbacks);\n var nodeQueue = new _queue.default();\n var _a = graphData.edges,\n edges = _a === void 0 ? [] : _a; // 初始化队列元素\n\n nodeQueue.enqueue(startNodeId);\n var previousNode = '';\n\n var _loop_1 = function _loop_1() {\n var currentNode = nodeQueue.dequeue();\n callbacks.enter({\n current: currentNode,\n previous: previousNode\n }); // 将所有邻居添加到队列中以便遍历\n\n (0, _util.getNeighbors)(currentNode, edges, directed ? 'target' : undefined).forEach(function (nextNode) {\n if (callbacks.allowTraversal({\n previous: previousNode,\n current: currentNode,\n next: nextNode\n })) {\n nodeQueue.enqueue(nextNode);\n }\n });\n callbacks.leave({\n current: currentNode,\n previous: previousNode\n }); // 下一次循环之前存储当前顶点\n\n previousNode = currentNode;\n }; // 遍历队列中的所有顶点\n\n\n while (!nodeQueue.isEmpty()) {\n _loop_1();\n }\n};\n\nvar _default = breadthFirstSearch;\nexports.default = _default;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvYWxnb3JpdGhtL2xpYi9iZnMuanM/Mzg3MiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBYTs7QUFFYjtBQUNBO0FBQ0EsQ0FBQztBQUNEOztBQUVBLG9DQUFvQyxtQkFBTyxDQUFDLEdBQWlCOztBQUU3RCxZQUFZLG1CQUFPLENBQUMsRUFBUTs7QUFFNUIsc0NBQXNDLHVDQUF1QyxnQkFBZ0I7O0FBRTdGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0M7O0FBRXRDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUssRUFBRTs7QUFFUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSyxFQUFFOztBQUVQO0FBQ0EsSUFBSTs7O0FBR0o7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSIsImZpbGUiOiIzMDAuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIF9xdWV1ZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vc3RydWN0cy9xdWV1ZVwiKSk7XG5cbnZhciBfdXRpbCA9IHJlcXVpcmUoXCIuL3V0aWxcIik7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbi8qKlxuICpcbiAqIEBwYXJhbSBjYWxsYmFja3NcbiAqIGFsbG93VHJhdmVyc2FsOiDnoa7lrpogQkZTIOaYr+WQpuS7jumhtueCueayv+edgOi+uemBjeWOhuWIsOWFtumCu+Wxhe+8jOm7mOiupOaDheWGteS4i++8jOWQjOS4gOS4quiKgueCueWPquiDvemBjeWOhuS4gOasoVxuICogZW50ZXJOb2RlOiDlvZMgQkZTIOiuv+mXruafkOS4quiKgueCueaXtuiwg+eUqFxuICogbGVhdmVOb2RlOiDlvZMgQkZTIOiuv+mXruiuv+mXrue7k+adn+afkOS4quiKgueCueaXtuiwg+eUqFxuICovXG5mdW5jdGlvbiBpbml0Q2FsbGJhY2tzKGNhbGxiYWNrcykge1xuICBpZiAoY2FsbGJhY2tzID09PSB2b2lkIDApIHtcbiAgICBjYWxsYmFja3MgPSB7fTtcbiAgfVxuXG4gIHZhciBpbml0aWF0ZWRDYWxsYmFjayA9IGNhbGxiYWNrcztcblxuICB2YXIgc3R1YkNhbGxiYWNrID0gZnVuY3Rpb24gc3R1YkNhbGxiYWNrKCkge307XG5cbiAgdmFyIGFsbG93VHJhdmVyc2FsQ2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNlZW4gPSB7fTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKF9hKSB7XG4gICAgICB2YXIgbmV4dCA9IF9hLm5leHQ7XG4gICAgICB2YXIgaWQgPSBuZXh0O1xuXG4gICAgICBpZiAoIXNlZW5baWRdKSB7XG4gICAgICAgIHNlZW5baWRdID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICB9KCk7XG5cbiAgaW5pdGlhdGVkQ2FsbGJhY2suYWxsb3dUcmF2ZXJzYWwgPSBjYWxsYmFja3MuYWxsb3dUcmF2ZXJzYWwgfHwgYWxsb3dUcmF2ZXJzYWxDYWxsYmFjaztcbiAgaW5pdGlhdGVkQ2FsbGJhY2suZW50ZXIgPSBjYWxsYmFja3MuZW50ZXIgfHwgc3R1YkNhbGxiYWNrO1xuICBpbml0aWF0ZWRDYWxsYmFjay5sZWF2ZSA9IGNhbGxiYWNrcy5sZWF2ZSB8fCBzdHViQ2FsbGJhY2s7XG4gIHJldHVybiBpbml0aWF0ZWRDYWxsYmFjaztcbn1cbi8qKlxuICog5bm/5bqm5LyY5YWI6YGN5Y6G5Zu+XG4gKiBAcGFyYW0gZ3JhcGggR3JhcGgg5Zu+5a6e5L6LXG4gKiBAcGFyYW0gc3RhcnROb2RlIOW8gOWni+mBjeWOhueahOiKgueCuVxuICogQHBhcmFtIG9yaWdpbmFsQ2FsbGJhY2tzIOWbnuiwg1xuICovXG5cblxudmFyIGJyZWFkdGhGaXJzdFNlYXJjaCA9IGZ1bmN0aW9uIGJyZWFkdGhGaXJzdFNlYXJjaChncmFwaERhdGEsIHN0YXJ0Tm9kZUlkLCBvcmlnaW5hbENhbGxiYWNrcywgZGlyZWN0ZWQpIHtcbiAgaWYgKGRpcmVjdGVkID09PSB2b2lkIDApIHtcbiAgICBkaXJlY3RlZCA9IHRydWU7XG4gIH1cblxuICB2YXIgY2FsbGJhY2tzID0gaW5pdENhbGxiYWNrcyhvcmlnaW5hbENhbGxiYWNrcyk7XG4gIHZhciBub2RlUXVldWUgPSBuZXcgX3F1ZXVlLmRlZmF1bHQoKTtcbiAgdmFyIF9hID0gZ3JhcGhEYXRhLmVkZ2VzLFxuICAgICAgZWRnZXMgPSBfYSA9PT0gdm9pZCAwID8gW10gOiBfYTsgLy8g5Yid5aeL5YyW6Zif5YiX5YWD57SgXG5cbiAgbm9kZVF1ZXVlLmVucXVldWUoc3RhcnROb2RlSWQpO1xuICB2YXIgcHJldmlvdXNOb2RlID0gJyc7XG5cbiAgdmFyIF9sb29wXzEgPSBmdW5jdGlvbiBfbG9vcF8xKCkge1xuICAgIHZhciBjdXJyZW50Tm9kZSA9IG5vZGVRdWV1ZS5kZXF1ZXVlKCk7XG4gICAgY2FsbGJhY2tzLmVudGVyKHtcbiAgICAgIGN1cnJlbnQ6IGN1cnJlbnROb2RlLFxuICAgICAgcHJldmlvdXM6IHByZXZpb3VzTm9kZVxuICAgIH0pOyAvLyDlsIbmiYDmnInpgrvlsYXmt7vliqDliLDpmJ/liJfkuK3ku6Xkvr/pgY3ljoZcblxuICAgICgwLCBfdXRpbC5nZXROZWlnaGJvcnMpKGN1cnJlbnROb2RlLCBlZGdlcywgZGlyZWN0ZWQgPyAndGFyZ2V0JyA6IHVuZGVmaW5lZCkuZm9yRWFjaChmdW5jdGlvbiAobmV4dE5vZGUpIHtcbiAgICAgIGlmIChjYWxsYmFja3MuYWxsb3dUcmF2ZXJzYWwoe1xuICAgICAgICBwcmV2aW91czogcHJldmlvdXNOb2RlLFxuICAgICAgICBjdXJyZW50OiBjdXJyZW50Tm9kZSxcbiAgICAgICAgbmV4dDogbmV4dE5vZGVcbiAgICAgIH0pKSB7XG4gICAgICAgIG5vZGVRdWV1ZS5lbnF1ZXVlKG5leHROb2RlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBjYWxsYmFja3MubGVhdmUoe1xuICAgICAgY3VycmVudDogY3VycmVudE5vZGUsXG4gICAgICBwcmV2aW91czogcHJldmlvdXNOb2RlXG4gICAgfSk7IC8vIOS4i+S4gOasoeW+queOr+S5i+WJjeWtmOWCqOW9k+WJjemhtueCuVxuXG4gICAgcHJldmlvdXNOb2RlID0gY3VycmVudE5vZGU7XG4gIH07IC8vIOmBjeWOhumYn+WIl+S4reeahOaJgOaciemhtueCuVxuXG5cbiAgd2hpbGUgKCFub2RlUXVldWUuaXNFbXB0eSgpKSB7XG4gICAgX2xvb3BfMSgpO1xuICB9XG59O1xuXG52YXIgX2RlZmF1bHQgPSBicmVhZHRoRmlyc3RTZWFyY2g7XG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///300\n")},function(module,exports,__webpack_require__){"use strict";eval('\n\nObject.defineProperty(exports, "__esModule", {\n value: true\n});\nexports.default = void 0;\n\nvar _linkedList = _interopRequireDefault(__webpack_require__(302));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar Queue =\n/** @class */\nfunction () {\n function Queue() {\n this.linkedList = new _linkedList.default();\n }\n /**\n * 队列是否为空\n */\n\n\n Queue.prototype.isEmpty = function () {\n return !this.linkedList.head;\n };\n /**\n * 读取队列头部的元素, 不删除队列中的元素\n */\n\n\n Queue.prototype.peek = function () {\n if (!this.linkedList.head) {\n return null;\n }\n\n return this.linkedList.head.value;\n };\n /**\n * 在队列的尾部新增一个元素\n * @param value\n */\n\n\n Queue.prototype.enqueue = function (value) {\n this.linkedList.append(value);\n };\n /**\n * 删除队列中的头部元素,如果队列为空,则返回 null\n */\n\n\n Queue.prototype.dequeue = function () {\n var removeHead = this.linkedList.deleteHead();\n return removeHead ? removeHead.value : null;\n };\n\n Queue.prototype.toString = function (callback) {\n return this.linkedList.toString(callback);\n };\n\n return Queue;\n}();\n\nvar _default = Queue;\nexports.default = _default;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvYWxnb3JpdGhtL2xpYi9zdHJ1Y3RzL3F1ZXVlLmpzPzUyYjMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWI7QUFDQTtBQUNBLENBQUM7QUFDRDs7QUFFQSx5Q0FBeUMsbUJBQU8sQ0FBQyxHQUFlOztBQUVoRSxzQ0FBc0MsdUNBQXVDLGdCQUFnQjs7QUFFN0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDOztBQUVEO0FBQ0EiLCJmaWxlIjoiMzAxLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5cbnZhciBfbGlua2VkTGlzdCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vbGlua2VkLWxpc3RcIikpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG52YXIgUXVldWUgPVxuLyoqIEBjbGFzcyAqL1xuZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBRdWV1ZSgpIHtcbiAgICB0aGlzLmxpbmtlZExpc3QgPSBuZXcgX2xpbmtlZExpc3QuZGVmYXVsdCgpO1xuICB9XG4gIC8qKlxuICAgKiDpmJ/liJfmmK/lkKbkuLrnqbpcbiAgICovXG5cblxuICBRdWV1ZS5wcm90b3R5cGUuaXNFbXB0eSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gIXRoaXMubGlua2VkTGlzdC5oZWFkO1xuICB9O1xuICAvKipcbiAgICog6K+75Y+W6Zif5YiX5aS06YOo55qE5YWD57Sg77yMIOS4jeWIoOmZpOmYn+WIl+S4reeahOWFg+e0oFxuICAgKi9cblxuXG4gIFF1ZXVlLnByb3RvdHlwZS5wZWVrID0gZnVuY3Rpb24gKCkge1xuICAgIGlmICghdGhpcy5saW5rZWRMaXN0LmhlYWQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmxpbmtlZExpc3QuaGVhZC52YWx1ZTtcbiAgfTtcbiAgLyoqXG4gICAqIOWcqOmYn+WIl+eahOWwvumDqOaWsOWinuS4gOS4quWFg+e0oFxuICAgKiBAcGFyYW0gdmFsdWVcbiAgICovXG5cblxuICBRdWV1ZS5wcm90b3R5cGUuZW5xdWV1ZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIHRoaXMubGlua2VkTGlzdC5hcHBlbmQodmFsdWUpO1xuICB9O1xuICAvKipcbiAgICog5Yig6Zmk6Zif5YiX5Lit55qE5aS06YOo5YWD57Sg77yM5aaC5p6c6Zif5YiX5Li656m677yM5YiZ6L+U5ZueIG51bGxcbiAgICovXG5cblxuICBRdWV1ZS5wcm90b3R5cGUuZGVxdWV1ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcmVtb3ZlSGVhZCA9IHRoaXMubGlua2VkTGlzdC5kZWxldGVIZWFkKCk7XG4gICAgcmV0dXJuIHJlbW92ZUhlYWQgPyByZW1vdmVIZWFkLnZhbHVlIDogbnVsbDtcbiAgfTtcblxuICBRdWV1ZS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICByZXR1cm4gdGhpcy5saW5rZWRMaXN0LnRvU3RyaW5nKGNhbGxiYWNrKTtcbiAgfTtcblxuICByZXR1cm4gUXVldWU7XG59KCk7XG5cbnZhciBfZGVmYXVsdCA9IFF1ZXVlO1xuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///301\n')},function(module,exports,__webpack_require__){"use strict";eval('\n\nObject.defineProperty(exports, "__esModule", {\n value: true\n});\nexports.default = exports.LinkedListNode = void 0;\n\nvar defaultComparator = function defaultComparator(a, b) {\n if (a === b) {\n return true;\n }\n\n return false;\n};\n/**\n * 链表中单个元素节点\n */\n\n\nvar LinkedListNode =\n/** @class */\nfunction () {\n function LinkedListNode(value, next) {\n if (next === void 0) {\n next = null;\n }\n\n this.value = value;\n this.next = next;\n }\n\n LinkedListNode.prototype.toString = function (callback) {\n return callback ? callback(this.value) : "" + this.value;\n };\n\n return LinkedListNode;\n}();\n\nexports.LinkedListNode = LinkedListNode;\n\nvar LinkedList =\n/** @class */\nfunction () {\n function LinkedList(comparator) {\n if (comparator === void 0) {\n comparator = defaultComparator;\n }\n\n this.head = null;\n this.tail = null;\n this.compare = comparator;\n }\n /**\n * 将指定元素添加到链表头部\n * @param value\n */\n\n\n LinkedList.prototype.prepend = function (value) {\n // 在头部添加一个节点\n var newNode = new LinkedListNode(value, this.head);\n this.head = newNode;\n\n if (!this.tail) {\n this.tail = newNode;\n }\n\n return this;\n };\n /**\n * 将指定元素添加到链表中\n * @param value\n */\n\n\n LinkedList.prototype.append = function (value) {\n var newNode = new LinkedListNode(value); // 如果不存在头节点,则将创建的新节点作为头节点\n\n if (!this.head) {\n this.head = newNode;\n this.tail = newNode;\n return this;\n } // 将新节点附加到链表末尾\n\n\n this.tail.next = newNode;\n this.tail = newNode;\n return this;\n };\n /**\n * 删除指定元素\n * @param value 要删除的元素\n */\n\n\n LinkedList.prototype.delete = function (value) {\n if (!this.head) {\n return null;\n }\n\n var deleteNode = null; // 如果删除的是头部元素,则将next作为头元素\n\n while (this.head && this.compare(this.head.value, value)) {\n deleteNode = this.head;\n this.head = this.head.next;\n }\n\n var currentNode = this.head;\n\n if (currentNode !== null) {\n // 如果删除了节点以后,将next节点前移\n while (currentNode.next) {\n if (this.compare(currentNode.next.value, value)) {\n deleteNode = currentNode.next;\n currentNode.next = currentNode.next.next;\n } else {\n currentNode = currentNode.next;\n }\n }\n } // 检查尾部节点是否被删除\n\n\n if (this.compare(this.tail.value, value)) {\n this.tail = currentNode;\n }\n\n return deleteNode;\n };\n /**\n * 查找指定的元素\n * @param param0\n */\n\n\n LinkedList.prototype.find = function (_a) {\n var _b = _a.value,\n value = _b === void 0 ? undefined : _b,\n _c = _a.callback,\n callback = _c === void 0 ? undefined : _c;\n\n if (!this.head) {\n return null;\n }\n\n var currentNode = this.head;\n\n while (currentNode) {\n // 如果指定了 callback,则按指定的 callback 查找\n if (callback && callback(currentNode.value)) {\n return currentNode;\n } // 如果指定了 value,则按 value 查找\n\n\n if (value !== undefined && this.compare(currentNode.value, value)) {\n return currentNode;\n }\n\n currentNode = currentNode.next;\n }\n\n return null;\n };\n /**\n * 删除尾部节点\n */\n\n\n LinkedList.prototype.deleteTail = function () {\n var deletedTail = this.tail;\n\n if (this.head === this.tail) {\n // 链表中只有一个元素\n this.head = null;\n this.tail = null;\n return deletedTail;\n }\n\n var currentNode = this.head;\n\n while (currentNode.next) {\n if (!currentNode.next.next) {\n currentNode.next = null;\n } else {\n currentNode = currentNode.next;\n }\n }\n\n this.tail = currentNode;\n return deletedTail;\n };\n /**\n * 删除头部节点\n */\n\n\n LinkedList.prototype.deleteHead = function () {\n if (!this.head) {\n return null;\n }\n\n var deletedHead = this.head;\n\n if (this.head.next) {\n this.head = this.head.next;\n } else {\n this.head = null;\n this.tail = null;\n }\n\n return deletedHead;\n };\n /**\n * 将一组元素转成链表中的节点\n * @param values 链表中的元素\n */\n\n\n LinkedList.prototype.fromArray = function (values) {\n var _this = this;\n\n values.forEach(function (value) {\n return _this.append(value);\n });\n return this;\n };\n /**\n * 将链表中的节点转成数组元素\n */\n\n\n LinkedList.prototype.toArray = function () {\n var nodes = [];\n var currentNode = this.head;\n\n while (currentNode) {\n nodes.push(currentNode);\n currentNode = currentNode.next;\n }\n\n return nodes;\n };\n /**\n * 反转链表中的元素节点\n */\n\n\n LinkedList.prototype.reverse = function () {\n var currentNode = this.head;\n var prevNode = null;\n var nextNode = null;\n\n while (currentNode) {\n // 存储下一个元素节点\n nextNode = currentNode.next; // 更改当前节点的下一个节点,以便将它连接到上一个节点上\n\n currentNode.next = prevNode; // 将 prevNode 和 currentNode 向前移动一步\n\n prevNode = currentNode;\n currentNode = nextNode;\n }\n\n this.tail = this.head;\n this.head = prevNode;\n };\n\n LinkedList.prototype.toString = function (callback) {\n if (callback === void 0) {\n callback = undefined;\n }\n\n return this.toArray().map(function (node) {\n return node.toString(callback);\n }).toString();\n };\n\n return LinkedList;\n}();\n\nvar _default = LinkedList;\nexports.default = _default;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvYWxnb3JpdGhtL2xpYi9zdHJ1Y3RzL2xpbmtlZC1saXN0LmpzPzVjYjAiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWI7QUFDQTtBQUNBLENBQUM7QUFDRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQzs7QUFFRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBLDRDQUE0Qzs7QUFFNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOzs7QUFHTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSwwQkFBMEI7O0FBRTFCO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxLQUFLOzs7QUFHTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87OztBQUdQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGtDQUFrQzs7QUFFbEMsa0NBQWtDOztBQUVsQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQSxDQUFDOztBQUVEO0FBQ0EiLCJmaWxlIjoiMzAyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBleHBvcnRzLkxpbmtlZExpc3ROb2RlID0gdm9pZCAwO1xuXG52YXIgZGVmYXVsdENvbXBhcmF0b3IgPSBmdW5jdGlvbiBkZWZhdWx0Q29tcGFyYXRvcihhLCBiKSB7XG4gIGlmIChhID09PSBiKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59O1xuLyoqXG4gKiDpk77ooajkuK3ljZXkuKrlhYPntKDoioLngrlcbiAqL1xuXG5cbnZhciBMaW5rZWRMaXN0Tm9kZSA9XG4vKiogQGNsYXNzICovXG5mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIExpbmtlZExpc3ROb2RlKHZhbHVlLCBuZXh0KSB7XG4gICAgaWYgKG5leHQgPT09IHZvaWQgMCkge1xuICAgICAgbmV4dCA9IG51bGw7XG4gICAgfVxuXG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMubmV4dCA9IG5leHQ7XG4gIH1cblxuICBMaW5rZWRMaXN0Tm9kZS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICByZXR1cm4gY2FsbGJhY2sgPyBjYWxsYmFjayh0aGlzLnZhbHVlKSA6IFwiXCIgKyB0aGlzLnZhbHVlO1xuICB9O1xuXG4gIHJldHVybiBMaW5rZWRMaXN0Tm9kZTtcbn0oKTtcblxuZXhwb3J0cy5MaW5rZWRMaXN0Tm9kZSA9IExpbmtlZExpc3ROb2RlO1xuXG52YXIgTGlua2VkTGlzdCA9XG4vKiogQGNsYXNzICovXG5mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIExpbmtlZExpc3QoY29tcGFyYXRvcikge1xuICAgIGlmIChjb21wYXJhdG9yID09PSB2b2lkIDApIHtcbiAgICAgIGNvbXBhcmF0b3IgPSBkZWZhdWx0Q29tcGFyYXRvcjtcbiAgICB9XG5cbiAgICB0aGlzLmhlYWQgPSBudWxsO1xuICAgIHRoaXMudGFpbCA9IG51bGw7XG4gICAgdGhpcy5jb21wYXJlID0gY29tcGFyYXRvcjtcbiAgfVxuICAvKipcbiAgICog5bCG5oyH5a6a5YWD57Sg5re75Yqg5Yiw6ZO+6KGo5aS06YOoXG4gICAqIEBwYXJhbSB2YWx1ZVxuICAgKi9cblxuXG4gIExpbmtlZExpc3QucHJvdG90eXBlLnByZXBlbmQgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAvLyDlnKjlpLTpg6jmt7vliqDkuIDkuKroioLngrlcbiAgICB2YXIgbmV3Tm9kZSA9IG5ldyBMaW5rZWRMaXN0Tm9kZSh2YWx1ZSwgdGhpcy5oZWFkKTtcbiAgICB0aGlzLmhlYWQgPSBuZXdOb2RlO1xuXG4gICAgaWYgKCF0aGlzLnRhaWwpIHtcbiAgICAgIHRoaXMudGFpbCA9IG5ld05vZGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG4gIC8qKlxuICAgKiDlsIbmjIflrprlhYPntKDmt7vliqDliLDpk77ooajkuK1cbiAgICogQHBhcmFtIHZhbHVlXG4gICAqL1xuXG5cbiAgTGlua2VkTGlzdC5wcm90b3R5cGUuYXBwZW5kID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgdmFyIG5ld05vZGUgPSBuZXcgTGlua2VkTGlzdE5vZGUodmFsdWUpOyAvLyDlpoLmnpzkuI3lrZjlnKjlpLToioLngrnvvIzliJnlsIbliJvlu7rnmoTmlrDoioLngrnkvZzkuLrlpLToioLngrlcblxuICAgIGlmICghdGhpcy5oZWFkKSB7XG4gICAgICB0aGlzLmhlYWQgPSBuZXdOb2RlO1xuICAgICAgdGhpcy50YWlsID0gbmV3Tm9kZTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0gLy8g5bCG5paw6IqC54K56ZmE5Yqg5Yiw6ZO+6KGo5pyr5bC+XG5cblxuICAgIHRoaXMudGFpbC5uZXh0ID0gbmV3Tm9kZTtcbiAgICB0aGlzLnRhaWwgPSBuZXdOb2RlO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuICAvKipcbiAgICog5Yig6Zmk5oyH5a6a5YWD57SgXG4gICAqIEBwYXJhbSB2YWx1ZSDopoHliKDpmaTnmoTlhYPntKBcbiAgICovXG5cblxuICBMaW5rZWRMaXN0LnByb3RvdHlwZS5kZWxldGUgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICBpZiAoIXRoaXMuaGVhZCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgdmFyIGRlbGV0ZU5vZGUgPSBudWxsOyAvLyDlpoLmnpzliKDpmaTnmoTmmK/lpLTpg6jlhYPntKDvvIzliJnlsIZuZXh05L2c5Li65aS05YWD57SgXG5cbiAgICB3aGlsZSAodGhpcy5oZWFkICYmIHRoaXMuY29tcGFyZSh0aGlzLmhlYWQudmFsdWUsIHZhbHVlKSkge1xuICAgICAgZGVsZXRlTm9kZSA9IHRoaXMuaGVhZDtcbiAgICAgIHRoaXMuaGVhZCA9IHRoaXMuaGVhZC5uZXh0O1xuICAgIH1cblxuICAgIHZhciBjdXJyZW50Tm9kZSA9IHRoaXMuaGVhZDtcblxuICAgIGlmIChjdXJyZW50Tm9kZSAhPT0gbnVsbCkge1xuICAgICAgLy8g5aaC5p6c5Yig6Zmk5LqG6IqC54K55Lul5ZCO77yM5bCGbmV4dOiKgueCueWJjeenu1xuICAgICAgd2hpbGUgKGN1cnJlbnROb2RlLm5leHQpIHtcbiAgICAgICAgaWYgKHRoaXMuY29tcGFyZShjdXJyZW50Tm9kZS5uZXh0LnZhbHVlLCB2YWx1ZSkpIHtcbiAgICAgICAgICBkZWxldGVOb2RlID0gY3VycmVudE5vZGUubmV4dDtcbiAgICAgICAgICBjdXJyZW50Tm9kZS5uZXh0ID0gY3VycmVudE5vZGUubmV4dC5uZXh0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGN1cnJlbnROb2RlID0gY3VycmVudE5vZGUubmV4dDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gLy8g5qOA5p+l5bC+6YOo6IqC54K55piv5ZCm6KKr5Yig6ZmkXG5cblxuICAgIGlmICh0aGlzLmNvbXBhcmUodGhpcy50YWlsLnZhbHVlLCB2YWx1ZSkpIHtcbiAgICAgIHRoaXMudGFpbCA9IGN1cnJlbnROb2RlO1xuICAgIH1cblxuICAgIHJldHVybiBkZWxldGVOb2RlO1xuICB9O1xuICAvKipcbiAgICog5p+l5om+5oyH5a6a55qE5YWD57SgXG4gICAqIEBwYXJhbSBwYXJhbTBcbiAgICovXG5cblxuICBMaW5rZWRMaXN0LnByb3RvdHlwZS5maW5kID0gZnVuY3Rpb24gKF9hKSB7XG4gICAgdmFyIF9iID0gX2EudmFsdWUsXG4gICAgICAgIHZhbHVlID0gX2IgPT09IHZvaWQgMCA/IHVuZGVmaW5lZCA6IF9iLFxuICAgICAgICBfYyA9IF9hLmNhbGxiYWNrLFxuICAgICAgICBjYWxsYmFjayA9IF9jID09PSB2b2lkIDAgPyB1bmRlZmluZWQgOiBfYztcblxuICAgIGlmICghdGhpcy5oZWFkKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB2YXIgY3VycmVudE5vZGUgPSB0aGlzLmhlYWQ7XG5cbiAgICB3aGlsZSAoY3VycmVudE5vZGUpIHtcbiAgICAgIC8vIOWmguaenOaMh+WumuS6hiBjYWxsYmFja++8jOWImeaMieaMh+WumueahCBjYWxsYmFjayDmn6Xmib5cbiAgICAgIGlmIChjYWxsYmFjayAmJiBjYWxsYmFjayhjdXJyZW50Tm9kZS52YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnROb2RlO1xuICAgICAgfSAvLyDlpoLmnpzmjIflrprkuoYgdmFsdWXvvIzliJnmjIkgdmFsdWUg5p+l5om+XG5cblxuICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdGhpcy5jb21wYXJlKGN1cnJlbnROb2RlLnZhbHVlLCB2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnROb2RlO1xuICAgICAgfVxuXG4gICAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLm5leHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH07XG4gIC8qKlxuICAgKiDliKDpmaTlsL7pg6joioLngrlcbiAgICovXG5cblxuICBMaW5rZWRMaXN0LnByb3RvdHlwZS5kZWxldGVUYWlsID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBkZWxldGVkVGFpbCA9IHRoaXMudGFpbDtcblxuICAgIGlmICh0aGlzLmhlYWQgPT09IHRoaXMudGFpbCkge1xuICAgICAgLy8g6ZO+6KGo5Lit5Y+q5pyJ5LiA5Liq5YWD57SgXG4gICAgICB0aGlzLmhlYWQgPSBudWxsO1xuICAgICAgdGhpcy50YWlsID0gbnVsbDtcbiAgICAgIHJldHVybiBkZWxldGVkVGFpbDtcbiAgICB9XG5cbiAgICB2YXIgY3VycmVudE5vZGUgPSB0aGlzLmhlYWQ7XG5cbiAgICB3aGlsZSAoY3VycmVudE5vZGUubmV4dCkge1xuICAgICAgaWYgKCFjdXJyZW50Tm9kZS5uZXh0Lm5leHQpIHtcbiAgICAgICAgY3VycmVudE5vZGUubmV4dCA9IG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLm5leHQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy50YWlsID0gY3VycmVudE5vZGU7XG4gICAgcmV0dXJuIGRlbGV0ZWRUYWlsO1xuICB9O1xuICAvKipcbiAgICog5Yig6Zmk5aS06YOo6IqC54K5XG4gICAqL1xuXG5cbiAgTGlua2VkTGlzdC5wcm90b3R5cGUuZGVsZXRlSGVhZCA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXRoaXMuaGVhZCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgdmFyIGRlbGV0ZWRIZWFkID0gdGhpcy5oZWFkO1xuXG4gICAgaWYgKHRoaXMuaGVhZC5uZXh0KSB7XG4gICAgICB0aGlzLmhlYWQgPSB0aGlzLmhlYWQubmV4dDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5oZWFkID0gbnVsbDtcbiAgICAgIHRoaXMudGFpbCA9IG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlbGV0ZWRIZWFkO1xuICB9O1xuICAvKipcbiAgICog5bCG5LiA57uE5YWD57Sg6L2s5oiQ6ZO+6KGo5Lit55qE6IqC54K5XG4gICAqIEBwYXJhbSB2YWx1ZXMg6ZO+6KGo5Lit55qE5YWD57SgXG4gICAqL1xuXG5cbiAgTGlua2VkTGlzdC5wcm90b3R5cGUuZnJvbUFycmF5ID0gZnVuY3Rpb24gKHZhbHVlcykge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICB2YWx1ZXMuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIHJldHVybiBfdGhpcy5hcHBlbmQodmFsdWUpO1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuICAvKipcbiAgICog5bCG6ZO+6KGo5Lit55qE6IqC54K56L2s5oiQ5pWw57uE5YWD57SgXG4gICAqL1xuXG5cbiAgTGlua2VkTGlzdC5wcm90b3R5cGUudG9BcnJheSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgbm9kZXMgPSBbXTtcbiAgICB2YXIgY3VycmVudE5vZGUgPSB0aGlzLmhlYWQ7XG5cbiAgICB3aGlsZSAoY3VycmVudE5vZGUpIHtcbiAgICAgIG5vZGVzLnB1c2goY3VycmVudE5vZGUpO1xuICAgICAgY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS5uZXh0O1xuICAgIH1cblxuICAgIHJldHVybiBub2RlcztcbiAgfTtcbiAgLyoqXG4gICAqIOWPjei9rOmTvuihqOS4reeahOWFg+e0oOiKgueCuVxuICAgKi9cblxuXG4gIExpbmtlZExpc3QucHJvdG90eXBlLnJldmVyc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGN1cnJlbnROb2RlID0gdGhpcy5oZWFkO1xuICAgIHZhciBwcmV2Tm9kZSA9IG51bGw7XG4gICAgdmFyIG5leHROb2RlID0gbnVsbDtcblxuICAgIHdoaWxlIChjdXJyZW50Tm9kZSkge1xuICAgICAgLy8g5a2Y5YKo5LiL5LiA5Liq5YWD57Sg6IqC54K5XG4gICAgICBuZXh0Tm9kZSA9IGN1cnJlbnROb2RlLm5leHQ7IC8vIOabtOaUueW9k+WJjeiKgueCueeahOS4i+S4gOS4quiKgueCue+8jOS7peS+v+WwhuWug+i/nuaOpeWIsOS4iuS4gOS4quiKgueCueS4ilxuXG4gICAgICBjdXJyZW50Tm9kZS5uZXh0ID0gcHJldk5vZGU7IC8vIOWwhiBwcmV2Tm9kZSDlkowgY3VycmVudE5vZGUg5ZCR5YmN56e75Yqo5LiA5q2lXG5cbiAgICAgIHByZXZOb2RlID0gY3VycmVudE5vZGU7XG4gICAgICBjdXJyZW50Tm9kZSA9IG5leHROb2RlO1xuICAgIH1cblxuICAgIHRoaXMudGFpbCA9IHRoaXMuaGVhZDtcbiAgICB0aGlzLmhlYWQgPSBwcmV2Tm9kZTtcbiAgfTtcblxuICBMaW5rZWRMaXN0LnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgIGlmIChjYWxsYmFjayA9PT0gdm9pZCAwKSB7XG4gICAgICBjYWxsYmFjayA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy50b0FycmF5KCkubWFwKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICByZXR1cm4gbm9kZS50b1N0cmluZyhjYWxsYmFjayk7XG4gICAgfSkudG9TdHJpbmcoKTtcbiAgfTtcblxuICByZXR1cm4gTGlua2VkTGlzdDtcbn0oKTtcblxudmFyIF9kZWZhdWx0ID0gTGlua2VkTGlzdDtcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///302\n')},function(module,exports,__webpack_require__){"use strict";eval('\n\nfunction _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }\n\nObject.defineProperty(exports, "__esModule", {\n value: true\n});\nexports.default = exports.detectAllCycles = exports.detectAllDirectedCycle = exports.detectAllUndirectedCycle = void 0;\n\nvar _dfs = _interopRequireDefault(__webpack_require__(182));\n\nvar _connectedComponent = _interopRequireWildcard(__webpack_require__(180));\n\nvar _util = __webpack_require__(45);\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar detectDirectedCycle = function detectDirectedCycle(graphData) {\n var cycle = null;\n var _a = graphData.nodes,\n nodes = _a === void 0 ? [] : _a;\n var dfsParentMap = {}; // 所有没有被访问的节点集合\n\n var unvisitedSet = {}; // 正在被访问的节点集合\n\n var visitingSet = {}; // 所有已经被访问过的节点集合\n\n var visitedSet = {}; // 初始化 unvisitedSet\n\n nodes.forEach(function (node) {\n unvisitedSet[node.id] = node;\n });\n var callbacks = {\n enter: function enter(_a) {\n var currentNode = _a.current,\n previousNode = _a.previous;\n\n if (visitingSet[currentNode]) {\n // 如果当前节点正在访问中,则说明检测到环路了\n cycle = {};\n var currentCycleNode = currentNode;\n var previousCycleNode = previousNode;\n\n while (previousCycleNode !== currentNode) {\n cycle[currentCycleNode] = previousCycleNode;\n currentCycleNode = previousCycleNode;\n previousCycleNode = dfsParentMap[previousCycleNode];\n }\n\n cycle[currentCycleNode] = previousCycleNode;\n } else {\n // 如果不存在正在访问集合中,则将其放入正在访问集合,并从未访问集合中删除\n visitingSet[currentNode] = currentNode;\n delete unvisitedSet[currentNode]; // 更新 DSF parents 列表\n\n dfsParentMap[currentNode] = previousNode;\n }\n },\n leave: function leave(_a) {\n var currentNode = _a.current; // 如果所有的节点的子节点都已经访问过了,则从正在访问集合中删除掉,并将其移入到已访问集合中,\n // 同时也意味着当前节点的所有邻居节点都被访问过了\n\n visitedSet[currentNode] = currentNode;\n delete visitingSet[currentNode];\n },\n allowTraversal: function allowTraversal(_a) {\n var nextNode = _a.next; // 如果检测到环路则需要终止所有进一步的遍历,否则会导致无限循环遍历\n\n if (cycle) {\n return false;\n } // 仅允许遍历没有访问的节点,visitedSet 中的都已经访问过了\n\n\n return !visitedSet[nextNode];\n }\n }; // 开始遍历节点\n\n while (Object.keys(unvisitedSet).length) {\n // 从第一个节点开始进行 DFS 遍历\n var firsetUnVisitedKey = Object.keys(unvisitedSet)[0];\n (0, _dfs.default)(graphData, firsetUnVisitedKey, callbacks);\n }\n\n return cycle;\n};\n/**\n * 检测无向图中的所有Base cycles\n * refer: https://www.codeproject.com/Articles/1158232/Enumerating-All-Cycles-in-an-Undirected-Graph\n * @param graph\n * @param nodeIds 节点 ID 的数组\n * @param include 包含或排除指定的节点\n * @return [{[key: string]: INode}] 返回一组base cycles\n */\n\n\nvar detectAllUndirectedCycle = function detectAllUndirectedCycle(graphData, nodeIds, include) {\n var _a, _b;\n\n if (include === void 0) {\n include = true;\n }\n\n var allCycles = [];\n var components = (0, _connectedComponent.default)(graphData, false); // loop through all connected components\n\n for (var _i = 0, components_1 = components; _i < components_1.length; _i++) {\n var component = components_1[_i];\n if (!component.length) continue;\n var root = component[0];\n var rootId = root.id;\n var stack = [root];\n var parent_1 = (_a = {}, _a[rootId] = root, _a);\n var used = (_b = {}, _b[rootId] = new Set(), _b); // walk a spanning tree to find cycles\n\n while (stack.length > 0) {\n var curNode = stack.pop();\n var curNodeId = curNode.id;\n var neighbors = (0, _util.getNeighbors)(curNodeId, graphData.edges);\n\n var _loop_1 = function _loop_1(i) {\n var _c;\n\n var neighborId = neighbors[i];\n var neighbor = graphData.nodes.find(function (node) {\n return node.id === neighborId;\n }); // const neighborId = neighbor.get(\'id\');\n\n if (neighborId === curNodeId) {\n // 自环\n allCycles.push((_c = {}, _c[neighborId] = curNode, _c));\n } else if (!(neighborId in used)) {\n // visit a new node\n parent_1[neighborId] = curNode;\n stack.push(neighbor);\n used[neighborId] = new Set([curNode]);\n } else if (!used[curNodeId].has(neighbor)) {\n // a cycle found\n var cycleValid = true;\n var cyclePath = [neighbor, curNode];\n var p = parent_1[curNodeId];\n\n while (used[neighborId].size && !used[neighborId].has(p)) {\n cyclePath.push(p);\n if (p === parent_1[p.id]) break;else p = parent_1[p.id];\n }\n\n cyclePath.push(p);\n\n if (nodeIds && include) {\n // 如果有指定包含的节点\n cycleValid = false;\n\n if (cyclePath.findIndex(function (node) {\n return nodeIds.indexOf(node.id) > -1;\n }) > -1) {\n cycleValid = true;\n }\n } else if (nodeIds && !include) {\n // 如果有指定不包含的节点\n if (cyclePath.findIndex(function (node) {\n return nodeIds.indexOf(node.id) > -1;\n }) > -1) {\n cycleValid = false;\n }\n } // 把 node list 形式转换为 cycle 的格式\n\n\n if (cycleValid) {\n var cycle = {};\n\n for (var index = 1; index < cyclePath.length; index += 1) {\n cycle[cyclePath[index - 1].id] = cyclePath[index];\n }\n\n if (cyclePath.length) {\n cycle[cyclePath[cyclePath.length - 1].id] = cyclePath[0];\n }\n\n allCycles.push(cycle);\n }\n\n used[neighborId].add(curNode);\n }\n };\n\n for (var i = 0; i < neighbors.length; i += 1) {\n _loop_1(i);\n }\n }\n }\n\n return allCycles;\n};\n/**\n * Johnson\'s algorithm, 时间复杂度 O((V + E)(C + 1))$ and space bounded by O(V + E)\n * refer: https://www.cs.tufts.edu/comp/150GA/homeworks/hw1/Johnson%2075.PDF\n * refer: https://networkx.github.io/documentation/stable/_modules/networkx/algorithms/cycles.html#simple_cycles\n * @param graph\n * @param nodeIds 节点 ID 的数组\n * @param include 包含或排除指定的节点\n * @return [{[key: string]: INode}] 返回所有的 simple cycles\n */\n\n\nexports.detectAllUndirectedCycle = detectAllUndirectedCycle;\n\nvar detectAllDirectedCycle = function detectAllDirectedCycle(graphData, nodeIds, include) {\n if (include === void 0) {\n include = true;\n }\n\n var path = []; // stack of nodes in current path\n\n var blocked = new Set();\n var B = []; // remember portions of the graph that yield no elementary circuit\n\n var allCycles = [];\n var idx2Node = {};\n var node2Idx = {}; // 辅助函数: unblock all blocked nodes\n\n var unblock = function unblock(thisNode) {\n var stack = [thisNode];\n\n while (stack.length > 0) {\n var node = stack.pop();\n\n if (blocked.has(node)) {\n blocked.delete(node);\n B[node.id].forEach(function (n) {\n stack.push(n);\n });\n B[node.id].clear();\n }\n }\n };\n\n var circuit = function circuit(node, start, adjList) {\n var closed = false; // whether a path is closed\n\n if (nodeIds && include === false && nodeIds.indexOf(node.id) > -1) return closed;\n path.push(node);\n blocked.add(node);\n var neighbors = adjList[node.id];\n\n for (var i = 0; i < neighbors.length; i += 1) {\n var neighbor = idx2Node[neighbors[i]];\n\n if (neighbor === start) {\n var cycle = {};\n\n for (var index = 1; index < path.length; index += 1) {\n cycle[path[index - 1].id] = path[index];\n }\n\n if (path.length) {\n cycle[path[path.length - 1].id] = path[0];\n }\n\n allCycles.push(cycle);\n closed = true;\n } else if (!blocked.has(neighbor)) {\n if (circuit(neighbor, start, adjList)) {\n closed = true;\n }\n }\n }\n\n if (closed) {\n unblock(node);\n } else {\n for (var i = 0; i < neighbors.length; i += 1) {\n var neighbor = idx2Node[neighbors[i]];\n\n if (!B[neighbor.id].has(node)) {\n B[neighbor.id].add(node);\n }\n }\n }\n\n path.pop();\n return closed;\n };\n\n var _a = graphData.nodes,\n nodes = _a === void 0 ? [] : _a; // Johnson\'s algorithm 要求给节点赋顺序,先按节点在数组中的顺序\n\n for (var i = 0; i < nodes.length; i += 1) {\n var node = nodes[i];\n var nodeId = node.id;\n node2Idx[nodeId] = i;\n idx2Node[i] = node;\n } // 如果有指定包含的节点,则把指定节点排序在前,以便提早结束搜索\n\n\n if (nodeIds && include) {\n var _loop_2 = function _loop_2(i) {\n var nodeId = nodeIds[i];\n node2Idx[nodes[i].id] = node2Idx[nodeId];\n node2Idx[nodeId] = 0;\n idx2Node[0] = nodes.find(function (node) {\n return node.id === nodeId;\n });\n idx2Node[node2Idx[nodes[i].id]] = nodes[i];\n };\n\n for (var i = 0; i < nodeIds.length; i++) {\n _loop_2(i);\n }\n } // 返回 节点顺序 >= nodeOrder 的强连通分量的adjList\n\n\n var getMinComponentAdj = function getMinComponentAdj(components) {\n var _a;\n\n var minCompIdx;\n var minIdx = Infinity; // Find least component and the lowest node\n\n for (var i = 0; i < components.length; i += 1) {\n var comp = components[i];\n\n for (var j = 0; j < comp.length; j++) {\n var nodeIdx_1 = node2Idx[comp[j].id];\n\n if (nodeIdx_1 < minIdx) {\n minIdx = nodeIdx_1;\n minCompIdx = i;\n }\n }\n }\n\n var component = components[minCompIdx];\n var adjList = [];\n\n for (var i = 0; i < component.length; i += 1) {\n var node = component[i];\n adjList[node.id] = [];\n\n for (var _i = 0, _b = (0, _util.getNeighbors)(node.id, graphData.edges, \'target\').filter(function (n) {\n return component.map(function (c) {\n return c.id;\n }).indexOf(n) > -1;\n }); _i < _b.length; _i++) {\n var neighbor = _b[_i]; // 对自环情况 (点连向自身) 特殊处理:记录自环,但不加入adjList\n\n if (neighbor === node.id && !(include === false && nodeIds.indexOf(node.id) > -1)) {\n allCycles.push((_a = {}, _a[node.id] = node, _a));\n } else {\n adjList[node.id].push(node2Idx[neighbor]);\n }\n }\n }\n\n return {\n component: component,\n adjList: adjList,\n minIdx: minIdx\n };\n };\n\n var nodeIdx = 0;\n\n while (nodeIdx < nodes.length) {\n var subgraphNodes = nodes.filter(function (n) {\n return node2Idx[n.id] >= nodeIdx;\n });\n var sccs = (0, _connectedComponent.detectStrongConnectComponents)({\n nodes: subgraphNodes,\n edges: graphData.edges\n }).filter(function (component) {\n return component.length > 1;\n });\n if (sccs.length === 0) break;\n var scc = getMinComponentAdj(sccs);\n var minIdx = scc.minIdx,\n adjList = scc.adjList,\n component = scc.component;\n\n if (component.length > 1) {\n component.forEach(function (node) {\n B[node.id] = new Set();\n });\n var startNode = idx2Node[minIdx]; // startNode 不在指定要包含的节点中,提前结束搜索\n\n if (nodeIds && include && nodeIds.indexOf(startNode.id) === -1) return allCycles;\n circuit(startNode, startNode, adjList);\n nodeIdx = minIdx + 1;\n } else {\n break;\n }\n }\n\n return allCycles;\n};\n/**\n * 查找图中所有满足要求的圈\n * @param graph\n * @param directed 是否为有向图\n * @param nodeIds 节点 ID 的数组,若不指定,则返回图中所有的圈\n * @param include 包含或排除指定的节点\n * @return [{[key: string]: Node}] 包含所有环的数组,每个环用一个Object表示,其中key为节点id,value为该节点在环中指向的下一个节点\n */\n\n\nexports.detectAllDirectedCycle = detectAllDirectedCycle;\n\nvar detectAllCycles = function detectAllCycles(graphData, directed, nodeIds, include) {\n if (include === void 0) {\n include = true;\n }\n\n if (directed) return detectAllDirectedCycle(graphData, nodeIds, include);\n return detectAllUndirectedCycle(graphData, nodeIds, include);\n};\n\nexports.detectAllCycles = detectAllCycles;\nvar _default = detectDirectedCycle;\nexports.default = _default;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvYWxnb3JpdGhtL2xpYi9kZXRlY3QtY3ljbGUuanM/NTE0MCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBYTs7QUFFYix1QkFBdUIsMkJBQTJCLDJFQUEyRSxrQ0FBa0MsbUJBQW1CLEdBQUcsRUFBRSxPQUFPLGtDQUFrQyw4SEFBOEgsR0FBRyxFQUFFLHFCQUFxQjs7QUFFeFg7QUFDQTtBQUNBLENBQUM7QUFDRDs7QUFFQSxrQ0FBa0MsbUJBQU8sQ0FBQyxHQUFPOztBQUVqRCxrREFBa0QsbUJBQU8sQ0FBQyxHQUF1Qjs7QUFFakYsWUFBWSxtQkFBTyxDQUFDLEVBQVE7O0FBRTVCLHFDQUFxQyxnREFBZ0QsMkJBQTJCLGlFQUFpRSxjQUFjLEdBQUcsY0FBYzs7QUFFaE4sdUNBQXVDLDZCQUE2QixZQUFZLEVBQUUsOEVBQThFLFNBQVMsZ0JBQWdCLEVBQUUsd0NBQXdDLCtCQUErQix1QkFBdUIsRUFBRSxpQkFBaUIsc0ZBQXNGLHVCQUF1QixzREFBc0QscUZBQXFGLHNDQUFzQywwQ0FBMEMsRUFBRSxPQUFPLHdCQUF3QixFQUFFLEVBQUUsRUFBRSxzQkFBc0IsYUFBYSx3QkFBd0IsRUFBRSxlQUFlOztBQUV2dUIsc0NBQXNDLHVDQUF1QyxnQkFBZ0I7O0FBRTdGO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCOztBQUV4Qix3QkFBd0I7O0FBRXhCLHVCQUF1Qjs7QUFFdkIsc0JBQXNCOztBQUV0QjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EseUNBQXlDOztBQUV6QztBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsbUNBQW1DO0FBQ25DOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSw2QkFBNkI7O0FBRTdCO0FBQ0E7QUFD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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxvQkFBb0I7QUFDakM7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EiLCJmaWxlIjoiMzAzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbmZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiKSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfTsgfSBlbHNlIHsgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9OyB9IHJldHVybiBfdHlwZW9mKG9iaik7IH1cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IGV4cG9ydHMuZGV0ZWN0QWxsQ3ljbGVzID0gZXhwb3J0cy5kZXRlY3RBbGxEaXJlY3RlZEN5Y2xlID0gZXhwb3J0cy5kZXRlY3RBbGxVbmRpcmVjdGVkQ3ljbGUgPSB2b2lkIDA7XG5cbnZhciBfZGZzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9kZnNcIikpO1xuXG52YXIgX2Nvbm5lY3RlZENvbXBvbmVudCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCIuL2Nvbm5lY3RlZC1jb21wb25lbnRcIikpO1xuXG52YXIgX3V0aWwgPSByZXF1aXJlKFwiLi91dGlsXCIpO1xuXG5mdW5jdGlvbiBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUoKSB7IGlmICh0eXBlb2YgV2Vha01hcCAhPT0gXCJmdW5jdGlvblwiKSByZXR1cm4gbnVsbDsgdmFyIGNhY2hlID0gbmV3IFdlYWtNYXAoKTsgX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlID0gZnVuY3Rpb24gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKCkgeyByZXR1cm4gY2FjaGU7IH07IHJldHVybiBjYWNoZTsgfVxuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChvYmopIHsgaWYgKG9iaiAmJiBvYmouX19lc01vZHVsZSkgeyByZXR1cm4gb2JqOyB9IGlmIChvYmogPT09IG51bGwgfHwgX3R5cGVvZihvYmopICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiBvYmogIT09IFwiZnVuY3Rpb25cIikgeyByZXR1cm4geyBkZWZhdWx0OiBvYmogfTsgfSB2YXIgY2FjaGUgPSBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUoKTsgaWYgKGNhY2hlICYmIGNhY2hlLmhhcyhvYmopKSB7IHJldHVybiBjYWNoZS5nZXQob2JqKTsgfSB2YXIgbmV3T2JqID0ge307IHZhciBoYXNQcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZGVmaW5lUHJvcGVydHkgJiYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjsgZm9yICh2YXIga2V5IGluIG9iaikgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkgeyB2YXIgZGVzYyA9IGhhc1Byb3BlcnR5RGVzY3JpcHRvciA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBrZXkpIDogbnVsbDsgaWYgKGRlc2MgJiYgKGRlc2MuZ2V0IHx8IGRlc2Muc2V0KSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkobmV3T2JqLCBrZXksIGRlc2MpOyB9IGVsc2UgeyBuZXdPYmpba2V5XSA9IG9ialtrZXldOyB9IH0gfSBuZXdPYmouZGVmYXVsdCA9IG9iajsgaWYgKGNhY2hlKSB7IGNhY2hlLnNldChvYmosIG5ld09iaik7IH0gcmV0dXJuIG5ld09iajsgfVxuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG52YXIgZGV0ZWN0RGlyZWN0ZWRDeWNsZSA9IGZ1bmN0aW9uIGRldGVjdERpcmVjdGVkQ3ljbGUoZ3JhcGhEYXRhKSB7XG4gIHZhciBjeWNsZSA9IG51bGw7XG4gIHZhciBfYSA9IGdyYXBoRGF0YS5ub2RlcyxcbiAgICAgIG5vZGVzID0gX2EgPT09IHZvaWQgMCA/IFtdIDogX2E7XG4gIHZhciBkZnNQYXJlbnRNYXAgPSB7fTsgLy8g5omA5pyJ5rKh5pyJ6KKr6K6/6Zeu55qE6IqC54K56ZuG5ZCIXG5cbiAgdmFyIHVudmlzaXRlZFNldCA9IHt9OyAvLyDmraPlnKjooqvorr/pl67nmoToioLngrnpm4blkIhcblxuICB2YXIgdmlzaXRpbmdTZXQgPSB7fTsgLy8g5omA5pyJ5bey57uP6KKr6K6/6Zeu6L+H55qE6IqC54K56ZuG5ZCIXG5cbiAgdmFyIHZpc2l0ZWRTZXQgPSB7fTsgLy8g5Yid5aeL5YyWIHVudmlzaXRlZFNldFxuXG4gIG5vZGVzLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcbiAgICB1bnZpc2l0ZWRTZXRbbm9kZS5pZF0gPSBub2RlO1xuICB9KTtcbiAgdmFyIGNhbGxiYWNrcyA9IHtcbiAgICBlbnRlcjogZnVuY3Rpb24gZW50ZXIoX2EpIHtcbiAgICAgIHZhciBjdXJyZW50Tm9kZSA9IF9hLmN1cnJlbnQsXG4gICAgICAgICAgcHJldmlvdXNOb2RlID0gX2EucHJldmlvdXM7XG5cbiAgICAgIGlmICh2aXNpdGluZ1NldFtjdXJyZW50Tm9kZV0pIHtcbiAgICAgICAgLy8g5aaC5p6c5b2T5YmN6IqC54K55q2j5Zyo6K6/6Zeu5Lit77yM5YiZ6K+05piO5qOA5rWL5Yiw546v6Lev5LqGXG4gICAgICAgIGN5Y2xlID0ge307XG4gICAgICAgIHZhciBjdXJyZW50Q3ljbGVOb2RlID0gY3VycmVudE5vZGU7XG4gICAgICAgIHZhciBwcmV2aW91c0N5Y2xlTm9kZSA9IHByZXZpb3VzTm9kZTtcblxuICAgICAgICB3aGlsZSAocHJldmlvdXNDeWNsZU5vZGUgIT09IGN1cnJlbnROb2RlKSB7XG4gICAgICAgICAgY3ljbGVbY3VycmVudEN5Y2xlTm9kZV0gPSBwcmV2aW91c0N5Y2xlTm9kZTtcbiAgICAgICAgICBjdXJyZW50Q3ljbGVOb2RlID0gcHJldmlvdXNDeWNsZU5vZGU7XG4gICAgICAgICAgcHJldmlvdXNDeWNsZU5vZGUgPSBkZnNQYXJlbnRNYXBbcHJldmlvdXNDeWNsZU5vZGVdO1xuICAgICAgICB9XG5cbiAgICAgICAgY3ljbGVbY3VycmVudEN5Y2xlTm9kZV0gPSBwcmV2aW91c0N5Y2xlTm9kZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIOWmguaenOS4jeWtmOWcqOato+WcqOiuv+mXrumbhuWQiOS4re+8jOWImeWwhuWFtuaUvuWFpeato+WcqOiuv+mXrumbhuWQiO+8jOW5tuS7juacquiuv+mXrumbhuWQiOS4reWIoOmZpFxuICAgICAgICB2aXNpdGluZ1NldFtjdXJyZW50Tm9kZV0gPSBjdXJyZW50Tm9kZTtcbiAgICAgICAgZGVsZXRlIHVudmlzaXRlZFNldFtjdXJyZW50Tm9kZV07IC8vIOabtOaWsCBEU0YgcGFyZW50cyDliJfooahcblxuICAgICAgICBkZnNQYXJlbnRNYXBbY3VycmVudE5vZGVdID0gcHJldmlvdXNOb2RlO1xuICAgICAgfVxuICAgIH0sXG4gICAgbGVhdmU6IGZ1bmN0aW9uIGxlYXZlKF9hKSB7XG4gICAgICB2YXIgY3VycmVudE5vZGUgPSBfYS5jdXJyZW50OyAvLyDlpoLmnpzmiYDmnInnmoToioLngrnnmoTlrZDoioLngrnpg73lt7Lnu4/orr/pl67ov4fkuobvvIzliJnku47mraPlnKjorr/pl67pm4blkIjkuK3liKDpmaTmjonvvIzlubblsIblhbbnp7vlhaXliLDlt7Lorr/pl67pm4blkIjkuK3vvIxcbiAgICAgIC8vIOWQjOaXtuS5n+aEj+WRs+edgOW9k+WJjeiKgueCueeahOaJgOaciemCu+WxheiKgueCuemDveiiq+iuv+mXrui/h+S6hlxuXG4gICAgICB2aXNpdGVkU2V0W2N1cnJlbnROb2RlXSA9IGN1cnJlbnROb2RlO1xuICAgICAgZGVsZXRlIHZpc2l0aW5nU2V0W2N1cnJlbnROb2RlXTtcbiAgICB9LFxuICAgIGFsbG93VHJhdmVyc2FsOiBmdW5jdGlvbiBhbGxvd1RyYXZlcnNhbChfYSkge1xuICAgICAgdmFyIG5leHROb2RlID0gX2EubmV4dDsgLy8g5aaC5p6c5qOA5rWL5Yiw546v6Lev5YiZ6ZyA6KaB57uI5q2i5omA5pyJ6L+b5LiA5q2l55qE6YGN5Y6G77yM5ZCm5YiZ5Lya5a+86Ie05peg6ZmQ5b6q546v6YGN5Y6GXG5cbiAgICAgIGlmIChjeWNsZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9IC8vIOS7heWFgeiuuOmBjeWOhuayoeacieiuv+mXrueahOiKgueCue+8jHZpc2l0ZWRTZXQg5Lit55qE6YO95bey57uP6K6/6Zeu6L+H5LqGXG5cblxuICAgICAgcmV0dXJuICF2aXNpdGVkU2V0W25leHROb2RlXTtcbiAgICB9XG4gIH07IC8vIOW8gOWni+mBjeWOhuiKgueCuVxuXG4gIHdoaWxlIChPYmplY3Qua2V5cyh1bnZpc2l0ZWRTZXQpLmxlbmd0aCkge1xuICAgIC8vIOS7juesrOS4gOS4quiKgueCueW8gOWni+i/m+ihjCBERlMg6YGN5Y6GXG4gICAgdmFyIGZpcnNldFVuVmlzaXRlZEtleSA9IE9iamVjdC5rZXlzKHVudmlzaXRlZFNldClbMF07XG4gICAgKDAsIF9kZnMuZGVmYXVsdCkoZ3JhcGhEYXRhLCBmaXJzZXRVblZpc2l0ZWRLZXksIGNhbGxiYWNrcyk7XG4gIH1cblxuICByZXR1cm4gY3ljbGU7XG59O1xuLyoqXG4gKiDmo4DmtYvml6DlkJHlm77kuK3nmoTmiYDmnIlCYXNlIGN5Y2xlc1xuICogcmVmZXI6IGh0dHBzOi8vd3d3LmNvZGVwcm9qZWN0LmNvbS9BcnRpY2xlcy8xMTU4MjMyL0VudW1lcmF0aW5nLUFsbC1DeWNsZXMtaW4tYW4tVW5kaXJlY3RlZC1HcmFwaFxuICogQHBhcmFtIGdyYXBoXG4gKiBAcGFyYW0gbm9kZUlkcyDoioLngrkgSUQg55qE5pWw57uEXG4gKiBAcGFyYW0gaW5jbHVkZSDljIXlkKvmiJbmjpLpmaTmjIflrprnmoToioLngrlcbiAqIEByZXR1cm4gW3tba2V5OiBzdHJpbmddOiBJTm9kZX1dIOi/lOWbnuS4gOe7hGJhc2UgY3ljbGVzXG4gKi9cblxuXG52YXIgZGV0ZWN0QWxsVW5kaXJlY3RlZEN5Y2xlID0gZnVuY3Rpb24gZGV0ZWN0QWxsVW5kaXJlY3RlZEN5Y2xlKGdyYXBoRGF0YSwgbm9kZUlkcywgaW5jbHVkZSkge1xuICB2YXIgX2EsIF9iO1xuXG4gIGlmIChpbmNsdWRlID09PSB2b2lkIDApIHtcbiAgICBpbmNsdWRlID0gdHJ1ZTtcbiAgfVxuXG4gIHZhciBhbGxDeWNsZXMgPSBbXTtcbiAgdmFyIGNvbXBvbmVudHMgPSAoMCwgX2Nvbm5lY3RlZENvbXBvbmVudC5kZWZhdWx0KShncmFwaERhdGEsIGZhbHNlKTsgLy8gbG9vcCB0aHJvdWdoIGFsbCBjb25uZWN0ZWQgY29tcG9uZW50c1xuXG4gIGZvciAodmFyIF9pID0gMCwgY29tcG9uZW50c18xID0gY29tcG9uZW50czsgX2kgPCBjb21wb25lbnRzXzEubGVuZ3RoOyBfaSsrKSB7XG4gICAgdmFyIGNvbXBvbmVudCA9IGNvbXBvbmVudHNfMVtfaV07XG4gICAgaWYgKCFjb21wb25lbnQubGVuZ3RoKSBjb250aW51ZTtcbiAgICB2YXIgcm9vdCA9IGNvbXBvbmVudFswXTtcbiAgICB2YXIgcm9vdElkID0gcm9vdC5pZDtcbiAgICB2YXIgc3RhY2sgPSBbcm9vdF07XG4gICAgdmFyIHBhcmVudF8xID0gKF9hID0ge30sIF9hW3Jvb3RJZF0gPSByb290LCBfYSk7XG4gICAgdmFyIHVzZWQgPSAoX2IgPSB7fSwgX2Jbcm9vdElkXSA9IG5ldyBTZXQoKSwgX2IpOyAvLyB3YWxrIGEgc3Bhbm5pbmcgdHJlZSB0byBmaW5kIGN5Y2xlc1xuXG4gICAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICAgIHZhciBjdXJOb2RlID0gc3RhY2sucG9wKCk7XG4gICAgICB2YXIgY3VyTm9kZUlkID0gY3VyTm9kZS5pZDtcbiAgICAgIHZhciBuZWlnaGJvcnMgPSAoMCwgX3V0aWwuZ2V0TmVpZ2hib3JzKShjdXJOb2RlSWQsIGdyYXBoRGF0YS5lZGdlcyk7XG5cbiAgICAgIHZhciBfbG9vcF8xID0gZnVuY3Rpb24gX2xvb3BfMShpKSB7XG4gICAgICAgIHZhciBfYztcblxuICAgICAgICB2YXIgbmVpZ2hib3JJZCA9IG5laWdoYm9yc1tpXTtcbiAgICAgICAgdmFyIG5laWdoYm9yID0gZ3JhcGhEYXRhLm5vZGVzLmZpbmQoZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgICByZXR1cm4gbm9kZS5pZCA9PT0gbmVpZ2hib3JJZDtcbiAgICAgICAgfSk7IC8vIGNvbnN0IG5laWdoYm9ySWQgPSBuZWlnaGJvci5nZXQoJ2lkJyk7XG5cbiAgICAgICAgaWYgKG5laWdoYm9ySWQgPT09IGN1ck5vZGVJZCkge1xuICAgICAgICAgIC8vIOiHqueOr1xuICAgICAgICAgIGFsbEN5Y2xlcy5wdXNoKChfYyA9IHt9LCBfY1tuZWlnaGJvcklkXSA9IGN1ck5vZGUsIF9jKSk7XG4gICAgICAgIH0gZWxzZSBpZiAoIShuZWlnaGJvcklkIGluIHVzZWQpKSB7XG4gICAgICAgICAgLy8gdmlzaXQgYSBuZXcgbm9kZVxuICAgICAgICAgIHBhcmVudF8xW25laWdoYm9ySWRdID0gY3VyTm9kZTtcbiAgICAgICAgICBzdGFjay5wdXNoKG5laWdoYm9yKTtcbiAgICAgICAgICB1c2VkW25laWdoYm9ySWRdID0gbmV3IFNldChbY3VyTm9kZV0pO1xuICAgICAgICB9IGVsc2UgaWYgKCF1c2VkW2N1ck5vZGVJZF0uaGFzKG5laWdoYm9yKSkge1xuICAgICAgICAgIC8vIGEgY3ljbGUgZm91bmRcbiAgICAgICAgICB2YXIgY3ljbGVWYWxpZCA9IHRydWU7XG4gICAgICAgICAgdmFyIGN5Y2xlUGF0aCA9IFtuZWlnaGJvciwgY3VyTm9kZV07XG4gICAgICAgICAgdmFyIHAgPSBwYXJlbnRfMVtjdXJOb2RlSWRdO1xuXG4gICAgICAgICAgd2hpbGUgKHVzZWRbbmVpZ2hib3JJZF0uc2l6ZSAmJiAhdXNlZFtuZWlnaGJvcklkXS5oYXMocCkpIHtcbiAgICAgICAgICAgIGN5Y2xlUGF0aC5wdXNoKHApO1xuICAgICAgICAgICAgaWYgKHAgPT09IHBhcmVudF8xW3AuaWRdKSBicmVhaztlbHNlIHAgPSBwYXJlbnRfMVtwLmlkXTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjeWNsZVBhdGgucHVzaChwKTtcblxuICAgICAgICAgIGlmIChub2RlSWRzICYmIGluY2x1ZGUpIHtcbiAgICAgICAgICAgIC8vIOWmguaenOacieaMh+WumuWMheWQq+eahOiKgueCuVxuICAgICAgICAgICAgY3ljbGVWYWxpZCA9IGZhbHNlO1xuXG4gICAgICAgICAgICBpZiAoY3ljbGVQYXRoLmZpbmRJbmRleChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICAgICAgICByZXR1cm4gbm9kZUlkcy5pbmRleE9mKG5vZGUuaWQpID4gLTE7XG4gICAgICAgICAgICB9KSA+IC0xKSB7XG4gICAgICAgICAgICAgIGN5Y2xlVmFsaWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAobm9kZUlkcyAmJiAhaW5jbHVkZSkge1xuICAgICAgICAgICAgLy8g5aaC5p6c5pyJ5oyH5a6a5LiN5YyF5ZCr55qE6IqC54K5XG4gICAgICAgICAgICBpZiAoY3ljbGVQYXRoLmZpbmRJbmRleChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICAgICAgICByZXR1cm4gbm9kZUlkcy5pbmRleE9mKG5vZGUuaWQpID4gLTE7XG4gICAgICAgICAgICB9KSA+IC0xKSB7XG4gICAgICAgICAgICAgIGN5Y2xlVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IC8vIOaKiiBub2RlIGxpc3Qg5b2i5byP6L2s5o2i5Li6IGN5Y2xlIOeahOagvOW8j1xuXG5cbiAgICAgICAgICBpZiAoY3ljbGVWYWxpZCkge1xuICAgICAgICAgICAgdmFyIGN5Y2xlID0ge307XG5cbiAgICAgICAgICAgIGZvciAodmFyIGluZGV4ID0gMTsgaW5kZXggPCBjeWNsZVBhdGgubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgICAgICAgICAgIGN5Y2xlW2N5Y2xlUGF0aFtpbmRleCAtIDFdLmlkXSA9IGN5Y2xlUGF0aFtpbmRleF07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjeWNsZVBhdGgubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIGN5Y2xlW2N5Y2xlUGF0aFtjeWNsZVBhdGgubGVuZ3RoIC0gMV0uaWRdID0gY3ljbGVQYXRoWzBdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBhbGxDeWNsZXMucHVzaChjeWNsZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdXNlZFtuZWlnaGJvcklkXS5hZGQoY3VyTm9kZSk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmVpZ2hib3JzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIF9sb29wXzEoaSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGFsbEN5Y2xlcztcbn07XG4vKipcbiAqIEpvaG5zb24ncyBhbGdvcml0aG0sIOaXtumXtOWkjeadguW6piBPKChWICsgRSkoQyArIDEpKSQgYW5kIHNwYWNlIGJvdW5kZWQgYnkgTyhWICsgRSlcbiAqIHJlZmVyOiBodHRwczovL3d3dy5jcy50dWZ0cy5lZHUvY29tcC8xNTBHQS9ob21ld29ya3MvaHcxL0pvaG5zb24lMjA3NS5QREZcbiAqIHJlZmVyOiBodHRwczovL25ldHdvcmt4LmdpdGh1Yi5pby9kb2N1bWVudGF0aW9uL3N0YWJsZS9fbW9kdWxlcy9uZXR3b3JreC9hbGdvcml0aG1zL2N5Y2xlcy5odG1sI3NpbXBsZV9jeWNsZXNcbiAqIEBwYXJhbSBncmFwaFxuICogQHBhcmFtIG5vZGVJZHMg6IqC54K5IElEIOeahOaVsOe7hFxuICogQHBhcmFtIGluY2x1ZGUg5YyF5ZCr5oiW5o6S6Zmk5oyH5a6a55qE6IqC54K5XG4gKiBAcmV0dXJuIFt7W2tleTogc3RyaW5nXTogSU5vZGV9XSDov5Tlm57miYDmnInnmoQgc2ltcGxlIGN5Y2xlc1xuICovXG5cblxuZXhwb3J0cy5kZXRlY3RBbGxVbmRpcmVjdGVkQ3ljbGUgPSBkZXRlY3RBbGxVbmRpcmVjdGVkQ3ljbGU7XG5cbnZhciBkZXRlY3RBbGxEaXJlY3RlZEN5Y2xlID0gZnVuY3Rpb24gZGV0ZWN0QWxsRGlyZWN0ZWRDeWNsZShncmFwaERhdGEsIG5vZGVJZHMsIGluY2x1ZGUpIHtcbiAgaWYgKGluY2x1ZGUgPT09IHZvaWQgMCkge1xuICAgIGluY2x1ZGUgPSB0cnVlO1xuICB9XG5cbiAgdmFyIHBhdGggPSBbXTsgLy8gc3RhY2sgb2Ygbm9kZXMgaW4gY3VycmVudCBwYXRoXG5cbiAgdmFyIGJsb2NrZWQgPSBuZXcgU2V0KCk7XG4gIHZhciBCID0gW107IC8vIHJlbWVtYmVyIHBvcnRpb25zIG9mIHRoZSBncmFwaCB0aGF0IHlpZWxkIG5vIGVsZW1lbnRhcnkgY2lyY3VpdFxuXG4gIHZhciBhbGxDeWNsZXMgPSBbXTtcbiAgdmFyIGlkeDJOb2RlID0ge307XG4gIHZhciBub2RlMklkeCA9IHt9OyAvLyDovoXliqnlh73mlbDvvJogdW5ibG9jayBhbGwgYmxvY2tlZCBub2Rlc1xuXG4gIHZhciB1bmJsb2NrID0gZnVuY3Rpb24gdW5ibG9jayh0aGlzTm9kZSkge1xuICAgIHZhciBzdGFjayA9IFt0aGlzTm9kZV07XG5cbiAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCkge1xuICAgICAgdmFyIG5vZGUgPSBzdGFjay5wb3AoKTtcblxuICAgICAgaWYgKGJsb2NrZWQuaGFzKG5vZGUpKSB7XG4gICAgICAgIGJsb2NrZWQuZGVsZXRlKG5vZGUpO1xuICAgICAgICBCW25vZGUuaWRdLmZvckVhY2goZnVuY3Rpb24gKG4pIHtcbiAgICAgICAgICBzdGFjay5wdXNoKG4pO1xuICAgICAgICB9KTtcbiAgICAgICAgQltub2RlLmlkXS5jbGVhcigpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICB2YXIgY2lyY3VpdCA9IGZ1bmN0aW9uIGNpcmN1aXQobm9kZSwgc3RhcnQsIGFkakxpc3QpIHtcbiAgICB2YXIgY2xvc2VkID0gZmFsc2U7IC8vIHdoZXRoZXIgYSBwYXRoIGlzIGNsb3NlZFxuXG4gICAgaWYgKG5vZGVJZHMgJiYgaW5jbHVkZSA9PT0gZmFsc2UgJiYgbm9kZUlkcy5pbmRleE9mKG5vZGUuaWQpID4gLTEpIHJldHVybiBjbG9zZWQ7XG4gICAgcGF0aC5wdXNoKG5vZGUpO1xuICAgIGJsb2NrZWQuYWRkKG5vZGUpO1xuICAgIHZhciBuZWlnaGJvcnMgPSBhZGpMaXN0W25vZGUuaWRdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuZWlnaGJvcnMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIHZhciBuZWlnaGJvciA9IGlkeDJOb2RlW25laWdoYm9yc1tpXV07XG5cbiAgICAgIGlmIChuZWlnaGJvciA9PT0gc3RhcnQpIHtcbiAgICAgICAgdmFyIGN5Y2xlID0ge307XG5cbiAgICAgICAgZm9yICh2YXIgaW5kZXggPSAxOyBpbmRleCA8IHBhdGgubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgICAgICAgY3ljbGVbcGF0aFtpbmRleCAtIDFdLmlkXSA9IHBhdGhbaW5kZXhdO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhdGgubGVuZ3RoKSB7XG4gICAgICAgICAgY3ljbGVbcGF0aFtwYXRoLmxlbmd0aCAtIDFdLmlkXSA9IHBhdGhbMF07XG4gICAgICAgIH1cblxuICAgICAgICBhbGxDeWNsZXMucHVzaChjeWNsZSk7XG4gICAgICAgIGNsb3NlZCA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKCFibG9ja2VkLmhhcyhuZWlnaGJvcikpIHtcbiAgICAgICAgaWYgKGNpcmN1aXQobmVpZ2hib3IsIHN0YXJ0LCBhZGpMaXN0KSkge1xuICAgICAgICAgIGNsb3NlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY2xvc2VkKSB7XG4gICAgICB1bmJsb2NrKG5vZGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5laWdoYm9ycy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICB2YXIgbmVpZ2hib3IgPSBpZHgyTm9kZVtuZWlnaGJvcnNbaV1dO1xuXG4gICAgICAgIGlmICghQltuZWlnaGJvci5pZF0uaGFzKG5vZGUpKSB7XG4gICAgICAgICAgQltuZWlnaGJvci5pZF0uYWRkKG5vZGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcGF0aC5wb3AoKTtcbiAgICByZXR1cm4gY2xvc2VkO1xuICB9O1xuXG4gIHZhciBfYSA9IGdyYXBoRGF0YS5ub2RlcyxcbiAgICAgIG5vZGVzID0gX2EgPT09IHZvaWQgMCA/IFtdIDogX2E7IC8vIEpvaG5zb24ncyBhbGdvcml0aG0g6KaB5rGC57uZ6IqC54K56LWL6aG65bqP77yM5YWI5oyJ6IqC54K55Zyo5pWw57uE5Lit55qE6aG65bqPXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgIHZhciBub2RlID0gbm9kZXNbaV07XG4gICAgdmFyIG5vZGVJZCA9IG5vZGUuaWQ7XG4gICAgbm9kZTJJZHhbbm9kZUlkXSA9IGk7XG4gICAgaWR4Mk5vZGVbaV0gPSBub2RlO1xuICB9IC8vIOWmguaenOacieaMh+WumuWMheWQq+eahOiKgueCue+8jOWImeaKiuaMh+WumuiKgueCueaOkuW6j+WcqOWJje+8jOS7peS+v+aPkOaXqee7k+adn+aQnOe0olxuXG5cbiAgaWYgKG5vZGVJZHMgJiYgaW5jbHVkZSkge1xuICAgIHZhciBfbG9vcF8yID0gZnVuY3Rpb24gX2xvb3BfMihpKSB7XG4gICAgICB2YXIgbm9kZUlkID0gbm9kZUlkc1tpXTtcbiAgICAgIG5vZGUySWR4W25vZGVzW2ldLmlkXSA9IG5vZGUySWR4W25vZGVJZF07XG4gICAgICBub2RlMklkeFtub2RlSWRdID0gMDtcbiAgICAgIGlkeDJOb2RlWzBdID0gbm9kZXMuZmluZChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5pZCA9PT0gbm9kZUlkO1xuICAgICAgfSk7XG4gICAgICBpZHgyTm9kZVtub2RlMklkeFtub2Rlc1tpXS5pZF1dID0gbm9kZXNbaV07XG4gICAgfTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZUlkcy5sZW5ndGg7IGkrKykge1xuICAgICAgX2xvb3BfMihpKTtcbiAgICB9XG4gIH0gLy8g6L+U5ZueIOiKgueCuemhuuW6jyA+PSBub2RlT3JkZXIg55qE5by66L+e6YCa5YiG6YeP55qEYWRqTGlzdFxuXG5cbiAgdmFyIGdldE1pbkNvbXBvbmVudEFkaiA9IGZ1bmN0aW9uIGdldE1pbkNvbXBvbmVudEFkaihjb21wb25lbnRzKSB7XG4gICAgdmFyIF9hO1xuXG4gICAgdmFyIG1pbkNvbXBJZHg7XG4gICAgdmFyIG1pbklkeCA9IEluZmluaXR5OyAvLyBGaW5kIGxlYXN0IGNvbXBvbmVudCBhbmQgdGhlIGxvd2VzdCBub2RlXG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbXBvbmVudHMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIHZhciBjb21wID0gY29tcG9uZW50c1tpXTtcblxuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBjb21wLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHZhciBub2RlSWR4XzEgPSBub2RlMklkeFtjb21wW2pdLmlkXTtcblxuICAgICAgICBpZiAobm9kZUlkeF8xIDwgbWluSWR4KSB7XG4gICAgICAgICAgbWluSWR4ID0gbm9kZUlkeF8xO1xuICAgICAgICAgIG1pbkNvbXBJZHggPSBpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGNvbXBvbmVudCA9IGNvbXBvbmVudHNbbWluQ29tcElkeF07XG4gICAgdmFyIGFkakxpc3QgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29tcG9uZW50Lmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICB2YXIgbm9kZSA9IGNvbXBvbmVudFtpXTtcbiAgICAgIGFkakxpc3Rbbm9kZS5pZF0gPSBbXTtcblxuICAgICAgZm9yICh2YXIgX2kgPSAwLCBfYiA9ICgwLCBfdXRpbC5nZXROZWlnaGJvcnMpKG5vZGUuaWQsIGdyYXBoRGF0YS5lZGdlcywgJ3RhcmdldCcpLmZpbHRlcihmdW5jdGlvbiAobikge1xuICAgICAgICByZXR1cm4gY29tcG9uZW50Lm1hcChmdW5jdGlvbiAoYykge1xuICAgICAgICAgIHJldHVybiBjLmlkO1xuICAgICAgICB9KS5pbmRleE9mKG4pID4gLTE7XG4gICAgICB9KTsgX2kgPCBfYi5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgdmFyIG5laWdoYm9yID0gX2JbX2ldOyAvLyDlr7noh6rnjq/mg4XlhrUgKOeCuei/nuWQkeiHqui6qykg54m55q6K5aSE55CG77ya6K6w5b2V6Ieq546v77yM5L2G5LiN5Yqg5YWlYWRqTGlzdFxuXG4gICAgICAgIGlmIChuZWlnaGJvciA9PT0gbm9kZS5pZCAmJiAhKGluY2x1ZGUgPT09IGZhbHNlICYmIG5vZGVJZHMuaW5kZXhPZihub2RlLmlkKSA+IC0xKSkge1xuICAgICAgICAgIGFsbEN5Y2xlcy5wdXNoKChfYSA9IHt9LCBfYVtub2RlLmlkXSA9IG5vZGUsIF9hKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYWRqTGlzdFtub2RlLmlkXS5wdXNoKG5vZGUySWR4W25laWdoYm9yXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgY29tcG9uZW50OiBjb21wb25lbnQsXG4gICAgICBhZGpMaXN0OiBhZGpMaXN0LFxuICAgICAgbWluSWR4OiBtaW5JZHhcbiAgICB9O1xuICB9O1xuXG4gIHZhciBub2RlSWR4ID0gMDtcblxuICB3aGlsZSAobm9kZUlkeCA8IG5vZGVzLmxlbmd0aCkge1xuICAgIHZhciBzdWJncmFwaE5vZGVzID0gbm9kZXMuZmlsdGVyKGZ1bmN0aW9uIChuKSB7XG4gICAgICByZXR1cm4gbm9kZTJJZHhbbi5pZF0gPj0gbm9kZUlkeDtcbiAgICB9KTtcbiAgICB2YXIgc2NjcyA9ICgwLCBfY29ubmVjdGVkQ29tcG9uZW50LmRldGVjdFN0cm9uZ0Nvbm5lY3RDb21wb25lbnRzKSh7XG4gICAgICBub2Rlczogc3ViZ3JhcGhOb2RlcyxcbiAgICAgIGVkZ2VzOiBncmFwaERhdGEuZWRnZXNcbiAgICB9KS5maWx0ZXIoZnVuY3Rpb24gKGNvbXBvbmVudCkge1xuICAgICAgcmV0dXJuIGNvbXBvbmVudC5sZW5ndGggPiAxO1xuICAgIH0pO1xuICAgIGlmIChzY2NzLmxlbmd0aCA9PT0gMCkgYnJlYWs7XG4gICAgdmFyIHNjYyA9IGdldE1pbkNvbXBvbmVudEFkaihzY2NzKTtcbiAgICB2YXIgbWluSWR4ID0gc2NjLm1pbklkeCxcbiAgICAgICAgYWRqTGlzdCA9IHNjYy5hZGpMaXN0LFxuICAgICAgICBjb21wb25lbnQgPSBzY2MuY29tcG9uZW50O1xuXG4gICAgaWYgKGNvbXBvbmVudC5sZW5ndGggPiAxKSB7XG4gICAgICBjb21wb25lbnQuZm9yRWFjaChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICBCW25vZGUuaWRdID0gbmV3IFNldCgpO1xuICAgICAgfSk7XG4gICAgICB2YXIgc3RhcnROb2RlID0gaWR4Mk5vZGVbbWluSWR4XTsgLy8gc3RhcnROb2RlIOS4jeWcqOaMh+WumuimgeWMheWQq+eahOiKgueCueS4re+8jOaPkOWJjee7k+adn+aQnOe0olxuXG4gICAgICBpZiAobm9kZUlkcyAmJiBpbmNsdWRlICYmIG5vZGVJZHMuaW5kZXhPZihzdGFydE5vZGUuaWQpID09PSAtMSkgcmV0dXJuIGFsbEN5Y2xlcztcbiAgICAgIGNpcmN1aXQoc3RhcnROb2RlLCBzdGFydE5vZGUsIGFkakxpc3QpO1xuICAgICAgbm9kZUlkeCA9IG1pbklkeCArIDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBhbGxDeWNsZXM7XG59O1xuLyoqXG4gKiDmn6Xmib7lm77kuK3miYDmnInmu6HotrPopoHmsYLnmoTlnIhcbiAqIEBwYXJhbSBncmFwaFxuICogQHBhcmFtIGRpcmVjdGVkIOaYr+WQpuS4uuacieWQkeWbvlxuICogQHBhcmFtIG5vZGVJZHMg6IqC54K5IElEIOeahOaVsOe7hO+8jOiLpeS4jeaMh+Wumu+8jOWImei/lOWbnuWbvuS4reaJgOacieeahOWciFxuICogQHBhcmFtIGluY2x1ZGUg5YyF5ZCr5oiW5o6S6Zmk5oyH5a6a55qE6IqC54K5XG4gKiBAcmV0dXJuIFt7W2tleTogc3RyaW5nXTogTm9kZX1dIOWMheWQq+aJgOacieeOr+eahOaVsOe7hO+8jOavj+S4queOr+eUqOS4gOS4qk9iamVjdOihqOekuu+8jOWFtuS4rWtleeS4uuiKgueCuWlk77yMdmFsdWXkuLror6XoioLngrnlnKjnjq/kuK3mjIflkJHnmoTkuIvkuIDkuKroioLngrlcbiAqL1xuXG5cbmV4cG9ydHMuZGV0ZWN0QWxsRGlyZWN0ZWRDeWNsZSA9IGRldGVjdEFsbERpcmVjdGVkQ3ljbGU7XG5cbnZhciBkZXRlY3RBbGxDeWNsZXMgPSBmdW5jdGlvbiBkZXRlY3RBbGxDeWNsZXMoZ3JhcGhEYXRhLCBkaXJlY3RlZCwgbm9kZUlkcywgaW5jbHVkZSkge1xuICBpZiAoaW5jbHVkZSA9PT0gdm9pZCAwKSB7XG4gICAgaW5jbHVkZSA9IHRydWU7XG4gIH1cblxuICBpZiAoZGlyZWN0ZWQpIHJldHVybiBkZXRlY3RBbGxEaXJlY3RlZEN5Y2xlKGdyYXBoRGF0YSwgbm9kZUlkcywgaW5jbHVkZSk7XG4gIHJldHVybiBkZXRlY3RBbGxVbmRpcmVjdGVkQ3ljbGUoZ3JhcGhEYXRhLCBub2RlSWRzLCBpbmNsdWRlKTtcbn07XG5cbmV4cG9ydHMuZGV0ZWN0QWxsQ3ljbGVzID0gZGV0ZWN0QWxsQ3ljbGVzO1xudmFyIF9kZWZhdWx0ID0gZGV0ZWN0RGlyZWN0ZWRDeWNsZTtcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///303\n')},function(module,exports,__webpack_require__){"use strict";eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.findAllPath = exports.findShortestPath = void 0;\n\nvar _dijkstra = _interopRequireDefault(__webpack_require__(151));\n\nvar _util = __webpack_require__(45);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar findShortestPath = function findShortestPath(graphData, start, end, directed, weightPropertyName) {\n var _a = (0, _dijkstra.default)(graphData, start, directed, weightPropertyName),\n length = _a.length,\n path = _a.path,\n allPath = _a.allPath;\n\n return {\n length: length[end],\n path: path[end],\n allPath: allPath[end]\n };\n};\n\nexports.findShortestPath = findShortestPath;\n\nvar findAllPath = function findAllPath(graphData, start, end, directed) {\n var _a;\n\n if (start === end) return [[start]];\n var _b = graphData.edges,\n edges = _b === void 0 ? [] : _b;\n var visited = [start];\n var isVisited = (_a = {}, _a[start] = true, _a);\n var stack = []; // 辅助栈,用于存储访问过的节点的邻居节点\n\n var allPath = [];\n var neighbors = directed ? (0, _util.getNeighbors)(start, edges, 'target') : (0, _util.getNeighbors)(start, edges);\n stack.push(neighbors);\n\n while (visited.length > 0 && stack.length > 0) {\n var children = stack[stack.length - 1];\n\n if (children.length) {\n var child = children.shift();\n\n if (child) {\n visited.push(child);\n isVisited[child] = true;\n neighbors = directed ? (0, _util.getNeighbors)(child, edges, 'target') : (0, _util.getNeighbors)(child, edges);\n stack.push(neighbors.filter(function (neighbor) {\n return !isVisited[neighbor];\n }));\n }\n } else {\n var node = visited.pop();\n isVisited[node] = false;\n stack.pop();\n continue;\n }\n\n if (visited[visited.length - 1] === end) {\n var path = visited.map(function (node) {\n return node;\n });\n allPath.push(path);\n var node = visited.pop();\n isVisited[node] = false;\n stack.pop();\n }\n }\n\n return allPath;\n};\n\nexports.findAllPath = findAllPath;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvYWxnb3JpdGhtL2xpYi9maW5kLXBhdGguanM/OThlMiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBYTs7QUFFYjtBQUNBO0FBQ0EsQ0FBQztBQUNEOztBQUVBLHVDQUF1QyxtQkFBTyxDQUFDLEdBQVk7O0FBRTNELFlBQVksbUJBQU8sQ0FBQyxFQUFROztBQUU1QixzQ0FBc0MsdUNBQXVDLGdCQUFnQjs7QUFFN0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQixpQkFBaUI7O0FBRWpCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBIiwiZmlsZSI6IjMwNC5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5maW5kQWxsUGF0aCA9IGV4cG9ydHMuZmluZFNob3J0ZXN0UGF0aCA9IHZvaWQgMDtcblxudmFyIF9kaWprc3RyYSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vZGlqa3N0cmFcIikpO1xuXG52YXIgX3V0aWwgPSByZXF1aXJlKFwiLi91dGlsXCIpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG52YXIgZmluZFNob3J0ZXN0UGF0aCA9IGZ1bmN0aW9uIGZpbmRTaG9ydGVzdFBhdGgoZ3JhcGhEYXRhLCBzdGFydCwgZW5kLCBkaXJlY3RlZCwgd2VpZ2h0UHJvcGVydHlOYW1lKSB7XG4gIHZhciBfYSA9ICgwLCBfZGlqa3N0cmEuZGVmYXVsdCkoZ3JhcGhEYXRhLCBzdGFydCwgZGlyZWN0ZWQsIHdlaWdodFByb3BlcnR5TmFtZSksXG4gICAgICBsZW5ndGggPSBfYS5sZW5ndGgsXG4gICAgICBwYXRoID0gX2EucGF0aCxcbiAgICAgIGFsbFBhdGggPSBfYS5hbGxQYXRoO1xuXG4gIHJldHVybiB7XG4gICAgbGVuZ3RoOiBsZW5ndGhbZW5kXSxcbiAgICBwYXRoOiBwYXRoW2VuZF0sXG4gICAgYWxsUGF0aDogYWxsUGF0aFtlbmRdXG4gIH07XG59O1xuXG5leHBvcnRzLmZpbmRTaG9ydGVzdFBhdGggPSBmaW5kU2hvcnRlc3RQYXRoO1xuXG52YXIgZmluZEFsbFBhdGggPSBmdW5jdGlvbiBmaW5kQWxsUGF0aChncmFwaERhdGEsIHN0YXJ0LCBlbmQsIGRpcmVjdGVkKSB7XG4gIHZhciBfYTtcblxuICBpZiAoc3RhcnQgPT09IGVuZCkgcmV0dXJuIFtbc3RhcnRdXTtcbiAgdmFyIF9iID0gZ3JhcGhEYXRhLmVkZ2VzLFxuICAgICAgZWRnZXMgPSBfYiA9PT0gdm9pZCAwID8gW10gOiBfYjtcbiAgdmFyIHZpc2l0ZWQgPSBbc3RhcnRdO1xuICB2YXIgaXNWaXNpdGVkID0gKF9hID0ge30sIF9hW3N0YXJ0XSA9IHRydWUsIF9hKTtcbiAgdmFyIHN0YWNrID0gW107IC8vIOi+heWKqeagiO+8jOeUqOS6juWtmOWCqOiuv+mXrui/h+eahOiKgueCueeahOmCu+WxheiKgueCuVxuXG4gIHZhciBhbGxQYXRoID0gW107XG4gIHZhciBuZWlnaGJvcnMgPSBkaXJlY3RlZCA/ICgwLCBfdXRpbC5nZXROZWlnaGJvcnMpKHN0YXJ0LCBlZGdlcywgJ3RhcmdldCcpIDogKDAsIF91dGlsLmdldE5laWdoYm9ycykoc3RhcnQsIGVkZ2VzKTtcbiAgc3RhY2sucHVzaChuZWlnaGJvcnMpO1xuXG4gIHdoaWxlICh2aXNpdGVkLmxlbmd0aCA+IDAgJiYgc3RhY2subGVuZ3RoID4gMCkge1xuICAgIHZhciBjaGlsZHJlbiA9IHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdO1xuXG4gICAgaWYgKGNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgdmFyIGNoaWxkID0gY2hpbGRyZW4uc2hpZnQoKTtcblxuICAgICAgaWYgKGNoaWxkKSB7XG4gICAgICAgIHZpc2l0ZWQucHVzaChjaGlsZCk7XG4gICAgICAgIGlzVmlzaXRlZFtjaGlsZF0gPSB0cnVlO1xuICAgICAgICBuZWlnaGJvcnMgPSBkaXJlY3RlZCA/ICgwLCBfdXRpbC5nZXROZWlnaGJvcnMpKGNoaWxkLCBlZGdlcywgJ3RhcmdldCcpIDogKDAsIF91dGlsLmdldE5laWdoYm9ycykoY2hpbGQsIGVkZ2VzKTtcbiAgICAgICAgc3RhY2sucHVzaChuZWlnaGJvcnMuZmlsdGVyKGZ1bmN0aW9uIChuZWlnaGJvcikge1xuICAgICAgICAgIHJldHVybiAhaXNWaXNpdGVkW25laWdoYm9yXTtcbiAgICAgICAgfSkpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgbm9kZSA9IHZpc2l0ZWQucG9wKCk7XG4gICAgICBpc1Zpc2l0ZWRbbm9kZV0gPSBmYWxzZTtcbiAgICAgIHN0YWNrLnBvcCgpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHZpc2l0ZWRbdmlzaXRlZC5sZW5ndGggLSAxXSA9PT0gZW5kKSB7XG4gICAgICB2YXIgcGF0aCA9IHZpc2l0ZWQubWFwKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgICAgfSk7XG4gICAgICBhbGxQYXRoLnB1c2gocGF0aCk7XG4gICAgICB2YXIgbm9kZSA9IHZpc2l0ZWQucG9wKCk7XG4gICAgICBpc1Zpc2l0ZWRbbm9kZV0gPSBmYWxzZTtcbiAgICAgIHN0YWNrLnBvcCgpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBhbGxQYXRoO1xufTtcblxuZXhwb3J0cy5maW5kQWxsUGF0aCA9IGZpbmRBbGxQYXRoOyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///304\n")},function(module,exports,__webpack_require__){"use strict";eval('\n\nObject.defineProperty(exports, "__esModule", {\n value: true\n});\nexports.default = void 0;\n\nvar _adjacentMatrix = _interopRequireDefault(__webpack_require__(98));\n\nvar _util = __webpack_require__(45);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * 标签传播算法\n * @param graphData 图数据\n * @param directed 是否有向图,默认为 false\n * @param weightPropertyName 权重的属性字段\n * @param maxIteration 最大迭代次数\n */\nvar labelPropagation = function labelPropagation(graphData, directed, weightPropertyName, maxIteration) {\n if (directed === void 0) {\n directed = false;\n }\n\n if (weightPropertyName === void 0) {\n weightPropertyName = \'weight\';\n }\n\n if (maxIteration === void 0) {\n maxIteration = 1000;\n } // the origin data\n\n\n var _a = graphData.nodes,\n nodes = _a === void 0 ? [] : _a,\n _b = graphData.edges,\n edges = _b === void 0 ? [] : _b;\n var clusters = {};\n var nodeMap = {}; // init the clusters and nodeMap\n\n nodes.forEach(function (node, i) {\n var cid = (0, _util.uniqueId)();\n node.clusterId = cid;\n clusters[cid] = {\n id: cid,\n nodes: [node]\n };\n nodeMap[node.id] = {\n node: node,\n idx: i\n };\n }); // the adjacent matrix of calNodes inside clusters\n\n var adjMatrix = (0, _adjacentMatrix.default)(graphData, directed); // the sum of each row in adjacent matrix\n\n var ks = [];\n /**\n * neighbor nodes (id for key and weight for value) for each node\n * neighbors = {\n * id(node_id): { id(neighbor_1_id): weight(weight of the edge), id(neighbor_2_id): weight(weight of the edge), ... },\n * ...\n * }\n */\n\n var neighbors = {};\n adjMatrix.forEach(function (row, i) {\n var k = 0;\n var iid = nodes[i].id;\n neighbors[iid] = {};\n row.forEach(function (entry, j) {\n if (!entry) return;\n k += entry;\n var jid = nodes[j].id;\n neighbors[iid][jid] = entry;\n });\n ks.push(k);\n });\n var iter = 0;\n\n var _loop_1 = function _loop_1() {\n var changed = false;\n nodes.forEach(function (node) {\n var neighborClusters = {};\n Object.keys(neighbors[node.id]).forEach(function (neighborId) {\n var neighborWeight = neighbors[node.id][neighborId];\n var neighborNode = nodeMap[neighborId].node;\n var neighborClusterId = neighborNode.clusterId;\n if (!neighborClusters[neighborClusterId]) neighborClusters[neighborClusterId] = 0;\n neighborClusters[neighborClusterId] += neighborWeight;\n }); // find the cluster with max weight\n\n var maxWeight = -Infinity;\n var bestClusterIds = [];\n Object.keys(neighborClusters).forEach(function (clusterId) {\n if (maxWeight < neighborClusters[clusterId]) {\n maxWeight = neighborClusters[clusterId];\n bestClusterIds = [clusterId];\n } else if (maxWeight === neighborClusters[clusterId]) {\n bestClusterIds.push(clusterId);\n }\n });\n if (bestClusterIds.length === 1 && bestClusterIds[0] === node.clusterId) return;\n var selfClusterIdx = bestClusterIds.indexOf(node.clusterId);\n if (selfClusterIdx >= 0) bestClusterIds.splice(selfClusterIdx, 1);\n\n if (bestClusterIds && bestClusterIds.length) {\n changed = true; // remove from origin cluster\n\n var selfCluster = clusters[node.clusterId];\n var nodeInSelfClusterIdx = selfCluster.nodes.indexOf(node);\n selfCluster.nodes.splice(nodeInSelfClusterIdx, 1); // move the node to the best cluster\n\n var randomIdx = Math.floor(Math.random() * bestClusterIds.length);\n var bestCluster = clusters[bestClusterIds[randomIdx]];\n bestCluster.nodes.push(node);\n node.clusterId = bestCluster.id;\n }\n });\n if (!changed) return "break";\n iter++;\n };\n\n while (iter < maxIteration) {\n var state_1 = _loop_1();\n\n if (state_1 === "break") break;\n } // delete the empty clusters\n\n\n Object.keys(clusters).forEach(function (clusterId) {\n var cluster = clusters[clusterId];\n\n if (!cluster.nodes || !cluster.nodes.length) {\n delete clusters[clusterId];\n }\n }); // get the cluster edges\n\n var clusterEdges = [];\n var clusterEdgeMap = {};\n edges.forEach(function (edge) {\n var source = edge.source,\n target = edge.target;\n var weight = edge[weightPropertyName] || 1;\n var sourceClusterId = nodeMap[source].node.clusterId;\n var targetClusterId = nodeMap[target].node.clusterId;\n var newEdgeId = sourceClusterId + "---" + targetClusterId;\n\n if (clusterEdgeMap[newEdgeId]) {\n clusterEdgeMap[newEdgeId].weight += weight;\n clusterEdgeMap[newEdgeId].count++;\n } else {\n var newEdge = {\n source: sourceClusterId,\n target: targetClusterId,\n weight: weight,\n count: 1\n };\n clusterEdgeMap[newEdgeId] = newEdge;\n clusterEdges.push(newEdge);\n }\n });\n var clustersArray = [];\n Object.keys(clusters).forEach(function (clusterId) {\n clustersArray.push(clusters[clusterId]);\n });\n return {\n clusters: clustersArray,\n clusterEdges: clusterEdges\n };\n};\n\nvar _default = labelPropagation;\nexports.default = _default;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvYWxnb3JpdGhtL2xpYi9sYWJlbC1wcm9wYWdhdGlvbi5qcz82MWJjIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFhOztBQUViO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7O0FBRUEsNkNBQTZDLG1CQUFPLENBQUMsRUFBbUI7O0FBRXhFLFlBQVksbUJBQU8sQ0FBQyxFQUFROztBQUU1QixzQ0FBc0MsdUNBQXVDLGdCQUFnQjs7QUFFN0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7O0FBRW5CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHLEVBQUU7O0FBRUwsb0VBQW9FOztBQUVwRTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixvR0FBb0c7QUFDeEg7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTyxFQUFFOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHVCQUF1Qjs7QUFFdkI7QUFDQTtBQUNBLDBEQUEwRDs7QUFFMUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRyxFQUFFOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EiLCJmaWxlIjoiMzA1LmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5cbnZhciBfYWRqYWNlbnRNYXRyaXggPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2FkamFjZW50LW1hdHJpeFwiKSk7XG5cbnZhciBfdXRpbCA9IHJlcXVpcmUoXCIuL3V0aWxcIik7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbi8qKlxuICog5qCH562+5Lyg5pKt566X5rOVXG4gKiBAcGFyYW0gZ3JhcGhEYXRhIOWbvuaVsOaNrlxuICogQHBhcmFtIGRpcmVjdGVkIOaYr+WQpuacieWQkeWbvu+8jOm7mOiupOS4uiBmYWxzZVxuICogQHBhcmFtIHdlaWdodFByb3BlcnR5TmFtZSDmnYPph43nmoTlsZ7mgKflrZfmrrVcbiAqIEBwYXJhbSBtYXhJdGVyYXRpb24g5pyA5aSn6L+t5Luj5qyh5pWwXG4gKi9cbnZhciBsYWJlbFByb3BhZ2F0aW9uID0gZnVuY3Rpb24gbGFiZWxQcm9wYWdhdGlvbihncmFwaERhdGEsIGRpcmVjdGVkLCB3ZWlnaHRQcm9wZXJ0eU5hbWUsIG1heEl0ZXJhdGlvbikge1xuICBpZiAoZGlyZWN0ZWQgPT09IHZvaWQgMCkge1xuICAgIGRpcmVjdGVkID0gZmFsc2U7XG4gIH1cblxuICBpZiAod2VpZ2h0UHJvcGVydHlOYW1lID09PSB2b2lkIDApIHtcbiAgICB3ZWlnaHRQcm9wZXJ0eU5hbWUgPSAnd2VpZ2h0JztcbiAgfVxuXG4gIGlmIChtYXhJdGVyYXRpb24gPT09IHZvaWQgMCkge1xuICAgIG1heEl0ZXJhdGlvbiA9IDEwMDA7XG4gIH0gLy8gdGhlIG9yaWdpbiBkYXRhXG5cblxuICB2YXIgX2EgPSBncmFwaERhdGEubm9kZXMsXG4gICAgICBub2RlcyA9IF9hID09PSB2b2lkIDAgPyBbXSA6IF9hLFxuICAgICAgX2IgPSBncmFwaERhdGEuZWRnZXMsXG4gICAgICBlZGdlcyA9IF9iID09PSB2b2lkIDAgPyBbXSA6IF9iO1xuICB2YXIgY2x1c3RlcnMgPSB7fTtcbiAgdmFyIG5vZGVNYXAgPSB7fTsgLy8gaW5pdCB0aGUgY2x1c3RlcnMgYW5kIG5vZGVNYXBcblxuICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChub2RlLCBpKSB7XG4gICAgdmFyIGNpZCA9ICgwLCBfdXRpbC51bmlxdWVJZCkoKTtcbiAgICBub2RlLmNsdXN0ZXJJZCA9IGNpZDtcbiAgICBjbHVzdGVyc1tjaWRdID0ge1xuICAgICAgaWQ6IGNpZCxcbiAgICAgIG5vZGVzOiBbbm9kZV1cbiAgICB9O1xuICAgIG5vZGVNYXBbbm9kZS5pZF0gPSB7XG4gICAgICBub2RlOiBub2RlLFxuICAgICAgaWR4OiBpXG4gICAgfTtcbiAgfSk7IC8vIHRoZSBhZGphY2VudCBtYXRyaXggb2YgY2FsTm9kZXMgaW5zaWRlIGNsdXN0ZXJzXG5cbiAgdmFyIGFkak1hdHJpeCA9ICgwLCBfYWRqYWNlbnRNYXRyaXguZGVmYXVsdCkoZ3JhcGhEYXRhLCBkaXJlY3RlZCk7IC8vIHRoZSBzdW0gb2YgZWFjaCByb3cgaW4gYWRqYWNlbnQgbWF0cml4XG5cbiAgdmFyIGtzID0gW107XG4gIC8qKlxuICAgKiBuZWlnaGJvciBub2RlcyAoaWQgZm9yIGtleSBhbmQgd2VpZ2h0IGZvciB2YWx1ZSkgZm9yIGVhY2ggbm9kZVxuICAgKiBuZWlnaGJvcnMgPSB7XG4gICAqICBpZChub2RlX2lkKTogeyBpZChuZWlnaGJvcl8xX2lkKTogd2VpZ2h0KHdlaWdodCBvZiB0aGUgZWRnZSksIGlkKG5laWdoYm9yXzJfaWQpOiB3ZWlnaHQod2VpZ2h0IG9mIHRoZSBlZGdlKSwgLi4uIH0sXG4gICAqICAuLi5cbiAgICogfVxuICAgKi9cblxuICB2YXIgbmVpZ2hib3JzID0ge307XG4gIGFkak1hdHJpeC5mb3JFYWNoKGZ1bmN0aW9uIChyb3csIGkpIHtcbiAgICB2YXIgayA9IDA7XG4gICAgdmFyIGlpZCA9IG5vZGVzW2ldLmlkO1xuICAgIG5laWdoYm9yc1tpaWRdID0ge307XG4gICAgcm93LmZvckVhY2goZnVuY3Rpb24gKGVudHJ5LCBqKSB7XG4gICAgICBpZiAoIWVudHJ5KSByZXR1cm47XG4gICAgICBrICs9IGVudHJ5O1xuICAgICAgdmFyIGppZCA9IG5vZGVzW2pdLmlkO1xuICAgICAgbmVpZ2hib3JzW2lpZF1bamlkXSA9IGVudHJ5O1xuICAgIH0pO1xuICAgIGtzLnB1c2goayk7XG4gIH0pO1xuICB2YXIgaXRlciA9IDA7XG5cbiAgdmFyIF9sb29wXzEgPSBmdW5jdGlvbiBfbG9vcF8xKCkge1xuICAgIHZhciBjaGFuZ2VkID0gZmFsc2U7XG4gICAgbm9kZXMuZm9yRWFjaChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgdmFyIG5laWdoYm9yQ2x1c3RlcnMgPSB7fTtcbiAgICAgIE9iamVjdC5rZXlzKG5laWdoYm9yc1tub2RlLmlkXSkuZm9yRWFjaChmdW5jdGlvbiAobmVpZ2hib3JJZCkge1xuICAgICAgICB2YXIgbmVpZ2hib3JXZWlnaHQgPSBuZWlnaGJvcnNbbm9kZS5pZF1bbmVpZ2hib3JJZF07XG4gICAgICAgIHZhciBuZWlnaGJvck5vZGUgPSBub2RlTWFwW25laWdoYm9ySWRdLm5vZGU7XG4gICAgICAgIHZhciBuZWlnaGJvckNsdXN0ZXJJZCA9IG5laWdoYm9yTm9kZS5jbHVzdGVySWQ7XG4gICAgICAgIGlmICghbmVpZ2hib3JDbHVzdGVyc1tuZWlnaGJvckNsdXN0ZXJJZF0pIG5laWdoYm9yQ2x1c3RlcnNbbmVpZ2hib3JDbHVzdGVySWRdID0gMDtcbiAgICAgICAgbmVpZ2hib3JDbHVzdGVyc1tuZWlnaGJvckNsdXN0ZXJJZF0gKz0gbmVpZ2hib3JXZWlnaHQ7XG4gICAgICB9KTsgLy8gZmluZCB0aGUgY2x1c3RlciB3aXRoIG1heCB3ZWlnaHRcblxuICAgICAgdmFyIG1heFdlaWdodCA9IC1JbmZpbml0eTtcbiAgICAgIHZhciBiZXN0Q2x1c3RlcklkcyA9IFtdO1xuICAgICAgT2JqZWN0LmtleXMobmVpZ2hib3JDbHVzdGVycykuZm9yRWFjaChmdW5jdGlvbiAoY2x1c3RlcklkKSB7XG4gICAgICAgIGlmIChtYXhXZWlnaHQgPCBuZWlnaGJvckNsdXN0ZXJzW2NsdXN0ZXJJZF0pIHtcbiAgICAgICAgICBtYXhXZWlnaHQgPSBuZWlnaGJvckNsdXN0ZXJzW2NsdXN0ZXJJZF07XG4gICAgICAgICAgYmVzdENsdXN0ZXJJZHMgPSBbY2x1c3RlcklkXTtcbiAgICAgICAgfSBlbHNlIGlmIChtYXhXZWlnaHQgPT09IG5laWdoYm9yQ2x1c3RlcnNbY2x1c3RlcklkXSkge1xuICAgICAgICAgIGJlc3RDbHVzdGVySWRzLnB1c2goY2x1c3RlcklkKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBpZiAoYmVzdENsdXN0ZXJJZHMubGVuZ3RoID09PSAxICYmIGJlc3RDbHVzdGVySWRzWzBdID09PSBub2RlLmNsdXN0ZXJJZCkgcmV0dXJuO1xuICAgICAgdmFyIHNlbGZDbHVzdGVySWR4ID0gYmVzdENsdXN0ZXJJZHMuaW5kZXhPZihub2RlLmNsdXN0ZXJJZCk7XG4gICAgICBpZiAoc2VsZkNsdXN0ZXJJZHggPj0gMCkgYmVzdENsdXN0ZXJJZHMuc3BsaWNlKHNlbGZDbHVzdGVySWR4LCAxKTtcblxuICAgICAgaWYgKGJlc3RDbHVzdGVySWRzICYmIGJlc3RDbHVzdGVySWRzLmxlbmd0aCkge1xuICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsgLy8gcmVtb3ZlIGZyb20gb3JpZ2luIGNsdXN0ZXJcblxuICAgICAgICB2YXIgc2VsZkNsdXN0ZXIgPSBjbHVzdGVyc1tub2RlLmNsdXN0ZXJJZF07XG4gICAgICAgIHZhciBub2RlSW5TZWxmQ2x1c3RlcklkeCA9IHNlbGZDbHVzdGVyLm5vZGVzLmluZGV4T2Yobm9kZSk7XG4gICAgICAgIHNlbGZDbHVzdGVyLm5vZGVzLnNwbGljZShub2RlSW5TZWxmQ2x1c3RlcklkeCwgMSk7IC8vIG1vdmUgdGhlIG5vZGUgdG8gdGhlIGJlc3QgY2x1c3RlclxuXG4gICAgICAgIHZhciByYW5kb21JZHggPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBiZXN0Q2x1c3Rlcklkcy5sZW5ndGgpO1xuICAgICAgICB2YXIgYmVzdENsdXN0ZXIgPSBjbHVzdGVyc1tiZXN0Q2x1c3Rlcklkc1tyYW5kb21JZHhdXTtcbiAgICAgICAgYmVzdENsdXN0ZXIubm9kZXMucHVzaChub2RlKTtcbiAgICAgICAgbm9kZS5jbHVzdGVySWQgPSBiZXN0Q2x1c3Rlci5pZDtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoIWNoYW5nZWQpIHJldHVybiBcImJyZWFrXCI7XG4gICAgaXRlcisrO1xuICB9O1xuXG4gIHdoaWxlIChpdGVyIDwgbWF4SXRlcmF0aW9uKSB7XG4gICAgdmFyIHN0YXRlXzEgPSBfbG9vcF8xKCk7XG5cbiAgICBpZiAoc3RhdGVfMSA9PT0gXCJicmVha1wiKSBicmVhaztcbiAgfSAvLyBkZWxldGUgdGhlIGVtcHR5IGNsdXN0ZXJzXG5cblxuICBPYmplY3Qua2V5cyhjbHVzdGVycykuZm9yRWFjaChmdW5jdGlvbiAoY2x1c3RlcklkKSB7XG4gICAgdmFyIGNsdXN0ZXIgPSBjbHVzdGVyc1tjbHVzdGVySWRdO1xuXG4gICAgaWYgKCFjbHVzdGVyLm5vZGVzIHx8ICFjbHVzdGVyLm5vZGVzLmxlbmd0aCkge1xuICAgICAgZGVsZXRlIGNsdXN0ZXJzW2NsdXN0ZXJJZF07XG4gICAgfVxuICB9KTsgLy8gZ2V0IHRoZSBjbHVzdGVyIGVkZ2VzXG5cbiAgdmFyIGNsdXN0ZXJFZGdlcyA9IFtdO1xuICB2YXIgY2x1c3RlckVkZ2VNYXAgPSB7fTtcbiAgZWRnZXMuZm9yRWFjaChmdW5jdGlvbiAoZWRnZSkge1xuICAgIHZhciBzb3VyY2UgPSBlZGdlLnNvdXJjZSxcbiAgICAgICAgdGFyZ2V0ID0gZWRnZS50YXJnZXQ7XG4gICAgdmFyIHdlaWdodCA9IGVkZ2Vbd2VpZ2h0UHJvcGVydHlOYW1lXSB8fCAxO1xuICAgIHZhciBzb3VyY2VDbHVzdGVySWQgPSBub2RlTWFwW3NvdXJjZV0ubm9kZS5jbHVzdGVySWQ7XG4gICAgdmFyIHRhcmdldENsdXN0ZXJJZCA9IG5vZGVNYXBbdGFyZ2V0XS5ub2RlLmNsdXN0ZXJJZDtcbiAgICB2YXIgbmV3RWRnZUlkID0gc291cmNlQ2x1c3RlcklkICsgXCItLS1cIiArIHRhcmdldENsdXN0ZXJJZDtcblxuICAgIGlmIChjbHVzdGVyRWRnZU1hcFtuZXdFZGdlSWRdKSB7XG4gICAgICBjbHVzdGVyRWRnZU1hcFtuZXdFZGdlSWRdLndlaWdodCArPSB3ZWlnaHQ7XG4gICAgICBjbHVzdGVyRWRnZU1hcFtuZXdFZGdlSWRdLmNvdW50Kys7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBuZXdFZGdlID0ge1xuICAgICAgICBzb3VyY2U6IHNvdXJjZUNsdXN0ZXJJZCxcbiAgICAgICAgdGFyZ2V0OiB0YXJnZXRDbHVzdGVySWQsXG4gICAgICAgIHdlaWdodDogd2VpZ2h0LFxuICAgICAgICBjb3VudDogMVxuICAgICAgfTtcbiAgICAgIGNsdXN0ZXJFZGdlTWFwW25ld0VkZ2VJZF0gPSBuZXdFZGdlO1xuICAgICAgY2x1c3RlckVkZ2VzLnB1c2gobmV3RWRnZSk7XG4gICAgfVxuICB9KTtcbiAgdmFyIGNsdXN0ZXJzQXJyYXkgPSBbXTtcbiAgT2JqZWN0LmtleXMoY2x1c3RlcnMpLmZvckVhY2goZnVuY3Rpb24gKGNsdXN0ZXJJZCkge1xuICAgIGNsdXN0ZXJzQXJyYXkucHVzaChjbHVzdGVyc1tjbHVzdGVySWRdKTtcbiAgfSk7XG4gIHJldHVybiB7XG4gICAgY2x1c3RlcnM6IGNsdXN0ZXJzQXJyYXksXG4gICAgY2x1c3RlckVkZ2VzOiBjbHVzdGVyRWRnZXNcbiAgfTtcbn07XG5cbnZhciBfZGVmYXVsdCA9IGxhYmVsUHJvcGFnYXRpb247XG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///305\n')},function(module,exports,__webpack_require__){"use strict";eval('\n\nObject.defineProperty(exports, "__esModule", {\n value: true\n});\nexports.default = void 0;\n\nvar _adjacentMatrix = _interopRequireDefault(__webpack_require__(98));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar getModularity = function getModularity(nodes, adjMatrix, ks, m) {\n var length = adjMatrix.length;\n var param = 2 * m;\n var modularity = 0;\n\n for (var i = 0; i < length; i++) {\n var clusteri = nodes[i].clusterId;\n\n for (var j = 0; j < length; j++) {\n var clusterj = nodes[j].clusterId;\n if (clusteri !== clusterj) continue;\n var entry = adjMatrix[i][j] || 0;\n var ki = ks[i] || 0;\n var kj = ks[j] || 0;\n modularity += entry - ki * kj / param;\n }\n }\n\n modularity *= 1 / param;\n return modularity;\n};\n/**\n * 社区发现 louvain 算法\n * @param graphData 图数据\n * @param directed 是否有向图,默认为 false\n * @param weightPropertyName 权重的属性字段\n * @param threshold\n */\n\n\nvar louvain = function louvain(graphData, directed, weightPropertyName, threshold) {\n if (directed === void 0) {\n directed = false;\n }\n\n if (weightPropertyName === void 0) {\n weightPropertyName = \'weight\';\n }\n\n if (threshold === void 0) {\n threshold = 0.0001;\n } // the origin data\n\n\n var _a = graphData.nodes,\n nodes = _a === void 0 ? [] : _a,\n _b = graphData.edges,\n edges = _b === void 0 ? [] : _b;\n var uniqueId = 1;\n var clusters = {};\n var nodeMap = {}; // init the clusters and nodeMap\n\n nodes.forEach(function (node, i) {\n var cid = String(uniqueId++);\n node.clusterId = cid;\n clusters[cid] = {\n id: cid,\n nodes: [node]\n };\n nodeMap[node.id] = {\n node: node,\n idx: i\n };\n }); // the adjacent matrix of calNodes inside clusters\n\n var adjMatrix = (0, _adjacentMatrix.default)(graphData, directed); // the sum of each row in adjacent matrix\n\n var ks = [];\n /**\n * neighbor nodes (id for key and weight for value) for each node\n * neighbors = {\n * id(node_id): { id(neighbor_1_id): weight(weight of the edge), id(neighbor_2_id): weight(weight of the edge), ... },\n * ...\n * }\n */\n\n var neighbors = {}; // the sum of the weights of all edges in the graph\n\n var m = 0;\n adjMatrix.forEach(function (row, i) {\n var k = 0;\n var iid = nodes[i].id;\n neighbors[iid] = {};\n row.forEach(function (entry, j) {\n if (!entry) return;\n k += entry;\n var jid = nodes[j].id;\n neighbors[iid][jid] = entry;\n m += entry;\n });\n ks.push(k);\n });\n m /= 2;\n var totalModularity = Infinity;\n var previousModularity = Infinity;\n var iter = 0;\n\n while (true) {\n // whether to terminate the iterations\n totalModularity = getModularity(nodes, adjMatrix, ks, m);\n if (Math.abs(totalModularity - previousModularity) < threshold || iter > 100) break;\n previousModularity = totalModularity;\n iter++; // pre compute some values for current clusters\n\n Object.keys(clusters).forEach(function (clusterId) {\n // sum of weights of edges to nodes in cluster\n var sumTot = 0;\n edges.forEach(function (edge) {\n var source = edge.source,\n target = edge.target;\n var sourceClusterId = nodeMap[source].node.clusterId;\n var targetClusterId = nodeMap[target].node.clusterId;\n\n if (sourceClusterId === clusterId && targetClusterId !== clusterId || targetClusterId === clusterId && sourceClusterId !== clusterId) {\n sumTot = sumTot + (edge[weightPropertyName] || 1);\n }\n });\n clusters[clusterId].sumTot = sumTot;\n }); // move the nodes to increase the delta modularity\n\n nodes.forEach(function (node, i) {\n var selfCluster = clusters[node.clusterId];\n var bestIncrease = 0;\n var bestCluster;\n var commonParam = ks[i] / (2 * m); // sum of weights of edges from node to nodes in cluster\n\n var kiin = 0;\n var selfClusterNodes = selfCluster.nodes;\n selfClusterNodes.forEach(function (scNode) {\n var scNodeIdx = nodeMap[scNode.id].idx;\n kiin += adjMatrix[i][scNodeIdx] || 0;\n }); // the modurarity for **removing** the node i from the origin cluster of node i\n\n var removeModurarity = kiin - selfCluster.sumTot * commonParam; // the neightbors of the node\n\n var nodeNeighborIds = neighbors[node.id];\n Object.keys(nodeNeighborIds).forEach(function (neighborNodeId) {\n var neighborNode = nodeMap[neighborNodeId].node;\n var neighborClusterId = neighborNode.clusterId; // if the node and the neighbor of node are in the same cluster, reutrn\n\n if (neighborClusterId === node.clusterId) return;\n var neighborCluster = clusters[neighborClusterId];\n var clusterNodes = neighborCluster.nodes; // if the cluster is empty, remove the cluster and return\n\n if (!clusterNodes || !clusterNodes.length) return; // sum of weights of edges from node to nodes in cluster\n\n var neighborClusterKiin = 0;\n clusterNodes.forEach(function (cNode) {\n var cNodeIdx = nodeMap[cNode.id].idx;\n neighborClusterKiin += adjMatrix[i][cNodeIdx] || 0;\n }); // modurarity for **adding** node i into this neighbor cluster\n\n var addModurarity = neighborClusterKiin - neighborCluster.sumTot * commonParam; // the increase modurarity is the difference between addModurarity and removeModurarity\n\n var increase = addModurarity - removeModurarity; // find the best cluster to move node i into\n\n if (increase > bestIncrease) {\n bestIncrease = increase;\n bestCluster = neighborCluster;\n }\n }); // if found a best cluster to move into\n\n if (bestIncrease > 0) {\n bestCluster.nodes.push(node);\n var previousClusterId_1 = node.clusterId;\n node.clusterId = bestCluster.id; // move the node to the best cluster\n\n var nodeInSelfClusterIdx = selfCluster.nodes.indexOf(node); // remove from origin cluster\n\n selfCluster.nodes.splice(nodeInSelfClusterIdx, 1); // update sumTot for clusters\n // sum of weights of edges to nodes in cluster\n\n var neighborClusterSumTot_1 = 0;\n var selfClusterSumTot_1 = 0;\n edges.forEach(function (edge) {\n var source = edge.source,\n target = edge.target;\n var sourceClusterId = nodeMap[source].node.clusterId;\n var targetClusterId = nodeMap[target].node.clusterId;\n\n if (sourceClusterId === bestCluster.id && targetClusterId !== bestCluster.id || targetClusterId === bestCluster.id && sourceClusterId !== bestCluster.id) {\n neighborClusterSumTot_1 = neighborClusterSumTot_1 + (edge[weightPropertyName] || 1);\n }\n\n if (sourceClusterId === previousClusterId_1 && targetClusterId !== previousClusterId_1 || targetClusterId === previousClusterId_1 && sourceClusterId !== previousClusterId_1) {\n selfClusterSumTot_1 = selfClusterSumTot_1 + (edge[weightPropertyName] || 1);\n }\n }); // the nodes of the clusters to move into and remove are changed, update their sumTot\n\n bestCluster.sumTot = neighborClusterSumTot_1;\n selfCluster.sumTot = selfClusterSumTot_1;\n }\n });\n } // delete the empty clusters, assign increasing clusterId\n\n\n var newClusterIdMap = {};\n var clusterIdx = 0;\n Object.keys(clusters).forEach(function (clusterId) {\n var cluster = clusters[clusterId];\n\n if (!cluster.nodes || !cluster.nodes.length) {\n delete clusters[clusterId];\n return;\n }\n\n var newId = String(clusterIdx + 1);\n\n if (newId === clusterId) {\n return;\n }\n\n cluster.id = newId;\n cluster.nodes = cluster.nodes.map(function (item) {\n return {\n id: item.id,\n clusterId: newId\n };\n });\n clusters[newId] = cluster;\n newClusterIdMap[clusterId] = newId;\n delete clusters[clusterId];\n clusterIdx++;\n });\n nodes.forEach(function (node) {\n if (node.clusterId && newClusterIdMap[node.clusterId]) node.clusterId = newClusterIdMap[node.clusterId];\n }); // get the cluster edges\n\n var clusterEdges = [];\n var clusterEdgeMap = {};\n edges.forEach(function (edge) {\n var source = edge.source,\n target = edge.target;\n var weight = edge[weightPropertyName] || 1;\n var sourceClusterId = nodeMap[source].node.clusterId;\n var targetClusterId = nodeMap[target].node.clusterId;\n var newEdgeId = sourceClusterId + "---" + targetClusterId;\n\n if (clusterEdgeMap[newEdgeId]) {\n clusterEdgeMap[newEdgeId].weight += weight;\n clusterEdgeMap[newEdgeId].count++;\n } else {\n var newEdge = {\n source: sourceClusterId,\n target: targetClusterId,\n weight: weight,\n count: 1\n };\n clusterEdgeMap[newEdgeId] = newEdge;\n clusterEdges.push(newEdge);\n }\n });\n var clustersArray = [];\n Object.keys(clusters).forEach(function (clusterId) {\n clustersArray.push(clusters[clusterId]);\n });\n return {\n clusters: clustersArray,\n clusterEdges: clusterEdges\n };\n};\n\nvar _default = louvain;\nexports.default = _default;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvYWxnb3JpdGhtL2xpYi9sb3V2YWluLmpzP2IxNGIiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWI7QUFDQTtBQUNBLENBQUM7QUFDRDs7QUFFQSw2Q0FBNkMsbUJBQU8sQ0FBQyxFQUFtQjs7QUFFeEUsc0NBQXNDLHVDQUF1QyxnQkFBZ0I7O0FBRTdGO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGlCQUFpQixZQUFZO0FBQzdCOztBQUVBLG1CQUFtQixZQUFZO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1COztBQUVuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRyxFQUFFOztBQUVMLG9FQUFvRTs7QUFFcEU7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0Isb0dBQW9HO0FBQ3hIO0FBQ0E7QUFDQTs7QUFFQSxxQkFBcUI7O0FBRXJCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7O0FBRVg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxLQUFLLEVBQUU7O0FBRVA7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0M7O0FBRXhDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPLEVBQUU7O0FBRVQscUVBQXFFOztBQUVyRTtBQUNBO0FBQ0E7QUFDQSx1REFBdUQ7O0FBRXZEO0FBQ0E7QUFDQSxpREFBaUQ7O0FBRWpELDBEQUEwRDs7QUFFMUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLEVBQUU7O0FBRVgsdUZBQXVGOztBQUV2Rix3REFBd0Q7O0FBRXhEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTyxFQUFFOztBQUVUO0FBQ0E7QUFDQTtBQUNBLHdDQUF3Qzs7QUFFeEMsbUVBQW1FOztBQUVuRSwwREFBMEQ7QUFDMUQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsRUFBRTs7QUFFWDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRzs7O0FBR0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRyxFQUFFOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EiLCJmaWxlIjoiMzA2LmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5cbnZhciBfYWRqYWNlbnRNYXRyaXggPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2FkamFjZW50LW1hdHJpeFwiKSk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbnZhciBnZXRNb2R1bGFyaXR5ID0gZnVuY3Rpb24gZ2V0TW9kdWxhcml0eShub2RlcywgYWRqTWF0cml4LCBrcywgbSkge1xuICB2YXIgbGVuZ3RoID0gYWRqTWF0cml4Lmxlbmd0aDtcbiAgdmFyIHBhcmFtID0gMiAqIG07XG4gIHZhciBtb2R1bGFyaXR5ID0gMDtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGNsdXN0ZXJpID0gbm9kZXNbaV0uY2x1c3RlcklkO1xuXG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBsZW5ndGg7IGorKykge1xuICAgICAgdmFyIGNsdXN0ZXJqID0gbm9kZXNbal0uY2x1c3RlcklkO1xuICAgICAgaWYgKGNsdXN0ZXJpICE9PSBjbHVzdGVyaikgY29udGludWU7XG4gICAgICB2YXIgZW50cnkgPSBhZGpNYXRyaXhbaV1bal0gfHwgMDtcbiAgICAgIHZhciBraSA9IGtzW2ldIHx8IDA7XG4gICAgICB2YXIga2ogPSBrc1tqXSB8fCAwO1xuICAgICAgbW9kdWxhcml0eSArPSBlbnRyeSAtIGtpICoga2ogLyBwYXJhbTtcbiAgICB9XG4gIH1cblxuICBtb2R1bGFyaXR5ICo9IDEgLyBwYXJhbTtcbiAgcmV0dXJuIG1vZHVsYXJpdHk7XG59O1xuLyoqXG4gKiDnpL7ljLrlj5HnjrAgbG91dmFpbiDnrpfms5VcbiAqIEBwYXJhbSBncmFwaERhdGEg5Zu+5pWw5o2uXG4gKiBAcGFyYW0gZGlyZWN0ZWQg5piv5ZCm5pyJ5ZCR5Zu+77yM6buY6K6k5Li6IGZhbHNlXG4gKiBAcGFyYW0gd2VpZ2h0UHJvcGVydHlOYW1lIOadg+mHjeeahOWxnuaAp+Wtl+autVxuICogQHBhcmFtIHRocmVzaG9sZFxuICovXG5cblxudmFyIGxvdXZhaW4gPSBmdW5jdGlvbiBsb3V2YWluKGdyYXBoRGF0YSwgZGlyZWN0ZWQsIHdlaWdodFByb3BlcnR5TmFtZSwgdGhyZXNob2xkKSB7XG4gIGlmIChkaXJlY3RlZCA9PT0gdm9pZCAwKSB7XG4gICAgZGlyZWN0ZWQgPSBmYWxzZTtcbiAgfVxuXG4gIGlmICh3ZWlnaHRQcm9wZXJ0eU5hbWUgPT09IHZvaWQgMCkge1xuICAgIHdlaWdodFByb3BlcnR5TmFtZSA9ICd3ZWlnaHQnO1xuICB9XG5cbiAgaWYgKHRocmVzaG9sZCA9PT0gdm9pZCAwKSB7XG4gICAgdGhyZXNob2xkID0gMC4wMDAxO1xuICB9IC8vIHRoZSBvcmlnaW4gZGF0YVxuXG5cbiAgdmFyIF9hID0gZ3JhcGhEYXRhLm5vZGVzLFxuICAgICAgbm9kZXMgPSBfYSA9PT0gdm9pZCAwID8gW10gOiBfYSxcbiAgICAgIF9iID0gZ3JhcGhEYXRhLmVkZ2VzLFxuICAgICAgZWRnZXMgPSBfYiA9PT0gdm9pZCAwID8gW10gOiBfYjtcbiAgdmFyIHVuaXF1ZUlkID0gMTtcbiAgdmFyIGNsdXN0ZXJzID0ge307XG4gIHZhciBub2RlTWFwID0ge307IC8vIGluaXQgdGhlIGNsdXN0ZXJzIGFuZCBub2RlTWFwXG5cbiAgbm9kZXMuZm9yRWFjaChmdW5jdGlvbiAobm9kZSwgaSkge1xuICAgIHZhciBjaWQgPSBTdHJpbmcodW5pcXVlSWQrKyk7XG4gICAgbm9kZS5jbHVzdGVySWQgPSBjaWQ7XG4gICAgY2x1c3RlcnNbY2lkXSA9IHtcbiAgICAgIGlkOiBjaWQsXG4gICAgICBub2RlczogW25vZGVdXG4gICAgfTtcbiAgICBub2RlTWFwW25vZGUuaWRdID0ge1xuICAgICAgbm9kZTogbm9kZSxcbiAgICAgIGlkeDogaVxuICAgIH07XG4gIH0pOyAvLyB0aGUgYWRqYWNlbnQgbWF0cml4IG9mIGNhbE5vZGVzIGluc2lkZSBjbHVzdGVyc1xuXG4gIHZhciBhZGpNYXRyaXggPSAoMCwgX2FkamFjZW50TWF0cml4LmRlZmF1bHQpKGdyYXBoRGF0YSwgZGlyZWN0ZWQpOyAvLyB0aGUgc3VtIG9mIGVhY2ggcm93IGluIGFkamFjZW50IG1hdHJpeFxuXG4gIHZhciBrcyA9IFtdO1xuICAvKipcbiAgICogbmVpZ2hib3Igbm9kZXMgKGlkIGZvciBrZXkgYW5kIHdlaWdodCBmb3IgdmFsdWUpIGZvciBlYWNoIG5vZGVcbiAgICogbmVpZ2hib3JzID0ge1xuICAgKiAgaWQobm9kZV9pZCk6IHsgaWQobmVpZ2hib3JfMV9pZCk6IHdlaWdodCh3ZWlnaHQgb2YgdGhlIGVkZ2UpLCBpZChuZWlnaGJvcl8yX2lkKTogd2VpZ2h0KHdlaWdodCBvZiB0aGUgZWRnZSksIC4uLiB9LFxuICAgKiAgLi4uXG4gICAqIH1cbiAgICovXG5cbiAgdmFyIG5laWdoYm9ycyA9IHt9OyAvLyB0aGUgc3VtIG9mIHRoZSB3ZWlnaHRzIG9mIGFsbCBlZGdlcyBpbiB0aGUgZ3JhcGhcblxuICB2YXIgbSA9IDA7XG4gIGFkak1hdHJpeC5mb3JFYWNoKGZ1bmN0aW9uIChyb3csIGkpIHtcbiAgICB2YXIgayA9IDA7XG4gICAgdmFyIGlpZCA9IG5vZGVzW2ldLmlkO1xuICAgIG5laWdoYm9yc1tpaWRdID0ge307XG4gICAgcm93LmZvckVhY2goZnVuY3Rpb24gKGVudHJ5LCBqKSB7XG4gICAgICBpZiAoIWVudHJ5KSByZXR1cm47XG4gICAgICBrICs9IGVudHJ5O1xuICAgICAgdmFyIGppZCA9IG5vZGVzW2pdLmlkO1xuICAgICAgbmVpZ2hib3JzW2lpZF1bamlkXSA9IGVudHJ5O1xuICAgICAgbSArPSBlbnRyeTtcbiAgICB9KTtcbiAgICBrcy5wdXNoKGspO1xuICB9KTtcbiAgbSAvPSAyO1xuICB2YXIgdG90YWxNb2R1bGFyaXR5ID0gSW5maW5pdHk7XG4gIHZhciBwcmV2aW91c01vZHVsYXJpdHkgPSBJbmZpbml0eTtcbiAgdmFyIGl0ZXIgPSAwO1xuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgLy8gd2hldGhlciB0byB0ZXJtaW5hdGUgdGhlIGl0ZXJhdGlvbnNcbiAgICB0b3RhbE1vZHVsYXJpdHkgPSBnZXRNb2R1bGFyaXR5KG5vZGVzLCBhZGpNYXRyaXgsIGtzLCBtKTtcbiAgICBpZiAoTWF0aC5hYnModG90YWxNb2R1bGFyaXR5IC0gcHJldmlvdXNNb2R1bGFyaXR5KSA8IHRocmVzaG9sZCB8fCBpdGVyID4gMTAwKSBicmVhaztcbiAgICBwcmV2aW91c01vZHVsYXJpdHkgPSB0b3RhbE1vZHVsYXJpdHk7XG4gICAgaXRlcisrOyAvLyBwcmUgY29tcHV0ZSBzb21lIHZhbHVlcyBmb3IgY3VycmVudCBjbHVzdGVyc1xuXG4gICAgT2JqZWN0LmtleXMoY2x1c3RlcnMpLmZvckVhY2goZnVuY3Rpb24gKGNsdXN0ZXJJZCkge1xuICAgICAgLy8gc3VtIG9mIHdlaWdodHMgb2YgZWRnZXMgdG8gbm9kZXMgaW4gY2x1c3RlclxuICAgICAgdmFyIHN1bVRvdCA9IDA7XG4gICAgICBlZGdlcy5mb3JFYWNoKGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgICAgIHZhciBzb3VyY2UgPSBlZGdlLnNvdXJjZSxcbiAgICAgICAgICAgIHRhcmdldCA9IGVkZ2UudGFyZ2V0O1xuICAgICAgICB2YXIgc291cmNlQ2x1c3RlcklkID0gbm9kZU1hcFtzb3VyY2VdLm5vZGUuY2x1c3RlcklkO1xuICAgICAgICB2YXIgdGFyZ2V0Q2x1c3RlcklkID0gbm9kZU1hcFt0YXJnZXRdLm5vZGUuY2x1c3RlcklkO1xuXG4gICAgICAgIGlmIChzb3VyY2VDbHVzdGVySWQgPT09IGNsdXN0ZXJJZCAmJiB0YXJnZXRDbHVzdGVySWQgIT09IGNsdXN0ZXJJZCB8fCB0YXJnZXRDbHVzdGVySWQgPT09IGNsdXN0ZXJJZCAmJiBzb3VyY2VDbHVzdGVySWQgIT09IGNsdXN0ZXJJZCkge1xuICAgICAgICAgIHN1bVRvdCA9IHN1bVRvdCArIChlZGdlW3dlaWdodFByb3BlcnR5TmFtZV0gfHwgMSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgY2x1c3RlcnNbY2x1c3RlcklkXS5zdW1Ub3QgPSBzdW1Ub3Q7XG4gICAgfSk7IC8vIG1vdmUgdGhlIG5vZGVzIHRvIGluY3JlYXNlIHRoZSBkZWx0YSBtb2R1bGFyaXR5XG5cbiAgICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChub2RlLCBpKSB7XG4gICAgICB2YXIgc2VsZkNsdXN0ZXIgPSBjbHVzdGVyc1tub2RlLmNsdXN0ZXJJZF07XG4gICAgICB2YXIgYmVzdEluY3JlYXNlID0gMDtcbiAgICAgIHZhciBiZXN0Q2x1c3RlcjtcbiAgICAgIHZhciBjb21tb25QYXJhbSA9IGtzW2ldIC8gKDIgKiBtKTsgLy8gc3VtIG9mIHdlaWdodHMgb2YgZWRnZXMgZnJvbSBub2RlIHRvIG5vZGVzIGluIGNsdXN0ZXJcblxuICAgICAgdmFyIGtpaW4gPSAwO1xuICAgICAgdmFyIHNlbGZDbHVzdGVyTm9kZXMgPSBzZWxmQ2x1c3Rlci5ub2RlcztcbiAgICAgIHNlbGZDbHVzdGVyTm9kZXMuZm9yRWFjaChmdW5jdGlvbiAoc2NOb2RlKSB7XG4gICAgICAgIHZhciBzY05vZGVJZHggPSBub2RlTWFwW3NjTm9kZS5pZF0uaWR4O1xuICAgICAgICBraWluICs9IGFkak1hdHJpeFtpXVtzY05vZGVJZHhdIHx8IDA7XG4gICAgICB9KTsgLy8gdGhlIG1vZHVyYXJpdHkgZm9yICoqcmVtb3ZpbmcqKiB0aGUgbm9kZSBpIGZyb20gdGhlIG9yaWdpbiBjbHVzdGVyIG9mIG5vZGUgaVxuXG4gICAgICB2YXIgcmVtb3ZlTW9kdXJhcml0eSA9IGtpaW4gLSBzZWxmQ2x1c3Rlci5zdW1Ub3QgKiBjb21tb25QYXJhbTsgLy8gdGhlIG5laWdodGJvcnMgb2YgdGhlIG5vZGVcblxuICAgICAgdmFyIG5vZGVOZWlnaGJvcklkcyA9IG5laWdoYm9yc1tub2RlLmlkXTtcbiAgICAgIE9iamVjdC5rZXlzKG5vZGVOZWlnaGJvcklkcykuZm9yRWFjaChmdW5jdGlvbiAobmVpZ2hib3JOb2RlSWQpIHtcbiAgICAgICAgdmFyIG5laWdoYm9yTm9kZSA9IG5vZGVNYXBbbmVpZ2hib3JOb2RlSWRdLm5vZGU7XG4gICAgICAgIHZhciBuZWlnaGJvckNsdXN0ZXJJZCA9IG5laWdoYm9yTm9kZS5jbHVzdGVySWQ7IC8vIGlmIHRoZSBub2RlIGFuZCB0aGUgbmVpZ2hib3Igb2Ygbm9kZSBhcmUgaW4gdGhlIHNhbWUgY2x1c3RlciwgcmV1dHJuXG5cbiAgICAgICAgaWYgKG5laWdoYm9yQ2x1c3RlcklkID09PSBub2RlLmNsdXN0ZXJJZCkgcmV0dXJuO1xuICAgICAgICB2YXIgbmVpZ2hib3JDbHVzdGVyID0gY2x1c3RlcnNbbmVpZ2hib3JDbHVzdGVySWRdO1xuICAgICAgICB2YXIgY2x1c3Rlck5vZGVzID0gbmVpZ2hib3JDbHVzdGVyLm5vZGVzOyAvLyBpZiB0aGUgY2x1c3RlciBpcyBlbXB0eSwgcmVtb3ZlIHRoZSBjbHVzdGVyIGFuZCByZXR1cm5cblxuICAgICAgICBpZiAoIWNsdXN0ZXJOb2RlcyB8fCAhY2x1c3Rlck5vZGVzLmxlbmd0aCkgcmV0dXJuOyAvLyBzdW0gb2Ygd2VpZ2h0cyBvZiBlZGdlcyBmcm9tIG5vZGUgdG8gbm9kZXMgaW4gY2x1c3RlclxuXG4gICAgICAgIHZhciBuZWlnaGJvckNsdXN0ZXJLaWluID0gMDtcbiAgICAgICAgY2x1c3Rlck5vZGVzLmZvckVhY2goZnVuY3Rpb24gKGNOb2RlKSB7XG4gICAgICAgICAgdmFyIGNOb2RlSWR4ID0gbm9kZU1hcFtjTm9kZS5pZF0uaWR4O1xuICAgICAgICAgIG5laWdoYm9yQ2x1c3RlcktpaW4gKz0gYWRqTWF0cml4W2ldW2NOb2RlSWR4XSB8fCAwO1xuICAgICAgICB9KTsgLy8gbW9kdXJhcml0eSBmb3IgKiphZGRpbmcqKiBub2RlIGkgaW50byB0aGlzIG5laWdoYm9yIGNsdXN0ZXJcblxuICAgICAgICB2YXIgYWRkTW9kdXJhcml0eSA9IG5laWdoYm9yQ2x1c3RlcktpaW4gLSBuZWlnaGJvckNsdXN0ZXIuc3VtVG90ICogY29tbW9uUGFyYW07IC8vIHRoZSBpbmNyZWFzZSBtb2R1cmFyaXR5IGlzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYWRkTW9kdXJhcml0eSBhbmQgcmVtb3ZlTW9kdXJhcml0eVxuXG4gICAgICAgIHZhciBpbmNyZWFzZSA9IGFkZE1vZHVyYXJpdHkgLSByZW1vdmVNb2R1cmFyaXR5OyAvLyBmaW5kIHRoZSBiZXN0IGNsdXN0ZXIgdG8gbW92ZSBub2RlIGkgaW50b1xuXG4gICAgICAgIGlmIChpbmNyZWFzZSA+IGJlc3RJbmNyZWFzZSkge1xuICAgICAgICAgIGJlc3RJbmNyZWFzZSA9IGluY3JlYXNlO1xuICAgICAgICAgIGJlc3RDbHVzdGVyID0gbmVpZ2hib3JDbHVzdGVyO1xuICAgICAgICB9XG4gICAgICB9KTsgLy8gaWYgZm91bmQgYSBiZXN0IGNsdXN0ZXIgdG8gbW92ZSBpbnRvXG5cbiAgICAgIGlmIChiZXN0SW5jcmVhc2UgPiAwKSB7XG4gICAgICAgIGJlc3RDbHVzdGVyLm5vZGVzLnB1c2gobm9kZSk7XG4gICAgICAgIHZhciBwcmV2aW91c0NsdXN0ZXJJZF8xID0gbm9kZS5jbHVzdGVySWQ7XG4gICAgICAgIG5vZGUuY2x1c3RlcklkID0gYmVzdENsdXN0ZXIuaWQ7IC8vIG1vdmUgdGhlIG5vZGUgdG8gdGhlIGJlc3QgY2x1c3RlclxuXG4gICAgICAgIHZhciBub2RlSW5TZWxmQ2x1c3RlcklkeCA9IHNlbGZDbHVzdGVyLm5vZGVzLmluZGV4T2Yobm9kZSk7IC8vIHJlbW92ZSBmcm9tIG9yaWdpbiBjbHVzdGVyXG5cbiAgICAgICAgc2VsZkNsdXN0ZXIubm9kZXMuc3BsaWNlKG5vZGVJblNlbGZDbHVzdGVySWR4LCAxKTsgLy8gdXBkYXRlIHN1bVRvdCBmb3IgY2x1c3RlcnNcbiAgICAgICAgLy8gc3VtIG9mIHdlaWdodHMgb2YgZWRnZXMgdG8gbm9kZXMgaW4gY2x1c3RlclxuXG4gICAgICAgIHZhciBuZWlnaGJvckNsdXN0ZXJTdW1Ub3RfMSA9IDA7XG4gICAgICAgIHZhciBzZWxmQ2x1c3RlclN1bVRvdF8xID0gMDtcbiAgICAgICAgZWRnZXMuZm9yRWFjaChmdW5jdGlvbiAoZWRnZSkge1xuICAgICAgICAgIHZhciBzb3VyY2UgPSBlZGdlLnNvdXJjZSxcbiAgICAgICAgICAgICAgdGFyZ2V0ID0gZWRnZS50YXJnZXQ7XG4gICAgICAgICAgdmFyIHNvdXJjZUNsdXN0ZXJJZCA9IG5vZGVNYXBbc291cmNlXS5ub2RlLmNsdXN0ZXJJZDtcbiAgICAgICAgICB2YXIgdGFyZ2V0Q2x1c3RlcklkID0gbm9kZU1hcFt0YXJnZXRdLm5vZGUuY2x1c3RlcklkO1xuXG4gICAgICAgICAgaWYgKHNvdXJjZUNsdXN0ZXJJZCA9PT0gYmVzdENsdXN0ZXIuaWQgJiYgdGFyZ2V0Q2x1c3RlcklkICE9PSBiZXN0Q2x1c3Rlci5pZCB8fCB0YXJnZXRDbHVzdGVySWQgPT09IGJlc3RDbHVzdGVyLmlkICYmIHNvdXJjZUNsdXN0ZXJJZCAhPT0gYmVzdENsdXN0ZXIuaWQpIHtcbiAgICAgICAgICAgIG5laWdoYm9yQ2x1c3RlclN1bVRvdF8xID0gbmVpZ2hib3JDbHVzdGVyU3VtVG90XzEgKyAoZWRnZVt3ZWlnaHRQcm9wZXJ0eU5hbWVdIHx8IDEpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChzb3VyY2VDbHVzdGVySWQgPT09IHByZXZpb3VzQ2x1c3RlcklkXzEgJiYgdGFyZ2V0Q2x1c3RlcklkICE9PSBwcmV2aW91c0NsdXN0ZXJJZF8xIHx8IHRhcmdldENsdXN0ZXJJZCA9PT0gcHJldmlvdXNDbHVzdGVySWRfMSAmJiBzb3VyY2VDbHVzdGVySWQgIT09IHByZXZpb3VzQ2x1c3RlcklkXzEpIHtcbiAgICAgICAgICAgIHNlbGZDbHVzdGVyU3VtVG90XzEgPSBzZWxmQ2x1c3RlclN1bVRvdF8xICsgKGVkZ2Vbd2VpZ2h0UHJvcGVydHlOYW1lXSB8fCAxKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pOyAvLyB0aGUgbm9kZXMgb2YgdGhlIGNsdXN0ZXJzIHRvIG1vdmUgaW50byBhbmQgcmVtb3ZlIGFyZSBjaGFuZ2VkLCB1cGRhdGUgdGhlaXIgc3VtVG90XG5cbiAgICAgICAgYmVzdENsdXN0ZXIuc3VtVG90ID0gbmVpZ2hib3JDbHVzdGVyU3VtVG90XzE7XG4gICAgICAgIHNlbGZDbHVzdGVyLnN1bVRvdCA9IHNlbGZDbHVzdGVyU3VtVG90XzE7XG4gICAgICB9XG4gICAgfSk7XG4gIH0gLy8gZGVsZXRlIHRoZSBlbXB0eSBjbHVzdGVycywgYXNzaWduIGluY3JlYXNpbmcgY2x1c3RlcklkXG5cblxuICB2YXIgbmV3Q2x1c3RlcklkTWFwID0ge307XG4gIHZhciBjbHVzdGVySWR4ID0gMDtcbiAgT2JqZWN0LmtleXMoY2x1c3RlcnMpLmZvckVhY2goZnVuY3Rpb24gKGNsdXN0ZXJJZCkge1xuICAgIHZhciBjbHVzdGVyID0gY2x1c3RlcnNbY2x1c3RlcklkXTtcblxuICAgIGlmICghY2x1c3Rlci5ub2RlcyB8fCAhY2x1c3Rlci5ub2Rlcy5sZW5ndGgpIHtcbiAgICAgIGRlbGV0ZSBjbHVzdGVyc1tjbHVzdGVySWRdO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBuZXdJZCA9IFN0cmluZyhjbHVzdGVySWR4ICsgMSk7XG5cbiAgICBpZiAobmV3SWQgPT09IGNsdXN0ZXJJZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNsdXN0ZXIuaWQgPSBuZXdJZDtcbiAgICBjbHVzdGVyLm5vZGVzID0gY2x1c3Rlci5ub2Rlcy5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlkOiBpdGVtLmlkLFxuICAgICAgICBjbHVzdGVySWQ6IG5ld0lkXG4gICAgICB9O1xuICAgIH0pO1xuICAgIGNsdXN0ZXJzW25ld0lkXSA9IGNsdXN0ZXI7XG4gICAgbmV3Q2x1c3RlcklkTWFwW2NsdXN0ZXJJZF0gPSBuZXdJZDtcbiAgICBkZWxldGUgY2x1c3RlcnNbY2x1c3RlcklkXTtcbiAgICBjbHVzdGVySWR4Kys7XG4gIH0pO1xuICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgaWYgKG5vZGUuY2x1c3RlcklkICYmIG5ld0NsdXN0ZXJJZE1hcFtub2RlLmNsdXN0ZXJJZF0pIG5vZGUuY2x1c3RlcklkID0gbmV3Q2x1c3RlcklkTWFwW25vZGUuY2x1c3RlcklkXTtcbiAgfSk7IC8vIGdldCB0aGUgY2x1c3RlciBlZGdlc1xuXG4gIHZhciBjbHVzdGVyRWRnZXMgPSBbXTtcbiAgdmFyIGNsdXN0ZXJFZGdlTWFwID0ge307XG4gIGVkZ2VzLmZvckVhY2goZnVuY3Rpb24gKGVkZ2UpIHtcbiAgICB2YXIgc291cmNlID0gZWRnZS5zb3VyY2UsXG4gICAgICAgIHRhcmdldCA9IGVkZ2UudGFyZ2V0O1xuICAgIHZhciB3ZWlnaHQgPSBlZGdlW3dlaWdodFByb3BlcnR5TmFtZV0gfHwgMTtcbiAgICB2YXIgc291cmNlQ2x1c3RlcklkID0gbm9kZU1hcFtzb3VyY2VdLm5vZGUuY2x1c3RlcklkO1xuICAgIHZhciB0YXJnZXRDbHVzdGVySWQgPSBub2RlTWFwW3RhcmdldF0ubm9kZS5jbHVzdGVySWQ7XG4gICAgdmFyIG5ld0VkZ2VJZCA9IHNvdXJjZUNsdXN0ZXJJZCArIFwiLS0tXCIgKyB0YXJnZXRDbHVzdGVySWQ7XG5cbiAgICBpZiAoY2x1c3RlckVkZ2VNYXBbbmV3RWRnZUlkXSkge1xuICAgICAgY2x1c3RlckVkZ2VNYXBbbmV3RWRnZUlkXS53ZWlnaHQgKz0gd2VpZ2h0O1xuICAgICAgY2x1c3RlckVkZ2VNYXBbbmV3RWRnZUlkXS5jb3VudCsrO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgbmV3RWRnZSA9IHtcbiAgICAgICAgc291cmNlOiBzb3VyY2VDbHVzdGVySWQsXG4gICAgICAgIHRhcmdldDogdGFyZ2V0Q2x1c3RlcklkLFxuICAgICAgICB3ZWlnaHQ6IHdlaWdodCxcbiAgICAgICAgY291bnQ6IDFcbiAgICAgIH07XG4gICAgICBjbHVzdGVyRWRnZU1hcFtuZXdFZGdlSWRdID0gbmV3RWRnZTtcbiAgICAgIGNsdXN0ZXJFZGdlcy5wdXNoKG5ld0VkZ2UpO1xuICAgIH1cbiAgfSk7XG4gIHZhciBjbHVzdGVyc0FycmF5ID0gW107XG4gIE9iamVjdC5rZXlzKGNsdXN0ZXJzKS5mb3JFYWNoKGZ1bmN0aW9uIChjbHVzdGVySWQpIHtcbiAgICBjbHVzdGVyc0FycmF5LnB1c2goY2x1c3RlcnNbY2x1c3RlcklkXSk7XG4gIH0pO1xuICByZXR1cm4ge1xuICAgIGNsdXN0ZXJzOiBjbHVzdGVyc0FycmF5LFxuICAgIGNsdXN0ZXJFZGdlczogY2x1c3RlckVkZ2VzXG4gIH07XG59O1xuXG52YXIgX2RlZmF1bHQgPSBsb3V2YWluO1xuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///306\n')},function(module,exports,__webpack_require__){"use strict";eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _unionFind = _interopRequireDefault(__webpack_require__(308));\n\nvar _binaryHeap = _interopRequireDefault(__webpack_require__(309));\n\nvar _util = __webpack_require__(45);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Prim algorithm,use priority queue,复杂度 O(E+V*logV), V: 节点数量,E: 边的数量\n * refer: https://en.wikipedia.org/wiki/Prim%27s_algorithm\n * @param graph\n * @param weight 指定用于作为边权重的属性,若不指定,则认为所有边权重一致\n */\nvar primMST = function primMST(graphData, weight) {\n var selectedEdges = [];\n var _a = graphData.nodes,\n nodes = _a === void 0 ? [] : _a,\n _b = graphData.edges,\n edges = _b === void 0 ? [] : _b;\n\n if (nodes.length === 0) {\n return selectedEdges;\n } // 从nodes[0]开始\n\n\n var currNode = nodes[0];\n var visited = new Set();\n visited.add(currNode); // 用二叉堆维护距已加入节点的其他节点的边的权值\n\n var compareWeight = function compareWeight(a, b) {\n if (weight) {\n return a.weight - b.weight;\n }\n\n return 0;\n };\n\n var edgeQueue = new _binaryHeap.default(compareWeight);\n (0, _util.getEdgesByNodeId)(currNode.id, edges).forEach(function (edge) {\n edgeQueue.insert(edge);\n });\n\n while (!edgeQueue.isEmpty()) {\n // 选取与已加入的结点之间边权最小的结点\n var currEdge = edgeQueue.delMin();\n var source = currEdge.source;\n var target = currEdge.target;\n if (visited.has(source) && visited.has(target)) continue;\n selectedEdges.push(currEdge);\n\n if (!visited.has(source)) {\n visited.add(source);\n (0, _util.getEdgesByNodeId)(source, edges).forEach(function (edge) {\n edgeQueue.insert(edge);\n });\n }\n\n if (!visited.has(target)) {\n visited.add(target);\n (0, _util.getEdgesByNodeId)(target, edges).forEach(function (edge) {\n edgeQueue.insert(edge);\n });\n }\n }\n\n return selectedEdges;\n};\n/**\n * Kruskal algorithm,复杂度 O(E*logE), E: 边的数量\n * refer: https://en.wikipedia.org/wiki/Kruskal%27s_algorithm\n * @param graph\n * @param weight 指定用于作为边权重的属性,若不指定,则认为所有边权重一致\n * @return IEdge[] 返回构成MST的边的数组\n */\n\n\nvar kruskalMST = function kruskalMST(graphData, weight) {\n var selectedEdges = [];\n var _a = graphData.nodes,\n nodes = _a === void 0 ? [] : _a,\n _b = graphData.edges,\n edges = _b === void 0 ? [] : _b;\n\n if (nodes.length === 0) {\n return selectedEdges;\n } // 若指定weight,则将所有的边按权值从小到大排序\n\n\n var weightEdges = edges.map(function (edge) {\n return edge;\n });\n\n if (weight) {\n weightEdges.sort(function (a, b) {\n return a.weight - b.weight;\n });\n }\n\n var disjointSet = new _unionFind.default(nodes.map(function (n) {\n return n.id;\n })); // 从权值最小的边开始,如果这条边连接的两个节点于图G中不在同一个连通分量中,则添加这条边\n // 直到遍历完所有点或边\n\n while (weightEdges.length > 0) {\n var curEdge = weightEdges.shift();\n var source = curEdge.source;\n var target = curEdge.target;\n\n if (!disjointSet.connected(source, target)) {\n selectedEdges.push(curEdge);\n disjointSet.union(source, target);\n }\n }\n\n return selectedEdges;\n};\n/**\n * 最小生成树\n * refer: https://en.wikipedia.org/wiki/Kruskal%27s_algorithm\n * @param graph\n * @param weight 指定用于作为边权重的属性,若不指定,则认为所有边权重一致\n * @param algo 'prim' | 'kruskal' 算法类型\n * @return EdgeConfig[] 返回构成MST的边的数组\n */\n\n\nvar minimumSpanningTree = function minimumSpanningTree(graphData, weight, algo) {\n var algos = {\n prim: primMST,\n kruskal: kruskalMST\n };\n if (!algo) return kruskalMST(graphData, weight);\n return algos[algo](graphData, weight);\n};\n\nvar _default = minimumSpanningTree;\nexports.default = _default;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvYWxnb3JpdGhtL2xpYi9tdHMuanM/M2VmOSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBYTs7QUFFYjtBQUNBO0FBQ0EsQ0FBQztBQUNEOztBQUVBLHdDQUF3QyxtQkFBTyxDQUFDLEdBQXNCOztBQUV0RSx5Q0FBeUMsbUJBQU8sQ0FBQyxHQUF1Qjs7QUFFeEUsWUFBWSxtQkFBTyxDQUFDLEVBQVE7O0FBRTVCLHNDQUFzQyx1Q0FBdUMsZ0JBQWdCOztBQUU3RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7QUFDQSx3QkFBd0I7O0FBRXhCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBLEdBQUcsR0FBRztBQUNOOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSIsImZpbGUiOiIzMDcuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIF91bmlvbkZpbmQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3N0cnVjdHMvdW5pb24tZmluZFwiKSk7XG5cbnZhciBfYmluYXJ5SGVhcCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vc3RydWN0cy9iaW5hcnktaGVhcFwiKSk7XG5cbnZhciBfdXRpbCA9IHJlcXVpcmUoXCIuL3V0aWxcIik7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbi8qKlxuICogUHJpbSBhbGdvcml0aG3vvIx1c2UgcHJpb3JpdHkgcXVldWXvvIzlpI3mnYLluqYgTyhFK1YqbG9nViksIFY6IOiKgueCueaVsOmHj++8jEU6IOi+ueeahOaVsOmHj1xuICogcmVmZXI6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1ByaW0lMjdzX2FsZ29yaXRobVxuICogQHBhcmFtIGdyYXBoXG4gKiBAcGFyYW0gd2VpZ2h0IOaMh+WumueUqOS6juS9nOS4uui+ueadg+mHjeeahOWxnuaAp++8jOiLpeS4jeaMh+Wumu+8jOWImeiupOS4uuaJgOaciei+ueadg+mHjeS4gOiHtFxuICovXG52YXIgcHJpbU1TVCA9IGZ1bmN0aW9uIHByaW1NU1QoZ3JhcGhEYXRhLCB3ZWlnaHQpIHtcbiAgdmFyIHNlbGVjdGVkRWRnZXMgPSBbXTtcbiAgdmFyIF9hID0gZ3JhcGhEYXRhLm5vZGVzLFxuICAgICAgbm9kZXMgPSBfYSA9PT0gdm9pZCAwID8gW10gOiBfYSxcbiAgICAgIF9iID0gZ3JhcGhEYXRhLmVkZ2VzLFxuICAgICAgZWRnZXMgPSBfYiA9PT0gdm9pZCAwID8gW10gOiBfYjtcblxuICBpZiAobm9kZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHNlbGVjdGVkRWRnZXM7XG4gIH0gLy8g5LuObm9kZXNbMF3lvIDlp4tcblxuXG4gIHZhciBjdXJyTm9kZSA9IG5vZGVzWzBdO1xuICB2YXIgdmlzaXRlZCA9IG5ldyBTZXQoKTtcbiAgdmlzaXRlZC5hZGQoY3Vyck5vZGUpOyAvLyDnlKjkuozlj4nloIbnu7TmiqTot53lt7LliqDlhaXoioLngrnnmoTlhbbku5boioLngrnnmoTovrnnmoTmnYPlgLxcblxuICB2YXIgY29tcGFyZVdlaWdodCA9IGZ1bmN0aW9uIGNvbXBhcmVXZWlnaHQoYSwgYikge1xuICAgIGlmICh3ZWlnaHQpIHtcbiAgICAgIHJldHVybiBhLndlaWdodCAtIGIud2VpZ2h0O1xuICAgIH1cblxuICAgIHJldHVybiAwO1xuICB9O1xuXG4gIHZhciBlZGdlUXVldWUgPSBuZXcgX2JpbmFyeUhlYXAuZGVmYXVsdChjb21wYXJlV2VpZ2h0KTtcbiAgKDAsIF91dGlsLmdldEVkZ2VzQnlOb2RlSWQpKGN1cnJOb2RlLmlkLCBlZGdlcykuZm9yRWFjaChmdW5jdGlvbiAoZWRnZSkge1xuICAgIGVkZ2VRdWV1ZS5pbnNlcnQoZWRnZSk7XG4gIH0pO1xuXG4gIHdoaWxlICghZWRnZVF1ZXVlLmlzRW1wdHkoKSkge1xuICAgIC8vIOmAieWPluS4juW3suWKoOWFpeeahOe7k+eCueS5i+mXtOi+ueadg+acgOWwj+eahOe7k+eCuVxuICAgIHZhciBjdXJyRWRnZSA9IGVkZ2VRdWV1ZS5kZWxNaW4oKTtcbiAgICB2YXIgc291cmNlID0gY3VyckVkZ2Uuc291cmNlO1xuICAgIHZhciB0YXJnZXQgPSBjdXJyRWRnZS50YXJnZXQ7XG4gICAgaWYgKHZpc2l0ZWQuaGFzKHNvdXJjZSkgJiYgdmlzaXRlZC5oYXModGFyZ2V0KSkgY29udGludWU7XG4gICAgc2VsZWN0ZWRFZGdlcy5wdXNoKGN1cnJFZGdlKTtcblxuICAgIGlmICghdmlzaXRlZC5oYXMoc291cmNlKSkge1xuICAgICAgdmlzaXRlZC5hZGQoc291cmNlKTtcbiAgICAgICgwLCBfdXRpbC5nZXRFZGdlc0J5Tm9kZUlkKShzb3VyY2UsIGVkZ2VzKS5mb3JFYWNoKGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgICAgIGVkZ2VRdWV1ZS5pbnNlcnQoZWRnZSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoIXZpc2l0ZWQuaGFzKHRhcmdldCkpIHtcbiAgICAgIHZpc2l0ZWQuYWRkKHRhcmdldCk7XG4gICAgICAoMCwgX3V0aWwuZ2V0RWRnZXNCeU5vZGVJZCkodGFyZ2V0LCBlZGdlcykuZm9yRWFjaChmdW5jdGlvbiAoZWRnZSkge1xuICAgICAgICBlZGdlUXVldWUuaW5zZXJ0KGVkZ2UpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHNlbGVjdGVkRWRnZXM7XG59O1xuLyoqXG4gKiBLcnVza2FsIGFsZ29yaXRobe+8jOWkjeadguW6piBPKEUqbG9nRSksIEU6IOi+ueeahOaVsOmHj1xuICogcmVmZXI6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0tydXNrYWwlMjdzX2FsZ29yaXRobVxuICogQHBhcmFtIGdyYXBoXG4gKiBAcGFyYW0gd2VpZ2h0IOaMh+WumueUqOS6juS9nOS4uui+ueadg+mHjeeahOWxnuaAp++8jOiLpeS4jeaMh+Wumu+8jOWImeiupOS4uuaJgOaciei+ueadg+mHjeS4gOiHtFxuICogQHJldHVybiBJRWRnZVtdIOi/lOWbnuaehOaIkE1TVOeahOi+ueeahOaVsOe7hFxuICovXG5cblxudmFyIGtydXNrYWxNU1QgPSBmdW5jdGlvbiBrcnVza2FsTVNUKGdyYXBoRGF0YSwgd2VpZ2h0KSB7XG4gIHZhciBzZWxlY3RlZEVkZ2VzID0gW107XG4gIHZhciBfYSA9IGdyYXBoRGF0YS5ub2RlcyxcbiAgICAgIG5vZGVzID0gX2EgPT09IHZvaWQgMCA/IFtdIDogX2EsXG4gICAgICBfYiA9IGdyYXBoRGF0YS5lZGdlcyxcbiAgICAgIGVkZ2VzID0gX2IgPT09IHZvaWQgMCA/IFtdIDogX2I7XG5cbiAgaWYgKG5vZGVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBzZWxlY3RlZEVkZ2VzO1xuICB9IC8vIOiLpeaMh+WumndlaWdodO+8jOWImeWwhuaJgOacieeahOi+ueaMieadg+WAvOS7juWwj+WIsOWkp+aOkuW6j1xuXG5cbiAgdmFyIHdlaWdodEVkZ2VzID0gZWRnZXMubWFwKGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgcmV0dXJuIGVkZ2U7XG4gIH0pO1xuXG4gIGlmICh3ZWlnaHQpIHtcbiAgICB3ZWlnaHRFZGdlcy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICByZXR1cm4gYS53ZWlnaHQgLSBiLndlaWdodDtcbiAgICB9KTtcbiAgfVxuXG4gIHZhciBkaXNqb2ludFNldCA9IG5ldyBfdW5pb25GaW5kLmRlZmF1bHQobm9kZXMubWFwKGZ1bmN0aW9uIChuKSB7XG4gICAgcmV0dXJuIG4uaWQ7XG4gIH0pKTsgLy8g5LuO5p2D5YC85pyA5bCP55qE6L655byA5aeL77yM5aaC5p6c6L+Z5p2h6L656L+e5o6l55qE5Lik5Liq6IqC54K55LqO5Zu+R+S4reS4jeWcqOWQjOS4gOS4qui/numAmuWIhumHj+S4re+8jOWImea3u+WKoOi/meadoei+uVxuICAvLyDnm7TliLDpgY3ljoblrozmiYDmnInngrnmiJbovrlcblxuICB3aGlsZSAod2VpZ2h0RWRnZXMubGVuZ3RoID4gMCkge1xuICAgIHZhciBjdXJFZGdlID0gd2VpZ2h0RWRnZXMuc2hpZnQoKTtcbiAgICB2YXIgc291cmNlID0gY3VyRWRnZS5zb3VyY2U7XG4gICAgdmFyIHRhcmdldCA9IGN1ckVkZ2UudGFyZ2V0O1xuXG4gICAgaWYgKCFkaXNqb2ludFNldC5jb25uZWN0ZWQoc291cmNlLCB0YXJnZXQpKSB7XG4gICAgICBzZWxlY3RlZEVkZ2VzLnB1c2goY3VyRWRnZSk7XG4gICAgICBkaXNqb2ludFNldC51bmlvbihzb3VyY2UsIHRhcmdldCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHNlbGVjdGVkRWRnZXM7XG59O1xuLyoqXG4gKiDmnIDlsI/nlJ/miJDmoJFcbiAqIHJlZmVyOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9LcnVza2FsJTI3c19hbGdvcml0aG1cbiAqIEBwYXJhbSBncmFwaFxuICogQHBhcmFtIHdlaWdodCDmjIflrprnlKjkuo7kvZzkuLrovrnmnYPph43nmoTlsZ7mgKfvvIzoi6XkuI3mjIflrprvvIzliJnorqTkuLrmiYDmnInovrnmnYPph43kuIDoh7RcbiAqIEBwYXJhbSBhbGdvICdwcmltJyB8ICdrcnVza2FsJyDnrpfms5XnsbvlnotcbiAqIEByZXR1cm4gRWRnZUNvbmZpZ1tdIOi/lOWbnuaehOaIkE1TVOeahOi+ueeahOaVsOe7hFxuICovXG5cblxudmFyIG1pbmltdW1TcGFubmluZ1RyZWUgPSBmdW5jdGlvbiBtaW5pbXVtU3Bhbm5pbmdUcmVlKGdyYXBoRGF0YSwgd2VpZ2h0LCBhbGdvKSB7XG4gIHZhciBhbGdvcyA9IHtcbiAgICBwcmltOiBwcmltTVNULFxuICAgIGtydXNrYWw6IGtydXNrYWxNU1RcbiAgfTtcbiAgaWYgKCFhbGdvKSByZXR1cm4ga3J1c2thbE1TVChncmFwaERhdGEsIHdlaWdodCk7XG4gIHJldHVybiBhbGdvc1thbGdvXShncmFwaERhdGEsIHdlaWdodCk7XG59O1xuXG52YXIgX2RlZmF1bHQgPSBtaW5pbXVtU3Bhbm5pbmdUcmVlO1xuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///307\n")},function(module,exports,__webpack_require__){"use strict";eval('\n\nObject.defineProperty(exports, "__esModule", {\n value: true\n});\nexports.default = void 0;\n\n/**\n * 并查集 Disjoint set to support quick union\n */\nvar UnionFind =\n/** @class */\nfunction () {\n function UnionFind(items) {\n this.count = items.length;\n this.parent = {};\n\n for (var _i = 0, items_1 = items; _i < items_1.length; _i++) {\n var i = items_1[_i];\n this.parent[i] = i;\n }\n } // find the root of the item\n\n\n UnionFind.prototype.find = function (item) {\n while (this.parent[item] !== item) {\n item = this.parent[item];\n }\n\n return item;\n };\n\n UnionFind.prototype.union = function (a, b) {\n var rootA = this.find(a);\n var rootB = this.find(b);\n if (rootA === rootB) return; // make the element with smaller root the parent\n\n if (rootA < rootB) {\n if (this.parent[b] !== b) this.union(this.parent[b], a);\n this.parent[b] = this.parent[a];\n } else {\n if (this.parent[a] !== a) this.union(this.parent[a], b);\n this.parent[a] = this.parent[b];\n }\n }; // whether a and b are connected, i.e. a and b have the same root\n\n\n UnionFind.prototype.connected = function (a, b) {\n return this.find(a) === this.find(b);\n };\n\n return UnionFind;\n}();\n\nvar _default = UnionFind;\nexports.default = _default;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvYWxnb3JpdGhtL2xpYi9zdHJ1Y3RzL3VuaW9uLWZpbmQuanM/ODNhZCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBYTs7QUFFYjtBQUNBO0FBQ0EsQ0FBQztBQUNEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxxQ0FBcUMscUJBQXFCO0FBQzFEO0FBQ0E7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDOztBQUVoQztBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7O0FBR0o7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBIiwiZmlsZSI6IjMwOC5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG4vKipcbiAqIOW5tuafpembhiBEaXNqb2ludCBzZXQgdG8gc3VwcG9ydCBxdWljayB1bmlvblxuICovXG52YXIgVW5pb25GaW5kID1cbi8qKiBAY2xhc3MgKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gVW5pb25GaW5kKGl0ZW1zKSB7XG4gICAgdGhpcy5jb3VudCA9IGl0ZW1zLmxlbmd0aDtcbiAgICB0aGlzLnBhcmVudCA9IHt9O1xuXG4gICAgZm9yICh2YXIgX2kgPSAwLCBpdGVtc18xID0gaXRlbXM7IF9pIDwgaXRlbXNfMS5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBpID0gaXRlbXNfMVtfaV07XG4gICAgICB0aGlzLnBhcmVudFtpXSA9IGk7XG4gICAgfVxuICB9IC8vIGZpbmQgdGhlIHJvb3Qgb2YgdGhlIGl0ZW1cblxuXG4gIFVuaW9uRmluZC5wcm90b3R5cGUuZmluZCA9IGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgd2hpbGUgKHRoaXMucGFyZW50W2l0ZW1dICE9PSBpdGVtKSB7XG4gICAgICBpdGVtID0gdGhpcy5wYXJlbnRbaXRlbV07XG4gICAgfVxuXG4gICAgcmV0dXJuIGl0ZW07XG4gIH07XG5cbiAgVW5pb25GaW5kLnByb3RvdHlwZS51bmlvbiA9IGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgdmFyIHJvb3RBID0gdGhpcy5maW5kKGEpO1xuICAgIHZhciByb290QiA9IHRoaXMuZmluZChiKTtcbiAgICBpZiAocm9vdEEgPT09IHJvb3RCKSByZXR1cm47IC8vIG1ha2UgdGhlIGVsZW1lbnQgd2l0aCBzbWFsbGVyIHJvb3QgdGhlIHBhcmVudFxuXG4gICAgaWYgKHJvb3RBIDwgcm9vdEIpIHtcbiAgICAgIGlmICh0aGlzLnBhcmVudFtiXSAhPT0gYikgdGhpcy51bmlvbih0aGlzLnBhcmVudFtiXSwgYSk7XG4gICAgICB0aGlzLnBhcmVudFtiXSA9IHRoaXMucGFyZW50W2FdO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5wYXJlbnRbYV0gIT09IGEpIHRoaXMudW5pb24odGhpcy5wYXJlbnRbYV0sIGIpO1xuICAgICAgdGhpcy5wYXJlbnRbYV0gPSB0aGlzLnBhcmVudFtiXTtcbiAgICB9XG4gIH07IC8vIHdoZXRoZXIgYSBhbmQgYiBhcmUgY29ubmVjdGVkLCBpLmUuIGEgYW5kIGIgaGF2ZSB0aGUgc2FtZSByb290XG5cblxuICBVbmlvbkZpbmQucHJvdG90eXBlLmNvbm5lY3RlZCA9IGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgcmV0dXJuIHRoaXMuZmluZChhKSA9PT0gdGhpcy5maW5kKGIpO1xuICB9O1xuXG4gIHJldHVybiBVbmlvbkZpbmQ7XG59KCk7XG5cbnZhciBfZGVmYXVsdCA9IFVuaW9uRmluZDtcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///308\n')},function(module,exports,__webpack_require__){"use strict";eval('\n\nObject.defineProperty(exports, "__esModule", {\n value: true\n});\nexports.default = void 0;\n\nvar defaultCompare = function defaultCompare(a, b) {\n return a - b;\n};\n\nvar MinBinaryHeap =\n/** @class */\nfunction () {\n function MinBinaryHeap(compareFn) {\n if (compareFn === void 0) {\n compareFn = defaultCompare;\n }\n\n this.compareFn = compareFn;\n this.list = [];\n }\n\n MinBinaryHeap.prototype.getLeft = function (index) {\n return 2 * index + 1;\n };\n\n MinBinaryHeap.prototype.getRight = function (index) {\n return 2 * index + 2;\n };\n\n MinBinaryHeap.prototype.getParent = function (index) {\n if (index === 0) {\n return null;\n }\n\n return Math.floor((index - 1) / 2);\n };\n\n MinBinaryHeap.prototype.isEmpty = function () {\n return this.list.length <= 0;\n };\n\n MinBinaryHeap.prototype.top = function () {\n return this.isEmpty() ? undefined : this.list[0];\n };\n\n MinBinaryHeap.prototype.delMin = function () {\n var top = this.top();\n var bottom = this.list.pop();\n\n if (this.list.length > 0) {\n this.list[0] = bottom;\n this.moveDown(0);\n }\n\n return top;\n };\n\n MinBinaryHeap.prototype.insert = function (value) {\n if (value !== null) {\n this.list.push(value);\n var index = this.list.length - 1;\n this.moveUp(index);\n return true;\n }\n\n return false;\n };\n\n MinBinaryHeap.prototype.moveUp = function (index) {\n var parent = this.getParent(index);\n\n while (index && index > 0 && this.compareFn(this.list[parent], this.list[index]) > 0) {\n // swap\n var tmp = this.list[parent];\n this.list[parent] = this.list[index];\n this.list[index] = tmp; // [this.list[index], this.list[parent]] = [this.list[parent], this.list[index]]\n\n index = parent;\n parent = this.getParent(index);\n }\n };\n\n MinBinaryHeap.prototype.moveDown = function (index) {\n var _a;\n\n var element = index;\n var left = this.getLeft(index);\n var right = this.getRight(index);\n var size = this.list.length;\n\n if (left !== null && left < size && this.compareFn(this.list[element], this.list[left]) > 0) {\n element = left;\n } else if (right !== null && right < size && this.compareFn(this.list[element], this.list[right]) > 0) {\n element = right;\n }\n\n if (index !== element) {\n _a = [this.list[element], this.list[index]], this.list[index] = _a[0], this.list[element] = _a[1];\n this.moveDown(element);\n }\n };\n\n return MinBinaryHeap;\n}();\n\nvar _default = MinBinaryHeap;\nexports.default = _default;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvYWxnb3JpdGhtL2xpYi9zdHJ1Y3RzL2JpbmFyeS1oZWFwLmpzPzljMmYiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWI7QUFDQTtBQUNBLENBQUM7QUFDRDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2Qjs7QUFFN0I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLENBQUM7O0FBRUQ7QUFDQSIsImZpbGUiOiIzMDkuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIGRlZmF1bHRDb21wYXJlID0gZnVuY3Rpb24gZGVmYXVsdENvbXBhcmUoYSwgYikge1xuICByZXR1cm4gYSAtIGI7XG59O1xuXG52YXIgTWluQmluYXJ5SGVhcCA9XG4vKiogQGNsYXNzICovXG5mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIE1pbkJpbmFyeUhlYXAoY29tcGFyZUZuKSB7XG4gICAgaWYgKGNvbXBhcmVGbiA9PT0gdm9pZCAwKSB7XG4gICAgICBjb21wYXJlRm4gPSBkZWZhdWx0Q29tcGFyZTtcbiAgICB9XG5cbiAgICB0aGlzLmNvbXBhcmVGbiA9IGNvbXBhcmVGbjtcbiAgICB0aGlzLmxpc3QgPSBbXTtcbiAgfVxuXG4gIE1pbkJpbmFyeUhlYXAucHJvdG90eXBlLmdldExlZnQgPSBmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICByZXR1cm4gMiAqIGluZGV4ICsgMTtcbiAgfTtcblxuICBNaW5CaW5hcnlIZWFwLnByb3RvdHlwZS5nZXRSaWdodCA9IGZ1bmN0aW9uIChpbmRleCkge1xuICAgIHJldHVybiAyICogaW5kZXggKyAyO1xuICB9O1xuXG4gIE1pbkJpbmFyeUhlYXAucHJvdG90eXBlLmdldFBhcmVudCA9IGZ1bmN0aW9uIChpbmRleCkge1xuICAgIGlmIChpbmRleCA9PT0gMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIE1hdGguZmxvb3IoKGluZGV4IC0gMSkgLyAyKTtcbiAgfTtcblxuICBNaW5CaW5hcnlIZWFwLnByb3RvdHlwZS5pc0VtcHR5ID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLmxpc3QubGVuZ3RoIDw9IDA7XG4gIH07XG5cbiAgTWluQmluYXJ5SGVhcC5wcm90b3R5cGUudG9wID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLmlzRW1wdHkoKSA/IHVuZGVmaW5lZCA6IHRoaXMubGlzdFswXTtcbiAgfTtcblxuICBNaW5CaW5hcnlIZWFwLnByb3RvdHlwZS5kZWxNaW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHRvcCA9IHRoaXMudG9wKCk7XG4gICAgdmFyIGJvdHRvbSA9IHRoaXMubGlzdC5wb3AoKTtcblxuICAgIGlmICh0aGlzLmxpc3QubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5saXN0WzBdID0gYm90dG9tO1xuICAgICAgdGhpcy5tb3ZlRG93bigwKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdG9wO1xuICB9O1xuXG4gIE1pbkJpbmFyeUhlYXAucHJvdG90eXBlLmluc2VydCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgdGhpcy5saXN0LnB1c2godmFsdWUpO1xuICAgICAgdmFyIGluZGV4ID0gdGhpcy5saXN0Lmxlbmd0aCAtIDE7XG4gICAgICB0aGlzLm1vdmVVcChpbmRleCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG5cbiAgTWluQmluYXJ5SGVhcC5wcm90b3R5cGUubW92ZVVwID0gZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgdmFyIHBhcmVudCA9IHRoaXMuZ2V0UGFyZW50KGluZGV4KTtcblxuICAgIHdoaWxlIChpbmRleCAmJiBpbmRleCA+IDAgJiYgdGhpcy5jb21wYXJlRm4odGhpcy5saXN0W3BhcmVudF0sIHRoaXMubGlzdFtpbmRleF0pID4gMCkge1xuICAgICAgLy8gc3dhcFxuICAgICAgdmFyIHRtcCA9IHRoaXMubGlzdFtwYXJlbnRdO1xuICAgICAgdGhpcy5saXN0W3BhcmVudF0gPSB0aGlzLmxpc3RbaW5kZXhdO1xuICAgICAgdGhpcy5saXN0W2luZGV4XSA9IHRtcDsgLy8gW3RoaXMubGlzdFtpbmRleF0sIHRoaXMubGlzdFtwYXJlbnRdXSA9IFt0aGlzLmxpc3RbcGFyZW50XSwgdGhpcy5saXN0W2luZGV4XV1cblxuICAgICAgaW5kZXggPSBwYXJlbnQ7XG4gICAgICBwYXJlbnQgPSB0aGlzLmdldFBhcmVudChpbmRleCk7XG4gICAgfVxuICB9O1xuXG4gIE1pbkJpbmFyeUhlYXAucHJvdG90eXBlLm1vdmVEb3duID0gZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgdmFyIF9hO1xuXG4gICAgdmFyIGVsZW1lbnQgPSBpbmRleDtcbiAgICB2YXIgbGVmdCA9IHRoaXMuZ2V0TGVmdChpbmRleCk7XG4gICAgdmFyIHJpZ2h0ID0gdGhpcy5nZXRSaWdodChpbmRleCk7XG4gICAgdmFyIHNpemUgPSB0aGlzLmxpc3QubGVuZ3RoO1xuXG4gICAgaWYgKGxlZnQgIT09IG51bGwgJiYgbGVmdCA8IHNpemUgJiYgdGhpcy5jb21wYXJlRm4odGhpcy5saXN0W2VsZW1lbnRdLCB0aGlzLmxpc3RbbGVmdF0pID4gMCkge1xuICAgICAgZWxlbWVudCA9IGxlZnQ7XG4gICAgfSBlbHNlIGlmIChyaWdodCAhPT0gbnVsbCAmJiByaWdodCA8IHNpemUgJiYgdGhpcy5jb21wYXJlRm4odGhpcy5saXN0W2VsZW1lbnRdLCB0aGlzLmxpc3RbcmlnaHRdKSA+IDApIHtcbiAgICAgIGVsZW1lbnQgPSByaWdodDtcbiAgICB9XG5cbiAgICBpZiAoaW5kZXggIT09IGVsZW1lbnQpIHtcbiAgICAgIF9hID0gW3RoaXMubGlzdFtlbGVtZW50XSwgdGhpcy5saXN0W2luZGV4XV0sIHRoaXMubGlzdFtpbmRleF0gPSBfYVswXSwgdGhpcy5saXN0W2VsZW1lbnRdID0gX2FbMV07XG4gICAgICB0aGlzLm1vdmVEb3duKGVsZW1lbnQpO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gTWluQmluYXJ5SGVhcDtcbn0oKTtcblxudmFyIF9kZWZhdWx0ID0gTWluQmluYXJ5SGVhcDtcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///309\n')},function(module,exports,__webpack_require__){"use strict";eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _degree = _interopRequireDefault(__webpack_require__(181));\n\nvar _util = __webpack_require__(45);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * PageRank https://en.wikipedia.org/wiki/PageRank\n * refer: https://github.com/anvaka/ngraph.pagerank\n * @param graph\n * @param epsilon 判断是否收敛的精度值,默认 0.000001\n * @param linkProb 阻尼系数(dumping factor),指任意时刻,用户访问到某节点后继续访问该节点链接的下一个节点的概率,经验值 0.85\n */\nvar pageRank = function pageRank(graphData, epsilon, linkProb) {\n if (typeof epsilon !== 'number') epsilon = 0.000001;\n if (typeof linkProb !== 'number') linkProb = 0.85;\n var distance = 1;\n var leakedRank = 0;\n var maxIterations = 1000;\n var _a = graphData.nodes,\n nodes = _a === void 0 ? [] : _a,\n _b = graphData.edges,\n edges = _b === void 0 ? [] : _b;\n var nodesCount = nodes.length;\n var currentRank;\n var curRanks = {};\n var prevRanks = {}; // Initialize pageranks 初始化\n\n for (var j = 0; j < nodesCount; ++j) {\n var node = nodes[j];\n var nodeId = node.id;\n curRanks[nodeId] = 1 / nodesCount;\n prevRanks[nodeId] = 1 / nodesCount;\n }\n\n var nodeDegree = (0, _degree.default)(graphData);\n\n while (maxIterations > 0 && distance > epsilon) {\n leakedRank = 0;\n\n for (var j = 0; j < nodesCount; ++j) {\n var node = nodes[j];\n var nodeId = node.id;\n currentRank = 0;\n\n if (nodeDegree[node.id].inDegree === 0) {\n curRanks[nodeId] = 0;\n } else {\n var neighbors = (0, _util.getNeighbors)(nodeId, edges, 'source');\n\n for (var i = 0; i < neighbors.length; ++i) {\n var neighbor = neighbors[i];\n var outDegree = nodeDegree[neighbor].outDegree;\n if (outDegree > 0) currentRank += prevRanks[neighbor] / outDegree;\n }\n\n curRanks[nodeId] = linkProb * currentRank;\n leakedRank += curRanks[nodeId];\n }\n }\n\n leakedRank = (1 - leakedRank) / nodesCount;\n distance = 0;\n\n for (var j = 0; j < nodesCount; ++j) {\n var node = nodes[j];\n var nodeId = node.id;\n currentRank = curRanks[nodeId] + leakedRank;\n distance += Math.abs(currentRank - prevRanks[nodeId]);\n prevRanks[nodeId] = currentRank;\n }\n\n maxIterations -= 1;\n }\n\n return prevRanks;\n};\n\nvar _default = pageRank;\nexports.default = _default;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvYWxnb3JpdGhtL2xpYi9wYWdlUmFuay5qcz8wNzY1Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFhOztBQUViO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7O0FBRUEscUNBQXFDLG1CQUFPLENBQUMsR0FBVTs7QUFFdkQsWUFBWSxtQkFBTyxDQUFDLEVBQVE7O0FBRTVCLHNDQUFzQyx1Q0FBdUMsZ0JBQWdCOztBQUU3RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCOztBQUVyQixpQkFBaUIsZ0JBQWdCO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQSxtQkFBbUIsZ0JBQWdCO0FBQ25DO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBLHVCQUF1QixzQkFBc0I7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxtQkFBbUIsZ0JBQWdCO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSIsImZpbGUiOiIzMTAuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIF9kZWdyZWUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2RlZ3JlZVwiKSk7XG5cbnZhciBfdXRpbCA9IHJlcXVpcmUoXCIuL3V0aWxcIik7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbi8qKlxuICogUGFnZVJhbmsgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvUGFnZVJhbmtcbiAqIHJlZmVyOiBodHRwczovL2dpdGh1Yi5jb20vYW52YWthL25ncmFwaC5wYWdlcmFua1xuICogQHBhcmFtIGdyYXBoXG4gKiBAcGFyYW0gZXBzaWxvbiDliKTmlq3mmK/lkKbmlLbmlZvnmoTnsr7luqblgLzvvIzpu5jorqQgMC4wMDAwMDFcbiAqIEBwYXJhbSBsaW5rUHJvYiDpmLvlsLzns7vmlbDvvIhkdW1waW5nIGZhY3Rvcu+8ie+8jOaMh+S7u+aEj+aXtuWIu++8jOeUqOaIt+iuv+mXruWIsOafkOiKgueCueWQjue7p+e7reiuv+mXruivpeiKgueCuemTvuaOpeeahOS4i+S4gOS4quiKgueCueeahOamgueOh++8jOe7j+mqjOWAvCAwLjg1XG4gKi9cbnZhciBwYWdlUmFuayA9IGZ1bmN0aW9uIHBhZ2VSYW5rKGdyYXBoRGF0YSwgZXBzaWxvbiwgbGlua1Byb2IpIHtcbiAgaWYgKHR5cGVvZiBlcHNpbG9uICE9PSAnbnVtYmVyJykgZXBzaWxvbiA9IDAuMDAwMDAxO1xuICBpZiAodHlwZW9mIGxpbmtQcm9iICE9PSAnbnVtYmVyJykgbGlua1Byb2IgPSAwLjg1O1xuICB2YXIgZGlzdGFuY2UgPSAxO1xuICB2YXIgbGVha2VkUmFuayA9IDA7XG4gIHZhciBtYXhJdGVyYXRpb25zID0gMTAwMDtcbiAgdmFyIF9hID0gZ3JhcGhEYXRhLm5vZGVzLFxuICAgICAgbm9kZXMgPSBfYSA9PT0gdm9pZCAwID8gW10gOiBfYSxcbiAgICAgIF9iID0gZ3JhcGhEYXRhLmVkZ2VzLFxuICAgICAgZWRnZXMgPSBfYiA9PT0gdm9pZCAwID8gW10gOiBfYjtcbiAgdmFyIG5vZGVzQ291bnQgPSBub2Rlcy5sZW5ndGg7XG4gIHZhciBjdXJyZW50UmFuaztcbiAgdmFyIGN1clJhbmtzID0ge307XG4gIHZhciBwcmV2UmFua3MgPSB7fTsgLy8gSW5pdGlhbGl6ZSBwYWdlcmFua3Mg5Yid5aeL5YyWXG5cbiAgZm9yICh2YXIgaiA9IDA7IGogPCBub2Rlc0NvdW50OyArK2opIHtcbiAgICB2YXIgbm9kZSA9IG5vZGVzW2pdO1xuICAgIHZhciBub2RlSWQgPSBub2RlLmlkO1xuICAgIGN1clJhbmtzW25vZGVJZF0gPSAxIC8gbm9kZXNDb3VudDtcbiAgICBwcmV2UmFua3Nbbm9kZUlkXSA9IDEgLyBub2Rlc0NvdW50O1xuICB9XG5cbiAgdmFyIG5vZGVEZWdyZWUgPSAoMCwgX2RlZ3JlZS5kZWZhdWx0KShncmFwaERhdGEpO1xuXG4gIHdoaWxlIChtYXhJdGVyYXRpb25zID4gMCAmJiBkaXN0YW5jZSA+IGVwc2lsb24pIHtcbiAgICBsZWFrZWRSYW5rID0gMDtcblxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgbm9kZXNDb3VudDsgKytqKSB7XG4gICAgICB2YXIgbm9kZSA9IG5vZGVzW2pdO1xuICAgICAgdmFyIG5vZGVJZCA9IG5vZGUuaWQ7XG4gICAgICBjdXJyZW50UmFuayA9IDA7XG5cbiAgICAgIGlmIChub2RlRGVncmVlW25vZGUuaWRdLmluRGVncmVlID09PSAwKSB7XG4gICAgICAgIGN1clJhbmtzW25vZGVJZF0gPSAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIG5laWdoYm9ycyA9ICgwLCBfdXRpbC5nZXROZWlnaGJvcnMpKG5vZGVJZCwgZWRnZXMsICdzb3VyY2UnKTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5laWdoYm9ycy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgIHZhciBuZWlnaGJvciA9IG5laWdoYm9yc1tpXTtcbiAgICAgICAgICB2YXIgb3V0RGVncmVlID0gbm9kZURlZ3JlZVtuZWlnaGJvcl0ub3V0RGVncmVlO1xuICAgICAgICAgIGlmIChvdXREZWdyZWUgPiAwKSBjdXJyZW50UmFuayArPSBwcmV2UmFua3NbbmVpZ2hib3JdIC8gb3V0RGVncmVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY3VyUmFua3Nbbm9kZUlkXSA9IGxpbmtQcm9iICogY3VycmVudFJhbms7XG4gICAgICAgIGxlYWtlZFJhbmsgKz0gY3VyUmFua3Nbbm9kZUlkXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZWFrZWRSYW5rID0gKDEgLSBsZWFrZWRSYW5rKSAvIG5vZGVzQ291bnQ7XG4gICAgZGlzdGFuY2UgPSAwO1xuXG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBub2Rlc0NvdW50OyArK2opIHtcbiAgICAgIHZhciBub2RlID0gbm9kZXNbal07XG4gICAgICB2YXIgbm9kZUlkID0gbm9kZS5pZDtcbiAgICAgIGN1cnJlbnRSYW5rID0gY3VyUmFua3Nbbm9kZUlkXSArIGxlYWtlZFJhbms7XG4gICAgICBkaXN0YW5jZSArPSBNYXRoLmFicyhjdXJyZW50UmFuayAtIHByZXZSYW5rc1tub2RlSWRdKTtcbiAgICAgIHByZXZSYW5rc1tub2RlSWRdID0gY3VycmVudFJhbms7XG4gICAgfVxuXG4gICAgbWF4SXRlcmF0aW9ucyAtPSAxO1xuICB9XG5cbiAgcmV0dXJuIHByZXZSYW5rcztcbn07XG5cbnZhciBfZGVmYXVsdCA9IHBhZ2VSYW5rO1xuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///310\n")},function(module,exports,__webpack_require__){"use strict";eval('\n\nObject.defineProperty(exports, "__esModule", {\n value: true\n});\nexports.default = void 0;\n\nvar _tslib = __webpack_require__(1);\n\nvar _floydWarshall = _interopRequireDefault(__webpack_require__(183));\n\nvar _gSpan = _interopRequireDefault(__webpack_require__(312));\n\nvar _dijkstra = _interopRequireDefault(__webpack_require__(151));\n\nvar _util = __webpack_require__(45);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * 为 graphData 中每个节点生成邻居单元数组\n * @param graphData\n * @param spm\n * @param nodeLabelProp\n * @param k k-近邻\n */\nvar findKNeighborUnits = function findKNeighborUnits(graphData, spm, nodeLabelProp, k) {\n if (nodeLabelProp === void 0) {\n nodeLabelProp = \'cluster\';\n }\n\n if (k === void 0) {\n k = 2;\n }\n\n var units = [];\n var nodes = graphData.nodes;\n spm.forEach(function (row, i) {\n units.push(findKNeighborUnit(nodes, row, i, nodeLabelProp, k));\n });\n return units;\n};\n\nvar findKNeighborUnit = function findKNeighborUnit(nodes, row, i, nodeLabelProp, k) {\n var unitNodeIdxs = [i];\n var neighbors = [];\n var labelCountMap = {};\n row.forEach(function (v, j) {\n if (v <= k && i !== j) {\n unitNodeIdxs.push(j);\n neighbors.push(nodes[j]);\n var label = nodes[j][nodeLabelProp];\n if (!labelCountMap[label]) labelCountMap[label] = {\n count: 1,\n dists: [v]\n };else {\n labelCountMap[label].count++;\n labelCountMap[label].dists.push(v);\n }\n }\n }); // 将 labelCountMap 中的 dists 按照从小到大排序,方便后面使用\n\n Object.keys(labelCountMap).forEach(function (label) {\n labelCountMap[label].dists = labelCountMap[label].dists.sort(function (a, b) {\n return a - b;\n });\n });\n return {\n nodeIdx: i,\n nodeId: nodes[i].id,\n nodeIdxs: unitNodeIdxs,\n neighbors: neighbors,\n neighborNum: unitNodeIdxs.length - 1,\n nodeLabelCountMap: labelCountMap\n };\n};\n/**\n * 随机寻找点对,满足距离小于 k\n * @param k 参数 k,表示 k-近邻\n * @param nodeNum 参数 length\n * @param maxNodePairNum 寻找点对的数量不超过 maxNodePairNum\n * @param spm 最短路径矩阵\n */\n\n\nvar findNodePairsRandomly = function findNodePairsRandomly(k, nodeNum, maxNodePairNum, kNeighborUnits, spm) {\n // 每个节点需要随机找出的点对数\n var nodePairNumEachNode = Math.ceil(maxNodePairNum / nodeNum);\n var nodePairMap = {};\n var foundNodePairCount = 0; // 遍历节点,为每个节点随机找出 nodePairNumEachNode 个点对,满足距离小于 k。找到的点对数量超过 maxNodePairNum 或所有节点遍历结束时终止\n\n kNeighborUnits.forEach(function (unit, i) {\n // 若未达到 nodePairNumEachNode,或循环次数小于最大循环次数(2 * nodeNum),继续循环\n var nodePairForICount = 0;\n var outerLoopCount = 0;\n var neighbors = unit.nodeIdxs; // the first one is the center node\n\n var neighborNum = unit.neighborNum - 1;\n\n while (nodePairForICount < nodePairNumEachNode) {\n // 另一端节点在节点数组中的的 index\n var oidx = neighbors[1 + Math.floor(Math.random() * neighborNum)];\n var innerLoopCount = 0; // 若随机得到的另一端 idx 不符合条件,则继续 random。条件是不是同一个节点、这个点对没有被记录过、距离小于 k\n\n while (nodePairMap[i + "-" + oidx] || nodePairMap[oidx + "-" + i]) {\n oidx = Math.floor(Math.random() * nodeNum);\n innerLoopCount++;\n if (innerLoopCount > 2 * nodeNum) break; // 循环次数大于最大循环次数(2 * nodeNum)跳出循环,避免死循环\n }\n\n if (innerLoopCount < 2 * nodeNum) {\n // 未达到最大循环次数,说明找到了合适的另一端\n nodePairMap[i + "-" + oidx] = {\n start: i,\n end: oidx,\n distance: spm[i][oidx]\n };\n nodePairForICount++;\n foundNodePairCount++; // 如果当前找到的点对数量达到了上限,返回结果\n\n if (foundNodePairCount >= maxNodePairNum) return nodePairMap;\n }\n\n outerLoopCount++;\n if (outerLoopCount > 2 * nodeNum) break; // 循环次数大于最大循环次数(2 * nodeNum)跳出循环,避免死循环\n } // 这个节点没有找到足够 nodePairNumEachNode 的点对。更新 nodePairNumEachNode,让后续节点找更多的点对\n\n\n if (nodePairForICount < nodePairNumEachNode) {\n var gap = nodePairNumEachNode - nodePairForICount;\n nodePairNumEachNode = (nodePairNumEachNode + gap) / (nodeNum - i - 1);\n }\n });\n return nodePairMap;\n};\n/**\n * 计算所有 nodePairMap 中节点对的相交邻居诱导子图\n * @param nodePairMap 节点对 map,key 为 node1.id-node2.id,value 为 { startNodeIdx, endNodeIdx, distance }\n * @param neighborUnits 每个节点的邻居元数组\n * @param graphData 原图数据\n * @param edgeMap 边的 map,方便检索\n * @param cachedInducedGraphMap 缓存的结果,下次进入该函数将继续更新该缓存,若 key 在缓存中存在则不需要重复计算\n */\n\n\nvar getIntersectNeighborInducedGraph = function getIntersectNeighborInducedGraph(nodePairMap, neighborUnits, graphData, cachedInducedGraphMap) {\n var nodes = graphData.nodes;\n if (!cachedInducedGraphMap) cachedInducedGraphMap = {};\n Object.keys(nodePairMap).forEach(function (key) {\n var _a, _b;\n\n if (cachedInducedGraphMap && cachedInducedGraphMap[key]) return;\n cachedInducedGraphMap[key] = {\n nodes: [],\n edges: []\n };\n var pair = nodePairMap[key];\n var startUnitNodeIds = (_a = neighborUnits[pair.start]) === null || _a === void 0 ? void 0 : _a.nodeIdxs;\n var endUnitNodeIds = (_b = neighborUnits[pair.end]) === null || _b === void 0 ? void 0 : _b.nodeIdxs;\n if (!startUnitNodeIds || !endUnitNodeIds) return; // 不存在邻元,返回空图\n\n var endSet = new Set(endUnitNodeIds);\n var intersect = startUnitNodeIds.filter(function (x) {\n return endSet.has(x);\n }); // 可能会爆栈(在 1580 + 6 nodes full-connected 时出现)\n\n if (!intersect || !intersect.length) return; // 没有交集,返回空图\n\n var intersectIdMap = {};\n var intersectLength = intersect.length;\n\n for (var i = 0; i < intersectLength; i++) {\n var node = nodes[intersect[i]];\n cachedInducedGraphMap[key].nodes.push(node); // 将交集中的点加入诱导子图\n\n intersectIdMap[node.id] = true;\n } // 遍历所有边数据,如果边的两端都在交集中,将该边加入诱导子图\n\n\n graphData.edges.forEach(function (edge) {\n if (intersectIdMap[edge.source] && intersectIdMap[edge.target]) cachedInducedGraphMap[key].edges.push(edge);\n });\n });\n return cachedInducedGraphMap;\n};\n/**\n * 计算 strcutre 在 graph 上的匹配数量\n * @param graph 图数据\n * @param structure 目前支持只有两个节点一条边的最简单结构\n * @param nodeLabelProp 节点类型字段名\n * @param edgeLabelProp 边类型字段名\n */\n\n\nvar getMatchedCount = function getMatchedCount(graph, structure, nodeLabelProp, edgeLabelProp) {\n var _a, _b;\n\n var nodeMap = {};\n graph.nodes.forEach(function (node) {\n nodeMap[node.id] = node;\n });\n var count = 0;\n if (!((_a = structure === null || structure === void 0 ? void 0 : structure.edges) === null || _a === void 0 ? void 0 : _a.length) || ((_b = structure === null || structure === void 0 ? void 0 : structure.nodes) === null || _b === void 0 ? void 0 : _b.length) < 2) return 0;\n graph.edges.forEach(function (e) {\n var sourceLabel = nodeMap[e.source][nodeLabelProp];\n var targetLabel = nodeMap[e.target][nodeLabelProp];\n var strNodeLabel1 = structure === null || structure === void 0 ? void 0 : structure.nodes[0][nodeLabelProp];\n var strNodeLabel2 = structure === null || structure === void 0 ? void 0 : structure.nodes[1][nodeLabelProp];\n var strEdgeLabel = structure === null || structure === void 0 ? void 0 : structure.edges[0][edgeLabelProp];\n if (e[edgeLabelProp] !== strEdgeLabel) return;\n\n if (sourceLabel === strNodeLabel1 && targetLabel === strNodeLabel2 || sourceLabel === strNodeLabel2 && targetLabel === strNodeLabel1) {\n count++;\n }\n });\n return count;\n};\n/**\n * structures 中寻找最具有代表性的一个。这个结构是使得 matchedCountMap 的分组方式类内间距最小,类间间距最大\n * @param matchedCountMap 每个 structure 分类后的各图匹配数量,格式 { [strcture.idx]: { [interInducedGraphKey]: count } }\n * @param structureNum strcuture 个数,与 matchedCountMap.length 对应\n * @param structures\n */\n\n\nvar findRepresentStructure = function findRepresentStructure(matchedCountMap, structureNum, structures) {\n var maxOffset = Infinity,\n representClusterType = 0;\n\n var _loop_1 = function _loop_1(i) {\n // 一种分组的 map,key 是 intGraph 的 key,value 是 structures[i] 的匹配个数\n var countMapI = matchedCountMap[i]; // 按照 value 为该组排序,生成 keys 的数组:\n\n var sortedGraphKeys = Object.keys(countMapI).sort(function (a, b) {\n return countMapI[a] - countMapI[b];\n }); // 共 100 个 graphKeys,将 graphKeys 按顺序分为 groupNum 组\n\n var groupNum = 10;\n var clusters = []; // 总共有 groupNum 个项\n\n sortedGraphKeys.forEach(function (key, j) {\n if (!clusters[j % groupNum]) clusters[j % groupNum] = {\n graphs: [],\n totalCount: 0,\n aveCount: 0\n };\n clusters[j % groupNum].graphs.push(key);\n clusters[j % groupNum].totalCount += countMapI[key];\n }); // 计算 cluster 与 cluster 之间的距离 innerDist,每个 cluster 内部的距离 intraDist\n\n var aveIntraDist = 0; // 该类的类内平均值\n\n var aveCounts = []; // 类内平均匹配数量,将用于计算类间距离\n\n clusters.forEach(function (graphsInCluster) {\n // 类内均值\n var aveCount = graphsInCluster.totalCount / graphsInCluster.graphs.length;\n graphsInCluster.aveCount = aveCount;\n aveCounts.push(aveCount); // 对于每类,计算类内间距平均值\n\n var aveIntraPerCluster = 0;\n var graphsNum = graphsInCluster.length;\n graphsInCluster.graphs.forEach(function (graphKey1, j) {\n var graph1Count = countMapI[graphKey1];\n graphsInCluster.graphs.forEach(function (graphKey2, k) {\n if (j === k) return;\n aveIntraPerCluster += Math.abs(graph1Count - countMapI[graphKey2]);\n });\n });\n aveIntraPerCluster /= graphsNum * (graphsNum - 1) / 2;\n aveIntraDist += aveIntraPerCluster;\n });\n aveIntraDist /= clusters.length; // 用类内均值计算类间距\n\n var aveInterDist = 0; // 类间间距平均值\n\n aveCounts.forEach(function (aveCount1, j) {\n aveCounts.forEach(function (aveCount2, k) {\n if (j === k) return;\n aveInterDist += Math.abs(aveCount1 - aveCount2);\n });\n aveInterDist /= aveCounts.length * (aveCounts.length - 1) / 2;\n }); // 寻找 (类间间距均值-类内间距均值) 最大的一种分组方式(对应的 structure 就是最终要找的唯一 DS(G))\n\n var offset = aveInterDist - aveIntraDist;\n\n if (maxOffset < offset) {\n maxOffset = offset;\n representClusterType = i;\n }\n };\n\n for (var i = 0; i < structureNum; i++) {\n _loop_1(i);\n }\n\n return {\n structure: structures[representClusterType],\n structureCountMap: matchedCountMap[representClusterType]\n };\n};\n\nvar getNodeMaps = function getNodeMaps(nodes, nodeLabelProp) {\n var nodeMap = {},\n nodeLabelMap = {};\n nodes.forEach(function (node, i) {\n nodeMap[node.id] = {\n idx: i,\n node: node,\n degree: 0,\n inDegree: 0,\n outDegree: 0\n };\n var label = node[nodeLabelProp];\n if (!nodeLabelMap[label]) nodeLabelMap[label] = [];\n nodeLabelMap[label].push(node);\n });\n return {\n nodeMap: nodeMap,\n nodeLabelMap: nodeLabelMap\n };\n};\n\nvar getEdgeMaps = function getEdgeMaps(edges, edgeLabelProp, nodeMap) {\n var edgeMap = {},\n edgeLabelMap = {};\n edges.forEach(function (edge, i) {\n edgeMap["" + _util.uniqueId] = {\n idx: i,\n edge: edge\n };\n var label = edge[edgeLabelProp];\n if (!edgeLabelMap[label]) edgeLabelMap[label] = [];\n edgeLabelMap[label].push(edge);\n var sourceNode = nodeMap[edge.source];\n\n if (sourceNode) {\n sourceNode.degree++;\n sourceNode.outDegree++;\n }\n\n var targetNode = nodeMap[edge.target];\n\n if (targetNode) {\n targetNode.degree++;\n targetNode.inDegree++;\n }\n });\n return {\n edgeMap: edgeMap,\n edgeLabelMap: edgeLabelMap\n };\n};\n/**\n * 输出最短路径的 map,key 为 sourceNode.id-targetNode.id,value 为这两个节点的最短路径长度\n * @param nodes\n * @param spm\n * @param directed\n */\n\n\nvar getSpmMap = function getSpmMap(nodes, spm, directed) {\n var length = spm.length;\n var map = {};\n spm.forEach(function (row, i) {\n var start = directed ? 0 : i + 1;\n var iId = nodes[i].id;\n\n for (var j = start; j < length; j++) {\n if (i === j) continue;\n var jId = nodes[j].id;\n var dist = row[j];\n map[iId + "-" + jId] = dist;\n if (!directed) map[jId + "-" + iId] = dist;\n }\n });\n return map;\n};\n/**\n * 计算一对节点(node1,node2)的 NDS 距离\n * @param graph 原图数据\n * @param node1\n * @param node2\n */\n\n\nvar getNDSDist = function getNDSDist(graph, node1, node2, nodeMap, spDist, kNeighborUnits, structure, nodeLabelProp, edgeLabelProp, cachedNDSMap, cachedInterInducedGraph) {\n var _a;\n\n var key = node1.id + "-" + node2.id;\n if (cachedNDSMap && cachedNDSMap[key]) return cachedNDSMap[key];\n var interInducedGraph = cachedInterInducedGraph ? cachedInterInducedGraph[key] : undefined; // 若没有缓存相交邻居诱导子图,计算\n\n if (!interInducedGraph) {\n var pairMap = (_a = {}, _a[key] = {\n start: nodeMap[node1.id].idx,\n end: nodeMap[node2.id].idx,\n distance: spDist\n }, _a);\n cachedInterInducedGraph = getIntersectNeighborInducedGraph(pairMap, kNeighborUnits, graph, cachedInterInducedGraph);\n interInducedGraph = cachedInterInducedGraph[key];\n }\n\n return getMatchedCount(interInducedGraph, structure, nodeLabelProp, edgeLabelProp);\n};\n/**\n * 计算 pattern 上绩点的度数并存储到 minPatternNodeLabelDegreeMap\n */\n\n\nvar stashPatternNodeLabelDegreeMap = function stashPatternNodeLabelDegreeMap(minPatternNodeLabelDegreeMap, neighborLabel, patternNodeMap, patternNodeLabelMap) {\n var _a, _b, _c;\n\n var minPatternNodeLabelDegree = (_a = minPatternNodeLabelDegreeMap[neighborLabel]) === null || _a === void 0 ? void 0 : _a.degree;\n var minPatternNodeLabelInDegree = (_b = minPatternNodeLabelDegreeMap[neighborLabel]) === null || _b === void 0 ? void 0 : _b.inDegree;\n var minPatternNodeLabelOutDegree = (_c = minPatternNodeLabelDegreeMap[neighborLabel]) === null || _c === void 0 ? void 0 : _c.outDegree;\n\n if (minPatternNodeLabelDegreeMap[neighborLabel] === undefined) {\n minPatternNodeLabelDegree = Infinity;\n minPatternNodeLabelInDegree = Infinity;\n minPatternNodeLabelOutDegree = Infinity;\n patternNodeLabelMap[neighborLabel].forEach(function (patternNodeWithLabel) {\n var patternNodeDegree = patternNodeMap[patternNodeWithLabel.id].degree;\n if (minPatternNodeLabelDegree > patternNodeDegree) minPatternNodeLabelDegree = patternNodeDegree;\n var patternNodeInDegree = patternNodeMap[patternNodeWithLabel.id].inDegree;\n if (minPatternNodeLabelInDegree > patternNodeInDegree) minPatternNodeLabelInDegree = patternNodeInDegree;\n var patternNodeOutDegree = patternNodeMap[patternNodeWithLabel.id].outDegree;\n if (minPatternNodeLabelOutDegree > patternNodeOutDegree) minPatternNodeLabelOutDegree = patternNodeOutDegree;\n });\n minPatternNodeLabelDegreeMap[neighborLabel] = {\n degree: minPatternNodeLabelDegree,\n inDegree: minPatternNodeLabelInDegree,\n outDegree: minPatternNodeLabelOutDegree\n };\n }\n\n return {\n minPatternNodeLabelDegree: minPatternNodeLabelDegree,\n minPatternNodeLabelInDegree: minPatternNodeLabelInDegree,\n minPatternNodeLabelOutDegree: minPatternNodeLabelOutDegree\n };\n};\n/**\n * GADDI 模式匹配\n * @param graphData 原图数据\n * @param pattern 搜索图(需要在原图上搜索的模式)数据\n * @param directed 是否计算有向图,默认 false\n * @param k 参数 k,表示 k-近邻\n * @param length 参数 length\n * @param nodeLabelProp 节点数据中代表节点标签(分类信息)的属性名。默认为 cluster\n * @param edgeLabelProp 边数据中代表边标签(分类信息)的属性名。默认为 cluster\n */\n\n\nvar GADDI = function GADDI(graphData, pattern, directed, k, length, nodeLabelProp, edgeLabelProp) {\n if (directed === void 0) {\n directed = false;\n }\n\n if (nodeLabelProp === void 0) {\n nodeLabelProp = \'cluster\';\n }\n\n if (edgeLabelProp === void 0) {\n edgeLabelProp = \'cluster\';\n }\n\n if (!graphData || !graphData.nodes) return; // 分为三步:\n // 0. 预计算:节点/边数,邻接矩阵、最短路径矩阵\n // 1. 处理原图 graphData。再分为 1~5 小步\n // 2. 匹配\n // console.log("----- stage-pre: preprocessing -------");\n // -------- 第零步,预计算:节点/边数,邻接矩阵、最短路径矩阵-------\n\n var nodeNum = graphData.nodes.length;\n if (!nodeNum) return; // console.log("----- stage-pre.1: calc shortest path matrix for graph -------");\n\n var spm = (0, _floydWarshall.default)(graphData, directed); // console.log(\n // "----- stage-pre.2: calc shortest path matrix for pattern -------"\n // );\n\n var patternSpm = (0, _floydWarshall.default)(pattern, directed); // console.log(\n // "----- stage-pre.3: calc shortest path matrix map for graph -------"\n // );\n\n var spmMap = getSpmMap(graphData.nodes, spm, directed); // console.log(\n // "----- stage-pre.4: calc shortest path matrix map for pattern -------"\n // );\n\n var patternSpmMap = getSpmMap(pattern.nodes, patternSpm, directed); // console.log("----- stage-pre.5: establish maps -------");\n // 节点的 map,以 id 为 id 映射,方便后续快速检索\n\n var _a = getNodeMaps(graphData.nodes, nodeLabelProp),\n nodeMap = _a.nodeMap,\n nodeLabelMap = _a.nodeLabelMap;\n\n var _b = getNodeMaps(pattern.nodes, nodeLabelProp),\n patternNodeMap = _b.nodeMap,\n patternNodeLabelMap = _b.nodeLabelMap; // 计算节点度数\n\n\n getEdgeMaps(graphData.edges, edgeLabelProp, nodeMap);\n var patternEdgeLabelMap = getEdgeMaps(pattern.edges, edgeLabelProp, patternNodeMap).edgeLabelMap; // 若未指定 length,自动计算 pattern 半径(最短路径最大值)\n\n var patternSpmSpread = [];\n patternSpm === null || patternSpm === void 0 ? void 0 : patternSpm.forEach(function (row) {\n patternSpmSpread = patternSpmSpread.concat(row);\n });\n if (!length) length = Math.max.apply(Math, (0, _tslib.__spreadArray)((0, _tslib.__spreadArray)([], patternSpmSpread), [2]));\n if (!k) k = length; // console.log("params", directed, length, k);\n // console.log("----- stage-pre.6: calc k neighbor units -------");\n // 计算每个节点的 k 邻元集合\n\n var kNeighborUnits = findKNeighborUnits(graphData, spm, nodeLabelProp, k);\n var patternKNeighborUnits = findKNeighborUnits(pattern, patternSpm, nodeLabelProp, k); // console.log(\n // "----- stage0: going to processing graph and find intersect neighbor induced graphs -------"\n // );\n // console.log("----- stage0.1: going to select random node pairs -------");\n // -------- 第一步,处理原图 graphData-------\n // 1.1. 随机选择最多 100 个点对,满足距离小于 Length 和 k\n // 当 graphData 少于 20 个节点,则不能找出 100 个点对,只找出不多于 n(n-1)/2 个点对\n\n var maxNodePairNum = Math.min(100, nodeNum * (nodeNum - 1) / 2);\n var nodePairsMap = findNodePairsRandomly(k, nodeNum, maxNodePairNum, patternKNeighborUnits, spm); // console.log(\n // "----- stage0.2: going to calculate intersect neighbor induced graphs -------"\n // );\n // 1.2. 生成上面节点对的相应相交邻居诱导子图。格式为 {\'beginNodeIdx-endNodeIdx\': {nodes: [], edges: []}}\n\n var intGMap = getIntersectNeighborInducedGraph(nodePairsMap, kNeighborUnits, graphData); // 1.3. 使用 gSpan 算法(frequent graph mining)计算 ISIntG 的前 10 个频率最高的子结构(3-4条边)\n\n var top = 10,\n minSupport = 1,\n minNodeNum = 1,\n maxNodeNum = 4;\n var params = {\n graphs: intGMap,\n nodeLabelProp: nodeLabelProp,\n edgeLabelProp: edgeLabelProp,\n minSupport: minSupport,\n minNodeNum: minNodeNum,\n maxNodeNum: maxNodeNum,\n directed: directed\n }; // console.log(\n // "----- stage1: (gSpan) going to find frequent structure dsG -------"\n // );\n // console.log("----- stage1.1: going to run gSpan -------");\n // 暂时假设生成的 sub structure 都只有一条边\n\n var freStructures = (0, _gSpan.default)(params).slice(0, top); // structureNum 可能小于 top\n\n var structureNum = freStructures.length; // 1.4. 计算上述 10 个子结构在 intGMap 中每个诱导子图的匹配个数\n\n var matchedCountMap = [];\n freStructures.forEach(function (structure, i) {\n matchedCountMap[i] = {};\n Object.keys(intGMap).forEach(function (key) {\n var graph = intGMap[key];\n var subStructureCount = getMatchedCount(graph, structure, nodeLabelProp, edgeLabelProp);\n matchedCountMap[i][key] = subStructureCount;\n });\n }); // console.log(\n // "----- stage1.1: going to find the most represent strucutre -------"\n // );\n // 1.5. 对于每个子结构,根据匹配个数为 intGMap 中的诱导子图分组,生成 structureNum 种分组\n // 计算每种分组的类间距和类内间距,找到类间距最大、类内间距最小的一种分组,这种分组对应的子结构被选为唯一代表性子结构 DS(G)\n\n var _c = findRepresentStructure(matchedCountMap, structureNum, freStructures),\n dsG = _c.structure,\n ndsDist = _c.structureCountMap; // -------- 第二步,匹配-------\n // 2.1 从 Q 中的第一个标签的第一个节点开始,寻找 G 中的匹配\n\n\n var beginPNode = pattern.nodes[0];\n var label = beginPNode[nodeLabelProp]; // 2.1.1 找到 G 中标签与之相同的节点\n\n var candidates = nodeLabelMap[label]; // console.log("----- stage2: going to find candidates -------");\n // 全局缓存,避免重复计算\n\n var minPatternNodeLabelDegreeMap = {}; // key 是 label,value 是该 label 节点的最小度数\n\n var patternIntGraphMap = {},\n patternNDSDist = {},\n // key 为 node.id-node.id\n patternNDSDistMap = {}; // key 为 node.id-label2,value nds距离值数组(按从大到小排序,无需关心具体对应哪个 node2)\n // 2.2.2 对于 Q 中的另一个标签的 k 个节点,计算它们到 node 的最短路径以及 NDS 距离\n\n var patternSpDist = {};\n var patternSpDistBack = {};\n Object.keys(patternNodeLabelMap).forEach(function (label2, j) {\n patternSpDist[label2] = [];\n\n if (directed) {\n patternSpDistBack[label2] = [];\n }\n\n var maxDist = -Infinity;\n var patternNodesWithLabel2 = patternNodeLabelMap[label2];\n var patternNodePairMap = {};\n patternNodesWithLabel2.forEach(function (nodeWithLabel2) {\n var dist = patternSpmMap[beginPNode.id + "-" + nodeWithLabel2.id];\n dist && patternSpDist[label2].push(dist);\n if (maxDist < dist) maxDist = dist;\n patternNodePairMap[beginPNode.id + "-" + nodeWithLabel2.id] = {\n start: 0,\n end: patternNodeMap[nodeWithLabel2.id].idx,\n distance: dist\n };\n\n if (directed) {\n var distBack = patternSpmMap[nodeWithLabel2.id + "-" + beginPNode.id];\n distBack && patternSpDistBack[label2].push(distBack);\n }\n }); // spDist[label2] 按照从小到大排序\n\n patternSpDist[label2] = patternSpDist[label2].sort(function (a, b) {\n return a - b;\n });\n if (directed) patternSpDistBack[label2] = patternSpDistBack[label2].sort(function (a, b) {\n return a - b;\n }); // 计算 Q 中所有 label2 节点到 beginPNode 的 NDS 距离\n // 所有 label2 节点到 beginPNode 的邻居相交诱导子图:\n // key: node1.id-node2.id\n\n patternIntGraphMap = getIntersectNeighborInducedGraph(patternNodePairMap, patternKNeighborUnits, pattern, patternIntGraphMap); // pattern 中 beginNode 到当前 label2 节点 的 NDS 距离(数组,无需关心具体对应到哪个节点)\n\n var currentPatternNDSDistArray = [];\n Object.keys(patternNodePairMap).forEach(function (key) {\n if (patternNDSDist[key]) {\n currentPatternNDSDistArray.push(patternNDSDist[key]);\n return; // 缓存过则不需要再次计算\n }\n\n var patternIntGraph = patternIntGraphMap[key];\n patternNDSDist[key] = getMatchedCount(patternIntGraph, dsG, nodeLabelProp, edgeLabelProp);\n currentPatternNDSDistArray.push(patternNDSDist[key]);\n }); // 根据值为 currentPatternNDSDist 从大到小排序\n\n currentPatternNDSDistArray = currentPatternNDSDistArray.sort(function (a, b) {\n return b - a;\n });\n patternNDSDistMap[beginPNode.id + "-" + label2] = currentPatternNDSDistArray;\n if (label2 === label) return;\n var candidatesNum = candidates.length;\n\n var _loop_4 = function _loop_4(m) {\n var cNode = candidates[m]; // prune1:若 candidates 中节点 cNode 的 kNeighborUnits 中标签为 label2 的节点个数少于 pattern 中 label2 个数,删去它\n\n var graphNeighborUnit = kNeighborUnits[nodeMap[cNode.id].idx];\n var graphNeighborUnitCountMap = graphNeighborUnit.nodeLabelCountMap[label2];\n var patternLabel2Num = patternNodeLabelMap[label2].length;\n\n if (!graphNeighborUnitCountMap || graphNeighborUnitCountMap.count < patternLabel2Num) {\n candidates.splice(m, 1);\n return "continue";\n } // prune2:若 candidates 中节点 cNode 到 kNeighborUnits 中标签为 label2 的节点最短路径大于 patternSpDist[label2],删去它\n // (prune2 规则即:candidate 相关的最短路径的最大 spDist[label2].length 个,按照大小顺序依次和 patternSpDist[label2] 中的值比较,只要遇到一个是 G > Q 的,就删去这个 candidate)\n\n\n var prune2Invalid = false;\n\n for (var n = 0; n < patternLabel2Num; n++) {\n if (graphNeighborUnitCountMap.dists[n] > patternSpDist[label2][n]) {\n prune2Invalid = true;\n break;\n }\n }\n\n if (prune2Invalid) {\n candidates.splice(m, 1);\n return "continue";\n } // prune3:若 candidates 中节点 cNode 到 kNeighborUnits 中标签为 label2 的节点 NDS 距离小于 patternNDSDist[beginNode.id-label2],删去它\n // TODO:prune3,currentPatternNDSDistArray 与 currentNDSDist 的比较\n // 计算 G 中所有 label2 节点到 cNode 的 NDS 距离\n // 所有 label2 节点到 cNode 的邻居相交诱导子图:\n\n\n var cNodePairMap = {};\n graphNeighborUnit.neighbors.forEach(function (neighborNode) {\n var dist = spmMap[cNode.id + "-" + neighborNode.id];\n cNodePairMap[cNode.id + "-" + neighborNode.id] = {\n start: nodeMap[cNode.id].idx,\n end: nodeMap[neighborNode.id].idx,\n distance: dist\n };\n }); // 更新 intGMap\n\n intGMap = getIntersectNeighborInducedGraph(cNodePairMap, kNeighborUnits, graphData, intGMap); // candidate 到它周围 label2 节点的 NDS 距离, key 是 node.id-node.id\n\n var currentNDSDistArray = [];\n Object.keys(cNodePairMap).forEach(function (key) {\n if (ndsDist[key]) {\n currentNDSDistArray.push(ndsDist[key]);\n return; // 缓存过则不需要再次计算\n }\n\n var intGraph = intGMap[key];\n ndsDist[key] = getMatchedCount(intGraph, dsG, nodeLabelProp, edgeLabelProp);\n currentNDSDistArray.push(ndsDist[key]);\n }); // 根据值为 currentNDSDistArray 从大到小排序\n\n currentNDSDistArray = currentNDSDistArray.sort(function (a, b) {\n return b - a;\n });\n var prune3Invalid = false;\n\n for (var n = 0; n < patternLabel2Num; n++) {\n if (currentNDSDistArray[n] < currentPatternNDSDistArray[n]) {\n prune3Invalid = true;\n break;\n }\n }\n\n if (prune3Invalid) {\n candidates.splice(m, 1);\n return "continue";\n }\n };\n\n for (var m = candidatesNum - 1; m >= 0; m--) {\n _loop_4(m);\n }\n });\n var candidateGraphs = []; // console.log(\n // "----- stage3: going to splice neighbors for each candidate graph -------"\n // );\n // candidates 经过筛选后,以每个 candidate 为中心,生成 Length-neighbor 的邻居诱导子图\n // 并在诱导子图中去除不可能在 Q 上找到匹配的点:在 Q 上不存在的 label,其他 label 到 candidate 的最大最短距离符合 Q、NDS 距离符合 Q\n\n candidates === null || candidates === void 0 ? void 0 : candidates.forEach(function (candidate) {\n var nodeIdx = nodeMap[candidate.id].idx;\n var lengthNeighborUnit = findKNeighborUnit(graphData.nodes, spm[nodeIdx], nodeIdx, nodeLabelProp, length);\n var neighborNodes = lengthNeighborUnit.neighbors; // 删除不可能找到匹配的邻居点\n\n var neighborNum = neighborNodes.length;\n var unmatched = false;\n\n for (var i = neighborNum - 1; i >= 0; i--) {\n // 如果通过裁剪,符合条件的节点数量已过少,说明不能匹配这个 candidate 相关的图\n if (neighborNodes.length + 1 < pattern.nodes.length) {\n unmatched = true;\n return;\n }\n\n var neighborNode = neighborNodes[i];\n var neighborLabel = neighborNode[nodeLabelProp]; // prune1: 若该邻居点的 label 不存在于 pattern 中,移除这个点\n\n if (!patternNodeLabelMap[neighborLabel] || !patternNodeLabelMap[neighborLabel].length) {\n neighborNodes.splice(i, 1);\n continue;\n } // prune2: 若该邻居点到 candidate 的最短路径比和它有相同 label 的节点到 beginPNode 的最大最短路径长度长,移除这个点\n // prune2.1: 如果没有这个标签到 beginPNode 的距离记录,说明 pattern 上(可能 beginPNode 是这个 label)没有其他这个 label 的节点\n\n\n if (!patternSpDist[neighborLabel] || !patternSpDist[neighborLabel].length) {\n neighborNodes.splice(i, 1);\n continue;\n }\n\n var key = candidate.id + "-" + neighborNode.id; // prune2.2\n\n var distToCandidate = spmMap[key];\n var idx = patternSpDist[neighborLabel].length - 1;\n var maxDistWithLabelInPattern = patternSpDist[neighborLabel][idx]; // patternSpDist[neighborLabel] 已经按照从小到大排序\n\n if (distToCandidate > maxDistWithLabelInPattern) {\n neighborNodes.splice(i, 1);\n continue;\n }\n\n if (directed) {\n var keyBack = neighborNode.id + "-" + candidate.id;\n var distFromCandidate = spmMap[keyBack];\n idx = patternSpDistBack[neighborLabel].length - 1;\n var maxBackDistWithLabelInPattern = patternSpDistBack[neighborLabel][idx];\n\n if (distFromCandidate > maxBackDistWithLabelInPattern) {\n neighborNodes.splice(i, 1);\n continue;\n }\n } // prune3: 若该邻居点到 candidate 的 NDS 距离比和它有相同 label 的节点到 beginPNode 的最小 NDS 距离小,移除这个点\n\n\n var ndsToCandidate = ndsDist[key] ? ndsDist[key] : getNDSDist(graphData, candidate, neighborNode, nodeMap, distToCandidate, kNeighborUnits, dsG, nodeLabelProp, edgeLabelProp, ndsDist, intGMap);\n var patternKey = beginPNode.id + "-" + neighborLabel;\n var minNdsWithLabelInPattern = patternNDSDistMap[patternKey][patternNDSDistMap[patternKey].length - 1]; // patternNDSDist[key] 一定存在\n\n if (ndsToCandidate < minNdsWithLabelInPattern) {\n neighborNodes.splice(i, 1);\n continue;\n } // prune4: 若该邻居点的度数小于 pattern 同 label 节点最小度数,删去该点\n\n\n var _a = stashPatternNodeLabelDegreeMap(minPatternNodeLabelDegreeMap, neighborLabel, patternNodeMap, patternNodeLabelMap),\n minPatternNodeLabelDegree = _a.minPatternNodeLabelDegree,\n minPatternNodeLabelInDegree = _a.minPatternNodeLabelInDegree,\n minPatternNodeLabelOutDegree = _a.minPatternNodeLabelOutDegree;\n\n if (nodeMap[neighborNode.id].degree < minPatternNodeLabelDegree) {\n neighborNodes.splice(i, 1);\n continue;\n }\n } // 节点在个数上符合匹配(不少于 pattern 的节点个数),现在筛选相关边\n\n\n if (!unmatched) {\n candidateGraphs.push({\n nodes: [candidate].concat(neighborNodes)\n });\n }\n }); // console.log(\n // "----- stage4: going to splice edges and neighbors for each candidate graph -------"\n // );\n\n var undirectedLengthsToBeginPNode = (0, _dijkstra.default)(pattern, beginPNode.id, false).length;\n var undirectedLengthsToBeginPNodeLabelMap = {};\n\n if (directed) {\n Object.keys(undirectedLengthsToBeginPNode).forEach(function (nodeId) {\n var nodeLabel = patternNodeMap[nodeId].node[nodeLabelProp];\n if (!undirectedLengthsToBeginPNodeLabelMap[nodeLabel]) undirectedLengthsToBeginPNodeLabelMap[nodeLabel] = [undirectedLengthsToBeginPNode[nodeId]];else undirectedLengthsToBeginPNodeLabelMap[nodeLabel].push(undirectedLengthsToBeginPNode[nodeId]);\n });\n Object.keys(undirectedLengthsToBeginPNodeLabelMap).forEach(function (pLabel) {\n undirectedLengthsToBeginPNodeLabelMap[pLabel].sort(function (a, b) {\n return a - b;\n });\n });\n } else {\n undirectedLengthsToBeginPNodeLabelMap = patternSpDist;\n } // 现在 candidateGraphs 里面只有节点,进行边的筛选\n\n\n var candidateGraphNum = candidateGraphs.length;\n\n var _loop_2 = function _loop_2(i) {\n var candidateGraph = candidateGraphs[i];\n var candidate = candidateGraph.nodes[0];\n var candidateNodeLabelCountMap = {};\n var candidateNodeMap = {};\n candidateGraph.nodes.forEach(function (node, q) {\n candidateNodeMap[node.id] = {\n idx: q,\n node: node,\n degree: 0,\n inDegree: 0,\n outDegree: 0\n };\n var cNodeLabel = node[nodeLabelProp];\n if (!candidateNodeLabelCountMap[cNodeLabel]) candidateNodeLabelCountMap[cNodeLabel] = 1;else candidateNodeLabelCountMap[cNodeLabel]++;\n }); // 根据 candidate 和 neighborNodes 中的节点生成 G 的诱导子图\n // 即,将 graphData 上两端都在 candidateGraph.nodes 中的边放入 candidateEdges\n\n var candidateEdges = [];\n var edgeLabelCountMap = {};\n graphData.edges.forEach(function (edge) {\n if (candidateNodeMap[edge.source] && candidateNodeMap[edge.target]) {\n candidateEdges.push(edge);\n if (!edgeLabelCountMap[edge[edgeLabelProp]]) edgeLabelCountMap[edge[edgeLabelProp]] = 1;else edgeLabelCountMap[edge[edgeLabelProp]]++;\n candidateNodeMap[edge.source].degree++;\n candidateNodeMap[edge.target].degree++;\n candidateNodeMap[edge.source].outDegree++;\n candidateNodeMap[edge.target].inDegree++;\n }\n }); // prune:若有一个 edgeLabel 在 candidateGraph 上的个数少于 pattern,去除该图\n\n var pattenrEdgeLabelNum = Object.keys(patternEdgeLabelMap).length;\n var prunedByEdgeLabel = false;\n\n for (var e = 0; e < pattenrEdgeLabelNum; e++) {\n var label_1 = Object.keys(patternEdgeLabelMap)[e];\n\n if (!edgeLabelCountMap[label_1] || edgeLabelCountMap[label_1] < patternEdgeLabelMap[label_1].length) {\n prunedByEdgeLabel = true;\n break;\n }\n }\n\n if (prunedByEdgeLabel) {\n candidateGraphs.splice(i, 1);\n return "continue";\n } // 遍历 candidateEdges,进行边的筛选\n\n\n var candidateEdgeNum = candidateEdges.length; // prune:若边数过少,去除该图\n\n if (candidateEdgeNum < pattern.edges.length) {\n candidateGraphs.splice(i, 1);\n return "break";\n }\n\n var candidateGraphInvalid = false;\n\n var _loop_5 = function _loop_5(e) {\n var edge = candidateEdges[e];\n var edgeLabel = edge[edgeLabelProp];\n var patternEdgesWithLabel = patternEdgeLabelMap[edgeLabel]; // prune 1: 若边的 label 不存在于 pattern 边 label 中,去除该边\n\n if (!patternEdgesWithLabel || !patternEdgesWithLabel.length) {\n edgeLabelCountMap[edgeLabel]--; // 若这个 label 的 count 减少之后,该 label 的边数不足,去除该图\n\n if (patternEdgesWithLabel && edgeLabelCountMap[edgeLabel] < patternEdgesWithLabel.length) {\n candidateGraphInvalid = true;\n return "break";\n }\n\n candidateEdges.splice(e, 1);\n candidateNodeMap[edge.source].degree--;\n candidateNodeMap[edge.target].degree--;\n candidateNodeMap[edge.source].outDegree--;\n candidateNodeMap[edge.target].inDegree--;\n return "continue";\n } // prune 2: 若边的 label +两端 label 的三元组关系不能在 pattern 中找到,去除该边\n\n\n var sourceLabel = candidateNodeMap[edge.source].node[nodeLabelProp];\n var targetLabel = candidateNodeMap[edge.target].node[nodeLabelProp];\n var edgeMatched = false;\n patternEdgesWithLabel.forEach(function (patternEdge) {\n var patternSource = patternNodeMap[patternEdge.source].node;\n var patternTarget = patternNodeMap[patternEdge.target].node;\n if (patternSource[nodeLabelProp] === sourceLabel && patternTarget[nodeLabelProp] === targetLabel) edgeMatched = true;\n if (!directed && patternSource[nodeLabelProp] === targetLabel && patternTarget[nodeLabelProp] === sourceLabel) edgeMatched = true;\n });\n\n if (!edgeMatched) {\n edgeLabelCountMap[edgeLabel]--; // 若这个 label 的 count 减少之后,该 label 的边数不足,去除该图\n\n if (patternEdgesWithLabel && edgeLabelCountMap[edgeLabel] < patternEdgesWithLabel.length) {\n candidateGraphInvalid = true;\n return "break";\n }\n\n candidateEdges.splice(e, 1);\n candidateNodeMap[edge.source].degree--;\n candidateNodeMap[edge.target].degree--;\n candidateNodeMap[edge.source].outDegree--;\n candidateNodeMap[edge.target].inDegree--;\n return "continue";\n }\n };\n\n for (var e = candidateEdgeNum - 1; e >= 0; e--) {\n var state_2 = _loop_5(e);\n\n if (state_2 === "break") break;\n } // prune2: 删除边的过程中,发现边数过少/边 label 数过少时,去除该图\n\n\n if (candidateGraphInvalid) {\n candidateGraphs.splice(i, 1);\n return "continue";\n }\n\n candidateGraph.edges = candidateEdges;\n var lengthsToCandidate = (0, _dijkstra.default)(candidateGraph, candidateGraph.nodes[0].id, false).length;\n Object.keys(lengthsToCandidate).reverse().forEach(function (targetId) {\n if (targetId === candidateGraph.nodes[0].id || candidateGraphInvalid) return; // prune4: 通过上述裁剪,可能导致该邻居子图变为不连通。裁剪掉目前在这个邻居子图中和 candidate(第一个节点)不连通的节点\n\n if (lengthsToCandidate[targetId] === Infinity) {\n var targetNodeLabel = candidateNodeMap[targetId].node[nodeLabelProp];\n candidateNodeLabelCountMap[targetNodeLabel]--;\n\n if (candidateNodeLabelCountMap[targetNodeLabel] < patternNodeLabelMap[targetNodeLabel].length) {\n candidateGraphInvalid = true;\n return;\n }\n\n var idx = candidateGraph.nodes.indexOf(candidateNodeMap[targetId].node);\n candidateGraph.nodes.splice(idx, 1);\n candidateNodeMap[targetId] = undefined;\n return;\n } // prune5: 经过边裁剪后,可能又出现了最短路径过长的节点 (比 pattern 中同 label 的节点到 beginNode 最大最短距离远),删去这些节点\n\n\n var nLabel = nodeMap[targetId].node[nodeLabelProp];\n\n if (!undirectedLengthsToBeginPNodeLabelMap[nLabel] || !undirectedLengthsToBeginPNodeLabelMap[nLabel].length || lengthsToCandidate[targetId] > undirectedLengthsToBeginPNodeLabelMap[nLabel][undirectedLengthsToBeginPNodeLabelMap[nLabel].length - 1]) {\n var targetNodeLabel = candidateNodeMap[targetId].node[nodeLabelProp];\n candidateNodeLabelCountMap[targetNodeLabel]--;\n\n if (candidateNodeLabelCountMap[targetNodeLabel] < patternNodeLabelMap[targetNodeLabel].length) {\n candidateGraphInvalid = true;\n return;\n }\n\n var idx = candidateGraph.nodes.indexOf(candidateNodeMap[targetId].node);\n candidateGraph.nodes.splice(idx, 1);\n candidateNodeMap[targetId] = undefined;\n }\n });\n\n if (candidateGraphInvalid) {\n candidateGraphs.splice(i, 1);\n return "continue";\n }\n\n var degreeChanged = true;\n var loopCount = 0;\n\n while (degreeChanged && !candidateGraphInvalid) {\n degreeChanged = false; // candidate 度数不足,删去该图\n\n var condition = directed ? candidateNodeMap[candidate.id].degree < patternNodeMap[beginPNode.id].degree || candidateNodeMap[candidate.id].inDegree < patternNodeMap[beginPNode.id].inDegree || candidateNodeMap[candidate.id].outDegree < patternNodeMap[beginPNode.id].outDegree : candidateNodeMap[candidate.id].degree < patternNodeMap[beginPNode.id].degree;\n\n if (condition) {\n candidateGraphInvalid = true;\n break;\n } // candidate label 个数不足,删去该图\n\n\n if (candidateNodeLabelCountMap[candidate[nodeLabelProp]] < patternNodeLabelMap[candidate[nodeLabelProp]].length) {\n candidateGraphInvalid = true;\n break;\n } // prune6:去除度数过小的节点\n\n\n var currentCandidateNodeNum = candidateGraph.nodes.length;\n\n for (var o = currentCandidateNodeNum - 1; o >= 0; o--) {\n var cgNode = candidateGraph.nodes[o];\n var nodeDegree = candidateNodeMap[cgNode.id].degree;\n var nodeInDegree = candidateNodeMap[cgNode.id].inDegree;\n var nodeOutDegree = candidateNodeMap[cgNode.id].outDegree;\n var cNodeLabel = cgNode[nodeLabelProp];\n\n var _d = stashPatternNodeLabelDegreeMap(minPatternNodeLabelDegreeMap, cNodeLabel, patternNodeMap, patternNodeLabelMap),\n minPatternNodeLabelDegree = _d.minPatternNodeLabelDegree,\n minPatternNodeLabelInDegree = _d.minPatternNodeLabelInDegree,\n minPatternNodeLabelOutDegree = _d.minPatternNodeLabelOutDegree;\n\n var deleteCondition = directed ? nodeDegree < minPatternNodeLabelDegree || nodeInDegree < minPatternNodeLabelInDegree || nodeOutDegree < minPatternNodeLabelOutDegree : nodeDegree < minPatternNodeLabelDegree;\n\n if (deleteCondition) {\n candidateNodeLabelCountMap[cgNode[nodeLabelProp]]--; // 节点 label 个数不足\n\n if (candidateNodeLabelCountMap[cgNode[nodeLabelProp]] < patternNodeLabelMap[cgNode[nodeLabelProp]].length) {\n candidateGraphInvalid = true;\n break;\n }\n\n candidateGraph.nodes.splice(o, 1);\n candidateNodeMap[cgNode.id] = undefined;\n degreeChanged = true;\n }\n }\n\n if (candidateGraphInvalid || !degreeChanged && loopCount !== 0) break; // 经过 prune5 节点裁剪,删去端点已经不在 candidateGraph 中的边\n\n candidateEdgeNum = candidateEdges.length;\n\n for (var y = candidateEdgeNum - 1; y >= 0; y--) {\n var cedge = candidateEdges[y];\n\n if (!candidateNodeMap[cedge.source] || !candidateNodeMap[cedge.target]) {\n candidateEdges.splice(y, 1);\n var edgeLabel = cedge[edgeLabelProp];\n edgeLabelCountMap[edgeLabel]--;\n\n if (candidateNodeMap[cedge.source]) {\n candidateNodeMap[cedge.source].degree--;\n candidateNodeMap[cedge.source].outDegree--;\n }\n\n if (candidateNodeMap[cedge.target]) {\n candidateNodeMap[cedge.target].degree--;\n candidateNodeMap[cedge.target].inDegree--;\n } // 边 label 数量不足\n\n\n if (patternEdgeLabelMap[edgeLabel] && edgeLabelCountMap[edgeLabel] < patternEdgeLabelMap[edgeLabel].length) {\n candidateGraphInvalid = true;\n break;\n }\n\n degreeChanged = true;\n }\n }\n\n loopCount++;\n }\n\n if (candidateGraphInvalid) {\n candidateGraphs.splice(i, 1);\n return "continue";\n } // prune: 若节点/边数过少,节点/边 label 过少,去掉这个图\n\n\n if (candidateGraphInvalid || candidateGraph.nodes.length < pattern.nodes.length || candidateEdges.length < pattern.edges.length) {\n candidateGraphs.splice(i, 1);\n return "continue";\n }\n };\n\n for (var i = candidateGraphNum - 1; i >= 0; i--) {\n var state_1 = _loop_2(i);\n\n if (state_1 === "break") break;\n } // 此时已经生成的多个 candidateGraphs,可能有重复\n // console.log(\n // "----- stage5: going to splice dulplicated candidate graphs -------"\n // );\n // 删去 candidateGraphs 中一模一样的子图,通过边的 node-node-edgeLabel 作为 key,这类边个数作为 value,进行匹配\n\n\n var currentLength = candidateGraphs.length;\n\n var _loop_3 = function _loop_3(i) {\n var cg1 = candidateGraphs[i];\n var cg1EdgeMap = {}; // [node1.id-node2.id-edge.label]: count\n\n cg1.edges.forEach(function (edge) {\n var key = edge.source + "-" + edge.target + "-" + edge.label;\n if (!cg1EdgeMap[key]) cg1EdgeMap[key] = 1;else cg1EdgeMap[key]++;\n });\n\n var _loop_6 = function _loop_6(j) {\n var cg2 = candidateGraphs[j];\n var cg2EdgeMap = {}; // [node1.id-node2.id-edge.label]: count\n\n cg2.edges.forEach(function (edge) {\n var key = edge.source + "-" + edge.target + "-" + edge.label;\n if (!cg2EdgeMap[key]) cg2EdgeMap[key] = 1;else cg2EdgeMap[key]++;\n });\n var same = true;\n\n if (Object.keys(cg2EdgeMap).length !== Object.keys(cg1EdgeMap).length) {\n same = false;\n } else {\n Object.keys(cg1EdgeMap).forEach(function (key) {\n if (cg2EdgeMap[key] !== cg1EdgeMap[key]) same = false;\n });\n }\n\n if (same) {\n candidateGraphs.splice(j, 1);\n }\n };\n\n for (var j = currentLength - 1; j > i; j--) {\n _loop_6(j);\n }\n\n currentLength = candidateGraphs.length;\n };\n\n for (var i = 0; i <= currentLength - 1; i++) {\n _loop_3(i);\n }\n\n return candidateGraphs;\n};\n\nvar _default = GADDI;\nexports.default = _default;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvYWxnb3JpdGhtL2xpYi9nYWRkaS5qcz82NDlmIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFhOztBQUViO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7O0FBRUEsYUFBYSxtQkFBTyxDQUFDLENBQU87O0FBRTVCLDRDQUE0QyxtQkFBTyxDQUFDLEdBQWlCOztBQUVyRSxvQ0FBb0MsbUJBQU8sQ0FBQyxHQUFlOztBQUUzRCx1Q0FBdUMsbUJBQU8sQ0FBQyxHQUFZOztBQUUzRCxZQUFZLG1CQUFPLENBQUMsRUFBUTs7QUFFNUIsc0NBQXNDLHVDQUF1QyxnQkFBZ0I7O0FBRTdGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRyxFQUFFOztBQUVMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCOztBQUU3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQzs7QUFFbEM7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCOztBQUU3QjtBQUNBO0FBQ0E7QUFDQSxnREFBZ0Q7QUFDaEQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2Qjs7QUFFN0I7QUFDQTs7QUFFQTtBQUNBLDhDQUE4QztBQUM5QyxLQUFLOzs7QUFHTDtBQUNBO0FBQ0E7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QUVBO0FBQ0EiLCJmaWxlIjoiMzExLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5cbnZhciBfdHNsaWIgPSByZXF1aXJlKFwidHNsaWJcIik7XG5cbnZhciBfZmxveWRXYXJzaGFsbCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vZmxveWRXYXJzaGFsbFwiKSk7XG5cbnZhciBfZ1NwYW4gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2dTcGFuL2dTcGFuXCIpKTtcblxudmFyIF9kaWprc3RyYSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vZGlqa3N0cmFcIikpO1xuXG52YXIgX3V0aWwgPSByZXF1aXJlKFwiLi91dGlsXCIpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG4vKipcbiAqIOS4uiBncmFwaERhdGEg5Lit5q+P5Liq6IqC54K555Sf5oiQ6YK75bGF5Y2V5YWD5pWw57uEXG4gKiBAcGFyYW0gZ3JhcGhEYXRhXG4gKiBAcGFyYW0gc3BtXG4gKiBAcGFyYW0gbm9kZUxhYmVsUHJvcFxuICogQHBhcmFtIGsgay3ov5HpgrtcbiAqL1xudmFyIGZpbmRLTmVpZ2hib3JVbml0cyA9IGZ1bmN0aW9uIGZpbmRLTmVpZ2hib3JVbml0cyhncmFwaERhdGEsIHNwbSwgbm9kZUxhYmVsUHJvcCwgaykge1xuICBpZiAobm9kZUxhYmVsUHJvcCA9PT0gdm9pZCAwKSB7XG4gICAgbm9kZUxhYmVsUHJvcCA9ICdjbHVzdGVyJztcbiAgfVxuXG4gIGlmIChrID09PSB2b2lkIDApIHtcbiAgICBrID0gMjtcbiAgfVxuXG4gIHZhciB1bml0cyA9IFtdO1xuICB2YXIgbm9kZXMgPSBncmFwaERhdGEubm9kZXM7XG4gIHNwbS5mb3JFYWNoKGZ1bmN0aW9uIChyb3csIGkpIHtcbiAgICB1bml0cy5wdXNoKGZpbmRLTmVpZ2hib3JVbml0KG5vZGVzLCByb3csIGksIG5vZGVMYWJlbFByb3AsIGspKTtcbiAgfSk7XG4gIHJldHVybiB1bml0cztcbn07XG5cbnZhciBmaW5kS05laWdoYm9yVW5pdCA9IGZ1bmN0aW9uIGZpbmRLTmVpZ2hib3JVbml0KG5vZGVzLCByb3csIGksIG5vZGVMYWJlbFByb3AsIGspIHtcbiAgdmFyIHVuaXROb2RlSWR4cyA9IFtpXTtcbiAgdmFyIG5laWdoYm9ycyA9IFtdO1xuICB2YXIgbGFiZWxDb3VudE1hcCA9IHt9O1xuICByb3cuZm9yRWFjaChmdW5jdGlvbiAodiwgaikge1xuICAgIGlmICh2IDw9IGsgJiYgaSAhPT0gaikge1xuICAgICAgdW5pdE5vZGVJZHhzLnB1c2goaik7XG4gICAgICBuZWlnaGJvcnMucHVzaChub2Rlc1tqXSk7XG4gICAgICB2YXIgbGFiZWwgPSBub2Rlc1tqXVtub2RlTGFiZWxQcm9wXTtcbiAgICAgIGlmICghbGFiZWxDb3VudE1hcFtsYWJlbF0pIGxhYmVsQ291bnRNYXBbbGFiZWxdID0ge1xuICAgICAgICBjb3VudDogMSxcbiAgICAgICAgZGlzdHM6IFt2XVxuICAgICAgfTtlbHNlIHtcbiAgICAgICAgbGFiZWxDb3VudE1hcFtsYWJlbF0uY291bnQrKztcbiAgICAgICAgbGFiZWxDb3VudE1hcFtsYWJlbF0uZGlzdHMucHVzaCh2KTtcbiAgICAgIH1cbiAgICB9XG4gIH0pOyAvLyDlsIYgbGFiZWxDb3VudE1hcCDkuK3nmoQgZGlzdHMg5oyJ54Wn5LuO5bCP5Yiw5aSn5o6S5bqP77yM5pa55L6/5ZCO6Z2i5L2/55SoXG5cbiAgT2JqZWN0LmtleXMobGFiZWxDb3VudE1hcCkuZm9yRWFjaChmdW5jdGlvbiAobGFiZWwpIHtcbiAgICBsYWJlbENvdW50TWFwW2xhYmVsXS5kaXN0cyA9IGxhYmVsQ291bnRNYXBbbGFiZWxdLmRpc3RzLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgIHJldHVybiBhIC0gYjtcbiAgICB9KTtcbiAgfSk7XG4gIHJldHVybiB7XG4gICAgbm9kZUlkeDogaSxcbiAgICBub2RlSWQ6IG5vZGVzW2ldLmlkLFxuICAgIG5vZGVJZHhzOiB1bml0Tm9kZUlkeHMsXG4gICAgbmVpZ2hib3JzOiBuZWlnaGJvcnMsXG4gICAgbmVpZ2hib3JOdW06IHVuaXROb2RlSWR4cy5sZW5ndGggLSAxLFxuICAgIG5vZGVMYWJlbENvdW50TWFwOiBsYWJlbENvdW50TWFwXG4gIH07XG59O1xuLyoqXG4gKiDpmo/mnLrlr7vmib7ngrnlr7nvvIzmu6HotrPot53nprvlsI/kuo4ga1xuICogQHBhcmFtIGsg5Y+C5pWwIGvvvIzooajnpLogay3ov5HpgrtcbiAqIEBwYXJhbSBub2RlTnVtIOWPguaVsCBsZW5ndGhcbiAqIEBwYXJhbSBtYXhOb2RlUGFpck51bSDlr7vmib7ngrnlr7nnmoTmlbDph4/kuI3otoXov4cgbWF4Tm9kZVBhaXJOdW1cbiAqIEBwYXJhbSBzcG0g5pyA55+t6Lev5b6E55+p6Zi1XG4gKi9cblxuXG52YXIgZmluZE5vZGVQYWlyc1JhbmRvbWx5ID0gZnVuY3Rpb24gZmluZE5vZGVQYWlyc1JhbmRvbWx5KGssIG5vZGVOdW0sIG1heE5vZGVQYWlyTnVtLCBrTmVpZ2hib3JVbml0cywgc3BtKSB7XG4gIC8vIOavj+S4quiKgueCuemcgOimgemaj+acuuaJvuWHuueahOeCueWvueaVsFxuICB2YXIgbm9kZVBhaXJOdW1FYWNoTm9kZSA9IE1hdGguY2VpbChtYXhOb2RlUGFpck51bSAvIG5vZGVOdW0pO1xuICB2YXIgbm9kZVBhaXJNYXAgPSB7fTtcbiAgdmFyIGZvdW5kTm9kZVBhaXJDb3VudCA9IDA7IC8vIOmBjeWOhuiKgueCue+8jOS4uuavj+S4quiKgueCuemaj+acuuaJvuWHuiBub2RlUGFpck51bUVhY2hOb2RlIOS4queCueWvue+8jOa7oei2s+i3neemu+Wwj+S6jiBr44CC5om+5Yiw55qE54K55a+55pWw6YeP6LaF6L+HIG1heE5vZGVQYWlyTnVtIOaIluaJgOacieiKgueCuemBjeWOhue7k+adn+aXtue7iOatolxuXG4gIGtOZWlnaGJvclVuaXRzLmZvckVhY2goZnVuY3Rpb24gKHVuaXQsIGkpIHtcbiAgICAvLyDoi6XmnKrovr7liLAgbm9kZVBhaXJOdW1FYWNoTm9kZe+8jOaIluW+queOr+asoeaVsOWwj+S6juacgOWkp+W+queOr+asoeaVsCgyICogbm9kZU51bSnvvIznu6fnu63lvqrnjq9cbiAgICB2YXIgbm9kZVBhaXJGb3JJQ291bnQgPSAwO1xuICAgIHZhciBvdXRlckxvb3BDb3VudCA9IDA7XG4gICAgdmFyIG5laWdoYm9ycyA9IHVuaXQubm9kZUlkeHM7IC8vIHRoZSBmaXJzdCBvbmUgaXMgdGhlIGNlbnRlciBub2RlXG5cbiAgICB2YXIgbmVpZ2hib3JOdW0gPSB1bml0Lm5laWdoYm9yTnVtIC0gMTtcblxuICAgIHdoaWxlIChub2RlUGFpckZvcklDb3VudCA8IG5vZGVQYWlyTnVtRWFjaE5vZGUpIHtcbiAgICAgIC8vIOWPpuS4gOerr+iKgueCueWcqOiKgueCueaVsOe7hOS4reeahOeahCBpbmRleFxuICAgICAgdmFyIG9pZHggPSBuZWlnaGJvcnNbMSArIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIG5laWdoYm9yTnVtKV07XG4gICAgICB2YXIgaW5uZXJMb29wQ291bnQgPSAwOyAvLyDoi6Xpmo/mnLrlvpfliLDnmoTlj6bkuIDnq68gaWR4IOS4jeespuWQiOadoeS7tu+8jOWImee7p+e7rSByYW5kb23jgILmnaHku7bmmK/kuI3mmK/lkIzkuIDkuKroioLngrnjgIHov5nkuKrngrnlr7nmsqHmnInooqvorrDlvZXov4fjgIHot53nprvlsI/kuo4ga1xuXG4gICAgICB3aGlsZSAobm9kZVBhaXJNYXBbaSArIFwiLVwiICsgb2lkeF0gfHwgbm9kZVBhaXJNYXBbb2lkeCArIFwiLVwiICsgaV0pIHtcbiAgICAgICAgb2lkeCA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIG5vZGVOdW0pO1xuICAgICAgICBpbm5lckxvb3BDb3VudCsrO1xuICAgICAgICBpZiAoaW5uZXJMb29wQ291bnQgPiAyICogbm9kZU51bSkgYnJlYWs7IC8vIOW+queOr+asoeaVsOWkp+S6juacgOWkp+W+queOr+asoeaVsCgyICogbm9kZU51bSnot7Plh7rlvqrnjq/vvIzpgb/lhY3mrbvlvqrnjq9cbiAgICAgIH1cblxuICAgICAgaWYgKGlubmVyTG9vcENvdW50IDwgMiAqIG5vZGVOdW0pIHtcbiAgICAgICAgLy8g5pyq6L6+5Yiw5pyA5aSn5b6q546v5qyh5pWw77yM6K+05piO5om+5Yiw5LqG5ZCI6YCC55qE5Y+m5LiA56uvXG4gICAgICAgIG5vZGVQYWlyTWFwW2kgKyBcIi1cIiArIG9pZHhdID0ge1xuICAgICAgICAgIHN0YXJ0OiBpLFxuICAgICAgICAgIGVuZDogb2lkeCxcbiAgICAgICAgICBkaXN0YW5jZTogc3BtW2ldW29pZHhdXG4gICAgICAgIH07XG4gICAgICAgIG5vZGVQYWlyRm9ySUNvdW50Kys7XG4gICAgICAgIGZvdW5kTm9kZVBhaXJDb3VudCsrOyAvLyDlpoLmnpzlvZPliY3mib7liLDnmoTngrnlr7nmlbDph4/ovr7liLDkuobkuIrpmZDvvIzov5Tlm57nu5PmnpxcblxuICAgICAgICBpZiAoZm91bmROb2RlUGFpckNvdW50ID49IG1heE5vZGVQYWlyTnVtKSByZXR1cm4gbm9kZVBhaXJNYXA7XG4gICAgICB9XG5cbiAgICAgIG91dGVyTG9vcENvdW50Kys7XG4gICAgICBpZiAob3V0ZXJMb29wQ291bnQgPiAyICogbm9kZU51bSkgYnJlYWs7IC8vIOW+queOr+asoeaVsOWkp+S6juacgOWkp+W+queOr+asoeaVsCgyICogbm9kZU51bSnot7Plh7rlvqrnjq/vvIzpgb/lhY3mrbvlvqrnjq9cbiAgICB9IC8vIOi/meS4quiKgueCueayoeacieaJvuWIsOi2s+WknyBub2RlUGFpck51bUVhY2hOb2RlIOeahOeCueWvueOAguabtOaWsCBub2RlUGFpck51bUVhY2hOb2Rl77yM6K6p5ZCO57ut6IqC54K55om+5pu05aSa55qE54K55a+5XG5cblxuICAgIGlmIChub2RlUGFpckZvcklDb3VudCA8IG5vZGVQYWlyTnVtRWFjaE5vZGUpIHtcbiAgICAgIHZhciBnYXAgPSBub2RlUGFpck51bUVhY2hOb2RlIC0gbm9kZVBhaXJGb3JJQ291bnQ7XG4gICAgICBub2RlUGFpck51bUVhY2hOb2RlID0gKG5vZGVQYWlyTnVtRWFjaE5vZGUgKyBnYXApIC8gKG5vZGVOdW0gLSBpIC0gMSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIG5vZGVQYWlyTWFwO1xufTtcbi8qKlxuICog6K6h566X5omA5pyJIG5vZGVQYWlyTWFwIOS4reiKgueCueWvueeahOebuOS6pOmCu+WxheivseWvvOWtkOWbvlxuICogQHBhcmFtIG5vZGVQYWlyTWFwIOiKgueCueWvuSBtYXDvvIxrZXkg5Li6IG5vZGUxLmlkLW5vZGUyLmlk77yMdmFsdWUg5Li6IHsgc3RhcnROb2RlSWR4LCBlbmROb2RlSWR4LCBkaXN0YW5jZSB9XG4gKiBAcGFyYW0gbmVpZ2hib3JVbml0cyDmr4/kuKroioLngrnnmoTpgrvlsYXlhYPmlbDnu4RcbiAqIEBwYXJhbSBncmFwaERhdGEg5Y6f5Zu+5pWw5o2uXG4gKiBAcGFyYW0gZWRnZU1hcCDovrnnmoQgbWFw77yM5pa55L6/5qOA57SiXG4gKiBAcGFyYW0gY2FjaGVkSW5kdWNlZEdyYXBoTWFwIOe8k+WtmOeahOe7k+aenO+8jOS4i+asoei/m+WFpeivpeWHveaVsOWwhue7p+e7reabtOaWsOivpee8k+WtmO+8jOiLpSBrZXkg5Zyo57yT5a2Y5Lit5a2Y5Zyo5YiZ5LiN6ZyA6KaB6YeN5aSN6K6h566XXG4gKi9cblxuXG52YXIgZ2V0SW50ZXJzZWN0TmVpZ2hib3JJbmR1Y2VkR3JhcGggPSBmdW5jdGlvbiBnZXRJbnRlcnNlY3ROZWlnaGJvckluZHVjZWRHcmFwaChub2RlUGFpck1hcCwgbmVpZ2hib3JVbml0cywgZ3JhcGhEYXRhLCBjYWNoZWRJbmR1Y2VkR3JhcGhNYXApIHtcbiAgdmFyIG5vZGVzID0gZ3JhcGhEYXRhLm5vZGVzO1xuICBpZiAoIWNhY2hlZEluZHVjZWRHcmFwaE1hcCkgY2FjaGVkSW5kdWNlZEdyYXBoTWFwID0ge307XG4gIE9iamVjdC5rZXlzKG5vZGVQYWlyTWFwKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICB2YXIgX2EsIF9iO1xuXG4gICAgaWYgKGNhY2hlZEluZHVjZWRHcmFwaE1hcCAmJiBjYWNoZWRJbmR1Y2VkR3JhcGhNYXBba2V5XSkgcmV0dXJuO1xuICAgIGNhY2hlZEluZHVjZWRHcmFwaE1hcFtrZXldID0ge1xuICAgICAgbm9kZXM6IFtdLFxuICAgICAgZWRnZXM6IFtdXG4gICAgfTtcbiAgICB2YXIgcGFpciA9IG5vZGVQYWlyTWFwW2tleV07XG4gICAgdmFyIHN0YXJ0VW5pdE5vZGVJZHMgPSAoX2EgPSBuZWlnaGJvclVuaXRzW3BhaXIuc3RhcnRdKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Eubm9kZUlkeHM7XG4gICAgdmFyIGVuZFVuaXROb2RlSWRzID0gKF9iID0gbmVpZ2hib3JVbml0c1twYWlyLmVuZF0pID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5ub2RlSWR4cztcbiAgICBpZiAoIXN0YXJ0VW5pdE5vZGVJZHMgfHwgIWVuZFVuaXROb2RlSWRzKSByZXR1cm47IC8vIOS4jeWtmOWcqOmCu+WFg++8jOi/lOWbnuepuuWbvlxuXG4gICAgdmFyIGVuZFNldCA9IG5ldyBTZXQoZW5kVW5pdE5vZGVJZHMpO1xuICAgIHZhciBpbnRlcnNlY3QgPSBzdGFydFVuaXROb2RlSWRzLmZpbHRlcihmdW5jdGlvbiAoeCkge1xuICAgICAgcmV0dXJuIGVuZFNldC5oYXMoeCk7XG4gICAgfSk7IC8vIOWPr+iDveS8mueIhuagiO+8iOWcqCAxNTgwICsgNiBub2RlcyBmdWxsLWNvbm5lY3RlZCDml7blh7rnjrDvvIlcblxuICAgIGlmICghaW50ZXJzZWN0IHx8ICFpbnRlcnNlY3QubGVuZ3RoKSByZXR1cm47IC8vIOayoeacieS6pOmbhu+8jOi/lOWbnuepuuWbvlxuXG4gICAgdmFyIGludGVyc2VjdElkTWFwID0ge307XG4gICAgdmFyIGludGVyc2VjdExlbmd0aCA9IGludGVyc2VjdC5sZW5ndGg7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGludGVyc2VjdExlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgbm9kZSA9IG5vZGVzW2ludGVyc2VjdFtpXV07XG4gICAgICBjYWNoZWRJbmR1Y2VkR3JhcGhNYXBba2V5XS5ub2Rlcy5wdXNoKG5vZGUpOyAvLyDlsIbkuqTpm4bkuK3nmoTngrnliqDlhaXor7Hlr7zlrZDlm75cblxuICAgICAgaW50ZXJzZWN0SWRNYXBbbm9kZS5pZF0gPSB0cnVlO1xuICAgIH0gLy8g6YGN5Y6G5omA5pyJ6L655pWw5o2u77yM5aaC5p6c6L6555qE5Lik56uv6YO95Zyo5Lqk6ZuG5Lit77yM5bCG6K+l6L655Yqg5YWl6K+x5a+85a2Q5Zu+XG5cblxuICAgIGdyYXBoRGF0YS5lZGdlcy5mb3JFYWNoKGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgICBpZiAoaW50ZXJzZWN0SWRNYXBbZWRnZS5zb3VyY2VdICYmIGludGVyc2VjdElkTWFwW2VkZ2UudGFyZ2V0XSkgY2FjaGVkSW5kdWNlZEdyYXBoTWFwW2tleV0uZWRnZXMucHVzaChlZGdlKTtcbiAgICB9KTtcbiAgfSk7XG4gIHJldHVybiBjYWNoZWRJbmR1Y2VkR3JhcGhNYXA7XG59O1xuLyoqXG4gKiDorqHnrpcgc3RyY3V0cmUg5ZyoIGdyYXBoIOS4iueahOWMuemFjeaVsOmHj1xuICogQHBhcmFtIGdyYXBoIOWbvuaVsOaNrlxuICogQHBhcmFtIHN0cnVjdHVyZSDnm67liY3mlK/mjIHlj6rmnInkuKTkuKroioLngrnkuIDmnaHovrnnmoTmnIDnroDljZXnu5PmnoRcbiAqIEBwYXJhbSBub2RlTGFiZWxQcm9wIOiKgueCueexu+Wei+Wtl+auteWQjVxuICogQHBhcmFtIGVkZ2VMYWJlbFByb3Ag6L6557G75Z6L5a2X5q615ZCNXG4gKi9cblxuXG52YXIgZ2V0TWF0Y2hlZENvdW50ID0gZnVuY3Rpb24gZ2V0TWF0Y2hlZENvdW50KGdyYXBoLCBzdHJ1Y3R1cmUsIG5vZGVMYWJlbFByb3AsIGVkZ2VMYWJlbFByb3ApIHtcbiAgdmFyIF9hLCBfYjtcblxuICB2YXIgbm9kZU1hcCA9IHt9O1xuICBncmFwaC5ub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgbm9kZU1hcFtub2RlLmlkXSA9IG5vZGU7XG4gIH0pO1xuICB2YXIgY291bnQgPSAwO1xuICBpZiAoISgoX2EgPSBzdHJ1Y3R1cmUgPT09IG51bGwgfHwgc3RydWN0dXJlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzdHJ1Y3R1cmUuZWRnZXMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5sZW5ndGgpIHx8ICgoX2IgPSBzdHJ1Y3R1cmUgPT09IG51bGwgfHwgc3RydWN0dXJlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzdHJ1Y3R1cmUubm9kZXMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5sZW5ndGgpIDwgMikgcmV0dXJuIDA7XG4gIGdyYXBoLmVkZ2VzLmZvckVhY2goZnVuY3Rpb24gKGUpIHtcbiAgICB2YXIgc291cmNlTGFiZWwgPSBub2RlTWFwW2Uuc291cmNlXVtub2RlTGFiZWxQcm9wXTtcbiAgICB2YXIgdGFyZ2V0TGFiZWwgPSBub2RlTWFwW2UudGFyZ2V0XVtub2RlTGFiZWxQcm9wXTtcbiAgICB2YXIgc3RyTm9kZUxhYmVsMSA9IHN0cnVjdHVyZSA9PT0gbnVsbCB8fCBzdHJ1Y3R1cmUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHN0cnVjdHVyZS5ub2Rlc1swXVtub2RlTGFiZWxQcm9wXTtcbiAgICB2YXIgc3RyTm9kZUxhYmVsMiA9IHN0cnVjdHVyZSA9PT0gbnVsbCB8fCBzdHJ1Y3R1cmUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHN0cnVjdHVyZS5ub2Rlc1sxXVtub2RlTGFiZWxQcm9wXTtcbiAgICB2YXIgc3RyRWRnZUxhYmVsID0gc3RydWN0dXJlID09PSBudWxsIHx8IHN0cnVjdHVyZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogc3RydWN0dXJlLmVkZ2VzWzBdW2VkZ2VMYWJlbFByb3BdO1xuICAgIGlmIChlW2VkZ2VMYWJlbFByb3BdICE9PSBzdHJFZGdlTGFiZWwpIHJldHVybjtcblxuICAgIGlmIChzb3VyY2VMYWJlbCA9PT0gc3RyTm9kZUxhYmVsMSAmJiB0YXJnZXRMYWJlbCA9PT0gc3RyTm9kZUxhYmVsMiB8fCBzb3VyY2VMYWJlbCA9PT0gc3RyTm9kZUxhYmVsMiAmJiB0YXJnZXRMYWJlbCA9PT0gc3RyTm9kZUxhYmVsMSkge1xuICAgICAgY291bnQrKztcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gY291bnQ7XG59O1xuLyoqXG4gKiBzdHJ1Y3R1cmVzIOS4reWvu+aJvuacgOWFt+acieS7o+ihqOaAp+eahOS4gOS4quOAgui/meS4que7k+aehOaYr+S9v+W+lyBtYXRjaGVkQ291bnRNYXAg55qE5YiG57uE5pa55byP57G75YaF6Ze06Led5pyA5bCP77yM57G76Ze06Ze06Led5pyA5aSnXG4gKiBAcGFyYW0gbWF0Y2hlZENvdW50TWFwIOavj+S4qiBzdHJ1Y3R1cmUg5YiG57G75ZCO55qE5ZCE5Zu+5Yy56YWN5pWw6YeP77yM5qC85byPIHsgW3N0cmN0dXJlLmlkeF06IHsgW2ludGVySW5kdWNlZEdyYXBoS2V5XTogY291bnQgfSB9XG4gKiBAcGFyYW0gc3RydWN0dXJlTnVtIHN0cmN1dHVyZSDkuKrmlbDvvIzkuI4gbWF0Y2hlZENvdW50TWFwLmxlbmd0aCDlr7nlupRcbiAqIEBwYXJhbSBzdHJ1Y3R1cmVzXG4gKi9cblxuXG52YXIgZmluZFJlcHJlc2VudFN0cnVjdHVyZSA9IGZ1bmN0aW9uIGZpbmRSZXByZXNlbnRTdHJ1Y3R1cmUobWF0Y2hlZENvdW50TWFwLCBzdHJ1Y3R1cmVOdW0sIHN0cnVjdHVyZXMpIHtcbiAgdmFyIG1heE9mZnNldCA9IEluZmluaXR5LFxuICAgICAgcmVwcmVzZW50Q2x1c3RlclR5cGUgPSAwO1xuXG4gIHZhciBfbG9vcF8xID0gZnVuY3Rpb24gX2xvb3BfMShpKSB7XG4gICAgLy8g5LiA56eN5YiG57uE55qEIG1hcO+8jGtleSDmmK8gaW50R3JhcGgg55qEIGtlee+8jHZhbHVlIOaYryBzdHJ1Y3R1cmVzW2ldIOeahOWMuemFjeS4quaVsFxuICAgIHZhciBjb3VudE1hcEkgPSBtYXRjaGVkQ291bnRNYXBbaV07IC8vIOaMieeFpyB2YWx1ZSDkuLror6Xnu4TmjpLluo/vvIznlJ/miJAga2V5cyDnmoTmlbDnu4TvvJpcblxuICAgIHZhciBzb3J0ZWRHcmFwaEtleXMgPSBPYmplY3Qua2V5cyhjb3VudE1hcEkpLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgIHJldHVybiBjb3VudE1hcElbYV0gLSBjb3VudE1hcElbYl07XG4gICAgfSk7IC8vIOWFsSAxMDAg5LiqIGdyYXBoS2V5c++8jOWwhiBncmFwaEtleXMg5oyJ6aG65bqP5YiG5Li6IGdyb3VwTnVtIOe7hFxuXG4gICAgdmFyIGdyb3VwTnVtID0gMTA7XG4gICAgdmFyIGNsdXN0ZXJzID0gW107IC8vIOaAu+WFseaciSBncm91cE51bSDkuKrpoblcblxuICAgIHNvcnRlZEdyYXBoS2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXksIGopIHtcbiAgICAgIGlmICghY2x1c3RlcnNbaiAlIGdyb3VwTnVtXSkgY2x1c3RlcnNbaiAlIGdyb3VwTnVtXSA9IHtcbiAgICAgICAgZ3JhcGhzOiBbXSxcbiAgICAgICAgdG90YWxDb3VudDogMCxcbiAgICAgICAgYXZlQ291bnQ6IDBcbiAgICAgIH07XG4gICAgICBjbHVzdGVyc1tqICUgZ3JvdXBOdW1dLmdyYXBocy5wdXNoKGtleSk7XG4gICAgICBjbHVzdGVyc1tqICUgZ3JvdXBOdW1dLnRvdGFsQ291bnQgKz0gY291bnRNYXBJW2tleV07XG4gICAgfSk7IC8vIOiuoeeulyBjbHVzdGVyIOS4jiBjbHVzdGVyIOS5i+mXtOeahOi3neemuyBpbm5lckRpc3TvvIzmr4/kuKogY2x1c3RlciDlhoXpg6jnmoTot53nprsgaW50cmFEaXN0XG5cbiAgICB2YXIgYXZlSW50cmFEaXN0ID0gMDsgLy8g6K+l57G755qE57G75YaF5bmz5Z2H5YC8XG5cbiAgICB2YXIgYXZlQ291bnRzID0gW107IC8vIOexu+WGheW5s+Wdh+WMuemFjeaVsOmHj++8jOWwhueUqOS6juiuoeeul+exu+mXtOi3neemu1xuXG4gICAgY2x1c3RlcnMuZm9yRWFjaChmdW5jdGlvbiAoZ3JhcGhzSW5DbHVzdGVyKSB7XG4gICAgICAvLyDnsbvlhoXlnYflgLxcbiAgICAgIHZhciBhdmVDb3VudCA9IGdyYXBoc0luQ2x1c3Rlci50b3RhbENvdW50IC8gZ3JhcGhzSW5DbHVzdGVyLmdyYXBocy5sZW5ndGg7XG4gICAgICBncmFwaHNJbkNsdXN0ZXIuYXZlQ291bnQgPSBhdmVDb3VudDtcbiAgICAgIGF2ZUNvdW50cy5wdXNoKGF2ZUNvdW50KTsgLy8g5a+55LqO5q+P57G777yM6K6h566X57G75YaF6Ze06Led5bmz5Z2H5YC8XG5cbiAgICAgIHZhciBhdmVJbnRyYVBlckNsdXN0ZXIgPSAwO1xuICAgICAgdmFyIGdyYXBoc051bSA9IGdyYXBoc0luQ2x1c3Rlci5sZW5ndGg7XG4gICAgICBncmFwaHNJbkNsdXN0ZXIuZ3JhcGhzLmZvckVhY2goZnVuY3Rpb24gKGdyYXBoS2V5MSwgaikge1xuICAgICAgICB2YXIgZ3JhcGgxQ291bnQgPSBjb3VudE1hcElbZ3JhcGhLZXkxXTtcbiAgICAgICAgZ3JhcGhzSW5DbHVzdGVyLmdyYXBocy5mb3JFYWNoKGZ1bmN0aW9uIChncmFwaEtleTIsIGspIHtcbiAgICAgICAgICBpZiAoaiA9PT0gaykgcmV0dXJuO1xuICAgICAgICAgIGF2ZUludHJhUGVyQ2x1c3RlciArPSBNYXRoLmFicyhncmFwaDFDb3VudCAtIGNvdW50TWFwSVtncmFwaEtleTJdKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIGF2ZUludHJhUGVyQ2x1c3RlciAvPSBncmFwaHNOdW0gKiAoZ3JhcGhzTnVtIC0gMSkgLyAyO1xuICAgICAgYXZlSW50cmFEaXN0ICs9IGF2ZUludHJhUGVyQ2x1c3RlcjtcbiAgICB9KTtcbiAgICBhdmVJbnRyYURpc3QgLz0gY2x1c3RlcnMubGVuZ3RoOyAvLyDnlKjnsbvlhoXlnYflgLzorqHnrpfnsbvpl7Tot51cblxuICAgIHZhciBhdmVJbnRlckRpc3QgPSAwOyAvLyDnsbvpl7Tpl7Tot53lubPlnYflgLxcblxuICAgIGF2ZUNvdW50cy5mb3JFYWNoKGZ1bmN0aW9uIChhdmVDb3VudDEsIGopIHtcbiAgICAgIGF2ZUNvdW50cy5mb3JFYWNoKGZ1bmN0aW9uIChhdmVDb3VudDIsIGspIHtcbiAgICAgICAgaWYgKGogPT09IGspIHJldHVybjtcbiAgICAgICAgYXZlSW50ZXJEaXN0ICs9IE1hdGguYWJzKGF2ZUNvdW50MSAtIGF2ZUNvdW50Mik7XG4gICAgICB9KTtcbiAgICAgIGF2ZUludGVyRGlzdCAvPSBhdmVDb3VudHMubGVuZ3RoICogKGF2ZUNvdW50cy5sZW5ndGggLSAxKSAvIDI7XG4gICAgfSk7IC8vIOWvu+aJviAo57G76Ze06Ze06Led5Z2H5YC8Leexu+WGhemXtOi3neWdh+WAvCkg5pyA5aSn55qE5LiA56eN5YiG57uE5pa55byP77yI5a+55bqU55qEIHN0cnVjdHVyZSDlsLHmmK/mnIDnu4jopoHmib7nmoTllK/kuIAgRFMoRynvvIlcblxuICAgIHZhciBvZmZzZXQgPSBhdmVJbnRlckRpc3QgLSBhdmVJbnRyYURpc3Q7XG5cbiAgICBpZiAobWF4T2Zmc2V0IDwgb2Zmc2V0KSB7XG4gICAgICBtYXhPZmZzZXQgPSBvZmZzZXQ7XG4gICAgICByZXByZXNlbnRDbHVzdGVyVHlwZSA9IGk7XG4gICAgfVxuICB9O1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3RydWN0dXJlTnVtOyBpKyspIHtcbiAgICBfbG9vcF8xKGkpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBzdHJ1Y3R1cmU6IHN0cnVjdHVyZXNbcmVwcmVzZW50Q2x1c3RlclR5cGVdLFxuICAgIHN0cnVjdHVyZUNvdW50TWFwOiBtYXRjaGVkQ291bnRNYXBbcmVwcmVzZW50Q2x1c3RlclR5cGVdXG4gIH07XG59O1xuXG52YXIgZ2V0Tm9kZU1hcHMgPSBmdW5jdGlvbiBnZXROb2RlTWFwcyhub2Rlcywgbm9kZUxhYmVsUHJvcCkge1xuICB2YXIgbm9kZU1hcCA9IHt9LFxuICAgICAgbm9kZUxhYmVsTWFwID0ge307XG4gIG5vZGVzLmZvckVhY2goZnVuY3Rpb24gKG5vZGUsIGkpIHtcbiAgICBub2RlTWFwW25vZGUuaWRdID0ge1xuICAgICAgaWR4OiBpLFxuICAgICAgbm9kZTogbm9kZSxcbiAgICAgIGRlZ3JlZTogMCxcbiAgICAgIGluRGVncmVlOiAwLFxuICAgICAgb3V0RGVncmVlOiAwXG4gICAgfTtcbiAgICB2YXIgbGFiZWwgPSBub2RlW25vZGVMYWJlbFByb3BdO1xuICAgIGlmICghbm9kZUxhYmVsTWFwW2xhYmVsXSkgbm9kZUxhYmVsTWFwW2xhYmVsXSA9IFtdO1xuICAgIG5vZGVMYWJlbE1hcFtsYWJlbF0ucHVzaChub2RlKTtcbiAgfSk7XG4gIHJldHVybiB7XG4gICAgbm9kZU1hcDogbm9kZU1hcCxcbiAgICBub2RlTGFiZWxNYXA6IG5vZGVMYWJlbE1hcFxuICB9O1xufTtcblxudmFyIGdldEVkZ2VNYXBzID0gZnVuY3Rpb24gZ2V0RWRnZU1hcHMoZWRnZXMsIGVkZ2VMYWJlbFByb3AsIG5vZGVNYXApIHtcbiAgdmFyIGVkZ2VNYXAgPSB7fSxcbiAgICAgIGVkZ2VMYWJlbE1hcCA9IHt9O1xuICBlZGdlcy5mb3JFYWNoKGZ1bmN0aW9uIChlZGdlLCBpKSB7XG4gICAgZWRnZU1hcFtcIlwiICsgX3V0aWwudW5pcXVlSWRdID0ge1xuICAgICAgaWR4OiBpLFxuICAgICAgZWRnZTogZWRnZVxuICAgIH07XG4gICAgdmFyIGxhYmVsID0gZWRnZVtlZGdlTGFiZWxQcm9wXTtcbiAgICBpZiAoIWVkZ2VMYWJlbE1hcFtsYWJlbF0pIGVkZ2VMYWJlbE1hcFtsYWJlbF0gPSBbXTtcbiAgICBlZGdlTGFiZWxNYXBbbGFiZWxdLnB1c2goZWRnZSk7XG4gICAgdmFyIHNvdXJjZU5vZGUgPSBub2RlTWFwW2VkZ2Uuc291cmNlXTtcblxuICAgIGlmIChzb3VyY2VOb2RlKSB7XG4gICAgICBzb3VyY2VOb2RlLmRlZ3JlZSsrO1xuICAgICAgc291cmNlTm9kZS5vdXREZWdyZWUrKztcbiAgICB9XG5cbiAgICB2YXIgdGFyZ2V0Tm9kZSA9IG5vZGVNYXBbZWRnZS50YXJnZXRdO1xuXG4gICAgaWYgKHRhcmdldE5vZGUpIHtcbiAgICAgIHRhcmdldE5vZGUuZGVncmVlKys7XG4gICAgICB0YXJnZXROb2RlLmluRGVncmVlKys7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHtcbiAgICBlZGdlTWFwOiBlZGdlTWFwLFxuICAgIGVkZ2VMYWJlbE1hcDogZWRnZUxhYmVsTWFwXG4gIH07XG59O1xuLyoqXG4gKiDovpPlh7rmnIDnn63ot6/lvoTnmoQgbWFw77yMa2V5IOS4uiBzb3VyY2VOb2RlLmlkLXRhcmdldE5vZGUuaWTvvIx2YWx1ZSDkuLrov5nkuKTkuKroioLngrnnmoTmnIDnn63ot6/lvoTplb/luqZcbiAqIEBwYXJhbSBub2Rlc1xuICogQHBhcmFtIHNwbVxuICogQHBhcmFtIGRpcmVjdGVkXG4gKi9cblxuXG52YXIgZ2V0U3BtTWFwID0gZnVuY3Rpb24gZ2V0U3BtTWFwKG5vZGVzLCBzcG0sIGRpcmVjdGVkKSB7XG4gIHZhciBsZW5ndGggPSBzcG0ubGVuZ3RoO1xuICB2YXIgbWFwID0ge307XG4gIHNwbS5mb3JFYWNoKGZ1bmN0aW9uIChyb3csIGkpIHtcbiAgICB2YXIgc3RhcnQgPSBkaXJlY3RlZCA/IDAgOiBpICsgMTtcbiAgICB2YXIgaUlkID0gbm9kZXNbaV0uaWQ7XG5cbiAgICBmb3IgKHZhciBqID0gc3RhcnQ7IGogPCBsZW5ndGg7IGorKykge1xuICAgICAgaWYgKGkgPT09IGopIGNvbnRpbnVlO1xuICAgICAgdmFyIGpJZCA9IG5vZGVzW2pdLmlkO1xuICAgICAgdmFyIGRpc3QgPSByb3dbal07XG4gICAgICBtYXBbaUlkICsgXCItXCIgKyBqSWRdID0gZGlzdDtcbiAgICAgIGlmICghZGlyZWN0ZWQpIG1hcFtqSWQgKyBcIi1cIiArIGlJZF0gPSBkaXN0O1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBtYXA7XG59O1xuLyoqXG4gKiDorqHnrpfkuIDlr7noioLngrnvvIhub2RlMe+8jG5vZGUy77yJ55qEIE5EUyDot53nprtcbiAqIEBwYXJhbSBncmFwaCDljp/lm77mlbDmja5cbiAqIEBwYXJhbSBub2RlMVxuICogQHBhcmFtIG5vZGUyXG4gKi9cblxuXG52YXIgZ2V0TkRTRGlzdCA9IGZ1bmN0aW9uIGdldE5EU0Rpc3QoZ3JhcGgsIG5vZGUxLCBub2RlMiwgbm9kZU1hcCwgc3BEaXN0LCBrTmVpZ2hib3JVbml0cywgc3RydWN0dXJlLCBub2RlTGFiZWxQcm9wLCBlZGdlTGFiZWxQcm9wLCBjYWNoZWRORFNNYXAsIGNhY2hlZEludGVySW5kdWNlZEdyYXBoKSB7XG4gIHZhciBfYTtcblxuICB2YXIga2V5ID0gbm9kZTEuaWQgKyBcIi1cIiArIG5vZGUyLmlkO1xuICBpZiAoY2FjaGVkTkRTTWFwICYmIGNhY2hlZE5EU01hcFtrZXldKSByZXR1cm4gY2FjaGVkTkRTTWFwW2tleV07XG4gIHZhciBpbnRlckluZHVjZWRHcmFwaCA9IGNhY2hlZEludGVySW5kdWNlZEdyYXBoID8gY2FjaGVkSW50ZXJJbmR1Y2VkR3JhcGhba2V5XSA6IHVuZGVmaW5lZDsgLy8g6Iul5rKh5pyJ57yT5a2Y55u45Lqk6YK75bGF6K+x5a+85a2Q5Zu+77yM6K6h566XXG5cbiAgaWYgKCFpbnRlckluZHVjZWRHcmFwaCkge1xuICAgIHZhciBwYWlyTWFwID0gKF9hID0ge30sIF9hW2tleV0gPSB7XG4gICAgICBzdGFydDogbm9kZU1hcFtub2RlMS5pZF0uaWR4LFxuICAgICAgZW5kOiBub2RlTWFwW25vZGUyLmlkXS5pZHgsXG4gICAgICBkaXN0YW5jZTogc3BEaXN0XG4gICAgfSwgX2EpO1xuICAgIGNhY2hlZEludGVySW5kdWNlZEdyYXBoID0gZ2V0SW50ZXJzZWN0TmVpZ2hib3JJbmR1Y2VkR3JhcGgocGFpck1hcCwga05laWdoYm9yVW5pdHMsIGdyYXBoLCBjYWNoZWRJbnRlckluZHVjZWRHcmFwaCk7XG4gICAgaW50ZXJJbmR1Y2VkR3JhcGggPSBjYWNoZWRJbnRlckluZHVjZWRHcmFwaFtrZXldO1xuICB9XG5cbiAgcmV0dXJuIGdldE1hdGNoZWRDb3VudChpbnRlckluZHVjZWRHcmFwaCwgc3RydWN0dXJlLCBub2RlTGFiZWxQcm9wLCBlZGdlTGFiZWxQcm9wKTtcbn07XG4vKipcbiAqIOiuoeeulyBwYXR0ZXJuIOS4iue7qeeCueeahOW6puaVsOW5tuWtmOWCqOWIsCBtaW5QYXR0ZXJuTm9kZUxhYmVsRGVncmVlTWFwXG4gKi9cblxuXG52YXIgc3Rhc2hQYXR0ZXJuTm9kZUxhYmVsRGVncmVlTWFwID0gZnVuY3Rpb24gc3Rhc2hQYXR0ZXJuTm9kZUxhYmVsRGVncmVlTWFwKG1pblBhdHRlcm5Ob2RlTGFiZWxEZWdyZWVNYXAsIG5laWdoYm9yTGFiZWwsIHBhdHRlcm5Ob2RlTWFwLCBwYXR0ZXJuTm9kZUxhYmVsTWFwKSB7XG4gIHZhciBfYSwgX2IsIF9jO1xuXG4gIHZhciBtaW5QYXR0ZXJuTm9kZUxhYmVsRGVncmVlID0gKF9hID0gbWluUGF0dGVybk5vZGVMYWJlbERlZ3JlZU1hcFtuZWlnaGJvckxhYmVsXSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmRlZ3JlZTtcbiAgdmFyIG1pblBhdHRlcm5Ob2RlTGFiZWxJbkRlZ3JlZSA9IChfYiA9IG1pblBhdHRlcm5Ob2RlTGFiZWxEZWdyZWVNYXBbbmVpZ2hib3JMYWJlbF0pID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5pbkRlZ3JlZTtcbiAgdmFyIG1pblBhdHRlcm5Ob2RlTGFiZWxPdXREZWdyZWUgPSAoX2MgPSBtaW5QYXR0ZXJuTm9kZUxhYmVsRGVncmVlTWFwW25laWdoYm9yTGFiZWxdKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Mub3V0RGVncmVlO1xuXG4gIGlmIChtaW5QYXR0ZXJuTm9kZUxhYmVsRGVncmVlTWFwW25laWdoYm9yTGFiZWxdID09PSB1bmRlZmluZWQpIHtcbiAgICBtaW5QYXR0ZXJuTm9kZUxhYmVsRGVncmVlID0gSW5maW5pdHk7XG4gICAgbWluUGF0dGVybk5vZGVMYWJlbEluRGVncmVlID0gSW5maW5pdHk7XG4gICAgbWluUGF0dGVybk5vZGVMYWJlbE91dERlZ3JlZSA9IEluZmluaXR5O1xuICAgIHBhdHRlcm5Ob2RlTGFiZWxNYXBbbmVpZ2hib3JMYWJlbF0uZm9yRWFjaChmdW5jdGlvbiAocGF0dGVybk5vZGVXaXRoTGFiZWwpIHtcbiAgICAgIHZhciBwYXR0ZXJuTm9kZURlZ3JlZSA9IHBhdHRlcm5Ob2RlTWFwW3BhdHRlcm5Ob2RlV2l0aExhYmVsLmlkXS5kZWdyZWU7XG4gICAgICBpZiAobWluUGF0dGVybk5vZGVMYWJlbERlZ3JlZSA+IHBhdHRlcm5Ob2RlRGVncmVlKSBtaW5QYXR0ZXJuTm9kZUxhYmVsRGVncmVlID0gcGF0dGVybk5vZGVEZWdyZWU7XG4gICAgICB2YXIgcGF0dGVybk5vZGVJbkRlZ3JlZSA9IHBhdHRlcm5Ob2RlTWFwW3BhdHRlcm5Ob2RlV2l0aExhYmVsLmlkXS5pbkRlZ3JlZTtcbiAgICAgIGlmIChtaW5QYXR0ZXJuTm9kZUxhYmVsSW5EZWdyZWUgPiBwYXR0ZXJuTm9kZUluRGVncmVlKSBtaW5QYXR0ZXJuTm9kZUxhYmVsSW5EZWdyZWUgPSBwYXR0ZXJuTm9kZUluRGVncmVlO1xuICAgICAgdmFyIHBhdHRlcm5Ob2RlT3V0RGVncmVlID0gcGF0dGVybk5vZGVNYXBbcGF0dGVybk5vZGVXaXRoTGFiZWwuaWRdLm91dERlZ3JlZTtcbiAgICAgIGlmIChtaW5QYXR0ZXJuTm9kZUxhYmVsT3V0RGVncmVlID4gcGF0dGVybk5vZGVPdXREZWdyZWUpIG1pblBhdHRlcm5Ob2RlTGFiZWxPdXREZWdyZWUgPSBwYXR0ZXJuTm9kZU91dERlZ3JlZTtcbiAgICB9KTtcbiAgICBtaW5QYXR0ZXJuTm9kZUxhYmVsRGVncmVlTWFwW25laWdoYm9yTGFiZWxdID0ge1xuICAgICAgZGVncmVlOiBtaW5QYXR0ZXJuTm9kZUxhYmVsRGVncmVlLFxuICAgICAgaW5EZWdyZWU6IG1pblBhdHRlcm5Ob2RlTGFiZWxJbkRlZ3JlZSxcbiAgICAgIG91dERlZ3JlZTogbWluUGF0dGVybk5vZGVMYWJlbE91dERlZ3JlZVxuICAgIH07XG4gIH1cblxuICByZXR1cm4ge1xuICAgIG1pblBhdHRlcm5Ob2RlTGFiZWxEZWdyZWU6IG1pblBhdHRlcm5Ob2RlTGFiZWxEZWdyZWUsXG4gICAgbWluUGF0dGVybk5vZGVMYWJlbEluRGVncmVlOiBtaW5QYXR0ZXJuTm9kZUxhYmVsSW5EZWdyZWUsXG4gICAgbWluUGF0dGVybk5vZGVMYWJlbE91dERlZ3JlZTogbWluUGF0dGVybk5vZGVMYWJlbE91dERlZ3JlZVxuICB9O1xufTtcbi8qKlxuICogR0FEREkg5qih5byP5Yy56YWNXG4gKiBAcGFyYW0gZ3JhcGhEYXRhIOWOn+WbvuaVsOaNrlxuICogQHBhcmFtIHBhdHRlcm4g5pCc57Si5Zu+77yI6ZyA6KaB5Zyo5Y6f5Zu+5LiK5pCc57Si55qE5qih5byP77yJ5pWw5o2uXG4gKiBAcGFyYW0gZGlyZWN0ZWQg5piv5ZCm6K6h566X5pyJ5ZCR5Zu+77yM6buY6K6kIGZhbHNlXG4gKiBAcGFyYW0gayDlj4LmlbAga++8jOihqOekuiBrLei/kemCu1xuICogQHBhcmFtIGxlbmd0aCDlj4LmlbAgbGVuZ3RoXG4gKiBAcGFyYW0gbm9kZUxhYmVsUHJvcCDoioLngrnmlbDmja7kuK3ku6PooajoioLngrnmoIfnrb7vvIjliIbnsbvkv6Hmga/vvInnmoTlsZ7mgKflkI3jgILpu5jorqTkuLogY2x1c3RlclxuICogQHBhcmFtIGVkZ2VMYWJlbFByb3Ag6L655pWw5o2u5Lit5Luj6KGo6L655qCH562+77yI5YiG57G75L+h5oGv77yJ55qE5bGe5oCn5ZCN44CC6buY6K6k5Li6IGNsdXN0ZXJcbiAqL1xuXG5cbnZhciBHQURESSA9IGZ1bmN0aW9uIEdBRERJKGdyYXBoRGF0YSwgcGF0dGVybiwgZGlyZWN0ZWQsIGssIGxlbmd0aCwgbm9kZUxhYmVsUHJvcCwgZWRnZUxhYmVsUHJvcCkge1xuICBpZiAoZGlyZWN0ZWQgPT09IHZvaWQgMCkge1xuICAgIGRpcmVjdGVkID0gZmFsc2U7XG4gIH1cblxuICBpZiAobm9kZUxhYmVsUHJvcCA9PT0gdm9pZCAwKSB7XG4gICAgbm9kZUxhYmVsUHJvcCA9ICdjbHVzdGVyJztcbiAgfVxuXG4gIGlmIChlZGdlTGFiZWxQcm9wID09PSB2b2lkIDApIHtcbiAgICBlZGdlTGFiZWxQcm9wID0gJ2NsdXN0ZXInO1xuICB9XG5cbiAgaWYgKCFncmFwaERhdGEgfHwgIWdyYXBoRGF0YS5ub2RlcykgcmV0dXJuOyAvLyDliIbkuLrkuInmraXvvJpcbiAgLy8gMC4g6aKE6K6h566X77ya6IqC54K5L+i+ueaVsO+8jOmCu+aOpeefqemYteOAgeacgOefrei3r+W+hOefqemYtVxuICAvLyAxLiDlpITnkIbljp/lm74gZ3JhcGhEYXRh44CC5YaN5YiG5Li6IDF+NSDlsI/mraVcbiAgLy8gMi4g5Yy56YWNXG4gIC8vIGNvbnNvbGUubG9nKFwiLS0tLS0gc3RhZ2UtcHJlOiBwcmVwcm9jZXNzaW5nIC0tLS0tLS1cIik7XG4gIC8vIC0tLS0tLS0tIOesrOmbtuatpe+8jOmihOiuoeeul++8muiKgueCuS/ovrnmlbDvvIzpgrvmjqXnn6npmLXjgIHmnIDnn63ot6/lvoTnn6npmLUtLS0tLS0tXG5cbiAgdmFyIG5vZGVOdW0gPSBncmFwaERhdGEubm9kZXMubGVuZ3RoO1xuICBpZiAoIW5vZGVOdW0pIHJldHVybjsgLy8gY29uc29sZS5sb2coXCItLS0tLSBzdGFnZS1wcmUuMTogY2FsYyBzaG9ydGVzdCBwYXRoIG1hdHJpeCBmb3IgZ3JhcGggLS0tLS0tLVwiKTtcblxuICB2YXIgc3BtID0gKDAsIF9mbG95ZFdhcnNoYWxsLmRlZmF1bHQpKGdyYXBoRGF0YSwgZGlyZWN0ZWQpOyAvLyBjb25zb2xlLmxvZyhcbiAgLy8gICBcIi0tLS0tIHN0YWdlLXByZS4yOiBjYWxjIHNob3J0ZXN0IHBhdGggbWF0cml4IGZvciBwYXR0ZXJuIC0tLS0tLS1cIlxuICAvLyApO1xuXG4gIHZhciBwYXR0ZXJuU3BtID0gKDAsIF9mbG95ZFdhcnNoYWxsLmRlZmF1bHQpKHBhdHRlcm4sIGRpcmVjdGVkKTsgLy8gY29uc29sZS5sb2coXG4gIC8vICAgXCItLS0tLSBzdGFnZS1wcmUuMzogY2FsYyBzaG9ydGVzdCBwYXRoIG1hdHJpeCBtYXAgZm9yIGdyYXBoIC0tLS0tLS1cIlxuICAvLyApO1xuXG4gIHZhciBzcG1NYXAgPSBnZXRTcG1NYXAoZ3JhcGhEYXRhLm5vZGVzLCBzcG0sIGRpcmVjdGVkKTsgLy8gY29uc29sZS5sb2coXG4gIC8vICAgXCItLS0tLSBzdGFnZS1wcmUuNDogY2FsYyBzaG9ydGVzdCBwYXRoIG1hdHJpeCBtYXAgZm9yIHBhdHRlcm4gLS0tLS0tLVwiXG4gIC8vICk7XG5cbiAgdmFyIHBhdHRlcm5TcG1NYXAgPSBnZXRTcG1NYXAocGF0dGVybi5ub2RlcywgcGF0dGVyblNwbSwgZGlyZWN0ZWQpOyAvLyBjb25zb2xlLmxvZyhcIi0tLS0tIHN0YWdlLXByZS41OiBlc3RhYmxpc2ggbWFwcyAtLS0tLS0tXCIpO1xuICAvLyDoioLngrnnmoQgbWFw77yM5LulIGlkIOS4uiBpZCDmmKDlsITvvIzmlrnkvr/lkI7nu63lv6vpgJ/mo4DntKJcblxuICB2YXIgX2EgPSBnZXROb2RlTWFwcyhncmFwaERhdGEubm9kZXMsIG5vZGVMYWJlbFByb3ApLFxuICAgICAgbm9kZU1hcCA9IF9hLm5vZGVNYXAsXG4gICAgICBub2RlTGFiZWxNYXAgPSBfYS5ub2RlTGFiZWxNYXA7XG5cbiAgdmFyIF9iID0gZ2V0Tm9kZU1hcHMocGF0dGVybi5ub2Rlcywgbm9kZUxhYmVsUHJvcCksXG4gICAgICBwYXR0ZXJuTm9kZU1hcCA9IF9iLm5vZGVNYXAsXG4gICAgICBwYXR0ZXJuTm9kZUxhYmVsTWFwID0gX2Iubm9kZUxhYmVsTWFwOyAvLyDorqHnrpfoioLngrnluqbmlbBcblxuXG4gIGdldEVkZ2VNYXBzKGdyYXBoRGF0YS5lZGdlcywgZWRnZUxhYmVsUHJvcCwgbm9kZU1hcCk7XG4gIHZhciBwYXR0ZXJuRWRnZUxhYmVsTWFwID0gZ2V0RWRnZU1hcHMocGF0dGVybi5lZGdlcywgZWRnZUxhYmVsUHJvcCwgcGF0dGVybk5vZGVNYXApLmVkZ2VMYWJlbE1hcDsgLy8g6Iul5pyq5oyH5a6aIGxlbmd0aO+8jOiHquWKqOiuoeeulyBwYXR0ZXJuIOWNiuW+hO+8iOacgOefrei3r+W+hOacgOWkp+WAvO+8iVxuXG4gIHZhciBwYXR0ZXJuU3BtU3ByZWFkID0gW107XG4gIHBhdHRlcm5TcG0gPT09IG51bGwgfHwgcGF0dGVyblNwbSA9PT0gdm9pZCAwID8gdm9pZCAwIDogcGF0dGVyblNwbS5mb3JFYWNoKGZ1bmN0aW9uIChyb3cpIHtcbiAgICBwYXR0ZXJuU3BtU3ByZWFkID0gcGF0dGVyblNwbVNwcmVhZC5jb25jYXQocm93KTtcbiAgfSk7XG4gIGlmICghbGVuZ3RoKSBsZW5ndGggPSBNYXRoLm1heC5hcHBseShNYXRoLCAoMCwgX3RzbGliLl9fc3ByZWFkQXJyYXkpKCgwLCBfdHNsaWIuX19zcHJlYWRBcnJheSkoW10sIHBhdHRlcm5TcG1TcHJlYWQpLCBbMl0pKTtcbiAgaWYgKCFrKSBrID0gbGVuZ3RoOyAvLyBjb25zb2xlLmxvZyhcInBhcmFtc1wiLCBkaXJlY3RlZCwgbGVuZ3RoLCBrKTtcbiAgLy8gY29uc29sZS5sb2coXCItLS0tLSBzdGFnZS1wcmUuNjogY2FsYyBrIG5laWdoYm9yIHVuaXRzIC0tLS0tLS1cIik7XG4gIC8vIOiuoeeul+avj+S4quiKgueCueeahCBrIOmCu+WFg+mbhuWQiFxuXG4gIHZhciBrTmVpZ2hib3JVbml0cyA9IGZpbmRLTmVpZ2hib3JVbml0cyhncmFwaERhdGEsIHNwbSwgbm9kZUxhYmVsUHJvcCwgayk7XG4gIHZhciBwYXR0ZXJuS05laWdoYm9yVW5pdHMgPSBmaW5kS05laWdoYm9yVW5pdHMocGF0dGVybiwgcGF0dGVyblNwbSwgbm9kZUxhYmVsUHJvcCwgayk7IC8vIGNvbnNvbGUubG9nKFxuICAvLyAgIFwiLS0tLS0gc3RhZ2UwOiBnb2luZyB0byBwcm9jZXNzaW5nIGdyYXBoIGFuZCBmaW5kIGludGVyc2VjdCBuZWlnaGJvciBpbmR1Y2VkIGdyYXBocyAtLS0tLS0tXCJcbiAgLy8gKTtcbiAgLy8gY29uc29sZS5sb2coXCItLS0tLSBzdGFnZTAuMTogZ29pbmcgdG8gc2VsZWN0IHJhbmRvbSBub2RlIHBhaXJzIC0tLS0tLS1cIik7XG4gIC8vIC0tLS0tLS0tIOesrOS4gOatpe+8jOWkhOeQhuWOn+WbviBncmFwaERhdGEtLS0tLS0tXG4gIC8vIDEuMS4g6ZqP5py66YCJ5oup5pyA5aSaIDEwMCDkuKrngrnlr7nvvIzmu6HotrPot53nprvlsI/kuo4gTGVuZ3RoIOWSjCBrXG4gIC8vIOW9kyBncmFwaERhdGEg5bCR5LqOIDIwIOS4quiKgueCue+8jOWImeS4jeiDveaJvuWHuiAxMDAg5Liq54K55a+577yM5Y+q5om+5Ye65LiN5aSa5LqOIG4obi0xKS8yIOS4queCueWvuVxuXG4gIHZhciBtYXhOb2RlUGFpck51bSA9IE1hdGgubWluKDEwMCwgbm9kZU51bSAqIChub2RlTnVtIC0gMSkgLyAyKTtcbiAgdmFyIG5vZGVQYWlyc01hcCA9IGZpbmROb2RlUGFpcnNSYW5kb21seShrLCBub2RlTnVtLCBtYXhOb2RlUGFpck51bSwgcGF0dGVybktOZWlnaGJvclVuaXRzLCBzcG0pOyAvLyBjb25zb2xlLmxvZyhcbiAgLy8gICBcIi0tLS0tIHN0YWdlMC4yOiBnb2luZyB0byBjYWxjdWxhdGUgaW50ZXJzZWN0IG5laWdoYm9yIGluZHVjZWQgZ3JhcGhzIC0tLS0tLS1cIlxuICAvLyApO1xuICAvLyAxLjIuIOeUn+aIkOS4iumdouiKgueCueWvueeahOebuOW6lOebuOS6pOmCu+WxheivseWvvOWtkOWbvuOAguagvOW8j+S4uiB7J2JlZ2luTm9kZUlkeC1lbmROb2RlSWR4Jzoge25vZGVzOiBbXSwgZWRnZXM6IFtdfX1cblxuICB2YXIgaW50R01hcCA9IGdldEludGVyc2VjdE5laWdoYm9ySW5kdWNlZEdyYXBoKG5vZGVQYWlyc01hcCwga05laWdoYm9yVW5pdHMsIGdyYXBoRGF0YSk7IC8vIDEuMy4g5L2/55SoIGdTcGFuIOeul+azle+8iGZyZXF1ZW50IGdyYXBoIG1pbmluZ++8ieiuoeeulyBJU0ludEcg55qE5YmNIDEwIOS4qumikeeOh+acgOmrmOeahOWtkOe7k+aehO+8iDMtNOadoei+ue+8iVxuXG4gIHZhciB0b3AgPSAxMCxcbiAgICAgIG1pblN1cHBvcnQgPSAxLFxuICAgICAgbWluTm9kZU51bSA9IDEsXG4gICAgICBtYXhOb2RlTnVtID0gNDtcbiAgdmFyIHBhcmFtcyA9IHtcbiAgICBncmFwaHM6IGludEdNYXAsXG4gICAgbm9kZUxhYmVsUHJvcDogbm9kZUxhYmVsUHJvcCxcbiAgICBlZGdlTGFiZWxQcm9wOiBlZGdlTGFiZWxQcm9wLFxuICAgIG1pblN1cHBvcnQ6IG1pblN1cHBvcnQsXG4gICAgbWluTm9kZU51bTogbWluTm9kZU51bSxcbiAgICBtYXhOb2RlTnVtOiBtYXhOb2RlTnVtLFxuICAgIGRpcmVjdGVkOiBkaXJlY3RlZFxuICB9OyAvLyBjb25zb2xlLmxvZyhcbiAgLy8gICBcIi0tLS0tIHN0YWdlMTogKGdTcGFuKSBnb2luZyB0byBmaW5kIGZyZXF1ZW50IHN0cnVjdHVyZSBkc0cgLS0tLS0tLVwiXG4gIC8vICk7XG4gIC8vIGNvbnNvbGUubG9nKFwiLS0tLS0gc3RhZ2UxLjE6IGdvaW5nIHRvIHJ1biBnU3BhbiAtLS0tLS0tXCIpO1xuICAvLyDmmoLml7blgYforr7nlJ/miJDnmoQgc3ViIHN0cnVjdHVyZSDpg73lj6rmnInkuIDmnaHovrlcblxuICB2YXIgZnJlU3RydWN0dXJlcyA9ICgwLCBfZ1NwYW4uZGVmYXVsdCkocGFyYW1zKS5zbGljZSgwLCB0b3ApOyAvLyBzdHJ1Y3R1cmVOdW0g5Y+v6IO95bCP5LqOIHRvcFxuXG4gIHZhciBzdHJ1Y3R1cmVOdW0gPSBmcmVTdHJ1Y3R1cmVzLmxlbmd0aDsgLy8gMS40LiDorqHnrpfkuIrov7AgMTAg5Liq5a2Q57uT5p6E5ZyoIGludEdNYXAg5Lit5q+P5Liq6K+x5a+85a2Q5Zu+55qE5Yy56YWN5Liq5pWwXG5cbiAgdmFyIG1hdGNoZWRDb3VudE1hcCA9IFtdO1xuICBmcmVTdHJ1Y3R1cmVzLmZvckVhY2goZnVuY3Rpb24gKHN0cnVjdHVyZSwgaSkge1xuICAgIG1hdGNoZWRDb3VudE1hcFtpXSA9IHt9O1xuICAgIE9iamVjdC5rZXlzKGludEdNYXApLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgdmFyIGdyYXBoID0gaW50R01hcFtrZXldO1xuICAgICAgdmFyIHN1YlN0cnVjdHVyZUNvdW50ID0gZ2V0TWF0Y2hlZENvdW50KGdyYXBoLCBzdHJ1Y3R1cmUsIG5vZGVMYWJlbFByb3AsIGVkZ2VMYWJlbFByb3ApO1xuICAgICAgbWF0Y2hlZENvdW50TWFwW2ldW2tleV0gPSBzdWJTdHJ1Y3R1cmVDb3VudDtcbiAgICB9KTtcbiAgfSk7IC8vIGNvbnNvbGUubG9nKFxuICAvLyAgIFwiLS0tLS0gc3RhZ2UxLjE6IGdvaW5nIHRvIGZpbmQgdGhlIG1vc3QgcmVwcmVzZW50IHN0cnVjdXRyZSAtLS0tLS0tXCJcbiAgLy8gKTtcbiAgLy8gMS41LiDlr7nkuo7mr4/kuKrlrZDnu5PmnoTvvIzmoLnmja7ljLnphY3kuKrmlbDkuLogaW50R01hcCDkuK3nmoTor7Hlr7zlrZDlm77liIbnu4TvvIznlJ/miJAgc3RydWN0dXJlTnVtIOenjeWIhue7hFxuICAvLyDorqHnrpfmr4/np43liIbnu4TnmoTnsbvpl7Tot53lkoznsbvlhoXpl7Tot53vvIzmib7liLDnsbvpl7Tot53mnIDlpKfjgIHnsbvlhoXpl7Tot53mnIDlsI/nmoTkuIDnp43liIbnu4TvvIzov5nnp43liIbnu4Tlr7nlupTnmoTlrZDnu5PmnoTooqvpgInkuLrllK/kuIDku6PooajmgKflrZDnu5PmnoQgRFMoRylcblxuICB2YXIgX2MgPSBmaW5kUmVwcmVzZW50U3RydWN0dXJlKG1hdGNoZWRDb3VudE1hcCwgc3RydWN0dXJlTnVtLCBmcmVTdHJ1Y3R1cmVzKSxcbiAgICAgIGRzRyA9IF9jLnN0cnVjdHVyZSxcbiAgICAgIG5kc0Rpc3QgPSBfYy5zdHJ1Y3R1cmVDb3VudE1hcDsgLy8gLS0tLS0tLS0g56ys5LqM5q2l77yM5Yy56YWNLS0tLS0tLVxuICAvLyAyLjEg5LuOIFEg5Lit55qE56ys5LiA5Liq5qCH562+55qE56ys5LiA5Liq6IqC54K55byA5aeL77yM5a+75om+IEcg5Lit55qE5Yy56YWNXG5cblxuICB2YXIgYmVnaW5QTm9kZSA9IHBhdHRlcm4ubm9kZXNbMF07XG4gIHZhciBsYWJlbCA9IGJlZ2luUE5vZGVbbm9kZUxhYmVsUHJvcF07IC8vIDIuMS4xIOaJvuWIsCBHIOS4reagh+etvuS4juS5i+ebuOWQjOeahOiKgueCuVxuXG4gIHZhciBjYW5kaWRhdGVzID0gbm9kZUxhYmVsTWFwW2xhYmVsXTsgLy8gY29uc29sZS5sb2coXCItLS0tLSBzdGFnZTI6IGdvaW5nIHRvIGZpbmQgY2FuZGlkYXRlcyAtLS0tLS0tXCIpO1xuICAvLyDlhajlsYDnvJPlrZjvvIzpgb/lhY3ph43lpI3orqHnrpdcblxuICB2YXIgbWluUGF0dGVybk5vZGVMYWJlbERlZ3JlZU1hcCA9IHt9OyAvLyBrZXkg5pivIGxhYmVs77yMdmFsdWUg5piv6K+lIGxhYmVsIOiKgueCueeahOacgOWwj+W6puaVsFxuXG4gIHZhciBwYXR0ZXJuSW50R3JhcGhNYXAgPSB7fSxcbiAgICAgIHBhdHRlcm5ORFNEaXN0ID0ge30sXG4gICAgICAvLyBrZXkg5Li6IG5vZGUuaWQtbm9kZS5pZFxuICBwYXR0ZXJuTkRTRGlzdE1hcCA9IHt9OyAvLyBrZXkg5Li6IG5vZGUuaWQtbGFiZWwy77yMdmFsdWUgbmRz6Led56a75YC85pWw57uE77yI5oyJ5LuO5aSn5Yiw5bCP5o6S5bqP77yM5peg6ZyA5YWz5b+D5YW35L2T5a+55bqU5ZOq5LiqIG5vZGUy77yJXG4gIC8vIDIuMi4yIOWvueS6jiBRIOS4reeahOWPpuS4gOS4quagh+etvueahCBrIOS4quiKgueCue+8jOiuoeeul+Wug+S7rOWIsCBub2RlIOeahOacgOefrei3r+W+hOS7peWPiiBORFMg6Led56a7XG5cbiAgdmFyIHBhdHRlcm5TcERpc3QgPSB7fTtcbiAgdmFyIHBhdHRlcm5TcERpc3RCYWNrID0ge307XG4gIE9iamVjdC5rZXlzKHBhdHRlcm5Ob2RlTGFiZWxNYXApLmZvckVhY2goZnVuY3Rpb24gKGxhYmVsMiwgaikge1xuICAgIHBhdHRlcm5TcERpc3RbbGFiZWwyXSA9IFtdO1xuXG4gICAgaWYgKGRpcmVjdGVkKSB7XG4gICAgICBwYXR0ZXJuU3BEaXN0QmFja1tsYWJlbDJdID0gW107XG4gICAgfVxuXG4gICAgdmFyIG1heERpc3QgPSAtSW5maW5pdHk7XG4gICAgdmFyIHBhdHRlcm5Ob2Rlc1dpdGhMYWJlbDIgPSBwYXR0ZXJuTm9kZUxhYmVsTWFwW2xhYmVsMl07XG4gICAgdmFyIHBhdHRlcm5Ob2RlUGFpck1hcCA9IHt9O1xuICAgIHBhdHRlcm5Ob2Rlc1dpdGhMYWJlbDIuZm9yRWFjaChmdW5jdGlvbiAobm9kZVdpdGhMYWJlbDIpIHtcbiAgICAgIHZhciBkaXN0ID0gcGF0dGVyblNwbU1hcFtiZWdpblBOb2RlLmlkICsgXCItXCIgKyBub2RlV2l0aExhYmVsMi5pZF07XG4gICAgICBkaXN0ICYmIHBhdHRlcm5TcERpc3RbbGFiZWwyXS5wdXNoKGRpc3QpO1xuICAgICAgaWYgKG1heERpc3QgPCBkaXN0KSBtYXhEaXN0ID0gZGlzdDtcbiAgICAgIHBhdHRlcm5Ob2RlUGFpck1hcFtiZWdpblBOb2RlLmlkICsgXCItXCIgKyBub2RlV2l0aExhYmVsMi5pZF0gPSB7XG4gICAgICAgIHN0YXJ0OiAwLFxuICAgICAgICBlbmQ6IHBhdHRlcm5Ob2RlTWFwW25vZGVXaXRoTGFiZWwyLmlkXS5pZHgsXG4gICAgICAgIGRpc3RhbmNlOiBkaXN0XG4gICAgICB9O1xuXG4gICAgICBpZiAoZGlyZWN0ZWQpIHtcbiAgICAgICAgdmFyIGRpc3RCYWNrID0gcGF0dGVyblNwbU1hcFtub2RlV2l0aExhYmVsMi5pZCArIFwiLVwiICsgYmVnaW5QTm9kZS5pZF07XG4gICAgICAgIGRpc3RCYWNrICYmIHBhdHRlcm5TcERpc3RCYWNrW2xhYmVsMl0ucHVzaChkaXN0QmFjayk7XG4gICAgICB9XG4gICAgfSk7IC8vIHNwRGlzdFtsYWJlbDJdIOaMieeFp+S7juWwj+WIsOWkp+aOkuW6j1xuXG4gICAgcGF0dGVyblNwRGlzdFtsYWJlbDJdID0gcGF0dGVyblNwRGlzdFtsYWJlbDJdLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgIHJldHVybiBhIC0gYjtcbiAgICB9KTtcbiAgICBpZiAoZGlyZWN0ZWQpIHBhdHRlcm5TcERpc3RCYWNrW2xhYmVsMl0gPSBwYXR0ZXJuU3BEaXN0QmFja1tsYWJlbDJdLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgIHJldHVybiBhIC0gYjtcbiAgICB9KTsgLy8g6K6h566XIFEg5Lit5omA5pyJIGxhYmVsMiDoioLngrnliLAgYmVnaW5QTm9kZSDnmoQgTkRTIOi3neemu1xuICAgIC8vIOaJgOaciSBsYWJlbDIg6IqC54K55YiwIGJlZ2luUE5vZGUg55qE6YK75bGF55u45Lqk6K+x5a+85a2Q5Zu+77yaXG4gICAgLy8ga2V5OiBub2RlMS5pZC1ub2RlMi5pZFxuXG4gICAgcGF0dGVybkludEdyYXBoTWFwID0gZ2V0SW50ZXJzZWN0TmVpZ2hib3JJbmR1Y2VkR3JhcGgocGF0dGVybk5vZGVQYWlyTWFwLCBwYXR0ZXJuS05laWdoYm9yVW5pdHMsIHBhdHRlcm4sIHBhdHRlcm5JbnRHcmFwaE1hcCk7IC8vIHBhdHRlcm4g5LitIGJlZ2luTm9kZSDliLDlvZPliY0gbGFiZWwyIOiKgueCuSDnmoQgTkRTIOi3neemu++8iOaVsOe7hO+8jOaXoOmcgOWFs+W/g+WFt+S9k+WvueW6lOWIsOWTquS4quiKgueCue+8iVxuXG4gICAgdmFyIGN1cnJlbnRQYXR0ZXJuTkRTRGlzdEFycmF5ID0gW107XG4gICAgT2JqZWN0LmtleXMocGF0dGVybk5vZGVQYWlyTWFwKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIGlmIChwYXR0ZXJuTkRTRGlzdFtrZXldKSB7XG4gICAgICAgIGN1cnJlbnRQYXR0ZXJuTkRTRGlzdEFycmF5LnB1c2gocGF0dGVybk5EU0Rpc3Rba2V5XSk7XG4gICAgICAgIHJldHVybjsgLy8g57yT5a2Y6L+H5YiZ5LiN6ZyA6KaB5YaN5qyh6K6h566XXG4gICAgICB9XG5cbiAgICAgIHZhciBwYXR0ZXJuSW50R3JhcGggPSBwYXR0ZXJuSW50R3JhcGhNYXBba2V5XTtcbiAgICAgIHBhdHRlcm5ORFNEaXN0W2tleV0gPSBnZXRNYXRjaGVkQ291bnQocGF0dGVybkludEdyYXBoLCBkc0csIG5vZGVMYWJlbFByb3AsIGVkZ2VMYWJlbFByb3ApO1xuICAgICAgY3VycmVudFBhdHRlcm5ORFNEaXN0QXJyYXkucHVzaChwYXR0ZXJuTkRTRGlzdFtrZXldKTtcbiAgICB9KTsgLy8g5qC55o2u5YC85Li6IGN1cnJlbnRQYXR0ZXJuTkRTRGlzdCDku47lpKfliLDlsI/mjpLluo9cblxuICAgIGN1cnJlbnRQYXR0ZXJuTkRTRGlzdEFycmF5ID0gY3VycmVudFBhdHRlcm5ORFNEaXN0QXJyYXkuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgcmV0dXJuIGIgLSBhO1xuICAgIH0pO1xuICAgIHBhdHRlcm5ORFNEaXN0TWFwW2JlZ2luUE5vZGUuaWQgKyBcIi1cIiArIGxhYmVsMl0gPSBjdXJyZW50UGF0dGVybk5EU0Rpc3RBcnJheTtcbiAgICBpZiAobGFiZWwyID09PSBsYWJlbCkgcmV0dXJuO1xuICAgIHZhciBjYW5kaWRhdGVzTnVtID0gY2FuZGlkYXRlcy5sZW5ndGg7XG5cbiAgICB2YXIgX2xvb3BfNCA9IGZ1bmN0aW9uIF9sb29wXzQobSkge1xuICAgICAgdmFyIGNOb2RlID0gY2FuZGlkYXRlc1ttXTsgLy8gcHJ1bmUx77ya6IulIGNhbmRpZGF0ZXMg5Lit6IqC54K5IGNOb2RlIOeahCBrTmVpZ2hib3JVbml0cyDkuK3moIfnrb7kuLogbGFiZWwyIOeahOiKgueCueS4quaVsOWwkeS6jiBwYXR0ZXJuIOS4rSBsYWJlbDIg5Liq5pWw77yM5Yig5Y675a6DXG5cbiAgICAgIHZhciBncmFwaE5laWdoYm9yVW5pdCA9IGtOZWlnaGJvclVuaXRzW25vZGVNYXBbY05vZGUuaWRdLmlkeF07XG4gICAgICB2YXIgZ3JhcGhOZWlnaGJvclVuaXRDb3VudE1hcCA9IGdyYXBoTmVpZ2hib3JVbml0Lm5vZGVMYWJlbENvdW50TWFwW2xhYmVsMl07XG4gICAgICB2YXIgcGF0dGVybkxhYmVsMk51bSA9IHBhdHRlcm5Ob2RlTGFiZWxNYXBbbGFiZWwyXS5sZW5ndGg7XG5cbiAgICAgIGlmICghZ3JhcGhOZWlnaGJvclVuaXRDb3VudE1hcCB8fCBncmFwaE5laWdoYm9yVW5pdENvdW50TWFwLmNvdW50IDwgcGF0dGVybkxhYmVsMk51bSkge1xuICAgICAgICBjYW5kaWRhdGVzLnNwbGljZShtLCAxKTtcbiAgICAgICAgcmV0dXJuIFwiY29udGludWVcIjtcbiAgICAgIH0gLy8gcHJ1bmUy77ya6IulIGNhbmRpZGF0ZXMg5Lit6IqC54K5IGNOb2RlIOWIsCBrTmVpZ2hib3JVbml0cyDkuK3moIfnrb7kuLogbGFiZWwyIOeahOiKgueCueacgOefrei3r+W+hOWkp+S6jiBwYXR0ZXJuU3BEaXN0W2xhYmVsMl3vvIzliKDljrvlroNcbiAgICAgIC8vIChwcnVuZTIg6KeE5YiZ5Y2z77yaY2FuZGlkYXRlIOebuOWFs+eahOacgOefrei3r+W+hOeahOacgOWkpyBzcERpc3RbbGFiZWwyXS5sZW5ndGgg5Liq77yM5oyJ54Wn5aSn5bCP6aG65bqP5L6d5qyh5ZKMIHBhdHRlcm5TcERpc3RbbGFiZWwyXSDkuK3nmoTlgLzmr5TovoPvvIzlj6ropoHpgYfliLDkuIDkuKrmmK8gRyA+IFEg55qE77yM5bCx5Yig5Y676L+Z5LiqIGNhbmRpZGF0ZSlcblxuXG4gICAgICB2YXIgcHJ1bmUySW52YWxpZCA9IGZhbHNlO1xuXG4gICAgICBmb3IgKHZhciBuID0gMDsgbiA8IHBhdHRlcm5MYWJlbDJOdW07IG4rKykge1xuICAgICAgICBpZiAoZ3JhcGhOZWlnaGJvclVuaXRDb3VudE1hcC5kaXN0c1tuXSA+IHBhdHRlcm5TcERpc3RbbGFiZWwyXVtuXSkge1xuICAgICAgICAgIHBydW5lMkludmFsaWQgPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChwcnVuZTJJbnZhbGlkKSB7XG4gICAgICAgIGNhbmRpZGF0ZXMuc3BsaWNlKG0sIDEpO1xuICAgICAgICByZXR1cm4gXCJjb250aW51ZVwiO1xuICAgICAgfSAvLyBwcnVuZTPvvJroi6UgY2FuZGlkYXRlcyDkuK3oioLngrkgY05vZGUg5YiwIGtOZWlnaGJvclVuaXRzIOS4reagh+etvuS4uiBsYWJlbDIg55qE6IqC54K5IE5EUyDot53nprvlsI/kuo4gcGF0dGVybk5EU0Rpc3RbYmVnaW5Ob2RlLmlkLWxhYmVsMl3vvIzliKDljrvlroNcbiAgICAgIC8vIFRPRE/vvJpwcnVuZTPvvIxjdXJyZW50UGF0dGVybk5EU0Rpc3RBcnJheSDkuI4gY3VycmVudE5EU0Rpc3Qg55qE5q+U6L6DXG4gICAgICAvLyDorqHnrpcgRyDkuK3miYDmnIkgbGFiZWwyIOiKgueCueWIsCBjTm9kZSDnmoQgTkRTIOi3neemu1xuICAgICAgLy8g5omA5pyJIGxhYmVsMiDoioLngrnliLAgY05vZGUg55qE6YK75bGF55u45Lqk6K+x5a+85a2Q5Zu+77yaXG5cblxuICAgICAgdmFyIGNOb2RlUGFpck1hcCA9IHt9O1xuICAgICAgZ3JhcGhOZWlnaGJvclVuaXQubmVpZ2hib3JzLmZvckVhY2goZnVuY3Rpb24gKG5laWdoYm9yTm9kZSkge1xuICAgICAgICB2YXIgZGlzdCA9IHNwbU1hcFtjTm9kZS5pZCArIFwiLVwiICsgbmVpZ2hib3JOb2RlLmlkXTtcbiAgICAgICAgY05vZGVQYWlyTWFwW2NOb2RlLmlkICsgXCItXCIgKyBuZWlnaGJvck5vZGUuaWRdID0ge1xuICAgICAgICAgIHN0YXJ0OiBub2RlTWFwW2NOb2RlLmlkXS5pZHgsXG4gICAgICAgICAgZW5kOiBub2RlTWFwW25laWdoYm9yTm9kZS5pZF0uaWR4LFxuICAgICAgICAgIGRpc3RhbmNlOiBkaXN0XG4gICAgICAgIH07XG4gICAgICB9KTsgLy8g5pu05pawIGludEdNYXBcblxuICAgICAgaW50R01hcCA9IGdldEludGVyc2VjdE5laWdoYm9ySW5kdWNlZEdyYXBoKGNOb2RlUGFpck1hcCwga05laWdoYm9yVW5pdHMsIGdyYXBoRGF0YSwgaW50R01hcCk7IC8vIGNhbmRpZGF0ZSDliLDlroPlkajlm7QgbGFiZWwyIOiKgueCueeahCBORFMg6Led56a7LCBrZXkg5pivIG5vZGUuaWQtbm9kZS5pZFxuXG4gICAgICB2YXIgY3VycmVudE5EU0Rpc3RBcnJheSA9IFtdO1xuICAgICAgT2JqZWN0LmtleXMoY05vZGVQYWlyTWFwKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgaWYgKG5kc0Rpc3Rba2V5XSkge1xuICAgICAgICAgIGN1cnJlbnRORFNEaXN0QXJyYXkucHVzaChuZHNEaXN0W2tleV0pO1xuICAgICAgICAgIHJldHVybjsgLy8g57yT5a2Y6L+H5YiZ5LiN6ZyA6KaB5YaN5qyh6K6h566XXG4gICAgICAgIH1cblxuICAgICAgICB2YXIgaW50R3JhcGggPSBpbnRHTWFwW2tleV07XG4gICAgICAgIG5kc0Rpc3Rba2V5XSA9IGdldE1hdGNoZWRDb3VudChpbnRHcmFwaCwgZHNHLCBub2RlTGFiZWxQcm9wLCBlZGdlTGFiZWxQcm9wKTtcbiAgICAgICAgY3VycmVudE5EU0Rpc3RBcnJheS5wdXNoKG5kc0Rpc3Rba2V5XSk7XG4gICAgICB9KTsgLy8g5qC55o2u5YC85Li6IGN1cnJlbnRORFNEaXN0QXJyYXkg5LuO5aSn5Yiw5bCP5o6S5bqPXG5cbiAgICAgIGN1cnJlbnRORFNEaXN0QXJyYXkgPSBjdXJyZW50TkRTRGlzdEFycmF5LnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgcmV0dXJuIGIgLSBhO1xuICAgICAgfSk7XG4gICAgICB2YXIgcHJ1bmUzSW52YWxpZCA9IGZhbHNlO1xuXG4gICAgICBmb3IgKHZhciBuID0gMDsgbiA8IHBhdHRlcm5MYWJlbDJOdW07IG4rKykge1xuICAgICAgICBpZiAoY3VycmVudE5EU0Rpc3RBcnJheVtuXSA8IGN1cnJlbnRQYXR0ZXJuTkRTRGlzdEFycmF5W25dKSB7XG4gICAgICAgICAgcHJ1bmUzSW52YWxpZCA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHBydW5lM0ludmFsaWQpIHtcbiAgICAgICAgY2FuZGlkYXRlcy5zcGxpY2UobSwgMSk7XG4gICAgICAgIHJldHVybiBcImNvbnRpbnVlXCI7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGZvciAodmFyIG0gPSBjYW5kaWRhdGVzTnVtIC0gMTsgbSA+PSAwOyBtLS0pIHtcbiAgICAgIF9sb29wXzQobSk7XG4gICAgfVxuICB9KTtcbiAgdmFyIGNhbmRpZGF0ZUdyYXBocyA9IFtdOyAvLyBjb25zb2xlLmxvZyhcbiAgLy8gICBcIi0tLS0tIHN0YWdlMzogZ29pbmcgdG8gc3BsaWNlIG5laWdoYm9ycyBmb3IgZWFjaCBjYW5kaWRhdGUgZ3JhcGggLS0tLS0tLVwiXG4gIC8vICk7XG4gIC8vIGNhbmRpZGF0ZXMg57uP6L+H562b6YCJ5ZCO77yM5Lul5q+P5LiqIGNhbmRpZGF0ZSDkuLrkuK3lv4PvvIznlJ/miJAgTGVuZ3RoLW5laWdoYm9yIOeahOmCu+WxheivseWvvOWtkOWbvlxuICAvLyDlubblnKjor7Hlr7zlrZDlm77kuK3ljrvpmaTkuI3lj6/og73lnKggUSDkuIrmib7liLDljLnphY3nmoTngrnvvJrlnKggUSDkuIrkuI3lrZjlnKjnmoQgbGFiZWzvvIzlhbbku5YgbGFiZWwg5YiwIGNhbmRpZGF0ZSDnmoTmnIDlpKfmnIDnn63ot53nprvnrKblkIggUeOAgU5EUyDot53nprvnrKblkIggUVxuXG4gIGNhbmRpZGF0ZXMgPT09IG51bGwgfHwgY2FuZGlkYXRlcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogY2FuZGlkYXRlcy5mb3JFYWNoKGZ1bmN0aW9uIChjYW5kaWRhdGUpIHtcbiAgICB2YXIgbm9kZUlkeCA9IG5vZGVNYXBbY2FuZGlkYXRlLmlkXS5pZHg7XG4gICAgdmFyIGxlbmd0aE5laWdoYm9yVW5pdCA9IGZpbmRLTmVpZ2hib3JVbml0KGdyYXBoRGF0YS5ub2Rlcywgc3BtW25vZGVJZHhdLCBub2RlSWR4LCBub2RlTGFiZWxQcm9wLCBsZW5ndGgpO1xuICAgIHZhciBuZWlnaGJvck5vZGVzID0gbGVuZ3RoTmVpZ2hib3JVbml0Lm5laWdoYm9yczsgLy8g5Yig6Zmk5LiN5Y+v6IO95om+5Yiw5Yy56YWN55qE6YK75bGF54K5XG5cbiAgICB2YXIgbmVpZ2hib3JOdW0gPSBuZWlnaGJvck5vZGVzLmxlbmd0aDtcbiAgICB2YXIgdW5tYXRjaGVkID0gZmFsc2U7XG5cbiAgICBmb3IgKHZhciBpID0gbmVpZ2hib3JOdW0gLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgLy8g5aaC5p6c6YCa6L+H6KOB5Ymq77yM56ym5ZCI5p2h5Lu255qE6IqC54K55pWw6YeP5bey6L+H5bCR77yM6K+05piO5LiN6IO95Yy56YWN6L+Z5LiqIGNhbmRpZGF0ZSDnm7jlhbPnmoTlm75cbiAgICAgIGlmIChuZWlnaGJvck5vZGVzLmxlbmd0aCArIDEgPCBwYXR0ZXJuLm5vZGVzLmxlbmd0aCkge1xuICAgICAgICB1bm1hdGNoZWQgPSB0cnVlO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBuZWlnaGJvck5vZGUgPSBuZWlnaGJvck5vZGVzW2ldO1xuICAgICAgdmFyIG5laWdoYm9yTGFiZWwgPSBuZWlnaGJvck5vZGVbbm9kZUxhYmVsUHJvcF07IC8vIHBydW5lMTog6Iul6K+l6YK75bGF54K555qEIGxhYmVsIOS4jeWtmOWcqOS6jiBwYXR0ZXJuIOS4re+8jOenu+mZpOi/meS4queCuVxuXG4gICAgICBpZiAoIXBhdHRlcm5Ob2RlTGFiZWxNYXBbbmVpZ2hib3JMYWJlbF0gfHwgIXBhdHRlcm5Ob2RlTGFiZWxNYXBbbmVpZ2hib3JMYWJlbF0ubGVuZ3RoKSB7XG4gICAgICAgIG5laWdoYm9yTm9kZXMuc3BsaWNlKGksIDEpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH0gLy8gcHJ1bmUyOiDoi6Xor6XpgrvlsYXngrnliLAgY2FuZGlkYXRlIOeahOacgOefrei3r+W+hOavlOWSjOWug+acieebuOWQjCBsYWJlbCDnmoToioLngrnliLAgYmVnaW5QTm9kZSDnmoTmnIDlpKfmnIDnn63ot6/lvoTplb/luqbplb/vvIznp7vpmaTov5nkuKrngrlcbiAgICAgIC8vIHBydW5lMi4xOiDlpoLmnpzmsqHmnInov5nkuKrmoIfnrb7liLAgYmVnaW5QTm9kZSDnmoTot53nprvorrDlvZXvvIzor7TmmI4gcGF0dGVybiDkuIrvvIjlj6/og70gYmVnaW5QTm9kZSDmmK/ov5nkuKogbGFiZWzvvInmsqHmnInlhbbku5bov5nkuKogbGFiZWwg55qE6IqC54K5XG5cblxuICAgICAgaWYgKCFwYXR0ZXJuU3BEaXN0W25laWdoYm9yTGFiZWxdIHx8ICFwYXR0ZXJuU3BEaXN0W25laWdoYm9yTGFiZWxdLmxlbmd0aCkge1xuICAgICAgICBuZWlnaGJvck5vZGVzLnNwbGljZShpLCAxKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHZhciBrZXkgPSBjYW5kaWRhdGUuaWQgKyBcIi1cIiArIG5laWdoYm9yTm9kZS5pZDsgLy8gcHJ1bmUyLjJcblxuICAgICAgdmFyIGRpc3RUb0NhbmRpZGF0ZSA9IHNwbU1hcFtrZXldO1xuICAgICAgdmFyIGlkeCA9IHBhdHRlcm5TcERpc3RbbmVpZ2hib3JMYWJlbF0ubGVuZ3RoIC0gMTtcbiAgICAgIHZhciBtYXhEaXN0V2l0aExhYmVsSW5QYXR0ZXJuID0gcGF0dGVyblNwRGlzdFtuZWlnaGJvckxhYmVsXVtpZHhdOyAvLyBwYXR0ZXJuU3BEaXN0W25laWdoYm9yTGFiZWxdIOW3sue7j+aMieeFp+S7juWwj+WIsOWkp+aOkuW6j1xuXG4gICAgICBpZiAoZGlzdFRvQ2FuZGlkYXRlID4gbWF4RGlzdFdpdGhMYWJlbEluUGF0dGVybikge1xuICAgICAgICBuZWlnaGJvck5vZGVzLnNwbGljZShpLCAxKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChkaXJlY3RlZCkge1xuICAgICAgICB2YXIga2V5QmFjayA9IG5laWdoYm9yTm9kZS5pZCArIFwiLVwiICsgY2FuZGlkYXRlLmlkO1xuICAgICAgICB2YXIgZGlzdEZyb21DYW5kaWRhdGUgPSBzcG1NYXBba2V5QmFja107XG4gICAgICAgIGlkeCA9IHBhdHRlcm5TcERpc3RCYWNrW25laWdoYm9yTGFiZWxdLmxlbmd0aCAtIDE7XG4gICAgICAgIHZhciBtYXhCYWNrRGlzdFdpdGhMYWJlbEluUGF0dGVybiA9IHBhdHRlcm5TcERpc3RCYWNrW25laWdoYm9yTGFiZWxdW2lkeF07XG5cbiAgICAgICAgaWYgKGRpc3RGcm9tQ2FuZGlkYXRlID4gbWF4QmFja0Rpc3RXaXRoTGFiZWxJblBhdHRlcm4pIHtcbiAgICAgICAgICBuZWlnaGJvck5vZGVzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfSAvLyBwcnVuZTM6IOiLpeivpemCu+WxheeCueWIsCBjYW5kaWRhdGUg55qEIE5EUyDot53nprvmr5TlkozlroPmnInnm7jlkIwgbGFiZWwg55qE6IqC54K55YiwIGJlZ2luUE5vZGUg55qE5pyA5bCPIE5EUyDot53nprvlsI/vvIznp7vpmaTov5nkuKrngrlcblxuXG4gICAgICB2YXIgbmRzVG9DYW5kaWRhdGUgPSBuZHNEaXN0W2tleV0gPyBuZHNEaXN0W2tleV0gOiBnZXRORFNEaXN0KGdyYXBoRGF0YSwgY2FuZGlkYXRlLCBuZWlnaGJvck5vZGUsIG5vZGVNYXAsIGRpc3RUb0NhbmRpZGF0ZSwga05laWdoYm9yVW5pdHMsIGRzRywgbm9kZUxhYmVsUHJvcCwgZWRnZUxhYmVsUHJvcCwgbmRzRGlzdCwgaW50R01hcCk7XG4gICAgICB2YXIgcGF0dGVybktleSA9IGJlZ2luUE5vZGUuaWQgKyBcIi1cIiArIG5laWdoYm9yTGFiZWw7XG4gICAgICB2YXIgbWluTmRzV2l0aExhYmVsSW5QYXR0ZXJuID0gcGF0dGVybk5EU0Rpc3RNYXBbcGF0dGVybktleV1bcGF0dGVybk5EU0Rpc3RNYXBbcGF0dGVybktleV0ubGVuZ3RoIC0gMV07IC8vIHBhdHRlcm5ORFNEaXN0W2tleV0g5LiA5a6a5a2Y5ZyoXG5cbiAgICAgIGlmIChuZHNUb0NhbmRpZGF0ZSA8IG1pbk5kc1dpdGhMYWJlbEluUGF0dGVybikge1xuICAgICAgICBuZWlnaGJvck5vZGVzLnNwbGljZShpLCAxKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9IC8vIHBydW5lNDog6Iul6K+l6YK75bGF54K555qE5bqm5pWw5bCP5LqOIHBhdHRlcm4g5ZCMIGxhYmVsIOiKgueCueacgOWwj+W6puaVsO+8jOWIoOWOu+ivpeeCuVxuXG5cbiAgICAgIHZhciBfYSA9IHN0YXNoUGF0dGVybk5vZGVMYWJlbERlZ3JlZU1hcChtaW5QYXR0ZXJuTm9kZUxhYmVsRGVncmVlTWFwLCBuZWlnaGJvckxhYmVsLCBwYXR0ZXJuTm9kZU1hcCwgcGF0dGVybk5vZGVMYWJlbE1hcCksXG4gICAgICAgICAgbWluUGF0dGVybk5vZGVMYWJlbERlZ3JlZSA9IF9hLm1pblBhdHRlcm5Ob2RlTGFiZWxEZWdyZWUsXG4gICAgICAgICAgbWluUGF0dGVybk5vZGVMYWJlbEluRGVncmVlID0gX2EubWluUGF0dGVybk5vZGVMYWJlbEluRGVncmVlLFxuICAgICAgICAgIG1pblBhdHRlcm5Ob2RlTGFiZWxPdXREZWdyZWUgPSBfYS5taW5QYXR0ZXJuTm9kZUxhYmVsT3V0RGVncmVlO1xuXG4gICAgICBpZiAobm9kZU1hcFtuZWlnaGJvck5vZGUuaWRdLmRlZ3JlZSA8IG1pblBhdHRlcm5Ob2RlTGFiZWxEZWdyZWUpIHtcbiAgICAgICAgbmVpZ2hib3JOb2Rlcy5zcGxpY2UoaSwgMSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH0gLy8g6IqC54K55Zyo5Liq5pWw5LiK56ym5ZCI5Yy56YWN77yI5LiN5bCR5LqOIHBhdHRlcm4g55qE6IqC54K55Liq5pWw77yJ77yM546w5Zyo562b6YCJ55u45YWz6L65XG5cblxuICAgIGlmICghdW5tYXRjaGVkKSB7XG4gICAgICBjYW5kaWRhdGVHcmFwaHMucHVzaCh7XG4gICAgICAgIG5vZGVzOiBbY2FuZGlkYXRlXS5jb25jYXQobmVpZ2hib3JOb2RlcylcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7IC8vIGNvbnNvbGUubG9nKFxuICAvLyAgIFwiLS0tLS0gc3RhZ2U0OiBnb2luZyB0byBzcGxpY2UgZWRnZXMgYW5kIG5laWdoYm9ycyBmb3IgZWFjaCBjYW5kaWRhdGUgZ3JhcGggLS0tLS0tLVwiXG4gIC8vICk7XG5cbiAgdmFyIHVuZGlyZWN0ZWRMZW5ndGhzVG9CZWdpblBOb2RlID0gKDAsIF9kaWprc3RyYS5kZWZhdWx0KShwYXR0ZXJuLCBiZWdpblBOb2RlLmlkLCBmYWxzZSkubGVuZ3RoO1xuICB2YXIgdW5kaXJlY3RlZExlbmd0aHNUb0JlZ2luUE5vZGVMYWJlbE1hcCA9IHt9O1xuXG4gIGlmIChkaXJlY3RlZCkge1xuICAgIE9iamVjdC5rZXlzKHVuZGlyZWN0ZWRMZW5ndGhzVG9CZWdpblBOb2RlKS5mb3JFYWNoKGZ1bmN0aW9uIChub2RlSWQpIHtcbiAgICAgIHZhciBub2RlTGFiZWwgPSBwYXR0ZXJuTm9kZU1hcFtub2RlSWRdLm5vZGVbbm9kZUxhYmVsUHJvcF07XG4gICAgICBpZiAoIXVuZGlyZWN0ZWRMZW5ndGhzVG9CZWdpblBOb2RlTGFiZWxNYXBbbm9kZUxhYmVsXSkgdW5kaXJlY3RlZExlbmd0aHNUb0JlZ2luUE5vZGVMYWJlbE1hcFtub2RlTGFiZWxdID0gW3VuZGlyZWN0ZWRMZW5ndGhzVG9CZWdpblBOb2RlW25vZGVJZF1dO2Vsc2UgdW5kaXJlY3RlZExlbmd0aHNUb0JlZ2luUE5vZGVMYWJlbE1hcFtub2RlTGFiZWxdLnB1c2godW5kaXJlY3RlZExlbmd0aHNUb0JlZ2luUE5vZGVbbm9kZUlkXSk7XG4gICAgfSk7XG4gICAgT2JqZWN0LmtleXModW5kaXJlY3RlZExlbmd0aHNUb0JlZ2luUE5vZGVMYWJlbE1hcCkuZm9yRWFjaChmdW5jdGlvbiAocExhYmVsKSB7XG4gICAgICB1bmRpcmVjdGVkTGVuZ3Roc1RvQmVnaW5QTm9kZUxhYmVsTWFwW3BMYWJlbF0uc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICByZXR1cm4gYSAtIGI7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICB1bmRpcmVjdGVkTGVuZ3Roc1RvQmVnaW5QTm9kZUxhYmVsTWFwID0gcGF0dGVyblNwRGlzdDtcbiAgfSAvLyDnjrDlnKggY2FuZGlkYXRlR3JhcGhzIOmHjOmdouWPquacieiKgueCue+8jOi/m+ihjOi+ueeahOetm+mAiVxuXG5cbiAgdmFyIGNhbmRpZGF0ZUdyYXBoTnVtID0gY2FuZGlkYXRlR3JhcGhzLmxlbmd0aDtcblxuICB2YXIgX2xvb3BfMiA9IGZ1bmN0aW9uIF9sb29wXzIoaSkge1xuICAgIHZhciBjYW5kaWRhdGVHcmFwaCA9IGNhbmRpZGF0ZUdyYXBoc1tpXTtcbiAgICB2YXIgY2FuZGlkYXRlID0gY2FuZGlkYXRlR3JhcGgubm9kZXNbMF07XG4gICAgdmFyIGNhbmRpZGF0ZU5vZGVMYWJlbENvdW50TWFwID0ge307XG4gICAgdmFyIGNhbmRpZGF0ZU5vZGVNYXAgPSB7fTtcbiAgICBjYW5kaWRhdGVHcmFwaC5ub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChub2RlLCBxKSB7XG4gICAgICBjYW5kaWRhdGVOb2RlTWFwW25vZGUuaWRdID0ge1xuICAgICAgICBpZHg6IHEsXG4gICAgICAgIG5vZGU6IG5vZGUsXG4gICAgICAgIGRlZ3JlZTogMCxcbiAgICAgICAgaW5EZWdyZWU6IDAsXG4gICAgICAgIG91dERlZ3JlZTogMFxuICAgICAgfTtcbiAgICAgIHZhciBjTm9kZUxhYmVsID0gbm9kZVtub2RlTGFiZWxQcm9wXTtcbiAgICAgIGlmICghY2FuZGlkYXRlTm9kZUxhYmVsQ291bnRNYXBbY05vZGVMYWJlbF0pIGNhbmRpZGF0ZU5vZGVMYWJlbENvdW50TWFwW2NOb2RlTGFiZWxdID0gMTtlbHNlIGNhbmRpZGF0ZU5vZGVMYWJlbENvdW50TWFwW2NOb2RlTGFiZWxdKys7XG4gICAgfSk7IC8vIOagueaNriBjYW5kaWRhdGUg5ZKMIG5laWdoYm9yTm9kZXMg5Lit55qE6IqC54K555Sf5oiQIEcg55qE6K+x5a+85a2Q5Zu+XG4gICAgLy8g5Y2z77yM5bCGIGdyYXBoRGF0YSDkuIrkuKTnq6/pg73lnKggY2FuZGlkYXRlR3JhcGgubm9kZXMg5Lit55qE6L655pS+5YWlIGNhbmRpZGF0ZUVkZ2VzXG5cbiAgICB2YXIgY2FuZGlkYXRlRWRnZXMgPSBbXTtcbiAgICB2YXIgZWRnZUxhYmVsQ291bnRNYXAgPSB7fTtcbiAgICBncmFwaERhdGEuZWRnZXMuZm9yRWFjaChmdW5jdGlvbiAoZWRnZSkge1xuICAgICAgaWYgKGNhbmRpZGF0ZU5vZGVNYXBbZWRnZS5zb3VyY2VdICYmIGNhbmRpZGF0ZU5vZGVNYXBbZWRnZS50YXJnZXRdKSB7XG4gICAgICAgIGNhbmRpZGF0ZUVkZ2VzLnB1c2goZWRnZSk7XG4gICAgICAgIGlmICghZWRnZUxhYmVsQ291bnRNYXBbZWRnZVtlZGdlTGFiZWxQcm9wXV0pIGVkZ2VMYWJlbENvdW50TWFwW2VkZ2VbZWRnZUxhYmVsUHJvcF1dID0gMTtlbHNlIGVkZ2VMYWJlbENvdW50TWFwW2VkZ2VbZWRnZUxhYmVsUHJvcF1dKys7XG4gICAgICAgIGNhbmRpZGF0ZU5vZGVNYXBbZWRnZS5zb3VyY2VdLmRlZ3JlZSsrO1xuICAgICAgICBjYW5kaWRhdGVOb2RlTWFwW2VkZ2UudGFyZ2V0XS5kZWdyZWUrKztcbiAgICAgICAgY2FuZGlkYXRlTm9kZU1hcFtlZGdlLnNvdXJjZV0ub3V0RGVncmVlKys7XG4gICAgICAgIGNhbmRpZGF0ZU5vZGVNYXBbZWRnZS50YXJnZXRdLmluRGVncmVlKys7XG4gICAgICB9XG4gICAgfSk7IC8vIHBydW5l77ya6Iul5pyJ5LiA5LiqIGVkZ2VMYWJlbCDlnKggY2FuZGlkYXRlR3JhcGgg5LiK55qE5Liq5pWw5bCR5LqOIHBhdHRlcm7vvIzljrvpmaTor6Xlm75cblxuICAgIHZhciBwYXR0ZW5yRWRnZUxhYmVsTnVtID0gT2JqZWN0LmtleXMocGF0dGVybkVkZ2VMYWJlbE1hcCkubGVuZ3RoO1xuICAgIHZhciBwcnVuZWRCeUVkZ2VMYWJlbCA9IGZhbHNlO1xuXG4gICAgZm9yICh2YXIgZSA9IDA7IGUgPCBwYXR0ZW5yRWRnZUxhYmVsTnVtOyBlKyspIHtcbiAgICAgIHZhciBsYWJlbF8xID0gT2JqZWN0LmtleXMocGF0dGVybkVkZ2VMYWJlbE1hcClbZV07XG5cbiAgICAgIGlmICghZWRnZUxhYmVsQ291bnRNYXBbbGFiZWxfMV0gfHwgZWRnZUxhYmVsQ291bnRNYXBbbGFiZWxfMV0gPCBwYXR0ZXJuRWRnZUxhYmVsTWFwW2xhYmVsXzFdLmxlbmd0aCkge1xuICAgICAgICBwcnVuZWRCeUVkZ2VMYWJlbCA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChwcnVuZWRCeUVkZ2VMYWJlbCkge1xuICAgICAgY2FuZGlkYXRlR3JhcGhzLnNwbGljZShpLCAxKTtcbiAgICAgIHJldHVybiBcImNvbnRpbnVlXCI7XG4gICAgfSAvLyDpgY3ljoYgY2FuZGlkYXRlRWRnZXPvvIzov5vooYzovrnnmoTnrZvpgIlcblxuXG4gICAgdmFyIGNhbmRpZGF0ZUVkZ2VOdW0gPSBjYW5kaWRhdGVFZGdlcy5sZW5ndGg7IC8vIHBydW5l77ya6Iul6L655pWw6L+H5bCR77yM5Y676Zmk6K+l5Zu+XG5cbiAgICBpZiAoY2FuZGlkYXRlRWRnZU51bSA8IHBhdHRlcm4uZWRnZXMubGVuZ3RoKSB7XG4gICAgICBjYW5kaWRhdGVHcmFwaHMuc3BsaWNlKGksIDEpO1xuICAgICAgcmV0dXJuIFwiYnJlYWtcIjtcbiAgICB9XG5cbiAgICB2YXIgY2FuZGlkYXRlR3JhcGhJbnZhbGlkID0gZmFsc2U7XG5cbiAgICB2YXIgX2xvb3BfNSA9IGZ1bmN0aW9uIF9sb29wXzUoZSkge1xuICAgICAgdmFyIGVkZ2UgPSBjYW5kaWRhdGVFZGdlc1tlXTtcbiAgICAgIHZhciBlZGdlTGFiZWwgPSBlZGdlW2VkZ2VMYWJlbFByb3BdO1xuICAgICAgdmFyIHBhdHRlcm5FZGdlc1dpdGhMYWJlbCA9IHBhdHRlcm5FZGdlTGFiZWxNYXBbZWRnZUxhYmVsXTsgLy8gcHJ1bmUgMTog6Iul6L6555qEIGxhYmVsIOS4jeWtmOWcqOS6jiBwYXR0ZXJuIOi+uSBsYWJlbCDkuK3vvIzljrvpmaTor6XovrlcblxuICAgICAgaWYgKCFwYXR0ZXJuRWRnZXNXaXRoTGFiZWwgfHwgIXBhdHRlcm5FZGdlc1dpdGhMYWJlbC5sZW5ndGgpIHtcbiAgICAgICAgZWRnZUxhYmVsQ291bnRNYXBbZWRnZUxhYmVsXS0tOyAvLyDoi6Xov5nkuKogbGFiZWwg55qEIGNvdW50IOWHj+WwkeS5i+WQju+8jOivpSBsYWJlbCDnmoTovrnmlbDkuI3otrPvvIzljrvpmaTor6Xlm75cblxuICAgICAgICBpZiAocGF0dGVybkVkZ2VzV2l0aExhYmVsICYmIGVkZ2VMYWJlbENvdW50TWFwW2VkZ2VMYWJlbF0gPCBwYXR0ZXJuRWRnZXNXaXRoTGFiZWwubGVuZ3RoKSB7XG4gICAgICAgICAgY2FuZGlkYXRlR3JhcGhJbnZhbGlkID0gdHJ1ZTtcbiAgICAgICAgICByZXR1cm4gXCJicmVha1wiO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FuZGlkYXRlRWRnZXMuc3BsaWNlKGUsIDEpO1xuICAgICAgICBjYW5kaWRhdGVOb2RlTWFwW2VkZ2Uuc291cmNlXS5kZWdyZWUtLTtcbiAgICAgICAgY2FuZGlkYXRlTm9kZU1hcFtlZGdlLnRhcmdldF0uZGVncmVlLS07XG4gICAgICAgIGNhbmRpZGF0ZU5vZGVNYXBbZWRnZS5zb3VyY2VdLm91dERlZ3JlZS0tO1xuICAgICAgICBjYW5kaWRhdGVOb2RlTWFwW2VkZ2UudGFyZ2V0XS5pbkRlZ3JlZS0tO1xuICAgICAgICByZXR1cm4gXCJjb250aW51ZVwiO1xuICAgICAgfSAvLyBwcnVuZSAyOiDoi6XovrnnmoQgbGFiZWwgK+S4pOerryBsYWJlbCDnmoTkuInlhYPnu4TlhbPns7vkuI3og73lnKggcGF0dGVybiDkuK3mib7liLDvvIzljrvpmaTor6XovrlcblxuXG4gICAgICB2YXIgc291cmNlTGFiZWwgPSBjYW5kaWRhdGVOb2RlTWFwW2VkZ2Uuc291cmNlXS5ub2RlW25vZGVMYWJlbFByb3BdO1xuICAgICAgdmFyIHRhcmdldExhYmVsID0gY2FuZGlkYXRlTm9kZU1hcFtlZGdlLnRhcmdldF0ubm9kZVtub2RlTGFiZWxQcm9wXTtcbiAgICAgIHZhciBlZGdlTWF0Y2hlZCA9IGZhbHNlO1xuICAgICAgcGF0dGVybkVkZ2VzV2l0aExhYmVsLmZvckVhY2goZnVuY3Rpb24gKHBhdHRlcm5FZGdlKSB7XG4gICAgICAgIHZhciBwYXR0ZXJuU291cmNlID0gcGF0dGVybk5vZGVNYXBbcGF0dGVybkVkZ2Uuc291cmNlXS5ub2RlO1xuICAgICAgICB2YXIgcGF0dGVyblRhcmdldCA9IHBhdHRlcm5Ob2RlTWFwW3BhdHRlcm5FZGdlLnRhcmdldF0ubm9kZTtcbiAgICAgICAgaWYgKHBhdHRlcm5Tb3VyY2Vbbm9kZUxhYmVsUHJvcF0gPT09IHNvdXJjZUxhYmVsICYmIHBhdHRlcm5UYXJnZXRbbm9kZUxhYmVsUHJvcF0gPT09IHRhcmdldExhYmVsKSBlZGdlTWF0Y2hlZCA9IHRydWU7XG4gICAgICAgIGlmICghZGlyZWN0ZWQgJiYgcGF0dGVyblNvdXJjZVtub2RlTGFiZWxQcm9wXSA9PT0gdGFyZ2V0TGFiZWwgJiYgcGF0dGVyblRhcmdldFtub2RlTGFiZWxQcm9wXSA9PT0gc291cmNlTGFiZWwpIGVkZ2VNYXRjaGVkID0gdHJ1ZTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoIWVkZ2VNYXRjaGVkKSB7XG4gICAgICAgIGVkZ2VMYWJlbENvdW50TWFwW2VkZ2VMYWJlbF0tLTsgLy8g6Iul6L+Z5LiqIGxhYmVsIOeahCBjb3VudCDlh4/lsJHkuYvlkI7vvIzor6UgbGFiZWwg55qE6L655pWw5LiN6Laz77yM5Y676Zmk6K+l5Zu+XG5cbiAgICAgICAgaWYgKHBhdHRlcm5FZGdlc1dpdGhMYWJlbCAmJiBlZGdlTGFiZWxDb3VudE1hcFtlZGdlTGFiZWxdIDwgcGF0dGVybkVkZ2VzV2l0aExhYmVsLmxlbmd0aCkge1xuICAgICAgICAgIGNhbmRpZGF0ZUdyYXBoSW52YWxpZCA9IHRydWU7XG4gICAgICAgICAgcmV0dXJuIFwiYnJlYWtcIjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNhbmRpZGF0ZUVkZ2VzLnNwbGljZShlLCAxKTtcbiAgICAgICAgY2FuZGlkYXRlTm9kZU1hcFtlZGdlLnNvdXJjZV0uZGVncmVlLS07XG4gICAgICAgIGNhbmRpZGF0ZU5vZGVNYXBbZWRnZS50YXJnZXRdLmRlZ3JlZS0tO1xuICAgICAgICBjYW5kaWRhdGVOb2RlTWFwW2VkZ2Uuc291cmNlXS5vdXREZWdyZWUtLTtcbiAgICAgICAgY2FuZGlkYXRlTm9kZU1hcFtlZGdlLnRhcmdldF0uaW5EZWdyZWUtLTtcbiAgICAgICAgcmV0dXJuIFwiY29udGludWVcIjtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZm9yICh2YXIgZSA9IGNhbmRpZGF0ZUVkZ2VOdW0gLSAxOyBlID49IDA7IGUtLSkge1xuICAgICAgdmFyIHN0YXRlXzIgPSBfbG9vcF81KGUpO1xuXG4gICAgICBpZiAoc3RhdGVfMiA9PT0gXCJicmVha1wiKSBicmVhaztcbiAgICB9IC8vIHBydW5lMjog5Yig6Zmk6L6555qE6L+H56iL5Lit77yM5Y+R546w6L655pWw6L+H5bCRL+i+uSBsYWJlbCDmlbDov4flsJHml7bvvIzljrvpmaTor6Xlm75cblxuXG4gICAgaWYgKGNhbmRpZGF0ZUdyYXBoSW52YWxpZCkge1xuICAgICAgY2FuZGlkYXRlR3JhcGhzLnNwbGljZShpLCAxKTtcbiAgICAgIHJldHVybiBcImNvbnRpbnVlXCI7XG4gICAgfVxuXG4gICAgY2FuZGlkYXRlR3JhcGguZWRnZXMgPSBjYW5kaWRhdGVFZGdlcztcbiAgICB2YXIgbGVuZ3Roc1RvQ2FuZGlkYXRlID0gKDAsIF9kaWprc3RyYS5kZWZhdWx0KShjYW5kaWRhdGVHcmFwaCwgY2FuZGlkYXRlR3JhcGgubm9kZXNbMF0uaWQsIGZhbHNlKS5sZW5ndGg7XG4gICAgT2JqZWN0LmtleXMobGVuZ3Roc1RvQ2FuZGlkYXRlKS5yZXZlcnNlKCkuZm9yRWFjaChmdW5jdGlvbiAodGFyZ2V0SWQpIHtcbiAgICAgIGlmICh0YXJnZXRJZCA9PT0gY2FuZGlkYXRlR3JhcGgubm9kZXNbMF0uaWQgfHwgY2FuZGlkYXRlR3JhcGhJbnZhbGlkKSByZXR1cm47IC8vIHBydW5lNDog6YCa6L+H5LiK6L+w6KOB5Ymq77yM5Y+v6IO95a+86Ie06K+l6YK75bGF5a2Q5Zu+5Y+Y5Li65LiN6L+e6YCa44CC6KOB5Ymq5o6J55uu5YmN5Zyo6L+Z5Liq6YK75bGF5a2Q5Zu+5Lit5ZKMIGNhbmRpZGF0Ze+8iOesrOS4gOS4quiKgueCue+8ieS4jei/numAmueahOiKgueCuVxuXG4gICAgICBpZiAobGVuZ3Roc1RvQ2FuZGlkYXRlW3RhcmdldElkXSA9PT0gSW5maW5pdHkpIHtcbiAgICAgICAgdmFyIHRhcmdldE5vZGVMYWJlbCA9IGNhbmRpZGF0ZU5vZGVNYXBbdGFyZ2V0SWRdLm5vZGVbbm9kZUxhYmVsUHJvcF07XG4gICAgICAgIGNhbmRpZGF0ZU5vZGVMYWJlbENvdW50TWFwW3RhcmdldE5vZGVMYWJlbF0tLTtcblxuICAgICAgICBpZiAoY2FuZGlkYXRlTm9kZUxhYmVsQ291bnRNYXBbdGFyZ2V0Tm9kZUxhYmVsXSA8IHBhdHRlcm5Ob2RlTGFiZWxNYXBbdGFyZ2V0Tm9kZUxhYmVsXS5sZW5ndGgpIHtcbiAgICAgICAgICBjYW5kaWRhdGVHcmFwaEludmFsaWQgPSB0cnVlO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBpZHggPSBjYW5kaWRhdGVHcmFwaC5ub2Rlcy5pbmRleE9mKGNhbmRpZGF0ZU5vZGVNYXBbdGFyZ2V0SWRdLm5vZGUpO1xuICAgICAgICBjYW5kaWRhdGVHcmFwaC5ub2Rlcy5zcGxpY2UoaWR4LCAxKTtcbiAgICAgICAgY2FuZGlkYXRlTm9kZU1hcFt0YXJnZXRJZF0gPSB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gLy8gcHJ1bmU1OiDnu4/ov4fovrnoo4HliarlkI7vvIzlj6/og73lj4jlh7rnjrDkuobmnIDnn63ot6/lvoTov4fplb/nmoToioLngrkg77yI5q+UIHBhdHRlcm4g5Lit5ZCMIGxhYmVsIOeahOiKgueCueWIsCBiZWdpbk5vZGUg5pyA5aSn5pyA55+t6Led56a76L+c77yJ77yM5Yig5Y676L+Z5Lqb6IqC54K5XG5cblxuICAgICAgdmFyIG5MYWJlbCA9IG5vZGVNYXBbdGFyZ2V0SWRdLm5vZGVbbm9kZUxhYmVsUHJvcF07XG5cbiAgICAgIGlmICghdW5kaXJlY3RlZExlbmd0aHNUb0JlZ2luUE5vZGVMYWJlbE1hcFtuTGFiZWxdIHx8ICF1bmRpcmVjdGVkTGVuZ3Roc1RvQmVnaW5QTm9kZUxhYmVsTWFwW25MYWJlbF0ubGVuZ3RoIHx8IGxlbmd0aHNUb0NhbmRpZGF0ZVt0YXJnZXRJZF0gPiB1bmRpcmVjdGVkTGVuZ3Roc1RvQmVnaW5QTm9kZUxhYmVsTWFwW25MYWJlbF1bdW5kaXJlY3RlZExlbmd0aHNUb0JlZ2luUE5vZGVMYWJlbE1hcFtuTGFiZWxdLmxlbmd0aCAtIDFdKSB7XG4gICAgICAgIHZhciB0YXJnZXROb2RlTGFiZWwgPSBjYW5kaWRhdGVOb2RlTWFwW3RhcmdldElkXS5ub2RlW25vZGVMYWJlbFByb3BdO1xuICAgICAgICBjYW5kaWRhdGVOb2RlTGFiZWxDb3VudE1hcFt0YXJnZXROb2RlTGFiZWxdLS07XG5cbiAgICAgICAgaWYgKGNhbmRpZGF0ZU5vZGVMYWJlbENvdW50TWFwW3RhcmdldE5vZGVMYWJlbF0gPCBwYXR0ZXJuTm9kZUxhYmVsTWFwW3RhcmdldE5vZGVMYWJlbF0ubGVuZ3RoKSB7XG4gICAgICAgICAgY2FuZGlkYXRlR3JhcGhJbnZhbGlkID0gdHJ1ZTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgaWR4ID0gY2FuZGlkYXRlR3JhcGgubm9kZXMuaW5kZXhPZihjYW5kaWRhdGVOb2RlTWFwW3RhcmdldElkXS5ub2RlKTtcbiAgICAgICAgY2FuZGlkYXRlR3JhcGgubm9kZXMuc3BsaWNlKGlkeCwgMSk7XG4gICAgICAgIGNhbmRpZGF0ZU5vZGVNYXBbdGFyZ2V0SWRdID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKGNhbmRpZGF0ZUdyYXBoSW52YWxpZCkge1xuICAgICAgY2FuZGlkYXRlR3JhcGhzLnNwbGljZShpLCAxKTtcbiAgICAgIHJldHVybiBcImNvbnRpbnVlXCI7XG4gICAgfVxuXG4gICAgdmFyIGRlZ3JlZUNoYW5nZWQgPSB0cnVlO1xuICAgIHZhciBsb29wQ291bnQgPSAwO1xuXG4gICAgd2hpbGUgKGRlZ3JlZUNoYW5nZWQgJiYgIWNhbmRpZGF0ZUdyYXBoSW52YWxpZCkge1xuICAgICAgZGVncmVlQ2hhbmdlZCA9IGZhbHNlOyAvLyBjYW5kaWRhdGUg5bqm5pWw5LiN6Laz77yM5Yig5Y676K+l5Zu+XG5cbiAgICAgIHZhciBjb25kaXRpb24gPSBkaXJlY3RlZCA/IGNhbmRpZGF0ZU5vZGVNYXBbY2FuZGlkYXRlLmlkXS5kZWdyZWUgPCBwYXR0ZXJuTm9kZU1hcFtiZWdpblBOb2RlLmlkXS5kZWdyZWUgfHwgY2FuZGlkYXRlTm9kZU1hcFtjYW5kaWRhdGUuaWRdLmluRGVncmVlIDwgcGF0dGVybk5vZGVNYXBbYmVnaW5QTm9kZS5pZF0uaW5EZWdyZWUgfHwgY2FuZGlkYXRlTm9kZU1hcFtjYW5kaWRhdGUuaWRdLm91dERlZ3JlZSA8IHBhdHRlcm5Ob2RlTWFwW2JlZ2luUE5vZGUuaWRdLm91dERlZ3JlZSA6IGNhbmRpZGF0ZU5vZGVNYXBbY2FuZGlkYXRlLmlkXS5kZWdyZWUgPCBwYXR0ZXJuTm9kZU1hcFtiZWdpblBOb2RlLmlkXS5kZWdyZWU7XG5cbiAgICAgIGlmIChjb25kaXRpb24pIHtcbiAgICAgICAgY2FuZGlkYXRlR3JhcGhJbnZhbGlkID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9IC8vIGNhbmRpZGF0ZSBsYWJlbCDkuKrmlbDkuI3otrPvvIzliKDljrvor6Xlm75cblxuXG4gICAgICBpZiAoY2FuZGlkYXRlTm9kZUxhYmVsQ291bnRNYXBbY2FuZGlkYXRlW25vZGVMYWJlbFByb3BdXSA8IHBhdHRlcm5Ob2RlTGFiZWxNYXBbY2FuZGlkYXRlW25vZGVMYWJlbFByb3BdXS5sZW5ndGgpIHtcbiAgICAgICAgY2FuZGlkYXRlR3JhcGhJbnZhbGlkID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9IC8vIHBydW5lNu+8muWOu+mZpOW6puaVsOi/h+Wwj+eahOiKgueCuVxuXG5cbiAgICAgIHZhciBjdXJyZW50Q2FuZGlkYXRlTm9kZU51bSA9IGNhbmRpZGF0ZUdyYXBoLm5vZGVzLmxlbmd0aDtcblxuICAgICAgZm9yICh2YXIgbyA9IGN1cnJlbnRDYW5kaWRhdGVOb2RlTnVtIC0gMTsgbyA+PSAwOyBvLS0pIHtcbiAgICAgICAgdmFyIGNnTm9kZSA9IGNhbmRpZGF0ZUdyYXBoLm5vZGVzW29dO1xuICAgICAgICB2YXIgbm9kZURlZ3JlZSA9IGNhbmRpZGF0ZU5vZGVNYXBbY2dOb2RlLmlkXS5kZWdyZWU7XG4gICAgICAgIHZhciBub2RlSW5EZWdyZWUgPSBjYW5kaWRhdGVOb2RlTWFwW2NnTm9kZS5pZF0uaW5EZWdyZWU7XG4gICAgICAgIHZhciBub2RlT3V0RGVncmVlID0gY2FuZGlkYXRlTm9kZU1hcFtjZ05vZGUuaWRdLm91dERlZ3JlZTtcbiAgICAgICAgdmFyIGNOb2RlTGFiZWwgPSBjZ05vZGVbbm9kZUxhYmVsUHJvcF07XG5cbiAgICAgICAgdmFyIF9kID0gc3Rhc2hQYXR0ZXJuTm9kZUxhYmVsRGVncmVlTWFwKG1pblBhdHRlcm5Ob2RlTGFiZWxEZWdyZWVNYXAsIGNOb2RlTGFiZWwsIHBhdHRlcm5Ob2RlTWFwLCBwYXR0ZXJuTm9kZUxhYmVsTWFwKSxcbiAgICAgICAgICAgIG1pblBhdHRlcm5Ob2RlTGFiZWxEZWdyZWUgPSBfZC5taW5QYXR0ZXJuTm9kZUxhYmVsRGVncmVlLFxuICAgICAgICAgICAgbWluUGF0dGVybk5vZGVMYWJlbEluRGVncmVlID0gX2QubWluUGF0dGVybk5vZGVMYWJlbEluRGVncmVlLFxuICAgICAgICAgICAgbWluUGF0dGVybk5vZGVMYWJlbE91dERlZ3JlZSA9IF9kLm1pblBhdHRlcm5Ob2RlTGFiZWxPdXREZWdyZWU7XG5cbiAgICAgICAgdmFyIGRlbGV0ZUNvbmRpdGlvbiA9IGRpcmVjdGVkID8gbm9kZURlZ3JlZSA8IG1pblBhdHRlcm5Ob2RlTGFiZWxEZWdyZWUgfHwgbm9kZUluRGVncmVlIDwgbWluUGF0dGVybk5vZGVMYWJlbEluRGVncmVlIHx8IG5vZGVPdXREZWdyZWUgPCBtaW5QYXR0ZXJuTm9kZUxhYmVsT3V0RGVncmVlIDogbm9kZURlZ3JlZSA8IG1pblBhdHRlcm5Ob2RlTGFiZWxEZWdyZWU7XG5cbiAgICAgICAgaWYgKGRlbGV0ZUNvbmRpdGlvbikge1xuICAgICAgICAgIGNhbmRpZGF0ZU5vZGVMYWJlbENvdW50TWFwW2NnTm9kZVtub2RlTGFiZWxQcm9wXV0tLTsgLy8g6IqC54K5IGxhYmVsIOS4quaVsOS4jei2s1xuXG4gICAgICAgICAgaWYgKGNhbmRpZGF0ZU5vZGVMYWJlbENvdW50TWFwW2NnTm9kZVtub2RlTGFiZWxQcm9wXV0gPCBwYXR0ZXJuTm9kZUxhYmVsTWFwW2NnTm9kZVtub2RlTGFiZWxQcm9wXV0ubGVuZ3RoKSB7XG4gICAgICAgICAgICBjYW5kaWRhdGVHcmFwaEludmFsaWQgPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY2FuZGlkYXRlR3JhcGgubm9kZXMuc3BsaWNlKG8sIDEpO1xuICAgICAgICAgIGNhbmRpZGF0ZU5vZGVNYXBbY2dOb2RlLmlkXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBkZWdyZWVDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoY2FuZGlkYXRlR3JhcGhJbnZhbGlkIHx8ICFkZWdyZWVDaGFuZ2VkICYmIGxvb3BDb3VudCAhPT0gMCkgYnJlYWs7IC8vIOe7j+i/hyBwcnVuZTUg6IqC54K56KOB5Ymq77yM5Yig5Y6756uv54K55bey57uP5LiN5ZyoIGNhbmRpZGF0ZUdyYXBoIOS4reeahOi+uVxuXG4gICAgICBjYW5kaWRhdGVFZGdlTnVtID0gY2FuZGlkYXRlRWRnZXMubGVuZ3RoO1xuXG4gICAgICBmb3IgKHZhciB5ID0gY2FuZGlkYXRlRWRnZU51bSAtIDE7IHkgPj0gMDsgeS0tKSB7XG4gICAgICAgIHZhciBjZWRnZSA9IGNhbmRpZGF0ZUVkZ2VzW3ldO1xuXG4gICAgICAgIGlmICghY2FuZGlkYXRlTm9kZU1hcFtjZWRnZS5zb3VyY2VdIHx8ICFjYW5kaWRhdGVOb2RlTWFwW2NlZGdlLnRhcmdldF0pIHtcbiAgICAgICAgICBjYW5kaWRhdGVFZGdlcy5zcGxpY2UoeSwgMSk7XG4gICAgICAgICAgdmFyIGVkZ2VMYWJlbCA9IGNlZGdlW2VkZ2VMYWJlbFByb3BdO1xuICAgICAgICAgIGVkZ2VMYWJlbENvdW50TWFwW2VkZ2VMYWJlbF0tLTtcblxuICAgICAgICAgIGlmIChjYW5kaWRhdGVOb2RlTWFwW2NlZGdlLnNvdXJjZV0pIHtcbiAgICAgICAgICAgIGNhbmRpZGF0ZU5vZGVNYXBbY2VkZ2Uuc291cmNlXS5kZWdyZWUtLTtcbiAgICAgICAgICAgIGNhbmRpZGF0ZU5vZGVNYXBbY2VkZ2Uuc291cmNlXS5vdXREZWdyZWUtLTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoY2FuZGlkYXRlTm9kZU1hcFtjZWRnZS50YXJnZXRdKSB7XG4gICAgICAgICAgICBjYW5kaWRhdGVOb2RlTWFwW2NlZGdlLnRhcmdldF0uZGVncmVlLS07XG4gICAgICAgICAgICBjYW5kaWRhdGVOb2RlTWFwW2NlZGdlLnRhcmdldF0uaW5EZWdyZWUtLTtcbiAgICAgICAgICB9IC8vIOi+uSBsYWJlbCDmlbDph4/kuI3otrNcblxuXG4gICAgICAgICAgaWYgKHBhdHRlcm5FZGdlTGFiZWxNYXBbZWRnZUxhYmVsXSAmJiBlZGdlTGFiZWxDb3VudE1hcFtlZGdlTGFiZWxdIDwgcGF0dGVybkVkZ2VMYWJlbE1hcFtlZGdlTGFiZWxdLmxlbmd0aCkge1xuICAgICAgICAgICAgY2FuZGlkYXRlR3JhcGhJbnZhbGlkID0gdHJ1ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGRlZ3JlZUNoYW5nZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGxvb3BDb3VudCsrO1xuICAgIH1cblxuICAgIGlmIChjYW5kaWRhdGVHcmFwaEludmFsaWQpIHtcbiAgICAgIGNhbmRpZGF0ZUdyYXBocy5zcGxpY2UoaSwgMSk7XG4gICAgICByZXR1cm4gXCJjb250aW51ZVwiO1xuICAgIH0gLy8gcHJ1bmU6IOiLpeiKgueCuS/ovrnmlbDov4flsJHvvIzoioLngrkv6L65IGxhYmVsIOi/h+Wwke+8jOWOu+aOiei/meS4quWbvlxuXG5cbiAgICBpZiAoY2FuZGlkYXRlR3JhcGhJbnZhbGlkIHx8IGNhbmRpZGF0ZUdyYXBoLm5vZGVzLmxlbmd0aCA8IHBhdHRlcm4ubm9kZXMubGVuZ3RoIHx8IGNhbmRpZGF0ZUVkZ2VzLmxlbmd0aCA8IHBhdHRlcm4uZWRnZXMubGVuZ3RoKSB7XG4gICAgICBjYW5kaWRhdGVHcmFwaHMuc3BsaWNlKGksIDEpO1xuICAgICAgcmV0dXJuIFwiY29udGludWVcIjtcbiAgICB9XG4gIH07XG5cbiAgZm9yICh2YXIgaSA9IGNhbmRpZGF0ZUdyYXBoTnVtIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICB2YXIgc3RhdGVfMSA9IF9sb29wXzIoaSk7XG5cbiAgICBpZiAoc3RhdGVfMSA9PT0gXCJicmVha1wiKSBicmVhaztcbiAgfSAvLyDmraTml7blt7Lnu4/nlJ/miJDnmoTlpJrkuKogY2FuZGlkYXRlR3JhcGhz77yM5Y+v6IO95pyJ6YeN5aSNXG4gIC8vIGNvbnNvbGUubG9nKFxuICAvLyAgIFwiLS0tLS0gc3RhZ2U1OiBnb2luZyB0byBzcGxpY2UgZHVscGxpY2F0ZWQgY2FuZGlkYXRlIGdyYXBocyAtLS0tLS0tXCJcbiAgLy8gKTtcbiAgLy8g5Yig5Y67IGNhbmRpZGF0ZUdyYXBocyDkuK3kuIDmqKHkuIDmoLfnmoTlrZDlm77vvIzpgJrov4fovrnnmoQgbm9kZS1ub2RlLWVkZ2VMYWJlbCDkvZzkuLoga2V577yM6L+Z57G76L655Liq5pWw5L2c5Li6IHZhbHVl77yM6L+b6KGM5Yy56YWNXG5cblxuICB2YXIgY3VycmVudExlbmd0aCA9IGNhbmRpZGF0ZUdyYXBocy5sZW5ndGg7XG5cbiAgdmFyIF9sb29wXzMgPSBmdW5jdGlvbiBfbG9vcF8zKGkpIHtcbiAgICB2YXIgY2cxID0gY2FuZGlkYXRlR3JhcGhzW2ldO1xuICAgIHZhciBjZzFFZGdlTWFwID0ge307IC8vIFtub2RlMS5pZC1ub2RlMi5pZC1lZGdlLmxhYmVsXTogY291bnRcblxuICAgIGNnMS5lZGdlcy5mb3JFYWNoKGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgICB2YXIga2V5ID0gZWRnZS5zb3VyY2UgKyBcIi1cIiArIGVkZ2UudGFyZ2V0ICsgXCItXCIgKyBlZGdlLmxhYmVsO1xuICAgICAgaWYgKCFjZzFFZGdlTWFwW2tleV0pIGNnMUVkZ2VNYXBba2V5XSA9IDE7ZWxzZSBjZzFFZGdlTWFwW2tleV0rKztcbiAgICB9KTtcblxuICAgIHZhciBfbG9vcF82ID0gZnVuY3Rpb24gX2xvb3BfNihqKSB7XG4gICAgICB2YXIgY2cyID0gY2FuZGlkYXRlR3JhcGhzW2pdO1xuICAgICAgdmFyIGNnMkVkZ2VNYXAgPSB7fTsgLy8gW25vZGUxLmlkLW5vZGUyLmlkLWVkZ2UubGFiZWxdOiBjb3VudFxuXG4gICAgICBjZzIuZWRnZXMuZm9yRWFjaChmdW5jdGlvbiAoZWRnZSkge1xuICAgICAgICB2YXIga2V5ID0gZWRnZS5zb3VyY2UgKyBcIi1cIiArIGVkZ2UudGFyZ2V0ICsgXCItXCIgKyBlZGdlLmxhYmVsO1xuICAgICAgICBpZiAoIWNnMkVkZ2VNYXBba2V5XSkgY2cyRWRnZU1hcFtrZXldID0gMTtlbHNlIGNnMkVkZ2VNYXBba2V5XSsrO1xuICAgICAgfSk7XG4gICAgICB2YXIgc2FtZSA9IHRydWU7XG5cbiAgICAgIGlmIChPYmplY3Qua2V5cyhjZzJFZGdlTWFwKS5sZW5ndGggIT09IE9iamVjdC5rZXlzKGNnMUVkZ2VNYXApLmxlbmd0aCkge1xuICAgICAgICBzYW1lID0gZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBPYmplY3Qua2V5cyhjZzFFZGdlTWFwKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICBpZiAoY2cyRWRnZU1hcFtrZXldICE9PSBjZzFFZGdlTWFwW2tleV0pIHNhbWUgPSBmYWxzZTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChzYW1lKSB7XG4gICAgICAgIGNhbmRpZGF0ZUdyYXBocy5zcGxpY2UoaiwgMSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGZvciAodmFyIGogPSBjdXJyZW50TGVuZ3RoIC0gMTsgaiA+IGk7IGotLSkge1xuICAgICAgX2xvb3BfNihqKTtcbiAgICB9XG5cbiAgICBjdXJyZW50TGVuZ3RoID0gY2FuZGlkYXRlR3JhcGhzLmxlbmd0aDtcbiAgfTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8PSBjdXJyZW50TGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgX2xvb3BfMyhpKTtcbiAgfVxuXG4gIHJldHVybiBjYW5kaWRhdGVHcmFwaHM7XG59O1xuXG52YXIgX2RlZmF1bHQgPSBHQURESTtcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0OyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///311\n')},function(module,exports,__webpack_require__){"use strict";eval('\n\nObject.defineProperty(exports, "__esModule", {\n value: true\n});\nexports.default = void 0;\n\nvar _util = __webpack_require__(0);\n\nvar _struct = __webpack_require__(313);\n\nvar DFSedge =\n/** @class */\nfunction () {\n function DFSedge(fromNode, toNode, fromNodeLabel, edgeLabel, toNodeLabel) {\n this.fromNode = fromNode;\n this.toNode = toNode;\n this.nodeEdgeNodeLabel = {\n nodeLabel1: fromNodeLabel || _struct.VACANT_NODE_LABEL,\n edgeLabel: edgeLabel || _struct.VACANT_EDGE_LABEL,\n nodeLabel2: toNodeLabel || _struct.VACANT_NODE_LABEL\n };\n }\n\n DFSedge.prototype.equalTo = function (other) {\n return this.fromNode === other.formNode && this.toNode === other.toNode && this.nodeEdgeNodeLabel === other.nodeEdgeNodeLabel;\n };\n\n DFSedge.prototype.notEqualTo = function (other) {\n return !this.equalTo(other);\n };\n\n return DFSedge;\n}(); // DFScode 是 DESedge 的数组\n\n\nvar DFScode =\n/** @class */\nfunction () {\n function DFScode() {\n this.rmpath = [];\n this.dfsEdgeList = [];\n }\n\n DFScode.prototype.equalTo = function (other) {\n var aLength = this.dfsEdgeList.length;\n var bLength = other.length;\n if (aLength !== bLength) return false;\n\n for (var i = 0; i < aLength; i++) {\n if (this.dfsEdgeList[i] !== other[i]) return false;\n }\n\n return true;\n };\n\n DFScode.prototype.notEqualTo = function (other) {\n return !this.equalTo(other);\n };\n /** 增加一条 edge 到 DFScode */\n\n\n DFScode.prototype.pushBack = function (fromNode, toNode, fromNodeLabel, edgeLabel, toNodeLabel) {\n this.dfsEdgeList.push(new DFSedge(fromNode, toNode, fromNodeLabel, edgeLabel, toNodeLabel));\n return this.dfsEdgeList;\n };\n /** 根据 dfs 构建图 */\n\n\n DFScode.prototype.toGraph = function (graphId, directed) {\n if (graphId === void 0) {\n graphId = _struct.VACANT_GRAPH_ID;\n }\n\n if (directed === void 0) {\n directed = false;\n }\n\n var graph = new _struct.Graph(graphId, true, directed);\n this.dfsEdgeList.forEach(function (dfsEdge) {\n var fromNodeId = dfsEdge.fromNode;\n var toNodeId = dfsEdge.toNode;\n var _a = dfsEdge.nodeEdgeNodeLabel,\n nodeLabel1 = _a.nodeLabel1,\n edgeLabel = _a.edgeLabel,\n nodeLabel2 = _a.nodeLabel2;\n if (nodeLabel1 !== _struct.VACANT_NODE_LABEL) graph.addNode(fromNodeId, nodeLabel1);\n if (nodeLabel2 !== _struct.VACANT_NODE_LABEL) graph.addNode(toNodeId, nodeLabel2);\n if (nodeLabel1 !== _struct.VACANT_NODE_LABEL && nodeLabel2 !== nodeLabel1) graph.addEdge(undefined, fromNodeId, toNodeId, edgeLabel);\n });\n return graph;\n }; // 建立 rightmost path\n\n\n DFScode.prototype.buildRmpath = function () {\n this.rmpath = [];\n var oldFrom = undefined;\n var selfLength = this.dfsEdgeList.length;\n\n for (var i = selfLength - 1; i >= 0; i--) {\n var dfsEdge = this.dfsEdgeList[i];\n var fromNodeIdx = dfsEdge.fromNode;\n var toNodeIdx = dfsEdge.toNode;\n\n if (fromNodeIdx < toNodeIdx && (oldFrom === undefined || toNodeIdx === oldFrom)) {\n this.rmpath.push(i);\n oldFrom = fromNodeIdx;\n }\n }\n\n return this.rmpath;\n };\n\n DFScode.prototype.getNodeNum = function () {\n var nodeMap = {};\n this.dfsEdgeList.forEach(function (dfsEdge) {\n if (!nodeMap[dfsEdge.fromNode]) nodeMap[dfsEdge.fromNode] = true;\n if (!nodeMap[dfsEdge.toNode]) nodeMap[dfsEdge.toNode] = true;\n });\n return Object.keys(nodeMap).length;\n };\n\n return DFScode;\n}();\n\nvar History =\n/** @class */\nfunction () {\n function History(pdfs) {\n this.his = {};\n this.nodesUsed = {};\n this.edgesUsed = {};\n this.edges = [];\n if (!pdfs) return;\n\n while (pdfs) {\n var e = pdfs.edge;\n this.edges.push(e);\n this.nodesUsed[e.from] = 1;\n this.nodesUsed[e.to] = 1;\n this.edgesUsed[e.id] = 1;\n pdfs = pdfs.preNode;\n } // 倒序\n\n\n this.edges = this.edges.reverse();\n }\n\n History.prototype.hasNode = function (node) {\n return this.nodesUsed[node.id] === 1;\n };\n\n History.prototype.hasEdge = function (edge) {\n return this.edgesUsed[edge.id] === 1;\n };\n\n return History;\n}();\n\nvar GSpan =\n/** @class */\nfunction () {\n function GSpan(_a) {\n var graphs = _a.graphs,\n _b = _a.minSupport,\n minSupport = _b === void 0 ? 2 : _b,\n _c = _a.minNodeNum,\n minNodeNum = _c === void 0 ? 1 : _c,\n _d = _a.maxNodeNum,\n maxNodeNum = _d === void 0 ? 4 : _d,\n _e = _a.top,\n top = _e === void 0 ? 10 : _e,\n _f = _a.directed,\n directed = _f === void 0 ? false : _f,\n _g = _a.verbose,\n verbose = _g === void 0 ? false : _g; // -------- 第零步,初始化-------\n\n this.graphs = graphs;\n this.dfsCode = new DFScode();\n this.support = 0;\n this.frequentSize1Subgraphs = [];\n this.frequentSubgraphs = [];\n this.minSupport = minSupport;\n this.top = top;\n this.directed = directed;\n this.counter = 0; // TODO? timestamp = {}\n\n this.maxNodeNum = maxNodeNum;\n this.minNodeNum = minNodeNum;\n this.verbose = verbose;\n if (this.maxNodeNum < this.minNodeNum) this.maxNodeNum = this.minNodeNum;\n this.reportDF = []; // matrix\n } // Line 352\n\n\n GSpan.prototype.findForwardRootEdges = function (graph, fromNode) {\n var _this = this;\n\n var result = [];\n var nodeMap = graph.nodeMap;\n fromNode.edges.forEach(function (edge) {\n if (_this.directed || fromNode.label <= nodeMap[edge.to].label) result.push(edge);\n });\n return result;\n };\n\n GSpan.prototype.findBackwardEdge = function (graph, edge1, edge2, history) {\n if (!this.directed && edge1 === edge2) return null;\n var nodeMap = graph.nodeMap;\n var edge2To = nodeMap[edge2.to];\n var edge2ToEdges = edge2To.edges;\n var edgeLength = edge2ToEdges.length;\n\n for (var i = 0; i < edgeLength; i++) {\n var edge = edge2ToEdges[i];\n if (history.hasEdge(edge) || edge.to !== edge1.from) continue;\n\n if (!this.directed) {\n if (edge1.label < edge.label || edge1.label === edge.label && nodeMap[edge1.to].label <= nodeMap[edge2.to].label) {\n return edge;\n }\n } else {\n if (nodeMap[edge1.from].label < nodeMap[edge2.to].label || nodeMap[edge1.from].label === nodeMap[edge2.to].label && edge1.label <= edge.label) {\n return edge;\n }\n }\n }\n\n return null;\n };\n\n GSpan.prototype.findForwardPureEdges = function (graph, rightmostEdge, minNodeLabel, history) {\n var result = [];\n var rightmostEdgeToId = rightmostEdge.to;\n var edges = graph.nodeMap[rightmostEdgeToId].edges;\n var edgeLength = edges.length;\n\n for (var i = 0; i < edgeLength; i++) {\n var edge = edges[i];\n var toNode = graph.nodeMap[edge.to];\n\n if (minNodeLabel <= toNode.label && !history.hasNode(toNode)) {\n result.push(edge);\n }\n }\n\n return result;\n };\n\n GSpan.prototype.findForwardRmpathEdges = function (graph, rightmostEdge, minNodeLabel, history) {\n var result = [];\n var nodeMap = graph.nodeMap;\n var toNodeLabel = nodeMap[rightmostEdge.to].label;\n var fromNode = nodeMap[rightmostEdge.from];\n var edges = fromNode.edges;\n var edgeLength = edges.length;\n\n for (var i = 0; i < edgeLength; i++) {\n var edge = edges[i];\n var newToNodeLabel = nodeMap[edge.to].label;\n\n if (rightmostEdge.to === edge.to || minNodeLabel > newToNodeLabel || history.hasNode(nodeMap[edge.to])) {\n continue;\n }\n\n if (rightmostEdge.label < edge.label || rightmostEdge.label === edge.label && toNodeLabel <= newToNodeLabel) {\n result.push(edge);\n }\n }\n\n return result;\n };\n\n GSpan.prototype.getSupport = function (projected) {\n var graphMap = {};\n projected.forEach(function (pro) {\n if (!graphMap[pro.graphId]) graphMap[pro.graphId] = true;\n });\n return Object.keys(graphMap).length;\n };\n\n GSpan.prototype.findMinLabel = function (obj) {\n var minLabel = undefined;\n Object.keys(obj).forEach(function (nodeEdgeNodeLabel) {\n var _a = obj[nodeEdgeNodeLabel],\n nodeLabel1 = _a.nodeLabel1,\n edgeLabel = _a.edgeLabel,\n nodeLabel2 = _a.nodeLabel2;\n\n if (!minLabel) {\n minLabel = {\n nodeLabel1: nodeLabel1,\n edgeLabel: edgeLabel,\n nodeLabel2: nodeLabel2\n };\n return;\n }\n\n if (nodeLabel1 < minLabel.nodeLabel1 || nodeLabel1 === minLabel.nodeLabel1 && edgeLabel < minLabel.edgeLabel || nodeLabel1 === minLabel.nodeLabel1 && edgeLabel === minLabel.edgeLabel && nodeLabel2 < minLabel.nodeLabel2) {\n minLabel = {\n nodeLabel1: nodeLabel1,\n edgeLabel: edgeLabel,\n nodeLabel2: nodeLabel2\n };\n }\n });\n return minLabel;\n };\n\n GSpan.prototype.isMin = function () {\n var _this = this;\n\n var dfsCode = this.dfsCode;\n if (this.verbose) console.log("isMin checking", dfsCode);\n if (dfsCode.dfsEdgeList.length === 1) return true;\n var directed = this.directed;\n var graph = dfsCode.toGraph(_struct.VACANT_GRAPH_ID, directed);\n var nodeMap = graph.nodeMap;\n var dfsCodeMin = new DFScode();\n var root = {};\n graph.nodes.forEach(function (node) {\n var forwardEdges = _this.findForwardRootEdges(graph, node);\n\n forwardEdges.forEach(function (edge) {\n var otherNode = nodeMap[edge.to];\n var nodeEdgeNodeLabel = node.label + "-" + edge.label + "-" + otherNode.label;\n if (!root[nodeEdgeNodeLabel]) root[nodeEdgeNodeLabel] = {\n projected: [],\n nodeLabel1: node.label,\n edgeLabel: edge.label,\n nodeLabel2: otherNode.label\n };\n var pdfs = {\n graphId: graph.id,\n edge: edge,\n preNode: null\n };\n root[nodeEdgeNodeLabel].projected.push(pdfs);\n });\n }); // 比较 root 中每一项的 nodeEdgeNodeLabel 大小,按照 nodeLabel1、edgeLabe、nodeLabel2 的顺序比较\n\n var minLabel = this.findMinLabel(root); // line 419\n\n if (!minLabel) return;\n dfsCodeMin.dfsEdgeList.push(new DFSedge(0, 1, minLabel.nodeLabel1, minLabel.edgeLabel, minLabel.nodeLabel2)); // line 423\n\n var projectIsMin = function projectIsMin(projected) {\n // right most path\n var rmpath = dfsCodeMin.buildRmpath();\n var minNodeLabel = dfsCodeMin.dfsEdgeList[0].nodeEdgeNodeLabel.nodeLabel1;\n var maxToC = dfsCodeMin.dfsEdgeList[rmpath[0]].toNode; // node id\n\n var backwardRoot = {};\n var flag = false,\n newTo = 0;\n var end = directed ? -1 : 0; // 遍历到 1 还是到 0\n\n var _loop_1 = function _loop_1(i) {\n if (flag) return "break"; // line 435\n\n projected.forEach(function (p) {\n var history = new History(p);\n\n var backwardEdge = _this.findBackwardEdge(graph, history.edges[rmpath[i]], history.edges[rmpath[0]], history);\n\n if (backwardEdge) {\n // Line 441\n if (!backwardRoot[backwardEdge.label]) {\n backwardRoot[backwardEdge.label] = {\n projected: [],\n edgeLabel: backwardEdge.label\n };\n }\n\n backwardRoot[backwardEdge.label].projected.push({\n graphId: graph.id,\n edge: backwardRoot,\n preNode: p\n });\n newTo = dfsCodeMin.dfsEdgeList[rmpath[i]].fromNode;\n flag = true;\n }\n });\n };\n\n for (var i = rmpath.length - 1; i > end; i--) {\n var state_1 = _loop_1(i);\n\n if (state_1 === "break") break;\n }\n\n if (flag) {\n var minBackwardEdgeLabel = _this.findMinLabel(backwardRoot);\n\n dfsCodeMin.dfsEdgeList.push(new DFSedge(maxToC, newTo, _struct.VACANT_NODE_LABEL, minBackwardEdgeLabel.edgeLabel, _struct.VACANT_NODE_LABEL));\n var idx_1 = dfsCodeMin.dfsEdgeList.length - 1;\n if (_this.dfsCode.dfsEdgeList[idx_1] !== dfsCodeMin.dfsEdgeList[idx_1]) return false;\n return projectIsMin(backwardRoot[minBackwardEdgeLabel.edgeLabel].projected);\n }\n\n var forwardRoot = {};\n flag = false;\n var newFrom = 0;\n projected.forEach(function (p) {\n var history = new History(p);\n\n var forwardPureEdges = _this.findForwardPureEdges(graph, history.edges[rmpath[0]], minNodeLabel, history);\n\n if (forwardPureEdges.length > 0) {\n flag = true;\n newFrom = maxToC;\n forwardPureEdges.forEach(function (edge) {\n var key = edge.label + "-" + nodeMap[edge.to].label;\n if (!forwardRoot[key]) forwardRoot[key] = {\n projected: [],\n edgeLabel: edge.label,\n nodeLabel2: nodeMap[edge.to].label\n };\n forwardRoot[key].projected.push({\n graphId: graph.id,\n edge: edge,\n preNode: p\n });\n });\n }\n });\n var pathLength = rmpath.length;\n\n var _loop_2 = function _loop_2(i) {\n if (flag) return "break";\n var value = rmpath[i];\n projected.forEach(function (p) {\n var history = new History(p);\n\n var forwardRmpathEdges = _this.findForwardRmpathEdges(graph, history.edges[value], minNodeLabel, history);\n\n if (forwardRmpathEdges.length > 0) {\n flag = true;\n newFrom = dfsCodeMin.dfsEdgeList[value].fromNode;\n forwardRmpathEdges.forEach(function (edge) {\n var key = edge.label + "-" + nodeMap[edge.to].label;\n if (!forwardRoot[key]) forwardRoot[key] = {\n projected: [],\n edgeLabel: edge.label,\n nodeLabel2: nodeMap[edge.to].label\n };\n forwardRoot[key].projected.push({\n graphId: graph.id,\n edge: edge,\n preNode: p\n });\n });\n }\n });\n };\n\n for (var i = 0; i < pathLength; i++) {\n var state_2 = _loop_2(i);\n\n if (state_2 === "break") break;\n }\n\n if (!flag) return true;\n\n var forwardMinEdgeNodeLabel = _this.findMinLabel(forwardRoot);\n\n dfsCodeMin.dfsEdgeList.push(new DFSedge(newFrom, maxToC + 1, _struct.VACANT_NODE_LABEL, forwardMinEdgeNodeLabel.edgeLabel, forwardMinEdgeNodeLabel.nodeLabel2));\n var idx = dfsCodeMin.dfsEdgeList.length - 1;\n if (dfsCode.dfsEdgeList[idx] !== dfsCodeMin.dfsEdgeList[idx]) return false;\n return projectIsMin(forwardRoot[forwardMinEdgeNodeLabel.edgeLabel + "-" + forwardMinEdgeNodeLabel.nodeLabel2].projected);\n };\n\n var key = minLabel.nodeLabel1 + "-" + minLabel.edgeLabel + "-" + minLabel.nodeLabel2;\n return projectIsMin(root[key].projected);\n };\n\n GSpan.prototype.report = function () {\n if (this.dfsCode.getNodeNum() < this.minNodeNum) return;\n this.counter++;\n var graph = this.dfsCode.toGraph(this.counter, this.directed);\n this.frequentSubgraphs.push((0, _util.clone)(graph));\n };\n\n GSpan.prototype.subGraphMining = function (projected) {\n var _this = this;\n\n var support = this.getSupport(projected);\n if (support < this.minSupport) return;\n if (!this.isMin()) return;\n this.report();\n var nodeNum = this.dfsCode.getNodeNum();\n var rmpath = this.dfsCode.buildRmpath();\n var maxToC = this.dfsCode.dfsEdgeList[rmpath[0]].toNode;\n var minNodeLabel = this.dfsCode.dfsEdgeList[0].nodeEdgeNodeLabel.nodeLabel1;\n var forwardRoot = {};\n var backwardRoot = {};\n projected.forEach(function (p) {\n var graph = _this.graphs[p.graphId];\n var nodeMap = graph.nodeMap;\n var history = new History(p); // backward Line 526\n\n for (var i = rmpath.length - 1; i >= 0; i--) {\n var backwardEdge = _this.findBackwardEdge(graph, history.edges[rmpath[i]], history.edges[rmpath[0]], history);\n\n if (backwardEdge) {\n var key = _this.dfsCode.dfsEdgeList[rmpath[i]].fromNode + "-" + backwardEdge.label;\n if (!backwardRoot[key]) backwardRoot[key] = {\n projected: [],\n toNodeId: _this.dfsCode.dfsEdgeList[rmpath[i]].fromNode,\n edgeLabel: backwardEdge.label\n };\n backwardRoot[key].projected.push({\n graphId: p.graphId,\n edge: backwardEdge,\n preNode: p\n });\n }\n } // pure forward\n\n\n if (nodeNum >= _this.maxNodeNum) return;\n\n var forwardPureEdges = _this.findForwardPureEdges(graph, history.edges[rmpath[0]], minNodeLabel, history);\n\n forwardPureEdges.forEach(function (edge) {\n var key = maxToC + "-" + edge.label + "-" + nodeMap[edge.to].label;\n if (!forwardRoot[key]) forwardRoot[key] = {\n projected: [],\n fromNodeId: maxToC,\n edgeLabel: edge.label,\n nodeLabel2: nodeMap[edge.to].label\n };\n forwardRoot[key].projected.push({\n graphId: p.graphId,\n edge: edge,\n preNode: p\n });\n });\n\n var _loop_3 = function _loop_3(i) {\n var forwardRmpathEdges = _this.findForwardRmpathEdges(graph, history.edges[rmpath[i]], minNodeLabel, history);\n\n forwardRmpathEdges.forEach(function (edge) {\n var key = _this.dfsCode.dfsEdgeList[rmpath[i]].fromNode + "-" + edge.label + "-" + nodeMap[edge.to].label;\n if (!forwardRoot[key]) forwardRoot[key] = {\n projected: [],\n fromNodeId: _this.dfsCode.dfsEdgeList[rmpath[i]].fromNode,\n edgeLabel: edge.label,\n nodeLabel2: nodeMap[edge.to].label\n };\n forwardRoot[key].projected.push({\n graphId: p.graphId,\n edge: edge,\n preNode: p\n });\n });\n }; // rmpath forward\n\n\n for (var i = 0; i < rmpath.length; i++) {\n _loop_3(i);\n }\n }); // backward\n\n Object.keys(backwardRoot).forEach(function (key) {\n var _a = backwardRoot[key],\n toNodeId = _a.toNodeId,\n edgeLabel = _a.edgeLabel;\n\n _this.dfsCode.dfsEdgeList.push(new DFSedge(maxToC, toNodeId, "-1", edgeLabel, "-1"));\n\n _this.subGraphMining(backwardRoot[key].projected);\n\n _this.dfsCode.dfsEdgeList.pop();\n }); // forward\n\n Object.keys(forwardRoot).forEach(function (key) {\n var _a = forwardRoot[key],\n fromNodeId = _a.fromNodeId,\n edgeLabel = _a.edgeLabel,\n nodeLabel2 = _a.nodeLabel2;\n\n _this.dfsCode.dfsEdgeList.push(new DFSedge(fromNodeId, maxToC + 1, _struct.VACANT_NODE_LABEL, edgeLabel, nodeLabel2));\n\n _this.subGraphMining(forwardRoot[key].projected);\n\n _this.dfsCode.dfsEdgeList.pop();\n });\n };\n\n GSpan.prototype.generate1EdgeFrequentSubGraphs = function () {\n var graphs = this.graphs;\n var directed = this.directed;\n var minSupport = this.minSupport;\n var frequentSize1Subgraphs = this.frequentSize1Subgraphs;\n var nodeLabelCounter = {},\n nodeEdgeNodeCounter = {}; // 保存各个图和各自节点的关系 map,key 格式为 graphKey-node类型\n\n var nodeLableCounted = {}; // 保存各个图和各自边的关系 map,key 格式为 graphKey-fromNode类型-edge类型-toNode类型\n\n var nodeEdgeNodeLabelCounted = {};\n Object.keys(graphs).forEach(function (key) {\n // Line 271\n var graph = graphs[key];\n var nodeMap = graph.nodeMap; // 遍历节点,记录对应图 与 每个节点的 label 到 nodeLableCounted\n\n graph.nodes.forEach(function (node, i) {\n // Line 272\n var nodeLabel = node.label;\n var graphNodeKey = key + "-" + nodeLabel;\n\n if (!nodeLableCounted[graphNodeKey]) {\n var counter = nodeLabelCounter[nodeLabel] || 0;\n counter++;\n nodeLabelCounter[nodeLabel] = counter;\n }\n\n nodeLableCounted[graphNodeKey] = {\n graphKey: key,\n label: nodeLabel\n }; // 遍历该节点的所有边,记录各个图和各自边的关系到 nodeEdgeNodeLabelCounted. Line 276\n\n node.edges.forEach(function (edge) {\n var nodeLabel1 = nodeLabel;\n var nodeLabel2 = nodeMap[edge.to].label;\n\n if (!directed && nodeLabel1 > nodeLabel2) {\n var tmp = nodeLabel2;\n nodeLabel2 = nodeLabel1;\n nodeLabel1 = tmp;\n }\n\n var edgeLabel = edge.label;\n var graphNodeEdgeNodeKey = key + "-" + nodeLabel1 + "-" + edgeLabel + "-" + nodeLabel2;\n var nodeEdgeNodeKey = nodeLabel1 + "-" + edgeLabel + "-" + nodeLabel2;\n\n if (!nodeEdgeNodeCounter[nodeEdgeNodeKey]) {\n var counter = nodeEdgeNodeCounter[nodeEdgeNodeKey] || 0;\n counter++;\n nodeEdgeNodeCounter[nodeEdgeNodeKey] = counter; // Line281\n }\n\n nodeEdgeNodeLabelCounted[graphNodeEdgeNodeKey] = {\n graphId: key,\n nodeLabel1: nodeLabel1,\n edgeLabel: edgeLabel,\n nodeLabel2: nodeLabel2\n };\n });\n });\n }); // 计算频繁的节点\n\n Object.keys(nodeLabelCounter).forEach(function (label) {\n var count = nodeLabelCounter[label];\n if (count < minSupport) return;\n var g = {\n nodes: [],\n edges: []\n };\n g.nodes.push({\n id: "0",\n label: label\n });\n frequentSize1Subgraphs.push(g); // if (minNodeNum <= 1) reportSize1 TODO\n });\n return frequentSize1Subgraphs;\n };\n\n GSpan.prototype.run = function () {\n var _this = this; // -------- 第一步, _generate_1edge_frequent_subgraphs:频繁的单个节点-------\n\n\n this.frequentSize1Subgraphs = this.generate1EdgeFrequentSubGraphs();\n if (this.maxNodeNum < 2) return;\n var graphs = this.graphs;\n var directed = this.directed; // PDFS 数组的 map Line 304\n\n var root = {};\n Object.keys(graphs).forEach(function (graphId) {\n var graph = graphs[graphId];\n var nodeMap = graph.nodeMap; // Line 306\n\n graph.nodes.forEach(function (node) {\n var forwardRootEdges = _this.findForwardRootEdges(graph, node); // Line 308\n\n\n forwardRootEdges.forEach(function (edge) {\n var toNode = nodeMap[edge.to];\n var nodeEdgeNodeLabel = node.label + "-" + edge.label + "-" + toNode.label;\n if (!root[nodeEdgeNodeLabel]) root[nodeEdgeNodeLabel] = {\n projected: [],\n nodeLabel1: node.label,\n edgeLabel: edge.label,\n nodeLabel2: toNode.label\n };\n var pdfs = {\n graphId: graphId,\n edge: edge,\n preNode: null\n };\n root[nodeEdgeNodeLabel].projected.push(pdfs);\n });\n });\n }); // Line 313\n\n Object.keys(root).forEach(function (nodeEdgeNodeLabel) {\n var _a = root[nodeEdgeNodeLabel],\n projected = _a.projected,\n nodeLabel1 = _a.nodeLabel1,\n edgeLabel = _a.edgeLabel,\n nodeLabel2 = _a.nodeLabel2;\n\n _this.dfsCode.dfsEdgeList.push(new DFSedge(0, 1, nodeLabel1, edgeLabel, nodeLabel2));\n\n _this.subGraphMining(projected);\n\n _this.dfsCode.dfsEdgeList.pop();\n });\n };\n\n return GSpan;\n}();\n\nvar formatGraphs = function formatGraphs(graphs, directed, nodeLabelProp, edgeLabelProp) {\n var result = {};\n Object.keys(graphs).forEach(function (key, i) {\n var graph = graphs[key];\n var fGraph = new _struct.Graph(i, true, directed);\n var nodeIdxMap = {};\n graph.nodes.forEach(function (node, j) {\n fGraph.addNode(j, node[nodeLabelProp]);\n nodeIdxMap[node.id] = j;\n });\n graph.edges.forEach(function (edge, k) {\n var sourceIdx = nodeIdxMap[edge.source];\n var targetIdx = nodeIdxMap[edge.target];\n fGraph.addEdge(-1, sourceIdx, targetIdx, edge[edgeLabelProp]);\n });\n if (fGraph && fGraph.getNodeNum()) result[fGraph.id] = fGraph;\n });\n return result;\n};\n\nvar toGraphDatas = function toGraphDatas(graphs, nodeLabelProp, edgeLabelProp) {\n var result = [];\n graphs.forEach(function (graph) {\n var graphData = {\n nodes: [],\n edges: []\n };\n graph.nodes.forEach(function (node) {\n var _a;\n\n graphData.nodes.push((_a = {\n id: "" + node.id\n }, _a[nodeLabelProp] = node.label, _a));\n });\n graph.edges.forEach(function (edge) {\n var _a;\n\n graphData.edges.push((_a = {\n source: "" + edge.from,\n target: "" + edge.to\n }, _a[edgeLabelProp] = edge.label, _a));\n });\n result.push(graphData);\n });\n return result;\n};\n\nvar DEFAULT_LABEL_NAME = "cluster";\n/**\n * gSpan 频繁子图计算算法(frequent graph mining)\n * @param params 参数\n */\n\nvar gSpan = function gSpan(params) {\n // ------- 将图数据 GraphData 的 map 转换为格式 -------\n var graphs = params.graphs,\n _a = params.directed,\n directed = _a === void 0 ? false : _a,\n _b = params.nodeLabelProp,\n nodeLabelProp = _b === void 0 ? DEFAULT_LABEL_NAME : _b,\n _c = params.edgeLabelProp,\n edgeLabelProp = _c === void 0 ? DEFAULT_LABEL_NAME : _c;\n var formattedGraphs = formatGraphs(graphs, directed, nodeLabelProp, edgeLabelProp);\n var minSupport = params.minSupport,\n maxNodeNum = params.maxNodeNum,\n minNodeNum = params.minNodeNum,\n verbose = params.verbose,\n top = params.top; // ------- 初始化与执行算法 -------\n\n var algoParams = {\n graphs: formattedGraphs,\n minSupport: minSupport,\n maxNodeNum: maxNodeNum,\n minNodeNum: minNodeNum,\n top: top,\n verbose: verbose,\n directed: directed\n };\n var calculator = new GSpan(algoParams);\n calculator.run();\n var result = toGraphDatas(calculator.frequentSubgraphs, nodeLabelProp, edgeLabelProp);\n return result;\n};\n\nvar _default = gSpan;\nexports.default = _default;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvYWxnb3JpdGhtL2xpYi9nU3Bhbi9nU3Bhbi5qcz9hZGE1Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFhOztBQUViO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7O0FBRUEsWUFBWSxtQkFBTyxDQUFDLENBQVk7O0FBRWhDLGNBQWMsbUJBQU8sQ0FBQyxHQUFVOztBQUVoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLENBQUMsR0FBRzs7O0FBR0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsbUJBQW1CLGFBQWE7QUFDaEM7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLElBQUk7OztBQUdKO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGdDQUFnQyxRQUFRO0FBQ3hDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOzs7QUFHTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDOztBQUVEO0FBQ0E7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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1AsS0FBSyxFQUFFOztBQUVQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1Qjs7QUFFdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBIiwiZmlsZSI6IjMxMi5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgX3V0aWwgPSByZXF1aXJlKFwiQGFudHYvdXRpbFwiKTtcblxudmFyIF9zdHJ1Y3QgPSByZXF1aXJlKFwiLi9zdHJ1Y3RcIik7XG5cbnZhciBERlNlZGdlID1cbi8qKiBAY2xhc3MgKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gREZTZWRnZShmcm9tTm9kZSwgdG9Ob2RlLCBmcm9tTm9kZUxhYmVsLCBlZGdlTGFiZWwsIHRvTm9kZUxhYmVsKSB7XG4gICAgdGhpcy5mcm9tTm9kZSA9IGZyb21Ob2RlO1xuICAgIHRoaXMudG9Ob2RlID0gdG9Ob2RlO1xuICAgIHRoaXMubm9kZUVkZ2VOb2RlTGFiZWwgPSB7XG4gICAgICBub2RlTGFiZWwxOiBmcm9tTm9kZUxhYmVsIHx8IF9zdHJ1Y3QuVkFDQU5UX05PREVfTEFCRUwsXG4gICAgICBlZGdlTGFiZWw6IGVkZ2VMYWJlbCB8fCBfc3RydWN0LlZBQ0FOVF9FREdFX0xBQkVMLFxuICAgICAgbm9kZUxhYmVsMjogdG9Ob2RlTGFiZWwgfHwgX3N0cnVjdC5WQUNBTlRfTk9ERV9MQUJFTFxuICAgIH07XG4gIH1cblxuICBERlNlZGdlLnByb3RvdHlwZS5lcXVhbFRvID0gZnVuY3Rpb24gKG90aGVyKSB7XG4gICAgcmV0dXJuIHRoaXMuZnJvbU5vZGUgPT09IG90aGVyLmZvcm1Ob2RlICYmIHRoaXMudG9Ob2RlID09PSBvdGhlci50b05vZGUgJiYgdGhpcy5ub2RlRWRnZU5vZGVMYWJlbCA9PT0gb3RoZXIubm9kZUVkZ2VOb2RlTGFiZWw7XG4gIH07XG5cbiAgREZTZWRnZS5wcm90b3R5cGUubm90RXF1YWxUbyA9IGZ1bmN0aW9uIChvdGhlcikge1xuICAgIHJldHVybiAhdGhpcy5lcXVhbFRvKG90aGVyKTtcbiAgfTtcblxuICByZXR1cm4gREZTZWRnZTtcbn0oKTsgLy8gREZTY29kZSDmmK8gREVTZWRnZSDnmoTmlbDnu4RcblxuXG52YXIgREZTY29kZSA9XG4vKiogQGNsYXNzICovXG5mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIERGU2NvZGUoKSB7XG4gICAgdGhpcy5ybXBhdGggPSBbXTtcbiAgICB0aGlzLmRmc0VkZ2VMaXN0ID0gW107XG4gIH1cblxuICBERlNjb2RlLnByb3RvdHlwZS5lcXVhbFRvID0gZnVuY3Rpb24gKG90aGVyKSB7XG4gICAgdmFyIGFMZW5ndGggPSB0aGlzLmRmc0VkZ2VMaXN0Lmxlbmd0aDtcbiAgICB2YXIgYkxlbmd0aCA9IG90aGVyLmxlbmd0aDtcbiAgICBpZiAoYUxlbmd0aCAhPT0gYkxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhTGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLmRmc0VkZ2VMaXN0W2ldICE9PSBvdGhlcltpXSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9O1xuXG4gIERGU2NvZGUucHJvdG90eXBlLm5vdEVxdWFsVG8gPSBmdW5jdGlvbiAob3RoZXIpIHtcbiAgICByZXR1cm4gIXRoaXMuZXF1YWxUbyhvdGhlcik7XG4gIH07XG4gIC8qKiDlop7liqDkuIDmnaEgZWRnZSDliLAgREZTY29kZSAqL1xuXG5cbiAgREZTY29kZS5wcm90b3R5cGUucHVzaEJhY2sgPSBmdW5jdGlvbiAoZnJvbU5vZGUsIHRvTm9kZSwgZnJvbU5vZGVMYWJlbCwgZWRnZUxhYmVsLCB0b05vZGVMYWJlbCkge1xuICAgIHRoaXMuZGZzRWRnZUxpc3QucHVzaChuZXcgREZTZWRnZShmcm9tTm9kZSwgdG9Ob2RlLCBmcm9tTm9kZUxhYmVsLCBlZGdlTGFiZWwsIHRvTm9kZUxhYmVsKSk7XG4gICAgcmV0dXJuIHRoaXMuZGZzRWRnZUxpc3Q7XG4gIH07XG4gIC8qKiDmoLnmja4gZGZzIOaehOW7uuWbviAqL1xuXG5cbiAgREZTY29kZS5wcm90b3R5cGUudG9HcmFwaCA9IGZ1bmN0aW9uIChncmFwaElkLCBkaXJlY3RlZCkge1xuICAgIGlmIChncmFwaElkID09PSB2b2lkIDApIHtcbiAgICAgIGdyYXBoSWQgPSBfc3RydWN0LlZBQ0FOVF9HUkFQSF9JRDtcbiAgICB9XG5cbiAgICBpZiAoZGlyZWN0ZWQgPT09IHZvaWQgMCkge1xuICAgICAgZGlyZWN0ZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICB2YXIgZ3JhcGggPSBuZXcgX3N0cnVjdC5HcmFwaChncmFwaElkLCB0cnVlLCBkaXJlY3RlZCk7XG4gICAgdGhpcy5kZnNFZGdlTGlzdC5mb3JFYWNoKGZ1bmN0aW9uIChkZnNFZGdlKSB7XG4gICAgICB2YXIgZnJvbU5vZGVJZCA9IGRmc0VkZ2UuZnJvbU5vZGU7XG4gICAgICB2YXIgdG9Ob2RlSWQgPSBkZnNFZGdlLnRvTm9kZTtcbiAgICAgIHZhciBfYSA9IGRmc0VkZ2Uubm9kZUVkZ2VOb2RlTGFiZWwsXG4gICAgICAgICAgbm9kZUxhYmVsMSA9IF9hLm5vZGVMYWJlbDEsXG4gICAgICAgICAgZWRnZUxhYmVsID0gX2EuZWRnZUxhYmVsLFxuICAgICAgICAgIG5vZGVMYWJlbDIgPSBfYS5ub2RlTGFiZWwyO1xuICAgICAgaWYgKG5vZGVMYWJlbDEgIT09IF9zdHJ1Y3QuVkFDQU5UX05PREVfTEFCRUwpIGdyYXBoLmFkZE5vZGUoZnJvbU5vZGVJZCwgbm9kZUxhYmVsMSk7XG4gICAgICBpZiAobm9kZUxhYmVsMiAhPT0gX3N0cnVjdC5WQUNBTlRfTk9ERV9MQUJFTCkgZ3JhcGguYWRkTm9kZSh0b05vZGVJZCwgbm9kZUxhYmVsMik7XG4gICAgICBpZiAobm9kZUxhYmVsMSAhPT0gX3N0cnVjdC5WQUNBTlRfTk9ERV9MQUJFTCAmJiBub2RlTGFiZWwyICE9PSBub2RlTGFiZWwxKSBncmFwaC5hZGRFZGdlKHVuZGVmaW5lZCwgZnJvbU5vZGVJZCwgdG9Ob2RlSWQsIGVkZ2VMYWJlbCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGdyYXBoO1xuICB9OyAvLyDlu7rnq4sgcmlnaHRtb3N0IHBhdGhcblxuXG4gIERGU2NvZGUucHJvdG90eXBlLmJ1aWxkUm1wYXRoID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMucm1wYXRoID0gW107XG4gICAgdmFyIG9sZEZyb20gPSB1bmRlZmluZWQ7XG4gICAgdmFyIHNlbGZMZW5ndGggPSB0aGlzLmRmc0VkZ2VMaXN0Lmxlbmd0aDtcblxuICAgIGZvciAodmFyIGkgPSBzZWxmTGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciBkZnNFZGdlID0gdGhpcy5kZnNFZGdlTGlzdFtpXTtcbiAgICAgIHZhciBmcm9tTm9kZUlkeCA9IGRmc0VkZ2UuZnJvbU5vZGU7XG4gICAgICB2YXIgdG9Ob2RlSWR4ID0gZGZzRWRnZS50b05vZGU7XG5cbiAgICAgIGlmIChmcm9tTm9kZUlkeCA8IHRvTm9kZUlkeCAmJiAob2xkRnJvbSA9PT0gdW5kZWZpbmVkIHx8IHRvTm9kZUlkeCA9PT0gb2xkRnJvbSkpIHtcbiAgICAgICAgdGhpcy5ybXBhdGgucHVzaChpKTtcbiAgICAgICAgb2xkRnJvbSA9IGZyb21Ob2RlSWR4O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnJtcGF0aDtcbiAgfTtcblxuICBERlNjb2RlLnByb3RvdHlwZS5nZXROb2RlTnVtID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBub2RlTWFwID0ge307XG4gICAgdGhpcy5kZnNFZGdlTGlzdC5mb3JFYWNoKGZ1bmN0aW9uIChkZnNFZGdlKSB7XG4gICAgICBpZiAoIW5vZGVNYXBbZGZzRWRnZS5mcm9tTm9kZV0pIG5vZGVNYXBbZGZzRWRnZS5mcm9tTm9kZV0gPSB0cnVlO1xuICAgICAgaWYgKCFub2RlTWFwW2Rmc0VkZ2UudG9Ob2RlXSkgbm9kZU1hcFtkZnNFZGdlLnRvTm9kZV0gPSB0cnVlO1xuICAgIH0pO1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhub2RlTWFwKS5sZW5ndGg7XG4gIH07XG5cbiAgcmV0dXJuIERGU2NvZGU7XG59KCk7XG5cbnZhciBIaXN0b3J5ID1cbi8qKiBAY2xhc3MgKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gSGlzdG9yeShwZGZzKSB7XG4gICAgdGhpcy5oaXMgPSB7fTtcbiAgICB0aGlzLm5vZGVzVXNlZCA9IHt9O1xuICAgIHRoaXMuZWRnZXNVc2VkID0ge307XG4gICAgdGhpcy5lZGdlcyA9IFtdO1xuICAgIGlmICghcGRmcykgcmV0dXJuO1xuXG4gICAgd2hpbGUgKHBkZnMpIHtcbiAgICAgIHZhciBlID0gcGRmcy5lZGdlO1xuICAgICAgdGhpcy5lZGdlcy5wdXNoKGUpO1xuICAgICAgdGhpcy5ub2Rlc1VzZWRbZS5mcm9tXSA9IDE7XG4gICAgICB0aGlzLm5vZGVzVXNlZFtlLnRvXSA9IDE7XG4gICAgICB0aGlzLmVkZ2VzVXNlZFtlLmlkXSA9IDE7XG4gICAgICBwZGZzID0gcGRmcy5wcmVOb2RlO1xuICAgIH0gLy8g5YCS5bqPXG5cblxuICAgIHRoaXMuZWRnZXMgPSB0aGlzLmVkZ2VzLnJldmVyc2UoKTtcbiAgfVxuXG4gIEhpc3RvcnkucHJvdG90eXBlLmhhc05vZGUgPSBmdW5jdGlvbiAobm9kZSkge1xuICAgIHJldHVybiB0aGlzLm5vZGVzVXNlZFtub2RlLmlkXSA9PT0gMTtcbiAgfTtcblxuICBIaXN0b3J5LnByb3RvdHlwZS5oYXNFZGdlID0gZnVuY3Rpb24gKGVkZ2UpIHtcbiAgICByZXR1cm4gdGhpcy5lZGdlc1VzZWRbZWRnZS5pZF0gPT09IDE7XG4gIH07XG5cbiAgcmV0dXJuIEhpc3Rvcnk7XG59KCk7XG5cbnZhciBHU3BhbiA9XG4vKiogQGNsYXNzICovXG5mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEdTcGFuKF9hKSB7XG4gICAgdmFyIGdyYXBocyA9IF9hLmdyYXBocyxcbiAgICAgICAgX2IgPSBfYS5taW5TdXBwb3J0LFxuICAgICAgICBtaW5TdXBwb3J0ID0gX2IgPT09IHZvaWQgMCA/IDIgOiBfYixcbiAgICAgICAgX2MgPSBfYS5taW5Ob2RlTnVtLFxuICAgICAgICBtaW5Ob2RlTnVtID0gX2MgPT09IHZvaWQgMCA/IDEgOiBfYyxcbiAgICAgICAgX2QgPSBfYS5tYXhOb2RlTnVtLFxuICAgICAgICBtYXhOb2RlTnVtID0gX2QgPT09IHZvaWQgMCA/IDQgOiBfZCxcbiAgICAgICAgX2UgPSBfYS50b3AsXG4gICAgICAgIHRvcCA9IF9lID09PSB2b2lkIDAgPyAxMCA6IF9lLFxuICAgICAgICBfZiA9IF9hLmRpcmVjdGVkLFxuICAgICAgICBkaXJlY3RlZCA9IF9mID09PSB2b2lkIDAgPyBmYWxzZSA6IF9mLFxuICAgICAgICBfZyA9IF9hLnZlcmJvc2UsXG4gICAgICAgIHZlcmJvc2UgPSBfZyA9PT0gdm9pZCAwID8gZmFsc2UgOiBfZzsgLy8gLS0tLS0tLS0g56ys6Zu25q2l77yM5Yid5aeL5YyWLS0tLS0tLVxuXG4gICAgdGhpcy5ncmFwaHMgPSBncmFwaHM7XG4gICAgdGhpcy5kZnNDb2RlID0gbmV3IERGU2NvZGUoKTtcbiAgICB0aGlzLnN1cHBvcnQgPSAwO1xuICAgIHRoaXMuZnJlcXVlbnRTaXplMVN1YmdyYXBocyA9IFtdO1xuICAgIHRoaXMuZnJlcXVlbnRTdWJncmFwaHMgPSBbXTtcbiAgICB0aGlzLm1pblN1cHBvcnQgPSBtaW5TdXBwb3J0O1xuICAgIHRoaXMudG9wID0gdG9wO1xuICAgIHRoaXMuZGlyZWN0ZWQgPSBkaXJlY3RlZDtcbiAgICB0aGlzLmNvdW50ZXIgPSAwOyAvLyBUT0RPPyB0aW1lc3RhbXAgPSB7fVxuXG4gICAgdGhpcy5tYXhOb2RlTnVtID0gbWF4Tm9kZU51bTtcbiAgICB0aGlzLm1pbk5vZGVOdW0gPSBtaW5Ob2RlTnVtO1xuICAgIHRoaXMudmVyYm9zZSA9IHZlcmJvc2U7XG4gICAgaWYgKHRoaXMubWF4Tm9kZU51bSA8IHRoaXMubWluTm9kZU51bSkgdGhpcy5tYXhOb2RlTnVtID0gdGhpcy5taW5Ob2RlTnVtO1xuICAgIHRoaXMucmVwb3J0REYgPSBbXTsgLy8gbWF0cml4XG4gIH0gLy8gTGluZSAzNTJcblxuXG4gIEdTcGFuLnByb3RvdHlwZS5maW5kRm9yd2FyZFJvb3RFZGdlcyA9IGZ1bmN0aW9uIChncmFwaCwgZnJvbU5vZGUpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgIHZhciBub2RlTWFwID0gZ3JhcGgubm9kZU1hcDtcbiAgICBmcm9tTm9kZS5lZGdlcy5mb3JFYWNoKGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgICBpZiAoX3RoaXMuZGlyZWN0ZWQgfHwgZnJvbU5vZGUubGFiZWwgPD0gbm9kZU1hcFtlZGdlLnRvXS5sYWJlbCkgcmVzdWx0LnB1c2goZWRnZSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICBHU3Bhbi5wcm90b3R5cGUuZmluZEJhY2t3YXJkRWRnZSA9IGZ1bmN0aW9uIChncmFwaCwgZWRnZTEsIGVkZ2UyLCBoaXN0b3J5KSB7XG4gICAgaWYgKCF0aGlzLmRpcmVjdGVkICYmIGVkZ2UxID09PSBlZGdlMikgcmV0dXJuIG51bGw7XG4gICAgdmFyIG5vZGVNYXAgPSBncmFwaC5ub2RlTWFwO1xuICAgIHZhciBlZGdlMlRvID0gbm9kZU1hcFtlZGdlMi50b107XG4gICAgdmFyIGVkZ2UyVG9FZGdlcyA9IGVkZ2UyVG8uZWRnZXM7XG4gICAgdmFyIGVkZ2VMZW5ndGggPSBlZGdlMlRvRWRnZXMubGVuZ3RoO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlZGdlTGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBlZGdlID0gZWRnZTJUb0VkZ2VzW2ldO1xuICAgICAgaWYgKGhpc3RvcnkuaGFzRWRnZShlZGdlKSB8fCBlZGdlLnRvICE9PSBlZGdlMS5mcm9tKSBjb250aW51ZTtcblxuICAgICAgaWYgKCF0aGlzLmRpcmVjdGVkKSB7XG4gICAgICAgIGlmIChlZGdlMS5sYWJlbCA8IGVkZ2UubGFiZWwgfHwgZWRnZTEubGFiZWwgPT09IGVkZ2UubGFiZWwgJiYgbm9kZU1hcFtlZGdlMS50b10ubGFiZWwgPD0gbm9kZU1hcFtlZGdlMi50b10ubGFiZWwpIHtcbiAgICAgICAgICByZXR1cm4gZWRnZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKG5vZGVNYXBbZWRnZTEuZnJvbV0ubGFiZWwgPCBub2RlTWFwW2VkZ2UyLnRvXS5sYWJlbCB8fCBub2RlTWFwW2VkZ2UxLmZyb21dLmxhYmVsID09PSBub2RlTWFwW2VkZ2UyLnRvXS5sYWJlbCAmJiBlZGdlMS5sYWJlbCA8PSBlZGdlLmxhYmVsKSB7XG4gICAgICAgICAgcmV0dXJuIGVkZ2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfTtcblxuICBHU3Bhbi5wcm90b3R5cGUuZmluZEZvcndhcmRQdXJlRWRnZXMgPSBmdW5jdGlvbiAoZ3JhcGgsIHJpZ2h0bW9zdEVkZ2UsIG1pbk5vZGVMYWJlbCwgaGlzdG9yeSkge1xuICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICB2YXIgcmlnaHRtb3N0RWRnZVRvSWQgPSByaWdodG1vc3RFZGdlLnRvO1xuICAgIHZhciBlZGdlcyA9IGdyYXBoLm5vZGVNYXBbcmlnaHRtb3N0RWRnZVRvSWRdLmVkZ2VzO1xuICAgIHZhciBlZGdlTGVuZ3RoID0gZWRnZXMubGVuZ3RoO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlZGdlTGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBlZGdlID0gZWRnZXNbaV07XG4gICAgICB2YXIgdG9Ob2RlID0gZ3JhcGgubm9kZU1hcFtlZGdlLnRvXTtcblxuICAgICAgaWYgKG1pbk5vZGVMYWJlbCA8PSB0b05vZGUubGFiZWwgJiYgIWhpc3RvcnkuaGFzTm9kZSh0b05vZGUpKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKGVkZ2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgR1NwYW4ucHJvdG90eXBlLmZpbmRGb3J3YXJkUm1wYXRoRWRnZXMgPSBmdW5jdGlvbiAoZ3JhcGgsIHJpZ2h0bW9zdEVkZ2UsIG1pbk5vZGVMYWJlbCwgaGlzdG9yeSkge1xuICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICB2YXIgbm9kZU1hcCA9IGdyYXBoLm5vZGVNYXA7XG4gICAgdmFyIHRvTm9kZUxhYmVsID0gbm9kZU1hcFtyaWdodG1vc3RFZGdlLnRvXS5sYWJlbDtcbiAgICB2YXIgZnJvbU5vZGUgPSBub2RlTWFwW3JpZ2h0bW9zdEVkZ2UuZnJvbV07XG4gICAgdmFyIGVkZ2VzID0gZnJvbU5vZGUuZWRnZXM7XG4gICAgdmFyIGVkZ2VMZW5ndGggPSBlZGdlcy5sZW5ndGg7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVkZ2VMZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVkZ2UgPSBlZGdlc1tpXTtcbiAgICAgIHZhciBuZXdUb05vZGVMYWJlbCA9IG5vZGVNYXBbZWRnZS50b10ubGFiZWw7XG5cbiAgICAgIGlmIChyaWdodG1vc3RFZGdlLnRvID09PSBlZGdlLnRvIHx8IG1pbk5vZGVMYWJlbCA+IG5ld1RvTm9kZUxhYmVsIHx8IGhpc3RvcnkuaGFzTm9kZShub2RlTWFwW2VkZ2UudG9dKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHJpZ2h0bW9zdEVkZ2UubGFiZWwgPCBlZGdlLmxhYmVsIHx8IHJpZ2h0bW9zdEVkZ2UubGFiZWwgPT09IGVkZ2UubGFiZWwgJiYgdG9Ob2RlTGFiZWwgPD0gbmV3VG9Ob2RlTGFiZWwpIHtcbiAgICAgICAgcmVzdWx0LnB1c2goZWRnZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICBHU3Bhbi5wcm90b3R5cGUuZ2V0U3VwcG9ydCA9IGZ1bmN0aW9uIChwcm9qZWN0ZWQpIHtcbiAgICB2YXIgZ3JhcGhNYXAgPSB7fTtcbiAgICBwcm9qZWN0ZWQuZm9yRWFjaChmdW5jdGlvbiAocHJvKSB7XG4gICAgICBpZiAoIWdyYXBoTWFwW3Byby5ncmFwaElkXSkgZ3JhcGhNYXBbcHJvLmdyYXBoSWRdID0gdHJ1ZTtcbiAgICB9KTtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMoZ3JhcGhNYXApLmxlbmd0aDtcbiAgfTtcblxuICBHU3Bhbi5wcm90b3R5cGUuZmluZE1pbkxhYmVsID0gZnVuY3Rpb24gKG9iaikge1xuICAgIHZhciBtaW5MYWJlbCA9IHVuZGVmaW5lZDtcbiAgICBPYmplY3Qua2V5cyhvYmopLmZvckVhY2goZnVuY3Rpb24gKG5vZGVFZGdlTm9kZUxhYmVsKSB7XG4gICAgICB2YXIgX2EgPSBvYmpbbm9kZUVkZ2VOb2RlTGFiZWxdLFxuICAgICAgICAgIG5vZGVMYWJlbDEgPSBfYS5ub2RlTGFiZWwxLFxuICAgICAgICAgIGVkZ2VMYWJlbCA9IF9hLmVkZ2VMYWJlbCxcbiAgICAgICAgICBub2RlTGFiZWwyID0gX2Eubm9kZUxhYmVsMjtcblxuICAgICAgaWYgKCFtaW5MYWJlbCkge1xuICAgICAgICBtaW5MYWJlbCA9IHtcbiAgICAgICAgICBub2RlTGFiZWwxOiBub2RlTGFiZWwxLFxuICAgICAgICAgIGVkZ2VMYWJlbDogZWRnZUxhYmVsLFxuICAgICAgICAgIG5vZGVMYWJlbDI6IG5vZGVMYWJlbDJcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAobm9kZUxhYmVsMSA8IG1pbkxhYmVsLm5vZGVMYWJlbDEgfHwgbm9kZUxhYmVsMSA9PT0gbWluTGFiZWwubm9kZUxhYmVsMSAmJiBlZGdlTGFiZWwgPCBtaW5MYWJlbC5lZGdlTGFiZWwgfHwgbm9kZUxhYmVsMSA9PT0gbWluTGFiZWwubm9kZUxhYmVsMSAmJiBlZGdlTGFiZWwgPT09IG1pbkxhYmVsLmVkZ2VMYWJlbCAmJiBub2RlTGFiZWwyIDwgbWluTGFiZWwubm9kZUxhYmVsMikge1xuICAgICAgICBtaW5MYWJlbCA9IHtcbiAgICAgICAgICBub2RlTGFiZWwxOiBub2RlTGFiZWwxLFxuICAgICAgICAgIGVkZ2VMYWJlbDogZWRnZUxhYmVsLFxuICAgICAgICAgIG5vZGVMYWJlbDI6IG5vZGVMYWJlbDJcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gbWluTGFiZWw7XG4gIH07XG5cbiAgR1NwYW4ucHJvdG90eXBlLmlzTWluID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICB2YXIgZGZzQ29kZSA9IHRoaXMuZGZzQ29kZTtcbiAgICBpZiAodGhpcy52ZXJib3NlKSBjb25zb2xlLmxvZyhcImlzTWluIGNoZWNraW5nXCIsIGRmc0NvZGUpO1xuICAgIGlmIChkZnNDb2RlLmRmc0VkZ2VMaXN0Lmxlbmd0aCA9PT0gMSkgcmV0dXJuIHRydWU7XG4gICAgdmFyIGRpcmVjdGVkID0gdGhpcy5kaXJlY3RlZDtcbiAgICB2YXIgZ3JhcGggPSBkZnNDb2RlLnRvR3JhcGgoX3N0cnVjdC5WQUNBTlRfR1JBUEhfSUQsIGRpcmVjdGVkKTtcbiAgICB2YXIgbm9kZU1hcCA9IGdyYXBoLm5vZGVNYXA7XG4gICAgdmFyIGRmc0NvZGVNaW4gPSBuZXcgREZTY29kZSgpO1xuICAgIHZhciByb290ID0ge307XG4gICAgZ3JhcGgubm9kZXMuZm9yRWFjaChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgdmFyIGZvcndhcmRFZGdlcyA9IF90aGlzLmZpbmRGb3J3YXJkUm9vdEVkZ2VzKGdyYXBoLCBub2RlKTtcblxuICAgICAgZm9yd2FyZEVkZ2VzLmZvckVhY2goZnVuY3Rpb24gKGVkZ2UpIHtcbiAgICAgICAgdmFyIG90aGVyTm9kZSA9IG5vZGVNYXBbZWRnZS50b107XG4gICAgICAgIHZhciBub2RlRWRnZU5vZGVMYWJlbCA9IG5vZGUubGFiZWwgKyBcIi1cIiArIGVkZ2UubGFiZWwgKyBcIi1cIiArIG90aGVyTm9kZS5sYWJlbDtcbiAgICAgICAgaWYgKCFyb290W25vZGVFZGdlTm9kZUxhYmVsXSkgcm9vdFtub2RlRWRnZU5vZGVMYWJlbF0gPSB7XG4gICAgICAgICAgcHJvamVjdGVkOiBbXSxcbiAgICAgICAgICBub2RlTGFiZWwxOiBub2RlLmxhYmVsLFxuICAgICAgICAgIGVkZ2VMYWJlbDogZWRnZS5sYWJlbCxcbiAgICAgICAgICBub2RlTGFiZWwyOiBvdGhlck5vZGUubGFiZWxcbiAgICAgICAgfTtcbiAgICAgICAgdmFyIHBkZnMgPSB7XG4gICAgICAgICAgZ3JhcGhJZDogZ3JhcGguaWQsXG4gICAgICAgICAgZWRnZTogZWRnZSxcbiAgICAgICAgICBwcmVOb2RlOiBudWxsXG4gICAgICAgIH07XG4gICAgICAgIHJvb3Rbbm9kZUVkZ2VOb2RlTGFiZWxdLnByb2plY3RlZC5wdXNoKHBkZnMpO1xuICAgICAgfSk7XG4gICAgfSk7IC8vIOavlOi+gyByb290IOS4reavj+S4gOmhueeahCBub2RlRWRnZU5vZGVMYWJlbCDlpKflsI/vvIzmjInnhacgbm9kZUxhYmVsMeOAgWVkZ2VMYWJl44CBbm9kZUxhYmVsMiDnmoTpobrluo/mr5TovoNcblxuICAgIHZhciBtaW5MYWJlbCA9IHRoaXMuZmluZE1pbkxhYmVsKHJvb3QpOyAvLyBsaW5lIDQxOVxuXG4gICAgaWYgKCFtaW5MYWJlbCkgcmV0dXJuO1xuICAgIGRmc0NvZGVNaW4uZGZzRWRnZUxpc3QucHVzaChuZXcgREZTZWRnZSgwLCAxLCBtaW5MYWJlbC5ub2RlTGFiZWwxLCBtaW5MYWJlbC5lZGdlTGFiZWwsIG1pbkxhYmVsLm5vZGVMYWJlbDIpKTsgLy8gbGluZSA0MjNcblxuICAgIHZhciBwcm9qZWN0SXNNaW4gPSBmdW5jdGlvbiBwcm9qZWN0SXNNaW4ocHJvamVjdGVkKSB7XG4gICAgICAvLyByaWdodCBtb3N0IHBhdGhcbiAgICAgIHZhciBybXBhdGggPSBkZnNDb2RlTWluLmJ1aWxkUm1wYXRoKCk7XG4gICAgICB2YXIgbWluTm9kZUxhYmVsID0gZGZzQ29kZU1pbi5kZnNFZGdlTGlzdFswXS5ub2RlRWRnZU5vZGVMYWJlbC5ub2RlTGFiZWwxO1xuICAgICAgdmFyIG1heFRvQyA9IGRmc0NvZGVNaW4uZGZzRWRnZUxpc3Rbcm1wYXRoWzBdXS50b05vZGU7IC8vIG5vZGUgaWRcblxuICAgICAgdmFyIGJhY2t3YXJkUm9vdCA9IHt9O1xuICAgICAgdmFyIGZsYWcgPSBmYWxzZSxcbiAgICAgICAgICBuZXdUbyA9IDA7XG4gICAgICB2YXIgZW5kID0gZGlyZWN0ZWQgPyAtMSA6IDA7IC8vIOmBjeWOhuWIsCAxIOi/mOaYr+WIsCAwXG5cbiAgICAgIHZhciBfbG9vcF8xID0gZnVuY3Rpb24gX2xvb3BfMShpKSB7XG4gICAgICAgIGlmIChmbGFnKSByZXR1cm4gXCJicmVha1wiOyAvLyBsaW5lIDQzNVxuXG4gICAgICAgIHByb2plY3RlZC5mb3JFYWNoKGZ1bmN0aW9uIChwKSB7XG4gICAgICAgICAgdmFyIGhpc3RvcnkgPSBuZXcgSGlzdG9yeShwKTtcblxuICAgICAgICAgIHZhciBiYWNrd2FyZEVkZ2UgPSBfdGhpcy5maW5kQmFja3dhcmRFZGdlKGdyYXBoLCBoaXN0b3J5LmVkZ2VzW3JtcGF0aFtpXV0sIGhpc3RvcnkuZWRnZXNbcm1wYXRoWzBdXSwgaGlzdG9yeSk7XG5cbiAgICAgICAgICBpZiAoYmFja3dhcmRFZGdlKSB7XG4gICAgICAgICAgICAvLyBMaW5lIDQ0MVxuICAgICAgICAgICAgaWYgKCFiYWNrd2FyZFJvb3RbYmFja3dhcmRFZGdlLmxhYmVsXSkge1xuICAgICAgICAgICAgICBiYWNrd2FyZFJvb3RbYmFja3dhcmRFZGdlLmxhYmVsXSA9IHtcbiAgICAgICAgICAgICAgICBwcm9qZWN0ZWQ6IFtdLFxuICAgICAgICAgICAgICAgIGVkZ2VMYWJlbDogYmFja3dhcmRFZGdlLmxhYmVsXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJhY2t3YXJkUm9vdFtiYWNrd2FyZEVkZ2UubGFiZWxdLnByb2plY3RlZC5wdXNoKHtcbiAgICAgICAgICAgICAgZ3JhcGhJZDogZ3JhcGguaWQsXG4gICAgICAgICAgICAgIGVkZ2U6IGJhY2t3YXJkUm9vdCxcbiAgICAgICAgICAgICAgcHJlTm9kZTogcFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBuZXdUbyA9IGRmc0NvZGVNaW4uZGZzRWRnZUxpc3Rbcm1wYXRoW2ldXS5mcm9tTm9kZTtcbiAgICAgICAgICAgIGZsYWcgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9O1xuXG4gICAgICBmb3IgKHZhciBpID0gcm1wYXRoLmxlbmd0aCAtIDE7IGkgPiBlbmQ7IGktLSkge1xuICAgICAgICB2YXIgc3RhdGVfMSA9IF9sb29wXzEoaSk7XG5cbiAgICAgICAgaWYgKHN0YXRlXzEgPT09IFwiYnJlYWtcIikgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGlmIChmbGFnKSB7XG4gICAgICAgIHZhciBtaW5CYWNrd2FyZEVkZ2VMYWJlbCA9IF90aGlzLmZpbmRNaW5MYWJlbChiYWNrd2FyZFJvb3QpO1xuXG4gICAgICAgIGRmc0NvZGVNaW4uZGZzRWRnZUxpc3QucHVzaChuZXcgREZTZWRnZShtYXhUb0MsIG5ld1RvLCBfc3RydWN0LlZBQ0FOVF9OT0RFX0xBQkVMLCBtaW5CYWNrd2FyZEVkZ2VMYWJlbC5lZGdlTGFiZWwsIF9zdHJ1Y3QuVkFDQU5UX05PREVfTEFCRUwpKTtcbiAgICAgICAgdmFyIGlkeF8xID0gZGZzQ29kZU1pbi5kZnNFZGdlTGlzdC5sZW5ndGggLSAxO1xuICAgICAgICBpZiAoX3RoaXMuZGZzQ29kZS5kZnNFZGdlTGlzdFtpZHhfMV0gIT09IGRmc0NvZGVNaW4uZGZzRWRnZUxpc3RbaWR4XzFdKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiBwcm9qZWN0SXNNaW4oYmFja3dhcmRSb290W21pbkJhY2t3YXJkRWRnZUxhYmVsLmVkZ2VMYWJlbF0ucHJvamVjdGVkKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGZvcndhcmRSb290ID0ge307XG4gICAgICBmbGFnID0gZmFsc2U7XG4gICAgICB2YXIgbmV3RnJvbSA9IDA7XG4gICAgICBwcm9qZWN0ZWQuZm9yRWFjaChmdW5jdGlvbiAocCkge1xuICAgICAgICB2YXIgaGlzdG9yeSA9IG5ldyBIaXN0b3J5KHApO1xuXG4gICAgICAgIHZhciBmb3J3YXJkUHVyZUVkZ2VzID0gX3RoaXMuZmluZEZvcndhcmRQdXJlRWRnZXMoZ3JhcGgsIGhpc3RvcnkuZWRnZXNbcm1wYXRoWzBdXSwgbWluTm9kZUxhYmVsLCBoaXN0b3J5KTtcblxuICAgICAgICBpZiAoZm9yd2FyZFB1cmVFZGdlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgZmxhZyA9IHRydWU7XG4gICAgICAgICAgbmV3RnJvbSA9IG1heFRvQztcbiAgICAgICAgICBmb3J3YXJkUHVyZUVkZ2VzLmZvckVhY2goZnVuY3Rpb24gKGVkZ2UpIHtcbiAgICAgICAgICAgIHZhciBrZXkgPSBlZGdlLmxhYmVsICsgXCItXCIgKyBub2RlTWFwW2VkZ2UudG9dLmxhYmVsO1xuICAgICAgICAgICAgaWYgKCFmb3J3YXJkUm9vdFtrZXldKSBmb3J3YXJkUm9vdFtrZXldID0ge1xuICAgICAgICAgICAgICBwcm9qZWN0ZWQ6IFtdLFxuICAgICAgICAgICAgICBlZGdlTGFiZWw6IGVkZ2UubGFiZWwsXG4gICAgICAgICAgICAgIG5vZGVMYWJlbDI6IG5vZGVNYXBbZWRnZS50b10ubGFiZWxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBmb3J3YXJkUm9vdFtrZXldLnByb2plY3RlZC5wdXNoKHtcbiAgICAgICAgICAgICAgZ3JhcGhJZDogZ3JhcGguaWQsXG4gICAgICAgICAgICAgIGVkZ2U6IGVkZ2UsXG4gICAgICAgICAgICAgIHByZU5vZGU6IHBcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHZhciBwYXRoTGVuZ3RoID0gcm1wYXRoLmxlbmd0aDtcblxuICAgICAgdmFyIF9sb29wXzIgPSBmdW5jdGlvbiBfbG9vcF8yKGkpIHtcbiAgICAgICAgaWYgKGZsYWcpIHJldHVybiBcImJyZWFrXCI7XG4gICAgICAgIHZhciB2YWx1ZSA9IHJtcGF0aFtpXTtcbiAgICAgICAgcHJvamVjdGVkLmZvckVhY2goZnVuY3Rpb24gKHApIHtcbiAgICAgICAgICB2YXIgaGlzdG9yeSA9IG5ldyBIaXN0b3J5KHApO1xuXG4gICAgICAgICAgdmFyIGZvcndhcmRSbXBhdGhFZGdlcyA9IF90aGlzLmZpbmRGb3J3YXJkUm1wYXRoRWRnZXMoZ3JhcGgsIGhpc3RvcnkuZWRnZXNbdmFsdWVdLCBtaW5Ob2RlTGFiZWwsIGhpc3RvcnkpO1xuXG4gICAgICAgICAgaWYgKGZvcndhcmRSbXBhdGhFZGdlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmbGFnID0gdHJ1ZTtcbiAgICAgICAgICAgIG5ld0Zyb20gPSBkZnNDb2RlTWluLmRmc0VkZ2VMaXN0W3ZhbHVlXS5mcm9tTm9kZTtcbiAgICAgICAgICAgIGZvcndhcmRSbXBhdGhFZGdlcy5mb3JFYWNoKGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgICAgICAgICAgIHZhciBrZXkgPSBlZGdlLmxhYmVsICsgXCItXCIgKyBub2RlTWFwW2VkZ2UudG9dLmxhYmVsO1xuICAgICAgICAgICAgICBpZiAoIWZvcndhcmRSb290W2tleV0pIGZvcndhcmRSb290W2tleV0gPSB7XG4gICAgICAgICAgICAgICAgcHJvamVjdGVkOiBbXSxcbiAgICAgICAgICAgICAgICBlZGdlTGFiZWw6IGVkZ2UubGFiZWwsXG4gICAgICAgICAgICAgICAgbm9kZUxhYmVsMjogbm9kZU1hcFtlZGdlLnRvXS5sYWJlbFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICBmb3J3YXJkUm9vdFtrZXldLnByb2plY3RlZC5wdXNoKHtcbiAgICAgICAgICAgICAgICBncmFwaElkOiBncmFwaC5pZCxcbiAgICAgICAgICAgICAgICBlZGdlOiBlZGdlLFxuICAgICAgICAgICAgICAgIHByZU5vZGU6IHBcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXRoTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHN0YXRlXzIgPSBfbG9vcF8yKGkpO1xuXG4gICAgICAgIGlmIChzdGF0ZV8yID09PSBcImJyZWFrXCIpIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWZsYWcpIHJldHVybiB0cnVlO1xuXG4gICAgICB2YXIgZm9yd2FyZE1pbkVkZ2VOb2RlTGFiZWwgPSBfdGhpcy5maW5kTWluTGFiZWwoZm9yd2FyZFJvb3QpO1xuXG4gICAgICBkZnNDb2RlTWluLmRmc0VkZ2VMaXN0LnB1c2gobmV3IERGU2VkZ2UobmV3RnJvbSwgbWF4VG9DICsgMSwgX3N0cnVjdC5WQUNBTlRfTk9ERV9MQUJFTCwgZm9yd2FyZE1pbkVkZ2VOb2RlTGFiZWwuZWRnZUxhYmVsLCBmb3J3YXJkTWluRWRnZU5vZGVMYWJlbC5ub2RlTGFiZWwyKSk7XG4gICAgICB2YXIgaWR4ID0gZGZzQ29kZU1pbi5kZnNFZGdlTGlzdC5sZW5ndGggLSAxO1xuICAgICAgaWYgKGRmc0NvZGUuZGZzRWRnZUxpc3RbaWR4XSAhPT0gZGZzQ29kZU1pbi5kZnNFZGdlTGlzdFtpZHhdKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gcHJvamVjdElzTWluKGZvcndhcmRSb290W2ZvcndhcmRNaW5FZGdlTm9kZUxhYmVsLmVkZ2VMYWJlbCArIFwiLVwiICsgZm9yd2FyZE1pbkVkZ2VOb2RlTGFiZWwubm9kZUxhYmVsMl0ucHJvamVjdGVkKTtcbiAgICB9O1xuXG4gICAgdmFyIGtleSA9IG1pbkxhYmVsLm5vZGVMYWJlbDEgKyBcIi1cIiArIG1pbkxhYmVsLmVkZ2VMYWJlbCArIFwiLVwiICsgbWluTGFiZWwubm9kZUxhYmVsMjtcbiAgICByZXR1cm4gcHJvamVjdElzTWluKHJvb3Rba2V5XS5wcm9qZWN0ZWQpO1xuICB9O1xuXG4gIEdTcGFuLnByb3RvdHlwZS5yZXBvcnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHRoaXMuZGZzQ29kZS5nZXROb2RlTnVtKCkgPCB0aGlzLm1pbk5vZGVOdW0pIHJldHVybjtcbiAgICB0aGlzLmNvdW50ZXIrKztcbiAgICB2YXIgZ3JhcGggPSB0aGlzLmRmc0NvZGUudG9HcmFwaCh0aGlzLmNvdW50ZXIsIHRoaXMuZGlyZWN0ZWQpO1xuICAgIHRoaXMuZnJlcXVlbnRTdWJncmFwaHMucHVzaCgoMCwgX3V0aWwuY2xvbmUpKGdyYXBoKSk7XG4gIH07XG5cbiAgR1NwYW4ucHJvdG90eXBlLnN1YkdyYXBoTWluaW5nID0gZnVuY3Rpb24gKHByb2plY3RlZCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICB2YXIgc3VwcG9ydCA9IHRoaXMuZ2V0U3VwcG9ydChwcm9qZWN0ZWQpO1xuICAgIGlmIChzdXBwb3J0IDwgdGhpcy5taW5TdXBwb3J0KSByZXR1cm47XG4gICAgaWYgKCF0aGlzLmlzTWluKCkpIHJldHVybjtcbiAgICB0aGlzLnJlcG9ydCgpO1xuICAgIHZhciBub2RlTnVtID0gdGhpcy5kZnNDb2RlLmdldE5vZGVOdW0oKTtcbiAgICB2YXIgcm1wYXRoID0gdGhpcy5kZnNDb2RlLmJ1aWxkUm1wYXRoKCk7XG4gICAgdmFyIG1heFRvQyA9IHRoaXMuZGZzQ29kZS5kZnNFZGdlTGlzdFtybXBhdGhbMF1dLnRvTm9kZTtcbiAgICB2YXIgbWluTm9kZUxhYmVsID0gdGhpcy5kZnNDb2RlLmRmc0VkZ2VMaXN0WzBdLm5vZGVFZGdlTm9kZUxhYmVsLm5vZGVMYWJlbDE7XG4gICAgdmFyIGZvcndhcmRSb290ID0ge307XG4gICAgdmFyIGJhY2t3YXJkUm9vdCA9IHt9O1xuICAgIHByb2plY3RlZC5mb3JFYWNoKGZ1bmN0aW9uIChwKSB7XG4gICAgICB2YXIgZ3JhcGggPSBfdGhpcy5ncmFwaHNbcC5ncmFwaElkXTtcbiAgICAgIHZhciBub2RlTWFwID0gZ3JhcGgubm9kZU1hcDtcbiAgICAgIHZhciBoaXN0b3J5ID0gbmV3IEhpc3RvcnkocCk7IC8vIGJhY2t3YXJkIExpbmUgNTI2XG5cbiAgICAgIGZvciAodmFyIGkgPSBybXBhdGgubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgdmFyIGJhY2t3YXJkRWRnZSA9IF90aGlzLmZpbmRCYWNrd2FyZEVkZ2UoZ3JhcGgsIGhpc3RvcnkuZWRnZXNbcm1wYXRoW2ldXSwgaGlzdG9yeS5lZGdlc1tybXBhdGhbMF1dLCBoaXN0b3J5KTtcblxuICAgICAgICBpZiAoYmFja3dhcmRFZGdlKSB7XG4gICAgICAgICAgdmFyIGtleSA9IF90aGlzLmRmc0NvZGUuZGZzRWRnZUxpc3Rbcm1wYXRoW2ldXS5mcm9tTm9kZSArIFwiLVwiICsgYmFja3dhcmRFZGdlLmxhYmVsO1xuICAgICAgICAgIGlmICghYmFja3dhcmRSb290W2tleV0pIGJhY2t3YXJkUm9vdFtrZXldID0ge1xuICAgICAgICAgICAgcHJvamVjdGVkOiBbXSxcbiAgICAgICAgICAgIHRvTm9kZUlkOiBfdGhpcy5kZnNDb2RlLmRmc0VkZ2VMaXN0W3JtcGF0aFtpXV0uZnJvbU5vZGUsXG4gICAgICAgICAgICBlZGdlTGFiZWw6IGJhY2t3YXJkRWRnZS5sYWJlbFxuICAgICAgICAgIH07XG4gICAgICAgICAgYmFja3dhcmRSb290W2tleV0ucHJvamVjdGVkLnB1c2goe1xuICAgICAgICAgICAgZ3JhcGhJZDogcC5ncmFwaElkLFxuICAgICAgICAgICAgZWRnZTogYmFja3dhcmRFZGdlLFxuICAgICAgICAgICAgcHJlTm9kZTogcFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IC8vIHB1cmUgZm9yd2FyZFxuXG5cbiAgICAgIGlmIChub2RlTnVtID49IF90aGlzLm1heE5vZGVOdW0pIHJldHVybjtcblxuICAgICAgdmFyIGZvcndhcmRQdXJlRWRnZXMgPSBfdGhpcy5maW5kRm9yd2FyZFB1cmVFZGdlcyhncmFwaCwgaGlzdG9yeS5lZGdlc1tybXBhdGhbMF1dLCBtaW5Ob2RlTGFiZWwsIGhpc3RvcnkpO1xuXG4gICAgICBmb3J3YXJkUHVyZUVkZ2VzLmZvckVhY2goZnVuY3Rpb24gKGVkZ2UpIHtcbiAgICAgICAgdmFyIGtleSA9IG1heFRvQyArIFwiLVwiICsgZWRnZS5sYWJlbCArIFwiLVwiICsgbm9kZU1hcFtlZGdlLnRvXS5sYWJlbDtcbiAgICAgICAgaWYgKCFmb3J3YXJkUm9vdFtrZXldKSBmb3J3YXJkUm9vdFtrZXldID0ge1xuICAgICAgICAgIHByb2plY3RlZDogW10sXG4gICAgICAgICAgZnJvbU5vZGVJZDogbWF4VG9DLFxuICAgICAgICAgIGVkZ2VMYWJlbDogZWRnZS5sYWJlbCxcbiAgICAgICAgICBub2RlTGFiZWwyOiBub2RlTWFwW2VkZ2UudG9dLmxhYmVsXG4gICAgICAgIH07XG4gICAgICAgIGZvcndhcmRSb290W2tleV0ucHJvamVjdGVkLnB1c2goe1xuICAgICAgICAgIGdyYXBoSWQ6IHAuZ3JhcGhJZCxcbiAgICAgICAgICBlZGdlOiBlZGdlLFxuICAgICAgICAgIHByZU5vZGU6IHBcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgdmFyIF9sb29wXzMgPSBmdW5jdGlvbiBfbG9vcF8zKGkpIHtcbiAgICAgICAgdmFyIGZvcndhcmRSbXBhdGhFZGdlcyA9IF90aGlzLmZpbmRGb3J3YXJkUm1wYXRoRWRnZXMoZ3JhcGgsIGhpc3RvcnkuZWRnZXNbcm1wYXRoW2ldXSwgbWluTm9kZUxhYmVsLCBoaXN0b3J5KTtcblxuICAgICAgICBmb3J3YXJkUm1wYXRoRWRnZXMuZm9yRWFjaChmdW5jdGlvbiAoZWRnZSkge1xuICAgICAgICAgIHZhciBrZXkgPSBfdGhpcy5kZnNDb2RlLmRmc0VkZ2VMaXN0W3JtcGF0aFtpXV0uZnJvbU5vZGUgKyBcIi1cIiArIGVkZ2UubGFiZWwgKyBcIi1cIiArIG5vZGVNYXBbZWRnZS50b10ubGFiZWw7XG4gICAgICAgICAgaWYgKCFmb3J3YXJkUm9vdFtrZXldKSBmb3J3YXJkUm9vdFtrZXldID0ge1xuICAgICAgICAgICAgcHJvamVjdGVkOiBbXSxcbiAgICAgICAgICAgIGZyb21Ob2RlSWQ6IF90aGlzLmRmc0NvZGUuZGZzRWRnZUxpc3Rbcm1wYXRoW2ldXS5mcm9tTm9kZSxcbiAgICAgICAgICAgIGVkZ2VMYWJlbDogZWRnZS5sYWJlbCxcbiAgICAgICAgICAgIG5vZGVMYWJlbDI6IG5vZGVNYXBbZWRnZS50b10ubGFiZWxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGZvcndhcmRSb290W2tleV0ucHJvamVjdGVkLnB1c2goe1xuICAgICAgICAgICAgZ3JhcGhJZDogcC5ncmFwaElkLFxuICAgICAgICAgICAgZWRnZTogZWRnZSxcbiAgICAgICAgICAgIHByZU5vZGU6IHBcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9OyAvLyBybXBhdGggZm9yd2FyZFxuXG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcm1wYXRoLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIF9sb29wXzMoaSk7XG4gICAgICB9XG4gICAgfSk7IC8vIGJhY2t3YXJkXG5cbiAgICBPYmplY3Qua2V5cyhiYWNrd2FyZFJvb3QpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgdmFyIF9hID0gYmFja3dhcmRSb290W2tleV0sXG4gICAgICAgICAgdG9Ob2RlSWQgPSBfYS50b05vZGVJZCxcbiAgICAgICAgICBlZGdlTGFiZWwgPSBfYS5lZGdlTGFiZWw7XG5cbiAgICAgIF90aGlzLmRmc0NvZGUuZGZzRWRnZUxpc3QucHVzaChuZXcgREZTZWRnZShtYXhUb0MsIHRvTm9kZUlkLCBcIi0xXCIsIGVkZ2VMYWJlbCwgXCItMVwiKSk7XG5cbiAgICAgIF90aGlzLnN1YkdyYXBoTWluaW5nKGJhY2t3YXJkUm9vdFtrZXldLnByb2plY3RlZCk7XG5cbiAgICAgIF90aGlzLmRmc0NvZGUuZGZzRWRnZUxpc3QucG9wKCk7XG4gICAgfSk7IC8vIGZvcndhcmRcblxuICAgIE9iamVjdC5rZXlzKGZvcndhcmRSb290KS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIHZhciBfYSA9IGZvcndhcmRSb290W2tleV0sXG4gICAgICAgICAgZnJvbU5vZGVJZCA9IF9hLmZyb21Ob2RlSWQsXG4gICAgICAgICAgZWRnZUxhYmVsID0gX2EuZWRnZUxhYmVsLFxuICAgICAgICAgIG5vZGVMYWJlbDIgPSBfYS5ub2RlTGFiZWwyO1xuXG4gICAgICBfdGhpcy5kZnNDb2RlLmRmc0VkZ2VMaXN0LnB1c2gobmV3IERGU2VkZ2UoZnJvbU5vZGVJZCwgbWF4VG9DICsgMSwgX3N0cnVjdC5WQUNBTlRfTk9ERV9MQUJFTCwgZWRnZUxhYmVsLCBub2RlTGFiZWwyKSk7XG5cbiAgICAgIF90aGlzLnN1YkdyYXBoTWluaW5nKGZvcndhcmRSb290W2tleV0ucHJvamVjdGVkKTtcblxuICAgICAgX3RoaXMuZGZzQ29kZS5kZnNFZGdlTGlzdC5wb3AoKTtcbiAgICB9KTtcbiAgfTtcblxuICBHU3Bhbi5wcm90b3R5cGUuZ2VuZXJhdGUxRWRnZUZyZXF1ZW50U3ViR3JhcGhzID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBncmFwaHMgPSB0aGlzLmdyYXBocztcbiAgICB2YXIgZGlyZWN0ZWQgPSB0aGlzLmRpcmVjdGVkO1xuICAgIHZhciBtaW5TdXBwb3J0ID0gdGhpcy5taW5TdXBwb3J0O1xuICAgIHZhciBmcmVxdWVudFNpemUxU3ViZ3JhcGhzID0gdGhpcy5mcmVxdWVudFNpemUxU3ViZ3JhcGhzO1xuICAgIHZhciBub2RlTGFiZWxDb3VudGVyID0ge30sXG4gICAgICAgIG5vZGVFZGdlTm9kZUNvdW50ZXIgPSB7fTsgLy8g5L+d5a2Y5ZCE5Liq5Zu+5ZKM5ZCE6Ieq6IqC54K555qE5YWz57O7IG1hcO+8jGtleSDmoLzlvI/kuLogZ3JhcGhLZXktbm9kZeexu+Wei1xuXG4gICAgdmFyIG5vZGVMYWJsZUNvdW50ZWQgPSB7fTsgLy8g5L+d5a2Y5ZCE5Liq5Zu+5ZKM5ZCE6Ieq6L6555qE5YWz57O7IG1hcO+8jGtleSDmoLzlvI/kuLogZ3JhcGhLZXktZnJvbU5vZGXnsbvlnostZWRnZeexu+Weiy10b05vZGXnsbvlnotcblxuICAgIHZhciBub2RlRWRnZU5vZGVMYWJlbENvdW50ZWQgPSB7fTtcbiAgICBPYmplY3Qua2V5cyhncmFwaHMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgLy8gTGluZSAyNzFcbiAgICAgIHZhciBncmFwaCA9IGdyYXBoc1trZXldO1xuICAgICAgdmFyIG5vZGVNYXAgPSBncmFwaC5ub2RlTWFwOyAvLyDpgY3ljoboioLngrnvvIzorrDlvZXlr7nlupTlm74g5LiOIOavj+S4quiKgueCueeahCBsYWJlbCDliLAgbm9kZUxhYmxlQ291bnRlZFxuXG4gICAgICBncmFwaC5ub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChub2RlLCBpKSB7XG4gICAgICAgIC8vIExpbmUgMjcyXG4gICAgICAgIHZhciBub2RlTGFiZWwgPSBub2RlLmxhYmVsO1xuICAgICAgICB2YXIgZ3JhcGhOb2RlS2V5ID0ga2V5ICsgXCItXCIgKyBub2RlTGFiZWw7XG5cbiAgICAgICAgaWYgKCFub2RlTGFibGVDb3VudGVkW2dyYXBoTm9kZUtleV0pIHtcbiAgICAgICAgICB2YXIgY291bnRlciA9IG5vZGVMYWJlbENvdW50ZXJbbm9kZUxhYmVsXSB8fCAwO1xuICAgICAgICAgIGNvdW50ZXIrKztcbiAgICAgICAgICBub2RlTGFiZWxDb3VudGVyW25vZGVMYWJlbF0gPSBjb3VudGVyO1xuICAgICAgICB9XG5cbiAgICAgICAgbm9kZUxhYmxlQ291bnRlZFtncmFwaE5vZGVLZXldID0ge1xuICAgICAgICAgIGdyYXBoS2V5OiBrZXksXG4gICAgICAgICAgbGFiZWw6IG5vZGVMYWJlbFxuICAgICAgICB9OyAvLyDpgY3ljobor6XoioLngrnnmoTmiYDmnInovrnvvIzorrDlvZXlkITkuKrlm77lkozlkIToh6rovrnnmoTlhbPns7vliLAgbm9kZUVkZ2VOb2RlTGFiZWxDb3VudGVkLiBMaW5lIDI3NlxuXG4gICAgICAgIG5vZGUuZWRnZXMuZm9yRWFjaChmdW5jdGlvbiAoZWRnZSkge1xuICAgICAgICAgIHZhciBub2RlTGFiZWwxID0gbm9kZUxhYmVsO1xuICAgICAgICAgIHZhciBub2RlTGFiZWwyID0gbm9kZU1hcFtlZGdlLnRvXS5sYWJlbDtcblxuICAgICAgICAgIGlmICghZGlyZWN0ZWQgJiYgbm9kZUxhYmVsMSA+IG5vZGVMYWJlbDIpIHtcbiAgICAgICAgICAgIHZhciB0bXAgPSBub2RlTGFiZWwyO1xuICAgICAgICAgICAgbm9kZUxhYmVsMiA9IG5vZGVMYWJlbDE7XG4gICAgICAgICAgICBub2RlTGFiZWwxID0gdG1wO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBlZGdlTGFiZWwgPSBlZGdlLmxhYmVsO1xuICAgICAgICAgIHZhciBncmFwaE5vZGVFZGdlTm9kZUtleSA9IGtleSArIFwiLVwiICsgbm9kZUxhYmVsMSArIFwiLVwiICsgZWRnZUxhYmVsICsgXCItXCIgKyBub2RlTGFiZWwyO1xuICAgICAgICAgIHZhciBub2RlRWRnZU5vZGVLZXkgPSBub2RlTGFiZWwxICsgXCItXCIgKyBlZGdlTGFiZWwgKyBcIi1cIiArIG5vZGVMYWJlbDI7XG5cbiAgICAgICAgICBpZiAoIW5vZGVFZGdlTm9kZUNvdW50ZXJbbm9kZUVkZ2VOb2RlS2V5XSkge1xuICAgICAgICAgICAgdmFyIGNvdW50ZXIgPSBub2RlRWRnZU5vZGVDb3VudGVyW25vZGVFZGdlTm9kZUtleV0gfHwgMDtcbiAgICAgICAgICAgIGNvdW50ZXIrKztcbiAgICAgICAgICAgIG5vZGVFZGdlTm9kZUNvdW50ZXJbbm9kZUVkZ2VOb2RlS2V5XSA9IGNvdW50ZXI7IC8vIExpbmUyODFcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBub2RlRWRnZU5vZGVMYWJlbENvdW50ZWRbZ3JhcGhOb2RlRWRnZU5vZGVLZXldID0ge1xuICAgICAgICAgICAgZ3JhcGhJZDoga2V5LFxuICAgICAgICAgICAgbm9kZUxhYmVsMTogbm9kZUxhYmVsMSxcbiAgICAgICAgICAgIGVkZ2VMYWJlbDogZWRnZUxhYmVsLFxuICAgICAgICAgICAgbm9kZUxhYmVsMjogbm9kZUxhYmVsMlxuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7IC8vIOiuoeeul+mikee5geeahOiKgueCuVxuXG4gICAgT2JqZWN0LmtleXMobm9kZUxhYmVsQ291bnRlcikuZm9yRWFjaChmdW5jdGlvbiAobGFiZWwpIHtcbiAgICAgIHZhciBjb3VudCA9IG5vZGVMYWJlbENvdW50ZXJbbGFiZWxdO1xuICAgICAgaWYgKGNvdW50IDwgbWluU3VwcG9ydCkgcmV0dXJuO1xuICAgICAgdmFyIGcgPSB7XG4gICAgICAgIG5vZGVzOiBbXSxcbiAgICAgICAgZWRnZXM6IFtdXG4gICAgICB9O1xuICAgICAgZy5ub2Rlcy5wdXNoKHtcbiAgICAgICAgaWQ6IFwiMFwiLFxuICAgICAgICBsYWJlbDogbGFiZWxcbiAgICAgIH0pO1xuICAgICAgZnJlcXVlbnRTaXplMVN1YmdyYXBocy5wdXNoKGcpOyAvLyBpZiAobWluTm9kZU51bSA8PSAxKSByZXBvcnRTaXplMSBUT0RPXG4gICAgfSk7XG4gICAgcmV0dXJuIGZyZXF1ZW50U2l6ZTFTdWJncmFwaHM7XG4gIH07XG5cbiAgR1NwYW4ucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzOyAvLyAtLS0tLS0tLSDnrKzkuIDmraUsIF9nZW5lcmF0ZV8xZWRnZV9mcmVxdWVudF9zdWJncmFwaHPvvJrpopHnuYHnmoTljZXkuKroioLngrktLS0tLS0tXG5cblxuICAgIHRoaXMuZnJlcXVlbnRTaXplMVN1YmdyYXBocyA9IHRoaXMuZ2VuZXJhdGUxRWRnZUZyZXF1ZW50U3ViR3JhcGhzKCk7XG4gICAgaWYgKHRoaXMubWF4Tm9kZU51bSA8IDIpIHJldHVybjtcbiAgICB2YXIgZ3JhcGhzID0gdGhpcy5ncmFwaHM7XG4gICAgdmFyIGRpcmVjdGVkID0gdGhpcy5kaXJlY3RlZDsgLy8gUERGUyDmlbDnu4TnmoQgbWFwIExpbmUgMzA0XG5cbiAgICB2YXIgcm9vdCA9IHt9O1xuICAgIE9iamVjdC5rZXlzKGdyYXBocykuZm9yRWFjaChmdW5jdGlvbiAoZ3JhcGhJZCkge1xuICAgICAgdmFyIGdyYXBoID0gZ3JhcGhzW2dyYXBoSWRdO1xuICAgICAgdmFyIG5vZGVNYXAgPSBncmFwaC5ub2RlTWFwOyAvLyBMaW5lIDMwNlxuXG4gICAgICBncmFwaC5ub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgIHZhciBmb3J3YXJkUm9vdEVkZ2VzID0gX3RoaXMuZmluZEZvcndhcmRSb290RWRnZXMoZ3JhcGgsIG5vZGUpOyAvLyBMaW5lIDMwOFxuXG5cbiAgICAgICAgZm9yd2FyZFJvb3RFZGdlcy5mb3JFYWNoKGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgICAgICAgdmFyIHRvTm9kZSA9IG5vZGVNYXBbZWRnZS50b107XG4gICAgICAgICAgdmFyIG5vZGVFZGdlTm9kZUxhYmVsID0gbm9kZS5sYWJlbCArIFwiLVwiICsgZWRnZS5sYWJlbCArIFwiLVwiICsgdG9Ob2RlLmxhYmVsO1xuICAgICAgICAgIGlmICghcm9vdFtub2RlRWRnZU5vZGVMYWJlbF0pIHJvb3Rbbm9kZUVkZ2VOb2RlTGFiZWxdID0ge1xuICAgICAgICAgICAgcHJvamVjdGVkOiBbXSxcbiAgICAgICAgICAgIG5vZGVMYWJlbDE6IG5vZGUubGFiZWwsXG4gICAgICAgICAgICBlZGdlTGFiZWw6IGVkZ2UubGFiZWwsXG4gICAgICAgICAgICBub2RlTGFiZWwyOiB0b05vZGUubGFiZWxcbiAgICAgICAgICB9O1xuICAgICAgICAgIHZhciBwZGZzID0ge1xuICAgICAgICAgICAgZ3JhcGhJZDogZ3JhcGhJZCxcbiAgICAgICAgICAgIGVkZ2U6IGVkZ2UsXG4gICAgICAgICAgICBwcmVOb2RlOiBudWxsXG4gICAgICAgICAgfTtcbiAgICAgICAgICByb290W25vZGVFZGdlTm9kZUxhYmVsXS5wcm9qZWN0ZWQucHVzaChwZGZzKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTsgLy8gTGluZSAzMTNcblxuICAgIE9iamVjdC5rZXlzKHJvb3QpLmZvckVhY2goZnVuY3Rpb24gKG5vZGVFZGdlTm9kZUxhYmVsKSB7XG4gICAgICB2YXIgX2EgPSByb290W25vZGVFZGdlTm9kZUxhYmVsXSxcbiAgICAgICAgICBwcm9qZWN0ZWQgPSBfYS5wcm9qZWN0ZWQsXG4gICAgICAgICAgbm9kZUxhYmVsMSA9IF9hLm5vZGVMYWJlbDEsXG4gICAgICAgICAgZWRnZUxhYmVsID0gX2EuZWRnZUxhYmVsLFxuICAgICAgICAgIG5vZGVMYWJlbDIgPSBfYS5ub2RlTGFiZWwyO1xuXG4gICAgICBfdGhpcy5kZnNDb2RlLmRmc0VkZ2VMaXN0LnB1c2gobmV3IERGU2VkZ2UoMCwgMSwgbm9kZUxhYmVsMSwgZWRnZUxhYmVsLCBub2RlTGFiZWwyKSk7XG5cbiAgICAgIF90aGlzLnN1YkdyYXBoTWluaW5nKHByb2plY3RlZCk7XG5cbiAgICAgIF90aGlzLmRmc0NvZGUuZGZzRWRnZUxpc3QucG9wKCk7XG4gICAgfSk7XG4gIH07XG5cbiAgcmV0dXJuIEdTcGFuO1xufSgpO1xuXG52YXIgZm9ybWF0R3JhcGhzID0gZnVuY3Rpb24gZm9ybWF0R3JhcGhzKGdyYXBocywgZGlyZWN0ZWQsIG5vZGVMYWJlbFByb3AsIGVkZ2VMYWJlbFByb3ApIHtcbiAgdmFyIHJlc3VsdCA9IHt9O1xuICBPYmplY3Qua2V5cyhncmFwaHMpLmZvckVhY2goZnVuY3Rpb24gKGtleSwgaSkge1xuICAgIHZhciBncmFwaCA9IGdyYXBoc1trZXldO1xuICAgIHZhciBmR3JhcGggPSBuZXcgX3N0cnVjdC5HcmFwaChpLCB0cnVlLCBkaXJlY3RlZCk7XG4gICAgdmFyIG5vZGVJZHhNYXAgPSB7fTtcbiAgICBncmFwaC5ub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChub2RlLCBqKSB7XG4gICAgICBmR3JhcGguYWRkTm9kZShqLCBub2RlW25vZGVMYWJlbFByb3BdKTtcbiAgICAgIG5vZGVJZHhNYXBbbm9kZS5pZF0gPSBqO1xuICAgIH0pO1xuICAgIGdyYXBoLmVkZ2VzLmZvckVhY2goZnVuY3Rpb24gKGVkZ2UsIGspIHtcbiAgICAgIHZhciBzb3VyY2VJZHggPSBub2RlSWR4TWFwW2VkZ2Uuc291cmNlXTtcbiAgICAgIHZhciB0YXJnZXRJZHggPSBub2RlSWR4TWFwW2VkZ2UudGFyZ2V0XTtcbiAgICAgIGZHcmFwaC5hZGRFZGdlKC0xLCBzb3VyY2VJZHgsIHRhcmdldElkeCwgZWRnZVtlZGdlTGFiZWxQcm9wXSk7XG4gICAgfSk7XG4gICAgaWYgKGZHcmFwaCAmJiBmR3JhcGguZ2V0Tm9kZU51bSgpKSByZXN1bHRbZkdyYXBoLmlkXSA9IGZHcmFwaDtcbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG52YXIgdG9HcmFwaERhdGFzID0gZnVuY3Rpb24gdG9HcmFwaERhdGFzKGdyYXBocywgbm9kZUxhYmVsUHJvcCwgZWRnZUxhYmVsUHJvcCkge1xuICB2YXIgcmVzdWx0ID0gW107XG4gIGdyYXBocy5mb3JFYWNoKGZ1bmN0aW9uIChncmFwaCkge1xuICAgIHZhciBncmFwaERhdGEgPSB7XG4gICAgICBub2RlczogW10sXG4gICAgICBlZGdlczogW11cbiAgICB9O1xuICAgIGdyYXBoLm5vZGVzLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgIHZhciBfYTtcblxuICAgICAgZ3JhcGhEYXRhLm5vZGVzLnB1c2goKF9hID0ge1xuICAgICAgICBpZDogXCJcIiArIG5vZGUuaWRcbiAgICAgIH0sIF9hW25vZGVMYWJlbFByb3BdID0gbm9kZS5sYWJlbCwgX2EpKTtcbiAgICB9KTtcbiAgICBncmFwaC5lZGdlcy5mb3JFYWNoKGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgICB2YXIgX2E7XG5cbiAgICAgIGdyYXBoRGF0YS5lZGdlcy5wdXNoKChfYSA9IHtcbiAgICAgICAgc291cmNlOiBcIlwiICsgZWRnZS5mcm9tLFxuICAgICAgICB0YXJnZXQ6IFwiXCIgKyBlZGdlLnRvXG4gICAgICB9LCBfYVtlZGdlTGFiZWxQcm9wXSA9IGVkZ2UubGFiZWwsIF9hKSk7XG4gICAgfSk7XG4gICAgcmVzdWx0LnB1c2goZ3JhcGhEYXRhKTtcbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG52YXIgREVGQVVMVF9MQUJFTF9OQU1FID0gXCJjbHVzdGVyXCI7XG4vKipcbiAqIGdTcGFuIOmikee5geWtkOWbvuiuoeeul+eul+azle+8iGZyZXF1ZW50IGdyYXBoIG1pbmluZ++8iVxuICogQHBhcmFtIHBhcmFtcyDlj4LmlbBcbiAqL1xuXG52YXIgZ1NwYW4gPSBmdW5jdGlvbiBnU3BhbihwYXJhbXMpIHtcbiAgLy8gLS0tLS0tLSDlsIblm77mlbDmja4gR3JhcGhEYXRhIOeahCBtYXAg6L2s5o2i5Li65qC85byPIC0tLS0tLS1cbiAgdmFyIGdyYXBocyA9IHBhcmFtcy5ncmFwaHMsXG4gICAgICBfYSA9IHBhcmFtcy5kaXJlY3RlZCxcbiAgICAgIGRpcmVjdGVkID0gX2EgPT09IHZvaWQgMCA/IGZhbHNlIDogX2EsXG4gICAgICBfYiA9IHBhcmFtcy5ub2RlTGFiZWxQcm9wLFxuICAgICAgbm9kZUxhYmVsUHJvcCA9IF9iID09PSB2b2lkIDAgPyBERUZBVUxUX0xBQkVMX05BTUUgOiBfYixcbiAgICAgIF9jID0gcGFyYW1zLmVkZ2VMYWJlbFByb3AsXG4gICAgICBlZGdlTGFiZWxQcm9wID0gX2MgPT09IHZvaWQgMCA/IERFRkFVTFRfTEFCRUxfTkFNRSA6IF9jO1xuICB2YXIgZm9ybWF0dGVkR3JhcGhzID0gZm9ybWF0R3JhcGhzKGdyYXBocywgZGlyZWN0ZWQsIG5vZGVMYWJlbFByb3AsIGVkZ2VMYWJlbFByb3ApO1xuICB2YXIgbWluU3VwcG9ydCA9IHBhcmFtcy5taW5TdXBwb3J0LFxuICAgICAgbWF4Tm9kZU51bSA9IHBhcmFtcy5tYXhOb2RlTnVtLFxuICAgICAgbWluTm9kZU51bSA9IHBhcmFtcy5taW5Ob2RlTnVtLFxuICAgICAgdmVyYm9zZSA9IHBhcmFtcy52ZXJib3NlLFxuICAgICAgdG9wID0gcGFyYW1zLnRvcDsgLy8gLS0tLS0tLSDliJ3lp4vljJbkuI7miafooYznrpfms5UgLS0tLS0tLVxuXG4gIHZhciBhbGdvUGFyYW1zID0ge1xuICAgIGdyYXBoczogZm9ybWF0dGVkR3JhcGhzLFxuICAgIG1pblN1cHBvcnQ6IG1pblN1cHBvcnQsXG4gICAgbWF4Tm9kZU51bTogbWF4Tm9kZU51bSxcbiAgICBtaW5Ob2RlTnVtOiBtaW5Ob2RlTnVtLFxuICAgIHRvcDogdG9wLFxuICAgIHZlcmJvc2U6IHZlcmJvc2UsXG4gICAgZGlyZWN0ZWQ6IGRpcmVjdGVkXG4gIH07XG4gIHZhciBjYWxjdWxhdG9yID0gbmV3IEdTcGFuKGFsZ29QYXJhbXMpO1xuICBjYWxjdWxhdG9yLnJ1bigpO1xuICB2YXIgcmVzdWx0ID0gdG9HcmFwaERhdGFzKGNhbGN1bGF0b3IuZnJlcXVlbnRTdWJncmFwaHMsIG5vZGVMYWJlbFByb3AsIGVkZ2VMYWJlbFByb3ApO1xuICByZXR1cm4gcmVzdWx0O1xufTtcblxudmFyIF9kZWZhdWx0ID0gZ1NwYW47XG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///312\n')},function(module,exports,__webpack_require__){"use strict";eval('\n\nObject.defineProperty(exports, "__esModule", {\n value: true\n});\nexports.Graph = exports.Node = exports.Edge = exports.AUTO_EDGE_ID = exports.VACANT_GRAPH_ID = exports.VACANT_NODE_LABEL = exports.VACANT_EDGE_LABEL = exports.VACANT_NODE_ID = exports.VACANT_EDGE_ID = void 0;\nvar VACANT_EDGE_ID = -1;\nexports.VACANT_EDGE_ID = VACANT_EDGE_ID;\nvar VACANT_NODE_ID = -1;\nexports.VACANT_NODE_ID = VACANT_NODE_ID;\nvar VACANT_EDGE_LABEL = "-1";\nexports.VACANT_EDGE_LABEL = VACANT_EDGE_LABEL;\nvar VACANT_NODE_LABEL = "-1";\nexports.VACANT_NODE_LABEL = VACANT_NODE_LABEL;\nvar VACANT_GRAPH_ID = -1;\nexports.VACANT_GRAPH_ID = VACANT_GRAPH_ID;\nvar AUTO_EDGE_ID = "-1";\nexports.AUTO_EDGE_ID = AUTO_EDGE_ID;\n\nvar Edge =\n/** @class */\nfunction () {\n function Edge(id, from, to, label) {\n if (id === void 0) {\n id = VACANT_EDGE_ID;\n }\n\n if (from === void 0) {\n from = VACANT_NODE_ID;\n }\n\n if (to === void 0) {\n to = VACANT_NODE_ID;\n }\n\n if (label === void 0) {\n label = VACANT_EDGE_LABEL;\n }\n\n this.id = id;\n this.from = from;\n this.to = to;\n this.label = label;\n }\n\n return Edge;\n}();\n\nexports.Edge = Edge;\n\nvar Node =\n/** @class */\nfunction () {\n function Node(id, label) {\n if (id === void 0) {\n id = VACANT_NODE_ID;\n }\n\n if (label === void 0) {\n label = VACANT_NODE_LABEL;\n }\n\n this.id = id;\n this.label = label;\n this.edges = [];\n this.edgeMap = {};\n }\n\n Node.prototype.addEdge = function (edge) {\n this.edges.push(edge);\n this.edgeMap[edge.id] = edge;\n };\n\n return Node;\n}();\n\nexports.Node = Node;\n\nvar Graph =\n/** @class */\nfunction () {\n function Graph(id, edgeIdAutoIncrease, directed) {\n if (id === void 0) {\n id = VACANT_NODE_ID;\n }\n\n if (edgeIdAutoIncrease === void 0) {\n edgeIdAutoIncrease = true;\n }\n\n if (directed === void 0) {\n directed = false;\n }\n\n this.id = id;\n this.edgeIdAutoIncrease = edgeIdAutoIncrease;\n this.edges = [];\n this.nodes = [];\n this.nodeMap = {};\n this.edgeMap = {};\n this.nodeLabelMap = {};\n this.edgeLabelMap = {};\n this.counter = 0;\n this.directed = directed;\n }\n\n Graph.prototype.getNodeNum = function () {\n return this.nodes.length;\n };\n\n Graph.prototype.addNode = function (id, label) {\n if (this.nodeMap[id]) return;\n var node = new Node(id, label);\n this.nodes.push(node);\n this.nodeMap[id] = node;\n if (!this.nodeLabelMap[label]) this.nodeLabelMap[label] = [];\n this.nodeLabelMap[label].push(id);\n };\n\n Graph.prototype.addEdge = function (id, from, to, label) {\n if (this.edgeIdAutoIncrease || id === undefined) id = this.counter++;\n if (this.nodeMap[from] && this.nodeMap[to] && this.nodeMap[to].edgeMap[id]) return;\n var edge = new Edge(id, from, to, label);\n this.edges.push(edge);\n this.edgeMap[id] = edge;\n this.nodeMap[from].addEdge(edge);\n if (!this.edgeLabelMap[label]) this.edgeLabelMap[label] = [];\n this.edgeLabelMap[label].push(edge);\n\n if (!this.directed) {\n var rEdge = new Edge(id, to, from, label);\n this.nodeMap[to].addEdge(rEdge);\n this.edgeLabelMap[label].push(rEdge);\n }\n };\n\n return Graph;\n}();\n\nexports.Graph = Graph;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFudHYvYWxnb3JpdGhtL2xpYi9nU3Bhbi9zdHJ1Y3QuanM/OTE1NCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBYTs7QUFFYjtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDOztBQUVEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQzs7QUFFRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLENBQUM7O0FBRUQiLCJmaWxlIjoiMzEzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLkdyYXBoID0gZXhwb3J0cy5Ob2RlID0gZXhwb3J0cy5FZGdlID0gZXhwb3J0cy5BVVRPX0VER0VfSUQgPSBleHBvcnRzLlZBQ0FOVF9HUkFQSF9JRCA9IGV4cG9ydHMuVkFDQU5UX05PREVfTEFCRUwgPSBleHBvcnRzLlZBQ0FOVF9FREdFX0xBQkVMID0gZXhwb3J0cy5WQUNBTlRfTk9ERV9JRCA9IGV4cG9ydHMuVkFDQU5UX0VER0VfSUQgPSB2b2lkIDA7XG52YXIgVkFDQU5UX0VER0VfSUQgPSAtMTtcbmV4cG9ydHMuVkFDQU5UX0VER0VfSUQgPSBWQUNBTlRfRURHRV9JRDtcbnZhciBWQUNBTlRfTk9ERV9JRCA9IC0xO1xuZXhwb3J0cy5WQUNBTlRfTk9ERV9JRCA9IFZBQ0FOVF9OT0RFX0lEO1xudmFyIFZBQ0FOVF9FREdFX0xBQkVMID0gXCItMVwiO1xuZXhwb3J0cy5WQUNBTlRfRURHRV9MQUJFTCA9IFZBQ0FOVF9FREdFX0xBQkVMO1xudmFyIFZBQ0FOVF9OT0RFX0xBQkVMID0gXCItMVwiO1xuZXhwb3J0cy5WQUNBTlRfTk9ERV9MQUJFTCA9IFZBQ0FOVF9OT0RFX0xBQkVMO1xudmFyIFZBQ0FOVF9HUkFQSF9JRCA9IC0xO1xuZXhwb3J0cy5WQUNBTlRfR1JBUEhfSUQgPSBWQUNBTlRfR1JBUEhfSUQ7XG52YXIgQVVUT19FREdFX0lEID0gXCItMVwiO1xuZXhwb3J0cy5BVVRPX0VER0VfSUQgPSBBVVRPX0VER0VfSUQ7XG5cbnZhciBFZGdlID1cbi8qKiBAY2xhc3MgKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gRWRnZShpZCwgZnJvbSwgdG8sIGxhYmVsKSB7XG4gICAgaWYgKGlkID09PSB2b2lkIDApIHtcbiAgICAgIGlkID0gVkFDQU5UX0VER0VfSUQ7XG4gICAgfVxuXG4gICAgaWYgKGZyb20gPT09IHZvaWQgMCkge1xuICAgICAgZnJvbSA9IFZBQ0FOVF9OT0RFX0lEO1xuICAgIH1cblxuICAgIGlmICh0byA9PT0gdm9pZCAwKSB7XG4gICAgICB0byA9IFZBQ0FOVF9OT0RFX0lEO1xuICAgIH1cblxuICAgIGlmIChsYWJlbCA9PT0gdm9pZCAwKSB7XG4gICAgICBsYWJlbCA9IFZBQ0FOVF9FREdFX0xBQkVMO1xuICAgIH1cblxuICAgIHRoaXMuaWQgPSBpZDtcbiAgICB0aGlzLmZyb20gPSBmcm9tO1xuICAgIHRoaXMudG8gPSB0bztcbiAgICB0aGlzLmxhYmVsID0gbGFiZWw7XG4gIH1cblxuICByZXR1cm4gRWRnZTtcbn0oKTtcblxuZXhwb3J0cy5FZGdlID0gRWRnZTtcblxudmFyIE5vZGUgPVxuLyoqIEBjbGFzcyAqL1xuZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBOb2RlKGlkLCBsYWJlbCkge1xuICAgIGlmIChpZCA9PT0gdm9pZCAwKSB7XG4gICAgICBpZCA9IFZBQ0FOVF9OT0RFX0lEO1xuICAgIH1cblxuICAgIGlmIChsYWJlbCA9PT0gdm9pZCAwKSB7XG4gICAgICBsYWJlbCA9IFZBQ0FOVF9OT0RFX0xBQkVMO1xuICAgIH1cblxuICAgIHRoaXMuaWQgPSBpZDtcbiAgICB0aGlzLmxhYmVsID0gbGFiZWw7XG4gICAgdGhpcy5lZGdlcyA9IFtdO1xuICAgIHRoaXMuZWRnZU1hcCA9IHt9O1xuICB9XG5cbiAgTm9kZS5wcm90b3R5cGUuYWRkRWRnZSA9IGZ1bmN0aW9uIChlZGdlKSB7XG4gICAgdGhpcy5lZGdlcy5wdXNoKGVkZ2UpO1xuICAgIHRoaXMuZWRnZU1hcFtlZGdlLmlkXSA9IGVkZ2U7XG4gIH07XG5cbiAgcmV0dXJuIE5vZGU7XG59KCk7XG5cbmV4cG9ydHMuTm9kZSA9IE5vZGU7XG5cbnZhciBHcmFwaCA9XG4vKiogQGNsYXNzICovXG5mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEdyYXBoKGlkLCBlZGdlSWRBdXRvSW5jcmVhc2UsIGRpcmVjdGVkKSB7XG4gICAgaWYgKGlkID09PSB2b2lkIDApIHtcbiAgICAgIGlkID0gVkFDQU5UX05PREVfSUQ7XG4gICAgfVxuXG4gICAgaWYgKGVkZ2VJZEF1dG9JbmNyZWFzZSA9PT0gdm9pZCAwKSB7XG4gICAgICBlZGdlSWRBdXRvSW5jcmVhc2UgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChkaXJlY3RlZCA9PT0gdm9pZCAwKSB7XG4gICAgICBkaXJlY3RlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIHRoaXMuaWQgPSBpZDtcbiAgICB0aGlzLmVkZ2VJZEF1dG9JbmNyZWFzZSA9IGVkZ2VJZEF1dG9JbmNyZWFzZTtcbiAgICB0aGlzLmVkZ2VzID0gW107XG4gICAgdGhpcy5ub2RlcyA9IFtdO1xuICAgIHRoaXMubm9kZU1hcCA9IHt9O1xuICAgIHRoaXMuZWRnZU1hcCA9IHt9O1xuICAgIHRoaXMubm9kZUxhYmVsTWFwID0ge307XG4gICAgdGhpcy5lZGdlTGFiZWxNYXAgPSB7fTtcbiAgICB0aGlzLmNvdW50ZXIgPSAwO1xuICAgIHRoaXMuZGlyZWN0ZWQgPSBkaXJlY3RlZDtcbiAgfVxuXG4gIEdyYXBoLnByb3RvdHlwZS5nZXROb2RlTnVtID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLm5vZGVzLmxlbmd0aDtcbiAgfTtcblxuICBHcmFwaC5wcm90b3R5cGUuYWRkTm9kZSA9IGZ1bmN0aW9uIChpZCwgbGFiZWwpIHtcbiAgICBpZiAodGhpcy5ub2RlTWFwW2lkXSkgcmV0dXJuO1xuICAgIHZhciBub2RlID0gbmV3IE5vZGUoaWQsIGxhYmVsKTtcbiAgICB0aGlzLm5vZGVzLnB1c2gobm9kZSk7XG4gICAgdGhpcy5ub2RlTWFwW2lkXSA9IG5vZGU7XG4gICAgaWYgKCF0aGlzLm5vZGVMYWJlbE1hcFtsYWJlbF0pIHRoaXMubm9kZUxhYmVsTWFwW2xhYmVsXSA9IFtdO1xuICAgIHRoaXMubm9kZUxhYmVsTWFwW2xhYmVsXS5wdXNoKGlkKTtcbiAgfTtcblxuICBHcmFwaC5wcm90b3R5cGUuYWRkRWRnZSA9IGZ1bmN0aW9uIChpZCwgZnJvbSwgdG8sIGxhYmVsKSB7XG4gICAgaWYgKHRoaXMuZWRnZUlkQXV0b0luY3JlYXNlIHx8IGlkID09PSB1bmRlZmluZWQpIGlkID0gdGhpcy5jb3VudGVyKys7XG4gICAgaWYgKHRoaXMubm9kZU1hcFtmcm9tXSAmJiB0aGlzLm5vZGVNYXBbdG9dICYmIHRoaXMubm9kZU1hcFt0b10uZWRnZU1hcFtpZF0pIHJldHVybjtcbiAgICB2YXIgZWRnZSA9IG5ldyBFZGdlKGlkLCBmcm9tLCB0bywgbGFiZWwpO1xuICAgIHRoaXMuZWRnZXMucHVzaChlZGdlKTtcbiAgICB0aGlzLmVkZ2VNYXBbaWRdID0gZWRnZTtcbiAgICB0aGlzLm5vZGVNYXBbZnJvbV0uYWRkRWRnZShlZGdlKTtcbiAgICBpZiAoIXRoaXMuZWRnZUxhYmVsTWFwW2xhYmVsXSkgdGhpcy5lZGdlTGFiZWxNYXBbbGFiZWxdID0gW107XG4gICAgdGhpcy5lZGdlTGFiZWxNYXBbbGFiZWxdLnB1c2goZWRnZSk7XG5cbiAgICBpZiAoIXRoaXMuZGlyZWN0ZWQpIHtcbiAgICAgIHZhciByRWRnZSA9IG5ldyBFZGdlKGlkLCB0bywgZnJvbSwgbGFiZWwpO1xuICAgICAgdGhpcy5ub2RlTWFwW3RvXS5hZGRFZGdlKHJFZGdlKTtcbiAgICAgIHRoaXMuZWRnZUxhYmVsTWFwW2xhYmVsXS5wdXNoKHJFZGdlKTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIEdyYXBoO1xufSgpO1xuXG5leHBvcnRzLkdyYXBoID0gR3JhcGg7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///313\n')},function(module,exports,__webpack_require__){eval("/* MIT license */\nvar colorNames = __webpack_require__(315);\nvar swizzle = __webpack_require__(316);\n\nvar reverseNames = {};\n\n// create a list of reverse color names\nfor (var name in colorNames) {\n\tif (colorNames.hasOwnProperty(name)) {\n\t\treverseNames[colorNames[name]] = name;\n\t}\n}\n\nvar cs = module.exports = {\n\tto: {},\n\tget: {}\n};\n\ncs.get = function (string) {\n\tvar prefix = string.substring(0, 3).toLowerCase();\n\tvar val;\n\tvar model;\n\tswitch (prefix) {\n\t\tcase 'hsl':\n\t\t\tval = cs.get.hsl(string);\n\t\t\tmodel = 'hsl';\n\t\t\tbreak;\n\t\tcase 'hwb':\n\t\t\tval = cs.get.hwb(string);\n\t\t\tmodel = 'hwb';\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tval = cs.get.rgb(string);\n\t\t\tmodel = 'rgb';\n\t\t\tbreak;\n\t}\n\n\tif (!val) {\n\t\treturn null;\n\t}\n\n\treturn {model: model, value: val};\n};\n\ncs.get.rgb = function (string) {\n\tif (!string) {\n\t\treturn null;\n\t}\n\n\tvar abbr = /^#([a-f0-9]{3,4})$/i;\n\tvar hex = /^#([a-f0-9]{6})([a-f0-9]{2})?$/i;\n\tvar rgba = /^rgba?\\(\\s*([+-]?\\d+)\\s*,\\s*([+-]?\\d+)\\s*,\\s*([+-]?\\d+)\\s*(?:,\\s*([+-]?[\\d\\.]+)\\s*)?\\)$/;\n\tvar per = /^rgba?\\(\\s*([+-]?[\\d\\.]+)\\%\\s*,\\s*([+-]?[\\d\\.]+)\\%\\s*,\\s*([+-]?[\\d\\.]+)\\%\\s*(?:,\\s*([+-]?[\\d\\.]+)\\s*)?\\)$/;\n\tvar keyword = /(\\D+)/;\n\n\tvar rgb = [0, 0, 0, 1];\n\tvar match;\n\tvar i;\n\tvar hexAlpha;\n\n\tif (match = string.match(hex)) {\n\t\thexAlpha = match[2];\n\t\tmatch = match[1];\n\n\t\tfor (i = 0; i < 3; i++) {\n\t\t\t// https://jsperf.com/slice-vs-substr-vs-substring-methods-long-string/19\n\t\t\tvar i2 = i * 2;\n\t\t\trgb[i] = parseInt(match.slice(i2, i2 + 2), 16);\n\t\t}\n\n\t\tif (hexAlpha) {\n\t\t\trgb[3] = parseInt(hexAlpha, 16) / 255;\n\t\t}\n\t} else if (match = string.match(abbr)) {\n\t\tmatch = match[1];\n\t\thexAlpha = match[3];\n\n\t\tfor (i = 0; i < 3; i++) {\n\t\t\trgb[i] = parseInt(match[i] + match[i], 16);\n\t\t}\n\n\t\tif (hexAlpha) {\n\t\t\trgb[3] = parseInt(hexAlpha + hexAlpha, 16) / 255;\n\t\t}\n\t} else if (match = string.match(rgba)) {\n\t\tfor (i = 0; i < 3; i++) {\n\t\t\trgb[i] = parseInt(match[i + 1], 0);\n\t\t}\n\n\t\tif (match[4]) {\n\t\t\trgb[3] = parseFloat(match[4]);\n\t\t}\n\t} else if (match = string.match(per)) {\n\t\tfor (i = 0; i < 3; i++) {\n\t\t\trgb[i] = Math.round(parseFloat(match[i + 1]) * 2.55);\n\t\t}\n\n\t\tif (match[4]) {\n\t\t\trgb[3] = parseFloat(match[4]);\n\t\t}\n\t} else if (match = string.match(keyword)) {\n\t\tif (match[1] === 'transparent') {\n\t\t\treturn [0, 0, 0, 0];\n\t\t}\n\n\t\trgb = colorNames[match[1]];\n\n\t\tif (!rgb) {\n\t\t\treturn null;\n\t\t}\n\n\t\trgb[3] = 1;\n\n\t\treturn rgb;\n\t} else {\n\t\treturn null;\n\t}\n\n\tfor (i = 0; i < 3; i++) {\n\t\trgb[i] = clamp(rgb[i], 0, 255);\n\t}\n\trgb[3] = clamp(rgb[3], 0, 1);\n\n\treturn rgb;\n};\n\ncs.get.hsl = function (string) {\n\tif (!string) {\n\t\treturn null;\n\t}\n\n\tvar hsl = /^hsla?\\(\\s*([+-]?(?:\\d{0,3}\\.)?\\d+)(?:deg)?\\s*,?\\s*([+-]?[\\d\\.]+)%\\s*,?\\s*([+-]?[\\d\\.]+)%\\s*(?:[,|\\/]\\s*([+-]?[\\d\\.]+)\\s*)?\\)$/;\n\tvar match = string.match(hsl);\n\n\tif (match) {\n\t\tvar alpha = parseFloat(match[4]);\n\t\tvar h = (parseFloat(match[1]) + 360) % 360;\n\t\tvar s = clamp(parseFloat(match[2]), 0, 100);\n\t\tvar l = clamp(parseFloat(match[3]), 0, 100);\n\t\tvar a = clamp(isNaN(alpha) ? 1 : alpha, 0, 1);\n\n\t\treturn [h, s, l, a];\n\t}\n\n\treturn null;\n};\n\ncs.get.hwb = function (string) {\n\tif (!string) {\n\t\treturn null;\n\t}\n\n\tvar hwb = /^hwb\\(\\s*([+-]?\\d{0,3}(?:\\.\\d+)?)(?:deg)?\\s*,\\s*([+-]?[\\d\\.]+)%\\s*,\\s*([+-]?[\\d\\.]+)%\\s*(?:,\\s*([+-]?[\\d\\.]+)\\s*)?\\)$/;\n\tvar match = string.match(hwb);\n\n\tif (match) {\n\t\tvar alpha = parseFloat(match[4]);\n\t\tvar h = ((parseFloat(match[1]) % 360) + 360) % 360;\n\t\tvar w = clamp(parseFloat(match[2]), 0, 100);\n\t\tvar b = clamp(parseFloat(match[3]), 0, 100);\n\t\tvar a = clamp(isNaN(alpha) ? 1 : alpha, 0, 1);\n\t\treturn [h, w, b, a];\n\t}\n\n\treturn null;\n};\n\ncs.to.hex = function () {\n\tvar rgba = swizzle(arguments);\n\n\treturn (\n\t\t'#' +\n\t\thexDouble(rgba[0]) +\n\t\thexDouble(rgba[1]) +\n\t\thexDouble(rgba[2]) +\n\t\t(rgba[3] < 1\n\t\t\t? (hexDouble(Math.round(rgba[3] * 255)))\n\t\t\t: '')\n\t);\n};\n\ncs.to.rgb = function () {\n\tvar rgba = swizzle(arguments);\n\n\treturn rgba.length < 4 || rgba[3] === 1\n\t\t? 'rgb(' + Math.round(rgba[0]) + ', ' + Math.round(rgba[1]) + ', ' + Math.round(rgba[2]) + ')'\n\t\t: 'rgba(' + Math.round(rgba[0]) + ', ' + Math.round(rgba[1]) + ', ' + Math.round(rgba[2]) + ', ' + rgba[3] + ')';\n};\n\ncs.to.rgb.percent = function () {\n\tvar rgba = swizzle(arguments);\n\n\tvar r = Math.round(rgba[0] / 255 * 100);\n\tvar g = Math.round(rgba[1] / 255 * 100);\n\tvar b = Math.round(rgba[2] / 255 * 100);\n\n\treturn rgba.length < 4 || rgba[3] === 1\n\t\t? 'rgb(' + r + '%, ' + g + '%, ' + b + '%)'\n\t\t: 'rgba(' + r + '%, ' + g + '%, ' + b + '%, ' + rgba[3] + ')';\n};\n\ncs.to.hsl = function () {\n\tvar hsla = swizzle(arguments);\n\treturn hsla.length < 4 || hsla[3] === 1\n\t\t? 'hsl(' + hsla[0] + ', ' + hsla[1] + '%, ' + hsla[2] + '%)'\n\t\t: 'hsla(' + hsla[0] + ', ' + hsla[1] + '%, ' + hsla[2] + '%, ' + hsla[3] + ')';\n};\n\n// hwb is a bit different than rgb(a) & hsl(a) since there is no alpha specific syntax\n// (hwb have alpha optional & 1 is default value)\ncs.to.hwb = function () {\n\tvar hwba = swizzle(arguments);\n\n\tvar a = '';\n\tif (hwba.length >= 4 && hwba[3] !== 1) {\n\t\ta = ', ' + hwba[3];\n\t}\n\n\treturn 'hwb(' + hwba[0] + ', ' + hwba[1] + '%, ' + hwba[2] + '%' + a + ')';\n};\n\ncs.to.keyword = function (rgb) {\n\treturn reverseNames[rgb.slice(0, 3)];\n};\n\n// helpers\nfunction clamp(num, min, max) {\n\treturn Math.min(Math.max(min, num), max);\n}\n\nfunction hexDouble(num) {\n\tvar str = num.toString(16).toUpperCase();\n\treturn (str.length < 2) ? '0' + str : str;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29sb3Itc3RyaW5nL2luZGV4LmpzPzFhYjkiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQSxpQkFBaUIsbUJBQU8sQ0FBQyxHQUFZO0FBQ3JDLGNBQWMsbUJBQU8sQ0FBQyxHQUFnQjs7QUFFdEM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEseUJBQXlCLElBQUk7QUFDN0Isd0JBQXdCLEVBQUUsV0FBVyxFQUFFO0FBQ3ZDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBOztBQUVBLGFBQWEsT0FBTztBQUNwQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRixhQUFhLE9BQU87QUFDcEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0YsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxFQUFFO0FBQ0Y7QUFDQTs7QUFFQSxZQUFZLE9BQU87QUFDbkI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsbUNBQW1DLElBQUk7QUFDdkM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSw4QkFBOEIsSUFBSTtBQUNsQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiIzMTQuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBNSVQgbGljZW5zZSAqL1xudmFyIGNvbG9yTmFtZXMgPSByZXF1aXJlKCdjb2xvci1uYW1lJyk7XG52YXIgc3dpenpsZSA9IHJlcXVpcmUoJ3NpbXBsZS1zd2l6emxlJyk7XG5cbnZhciByZXZlcnNlTmFtZXMgPSB7fTtcblxuLy8gY3JlYXRlIGEgbGlzdCBvZiByZXZlcnNlIGNvbG9yIG5hbWVzXG5mb3IgKHZhciBuYW1lIGluIGNvbG9yTmFtZXMpIHtcblx0aWYgKGNvbG9yTmFtZXMuaGFzT3duUHJvcGVydHkobmFtZSkpIHtcblx0XHRyZXZlcnNlTmFtZXNbY29sb3JOYW1lc1tuYW1lXV0gPSBuYW1lO1xuXHR9XG59XG5cbnZhciBjcyA9IG1vZHVsZS5leHBvcnRzID0ge1xuXHR0bzoge30sXG5cdGdldDoge31cbn07XG5cbmNzLmdldCA9IGZ1bmN0aW9uIChzdHJpbmcpIHtcblx0dmFyIHByZWZpeCA9IHN0cmluZy5zdWJzdHJpbmcoMCwgMykudG9Mb3dlckNhc2UoKTtcblx0dmFyIHZhbDtcblx0dmFyIG1vZGVsO1xuXHRzd2l0Y2ggKHByZWZpeCkge1xuXHRcdGNhc2UgJ2hzbCc6XG5cdFx0XHR2YWwgPSBjcy5nZXQuaHNsKHN0cmluZyk7XG5cdFx0XHRtb2RlbCA9ICdoc2wnO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSAnaHdiJzpcblx0XHRcdHZhbCA9IGNzLmdldC5od2Ioc3RyaW5nKTtcblx0XHRcdG1vZGVsID0gJ2h3Yic7XG5cdFx0XHRicmVhaztcblx0XHRkZWZhdWx0OlxuXHRcdFx0dmFsID0gY3MuZ2V0LnJnYihzdHJpbmcpO1xuXHRcdFx0bW9kZWwgPSAncmdiJztcblx0XHRcdGJyZWFrO1xuXHR9XG5cblx0aWYgKCF2YWwpIHtcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdHJldHVybiB7bW9kZWw6IG1vZGVsLCB2YWx1ZTogdmFsfTtcbn07XG5cbmNzLmdldC5yZ2IgPSBmdW5jdGlvbiAoc3RyaW5nKSB7XG5cdGlmICghc3RyaW5nKSB7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHR2YXIgYWJiciA9IC9eIyhbYS1mMC05XXszLDR9KSQvaTtcblx0dmFyIGhleCA9IC9eIyhbYS1mMC05XXs2fSkoW2EtZjAtOV17Mn0pPyQvaTtcblx0dmFyIHJnYmEgPSAvXnJnYmE/XFwoXFxzKihbKy1dP1xcZCspXFxzKixcXHMqKFsrLV0/XFxkKylcXHMqLFxccyooWystXT9cXGQrKVxccyooPzosXFxzKihbKy1dP1tcXGRcXC5dKylcXHMqKT9cXCkkLztcblx0dmFyIHBlciA9IC9ecmdiYT9cXChcXHMqKFsrLV0/W1xcZFxcLl0rKVxcJVxccyosXFxzKihbKy1dP1tcXGRcXC5dKylcXCVcXHMqLFxccyooWystXT9bXFxkXFwuXSspXFwlXFxzKig/OixcXHMqKFsrLV0/W1xcZFxcLl0rKVxccyopP1xcKSQvO1xuXHR2YXIga2V5d29yZCA9IC8oXFxEKykvO1xuXG5cdHZhciByZ2IgPSBbMCwgMCwgMCwgMV07XG5cdHZhciBtYXRjaDtcblx0dmFyIGk7XG5cdHZhciBoZXhBbHBoYTtcblxuXHRpZiAobWF0Y2ggPSBzdHJpbmcubWF0Y2goaGV4KSkge1xuXHRcdGhleEFscGhhID0gbWF0Y2hbMl07XG5cdFx0bWF0Y2ggPSBtYXRjaFsxXTtcblxuXHRcdGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHtcblx0XHRcdC8vIGh0dHBzOi8vanNwZXJmLmNvbS9zbGljZS12cy1zdWJzdHItdnMtc3Vic3RyaW5nLW1ldGhvZHMtbG9uZy1zdHJpbmcvMTlcblx0XHRcdHZhciBpMiA9IGkgKiAyO1xuXHRcdFx0cmdiW2ldID0gcGFyc2VJbnQobWF0Y2guc2xpY2UoaTIsIGkyICsgMiksIDE2KTtcblx0XHR9XG5cblx0XHRpZiAoaGV4QWxwaGEpIHtcblx0XHRcdHJnYlszXSA9IHBhcnNlSW50KGhleEFscGhhLCAxNikgLyAyNTU7XG5cdFx0fVxuXHR9IGVsc2UgaWYgKG1hdGNoID0gc3RyaW5nLm1hdGNoKGFiYnIpKSB7XG5cdFx0bWF0Y2ggPSBtYXRjaFsxXTtcblx0XHRoZXhBbHBoYSA9IG1hdGNoWzNdO1xuXG5cdFx0Zm9yIChpID0gMDsgaSA8IDM7IGkrKykge1xuXHRcdFx0cmdiW2ldID0gcGFyc2VJbnQobWF0Y2hbaV0gKyBtYXRjaFtpXSwgMTYpO1xuXHRcdH1cblxuXHRcdGlmIChoZXhBbHBoYSkge1xuXHRcdFx0cmdiWzNdID0gcGFyc2VJbnQoaGV4QWxwaGEgKyBoZXhBbHBoYSwgMTYpIC8gMjU1O1xuXHRcdH1cblx0fSBlbHNlIGlmIChtYXRjaCA9IHN0cmluZy5tYXRjaChyZ2JhKSkge1xuXHRcdGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHtcblx0XHRcdHJnYltpXSA9IHBhcnNlSW50KG1hdGNoW2kgKyAxXSwgMCk7XG5cdFx0fVxuXG5cdFx0aWYgKG1hdGNoWzRdKSB7XG5cdFx0XHRyZ2JbM10gPSBwYXJzZUZsb2F0KG1hdGNoWzRdKTtcblx0XHR9XG5cdH0gZWxzZSBpZiAobWF0Y2ggPSBzdHJpbmcubWF0Y2gocGVyKSkge1xuXHRcdGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHtcblx0XHRcdHJnYltpXSA9IE1hdGgucm91bmQocGFyc2VGbG9hdChtYXRjaFtpICsgMV0pICogMi41NSk7XG5cdFx0fVxuXG5cdFx0aWYgKG1hdGNoWzRdKSB7XG5cdFx0XHRyZ2JbM10gPSBwYXJzZUZsb2F0KG1hdGNoWzRdKTtcblx0XHR9XG5cdH0gZWxzZSBpZiAobWF0Y2ggPSBzdHJpbmcubWF0Y2goa2V5d29yZCkpIHtcblx0XHRpZiAobWF0Y2hbMV0gPT09ICd0cmFuc3BhcmVudCcpIHtcblx0XHRcdHJldHVybiBbMCwgMCwgMCwgMF07XG5cdFx0fVxuXG5cdFx0cmdiID0gY29sb3JOYW1lc1ttYXRjaFsxXV07XG5cblx0XHRpZiAoIXJnYikge1xuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXG5cdFx0cmdiWzNdID0gMTtcblxuXHRcdHJldHVybiByZ2I7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHRmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7XG5cdFx0cmdiW2ldID0gY2xhbXAocmdiW2ldLCAwLCAyNTUpO1xuXHR9XG5cdHJnYlszXSA9IGNsYW1wKHJnYlszXSwgMCwgMSk7XG5cblx0cmV0dXJuIHJnYjtcbn07XG5cbmNzLmdldC5oc2wgPSBmdW5jdGlvbiAoc3RyaW5nKSB7XG5cdGlmICghc3RyaW5nKSB7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHR2YXIgaHNsID0gL15oc2xhP1xcKFxccyooWystXT8oPzpcXGR7MCwzfVxcLik/XFxkKykoPzpkZWcpP1xccyosP1xccyooWystXT9bXFxkXFwuXSspJVxccyosP1xccyooWystXT9bXFxkXFwuXSspJVxccyooPzpbLHxcXC9dXFxzKihbKy1dP1tcXGRcXC5dKylcXHMqKT9cXCkkLztcblx0dmFyIG1hdGNoID0gc3RyaW5nLm1hdGNoKGhzbCk7XG5cblx0aWYgKG1hdGNoKSB7XG5cdFx0dmFyIGFscGhhID0gcGFyc2VGbG9hdChtYXRjaFs0XSk7XG5cdFx0dmFyIGggPSAocGFyc2VGbG9hdChtYXRjaFsxXSkgKyAzNjApICUgMzYwO1xuXHRcdHZhciBzID0gY2xhbXAocGFyc2VGbG9hdChtYXRjaFsyXSksIDAsIDEwMCk7XG5cdFx0dmFyIGwgPSBjbGFtcChwYXJzZUZsb2F0KG1hdGNoWzNdKSwgMCwgMTAwKTtcblx0XHR2YXIgYSA9IGNsYW1wKGlzTmFOKGFscGhhKSA/IDEgOiBhbHBoYSwgMCwgMSk7XG5cblx0XHRyZXR1cm4gW2gsIHMsIGwsIGFdO1xuXHR9XG5cblx0cmV0dXJuIG51bGw7XG59O1xuXG5jcy5nZXQuaHdiID0gZnVuY3Rpb24gKHN0cmluZykge1xuXHRpZiAoIXN0cmluZykge1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0dmFyIGh3YiA9IC9eaHdiXFwoXFxzKihbKy1dP1xcZHswLDN9KD86XFwuXFxkKyk/KSg/OmRlZyk/XFxzKixcXHMqKFsrLV0/W1xcZFxcLl0rKSVcXHMqLFxccyooWystXT9bXFxkXFwuXSspJVxccyooPzosXFxzKihbKy1dP1tcXGRcXC5dKylcXHMqKT9cXCkkLztcblx0dmFyIG1hdGNoID0gc3RyaW5nLm1hdGNoKGh3Yik7XG5cblx0aWYgKG1hdGNoKSB7XG5cdFx0dmFyIGFscGhhID0gcGFyc2VGbG9hdChtYXRjaFs0XSk7XG5cdFx0dmFyIGggPSAoKHBhcnNlRmxvYXQobWF0Y2hbMV0pICUgMzYwKSArIDM2MCkgJSAzNjA7XG5cdFx0dmFyIHcgPSBjbGFtcChwYXJzZUZsb2F0KG1hdGNoWzJdKSwgMCwgMTAwKTtcblx0XHR2YXIgYiA9IGNsYW1wKHBhcnNlRmxvYXQobWF0Y2hbM10pLCAwLCAxMDApO1xuXHRcdHZhciBhID0gY2xhbXAoaXNOYU4oYWxwaGEpID8gMSA6IGFscGhhLCAwLCAxKTtcblx0XHRyZXR1cm4gW2gsIHcsIGIsIGFdO1xuXHR9XG5cblx0cmV0dXJuIG51bGw7XG59O1xuXG5jcy50by5oZXggPSBmdW5jdGlvbiAoKSB7XG5cdHZhciByZ2JhID0gc3dpenpsZShhcmd1bWVudHMpO1xuXG5cdHJldHVybiAoXG5cdFx0JyMnICtcblx0XHRoZXhEb3VibGUocmdiYVswXSkgK1xuXHRcdGhleERvdWJsZShyZ2JhWzFdKSArXG5cdFx0aGV4RG91YmxlKHJnYmFbMl0pICtcblx0XHQocmdiYVszXSA8IDFcblx0XHRcdD8gKGhleERvdWJsZShNYXRoLnJvdW5kKHJnYmFbM10gKiAyNTUpKSlcblx0XHRcdDogJycpXG5cdCk7XG59O1xuXG5jcy50by5yZ2IgPSBmdW5jdGlvbiAoKSB7XG5cdHZhciByZ2JhID0gc3dpenpsZShhcmd1bWVudHMpO1xuXG5cdHJldHVybiByZ2JhLmxlbmd0aCA8IDQgfHwgcmdiYVszXSA9PT0gMVxuXHRcdD8gJ3JnYignICsgTWF0aC5yb3VuZChyZ2JhWzBdKSArICcsICcgKyBNYXRoLnJvdW5kKHJnYmFbMV0pICsgJywgJyArIE1hdGgucm91bmQocmdiYVsyXSkgKyAnKSdcblx0XHQ6ICdyZ2JhKCcgKyBNYXRoLnJvdW5kKHJnYmFbMF0pICsgJywgJyArIE1hdGgucm91bmQocmdiYVsxXSkgKyAnLCAnICsgTWF0aC5yb3VuZChyZ2JhWzJdKSArICcsICcgKyByZ2JhWzNdICsgJyknO1xufTtcblxuY3MudG8ucmdiLnBlcmNlbnQgPSBmdW5jdGlvbiAoKSB7XG5cdHZhciByZ2JhID0gc3dpenpsZShhcmd1bWVudHMpO1xuXG5cdHZhciByID0gTWF0aC5yb3VuZChyZ2JhWzBdIC8gMjU1ICogMTAwKTtcblx0dmFyIGcgPSBNYXRoLnJvdW5kKHJnYmFbMV0gLyAyNTUgKiAxMDApO1xuXHR2YXIgYiA9IE1hdGgucm91bmQocmdiYVsyXSAvIDI1NSAqIDEwMCk7XG5cblx0cmV0dXJuIHJnYmEubGVuZ3RoIDwgNCB8fCByZ2JhWzNdID09PSAxXG5cdFx0PyAncmdiKCcgKyByICsgJyUsICcgKyBnICsgJyUsICcgKyBiICsgJyUpJ1xuXHRcdDogJ3JnYmEoJyArIHIgKyAnJSwgJyArIGcgKyAnJSwgJyArIGIgKyAnJSwgJyArIHJnYmFbM10gKyAnKSc7XG59O1xuXG5jcy50by5oc2wgPSBmdW5jdGlvbiAoKSB7XG5cdHZhciBoc2xhID0gc3dpenpsZShhcmd1bWVudHMpO1xuXHRyZXR1cm4gaHNsYS5sZW5ndGggPCA0IHx8IGhzbGFbM10gPT09IDFcblx0XHQ/ICdoc2woJyArIGhzbGFbMF0gKyAnLCAnICsgaHNsYVsxXSArICclLCAnICsgaHNsYVsyXSArICclKSdcblx0XHQ6ICdoc2xhKCcgKyBoc2xhWzBdICsgJywgJyArIGhzbGFbMV0gKyAnJSwgJyArIGhzbGFbMl0gKyAnJSwgJyArIGhzbGFbM10gKyAnKSc7XG59O1xuXG4vLyBod2IgaXMgYSBiaXQgZGlmZmVyZW50IHRoYW4gcmdiKGEpICYgaHNsKGEpIHNpbmNlIHRoZXJlIGlzIG5vIGFscGhhIHNwZWNpZmljIHN5bnRheFxuLy8gKGh3YiBoYXZlIGFscGhhIG9wdGlvbmFsICYgMSBpcyBkZWZhdWx0IHZhbHVlKVxuY3MudG8uaHdiID0gZnVuY3Rpb24gKCkge1xuXHR2YXIgaHdiYSA9IHN3aXp6bGUoYXJndW1lbnRzKTtcblxuXHR2YXIgYSA9ICcnO1xuXHRpZiAoaHdiYS5sZW5ndGggPj0gNCAmJiBod2JhWzNdICE9PSAxKSB7XG5cdFx0YSA9ICcsICcgKyBod2JhWzNdO1xuXHR9XG5cblx0cmV0dXJuICdod2IoJyArIGh3YmFbMF0gKyAnLCAnICsgaHdiYVsxXSArICclLCAnICsgaHdiYVsyXSArICclJyArIGEgKyAnKSc7XG59O1xuXG5jcy50by5rZXl3b3JkID0gZnVuY3Rpb24gKHJnYikge1xuXHRyZXR1cm4gcmV2ZXJzZU5hbWVzW3JnYi5zbGljZSgwLCAzKV07XG59O1xuXG4vLyBoZWxwZXJzXG5mdW5jdGlvbiBjbGFtcChudW0sIG1pbiwgbWF4KSB7XG5cdHJldHVybiBNYXRoLm1pbihNYXRoLm1heChtaW4sIG51bSksIG1heCk7XG59XG5cbmZ1bmN0aW9uIGhleERvdWJsZShudW0pIHtcblx0dmFyIHN0ciA9IG51bS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTtcblx0cmV0dXJuIChzdHIubGVuZ3RoIDwgMikgPyAnMCcgKyBzdHIgOiBzdHI7XG59XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///314\n")},function(module,exports,__webpack_require__){"use strict";eval('\r\n\r\nmodule.exports = {\r\n\t"aliceblue": [240, 248, 255],\r\n\t"antiquewhite": [250, 235, 215],\r\n\t"aqua": [0, 255, 255],\r\n\t"aquamarine": [127, 255, 212],\r\n\t"azure": [240, 255, 255],\r\n\t"beige": [245, 245, 220],\r\n\t"bisque": [255, 228, 196],\r\n\t"black": [0, 0, 0],\r\n\t"blanchedalmond": [255, 235, 205],\r\n\t"blue": [0, 0, 255],\r\n\t"blueviolet": [138, 43, 226],\r\n\t"brown": [165, 42, 42],\r\n\t"burlywood": [222, 184, 135],\r\n\t"cadetblue": [95, 158, 160],\r\n\t"chartreuse": [127, 255, 0],\r\n\t"chocolate": [210, 105, 30],\r\n\t"coral": [255, 127, 80],\r\n\t"cornflowerblue": [100, 149, 237],\r\n\t"cornsilk": [255, 248, 220],\r\n\t"crimson": [220, 20, 60],\r\n\t"cyan": [0, 255, 255],\r\n\t"darkblue": [0, 0, 139],\r\n\t"darkcyan": [0, 139, 139],\r\n\t"darkgoldenrod": [184, 134, 11],\r\n\t"darkgray": [169, 169, 169],\r\n\t"darkgreen": [0, 100, 0],\r\n\t"darkgrey": [169, 169, 169],\r\n\t"darkkhaki": [189, 183, 107],\r\n\t"darkmagenta": [139, 0, 139],\r\n\t"darkolivegreen": [85, 107, 47],\r\n\t"darkorange": [255, 140, 0],\r\n\t"darkorchid": [153, 50, 204],\r\n\t"darkred": [139, 0, 0],\r\n\t"darksalmon": [233, 150, 122],\r\n\t"darkseagreen": [143, 188, 143],\r\n\t"darkslateblue": [72, 61, 139],\r\n\t"darkslategray": [47, 79, 79],\r\n\t"darkslategrey": [47, 79, 79],\r\n\t"darkturquoise": [0, 206, 209],\r\n\t"darkviolet": [148, 0, 211],\r\n\t"deeppink": [255, 20, 147],\r\n\t"deepskyblue": [0, 191, 255],\r\n\t"dimgray": [105, 105, 105],\r\n\t"dimgrey": [105, 105, 105],\r\n\t"dodgerblue": [30, 144, 255],\r\n\t"firebrick": [178, 34, 34],\r\n\t"floralwhite": [255, 250, 240],\r\n\t"forestgreen": [34, 139, 34],\r\n\t"fuchsia": [255, 0, 255],\r\n\t"gainsboro": [220, 220, 220],\r\n\t"ghostwhite": [248, 248, 255],\r\n\t"gold": [255, 215, 0],\r\n\t"goldenrod": [218, 165, 32],\r\n\t"gray": [128, 128, 128],\r\n\t"green": [0, 128, 0],\r\n\t"greenyellow": [173, 255, 47],\r\n\t"grey": [128, 128, 128],\r\n\t"honeydew": [240, 255, 240],\r\n\t"hotpink": [255, 105, 180],\r\n\t"indianred": [205, 92, 92],\r\n\t"indigo": [75, 0, 130],\r\n\t"ivory": [255, 255, 240],\r\n\t"khaki": [240, 230, 140],\r\n\t"lavender": [230, 230, 250],\r\n\t"lavenderblush": [255, 240, 245],\r\n\t"lawngreen": [124, 252, 0],\r\n\t"lemonchiffon": [255, 250, 205],\r\n\t"lightblue": [173, 216, 230],\r\n\t"lightcoral": [240, 128, 128],\r\n\t"lightcyan": [224, 255, 255],\r\n\t"lightgoldenrodyellow": [250, 250, 210],\r\n\t"lightgray": [211, 211, 211],\r\n\t"lightgreen": [144, 238, 144],\r\n\t"lightgrey": [211, 211, 211],\r\n\t"lightpink": [255, 182, 193],\r\n\t"lightsalmon": [255, 160, 122],\r\n\t"lightseagreen": [32, 178, 170],\r\n\t"lightskyblue": [135, 206, 250],\r\n\t"lightslategray": [119, 136, 153],\r\n\t"lightslategrey": [119, 136, 153],\r\n\t"lightsteelblue": [176, 196, 222],\r\n\t"lightyellow": [255, 255, 224],\r\n\t"lime": [0, 255, 0],\r\n\t"limegreen": [50, 205, 50],\r\n\t"linen": [250, 240, 230],\r\n\t"magenta": [255, 0, 255],\r\n\t"maroon": [128, 0, 0],\r\n\t"mediumaquamarine": [102, 205, 170],\r\n\t"mediumblue": [0, 0, 205],\r\n\t"mediumorchid": [186, 85, 211],\r\n\t"mediumpurple": [147, 112, 219],\r\n\t"mediumseagreen": [60, 179, 113],\r\n\t"mediumslateblue": [123, 104, 238],\r\n\t"mediumspringgreen": [0, 250, 154],\r\n\t"mediumturquoise": [72, 209, 204],\r\n\t"mediumvioletred": [199, 21, 133],\r\n\t"midnightblue": [25, 25, 112],\r\n\t"mintcream": [245, 255, 250],\r\n\t"mistyrose": [255, 228, 225],\r\n\t"moccasin": [255, 228, 181],\r\n\t"navajowhite": [255, 222, 173],\r\n\t"navy": [0, 0, 128],\r\n\t"oldlace": [253, 245, 230],\r\n\t"olive": [128, 128, 0],\r\n\t"olivedrab": [107, 142, 35],\r\n\t"orange": [255, 165, 0],\r\n\t"orangered": [255, 69, 0],\r\n\t"orchid": [218, 112, 214],\r\n\t"palegoldenrod": [238, 232, 170],\r\n\t"palegreen": [152, 251, 152],\r\n\t"paleturquoise": [175, 238, 238],\r\n\t"palevioletred": [219, 112, 147],\r\n\t"papayawhip": [255, 239, 213],\r\n\t"peachpuff": [255, 218, 185],\r\n\t"peru": [205, 133, 63],\r\n\t"pink": [255, 192, 203],\r\n\t"plum": [221, 160, 221],\r\n\t"powderblue": [176, 224, 230],\r\n\t"purple": [128, 0, 128],\r\n\t"rebeccapurple": [102, 51, 153],\r\n\t"red": [255, 0, 0],\r\n\t"rosybrown": [188, 143, 143],\r\n\t"royalblue": [65, 105, 225],\r\n\t"saddlebrown": [139, 69, 19],\r\n\t"salmon": [250, 128, 114],\r\n\t"sandybrown": [244, 164, 96],\r\n\t"seagreen": [46, 139, 87],\r\n\t"seashell": [255, 245, 238],\r\n\t"sienna": [160, 82, 45],\r\n\t"silver": [192, 192, 192],\r\n\t"skyblue": [135, 206, 235],\r\n\t"slateblue": [106, 90, 205],\r\n\t"slategray": [112, 128, 144],\r\n\t"slategrey": [112, 128, 144],\r\n\t"snow": [255, 250, 250],\r\n\t"springgreen": [0, 255, 127],\r\n\t"steelblue": [70, 130, 180],\r\n\t"tan": [210, 180, 140],\r\n\t"teal": [0, 128, 128],\r\n\t"thistle": [216, 191, 216],\r\n\t"tomato": [255, 99, 71],\r\n\t"turquoise": [64, 224, 208],\r\n\t"violet": [238, 130, 238],\r\n\t"wheat": [245, 222, 179],\r\n\t"white": [255, 255, 255],\r\n\t"whitesmoke": [245, 245, 245],\r\n\t"yellow": [255, 255, 0],\r\n\t"yellowgreen": [154, 205, 50]\r\n};\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29sb3Itc3RyaW5nL25vZGVfbW9kdWxlcy9jb2xvci1uYW1lL2luZGV4LmpzP2IzMTYiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQVk7O0FBRVo7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6IjMxNS5qcyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0J1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSB7XHJcblx0XCJhbGljZWJsdWVcIjogWzI0MCwgMjQ4LCAyNTVdLFxyXG5cdFwiYW50aXF1ZXdoaXRlXCI6IFsyNTAsIDIzNSwgMjE1XSxcclxuXHRcImFxdWFcIjogWzAsIDI1NSwgMjU1XSxcclxuXHRcImFxdWFtYXJpbmVcIjogWzEyNywgMjU1LCAyMTJdLFxyXG5cdFwiYXp1cmVcIjogWzI0MCwgMjU1LCAyNTVdLFxyXG5cdFwiYmVpZ2VcIjogWzI0NSwgMjQ1LCAyMjBdLFxyXG5cdFwiYmlzcXVlXCI6IFsyNTUsIDIyOCwgMTk2XSxcclxuXHRcImJsYWNrXCI6IFswLCAwLCAwXSxcclxuXHRcImJsYW5jaGVkYWxtb25kXCI6IFsyNTUsIDIzNSwgMjA1XSxcclxuXHRcImJsdWVcIjogWzAsIDAsIDI1NV0sXHJcblx0XCJibHVldmlvbGV0XCI6IFsxMzgsIDQzLCAyMjZdLFxyXG5cdFwiYnJvd25cIjogWzE2NSwgNDIsIDQyXSxcclxuXHRcImJ1cmx5d29vZFwiOiBbMjIyLCAxODQsIDEzNV0sXHJcblx0XCJjYWRldGJsdWVcIjogWzk1LCAxNTgsIDE2MF0sXHJcblx0XCJjaGFydHJldXNlXCI6IFsxMjcsIDI1NSwgMF0sXHJcblx0XCJjaG9jb2xhdGVcIjogWzIxMCwgMTA1LCAzMF0sXHJcblx0XCJjb3JhbFwiOiBbMjU1LCAxMjcsIDgwXSxcclxuXHRcImNvcm5mbG93ZXJibHVlXCI6IFsxMDAsIDE0OSwgMjM3XSxcclxuXHRcImNvcm5zaWxrXCI6IFsyNTUsIDI0OCwgMjIwXSxcclxuXHRcImNyaW1zb25cIjogWzIyMCwgMjAsIDYwXSxcclxuXHRcImN5YW5cIjogWzAsIDI1NSwgMjU1XSxcclxuXHRcImRhcmtibHVlXCI6IFswLCAwLCAxMzldLFxyXG5cdFwiZGFya2N5YW5cIjogWzAsIDEzOSwgMTM5XSxcclxuXHRcImRhcmtnb2xkZW5yb2RcIjogWzE4NCwgMTM0LCAxMV0sXHJcblx0XCJkYXJrZ3JheVwiOiBbMTY5LCAxNjksIDE2OV0sXHJcblx0XCJkYXJrZ3JlZW5cIjogWzAsIDEwMCwgMF0sXHJcblx0XCJkYXJrZ3JleVwiOiBbMTY5LCAxNjksIDE2OV0sXHJcblx0XCJkYXJra2hha2lcIjogWzE4OSwgMTgzLCAxMDddLFxyXG5cdFwiZGFya21hZ2VudGFcIjogWzEzOSwgMCwgMTM5XSxcclxuXHRcImRhcmtvbGl2ZWdyZWVuXCI6IFs4NSwgMTA3LCA0N10sXHJcblx0XCJkYXJrb3JhbmdlXCI6IFsyNTUsIDE0MCwgMF0sXHJcblx0XCJkYXJrb3JjaGlkXCI6IFsxNTMsIDUwLCAyMDRdLFxyXG5cdFwiZGFya3JlZFwiOiBbMTM5LCAwLCAwXSxcclxuXHRcImRhcmtzYWxtb25cIjogWzIzMywgMTUwLCAxMjJdLFxyXG5cdFwiZGFya3NlYWdyZWVuXCI6IFsxNDMsIDE4OCwgMTQzXSxcclxuXHRcImRhcmtzbGF0ZWJsdWVcIjogWzcyLCA2MSwgMTM5XSxcclxuXHRcImRhcmtzbGF0ZWdyYXlcIjogWzQ3LCA3OSwgNzldLFxyXG5cdFwiZGFya3NsYXRlZ3JleVwiOiBbNDcsIDc5LCA3OV0sXHJcblx0XCJkYXJrdHVycXVvaXNlXCI6IFswLCAyMDYsIDIwOV0sXHJcblx0XCJkYXJrdmlvbGV0XCI6IFsxNDgsIDAsIDIxMV0sXHJcblx0XCJkZWVwcGlua1wiOiBbMjU1LCAyMCwgMTQ3XSxcclxuXHRcImRlZXBza3libHVlXCI6IFswLCAxOTEsIDI1NV0sXHJcblx0XCJkaW1ncmF5XCI6IFsxMDUsIDEwNSwgMTA1XSxcclxuXHRcImRpbWdyZXlcIjogWzEwNSwgMTA1LCAxMDVdLFxyXG5cdFwiZG9kZ2VyYmx1ZVwiOiBbMzAsIDE0NCwgMjU1XSxcclxuXHRcImZpcmVicmlja1wiOiBbMTc4LCAzNCwgMzRdLFxyXG5cdFwiZmxvcmFsd2hpdGVcIjogWzI1NSwgMjUwLCAyNDBdLFxyXG5cdFwiZm9yZXN0Z3JlZW5cIjogWzM0LCAxMzksIDM0XSxcclxuXHRcImZ1Y2hzaWFcIjogWzI1NSwgMCwgMjU1XSxcclxuXHRcImdhaW5zYm9yb1wiOiBbMjIwLCAyMjAsIDIyMF0sXHJcblx0XCJnaG9zdHdoaXRlXCI6IFsyNDgsIDI0OCwgMjU1XSxcclxuXHRcImdvbGRcIjogWzI1NSwgMjE1LCAwXSxcclxuXHRcImdvbGRlbnJvZFwiOiBbMjE4LCAxNjUsIDMyXSxcclxuXHRcImdyYXlcIjogWzEyOCwgMTI4LCAxMjhdLFxyXG5cdFwiZ3JlZW5cIjogWzAsIDEyOCwgMF0sXHJcblx0XCJncmVlbnllbGxvd1wiOiBbMTczLCAyNTUsIDQ3XSxcclxuXHRcImdyZXlcIjogWzEyOCwgMTI4LCAxMjhdLFxyXG5cdFwiaG9uZXlkZXdcIjogWzI0MCwgMjU1LCAyNDBdLFxyXG5cdFwiaG90cGlua1wiOiBbMjU1LCAxMDUsIDE4MF0sXHJcblx0XCJpbmRpYW5yZWRcIjogWzIwNSwgOTIsIDkyXSxcclxuXHRcImluZGlnb1wiOiBbNzUsIDAsIDEzMF0sXHJcblx0XCJpdm9yeVwiOiBbMjU1LCAyNTUsIDI0MF0sXHJcblx0XCJraGFraVwiOiBbMjQwLCAyMzAsIDE0MF0sXHJcblx0XCJsYXZlbmRlclwiOiBbMjMwLCAyMzAsIDI1MF0sXHJcblx0XCJsYXZlbmRlcmJsdXNoXCI6IFsyNTUsIDI0MCwgMjQ1XSxcclxuXHRcImxhd25ncmVlblwiOiBbMTI0LCAyNTIsIDBdLFxyXG5cdFwibGVtb25jaGlmZm9uXCI6IFsyNTUsIDI1MCwgMjA1XSxcclxuXHRcImxpZ2h0Ymx1ZVwiOiBbMTczLCAyMTYsIDIzMF0sXHJcblx0XCJsaWdodGNvcmFsXCI6IFsyNDAsIDEyOCwgMTI4XSxcclxuXHRcImxpZ2h0Y3lhblwiOiBbMjI0LCAyNTUsIDI1NV0sXHJcblx0XCJsaWdodGdvbGRlbnJvZHllbGxvd1wiOiBbMjUwLCAyNTAsIDIxMF0sXHJcblx0XCJsaWdodGdyYXlcIjogWzIxMSwgMjExLCAyMTFdLFxyXG5cdFwibGlnaHRncmVlblwiOiBbMTQ0LCAyMzgsIDE0NF0sXHJcblx0XCJsaWdodGdyZXlcIjogWzIxMSwgMjExLCAyMTFdLFxyXG5cdFwibGlnaHRwaW5rXCI6IFsyNTUsIDE4MiwgMTkzXSxcclxuXHRcImxpZ2h0c2FsbW9uXCI6IFsyNTUsIDE2MCwgMTIyXSxcclxuXHRcImxpZ2h0c2VhZ3JlZW5cIjogWzMyLCAxNzgsIDE3MF0sXHJcblx0XCJsaWdodHNreWJsdWVcIjogWzEzNSwgMjA2LCAyNTBdLFxyXG5cdFwibGlnaHRzbGF0ZWdyYXlcIjogWzExOSwgMTM2LCAxNTNdLFxyXG5cdFwibGlnaHRzbGF0ZWdyZXlcIjogWzExOSwgMTM2LCAxNTNdLFxyXG5cdFwibGlnaHRzdGVlbGJsdWVcIjogWzE3NiwgMTk2LCAyMjJdLFxyXG5cdFwibGlnaHR5ZWxsb3dcIjogWzI1NSwgMjU1LCAyMjRdLFxyXG5cdFwibGltZVwiOiBbMCwgMjU1LCAwXSxcclxuXHRcImxpbWVncmVlblwiOiBbNTAsIDIwNSwgNTBdLFxyXG5cdFwibGluZW5cIjogWzI1MCwgMjQwLCAyMzBdLFxyXG5cdFwibWFnZW50YVwiOiBbMjU1LCAwLCAyNTVdLFxyXG5cdFwibWFyb29uXCI6IFsxMjgsIDAsIDBdLFxyXG5cdFwibWVkaXVtYXF1YW1hcmluZVwiOiBbMTAyLCAyMDUsIDE3MF0sXHJcblx0XCJtZWRpdW1ibHVlXCI6IFswLCAwLCAyMDVdLFxyXG5cdFwibWVkaXVtb3JjaGlkXCI6IFsxODYsIDg1LCAyMTFdLFxyXG5cdFwibWVkaXVtcHVycGxlXCI6IFsxNDcsIDExMiwgMjE5XSxcclxuXHRcIm1lZGl1bXNlYWdyZWVuXCI6IFs2MCwgMTc5LCAxMTNdLFxyXG5cdFwibWVkaXVtc2xhdGVibHVlXCI6IFsxMjMsIDEwNCwgMjM4XSxcclxuXHRcIm1lZGl1bXNwcmluZ2dyZWVuXCI6IFswLCAyNTAsIDE1NF0sXHJcblx0XCJtZWRpdW10dXJxdW9pc2VcIjogWzcyLCAyMDksIDIwNF0sXHJcblx0XCJtZWRpdW12aW9sZXRyZWRcIjogWzE5OSwgMjEsIDEzM10sXHJcblx0XCJtaWRuaWdodGJsdWVcIjogWzI1LCAyNSwgMTEyXSxcclxuXHRcIm1pbnRjcmVhbVwiOiBbMjQ1LCAyNTUsIDI1MF0sXHJcblx0XCJtaXN0eXJvc2VcIjogWzI1NSwgMjI4LCAyMjVdLFxyXG5cdFwibW9jY2FzaW5cIjogWzI1NSwgMjI4LCAxODFdLFxyXG5cdFwibmF2YWpvd2hpdGVcIjogWzI1NSwgMjIyLCAxNzNdLFxyXG5cdFwibmF2eVwiOiBbMCwgMCwgMTI4XSxcclxuXHRcIm9sZGxhY2VcIjogWzI1MywgMjQ1LCAyMzBdLFxyXG5cdFwib2xpdmVcIjogWzEyOCwgMTI4LCAwXSxcclxuXHRcIm9saXZlZHJhYlwiOiBbMTA3LCAxNDIsIDM1XSxcclxuXHRcIm9yYW5nZVwiOiBbMjU1LCAxNjUsIDBdLFxyXG5cdFwib3JhbmdlcmVkXCI6IFsyNTUsIDY5LCAwXSxcclxuXHRcIm9yY2hpZFwiOiBbMjE4LCAxMTIsIDIxNF0sXHJcblx0XCJwYWxlZ29sZGVucm9kXCI6IFsyMzgsIDIzMiwgMTcwXSxcclxuXHRcInBhbGVncmVlblwiOiBbMTUyLCAyNTEsIDE1Ml0sXHJcblx0XCJwYWxldHVycXVvaXNlXCI6IFsxNzUsIDIzOCwgMjM4XSxcclxuXHRcInBhbGV2aW9sZXRyZWRcIjogWzIxOSwgMTEyLCAxNDddLFxyXG5cdFwicGFwYXlhd2hpcFwiOiBbMjU1LCAyMzksIDIxM10sXHJcblx0XCJwZWFjaHB1ZmZcIjogWzI1NSwgMjE4LCAxODVdLFxyXG5cdFwicGVydVwiOiBbMjA1LCAxMzMsIDYzXSxcclxuXHRcInBpbmtcIjogWzI1NSwgMTkyLCAyMDNdLFxyXG5cdFwicGx1bVwiOiBbMjIxLCAxNjAsIDIyMV0sXHJcblx0XCJwb3dkZXJibHVlXCI6IFsxNzYsIDIyNCwgMjMwXSxcclxuXHRcInB1cnBsZVwiOiBbMTI4LCAwLCAxMjhdLFxyXG5cdFwicmViZWNjYXB1cnBsZVwiOiBbMTAyLCA1MSwgMTUzXSxcclxuXHRcInJlZFwiOiBbMjU1LCAwLCAwXSxcclxuXHRcInJvc3licm93blwiOiBbMTg4LCAxNDMsIDE0M10sXHJcblx0XCJyb3lhbGJsdWVcIjogWzY1LCAxMDUsIDIyNV0sXHJcblx0XCJzYWRkbGVicm93blwiOiBbMTM5LCA2OSwgMTldLFxyXG5cdFwic2FsbW9uXCI6IFsyNTAsIDEyOCwgMTE0XSxcclxuXHRcInNhbmR5YnJvd25cIjogWzI0NCwgMTY0LCA5Nl0sXHJcblx0XCJzZWFncmVlblwiOiBbNDYsIDEzOSwgODddLFxyXG5cdFwic2Vhc2hlbGxcIjogWzI1NSwgMjQ1LCAyMzhdLFxyXG5cdFwic2llbm5hXCI6IFsxNjAsIDgyLCA0NV0sXHJcblx0XCJzaWx2ZXJcIjogWzE5MiwgMTkyLCAxOTJdLFxyXG5cdFwic2t5Ymx1ZVwiOiBbMTM1LCAyMDYsIDIzNV0sXHJcblx0XCJzbGF0ZWJsdWVcIjogWzEwNiwgOTAsIDIwNV0sXHJcblx0XCJzbGF0ZWdyYXlcIjogWzExMiwgMTI4LCAxNDRdLFxyXG5cdFwic2xhdGVncmV5XCI6IFsxMTIsIDEyOCwgMTQ0XSxcclxuXHRcInNub3dcIjogWzI1NSwgMjUwLCAyNTBdLFxyXG5cdFwic3ByaW5nZ3JlZW5cIjogWzAsIDI1NSwgMTI3XSxcclxuXHRcInN0ZWVsYmx1ZVwiOiBbNzAsIDEzMCwgMTgwXSxcclxuXHRcInRhblwiOiBbMjEwLCAxODAsIDE0MF0sXHJcblx0XCJ0ZWFsXCI6IFswLCAxMjgsIDEyOF0sXHJcblx0XCJ0aGlzdGxlXCI6IFsyMTYsIDE5MSwgMjE2XSxcclxuXHRcInRvbWF0b1wiOiBbMjU1LCA5OSwgNzFdLFxyXG5cdFwidHVycXVvaXNlXCI6IFs2NCwgMjI0LCAyMDhdLFxyXG5cdFwidmlvbGV0XCI6IFsyMzgsIDEzMCwgMjM4XSxcclxuXHRcIndoZWF0XCI6IFsyNDUsIDIyMiwgMTc5XSxcclxuXHRcIndoaXRlXCI6IFsyNTUsIDI1NSwgMjU1XSxcclxuXHRcIndoaXRlc21va2VcIjogWzI0NSwgMjQ1LCAyNDVdLFxyXG5cdFwieWVsbG93XCI6IFsyNTUsIDI1NSwgMF0sXHJcblx0XCJ5ZWxsb3dncmVlblwiOiBbMTU0LCAyMDUsIDUwXVxyXG59O1xyXG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///315\n')},function(module,exports,__webpack_require__){"use strict";eval("\n\nvar isArrayish = __webpack_require__(317);\n\nvar concat = Array.prototype.concat;\nvar slice = Array.prototype.slice;\n\nvar swizzle = module.exports = function swizzle(args) {\n\tvar results = [];\n\n\tfor (var i = 0, len = args.length; i < len; i++) {\n\t\tvar arg = args[i];\n\n\t\tif (isArrayish(arg)) {\n\t\t\t// http://jsperf.com/javascript-array-concat-vs-push/98\n\t\t\tresults = concat.call(results, slice.call(arg));\n\t\t} else {\n\t\t\tresults.push(arg);\n\t\t}\n\t}\n\n\treturn results;\n};\n\nswizzle.wrap = function (fn) {\n\treturn function () {\n\t\treturn fn(swizzle(arguments));\n\t};\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvc2ltcGxlLXN3aXp6bGUvaW5kZXguanM/MjUxNCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBYTs7QUFFYixpQkFBaUIsbUJBQU8sQ0FBQyxHQUFhOztBQUV0QztBQUNBOztBQUVBO0FBQ0E7O0FBRUEsbUNBQW1DLFNBQVM7QUFDNUM7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiMzE2LmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgaXNBcnJheWlzaCA9IHJlcXVpcmUoJ2lzLWFycmF5aXNoJyk7XG5cbnZhciBjb25jYXQgPSBBcnJheS5wcm90b3R5cGUuY29uY2F0O1xudmFyIHNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlO1xuXG52YXIgc3dpenpsZSA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gc3dpenpsZShhcmdzKSB7XG5cdHZhciByZXN1bHRzID0gW107XG5cblx0Zm9yICh2YXIgaSA9IDAsIGxlbiA9IGFyZ3MubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcblx0XHR2YXIgYXJnID0gYXJnc1tpXTtcblxuXHRcdGlmIChpc0FycmF5aXNoKGFyZykpIHtcblx0XHRcdC8vIGh0dHA6Ly9qc3BlcmYuY29tL2phdmFzY3JpcHQtYXJyYXktY29uY2F0LXZzLXB1c2gvOThcblx0XHRcdHJlc3VsdHMgPSBjb25jYXQuY2FsbChyZXN1bHRzLCBzbGljZS5jYWxsKGFyZykpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXN1bHRzLnB1c2goYXJnKTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gcmVzdWx0cztcbn07XG5cbnN3aXp6bGUud3JhcCA9IGZ1bmN0aW9uIChmbikge1xuXHRyZXR1cm4gZnVuY3Rpb24gKCkge1xuXHRcdHJldHVybiBmbihzd2l6emxlKGFyZ3VtZW50cykpO1xuXHR9O1xufTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///316\n")},function(module,exports){eval("module.exports = function isArrayish(obj) {\n\tif (!obj || typeof obj === 'string') {\n\t\treturn false;\n\t}\n\n\treturn obj instanceof Array || Array.isArray(obj) ||\n\t\t(obj.length >= 0 && (obj.splice instanceof Function ||\n\t\t\t(Object.getOwnPropertyDescriptor(obj, (obj.length - 1)) && obj.constructor.name !== 'String')));\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaXMtYXJyYXlpc2gvaW5kZXguanM/ZjBjYiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiIzMTcuanMiLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzQXJyYXlpc2gob2JqKSB7XG5cdGlmICghb2JqIHx8IHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0cmV0dXJuIG9iaiBpbnN0YW5jZW9mIEFycmF5IHx8IEFycmF5LmlzQXJyYXkob2JqKSB8fFxuXHRcdChvYmoubGVuZ3RoID49IDAgJiYgKG9iai5zcGxpY2UgaW5zdGFuY2VvZiBGdW5jdGlvbiB8fFxuXHRcdFx0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCAob2JqLmxlbmd0aCAtIDEpKSAmJiBvYmouY29uc3RydWN0b3IubmFtZSAhPT0gJ1N0cmluZycpKSk7XG59O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///317\n")},function(module,exports,__webpack_require__){eval("var conversions = __webpack_require__(184);\nvar route = __webpack_require__(320);\n\nvar convert = {};\n\nvar models = Object.keys(conversions);\n\nfunction wrapRaw(fn) {\n\tvar wrappedFn = function (args) {\n\t\tif (args === undefined || args === null) {\n\t\t\treturn args;\n\t\t}\n\n\t\tif (arguments.length > 1) {\n\t\t\targs = Array.prototype.slice.call(arguments);\n\t\t}\n\n\t\treturn fn(args);\n\t};\n\n\t// preserve .conversion property if there is one\n\tif ('conversion' in fn) {\n\t\twrappedFn.conversion = fn.conversion;\n\t}\n\n\treturn wrappedFn;\n}\n\nfunction wrapRounded(fn) {\n\tvar wrappedFn = function (args) {\n\t\tif (args === undefined || args === null) {\n\t\t\treturn args;\n\t\t}\n\n\t\tif (arguments.length > 1) {\n\t\t\targs = Array.prototype.slice.call(arguments);\n\t\t}\n\n\t\tvar result = fn(args);\n\n\t\t// we're assuming the result is an array here.\n\t\t// see notice in conversions.js; don't use box types\n\t\t// in conversion functions.\n\t\tif (typeof result === 'object') {\n\t\t\tfor (var len = result.length, i = 0; i < len; i++) {\n\t\t\t\tresult[i] = Math.round(result[i]);\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t};\n\n\t// preserve .conversion property if there is one\n\tif ('conversion' in fn) {\n\t\twrappedFn.conversion = fn.conversion;\n\t}\n\n\treturn wrappedFn;\n}\n\nmodels.forEach(function (fromModel) {\n\tconvert[fromModel] = {};\n\n\tObject.defineProperty(convert[fromModel], 'channels', {value: conversions[fromModel].channels});\n\tObject.defineProperty(convert[fromModel], 'labels', {value: conversions[fromModel].labels});\n\n\tvar routes = route(fromModel);\n\tvar routeModels = Object.keys(routes);\n\n\trouteModels.forEach(function (toModel) {\n\t\tvar fn = routes[toModel];\n\n\t\tconvert[fromModel][toModel] = wrapRounded(fn);\n\t\tconvert[fromModel][toModel].raw = wrapRaw(fn);\n\t});\n});\n\nmodule.exports = convert;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29sb3ItY29udmVydC9pbmRleC5qcz9iYjE1Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGtCQUFrQixtQkFBTyxDQUFDLEdBQWU7QUFDekMsWUFBWSxtQkFBTyxDQUFDLEdBQVM7O0FBRTdCOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLGtDQUFrQztBQUNsQztBQUNBO0FBQ0EsdUNBQXVDLFNBQVM7QUFDaEQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBLHdEQUF3RCx1Q0FBdUM7QUFDL0Ysc0RBQXNELHFDQUFxQzs7QUFFM0Y7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxFQUFFO0FBQ0YsQ0FBQzs7QUFFRCIsImZpbGUiOiIzMTguanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgY29udmVyc2lvbnMgPSByZXF1aXJlKCcuL2NvbnZlcnNpb25zJyk7XG52YXIgcm91dGUgPSByZXF1aXJlKCcuL3JvdXRlJyk7XG5cbnZhciBjb252ZXJ0ID0ge307XG5cbnZhciBtb2RlbHMgPSBPYmplY3Qua2V5cyhjb252ZXJzaW9ucyk7XG5cbmZ1bmN0aW9uIHdyYXBSYXcoZm4pIHtcblx0dmFyIHdyYXBwZWRGbiA9IGZ1bmN0aW9uIChhcmdzKSB7XG5cdFx0aWYgKGFyZ3MgPT09IHVuZGVmaW5lZCB8fCBhcmdzID09PSBudWxsKSB7XG5cdFx0XHRyZXR1cm4gYXJncztcblx0XHR9XG5cblx0XHRpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcblx0XHRcdGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuXHRcdH1cblxuXHRcdHJldHVybiBmbihhcmdzKTtcblx0fTtcblxuXHQvLyBwcmVzZXJ2ZSAuY29udmVyc2lvbiBwcm9wZXJ0eSBpZiB0aGVyZSBpcyBvbmVcblx0aWYgKCdjb252ZXJzaW9uJyBpbiBmbikge1xuXHRcdHdyYXBwZWRGbi5jb252ZXJzaW9uID0gZm4uY29udmVyc2lvbjtcblx0fVxuXG5cdHJldHVybiB3cmFwcGVkRm47XG59XG5cbmZ1bmN0aW9uIHdyYXBSb3VuZGVkKGZuKSB7XG5cdHZhciB3cmFwcGVkRm4gPSBmdW5jdGlvbiAoYXJncykge1xuXHRcdGlmIChhcmdzID09PSB1bmRlZmluZWQgfHwgYXJncyA9PT0gbnVsbCkge1xuXHRcdFx0cmV0dXJuIGFyZ3M7XG5cdFx0fVxuXG5cdFx0aWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG5cdFx0XHRhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcblx0XHR9XG5cblx0XHR2YXIgcmVzdWx0ID0gZm4oYXJncyk7XG5cblx0XHQvLyB3ZSdyZSBhc3N1bWluZyB0aGUgcmVzdWx0IGlzIGFuIGFycmF5IGhlcmUuXG5cdFx0Ly8gc2VlIG5vdGljZSBpbiBjb252ZXJzaW9ucy5qczsgZG9uJ3QgdXNlIGJveCB0eXBlc1xuXHRcdC8vIGluIGNvbnZlcnNpb24gZnVuY3Rpb25zLlxuXHRcdGlmICh0eXBlb2YgcmVzdWx0ID09PSAnb2JqZWN0Jykge1xuXHRcdFx0Zm9yICh2YXIgbGVuID0gcmVzdWx0Lmxlbmd0aCwgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuXHRcdFx0XHRyZXN1bHRbaV0gPSBNYXRoLnJvdW5kKHJlc3VsdFtpXSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fTtcblxuXHQvLyBwcmVzZXJ2ZSAuY29udmVyc2lvbiBwcm9wZXJ0eSBpZiB0aGVyZSBpcyBvbmVcblx0aWYgKCdjb252ZXJzaW9uJyBpbiBmbikge1xuXHRcdHdyYXBwZWRGbi5jb252ZXJzaW9uID0gZm4uY29udmVyc2lvbjtcblx0fVxuXG5cdHJldHVybiB3cmFwcGVkRm47XG59XG5cbm1vZGVscy5mb3JFYWNoKGZ1bmN0aW9uIChmcm9tTW9kZWwpIHtcblx0Y29udmVydFtmcm9tTW9kZWxdID0ge307XG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbnZlcnRbZnJvbU1vZGVsXSwgJ2NoYW5uZWxzJywge3ZhbHVlOiBjb252ZXJzaW9uc1tmcm9tTW9kZWxdLmNoYW5uZWxzfSk7XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb252ZXJ0W2Zyb21Nb2RlbF0sICdsYWJlbHMnLCB7dmFsdWU6IGNvbnZlcnNpb25zW2Zyb21Nb2RlbF0ubGFiZWxzfSk7XG5cblx0dmFyIHJvdXRlcyA9IHJvdXRlKGZyb21Nb2RlbCk7XG5cdHZhciByb3V0ZU1vZGVscyA9IE9iamVjdC5rZXlzKHJvdXRlcyk7XG5cblx0cm91dGVNb2RlbHMuZm9yRWFjaChmdW5jdGlvbiAodG9Nb2RlbCkge1xuXHRcdHZhciBmbiA9IHJvdXRlc1t0b01vZGVsXTtcblxuXHRcdGNvbnZlcnRbZnJvbU1vZGVsXVt0b01vZGVsXSA9IHdyYXBSb3VuZGVkKGZuKTtcblx0XHRjb252ZXJ0W2Zyb21Nb2RlbF1bdG9Nb2RlbF0ucmF3ID0gd3JhcFJhdyhmbik7XG5cdH0pO1xufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gY29udmVydDtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///318\n")},function(module,exports,__webpack_require__){"use strict";eval('\r\n\r\nmodule.exports = {\r\n\t"aliceblue": [240, 248, 255],\r\n\t"antiquewhite": [250, 235, 215],\r\n\t"aqua": [0, 255, 255],\r\n\t"aquamarine": [127, 255, 212],\r\n\t"azure": [240, 255, 255],\r\n\t"beige": [245, 245, 220],\r\n\t"bisque": [255, 228, 196],\r\n\t"black": [0, 0, 0],\r\n\t"blanchedalmond": [255, 235, 205],\r\n\t"blue": [0, 0, 255],\r\n\t"blueviolet": [138, 43, 226],\r\n\t"brown": [165, 42, 42],\r\n\t"burlywood": [222, 184, 135],\r\n\t"cadetblue": [95, 158, 160],\r\n\t"chartreuse": [127, 255, 0],\r\n\t"chocolate": [210, 105, 30],\r\n\t"coral": [255, 127, 80],\r\n\t"cornflowerblue": [100, 149, 237],\r\n\t"cornsilk": [255, 248, 220],\r\n\t"crimson": [220, 20, 60],\r\n\t"cyan": [0, 255, 255],\r\n\t"darkblue": [0, 0, 139],\r\n\t"darkcyan": [0, 139, 139],\r\n\t"darkgoldenrod": [184, 134, 11],\r\n\t"darkgray": [169, 169, 169],\r\n\t"darkgreen": [0, 100, 0],\r\n\t"darkgrey": [169, 169, 169],\r\n\t"darkkhaki": [189, 183, 107],\r\n\t"darkmagenta": [139, 0, 139],\r\n\t"darkolivegreen": [85, 107, 47],\r\n\t"darkorange": [255, 140, 0],\r\n\t"darkorchid": [153, 50, 204],\r\n\t"darkred": [139, 0, 0],\r\n\t"darksalmon": [233, 150, 122],\r\n\t"darkseagreen": [143, 188, 143],\r\n\t"darkslateblue": [72, 61, 139],\r\n\t"darkslategray": [47, 79, 79],\r\n\t"darkslategrey": [47, 79, 79],\r\n\t"darkturquoise": [0, 206, 209],\r\n\t"darkviolet": [148, 0, 211],\r\n\t"deeppink": [255, 20, 147],\r\n\t"deepskyblue": [0, 191, 255],\r\n\t"dimgray": [105, 105, 105],\r\n\t"dimgrey": [105, 105, 105],\r\n\t"dodgerblue": [30, 144, 255],\r\n\t"firebrick": [178, 34, 34],\r\n\t"floralwhite": [255, 250, 240],\r\n\t"forestgreen": [34, 139, 34],\r\n\t"fuchsia": [255, 0, 255],\r\n\t"gainsboro": [220, 220, 220],\r\n\t"ghostwhite": [248, 248, 255],\r\n\t"gold": [255, 215, 0],\r\n\t"goldenrod": [218, 165, 32],\r\n\t"gray": [128, 128, 128],\r\n\t"green": [0, 128, 0],\r\n\t"greenyellow": [173, 255, 47],\r\n\t"grey": [128, 128, 128],\r\n\t"honeydew": [240, 255, 240],\r\n\t"hotpink": [255, 105, 180],\r\n\t"indianred": [205, 92, 92],\r\n\t"indigo": [75, 0, 130],\r\n\t"ivory": [255, 255, 240],\r\n\t"khaki": [240, 230, 140],\r\n\t"lavender": [230, 230, 250],\r\n\t"lavenderblush": [255, 240, 245],\r\n\t"lawngreen": [124, 252, 0],\r\n\t"lemonchiffon": [255, 250, 205],\r\n\t"lightblue": [173, 216, 230],\r\n\t"lightcoral": [240, 128, 128],\r\n\t"lightcyan": [224, 255, 255],\r\n\t"lightgoldenrodyellow": [250, 250, 210],\r\n\t"lightgray": [211, 211, 211],\r\n\t"lightgreen": [144, 238, 144],\r\n\t"lightgrey": [211, 211, 211],\r\n\t"lightpink": [255, 182, 193],\r\n\t"lightsalmon": [255, 160, 122],\r\n\t"lightseagreen": [32, 178, 170],\r\n\t"lightskyblue": [135, 206, 250],\r\n\t"lightslategray": [119, 136, 153],\r\n\t"lightslategrey": [119, 136, 153],\r\n\t"lightsteelblue": [176, 196, 222],\r\n\t"lightyellow": [255, 255, 224],\r\n\t"lime": [0, 255, 0],\r\n\t"limegreen": [50, 205, 50],\r\n\t"linen": [250, 240, 230],\r\n\t"magenta": [255, 0, 255],\r\n\t"maroon": [128, 0, 0],\r\n\t"mediumaquamarine": [102, 205, 170],\r\n\t"mediumblue": [0, 0, 205],\r\n\t"mediumorchid": [186, 85, 211],\r\n\t"mediumpurple": [147, 112, 219],\r\n\t"mediumseagreen": [60, 179, 113],\r\n\t"mediumslateblue": [123, 104, 238],\r\n\t"mediumspringgreen": [0, 250, 154],\r\n\t"mediumturquoise": [72, 209, 204],\r\n\t"mediumvioletred": [199, 21, 133],\r\n\t"midnightblue": [25, 25, 112],\r\n\t"mintcream": [245, 255, 250],\r\n\t"mistyrose": [255, 228, 225],\r\n\t"moccasin": [255, 228, 181],\r\n\t"navajowhite": [255, 222, 173],\r\n\t"navy": [0, 0, 128],\r\n\t"oldlace": [253, 245, 230],\r\n\t"olive": [128, 128, 0],\r\n\t"olivedrab": [107, 142, 35],\r\n\t"orange": [255, 165, 0],\r\n\t"orangered": [255, 69, 0],\r\n\t"orchid": [218, 112, 214],\r\n\t"palegoldenrod": [238, 232, 170],\r\n\t"palegreen": [152, 251, 152],\r\n\t"paleturquoise": [175, 238, 238],\r\n\t"palevioletred": [219, 112, 147],\r\n\t"papayawhip": [255, 239, 213],\r\n\t"peachpuff": [255, 218, 185],\r\n\t"peru": [205, 133, 63],\r\n\t"pink": [255, 192, 203],\r\n\t"plum": [221, 160, 221],\r\n\t"powderblue": [176, 224, 230],\r\n\t"purple": [128, 0, 128],\r\n\t"rebeccapurple": [102, 51, 153],\r\n\t"red": [255, 0, 0],\r\n\t"rosybrown": [188, 143, 143],\r\n\t"royalblue": [65, 105, 225],\r\n\t"saddlebrown": [139, 69, 19],\r\n\t"salmon": [250, 128, 114],\r\n\t"sandybrown": [244, 164, 96],\r\n\t"seagreen": [46, 139, 87],\r\n\t"seashell": [255, 245, 238],\r\n\t"sienna": [160, 82, 45],\r\n\t"silver": [192, 192, 192],\r\n\t"skyblue": [135, 206, 235],\r\n\t"slateblue": [106, 90, 205],\r\n\t"slategray": [112, 128, 144],\r\n\t"slategrey": [112, 128, 144],\r\n\t"snow": [255, 250, 250],\r\n\t"springgreen": [0, 255, 127],\r\n\t"steelblue": [70, 130, 180],\r\n\t"tan": [210, 180, 140],\r\n\t"teal": [0, 128, 128],\r\n\t"thistle": [216, 191, 216],\r\n\t"tomato": [255, 99, 71],\r\n\t"turquoise": [64, 224, 208],\r\n\t"violet": [238, 130, 238],\r\n\t"wheat": [245, 222, 179],\r\n\t"white": [255, 255, 255],\r\n\t"whitesmoke": [245, 245, 245],\r\n\t"yellow": [255, 255, 0],\r\n\t"yellowgreen": [154, 205, 50]\r\n};\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29sb3ItbmFtZS9pbmRleC5qcz80ZjRkIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFZOztBQUVaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiIzMTkuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCdcclxuXHJcbm1vZHVsZS5leHBvcnRzID0ge1xyXG5cdFwiYWxpY2VibHVlXCI6IFsyNDAsIDI0OCwgMjU1XSxcclxuXHRcImFudGlxdWV3aGl0ZVwiOiBbMjUwLCAyMzUsIDIxNV0sXHJcblx0XCJhcXVhXCI6IFswLCAyNTUsIDI1NV0sXHJcblx0XCJhcXVhbWFyaW5lXCI6IFsxMjcsIDI1NSwgMjEyXSxcclxuXHRcImF6dXJlXCI6IFsyNDAsIDI1NSwgMjU1XSxcclxuXHRcImJlaWdlXCI6IFsyNDUsIDI0NSwgMjIwXSxcclxuXHRcImJpc3F1ZVwiOiBbMjU1LCAyMjgsIDE5Nl0sXHJcblx0XCJibGFja1wiOiBbMCwgMCwgMF0sXHJcblx0XCJibGFuY2hlZGFsbW9uZFwiOiBbMjU1LCAyMzUsIDIwNV0sXHJcblx0XCJibHVlXCI6IFswLCAwLCAyNTVdLFxyXG5cdFwiYmx1ZXZpb2xldFwiOiBbMTM4LCA0MywgMjI2XSxcclxuXHRcImJyb3duXCI6IFsxNjUsIDQyLCA0Ml0sXHJcblx0XCJidXJseXdvb2RcIjogWzIyMiwgMTg0LCAxMzVdLFxyXG5cdFwiY2FkZXRibHVlXCI6IFs5NSwgMTU4LCAxNjBdLFxyXG5cdFwiY2hhcnRyZXVzZVwiOiBbMTI3LCAyNTUsIDBdLFxyXG5cdFwiY2hvY29sYXRlXCI6IFsyMTAsIDEwNSwgMzBdLFxyXG5cdFwiY29yYWxcIjogWzI1NSwgMTI3LCA4MF0sXHJcblx0XCJjb3JuZmxvd2VyYmx1ZVwiOiBbMTAwLCAxNDksIDIzN10sXHJcblx0XCJjb3Juc2lsa1wiOiBbMjU1LCAyNDgsIDIyMF0sXHJcblx0XCJjcmltc29uXCI6IFsyMjAsIDIwLCA2MF0sXHJcblx0XCJjeWFuXCI6IFswLCAyNTUsIDI1NV0sXHJcblx0XCJkYXJrYmx1ZVwiOiBbMCwgMCwgMTM5XSxcclxuXHRcImRhcmtjeWFuXCI6IFswLCAxMzksIDEzOV0sXHJcblx0XCJkYXJrZ29sZGVucm9kXCI6IFsxODQsIDEzNCwgMTFdLFxyXG5cdFwiZGFya2dyYXlcIjogWzE2OSwgMTY5LCAxNjldLFxyXG5cdFwiZGFya2dyZWVuXCI6IFswLCAxMDAsIDBdLFxyXG5cdFwiZGFya2dyZXlcIjogWzE2OSwgMTY5LCAxNjldLFxyXG5cdFwiZGFya2toYWtpXCI6IFsxODksIDE4MywgMTA3XSxcclxuXHRcImRhcmttYWdlbnRhXCI6IFsxMzksIDAsIDEzOV0sXHJcblx0XCJkYXJrb2xpdmVncmVlblwiOiBbODUsIDEwNywgNDddLFxyXG5cdFwiZGFya29yYW5nZVwiOiBbMjU1LCAxNDAsIDBdLFxyXG5cdFwiZGFya29yY2hpZFwiOiBbMTUzLCA1MCwgMjA0XSxcclxuXHRcImRhcmtyZWRcIjogWzEzOSwgMCwgMF0sXHJcblx0XCJkYXJrc2FsbW9uXCI6IFsyMzMsIDE1MCwgMTIyXSxcclxuXHRcImRhcmtzZWFncmVlblwiOiBbMTQzLCAxODgsIDE0M10sXHJcblx0XCJkYXJrc2xhdGVibHVlXCI6IFs3MiwgNjEsIDEzOV0sXHJcblx0XCJkYXJrc2xhdGVncmF5XCI6IFs0NywgNzksIDc5XSxcclxuXHRcImRhcmtzbGF0ZWdyZXlcIjogWzQ3LCA3OSwgNzldLFxyXG5cdFwiZGFya3R1cnF1b2lzZVwiOiBbMCwgMjA2LCAyMDldLFxyXG5cdFwiZGFya3Zpb2xldFwiOiBbMTQ4LCAwLCAyMTFdLFxyXG5cdFwiZGVlcHBpbmtcIjogWzI1NSwgMjAsIDE0N10sXHJcblx0XCJkZWVwc2t5Ymx1ZVwiOiBbMCwgMTkxLCAyNTVdLFxyXG5cdFwiZGltZ3JheVwiOiBbMTA1LCAxMDUsIDEwNV0sXHJcblx0XCJkaW1ncmV5XCI6IFsxMDUsIDEwNSwgMTA1XSxcclxuXHRcImRvZGdlcmJsdWVcIjogWzMwLCAxNDQsIDI1NV0sXHJcblx0XCJmaXJlYnJpY2tcIjogWzE3OCwgMzQsIDM0XSxcclxuXHRcImZsb3JhbHdoaXRlXCI6IFsyNTUsIDI1MCwgMjQwXSxcclxuXHRcImZvcmVzdGdyZWVuXCI6IFszNCwgMTM5LCAzNF0sXHJcblx0XCJmdWNoc2lhXCI6IFsyNTUsIDAsIDI1NV0sXHJcblx0XCJnYWluc2Jvcm9cIjogWzIyMCwgMjIwLCAyMjBdLFxyXG5cdFwiZ2hvc3R3aGl0ZVwiOiBbMjQ4LCAyNDgsIDI1NV0sXHJcblx0XCJnb2xkXCI6IFsyNTUsIDIxNSwgMF0sXHJcblx0XCJnb2xkZW5yb2RcIjogWzIxOCwgMTY1LCAzMl0sXHJcblx0XCJncmF5XCI6IFsxMjgsIDEyOCwgMTI4XSxcclxuXHRcImdyZWVuXCI6IFswLCAxMjgsIDBdLFxyXG5cdFwiZ3JlZW55ZWxsb3dcIjogWzE3MywgMjU1LCA0N10sXHJcblx0XCJncmV5XCI6IFsxMjgsIDEyOCwgMTI4XSxcclxuXHRcImhvbmV5ZGV3XCI6IFsyNDAsIDI1NSwgMjQwXSxcclxuXHRcImhvdHBpbmtcIjogWzI1NSwgMTA1LCAxODBdLFxyXG5cdFwiaW5kaWFucmVkXCI6IFsyMDUsIDkyLCA5Ml0sXHJcblx0XCJpbmRpZ29cIjogWzc1LCAwLCAxMzBdLFxyXG5cdFwiaXZvcnlcIjogWzI1NSwgMjU1LCAyNDBdLFxyXG5cdFwia2hha2lcIjogWzI0MCwgMjMwLCAxNDBdLFxyXG5cdFwibGF2ZW5kZXJcIjogWzIzMCwgMjMwLCAyNTBdLFxyXG5cdFwibGF2ZW5kZXJibHVzaFwiOiBbMjU1LCAyNDAsIDI0NV0sXHJcblx0XCJsYXduZ3JlZW5cIjogWzEyNCwgMjUyLCAwXSxcclxuXHRcImxlbW9uY2hpZmZvblwiOiBbMjU1LCAyNTAsIDIwNV0sXHJcblx0XCJsaWdodGJsdWVcIjogWzE3MywgMjE2LCAyMzBdLFxyXG5cdFwibGlnaHRjb3JhbFwiOiBbMjQwLCAxMjgsIDEyOF0sXHJcblx0XCJsaWdodGN5YW5cIjogWzIyNCwgMjU1LCAyNTVdLFxyXG5cdFwibGlnaHRnb2xkZW5yb2R5ZWxsb3dcIjogWzI1MCwgMjUwLCAyMTBdLFxyXG5cdFwibGlnaHRncmF5XCI6IFsyMTEsIDIxMSwgMjExXSxcclxuXHRcImxpZ2h0Z3JlZW5cIjogWzE0NCwgMjM4LCAxNDRdLFxyXG5cdFwibGlnaHRncmV5XCI6IFsyMTEsIDIxMSwgMjExXSxcclxuXHRcImxpZ2h0cGlua1wiOiBbMjU1LCAxODIsIDE5M10sXHJcblx0XCJsaWdodHNhbG1vblwiOiBbMjU1LCAxNjAsIDEyMl0sXHJcblx0XCJsaWdodHNlYWdyZWVuXCI6IFszMiwgMTc4LCAxNzBdLFxyXG5cdFwibGlnaHRza3libHVlXCI6IFsxMzUsIDIwNiwgMjUwXSxcclxuXHRcImxpZ2h0c2xhdGVncmF5XCI6IFsxMTksIDEzNiwgMTUzXSxcclxuXHRcImxpZ2h0c2xhdGVncmV5XCI6IFsxMTksIDEzNiwgMTUzXSxcclxuXHRcImxpZ2h0c3RlZWxibHVlXCI6IFsxNzYsIDE5NiwgMjIyXSxcclxuXHRcImxpZ2h0eWVsbG93XCI6IFsyNTUsIDI1NSwgMjI0XSxcclxuXHRcImxpbWVcIjogWzAsIDI1NSwgMF0sXHJcblx0XCJsaW1lZ3JlZW5cIjogWzUwLCAyMDUsIDUwXSxcclxuXHRcImxpbmVuXCI6IFsyNTAsIDI0MCwgMjMwXSxcclxuXHRcIm1hZ2VudGFcIjogWzI1NSwgMCwgMjU1XSxcclxuXHRcIm1hcm9vblwiOiBbMTI4LCAwLCAwXSxcclxuXHRcIm1lZGl1bWFxdWFtYXJpbmVcIjogWzEwMiwgMjA1LCAxNzBdLFxyXG5cdFwibWVkaXVtYmx1ZVwiOiBbMCwgMCwgMjA1XSxcclxuXHRcIm1lZGl1bW9yY2hpZFwiOiBbMTg2LCA4NSwgMjExXSxcclxuXHRcIm1lZGl1bXB1cnBsZVwiOiBbMTQ3LCAxMTIsIDIxOV0sXHJcblx0XCJtZWRpdW1zZWFncmVlblwiOiBbNjAsIDE3OSwgMTEzXSxcclxuXHRcIm1lZGl1bXNsYXRlYmx1ZVwiOiBbMTIzLCAxMDQsIDIzOF0sXHJcblx0XCJtZWRpdW1zcHJpbmdncmVlblwiOiBbMCwgMjUwLCAxNTRdLFxyXG5cdFwibWVkaXVtdHVycXVvaXNlXCI6IFs3MiwgMjA5LCAyMDRdLFxyXG5cdFwibWVkaXVtdmlvbGV0cmVkXCI6IFsxOTksIDIxLCAxMzNdLFxyXG5cdFwibWlkbmlnaHRibHVlXCI6IFsyNSwgMjUsIDExMl0sXHJcblx0XCJtaW50Y3JlYW1cIjogWzI0NSwgMjU1LCAyNTBdLFxyXG5cdFwibWlzdHlyb3NlXCI6IFsyNTUsIDIyOCwgMjI1XSxcclxuXHRcIm1vY2Nhc2luXCI6IFsyNTUsIDIyOCwgMTgxXSxcclxuXHRcIm5hdmFqb3doaXRlXCI6IFsyNTUsIDIyMiwgMTczXSxcclxuXHRcIm5hdnlcIjogWzAsIDAsIDEyOF0sXHJcblx0XCJvbGRsYWNlXCI6IFsyNTMsIDI0NSwgMjMwXSxcclxuXHRcIm9saXZlXCI6IFsxMjgsIDEyOCwgMF0sXHJcblx0XCJvbGl2ZWRyYWJcIjogWzEwNywgMTQyLCAzNV0sXHJcblx0XCJvcmFuZ2VcIjogWzI1NSwgMTY1LCAwXSxcclxuXHRcIm9yYW5nZXJlZFwiOiBbMjU1LCA2OSwgMF0sXHJcblx0XCJvcmNoaWRcIjogWzIxOCwgMTEyLCAyMTRdLFxyXG5cdFwicGFsZWdvbGRlbnJvZFwiOiBbMjM4LCAyMzIsIDE3MF0sXHJcblx0XCJwYWxlZ3JlZW5cIjogWzE1MiwgMjUxLCAxNTJdLFxyXG5cdFwicGFsZXR1cnF1b2lzZVwiOiBbMTc1LCAyMzgsIDIzOF0sXHJcblx0XCJwYWxldmlvbGV0cmVkXCI6IFsyMTksIDExMiwgMTQ3XSxcclxuXHRcInBhcGF5YXdoaXBcIjogWzI1NSwgMjM5LCAyMTNdLFxyXG5cdFwicGVhY2hwdWZmXCI6IFsyNTUsIDIxOCwgMTg1XSxcclxuXHRcInBlcnVcIjogWzIwNSwgMTMzLCA2M10sXHJcblx0XCJwaW5rXCI6IFsyNTUsIDE5MiwgMjAzXSxcclxuXHRcInBsdW1cIjogWzIyMSwgMTYwLCAyMjFdLFxyXG5cdFwicG93ZGVyYmx1ZVwiOiBbMTc2LCAyMjQsIDIzMF0sXHJcblx0XCJwdXJwbGVcIjogWzEyOCwgMCwgMTI4XSxcclxuXHRcInJlYmVjY2FwdXJwbGVcIjogWzEwMiwgNTEsIDE1M10sXHJcblx0XCJyZWRcIjogWzI1NSwgMCwgMF0sXHJcblx0XCJyb3N5YnJvd25cIjogWzE4OCwgMTQzLCAxNDNdLFxyXG5cdFwicm95YWxibHVlXCI6IFs2NSwgMTA1LCAyMjVdLFxyXG5cdFwic2FkZGxlYnJvd25cIjogWzEzOSwgNjksIDE5XSxcclxuXHRcInNhbG1vblwiOiBbMjUwLCAxMjgsIDExNF0sXHJcblx0XCJzYW5keWJyb3duXCI6IFsyNDQsIDE2NCwgOTZdLFxyXG5cdFwic2VhZ3JlZW5cIjogWzQ2LCAxMzksIDg3XSxcclxuXHRcInNlYXNoZWxsXCI6IFsyNTUsIDI0NSwgMjM4XSxcclxuXHRcInNpZW5uYVwiOiBbMTYwLCA4MiwgNDVdLFxyXG5cdFwic2lsdmVyXCI6IFsxOTIsIDE5MiwgMTkyXSxcclxuXHRcInNreWJsdWVcIjogWzEzNSwgMjA2LCAyMzVdLFxyXG5cdFwic2xhdGVibHVlXCI6IFsxMDYsIDkwLCAyMDVdLFxyXG5cdFwic2xhdGVncmF5XCI6IFsxMTIsIDEyOCwgMTQ0XSxcclxuXHRcInNsYXRlZ3JleVwiOiBbMTEyLCAxMjgsIDE0NF0sXHJcblx0XCJzbm93XCI6IFsyNTUsIDI1MCwgMjUwXSxcclxuXHRcInNwcmluZ2dyZWVuXCI6IFswLCAyNTUsIDEyN10sXHJcblx0XCJzdGVlbGJsdWVcIjogWzcwLCAxMzAsIDE4MF0sXHJcblx0XCJ0YW5cIjogWzIxMCwgMTgwLCAxNDBdLFxyXG5cdFwidGVhbFwiOiBbMCwgMTI4LCAxMjhdLFxyXG5cdFwidGhpc3RsZVwiOiBbMjE2LCAxOTEsIDIxNl0sXHJcblx0XCJ0b21hdG9cIjogWzI1NSwgOTksIDcxXSxcclxuXHRcInR1cnF1b2lzZVwiOiBbNjQsIDIyNCwgMjA4XSxcclxuXHRcInZpb2xldFwiOiBbMjM4LCAxMzAsIDIzOF0sXHJcblx0XCJ3aGVhdFwiOiBbMjQ1LCAyMjIsIDE3OV0sXHJcblx0XCJ3aGl0ZVwiOiBbMjU1LCAyNTUsIDI1NV0sXHJcblx0XCJ3aGl0ZXNtb2tlXCI6IFsyNDUsIDI0NSwgMjQ1XSxcclxuXHRcInllbGxvd1wiOiBbMjU1LCAyNTUsIDBdLFxyXG5cdFwieWVsbG93Z3JlZW5cIjogWzE1NCwgMjA1LCA1MF1cclxufTtcclxuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///319\n')},function(module,exports,__webpack_require__){eval("var conversions = __webpack_require__(184);\n\n/*\n\tthis function routes a model to all other models.\n\n\tall functions that are routed have a property `.conversion` attached\n\tto the returned synthetic function. This property is an array\n\tof strings, each with the steps in between the 'from' and 'to'\n\tcolor models (inclusive).\n\n\tconversions that are not possible simply are not included.\n*/\n\nfunction buildGraph() {\n\tvar graph = {};\n\t// https://jsperf.com/object-keys-vs-for-in-with-closure/3\n\tvar models = Object.keys(conversions);\n\n\tfor (var len = models.length, i = 0; i < len; i++) {\n\t\tgraph[models[i]] = {\n\t\t\t// http://jsperf.com/1-vs-infinity\n\t\t\t// micro-opt, but this is simple.\n\t\t\tdistance: -1,\n\t\t\tparent: null\n\t\t};\n\t}\n\n\treturn graph;\n}\n\n// https://en.wikipedia.org/wiki/Breadth-first_search\nfunction deriveBFS(fromModel) {\n\tvar graph = buildGraph();\n\tvar queue = [fromModel]; // unshift -> queue -> pop\n\n\tgraph[fromModel].distance = 0;\n\n\twhile (queue.length) {\n\t\tvar current = queue.pop();\n\t\tvar adjacents = Object.keys(conversions[current]);\n\n\t\tfor (var len = adjacents.length, i = 0; i < len; i++) {\n\t\t\tvar adjacent = adjacents[i];\n\t\t\tvar node = graph[adjacent];\n\n\t\t\tif (node.distance === -1) {\n\t\t\t\tnode.distance = graph[current].distance + 1;\n\t\t\t\tnode.parent = current;\n\t\t\t\tqueue.unshift(adjacent);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn graph;\n}\n\nfunction link(from, to) {\n\treturn function (args) {\n\t\treturn to(from(args));\n\t};\n}\n\nfunction wrapConversion(toModel, graph) {\n\tvar path = [graph[toModel].parent, toModel];\n\tvar fn = conversions[graph[toModel].parent][toModel];\n\n\tvar cur = graph[toModel].parent;\n\twhile (graph[cur].parent) {\n\t\tpath.unshift(graph[cur].parent);\n\t\tfn = link(conversions[graph[cur].parent][cur], fn);\n\t\tcur = graph[cur].parent;\n\t}\n\n\tfn.conversion = path;\n\treturn fn;\n}\n\nmodule.exports = function (fromModel) {\n\tvar graph = deriveBFS(fromModel);\n\tvar conversion = {};\n\n\tvar models = Object.keys(graph);\n\tfor (var len = models.length, i = 0; i < len; i++) {\n\t\tvar toModel = models[i];\n\t\tvar node = graph[toModel];\n\n\t\tif (node.parent === null) {\n\t\t\t// no possible conversion, or this node is the source model.\n\t\t\tcontinue;\n\t\t}\n\n\t\tconversion[toModel] = wrapConversion(toModel, graph);\n\t}\n\n\treturn conversion;\n};\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29sb3ItY29udmVydC9yb3V0ZS5qcz9hMjc5Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGtCQUFrQixtQkFBTyxDQUFDLEdBQWU7O0FBRXpDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxxQ0FBcUMsU0FBUztBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5Qjs7QUFFekI7O0FBRUE7QUFDQTtBQUNBOztBQUVBLHlDQUF5QyxTQUFTO0FBQ2xEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHFDQUFxQyxTQUFTO0FBQzlDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBIiwiZmlsZSI6IjMyMC5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBjb252ZXJzaW9ucyA9IHJlcXVpcmUoJy4vY29udmVyc2lvbnMnKTtcblxuLypcblx0dGhpcyBmdW5jdGlvbiByb3V0ZXMgYSBtb2RlbCB0byBhbGwgb3RoZXIgbW9kZWxzLlxuXG5cdGFsbCBmdW5jdGlvbnMgdGhhdCBhcmUgcm91dGVkIGhhdmUgYSBwcm9wZXJ0eSBgLmNvbnZlcnNpb25gIGF0dGFjaGVkXG5cdHRvIHRoZSByZXR1cm5lZCBzeW50aGV0aWMgZnVuY3Rpb24uIFRoaXMgcHJvcGVydHkgaXMgYW4gYXJyYXlcblx0b2Ygc3RyaW5ncywgZWFjaCB3aXRoIHRoZSBzdGVwcyBpbiBiZXR3ZWVuIHRoZSAnZnJvbScgYW5kICd0bydcblx0Y29sb3IgbW9kZWxzIChpbmNsdXNpdmUpLlxuXG5cdGNvbnZlcnNpb25zIHRoYXQgYXJlIG5vdCBwb3NzaWJsZSBzaW1wbHkgYXJlIG5vdCBpbmNsdWRlZC5cbiovXG5cbmZ1bmN0aW9uIGJ1aWxkR3JhcGgoKSB7XG5cdHZhciBncmFwaCA9IHt9O1xuXHQvLyBodHRwczovL2pzcGVyZi5jb20vb2JqZWN0LWtleXMtdnMtZm9yLWluLXdpdGgtY2xvc3VyZS8zXG5cdHZhciBtb2RlbHMgPSBPYmplY3Qua2V5cyhjb252ZXJzaW9ucyk7XG5cblx0Zm9yICh2YXIgbGVuID0gbW9kZWxzLmxlbmd0aCwgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuXHRcdGdyYXBoW21vZGVsc1tpXV0gPSB7XG5cdFx0XHQvLyBodHRwOi8vanNwZXJmLmNvbS8xLXZzLWluZmluaXR5XG5cdFx0XHQvLyBtaWNyby1vcHQsIGJ1dCB0aGlzIGlzIHNpbXBsZS5cblx0XHRcdGRpc3RhbmNlOiAtMSxcblx0XHRcdHBhcmVudDogbnVsbFxuXHRcdH07XG5cdH1cblxuXHRyZXR1cm4gZ3JhcGg7XG59XG5cbi8vIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0JyZWFkdGgtZmlyc3Rfc2VhcmNoXG5mdW5jdGlvbiBkZXJpdmVCRlMoZnJvbU1vZGVsKSB7XG5cdHZhciBncmFwaCA9IGJ1aWxkR3JhcGgoKTtcblx0dmFyIHF1ZXVlID0gW2Zyb21Nb2RlbF07IC8vIHVuc2hpZnQgLT4gcXVldWUgLT4gcG9wXG5cblx0Z3JhcGhbZnJvbU1vZGVsXS5kaXN0YW5jZSA9IDA7XG5cblx0d2hpbGUgKHF1ZXVlLmxlbmd0aCkge1xuXHRcdHZhciBjdXJyZW50ID0gcXVldWUucG9wKCk7XG5cdFx0dmFyIGFkamFjZW50cyA9IE9iamVjdC5rZXlzKGNvbnZlcnNpb25zW2N1cnJlbnRdKTtcblxuXHRcdGZvciAodmFyIGxlbiA9IGFkamFjZW50cy5sZW5ndGgsIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcblx0XHRcdHZhciBhZGphY2VudCA9IGFkamFjZW50c1tpXTtcblx0XHRcdHZhciBub2RlID0gZ3JhcGhbYWRqYWNlbnRdO1xuXG5cdFx0XHRpZiAobm9kZS5kaXN0YW5jZSA9PT0gLTEpIHtcblx0XHRcdFx0bm9kZS5kaXN0YW5jZSA9IGdyYXBoW2N1cnJlbnRdLmRpc3RhbmNlICsgMTtcblx0XHRcdFx0bm9kZS5wYXJlbnQgPSBjdXJyZW50O1xuXHRcdFx0XHRxdWV1ZS51bnNoaWZ0KGFkamFjZW50KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gZ3JhcGg7XG59XG5cbmZ1bmN0aW9uIGxpbmsoZnJvbSwgdG8pIHtcblx0cmV0dXJuIGZ1bmN0aW9uIChhcmdzKSB7XG5cdFx0cmV0dXJuIHRvKGZyb20oYXJncykpO1xuXHR9O1xufVxuXG5mdW5jdGlvbiB3cmFwQ29udmVyc2lvbih0b01vZGVsLCBncmFwaCkge1xuXHR2YXIgcGF0aCA9IFtncmFwaFt0b01vZGVsXS5wYXJlbnQsIHRvTW9kZWxdO1xuXHR2YXIgZm4gPSBjb252ZXJzaW9uc1tncmFwaFt0b01vZGVsXS5wYXJlbnRdW3RvTW9kZWxdO1xuXG5cdHZhciBjdXIgPSBncmFwaFt0b01vZGVsXS5wYXJlbnQ7XG5cdHdoaWxlIChncmFwaFtjdXJdLnBhcmVudCkge1xuXHRcdHBhdGgudW5zaGlmdChncmFwaFtjdXJdLnBhcmVudCk7XG5cdFx0Zm4gPSBsaW5rKGNvbnZlcnNpb25zW2dyYXBoW2N1cl0ucGFyZW50XVtjdXJdLCBmbik7XG5cdFx0Y3VyID0gZ3JhcGhbY3VyXS5wYXJlbnQ7XG5cdH1cblxuXHRmbi5jb252ZXJzaW9uID0gcGF0aDtcblx0cmV0dXJuIGZuO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChmcm9tTW9kZWwpIHtcblx0dmFyIGdyYXBoID0gZGVyaXZlQkZTKGZyb21Nb2RlbCk7XG5cdHZhciBjb252ZXJzaW9uID0ge307XG5cblx0dmFyIG1vZGVscyA9IE9iamVjdC5rZXlzKGdyYXBoKTtcblx0Zm9yICh2YXIgbGVuID0gbW9kZWxzLmxlbmd0aCwgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuXHRcdHZhciB0b01vZGVsID0gbW9kZWxzW2ldO1xuXHRcdHZhciBub2RlID0gZ3JhcGhbdG9Nb2RlbF07XG5cblx0XHRpZiAobm9kZS5wYXJlbnQgPT09IG51bGwpIHtcblx0XHRcdC8vIG5vIHBvc3NpYmxlIGNvbnZlcnNpb24sIG9yIHRoaXMgbm9kZSBpcyB0aGUgc291cmNlIG1vZGVsLlxuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXG5cdFx0Y29udmVyc2lvblt0b01vZGVsXSA9IHdyYXBDb252ZXJzaW9uKHRvTW9kZWwsIGdyYXBoKTtcblx0fVxuXG5cdHJldHVybiBjb252ZXJzaW9uO1xufTtcblxuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///320\n")},function(module,exports,__webpack_require__){eval('/**\n * Copyright (c) 2014, Chris Pettitt\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation\n * and/or other materials provided with the distribution.\n *\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\nvar lib = __webpack_require__(322);\n\nmodule.exports = {\n Graph: lib.Graph,\n json: __webpack_require__(424),\n alg: __webpack_require__(425),\n version: lib.version\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZ3JhcGhsaWIvaW5kZXguanM/ZTAwOCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLCtCQUErQjtBQUMzQztBQUNBO0FBQ0E7QUFDQTs7QUFFQSxVQUFVLG1CQUFPLENBQUMsR0FBTzs7QUFFekI7QUFDQTtBQUNBLFFBQVEsbUJBQU8sQ0FBQyxHQUFZO0FBQzVCLE9BQU8sbUJBQU8sQ0FBQyxHQUFXO0FBQzFCO0FBQ0EiLCJmaWxlIjoiMzIxLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQsIENocmlzIFBldHRpdHRcbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbiAqXG4gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiAqIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICpcbiAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiAqIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb25cbiAqIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuICpcbiAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGNvcHlyaWdodCBob2xkZXIgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzXG4gKiBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dFxuICogc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuICpcbiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiIEFORFxuICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRURcbiAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkVcbiAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEVcbiAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMXG4gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUlxuICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVJcbiAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksXG4gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRVxuICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiAqL1xuXG52YXIgbGliID0gcmVxdWlyZShcIi4vbGliXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgR3JhcGg6IGxpYi5HcmFwaCxcbiAganNvbjogcmVxdWlyZShcIi4vbGliL2pzb25cIiksXG4gIGFsZzogcmVxdWlyZShcIi4vbGliL2FsZ1wiKSxcbiAgdmVyc2lvbjogbGliLnZlcnNpb25cbn07XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///321\n')},function(module,exports,__webpack_require__){eval('// Includes only the "core" of graphlib\nmodule.exports = {\n Graph: __webpack_require__(152),\n version: __webpack_require__(423)\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZ3JhcGhsaWIvbGliL2luZGV4LmpzPzAxY2UiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBLFNBQVMsbUJBQU8sQ0FBQyxHQUFTO0FBQzFCLFdBQVcsbUJBQU8sQ0FBQyxHQUFXO0FBQzlCIiwiZmlsZSI6IjMyMi5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEluY2x1ZGVzIG9ubHkgdGhlIFwiY29yZVwiIG9mIGdyYXBobGliXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgR3JhcGg6IHJlcXVpcmUoXCIuL2dyYXBoXCIpLFxuICB2ZXJzaW9uOiByZXF1aXJlKFwiLi92ZXJzaW9uXCIpXG59O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///322\n')},function(module,exports,__webpack_require__){eval("var baseClone = __webpack_require__(185);\n\n/** Used to compose bitmasks for cloning. */\nvar CLONE_SYMBOLS_FLAG = 4;\n\n/**\n * Creates a shallow clone of `value`.\n *\n * **Note:** This method is loosely based on the\n * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)\n * and supports cloning arrays, array buffers, booleans, date objects, maps,\n * numbers, `Object` objects, regexes, sets, strings, symbols, and typed\n * arrays. The own enumerable properties of `arguments` objects are cloned\n * as plain objects. An empty object is returned for uncloneable values such\n * as error objects, functions, DOM nodes, and WeakMaps.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to clone.\n * @returns {*} Returns the cloned value.\n * @see _.cloneDeep\n * @example\n *\n * var objects = [{ 'a': 1 }, { 'b': 2 }];\n *\n * var shallow = _.clone(objects);\n * console.log(shallow[0] === objects[0]);\n * // => true\n */\nfunction clone(value) {\n return baseClone(value, CLONE_SYMBOLS_FLAG);\n}\n\nmodule.exports = clone;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL2Nsb25lLmpzP2I4Y2UiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsZ0JBQWdCLG1CQUFPLENBQUMsR0FBYzs7QUFFdEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEVBQUU7QUFDYixhQUFhLEVBQUU7QUFDZjtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsU0FBUyxHQUFHLFNBQVM7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsImZpbGUiOiIzMjMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYmFzZUNsb25lID0gcmVxdWlyZSgnLi9fYmFzZUNsb25lJyk7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIGNsb25pbmcuICovXG52YXIgQ0xPTkVfU1lNQk9MU19GTEFHID0gNDtcblxuLyoqXG4gKiBDcmVhdGVzIGEgc2hhbGxvdyBjbG9uZSBvZiBgdmFsdWVgLlxuICpcbiAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBsb29zZWx5IGJhc2VkIG9uIHRoZVxuICogW3N0cnVjdHVyZWQgY2xvbmUgYWxnb3JpdGhtXShodHRwczovL21kbi5pby9TdHJ1Y3R1cmVkX2Nsb25lX2FsZ29yaXRobSlcbiAqIGFuZCBzdXBwb3J0cyBjbG9uaW5nIGFycmF5cywgYXJyYXkgYnVmZmVycywgYm9vbGVhbnMsIGRhdGUgb2JqZWN0cywgbWFwcyxcbiAqIG51bWJlcnMsIGBPYmplY3RgIG9iamVjdHMsIHJlZ2V4ZXMsIHNldHMsIHN0cmluZ3MsIHN5bWJvbHMsIGFuZCB0eXBlZFxuICogYXJyYXlzLiBUaGUgb3duIGVudW1lcmFibGUgcHJvcGVydGllcyBvZiBgYXJndW1lbnRzYCBvYmplY3RzIGFyZSBjbG9uZWRcbiAqIGFzIHBsYWluIG9iamVjdHMuIEFuIGVtcHR5IG9iamVjdCBpcyByZXR1cm5lZCBmb3IgdW5jbG9uZWFibGUgdmFsdWVzIHN1Y2hcbiAqIGFzIGVycm9yIG9iamVjdHMsIGZ1bmN0aW9ucywgRE9NIG5vZGVzLCBhbmQgV2Vha01hcHMuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNsb25lLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGNsb25lZCB2YWx1ZS5cbiAqIEBzZWUgXy5jbG9uZURlZXBcbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdHMgPSBbeyAnYSc6IDEgfSwgeyAnYic6IDIgfV07XG4gKlxuICogdmFyIHNoYWxsb3cgPSBfLmNsb25lKG9iamVjdHMpO1xuICogY29uc29sZS5sb2coc2hhbGxvd1swXSA9PT0gb2JqZWN0c1swXSk7XG4gKiAvLyA9PiB0cnVlXG4gKi9cbmZ1bmN0aW9uIGNsb25lKHZhbHVlKSB7XG4gIHJldHVybiBiYXNlQ2xvbmUodmFsdWUsIENMT05FX1NZTUJPTFNfRkxBRyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY2xvbmU7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///323\n")},function(module,exports){eval("/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n this.__data__ = [];\n this.size = 0;\n}\n\nmodule.exports = listCacheClear;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19saXN0Q2FjaGVDbGVhci5qcz8yOGM5Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJmaWxlIjoiMzI0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBSZW1vdmVzIGFsbCBrZXktdmFsdWUgZW50cmllcyBmcm9tIHRoZSBsaXN0IGNhY2hlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBjbGVhclxuICogQG1lbWJlck9mIExpc3RDYWNoZVxuICovXG5mdW5jdGlvbiBsaXN0Q2FjaGVDbGVhcigpIHtcbiAgdGhpcy5fX2RhdGFfXyA9IFtdO1xuICB0aGlzLnNpemUgPSAwO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGxpc3RDYWNoZUNsZWFyO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///324\n")},function(module,exports,__webpack_require__){eval("var assocIndexOf = __webpack_require__(101);\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype;\n\n/** Built-in value references. */\nvar splice = arrayProto.splice;\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n return false;\n }\n var lastIndex = data.length - 1;\n if (index == lastIndex) {\n data.pop();\n } else {\n splice.call(data, index, 1);\n }\n --this.size;\n return true;\n}\n\nmodule.exports = listCacheDelete;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19saXN0Q2FjaGVEZWxldGUuanM/NjlkNSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxtQkFBbUIsbUJBQU8sQ0FBQyxHQUFpQjs7QUFFNUM7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJmaWxlIjoiMzI1LmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIGFzc29jSW5kZXhPZiA9IHJlcXVpcmUoJy4vX2Fzc29jSW5kZXhPZicpO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgYXJyYXlQcm90byA9IEFycmF5LnByb3RvdHlwZTtcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgc3BsaWNlID0gYXJyYXlQcm90by5zcGxpY2U7XG5cbi8qKlxuICogUmVtb3ZlcyBga2V5YCBhbmQgaXRzIHZhbHVlIGZyb20gdGhlIGxpc3QgY2FjaGUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGRlbGV0ZVxuICogQG1lbWJlck9mIExpc3RDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byByZW1vdmUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGVudHJ5IHdhcyByZW1vdmVkLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGxpc3RDYWNoZURlbGV0ZShrZXkpIHtcbiAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fLFxuICAgICAgaW5kZXggPSBhc3NvY0luZGV4T2YoZGF0YSwga2V5KTtcblxuICBpZiAoaW5kZXggPCAwKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciBsYXN0SW5kZXggPSBkYXRhLmxlbmd0aCAtIDE7XG4gIGlmIChpbmRleCA9PSBsYXN0SW5kZXgpIHtcbiAgICBkYXRhLnBvcCgpO1xuICB9IGVsc2Uge1xuICAgIHNwbGljZS5jYWxsKGRhdGEsIGluZGV4LCAxKTtcbiAgfVxuICAtLXRoaXMuc2l6ZTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbGlzdENhY2hlRGVsZXRlO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///325\n")},function(module,exports,__webpack_require__){eval("var assocIndexOf = __webpack_require__(101);\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n return index < 0 ? undefined : data[index][1];\n}\n\nmodule.exports = listCacheGet;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19saXN0Q2FjaGVHZXQuanM/YjRjMCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxtQkFBbUIsbUJBQU8sQ0FBQyxHQUFpQjs7QUFFNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsRUFBRTtBQUNmO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEiLCJmaWxlIjoiMzI2LmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIGFzc29jSW5kZXhPZiA9IHJlcXVpcmUoJy4vX2Fzc29jSW5kZXhPZicpO1xuXG4vKipcbiAqIEdldHMgdGhlIGxpc3QgY2FjaGUgdmFsdWUgZm9yIGBrZXlgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBnZXRcbiAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gZ2V0LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGVudHJ5IHZhbHVlLlxuICovXG5mdW5jdGlvbiBsaXN0Q2FjaGVHZXQoa2V5KSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyxcbiAgICAgIGluZGV4ID0gYXNzb2NJbmRleE9mKGRhdGEsIGtleSk7XG5cbiAgcmV0dXJuIGluZGV4IDwgMCA/IHVuZGVmaW5lZCA6IGRhdGFbaW5kZXhdWzFdO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGxpc3RDYWNoZUdldDtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///326\n")},function(module,exports,__webpack_require__){eval("var assocIndexOf = __webpack_require__(101);\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n return assocIndexOf(this.__data__, key) > -1;\n}\n\nmodule.exports = listCacheHas;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19saXN0Q2FjaGVIYXMuanM/ZmJhNSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxtQkFBbUIsbUJBQU8sQ0FBQyxHQUFpQjs7QUFFNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsImZpbGUiOiIzMjcuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYXNzb2NJbmRleE9mID0gcmVxdWlyZSgnLi9fYXNzb2NJbmRleE9mJyk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgbGlzdCBjYWNoZSB2YWx1ZSBmb3IgYGtleWAgZXhpc3RzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBoYXNcbiAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgZW50cnkgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW4gZW50cnkgZm9yIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBsaXN0Q2FjaGVIYXMoa2V5KSB7XG4gIHJldHVybiBhc3NvY0luZGV4T2YodGhpcy5fX2RhdGFfXywga2V5KSA+IC0xO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGxpc3RDYWNoZUhhcztcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///327\n")},function(module,exports,__webpack_require__){eval("var assocIndexOf = __webpack_require__(101);\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n ++this.size;\n data.push([key, value]);\n } else {\n data[index][1] = value;\n }\n return this;\n}\n\nmodule.exports = listCacheSet;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19saXN0Q2FjaGVTZXQuanM/NjdjYSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxtQkFBbUIsbUJBQU8sQ0FBQyxHQUFpQjs7QUFFNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsRUFBRTtBQUNiLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJmaWxlIjoiMzI4LmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIGFzc29jSW5kZXhPZiA9IHJlcXVpcmUoJy4vX2Fzc29jSW5kZXhPZicpO1xuXG4vKipcbiAqIFNldHMgdGhlIGxpc3QgY2FjaGUgYGtleWAgdG8gYHZhbHVlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgc2V0XG4gKiBAbWVtYmVyT2YgTGlzdENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHNldC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGxpc3QgY2FjaGUgaW5zdGFuY2UuXG4gKi9cbmZ1bmN0aW9uIGxpc3RDYWNoZVNldChrZXksIHZhbHVlKSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyxcbiAgICAgIGluZGV4ID0gYXNzb2NJbmRleE9mKGRhdGEsIGtleSk7XG5cbiAgaWYgKGluZGV4IDwgMCkge1xuICAgICsrdGhpcy5zaXplO1xuICAgIGRhdGEucHVzaChba2V5LCB2YWx1ZV0pO1xuICB9IGVsc2Uge1xuICAgIGRhdGFbaW5kZXhdWzFdID0gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbGlzdENhY2hlU2V0O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///328\n")},function(module,exports,__webpack_require__){eval("var ListCache = __webpack_require__(100);\n\n/**\n * Removes all key-value entries from the stack.\n *\n * @private\n * @name clear\n * @memberOf Stack\n */\nfunction stackClear() {\n this.__data__ = new ListCache;\n this.size = 0;\n}\n\nmodule.exports = stackClear;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19zdGFja0NsZWFyLmpzP2VmYjYiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsZ0JBQWdCLG1CQUFPLENBQUMsR0FBYzs7QUFFdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsImZpbGUiOiIzMjkuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgTGlzdENhY2hlID0gcmVxdWlyZSgnLi9fTGlzdENhY2hlJyk7XG5cbi8qKlxuICogUmVtb3ZlcyBhbGwga2V5LXZhbHVlIGVudHJpZXMgZnJvbSB0aGUgc3RhY2suXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGNsZWFyXG4gKiBAbWVtYmVyT2YgU3RhY2tcbiAqL1xuZnVuY3Rpb24gc3RhY2tDbGVhcigpIHtcbiAgdGhpcy5fX2RhdGFfXyA9IG5ldyBMaXN0Q2FjaGU7XG4gIHRoaXMuc2l6ZSA9IDA7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc3RhY2tDbGVhcjtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///329\n")},function(module,exports){eval("/**\n * Removes `key` and its value from the stack.\n *\n * @private\n * @name delete\n * @memberOf Stack\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction stackDelete(key) {\n var data = this.__data__,\n result = data['delete'](key);\n\n this.size = data.size;\n return result;\n}\n\nmodule.exports = stackDelete;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19zdGFja0RlbGV0ZS5qcz8yZmNjIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBIiwiZmlsZSI6IjMzMC5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUmVtb3ZlcyBga2V5YCBhbmQgaXRzIHZhbHVlIGZyb20gdGhlIHN0YWNrLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBkZWxldGVcbiAqIEBtZW1iZXJPZiBTdGFja1xuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byByZW1vdmUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGVudHJ5IHdhcyByZW1vdmVkLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIHN0YWNrRGVsZXRlKGtleSkge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX18sXG4gICAgICByZXN1bHQgPSBkYXRhWydkZWxldGUnXShrZXkpO1xuXG4gIHRoaXMuc2l6ZSA9IGRhdGEuc2l6ZTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdGFja0RlbGV0ZTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///330\n")},function(module,exports){eval("/**\n * Gets the stack value for `key`.\n *\n * @private\n * @name get\n * @memberOf Stack\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction stackGet(key) {\n return this.__data__.get(key);\n}\n\nmodule.exports = stackGet;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19zdGFja0dldC5qcz84MDJhIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixhQUFhLEVBQUU7QUFDZjtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsImZpbGUiOiIzMzEuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdldHMgdGhlIHN0YWNrIHZhbHVlIGZvciBga2V5YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgZ2V0XG4gKiBAbWVtYmVyT2YgU3RhY2tcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gZ2V0LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGVudHJ5IHZhbHVlLlxuICovXG5mdW5jdGlvbiBzdGFja0dldChrZXkpIHtcbiAgcmV0dXJuIHRoaXMuX19kYXRhX18uZ2V0KGtleSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc3RhY2tHZXQ7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///331\n")},function(module,exports){eval("/**\n * Checks if a stack value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Stack\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction stackHas(key) {\n return this.__data__.has(key);\n}\n\nmodule.exports = stackHas;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19zdGFja0hhcy5qcz81NWEzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJmaWxlIjoiMzMyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDaGVja3MgaWYgYSBzdGFjayB2YWx1ZSBmb3IgYGtleWAgZXhpc3RzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBoYXNcbiAqIEBtZW1iZXJPZiBTdGFja1xuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIHN0YWNrSGFzKGtleSkge1xuICByZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXMoa2V5KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdGFja0hhcztcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///332\n")},function(module,exports,__webpack_require__){eval("var ListCache = __webpack_require__(100),\n Map = __webpack_require__(153),\n MapCache = __webpack_require__(154);\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * Sets the stack `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Stack\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the stack cache instance.\n */\nfunction stackSet(key, value) {\n var data = this.__data__;\n if (data instanceof ListCache) {\n var pairs = data.__data__;\n if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n pairs.push([key, value]);\n this.size = ++data.size;\n return this;\n }\n data = this.__data__ = new MapCache(pairs);\n }\n data.set(key, value);\n this.size = data.size;\n return this;\n}\n\nmodule.exports = stackSet;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19zdGFja1NldC5qcz9kMDJjIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGdCQUFnQixtQkFBTyxDQUFDLEdBQWM7QUFDdEMsVUFBVSxtQkFBTyxDQUFDLEdBQVE7QUFDMUIsZUFBZSxtQkFBTyxDQUFDLEdBQWE7O0FBRXBDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsRUFBRTtBQUNiLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsImZpbGUiOiIzMzMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgTGlzdENhY2hlID0gcmVxdWlyZSgnLi9fTGlzdENhY2hlJyksXG4gICAgTWFwID0gcmVxdWlyZSgnLi9fTWFwJyksXG4gICAgTWFwQ2FjaGUgPSByZXF1aXJlKCcuL19NYXBDYWNoZScpO1xuXG4vKiogVXNlZCBhcyB0aGUgc2l6ZSB0byBlbmFibGUgbGFyZ2UgYXJyYXkgb3B0aW1pemF0aW9ucy4gKi9cbnZhciBMQVJHRV9BUlJBWV9TSVpFID0gMjAwO1xuXG4vKipcbiAqIFNldHMgdGhlIHN0YWNrIGBrZXlgIHRvIGB2YWx1ZWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIHNldFxuICogQG1lbWJlck9mIFN0YWNrXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHNldC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIHN0YWNrIGNhY2hlIGluc3RhbmNlLlxuICovXG5mdW5jdGlvbiBzdGFja1NldChrZXksIHZhbHVlKSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXztcbiAgaWYgKGRhdGEgaW5zdGFuY2VvZiBMaXN0Q2FjaGUpIHtcbiAgICB2YXIgcGFpcnMgPSBkYXRhLl9fZGF0YV9fO1xuICAgIGlmICghTWFwIHx8IChwYWlycy5sZW5ndGggPCBMQVJHRV9BUlJBWV9TSVpFIC0gMSkpIHtcbiAgICAgIHBhaXJzLnB1c2goW2tleSwgdmFsdWVdKTtcbiAgICAgIHRoaXMuc2l6ZSA9ICsrZGF0YS5zaXplO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGRhdGEgPSB0aGlzLl9fZGF0YV9fID0gbmV3IE1hcENhY2hlKHBhaXJzKTtcbiAgfVxuICBkYXRhLnNldChrZXksIHZhbHVlKTtcbiAgdGhpcy5zaXplID0gZGF0YS5zaXplO1xuICByZXR1cm4gdGhpcztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdGFja1NldDtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///333\n")},function(module,exports,__webpack_require__){eval("var isFunction = __webpack_require__(86),\n isMasked = __webpack_require__(337),\n isObject = __webpack_require__(43),\n toSource = __webpack_require__(188);\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n */\nfunction baseIsNative(value) {\n if (!isObject(value) || isMasked(value)) {\n return false;\n }\n var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n return pattern.test(toSource(value));\n}\n\nmodule.exports = baseIsNative;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlSXNOYXRpdmUuanM/MzRhYyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxpQkFBaUIsbUJBQU8sQ0FBQyxFQUFjO0FBQ3ZDLGVBQWUsbUJBQU8sQ0FBQyxHQUFhO0FBQ3BDLGVBQWUsbUJBQU8sQ0FBQyxFQUFZO0FBQ25DLGVBQWUsbUJBQU8sQ0FBQyxHQUFhOztBQUVwQztBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQzs7QUFFcEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEVBQUU7QUFDYixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwiZmlsZSI6IjMzNC5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBpc0Z1bmN0aW9uID0gcmVxdWlyZSgnLi9pc0Z1bmN0aW9uJyksXG4gICAgaXNNYXNrZWQgPSByZXF1aXJlKCcuL19pc01hc2tlZCcpLFxuICAgIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9pc09iamVjdCcpLFxuICAgIHRvU291cmNlID0gcmVxdWlyZSgnLi9fdG9Tb3VyY2UnKTtcblxuLyoqXG4gKiBVc2VkIHRvIG1hdGNoIGBSZWdFeHBgXG4gKiBbc3ludGF4IGNoYXJhY3RlcnNdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXBhdHRlcm5zKS5cbiAqL1xudmFyIHJlUmVnRXhwQ2hhciA9IC9bXFxcXF4kLiorPygpW1xcXXt9fF0vZztcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IGhvc3QgY29uc3RydWN0b3JzIChTYWZhcmkpLiAqL1xudmFyIHJlSXNIb3N0Q3RvciA9IC9eXFxbb2JqZWN0IC4rP0NvbnN0cnVjdG9yXFxdJC87XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBmdW5jUHJvdG8gPSBGdW5jdGlvbi5wcm90b3R5cGUsXG4gICAgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byByZXNvbHZlIHRoZSBkZWNvbXBpbGVkIHNvdXJjZSBvZiBmdW5jdGlvbnMuICovXG52YXIgZnVuY1RvU3RyaW5nID0gZnVuY1Byb3RvLnRvU3RyaW5nO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKiogVXNlZCB0byBkZXRlY3QgaWYgYSBtZXRob2QgaXMgbmF0aXZlLiAqL1xudmFyIHJlSXNOYXRpdmUgPSBSZWdFeHAoJ14nICtcbiAgZnVuY1RvU3RyaW5nLmNhbGwoaGFzT3duUHJvcGVydHkpLnJlcGxhY2UocmVSZWdFeHBDaGFyLCAnXFxcXCQmJylcbiAgLnJlcGxhY2UoL2hhc093blByb3BlcnR5fChmdW5jdGlvbikuKj8oPz1cXFxcXFwoKXwgZm9yIC4rPyg/PVxcXFxcXF0pL2csICckMS4qPycpICsgJyQnXG4pO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzTmF0aXZlYCB3aXRob3V0IGJhZCBzaGltIGNoZWNrcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIG5hdGl2ZSBmdW5jdGlvbixcbiAqICBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VJc05hdGl2ZSh2YWx1ZSkge1xuICBpZiAoIWlzT2JqZWN0KHZhbHVlKSB8fCBpc01hc2tlZCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIHBhdHRlcm4gPSBpc0Z1bmN0aW9uKHZhbHVlKSA/IHJlSXNOYXRpdmUgOiByZUlzSG9zdEN0b3I7XG4gIHJldHVybiBwYXR0ZXJuLnRlc3QodG9Tb3VyY2UodmFsdWUpKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlSXNOYXRpdmU7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///334\n")},function(module,exports,__webpack_require__){eval("var Symbol = __webpack_require__(73);\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n}\n\nmodule.exports = getRawTag;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19nZXRSYXdUYWcuanM/MDBmZCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxhQUFhLG1CQUFPLENBQUMsRUFBVzs7QUFFaEM7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxFQUFFO0FBQ2IsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsImZpbGUiOiIzMzUuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgU3ltYm9sID0gcmVxdWlyZSgnLi9fU3ltYm9sJyk7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogVXNlZCB0byByZXNvbHZlIHRoZVxuICogW2B0b1N0cmluZ1RhZ2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmcpXG4gKiBvZiB2YWx1ZXMuXG4gKi9cbnZhciBuYXRpdmVPYmplY3RUb1N0cmluZyA9IG9iamVjdFByb3RvLnRvU3RyaW5nO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBzeW1Ub1N0cmluZ1RhZyA9IFN5bWJvbCA/IFN5bWJvbC50b1N0cmluZ1RhZyA6IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VHZXRUYWdgIHdoaWNoIGlnbm9yZXMgYFN5bWJvbC50b1N0cmluZ1RhZ2AgdmFsdWVzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHJhdyBgdG9TdHJpbmdUYWdgLlxuICovXG5mdW5jdGlvbiBnZXRSYXdUYWcodmFsdWUpIHtcbiAgdmFyIGlzT3duID0gaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwgc3ltVG9TdHJpbmdUYWcpLFxuICAgICAgdGFnID0gdmFsdWVbc3ltVG9TdHJpbmdUYWddO1xuXG4gIHRyeSB7XG4gICAgdmFsdWVbc3ltVG9TdHJpbmdUYWddID0gdW5kZWZpbmVkO1xuICAgIHZhciB1bm1hc2tlZCA9IHRydWU7XG4gIH0gY2F0Y2ggKGUpIHt9XG5cbiAgdmFyIHJlc3VsdCA9IG5hdGl2ZU9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpO1xuICBpZiAodW5tYXNrZWQpIHtcbiAgICBpZiAoaXNPd24pIHtcbiAgICAgIHZhbHVlW3N5bVRvU3RyaW5nVGFnXSA9IHRhZztcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRlIHZhbHVlW3N5bVRvU3RyaW5nVGFnXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBnZXRSYXdUYWc7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///335\n")},function(module,exports){eval("/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n return nativeObjectToString.call(value);\n}\n\nmodule.exports = objectToString;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19vYmplY3RUb1N0cmluZy5qcz8yOWYzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxFQUFFO0FBQ2IsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwiZmlsZSI6IjMzNi5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKlxuICogVXNlZCB0byByZXNvbHZlIHRoZVxuICogW2B0b1N0cmluZ1RhZ2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmcpXG4gKiBvZiB2YWx1ZXMuXG4gKi9cbnZhciBuYXRpdmVPYmplY3RUb1N0cmluZyA9IG9iamVjdFByb3RvLnRvU3RyaW5nO1xuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBzdHJpbmcgdXNpbmcgYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY29udmVydGVkIHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gb2JqZWN0VG9TdHJpbmcodmFsdWUpIHtcbiAgcmV0dXJuIG5hdGl2ZU9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG9iamVjdFRvU3RyaW5nO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///336\n")},function(module,exports,__webpack_require__){eval("var coreJsData = __webpack_require__(338);\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n return !!maskSrcKey && (maskSrcKey in func);\n}\n\nmodule.exports = isMasked;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19pc01hc2tlZC5qcz8xMzY4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGlCQUFpQixtQkFBTyxDQUFDLEdBQWU7O0FBRXhDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsU0FBUztBQUNwQixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJmaWxlIjoiMzM3LmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIGNvcmVKc0RhdGEgPSByZXF1aXJlKCcuL19jb3JlSnNEYXRhJyk7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBtZXRob2RzIG1hc3F1ZXJhZGluZyBhcyBuYXRpdmUuICovXG52YXIgbWFza1NyY0tleSA9IChmdW5jdGlvbigpIHtcbiAgdmFyIHVpZCA9IC9bXi5dKyQvLmV4ZWMoY29yZUpzRGF0YSAmJiBjb3JlSnNEYXRhLmtleXMgJiYgY29yZUpzRGF0YS5rZXlzLklFX1BST1RPIHx8ICcnKTtcbiAgcmV0dXJuIHVpZCA/ICgnU3ltYm9sKHNyYylfMS4nICsgdWlkKSA6ICcnO1xufSgpKTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYGZ1bmNgIGhhcyBpdHMgc291cmNlIG1hc2tlZC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYGZ1bmNgIGlzIG1hc2tlZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc01hc2tlZChmdW5jKSB7XG4gIHJldHVybiAhIW1hc2tTcmNLZXkgJiYgKG1hc2tTcmNLZXkgaW4gZnVuYyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNNYXNrZWQ7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///337\n")},function(module,exports,__webpack_require__){eval("var root = __webpack_require__(47);\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\nmodule.exports = coreJsData;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jb3JlSnNEYXRhLmpzP2RhMDMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsV0FBVyxtQkFBTyxDQUFDLEVBQVM7O0FBRTVCO0FBQ0E7O0FBRUEiLCJmaWxlIjoiMzM4LmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIHJvb3QgPSByZXF1aXJlKCcuL19yb290Jyk7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBvdmVycmVhY2hpbmcgY29yZS1qcyBzaGltcy4gKi9cbnZhciBjb3JlSnNEYXRhID0gcm9vdFsnX19jb3JlLWpzX3NoYXJlZF9fJ107XG5cbm1vZHVsZS5leHBvcnRzID0gY29yZUpzRGF0YTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///338\n")},function(module,exports){eval("/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n return object == null ? undefined : object[key];\n}\n\nmodule.exports = getValue;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19nZXRWYWx1ZS5qcz8zNjk4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixhQUFhLEVBQUU7QUFDZjtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsImZpbGUiOiIzMzkuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdldHMgdGhlIHZhbHVlIGF0IGBrZXlgIG9mIGBvYmplY3RgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gW29iamVjdF0gVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHByb3BlcnR5IHZhbHVlLlxuICovXG5mdW5jdGlvbiBnZXRWYWx1ZShvYmplY3QsIGtleSkge1xuICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyB1bmRlZmluZWQgOiBvYmplY3Rba2V5XTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBnZXRWYWx1ZTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///339\n")},function(module,exports,__webpack_require__){eval("var Hash = __webpack_require__(341),\n ListCache = __webpack_require__(100),\n Map = __webpack_require__(153);\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n this.size = 0;\n this.__data__ = {\n 'hash': new Hash,\n 'map': new (Map || ListCache),\n 'string': new Hash\n };\n}\n\nmodule.exports = mapCacheClear;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19tYXBDYWNoZUNsZWFyLmpzPzdjNjQiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsV0FBVyxtQkFBTyxDQUFDLEdBQVM7QUFDNUIsZ0JBQWdCLG1CQUFPLENBQUMsR0FBYztBQUN0QyxVQUFVLG1CQUFPLENBQUMsR0FBUTs7QUFFMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwiZmlsZSI6IjM0MC5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBIYXNoID0gcmVxdWlyZSgnLi9fSGFzaCcpLFxuICAgIExpc3RDYWNoZSA9IHJlcXVpcmUoJy4vX0xpc3RDYWNoZScpLFxuICAgIE1hcCA9IHJlcXVpcmUoJy4vX01hcCcpO1xuXG4vKipcbiAqIFJlbW92ZXMgYWxsIGtleS12YWx1ZSBlbnRyaWVzIGZyb20gdGhlIG1hcC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgY2xlYXJcbiAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICovXG5mdW5jdGlvbiBtYXBDYWNoZUNsZWFyKCkge1xuICB0aGlzLnNpemUgPSAwO1xuICB0aGlzLl9fZGF0YV9fID0ge1xuICAgICdoYXNoJzogbmV3IEhhc2gsXG4gICAgJ21hcCc6IG5ldyAoTWFwIHx8IExpc3RDYWNoZSksXG4gICAgJ3N0cmluZyc6IG5ldyBIYXNoXG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWFwQ2FjaGVDbGVhcjtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///340\n")},function(module,exports,__webpack_require__){eval("var hashClear = __webpack_require__(342),\n hashDelete = __webpack_require__(343),\n hashGet = __webpack_require__(344),\n hashHas = __webpack_require__(345),\n hashSet = __webpack_require__(346);\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\nmodule.exports = Hash;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19IYXNoLmpzP2UyNGIiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsZ0JBQWdCLG1CQUFPLENBQUMsR0FBYztBQUN0QyxpQkFBaUIsbUJBQU8sQ0FBQyxHQUFlO0FBQ3hDLGNBQWMsbUJBQU8sQ0FBQyxHQUFZO0FBQ2xDLGNBQWMsbUJBQU8sQ0FBQyxHQUFZO0FBQ2xDLGNBQWMsbUJBQU8sQ0FBQyxHQUFZOztBQUVsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxNQUFNO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJmaWxlIjoiMzQxLmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIGhhc2hDbGVhciA9IHJlcXVpcmUoJy4vX2hhc2hDbGVhcicpLFxuICAgIGhhc2hEZWxldGUgPSByZXF1aXJlKCcuL19oYXNoRGVsZXRlJyksXG4gICAgaGFzaEdldCA9IHJlcXVpcmUoJy4vX2hhc2hHZXQnKSxcbiAgICBoYXNoSGFzID0gcmVxdWlyZSgnLi9faGFzaEhhcycpLFxuICAgIGhhc2hTZXQgPSByZXF1aXJlKCcuL19oYXNoU2V0Jyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGhhc2ggb2JqZWN0LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7QXJyYXl9IFtlbnRyaWVzXSBUaGUga2V5LXZhbHVlIHBhaXJzIHRvIGNhY2hlLlxuICovXG5mdW5jdGlvbiBIYXNoKGVudHJpZXMpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBlbnRyaWVzID09IG51bGwgPyAwIDogZW50cmllcy5sZW5ndGg7XG5cbiAgdGhpcy5jbGVhcigpO1xuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciBlbnRyeSA9IGVudHJpZXNbaW5kZXhdO1xuICAgIHRoaXMuc2V0KGVudHJ5WzBdLCBlbnRyeVsxXSk7XG4gIH1cbn1cblxuLy8gQWRkIG1ldGhvZHMgdG8gYEhhc2hgLlxuSGFzaC5wcm90b3R5cGUuY2xlYXIgPSBoYXNoQ2xlYXI7XG5IYXNoLnByb3RvdHlwZVsnZGVsZXRlJ10gPSBoYXNoRGVsZXRlO1xuSGFzaC5wcm90b3R5cGUuZ2V0ID0gaGFzaEdldDtcbkhhc2gucHJvdG90eXBlLmhhcyA9IGhhc2hIYXM7XG5IYXNoLnByb3RvdHlwZS5zZXQgPSBoYXNoU2V0O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEhhc2g7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///341\n")},function(module,exports,__webpack_require__){eval("var nativeCreate = __webpack_require__(102);\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\n this.size = 0;\n}\n\nmodule.exports = hashClear;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19oYXNoQ2xlYXIuanM/NDlmNCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxtQkFBbUIsbUJBQU8sQ0FBQyxHQUFpQjs7QUFFNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsImZpbGUiOiIzNDIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgbmF0aXZlQ3JlYXRlID0gcmVxdWlyZSgnLi9fbmF0aXZlQ3JlYXRlJyk7XG5cbi8qKlxuICogUmVtb3ZlcyBhbGwga2V5LXZhbHVlIGVudHJpZXMgZnJvbSB0aGUgaGFzaC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgY2xlYXJcbiAqIEBtZW1iZXJPZiBIYXNoXG4gKi9cbmZ1bmN0aW9uIGhhc2hDbGVhcigpIHtcbiAgdGhpcy5fX2RhdGFfXyA9IG5hdGl2ZUNyZWF0ZSA/IG5hdGl2ZUNyZWF0ZShudWxsKSA6IHt9O1xuICB0aGlzLnNpemUgPSAwO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGhhc2hDbGVhcjtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///342\n")},function(module,exports){eval("/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n var result = this.has(key) && delete this.__data__[key];\n this.size -= result ? 1 : 0;\n return result;\n}\n\nmodule.exports = hashDelete;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19oYXNoRGVsZXRlLmpzPzFlZmMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwiZmlsZSI6IjM0My5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUmVtb3ZlcyBga2V5YCBhbmQgaXRzIHZhbHVlIGZyb20gdGhlIGhhc2guXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGRlbGV0ZVxuICogQG1lbWJlck9mIEhhc2hcbiAqIEBwYXJhbSB7T2JqZWN0fSBoYXNoIFRoZSBoYXNoIHRvIG1vZGlmeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gcmVtb3ZlLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBlbnRyeSB3YXMgcmVtb3ZlZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBoYXNoRGVsZXRlKGtleSkge1xuICB2YXIgcmVzdWx0ID0gdGhpcy5oYXMoa2V5KSAmJiBkZWxldGUgdGhpcy5fX2RhdGFfX1trZXldO1xuICB0aGlzLnNpemUgLT0gcmVzdWx0ID8gMSA6IDA7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaGFzaERlbGV0ZTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///343\n")},function(module,exports,__webpack_require__){eval("var nativeCreate = __webpack_require__(102);\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n var data = this.__data__;\n if (nativeCreate) {\n var result = data[key];\n return result === HASH_UNDEFINED ? undefined : result;\n }\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\nmodule.exports = hashGet;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19oYXNoR2V0LmpzP2JiYzAiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsbUJBQW1CLG1CQUFPLENBQUMsR0FBaUI7O0FBRTVDO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixhQUFhLEVBQUU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJmaWxlIjoiMzQ0LmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIG5hdGl2ZUNyZWF0ZSA9IHJlcXVpcmUoJy4vX25hdGl2ZUNyZWF0ZScpO1xuXG4vKiogVXNlZCB0byBzdGFuZC1pbiBmb3IgYHVuZGVmaW5lZGAgaGFzaCB2YWx1ZXMuICovXG52YXIgSEFTSF9VTkRFRklORUQgPSAnX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyc7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogR2V0cyB0aGUgaGFzaCB2YWx1ZSBmb3IgYGtleWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGdldFxuICogQG1lbWJlck9mIEhhc2hcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gZ2V0LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGVudHJ5IHZhbHVlLlxuICovXG5mdW5jdGlvbiBoYXNoR2V0KGtleSkge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX187XG4gIGlmIChuYXRpdmVDcmVhdGUpIHtcbiAgICB2YXIgcmVzdWx0ID0gZGF0YVtrZXldO1xuICAgIHJldHVybiByZXN1bHQgPT09IEhBU0hfVU5ERUZJTkVEID8gdW5kZWZpbmVkIDogcmVzdWx0O1xuICB9XG4gIHJldHVybiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGEsIGtleSkgPyBkYXRhW2tleV0gOiB1bmRlZmluZWQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaGFzaEdldDtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///344\n")},function(module,exports,__webpack_require__){eval("var nativeCreate = __webpack_require__(102);\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n var data = this.__data__;\n return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n}\n\nmodule.exports = hashHas;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19oYXNoSGFzLmpzPzdhNDgiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsbUJBQW1CLG1CQUFPLENBQUMsR0FBaUI7O0FBRTVDO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJmaWxlIjoiMzQ1LmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIG5hdGl2ZUNyZWF0ZSA9IHJlcXVpcmUoJy4vX25hdGl2ZUNyZWF0ZScpO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIENoZWNrcyBpZiBhIGhhc2ggdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgaGFzXG4gKiBAbWVtYmVyT2YgSGFzaFxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGhhc2hIYXMoa2V5KSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXztcbiAgcmV0dXJuIG5hdGl2ZUNyZWF0ZSA/IChkYXRhW2tleV0gIT09IHVuZGVmaW5lZCkgOiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGEsIGtleSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaGFzaEhhcztcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///345\n")},function(module,exports,__webpack_require__){eval("var nativeCreate = __webpack_require__(102);\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n var data = this.__data__;\n this.size += this.has(key) ? 0 : 1;\n data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n return this;\n}\n\nmodule.exports = hashSet;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19oYXNoU2V0LmpzPzI1MjQiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsbUJBQW1CLG1CQUFPLENBQUMsR0FBaUI7O0FBRTVDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsRUFBRTtBQUNiLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsImZpbGUiOiIzNDYuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgbmF0aXZlQ3JlYXRlID0gcmVxdWlyZSgnLi9fbmF0aXZlQ3JlYXRlJyk7XG5cbi8qKiBVc2VkIHRvIHN0YW5kLWluIGZvciBgdW5kZWZpbmVkYCBoYXNoIHZhbHVlcy4gKi9cbnZhciBIQVNIX1VOREVGSU5FRCA9ICdfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fJztcblxuLyoqXG4gKiBTZXRzIHRoZSBoYXNoIGBrZXlgIHRvIGB2YWx1ZWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIHNldFxuICogQG1lbWJlck9mIEhhc2hcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gc2V0LlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgaGFzaCBpbnN0YW5jZS5cbiAqL1xuZnVuY3Rpb24gaGFzaFNldChrZXksIHZhbHVlKSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXztcbiAgdGhpcy5zaXplICs9IHRoaXMuaGFzKGtleSkgPyAwIDogMTtcbiAgZGF0YVtrZXldID0gKG5hdGl2ZUNyZWF0ZSAmJiB2YWx1ZSA9PT0gdW5kZWZpbmVkKSA/IEhBU0hfVU5ERUZJTkVEIDogdmFsdWU7XG4gIHJldHVybiB0aGlzO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGhhc2hTZXQ7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///346\n")},function(module,exports,__webpack_require__){eval("var getMapData = __webpack_require__(103);\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n var result = getMapData(this, key)['delete'](key);\n this.size -= result ? 1 : 0;\n return result;\n}\n\nmodule.exports = mapCacheDelete;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19tYXBDYWNoZURlbGV0ZS5qcz85M2VkIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGlCQUFpQixtQkFBTyxDQUFDLEdBQWU7O0FBRXhDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwiZmlsZSI6IjM0Ny5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBnZXRNYXBEYXRhID0gcmVxdWlyZSgnLi9fZ2V0TWFwRGF0YScpO1xuXG4vKipcbiAqIFJlbW92ZXMgYGtleWAgYW5kIGl0cyB2YWx1ZSBmcm9tIHRoZSBtYXAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGRlbGV0ZVxuICogQG1lbWJlck9mIE1hcENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHJlbW92ZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZW50cnkgd2FzIHJlbW92ZWQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gbWFwQ2FjaGVEZWxldGUoa2V5KSB7XG4gIHZhciByZXN1bHQgPSBnZXRNYXBEYXRhKHRoaXMsIGtleSlbJ2RlbGV0ZSddKGtleSk7XG4gIHRoaXMuc2l6ZSAtPSByZXN1bHQgPyAxIDogMDtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtYXBDYWNoZURlbGV0ZTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///347\n")},function(module,exports){eval("/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n var type = typeof value;\n return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n ? (value !== '__proto__')\n : (value === null);\n}\n\nmodule.exports = isKeyable;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19pc0tleWFibGUuanM/MTI5MCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsRUFBRTtBQUNiLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsImZpbGUiOiIzNDguanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIHN1aXRhYmxlIGZvciB1c2UgYXMgdW5pcXVlIG9iamVjdCBrZXkuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgc3VpdGFibGUsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaXNLZXlhYmxlKHZhbHVlKSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICByZXR1cm4gKHR5cGUgPT0gJ3N0cmluZycgfHwgdHlwZSA9PSAnbnVtYmVyJyB8fCB0eXBlID09ICdzeW1ib2wnIHx8IHR5cGUgPT0gJ2Jvb2xlYW4nKVxuICAgID8gKHZhbHVlICE9PSAnX19wcm90b19fJylcbiAgICA6ICh2YWx1ZSA9PT0gbnVsbCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNLZXlhYmxlO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///348\n")},function(module,exports,__webpack_require__){eval("var getMapData = __webpack_require__(103);\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n return getMapData(this, key).get(key);\n}\n\nmodule.exports = mapCacheGet;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19tYXBDYWNoZUdldC5qcz8yNDc4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGlCQUFpQixtQkFBTyxDQUFDLEdBQWU7O0FBRXhDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixhQUFhLEVBQUU7QUFDZjtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsImZpbGUiOiIzNDkuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgZ2V0TWFwRGF0YSA9IHJlcXVpcmUoJy4vX2dldE1hcERhdGEnKTtcblxuLyoqXG4gKiBHZXRzIHRoZSBtYXAgdmFsdWUgZm9yIGBrZXlgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBnZXRcbiAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBnZXQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZW50cnkgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIG1hcENhY2hlR2V0KGtleSkge1xuICByZXR1cm4gZ2V0TWFwRGF0YSh0aGlzLCBrZXkpLmdldChrZXkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG1hcENhY2hlR2V0O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///349\n")},function(module,exports,__webpack_require__){eval("var getMapData = __webpack_require__(103);\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n return getMapData(this, key).has(key);\n}\n\nmodule.exports = mapCacheHas;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19tYXBDYWNoZUhhcy5qcz9hNTI0Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGlCQUFpQixtQkFBTyxDQUFDLEdBQWU7O0FBRXhDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJmaWxlIjoiMzUwLmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIGdldE1hcERhdGEgPSByZXF1aXJlKCcuL19nZXRNYXBEYXRhJyk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgbWFwIHZhbHVlIGZvciBga2V5YCBleGlzdHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGhhc1xuICogQG1lbWJlck9mIE1hcENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gbWFwQ2FjaGVIYXMoa2V5KSB7XG4gIHJldHVybiBnZXRNYXBEYXRhKHRoaXMsIGtleSkuaGFzKGtleSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWFwQ2FjaGVIYXM7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///350\n")},function(module,exports,__webpack_require__){eval("var getMapData = __webpack_require__(103);\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n var data = getMapData(this, key),\n size = data.size;\n\n data.set(key, value);\n this.size += data.size == size ? 0 : 1;\n return this;\n}\n\nmodule.exports = mapCacheSet;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19tYXBDYWNoZVNldC5qcz8xZmM4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGlCQUFpQixtQkFBTyxDQUFDLEdBQWU7O0FBRXhDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixXQUFXLEVBQUU7QUFDYixhQUFhLE9BQU87QUFDcEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJmaWxlIjoiMzUxLmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIGdldE1hcERhdGEgPSByZXF1aXJlKCcuL19nZXRNYXBEYXRhJyk7XG5cbi8qKlxuICogU2V0cyB0aGUgbWFwIGBrZXlgIHRvIGB2YWx1ZWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIHNldFxuICogQG1lbWJlck9mIE1hcENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHNldC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG1hcCBjYWNoZSBpbnN0YW5jZS5cbiAqL1xuZnVuY3Rpb24gbWFwQ2FjaGVTZXQoa2V5LCB2YWx1ZSkge1xuICB2YXIgZGF0YSA9IGdldE1hcERhdGEodGhpcywga2V5KSxcbiAgICAgIHNpemUgPSBkYXRhLnNpemU7XG5cbiAgZGF0YS5zZXQoa2V5LCB2YWx1ZSk7XG4gIHRoaXMuc2l6ZSArPSBkYXRhLnNpemUgPT0gc2l6ZSA/IDAgOiAxO1xuICByZXR1cm4gdGhpcztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtYXBDYWNoZVNldDtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///351\n")},function(module,exports,__webpack_require__){eval("var copyObject = __webpack_require__(87),\n keys = __webpack_require__(59);\n\n/**\n * The base implementation of `_.assign` without support for multiple sources\n * or `customizer` functions.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @returns {Object} Returns `object`.\n */\nfunction baseAssign(object, source) {\n return object && copyObject(source, keys(source), object);\n}\n\nmodule.exports = baseAssign;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlQXNzaWduLmpzPzViMDEiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsaUJBQWlCLG1CQUFPLENBQUMsRUFBZTtBQUN4QyxXQUFXLG1CQUFPLENBQUMsRUFBUTs7QUFFM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwiZmlsZSI6IjM1Mi5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBjb3B5T2JqZWN0ID0gcmVxdWlyZSgnLi9fY29weU9iamVjdCcpLFxuICAgIGtleXMgPSByZXF1aXJlKCcuL2tleXMnKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5hc3NpZ25gIHdpdGhvdXQgc3VwcG9ydCBmb3IgbXVsdGlwbGUgc291cmNlc1xuICogb3IgYGN1c3RvbWl6ZXJgIGZ1bmN0aW9ucy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgc291cmNlIG9iamVjdC5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VBc3NpZ24ob2JqZWN0LCBzb3VyY2UpIHtcbiAgcmV0dXJuIG9iamVjdCAmJiBjb3B5T2JqZWN0KHNvdXJjZSwga2V5cyhzb3VyY2UpLCBvYmplY3QpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VBc3NpZ247XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///352\n")},function(module,exports){eval("/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n var index = -1,\n result = Array(n);\n\n while (++index < n) {\n result[index] = iteratee(index);\n }\n return result;\n}\n\nmodule.exports = baseTimes;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlVGltZXMuanM/NTBkOCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsU0FBUztBQUNwQixhQUFhLE1BQU07QUFDbkI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsImZpbGUiOiIzNTMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnRpbWVzYCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHNcbiAqIG9yIG1heCBhcnJheSBsZW5ndGggY2hlY2tzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge251bWJlcn0gbiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRvIGludm9rZSBgaXRlcmF0ZWVgLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcmVzdWx0cy5cbiAqL1xuZnVuY3Rpb24gYmFzZVRpbWVzKG4sIGl0ZXJhdGVlKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgcmVzdWx0ID0gQXJyYXkobik7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBuKSB7XG4gICAgcmVzdWx0W2luZGV4XSA9IGl0ZXJhdGVlKGluZGV4KTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VUaW1lcztcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///353\n")},function(module,exports,__webpack_require__){eval("var baseGetTag = __webpack_require__(65),\n isObjectLike = __webpack_require__(49);\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]';\n\n/**\n * The base implementation of `_.isArguments`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n */\nfunction baseIsArguments(value) {\n return isObjectLike(value) && baseGetTag(value) == argsTag;\n}\n\nmodule.exports = baseIsArguments;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlSXNBcmd1bWVudHMuanM/MjUzYyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxpQkFBaUIsbUJBQU8sQ0FBQyxFQUFlO0FBQ3hDLG1CQUFtQixtQkFBTyxDQUFDLEVBQWdCOztBQUUzQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxFQUFFO0FBQ2IsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwiZmlsZSI6IjM1NC5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBiYXNlR2V0VGFnID0gcmVxdWlyZSgnLi9fYmFzZUdldFRhZycpLFxuICAgIGlzT2JqZWN0TGlrZSA9IHJlcXVpcmUoJy4vaXNPYmplY3RMaWtlJyk7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBhcmdzVGFnID0gJ1tvYmplY3QgQXJndW1lbnRzXSc7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNBcmd1bWVudHNgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGBhcmd1bWVudHNgIG9iamVjdCxcbiAqL1xuZnVuY3Rpb24gYmFzZUlzQXJndW1lbnRzKHZhbHVlKSB7XG4gIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IGFyZ3NUYWc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUlzQXJndW1lbnRzO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///354\n")},function(module,exports){eval("/**\n * This method returns `false`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns `false`.\n * @example\n *\n * _.times(2, _.stubFalse);\n * // => [false, false]\n */\nfunction stubFalse() {\n return false;\n}\n\nmodule.exports = stubFalse;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL3N0dWJGYWxzZS5qcz8wN2M3Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJmaWxlIjoiMzU1LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUaGlzIG1ldGhvZCByZXR1cm5zIGBmYWxzZWAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjEzLjBcbiAqIEBjYXRlZ29yeSBVdGlsXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRpbWVzKDIsIF8uc3R1YkZhbHNlKTtcbiAqIC8vID0+IFtmYWxzZSwgZmFsc2VdXG4gKi9cbmZ1bmN0aW9uIHN0dWJGYWxzZSgpIHtcbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHN0dWJGYWxzZTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///355\n")},function(module,exports,__webpack_require__){eval("var baseGetTag = __webpack_require__(65),\n isLength = __webpack_require__(157),\n isObjectLike = __webpack_require__(49);\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n objectTag = '[object Object]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values of typed arrays. */\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\ntypedArrayTags[errorTag] = typedArrayTags[funcTag] =\ntypedArrayTags[mapTag] = typedArrayTags[numberTag] =\ntypedArrayTags[objectTag] = typedArrayTags[regexpTag] =\ntypedArrayTags[setTag] = typedArrayTags[stringTag] =\ntypedArrayTags[weakMapTag] = false;\n\n/**\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n */\nfunction baseIsTypedArray(value) {\n return isObjectLike(value) &&\n isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n}\n\nmodule.exports = baseIsTypedArray;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlSXNUeXBlZEFycmF5LmpzPzc0M2YiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsaUJBQWlCLG1CQUFPLENBQUMsRUFBZTtBQUN4QyxlQUFlLG1CQUFPLENBQUMsR0FBWTtBQUNuQyxtQkFBbUIsbUJBQU8sQ0FBQyxFQUFnQjs7QUFFM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsRUFBRTtBQUNiLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwiZmlsZSI6IjM1Ni5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBiYXNlR2V0VGFnID0gcmVxdWlyZSgnLi9fYmFzZUdldFRhZycpLFxuICAgIGlzTGVuZ3RoID0gcmVxdWlyZSgnLi9pc0xlbmd0aCcpLFxuICAgIGlzT2JqZWN0TGlrZSA9IHJlcXVpcmUoJy4vaXNPYmplY3RMaWtlJyk7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBhcmdzVGFnID0gJ1tvYmplY3QgQXJndW1lbnRzXScsXG4gICAgYXJyYXlUYWcgPSAnW29iamVjdCBBcnJheV0nLFxuICAgIGJvb2xUYWcgPSAnW29iamVjdCBCb29sZWFuXScsXG4gICAgZGF0ZVRhZyA9ICdbb2JqZWN0IERhdGVdJyxcbiAgICBlcnJvclRhZyA9ICdbb2JqZWN0IEVycm9yXScsXG4gICAgZnVuY1RhZyA9ICdbb2JqZWN0IEZ1bmN0aW9uXScsXG4gICAgbWFwVGFnID0gJ1tvYmplY3QgTWFwXScsXG4gICAgbnVtYmVyVGFnID0gJ1tvYmplY3QgTnVtYmVyXScsXG4gICAgb2JqZWN0VGFnID0gJ1tvYmplY3QgT2JqZWN0XScsXG4gICAgcmVnZXhwVGFnID0gJ1tvYmplY3QgUmVnRXhwXScsXG4gICAgc2V0VGFnID0gJ1tvYmplY3QgU2V0XScsXG4gICAgc3RyaW5nVGFnID0gJ1tvYmplY3QgU3RyaW5nXScsXG4gICAgd2Vha01hcFRhZyA9ICdbb2JqZWN0IFdlYWtNYXBdJztcblxudmFyIGFycmF5QnVmZmVyVGFnID0gJ1tvYmplY3QgQXJyYXlCdWZmZXJdJyxcbiAgICBkYXRhVmlld1RhZyA9ICdbb2JqZWN0IERhdGFWaWV3XScsXG4gICAgZmxvYXQzMlRhZyA9ICdbb2JqZWN0IEZsb2F0MzJBcnJheV0nLFxuICAgIGZsb2F0NjRUYWcgPSAnW29iamVjdCBGbG9hdDY0QXJyYXldJyxcbiAgICBpbnQ4VGFnID0gJ1tvYmplY3QgSW50OEFycmF5XScsXG4gICAgaW50MTZUYWcgPSAnW29iamVjdCBJbnQxNkFycmF5XScsXG4gICAgaW50MzJUYWcgPSAnW29iamVjdCBJbnQzMkFycmF5XScsXG4gICAgdWludDhUYWcgPSAnW29iamVjdCBVaW50OEFycmF5XScsXG4gICAgdWludDhDbGFtcGVkVGFnID0gJ1tvYmplY3QgVWludDhDbGFtcGVkQXJyYXldJyxcbiAgICB1aW50MTZUYWcgPSAnW29iamVjdCBVaW50MTZBcnJheV0nLFxuICAgIHVpbnQzMlRhZyA9ICdbb2JqZWN0IFVpbnQzMkFycmF5XSc7XG5cbi8qKiBVc2VkIHRvIGlkZW50aWZ5IGB0b1N0cmluZ1RhZ2AgdmFsdWVzIG9mIHR5cGVkIGFycmF5cy4gKi9cbnZhciB0eXBlZEFycmF5VGFncyA9IHt9O1xudHlwZWRBcnJheVRhZ3NbZmxvYXQzMlRhZ10gPSB0eXBlZEFycmF5VGFnc1tmbG9hdDY0VGFnXSA9XG50eXBlZEFycmF5VGFnc1tpbnQ4VGFnXSA9IHR5cGVkQXJyYXlUYWdzW2ludDE2VGFnXSA9XG50eXBlZEFycmF5VGFnc1tpbnQzMlRhZ10gPSB0eXBlZEFycmF5VGFnc1t1aW50OFRhZ10gPVxudHlwZWRBcnJheVRhZ3NbdWludDhDbGFtcGVkVGFnXSA9IHR5cGVkQXJyYXlUYWdzW3VpbnQxNlRhZ10gPVxudHlwZWRBcnJheVRhZ3NbdWludDMyVGFnXSA9IHRydWU7XG50eXBlZEFycmF5VGFnc1thcmdzVGFnXSA9IHR5cGVkQXJyYXlUYWdzW2FycmF5VGFnXSA9XG50eXBlZEFycmF5VGFnc1thcnJheUJ1ZmZlclRhZ10gPSB0eXBlZEFycmF5VGFnc1tib29sVGFnXSA9XG50eXBlZEFycmF5VGFnc1tkYXRhVmlld1RhZ10gPSB0eXBlZEFycmF5VGFnc1tkYXRlVGFnXSA9XG50eXBlZEFycmF5VGFnc1tlcnJvclRhZ10gPSB0eXBlZEFycmF5VGFnc1tmdW5jVGFnXSA9XG50eXBlZEFycmF5VGFnc1ttYXBUYWddID0gdHlwZWRBcnJheVRhZ3NbbnVtYmVyVGFnXSA9XG50eXBlZEFycmF5VGFnc1tvYmplY3RUYWddID0gdHlwZWRBcnJheVRhZ3NbcmVnZXhwVGFnXSA9XG50eXBlZEFycmF5VGFnc1tzZXRUYWddID0gdHlwZWRBcnJheVRhZ3Nbc3RyaW5nVGFnXSA9XG50eXBlZEFycmF5VGFnc1t3ZWFrTWFwVGFnXSA9IGZhbHNlO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzVHlwZWRBcnJheWAgd2l0aG91dCBOb2RlLmpzIG9wdGltaXphdGlvbnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB0eXBlZCBhcnJheSwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBiYXNlSXNUeXBlZEFycmF5KHZhbHVlKSB7XG4gIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmXG4gICAgaXNMZW5ndGgodmFsdWUubGVuZ3RoKSAmJiAhIXR5cGVkQXJyYXlUYWdzW2Jhc2VHZXRUYWcodmFsdWUpXTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlSXNUeXBlZEFycmF5O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///356\n")},function(module,exports,__webpack_require__){eval("var overArg = __webpack_require__(191);\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeKeys = overArg(Object.keys, Object);\n\nmodule.exports = nativeKeys;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19uYXRpdmVLZXlzLmpzPzU3YTUiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxtQkFBTyxDQUFDLEdBQVk7O0FBRWxDO0FBQ0E7O0FBRUEiLCJmaWxlIjoiMzU3LmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIG92ZXJBcmcgPSByZXF1aXJlKCcuL19vdmVyQXJnJyk7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVLZXlzID0gb3ZlckFyZyhPYmplY3Qua2V5cywgT2JqZWN0KTtcblxubW9kdWxlLmV4cG9ydHMgPSBuYXRpdmVLZXlzO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///357\n")},function(module,exports,__webpack_require__){eval("var copyObject = __webpack_require__(87),\n keysIn = __webpack_require__(66);\n\n/**\n * The base implementation of `_.assignIn` without support for multiple sources\n * or `customizer` functions.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @returns {Object} Returns `object`.\n */\nfunction baseAssignIn(object, source) {\n return object && copyObject(source, keysIn(source), object);\n}\n\nmodule.exports = baseAssignIn;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlQXNzaWduSW4uanM/MGYwZiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxpQkFBaUIsbUJBQU8sQ0FBQyxFQUFlO0FBQ3hDLGFBQWEsbUJBQU8sQ0FBQyxFQUFVOztBQUUvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixhQUFhLE9BQU87QUFDcEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJmaWxlIjoiMzU4LmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIGNvcHlPYmplY3QgPSByZXF1aXJlKCcuL19jb3B5T2JqZWN0JyksXG4gICAga2V5c0luID0gcmVxdWlyZSgnLi9rZXlzSW4nKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5hc3NpZ25JbmAgd2l0aG91dCBzdXBwb3J0IGZvciBtdWx0aXBsZSBzb3VyY2VzXG4gKiBvciBgY3VzdG9taXplcmAgZnVuY3Rpb25zLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBzb3VyY2Ugb2JqZWN0LlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAqL1xuZnVuY3Rpb24gYmFzZUFzc2lnbkluKG9iamVjdCwgc291cmNlKSB7XG4gIHJldHVybiBvYmplY3QgJiYgY29weU9iamVjdChzb3VyY2UsIGtleXNJbihzb3VyY2UpLCBvYmplY3QpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VBc3NpZ25JbjtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///358\n")},function(module,exports,__webpack_require__){eval("var isObject = __webpack_require__(43),\n isPrototype = __webpack_require__(108),\n nativeKeysIn = __webpack_require__(360);\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeysIn(object) {\n if (!isObject(object)) {\n return nativeKeysIn(object);\n }\n var isProto = isPrototype(object),\n result = [];\n\n for (var key in object) {\n if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = baseKeysIn;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlS2V5c0luLmpzPzQxYzMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsZUFBZSxtQkFBTyxDQUFDLEVBQVk7QUFDbkMsa0JBQWtCLG1CQUFPLENBQUMsR0FBZ0I7QUFDMUMsbUJBQW1CLG1CQUFPLENBQUMsR0FBaUI7O0FBRTVDO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixhQUFhLE1BQU07QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJmaWxlIjoiMzU5LmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9pc09iamVjdCcpLFxuICAgIGlzUHJvdG90eXBlID0gcmVxdWlyZSgnLi9faXNQcm90b3R5cGUnKSxcbiAgICBuYXRpdmVLZXlzSW4gPSByZXF1aXJlKCcuL19uYXRpdmVLZXlzSW4nKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5rZXlzSW5gIHdoaWNoIGRvZXNuJ3QgdHJlYXQgc3BhcnNlIGFycmF5cyBhcyBkZW5zZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAqL1xuZnVuY3Rpb24gYmFzZUtleXNJbihvYmplY3QpIHtcbiAgaWYgKCFpc09iamVjdChvYmplY3QpKSB7XG4gICAgcmV0dXJuIG5hdGl2ZUtleXNJbihvYmplY3QpO1xuICB9XG4gIHZhciBpc1Byb3RvID0gaXNQcm90b3R5cGUob2JqZWN0KSxcbiAgICAgIHJlc3VsdCA9IFtdO1xuXG4gIGZvciAodmFyIGtleSBpbiBvYmplY3QpIHtcbiAgICBpZiAoIShrZXkgPT0gJ2NvbnN0cnVjdG9yJyAmJiAoaXNQcm90byB8fCAhaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkpKSkge1xuICAgICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlS2V5c0luO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///359\n")},function(module,exports){eval("/**\n * This function is like\n * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * except that it includes inherited enumerable properties.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction nativeKeysIn(object) {\n var result = [];\n if (object != null) {\n for (var key in Object(object)) {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = nativeKeysIn;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19uYXRpdmVLZXlzSW4uanM/ZWM4YyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsYUFBYSxNQUFNO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwiZmlsZSI6IjM2MC5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVGhpcyBmdW5jdGlvbiBpcyBsaWtlXG4gKiBbYE9iamVjdC5rZXlzYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LmtleXMpXG4gKiBleGNlcHQgdGhhdCBpdCBpbmNsdWRlcyBpbmhlcml0ZWQgZW51bWVyYWJsZSBwcm9wZXJ0aWVzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICovXG5mdW5jdGlvbiBuYXRpdmVLZXlzSW4ob2JqZWN0KSB7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgaWYgKG9iamVjdCAhPSBudWxsKSB7XG4gICAgZm9yICh2YXIga2V5IGluIE9iamVjdChvYmplY3QpKSB7XG4gICAgICByZXN1bHQucHVzaChrZXkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG5hdGl2ZUtleXNJbjtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///360\n")},function(module,exports,__webpack_require__){eval("var copyObject = __webpack_require__(87),\n getSymbols = __webpack_require__(160);\n\n/**\n * Copies own symbols of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy symbols from.\n * @param {Object} [object={}] The object to copy symbols to.\n * @returns {Object} Returns `object`.\n */\nfunction copySymbols(source, object) {\n return copyObject(source, getSymbols(source), object);\n}\n\nmodule.exports = copySymbols;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jb3B5U3ltYm9scy5qcz81NGViIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGlCQUFpQixtQkFBTyxDQUFDLEVBQWU7QUFDeEMsaUJBQWlCLG1CQUFPLENBQUMsR0FBZTs7QUFFeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPLFdBQVc7QUFDN0IsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwiZmlsZSI6IjM2MS5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBjb3B5T2JqZWN0ID0gcmVxdWlyZSgnLi9fY29weU9iamVjdCcpLFxuICAgIGdldFN5bWJvbHMgPSByZXF1aXJlKCcuL19nZXRTeW1ib2xzJyk7XG5cbi8qKlxuICogQ29waWVzIG93biBzeW1ib2xzIG9mIGBzb3VyY2VgIHRvIGBvYmplY3RgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3QgdG8gY29weSBzeW1ib2xzIGZyb20uXG4gKiBAcGFyYW0ge09iamVjdH0gW29iamVjdD17fV0gVGhlIG9iamVjdCB0byBjb3B5IHN5bWJvbHMgdG8uXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICovXG5mdW5jdGlvbiBjb3B5U3ltYm9scyhzb3VyY2UsIG9iamVjdCkge1xuICByZXR1cm4gY29weU9iamVjdChzb3VyY2UsIGdldFN5bWJvbHMoc291cmNlKSwgb2JqZWN0KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjb3B5U3ltYm9scztcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///361\n")},function(module,exports,__webpack_require__){eval("var copyObject = __webpack_require__(87),\n getSymbolsIn = __webpack_require__(196);\n\n/**\n * Copies own and inherited symbols of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy symbols from.\n * @param {Object} [object={}] The object to copy symbols to.\n * @returns {Object} Returns `object`.\n */\nfunction copySymbolsIn(source, object) {\n return copyObject(source, getSymbolsIn(source), object);\n}\n\nmodule.exports = copySymbolsIn;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jb3B5U3ltYm9sc0luLmpzPzEwNDEiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsaUJBQWlCLG1CQUFPLENBQUMsRUFBZTtBQUN4QyxtQkFBbUIsbUJBQU8sQ0FBQyxHQUFpQjs7QUFFNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPLFdBQVc7QUFDN0IsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwiZmlsZSI6IjM2Mi5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBjb3B5T2JqZWN0ID0gcmVxdWlyZSgnLi9fY29weU9iamVjdCcpLFxuICAgIGdldFN5bWJvbHNJbiA9IHJlcXVpcmUoJy4vX2dldFN5bWJvbHNJbicpO1xuXG4vKipcbiAqIENvcGllcyBvd24gYW5kIGluaGVyaXRlZCBzeW1ib2xzIG9mIGBzb3VyY2VgIHRvIGBvYmplY3RgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3QgdG8gY29weSBzeW1ib2xzIGZyb20uXG4gKiBAcGFyYW0ge09iamVjdH0gW29iamVjdD17fV0gVGhlIG9iamVjdCB0byBjb3B5IHN5bWJvbHMgdG8uXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICovXG5mdW5jdGlvbiBjb3B5U3ltYm9sc0luKHNvdXJjZSwgb2JqZWN0KSB7XG4gIHJldHVybiBjb3B5T2JqZWN0KHNvdXJjZSwgZ2V0U3ltYm9sc0luKHNvdXJjZSksIG9iamVjdCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY29weVN5bWJvbHNJbjtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///362\n")},function(module,exports,__webpack_require__){eval("var baseGetAllKeys = __webpack_require__(198),\n getSymbolsIn = __webpack_require__(196),\n keysIn = __webpack_require__(66);\n\n/**\n * Creates an array of own and inherited enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction getAllKeysIn(object) {\n return baseGetAllKeys(object, keysIn, getSymbolsIn);\n}\n\nmodule.exports = getAllKeysIn;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19nZXRBbGxLZXlzSW4uanM/MWJhYyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxxQkFBcUIsbUJBQU8sQ0FBQyxHQUFtQjtBQUNoRCxtQkFBbUIsbUJBQU8sQ0FBQyxHQUFpQjtBQUM1QyxhQUFhLG1CQUFPLENBQUMsRUFBVTs7QUFFL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixhQUFhLE1BQU07QUFDbkI7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJmaWxlIjoiMzYzLmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIGJhc2VHZXRBbGxLZXlzID0gcmVxdWlyZSgnLi9fYmFzZUdldEFsbEtleXMnKSxcbiAgICBnZXRTeW1ib2xzSW4gPSByZXF1aXJlKCcuL19nZXRTeW1ib2xzSW4nKSxcbiAgICBrZXlzSW4gPSByZXF1aXJlKCcuL2tleXNJbicpO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2Ygb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBhbmRcbiAqIHN5bWJvbHMgb2YgYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMgYW5kIHN5bWJvbHMuXG4gKi9cbmZ1bmN0aW9uIGdldEFsbEtleXNJbihvYmplY3QpIHtcbiAgcmV0dXJuIGJhc2VHZXRBbGxLZXlzKG9iamVjdCwga2V5c0luLCBnZXRTeW1ib2xzSW4pO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldEFsbEtleXNJbjtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///363\n")},function(module,exports,__webpack_require__){eval("var getNative = __webpack_require__(64),\n root = __webpack_require__(47);\n\n/* Built-in method references that are verified to be native. */\nvar DataView = getNative(root, 'DataView');\n\nmodule.exports = DataView;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19EYXRhVmlldy5qcz9iNWE3Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGdCQUFnQixtQkFBTyxDQUFDLEVBQWM7QUFDdEMsV0FBVyxtQkFBTyxDQUFDLEVBQVM7O0FBRTVCO0FBQ0E7O0FBRUEiLCJmaWxlIjoiMzY0LmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIGdldE5hdGl2ZSA9IHJlcXVpcmUoJy4vX2dldE5hdGl2ZScpLFxuICAgIHJvb3QgPSByZXF1aXJlKCcuL19yb290Jyk7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHRoYXQgYXJlIHZlcmlmaWVkIHRvIGJlIG5hdGl2ZS4gKi9cbnZhciBEYXRhVmlldyA9IGdldE5hdGl2ZShyb290LCAnRGF0YVZpZXcnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBEYXRhVmlldztcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///364\n")},function(module,exports,__webpack_require__){eval("var getNative = __webpack_require__(64),\n root = __webpack_require__(47);\n\n/* Built-in method references that are verified to be native. */\nvar Promise = getNative(root, 'Promise');\n\nmodule.exports = Promise;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19Qcm9taXNlLmpzPzFjZWMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsZ0JBQWdCLG1CQUFPLENBQUMsRUFBYztBQUN0QyxXQUFXLG1CQUFPLENBQUMsRUFBUzs7QUFFNUI7QUFDQTs7QUFFQSIsImZpbGUiOiIzNjUuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgZ2V0TmF0aXZlID0gcmVxdWlyZSgnLi9fZ2V0TmF0aXZlJyksXG4gICAgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKTtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgdGhhdCBhcmUgdmVyaWZpZWQgdG8gYmUgbmF0aXZlLiAqL1xudmFyIFByb21pc2UgPSBnZXROYXRpdmUocm9vdCwgJ1Byb21pc2UnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBQcm9taXNlO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///365\n")},function(module,exports,__webpack_require__){eval("var getNative = __webpack_require__(64),\n root = __webpack_require__(47);\n\n/* Built-in method references that are verified to be native. */\nvar WeakMap = getNative(root, 'WeakMap');\n\nmodule.exports = WeakMap;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19XZWFrTWFwLmpzPzM5ZmYiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsZ0JBQWdCLG1CQUFPLENBQUMsRUFBYztBQUN0QyxXQUFXLG1CQUFPLENBQUMsRUFBUzs7QUFFNUI7QUFDQTs7QUFFQSIsImZpbGUiOiIzNjYuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgZ2V0TmF0aXZlID0gcmVxdWlyZSgnLi9fZ2V0TmF0aXZlJyksXG4gICAgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKTtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgdGhhdCBhcmUgdmVyaWZpZWQgdG8gYmUgbmF0aXZlLiAqL1xudmFyIFdlYWtNYXAgPSBnZXROYXRpdmUocm9vdCwgJ1dlYWtNYXAnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBXZWFrTWFwO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///366\n")},function(module,exports){eval("/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Initializes an array clone.\n *\n * @private\n * @param {Array} array The array to clone.\n * @returns {Array} Returns the initialized clone.\n */\nfunction initCloneArray(array) {\n var length = array.length,\n result = new array.constructor(length);\n\n // Add properties assigned by `RegExp#exec`.\n if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {\n result.index = array.index;\n result.input = array.input;\n }\n return result;\n}\n\nmodule.exports = initCloneArray;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19pbml0Q2xvbmVBcnJheS5qcz9jODdjIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsTUFBTTtBQUNqQixhQUFhLE1BQU07QUFDbkI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJmaWxlIjoiMzY3LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBJbml0aWFsaXplcyBhbiBhcnJheSBjbG9uZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGNsb25lLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBpbml0aWFsaXplZCBjbG9uZS5cbiAqL1xuZnVuY3Rpb24gaW5pdENsb25lQXJyYXkoYXJyYXkpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgIHJlc3VsdCA9IG5ldyBhcnJheS5jb25zdHJ1Y3RvcihsZW5ndGgpO1xuXG4gIC8vIEFkZCBwcm9wZXJ0aWVzIGFzc2lnbmVkIGJ5IGBSZWdFeHAjZXhlY2AuXG4gIGlmIChsZW5ndGggJiYgdHlwZW9mIGFycmF5WzBdID09ICdzdHJpbmcnICYmIGhhc093blByb3BlcnR5LmNhbGwoYXJyYXksICdpbmRleCcpKSB7XG4gICAgcmVzdWx0LmluZGV4ID0gYXJyYXkuaW5kZXg7XG4gICAgcmVzdWx0LmlucHV0ID0gYXJyYXkuaW5wdXQ7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpbml0Q2xvbmVBcnJheTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///367\n")},function(module,exports,__webpack_require__){eval("var cloneArrayBuffer = __webpack_require__(162),\n cloneDataView = __webpack_require__(369),\n cloneRegExp = __webpack_require__(370),\n cloneSymbol = __webpack_require__(371),\n cloneTypedArray = __webpack_require__(201);\n\n/** `Object#toString` result references. */\nvar boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/**\n * Initializes an object clone based on its `toStringTag`.\n *\n * **Note:** This function only supports cloning values with tags of\n * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`.\n *\n * @private\n * @param {Object} object The object to clone.\n * @param {string} tag The `toStringTag` of the object to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the initialized clone.\n */\nfunction initCloneByTag(object, tag, isDeep) {\n var Ctor = object.constructor;\n switch (tag) {\n case arrayBufferTag:\n return cloneArrayBuffer(object);\n\n case boolTag:\n case dateTag:\n return new Ctor(+object);\n\n case dataViewTag:\n return cloneDataView(object, isDeep);\n\n case float32Tag: case float64Tag:\n case int8Tag: case int16Tag: case int32Tag:\n case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:\n return cloneTypedArray(object, isDeep);\n\n case mapTag:\n return new Ctor;\n\n case numberTag:\n case stringTag:\n return new Ctor(object);\n\n case regexpTag:\n return cloneRegExp(object);\n\n case setTag:\n return new Ctor;\n\n case symbolTag:\n return cloneSymbol(object);\n }\n}\n\nmodule.exports = initCloneByTag;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19pbml0Q2xvbmVCeVRhZy5qcz9jMmI2Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHVCQUF1QixtQkFBTyxDQUFDLEdBQXFCO0FBQ3BELG9CQUFvQixtQkFBTyxDQUFDLEdBQWtCO0FBQzlDLGtCQUFrQixtQkFBTyxDQUFDLEdBQWdCO0FBQzFDLGtCQUFrQixtQkFBTyxDQUFDLEdBQWdCO0FBQzFDLHNCQUFzQixtQkFBTyxDQUFDLEdBQW9COztBQUVsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsV0FBVyxRQUFRO0FBQ25CLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwiZmlsZSI6IjM2OC5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBjbG9uZUFycmF5QnVmZmVyID0gcmVxdWlyZSgnLi9fY2xvbmVBcnJheUJ1ZmZlcicpLFxuICAgIGNsb25lRGF0YVZpZXcgPSByZXF1aXJlKCcuL19jbG9uZURhdGFWaWV3JyksXG4gICAgY2xvbmVSZWdFeHAgPSByZXF1aXJlKCcuL19jbG9uZVJlZ0V4cCcpLFxuICAgIGNsb25lU3ltYm9sID0gcmVxdWlyZSgnLi9fY2xvbmVTeW1ib2wnKSxcbiAgICBjbG9uZVR5cGVkQXJyYXkgPSByZXF1aXJlKCcuL19jbG9uZVR5cGVkQXJyYXknKTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIGJvb2xUYWcgPSAnW29iamVjdCBCb29sZWFuXScsXG4gICAgZGF0ZVRhZyA9ICdbb2JqZWN0IERhdGVdJyxcbiAgICBtYXBUYWcgPSAnW29iamVjdCBNYXBdJyxcbiAgICBudW1iZXJUYWcgPSAnW29iamVjdCBOdW1iZXJdJyxcbiAgICByZWdleHBUYWcgPSAnW29iamVjdCBSZWdFeHBdJyxcbiAgICBzZXRUYWcgPSAnW29iamVjdCBTZXRdJyxcbiAgICBzdHJpbmdUYWcgPSAnW29iamVjdCBTdHJpbmddJyxcbiAgICBzeW1ib2xUYWcgPSAnW29iamVjdCBTeW1ib2xdJztcblxudmFyIGFycmF5QnVmZmVyVGFnID0gJ1tvYmplY3QgQXJyYXlCdWZmZXJdJyxcbiAgICBkYXRhVmlld1RhZyA9ICdbb2JqZWN0IERhdGFWaWV3XScsXG4gICAgZmxvYXQzMlRhZyA9ICdbb2JqZWN0IEZsb2F0MzJBcnJheV0nLFxuICAgIGZsb2F0NjRUYWcgPSAnW29iamVjdCBGbG9hdDY0QXJyYXldJyxcbiAgICBpbnQ4VGFnID0gJ1tvYmplY3QgSW50OEFycmF5XScsXG4gICAgaW50MTZUYWcgPSAnW29iamVjdCBJbnQxNkFycmF5XScsXG4gICAgaW50MzJUYWcgPSAnW29iamVjdCBJbnQzMkFycmF5XScsXG4gICAgdWludDhUYWcgPSAnW29iamVjdCBVaW50OEFycmF5XScsXG4gICAgdWludDhDbGFtcGVkVGFnID0gJ1tvYmplY3QgVWludDhDbGFtcGVkQXJyYXldJyxcbiAgICB1aW50MTZUYWcgPSAnW29iamVjdCBVaW50MTZBcnJheV0nLFxuICAgIHVpbnQzMlRhZyA9ICdbb2JqZWN0IFVpbnQzMkFycmF5XSc7XG5cbi8qKlxuICogSW5pdGlhbGl6ZXMgYW4gb2JqZWN0IGNsb25lIGJhc2VkIG9uIGl0cyBgdG9TdHJpbmdUYWdgLlxuICpcbiAqICoqTm90ZToqKiBUaGlzIGZ1bmN0aW9uIG9ubHkgc3VwcG9ydHMgY2xvbmluZyB2YWx1ZXMgd2l0aCB0YWdzIG9mXG4gKiBgQm9vbGVhbmAsIGBEYXRlYCwgYEVycm9yYCwgYE1hcGAsIGBOdW1iZXJgLCBgUmVnRXhwYCwgYFNldGAsIG9yIGBTdHJpbmdgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gY2xvbmUuXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnIFRoZSBgdG9TdHJpbmdUYWdgIG9mIHRoZSBvYmplY3QgdG8gY2xvbmUuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0RlZXBdIFNwZWNpZnkgYSBkZWVwIGNsb25lLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgaW5pdGlhbGl6ZWQgY2xvbmUuXG4gKi9cbmZ1bmN0aW9uIGluaXRDbG9uZUJ5VGFnKG9iamVjdCwgdGFnLCBpc0RlZXApIHtcbiAgdmFyIEN0b3IgPSBvYmplY3QuY29uc3RydWN0b3I7XG4gIHN3aXRjaCAodGFnKSB7XG4gICAgY2FzZSBhcnJheUJ1ZmZlclRhZzpcbiAgICAgIHJldHVybiBjbG9uZUFycmF5QnVmZmVyKG9iamVjdCk7XG5cbiAgICBjYXNlIGJvb2xUYWc6XG4gICAgY2FzZSBkYXRlVGFnOlxuICAgICAgcmV0dXJuIG5ldyBDdG9yKCtvYmplY3QpO1xuXG4gICAgY2FzZSBkYXRhVmlld1RhZzpcbiAgICAgIHJldHVybiBjbG9uZURhdGFWaWV3KG9iamVjdCwgaXNEZWVwKTtcblxuICAgIGNhc2UgZmxvYXQzMlRhZzogY2FzZSBmbG9hdDY0VGFnOlxuICAgIGNhc2UgaW50OFRhZzogY2FzZSBpbnQxNlRhZzogY2FzZSBpbnQzMlRhZzpcbiAgICBjYXNlIHVpbnQ4VGFnOiBjYXNlIHVpbnQ4Q2xhbXBlZFRhZzogY2FzZSB1aW50MTZUYWc6IGNhc2UgdWludDMyVGFnOlxuICAgICAgcmV0dXJuIGNsb25lVHlwZWRBcnJheShvYmplY3QsIGlzRGVlcCk7XG5cbiAgICBjYXNlIG1hcFRhZzpcbiAgICAgIHJldHVybiBuZXcgQ3RvcjtcblxuICAgIGNhc2UgbnVtYmVyVGFnOlxuICAgIGNhc2Ugc3RyaW5nVGFnOlxuICAgICAgcmV0dXJuIG5ldyBDdG9yKG9iamVjdCk7XG5cbiAgICBjYXNlIHJlZ2V4cFRhZzpcbiAgICAgIHJldHVybiBjbG9uZVJlZ0V4cChvYmplY3QpO1xuXG4gICAgY2FzZSBzZXRUYWc6XG4gICAgICByZXR1cm4gbmV3IEN0b3I7XG5cbiAgICBjYXNlIHN5bWJvbFRhZzpcbiAgICAgIHJldHVybiBjbG9uZVN5bWJvbChvYmplY3QpO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaW5pdENsb25lQnlUYWc7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///368\n")},function(module,exports,__webpack_require__){eval("var cloneArrayBuffer = __webpack_require__(162);\n\n/**\n * Creates a clone of `dataView`.\n *\n * @private\n * @param {Object} dataView The data view to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned data view.\n */\nfunction cloneDataView(dataView, isDeep) {\n var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;\n return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);\n}\n\nmodule.exports = cloneDataView;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jbG9uZURhdGFWaWV3LmpzPzVkODkiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsdUJBQXVCLG1CQUFPLENBQUMsR0FBcUI7O0FBRXBEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsUUFBUTtBQUNuQixhQUFhLE9BQU87QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsImZpbGUiOiIzNjkuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgY2xvbmVBcnJheUJ1ZmZlciA9IHJlcXVpcmUoJy4vX2Nsb25lQXJyYXlCdWZmZXInKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgY2xvbmUgb2YgYGRhdGFWaWV3YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IGRhdGFWaWV3IFRoZSBkYXRhIHZpZXcgdG8gY2xvbmUuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0RlZXBdIFNwZWNpZnkgYSBkZWVwIGNsb25lLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY2xvbmVkIGRhdGEgdmlldy5cbiAqL1xuZnVuY3Rpb24gY2xvbmVEYXRhVmlldyhkYXRhVmlldywgaXNEZWVwKSB7XG4gIHZhciBidWZmZXIgPSBpc0RlZXAgPyBjbG9uZUFycmF5QnVmZmVyKGRhdGFWaWV3LmJ1ZmZlcikgOiBkYXRhVmlldy5idWZmZXI7XG4gIHJldHVybiBuZXcgZGF0YVZpZXcuY29uc3RydWN0b3IoYnVmZmVyLCBkYXRhVmlldy5ieXRlT2Zmc2V0LCBkYXRhVmlldy5ieXRlTGVuZ3RoKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjbG9uZURhdGFWaWV3O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///369\n")},function(module,exports){eval("/** Used to match `RegExp` flags from their coerced string values. */\nvar reFlags = /\\w*$/;\n\n/**\n * Creates a clone of `regexp`.\n *\n * @private\n * @param {Object} regexp The regexp to clone.\n * @returns {Object} Returns the cloned regexp.\n */\nfunction cloneRegExp(regexp) {\n var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));\n result.lastIndex = regexp.lastIndex;\n return result;\n}\n\nmodule.exports = cloneRegExp;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jbG9uZVJlZ0V4cC5qcz82ZjZjIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsImZpbGUiOiIzNzAuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiogVXNlZCB0byBtYXRjaCBgUmVnRXhwYCBmbGFncyBmcm9tIHRoZWlyIGNvZXJjZWQgc3RyaW5nIHZhbHVlcy4gKi9cbnZhciByZUZsYWdzID0gL1xcdyokLztcblxuLyoqXG4gKiBDcmVhdGVzIGEgY2xvbmUgb2YgYHJlZ2V4cGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSByZWdleHAgVGhlIHJlZ2V4cCB0byBjbG9uZS5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNsb25lZCByZWdleHAuXG4gKi9cbmZ1bmN0aW9uIGNsb25lUmVnRXhwKHJlZ2V4cCkge1xuICB2YXIgcmVzdWx0ID0gbmV3IHJlZ2V4cC5jb25zdHJ1Y3RvcihyZWdleHAuc291cmNlLCByZUZsYWdzLmV4ZWMocmVnZXhwKSk7XG4gIHJlc3VsdC5sYXN0SW5kZXggPSByZWdleHAubGFzdEluZGV4O1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNsb25lUmVnRXhwO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///370\n")},function(module,exports,__webpack_require__){eval("var Symbol = __webpack_require__(73);\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;\n\n/**\n * Creates a clone of the `symbol` object.\n *\n * @private\n * @param {Object} symbol The symbol object to clone.\n * @returns {Object} Returns the cloned symbol object.\n */\nfunction cloneSymbol(symbol) {\n return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};\n}\n\nmodule.exports = cloneSymbol;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jbG9uZVN5bWJvbC5qcz9hMmRiIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGFBQWEsbUJBQU8sQ0FBQyxFQUFXOztBQUVoQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwiZmlsZSI6IjM3MS5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBTeW1ib2wgPSByZXF1aXJlKCcuL19TeW1ib2wnKTtcblxuLyoqIFVzZWQgdG8gY29udmVydCBzeW1ib2xzIHRvIHByaW1pdGl2ZXMgYW5kIHN0cmluZ3MuICovXG52YXIgc3ltYm9sUHJvdG8gPSBTeW1ib2wgPyBTeW1ib2wucHJvdG90eXBlIDogdW5kZWZpbmVkLFxuICAgIHN5bWJvbFZhbHVlT2YgPSBzeW1ib2xQcm90byA/IHN5bWJvbFByb3RvLnZhbHVlT2YgOiB1bmRlZmluZWQ7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGNsb25lIG9mIHRoZSBgc3ltYm9sYCBvYmplY3QuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBzeW1ib2wgVGhlIHN5bWJvbCBvYmplY3QgdG8gY2xvbmUuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjbG9uZWQgc3ltYm9sIG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gY2xvbmVTeW1ib2woc3ltYm9sKSB7XG4gIHJldHVybiBzeW1ib2xWYWx1ZU9mID8gT2JqZWN0KHN5bWJvbFZhbHVlT2YuY2FsbChzeW1ib2wpKSA6IHt9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNsb25lU3ltYm9sO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///371\n")},function(module,exports,__webpack_require__){eval("var baseIsMap = __webpack_require__(373),\n baseUnary = __webpack_require__(107),\n nodeUtil = __webpack_require__(158);\n\n/* Node.js helper references. */\nvar nodeIsMap = nodeUtil && nodeUtil.isMap;\n\n/**\n * Checks if `value` is classified as a `Map` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n * @example\n *\n * _.isMap(new Map);\n * // => true\n *\n * _.isMap(new WeakMap);\n * // => false\n */\nvar isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;\n\nmodule.exports = isMap;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzTWFwLmpzP2NjNDUiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsZ0JBQWdCLG1CQUFPLENBQUMsR0FBYztBQUN0QyxnQkFBZ0IsbUJBQU8sQ0FBQyxHQUFjO0FBQ3RDLGVBQWUsbUJBQU8sQ0FBQyxHQUFhOztBQUVwQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxFQUFFO0FBQ2IsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsImZpbGUiOiIzNzIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYmFzZUlzTWFwID0gcmVxdWlyZSgnLi9fYmFzZUlzTWFwJyksXG4gICAgYmFzZVVuYXJ5ID0gcmVxdWlyZSgnLi9fYmFzZVVuYXJ5JyksXG4gICAgbm9kZVV0aWwgPSByZXF1aXJlKCcuL19ub2RlVXRpbCcpO1xuXG4vKiBOb2RlLmpzIGhlbHBlciByZWZlcmVuY2VzLiAqL1xudmFyIG5vZGVJc01hcCA9IG5vZGVVdGlsICYmIG5vZGVVdGlsLmlzTWFwO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgTWFwYCBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjMuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBtYXAsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc01hcChuZXcgTWFwKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzTWFwKG5ldyBXZWFrTWFwKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbnZhciBpc01hcCA9IG5vZGVJc01hcCA/IGJhc2VVbmFyeShub2RlSXNNYXApIDogYmFzZUlzTWFwO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGlzTWFwO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///372\n")},function(module,exports,__webpack_require__){eval("var getTag = __webpack_require__(75),\n isObjectLike = __webpack_require__(49);\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]';\n\n/**\n * The base implementation of `_.isMap` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n */\nfunction baseIsMap(value) {\n return isObjectLike(value) && getTag(value) == mapTag;\n}\n\nmodule.exports = baseIsMap;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlSXNNYXAuanM/MWEyZCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxhQUFhLG1CQUFPLENBQUMsRUFBVztBQUNoQyxtQkFBbUIsbUJBQU8sQ0FBQyxFQUFnQjs7QUFFM0M7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsRUFBRTtBQUNiLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsImZpbGUiOiIzNzMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgZ2V0VGFnID0gcmVxdWlyZSgnLi9fZ2V0VGFnJyksXG4gICAgaXNPYmplY3RMaWtlID0gcmVxdWlyZSgnLi9pc09iamVjdExpa2UnKTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIG1hcFRhZyA9ICdbb2JqZWN0IE1hcF0nO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzTWFwYCB3aXRob3V0IE5vZGUuanMgb3B0aW1pemF0aW9ucy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIG1hcCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBiYXNlSXNNYXAodmFsdWUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgZ2V0VGFnKHZhbHVlKSA9PSBtYXBUYWc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUlzTWFwO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///373\n")},function(module,exports,__webpack_require__){eval("var baseIsSet = __webpack_require__(375),\n baseUnary = __webpack_require__(107),\n nodeUtil = __webpack_require__(158);\n\n/* Node.js helper references. */\nvar nodeIsSet = nodeUtil && nodeUtil.isSet;\n\n/**\n * Checks if `value` is classified as a `Set` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n * @example\n *\n * _.isSet(new Set);\n * // => true\n *\n * _.isSet(new WeakSet);\n * // => false\n */\nvar isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;\n\nmodule.exports = isSet;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzU2V0LmpzP2Q3ZWUiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsZ0JBQWdCLG1CQUFPLENBQUMsR0FBYztBQUN0QyxnQkFBZ0IsbUJBQU8sQ0FBQyxHQUFjO0FBQ3RDLGVBQWUsbUJBQU8sQ0FBQyxHQUFhOztBQUVwQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxFQUFFO0FBQ2IsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsImZpbGUiOiIzNzQuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYmFzZUlzU2V0ID0gcmVxdWlyZSgnLi9fYmFzZUlzU2V0JyksXG4gICAgYmFzZVVuYXJ5ID0gcmVxdWlyZSgnLi9fYmFzZVVuYXJ5JyksXG4gICAgbm9kZVV0aWwgPSByZXF1aXJlKCcuL19ub2RlVXRpbCcpO1xuXG4vKiBOb2RlLmpzIGhlbHBlciByZWZlcmVuY2VzLiAqL1xudmFyIG5vZGVJc1NldCA9IG5vZGVVdGlsICYmIG5vZGVVdGlsLmlzU2V0O1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgU2V0YCBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjMuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBzZXQsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc1NldChuZXcgU2V0KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzU2V0KG5ldyBXZWFrU2V0KTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbnZhciBpc1NldCA9IG5vZGVJc1NldCA/IGJhc2VVbmFyeShub2RlSXNTZXQpIDogYmFzZUlzU2V0O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGlzU2V0O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///374\n")},function(module,exports,__webpack_require__){eval("var getTag = __webpack_require__(75),\n isObjectLike = __webpack_require__(49);\n\n/** `Object#toString` result references. */\nvar setTag = '[object Set]';\n\n/**\n * The base implementation of `_.isSet` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n */\nfunction baseIsSet(value) {\n return isObjectLike(value) && getTag(value) == setTag;\n}\n\nmodule.exports = baseIsSet;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlSXNTZXQuanM/YzNmYyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxhQUFhLG1CQUFPLENBQUMsRUFBVztBQUNoQyxtQkFBbUIsbUJBQU8sQ0FBQyxFQUFnQjs7QUFFM0M7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsRUFBRTtBQUNiLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsImZpbGUiOiIzNzUuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgZ2V0VGFnID0gcmVxdWlyZSgnLi9fZ2V0VGFnJyksXG4gICAgaXNPYmplY3RMaWtlID0gcmVxdWlyZSgnLi9pc09iamVjdExpa2UnKTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIHNldFRhZyA9ICdbb2JqZWN0IFNldF0nO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzU2V0YCB3aXRob3V0IE5vZGUuanMgb3B0aW1pemF0aW9ucy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHNldCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBiYXNlSXNTZXQodmFsdWUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgZ2V0VGFnKHZhbHVlKSA9PSBzZXRUYWc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUlzU2V0O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///375\n")},function(module,exports){eval("/**\n * Creates a base function for methods like `_.forIn` and `_.forOwn`.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseFor(fromRight) {\n return function(object, iteratee, keysFunc) {\n var index = -1,\n iterable = Object(object),\n props = keysFunc(object),\n length = props.length;\n\n while (length--) {\n var key = props[fromRight ? length : ++index];\n if (iteratee(iterable[key], key, iterable) === false) {\n break;\n }\n }\n return object;\n };\n}\n\nmodule.exports = createBaseFor;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jcmVhdGVCYXNlRm9yLmpzPzk5Y2QiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsImZpbGUiOiIzNzYuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENyZWF0ZXMgYSBiYXNlIGZ1bmN0aW9uIGZvciBtZXRob2RzIGxpa2UgYF8uZm9ySW5gIGFuZCBgXy5mb3JPd25gLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGJhc2UgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUJhc2VGb3IoZnJvbVJpZ2h0KSB7XG4gIHJldHVybiBmdW5jdGlvbihvYmplY3QsIGl0ZXJhdGVlLCBrZXlzRnVuYykge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBpdGVyYWJsZSA9IE9iamVjdChvYmplY3QpLFxuICAgICAgICBwcm9wcyA9IGtleXNGdW5jKG9iamVjdCksXG4gICAgICAgIGxlbmd0aCA9IHByb3BzLmxlbmd0aDtcblxuICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgdmFyIGtleSA9IHByb3BzW2Zyb21SaWdodCA/IGxlbmd0aCA6ICsraW5kZXhdO1xuICAgICAgaWYgKGl0ZXJhdGVlKGl0ZXJhYmxlW2tleV0sIGtleSwgaXRlcmFibGUpID09PSBmYWxzZSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG9iamVjdDtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjcmVhdGVCYXNlRm9yO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///376\n")},function(module,exports,__webpack_require__){eval("var isArrayLike = __webpack_require__(54);\n\n/**\n * Creates a `baseEach` or `baseEachRight` function.\n *\n * @private\n * @param {Function} eachFunc The function to iterate over a collection.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseEach(eachFunc, fromRight) {\n return function(collection, iteratee) {\n if (collection == null) {\n return collection;\n }\n if (!isArrayLike(collection)) {\n return eachFunc(collection, iteratee);\n }\n var length = collection.length,\n index = fromRight ? length : -1,\n iterable = Object(collection);\n\n while ((fromRight ? index-- : ++index < length)) {\n if (iteratee(iterable[index], index, iterable) === false) {\n break;\n }\n }\n return collection;\n };\n}\n\nmodule.exports = createBaseEach;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jcmVhdGVCYXNlRWFjaC5qcz85NTBhIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGtCQUFrQixtQkFBTyxDQUFDLEVBQWU7O0FBRXpDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxTQUFTO0FBQ3BCLFdBQVcsUUFBUTtBQUNuQixhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJmaWxlIjoiMzc3LmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIGlzQXJyYXlMaWtlID0gcmVxdWlyZSgnLi9pc0FycmF5TGlrZScpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBgYmFzZUVhY2hgIG9yIGBiYXNlRWFjaFJpZ2h0YCBmdW5jdGlvbi5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZWFjaEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGl0ZXJhdGUgb3ZlciBhIGNvbGxlY3Rpb24uXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGJhc2UgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUJhc2VFYWNoKGVhY2hGdW5jLCBmcm9tUmlnaHQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSB7XG4gICAgaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGNvbGxlY3Rpb247XG4gICAgfVxuICAgIGlmICghaXNBcnJheUxpa2UoY29sbGVjdGlvbikpIHtcbiAgICAgIHJldHVybiBlYWNoRnVuYyhjb2xsZWN0aW9uLCBpdGVyYXRlZSk7XG4gICAgfVxuICAgIHZhciBsZW5ndGggPSBjb2xsZWN0aW9uLmxlbmd0aCxcbiAgICAgICAgaW5kZXggPSBmcm9tUmlnaHQgPyBsZW5ndGggOiAtMSxcbiAgICAgICAgaXRlcmFibGUgPSBPYmplY3QoY29sbGVjdGlvbik7XG5cbiAgICB3aGlsZSAoKGZyb21SaWdodCA/IGluZGV4LS0gOiArK2luZGV4IDwgbGVuZ3RoKSkge1xuICAgICAgaWYgKGl0ZXJhdGVlKGl0ZXJhYmxlW2luZGV4XSwgaW5kZXgsIGl0ZXJhYmxlKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb2xsZWN0aW9uO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZUJhc2VFYWNoO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///377\n")},function(module,exports,__webpack_require__){eval("var baseEach = __webpack_require__(110);\n\n/**\n * The base implementation of `_.filter` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\nfunction baseFilter(collection, predicate) {\n var result = [];\n baseEach(collection, function(value, index, collection) {\n if (predicate(value, index, collection)) {\n result.push(value);\n }\n });\n return result;\n}\n\nmodule.exports = baseFilter;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlRmlsdGVyLmpzPzlmNzQiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsZUFBZSxtQkFBTyxDQUFDLEdBQWE7O0FBRXBDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxhQUFhO0FBQ3hCLFdBQVcsU0FBUztBQUNwQixhQUFhLE1BQU07QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQSIsImZpbGUiOiIzNzguanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYmFzZUVhY2ggPSByZXF1aXJlKCcuL19iYXNlRWFjaCcpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZpbHRlcmAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZpbHRlcmVkIGFycmF5LlxuICovXG5mdW5jdGlvbiBiYXNlRmlsdGVyKGNvbGxlY3Rpb24sIHByZWRpY2F0ZSkge1xuICB2YXIgcmVzdWx0ID0gW107XG4gIGJhc2VFYWNoKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikge1xuICAgIGlmIChwcmVkaWNhdGUodmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSkge1xuICAgICAgcmVzdWx0LnB1c2godmFsdWUpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUZpbHRlcjtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///378\n")},function(module,exports,__webpack_require__){eval("var baseIsMatch = __webpack_require__(380),\n getMatchData = __webpack_require__(388),\n matchesStrictComparable = __webpack_require__(213);\n\n/**\n * The base implementation of `_.matches` which doesn't clone `source`.\n *\n * @private\n * @param {Object} source The object of property values to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction baseMatches(source) {\n var matchData = getMatchData(source);\n if (matchData.length == 1 && matchData[0][2]) {\n return matchesStrictComparable(matchData[0][0], matchData[0][1]);\n }\n return function(object) {\n return object === source || baseIsMatch(object, source, matchData);\n };\n}\n\nmodule.exports = baseMatches;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlTWF0Y2hlcy5qcz82NDJhIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGtCQUFrQixtQkFBTyxDQUFDLEdBQWdCO0FBQzFDLG1CQUFtQixtQkFBTyxDQUFDLEdBQWlCO0FBQzVDLDhCQUE4QixtQkFBTyxDQUFDLEdBQTRCOztBQUVsRTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJmaWxlIjoiMzc5LmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIGJhc2VJc01hdGNoID0gcmVxdWlyZSgnLi9fYmFzZUlzTWF0Y2gnKSxcbiAgICBnZXRNYXRjaERhdGEgPSByZXF1aXJlKCcuL19nZXRNYXRjaERhdGEnKSxcbiAgICBtYXRjaGVzU3RyaWN0Q29tcGFyYWJsZSA9IHJlcXVpcmUoJy4vX21hdGNoZXNTdHJpY3RDb21wYXJhYmxlJyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ubWF0Y2hlc2Agd2hpY2ggZG9lc24ndCBjbG9uZSBgc291cmNlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IG9mIHByb3BlcnR5IHZhbHVlcyB0byBtYXRjaC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHNwZWMgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGJhc2VNYXRjaGVzKHNvdXJjZSkge1xuICB2YXIgbWF0Y2hEYXRhID0gZ2V0TWF0Y2hEYXRhKHNvdXJjZSk7XG4gIGlmIChtYXRjaERhdGEubGVuZ3RoID09IDEgJiYgbWF0Y2hEYXRhWzBdWzJdKSB7XG4gICAgcmV0dXJuIG1hdGNoZXNTdHJpY3RDb21wYXJhYmxlKG1hdGNoRGF0YVswXVswXSwgbWF0Y2hEYXRhWzBdWzFdKTtcbiAgfVxuICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgcmV0dXJuIG9iamVjdCA9PT0gc291cmNlIHx8IGJhc2VJc01hdGNoKG9iamVjdCwgc291cmNlLCBtYXRjaERhdGEpO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VNYXRjaGVzO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///379\n")},function(module,exports,__webpack_require__){eval("var Stack = __webpack_require__(99),\n baseIsEqual = __webpack_require__(208);\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * The base implementation of `_.isMatch` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property values to match.\n * @param {Array} matchData The property names, values, and compare flags to match.\n * @param {Function} [customizer] The function to customize comparisons.\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n */\nfunction baseIsMatch(object, source, matchData, customizer) {\n var index = matchData.length,\n length = index,\n noCustomizer = !customizer;\n\n if (object == null) {\n return !length;\n }\n object = Object(object);\n while (index--) {\n var data = matchData[index];\n if ((noCustomizer && data[2])\n ? data[1] !== object[data[0]]\n : !(data[0] in object)\n ) {\n return false;\n }\n }\n while (++index < length) {\n data = matchData[index];\n var key = data[0],\n objValue = object[key],\n srcValue = data[1];\n\n if (noCustomizer && data[2]) {\n if (objValue === undefined && !(key in object)) {\n return false;\n }\n } else {\n var stack = new Stack;\n if (customizer) {\n var result = customizer(objValue, srcValue, key, object, source, stack);\n }\n if (!(result === undefined\n ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack)\n : result\n )) {\n return false;\n }\n }\n }\n return true;\n}\n\nmodule.exports = baseIsMatch;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlSXNNYXRjaC5qcz85NjZmIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVksbUJBQU8sQ0FBQyxFQUFVO0FBQzlCLGtCQUFrQixtQkFBTyxDQUFDLEdBQWdCOztBQUUxQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsTUFBTTtBQUNqQixXQUFXLFNBQVM7QUFDcEIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJmaWxlIjoiMzgwLmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIFN0YWNrID0gcmVxdWlyZSgnLi9fU3RhY2snKSxcbiAgICBiYXNlSXNFcXVhbCA9IHJlcXVpcmUoJy4vX2Jhc2VJc0VxdWFsJyk7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIHZhbHVlIGNvbXBhcmlzb25zLiAqL1xudmFyIENPTVBBUkVfUEFSVElBTF9GTEFHID0gMSxcbiAgICBDT01QQVJFX1VOT1JERVJFRF9GTEFHID0gMjtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc01hdGNoYCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnNwZWN0LlxuICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IG9mIHByb3BlcnR5IHZhbHVlcyB0byBtYXRjaC5cbiAqIEBwYXJhbSB7QXJyYXl9IG1hdGNoRGF0YSBUaGUgcHJvcGVydHkgbmFtZXMsIHZhbHVlcywgYW5kIGNvbXBhcmUgZmxhZ3MgdG8gbWF0Y2guXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpc29ucy5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgb2JqZWN0YCBpcyBhIG1hdGNoLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VJc01hdGNoKG9iamVjdCwgc291cmNlLCBtYXRjaERhdGEsIGN1c3RvbWl6ZXIpIHtcbiAgdmFyIGluZGV4ID0gbWF0Y2hEYXRhLmxlbmd0aCxcbiAgICAgIGxlbmd0aCA9IGluZGV4LFxuICAgICAgbm9DdXN0b21pemVyID0gIWN1c3RvbWl6ZXI7XG5cbiAgaWYgKG9iamVjdCA9PSBudWxsKSB7XG4gICAgcmV0dXJuICFsZW5ndGg7XG4gIH1cbiAgb2JqZWN0ID0gT2JqZWN0KG9iamVjdCk7XG4gIHdoaWxlIChpbmRleC0tKSB7XG4gICAgdmFyIGRhdGEgPSBtYXRjaERhdGFbaW5kZXhdO1xuICAgIGlmICgobm9DdXN0b21pemVyICYmIGRhdGFbMl0pXG4gICAgICAgICAgPyBkYXRhWzFdICE9PSBvYmplY3RbZGF0YVswXV1cbiAgICAgICAgICA6ICEoZGF0YVswXSBpbiBvYmplY3QpXG4gICAgICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIGRhdGEgPSBtYXRjaERhdGFbaW5kZXhdO1xuICAgIHZhciBrZXkgPSBkYXRhWzBdLFxuICAgICAgICBvYmpWYWx1ZSA9IG9iamVjdFtrZXldLFxuICAgICAgICBzcmNWYWx1ZSA9IGRhdGFbMV07XG5cbiAgICBpZiAobm9DdXN0b21pemVyICYmIGRhdGFbMl0pIHtcbiAgICAgIGlmIChvYmpWYWx1ZSA9PT0gdW5kZWZpbmVkICYmICEoa2V5IGluIG9iamVjdCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgc3RhY2sgPSBuZXcgU3RhY2s7XG4gICAgICBpZiAoY3VzdG9taXplcikge1xuICAgICAgICB2YXIgcmVzdWx0ID0gY3VzdG9taXplcihvYmpWYWx1ZSwgc3JjVmFsdWUsIGtleSwgb2JqZWN0LCBzb3VyY2UsIHN0YWNrKTtcbiAgICAgIH1cbiAgICAgIGlmICghKHJlc3VsdCA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IGJhc2VJc0VxdWFsKHNyY1ZhbHVlLCBvYmpWYWx1ZSwgQ09NUEFSRV9QQVJUSUFMX0ZMQUcgfCBDT01QQVJFX1VOT1JERVJFRF9GTEFHLCBjdXN0b21pemVyLCBzdGFjaylcbiAgICAgICAgICAgIDogcmVzdWx0XG4gICAgICAgICAgKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VJc01hdGNoO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///380\n")},function(module,exports,__webpack_require__){eval("var Stack = __webpack_require__(99),\n equalArrays = __webpack_require__(209),\n equalByTag = __webpack_require__(385),\n equalObjects = __webpack_require__(387),\n getTag = __webpack_require__(75),\n isArray = __webpack_require__(31),\n isBuffer = __webpack_require__(74),\n isTypedArray = __webpack_require__(89);\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n objectTag = '[object Object]';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * A specialized version of `baseIsEqual` for arrays and objects which performs\n * deep comparisons and tracks traversed objects enabling objects with circular\n * references to be compared.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} [stack] Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {\n var objIsArr = isArray(object),\n othIsArr = isArray(other),\n objTag = objIsArr ? arrayTag : getTag(object),\n othTag = othIsArr ? arrayTag : getTag(other);\n\n objTag = objTag == argsTag ? objectTag : objTag;\n othTag = othTag == argsTag ? objectTag : othTag;\n\n var objIsObj = objTag == objectTag,\n othIsObj = othTag == objectTag,\n isSameTag = objTag == othTag;\n\n if (isSameTag && isBuffer(object)) {\n if (!isBuffer(other)) {\n return false;\n }\n objIsArr = true;\n objIsObj = false;\n }\n if (isSameTag && !objIsObj) {\n stack || (stack = new Stack);\n return (objIsArr || isTypedArray(object))\n ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)\n : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);\n }\n if (!(bitmask & COMPARE_PARTIAL_FLAG)) {\n var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n if (objIsWrapped || othIsWrapped) {\n var objUnwrapped = objIsWrapped ? object.value() : object,\n othUnwrapped = othIsWrapped ? other.value() : other;\n\n stack || (stack = new Stack);\n return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);\n }\n }\n if (!isSameTag) {\n return false;\n }\n stack || (stack = new Stack);\n return equalObjects(object, other, bitmask, customizer, equalFunc, stack);\n}\n\nmodule.exports = baseIsEqualDeep;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlSXNFcXVhbERlZXAuanM/N2I5NyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZLG1CQUFPLENBQUMsRUFBVTtBQUM5QixrQkFBa0IsbUJBQU8sQ0FBQyxHQUFnQjtBQUMxQyxpQkFBaUIsbUJBQU8sQ0FBQyxHQUFlO0FBQ3hDLG1CQUFtQixtQkFBTyxDQUFDLEdBQWlCO0FBQzVDLGFBQWEsbUJBQU8sQ0FBQyxFQUFXO0FBQ2hDLGNBQWMsbUJBQU8sQ0FBQyxFQUFXO0FBQ2pDLGVBQWUsbUJBQU8sQ0FBQyxFQUFZO0FBQ25DLG1CQUFtQixtQkFBTyxDQUFDLEVBQWdCOztBQUUzQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixXQUFXLFNBQVM7QUFDcEIsV0FBVyxTQUFTO0FBQ3BCLFdBQVcsT0FBTztBQUNsQixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsImZpbGUiOiIzODEuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgU3RhY2sgPSByZXF1aXJlKCcuL19TdGFjaycpLFxuICAgIGVxdWFsQXJyYXlzID0gcmVxdWlyZSgnLi9fZXF1YWxBcnJheXMnKSxcbiAgICBlcXVhbEJ5VGFnID0gcmVxdWlyZSgnLi9fZXF1YWxCeVRhZycpLFxuICAgIGVxdWFsT2JqZWN0cyA9IHJlcXVpcmUoJy4vX2VxdWFsT2JqZWN0cycpLFxuICAgIGdldFRhZyA9IHJlcXVpcmUoJy4vX2dldFRhZycpLFxuICAgIGlzQXJyYXkgPSByZXF1aXJlKCcuL2lzQXJyYXknKSxcbiAgICBpc0J1ZmZlciA9IHJlcXVpcmUoJy4vaXNCdWZmZXInKSxcbiAgICBpc1R5cGVkQXJyYXkgPSByZXF1aXJlKCcuL2lzVHlwZWRBcnJheScpO1xuXG4vKiogVXNlZCB0byBjb21wb3NlIGJpdG1hc2tzIGZvciB2YWx1ZSBjb21wYXJpc29ucy4gKi9cbnZhciBDT01QQVJFX1BBUlRJQUxfRkxBRyA9IDE7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBhcmdzVGFnID0gJ1tvYmplY3QgQXJndW1lbnRzXScsXG4gICAgYXJyYXlUYWcgPSAnW29iamVjdCBBcnJheV0nLFxuICAgIG9iamVjdFRhZyA9ICdbb2JqZWN0IE9iamVjdF0nO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUlzRXF1YWxgIGZvciBhcnJheXMgYW5kIG9iamVjdHMgd2hpY2ggcGVyZm9ybXNcbiAqIGRlZXAgY29tcGFyaXNvbnMgYW5kIHRyYWNrcyB0cmF2ZXJzZWQgb2JqZWN0cyBlbmFibGluZyBvYmplY3RzIHdpdGggY2lyY3VsYXJcbiAqIHJlZmVyZW5jZXMgdG8gYmUgY29tcGFyZWQuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBjb21wYXJlLlxuICogQHBhcmFtIHtPYmplY3R9IG90aGVyIFRoZSBvdGhlciBvYmplY3QgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGJhc2VJc0VxdWFsYCBmb3IgbW9yZSBkZXRhaWxzLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY3VzdG9taXplciBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZXF1YWxGdW5jIFRoZSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgZXF1aXZhbGVudHMgb2YgdmFsdWVzLlxuICogQHBhcmFtIHtPYmplY3R9IFtzdGFja10gVHJhY2tzIHRyYXZlcnNlZCBgb2JqZWN0YCBhbmQgYG90aGVyYCBvYmplY3RzLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBvYmplY3RzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VJc0VxdWFsRGVlcChvYmplY3QsIG90aGVyLCBiaXRtYXNrLCBjdXN0b21pemVyLCBlcXVhbEZ1bmMsIHN0YWNrKSB7XG4gIHZhciBvYmpJc0FyciA9IGlzQXJyYXkob2JqZWN0KSxcbiAgICAgIG90aElzQXJyID0gaXNBcnJheShvdGhlciksXG4gICAgICBvYmpUYWcgPSBvYmpJc0FyciA/IGFycmF5VGFnIDogZ2V0VGFnKG9iamVjdCksXG4gICAgICBvdGhUYWcgPSBvdGhJc0FyciA/IGFycmF5VGFnIDogZ2V0VGFnKG90aGVyKTtcblxuICBvYmpUYWcgPSBvYmpUYWcgPT0gYXJnc1RhZyA/IG9iamVjdFRhZyA6IG9ialRhZztcbiAgb3RoVGFnID0gb3RoVGFnID09IGFyZ3NUYWcgPyBvYmplY3RUYWcgOiBvdGhUYWc7XG5cbiAgdmFyIG9iaklzT2JqID0gb2JqVGFnID09IG9iamVjdFRhZyxcbiAgICAgIG90aElzT2JqID0gb3RoVGFnID09IG9iamVjdFRhZyxcbiAgICAgIGlzU2FtZVRhZyA9IG9ialRhZyA9PSBvdGhUYWc7XG5cbiAgaWYgKGlzU2FtZVRhZyAmJiBpc0J1ZmZlcihvYmplY3QpKSB7XG4gICAgaWYgKCFpc0J1ZmZlcihvdGhlcikpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgb2JqSXNBcnIgPSB0cnVlO1xuICAgIG9iaklzT2JqID0gZmFsc2U7XG4gIH1cbiAgaWYgKGlzU2FtZVRhZyAmJiAhb2JqSXNPYmopIHtcbiAgICBzdGFjayB8fCAoc3RhY2sgPSBuZXcgU3RhY2spO1xuICAgIHJldHVybiAob2JqSXNBcnIgfHwgaXNUeXBlZEFycmF5KG9iamVjdCkpXG4gICAgICA/IGVxdWFsQXJyYXlzKG9iamVjdCwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spXG4gICAgICA6IGVxdWFsQnlUYWcob2JqZWN0LCBvdGhlciwgb2JqVGFnLCBiaXRtYXNrLCBjdXN0b21pemVyLCBlcXVhbEZ1bmMsIHN0YWNrKTtcbiAgfVxuICBpZiAoIShiaXRtYXNrICYgQ09NUEFSRV9QQVJUSUFMX0ZMQUcpKSB7XG4gICAgdmFyIG9iaklzV3JhcHBlZCA9IG9iaklzT2JqICYmIGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCAnX193cmFwcGVkX18nKSxcbiAgICAgICAgb3RoSXNXcmFwcGVkID0gb3RoSXNPYmogJiYgaGFzT3duUHJvcGVydHkuY2FsbChvdGhlciwgJ19fd3JhcHBlZF9fJyk7XG5cbiAgICBpZiAob2JqSXNXcmFwcGVkIHx8IG90aElzV3JhcHBlZCkge1xuICAgICAgdmFyIG9ialVud3JhcHBlZCA9IG9iaklzV3JhcHBlZCA/IG9iamVjdC52YWx1ZSgpIDogb2JqZWN0LFxuICAgICAgICAgIG90aFVud3JhcHBlZCA9IG90aElzV3JhcHBlZCA/IG90aGVyLnZhbHVlKCkgOiBvdGhlcjtcblxuICAgICAgc3RhY2sgfHwgKHN0YWNrID0gbmV3IFN0YWNrKTtcbiAgICAgIHJldHVybiBlcXVhbEZ1bmMob2JqVW53cmFwcGVkLCBvdGhVbndyYXBwZWQsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIHN0YWNrKTtcbiAgICB9XG4gIH1cbiAgaWYgKCFpc1NhbWVUYWcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgc3RhY2sgfHwgKHN0YWNrID0gbmV3IFN0YWNrKTtcbiAgcmV0dXJuIGVxdWFsT2JqZWN0cyhvYmplY3QsIG90aGVyLCBiaXRtYXNrLCBjdXN0b21pemVyLCBlcXVhbEZ1bmMsIHN0YWNrKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlSXNFcXVhbERlZXA7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///381\n")},function(module,exports){eval("/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Adds `value` to the array cache.\n *\n * @private\n * @name add\n * @memberOf SetCache\n * @alias push\n * @param {*} value The value to cache.\n * @returns {Object} Returns the cache instance.\n */\nfunction setCacheAdd(value) {\n this.__data__.set(value, HASH_UNDEFINED);\n return this;\n}\n\nmodule.exports = setCacheAdd;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19zZXRDYWNoZUFkZC5qcz83ZWQyIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEVBQUU7QUFDYixhQUFhLE9BQU87QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsImZpbGUiOiIzODIuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiogVXNlZCB0byBzdGFuZC1pbiBmb3IgYHVuZGVmaW5lZGAgaGFzaCB2YWx1ZXMuICovXG52YXIgSEFTSF9VTkRFRklORUQgPSAnX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyc7XG5cbi8qKlxuICogQWRkcyBgdmFsdWVgIHRvIHRoZSBhcnJheSBjYWNoZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgYWRkXG4gKiBAbWVtYmVyT2YgU2V0Q2FjaGVcbiAqIEBhbGlhcyBwdXNoXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjYWNoZS5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNhY2hlIGluc3RhbmNlLlxuICovXG5mdW5jdGlvbiBzZXRDYWNoZUFkZCh2YWx1ZSkge1xuICB0aGlzLl9fZGF0YV9fLnNldCh2YWx1ZSwgSEFTSF9VTkRFRklORUQpO1xuICByZXR1cm4gdGhpcztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzZXRDYWNoZUFkZDtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///382\n")},function(module,exports){eval("/**\n * Checks if `value` is in the array cache.\n *\n * @private\n * @name has\n * @memberOf SetCache\n * @param {*} value The value to search for.\n * @returns {number} Returns `true` if `value` is found, else `false`.\n */\nfunction setCacheHas(value) {\n return this.__data__.has(value);\n}\n\nmodule.exports = setCacheHas;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19zZXRDYWNoZUhhcy5qcz9kYzBmIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsRUFBRTtBQUNiLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsImZpbGUiOiIzODMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGluIHRoZSBhcnJheSBjYWNoZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgaGFzXG4gKiBAbWVtYmVyT2YgU2V0Q2FjaGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGZvdW5kLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIHNldENhY2hlSGFzKHZhbHVlKSB7XG4gIHJldHVybiB0aGlzLl9fZGF0YV9fLmhhcyh2YWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2V0Q2FjaGVIYXM7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///383\n")},function(module,exports){eval("/**\n * A specialized version of `_.some` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n * else `false`.\n */\nfunction arraySome(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (predicate(array[index], index, array)) {\n return true;\n }\n }\n return false;\n}\n\nmodule.exports = arraySome;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19hcnJheVNvbWUuanM/NDI4NCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxNQUFNO0FBQ2pCLFdBQVcsU0FBUztBQUNwQixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsImZpbGUiOiIzODQuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5zb21lYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWVcbiAqIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFueSBlbGVtZW50IHBhc3NlcyB0aGUgcHJlZGljYXRlIGNoZWNrLFxuICogIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYXJyYXlTb21lKGFycmF5LCBwcmVkaWNhdGUpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIGlmIChwcmVkaWNhdGUoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFycmF5U29tZTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///384\n")},function(module,exports,__webpack_require__){eval("var Symbol = __webpack_require__(73),\n Uint8Array = __webpack_require__(200),\n eq = __webpack_require__(72),\n equalArrays = __webpack_require__(209),\n mapToArray = __webpack_require__(386),\n setToArray = __webpack_require__(166);\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/** `Object#toString` result references. */\nvar boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]';\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;\n\n/**\n * A specialized version of `baseIsEqualDeep` for comparing objects of\n * the same `toStringTag`.\n *\n * **Note:** This function only supports comparing values with tags of\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {string} tag The `toStringTag` of the objects to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {\n switch (tag) {\n case dataViewTag:\n if ((object.byteLength != other.byteLength) ||\n (object.byteOffset != other.byteOffset)) {\n return false;\n }\n object = object.buffer;\n other = other.buffer;\n\n case arrayBufferTag:\n if ((object.byteLength != other.byteLength) ||\n !equalFunc(new Uint8Array(object), new Uint8Array(other))) {\n return false;\n }\n return true;\n\n case boolTag:\n case dateTag:\n case numberTag:\n // Coerce booleans to `1` or `0` and dates to milliseconds.\n // Invalid dates are coerced to `NaN`.\n return eq(+object, +other);\n\n case errorTag:\n return object.name == other.name && object.message == other.message;\n\n case regexpTag:\n case stringTag:\n // Coerce regexes to strings and treat strings, primitives and objects,\n // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\n // for more details.\n return object == (other + '');\n\n case mapTag:\n var convert = mapToArray;\n\n case setTag:\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG;\n convert || (convert = setToArray);\n\n if (object.size != other.size && !isPartial) {\n return false;\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(object);\n if (stacked) {\n return stacked == other;\n }\n bitmask |= COMPARE_UNORDERED_FLAG;\n\n // Recursively compare objects (susceptible to call stack limits).\n stack.set(object, other);\n var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);\n stack['delete'](object);\n return result;\n\n case symbolTag:\n if (symbolValueOf) {\n return symbolValueOf.call(object) == symbolValueOf.call(other);\n }\n }\n return false;\n}\n\nmodule.exports = equalByTag;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19lcXVhbEJ5VGFnLmpzPzFjM2MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsYUFBYSxtQkFBTyxDQUFDLEVBQVc7QUFDaEMsaUJBQWlCLG1CQUFPLENBQUMsR0FBZTtBQUN4QyxTQUFTLG1CQUFPLENBQUMsRUFBTTtBQUN2QixrQkFBa0IsbUJBQU8sQ0FBQyxHQUFnQjtBQUMxQyxpQkFBaUIsbUJBQU8sQ0FBQyxHQUFlO0FBQ3hDLGlCQUFpQixtQkFBTyxDQUFDLEdBQWU7O0FBRXhDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsU0FBUztBQUNwQixXQUFXLFNBQVM7QUFDcEIsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwiZmlsZSI6IjM4NS5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBTeW1ib2wgPSByZXF1aXJlKCcuL19TeW1ib2wnKSxcbiAgICBVaW50OEFycmF5ID0gcmVxdWlyZSgnLi9fVWludDhBcnJheScpLFxuICAgIGVxID0gcmVxdWlyZSgnLi9lcScpLFxuICAgIGVxdWFsQXJyYXlzID0gcmVxdWlyZSgnLi9fZXF1YWxBcnJheXMnKSxcbiAgICBtYXBUb0FycmF5ID0gcmVxdWlyZSgnLi9fbWFwVG9BcnJheScpLFxuICAgIHNldFRvQXJyYXkgPSByZXF1aXJlKCcuL19zZXRUb0FycmF5Jyk7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIHZhbHVlIGNvbXBhcmlzb25zLiAqL1xudmFyIENPTVBBUkVfUEFSVElBTF9GTEFHID0gMSxcbiAgICBDT01QQVJFX1VOT1JERVJFRF9GTEFHID0gMjtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIGJvb2xUYWcgPSAnW29iamVjdCBCb29sZWFuXScsXG4gICAgZGF0ZVRhZyA9ICdbb2JqZWN0IERhdGVdJyxcbiAgICBlcnJvclRhZyA9ICdbb2JqZWN0IEVycm9yXScsXG4gICAgbWFwVGFnID0gJ1tvYmplY3QgTWFwXScsXG4gICAgbnVtYmVyVGFnID0gJ1tvYmplY3QgTnVtYmVyXScsXG4gICAgcmVnZXhwVGFnID0gJ1tvYmplY3QgUmVnRXhwXScsXG4gICAgc2V0VGFnID0gJ1tvYmplY3QgU2V0XScsXG4gICAgc3RyaW5nVGFnID0gJ1tvYmplY3QgU3RyaW5nXScsXG4gICAgc3ltYm9sVGFnID0gJ1tvYmplY3QgU3ltYm9sXSc7XG5cbnZhciBhcnJheUJ1ZmZlclRhZyA9ICdbb2JqZWN0IEFycmF5QnVmZmVyXScsXG4gICAgZGF0YVZpZXdUYWcgPSAnW29iamVjdCBEYXRhVmlld10nO1xuXG4vKiogVXNlZCB0byBjb252ZXJ0IHN5bWJvbHMgdG8gcHJpbWl0aXZlcyBhbmQgc3RyaW5ncy4gKi9cbnZhciBzeW1ib2xQcm90byA9IFN5bWJvbCA/IFN5bWJvbC5wcm90b3R5cGUgOiB1bmRlZmluZWQsXG4gICAgc3ltYm9sVmFsdWVPZiA9IHN5bWJvbFByb3RvID8gc3ltYm9sUHJvdG8udmFsdWVPZiA6IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VJc0VxdWFsRGVlcGAgZm9yIGNvbXBhcmluZyBvYmplY3RzIG9mXG4gKiB0aGUgc2FtZSBgdG9TdHJpbmdUYWdgLlxuICpcbiAqICoqTm90ZToqKiBUaGlzIGZ1bmN0aW9uIG9ubHkgc3VwcG9ydHMgY29tcGFyaW5nIHZhbHVlcyB3aXRoIHRhZ3Mgb2ZcbiAqIGBCb29sZWFuYCwgYERhdGVgLCBgRXJyb3JgLCBgTnVtYmVyYCwgYFJlZ0V4cGAsIG9yIGBTdHJpbmdgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvdGhlciBUaGUgb3RoZXIgb2JqZWN0IHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnIFRoZSBgdG9TdHJpbmdUYWdgIG9mIHRoZSBvYmplY3RzIHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBiYXNlSXNFcXVhbGAgZm9yIG1vcmUgZGV0YWlscy5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGN1c3RvbWl6ZXIgVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpc29ucy5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGVxdWFsRnVuYyBUaGUgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGVxdWl2YWxlbnRzIG9mIHZhbHVlcy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBzdGFjayBUcmFja3MgdHJhdmVyc2VkIGBvYmplY3RgIGFuZCBgb3RoZXJgIG9iamVjdHMuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG9iamVjdHMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gZXF1YWxCeVRhZyhvYmplY3QsIG90aGVyLCB0YWcsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spIHtcbiAgc3dpdGNoICh0YWcpIHtcbiAgICBjYXNlIGRhdGFWaWV3VGFnOlxuICAgICAgaWYgKChvYmplY3QuYnl0ZUxlbmd0aCAhPSBvdGhlci5ieXRlTGVuZ3RoKSB8fFxuICAgICAgICAgIChvYmplY3QuYnl0ZU9mZnNldCAhPSBvdGhlci5ieXRlT2Zmc2V0KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBvYmplY3QgPSBvYmplY3QuYnVmZmVyO1xuICAgICAgb3RoZXIgPSBvdGhlci5idWZmZXI7XG5cbiAgICBjYXNlIGFycmF5QnVmZmVyVGFnOlxuICAgICAgaWYgKChvYmplY3QuYnl0ZUxlbmd0aCAhPSBvdGhlci5ieXRlTGVuZ3RoKSB8fFxuICAgICAgICAgICFlcXVhbEZ1bmMobmV3IFVpbnQ4QXJyYXkob2JqZWN0KSwgbmV3IFVpbnQ4QXJyYXkob3RoZXIpKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcblxuICAgIGNhc2UgYm9vbFRhZzpcbiAgICBjYXNlIGRhdGVUYWc6XG4gICAgY2FzZSBudW1iZXJUYWc6XG4gICAgICAvLyBDb2VyY2UgYm9vbGVhbnMgdG8gYDFgIG9yIGAwYCBhbmQgZGF0ZXMgdG8gbWlsbGlzZWNvbmRzLlxuICAgICAgLy8gSW52YWxpZCBkYXRlcyBhcmUgY29lcmNlZCB0byBgTmFOYC5cbiAgICAgIHJldHVybiBlcSgrb2JqZWN0LCArb3RoZXIpO1xuXG4gICAgY2FzZSBlcnJvclRhZzpcbiAgICAgIHJldHVybiBvYmplY3QubmFtZSA9PSBvdGhlci5uYW1lICYmIG9iamVjdC5tZXNzYWdlID09IG90aGVyLm1lc3NhZ2U7XG5cbiAgICBjYXNlIHJlZ2V4cFRhZzpcbiAgICBjYXNlIHN0cmluZ1RhZzpcbiAgICAgIC8vIENvZXJjZSByZWdleGVzIHRvIHN0cmluZ3MgYW5kIHRyZWF0IHN0cmluZ3MsIHByaW1pdGl2ZXMgYW5kIG9iamVjdHMsXG4gICAgICAvLyBhcyBlcXVhbC4gU2VlIGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1yZWdleHAucHJvdG90eXBlLnRvc3RyaW5nXG4gICAgICAvLyBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAgcmV0dXJuIG9iamVjdCA9PSAob3RoZXIgKyAnJyk7XG5cbiAgICBjYXNlIG1hcFRhZzpcbiAgICAgIHZhciBjb252ZXJ0ID0gbWFwVG9BcnJheTtcblxuICAgIGNhc2Ugc2V0VGFnOlxuICAgICAgdmFyIGlzUGFydGlhbCA9IGJpdG1hc2sgJiBDT01QQVJFX1BBUlRJQUxfRkxBRztcbiAgICAgIGNvbnZlcnQgfHwgKGNvbnZlcnQgPSBzZXRUb0FycmF5KTtcblxuICAgICAgaWYgKG9iamVjdC5zaXplICE9IG90aGVyLnNpemUgJiYgIWlzUGFydGlhbCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICAvLyBBc3N1bWUgY3ljbGljIHZhbHVlcyBhcmUgZXF1YWwuXG4gICAgICB2YXIgc3RhY2tlZCA9IHN0YWNrLmdldChvYmplY3QpO1xuICAgICAgaWYgKHN0YWNrZWQpIHtcbiAgICAgICAgcmV0dXJuIHN0YWNrZWQgPT0gb3RoZXI7XG4gICAgICB9XG4gICAgICBiaXRtYXNrIHw9IENPTVBBUkVfVU5PUkRFUkVEX0ZMQUc7XG5cbiAgICAgIC8vIFJlY3Vyc2l2ZWx5IGNvbXBhcmUgb2JqZWN0cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgICAgc3RhY2suc2V0KG9iamVjdCwgb3RoZXIpO1xuICAgICAgdmFyIHJlc3VsdCA9IGVxdWFsQXJyYXlzKGNvbnZlcnQob2JqZWN0KSwgY29udmVydChvdGhlciksIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spO1xuICAgICAgc3RhY2tbJ2RlbGV0ZSddKG9iamVjdCk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuXG4gICAgY2FzZSBzeW1ib2xUYWc6XG4gICAgICBpZiAoc3ltYm9sVmFsdWVPZikge1xuICAgICAgICByZXR1cm4gc3ltYm9sVmFsdWVPZi5jYWxsKG9iamVjdCkgPT0gc3ltYm9sVmFsdWVPZi5jYWxsKG90aGVyKTtcbiAgICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZXF1YWxCeVRhZztcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///385\n")},function(module,exports){eval("/**\n * Converts `map` to its key-value pairs.\n *\n * @private\n * @param {Object} map The map to convert.\n * @returns {Array} Returns the key-value pairs.\n */\nfunction mapToArray(map) {\n var index = -1,\n result = Array(map.size);\n\n map.forEach(function(value, key) {\n result[++index] = [key, value];\n });\n return result;\n}\n\nmodule.exports = mapToArray;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19tYXBUb0FycmF5LmpzP2VkZmEiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsYUFBYSxNQUFNO0FBQ25CO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQSIsImZpbGUiOiIzODYuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvbnZlcnRzIGBtYXBgIHRvIGl0cyBrZXktdmFsdWUgcGFpcnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBtYXAgVGhlIG1hcCB0byBjb252ZXJ0LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBrZXktdmFsdWUgcGFpcnMuXG4gKi9cbmZ1bmN0aW9uIG1hcFRvQXJyYXkobWFwKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgcmVzdWx0ID0gQXJyYXkobWFwLnNpemUpO1xuXG4gIG1hcC5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICByZXN1bHRbKytpbmRleF0gPSBba2V5LCB2YWx1ZV07XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG1hcFRvQXJyYXk7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///386\n")},function(module,exports,__webpack_require__){eval("var getAllKeys = __webpack_require__(197);\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1;\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * A specialized version of `baseIsEqualDeep` for objects with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalObjects(object, other, bitmask, customizer, equalFunc, stack) {\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n objProps = getAllKeys(object),\n objLength = objProps.length,\n othProps = getAllKeys(other),\n othLength = othProps.length;\n\n if (objLength != othLength && !isPartial) {\n return false;\n }\n var index = objLength;\n while (index--) {\n var key = objProps[index];\n if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\n return false;\n }\n }\n // Check that cyclic values are equal.\n var objStacked = stack.get(object);\n var othStacked = stack.get(other);\n if (objStacked && othStacked) {\n return objStacked == other && othStacked == object;\n }\n var result = true;\n stack.set(object, other);\n stack.set(other, object);\n\n var skipCtor = isPartial;\n while (++index < objLength) {\n key = objProps[index];\n var objValue = object[key],\n othValue = other[key];\n\n if (customizer) {\n var compared = isPartial\n ? customizer(othValue, objValue, key, other, object, stack)\n : customizer(objValue, othValue, key, object, other, stack);\n }\n // Recursively compare objects (susceptible to call stack limits).\n if (!(compared === undefined\n ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))\n : compared\n )) {\n result = false;\n break;\n }\n skipCtor || (skipCtor = key == 'constructor');\n }\n if (result && !skipCtor) {\n var objCtor = object.constructor,\n othCtor = other.constructor;\n\n // Non `Object` object instances with different constructors are not equal.\n if (objCtor != othCtor &&\n ('constructor' in object && 'constructor' in other) &&\n !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\n typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n result = false;\n }\n }\n stack['delete'](object);\n stack['delete'](other);\n return result;\n}\n\nmodule.exports = equalObjects;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19lcXVhbE9iamVjdHMuanM/YjFlNSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxpQkFBaUIsbUJBQU8sQ0FBQyxHQUFlOztBQUV4QztBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsV0FBVyxTQUFTO0FBQ3BCLFdBQVcsU0FBUztBQUNwQixXQUFXLE9BQU87QUFDbEIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsImZpbGUiOiIzODcuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgZ2V0QWxsS2V5cyA9IHJlcXVpcmUoJy4vX2dldEFsbEtleXMnKTtcblxuLyoqIFVzZWQgdG8gY29tcG9zZSBiaXRtYXNrcyBmb3IgdmFsdWUgY29tcGFyaXNvbnMuICovXG52YXIgQ09NUEFSRV9QQVJUSUFMX0ZMQUcgPSAxO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUlzRXF1YWxEZWVwYCBmb3Igb2JqZWN0cyB3aXRoIHN1cHBvcnQgZm9yXG4gKiBwYXJ0aWFsIGRlZXAgY29tcGFyaXNvbnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBjb21wYXJlLlxuICogQHBhcmFtIHtPYmplY3R9IG90aGVyIFRoZSBvdGhlciBvYmplY3QgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGJhc2VJc0VxdWFsYCBmb3IgbW9yZSBkZXRhaWxzLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY3VzdG9taXplciBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZXF1YWxGdW5jIFRoZSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgZXF1aXZhbGVudHMgb2YgdmFsdWVzLlxuICogQHBhcmFtIHtPYmplY3R9IHN0YWNrIFRyYWNrcyB0cmF2ZXJzZWQgYG9iamVjdGAgYW5kIGBvdGhlcmAgb2JqZWN0cy5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgb2JqZWN0cyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBlcXVhbE9iamVjdHMob2JqZWN0LCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjaykge1xuICB2YXIgaXNQYXJ0aWFsID0gYml0bWFzayAmIENPTVBBUkVfUEFSVElBTF9GTEFHLFxuICAgICAgb2JqUHJvcHMgPSBnZXRBbGxLZXlzKG9iamVjdCksXG4gICAgICBvYmpMZW5ndGggPSBvYmpQcm9wcy5sZW5ndGgsXG4gICAgICBvdGhQcm9wcyA9IGdldEFsbEtleXMob3RoZXIpLFxuICAgICAgb3RoTGVuZ3RoID0gb3RoUHJvcHMubGVuZ3RoO1xuXG4gIGlmIChvYmpMZW5ndGggIT0gb3RoTGVuZ3RoICYmICFpc1BhcnRpYWwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIGluZGV4ID0gb2JqTGVuZ3RoO1xuICB3aGlsZSAoaW5kZXgtLSkge1xuICAgIHZhciBrZXkgPSBvYmpQcm9wc1tpbmRleF07XG4gICAgaWYgKCEoaXNQYXJ0aWFsID8ga2V5IGluIG90aGVyIDogaGFzT3duUHJvcGVydHkuY2FsbChvdGhlciwga2V5KSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgLy8gQ2hlY2sgdGhhdCBjeWNsaWMgdmFsdWVzIGFyZSBlcXVhbC5cbiAgdmFyIG9ialN0YWNrZWQgPSBzdGFjay5nZXQob2JqZWN0KTtcbiAgdmFyIG90aFN0YWNrZWQgPSBzdGFjay5nZXQob3RoZXIpO1xuICBpZiAob2JqU3RhY2tlZCAmJiBvdGhTdGFja2VkKSB7XG4gICAgcmV0dXJuIG9ialN0YWNrZWQgPT0gb3RoZXIgJiYgb3RoU3RhY2tlZCA9PSBvYmplY3Q7XG4gIH1cbiAgdmFyIHJlc3VsdCA9IHRydWU7XG4gIHN0YWNrLnNldChvYmplY3QsIG90aGVyKTtcbiAgc3RhY2suc2V0KG90aGVyLCBvYmplY3QpO1xuXG4gIHZhciBza2lwQ3RvciA9IGlzUGFydGlhbDtcbiAgd2hpbGUgKCsraW5kZXggPCBvYmpMZW5ndGgpIHtcbiAgICBrZXkgPSBvYmpQcm9wc1tpbmRleF07XG4gICAgdmFyIG9ialZhbHVlID0gb2JqZWN0W2tleV0sXG4gICAgICAgIG90aFZhbHVlID0gb3RoZXJba2V5XTtcblxuICAgIGlmIChjdXN0b21pemVyKSB7XG4gICAgICB2YXIgY29tcGFyZWQgPSBpc1BhcnRpYWxcbiAgICAgICAgPyBjdXN0b21pemVyKG90aFZhbHVlLCBvYmpWYWx1ZSwga2V5LCBvdGhlciwgb2JqZWN0LCBzdGFjaylcbiAgICAgICAgOiBjdXN0b21pemVyKG9ialZhbHVlLCBvdGhWYWx1ZSwga2V5LCBvYmplY3QsIG90aGVyLCBzdGFjayk7XG4gICAgfVxuICAgIC8vIFJlY3Vyc2l2ZWx5IGNvbXBhcmUgb2JqZWN0cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgIGlmICghKGNvbXBhcmVkID09PSB1bmRlZmluZWRcbiAgICAgICAgICA/IChvYmpWYWx1ZSA9PT0gb3RoVmFsdWUgfHwgZXF1YWxGdW5jKG9ialZhbHVlLCBvdGhWYWx1ZSwgYml0bWFzaywgY3VzdG9taXplciwgc3RhY2spKVxuICAgICAgICAgIDogY29tcGFyZWRcbiAgICAgICAgKSkge1xuICAgICAgcmVzdWx0ID0gZmFsc2U7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgc2tpcEN0b3IgfHwgKHNraXBDdG9yID0ga2V5ID09ICdjb25zdHJ1Y3RvcicpO1xuICB9XG4gIGlmIChyZXN1bHQgJiYgIXNraXBDdG9yKSB7XG4gICAgdmFyIG9iakN0b3IgPSBvYmplY3QuY29uc3RydWN0b3IsXG4gICAgICAgIG90aEN0b3IgPSBvdGhlci5jb25zdHJ1Y3RvcjtcblxuICAgIC8vIE5vbiBgT2JqZWN0YCBvYmplY3QgaW5zdGFuY2VzIHdpdGggZGlmZmVyZW50IGNvbnN0cnVjdG9ycyBhcmUgbm90IGVxdWFsLlxuICAgIGlmIChvYmpDdG9yICE9IG90aEN0b3IgJiZcbiAgICAgICAgKCdjb25zdHJ1Y3RvcicgaW4gb2JqZWN0ICYmICdjb25zdHJ1Y3RvcicgaW4gb3RoZXIpICYmXG4gICAgICAgICEodHlwZW9mIG9iakN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBvYmpDdG9yIGluc3RhbmNlb2Ygb2JqQ3RvciAmJlxuICAgICAgICAgIHR5cGVvZiBvdGhDdG9yID09ICdmdW5jdGlvbicgJiYgb3RoQ3RvciBpbnN0YW5jZW9mIG90aEN0b3IpKSB7XG4gICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICB9XG4gIH1cbiAgc3RhY2tbJ2RlbGV0ZSddKG9iamVjdCk7XG4gIHN0YWNrWydkZWxldGUnXShvdGhlcik7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZXF1YWxPYmplY3RzO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///387\n")},function(module,exports,__webpack_require__){eval("var isStrictComparable = __webpack_require__(212),\n keys = __webpack_require__(59);\n\n/**\n * Gets the property names, values, and compare flags of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the match data of `object`.\n */\nfunction getMatchData(object) {\n var result = keys(object),\n length = result.length;\n\n while (length--) {\n var key = result[length],\n value = object[key];\n\n result[length] = [key, value, isStrictComparable(value)];\n }\n return result;\n}\n\nmodule.exports = getMatchData;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19nZXRNYXRjaERhdGEuanM/M2JiNCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx5QkFBeUIsbUJBQU8sQ0FBQyxHQUF1QjtBQUN4RCxXQUFXLG1CQUFPLENBQUMsRUFBUTs7QUFFM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsYUFBYSxNQUFNO0FBQ25CO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsImZpbGUiOiIzODguanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgaXNTdHJpY3RDb21wYXJhYmxlID0gcmVxdWlyZSgnLi9faXNTdHJpY3RDb21wYXJhYmxlJyksXG4gICAga2V5cyA9IHJlcXVpcmUoJy4va2V5cycpO1xuXG4vKipcbiAqIEdldHMgdGhlIHByb3BlcnR5IG5hbWVzLCB2YWx1ZXMsIGFuZCBjb21wYXJlIGZsYWdzIG9mIGBvYmplY3RgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG1hdGNoIGRhdGEgb2YgYG9iamVjdGAuXG4gKi9cbmZ1bmN0aW9uIGdldE1hdGNoRGF0YShvYmplY3QpIHtcbiAgdmFyIHJlc3VsdCA9IGtleXMob2JqZWN0KSxcbiAgICAgIGxlbmd0aCA9IHJlc3VsdC5sZW5ndGg7XG5cbiAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgdmFyIGtleSA9IHJlc3VsdFtsZW5ndGhdLFxuICAgICAgICB2YWx1ZSA9IG9iamVjdFtrZXldO1xuXG4gICAgcmVzdWx0W2xlbmd0aF0gPSBba2V5LCB2YWx1ZSwgaXNTdHJpY3RDb21wYXJhYmxlKHZhbHVlKV07XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBnZXRNYXRjaERhdGE7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///388\n")},function(module,exports,__webpack_require__){eval("var baseIsEqual = __webpack_require__(208),\n get = __webpack_require__(390),\n hasIn = __webpack_require__(215),\n isKey = __webpack_require__(167),\n isStrictComparable = __webpack_require__(212),\n matchesStrictComparable = __webpack_require__(213),\n toKey = __webpack_require__(90);\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.\n *\n * @private\n * @param {string} path The path of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction baseMatchesProperty(path, srcValue) {\n if (isKey(path) && isStrictComparable(srcValue)) {\n return matchesStrictComparable(toKey(path), srcValue);\n }\n return function(object) {\n var objValue = get(object, path);\n return (objValue === undefined && objValue === srcValue)\n ? hasIn(object, path)\n : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);\n };\n}\n\nmodule.exports = baseMatchesProperty;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlTWF0Y2hlc1Byb3BlcnR5LmpzPzE4MzgiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsa0JBQWtCLG1CQUFPLENBQUMsR0FBZ0I7QUFDMUMsVUFBVSxtQkFBTyxDQUFDLEdBQU87QUFDekIsWUFBWSxtQkFBTyxDQUFDLEdBQVM7QUFDN0IsWUFBWSxtQkFBTyxDQUFDLEdBQVU7QUFDOUIseUJBQXlCLG1CQUFPLENBQUMsR0FBdUI7QUFDeEQsOEJBQThCLG1CQUFPLENBQUMsR0FBNEI7QUFDbEUsWUFBWSxtQkFBTyxDQUFDLEVBQVU7O0FBRTlCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixXQUFXLEVBQUU7QUFDYixhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwiZmlsZSI6IjM4OS5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBiYXNlSXNFcXVhbCA9IHJlcXVpcmUoJy4vX2Jhc2VJc0VxdWFsJyksXG4gICAgZ2V0ID0gcmVxdWlyZSgnLi9nZXQnKSxcbiAgICBoYXNJbiA9IHJlcXVpcmUoJy4vaGFzSW4nKSxcbiAgICBpc0tleSA9IHJlcXVpcmUoJy4vX2lzS2V5JyksXG4gICAgaXNTdHJpY3RDb21wYXJhYmxlID0gcmVxdWlyZSgnLi9faXNTdHJpY3RDb21wYXJhYmxlJyksXG4gICAgbWF0Y2hlc1N0cmljdENvbXBhcmFibGUgPSByZXF1aXJlKCcuL19tYXRjaGVzU3RyaWN0Q29tcGFyYWJsZScpLFxuICAgIHRvS2V5ID0gcmVxdWlyZSgnLi9fdG9LZXknKTtcblxuLyoqIFVzZWQgdG8gY29tcG9zZSBiaXRtYXNrcyBmb3IgdmFsdWUgY29tcGFyaXNvbnMuICovXG52YXIgQ09NUEFSRV9QQVJUSUFMX0ZMQUcgPSAxLFxuICAgIENPTVBBUkVfVU5PUkRFUkVEX0ZMQUcgPSAyO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLm1hdGNoZXNQcm9wZXJ0eWAgd2hpY2ggZG9lc24ndCBjbG9uZSBgc3JjVmFsdWVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICogQHBhcmFtIHsqfSBzcmNWYWx1ZSBUaGUgdmFsdWUgdG8gbWF0Y2guXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBzcGVjIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBiYXNlTWF0Y2hlc1Byb3BlcnR5KHBhdGgsIHNyY1ZhbHVlKSB7XG4gIGlmIChpc0tleShwYXRoKSAmJiBpc1N0cmljdENvbXBhcmFibGUoc3JjVmFsdWUpKSB7XG4gICAgcmV0dXJuIG1hdGNoZXNTdHJpY3RDb21wYXJhYmxlKHRvS2V5KHBhdGgpLCBzcmNWYWx1ZSk7XG4gIH1cbiAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCkge1xuICAgIHZhciBvYmpWYWx1ZSA9IGdldChvYmplY3QsIHBhdGgpO1xuICAgIHJldHVybiAob2JqVmFsdWUgPT09IHVuZGVmaW5lZCAmJiBvYmpWYWx1ZSA9PT0gc3JjVmFsdWUpXG4gICAgICA/IGhhc0luKG9iamVjdCwgcGF0aClcbiAgICAgIDogYmFzZUlzRXF1YWwoc3JjVmFsdWUsIG9ialZhbHVlLCBDT01QQVJFX1BBUlRJQUxfRkxBRyB8IENPTVBBUkVfVU5PUkRFUkVEX0ZMQUcpO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VNYXRjaGVzUHJvcGVydHk7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///389\n")},function(module,exports,__webpack_require__){eval("var baseGet = __webpack_require__(111);\n\n/**\n * Gets the value at `path` of `object`. If the resolved value is\n * `undefined`, the `defaultValue` is returned in its place.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.get(object, 'a[0].b.c');\n * // => 3\n *\n * _.get(object, ['a', '0', 'b', 'c']);\n * // => 3\n *\n * _.get(object, 'a.b.c', 'default');\n * // => 'default'\n */\nfunction get(object, path, defaultValue) {\n var result = object == null ? undefined : baseGet(object, path);\n return result === undefined ? defaultValue : result;\n}\n\nmodule.exports = get;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL2dldC5qcz85YjAyIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsbUJBQU8sQ0FBQyxHQUFZOztBQUVsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsYUFBYTtBQUN4QixXQUFXLEVBQUU7QUFDYixhQUFhLEVBQUU7QUFDZjtBQUNBO0FBQ0EsaUJBQWlCLFFBQVEsT0FBTyxTQUFTLEVBQUU7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsImZpbGUiOiIzOTAuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYmFzZUdldCA9IHJlcXVpcmUoJy4vX2Jhc2VHZXQnKTtcblxuLyoqXG4gKiBHZXRzIHRoZSB2YWx1ZSBhdCBgcGF0aGAgb2YgYG9iamVjdGAuIElmIHRoZSByZXNvbHZlZCB2YWx1ZSBpc1xuICogYHVuZGVmaW5lZGAsIHRoZSBgZGVmYXVsdFZhbHVlYCBpcyByZXR1cm5lZCBpbiBpdHMgcGxhY2UuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAzLjcuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAqIEBwYXJhbSB7Kn0gW2RlZmF1bHRWYWx1ZV0gVGhlIHZhbHVlIHJldHVybmVkIGZvciBgdW5kZWZpbmVkYCByZXNvbHZlZCB2YWx1ZXMuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzb2x2ZWQgdmFsdWUuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3QgPSB7ICdhJzogW3sgJ2InOiB7ICdjJzogMyB9IH1dIH07XG4gKlxuICogXy5nZXQob2JqZWN0LCAnYVswXS5iLmMnKTtcbiAqIC8vID0+IDNcbiAqXG4gKiBfLmdldChvYmplY3QsIFsnYScsICcwJywgJ2InLCAnYyddKTtcbiAqIC8vID0+IDNcbiAqXG4gKiBfLmdldChvYmplY3QsICdhLmIuYycsICdkZWZhdWx0Jyk7XG4gKiAvLyA9PiAnZGVmYXVsdCdcbiAqL1xuZnVuY3Rpb24gZ2V0KG9iamVjdCwgcGF0aCwgZGVmYXVsdFZhbHVlKSB7XG4gIHZhciByZXN1bHQgPSBvYmplY3QgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IGJhc2VHZXQob2JqZWN0LCBwYXRoKTtcbiAgcmV0dXJuIHJlc3VsdCA9PT0gdW5kZWZpbmVkID8gZGVmYXVsdFZhbHVlIDogcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldDtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///390\n")},function(module,exports,__webpack_require__){eval("var memoizeCapped = __webpack_require__(392);\n\n/** Used to match property names within property paths. */\nvar rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n/** Used to match backslashes in property paths. */\nvar reEscapeChar = /\\\\(\\\\)?/g;\n\n/**\n * Converts `string` to a property path array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the property path array.\n */\nvar stringToPath = memoizeCapped(function(string) {\n var result = [];\n if (string.charCodeAt(0) === 46 /* . */) {\n result.push('');\n }\n string.replace(rePropName, function(match, number, quote, subString) {\n result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));\n });\n return result;\n});\n\nmodule.exports = stringToPath;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19zdHJpbmdUb1BhdGguanM/MThkOCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxvQkFBb0IsbUJBQU8sQ0FBQyxHQUFrQjs7QUFFOUM7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsTUFBTTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsQ0FBQzs7QUFFRCIsImZpbGUiOiIzOTEuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgbWVtb2l6ZUNhcHBlZCA9IHJlcXVpcmUoJy4vX21lbW9pemVDYXBwZWQnKTtcblxuLyoqIFVzZWQgdG8gbWF0Y2ggcHJvcGVydHkgbmFtZXMgd2l0aGluIHByb3BlcnR5IHBhdGhzLiAqL1xudmFyIHJlUHJvcE5hbWUgPSAvW14uW1xcXV0rfFxcWyg/OigtP1xcZCsoPzpcXC5cXGQrKT8pfChbXCInXSkoKD86KD8hXFwyKVteXFxcXF18XFxcXC4pKj8pXFwyKVxcXXwoPz0oPzpcXC58XFxbXFxdKSg/OlxcLnxcXFtcXF18JCkpL2c7XG5cbi8qKiBVc2VkIHRvIG1hdGNoIGJhY2tzbGFzaGVzIGluIHByb3BlcnR5IHBhdGhzLiAqL1xudmFyIHJlRXNjYXBlQ2hhciA9IC9cXFxcKFxcXFwpPy9nO1xuXG4vKipcbiAqIENvbnZlcnRzIGBzdHJpbmdgIHRvIGEgcHJvcGVydHkgcGF0aCBhcnJheS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHByb3BlcnR5IHBhdGggYXJyYXkuXG4gKi9cbnZhciBzdHJpbmdUb1BhdGggPSBtZW1vaXplQ2FwcGVkKGZ1bmN0aW9uKHN0cmluZykge1xuICB2YXIgcmVzdWx0ID0gW107XG4gIGlmIChzdHJpbmcuY2hhckNvZGVBdCgwKSA9PT0gNDYgLyogLiAqLykge1xuICAgIHJlc3VsdC5wdXNoKCcnKTtcbiAgfVxuICBzdHJpbmcucmVwbGFjZShyZVByb3BOYW1lLCBmdW5jdGlvbihtYXRjaCwgbnVtYmVyLCBxdW90ZSwgc3ViU3RyaW5nKSB7XG4gICAgcmVzdWx0LnB1c2gocXVvdGUgPyBzdWJTdHJpbmcucmVwbGFjZShyZUVzY2FwZUNoYXIsICckMScpIDogKG51bWJlciB8fCBtYXRjaCkpO1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHN0cmluZ1RvUGF0aDtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///391\n")},function(module,exports,__webpack_require__){eval("var memoize = __webpack_require__(393);\n\n/** Used as the maximum memoize cache size. */\nvar MAX_MEMOIZE_SIZE = 500;\n\n/**\n * A specialized version of `_.memoize` which clears the memoized function's\n * cache when it exceeds `MAX_MEMOIZE_SIZE`.\n *\n * @private\n * @param {Function} func The function to have its output memoized.\n * @returns {Function} Returns the new memoized function.\n */\nfunction memoizeCapped(func) {\n var result = memoize(func, function(key) {\n if (cache.size === MAX_MEMOIZE_SIZE) {\n cache.clear();\n }\n return key;\n });\n\n var cache = result.cache;\n return result;\n}\n\nmodule.exports = memoizeCapped;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19tZW1vaXplQ2FwcGVkLmpzPzIzNGQiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxtQkFBTyxDQUFDLEdBQVc7O0FBRWpDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsU0FBUztBQUNwQixhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTs7QUFFQSIsImZpbGUiOiIzOTIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgbWVtb2l6ZSA9IHJlcXVpcmUoJy4vbWVtb2l6ZScpO1xuXG4vKiogVXNlZCBhcyB0aGUgbWF4aW11bSBtZW1vaXplIGNhY2hlIHNpemUuICovXG52YXIgTUFYX01FTU9JWkVfU0laRSA9IDUwMDtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8ubWVtb2l6ZWAgd2hpY2ggY2xlYXJzIHRoZSBtZW1vaXplZCBmdW5jdGlvbidzXG4gKiBjYWNoZSB3aGVuIGl0IGV4Y2VlZHMgYE1BWF9NRU1PSVpFX1NJWkVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBoYXZlIGl0cyBvdXRwdXQgbWVtb2l6ZWQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBtZW1vaXplZCBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gbWVtb2l6ZUNhcHBlZChmdW5jKSB7XG4gIHZhciByZXN1bHQgPSBtZW1vaXplKGZ1bmMsIGZ1bmN0aW9uKGtleSkge1xuICAgIGlmIChjYWNoZS5zaXplID09PSBNQVhfTUVNT0laRV9TSVpFKSB7XG4gICAgICBjYWNoZS5jbGVhcigpO1xuICAgIH1cbiAgICByZXR1cm4ga2V5O1xuICB9KTtcblxuICB2YXIgY2FjaGUgPSByZXN1bHQuY2FjaGU7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWVtb2l6ZUNhcHBlZDtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///392\n")},function(module,exports,__webpack_require__){eval("var MapCache = __webpack_require__(154);\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a function that memoizes the result of `func`. If `resolver` is\n * provided, it determines the cache key for storing the result based on the\n * arguments provided to the memoized function. By default, the first argument\n * provided to the memoized function is used as the map cache key. The `func`\n * is invoked with the `this` binding of the memoized function.\n *\n * **Note:** The cache is exposed as the `cache` property on the memoized\n * function. Its creation may be customized by replacing the `_.memoize.Cache`\n * constructor with one whose instances implement the\n * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n * method interface of `clear`, `delete`, `get`, `has`, and `set`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to have its output memoized.\n * @param {Function} [resolver] The function to resolve the cache key.\n * @returns {Function} Returns the new memoized function.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n * var other = { 'c': 3, 'd': 4 };\n *\n * var values = _.memoize(_.values);\n * values(object);\n * // => [1, 2]\n *\n * values(other);\n * // => [3, 4]\n *\n * object.a = 2;\n * values(object);\n * // => [1, 2]\n *\n * // Modify the result cache.\n * values.cache.set(object, ['a', 'b']);\n * values(object);\n * // => ['a', 'b']\n *\n * // Replace `_.memoize.Cache`.\n * _.memoize.Cache = WeakMap;\n */\nfunction memoize(func, resolver) {\n if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n var memoized = function() {\n var args = arguments,\n key = resolver ? resolver.apply(this, args) : args[0],\n cache = memoized.cache;\n\n if (cache.has(key)) {\n return cache.get(key);\n }\n var result = func.apply(this, args);\n memoized.cache = cache.set(key, result) || cache;\n return result;\n };\n memoized.cache = new (memoize.Cache || MapCache);\n return memoized;\n}\n\n// Expose `MapCache`.\nmemoize.Cache = MapCache;\n\nmodule.exports = memoize;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL21lbW9pemUuanM/ZTM4MCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxlQUFlLG1CQUFPLENBQUMsR0FBYTs7QUFFcEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxTQUFTO0FBQ3BCLFdBQVcsU0FBUztBQUNwQixhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQixnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSIsImZpbGUiOiIzOTMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgTWFwQ2FjaGUgPSByZXF1aXJlKCcuL19NYXBDYWNoZScpO1xuXG4vKiogRXJyb3IgbWVzc2FnZSBjb25zdGFudHMuICovXG52YXIgRlVOQ19FUlJPUl9URVhUID0gJ0V4cGVjdGVkIGEgZnVuY3Rpb24nO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IG1lbW9pemVzIHRoZSByZXN1bHQgb2YgYGZ1bmNgLiBJZiBgcmVzb2x2ZXJgIGlzXG4gKiBwcm92aWRlZCwgaXQgZGV0ZXJtaW5lcyB0aGUgY2FjaGUga2V5IGZvciBzdG9yaW5nIHRoZSByZXN1bHQgYmFzZWQgb24gdGhlXG4gKiBhcmd1bWVudHMgcHJvdmlkZWQgdG8gdGhlIG1lbW9pemVkIGZ1bmN0aW9uLiBCeSBkZWZhdWx0LCB0aGUgZmlyc3QgYXJndW1lbnRcbiAqIHByb3ZpZGVkIHRvIHRoZSBtZW1vaXplZCBmdW5jdGlvbiBpcyB1c2VkIGFzIHRoZSBtYXAgY2FjaGUga2V5LiBUaGUgYGZ1bmNgXG4gKiBpcyBpbnZva2VkIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIG9mIHRoZSBtZW1vaXplZCBmdW5jdGlvbi5cbiAqXG4gKiAqKk5vdGU6KiogVGhlIGNhY2hlIGlzIGV4cG9zZWQgYXMgdGhlIGBjYWNoZWAgcHJvcGVydHkgb24gdGhlIG1lbW9pemVkXG4gKiBmdW5jdGlvbi4gSXRzIGNyZWF0aW9uIG1heSBiZSBjdXN0b21pemVkIGJ5IHJlcGxhY2luZyB0aGUgYF8ubWVtb2l6ZS5DYWNoZWBcbiAqIGNvbnN0cnVjdG9yIHdpdGggb25lIHdob3NlIGluc3RhbmNlcyBpbXBsZW1lbnQgdGhlXG4gKiBbYE1hcGBdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXByb3BlcnRpZXMtb2YtdGhlLW1hcC1wcm90b3R5cGUtb2JqZWN0KVxuICogbWV0aG9kIGludGVyZmFjZSBvZiBgY2xlYXJgLCBgZGVsZXRlYCwgYGdldGAsIGBoYXNgLCBhbmQgYHNldGAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBoYXZlIGl0cyBvdXRwdXQgbWVtb2l6ZWQuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcmVzb2x2ZXJdIFRoZSBmdW5jdGlvbiB0byByZXNvbHZlIHRoZSBjYWNoZSBrZXkuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBtZW1vaXplZCBmdW5jdGlvbi5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxLCAnYic6IDIgfTtcbiAqIHZhciBvdGhlciA9IHsgJ2MnOiAzLCAnZCc6IDQgfTtcbiAqXG4gKiB2YXIgdmFsdWVzID0gXy5tZW1vaXplKF8udmFsdWVzKTtcbiAqIHZhbHVlcyhvYmplY3QpO1xuICogLy8gPT4gWzEsIDJdXG4gKlxuICogdmFsdWVzKG90aGVyKTtcbiAqIC8vID0+IFszLCA0XVxuICpcbiAqIG9iamVjdC5hID0gMjtcbiAqIHZhbHVlcyhvYmplY3QpO1xuICogLy8gPT4gWzEsIDJdXG4gKlxuICogLy8gTW9kaWZ5IHRoZSByZXN1bHQgY2FjaGUuXG4gKiB2YWx1ZXMuY2FjaGUuc2V0KG9iamVjdCwgWydhJywgJ2InXSk7XG4gKiB2YWx1ZXMob2JqZWN0KTtcbiAqIC8vID0+IFsnYScsICdiJ11cbiAqXG4gKiAvLyBSZXBsYWNlIGBfLm1lbW9pemUuQ2FjaGVgLlxuICogXy5tZW1vaXplLkNhY2hlID0gV2Vha01hcDtcbiAqL1xuZnVuY3Rpb24gbWVtb2l6ZShmdW5jLCByZXNvbHZlcikge1xuICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJyB8fCAocmVzb2x2ZXIgIT0gbnVsbCAmJiB0eXBlb2YgcmVzb2x2ZXIgIT0gJ2Z1bmN0aW9uJykpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gIH1cbiAgdmFyIG1lbW9pemVkID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGFyZ3MgPSBhcmd1bWVudHMsXG4gICAgICAgIGtleSA9IHJlc29sdmVyID8gcmVzb2x2ZXIuYXBwbHkodGhpcywgYXJncykgOiBhcmdzWzBdLFxuICAgICAgICBjYWNoZSA9IG1lbW9pemVkLmNhY2hlO1xuXG4gICAgaWYgKGNhY2hlLmhhcyhrZXkpKSB7XG4gICAgICByZXR1cm4gY2FjaGUuZ2V0KGtleSk7XG4gICAgfVxuICAgIHZhciByZXN1bHQgPSBmdW5jLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIG1lbW9pemVkLmNhY2hlID0gY2FjaGUuc2V0KGtleSwgcmVzdWx0KSB8fCBjYWNoZTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuICBtZW1vaXplZC5jYWNoZSA9IG5ldyAobWVtb2l6ZS5DYWNoZSB8fCBNYXBDYWNoZSk7XG4gIHJldHVybiBtZW1vaXplZDtcbn1cblxuLy8gRXhwb3NlIGBNYXBDYWNoZWAuXG5tZW1vaXplLkNhY2hlID0gTWFwQ2FjaGU7XG5cbm1vZHVsZS5leHBvcnRzID0gbWVtb2l6ZTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///393\n")},function(module,exports,__webpack_require__){eval("var Symbol = __webpack_require__(73),\n arrayMap = __webpack_require__(113),\n isArray = __webpack_require__(31),\n isSymbol = __webpack_require__(76);\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n/**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\nfunction baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value;\n }\n if (isArray(value)) {\n // Recursively convert values (susceptible to call stack limits).\n return arrayMap(value, baseToString) + '';\n }\n if (isSymbol(value)) {\n return symbolToString ? symbolToString.call(value) : '';\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = baseToString;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlVG9TdHJpbmcuanM/Y2U4NiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxhQUFhLG1CQUFPLENBQUMsRUFBVztBQUNoQyxlQUFlLG1CQUFPLENBQUMsR0FBYTtBQUNwQyxjQUFjLG1CQUFPLENBQUMsRUFBVztBQUNqQyxlQUFlLG1CQUFPLENBQUMsRUFBWTs7QUFFbkM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsRUFBRTtBQUNiLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsImZpbGUiOiIzOTQuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgU3ltYm9sID0gcmVxdWlyZSgnLi9fU3ltYm9sJyksXG4gICAgYXJyYXlNYXAgPSByZXF1aXJlKCcuL19hcnJheU1hcCcpLFxuICAgIGlzQXJyYXkgPSByZXF1aXJlKCcuL2lzQXJyYXknKSxcbiAgICBpc1N5bWJvbCA9IHJlcXVpcmUoJy4vaXNTeW1ib2wnKTtcblxuLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgSU5GSU5JVFkgPSAxIC8gMDtcblxuLyoqIFVzZWQgdG8gY29udmVydCBzeW1ib2xzIHRvIHByaW1pdGl2ZXMgYW5kIHN0cmluZ3MuICovXG52YXIgc3ltYm9sUHJvdG8gPSBTeW1ib2wgPyBTeW1ib2wucHJvdG90eXBlIDogdW5kZWZpbmVkLFxuICAgIHN5bWJvbFRvU3RyaW5nID0gc3ltYm9sUHJvdG8gPyBzeW1ib2xQcm90by50b1N0cmluZyA6IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy50b1N0cmluZ2Agd2hpY2ggZG9lc24ndCBjb252ZXJ0IG51bGxpc2hcbiAqIHZhbHVlcyB0byBlbXB0eSBzdHJpbmdzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBwcm9jZXNzLlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgc3RyaW5nLlxuICovXG5mdW5jdGlvbiBiYXNlVG9TdHJpbmcodmFsdWUpIHtcbiAgLy8gRXhpdCBlYXJseSBmb3Igc3RyaW5ncyB0byBhdm9pZCBhIHBlcmZvcm1hbmNlIGhpdCBpbiBzb21lIGVudmlyb25tZW50cy5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAvLyBSZWN1cnNpdmVseSBjb252ZXJ0IHZhbHVlcyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgIHJldHVybiBhcnJheU1hcCh2YWx1ZSwgYmFzZVRvU3RyaW5nKSArICcnO1xuICB9XG4gIGlmIChpc1N5bWJvbCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gc3ltYm9sVG9TdHJpbmcgPyBzeW1ib2xUb1N0cmluZy5jYWxsKHZhbHVlKSA6ICcnO1xuICB9XG4gIHZhciByZXN1bHQgPSAodmFsdWUgKyAnJyk7XG4gIHJldHVybiAocmVzdWx0ID09ICcwJyAmJiAoMSAvIHZhbHVlKSA9PSAtSU5GSU5JVFkpID8gJy0wJyA6IHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlVG9TdHJpbmc7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///394\n")},function(module,exports){eval("/**\n * The base implementation of `_.hasIn` without support for deep paths.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\n */\nfunction baseHasIn(object, key) {\n return object != null && key in Object(object);\n}\n\nmodule.exports = baseHasIn;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlSGFzSW4uanM/MjZlOCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixXQUFXLGFBQWE7QUFDeEIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwiZmlsZSI6IjM5NS5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaGFzSW5gIHdpdGhvdXQgc3VwcG9ydCBmb3IgZGVlcCBwYXRocy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge0FycmF5fHN0cmluZ30ga2V5IFRoZSBrZXkgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VIYXNJbihvYmplY3QsIGtleSkge1xuICByZXR1cm4gb2JqZWN0ICE9IG51bGwgJiYga2V5IGluIE9iamVjdChvYmplY3QpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VIYXNJbjtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///395\n")},function(module,exports,__webpack_require__){eval("var baseProperty = __webpack_require__(217),\n basePropertyDeep = __webpack_require__(397),\n isKey = __webpack_require__(167),\n toKey = __webpack_require__(90);\n\n/**\n * Creates a function that returns the value at `path` of a given object.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n * @example\n *\n * var objects = [\n * { 'a': { 'b': 2 } },\n * { 'a': { 'b': 1 } }\n * ];\n *\n * _.map(objects, _.property('a.b'));\n * // => [2, 1]\n *\n * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');\n * // => [1, 2]\n */\nfunction property(path) {\n return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);\n}\n\nmodule.exports = property;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL3Byb3BlcnR5LmpzP2Y5Y2UiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsbUJBQW1CLG1CQUFPLENBQUMsR0FBaUI7QUFDNUMsdUJBQXVCLG1CQUFPLENBQUMsR0FBcUI7QUFDcEQsWUFBWSxtQkFBTyxDQUFDLEdBQVU7QUFDOUIsWUFBWSxtQkFBTyxDQUFDLEVBQVU7O0FBRTlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxhQUFhO0FBQ3hCLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQSxNQUFNLE9BQU8sU0FBUyxFQUFFO0FBQ3hCLE1BQU0sT0FBTyxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJmaWxlIjoiMzk2LmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIGJhc2VQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vX2Jhc2VQcm9wZXJ0eScpLFxuICAgIGJhc2VQcm9wZXJ0eURlZXAgPSByZXF1aXJlKCcuL19iYXNlUHJvcGVydHlEZWVwJyksXG4gICAgaXNLZXkgPSByZXF1aXJlKCcuL19pc0tleScpLFxuICAgIHRvS2V5ID0gcmVxdWlyZSgnLi9fdG9LZXknKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSB2YWx1ZSBhdCBgcGF0aGAgb2YgYSBnaXZlbiBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAyLjQuMFxuICogQGNhdGVnb3J5IFV0aWxcbiAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBhY2Nlc3NvciBmdW5jdGlvbi5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdHMgPSBbXG4gKiAgIHsgJ2EnOiB7ICdiJzogMiB9IH0sXG4gKiAgIHsgJ2EnOiB7ICdiJzogMSB9IH1cbiAqIF07XG4gKlxuICogXy5tYXAob2JqZWN0cywgXy5wcm9wZXJ0eSgnYS5iJykpO1xuICogLy8gPT4gWzIsIDFdXG4gKlxuICogXy5tYXAoXy5zb3J0Qnkob2JqZWN0cywgXy5wcm9wZXJ0eShbJ2EnLCAnYiddKSksICdhLmInKTtcbiAqIC8vID0+IFsxLCAyXVxuICovXG5mdW5jdGlvbiBwcm9wZXJ0eShwYXRoKSB7XG4gIHJldHVybiBpc0tleShwYXRoKSA/IGJhc2VQcm9wZXJ0eSh0b0tleShwYXRoKSkgOiBiYXNlUHJvcGVydHlEZWVwKHBhdGgpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHByb3BlcnR5O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///396\n")},function(module,exports,__webpack_require__){eval("var baseGet = __webpack_require__(111);\n\n/**\n * A specialized version of `baseProperty` which supports deep paths.\n *\n * @private\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction basePropertyDeep(path) {\n return function(object) {\n return baseGet(object, path);\n };\n}\n\nmodule.exports = basePropertyDeep;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlUHJvcGVydHlEZWVwLmpzP2UzZjgiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxtQkFBTyxDQUFDLEdBQVk7O0FBRWxDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxhQUFhO0FBQ3hCLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJmaWxlIjoiMzk3LmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIGJhc2VHZXQgPSByZXF1aXJlKCcuL19iYXNlR2V0Jyk7XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlUHJvcGVydHlgIHdoaWNoIHN1cHBvcnRzIGRlZXAgcGF0aHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBhY2Nlc3NvciBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gYmFzZVByb3BlcnR5RGVlcChwYXRoKSB7XG4gIHJldHVybiBmdW5jdGlvbihvYmplY3QpIHtcbiAgICByZXR1cm4gYmFzZUdldChvYmplY3QsIHBhdGgpO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VQcm9wZXJ0eURlZXA7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///397\n")},function(module,exports){eval("/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.has` without support for deep paths.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\n */\nfunction baseHas(object, key) {\n return object != null && hasOwnProperty.call(object, key);\n}\n\nmodule.exports = baseHas;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlSGFzLmpzPzk2ZjMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsYUFBYTtBQUN4QixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJmaWxlIjoiMzk4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5oYXNgIHdpdGhvdXQgc3VwcG9ydCBmb3IgZGVlcCBwYXRocy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge0FycmF5fHN0cmluZ30ga2V5IFRoZSBrZXkgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VIYXMob2JqZWN0LCBrZXkpIHtcbiAgcmV0dXJuIG9iamVjdCAhPSBudWxsICYmIGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VIYXM7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///398\n")},function(module,exports,__webpack_require__){eval("var baseKeys = __webpack_require__(159),\n getTag = __webpack_require__(75),\n isArguments = __webpack_require__(88),\n isArray = __webpack_require__(31),\n isArrayLike = __webpack_require__(54),\n isBuffer = __webpack_require__(74),\n isPrototype = __webpack_require__(108),\n isTypedArray = __webpack_require__(89);\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]',\n setTag = '[object Set]';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Checks if `value` is an empty object, collection, map, or set.\n *\n * Objects are considered empty if they have no own enumerable string keyed\n * properties.\n *\n * Array-like values such as `arguments` objects, arrays, buffers, strings, or\n * jQuery-like collections are considered empty if they have a `length` of `0`.\n * Similarly, maps and sets are considered empty if they have a `size` of `0`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is empty, else `false`.\n * @example\n *\n * _.isEmpty(null);\n * // => true\n *\n * _.isEmpty(true);\n * // => true\n *\n * _.isEmpty(1);\n * // => true\n *\n * _.isEmpty([1, 2, 3]);\n * // => false\n *\n * _.isEmpty({ 'a': 1 });\n * // => false\n */\nfunction isEmpty(value) {\n if (value == null) {\n return true;\n }\n if (isArrayLike(value) &&\n (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' ||\n isBuffer(value) || isTypedArray(value) || isArguments(value))) {\n return !value.length;\n }\n var tag = getTag(value);\n if (tag == mapTag || tag == setTag) {\n return !value.size;\n }\n if (isPrototype(value)) {\n return !baseKeys(value).length;\n }\n for (var key in value) {\n if (hasOwnProperty.call(value, key)) {\n return false;\n }\n }\n return true;\n}\n\nmodule.exports = isEmpty;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzRW1wdHkuanM/MTNlYSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxlQUFlLG1CQUFPLENBQUMsR0FBYTtBQUNwQyxhQUFhLG1CQUFPLENBQUMsRUFBVztBQUNoQyxrQkFBa0IsbUJBQU8sQ0FBQyxFQUFlO0FBQ3pDLGNBQWMsbUJBQU8sQ0FBQyxFQUFXO0FBQ2pDLGtCQUFrQixtQkFBTyxDQUFDLEVBQWU7QUFDekMsZUFBZSxtQkFBTyxDQUFDLEVBQVk7QUFDbkMsa0JBQWtCLG1CQUFPLENBQUMsR0FBZ0I7QUFDMUMsbUJBQW1CLG1CQUFPLENBQUMsRUFBZ0I7O0FBRTNDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsRUFBRTtBQUNiLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxTQUFTO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwiZmlsZSI6IjM5OS5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBiYXNlS2V5cyA9IHJlcXVpcmUoJy4vX2Jhc2VLZXlzJyksXG4gICAgZ2V0VGFnID0gcmVxdWlyZSgnLi9fZ2V0VGFnJyksXG4gICAgaXNBcmd1bWVudHMgPSByZXF1aXJlKCcuL2lzQXJndW1lbnRzJyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpLFxuICAgIGlzQXJyYXlMaWtlID0gcmVxdWlyZSgnLi9pc0FycmF5TGlrZScpLFxuICAgIGlzQnVmZmVyID0gcmVxdWlyZSgnLi9pc0J1ZmZlcicpLFxuICAgIGlzUHJvdG90eXBlID0gcmVxdWlyZSgnLi9faXNQcm90b3R5cGUnKSxcbiAgICBpc1R5cGVkQXJyYXkgPSByZXF1aXJlKCcuL2lzVHlwZWRBcnJheScpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgbWFwVGFnID0gJ1tvYmplY3QgTWFwXScsXG4gICAgc2V0VGFnID0gJ1tvYmplY3QgU2V0XSc7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYW4gZW1wdHkgb2JqZWN0LCBjb2xsZWN0aW9uLCBtYXAsIG9yIHNldC5cbiAqXG4gKiBPYmplY3RzIGFyZSBjb25zaWRlcmVkIGVtcHR5IGlmIHRoZXkgaGF2ZSBubyBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWRcbiAqIHByb3BlcnRpZXMuXG4gKlxuICogQXJyYXktbGlrZSB2YWx1ZXMgc3VjaCBhcyBgYXJndW1lbnRzYCBvYmplY3RzLCBhcnJheXMsIGJ1ZmZlcnMsIHN0cmluZ3MsIG9yXG4gKiBqUXVlcnktbGlrZSBjb2xsZWN0aW9ucyBhcmUgY29uc2lkZXJlZCBlbXB0eSBpZiB0aGV5IGhhdmUgYSBgbGVuZ3RoYCBvZiBgMGAuXG4gKiBTaW1pbGFybHksIG1hcHMgYW5kIHNldHMgYXJlIGNvbnNpZGVyZWQgZW1wdHkgaWYgdGhleSBoYXZlIGEgYHNpemVgIG9mIGAwYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBlbXB0eSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzRW1wdHkobnVsbCk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0VtcHR5KHRydWUpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNFbXB0eSgxKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzRW1wdHkoWzEsIDIsIDNdKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0VtcHR5KHsgJ2EnOiAxIH0pO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNFbXB0eSh2YWx1ZSkge1xuICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmIChpc0FycmF5TGlrZSh2YWx1ZSkgJiZcbiAgICAgIChpc0FycmF5KHZhbHVlKSB8fCB0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycgfHwgdHlwZW9mIHZhbHVlLnNwbGljZSA9PSAnZnVuY3Rpb24nIHx8XG4gICAgICAgIGlzQnVmZmVyKHZhbHVlKSB8fCBpc1R5cGVkQXJyYXkodmFsdWUpIHx8IGlzQXJndW1lbnRzKHZhbHVlKSkpIHtcbiAgICByZXR1cm4gIXZhbHVlLmxlbmd0aDtcbiAgfVxuICB2YXIgdGFnID0gZ2V0VGFnKHZhbHVlKTtcbiAgaWYgKHRhZyA9PSBtYXBUYWcgfHwgdGFnID09IHNldFRhZykge1xuICAgIHJldHVybiAhdmFsdWUuc2l6ZTtcbiAgfVxuICBpZiAoaXNQcm90b3R5cGUodmFsdWUpKSB7XG4gICAgcmV0dXJuICFiYXNlS2V5cyh2YWx1ZSkubGVuZ3RoO1xuICB9XG4gIGZvciAodmFyIGtleSBpbiB2YWx1ZSkge1xuICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCBrZXkpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzRW1wdHk7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///399\n")},function(module,exports){eval("/**\n * A specialized version of `_.reduce` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @param {boolean} [initAccum] Specify using the first element of `array` as\n * the initial value.\n * @returns {*} Returns the accumulated value.\n */\nfunction arrayReduce(array, iteratee, accumulator, initAccum) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n if (initAccum && length) {\n accumulator = array[++index];\n }\n while (++index < length) {\n accumulator = iteratee(accumulator, array[index], index, array);\n }\n return accumulator;\n}\n\nmodule.exports = arrayReduce;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19hcnJheVJlZHVjZS5qcz82YWMwIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE1BQU07QUFDakIsV0FBVyxTQUFTO0FBQ3BCLFdBQVcsRUFBRTtBQUNiLFdBQVcsUUFBUTtBQUNuQjtBQUNBLGFBQWEsRUFBRTtBQUNmO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJmaWxlIjoiNDAwLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8ucmVkdWNlYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAqIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcGFyYW0geyp9IFthY2N1bXVsYXRvcl0gVGhlIGluaXRpYWwgdmFsdWUuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtpbml0QWNjdW1dIFNwZWNpZnkgdXNpbmcgdGhlIGZpcnN0IGVsZW1lbnQgb2YgYGFycmF5YCBhc1xuICogIHRoZSBpbml0aWFsIHZhbHVlLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLlxuICovXG5mdW5jdGlvbiBhcnJheVJlZHVjZShhcnJheSwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yLCBpbml0QWNjdW0pIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcblxuICBpZiAoaW5pdEFjY3VtICYmIGxlbmd0aCkge1xuICAgIGFjY3VtdWxhdG9yID0gYXJyYXlbKytpbmRleF07XG4gIH1cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICBhY2N1bXVsYXRvciA9IGl0ZXJhdGVlKGFjY3VtdWxhdG9yLCBhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSk7XG4gIH1cbiAgcmV0dXJuIGFjY3VtdWxhdG9yO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFycmF5UmVkdWNlO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///400\n")},function(module,exports){eval("/**\n * The base implementation of `_.reduce` and `_.reduceRight`, without support\n * for iteratee shorthands, which iterates over `collection` using `eachFunc`.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {*} accumulator The initial value.\n * @param {boolean} initAccum Specify using the first or last element of\n * `collection` as the initial value.\n * @param {Function} eachFunc The function to iterate over `collection`.\n * @returns {*} Returns the accumulated value.\n */\nfunction baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {\n eachFunc(collection, function(value, index, collection) {\n accumulator = initAccum\n ? (initAccum = false, value)\n : iteratee(accumulator, value, index, collection);\n });\n return accumulator;\n}\n\nmodule.exports = baseReduce;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlUmVkdWNlLmpzPzU4ZjciXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsYUFBYTtBQUN4QixXQUFXLFNBQVM7QUFDcEIsV0FBVyxFQUFFO0FBQ2IsV0FBVyxRQUFRO0FBQ25CO0FBQ0EsV0FBVyxTQUFTO0FBQ3BCLGFBQWEsRUFBRTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBIiwiZmlsZSI6IjQwMS5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucmVkdWNlYCBhbmQgYF8ucmVkdWNlUmlnaHRgLCB3aXRob3V0IHN1cHBvcnRcbiAqIGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLCB3aGljaCBpdGVyYXRlcyBvdmVyIGBjb2xsZWN0aW9uYCB1c2luZyBgZWFjaEZ1bmNgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHBhcmFtIHsqfSBhY2N1bXVsYXRvciBUaGUgaW5pdGlhbCB2YWx1ZS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaW5pdEFjY3VtIFNwZWNpZnkgdXNpbmcgdGhlIGZpcnN0IG9yIGxhc3QgZWxlbWVudCBvZlxuICogIGBjb2xsZWN0aW9uYCBhcyB0aGUgaW5pdGlhbCB2YWx1ZS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGVhY2hGdW5jIFRoZSBmdW5jdGlvbiB0byBpdGVyYXRlIG92ZXIgYGNvbGxlY3Rpb25gLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLlxuICovXG5mdW5jdGlvbiBiYXNlUmVkdWNlKGNvbGxlY3Rpb24sIGl0ZXJhdGVlLCBhY2N1bXVsYXRvciwgaW5pdEFjY3VtLCBlYWNoRnVuYykge1xuICBlYWNoRnVuYyhjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pIHtcbiAgICBhY2N1bXVsYXRvciA9IGluaXRBY2N1bVxuICAgICAgPyAoaW5pdEFjY3VtID0gZmFsc2UsIHZhbHVlKVxuICAgICAgOiBpdGVyYXRlZShhY2N1bXVsYXRvciwgdmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKTtcbiAgfSk7XG4gIHJldHVybiBhY2N1bXVsYXRvcjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlUmVkdWNlO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///401\n")},function(module,exports,__webpack_require__){eval("var baseKeys = __webpack_require__(159),\n getTag = __webpack_require__(75),\n isArrayLike = __webpack_require__(54),\n isString = __webpack_require__(403),\n stringSize = __webpack_require__(404);\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]',\n setTag = '[object Set]';\n\n/**\n * Gets the size of `collection` by returning its length for array-like\n * values or the number of own enumerable string keyed properties for objects.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object|string} collection The collection to inspect.\n * @returns {number} Returns the collection size.\n * @example\n *\n * _.size([1, 2, 3]);\n * // => 3\n *\n * _.size({ 'a': 1, 'b': 2 });\n * // => 2\n *\n * _.size('pebbles');\n * // => 7\n */\nfunction size(collection) {\n if (collection == null) {\n return 0;\n }\n if (isArrayLike(collection)) {\n return isString(collection) ? stringSize(collection) : collection.length;\n }\n var tag = getTag(collection);\n if (tag == mapTag || tag == setTag) {\n return collection.size;\n }\n return baseKeys(collection).length;\n}\n\nmodule.exports = size;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL3NpemUuanM/ZDYyMyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxlQUFlLG1CQUFPLENBQUMsR0FBYTtBQUNwQyxhQUFhLG1CQUFPLENBQUMsRUFBVztBQUNoQyxrQkFBa0IsbUJBQU8sQ0FBQyxFQUFlO0FBQ3pDLGVBQWUsbUJBQU8sQ0FBQyxHQUFZO0FBQ25DLGlCQUFpQixtQkFBTyxDQUFDLEdBQWU7O0FBRXhDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxvQkFBb0I7QUFDL0IsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLGlCQUFpQjtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJmaWxlIjoiNDAyLmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIGJhc2VLZXlzID0gcmVxdWlyZSgnLi9fYmFzZUtleXMnKSxcbiAgICBnZXRUYWcgPSByZXF1aXJlKCcuL19nZXRUYWcnKSxcbiAgICBpc0FycmF5TGlrZSA9IHJlcXVpcmUoJy4vaXNBcnJheUxpa2UnKSxcbiAgICBpc1N0cmluZyA9IHJlcXVpcmUoJy4vaXNTdHJpbmcnKSxcbiAgICBzdHJpbmdTaXplID0gcmVxdWlyZSgnLi9fc3RyaW5nU2l6ZScpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgbWFwVGFnID0gJ1tvYmplY3QgTWFwXScsXG4gICAgc2V0VGFnID0gJ1tvYmplY3QgU2V0XSc7XG5cbi8qKlxuICogR2V0cyB0aGUgc2l6ZSBvZiBgY29sbGVjdGlvbmAgYnkgcmV0dXJuaW5nIGl0cyBsZW5ndGggZm9yIGFycmF5LWxpa2VcbiAqIHZhbHVlcyBvciB0aGUgbnVtYmVyIG9mIG93biBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzIGZvciBvYmplY3RzLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gKiBAcGFyYW0ge0FycmF5fE9iamVjdHxzdHJpbmd9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaW5zcGVjdC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNvbGxlY3Rpb24gc2l6ZS5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5zaXplKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiAzXG4gKlxuICogXy5zaXplKHsgJ2EnOiAxLCAnYic6IDIgfSk7XG4gKiAvLyA9PiAyXG4gKlxuICogXy5zaXplKCdwZWJibGVzJyk7XG4gKiAvLyA9PiA3XG4gKi9cbmZ1bmN0aW9uIHNpemUoY29sbGVjdGlvbikge1xuICBpZiAoY29sbGVjdGlvbiA9PSBudWxsKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgaWYgKGlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pKSB7XG4gICAgcmV0dXJuIGlzU3RyaW5nKGNvbGxlY3Rpb24pID8gc3RyaW5nU2l6ZShjb2xsZWN0aW9uKSA6IGNvbGxlY3Rpb24ubGVuZ3RoO1xuICB9XG4gIHZhciB0YWcgPSBnZXRUYWcoY29sbGVjdGlvbik7XG4gIGlmICh0YWcgPT0gbWFwVGFnIHx8IHRhZyA9PSBzZXRUYWcpIHtcbiAgICByZXR1cm4gY29sbGVjdGlvbi5zaXplO1xuICB9XG4gIHJldHVybiBiYXNlS2V5cyhjb2xsZWN0aW9uKS5sZW5ndGg7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2l6ZTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///402\n")},function(module,exports,__webpack_require__){eval("var baseGetTag = __webpack_require__(65),\n isArray = __webpack_require__(31),\n isObjectLike = __webpack_require__(49);\n\n/** `Object#toString` result references. */\nvar stringTag = '[object String]';\n\n/**\n * Checks if `value` is classified as a `String` primitive or object.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a string, else `false`.\n * @example\n *\n * _.isString('abc');\n * // => true\n *\n * _.isString(1);\n * // => false\n */\nfunction isString(value) {\n return typeof value == 'string' ||\n (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag);\n}\n\nmodule.exports = isString;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzU3RyaW5nLmpzP2UyYTAiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsaUJBQWlCLG1CQUFPLENBQUMsRUFBZTtBQUN4QyxjQUFjLG1CQUFPLENBQUMsRUFBVztBQUNqQyxtQkFBbUIsbUJBQU8sQ0FBQyxFQUFnQjs7QUFFM0M7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsRUFBRTtBQUNiLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJmaWxlIjoiNDAzLmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIGJhc2VHZXRUYWcgPSByZXF1aXJlKCcuL19iYXNlR2V0VGFnJyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpLFxuICAgIGlzT2JqZWN0TGlrZSA9IHJlcXVpcmUoJy4vaXNPYmplY3RMaWtlJyk7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBzdHJpbmdUYWcgPSAnW29iamVjdCBTdHJpbmddJztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYFN0cmluZ2AgcHJpbWl0aXZlIG9yIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHN0cmluZywgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzU3RyaW5nKCdhYmMnKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzU3RyaW5nKDEpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNTdHJpbmcodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJyB8fFxuICAgICghaXNBcnJheSh2YWx1ZSkgJiYgaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBiYXNlR2V0VGFnKHZhbHVlKSA9PSBzdHJpbmdUYWcpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzU3RyaW5nO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///403\n")},function(module,exports,__webpack_require__){eval("var asciiSize = __webpack_require__(405),\n hasUnicode = __webpack_require__(406),\n unicodeSize = __webpack_require__(407);\n\n/**\n * Gets the number of symbols in `string`.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {number} Returns the string size.\n */\nfunction stringSize(string) {\n return hasUnicode(string)\n ? unicodeSize(string)\n : asciiSize(string);\n}\n\nmodule.exports = stringSize;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19zdHJpbmdTaXplLmpzPzY3NTEiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsZ0JBQWdCLG1CQUFPLENBQUMsR0FBYztBQUN0QyxpQkFBaUIsbUJBQU8sQ0FBQyxHQUFlO0FBQ3hDLGtCQUFrQixtQkFBTyxDQUFDLEdBQWdCOztBQUUxQztBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixhQUFhLE9BQU87QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwiZmlsZSI6IjQwNC5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBhc2NpaVNpemUgPSByZXF1aXJlKCcuL19hc2NpaVNpemUnKSxcbiAgICBoYXNVbmljb2RlID0gcmVxdWlyZSgnLi9faGFzVW5pY29kZScpLFxuICAgIHVuaWNvZGVTaXplID0gcmVxdWlyZSgnLi9fdW5pY29kZVNpemUnKTtcblxuLyoqXG4gKiBHZXRzIHRoZSBudW1iZXIgb2Ygc3ltYm9scyBpbiBgc3RyaW5nYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzdHJpbmcgc2l6ZS5cbiAqL1xuZnVuY3Rpb24gc3RyaW5nU2l6ZShzdHJpbmcpIHtcbiAgcmV0dXJuIGhhc1VuaWNvZGUoc3RyaW5nKVxuICAgID8gdW5pY29kZVNpemUoc3RyaW5nKVxuICAgIDogYXNjaWlTaXplKHN0cmluZyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc3RyaW5nU2l6ZTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///404\n")},function(module,exports,__webpack_require__){eval("var baseProperty = __webpack_require__(217);\n\n/**\n * Gets the size of an ASCII `string`.\n *\n * @private\n * @param {string} string The string inspect.\n * @returns {number} Returns the string size.\n */\nvar asciiSize = baseProperty('length');\n\nmodule.exports = asciiSize;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19hc2NpaVNpemUuanM/YzljYSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxtQkFBbUIsbUJBQU8sQ0FBQyxHQUFpQjs7QUFFNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7O0FBRUEiLCJmaWxlIjoiNDA1LmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIGJhc2VQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vX2Jhc2VQcm9wZXJ0eScpO1xuXG4vKipcbiAqIEdldHMgdGhlIHNpemUgb2YgYW4gQVNDSUkgYHN0cmluZ2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyBpbnNwZWN0LlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgc3RyaW5nIHNpemUuXG4gKi9cbnZhciBhc2NpaVNpemUgPSBiYXNlUHJvcGVydHkoJ2xlbmd0aCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGFzY2lpU2l6ZTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///405\n")},function(module,exports){eval("/** Used to compose unicode character classes. */\nvar rsAstralRange = '\\\\ud800-\\\\udfff',\n rsComboMarksRange = '\\\\u0300-\\\\u036f',\n reComboHalfMarksRange = '\\\\ufe20-\\\\ufe2f',\n rsComboSymbolsRange = '\\\\u20d0-\\\\u20ff',\n rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,\n rsVarRange = '\\\\ufe0e\\\\ufe0f';\n\n/** Used to compose unicode capture groups. */\nvar rsZWJ = '\\\\u200d';\n\n/** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */\nvar reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange + rsComboRange + rsVarRange + ']');\n\n/**\n * Checks if `string` contains Unicode symbols.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {boolean} Returns `true` if a symbol is found, else `false`.\n */\nfunction hasUnicode(string) {\n return reHasUnicode.test(string);\n}\n\nmodule.exports = hasUnicode;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19oYXNVbmljb2RlLmpzP2FhZWMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsImZpbGUiOiI0MDYuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiogVXNlZCB0byBjb21wb3NlIHVuaWNvZGUgY2hhcmFjdGVyIGNsYXNzZXMuICovXG52YXIgcnNBc3RyYWxSYW5nZSA9ICdcXFxcdWQ4MDAtXFxcXHVkZmZmJyxcbiAgICByc0NvbWJvTWFya3NSYW5nZSA9ICdcXFxcdTAzMDAtXFxcXHUwMzZmJyxcbiAgICByZUNvbWJvSGFsZk1hcmtzUmFuZ2UgPSAnXFxcXHVmZTIwLVxcXFx1ZmUyZicsXG4gICAgcnNDb21ib1N5bWJvbHNSYW5nZSA9ICdcXFxcdTIwZDAtXFxcXHUyMGZmJyxcbiAgICByc0NvbWJvUmFuZ2UgPSByc0NvbWJvTWFya3NSYW5nZSArIHJlQ29tYm9IYWxmTWFya3NSYW5nZSArIHJzQ29tYm9TeW1ib2xzUmFuZ2UsXG4gICAgcnNWYXJSYW5nZSA9ICdcXFxcdWZlMGVcXFxcdWZlMGYnO1xuXG4vKiogVXNlZCB0byBjb21wb3NlIHVuaWNvZGUgY2FwdHVyZSBncm91cHMuICovXG52YXIgcnNaV0ogPSAnXFxcXHUyMDBkJztcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IHN0cmluZ3Mgd2l0aCBbemVyby13aWR0aCBqb2luZXJzIG9yIGNvZGUgcG9pbnRzIGZyb20gdGhlIGFzdHJhbCBwbGFuZXNdKGh0dHA6Ly9lZXYuZWUvYmxvZy8yMDE1LzA5LzEyL2RhcmstY29ybmVycy1vZi11bmljb2RlLykuICovXG52YXIgcmVIYXNVbmljb2RlID0gUmVnRXhwKCdbJyArIHJzWldKICsgcnNBc3RyYWxSYW5nZSAgKyByc0NvbWJvUmFuZ2UgKyByc1ZhclJhbmdlICsgJ10nKTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHN0cmluZ2AgY29udGFpbnMgVW5pY29kZSBzeW1ib2xzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gaW5zcGVjdC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhIHN5bWJvbCBpcyBmb3VuZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBoYXNVbmljb2RlKHN0cmluZykge1xuICByZXR1cm4gcmVIYXNVbmljb2RlLnRlc3Qoc3RyaW5nKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBoYXNVbmljb2RlO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///406\n")},function(module,exports){eval("/** Used to compose unicode character classes. */\nvar rsAstralRange = '\\\\ud800-\\\\udfff',\n rsComboMarksRange = '\\\\u0300-\\\\u036f',\n reComboHalfMarksRange = '\\\\ufe20-\\\\ufe2f',\n rsComboSymbolsRange = '\\\\u20d0-\\\\u20ff',\n rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,\n rsVarRange = '\\\\ufe0e\\\\ufe0f';\n\n/** Used to compose unicode capture groups. */\nvar rsAstral = '[' + rsAstralRange + ']',\n rsCombo = '[' + rsComboRange + ']',\n rsFitz = '\\\\ud83c[\\\\udffb-\\\\udfff]',\n rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',\n rsNonAstral = '[^' + rsAstralRange + ']',\n rsRegional = '(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}',\n rsSurrPair = '[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]',\n rsZWJ = '\\\\u200d';\n\n/** Used to compose unicode regexes. */\nvar reOptMod = rsModifier + '?',\n rsOptVar = '[' + rsVarRange + ']?',\n rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',\n rsSeq = rsOptVar + reOptMod + rsOptJoin,\n rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';\n\n/** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */\nvar reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');\n\n/**\n * Gets the size of a Unicode `string`.\n *\n * @private\n * @param {string} string The string inspect.\n * @returns {number} Returns the string size.\n */\nfunction unicodeSize(string) {\n var result = reUnicode.lastIndex = 0;\n while (reUnicode.test(string)) {\n ++result;\n }\n return result;\n}\n\nmodule.exports = unicodeSize;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL191bmljb2RlU2l6ZS5qcz9hYjgxIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtDQUErQyxFQUFFO0FBQ2pEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJmaWxlIjoiNDA3LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqIFVzZWQgdG8gY29tcG9zZSB1bmljb2RlIGNoYXJhY3RlciBjbGFzc2VzLiAqL1xudmFyIHJzQXN0cmFsUmFuZ2UgPSAnXFxcXHVkODAwLVxcXFx1ZGZmZicsXG4gICAgcnNDb21ib01hcmtzUmFuZ2UgPSAnXFxcXHUwMzAwLVxcXFx1MDM2ZicsXG4gICAgcmVDb21ib0hhbGZNYXJrc1JhbmdlID0gJ1xcXFx1ZmUyMC1cXFxcdWZlMmYnLFxuICAgIHJzQ29tYm9TeW1ib2xzUmFuZ2UgPSAnXFxcXHUyMGQwLVxcXFx1MjBmZicsXG4gICAgcnNDb21ib1JhbmdlID0gcnNDb21ib01hcmtzUmFuZ2UgKyByZUNvbWJvSGFsZk1hcmtzUmFuZ2UgKyByc0NvbWJvU3ltYm9sc1JhbmdlLFxuICAgIHJzVmFyUmFuZ2UgPSAnXFxcXHVmZTBlXFxcXHVmZTBmJztcblxuLyoqIFVzZWQgdG8gY29tcG9zZSB1bmljb2RlIGNhcHR1cmUgZ3JvdXBzLiAqL1xudmFyIHJzQXN0cmFsID0gJ1snICsgcnNBc3RyYWxSYW5nZSArICddJyxcbiAgICByc0NvbWJvID0gJ1snICsgcnNDb21ib1JhbmdlICsgJ10nLFxuICAgIHJzRml0eiA9ICdcXFxcdWQ4M2NbXFxcXHVkZmZiLVxcXFx1ZGZmZl0nLFxuICAgIHJzTW9kaWZpZXIgPSAnKD86JyArIHJzQ29tYm8gKyAnfCcgKyByc0ZpdHogKyAnKScsXG4gICAgcnNOb25Bc3RyYWwgPSAnW14nICsgcnNBc3RyYWxSYW5nZSArICddJyxcbiAgICByc1JlZ2lvbmFsID0gJyg/OlxcXFx1ZDgzY1tcXFxcdWRkZTYtXFxcXHVkZGZmXSl7Mn0nLFxuICAgIHJzU3VyclBhaXIgPSAnW1xcXFx1ZDgwMC1cXFxcdWRiZmZdW1xcXFx1ZGMwMC1cXFxcdWRmZmZdJyxcbiAgICByc1pXSiA9ICdcXFxcdTIwMGQnO1xuXG4vKiogVXNlZCB0byBjb21wb3NlIHVuaWNvZGUgcmVnZXhlcy4gKi9cbnZhciByZU9wdE1vZCA9IHJzTW9kaWZpZXIgKyAnPycsXG4gICAgcnNPcHRWYXIgPSAnWycgKyByc1ZhclJhbmdlICsgJ10/JyxcbiAgICByc09wdEpvaW4gPSAnKD86JyArIHJzWldKICsgJyg/OicgKyBbcnNOb25Bc3RyYWwsIHJzUmVnaW9uYWwsIHJzU3VyclBhaXJdLmpvaW4oJ3wnKSArICcpJyArIHJzT3B0VmFyICsgcmVPcHRNb2QgKyAnKSonLFxuICAgIHJzU2VxID0gcnNPcHRWYXIgKyByZU9wdE1vZCArIHJzT3B0Sm9pbixcbiAgICByc1N5bWJvbCA9ICcoPzonICsgW3JzTm9uQXN0cmFsICsgcnNDb21ibyArICc/JywgcnNDb21ibywgcnNSZWdpb25hbCwgcnNTdXJyUGFpciwgcnNBc3RyYWxdLmpvaW4oJ3wnKSArICcpJztcblxuLyoqIFVzZWQgdG8gbWF0Y2ggW3N0cmluZyBzeW1ib2xzXShodHRwczovL21hdGhpYXNieW5lbnMuYmUvbm90ZXMvamF2YXNjcmlwdC11bmljb2RlKS4gKi9cbnZhciByZVVuaWNvZGUgPSBSZWdFeHAocnNGaXR6ICsgJyg/PScgKyByc0ZpdHogKyAnKXwnICsgcnNTeW1ib2wgKyByc1NlcSwgJ2cnKTtcblxuLyoqXG4gKiBHZXRzIHRoZSBzaXplIG9mIGEgVW5pY29kZSBgc3RyaW5nYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzdHJpbmcgc2l6ZS5cbiAqL1xuZnVuY3Rpb24gdW5pY29kZVNpemUoc3RyaW5nKSB7XG4gIHZhciByZXN1bHQgPSByZVVuaWNvZGUubGFzdEluZGV4ID0gMDtcbiAgd2hpbGUgKHJlVW5pY29kZS50ZXN0KHN0cmluZykpIHtcbiAgICArK3Jlc3VsdDtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHVuaWNvZGVTaXplO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///407\n")},function(module,exports,__webpack_require__){eval("var arrayEach = __webpack_require__(155),\n baseCreate = __webpack_require__(203),\n baseForOwn = __webpack_require__(164),\n baseIteratee = __webpack_require__(55),\n getPrototype = __webpack_require__(109),\n isArray = __webpack_require__(31),\n isBuffer = __webpack_require__(74),\n isFunction = __webpack_require__(86),\n isObject = __webpack_require__(43),\n isTypedArray = __webpack_require__(89);\n\n/**\n * An alternative to `_.reduce`; this method transforms `object` to a new\n * `accumulator` object which is the result of running each of its own\n * enumerable string keyed properties thru `iteratee`, with each invocation\n * potentially mutating the `accumulator` object. If `accumulator` is not\n * provided, a new object with the same `[[Prototype]]` will be used. The\n * iteratee is invoked with four arguments: (accumulator, value, key, object).\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * @static\n * @memberOf _\n * @since 1.3.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @param {*} [accumulator] The custom accumulator value.\n * @returns {*} Returns the accumulated value.\n * @example\n *\n * _.transform([2, 3, 4], function(result, n) {\n * result.push(n *= n);\n * return n % 2 == 0;\n * }, []);\n * // => [4, 9]\n *\n * _.transform({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {\n * (result[value] || (result[value] = [])).push(key);\n * }, {});\n * // => { '1': ['a', 'c'], '2': ['b'] }\n */\nfunction transform(object, iteratee, accumulator) {\n var isArr = isArray(object),\n isArrLike = isArr || isBuffer(object) || isTypedArray(object);\n\n iteratee = baseIteratee(iteratee, 4);\n if (accumulator == null) {\n var Ctor = object && object.constructor;\n if (isArrLike) {\n accumulator = isArr ? new Ctor : [];\n }\n else if (isObject(object)) {\n accumulator = isFunction(Ctor) ? baseCreate(getPrototype(object)) : {};\n }\n else {\n accumulator = {};\n }\n }\n (isArrLike ? arrayEach : baseForOwn)(object, function(value, index, object) {\n return iteratee(accumulator, value, index, object);\n });\n return accumulator;\n}\n\nmodule.exports = transform;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL3RyYW5zZm9ybS5qcz81MGNhIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGdCQUFnQixtQkFBTyxDQUFDLEdBQWM7QUFDdEMsaUJBQWlCLG1CQUFPLENBQUMsR0FBZTtBQUN4QyxpQkFBaUIsbUJBQU8sQ0FBQyxHQUFlO0FBQ3hDLG1CQUFtQixtQkFBTyxDQUFDLEVBQWlCO0FBQzVDLG1CQUFtQixtQkFBTyxDQUFDLEdBQWlCO0FBQzVDLGNBQWMsbUJBQU8sQ0FBQyxFQUFXO0FBQ2pDLGVBQWUsbUJBQU8sQ0FBQyxFQUFZO0FBQ25DLGlCQUFpQixtQkFBTyxDQUFDLEVBQWM7QUFDdkMsZUFBZSxtQkFBTyxDQUFDLEVBQVk7QUFDbkMsbUJBQW1CLG1CQUFPLENBQUMsRUFBZ0I7O0FBRTNDO0FBQ0EsZ0NBQWdDO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsV0FBVyxTQUFTO0FBQ3BCLFdBQVcsRUFBRTtBQUNiLGFBQWEsRUFBRTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLGdCQUFnQix5QkFBeUI7QUFDekM7QUFDQSxJQUFJLElBQUk7QUFDUixVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUEiLCJmaWxlIjoiNDA4LmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIGFycmF5RWFjaCA9IHJlcXVpcmUoJy4vX2FycmF5RWFjaCcpLFxuICAgIGJhc2VDcmVhdGUgPSByZXF1aXJlKCcuL19iYXNlQ3JlYXRlJyksXG4gICAgYmFzZUZvck93biA9IHJlcXVpcmUoJy4vX2Jhc2VGb3JPd24nKSxcbiAgICBiYXNlSXRlcmF0ZWUgPSByZXF1aXJlKCcuL19iYXNlSXRlcmF0ZWUnKSxcbiAgICBnZXRQcm90b3R5cGUgPSByZXF1aXJlKCcuL19nZXRQcm90b3R5cGUnKSxcbiAgICBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5JyksXG4gICAgaXNCdWZmZXIgPSByZXF1aXJlKCcuL2lzQnVmZmVyJyksXG4gICAgaXNGdW5jdGlvbiA9IHJlcXVpcmUoJy4vaXNGdW5jdGlvbicpLFxuICAgIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9pc09iamVjdCcpLFxuICAgIGlzVHlwZWRBcnJheSA9IHJlcXVpcmUoJy4vaXNUeXBlZEFycmF5Jyk7XG5cbi8qKlxuICogQW4gYWx0ZXJuYXRpdmUgdG8gYF8ucmVkdWNlYDsgdGhpcyBtZXRob2QgdHJhbnNmb3JtcyBgb2JqZWN0YCB0byBhIG5ld1xuICogYGFjY3VtdWxhdG9yYCBvYmplY3Qgd2hpY2ggaXMgdGhlIHJlc3VsdCBvZiBydW5uaW5nIGVhY2ggb2YgaXRzIG93blxuICogZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydGllcyB0aHJ1IGBpdGVyYXRlZWAsIHdpdGggZWFjaCBpbnZvY2F0aW9uXG4gKiBwb3RlbnRpYWxseSBtdXRhdGluZyB0aGUgYGFjY3VtdWxhdG9yYCBvYmplY3QuIElmIGBhY2N1bXVsYXRvcmAgaXMgbm90XG4gKiBwcm92aWRlZCwgYSBuZXcgb2JqZWN0IHdpdGggdGhlIHNhbWUgYFtbUHJvdG90eXBlXV1gIHdpbGwgYmUgdXNlZC4gVGhlXG4gKiBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggZm91ciBhcmd1bWVudHM6IChhY2N1bXVsYXRvciwgdmFsdWUsIGtleSwgb2JqZWN0KS5cbiAqIEl0ZXJhdGVlIGZ1bmN0aW9ucyBtYXkgZXhpdCBpdGVyYXRpb24gZWFybHkgYnkgZXhwbGljaXRseSByZXR1cm5pbmcgYGZhbHNlYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDEuMy4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcGFyYW0geyp9IFthY2N1bXVsYXRvcl0gVGhlIGN1c3RvbSBhY2N1bXVsYXRvciB2YWx1ZS5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZS5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50cmFuc2Zvcm0oWzIsIDMsIDRdLCBmdW5jdGlvbihyZXN1bHQsIG4pIHtcbiAqICAgcmVzdWx0LnB1c2gobiAqPSBuKTtcbiAqICAgcmV0dXJuIG4gJSAyID09IDA7XG4gKiB9LCBbXSk7XG4gKiAvLyA9PiBbNCwgOV1cbiAqXG4gKiBfLnRyYW5zZm9ybSh7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDEgfSwgZnVuY3Rpb24ocmVzdWx0LCB2YWx1ZSwga2V5KSB7XG4gKiAgIChyZXN1bHRbdmFsdWVdIHx8IChyZXN1bHRbdmFsdWVdID0gW10pKS5wdXNoKGtleSk7XG4gKiB9LCB7fSk7XG4gKiAvLyA9PiB7ICcxJzogWydhJywgJ2MnXSwgJzInOiBbJ2InXSB9XG4gKi9cbmZ1bmN0aW9uIHRyYW5zZm9ybShvYmplY3QsIGl0ZXJhdGVlLCBhY2N1bXVsYXRvcikge1xuICB2YXIgaXNBcnIgPSBpc0FycmF5KG9iamVjdCksXG4gICAgICBpc0Fyckxpa2UgPSBpc0FyciB8fCBpc0J1ZmZlcihvYmplY3QpIHx8IGlzVHlwZWRBcnJheShvYmplY3QpO1xuXG4gIGl0ZXJhdGVlID0gYmFzZUl0ZXJhdGVlKGl0ZXJhdGVlLCA0KTtcbiAgaWYgKGFjY3VtdWxhdG9yID09IG51bGwpIHtcbiAgICB2YXIgQ3RvciA9IG9iamVjdCAmJiBvYmplY3QuY29uc3RydWN0b3I7XG4gICAgaWYgKGlzQXJyTGlrZSkge1xuICAgICAgYWNjdW11bGF0b3IgPSBpc0FyciA/IG5ldyBDdG9yIDogW107XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzT2JqZWN0KG9iamVjdCkpIHtcbiAgICAgIGFjY3VtdWxhdG9yID0gaXNGdW5jdGlvbihDdG9yKSA/IGJhc2VDcmVhdGUoZ2V0UHJvdG90eXBlKG9iamVjdCkpIDoge307XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgYWNjdW11bGF0b3IgPSB7fTtcbiAgICB9XG4gIH1cbiAgKGlzQXJyTGlrZSA/IGFycmF5RWFjaCA6IGJhc2VGb3JPd24pKG9iamVjdCwgZnVuY3Rpb24odmFsdWUsIGluZGV4LCBvYmplY3QpIHtcbiAgICByZXR1cm4gaXRlcmF0ZWUoYWNjdW11bGF0b3IsIHZhbHVlLCBpbmRleCwgb2JqZWN0KTtcbiAgfSk7XG4gIHJldHVybiBhY2N1bXVsYXRvcjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB0cmFuc2Zvcm07XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///408\n")},function(module,exports,__webpack_require__){eval("var baseFlatten = __webpack_require__(168),\n baseRest = __webpack_require__(114),\n baseUniq = __webpack_require__(414),\n isArrayLikeObject = __webpack_require__(226);\n\n/**\n * Creates an array of unique values, in order, from all given arrays using\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @returns {Array} Returns the new array of combined values.\n * @example\n *\n * _.union([2], [1, 2]);\n * // => [2, 1]\n */\nvar union = baseRest(function(arrays) {\n return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true));\n});\n\nmodule.exports = union;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL3VuaW9uLmpzP2JmYzciXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsa0JBQWtCLG1CQUFPLENBQUMsR0FBZ0I7QUFDMUMsZUFBZSxtQkFBTyxDQUFDLEdBQWE7QUFDcEMsZUFBZSxtQkFBTyxDQUFDLEdBQWE7QUFDcEMsd0JBQXdCLG1CQUFPLENBQUMsR0FBcUI7O0FBRXJEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsU0FBUztBQUNwQixhQUFhLE1BQU07QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEIiwiZmlsZSI6IjQwOS5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBiYXNlRmxhdHRlbiA9IHJlcXVpcmUoJy4vX2Jhc2VGbGF0dGVuJyksXG4gICAgYmFzZVJlc3QgPSByZXF1aXJlKCcuL19iYXNlUmVzdCcpLFxuICAgIGJhc2VVbmlxID0gcmVxdWlyZSgnLi9fYmFzZVVuaXEnKSxcbiAgICBpc0FycmF5TGlrZU9iamVjdCA9IHJlcXVpcmUoJy4vaXNBcnJheUxpa2VPYmplY3QnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIHVuaXF1ZSB2YWx1ZXMsIGluIG9yZGVyLCBmcm9tIGFsbCBnaXZlbiBhcnJheXMgdXNpbmdcbiAqIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gKiBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IEFycmF5XG4gKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBjb21iaW5lZCB2YWx1ZXMuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udW5pb24oWzJdLCBbMSwgMl0pO1xuICogLy8gPT4gWzIsIDFdXG4gKi9cbnZhciB1bmlvbiA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cykge1xuICByZXR1cm4gYmFzZVVuaXEoYmFzZUZsYXR0ZW4oYXJyYXlzLCAxLCBpc0FycmF5TGlrZU9iamVjdCwgdHJ1ZSkpO1xufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gdW5pb247XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///409\n")},function(module,exports,__webpack_require__){eval("var Symbol = __webpack_require__(73),\n isArguments = __webpack_require__(88),\n isArray = __webpack_require__(31);\n\n/** Built-in value references. */\nvar spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined;\n\n/**\n * Checks if `value` is a flattenable `arguments` object or array.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.\n */\nfunction isFlattenable(value) {\n return isArray(value) || isArguments(value) ||\n !!(spreadableSymbol && value && value[spreadableSymbol]);\n}\n\nmodule.exports = isFlattenable;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19pc0ZsYXR0ZW5hYmxlLmpzPzA2MjEiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsYUFBYSxtQkFBTyxDQUFDLEVBQVc7QUFDaEMsa0JBQWtCLG1CQUFPLENBQUMsRUFBZTtBQUN6QyxjQUFjLG1CQUFPLENBQUMsRUFBVzs7QUFFakM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsRUFBRTtBQUNiLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwiZmlsZSI6IjQxMC5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBTeW1ib2wgPSByZXF1aXJlKCcuL19TeW1ib2wnKSxcbiAgICBpc0FyZ3VtZW50cyA9IHJlcXVpcmUoJy4vaXNBcmd1bWVudHMnKSxcbiAgICBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5Jyk7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIHNwcmVhZGFibGVTeW1ib2wgPSBTeW1ib2wgPyBTeW1ib2wuaXNDb25jYXRTcHJlYWRhYmxlIDogdW5kZWZpbmVkO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgZmxhdHRlbmFibGUgYGFyZ3VtZW50c2Agb2JqZWN0IG9yIGFycmF5LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGZsYXR0ZW5hYmxlLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzRmxhdHRlbmFibGUodmFsdWUpIHtcbiAgcmV0dXJuIGlzQXJyYXkodmFsdWUpIHx8IGlzQXJndW1lbnRzKHZhbHVlKSB8fFxuICAgICEhKHNwcmVhZGFibGVTeW1ib2wgJiYgdmFsdWUgJiYgdmFsdWVbc3ByZWFkYWJsZVN5bWJvbF0pO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzRmxhdHRlbmFibGU7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///410\n")},function(module,exports){eval("/**\n * A faster alternative to `Function#apply`, this function invokes `func`\n * with the `this` binding of `thisArg` and the arguments of `args`.\n *\n * @private\n * @param {Function} func The function to invoke.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} args The arguments to invoke `func` with.\n * @returns {*} Returns the result of `func`.\n */\nfunction apply(func, thisArg, args) {\n switch (args.length) {\n case 0: return func.call(thisArg);\n case 1: return func.call(thisArg, args[0]);\n case 2: return func.call(thisArg, args[0], args[1]);\n case 3: return func.call(thisArg, args[0], args[1], args[2]);\n }\n return func.apply(thisArg, args);\n}\n\nmodule.exports = apply;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19hcHBseS5qcz84NWUzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFNBQVM7QUFDcEIsV0FBVyxFQUFFO0FBQ2IsV0FBVyxNQUFNO0FBQ2pCLGFBQWEsRUFBRTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwiZmlsZSI6IjQxMS5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQSBmYXN0ZXIgYWx0ZXJuYXRpdmUgdG8gYEZ1bmN0aW9uI2FwcGx5YCwgdGhpcyBmdW5jdGlvbiBpbnZva2VzIGBmdW5jYFxuICogd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgb2YgYHRoaXNBcmdgIGFuZCB0aGUgYXJndW1lbnRzIG9mIGBhcmdzYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gaW52b2tlLlxuICogQHBhcmFtIHsqfSB0aGlzQXJnIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgZnVuY2AuXG4gKiBAcGFyYW0ge0FycmF5fSBhcmdzIFRoZSBhcmd1bWVudHMgdG8gaW52b2tlIGBmdW5jYCB3aXRoLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc3VsdCBvZiBgZnVuY2AuXG4gKi9cbmZ1bmN0aW9uIGFwcGx5KGZ1bmMsIHRoaXNBcmcsIGFyZ3MpIHtcbiAgc3dpdGNoIChhcmdzLmxlbmd0aCkge1xuICAgIGNhc2UgMDogcmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnKTtcbiAgICBjYXNlIDE6IHJldHVybiBmdW5jLmNhbGwodGhpc0FyZywgYXJnc1swXSk7XG4gICAgY2FzZSAyOiByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcsIGFyZ3NbMF0sIGFyZ3NbMV0pO1xuICAgIGNhc2UgMzogcmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnLCBhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTtcbiAgfVxuICByZXR1cm4gZnVuYy5hcHBseSh0aGlzQXJnLCBhcmdzKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhcHBseTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///411\n")},function(module,exports,__webpack_require__){eval("var constant = __webpack_require__(163),\n defineProperty = __webpack_require__(189),\n identity = __webpack_require__(67);\n\n/**\n * The base implementation of `setToString` without support for hot loop shorting.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar baseSetToString = !defineProperty ? identity : function(func, string) {\n return defineProperty(func, 'toString', {\n 'configurable': true,\n 'enumerable': false,\n 'value': constant(string),\n 'writable': true\n });\n};\n\nmodule.exports = baseSetToString;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlU2V0VG9TdHJpbmcuanM/YTQ1NCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxlQUFlLG1CQUFPLENBQUMsR0FBWTtBQUNuQyxxQkFBcUIsbUJBQU8sQ0FBQyxHQUFtQjtBQUNoRCxlQUFlLG1CQUFPLENBQUMsRUFBWTs7QUFFbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFNBQVM7QUFDcEIsV0FBVyxTQUFTO0FBQ3BCLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQSIsImZpbGUiOiI0MTIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgY29uc3RhbnQgPSByZXF1aXJlKCcuL2NvbnN0YW50JyksXG4gICAgZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCcuL19kZWZpbmVQcm9wZXJ0eScpLFxuICAgIGlkZW50aXR5ID0gcmVxdWlyZSgnLi9pZGVudGl0eScpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBzZXRUb1N0cmluZ2Agd2l0aG91dCBzdXBwb3J0IGZvciBob3QgbG9vcCBzaG9ydGluZy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gbW9kaWZ5LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gc3RyaW5nIFRoZSBgdG9TdHJpbmdgIHJlc3VsdC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBgZnVuY2AuXG4gKi9cbnZhciBiYXNlU2V0VG9TdHJpbmcgPSAhZGVmaW5lUHJvcGVydHkgPyBpZGVudGl0eSA6IGZ1bmN0aW9uKGZ1bmMsIHN0cmluZykge1xuICByZXR1cm4gZGVmaW5lUHJvcGVydHkoZnVuYywgJ3RvU3RyaW5nJywge1xuICAgICdjb25maWd1cmFibGUnOiB0cnVlLFxuICAgICdlbnVtZXJhYmxlJzogZmFsc2UsXG4gICAgJ3ZhbHVlJzogY29uc3RhbnQoc3RyaW5nKSxcbiAgICAnd3JpdGFibGUnOiB0cnVlXG4gIH0pO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlU2V0VG9TdHJpbmc7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///412\n")},function(module,exports){eval("/** Used to detect hot functions by number of calls within a span of milliseconds. */\nvar HOT_COUNT = 800,\n HOT_SPAN = 16;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeNow = Date.now;\n\n/**\n * Creates a function that'll short out and invoke `identity` instead\n * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`\n * milliseconds.\n *\n * @private\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new shortable function.\n */\nfunction shortOut(func) {\n var count = 0,\n lastCalled = 0;\n\n return function() {\n var stamp = nativeNow(),\n remaining = HOT_SPAN - (stamp - lastCalled);\n\n lastCalled = stamp;\n if (remaining > 0) {\n if (++count >= HOT_COUNT) {\n return arguments[0];\n }\n } else {\n count = 0;\n }\n return func.apply(undefined, arguments);\n };\n}\n\nmodule.exports = shortOut;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19zaG9ydE91dC5qcz9mM2MxIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsU0FBUztBQUNwQixhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsImZpbGUiOiI0MTMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiogVXNlZCB0byBkZXRlY3QgaG90IGZ1bmN0aW9ucyBieSBudW1iZXIgb2YgY2FsbHMgd2l0aGluIGEgc3BhbiBvZiBtaWxsaXNlY29uZHMuICovXG52YXIgSE9UX0NPVU5UID0gODAwLFxuICAgIEhPVF9TUEFOID0gMTY7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVOb3cgPSBEYXRlLm5vdztcblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCdsbCBzaG9ydCBvdXQgYW5kIGludm9rZSBgaWRlbnRpdHlgIGluc3RlYWRcbiAqIG9mIGBmdW5jYCB3aGVuIGl0J3MgY2FsbGVkIGBIT1RfQ09VTlRgIG9yIG1vcmUgdGltZXMgaW4gYEhPVF9TUEFOYFxuICogbWlsbGlzZWNvbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byByZXN0cmljdC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHNob3J0YWJsZSBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gc2hvcnRPdXQoZnVuYykge1xuICB2YXIgY291bnQgPSAwLFxuICAgICAgbGFzdENhbGxlZCA9IDA7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzdGFtcCA9IG5hdGl2ZU5vdygpLFxuICAgICAgICByZW1haW5pbmcgPSBIT1RfU1BBTiAtIChzdGFtcCAtIGxhc3RDYWxsZWQpO1xuXG4gICAgbGFzdENhbGxlZCA9IHN0YW1wO1xuICAgIGlmIChyZW1haW5pbmcgPiAwKSB7XG4gICAgICBpZiAoKytjb3VudCA+PSBIT1RfQ09VTlQpIHtcbiAgICAgICAgcmV0dXJuIGFyZ3VtZW50c1swXTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY291bnQgPSAwO1xuICAgIH1cbiAgICByZXR1cm4gZnVuYy5hcHBseSh1bmRlZmluZWQsIGFyZ3VtZW50cyk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2hvcnRPdXQ7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///413\n")},function(module,exports,__webpack_require__){eval("var SetCache = __webpack_require__(210),\n arrayIncludes = __webpack_require__(415),\n arrayIncludesWith = __webpack_require__(419),\n cacheHas = __webpack_require__(211),\n createSet = __webpack_require__(420),\n setToArray = __webpack_require__(166);\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * The base implementation of `_.uniqBy` without support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n */\nfunction baseUniq(array, iteratee, comparator) {\n var index = -1,\n includes = arrayIncludes,\n length = array.length,\n isCommon = true,\n result = [],\n seen = result;\n\n if (comparator) {\n isCommon = false;\n includes = arrayIncludesWith;\n }\n else if (length >= LARGE_ARRAY_SIZE) {\n var set = iteratee ? null : createSet(array);\n if (set) {\n return setToArray(set);\n }\n isCommon = false;\n includes = cacheHas;\n seen = new SetCache;\n }\n else {\n seen = iteratee ? [] : result;\n }\n outer:\n while (++index < length) {\n var value = array[index],\n computed = iteratee ? iteratee(value) : value;\n\n value = (comparator || value !== 0) ? value : 0;\n if (isCommon && computed === computed) {\n var seenIndex = seen.length;\n while (seenIndex--) {\n if (seen[seenIndex] === computed) {\n continue outer;\n }\n }\n if (iteratee) {\n seen.push(computed);\n }\n result.push(value);\n }\n else if (!includes(seen, computed, comparator)) {\n if (seen !== result) {\n seen.push(computed);\n }\n result.push(value);\n }\n }\n return result;\n}\n\nmodule.exports = baseUniq;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlVW5pcS5qcz8yYzY2Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGVBQWUsbUJBQU8sQ0FBQyxHQUFhO0FBQ3BDLG9CQUFvQixtQkFBTyxDQUFDLEdBQWtCO0FBQzlDLHdCQUF3QixtQkFBTyxDQUFDLEdBQXNCO0FBQ3RELGVBQWUsbUJBQU8sQ0FBQyxHQUFhO0FBQ3BDLGdCQUFnQixtQkFBTyxDQUFDLEdBQWM7QUFDdEMsaUJBQWlCLG1CQUFPLENBQUMsR0FBZTs7QUFFeEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsTUFBTTtBQUNqQixXQUFXLFNBQVM7QUFDcEIsV0FBVyxTQUFTO0FBQ3BCLGFBQWEsTUFBTTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJmaWxlIjoiNDE0LmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIFNldENhY2hlID0gcmVxdWlyZSgnLi9fU2V0Q2FjaGUnKSxcbiAgICBhcnJheUluY2x1ZGVzID0gcmVxdWlyZSgnLi9fYXJyYXlJbmNsdWRlcycpLFxuICAgIGFycmF5SW5jbHVkZXNXaXRoID0gcmVxdWlyZSgnLi9fYXJyYXlJbmNsdWRlc1dpdGgnKSxcbiAgICBjYWNoZUhhcyA9IHJlcXVpcmUoJy4vX2NhY2hlSGFzJyksXG4gICAgY3JlYXRlU2V0ID0gcmVxdWlyZSgnLi9fY3JlYXRlU2V0JyksXG4gICAgc2V0VG9BcnJheSA9IHJlcXVpcmUoJy4vX3NldFRvQXJyYXknKTtcblxuLyoqIFVzZWQgYXMgdGhlIHNpemUgdG8gZW5hYmxlIGxhcmdlIGFycmF5IG9wdGltaXphdGlvbnMuICovXG52YXIgTEFSR0VfQVJSQVlfU0laRSA9IDIwMDtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy51bmlxQnlgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWVdIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2NvbXBhcmF0b3JdIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBkdXBsaWNhdGUgZnJlZSBhcnJheS5cbiAqL1xuZnVuY3Rpb24gYmFzZVVuaXEoYXJyYXksIGl0ZXJhdGVlLCBjb21wYXJhdG9yKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgaW5jbHVkZXMgPSBhcnJheUluY2x1ZGVzLFxuICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgaXNDb21tb24gPSB0cnVlLFxuICAgICAgcmVzdWx0ID0gW10sXG4gICAgICBzZWVuID0gcmVzdWx0O1xuXG4gIGlmIChjb21wYXJhdG9yKSB7XG4gICAgaXNDb21tb24gPSBmYWxzZTtcbiAgICBpbmNsdWRlcyA9IGFycmF5SW5jbHVkZXNXaXRoO1xuICB9XG4gIGVsc2UgaWYgKGxlbmd0aCA+PSBMQVJHRV9BUlJBWV9TSVpFKSB7XG4gICAgdmFyIHNldCA9IGl0ZXJhdGVlID8gbnVsbCA6IGNyZWF0ZVNldChhcnJheSk7XG4gICAgaWYgKHNldCkge1xuICAgICAgcmV0dXJuIHNldFRvQXJyYXkoc2V0KTtcbiAgICB9XG4gICAgaXNDb21tb24gPSBmYWxzZTtcbiAgICBpbmNsdWRlcyA9IGNhY2hlSGFzO1xuICAgIHNlZW4gPSBuZXcgU2V0Q2FjaGU7XG4gIH1cbiAgZWxzZSB7XG4gICAgc2VlbiA9IGl0ZXJhdGVlID8gW10gOiByZXN1bHQ7XG4gIH1cbiAgb3V0ZXI6XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdLFxuICAgICAgICBjb21wdXRlZCA9IGl0ZXJhdGVlID8gaXRlcmF0ZWUodmFsdWUpIDogdmFsdWU7XG5cbiAgICB2YWx1ZSA9IChjb21wYXJhdG9yIHx8IHZhbHVlICE9PSAwKSA/IHZhbHVlIDogMDtcbiAgICBpZiAoaXNDb21tb24gJiYgY29tcHV0ZWQgPT09IGNvbXB1dGVkKSB7XG4gICAgICB2YXIgc2VlbkluZGV4ID0gc2Vlbi5sZW5ndGg7XG4gICAgICB3aGlsZSAoc2VlbkluZGV4LS0pIHtcbiAgICAgICAgaWYgKHNlZW5bc2VlbkluZGV4XSA9PT0gY29tcHV0ZWQpIHtcbiAgICAgICAgICBjb250aW51ZSBvdXRlcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGl0ZXJhdGVlKSB7XG4gICAgICAgIHNlZW4ucHVzaChjb21wdXRlZCk7XG4gICAgICB9XG4gICAgICByZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKCFpbmNsdWRlcyhzZWVuLCBjb21wdXRlZCwgY29tcGFyYXRvcikpIHtcbiAgICAgIGlmIChzZWVuICE9PSByZXN1bHQpIHtcbiAgICAgICAgc2Vlbi5wdXNoKGNvbXB1dGVkKTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlVW5pcTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///414\n")},function(module,exports,__webpack_require__){eval("var baseIndexOf = __webpack_require__(416);\n\n/**\n * A specialized version of `_.includes` for arrays without support for\n * specifying an index to search from.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\n */\nfunction arrayIncludes(array, value) {\n var length = array == null ? 0 : array.length;\n return !!length && baseIndexOf(array, value, 0) > -1;\n}\n\nmodule.exports = arrayIncludes;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19hcnJheUluY2x1ZGVzLmpzPzhkYjMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsa0JBQWtCLG1CQUFPLENBQUMsR0FBZ0I7O0FBRTFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE1BQU07QUFDakIsV0FBVyxFQUFFO0FBQ2IsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJmaWxlIjoiNDE1LmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIGJhc2VJbmRleE9mID0gcmVxdWlyZSgnLi9fYmFzZUluZGV4T2YnKTtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uaW5jbHVkZXNgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvclxuICogc3BlY2lmeWluZyBhbiBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7Kn0gdGFyZ2V0IFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB0YXJnZXRgIGlzIGZvdW5kLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGFycmF5SW5jbHVkZXMoYXJyYXksIHZhbHVlKSB7XG4gIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgcmV0dXJuICEhbGVuZ3RoICYmIGJhc2VJbmRleE9mKGFycmF5LCB2YWx1ZSwgMCkgPiAtMTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhcnJheUluY2x1ZGVzO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///415\n")},function(module,exports,__webpack_require__){eval("var baseFindIndex = __webpack_require__(225),\n baseIsNaN = __webpack_require__(417),\n strictIndexOf = __webpack_require__(418);\n\n/**\n * The base implementation of `_.indexOf` without `fromIndex` bounds checks.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction baseIndexOf(array, value, fromIndex) {\n return value === value\n ? strictIndexOf(array, value, fromIndex)\n : baseFindIndex(array, baseIsNaN, fromIndex);\n}\n\nmodule.exports = baseIndexOf;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlSW5kZXhPZi5qcz80N2Y1Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLG9CQUFvQixtQkFBTyxDQUFDLEdBQWtCO0FBQzlDLGdCQUFnQixtQkFBTyxDQUFDLEdBQWM7QUFDdEMsb0JBQW9CLG1CQUFPLENBQUMsR0FBa0I7O0FBRTlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxNQUFNO0FBQ2pCLFdBQVcsRUFBRTtBQUNiLFdBQVcsT0FBTztBQUNsQixhQUFhLE9BQU87QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwiZmlsZSI6IjQxNi5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBiYXNlRmluZEluZGV4ID0gcmVxdWlyZSgnLi9fYmFzZUZpbmRJbmRleCcpLFxuICAgIGJhc2VJc05hTiA9IHJlcXVpcmUoJy4vX2Jhc2VJc05hTicpLFxuICAgIHN0cmljdEluZGV4T2YgPSByZXF1aXJlKCcuL19zdHJpY3RJbmRleE9mJyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaW5kZXhPZmAgd2l0aG91dCBgZnJvbUluZGV4YCBib3VuZHMgY2hlY2tzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4IFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VJbmRleE9mKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4KSB7XG4gIHJldHVybiB2YWx1ZSA9PT0gdmFsdWVcbiAgICA/IHN0cmljdEluZGV4T2YoYXJyYXksIHZhbHVlLCBmcm9tSW5kZXgpXG4gICAgOiBiYXNlRmluZEluZGV4KGFycmF5LCBiYXNlSXNOYU4sIGZyb21JbmRleCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUluZGV4T2Y7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///416\n")},function(module,exports){eval("/**\n * The base implementation of `_.isNaN` without support for number objects.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n */\nfunction baseIsNaN(value) {\n return value !== value;\n}\n\nmodule.exports = baseIsNaN;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlSXNOYU4uanM/ZDlhOCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsRUFBRTtBQUNiLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsImZpbGUiOiI0MTcuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzTmFOYCB3aXRob3V0IHN1cHBvcnQgZm9yIG51bWJlciBvYmplY3RzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGBOYU5gLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VJc05hTih2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgIT09IHZhbHVlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VJc05hTjtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///417\n")},function(module,exports){eval("/**\n * A specialized version of `_.indexOf` which performs strict equality\n * comparisons of values, i.e. `===`.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction strictIndexOf(array, value, fromIndex) {\n var index = fromIndex - 1,\n length = array.length;\n\n while (++index < length) {\n if (array[index] === value) {\n return index;\n }\n }\n return -1;\n}\n\nmodule.exports = strictIndexOf;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19zdHJpY3RJbmRleE9mLmpzPzA5OWEiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsTUFBTTtBQUNqQixXQUFXLEVBQUU7QUFDYixXQUFXLE9BQU87QUFDbEIsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwiZmlsZSI6IjQxOC5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLmluZGV4T2ZgIHdoaWNoIHBlcmZvcm1zIHN0cmljdCBlcXVhbGl0eVxuICogY29tcGFyaXNvbnMgb2YgdmFsdWVzLCBpLmUuIGA9PT1gLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4IFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gKi9cbmZ1bmN0aW9uIHN0cmljdEluZGV4T2YoYXJyYXksIHZhbHVlLCBmcm9tSW5kZXgpIHtcbiAgdmFyIGluZGV4ID0gZnJvbUluZGV4IC0gMSxcbiAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIGlmIChhcnJheVtpbmRleF0gPT09IHZhbHVlKSB7XG4gICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuICB9XG4gIHJldHVybiAtMTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdHJpY3RJbmRleE9mO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///418\n")},function(module,exports){eval("/**\n * This function is like `arrayIncludes` except that it accepts a comparator.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @param {Function} comparator The comparator invoked per element.\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\n */\nfunction arrayIncludesWith(array, value, comparator) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (comparator(value, array[index])) {\n return true;\n }\n }\n return false;\n}\n\nmodule.exports = arrayIncludesWith;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19hcnJheUluY2x1ZGVzV2l0aC5qcz81ZWRmIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxNQUFNO0FBQ2pCLFdBQVcsRUFBRTtBQUNiLFdBQVcsU0FBUztBQUNwQixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJmaWxlIjoiNDE5LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIGxpa2UgYGFycmF5SW5jbHVkZXNgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYSBjb21wYXJhdG9yLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHsqfSB0YXJnZXQgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjb21wYXJhdG9yIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHRhcmdldGAgaXMgZm91bmQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYXJyYXlJbmNsdWRlc1dpdGgoYXJyYXksIHZhbHVlLCBjb21wYXJhdG9yKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICBpZiAoY29tcGFyYXRvcih2YWx1ZSwgYXJyYXlbaW5kZXhdKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhcnJheUluY2x1ZGVzV2l0aDtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///419\n")},function(module,exports,__webpack_require__){eval("var Set = __webpack_require__(199),\n noop = __webpack_require__(421),\n setToArray = __webpack_require__(166);\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/**\n * Creates a set object of `values`.\n *\n * @private\n * @param {Array} values The values to add to the set.\n * @returns {Object} Returns the new set.\n */\nvar createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) {\n return new Set(values);\n};\n\nmodule.exports = createSet;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jcmVhdGVTZXQuanM/NzUwYSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxVQUFVLG1CQUFPLENBQUMsR0FBUTtBQUMxQixXQUFXLG1CQUFPLENBQUMsR0FBUTtBQUMzQixpQkFBaUIsbUJBQU8sQ0FBQyxHQUFlOztBQUV4QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxNQUFNO0FBQ2pCLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsImZpbGUiOiI0MjAuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgU2V0ID0gcmVxdWlyZSgnLi9fU2V0JyksXG4gICAgbm9vcCA9IHJlcXVpcmUoJy4vbm9vcCcpLFxuICAgIHNldFRvQXJyYXkgPSByZXF1aXJlKCcuL19zZXRUb0FycmF5Jyk7XG5cbi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIElORklOSVRZID0gMSAvIDA7XG5cbi8qKlxuICogQ3JlYXRlcyBhIHNldCBvYmplY3Qgb2YgYHZhbHVlc2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlcyBUaGUgdmFsdWVzIHRvIGFkZCB0byB0aGUgc2V0LlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IHNldC5cbiAqL1xudmFyIGNyZWF0ZVNldCA9ICEoU2V0ICYmICgxIC8gc2V0VG9BcnJheShuZXcgU2V0KFssLTBdKSlbMV0pID09IElORklOSVRZKSA/IG5vb3AgOiBmdW5jdGlvbih2YWx1ZXMpIHtcbiAgcmV0dXJuIG5ldyBTZXQodmFsdWVzKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gY3JlYXRlU2V0O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///420\n")},function(module,exports){eval("/**\n * This method returns `undefined`.\n *\n * @static\n * @memberOf _\n * @since 2.3.0\n * @category Util\n * @example\n *\n * _.times(2, _.noop);\n * // => [undefined, undefined]\n */\nfunction noop() {\n // No operation performed.\n}\n\nmodule.exports = noop;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL25vb3AuanM/YmNkZiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJmaWxlIjoiNDIxLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUaGlzIG1ldGhvZCByZXR1cm5zIGB1bmRlZmluZWRgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMi4zLjBcbiAqIEBjYXRlZ29yeSBVdGlsXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udGltZXMoMiwgXy5ub29wKTtcbiAqIC8vID0+IFt1bmRlZmluZWQsIHVuZGVmaW5lZF1cbiAqL1xuZnVuY3Rpb24gbm9vcCgpIHtcbiAgLy8gTm8gb3BlcmF0aW9uIHBlcmZvcm1lZC5cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBub29wO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///421\n")},function(module,exports,__webpack_require__){eval("var arrayMap = __webpack_require__(113);\n\n/**\n * The base implementation of `_.values` and `_.valuesIn` which creates an\n * array of `object` property values corresponding to the property names\n * of `props`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array} props The property names to get values for.\n * @returns {Object} Returns the array of property values.\n */\nfunction baseValues(object, props) {\n return arrayMap(props, function(key) {\n return object[key];\n });\n}\n\nmodule.exports = baseValues;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlVmFsdWVzLmpzPzI2NmEiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsZUFBZSxtQkFBTyxDQUFDLEdBQWE7O0FBRXBDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixXQUFXLE1BQU07QUFDakIsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBIiwiZmlsZSI6IjQyMi5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBhcnJheU1hcCA9IHJlcXVpcmUoJy4vX2FycmF5TWFwJyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udmFsdWVzYCBhbmQgYF8udmFsdWVzSW5gIHdoaWNoIGNyZWF0ZXMgYW5cbiAqIGFycmF5IG9mIGBvYmplY3RgIHByb3BlcnR5IHZhbHVlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBwcm9wZXJ0eSBuYW1lc1xuICogb2YgYHByb3BzYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtBcnJheX0gcHJvcHMgVGhlIHByb3BlcnR5IG5hbWVzIHRvIGdldCB2YWx1ZXMgZm9yLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgdmFsdWVzLlxuICovXG5mdW5jdGlvbiBiYXNlVmFsdWVzKG9iamVjdCwgcHJvcHMpIHtcbiAgcmV0dXJuIGFycmF5TWFwKHByb3BzLCBmdW5jdGlvbihrZXkpIHtcbiAgICByZXR1cm4gb2JqZWN0W2tleV07XG4gIH0pO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VWYWx1ZXM7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///422\n")},function(module,exports){eval("module.exports = '2.1.8';\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZ3JhcGhsaWIvbGliL3ZlcnNpb24uanM/YzNjZCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSIsImZpbGUiOiI0MjMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9ICcyLjEuOCc7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///423\n")},function(module,exports,__webpack_require__){eval("var _ = __webpack_require__(42);\nvar Graph = __webpack_require__(152);\n\nmodule.exports = {\n write: write,\n read: read\n};\n\nfunction write(g) {\n var json = {\n options: {\n directed: g.isDirected(),\n multigraph: g.isMultigraph(),\n compound: g.isCompound()\n },\n nodes: writeNodes(g),\n edges: writeEdges(g)\n };\n if (!_.isUndefined(g.graph())) {\n json.value = _.clone(g.graph());\n }\n return json;\n}\n\nfunction writeNodes(g) {\n return _.map(g.nodes(), function(v) {\n var nodeValue = g.node(v);\n var parent = g.parent(v);\n var node = { v: v };\n if (!_.isUndefined(nodeValue)) {\n node.value = nodeValue;\n }\n if (!_.isUndefined(parent)) {\n node.parent = parent;\n }\n return node;\n });\n}\n\nfunction writeEdges(g) {\n return _.map(g.edges(), function(e) {\n var edgeValue = g.edge(e);\n var edge = { v: e.v, w: e.w };\n if (!_.isUndefined(e.name)) {\n edge.name = e.name;\n }\n if (!_.isUndefined(edgeValue)) {\n edge.value = edgeValue;\n }\n return edge;\n });\n}\n\nfunction read(json) {\n var g = new Graph(json.options).setGraph(json.value);\n _.each(json.nodes, function(entry) {\n g.setNode(entry.v, entry.value);\n if (entry.parent) {\n g.setParent(entry.v, entry.parent);\n }\n });\n _.each(json.edges, function(entry) {\n g.setEdge({ v: entry.v, w: entry.w, name: entry.name }, entry.value);\n });\n return g;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZ3JhcGhsaWIvbGliL2pzb24uanM/MTliMiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxRQUFRLG1CQUFPLENBQUMsRUFBVTtBQUMxQixZQUFZLG1CQUFPLENBQUMsR0FBUzs7QUFFN0I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsZUFBZSwyQ0FBMkM7QUFDMUQsR0FBRztBQUNIO0FBQ0EiLCJmaWxlIjoiNDI0LmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIF8gPSByZXF1aXJlKFwiLi9sb2Rhc2hcIik7XG52YXIgR3JhcGggPSByZXF1aXJlKFwiLi9ncmFwaFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHdyaXRlOiB3cml0ZSxcbiAgcmVhZDogcmVhZFxufTtcblxuZnVuY3Rpb24gd3JpdGUoZykge1xuICB2YXIganNvbiA9IHtcbiAgICBvcHRpb25zOiB7XG4gICAgICBkaXJlY3RlZDogZy5pc0RpcmVjdGVkKCksXG4gICAgICBtdWx0aWdyYXBoOiBnLmlzTXVsdGlncmFwaCgpLFxuICAgICAgY29tcG91bmQ6IGcuaXNDb21wb3VuZCgpXG4gICAgfSxcbiAgICBub2Rlczogd3JpdGVOb2RlcyhnKSxcbiAgICBlZGdlczogd3JpdGVFZGdlcyhnKVxuICB9O1xuICBpZiAoIV8uaXNVbmRlZmluZWQoZy5ncmFwaCgpKSkge1xuICAgIGpzb24udmFsdWUgPSBfLmNsb25lKGcuZ3JhcGgoKSk7XG4gIH1cbiAgcmV0dXJuIGpzb247XG59XG5cbmZ1bmN0aW9uIHdyaXRlTm9kZXMoZykge1xuICByZXR1cm4gXy5tYXAoZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgdmFyIG5vZGVWYWx1ZSA9IGcubm9kZSh2KTtcbiAgICB2YXIgcGFyZW50ID0gZy5wYXJlbnQodik7XG4gICAgdmFyIG5vZGUgPSB7IHY6IHYgfTtcbiAgICBpZiAoIV8uaXNVbmRlZmluZWQobm9kZVZhbHVlKSkge1xuICAgICAgbm9kZS52YWx1ZSA9IG5vZGVWYWx1ZTtcbiAgICB9XG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmVudCkpIHtcbiAgICAgIG5vZGUucGFyZW50ID0gcGFyZW50O1xuICAgIH1cbiAgICByZXR1cm4gbm9kZTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHdyaXRlRWRnZXMoZykge1xuICByZXR1cm4gXy5tYXAoZy5lZGdlcygpLCBmdW5jdGlvbihlKSB7XG4gICAgdmFyIGVkZ2VWYWx1ZSA9IGcuZWRnZShlKTtcbiAgICB2YXIgZWRnZSA9IHsgdjogZS52LCB3OiBlLncgfTtcbiAgICBpZiAoIV8uaXNVbmRlZmluZWQoZS5uYW1lKSkge1xuICAgICAgZWRnZS5uYW1lID0gZS5uYW1lO1xuICAgIH1cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQoZWRnZVZhbHVlKSkge1xuICAgICAgZWRnZS52YWx1ZSA9IGVkZ2VWYWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGVkZ2U7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZWFkKGpzb24pIHtcbiAgdmFyIGcgPSBuZXcgR3JhcGgoanNvbi5vcHRpb25zKS5zZXRHcmFwaChqc29uLnZhbHVlKTtcbiAgXy5lYWNoKGpzb24ubm9kZXMsIGZ1bmN0aW9uKGVudHJ5KSB7XG4gICAgZy5zZXROb2RlKGVudHJ5LnYsIGVudHJ5LnZhbHVlKTtcbiAgICBpZiAoZW50cnkucGFyZW50KSB7XG4gICAgICBnLnNldFBhcmVudChlbnRyeS52LCBlbnRyeS5wYXJlbnQpO1xuICAgIH1cbiAgfSk7XG4gIF8uZWFjaChqc29uLmVkZ2VzLCBmdW5jdGlvbihlbnRyeSkge1xuICAgIGcuc2V0RWRnZSh7IHY6IGVudHJ5LnYsIHc6IGVudHJ5LncsIG5hbWU6IGVudHJ5Lm5hbWUgfSwgZW50cnkudmFsdWUpO1xuICB9KTtcbiAgcmV0dXJuIGc7XG59XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///424\n")},function(module,exports,__webpack_require__){eval("module.exports = {\n components: __webpack_require__(426),\n dijkstra: __webpack_require__(228),\n dijkstraAll: __webpack_require__(427),\n findCycles: __webpack_require__(428),\n floydWarshall: __webpack_require__(429),\n isAcyclic: __webpack_require__(430),\n postorder: __webpack_require__(431),\n preorder: __webpack_require__(432),\n prim: __webpack_require__(433),\n tarjan: __webpack_require__(230),\n topsort: __webpack_require__(231)\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZ3JhcGhsaWIvbGliL2FsZy9pbmRleC5qcz9kODlmIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0EsY0FBYyxtQkFBTyxDQUFDLEdBQWM7QUFDcEMsWUFBWSxtQkFBTyxDQUFDLEdBQVk7QUFDaEMsZUFBZSxtQkFBTyxDQUFDLEdBQWdCO0FBQ3ZDLGNBQWMsbUJBQU8sQ0FBQyxHQUFlO0FBQ3JDLGlCQUFpQixtQkFBTyxDQUFDLEdBQWtCO0FBQzNDLGFBQWEsbUJBQU8sQ0FBQyxHQUFjO0FBQ25DLGFBQWEsbUJBQU8sQ0FBQyxHQUFhO0FBQ2xDLFlBQVksbUJBQU8sQ0FBQyxHQUFZO0FBQ2hDLFFBQVEsbUJBQU8sQ0FBQyxHQUFRO0FBQ3hCLFVBQVUsbUJBQU8sQ0FBQyxHQUFVO0FBQzVCLFdBQVcsbUJBQU8sQ0FBQyxHQUFXO0FBQzlCIiwiZmlsZSI6IjQyNS5qcyIsInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0ge1xuICBjb21wb25lbnRzOiByZXF1aXJlKFwiLi9jb21wb25lbnRzXCIpLFxuICBkaWprc3RyYTogcmVxdWlyZShcIi4vZGlqa3N0cmFcIiksXG4gIGRpamtzdHJhQWxsOiByZXF1aXJlKFwiLi9kaWprc3RyYS1hbGxcIiksXG4gIGZpbmRDeWNsZXM6IHJlcXVpcmUoXCIuL2ZpbmQtY3ljbGVzXCIpLFxuICBmbG95ZFdhcnNoYWxsOiByZXF1aXJlKFwiLi9mbG95ZC13YXJzaGFsbFwiKSxcbiAgaXNBY3ljbGljOiByZXF1aXJlKFwiLi9pcy1hY3ljbGljXCIpLFxuICBwb3N0b3JkZXI6IHJlcXVpcmUoXCIuL3Bvc3RvcmRlclwiKSxcbiAgcHJlb3JkZXI6IHJlcXVpcmUoXCIuL3ByZW9yZGVyXCIpLFxuICBwcmltOiByZXF1aXJlKFwiLi9wcmltXCIpLFxuICB0YXJqYW46IHJlcXVpcmUoXCIuL3RhcmphblwiKSxcbiAgdG9wc29ydDogcmVxdWlyZShcIi4vdG9wc29ydFwiKVxufTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///425\n")},function(module,exports,__webpack_require__){eval("var _ = __webpack_require__(42);\n\nmodule.exports = components;\n\nfunction components(g) {\n var visited = {};\n var cmpts = [];\n var cmpt;\n\n function dfs(v) {\n if (_.has(visited, v)) return;\n visited[v] = true;\n cmpt.push(v);\n _.each(g.successors(v), dfs);\n _.each(g.predecessors(v), dfs);\n }\n\n _.each(g.nodes(), function(v) {\n cmpt = [];\n dfs(v);\n if (cmpt.length) {\n cmpts.push(cmpt);\n }\n });\n\n return cmpts;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZ3JhcGhsaWIvbGliL2FsZy9jb21wb25lbnRzLmpzP2U0NGEiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsUUFBUSxtQkFBTyxDQUFDLEVBQVc7O0FBRTNCOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQSIsImZpbGUiOiI0MjYuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgXyA9IHJlcXVpcmUoXCIuLi9sb2Rhc2hcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gY29tcG9uZW50cztcblxuZnVuY3Rpb24gY29tcG9uZW50cyhnKSB7XG4gIHZhciB2aXNpdGVkID0ge307XG4gIHZhciBjbXB0cyA9IFtdO1xuICB2YXIgY21wdDtcblxuICBmdW5jdGlvbiBkZnModikge1xuICAgIGlmIChfLmhhcyh2aXNpdGVkLCB2KSkgcmV0dXJuO1xuICAgIHZpc2l0ZWRbdl0gPSB0cnVlO1xuICAgIGNtcHQucHVzaCh2KTtcbiAgICBfLmVhY2goZy5zdWNjZXNzb3JzKHYpLCBkZnMpO1xuICAgIF8uZWFjaChnLnByZWRlY2Vzc29ycyh2KSwgZGZzKTtcbiAgfVxuXG4gIF8uZWFjaChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICBjbXB0ID0gW107XG4gICAgZGZzKHYpO1xuICAgIGlmIChjbXB0Lmxlbmd0aCkge1xuICAgICAgY21wdHMucHVzaChjbXB0KTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBjbXB0cztcbn1cbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///426\n")},function(module,exports,__webpack_require__){eval("var dijkstra = __webpack_require__(228);\nvar _ = __webpack_require__(42);\n\nmodule.exports = dijkstraAll;\n\nfunction dijkstraAll(g, weightFunc, edgeFunc) {\n return _.transform(g.nodes(), function(acc, v) {\n acc[v] = dijkstra(g, v, weightFunc, edgeFunc);\n }, {});\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZ3JhcGhsaWIvbGliL2FsZy9kaWprc3RyYS1hbGwuanM/ZDMxMiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxlQUFlLG1CQUFPLENBQUMsR0FBWTtBQUNuQyxRQUFRLG1CQUFPLENBQUMsRUFBVzs7QUFFM0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRyxJQUFJO0FBQ1AiLCJmaWxlIjoiNDI3LmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIGRpamtzdHJhID0gcmVxdWlyZShcIi4vZGlqa3N0cmFcIik7XG52YXIgXyA9IHJlcXVpcmUoXCIuLi9sb2Rhc2hcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gZGlqa3N0cmFBbGw7XG5cbmZ1bmN0aW9uIGRpamtzdHJhQWxsKGcsIHdlaWdodEZ1bmMsIGVkZ2VGdW5jKSB7XG4gIHJldHVybiBfLnRyYW5zZm9ybShnLm5vZGVzKCksIGZ1bmN0aW9uKGFjYywgdikge1xuICAgIGFjY1t2XSA9IGRpamtzdHJhKGcsIHYsIHdlaWdodEZ1bmMsIGVkZ2VGdW5jKTtcbiAgfSwge30pO1xufVxuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///427\n")},function(module,exports,__webpack_require__){eval("var _ = __webpack_require__(42);\nvar tarjan = __webpack_require__(230);\n\nmodule.exports = findCycles;\n\nfunction findCycles(g) {\n return _.filter(tarjan(g), function(cmpt) {\n return cmpt.length > 1 || (cmpt.length === 1 && g.hasEdge(cmpt[0], cmpt[0]));\n });\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZ3JhcGhsaWIvbGliL2FsZy9maW5kLWN5Y2xlcy5qcz9kZGFjIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFFBQVEsbUJBQU8sQ0FBQyxFQUFXO0FBQzNCLGFBQWEsbUJBQU8sQ0FBQyxHQUFVOztBQUUvQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0giLCJmaWxlIjoiNDI4LmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xudmFyIHRhcmphbiA9IHJlcXVpcmUoXCIuL3RhcmphblwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmaW5kQ3ljbGVzO1xuXG5mdW5jdGlvbiBmaW5kQ3ljbGVzKGcpIHtcbiAgcmV0dXJuIF8uZmlsdGVyKHRhcmphbihnKSwgZnVuY3Rpb24oY21wdCkge1xuICAgIHJldHVybiBjbXB0Lmxlbmd0aCA+IDEgfHwgKGNtcHQubGVuZ3RoID09PSAxICYmIGcuaGFzRWRnZShjbXB0WzBdLCBjbXB0WzBdKSk7XG4gIH0pO1xufVxuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///428\n")},function(module,exports,__webpack_require__){eval("var _ = __webpack_require__(42);\n\nmodule.exports = floydWarshall;\n\nvar DEFAULT_WEIGHT_FUNC = _.constant(1);\n\nfunction floydWarshall(g, weightFn, edgeFn) {\n return runFloydWarshall(g,\n weightFn || DEFAULT_WEIGHT_FUNC,\n edgeFn || function(v) { return g.outEdges(v); });\n}\n\nfunction runFloydWarshall(g, weightFn, edgeFn) {\n var results = {};\n var nodes = g.nodes();\n\n nodes.forEach(function(v) {\n results[v] = {};\n results[v][v] = { distance: 0 };\n nodes.forEach(function(w) {\n if (v !== w) {\n results[v][w] = { distance: Number.POSITIVE_INFINITY };\n }\n });\n edgeFn(v).forEach(function(edge) {\n var w = edge.v === v ? edge.w : edge.v;\n var d = weightFn(edge);\n results[v][w] = { distance: d, predecessor: v };\n });\n });\n\n nodes.forEach(function(k) {\n var rowK = results[k];\n nodes.forEach(function(i) {\n var rowI = results[i];\n nodes.forEach(function(j) {\n var ik = rowI[k];\n var kj = rowK[j];\n var ij = rowI[j];\n var altDistance = ik.distance + kj.distance;\n if (altDistance < ij.distance) {\n ij.distance = altDistance;\n ij.predecessor = kj.predecessor;\n }\n });\n });\n });\n\n return results;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZ3JhcGhsaWIvbGliL2FsZy9mbG95ZC13YXJzaGFsbC5qcz82NzM2Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFFBQVEsbUJBQU8sQ0FBQyxFQUFXOztBQUUzQjs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsc0JBQXNCLEVBQUU7QUFDbkQ7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSx1QkFBdUI7QUFDdkIsS0FBSztBQUNMLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMLEdBQUc7O0FBRUg7QUFDQSIsImZpbGUiOiI0MjkuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgXyA9IHJlcXVpcmUoXCIuLi9sb2Rhc2hcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gZmxveWRXYXJzaGFsbDtcblxudmFyIERFRkFVTFRfV0VJR0hUX0ZVTkMgPSBfLmNvbnN0YW50KDEpO1xuXG5mdW5jdGlvbiBmbG95ZFdhcnNoYWxsKGcsIHdlaWdodEZuLCBlZGdlRm4pIHtcbiAgcmV0dXJuIHJ1bkZsb3lkV2Fyc2hhbGwoZyxcbiAgICB3ZWlnaHRGbiB8fCBERUZBVUxUX1dFSUdIVF9GVU5DLFxuICAgIGVkZ2VGbiB8fCBmdW5jdGlvbih2KSB7IHJldHVybiBnLm91dEVkZ2VzKHYpOyB9KTtcbn1cblxuZnVuY3Rpb24gcnVuRmxveWRXYXJzaGFsbChnLCB3ZWlnaHRGbiwgZWRnZUZuKSB7XG4gIHZhciByZXN1bHRzID0ge307XG4gIHZhciBub2RlcyA9IGcubm9kZXMoKTtcblxuICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKHYpIHtcbiAgICByZXN1bHRzW3ZdID0ge307XG4gICAgcmVzdWx0c1t2XVt2XSA9IHsgZGlzdGFuY2U6IDAgfTtcbiAgICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKHcpIHtcbiAgICAgIGlmICh2ICE9PSB3KSB7XG4gICAgICAgIHJlc3VsdHNbdl1bd10gPSB7IGRpc3RhbmNlOiBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkgfTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBlZGdlRm4odikuZm9yRWFjaChmdW5jdGlvbihlZGdlKSB7XG4gICAgICB2YXIgdyA9IGVkZ2UudiA9PT0gdiA/IGVkZ2UudyA6IGVkZ2UudjtcbiAgICAgIHZhciBkID0gd2VpZ2h0Rm4oZWRnZSk7XG4gICAgICByZXN1bHRzW3ZdW3ddID0geyBkaXN0YW5jZTogZCwgcHJlZGVjZXNzb3I6IHYgfTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgbm9kZXMuZm9yRWFjaChmdW5jdGlvbihrKSB7XG4gICAgdmFyIHJvd0sgPSByZXN1bHRzW2tdO1xuICAgIG5vZGVzLmZvckVhY2goZnVuY3Rpb24oaSkge1xuICAgICAgdmFyIHJvd0kgPSByZXN1bHRzW2ldO1xuICAgICAgbm9kZXMuZm9yRWFjaChmdW5jdGlvbihqKSB7XG4gICAgICAgIHZhciBpayA9IHJvd0lba107XG4gICAgICAgIHZhciBraiA9IHJvd0tbal07XG4gICAgICAgIHZhciBpaiA9IHJvd0lbal07XG4gICAgICAgIHZhciBhbHREaXN0YW5jZSA9IGlrLmRpc3RhbmNlICsga2ouZGlzdGFuY2U7XG4gICAgICAgIGlmIChhbHREaXN0YW5jZSA8IGlqLmRpc3RhbmNlKSB7XG4gICAgICAgICAgaWouZGlzdGFuY2UgPSBhbHREaXN0YW5jZTtcbiAgICAgICAgICBpai5wcmVkZWNlc3NvciA9IGtqLnByZWRlY2Vzc29yO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgcmV0dXJuIHJlc3VsdHM7XG59XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///429\n")},function(module,exports,__webpack_require__){eval("var topsort = __webpack_require__(231);\n\nmodule.exports = isAcyclic;\n\nfunction isAcyclic(g) {\n try {\n topsort(g);\n } catch (e) {\n if (e instanceof topsort.CycleException) {\n return false;\n }\n throw e;\n }\n return true;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZ3JhcGhsaWIvbGliL2FsZy9pcy1hY3ljbGljLmpzPzQzZTgiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxtQkFBTyxDQUFDLEdBQVc7O0FBRWpDOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiI0MzAuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgdG9wc29ydCA9IHJlcXVpcmUoXCIuL3RvcHNvcnRcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gaXNBY3ljbGljO1xuXG5mdW5jdGlvbiBpc0FjeWNsaWMoZykge1xuICB0cnkge1xuICAgIHRvcHNvcnQoZyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoZSBpbnN0YW5jZW9mIHRvcHNvcnQuQ3ljbGVFeGNlcHRpb24pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdGhyb3cgZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///430\n")},function(module,exports,__webpack_require__){eval('var dfs = __webpack_require__(232);\n\nmodule.exports = postorder;\n\nfunction postorder(g, vs) {\n return dfs(g, vs, "post");\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZ3JhcGhsaWIvbGliL2FsZy9wb3N0b3JkZXIuanM/NGYxNyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxVQUFVLG1CQUFPLENBQUMsR0FBTzs7QUFFekI7O0FBRUE7QUFDQTtBQUNBIiwiZmlsZSI6IjQzMS5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBkZnMgPSByZXF1aXJlKFwiLi9kZnNcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gcG9zdG9yZGVyO1xuXG5mdW5jdGlvbiBwb3N0b3JkZXIoZywgdnMpIHtcbiAgcmV0dXJuIGRmcyhnLCB2cywgXCJwb3N0XCIpO1xufVxuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///431\n')},function(module,exports,__webpack_require__){eval('var dfs = __webpack_require__(232);\n\nmodule.exports = preorder;\n\nfunction preorder(g, vs) {\n return dfs(g, vs, "pre");\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZ3JhcGhsaWIvbGliL2FsZy9wcmVvcmRlci5qcz9hYWY5Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFVBQVUsbUJBQU8sQ0FBQyxHQUFPOztBQUV6Qjs7QUFFQTtBQUNBO0FBQ0EiLCJmaWxlIjoiNDMyLmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIGRmcyA9IHJlcXVpcmUoXCIuL2Rmc1wiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwcmVvcmRlcjtcblxuZnVuY3Rpb24gcHJlb3JkZXIoZywgdnMpIHtcbiAgcmV0dXJuIGRmcyhnLCB2cywgXCJwcmVcIik7XG59XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///432\n')},function(module,exports,__webpack_require__){eval('var _ = __webpack_require__(42);\nvar Graph = __webpack_require__(152);\nvar PriorityQueue = __webpack_require__(229);\n\nmodule.exports = prim;\n\nfunction prim(g, weightFunc) {\n var result = new Graph();\n var parents = {};\n var pq = new PriorityQueue();\n var v;\n\n function updateNeighbors(edge) {\n var w = edge.v === v ? edge.w : edge.v;\n var pri = pq.priority(w);\n if (pri !== undefined) {\n var edgeWeight = weightFunc(edge);\n if (edgeWeight < pri) {\n parents[w] = v;\n pq.decrease(w, edgeWeight);\n }\n }\n }\n\n if (g.nodeCount() === 0) {\n return result;\n }\n\n _.each(g.nodes(), function(v) {\n pq.add(v, Number.POSITIVE_INFINITY);\n result.setNode(v);\n });\n\n // Start from an arbitrary node\n pq.decrease(g.nodes()[0], 0);\n\n var init = false;\n while (pq.size() > 0) {\n v = pq.removeMin();\n if (_.has(parents, v)) {\n result.setEdge(v, parents[v]);\n } else if (init) {\n throw new Error("Input graph is not connected: " + g);\n } else {\n init = true;\n }\n\n g.nodeEdges(v).forEach(updateNeighbors);\n }\n\n return result;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZ3JhcGhsaWIvbGliL2FsZy9wcmltLmpzPzYxZTkiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsUUFBUSxtQkFBTyxDQUFDLEVBQVc7QUFDM0IsWUFBWSxtQkFBTyxDQUFDLEdBQVU7QUFDOUIsb0JBQW9CLG1CQUFPLENBQUMsR0FBd0I7O0FBRXBEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EiLCJmaWxlIjoiNDMzLmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xudmFyIEdyYXBoID0gcmVxdWlyZShcIi4uL2dyYXBoXCIpO1xudmFyIFByaW9yaXR5UXVldWUgPSByZXF1aXJlKFwiLi4vZGF0YS9wcmlvcml0eS1xdWV1ZVwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwcmltO1xuXG5mdW5jdGlvbiBwcmltKGcsIHdlaWdodEZ1bmMpIHtcbiAgdmFyIHJlc3VsdCA9IG5ldyBHcmFwaCgpO1xuICB2YXIgcGFyZW50cyA9IHt9O1xuICB2YXIgcHEgPSBuZXcgUHJpb3JpdHlRdWV1ZSgpO1xuICB2YXIgdjtcblxuICBmdW5jdGlvbiB1cGRhdGVOZWlnaGJvcnMoZWRnZSkge1xuICAgIHZhciB3ID0gZWRnZS52ID09PSB2ID8gZWRnZS53IDogZWRnZS52O1xuICAgIHZhciBwcmkgPSBwcS5wcmlvcml0eSh3KTtcbiAgICBpZiAocHJpICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhciBlZGdlV2VpZ2h0ID0gd2VpZ2h0RnVuYyhlZGdlKTtcbiAgICAgIGlmIChlZGdlV2VpZ2h0IDwgcHJpKSB7XG4gICAgICAgIHBhcmVudHNbd10gPSB2O1xuICAgICAgICBwcS5kZWNyZWFzZSh3LCBlZGdlV2VpZ2h0KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoZy5ub2RlQ291bnQoKSA9PT0gMCkge1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBfLmVhY2goZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgcHEuYWRkKHYsIE51bWJlci5QT1NJVElWRV9JTkZJTklUWSk7XG4gICAgcmVzdWx0LnNldE5vZGUodik7XG4gIH0pO1xuXG4gIC8vIFN0YXJ0IGZyb20gYW4gYXJiaXRyYXJ5IG5vZGVcbiAgcHEuZGVjcmVhc2UoZy5ub2RlcygpWzBdLCAwKTtcblxuICB2YXIgaW5pdCA9IGZhbHNlO1xuICB3aGlsZSAocHEuc2l6ZSgpID4gMCkge1xuICAgIHYgPSBwcS5yZW1vdmVNaW4oKTtcbiAgICBpZiAoXy5oYXMocGFyZW50cywgdikpIHtcbiAgICAgIHJlc3VsdC5zZXRFZGdlKHYsIHBhcmVudHNbdl0pO1xuICAgIH0gZWxzZSBpZiAoaW5pdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW5wdXQgZ3JhcGggaXMgbm90IGNvbm5lY3RlZDogXCIgKyBnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaW5pdCA9IHRydWU7XG4gICAgfVxuXG4gICAgZy5ub2RlRWRnZXModikuZm9yRWFjaCh1cGRhdGVOZWlnaGJvcnMpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///433\n')},function(module,exports,__webpack_require__){"use strict";eval('\n\nvar _ = __webpack_require__(28);\nvar acyclic = __webpack_require__(474);\nvar normalize = __webpack_require__(477);\nvar rank = __webpack_require__(478);\nvar normalizeRanks = __webpack_require__(36).normalizeRanks;\nvar parentDummyChains = __webpack_require__(480);\nvar removeEmptyRanks = __webpack_require__(36).removeEmptyRanks;\nvar nestingGraph = __webpack_require__(481);\nvar addBorderSegments = __webpack_require__(482);\nvar coordinateSystem = __webpack_require__(483);\nvar order = __webpack_require__(484);\nvar position = __webpack_require__(493);\nvar util = __webpack_require__(36);\nvar Graph = __webpack_require__(46).Graph;\nvar initDataOrder = __webpack_require__(495);\n\nmodule.exports = layout;\n\nfunction layout(g, opts) {\n var time = opts && opts.debugTiming ? util.time : util.notime;\n time("layout", function() {\n // 如果在原图基础上修改,继承原图的order结果\n if (opts && !opts.keepNodeOrder && opts.prevGraph) {\n time(" inheritOrder", function() { inheritOrder(g, opts.prevGraph); });\n }\n var layoutGraph = \n time(" buildLayoutGraph", function() { return buildLayoutGraph(g); });\n // 控制是否为边的label留位置(这会影响是否在边中间添加dummy node)\n if (!(opts && (opts.edgeLabelSpace === false))) {\n time(" makeSpaceForEdgeLabels", function() { makeSpaceForEdgeLabels(layoutGraph); });\n }\n // TODO: 暂时处理层级设置不正确时的异常报错,提示设置正确的层级\n try {\n time(" runLayout", function() { runLayout(layoutGraph, time, opts); });\n } catch(e) {\n if (e.message === "Not possible to find intersection inside of the rectangle") {\n console.error(\'The following error may be caused by improper layer setting, please make sure your manual layer setting does not violate the graph\\\'s structure:\\n\', e);\n return;\n } else {\n throw(e);\n }\n }\n time(" updateInputGraph", function() { updateInputGraph(g, layoutGraph); });\n });\n}\n\nfunction runLayout(g, time, opts) {\n time(" removeSelfEdges", function() { removeSelfEdges(g); });\n time(" acyclic", function() { acyclic.run(g); });\n time(" nestingGraph.run", function() { nestingGraph.run(g); });\n time(" rank", function() { rank(util.asNonCompoundGraph(g)); });\n time(" injectEdgeLabelProxies", function() { injectEdgeLabelProxies(g); });\n time(" removeEmptyRanks", function() { removeEmptyRanks(g); });\n time(" nestingGraph.cleanup", function() { nestingGraph.cleanup(g); });\n time(" normalizeRanks", function() { normalizeRanks(g); });\n time(" assignRankMinMax", function() { assignRankMinMax(g); });\n time(" removeEdgeLabelProxies", function() { removeEdgeLabelProxies(g); });\n time(" normalize.run", function() { normalize.run(g); });\n time(" parentDummyChains", function() { parentDummyChains(g); });\n time(" addBorderSegments", function() { addBorderSegments(g); });\n if (opts && opts.keepNodeOrder) {\n time(" initDataOrder", function() { initDataOrder(g, opts.nodeOrder); });\n }\n time(" order", function() { order(g); });\n time(" insertSelfEdges", function() { insertSelfEdges(g); });\n time(" adjustCoordinateSystem", function() { coordinateSystem.adjust(g); });\n time(" position", function() { position(g); });\n time(" positionSelfEdges", function() { positionSelfEdges(g); });\n time(" removeBorderNodes", function() { removeBorderNodes(g); });\n time(" normalize.undo", function() { normalize.undo(g); });\n time(" fixupEdgeLabelCoords", function() { fixupEdgeLabelCoords(g); });\n time(" undoCoordinateSystem", function() { coordinateSystem.undo(g); });\n time(" translateGraph", function() { translateGraph(g); });\n time(" assignNodeIntersects", function() { assignNodeIntersects(g); });\n time(" reversePoints", function() { reversePointsForReversedEdges(g); });\n time(" acyclic.undo", function() { acyclic.undo(g); });\n}\n\n/**\n * 继承上一个布局中的order,防止翻转\n * TODO: 暂时没有考虑涉及层级变动的布局,只保证原来布局层级和相对顺序不变\n */\nfunction inheritOrder(currG, prevG) {\n var prevNodeMap = prevG._nodes;\n _.forEach(currG.nodes(), function (n) {\n var node = currG.node(n);\n if (prevNodeMap[n] !== undefined) {\n node.fixorder = prevNodeMap[n]._order;\n delete prevNodeMap[n]._order;\n } else {\n delete node.fixorder;\n }\n });\n}\n\n/*\n * Copies final layout information from the layout graph back to the input\n * graph. This process only copies whitelisted attributes from the layout graph\n * to the input graph, so it serves as a good place to determine what\n * attributes can influence layout.\n */\nfunction updateInputGraph(inputGraph, layoutGraph) {\n _.forEach(inputGraph.nodes(), function(v) {\n var inputLabel = inputGraph.node(v);\n var layoutLabel = layoutGraph.node(v);\n\n if (inputLabel) {\n inputLabel.x = layoutLabel.x;\n inputLabel.y = layoutLabel.y;\n inputLabel._order = layoutLabel.order;\n inputLabel._rank = layoutLabel.rank;\n\n if (layoutGraph.children(v).length) {\n inputLabel.width = layoutLabel.width;\n inputLabel.height = layoutLabel.height;\n }\n }\n });\n\n _.forEach(inputGraph.edges(), function(e) {\n var inputLabel = inputGraph.edge(e);\n var layoutLabel = layoutGraph.edge(e);\n\n inputLabel.points = layoutLabel.points;\n if (_.has(layoutLabel, "x")) {\n inputLabel.x = layoutLabel.x;\n inputLabel.y = layoutLabel.y;\n }\n });\n\n inputGraph.graph().width = layoutGraph.graph().width;\n inputGraph.graph().height = layoutGraph.graph().height;\n}\n\nvar graphNumAttrs = ["nodesep", "edgesep", "ranksep", "marginx", "marginy"];\nvar graphDefaults = { ranksep: 50, edgesep: 20, nodesep: 50, rankdir: "tb" };\nvar graphAttrs = ["acyclicer", "ranker", "rankdir", "align"];\nvar nodeNumAttrs = ["width", "height", "layer", "fixorder"]; // 需要传入layer, fixOrder作为参数参考\nvar nodeDefaults = { width: 0, height: 0 };\nvar edgeNumAttrs = ["minlen", "weight", "width", "height", "labeloffset"];\nvar edgeDefaults = {\n minlen: 1, weight: 1, width: 0, height: 0,\n labeloffset: 10, labelpos: "r"\n};\nvar edgeAttrs = ["labelpos"];\n\n/*\n * Constructs a new graph from the input graph, which can be used for layout.\n * This process copies only whitelisted attributes from the input graph to the\n * layout graph. Thus this function serves as a good place to determine what\n * attributes can influence layout.\n */\nfunction buildLayoutGraph(inputGraph) {\n var g = new Graph({ multigraph: true, compound: true });\n var graph = canonicalize(inputGraph.graph());\n\n g.setGraph(_.merge({},\n graphDefaults,\n selectNumberAttrs(graph, graphNumAttrs),\n _.pick(graph, graphAttrs)));\n\n _.forEach(inputGraph.nodes(), function(v) {\n var node = canonicalize(inputGraph.node(v));\n g.setNode(v, _.defaults(selectNumberAttrs(node, nodeNumAttrs), nodeDefaults));\n g.setParent(v, inputGraph.parent(v));\n });\n\n _.forEach(inputGraph.edges(), function(e) {\n var edge = canonicalize(inputGraph.edge(e));\n g.setEdge(e, _.merge({},\n edgeDefaults,\n selectNumberAttrs(edge, edgeNumAttrs),\n _.pick(edge, edgeAttrs)));\n });\n\n return g;\n}\n\n/*\n * This idea comes from the Gansner paper: to account for edge labels in our\n * layout we split each rank in half by doubling minlen and halving ranksep.\n * Then we can place labels at these mid-points between nodes.\n *\n * We also add some minimal padding to the width to push the label for the edge\n * away from the edge itself a bit.\n */\nfunction makeSpaceForEdgeLabels(g) {\n var graph = g.graph();\n graph.ranksep /= 2;\n _.forEach(g.nodes(), function(n) {\n var node = g.node(n);\n if (!isNaN(node.layer)) {\n node.layer *= 2; // TODO: 因为默认的rank变为两倍,设定的layer也*2\n }\n });\n _.forEach(g.edges(), function(e) {\n var edge = g.edge(e);\n edge.minlen *= 2;\n if (edge.labelpos.toLowerCase() !== "c") {\n if (graph.rankdir === "TB" || graph.rankdir === "BT") {\n edge.width += edge.labeloffset;\n } else {\n edge.height += edge.labeloffset;\n }\n }\n });\n}\n\n/*\n * Creates temporary dummy nodes that capture the rank in which each edge\'s\n * label is going to, if it has one of non-zero width and height. We do this\n * so that we can safely remove empty ranks while preserving balance for the\n * label\'s position.\n */\nfunction injectEdgeLabelProxies(g) {\n _.forEach(g.edges(), function(e) {\n var edge = g.edge(e);\n if (edge.width && edge.height) {\n var v = g.node(e.v);\n var w = g.node(e.w);\n var label = { rank: (w.rank - v.rank) / 2 + v.rank, e: e };\n util.addDummyNode(g, "edge-proxy", label, "_ep");\n }\n });\n}\n\nfunction assignRankMinMax(g) {\n var maxRank = 0;\n _.forEach(g.nodes(), function(v) {\n var node = g.node(v);\n if (node.borderTop) {\n node.minRank = g.node(node.borderTop).rank;\n node.maxRank = g.node(node.borderBottom).rank;\n maxRank = _.max(maxRank, node.maxRank);\n }\n });\n g.graph().maxRank = maxRank;\n}\n\nfunction removeEdgeLabelProxies(g) {\n _.forEach(g.nodes(), function(v) {\n var node = g.node(v);\n if (node.dummy === "edge-proxy") {\n g.edge(node.e).labelRank = node.rank;\n g.removeNode(v);\n }\n });\n}\n\nfunction translateGraph(g) {\n var minX = Number.POSITIVE_INFINITY;\n var maxX = 0;\n var minY = Number.POSITIVE_INFINITY;\n var maxY = 0;\n var graphLabel = g.graph();\n var marginX = graphLabel.marginx || 0;\n var marginY = graphLabel.marginy || 0;\n\n function getExtremes(attrs) {\n var x = attrs.x;\n var y = attrs.y;\n var w = attrs.width;\n var h = attrs.height;\n minX = Math.min(minX, x - w / 2);\n maxX = Math.max(maxX, x + w / 2);\n minY = Math.min(minY, y - h / 2);\n maxY = Math.max(maxY, y + h / 2);\n }\n\n _.forEach(g.nodes(), function(v) { getExtremes(g.node(v)); });\n _.forEach(g.edges(), function(e) {\n var edge = g.edge(e);\n if (_.has(edge, "x")) {\n getExtremes(edge);\n }\n });\n\n minX -= marginX;\n minY -= marginY;\n\n _.forEach(g.nodes(), function(v) {\n var node = g.node(v);\n node.x -= minX;\n node.y -= minY;\n });\n\n _.forEach(g.edges(), function(e) {\n var edge = g.edge(e);\n _.forEach(edge.points, function(p) {\n p.x -= minX;\n p.y -= minY;\n });\n if (_.has(edge, "x")) { edge.x -= minX; }\n if (_.has(edge, "y")) { edge.y -= minY; }\n });\n\n graphLabel.width = maxX - minX + marginX;\n graphLabel.height = maxY - minY + marginY;\n}\n\nfunction assignNodeIntersects(g) {\n _.forEach(g.edges(), function(e) {\n var edge = g.edge(e);\n var nodeV = g.node(e.v);\n var nodeW = g.node(e.w);\n var p1, p2;\n if (!edge.points) {\n edge.points = [];\n p1 = nodeW;\n p2 = nodeV;\n } else {\n p1 = edge.points[0];\n p2 = edge.points[edge.points.length - 1];\n }\n edge.points.unshift(util.intersectRect(nodeV, p1));\n edge.points.push(util.intersectRect(nodeW, p2));\n });\n}\n\nfunction fixupEdgeLabelCoords(g) {\n _.forEach(g.edges(), function(e) {\n var edge = g.edge(e);\n if (_.has(edge, "x")) {\n if (edge.labelpos === "l" || edge.labelpos === "r") {\n edge.width -= edge.labeloffset;\n }\n switch (edge.labelpos) {\n case "l": edge.x -= edge.width / 2 + edge.labeloffset; break;\n case "r": edge.x += edge.width / 2 + edge.labeloffset; break;\n }\n }\n });\n}\n\nfunction reversePointsForReversedEdges(g) {\n _.forEach(g.edges(), function(e) {\n var edge = g.edge(e);\n if (edge.reversed) {\n edge.points.reverse();\n }\n });\n}\n\nfunction removeBorderNodes(g) {\n _.forEach(g.nodes(), function(v) {\n if (g.children(v).length) {\n var node = g.node(v);\n var t = g.node(node.borderTop);\n var b = g.node(node.borderBottom);\n var l = g.node(_.last(node.borderLeft));\n var r = g.node(_.last(node.borderRight));\n\n node.width = Math.abs(r.x - l.x);\n node.height = Math.abs(b.y - t.y);\n node.x = l.x + node.width / 2;\n node.y = t.y + node.height / 2;\n }\n });\n\n _.forEach(g.nodes(), function(v) {\n if (g.node(v).dummy === "border") {\n g.removeNode(v);\n }\n });\n}\n\nfunction removeSelfEdges(g) {\n _.forEach(g.edges(), function(e) {\n if (e.v === e.w) {\n var node = g.node(e.v);\n if (!node.selfEdges) {\n node.selfEdges = [];\n }\n node.selfEdges.push({ e: e, label: g.edge(e) });\n g.removeEdge(e);\n }\n });\n}\n\nfunction insertSelfEdges(g) {\n var layers = util.buildLayerMatrix(g);\n _.forEach(layers, function(layer) {\n var orderShift = 0;\n _.forEach(layer, function(v, i) {\n var node = g.node(v);\n node.order = i + orderShift;\n _.forEach(node.selfEdges, function(selfEdge) {\n util.addDummyNode(g, "selfedge", {\n width: selfEdge.label.width,\n height: selfEdge.label.height,\n rank: node.rank,\n order: i + (++orderShift),\n e: selfEdge.e,\n label: selfEdge.label\n }, "_se");\n });\n delete node.selfEdges;\n });\n });\n}\n\nfunction positionSelfEdges(g) {\n _.forEach(g.nodes(), function(v) {\n var node = g.node(v);\n if (node.dummy === "selfedge") {\n var selfNode = g.node(node.e.v);\n var x = selfNode.x + selfNode.width / 2;\n var y = selfNode.y;\n var dx = node.x - x;\n var dy = selfNode.height / 2;\n g.setEdge(node.e, node.label);\n g.removeNode(v);\n node.label.points = [\n { x: x + 2 * dx / 3, y: y - dy },\n { x: x + 5 * dx / 6, y: y - dy },\n { x: x + dx , y: y },\n { x: x + 5 * dx / 6, y: y + dy },\n { x: x + 2 * dx / 3, y: y + dy }\n ];\n node.label.x = node.x;\n node.label.y = node.y;\n }\n });\n}\n\nfunction selectNumberAttrs(obj, attrs) {\n return _.mapValues(_.pick(obj, attrs), Number);\n}\n\nfunction canonicalize(attrs) {\n var newAttrs = {};\n _.forEach(attrs, function(v, k) {\n newAttrs[k.toLowerCase()] = v;\n });\n return newAttrs;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZGFncmVqcy9saWIvbGF5b3V0LmpzPzk5YWEiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWIsUUFBUSxtQkFBTyxDQUFDLEVBQVU7QUFDMUIsY0FBYyxtQkFBTyxDQUFDLEdBQVc7QUFDakMsZ0JBQWdCLG1CQUFPLENBQUMsR0FBYTtBQUNyQyxXQUFXLG1CQUFPLENBQUMsR0FBUTtBQUMzQixxQkFBcUIsbUJBQU8sQ0FBQyxFQUFRO0FBQ3JDLHdCQUF3QixtQkFBTyxDQUFDLEdBQXVCO0FBQ3ZELHVCQUF1QixtQkFBTyxDQUFDLEVBQVE7QUFDdkMsbUJBQW1CLG1CQUFPLENBQUMsR0FBaUI7QUFDNUMsd0JBQXdCLG1CQUFPLENBQUMsR0FBdUI7QUFDdkQsdUJBQXVCLG1CQUFPLENBQUMsR0FBcUI7QUFDcEQsWUFBWSxtQkFBTyxDQUFDLEdBQVM7QUFDN0IsZUFBZSxtQkFBTyxDQUFDLEdBQVk7QUFDbkMsV0FBVyxtQkFBTyxDQUFDLEVBQVE7QUFDM0IsWUFBWSxtQkFBTyxDQUFDLEVBQVk7QUFDaEMsb0JBQW9CLG1CQUFPLENBQUMsR0FBeUI7O0FBRXJEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUMsaUNBQWlDLEVBQUU7QUFDNUU7QUFDQTtBQUNBLDZDQUE2Qyw0QkFBNEIsRUFBRTtBQUMzRTtBQUNBO0FBQ0EsbURBQW1ELHFDQUFxQyxFQUFFO0FBQzFGO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QyxvQ0FBb0MsRUFBRTtBQUNuRixLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLDJDQUEyQyxrQ0FBa0MsRUFBRTtBQUMvRSxHQUFHO0FBQ0g7O0FBRUE7QUFDQSxpREFBaUQsb0JBQW9CLEVBQUU7QUFDdkUsaURBQWlELGdCQUFnQixFQUFFO0FBQ25FLGlEQUFpRCxxQkFBcUIsRUFBRTtBQUN4RSxpREFBaUQsa0NBQWtDLEVBQUU7QUFD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QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0REFBNEQ7QUFDNUQsNERBQTREO0FBQzVEO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIseUJBQXlCO0FBQ3BEO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUywrQkFBK0I7QUFDeEMsU0FBUywrQkFBK0I7QUFDeEMsU0FBUywwQkFBMEI7QUFDbkMsU0FBUywrQkFBK0I7QUFDeEMsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBIiwiZmlsZSI6IjQzNC5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG52YXIgXyA9IHJlcXVpcmUoXCIuL2xvZGFzaFwiKTtcbnZhciBhY3ljbGljID0gcmVxdWlyZShcIi4vYWN5Y2xpY1wiKTtcbnZhciBub3JtYWxpemUgPSByZXF1aXJlKFwiLi9ub3JtYWxpemVcIik7XG52YXIgcmFuayA9IHJlcXVpcmUoXCIuL3JhbmtcIik7XG52YXIgbm9ybWFsaXplUmFua3MgPSByZXF1aXJlKFwiLi91dGlsXCIpLm5vcm1hbGl6ZVJhbmtzO1xudmFyIHBhcmVudER1bW15Q2hhaW5zID0gcmVxdWlyZShcIi4vcGFyZW50LWR1bW15LWNoYWluc1wiKTtcbnZhciByZW1vdmVFbXB0eVJhbmtzID0gcmVxdWlyZShcIi4vdXRpbFwiKS5yZW1vdmVFbXB0eVJhbmtzO1xudmFyIG5lc3RpbmdHcmFwaCA9IHJlcXVpcmUoXCIuL25lc3RpbmctZ3JhcGhcIik7XG52YXIgYWRkQm9yZGVyU2VnbWVudHMgPSByZXF1aXJlKFwiLi9hZGQtYm9yZGVyLXNlZ21lbnRzXCIpO1xudmFyIGNvb3JkaW5hdGVTeXN0ZW0gPSByZXF1aXJlKFwiLi9jb29yZGluYXRlLXN5c3RlbVwiKTtcbnZhciBvcmRlciA9IHJlcXVpcmUoXCIuL29yZGVyXCIpO1xudmFyIHBvc2l0aW9uID0gcmVxdWlyZShcIi4vcG9zaXRpb25cIik7XG52YXIgdXRpbCA9IHJlcXVpcmUoXCIuL3V0aWxcIik7XG52YXIgR3JhcGggPSByZXF1aXJlKFwiLi9ncmFwaGxpYlwiKS5HcmFwaDtcbnZhciBpbml0RGF0YU9yZGVyID0gcmVxdWlyZShcIi4vb3JkZXIvaW5pdC1kYXRhLW9yZGVyXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGxheW91dDtcblxuZnVuY3Rpb24gbGF5b3V0KGcsIG9wdHMpIHtcbiAgdmFyIHRpbWUgPSBvcHRzICYmIG9wdHMuZGVidWdUaW1pbmcgPyB1dGlsLnRpbWUgOiB1dGlsLm5vdGltZTtcbiAgdGltZShcImxheW91dFwiLCBmdW5jdGlvbigpIHtcbiAgICAvLyDlpoLmnpzlnKjljp/lm77ln7rnoYDkuIrkv67mlLnvvIznu6fmib/ljp/lm77nmoRvcmRlcue7k+aenFxuICAgIGlmIChvcHRzICYmICFvcHRzLmtlZXBOb2RlT3JkZXIgJiYgb3B0cy5wcmV2R3JhcGgpIHtcbiAgICAgIHRpbWUoXCIgIGluaGVyaXRPcmRlclwiLCBmdW5jdGlvbigpIHsgaW5oZXJpdE9yZGVyKGcsIG9wdHMucHJldkdyYXBoKTsgfSk7XG4gICAgfVxuICAgIHZhciBsYXlvdXRHcmFwaCA9IFxuICAgICAgdGltZShcIiAgYnVpbGRMYXlvdXRHcmFwaFwiLCBmdW5jdGlvbigpIHsgcmV0dXJuIGJ1aWxkTGF5b3V0R3JhcGgoZyk7IH0pO1xuICAgIC8vIOaOp+WItuaYr+WQpuS4uui+ueeahGxhYmVs55WZ5L2N572u77yI6L+Z5Lya5b2x5ZON5piv5ZCm5Zyo6L655Lit6Ze05re75YqgZHVtbXkgbm9kZe+8iVxuICAgIGlmICghKG9wdHMgJiYgKG9wdHMuZWRnZUxhYmVsU3BhY2UgPT09IGZhbHNlKSkpIHtcbiAgICAgIHRpbWUoXCIgIG1ha2VTcGFjZUZvckVkZ2VMYWJlbHNcIiwgZnVuY3Rpb24oKSB7IG1ha2VTcGFjZUZvckVkZ2VMYWJlbHMobGF5b3V0R3JhcGgpOyB9KTtcbiAgICB9XG4gICAgLy8gVE9ETzog5pqC5pe25aSE55CG5bGC57qn6K6+572u5LiN5q2j56Gu5pe255qE5byC5bi45oql6ZSZ77yM5o+Q56S66K6+572u5q2j56Gu55qE5bGC57qnXG4gICAgdHJ5IHtcbiAgICAgIHRpbWUoXCIgIHJ1bkxheW91dFwiLCAgICAgICAgZnVuY3Rpb24oKSB7IHJ1bkxheW91dChsYXlvdXRHcmFwaCwgdGltZSwgb3B0cyk7IH0pO1xuICAgIH0gY2F0Y2goZSkge1xuICAgICAgaWYgKGUubWVzc2FnZSA9PT0gXCJOb3QgcG9zc2libGUgdG8gZmluZCBpbnRlcnNlY3Rpb24gaW5zaWRlIG9mIHRoZSByZWN0YW5nbGVcIikge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdUaGUgZm9sbG93aW5nIGVycm9yIG1heSBiZSBjYXVzZWQgYnkgaW1wcm9wZXIgbGF5ZXIgc2V0dGluZywgcGxlYXNlIG1ha2Ugc3VyZSB5b3VyIG1hbnVhbCBsYXllciBzZXR0aW5nIGRvZXMgbm90IHZpb2xhdGUgdGhlIGdyYXBoXFwncyBzdHJ1Y3R1cmU6XFxuJywgZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93KGUpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aW1lKFwiICB1cGRhdGVJbnB1dEdyYXBoXCIsIGZ1bmN0aW9uKCkgeyB1cGRhdGVJbnB1dEdyYXBoKGcsIGxheW91dEdyYXBoKTsgfSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBydW5MYXlvdXQoZywgdGltZSwgb3B0cykge1xuICB0aW1lKFwiICAgIHJlbW92ZVNlbGZFZGdlc1wiLCAgICAgICAgZnVuY3Rpb24oKSB7IHJlbW92ZVNlbGZFZGdlcyhnKTsgfSk7XG4gIHRpbWUoXCIgICAgYWN5Y2xpY1wiLCAgICAgICAgICAgICAgICBmdW5jdGlvbigpIHsgYWN5Y2xpYy5ydW4oZyk7IH0pO1xuICB0aW1lKFwiICAgIG5lc3RpbmdHcmFwaC5ydW5cIiwgICAgICAgZnVuY3Rpb24oKSB7IG5lc3RpbmdHcmFwaC5ydW4oZyk7IH0pO1xuICB0aW1lKFwiICAgIHJhbmtcIiwgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oKSB7IHJhbmsodXRpbC5hc05vbkNvbXBvdW5kR3JhcGgoZykpOyB9KTtcbiAgdGltZShcIiAgICBpbmplY3RFZGdlTGFiZWxQcm94aWVzXCIsIGZ1bmN0aW9uKCkgeyBpbmplY3RFZGdlTGFiZWxQcm94aWVzKGcpOyB9KTtcbiAgdGltZShcIiAgICByZW1vdmVFbXB0eVJhbmtzXCIsICAgICAgIGZ1bmN0aW9uKCkgeyByZW1vdmVFbXB0eVJhbmtzKGcpOyB9KTtcbiAgdGltZShcIiAgICBuZXN0aW5nR3JhcGguY2xlYW51cFwiLCAgIGZ1bmN0aW9uKCkgeyBuZXN0aW5nR3JhcGguY2xlYW51cChnKTsgfSk7XG4gIHRpbWUoXCIgICAgbm9ybWFsaXplUmFua3NcIiwgICAgICAgICBmdW5jdGlvbigpIHsgbm9ybWFsaXplUmFua3MoZyk7IH0pO1xuICB0aW1lKFwiICAgIGFzc2lnblJhbmtNaW5NYXhcIiwgICAgICAgZnVuY3Rpb24oKSB7IGFzc2lnblJhbmtNaW5NYXgoZyk7IH0pO1xuICB0aW1lKFwiICAgIHJlbW92ZUVkZ2VMYWJlbFByb3hpZXNcIiwgZnVuY3Rpb24oKSB7IHJlbW92ZUVkZ2VMYWJlbFByb3hpZXMoZyk7IH0pO1xuICB0aW1lKFwiICAgIG5vcm1hbGl6ZS5ydW5cIiwgICAgICAgICAgZnVuY3Rpb24oKSB7IG5vcm1hbGl6ZS5ydW4oZyk7IH0pO1xuICB0aW1lKFwiICAgIHBhcmVudER1bW15Q2hhaW5zXCIsICAgICAgZnVuY3Rpb24oKSB7IHBhcmVudER1bW15Q2hhaW5zKGcpOyB9KTtcbiAgdGltZShcIiAgICBhZGRCb3JkZXJTZWdtZW50c1wiLCAgICAgIGZ1bmN0aW9uKCkgeyBhZGRCb3JkZXJTZWdtZW50cyhnKTsgfSk7XG4gIGlmIChvcHRzICYmIG9wdHMua2VlcE5vZGVPcmRlcikge1xuICAgIHRpbWUoXCIgICAgaW5pdERhdGFPcmRlclwiLCBmdW5jdGlvbigpIHsgaW5pdERhdGFPcmRlcihnLCBvcHRzLm5vZGVPcmRlcik7IH0pO1xuICB9XG4gIHRpbWUoXCIgICAgb3JkZXJcIiwgICAgICAgICAgICAgICAgICBmdW5jdGlvbigpIHsgb3JkZXIoZyk7IH0pO1xuICB0aW1lKFwiICAgIGluc2VydFNlbGZFZGdlc1wiLCAgICAgICAgZnVuY3Rpb24oKSB7IGluc2VydFNlbGZFZGdlcyhnKTsgfSk7XG4gIHRpbWUoXCIgICAgYWRqdXN0Q29vcmRpbmF0ZVN5c3RlbVwiLCBmdW5jdGlvbigpIHsgY29vcmRpbmF0ZVN5c3RlbS5hZGp1c3QoZyk7IH0pO1xuICB0aW1lKFwiICAgIHBvc2l0aW9uXCIsICAgICAgICAgICAgICAgZnVuY3Rpb24oKSB7IHBvc2l0aW9uKGcpOyB9KTtcbiAgdGltZShcIiAgICBwb3NpdGlvblNlbGZFZGdlc1wiLCAgICAgIGZ1bmN0aW9uKCkgeyBwb3NpdGlvblNlbGZFZGdlcyhnKTsgfSk7XG4gIHRpbWUoXCIgICAgcmVtb3ZlQm9yZGVyTm9kZXNcIiwgICAgICBmdW5jdGlvbigpIHsgcmVtb3ZlQm9yZGVyTm9kZXMoZyk7IH0pO1xuICB0aW1lKFwiICAgIG5vcm1hbGl6ZS51bmRvXCIsICAgICAgICAgZnVuY3Rpb24oKSB7IG5vcm1hbGl6ZS51bmRvKGcpOyB9KTtcbiAgdGltZShcIiAgICBmaXh1cEVkZ2VMYWJlbENvb3Jkc1wiLCAgIGZ1bmN0aW9uKCkgeyBmaXh1cEVkZ2VMYWJlbENvb3JkcyhnKTsgfSk7XG4gIHRpbWUoXCIgICAgdW5kb0Nvb3JkaW5hdGVTeXN0ZW1cIiwgICBmdW5jdGlvbigpIHsgY29vcmRpbmF0ZVN5c3RlbS51bmRvKGcpOyB9KTtcbiAgdGltZShcIiAgICB0cmFuc2xhdGVHcmFwaFwiLCAgICAgICAgIGZ1bmN0aW9uKCkgeyB0cmFuc2xhdGVHcmFwaChnKTsgfSk7XG4gIHRpbWUoXCIgICAgYXNzaWduTm9kZUludGVyc2VjdHNcIiwgICBmdW5jdGlvbigpIHsgYXNzaWduTm9kZUludGVyc2VjdHMoZyk7IH0pO1xuICB0aW1lKFwiICAgIHJldmVyc2VQb2ludHNcIiwgICAgICAgICAgZnVuY3Rpb24oKSB7IHJldmVyc2VQb2ludHNGb3JSZXZlcnNlZEVkZ2VzKGcpOyB9KTtcbiAgdGltZShcIiAgICBhY3ljbGljLnVuZG9cIiwgICAgICAgICAgIGZ1bmN0aW9uKCkgeyBhY3ljbGljLnVuZG8oZyk7IH0pO1xufVxuXG4vKipcbiAqIOe7p+aJv+S4iuS4gOS4quW4g+WxgOS4reeahG9yZGVy77yM6Ziy5q2i57+76L2sXG4gKiBUT0RPOiDmmoLml7bmsqHmnInogIPomZHmtonlj4rlsYLnuqflj5jliqjnmoTluIPlsYDvvIzlj6rkv53or4Hljp/mnaXluIPlsYDlsYLnuqflkoznm7jlr7npobrluo/kuI3lj5hcbiAqL1xuZnVuY3Rpb24gaW5oZXJpdE9yZGVyKGN1cnJHLCBwcmV2Rykge1xuICB2YXIgcHJldk5vZGVNYXAgPSBwcmV2Ry5fbm9kZXM7XG4gIF8uZm9yRWFjaChjdXJyRy5ub2RlcygpLCBmdW5jdGlvbiAobikge1xuICAgIHZhciBub2RlID0gY3Vyckcubm9kZShuKTtcbiAgICBpZiAocHJldk5vZGVNYXBbbl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgbm9kZS5maXhvcmRlciA9IHByZXZOb2RlTWFwW25dLl9vcmRlcjtcbiAgICAgIGRlbGV0ZSBwcmV2Tm9kZU1hcFtuXS5fb3JkZXI7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0ZSBub2RlLmZpeG9yZGVyO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qXG4gKiBDb3BpZXMgZmluYWwgbGF5b3V0IGluZm9ybWF0aW9uIGZyb20gdGhlIGxheW91dCBncmFwaCBiYWNrIHRvIHRoZSBpbnB1dFxuICogZ3JhcGguIFRoaXMgcHJvY2VzcyBvbmx5IGNvcGllcyB3aGl0ZWxpc3RlZCBhdHRyaWJ1dGVzIGZyb20gdGhlIGxheW91dCBncmFwaFxuICogdG8gdGhlIGlucHV0IGdyYXBoLCBzbyBpdCBzZXJ2ZXMgYXMgYSBnb29kIHBsYWNlIHRvIGRldGVybWluZSB3aGF0XG4gKiBhdHRyaWJ1dGVzIGNhbiBpbmZsdWVuY2UgbGF5b3V0LlxuICovXG5mdW5jdGlvbiB1cGRhdGVJbnB1dEdyYXBoKGlucHV0R3JhcGgsIGxheW91dEdyYXBoKSB7XG4gIF8uZm9yRWFjaChpbnB1dEdyYXBoLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICB2YXIgaW5wdXRMYWJlbCA9IGlucHV0R3JhcGgubm9kZSh2KTtcbiAgICB2YXIgbGF5b3V0TGFiZWwgPSBsYXlvdXRHcmFwaC5ub2RlKHYpO1xuXG4gICAgaWYgKGlucHV0TGFiZWwpIHtcbiAgICAgIGlucHV0TGFiZWwueCA9IGxheW91dExhYmVsLng7XG4gICAgICBpbnB1dExhYmVsLnkgPSBsYXlvdXRMYWJlbC55O1xuICAgICAgaW5wdXRMYWJlbC5fb3JkZXIgPSBsYXlvdXRMYWJlbC5vcmRlcjtcbiAgICAgIGlucHV0TGFiZWwuX3JhbmsgPSBsYXlvdXRMYWJlbC5yYW5rO1xuXG4gICAgICBpZiAobGF5b3V0R3JhcGguY2hpbGRyZW4odikubGVuZ3RoKSB7XG4gICAgICAgIGlucHV0TGFiZWwud2lkdGggPSBsYXlvdXRMYWJlbC53aWR0aDtcbiAgICAgICAgaW5wdXRMYWJlbC5oZWlnaHQgPSBsYXlvdXRMYWJlbC5oZWlnaHQ7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICBfLmZvckVhY2goaW5wdXRHcmFwaC5lZGdlcygpLCBmdW5jdGlvbihlKSB7XG4gICAgdmFyIGlucHV0TGFiZWwgPSBpbnB1dEdyYXBoLmVkZ2UoZSk7XG4gICAgdmFyIGxheW91dExhYmVsID0gbGF5b3V0R3JhcGguZWRnZShlKTtcblxuICAgIGlucHV0TGFiZWwucG9pbnRzID0gbGF5b3V0TGFiZWwucG9pbnRzO1xuICAgIGlmIChfLmhhcyhsYXlvdXRMYWJlbCwgXCJ4XCIpKSB7XG4gICAgICBpbnB1dExhYmVsLnggPSBsYXlvdXRMYWJlbC54O1xuICAgICAgaW5wdXRMYWJlbC55ID0gbGF5b3V0TGFiZWwueTtcbiAgICB9XG4gIH0pO1xuXG4gIGlucHV0R3JhcGguZ3JhcGgoKS53aWR0aCA9IGxheW91dEdyYXBoLmdyYXBoKCkud2lkdGg7XG4gIGlucHV0R3JhcGguZ3JhcGgoKS5oZWlnaHQgPSBsYXlvdXRHcmFwaC5ncmFwaCgpLmhlaWdodDtcbn1cblxudmFyIGdyYXBoTnVtQXR0cnMgPSBbXCJub2Rlc2VwXCIsIFwiZWRnZXNlcFwiLCBcInJhbmtzZXBcIiwgXCJtYXJnaW54XCIsIFwibWFyZ2lueVwiXTtcbnZhciBncmFwaERlZmF1bHRzID0geyByYW5rc2VwOiA1MCwgZWRnZXNlcDogMjAsIG5vZGVzZXA6IDUwLCByYW5rZGlyOiBcInRiXCIgfTtcbnZhciBncmFwaEF0dHJzID0gW1wiYWN5Y2xpY2VyXCIsIFwicmFua2VyXCIsIFwicmFua2RpclwiLCBcImFsaWduXCJdO1xudmFyIG5vZGVOdW1BdHRycyA9IFtcIndpZHRoXCIsIFwiaGVpZ2h0XCIsIFwibGF5ZXJcIiwgXCJmaXhvcmRlclwiXTsgLy8g6ZyA6KaB5Lyg5YWlbGF5ZXIsIGZpeE9yZGVy5L2c5Li65Y+C5pWw5Y+C6ICDXG52YXIgbm9kZURlZmF1bHRzID0geyB3aWR0aDogMCwgaGVpZ2h0OiAwIH07XG52YXIgZWRnZU51bUF0dHJzID0gW1wibWlubGVuXCIsIFwid2VpZ2h0XCIsIFwid2lkdGhcIiwgXCJoZWlnaHRcIiwgXCJsYWJlbG9mZnNldFwiXTtcbnZhciBlZGdlRGVmYXVsdHMgPSB7XG4gIG1pbmxlbjogMSwgd2VpZ2h0OiAxLCB3aWR0aDogMCwgaGVpZ2h0OiAwLFxuICBsYWJlbG9mZnNldDogMTAsIGxhYmVscG9zOiBcInJcIlxufTtcbnZhciBlZGdlQXR0cnMgPSBbXCJsYWJlbHBvc1wiXTtcblxuLypcbiAqIENvbnN0cnVjdHMgYSBuZXcgZ3JhcGggZnJvbSB0aGUgaW5wdXQgZ3JhcGgsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciBsYXlvdXQuXG4gKiBUaGlzIHByb2Nlc3MgY29waWVzIG9ubHkgd2hpdGVsaXN0ZWQgYXR0cmlidXRlcyBmcm9tIHRoZSBpbnB1dCBncmFwaCB0byB0aGVcbiAqIGxheW91dCBncmFwaC4gVGh1cyB0aGlzIGZ1bmN0aW9uIHNlcnZlcyBhcyBhIGdvb2QgcGxhY2UgdG8gZGV0ZXJtaW5lIHdoYXRcbiAqIGF0dHJpYnV0ZXMgY2FuIGluZmx1ZW5jZSBsYXlvdXQuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkTGF5b3V0R3JhcGgoaW5wdXRHcmFwaCkge1xuICB2YXIgZyA9IG5ldyBHcmFwaCh7IG11bHRpZ3JhcGg6IHRydWUsIGNvbXBvdW5kOiB0cnVlIH0pO1xuICB2YXIgZ3JhcGggPSBjYW5vbmljYWxpemUoaW5wdXRHcmFwaC5ncmFwaCgpKTtcblxuICBnLnNldEdyYXBoKF8ubWVyZ2Uoe30sXG4gICAgZ3JhcGhEZWZhdWx0cyxcbiAgICBzZWxlY3ROdW1iZXJBdHRycyhncmFwaCwgZ3JhcGhOdW1BdHRycyksXG4gICAgXy5waWNrKGdyYXBoLCBncmFwaEF0dHJzKSkpO1xuXG4gIF8uZm9yRWFjaChpbnB1dEdyYXBoLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICB2YXIgbm9kZSA9IGNhbm9uaWNhbGl6ZShpbnB1dEdyYXBoLm5vZGUodikpO1xuICAgIGcuc2V0Tm9kZSh2LCBfLmRlZmF1bHRzKHNlbGVjdE51bWJlckF0dHJzKG5vZGUsIG5vZGVOdW1BdHRycyksIG5vZGVEZWZhdWx0cykpO1xuICAgIGcuc2V0UGFyZW50KHYsIGlucHV0R3JhcGgucGFyZW50KHYpKTtcbiAgfSk7XG5cbiAgXy5mb3JFYWNoKGlucHV0R3JhcGguZWRnZXMoKSwgZnVuY3Rpb24oZSkge1xuICAgIHZhciBlZGdlID0gY2Fub25pY2FsaXplKGlucHV0R3JhcGguZWRnZShlKSk7XG4gICAgZy5zZXRFZGdlKGUsIF8ubWVyZ2Uoe30sXG4gICAgICBlZGdlRGVmYXVsdHMsXG4gICAgICBzZWxlY3ROdW1iZXJBdHRycyhlZGdlLCBlZGdlTnVtQXR0cnMpLFxuICAgICAgXy5waWNrKGVkZ2UsIGVkZ2VBdHRycykpKTtcbiAgfSk7XG5cbiAgcmV0dXJuIGc7XG59XG5cbi8qXG4gKiBUaGlzIGlkZWEgY29tZXMgZnJvbSB0aGUgR2Fuc25lciBwYXBlcjogdG8gYWNjb3VudCBmb3IgZWRnZSBsYWJlbHMgaW4gb3VyXG4gKiBsYXlvdXQgd2Ugc3BsaXQgZWFjaCByYW5rIGluIGhhbGYgYnkgZG91YmxpbmcgbWlubGVuIGFuZCBoYWx2aW5nIHJhbmtzZXAuXG4gKiBUaGVuIHdlIGNhbiBwbGFjZSBsYWJlbHMgYXQgdGhlc2UgbWlkLXBvaW50cyBiZXR3ZWVuIG5vZGVzLlxuICpcbiAqIFdlIGFsc28gYWRkIHNvbWUgbWluaW1hbCBwYWRkaW5nIHRvIHRoZSB3aWR0aCB0byBwdXNoIHRoZSBsYWJlbCBmb3IgdGhlIGVkZ2VcbiAqIGF3YXkgZnJvbSB0aGUgZWRnZSBpdHNlbGYgYSBiaXQuXG4gKi9cbmZ1bmN0aW9uIG1ha2VTcGFjZUZvckVkZ2VMYWJlbHMoZykge1xuICB2YXIgZ3JhcGggPSBnLmdyYXBoKCk7XG4gIGdyYXBoLnJhbmtzZXAgLz0gMjtcbiAgXy5mb3JFYWNoKGcubm9kZXMoKSwgZnVuY3Rpb24obikge1xuICAgIHZhciBub2RlID0gZy5ub2RlKG4pO1xuICAgIGlmICghaXNOYU4obm9kZS5sYXllcikpIHtcbiAgICAgIG5vZGUubGF5ZXIgKj0gMjsgLy8gVE9ETzog5Zug5Li66buY6K6k55qEcmFua+WPmOS4uuS4pOWAje+8jOiuvuWumueahGxheWVy5LmfKjJcbiAgICB9XG4gIH0pO1xuICBfLmZvckVhY2goZy5lZGdlcygpLCBmdW5jdGlvbihlKSB7XG4gICAgdmFyIGVkZ2UgPSBnLmVkZ2UoZSk7XG4gICAgZWRnZS5taW5sZW4gKj0gMjtcbiAgICBpZiAoZWRnZS5sYWJlbHBvcy50b0xvd2VyQ2FzZSgpICE9PSBcImNcIikge1xuICAgICAgaWYgKGdyYXBoLnJhbmtkaXIgPT09IFwiVEJcIiB8fCBncmFwaC5yYW5rZGlyID09PSBcIkJUXCIpIHtcbiAgICAgICAgZWRnZS53aWR0aCArPSBlZGdlLmxhYmVsb2Zmc2V0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZWRnZS5oZWlnaHQgKz0gZWRnZS5sYWJlbG9mZnNldDtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufVxuXG4vKlxuICogQ3JlYXRlcyB0ZW1wb3JhcnkgZHVtbXkgbm9kZXMgdGhhdCBjYXB0dXJlIHRoZSByYW5rIGluIHdoaWNoIGVhY2ggZWRnZSdzXG4gKiBsYWJlbCBpcyBnb2luZyB0bywgaWYgaXQgaGFzIG9uZSBvZiBub24temVybyB3aWR0aCBhbmQgaGVpZ2h0LiBXZSBkbyB0aGlzXG4gKiBzbyB0aGF0IHdlIGNhbiBzYWZlbHkgcmVtb3ZlIGVtcHR5IHJhbmtzIHdoaWxlIHByZXNlcnZpbmcgYmFsYW5jZSBmb3IgdGhlXG4gKiBsYWJlbCdzIHBvc2l0aW9uLlxuICovXG5mdW5jdGlvbiBpbmplY3RFZGdlTGFiZWxQcm94aWVzKGcpIHtcbiAgXy5mb3JFYWNoKGcuZWRnZXMoKSwgZnVuY3Rpb24oZSkge1xuICAgIHZhciBlZGdlID0gZy5lZGdlKGUpO1xuICAgIGlmIChlZGdlLndpZHRoICYmIGVkZ2UuaGVpZ2h0KSB7XG4gICAgICB2YXIgdiA9IGcubm9kZShlLnYpO1xuICAgICAgdmFyIHcgPSBnLm5vZGUoZS53KTtcbiAgICAgIHZhciBsYWJlbCA9IHsgcmFuazogKHcucmFuayAtIHYucmFuaykgLyAyICsgdi5yYW5rLCBlOiBlIH07XG4gICAgICB1dGlsLmFkZER1bW15Tm9kZShnLCBcImVkZ2UtcHJveHlcIiwgbGFiZWwsIFwiX2VwXCIpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGFzc2lnblJhbmtNaW5NYXgoZykge1xuICB2YXIgbWF4UmFuayA9IDA7XG4gIF8uZm9yRWFjaChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICB2YXIgbm9kZSA9IGcubm9kZSh2KTtcbiAgICBpZiAobm9kZS5ib3JkZXJUb3ApIHtcbiAgICAgIG5vZGUubWluUmFuayA9IGcubm9kZShub2RlLmJvcmRlclRvcCkucmFuaztcbiAgICAgIG5vZGUubWF4UmFuayA9IGcubm9kZShub2RlLmJvcmRlckJvdHRvbSkucmFuaztcbiAgICAgIG1heFJhbmsgPSBfLm1heChtYXhSYW5rLCBub2RlLm1heFJhbmspO1xuICAgIH1cbiAgfSk7XG4gIGcuZ3JhcGgoKS5tYXhSYW5rID0gbWF4UmFuaztcbn1cblxuZnVuY3Rpb24gcmVtb3ZlRWRnZUxhYmVsUHJveGllcyhnKSB7XG4gIF8uZm9yRWFjaChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICB2YXIgbm9kZSA9IGcubm9kZSh2KTtcbiAgICBpZiAobm9kZS5kdW1teSA9PT0gXCJlZGdlLXByb3h5XCIpIHtcbiAgICAgIGcuZWRnZShub2RlLmUpLmxhYmVsUmFuayA9IG5vZGUucmFuaztcbiAgICAgIGcucmVtb3ZlTm9kZSh2KTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiB0cmFuc2xhdGVHcmFwaChnKSB7XG4gIHZhciBtaW5YID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1xuICB2YXIgbWF4WCA9IDA7XG4gIHZhciBtaW5ZID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1xuICB2YXIgbWF4WSA9IDA7XG4gIHZhciBncmFwaExhYmVsID0gZy5ncmFwaCgpO1xuICB2YXIgbWFyZ2luWCA9IGdyYXBoTGFiZWwubWFyZ2lueCB8fCAwO1xuICB2YXIgbWFyZ2luWSA9IGdyYXBoTGFiZWwubWFyZ2lueSB8fCAwO1xuXG4gIGZ1bmN0aW9uIGdldEV4dHJlbWVzKGF0dHJzKSB7XG4gICAgdmFyIHggPSBhdHRycy54O1xuICAgIHZhciB5ID0gYXR0cnMueTtcbiAgICB2YXIgdyA9IGF0dHJzLndpZHRoO1xuICAgIHZhciBoID0gYXR0cnMuaGVpZ2h0O1xuICAgIG1pblggPSBNYXRoLm1pbihtaW5YLCB4IC0gdyAvIDIpO1xuICAgIG1heFggPSBNYXRoLm1heChtYXhYLCB4ICsgdyAvIDIpO1xuICAgIG1pblkgPSBNYXRoLm1pbihtaW5ZLCB5IC0gaCAvIDIpO1xuICAgIG1heFkgPSBNYXRoLm1heChtYXhZLCB5ICsgaCAvIDIpO1xuICB9XG5cbiAgXy5mb3JFYWNoKGcubm9kZXMoKSwgZnVuY3Rpb24odikgeyBnZXRFeHRyZW1lcyhnLm5vZGUodikpOyB9KTtcbiAgXy5mb3JFYWNoKGcuZWRnZXMoKSwgZnVuY3Rpb24oZSkge1xuICAgIHZhciBlZGdlID0gZy5lZGdlKGUpO1xuICAgIGlmIChfLmhhcyhlZGdlLCBcInhcIikpIHtcbiAgICAgIGdldEV4dHJlbWVzKGVkZ2UpO1xuICAgIH1cbiAgfSk7XG5cbiAgbWluWCAtPSBtYXJnaW5YO1xuICBtaW5ZIC09IG1hcmdpblk7XG5cbiAgXy5mb3JFYWNoKGcubm9kZXMoKSwgZnVuY3Rpb24odikge1xuICAgIHZhciBub2RlID0gZy5ub2RlKHYpO1xuICAgIG5vZGUueCAtPSBtaW5YO1xuICAgIG5vZGUueSAtPSBtaW5ZO1xuICB9KTtcblxuICBfLmZvckVhY2goZy5lZGdlcygpLCBmdW5jdGlvbihlKSB7XG4gICAgdmFyIGVkZ2UgPSBnLmVkZ2UoZSk7XG4gICAgXy5mb3JFYWNoKGVkZ2UucG9pbnRzLCBmdW5jdGlvbihwKSB7XG4gICAgICBwLnggLT0gbWluWDtcbiAgICAgIHAueSAtPSBtaW5ZO1xuICAgIH0pO1xuICAgIGlmIChfLmhhcyhlZGdlLCBcInhcIikpIHsgZWRnZS54IC09IG1pblg7IH1cbiAgICBpZiAoXy5oYXMoZWRnZSwgXCJ5XCIpKSB7IGVkZ2UueSAtPSBtaW5ZOyB9XG4gIH0pO1xuXG4gIGdyYXBoTGFiZWwud2lkdGggPSBtYXhYIC0gbWluWCArIG1hcmdpblg7XG4gIGdyYXBoTGFiZWwuaGVpZ2h0ID0gbWF4WSAtIG1pblkgKyBtYXJnaW5ZO1xufVxuXG5mdW5jdGlvbiBhc3NpZ25Ob2RlSW50ZXJzZWN0cyhnKSB7XG4gIF8uZm9yRWFjaChnLmVkZ2VzKCksIGZ1bmN0aW9uKGUpIHtcbiAgICB2YXIgZWRnZSA9IGcuZWRnZShlKTtcbiAgICB2YXIgbm9kZVYgPSBnLm5vZGUoZS52KTtcbiAgICB2YXIgbm9kZVcgPSBnLm5vZGUoZS53KTtcbiAgICB2YXIgcDEsIHAyO1xuICAgIGlmICghZWRnZS5wb2ludHMpIHtcbiAgICAgIGVkZ2UucG9pbnRzID0gW107XG4gICAgICBwMSA9IG5vZGVXO1xuICAgICAgcDIgPSBub2RlVjtcbiAgICB9IGVsc2Uge1xuICAgICAgcDEgPSBlZGdlLnBvaW50c1swXTtcbiAgICAgIHAyID0gZWRnZS5wb2ludHNbZWRnZS5wb2ludHMubGVuZ3RoIC0gMV07XG4gICAgfVxuICAgIGVkZ2UucG9pbnRzLnVuc2hpZnQodXRpbC5pbnRlcnNlY3RSZWN0KG5vZGVWLCBwMSkpO1xuICAgIGVkZ2UucG9pbnRzLnB1c2godXRpbC5pbnRlcnNlY3RSZWN0KG5vZGVXLCBwMikpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZml4dXBFZGdlTGFiZWxDb29yZHMoZykge1xuICBfLmZvckVhY2goZy5lZGdlcygpLCBmdW5jdGlvbihlKSB7XG4gICAgdmFyIGVkZ2UgPSBnLmVkZ2UoZSk7XG4gICAgaWYgKF8uaGFzKGVkZ2UsIFwieFwiKSkge1xuICAgICAgaWYgKGVkZ2UubGFiZWxwb3MgPT09IFwibFwiIHx8IGVkZ2UubGFiZWxwb3MgPT09IFwiclwiKSB7XG4gICAgICAgIGVkZ2Uud2lkdGggLT0gZWRnZS5sYWJlbG9mZnNldDtcbiAgICAgIH1cbiAgICAgIHN3aXRjaCAoZWRnZS5sYWJlbHBvcykge1xuICAgICAgY2FzZSBcImxcIjogZWRnZS54IC09IGVkZ2Uud2lkdGggLyAyICsgZWRnZS5sYWJlbG9mZnNldDsgYnJlYWs7XG4gICAgICBjYXNlIFwiclwiOiBlZGdlLnggKz0gZWRnZS53aWR0aCAvIDIgKyBlZGdlLmxhYmVsb2Zmc2V0OyBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZXZlcnNlUG9pbnRzRm9yUmV2ZXJzZWRFZGdlcyhnKSB7XG4gIF8uZm9yRWFjaChnLmVkZ2VzKCksIGZ1bmN0aW9uKGUpIHtcbiAgICB2YXIgZWRnZSA9IGcuZWRnZShlKTtcbiAgICBpZiAoZWRnZS5yZXZlcnNlZCkge1xuICAgICAgZWRnZS5wb2ludHMucmV2ZXJzZSgpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUJvcmRlck5vZGVzKGcpIHtcbiAgXy5mb3JFYWNoKGcubm9kZXMoKSwgZnVuY3Rpb24odikge1xuICAgIGlmIChnLmNoaWxkcmVuKHYpLmxlbmd0aCkge1xuICAgICAgdmFyIG5vZGUgPSBnLm5vZGUodik7XG4gICAgICB2YXIgdCA9IGcubm9kZShub2RlLmJvcmRlclRvcCk7XG4gICAgICB2YXIgYiA9IGcubm9kZShub2RlLmJvcmRlckJvdHRvbSk7XG4gICAgICB2YXIgbCA9IGcubm9kZShfLmxhc3Qobm9kZS5ib3JkZXJMZWZ0KSk7XG4gICAgICB2YXIgciA9IGcubm9kZShfLmxhc3Qobm9kZS5ib3JkZXJSaWdodCkpO1xuXG4gICAgICBub2RlLndpZHRoID0gTWF0aC5hYnMoci54IC0gbC54KTtcbiAgICAgIG5vZGUuaGVpZ2h0ID0gTWF0aC5hYnMoYi55IC0gdC55KTtcbiAgICAgIG5vZGUueCA9IGwueCArIG5vZGUud2lkdGggLyAyO1xuICAgICAgbm9kZS55ID0gdC55ICsgbm9kZS5oZWlnaHQgLyAyO1xuICAgIH1cbiAgfSk7XG5cbiAgXy5mb3JFYWNoKGcubm9kZXMoKSwgZnVuY3Rpb24odikge1xuICAgIGlmIChnLm5vZGUodikuZHVtbXkgPT09IFwiYm9yZGVyXCIpIHtcbiAgICAgIGcucmVtb3ZlTm9kZSh2KTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZW1vdmVTZWxmRWRnZXMoZykge1xuICBfLmZvckVhY2goZy5lZGdlcygpLCBmdW5jdGlvbihlKSB7XG4gICAgaWYgKGUudiA9PT0gZS53KSB7XG4gICAgICB2YXIgbm9kZSA9IGcubm9kZShlLnYpO1xuICAgICAgaWYgKCFub2RlLnNlbGZFZGdlcykge1xuICAgICAgICBub2RlLnNlbGZFZGdlcyA9IFtdO1xuICAgICAgfVxuICAgICAgbm9kZS5zZWxmRWRnZXMucHVzaCh7IGU6IGUsIGxhYmVsOiBnLmVkZ2UoZSkgfSk7XG4gICAgICBnLnJlbW92ZUVkZ2UoZSk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gaW5zZXJ0U2VsZkVkZ2VzKGcpIHtcbiAgdmFyIGxheWVycyA9IHV0aWwuYnVpbGRMYXllck1hdHJpeChnKTtcbiAgXy5mb3JFYWNoKGxheWVycywgZnVuY3Rpb24obGF5ZXIpIHtcbiAgICB2YXIgb3JkZXJTaGlmdCA9IDA7XG4gICAgXy5mb3JFYWNoKGxheWVyLCBmdW5jdGlvbih2LCBpKSB7XG4gICAgICB2YXIgbm9kZSA9IGcubm9kZSh2KTtcbiAgICAgIG5vZGUub3JkZXIgPSBpICsgb3JkZXJTaGlmdDtcbiAgICAgIF8uZm9yRWFjaChub2RlLnNlbGZFZGdlcywgZnVuY3Rpb24oc2VsZkVkZ2UpIHtcbiAgICAgICAgdXRpbC5hZGREdW1teU5vZGUoZywgXCJzZWxmZWRnZVwiLCB7XG4gICAgICAgICAgd2lkdGg6IHNlbGZFZGdlLmxhYmVsLndpZHRoLFxuICAgICAgICAgIGhlaWdodDogc2VsZkVkZ2UubGFiZWwuaGVpZ2h0LFxuICAgICAgICAgIHJhbms6IG5vZGUucmFuayxcbiAgICAgICAgICBvcmRlcjogaSArICgrK29yZGVyU2hpZnQpLFxuICAgICAgICAgIGU6IHNlbGZFZGdlLmUsXG4gICAgICAgICAgbGFiZWw6IHNlbGZFZGdlLmxhYmVsXG4gICAgICAgIH0sIFwiX3NlXCIpO1xuICAgICAgfSk7XG4gICAgICBkZWxldGUgbm9kZS5zZWxmRWRnZXM7XG4gICAgfSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBwb3NpdGlvblNlbGZFZGdlcyhnKSB7XG4gIF8uZm9yRWFjaChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICB2YXIgbm9kZSA9IGcubm9kZSh2KTtcbiAgICBpZiAobm9kZS5kdW1teSA9PT0gXCJzZWxmZWRnZVwiKSB7XG4gICAgICB2YXIgc2VsZk5vZGUgPSBnLm5vZGUobm9kZS5lLnYpO1xuICAgICAgdmFyIHggPSBzZWxmTm9kZS54ICsgc2VsZk5vZGUud2lkdGggLyAyO1xuICAgICAgdmFyIHkgPSBzZWxmTm9kZS55O1xuICAgICAgdmFyIGR4ID0gbm9kZS54IC0geDtcbiAgICAgIHZhciBkeSA9IHNlbGZOb2RlLmhlaWdodCAvIDI7XG4gICAgICBnLnNldEVkZ2Uobm9kZS5lLCBub2RlLmxhYmVsKTtcbiAgICAgIGcucmVtb3ZlTm9kZSh2KTtcbiAgICAgIG5vZGUubGFiZWwucG9pbnRzID0gW1xuICAgICAgICB7IHg6IHggKyAyICogZHggLyAzLCB5OiB5IC0gZHkgfSxcbiAgICAgICAgeyB4OiB4ICsgNSAqIGR4IC8gNiwgeTogeSAtIGR5IH0sXG4gICAgICAgIHsgeDogeCArICAgICBkeCAgICAsIHk6IHkgfSxcbiAgICAgICAgeyB4OiB4ICsgNSAqIGR4IC8gNiwgeTogeSArIGR5IH0sXG4gICAgICAgIHsgeDogeCArIDIgKiBkeCAvIDMsIHk6IHkgKyBkeSB9XG4gICAgICBdO1xuICAgICAgbm9kZS5sYWJlbC54ID0gbm9kZS54O1xuICAgICAgbm9kZS5sYWJlbC55ID0gbm9kZS55O1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHNlbGVjdE51bWJlckF0dHJzKG9iaiwgYXR0cnMpIHtcbiAgcmV0dXJuIF8ubWFwVmFsdWVzKF8ucGljayhvYmosIGF0dHJzKSwgTnVtYmVyKTtcbn1cblxuZnVuY3Rpb24gY2Fub25pY2FsaXplKGF0dHJzKSB7XG4gIHZhciBuZXdBdHRycyA9IHt9O1xuICBfLmZvckVhY2goYXR0cnMsIGZ1bmN0aW9uKHYsIGspIHtcbiAgICBuZXdBdHRyc1trLnRvTG93ZXJDYXNlKCldID0gdjtcbiAgfSk7XG4gIHJldHVybiBuZXdBdHRycztcbn1cbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///434\n')},function(module,exports,__webpack_require__){eval("var baseClone = __webpack_require__(185);\n\n/** Used to compose bitmasks for cloning. */\nvar CLONE_DEEP_FLAG = 1,\n CLONE_SYMBOLS_FLAG = 4;\n\n/**\n * This method is like `_.clone` except that it recursively clones `value`.\n *\n * @static\n * @memberOf _\n * @since 1.0.0\n * @category Lang\n * @param {*} value The value to recursively clone.\n * @returns {*} Returns the deep cloned value.\n * @see _.clone\n * @example\n *\n * var objects = [{ 'a': 1 }, { 'b': 2 }];\n *\n * var deep = _.cloneDeep(objects);\n * console.log(deep[0] === objects[0]);\n * // => false\n */\nfunction cloneDeep(value) {\n return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG);\n}\n\nmodule.exports = cloneDeep;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL2Nsb25lRGVlcC5qcz8wNjQ0Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGdCQUFnQixtQkFBTyxDQUFDLEdBQWM7O0FBRXRDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsRUFBRTtBQUNiLGFBQWEsRUFBRTtBQUNmO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixTQUFTLEdBQUcsU0FBUztBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwiZmlsZSI6IjQzNS5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBiYXNlQ2xvbmUgPSByZXF1aXJlKCcuL19iYXNlQ2xvbmUnKTtcblxuLyoqIFVzZWQgdG8gY29tcG9zZSBiaXRtYXNrcyBmb3IgY2xvbmluZy4gKi9cbnZhciBDTE9ORV9ERUVQX0ZMQUcgPSAxLFxuICAgIENMT05FX1NZTUJPTFNfRkxBRyA9IDQ7XG5cbi8qKlxuICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5jbG9uZWAgZXhjZXB0IHRoYXQgaXQgcmVjdXJzaXZlbHkgY2xvbmVzIGB2YWx1ZWAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAxLjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHJlY3Vyc2l2ZWx5IGNsb25lLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGRlZXAgY2xvbmVkIHZhbHVlLlxuICogQHNlZSBfLmNsb25lXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3RzID0gW3sgJ2EnOiAxIH0sIHsgJ2InOiAyIH1dO1xuICpcbiAqIHZhciBkZWVwID0gXy5jbG9uZURlZXAob2JqZWN0cyk7XG4gKiBjb25zb2xlLmxvZyhkZWVwWzBdID09PSBvYmplY3RzWzBdKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGNsb25lRGVlcCh2YWx1ZSkge1xuICByZXR1cm4gYmFzZUNsb25lKHZhbHVlLCBDTE9ORV9ERUVQX0ZMQUcgfCBDTE9ORV9TWU1CT0xTX0ZMQUcpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNsb25lRGVlcDtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///435\n")},function(module,exports,__webpack_require__){eval("var baseRest = __webpack_require__(114),\n eq = __webpack_require__(72),\n isIterateeCall = __webpack_require__(115),\n keysIn = __webpack_require__(66);\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Assigns own and inherited enumerable string keyed properties of source\n * objects to the destination object for all destination properties that\n * resolve to `undefined`. Source objects are applied from left to right.\n * Once a property is set, additional values of the same property are ignored.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @see _.defaultsDeep\n * @example\n *\n * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n * // => { 'a': 1, 'b': 2 }\n */\nvar defaults = baseRest(function(object, sources) {\n object = Object(object);\n\n var index = -1;\n var length = sources.length;\n var guard = length > 2 ? sources[2] : undefined;\n\n if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n length = 1;\n }\n\n while (++index < length) {\n var source = sources[index];\n var props = keysIn(source);\n var propsIndex = -1;\n var propsLength = props.length;\n\n while (++propsIndex < propsLength) {\n var key = props[propsIndex];\n var value = object[key];\n\n if (value === undefined ||\n (eq(value, objectProto[key]) && !hasOwnProperty.call(object, key))) {\n object[key] = source[key];\n }\n }\n }\n\n return object;\n});\n\nmodule.exports = defaults;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL2RlZmF1bHRzLmpzPzk1YWUiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsZUFBZSxtQkFBTyxDQUFDLEdBQWE7QUFDcEMsU0FBUyxtQkFBTyxDQUFDLEVBQU07QUFDdkIscUJBQXFCLG1CQUFPLENBQUMsR0FBbUI7QUFDaEQsYUFBYSxtQkFBTyxDQUFDLEVBQVU7O0FBRS9CO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsV0FBVyxVQUFVO0FBQ3JCLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQSxlQUFlLFNBQVMsR0FBRyxTQUFTLEdBQUcsU0FBUztBQUNoRCxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQzs7QUFFRCIsImZpbGUiOiI0MzYuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYmFzZVJlc3QgPSByZXF1aXJlKCcuL19iYXNlUmVzdCcpLFxuICAgIGVxID0gcmVxdWlyZSgnLi9lcScpLFxuICAgIGlzSXRlcmF0ZWVDYWxsID0gcmVxdWlyZSgnLi9faXNJdGVyYXRlZUNhbGwnKSxcbiAgICBrZXlzSW4gPSByZXF1aXJlKCcuL2tleXNJbicpO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIEFzc2lnbnMgb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydGllcyBvZiBzb3VyY2VcbiAqIG9iamVjdHMgdG8gdGhlIGRlc3RpbmF0aW9uIG9iamVjdCBmb3IgYWxsIGRlc3RpbmF0aW9uIHByb3BlcnRpZXMgdGhhdFxuICogcmVzb2x2ZSB0byBgdW5kZWZpbmVkYC4gU291cmNlIG9iamVjdHMgYXJlIGFwcGxpZWQgZnJvbSBsZWZ0IHRvIHJpZ2h0LlxuICogT25jZSBhIHByb3BlcnR5IGlzIHNldCwgYWRkaXRpb25hbCB2YWx1ZXMgb2YgdGhlIHNhbWUgcHJvcGVydHkgYXJlIGlnbm9yZWQuXG4gKlxuICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICogQHBhcmFtIHsuLi5PYmplY3R9IFtzb3VyY2VzXSBUaGUgc291cmNlIG9iamVjdHMuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICogQHNlZSBfLmRlZmF1bHRzRGVlcFxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmRlZmF1bHRzKHsgJ2EnOiAxIH0sIHsgJ2InOiAyIH0sIHsgJ2EnOiAzIH0pO1xuICogLy8gPT4geyAnYSc6IDEsICdiJzogMiB9XG4gKi9cbnZhciBkZWZhdWx0cyA9IGJhc2VSZXN0KGZ1bmN0aW9uKG9iamVjdCwgc291cmNlcykge1xuICBvYmplY3QgPSBPYmplY3Qob2JqZWN0KTtcblxuICB2YXIgaW5kZXggPSAtMTtcbiAgdmFyIGxlbmd0aCA9IHNvdXJjZXMubGVuZ3RoO1xuICB2YXIgZ3VhcmQgPSBsZW5ndGggPiAyID8gc291cmNlc1syXSA6IHVuZGVmaW5lZDtcblxuICBpZiAoZ3VhcmQgJiYgaXNJdGVyYXRlZUNhbGwoc291cmNlc1swXSwgc291cmNlc1sxXSwgZ3VhcmQpKSB7XG4gICAgbGVuZ3RoID0gMTtcbiAgfVxuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIHNvdXJjZSA9IHNvdXJjZXNbaW5kZXhdO1xuICAgIHZhciBwcm9wcyA9IGtleXNJbihzb3VyY2UpO1xuICAgIHZhciBwcm9wc0luZGV4ID0gLTE7XG4gICAgdmFyIHByb3BzTGVuZ3RoID0gcHJvcHMubGVuZ3RoO1xuXG4gICAgd2hpbGUgKCsrcHJvcHNJbmRleCA8IHByb3BzTGVuZ3RoKSB7XG4gICAgICB2YXIga2V5ID0gcHJvcHNbcHJvcHNJbmRleF07XG4gICAgICB2YXIgdmFsdWUgPSBvYmplY3Rba2V5XTtcblxuICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAoZXEodmFsdWUsIG9iamVjdFByb3RvW2tleV0pICYmICFoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSkpIHtcbiAgICAgICAgb2JqZWN0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gb2JqZWN0O1xufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gZGVmYXVsdHM7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///436\n")},function(module,exports,__webpack_require__){eval("var createFind = __webpack_require__(438),\n findIndex = __webpack_require__(439);\n\n/**\n * Iterates over elements of `collection`, returning the first element\n * `predicate` returns truthy for. The predicate is invoked with three\n * arguments: (value, index|key, collection).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param {number} [fromIndex=0] The index to search from.\n * @returns {*} Returns the matched element, else `undefined`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': true },\n * { 'user': 'fred', 'age': 40, 'active': false },\n * { 'user': 'pebbles', 'age': 1, 'active': true }\n * ];\n *\n * _.find(users, function(o) { return o.age < 40; });\n * // => object for 'barney'\n *\n * // The `_.matches` iteratee shorthand.\n * _.find(users, { 'age': 1, 'active': true });\n * // => object for 'pebbles'\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.find(users, ['active', false]);\n * // => object for 'fred'\n *\n * // The `_.property` iteratee shorthand.\n * _.find(users, 'active');\n * // => object for 'barney'\n */\nvar find = createFind(findIndex);\n\nmodule.exports = find;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL2ZpbmQuanM/Mjc2OSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxpQkFBaUIsbUJBQU8sQ0FBQyxHQUFlO0FBQ3hDLGdCQUFnQixtQkFBTyxDQUFDLEdBQWE7O0FBRXJDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsYUFBYTtBQUN4QixXQUFXLFNBQVM7QUFDcEIsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsRUFBRTtBQUNmO0FBQ0E7QUFDQTtBQUNBLE1BQU0sK0NBQStDO0FBQ3JELE1BQU0sZ0RBQWdEO0FBQ3RELE1BQU07QUFDTjtBQUNBO0FBQ0EsOEJBQThCLG1CQUFtQixFQUFFO0FBQ25EO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQiwyQkFBMkI7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsImZpbGUiOiI0MzcuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgY3JlYXRlRmluZCA9IHJlcXVpcmUoJy4vX2NyZWF0ZUZpbmQnKSxcbiAgICBmaW5kSW5kZXggPSByZXF1aXJlKCcuL2ZpbmRJbmRleCcpO1xuXG4vKipcbiAqIEl0ZXJhdGVzIG92ZXIgZWxlbWVudHMgb2YgYGNvbGxlY3Rpb25gLCByZXR1cm5pbmcgdGhlIGZpcnN0IGVsZW1lbnRcbiAqIGBwcmVkaWNhdGVgIHJldHVybnMgdHJ1dGh5IGZvci4gVGhlIHByZWRpY2F0ZSBpcyBpbnZva2VkIHdpdGggdGhyZWVcbiAqIGFyZ3VtZW50czogKHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpbnNwZWN0LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHBhcmFtIHtudW1iZXJ9IFtmcm9tSW5kZXg9MF0gVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIG1hdGNoZWQgZWxlbWVudCwgZWxzZSBgdW5kZWZpbmVkYC5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIHVzZXJzID0gW1xuICogICB7ICd1c2VyJzogJ2Jhcm5leScsICAnYWdlJzogMzYsICdhY3RpdmUnOiB0cnVlIH0sXG4gKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgICdhZ2UnOiA0MCwgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gKiAgIHsgJ3VzZXInOiAncGViYmxlcycsICdhZ2UnOiAxLCAgJ2FjdGl2ZSc6IHRydWUgfVxuICogXTtcbiAqXG4gKiBfLmZpbmQodXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8uYWdlIDwgNDA7IH0pO1xuICogLy8gPT4gb2JqZWN0IGZvciAnYmFybmV5J1xuICpcbiAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gKiBfLmZpbmQodXNlcnMsIHsgJ2FnZSc6IDEsICdhY3RpdmUnOiB0cnVlIH0pO1xuICogLy8gPT4gb2JqZWN0IGZvciAncGViYmxlcydcbiAqXG4gKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gKiBfLmZpbmQodXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAqIC8vID0+IG9iamVjdCBmb3IgJ2ZyZWQnXG4gKlxuICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gKiBfLmZpbmQodXNlcnMsICdhY3RpdmUnKTtcbiAqIC8vID0+IG9iamVjdCBmb3IgJ2Jhcm5leSdcbiAqL1xudmFyIGZpbmQgPSBjcmVhdGVGaW5kKGZpbmRJbmRleCk7XG5cbm1vZHVsZS5leHBvcnRzID0gZmluZDtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///437\n")},function(module,exports,__webpack_require__){eval("var baseIteratee = __webpack_require__(55),\n isArrayLike = __webpack_require__(54),\n keys = __webpack_require__(59);\n\n/**\n * Creates a `_.find` or `_.findLast` function.\n *\n * @private\n * @param {Function} findIndexFunc The function to find the collection index.\n * @returns {Function} Returns the new find function.\n */\nfunction createFind(findIndexFunc) {\n return function(collection, predicate, fromIndex) {\n var iterable = Object(collection);\n if (!isArrayLike(collection)) {\n var iteratee = baseIteratee(predicate, 3);\n collection = keys(collection);\n predicate = function(key) { return iteratee(iterable[key], key, iterable); };\n }\n var index = findIndexFunc(collection, predicate, fromIndex);\n return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;\n };\n}\n\nmodule.exports = createFind;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jcmVhdGVGaW5kLmpzPzVjYTAiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsbUJBQW1CLG1CQUFPLENBQUMsRUFBaUI7QUFDNUMsa0JBQWtCLG1CQUFPLENBQUMsRUFBZTtBQUN6QyxXQUFXLG1CQUFPLENBQUMsRUFBUTs7QUFFM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFNBQVM7QUFDcEIsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLCtDQUErQztBQUNoRjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwiZmlsZSI6IjQzOC5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBiYXNlSXRlcmF0ZWUgPSByZXF1aXJlKCcuL19iYXNlSXRlcmF0ZWUnKSxcbiAgICBpc0FycmF5TGlrZSA9IHJlcXVpcmUoJy4vaXNBcnJheUxpa2UnKSxcbiAgICBrZXlzID0gcmVxdWlyZSgnLi9rZXlzJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGBfLmZpbmRgIG9yIGBfLmZpbmRMYXN0YCBmdW5jdGlvbi5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZmluZEluZGV4RnVuYyBUaGUgZnVuY3Rpb24gdG8gZmluZCB0aGUgY29sbGVjdGlvbiBpbmRleC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZpbmQgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUZpbmQoZmluZEluZGV4RnVuYykge1xuICByZXR1cm4gZnVuY3Rpb24oY29sbGVjdGlvbiwgcHJlZGljYXRlLCBmcm9tSW5kZXgpIHtcbiAgICB2YXIgaXRlcmFibGUgPSBPYmplY3QoY29sbGVjdGlvbik7XG4gICAgaWYgKCFpc0FycmF5TGlrZShjb2xsZWN0aW9uKSkge1xuICAgICAgdmFyIGl0ZXJhdGVlID0gYmFzZUl0ZXJhdGVlKHByZWRpY2F0ZSwgMyk7XG4gICAgICBjb2xsZWN0aW9uID0ga2V5cyhjb2xsZWN0aW9uKTtcbiAgICAgIHByZWRpY2F0ZSA9IGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gaXRlcmF0ZWUoaXRlcmFibGVba2V5XSwga2V5LCBpdGVyYWJsZSk7IH07XG4gICAgfVxuICAgIHZhciBpbmRleCA9IGZpbmRJbmRleEZ1bmMoY29sbGVjdGlvbiwgcHJlZGljYXRlLCBmcm9tSW5kZXgpO1xuICAgIHJldHVybiBpbmRleCA+IC0xID8gaXRlcmFibGVbaXRlcmF0ZWUgPyBjb2xsZWN0aW9uW2luZGV4XSA6IGluZGV4XSA6IHVuZGVmaW5lZDtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjcmVhdGVGaW5kO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///438\n")},function(module,exports,__webpack_require__){eval("var baseFindIndex = __webpack_require__(225),\n baseIteratee = __webpack_require__(55),\n toInteger = __webpack_require__(440);\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * This method is like `_.find` except that it returns the index of the first\n * element `predicate` returns truthy for instead of the element itself.\n *\n * @static\n * @memberOf _\n * @since 1.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param {number} [fromIndex=0] The index to search from.\n * @returns {number} Returns the index of the found element, else `-1`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'active': false },\n * { 'user': 'fred', 'active': false },\n * { 'user': 'pebbles', 'active': true }\n * ];\n *\n * _.findIndex(users, function(o) { return o.user == 'barney'; });\n * // => 0\n *\n * // The `_.matches` iteratee shorthand.\n * _.findIndex(users, { 'user': 'fred', 'active': false });\n * // => 1\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.findIndex(users, ['active', false]);\n * // => 0\n *\n * // The `_.property` iteratee shorthand.\n * _.findIndex(users, 'active');\n * // => 2\n */\nfunction findIndex(array, predicate, fromIndex) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return -1;\n }\n var index = fromIndex == null ? 0 : toInteger(fromIndex);\n if (index < 0) {\n index = nativeMax(length + index, 0);\n }\n return baseFindIndex(array, baseIteratee(predicate, 3), index);\n}\n\nmodule.exports = findIndex;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL2ZpbmRJbmRleC5qcz81MWY1Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLG9CQUFvQixtQkFBTyxDQUFDLEdBQWtCO0FBQzlDLG1CQUFtQixtQkFBTyxDQUFDLEVBQWlCO0FBQzVDLGdCQUFnQixtQkFBTyxDQUFDLEdBQWE7O0FBRXJDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsTUFBTTtBQUNqQixXQUFXLFNBQVM7QUFDcEIsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQSxNQUFNLHFDQUFxQztBQUMzQyxNQUFNLHFDQUFxQztBQUMzQyxNQUFNO0FBQ047QUFDQTtBQUNBLG1DQUFtQywyQkFBMkIsRUFBRTtBQUNoRTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsa0NBQWtDO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsImZpbGUiOiI0MzkuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYmFzZUZpbmRJbmRleCA9IHJlcXVpcmUoJy4vX2Jhc2VGaW5kSW5kZXgnKSxcbiAgICBiYXNlSXRlcmF0ZWUgPSByZXF1aXJlKCcuL19iYXNlSXRlcmF0ZWUnKSxcbiAgICB0b0ludGVnZXIgPSByZXF1aXJlKCcuL3RvSW50ZWdlcicpO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlTWF4ID0gTWF0aC5tYXg7XG5cbi8qKlxuICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5maW5kYCBleGNlcHQgdGhhdCBpdCByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZmlyc3RcbiAqIGVsZW1lbnQgYHByZWRpY2F0ZWAgcmV0dXJucyB0cnV0aHkgZm9yIGluc3RlYWQgb2YgdGhlIGVsZW1lbnQgaXRzZWxmLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMS4xLjBcbiAqIEBjYXRlZ29yeSBBcnJheVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcGFyYW0ge251bWJlcn0gW2Zyb21JbmRleD0wXSBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZm91bmQgZWxlbWVudCwgZWxzZSBgLTFgLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgdXNlcnMgPSBbXG4gKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgICdhY3RpdmUnOiBmYWxzZSB9LFxuICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWN0aXZlJzogZmFsc2UgfSxcbiAqICAgeyAndXNlcic6ICdwZWJibGVzJywgJ2FjdGl2ZSc6IHRydWUgfVxuICogXTtcbiAqXG4gKiBfLmZpbmRJbmRleCh1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gby51c2VyID09ICdiYXJuZXknOyB9KTtcbiAqIC8vID0+IDBcbiAqXG4gKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICogXy5maW5kSW5kZXgodXNlcnMsIHsgJ3VzZXInOiAnZnJlZCcsICdhY3RpdmUnOiBmYWxzZSB9KTtcbiAqIC8vID0+IDFcbiAqXG4gKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gKiBfLmZpbmRJbmRleCh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICogLy8gPT4gMFxuICpcbiAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICogXy5maW5kSW5kZXgodXNlcnMsICdhY3RpdmUnKTtcbiAqIC8vID0+IDJcbiAqL1xuZnVuY3Rpb24gZmluZEluZGV4KGFycmF5LCBwcmVkaWNhdGUsIGZyb21JbmRleCkge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gIGlmICghbGVuZ3RoKSB7XG4gICAgcmV0dXJuIC0xO1xuICB9XG4gIHZhciBpbmRleCA9IGZyb21JbmRleCA9PSBudWxsID8gMCA6IHRvSW50ZWdlcihmcm9tSW5kZXgpO1xuICBpZiAoaW5kZXggPCAwKSB7XG4gICAgaW5kZXggPSBuYXRpdmVNYXgobGVuZ3RoICsgaW5kZXgsIDApO1xuICB9XG4gIHJldHVybiBiYXNlRmluZEluZGV4KGFycmF5LCBiYXNlSXRlcmF0ZWUocHJlZGljYXRlLCAzKSwgaW5kZXgpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZpbmRJbmRleDtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///439\n")},function(module,exports,__webpack_require__){eval("var toFinite = __webpack_require__(233);\n\n/**\n * Converts `value` to an integer.\n *\n * **Note:** This method is loosely based on\n * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted integer.\n * @example\n *\n * _.toInteger(3.2);\n * // => 3\n *\n * _.toInteger(Number.MIN_VALUE);\n * // => 0\n *\n * _.toInteger(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toInteger('3.2');\n * // => 3\n */\nfunction toInteger(value) {\n var result = toFinite(value),\n remainder = result % 1;\n\n return result === result ? (remainder ? result - remainder : result) : 0;\n}\n\nmodule.exports = toInteger;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL3RvSW50ZWdlci5qcz80YjE3Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGVBQWUsbUJBQU8sQ0FBQyxHQUFZOztBQUVuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsRUFBRTtBQUNiLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEiLCJmaWxlIjoiNDQwLmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIHRvRmluaXRlID0gcmVxdWlyZSgnLi90b0Zpbml0ZScpO1xuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYW4gaW50ZWdlci5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgbG9vc2VseSBiYXNlZCBvblxuICogW2BUb0ludGVnZXJgXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtdG9pbnRlZ2VyKS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBpbnRlZ2VyLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRvSW50ZWdlcigzLjIpO1xuICogLy8gPT4gM1xuICpcbiAqIF8udG9JbnRlZ2VyKE51bWJlci5NSU5fVkFMVUUpO1xuICogLy8gPT4gMFxuICpcbiAqIF8udG9JbnRlZ2VyKEluZmluaXR5KTtcbiAqIC8vID0+IDEuNzk3NjkzMTM0ODYyMzE1N2UrMzA4XG4gKlxuICogXy50b0ludGVnZXIoJzMuMicpO1xuICogLy8gPT4gM1xuICovXG5mdW5jdGlvbiB0b0ludGVnZXIodmFsdWUpIHtcbiAgdmFyIHJlc3VsdCA9IHRvRmluaXRlKHZhbHVlKSxcbiAgICAgIHJlbWFpbmRlciA9IHJlc3VsdCAlIDE7XG5cbiAgcmV0dXJuIHJlc3VsdCA9PT0gcmVzdWx0ID8gKHJlbWFpbmRlciA/IHJlc3VsdCAtIHJlbWFpbmRlciA6IHJlc3VsdCkgOiAwO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHRvSW50ZWdlcjtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///440\n")},function(module,exports,__webpack_require__){eval("var baseTrim = __webpack_require__(442),\n isObject = __webpack_require__(43),\n isSymbol = __webpack_require__(76);\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = baseTrim(value);\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nmodule.exports = toNumber;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL3RvTnVtYmVyLmpzP2I0YjAiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsZUFBZSxtQkFBTyxDQUFDLEdBQWE7QUFDcEMsZUFBZSxtQkFBTyxDQUFDLEVBQVk7QUFDbkMsZUFBZSxtQkFBTyxDQUFDLEVBQVk7O0FBRW5DO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsRUFBRTtBQUNiLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsImZpbGUiOiI0NDEuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYmFzZVRyaW0gPSByZXF1aXJlKCcuL19iYXNlVHJpbScpLFxuICAgIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9pc09iamVjdCcpLFxuICAgIGlzU3ltYm9sID0gcmVxdWlyZSgnLi9pc1N5bWJvbCcpO1xuXG4vKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi9cbnZhciBOQU4gPSAwIC8gMDtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IGJhZCBzaWduZWQgaGV4YWRlY2ltYWwgc3RyaW5nIHZhbHVlcy4gKi9cbnZhciByZUlzQmFkSGV4ID0gL15bLStdMHhbMC05YS1mXSskL2k7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBiaW5hcnkgc3RyaW5nIHZhbHVlcy4gKi9cbnZhciByZUlzQmluYXJ5ID0gL14wYlswMV0rJC9pO1xuXG4vKiogVXNlZCB0byBkZXRlY3Qgb2N0YWwgc3RyaW5nIHZhbHVlcy4gKi9cbnZhciByZUlzT2N0YWwgPSAvXjBvWzAtN10rJC9pO1xuXG4vKiogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgd2l0aG91dCBhIGRlcGVuZGVuY3kgb24gYHJvb3RgLiAqL1xudmFyIGZyZWVQYXJzZUludCA9IHBhcnNlSW50O1xuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBudW1iZXIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHByb2Nlc3MuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBudW1iZXIuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udG9OdW1iZXIoMy4yKTtcbiAqIC8vID0+IDMuMlxuICpcbiAqIF8udG9OdW1iZXIoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiA1ZS0zMjRcbiAqXG4gKiBfLnRvTnVtYmVyKEluZmluaXR5KTtcbiAqIC8vID0+IEluZmluaXR5XG4gKlxuICogXy50b051bWJlcignMy4yJyk7XG4gKiAvLyA9PiAzLjJcbiAqL1xuZnVuY3Rpb24gdG9OdW1iZXIodmFsdWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJykge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBpZiAoaXNTeW1ib2wodmFsdWUpKSB7XG4gICAgcmV0dXJuIE5BTjtcbiAgfVxuICBpZiAoaXNPYmplY3QodmFsdWUpKSB7XG4gICAgdmFyIG90aGVyID0gdHlwZW9mIHZhbHVlLnZhbHVlT2YgPT0gJ2Z1bmN0aW9uJyA/IHZhbHVlLnZhbHVlT2YoKSA6IHZhbHVlO1xuICAgIHZhbHVlID0gaXNPYmplY3Qob3RoZXIpID8gKG90aGVyICsgJycpIDogb3RoZXI7XG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gMCA/IHZhbHVlIDogK3ZhbHVlO1xuICB9XG4gIHZhbHVlID0gYmFzZVRyaW0odmFsdWUpO1xuICB2YXIgaXNCaW5hcnkgPSByZUlzQmluYXJ5LnRlc3QodmFsdWUpO1xuICByZXR1cm4gKGlzQmluYXJ5IHx8IHJlSXNPY3RhbC50ZXN0KHZhbHVlKSlcbiAgICA/IGZyZWVQYXJzZUludCh2YWx1ZS5zbGljZSgyKSwgaXNCaW5hcnkgPyAyIDogOClcbiAgICA6IChyZUlzQmFkSGV4LnRlc3QodmFsdWUpID8gTkFOIDogK3ZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB0b051bWJlcjtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///441\n")},function(module,exports,__webpack_require__){eval("var trimmedEndIndex = __webpack_require__(443);\n\n/** Used to match leading whitespace. */\nvar reTrimStart = /^\\s+/;\n\n/**\n * The base implementation of `_.trim`.\n *\n * @private\n * @param {string} string The string to trim.\n * @returns {string} Returns the trimmed string.\n */\nfunction baseTrim(string) {\n return string\n ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '')\n : string;\n}\n\nmodule.exports = baseTrim;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlVHJpbS5qcz84ZDc0Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHNCQUFzQixtQkFBTyxDQUFDLEdBQW9COztBQUVsRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJmaWxlIjoiNDQyLmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIHRyaW1tZWRFbmRJbmRleCA9IHJlcXVpcmUoJy4vX3RyaW1tZWRFbmRJbmRleCcpO1xuXG4vKiogVXNlZCB0byBtYXRjaCBsZWFkaW5nIHdoaXRlc3BhY2UuICovXG52YXIgcmVUcmltU3RhcnQgPSAvXlxccysvO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnRyaW1gLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gdHJpbS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHRyaW1tZWQgc3RyaW5nLlxuICovXG5mdW5jdGlvbiBiYXNlVHJpbShzdHJpbmcpIHtcbiAgcmV0dXJuIHN0cmluZ1xuICAgID8gc3RyaW5nLnNsaWNlKDAsIHRyaW1tZWRFbmRJbmRleChzdHJpbmcpICsgMSkucmVwbGFjZShyZVRyaW1TdGFydCwgJycpXG4gICAgOiBzdHJpbmc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVRyaW07XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///442\n")},function(module,exports){eval("/** Used to match a single whitespace character. */\nvar reWhitespace = /\\s/;\n\n/**\n * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace\n * character of `string`.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {number} Returns the index of the last non-whitespace character.\n */\nfunction trimmedEndIndex(string) {\n var index = string.length;\n\n while (index-- && reWhitespace.test(string.charAt(index))) {}\n return index;\n}\n\nmodule.exports = trimmedEndIndex;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL190cmltbWVkRW5kSW5kZXguanM/NGNlZiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEiLCJmaWxlIjoiNDQzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqIFVzZWQgdG8gbWF0Y2ggYSBzaW5nbGUgd2hpdGVzcGFjZSBjaGFyYWN0ZXIuICovXG52YXIgcmVXaGl0ZXNwYWNlID0gL1xccy87XG5cbi8qKlxuICogVXNlZCBieSBgXy50cmltYCBhbmQgYF8udHJpbUVuZGAgdG8gZ2V0IHRoZSBpbmRleCBvZiB0aGUgbGFzdCBub24td2hpdGVzcGFjZVxuICogY2hhcmFjdGVyIG9mIGBzdHJpbmdgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gaW5zcGVjdC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBsYXN0IG5vbi13aGl0ZXNwYWNlIGNoYXJhY3Rlci5cbiAqL1xuZnVuY3Rpb24gdHJpbW1lZEVuZEluZGV4KHN0cmluZykge1xuICB2YXIgaW5kZXggPSBzdHJpbmcubGVuZ3RoO1xuXG4gIHdoaWxlIChpbmRleC0tICYmIHJlV2hpdGVzcGFjZS50ZXN0KHN0cmluZy5jaGFyQXQoaW5kZXgpKSkge31cbiAgcmV0dXJuIGluZGV4O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHRyaW1tZWRFbmRJbmRleDtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///443\n")},function(module,exports,__webpack_require__){eval("var baseFor = __webpack_require__(165),\n castFunction = __webpack_require__(206),\n keysIn = __webpack_require__(66);\n\n/**\n * Iterates over own and inherited enumerable string keyed properties of an\n * object and invokes `iteratee` for each property. The iteratee is invoked\n * with three arguments: (value, key, object). Iteratee functions may exit\n * iteration early by explicitly returning `false`.\n *\n * @static\n * @memberOf _\n * @since 0.3.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns `object`.\n * @see _.forInRight\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.forIn(new Foo, function(value, key) {\n * console.log(key);\n * });\n * // => Logs 'a', 'b', then 'c' (iteration order is not guaranteed).\n */\nfunction forIn(object, iteratee) {\n return object == null\n ? object\n : baseFor(object, castFunction(iteratee), keysIn);\n}\n\nmodule.exports = forIn;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL2ZvckluLmpzPzk5NDgiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxtQkFBTyxDQUFDLEdBQVk7QUFDbEMsbUJBQW1CLG1CQUFPLENBQUMsR0FBaUI7QUFDNUMsYUFBYSxtQkFBTyxDQUFDLEVBQVU7O0FBRS9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsU0FBUztBQUNwQixhQUFhLE9BQU87QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwiZmlsZSI6IjQ0NC5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBiYXNlRm9yID0gcmVxdWlyZSgnLi9fYmFzZUZvcicpLFxuICAgIGNhc3RGdW5jdGlvbiA9IHJlcXVpcmUoJy4vX2Nhc3RGdW5jdGlvbicpLFxuICAgIGtleXNJbiA9IHJlcXVpcmUoJy4va2V5c0luJyk7XG5cbi8qKlxuICogSXRlcmF0ZXMgb3ZlciBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzIG9mIGFuXG4gKiBvYmplY3QgYW5kIGludm9rZXMgYGl0ZXJhdGVlYCBmb3IgZWFjaCBwcm9wZXJ0eS4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWRcbiAqIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGtleSwgb2JqZWN0KS4gSXRlcmF0ZWUgZnVuY3Rpb25zIG1heSBleGl0XG4gKiBpdGVyYXRpb24gZWFybHkgYnkgZXhwbGljaXRseSByZXR1cm5pbmcgYGZhbHNlYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMy4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICogQHNlZSBfLmZvckluUmlnaHRcbiAqIEBleGFtcGxlXG4gKlxuICogZnVuY3Rpb24gRm9vKCkge1xuICogICB0aGlzLmEgPSAxO1xuICogICB0aGlzLmIgPSAyO1xuICogfVxuICpcbiAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gKlxuICogXy5mb3JJbihuZXcgRm9vLCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gKiAgIGNvbnNvbGUubG9nKGtleSk7XG4gKiB9KTtcbiAqIC8vID0+IExvZ3MgJ2EnLCAnYicsIHRoZW4gJ2MnIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpLlxuICovXG5mdW5jdGlvbiBmb3JJbihvYmplY3QsIGl0ZXJhdGVlKSB7XG4gIHJldHVybiBvYmplY3QgPT0gbnVsbFxuICAgID8gb2JqZWN0XG4gICAgOiBiYXNlRm9yKG9iamVjdCwgY2FzdEZ1bmN0aW9uKGl0ZXJhdGVlKSwga2V5c0luKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmb3JJbjtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///444\n")},function(module,exports){eval("/**\n * Gets the last element of `array`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to query.\n * @returns {*} Returns the last element of `array`.\n * @example\n *\n * _.last([1, 2, 3]);\n * // => 3\n */\nfunction last(array) {\n var length = array == null ? 0 : array.length;\n return length ? array[length - 1] : undefined;\n}\n\nmodule.exports = last;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL2xhc3QuanM/NDQxNiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsTUFBTTtBQUNqQixhQUFhLEVBQUU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJmaWxlIjoiNDQ1LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZXRzIHRoZSBsYXN0IGVsZW1lbnQgb2YgYGFycmF5YC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgQXJyYXlcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBsYXN0IGVsZW1lbnQgb2YgYGFycmF5YC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5sYXN0KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiAzXG4gKi9cbmZ1bmN0aW9uIGxhc3QoYXJyYXkpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICByZXR1cm4gbGVuZ3RoID8gYXJyYXlbbGVuZ3RoIC0gMV0gOiB1bmRlZmluZWQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbGFzdDtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///445\n")},function(module,exports,__webpack_require__){eval("var baseAssignValue = __webpack_require__(105),\n baseForOwn = __webpack_require__(164),\n baseIteratee = __webpack_require__(55);\n\n/**\n * Creates an object with the same keys as `object` and values generated\n * by running each own enumerable string keyed property of `object` thru\n * `iteratee`. The iteratee is invoked with three arguments:\n * (value, key, object).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns the new mapped object.\n * @see _.mapKeys\n * @example\n *\n * var users = {\n * 'fred': { 'user': 'fred', 'age': 40 },\n * 'pebbles': { 'user': 'pebbles', 'age': 1 }\n * };\n *\n * _.mapValues(users, function(o) { return o.age; });\n * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\n *\n * // The `_.property` iteratee shorthand.\n * _.mapValues(users, 'age');\n * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\n */\nfunction mapValues(object, iteratee) {\n var result = {};\n iteratee = baseIteratee(iteratee, 3);\n\n baseForOwn(object, function(value, key, object) {\n baseAssignValue(result, key, iteratee(value, key, object));\n });\n return result;\n}\n\nmodule.exports = mapValues;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL21hcFZhbHVlcy5qcz85ZTg2Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHNCQUFzQixtQkFBTyxDQUFDLEdBQW9CO0FBQ2xELGlCQUFpQixtQkFBTyxDQUFDLEdBQWU7QUFDeEMsbUJBQW1CLG1CQUFPLENBQUMsRUFBaUI7O0FBRTVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsU0FBUztBQUNwQixhQUFhLE9BQU87QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsK0JBQStCO0FBQ2hELGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0EsbUNBQW1DLGNBQWMsRUFBRTtBQUNuRCxVQUFVLDJCQUEyQjtBQUNyQztBQUNBO0FBQ0E7QUFDQSxVQUFVLDJCQUEyQjtBQUNyQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUEiLCJmaWxlIjoiNDQ2LmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIGJhc2VBc3NpZ25WYWx1ZSA9IHJlcXVpcmUoJy4vX2Jhc2VBc3NpZ25WYWx1ZScpLFxuICAgIGJhc2VGb3JPd24gPSByZXF1aXJlKCcuL19iYXNlRm9yT3duJyksXG4gICAgYmFzZUl0ZXJhdGVlID0gcmVxdWlyZSgnLi9fYmFzZUl0ZXJhdGVlJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBvYmplY3Qgd2l0aCB0aGUgc2FtZSBrZXlzIGFzIGBvYmplY3RgIGFuZCB2YWx1ZXMgZ2VuZXJhdGVkXG4gKiBieSBydW5uaW5nIGVhY2ggb3duIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnR5IG9mIGBvYmplY3RgIHRocnVcbiAqIGBpdGVyYXRlZWAuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOlxuICogKHZhbHVlLCBrZXksIG9iamVjdCkuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAyLjQuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG1hcHBlZCBvYmplY3QuXG4gKiBAc2VlIF8ubWFwS2V5c1xuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgdXNlcnMgPSB7XG4gKiAgICdmcmVkJzogICAgeyAndXNlcic6ICdmcmVkJywgICAgJ2FnZSc6IDQwIH0sXG4gKiAgICdwZWJibGVzJzogeyAndXNlcic6ICdwZWJibGVzJywgJ2FnZSc6IDEgfVxuICogfTtcbiAqXG4gKiBfLm1hcFZhbHVlcyh1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gby5hZ2U7IH0pO1xuICogLy8gPT4geyAnZnJlZCc6IDQwLCAncGViYmxlcyc6IDEgfSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICpcbiAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICogXy5tYXBWYWx1ZXModXNlcnMsICdhZ2UnKTtcbiAqIC8vID0+IHsgJ2ZyZWQnOiA0MCwgJ3BlYmJsZXMnOiAxIH0gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAqL1xuZnVuY3Rpb24gbWFwVmFsdWVzKG9iamVjdCwgaXRlcmF0ZWUpIHtcbiAgdmFyIHJlc3VsdCA9IHt9O1xuICBpdGVyYXRlZSA9IGJhc2VJdGVyYXRlZShpdGVyYXRlZSwgMyk7XG5cbiAgYmFzZUZvck93bihvYmplY3QsIGZ1bmN0aW9uKHZhbHVlLCBrZXksIG9iamVjdCkge1xuICAgIGJhc2VBc3NpZ25WYWx1ZShyZXN1bHQsIGtleSwgaXRlcmF0ZWUodmFsdWUsIGtleSwgb2JqZWN0KSk7XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG1hcFZhbHVlcztcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///446\n")},function(module,exports,__webpack_require__){eval("var baseExtremum = __webpack_require__(169),\n baseGt = __webpack_require__(448),\n identity = __webpack_require__(67);\n\n/**\n * Computes the maximum value of `array`. If `array` is empty or falsey,\n * `undefined` is returned.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Math\n * @param {Array} array The array to iterate over.\n * @returns {*} Returns the maximum value.\n * @example\n *\n * _.max([4, 2, 8, 6]);\n * // => 8\n *\n * _.max([]);\n * // => undefined\n */\nfunction max(array) {\n return (array && array.length)\n ? baseExtremum(array, identity, baseGt)\n : undefined;\n}\n\nmodule.exports = max;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL21heC5qcz9hYmRkIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLG1CQUFtQixtQkFBTyxDQUFDLEdBQWlCO0FBQzVDLGFBQWEsbUJBQU8sQ0FBQyxHQUFXO0FBQ2hDLGVBQWUsbUJBQU8sQ0FBQyxFQUFZOztBQUVuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxNQUFNO0FBQ2pCLGFBQWEsRUFBRTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwiZmlsZSI6IjQ0Ny5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBiYXNlRXh0cmVtdW0gPSByZXF1aXJlKCcuL19iYXNlRXh0cmVtdW0nKSxcbiAgICBiYXNlR3QgPSByZXF1aXJlKCcuL19iYXNlR3QnKSxcbiAgICBpZGVudGl0eSA9IHJlcXVpcmUoJy4vaWRlbnRpdHknKTtcblxuLyoqXG4gKiBDb21wdXRlcyB0aGUgbWF4aW11bSB2YWx1ZSBvZiBgYXJyYXlgLiBJZiBgYXJyYXlgIGlzIGVtcHR5IG9yIGZhbHNleSxcbiAqIGB1bmRlZmluZWRgIGlzIHJldHVybmVkLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBzaW5jZSAwLjEuMFxuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBNYXRoXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIG1heGltdW0gdmFsdWUuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8ubWF4KFs0LCAyLCA4LCA2XSk7XG4gKiAvLyA9PiA4XG4gKlxuICogXy5tYXgoW10pO1xuICogLy8gPT4gdW5kZWZpbmVkXG4gKi9cbmZ1bmN0aW9uIG1heChhcnJheSkge1xuICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aClcbiAgICA/IGJhc2VFeHRyZW11bShhcnJheSwgaWRlbnRpdHksIGJhc2VHdClcbiAgICA6IHVuZGVmaW5lZDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtYXg7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///447\n")},function(module,exports){eval("/**\n * The base implementation of `_.gt` which doesn't coerce arguments.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is greater than `other`,\n * else `false`.\n */\nfunction baseGt(value, other) {\n return value > other;\n}\n\nmodule.exports = baseGt;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlR3QuanM/NTdkYyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsRUFBRTtBQUNiLFdBQVcsRUFBRTtBQUNiLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwiZmlsZSI6IjQ0OC5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZ3RgIHdoaWNoIGRvZXNuJ3QgY29lcmNlIGFyZ3VtZW50cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7Kn0gb3RoZXIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBncmVhdGVyIHRoYW4gYG90aGVyYCxcbiAqICBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VHdCh2YWx1ZSwgb3RoZXIpIHtcbiAgcmV0dXJuIHZhbHVlID4gb3RoZXI7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUd0O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///448\n")},function(module,exports,__webpack_require__){eval("var baseMerge = __webpack_require__(450),\n createAssigner = __webpack_require__(454);\n\n/**\n * This method is like `_.assign` except that it recursively merges own and\n * inherited enumerable string keyed properties of source objects into the\n * destination object. Source properties that resolve to `undefined` are\n * skipped if a destination value exists. Array and plain object properties\n * are merged recursively. Other objects and value types are overridden by\n * assignment. Source objects are applied from left to right. Subsequent\n * sources overwrite property assignments of previous sources.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 0.5.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var object = {\n * 'a': [{ 'b': 2 }, { 'd': 4 }]\n * };\n *\n * var other = {\n * 'a': [{ 'c': 3 }, { 'e': 5 }]\n * };\n *\n * _.merge(object, other);\n * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }\n */\nvar merge = createAssigner(function(object, source, srcIndex) {\n baseMerge(object, source, srcIndex);\n});\n\nmodule.exports = merge;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL21lcmdlLmpzPzQyNDUiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsZ0JBQWdCLG1CQUFPLENBQUMsR0FBYztBQUN0QyxxQkFBcUIsbUJBQU8sQ0FBQyxHQUFtQjs7QUFFaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsVUFBVTtBQUNyQixhQUFhLE9BQU87QUFDcEI7QUFDQTtBQUNBO0FBQ0EsWUFBWSxTQUFTLEdBQUcsU0FBUztBQUNqQztBQUNBO0FBQ0E7QUFDQSxZQUFZLFNBQVMsR0FBRyxTQUFTO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBLFVBQVUsUUFBUSxpQkFBaUIsR0FBRyxpQkFBaUI7QUFDdkQ7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRCIsImZpbGUiOiI0NDkuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYmFzZU1lcmdlID0gcmVxdWlyZSgnLi9fYmFzZU1lcmdlJyksXG4gICAgY3JlYXRlQXNzaWduZXIgPSByZXF1aXJlKCcuL19jcmVhdGVBc3NpZ25lcicpO1xuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uYXNzaWduYCBleGNlcHQgdGhhdCBpdCByZWN1cnNpdmVseSBtZXJnZXMgb3duIGFuZFxuICogaW5oZXJpdGVkIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnRpZXMgb2Ygc291cmNlIG9iamVjdHMgaW50byB0aGVcbiAqIGRlc3RpbmF0aW9uIG9iamVjdC4gU291cmNlIHByb3BlcnRpZXMgdGhhdCByZXNvbHZlIHRvIGB1bmRlZmluZWRgIGFyZVxuICogc2tpcHBlZCBpZiBhIGRlc3RpbmF0aW9uIHZhbHVlIGV4aXN0cy4gQXJyYXkgYW5kIHBsYWluIG9iamVjdCBwcm9wZXJ0aWVzXG4gKiBhcmUgbWVyZ2VkIHJlY3Vyc2l2ZWx5LiBPdGhlciBvYmplY3RzIGFuZCB2YWx1ZSB0eXBlcyBhcmUgb3ZlcnJpZGRlbiBieVxuICogYXNzaWdubWVudC4gU291cmNlIG9iamVjdHMgYXJlIGFwcGxpZWQgZnJvbSBsZWZ0IHRvIHJpZ2h0LiBTdWJzZXF1ZW50XG4gKiBzb3VyY2VzIG92ZXJ3cml0ZSBwcm9wZXJ0eSBhc3NpZ25tZW50cyBvZiBwcmV2aW91cyBzb3VyY2VzLlxuICpcbiAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC41LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAqIEBwYXJhbSB7Li4uT2JqZWN0fSBbc291cmNlc10gVGhlIHNvdXJjZSBvYmplY3RzLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdCA9IHtcbiAqICAgJ2EnOiBbeyAnYic6IDIgfSwgeyAnZCc6IDQgfV1cbiAqIH07XG4gKlxuICogdmFyIG90aGVyID0ge1xuICogICAnYSc6IFt7ICdjJzogMyB9LCB7ICdlJzogNSB9XVxuICogfTtcbiAqXG4gKiBfLm1lcmdlKG9iamVjdCwgb3RoZXIpO1xuICogLy8gPT4geyAnYSc6IFt7ICdiJzogMiwgJ2MnOiAzIH0sIHsgJ2QnOiA0LCAnZSc6IDUgfV0gfVxuICovXG52YXIgbWVyZ2UgPSBjcmVhdGVBc3NpZ25lcihmdW5jdGlvbihvYmplY3QsIHNvdXJjZSwgc3JjSW5kZXgpIHtcbiAgYmFzZU1lcmdlKG9iamVjdCwgc291cmNlLCBzcmNJbmRleCk7XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBtZXJnZTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///449\n")},function(module,exports,__webpack_require__){eval("var Stack = __webpack_require__(99),\n assignMergeValue = __webpack_require__(235),\n baseFor = __webpack_require__(165),\n baseMergeDeep = __webpack_require__(451),\n isObject = __webpack_require__(43),\n keysIn = __webpack_require__(66),\n safeGet = __webpack_require__(236);\n\n/**\n * The base implementation of `_.merge` without support for multiple sources.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @param {number} srcIndex The index of `source`.\n * @param {Function} [customizer] The function to customize merged values.\n * @param {Object} [stack] Tracks traversed source values and their merged\n * counterparts.\n */\nfunction baseMerge(object, source, srcIndex, customizer, stack) {\n if (object === source) {\n return;\n }\n baseFor(source, function(srcValue, key) {\n stack || (stack = new Stack);\n if (isObject(srcValue)) {\n baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack);\n }\n else {\n var newValue = customizer\n ? customizer(safeGet(object, key), srcValue, (key + ''), object, source, stack)\n : undefined;\n\n if (newValue === undefined) {\n newValue = srcValue;\n }\n assignMergeValue(object, key, newValue);\n }\n }, keysIn);\n}\n\nmodule.exports = baseMerge;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlTWVyZ2UuanM/ZjkwOSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZLG1CQUFPLENBQUMsRUFBVTtBQUM5Qix1QkFBdUIsbUJBQU8sQ0FBQyxHQUFxQjtBQUNwRCxjQUFjLG1CQUFPLENBQUMsR0FBWTtBQUNsQyxvQkFBb0IsbUJBQU8sQ0FBQyxHQUFrQjtBQUM5QyxlQUFlLG1CQUFPLENBQUMsRUFBWTtBQUNuQyxhQUFhLG1CQUFPLENBQUMsRUFBVTtBQUMvQixjQUFjLG1CQUFPLENBQUMsR0FBWTs7QUFFbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixXQUFXLFNBQVM7QUFDcEIsV0FBVyxPQUFPO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBIiwiZmlsZSI6IjQ1MC5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBTdGFjayA9IHJlcXVpcmUoJy4vX1N0YWNrJyksXG4gICAgYXNzaWduTWVyZ2VWYWx1ZSA9IHJlcXVpcmUoJy4vX2Fzc2lnbk1lcmdlVmFsdWUnKSxcbiAgICBiYXNlRm9yID0gcmVxdWlyZSgnLi9fYmFzZUZvcicpLFxuICAgIGJhc2VNZXJnZURlZXAgPSByZXF1aXJlKCcuL19iYXNlTWVyZ2VEZWVwJyksXG4gICAgaXNPYmplY3QgPSByZXF1aXJlKCcuL2lzT2JqZWN0JyksXG4gICAga2V5c0luID0gcmVxdWlyZSgnLi9rZXlzSW4nKSxcbiAgICBzYWZlR2V0ID0gcmVxdWlyZSgnLi9fc2FmZUdldCcpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLm1lcmdlYCB3aXRob3V0IHN1cHBvcnQgZm9yIG11bHRpcGxlIHNvdXJjZXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIHNvdXJjZSBvYmplY3QuXG4gKiBAcGFyYW0ge251bWJlcn0gc3JjSW5kZXggVGhlIGluZGV4IG9mIGBzb3VyY2VgLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgbWVyZ2VkIHZhbHVlcy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbc3RhY2tdIFRyYWNrcyB0cmF2ZXJzZWQgc291cmNlIHZhbHVlcyBhbmQgdGhlaXIgbWVyZ2VkXG4gKiAgY291bnRlcnBhcnRzLlxuICovXG5mdW5jdGlvbiBiYXNlTWVyZ2Uob2JqZWN0LCBzb3VyY2UsIHNyY0luZGV4LCBjdXN0b21pemVyLCBzdGFjaykge1xuICBpZiAob2JqZWN0ID09PSBzb3VyY2UpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgYmFzZUZvcihzb3VyY2UsIGZ1bmN0aW9uKHNyY1ZhbHVlLCBrZXkpIHtcbiAgICBzdGFjayB8fCAoc3RhY2sgPSBuZXcgU3RhY2spO1xuICAgIGlmIChpc09iamVjdChzcmNWYWx1ZSkpIHtcbiAgICAgIGJhc2VNZXJnZURlZXAob2JqZWN0LCBzb3VyY2UsIGtleSwgc3JjSW5kZXgsIGJhc2VNZXJnZSwgY3VzdG9taXplciwgc3RhY2spO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHZhciBuZXdWYWx1ZSA9IGN1c3RvbWl6ZXJcbiAgICAgICAgPyBjdXN0b21pemVyKHNhZmVHZXQob2JqZWN0LCBrZXkpLCBzcmNWYWx1ZSwgKGtleSArICcnKSwgb2JqZWN0LCBzb3VyY2UsIHN0YWNrKVxuICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgaWYgKG5ld1ZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbmV3VmFsdWUgPSBzcmNWYWx1ZTtcbiAgICAgIH1cbiAgICAgIGFzc2lnbk1lcmdlVmFsdWUob2JqZWN0LCBrZXksIG5ld1ZhbHVlKTtcbiAgICB9XG4gIH0sIGtleXNJbik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZU1lcmdlO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///450\n")},function(module,exports,__webpack_require__){eval("var assignMergeValue = __webpack_require__(235),\n cloneBuffer = __webpack_require__(192),\n cloneTypedArray = __webpack_require__(201),\n copyArray = __webpack_require__(193),\n initCloneObject = __webpack_require__(202),\n isArguments = __webpack_require__(88),\n isArray = __webpack_require__(31),\n isArrayLikeObject = __webpack_require__(226),\n isBuffer = __webpack_require__(74),\n isFunction = __webpack_require__(86),\n isObject = __webpack_require__(43),\n isPlainObject = __webpack_require__(452),\n isTypedArray = __webpack_require__(89),\n safeGet = __webpack_require__(236),\n toPlainObject = __webpack_require__(453);\n\n/**\n * A specialized version of `baseMerge` for arrays and objects which performs\n * deep merges and tracks traversed objects enabling objects with circular\n * references to be merged.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @param {string} key The key of the value to merge.\n * @param {number} srcIndex The index of `source`.\n * @param {Function} mergeFunc The function to merge values.\n * @param {Function} [customizer] The function to customize assigned values.\n * @param {Object} [stack] Tracks traversed source values and their merged\n * counterparts.\n */\nfunction baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) {\n var objValue = safeGet(object, key),\n srcValue = safeGet(source, key),\n stacked = stack.get(srcValue);\n\n if (stacked) {\n assignMergeValue(object, key, stacked);\n return;\n }\n var newValue = customizer\n ? customizer(objValue, srcValue, (key + ''), object, source, stack)\n : undefined;\n\n var isCommon = newValue === undefined;\n\n if (isCommon) {\n var isArr = isArray(srcValue),\n isBuff = !isArr && isBuffer(srcValue),\n isTyped = !isArr && !isBuff && isTypedArray(srcValue);\n\n newValue = srcValue;\n if (isArr || isBuff || isTyped) {\n if (isArray(objValue)) {\n newValue = objValue;\n }\n else if (isArrayLikeObject(objValue)) {\n newValue = copyArray(objValue);\n }\n else if (isBuff) {\n isCommon = false;\n newValue = cloneBuffer(srcValue, true);\n }\n else if (isTyped) {\n isCommon = false;\n newValue = cloneTypedArray(srcValue, true);\n }\n else {\n newValue = [];\n }\n }\n else if (isPlainObject(srcValue) || isArguments(srcValue)) {\n newValue = objValue;\n if (isArguments(objValue)) {\n newValue = toPlainObject(objValue);\n }\n else if (!isObject(objValue) || isFunction(objValue)) {\n newValue = initCloneObject(srcValue);\n }\n }\n else {\n isCommon = false;\n }\n }\n if (isCommon) {\n // Recursively merge objects and arrays (susceptible to call stack limits).\n stack.set(srcValue, newValue);\n mergeFunc(newValue, srcValue, srcIndex, customizer, stack);\n stack['delete'](srcValue);\n }\n assignMergeValue(object, key, newValue);\n}\n\nmodule.exports = baseMergeDeep;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlTWVyZ2VEZWVwLmpzPzRmNTAiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsdUJBQXVCLG1CQUFPLENBQUMsR0FBcUI7QUFDcEQsa0JBQWtCLG1CQUFPLENBQUMsR0FBZ0I7QUFDMUMsc0JBQXNCLG1CQUFPLENBQUMsR0FBb0I7QUFDbEQsZ0JBQWdCLG1CQUFPLENBQUMsR0FBYztBQUN0QyxzQkFBc0IsbUJBQU8sQ0FBQyxHQUFvQjtBQUNsRCxrQkFBa0IsbUJBQU8sQ0FBQyxFQUFlO0FBQ3pDLGNBQWMsbUJBQU8sQ0FBQyxFQUFXO0FBQ2pDLHdCQUF3QixtQkFBTyxDQUFDLEdBQXFCO0FBQ3JELGVBQWUsbUJBQU8sQ0FBQyxFQUFZO0FBQ25DLGlCQUFpQixtQkFBTyxDQUFDLEVBQWM7QUFDdkMsZUFBZSxtQkFBTyxDQUFDLEVBQVk7QUFDbkMsb0JBQW9CLG1CQUFPLENBQUMsR0FBaUI7QUFDN0MsbUJBQW1CLG1CQUFPLENBQUMsRUFBZ0I7QUFDM0MsY0FBYyxtQkFBTyxDQUFDLEdBQVk7QUFDbEMsb0JBQW9CLG1CQUFPLENBQUMsR0FBaUI7O0FBRTdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixXQUFXLFNBQVM7QUFDcEIsV0FBVyxTQUFTO0FBQ3BCLFdBQVcsT0FBTztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsImZpbGUiOiI0NTEuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYXNzaWduTWVyZ2VWYWx1ZSA9IHJlcXVpcmUoJy4vX2Fzc2lnbk1lcmdlVmFsdWUnKSxcbiAgICBjbG9uZUJ1ZmZlciA9IHJlcXVpcmUoJy4vX2Nsb25lQnVmZmVyJyksXG4gICAgY2xvbmVUeXBlZEFycmF5ID0gcmVxdWlyZSgnLi9fY2xvbmVUeXBlZEFycmF5JyksXG4gICAgY29weUFycmF5ID0gcmVxdWlyZSgnLi9fY29weUFycmF5JyksXG4gICAgaW5pdENsb25lT2JqZWN0ID0gcmVxdWlyZSgnLi9faW5pdENsb25lT2JqZWN0JyksXG4gICAgaXNBcmd1bWVudHMgPSByZXF1aXJlKCcuL2lzQXJndW1lbnRzJyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpLFxuICAgIGlzQXJyYXlMaWtlT2JqZWN0ID0gcmVxdWlyZSgnLi9pc0FycmF5TGlrZU9iamVjdCcpLFxuICAgIGlzQnVmZmVyID0gcmVxdWlyZSgnLi9pc0J1ZmZlcicpLFxuICAgIGlzRnVuY3Rpb24gPSByZXF1aXJlKCcuL2lzRnVuY3Rpb24nKSxcbiAgICBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXNPYmplY3QnKSxcbiAgICBpc1BsYWluT2JqZWN0ID0gcmVxdWlyZSgnLi9pc1BsYWluT2JqZWN0JyksXG4gICAgaXNUeXBlZEFycmF5ID0gcmVxdWlyZSgnLi9pc1R5cGVkQXJyYXknKSxcbiAgICBzYWZlR2V0ID0gcmVxdWlyZSgnLi9fc2FmZUdldCcpLFxuICAgIHRvUGxhaW5PYmplY3QgPSByZXF1aXJlKCcuL3RvUGxhaW5PYmplY3QnKTtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VNZXJnZWAgZm9yIGFycmF5cyBhbmQgb2JqZWN0cyB3aGljaCBwZXJmb3Jtc1xuICogZGVlcCBtZXJnZXMgYW5kIHRyYWNrcyB0cmF2ZXJzZWQgb2JqZWN0cyBlbmFibGluZyBvYmplY3RzIHdpdGggY2lyY3VsYXJcbiAqIHJlZmVyZW5jZXMgdG8gYmUgbWVyZ2VkLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBzb3VyY2Ugb2JqZWN0LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBtZXJnZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBzcmNJbmRleCBUaGUgaW5kZXggb2YgYHNvdXJjZWAuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBtZXJnZUZ1bmMgVGhlIGZ1bmN0aW9uIHRvIG1lcmdlIHZhbHVlcy5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGFzc2lnbmVkIHZhbHVlcy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbc3RhY2tdIFRyYWNrcyB0cmF2ZXJzZWQgc291cmNlIHZhbHVlcyBhbmQgdGhlaXIgbWVyZ2VkXG4gKiAgY291bnRlcnBhcnRzLlxuICovXG5mdW5jdGlvbiBiYXNlTWVyZ2VEZWVwKG9iamVjdCwgc291cmNlLCBrZXksIHNyY0luZGV4LCBtZXJnZUZ1bmMsIGN1c3RvbWl6ZXIsIHN0YWNrKSB7XG4gIHZhciBvYmpWYWx1ZSA9IHNhZmVHZXQob2JqZWN0LCBrZXkpLFxuICAgICAgc3JjVmFsdWUgPSBzYWZlR2V0KHNvdXJjZSwga2V5KSxcbiAgICAgIHN0YWNrZWQgPSBzdGFjay5nZXQoc3JjVmFsdWUpO1xuXG4gIGlmIChzdGFja2VkKSB7XG4gICAgYXNzaWduTWVyZ2VWYWx1ZShvYmplY3QsIGtleSwgc3RhY2tlZCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBuZXdWYWx1ZSA9IGN1c3RvbWl6ZXJcbiAgICA/IGN1c3RvbWl6ZXIob2JqVmFsdWUsIHNyY1ZhbHVlLCAoa2V5ICsgJycpLCBvYmplY3QsIHNvdXJjZSwgc3RhY2spXG4gICAgOiB1bmRlZmluZWQ7XG5cbiAgdmFyIGlzQ29tbW9uID0gbmV3VmFsdWUgPT09IHVuZGVmaW5lZDtcblxuICBpZiAoaXNDb21tb24pIHtcbiAgICB2YXIgaXNBcnIgPSBpc0FycmF5KHNyY1ZhbHVlKSxcbiAgICAgICAgaXNCdWZmID0gIWlzQXJyICYmIGlzQnVmZmVyKHNyY1ZhbHVlKSxcbiAgICAgICAgaXNUeXBlZCA9ICFpc0FyciAmJiAhaXNCdWZmICYmIGlzVHlwZWRBcnJheShzcmNWYWx1ZSk7XG5cbiAgICBuZXdWYWx1ZSA9IHNyY1ZhbHVlO1xuICAgIGlmIChpc0FyciB8fCBpc0J1ZmYgfHwgaXNUeXBlZCkge1xuICAgICAgaWYgKGlzQXJyYXkob2JqVmFsdWUpKSB7XG4gICAgICAgIG5ld1ZhbHVlID0gb2JqVmFsdWU7XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChpc0FycmF5TGlrZU9iamVjdChvYmpWYWx1ZSkpIHtcbiAgICAgICAgbmV3VmFsdWUgPSBjb3B5QXJyYXkob2JqVmFsdWUpO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoaXNCdWZmKSB7XG4gICAgICAgIGlzQ29tbW9uID0gZmFsc2U7XG4gICAgICAgIG5ld1ZhbHVlID0gY2xvbmVCdWZmZXIoc3JjVmFsdWUsIHRydWUpO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoaXNUeXBlZCkge1xuICAgICAgICBpc0NvbW1vbiA9IGZhbHNlO1xuICAgICAgICBuZXdWYWx1ZSA9IGNsb25lVHlwZWRBcnJheShzcmNWYWx1ZSwgdHJ1ZSk7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgbmV3VmFsdWUgPSBbXTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoaXNQbGFpbk9iamVjdChzcmNWYWx1ZSkgfHwgaXNBcmd1bWVudHMoc3JjVmFsdWUpKSB7XG4gICAgICBuZXdWYWx1ZSA9IG9ialZhbHVlO1xuICAgICAgaWYgKGlzQXJndW1lbnRzKG9ialZhbHVlKSkge1xuICAgICAgICBuZXdWYWx1ZSA9IHRvUGxhaW5PYmplY3Qob2JqVmFsdWUpO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoIWlzT2JqZWN0KG9ialZhbHVlKSB8fCBpc0Z1bmN0aW9uKG9ialZhbHVlKSkge1xuICAgICAgICBuZXdWYWx1ZSA9IGluaXRDbG9uZU9iamVjdChzcmNWYWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgaXNDb21tb24gPSBmYWxzZTtcbiAgICB9XG4gIH1cbiAgaWYgKGlzQ29tbW9uKSB7XG4gICAgLy8gUmVjdXJzaXZlbHkgbWVyZ2Ugb2JqZWN0cyBhbmQgYXJyYXlzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG4gICAgc3RhY2suc2V0KHNyY1ZhbHVlLCBuZXdWYWx1ZSk7XG4gICAgbWVyZ2VGdW5jKG5ld1ZhbHVlLCBzcmNWYWx1ZSwgc3JjSW5kZXgsIGN1c3RvbWl6ZXIsIHN0YWNrKTtcbiAgICBzdGFja1snZGVsZXRlJ10oc3JjVmFsdWUpO1xuICB9XG4gIGFzc2lnbk1lcmdlVmFsdWUob2JqZWN0LCBrZXksIG5ld1ZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlTWVyZ2VEZWVwO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///451\n")},function(module,exports,__webpack_require__){eval("var baseGetTag = __webpack_require__(65),\n getPrototype = __webpack_require__(109),\n isObjectLike = __webpack_require__(49);\n\n/** `Object#toString` result references. */\nvar objectTag = '[object Object]';\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to infer the `Object` constructor. */\nvar objectCtorString = funcToString.call(Object);\n\n/**\n * Checks if `value` is a plain object, that is, an object created by the\n * `Object` constructor or one with a `[[Prototype]]` of `null`.\n *\n * @static\n * @memberOf _\n * @since 0.8.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * }\n *\n * _.isPlainObject(new Foo);\n * // => false\n *\n * _.isPlainObject([1, 2, 3]);\n * // => false\n *\n * _.isPlainObject({ 'x': 0, 'y': 0 });\n * // => true\n *\n * _.isPlainObject(Object.create(null));\n * // => true\n */\nfunction isPlainObject(value) {\n if (!isObjectLike(value) || baseGetTag(value) != objectTag) {\n return false;\n }\n var proto = getPrototype(value);\n if (proto === null) {\n return true;\n }\n var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;\n return typeof Ctor == 'function' && Ctor instanceof Ctor &&\n funcToString.call(Ctor) == objectCtorString;\n}\n\nmodule.exports = isPlainObject;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzUGxhaW5PYmplY3QuanM/NjBlZCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxpQkFBaUIsbUJBQU8sQ0FBQyxFQUFlO0FBQ3hDLG1CQUFtQixtQkFBTyxDQUFDLEdBQWlCO0FBQzVDLG1CQUFtQixtQkFBTyxDQUFDLEVBQWdCOztBQUUzQztBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxFQUFFO0FBQ2IsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixpQkFBaUI7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsImZpbGUiOiI0NTIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYmFzZUdldFRhZyA9IHJlcXVpcmUoJy4vX2Jhc2VHZXRUYWcnKSxcbiAgICBnZXRQcm90b3R5cGUgPSByZXF1aXJlKCcuL19nZXRQcm90b3R5cGUnKSxcbiAgICBpc09iamVjdExpa2UgPSByZXF1aXJlKCcuL2lzT2JqZWN0TGlrZScpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0VGFnID0gJ1tvYmplY3QgT2JqZWN0XSc7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBmdW5jUHJvdG8gPSBGdW5jdGlvbi5wcm90b3R5cGUsXG4gICAgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byByZXNvbHZlIHRoZSBkZWNvbXBpbGVkIHNvdXJjZSBvZiBmdW5jdGlvbnMuICovXG52YXIgZnVuY1RvU3RyaW5nID0gZnVuY1Byb3RvLnRvU3RyaW5nO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKiogVXNlZCB0byBpbmZlciB0aGUgYE9iamVjdGAgY29uc3RydWN0b3IuICovXG52YXIgb2JqZWN0Q3RvclN0cmluZyA9IGZ1bmNUb1N0cmluZy5jYWxsKE9iamVjdCk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBwbGFpbiBvYmplY3QsIHRoYXQgaXMsIGFuIG9iamVjdCBjcmVhdGVkIGJ5IHRoZVxuICogYE9iamVjdGAgY29uc3RydWN0b3Igb3Igb25lIHdpdGggYSBgW1tQcm90b3R5cGVdXWAgb2YgYG51bGxgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC44LjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgcGxhaW4gb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIGZ1bmN0aW9uIEZvbygpIHtcbiAqICAgdGhpcy5hID0gMTtcbiAqIH1cbiAqXG4gKiBfLmlzUGxhaW5PYmplY3QobmV3IEZvbyk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNQbGFpbk9iamVjdChbMSwgMiwgM10pO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzUGxhaW5PYmplY3QoeyAneCc6IDAsICd5JzogMCB9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzUGxhaW5PYmplY3QoT2JqZWN0LmNyZWF0ZShudWxsKSk7XG4gKiAvLyA9PiB0cnVlXG4gKi9cbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsdWUpIHtcbiAgaWYgKCFpc09iamVjdExpa2UodmFsdWUpIHx8IGJhc2VHZXRUYWcodmFsdWUpICE9IG9iamVjdFRhZykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgcHJvdG8gPSBnZXRQcm90b3R5cGUodmFsdWUpO1xuICBpZiAocHJvdG8gPT09IG51bGwpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICB2YXIgQ3RvciA9IGhhc093blByb3BlcnR5LmNhbGwocHJvdG8sICdjb25zdHJ1Y3RvcicpICYmIHByb3RvLmNvbnN0cnVjdG9yO1xuICByZXR1cm4gdHlwZW9mIEN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBDdG9yIGluc3RhbmNlb2YgQ3RvciAmJlxuICAgIGZ1bmNUb1N0cmluZy5jYWxsKEN0b3IpID09IG9iamVjdEN0b3JTdHJpbmc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNQbGFpbk9iamVjdDtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///452\n")},function(module,exports,__webpack_require__){eval("var copyObject = __webpack_require__(87),\n keysIn = __webpack_require__(66);\n\n/**\n * Converts `value` to a plain object flattening inherited enumerable string\n * keyed properties of `value` to own properties of the plain object.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {Object} Returns the converted plain object.\n * @example\n *\n * function Foo() {\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.assign({ 'a': 1 }, new Foo);\n * // => { 'a': 1, 'b': 2 }\n *\n * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));\n * // => { 'a': 1, 'b': 2, 'c': 3 }\n */\nfunction toPlainObject(value) {\n return copyObject(value, keysIn(value));\n}\n\nmodule.exports = toPlainObject;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL3RvUGxhaW5PYmplY3QuanM/OGRlMiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxpQkFBaUIsbUJBQU8sQ0FBQyxFQUFlO0FBQ3hDLGFBQWEsbUJBQU8sQ0FBQyxFQUFVOztBQUUvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxFQUFFO0FBQ2IsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFNBQVM7QUFDdEIsVUFBVTtBQUNWO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsImZpbGUiOiI0NTMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgY29weU9iamVjdCA9IHJlcXVpcmUoJy4vX2NvcHlPYmplY3QnKSxcbiAgICBrZXlzSW4gPSByZXF1aXJlKCcuL2tleXNJbicpO1xuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBwbGFpbiBvYmplY3QgZmxhdHRlbmluZyBpbmhlcml0ZWQgZW51bWVyYWJsZSBzdHJpbmdcbiAqIGtleWVkIHByb3BlcnRpZXMgb2YgYHZhbHVlYCB0byBvd24gcHJvcGVydGllcyBvZiB0aGUgcGxhaW4gb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMy4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY29udmVydGVkIHBsYWluIG9iamVjdC5cbiAqIEBleGFtcGxlXG4gKlxuICogZnVuY3Rpb24gRm9vKCkge1xuICogICB0aGlzLmIgPSAyO1xuICogfVxuICpcbiAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gKlxuICogXy5hc3NpZ24oeyAnYSc6IDEgfSwgbmV3IEZvbyk7XG4gKiAvLyA9PiB7ICdhJzogMSwgJ2InOiAyIH1cbiAqXG4gKiBfLmFzc2lnbih7ICdhJzogMSB9LCBfLnRvUGxhaW5PYmplY3QobmV3IEZvbykpO1xuICogLy8gPT4geyAnYSc6IDEsICdiJzogMiwgJ2MnOiAzIH1cbiAqL1xuZnVuY3Rpb24gdG9QbGFpbk9iamVjdCh2YWx1ZSkge1xuICByZXR1cm4gY29weU9iamVjdCh2YWx1ZSwga2V5c0luKHZhbHVlKSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdG9QbGFpbk9iamVjdDtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///453\n")},function(module,exports,__webpack_require__){eval("var baseRest = __webpack_require__(114),\n isIterateeCall = __webpack_require__(115);\n\n/**\n * Creates a function like `_.assign`.\n *\n * @private\n * @param {Function} assigner The function to assign values.\n * @returns {Function} Returns the new assigner function.\n */\nfunction createAssigner(assigner) {\n return baseRest(function(object, sources) {\n var index = -1,\n length = sources.length,\n customizer = length > 1 ? sources[length - 1] : undefined,\n guard = length > 2 ? sources[2] : undefined;\n\n customizer = (assigner.length > 3 && typeof customizer == 'function')\n ? (length--, customizer)\n : undefined;\n\n if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n customizer = length < 3 ? undefined : customizer;\n length = 1;\n }\n object = Object(object);\n while (++index < length) {\n var source = sources[index];\n if (source) {\n assigner(object, source, index, customizer);\n }\n }\n return object;\n });\n}\n\nmodule.exports = createAssigner;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jcmVhdGVBc3NpZ25lci5qcz8yZWMxIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGVBQWUsbUJBQU8sQ0FBQyxHQUFhO0FBQ3BDLHFCQUFxQixtQkFBTyxDQUFDLEdBQW1COztBQUVoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsU0FBUztBQUNwQixhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQSIsImZpbGUiOiI0NTQuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYmFzZVJlc3QgPSByZXF1aXJlKCcuL19iYXNlUmVzdCcpLFxuICAgIGlzSXRlcmF0ZWVDYWxsID0gcmVxdWlyZSgnLi9faXNJdGVyYXRlZUNhbGwnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gbGlrZSBgXy5hc3NpZ25gLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBhc3NpZ25lciBUaGUgZnVuY3Rpb24gdG8gYXNzaWduIHZhbHVlcy5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGFzc2lnbmVyIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBjcmVhdGVBc3NpZ25lcihhc3NpZ25lcikge1xuICByZXR1cm4gYmFzZVJlc3QoZnVuY3Rpb24ob2JqZWN0LCBzb3VyY2VzKSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIGxlbmd0aCA9IHNvdXJjZXMubGVuZ3RoLFxuICAgICAgICBjdXN0b21pemVyID0gbGVuZ3RoID4gMSA/IHNvdXJjZXNbbGVuZ3RoIC0gMV0gOiB1bmRlZmluZWQsXG4gICAgICAgIGd1YXJkID0gbGVuZ3RoID4gMiA/IHNvdXJjZXNbMl0gOiB1bmRlZmluZWQ7XG5cbiAgICBjdXN0b21pemVyID0gKGFzc2lnbmVyLmxlbmd0aCA+IDMgJiYgdHlwZW9mIGN1c3RvbWl6ZXIgPT0gJ2Z1bmN0aW9uJylcbiAgICAgID8gKGxlbmd0aC0tLCBjdXN0b21pemVyKVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICBpZiAoZ3VhcmQgJiYgaXNJdGVyYXRlZUNhbGwoc291cmNlc1swXSwgc291cmNlc1sxXSwgZ3VhcmQpKSB7XG4gICAgICBjdXN0b21pemVyID0gbGVuZ3RoIDwgMyA/IHVuZGVmaW5lZCA6IGN1c3RvbWl6ZXI7XG4gICAgICBsZW5ndGggPSAxO1xuICAgIH1cbiAgICBvYmplY3QgPSBPYmplY3Qob2JqZWN0KTtcbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgdmFyIHNvdXJjZSA9IHNvdXJjZXNbaW5kZXhdO1xuICAgICAgaWYgKHNvdXJjZSkge1xuICAgICAgICBhc3NpZ25lcihvYmplY3QsIHNvdXJjZSwgaW5kZXgsIGN1c3RvbWl6ZXIpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb2JqZWN0O1xuICB9KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjcmVhdGVBc3NpZ25lcjtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///454\n")},function(module,exports,__webpack_require__){eval("var baseExtremum = __webpack_require__(169),\n baseLt = __webpack_require__(237),\n identity = __webpack_require__(67);\n\n/**\n * Computes the minimum value of `array`. If `array` is empty or falsey,\n * `undefined` is returned.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Math\n * @param {Array} array The array to iterate over.\n * @returns {*} Returns the minimum value.\n * @example\n *\n * _.min([4, 2, 8, 6]);\n * // => 2\n *\n * _.min([]);\n * // => undefined\n */\nfunction min(array) {\n return (array && array.length)\n ? baseExtremum(array, identity, baseLt)\n : undefined;\n}\n\nmodule.exports = min;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL21pbi5qcz8wMDRlIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLG1CQUFtQixtQkFBTyxDQUFDLEdBQWlCO0FBQzVDLGFBQWEsbUJBQU8sQ0FBQyxHQUFXO0FBQ2hDLGVBQWUsbUJBQU8sQ0FBQyxFQUFZOztBQUVuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxNQUFNO0FBQ2pCLGFBQWEsRUFBRTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwiZmlsZSI6IjQ1NS5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBiYXNlRXh0cmVtdW0gPSByZXF1aXJlKCcuL19iYXNlRXh0cmVtdW0nKSxcbiAgICBiYXNlTHQgPSByZXF1aXJlKCcuL19iYXNlTHQnKSxcbiAgICBpZGVudGl0eSA9IHJlcXVpcmUoJy4vaWRlbnRpdHknKTtcblxuLyoqXG4gKiBDb21wdXRlcyB0aGUgbWluaW11bSB2YWx1ZSBvZiBgYXJyYXlgLiBJZiBgYXJyYXlgIGlzIGVtcHR5IG9yIGZhbHNleSxcbiAqIGB1bmRlZmluZWRgIGlzIHJldHVybmVkLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBzaW5jZSAwLjEuMFxuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBNYXRoXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIG1pbmltdW0gdmFsdWUuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8ubWluKFs0LCAyLCA4LCA2XSk7XG4gKiAvLyA9PiAyXG4gKlxuICogXy5taW4oW10pO1xuICogLy8gPT4gdW5kZWZpbmVkXG4gKi9cbmZ1bmN0aW9uIG1pbihhcnJheSkge1xuICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aClcbiAgICA/IGJhc2VFeHRyZW11bShhcnJheSwgaWRlbnRpdHksIGJhc2VMdClcbiAgICA6IHVuZGVmaW5lZDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtaW47XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///455\n")},function(module,exports,__webpack_require__){eval("var baseExtremum = __webpack_require__(169),\n baseIteratee = __webpack_require__(55),\n baseLt = __webpack_require__(237);\n\n/**\n * This method is like `_.min` except that it accepts `iteratee` which is\n * invoked for each element in `array` to generate the criterion by which\n * the value is ranked. The iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Math\n * @param {Array} array The array to iterate over.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {*} Returns the minimum value.\n * @example\n *\n * var objects = [{ 'n': 1 }, { 'n': 2 }];\n *\n * _.minBy(objects, function(o) { return o.n; });\n * // => { 'n': 1 }\n *\n * // The `_.property` iteratee shorthand.\n * _.minBy(objects, 'n');\n * // => { 'n': 1 }\n */\nfunction minBy(array, iteratee) {\n return (array && array.length)\n ? baseExtremum(array, baseIteratee(iteratee, 2), baseLt)\n : undefined;\n}\n\nmodule.exports = minBy;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL21pbkJ5LmpzPzgwZjYiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsbUJBQW1CLG1CQUFPLENBQUMsR0FBaUI7QUFDNUMsbUJBQW1CLG1CQUFPLENBQUMsRUFBaUI7QUFDNUMsYUFBYSxtQkFBTyxDQUFDLEdBQVc7O0FBRWhDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsTUFBTTtBQUNqQixXQUFXLFNBQVM7QUFDcEIsYUFBYSxFQUFFO0FBQ2Y7QUFDQTtBQUNBLG1CQUFtQixTQUFTLEdBQUcsU0FBUztBQUN4QztBQUNBLGlDQUFpQyxZQUFZLEVBQUU7QUFDL0MsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJmaWxlIjoiNDU2LmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIGJhc2VFeHRyZW11bSA9IHJlcXVpcmUoJy4vX2Jhc2VFeHRyZW11bScpLFxuICAgIGJhc2VJdGVyYXRlZSA9IHJlcXVpcmUoJy4vX2Jhc2VJdGVyYXRlZScpLFxuICAgIGJhc2VMdCA9IHJlcXVpcmUoJy4vX2Jhc2VMdCcpO1xuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ubWluYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWAgd2hpY2ggaXNcbiAqIGludm9rZWQgZm9yIGVhY2ggZWxlbWVudCBpbiBgYXJyYXlgIHRvIGdlbmVyYXRlIHRoZSBjcml0ZXJpb24gYnkgd2hpY2hcbiAqIHRoZSB2YWx1ZSBpcyByYW5rZWQuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBNYXRoXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIG1pbmltdW0gdmFsdWUuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3RzID0gW3sgJ24nOiAxIH0sIHsgJ24nOiAyIH1dO1xuICpcbiAqIF8ubWluQnkob2JqZWN0cywgZnVuY3Rpb24obykgeyByZXR1cm4gby5uOyB9KTtcbiAqIC8vID0+IHsgJ24nOiAxIH1cbiAqXG4gKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAqIF8ubWluQnkob2JqZWN0cywgJ24nKTtcbiAqIC8vID0+IHsgJ24nOiAxIH1cbiAqL1xuZnVuY3Rpb24gbWluQnkoYXJyYXksIGl0ZXJhdGVlKSB7XG4gIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgID8gYmFzZUV4dHJlbXVtKGFycmF5LCBiYXNlSXRlcmF0ZWUoaXRlcmF0ZWUsIDIpLCBiYXNlTHQpXG4gICAgOiB1bmRlZmluZWQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWluQnk7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///456\n")},function(module,exports,__webpack_require__){eval("var root = __webpack_require__(47);\n\n/**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n * console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */\nvar now = function() {\n return root.Date.now();\n};\n\nmodule.exports = now;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL25vdy5qcz80MDhjIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFdBQVcsbUJBQU8sQ0FBQyxFQUFTOztBQUU1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJmaWxlIjoiNDU3LmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIHJvb3QgPSByZXF1aXJlKCcuL19yb290Jyk7XG5cbi8qKlxuICogR2V0cyB0aGUgdGltZXN0YW1wIG9mIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRoYXQgaGF2ZSBlbGFwc2VkIHNpbmNlXG4gKiB0aGUgVW5peCBlcG9jaCAoMSBKYW51YXJ5IDE5NzAgMDA6MDA6MDAgVVRDKS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDIuNC4wXG4gKiBAY2F0ZWdvcnkgRGF0ZVxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgdGltZXN0YW1wLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmRlZmVyKGZ1bmN0aW9uKHN0YW1wKSB7XG4gKiAgIGNvbnNvbGUubG9nKF8ubm93KCkgLSBzdGFtcCk7XG4gKiB9LCBfLm5vdygpKTtcbiAqIC8vID0+IExvZ3MgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgaXQgdG9vayBmb3IgdGhlIGRlZmVycmVkIGludm9jYXRpb24uXG4gKi9cbnZhciBub3cgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHJvb3QuRGF0ZS5ub3coKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gbm93O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///457\n")},function(module,exports,__webpack_require__){eval("var basePick = __webpack_require__(459),\n flatRest = __webpack_require__(462);\n\n/**\n * Creates an object composed of the picked `object` properties.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The source object.\n * @param {...(string|string[])} [paths] The property paths to pick.\n * @returns {Object} Returns the new object.\n * @example\n *\n * var object = { 'a': 1, 'b': '2', 'c': 3 };\n *\n * _.pick(object, ['a', 'c']);\n * // => { 'a': 1, 'c': 3 }\n */\nvar pick = flatRest(function(object, paths) {\n return object == null ? {} : basePick(object, paths);\n});\n\nmodule.exports = pick;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL3BpY2suanM/MjU5MyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxlQUFlLG1CQUFPLENBQUMsR0FBYTtBQUNwQyxlQUFlLG1CQUFPLENBQUMsR0FBYTs7QUFFcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsV0FBVyxxQkFBcUI7QUFDaEMsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsNEJBQTRCO0FBQzVCLENBQUM7O0FBRUQiLCJmaWxlIjoiNDU4LmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIGJhc2VQaWNrID0gcmVxdWlyZSgnLi9fYmFzZVBpY2snKSxcbiAgICBmbGF0UmVzdCA9IHJlcXVpcmUoJy4vX2ZsYXRSZXN0Jyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBvYmplY3QgY29tcG9zZWQgb2YgdGhlIHBpY2tlZCBgb2JqZWN0YCBwcm9wZXJ0aWVzLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBzaW5jZSAwLjEuMFxuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIHNvdXJjZSBvYmplY3QuXG4gKiBAcGFyYW0gey4uLihzdHJpbmd8c3RyaW5nW10pfSBbcGF0aHNdIFRoZSBwcm9wZXJ0eSBwYXRocyB0byBwaWNrLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxLCAnYic6ICcyJywgJ2MnOiAzIH07XG4gKlxuICogXy5waWNrKG9iamVjdCwgWydhJywgJ2MnXSk7XG4gKiAvLyA9PiB7ICdhJzogMSwgJ2MnOiAzIH1cbiAqL1xudmFyIHBpY2sgPSBmbGF0UmVzdChmdW5jdGlvbihvYmplY3QsIHBhdGhzKSB7XG4gIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IHt9IDogYmFzZVBpY2sob2JqZWN0LCBwYXRocyk7XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBwaWNrO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///458\n")},function(module,exports,__webpack_require__){eval("var basePickBy = __webpack_require__(460),\n hasIn = __webpack_require__(215);\n\n/**\n * The base implementation of `_.pick` without support for individual\n * property identifiers.\n *\n * @private\n * @param {Object} object The source object.\n * @param {string[]} paths The property paths to pick.\n * @returns {Object} Returns the new object.\n */\nfunction basePick(object, paths) {\n return basePickBy(object, paths, function(value, path) {\n return hasIn(object, path);\n });\n}\n\nmodule.exports = basePick;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlUGljay5qcz8xNWYzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGlCQUFpQixtQkFBTyxDQUFDLEdBQWU7QUFDeEMsWUFBWSxtQkFBTyxDQUFDLEdBQVM7O0FBRTdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsV0FBVyxTQUFTO0FBQ3BCLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQSIsImZpbGUiOiI0NTkuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYmFzZVBpY2tCeSA9IHJlcXVpcmUoJy4vX2Jhc2VQaWNrQnknKSxcbiAgICBoYXNJbiA9IHJlcXVpcmUoJy4vaGFzSW4nKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5waWNrYCB3aXRob3V0IHN1cHBvcnQgZm9yIGluZGl2aWR1YWxcbiAqIHByb3BlcnR5IGlkZW50aWZpZXJzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBzb3VyY2Ugb2JqZWN0LlxuICogQHBhcmFtIHtzdHJpbmdbXX0gcGF0aHMgVGhlIHByb3BlcnR5IHBhdGhzIHRvIHBpY2suXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICovXG5mdW5jdGlvbiBiYXNlUGljayhvYmplY3QsIHBhdGhzKSB7XG4gIHJldHVybiBiYXNlUGlja0J5KG9iamVjdCwgcGF0aHMsIGZ1bmN0aW9uKHZhbHVlLCBwYXRoKSB7XG4gICAgcmV0dXJuIGhhc0luKG9iamVjdCwgcGF0aCk7XG4gIH0pO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VQaWNrO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///459\n")},function(module,exports,__webpack_require__){eval("var baseGet = __webpack_require__(111),\n baseSet = __webpack_require__(461),\n castPath = __webpack_require__(112);\n\n/**\n * The base implementation of `_.pickBy` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The source object.\n * @param {string[]} paths The property paths to pick.\n * @param {Function} predicate The function invoked per property.\n * @returns {Object} Returns the new object.\n */\nfunction basePickBy(object, paths, predicate) {\n var index = -1,\n length = paths.length,\n result = {};\n\n while (++index < length) {\n var path = paths[index],\n value = baseGet(object, path);\n\n if (predicate(value, path)) {\n baseSet(result, castPath(path, object), value);\n }\n }\n return result;\n}\n\nmodule.exports = basePickBy;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlUGlja0J5LmpzPzg5ZDkiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxtQkFBTyxDQUFDLEdBQVk7QUFDbEMsY0FBYyxtQkFBTyxDQUFDLEdBQVk7QUFDbEMsZUFBZSxtQkFBTyxDQUFDLEdBQWE7O0FBRXBDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsU0FBUztBQUNwQixXQUFXLFNBQVM7QUFDcEIsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsImZpbGUiOiI0NjAuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYmFzZUdldCA9IHJlcXVpcmUoJy4vX2Jhc2VHZXQnKSxcbiAgICBiYXNlU2V0ID0gcmVxdWlyZSgnLi9fYmFzZVNldCcpLFxuICAgIGNhc3RQYXRoID0gcmVxdWlyZSgnLi9fY2FzdFBhdGgnKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiAgYF8ucGlja0J5YCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIHNvdXJjZSBvYmplY3QuXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBwYXRocyBUaGUgcHJvcGVydHkgcGF0aHMgdG8gcGljay5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgcHJvcGVydHkuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICovXG5mdW5jdGlvbiBiYXNlUGlja0J5KG9iamVjdCwgcGF0aHMsIHByZWRpY2F0ZSkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IHBhdGhzLmxlbmd0aCxcbiAgICAgIHJlc3VsdCA9IHt9O1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIHBhdGggPSBwYXRoc1tpbmRleF0sXG4gICAgICAgIHZhbHVlID0gYmFzZUdldChvYmplY3QsIHBhdGgpO1xuXG4gICAgaWYgKHByZWRpY2F0ZSh2YWx1ZSwgcGF0aCkpIHtcbiAgICAgIGJhc2VTZXQocmVzdWx0LCBjYXN0UGF0aChwYXRoLCBvYmplY3QpLCB2YWx1ZSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVBpY2tCeTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///460\n")},function(module,exports,__webpack_require__){eval("var assignValue = __webpack_require__(104),\n castPath = __webpack_require__(112),\n isIndex = __webpack_require__(106),\n isObject = __webpack_require__(43),\n toKey = __webpack_require__(90);\n\n/**\n * The base implementation of `_.set`.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to set.\n * @param {*} value The value to set.\n * @param {Function} [customizer] The function to customize path creation.\n * @returns {Object} Returns `object`.\n */\nfunction baseSet(object, path, value, customizer) {\n if (!isObject(object)) {\n return object;\n }\n path = castPath(path, object);\n\n var index = -1,\n length = path.length,\n lastIndex = length - 1,\n nested = object;\n\n while (nested != null && ++index < length) {\n var key = toKey(path[index]),\n newValue = value;\n\n if (key === '__proto__' || key === 'constructor' || key === 'prototype') {\n return object;\n }\n\n if (index != lastIndex) {\n var objValue = nested[key];\n newValue = customizer ? customizer(objValue, key, nested) : undefined;\n if (newValue === undefined) {\n newValue = isObject(objValue)\n ? objValue\n : (isIndex(path[index + 1]) ? [] : {});\n }\n }\n assignValue(nested, key, newValue);\n nested = nested[key];\n }\n return object;\n}\n\nmodule.exports = baseSet;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlU2V0LmpzPzE1OWEiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsa0JBQWtCLG1CQUFPLENBQUMsR0FBZ0I7QUFDMUMsZUFBZSxtQkFBTyxDQUFDLEdBQWE7QUFDcEMsY0FBYyxtQkFBTyxDQUFDLEdBQVk7QUFDbEMsZUFBZSxtQkFBTyxDQUFDLEVBQVk7QUFDbkMsWUFBWSxtQkFBTyxDQUFDLEVBQVU7O0FBRTlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsYUFBYTtBQUN4QixXQUFXLEVBQUU7QUFDYixXQUFXLFNBQVM7QUFDcEIsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtDQUErQztBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsImZpbGUiOiI0NjEuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYXNzaWduVmFsdWUgPSByZXF1aXJlKCcuL19hc3NpZ25WYWx1ZScpLFxuICAgIGNhc3RQYXRoID0gcmVxdWlyZSgnLi9fY2FzdFBhdGgnKSxcbiAgICBpc0luZGV4ID0gcmVxdWlyZSgnLi9faXNJbmRleCcpLFxuICAgIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9pc09iamVjdCcpLFxuICAgIHRvS2V5ID0gcmVxdWlyZSgnLi9fdG9LZXknKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5zZXRgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIHNldC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIHBhdGggY3JlYXRpb24uXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICovXG5mdW5jdGlvbiBiYXNlU2V0KG9iamVjdCwgcGF0aCwgdmFsdWUsIGN1c3RvbWl6ZXIpIHtcbiAgaWYgKCFpc09iamVjdChvYmplY3QpKSB7XG4gICAgcmV0dXJuIG9iamVjdDtcbiAgfVxuICBwYXRoID0gY2FzdFBhdGgocGF0aCwgb2JqZWN0KTtcblxuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IHBhdGgubGVuZ3RoLFxuICAgICAgbGFzdEluZGV4ID0gbGVuZ3RoIC0gMSxcbiAgICAgIG5lc3RlZCA9IG9iamVjdDtcblxuICB3aGlsZSAobmVzdGVkICE9IG51bGwgJiYgKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciBrZXkgPSB0b0tleShwYXRoW2luZGV4XSksXG4gICAgICAgIG5ld1ZhbHVlID0gdmFsdWU7XG5cbiAgICBpZiAoa2V5ID09PSAnX19wcm90b19fJyB8fCBrZXkgPT09ICdjb25zdHJ1Y3RvcicgfHwga2V5ID09PSAncHJvdG90eXBlJykge1xuICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICB9XG5cbiAgICBpZiAoaW5kZXggIT0gbGFzdEluZGV4KSB7XG4gICAgICB2YXIgb2JqVmFsdWUgPSBuZXN0ZWRba2V5XTtcbiAgICAgIG5ld1ZhbHVlID0gY3VzdG9taXplciA/IGN1c3RvbWl6ZXIob2JqVmFsdWUsIGtleSwgbmVzdGVkKSA6IHVuZGVmaW5lZDtcbiAgICAgIGlmIChuZXdWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG5ld1ZhbHVlID0gaXNPYmplY3Qob2JqVmFsdWUpXG4gICAgICAgICAgPyBvYmpWYWx1ZVxuICAgICAgICAgIDogKGlzSW5kZXgocGF0aFtpbmRleCArIDFdKSA/IFtdIDoge30pO1xuICAgICAgfVxuICAgIH1cbiAgICBhc3NpZ25WYWx1ZShuZXN0ZWQsIGtleSwgbmV3VmFsdWUpO1xuICAgIG5lc3RlZCA9IG5lc3RlZFtrZXldO1xuICB9XG4gIHJldHVybiBvYmplY3Q7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVNldDtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///461\n")},function(module,exports,__webpack_require__){eval("var flatten = __webpack_require__(234),\n overRest = __webpack_require__(223),\n setToString = __webpack_require__(224);\n\n/**\n * A specialized version of `baseRest` which flattens the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @returns {Function} Returns the new function.\n */\nfunction flatRest(func) {\n return setToString(overRest(func, undefined, flatten), func + '');\n}\n\nmodule.exports = flatRest;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19mbGF0UmVzdC5qcz9jNmNmIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsbUJBQU8sQ0FBQyxHQUFXO0FBQ2pDLGVBQWUsbUJBQU8sQ0FBQyxHQUFhO0FBQ3BDLGtCQUFrQixtQkFBTyxDQUFDLEdBQWdCOztBQUUxQztBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsU0FBUztBQUNwQixhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJmaWxlIjoiNDYyLmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIGZsYXR0ZW4gPSByZXF1aXJlKCcuL2ZsYXR0ZW4nKSxcbiAgICBvdmVyUmVzdCA9IHJlcXVpcmUoJy4vX292ZXJSZXN0JyksXG4gICAgc2V0VG9TdHJpbmcgPSByZXF1aXJlKCcuL19zZXRUb1N0cmluZycpO1xuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZVJlc3RgIHdoaWNoIGZsYXR0ZW5zIHRoZSByZXN0IGFycmF5LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBhcHBseSBhIHJlc3QgcGFyYW1ldGVyIHRvLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGZsYXRSZXN0KGZ1bmMpIHtcbiAgcmV0dXJuIHNldFRvU3RyaW5nKG92ZXJSZXN0KGZ1bmMsIHVuZGVmaW5lZCwgZmxhdHRlbiksIGZ1bmMgKyAnJyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZmxhdFJlc3Q7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///462\n")},function(module,exports,__webpack_require__){eval("var createRange = __webpack_require__(464);\n\n/**\n * Creates an array of numbers (positive and/or negative) progressing from\n * `start` up to, but not including, `end`. A step of `-1` is used if a negative\n * `start` is specified without an `end` or `step`. If `end` is not specified,\n * it's set to `start` with `start` then set to `0`.\n *\n * **Note:** JavaScript follows the IEEE-754 standard for resolving\n * floating-point values which can produce unexpected results.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {number} [start=0] The start of the range.\n * @param {number} end The end of the range.\n * @param {number} [step=1] The value to increment or decrement by.\n * @returns {Array} Returns the range of numbers.\n * @see _.inRange, _.rangeRight\n * @example\n *\n * _.range(4);\n * // => [0, 1, 2, 3]\n *\n * _.range(-4);\n * // => [0, -1, -2, -3]\n *\n * _.range(1, 5);\n * // => [1, 2, 3, 4]\n *\n * _.range(0, 20, 5);\n * // => [0, 5, 10, 15]\n *\n * _.range(0, -4, -1);\n * // => [0, -1, -2, -3]\n *\n * _.range(1, 4, 0);\n * // => [1, 1, 1]\n *\n * _.range(0);\n * // => []\n */\nvar range = createRange();\n\nmodule.exports = range;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL3JhbmdlLmpzPzVhM2EiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsa0JBQWtCLG1CQUFPLENBQUMsR0FBZ0I7O0FBRTFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsYUFBYSxNQUFNO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwiZmlsZSI6IjQ2My5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBjcmVhdGVSYW5nZSA9IHJlcXVpcmUoJy4vX2NyZWF0ZVJhbmdlJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiBudW1iZXJzIChwb3NpdGl2ZSBhbmQvb3IgbmVnYXRpdmUpIHByb2dyZXNzaW5nIGZyb21cbiAqIGBzdGFydGAgdXAgdG8sIGJ1dCBub3QgaW5jbHVkaW5nLCBgZW5kYC4gQSBzdGVwIG9mIGAtMWAgaXMgdXNlZCBpZiBhIG5lZ2F0aXZlXG4gKiBgc3RhcnRgIGlzIHNwZWNpZmllZCB3aXRob3V0IGFuIGBlbmRgIG9yIGBzdGVwYC4gSWYgYGVuZGAgaXMgbm90IHNwZWNpZmllZCxcbiAqIGl0J3Mgc2V0IHRvIGBzdGFydGAgd2l0aCBgc3RhcnRgIHRoZW4gc2V0IHRvIGAwYC5cbiAqXG4gKiAqKk5vdGU6KiogSmF2YVNjcmlwdCBmb2xsb3dzIHRoZSBJRUVFLTc1NCBzdGFuZGFyZCBmb3IgcmVzb2x2aW5nXG4gKiBmbG9hdGluZy1wb2ludCB2YWx1ZXMgd2hpY2ggY2FuIHByb2R1Y2UgdW5leHBlY3RlZCByZXN1bHRzLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBzaW5jZSAwLjEuMFxuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBVdGlsXG4gKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PTBdIFRoZSBzdGFydCBvZiB0aGUgcmFuZ2UuXG4gKiBAcGFyYW0ge251bWJlcn0gZW5kIFRoZSBlbmQgb2YgdGhlIHJhbmdlLlxuICogQHBhcmFtIHtudW1iZXJ9IFtzdGVwPTFdIFRoZSB2YWx1ZSB0byBpbmNyZW1lbnQgb3IgZGVjcmVtZW50IGJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSByYW5nZSBvZiBudW1iZXJzLlxuICogQHNlZSBfLmluUmFuZ2UsIF8ucmFuZ2VSaWdodFxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnJhbmdlKDQpO1xuICogLy8gPT4gWzAsIDEsIDIsIDNdXG4gKlxuICogXy5yYW5nZSgtNCk7XG4gKiAvLyA9PiBbMCwgLTEsIC0yLCAtM11cbiAqXG4gKiBfLnJhbmdlKDEsIDUpO1xuICogLy8gPT4gWzEsIDIsIDMsIDRdXG4gKlxuICogXy5yYW5nZSgwLCAyMCwgNSk7XG4gKiAvLyA9PiBbMCwgNSwgMTAsIDE1XVxuICpcbiAqIF8ucmFuZ2UoMCwgLTQsIC0xKTtcbiAqIC8vID0+IFswLCAtMSwgLTIsIC0zXVxuICpcbiAqIF8ucmFuZ2UoMSwgNCwgMCk7XG4gKiAvLyA9PiBbMSwgMSwgMV1cbiAqXG4gKiBfLnJhbmdlKDApO1xuICogLy8gPT4gW11cbiAqL1xudmFyIHJhbmdlID0gY3JlYXRlUmFuZ2UoKTtcblxubW9kdWxlLmV4cG9ydHMgPSByYW5nZTtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///463\n")},function(module,exports,__webpack_require__){eval("var baseRange = __webpack_require__(465),\n isIterateeCall = __webpack_require__(115),\n toFinite = __webpack_require__(233);\n\n/**\n * Creates a `_.range` or `_.rangeRight` function.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new range function.\n */\nfunction createRange(fromRight) {\n return function(start, end, step) {\n if (step && typeof step != 'number' && isIterateeCall(start, end, step)) {\n end = step = undefined;\n }\n // Ensure the sign of `-0` is preserved.\n start = toFinite(start);\n if (end === undefined) {\n end = start;\n start = 0;\n } else {\n end = toFinite(end);\n }\n step = step === undefined ? (start < end ? 1 : -1) : toFinite(step);\n return baseRange(start, end, step, fromRight);\n };\n}\n\nmodule.exports = createRange;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jcmVhdGVSYW5nZS5qcz8xY2JhIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGdCQUFnQixtQkFBTyxDQUFDLEdBQWM7QUFDdEMscUJBQXFCLG1CQUFPLENBQUMsR0FBbUI7QUFDaEQsZUFBZSxtQkFBTyxDQUFDLEdBQVk7O0FBRW5DO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsImZpbGUiOiI0NjQuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYmFzZVJhbmdlID0gcmVxdWlyZSgnLi9fYmFzZVJhbmdlJyksXG4gICAgaXNJdGVyYXRlZUNhbGwgPSByZXF1aXJlKCcuL19pc0l0ZXJhdGVlQ2FsbCcpLFxuICAgIHRvRmluaXRlID0gcmVxdWlyZSgnLi90b0Zpbml0ZScpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBgXy5yYW5nZWAgb3IgYF8ucmFuZ2VSaWdodGAgZnVuY3Rpb24uXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgcmFuZ2UgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVJhbmdlKGZyb21SaWdodCkge1xuICByZXR1cm4gZnVuY3Rpb24oc3RhcnQsIGVuZCwgc3RlcCkge1xuICAgIGlmIChzdGVwICYmIHR5cGVvZiBzdGVwICE9ICdudW1iZXInICYmIGlzSXRlcmF0ZWVDYWxsKHN0YXJ0LCBlbmQsIHN0ZXApKSB7XG4gICAgICBlbmQgPSBzdGVwID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICAvLyBFbnN1cmUgdGhlIHNpZ24gb2YgYC0wYCBpcyBwcmVzZXJ2ZWQuXG4gICAgc3RhcnQgPSB0b0Zpbml0ZShzdGFydCk7XG4gICAgaWYgKGVuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBlbmQgPSBzdGFydDtcbiAgICAgIHN0YXJ0ID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgZW5kID0gdG9GaW5pdGUoZW5kKTtcbiAgICB9XG4gICAgc3RlcCA9IHN0ZXAgPT09IHVuZGVmaW5lZCA/IChzdGFydCA8IGVuZCA/IDEgOiAtMSkgOiB0b0Zpbml0ZShzdGVwKTtcbiAgICByZXR1cm4gYmFzZVJhbmdlKHN0YXJ0LCBlbmQsIHN0ZXAsIGZyb21SaWdodCk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY3JlYXRlUmFuZ2U7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///464\n")},function(module,exports){eval("/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeCeil = Math.ceil,\n nativeMax = Math.max;\n\n/**\n * The base implementation of `_.range` and `_.rangeRight` which doesn't\n * coerce arguments.\n *\n * @private\n * @param {number} start The start of the range.\n * @param {number} end The end of the range.\n * @param {number} step The value to increment or decrement by.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Array} Returns the range of numbers.\n */\nfunction baseRange(start, end, step, fromRight) {\n var index = -1,\n length = nativeMax(nativeCeil((end - start) / (step || 1)), 0),\n result = Array(length);\n\n while (length--) {\n result[fromRight ? length : ++index] = start;\n start += step;\n }\n return result;\n}\n\nmodule.exports = baseRange;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlUmFuZ2UuanM/NDc5NiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsUUFBUTtBQUNuQixhQUFhLE1BQU07QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJmaWxlIjoiNDY1LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZUNlaWwgPSBNYXRoLmNlaWwsXG4gICAgbmF0aXZlTWF4ID0gTWF0aC5tYXg7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucmFuZ2VgIGFuZCBgXy5yYW5nZVJpZ2h0YCB3aGljaCBkb2Vzbid0XG4gKiBjb2VyY2UgYXJndW1lbnRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge251bWJlcn0gc3RhcnQgVGhlIHN0YXJ0IG9mIHRoZSByYW5nZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBlbmQgVGhlIGVuZCBvZiB0aGUgcmFuZ2UuXG4gKiBAcGFyYW0ge251bWJlcn0gc3RlcCBUaGUgdmFsdWUgdG8gaW5jcmVtZW50IG9yIGRlY3JlbWVudCBieS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSByYW5nZSBvZiBudW1iZXJzLlxuICovXG5mdW5jdGlvbiBiYXNlUmFuZ2Uoc3RhcnQsIGVuZCwgc3RlcCwgZnJvbVJpZ2h0KSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gbmF0aXZlTWF4KG5hdGl2ZUNlaWwoKGVuZCAtIHN0YXJ0KSAvIChzdGVwIHx8IDEpKSwgMCksXG4gICAgICByZXN1bHQgPSBBcnJheShsZW5ndGgpO1xuXG4gIHdoaWxlIChsZW5ndGgtLSkge1xuICAgIHJlc3VsdFtmcm9tUmlnaHQgPyBsZW5ndGggOiArK2luZGV4XSA9IHN0YXJ0O1xuICAgIHN0YXJ0ICs9IHN0ZXA7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlUmFuZ2U7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///465\n")},function(module,exports,__webpack_require__){eval("var baseFlatten = __webpack_require__(168),\n baseOrderBy = __webpack_require__(467),\n baseRest = __webpack_require__(114),\n isIterateeCall = __webpack_require__(115);\n\n/**\n * Creates an array of elements, sorted in ascending order by the results of\n * running each element in a collection thru each iteratee. This method\n * performs a stable sort, that is, it preserves the original sort order of\n * equal elements. The iteratees are invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {...(Function|Function[])} [iteratees=[_.identity]]\n * The iteratees to sort by.\n * @returns {Array} Returns the new sorted array.\n * @example\n *\n * var users = [\n * { 'user': 'fred', 'age': 48 },\n * { 'user': 'barney', 'age': 36 },\n * { 'user': 'fred', 'age': 30 },\n * { 'user': 'barney', 'age': 34 }\n * ];\n *\n * _.sortBy(users, [function(o) { return o.user; }]);\n * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 30]]\n *\n * _.sortBy(users, ['user', 'age']);\n * // => objects for [['barney', 34], ['barney', 36], ['fred', 30], ['fred', 48]]\n */\nvar sortBy = baseRest(function(collection, iteratees) {\n if (collection == null) {\n return [];\n }\n var length = iteratees.length;\n if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) {\n iteratees = [];\n } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) {\n iteratees = [iteratees[0]];\n }\n return baseOrderBy(collection, baseFlatten(iteratees, 1), []);\n});\n\nmodule.exports = sortBy;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL3NvcnRCeS5qcz9jNzA3Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGtCQUFrQixtQkFBTyxDQUFDLEdBQWdCO0FBQzFDLGtCQUFrQixtQkFBTyxDQUFDLEdBQWdCO0FBQzFDLGVBQWUsbUJBQU8sQ0FBQyxHQUFhO0FBQ3BDLHFCQUFxQixtQkFBTyxDQUFDLEdBQW1COztBQUVoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsYUFBYTtBQUN4QixXQUFXLHlCQUF5QjtBQUNwQztBQUNBLGFBQWEsTUFBTTtBQUNuQjtBQUNBO0FBQ0E7QUFDQSxNQUFNLDhCQUE4QjtBQUNwQyxNQUFNLDhCQUE4QjtBQUNwQyxNQUFNLDhCQUE4QjtBQUNwQyxNQUFNO0FBQ047QUFDQTtBQUNBLGlDQUFpQyxlQUFlLEVBQUU7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQiLCJmaWxlIjoiNDY2LmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIGJhc2VGbGF0dGVuID0gcmVxdWlyZSgnLi9fYmFzZUZsYXR0ZW4nKSxcbiAgICBiYXNlT3JkZXJCeSA9IHJlcXVpcmUoJy4vX2Jhc2VPcmRlckJ5JyksXG4gICAgYmFzZVJlc3QgPSByZXF1aXJlKCcuL19iYXNlUmVzdCcpLFxuICAgIGlzSXRlcmF0ZWVDYWxsID0gcmVxdWlyZSgnLi9faXNJdGVyYXRlZUNhbGwnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIGVsZW1lbnRzLCBzb3J0ZWQgaW4gYXNjZW5kaW5nIG9yZGVyIGJ5IHRoZSByZXN1bHRzIG9mXG4gKiBydW5uaW5nIGVhY2ggZWxlbWVudCBpbiBhIGNvbGxlY3Rpb24gdGhydSBlYWNoIGl0ZXJhdGVlLiBUaGlzIG1ldGhvZFxuICogcGVyZm9ybXMgYSBzdGFibGUgc29ydCwgdGhhdCBpcywgaXQgcHJlc2VydmVzIHRoZSBvcmlnaW5hbCBzb3J0IG9yZGVyIG9mXG4gKiBlcXVhbCBlbGVtZW50cy4gVGhlIGl0ZXJhdGVlcyBhcmUgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHsuLi4oRnVuY3Rpb258RnVuY3Rpb25bXSl9IFtpdGVyYXRlZXM9W18uaWRlbnRpdHldXVxuICogIFRoZSBpdGVyYXRlZXMgdG8gc29ydCBieS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IHNvcnRlZCBhcnJheS5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIHVzZXJzID0gW1xuICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiA0OCB9LFxuICogICB7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNiB9LFxuICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiAzMCB9LFxuICogICB7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNCB9XG4gKiBdO1xuICpcbiAqIF8uc29ydEJ5KHVzZXJzLCBbZnVuY3Rpb24obykgeyByZXR1cm4gby51c2VyOyB9XSk7XG4gKiAvLyA9PiBvYmplY3RzIGZvciBbWydiYXJuZXknLCAzNl0sIFsnYmFybmV5JywgMzRdLCBbJ2ZyZWQnLCA0OF0sIFsnZnJlZCcsIDMwXV1cbiAqXG4gKiBfLnNvcnRCeSh1c2VycywgWyd1c2VyJywgJ2FnZSddKTtcbiAqIC8vID0+IG9iamVjdHMgZm9yIFtbJ2Jhcm5leScsIDM0XSwgWydiYXJuZXknLCAzNl0sIFsnZnJlZCcsIDMwXSwgWydmcmVkJywgNDhdXVxuICovXG52YXIgc29ydEJ5ID0gYmFzZVJlc3QoZnVuY3Rpb24oY29sbGVjdGlvbiwgaXRlcmF0ZWVzKSB7XG4gIGlmIChjb2xsZWN0aW9uID09IG51bGwpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgdmFyIGxlbmd0aCA9IGl0ZXJhdGVlcy5sZW5ndGg7XG4gIGlmIChsZW5ndGggPiAxICYmIGlzSXRlcmF0ZWVDYWxsKGNvbGxlY3Rpb24sIGl0ZXJhdGVlc1swXSwgaXRlcmF0ZWVzWzFdKSkge1xuICAgIGl0ZXJhdGVlcyA9IFtdO1xuICB9IGVsc2UgaWYgKGxlbmd0aCA+IDIgJiYgaXNJdGVyYXRlZUNhbGwoaXRlcmF0ZWVzWzBdLCBpdGVyYXRlZXNbMV0sIGl0ZXJhdGVlc1syXSkpIHtcbiAgICBpdGVyYXRlZXMgPSBbaXRlcmF0ZWVzWzBdXTtcbiAgfVxuICByZXR1cm4gYmFzZU9yZGVyQnkoY29sbGVjdGlvbiwgYmFzZUZsYXR0ZW4oaXRlcmF0ZWVzLCAxKSwgW10pO1xufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gc29ydEJ5O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///466\n")},function(module,exports,__webpack_require__){eval("var arrayMap = __webpack_require__(113),\n baseGet = __webpack_require__(111),\n baseIteratee = __webpack_require__(55),\n baseMap = __webpack_require__(221),\n baseSortBy = __webpack_require__(468),\n baseUnary = __webpack_require__(107),\n compareMultiple = __webpack_require__(469),\n identity = __webpack_require__(67),\n isArray = __webpack_require__(31);\n\n/**\n * The base implementation of `_.orderBy` without param guards.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.\n * @param {string[]} orders The sort orders of `iteratees`.\n * @returns {Array} Returns the new sorted array.\n */\nfunction baseOrderBy(collection, iteratees, orders) {\n if (iteratees.length) {\n iteratees = arrayMap(iteratees, function(iteratee) {\n if (isArray(iteratee)) {\n return function(value) {\n return baseGet(value, iteratee.length === 1 ? iteratee[0] : iteratee);\n }\n }\n return iteratee;\n });\n } else {\n iteratees = [identity];\n }\n\n var index = -1;\n iteratees = arrayMap(iteratees, baseUnary(baseIteratee));\n\n var result = baseMap(collection, function(value, key, collection) {\n var criteria = arrayMap(iteratees, function(iteratee) {\n return iteratee(value);\n });\n return { 'criteria': criteria, 'index': ++index, 'value': value };\n });\n\n return baseSortBy(result, function(object, other) {\n return compareMultiple(object, other, orders);\n });\n}\n\nmodule.exports = baseOrderBy;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlT3JkZXJCeS5qcz82YTVjIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGVBQWUsbUJBQU8sQ0FBQyxHQUFhO0FBQ3BDLGNBQWMsbUJBQU8sQ0FBQyxHQUFZO0FBQ2xDLG1CQUFtQixtQkFBTyxDQUFDLEVBQWlCO0FBQzVDLGNBQWMsbUJBQU8sQ0FBQyxHQUFZO0FBQ2xDLGlCQUFpQixtQkFBTyxDQUFDLEdBQWU7QUFDeEMsZ0JBQWdCLG1CQUFPLENBQUMsR0FBYztBQUN0QyxzQkFBc0IsbUJBQU8sQ0FBQyxHQUFvQjtBQUNsRCxlQUFlLG1CQUFPLENBQUMsRUFBWTtBQUNuQyxjQUFjLG1CQUFPLENBQUMsRUFBVzs7QUFFakM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLGFBQWE7QUFDeEIsV0FBVyw2QkFBNkI7QUFDeEMsV0FBVyxTQUFTO0FBQ3BCLGFBQWEsTUFBTTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxZQUFZO0FBQ1osR0FBRzs7QUFFSDtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBIiwiZmlsZSI6IjQ2Ny5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBhcnJheU1hcCA9IHJlcXVpcmUoJy4vX2FycmF5TWFwJyksXG4gICAgYmFzZUdldCA9IHJlcXVpcmUoJy4vX2Jhc2VHZXQnKSxcbiAgICBiYXNlSXRlcmF0ZWUgPSByZXF1aXJlKCcuL19iYXNlSXRlcmF0ZWUnKSxcbiAgICBiYXNlTWFwID0gcmVxdWlyZSgnLi9fYmFzZU1hcCcpLFxuICAgIGJhc2VTb3J0QnkgPSByZXF1aXJlKCcuL19iYXNlU29ydEJ5JyksXG4gICAgYmFzZVVuYXJ5ID0gcmVxdWlyZSgnLi9fYmFzZVVuYXJ5JyksXG4gICAgY29tcGFyZU11bHRpcGxlID0gcmVxdWlyZSgnLi9fY29tcGFyZU11bHRpcGxlJyksXG4gICAgaWRlbnRpdHkgPSByZXF1aXJlKCcuL2lkZW50aXR5JyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLm9yZGVyQnlgIHdpdGhvdXQgcGFyYW0gZ3VhcmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9uW118T2JqZWN0W118c3RyaW5nW119IGl0ZXJhdGVlcyBUaGUgaXRlcmF0ZWVzIHRvIHNvcnQgYnkuXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBvcmRlcnMgVGhlIHNvcnQgb3JkZXJzIG9mIGBpdGVyYXRlZXNgLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgc29ydGVkIGFycmF5LlxuICovXG5mdW5jdGlvbiBiYXNlT3JkZXJCeShjb2xsZWN0aW9uLCBpdGVyYXRlZXMsIG9yZGVycykge1xuICBpZiAoaXRlcmF0ZWVzLmxlbmd0aCkge1xuICAgIGl0ZXJhdGVlcyA9IGFycmF5TWFwKGl0ZXJhdGVlcywgZnVuY3Rpb24oaXRlcmF0ZWUpIHtcbiAgICAgIGlmIChpc0FycmF5KGl0ZXJhdGVlKSkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICByZXR1cm4gYmFzZUdldCh2YWx1ZSwgaXRlcmF0ZWUubGVuZ3RoID09PSAxID8gaXRlcmF0ZWVbMF0gOiBpdGVyYXRlZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBpdGVyYXRlZTtcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBpdGVyYXRlZXMgPSBbaWRlbnRpdHldO1xuICB9XG5cbiAgdmFyIGluZGV4ID0gLTE7XG4gIGl0ZXJhdGVlcyA9IGFycmF5TWFwKGl0ZXJhdGVlcywgYmFzZVVuYXJ5KGJhc2VJdGVyYXRlZSkpO1xuXG4gIHZhciByZXN1bHQgPSBiYXNlTWFwKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBrZXksIGNvbGxlY3Rpb24pIHtcbiAgICB2YXIgY3JpdGVyaWEgPSBhcnJheU1hcChpdGVyYXRlZXMsIGZ1bmN0aW9uKGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gaXRlcmF0ZWUodmFsdWUpO1xuICAgIH0pO1xuICAgIHJldHVybiB7ICdjcml0ZXJpYSc6IGNyaXRlcmlhLCAnaW5kZXgnOiArK2luZGV4LCAndmFsdWUnOiB2YWx1ZSB9O1xuICB9KTtcblxuICByZXR1cm4gYmFzZVNvcnRCeShyZXN1bHQsIGZ1bmN0aW9uKG9iamVjdCwgb3RoZXIpIHtcbiAgICByZXR1cm4gY29tcGFyZU11bHRpcGxlKG9iamVjdCwgb3RoZXIsIG9yZGVycyk7XG4gIH0pO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VPcmRlckJ5O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///467\n")},function(module,exports){eval("/**\n * The base implementation of `_.sortBy` which uses `comparer` to define the\n * sort order of `array` and replaces criteria objects with their corresponding\n * values.\n *\n * @private\n * @param {Array} array The array to sort.\n * @param {Function} comparer The function to define sort order.\n * @returns {Array} Returns `array`.\n */\nfunction baseSortBy(array, comparer) {\n var length = array.length;\n\n array.sort(comparer);\n while (length--) {\n array[length] = array[length].value;\n }\n return array;\n}\n\nmodule.exports = baseSortBy;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlU29ydEJ5LmpzP2Q0YjIiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxNQUFNO0FBQ2pCLFdBQVcsU0FBUztBQUNwQixhQUFhLE1BQU07QUFDbkI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsImZpbGUiOiI0NjguanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnNvcnRCeWAgd2hpY2ggdXNlcyBgY29tcGFyZXJgIHRvIGRlZmluZSB0aGVcbiAqIHNvcnQgb3JkZXIgb2YgYGFycmF5YCBhbmQgcmVwbGFjZXMgY3JpdGVyaWEgb2JqZWN0cyB3aXRoIHRoZWlyIGNvcnJlc3BvbmRpbmdcbiAqIHZhbHVlcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHNvcnQuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjb21wYXJlciBUaGUgZnVuY3Rpb24gdG8gZGVmaW5lIHNvcnQgb3JkZXIuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAqL1xuZnVuY3Rpb24gYmFzZVNvcnRCeShhcnJheSwgY29tcGFyZXIpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICBhcnJheS5zb3J0KGNvbXBhcmVyKTtcbiAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgYXJyYXlbbGVuZ3RoXSA9IGFycmF5W2xlbmd0aF0udmFsdWU7XG4gIH1cbiAgcmV0dXJuIGFycmF5O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VTb3J0Qnk7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///468\n")},function(module,exports,__webpack_require__){eval('var compareAscending = __webpack_require__(470);\n\n/**\n * Used by `_.orderBy` to compare multiple properties of a value to another\n * and stable sort them.\n *\n * If `orders` is unspecified, all values are sorted in ascending order. Otherwise,\n * specify an order of "desc" for descending or "asc" for ascending sort order\n * of corresponding values.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {boolean[]|string[]} orders The order to sort by for each property.\n * @returns {number} Returns the sort order indicator for `object`.\n */\nfunction compareMultiple(object, other, orders) {\n var index = -1,\n objCriteria = object.criteria,\n othCriteria = other.criteria,\n length = objCriteria.length,\n ordersLength = orders.length;\n\n while (++index < length) {\n var result = compareAscending(objCriteria[index], othCriteria[index]);\n if (result) {\n if (index >= ordersLength) {\n return result;\n }\n var order = orders[index];\n return result * (order == \'desc\' ? -1 : 1);\n }\n }\n // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications\n // that causes it, under certain circumstances, to provide the same value for\n // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247\n // for more details.\n //\n // This also ensures a stable sort in V8 and other engines.\n // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details.\n return object.index - other.index;\n}\n\nmodule.exports = compareMultiple;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jb21wYXJlTXVsdGlwbGUuanM/MjE2NCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx1QkFBdUIsbUJBQU8sQ0FBQyxHQUFxQjs7QUFFcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixXQUFXLG1CQUFtQjtBQUM5QixhQUFhLE9BQU87QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJmaWxlIjoiNDY5LmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIGNvbXBhcmVBc2NlbmRpbmcgPSByZXF1aXJlKCcuL19jb21wYXJlQXNjZW5kaW5nJyk7XG5cbi8qKlxuICogVXNlZCBieSBgXy5vcmRlckJ5YCB0byBjb21wYXJlIG11bHRpcGxlIHByb3BlcnRpZXMgb2YgYSB2YWx1ZSB0byBhbm90aGVyXG4gKiBhbmQgc3RhYmxlIHNvcnQgdGhlbS5cbiAqXG4gKiBJZiBgb3JkZXJzYCBpcyB1bnNwZWNpZmllZCwgYWxsIHZhbHVlcyBhcmUgc29ydGVkIGluIGFzY2VuZGluZyBvcmRlci4gT3RoZXJ3aXNlLFxuICogc3BlY2lmeSBhbiBvcmRlciBvZiBcImRlc2NcIiBmb3IgZGVzY2VuZGluZyBvciBcImFzY1wiIGZvciBhc2NlbmRpbmcgc29ydCBvcmRlclxuICogb2YgY29ycmVzcG9uZGluZyB2YWx1ZXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBjb21wYXJlLlxuICogQHBhcmFtIHtPYmplY3R9IG90aGVyIFRoZSBvdGhlciBvYmplY3QgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7Ym9vbGVhbltdfHN0cmluZ1tdfSBvcmRlcnMgVGhlIG9yZGVyIHRvIHNvcnQgYnkgZm9yIGVhY2ggcHJvcGVydHkuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzb3J0IG9yZGVyIGluZGljYXRvciBmb3IgYG9iamVjdGAuXG4gKi9cbmZ1bmN0aW9uIGNvbXBhcmVNdWx0aXBsZShvYmplY3QsIG90aGVyLCBvcmRlcnMpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBvYmpDcml0ZXJpYSA9IG9iamVjdC5jcml0ZXJpYSxcbiAgICAgIG90aENyaXRlcmlhID0gb3RoZXIuY3JpdGVyaWEsXG4gICAgICBsZW5ndGggPSBvYmpDcml0ZXJpYS5sZW5ndGgsXG4gICAgICBvcmRlcnNMZW5ndGggPSBvcmRlcnMubGVuZ3RoO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIHJlc3VsdCA9IGNvbXBhcmVBc2NlbmRpbmcob2JqQ3JpdGVyaWFbaW5kZXhdLCBvdGhDcml0ZXJpYVtpbmRleF0pO1xuICAgIGlmIChyZXN1bHQpIHtcbiAgICAgIGlmIChpbmRleCA+PSBvcmRlcnNMZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIHZhciBvcmRlciA9IG9yZGVyc1tpbmRleF07XG4gICAgICByZXR1cm4gcmVzdWx0ICogKG9yZGVyID09ICdkZXNjJyA/IC0xIDogMSk7XG4gICAgfVxuICB9XG4gIC8vIEZpeGVzIGFuIGBBcnJheSNzb3J0YCBidWcgaW4gdGhlIEpTIGVuZ2luZSBlbWJlZGRlZCBpbiBBZG9iZSBhcHBsaWNhdGlvbnNcbiAgLy8gdGhhdCBjYXVzZXMgaXQsIHVuZGVyIGNlcnRhaW4gY2lyY3Vtc3RhbmNlcywgdG8gcHJvdmlkZSB0aGUgc2FtZSB2YWx1ZSBmb3JcbiAgLy8gYG9iamVjdGAgYW5kIGBvdGhlcmAuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vamFzaGtlbmFzL3VuZGVyc2NvcmUvcHVsbC8xMjQ3XG4gIC8vIGZvciBtb3JlIGRldGFpbHMuXG4gIC8vXG4gIC8vIFRoaXMgYWxzbyBlbnN1cmVzIGEgc3RhYmxlIHNvcnQgaW4gVjggYW5kIG90aGVyIGVuZ2luZXMuXG4gIC8vIFNlZSBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD05MCBmb3IgbW9yZSBkZXRhaWxzLlxuICByZXR1cm4gb2JqZWN0LmluZGV4IC0gb3RoZXIuaW5kZXg7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY29tcGFyZU11bHRpcGxlO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///469\n')},function(module,exports,__webpack_require__){eval("var isSymbol = __webpack_require__(76);\n\n/**\n * Compares values to sort them in ascending order.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {number} Returns the sort order indicator for `value`.\n */\nfunction compareAscending(value, other) {\n if (value !== other) {\n var valIsDefined = value !== undefined,\n valIsNull = value === null,\n valIsReflexive = value === value,\n valIsSymbol = isSymbol(value);\n\n var othIsDefined = other !== undefined,\n othIsNull = other === null,\n othIsReflexive = other === other,\n othIsSymbol = isSymbol(other);\n\n if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) ||\n (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) ||\n (valIsNull && othIsDefined && othIsReflexive) ||\n (!valIsDefined && othIsReflexive) ||\n !valIsReflexive) {\n return 1;\n }\n if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) ||\n (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) ||\n (othIsNull && valIsDefined && valIsReflexive) ||\n (!othIsDefined && valIsReflexive) ||\n !othIsReflexive) {\n return -1;\n }\n }\n return 0;\n}\n\nmodule.exports = compareAscending;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jb21wYXJlQXNjZW5kaW5nLmpzP2NhZTciXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsZUFBZSxtQkFBTyxDQUFDLEVBQVk7O0FBRW5DO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxFQUFFO0FBQ2IsV0FBVyxFQUFFO0FBQ2IsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJmaWxlIjoiNDcwLmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIGlzU3ltYm9sID0gcmVxdWlyZSgnLi9pc1N5bWJvbCcpO1xuXG4vKipcbiAqIENvbXBhcmVzIHZhbHVlcyB0byBzb3J0IHRoZW0gaW4gYXNjZW5kaW5nIG9yZGVyLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHNvcnQgb3JkZXIgaW5kaWNhdG9yIGZvciBgdmFsdWVgLlxuICovXG5mdW5jdGlvbiBjb21wYXJlQXNjZW5kaW5nKHZhbHVlLCBvdGhlcikge1xuICBpZiAodmFsdWUgIT09IG90aGVyKSB7XG4gICAgdmFyIHZhbElzRGVmaW5lZCA9IHZhbHVlICE9PSB1bmRlZmluZWQsXG4gICAgICAgIHZhbElzTnVsbCA9IHZhbHVlID09PSBudWxsLFxuICAgICAgICB2YWxJc1JlZmxleGl2ZSA9IHZhbHVlID09PSB2YWx1ZSxcbiAgICAgICAgdmFsSXNTeW1ib2wgPSBpc1N5bWJvbCh2YWx1ZSk7XG5cbiAgICB2YXIgb3RoSXNEZWZpbmVkID0gb3RoZXIgIT09IHVuZGVmaW5lZCxcbiAgICAgICAgb3RoSXNOdWxsID0gb3RoZXIgPT09IG51bGwsXG4gICAgICAgIG90aElzUmVmbGV4aXZlID0gb3RoZXIgPT09IG90aGVyLFxuICAgICAgICBvdGhJc1N5bWJvbCA9IGlzU3ltYm9sKG90aGVyKTtcblxuICAgIGlmICgoIW90aElzTnVsbCAmJiAhb3RoSXNTeW1ib2wgJiYgIXZhbElzU3ltYm9sICYmIHZhbHVlID4gb3RoZXIpIHx8XG4gICAgICAgICh2YWxJc1N5bWJvbCAmJiBvdGhJc0RlZmluZWQgJiYgb3RoSXNSZWZsZXhpdmUgJiYgIW90aElzTnVsbCAmJiAhb3RoSXNTeW1ib2wpIHx8XG4gICAgICAgICh2YWxJc051bGwgJiYgb3RoSXNEZWZpbmVkICYmIG90aElzUmVmbGV4aXZlKSB8fFxuICAgICAgICAoIXZhbElzRGVmaW5lZCAmJiBvdGhJc1JlZmxleGl2ZSkgfHxcbiAgICAgICAgIXZhbElzUmVmbGV4aXZlKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG4gICAgaWYgKCghdmFsSXNOdWxsICYmICF2YWxJc1N5bWJvbCAmJiAhb3RoSXNTeW1ib2wgJiYgdmFsdWUgPCBvdGhlcikgfHxcbiAgICAgICAgKG90aElzU3ltYm9sICYmIHZhbElzRGVmaW5lZCAmJiB2YWxJc1JlZmxleGl2ZSAmJiAhdmFsSXNOdWxsICYmICF2YWxJc1N5bWJvbCkgfHxcbiAgICAgICAgKG90aElzTnVsbCAmJiB2YWxJc0RlZmluZWQgJiYgdmFsSXNSZWZsZXhpdmUpIHx8XG4gICAgICAgICghb3RoSXNEZWZpbmVkICYmIHZhbElzUmVmbGV4aXZlKSB8fFxuICAgICAgICAhb3RoSXNSZWZsZXhpdmUpIHtcbiAgICAgIHJldHVybiAtMTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY29tcGFyZUFzY2VuZGluZztcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///470\n")},function(module,exports,__webpack_require__){eval("var toString = __webpack_require__(214);\n\n/** Used to generate unique IDs. */\nvar idCounter = 0;\n\n/**\n * Generates a unique ID. If `prefix` is given, the ID is appended to it.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {string} [prefix=''] The value to prefix the ID with.\n * @returns {string} Returns the unique ID.\n * @example\n *\n * _.uniqueId('contact_');\n * // => 'contact_104'\n *\n * _.uniqueId();\n * // => '105'\n */\nfunction uniqueId(prefix) {\n var id = ++idCounter;\n return toString(prefix) + id;\n}\n\nmodule.exports = uniqueId;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL3VuaXF1ZUlkLmpzPzk4ZGMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsZUFBZSxtQkFBTyxDQUFDLEdBQVk7O0FBRW5DO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsImZpbGUiOiI0NzEuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgdG9TdHJpbmcgPSByZXF1aXJlKCcuL3RvU3RyaW5nJyk7XG5cbi8qKiBVc2VkIHRvIGdlbmVyYXRlIHVuaXF1ZSBJRHMuICovXG52YXIgaWRDb3VudGVyID0gMDtcblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSB1bmlxdWUgSUQuIElmIGBwcmVmaXhgIGlzIGdpdmVuLCB0aGUgSUQgaXMgYXBwZW5kZWQgdG8gaXQuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IFV0aWxcbiAqIEBwYXJhbSB7c3RyaW5nfSBbcHJlZml4PScnXSBUaGUgdmFsdWUgdG8gcHJlZml4IHRoZSBJRCB3aXRoLlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdW5pcXVlIElELlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnVuaXF1ZUlkKCdjb250YWN0XycpO1xuICogLy8gPT4gJ2NvbnRhY3RfMTA0J1xuICpcbiAqIF8udW5pcXVlSWQoKTtcbiAqIC8vID0+ICcxMDUnXG4gKi9cbmZ1bmN0aW9uIHVuaXF1ZUlkKHByZWZpeCkge1xuICB2YXIgaWQgPSArK2lkQ291bnRlcjtcbiAgcmV0dXJuIHRvU3RyaW5nKHByZWZpeCkgKyBpZDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB1bmlxdWVJZDtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///471\n")},function(module,exports,__webpack_require__){eval("var assignValue = __webpack_require__(104),\n baseZipObject = __webpack_require__(473);\n\n/**\n * This method is like `_.fromPairs` except that it accepts two arrays,\n * one of property identifiers and one of corresponding values.\n *\n * @static\n * @memberOf _\n * @since 0.4.0\n * @category Array\n * @param {Array} [props=[]] The property identifiers.\n * @param {Array} [values=[]] The property values.\n * @returns {Object} Returns the new object.\n * @example\n *\n * _.zipObject(['a', 'b'], [1, 2]);\n * // => { 'a': 1, 'b': 2 }\n */\nfunction zipObject(props, values) {\n return baseZipObject(props || [], values || [], assignValue);\n}\n\nmodule.exports = zipObject;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL3ppcE9iamVjdC5qcz81NDkyIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGtCQUFrQixtQkFBTyxDQUFDLEdBQWdCO0FBQzFDLG9CQUFvQixtQkFBTyxDQUFDLEdBQWtCOztBQUU5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxNQUFNO0FBQ2pCLFdBQVcsTUFBTTtBQUNqQixhQUFhLE9BQU87QUFDcEI7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwiZmlsZSI6IjQ3Mi5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBhc3NpZ25WYWx1ZSA9IHJlcXVpcmUoJy4vX2Fzc2lnblZhbHVlJyksXG4gICAgYmFzZVppcE9iamVjdCA9IHJlcXVpcmUoJy4vX2Jhc2VaaXBPYmplY3QnKTtcblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZyb21QYWlyc2AgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyB0d28gYXJyYXlzLFxuICogb25lIG9mIHByb3BlcnR5IGlkZW50aWZpZXJzIGFuZCBvbmUgb2YgY29ycmVzcG9uZGluZyB2YWx1ZXMuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjQuMFxuICogQGNhdGVnb3J5IEFycmF5XG4gKiBAcGFyYW0ge0FycmF5fSBbcHJvcHM9W11dIFRoZSBwcm9wZXJ0eSBpZGVudGlmaWVycy5cbiAqIEBwYXJhbSB7QXJyYXl9IFt2YWx1ZXM9W11dIFRoZSBwcm9wZXJ0eSB2YWx1ZXMuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnppcE9iamVjdChbJ2EnLCAnYiddLCBbMSwgMl0pO1xuICogLy8gPT4geyAnYSc6IDEsICdiJzogMiB9XG4gKi9cbmZ1bmN0aW9uIHppcE9iamVjdChwcm9wcywgdmFsdWVzKSB7XG4gIHJldHVybiBiYXNlWmlwT2JqZWN0KHByb3BzIHx8IFtdLCB2YWx1ZXMgfHwgW10sIGFzc2lnblZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB6aXBPYmplY3Q7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///472\n")},function(module,exports){eval("/**\n * This base implementation of `_.zipObject` which assigns values using `assignFunc`.\n *\n * @private\n * @param {Array} props The property identifiers.\n * @param {Array} values The property values.\n * @param {Function} assignFunc The function to assign values.\n * @returns {Object} Returns the new object.\n */\nfunction baseZipObject(props, values, assignFunc) {\n var index = -1,\n length = props.length,\n valsLength = values.length,\n result = {};\n\n while (++index < length) {\n var value = index < valsLength ? values[index] : undefined;\n assignFunc(result, props[index], value);\n }\n return result;\n}\n\nmodule.exports = baseZipObject;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlWmlwT2JqZWN0LmpzP2Q3MGQiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE1BQU07QUFDakIsV0FBVyxNQUFNO0FBQ2pCLFdBQVcsU0FBUztBQUNwQixhQUFhLE9BQU87QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsImZpbGUiOiI0NzMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRoaXMgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy56aXBPYmplY3RgIHdoaWNoIGFzc2lnbnMgdmFsdWVzIHVzaW5nIGBhc3NpZ25GdW5jYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gcHJvcHMgVGhlIHByb3BlcnR5IGlkZW50aWZpZXJzLlxuICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSBwcm9wZXJ0eSB2YWx1ZXMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBhc3NpZ25GdW5jIFRoZSBmdW5jdGlvbiB0byBhc3NpZ24gdmFsdWVzLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gYmFzZVppcE9iamVjdChwcm9wcywgdmFsdWVzLCBhc3NpZ25GdW5jKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gcHJvcHMubGVuZ3RoLFxuICAgICAgdmFsc0xlbmd0aCA9IHZhbHVlcy5sZW5ndGgsXG4gICAgICByZXN1bHQgPSB7fTtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciB2YWx1ZSA9IGluZGV4IDwgdmFsc0xlbmd0aCA/IHZhbHVlc1tpbmRleF0gOiB1bmRlZmluZWQ7XG4gICAgYXNzaWduRnVuYyhyZXN1bHQsIHByb3BzW2luZGV4XSwgdmFsdWUpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVppcE9iamVjdDtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///473\n")},function(module,exports,__webpack_require__){"use strict";eval('\n\nvar _ = __webpack_require__(28);\nvar greedyFAS = __webpack_require__(475);\n\nmodule.exports = {\n run: run,\n undo: undo\n};\n\nfunction run(g) {\n var fas = (g.graph().acyclicer === "greedy"\n ? greedyFAS(g, weightFn(g))\n : dfsFAS(g));\n _.forEach(fas, function(e) {\n var label = g.edge(e);\n g.removeEdge(e);\n label.forwardName = e.name;\n label.reversed = true;\n g.setEdge(e.w, e.v, label, _.uniqueId("rev"));\n });\n\n function weightFn(g) {\n return function(e) {\n return g.edge(e).weight;\n };\n }\n}\n\nfunction dfsFAS(g) {\n var fas = [];\n var stack = {};\n var visited = {};\n\n function dfs(v) {\n if (_.has(visited, v)) {\n return;\n }\n visited[v] = true;\n stack[v] = true;\n _.forEach(g.outEdges(v), function(e) {\n if (_.has(stack, e.w)) {\n fas.push(e);\n } else {\n dfs(e.w);\n }\n });\n delete stack[v];\n }\n\n _.forEach(g.nodes(), dfs);\n return fas;\n}\n\nfunction undo(g) {\n _.forEach(g.edges(), function(e) {\n var label = g.edge(e);\n if (label.reversed) {\n g.removeEdge(e);\n\n var forwardName = label.forwardName;\n delete label.reversed;\n delete label.forwardName;\n g.setEdge(e.w, e.v, label, forwardName);\n }\n });\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZGFncmVqcy9saWIvYWN5Y2xpYy5qcz9iYzYyIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFhOztBQUViLFFBQVEsbUJBQU8sQ0FBQyxFQUFVO0FBQzFCLGdCQUFnQixtQkFBTyxDQUFDLEdBQWM7O0FBRXRDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIIiwiZmlsZSI6IjQ3NC5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG52YXIgXyA9IHJlcXVpcmUoXCIuL2xvZGFzaFwiKTtcbnZhciBncmVlZHlGQVMgPSByZXF1aXJlKFwiLi9ncmVlZHktZmFzXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgcnVuOiBydW4sXG4gIHVuZG86IHVuZG9cbn07XG5cbmZ1bmN0aW9uIHJ1bihnKSB7XG4gIHZhciBmYXMgPSAoZy5ncmFwaCgpLmFjeWNsaWNlciA9PT0gXCJncmVlZHlcIlxuICAgID8gZ3JlZWR5RkFTKGcsIHdlaWdodEZuKGcpKVxuICAgIDogZGZzRkFTKGcpKTtcbiAgXy5mb3JFYWNoKGZhcywgZnVuY3Rpb24oZSkge1xuICAgIHZhciBsYWJlbCA9IGcuZWRnZShlKTtcbiAgICBnLnJlbW92ZUVkZ2UoZSk7XG4gICAgbGFiZWwuZm9yd2FyZE5hbWUgPSBlLm5hbWU7XG4gICAgbGFiZWwucmV2ZXJzZWQgPSB0cnVlO1xuICAgIGcuc2V0RWRnZShlLncsIGUudiwgbGFiZWwsIF8udW5pcXVlSWQoXCJyZXZcIikpO1xuICB9KTtcblxuICBmdW5jdGlvbiB3ZWlnaHRGbihnKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKGUpIHtcbiAgICAgIHJldHVybiBnLmVkZ2UoZSkud2VpZ2h0O1xuICAgIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gZGZzRkFTKGcpIHtcbiAgdmFyIGZhcyA9IFtdO1xuICB2YXIgc3RhY2sgPSB7fTtcbiAgdmFyIHZpc2l0ZWQgPSB7fTtcblxuICBmdW5jdGlvbiBkZnModikge1xuICAgIGlmIChfLmhhcyh2aXNpdGVkLCB2KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2aXNpdGVkW3ZdID0gdHJ1ZTtcbiAgICBzdGFja1t2XSA9IHRydWU7XG4gICAgXy5mb3JFYWNoKGcub3V0RWRnZXModiksIGZ1bmN0aW9uKGUpIHtcbiAgICAgIGlmIChfLmhhcyhzdGFjaywgZS53KSkge1xuICAgICAgICBmYXMucHVzaChlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRmcyhlLncpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGRlbGV0ZSBzdGFja1t2XTtcbiAgfVxuXG4gIF8uZm9yRWFjaChnLm5vZGVzKCksIGRmcyk7XG4gIHJldHVybiBmYXM7XG59XG5cbmZ1bmN0aW9uIHVuZG8oZykge1xuICBfLmZvckVhY2goZy5lZGdlcygpLCBmdW5jdGlvbihlKSB7XG4gICAgdmFyIGxhYmVsID0gZy5lZGdlKGUpO1xuICAgIGlmIChsYWJlbC5yZXZlcnNlZCkge1xuICAgICAgZy5yZW1vdmVFZGdlKGUpO1xuXG4gICAgICB2YXIgZm9yd2FyZE5hbWUgPSBsYWJlbC5mb3J3YXJkTmFtZTtcbiAgICAgIGRlbGV0ZSBsYWJlbC5yZXZlcnNlZDtcbiAgICAgIGRlbGV0ZSBsYWJlbC5mb3J3YXJkTmFtZTtcbiAgICAgIGcuc2V0RWRnZShlLncsIGUudiwgbGFiZWwsIGZvcndhcmROYW1lKTtcbiAgICB9XG4gIH0pO1xufVxuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///474\n')},function(module,exports,__webpack_require__){eval('var _ = __webpack_require__(28);\nvar Graph = __webpack_require__(46).Graph;\nvar List = __webpack_require__(476);\n\n/*\n * A greedy heuristic for finding a feedback arc set for a graph. A feedback\n * arc set is a set of edges that can be removed to make a graph acyclic.\n * The algorithm comes from: P. Eades, X. Lin, and W. F. Smyth, "A fast and\n * effective heuristic for the feedback arc set problem." This implementation\n * adjusts that from the paper to allow for weighted edges.\n */\nmodule.exports = greedyFAS;\n\nvar DEFAULT_WEIGHT_FN = _.constant(1);\n\nfunction greedyFAS(g, weightFn) {\n if (g.nodeCount() <= 1) {\n return [];\n }\n var state = buildState(g, weightFn || DEFAULT_WEIGHT_FN);\n var results = doGreedyFAS(state.graph, state.buckets, state.zeroIdx);\n\n // Expand multi-edges\n return _.flatten(_.map(results, function(e) {\n return g.outEdges(e.v, e.w);\n }), true);\n}\n\nfunction doGreedyFAS(g, buckets, zeroIdx) {\n var results = [];\n var sources = buckets[buckets.length - 1];\n var sinks = buckets[0];\n\n var entry;\n while (g.nodeCount()) {\n while ((entry = sinks.dequeue())) { removeNode(g, buckets, zeroIdx, entry); }\n while ((entry = sources.dequeue())) { removeNode(g, buckets, zeroIdx, entry); }\n if (g.nodeCount()) {\n for (var i = buckets.length - 2; i > 0; --i) {\n entry = buckets[i].dequeue();\n if (entry) {\n results = results.concat(removeNode(g, buckets, zeroIdx, entry, true));\n break;\n }\n }\n }\n }\n\n return results;\n}\n\nfunction removeNode(g, buckets, zeroIdx, entry, collectPredecessors) {\n var results = collectPredecessors ? [] : undefined;\n\n _.forEach(g.inEdges(entry.v), function(edge) {\n var weight = g.edge(edge);\n var uEntry = g.node(edge.v);\n\n if (collectPredecessors) {\n results.push({ v: edge.v, w: edge.w });\n }\n\n uEntry.out -= weight;\n assignBucket(buckets, zeroIdx, uEntry);\n });\n\n _.forEach(g.outEdges(entry.v), function(edge) {\n var weight = g.edge(edge);\n var w = edge.w;\n var wEntry = g.node(w);\n wEntry["in"] -= weight;\n assignBucket(buckets, zeroIdx, wEntry);\n });\n\n g.removeNode(entry.v);\n\n return results;\n}\n\nfunction buildState(g, weightFn) {\n var fasGraph = new Graph();\n var maxIn = 0;\n var maxOut = 0;\n\n _.forEach(g.nodes(), function(v) {\n fasGraph.setNode(v, { v: v, "in": 0, out: 0 });\n });\n\n // Aggregate weights on nodes, but also sum the weights across multi-edges\n // into a single edge for the fasGraph.\n _.forEach(g.edges(), function(e) {\n var prevWeight = fasGraph.edge(e.v, e.w) || 0;\n var weight = weightFn(e);\n var edgeWeight = prevWeight + weight;\n fasGraph.setEdge(e.v, e.w, edgeWeight);\n maxOut = Math.max(maxOut, fasGraph.node(e.v).out += weight);\n maxIn = Math.max(maxIn, fasGraph.node(e.w)["in"] += weight);\n });\n\n var buckets = _.range(maxOut + maxIn + 3).map(function() { return new List(); });\n var zeroIdx = maxIn + 1;\n\n _.forEach(fasGraph.nodes(), function(v) {\n assignBucket(buckets, zeroIdx, fasGraph.node(v));\n });\n\n return { graph: fasGraph, buckets: buckets, zeroIdx: zeroIdx };\n}\n\nfunction assignBucket(buckets, zeroIdx, entry) {\n if (!entry.out) {\n buckets[0].enqueue(entry);\n } else if (!entry["in"]) {\n buckets[buckets.length - 1].enqueue(entry);\n } else {\n buckets[entry.out - entry["in"] + zeroIdx].enqueue(entry);\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZGFncmVqcy9saWIvZ3JlZWR5LWZhcy5qcz82YzQxIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFFBQVEsbUJBQU8sQ0FBQyxFQUFVO0FBQzFCLFlBQVksbUJBQU8sQ0FBQyxFQUFZO0FBQ2hDLFdBQVcsbUJBQU8sQ0FBQyxHQUFhOztBQUVoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHlDQUF5Qyx3Q0FBd0M7QUFDakYseUNBQXlDLHdDQUF3QztBQUNqRjtBQUNBLHNDQUFzQyxPQUFPO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG9CQUFvQix1QkFBdUI7QUFDM0M7O0FBRUE7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EseUJBQXlCLHdCQUF3QjtBQUNqRCxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUgsNERBQTRELG1CQUFtQixFQUFFO0FBQ2pGOztBQUVBO0FBQ0E7QUFDQSxHQUFHOztBQUVILFVBQVU7QUFDVjs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBIiwiZmlsZSI6IjQ3NS5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBfID0gcmVxdWlyZShcIi4vbG9kYXNoXCIpO1xudmFyIEdyYXBoID0gcmVxdWlyZShcIi4vZ3JhcGhsaWJcIikuR3JhcGg7XG52YXIgTGlzdCA9IHJlcXVpcmUoXCIuL2RhdGEvbGlzdFwiKTtcblxuLypcbiAqIEEgZ3JlZWR5IGhldXJpc3RpYyBmb3IgZmluZGluZyBhIGZlZWRiYWNrIGFyYyBzZXQgZm9yIGEgZ3JhcGguIEEgZmVlZGJhY2tcbiAqIGFyYyBzZXQgaXMgYSBzZXQgb2YgZWRnZXMgdGhhdCBjYW4gYmUgcmVtb3ZlZCB0byBtYWtlIGEgZ3JhcGggYWN5Y2xpYy5cbiAqIFRoZSBhbGdvcml0aG0gY29tZXMgZnJvbTogUC4gRWFkZXMsIFguIExpbiwgYW5kIFcuIEYuIFNteXRoLCBcIkEgZmFzdCBhbmRcbiAqIGVmZmVjdGl2ZSBoZXVyaXN0aWMgZm9yIHRoZSBmZWVkYmFjayBhcmMgc2V0IHByb2JsZW0uXCIgVGhpcyBpbXBsZW1lbnRhdGlvblxuICogYWRqdXN0cyB0aGF0IGZyb20gdGhlIHBhcGVyIHRvIGFsbG93IGZvciB3ZWlnaHRlZCBlZGdlcy5cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBncmVlZHlGQVM7XG5cbnZhciBERUZBVUxUX1dFSUdIVF9GTiA9IF8uY29uc3RhbnQoMSk7XG5cbmZ1bmN0aW9uIGdyZWVkeUZBUyhnLCB3ZWlnaHRGbikge1xuICBpZiAoZy5ub2RlQ291bnQoKSA8PSAxKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIHZhciBzdGF0ZSA9IGJ1aWxkU3RhdGUoZywgd2VpZ2h0Rm4gfHwgREVGQVVMVF9XRUlHSFRfRk4pO1xuICB2YXIgcmVzdWx0cyA9IGRvR3JlZWR5RkFTKHN0YXRlLmdyYXBoLCBzdGF0ZS5idWNrZXRzLCBzdGF0ZS56ZXJvSWR4KTtcblxuICAvLyBFeHBhbmQgbXVsdGktZWRnZXNcbiAgcmV0dXJuIF8uZmxhdHRlbihfLm1hcChyZXN1bHRzLCBmdW5jdGlvbihlKSB7XG4gICAgcmV0dXJuIGcub3V0RWRnZXMoZS52LCBlLncpO1xuICB9KSwgdHJ1ZSk7XG59XG5cbmZ1bmN0aW9uIGRvR3JlZWR5RkFTKGcsIGJ1Y2tldHMsIHplcm9JZHgpIHtcbiAgdmFyIHJlc3VsdHMgPSBbXTtcbiAgdmFyIHNvdXJjZXMgPSBidWNrZXRzW2J1Y2tldHMubGVuZ3RoIC0gMV07XG4gIHZhciBzaW5rcyA9IGJ1Y2tldHNbMF07XG5cbiAgdmFyIGVudHJ5O1xuICB3aGlsZSAoZy5ub2RlQ291bnQoKSkge1xuICAgIHdoaWxlICgoZW50cnkgPSBzaW5rcy5kZXF1ZXVlKCkpKSAgIHsgcmVtb3ZlTm9kZShnLCBidWNrZXRzLCB6ZXJvSWR4LCBlbnRyeSk7IH1cbiAgICB3aGlsZSAoKGVudHJ5ID0gc291cmNlcy5kZXF1ZXVlKCkpKSB7IHJlbW92ZU5vZGUoZywgYnVja2V0cywgemVyb0lkeCwgZW50cnkpOyB9XG4gICAgaWYgKGcubm9kZUNvdW50KCkpIHtcbiAgICAgIGZvciAodmFyIGkgPSBidWNrZXRzLmxlbmd0aCAtIDI7IGkgPiAwOyAtLWkpIHtcbiAgICAgICAgZW50cnkgPSBidWNrZXRzW2ldLmRlcXVldWUoKTtcbiAgICAgICAgaWYgKGVudHJ5KSB7XG4gICAgICAgICAgcmVzdWx0cyA9IHJlc3VsdHMuY29uY2F0KHJlbW92ZU5vZGUoZywgYnVja2V0cywgemVyb0lkeCwgZW50cnksIHRydWUpKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHRzO1xufVxuXG5mdW5jdGlvbiByZW1vdmVOb2RlKGcsIGJ1Y2tldHMsIHplcm9JZHgsIGVudHJ5LCBjb2xsZWN0UHJlZGVjZXNzb3JzKSB7XG4gIHZhciByZXN1bHRzID0gY29sbGVjdFByZWRlY2Vzc29ycyA/IFtdIDogdW5kZWZpbmVkO1xuXG4gIF8uZm9yRWFjaChnLmluRWRnZXMoZW50cnkudiksIGZ1bmN0aW9uKGVkZ2UpIHtcbiAgICB2YXIgd2VpZ2h0ID0gZy5lZGdlKGVkZ2UpO1xuICAgIHZhciB1RW50cnkgPSBnLm5vZGUoZWRnZS52KTtcblxuICAgIGlmIChjb2xsZWN0UHJlZGVjZXNzb3JzKSB7XG4gICAgICByZXN1bHRzLnB1c2goeyB2OiBlZGdlLnYsIHc6IGVkZ2UudyB9KTtcbiAgICB9XG5cbiAgICB1RW50cnkub3V0IC09IHdlaWdodDtcbiAgICBhc3NpZ25CdWNrZXQoYnVja2V0cywgemVyb0lkeCwgdUVudHJ5KTtcbiAgfSk7XG5cbiAgXy5mb3JFYWNoKGcub3V0RWRnZXMoZW50cnkudiksIGZ1bmN0aW9uKGVkZ2UpIHtcbiAgICB2YXIgd2VpZ2h0ID0gZy5lZGdlKGVkZ2UpO1xuICAgIHZhciB3ID0gZWRnZS53O1xuICAgIHZhciB3RW50cnkgPSBnLm5vZGUodyk7XG4gICAgd0VudHJ5W1wiaW5cIl0gLT0gd2VpZ2h0O1xuICAgIGFzc2lnbkJ1Y2tldChidWNrZXRzLCB6ZXJvSWR4LCB3RW50cnkpO1xuICB9KTtcblxuICBnLnJlbW92ZU5vZGUoZW50cnkudik7XG5cbiAgcmV0dXJuIHJlc3VsdHM7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkU3RhdGUoZywgd2VpZ2h0Rm4pIHtcbiAgdmFyIGZhc0dyYXBoID0gbmV3IEdyYXBoKCk7XG4gIHZhciBtYXhJbiA9IDA7XG4gIHZhciBtYXhPdXQgPSAwO1xuXG4gIF8uZm9yRWFjaChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICBmYXNHcmFwaC5zZXROb2RlKHYsIHsgdjogdiwgXCJpblwiOiAwLCBvdXQ6IDAgfSk7XG4gIH0pO1xuXG4gIC8vIEFnZ3JlZ2F0ZSB3ZWlnaHRzIG9uIG5vZGVzLCBidXQgYWxzbyBzdW0gdGhlIHdlaWdodHMgYWNyb3NzIG11bHRpLWVkZ2VzXG4gIC8vIGludG8gYSBzaW5nbGUgZWRnZSBmb3IgdGhlIGZhc0dyYXBoLlxuICBfLmZvckVhY2goZy5lZGdlcygpLCBmdW5jdGlvbihlKSB7XG4gICAgdmFyIHByZXZXZWlnaHQgPSBmYXNHcmFwaC5lZGdlKGUudiwgZS53KSB8fCAwO1xuICAgIHZhciB3ZWlnaHQgPSB3ZWlnaHRGbihlKTtcbiAgICB2YXIgZWRnZVdlaWdodCA9IHByZXZXZWlnaHQgKyB3ZWlnaHQ7XG4gICAgZmFzR3JhcGguc2V0RWRnZShlLnYsIGUudywgZWRnZVdlaWdodCk7XG4gICAgbWF4T3V0ID0gTWF0aC5tYXgobWF4T3V0LCBmYXNHcmFwaC5ub2RlKGUudikub3V0ICs9IHdlaWdodCk7XG4gICAgbWF4SW4gID0gTWF0aC5tYXgobWF4SW4sICBmYXNHcmFwaC5ub2RlKGUudylbXCJpblwiXSAgKz0gd2VpZ2h0KTtcbiAgfSk7XG5cbiAgdmFyIGJ1Y2tldHMgPSBfLnJhbmdlKG1heE91dCArIG1heEluICsgMykubWFwKGZ1bmN0aW9uKCkgeyByZXR1cm4gbmV3IExpc3QoKTsgfSk7XG4gIHZhciB6ZXJvSWR4ID0gbWF4SW4gKyAxO1xuXG4gIF8uZm9yRWFjaChmYXNHcmFwaC5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgYXNzaWduQnVja2V0KGJ1Y2tldHMsIHplcm9JZHgsIGZhc0dyYXBoLm5vZGUodikpO1xuICB9KTtcblxuICByZXR1cm4geyBncmFwaDogZmFzR3JhcGgsIGJ1Y2tldHM6IGJ1Y2tldHMsIHplcm9JZHg6IHplcm9JZHggfTtcbn1cblxuZnVuY3Rpb24gYXNzaWduQnVja2V0KGJ1Y2tldHMsIHplcm9JZHgsIGVudHJ5KSB7XG4gIGlmICghZW50cnkub3V0KSB7XG4gICAgYnVja2V0c1swXS5lbnF1ZXVlKGVudHJ5KTtcbiAgfSBlbHNlIGlmICghZW50cnlbXCJpblwiXSkge1xuICAgIGJ1Y2tldHNbYnVja2V0cy5sZW5ndGggLSAxXS5lbnF1ZXVlKGVudHJ5KTtcbiAgfSBlbHNlIHtcbiAgICBidWNrZXRzW2VudHJ5Lm91dCAtIGVudHJ5W1wiaW5cIl0gKyB6ZXJvSWR4XS5lbnF1ZXVlKGVudHJ5KTtcbiAgfVxufVxuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///475\n')},function(module,exports){eval('/*\n * Simple doubly linked list implementation derived from Cormen, et al.,\n * "Introduction to Algorithms".\n */\n\nmodule.exports = List;\n\nfunction List() {\n var sentinel = {};\n sentinel._next = sentinel._prev = sentinel;\n this._sentinel = sentinel;\n}\n\nList.prototype.dequeue = function() {\n var sentinel = this._sentinel;\n var entry = sentinel._prev;\n if (entry !== sentinel) {\n unlink(entry);\n return entry;\n }\n};\n\nList.prototype.enqueue = function(entry) {\n var sentinel = this._sentinel;\n if (entry._prev && entry._next) {\n unlink(entry);\n }\n entry._next = sentinel._next;\n sentinel._next._prev = entry;\n sentinel._next = entry;\n entry._prev = sentinel;\n};\n\nList.prototype.toString = function() {\n var strs = [];\n var sentinel = this._sentinel;\n var curr = sentinel._prev;\n while (curr !== sentinel) {\n strs.push(JSON.stringify(curr, filterOutLinks));\n curr = curr._prev;\n }\n return "[" + strs.join(", ") + "]";\n};\n\nfunction unlink(entry) {\n entry._prev._next = entry._next;\n entry._next._prev = entry._prev;\n delete entry._next;\n delete entry._prev;\n}\n\nfunction filterOutLinks(k, v) {\n if (k !== "_next" && k !== "_prev") {\n return v;\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZGFncmVqcy9saWIvZGF0YS9saXN0LmpzP2Y3MmIiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6IjQ3Ni5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBTaW1wbGUgZG91Ymx5IGxpbmtlZCBsaXN0IGltcGxlbWVudGF0aW9uIGRlcml2ZWQgZnJvbSBDb3JtZW4sIGV0IGFsLixcbiAqIFwiSW50cm9kdWN0aW9uIHRvIEFsZ29yaXRobXNcIi5cbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IExpc3Q7XG5cbmZ1bmN0aW9uIExpc3QoKSB7XG4gIHZhciBzZW50aW5lbCA9IHt9O1xuICBzZW50aW5lbC5fbmV4dCA9IHNlbnRpbmVsLl9wcmV2ID0gc2VudGluZWw7XG4gIHRoaXMuX3NlbnRpbmVsID0gc2VudGluZWw7XG59XG5cbkxpc3QucHJvdG90eXBlLmRlcXVldWUgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHNlbnRpbmVsID0gdGhpcy5fc2VudGluZWw7XG4gIHZhciBlbnRyeSA9IHNlbnRpbmVsLl9wcmV2O1xuICBpZiAoZW50cnkgIT09IHNlbnRpbmVsKSB7XG4gICAgdW5saW5rKGVudHJ5KTtcbiAgICByZXR1cm4gZW50cnk7XG4gIH1cbn07XG5cbkxpc3QucHJvdG90eXBlLmVucXVldWUgPSBmdW5jdGlvbihlbnRyeSkge1xuICB2YXIgc2VudGluZWwgPSB0aGlzLl9zZW50aW5lbDtcbiAgaWYgKGVudHJ5Ll9wcmV2ICYmIGVudHJ5Ll9uZXh0KSB7XG4gICAgdW5saW5rKGVudHJ5KTtcbiAgfVxuICBlbnRyeS5fbmV4dCA9IHNlbnRpbmVsLl9uZXh0O1xuICBzZW50aW5lbC5fbmV4dC5fcHJldiA9IGVudHJ5O1xuICBzZW50aW5lbC5fbmV4dCA9IGVudHJ5O1xuICBlbnRyeS5fcHJldiA9IHNlbnRpbmVsO1xufTtcblxuTGlzdC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHN0cnMgPSBbXTtcbiAgdmFyIHNlbnRpbmVsID0gdGhpcy5fc2VudGluZWw7XG4gIHZhciBjdXJyID0gc2VudGluZWwuX3ByZXY7XG4gIHdoaWxlIChjdXJyICE9PSBzZW50aW5lbCkge1xuICAgIHN0cnMucHVzaChKU09OLnN0cmluZ2lmeShjdXJyLCBmaWx0ZXJPdXRMaW5rcykpO1xuICAgIGN1cnIgPSBjdXJyLl9wcmV2O1xuICB9XG4gIHJldHVybiBcIltcIiArIHN0cnMuam9pbihcIiwgXCIpICsgXCJdXCI7XG59O1xuXG5mdW5jdGlvbiB1bmxpbmsoZW50cnkpIHtcbiAgZW50cnkuX3ByZXYuX25leHQgPSBlbnRyeS5fbmV4dDtcbiAgZW50cnkuX25leHQuX3ByZXYgPSBlbnRyeS5fcHJldjtcbiAgZGVsZXRlIGVudHJ5Ll9uZXh0O1xuICBkZWxldGUgZW50cnkuX3ByZXY7XG59XG5cbmZ1bmN0aW9uIGZpbHRlck91dExpbmtzKGssIHYpIHtcbiAgaWYgKGsgIT09IFwiX25leHRcIiAmJiBrICE9PSBcIl9wcmV2XCIpIHtcbiAgICByZXR1cm4gdjtcbiAgfVxufVxuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///476\n')},function(module,exports,__webpack_require__){"use strict";eval('\n\nvar _ = __webpack_require__(28);\nvar util = __webpack_require__(36);\n\nmodule.exports = {\n run: run,\n undo: undo\n};\n\n/*\n * Breaks any long edges in the graph into short segments that span 1 layer\n * each. This operation is undoable with the denormalize function.\n *\n * Pre-conditions:\n *\n * 1. The input graph is a DAG.\n * 2. Each node in the graph has a "rank" property.\n *\n * Post-condition:\n *\n * 1. All edges in the graph have a length of 1.\n * 2. Dummy nodes are added where edges have been split into segments.\n * 3. The graph is augmented with a "dummyChains" attribute which contains\n * the first dummy in each chain of dummy nodes produced.\n */\nfunction run(g) {\n g.graph().dummyChains = [];\n _.forEach(g.edges(), function(edge) { normalizeEdge(g, edge); });\n}\n\nfunction normalizeEdge(g, e) {\n var v = e.v;\n var vRank = g.node(v).rank;\n var w = e.w;\n var wRank = g.node(w).rank;\n var name = e.name;\n var edgeLabel = g.edge(e);\n var labelRank = edgeLabel.labelRank;\n\n if (wRank === vRank + 1) return;\n\n g.removeEdge(e);\n\n var dummy, attrs, i;\n for (i = 0, ++vRank; vRank < wRank; ++i, ++vRank) {\n edgeLabel.points = [];\n attrs = {\n width: 0, height: 0,\n edgeLabel: edgeLabel, edgeObj: e,\n rank: vRank\n };\n dummy = util.addDummyNode(g, "edge", attrs, "_d");\n if (vRank === labelRank) {\n attrs.width = edgeLabel.width;\n attrs.height = edgeLabel.height;\n attrs.dummy = "edge-label";\n attrs.labelpos = edgeLabel.labelpos;\n }\n g.setEdge(v, dummy, { weight: edgeLabel.weight }, name);\n if (i === 0) {\n g.graph().dummyChains.push(dummy);\n }\n v = dummy;\n }\n\n g.setEdge(v, w, { weight: edgeLabel.weight }, name);\n}\n\nfunction undo(g) {\n _.forEach(g.graph().dummyChains, function(v) {\n var node = g.node(v);\n var origLabel = node.edgeLabel;\n var w;\n g.setEdge(node.edgeObj, origLabel);\n while (node.dummy) {\n w = g.successors(v)[0];\n g.removeNode(v);\n origLabel.points.push({ x: node.x, y: node.y });\n if (node.dummy === "edge-label") {\n origLabel.x = node.x;\n origLabel.y = node.y;\n origLabel.width = node.width;\n origLabel.height = node.height;\n }\n v = w;\n node = g.node(v);\n }\n });\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZGFncmVqcy9saWIvbm9ybWFsaXplLmpzP2RjMGEiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWIsUUFBUSxtQkFBTyxDQUFDLEVBQVU7QUFDMUIsV0FBVyxtQkFBTyxDQUFDLEVBQVE7O0FBRTNCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1Qyx3QkFBd0IsRUFBRTtBQUNqRTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0Esc0JBQXNCLGVBQWU7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIsMkJBQTJCO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsbUJBQW1CLDJCQUEyQjtBQUM5Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkIsdUJBQXVCO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCIsImZpbGUiOiI0NzcuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxudmFyIF8gPSByZXF1aXJlKFwiLi9sb2Rhc2hcIik7XG52YXIgdXRpbCA9IHJlcXVpcmUoXCIuL3V0aWxcIik7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBydW46IHJ1bixcbiAgdW5kbzogdW5kb1xufTtcblxuLypcbiAqIEJyZWFrcyBhbnkgbG9uZyBlZGdlcyBpbiB0aGUgZ3JhcGggaW50byBzaG9ydCBzZWdtZW50cyB0aGF0IHNwYW4gMSBsYXllclxuICogZWFjaC4gVGhpcyBvcGVyYXRpb24gaXMgdW5kb2FibGUgd2l0aCB0aGUgZGVub3JtYWxpemUgZnVuY3Rpb24uXG4gKlxuICogUHJlLWNvbmRpdGlvbnM6XG4gKlxuICogICAgMS4gVGhlIGlucHV0IGdyYXBoIGlzIGEgREFHLlxuICogICAgMi4gRWFjaCBub2RlIGluIHRoZSBncmFwaCBoYXMgYSBcInJhbmtcIiBwcm9wZXJ0eS5cbiAqXG4gKiBQb3N0LWNvbmRpdGlvbjpcbiAqXG4gKiAgICAxLiBBbGwgZWRnZXMgaW4gdGhlIGdyYXBoIGhhdmUgYSBsZW5ndGggb2YgMS5cbiAqICAgIDIuIER1bW15IG5vZGVzIGFyZSBhZGRlZCB3aGVyZSBlZGdlcyBoYXZlIGJlZW4gc3BsaXQgaW50byBzZWdtZW50cy5cbiAqICAgIDMuIFRoZSBncmFwaCBpcyBhdWdtZW50ZWQgd2l0aCBhIFwiZHVtbXlDaGFpbnNcIiBhdHRyaWJ1dGUgd2hpY2ggY29udGFpbnNcbiAqICAgICAgIHRoZSBmaXJzdCBkdW1teSBpbiBlYWNoIGNoYWluIG9mIGR1bW15IG5vZGVzIHByb2R1Y2VkLlxuICovXG5mdW5jdGlvbiBydW4oZykge1xuICBnLmdyYXBoKCkuZHVtbXlDaGFpbnMgPSBbXTtcbiAgXy5mb3JFYWNoKGcuZWRnZXMoKSwgZnVuY3Rpb24oZWRnZSkgeyBub3JtYWxpemVFZGdlKGcsIGVkZ2UpOyB9KTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplRWRnZShnLCBlKSB7XG4gIHZhciB2ID0gZS52O1xuICB2YXIgdlJhbmsgPSBnLm5vZGUodikucmFuaztcbiAgdmFyIHcgPSBlLnc7XG4gIHZhciB3UmFuayA9IGcubm9kZSh3KS5yYW5rO1xuICB2YXIgbmFtZSA9IGUubmFtZTtcbiAgdmFyIGVkZ2VMYWJlbCA9IGcuZWRnZShlKTtcbiAgdmFyIGxhYmVsUmFuayA9IGVkZ2VMYWJlbC5sYWJlbFJhbms7XG5cbiAgaWYgKHdSYW5rID09PSB2UmFuayArIDEpIHJldHVybjtcblxuICBnLnJlbW92ZUVkZ2UoZSk7XG5cbiAgdmFyIGR1bW15LCBhdHRycywgaTtcbiAgZm9yIChpID0gMCwgKyt2UmFuazsgdlJhbmsgPCB3UmFuazsgKytpLCArK3ZSYW5rKSB7XG4gICAgZWRnZUxhYmVsLnBvaW50cyA9IFtdO1xuICAgIGF0dHJzID0ge1xuICAgICAgd2lkdGg6IDAsIGhlaWdodDogMCxcbiAgICAgIGVkZ2VMYWJlbDogZWRnZUxhYmVsLCBlZGdlT2JqOiBlLFxuICAgICAgcmFuazogdlJhbmtcbiAgICB9O1xuICAgIGR1bW15ID0gdXRpbC5hZGREdW1teU5vZGUoZywgXCJlZGdlXCIsIGF0dHJzLCBcIl9kXCIpO1xuICAgIGlmICh2UmFuayA9PT0gbGFiZWxSYW5rKSB7XG4gICAgICBhdHRycy53aWR0aCA9IGVkZ2VMYWJlbC53aWR0aDtcbiAgICAgIGF0dHJzLmhlaWdodCA9IGVkZ2VMYWJlbC5oZWlnaHQ7XG4gICAgICBhdHRycy5kdW1teSA9IFwiZWRnZS1sYWJlbFwiO1xuICAgICAgYXR0cnMubGFiZWxwb3MgPSBlZGdlTGFiZWwubGFiZWxwb3M7XG4gICAgfVxuICAgIGcuc2V0RWRnZSh2LCBkdW1teSwgeyB3ZWlnaHQ6IGVkZ2VMYWJlbC53ZWlnaHQgfSwgbmFtZSk7XG4gICAgaWYgKGkgPT09IDApIHtcbiAgICAgIGcuZ3JhcGgoKS5kdW1teUNoYWlucy5wdXNoKGR1bW15KTtcbiAgICB9XG4gICAgdiA9IGR1bW15O1xuICB9XG5cbiAgZy5zZXRFZGdlKHYsIHcsIHsgd2VpZ2h0OiBlZGdlTGFiZWwud2VpZ2h0IH0sIG5hbWUpO1xufVxuXG5mdW5jdGlvbiB1bmRvKGcpIHtcbiAgXy5mb3JFYWNoKGcuZ3JhcGgoKS5kdW1teUNoYWlucywgZnVuY3Rpb24odikge1xuICAgIHZhciBub2RlID0gZy5ub2RlKHYpO1xuICAgIHZhciBvcmlnTGFiZWwgPSBub2RlLmVkZ2VMYWJlbDtcbiAgICB2YXIgdztcbiAgICBnLnNldEVkZ2Uobm9kZS5lZGdlT2JqLCBvcmlnTGFiZWwpO1xuICAgIHdoaWxlIChub2RlLmR1bW15KSB7XG4gICAgICB3ID0gZy5zdWNjZXNzb3JzKHYpWzBdO1xuICAgICAgZy5yZW1vdmVOb2RlKHYpO1xuICAgICAgb3JpZ0xhYmVsLnBvaW50cy5wdXNoKHsgeDogbm9kZS54LCB5OiBub2RlLnkgfSk7XG4gICAgICBpZiAobm9kZS5kdW1teSA9PT0gXCJlZGdlLWxhYmVsXCIpIHtcbiAgICAgICAgb3JpZ0xhYmVsLnggPSBub2RlLng7XG4gICAgICAgIG9yaWdMYWJlbC55ID0gbm9kZS55O1xuICAgICAgICBvcmlnTGFiZWwud2lkdGggPSBub2RlLndpZHRoO1xuICAgICAgICBvcmlnTGFiZWwuaGVpZ2h0ID0gbm9kZS5oZWlnaHQ7XG4gICAgICB9XG4gICAgICB2ID0gdztcbiAgICAgIG5vZGUgPSBnLm5vZGUodik7XG4gICAgfVxuICB9KTtcbn1cbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///477\n')},function(module,exports,__webpack_require__){"use strict";eval('\n\nvar rankUtil = __webpack_require__(116);\nvar longestPath = rankUtil.longestPathWithLayer;\nvar feasibleTree = __webpack_require__(238).feasibleTreeWithLayer;\nvar networkSimplex = __webpack_require__(479);\n\nmodule.exports = rank;\n\n/*\n * Assigns a rank to each node in the input graph that respects the "minlen"\n * constraint specified on edges between nodes.\n *\n * This basic structure is derived from Gansner, et al., "A Technique for\n * Drawing Directed Graphs."\n *\n * Pre-conditions:\n *\n * 1. Graph must be a connected DAG\n * 2. Graph nodes must be objects\n * 3. Graph edges must have "weight" and "minlen" attributes\n *\n * Post-conditions:\n *\n * 1. Graph nodes will have a "rank" attribute based on the results of the\n * algorithm. Ranks can start at any index (including negative), we\'ll\n * fix them up later.\n */\nfunction rank(g) {\n switch(g.graph().ranker) {\n case "network-simplex": networkSimplexRanker(g); break;\n case "tight-tree": tightTreeRanker(g); break;\n case "longest-path": longestPathRanker(g); break;\n // default: networkSimplexRanker(g);\n default: tightTreeRanker(g);\n }\n}\n\n// A fast and simple ranker, but results are far from optimal.\nvar longestPathRanker = longestPath;\n\nfunction tightTreeRanker(g) {\n longestPath(g);\n feasibleTree(g);\n}\n\nfunction networkSimplexRanker(g) {\n networkSimplex(g);\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZGFncmVqcy9saWIvcmFuay9pbmRleC5qcz8xY2JmIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFhOztBQUViLGVBQWUsbUJBQU8sQ0FBQyxHQUFRO0FBQy9CO0FBQ0EsbUJBQW1CLG1CQUFPLENBQUMsR0FBaUI7QUFDNUMscUJBQXFCLG1CQUFPLENBQUMsR0FBbUI7O0FBRWhEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtEQUFrRDtBQUNsRCx3Q0FBd0M7QUFDeEMsNENBQTRDO0FBQzVDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBIiwiZmlsZSI6IjQ3OC5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG52YXIgcmFua1V0aWwgPSByZXF1aXJlKFwiLi91dGlsXCIpO1xudmFyIGxvbmdlc3RQYXRoID0gcmFua1V0aWwubG9uZ2VzdFBhdGhXaXRoTGF5ZXI7XG52YXIgZmVhc2libGVUcmVlID0gcmVxdWlyZShcIi4vZmVhc2libGUtdHJlZVwiKS5mZWFzaWJsZVRyZWVXaXRoTGF5ZXI7XG52YXIgbmV0d29ya1NpbXBsZXggPSByZXF1aXJlKFwiLi9uZXR3b3JrLXNpbXBsZXhcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gcmFuaztcblxuLypcbiAqIEFzc2lnbnMgYSByYW5rIHRvIGVhY2ggbm9kZSBpbiB0aGUgaW5wdXQgZ3JhcGggdGhhdCByZXNwZWN0cyB0aGUgXCJtaW5sZW5cIlxuICogY29uc3RyYWludCBzcGVjaWZpZWQgb24gZWRnZXMgYmV0d2VlbiBub2Rlcy5cbiAqXG4gKiBUaGlzIGJhc2ljIHN0cnVjdHVyZSBpcyBkZXJpdmVkIGZyb20gR2Fuc25lciwgZXQgYWwuLCBcIkEgVGVjaG5pcXVlIGZvclxuICogRHJhd2luZyBEaXJlY3RlZCBHcmFwaHMuXCJcbiAqXG4gKiBQcmUtY29uZGl0aW9uczpcbiAqXG4gKiAgICAxLiBHcmFwaCBtdXN0IGJlIGEgY29ubmVjdGVkIERBR1xuICogICAgMi4gR3JhcGggbm9kZXMgbXVzdCBiZSBvYmplY3RzXG4gKiAgICAzLiBHcmFwaCBlZGdlcyBtdXN0IGhhdmUgXCJ3ZWlnaHRcIiBhbmQgXCJtaW5sZW5cIiBhdHRyaWJ1dGVzXG4gKlxuICogUG9zdC1jb25kaXRpb25zOlxuICpcbiAqICAgIDEuIEdyYXBoIG5vZGVzIHdpbGwgaGF2ZSBhIFwicmFua1wiIGF0dHJpYnV0ZSBiYXNlZCBvbiB0aGUgcmVzdWx0cyBvZiB0aGVcbiAqICAgICAgIGFsZ29yaXRobS4gUmFua3MgY2FuIHN0YXJ0IGF0IGFueSBpbmRleCAoaW5jbHVkaW5nIG5lZ2F0aXZlKSwgd2UnbGxcbiAqICAgICAgIGZpeCB0aGVtIHVwIGxhdGVyLlxuICovXG5mdW5jdGlvbiByYW5rKGcpIHtcbiAgc3dpdGNoKGcuZ3JhcGgoKS5yYW5rZXIpIHtcbiAgY2FzZSBcIm5ldHdvcmstc2ltcGxleFwiOiBuZXR3b3JrU2ltcGxleFJhbmtlcihnKTsgYnJlYWs7XG4gIGNhc2UgXCJ0aWdodC10cmVlXCI6IHRpZ2h0VHJlZVJhbmtlcihnKTsgYnJlYWs7XG4gIGNhc2UgXCJsb25nZXN0LXBhdGhcIjogbG9uZ2VzdFBhdGhSYW5rZXIoZyk7IGJyZWFrO1xuICAvLyBkZWZhdWx0OiBuZXR3b3JrU2ltcGxleFJhbmtlcihnKTtcbiAgZGVmYXVsdDogdGlnaHRUcmVlUmFua2VyKGcpO1xuICB9XG59XG5cbi8vIEEgZmFzdCBhbmQgc2ltcGxlIHJhbmtlciwgYnV0IHJlc3VsdHMgYXJlIGZhciBmcm9tIG9wdGltYWwuXG52YXIgbG9uZ2VzdFBhdGhSYW5rZXIgPSBsb25nZXN0UGF0aDtcblxuZnVuY3Rpb24gdGlnaHRUcmVlUmFua2VyKGcpIHtcbiAgbG9uZ2VzdFBhdGgoZyk7XG4gIGZlYXNpYmxlVHJlZShnKTtcbn1cblxuZnVuY3Rpb24gbmV0d29ya1NpbXBsZXhSYW5rZXIoZykge1xuICBuZXR3b3JrU2ltcGxleChnKTtcbn1cbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///478\n')},function(module,exports,__webpack_require__){"use strict";eval('\n\nvar _ = __webpack_require__(28);\nvar feasibleTree = __webpack_require__(238).feasibleTree;\nvar slack = __webpack_require__(116).slack;\nvar initRank = __webpack_require__(116).longestPath;\nvar preorder = __webpack_require__(46).alg.preorder;\nvar postorder = __webpack_require__(46).alg.postorder;\nvar simplify = __webpack_require__(36).simplify;\n\nmodule.exports = networkSimplex;\n\n// Expose some internals for testing purposes\nnetworkSimplex.initLowLimValues = initLowLimValues;\nnetworkSimplex.initCutValues = initCutValues;\nnetworkSimplex.calcCutValue = calcCutValue;\nnetworkSimplex.leaveEdge = leaveEdge;\nnetworkSimplex.enterEdge = enterEdge;\nnetworkSimplex.exchangeEdges = exchangeEdges;\n\n/*\n * The network simplex algorithm assigns ranks to each node in the input graph\n * and iteratively improves the ranking to reduce the length of edges.\n *\n * Preconditions:\n *\n * 1. The input graph must be a DAG.\n * 2. All nodes in the graph must have an object value.\n * 3. All edges in the graph must have "minlen" and "weight" attributes.\n *\n * Postconditions:\n *\n * 1. All nodes in the graph will have an assigned "rank" attribute that has\n * been optimized by the network simplex algorithm. Ranks start at 0.\n *\n *\n * A rough sketch of the algorithm is as follows:\n *\n * 1. Assign initial ranks to each node. We use the longest path algorithm,\n * which assigns ranks to the lowest position possible. In general this\n * leads to very wide bottom ranks and unnecessarily long edges.\n * 2. Construct a feasible tight tree. A tight tree is one such that all\n * edges in the tree have no slack (difference between length of edge\n * and minlen for the edge). This by itself greatly improves the assigned\n * rankings by shorting edges.\n * 3. Iteratively find edges that have negative cut values. Generally a\n * negative cut value indicates that the edge could be removed and a new\n * tree edge could be added to produce a more compact graph.\n *\n * Much of the algorithms here are derived from Gansner, et al., "A Technique\n * for Drawing Directed Graphs." The structure of the file roughly follows the\n * structure of the overall algorithm.\n */\nfunction networkSimplex(g) {\n g = simplify(g);\n initRank(g);\n var t = feasibleTree(g);\n initLowLimValues(t);\n initCutValues(t, g);\n\n var e, f;\n while ((e = leaveEdge(t))) {\n f = enterEdge(t, g, e);\n exchangeEdges(t, g, e, f);\n }\n}\n\n/*\n * Initializes cut values for all edges in the tree.\n */\nfunction initCutValues(t, g) {\n var vs = postorder(t, t.nodes());\n vs = vs.slice(0, vs.length - 1);\n _.forEach(vs, function(v) {\n assignCutValue(t, g, v);\n });\n}\n\nfunction assignCutValue(t, g, child) {\n var childLab = t.node(child);\n var parent = childLab.parent;\n t.edge(child, parent).cutvalue = calcCutValue(t, g, child);\n}\n\n/*\n * Given the tight tree, its graph, and a child in the graph calculate and\n * return the cut value for the edge between the child and its parent.\n */\nfunction calcCutValue(t, g, child) {\n var childLab = t.node(child);\n var parent = childLab.parent;\n // True if the child is on the tail end of the edge in the directed graph\n var childIsTail = true;\n // The graph\'s view of the tree edge we\'re inspecting\n var graphEdge = g.edge(child, parent);\n // The accumulated cut value for the edge between this node and its parent\n var cutValue = 0;\n\n if (!graphEdge) {\n childIsTail = false;\n graphEdge = g.edge(parent, child);\n }\n\n cutValue = graphEdge.weight;\n\n _.forEach(g.nodeEdges(child), function(e) {\n var isOutEdge = e.v === child,\n other = isOutEdge ? e.w : e.v;\n\n if (other !== parent) {\n var pointsToHead = isOutEdge === childIsTail,\n otherWeight = g.edge(e).weight;\n\n cutValue += pointsToHead ? otherWeight : -otherWeight;\n if (isTreeEdge(t, child, other)) {\n var otherCutValue = t.edge(child, other).cutvalue;\n cutValue += pointsToHead ? -otherCutValue : otherCutValue;\n }\n }\n });\n\n return cutValue;\n}\n\nfunction initLowLimValues(tree, root) {\n if (arguments.length < 2) {\n root = tree.nodes()[0];\n }\n dfsAssignLowLim(tree, {}, 1, root);\n}\n\nfunction dfsAssignLowLim(tree, visited, nextLim, v, parent) {\n var low = nextLim;\n var label = tree.node(v);\n\n visited[v] = true;\n _.forEach(tree.neighbors(v), function(w) {\n if (!_.has(visited, w)) {\n nextLim = dfsAssignLowLim(tree, visited, nextLim, w, v);\n }\n });\n\n label.low = low;\n label.lim = nextLim++;\n if (parent) {\n label.parent = parent;\n } else {\n // TODO should be able to remove this when we incrementally update low lim\n delete label.parent;\n }\n\n return nextLim;\n}\n\nfunction leaveEdge(tree) {\n return _.find(tree.edges(), function(e) {\n return tree.edge(e).cutvalue < 0;\n });\n}\n\nfunction enterEdge(t, g, edge) {\n var v = edge.v;\n var w = edge.w;\n\n // For the rest of this function we assume that v is the tail and w is the\n // head, so if we don\'t have this edge in the graph we should flip it to\n // match the correct orientation.\n if (!g.hasEdge(v, w)) {\n v = edge.w;\n w = edge.v;\n }\n\n var vLabel = t.node(v);\n var wLabel = t.node(w);\n var tailLabel = vLabel;\n var flip = false;\n\n // If the root is in the tail of the edge then we need to flip the logic that\n // checks for the head and tail nodes in the candidates function below.\n if (vLabel.lim > wLabel.lim) {\n tailLabel = wLabel;\n flip = true;\n }\n\n var candidates = _.filter(g.edges(), function(edge) {\n return flip === isDescendant(t, t.node(edge.v), tailLabel) &&\n flip !== isDescendant(t, t.node(edge.w), tailLabel);\n });\n\n return _.minBy(candidates, function(edge) { return slack(g, edge); });\n}\n\nfunction exchangeEdges(t, g, e, f) {\n var v = e.v;\n var w = e.w;\n t.removeEdge(v, w);\n t.setEdge(f.v, f.w, {});\n initLowLimValues(t);\n initCutValues(t, g);\n updateRanks(t, g);\n}\n\nfunction updateRanks(t, g) {\n var root = _.find(t.nodes(), function(v) { return !g.node(v).parent; });\n var vs = preorder(t, root);\n vs = vs.slice(1);\n _.forEach(vs, function(v) {\n var parent = t.node(v).parent,\n edge = g.edge(v, parent),\n flipped = false;\n\n if (!edge) {\n edge = g.edge(parent, v);\n flipped = true;\n }\n\n g.node(v).rank = g.node(parent).rank + (flipped ? edge.minlen : -edge.minlen);\n });\n}\n\n/*\n * Returns true if the edge is in the tree.\n */\nfunction isTreeEdge(tree, u, v) {\n return tree.hasEdge(u, v);\n}\n\n/*\n * Returns true if the specified node is descendant of the root node per the\n * assigned low and lim attributes in the tree.\n */\nfunction isDescendant(tree, vLabel, rootLabel) {\n return rootLabel.low <= vLabel.lim && vLabel.lim <= rootLabel.lim;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZGFncmVqcy9saWIvcmFuay9uZXR3b3JrLXNpbXBsZXguanM/NjRmNyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBYTs7QUFFYixRQUFRLG1CQUFPLENBQUMsRUFBVztBQUMzQixtQkFBbUIsbUJBQU8sQ0FBQyxHQUFpQjtBQUM1QyxZQUFZLG1CQUFPLENBQUMsR0FBUTtBQUM1QixlQUFlLG1CQUFPLENBQUMsR0FBUTtBQUMvQixlQUFlLG1CQUFPLENBQUMsRUFBYTtBQUNwQyxnQkFBZ0IsbUJBQU8sQ0FBQyxFQUFhO0FBQ3JDLGVBQWUsbUJBQU8sQ0FBQyxFQUFTOztBQUVoQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSCw2Q0FBNkMsdUJBQXVCLEVBQUU7QUFDdEU7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0I7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw0Q0FBNEMsMEJBQTBCLEVBQUU7QUFDeEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiI0NzkuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxudmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xudmFyIGZlYXNpYmxlVHJlZSA9IHJlcXVpcmUoXCIuL2ZlYXNpYmxlLXRyZWVcIikuZmVhc2libGVUcmVlO1xudmFyIHNsYWNrID0gcmVxdWlyZShcIi4vdXRpbFwiKS5zbGFjaztcbnZhciBpbml0UmFuayA9IHJlcXVpcmUoXCIuL3V0aWxcIikubG9uZ2VzdFBhdGg7XG52YXIgcHJlb3JkZXIgPSByZXF1aXJlKFwiLi4vZ3JhcGhsaWJcIikuYWxnLnByZW9yZGVyO1xudmFyIHBvc3RvcmRlciA9IHJlcXVpcmUoXCIuLi9ncmFwaGxpYlwiKS5hbGcucG9zdG9yZGVyO1xudmFyIHNpbXBsaWZ5ID0gcmVxdWlyZShcIi4uL3V0aWxcIikuc2ltcGxpZnk7XG5cbm1vZHVsZS5leHBvcnRzID0gbmV0d29ya1NpbXBsZXg7XG5cbi8vIEV4cG9zZSBzb21lIGludGVybmFscyBmb3IgdGVzdGluZyBwdXJwb3Nlc1xubmV0d29ya1NpbXBsZXguaW5pdExvd0xpbVZhbHVlcyA9IGluaXRMb3dMaW1WYWx1ZXM7XG5uZXR3b3JrU2ltcGxleC5pbml0Q3V0VmFsdWVzID0gaW5pdEN1dFZhbHVlcztcbm5ldHdvcmtTaW1wbGV4LmNhbGNDdXRWYWx1ZSA9IGNhbGNDdXRWYWx1ZTtcbm5ldHdvcmtTaW1wbGV4LmxlYXZlRWRnZSA9IGxlYXZlRWRnZTtcbm5ldHdvcmtTaW1wbGV4LmVudGVyRWRnZSA9IGVudGVyRWRnZTtcbm5ldHdvcmtTaW1wbGV4LmV4Y2hhbmdlRWRnZXMgPSBleGNoYW5nZUVkZ2VzO1xuXG4vKlxuICogVGhlIG5ldHdvcmsgc2ltcGxleCBhbGdvcml0aG0gYXNzaWducyByYW5rcyB0byBlYWNoIG5vZGUgaW4gdGhlIGlucHV0IGdyYXBoXG4gKiBhbmQgaXRlcmF0aXZlbHkgaW1wcm92ZXMgdGhlIHJhbmtpbmcgdG8gcmVkdWNlIHRoZSBsZW5ndGggb2YgZWRnZXMuXG4gKlxuICogUHJlY29uZGl0aW9uczpcbiAqXG4gKiAgICAxLiBUaGUgaW5wdXQgZ3JhcGggbXVzdCBiZSBhIERBRy5cbiAqICAgIDIuIEFsbCBub2RlcyBpbiB0aGUgZ3JhcGggbXVzdCBoYXZlIGFuIG9iamVjdCB2YWx1ZS5cbiAqICAgIDMuIEFsbCBlZGdlcyBpbiB0aGUgZ3JhcGggbXVzdCBoYXZlIFwibWlubGVuXCIgYW5kIFwid2VpZ2h0XCIgYXR0cmlidXRlcy5cbiAqXG4gKiBQb3N0Y29uZGl0aW9uczpcbiAqXG4gKiAgICAxLiBBbGwgbm9kZXMgaW4gdGhlIGdyYXBoIHdpbGwgaGF2ZSBhbiBhc3NpZ25lZCBcInJhbmtcIiBhdHRyaWJ1dGUgdGhhdCBoYXNcbiAqICAgICAgIGJlZW4gb3B0aW1pemVkIGJ5IHRoZSBuZXR3b3JrIHNpbXBsZXggYWxnb3JpdGhtLiBSYW5rcyBzdGFydCBhdCAwLlxuICpcbiAqXG4gKiBBIHJvdWdoIHNrZXRjaCBvZiB0aGUgYWxnb3JpdGhtIGlzIGFzIGZvbGxvd3M6XG4gKlxuICogICAgMS4gQXNzaWduIGluaXRpYWwgcmFua3MgdG8gZWFjaCBub2RlLiBXZSB1c2UgdGhlIGxvbmdlc3QgcGF0aCBhbGdvcml0aG0sXG4gKiAgICAgICB3aGljaCBhc3NpZ25zIHJhbmtzIHRvIHRoZSBsb3dlc3QgcG9zaXRpb24gcG9zc2libGUuIEluIGdlbmVyYWwgdGhpc1xuICogICAgICAgbGVhZHMgdG8gdmVyeSB3aWRlIGJvdHRvbSByYW5rcyBhbmQgdW5uZWNlc3NhcmlseSBsb25nIGVkZ2VzLlxuICogICAgMi4gQ29uc3RydWN0IGEgZmVhc2libGUgdGlnaHQgdHJlZS4gQSB0aWdodCB0cmVlIGlzIG9uZSBzdWNoIHRoYXQgYWxsXG4gKiAgICAgICBlZGdlcyBpbiB0aGUgdHJlZSBoYXZlIG5vIHNsYWNrIChkaWZmZXJlbmNlIGJldHdlZW4gbGVuZ3RoIG9mIGVkZ2VcbiAqICAgICAgIGFuZCBtaW5sZW4gZm9yIHRoZSBlZGdlKS4gVGhpcyBieSBpdHNlbGYgZ3JlYXRseSBpbXByb3ZlcyB0aGUgYXNzaWduZWRcbiAqICAgICAgIHJhbmtpbmdzIGJ5IHNob3J0aW5nIGVkZ2VzLlxuICogICAgMy4gSXRlcmF0aXZlbHkgZmluZCBlZGdlcyB0aGF0IGhhdmUgbmVnYXRpdmUgY3V0IHZhbHVlcy4gR2VuZXJhbGx5IGFcbiAqICAgICAgIG5lZ2F0aXZlIGN1dCB2YWx1ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgZWRnZSBjb3VsZCBiZSByZW1vdmVkIGFuZCBhIG5ld1xuICogICAgICAgdHJlZSBlZGdlIGNvdWxkIGJlIGFkZGVkIHRvIHByb2R1Y2UgYSBtb3JlIGNvbXBhY3QgZ3JhcGguXG4gKlxuICogTXVjaCBvZiB0aGUgYWxnb3JpdGhtcyBoZXJlIGFyZSBkZXJpdmVkIGZyb20gR2Fuc25lciwgZXQgYWwuLCBcIkEgVGVjaG5pcXVlXG4gKiBmb3IgRHJhd2luZyBEaXJlY3RlZCBHcmFwaHMuXCIgVGhlIHN0cnVjdHVyZSBvZiB0aGUgZmlsZSByb3VnaGx5IGZvbGxvd3MgdGhlXG4gKiBzdHJ1Y3R1cmUgb2YgdGhlIG92ZXJhbGwgYWxnb3JpdGhtLlxuICovXG5mdW5jdGlvbiBuZXR3b3JrU2ltcGxleChnKSB7XG4gIGcgPSBzaW1wbGlmeShnKTtcbiAgaW5pdFJhbmsoZyk7XG4gIHZhciB0ID0gZmVhc2libGVUcmVlKGcpO1xuICBpbml0TG93TGltVmFsdWVzKHQpO1xuICBpbml0Q3V0VmFsdWVzKHQsIGcpO1xuXG4gIHZhciBlLCBmO1xuICB3aGlsZSAoKGUgPSBsZWF2ZUVkZ2UodCkpKSB7XG4gICAgZiA9IGVudGVyRWRnZSh0LCBnLCBlKTtcbiAgICBleGNoYW5nZUVkZ2VzKHQsIGcsIGUsIGYpO1xuICB9XG59XG5cbi8qXG4gKiBJbml0aWFsaXplcyBjdXQgdmFsdWVzIGZvciBhbGwgZWRnZXMgaW4gdGhlIHRyZWUuXG4gKi9cbmZ1bmN0aW9uIGluaXRDdXRWYWx1ZXModCwgZykge1xuICB2YXIgdnMgPSBwb3N0b3JkZXIodCwgdC5ub2RlcygpKTtcbiAgdnMgPSB2cy5zbGljZSgwLCB2cy5sZW5ndGggLSAxKTtcbiAgXy5mb3JFYWNoKHZzLCBmdW5jdGlvbih2KSB7XG4gICAgYXNzaWduQ3V0VmFsdWUodCwgZywgdik7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBhc3NpZ25DdXRWYWx1ZSh0LCBnLCBjaGlsZCkge1xuICB2YXIgY2hpbGRMYWIgPSB0Lm5vZGUoY2hpbGQpO1xuICB2YXIgcGFyZW50ID0gY2hpbGRMYWIucGFyZW50O1xuICB0LmVkZ2UoY2hpbGQsIHBhcmVudCkuY3V0dmFsdWUgPSBjYWxjQ3V0VmFsdWUodCwgZywgY2hpbGQpO1xufVxuXG4vKlxuICogR2l2ZW4gdGhlIHRpZ2h0IHRyZWUsIGl0cyBncmFwaCwgYW5kIGEgY2hpbGQgaW4gdGhlIGdyYXBoIGNhbGN1bGF0ZSBhbmRcbiAqIHJldHVybiB0aGUgY3V0IHZhbHVlIGZvciB0aGUgZWRnZSBiZXR3ZWVuIHRoZSBjaGlsZCBhbmQgaXRzIHBhcmVudC5cbiAqL1xuZnVuY3Rpb24gY2FsY0N1dFZhbHVlKHQsIGcsIGNoaWxkKSB7XG4gIHZhciBjaGlsZExhYiA9IHQubm9kZShjaGlsZCk7XG4gIHZhciBwYXJlbnQgPSBjaGlsZExhYi5wYXJlbnQ7XG4gIC8vIFRydWUgaWYgdGhlIGNoaWxkIGlzIG9uIHRoZSB0YWlsIGVuZCBvZiB0aGUgZWRnZSBpbiB0aGUgZGlyZWN0ZWQgZ3JhcGhcbiAgdmFyIGNoaWxkSXNUYWlsID0gdHJ1ZTtcbiAgLy8gVGhlIGdyYXBoJ3MgdmlldyBvZiB0aGUgdHJlZSBlZGdlIHdlJ3JlIGluc3BlY3RpbmdcbiAgdmFyIGdyYXBoRWRnZSA9IGcuZWRnZShjaGlsZCwgcGFyZW50KTtcbiAgLy8gVGhlIGFjY3VtdWxhdGVkIGN1dCB2YWx1ZSBmb3IgdGhlIGVkZ2UgYmV0d2VlbiB0aGlzIG5vZGUgYW5kIGl0cyBwYXJlbnRcbiAgdmFyIGN1dFZhbHVlID0gMDtcblxuICBpZiAoIWdyYXBoRWRnZSkge1xuICAgIGNoaWxkSXNUYWlsID0gZmFsc2U7XG4gICAgZ3JhcGhFZGdlID0gZy5lZGdlKHBhcmVudCwgY2hpbGQpO1xuICB9XG5cbiAgY3V0VmFsdWUgPSBncmFwaEVkZ2Uud2VpZ2h0O1xuXG4gIF8uZm9yRWFjaChnLm5vZGVFZGdlcyhjaGlsZCksIGZ1bmN0aW9uKGUpIHtcbiAgICB2YXIgaXNPdXRFZGdlID0gZS52ID09PSBjaGlsZCxcbiAgICAgIG90aGVyID0gaXNPdXRFZGdlID8gZS53IDogZS52O1xuXG4gICAgaWYgKG90aGVyICE9PSBwYXJlbnQpIHtcbiAgICAgIHZhciBwb2ludHNUb0hlYWQgPSBpc091dEVkZ2UgPT09IGNoaWxkSXNUYWlsLFxuICAgICAgICBvdGhlcldlaWdodCA9IGcuZWRnZShlKS53ZWlnaHQ7XG5cbiAgICAgIGN1dFZhbHVlICs9IHBvaW50c1RvSGVhZCA/IG90aGVyV2VpZ2h0IDogLW90aGVyV2VpZ2h0O1xuICAgICAgaWYgKGlzVHJlZUVkZ2UodCwgY2hpbGQsIG90aGVyKSkge1xuICAgICAgICB2YXIgb3RoZXJDdXRWYWx1ZSA9IHQuZWRnZShjaGlsZCwgb3RoZXIpLmN1dHZhbHVlO1xuICAgICAgICBjdXRWYWx1ZSArPSBwb2ludHNUb0hlYWQgPyAtb3RoZXJDdXRWYWx1ZSA6IG90aGVyQ3V0VmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gY3V0VmFsdWU7XG59XG5cbmZ1bmN0aW9uIGluaXRMb3dMaW1WYWx1ZXModHJlZSwgcm9vdCkge1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHtcbiAgICByb290ID0gdHJlZS5ub2RlcygpWzBdO1xuICB9XG4gIGRmc0Fzc2lnbkxvd0xpbSh0cmVlLCB7fSwgMSwgcm9vdCk7XG59XG5cbmZ1bmN0aW9uIGRmc0Fzc2lnbkxvd0xpbSh0cmVlLCB2aXNpdGVkLCBuZXh0TGltLCB2LCBwYXJlbnQpIHtcbiAgdmFyIGxvdyA9IG5leHRMaW07XG4gIHZhciBsYWJlbCA9IHRyZWUubm9kZSh2KTtcblxuICB2aXNpdGVkW3ZdID0gdHJ1ZTtcbiAgXy5mb3JFYWNoKHRyZWUubmVpZ2hib3JzKHYpLCBmdW5jdGlvbih3KSB7XG4gICAgaWYgKCFfLmhhcyh2aXNpdGVkLCB3KSkge1xuICAgICAgbmV4dExpbSA9IGRmc0Fzc2lnbkxvd0xpbSh0cmVlLCB2aXNpdGVkLCBuZXh0TGltLCB3LCB2KTtcbiAgICB9XG4gIH0pO1xuXG4gIGxhYmVsLmxvdyA9IGxvdztcbiAgbGFiZWwubGltID0gbmV4dExpbSsrO1xuICBpZiAocGFyZW50KSB7XG4gICAgbGFiZWwucGFyZW50ID0gcGFyZW50O1xuICB9IGVsc2Uge1xuICAgIC8vIFRPRE8gc2hvdWxkIGJlIGFibGUgdG8gcmVtb3ZlIHRoaXMgd2hlbiB3ZSBpbmNyZW1lbnRhbGx5IHVwZGF0ZSBsb3cgbGltXG4gICAgZGVsZXRlIGxhYmVsLnBhcmVudDtcbiAgfVxuXG4gIHJldHVybiBuZXh0TGltO1xufVxuXG5mdW5jdGlvbiBsZWF2ZUVkZ2UodHJlZSkge1xuICByZXR1cm4gXy5maW5kKHRyZWUuZWRnZXMoKSwgZnVuY3Rpb24oZSkge1xuICAgIHJldHVybiB0cmVlLmVkZ2UoZSkuY3V0dmFsdWUgPCAwO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZW50ZXJFZGdlKHQsIGcsIGVkZ2UpIHtcbiAgdmFyIHYgPSBlZGdlLnY7XG4gIHZhciB3ID0gZWRnZS53O1xuXG4gIC8vIEZvciB0aGUgcmVzdCBvZiB0aGlzIGZ1bmN0aW9uIHdlIGFzc3VtZSB0aGF0IHYgaXMgdGhlIHRhaWwgYW5kIHcgaXMgdGhlXG4gIC8vIGhlYWQsIHNvIGlmIHdlIGRvbid0IGhhdmUgdGhpcyBlZGdlIGluIHRoZSBncmFwaCB3ZSBzaG91bGQgZmxpcCBpdCB0b1xuICAvLyBtYXRjaCB0aGUgY29ycmVjdCBvcmllbnRhdGlvbi5cbiAgaWYgKCFnLmhhc0VkZ2UodiwgdykpIHtcbiAgICB2ID0gZWRnZS53O1xuICAgIHcgPSBlZGdlLnY7XG4gIH1cblxuICB2YXIgdkxhYmVsID0gdC5ub2RlKHYpO1xuICB2YXIgd0xhYmVsID0gdC5ub2RlKHcpO1xuICB2YXIgdGFpbExhYmVsID0gdkxhYmVsO1xuICB2YXIgZmxpcCA9IGZhbHNlO1xuXG4gIC8vIElmIHRoZSByb290IGlzIGluIHRoZSB0YWlsIG9mIHRoZSBlZGdlIHRoZW4gd2UgbmVlZCB0byBmbGlwIHRoZSBsb2dpYyB0aGF0XG4gIC8vIGNoZWNrcyBmb3IgdGhlIGhlYWQgYW5kIHRhaWwgbm9kZXMgaW4gdGhlIGNhbmRpZGF0ZXMgZnVuY3Rpb24gYmVsb3cuXG4gIGlmICh2TGFiZWwubGltID4gd0xhYmVsLmxpbSkge1xuICAgIHRhaWxMYWJlbCA9IHdMYWJlbDtcbiAgICBmbGlwID0gdHJ1ZTtcbiAgfVxuXG4gIHZhciBjYW5kaWRhdGVzID0gXy5maWx0ZXIoZy5lZGdlcygpLCBmdW5jdGlvbihlZGdlKSB7XG4gICAgcmV0dXJuIGZsaXAgPT09IGlzRGVzY2VuZGFudCh0LCB0Lm5vZGUoZWRnZS52KSwgdGFpbExhYmVsKSAmJlxuICAgICAgICAgICBmbGlwICE9PSBpc0Rlc2NlbmRhbnQodCwgdC5ub2RlKGVkZ2UudyksIHRhaWxMYWJlbCk7XG4gIH0pO1xuXG4gIHJldHVybiBfLm1pbkJ5KGNhbmRpZGF0ZXMsIGZ1bmN0aW9uKGVkZ2UpIHsgcmV0dXJuIHNsYWNrKGcsIGVkZ2UpOyB9KTtcbn1cblxuZnVuY3Rpb24gZXhjaGFuZ2VFZGdlcyh0LCBnLCBlLCBmKSB7XG4gIHZhciB2ID0gZS52O1xuICB2YXIgdyA9IGUudztcbiAgdC5yZW1vdmVFZGdlKHYsIHcpO1xuICB0LnNldEVkZ2UoZi52LCBmLncsIHt9KTtcbiAgaW5pdExvd0xpbVZhbHVlcyh0KTtcbiAgaW5pdEN1dFZhbHVlcyh0LCBnKTtcbiAgdXBkYXRlUmFua3ModCwgZyk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVJhbmtzKHQsIGcpIHtcbiAgdmFyIHJvb3QgPSBfLmZpbmQodC5ub2RlcygpLCBmdW5jdGlvbih2KSB7IHJldHVybiAhZy5ub2RlKHYpLnBhcmVudDsgfSk7XG4gIHZhciB2cyA9IHByZW9yZGVyKHQsIHJvb3QpO1xuICB2cyA9IHZzLnNsaWNlKDEpO1xuICBfLmZvckVhY2godnMsIGZ1bmN0aW9uKHYpIHtcbiAgICB2YXIgcGFyZW50ID0gdC5ub2RlKHYpLnBhcmVudCxcbiAgICAgIGVkZ2UgPSBnLmVkZ2UodiwgcGFyZW50KSxcbiAgICAgIGZsaXBwZWQgPSBmYWxzZTtcblxuICAgIGlmICghZWRnZSkge1xuICAgICAgZWRnZSA9IGcuZWRnZShwYXJlbnQsIHYpO1xuICAgICAgZmxpcHBlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgZy5ub2RlKHYpLnJhbmsgPSBnLm5vZGUocGFyZW50KS5yYW5rICsgKGZsaXBwZWQgPyBlZGdlLm1pbmxlbiA6IC1lZGdlLm1pbmxlbik7XG4gIH0pO1xufVxuXG4vKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBlZGdlIGlzIGluIHRoZSB0cmVlLlxuICovXG5mdW5jdGlvbiBpc1RyZWVFZGdlKHRyZWUsIHUsIHYpIHtcbiAgcmV0dXJuIHRyZWUuaGFzRWRnZSh1LCB2KTtcbn1cblxuLypcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIG5vZGUgaXMgZGVzY2VuZGFudCBvZiB0aGUgcm9vdCBub2RlIHBlciB0aGVcbiAqIGFzc2lnbmVkIGxvdyBhbmQgbGltIGF0dHJpYnV0ZXMgaW4gdGhlIHRyZWUuXG4gKi9cbmZ1bmN0aW9uIGlzRGVzY2VuZGFudCh0cmVlLCB2TGFiZWwsIHJvb3RMYWJlbCkge1xuICByZXR1cm4gcm9vdExhYmVsLmxvdyA8PSB2TGFiZWwubGltICYmIHZMYWJlbC5saW0gPD0gcm9vdExhYmVsLmxpbTtcbn1cbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///479\n')},function(module,exports,__webpack_require__){eval("var _ = __webpack_require__(28);\n\nmodule.exports = parentDummyChains;\n\nfunction parentDummyChains(g) {\n var postorderNums = postorder(g);\n\n _.forEach(g.graph().dummyChains, function(v) {\n var node = g.node(v);\n var edgeObj = node.edgeObj;\n var pathData = findPath(g, postorderNums, edgeObj.v, edgeObj.w);\n var path = pathData.path;\n var lca = pathData.lca;\n var pathIdx = 0;\n var pathV = path[pathIdx];\n var ascending = true;\n\n while (v !== edgeObj.w) {\n node = g.node(v);\n\n if (ascending) {\n while ((pathV = path[pathIdx]) !== lca &&\n g.node(pathV).maxRank < node.rank) {\n pathIdx++;\n }\n\n if (pathV === lca) {\n ascending = false;\n }\n }\n\n if (!ascending) {\n while (pathIdx < path.length - 1 &&\n g.node(pathV = path[pathIdx + 1]).minRank <= node.rank) {\n pathIdx++;\n }\n pathV = path[pathIdx];\n }\n\n g.setParent(v, pathV);\n v = g.successors(v)[0];\n }\n });\n}\n\n// Find a path from v to w through the lowest common ancestor (LCA). Return the\n// full path and the LCA.\nfunction findPath(g, postorderNums, v, w) {\n var vPath = [];\n var wPath = [];\n var low = Math.min(postorderNums[v].low, postorderNums[w].low);\n var lim = Math.max(postorderNums[v].lim, postorderNums[w].lim);\n var parent;\n var lca;\n\n // Traverse up from v to find the LCA\n parent = v;\n do {\n parent = g.parent(parent);\n vPath.push(parent);\n } while (parent &&\n (postorderNums[parent].low > low || lim > postorderNums[parent].lim));\n lca = parent;\n\n // Traverse from w to LCA\n parent = w;\n while ((parent = g.parent(parent)) !== lca) {\n wPath.push(parent);\n }\n\n return { path: vPath.concat(wPath.reverse()), lca: lca };\n}\n\nfunction postorder(g) {\n var result = {};\n var lim = 0;\n\n function dfs(v) {\n var low = lim;\n _.forEach(g.children(v), dfs);\n result[v] = { low: low, lim: lim++ };\n }\n _.forEach(g.children(), dfs);\n\n return result;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZGFncmVqcy9saWIvcGFyZW50LWR1bW15LWNoYWlucy5qcz9mYmNhIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFFBQVEsbUJBQU8sQ0FBQyxFQUFVOztBQUUxQjs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxVQUFVO0FBQ1Y7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBOztBQUVBO0FBQ0EiLCJmaWxlIjoiNDgwLmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIF8gPSByZXF1aXJlKFwiLi9sb2Rhc2hcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyZW50RHVtbXlDaGFpbnM7XG5cbmZ1bmN0aW9uIHBhcmVudER1bW15Q2hhaW5zKGcpIHtcbiAgdmFyIHBvc3RvcmRlck51bXMgPSBwb3N0b3JkZXIoZyk7XG5cbiAgXy5mb3JFYWNoKGcuZ3JhcGgoKS5kdW1teUNoYWlucywgZnVuY3Rpb24odikge1xuICAgIHZhciBub2RlID0gZy5ub2RlKHYpO1xuICAgIHZhciBlZGdlT2JqID0gbm9kZS5lZGdlT2JqO1xuICAgIHZhciBwYXRoRGF0YSA9IGZpbmRQYXRoKGcsIHBvc3RvcmRlck51bXMsIGVkZ2VPYmoudiwgZWRnZU9iai53KTtcbiAgICB2YXIgcGF0aCA9IHBhdGhEYXRhLnBhdGg7XG4gICAgdmFyIGxjYSA9IHBhdGhEYXRhLmxjYTtcbiAgICB2YXIgcGF0aElkeCA9IDA7XG4gICAgdmFyIHBhdGhWID0gcGF0aFtwYXRoSWR4XTtcbiAgICB2YXIgYXNjZW5kaW5nID0gdHJ1ZTtcblxuICAgIHdoaWxlICh2ICE9PSBlZGdlT2JqLncpIHtcbiAgICAgIG5vZGUgPSBnLm5vZGUodik7XG5cbiAgICAgIGlmIChhc2NlbmRpbmcpIHtcbiAgICAgICAgd2hpbGUgKChwYXRoViA9IHBhdGhbcGF0aElkeF0pICE9PSBsY2EgJiZcbiAgICAgICAgICAgICAgIGcubm9kZShwYXRoVikubWF4UmFuayA8IG5vZGUucmFuaykge1xuICAgICAgICAgIHBhdGhJZHgrKztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXRoViA9PT0gbGNhKSB7XG4gICAgICAgICAgYXNjZW5kaW5nID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCFhc2NlbmRpbmcpIHtcbiAgICAgICAgd2hpbGUgKHBhdGhJZHggPCBwYXRoLmxlbmd0aCAtIDEgJiZcbiAgICAgICAgICAgICAgIGcubm9kZShwYXRoViA9IHBhdGhbcGF0aElkeCArIDFdKS5taW5SYW5rIDw9IG5vZGUucmFuaykge1xuICAgICAgICAgIHBhdGhJZHgrKztcbiAgICAgICAgfVxuICAgICAgICBwYXRoViA9IHBhdGhbcGF0aElkeF07XG4gICAgICB9XG5cbiAgICAgIGcuc2V0UGFyZW50KHYsIHBhdGhWKTtcbiAgICAgIHYgPSBnLnN1Y2Nlc3NvcnModilbMF07XG4gICAgfVxuICB9KTtcbn1cblxuLy8gRmluZCBhIHBhdGggZnJvbSB2IHRvIHcgdGhyb3VnaCB0aGUgbG93ZXN0IGNvbW1vbiBhbmNlc3RvciAoTENBKS4gUmV0dXJuIHRoZVxuLy8gZnVsbCBwYXRoIGFuZCB0aGUgTENBLlxuZnVuY3Rpb24gZmluZFBhdGgoZywgcG9zdG9yZGVyTnVtcywgdiwgdykge1xuICB2YXIgdlBhdGggPSBbXTtcbiAgdmFyIHdQYXRoID0gW107XG4gIHZhciBsb3cgPSBNYXRoLm1pbihwb3N0b3JkZXJOdW1zW3ZdLmxvdywgcG9zdG9yZGVyTnVtc1t3XS5sb3cpO1xuICB2YXIgbGltID0gTWF0aC5tYXgocG9zdG9yZGVyTnVtc1t2XS5saW0sIHBvc3RvcmRlck51bXNbd10ubGltKTtcbiAgdmFyIHBhcmVudDtcbiAgdmFyIGxjYTtcblxuICAvLyBUcmF2ZXJzZSB1cCBmcm9tIHYgdG8gZmluZCB0aGUgTENBXG4gIHBhcmVudCA9IHY7XG4gIGRvIHtcbiAgICBwYXJlbnQgPSBnLnBhcmVudChwYXJlbnQpO1xuICAgIHZQYXRoLnB1c2gocGFyZW50KTtcbiAgfSB3aGlsZSAocGFyZW50ICYmXG4gICAgICAgICAgIChwb3N0b3JkZXJOdW1zW3BhcmVudF0ubG93ID4gbG93IHx8IGxpbSA+IHBvc3RvcmRlck51bXNbcGFyZW50XS5saW0pKTtcbiAgbGNhID0gcGFyZW50O1xuXG4gIC8vIFRyYXZlcnNlIGZyb20gdyB0byBMQ0FcbiAgcGFyZW50ID0gdztcbiAgd2hpbGUgKChwYXJlbnQgPSBnLnBhcmVudChwYXJlbnQpKSAhPT0gbGNhKSB7XG4gICAgd1BhdGgucHVzaChwYXJlbnQpO1xuICB9XG5cbiAgcmV0dXJuIHsgcGF0aDogdlBhdGguY29uY2F0KHdQYXRoLnJldmVyc2UoKSksIGxjYTogbGNhIH07XG59XG5cbmZ1bmN0aW9uIHBvc3RvcmRlcihnKSB7XG4gIHZhciByZXN1bHQgPSB7fTtcbiAgdmFyIGxpbSA9IDA7XG5cbiAgZnVuY3Rpb24gZGZzKHYpIHtcbiAgICB2YXIgbG93ID0gbGltO1xuICAgIF8uZm9yRWFjaChnLmNoaWxkcmVuKHYpLCBkZnMpO1xuICAgIHJlc3VsdFt2XSA9IHsgbG93OiBsb3csIGxpbTogbGltKysgfTtcbiAgfVxuICBfLmZvckVhY2goZy5jaGlsZHJlbigpLCBkZnMpO1xuXG4gIHJldHVybiByZXN1bHQ7XG59XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///480\n")},function(module,exports,__webpack_require__){eval('var _ = __webpack_require__(28);\nvar util = __webpack_require__(36);\n\nmodule.exports = {\n run: run,\n cleanup: cleanup\n};\n\n/*\n * A nesting graph creates dummy nodes for the tops and bottoms of subgraphs,\n * adds appropriate edges to ensure that all cluster nodes are placed between\n * these boundries, and ensures that the graph is connected.\n *\n * In addition we ensure, through the use of the minlen property, that nodes\n * and subgraph border nodes to not end up on the same rank.\n *\n * Preconditions:\n *\n * 1. Input graph is a DAG\n * 2. Nodes in the input graph has a minlen attribute\n *\n * Postconditions:\n *\n * 1. Input graph is connected.\n * 2. Dummy nodes are added for the tops and bottoms of subgraphs.\n * 3. The minlen attribute for nodes is adjusted to ensure nodes do not\n * get placed on the same rank as subgraph border nodes.\n *\n * The nesting graph idea comes from Sander, "Layout of Compound Directed\n * Graphs."\n */\nfunction run(g) {\n var root = util.addDummyNode(g, "root", {}, "_root");\n var depths = treeDepths(g);\n var height = _.max(_.values(depths)) - 1; // Note: depths is an Object not an array\n var nodeSep = 2 * height + 1;\n\n g.graph().nestingRoot = root;\n\n // Multiply minlen by nodeSep to align nodes on non-border ranks.\n _.forEach(g.edges(), function(e) { g.edge(e).minlen *= nodeSep; });\n\n // Calculate a weight that is sufficient to keep subgraphs vertically compact\n var weight = sumWeights(g) + 1;\n\n // Create border nodes and link them up\n _.forEach(g.children(), function(child) {\n dfs(g, root, nodeSep, weight, height, depths, child);\n });\n\n // Save the multiplier for node layers for later removal of empty border\n // layers.\n g.graph().nodeRankFactor = nodeSep;\n}\n\nfunction dfs(g, root, nodeSep, weight, height, depths, v) {\n var children = g.children(v);\n if (!children.length) {\n if (v !== root) {\n g.setEdge(root, v, { weight: 0, minlen: nodeSep });\n }\n return;\n }\n\n var top = util.addBorderNode(g, "_bt");\n var bottom = util.addBorderNode(g, "_bb");\n var label = g.node(v);\n\n g.setParent(top, v);\n label.borderTop = top;\n g.setParent(bottom, v);\n label.borderBottom = bottom;\n\n _.forEach(children, function(child) {\n dfs(g, root, nodeSep, weight, height, depths, child);\n\n var childNode = g.node(child);\n var childTop = childNode.borderTop ? childNode.borderTop : child;\n var childBottom = childNode.borderBottom ? childNode.borderBottom : child;\n var thisWeight = childNode.borderTop ? weight : 2 * weight;\n var minlen = childTop !== childBottom ? 1 : height - depths[v] + 1;\n\n g.setEdge(top, childTop, {\n weight: thisWeight,\n minlen: minlen,\n nestingEdge: true\n });\n\n g.setEdge(childBottom, bottom, {\n weight: thisWeight,\n minlen: minlen,\n nestingEdge: true\n });\n });\n\n if (!g.parent(v)) {\n g.setEdge(root, top, { weight: 0, minlen: height + depths[v] });\n }\n}\n\nfunction treeDepths(g) {\n var depths = {};\n function dfs(v, depth) {\n var children = g.children(v);\n if (children && children.length) {\n _.forEach(children, function(child) {\n dfs(child, depth + 1);\n });\n }\n depths[v] = depth;\n }\n _.forEach(g.children(), function(v) { dfs(v, 1); });\n return depths;\n}\n\nfunction sumWeights(g) {\n return _.reduce(g.edges(), function(acc, e) {\n return acc + g.edge(e).weight;\n }, 0);\n}\n\nfunction cleanup(g) {\n var graphLabel = g.graph();\n g.removeNode(graphLabel.nestingRoot);\n delete graphLabel.nestingRoot;\n _.forEach(g.edges(), function(e) {\n var edge = g.edge(e);\n if (edge.nestingEdge) {\n g.removeEdge(e);\n }\n });\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZGFncmVqcy9saWIvbmVzdGluZy1ncmFwaC5qcz84MjNhIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFFBQVEsbUJBQU8sQ0FBQyxFQUFVO0FBQzFCLFdBQVcsbUJBQU8sQ0FBQyxFQUFROztBQUUzQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEM7QUFDNUM7QUFDQSwyQ0FBMkM7QUFDM0M7O0FBRUE7O0FBRUE7QUFDQSxvQ0FBb0MsNkJBQTZCLEVBQUU7O0FBRW5FO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQiw2QkFBNkI7QUFDdkQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7O0FBRUg7QUFDQSwwQkFBMEIsd0NBQXdDO0FBQ2xFO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDLFdBQVcsRUFBRTtBQUNwRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0giLCJmaWxlIjoiNDgxLmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIF8gPSByZXF1aXJlKFwiLi9sb2Rhc2hcIik7XG52YXIgdXRpbCA9IHJlcXVpcmUoXCIuL3V0aWxcIik7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBydW46IHJ1bixcbiAgY2xlYW51cDogY2xlYW51cFxufTtcblxuLypcbiAqIEEgbmVzdGluZyBncmFwaCBjcmVhdGVzIGR1bW15IG5vZGVzIGZvciB0aGUgdG9wcyBhbmQgYm90dG9tcyBvZiBzdWJncmFwaHMsXG4gKiBhZGRzIGFwcHJvcHJpYXRlIGVkZ2VzIHRvIGVuc3VyZSB0aGF0IGFsbCBjbHVzdGVyIG5vZGVzIGFyZSBwbGFjZWQgYmV0d2VlblxuICogdGhlc2UgYm91bmRyaWVzLCBhbmQgZW5zdXJlcyB0aGF0IHRoZSBncmFwaCBpcyBjb25uZWN0ZWQuXG4gKlxuICogSW4gYWRkaXRpb24gd2UgZW5zdXJlLCB0aHJvdWdoIHRoZSB1c2Ugb2YgdGhlIG1pbmxlbiBwcm9wZXJ0eSwgdGhhdCBub2Rlc1xuICogYW5kIHN1YmdyYXBoIGJvcmRlciBub2RlcyB0byBub3QgZW5kIHVwIG9uIHRoZSBzYW1lIHJhbmsuXG4gKlxuICogUHJlY29uZGl0aW9uczpcbiAqXG4gKiAgICAxLiBJbnB1dCBncmFwaCBpcyBhIERBR1xuICogICAgMi4gTm9kZXMgaW4gdGhlIGlucHV0IGdyYXBoIGhhcyBhIG1pbmxlbiBhdHRyaWJ1dGVcbiAqXG4gKiBQb3N0Y29uZGl0aW9uczpcbiAqXG4gKiAgICAxLiBJbnB1dCBncmFwaCBpcyBjb25uZWN0ZWQuXG4gKiAgICAyLiBEdW1teSBub2RlcyBhcmUgYWRkZWQgZm9yIHRoZSB0b3BzIGFuZCBib3R0b21zIG9mIHN1YmdyYXBocy5cbiAqICAgIDMuIFRoZSBtaW5sZW4gYXR0cmlidXRlIGZvciBub2RlcyBpcyBhZGp1c3RlZCB0byBlbnN1cmUgbm9kZXMgZG8gbm90XG4gKiAgICAgICBnZXQgcGxhY2VkIG9uIHRoZSBzYW1lIHJhbmsgYXMgc3ViZ3JhcGggYm9yZGVyIG5vZGVzLlxuICpcbiAqIFRoZSBuZXN0aW5nIGdyYXBoIGlkZWEgY29tZXMgZnJvbSBTYW5kZXIsIFwiTGF5b3V0IG9mIENvbXBvdW5kIERpcmVjdGVkXG4gKiBHcmFwaHMuXCJcbiAqL1xuZnVuY3Rpb24gcnVuKGcpIHtcbiAgdmFyIHJvb3QgPSB1dGlsLmFkZER1bW15Tm9kZShnLCBcInJvb3RcIiwge30sIFwiX3Jvb3RcIik7XG4gIHZhciBkZXB0aHMgPSB0cmVlRGVwdGhzKGcpO1xuICB2YXIgaGVpZ2h0ID0gXy5tYXgoXy52YWx1ZXMoZGVwdGhzKSkgLSAxOyAvLyBOb3RlOiBkZXB0aHMgaXMgYW4gT2JqZWN0IG5vdCBhbiBhcnJheVxuICB2YXIgbm9kZVNlcCA9IDIgKiBoZWlnaHQgKyAxO1xuXG4gIGcuZ3JhcGgoKS5uZXN0aW5nUm9vdCA9IHJvb3Q7XG5cbiAgLy8gTXVsdGlwbHkgbWlubGVuIGJ5IG5vZGVTZXAgdG8gYWxpZ24gbm9kZXMgb24gbm9uLWJvcmRlciByYW5rcy5cbiAgXy5mb3JFYWNoKGcuZWRnZXMoKSwgZnVuY3Rpb24oZSkgeyBnLmVkZ2UoZSkubWlubGVuICo9IG5vZGVTZXA7IH0pO1xuXG4gIC8vIENhbGN1bGF0ZSBhIHdlaWdodCB0aGF0IGlzIHN1ZmZpY2llbnQgdG8ga2VlcCBzdWJncmFwaHMgdmVydGljYWxseSBjb21wYWN0XG4gIHZhciB3ZWlnaHQgPSBzdW1XZWlnaHRzKGcpICsgMTtcblxuICAvLyBDcmVhdGUgYm9yZGVyIG5vZGVzIGFuZCBsaW5rIHRoZW0gdXBcbiAgXy5mb3JFYWNoKGcuY2hpbGRyZW4oKSwgZnVuY3Rpb24oY2hpbGQpIHtcbiAgICBkZnMoZywgcm9vdCwgbm9kZVNlcCwgd2VpZ2h0LCBoZWlnaHQsIGRlcHRocywgY2hpbGQpO1xuICB9KTtcblxuICAvLyBTYXZlIHRoZSBtdWx0aXBsaWVyIGZvciBub2RlIGxheWVycyBmb3IgbGF0ZXIgcmVtb3ZhbCBvZiBlbXB0eSBib3JkZXJcbiAgLy8gbGF5ZXJzLlxuICBnLmdyYXBoKCkubm9kZVJhbmtGYWN0b3IgPSBub2RlU2VwO1xufVxuXG5mdW5jdGlvbiBkZnMoZywgcm9vdCwgbm9kZVNlcCwgd2VpZ2h0LCBoZWlnaHQsIGRlcHRocywgdikge1xuICB2YXIgY2hpbGRyZW4gPSBnLmNoaWxkcmVuKHYpO1xuICBpZiAoIWNoaWxkcmVuLmxlbmd0aCkge1xuICAgIGlmICh2ICE9PSByb290KSB7XG4gICAgICBnLnNldEVkZ2Uocm9vdCwgdiwgeyB3ZWlnaHQ6IDAsIG1pbmxlbjogbm9kZVNlcCB9KTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIHRvcCA9IHV0aWwuYWRkQm9yZGVyTm9kZShnLCBcIl9idFwiKTtcbiAgdmFyIGJvdHRvbSA9IHV0aWwuYWRkQm9yZGVyTm9kZShnLCBcIl9iYlwiKTtcbiAgdmFyIGxhYmVsID0gZy5ub2RlKHYpO1xuXG4gIGcuc2V0UGFyZW50KHRvcCwgdik7XG4gIGxhYmVsLmJvcmRlclRvcCA9IHRvcDtcbiAgZy5zZXRQYXJlbnQoYm90dG9tLCB2KTtcbiAgbGFiZWwuYm9yZGVyQm90dG9tID0gYm90dG9tO1xuXG4gIF8uZm9yRWFjaChjaGlsZHJlbiwgZnVuY3Rpb24oY2hpbGQpIHtcbiAgICBkZnMoZywgcm9vdCwgbm9kZVNlcCwgd2VpZ2h0LCBoZWlnaHQsIGRlcHRocywgY2hpbGQpO1xuXG4gICAgdmFyIGNoaWxkTm9kZSA9IGcubm9kZShjaGlsZCk7XG4gICAgdmFyIGNoaWxkVG9wID0gY2hpbGROb2RlLmJvcmRlclRvcCA/IGNoaWxkTm9kZS5ib3JkZXJUb3AgOiBjaGlsZDtcbiAgICB2YXIgY2hpbGRCb3R0b20gPSBjaGlsZE5vZGUuYm9yZGVyQm90dG9tID8gY2hpbGROb2RlLmJvcmRlckJvdHRvbSA6IGNoaWxkO1xuICAgIHZhciB0aGlzV2VpZ2h0ID0gY2hpbGROb2RlLmJvcmRlclRvcCA/IHdlaWdodCA6IDIgKiB3ZWlnaHQ7XG4gICAgdmFyIG1pbmxlbiA9IGNoaWxkVG9wICE9PSBjaGlsZEJvdHRvbSA/IDEgOiBoZWlnaHQgLSBkZXB0aHNbdl0gKyAxO1xuXG4gICAgZy5zZXRFZGdlKHRvcCwgY2hpbGRUb3AsIHtcbiAgICAgIHdlaWdodDogdGhpc1dlaWdodCxcbiAgICAgIG1pbmxlbjogbWlubGVuLFxuICAgICAgbmVzdGluZ0VkZ2U6IHRydWVcbiAgICB9KTtcblxuICAgIGcuc2V0RWRnZShjaGlsZEJvdHRvbSwgYm90dG9tLCB7XG4gICAgICB3ZWlnaHQ6IHRoaXNXZWlnaHQsXG4gICAgICBtaW5sZW46IG1pbmxlbixcbiAgICAgIG5lc3RpbmdFZGdlOiB0cnVlXG4gICAgfSk7XG4gIH0pO1xuXG4gIGlmICghZy5wYXJlbnQodikpIHtcbiAgICBnLnNldEVkZ2Uocm9vdCwgdG9wLCB7IHdlaWdodDogMCwgbWlubGVuOiBoZWlnaHQgKyBkZXB0aHNbdl0gfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdHJlZURlcHRocyhnKSB7XG4gIHZhciBkZXB0aHMgPSB7fTtcbiAgZnVuY3Rpb24gZGZzKHYsIGRlcHRoKSB7XG4gICAgdmFyIGNoaWxkcmVuID0gZy5jaGlsZHJlbih2KTtcbiAgICBpZiAoY2hpbGRyZW4gJiYgY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICBfLmZvckVhY2goY2hpbGRyZW4sIGZ1bmN0aW9uKGNoaWxkKSB7XG4gICAgICAgIGRmcyhjaGlsZCwgZGVwdGggKyAxKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBkZXB0aHNbdl0gPSBkZXB0aDtcbiAgfVxuICBfLmZvckVhY2goZy5jaGlsZHJlbigpLCBmdW5jdGlvbih2KSB7IGRmcyh2LCAxKTsgfSk7XG4gIHJldHVybiBkZXB0aHM7XG59XG5cbmZ1bmN0aW9uIHN1bVdlaWdodHMoZykge1xuICByZXR1cm4gXy5yZWR1Y2UoZy5lZGdlcygpLCBmdW5jdGlvbihhY2MsIGUpIHtcbiAgICByZXR1cm4gYWNjICsgZy5lZGdlKGUpLndlaWdodDtcbiAgfSwgMCk7XG59XG5cbmZ1bmN0aW9uIGNsZWFudXAoZykge1xuICB2YXIgZ3JhcGhMYWJlbCA9IGcuZ3JhcGgoKTtcbiAgZy5yZW1vdmVOb2RlKGdyYXBoTGFiZWwubmVzdGluZ1Jvb3QpO1xuICBkZWxldGUgZ3JhcGhMYWJlbC5uZXN0aW5nUm9vdDtcbiAgXy5mb3JFYWNoKGcuZWRnZXMoKSwgZnVuY3Rpb24oZSkge1xuICAgIHZhciBlZGdlID0gZy5lZGdlKGUpO1xuICAgIGlmIChlZGdlLm5lc3RpbmdFZGdlKSB7XG4gICAgICBnLnJlbW92ZUVkZ2UoZSk7XG4gICAgfVxuICB9KTtcbn1cbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///481\n')},function(module,exports,__webpack_require__){eval('var _ = __webpack_require__(28);\nvar util = __webpack_require__(36);\n\nmodule.exports = addBorderSegments;\n\nfunction addBorderSegments(g) {\n function dfs(v) {\n var children = g.children(v);\n var node = g.node(v);\n if (children.length) {\n _.forEach(children, dfs);\n }\n\n if (_.has(node, "minRank")) {\n node.borderLeft = [];\n node.borderRight = [];\n for (var rank = node.minRank, maxRank = node.maxRank + 1;\n rank < maxRank;\n ++rank) {\n addBorderNode(g, "borderLeft", "_bl", v, node, rank);\n addBorderNode(g, "borderRight", "_br", v, node, rank);\n }\n }\n }\n\n _.forEach(g.children(), dfs);\n}\n\nfunction addBorderNode(g, prop, prefix, sg, sgNode, rank) {\n var label = { width: 0, height: 0, rank: rank, borderType: prop };\n var prev = sgNode[prop][rank - 1];\n var curr = util.addDummyNode(g, "border", label, prefix);\n sgNode[prop][rank] = curr;\n g.setParent(curr, sg);\n if (prev) {\n g.setEdge(prev, curr, { weight: 1 });\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZGFncmVqcy9saWIvYWRkLWJvcmRlci1zZWdtZW50cy5qcz9jNWFmIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFFBQVEsbUJBQU8sQ0FBQyxFQUFVO0FBQzFCLFdBQVcsbUJBQU8sQ0FBQyxFQUFROztBQUUzQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQixZQUFZO0FBQ3ZDO0FBQ0EiLCJmaWxlIjoiNDgyLmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIF8gPSByZXF1aXJlKFwiLi9sb2Rhc2hcIik7XG52YXIgdXRpbCA9IHJlcXVpcmUoXCIuL3V0aWxcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gYWRkQm9yZGVyU2VnbWVudHM7XG5cbmZ1bmN0aW9uIGFkZEJvcmRlclNlZ21lbnRzKGcpIHtcbiAgZnVuY3Rpb24gZGZzKHYpIHtcbiAgICB2YXIgY2hpbGRyZW4gPSBnLmNoaWxkcmVuKHYpO1xuICAgIHZhciBub2RlID0gZy5ub2RlKHYpO1xuICAgIGlmIChjaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgIF8uZm9yRWFjaChjaGlsZHJlbiwgZGZzKTtcbiAgICB9XG5cbiAgICBpZiAoXy5oYXMobm9kZSwgXCJtaW5SYW5rXCIpKSB7XG4gICAgICBub2RlLmJvcmRlckxlZnQgPSBbXTtcbiAgICAgIG5vZGUuYm9yZGVyUmlnaHQgPSBbXTtcbiAgICAgIGZvciAodmFyIHJhbmsgPSBub2RlLm1pblJhbmssIG1heFJhbmsgPSBub2RlLm1heFJhbmsgKyAxO1xuICAgICAgICByYW5rIDwgbWF4UmFuaztcbiAgICAgICAgKytyYW5rKSB7XG4gICAgICAgIGFkZEJvcmRlck5vZGUoZywgXCJib3JkZXJMZWZ0XCIsIFwiX2JsXCIsIHYsIG5vZGUsIHJhbmspO1xuICAgICAgICBhZGRCb3JkZXJOb2RlKGcsIFwiYm9yZGVyUmlnaHRcIiwgXCJfYnJcIiwgdiwgbm9kZSwgcmFuayk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgXy5mb3JFYWNoKGcuY2hpbGRyZW4oKSwgZGZzKTtcbn1cblxuZnVuY3Rpb24gYWRkQm9yZGVyTm9kZShnLCBwcm9wLCBwcmVmaXgsIHNnLCBzZ05vZGUsIHJhbmspIHtcbiAgdmFyIGxhYmVsID0geyB3aWR0aDogMCwgaGVpZ2h0OiAwLCByYW5rOiByYW5rLCBib3JkZXJUeXBlOiBwcm9wIH07XG4gIHZhciBwcmV2ID0gc2dOb2RlW3Byb3BdW3JhbmsgLSAxXTtcbiAgdmFyIGN1cnIgPSB1dGlsLmFkZER1bW15Tm9kZShnLCBcImJvcmRlclwiLCBsYWJlbCwgcHJlZml4KTtcbiAgc2dOb2RlW3Byb3BdW3JhbmtdID0gY3VycjtcbiAgZy5zZXRQYXJlbnQoY3Vyciwgc2cpO1xuICBpZiAocHJldikge1xuICAgIGcuc2V0RWRnZShwcmV2LCBjdXJyLCB7IHdlaWdodDogMSB9KTtcbiAgfVxufVxuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///482\n')},function(module,exports,__webpack_require__){"use strict";eval('\n\nvar _ = __webpack_require__(28);\n\nmodule.exports = {\n adjust: adjust,\n undo: undo\n};\n\nfunction adjust(g) {\n var rankDir = g.graph().rankdir.toLowerCase();\n if (rankDir === "lr" || rankDir === "rl") {\n swapWidthHeight(g);\n }\n}\n\nfunction undo(g) {\n var rankDir = g.graph().rankdir.toLowerCase();\n if (rankDir === "bt" || rankDir === "rl") {\n reverseY(g);\n }\n\n if (rankDir === "lr" || rankDir === "rl") {\n swapXY(g);\n swapWidthHeight(g);\n }\n}\n\nfunction swapWidthHeight(g) {\n _.forEach(g.nodes(), function(v) { swapWidthHeightOne(g.node(v)); });\n _.forEach(g.edges(), function(e) { swapWidthHeightOne(g.edge(e)); });\n}\n\nfunction swapWidthHeightOne(attrs) {\n var w = attrs.width;\n attrs.width = attrs.height;\n attrs.height = w;\n}\n\nfunction reverseY(g) {\n _.forEach(g.nodes(), function(v) { reverseYOne(g.node(v)); });\n\n _.forEach(g.edges(), function(e) {\n var edge = g.edge(e);\n _.forEach(edge.points, reverseYOne);\n if (_.has(edge, "y")) {\n reverseYOne(edge);\n }\n });\n}\n\nfunction reverseYOne(attrs) {\n attrs.y = -attrs.y;\n}\n\nfunction swapXY(g) {\n _.forEach(g.nodes(), function(v) { swapXYOne(g.node(v)); });\n\n _.forEach(g.edges(), function(e) {\n var edge = g.edge(e);\n _.forEach(edge.points, swapXYOne);\n if (_.has(edge, "x")) {\n swapXYOne(edge);\n }\n });\n}\n\nfunction swapXYOne(attrs) {\n var x = attrs.x;\n attrs.x = attrs.y;\n attrs.y = x;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZGFncmVqcy9saWIvY29vcmRpbmF0ZS1zeXN0ZW0uanM/ODhiMyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBYTs7QUFFYixRQUFRLG1CQUFPLENBQUMsRUFBVTs7QUFFMUI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG9DQUFvQywrQkFBK0IsRUFBRTtBQUNyRSxvQ0FBb0MsK0JBQStCLEVBQUU7QUFDckU7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG9DQUFvQyx3QkFBd0IsRUFBRTs7QUFFOUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG9DQUFvQyxzQkFBc0IsRUFBRTs7QUFFNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiNDgzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfID0gcmVxdWlyZShcIi4vbG9kYXNoXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgYWRqdXN0OiBhZGp1c3QsXG4gIHVuZG86IHVuZG9cbn07XG5cbmZ1bmN0aW9uIGFkanVzdChnKSB7XG4gIHZhciByYW5rRGlyID0gZy5ncmFwaCgpLnJhbmtkaXIudG9Mb3dlckNhc2UoKTtcbiAgaWYgKHJhbmtEaXIgPT09IFwibHJcIiB8fCByYW5rRGlyID09PSBcInJsXCIpIHtcbiAgICBzd2FwV2lkdGhIZWlnaHQoZyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdW5kbyhnKSB7XG4gIHZhciByYW5rRGlyID0gZy5ncmFwaCgpLnJhbmtkaXIudG9Mb3dlckNhc2UoKTtcbiAgaWYgKHJhbmtEaXIgPT09IFwiYnRcIiB8fCByYW5rRGlyID09PSBcInJsXCIpIHtcbiAgICByZXZlcnNlWShnKTtcbiAgfVxuXG4gIGlmIChyYW5rRGlyID09PSBcImxyXCIgfHwgcmFua0RpciA9PT0gXCJybFwiKSB7XG4gICAgc3dhcFhZKGcpO1xuICAgIHN3YXBXaWR0aEhlaWdodChnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzd2FwV2lkdGhIZWlnaHQoZykge1xuICBfLmZvckVhY2goZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7IHN3YXBXaWR0aEhlaWdodE9uZShnLm5vZGUodikpOyB9KTtcbiAgXy5mb3JFYWNoKGcuZWRnZXMoKSwgZnVuY3Rpb24oZSkgeyBzd2FwV2lkdGhIZWlnaHRPbmUoZy5lZGdlKGUpKTsgfSk7XG59XG5cbmZ1bmN0aW9uIHN3YXBXaWR0aEhlaWdodE9uZShhdHRycykge1xuICB2YXIgdyA9IGF0dHJzLndpZHRoO1xuICBhdHRycy53aWR0aCA9IGF0dHJzLmhlaWdodDtcbiAgYXR0cnMuaGVpZ2h0ID0gdztcbn1cblxuZnVuY3Rpb24gcmV2ZXJzZVkoZykge1xuICBfLmZvckVhY2goZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7IHJldmVyc2VZT25lKGcubm9kZSh2KSk7IH0pO1xuXG4gIF8uZm9yRWFjaChnLmVkZ2VzKCksIGZ1bmN0aW9uKGUpIHtcbiAgICB2YXIgZWRnZSA9IGcuZWRnZShlKTtcbiAgICBfLmZvckVhY2goZWRnZS5wb2ludHMsIHJldmVyc2VZT25lKTtcbiAgICBpZiAoXy5oYXMoZWRnZSwgXCJ5XCIpKSB7XG4gICAgICByZXZlcnNlWU9uZShlZGdlKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZXZlcnNlWU9uZShhdHRycykge1xuICBhdHRycy55ID0gLWF0dHJzLnk7XG59XG5cbmZ1bmN0aW9uIHN3YXBYWShnKSB7XG4gIF8uZm9yRWFjaChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHsgc3dhcFhZT25lKGcubm9kZSh2KSk7IH0pO1xuXG4gIF8uZm9yRWFjaChnLmVkZ2VzKCksIGZ1bmN0aW9uKGUpIHtcbiAgICB2YXIgZWRnZSA9IGcuZWRnZShlKTtcbiAgICBfLmZvckVhY2goZWRnZS5wb2ludHMsIHN3YXBYWU9uZSk7XG4gICAgaWYgKF8uaGFzKGVkZ2UsIFwieFwiKSkge1xuICAgICAgc3dhcFhZT25lKGVkZ2UpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHN3YXBYWU9uZShhdHRycykge1xuICB2YXIgeCA9IGF0dHJzLng7XG4gIGF0dHJzLnggPSBhdHRycy55O1xuICBhdHRycy55ID0geDtcbn1cbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///483\n')},function(module,exports,__webpack_require__){"use strict";eval('\n\nvar _ = __webpack_require__(28);\nvar initOrder = __webpack_require__(485);\nvar crossCount = __webpack_require__(486);\nvar sortSubgraph = __webpack_require__(487);\nvar buildLayerGraph = __webpack_require__(491);\nvar addSubgraphConstraints = __webpack_require__(492);\nvar Graph = __webpack_require__(46).Graph;\nvar util = __webpack_require__(36);\n\nmodule.exports = order;\n\n/*\n * Applies heuristics to minimize edge crossings in the graph and sets the best\n * order solution as an order attribute on each node.\n *\n * Pre-conditions:\n *\n * 1. Graph must be DAG\n * 2. Graph nodes must be objects with a "rank" attribute\n * 3. Graph edges must have the "weight" attribute\n *\n * Post-conditions:\n *\n * 1. Graph nodes will have an "order" attribute based on the results of the\n * algorithm.\n */\nfunction order(g) {\n var maxRank = util.maxRank(g),\n downLayerGraphs = buildLayerGraphs(g, _.range(1, maxRank + 1), "inEdges"),\n upLayerGraphs = buildLayerGraphs(g, _.range(maxRank - 1, -1, -1), "outEdges");\n\n var layering = initOrder(g);\n assignOrder(g, layering);\n\n var bestCC = Number.POSITIVE_INFINITY,\n best;\n\n for (var i = 0, lastBest = 0; lastBest < 4; ++i, ++lastBest) {\n sweepLayerGraphs(i % 2 ? downLayerGraphs : upLayerGraphs, i % 4 >= 2);\n\n layering = util.buildLayerMatrix(g);\n var cc = crossCount(g, layering);\n if (cc < bestCC) {\n lastBest = 0;\n best = _.cloneDeep(layering);\n bestCC = cc;\n }\n }\n\n // consider use previous result, maybe somewhat reduendant\n layering = initOrder(g);\n assignOrder(g, layering);\n for (i = 0, lastBest = 0; lastBest < 4; ++i, ++lastBest) {\n sweepLayerGraphs(i % 2 ? downLayerGraphs : upLayerGraphs, i % 4 >= 2, true);\n\n layering = util.buildLayerMatrix(g);\n cc = crossCount(g, layering);\n if (cc < bestCC) {\n lastBest = 0;\n best = _.cloneDeep(layering);\n bestCC = cc;\n }\n }\n assignOrder(g, best);\n}\n\nfunction buildLayerGraphs(g, ranks, relationship) {\n return _.map(ranks, function(rank) {\n return buildLayerGraph(g, rank, relationship);\n });\n}\n\nfunction sweepLayerGraphs(layerGraphs, biasRight, usePrev) {\n var cg = new Graph();\n _.forEach(layerGraphs, function(lg) {\n var root = lg.graph().root;\n var sorted = sortSubgraph(lg, root, cg, biasRight, usePrev);\n _.forEach(sorted.vs, function(v, i) {\n lg.node(v).order = i;\n });\n addSubgraphConstraints(lg, cg, sorted.vs);\n });\n}\n\nfunction assignOrder(g, layering) {\n _.forEach(layering, function(layer) {\n _.forEach(layer, function(v, i) {\n g.node(v).order = i;\n });\n });\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZGFncmVqcy9saWIvb3JkZXIvaW5kZXguanM/MTE5YiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBYTs7QUFFYixRQUFRLG1CQUFPLENBQUMsRUFBVztBQUMzQixnQkFBZ0IsbUJBQU8sQ0FBQyxHQUFjO0FBQ3RDLGlCQUFpQixtQkFBTyxDQUFDLEdBQWU7QUFDeEMsbUJBQW1CLG1CQUFPLENBQUMsR0FBaUI7QUFDNUMsc0JBQXNCLG1CQUFPLENBQUMsR0FBcUI7QUFDbkQsNkJBQTZCLG1CQUFPLENBQUMsR0FBNEI7QUFDakUsWUFBWSxtQkFBTyxDQUFDLEVBQWE7QUFDakMsV0FBVyxtQkFBTyxDQUFDLEVBQVM7O0FBRTVCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSwrQkFBK0IsY0FBYztBQUM3Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQixjQUFjO0FBQ3pDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0giLCJmaWxlIjoiNDg0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfID0gcmVxdWlyZShcIi4uL2xvZGFzaFwiKTtcbnZhciBpbml0T3JkZXIgPSByZXF1aXJlKFwiLi9pbml0LW9yZGVyXCIpO1xudmFyIGNyb3NzQ291bnQgPSByZXF1aXJlKFwiLi9jcm9zcy1jb3VudFwiKTtcbnZhciBzb3J0U3ViZ3JhcGggPSByZXF1aXJlKFwiLi9zb3J0LXN1YmdyYXBoXCIpO1xudmFyIGJ1aWxkTGF5ZXJHcmFwaCA9IHJlcXVpcmUoXCIuL2J1aWxkLWxheWVyLWdyYXBoXCIpO1xudmFyIGFkZFN1YmdyYXBoQ29uc3RyYWludHMgPSByZXF1aXJlKFwiLi9hZGQtc3ViZ3JhcGgtY29uc3RyYWludHNcIik7XG52YXIgR3JhcGggPSByZXF1aXJlKFwiLi4vZ3JhcGhsaWJcIikuR3JhcGg7XG52YXIgdXRpbCA9IHJlcXVpcmUoXCIuLi91dGlsXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IG9yZGVyO1xuXG4vKlxuICogQXBwbGllcyBoZXVyaXN0aWNzIHRvIG1pbmltaXplIGVkZ2UgY3Jvc3NpbmdzIGluIHRoZSBncmFwaCBhbmQgc2V0cyB0aGUgYmVzdFxuICogb3JkZXIgc29sdXRpb24gYXMgYW4gb3JkZXIgYXR0cmlidXRlIG9uIGVhY2ggbm9kZS5cbiAqXG4gKiBQcmUtY29uZGl0aW9uczpcbiAqXG4gKiAgICAxLiBHcmFwaCBtdXN0IGJlIERBR1xuICogICAgMi4gR3JhcGggbm9kZXMgbXVzdCBiZSBvYmplY3RzIHdpdGggYSBcInJhbmtcIiBhdHRyaWJ1dGVcbiAqICAgIDMuIEdyYXBoIGVkZ2VzIG11c3QgaGF2ZSB0aGUgXCJ3ZWlnaHRcIiBhdHRyaWJ1dGVcbiAqXG4gKiBQb3N0LWNvbmRpdGlvbnM6XG4gKlxuICogICAgMS4gR3JhcGggbm9kZXMgd2lsbCBoYXZlIGFuIFwib3JkZXJcIiBhdHRyaWJ1dGUgYmFzZWQgb24gdGhlIHJlc3VsdHMgb2YgdGhlXG4gKiAgICAgICBhbGdvcml0aG0uXG4gKi9cbmZ1bmN0aW9uIG9yZGVyKGcpIHtcbiAgdmFyIG1heFJhbmsgPSB1dGlsLm1heFJhbmsoZyksXG4gICAgZG93bkxheWVyR3JhcGhzID0gYnVpbGRMYXllckdyYXBocyhnLCBfLnJhbmdlKDEsIG1heFJhbmsgKyAxKSwgXCJpbkVkZ2VzXCIpLFxuICAgIHVwTGF5ZXJHcmFwaHMgPSBidWlsZExheWVyR3JhcGhzKGcsIF8ucmFuZ2UobWF4UmFuayAtIDEsIC0xLCAtMSksIFwib3V0RWRnZXNcIik7XG5cbiAgdmFyIGxheWVyaW5nID0gaW5pdE9yZGVyKGcpO1xuICBhc3NpZ25PcmRlcihnLCBsYXllcmluZyk7XG5cbiAgdmFyIGJlc3RDQyA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSxcbiAgICBiZXN0O1xuXG4gIGZvciAodmFyIGkgPSAwLCBsYXN0QmVzdCA9IDA7IGxhc3RCZXN0IDwgNDsgKytpLCArK2xhc3RCZXN0KSB7XG4gICAgc3dlZXBMYXllckdyYXBocyhpICUgMiA/IGRvd25MYXllckdyYXBocyA6IHVwTGF5ZXJHcmFwaHMsIGkgJSA0ID49IDIpO1xuXG4gICAgbGF5ZXJpbmcgPSB1dGlsLmJ1aWxkTGF5ZXJNYXRyaXgoZyk7XG4gICAgdmFyIGNjID0gY3Jvc3NDb3VudChnLCBsYXllcmluZyk7XG4gICAgaWYgKGNjIDwgYmVzdENDKSB7XG4gICAgICBsYXN0QmVzdCA9IDA7XG4gICAgICBiZXN0ID0gXy5jbG9uZURlZXAobGF5ZXJpbmcpO1xuICAgICAgYmVzdENDID0gY2M7XG4gICAgfVxuICB9XG5cbiAgLy8gY29uc2lkZXIgdXNlIHByZXZpb3VzIHJlc3VsdCwgbWF5YmUgc29tZXdoYXQgcmVkdWVuZGFudFxuICBsYXllcmluZyA9IGluaXRPcmRlcihnKTtcbiAgYXNzaWduT3JkZXIoZywgbGF5ZXJpbmcpO1xuICBmb3IgKGkgPSAwLCBsYXN0QmVzdCA9IDA7IGxhc3RCZXN0IDwgNDsgKytpLCArK2xhc3RCZXN0KSB7XG4gICAgc3dlZXBMYXllckdyYXBocyhpICUgMiA/IGRvd25MYXllckdyYXBocyA6IHVwTGF5ZXJHcmFwaHMsIGkgJSA0ID49IDIsIHRydWUpO1xuXG4gICAgbGF5ZXJpbmcgPSB1dGlsLmJ1aWxkTGF5ZXJNYXRyaXgoZyk7XG4gICAgY2MgPSBjcm9zc0NvdW50KGcsIGxheWVyaW5nKTtcbiAgICBpZiAoY2MgPCBiZXN0Q0MpIHtcbiAgICAgIGxhc3RCZXN0ID0gMDtcbiAgICAgIGJlc3QgPSBfLmNsb25lRGVlcChsYXllcmluZyk7XG4gICAgICBiZXN0Q0MgPSBjYztcbiAgICB9XG4gIH1cbiAgYXNzaWduT3JkZXIoZywgYmVzdCk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkTGF5ZXJHcmFwaHMoZywgcmFua3MsIHJlbGF0aW9uc2hpcCkge1xuICByZXR1cm4gXy5tYXAocmFua3MsIGZ1bmN0aW9uKHJhbmspIHtcbiAgICByZXR1cm4gYnVpbGRMYXllckdyYXBoKGcsIHJhbmssIHJlbGF0aW9uc2hpcCk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBzd2VlcExheWVyR3JhcGhzKGxheWVyR3JhcGhzLCBiaWFzUmlnaHQsIHVzZVByZXYpIHtcbiAgdmFyIGNnID0gbmV3IEdyYXBoKCk7XG4gIF8uZm9yRWFjaChsYXllckdyYXBocywgZnVuY3Rpb24obGcpIHtcbiAgICB2YXIgcm9vdCA9IGxnLmdyYXBoKCkucm9vdDtcbiAgICB2YXIgc29ydGVkID0gc29ydFN1YmdyYXBoKGxnLCByb290LCBjZywgYmlhc1JpZ2h0LCB1c2VQcmV2KTtcbiAgICBfLmZvckVhY2goc29ydGVkLnZzLCBmdW5jdGlvbih2LCBpKSB7XG4gICAgICBsZy5ub2RlKHYpLm9yZGVyID0gaTtcbiAgICB9KTtcbiAgICBhZGRTdWJncmFwaENvbnN0cmFpbnRzKGxnLCBjZywgc29ydGVkLnZzKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGFzc2lnbk9yZGVyKGcsIGxheWVyaW5nKSB7XG4gIF8uZm9yRWFjaChsYXllcmluZywgZnVuY3Rpb24obGF5ZXIpIHtcbiAgICBfLmZvckVhY2gobGF5ZXIsIGZ1bmN0aW9uKHYsIGkpIHtcbiAgICAgIGcubm9kZSh2KS5vcmRlciA9IGk7XG4gICAgfSk7XG4gIH0pO1xufVxuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///484\n')},function(module,exports,__webpack_require__){"use strict";eval('\n\nvar _ = __webpack_require__(28);\n\nmodule.exports = initOrder;\n\n/*\n * Assigns an initial order value for each node by performing a DFS search\n * starting from nodes in the first rank. Nodes are assigned an order in their\n * rank as they are first visited.\n *\n * This approach comes from Gansner, et al., "A Technique for Drawing Directed\n * Graphs."\n *\n * Returns a layering matrix with an array per layer and each layer sorted by\n * the order of its nodes.\n */\nfunction initOrder(g) {\n var visited = {};\n var simpleNodes = _.filter(g.nodes(), function(v) {\n return !g.children(v).length;\n });\n var maxRank = _.max(_.map(simpleNodes, function(v) { return g.node(v).rank; }));\n var layers = _.map(_.range(maxRank + 1), function() { return []; });\n\n function dfs(v) {\n if (_.has(visited, v)) return;\n visited[v] = true;\n var node = g.node(v);\n layers[node.rank].push(v);\n _.forEach(g.successors(v), dfs);\n }\n\n var orderedVs = _.sortBy(simpleNodes, function(v) { return g.node(v).rank; });\n\n // 有fixOrder的,直接排序好放进去\n var fixOrderNodes = _.sortBy(_.filter(orderedVs, function (n) {\n return g.node(n).fixorder !== undefined;\n }), function(n) {\n return g.node(n).fixorder;\n });\n\n _.forEach(fixOrderNodes, function(n) {\n layers[g.node(n).rank].push(n);\n visited[n] = true;\n });\n\n _.forEach(orderedVs, dfs);\n\n return layers;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZGFncmVqcy9saWIvb3JkZXIvaW5pdC1vcmRlci5qcz9hMDkxIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFhOztBQUViLFFBQVEsbUJBQU8sQ0FBQyxFQUFXOztBQUUzQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsc0RBQXNELHVCQUF1QixFQUFFO0FBQy9FLHVEQUF1RCxXQUFXLEVBQUU7O0FBRXBFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHFEQUFxRCx1QkFBdUIsRUFBRTs7QUFFOUU7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIOztBQUVBO0FBQ0EiLCJmaWxlIjoiNDg1LmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfID0gcmVxdWlyZShcIi4uL2xvZGFzaFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBpbml0T3JkZXI7XG5cbi8qXG4gKiBBc3NpZ25zIGFuIGluaXRpYWwgb3JkZXIgdmFsdWUgZm9yIGVhY2ggbm9kZSBieSBwZXJmb3JtaW5nIGEgREZTIHNlYXJjaFxuICogc3RhcnRpbmcgZnJvbSBub2RlcyBpbiB0aGUgZmlyc3QgcmFuay4gTm9kZXMgYXJlIGFzc2lnbmVkIGFuIG9yZGVyIGluIHRoZWlyXG4gKiByYW5rIGFzIHRoZXkgYXJlIGZpcnN0IHZpc2l0ZWQuXG4gKlxuICogVGhpcyBhcHByb2FjaCBjb21lcyBmcm9tIEdhbnNuZXIsIGV0IGFsLiwgXCJBIFRlY2huaXF1ZSBmb3IgRHJhd2luZyBEaXJlY3RlZFxuICogR3JhcGhzLlwiXG4gKlxuICogUmV0dXJucyBhIGxheWVyaW5nIG1hdHJpeCB3aXRoIGFuIGFycmF5IHBlciBsYXllciBhbmQgZWFjaCBsYXllciBzb3J0ZWQgYnlcbiAqIHRoZSBvcmRlciBvZiBpdHMgbm9kZXMuXG4gKi9cbmZ1bmN0aW9uIGluaXRPcmRlcihnKSB7XG4gIHZhciB2aXNpdGVkID0ge307XG4gIHZhciBzaW1wbGVOb2RlcyA9IF8uZmlsdGVyKGcubm9kZXMoKSwgZnVuY3Rpb24odikge1xuICAgIHJldHVybiAhZy5jaGlsZHJlbih2KS5sZW5ndGg7XG4gIH0pO1xuICB2YXIgbWF4UmFuayA9IF8ubWF4KF8ubWFwKHNpbXBsZU5vZGVzLCBmdW5jdGlvbih2KSB7IHJldHVybiBnLm5vZGUodikucmFuazsgfSkpO1xuICB2YXIgbGF5ZXJzID0gXy5tYXAoXy5yYW5nZShtYXhSYW5rICsgMSksIGZ1bmN0aW9uKCkgeyByZXR1cm4gW107IH0pO1xuXG4gIGZ1bmN0aW9uIGRmcyh2KSB7XG4gICAgaWYgKF8uaGFzKHZpc2l0ZWQsIHYpKSByZXR1cm47XG4gICAgdmlzaXRlZFt2XSA9IHRydWU7XG4gICAgdmFyIG5vZGUgPSBnLm5vZGUodik7XG4gICAgbGF5ZXJzW25vZGUucmFua10ucHVzaCh2KTtcbiAgICBfLmZvckVhY2goZy5zdWNjZXNzb3JzKHYpLCBkZnMpO1xuICB9XG5cbiAgdmFyIG9yZGVyZWRWcyA9IF8uc29ydEJ5KHNpbXBsZU5vZGVzLCBmdW5jdGlvbih2KSB7IHJldHVybiBnLm5vZGUodikucmFuazsgfSk7XG5cbiAgLy8g5pyJZml4T3JkZXLnmoTvvIznm7TmjqXmjpLluo/lpb3mlL7ov5vljrtcbiAgdmFyIGZpeE9yZGVyTm9kZXMgPSBfLnNvcnRCeShfLmZpbHRlcihvcmRlcmVkVnMsIGZ1bmN0aW9uIChuKSB7XG4gICAgcmV0dXJuIGcubm9kZShuKS5maXhvcmRlciAhPT0gdW5kZWZpbmVkO1xuICB9KSwgZnVuY3Rpb24obikge1xuICAgIHJldHVybiBnLm5vZGUobikuZml4b3JkZXI7XG4gIH0pO1xuXG4gIF8uZm9yRWFjaChmaXhPcmRlck5vZGVzLCBmdW5jdGlvbihuKSB7XG4gICAgbGF5ZXJzW2cubm9kZShuKS5yYW5rXS5wdXNoKG4pO1xuICAgIHZpc2l0ZWRbbl0gPSB0cnVlO1xuICB9KTtcblxuICBfLmZvckVhY2gob3JkZXJlZFZzLCBkZnMpO1xuXG4gIHJldHVybiBsYXllcnM7XG59XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///485\n')},function(module,exports,__webpack_require__){"use strict";eval('\n\nvar _ = __webpack_require__(28);\n\nmodule.exports = crossCount;\n\n/*\n * A function that takes a layering (an array of layers, each with an array of\n * ordererd nodes) and a graph and returns a weighted crossing count.\n *\n * Pre-conditions:\n *\n * 1. Input graph must be simple (not a multigraph), directed, and include\n * only simple edges.\n * 2. Edges in the input graph must have assigned weights.\n *\n * Post-conditions:\n *\n * 1. The graph and layering matrix are left unchanged.\n *\n * This algorithm is derived from Barth, et al., "Bilayer Cross Counting."\n */\nfunction crossCount(g, layering) {\n var cc = 0;\n for (var i = 1; i < layering.length; ++i) {\n cc += twoLayerCrossCount(g, layering[i-1], layering[i]);\n }\n return cc;\n}\n\nfunction twoLayerCrossCount(g, northLayer, southLayer) {\n // Sort all of the edges between the north and south layers by their position\n // in the north layer and then the south. Map these edges to the position of\n // their head in the south layer.\n var southPos = _.zipObject(southLayer,\n _.map(southLayer, function (v, i) { return i; }));\n var southEntries = _.flatten(_.map(northLayer, function(v) {\n return _.sortBy(_.map(g.outEdges(v), function(e) {\n return { pos: southPos[e.w], weight: g.edge(e).weight };\n }), "pos");\n }), true);\n\n // Build the accumulator tree\n var firstIndex = 1;\n while (firstIndex < southLayer.length) firstIndex <<= 1;\n var treeSize = 2 * firstIndex - 1;\n firstIndex -= 1;\n var tree = _.map(new Array(treeSize), function() { return 0; });\n\n // Calculate the weighted crossings\n var cc = 0;\n _.forEach(southEntries.forEach(function(entry) {\n var index = entry.pos + firstIndex;\n tree[index] += entry.weight;\n var weightSum = 0;\n while (index > 0) {\n if (index % 2) {\n weightSum += tree[index + 1];\n }\n index = (index - 1) >> 1;\n tree[index] += entry.weight;\n }\n cc += entry.weight * weightSum;\n }));\n\n return cc;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZGFncmVqcy9saWIvb3JkZXIvY3Jvc3MtY291bnQuanM/MTE4NCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBYTs7QUFFYixRQUFRLG1CQUFPLENBQUMsRUFBVzs7QUFFM0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLHFCQUFxQjtBQUN0QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDLFVBQVUsRUFBRTtBQUNuRDtBQUNBO0FBQ0EsY0FBYztBQUNkLEtBQUs7QUFDTCxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvREFBb0QsVUFBVSxFQUFFOztBQUVoRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBIiwiZmlsZSI6IjQ4Ni5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG52YXIgXyA9IHJlcXVpcmUoXCIuLi9sb2Rhc2hcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gY3Jvc3NDb3VudDtcblxuLypcbiAqIEEgZnVuY3Rpb24gdGhhdCB0YWtlcyBhIGxheWVyaW5nIChhbiBhcnJheSBvZiBsYXllcnMsIGVhY2ggd2l0aCBhbiBhcnJheSBvZlxuICogb3JkZXJlcmQgbm9kZXMpIGFuZCBhIGdyYXBoIGFuZCByZXR1cm5zIGEgd2VpZ2h0ZWQgY3Jvc3NpbmcgY291bnQuXG4gKlxuICogUHJlLWNvbmRpdGlvbnM6XG4gKlxuICogICAgMS4gSW5wdXQgZ3JhcGggbXVzdCBiZSBzaW1wbGUgKG5vdCBhIG11bHRpZ3JhcGgpLCBkaXJlY3RlZCwgYW5kIGluY2x1ZGVcbiAqICAgICAgIG9ubHkgc2ltcGxlIGVkZ2VzLlxuICogICAgMi4gRWRnZXMgaW4gdGhlIGlucHV0IGdyYXBoIG11c3QgaGF2ZSBhc3NpZ25lZCB3ZWlnaHRzLlxuICpcbiAqIFBvc3QtY29uZGl0aW9uczpcbiAqXG4gKiAgICAxLiBUaGUgZ3JhcGggYW5kIGxheWVyaW5nIG1hdHJpeCBhcmUgbGVmdCB1bmNoYW5nZWQuXG4gKlxuICogVGhpcyBhbGdvcml0aG0gaXMgZGVyaXZlZCBmcm9tIEJhcnRoLCBldCBhbC4sIFwiQmlsYXllciBDcm9zcyBDb3VudGluZy5cIlxuICovXG5mdW5jdGlvbiBjcm9zc0NvdW50KGcsIGxheWVyaW5nKSB7XG4gIHZhciBjYyA9IDA7XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgbGF5ZXJpbmcubGVuZ3RoOyArK2kpIHtcbiAgICBjYyArPSB0d29MYXllckNyb3NzQ291bnQoZywgbGF5ZXJpbmdbaS0xXSwgbGF5ZXJpbmdbaV0pO1xuICB9XG4gIHJldHVybiBjYztcbn1cblxuZnVuY3Rpb24gdHdvTGF5ZXJDcm9zc0NvdW50KGcsIG5vcnRoTGF5ZXIsIHNvdXRoTGF5ZXIpIHtcbiAgLy8gU29ydCBhbGwgb2YgdGhlIGVkZ2VzIGJldHdlZW4gdGhlIG5vcnRoIGFuZCBzb3V0aCBsYXllcnMgYnkgdGhlaXIgcG9zaXRpb25cbiAgLy8gaW4gdGhlIG5vcnRoIGxheWVyIGFuZCB0aGVuIHRoZSBzb3V0aC4gTWFwIHRoZXNlIGVkZ2VzIHRvIHRoZSBwb3NpdGlvbiBvZlxuICAvLyB0aGVpciBoZWFkIGluIHRoZSBzb3V0aCBsYXllci5cbiAgdmFyIHNvdXRoUG9zID0gXy56aXBPYmplY3Qoc291dGhMYXllcixcbiAgICBfLm1hcChzb3V0aExheWVyLCBmdW5jdGlvbiAodiwgaSkgeyByZXR1cm4gaTsgfSkpO1xuICB2YXIgc291dGhFbnRyaWVzID0gXy5mbGF0dGVuKF8ubWFwKG5vcnRoTGF5ZXIsIGZ1bmN0aW9uKHYpIHtcbiAgICByZXR1cm4gXy5zb3J0QnkoXy5tYXAoZy5vdXRFZGdlcyh2KSwgZnVuY3Rpb24oZSkge1xuICAgICAgcmV0dXJuIHsgcG9zOiBzb3V0aFBvc1tlLnddLCB3ZWlnaHQ6IGcuZWRnZShlKS53ZWlnaHQgfTtcbiAgICB9KSwgXCJwb3NcIik7XG4gIH0pLCB0cnVlKTtcblxuICAvLyBCdWlsZCB0aGUgYWNjdW11bGF0b3IgdHJlZVxuICB2YXIgZmlyc3RJbmRleCA9IDE7XG4gIHdoaWxlIChmaXJzdEluZGV4IDwgc291dGhMYXllci5sZW5ndGgpIGZpcnN0SW5kZXggPDw9IDE7XG4gIHZhciB0cmVlU2l6ZSA9IDIgKiBmaXJzdEluZGV4IC0gMTtcbiAgZmlyc3RJbmRleCAtPSAxO1xuICB2YXIgdHJlZSA9IF8ubWFwKG5ldyBBcnJheSh0cmVlU2l6ZSksIGZ1bmN0aW9uKCkgeyByZXR1cm4gMDsgfSk7XG5cbiAgLy8gQ2FsY3VsYXRlIHRoZSB3ZWlnaHRlZCBjcm9zc2luZ3NcbiAgdmFyIGNjID0gMDtcbiAgXy5mb3JFYWNoKHNvdXRoRW50cmllcy5mb3JFYWNoKGZ1bmN0aW9uKGVudHJ5KSB7XG4gICAgdmFyIGluZGV4ID0gZW50cnkucG9zICsgZmlyc3RJbmRleDtcbiAgICB0cmVlW2luZGV4XSArPSBlbnRyeS53ZWlnaHQ7XG4gICAgdmFyIHdlaWdodFN1bSA9IDA7XG4gICAgd2hpbGUgKGluZGV4ID4gMCkge1xuICAgICAgaWYgKGluZGV4ICUgMikge1xuICAgICAgICB3ZWlnaHRTdW0gKz0gdHJlZVtpbmRleCArIDFdO1xuICAgICAgfVxuICAgICAgaW5kZXggPSAoaW5kZXggLSAxKSA+PiAxO1xuICAgICAgdHJlZVtpbmRleF0gKz0gZW50cnkud2VpZ2h0O1xuICAgIH1cbiAgICBjYyArPSBlbnRyeS53ZWlnaHQgKiB3ZWlnaHRTdW07XG4gIH0pKTtcblxuICByZXR1cm4gY2M7XG59XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///486\n')},function(module,exports,__webpack_require__){eval('var _ = __webpack_require__(28);\nvar barycenter = __webpack_require__(488);\nvar resolveConflicts = __webpack_require__(489);\nvar sort = __webpack_require__(490);\n\nmodule.exports = sortSubgraph;\n\nfunction sortSubgraph(g, v, cg, biasRight, usePrev) {\n var movable = g.children(v);\n // fixorder的点不参与排序(这个方案不合适,只排了新增节点,和原来的分离)\n // var movable = _.filter(g.children(v), function(v) { return g.node(v).fixorder === undefined; });\n var node = g.node(v);\n var bl = node ? node.borderLeft : undefined;\n var br = node ? node.borderRight: undefined;\n var subgraphs = {};\n\n if (bl) {\n movable = _.filter(movable, function(w) {\n return w !== bl && w !== br;\n });\n }\n\n var barycenters = barycenter(g, movable);\n _.forEach(barycenters, function(entry) {\n if (g.children(entry.v).length) {\n var subgraphResult = sortSubgraph(g, entry.v, cg, biasRight);\n subgraphs[entry.v] = subgraphResult;\n if (_.has(subgraphResult, "barycenter")) {\n mergeBarycenters(entry, subgraphResult);\n }\n }\n });\n\n var entries = resolveConflicts(barycenters, cg);\n expandSubgraphs(entries, subgraphs);\n\n // 添加fixorder信息到entries里边\n // TODO: 不考虑复合情况,只用第一个点的fixorder信息,后续考虑更完备的实现\n _.forEach(entries, function (e) {\n var node = g.node(e.vs[0]);\n e.fixorder = node.fixorder;\n e.order = node.order;\n });\n\n var result = sort(entries, biasRight, usePrev);\n\n if (bl) {\n result.vs = _.flatten([bl, result.vs, br], true);\n if (g.predecessors(bl).length) {\n var blPred = g.node(g.predecessors(bl)[0]),\n brPred = g.node(g.predecessors(br)[0]);\n if (!_.has(result, "barycenter")) {\n result.barycenter = 0;\n result.weight = 0;\n }\n result.barycenter = (result.barycenter * result.weight +\n blPred.order + brPred.order) / (result.weight + 2);\n result.weight += 2;\n }\n }\n\n return result;\n}\n\nfunction expandSubgraphs(entries, subgraphs) {\n _.forEach(entries, function(entry) {\n entry.vs = _.flatten(entry.vs.map(function(v) {\n if (subgraphs[v]) {\n return subgraphs[v].vs;\n }\n return v;\n }), true);\n });\n}\n\nfunction mergeBarycenters(target, other) {\n if (!_.isUndefined(target.barycenter)) {\n target.barycenter = (target.barycenter * target.weight +\n other.barycenter * other.weight) /\n (target.weight + other.weight);\n target.weight += other.weight;\n } else {\n target.barycenter = other.barycenter;\n target.weight = other.weight;\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZGFncmVqcy9saWIvb3JkZXIvc29ydC1zdWJncmFwaC5qcz81NGVhIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFFBQVEsbUJBQU8sQ0FBQyxFQUFXO0FBQzNCLGlCQUFpQixtQkFBTyxDQUFDLEdBQWM7QUFDdkMsdUJBQXVCLG1CQUFPLENBQUMsR0FBcUI7QUFDcEQsV0FBVyxtQkFBTyxDQUFDLEdBQVE7O0FBRTNCOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHdEQUF3RCx5Q0FBeUMsRUFBRTtBQUNuRztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiNDg3LmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xudmFyIGJhcnljZW50ZXIgPSByZXF1aXJlKFwiLi9iYXJ5Y2VudGVyXCIpO1xudmFyIHJlc29sdmVDb25mbGljdHMgPSByZXF1aXJlKFwiLi9yZXNvbHZlLWNvbmZsaWN0c1wiKTtcbnZhciBzb3J0ID0gcmVxdWlyZShcIi4vc29ydFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBzb3J0U3ViZ3JhcGg7XG5cbmZ1bmN0aW9uIHNvcnRTdWJncmFwaChnLCB2LCBjZywgYmlhc1JpZ2h0LCB1c2VQcmV2KSB7XG4gIHZhciBtb3ZhYmxlID0gZy5jaGlsZHJlbih2KTtcbiAgLy8gZml4b3JkZXLnmoTngrnkuI3lj4LkuI7mjpLluo/vvIjov5nkuKrmlrnmoYjkuI3lkIjpgILvvIzlj6rmjpLkuobmlrDlop7oioLngrnvvIzlkozljp/mnaXnmoTliIbnprvvvIlcbiAgLy8gdmFyIG1vdmFibGUgPSBfLmZpbHRlcihnLmNoaWxkcmVuKHYpLCBmdW5jdGlvbih2KSB7IHJldHVybiBnLm5vZGUodikuZml4b3JkZXIgPT09IHVuZGVmaW5lZDsgfSk7XG4gIHZhciBub2RlID0gZy5ub2RlKHYpO1xuICB2YXIgYmwgPSBub2RlID8gbm9kZS5ib3JkZXJMZWZ0IDogdW5kZWZpbmVkO1xuICB2YXIgYnIgPSBub2RlID8gbm9kZS5ib3JkZXJSaWdodDogdW5kZWZpbmVkO1xuICB2YXIgc3ViZ3JhcGhzID0ge307XG5cbiAgaWYgKGJsKSB7XG4gICAgbW92YWJsZSA9IF8uZmlsdGVyKG1vdmFibGUsIGZ1bmN0aW9uKHcpIHtcbiAgICAgIHJldHVybiB3ICE9PSBibCAmJiB3ICE9PSBicjtcbiAgICB9KTtcbiAgfVxuXG4gIHZhciBiYXJ5Y2VudGVycyA9IGJhcnljZW50ZXIoZywgbW92YWJsZSk7XG4gIF8uZm9yRWFjaChiYXJ5Y2VudGVycywgZnVuY3Rpb24oZW50cnkpIHtcbiAgICBpZiAoZy5jaGlsZHJlbihlbnRyeS52KS5sZW5ndGgpIHtcbiAgICAgIHZhciBzdWJncmFwaFJlc3VsdCA9IHNvcnRTdWJncmFwaChnLCBlbnRyeS52LCBjZywgYmlhc1JpZ2h0KTtcbiAgICAgIHN1YmdyYXBoc1tlbnRyeS52XSA9IHN1YmdyYXBoUmVzdWx0O1xuICAgICAgaWYgKF8uaGFzKHN1YmdyYXBoUmVzdWx0LCBcImJhcnljZW50ZXJcIikpIHtcbiAgICAgICAgbWVyZ2VCYXJ5Y2VudGVycyhlbnRyeSwgc3ViZ3JhcGhSZXN1bHQpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgdmFyIGVudHJpZXMgPSByZXNvbHZlQ29uZmxpY3RzKGJhcnljZW50ZXJzLCBjZyk7XG4gIGV4cGFuZFN1YmdyYXBocyhlbnRyaWVzLCBzdWJncmFwaHMpO1xuXG4gIC8vIOa3u+WKoGZpeG9yZGVy5L+h5oGv5YiwZW50cmllc+mHjOi+uVxuICAvLyBUT0RPOiDkuI3ogIPomZHlpI3lkIjmg4XlhrXvvIzlj6rnlKjnrKzkuIDkuKrngrnnmoRmaXhvcmRlcuS/oeaBr++8jOWQjue7reiAg+iZkeabtOWujOWkh+eahOWunueOsFxuICBfLmZvckVhY2goZW50cmllcywgZnVuY3Rpb24gKGUpIHtcbiAgICB2YXIgbm9kZSA9IGcubm9kZShlLnZzWzBdKTtcbiAgICBlLmZpeG9yZGVyID0gbm9kZS5maXhvcmRlcjtcbiAgICBlLm9yZGVyID0gbm9kZS5vcmRlcjtcbiAgfSk7XG5cbiAgdmFyIHJlc3VsdCA9IHNvcnQoZW50cmllcywgYmlhc1JpZ2h0LCB1c2VQcmV2KTtcblxuICBpZiAoYmwpIHtcbiAgICByZXN1bHQudnMgPSBfLmZsYXR0ZW4oW2JsLCByZXN1bHQudnMsIGJyXSwgdHJ1ZSk7XG4gICAgaWYgKGcucHJlZGVjZXNzb3JzKGJsKS5sZW5ndGgpIHtcbiAgICAgIHZhciBibFByZWQgPSBnLm5vZGUoZy5wcmVkZWNlc3NvcnMoYmwpWzBdKSxcbiAgICAgICAgYnJQcmVkID0gZy5ub2RlKGcucHJlZGVjZXNzb3JzKGJyKVswXSk7XG4gICAgICBpZiAoIV8uaGFzKHJlc3VsdCwgXCJiYXJ5Y2VudGVyXCIpKSB7XG4gICAgICAgIHJlc3VsdC5iYXJ5Y2VudGVyID0gMDtcbiAgICAgICAgcmVzdWx0LndlaWdodCA9IDA7XG4gICAgICB9XG4gICAgICByZXN1bHQuYmFyeWNlbnRlciA9IChyZXN1bHQuYmFyeWNlbnRlciAqIHJlc3VsdC53ZWlnaHQgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxQcmVkLm9yZGVyICsgYnJQcmVkLm9yZGVyKSAvIChyZXN1bHQud2VpZ2h0ICsgMik7XG4gICAgICByZXN1bHQud2VpZ2h0ICs9IDI7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gZXhwYW5kU3ViZ3JhcGhzKGVudHJpZXMsIHN1YmdyYXBocykge1xuICBfLmZvckVhY2goZW50cmllcywgZnVuY3Rpb24oZW50cnkpIHtcbiAgICBlbnRyeS52cyA9IF8uZmxhdHRlbihlbnRyeS52cy5tYXAoZnVuY3Rpb24odikge1xuICAgICAgaWYgKHN1YmdyYXBoc1t2XSkge1xuICAgICAgICByZXR1cm4gc3ViZ3JhcGhzW3ZdLnZzO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHY7XG4gICAgfSksIHRydWUpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gbWVyZ2VCYXJ5Y2VudGVycyh0YXJnZXQsIG90aGVyKSB7XG4gIGlmICghXy5pc1VuZGVmaW5lZCh0YXJnZXQuYmFyeWNlbnRlcikpIHtcbiAgICB0YXJnZXQuYmFyeWNlbnRlciA9ICh0YXJnZXQuYmFyeWNlbnRlciAqIHRhcmdldC53ZWlnaHQgK1xuICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyLmJhcnljZW50ZXIgKiBvdGhlci53ZWlnaHQpIC9cbiAgICAgICAgICAgICAgICAgICAgICAgICh0YXJnZXQud2VpZ2h0ICsgb3RoZXIud2VpZ2h0KTtcbiAgICB0YXJnZXQud2VpZ2h0ICs9IG90aGVyLndlaWdodDtcbiAgfSBlbHNlIHtcbiAgICB0YXJnZXQuYmFyeWNlbnRlciA9IG90aGVyLmJhcnljZW50ZXI7XG4gICAgdGFyZ2V0LndlaWdodCA9IG90aGVyLndlaWdodDtcbiAgfVxufVxuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///487\n')},function(module,exports,__webpack_require__){eval("var _ = __webpack_require__(28);\n\nmodule.exports = barycenter;\n\nfunction barycenter(g, movable) {\n return _.map(movable, function(v) {\n var inV = g.inEdges(v);\n if (!inV.length) {\n return { v: v };\n } else {\n var result = _.reduce(inV, function(acc, e) {\n var edge = g.edge(e),\n nodeU = g.node(e.v);\n return {\n sum: acc.sum + (edge.weight * nodeU.order),\n weight: acc.weight + edge.weight\n };\n }, { sum: 0, weight: 0 });\n\n return {\n v: v,\n barycenter: result.sum / result.weight,\n weight: result.weight\n };\n }\n });\n}\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZGFncmVqcy9saWIvb3JkZXIvYmFyeWNlbnRlci5qcz9iYjBhIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFFBQVEsbUJBQU8sQ0FBQyxFQUFXOztBQUUzQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPLEdBQUcsb0JBQW9COztBQUU5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0giLCJmaWxlIjoiNDg4LmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGJhcnljZW50ZXI7XG5cbmZ1bmN0aW9uIGJhcnljZW50ZXIoZywgbW92YWJsZSkge1xuICByZXR1cm4gXy5tYXAobW92YWJsZSwgZnVuY3Rpb24odikge1xuICAgIHZhciBpblYgPSBnLmluRWRnZXModik7XG4gICAgaWYgKCFpblYubGVuZ3RoKSB7XG4gICAgICByZXR1cm4geyB2OiB2IH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciByZXN1bHQgPSBfLnJlZHVjZShpblYsIGZ1bmN0aW9uKGFjYywgZSkge1xuICAgICAgICB2YXIgZWRnZSA9IGcuZWRnZShlKSxcbiAgICAgICAgICBub2RlVSA9IGcubm9kZShlLnYpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN1bTogYWNjLnN1bSArIChlZGdlLndlaWdodCAqIG5vZGVVLm9yZGVyKSxcbiAgICAgICAgICB3ZWlnaHQ6IGFjYy53ZWlnaHQgKyBlZGdlLndlaWdodFxuICAgICAgICB9O1xuICAgICAgfSwgeyBzdW06IDAsIHdlaWdodDogMCB9KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdjogdixcbiAgICAgICAgYmFyeWNlbnRlcjogcmVzdWx0LnN1bSAvIHJlc3VsdC53ZWlnaHQsXG4gICAgICAgIHdlaWdodDogcmVzdWx0LndlaWdodFxuICAgICAgfTtcbiAgICB9XG4gIH0pO1xufVxuXG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///488\n")},function(module,exports,__webpack_require__){"use strict";eval('\n\nvar _ = __webpack_require__(28);\n\nmodule.exports = resolveConflicts;\n\n/*\n * Given a list of entries of the form {v, barycenter, weight} and a\n * constraint graph this function will resolve any conflicts between the\n * constraint graph and the barycenters for the entries. If the barycenters for\n * an entry would violate a constraint in the constraint graph then we coalesce\n * the nodes in the conflict into a new node that respects the contraint and\n * aggregates barycenter and weight information.\n *\n * This implementation is based on the description in Forster, "A Fast and\n * Simple Hueristic for Constrained Two-Level Crossing Reduction," thought it\n * differs in some specific details.\n *\n * Pre-conditions:\n *\n * 1. Each entry has the form {v, barycenter, weight}, or if the node has\n * no barycenter, then {v}.\n *\n * Returns:\n *\n * A new list of entries of the form {vs, i, barycenter, weight}. The list\n * `vs` may either be a singleton or it may be an aggregation of nodes\n * ordered such that they do not violate constraints from the constraint\n * graph. The property `i` is the lowest original index of any of the\n * elements in `vs`.\n */\nfunction resolveConflicts(entries, cg) {\n var mappedEntries = {};\n _.forEach(entries, function(entry, i) {\n var tmp = mappedEntries[entry.v] = {\n indegree: 0,\n "in": [],\n out: [],\n vs: [entry.v],\n i: i\n };\n if (!_.isUndefined(entry.barycenter)) {\n tmp.barycenter = entry.barycenter;\n tmp.weight = entry.weight;\n }\n });\n\n _.forEach(cg.edges(), function(e) {\n var entryV = mappedEntries[e.v];\n var entryW = mappedEntries[e.w];\n if (!_.isUndefined(entryV) && !_.isUndefined(entryW)) {\n entryW.indegree++;\n entryV.out.push(mappedEntries[e.w]);\n }\n });\n\n var sourceSet = _.filter(mappedEntries, function(entry) {\n return !entry.indegree;\n });\n\n return doResolveConflicts(sourceSet);\n}\n\nfunction doResolveConflicts(sourceSet) {\n var entries = [];\n\n function handleIn(vEntry) {\n return function(uEntry) {\n if (uEntry.merged) {\n return;\n }\n if (_.isUndefined(uEntry.barycenter) ||\n _.isUndefined(vEntry.barycenter) ||\n uEntry.barycenter >= vEntry.barycenter) {\n mergeEntries(vEntry, uEntry);\n }\n };\n }\n\n function handleOut(vEntry) {\n return function(wEntry) {\n wEntry["in"].push(vEntry);\n if (--wEntry.indegree === 0) {\n sourceSet.push(wEntry);\n }\n };\n }\n\n while (sourceSet.length) {\n var entry = sourceSet.pop();\n entries.push(entry);\n _.forEach(entry["in"].reverse(), handleIn(entry));\n _.forEach(entry.out, handleOut(entry));\n }\n\n return _.map(_.filter(entries, function(entry) { return !entry.merged; }),\n function(entry) {\n return _.pick(entry, ["vs", "i", "barycenter", "weight"]);\n });\n\n}\n\nfunction mergeEntries(target, source) {\n var sum = 0;\n var weight = 0;\n\n if (target.weight) {\n sum += target.barycenter * target.weight;\n weight += target.weight;\n }\n\n if (source.weight) {\n sum += source.barycenter * source.weight;\n weight += source.weight;\n }\n\n target.vs = source.vs.concat(target.vs);\n target.barycenter = sum / weight;\n target.weight = weight;\n target.i = Math.min(source.i, target.i);\n source.merged = true;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZGFncmVqcy9saWIvb3JkZXIvcmVzb2x2ZS1jb25mbGljdHMuanM/MjQ1NyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBYTs7QUFFYixRQUFRLG1CQUFPLENBQUMsRUFBVzs7QUFFM0I7O0FBRUE7QUFDQSx3Q0FBd0Msc0JBQXNCO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQyxzQkFBc0I7QUFDeEQsOEJBQThCLEVBQUU7QUFDaEM7QUFDQTtBQUNBO0FBQ0EseUNBQXlDLDBCQUEwQjtBQUNuRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsa0RBQWtELHNCQUFzQixFQUFFO0FBQzFFO0FBQ0E7QUFDQSxLQUFLOztBQUVMOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiNDg5LmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfID0gcmVxdWlyZShcIi4uL2xvZGFzaFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSByZXNvbHZlQ29uZmxpY3RzO1xuXG4vKlxuICogR2l2ZW4gYSBsaXN0IG9mIGVudHJpZXMgb2YgdGhlIGZvcm0ge3YsIGJhcnljZW50ZXIsIHdlaWdodH0gYW5kIGFcbiAqIGNvbnN0cmFpbnQgZ3JhcGggdGhpcyBmdW5jdGlvbiB3aWxsIHJlc29sdmUgYW55IGNvbmZsaWN0cyBiZXR3ZWVuIHRoZVxuICogY29uc3RyYWludCBncmFwaCBhbmQgdGhlIGJhcnljZW50ZXJzIGZvciB0aGUgZW50cmllcy4gSWYgdGhlIGJhcnljZW50ZXJzIGZvclxuICogYW4gZW50cnkgd291bGQgdmlvbGF0ZSBhIGNvbnN0cmFpbnQgaW4gdGhlIGNvbnN0cmFpbnQgZ3JhcGggdGhlbiB3ZSBjb2FsZXNjZVxuICogdGhlIG5vZGVzIGluIHRoZSBjb25mbGljdCBpbnRvIGEgbmV3IG5vZGUgdGhhdCByZXNwZWN0cyB0aGUgY29udHJhaW50IGFuZFxuICogYWdncmVnYXRlcyBiYXJ5Y2VudGVyIGFuZCB3ZWlnaHQgaW5mb3JtYXRpb24uXG4gKlxuICogVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbiB0aGUgZGVzY3JpcHRpb24gaW4gRm9yc3RlciwgXCJBIEZhc3QgYW5kXG4gKiBTaW1wbGUgSHVlcmlzdGljIGZvciBDb25zdHJhaW5lZCBUd28tTGV2ZWwgQ3Jvc3NpbmcgUmVkdWN0aW9uLFwiIHRob3VnaHQgaXRcbiAqIGRpZmZlcnMgaW4gc29tZSBzcGVjaWZpYyBkZXRhaWxzLlxuICpcbiAqIFByZS1jb25kaXRpb25zOlxuICpcbiAqICAgIDEuIEVhY2ggZW50cnkgaGFzIHRoZSBmb3JtIHt2LCBiYXJ5Y2VudGVyLCB3ZWlnaHR9LCBvciBpZiB0aGUgbm9kZSBoYXNcbiAqICAgICAgIG5vIGJhcnljZW50ZXIsIHRoZW4ge3Z9LlxuICpcbiAqIFJldHVybnM6XG4gKlxuICogICAgQSBuZXcgbGlzdCBvZiBlbnRyaWVzIG9mIHRoZSBmb3JtIHt2cywgaSwgYmFyeWNlbnRlciwgd2VpZ2h0fS4gVGhlIGxpc3RcbiAqICAgIGB2c2AgbWF5IGVpdGhlciBiZSBhIHNpbmdsZXRvbiBvciBpdCBtYXkgYmUgYW4gYWdncmVnYXRpb24gb2Ygbm9kZXNcbiAqICAgIG9yZGVyZWQgc3VjaCB0aGF0IHRoZXkgZG8gbm90IHZpb2xhdGUgY29uc3RyYWludHMgZnJvbSB0aGUgY29uc3RyYWludFxuICogICAgZ3JhcGguIFRoZSBwcm9wZXJ0eSBgaWAgaXMgdGhlIGxvd2VzdCBvcmlnaW5hbCBpbmRleCBvZiBhbnkgb2YgdGhlXG4gKiAgICBlbGVtZW50cyBpbiBgdnNgLlxuICovXG5mdW5jdGlvbiByZXNvbHZlQ29uZmxpY3RzKGVudHJpZXMsIGNnKSB7XG4gIHZhciBtYXBwZWRFbnRyaWVzID0ge307XG4gIF8uZm9yRWFjaChlbnRyaWVzLCBmdW5jdGlvbihlbnRyeSwgaSkge1xuICAgIHZhciB0bXAgPSBtYXBwZWRFbnRyaWVzW2VudHJ5LnZdID0ge1xuICAgICAgaW5kZWdyZWU6IDAsXG4gICAgICBcImluXCI6IFtdLFxuICAgICAgb3V0OiBbXSxcbiAgICAgIHZzOiBbZW50cnkudl0sXG4gICAgICBpOiBpXG4gICAgfTtcbiAgICBpZiAoIV8uaXNVbmRlZmluZWQoZW50cnkuYmFyeWNlbnRlcikpIHtcbiAgICAgIHRtcC5iYXJ5Y2VudGVyID0gZW50cnkuYmFyeWNlbnRlcjtcbiAgICAgIHRtcC53ZWlnaHQgPSBlbnRyeS53ZWlnaHQ7XG4gICAgfVxuICB9KTtcblxuICBfLmZvckVhY2goY2cuZWRnZXMoKSwgZnVuY3Rpb24oZSkge1xuICAgIHZhciBlbnRyeVYgPSBtYXBwZWRFbnRyaWVzW2Uudl07XG4gICAgdmFyIGVudHJ5VyA9IG1hcHBlZEVudHJpZXNbZS53XTtcbiAgICBpZiAoIV8uaXNVbmRlZmluZWQoZW50cnlWKSAmJiAhXy5pc1VuZGVmaW5lZChlbnRyeVcpKSB7XG4gICAgICBlbnRyeVcuaW5kZWdyZWUrKztcbiAgICAgIGVudHJ5Vi5vdXQucHVzaChtYXBwZWRFbnRyaWVzW2Uud10pO1xuICAgIH1cbiAgfSk7XG5cbiAgdmFyIHNvdXJjZVNldCA9IF8uZmlsdGVyKG1hcHBlZEVudHJpZXMsIGZ1bmN0aW9uKGVudHJ5KSB7XG4gICAgcmV0dXJuICFlbnRyeS5pbmRlZ3JlZTtcbiAgfSk7XG5cbiAgcmV0dXJuIGRvUmVzb2x2ZUNvbmZsaWN0cyhzb3VyY2VTZXQpO1xufVxuXG5mdW5jdGlvbiBkb1Jlc29sdmVDb25mbGljdHMoc291cmNlU2V0KSB7XG4gIHZhciBlbnRyaWVzID0gW107XG5cbiAgZnVuY3Rpb24gaGFuZGxlSW4odkVudHJ5KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHVFbnRyeSkge1xuICAgICAgaWYgKHVFbnRyeS5tZXJnZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKF8uaXNVbmRlZmluZWQodUVudHJ5LmJhcnljZW50ZXIpIHx8XG4gICAgICAgICAgXy5pc1VuZGVmaW5lZCh2RW50cnkuYmFyeWNlbnRlcikgfHxcbiAgICAgICAgICB1RW50cnkuYmFyeWNlbnRlciA+PSB2RW50cnkuYmFyeWNlbnRlcikge1xuICAgICAgICBtZXJnZUVudHJpZXModkVudHJ5LCB1RW50cnkpO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBoYW5kbGVPdXQodkVudHJ5KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHdFbnRyeSkge1xuICAgICAgd0VudHJ5W1wiaW5cIl0ucHVzaCh2RW50cnkpO1xuICAgICAgaWYgKC0td0VudHJ5LmluZGVncmVlID09PSAwKSB7XG4gICAgICAgIHNvdXJjZVNldC5wdXNoKHdFbnRyeSk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHdoaWxlIChzb3VyY2VTZXQubGVuZ3RoKSB7XG4gICAgdmFyIGVudHJ5ID0gc291cmNlU2V0LnBvcCgpO1xuICAgIGVudHJpZXMucHVzaChlbnRyeSk7XG4gICAgXy5mb3JFYWNoKGVudHJ5W1wiaW5cIl0ucmV2ZXJzZSgpLCBoYW5kbGVJbihlbnRyeSkpO1xuICAgIF8uZm9yRWFjaChlbnRyeS5vdXQsIGhhbmRsZU91dChlbnRyeSkpO1xuICB9XG5cbiAgcmV0dXJuIF8ubWFwKF8uZmlsdGVyKGVudHJpZXMsIGZ1bmN0aW9uKGVudHJ5KSB7IHJldHVybiAhZW50cnkubWVyZ2VkOyB9KSxcbiAgICBmdW5jdGlvbihlbnRyeSkge1xuICAgICAgcmV0dXJuIF8ucGljayhlbnRyeSwgW1widnNcIiwgXCJpXCIsIFwiYmFyeWNlbnRlclwiLCBcIndlaWdodFwiXSk7XG4gICAgfSk7XG5cbn1cblxuZnVuY3Rpb24gbWVyZ2VFbnRyaWVzKHRhcmdldCwgc291cmNlKSB7XG4gIHZhciBzdW0gPSAwO1xuICB2YXIgd2VpZ2h0ID0gMDtcblxuICBpZiAodGFyZ2V0LndlaWdodCkge1xuICAgIHN1bSArPSB0YXJnZXQuYmFyeWNlbnRlciAqIHRhcmdldC53ZWlnaHQ7XG4gICAgd2VpZ2h0ICs9IHRhcmdldC53ZWlnaHQ7XG4gIH1cblxuICBpZiAoc291cmNlLndlaWdodCkge1xuICAgIHN1bSArPSBzb3VyY2UuYmFyeWNlbnRlciAqIHNvdXJjZS53ZWlnaHQ7XG4gICAgd2VpZ2h0ICs9IHNvdXJjZS53ZWlnaHQ7XG4gIH1cblxuICB0YXJnZXQudnMgPSBzb3VyY2UudnMuY29uY2F0KHRhcmdldC52cyk7XG4gIHRhcmdldC5iYXJ5Y2VudGVyID0gc3VtIC8gd2VpZ2h0O1xuICB0YXJnZXQud2VpZ2h0ID0gd2VpZ2h0O1xuICB0YXJnZXQuaSA9IE1hdGgubWluKHNvdXJjZS5pLCB0YXJnZXQuaSk7XG4gIHNvdXJjZS5tZXJnZWQgPSB0cnVlO1xufVxuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///489\n')},function(module,exports,__webpack_require__){eval('var _ = __webpack_require__(28);\nvar util = __webpack_require__(36);\n\nmodule.exports = sort;\n\nfunction sort(entries, biasRight, usePrev) {\n var parts = util.partition(entries, function(entry) {\n // NOTE: 有fixorder的也可以排\n return (_.has(entry, "fixorder") && !isNaN(entry.fixorder)) || _.has(entry, "barycenter");\n });\n var sortable = parts.lhs,\n unsortable = _.sortBy(parts.rhs, function(entry) { return -entry.i; }),\n vs = [],\n sum = 0,\n weight = 0,\n vsIndex = 0;\n\n sortable.sort(compareWithBias(!!biasRight, !!usePrev));\n\n vsIndex = consumeUnsortable(vs, unsortable, vsIndex);\n\n _.forEach(sortable, function (entry) {\n vsIndex += entry.vs.length;\n vs.push(entry.vs);\n sum += entry.barycenter * entry.weight;\n weight += entry.weight;\n vsIndex = consumeUnsortable(vs, unsortable, vsIndex);\n });\n\n var result = { vs: _.flatten(vs, true) };\n if (weight) {\n result.barycenter = sum / weight;\n result.weight = weight;\n }\n return result;\n}\n\nfunction consumeUnsortable(vs, unsortable, index) {\n var last;\n while (unsortable.length && (last = _.last(unsortable)).i <= index) {\n unsortable.pop();\n vs.push(last.vs);\n index++;\n }\n return index;\n}\n\n/**\n * 配置是否考虑使用之前的布局结果\n */\nfunction compareWithBias(bias, usePrev) {\n return function(entryV, entryW) {\n // 排序的时候先判断fixorder,不行再判断重心\n if (entryV.fixorder !== undefined && entryW.fixorder !== undefined) {\n return entryV.fixorder - entryW.fixorder;\n }\n if (entryV.barycenter < entryW.barycenter) {\n return -1;\n } else if (entryV.barycenter > entryW.barycenter) {\n return 1;\n }\n // 重心相同,考虑之前排好的顺序\n if (usePrev && entryV.order !== undefined && entryW.order !== undefined) {\n if (entryV.order < entryW.order) {\n return -1;\n } else if (entryV.order > entryW.order) {\n return 1;\n }\n }\n\n return !bias ? entryV.i - entryW.i : entryW.i - entryV.i;\n };\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZGFncmVqcy9saWIvb3JkZXIvc29ydC5qcz83M2YwIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFFBQVEsbUJBQU8sQ0FBQyxFQUFXO0FBQzNCLFdBQVcsbUJBQU8sQ0FBQyxFQUFTOztBQUU1Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLHNEQUFzRCxpQkFBaUIsRUFBRTtBQUN6RTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVILGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EiLCJmaWxlIjoiNDkwLmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xudmFyIHV0aWwgPSByZXF1aXJlKFwiLi4vdXRpbFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBzb3J0O1xuXG5mdW5jdGlvbiBzb3J0KGVudHJpZXMsIGJpYXNSaWdodCwgdXNlUHJldikge1xuICB2YXIgcGFydHMgPSB1dGlsLnBhcnRpdGlvbihlbnRyaWVzLCBmdW5jdGlvbihlbnRyeSkge1xuICAgIC8vIE5PVEU6IOaciWZpeG9yZGVy55qE5Lmf5Y+v5Lul5o6SXG4gICAgcmV0dXJuIChfLmhhcyhlbnRyeSwgXCJmaXhvcmRlclwiKSAmJiAhaXNOYU4oZW50cnkuZml4b3JkZXIpKSB8fCBfLmhhcyhlbnRyeSwgXCJiYXJ5Y2VudGVyXCIpO1xuICB9KTtcbiAgdmFyIHNvcnRhYmxlID0gcGFydHMubGhzLFxuICAgIHVuc29ydGFibGUgPSBfLnNvcnRCeShwYXJ0cy5yaHMsIGZ1bmN0aW9uKGVudHJ5KSB7IHJldHVybiAtZW50cnkuaTsgfSksXG4gICAgdnMgPSBbXSxcbiAgICBzdW0gPSAwLFxuICAgIHdlaWdodCA9IDAsXG4gICAgdnNJbmRleCA9IDA7XG5cbiAgc29ydGFibGUuc29ydChjb21wYXJlV2l0aEJpYXMoISFiaWFzUmlnaHQsICEhdXNlUHJldikpO1xuXG4gIHZzSW5kZXggPSBjb25zdW1lVW5zb3J0YWJsZSh2cywgdW5zb3J0YWJsZSwgdnNJbmRleCk7XG5cbiAgXy5mb3JFYWNoKHNvcnRhYmxlLCBmdW5jdGlvbiAoZW50cnkpIHtcbiAgICB2c0luZGV4ICs9IGVudHJ5LnZzLmxlbmd0aDtcbiAgICB2cy5wdXNoKGVudHJ5LnZzKTtcbiAgICBzdW0gKz0gZW50cnkuYmFyeWNlbnRlciAqIGVudHJ5LndlaWdodDtcbiAgICB3ZWlnaHQgKz0gZW50cnkud2VpZ2h0O1xuICAgIHZzSW5kZXggPSBjb25zdW1lVW5zb3J0YWJsZSh2cywgdW5zb3J0YWJsZSwgdnNJbmRleCk7XG4gIH0pO1xuXG4gIHZhciByZXN1bHQgPSB7IHZzOiBfLmZsYXR0ZW4odnMsIHRydWUpIH07XG4gIGlmICh3ZWlnaHQpIHtcbiAgICByZXN1bHQuYmFyeWNlbnRlciA9IHN1bSAvIHdlaWdodDtcbiAgICByZXN1bHQud2VpZ2h0ID0gd2VpZ2h0O1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGNvbnN1bWVVbnNvcnRhYmxlKHZzLCB1bnNvcnRhYmxlLCBpbmRleCkge1xuICB2YXIgbGFzdDtcbiAgd2hpbGUgKHVuc29ydGFibGUubGVuZ3RoICYmIChsYXN0ID0gXy5sYXN0KHVuc29ydGFibGUpKS5pIDw9IGluZGV4KSB7XG4gICAgdW5zb3J0YWJsZS5wb3AoKTtcbiAgICB2cy5wdXNoKGxhc3QudnMpO1xuICAgIGluZGV4Kys7XG4gIH1cbiAgcmV0dXJuIGluZGV4O1xufVxuXG4vKipcbiAqIOmFjee9ruaYr+WQpuiAg+iZkeS9v+eUqOS5i+WJjeeahOW4g+WxgOe7k+aenFxuICovXG5mdW5jdGlvbiBjb21wYXJlV2l0aEJpYXMoYmlhcywgdXNlUHJldikge1xuICByZXR1cm4gZnVuY3Rpb24oZW50cnlWLCBlbnRyeVcpIHtcbiAgICAvLyDmjpLluo/nmoTml7blgJnlhYjliKTmlq1maXhvcmRlcu+8jOS4jeihjOWGjeWIpOaWremHjeW/g1xuICAgIGlmIChlbnRyeVYuZml4b3JkZXIgIT09IHVuZGVmaW5lZCAmJiBlbnRyeVcuZml4b3JkZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGVudHJ5Vi5maXhvcmRlciAtIGVudHJ5Vy5maXhvcmRlcjtcbiAgICB9XG4gICAgaWYgKGVudHJ5Vi5iYXJ5Y2VudGVyIDwgZW50cnlXLmJhcnljZW50ZXIpIHtcbiAgICAgIHJldHVybiAtMTtcbiAgICB9IGVsc2UgaWYgKGVudHJ5Vi5iYXJ5Y2VudGVyID4gZW50cnlXLmJhcnljZW50ZXIpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgICAvLyDph43lv4Pnm7jlkIzvvIzogIPomZHkuYvliY3mjpLlpb3nmoTpobrluo9cbiAgICBpZiAodXNlUHJldiAmJiBlbnRyeVYub3JkZXIgIT09IHVuZGVmaW5lZCAmJiBlbnRyeVcub3JkZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGVudHJ5Vi5vcmRlciA8IGVudHJ5Vy5vcmRlcikge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgICB9IGVsc2UgaWYgKGVudHJ5Vi5vcmRlciA+IGVudHJ5Vy5vcmRlcikge1xuICAgICAgICByZXR1cm4gMTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gIWJpYXMgPyBlbnRyeVYuaSAtIGVudHJ5Vy5pIDogZW50cnlXLmkgLSBlbnRyeVYuaTtcbiAgfTtcbn1cbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///490\n')},function(module,exports,__webpack_require__){eval('var _ = __webpack_require__(28);\nvar Graph = __webpack_require__(46).Graph;\n\nmodule.exports = buildLayerGraph;\n\n/*\n * Constructs a graph that can be used to sort a layer of nodes. The graph will\n * contain all base and subgraph nodes from the request layer in their original\n * hierarchy and any edges that are incident on these nodes and are of the type\n * requested by the "relationship" parameter.\n *\n * Nodes from the requested rank that do not have parents are assigned a root\n * node in the output graph, which is set in the root graph attribute. This\n * makes it easy to walk the hierarchy of movable nodes during ordering.\n *\n * Pre-conditions:\n *\n * 1. Input graph is a DAG\n * 2. Base nodes in the input graph have a rank attribute\n * 3. Subgraph nodes in the input graph has minRank and maxRank attributes\n * 4. Edges have an assigned weight\n *\n * Post-conditions:\n *\n * 1. Output graph has all nodes in the movable rank with preserved\n * hierarchy.\n * 2. Root nodes in the movable layer are made children of the node\n * indicated by the root attribute of the graph.\n * 3. Non-movable nodes incident on movable nodes, selected by the\n * relationship parameter, are included in the graph (without hierarchy).\n * 4. Edges incident on movable nodes, selected by the relationship\n * parameter, are added to the output graph.\n * 5. The weights for copied edges are aggregated as need, since the output\n * graph is not a multi-graph.\n */\nfunction buildLayerGraph(g, rank, relationship) {\n var root = createRootNode(g),\n result = new Graph({ compound: true }).setGraph({ root: root })\n .setDefaultNodeLabel(function(v) { return g.node(v); });\n\n _.forEach(g.nodes(), function(v) {\n var node = g.node(v),\n parent = g.parent(v);\n\n if (node.rank === rank || node.minRank <= rank && rank <= node.maxRank) {\n result.setNode(v);\n result.setParent(v, parent || root);\n\n // This assumes we have only short edges!\n _.forEach(g[relationship](v), function(e) {\n var u = e.v === v ? e.w : e.v,\n edge = result.edge(u, v),\n weight = !_.isUndefined(edge) ? edge.weight : 0;\n result.setEdge(u, v, { weight: g.edge(e).weight + weight });\n });\n\n if (_.has(node, "minRank")) {\n result.setNode(v, {\n borderLeft: node.borderLeft[rank],\n borderRight: node.borderRight[rank]\n });\n }\n }\n });\n\n return result;\n}\n\nfunction createRootNode(g) {\n var v;\n while (g.hasNode((v = _.uniqueId("_root"))));\n return v;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZGFncmVqcy9saWIvb3JkZXIvYnVpbGQtbGF5ZXItZ3JhcGguanM/ZWQ1YSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxRQUFRLG1CQUFPLENBQUMsRUFBVztBQUMzQixZQUFZLG1CQUFPLENBQUMsRUFBYTs7QUFFakM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixpQkFBaUIsWUFBWSxhQUFhO0FBQ2xFLHdDQUF3QyxrQkFBa0IsRUFBRTs7QUFFNUQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLG9DQUFvQztBQUNsRSxPQUFPOztBQUVQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiI0OTEuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgXyA9IHJlcXVpcmUoXCIuLi9sb2Rhc2hcIik7XG52YXIgR3JhcGggPSByZXF1aXJlKFwiLi4vZ3JhcGhsaWJcIikuR3JhcGg7XG5cbm1vZHVsZS5leHBvcnRzID0gYnVpbGRMYXllckdyYXBoO1xuXG4vKlxuICogQ29uc3RydWN0cyBhIGdyYXBoIHRoYXQgY2FuIGJlIHVzZWQgdG8gc29ydCBhIGxheWVyIG9mIG5vZGVzLiBUaGUgZ3JhcGggd2lsbFxuICogY29udGFpbiBhbGwgYmFzZSBhbmQgc3ViZ3JhcGggbm9kZXMgZnJvbSB0aGUgcmVxdWVzdCBsYXllciBpbiB0aGVpciBvcmlnaW5hbFxuICogaGllcmFyY2h5IGFuZCBhbnkgZWRnZXMgdGhhdCBhcmUgaW5jaWRlbnQgb24gdGhlc2Ugbm9kZXMgYW5kIGFyZSBvZiB0aGUgdHlwZVxuICogcmVxdWVzdGVkIGJ5IHRoZSBcInJlbGF0aW9uc2hpcFwiIHBhcmFtZXRlci5cbiAqXG4gKiBOb2RlcyBmcm9tIHRoZSByZXF1ZXN0ZWQgcmFuayB0aGF0IGRvIG5vdCBoYXZlIHBhcmVudHMgYXJlIGFzc2lnbmVkIGEgcm9vdFxuICogbm9kZSBpbiB0aGUgb3V0cHV0IGdyYXBoLCB3aGljaCBpcyBzZXQgaW4gdGhlIHJvb3QgZ3JhcGggYXR0cmlidXRlLiBUaGlzXG4gKiBtYWtlcyBpdCBlYXN5IHRvIHdhbGsgdGhlIGhpZXJhcmNoeSBvZiBtb3ZhYmxlIG5vZGVzIGR1cmluZyBvcmRlcmluZy5cbiAqXG4gKiBQcmUtY29uZGl0aW9uczpcbiAqXG4gKiAgICAxLiBJbnB1dCBncmFwaCBpcyBhIERBR1xuICogICAgMi4gQmFzZSBub2RlcyBpbiB0aGUgaW5wdXQgZ3JhcGggaGF2ZSBhIHJhbmsgYXR0cmlidXRlXG4gKiAgICAzLiBTdWJncmFwaCBub2RlcyBpbiB0aGUgaW5wdXQgZ3JhcGggaGFzIG1pblJhbmsgYW5kIG1heFJhbmsgYXR0cmlidXRlc1xuICogICAgNC4gRWRnZXMgaGF2ZSBhbiBhc3NpZ25lZCB3ZWlnaHRcbiAqXG4gKiBQb3N0LWNvbmRpdGlvbnM6XG4gKlxuICogICAgMS4gT3V0cHV0IGdyYXBoIGhhcyBhbGwgbm9kZXMgaW4gdGhlIG1vdmFibGUgcmFuayB3aXRoIHByZXNlcnZlZFxuICogICAgICAgaGllcmFyY2h5LlxuICogICAgMi4gUm9vdCBub2RlcyBpbiB0aGUgbW92YWJsZSBsYXllciBhcmUgbWFkZSBjaGlsZHJlbiBvZiB0aGUgbm9kZVxuICogICAgICAgaW5kaWNhdGVkIGJ5IHRoZSByb290IGF0dHJpYnV0ZSBvZiB0aGUgZ3JhcGguXG4gKiAgICAzLiBOb24tbW92YWJsZSBub2RlcyBpbmNpZGVudCBvbiBtb3ZhYmxlIG5vZGVzLCBzZWxlY3RlZCBieSB0aGVcbiAqICAgICAgIHJlbGF0aW9uc2hpcCBwYXJhbWV0ZXIsIGFyZSBpbmNsdWRlZCBpbiB0aGUgZ3JhcGggKHdpdGhvdXQgaGllcmFyY2h5KS5cbiAqICAgIDQuIEVkZ2VzIGluY2lkZW50IG9uIG1vdmFibGUgbm9kZXMsIHNlbGVjdGVkIGJ5IHRoZSByZWxhdGlvbnNoaXBcbiAqICAgICAgIHBhcmFtZXRlciwgYXJlIGFkZGVkIHRvIHRoZSBvdXRwdXQgZ3JhcGguXG4gKiAgICA1LiBUaGUgd2VpZ2h0cyBmb3IgY29waWVkIGVkZ2VzIGFyZSBhZ2dyZWdhdGVkIGFzIG5lZWQsIHNpbmNlIHRoZSBvdXRwdXRcbiAqICAgICAgIGdyYXBoIGlzIG5vdCBhIG11bHRpLWdyYXBoLlxuICovXG5mdW5jdGlvbiBidWlsZExheWVyR3JhcGgoZywgcmFuaywgcmVsYXRpb25zaGlwKSB7XG4gIHZhciByb290ID0gY3JlYXRlUm9vdE5vZGUoZyksXG4gICAgcmVzdWx0ID0gbmV3IEdyYXBoKHsgY29tcG91bmQ6IHRydWUgfSkuc2V0R3JhcGgoeyByb290OiByb290IH0pXG4gICAgICAuc2V0RGVmYXVsdE5vZGVMYWJlbChmdW5jdGlvbih2KSB7IHJldHVybiBnLm5vZGUodik7IH0pO1xuXG4gIF8uZm9yRWFjaChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICB2YXIgbm9kZSA9IGcubm9kZSh2KSxcbiAgICAgIHBhcmVudCA9IGcucGFyZW50KHYpO1xuXG4gICAgaWYgKG5vZGUucmFuayA9PT0gcmFuayB8fCBub2RlLm1pblJhbmsgPD0gcmFuayAmJiByYW5rIDw9IG5vZGUubWF4UmFuaykge1xuICAgICAgcmVzdWx0LnNldE5vZGUodik7XG4gICAgICByZXN1bHQuc2V0UGFyZW50KHYsIHBhcmVudCB8fCByb290KTtcblxuICAgICAgLy8gVGhpcyBhc3N1bWVzIHdlIGhhdmUgb25seSBzaG9ydCBlZGdlcyFcbiAgICAgIF8uZm9yRWFjaChnW3JlbGF0aW9uc2hpcF0odiksIGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgdmFyIHUgPSBlLnYgPT09IHYgPyBlLncgOiBlLnYsXG4gICAgICAgICAgZWRnZSA9IHJlc3VsdC5lZGdlKHUsIHYpLFxuICAgICAgICAgIHdlaWdodCA9ICFfLmlzVW5kZWZpbmVkKGVkZ2UpID8gZWRnZS53ZWlnaHQgOiAwO1xuICAgICAgICByZXN1bHQuc2V0RWRnZSh1LCB2LCB7IHdlaWdodDogZy5lZGdlKGUpLndlaWdodCArIHdlaWdodCB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoXy5oYXMobm9kZSwgXCJtaW5SYW5rXCIpKSB7XG4gICAgICAgIHJlc3VsdC5zZXROb2RlKHYsIHtcbiAgICAgICAgICBib3JkZXJMZWZ0OiBub2RlLmJvcmRlckxlZnRbcmFua10sXG4gICAgICAgICAgYm9yZGVyUmlnaHQ6IG5vZGUuYm9yZGVyUmlnaHRbcmFua11cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBjcmVhdGVSb290Tm9kZShnKSB7XG4gIHZhciB2O1xuICB3aGlsZSAoZy5oYXNOb2RlKCh2ID0gXy51bmlxdWVJZChcIl9yb290XCIpKSkpO1xuICByZXR1cm4gdjtcbn1cbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///491\n')},function(module,exports,__webpack_require__){eval('var _ = __webpack_require__(28);\n\nmodule.exports = addSubgraphConstraints;\n\nfunction addSubgraphConstraints(g, cg, vs) {\n var prev = {},\n rootPrev;\n\n _.forEach(vs, function(v) {\n var child = g.parent(v),\n parent,\n prevChild;\n while (child) {\n parent = g.parent(child);\n if (parent) {\n prevChild = prev[parent];\n prev[parent] = child;\n } else {\n prevChild = rootPrev;\n rootPrev = child;\n }\n if (prevChild && prevChild !== child) {\n cg.setEdge(prevChild, child);\n return;\n }\n child = parent;\n }\n });\n\n /*\n function dfs(v) {\n var children = v ? g.children(v) : g.children();\n if (children.length) {\n var min = Number.POSITIVE_INFINITY,\n subgraphs = [];\n _.each(children, function(child) {\n var childMin = dfs(child);\n if (g.children(child).length) {\n subgraphs.push({ v: child, order: childMin });\n }\n min = Math.min(min, childMin);\n });\n _.reduce(_.sortBy(subgraphs, "order"), function(prev, curr) {\n cg.setEdge(prev.v, curr.v);\n return curr;\n });\n return min;\n }\n return g.node(v).order;\n }\n dfs(undefined);\n */\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZGFncmVqcy9saWIvb3JkZXIvYWRkLXN1YmdyYXBoLWNvbnN0cmFpbnRzLmpzPzBlYWIiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsUUFBUSxtQkFBTyxDQUFDLEVBQVc7O0FBRTNCOztBQUVBO0FBQ0EsZUFBZTtBQUNmOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQiw0QkFBNEI7QUFDdEQ7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiNDkyLmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGFkZFN1YmdyYXBoQ29uc3RyYWludHM7XG5cbmZ1bmN0aW9uIGFkZFN1YmdyYXBoQ29uc3RyYWludHMoZywgY2csIHZzKSB7XG4gIHZhciBwcmV2ID0ge30sXG4gICAgcm9vdFByZXY7XG5cbiAgXy5mb3JFYWNoKHZzLCBmdW5jdGlvbih2KSB7XG4gICAgdmFyIGNoaWxkID0gZy5wYXJlbnQodiksXG4gICAgICBwYXJlbnQsXG4gICAgICBwcmV2Q2hpbGQ7XG4gICAgd2hpbGUgKGNoaWxkKSB7XG4gICAgICBwYXJlbnQgPSBnLnBhcmVudChjaGlsZCk7XG4gICAgICBpZiAocGFyZW50KSB7XG4gICAgICAgIHByZXZDaGlsZCA9IHByZXZbcGFyZW50XTtcbiAgICAgICAgcHJldltwYXJlbnRdID0gY2hpbGQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwcmV2Q2hpbGQgPSByb290UHJldjtcbiAgICAgICAgcm9vdFByZXYgPSBjaGlsZDtcbiAgICAgIH1cbiAgICAgIGlmIChwcmV2Q2hpbGQgJiYgcHJldkNoaWxkICE9PSBjaGlsZCkge1xuICAgICAgICBjZy5zZXRFZGdlKHByZXZDaGlsZCwgY2hpbGQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjaGlsZCA9IHBhcmVudDtcbiAgICB9XG4gIH0pO1xuXG4gIC8qXG4gIGZ1bmN0aW9uIGRmcyh2KSB7XG4gICAgdmFyIGNoaWxkcmVuID0gdiA/IGcuY2hpbGRyZW4odikgOiBnLmNoaWxkcmVuKCk7XG4gICAgaWYgKGNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgdmFyIG1pbiA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSxcbiAgICAgICAgICBzdWJncmFwaHMgPSBbXTtcbiAgICAgIF8uZWFjaChjaGlsZHJlbiwgZnVuY3Rpb24oY2hpbGQpIHtcbiAgICAgICAgdmFyIGNoaWxkTWluID0gZGZzKGNoaWxkKTtcbiAgICAgICAgaWYgKGcuY2hpbGRyZW4oY2hpbGQpLmxlbmd0aCkge1xuICAgICAgICAgIHN1YmdyYXBocy5wdXNoKHsgdjogY2hpbGQsIG9yZGVyOiBjaGlsZE1pbiB9KTtcbiAgICAgICAgfVxuICAgICAgICBtaW4gPSBNYXRoLm1pbihtaW4sIGNoaWxkTWluKTtcbiAgICAgIH0pO1xuICAgICAgXy5yZWR1Y2UoXy5zb3J0Qnkoc3ViZ3JhcGhzLCBcIm9yZGVyXCIpLCBmdW5jdGlvbihwcmV2LCBjdXJyKSB7XG4gICAgICAgIGNnLnNldEVkZ2UocHJldi52LCBjdXJyLnYpO1xuICAgICAgICByZXR1cm4gY3VycjtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG1pbjtcbiAgICB9XG4gICAgcmV0dXJuIGcubm9kZSh2KS5vcmRlcjtcbiAgfVxuICBkZnModW5kZWZpbmVkKTtcbiAgKi9cbn1cbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///492\n')},function(module,exports,__webpack_require__){"use strict";eval("\n\nvar _ = __webpack_require__(28);\nvar util = __webpack_require__(36);\nvar positionX = __webpack_require__(494).positionX;\n\nmodule.exports = position;\n\nfunction position(g) {\n g = util.asNonCompoundGraph(g);\n\n positionY(g);\n _.forEach(positionX(g), function(x, v) {\n g.node(v).x = x;\n });\n}\n\nfunction positionY(g) {\n var layering = util.buildLayerMatrix(g);\n var rankSep = g.graph().ranksep;\n var prevY = 0;\n _.forEach(layering, function(layer) {\n var maxHeight = _.max(_.map(layer, function(v) { return g.node(v).height; }));\n _.forEach(layer, function(v) {\n g.node(v).y = prevY + maxHeight / 2;\n });\n prevY += maxHeight + rankSep;\n });\n}\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZGFncmVqcy9saWIvcG9zaXRpb24vaW5kZXguanM/ZDA3NCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBYTs7QUFFYixRQUFRLG1CQUFPLENBQUMsRUFBVztBQUMzQixXQUFXLG1CQUFPLENBQUMsRUFBUztBQUM1QixnQkFBZ0IsbUJBQU8sQ0FBQyxHQUFNOztBQUU5Qjs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0RBQW9ELHlCQUF5QixFQUFFO0FBQy9FO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxHQUFHO0FBQ0giLCJmaWxlIjoiNDkzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfID0gcmVxdWlyZShcIi4uL2xvZGFzaFwiKTtcbnZhciB1dGlsID0gcmVxdWlyZShcIi4uL3V0aWxcIik7XG52YXIgcG9zaXRpb25YID0gcmVxdWlyZShcIi4vYmtcIikucG9zaXRpb25YO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBvc2l0aW9uO1xuXG5mdW5jdGlvbiBwb3NpdGlvbihnKSB7XG4gIGcgPSB1dGlsLmFzTm9uQ29tcG91bmRHcmFwaChnKTtcblxuICBwb3NpdGlvblkoZyk7XG4gIF8uZm9yRWFjaChwb3NpdGlvblgoZyksIGZ1bmN0aW9uKHgsIHYpIHtcbiAgICBnLm5vZGUodikueCA9IHg7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBwb3NpdGlvblkoZykge1xuICB2YXIgbGF5ZXJpbmcgPSB1dGlsLmJ1aWxkTGF5ZXJNYXRyaXgoZyk7XG4gIHZhciByYW5rU2VwID0gZy5ncmFwaCgpLnJhbmtzZXA7XG4gIHZhciBwcmV2WSA9IDA7XG4gIF8uZm9yRWFjaChsYXllcmluZywgZnVuY3Rpb24obGF5ZXIpIHtcbiAgICB2YXIgbWF4SGVpZ2h0ID0gXy5tYXgoXy5tYXAobGF5ZXIsIGZ1bmN0aW9uKHYpIHsgcmV0dXJuIGcubm9kZSh2KS5oZWlnaHQ7IH0pKTtcbiAgICBfLmZvckVhY2gobGF5ZXIsIGZ1bmN0aW9uKHYpIHtcbiAgICAgIGcubm9kZSh2KS55ID0gcHJldlkgKyBtYXhIZWlnaHQgLyAyO1xuICAgIH0pO1xuICAgIHByZXZZICs9IG1heEhlaWdodCArIHJhbmtTZXA7XG4gIH0pO1xufVxuXG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///493\n")},function(module,exports,__webpack_require__){"use strict";eval('\n\nvar _ = __webpack_require__(28);\nvar Graph = __webpack_require__(46).Graph;\nvar util = __webpack_require__(36);\n\n/*\n * This module provides coordinate assignment based on Brandes and Köpf, "Fast\n * and Simple Horizontal Coordinate Assignment."\n */\n\nmodule.exports = {\n positionX: positionX,\n findType1Conflicts: findType1Conflicts,\n findType2Conflicts: findType2Conflicts,\n addConflict: addConflict,\n hasConflict: hasConflict,\n verticalAlignment: verticalAlignment,\n horizontalCompaction: horizontalCompaction,\n alignCoordinates: alignCoordinates,\n findSmallestWidthAlignment: findSmallestWidthAlignment,\n balance: balance\n};\n\n/*\n * Marks all edges in the graph with a type-1 conflict with the "type1Conflict"\n * property. A type-1 conflict is one where a non-inner segment crosses an\n * inner segment. An inner segment is an edge with both incident nodes marked\n * with the "dummy" property.\n *\n * This algorithm scans layer by layer, starting with the second, for type-1\n * conflicts between the current layer and the previous layer. For each layer\n * it scans the nodes from left to right until it reaches one that is incident\n * on an inner segment. It then scans predecessors to determine if they have\n * edges that cross that inner segment. At the end a final scan is done for all\n * nodes on the current rank to see if they cross the last visited inner\n * segment.\n *\n * This algorithm (safely) assumes that a dummy node will only be incident on a\n * single node in the layers being scanned.\n */\nfunction findType1Conflicts(g, layering) {\n var conflicts = {};\n\n function visitLayer(prevLayer, layer) {\n var\n // last visited node in the previous layer that is incident on an inner\n // segment.\n k0 = 0,\n // Tracks the last node in this layer scanned for crossings with a type-1\n // segment.\n scanPos = 0,\n prevLayerLength = prevLayer.length,\n lastNode = _.last(layer);\n\n _.forEach(layer, function(v, i) {\n var w = findOtherInnerSegmentNode(g, v),\n k1 = w ? g.node(w).order : prevLayerLength;\n\n if (w || v === lastNode) {\n _.forEach(layer.slice(scanPos, i +1), function(scanNode) {\n _.forEach(g.predecessors(scanNode), function(u) {\n var uLabel = g.node(u),\n uPos = uLabel.order;\n if ((uPos < k0 || k1 < uPos) &&\n !(uLabel.dummy && g.node(scanNode).dummy)) {\n addConflict(conflicts, u, scanNode);\n }\n });\n });\n scanPos = i + 1;\n k0 = k1;\n }\n });\n\n return layer;\n }\n\n _.reduce(layering, visitLayer);\n return conflicts;\n}\n\nfunction findType2Conflicts(g, layering) {\n var conflicts = {};\n\n function scan(south, southPos, southEnd, prevNorthBorder, nextNorthBorder) {\n var v;\n _.forEach(_.range(southPos, southEnd), function(i) {\n v = south[i];\n if (g.node(v).dummy) {\n _.forEach(g.predecessors(v), function(u) {\n var uNode = g.node(u);\n if (uNode.dummy &&\n (uNode.order < prevNorthBorder || uNode.order > nextNorthBorder)) {\n addConflict(conflicts, u, v);\n }\n });\n }\n });\n }\n\n\n function visitLayer(north, south) {\n var prevNorthPos = -1,\n nextNorthPos,\n southPos = 0;\n\n _.forEach(south, function(v, southLookahead) {\n if (g.node(v).dummy === "border") {\n var predecessors = g.predecessors(v);\n if (predecessors.length) {\n nextNorthPos = g.node(predecessors[0]).order;\n scan(south, southPos, southLookahead, prevNorthPos, nextNorthPos);\n southPos = southLookahead;\n prevNorthPos = nextNorthPos;\n }\n }\n scan(south, southPos, south.length, nextNorthPos, north.length);\n });\n\n return south;\n }\n\n _.reduce(layering, visitLayer);\n return conflicts;\n}\n\nfunction findOtherInnerSegmentNode(g, v) {\n if (g.node(v).dummy) {\n return _.find(g.predecessors(v), function(u) {\n return g.node(u).dummy;\n });\n }\n}\n\nfunction addConflict(conflicts, v, w) {\n if (v > w) {\n var tmp = v;\n v = w;\n w = tmp;\n }\n\n var conflictsV = conflicts[v];\n if (!conflictsV) {\n conflicts[v] = conflictsV = {};\n }\n conflictsV[w] = true;\n}\n\nfunction hasConflict(conflicts, v, w) {\n if (v > w) {\n var tmp = v;\n v = w;\n w = tmp;\n }\n return _.has(conflicts[v], w);\n}\n\n/*\n * Try to align nodes into vertical "blocks" where possible. This algorithm\n * attempts to align a node with one of its median neighbors. If the edge\n * connecting a neighbor is a type-1 conflict then we ignore that possibility.\n * If a previous node has already formed a block with a node after the node\n * we\'re trying to form a block with, we also ignore that possibility - our\n * blocks would be split in that scenario.\n */\nfunction verticalAlignment(g, layering, conflicts, neighborFn) {\n var root = {},\n align = {},\n pos = {};\n\n // We cache the position here based on the layering because the graph and\n // layering may be out of sync. The layering matrix is manipulated to\n // generate different extreme alignments.\n _.forEach(layering, function(layer) {\n _.forEach(layer, function(v, order) {\n root[v] = v;\n align[v] = v;\n pos[v] = order;\n });\n });\n\n _.forEach(layering, function(layer) {\n var prevIdx = -1;\n _.forEach(layer, function(v) {\n var ws = neighborFn(v);\n if (ws.length) {\n ws = _.sortBy(ws, function(w) { return pos[w]; });\n var mp = (ws.length - 1) / 2;\n for (var i = Math.floor(mp), il = Math.ceil(mp); i <= il; ++i) {\n var w = ws[i];\n if (align[v] === v &&\n prevIdx < pos[w] &&\n !hasConflict(conflicts, v, w)) {\n align[w] = v;\n align[v] = root[v] = root[w];\n prevIdx = pos[w];\n }\n }\n }\n });\n });\n\n return { root: root, align: align };\n}\n\nfunction horizontalCompaction(g, layering, root, align, reverseSep) {\n // This portion of the algorithm differs from BK due to a number of problems.\n // Instead of their algorithm we construct a new block graph and do two\n // sweeps. The first sweep places blocks with the smallest possible\n // coordinates. The second sweep removes unused space by moving blocks to the\n // greatest coordinates without violating separation.\n var xs = {},\n blockG = buildBlockGraph(g, layering, root, reverseSep),\n borderType = reverseSep ? "borderLeft" : "borderRight";\n\n function iterate(setXsFunc, nextNodesFunc) {\n var stack = blockG.nodes();\n var elem = stack.pop();\n var visited = {};\n while (elem) {\n if (visited[elem]) {\n setXsFunc(elem);\n } else {\n visited[elem] = true;\n stack.push(elem);\n stack = stack.concat(nextNodesFunc(elem));\n }\n\n elem = stack.pop();\n }\n }\n\n // First pass, assign smallest coordinates\n function pass1(elem) {\n xs[elem] = blockG.inEdges(elem).reduce(function(acc, e) {\n return Math.max(acc, xs[e.v] + blockG.edge(e));\n }, 0);\n }\n\n // Second pass, assign greatest coordinates\n function pass2(elem) {\n var min = blockG.outEdges(elem).reduce(function(acc, e) {\n return Math.min(acc, xs[e.w] - blockG.edge(e));\n }, Number.POSITIVE_INFINITY);\n\n var node = g.node(elem);\n if (min !== Number.POSITIVE_INFINITY && node.borderType !== borderType) {\n xs[elem] = Math.max(xs[elem], min);\n }\n }\n\n iterate(pass1, blockG.predecessors.bind(blockG));\n iterate(pass2, blockG.successors.bind(blockG));\n\n // Assign x coordinates to all nodes\n _.forEach(align, function(v) {\n xs[v] = xs[root[v]];\n });\n\n return xs;\n}\n\n\nfunction buildBlockGraph(g, layering, root, reverseSep) {\n var blockGraph = new Graph(),\n graphLabel = g.graph(),\n sepFn = sep(graphLabel.nodesep, graphLabel.edgesep, reverseSep);\n\n _.forEach(layering, function(layer) {\n var u;\n _.forEach(layer, function(v) {\n var vRoot = root[v];\n blockGraph.setNode(vRoot);\n if (u) {\n var uRoot = root[u],\n prevMax = blockGraph.edge(uRoot, vRoot);\n blockGraph.setEdge(uRoot, vRoot, Math.max(sepFn(g, v, u), prevMax || 0));\n }\n u = v;\n });\n });\n\n return blockGraph;\n}\n\n/*\n * Returns the alignment that has the smallest width of the given alignments.\n */\nfunction findSmallestWidthAlignment(g, xss) {\n return _.minBy(_.values(xss), function (xs) {\n var max = Number.NEGATIVE_INFINITY;\n var min = Number.POSITIVE_INFINITY;\n\n _.forIn(xs, function (x, v) {\n var halfWidth = width(g, v) / 2;\n\n max = Math.max(x + halfWidth, max);\n min = Math.min(x - halfWidth, min);\n });\n\n return max - min;\n });\n}\n\n/*\n * Align the coordinates of each of the layout alignments such that\n * left-biased alignments have their minimum coordinate at the same point as\n * the minimum coordinate of the smallest width alignment and right-biased\n * alignments have their maximum coordinate at the same point as the maximum\n * coordinate of the smallest width alignment.\n */\nfunction alignCoordinates(xss, alignTo) {\n var alignToVals = _.values(alignTo),\n alignToMin = _.min(alignToVals),\n alignToMax = _.max(alignToVals);\n\n _.forEach(["u", "d"], function(vert) {\n _.forEach(["l", "r"], function(horiz) {\n var alignment = vert + horiz,\n xs = xss[alignment],\n delta;\n if (xs === alignTo) return;\n\n var xsVals = _.values(xs);\n delta = horiz === "l" ? alignToMin - _.min(xsVals) : alignToMax - _.max(xsVals);\n\n if (delta) {\n xss[alignment] = _.mapValues(xs, function(x) { return x + delta; });\n }\n });\n });\n}\n\nfunction balance(xss, align) {\n return _.mapValues(xss.ul, function(ignore, v) {\n if (align) {\n return xss[align.toLowerCase()][v];\n } else {\n var xs = _.sortBy(_.map(xss, v));\n return (xs[1] + xs[2]) / 2;\n }\n });\n}\n\nfunction positionX(g) {\n var layering = util.buildLayerMatrix(g);\n var conflicts = _.merge(\n findType1Conflicts(g, layering),\n findType2Conflicts(g, layering));\n\n var xss = {};\n var adjustedLayering;\n _.forEach(["u", "d"], function(vert) {\n adjustedLayering = vert === "u" ? layering : _.values(layering).reverse();\n _.forEach(["l", "r"], function(horiz) {\n if (horiz === "r") {\n adjustedLayering = _.map(adjustedLayering, function(inner) {\n return _.values(inner).reverse();\n });\n }\n\n var neighborFn = (vert === "u" ? g.predecessors : g.successors).bind(g);\n var align = verticalAlignment(g, adjustedLayering, conflicts, neighborFn);\n var xs = horizontalCompaction(g, adjustedLayering,\n align.root, align.align, horiz === "r");\n if (horiz === "r") {\n xs = _.mapValues(xs, function(x) { return -x; });\n }\n xss[vert + horiz] = xs;\n });\n });\n\n var smallestWidth = findSmallestWidthAlignment(g, xss);\n alignCoordinates(xss, smallestWidth);\n return balance(xss, g.graph().align);\n}\n\nfunction sep(nodeSep, edgeSep, reverseSep) {\n return function(g, v, w) {\n var vLabel = g.node(v);\n var wLabel = g.node(w);\n var sum = 0;\n var delta;\n\n sum += vLabel.width / 2;\n if (_.has(vLabel, "labelpos")) {\n switch (vLabel.labelpos.toLowerCase()) {\n case "l": delta = -vLabel.width / 2; break;\n case "r": delta = vLabel.width / 2; break;\n }\n }\n if (delta) {\n sum += reverseSep ? delta : -delta;\n }\n delta = 0;\n\n sum += (vLabel.dummy ? edgeSep : nodeSep) / 2;\n sum += (wLabel.dummy ? edgeSep : nodeSep) / 2;\n\n sum += wLabel.width / 2;\n if (_.has(wLabel, "labelpos")) {\n switch (wLabel.labelpos.toLowerCase()) {\n case "l": delta = wLabel.width / 2; break;\n case "r": delta = -wLabel.width / 2; break;\n }\n }\n if (delta) {\n sum += reverseSep ? delta : -delta;\n }\n delta = 0;\n\n return sum;\n };\n}\n\nfunction width(g, v) {\n return g.node(v).width;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZGFncmVqcy9saWIvcG9zaXRpb24vYmsuanM/ZTdiOCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBYTs7QUFFYixRQUFRLG1CQUFPLENBQUMsRUFBVztBQUMzQixZQUFZLG1CQUFPLENBQUMsRUFBYTtBQUNqQyxXQUFXLG1CQUFPLENBQUMsRUFBUzs7QUFFNUI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsS0FBSztBQUNMOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2YsY0FBYztBQUNkOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDLGVBQWUsRUFBRTtBQUN4RDtBQUNBLHdEQUF3RCxTQUFTO0FBQ2pFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7O0FBRUgsVUFBVTtBQUNWOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHOztBQUVIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0Esc0RBQXNELGtCQUFrQixFQUFFO0FBQzFFO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQ0FBMEMsV0FBVyxFQUFFO0FBQ3ZEO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsMENBQTBDO0FBQzFDLHlDQUF5QztBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekMsMENBQTBDO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBIiwiZmlsZSI6IjQ5NC5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG52YXIgXyA9IHJlcXVpcmUoXCIuLi9sb2Rhc2hcIik7XG52YXIgR3JhcGggPSByZXF1aXJlKFwiLi4vZ3JhcGhsaWJcIikuR3JhcGg7XG52YXIgdXRpbCA9IHJlcXVpcmUoXCIuLi91dGlsXCIpO1xuXG4vKlxuICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgY29vcmRpbmF0ZSBhc3NpZ25tZW50IGJhc2VkIG9uIEJyYW5kZXMgYW5kIEvDtnBmLCBcIkZhc3RcbiAqIGFuZCBTaW1wbGUgSG9yaXpvbnRhbCBDb29yZGluYXRlIEFzc2lnbm1lbnQuXCJcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgcG9zaXRpb25YOiBwb3NpdGlvblgsXG4gIGZpbmRUeXBlMUNvbmZsaWN0czogZmluZFR5cGUxQ29uZmxpY3RzLFxuICBmaW5kVHlwZTJDb25mbGljdHM6IGZpbmRUeXBlMkNvbmZsaWN0cyxcbiAgYWRkQ29uZmxpY3Q6IGFkZENvbmZsaWN0LFxuICBoYXNDb25mbGljdDogaGFzQ29uZmxpY3QsXG4gIHZlcnRpY2FsQWxpZ25tZW50OiB2ZXJ0aWNhbEFsaWdubWVudCxcbiAgaG9yaXpvbnRhbENvbXBhY3Rpb246IGhvcml6b250YWxDb21wYWN0aW9uLFxuICBhbGlnbkNvb3JkaW5hdGVzOiBhbGlnbkNvb3JkaW5hdGVzLFxuICBmaW5kU21hbGxlc3RXaWR0aEFsaWdubWVudDogZmluZFNtYWxsZXN0V2lkdGhBbGlnbm1lbnQsXG4gIGJhbGFuY2U6IGJhbGFuY2Vcbn07XG5cbi8qXG4gKiBNYXJrcyBhbGwgZWRnZXMgaW4gdGhlIGdyYXBoIHdpdGggYSB0eXBlLTEgY29uZmxpY3Qgd2l0aCB0aGUgXCJ0eXBlMUNvbmZsaWN0XCJcbiAqIHByb3BlcnR5LiBBIHR5cGUtMSBjb25mbGljdCBpcyBvbmUgd2hlcmUgYSBub24taW5uZXIgc2VnbWVudCBjcm9zc2VzIGFuXG4gKiBpbm5lciBzZWdtZW50LiBBbiBpbm5lciBzZWdtZW50IGlzIGFuIGVkZ2Ugd2l0aCBib3RoIGluY2lkZW50IG5vZGVzIG1hcmtlZFxuICogd2l0aCB0aGUgXCJkdW1teVwiIHByb3BlcnR5LlxuICpcbiAqIFRoaXMgYWxnb3JpdGhtIHNjYW5zIGxheWVyIGJ5IGxheWVyLCBzdGFydGluZyB3aXRoIHRoZSBzZWNvbmQsIGZvciB0eXBlLTFcbiAqIGNvbmZsaWN0cyBiZXR3ZWVuIHRoZSBjdXJyZW50IGxheWVyIGFuZCB0aGUgcHJldmlvdXMgbGF5ZXIuIEZvciBlYWNoIGxheWVyXG4gKiBpdCBzY2FucyB0aGUgbm9kZXMgZnJvbSBsZWZ0IHRvIHJpZ2h0IHVudGlsIGl0IHJlYWNoZXMgb25lIHRoYXQgaXMgaW5jaWRlbnRcbiAqIG9uIGFuIGlubmVyIHNlZ21lbnQuIEl0IHRoZW4gc2NhbnMgcHJlZGVjZXNzb3JzIHRvIGRldGVybWluZSBpZiB0aGV5IGhhdmVcbiAqIGVkZ2VzIHRoYXQgY3Jvc3MgdGhhdCBpbm5lciBzZWdtZW50LiBBdCB0aGUgZW5kIGEgZmluYWwgc2NhbiBpcyBkb25lIGZvciBhbGxcbiAqIG5vZGVzIG9uIHRoZSBjdXJyZW50IHJhbmsgdG8gc2VlIGlmIHRoZXkgY3Jvc3MgdGhlIGxhc3QgdmlzaXRlZCBpbm5lclxuICogc2VnbWVudC5cbiAqXG4gKiBUaGlzIGFsZ29yaXRobSAoc2FmZWx5KSBhc3N1bWVzIHRoYXQgYSBkdW1teSBub2RlIHdpbGwgb25seSBiZSBpbmNpZGVudCBvbiBhXG4gKiBzaW5nbGUgbm9kZSBpbiB0aGUgbGF5ZXJzIGJlaW5nIHNjYW5uZWQuXG4gKi9cbmZ1bmN0aW9uIGZpbmRUeXBlMUNvbmZsaWN0cyhnLCBsYXllcmluZykge1xuICB2YXIgY29uZmxpY3RzID0ge307XG5cbiAgZnVuY3Rpb24gdmlzaXRMYXllcihwcmV2TGF5ZXIsIGxheWVyKSB7XG4gICAgdmFyXG4gICAgICAvLyBsYXN0IHZpc2l0ZWQgbm9kZSBpbiB0aGUgcHJldmlvdXMgbGF5ZXIgdGhhdCBpcyBpbmNpZGVudCBvbiBhbiBpbm5lclxuICAgICAgLy8gc2VnbWVudC5cbiAgICAgIGswID0gMCxcbiAgICAgIC8vIFRyYWNrcyB0aGUgbGFzdCBub2RlIGluIHRoaXMgbGF5ZXIgc2Nhbm5lZCBmb3IgY3Jvc3NpbmdzIHdpdGggYSB0eXBlLTFcbiAgICAgIC8vIHNlZ21lbnQuXG4gICAgICBzY2FuUG9zID0gMCxcbiAgICAgIHByZXZMYXllckxlbmd0aCA9IHByZXZMYXllci5sZW5ndGgsXG4gICAgICBsYXN0Tm9kZSA9IF8ubGFzdChsYXllcik7XG5cbiAgICBfLmZvckVhY2gobGF5ZXIsIGZ1bmN0aW9uKHYsIGkpIHtcbiAgICAgIHZhciB3ID0gZmluZE90aGVySW5uZXJTZWdtZW50Tm9kZShnLCB2KSxcbiAgICAgICAgazEgPSB3ID8gZy5ub2RlKHcpLm9yZGVyIDogcHJldkxheWVyTGVuZ3RoO1xuXG4gICAgICBpZiAodyB8fCB2ID09PSBsYXN0Tm9kZSkge1xuICAgICAgICBfLmZvckVhY2gobGF5ZXIuc2xpY2Uoc2NhblBvcywgaSArMSksIGZ1bmN0aW9uKHNjYW5Ob2RlKSB7XG4gICAgICAgICAgXy5mb3JFYWNoKGcucHJlZGVjZXNzb3JzKHNjYW5Ob2RlKSwgZnVuY3Rpb24odSkge1xuICAgICAgICAgICAgdmFyIHVMYWJlbCA9IGcubm9kZSh1KSxcbiAgICAgICAgICAgICAgdVBvcyA9IHVMYWJlbC5vcmRlcjtcbiAgICAgICAgICAgIGlmICgodVBvcyA8IGswIHx8IGsxIDwgdVBvcykgJiZcbiAgICAgICAgICAgICAgICAhKHVMYWJlbC5kdW1teSAmJiBnLm5vZGUoc2Nhbk5vZGUpLmR1bW15KSkge1xuICAgICAgICAgICAgICBhZGRDb25mbGljdChjb25mbGljdHMsIHUsIHNjYW5Ob2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHNjYW5Qb3MgPSBpICsgMTtcbiAgICAgICAgazAgPSBrMTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBsYXllcjtcbiAgfVxuXG4gIF8ucmVkdWNlKGxheWVyaW5nLCB2aXNpdExheWVyKTtcbiAgcmV0dXJuIGNvbmZsaWN0cztcbn1cblxuZnVuY3Rpb24gZmluZFR5cGUyQ29uZmxpY3RzKGcsIGxheWVyaW5nKSB7XG4gIHZhciBjb25mbGljdHMgPSB7fTtcblxuICBmdW5jdGlvbiBzY2FuKHNvdXRoLCBzb3V0aFBvcywgc291dGhFbmQsIHByZXZOb3J0aEJvcmRlciwgbmV4dE5vcnRoQm9yZGVyKSB7XG4gICAgdmFyIHY7XG4gICAgXy5mb3JFYWNoKF8ucmFuZ2Uoc291dGhQb3MsIHNvdXRoRW5kKSwgZnVuY3Rpb24oaSkge1xuICAgICAgdiA9IHNvdXRoW2ldO1xuICAgICAgaWYgKGcubm9kZSh2KS5kdW1teSkge1xuICAgICAgICBfLmZvckVhY2goZy5wcmVkZWNlc3NvcnModiksIGZ1bmN0aW9uKHUpIHtcbiAgICAgICAgICB2YXIgdU5vZGUgPSBnLm5vZGUodSk7XG4gICAgICAgICAgaWYgKHVOb2RlLmR1bW15ICYmXG4gICAgICAgICAgICAgICh1Tm9kZS5vcmRlciA8IHByZXZOb3J0aEJvcmRlciB8fCB1Tm9kZS5vcmRlciA+IG5leHROb3J0aEJvcmRlcikpIHtcbiAgICAgICAgICAgIGFkZENvbmZsaWN0KGNvbmZsaWN0cywgdSwgdik7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG5cbiAgZnVuY3Rpb24gdmlzaXRMYXllcihub3J0aCwgc291dGgpIHtcbiAgICB2YXIgcHJldk5vcnRoUG9zID0gLTEsXG4gICAgICBuZXh0Tm9ydGhQb3MsXG4gICAgICBzb3V0aFBvcyA9IDA7XG5cbiAgICBfLmZvckVhY2goc291dGgsIGZ1bmN0aW9uKHYsIHNvdXRoTG9va2FoZWFkKSB7XG4gICAgICBpZiAoZy5ub2RlKHYpLmR1bW15ID09PSBcImJvcmRlclwiKSB7XG4gICAgICAgIHZhciBwcmVkZWNlc3NvcnMgPSBnLnByZWRlY2Vzc29ycyh2KTtcbiAgICAgICAgaWYgKHByZWRlY2Vzc29ycy5sZW5ndGgpIHtcbiAgICAgICAgICBuZXh0Tm9ydGhQb3MgPSBnLm5vZGUocHJlZGVjZXNzb3JzWzBdKS5vcmRlcjtcbiAgICAgICAgICBzY2FuKHNvdXRoLCBzb3V0aFBvcywgc291dGhMb29rYWhlYWQsIHByZXZOb3J0aFBvcywgbmV4dE5vcnRoUG9zKTtcbiAgICAgICAgICBzb3V0aFBvcyA9IHNvdXRoTG9va2FoZWFkO1xuICAgICAgICAgIHByZXZOb3J0aFBvcyA9IG5leHROb3J0aFBvcztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgc2Nhbihzb3V0aCwgc291dGhQb3MsIHNvdXRoLmxlbmd0aCwgbmV4dE5vcnRoUG9zLCBub3J0aC5sZW5ndGgpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHNvdXRoO1xuICB9XG5cbiAgXy5yZWR1Y2UobGF5ZXJpbmcsIHZpc2l0TGF5ZXIpO1xuICByZXR1cm4gY29uZmxpY3RzO1xufVxuXG5mdW5jdGlvbiBmaW5kT3RoZXJJbm5lclNlZ21lbnROb2RlKGcsIHYpIHtcbiAgaWYgKGcubm9kZSh2KS5kdW1teSkge1xuICAgIHJldHVybiBfLmZpbmQoZy5wcmVkZWNlc3NvcnModiksIGZ1bmN0aW9uKHUpIHtcbiAgICAgIHJldHVybiBnLm5vZGUodSkuZHVtbXk7XG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYWRkQ29uZmxpY3QoY29uZmxpY3RzLCB2LCB3KSB7XG4gIGlmICh2ID4gdykge1xuICAgIHZhciB0bXAgPSB2O1xuICAgIHYgPSB3O1xuICAgIHcgPSB0bXA7XG4gIH1cblxuICB2YXIgY29uZmxpY3RzViA9IGNvbmZsaWN0c1t2XTtcbiAgaWYgKCFjb25mbGljdHNWKSB7XG4gICAgY29uZmxpY3RzW3ZdID0gY29uZmxpY3RzViA9IHt9O1xuICB9XG4gIGNvbmZsaWN0c1Zbd10gPSB0cnVlO1xufVxuXG5mdW5jdGlvbiBoYXNDb25mbGljdChjb25mbGljdHMsIHYsIHcpIHtcbiAgaWYgKHYgPiB3KSB7XG4gICAgdmFyIHRtcCA9IHY7XG4gICAgdiA9IHc7XG4gICAgdyA9IHRtcDtcbiAgfVxuICByZXR1cm4gXy5oYXMoY29uZmxpY3RzW3ZdLCB3KTtcbn1cblxuLypcbiAqIFRyeSB0byBhbGlnbiBub2RlcyBpbnRvIHZlcnRpY2FsIFwiYmxvY2tzXCIgd2hlcmUgcG9zc2libGUuIFRoaXMgYWxnb3JpdGhtXG4gKiBhdHRlbXB0cyB0byBhbGlnbiBhIG5vZGUgd2l0aCBvbmUgb2YgaXRzIG1lZGlhbiBuZWlnaGJvcnMuIElmIHRoZSBlZGdlXG4gKiBjb25uZWN0aW5nIGEgbmVpZ2hib3IgaXMgYSB0eXBlLTEgY29uZmxpY3QgdGhlbiB3ZSBpZ25vcmUgdGhhdCBwb3NzaWJpbGl0eS5cbiAqIElmIGEgcHJldmlvdXMgbm9kZSBoYXMgYWxyZWFkeSBmb3JtZWQgYSBibG9jayB3aXRoIGEgbm9kZSBhZnRlciB0aGUgbm9kZVxuICogd2UncmUgdHJ5aW5nIHRvIGZvcm0gYSBibG9jayB3aXRoLCB3ZSBhbHNvIGlnbm9yZSB0aGF0IHBvc3NpYmlsaXR5IC0gb3VyXG4gKiBibG9ja3Mgd291bGQgYmUgc3BsaXQgaW4gdGhhdCBzY2VuYXJpby5cbiAqL1xuZnVuY3Rpb24gdmVydGljYWxBbGlnbm1lbnQoZywgbGF5ZXJpbmcsIGNvbmZsaWN0cywgbmVpZ2hib3JGbikge1xuICB2YXIgcm9vdCA9IHt9LFxuICAgIGFsaWduID0ge30sXG4gICAgcG9zID0ge307XG5cbiAgLy8gV2UgY2FjaGUgdGhlIHBvc2l0aW9uIGhlcmUgYmFzZWQgb24gdGhlIGxheWVyaW5nIGJlY2F1c2UgdGhlIGdyYXBoIGFuZFxuICAvLyBsYXllcmluZyBtYXkgYmUgb3V0IG9mIHN5bmMuIFRoZSBsYXllcmluZyBtYXRyaXggaXMgbWFuaXB1bGF0ZWQgdG9cbiAgLy8gZ2VuZXJhdGUgZGlmZmVyZW50IGV4dHJlbWUgYWxpZ25tZW50cy5cbiAgXy5mb3JFYWNoKGxheWVyaW5nLCBmdW5jdGlvbihsYXllcikge1xuICAgIF8uZm9yRWFjaChsYXllciwgZnVuY3Rpb24odiwgb3JkZXIpIHtcbiAgICAgIHJvb3Rbdl0gPSB2O1xuICAgICAgYWxpZ25bdl0gPSB2O1xuICAgICAgcG9zW3ZdID0gb3JkZXI7XG4gICAgfSk7XG4gIH0pO1xuXG4gIF8uZm9yRWFjaChsYXllcmluZywgZnVuY3Rpb24obGF5ZXIpIHtcbiAgICB2YXIgcHJldklkeCA9IC0xO1xuICAgIF8uZm9yRWFjaChsYXllciwgZnVuY3Rpb24odikge1xuICAgICAgdmFyIHdzID0gbmVpZ2hib3JGbih2KTtcbiAgICAgIGlmICh3cy5sZW5ndGgpIHtcbiAgICAgICAgd3MgPSBfLnNvcnRCeSh3cywgZnVuY3Rpb24odykgeyByZXR1cm4gcG9zW3ddOyB9KTtcbiAgICAgICAgdmFyIG1wID0gKHdzLmxlbmd0aCAtIDEpIC8gMjtcbiAgICAgICAgZm9yICh2YXIgaSA9IE1hdGguZmxvb3IobXApLCBpbCA9IE1hdGguY2VpbChtcCk7IGkgPD0gaWw7ICsraSkge1xuICAgICAgICAgIHZhciB3ID0gd3NbaV07XG4gICAgICAgICAgaWYgKGFsaWduW3ZdID09PSB2ICYmXG4gICAgICAgICAgICAgIHByZXZJZHggPCBwb3Nbd10gJiZcbiAgICAgICAgICAgICAgIWhhc0NvbmZsaWN0KGNvbmZsaWN0cywgdiwgdykpIHtcbiAgICAgICAgICAgIGFsaWduW3ddID0gdjtcbiAgICAgICAgICAgIGFsaWduW3ZdID0gcm9vdFt2XSA9IHJvb3Rbd107XG4gICAgICAgICAgICBwcmV2SWR4ID0gcG9zW3ddO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9KTtcblxuICByZXR1cm4geyByb290OiByb290LCBhbGlnbjogYWxpZ24gfTtcbn1cblxuZnVuY3Rpb24gaG9yaXpvbnRhbENvbXBhY3Rpb24oZywgbGF5ZXJpbmcsIHJvb3QsIGFsaWduLCByZXZlcnNlU2VwKSB7XG4gIC8vIFRoaXMgcG9ydGlvbiBvZiB0aGUgYWxnb3JpdGhtIGRpZmZlcnMgZnJvbSBCSyBkdWUgdG8gYSBudW1iZXIgb2YgcHJvYmxlbXMuXG4gIC8vIEluc3RlYWQgb2YgdGhlaXIgYWxnb3JpdGhtIHdlIGNvbnN0cnVjdCBhIG5ldyBibG9jayBncmFwaCBhbmQgZG8gdHdvXG4gIC8vIHN3ZWVwcy4gVGhlIGZpcnN0IHN3ZWVwIHBsYWNlcyBibG9ja3Mgd2l0aCB0aGUgc21hbGxlc3QgcG9zc2libGVcbiAgLy8gY29vcmRpbmF0ZXMuIFRoZSBzZWNvbmQgc3dlZXAgcmVtb3ZlcyB1bnVzZWQgc3BhY2UgYnkgbW92aW5nIGJsb2NrcyB0byB0aGVcbiAgLy8gZ3JlYXRlc3QgY29vcmRpbmF0ZXMgd2l0aG91dCB2aW9sYXRpbmcgc2VwYXJhdGlvbi5cbiAgdmFyIHhzID0ge30sXG4gICAgYmxvY2tHID0gYnVpbGRCbG9ja0dyYXBoKGcsIGxheWVyaW5nLCByb290LCByZXZlcnNlU2VwKSxcbiAgICBib3JkZXJUeXBlID0gcmV2ZXJzZVNlcCA/IFwiYm9yZGVyTGVmdFwiIDogXCJib3JkZXJSaWdodFwiO1xuXG4gIGZ1bmN0aW9uIGl0ZXJhdGUoc2V0WHNGdW5jLCBuZXh0Tm9kZXNGdW5jKSB7XG4gICAgdmFyIHN0YWNrID0gYmxvY2tHLm5vZGVzKCk7XG4gICAgdmFyIGVsZW0gPSBzdGFjay5wb3AoKTtcbiAgICB2YXIgdmlzaXRlZCA9IHt9O1xuICAgIHdoaWxlIChlbGVtKSB7XG4gICAgICBpZiAodmlzaXRlZFtlbGVtXSkge1xuICAgICAgICBzZXRYc0Z1bmMoZWxlbSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2aXNpdGVkW2VsZW1dID0gdHJ1ZTtcbiAgICAgICAgc3RhY2sucHVzaChlbGVtKTtcbiAgICAgICAgc3RhY2sgPSBzdGFjay5jb25jYXQobmV4dE5vZGVzRnVuYyhlbGVtKSk7XG4gICAgICB9XG5cbiAgICAgIGVsZW0gPSBzdGFjay5wb3AoKTtcbiAgICB9XG4gIH1cblxuICAvLyBGaXJzdCBwYXNzLCBhc3NpZ24gc21hbGxlc3QgY29vcmRpbmF0ZXNcbiAgZnVuY3Rpb24gcGFzczEoZWxlbSkge1xuICAgIHhzW2VsZW1dID0gYmxvY2tHLmluRWRnZXMoZWxlbSkucmVkdWNlKGZ1bmN0aW9uKGFjYywgZSkge1xuICAgICAgcmV0dXJuIE1hdGgubWF4KGFjYywgeHNbZS52XSArIGJsb2NrRy5lZGdlKGUpKTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIC8vIFNlY29uZCBwYXNzLCBhc3NpZ24gZ3JlYXRlc3QgY29vcmRpbmF0ZXNcbiAgZnVuY3Rpb24gcGFzczIoZWxlbSkge1xuICAgIHZhciBtaW4gPSBibG9ja0cub3V0RWRnZXMoZWxlbSkucmVkdWNlKGZ1bmN0aW9uKGFjYywgZSkge1xuICAgICAgcmV0dXJuIE1hdGgubWluKGFjYywgeHNbZS53XSAtIGJsb2NrRy5lZGdlKGUpKTtcbiAgICB9LCBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpO1xuXG4gICAgdmFyIG5vZGUgPSBnLm5vZGUoZWxlbSk7XG4gICAgaWYgKG1pbiAhPT0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZICYmIG5vZGUuYm9yZGVyVHlwZSAhPT0gYm9yZGVyVHlwZSkge1xuICAgICAgeHNbZWxlbV0gPSBNYXRoLm1heCh4c1tlbGVtXSwgbWluKTtcbiAgICB9XG4gIH1cblxuICBpdGVyYXRlKHBhc3MxLCBibG9ja0cucHJlZGVjZXNzb3JzLmJpbmQoYmxvY2tHKSk7XG4gIGl0ZXJhdGUocGFzczIsIGJsb2NrRy5zdWNjZXNzb3JzLmJpbmQoYmxvY2tHKSk7XG5cbiAgLy8gQXNzaWduIHggY29vcmRpbmF0ZXMgdG8gYWxsIG5vZGVzXG4gIF8uZm9yRWFjaChhbGlnbiwgZnVuY3Rpb24odikge1xuICAgIHhzW3ZdID0geHNbcm9vdFt2XV07XG4gIH0pO1xuXG4gIHJldHVybiB4cztcbn1cblxuXG5mdW5jdGlvbiBidWlsZEJsb2NrR3JhcGgoZywgbGF5ZXJpbmcsIHJvb3QsIHJldmVyc2VTZXApIHtcbiAgdmFyIGJsb2NrR3JhcGggPSBuZXcgR3JhcGgoKSxcbiAgICBncmFwaExhYmVsID0gZy5ncmFwaCgpLFxuICAgIHNlcEZuID0gc2VwKGdyYXBoTGFiZWwubm9kZXNlcCwgZ3JhcGhMYWJlbC5lZGdlc2VwLCByZXZlcnNlU2VwKTtcblxuICBfLmZvckVhY2gobGF5ZXJpbmcsIGZ1bmN0aW9uKGxheWVyKSB7XG4gICAgdmFyIHU7XG4gICAgXy5mb3JFYWNoKGxheWVyLCBmdW5jdGlvbih2KSB7XG4gICAgICB2YXIgdlJvb3QgPSByb290W3ZdO1xuICAgICAgYmxvY2tHcmFwaC5zZXROb2RlKHZSb290KTtcbiAgICAgIGlmICh1KSB7XG4gICAgICAgIHZhciB1Um9vdCA9IHJvb3RbdV0sXG4gICAgICAgICAgcHJldk1heCA9IGJsb2NrR3JhcGguZWRnZSh1Um9vdCwgdlJvb3QpO1xuICAgICAgICBibG9ja0dyYXBoLnNldEVkZ2UodVJvb3QsIHZSb290LCBNYXRoLm1heChzZXBGbihnLCB2LCB1KSwgcHJldk1heCB8fCAwKSk7XG4gICAgICB9XG4gICAgICB1ID0gdjtcbiAgICB9KTtcbiAgfSk7XG5cbiAgcmV0dXJuIGJsb2NrR3JhcGg7XG59XG5cbi8qXG4gKiBSZXR1cm5zIHRoZSBhbGlnbm1lbnQgdGhhdCBoYXMgdGhlIHNtYWxsZXN0IHdpZHRoIG9mIHRoZSBnaXZlbiBhbGlnbm1lbnRzLlxuICovXG5mdW5jdGlvbiBmaW5kU21hbGxlc3RXaWR0aEFsaWdubWVudChnLCB4c3MpIHtcbiAgcmV0dXJuIF8ubWluQnkoXy52YWx1ZXMoeHNzKSwgZnVuY3Rpb24gKHhzKSB7XG4gICAgdmFyIG1heCA9IE51bWJlci5ORUdBVElWRV9JTkZJTklUWTtcbiAgICB2YXIgbWluID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1xuXG4gICAgXy5mb3JJbih4cywgZnVuY3Rpb24gKHgsIHYpIHtcbiAgICAgIHZhciBoYWxmV2lkdGggPSB3aWR0aChnLCB2KSAvIDI7XG5cbiAgICAgIG1heCA9IE1hdGgubWF4KHggKyBoYWxmV2lkdGgsIG1heCk7XG4gICAgICBtaW4gPSBNYXRoLm1pbih4IC0gaGFsZldpZHRoLCBtaW4pO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIG1heCAtIG1pbjtcbiAgfSk7XG59XG5cbi8qXG4gKiBBbGlnbiB0aGUgY29vcmRpbmF0ZXMgb2YgZWFjaCBvZiB0aGUgbGF5b3V0IGFsaWdubWVudHMgc3VjaCB0aGF0XG4gKiBsZWZ0LWJpYXNlZCBhbGlnbm1lbnRzIGhhdmUgdGhlaXIgbWluaW11bSBjb29yZGluYXRlIGF0IHRoZSBzYW1lIHBvaW50IGFzXG4gKiB0aGUgbWluaW11bSBjb29yZGluYXRlIG9mIHRoZSBzbWFsbGVzdCB3aWR0aCBhbGlnbm1lbnQgYW5kIHJpZ2h0LWJpYXNlZFxuICogYWxpZ25tZW50cyBoYXZlIHRoZWlyIG1heGltdW0gY29vcmRpbmF0ZSBhdCB0aGUgc2FtZSBwb2ludCBhcyB0aGUgbWF4aW11bVxuICogY29vcmRpbmF0ZSBvZiB0aGUgc21hbGxlc3Qgd2lkdGggYWxpZ25tZW50LlxuICovXG5mdW5jdGlvbiBhbGlnbkNvb3JkaW5hdGVzKHhzcywgYWxpZ25Ubykge1xuICB2YXIgYWxpZ25Ub1ZhbHMgPSBfLnZhbHVlcyhhbGlnblRvKSxcbiAgICBhbGlnblRvTWluID0gXy5taW4oYWxpZ25Ub1ZhbHMpLFxuICAgIGFsaWduVG9NYXggPSBfLm1heChhbGlnblRvVmFscyk7XG5cbiAgXy5mb3JFYWNoKFtcInVcIiwgXCJkXCJdLCBmdW5jdGlvbih2ZXJ0KSB7XG4gICAgXy5mb3JFYWNoKFtcImxcIiwgXCJyXCJdLCBmdW5jdGlvbihob3Jpeikge1xuICAgICAgdmFyIGFsaWdubWVudCA9IHZlcnQgKyBob3JpeixcbiAgICAgICAgeHMgPSB4c3NbYWxpZ25tZW50XSxcbiAgICAgICAgZGVsdGE7XG4gICAgICBpZiAoeHMgPT09IGFsaWduVG8pIHJldHVybjtcblxuICAgICAgdmFyIHhzVmFscyA9IF8udmFsdWVzKHhzKTtcbiAgICAgIGRlbHRhID0gaG9yaXogPT09IFwibFwiID8gYWxpZ25Ub01pbiAtIF8ubWluKHhzVmFscykgOiBhbGlnblRvTWF4IC0gXy5tYXgoeHNWYWxzKTtcblxuICAgICAgaWYgKGRlbHRhKSB7XG4gICAgICAgIHhzc1thbGlnbm1lbnRdID0gXy5tYXBWYWx1ZXMoeHMsIGZ1bmN0aW9uKHgpIHsgcmV0dXJuIHggKyBkZWx0YTsgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBiYWxhbmNlKHhzcywgYWxpZ24pIHtcbiAgcmV0dXJuIF8ubWFwVmFsdWVzKHhzcy51bCwgZnVuY3Rpb24oaWdub3JlLCB2KSB7XG4gICAgaWYgKGFsaWduKSB7XG4gICAgICByZXR1cm4geHNzW2FsaWduLnRvTG93ZXJDYXNlKCldW3ZdO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgeHMgPSBfLnNvcnRCeShfLm1hcCh4c3MsIHYpKTtcbiAgICAgIHJldHVybiAoeHNbMV0gKyB4c1syXSkgLyAyO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHBvc2l0aW9uWChnKSB7XG4gIHZhciBsYXllcmluZyA9IHV0aWwuYnVpbGRMYXllck1hdHJpeChnKTtcbiAgdmFyIGNvbmZsaWN0cyA9IF8ubWVyZ2UoXG4gICAgZmluZFR5cGUxQ29uZmxpY3RzKGcsIGxheWVyaW5nKSxcbiAgICBmaW5kVHlwZTJDb25mbGljdHMoZywgbGF5ZXJpbmcpKTtcblxuICB2YXIgeHNzID0ge307XG4gIHZhciBhZGp1c3RlZExheWVyaW5nO1xuICBfLmZvckVhY2goW1widVwiLCBcImRcIl0sIGZ1bmN0aW9uKHZlcnQpIHtcbiAgICBhZGp1c3RlZExheWVyaW5nID0gdmVydCA9PT0gXCJ1XCIgPyBsYXllcmluZyA6IF8udmFsdWVzKGxheWVyaW5nKS5yZXZlcnNlKCk7XG4gICAgXy5mb3JFYWNoKFtcImxcIiwgXCJyXCJdLCBmdW5jdGlvbihob3Jpeikge1xuICAgICAgaWYgKGhvcml6ID09PSBcInJcIikge1xuICAgICAgICBhZGp1c3RlZExheWVyaW5nID0gXy5tYXAoYWRqdXN0ZWRMYXllcmluZywgZnVuY3Rpb24oaW5uZXIpIHtcbiAgICAgICAgICByZXR1cm4gXy52YWx1ZXMoaW5uZXIpLnJldmVyc2UoKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBuZWlnaGJvckZuID0gKHZlcnQgPT09IFwidVwiID8gZy5wcmVkZWNlc3NvcnMgOiBnLnN1Y2Nlc3NvcnMpLmJpbmQoZyk7XG4gICAgICB2YXIgYWxpZ24gPSB2ZXJ0aWNhbEFsaWdubWVudChnLCBhZGp1c3RlZExheWVyaW5nLCBjb25mbGljdHMsIG5laWdoYm9yRm4pO1xuICAgICAgdmFyIHhzID0gaG9yaXpvbnRhbENvbXBhY3Rpb24oZywgYWRqdXN0ZWRMYXllcmluZyxcbiAgICAgICAgYWxpZ24ucm9vdCwgYWxpZ24uYWxpZ24sIGhvcml6ID09PSBcInJcIik7XG4gICAgICBpZiAoaG9yaXogPT09IFwiclwiKSB7XG4gICAgICAgIHhzID0gXy5tYXBWYWx1ZXMoeHMsIGZ1bmN0aW9uKHgpIHsgcmV0dXJuIC14OyB9KTtcbiAgICAgIH1cbiAgICAgIHhzc1t2ZXJ0ICsgaG9yaXpdID0geHM7XG4gICAgfSk7XG4gIH0pO1xuXG4gIHZhciBzbWFsbGVzdFdpZHRoID0gZmluZFNtYWxsZXN0V2lkdGhBbGlnbm1lbnQoZywgeHNzKTtcbiAgYWxpZ25Db29yZGluYXRlcyh4c3MsIHNtYWxsZXN0V2lkdGgpO1xuICByZXR1cm4gYmFsYW5jZSh4c3MsIGcuZ3JhcGgoKS5hbGlnbik7XG59XG5cbmZ1bmN0aW9uIHNlcChub2RlU2VwLCBlZGdlU2VwLCByZXZlcnNlU2VwKSB7XG4gIHJldHVybiBmdW5jdGlvbihnLCB2LCB3KSB7XG4gICAgdmFyIHZMYWJlbCA9IGcubm9kZSh2KTtcbiAgICB2YXIgd0xhYmVsID0gZy5ub2RlKHcpO1xuICAgIHZhciBzdW0gPSAwO1xuICAgIHZhciBkZWx0YTtcblxuICAgIHN1bSArPSB2TGFiZWwud2lkdGggLyAyO1xuICAgIGlmIChfLmhhcyh2TGFiZWwsIFwibGFiZWxwb3NcIikpIHtcbiAgICAgIHN3aXRjaCAodkxhYmVsLmxhYmVscG9zLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgIGNhc2UgXCJsXCI6IGRlbHRhID0gLXZMYWJlbC53aWR0aCAvIDI7IGJyZWFrO1xuICAgICAgY2FzZSBcInJcIjogZGVsdGEgPSB2TGFiZWwud2lkdGggLyAyOyBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGRlbHRhKSB7XG4gICAgICBzdW0gKz0gcmV2ZXJzZVNlcCA/IGRlbHRhIDogLWRlbHRhO1xuICAgIH1cbiAgICBkZWx0YSA9IDA7XG5cbiAgICBzdW0gKz0gKHZMYWJlbC5kdW1teSA/IGVkZ2VTZXAgOiBub2RlU2VwKSAvIDI7XG4gICAgc3VtICs9ICh3TGFiZWwuZHVtbXkgPyBlZGdlU2VwIDogbm9kZVNlcCkgLyAyO1xuXG4gICAgc3VtICs9IHdMYWJlbC53aWR0aCAvIDI7XG4gICAgaWYgKF8uaGFzKHdMYWJlbCwgXCJsYWJlbHBvc1wiKSkge1xuICAgICAgc3dpdGNoICh3TGFiZWwubGFiZWxwb3MudG9Mb3dlckNhc2UoKSkge1xuICAgICAgY2FzZSBcImxcIjogZGVsdGEgPSB3TGFiZWwud2lkdGggLyAyOyBicmVhaztcbiAgICAgIGNhc2UgXCJyXCI6IGRlbHRhID0gLXdMYWJlbC53aWR0aCAvIDI7IGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZGVsdGEpIHtcbiAgICAgIHN1bSArPSByZXZlcnNlU2VwID8gZGVsdGEgOiAtZGVsdGE7XG4gICAgfVxuICAgIGRlbHRhID0gMDtcblxuICAgIHJldHVybiBzdW07XG4gIH07XG59XG5cbmZ1bmN0aW9uIHdpZHRoKGcsIHYpIHtcbiAgcmV0dXJuIGcubm9kZSh2KS53aWR0aDtcbn1cbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///494\n')},function(module,exports,__webpack_require__){"use strict";eval("\n\nvar _ = __webpack_require__(28);\n\nmodule.exports = initDataOrder;\n\n\n/**\n * 按照数据中的结果设置fixorder\n */\nfunction initDataOrder(g, nodeOrder) {\n var simpleNodes = _.filter(g.nodes(), function(v) {\n return !g.children(v).length;\n });\n var maxRank = _.max(_.map(simpleNodes, function(v) { return g.node(v).rank; }));\n var layers = _.map(_.range(maxRank + 1), function() { return []; });\n _.forEach(nodeOrder, function(n) {\n var node = g.node(n);\n // 只考虑原有节点,dummy节点需要按照后续算法排出\n if (node.dummy) {\n return;\n }\n node.fixorder = layers[node.rank].length; // 设置fixorder为当层的顺序\n layers[node.rank].push(n);\n });\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZGFncmVqcy9saWIvb3JkZXIvaW5pdC1kYXRhLW9yZGVyLmpzPzRiNzgiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWIsUUFBUSxtQkFBTyxDQUFDLEVBQVc7O0FBRTNCOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsc0RBQXNELHVCQUF1QixFQUFFO0FBQy9FLHVEQUF1RCxXQUFXLEVBQUU7QUFDcEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDO0FBQzdDO0FBQ0EsR0FBRztBQUNIIiwiZmlsZSI6IjQ5NS5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG52YXIgXyA9IHJlcXVpcmUoXCIuLi9sb2Rhc2hcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gaW5pdERhdGFPcmRlcjtcblxuXG4vKipcbiAqIOaMieeFp+aVsOaNruS4reeahOe7k+aenOiuvue9rmZpeG9yZGVyXG4gKi9cbmZ1bmN0aW9uIGluaXREYXRhT3JkZXIoZywgbm9kZU9yZGVyKSB7XG4gIHZhciBzaW1wbGVOb2RlcyA9IF8uZmlsdGVyKGcubm9kZXMoKSwgZnVuY3Rpb24odikge1xuICAgIHJldHVybiAhZy5jaGlsZHJlbih2KS5sZW5ndGg7XG4gIH0pO1xuICB2YXIgbWF4UmFuayA9IF8ubWF4KF8ubWFwKHNpbXBsZU5vZGVzLCBmdW5jdGlvbih2KSB7IHJldHVybiBnLm5vZGUodikucmFuazsgfSkpO1xuICB2YXIgbGF5ZXJzID0gXy5tYXAoXy5yYW5nZShtYXhSYW5rICsgMSksIGZ1bmN0aW9uKCkgeyByZXR1cm4gW107IH0pO1xuICBfLmZvckVhY2gobm9kZU9yZGVyLCBmdW5jdGlvbihuKSB7XG4gICAgdmFyIG5vZGUgPSBnLm5vZGUobik7XG4gICAgLy8g5Y+q6ICD6JmR5Y6f5pyJ6IqC54K577yMZHVtbXnoioLngrnpnIDopoHmjInnhaflkI7nu63nrpfms5XmjpLlh7pcbiAgICBpZiAobm9kZS5kdW1teSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBub2RlLmZpeG9yZGVyID0gbGF5ZXJzW25vZGUucmFua10ubGVuZ3RoOyAvLyDorr7nva5maXhvcmRlcuS4uuW9k+WxgueahOmhuuW6j1xuICAgIGxheWVyc1tub2RlLnJhbmtdLnB1c2gobik7XG4gIH0pO1xufSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///495\n")},function(module,exports,__webpack_require__){eval('var _ = __webpack_require__(28);\nvar util = __webpack_require__(36);\nvar Graph = __webpack_require__(46).Graph;\n\nmodule.exports = {\n debugOrdering: debugOrdering\n};\n\n/* istanbul ignore next */\nfunction debugOrdering(g) {\n var layerMatrix = util.buildLayerMatrix(g);\n\n var h = new Graph({ compound: true, multigraph: true }).setGraph({});\n\n _.forEach(g.nodes(), function(v) {\n h.setNode(v, { label: v });\n h.setParent(v, "layer" + g.node(v).rank);\n });\n\n _.forEach(g.edges(), function(e) {\n h.setEdge(e.v, e.w, {}, e.name);\n });\n\n _.forEach(layerMatrix, function(layer, i) {\n var layerV = "layer" + i;\n h.setNode(layerV, { rank: "same" });\n _.reduce(layer, function(u, v) {\n h.setEdge(u, v, { style: "invis" });\n return v;\n });\n });\n\n return h;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZGFncmVqcy9saWIvZGVidWcuanM/YTI0YyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxRQUFRLG1CQUFPLENBQUMsRUFBVTtBQUMxQixXQUFXLG1CQUFPLENBQUMsRUFBUTtBQUMzQixZQUFZLG1CQUFPLENBQUMsRUFBWTs7QUFFaEM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxxQkFBcUIsbUNBQW1DLGFBQWE7O0FBRXJFO0FBQ0Esa0JBQWtCLFdBQVc7QUFDN0I7QUFDQSxHQUFHOztBQUVIO0FBQ0EsMEJBQTBCO0FBQzFCLEdBQUc7O0FBRUg7QUFDQTtBQUNBLHVCQUF1QixlQUFlO0FBQ3RDO0FBQ0EsdUJBQXVCLGlCQUFpQjtBQUN4QztBQUNBLEtBQUs7QUFDTCxHQUFHOztBQUVIO0FBQ0EiLCJmaWxlIjoiNDk2LmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIF8gPSByZXF1aXJlKFwiLi9sb2Rhc2hcIik7XG52YXIgdXRpbCA9IHJlcXVpcmUoXCIuL3V0aWxcIik7XG52YXIgR3JhcGggPSByZXF1aXJlKFwiLi9ncmFwaGxpYlwiKS5HcmFwaDtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGRlYnVnT3JkZXJpbmc6IGRlYnVnT3JkZXJpbmdcbn07XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5mdW5jdGlvbiBkZWJ1Z09yZGVyaW5nKGcpIHtcbiAgdmFyIGxheWVyTWF0cml4ID0gdXRpbC5idWlsZExheWVyTWF0cml4KGcpO1xuXG4gIHZhciBoID0gbmV3IEdyYXBoKHsgY29tcG91bmQ6IHRydWUsIG11bHRpZ3JhcGg6IHRydWUgfSkuc2V0R3JhcGgoe30pO1xuXG4gIF8uZm9yRWFjaChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICBoLnNldE5vZGUodiwgeyBsYWJlbDogdiB9KTtcbiAgICBoLnNldFBhcmVudCh2LCBcImxheWVyXCIgKyBnLm5vZGUodikucmFuayk7XG4gIH0pO1xuXG4gIF8uZm9yRWFjaChnLmVkZ2VzKCksIGZ1bmN0aW9uKGUpIHtcbiAgICBoLnNldEVkZ2UoZS52LCBlLncsIHt9LCBlLm5hbWUpO1xuICB9KTtcblxuICBfLmZvckVhY2gobGF5ZXJNYXRyaXgsIGZ1bmN0aW9uKGxheWVyLCBpKSB7XG4gICAgdmFyIGxheWVyViA9IFwibGF5ZXJcIiArIGk7XG4gICAgaC5zZXROb2RlKGxheWVyViwgeyByYW5rOiBcInNhbWVcIiB9KTtcbiAgICBfLnJlZHVjZShsYXllciwgZnVuY3Rpb24odSwgdikge1xuICAgICAgaC5zZXRFZGdlKHUsIHYsIHsgc3R5bGU6IFwiaW52aXNcIiB9KTtcbiAgICAgIHJldHVybiB2O1xuICAgIH0pO1xuICB9KTtcblxuICByZXR1cm4gaDtcbn1cbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///496\n')},function(module,exports){eval('module.exports = "0.1.1";\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZGFncmVqcy9saWIvdmVyc2lvbi5qcz9iMTM2Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBIiwiZmlsZSI6IjQ5Ny5qcyIsInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gXCIwLjEuMVwiO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///497\n')},function(module,exports,__webpack_require__){eval('/**\n * Copyright (c) 2014-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nvar runtime = (function (exports) {\n "use strict";\n\n var Op = Object.prototype;\n var hasOwn = Op.hasOwnProperty;\n var undefined; // More compressible than void 0.\n var $Symbol = typeof Symbol === "function" ? Symbol : {};\n var iteratorSymbol = $Symbol.iterator || "@@iterator";\n var asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator";\n var toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag";\n\n function define(obj, key, value) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n return obj[key];\n }\n try {\n // IE 8 has a broken Object.defineProperty that only works on DOM objects.\n define({}, "");\n } catch (err) {\n define = function(obj, key, value) {\n return obj[key] = value;\n };\n }\n\n function wrap(innerFn, outerFn, self, tryLocsList) {\n // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.\n var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;\n var generator = Object.create(protoGenerator.prototype);\n var context = new Context(tryLocsList || []);\n\n // The ._invoke method unifies the implementations of the .next,\n // .throw, and .return methods.\n generator._invoke = makeInvokeMethod(innerFn, self, context);\n\n return generator;\n }\n exports.wrap = wrap;\n\n // Try/catch helper to minimize deoptimizations. Returns a completion\n // record like context.tryEntries[i].completion. This interface could\n // have been (and was previously) designed to take a closure to be\n // invoked without arguments, but in all the cases we care about we\n // already have an existing method we want to call, so there\'s no need\n // to create a new function object. We can even get away with assuming\n // the method takes exactly one argument, since that happens to be true\n // in every case, so we don\'t have to touch the arguments object. The\n // only additional allocation required is the completion record, which\n // has a stable shape and so hopefully should be cheap to allocate.\n function tryCatch(fn, obj, arg) {\n try {\n return { type: "normal", arg: fn.call(obj, arg) };\n } catch (err) {\n return { type: "throw", arg: err };\n }\n }\n\n var GenStateSuspendedStart = "suspendedStart";\n var GenStateSuspendedYield = "suspendedYield";\n var GenStateExecuting = "executing";\n var GenStateCompleted = "completed";\n\n // Returning this object from the innerFn has the same effect as\n // breaking out of the dispatch switch statement.\n var ContinueSentinel = {};\n\n // Dummy constructor functions that we use as the .constructor and\n // .constructor.prototype properties for functions that return Generator\n // objects. For full spec compliance, you may wish to configure your\n // minifier not to mangle the names of these two functions.\n function Generator() {}\n function GeneratorFunction() {}\n function GeneratorFunctionPrototype() {}\n\n // This is a polyfill for %IteratorPrototype% for environments that\n // don\'t natively support it.\n var IteratorPrototype = {};\n define(IteratorPrototype, iteratorSymbol, function () {\n return this;\n });\n\n var getProto = Object.getPrototypeOf;\n var NativeIteratorPrototype = getProto && getProto(getProto(values([])));\n if (NativeIteratorPrototype &&\n NativeIteratorPrototype !== Op &&\n hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {\n // This environment has a native %IteratorPrototype%; use it instead\n // of the polyfill.\n IteratorPrototype = NativeIteratorPrototype;\n }\n\n var Gp = GeneratorFunctionPrototype.prototype =\n Generator.prototype = Object.create(IteratorPrototype);\n GeneratorFunction.prototype = GeneratorFunctionPrototype;\n define(Gp, "constructor", GeneratorFunctionPrototype);\n define(GeneratorFunctionPrototype, "constructor", GeneratorFunction);\n GeneratorFunction.displayName = define(\n GeneratorFunctionPrototype,\n toStringTagSymbol,\n "GeneratorFunction"\n );\n\n // Helper for defining the .next, .throw, and .return methods of the\n // Iterator interface in terms of a single ._invoke method.\n function defineIteratorMethods(prototype) {\n ["next", "throw", "return"].forEach(function(method) {\n define(prototype, method, function(arg) {\n return this._invoke(method, arg);\n });\n });\n }\n\n exports.isGeneratorFunction = function(genFun) {\n var ctor = typeof genFun === "function" && genFun.constructor;\n return ctor\n ? ctor === GeneratorFunction ||\n // For the native GeneratorFunction constructor, the best we can\n // do is to check its .name property.\n (ctor.displayName || ctor.name) === "GeneratorFunction"\n : false;\n };\n\n exports.mark = function(genFun) {\n if (Object.setPrototypeOf) {\n Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);\n } else {\n genFun.__proto__ = GeneratorFunctionPrototype;\n define(genFun, toStringTagSymbol, "GeneratorFunction");\n }\n genFun.prototype = Object.create(Gp);\n return genFun;\n };\n\n // Within the body of any async function, `await x` is transformed to\n // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test\n // `hasOwn.call(value, "__await")` to determine if the yielded value is\n // meant to be awaited.\n exports.awrap = function(arg) {\n return { __await: arg };\n };\n\n function AsyncIterator(generator, PromiseImpl) {\n function invoke(method, arg, resolve, reject) {\n var record = tryCatch(generator[method], generator, arg);\n if (record.type === "throw") {\n reject(record.arg);\n } else {\n var result = record.arg;\n var value = result.value;\n if (value &&\n typeof value === "object" &&\n hasOwn.call(value, "__await")) {\n return PromiseImpl.resolve(value.__await).then(function(value) {\n invoke("next", value, resolve, reject);\n }, function(err) {\n invoke("throw", err, resolve, reject);\n });\n }\n\n return PromiseImpl.resolve(value).then(function(unwrapped) {\n // When a yielded Promise is resolved, its final value becomes\n // the .value of the Promise<{value,done}> result for the\n // current iteration.\n result.value = unwrapped;\n resolve(result);\n }, function(error) {\n // If a rejected Promise was yielded, throw the rejection back\n // into the async generator function so it can be handled there.\n return invoke("throw", error, resolve, reject);\n });\n }\n }\n\n var previousPromise;\n\n function enqueue(method, arg) {\n function callInvokeWithMethodAndArg() {\n return new PromiseImpl(function(resolve, reject) {\n invoke(method, arg, resolve, reject);\n });\n }\n\n return previousPromise =\n // If enqueue has been called before, then we want to wait until\n // all previous Promises have been resolved before calling invoke,\n // so that results are always delivered in the correct order. If\n // enqueue has not been called before, then it is important to\n // call invoke immediately, without waiting on a callback to fire,\n // so that the async generator function has the opportunity to do\n // any necessary setup in a predictable way. This predictability\n // is why the Promise constructor synchronously invokes its\n // executor callback, and why async functions synchronously\n // execute code before the first await. Since we implement simple\n // async functions in terms of async generators, it is especially\n // important to get this right, even though it requires care.\n previousPromise ? previousPromise.then(\n callInvokeWithMethodAndArg,\n // Avoid propagating failures to Promises returned by later\n // invocations of the iterator.\n callInvokeWithMethodAndArg\n ) : callInvokeWithMethodAndArg();\n }\n\n // Define the unified helper method that is used to implement .next,\n // .throw, and .return (see defineIteratorMethods).\n this._invoke = enqueue;\n }\n\n defineIteratorMethods(AsyncIterator.prototype);\n define(AsyncIterator.prototype, asyncIteratorSymbol, function () {\n return this;\n });\n exports.AsyncIterator = AsyncIterator;\n\n // Note that simple async functions are implemented on top of\n // AsyncIterator objects; they just return a Promise for the value of\n // the final result produced by the iterator.\n exports.async = function(innerFn, outerFn, self, tryLocsList, PromiseImpl) {\n if (PromiseImpl === void 0) PromiseImpl = Promise;\n\n var iter = new AsyncIterator(\n wrap(innerFn, outerFn, self, tryLocsList),\n PromiseImpl\n );\n\n return exports.isGeneratorFunction(outerFn)\n ? iter // If outerFn is a generator, return the full iterator.\n : iter.next().then(function(result) {\n return result.done ? result.value : iter.next();\n });\n };\n\n function makeInvokeMethod(innerFn, self, context) {\n var state = GenStateSuspendedStart;\n\n return function invoke(method, arg) {\n if (state === GenStateExecuting) {\n throw new Error("Generator is already running");\n }\n\n if (state === GenStateCompleted) {\n if (method === "throw") {\n throw arg;\n }\n\n // Be forgiving, per 25.3.3.3.3 of the spec:\n // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume\n return doneResult();\n }\n\n context.method = method;\n context.arg = arg;\n\n while (true) {\n var delegate = context.delegate;\n if (delegate) {\n var delegateResult = maybeInvokeDelegate(delegate, context);\n if (delegateResult) {\n if (delegateResult === ContinueSentinel) continue;\n return delegateResult;\n }\n }\n\n if (context.method === "next") {\n // Setting context._sent for legacy support of Babel\'s\n // function.sent implementation.\n context.sent = context._sent = context.arg;\n\n } else if (context.method === "throw") {\n if (state === GenStateSuspendedStart) {\n state = GenStateCompleted;\n throw context.arg;\n }\n\n context.dispatchException(context.arg);\n\n } else if (context.method === "return") {\n context.abrupt("return", context.arg);\n }\n\n state = GenStateExecuting;\n\n var record = tryCatch(innerFn, self, context);\n if (record.type === "normal") {\n // If an exception is thrown from innerFn, we leave state ===\n // GenStateExecuting and loop back for another invocation.\n state = context.done\n ? GenStateCompleted\n : GenStateSuspendedYield;\n\n if (record.arg === ContinueSentinel) {\n continue;\n }\n\n return {\n value: record.arg,\n done: context.done\n };\n\n } else if (record.type === "throw") {\n state = GenStateCompleted;\n // Dispatch the exception by looping back around to the\n // context.dispatchException(context.arg) call above.\n context.method = "throw";\n context.arg = record.arg;\n }\n }\n };\n }\n\n // Call delegate.iterator[context.method](context.arg) and handle the\n // result, either by returning a { value, done } result from the\n // delegate iterator, or by modifying context.method and context.arg,\n // setting context.delegate to null, and returning the ContinueSentinel.\n function maybeInvokeDelegate(delegate, context) {\n var method = delegate.iterator[context.method];\n if (method === undefined) {\n // A .throw or .return when the delegate iterator has no .throw\n // method always terminates the yield* loop.\n context.delegate = null;\n\n if (context.method === "throw") {\n // Note: ["return"] must be used for ES3 parsing compatibility.\n if (delegate.iterator["return"]) {\n // If the delegate iterator has a return method, give it a\n // chance to clean up.\n context.method = "return";\n context.arg = undefined;\n maybeInvokeDelegate(delegate, context);\n\n if (context.method === "throw") {\n // If maybeInvokeDelegate(context) changed context.method from\n // "return" to "throw", let that override the TypeError below.\n return ContinueSentinel;\n }\n }\n\n context.method = "throw";\n context.arg = new TypeError(\n "The iterator does not provide a \'throw\' method");\n }\n\n return ContinueSentinel;\n }\n\n var record = tryCatch(method, delegate.iterator, context.arg);\n\n if (record.type === "throw") {\n context.method = "throw";\n context.arg = record.arg;\n context.delegate = null;\n return ContinueSentinel;\n }\n\n var info = record.arg;\n\n if (! info) {\n context.method = "throw";\n context.arg = new TypeError("iterator result is not an object");\n context.delegate = null;\n return ContinueSentinel;\n }\n\n if (info.done) {\n // Assign the result of the finished delegate to the temporary\n // variable specified by delegate.resultName (see delegateYield).\n context[delegate.resultName] = info.value;\n\n // Resume execution at the desired location (see delegateYield).\n context.next = delegate.nextLoc;\n\n // If context.method was "throw" but the delegate handled the\n // exception, let the outer generator proceed normally. If\n // context.method was "next", forget context.arg since it has been\n // "consumed" by the delegate iterator. If context.method was\n // "return", allow the original .return call to continue in the\n // outer generator.\n if (context.method !== "return") {\n context.method = "next";\n context.arg = undefined;\n }\n\n } else {\n // Re-yield the result returned by the delegate method.\n return info;\n }\n\n // The delegate iterator is finished, so forget it and continue with\n // the outer generator.\n context.delegate = null;\n return ContinueSentinel;\n }\n\n // Define Generator.prototype.{next,throw,return} in terms of the\n // unified ._invoke helper method.\n defineIteratorMethods(Gp);\n\n define(Gp, toStringTagSymbol, "Generator");\n\n // A Generator should always return itself as the iterator object when the\n // @@iterator function is called on it. Some browsers\' implementations of the\n // iterator prototype chain incorrectly implement this, causing the Generator\n // object to not be returned from this call. This ensures that doesn\'t happen.\n // See https://github.com/facebook/regenerator/issues/274 for more details.\n define(Gp, iteratorSymbol, function() {\n return this;\n });\n\n define(Gp, "toString", function() {\n return "[object Generator]";\n });\n\n function pushTryEntry(locs) {\n var entry = { tryLoc: locs[0] };\n\n if (1 in locs) {\n entry.catchLoc = locs[1];\n }\n\n if (2 in locs) {\n entry.finallyLoc = locs[2];\n entry.afterLoc = locs[3];\n }\n\n this.tryEntries.push(entry);\n }\n\n function resetTryEntry(entry) {\n var record = entry.completion || {};\n record.type = "normal";\n delete record.arg;\n entry.completion = record;\n }\n\n function Context(tryLocsList) {\n // The root entry object (effectively a try statement without a catch\n // or a finally block) gives us a place to store values thrown from\n // locations where there is no enclosing try statement.\n this.tryEntries = [{ tryLoc: "root" }];\n tryLocsList.forEach(pushTryEntry, this);\n this.reset(true);\n }\n\n exports.keys = function(object) {\n var keys = [];\n for (var key in object) {\n keys.push(key);\n }\n keys.reverse();\n\n // Rather than returning an object with a next method, we keep\n // things simple and return the next function itself.\n return function next() {\n while (keys.length) {\n var key = keys.pop();\n if (key in object) {\n next.value = key;\n next.done = false;\n return next;\n }\n }\n\n // To avoid creating an additional object, we just hang the .value\n // and .done properties off the next function object itself. This\n // also ensures that the minifier will not anonymize the function.\n next.done = true;\n return next;\n };\n };\n\n function values(iterable) {\n if (iterable) {\n var iteratorMethod = iterable[iteratorSymbol];\n if (iteratorMethod) {\n return iteratorMethod.call(iterable);\n }\n\n if (typeof iterable.next === "function") {\n return iterable;\n }\n\n if (!isNaN(iterable.length)) {\n var i = -1, next = function next() {\n while (++i < iterable.length) {\n if (hasOwn.call(iterable, i)) {\n next.value = iterable[i];\n next.done = false;\n return next;\n }\n }\n\n next.value = undefined;\n next.done = true;\n\n return next;\n };\n\n return next.next = next;\n }\n }\n\n // Return an iterator with no values.\n return { next: doneResult };\n }\n exports.values = values;\n\n function doneResult() {\n return { value: undefined, done: true };\n }\n\n Context.prototype = {\n constructor: Context,\n\n reset: function(skipTempReset) {\n this.prev = 0;\n this.next = 0;\n // Resetting context._sent for legacy support of Babel\'s\n // function.sent implementation.\n this.sent = this._sent = undefined;\n this.done = false;\n this.delegate = null;\n\n this.method = "next";\n this.arg = undefined;\n\n this.tryEntries.forEach(resetTryEntry);\n\n if (!skipTempReset) {\n for (var name in this) {\n // Not sure about the optimal order of these conditions:\n if (name.charAt(0) === "t" &&\n hasOwn.call(this, name) &&\n !isNaN(+name.slice(1))) {\n this[name] = undefined;\n }\n }\n }\n },\n\n stop: function() {\n this.done = true;\n\n var rootEntry = this.tryEntries[0];\n var rootRecord = rootEntry.completion;\n if (rootRecord.type === "throw") {\n throw rootRecord.arg;\n }\n\n return this.rval;\n },\n\n dispatchException: function(exception) {\n if (this.done) {\n throw exception;\n }\n\n var context = this;\n function handle(loc, caught) {\n record.type = "throw";\n record.arg = exception;\n context.next = loc;\n\n if (caught) {\n // If the dispatched exception was caught by a catch block,\n // then let that catch block handle the exception normally.\n context.method = "next";\n context.arg = undefined;\n }\n\n return !! caught;\n }\n\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n var record = entry.completion;\n\n if (entry.tryLoc === "root") {\n // Exception thrown outside of any try block that could handle\n // it, so set the completion value of the entire function to\n // throw the exception.\n return handle("end");\n }\n\n if (entry.tryLoc <= this.prev) {\n var hasCatch = hasOwn.call(entry, "catchLoc");\n var hasFinally = hasOwn.call(entry, "finallyLoc");\n\n if (hasCatch && hasFinally) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n } else if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else if (hasCatch) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n }\n\n } else if (hasFinally) {\n if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else {\n throw new Error("try statement without catch or finally");\n }\n }\n }\n },\n\n abrupt: function(type, arg) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc <= this.prev &&\n hasOwn.call(entry, "finallyLoc") &&\n this.prev < entry.finallyLoc) {\n var finallyEntry = entry;\n break;\n }\n }\n\n if (finallyEntry &&\n (type === "break" ||\n type === "continue") &&\n finallyEntry.tryLoc <= arg &&\n arg <= finallyEntry.finallyLoc) {\n // Ignore the finally entry if control is not jumping to a\n // location outside the try/catch block.\n finallyEntry = null;\n }\n\n var record = finallyEntry ? finallyEntry.completion : {};\n record.type = type;\n record.arg = arg;\n\n if (finallyEntry) {\n this.method = "next";\n this.next = finallyEntry.finallyLoc;\n return ContinueSentinel;\n }\n\n return this.complete(record);\n },\n\n complete: function(record, afterLoc) {\n if (record.type === "throw") {\n throw record.arg;\n }\n\n if (record.type === "break" ||\n record.type === "continue") {\n this.next = record.arg;\n } else if (record.type === "return") {\n this.rval = this.arg = record.arg;\n this.method = "return";\n this.next = "end";\n } else if (record.type === "normal" && afterLoc) {\n this.next = afterLoc;\n }\n\n return ContinueSentinel;\n },\n\n finish: function(finallyLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.finallyLoc === finallyLoc) {\n this.complete(entry.completion, entry.afterLoc);\n resetTryEntry(entry);\n return ContinueSentinel;\n }\n }\n },\n\n "catch": function(tryLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc === tryLoc) {\n var record = entry.completion;\n if (record.type === "throw") {\n var thrown = record.arg;\n resetTryEntry(entry);\n }\n return thrown;\n }\n }\n\n // The context.catch method must only be called with a location\n // argument that corresponds to a known catch block.\n throw new Error("illegal catch attempt");\n },\n\n delegateYield: function(iterable, resultName, nextLoc) {\n this.delegate = {\n iterator: values(iterable),\n resultName: resultName,\n nextLoc: nextLoc\n };\n\n if (this.method === "next") {\n // Deliberately forget the last sent value so that we don\'t\n // accidentally pass it on to the delegate.\n this.arg = undefined;\n }\n\n return ContinueSentinel;\n }\n };\n\n // Regardless of whether this script is executing as a CommonJS module\n // or not, return the runtime object so that we can declare the variable\n // regeneratorRuntime in the outer scope, which allows this module to be\n // injected easily by `bin/regenerator --include-runtime script.js`.\n return exports;\n\n}(\n // If this script is executing as a CommonJS module, use module.exports\n // as the regeneratorRuntime namespace. Otherwise create a new empty\n // object. Either way, the resulting object will be used to initialize\n // the regeneratorRuntime variable at the top of this file.\n true ? module.exports : undefined\n));\n\ntry {\n regeneratorRuntime = runtime;\n} catch (accidentalStrictMode) {\n // This module should not be running in strict mode, so the above\n // assignment should always work unless something is misconfigured. Just\n // in case runtime.js accidentally runs in strict mode, in modern engines\n // we can explicitly access globalThis. In older engines we can escape\n // strict mode using a global Function call. This could conceivably fail\n // if a Content Security Policy forbids using Function, but in that case\n // the proper solution is to fix the accidental strict mode problem. If\n // you\'ve misconfigured your bundler to force strict mode and applied a\n // CSP to forbid Function, and you\'re not willing to fix either of those\n // problems, please detail your unique predicament in a GitHub issue.\n if (typeof globalThis === "object") {\n globalThis.regeneratorRuntime = runtime;\n } else {\n Function("r", "regeneratorRuntime = r")(runtime);\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVnZW5lcmF0b3ItcnVudGltZS9ydW50aW1lLmpzPzk2Y2YiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2QsS0FBSztBQUNMLGNBQWM7QUFDZDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseURBQXlEO0FBQ3pEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLFdBQVc7QUFDWDs7QUFFQTtBQUNBO0FBQ0Esd0NBQXdDLFdBQVc7QUFDbkQ7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0EsMkJBQTJCO0FBQzNCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG9DQUFvQyxjQUFjO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGlDQUFpQyxrQkFBa0I7QUFDbkQ7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQSxpQkFBaUI7O0FBRWpCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixpQkFBaUI7QUFDekM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxZQUFZO0FBQ1o7QUFDQTs7QUFFQTtBQUNBLFlBQVk7QUFDWjs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLDhDQUE4QyxRQUFRO0FBQ3REO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTs7QUFFQSxXQUFXO0FBQ1g7QUFDQTtBQUNBOztBQUVBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7O0FBRUEsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBLDhDQUE4QyxRQUFRO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOztBQUVMO0FBQ0EsOENBQThDLFFBQVE7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0EsOENBQThDLFFBQVE7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFLEtBQTBCLG9CQUFvQixTQUFFO0FBQ2xEOztBQUVBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSIsImZpbGUiOiI0OTguanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNC1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbnZhciBydW50aW1lID0gKGZ1bmN0aW9uIChleHBvcnRzKSB7XG4gIFwidXNlIHN0cmljdFwiO1xuXG4gIHZhciBPcCA9IE9iamVjdC5wcm90b3R5cGU7XG4gIHZhciBoYXNPd24gPSBPcC5oYXNPd25Qcm9wZXJ0eTtcbiAgdmFyIHVuZGVmaW5lZDsgLy8gTW9yZSBjb21wcmVzc2libGUgdGhhbiB2b2lkIDAuXG4gIHZhciAkU3ltYm9sID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiID8gU3ltYm9sIDoge307XG4gIHZhciBpdGVyYXRvclN5bWJvbCA9ICRTeW1ib2wuaXRlcmF0b3IgfHwgXCJAQGl0ZXJhdG9yXCI7XG4gIHZhciBhc3luY0l0ZXJhdG9yU3ltYm9sID0gJFN5bWJvbC5hc3luY0l0ZXJhdG9yIHx8IFwiQEBhc3luY0l0ZXJhdG9yXCI7XG4gIHZhciB0b1N0cmluZ1RhZ1N5bWJvbCA9ICRTeW1ib2wudG9TdHJpbmdUYWcgfHwgXCJAQHRvU3RyaW5nVGFnXCI7XG5cbiAgZnVuY3Rpb24gZGVmaW5lKG9iaiwga2V5LCB2YWx1ZSkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwge1xuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgcmV0dXJuIG9ialtrZXldO1xuICB9XG4gIHRyeSB7XG4gICAgLy8gSUUgOCBoYXMgYSBicm9rZW4gT2JqZWN0LmRlZmluZVByb3BlcnR5IHRoYXQgb25seSB3b3JrcyBvbiBET00gb2JqZWN0cy5cbiAgICBkZWZpbmUoe30sIFwiXCIpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBkZWZpbmUgPSBmdW5jdGlvbihvYmosIGtleSwgdmFsdWUpIHtcbiAgICAgIHJldHVybiBvYmpba2V5XSA9IHZhbHVlO1xuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiB3cmFwKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0KSB7XG4gICAgLy8gSWYgb3V0ZXJGbiBwcm92aWRlZCBhbmQgb3V0ZXJGbi5wcm90b3R5cGUgaXMgYSBHZW5lcmF0b3IsIHRoZW4gb3V0ZXJGbi5wcm90b3R5cGUgaW5zdGFuY2VvZiBHZW5lcmF0b3IuXG4gICAgdmFyIHByb3RvR2VuZXJhdG9yID0gb3V0ZXJGbiAmJiBvdXRlckZuLnByb3RvdHlwZSBpbnN0YW5jZW9mIEdlbmVyYXRvciA/IG91dGVyRm4gOiBHZW5lcmF0b3I7XG4gICAgdmFyIGdlbmVyYXRvciA9IE9iamVjdC5jcmVhdGUocHJvdG9HZW5lcmF0b3IucHJvdG90eXBlKTtcbiAgICB2YXIgY29udGV4dCA9IG5ldyBDb250ZXh0KHRyeUxvY3NMaXN0IHx8IFtdKTtcblxuICAgIC8vIFRoZSAuX2ludm9rZSBtZXRob2QgdW5pZmllcyB0aGUgaW1wbGVtZW50YXRpb25zIG9mIHRoZSAubmV4dCxcbiAgICAvLyAudGhyb3csIGFuZCAucmV0dXJuIG1ldGhvZHMuXG4gICAgZ2VuZXJhdG9yLl9pbnZva2UgPSBtYWtlSW52b2tlTWV0aG9kKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpO1xuXG4gICAgcmV0dXJuIGdlbmVyYXRvcjtcbiAgfVxuICBleHBvcnRzLndyYXAgPSB3cmFwO1xuXG4gIC8vIFRyeS9jYXRjaCBoZWxwZXIgdG8gbWluaW1pemUgZGVvcHRpbWl6YXRpb25zLiBSZXR1cm5zIGEgY29tcGxldGlvblxuICAvLyByZWNvcmQgbGlrZSBjb250ZXh0LnRyeUVudHJpZXNbaV0uY29tcGxldGlvbi4gVGhpcyBpbnRlcmZhY2UgY291bGRcbiAgLy8gaGF2ZSBiZWVuIChhbmQgd2FzIHByZXZpb3VzbHkpIGRlc2lnbmVkIHRvIHRha2UgYSBjbG9zdXJlIHRvIGJlXG4gIC8vIGludm9rZWQgd2l0aG91dCBhcmd1bWVudHMsIGJ1dCBpbiBhbGwgdGhlIGNhc2VzIHdlIGNhcmUgYWJvdXQgd2VcbiAgLy8gYWxyZWFkeSBoYXZlIGFuIGV4aXN0aW5nIG1ldGhvZCB3ZSB3YW50IHRvIGNhbGwsIHNvIHRoZXJlJ3Mgbm8gbmVlZFxuICAvLyB0byBjcmVhdGUgYSBuZXcgZnVuY3Rpb24gb2JqZWN0LiBXZSBjYW4gZXZlbiBnZXQgYXdheSB3aXRoIGFzc3VtaW5nXG4gIC8vIHRoZSBtZXRob2QgdGFrZXMgZXhhY3RseSBvbmUgYXJndW1lbnQsIHNpbmNlIHRoYXQgaGFwcGVucyB0byBiZSB0cnVlXG4gIC8vIGluIGV2ZXJ5IGNhc2UsIHNvIHdlIGRvbid0IGhhdmUgdG8gdG91Y2ggdGhlIGFyZ3VtZW50cyBvYmplY3QuIFRoZVxuICAvLyBvbmx5IGFkZGl0aW9uYWwgYWxsb2NhdGlvbiByZXF1aXJlZCBpcyB0aGUgY29tcGxldGlvbiByZWNvcmQsIHdoaWNoXG4gIC8vIGhhcyBhIHN0YWJsZSBzaGFwZSBhbmQgc28gaG9wZWZ1bGx5IHNob3VsZCBiZSBjaGVhcCB0byBhbGxvY2F0ZS5cbiAgZnVuY3Rpb24gdHJ5Q2F0Y2goZm4sIG9iaiwgYXJnKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB7IHR5cGU6IFwibm9ybWFsXCIsIGFyZzogZm4uY2FsbChvYmosIGFyZykgfTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHJldHVybiB7IHR5cGU6IFwidGhyb3dcIiwgYXJnOiBlcnIgfTtcbiAgICB9XG4gIH1cblxuICB2YXIgR2VuU3RhdGVTdXNwZW5kZWRTdGFydCA9IFwic3VzcGVuZGVkU3RhcnRcIjtcbiAgdmFyIEdlblN0YXRlU3VzcGVuZGVkWWllbGQgPSBcInN1c3BlbmRlZFlpZWxkXCI7XG4gIHZhciBHZW5TdGF0ZUV4ZWN1dGluZyA9IFwiZXhlY3V0aW5nXCI7XG4gIHZhciBHZW5TdGF0ZUNvbXBsZXRlZCA9IFwiY29tcGxldGVkXCI7XG5cbiAgLy8gUmV0dXJuaW5nIHRoaXMgb2JqZWN0IGZyb20gdGhlIGlubmVyRm4gaGFzIHRoZSBzYW1lIGVmZmVjdCBhc1xuICAvLyBicmVha2luZyBvdXQgb2YgdGhlIGRpc3BhdGNoIHN3aXRjaCBzdGF0ZW1lbnQuXG4gIHZhciBDb250aW51ZVNlbnRpbmVsID0ge307XG5cbiAgLy8gRHVtbXkgY29uc3RydWN0b3IgZnVuY3Rpb25zIHRoYXQgd2UgdXNlIGFzIHRoZSAuY29uc3RydWN0b3IgYW5kXG4gIC8vIC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUgcHJvcGVydGllcyBmb3IgZnVuY3Rpb25zIHRoYXQgcmV0dXJuIEdlbmVyYXRvclxuICAvLyBvYmplY3RzLiBGb3IgZnVsbCBzcGVjIGNvbXBsaWFuY2UsIHlvdSBtYXkgd2lzaCB0byBjb25maWd1cmUgeW91clxuICAvLyBtaW5pZmllciBub3QgdG8gbWFuZ2xlIHRoZSBuYW1lcyBvZiB0aGVzZSB0d28gZnVuY3Rpb25zLlxuICBmdW5jdGlvbiBHZW5lcmF0b3IoKSB7fVxuICBmdW5jdGlvbiBHZW5lcmF0b3JGdW5jdGlvbigpIHt9XG4gIGZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlKCkge31cblxuICAvLyBUaGlzIGlzIGEgcG9seWZpbGwgZm9yICVJdGVyYXRvclByb3RvdHlwZSUgZm9yIGVudmlyb25tZW50cyB0aGF0XG4gIC8vIGRvbid0IG5hdGl2ZWx5IHN1cHBvcnQgaXQuXG4gIHZhciBJdGVyYXRvclByb3RvdHlwZSA9IHt9O1xuICBkZWZpbmUoSXRlcmF0b3JQcm90b3R5cGUsIGl0ZXJhdG9yU3ltYm9sLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0pO1xuXG4gIHZhciBnZXRQcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZjtcbiAgdmFyIE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlID0gZ2V0UHJvdG8gJiYgZ2V0UHJvdG8oZ2V0UHJvdG8odmFsdWVzKFtdKSkpO1xuICBpZiAoTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUgJiZcbiAgICAgIE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlICE9PSBPcCAmJlxuICAgICAgaGFzT3duLmNhbGwoTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUsIGl0ZXJhdG9yU3ltYm9sKSkge1xuICAgIC8vIFRoaXMgZW52aXJvbm1lbnQgaGFzIGEgbmF0aXZlICVJdGVyYXRvclByb3RvdHlwZSU7IHVzZSBpdCBpbnN0ZWFkXG4gICAgLy8gb2YgdGhlIHBvbHlmaWxsLlxuICAgIEl0ZXJhdG9yUHJvdG90eXBlID0gTmF0aXZlSXRlcmF0b3JQcm90b3R5cGU7XG4gIH1cblxuICB2YXIgR3AgPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZS5wcm90b3R5cGUgPVxuICAgIEdlbmVyYXRvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEl0ZXJhdG9yUHJvdG90eXBlKTtcbiAgR2VuZXJhdG9yRnVuY3Rpb24ucHJvdG90eXBlID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGU7XG4gIGRlZmluZShHcCwgXCJjb25zdHJ1Y3RvclwiLCBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSk7XG4gIGRlZmluZShHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSwgXCJjb25zdHJ1Y3RvclwiLCBHZW5lcmF0b3JGdW5jdGlvbik7XG4gIEdlbmVyYXRvckZ1bmN0aW9uLmRpc3BsYXlOYW1lID0gZGVmaW5lKFxuICAgIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLFxuICAgIHRvU3RyaW5nVGFnU3ltYm9sLFxuICAgIFwiR2VuZXJhdG9yRnVuY3Rpb25cIlxuICApO1xuXG4gIC8vIEhlbHBlciBmb3IgZGVmaW5pbmcgdGhlIC5uZXh0LCAudGhyb3csIGFuZCAucmV0dXJuIG1ldGhvZHMgb2YgdGhlXG4gIC8vIEl0ZXJhdG9yIGludGVyZmFjZSBpbiB0ZXJtcyBvZiBhIHNpbmdsZSAuX2ludm9rZSBtZXRob2QuXG4gIGZ1bmN0aW9uIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhwcm90b3R5cGUpIHtcbiAgICBbXCJuZXh0XCIsIFwidGhyb3dcIiwgXCJyZXR1cm5cIl0uZm9yRWFjaChmdW5jdGlvbihtZXRob2QpIHtcbiAgICAgIGRlZmluZShwcm90b3R5cGUsIG1ldGhvZCwgZnVuY3Rpb24oYXJnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnZva2UobWV0aG9kLCBhcmcpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBleHBvcnRzLmlzR2VuZXJhdG9yRnVuY3Rpb24gPSBmdW5jdGlvbihnZW5GdW4pIHtcbiAgICB2YXIgY3RvciA9IHR5cGVvZiBnZW5GdW4gPT09IFwiZnVuY3Rpb25cIiAmJiBnZW5GdW4uY29uc3RydWN0b3I7XG4gICAgcmV0dXJuIGN0b3JcbiAgICAgID8gY3RvciA9PT0gR2VuZXJhdG9yRnVuY3Rpb24gfHxcbiAgICAgICAgLy8gRm9yIHRoZSBuYXRpdmUgR2VuZXJhdG9yRnVuY3Rpb24gY29uc3RydWN0b3IsIHRoZSBiZXN0IHdlIGNhblxuICAgICAgICAvLyBkbyBpcyB0byBjaGVjayBpdHMgLm5hbWUgcHJvcGVydHkuXG4gICAgICAgIChjdG9yLmRpc3BsYXlOYW1lIHx8IGN0b3IubmFtZSkgPT09IFwiR2VuZXJhdG9yRnVuY3Rpb25cIlxuICAgICAgOiBmYWxzZTtcbiAgfTtcblxuICBleHBvcnRzLm1hcmsgPSBmdW5jdGlvbihnZW5GdW4pIHtcbiAgICBpZiAoT2JqZWN0LnNldFByb3RvdHlwZU9mKSB7XG4gICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YoZ2VuRnVuLCBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdlbkZ1bi5fX3Byb3RvX18gPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZTtcbiAgICAgIGRlZmluZShnZW5GdW4sIHRvU3RyaW5nVGFnU3ltYm9sLCBcIkdlbmVyYXRvckZ1bmN0aW9uXCIpO1xuICAgIH1cbiAgICBnZW5GdW4ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShHcCk7XG4gICAgcmV0dXJuIGdlbkZ1bjtcbiAgfTtcblxuICAvLyBXaXRoaW4gdGhlIGJvZHkgb2YgYW55IGFzeW5jIGZ1bmN0aW9uLCBgYXdhaXQgeGAgaXMgdHJhbnNmb3JtZWQgdG9cbiAgLy8gYHlpZWxkIHJlZ2VuZXJhdG9yUnVudGltZS5hd3JhcCh4KWAsIHNvIHRoYXQgdGhlIHJ1bnRpbWUgY2FuIHRlc3RcbiAgLy8gYGhhc093bi5jYWxsKHZhbHVlLCBcIl9fYXdhaXRcIilgIHRvIGRldGVybWluZSBpZiB0aGUgeWllbGRlZCB2YWx1ZSBpc1xuICAvLyBtZWFudCB0byBiZSBhd2FpdGVkLlxuICBleHBvcnRzLmF3cmFwID0gZnVuY3Rpb24oYXJnKSB7XG4gICAgcmV0dXJuIHsgX19hd2FpdDogYXJnIH07XG4gIH07XG5cbiAgZnVuY3Rpb24gQXN5bmNJdGVyYXRvcihnZW5lcmF0b3IsIFByb21pc2VJbXBsKSB7XG4gICAgZnVuY3Rpb24gaW52b2tlKG1ldGhvZCwgYXJnLCByZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChnZW5lcmF0b3JbbWV0aG9kXSwgZ2VuZXJhdG9yLCBhcmcpO1xuICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgcmVqZWN0KHJlY29yZC5hcmcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHJlY29yZC5hcmc7XG4gICAgICAgIHZhciB2YWx1ZSA9IHJlc3VsdC52YWx1ZTtcbiAgICAgICAgaWYgKHZhbHVlICYmXG4gICAgICAgICAgICB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgICAgIGhhc093bi5jYWxsKHZhbHVlLCBcIl9fYXdhaXRcIikpIHtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZUltcGwucmVzb2x2ZSh2YWx1ZS5fX2F3YWl0KS50aGVuKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgICBpbnZva2UoXCJuZXh0XCIsIHZhbHVlLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgIH0sIGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgICAgaW52b2tlKFwidGhyb3dcIiwgZXJyLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2VJbXBsLnJlc29sdmUodmFsdWUpLnRoZW4oZnVuY3Rpb24odW53cmFwcGVkKSB7XG4gICAgICAgICAgLy8gV2hlbiBhIHlpZWxkZWQgUHJvbWlzZSBpcyByZXNvbHZlZCwgaXRzIGZpbmFsIHZhbHVlIGJlY29tZXNcbiAgICAgICAgICAvLyB0aGUgLnZhbHVlIG9mIHRoZSBQcm9taXNlPHt2YWx1ZSxkb25lfT4gcmVzdWx0IGZvciB0aGVcbiAgICAgICAgICAvLyBjdXJyZW50IGl0ZXJhdGlvbi5cbiAgICAgICAgICByZXN1bHQudmFsdWUgPSB1bndyYXBwZWQ7XG4gICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICB9LCBmdW5jdGlvbihlcnJvcikge1xuICAgICAgICAgIC8vIElmIGEgcmVqZWN0ZWQgUHJvbWlzZSB3YXMgeWllbGRlZCwgdGhyb3cgdGhlIHJlamVjdGlvbiBiYWNrXG4gICAgICAgICAgLy8gaW50byB0aGUgYXN5bmMgZ2VuZXJhdG9yIGZ1bmN0aW9uIHNvIGl0IGNhbiBiZSBoYW5kbGVkIHRoZXJlLlxuICAgICAgICAgIHJldHVybiBpbnZva2UoXCJ0aHJvd1wiLCBlcnJvciwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHByZXZpb3VzUHJvbWlzZTtcblxuICAgIGZ1bmN0aW9uIGVucXVldWUobWV0aG9kLCBhcmcpIHtcbiAgICAgIGZ1bmN0aW9uIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnKCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2VJbXBsKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgIGludm9rZShtZXRob2QsIGFyZywgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwcmV2aW91c1Byb21pc2UgPVxuICAgICAgICAvLyBJZiBlbnF1ZXVlIGhhcyBiZWVuIGNhbGxlZCBiZWZvcmUsIHRoZW4gd2Ugd2FudCB0byB3YWl0IHVudGlsXG4gICAgICAgIC8vIGFsbCBwcmV2aW91cyBQcm9taXNlcyBoYXZlIGJlZW4gcmVzb2x2ZWQgYmVmb3JlIGNhbGxpbmcgaW52b2tlLFxuICAgICAgICAvLyBzbyB0aGF0IHJlc3VsdHMgYXJlIGFsd2F5cyBkZWxpdmVyZWQgaW4gdGhlIGNvcnJlY3Qgb3JkZXIuIElmXG4gICAgICAgIC8vIGVucXVldWUgaGFzIG5vdCBiZWVuIGNhbGxlZCBiZWZvcmUsIHRoZW4gaXQgaXMgaW1wb3J0YW50IHRvXG4gICAgICAgIC8vIGNhbGwgaW52b2tlIGltbWVkaWF0ZWx5LCB3aXRob3V0IHdhaXRpbmcgb24gYSBjYWxsYmFjayB0byBmaXJlLFxuICAgICAgICAvLyBzbyB0aGF0IHRoZSBhc3luYyBnZW5lcmF0b3IgZnVuY3Rpb24gaGFzIHRoZSBvcHBvcnR1bml0eSB0byBkb1xuICAgICAgICAvLyBhbnkgbmVjZXNzYXJ5IHNldHVwIGluIGEgcHJlZGljdGFibGUgd2F5LiBUaGlzIHByZWRpY3RhYmlsaXR5XG4gICAgICAgIC8vIGlzIHdoeSB0aGUgUHJvbWlzZSBjb25zdHJ1Y3RvciBzeW5jaHJvbm91c2x5IGludm9rZXMgaXRzXG4gICAgICAgIC8vIGV4ZWN1dG9yIGNhbGxiYWNrLCBhbmQgd2h5IGFzeW5jIGZ1bmN0aW9ucyBzeW5jaHJvbm91c2x5XG4gICAgICAgIC8vIGV4ZWN1dGUgY29kZSBiZWZvcmUgdGhlIGZpcnN0IGF3YWl0LiBTaW5jZSB3ZSBpbXBsZW1lbnQgc2ltcGxlXG4gICAgICAgIC8vIGFzeW5jIGZ1bmN0aW9ucyBpbiB0ZXJtcyBvZiBhc3luYyBnZW5lcmF0b3JzLCBpdCBpcyBlc3BlY2lhbGx5XG4gICAgICAgIC8vIGltcG9ydGFudCB0byBnZXQgdGhpcyByaWdodCwgZXZlbiB0aG91Z2ggaXQgcmVxdWlyZXMgY2FyZS5cbiAgICAgICAgcHJldmlvdXNQcm9taXNlID8gcHJldmlvdXNQcm9taXNlLnRoZW4oXG4gICAgICAgICAgY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcsXG4gICAgICAgICAgLy8gQXZvaWQgcHJvcGFnYXRpbmcgZmFpbHVyZXMgdG8gUHJvbWlzZXMgcmV0dXJuZWQgYnkgbGF0ZXJcbiAgICAgICAgICAvLyBpbnZvY2F0aW9ucyBvZiB0aGUgaXRlcmF0b3IuXG4gICAgICAgICAgY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmdcbiAgICAgICAgKSA6IGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnKCk7XG4gICAgfVxuXG4gICAgLy8gRGVmaW5lIHRoZSB1bmlmaWVkIGhlbHBlciBtZXRob2QgdGhhdCBpcyB1c2VkIHRvIGltcGxlbWVudCAubmV4dCxcbiAgICAvLyAudGhyb3csIGFuZCAucmV0dXJuIChzZWUgZGVmaW5lSXRlcmF0b3JNZXRob2RzKS5cbiAgICB0aGlzLl9pbnZva2UgPSBlbnF1ZXVlO1xuICB9XG5cbiAgZGVmaW5lSXRlcmF0b3JNZXRob2RzKEFzeW5jSXRlcmF0b3IucHJvdG90eXBlKTtcbiAgZGVmaW5lKEFzeW5jSXRlcmF0b3IucHJvdG90eXBlLCBhc3luY0l0ZXJhdG9yU3ltYm9sLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0pO1xuICBleHBvcnRzLkFzeW5jSXRlcmF0b3IgPSBBc3luY0l0ZXJhdG9yO1xuXG4gIC8vIE5vdGUgdGhhdCBzaW1wbGUgYXN5bmMgZnVuY3Rpb25zIGFyZSBpbXBsZW1lbnRlZCBvbiB0b3Agb2ZcbiAgLy8gQXN5bmNJdGVyYXRvciBvYmplY3RzOyB0aGV5IGp1c3QgcmV0dXJuIGEgUHJvbWlzZSBmb3IgdGhlIHZhbHVlIG9mXG4gIC8vIHRoZSBmaW5hbCByZXN1bHQgcHJvZHVjZWQgYnkgdGhlIGl0ZXJhdG9yLlxuICBleHBvcnRzLmFzeW5jID0gZnVuY3Rpb24oaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QsIFByb21pc2VJbXBsKSB7XG4gICAgaWYgKFByb21pc2VJbXBsID09PSB2b2lkIDApIFByb21pc2VJbXBsID0gUHJvbWlzZTtcblxuICAgIHZhciBpdGVyID0gbmV3IEFzeW5jSXRlcmF0b3IoXG4gICAgICB3cmFwKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0KSxcbiAgICAgIFByb21pc2VJbXBsXG4gICAgKTtcblxuICAgIHJldHVybiBleHBvcnRzLmlzR2VuZXJhdG9yRnVuY3Rpb24ob3V0ZXJGbilcbiAgICAgID8gaXRlciAvLyBJZiBvdXRlckZuIGlzIGEgZ2VuZXJhdG9yLCByZXR1cm4gdGhlIGZ1bGwgaXRlcmF0b3IuXG4gICAgICA6IGl0ZXIubmV4dCgpLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdC5kb25lID8gcmVzdWx0LnZhbHVlIDogaXRlci5uZXh0KCk7XG4gICAgICAgIH0pO1xuICB9O1xuXG4gIGZ1bmN0aW9uIG1ha2VJbnZva2VNZXRob2QoaW5uZXJGbiwgc2VsZiwgY29udGV4dCkge1xuICAgIHZhciBzdGF0ZSA9IEdlblN0YXRlU3VzcGVuZGVkU3RhcnQ7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gaW52b2tlKG1ldGhvZCwgYXJnKSB7XG4gICAgICBpZiAoc3RhdGUgPT09IEdlblN0YXRlRXhlY3V0aW5nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IHJ1bm5pbmdcIik7XG4gICAgICB9XG5cbiAgICAgIGlmIChzdGF0ZSA9PT0gR2VuU3RhdGVDb21wbGV0ZWQpIHtcbiAgICAgICAgaWYgKG1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgdGhyb3cgYXJnO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQmUgZm9yZ2l2aW5nLCBwZXIgMjUuMy4zLjMuMyBvZiB0aGUgc3BlYzpcbiAgICAgICAgLy8gaHR0cHM6Ly9wZW9wbGUubW96aWxsYS5vcmcvfmpvcmVuZG9yZmYvZXM2LWRyYWZ0Lmh0bWwjc2VjLWdlbmVyYXRvcnJlc3VtZVxuICAgICAgICByZXR1cm4gZG9uZVJlc3VsdCgpO1xuICAgICAgfVxuXG4gICAgICBjb250ZXh0Lm1ldGhvZCA9IG1ldGhvZDtcbiAgICAgIGNvbnRleHQuYXJnID0gYXJnO1xuXG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICB2YXIgZGVsZWdhdGUgPSBjb250ZXh0LmRlbGVnYXRlO1xuICAgICAgICBpZiAoZGVsZWdhdGUpIHtcbiAgICAgICAgICB2YXIgZGVsZWdhdGVSZXN1bHQgPSBtYXliZUludm9rZURlbGVnYXRlKGRlbGVnYXRlLCBjb250ZXh0KTtcbiAgICAgICAgICBpZiAoZGVsZWdhdGVSZXN1bHQpIHtcbiAgICAgICAgICAgIGlmIChkZWxlZ2F0ZVJlc3VsdCA9PT0gQ29udGludWVTZW50aW5lbCkgY29udGludWU7XG4gICAgICAgICAgICByZXR1cm4gZGVsZWdhdGVSZXN1bHQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbnRleHQubWV0aG9kID09PSBcIm5leHRcIikge1xuICAgICAgICAgIC8vIFNldHRpbmcgY29udGV4dC5fc2VudCBmb3IgbGVnYWN5IHN1cHBvcnQgb2YgQmFiZWwnc1xuICAgICAgICAgIC8vIGZ1bmN0aW9uLnNlbnQgaW1wbGVtZW50YXRpb24uXG4gICAgICAgICAgY29udGV4dC5zZW50ID0gY29udGV4dC5fc2VudCA9IGNvbnRleHQuYXJnO1xuXG4gICAgICAgIH0gZWxzZSBpZiAoY29udGV4dC5tZXRob2QgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgIGlmIChzdGF0ZSA9PT0gR2VuU3RhdGVTdXNwZW5kZWRTdGFydCkge1xuICAgICAgICAgICAgc3RhdGUgPSBHZW5TdGF0ZUNvbXBsZXRlZDtcbiAgICAgICAgICAgIHRocm93IGNvbnRleHQuYXJnO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnRleHQuZGlzcGF0Y2hFeGNlcHRpb24oY29udGV4dC5hcmcpO1xuXG4gICAgICAgIH0gZWxzZSBpZiAoY29udGV4dC5tZXRob2QgPT09IFwicmV0dXJuXCIpIHtcbiAgICAgICAgICBjb250ZXh0LmFicnVwdChcInJldHVyblwiLCBjb250ZXh0LmFyZyk7XG4gICAgICAgIH1cblxuICAgICAgICBzdGF0ZSA9IEdlblN0YXRlRXhlY3V0aW5nO1xuXG4gICAgICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChpbm5lckZuLCBzZWxmLCBjb250ZXh0KTtcbiAgICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcIm5vcm1hbFwiKSB7XG4gICAgICAgICAgLy8gSWYgYW4gZXhjZXB0aW9uIGlzIHRocm93biBmcm9tIGlubmVyRm4sIHdlIGxlYXZlIHN0YXRlID09PVxuICAgICAgICAgIC8vIEdlblN0YXRlRXhlY3V0aW5nIGFuZCBsb29wIGJhY2sgZm9yIGFub3RoZXIgaW52b2NhdGlvbi5cbiAgICAgICAgICBzdGF0ZSA9IGNvbnRleHQuZG9uZVxuICAgICAgICAgICAgPyBHZW5TdGF0ZUNvbXBsZXRlZFxuICAgICAgICAgICAgOiBHZW5TdGF0ZVN1c3BlbmRlZFlpZWxkO1xuXG4gICAgICAgICAgaWYgKHJlY29yZC5hcmcgPT09IENvbnRpbnVlU2VudGluZWwpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB2YWx1ZTogcmVjb3JkLmFyZyxcbiAgICAgICAgICAgIGRvbmU6IGNvbnRleHQuZG9uZVxuICAgICAgICAgIH07XG5cbiAgICAgICAgfSBlbHNlIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgc3RhdGUgPSBHZW5TdGF0ZUNvbXBsZXRlZDtcbiAgICAgICAgICAvLyBEaXNwYXRjaCB0aGUgZXhjZXB0aW9uIGJ5IGxvb3BpbmcgYmFjayBhcm91bmQgdG8gdGhlXG4gICAgICAgICAgLy8gY29udGV4dC5kaXNwYXRjaEV4Y2VwdGlvbihjb250ZXh0LmFyZykgY2FsbCBhYm92ZS5cbiAgICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgICAgICBjb250ZXh0LmFyZyA9IHJlY29yZC5hcmc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLy8gQ2FsbCBkZWxlZ2F0ZS5pdGVyYXRvcltjb250ZXh0Lm1ldGhvZF0oY29udGV4dC5hcmcpIGFuZCBoYW5kbGUgdGhlXG4gIC8vIHJlc3VsdCwgZWl0aGVyIGJ5IHJldHVybmluZyBhIHsgdmFsdWUsIGRvbmUgfSByZXN1bHQgZnJvbSB0aGVcbiAgLy8gZGVsZWdhdGUgaXRlcmF0b3IsIG9yIGJ5IG1vZGlmeWluZyBjb250ZXh0Lm1ldGhvZCBhbmQgY29udGV4dC5hcmcsXG4gIC8vIHNldHRpbmcgY29udGV4dC5kZWxlZ2F0ZSB0byBudWxsLCBhbmQgcmV0dXJuaW5nIHRoZSBDb250aW51ZVNlbnRpbmVsLlxuICBmdW5jdGlvbiBtYXliZUludm9rZURlbGVnYXRlKGRlbGVnYXRlLCBjb250ZXh0KSB7XG4gICAgdmFyIG1ldGhvZCA9IGRlbGVnYXRlLml0ZXJhdG9yW2NvbnRleHQubWV0aG9kXTtcbiAgICBpZiAobWV0aG9kID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIEEgLnRocm93IG9yIC5yZXR1cm4gd2hlbiB0aGUgZGVsZWdhdGUgaXRlcmF0b3IgaGFzIG5vIC50aHJvd1xuICAgICAgLy8gbWV0aG9kIGFsd2F5cyB0ZXJtaW5hdGVzIHRoZSB5aWVsZCogbG9vcC5cbiAgICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuXG4gICAgICBpZiAoY29udGV4dC5tZXRob2QgPT09IFwidGhyb3dcIikge1xuICAgICAgICAvLyBOb3RlOiBbXCJyZXR1cm5cIl0gbXVzdCBiZSB1c2VkIGZvciBFUzMgcGFyc2luZyBjb21wYXRpYmlsaXR5LlxuICAgICAgICBpZiAoZGVsZWdhdGUuaXRlcmF0b3JbXCJyZXR1cm5cIl0pIHtcbiAgICAgICAgICAvLyBJZiB0aGUgZGVsZWdhdGUgaXRlcmF0b3IgaGFzIGEgcmV0dXJuIG1ldGhvZCwgZ2l2ZSBpdCBhXG4gICAgICAgICAgLy8gY2hhbmNlIHRvIGNsZWFuIHVwLlxuICAgICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJyZXR1cm5cIjtcbiAgICAgICAgICBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBtYXliZUludm9rZURlbGVnYXRlKGRlbGVnYXRlLCBjb250ZXh0KTtcblxuICAgICAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgICAvLyBJZiBtYXliZUludm9rZURlbGVnYXRlKGNvbnRleHQpIGNoYW5nZWQgY29udGV4dC5tZXRob2QgZnJvbVxuICAgICAgICAgICAgLy8gXCJyZXR1cm5cIiB0byBcInRocm93XCIsIGxldCB0aGF0IG92ZXJyaWRlIHRoZSBUeXBlRXJyb3IgYmVsb3cuXG4gICAgICAgICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgICAgY29udGV4dC5hcmcgPSBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgIFwiVGhlIGl0ZXJhdG9yIGRvZXMgbm90IHByb3ZpZGUgYSAndGhyb3cnIG1ldGhvZFwiKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuXG4gICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKG1ldGhvZCwgZGVsZWdhdGUuaXRlcmF0b3IsIGNvbnRleHQuYXJnKTtcblxuICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgIGNvbnRleHQuYXJnID0gcmVjb3JkLmFyZztcbiAgICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuXG4gICAgdmFyIGluZm8gPSByZWNvcmQuYXJnO1xuXG4gICAgaWYgKCEgaW5mbykge1xuICAgICAgY29udGV4dC5tZXRob2QgPSBcInRocm93XCI7XG4gICAgICBjb250ZXh0LmFyZyA9IG5ldyBUeXBlRXJyb3IoXCJpdGVyYXRvciByZXN1bHQgaXMgbm90IGFuIG9iamVjdFwiKTtcbiAgICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuXG4gICAgaWYgKGluZm8uZG9uZSkge1xuICAgICAgLy8gQXNzaWduIHRoZSByZXN1bHQgb2YgdGhlIGZpbmlzaGVkIGRlbGVnYXRlIHRvIHRoZSB0ZW1wb3JhcnlcbiAgICAgIC8vIHZhcmlhYmxlIHNwZWNpZmllZCBieSBkZWxlZ2F0ZS5yZXN1bHROYW1lIChzZWUgZGVsZWdhdGVZaWVsZCkuXG4gICAgICBjb250ZXh0W2RlbGVnYXRlLnJlc3VsdE5hbWVdID0gaW5mby52YWx1ZTtcblxuICAgICAgLy8gUmVzdW1lIGV4ZWN1dGlvbiBhdCB0aGUgZGVzaXJlZCBsb2NhdGlvbiAoc2VlIGRlbGVnYXRlWWllbGQpLlxuICAgICAgY29udGV4dC5uZXh0ID0gZGVsZWdhdGUubmV4dExvYztcblxuICAgICAgLy8gSWYgY29udGV4dC5tZXRob2Qgd2FzIFwidGhyb3dcIiBidXQgdGhlIGRlbGVnYXRlIGhhbmRsZWQgdGhlXG4gICAgICAvLyBleGNlcHRpb24sIGxldCB0aGUgb3V0ZXIgZ2VuZXJhdG9yIHByb2NlZWQgbm9ybWFsbHkuIElmXG4gICAgICAvLyBjb250ZXh0Lm1ldGhvZCB3YXMgXCJuZXh0XCIsIGZvcmdldCBjb250ZXh0LmFyZyBzaW5jZSBpdCBoYXMgYmVlblxuICAgICAgLy8gXCJjb25zdW1lZFwiIGJ5IHRoZSBkZWxlZ2F0ZSBpdGVyYXRvci4gSWYgY29udGV4dC5tZXRob2Qgd2FzXG4gICAgICAvLyBcInJldHVyblwiLCBhbGxvdyB0aGUgb3JpZ2luYWwgLnJldHVybiBjYWxsIHRvIGNvbnRpbnVlIGluIHRoZVxuICAgICAgLy8gb3V0ZXIgZ2VuZXJhdG9yLlxuICAgICAgaWYgKGNvbnRleHQubWV0aG9kICE9PSBcInJldHVyblwiKSB7XG4gICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJuZXh0XCI7XG4gICAgICAgIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJlLXlpZWxkIHRoZSByZXN1bHQgcmV0dXJuZWQgYnkgdGhlIGRlbGVnYXRlIG1ldGhvZC5cbiAgICAgIHJldHVybiBpbmZvO1xuICAgIH1cblxuICAgIC8vIFRoZSBkZWxlZ2F0ZSBpdGVyYXRvciBpcyBmaW5pc2hlZCwgc28gZm9yZ2V0IGl0IGFuZCBjb250aW51ZSB3aXRoXG4gICAgLy8gdGhlIG91dGVyIGdlbmVyYXRvci5cbiAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDtcbiAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgfVxuXG4gIC8vIERlZmluZSBHZW5lcmF0b3IucHJvdG90eXBlLntuZXh0LHRocm93LHJldHVybn0gaW4gdGVybXMgb2YgdGhlXG4gIC8vIHVuaWZpZWQgLl9pbnZva2UgaGVscGVyIG1ldGhvZC5cbiAgZGVmaW5lSXRlcmF0b3JNZXRob2RzKEdwKTtcblxuICBkZWZpbmUoR3AsIHRvU3RyaW5nVGFnU3ltYm9sLCBcIkdlbmVyYXRvclwiKTtcblxuICAvLyBBIEdlbmVyYXRvciBzaG91bGQgYWx3YXlzIHJldHVybiBpdHNlbGYgYXMgdGhlIGl0ZXJhdG9yIG9iamVjdCB3aGVuIHRoZVxuICAvLyBAQGl0ZXJhdG9yIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbiBpdC4gU29tZSBicm93c2VycycgaW1wbGVtZW50YXRpb25zIG9mIHRoZVxuICAvLyBpdGVyYXRvciBwcm90b3R5cGUgY2hhaW4gaW5jb3JyZWN0bHkgaW1wbGVtZW50IHRoaXMsIGNhdXNpbmcgdGhlIEdlbmVyYXRvclxuICAvLyBvYmplY3QgdG8gbm90IGJlIHJldHVybmVkIGZyb20gdGhpcyBjYWxsLiBUaGlzIGVuc3VyZXMgdGhhdCBkb2Vzbid0IGhhcHBlbi5cbiAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWdlbmVyYXRvci9pc3N1ZXMvMjc0IGZvciBtb3JlIGRldGFpbHMuXG4gIGRlZmluZShHcCwgaXRlcmF0b3JTeW1ib2wsIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9KTtcblxuICBkZWZpbmUoR3AsIFwidG9TdHJpbmdcIiwgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIFwiW29iamVjdCBHZW5lcmF0b3JdXCI7XG4gIH0pO1xuXG4gIGZ1bmN0aW9uIHB1c2hUcnlFbnRyeShsb2NzKSB7XG4gICAgdmFyIGVudHJ5ID0geyB0cnlMb2M6IGxvY3NbMF0gfTtcblxuICAgIGlmICgxIGluIGxvY3MpIHtcbiAgICAgIGVudHJ5LmNhdGNoTG9jID0gbG9jc1sxXTtcbiAgICB9XG5cbiAgICBpZiAoMiBpbiBsb2NzKSB7XG4gICAgICBlbnRyeS5maW5hbGx5TG9jID0gbG9jc1syXTtcbiAgICAgIGVudHJ5LmFmdGVyTG9jID0gbG9jc1szXTtcbiAgICB9XG5cbiAgICB0aGlzLnRyeUVudHJpZXMucHVzaChlbnRyeSk7XG4gIH1cblxuICBmdW5jdGlvbiByZXNldFRyeUVudHJ5KGVudHJ5KSB7XG4gICAgdmFyIHJlY29yZCA9IGVudHJ5LmNvbXBsZXRpb24gfHwge307XG4gICAgcmVjb3JkLnR5cGUgPSBcIm5vcm1hbFwiO1xuICAgIGRlbGV0ZSByZWNvcmQuYXJnO1xuICAgIGVudHJ5LmNvbXBsZXRpb24gPSByZWNvcmQ7XG4gIH1cblxuICBmdW5jdGlvbiBDb250ZXh0KHRyeUxvY3NMaXN0KSB7XG4gICAgLy8gVGhlIHJvb3QgZW50cnkgb2JqZWN0IChlZmZlY3RpdmVseSBhIHRyeSBzdGF0ZW1lbnQgd2l0aG91dCBhIGNhdGNoXG4gICAgLy8gb3IgYSBmaW5hbGx5IGJsb2NrKSBnaXZlcyB1cyBhIHBsYWNlIHRvIHN0b3JlIHZhbHVlcyB0aHJvd24gZnJvbVxuICAgIC8vIGxvY2F0aW9ucyB3aGVyZSB0aGVyZSBpcyBubyBlbmNsb3NpbmcgdHJ5IHN0YXRlbWVudC5cbiAgICB0aGlzLnRyeUVudHJpZXMgPSBbeyB0cnlMb2M6IFwicm9vdFwiIH1dO1xuICAgIHRyeUxvY3NMaXN0LmZvckVhY2gocHVzaFRyeUVudHJ5LCB0aGlzKTtcbiAgICB0aGlzLnJlc2V0KHRydWUpO1xuICB9XG5cbiAgZXhwb3J0cy5rZXlzID0gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgdmFyIGtleXMgPSBbXTtcbiAgICBmb3IgKHZhciBrZXkgaW4gb2JqZWN0KSB7XG4gICAgICBrZXlzLnB1c2goa2V5KTtcbiAgICB9XG4gICAga2V5cy5yZXZlcnNlKCk7XG5cbiAgICAvLyBSYXRoZXIgdGhhbiByZXR1cm5pbmcgYW4gb2JqZWN0IHdpdGggYSBuZXh0IG1ldGhvZCwgd2Uga2VlcFxuICAgIC8vIHRoaW5ncyBzaW1wbGUgYW5kIHJldHVybiB0aGUgbmV4dCBmdW5jdGlvbiBpdHNlbGYuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICB3aGlsZSAoa2V5cy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIGtleSA9IGtleXMucG9wKCk7XG4gICAgICAgIGlmIChrZXkgaW4gb2JqZWN0KSB7XG4gICAgICAgICAgbmV4dC52YWx1ZSA9IGtleTtcbiAgICAgICAgICBuZXh0LmRvbmUgPSBmYWxzZTtcbiAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBUbyBhdm9pZCBjcmVhdGluZyBhbiBhZGRpdGlvbmFsIG9iamVjdCwgd2UganVzdCBoYW5nIHRoZSAudmFsdWVcbiAgICAgIC8vIGFuZCAuZG9uZSBwcm9wZXJ0aWVzIG9mZiB0aGUgbmV4dCBmdW5jdGlvbiBvYmplY3QgaXRzZWxmLiBUaGlzXG4gICAgICAvLyBhbHNvIGVuc3VyZXMgdGhhdCB0aGUgbWluaWZpZXIgd2lsbCBub3QgYW5vbnltaXplIHRoZSBmdW5jdGlvbi5cbiAgICAgIG5leHQuZG9uZSA9IHRydWU7XG4gICAgICByZXR1cm4gbmV4dDtcbiAgICB9O1xuICB9O1xuXG4gIGZ1bmN0aW9uIHZhbHVlcyhpdGVyYWJsZSkge1xuICAgIGlmIChpdGVyYWJsZSkge1xuICAgICAgdmFyIGl0ZXJhdG9yTWV0aG9kID0gaXRlcmFibGVbaXRlcmF0b3JTeW1ib2xdO1xuICAgICAgaWYgKGl0ZXJhdG9yTWV0aG9kKSB7XG4gICAgICAgIHJldHVybiBpdGVyYXRvck1ldGhvZC5jYWxsKGl0ZXJhYmxlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBpdGVyYWJsZS5uZXh0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgcmV0dXJuIGl0ZXJhYmxlO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWlzTmFOKGl0ZXJhYmxlLmxlbmd0aCkpIHtcbiAgICAgICAgdmFyIGkgPSAtMSwgbmV4dCA9IGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICAgICAgd2hpbGUgKCsraSA8IGl0ZXJhYmxlLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKGhhc093bi5jYWxsKGl0ZXJhYmxlLCBpKSkge1xuICAgICAgICAgICAgICBuZXh0LnZhbHVlID0gaXRlcmFibGVbaV07XG4gICAgICAgICAgICAgIG5leHQuZG9uZSA9IGZhbHNlO1xuICAgICAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBuZXh0LnZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICAgIG5leHQuZG9uZSA9IHRydWU7XG5cbiAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gbmV4dC5uZXh0ID0gbmV4dDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gYW4gaXRlcmF0b3Igd2l0aCBubyB2YWx1ZXMuXG4gICAgcmV0dXJuIHsgbmV4dDogZG9uZVJlc3VsdCB9O1xuICB9XG4gIGV4cG9ydHMudmFsdWVzID0gdmFsdWVzO1xuXG4gIGZ1bmN0aW9uIGRvbmVSZXN1bHQoKSB7XG4gICAgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9O1xuICB9XG5cbiAgQ29udGV4dC5wcm90b3R5cGUgPSB7XG4gICAgY29uc3RydWN0b3I6IENvbnRleHQsXG5cbiAgICByZXNldDogZnVuY3Rpb24oc2tpcFRlbXBSZXNldCkge1xuICAgICAgdGhpcy5wcmV2ID0gMDtcbiAgICAgIHRoaXMubmV4dCA9IDA7XG4gICAgICAvLyBSZXNldHRpbmcgY29udGV4dC5fc2VudCBmb3IgbGVnYWN5IHN1cHBvcnQgb2YgQmFiZWwnc1xuICAgICAgLy8gZnVuY3Rpb24uc2VudCBpbXBsZW1lbnRhdGlvbi5cbiAgICAgIHRoaXMuc2VudCA9IHRoaXMuX3NlbnQgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLmRvbmUgPSBmYWxzZTtcbiAgICAgIHRoaXMuZGVsZWdhdGUgPSBudWxsO1xuXG4gICAgICB0aGlzLm1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgdGhpcy5hcmcgPSB1bmRlZmluZWQ7XG5cbiAgICAgIHRoaXMudHJ5RW50cmllcy5mb3JFYWNoKHJlc2V0VHJ5RW50cnkpO1xuXG4gICAgICBpZiAoIXNraXBUZW1wUmVzZXQpIHtcbiAgICAgICAgZm9yICh2YXIgbmFtZSBpbiB0aGlzKSB7XG4gICAgICAgICAgLy8gTm90IHN1cmUgYWJvdXQgdGhlIG9wdGltYWwgb3JkZXIgb2YgdGhlc2UgY29uZGl0aW9uczpcbiAgICAgICAgICBpZiAobmFtZS5jaGFyQXQoMCkgPT09IFwidFwiICYmXG4gICAgICAgICAgICAgIGhhc093bi5jYWxsKHRoaXMsIG5hbWUpICYmXG4gICAgICAgICAgICAgICFpc05hTigrbmFtZS5zbGljZSgxKSkpIHtcbiAgICAgICAgICAgIHRoaXNbbmFtZV0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIHN0b3A6IGZ1bmN0aW9uKCkge1xuICAgICAgdGhpcy5kb25lID0gdHJ1ZTtcblxuICAgICAgdmFyIHJvb3RFbnRyeSA9IHRoaXMudHJ5RW50cmllc1swXTtcbiAgICAgIHZhciByb290UmVjb3JkID0gcm9vdEVudHJ5LmNvbXBsZXRpb247XG4gICAgICBpZiAocm9vdFJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgdGhyb3cgcm9vdFJlY29yZC5hcmc7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLnJ2YWw7XG4gICAgfSxcblxuICAgIGRpc3BhdGNoRXhjZXB0aW9uOiBmdW5jdGlvbihleGNlcHRpb24pIHtcbiAgICAgIGlmICh0aGlzLmRvbmUpIHtcbiAgICAgICAgdGhyb3cgZXhjZXB0aW9uO1xuICAgICAgfVxuXG4gICAgICB2YXIgY29udGV4dCA9IHRoaXM7XG4gICAgICBmdW5jdGlvbiBoYW5kbGUobG9jLCBjYXVnaHQpIHtcbiAgICAgICAgcmVjb3JkLnR5cGUgPSBcInRocm93XCI7XG4gICAgICAgIHJlY29yZC5hcmcgPSBleGNlcHRpb247XG4gICAgICAgIGNvbnRleHQubmV4dCA9IGxvYztcblxuICAgICAgICBpZiAoY2F1Z2h0KSB7XG4gICAgICAgICAgLy8gSWYgdGhlIGRpc3BhdGNoZWQgZXhjZXB0aW9uIHdhcyBjYXVnaHQgYnkgYSBjYXRjaCBibG9jayxcbiAgICAgICAgICAvLyB0aGVuIGxldCB0aGF0IGNhdGNoIGJsb2NrIGhhbmRsZSB0aGUgZXhjZXB0aW9uIG5vcm1hbGx5LlxuICAgICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJuZXh0XCI7XG4gICAgICAgICAgY29udGV4dC5hcmcgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gISEgY2F1Z2h0O1xuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgdmFyIHJlY29yZCA9IGVudHJ5LmNvbXBsZXRpb247XG5cbiAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA9PT0gXCJyb290XCIpIHtcbiAgICAgICAgICAvLyBFeGNlcHRpb24gdGhyb3duIG91dHNpZGUgb2YgYW55IHRyeSBibG9jayB0aGF0IGNvdWxkIGhhbmRsZVxuICAgICAgICAgIC8vIGl0LCBzbyBzZXQgdGhlIGNvbXBsZXRpb24gdmFsdWUgb2YgdGhlIGVudGlyZSBmdW5jdGlvbiB0b1xuICAgICAgICAgIC8vIHRocm93IHRoZSBleGNlcHRpb24uXG4gICAgICAgICAgcmV0dXJuIGhhbmRsZShcImVuZFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPD0gdGhpcy5wcmV2KSB7XG4gICAgICAgICAgdmFyIGhhc0NhdGNoID0gaGFzT3duLmNhbGwoZW50cnksIFwiY2F0Y2hMb2NcIik7XG4gICAgICAgICAgdmFyIGhhc0ZpbmFsbHkgPSBoYXNPd24uY2FsbChlbnRyeSwgXCJmaW5hbGx5TG9jXCIpO1xuXG4gICAgICAgICAgaWYgKGhhc0NhdGNoICYmIGhhc0ZpbmFsbHkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5jYXRjaExvYykge1xuICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmNhdGNoTG9jLCB0cnVlKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykge1xuICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmZpbmFsbHlMb2MpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgfSBlbHNlIGlmIChoYXNDYXRjaCkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmNhdGNoTG9jKSB7XG4gICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuY2F0Y2hMb2MsIHRydWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgfSBlbHNlIGlmIChoYXNGaW5hbGx5KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykge1xuICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmZpbmFsbHlMb2MpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInRyeSBzdGF0ZW1lbnQgd2l0aG91dCBjYXRjaCBvciBmaW5hbGx5XCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBhYnJ1cHQ6IGZ1bmN0aW9uKHR5cGUsIGFyZykge1xuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPD0gdGhpcy5wcmV2ICYmXG4gICAgICAgICAgICBoYXNPd24uY2FsbChlbnRyeSwgXCJmaW5hbGx5TG9jXCIpICYmXG4gICAgICAgICAgICB0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSB7XG4gICAgICAgICAgdmFyIGZpbmFsbHlFbnRyeSA9IGVudHJ5O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChmaW5hbGx5RW50cnkgJiZcbiAgICAgICAgICAodHlwZSA9PT0gXCJicmVha1wiIHx8XG4gICAgICAgICAgIHR5cGUgPT09IFwiY29udGludWVcIikgJiZcbiAgICAgICAgICBmaW5hbGx5RW50cnkudHJ5TG9jIDw9IGFyZyAmJlxuICAgICAgICAgIGFyZyA8PSBmaW5hbGx5RW50cnkuZmluYWxseUxvYykge1xuICAgICAgICAvLyBJZ25vcmUgdGhlIGZpbmFsbHkgZW50cnkgaWYgY29udHJvbCBpcyBub3QganVtcGluZyB0byBhXG4gICAgICAgIC8vIGxvY2F0aW9uIG91dHNpZGUgdGhlIHRyeS9jYXRjaCBibG9jay5cbiAgICAgICAgZmluYWxseUVudHJ5ID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgdmFyIHJlY29yZCA9IGZpbmFsbHlFbnRyeSA/IGZpbmFsbHlFbnRyeS5jb21wbGV0aW9uIDoge307XG4gICAgICByZWNvcmQudHlwZSA9IHR5cGU7XG4gICAgICByZWNvcmQuYXJnID0gYXJnO1xuXG4gICAgICBpZiAoZmluYWxseUVudHJ5KSB7XG4gICAgICAgIHRoaXMubWV0aG9kID0gXCJuZXh0XCI7XG4gICAgICAgIHRoaXMubmV4dCA9IGZpbmFsbHlFbnRyeS5maW5hbGx5TG9jO1xuICAgICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuY29tcGxldGUocmVjb3JkKTtcbiAgICB9LFxuXG4gICAgY29tcGxldGU6IGZ1bmN0aW9uKHJlY29yZCwgYWZ0ZXJMb2MpIHtcbiAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIHRocm93IHJlY29yZC5hcmc7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJicmVha1wiIHx8XG4gICAgICAgICAgcmVjb3JkLnR5cGUgPT09IFwiY29udGludWVcIikge1xuICAgICAgICB0aGlzLm5leHQgPSByZWNvcmQuYXJnO1xuICAgICAgfSBlbHNlIGlmIChyZWNvcmQudHlwZSA9PT0gXCJyZXR1cm5cIikge1xuICAgICAgICB0aGlzLnJ2YWwgPSB0aGlzLmFyZyA9IHJlY29yZC5hcmc7XG4gICAgICAgIHRoaXMubWV0aG9kID0gXCJyZXR1cm5cIjtcbiAgICAgICAgdGhpcy5uZXh0ID0gXCJlbmRcIjtcbiAgICAgIH0gZWxzZSBpZiAocmVjb3JkLnR5cGUgPT09IFwibm9ybWFsXCIgJiYgYWZ0ZXJMb2MpIHtcbiAgICAgICAgdGhpcy5uZXh0ID0gYWZ0ZXJMb2M7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgIH0sXG5cbiAgICBmaW5pc2g6IGZ1bmN0aW9uKGZpbmFsbHlMb2MpIHtcbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICBpZiAoZW50cnkuZmluYWxseUxvYyA9PT0gZmluYWxseUxvYykge1xuICAgICAgICAgIHRoaXMuY29tcGxldGUoZW50cnkuY29tcGxldGlvbiwgZW50cnkuYWZ0ZXJMb2MpO1xuICAgICAgICAgIHJlc2V0VHJ5RW50cnkoZW50cnkpO1xuICAgICAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIFwiY2F0Y2hcIjogZnVuY3Rpb24odHJ5TG9jKSB7XG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA9PT0gdHJ5TG9jKSB7XG4gICAgICAgICAgdmFyIHJlY29yZCA9IGVudHJ5LmNvbXBsZXRpb247XG4gICAgICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICAgIHZhciB0aHJvd24gPSByZWNvcmQuYXJnO1xuICAgICAgICAgICAgcmVzZXRUcnlFbnRyeShlbnRyeSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0aHJvd247XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVGhlIGNvbnRleHQuY2F0Y2ggbWV0aG9kIG11c3Qgb25seSBiZSBjYWxsZWQgd2l0aCBhIGxvY2F0aW9uXG4gICAgICAvLyBhcmd1bWVudCB0aGF0IGNvcnJlc3BvbmRzIHRvIGEga25vd24gY2F0Y2ggYmxvY2suXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbGxlZ2FsIGNhdGNoIGF0dGVtcHRcIik7XG4gICAgfSxcblxuICAgIGRlbGVnYXRlWWllbGQ6IGZ1bmN0aW9uKGl0ZXJhYmxlLCByZXN1bHROYW1lLCBuZXh0TG9jKSB7XG4gICAgICB0aGlzLmRlbGVnYXRlID0ge1xuICAgICAgICBpdGVyYXRvcjogdmFsdWVzKGl0ZXJhYmxlKSxcbiAgICAgICAgcmVzdWx0TmFtZTogcmVzdWx0TmFtZSxcbiAgICAgICAgbmV4dExvYzogbmV4dExvY1xuICAgICAgfTtcblxuICAgICAgaWYgKHRoaXMubWV0aG9kID09PSBcIm5leHRcIikge1xuICAgICAgICAvLyBEZWxpYmVyYXRlbHkgZm9yZ2V0IHRoZSBsYXN0IHNlbnQgdmFsdWUgc28gdGhhdCB3ZSBkb24ndFxuICAgICAgICAvLyBhY2NpZGVudGFsbHkgcGFzcyBpdCBvbiB0byB0aGUgZGVsZWdhdGUuXG4gICAgICAgIHRoaXMuYXJnID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9XG4gIH07XG5cbiAgLy8gUmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoaXMgc2NyaXB0IGlzIGV4ZWN1dGluZyBhcyBhIENvbW1vbkpTIG1vZHVsZVxuICAvLyBvciBub3QsIHJldHVybiB0aGUgcnVudGltZSBvYmplY3Qgc28gdGhhdCB3ZSBjYW4gZGVjbGFyZSB0aGUgdmFyaWFibGVcbiAgLy8gcmVnZW5lcmF0b3JSdW50aW1lIGluIHRoZSBvdXRlciBzY29wZSwgd2hpY2ggYWxsb3dzIHRoaXMgbW9kdWxlIHRvIGJlXG4gIC8vIGluamVjdGVkIGVhc2lseSBieSBgYmluL3JlZ2VuZXJhdG9yIC0taW5jbHVkZS1ydW50aW1lIHNjcmlwdC5qc2AuXG4gIHJldHVybiBleHBvcnRzO1xuXG59KFxuICAvLyBJZiB0aGlzIHNjcmlwdCBpcyBleGVjdXRpbmcgYXMgYSBDb21tb25KUyBtb2R1bGUsIHVzZSBtb2R1bGUuZXhwb3J0c1xuICAvLyBhcyB0aGUgcmVnZW5lcmF0b3JSdW50aW1lIG5hbWVzcGFjZS4gT3RoZXJ3aXNlIGNyZWF0ZSBhIG5ldyBlbXB0eVxuICAvLyBvYmplY3QuIEVpdGhlciB3YXksIHRoZSByZXN1bHRpbmcgb2JqZWN0IHdpbGwgYmUgdXNlZCB0byBpbml0aWFsaXplXG4gIC8vIHRoZSByZWdlbmVyYXRvclJ1bnRpbWUgdmFyaWFibGUgYXQgdGhlIHRvcCBvZiB0aGlzIGZpbGUuXG4gIHR5cGVvZiBtb2R1bGUgPT09IFwib2JqZWN0XCIgPyBtb2R1bGUuZXhwb3J0cyA6IHt9XG4pKTtcblxudHJ5IHtcbiAgcmVnZW5lcmF0b3JSdW50aW1lID0gcnVudGltZTtcbn0gY2F0Y2ggKGFjY2lkZW50YWxTdHJpY3RNb2RlKSB7XG4gIC8vIFRoaXMgbW9kdWxlIHNob3VsZCBub3QgYmUgcnVubmluZyBpbiBzdHJpY3QgbW9kZSwgc28gdGhlIGFib3ZlXG4gIC8vIGFzc2lnbm1lbnQgc2hvdWxkIGFsd2F5cyB3b3JrIHVubGVzcyBzb21ldGhpbmcgaXMgbWlzY29uZmlndXJlZC4gSnVzdFxuICAvLyBpbiBjYXNlIHJ1bnRpbWUuanMgYWNjaWRlbnRhbGx5IHJ1bnMgaW4gc3RyaWN0IG1vZGUsIGluIG1vZGVybiBlbmdpbmVzXG4gIC8vIHdlIGNhbiBleHBsaWNpdGx5IGFjY2VzcyBnbG9iYWxUaGlzLiBJbiBvbGRlciBlbmdpbmVzIHdlIGNhbiBlc2NhcGVcbiAgLy8gc3RyaWN0IG1vZGUgdXNpbmcgYSBnbG9iYWwgRnVuY3Rpb24gY2FsbC4gVGhpcyBjb3VsZCBjb25jZWl2YWJseSBmYWlsXG4gIC8vIGlmIGEgQ29udGVudCBTZWN1cml0eSBQb2xpY3kgZm9yYmlkcyB1c2luZyBGdW5jdGlvbiwgYnV0IGluIHRoYXQgY2FzZVxuICAvLyB0aGUgcHJvcGVyIHNvbHV0aW9uIGlzIHRvIGZpeCB0aGUgYWNjaWRlbnRhbCBzdHJpY3QgbW9kZSBwcm9ibGVtLiBJZlxuICAvLyB5b3UndmUgbWlzY29uZmlndXJlZCB5b3VyIGJ1bmRsZXIgdG8gZm9yY2Ugc3RyaWN0IG1vZGUgYW5kIGFwcGxpZWQgYVxuICAvLyBDU1AgdG8gZm9yYmlkIEZ1bmN0aW9uLCBhbmQgeW91J3JlIG5vdCB3aWxsaW5nIHRvIGZpeCBlaXRoZXIgb2YgdGhvc2VcbiAgLy8gcHJvYmxlbXMsIHBsZWFzZSBkZXRhaWwgeW91ciB1bmlxdWUgcHJlZGljYW1lbnQgaW4gYSBHaXRIdWIgaXNzdWUuXG4gIGlmICh0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gXCJvYmplY3RcIikge1xuICAgIGdsb2JhbFRoaXMucmVnZW5lcmF0b3JSdW50aW1lID0gcnVudGltZTtcbiAgfSBlbHNlIHtcbiAgICBGdW5jdGlvbihcInJcIiwgXCJyZWdlbmVyYXRvclJ1bnRpbWUgPSByXCIpKHJ1bnRpbWUpO1xuICB9XG59XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///498\n')},function(module,exports){eval('function _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n}\n\nmodule.exports = _arrayWithHoles;\nmodule.exports["default"] = module.exports, module.exports.__esModule = true;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hcnJheVdpdGhIb2xlcy5qcz9jMTM1Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBIiwiZmlsZSI6IjQ5OS5qcyIsInNvdXJjZXNDb250ZW50IjpbImZ1bmN0aW9uIF9hcnJheVdpdGhIb2xlcyhhcnIpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIGFycjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfYXJyYXlXaXRoSG9sZXM7XG5tb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0cywgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///499\n')},function(module,exports){eval('function _iterableToArrayLimit(arr, i) {\n var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"];\n\n if (_i == null) return;\n var _arr = [];\n var _n = true;\n var _d = false;\n\n var _s, _e;\n\n try {\n for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) {\n _arr.push(_s.value);\n\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally {\n try {\n if (!_n && _i["return"] != null) _i["return"]();\n } finally {\n if (_d) throw _e;\n }\n }\n\n return _arr;\n}\n\nmodule.exports = _iterableToArrayLimit;\nmodule.exports["default"] = module.exports, module.exports.__esModule = true;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pdGVyYWJsZVRvQXJyYXlMaW1pdC5qcz85YjQyIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSwyQkFBMkIsK0JBQStCO0FBQzFEOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EiLCJmaWxlIjoiNTAwLmpzIiwic291cmNlc0NvbnRlbnQiOlsiZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkge1xuICB2YXIgX2kgPSBhcnIgPT0gbnVsbCA/IG51bGwgOiB0eXBlb2YgU3ltYm9sICE9PSBcInVuZGVmaW5lZFwiICYmIGFycltTeW1ib2wuaXRlcmF0b3JdIHx8IGFycltcIkBAaXRlcmF0b3JcIl07XG5cbiAgaWYgKF9pID09IG51bGwpIHJldHVybjtcbiAgdmFyIF9hcnIgPSBbXTtcbiAgdmFyIF9uID0gdHJ1ZTtcbiAgdmFyIF9kID0gZmFsc2U7XG5cbiAgdmFyIF9zLCBfZTtcblxuICB0cnkge1xuICAgIGZvciAoX2kgPSBfaS5jYWxsKGFycik7ICEoX24gPSAoX3MgPSBfaS5uZXh0KCkpLmRvbmUpOyBfbiA9IHRydWUpIHtcbiAgICAgIF9hcnIucHVzaChfcy52YWx1ZSk7XG5cbiAgICAgIGlmIChpICYmIF9hcnIubGVuZ3RoID09PSBpKSBicmVhaztcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIF9kID0gdHJ1ZTtcbiAgICBfZSA9IGVycjtcbiAgfSBmaW5hbGx5IHtcbiAgICB0cnkge1xuICAgICAgaWYgKCFfbiAmJiBfaVtcInJldHVyblwiXSAhPSBudWxsKSBfaVtcInJldHVyblwiXSgpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAoX2QpIHRocm93IF9lO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBfYXJyO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9pdGVyYWJsZVRvQXJyYXlMaW1pdDtcbm1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///500\n')},function(module,exports){eval('function _nonIterableRest() {\n throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");\n}\n\nmodule.exports = _nonIterableRest;\nmodule.exports["default"] = module.exports, module.exports.__esModule = true;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9ub25JdGVyYWJsZVJlc3QuanM/YzI0MCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSIsImZpbGUiOiI1MDEuanMiLCJzb3VyY2VzQ29udGVudCI6WyJmdW5jdGlvbiBfbm9uSXRlcmFibGVSZXN0KCkge1xuICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9ub25JdGVyYWJsZVJlc3Q7XG5tb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0cywgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///501\n')},function(module,exports,__webpack_require__){"use strict";eval('\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nvar __generator = (this && this.__generator) || function (thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\n return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError("Generator is already executing.");\n while (_) try {\n if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n};\nvar __spreadArray = (this && this.__spreadArray) || function (to, from) {\n for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)\n to[j] = from[i];\n return to;\n};\nObject.defineProperty(exports, "__esModule", { value: true });\nexports.Container = void 0;\nvar binding_1 = __webpack_require__(503);\nvar ERROR_MSGS = __webpack_require__(40);\nvar literal_types_1 = __webpack_require__(56);\nvar METADATA_KEY = __webpack_require__(32);\nvar metadata_reader_1 = __webpack_require__(242);\nvar planner_1 = __webpack_require__(504);\nvar resolver_1 = __webpack_require__(511);\nvar binding_to_syntax_1 = __webpack_require__(513);\nvar id_1 = __webpack_require__(68);\nvar serialization_1 = __webpack_require__(91);\nvar container_snapshot_1 = __webpack_require__(516);\nvar lookup_1 = __webpack_require__(517);\nvar Container = (function () {\n function Container(containerOptions) {\n this._appliedMiddleware = [];\n var options = containerOptions || {};\n if (typeof options !== "object") {\n throw new Error("" + ERROR_MSGS.CONTAINER_OPTIONS_MUST_BE_AN_OBJECT);\n }\n if (options.defaultScope === undefined) {\n options.defaultScope = literal_types_1.BindingScopeEnum.Transient;\n }\n else if (options.defaultScope !== literal_types_1.BindingScopeEnum.Singleton &&\n options.defaultScope !== literal_types_1.BindingScopeEnum.Transient &&\n options.defaultScope !== literal_types_1.BindingScopeEnum.Request) {\n throw new Error("" + ERROR_MSGS.CONTAINER_OPTIONS_INVALID_DEFAULT_SCOPE);\n }\n if (options.autoBindInjectable === undefined) {\n options.autoBindInjectable = false;\n }\n else if (typeof options.autoBindInjectable !== "boolean") {\n throw new Error("" + ERROR_MSGS.CONTAINER_OPTIONS_INVALID_AUTO_BIND_INJECTABLE);\n }\n if (options.skipBaseClassChecks === undefined) {\n options.skipBaseClassChecks = false;\n }\n else if (typeof options.skipBaseClassChecks !== "boolean") {\n throw new Error("" + ERROR_MSGS.CONTAINER_OPTIONS_INVALID_SKIP_BASE_CHECK);\n }\n this.options = {\n autoBindInjectable: options.autoBindInjectable,\n defaultScope: options.defaultScope,\n skipBaseClassChecks: options.skipBaseClassChecks\n };\n this.id = id_1.id();\n this._bindingDictionary = new lookup_1.Lookup();\n this._snapshots = [];\n this._middleware = null;\n this.parent = null;\n this._metadataReader = new metadata_reader_1.MetadataReader();\n }\n Container.merge = function (container1, container2) {\n var container3 = [];\n for (var _i = 2; _i < arguments.length; _i++) {\n container3[_i - 2] = arguments[_i];\n }\n var container = new Container();\n var targetContainers = __spreadArray([container1, container2], container3).map(function (targetContainer) { return planner_1.getBindingDictionary(targetContainer); });\n var bindingDictionary = planner_1.getBindingDictionary(container);\n function copyDictionary(origin, destination) {\n origin.traverse(function (key, value) {\n value.forEach(function (binding) {\n destination.add(binding.serviceIdentifier, binding.clone());\n });\n });\n }\n targetContainers.forEach(function (targetBindingDictionary) {\n copyDictionary(targetBindingDictionary, bindingDictionary);\n });\n return container;\n };\n Container.prototype.load = function () {\n var modules = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n modules[_i] = arguments[_i];\n }\n var getHelpers = this._getContainerModuleHelpersFactory();\n for (var _a = 0, modules_1 = modules; _a < modules_1.length; _a++) {\n var currentModule = modules_1[_a];\n var containerModuleHelpers = getHelpers(currentModule.id);\n currentModule.registry(containerModuleHelpers.bindFunction, containerModuleHelpers.unbindFunction, containerModuleHelpers.isboundFunction, containerModuleHelpers.rebindFunction);\n }\n };\n Container.prototype.loadAsync = function () {\n var modules = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n modules[_i] = arguments[_i];\n }\n return __awaiter(this, void 0, void 0, function () {\n var getHelpers, _a, modules_2, currentModule, containerModuleHelpers;\n return __generator(this, function (_b) {\n switch (_b.label) {\n case 0:\n getHelpers = this._getContainerModuleHelpersFactory();\n _a = 0, modules_2 = modules;\n _b.label = 1;\n case 1:\n if (!(_a < modules_2.length)) return [3, 4];\n currentModule = modules_2[_a];\n containerModuleHelpers = getHelpers(currentModule.id);\n return [4, currentModule.registry(containerModuleHelpers.bindFunction, containerModuleHelpers.unbindFunction, containerModuleHelpers.isboundFunction, containerModuleHelpers.rebindFunction)];\n case 2:\n _b.sent();\n _b.label = 3;\n case 3:\n _a++;\n return [3, 1];\n case 4: return [2];\n }\n });\n });\n };\n Container.prototype.unload = function () {\n var _this = this;\n var modules = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n modules[_i] = arguments[_i];\n }\n var conditionFactory = function (expected) { return function (item) {\n return item.moduleId === expected;\n }; };\n modules.forEach(function (module) {\n var condition = conditionFactory(module.id);\n _this._bindingDictionary.removeByCondition(condition);\n });\n };\n Container.prototype.bind = function (serviceIdentifier) {\n var scope = this.options.defaultScope || literal_types_1.BindingScopeEnum.Transient;\n var binding = new binding_1.Binding(serviceIdentifier, scope);\n this._bindingDictionary.add(serviceIdentifier, binding);\n return new binding_to_syntax_1.BindingToSyntax(binding);\n };\n Container.prototype.rebind = function (serviceIdentifier) {\n this.unbind(serviceIdentifier);\n return this.bind(serviceIdentifier);\n };\n Container.prototype.unbind = function (serviceIdentifier) {\n try {\n this._bindingDictionary.remove(serviceIdentifier);\n }\n catch (e) {\n throw new Error(ERROR_MSGS.CANNOT_UNBIND + " " + serialization_1.getServiceIdentifierAsString(serviceIdentifier));\n }\n };\n Container.prototype.unbindAll = function () {\n this._bindingDictionary = new lookup_1.Lookup();\n };\n Container.prototype.isBound = function (serviceIdentifier) {\n var bound = this._bindingDictionary.hasKey(serviceIdentifier);\n if (!bound && this.parent) {\n bound = this.parent.isBound(serviceIdentifier);\n }\n return bound;\n };\n Container.prototype.isBoundNamed = function (serviceIdentifier, named) {\n return this.isBoundTagged(serviceIdentifier, METADATA_KEY.NAMED_TAG, named);\n };\n Container.prototype.isBoundTagged = function (serviceIdentifier, key, value) {\n var bound = false;\n if (this._bindingDictionary.hasKey(serviceIdentifier)) {\n var bindings = this._bindingDictionary.get(serviceIdentifier);\n var request_1 = planner_1.createMockRequest(this, serviceIdentifier, key, value);\n bound = bindings.some(function (b) { return b.constraint(request_1); });\n }\n if (!bound && this.parent) {\n bound = this.parent.isBoundTagged(serviceIdentifier, key, value);\n }\n return bound;\n };\n Container.prototype.snapshot = function () {\n this._snapshots.push(container_snapshot_1.ContainerSnapshot.of(this._bindingDictionary.clone(), this._middleware));\n };\n Container.prototype.restore = function () {\n var snapshot = this._snapshots.pop();\n if (snapshot === undefined) {\n throw new Error(ERROR_MSGS.NO_MORE_SNAPSHOTS_AVAILABLE);\n }\n this._bindingDictionary = snapshot.bindings;\n this._middleware = snapshot.middleware;\n };\n Container.prototype.createChild = function (containerOptions) {\n var child = new Container(containerOptions || this.options);\n child.parent = this;\n return child;\n };\n Container.prototype.applyMiddleware = function () {\n var middlewares = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n middlewares[_i] = arguments[_i];\n }\n this._appliedMiddleware = this._appliedMiddleware.concat(middlewares);\n var initial = (this._middleware) ? this._middleware : this._planAndResolve();\n this._middleware = middlewares.reduce(function (prev, curr) { return curr(prev); }, initial);\n };\n Container.prototype.applyCustomMetadataReader = function (metadataReader) {\n this._metadataReader = metadataReader;\n };\n Container.prototype.get = function (serviceIdentifier) {\n return this._get(false, false, literal_types_1.TargetTypeEnum.Variable, serviceIdentifier);\n };\n Container.prototype.getTagged = function (serviceIdentifier, key, value) {\n return this._get(false, false, literal_types_1.TargetTypeEnum.Variable, serviceIdentifier, key, value);\n };\n Container.prototype.getNamed = function (serviceIdentifier, named) {\n return this.getTagged(serviceIdentifier, METADATA_KEY.NAMED_TAG, named);\n };\n Container.prototype.getAll = function (serviceIdentifier) {\n return this._get(true, true, literal_types_1.TargetTypeEnum.Variable, serviceIdentifier);\n };\n Container.prototype.getAllTagged = function (serviceIdentifier, key, value) {\n return this._get(false, true, literal_types_1.TargetTypeEnum.Variable, serviceIdentifier, key, value);\n };\n Container.prototype.getAllNamed = function (serviceIdentifier, named) {\n return this.getAllTagged(serviceIdentifier, METADATA_KEY.NAMED_TAG, named);\n };\n Container.prototype.resolve = function (constructorFunction) {\n var tempContainer = this.createChild();\n tempContainer.bind(constructorFunction).toSelf();\n this._appliedMiddleware.forEach(function (m) {\n tempContainer.applyMiddleware(m);\n });\n return tempContainer.get(constructorFunction);\n };\n Container.prototype._getContainerModuleHelpersFactory = function () {\n var _this = this;\n var setModuleId = function (bindingToSyntax, moduleId) {\n bindingToSyntax._binding.moduleId = moduleId;\n };\n var getBindFunction = function (moduleId) {\n return function (serviceIdentifier) {\n var _bind = _this.bind.bind(_this);\n var bindingToSyntax = _bind(serviceIdentifier);\n setModuleId(bindingToSyntax, moduleId);\n return bindingToSyntax;\n };\n };\n var getUnbindFunction = function (moduleId) {\n return function (serviceIdentifier) {\n var _unbind = _this.unbind.bind(_this);\n _unbind(serviceIdentifier);\n };\n };\n var getIsboundFunction = function (moduleId) {\n return function (serviceIdentifier) {\n var _isBound = _this.isBound.bind(_this);\n return _isBound(serviceIdentifier);\n };\n };\n var getRebindFunction = function (moduleId) {\n return function (serviceIdentifier) {\n var _rebind = _this.rebind.bind(_this);\n var bindingToSyntax = _rebind(serviceIdentifier);\n setModuleId(bindingToSyntax, moduleId);\n return bindingToSyntax;\n };\n };\n return function (mId) { return ({\n bindFunction: getBindFunction(mId),\n isboundFunction: getIsboundFunction(mId),\n rebindFunction: getRebindFunction(mId),\n unbindFunction: getUnbindFunction(mId)\n }); };\n };\n Container.prototype._get = function (avoidConstraints, isMultiInject, targetType, serviceIdentifier, key, value) {\n var result = null;\n var defaultArgs = {\n avoidConstraints: avoidConstraints,\n contextInterceptor: function (context) { return context; },\n isMultiInject: isMultiInject,\n key: key,\n serviceIdentifier: serviceIdentifier,\n targetType: targetType,\n value: value\n };\n if (this._middleware) {\n result = this._middleware(defaultArgs);\n if (result === undefined || result === null) {\n throw new Error(ERROR_MSGS.INVALID_MIDDLEWARE_RETURN);\n }\n }\n else {\n result = this._planAndResolve()(defaultArgs);\n }\n return result;\n };\n Container.prototype._planAndResolve = function () {\n var _this = this;\n return function (args) {\n var context = planner_1.plan(_this._metadataReader, _this, args.isMultiInject, args.targetType, args.serviceIdentifier, args.key, args.value, args.avoidConstraints);\n context = args.contextInterceptor(context);\n var result = resolver_1.resolve(context);\n return result;\n };\n };\n return Container;\n}());\nexports.Container = Container;\n//# sourceMappingURL=container.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaW52ZXJzaWZ5L2xpYi9jb250YWluZXIvY29udGFpbmVyLmpzP2Y0NTciXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQWE7QUFDYjtBQUNBLDJCQUEyQiwrREFBK0QsZ0JBQWdCLEVBQUUsRUFBRTtBQUM5RztBQUNBLG1DQUFtQyxNQUFNLDZCQUE2QixFQUFFLFlBQVksV0FBVyxFQUFFO0FBQ2pHLGtDQUFrQyxNQUFNLGlDQUFpQyxFQUFFLFlBQVksV0FBVyxFQUFFO0FBQ3BHLCtCQUErQixxRkFBcUY7QUFDcEg7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLGFBQWEsNkJBQTZCLDBCQUEwQixhQUFhLEVBQUUscUJBQXFCO0FBQ3hHLGdCQUFnQixxREFBcUQsb0VBQW9FLGFBQWEsRUFBRTtBQUN4SixzQkFBc0Isc0JBQXNCLHFCQUFxQixHQUFHO0FBQ3BFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QztBQUN2QyxrQ0FBa0MsU0FBUztBQUMzQyxrQ0FBa0MsV0FBVyxVQUFVO0FBQ3ZELHlDQUF5QyxjQUFjO0FBQ3ZEO0FBQ0EsNkdBQTZHLE9BQU8sVUFBVTtBQUM5SCxnRkFBZ0YsaUJBQWlCLE9BQU87QUFDeEcsd0RBQXdELGdCQUFnQixRQUFRLE9BQU87QUFDdkYsOENBQThDLGdCQUFnQixnQkFBZ0IsT0FBTztBQUNyRjtBQUNBLGlDQUFpQztBQUNqQztBQUNBO0FBQ0EsU0FBUyxZQUFZLGFBQWEsT0FBTyxFQUFFLFVBQVUsV0FBVztBQUNoRSxtQ0FBbUMsU0FBUztBQUM1QztBQUNBO0FBQ0E7QUFDQSxvREFBb0QsUUFBUTtBQUM1RDtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEMsY0FBYztBQUM1RDtBQUNBLGdCQUFnQixtQkFBTyxDQUFDLEdBQXFCO0FBQzdDLGlCQUFpQixtQkFBTyxDQUFDLEVBQXlCO0FBQ2xELHNCQUFzQixtQkFBTyxDQUFDLEVBQTRCO0FBQzFELG1CQUFtQixtQkFBTyxD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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQSIsImZpbGUiOiI1MDIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xudmFyIF9fZ2VuZXJhdG9yID0gKHRoaXMgJiYgdGhpcy5fX2dlbmVyYXRvcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIGJvZHkpIHtcbiAgICB2YXIgXyA9IHsgbGFiZWw6IDAsIHNlbnQ6IGZ1bmN0aW9uKCkgeyBpZiAodFswXSAmIDEpIHRocm93IHRbMV07IHJldHVybiB0WzFdOyB9LCB0cnlzOiBbXSwgb3BzOiBbXSB9LCBmLCB5LCB0LCBnO1xuICAgIHJldHVybiBnID0geyBuZXh0OiB2ZXJiKDApLCBcInRocm93XCI6IHZlcmIoMSksIFwicmV0dXJuXCI6IHZlcmIoMikgfSwgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pLCBnO1xuICAgIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxuICAgIGZ1bmN0aW9uIHN0ZXAob3ApIHtcbiAgICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xuICAgICAgICB3aGlsZSAoXykgdHJ5IHtcbiAgICAgICAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IG9wWzBdICYgMiA/IHlbXCJyZXR1cm5cIl0gOiBvcFswXSA/IHlbXCJ0aHJvd1wiXSB8fCAoKHQgPSB5W1wicmV0dXJuXCJdKSAmJiB0LmNhbGwoeSksIDApIDogeS5uZXh0KSAmJiAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKSByZXR1cm4gdDtcbiAgICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbb3BbMF0gJiAyLCB0LnZhbHVlXTtcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcbiAgICAgICAgICAgICAgICBjYXNlIDA6IGNhc2UgMTogdCA9IG9wOyBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDQ6IF8ubGFiZWwrKzsgcmV0dXJuIHsgdmFsdWU6IG9wWzFdLCBkb25lOiBmYWxzZSB9O1xuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDc6IG9wID0gXy5vcHMucG9wKCk7IF8udHJ5cy5wb3AoKTsgY29udGludWU7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgKG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSkgeyBfLmxhYmVsID0gb3BbMV07IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkgeyBfLmxhYmVsID0gdFsxXTsgdCA9IG9wOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pO1xuICAgICAgICB9IGNhdGNoIChlKSB7IG9wID0gWzYsIGVdOyB5ID0gMDsgfSBmaW5hbGx5IHsgZiA9IHQgPSAwOyB9XG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xuICAgIH1cbn07XG52YXIgX19zcHJlYWRBcnJheSA9ICh0aGlzICYmIHRoaXMuX19zcHJlYWRBcnJheSkgfHwgZnVuY3Rpb24gKHRvLCBmcm9tKSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIGlsID0gZnJvbS5sZW5ndGgsIGogPSB0by5sZW5ndGg7IGkgPCBpbDsgaSsrLCBqKyspXG4gICAgICAgIHRvW2pdID0gZnJvbVtpXTtcbiAgICByZXR1cm4gdG87XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5Db250YWluZXIgPSB2b2lkIDA7XG52YXIgYmluZGluZ18xID0gcmVxdWlyZShcIi4uL2JpbmRpbmdzL2JpbmRpbmdcIik7XG52YXIgRVJST1JfTVNHUyA9IHJlcXVpcmUoXCIuLi9jb25zdGFudHMvZXJyb3JfbXNnc1wiKTtcbnZhciBsaXRlcmFsX3R5cGVzXzEgPSByZXF1aXJlKFwiLi4vY29uc3RhbnRzL2xpdGVyYWxfdHlwZXNcIik7XG52YXIgTUVUQURBVEFfS0VZID0gcmVxdWlyZShcIi4uL2NvbnN0YW50cy9tZXRhZGF0YV9rZXlzXCIpO1xudmFyIG1ldGFkYXRhX3JlYWRlcl8xID0gcmVxdWlyZShcIi4uL3BsYW5uaW5nL21ldGFkYXRhX3JlYWRlclwiKTtcbnZhciBwbGFubmVyXzEgPSByZXF1aXJlKFwiLi4vcGxhbm5pbmcvcGxhbm5lclwiKTtcbnZhciByZXNvbHZlcl8xID0gcmVxdWlyZShcIi4uL3Jlc29sdXRpb24vcmVzb2x2ZXJcIik7XG52YXIgYmluZGluZ190b19zeW50YXhfMSA9IHJlcXVpcmUoXCIuLi9zeW50YXgvYmluZGluZ190b19zeW50YXhcIik7XG52YXIgaWRfMSA9IHJlcXVpcmUoXCIuLi91dGlscy9pZFwiKTtcbnZhciBzZXJpYWxpemF0aW9uXzEgPSByZXF1aXJlKFwiLi4vdXRpbHMvc2VyaWFsaXphdGlvblwiKTtcbnZhciBjb250YWluZXJfc25hcHNob3RfMSA9IHJlcXVpcmUoXCIuL2NvbnRhaW5lcl9zbmFwc2hvdFwiKTtcbnZhciBsb29rdXBfMSA9IHJlcXVpcmUoXCIuL2xvb2t1cFwiKTtcbnZhciBDb250YWluZXIgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIENvbnRhaW5lcihjb250YWluZXJPcHRpb25zKSB7XG4gICAgICAgIHRoaXMuX2FwcGxpZWRNaWRkbGV3YXJlID0gW107XG4gICAgICAgIHZhciBvcHRpb25zID0gY29udGFpbmVyT3B0aW9ucyB8fCB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJcIiArIEVSUk9SX01TR1MuQ09OVEFJTkVSX09QVElPTlNfTVVTVF9CRV9BTl9PQkpFQ1QpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLmRlZmF1bHRTY29wZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBvcHRpb25zLmRlZmF1bHRTY29wZSA9IGxpdGVyYWxfdHlwZXNfMS5CaW5kaW5nU2NvcGVFbnVtLlRyYW5zaWVudDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChvcHRpb25zLmRlZmF1bHRTY29wZSAhPT0gbGl0ZXJhbF90eXBlc18xLkJpbmRpbmdTY29wZUVudW0uU2luZ2xldG9uICYmXG4gICAgICAgICAgICBvcHRpb25zLmRlZmF1bHRTY29wZSAhPT0gbGl0ZXJhbF90eXBlc18xLkJpbmRpbmdTY29wZUVudW0uVHJhbnNpZW50ICYmXG4gICAgICAgICAgICBvcHRpb25zLmRlZmF1bHRTY29wZSAhPT0gbGl0ZXJhbF90eXBlc18xLkJpbmRpbmdTY29wZUVudW0uUmVxdWVzdCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiXCIgKyBFUlJPUl9NU0dTLkNPTlRBSU5FUl9PUFRJT05TX0lOVkFMSURfREVGQVVMVF9TQ09QRSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMuYXV0b0JpbmRJbmplY3RhYmxlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG9wdGlvbnMuYXV0b0JpbmRJbmplY3RhYmxlID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIG9wdGlvbnMuYXV0b0JpbmRJbmplY3RhYmxlICE9PSBcImJvb2xlYW5cIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiXCIgKyBFUlJPUl9NU0dTLkNPTlRBSU5FUl9PUFRJT05TX0lOVkFMSURfQVVUT19CSU5EX0lOSkVDVEFCTEUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLnNraXBCYXNlQ2xhc3NDaGVja3MgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgb3B0aW9ucy5za2lwQmFzZUNsYXNzQ2hlY2tzID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIG9wdGlvbnMuc2tpcEJhc2VDbGFzc0NoZWNrcyAhPT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlwiICsgRVJST1JfTVNHUy5DT05UQUlORVJfT1BUSU9OU19JTlZBTElEX1NLSVBfQkFTRV9DSEVDSyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vcHRpb25zID0ge1xuICAgICAgICAgICAgYXV0b0JpbmRJbmplY3RhYmxlOiBvcHRpb25zLmF1dG9CaW5kSW5qZWN0YWJsZSxcbiAgICAgICAgICAgIGRlZmF1bHRTY29wZTogb3B0aW9ucy5kZWZhdWx0U2NvcGUsXG4gICAgICAgICAgICBza2lwQmFzZUNsYXNzQ2hlY2tzOiBvcHRpb25zLnNraXBCYXNlQ2xhc3NDaGVja3NcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5pZCA9IGlkXzEuaWQoKTtcbiAgICAgICAgdGhpcy5fYmluZGluZ0RpY3Rpb25hcnkgPSBuZXcgbG9va3VwXzEuTG9va3VwKCk7XG4gICAgICAgIHRoaXMuX3NuYXBzaG90cyA9IFtdO1xuICAgICAgICB0aGlzLl9taWRkbGV3YXJlID0gbnVsbDtcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBudWxsO1xuICAgICAgICB0aGlzLl9tZXRhZGF0YVJlYWRlciA9IG5ldyBtZXRhZGF0YV9yZWFkZXJfMS5NZXRhZGF0YVJlYWRlcigpO1xuICAgIH1cbiAgICBDb250YWluZXIubWVyZ2UgPSBmdW5jdGlvbiAoY29udGFpbmVyMSwgY29udGFpbmVyMikge1xuICAgICAgICB2YXIgY29udGFpbmVyMyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDI7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgY29udGFpbmVyM1tfaSAtIDJdID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY29udGFpbmVyID0gbmV3IENvbnRhaW5lcigpO1xuICAgICAgICB2YXIgdGFyZ2V0Q29udGFpbmVycyA9IF9fc3ByZWFkQXJyYXkoW2NvbnRhaW5lcjEsIGNvbnRhaW5lcjJdLCBjb250YWluZXIzKS5tYXAoZnVuY3Rpb24gKHRhcmdldENvbnRhaW5lcikgeyByZXR1cm4gcGxhbm5lcl8xLmdldEJpbmRpbmdEaWN0aW9uYXJ5KHRhcmdldENvbnRhaW5lcik7IH0pO1xuICAgICAgICB2YXIgYmluZGluZ0RpY3Rpb25hcnkgPSBwbGFubmVyXzEuZ2V0QmluZGluZ0RpY3Rpb25hcnkoY29udGFpbmVyKTtcbiAgICAgICAgZnVuY3Rpb24gY29weURpY3Rpb25hcnkob3JpZ2luLCBkZXN0aW5hdGlvbikge1xuICAgICAgICAgICAgb3JpZ2luLnRyYXZlcnNlKGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUuZm9yRWFjaChmdW5jdGlvbiAoYmluZGluZykge1xuICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbi5hZGQoYmluZGluZy5zZXJ2aWNlSWRlbnRpZmllciwgYmluZGluZy5jbG9uZSgpKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRhcmdldENvbnRhaW5lcnMuZm9yRWFjaChmdW5jdGlvbiAodGFyZ2V0QmluZGluZ0RpY3Rpb25hcnkpIHtcbiAgICAgICAgICAgIGNvcHlEaWN0aW9uYXJ5KHRhcmdldEJpbmRpbmdEaWN0aW9uYXJ5LCBiaW5kaW5nRGljdGlvbmFyeSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gY29udGFpbmVyO1xuICAgIH07XG4gICAgQ29udGFpbmVyLnByb3RvdHlwZS5sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgbW9kdWxlcyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgbW9kdWxlc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICB9XG4gICAgICAgIHZhciBnZXRIZWxwZXJzID0gdGhpcy5fZ2V0Q29udGFpbmVyTW9kdWxlSGVscGVyc0ZhY3RvcnkoKTtcbiAgICAgICAgZm9yICh2YXIgX2EgPSAwLCBtb2R1bGVzXzEgPSBtb2R1bGVzOyBfYSA8IG1vZHVsZXNfMS5sZW5ndGg7IF9hKyspIHtcbiAgICAgICAgICAgIHZhciBjdXJyZW50TW9kdWxlID0gbW9kdWxlc18xW19hXTtcbiAgICAgICAgICAgIHZhciBjb250YWluZXJNb2R1bGVIZWxwZXJzID0gZ2V0SGVscGVycyhjdXJyZW50TW9kdWxlLmlkKTtcbiAgICAgICAgICAgIGN1cnJlbnRNb2R1bGUucmVnaXN0cnkoY29udGFpbmVyTW9kdWxlSGVscGVycy5iaW5kRnVuY3Rpb24sIGNvbnRhaW5lck1vZHVsZUhlbHBlcnMudW5iaW5kRnVuY3Rpb24sIGNvbnRhaW5lck1vZHVsZUhlbHBlcnMuaXNib3VuZEZ1bmN0aW9uLCBjb250YWluZXJNb2R1bGVIZWxwZXJzLnJlYmluZEZ1bmN0aW9uKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgQ29udGFpbmVyLnByb3RvdHlwZS5sb2FkQXN5bmMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBtb2R1bGVzID0gW107XG4gICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICBtb2R1bGVzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGdldEhlbHBlcnMsIF9hLCBtb2R1bGVzXzIsIGN1cnJlbnRNb2R1bGUsIGNvbnRhaW5lck1vZHVsZUhlbHBlcnM7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9iKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYi5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBnZXRIZWxwZXJzID0gdGhpcy5fZ2V0Q29udGFpbmVyTW9kdWxlSGVscGVyc0ZhY3RvcnkoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gMCwgbW9kdWxlc18yID0gbW9kdWxlcztcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gMTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoX2EgPCBtb2R1bGVzXzIubGVuZ3RoKSkgcmV0dXJuIFszLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRNb2R1bGUgPSBtb2R1bGVzXzJbX2FdO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyTW9kdWxlSGVscGVycyA9IGdldEhlbHBlcnMoY3VycmVudE1vZHVsZS5pZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQsIGN1cnJlbnRNb2R1bGUucmVnaXN0cnkoY29udGFpbmVyTW9kdWxlSGVscGVycy5iaW5kRnVuY3Rpb24sIGNvbnRhaW5lck1vZHVsZUhlbHBlcnMudW5iaW5kRnVuY3Rpb24sIGNvbnRhaW5lck1vZHVsZUhlbHBlcnMuaXNib3VuZEZ1bmN0aW9uLCBjb250YWluZXJNb2R1bGVIZWxwZXJzLnJlYmluZEZ1bmN0aW9uKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gMztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2ErKztcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMywgMV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDogcmV0dXJuIFsyXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBDb250YWluZXIucHJvdG90eXBlLnVubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIG1vZHVsZXMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIG1vZHVsZXNbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY29uZGl0aW9uRmFjdG9yeSA9IGZ1bmN0aW9uIChleHBlY3RlZCkgeyByZXR1cm4gZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgICAgIHJldHVybiBpdGVtLm1vZHVsZUlkID09PSBleHBlY3RlZDtcbiAgICAgICAgfTsgfTtcbiAgICAgICAgbW9kdWxlcy5mb3JFYWNoKGZ1bmN0aW9uIChtb2R1bGUpIHtcbiAgICAgICAgICAgIHZhciBjb25kaXRpb24gPSBjb25kaXRpb25GYWN0b3J5KG1vZHVsZS5pZCk7XG4gICAgICAgICAgICBfdGhpcy5fYmluZGluZ0RpY3Rpb25hcnkucmVtb3ZlQnlDb25kaXRpb24oY29uZGl0aW9uKTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBDb250YWluZXIucHJvdG90eXBlLmJpbmQgPSBmdW5jdGlvbiAoc2VydmljZUlkZW50aWZpZXIpIHtcbiAgICAgICAgdmFyIHNjb3BlID0gdGhpcy5vcHRpb25zLmRlZmF1bHRTY29wZSB8fCBsaXRlcmFsX3R5cGVzXzEuQmluZGluZ1Njb3BlRW51bS5UcmFuc2llbnQ7XG4gICAgICAgIHZhciBiaW5kaW5nID0gbmV3IGJpbmRpbmdfMS5CaW5kaW5nKHNlcnZpY2VJZGVudGlmaWVyLCBzY29wZSk7XG4gICAgICAgIHRoaXMuX2JpbmRpbmdEaWN0aW9uYXJ5LmFkZChzZXJ2aWNlSWRlbnRpZmllciwgYmluZGluZyk7XG4gICAgICAgIHJldHVybiBuZXcgYmluZGluZ190b19zeW50YXhfMS5CaW5kaW5nVG9TeW50YXgoYmluZGluZyk7XG4gICAgfTtcbiAgICBDb250YWluZXIucHJvdG90eXBlLnJlYmluZCA9IGZ1bmN0aW9uIChzZXJ2aWNlSWRlbnRpZmllcikge1xuICAgICAgICB0aGlzLnVuYmluZChzZXJ2aWNlSWRlbnRpZmllcik7XG4gICAgICAgIHJldHVybiB0aGlzLmJpbmQoc2VydmljZUlkZW50aWZpZXIpO1xuICAgIH07XG4gICAgQ29udGFpbmVyLnByb3RvdHlwZS51bmJpbmQgPSBmdW5jdGlvbiAoc2VydmljZUlkZW50aWZpZXIpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuX2JpbmRpbmdEaWN0aW9uYXJ5LnJlbW92ZShzZXJ2aWNlSWRlbnRpZmllcik7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihFUlJPUl9NU0dTLkNBTk5PVF9VTkJJTkQgKyBcIiBcIiArIHNlcmlhbGl6YXRpb25fMS5nZXRTZXJ2aWNlSWRlbnRpZmllckFzU3RyaW5nKHNlcnZpY2VJZGVudGlmaWVyKSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIENvbnRhaW5lci5wcm90b3R5cGUudW5iaW5kQWxsID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl9iaW5kaW5nRGljdGlvbmFyeSA9IG5ldyBsb29rdXBfMS5Mb29rdXAoKTtcbiAgICB9O1xuICAgIENvbnRhaW5lci5wcm90b3R5cGUuaXNCb3VuZCA9IGZ1bmN0aW9uIChzZXJ2aWNlSWRlbnRpZmllcikge1xuICAgICAgICB2YXIgYm91bmQgPSB0aGlzLl9iaW5kaW5nRGljdGlvbmFyeS5oYXNLZXkoc2VydmljZUlkZW50aWZpZXIpO1xuICAgICAgICBpZiAoIWJvdW5kICYmIHRoaXMucGFyZW50KSB7XG4gICAgICAgICAgICBib3VuZCA9IHRoaXMucGFyZW50LmlzQm91bmQoc2VydmljZUlkZW50aWZpZXIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBib3VuZDtcbiAgICB9O1xuICAgIENvbnRhaW5lci5wcm90b3R5cGUuaXNCb3VuZE5hbWVkID0gZnVuY3Rpb24gKHNlcnZpY2VJZGVudGlmaWVyLCBuYW1lZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc0JvdW5kVGFnZ2VkKHNlcnZpY2VJZGVudGlmaWVyLCBNRVRBREFUQV9LRVkuTkFNRURfVEFHLCBuYW1lZCk7XG4gICAgfTtcbiAgICBDb250YWluZXIucHJvdG90eXBlLmlzQm91bmRUYWdnZWQgPSBmdW5jdGlvbiAoc2VydmljZUlkZW50aWZpZXIsIGtleSwgdmFsdWUpIHtcbiAgICAgICAgdmFyIGJvdW5kID0gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLl9iaW5kaW5nRGljdGlvbmFyeS5oYXNLZXkoc2VydmljZUlkZW50aWZpZXIpKSB7XG4gICAgICAgICAgICB2YXIgYmluZGluZ3MgPSB0aGlzLl9iaW5kaW5nRGljdGlvbmFyeS5nZXQoc2VydmljZUlkZW50aWZpZXIpO1xuICAgICAgICAgICAgdmFyIHJlcXVlc3RfMSA9IHBsYW5uZXJfMS5jcmVhdGVNb2NrUmVxdWVzdCh0aGlzLCBzZXJ2aWNlSWRlbnRpZmllciwga2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICBib3VuZCA9IGJpbmRpbmdzLnNvbWUoZnVuY3Rpb24gKGIpIHsgcmV0dXJuIGIuY29uc3RyYWludChyZXF1ZXN0XzEpOyB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWJvdW5kICYmIHRoaXMucGFyZW50KSB7XG4gICAgICAgICAgICBib3VuZCA9IHRoaXMucGFyZW50LmlzQm91bmRUYWdnZWQoc2VydmljZUlkZW50aWZpZXIsIGtleSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBib3VuZDtcbiAgICB9O1xuICAgIENvbnRhaW5lci5wcm90b3R5cGUuc25hcHNob3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX3NuYXBzaG90cy5wdXNoKGNvbnRhaW5lcl9zbmFwc2hvdF8xLkNvbnRhaW5lclNuYXBzaG90Lm9mKHRoaXMuX2JpbmRpbmdEaWN0aW9uYXJ5LmNsb25lKCksIHRoaXMuX21pZGRsZXdhcmUpKTtcbiAgICB9O1xuICAgIENvbnRhaW5lci5wcm90b3R5cGUucmVzdG9yZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHNuYXBzaG90ID0gdGhpcy5fc25hcHNob3RzLnBvcCgpO1xuICAgICAgICBpZiAoc25hcHNob3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKEVSUk9SX01TR1MuTk9fTU9SRV9TTkFQU0hPVFNfQVZBSUxBQkxFKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9iaW5kaW5nRGljdGlvbmFyeSA9IHNuYXBzaG90LmJpbmRpbmdzO1xuICAgICAgICB0aGlzLl9taWRkbGV3YXJlID0gc25hcHNob3QubWlkZGxld2FyZTtcbiAgICB9O1xuICAgIENvbnRhaW5lci5wcm90b3R5cGUuY3JlYXRlQ2hpbGQgPSBmdW5jdGlvbiAoY29udGFpbmVyT3B0aW9ucykge1xuICAgICAgICB2YXIgY2hpbGQgPSBuZXcgQ29udGFpbmVyKGNvbnRhaW5lck9wdGlvbnMgfHwgdGhpcy5vcHRpb25zKTtcbiAgICAgICAgY2hpbGQucGFyZW50ID0gdGhpcztcbiAgICAgICAgcmV0dXJuIGNoaWxkO1xuICAgIH07XG4gICAgQ29udGFpbmVyLnByb3RvdHlwZS5hcHBseU1pZGRsZXdhcmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBtaWRkbGV3YXJlcyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgbWlkZGxld2FyZXNbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9hcHBsaWVkTWlkZGxld2FyZSA9IHRoaXMuX2FwcGxpZWRNaWRkbGV3YXJlLmNvbmNhdChtaWRkbGV3YXJlcyk7XG4gICAgICAgIHZhciBpbml0aWFsID0gKHRoaXMuX21pZGRsZXdhcmUpID8gdGhpcy5fbWlkZGxld2FyZSA6IHRoaXMuX3BsYW5BbmRSZXNvbHZlKCk7XG4gICAgICAgIHRoaXMuX21pZGRsZXdhcmUgPSBtaWRkbGV3YXJlcy5yZWR1Y2UoZnVuY3Rpb24gKHByZXYsIGN1cnIpIHsgcmV0dXJuIGN1cnIocHJldik7IH0sIGluaXRpYWwpO1xuICAgIH07XG4gICAgQ29udGFpbmVyLnByb3RvdHlwZS5hcHBseUN1c3RvbU1ldGFkYXRhUmVhZGVyID0gZnVuY3Rpb24gKG1ldGFkYXRhUmVhZGVyKSB7XG4gICAgICAgIHRoaXMuX21ldGFkYXRhUmVhZGVyID0gbWV0YWRhdGFSZWFkZXI7XG4gICAgfTtcbiAgICBDb250YWluZXIucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChzZXJ2aWNlSWRlbnRpZmllcikge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0KGZhbHNlLCBmYWxzZSwgbGl0ZXJhbF90eXBlc18xLlRhcmdldFR5cGVFbnVtLlZhcmlhYmxlLCBzZXJ2aWNlSWRlbnRpZmllcik7XG4gICAgfTtcbiAgICBDb250YWluZXIucHJvdG90eXBlLmdldFRhZ2dlZCA9IGZ1bmN0aW9uIChzZXJ2aWNlSWRlbnRpZmllciwga2V5LCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0KGZhbHNlLCBmYWxzZSwgbGl0ZXJhbF90eXBlc18xLlRhcmdldFR5cGVFbnVtLlZhcmlhYmxlLCBzZXJ2aWNlSWRlbnRpZmllciwga2V5LCB2YWx1ZSk7XG4gICAgfTtcbiAgICBDb250YWluZXIucHJvdG90eXBlLmdldE5hbWVkID0gZnVuY3Rpb24gKHNlcnZpY2VJZGVudGlmaWVyLCBuYW1lZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRUYWdnZWQoc2VydmljZUlkZW50aWZpZXIsIE1FVEFEQVRBX0tFWS5OQU1FRF9UQUcsIG5hbWVkKTtcbiAgICB9O1xuICAgIENvbnRhaW5lci5wcm90b3R5cGUuZ2V0QWxsID0gZnVuY3Rpb24gKHNlcnZpY2VJZGVudGlmaWVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXQodHJ1ZSwgdHJ1ZSwgbGl0ZXJhbF90eXBlc18xLlRhcmdldFR5cGVFbnVtLlZhcmlhYmxlLCBzZXJ2aWNlSWRlbnRpZmllcik7XG4gICAgfTtcbiAgICBDb250YWluZXIucHJvdG90eXBlLmdldEFsbFRhZ2dlZCA9IGZ1bmN0aW9uIChzZXJ2aWNlSWRlbnRpZmllciwga2V5LCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0KGZhbHNlLCB0cnVlLCBsaXRlcmFsX3R5cGVzXzEuVGFyZ2V0VHlwZUVudW0uVmFyaWFibGUsIHNlcnZpY2VJZGVudGlmaWVyLCBrZXksIHZhbHVlKTtcbiAgICB9O1xuICAgIENvbnRhaW5lci5wcm90b3R5cGUuZ2V0QWxsTmFtZWQgPSBmdW5jdGlvbiAoc2VydmljZUlkZW50aWZpZXIsIG5hbWVkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEFsbFRhZ2dlZChzZXJ2aWNlSWRlbnRpZmllciwgTUVUQURBVEFfS0VZLk5BTUVEX1RBRywgbmFtZWQpO1xuICAgIH07XG4gICAgQ29udGFpbmVyLnByb3RvdHlwZS5yZXNvbHZlID0gZnVuY3Rpb24gKGNvbnN0cnVjdG9yRnVuY3Rpb24pIHtcbiAgICAgICAgdmFyIHRlbXBDb250YWluZXIgPSB0aGlzLmNyZWF0ZUNoaWxkKCk7XG4gICAgICAgIHRlbXBDb250YWluZXIuYmluZChjb25zdHJ1Y3RvckZ1bmN0aW9uKS50b1NlbGYoKTtcbiAgICAgICAgdGhpcy5fYXBwbGllZE1pZGRsZXdhcmUuZm9yRWFjaChmdW5jdGlvbiAobSkge1xuICAgICAgICAgICAgdGVtcENvbnRhaW5lci5hcHBseU1pZGRsZXdhcmUobSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGVtcENvbnRhaW5lci5nZXQoY29uc3RydWN0b3JGdW5jdGlvbik7XG4gICAgfTtcbiAgICBDb250YWluZXIucHJvdG90eXBlLl9nZXRDb250YWluZXJNb2R1bGVIZWxwZXJzRmFjdG9yeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIHNldE1vZHVsZUlkID0gZnVuY3Rpb24gKGJpbmRpbmdUb1N5bnRheCwgbW9kdWxlSWQpIHtcbiAgICAgICAgICAgIGJpbmRpbmdUb1N5bnRheC5fYmluZGluZy5tb2R1bGVJZCA9IG1vZHVsZUlkO1xuICAgICAgICB9O1xuICAgICAgICB2YXIgZ2V0QmluZEZ1bmN0aW9uID0gZnVuY3Rpb24gKG1vZHVsZUlkKSB7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHNlcnZpY2VJZGVudGlmaWVyKSB7XG4gICAgICAgICAgICAgICAgdmFyIF9iaW5kID0gX3RoaXMuYmluZC5iaW5kKF90aGlzKTtcbiAgICAgICAgICAgICAgICB2YXIgYmluZGluZ1RvU3ludGF4ID0gX2JpbmQoc2VydmljZUlkZW50aWZpZXIpO1xuICAgICAgICAgICAgICAgIHNldE1vZHVsZUlkKGJpbmRpbmdUb1N5bnRheCwgbW9kdWxlSWQpO1xuICAgICAgICAgICAgICAgIHJldHVybiBiaW5kaW5nVG9TeW50YXg7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9O1xuICAgICAgICB2YXIgZ2V0VW5iaW5kRnVuY3Rpb24gPSBmdW5jdGlvbiAobW9kdWxlSWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoc2VydmljZUlkZW50aWZpZXIpIHtcbiAgICAgICAgICAgICAgICB2YXIgX3VuYmluZCA9IF90aGlzLnVuYmluZC5iaW5kKF90aGlzKTtcbiAgICAgICAgICAgICAgICBfdW5iaW5kKHNlcnZpY2VJZGVudGlmaWVyKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH07XG4gICAgICAgIHZhciBnZXRJc2JvdW5kRnVuY3Rpb24gPSBmdW5jdGlvbiAobW9kdWxlSWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoc2VydmljZUlkZW50aWZpZXIpIHtcbiAgICAgICAgICAgICAgICB2YXIgX2lzQm91bmQgPSBfdGhpcy5pc0JvdW5kLmJpbmQoX3RoaXMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBfaXNCb3VuZChzZXJ2aWNlSWRlbnRpZmllcik7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9O1xuICAgICAgICB2YXIgZ2V0UmViaW5kRnVuY3Rpb24gPSBmdW5jdGlvbiAobW9kdWxlSWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoc2VydmljZUlkZW50aWZpZXIpIHtcbiAgICAgICAgICAgICAgICB2YXIgX3JlYmluZCA9IF90aGlzLnJlYmluZC5iaW5kKF90aGlzKTtcbiAgICAgICAgICAgICAgICB2YXIgYmluZGluZ1RvU3ludGF4ID0gX3JlYmluZChzZXJ2aWNlSWRlbnRpZmllcik7XG4gICAgICAgICAgICAgICAgc2V0TW9kdWxlSWQoYmluZGluZ1RvU3ludGF4LCBtb2R1bGVJZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGJpbmRpbmdUb1N5bnRheDtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAobUlkKSB7IHJldHVybiAoe1xuICAgICAgICAgICAgYmluZEZ1bmN0aW9uOiBnZXRCaW5kRnVuY3Rpb24obUlkKSxcbiAgICAgICAgICAgIGlzYm91bmRGdW5jdGlvbjogZ2V0SXNib3VuZEZ1bmN0aW9uKG1JZCksXG4gICAgICAgICAgICByZWJpbmRGdW5jdGlvbjogZ2V0UmViaW5kRnVuY3Rpb24obUlkKSxcbiAgICAgICAgICAgIHVuYmluZEZ1bmN0aW9uOiBnZXRVbmJpbmRGdW5jdGlvbihtSWQpXG4gICAgICAgIH0pOyB9O1xuICAgIH07XG4gICAgQ29udGFpbmVyLnByb3RvdHlwZS5fZ2V0ID0gZnVuY3Rpb24gKGF2b2lkQ29uc3RyYWludHMsIGlzTXVsdGlJbmplY3QsIHRhcmdldFR5cGUsIHNlcnZpY2VJZGVudGlmaWVyLCBrZXksIHZhbHVlKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBudWxsO1xuICAgICAgICB2YXIgZGVmYXVsdEFyZ3MgPSB7XG4gICAgICAgICAgICBhdm9pZENvbnN0cmFpbnRzOiBhdm9pZENvbnN0cmFpbnRzLFxuICAgICAgICAgICAgY29udGV4dEludGVyY2VwdG9yOiBmdW5jdGlvbiAoY29udGV4dCkgeyByZXR1cm4gY29udGV4dDsgfSxcbiAgICAgICAgICAgIGlzTXVsdGlJbmplY3Q6IGlzTXVsdGlJbmplY3QsXG4gICAgICAgICAgICBrZXk6IGtleSxcbiAgICAgICAgICAgIHNlcnZpY2VJZGVudGlmaWVyOiBzZXJ2aWNlSWRlbnRpZmllcixcbiAgICAgICAgICAgIHRhcmdldFR5cGU6IHRhcmdldFR5cGUsXG4gICAgICAgICAgICB2YWx1ZTogdmFsdWVcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHRoaXMuX21pZGRsZXdhcmUpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMuX21pZGRsZXdhcmUoZGVmYXVsdEFyZ3MpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gdW5kZWZpbmVkIHx8IHJlc3VsdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihFUlJPUl9NU0dTLklOVkFMSURfTUlERExFV0FSRV9SRVRVUk4pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5fcGxhbkFuZFJlc29sdmUoKShkZWZhdWx0QXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuICAgIENvbnRhaW5lci5wcm90b3R5cGUuX3BsYW5BbmRSZXNvbHZlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGFyZ3MpIHtcbiAgICAgICAgICAgIHZhciBjb250ZXh0ID0gcGxhbm5lcl8xLnBsYW4oX3RoaXMuX21ldGFkYXRhUmVhZGVyLCBfdGhpcywgYXJncy5pc011bHRpSW5qZWN0LCBhcmdzLnRhcmdldFR5cGUsIGFyZ3Muc2VydmljZUlkZW50aWZpZXIsIGFyZ3Mua2V5LCBhcmdzLnZhbHVlLCBhcmdzLmF2b2lkQ29uc3RyYWludHMpO1xuICAgICAgICAgICAgY29udGV4dCA9IGFyZ3MuY29udGV4dEludGVyY2VwdG9yKGNvbnRleHQpO1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHJlc29sdmVyXzEucmVzb2x2ZShjb250ZXh0KTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH07XG4gICAgfTtcbiAgICByZXR1cm4gQ29udGFpbmVyO1xufSgpKTtcbmV4cG9ydHMuQ29udGFpbmVyID0gQ29udGFpbmVyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29udGFpbmVyLmpzLm1hcCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///502\n')},function(module,exports,__webpack_require__){"use strict";eval('\nObject.defineProperty(exports, "__esModule", { value: true });\nexports.Binding = void 0;\nvar literal_types_1 = __webpack_require__(56);\nvar id_1 = __webpack_require__(68);\nvar Binding = (function () {\n function Binding(serviceIdentifier, scope) {\n this.id = id_1.id();\n this.activated = false;\n this.serviceIdentifier = serviceIdentifier;\n this.scope = scope;\n this.type = literal_types_1.BindingTypeEnum.Invalid;\n this.constraint = function (request) { return true; };\n this.implementationType = null;\n this.cache = null;\n this.factory = null;\n this.provider = null;\n this.onActivation = null;\n this.dynamicValue = null;\n }\n Binding.prototype.clone = function () {\n var clone = new Binding(this.serviceIdentifier, this.scope);\n clone.activated = (clone.scope === literal_types_1.BindingScopeEnum.Singleton) ? this.activated : false;\n clone.implementationType = this.implementationType;\n clone.dynamicValue = this.dynamicValue;\n clone.scope = this.scope;\n clone.type = this.type;\n clone.factory = this.factory;\n clone.provider = this.provider;\n clone.constraint = this.constraint;\n clone.onActivation = this.onActivation;\n clone.cache = this.cache;\n return clone;\n };\n return Binding;\n}());\nexports.Binding = Binding;\n//# sourceMappingURL=binding.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaW52ZXJzaWZ5L2xpYi9iaW5kaW5ncy9iaW5kaW5nLmpzPzJlMGIiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQWE7QUFDYiw4Q0FBOEMsY0FBYztBQUM1RDtBQUNBLHNCQUFzQixtQkFBTyxDQUFDLEVBQTRCO0FBQzFELFdBQVcsbUJBQU8sQ0FBQyxFQUFhO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDLGFBQWE7QUFDM0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQSIsImZpbGUiOiI1MDMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuQmluZGluZyA9IHZvaWQgMDtcbnZhciBsaXRlcmFsX3R5cGVzXzEgPSByZXF1aXJlKFwiLi4vY29uc3RhbnRzL2xpdGVyYWxfdHlwZXNcIik7XG52YXIgaWRfMSA9IHJlcXVpcmUoXCIuLi91dGlscy9pZFwiKTtcbnZhciBCaW5kaW5nID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBCaW5kaW5nKHNlcnZpY2VJZGVudGlmaWVyLCBzY29wZSkge1xuICAgICAgICB0aGlzLmlkID0gaWRfMS5pZCgpO1xuICAgICAgICB0aGlzLmFjdGl2YXRlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNlcnZpY2VJZGVudGlmaWVyID0gc2VydmljZUlkZW50aWZpZXI7XG4gICAgICAgIHRoaXMuc2NvcGUgPSBzY29wZTtcbiAgICAgICAgdGhpcy50eXBlID0gbGl0ZXJhbF90eXBlc18xLkJpbmRpbmdUeXBlRW51bS5JbnZhbGlkO1xuICAgICAgICB0aGlzLmNvbnN0cmFpbnQgPSBmdW5jdGlvbiAocmVxdWVzdCkgeyByZXR1cm4gdHJ1ZTsgfTtcbiAgICAgICAgdGhpcy5pbXBsZW1lbnRhdGlvblR5cGUgPSBudWxsO1xuICAgICAgICB0aGlzLmNhY2hlID0gbnVsbDtcbiAgICAgICAgdGhpcy5mYWN0b3J5ID0gbnVsbDtcbiAgICAgICAgdGhpcy5wcm92aWRlciA9IG51bGw7XG4gICAgICAgIHRoaXMub25BY3RpdmF0aW9uID0gbnVsbDtcbiAgICAgICAgdGhpcy5keW5hbWljVmFsdWUgPSBudWxsO1xuICAgIH1cbiAgICBCaW5kaW5nLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGNsb25lID0gbmV3IEJpbmRpbmcodGhpcy5zZXJ2aWNlSWRlbnRpZmllciwgdGhpcy5zY29wZSk7XG4gICAgICAgIGNsb25lLmFjdGl2YXRlZCA9IChjbG9uZS5zY29wZSA9PT0gbGl0ZXJhbF90eXBlc18xLkJpbmRpbmdTY29wZUVudW0uU2luZ2xldG9uKSA/IHRoaXMuYWN0aXZhdGVkIDogZmFsc2U7XG4gICAgICAgIGNsb25lLmltcGxlbWVudGF0aW9uVHlwZSA9IHRoaXMuaW1wbGVtZW50YXRpb25UeXBlO1xuICAgICAgICBjbG9uZS5keW5hbWljVmFsdWUgPSB0aGlzLmR5bmFtaWNWYWx1ZTtcbiAgICAgICAgY2xvbmUuc2NvcGUgPSB0aGlzLnNjb3BlO1xuICAgICAgICBjbG9uZS50eXBlID0gdGhpcy50eXBlO1xuICAgICAgICBjbG9uZS5mYWN0b3J5ID0gdGhpcy5mYWN0b3J5O1xuICAgICAgICBjbG9uZS5wcm92aWRlciA9IHRoaXMucHJvdmlkZXI7XG4gICAgICAgIGNsb25lLmNvbnN0cmFpbnQgPSB0aGlzLmNvbnN0cmFpbnQ7XG4gICAgICAgIGNsb25lLm9uQWN0aXZhdGlvbiA9IHRoaXMub25BY3RpdmF0aW9uO1xuICAgICAgICBjbG9uZS5jYWNoZSA9IHRoaXMuY2FjaGU7XG4gICAgICAgIHJldHVybiBjbG9uZTtcbiAgICB9O1xuICAgIHJldHVybiBCaW5kaW5nO1xufSgpKTtcbmV4cG9ydHMuQmluZGluZyA9IEJpbmRpbmc7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1iaW5kaW5nLmpzLm1hcCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///503\n')},function(module,exports,__webpack_require__){"use strict";eval('\nObject.defineProperty(exports, "__esModule", { value: true });\nexports.getBindingDictionary = exports.createMockRequest = exports.plan = void 0;\nvar binding_count_1 = __webpack_require__(505);\nvar ERROR_MSGS = __webpack_require__(40);\nvar literal_types_1 = __webpack_require__(56);\nvar METADATA_KEY = __webpack_require__(32);\nvar exceptions_1 = __webpack_require__(243);\nvar serialization_1 = __webpack_require__(91);\nvar context_1 = __webpack_require__(506);\nvar metadata_1 = __webpack_require__(48);\nvar plan_1 = __webpack_require__(507);\nvar reflection_utils_1 = __webpack_require__(508);\nvar request_1 = __webpack_require__(510);\nvar target_1 = __webpack_require__(245);\nfunction getBindingDictionary(cntnr) {\n return cntnr._bindingDictionary;\n}\nexports.getBindingDictionary = getBindingDictionary;\nfunction _createTarget(isMultiInject, targetType, serviceIdentifier, name, key, value) {\n var metadataKey = isMultiInject ? METADATA_KEY.MULTI_INJECT_TAG : METADATA_KEY.INJECT_TAG;\n var injectMetadata = new metadata_1.Metadata(metadataKey, serviceIdentifier);\n var target = new target_1.Target(targetType, name, serviceIdentifier, injectMetadata);\n if (key !== undefined) {\n var tagMetadata = new metadata_1.Metadata(key, value);\n target.metadata.push(tagMetadata);\n }\n return target;\n}\nfunction _getActiveBindings(metadataReader, avoidConstraints, context, parentRequest, target) {\n var bindings = getBindings(context.container, target.serviceIdentifier);\n var activeBindings = [];\n if (bindings.length === binding_count_1.BindingCount.NoBindingsAvailable &&\n context.container.options.autoBindInjectable &&\n typeof target.serviceIdentifier === "function" &&\n metadataReader.getConstructorMetadata(target.serviceIdentifier).compilerGeneratedMetadata) {\n context.container.bind(target.serviceIdentifier).toSelf();\n bindings = getBindings(context.container, target.serviceIdentifier);\n }\n if (!avoidConstraints) {\n activeBindings = bindings.filter(function (binding) {\n var request = new request_1.Request(binding.serviceIdentifier, context, parentRequest, binding, target);\n return binding.constraint(request);\n });\n }\n else {\n activeBindings = bindings;\n }\n _validateActiveBindingCount(target.serviceIdentifier, activeBindings, target, context.container);\n return activeBindings;\n}\nfunction _validateActiveBindingCount(serviceIdentifier, bindings, target, container) {\n switch (bindings.length) {\n case binding_count_1.BindingCount.NoBindingsAvailable:\n if (target.isOptional()) {\n return bindings;\n }\n else {\n var serviceIdentifierString = serialization_1.getServiceIdentifierAsString(serviceIdentifier);\n var msg = ERROR_MSGS.NOT_REGISTERED;\n msg += serialization_1.listMetadataForTarget(serviceIdentifierString, target);\n msg += serialization_1.listRegisteredBindingsForServiceIdentifier(container, serviceIdentifierString, getBindings);\n throw new Error(msg);\n }\n case binding_count_1.BindingCount.OnlyOneBindingAvailable:\n if (!target.isArray()) {\n return bindings;\n }\n case binding_count_1.BindingCount.MultipleBindingsAvailable:\n default:\n if (!target.isArray()) {\n var serviceIdentifierString = serialization_1.getServiceIdentifierAsString(serviceIdentifier);\n var msg = ERROR_MSGS.AMBIGUOUS_MATCH + " " + serviceIdentifierString;\n msg += serialization_1.listRegisteredBindingsForServiceIdentifier(container, serviceIdentifierString, getBindings);\n throw new Error(msg);\n }\n else {\n return bindings;\n }\n }\n}\nfunction _createSubRequests(metadataReader, avoidConstraints, serviceIdentifier, context, parentRequest, target) {\n var activeBindings;\n var childRequest;\n if (parentRequest === null) {\n activeBindings = _getActiveBindings(metadataReader, avoidConstraints, context, null, target);\n childRequest = new request_1.Request(serviceIdentifier, context, null, activeBindings, target);\n var thePlan = new plan_1.Plan(context, childRequest);\n context.addPlan(thePlan);\n }\n else {\n activeBindings = _getActiveBindings(metadataReader, avoidConstraints, context, parentRequest, target);\n childRequest = parentRequest.addChildRequest(target.serviceIdentifier, activeBindings, target);\n }\n activeBindings.forEach(function (binding) {\n var subChildRequest = null;\n if (target.isArray()) {\n subChildRequest = childRequest.addChildRequest(binding.serviceIdentifier, binding, target);\n }\n else {\n if (binding.cache) {\n return;\n }\n subChildRequest = childRequest;\n }\n if (binding.type === literal_types_1.BindingTypeEnum.Instance && binding.implementationType !== null) {\n var dependencies = reflection_utils_1.getDependencies(metadataReader, binding.implementationType);\n if (!context.container.options.skipBaseClassChecks) {\n var baseClassDependencyCount = reflection_utils_1.getBaseClassDependencyCount(metadataReader, binding.implementationType);\n if (dependencies.length < baseClassDependencyCount) {\n var error = ERROR_MSGS.ARGUMENTS_LENGTH_MISMATCH(reflection_utils_1.getFunctionName(binding.implementationType));\n throw new Error(error);\n }\n }\n dependencies.forEach(function (dependency) {\n _createSubRequests(metadataReader, false, dependency.serviceIdentifier, context, subChildRequest, dependency);\n });\n }\n });\n}\nfunction getBindings(container, serviceIdentifier) {\n var bindings = [];\n var bindingDictionary = getBindingDictionary(container);\n if (bindingDictionary.hasKey(serviceIdentifier)) {\n bindings = bindingDictionary.get(serviceIdentifier);\n }\n else if (container.parent !== null) {\n bindings = getBindings(container.parent, serviceIdentifier);\n }\n return bindings;\n}\nfunction plan(metadataReader, container, isMultiInject, targetType, serviceIdentifier, key, value, avoidConstraints) {\n if (avoidConstraints === void 0) { avoidConstraints = false; }\n var context = new context_1.Context(container);\n var target = _createTarget(isMultiInject, targetType, serviceIdentifier, "", key, value);\n try {\n _createSubRequests(metadataReader, avoidConstraints, serviceIdentifier, context, null, target);\n return context;\n }\n catch (error) {\n if (exceptions_1.isStackOverflowExeption(error)) {\n if (context.plan) {\n serialization_1.circularDependencyToException(context.plan.rootRequest);\n }\n }\n throw error;\n }\n}\nexports.plan = plan;\nfunction createMockRequest(container, serviceIdentifier, key, value) {\n var target = new target_1.Target(literal_types_1.TargetTypeEnum.Variable, "", serviceIdentifier, new metadata_1.Metadata(key, value));\n var context = new context_1.Context(container);\n var request = new request_1.Request(serviceIdentifier, context, null, [], target);\n return request;\n}\nexports.createMockRequest = createMockRequest;\n//# sourceMappingURL=planner.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaW52ZXJzaWZ5L2xpYi9wbGFubmluZy9wbGFubmVyLmpzPzg3YjMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQWE7QUFDYiw4Q0FBOEMsY0FBYztBQUM1RDtBQUNBLHNCQUFzQixtQkFBTyxDQUFDLEdBQTJCO0FBQ3pELGlCQUFpQixtQkFBTyxDQUFDLEVBQXlCO0FBQ2xELHNCQUFzQixtQkFBTyxDQUFDLEVBQTRCO0FBQzFELG1CQUFtQixtQkFBTyxDQUFDLEVBQTRCO0FBQ3ZELG1CQUFtQixtQkFBTyxDQUFDLEdBQXFCO0FBQ2hELHNCQUFzQixtQkFBTyxDQUFDLEVBQXdCO0FBQ3RELGdCQUFnQixtQkFBTyxDQUFDLEdBQVc7QUFDbkMsaUJBQWlCLG1CQUFPLENBQUMsRUFBWTtBQUNyQyxhQUFhLG1CQUFPLENBQUMsR0FBUTtBQUM3Qix5QkFBeUIsbUJBQU8sQ0FBQyxHQUFvQjtBQUNyRCxnQkFBZ0IsbUJBQU8sQ0FBQyxHQUFXO0FBQ25DLGVBQWUsbUJBQU8sQ0FBQyxHQUFVO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQywwQkFBMEI7QUFDaEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6IjUwNC5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5nZXRCaW5kaW5nRGljdGlvbmFyeSA9IGV4cG9ydHMuY3JlYXRlTW9ja1JlcXVlc3QgPSBleHBvcnRzLnBsYW4gPSB2b2lkIDA7XG52YXIgYmluZGluZ19jb3VudF8xID0gcmVxdWlyZShcIi4uL2JpbmRpbmdzL2JpbmRpbmdfY291bnRcIik7XG52YXIgRVJST1JfTVNHUyA9IHJlcXVpcmUoXCIuLi9jb25zdGFudHMvZXJyb3JfbXNnc1wiKTtcbnZhciBsaXRlcmFsX3R5cGVzXzEgPSByZXF1aXJlKFwiLi4vY29uc3RhbnRzL2xpdGVyYWxfdHlwZXNcIik7XG52YXIgTUVUQURBVEFfS0VZID0gcmVxdWlyZShcIi4uL2NvbnN0YW50cy9tZXRhZGF0YV9rZXlzXCIpO1xudmFyIGV4Y2VwdGlvbnNfMSA9IHJlcXVpcmUoXCIuLi91dGlscy9leGNlcHRpb25zXCIpO1xudmFyIHNlcmlhbGl6YXRpb25fMSA9IHJlcXVpcmUoXCIuLi91dGlscy9zZXJpYWxpemF0aW9uXCIpO1xudmFyIGNvbnRleHRfMSA9IHJlcXVpcmUoXCIuL2NvbnRleHRcIik7XG52YXIgbWV0YWRhdGFfMSA9IHJlcXVpcmUoXCIuL21ldGFkYXRhXCIpO1xudmFyIHBsYW5fMSA9IHJlcXVpcmUoXCIuL3BsYW5cIik7XG52YXIgcmVmbGVjdGlvbl91dGlsc18xID0gcmVxdWlyZShcIi4vcmVmbGVjdGlvbl91dGlsc1wiKTtcbnZhciByZXF1ZXN0XzEgPSByZXF1aXJlKFwiLi9yZXF1ZXN0XCIpO1xudmFyIHRhcmdldF8xID0gcmVxdWlyZShcIi4vdGFyZ2V0XCIpO1xuZnVuY3Rpb24gZ2V0QmluZGluZ0RpY3Rpb25hcnkoY250bnIpIHtcbiAgICByZXR1cm4gY250bnIuX2JpbmRpbmdEaWN0aW9uYXJ5O1xufVxuZXhwb3J0cy5nZXRCaW5kaW5nRGljdGlvbmFyeSA9IGdldEJpbmRpbmdEaWN0aW9uYXJ5O1xuZnVuY3Rpb24gX2NyZWF0ZVRhcmdldChpc011bHRpSW5qZWN0LCB0YXJnZXRUeXBlLCBzZXJ2aWNlSWRlbnRpZmllciwgbmFtZSwga2V5LCB2YWx1ZSkge1xuICAgIHZhciBtZXRhZGF0YUtleSA9IGlzTXVsdGlJbmplY3QgPyBNRVRBREFUQV9LRVkuTVVMVElfSU5KRUNUX1RBRyA6IE1FVEFEQVRBX0tFWS5JTkpFQ1RfVEFHO1xuICAgIHZhciBpbmplY3RNZXRhZGF0YSA9IG5ldyBtZXRhZGF0YV8xLk1ldGFkYXRhKG1ldGFkYXRhS2V5LCBzZXJ2aWNlSWRlbnRpZmllcik7XG4gICAgdmFyIHRhcmdldCA9IG5ldyB0YXJnZXRfMS5UYXJnZXQodGFyZ2V0VHlwZSwgbmFtZSwgc2VydmljZUlkZW50aWZpZXIsIGluamVjdE1ldGFkYXRhKTtcbiAgICBpZiAoa2V5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdmFyIHRhZ01ldGFkYXRhID0gbmV3IG1ldGFkYXRhXzEuTWV0YWRhdGEoa2V5LCB2YWx1ZSk7XG4gICAgICAgIHRhcmdldC5tZXRhZGF0YS5wdXNoKHRhZ01ldGFkYXRhKTtcbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldDtcbn1cbmZ1bmN0aW9uIF9nZXRBY3RpdmVCaW5kaW5ncyhtZXRhZGF0YVJlYWRlciwgYXZvaWRDb25zdHJhaW50cywgY29udGV4dCwgcGFyZW50UmVxdWVzdCwgdGFyZ2V0KSB7XG4gICAgdmFyIGJpbmRpbmdzID0gZ2V0QmluZGluZ3MoY29udGV4dC5jb250YWluZXIsIHRhcmdldC5zZXJ2aWNlSWRlbnRpZmllcik7XG4gICAgdmFyIGFjdGl2ZUJpbmRpbmdzID0gW107XG4gICAgaWYgKGJpbmRpbmdzLmxlbmd0aCA9PT0gYmluZGluZ19jb3VudF8xLkJpbmRpbmdDb3VudC5Ob0JpbmRpbmdzQXZhaWxhYmxlICYmXG4gICAgICAgIGNvbnRleHQuY29udGFpbmVyLm9wdGlvbnMuYXV0b0JpbmRJbmplY3RhYmxlICYmXG4gICAgICAgIHR5cGVvZiB0YXJnZXQuc2VydmljZUlkZW50aWZpZXIgPT09IFwiZnVuY3Rpb25cIiAmJlxuICAgICAgICBtZXRhZGF0YVJlYWRlci5nZXRDb25zdHJ1Y3Rvck1ldGFkYXRhKHRhcmdldC5zZXJ2aWNlSWRlbnRpZmllcikuY29tcGlsZXJHZW5lcmF0ZWRNZXRhZGF0YSkge1xuICAgICAgICBjb250ZXh0LmNvbnRhaW5lci5iaW5kKHRhcmdldC5zZXJ2aWNlSWRlbnRpZmllcikudG9TZWxmKCk7XG4gICAgICAgIGJpbmRpbmdzID0gZ2V0QmluZGluZ3MoY29udGV4dC5jb250YWluZXIsIHRhcmdldC5zZXJ2aWNlSWRlbnRpZmllcik7XG4gICAgfVxuICAgIGlmICghYXZvaWRDb25zdHJhaW50cykge1xuICAgICAgICBhY3RpdmVCaW5kaW5ncyA9IGJpbmRpbmdzLmZpbHRlcihmdW5jdGlvbiAoYmluZGluZykge1xuICAgICAgICAgICAgdmFyIHJlcXVlc3QgPSBuZXcgcmVxdWVzdF8xLlJlcXVlc3QoYmluZGluZy5zZXJ2aWNlSWRlbnRpZmllciwgY29udGV4dCwgcGFyZW50UmVxdWVzdCwgYmluZGluZywgdGFyZ2V0KTtcbiAgICAgICAgICAgIHJldHVybiBiaW5kaW5nLmNvbnN0cmFpbnQocmVxdWVzdCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgYWN0aXZlQmluZGluZ3MgPSBiaW5kaW5ncztcbiAgICB9XG4gICAgX3ZhbGlkYXRlQWN0aXZlQmluZGluZ0NvdW50KHRhcmdldC5zZXJ2aWNlSWRlbnRpZmllciwgYWN0aXZlQmluZGluZ3MsIHRhcmdldCwgY29udGV4dC5jb250YWluZXIpO1xuICAgIHJldHVybiBhY3RpdmVCaW5kaW5ncztcbn1cbmZ1bmN0aW9uIF92YWxpZGF0ZUFjdGl2ZUJpbmRpbmdDb3VudChzZXJ2aWNlSWRlbnRpZmllciwgYmluZGluZ3MsIHRhcmdldCwgY29udGFpbmVyKSB7XG4gICAgc3dpdGNoIChiaW5kaW5ncy5sZW5ndGgpIHtcbiAgICAgICAgY2FzZSBiaW5kaW5nX2NvdW50XzEuQmluZGluZ0NvdW50Lk5vQmluZGluZ3NBdmFpbGFibGU6XG4gICAgICAgICAgICBpZiAodGFyZ2V0LmlzT3B0aW9uYWwoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBiaW5kaW5ncztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBzZXJ2aWNlSWRlbnRpZmllclN0cmluZyA9IHNlcmlhbGl6YXRpb25fMS5nZXRTZXJ2aWNlSWRlbnRpZmllckFzU3RyaW5nKHNlcnZpY2VJZGVudGlmaWVyKTtcbiAgICAgICAgICAgICAgICB2YXIgbXNnID0gRVJST1JfTVNHUy5OT1RfUkVHSVNURVJFRDtcbiAgICAgICAgICAgICAgICBtc2cgKz0gc2VyaWFsaXphdGlvbl8xLmxpc3RNZXRhZGF0YUZvclRhcmdldChzZXJ2aWNlSWRlbnRpZmllclN0cmluZywgdGFyZ2V0KTtcbiAgICAgICAgICAgICAgICBtc2cgKz0gc2VyaWFsaXphdGlvbl8xLmxpc3RSZWdpc3RlcmVkQmluZGluZ3NGb3JTZXJ2aWNlSWRlbnRpZmllcihjb250YWluZXIsIHNlcnZpY2VJZGVudGlmaWVyU3RyaW5nLCBnZXRCaW5kaW5ncyk7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIGNhc2UgYmluZGluZ19jb3VudF8xLkJpbmRpbmdDb3VudC5Pbmx5T25lQmluZGluZ0F2YWlsYWJsZTpcbiAgICAgICAgICAgIGlmICghdGFyZ2V0LmlzQXJyYXkoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBiaW5kaW5ncztcbiAgICAgICAgICAgIH1cbiAgICAgICAgY2FzZSBiaW5kaW5nX2NvdW50XzEuQmluZGluZ0NvdW50Lk11bHRpcGxlQmluZGluZ3NBdmFpbGFibGU6XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBpZiAoIXRhcmdldC5pc0FycmF5KCkpIHtcbiAgICAgICAgICAgICAgICB2YXIgc2VydmljZUlkZW50aWZpZXJTdHJpbmcgPSBzZXJpYWxpemF0aW9uXzEuZ2V0U2VydmljZUlkZW50aWZpZXJBc1N0cmluZyhzZXJ2aWNlSWRlbnRpZmllcik7XG4gICAgICAgICAgICAgICAgdmFyIG1zZyA9IEVSUk9SX01TR1MuQU1CSUdVT1VTX01BVENIICsgXCIgXCIgKyBzZXJ2aWNlSWRlbnRpZmllclN0cmluZztcbiAgICAgICAgICAgICAgICBtc2cgKz0gc2VyaWFsaXphdGlvbl8xLmxpc3RSZWdpc3RlcmVkQmluZGluZ3NGb3JTZXJ2aWNlSWRlbnRpZmllcihjb250YWluZXIsIHNlcnZpY2VJZGVudGlmaWVyU3RyaW5nLCBnZXRCaW5kaW5ncyk7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYmluZGluZ3M7XG4gICAgICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gX2NyZWF0ZVN1YlJlcXVlc3RzKG1ldGFkYXRhUmVhZGVyLCBhdm9pZENvbnN0cmFpbnRzLCBzZXJ2aWNlSWRlbnRpZmllciwgY29udGV4dCwgcGFyZW50UmVxdWVzdCwgdGFyZ2V0KSB7XG4gICAgdmFyIGFjdGl2ZUJpbmRpbmdzO1xuICAgIHZhciBjaGlsZFJlcXVlc3Q7XG4gICAgaWYgKHBhcmVudFJlcXVlc3QgPT09IG51bGwpIHtcbiAgICAgICAgYWN0aXZlQmluZGluZ3MgPSBfZ2V0QWN0aXZlQmluZGluZ3MobWV0YWRhdGFSZWFkZXIsIGF2b2lkQ29uc3RyYWludHMsIGNvbnRleHQsIG51bGwsIHRhcmdldCk7XG4gICAgICAgIGNoaWxkUmVxdWVzdCA9IG5ldyByZXF1ZXN0XzEuUmVxdWVzdChzZXJ2aWNlSWRlbnRpZmllciwgY29udGV4dCwgbnVsbCwgYWN0aXZlQmluZGluZ3MsIHRhcmdldCk7XG4gICAgICAgIHZhciB0aGVQbGFuID0gbmV3IHBsYW5fMS5QbGFuKGNvbnRleHQsIGNoaWxkUmVxdWVzdCk7XG4gICAgICAgIGNvbnRleHQuYWRkUGxhbih0aGVQbGFuKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGFjdGl2ZUJpbmRpbmdzID0gX2dldEFjdGl2ZUJpbmRpbmdzKG1ldGFkYXRhUmVhZGVyLCBhdm9pZENvbnN0cmFpbnRzLCBjb250ZXh0LCBwYXJlbnRSZXF1ZXN0LCB0YXJnZXQpO1xuICAgICAgICBjaGlsZFJlcXVlc3QgPSBwYXJlbnRSZXF1ZXN0LmFkZENoaWxkUmVxdWVzdCh0YXJnZXQuc2VydmljZUlkZW50aWZpZXIsIGFjdGl2ZUJpbmRpbmdzLCB0YXJnZXQpO1xuICAgIH1cbiAgICBhY3RpdmVCaW5kaW5ncy5mb3JFYWNoKGZ1bmN0aW9uIChiaW5kaW5nKSB7XG4gICAgICAgIHZhciBzdWJDaGlsZFJlcXVlc3QgPSBudWxsO1xuICAgICAgICBpZiAodGFyZ2V0LmlzQXJyYXkoKSkge1xuICAgICAgICAgICAgc3ViQ2hpbGRSZXF1ZXN0ID0gY2hpbGRSZXF1ZXN0LmFkZENoaWxkUmVxdWVzdChiaW5kaW5nLnNlcnZpY2VJZGVudGlmaWVyLCBiaW5kaW5nLCB0YXJnZXQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKGJpbmRpbmcuY2FjaGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdWJDaGlsZFJlcXVlc3QgPSBjaGlsZFJlcXVlc3Q7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJpbmRpbmcudHlwZSA9PT0gbGl0ZXJhbF90eXBlc18xLkJpbmRpbmdUeXBlRW51bS5JbnN0YW5jZSAmJiBiaW5kaW5nLmltcGxlbWVudGF0aW9uVHlwZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyIGRlcGVuZGVuY2llcyA9IHJlZmxlY3Rpb25fdXRpbHNfMS5nZXREZXBlbmRlbmNpZXMobWV0YWRhdGFSZWFkZXIsIGJpbmRpbmcuaW1wbGVtZW50YXRpb25UeXBlKTtcbiAgICAgICAgICAgIGlmICghY29udGV4dC5jb250YWluZXIub3B0aW9ucy5za2lwQmFzZUNsYXNzQ2hlY2tzKSB7XG4gICAgICAgICAgICAgICAgdmFyIGJhc2VDbGFzc0RlcGVuZGVuY3lDb3VudCA9IHJlZmxlY3Rpb25fdXRpbHNfMS5nZXRCYXNlQ2xhc3NEZXBlbmRlbmN5Q291bnQobWV0YWRhdGFSZWFkZXIsIGJpbmRpbmcuaW1wbGVtZW50YXRpb25UeXBlKTtcbiAgICAgICAgICAgICAgICBpZiAoZGVwZW5kZW5jaWVzLmxlbmd0aCA8IGJhc2VDbGFzc0RlcGVuZGVuY3lDb3VudCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZXJyb3IgPSBFUlJPUl9NU0dTLkFSR1VNRU5UU19MRU5HVEhfTUlTTUFUQ0gocmVmbGVjdGlvbl91dGlsc18xLmdldEZ1bmN0aW9uTmFtZShiaW5kaW5nLmltcGxlbWVudGF0aW9uVHlwZSkpO1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlcGVuZGVuY2llcy5mb3JFYWNoKGZ1bmN0aW9uIChkZXBlbmRlbmN5KSB7XG4gICAgICAgICAgICAgICAgX2NyZWF0ZVN1YlJlcXVlc3RzKG1ldGFkYXRhUmVhZGVyLCBmYWxzZSwgZGVwZW5kZW5jeS5zZXJ2aWNlSWRlbnRpZmllciwgY29udGV4dCwgc3ViQ2hpbGRSZXF1ZXN0LCBkZXBlbmRlbmN5KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSk7XG59XG5mdW5jdGlvbiBnZXRCaW5kaW5ncyhjb250YWluZXIsIHNlcnZpY2VJZGVudGlmaWVyKSB7XG4gICAgdmFyIGJpbmRpbmdzID0gW107XG4gICAgdmFyIGJpbmRpbmdEaWN0aW9uYXJ5ID0gZ2V0QmluZGluZ0RpY3Rpb25hcnkoY29udGFpbmVyKTtcbiAgICBpZiAoYmluZGluZ0RpY3Rpb25hcnkuaGFzS2V5KHNlcnZpY2VJZGVudGlmaWVyKSkge1xuICAgICAgICBiaW5kaW5ncyA9IGJpbmRpbmdEaWN0aW9uYXJ5LmdldChzZXJ2aWNlSWRlbnRpZmllcik7XG4gICAgfVxuICAgIGVsc2UgaWYgKGNvbnRhaW5lci5wYXJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgYmluZGluZ3MgPSBnZXRCaW5kaW5ncyhjb250YWluZXIucGFyZW50LCBzZXJ2aWNlSWRlbnRpZmllcik7XG4gICAgfVxuICAgIHJldHVybiBiaW5kaW5ncztcbn1cbmZ1bmN0aW9uIHBsYW4obWV0YWRhdGFSZWFkZXIsIGNvbnRhaW5lciwgaXNNdWx0aUluamVjdCwgdGFyZ2V0VHlwZSwgc2VydmljZUlkZW50aWZpZXIsIGtleSwgdmFsdWUsIGF2b2lkQ29uc3RyYWludHMpIHtcbiAgICBpZiAoYXZvaWRDb25zdHJhaW50cyA9PT0gdm9pZCAwKSB7IGF2b2lkQ29uc3RyYWludHMgPSBmYWxzZTsgfVxuICAgIHZhciBjb250ZXh0ID0gbmV3IGNvbnRleHRfMS5Db250ZXh0KGNvbnRhaW5lcik7XG4gICAgdmFyIHRhcmdldCA9IF9jcmVhdGVUYXJnZXQoaXNNdWx0aUluamVjdCwgdGFyZ2V0VHlwZSwgc2VydmljZUlkZW50aWZpZXIsIFwiXCIsIGtleSwgdmFsdWUpO1xuICAgIHRyeSB7XG4gICAgICAgIF9jcmVhdGVTdWJSZXF1ZXN0cyhtZXRhZGF0YVJlYWRlciwgYXZvaWRDb25zdHJhaW50cywgc2VydmljZUlkZW50aWZpZXIsIGNvbnRleHQsIG51bGwsIHRhcmdldCk7XG4gICAgICAgIHJldHVybiBjb250ZXh0O1xuICAgIH1cbiAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKGV4Y2VwdGlvbnNfMS5pc1N0YWNrT3ZlcmZsb3dFeGVwdGlvbihlcnJvcikpIHtcbiAgICAgICAgICAgIGlmIChjb250ZXh0LnBsYW4pIHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemF0aW9uXzEuY2lyY3VsYXJEZXBlbmRlbmN5VG9FeGNlcHRpb24oY29udGV4dC5wbGFuLnJvb3RSZXF1ZXN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG59XG5leHBvcnRzLnBsYW4gPSBwbGFuO1xuZnVuY3Rpb24gY3JlYXRlTW9ja1JlcXVlc3QoY29udGFpbmVyLCBzZXJ2aWNlSWRlbnRpZmllciwga2V5LCB2YWx1ZSkge1xuICAgIHZhciB0YXJnZXQgPSBuZXcgdGFyZ2V0XzEuVGFyZ2V0KGxpdGVyYWxfdHlwZXNfMS5UYXJnZXRUeXBlRW51bS5WYXJpYWJsZSwgXCJcIiwgc2VydmljZUlkZW50aWZpZXIsIG5ldyBtZXRhZGF0YV8xLk1ldGFkYXRhKGtleSwgdmFsdWUpKTtcbiAgICB2YXIgY29udGV4dCA9IG5ldyBjb250ZXh0XzEuQ29udGV4dChjb250YWluZXIpO1xuICAgIHZhciByZXF1ZXN0ID0gbmV3IHJlcXVlc3RfMS5SZXF1ZXN0KHNlcnZpY2VJZGVudGlmaWVyLCBjb250ZXh0LCBudWxsLCBbXSwgdGFyZ2V0KTtcbiAgICByZXR1cm4gcmVxdWVzdDtcbn1cbmV4cG9ydHMuY3JlYXRlTW9ja1JlcXVlc3QgPSBjcmVhdGVNb2NrUmVxdWVzdDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBsYW5uZXIuanMubWFwIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///504\n')},function(module,exports,__webpack_require__){"use strict";eval('\nObject.defineProperty(exports, "__esModule", { value: true });\nexports.BindingCount = void 0;\nvar BindingCount = {\n MultipleBindingsAvailable: 2,\n NoBindingsAvailable: 0,\n OnlyOneBindingAvailable: 1\n};\nexports.BindingCount = BindingCount;\n//# sourceMappingURL=binding_count.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaW52ZXJzaWZ5L2xpYi9iaW5kaW5ncy9iaW5kaW5nX2NvdW50LmpzPzc2ODUiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQWE7QUFDYiw4Q0FBOEMsY0FBYztBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6IjUwNS5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5CaW5kaW5nQ291bnQgPSB2b2lkIDA7XG52YXIgQmluZGluZ0NvdW50ID0ge1xuICAgIE11bHRpcGxlQmluZGluZ3NBdmFpbGFibGU6IDIsXG4gICAgTm9CaW5kaW5nc0F2YWlsYWJsZTogMCxcbiAgICBPbmx5T25lQmluZGluZ0F2YWlsYWJsZTogMVxufTtcbmV4cG9ydHMuQmluZGluZ0NvdW50ID0gQmluZGluZ0NvdW50O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YmluZGluZ19jb3VudC5qcy5tYXAiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///505\n')},function(module,exports,__webpack_require__){"use strict";eval('\nObject.defineProperty(exports, "__esModule", { value: true });\nexports.Context = void 0;\nvar id_1 = __webpack_require__(68);\nvar Context = (function () {\n function Context(container) {\n this.id = id_1.id();\n this.container = container;\n }\n Context.prototype.addPlan = function (plan) {\n this.plan = plan;\n };\n Context.prototype.setCurrentRequest = function (currentRequest) {\n this.currentRequest = currentRequest;\n };\n return Context;\n}());\nexports.Context = Context;\n//# sourceMappingURL=context.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaW52ZXJzaWZ5L2xpYi9wbGFubmluZy9jb250ZXh0LmpzP2EzMmYiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQWE7QUFDYiw4Q0FBOEMsY0FBYztBQUM1RDtBQUNBLFdBQVcsbUJBQU8sQ0FBQyxFQUFhO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBIiwiZmlsZSI6IjUwNi5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5Db250ZXh0ID0gdm9pZCAwO1xudmFyIGlkXzEgPSByZXF1aXJlKFwiLi4vdXRpbHMvaWRcIik7XG52YXIgQ29udGV4dCA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQ29udGV4dChjb250YWluZXIpIHtcbiAgICAgICAgdGhpcy5pZCA9IGlkXzEuaWQoKTtcbiAgICAgICAgdGhpcy5jb250YWluZXIgPSBjb250YWluZXI7XG4gICAgfVxuICAgIENvbnRleHQucHJvdG90eXBlLmFkZFBsYW4gPSBmdW5jdGlvbiAocGxhbikge1xuICAgICAgICB0aGlzLnBsYW4gPSBwbGFuO1xuICAgIH07XG4gICAgQ29udGV4dC5wcm90b3R5cGUuc2V0Q3VycmVudFJlcXVlc3QgPSBmdW5jdGlvbiAoY3VycmVudFJlcXVlc3QpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50UmVxdWVzdCA9IGN1cnJlbnRSZXF1ZXN0O1xuICAgIH07XG4gICAgcmV0dXJuIENvbnRleHQ7XG59KCkpO1xuZXhwb3J0cy5Db250ZXh0ID0gQ29udGV4dDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbnRleHQuanMubWFwIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///506\n')},function(module,exports,__webpack_require__){"use strict";eval('\nObject.defineProperty(exports, "__esModule", { value: true });\nexports.Plan = void 0;\nvar Plan = (function () {\n function Plan(parentContext, rootRequest) {\n this.parentContext = parentContext;\n this.rootRequest = rootRequest;\n }\n return Plan;\n}());\nexports.Plan = Plan;\n//# sourceMappingURL=plan.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaW52ZXJzaWZ5L2xpYi9wbGFubmluZy9wbGFuLmpzP2M4YzAiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQWE7QUFDYiw4Q0FBOEMsY0FBYztBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBIiwiZmlsZSI6IjUwNy5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5QbGFuID0gdm9pZCAwO1xudmFyIFBsYW4gPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFBsYW4ocGFyZW50Q29udGV4dCwgcm9vdFJlcXVlc3QpIHtcbiAgICAgICAgdGhpcy5wYXJlbnRDb250ZXh0ID0gcGFyZW50Q29udGV4dDtcbiAgICAgICAgdGhpcy5yb290UmVxdWVzdCA9IHJvb3RSZXF1ZXN0O1xuICAgIH1cbiAgICByZXR1cm4gUGxhbjtcbn0oKSk7XG5leHBvcnRzLlBsYW4gPSBQbGFuO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cGxhbi5qcy5tYXAiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///507\n')},function(module,exports,__webpack_require__){"use strict";eval('\nvar __spreadArray = (this && this.__spreadArray) || function (to, from) {\n for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)\n to[j] = from[i];\n return to;\n};\nObject.defineProperty(exports, "__esModule", { value: true });\nexports.getFunctionName = exports.getBaseClassDependencyCount = exports.getDependencies = void 0;\nvar inject_1 = __webpack_require__(244);\nvar ERROR_MSGS = __webpack_require__(40);\nvar literal_types_1 = __webpack_require__(56);\nvar METADATA_KEY = __webpack_require__(32);\nvar serialization_1 = __webpack_require__(91);\nObject.defineProperty(exports, "getFunctionName", { enumerable: true, get: function () { return serialization_1.getFunctionName; } });\nvar target_1 = __webpack_require__(245);\nfunction getDependencies(metadataReader, func) {\n var constructorName = serialization_1.getFunctionName(func);\n var targets = getTargets(metadataReader, constructorName, func, false);\n return targets;\n}\nexports.getDependencies = getDependencies;\nfunction getTargets(metadataReader, constructorName, func, isBaseClass) {\n var metadata = metadataReader.getConstructorMetadata(func);\n var serviceIdentifiers = metadata.compilerGeneratedMetadata;\n if (serviceIdentifiers === undefined) {\n var msg = ERROR_MSGS.MISSING_INJECTABLE_ANNOTATION + " " + constructorName + ".";\n throw new Error(msg);\n }\n var constructorArgsMetadata = metadata.userGeneratedMetadata;\n var keys = Object.keys(constructorArgsMetadata);\n var hasUserDeclaredUnknownInjections = (func.length === 0 && keys.length > 0);\n var hasOptionalParameters = keys.length > func.length;\n var iterations = (hasUserDeclaredUnknownInjections || hasOptionalParameters) ? keys.length : func.length;\n var constructorTargets = getConstructorArgsAsTargets(isBaseClass, constructorName, serviceIdentifiers, constructorArgsMetadata, iterations);\n var propertyTargets = getClassPropsAsTargets(metadataReader, func);\n var targets = __spreadArray(__spreadArray([], constructorTargets), propertyTargets);\n return targets;\n}\nfunction getConstructorArgsAsTarget(index, isBaseClass, constructorName, serviceIdentifiers, constructorArgsMetadata) {\n var targetMetadata = constructorArgsMetadata[index.toString()] || [];\n var metadata = formatTargetMetadata(targetMetadata);\n var isManaged = metadata.unmanaged !== true;\n var serviceIdentifier = serviceIdentifiers[index];\n var injectIdentifier = (metadata.inject || metadata.multiInject);\n serviceIdentifier = (injectIdentifier) ? (injectIdentifier) : serviceIdentifier;\n if (serviceIdentifier instanceof inject_1.LazyServiceIdentifer) {\n serviceIdentifier = serviceIdentifier.unwrap();\n }\n if (isManaged) {\n var isObject = serviceIdentifier === Object;\n var isFunction = serviceIdentifier === Function;\n var isUndefined = serviceIdentifier === undefined;\n var isUnknownType = (isObject || isFunction || isUndefined);\n if (!isBaseClass && isUnknownType) {\n var msg = ERROR_MSGS.MISSING_INJECT_ANNOTATION + " argument " + index + " in class " + constructorName + ".";\n throw new Error(msg);\n }\n var target = new target_1.Target(literal_types_1.TargetTypeEnum.ConstructorArgument, metadata.targetName, serviceIdentifier);\n target.metadata = targetMetadata;\n return target;\n }\n return null;\n}\nfunction getConstructorArgsAsTargets(isBaseClass, constructorName, serviceIdentifiers, constructorArgsMetadata, iterations) {\n var targets = [];\n for (var i = 0; i < iterations; i++) {\n var index = i;\n var target = getConstructorArgsAsTarget(index, isBaseClass, constructorName, serviceIdentifiers, constructorArgsMetadata);\n if (target !== null) {\n targets.push(target);\n }\n }\n return targets;\n}\nfunction getClassPropsAsTargets(metadataReader, constructorFunc) {\n var classPropsMetadata = metadataReader.getPropertiesMetadata(constructorFunc);\n var targets = [];\n var keys = Object.keys(classPropsMetadata);\n for (var _i = 0, keys_1 = keys; _i < keys_1.length; _i++) {\n var key = keys_1[_i];\n var targetMetadata = classPropsMetadata[key];\n var metadata = formatTargetMetadata(classPropsMetadata[key]);\n var targetName = metadata.targetName || key;\n var serviceIdentifier = (metadata.inject || metadata.multiInject);\n var target = new target_1.Target(literal_types_1.TargetTypeEnum.ClassProperty, targetName, serviceIdentifier);\n target.metadata = targetMetadata;\n targets.push(target);\n }\n var baseConstructor = Object.getPrototypeOf(constructorFunc.prototype).constructor;\n if (baseConstructor !== Object) {\n var baseTargets = getClassPropsAsTargets(metadataReader, baseConstructor);\n targets = __spreadArray(__spreadArray([], targets), baseTargets);\n }\n return targets;\n}\nfunction getBaseClassDependencyCount(metadataReader, func) {\n var baseConstructor = Object.getPrototypeOf(func.prototype).constructor;\n if (baseConstructor !== Object) {\n var baseConstructorName = serialization_1.getFunctionName(baseConstructor);\n var targets = getTargets(metadataReader, baseConstructorName, baseConstructor, true);\n var metadata = targets.map(function (t) {\n return t.metadata.filter(function (m) {\n return m.key === METADATA_KEY.UNMANAGED_TAG;\n });\n });\n var unmanagedCount = [].concat.apply([], metadata).length;\n var dependencyCount = targets.length - unmanagedCount;\n if (dependencyCount > 0) {\n return dependencyCount;\n }\n else {\n return getBaseClassDependencyCount(metadataReader, baseConstructor);\n }\n }\n else {\n return 0;\n }\n}\nexports.getBaseClassDependencyCount = getBaseClassDependencyCount;\nfunction formatTargetMetadata(targetMetadata) {\n var targetMetadataMap = {};\n targetMetadata.forEach(function (m) {\n targetMetadataMap[m.key.toString()] = m.value;\n });\n return {\n inject: targetMetadataMap[METADATA_KEY.INJECT_TAG],\n multiInject: targetMetadataMap[METADATA_KEY.MULTI_INJECT_TAG],\n targetName: targetMetadataMap[METADATA_KEY.NAME_TAG],\n unmanaged: targetMetadataMap[METADATA_KEY.UNMANAGED_TAG]\n };\n}\n//# sourceMappingURL=reflection_utils.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaW52ZXJzaWZ5L2xpYi9wbGFubmluZy9yZWZsZWN0aW9uX3V0aWxzLmpzPzdkYmEiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQWE7QUFDYjtBQUNBLG9EQUFvRCxRQUFRO0FBQzVEO0FBQ0E7QUFDQTtBQUNBLDhDQUE4QyxjQUFjO0FBQzVEO0FBQ0EsZUFBZSxtQkFBTyxDQUFDLEdBQXNCO0FBQzdDLGlCQUFpQixtQkFBTyxDQUFDLEVBQXlCO0FBQ2xELHNCQUFzQixtQkFBTyxDQUFDLEVBQTRCO0FBQzFELG1CQUFtQixtQkFBTyxDQUFDLEVBQTRCO0FBQ3ZELHNCQUFzQixtQkFBTyxDQUFDLEVBQXdCO0FBQ3RELG1EQUFtRCxxQ0FBcUMsd0NBQXdDLEVBQUUsRUFBRTtBQUNwSSxlQUFlLG1CQUFPLENBQUMsR0FBVTtBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLGdCQUFnQjtBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUMsb0JBQW9CO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiNTA4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19zcHJlYWRBcnJheSA9ICh0aGlzICYmIHRoaXMuX19zcHJlYWRBcnJheSkgfHwgZnVuY3Rpb24gKHRvLCBmcm9tKSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIGlsID0gZnJvbS5sZW5ndGgsIGogPSB0by5sZW5ndGg7IGkgPCBpbDsgaSsrLCBqKyspXG4gICAgICAgIHRvW2pdID0gZnJvbVtpXTtcbiAgICByZXR1cm4gdG87XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5nZXRGdW5jdGlvbk5hbWUgPSBleHBvcnRzLmdldEJhc2VDbGFzc0RlcGVuZGVuY3lDb3VudCA9IGV4cG9ydHMuZ2V0RGVwZW5kZW5jaWVzID0gdm9pZCAwO1xudmFyIGluamVjdF8xID0gcmVxdWlyZShcIi4uL2Fubm90YXRpb24vaW5qZWN0XCIpO1xudmFyIEVSUk9SX01TR1MgPSByZXF1aXJlKFwiLi4vY29uc3RhbnRzL2Vycm9yX21zZ3NcIik7XG52YXIgbGl0ZXJhbF90eXBlc18xID0gcmVxdWlyZShcIi4uL2NvbnN0YW50cy9saXRlcmFsX3R5cGVzXCIpO1xudmFyIE1FVEFEQVRBX0tFWSA9IHJlcXVpcmUoXCIuLi9jb25zdGFudHMvbWV0YWRhdGFfa2V5c1wiKTtcbnZhciBzZXJpYWxpemF0aW9uXzEgPSByZXF1aXJlKFwiLi4vdXRpbHMvc2VyaWFsaXphdGlvblwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImdldEZ1bmN0aW9uTmFtZVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gc2VyaWFsaXphdGlvbl8xLmdldEZ1bmN0aW9uTmFtZTsgfSB9KTtcbnZhciB0YXJnZXRfMSA9IHJlcXVpcmUoXCIuL3RhcmdldFwiKTtcbmZ1bmN0aW9uIGdldERlcGVuZGVuY2llcyhtZXRhZGF0YVJlYWRlciwgZnVuYykge1xuICAgIHZhciBjb25zdHJ1Y3Rvck5hbWUgPSBzZXJpYWxpemF0aW9uXzEuZ2V0RnVuY3Rpb25OYW1lKGZ1bmMpO1xuICAgIHZhciB0YXJnZXRzID0gZ2V0VGFyZ2V0cyhtZXRhZGF0YVJlYWRlciwgY29uc3RydWN0b3JOYW1lLCBmdW5jLCBmYWxzZSk7XG4gICAgcmV0dXJuIHRhcmdldHM7XG59XG5leHBvcnRzLmdldERlcGVuZGVuY2llcyA9IGdldERlcGVuZGVuY2llcztcbmZ1bmN0aW9uIGdldFRhcmdldHMobWV0YWRhdGFSZWFkZXIsIGNvbnN0cnVjdG9yTmFtZSwgZnVuYywgaXNCYXNlQ2xhc3MpIHtcbiAgICB2YXIgbWV0YWRhdGEgPSBtZXRhZGF0YVJlYWRlci5nZXRDb25zdHJ1Y3Rvck1ldGFkYXRhKGZ1bmMpO1xuICAgIHZhciBzZXJ2aWNlSWRlbnRpZmllcnMgPSBtZXRhZGF0YS5jb21waWxlckdlbmVyYXRlZE1ldGFkYXRhO1xuICAgIGlmIChzZXJ2aWNlSWRlbnRpZmllcnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB2YXIgbXNnID0gRVJST1JfTVNHUy5NSVNTSU5HX0lOSkVDVEFCTEVfQU5OT1RBVElPTiArIFwiIFwiICsgY29uc3RydWN0b3JOYW1lICsgXCIuXCI7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICAgIH1cbiAgICB2YXIgY29uc3RydWN0b3JBcmdzTWV0YWRhdGEgPSBtZXRhZGF0YS51c2VyR2VuZXJhdGVkTWV0YWRhdGE7XG4gICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhjb25zdHJ1Y3RvckFyZ3NNZXRhZGF0YSk7XG4gICAgdmFyIGhhc1VzZXJEZWNsYXJlZFVua25vd25JbmplY3Rpb25zID0gKGZ1bmMubGVuZ3RoID09PSAwICYmIGtleXMubGVuZ3RoID4gMCk7XG4gICAgdmFyIGhhc09wdGlvbmFsUGFyYW1ldGVycyA9IGtleXMubGVuZ3RoID4gZnVuYy5sZW5ndGg7XG4gICAgdmFyIGl0ZXJhdGlvbnMgPSAoaGFzVXNlckRlY2xhcmVkVW5rbm93bkluamVjdGlvbnMgfHwgaGFzT3B0aW9uYWxQYXJhbWV0ZXJzKSA/IGtleXMubGVuZ3RoIDogZnVuYy5sZW5ndGg7XG4gICAgdmFyIGNvbnN0cnVjdG9yVGFyZ2V0cyA9IGdldENvbnN0cnVjdG9yQXJnc0FzVGFyZ2V0cyhpc0Jhc2VDbGFzcywgY29uc3RydWN0b3JOYW1lLCBzZXJ2aWNlSWRlbnRpZmllcnMsIGNvbnN0cnVjdG9yQXJnc01ldGFkYXRhLCBpdGVyYXRpb25zKTtcbiAgICB2YXIgcHJvcGVydHlUYXJnZXRzID0gZ2V0Q2xhc3NQcm9wc0FzVGFyZ2V0cyhtZXRhZGF0YVJlYWRlciwgZnVuYyk7XG4gICAgdmFyIHRhcmdldHMgPSBfX3NwcmVhZEFycmF5KF9fc3ByZWFkQXJyYXkoW10sIGNvbnN0cnVjdG9yVGFyZ2V0cyksIHByb3BlcnR5VGFyZ2V0cyk7XG4gICAgcmV0dXJuIHRhcmdldHM7XG59XG5mdW5jdGlvbiBnZXRDb25zdHJ1Y3RvckFyZ3NBc1RhcmdldChpbmRleCwgaXNCYXNlQ2xhc3MsIGNvbnN0cnVjdG9yTmFtZSwgc2VydmljZUlkZW50aWZpZXJzLCBjb25zdHJ1Y3RvckFyZ3NNZXRhZGF0YSkge1xuICAgIHZhciB0YXJnZXRNZXRhZGF0YSA9IGNvbnN0cnVjdG9yQXJnc01ldGFkYXRhW2luZGV4LnRvU3RyaW5nKCldIHx8IFtdO1xuICAgIHZhciBtZXRhZGF0YSA9IGZvcm1hdFRhcmdldE1ldGFkYXRhKHRhcmdldE1ldGFkYXRhKTtcbiAgICB2YXIgaXNNYW5hZ2VkID0gbWV0YWRhdGEudW5tYW5hZ2VkICE9PSB0cnVlO1xuICAgIHZhciBzZXJ2aWNlSWRlbnRpZmllciA9IHNlcnZpY2VJZGVudGlmaWVyc1tpbmRleF07XG4gICAgdmFyIGluamVjdElkZW50aWZpZXIgPSAobWV0YWRhdGEuaW5qZWN0IHx8IG1ldGFkYXRhLm11bHRpSW5qZWN0KTtcbiAgICBzZXJ2aWNlSWRlbnRpZmllciA9IChpbmplY3RJZGVudGlmaWVyKSA/IChpbmplY3RJZGVudGlmaWVyKSA6IHNlcnZpY2VJZGVudGlmaWVyO1xuICAgIGlmIChzZXJ2aWNlSWRlbnRpZmllciBpbnN0YW5jZW9mIGluamVjdF8xLkxhenlTZXJ2aWNlSWRlbnRpZmVyKSB7XG4gICAgICAgIHNlcnZpY2VJZGVudGlmaWVyID0gc2VydmljZUlkZW50aWZpZXIudW53cmFwKCk7XG4gICAgfVxuICAgIGlmIChpc01hbmFnZWQpIHtcbiAgICAgICAgdmFyIGlzT2JqZWN0ID0gc2VydmljZUlkZW50aWZpZXIgPT09IE9iamVjdDtcbiAgICAgICAgdmFyIGlzRnVuY3Rpb24gPSBzZXJ2aWNlSWRlbnRpZmllciA9PT0gRnVuY3Rpb247XG4gICAgICAgIHZhciBpc1VuZGVmaW5lZCA9IHNlcnZpY2VJZGVudGlmaWVyID09PSB1bmRlZmluZWQ7XG4gICAgICAgIHZhciBpc1Vua25vd25UeXBlID0gKGlzT2JqZWN0IHx8IGlzRnVuY3Rpb24gfHwgaXNVbmRlZmluZWQpO1xuICAgICAgICBpZiAoIWlzQmFzZUNsYXNzICYmIGlzVW5rbm93blR5cGUpIHtcbiAgICAgICAgICAgIHZhciBtc2cgPSBFUlJPUl9NU0dTLk1JU1NJTkdfSU5KRUNUX0FOTk9UQVRJT04gKyBcIiBhcmd1bWVudCBcIiArIGluZGV4ICsgXCIgaW4gY2xhc3MgXCIgKyBjb25zdHJ1Y3Rvck5hbWUgKyBcIi5cIjtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICAgICAgICB9XG4gICAgICAgIHZhciB0YXJnZXQgPSBuZXcgdGFyZ2V0XzEuVGFyZ2V0KGxpdGVyYWxfdHlwZXNfMS5UYXJnZXRUeXBlRW51bS5Db25zdHJ1Y3RvckFyZ3VtZW50LCBtZXRhZGF0YS50YXJnZXROYW1lLCBzZXJ2aWNlSWRlbnRpZmllcik7XG4gICAgICAgIHRhcmdldC5tZXRhZGF0YSA9IHRhcmdldE1ldGFkYXRhO1xuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGdldENvbnN0cnVjdG9yQXJnc0FzVGFyZ2V0cyhpc0Jhc2VDbGFzcywgY29uc3RydWN0b3JOYW1lLCBzZXJ2aWNlSWRlbnRpZmllcnMsIGNvbnN0cnVjdG9yQXJnc01ldGFkYXRhLCBpdGVyYXRpb25zKSB7XG4gICAgdmFyIHRhcmdldHMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZXJhdGlvbnM7IGkrKykge1xuICAgICAgICB2YXIgaW5kZXggPSBpO1xuICAgICAgICB2YXIgdGFyZ2V0ID0gZ2V0Q29uc3RydWN0b3JBcmdzQXNUYXJnZXQoaW5kZXgsIGlzQmFzZUNsYXNzLCBjb25zdHJ1Y3Rvck5hbWUsIHNlcnZpY2VJZGVudGlmaWVycywgY29uc3RydWN0b3JBcmdzTWV0YWRhdGEpO1xuICAgICAgICBpZiAodGFyZ2V0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0YXJnZXRzLnB1c2godGFyZ2V0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGFyZ2V0cztcbn1cbmZ1bmN0aW9uIGdldENsYXNzUHJvcHNBc1RhcmdldHMobWV0YWRhdGFSZWFkZXIsIGNvbnN0cnVjdG9yRnVuYykge1xuICAgIHZhciBjbGFzc1Byb3BzTWV0YWRhdGEgPSBtZXRhZGF0YVJlYWRlci5nZXRQcm9wZXJ0aWVzTWV0YWRhdGEoY29uc3RydWN0b3JGdW5jKTtcbiAgICB2YXIgdGFyZ2V0cyA9IFtdO1xuICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMoY2xhc3NQcm9wc01ldGFkYXRhKTtcbiAgICBmb3IgKHZhciBfaSA9IDAsIGtleXNfMSA9IGtleXM7IF9pIDwga2V5c18xLmxlbmd0aDsgX2krKykge1xuICAgICAgICB2YXIga2V5ID0ga2V5c18xW19pXTtcbiAgICAgICAgdmFyIHRhcmdldE1ldGFkYXRhID0gY2xhc3NQcm9wc01ldGFkYXRhW2tleV07XG4gICAgICAgIHZhciBtZXRhZGF0YSA9IGZvcm1hdFRhcmdldE1ldGFkYXRhKGNsYXNzUHJvcHNNZXRhZGF0YVtrZXldKTtcbiAgICAgICAgdmFyIHRhcmdldE5hbWUgPSBtZXRhZGF0YS50YXJnZXROYW1lIHx8IGtleTtcbiAgICAgICAgdmFyIHNlcnZpY2VJZGVudGlmaWVyID0gKG1ldGFkYXRhLmluamVjdCB8fCBtZXRhZGF0YS5tdWx0aUluamVjdCk7XG4gICAgICAgIHZhciB0YXJnZXQgPSBuZXcgdGFyZ2V0XzEuVGFyZ2V0KGxpdGVyYWxfdHlwZXNfMS5UYXJnZXRUeXBlRW51bS5DbGFzc1Byb3BlcnR5LCB0YXJnZXROYW1lLCBzZXJ2aWNlSWRlbnRpZmllcik7XG4gICAgICAgIHRhcmdldC5tZXRhZGF0YSA9IHRhcmdldE1ldGFkYXRhO1xuICAgICAgICB0YXJnZXRzLnB1c2godGFyZ2V0KTtcbiAgICB9XG4gICAgdmFyIGJhc2VDb25zdHJ1Y3RvciA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihjb25zdHJ1Y3RvckZ1bmMucHJvdG90eXBlKS5jb25zdHJ1Y3RvcjtcbiAgICBpZiAoYmFzZUNvbnN0cnVjdG9yICE9PSBPYmplY3QpIHtcbiAgICAgICAgdmFyIGJhc2VUYXJnZXRzID0gZ2V0Q2xhc3NQcm9wc0FzVGFyZ2V0cyhtZXRhZGF0YVJlYWRlciwgYmFzZUNvbnN0cnVjdG9yKTtcbiAgICAgICAgdGFyZ2V0cyA9IF9fc3ByZWFkQXJyYXkoX19zcHJlYWRBcnJheShbXSwgdGFyZ2V0cyksIGJhc2VUYXJnZXRzKTtcbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldHM7XG59XG5mdW5jdGlvbiBnZXRCYXNlQ2xhc3NEZXBlbmRlbmN5Q291bnQobWV0YWRhdGFSZWFkZXIsIGZ1bmMpIHtcbiAgICB2YXIgYmFzZUNvbnN0cnVjdG9yID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGZ1bmMucHJvdG90eXBlKS5jb25zdHJ1Y3RvcjtcbiAgICBpZiAoYmFzZUNvbnN0cnVjdG9yICE9PSBPYmplY3QpIHtcbiAgICAgICAgdmFyIGJhc2VDb25zdHJ1Y3Rvck5hbWUgPSBzZXJpYWxpemF0aW9uXzEuZ2V0RnVuY3Rpb25OYW1lKGJhc2VDb25zdHJ1Y3Rvcik7XG4gICAgICAgIHZhciB0YXJnZXRzID0gZ2V0VGFyZ2V0cyhtZXRhZGF0YVJlYWRlciwgYmFzZUNvbnN0cnVjdG9yTmFtZSwgYmFzZUNvbnN0cnVjdG9yLCB0cnVlKTtcbiAgICAgICAgdmFyIG1ldGFkYXRhID0gdGFyZ2V0cy5tYXAoZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgIHJldHVybiB0Lm1ldGFkYXRhLmZpbHRlcihmdW5jdGlvbiAobSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBtLmtleSA9PT0gTUVUQURBVEFfS0VZLlVOTUFOQUdFRF9UQUc7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciB1bm1hbmFnZWRDb3VudCA9IFtdLmNvbmNhdC5hcHBseShbXSwgbWV0YWRhdGEpLmxlbmd0aDtcbiAgICAgICAgdmFyIGRlcGVuZGVuY3lDb3VudCA9IHRhcmdldHMubGVuZ3RoIC0gdW5tYW5hZ2VkQ291bnQ7XG4gICAgICAgIGlmIChkZXBlbmRlbmN5Q291bnQgPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVwZW5kZW5jeUNvdW50O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGdldEJhc2VDbGFzc0RlcGVuZGVuY3lDb3VudChtZXRhZGF0YVJlYWRlciwgYmFzZUNvbnN0cnVjdG9yKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxufVxuZXhwb3J0cy5nZXRCYXNlQ2xhc3NEZXBlbmRlbmN5Q291bnQgPSBnZXRCYXNlQ2xhc3NEZXBlbmRlbmN5Q291bnQ7XG5mdW5jdGlvbiBmb3JtYXRUYXJnZXRNZXRhZGF0YSh0YXJnZXRNZXRhZGF0YSkge1xuICAgIHZhciB0YXJnZXRNZXRhZGF0YU1hcCA9IHt9O1xuICAgIHRhcmdldE1ldGFkYXRhLmZvckVhY2goZnVuY3Rpb24gKG0pIHtcbiAgICAgICAgdGFyZ2V0TWV0YWRhdGFNYXBbbS5rZXkudG9TdHJpbmcoKV0gPSBtLnZhbHVlO1xuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICAgIGluamVjdDogdGFyZ2V0TWV0YWRhdGFNYXBbTUVUQURBVEFfS0VZLklOSkVDVF9UQUddLFxuICAgICAgICBtdWx0aUluamVjdDogdGFyZ2V0TWV0YWRhdGFNYXBbTUVUQURBVEFfS0VZLk1VTFRJX0lOSkVDVF9UQUddLFxuICAgICAgICB0YXJnZXROYW1lOiB0YXJnZXRNZXRhZGF0YU1hcFtNRVRBREFUQV9LRVkuTkFNRV9UQUddLFxuICAgICAgICB1bm1hbmFnZWQ6IHRhcmdldE1ldGFkYXRhTWFwW01FVEFEQVRBX0tFWS5VTk1BTkFHRURfVEFHXVxuICAgIH07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZWZsZWN0aW9uX3V0aWxzLmpzLm1hcCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///508\n')},function(module,exports,__webpack_require__){"use strict";eval('\nObject.defineProperty(exports, "__esModule", { value: true });\nexports.QueryableString = void 0;\nvar QueryableString = (function () {\n function QueryableString(str) {\n this.str = str;\n }\n QueryableString.prototype.startsWith = function (searchString) {\n return this.str.indexOf(searchString) === 0;\n };\n QueryableString.prototype.endsWith = function (searchString) {\n var reverseString = "";\n var reverseSearchString = searchString.split("").reverse().join("");\n reverseString = this.str.split("").reverse().join("");\n return this.startsWith.call({ str: reverseString }, reverseSearchString);\n };\n QueryableString.prototype.contains = function (searchString) {\n return (this.str.indexOf(searchString) !== -1);\n };\n QueryableString.prototype.equals = function (compareString) {\n return this.str === compareString;\n };\n QueryableString.prototype.value = function () {\n return this.str;\n };\n return QueryableString;\n}());\nexports.QueryableString = QueryableString;\n//# sourceMappingURL=queryable_string.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaW52ZXJzaWZ5L2xpYi9wbGFubmluZy9xdWVyeWFibGVfc3RyaW5nLmpzP2NmMTMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQWE7QUFDYiw4Q0FBOEMsY0FBYztBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUMscUJBQXFCO0FBQzFEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQSIsImZpbGUiOiI1MDkuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuUXVlcnlhYmxlU3RyaW5nID0gdm9pZCAwO1xudmFyIFF1ZXJ5YWJsZVN0cmluZyA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUXVlcnlhYmxlU3RyaW5nKHN0cikge1xuICAgICAgICB0aGlzLnN0ciA9IHN0cjtcbiAgICB9XG4gICAgUXVlcnlhYmxlU3RyaW5nLnByb3RvdHlwZS5zdGFydHNXaXRoID0gZnVuY3Rpb24gKHNlYXJjaFN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5zdHIuaW5kZXhPZihzZWFyY2hTdHJpbmcpID09PSAwO1xuICAgIH07XG4gICAgUXVlcnlhYmxlU3RyaW5nLnByb3RvdHlwZS5lbmRzV2l0aCA9IGZ1bmN0aW9uIChzZWFyY2hTdHJpbmcpIHtcbiAgICAgICAgdmFyIHJldmVyc2VTdHJpbmcgPSBcIlwiO1xuICAgICAgICB2YXIgcmV2ZXJzZVNlYXJjaFN0cmluZyA9IHNlYXJjaFN0cmluZy5zcGxpdChcIlwiKS5yZXZlcnNlKCkuam9pbihcIlwiKTtcbiAgICAgICAgcmV2ZXJzZVN0cmluZyA9IHRoaXMuc3RyLnNwbGl0KFwiXCIpLnJldmVyc2UoKS5qb2luKFwiXCIpO1xuICAgICAgICByZXR1cm4gdGhpcy5zdGFydHNXaXRoLmNhbGwoeyBzdHI6IHJldmVyc2VTdHJpbmcgfSwgcmV2ZXJzZVNlYXJjaFN0cmluZyk7XG4gICAgfTtcbiAgICBRdWVyeWFibGVTdHJpbmcucHJvdG90eXBlLmNvbnRhaW5zID0gZnVuY3Rpb24gKHNlYXJjaFN0cmluZykge1xuICAgICAgICByZXR1cm4gKHRoaXMuc3RyLmluZGV4T2Yoc2VhcmNoU3RyaW5nKSAhPT0gLTEpO1xuICAgIH07XG4gICAgUXVlcnlhYmxlU3RyaW5nLnByb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbiAoY29tcGFyZVN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5zdHIgPT09IGNvbXBhcmVTdHJpbmc7XG4gICAgfTtcbiAgICBRdWVyeWFibGVTdHJpbmcucHJvdG90eXBlLnZhbHVlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdHI7XG4gICAgfTtcbiAgICByZXR1cm4gUXVlcnlhYmxlU3RyaW5nO1xufSgpKTtcbmV4cG9ydHMuUXVlcnlhYmxlU3RyaW5nID0gUXVlcnlhYmxlU3RyaW5nO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cXVlcnlhYmxlX3N0cmluZy5qcy5tYXAiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///509\n')},function(module,exports,__webpack_require__){"use strict";eval('\nObject.defineProperty(exports, "__esModule", { value: true });\nexports.Request = void 0;\nvar id_1 = __webpack_require__(68);\nvar Request = (function () {\n function Request(serviceIdentifier, parentContext, parentRequest, bindings, target) {\n this.id = id_1.id();\n this.serviceIdentifier = serviceIdentifier;\n this.parentContext = parentContext;\n this.parentRequest = parentRequest;\n this.target = target;\n this.childRequests = [];\n this.bindings = (Array.isArray(bindings) ? bindings : [bindings]);\n this.requestScope = parentRequest === null\n ? new Map()\n : null;\n }\n Request.prototype.addChildRequest = function (serviceIdentifier, bindings, target) {\n var child = new Request(serviceIdentifier, this.parentContext, this, bindings, target);\n this.childRequests.push(child);\n return child;\n };\n return Request;\n}());\nexports.Request = Request;\n//# sourceMappingURL=request.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaW52ZXJzaWZ5L2xpYi9wbGFubmluZy9yZXF1ZXN0LmpzP2M2MjIiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQWE7QUFDYiw4Q0FBOEMsY0FBYztBQUM1RDtBQUNBLFdBQVcsbUJBQU8sQ0FBQyxFQUFhO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0EiLCJmaWxlIjoiNTEwLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlJlcXVlc3QgPSB2b2lkIDA7XG52YXIgaWRfMSA9IHJlcXVpcmUoXCIuLi91dGlscy9pZFwiKTtcbnZhciBSZXF1ZXN0ID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBSZXF1ZXN0KHNlcnZpY2VJZGVudGlmaWVyLCBwYXJlbnRDb250ZXh0LCBwYXJlbnRSZXF1ZXN0LCBiaW5kaW5ncywgdGFyZ2V0KSB7XG4gICAgICAgIHRoaXMuaWQgPSBpZF8xLmlkKCk7XG4gICAgICAgIHRoaXMuc2VydmljZUlkZW50aWZpZXIgPSBzZXJ2aWNlSWRlbnRpZmllcjtcbiAgICAgICAgdGhpcy5wYXJlbnRDb250ZXh0ID0gcGFyZW50Q29udGV4dDtcbiAgICAgICAgdGhpcy5wYXJlbnRSZXF1ZXN0ID0gcGFyZW50UmVxdWVzdDtcbiAgICAgICAgdGhpcy50YXJnZXQgPSB0YXJnZXQ7XG4gICAgICAgIHRoaXMuY2hpbGRSZXF1ZXN0cyA9IFtdO1xuICAgICAgICB0aGlzLmJpbmRpbmdzID0gKEFycmF5LmlzQXJyYXkoYmluZGluZ3MpID8gYmluZGluZ3MgOiBbYmluZGluZ3NdKTtcbiAgICAgICAgdGhpcy5yZXF1ZXN0U2NvcGUgPSBwYXJlbnRSZXF1ZXN0ID09PSBudWxsXG4gICAgICAgICAgICA/IG5ldyBNYXAoKVxuICAgICAgICAgICAgOiBudWxsO1xuICAgIH1cbiAgICBSZXF1ZXN0LnByb3RvdHlwZS5hZGRDaGlsZFJlcXVlc3QgPSBmdW5jdGlvbiAoc2VydmljZUlkZW50aWZpZXIsIGJpbmRpbmdzLCB0YXJnZXQpIHtcbiAgICAgICAgdmFyIGNoaWxkID0gbmV3IFJlcXVlc3Qoc2VydmljZUlkZW50aWZpZXIsIHRoaXMucGFyZW50Q29udGV4dCwgdGhpcywgYmluZGluZ3MsIHRhcmdldCk7XG4gICAgICAgIHRoaXMuY2hpbGRSZXF1ZXN0cy5wdXNoKGNoaWxkKTtcbiAgICAgICAgcmV0dXJuIGNoaWxkO1xuICAgIH07XG4gICAgcmV0dXJuIFJlcXVlc3Q7XG59KCkpO1xuZXhwb3J0cy5SZXF1ZXN0ID0gUmVxdWVzdDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJlcXVlc3QuanMubWFwIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///510\n')},function(module,exports,__webpack_require__){"use strict";eval('\nObject.defineProperty(exports, "__esModule", { value: true });\nexports.resolve = void 0;\nvar ERROR_MSGS = __webpack_require__(40);\nvar literal_types_1 = __webpack_require__(56);\nvar exceptions_1 = __webpack_require__(243);\nvar serialization_1 = __webpack_require__(91);\nvar instantiation_1 = __webpack_require__(512);\nvar invokeFactory = function (factoryType, serviceIdentifier, fn) {\n try {\n return fn();\n }\n catch (error) {\n if (exceptions_1.isStackOverflowExeption(error)) {\n throw new Error(ERROR_MSGS.CIRCULAR_DEPENDENCY_IN_FACTORY(factoryType, serviceIdentifier.toString()));\n }\n else {\n throw error;\n }\n }\n};\nvar _resolveRequest = function (requestScope) {\n return function (request) {\n request.parentContext.setCurrentRequest(request);\n var bindings = request.bindings;\n var childRequests = request.childRequests;\n var targetIsAnArray = request.target && request.target.isArray();\n var targetParentIsNotAnArray = !request.parentRequest ||\n !request.parentRequest.target ||\n !request.target ||\n !request.parentRequest.target.matchesArray(request.target.serviceIdentifier);\n if (targetIsAnArray && targetParentIsNotAnArray) {\n return childRequests.map(function (childRequest) {\n var _f = _resolveRequest(requestScope);\n return _f(childRequest);\n });\n }\n else {\n var result = null;\n if (request.target.isOptional() && bindings.length === 0) {\n return undefined;\n }\n var binding_1 = bindings[0];\n var isSingleton = binding_1.scope === literal_types_1.BindingScopeEnum.Singleton;\n var isRequestSingleton = binding_1.scope === literal_types_1.BindingScopeEnum.Request;\n if (isSingleton && binding_1.activated) {\n return binding_1.cache;\n }\n if (isRequestSingleton &&\n requestScope !== null &&\n requestScope.has(binding_1.id)) {\n return requestScope.get(binding_1.id);\n }\n if (binding_1.type === literal_types_1.BindingTypeEnum.ConstantValue) {\n result = binding_1.cache;\n binding_1.activated = true;\n }\n else if (binding_1.type === literal_types_1.BindingTypeEnum.Function) {\n result = binding_1.cache;\n binding_1.activated = true;\n }\n else if (binding_1.type === literal_types_1.BindingTypeEnum.Constructor) {\n result = binding_1.implementationType;\n }\n else if (binding_1.type === literal_types_1.BindingTypeEnum.DynamicValue && binding_1.dynamicValue !== null) {\n result = invokeFactory("toDynamicValue", binding_1.serviceIdentifier, function () { return binding_1.dynamicValue(request.parentContext); });\n }\n else if (binding_1.type === literal_types_1.BindingTypeEnum.Factory && binding_1.factory !== null) {\n result = invokeFactory("toFactory", binding_1.serviceIdentifier, function () { return binding_1.factory(request.parentContext); });\n }\n else if (binding_1.type === literal_types_1.BindingTypeEnum.Provider && binding_1.provider !== null) {\n result = invokeFactory("toProvider", binding_1.serviceIdentifier, function () { return binding_1.provider(request.parentContext); });\n }\n else if (binding_1.type === literal_types_1.BindingTypeEnum.Instance && binding_1.implementationType !== null) {\n result = instantiation_1.resolveInstance(binding_1.implementationType, childRequests, _resolveRequest(requestScope));\n }\n else {\n var serviceIdentifier = serialization_1.getServiceIdentifierAsString(request.serviceIdentifier);\n throw new Error(ERROR_MSGS.INVALID_BINDING_TYPE + " " + serviceIdentifier);\n }\n if (typeof binding_1.onActivation === "function") {\n result = binding_1.onActivation(request.parentContext, result);\n }\n if (isSingleton) {\n binding_1.cache = result;\n binding_1.activated = true;\n }\n if (isRequestSingleton &&\n requestScope !== null &&\n !requestScope.has(binding_1.id)) {\n requestScope.set(binding_1.id, result);\n }\n return result;\n }\n };\n};\nfunction resolve(context) {\n var _f = _resolveRequest(context.plan.rootRequest.requestScope);\n return _f(context.plan.rootRequest);\n}\nexports.resolve = resolve;\n//# sourceMappingURL=resolver.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaW52ZXJzaWZ5L2xpYi9yZXNvbHV0aW9uL3Jlc29sdmVyLmpzPzY4ZjEiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQWE7QUFDYiw4Q0FBOEMsY0FBYztBQUM1RDtBQUNBLGlCQUFpQixtQkFBTyxDQUFDLEVBQXlCO0FBQ2xELHNCQUFzQixtQkFBTyxDQUFDLEVBQTRCO0FBQzFELG1CQUFtQixtQkFBTyxDQUFDLEdBQXFCO0FBQ2hELHNCQUFzQixtQkFBTyxDQUFDLEVBQXdCO0FBQ3RELHNCQUFzQixtQkFBTyxDQUFDLEdBQWlCO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUdBQW1HLHNEQUFzRCxFQUFFO0FBQzNKO0FBQ0E7QUFDQSw4RkFBOEYsaURBQWlELEVBQUU7QUFDako7QUFDQTtBQUNBLCtGQUErRixrREFBa0QsRUFBRTtBQUNuSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiNTExLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnJlc29sdmUgPSB2b2lkIDA7XG52YXIgRVJST1JfTVNHUyA9IHJlcXVpcmUoXCIuLi9jb25zdGFudHMvZXJyb3JfbXNnc1wiKTtcbnZhciBsaXRlcmFsX3R5cGVzXzEgPSByZXF1aXJlKFwiLi4vY29uc3RhbnRzL2xpdGVyYWxfdHlwZXNcIik7XG52YXIgZXhjZXB0aW9uc18xID0gcmVxdWlyZShcIi4uL3V0aWxzL2V4Y2VwdGlvbnNcIik7XG52YXIgc2VyaWFsaXphdGlvbl8xID0gcmVxdWlyZShcIi4uL3V0aWxzL3NlcmlhbGl6YXRpb25cIik7XG52YXIgaW5zdGFudGlhdGlvbl8xID0gcmVxdWlyZShcIi4vaW5zdGFudGlhdGlvblwiKTtcbnZhciBpbnZva2VGYWN0b3J5ID0gZnVuY3Rpb24gKGZhY3RvcnlUeXBlLCBzZXJ2aWNlSWRlbnRpZmllciwgZm4pIHtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gZm4oKTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChleGNlcHRpb25zXzEuaXNTdGFja092ZXJmbG93RXhlcHRpb24oZXJyb3IpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoRVJST1JfTVNHUy5DSVJDVUxBUl9ERVBFTkRFTkNZX0lOX0ZBQ1RPUlkoZmFjdG9yeVR5cGUsIHNlcnZpY2VJZGVudGlmaWVyLnRvU3RyaW5nKCkpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxufTtcbnZhciBfcmVzb2x2ZVJlcXVlc3QgPSBmdW5jdGlvbiAocmVxdWVzdFNjb3BlKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChyZXF1ZXN0KSB7XG4gICAgICAgIHJlcXVlc3QucGFyZW50Q29udGV4dC5zZXRDdXJyZW50UmVxdWVzdChyZXF1ZXN0KTtcbiAgICAgICAgdmFyIGJpbmRpbmdzID0gcmVxdWVzdC5iaW5kaW5ncztcbiAgICAgICAgdmFyIGNoaWxkUmVxdWVzdHMgPSByZXF1ZXN0LmNoaWxkUmVxdWVzdHM7XG4gICAgICAgIHZhciB0YXJnZXRJc0FuQXJyYXkgPSByZXF1ZXN0LnRhcmdldCAmJiByZXF1ZXN0LnRhcmdldC5pc0FycmF5KCk7XG4gICAgICAgIHZhciB0YXJnZXRQYXJlbnRJc05vdEFuQXJyYXkgPSAhcmVxdWVzdC5wYXJlbnRSZXF1ZXN0IHx8XG4gICAgICAgICAgICAhcmVxdWVzdC5wYXJlbnRSZXF1ZXN0LnRhcmdldCB8fFxuICAgICAgICAgICAgIXJlcXVlc3QudGFyZ2V0IHx8XG4gICAgICAgICAgICAhcmVxdWVzdC5wYXJlbnRSZXF1ZXN0LnRhcmdldC5tYXRjaGVzQXJyYXkocmVxdWVzdC50YXJnZXQuc2VydmljZUlkZW50aWZpZXIpO1xuICAgICAgICBpZiAodGFyZ2V0SXNBbkFycmF5ICYmIHRhcmdldFBhcmVudElzTm90QW5BcnJheSkge1xuICAgICAgICAgICAgcmV0dXJuIGNoaWxkUmVxdWVzdHMubWFwKGZ1bmN0aW9uIChjaGlsZFJlcXVlc3QpIHtcbiAgICAgICAgICAgICAgICB2YXIgX2YgPSBfcmVzb2x2ZVJlcXVlc3QocmVxdWVzdFNjb3BlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gX2YoY2hpbGRSZXF1ZXN0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IG51bGw7XG4gICAgICAgICAgICBpZiAocmVxdWVzdC50YXJnZXQuaXNPcHRpb25hbCgpICYmIGJpbmRpbmdzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgYmluZGluZ18xID0gYmluZGluZ3NbMF07XG4gICAgICAgICAgICB2YXIgaXNTaW5nbGV0b24gPSBiaW5kaW5nXzEuc2NvcGUgPT09IGxpdGVyYWxfdHlwZXNfMS5CaW5kaW5nU2NvcGVFbnVtLlNpbmdsZXRvbjtcbiAgICAgICAgICAgIHZhciBpc1JlcXVlc3RTaW5nbGV0b24gPSBiaW5kaW5nXzEuc2NvcGUgPT09IGxpdGVyYWxfdHlwZXNfMS5CaW5kaW5nU2NvcGVFbnVtLlJlcXVlc3Q7XG4gICAgICAgICAgICBpZiAoaXNTaW5nbGV0b24gJiYgYmluZGluZ18xLmFjdGl2YXRlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBiaW5kaW5nXzEuY2FjaGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNSZXF1ZXN0U2luZ2xldG9uICYmXG4gICAgICAgICAgICAgICAgcmVxdWVzdFNjb3BlICE9PSBudWxsICYmXG4gICAgICAgICAgICAgICAgcmVxdWVzdFNjb3BlLmhhcyhiaW5kaW5nXzEuaWQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcXVlc3RTY29wZS5nZXQoYmluZGluZ18xLmlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChiaW5kaW5nXzEudHlwZSA9PT0gbGl0ZXJhbF90eXBlc18xLkJpbmRpbmdUeXBlRW51bS5Db25zdGFudFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gYmluZGluZ18xLmNhY2hlO1xuICAgICAgICAgICAgICAgIGJpbmRpbmdfMS5hY3RpdmF0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYmluZGluZ18xLnR5cGUgPT09IGxpdGVyYWxfdHlwZXNfMS5CaW5kaW5nVHlwZUVudW0uRnVuY3Rpb24pIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBiaW5kaW5nXzEuY2FjaGU7XG4gICAgICAgICAgICAgICAgYmluZGluZ18xLmFjdGl2YXRlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChiaW5kaW5nXzEudHlwZSA9PT0gbGl0ZXJhbF90eXBlc18xLkJpbmRpbmdUeXBlRW51bS5Db25zdHJ1Y3Rvcikge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGJpbmRpbmdfMS5pbXBsZW1lbnRhdGlvblR5cGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChiaW5kaW5nXzEudHlwZSA9PT0gbGl0ZXJhbF90eXBlc18xLkJpbmRpbmdUeXBlRW51bS5EeW5hbWljVmFsdWUgJiYgYmluZGluZ18xLmR5bmFtaWNWYWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGludm9rZUZhY3RvcnkoXCJ0b0R5bmFtaWNWYWx1ZVwiLCBiaW5kaW5nXzEuc2VydmljZUlkZW50aWZpZXIsIGZ1bmN0aW9uICgpIHsgcmV0dXJuIGJpbmRpbmdfMS5keW5hbWljVmFsdWUocmVxdWVzdC5wYXJlbnRDb250ZXh0KTsgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChiaW5kaW5nXzEudHlwZSA9PT0gbGl0ZXJhbF90eXBlc18xLkJpbmRpbmdUeXBlRW51bS5GYWN0b3J5ICYmIGJpbmRpbmdfMS5mYWN0b3J5ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gaW52b2tlRmFjdG9yeShcInRvRmFjdG9yeVwiLCBiaW5kaW5nXzEuc2VydmljZUlkZW50aWZpZXIsIGZ1bmN0aW9uICgpIHsgcmV0dXJuIGJpbmRpbmdfMS5mYWN0b3J5KHJlcXVlc3QucGFyZW50Q29udGV4dCk7IH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYmluZGluZ18xLnR5cGUgPT09IGxpdGVyYWxfdHlwZXNfMS5CaW5kaW5nVHlwZUVudW0uUHJvdmlkZXIgJiYgYmluZGluZ18xLnByb3ZpZGVyICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gaW52b2tlRmFjdG9yeShcInRvUHJvdmlkZXJcIiwgYmluZGluZ18xLnNlcnZpY2VJZGVudGlmaWVyLCBmdW5jdGlvbiAoKSB7IHJldHVybiBiaW5kaW5nXzEucHJvdmlkZXIocmVxdWVzdC5wYXJlbnRDb250ZXh0KTsgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChiaW5kaW5nXzEudHlwZSA9PT0gbGl0ZXJhbF90eXBlc18xLkJpbmRpbmdUeXBlRW51bS5JbnN0YW5jZSAmJiBiaW5kaW5nXzEuaW1wbGVtZW50YXRpb25UeXBlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gaW5zdGFudGlhdGlvbl8xLnJlc29sdmVJbnN0YW5jZShiaW5kaW5nXzEuaW1wbGVtZW50YXRpb25UeXBlLCBjaGlsZFJlcXVlc3RzLCBfcmVzb2x2ZVJlcXVlc3QocmVxdWVzdFNjb3BlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgc2VydmljZUlkZW50aWZpZXIgPSBzZXJpYWxpemF0aW9uXzEuZ2V0U2VydmljZUlkZW50aWZpZXJBc1N0cmluZyhyZXF1ZXN0LnNlcnZpY2VJZGVudGlmaWVyKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoRVJST1JfTVNHUy5JTlZBTElEX0JJTkRJTkdfVFlQRSArIFwiIFwiICsgc2VydmljZUlkZW50aWZpZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBiaW5kaW5nXzEub25BY3RpdmF0aW9uID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBiaW5kaW5nXzEub25BY3RpdmF0aW9uKHJlcXVlc3QucGFyZW50Q29udGV4dCwgcmVzdWx0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc1NpbmdsZXRvbikge1xuICAgICAgICAgICAgICAgIGJpbmRpbmdfMS5jYWNoZSA9IHJlc3VsdDtcbiAgICAgICAgICAgICAgICBiaW5kaW5nXzEuYWN0aXZhdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc1JlcXVlc3RTaW5nbGV0b24gJiZcbiAgICAgICAgICAgICAgICByZXF1ZXN0U2NvcGUgIT09IG51bGwgJiZcbiAgICAgICAgICAgICAgICAhcmVxdWVzdFNjb3BlLmhhcyhiaW5kaW5nXzEuaWQpKSB7XG4gICAgICAgICAgICAgICAgcmVxdWVzdFNjb3BlLnNldChiaW5kaW5nXzEuaWQsIHJlc3VsdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgfTtcbn07XG5mdW5jdGlvbiByZXNvbHZlKGNvbnRleHQpIHtcbiAgICB2YXIgX2YgPSBfcmVzb2x2ZVJlcXVlc3QoY29udGV4dC5wbGFuLnJvb3RSZXF1ZXN0LnJlcXVlc3RTY29wZSk7XG4gICAgcmV0dXJuIF9mKGNvbnRleHQucGxhbi5yb290UmVxdWVzdCk7XG59XG5leHBvcnRzLnJlc29sdmUgPSByZXNvbHZlO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmVzb2x2ZXIuanMubWFwIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///511\n')},function(module,exports,__webpack_require__){"use strict";eval('\nvar __spreadArray = (this && this.__spreadArray) || function (to, from) {\n for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)\n to[j] = from[i];\n return to;\n};\nObject.defineProperty(exports, "__esModule", { value: true });\nexports.resolveInstance = void 0;\nvar error_msgs_1 = __webpack_require__(40);\nvar literal_types_1 = __webpack_require__(56);\nvar METADATA_KEY = __webpack_require__(32);\nfunction _injectProperties(instance, childRequests, resolveRequest) {\n var propertyInjectionsRequests = childRequests.filter(function (childRequest) {\n return (childRequest.target !== null &&\n childRequest.target.type === literal_types_1.TargetTypeEnum.ClassProperty);\n });\n var propertyInjections = propertyInjectionsRequests.map(resolveRequest);\n propertyInjectionsRequests.forEach(function (r, index) {\n var propertyName = "";\n propertyName = r.target.name.value();\n var injection = propertyInjections[index];\n instance[propertyName] = injection;\n });\n return instance;\n}\nfunction _createInstance(Func, injections) {\n return new (Func.bind.apply(Func, __spreadArray([void 0], injections)))();\n}\nfunction _postConstruct(constr, result) {\n if (Reflect.hasMetadata(METADATA_KEY.POST_CONSTRUCT, constr)) {\n var data = Reflect.getMetadata(METADATA_KEY.POST_CONSTRUCT, constr);\n try {\n result[data.value]();\n }\n catch (e) {\n throw new Error(error_msgs_1.POST_CONSTRUCT_ERROR(constr.name, e.message));\n }\n }\n}\nfunction resolveInstance(constr, childRequests, resolveRequest) {\n var result = null;\n if (childRequests.length > 0) {\n var constructorInjectionsRequests = childRequests.filter(function (childRequest) {\n return (childRequest.target !== null && childRequest.target.type === literal_types_1.TargetTypeEnum.ConstructorArgument);\n });\n var constructorInjections = constructorInjectionsRequests.map(resolveRequest);\n result = _createInstance(constr, constructorInjections);\n result = _injectProperties(result, childRequests, resolveRequest);\n }\n else {\n result = new constr();\n }\n _postConstruct(constr, result);\n return result;\n}\nexports.resolveInstance = resolveInstance;\n//# sourceMappingURL=instantiation.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaW52ZXJzaWZ5L2xpYi9yZXNvbHV0aW9uL2luc3RhbnRpYXRpb24uanM/NzEyMiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBYTtBQUNiO0FBQ0Esb0RBQW9ELFFBQVE7QUFDNUQ7QUFDQTtBQUNBO0FBQ0EsOENBQThDLGNBQWM7QUFDNUQ7QUFDQSxtQkFBbUIsbUJBQU8sQ0FBQyxFQUF5QjtBQUNwRCxzQkFBc0IsbUJBQU8sQ0FBQyxFQUE0QjtBQUMxRCxtQkFBbUIsbUJBQU8sQ0FBQyxFQUE0QjtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiI1MTIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciBfX3NwcmVhZEFycmF5ID0gKHRoaXMgJiYgdGhpcy5fX3NwcmVhZEFycmF5KSB8fCBmdW5jdGlvbiAodG8sIGZyb20pIHtcbiAgICBmb3IgKHZhciBpID0gMCwgaWwgPSBmcm9tLmxlbmd0aCwgaiA9IHRvLmxlbmd0aDsgaSA8IGlsOyBpKyssIGorKylcbiAgICAgICAgdG9bal0gPSBmcm9tW2ldO1xuICAgIHJldHVybiB0bztcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnJlc29sdmVJbnN0YW5jZSA9IHZvaWQgMDtcbnZhciBlcnJvcl9tc2dzXzEgPSByZXF1aXJlKFwiLi4vY29uc3RhbnRzL2Vycm9yX21zZ3NcIik7XG52YXIgbGl0ZXJhbF90eXBlc18xID0gcmVxdWlyZShcIi4uL2NvbnN0YW50cy9saXRlcmFsX3R5cGVzXCIpO1xudmFyIE1FVEFEQVRBX0tFWSA9IHJlcXVpcmUoXCIuLi9jb25zdGFudHMvbWV0YWRhdGFfa2V5c1wiKTtcbmZ1bmN0aW9uIF9pbmplY3RQcm9wZXJ0aWVzKGluc3RhbmNlLCBjaGlsZFJlcXVlc3RzLCByZXNvbHZlUmVxdWVzdCkge1xuICAgIHZhciBwcm9wZXJ0eUluamVjdGlvbnNSZXF1ZXN0cyA9IGNoaWxkUmVxdWVzdHMuZmlsdGVyKGZ1bmN0aW9uIChjaGlsZFJlcXVlc3QpIHtcbiAgICAgICAgcmV0dXJuIChjaGlsZFJlcXVlc3QudGFyZ2V0ICE9PSBudWxsICYmXG4gICAgICAgICAgICBjaGlsZFJlcXVlc3QudGFyZ2V0LnR5cGUgPT09IGxpdGVyYWxfdHlwZXNfMS5UYXJnZXRUeXBlRW51bS5DbGFzc1Byb3BlcnR5KTtcbiAgICB9KTtcbiAgICB2YXIgcHJvcGVydHlJbmplY3Rpb25zID0gcHJvcGVydHlJbmplY3Rpb25zUmVxdWVzdHMubWFwKHJlc29sdmVSZXF1ZXN0KTtcbiAgICBwcm9wZXJ0eUluamVjdGlvbnNSZXF1ZXN0cy5mb3JFYWNoKGZ1bmN0aW9uIChyLCBpbmRleCkge1xuICAgICAgICB2YXIgcHJvcGVydHlOYW1lID0gXCJcIjtcbiAgICAgICAgcHJvcGVydHlOYW1lID0gci50YXJnZXQubmFtZS52YWx1ZSgpO1xuICAgICAgICB2YXIgaW5qZWN0aW9uID0gcHJvcGVydHlJbmplY3Rpb25zW2luZGV4XTtcbiAgICAgICAgaW5zdGFuY2VbcHJvcGVydHlOYW1lXSA9IGluamVjdGlvbjtcbiAgICB9KTtcbiAgICByZXR1cm4gaW5zdGFuY2U7XG59XG5mdW5jdGlvbiBfY3JlYXRlSW5zdGFuY2UoRnVuYywgaW5qZWN0aW9ucykge1xuICAgIHJldHVybiBuZXcgKEZ1bmMuYmluZC5hcHBseShGdW5jLCBfX3NwcmVhZEFycmF5KFt2b2lkIDBdLCBpbmplY3Rpb25zKSkpKCk7XG59XG5mdW5jdGlvbiBfcG9zdENvbnN0cnVjdChjb25zdHIsIHJlc3VsdCkge1xuICAgIGlmIChSZWZsZWN0Lmhhc01ldGFkYXRhKE1FVEFEQVRBX0tFWS5QT1NUX0NPTlNUUlVDVCwgY29uc3RyKSkge1xuICAgICAgICB2YXIgZGF0YSA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoTUVUQURBVEFfS0VZLlBPU1RfQ09OU1RSVUNULCBjb25zdHIpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmVzdWx0W2RhdGEudmFsdWVdKCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvcl9tc2dzXzEuUE9TVF9DT05TVFJVQ1RfRVJST1IoY29uc3RyLm5hbWUsIGUubWVzc2FnZSkpO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gcmVzb2x2ZUluc3RhbmNlKGNvbnN0ciwgY2hpbGRSZXF1ZXN0cywgcmVzb2x2ZVJlcXVlc3QpIHtcbiAgICB2YXIgcmVzdWx0ID0gbnVsbDtcbiAgICBpZiAoY2hpbGRSZXF1ZXN0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHZhciBjb25zdHJ1Y3RvckluamVjdGlvbnNSZXF1ZXN0cyA9IGNoaWxkUmVxdWVzdHMuZmlsdGVyKGZ1bmN0aW9uIChjaGlsZFJlcXVlc3QpIHtcbiAgICAgICAgICAgIHJldHVybiAoY2hpbGRSZXF1ZXN0LnRhcmdldCAhPT0gbnVsbCAmJiBjaGlsZFJlcXVlc3QudGFyZ2V0LnR5cGUgPT09IGxpdGVyYWxfdHlwZXNfMS5UYXJnZXRUeXBlRW51bS5Db25zdHJ1Y3RvckFyZ3VtZW50KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciBjb25zdHJ1Y3RvckluamVjdGlvbnMgPSBjb25zdHJ1Y3RvckluamVjdGlvbnNSZXF1ZXN0cy5tYXAocmVzb2x2ZVJlcXVlc3QpO1xuICAgICAgICByZXN1bHQgPSBfY3JlYXRlSW5zdGFuY2UoY29uc3RyLCBjb25zdHJ1Y3RvckluamVjdGlvbnMpO1xuICAgICAgICByZXN1bHQgPSBfaW5qZWN0UHJvcGVydGllcyhyZXN1bHQsIGNoaWxkUmVxdWVzdHMsIHJlc29sdmVSZXF1ZXN0KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJlc3VsdCA9IG5ldyBjb25zdHIoKTtcbiAgICB9XG4gICAgX3Bvc3RDb25zdHJ1Y3QoY29uc3RyLCByZXN1bHQpO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5leHBvcnRzLnJlc29sdmVJbnN0YW5jZSA9IHJlc29sdmVJbnN0YW5jZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluc3RhbnRpYXRpb24uanMubWFwIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///512\n')},function(module,exports,__webpack_require__){"use strict";eval('\nObject.defineProperty(exports, "__esModule", { value: true });\nexports.BindingToSyntax = void 0;\nvar ERROR_MSGS = __webpack_require__(40);\nvar literal_types_1 = __webpack_require__(56);\nvar binding_in_when_on_syntax_1 = __webpack_require__(514);\nvar binding_when_on_syntax_1 = __webpack_require__(246);\nvar BindingToSyntax = (function () {\n function BindingToSyntax(binding) {\n this._binding = binding;\n }\n BindingToSyntax.prototype.to = function (constructor) {\n this._binding.type = literal_types_1.BindingTypeEnum.Instance;\n this._binding.implementationType = constructor;\n return new binding_in_when_on_syntax_1.BindingInWhenOnSyntax(this._binding);\n };\n BindingToSyntax.prototype.toSelf = function () {\n if (typeof this._binding.serviceIdentifier !== "function") {\n throw new Error("" + ERROR_MSGS.INVALID_TO_SELF_VALUE);\n }\n var self = this._binding.serviceIdentifier;\n return this.to(self);\n };\n BindingToSyntax.prototype.toConstantValue = function (value) {\n this._binding.type = literal_types_1.BindingTypeEnum.ConstantValue;\n this._binding.cache = value;\n this._binding.dynamicValue = null;\n this._binding.implementationType = null;\n this._binding.scope = literal_types_1.BindingScopeEnum.Singleton;\n return new binding_when_on_syntax_1.BindingWhenOnSyntax(this._binding);\n };\n BindingToSyntax.prototype.toDynamicValue = function (func) {\n this._binding.type = literal_types_1.BindingTypeEnum.DynamicValue;\n this._binding.cache = null;\n this._binding.dynamicValue = func;\n this._binding.implementationType = null;\n return new binding_in_when_on_syntax_1.BindingInWhenOnSyntax(this._binding);\n };\n BindingToSyntax.prototype.toConstructor = function (constructor) {\n this._binding.type = literal_types_1.BindingTypeEnum.Constructor;\n this._binding.implementationType = constructor;\n this._binding.scope = literal_types_1.BindingScopeEnum.Singleton;\n return new binding_when_on_syntax_1.BindingWhenOnSyntax(this._binding);\n };\n BindingToSyntax.prototype.toFactory = function (factory) {\n this._binding.type = literal_types_1.BindingTypeEnum.Factory;\n this._binding.factory = factory;\n this._binding.scope = literal_types_1.BindingScopeEnum.Singleton;\n return new binding_when_on_syntax_1.BindingWhenOnSyntax(this._binding);\n };\n BindingToSyntax.prototype.toFunction = function (func) {\n if (typeof func !== "function") {\n throw new Error(ERROR_MSGS.INVALID_FUNCTION_BINDING);\n }\n var bindingWhenOnSyntax = this.toConstantValue(func);\n this._binding.type = literal_types_1.BindingTypeEnum.Function;\n this._binding.scope = literal_types_1.BindingScopeEnum.Singleton;\n return bindingWhenOnSyntax;\n };\n BindingToSyntax.prototype.toAutoFactory = function (serviceIdentifier) {\n this._binding.type = literal_types_1.BindingTypeEnum.Factory;\n this._binding.factory = function (context) {\n var autofactory = function () { return context.container.get(serviceIdentifier); };\n return autofactory;\n };\n this._binding.scope = literal_types_1.BindingScopeEnum.Singleton;\n return new binding_when_on_syntax_1.BindingWhenOnSyntax(this._binding);\n };\n BindingToSyntax.prototype.toProvider = function (provider) {\n this._binding.type = literal_types_1.BindingTypeEnum.Provider;\n this._binding.provider = provider;\n this._binding.scope = literal_types_1.BindingScopeEnum.Singleton;\n return new binding_when_on_syntax_1.BindingWhenOnSyntax(this._binding);\n };\n BindingToSyntax.prototype.toService = function (service) {\n this.toDynamicValue(function (context) { return context.container.get(service); });\n };\n return BindingToSyntax;\n}());\nexports.BindingToSyntax = BindingToSyntax;\n//# sourceMappingURL=binding_to_syntax.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaW52ZXJzaWZ5L2xpYi9zeW50YXgvYmluZGluZ190b19zeW50YXguanM/ODMzNiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBYTtBQUNiLDhDQUE4QyxjQUFjO0FBQzVEO0FBQ0EsaUJBQWlCLG1CQUFPLENBQUMsRUFBeUI7QUFDbEQsc0JBQXNCLG1CQUFPLENBQUMsRUFBNEI7QUFDMUQsa0NBQWtDLG1CQUFPLENBQUMsR0FBNkI7QUFDdkUsK0JBQStCLG1CQUFPLENBQUMsR0FBMEI7QUFDakU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQ0FBMkMsaURBQWlEO0FBQzVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdEQUFnRCx1Q0FBdUMsRUFBRTtBQUN6RjtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0EiLCJmaWxlIjoiNTEzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkJpbmRpbmdUb1N5bnRheCA9IHZvaWQgMDtcbnZhciBFUlJPUl9NU0dTID0gcmVxdWlyZShcIi4uL2NvbnN0YW50cy9lcnJvcl9tc2dzXCIpO1xudmFyIGxpdGVyYWxfdHlwZXNfMSA9IHJlcXVpcmUoXCIuLi9jb25zdGFudHMvbGl0ZXJhbF90eXBlc1wiKTtcbnZhciBiaW5kaW5nX2luX3doZW5fb25fc3ludGF4XzEgPSByZXF1aXJlKFwiLi9iaW5kaW5nX2luX3doZW5fb25fc3ludGF4XCIpO1xudmFyIGJpbmRpbmdfd2hlbl9vbl9zeW50YXhfMSA9IHJlcXVpcmUoXCIuL2JpbmRpbmdfd2hlbl9vbl9zeW50YXhcIik7XG52YXIgQmluZGluZ1RvU3ludGF4ID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBCaW5kaW5nVG9TeW50YXgoYmluZGluZykge1xuICAgICAgICB0aGlzLl9iaW5kaW5nID0gYmluZGluZztcbiAgICB9XG4gICAgQmluZGluZ1RvU3ludGF4LnByb3RvdHlwZS50byA9IGZ1bmN0aW9uIChjb25zdHJ1Y3Rvcikge1xuICAgICAgICB0aGlzLl9iaW5kaW5nLnR5cGUgPSBsaXRlcmFsX3R5cGVzXzEuQmluZGluZ1R5cGVFbnVtLkluc3RhbmNlO1xuICAgICAgICB0aGlzLl9iaW5kaW5nLmltcGxlbWVudGF0aW9uVHlwZSA9IGNvbnN0cnVjdG9yO1xuICAgICAgICByZXR1cm4gbmV3IGJpbmRpbmdfaW5fd2hlbl9vbl9zeW50YXhfMS5CaW5kaW5nSW5XaGVuT25TeW50YXgodGhpcy5fYmluZGluZyk7XG4gICAgfTtcbiAgICBCaW5kaW5nVG9TeW50YXgucHJvdG90eXBlLnRvU2VsZiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLl9iaW5kaW5nLnNlcnZpY2VJZGVudGlmaWVyICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlwiICsgRVJST1JfTVNHUy5JTlZBTElEX1RPX1NFTEZfVkFMVUUpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBzZWxmID0gdGhpcy5fYmluZGluZy5zZXJ2aWNlSWRlbnRpZmllcjtcbiAgICAgICAgcmV0dXJuIHRoaXMudG8oc2VsZik7XG4gICAgfTtcbiAgICBCaW5kaW5nVG9TeW50YXgucHJvdG90eXBlLnRvQ29uc3RhbnRWYWx1ZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB0aGlzLl9iaW5kaW5nLnR5cGUgPSBsaXRlcmFsX3R5cGVzXzEuQmluZGluZ1R5cGVFbnVtLkNvbnN0YW50VmFsdWU7XG4gICAgICAgIHRoaXMuX2JpbmRpbmcuY2FjaGUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5fYmluZGluZy5keW5hbWljVmFsdWUgPSBudWxsO1xuICAgICAgICB0aGlzLl9iaW5kaW5nLmltcGxlbWVudGF0aW9uVHlwZSA9IG51bGw7XG4gICAgICAgIHRoaXMuX2JpbmRpbmcuc2NvcGUgPSBsaXRlcmFsX3R5cGVzXzEuQmluZGluZ1Njb3BlRW51bS5TaW5nbGV0b247XG4gICAgICAgIHJldHVybiBuZXcgYmluZGluZ193aGVuX29uX3N5bnRheF8xLkJpbmRpbmdXaGVuT25TeW50YXgodGhpcy5fYmluZGluZyk7XG4gICAgfTtcbiAgICBCaW5kaW5nVG9TeW50YXgucHJvdG90eXBlLnRvRHluYW1pY1ZhbHVlID0gZnVuY3Rpb24gKGZ1bmMpIHtcbiAgICAgICAgdGhpcy5fYmluZGluZy50eXBlID0gbGl0ZXJhbF90eXBlc18xLkJpbmRpbmdUeXBlRW51bS5EeW5hbWljVmFsdWU7XG4gICAgICAgIHRoaXMuX2JpbmRpbmcuY2FjaGUgPSBudWxsO1xuICAgICAgICB0aGlzLl9iaW5kaW5nLmR5bmFtaWNWYWx1ZSA9IGZ1bmM7XG4gICAgICAgIHRoaXMuX2JpbmRpbmcuaW1wbGVtZW50YXRpb25UeXBlID0gbnVsbDtcbiAgICAgICAgcmV0dXJuIG5ldyBiaW5kaW5nX2luX3doZW5fb25fc3ludGF4XzEuQmluZGluZ0luV2hlbk9uU3ludGF4KHRoaXMuX2JpbmRpbmcpO1xuICAgIH07XG4gICAgQmluZGluZ1RvU3ludGF4LnByb3RvdHlwZS50b0NvbnN0cnVjdG9yID0gZnVuY3Rpb24gKGNvbnN0cnVjdG9yKSB7XG4gICAgICAgIHRoaXMuX2JpbmRpbmcudHlwZSA9IGxpdGVyYWxfdHlwZXNfMS5CaW5kaW5nVHlwZUVudW0uQ29uc3RydWN0b3I7XG4gICAgICAgIHRoaXMuX2JpbmRpbmcuaW1wbGVtZW50YXRpb25UeXBlID0gY29uc3RydWN0b3I7XG4gICAgICAgIHRoaXMuX2JpbmRpbmcuc2NvcGUgPSBsaXRlcmFsX3R5cGVzXzEuQmluZGluZ1Njb3BlRW51bS5TaW5nbGV0b247XG4gICAgICAgIHJldHVybiBuZXcgYmluZGluZ193aGVuX29uX3N5bnRheF8xLkJpbmRpbmdXaGVuT25TeW50YXgodGhpcy5fYmluZGluZyk7XG4gICAgfTtcbiAgICBCaW5kaW5nVG9TeW50YXgucHJvdG90eXBlLnRvRmFjdG9yeSA9IGZ1bmN0aW9uIChmYWN0b3J5KSB7XG4gICAgICAgIHRoaXMuX2JpbmRpbmcudHlwZSA9IGxpdGVyYWxfdHlwZXNfMS5CaW5kaW5nVHlwZUVudW0uRmFjdG9yeTtcbiAgICAgICAgdGhpcy5fYmluZGluZy5mYWN0b3J5ID0gZmFjdG9yeTtcbiAgICAgICAgdGhpcy5fYmluZGluZy5zY29wZSA9IGxpdGVyYWxfdHlwZXNfMS5CaW5kaW5nU2NvcGVFbnVtLlNpbmdsZXRvbjtcbiAgICAgICAgcmV0dXJuIG5ldyBiaW5kaW5nX3doZW5fb25fc3ludGF4XzEuQmluZGluZ1doZW5PblN5bnRheCh0aGlzLl9iaW5kaW5nKTtcbiAgICB9O1xuICAgIEJpbmRpbmdUb1N5bnRheC5wcm90b3R5cGUudG9GdW5jdGlvbiA9IGZ1bmN0aW9uIChmdW5jKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZnVuYyAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoRVJST1JfTVNHUy5JTlZBTElEX0ZVTkNUSU9OX0JJTkRJTkcpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBiaW5kaW5nV2hlbk9uU3ludGF4ID0gdGhpcy50b0NvbnN0YW50VmFsdWUoZnVuYyk7XG4gICAgICAgIHRoaXMuX2JpbmRpbmcudHlwZSA9IGxpdGVyYWxfdHlwZXNfMS5CaW5kaW5nVHlwZUVudW0uRnVuY3Rpb247XG4gICAgICAgIHRoaXMuX2JpbmRpbmcuc2NvcGUgPSBsaXRlcmFsX3R5cGVzXzEuQmluZGluZ1Njb3BlRW51bS5TaW5nbGV0b247XG4gICAgICAgIHJldHVybiBiaW5kaW5nV2hlbk9uU3ludGF4O1xuICAgIH07XG4gICAgQmluZGluZ1RvU3ludGF4LnByb3RvdHlwZS50b0F1dG9GYWN0b3J5ID0gZnVuY3Rpb24gKHNlcnZpY2VJZGVudGlmaWVyKSB7XG4gICAgICAgIHRoaXMuX2JpbmRpbmcudHlwZSA9IGxpdGVyYWxfdHlwZXNfMS5CaW5kaW5nVHlwZUVudW0uRmFjdG9yeTtcbiAgICAgICAgdGhpcy5fYmluZGluZy5mYWN0b3J5ID0gZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgICAgICAgIHZhciBhdXRvZmFjdG9yeSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbnRleHQuY29udGFpbmVyLmdldChzZXJ2aWNlSWRlbnRpZmllcik7IH07XG4gICAgICAgICAgICByZXR1cm4gYXV0b2ZhY3Rvcnk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuX2JpbmRpbmcuc2NvcGUgPSBsaXRlcmFsX3R5cGVzXzEuQmluZGluZ1Njb3BlRW51bS5TaW5nbGV0b247XG4gICAgICAgIHJldHVybiBuZXcgYmluZGluZ193aGVuX29uX3N5bnRheF8xLkJpbmRpbmdXaGVuT25TeW50YXgodGhpcy5fYmluZGluZyk7XG4gICAgfTtcbiAgICBCaW5kaW5nVG9TeW50YXgucHJvdG90eXBlLnRvUHJvdmlkZXIgPSBmdW5jdGlvbiAocHJvdmlkZXIpIHtcbiAgICAgICAgdGhpcy5fYmluZGluZy50eXBlID0gbGl0ZXJhbF90eXBlc18xLkJpbmRpbmdUeXBlRW51bS5Qcm92aWRlcjtcbiAgICAgICAgdGhpcy5fYmluZGluZy5wcm92aWRlciA9IHByb3ZpZGVyO1xuICAgICAgICB0aGlzLl9iaW5kaW5nLnNjb3BlID0gbGl0ZXJhbF90eXBlc18xLkJpbmRpbmdTY29wZUVudW0uU2luZ2xldG9uO1xuICAgICAgICByZXR1cm4gbmV3IGJpbmRpbmdfd2hlbl9vbl9zeW50YXhfMS5CaW5kaW5nV2hlbk9uU3ludGF4KHRoaXMuX2JpbmRpbmcpO1xuICAgIH07XG4gICAgQmluZGluZ1RvU3ludGF4LnByb3RvdHlwZS50b1NlcnZpY2UgPSBmdW5jdGlvbiAoc2VydmljZSkge1xuICAgICAgICB0aGlzLnRvRHluYW1pY1ZhbHVlKGZ1bmN0aW9uIChjb250ZXh0KSB7IHJldHVybiBjb250ZXh0LmNvbnRhaW5lci5nZXQoc2VydmljZSk7IH0pO1xuICAgIH07XG4gICAgcmV0dXJuIEJpbmRpbmdUb1N5bnRheDtcbn0oKSk7XG5leHBvcnRzLkJpbmRpbmdUb1N5bnRheCA9IEJpbmRpbmdUb1N5bnRheDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJpbmRpbmdfdG9fc3ludGF4LmpzLm1hcCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///513\n')},function(module,exports,__webpack_require__){"use strict";eval('\nObject.defineProperty(exports, "__esModule", { value: true });\nexports.BindingInWhenOnSyntax = void 0;\nvar binding_in_syntax_1 = __webpack_require__(515);\nvar binding_on_syntax_1 = __webpack_require__(170);\nvar binding_when_syntax_1 = __webpack_require__(171);\nvar BindingInWhenOnSyntax = (function () {\n function BindingInWhenOnSyntax(binding) {\n this._binding = binding;\n this._bindingWhenSyntax = new binding_when_syntax_1.BindingWhenSyntax(this._binding);\n this._bindingOnSyntax = new binding_on_syntax_1.BindingOnSyntax(this._binding);\n this._bindingInSyntax = new binding_in_syntax_1.BindingInSyntax(binding);\n }\n BindingInWhenOnSyntax.prototype.inRequestScope = function () {\n return this._bindingInSyntax.inRequestScope();\n };\n BindingInWhenOnSyntax.prototype.inSingletonScope = function () {\n return this._bindingInSyntax.inSingletonScope();\n };\n BindingInWhenOnSyntax.prototype.inTransientScope = function () {\n return this._bindingInSyntax.inTransientScope();\n };\n BindingInWhenOnSyntax.prototype.when = function (constraint) {\n return this._bindingWhenSyntax.when(constraint);\n };\n BindingInWhenOnSyntax.prototype.whenTargetNamed = function (name) {\n return this._bindingWhenSyntax.whenTargetNamed(name);\n };\n BindingInWhenOnSyntax.prototype.whenTargetIsDefault = function () {\n return this._bindingWhenSyntax.whenTargetIsDefault();\n };\n BindingInWhenOnSyntax.prototype.whenTargetTagged = function (tag, value) {\n return this._bindingWhenSyntax.whenTargetTagged(tag, value);\n };\n BindingInWhenOnSyntax.prototype.whenInjectedInto = function (parent) {\n return this._bindingWhenSyntax.whenInjectedInto(parent);\n };\n BindingInWhenOnSyntax.prototype.whenParentNamed = function (name) {\n return this._bindingWhenSyntax.whenParentNamed(name);\n };\n BindingInWhenOnSyntax.prototype.whenParentTagged = function (tag, value) {\n return this._bindingWhenSyntax.whenParentTagged(tag, value);\n };\n BindingInWhenOnSyntax.prototype.whenAnyAncestorIs = function (ancestor) {\n return this._bindingWhenSyntax.whenAnyAncestorIs(ancestor);\n };\n BindingInWhenOnSyntax.prototype.whenNoAncestorIs = function (ancestor) {\n return this._bindingWhenSyntax.whenNoAncestorIs(ancestor);\n };\n BindingInWhenOnSyntax.prototype.whenAnyAncestorNamed = function (name) {\n return this._bindingWhenSyntax.whenAnyAncestorNamed(name);\n };\n BindingInWhenOnSyntax.prototype.whenAnyAncestorTagged = function (tag, value) {\n return this._bindingWhenSyntax.whenAnyAncestorTagged(tag, value);\n };\n BindingInWhenOnSyntax.prototype.whenNoAncestorNamed = function (name) {\n return this._bindingWhenSyntax.whenNoAncestorNamed(name);\n };\n BindingInWhenOnSyntax.prototype.whenNoAncestorTagged = function (tag, value) {\n return this._bindingWhenSyntax.whenNoAncestorTagged(tag, value);\n };\n BindingInWhenOnSyntax.prototype.whenAnyAncestorMatches = function (constraint) {\n return this._bindingWhenSyntax.whenAnyAncestorMatches(constraint);\n };\n BindingInWhenOnSyntax.prototype.whenNoAncestorMatches = function (constraint) {\n return this._bindingWhenSyntax.whenNoAncestorMatches(constraint);\n };\n BindingInWhenOnSyntax.prototype.onActivation = function (handler) {\n return this._bindingOnSyntax.onActivation(handler);\n };\n return BindingInWhenOnSyntax;\n}());\nexports.BindingInWhenOnSyntax = BindingInWhenOnSyntax;\n//# sourceMappingURL=binding_in_when_on_syntax.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaW52ZXJzaWZ5L2xpYi9zeW50YXgvYmluZGluZ19pbl93aGVuX29uX3N5bnRheC5qcz8wZmQ5Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFhO0FBQ2IsOENBQThDLGNBQWM7QUFDNUQ7QUFDQSwwQkFBMEIsbUJBQU8sQ0FBQyxHQUFxQjtBQUN2RCwwQkFBMEIsbUJBQU8sQ0FBQyxHQUFxQjtBQUN2RCw0QkFBNEIsbUJBQU8sQ0FBQyxHQUF1QjtBQUMzRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0EiLCJmaWxlIjoiNTE0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkJpbmRpbmdJbldoZW5PblN5bnRheCA9IHZvaWQgMDtcbnZhciBiaW5kaW5nX2luX3N5bnRheF8xID0gcmVxdWlyZShcIi4vYmluZGluZ19pbl9zeW50YXhcIik7XG52YXIgYmluZGluZ19vbl9zeW50YXhfMSA9IHJlcXVpcmUoXCIuL2JpbmRpbmdfb25fc3ludGF4XCIpO1xudmFyIGJpbmRpbmdfd2hlbl9zeW50YXhfMSA9IHJlcXVpcmUoXCIuL2JpbmRpbmdfd2hlbl9zeW50YXhcIik7XG52YXIgQmluZGluZ0luV2hlbk9uU3ludGF4ID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBCaW5kaW5nSW5XaGVuT25TeW50YXgoYmluZGluZykge1xuICAgICAgICB0aGlzLl9iaW5kaW5nID0gYmluZGluZztcbiAgICAgICAgdGhpcy5fYmluZGluZ1doZW5TeW50YXggPSBuZXcgYmluZGluZ193aGVuX3N5bnRheF8xLkJpbmRpbmdXaGVuU3ludGF4KHRoaXMuX2JpbmRpbmcpO1xuICAgICAgICB0aGlzLl9iaW5kaW5nT25TeW50YXggPSBuZXcgYmluZGluZ19vbl9zeW50YXhfMS5CaW5kaW5nT25TeW50YXgodGhpcy5fYmluZGluZyk7XG4gICAgICAgIHRoaXMuX2JpbmRpbmdJblN5bnRheCA9IG5ldyBiaW5kaW5nX2luX3N5bnRheF8xLkJpbmRpbmdJblN5bnRheChiaW5kaW5nKTtcbiAgICB9XG4gICAgQmluZGluZ0luV2hlbk9uU3ludGF4LnByb3RvdHlwZS5pblJlcXVlc3RTY29wZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2JpbmRpbmdJblN5bnRheC5pblJlcXVlc3RTY29wZSgpO1xuICAgIH07XG4gICAgQmluZGluZ0luV2hlbk9uU3ludGF4LnByb3RvdHlwZS5pblNpbmdsZXRvblNjb3BlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYmluZGluZ0luU3ludGF4LmluU2luZ2xldG9uU2NvcGUoKTtcbiAgICB9O1xuICAgIEJpbmRpbmdJbldoZW5PblN5bnRheC5wcm90b3R5cGUuaW5UcmFuc2llbnRTY29wZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2JpbmRpbmdJblN5bnRheC5pblRyYW5zaWVudFNjb3BlKCk7XG4gICAgfTtcbiAgICBCaW5kaW5nSW5XaGVuT25TeW50YXgucHJvdG90eXBlLndoZW4gPSBmdW5jdGlvbiAoY29uc3RyYWludCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYmluZGluZ1doZW5TeW50YXgud2hlbihjb25zdHJhaW50KTtcbiAgICB9O1xuICAgIEJpbmRpbmdJbldoZW5PblN5bnRheC5wcm90b3R5cGUud2hlblRhcmdldE5hbWVkID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2JpbmRpbmdXaGVuU3ludGF4LndoZW5UYXJnZXROYW1lZChuYW1lKTtcbiAgICB9O1xuICAgIEJpbmRpbmdJbldoZW5PblN5bnRheC5wcm90b3R5cGUud2hlblRhcmdldElzRGVmYXVsdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2JpbmRpbmdXaGVuU3ludGF4LndoZW5UYXJnZXRJc0RlZmF1bHQoKTtcbiAgICB9O1xuICAgIEJpbmRpbmdJbldoZW5PblN5bnRheC5wcm90b3R5cGUud2hlblRhcmdldFRhZ2dlZCA9IGZ1bmN0aW9uICh0YWcsIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9iaW5kaW5nV2hlblN5bnRheC53aGVuVGFyZ2V0VGFnZ2VkKHRhZywgdmFsdWUpO1xuICAgIH07XG4gICAgQmluZGluZ0luV2hlbk9uU3ludGF4LnByb3RvdHlwZS53aGVuSW5qZWN0ZWRJbnRvID0gZnVuY3Rpb24gKHBhcmVudCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYmluZGluZ1doZW5TeW50YXgud2hlbkluamVjdGVkSW50byhwYXJlbnQpO1xuICAgIH07XG4gICAgQmluZGluZ0luV2hlbk9uU3ludGF4LnByb3RvdHlwZS53aGVuUGFyZW50TmFtZWQgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYmluZGluZ1doZW5TeW50YXgud2hlblBhcmVudE5hbWVkKG5hbWUpO1xuICAgIH07XG4gICAgQmluZGluZ0luV2hlbk9uU3ludGF4LnByb3RvdHlwZS53aGVuUGFyZW50VGFnZ2VkID0gZnVuY3Rpb24gKHRhZywgdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2JpbmRpbmdXaGVuU3ludGF4LndoZW5QYXJlbnRUYWdnZWQodGFnLCB2YWx1ZSk7XG4gICAgfTtcbiAgICBCaW5kaW5nSW5XaGVuT25TeW50YXgucHJvdG90eXBlLndoZW5BbnlBbmNlc3RvcklzID0gZnVuY3Rpb24gKGFuY2VzdG9yKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9iaW5kaW5nV2hlblN5bnRheC53aGVuQW55QW5jZXN0b3JJcyhhbmNlc3Rvcik7XG4gICAgfTtcbiAgICBCaW5kaW5nSW5XaGVuT25TeW50YXgucHJvdG90eXBlLndoZW5Ob0FuY2VzdG9ySXMgPSBmdW5jdGlvbiAoYW5jZXN0b3IpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2JpbmRpbmdXaGVuU3ludGF4LndoZW5Ob0FuY2VzdG9ySXMoYW5jZXN0b3IpO1xuICAgIH07XG4gICAgQmluZGluZ0luV2hlbk9uU3ludGF4LnByb3RvdHlwZS53aGVuQW55QW5jZXN0b3JOYW1lZCA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9iaW5kaW5nV2hlblN5bnRheC53aGVuQW55QW5jZXN0b3JOYW1lZChuYW1lKTtcbiAgICB9O1xuICAgIEJpbmRpbmdJbldoZW5PblN5bnRheC5wcm90b3R5cGUud2hlbkFueUFuY2VzdG9yVGFnZ2VkID0gZnVuY3Rpb24gKHRhZywgdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2JpbmRpbmdXaGVuU3ludGF4LndoZW5BbnlBbmNlc3RvclRhZ2dlZCh0YWcsIHZhbHVlKTtcbiAgICB9O1xuICAgIEJpbmRpbmdJbldoZW5PblN5bnRheC5wcm90b3R5cGUud2hlbk5vQW5jZXN0b3JOYW1lZCA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9iaW5kaW5nV2hlblN5bnRheC53aGVuTm9BbmNlc3Rvck5hbWVkKG5hbWUpO1xuICAgIH07XG4gICAgQmluZGluZ0luV2hlbk9uU3ludGF4LnByb3RvdHlwZS53aGVuTm9BbmNlc3RvclRhZ2dlZCA9IGZ1bmN0aW9uICh0YWcsIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9iaW5kaW5nV2hlblN5bnRheC53aGVuTm9BbmNlc3RvclRhZ2dlZCh0YWcsIHZhbHVlKTtcbiAgICB9O1xuICAgIEJpbmRpbmdJbldoZW5PblN5bnRheC5wcm90b3R5cGUud2hlbkFueUFuY2VzdG9yTWF0Y2hlcyA9IGZ1bmN0aW9uIChjb25zdHJhaW50KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9iaW5kaW5nV2hlblN5bnRheC53aGVuQW55QW5jZXN0b3JNYXRjaGVzKGNvbnN0cmFpbnQpO1xuICAgIH07XG4gICAgQmluZGluZ0luV2hlbk9uU3ludGF4LnByb3RvdHlwZS53aGVuTm9BbmNlc3Rvck1hdGNoZXMgPSBmdW5jdGlvbiAoY29uc3RyYWludCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYmluZGluZ1doZW5TeW50YXgud2hlbk5vQW5jZXN0b3JNYXRjaGVzKGNvbnN0cmFpbnQpO1xuICAgIH07XG4gICAgQmluZGluZ0luV2hlbk9uU3ludGF4LnByb3RvdHlwZS5vbkFjdGl2YXRpb24gPSBmdW5jdGlvbiAoaGFuZGxlcikge1xuICAgICAgICByZXR1cm4gdGhpcy5fYmluZGluZ09uU3ludGF4Lm9uQWN0aXZhdGlvbihoYW5kbGVyKTtcbiAgICB9O1xuICAgIHJldHVybiBCaW5kaW5nSW5XaGVuT25TeW50YXg7XG59KCkpO1xuZXhwb3J0cy5CaW5kaW5nSW5XaGVuT25TeW50YXggPSBCaW5kaW5nSW5XaGVuT25TeW50YXg7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1iaW5kaW5nX2luX3doZW5fb25fc3ludGF4LmpzLm1hcCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///514\n')},function(module,exports,__webpack_require__){"use strict";eval('\nObject.defineProperty(exports, "__esModule", { value: true });\nexports.BindingInSyntax = void 0;\nvar literal_types_1 = __webpack_require__(56);\nvar binding_when_on_syntax_1 = __webpack_require__(246);\nvar BindingInSyntax = (function () {\n function BindingInSyntax(binding) {\n this._binding = binding;\n }\n BindingInSyntax.prototype.inRequestScope = function () {\n this._binding.scope = literal_types_1.BindingScopeEnum.Request;\n return new binding_when_on_syntax_1.BindingWhenOnSyntax(this._binding);\n };\n BindingInSyntax.prototype.inSingletonScope = function () {\n this._binding.scope = literal_types_1.BindingScopeEnum.Singleton;\n return new binding_when_on_syntax_1.BindingWhenOnSyntax(this._binding);\n };\n BindingInSyntax.prototype.inTransientScope = function () {\n this._binding.scope = literal_types_1.BindingScopeEnum.Transient;\n return new binding_when_on_syntax_1.BindingWhenOnSyntax(this._binding);\n };\n return BindingInSyntax;\n}());\nexports.BindingInSyntax = BindingInSyntax;\n//# sourceMappingURL=binding_in_syntax.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaW52ZXJzaWZ5L2xpYi9zeW50YXgvYmluZGluZ19pbl9zeW50YXguanM/ZTgwMSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBYTtBQUNiLDhDQUE4QyxjQUFjO0FBQzVEO0FBQ0Esc0JBQXNCLG1CQUFPLENBQUMsRUFBNEI7QUFDMUQsK0JBQStCLG1CQUFPLENBQUMsR0FBMEI7QUFDakU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBIiwiZmlsZSI6IjUxNS5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5CaW5kaW5nSW5TeW50YXggPSB2b2lkIDA7XG52YXIgbGl0ZXJhbF90eXBlc18xID0gcmVxdWlyZShcIi4uL2NvbnN0YW50cy9saXRlcmFsX3R5cGVzXCIpO1xudmFyIGJpbmRpbmdfd2hlbl9vbl9zeW50YXhfMSA9IHJlcXVpcmUoXCIuL2JpbmRpbmdfd2hlbl9vbl9zeW50YXhcIik7XG52YXIgQmluZGluZ0luU3ludGF4ID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBCaW5kaW5nSW5TeW50YXgoYmluZGluZykge1xuICAgICAgICB0aGlzLl9iaW5kaW5nID0gYmluZGluZztcbiAgICB9XG4gICAgQmluZGluZ0luU3ludGF4LnByb3RvdHlwZS5pblJlcXVlc3RTY29wZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fYmluZGluZy5zY29wZSA9IGxpdGVyYWxfdHlwZXNfMS5CaW5kaW5nU2NvcGVFbnVtLlJlcXVlc3Q7XG4gICAgICAgIHJldHVybiBuZXcgYmluZGluZ193aGVuX29uX3N5bnRheF8xLkJpbmRpbmdXaGVuT25TeW50YXgodGhpcy5fYmluZGluZyk7XG4gICAgfTtcbiAgICBCaW5kaW5nSW5TeW50YXgucHJvdG90eXBlLmluU2luZ2xldG9uU2NvcGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX2JpbmRpbmcuc2NvcGUgPSBsaXRlcmFsX3R5cGVzXzEuQmluZGluZ1Njb3BlRW51bS5TaW5nbGV0b247XG4gICAgICAgIHJldHVybiBuZXcgYmluZGluZ193aGVuX29uX3N5bnRheF8xLkJpbmRpbmdXaGVuT25TeW50YXgodGhpcy5fYmluZGluZyk7XG4gICAgfTtcbiAgICBCaW5kaW5nSW5TeW50YXgucHJvdG90eXBlLmluVHJhbnNpZW50U2NvcGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX2JpbmRpbmcuc2NvcGUgPSBsaXRlcmFsX3R5cGVzXzEuQmluZGluZ1Njb3BlRW51bS5UcmFuc2llbnQ7XG4gICAgICAgIHJldHVybiBuZXcgYmluZGluZ193aGVuX29uX3N5bnRheF8xLkJpbmRpbmdXaGVuT25TeW50YXgodGhpcy5fYmluZGluZyk7XG4gICAgfTtcbiAgICByZXR1cm4gQmluZGluZ0luU3ludGF4O1xufSgpKTtcbmV4cG9ydHMuQmluZGluZ0luU3ludGF4ID0gQmluZGluZ0luU3ludGF4O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YmluZGluZ19pbl9zeW50YXguanMubWFwIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///515\n')},function(module,exports,__webpack_require__){"use strict";eval('\nObject.defineProperty(exports, "__esModule", { value: true });\nexports.ContainerSnapshot = void 0;\nvar ContainerSnapshot = (function () {\n function ContainerSnapshot() {\n }\n ContainerSnapshot.of = function (bindings, middleware) {\n var snapshot = new ContainerSnapshot();\n snapshot.bindings = bindings;\n snapshot.middleware = middleware;\n return snapshot;\n };\n return ContainerSnapshot;\n}());\nexports.ContainerSnapshot = ContainerSnapshot;\n//# sourceMappingURL=container_snapshot.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaW52ZXJzaWZ5L2xpYi9jb250YWluZXIvY29udGFpbmVyX3NuYXBzaG90LmpzPzFlOTQiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQWE7QUFDYiw4Q0FBOEMsY0FBYztBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0EiLCJmaWxlIjoiNTE2LmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkNvbnRhaW5lclNuYXBzaG90ID0gdm9pZCAwO1xudmFyIENvbnRhaW5lclNuYXBzaG90ID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBDb250YWluZXJTbmFwc2hvdCgpIHtcbiAgICB9XG4gICAgQ29udGFpbmVyU25hcHNob3Qub2YgPSBmdW5jdGlvbiAoYmluZGluZ3MsIG1pZGRsZXdhcmUpIHtcbiAgICAgICAgdmFyIHNuYXBzaG90ID0gbmV3IENvbnRhaW5lclNuYXBzaG90KCk7XG4gICAgICAgIHNuYXBzaG90LmJpbmRpbmdzID0gYmluZGluZ3M7XG4gICAgICAgIHNuYXBzaG90Lm1pZGRsZXdhcmUgPSBtaWRkbGV3YXJlO1xuICAgICAgICByZXR1cm4gc25hcHNob3Q7XG4gICAgfTtcbiAgICByZXR1cm4gQ29udGFpbmVyU25hcHNob3Q7XG59KCkpO1xuZXhwb3J0cy5Db250YWluZXJTbmFwc2hvdCA9IENvbnRhaW5lclNuYXBzaG90O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29udGFpbmVyX3NuYXBzaG90LmpzLm1hcCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///516\n')},function(module,exports,__webpack_require__){"use strict";eval('\nObject.defineProperty(exports, "__esModule", { value: true });\nexports.Lookup = void 0;\nvar ERROR_MSGS = __webpack_require__(40);\nvar Lookup = (function () {\n function Lookup() {\n this._map = new Map();\n }\n Lookup.prototype.getMap = function () {\n return this._map;\n };\n Lookup.prototype.add = function (serviceIdentifier, value) {\n if (serviceIdentifier === null || serviceIdentifier === undefined) {\n throw new Error(ERROR_MSGS.NULL_ARGUMENT);\n }\n if (value === null || value === undefined) {\n throw new Error(ERROR_MSGS.NULL_ARGUMENT);\n }\n var entry = this._map.get(serviceIdentifier);\n if (entry !== undefined) {\n entry.push(value);\n this._map.set(serviceIdentifier, entry);\n }\n else {\n this._map.set(serviceIdentifier, [value]);\n }\n };\n Lookup.prototype.get = function (serviceIdentifier) {\n if (serviceIdentifier === null || serviceIdentifier === undefined) {\n throw new Error(ERROR_MSGS.NULL_ARGUMENT);\n }\n var entry = this._map.get(serviceIdentifier);\n if (entry !== undefined) {\n return entry;\n }\n else {\n throw new Error(ERROR_MSGS.KEY_NOT_FOUND);\n }\n };\n Lookup.prototype.remove = function (serviceIdentifier) {\n if (serviceIdentifier === null || serviceIdentifier === undefined) {\n throw new Error(ERROR_MSGS.NULL_ARGUMENT);\n }\n if (!this._map.delete(serviceIdentifier)) {\n throw new Error(ERROR_MSGS.KEY_NOT_FOUND);\n }\n };\n Lookup.prototype.removeByCondition = function (condition) {\n var _this = this;\n this._map.forEach(function (entries, key) {\n var updatedEntries = entries.filter(function (entry) { return !condition(entry); });\n if (updatedEntries.length > 0) {\n _this._map.set(key, updatedEntries);\n }\n else {\n _this._map.delete(key);\n }\n });\n };\n Lookup.prototype.hasKey = function (serviceIdentifier) {\n if (serviceIdentifier === null || serviceIdentifier === undefined) {\n throw new Error(ERROR_MSGS.NULL_ARGUMENT);\n }\n return this._map.has(serviceIdentifier);\n };\n Lookup.prototype.clone = function () {\n var copy = new Lookup();\n this._map.forEach(function (value, key) {\n value.forEach(function (b) { return copy.add(key, b.clone()); });\n });\n return copy;\n };\n Lookup.prototype.traverse = function (func) {\n this._map.forEach(function (value, key) {\n func(key, value);\n });\n };\n return Lookup;\n}());\nexports.Lookup = Lookup;\n//# sourceMappingURL=lookup.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaW52ZXJzaWZ5L2xpYi9jb250YWluZXIvbG9va3VwLmpzPzAzMDAiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQWE7QUFDYiw4Q0FBOEMsY0FBYztBQUM1RDtBQUNBLGlCQUFpQixtQkFBTyxDQUFDLEVBQXlCO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0VBQWtFLDBCQUEwQixFQUFFO0FBQzlGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QyxpQ0FBaUMsRUFBRTtBQUMzRSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0EiLCJmaWxlIjoiNTE3LmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkxvb2t1cCA9IHZvaWQgMDtcbnZhciBFUlJPUl9NU0dTID0gcmVxdWlyZShcIi4uL2NvbnN0YW50cy9lcnJvcl9tc2dzXCIpO1xudmFyIExvb2t1cCA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gTG9va3VwKCkge1xuICAgICAgICB0aGlzLl9tYXAgPSBuZXcgTWFwKCk7XG4gICAgfVxuICAgIExvb2t1cC5wcm90b3R5cGUuZ2V0TWFwID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWFwO1xuICAgIH07XG4gICAgTG9va3VwLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAoc2VydmljZUlkZW50aWZpZXIsIHZhbHVlKSB7XG4gICAgICAgIGlmIChzZXJ2aWNlSWRlbnRpZmllciA9PT0gbnVsbCB8fCBzZXJ2aWNlSWRlbnRpZmllciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoRVJST1JfTVNHUy5OVUxMX0FSR1VNRU5UKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKEVSUk9SX01TR1MuTlVMTF9BUkdVTUVOVCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy5fbWFwLmdldChzZXJ2aWNlSWRlbnRpZmllcik7XG4gICAgICAgIGlmIChlbnRyeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBlbnRyeS5wdXNoKHZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMuX21hcC5zZXQoc2VydmljZUlkZW50aWZpZXIsIGVudHJ5KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX21hcC5zZXQoc2VydmljZUlkZW50aWZpZXIsIFt2YWx1ZV0pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBMb29rdXAucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChzZXJ2aWNlSWRlbnRpZmllcikge1xuICAgICAgICBpZiAoc2VydmljZUlkZW50aWZpZXIgPT09IG51bGwgfHwgc2VydmljZUlkZW50aWZpZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKEVSUk9SX01TR1MuTlVMTF9BUkdVTUVOVCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy5fbWFwLmdldChzZXJ2aWNlSWRlbnRpZmllcik7XG4gICAgICAgIGlmIChlbnRyeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZW50cnk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoRVJST1JfTVNHUy5LRVlfTk9UX0ZPVU5EKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgTG9va3VwLnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiAoc2VydmljZUlkZW50aWZpZXIpIHtcbiAgICAgICAgaWYgKHNlcnZpY2VJZGVudGlmaWVyID09PSBudWxsIHx8IHNlcnZpY2VJZGVudGlmaWVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihFUlJPUl9NU0dTLk5VTExfQVJHVU1FTlQpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5fbWFwLmRlbGV0ZShzZXJ2aWNlSWRlbnRpZmllcikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihFUlJPUl9NU0dTLktFWV9OT1RfRk9VTkQpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBMb29rdXAucHJvdG90eXBlLnJlbW92ZUJ5Q29uZGl0aW9uID0gZnVuY3Rpb24gKGNvbmRpdGlvbikge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB0aGlzLl9tYXAuZm9yRWFjaChmdW5jdGlvbiAoZW50cmllcywga2V5KSB7XG4gICAgICAgICAgICB2YXIgdXBkYXRlZEVudHJpZXMgPSBlbnRyaWVzLmZpbHRlcihmdW5jdGlvbiAoZW50cnkpIHsgcmV0dXJuICFjb25kaXRpb24oZW50cnkpOyB9KTtcbiAgICAgICAgICAgIGlmICh1cGRhdGVkRW50cmllcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMuX21hcC5zZXQoa2V5LCB1cGRhdGVkRW50cmllcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5fbWFwLmRlbGV0ZShrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIExvb2t1cC5wcm90b3R5cGUuaGFzS2V5ID0gZnVuY3Rpb24gKHNlcnZpY2VJZGVudGlmaWVyKSB7XG4gICAgICAgIGlmIChzZXJ2aWNlSWRlbnRpZmllciA9PT0gbnVsbCB8fCBzZXJ2aWNlSWRlbnRpZmllciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoRVJST1JfTVNHUy5OVUxMX0FSR1VNRU5UKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fbWFwLmhhcyhzZXJ2aWNlSWRlbnRpZmllcik7XG4gICAgfTtcbiAgICBMb29rdXAucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgY29weSA9IG5ldyBMb29rdXAoKTtcbiAgICAgICAgdGhpcy5fbWFwLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHtcbiAgICAgICAgICAgIHZhbHVlLmZvckVhY2goZnVuY3Rpb24gKGIpIHsgcmV0dXJuIGNvcHkuYWRkKGtleSwgYi5jbG9uZSgpKTsgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gY29weTtcbiAgICB9O1xuICAgIExvb2t1cC5wcm90b3R5cGUudHJhdmVyc2UgPSBmdW5jdGlvbiAoZnVuYykge1xuICAgICAgICB0aGlzLl9tYXAuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUsIGtleSkge1xuICAgICAgICAgICAgZnVuYyhrZXksIHZhbHVlKTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gTG9va3VwO1xufSgpKTtcbmV4cG9ydHMuTG9va3VwID0gTG9va3VwO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bG9va3VwLmpzLm1hcCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///517\n')},function(module,exports,__webpack_require__){"use strict";eval('\nObject.defineProperty(exports, "__esModule", { value: true });\nexports.AsyncContainerModule = exports.ContainerModule = void 0;\nvar id_1 = __webpack_require__(68);\nvar ContainerModule = (function () {\n function ContainerModule(registry) {\n this.id = id_1.id();\n this.registry = registry;\n }\n return ContainerModule;\n}());\nexports.ContainerModule = ContainerModule;\nvar AsyncContainerModule = (function () {\n function AsyncContainerModule(registry) {\n this.id = id_1.id();\n this.registry = registry;\n }\n return AsyncContainerModule;\n}());\nexports.AsyncContainerModule = AsyncContainerModule;\n//# sourceMappingURL=container_module.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaW52ZXJzaWZ5L2xpYi9jb250YWluZXIvY29udGFpbmVyX21vZHVsZS5qcz83NzFjIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFhO0FBQ2IsOENBQThDLGNBQWM7QUFDNUQ7QUFDQSxXQUFXLG1CQUFPLENBQUMsRUFBYTtBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQSIsImZpbGUiOiI1MTguanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuQXN5bmNDb250YWluZXJNb2R1bGUgPSBleHBvcnRzLkNvbnRhaW5lck1vZHVsZSA9IHZvaWQgMDtcbnZhciBpZF8xID0gcmVxdWlyZShcIi4uL3V0aWxzL2lkXCIpO1xudmFyIENvbnRhaW5lck1vZHVsZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQ29udGFpbmVyTW9kdWxlKHJlZ2lzdHJ5KSB7XG4gICAgICAgIHRoaXMuaWQgPSBpZF8xLmlkKCk7XG4gICAgICAgIHRoaXMucmVnaXN0cnkgPSByZWdpc3RyeTtcbiAgICB9XG4gICAgcmV0dXJuIENvbnRhaW5lck1vZHVsZTtcbn0oKSk7XG5leHBvcnRzLkNvbnRhaW5lck1vZHVsZSA9IENvbnRhaW5lck1vZHVsZTtcbnZhciBBc3luY0NvbnRhaW5lck1vZHVsZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQXN5bmNDb250YWluZXJNb2R1bGUocmVnaXN0cnkpIHtcbiAgICAgICAgdGhpcy5pZCA9IGlkXzEuaWQoKTtcbiAgICAgICAgdGhpcy5yZWdpc3RyeSA9IHJlZ2lzdHJ5O1xuICAgIH1cbiAgICByZXR1cm4gQXN5bmNDb250YWluZXJNb2R1bGU7XG59KCkpO1xuZXhwb3J0cy5Bc3luY0NvbnRhaW5lck1vZHVsZSA9IEFzeW5jQ29udGFpbmVyTW9kdWxlO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29udGFpbmVyX21vZHVsZS5qcy5tYXAiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///518\n')},function(module,exports,__webpack_require__){"use strict";eval('\nObject.defineProperty(exports, "__esModule", { value: true });\nexports.injectable = void 0;\nvar ERRORS_MSGS = __webpack_require__(40);\nvar METADATA_KEY = __webpack_require__(32);\nfunction injectable() {\n return function (target) {\n if (Reflect.hasOwnMetadata(METADATA_KEY.PARAM_TYPES, target)) {\n throw new Error(ERRORS_MSGS.DUPLICATED_INJECTABLE_DECORATOR);\n }\n var types = Reflect.getMetadata(METADATA_KEY.DESIGN_PARAM_TYPES, target) || [];\n Reflect.defineMetadata(METADATA_KEY.PARAM_TYPES, types, target);\n return target;\n };\n}\nexports.injectable = injectable;\n//# sourceMappingURL=injectable.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaW52ZXJzaWZ5L2xpYi9hbm5vdGF0aW9uL2luamVjdGFibGUuanM/NzE5ZSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBYTtBQUNiLDhDQUE4QyxjQUFjO0FBQzVEO0FBQ0Esa0JBQWtCLG1CQUFPLENBQUMsRUFBeUI7QUFDbkQsbUJBQW1CLG1CQUFPLENBQUMsRUFBNEI7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6IjUxOS5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5pbmplY3RhYmxlID0gdm9pZCAwO1xudmFyIEVSUk9SU19NU0dTID0gcmVxdWlyZShcIi4uL2NvbnN0YW50cy9lcnJvcl9tc2dzXCIpO1xudmFyIE1FVEFEQVRBX0tFWSA9IHJlcXVpcmUoXCIuLi9jb25zdGFudHMvbWV0YWRhdGFfa2V5c1wiKTtcbmZ1bmN0aW9uIGluamVjdGFibGUoKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICAgICAgaWYgKFJlZmxlY3QuaGFzT3duTWV0YWRhdGEoTUVUQURBVEFfS0VZLlBBUkFNX1RZUEVTLCB0YXJnZXQpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoRVJST1JTX01TR1MuRFVQTElDQVRFRF9JTkpFQ1RBQkxFX0RFQ09SQVRPUik7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHR5cGVzID0gUmVmbGVjdC5nZXRNZXRhZGF0YShNRVRBREFUQV9LRVkuREVTSUdOX1BBUkFNX1RZUEVTLCB0YXJnZXQpIHx8IFtdO1xuICAgICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKE1FVEFEQVRBX0tFWS5QQVJBTV9UWVBFUywgdHlwZXMsIHRhcmdldCk7XG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfTtcbn1cbmV4cG9ydHMuaW5qZWN0YWJsZSA9IGluamVjdGFibGU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmplY3RhYmxlLmpzLm1hcCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///519\n')},function(module,exports,__webpack_require__){"use strict";eval('\nObject.defineProperty(exports, "__esModule", { value: true });\nexports.tagged = void 0;\nvar metadata_1 = __webpack_require__(48);\nvar decorator_utils_1 = __webpack_require__(60);\nfunction tagged(metadataKey, metadataValue) {\n return function (target, targetKey, index) {\n var metadata = new metadata_1.Metadata(metadataKey, metadataValue);\n if (typeof index === "number") {\n decorator_utils_1.tagParameter(target, targetKey, index, metadata);\n }\n else {\n decorator_utils_1.tagProperty(target, targetKey, metadata);\n }\n };\n}\nexports.tagged = tagged;\n//# sourceMappingURL=tagged.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaW52ZXJzaWZ5L2xpYi9hbm5vdGF0aW9uL3RhZ2dlZC5qcz9kMjA0Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFhO0FBQ2IsOENBQThDLGNBQWM7QUFDNUQ7QUFDQSxpQkFBaUIsbUJBQU8sQ0FBQyxFQUFzQjtBQUMvQyx3QkFBd0IsbUJBQU8sQ0FBQyxFQUFtQjtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiI1MjAuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMudGFnZ2VkID0gdm9pZCAwO1xudmFyIG1ldGFkYXRhXzEgPSByZXF1aXJlKFwiLi4vcGxhbm5pbmcvbWV0YWRhdGFcIik7XG52YXIgZGVjb3JhdG9yX3V0aWxzXzEgPSByZXF1aXJlKFwiLi9kZWNvcmF0b3JfdXRpbHNcIik7XG5mdW5jdGlvbiB0YWdnZWQobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwgdGFyZ2V0S2V5LCBpbmRleCkge1xuICAgICAgICB2YXIgbWV0YWRhdGEgPSBuZXcgbWV0YWRhdGFfMS5NZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSk7XG4gICAgICAgIGlmICh0eXBlb2YgaW5kZXggPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgIGRlY29yYXRvcl91dGlsc18xLnRhZ1BhcmFtZXRlcih0YXJnZXQsIHRhcmdldEtleSwgaW5kZXgsIG1ldGFkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGRlY29yYXRvcl91dGlsc18xLnRhZ1Byb3BlcnR5KHRhcmdldCwgdGFyZ2V0S2V5LCBtZXRhZGF0YSk7XG4gICAgICAgIH1cbiAgICB9O1xufVxuZXhwb3J0cy50YWdnZWQgPSB0YWdnZWQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD10YWdnZWQuanMubWFwIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///520\n')},function(module,exports,__webpack_require__){"use strict";eval('\nObject.defineProperty(exports, "__esModule", { value: true });\nexports.named = void 0;\nvar METADATA_KEY = __webpack_require__(32);\nvar metadata_1 = __webpack_require__(48);\nvar decorator_utils_1 = __webpack_require__(60);\nfunction named(name) {\n return function (target, targetKey, index) {\n var metadata = new metadata_1.Metadata(METADATA_KEY.NAMED_TAG, name);\n if (typeof index === "number") {\n decorator_utils_1.tagParameter(target, targetKey, index, metadata);\n }\n else {\n decorator_utils_1.tagProperty(target, targetKey, metadata);\n }\n };\n}\nexports.named = named;\n//# sourceMappingURL=named.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaW52ZXJzaWZ5L2xpYi9hbm5vdGF0aW9uL25hbWVkLmpzPzY3MzAiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQWE7QUFDYiw4Q0FBOEMsY0FBYztBQUM1RDtBQUNBLG1CQUFtQixtQkFBTyxDQUFDLEVBQTRCO0FBQ3ZELGlCQUFpQixtQkFBTyxDQUFDLEVBQXNCO0FBQy9DLHdCQUF3QixtQkFBTyxDQUFDLEVBQW1CO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6IjUyMS5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5uYW1lZCA9IHZvaWQgMDtcbnZhciBNRVRBREFUQV9LRVkgPSByZXF1aXJlKFwiLi4vY29uc3RhbnRzL21ldGFkYXRhX2tleXNcIik7XG52YXIgbWV0YWRhdGFfMSA9IHJlcXVpcmUoXCIuLi9wbGFubmluZy9tZXRhZGF0YVwiKTtcbnZhciBkZWNvcmF0b3JfdXRpbHNfMSA9IHJlcXVpcmUoXCIuL2RlY29yYXRvcl91dGlsc1wiKTtcbmZ1bmN0aW9uIG5hbWVkKG5hbWUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwgdGFyZ2V0S2V5LCBpbmRleCkge1xuICAgICAgICB2YXIgbWV0YWRhdGEgPSBuZXcgbWV0YWRhdGFfMS5NZXRhZGF0YShNRVRBREFUQV9LRVkuTkFNRURfVEFHLCBuYW1lKTtcbiAgICAgICAgaWYgKHR5cGVvZiBpbmRleCA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgZGVjb3JhdG9yX3V0aWxzXzEudGFnUGFyYW1ldGVyKHRhcmdldCwgdGFyZ2V0S2V5LCBpbmRleCwgbWV0YWRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZGVjb3JhdG9yX3V0aWxzXzEudGFnUHJvcGVydHkodGFyZ2V0LCB0YXJnZXRLZXksIG1ldGFkYXRhKTtcbiAgICAgICAgfVxuICAgIH07XG59XG5leHBvcnRzLm5hbWVkID0gbmFtZWQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1uYW1lZC5qcy5tYXAiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///521\n')},function(module,exports,__webpack_require__){"use strict";eval('\nObject.defineProperty(exports, "__esModule", { value: true });\nexports.optional = void 0;\nvar METADATA_KEY = __webpack_require__(32);\nvar metadata_1 = __webpack_require__(48);\nvar decorator_utils_1 = __webpack_require__(60);\nfunction optional() {\n return function (target, targetKey, index) {\n var metadata = new metadata_1.Metadata(METADATA_KEY.OPTIONAL_TAG, true);\n if (typeof index === "number") {\n decorator_utils_1.tagParameter(target, targetKey, index, metadata);\n }\n else {\n decorator_utils_1.tagProperty(target, targetKey, metadata);\n }\n };\n}\nexports.optional = optional;\n//# sourceMappingURL=optional.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaW52ZXJzaWZ5L2xpYi9hbm5vdGF0aW9uL29wdGlvbmFsLmpzPzhkOGMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQWE7QUFDYiw4Q0FBOEMsY0FBYztBQUM1RDtBQUNBLG1CQUFtQixtQkFBTyxDQUFDLEVBQTRCO0FBQ3ZELGlCQUFpQixtQkFBTyxDQUFDLEVBQXNCO0FBQy9DLHdCQUF3QixtQkFBTyxDQUFDLEVBQW1CO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6IjUyMi5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5vcHRpb25hbCA9IHZvaWQgMDtcbnZhciBNRVRBREFUQV9LRVkgPSByZXF1aXJlKFwiLi4vY29uc3RhbnRzL21ldGFkYXRhX2tleXNcIik7XG52YXIgbWV0YWRhdGFfMSA9IHJlcXVpcmUoXCIuLi9wbGFubmluZy9tZXRhZGF0YVwiKTtcbnZhciBkZWNvcmF0b3JfdXRpbHNfMSA9IHJlcXVpcmUoXCIuL2RlY29yYXRvcl91dGlsc1wiKTtcbmZ1bmN0aW9uIG9wdGlvbmFsKCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCB0YXJnZXRLZXksIGluZGV4KSB7XG4gICAgICAgIHZhciBtZXRhZGF0YSA9IG5ldyBtZXRhZGF0YV8xLk1ldGFkYXRhKE1FVEFEQVRBX0tFWS5PUFRJT05BTF9UQUcsIHRydWUpO1xuICAgICAgICBpZiAodHlwZW9mIGluZGV4ID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICBkZWNvcmF0b3JfdXRpbHNfMS50YWdQYXJhbWV0ZXIodGFyZ2V0LCB0YXJnZXRLZXksIGluZGV4LCBtZXRhZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBkZWNvcmF0b3JfdXRpbHNfMS50YWdQcm9wZXJ0eSh0YXJnZXQsIHRhcmdldEtleSwgbWV0YWRhdGEpO1xuICAgICAgICB9XG4gICAgfTtcbn1cbmV4cG9ydHMub3B0aW9uYWwgPSBvcHRpb25hbDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW9wdGlvbmFsLmpzLm1hcCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///522\n')},function(module,exports,__webpack_require__){"use strict";eval('\nObject.defineProperty(exports, "__esModule", { value: true });\nexports.unmanaged = void 0;\nvar METADATA_KEY = __webpack_require__(32);\nvar metadata_1 = __webpack_require__(48);\nvar decorator_utils_1 = __webpack_require__(60);\nfunction unmanaged() {\n return function (target, targetKey, index) {\n var metadata = new metadata_1.Metadata(METADATA_KEY.UNMANAGED_TAG, true);\n decorator_utils_1.tagParameter(target, targetKey, index, metadata);\n };\n}\nexports.unmanaged = unmanaged;\n//# sourceMappingURL=unmanaged.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaW52ZXJzaWZ5L2xpYi9hbm5vdGF0aW9uL3VubWFuYWdlZC5qcz85ZjYyIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFhO0FBQ2IsOENBQThDLGNBQWM7QUFDNUQ7QUFDQSxtQkFBbUIsbUJBQU8sQ0FBQyxFQUE0QjtBQUN2RCxpQkFBaUIsbUJBQU8sQ0FBQyxFQUFzQjtBQUMvQyx3QkFBd0IsbUJBQU8sQ0FBQyxFQUFtQjtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6IjUyMy5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy51bm1hbmFnZWQgPSB2b2lkIDA7XG52YXIgTUVUQURBVEFfS0VZID0gcmVxdWlyZShcIi4uL2NvbnN0YW50cy9tZXRhZGF0YV9rZXlzXCIpO1xudmFyIG1ldGFkYXRhXzEgPSByZXF1aXJlKFwiLi4vcGxhbm5pbmcvbWV0YWRhdGFcIik7XG52YXIgZGVjb3JhdG9yX3V0aWxzXzEgPSByZXF1aXJlKFwiLi9kZWNvcmF0b3JfdXRpbHNcIik7XG5mdW5jdGlvbiB1bm1hbmFnZWQoKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIHRhcmdldEtleSwgaW5kZXgpIHtcbiAgICAgICAgdmFyIG1ldGFkYXRhID0gbmV3IG1ldGFkYXRhXzEuTWV0YWRhdGEoTUVUQURBVEFfS0VZLlVOTUFOQUdFRF9UQUcsIHRydWUpO1xuICAgICAgICBkZWNvcmF0b3JfdXRpbHNfMS50YWdQYXJhbWV0ZXIodGFyZ2V0LCB0YXJnZXRLZXksIGluZGV4LCBtZXRhZGF0YSk7XG4gICAgfTtcbn1cbmV4cG9ydHMudW5tYW5hZ2VkID0gdW5tYW5hZ2VkO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dW5tYW5hZ2VkLmpzLm1hcCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///523\n')},function(module,exports,__webpack_require__){"use strict";eval('\nObject.defineProperty(exports, "__esModule", { value: true });\nexports.multiInject = void 0;\nvar METADATA_KEY = __webpack_require__(32);\nvar metadata_1 = __webpack_require__(48);\nvar decorator_utils_1 = __webpack_require__(60);\nfunction multiInject(serviceIdentifier) {\n return function (target, targetKey, index) {\n var metadata = new metadata_1.Metadata(METADATA_KEY.MULTI_INJECT_TAG, serviceIdentifier);\n if (typeof index === "number") {\n decorator_utils_1.tagParameter(target, targetKey, index, metadata);\n }\n else {\n decorator_utils_1.tagProperty(target, targetKey, metadata);\n }\n };\n}\nexports.multiInject = multiInject;\n//# sourceMappingURL=multi_inject.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaW52ZXJzaWZ5L2xpYi9hbm5vdGF0aW9uL211bHRpX2luamVjdC5qcz84Yzg4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFhO0FBQ2IsOENBQThDLGNBQWM7QUFDNUQ7QUFDQSxtQkFBbUIsbUJBQU8sQ0FBQyxFQUE0QjtBQUN2RCxpQkFBaUIsbUJBQU8sQ0FBQyxFQUFzQjtBQUMvQyx3QkFBd0IsbUJBQU8sQ0FBQyxFQUFtQjtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiI1MjQuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMubXVsdGlJbmplY3QgPSB2b2lkIDA7XG52YXIgTUVUQURBVEFfS0VZID0gcmVxdWlyZShcIi4uL2NvbnN0YW50cy9tZXRhZGF0YV9rZXlzXCIpO1xudmFyIG1ldGFkYXRhXzEgPSByZXF1aXJlKFwiLi4vcGxhbm5pbmcvbWV0YWRhdGFcIik7XG52YXIgZGVjb3JhdG9yX3V0aWxzXzEgPSByZXF1aXJlKFwiLi9kZWNvcmF0b3JfdXRpbHNcIik7XG5mdW5jdGlvbiBtdWx0aUluamVjdChzZXJ2aWNlSWRlbnRpZmllcikge1xuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCB0YXJnZXRLZXksIGluZGV4KSB7XG4gICAgICAgIHZhciBtZXRhZGF0YSA9IG5ldyBtZXRhZGF0YV8xLk1ldGFkYXRhKE1FVEFEQVRBX0tFWS5NVUxUSV9JTkpFQ1RfVEFHLCBzZXJ2aWNlSWRlbnRpZmllcik7XG4gICAgICAgIGlmICh0eXBlb2YgaW5kZXggPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgIGRlY29yYXRvcl91dGlsc18xLnRhZ1BhcmFtZXRlcih0YXJnZXQsIHRhcmdldEtleSwgaW5kZXgsIG1ldGFkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGRlY29yYXRvcl91dGlsc18xLnRhZ1Byb3BlcnR5KHRhcmdldCwgdGFyZ2V0S2V5LCBtZXRhZGF0YSk7XG4gICAgICAgIH1cbiAgICB9O1xufVxuZXhwb3J0cy5tdWx0aUluamVjdCA9IG11bHRpSW5qZWN0O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bXVsdGlfaW5qZWN0LmpzLm1hcCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///524\n')},function(module,exports,__webpack_require__){"use strict";eval('\nObject.defineProperty(exports, "__esModule", { value: true });\nexports.targetName = void 0;\nvar METADATA_KEY = __webpack_require__(32);\nvar metadata_1 = __webpack_require__(48);\nvar decorator_utils_1 = __webpack_require__(60);\nfunction targetName(name) {\n return function (target, targetKey, index) {\n var metadata = new metadata_1.Metadata(METADATA_KEY.NAME_TAG, name);\n decorator_utils_1.tagParameter(target, targetKey, index, metadata);\n };\n}\nexports.targetName = targetName;\n//# sourceMappingURL=target_name.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaW52ZXJzaWZ5L2xpYi9hbm5vdGF0aW9uL3RhcmdldF9uYW1lLmpzP2ExYTUiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQWE7QUFDYiw4Q0FBOEMsY0FBYztBQUM1RDtBQUNBLG1CQUFtQixtQkFBTyxDQUFDLEVBQTRCO0FBQ3ZELGlCQUFpQixtQkFBTyxDQUFDLEVBQXNCO0FBQy9DLHdCQUF3QixtQkFBTyxDQUFDLEVBQW1CO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiNTI1LmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnRhcmdldE5hbWUgPSB2b2lkIDA7XG52YXIgTUVUQURBVEFfS0VZID0gcmVxdWlyZShcIi4uL2NvbnN0YW50cy9tZXRhZGF0YV9rZXlzXCIpO1xudmFyIG1ldGFkYXRhXzEgPSByZXF1aXJlKFwiLi4vcGxhbm5pbmcvbWV0YWRhdGFcIik7XG52YXIgZGVjb3JhdG9yX3V0aWxzXzEgPSByZXF1aXJlKFwiLi9kZWNvcmF0b3JfdXRpbHNcIik7XG5mdW5jdGlvbiB0YXJnZXROYW1lKG5hbWUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwgdGFyZ2V0S2V5LCBpbmRleCkge1xuICAgICAgICB2YXIgbWV0YWRhdGEgPSBuZXcgbWV0YWRhdGFfMS5NZXRhZGF0YShNRVRBREFUQV9LRVkuTkFNRV9UQUcsIG5hbWUpO1xuICAgICAgICBkZWNvcmF0b3JfdXRpbHNfMS50YWdQYXJhbWV0ZXIodGFyZ2V0LCB0YXJnZXRLZXksIGluZGV4LCBtZXRhZGF0YSk7XG4gICAgfTtcbn1cbmV4cG9ydHMudGFyZ2V0TmFtZSA9IHRhcmdldE5hbWU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD10YXJnZXRfbmFtZS5qcy5tYXAiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///525\n')},function(module,exports,__webpack_require__){"use strict";eval('\nObject.defineProperty(exports, "__esModule", { value: true });\nexports.postConstruct = void 0;\nvar ERRORS_MSGS = __webpack_require__(40);\nvar METADATA_KEY = __webpack_require__(32);\nvar metadata_1 = __webpack_require__(48);\nfunction postConstruct() {\n return function (target, propertyKey, descriptor) {\n var metadata = new metadata_1.Metadata(METADATA_KEY.POST_CONSTRUCT, propertyKey);\n if (Reflect.hasOwnMetadata(METADATA_KEY.POST_CONSTRUCT, target.constructor)) {\n throw new Error(ERRORS_MSGS.MULTIPLE_POST_CONSTRUCT_METHODS);\n }\n Reflect.defineMetadata(METADATA_KEY.POST_CONSTRUCT, metadata, target.constructor);\n };\n}\nexports.postConstruct = postConstruct;\n//# sourceMappingURL=post_construct.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaW52ZXJzaWZ5L2xpYi9hbm5vdGF0aW9uL3Bvc3RfY29uc3RydWN0LmpzPzRhNGYiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQWE7QUFDYiw4Q0FBOEMsY0FBYztBQUM1RDtBQUNBLGtCQUFrQixtQkFBTyxDQUFDLEVBQXlCO0FBQ25ELG1CQUFtQixtQkFBTyxDQUFDLEVBQTRCO0FBQ3ZELGlCQUFpQixtQkFBTyxDQUFDLEVBQXNCO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiNTI2LmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnBvc3RDb25zdHJ1Y3QgPSB2b2lkIDA7XG52YXIgRVJST1JTX01TR1MgPSByZXF1aXJlKFwiLi4vY29uc3RhbnRzL2Vycm9yX21zZ3NcIik7XG52YXIgTUVUQURBVEFfS0VZID0gcmVxdWlyZShcIi4uL2NvbnN0YW50cy9tZXRhZGF0YV9rZXlzXCIpO1xudmFyIG1ldGFkYXRhXzEgPSByZXF1aXJlKFwiLi4vcGxhbm5pbmcvbWV0YWRhdGFcIik7XG5mdW5jdGlvbiBwb3N0Q29uc3RydWN0KCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCBwcm9wZXJ0eUtleSwgZGVzY3JpcHRvcikge1xuICAgICAgICB2YXIgbWV0YWRhdGEgPSBuZXcgbWV0YWRhdGFfMS5NZXRhZGF0YShNRVRBREFUQV9LRVkuUE9TVF9DT05TVFJVQ1QsIHByb3BlcnR5S2V5KTtcbiAgICAgICAgaWYgKFJlZmxlY3QuaGFzT3duTWV0YWRhdGEoTUVUQURBVEFfS0VZLlBPU1RfQ09OU1RSVUNULCB0YXJnZXQuY29uc3RydWN0b3IpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoRVJST1JTX01TR1MuTVVMVElQTEVfUE9TVF9DT05TVFJVQ1RfTUVUSE9EUyk7XG4gICAgICAgIH1cbiAgICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShNRVRBREFUQV9LRVkuUE9TVF9DT05TVFJVQ1QsIG1ldGFkYXRhLCB0YXJnZXQuY29uc3RydWN0b3IpO1xuICAgIH07XG59XG5leHBvcnRzLnBvc3RDb25zdHJ1Y3QgPSBwb3N0Q29uc3RydWN0O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cG9zdF9jb25zdHJ1Y3QuanMubWFwIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///526\n')},function(module,exports,__webpack_require__){"use strict";eval('\nObject.defineProperty(exports, "__esModule", { value: true });\nexports.multiBindToService = void 0;\nvar multiBindToService = function (container) {\n return function (service) {\n return function () {\n var types = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n types[_i] = arguments[_i];\n }\n return types.forEach(function (t) { return container.bind(t).toService(service); });\n };\n };\n};\nexports.multiBindToService = multiBindToService;\n//# sourceMappingURL=binding_utils.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaW52ZXJzaWZ5L2xpYi91dGlscy9iaW5kaW5nX3V0aWxzLmpzP2VmYzUiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQWE7QUFDYiw4Q0FBOEMsY0FBYztBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLHVCQUF1QjtBQUNuRDtBQUNBO0FBQ0EsK0NBQStDLDZDQUE2QyxFQUFFO0FBQzlGO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiNTI3LmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLm11bHRpQmluZFRvU2VydmljZSA9IHZvaWQgMDtcbnZhciBtdWx0aUJpbmRUb1NlcnZpY2UgPSBmdW5jdGlvbiAoY29udGFpbmVyKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChzZXJ2aWNlKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgdHlwZXMgPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICAgICAgdHlwZXNbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0eXBlcy5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7IHJldHVybiBjb250YWluZXIuYmluZCh0KS50b1NlcnZpY2Uoc2VydmljZSk7IH0pO1xuICAgICAgICB9O1xuICAgIH07XG59O1xuZXhwb3J0cy5tdWx0aUJpbmRUb1NlcnZpY2UgPSBtdWx0aUJpbmRUb1NlcnZpY2U7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1iaW5kaW5nX3V0aWxzLmpzLm1hcCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///527\n')},function(module,exports){eval('function _setPrototypeOf(o, p) {\n module.exports = _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n\n module.exports["default"] = module.exports, module.exports.__esModule = true;\n return _setPrototypeOf(o, p);\n}\n\nmodule.exports = _setPrototypeOf;\nmodule.exports["default"] = module.exports, module.exports.__esModule = true;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9zZXRQcm90b3R5cGVPZi5qcz80YTRiIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EiLCJmaWxlIjoiNTI4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSBfc2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHtcbiAgICBvLl9fcHJvdG9fXyA9IHA7XG4gICAgcmV0dXJuIG87XG4gIH07XG5cbiAgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHMsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuICByZXR1cm4gX3NldFByb3RvdHlwZU9mKG8sIHApO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9zZXRQcm90b3R5cGVPZjtcbm1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///528\n')},function(module,exports,__webpack_require__){"use strict";eval('\nObject.defineProperty(exports, "__esModule", { value: true });\nvar INJECTION = Symbol.for("INJECTION");\nfunction _proxyGetter(proto, key, resolve, doCache) {\n function getter() {\n if (doCache && !Reflect.hasMetadata(INJECTION, this, key)) {\n Reflect.defineMetadata(INJECTION, resolve(), this, key);\n }\n if (Reflect.hasMetadata(INJECTION, this, key)) {\n return Reflect.getMetadata(INJECTION, this, key);\n }\n else {\n return resolve();\n }\n }\n function setter(newVal) {\n Reflect.defineMetadata(INJECTION, newVal, this, key);\n }\n Object.defineProperty(proto, key, {\n configurable: true,\n enumerable: true,\n get: getter,\n set: setter\n });\n}\nfunction makePropertyInjectDecorator(container, doCache) {\n return function (serviceIdentifier) {\n return function (proto, key) {\n var resolve = function () {\n return container.get(serviceIdentifier);\n };\n _proxyGetter(proto, key, resolve, doCache);\n };\n };\n}\nexports.makePropertyInjectDecorator = makePropertyInjectDecorator;\nfunction makePropertyInjectNamedDecorator(container, doCache) {\n return function (serviceIdentifier, named) {\n return function (proto, key) {\n var resolve = function () {\n return container.getNamed(serviceIdentifier, named);\n };\n _proxyGetter(proto, key, resolve, doCache);\n };\n };\n}\nexports.makePropertyInjectNamedDecorator = makePropertyInjectNamedDecorator;\nfunction makePropertyInjectTaggedDecorator(container, doCache) {\n return function (serviceIdentifier, key, value) {\n return function (proto, propertyName) {\n var resolve = function () {\n return container.getTagged(serviceIdentifier, key, value);\n };\n _proxyGetter(proto, propertyName, resolve, doCache);\n };\n };\n}\nexports.makePropertyInjectTaggedDecorator = makePropertyInjectTaggedDecorator;\nfunction makePropertyMultiInjectDecorator(container, doCache) {\n return function (serviceIdentifier) {\n return function (proto, key) {\n var resolve = function () {\n return container.getAll(serviceIdentifier);\n };\n _proxyGetter(proto, key, resolve, doCache);\n };\n };\n}\nexports.makePropertyMultiInjectDecorator = makePropertyMultiInjectDecorator;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaW52ZXJzaWZ5LWluamVjdC1kZWNvcmF0b3JzL2xpYi9kZWNvcmF0b3JzLmpzPzUxY2IiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQWE7QUFDYiw4Q0FBOEMsY0FBYztBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6IjUyOS5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIElOSkVDVElPTiA9IFN5bWJvbC5mb3IoXCJJTkpFQ1RJT05cIik7XG5mdW5jdGlvbiBfcHJveHlHZXR0ZXIocHJvdG8sIGtleSwgcmVzb2x2ZSwgZG9DYWNoZSkge1xuICAgIGZ1bmN0aW9uIGdldHRlcigpIHtcbiAgICAgICAgaWYgKGRvQ2FjaGUgJiYgIVJlZmxlY3QuaGFzTWV0YWRhdGEoSU5KRUNUSU9OLCB0aGlzLCBrZXkpKSB7XG4gICAgICAgICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKElOSkVDVElPTiwgcmVzb2x2ZSgpLCB0aGlzLCBrZXkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChSZWZsZWN0Lmhhc01ldGFkYXRhKElOSkVDVElPTiwgdGhpcywga2V5KSkge1xuICAgICAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0TWV0YWRhdGEoSU5KRUNUSU9OLCB0aGlzLCBrZXkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBzZXR0ZXIobmV3VmFsKSB7XG4gICAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoSU5KRUNUSU9OLCBuZXdWYWwsIHRoaXMsIGtleSk7XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm90bywga2V5LCB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiBnZXR0ZXIsXG4gICAgICAgIHNldDogc2V0dGVyXG4gICAgfSk7XG59XG5mdW5jdGlvbiBtYWtlUHJvcGVydHlJbmplY3REZWNvcmF0b3IoY29udGFpbmVyLCBkb0NhY2hlKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChzZXJ2aWNlSWRlbnRpZmllcikge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHByb3RvLCBrZXkpIHtcbiAgICAgICAgICAgIHZhciByZXNvbHZlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb250YWluZXIuZ2V0KHNlcnZpY2VJZGVudGlmaWVyKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBfcHJveHlHZXR0ZXIocHJvdG8sIGtleSwgcmVzb2x2ZSwgZG9DYWNoZSk7XG4gICAgICAgIH07XG4gICAgfTtcbn1cbmV4cG9ydHMubWFrZVByb3BlcnR5SW5qZWN0RGVjb3JhdG9yID0gbWFrZVByb3BlcnR5SW5qZWN0RGVjb3JhdG9yO1xuZnVuY3Rpb24gbWFrZVByb3BlcnR5SW5qZWN0TmFtZWREZWNvcmF0b3IoY29udGFpbmVyLCBkb0NhY2hlKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChzZXJ2aWNlSWRlbnRpZmllciwgbmFtZWQpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChwcm90bywga2V5KSB7XG4gICAgICAgICAgICB2YXIgcmVzb2x2ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29udGFpbmVyLmdldE5hbWVkKHNlcnZpY2VJZGVudGlmaWVyLCBuYW1lZCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgX3Byb3h5R2V0dGVyKHByb3RvLCBrZXksIHJlc29sdmUsIGRvQ2FjaGUpO1xuICAgICAgICB9O1xuICAgIH07XG59XG5leHBvcnRzLm1ha2VQcm9wZXJ0eUluamVjdE5hbWVkRGVjb3JhdG9yID0gbWFrZVByb3BlcnR5SW5qZWN0TmFtZWREZWNvcmF0b3I7XG5mdW5jdGlvbiBtYWtlUHJvcGVydHlJbmplY3RUYWdnZWREZWNvcmF0b3IoY29udGFpbmVyLCBkb0NhY2hlKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChzZXJ2aWNlSWRlbnRpZmllciwga2V5LCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHByb3RvLCBwcm9wZXJ0eU5hbWUpIHtcbiAgICAgICAgICAgIHZhciByZXNvbHZlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb250YWluZXIuZ2V0VGFnZ2VkKHNlcnZpY2VJZGVudGlmaWVyLCBrZXksIHZhbHVlKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBfcHJveHlHZXR0ZXIocHJvdG8sIHByb3BlcnR5TmFtZSwgcmVzb2x2ZSwgZG9DYWNoZSk7XG4gICAgICAgIH07XG4gICAgfTtcbn1cbmV4cG9ydHMubWFrZVByb3BlcnR5SW5qZWN0VGFnZ2VkRGVjb3JhdG9yID0gbWFrZVByb3BlcnR5SW5qZWN0VGFnZ2VkRGVjb3JhdG9yO1xuZnVuY3Rpb24gbWFrZVByb3BlcnR5TXVsdGlJbmplY3REZWNvcmF0b3IoY29udGFpbmVyLCBkb0NhY2hlKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChzZXJ2aWNlSWRlbnRpZmllcikge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHByb3RvLCBrZXkpIHtcbiAgICAgICAgICAgIHZhciByZXNvbHZlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb250YWluZXIuZ2V0QWxsKHNlcnZpY2VJZGVudGlmaWVyKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBfcHJveHlHZXR0ZXIocHJvdG8sIGtleSwgcmVzb2x2ZSwgZG9DYWNoZSk7XG4gICAgICAgIH07XG4gICAgfTtcbn1cbmV4cG9ydHMubWFrZVByb3BlcnR5TXVsdGlJbmplY3REZWNvcmF0b3IgPSBtYWtlUHJvcGVydHlNdWx0aUluamVjdERlY29yYXRvcjtcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///529\n')},function(module,exports,__webpack_require__){eval('var arrayLikeToArray = __webpack_require__(241);\n\nfunction _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return arrayLikeToArray(arr);\n}\n\nmodule.exports = _arrayWithoutHoles;\nmodule.exports["default"] = module.exports, module.exports.__esModule = true;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hcnJheVdpdGhvdXRIb2xlcy5qcz8yMjM2Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHVCQUF1QixtQkFBTyxDQUFDLEdBQXVCOztBQUV0RDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSIsImZpbGUiOiI1MzAuanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYXJyYXlMaWtlVG9BcnJheSA9IHJlcXVpcmUoXCIuL2FycmF5TGlrZVRvQXJyYXkuanNcIik7XG5cbmZ1bmN0aW9uIF9hcnJheVdpdGhvdXRIb2xlcyhhcnIpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIGFycmF5TGlrZVRvQXJyYXkoYXJyKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfYXJyYXlXaXRob3V0SG9sZXM7XG5tb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0cywgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///530\n')},function(module,exports){eval('function _iterableToArray(iter) {\n if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter);\n}\n\nmodule.exports = _iterableToArray;\nmodule.exports["default"] = module.exports, module.exports.__esModule = true;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pdGVyYWJsZVRvQXJyYXkuanM/MTFiMCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSIsImZpbGUiOiI1MzEuanMiLCJzb3VyY2VzQ29udGVudCI6WyJmdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5KGl0ZXIpIHtcbiAgaWYgKHR5cGVvZiBTeW1ib2wgIT09IFwidW5kZWZpbmVkXCIgJiYgaXRlcltTeW1ib2wuaXRlcmF0b3JdICE9IG51bGwgfHwgaXRlcltcIkBAaXRlcmF0b3JcIl0gIT0gbnVsbCkgcmV0dXJuIEFycmF5LmZyb20oaXRlcik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2l0ZXJhYmxlVG9BcnJheTtcbm1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///531\n')},function(module,exports){eval('function _nonIterableSpread() {\n throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");\n}\n\nmodule.exports = _nonIterableSpread;\nmodule.exports["default"] = module.exports, module.exports.__esModule = true;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9ub25JdGVyYWJsZVNwcmVhZC5qcz8wNjc2Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBIiwiZmlsZSI6IjUzMi5qcyIsInNvdXJjZXNDb250ZW50IjpbImZ1bmN0aW9uIF9ub25JdGVyYWJsZVNwcmVhZCgpIHtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBzcHJlYWQgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX25vbkl0ZXJhYmxlU3ByZWFkO1xubW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHMsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///532\n')},function(module,exports){eval("module.exports = clone\n\n/**\n * Creates a new vec2 initialized with values from an existing vector\n *\n * @param {vec2} a vector to clone\n * @returns {vec2} a new 2D vector\n */\nfunction clone(a) {\n var out = new Float32Array(2)\n out[0] = a[0]\n out[1] = a[1]\n return out\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZ2wtdmVjMi9jbG9uZS5qcz80YmNjIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixhQUFhLEtBQUs7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiNTMzLmpzIiwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBjbG9uZVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgdmVjMiBpbml0aWFsaXplZCB3aXRoIHZhbHVlcyBmcm9tIGFuIGV4aXN0aW5nIHZlY3RvclxuICpcbiAqIEBwYXJhbSB7dmVjMn0gYSB2ZWN0b3IgdG8gY2xvbmVcbiAqIEByZXR1cm5zIHt2ZWMyfSBhIG5ldyAyRCB2ZWN0b3JcbiAqL1xuZnVuY3Rpb24gY2xvbmUoYSkge1xuICAgIHZhciBvdXQgPSBuZXcgRmxvYXQzMkFycmF5KDIpXG4gICAgb3V0WzBdID0gYVswXVxuICAgIG91dFsxXSA9IGFbMV1cbiAgICByZXR1cm4gb3V0XG59Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///533\n")},function(module,exports){eval("module.exports = fromValues\n\n/**\n * Creates a new vec2 initialized with the given values\n *\n * @param {Number} x X component\n * @param {Number} y Y component\n * @returns {vec2} a new 2D vector\n */\nfunction fromValues(x, y) {\n var out = new Float32Array(2)\n out[0] = x\n out[1] = y\n return out\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZ2wtdmVjMi9mcm9tVmFsdWVzLmpzP2Q4NjUiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixhQUFhLEtBQUs7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiNTM0LmpzIiwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBmcm9tVmFsdWVzXG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyB2ZWMyIGluaXRpYWxpemVkIHdpdGggdGhlIGdpdmVuIHZhbHVlc1xuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSB4IFggY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0geSBZIGNvbXBvbmVudFxuICogQHJldHVybnMge3ZlYzJ9IGEgbmV3IDJEIHZlY3RvclxuICovXG5mdW5jdGlvbiBmcm9tVmFsdWVzKHgsIHkpIHtcbiAgICB2YXIgb3V0ID0gbmV3IEZsb2F0MzJBcnJheSgyKVxuICAgIG91dFswXSA9IHhcbiAgICBvdXRbMV0gPSB5XG4gICAgcmV0dXJuIG91dFxufSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///534\n")},function(module,exports){eval("module.exports = copy\n\n/**\n * Copy the values from one vec2 to another\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the source vector\n * @returns {vec2} out\n */\nfunction copy(out, a) {\n out[0] = a[0]\n out[1] = a[1]\n return out\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZ2wtdmVjMi9jb3B5LmpzPzNjYzMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsS0FBSztBQUNoQixhQUFhLEtBQUs7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6IjUzNS5qcyIsInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gY29weVxuXG4vKipcbiAqIENvcHkgdGhlIHZhbHVlcyBmcm9tIG9uZSB2ZWMyIHRvIGFub3RoZXJcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMyfSBhIHRoZSBzb3VyY2UgdmVjdG9yXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cbmZ1bmN0aW9uIGNvcHkob3V0LCBhKSB7XG4gICAgb3V0WzBdID0gYVswXVxuICAgIG91dFsxXSA9IGFbMV1cbiAgICByZXR1cm4gb3V0XG59Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///535\n")},function(module,exports,__webpack_require__){eval("module.exports = equals\n\nvar EPSILON = __webpack_require__(263)\n\n/**\n * Returns whether or not the vectors have approximately the same elements in the same position.\n *\n * @param {vec2} a The first vector.\n * @param {vec2} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\nfunction equals(a, b) {\n var a0 = a[0]\n var a1 = a[1]\n var b0 = b[0]\n var b1 = b[1]\n return (Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) &&\n Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)))\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZ2wtdmVjMi9lcXVhbHMuanM/MTc4OCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7QUFFQSxjQUFjLG1CQUFPLENBQUMsR0FBVzs7QUFFakM7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsS0FBSztBQUNoQixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6IjUzNi5qcyIsInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gZXF1YWxzXG5cbnZhciBFUFNJTE9OID0gcmVxdWlyZSgnLi9lcHNpbG9uJylcblxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSB2ZWN0b3JzIGhhdmUgYXBwcm94aW1hdGVseSB0aGUgc2FtZSBlbGVtZW50cyBpbiB0aGUgc2FtZSBwb3NpdGlvbi5cbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgVGhlIGZpcnN0IHZlY3Rvci5cbiAqIEBwYXJhbSB7dmVjMn0gYiBUaGUgc2Vjb25kIHZlY3Rvci5cbiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSB2ZWN0b3JzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5mdW5jdGlvbiBlcXVhbHMoYSwgYikge1xuICB2YXIgYTAgPSBhWzBdXG4gIHZhciBhMSA9IGFbMV1cbiAgdmFyIGIwID0gYlswXVxuICB2YXIgYjEgPSBiWzFdXG4gIHJldHVybiAoTWF0aC5hYnMoYTAgLSBiMCkgPD0gRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTApLCBNYXRoLmFicyhiMCkpICYmXG4gICAgICAgICAgTWF0aC5hYnMoYTEgLSBiMSkgPD0gRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTEpLCBNYXRoLmFicyhiMSkpKVxufVxuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///536\n")},function(module,exports){eval("module.exports = exactEquals\n\n/**\n * Returns whether or not the vectors exactly have the same elements in the same position (when compared with ===)\n *\n * @param {vec2} a The first vector.\n * @param {vec2} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\nfunction exactEquals(a, b) {\n return a[0] === b[0] && a[1] === b[1]\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZ2wtdmVjMi9leGFjdEVxdWFscy5qcz80NTE2Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLEtBQUs7QUFDaEIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6IjUzNy5qcyIsInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gZXhhY3RFcXVhbHNcblxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSB2ZWN0b3JzIGV4YWN0bHkgaGF2ZSB0aGUgc2FtZSBlbGVtZW50cyBpbiB0aGUgc2FtZSBwb3NpdGlvbiAod2hlbiBjb21wYXJlZCB3aXRoID09PSlcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgVGhlIGZpcnN0IHZlY3Rvci5cbiAqIEBwYXJhbSB7dmVjMn0gYiBUaGUgc2Vjb25kIHZlY3Rvci5cbiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSB2ZWN0b3JzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5mdW5jdGlvbiBleGFjdEVxdWFscyhhLCBiKSB7XG4gIHJldHVybiBhWzBdID09PSBiWzBdICYmIGFbMV0gPT09IGJbMV1cbn1cbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///537\n")},function(module,exports,__webpack_require__){eval("module.exports = __webpack_require__(172)\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZ2wtdmVjMi9zdWIuanM/YjhmMCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxpQkFBaUIsbUJBQU8sQ0FBQyxHQUFZIiwiZmlsZSI6IjUzOC5qcyIsInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9zdWJ0cmFjdCcpXG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///538\n")},function(module,exports,__webpack_require__){eval("module.exports = __webpack_require__(267)\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZ2wtdmVjMi9tdWwuanM/MzA1ZSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxpQkFBaUIsbUJBQU8sQ0FBQyxHQUFZIiwiZmlsZSI6IjUzOS5qcyIsInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9tdWx0aXBseScpXG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///539\n")},function(module,exports,__webpack_require__){eval("module.exports = __webpack_require__(268)\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZ2wtdmVjMi9kaXYuanM/NGFmNiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxpQkFBaUIsbUJBQU8sQ0FBQyxHQUFVIiwiZmlsZSI6IjU0MC5qcyIsInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9kaXZpZGUnKVxuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///540\n")},function(module,exports){eval("module.exports = inverse\n\n/**\n * Returns the inverse of the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a vector to invert\n * @returns {vec2} out\n */\nfunction inverse(out, a) {\n out[0] = 1.0 / a[0]\n out[1] = 1.0 / a[1]\n return out\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZ2wtdmVjMi9pbnZlcnNlLmpzPzQwZWMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsS0FBSztBQUNoQixhQUFhLEtBQUs7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6IjU0MS5qcyIsInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gaW52ZXJzZVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGludmVyc2Ugb2YgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWMyXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjMn0gYSB2ZWN0b3IgdG8gaW52ZXJ0XG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cbmZ1bmN0aW9uIGludmVyc2Uob3V0LCBhKSB7XG4gIG91dFswXSA9IDEuMCAvIGFbMF1cbiAgb3V0WzFdID0gMS4wIC8gYVsxXVxuICByZXR1cm4gb3V0XG59XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///541\n")},function(module,exports){eval("module.exports = min\n\n/**\n * Returns the minimum of two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @returns {vec2} out\n */\nfunction min(out, a, b) {\n out[0] = Math.min(a[0], b[0])\n out[1] = Math.min(a[1], b[1])\n return out\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZ2wtdmVjMi9taW4uanM/NzRlNSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsS0FBSztBQUNoQixhQUFhLEtBQUs7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6IjU0Mi5qcyIsInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gbWluXG5cbi8qKlxuICogUmV0dXJucyB0aGUgbWluaW11bSBvZiB0d28gdmVjMidzXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjMn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG5mdW5jdGlvbiBtaW4ob3V0LCBhLCBiKSB7XG4gICAgb3V0WzBdID0gTWF0aC5taW4oYVswXSwgYlswXSlcbiAgICBvdXRbMV0gPSBNYXRoLm1pbihhWzFdLCBiWzFdKVxuICAgIHJldHVybiBvdXRcbn0iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///542\n")},function(module,exports){eval("module.exports = max\n\n/**\n * Returns the maximum of two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @returns {vec2} out\n */\nfunction max(out, a, b) {\n out[0] = Math.max(a[0], b[0])\n out[1] = Math.max(a[1], b[1])\n return out\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZ2wtdmVjMi9tYXguanM/ZjgwZCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsS0FBSztBQUNoQixhQUFhLEtBQUs7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6IjU0My5qcyIsInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gbWF4XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbWF4aW11bSBvZiB0d28gdmVjMidzXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjMn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG5mdW5jdGlvbiBtYXgob3V0LCBhLCBiKSB7XG4gICAgb3V0WzBdID0gTWF0aC5tYXgoYVswXSwgYlswXSlcbiAgICBvdXRbMV0gPSBNYXRoLm1heChhWzFdLCBiWzFdKVxuICAgIHJldHVybiBvdXRcbn0iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///543\n")},function(module,exports){eval("module.exports = rotate\n\n/**\n * Rotates a vec2 by an angle\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the vector to rotate\n * @param {Number} angle the angle of rotation (in radians)\n * @returns {vec2} out\n */\nfunction rotate(out, a, angle) {\n var c = Math.cos(angle),\n s = Math.sin(angle)\n var x = a[0],\n y = a[1]\n\n out[0] = x * c - y * s\n out[1] = x * s + y * c\n\n return out\n}\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZ2wtdmVjMi9yb3RhdGUuanM/YjIzZSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsT0FBTztBQUNsQixhQUFhLEtBQUs7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSIsImZpbGUiOiI1NDQuanMiLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IHJvdGF0ZVxuXG4vKipcbiAqIFJvdGF0ZXMgYSB2ZWMyIGJ5IGFuIGFuZ2xlXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjMn0gYSB0aGUgdmVjdG9yIHRvIHJvdGF0ZVxuICogQHBhcmFtIHtOdW1iZXJ9IGFuZ2xlIHRoZSBhbmdsZSBvZiByb3RhdGlvbiAoaW4gcmFkaWFucylcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xuZnVuY3Rpb24gcm90YXRlKG91dCwgYSwgYW5nbGUpIHtcbiAgdmFyIGMgPSBNYXRoLmNvcyhhbmdsZSksXG4gICAgICBzID0gTWF0aC5zaW4oYW5nbGUpXG4gIHZhciB4ID0gYVswXSxcbiAgICAgIHkgPSBhWzFdXG5cbiAgb3V0WzBdID0geCAqIGMgLSB5ICogc1xuICBvdXRbMV0gPSB4ICogcyArIHkgKiBjXG5cbiAgcmV0dXJuIG91dFxufVxuXG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///544\n")},function(module,exports){eval("module.exports = floor\n\n/**\n * Math.floor the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a vector to floor\n * @returns {vec2} out\n */\nfunction floor(out, a) {\n out[0] = Math.floor(a[0])\n out[1] = Math.floor(a[1])\n return out\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZ2wtdmVjMi9mbG9vci5qcz8wYWFlIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLEtBQUs7QUFDaEIsYUFBYSxLQUFLO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiI1NDUuanMiLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IGZsb29yXG5cbi8qKlxuICogTWF0aC5mbG9vciB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzJcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMyfSBhIHZlY3RvciB0byBmbG9vclxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG5mdW5jdGlvbiBmbG9vcihvdXQsIGEpIHtcbiAgb3V0WzBdID0gTWF0aC5mbG9vcihhWzBdKVxuICBvdXRbMV0gPSBNYXRoLmZsb29yKGFbMV0pXG4gIHJldHVybiBvdXRcbn1cbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///545\n")},function(module,exports){eval("module.exports = ceil\n\n/**\n * Math.ceil the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a vector to ceil\n * @returns {vec2} out\n */\nfunction ceil(out, a) {\n out[0] = Math.ceil(a[0])\n out[1] = Math.ceil(a[1])\n return out\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZ2wtdmVjMi9jZWlsLmpzP2NjYmMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsS0FBSztBQUNoQixhQUFhLEtBQUs7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6IjU0Ni5qcyIsInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gY2VpbFxuXG4vKipcbiAqIE1hdGguY2VpbCB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzJcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMyfSBhIHZlY3RvciB0byBjZWlsXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cbmZ1bmN0aW9uIGNlaWwob3V0LCBhKSB7XG4gIG91dFswXSA9IE1hdGguY2VpbChhWzBdKVxuICBvdXRbMV0gPSBNYXRoLmNlaWwoYVsxXSlcbiAgcmV0dXJuIG91dFxufVxuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///546\n")},function(module,exports){eval("module.exports = round\n\n/**\n * Math.round the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a vector to round\n * @returns {vec2} out\n */\nfunction round(out, a) {\n out[0] = Math.round(a[0])\n out[1] = Math.round(a[1])\n return out\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZ2wtdmVjMi9yb3VuZC5qcz80YTQ2Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLEtBQUs7QUFDaEIsYUFBYSxLQUFLO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiI1NDcuanMiLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IHJvdW5kXG5cbi8qKlxuICogTWF0aC5yb3VuZCB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzJcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMyfSBhIHZlY3RvciB0byByb3VuZFxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG5mdW5jdGlvbiByb3VuZChvdXQsIGEpIHtcbiAgb3V0WzBdID0gTWF0aC5yb3VuZChhWzBdKVxuICBvdXRbMV0gPSBNYXRoLnJvdW5kKGFbMV0pXG4gIHJldHVybiBvdXRcbn1cbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///547\n")},function(module,exports){eval("module.exports = scale\n\n/**\n * Scales a vec2 by a scalar number\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {vec2} out\n */\nfunction scale(out, a, b) {\n out[0] = a[0] * b\n out[1] = a[1] * b\n return out\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZ2wtdmVjMi9zY2FsZS5qcz8zMzJlIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLEtBQUs7QUFDaEIsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsS0FBSztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiNTQ4LmpzIiwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBzY2FsZVxuXG4vKipcbiAqIFNjYWxlcyBhIHZlYzIgYnkgYSBzY2FsYXIgbnVtYmVyXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjMn0gYSB0aGUgdmVjdG9yIHRvIHNjYWxlXG4gKiBAcGFyYW0ge051bWJlcn0gYiBhbW91bnQgdG8gc2NhbGUgdGhlIHZlY3RvciBieVxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG5mdW5jdGlvbiBzY2FsZShvdXQsIGEsIGIpIHtcbiAgICBvdXRbMF0gPSBhWzBdICogYlxuICAgIG91dFsxXSA9IGFbMV0gKiBiXG4gICAgcmV0dXJuIG91dFxufSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///548\n")},function(module,exports){eval("module.exports = scaleAndAdd\n\n/**\n * Adds two vec2's after scaling the second operand by a scalar value\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @param {Number} scale the amount to scale b by before adding\n * @returns {vec2} out\n */\nfunction scaleAndAdd(out, a, b, scale) {\n out[0] = a[0] + (b[0] * scale)\n out[1] = a[1] + (b[1] * scale)\n return out\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZ2wtdmVjMi9zY2FsZUFuZEFkZC5qcz9mYTdmIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLEtBQUs7QUFDaEIsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsT0FBTztBQUNsQixhQUFhLEtBQUs7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6IjU0OS5qcyIsInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gc2NhbGVBbmRBZGRcblxuLyoqXG4gKiBBZGRzIHR3byB2ZWMyJ3MgYWZ0ZXIgc2NhbGluZyB0aGUgc2Vjb25kIG9wZXJhbmQgYnkgYSBzY2FsYXIgdmFsdWVcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3ZlYzJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcGFyYW0ge051bWJlcn0gc2NhbGUgdGhlIGFtb3VudCB0byBzY2FsZSBiIGJ5IGJlZm9yZSBhZGRpbmdcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xuZnVuY3Rpb24gc2NhbGVBbmRBZGQob3V0LCBhLCBiLCBzY2FsZSkge1xuICAgIG91dFswXSA9IGFbMF0gKyAoYlswXSAqIHNjYWxlKVxuICAgIG91dFsxXSA9IGFbMV0gKyAoYlsxXSAqIHNjYWxlKVxuICAgIHJldHVybiBvdXRcbn0iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///549\n")},function(module,exports,__webpack_require__){eval("module.exports = __webpack_require__(269)\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZ2wtdmVjMi9kaXN0LmpzPzA4NmEiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsaUJBQWlCLG1CQUFPLENBQUMsR0FBWSIsImZpbGUiOiI1NTAuanMiLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vZGlzdGFuY2UnKVxuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///550\n")},function(module,exports,__webpack_require__){eval("module.exports = __webpack_require__(270)\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZ2wtdmVjMi9zcXJEaXN0LmpzP2E2NTQiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsaUJBQWlCLG1CQUFPLENBQUMsR0FBbUIiLCJmaWxlIjoiNTUxLmpzIiwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL3NxdWFyZWREaXN0YW5jZScpXG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///551\n")},function(module,exports,__webpack_require__){eval("module.exports = __webpack_require__(271)\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZ2wtdmVjMi9sZW4uanM/YmUyYSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxpQkFBaUIsbUJBQU8sQ0FBQyxHQUFVIiwiZmlsZSI6IjU1Mi5qcyIsInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9sZW5ndGgnKVxuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///552\n")},function(module,exports,__webpack_require__){eval("module.exports = __webpack_require__(272)\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZ2wtdmVjMi9zcXJMZW4uanM/NjJiZiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxpQkFBaUIsbUJBQU8sQ0FBQyxHQUFpQiIsImZpbGUiOiI1NTMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vc3F1YXJlZExlbmd0aCcpXG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///553\n")},function(module,exports){eval("module.exports = negate\n\n/**\n * Negates the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a vector to negate\n * @returns {vec2} out\n */\nfunction negate(out, a) {\n out[0] = -a[0]\n out[1] = -a[1]\n return out\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZ2wtdmVjMi9uZWdhdGUuanM/MDMzYyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxLQUFLO0FBQ2hCLGFBQWEsS0FBSztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiNTU0LmpzIiwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBuZWdhdGVcblxuLyoqXG4gKiBOZWdhdGVzIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjMlxuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdmVjdG9yIHRvIG5lZ2F0ZVxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG5mdW5jdGlvbiBuZWdhdGUob3V0LCBhKSB7XG4gICAgb3V0WzBdID0gLWFbMF1cbiAgICBvdXRbMV0gPSAtYVsxXVxuICAgIHJldHVybiBvdXRcbn0iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///554\n")},function(module,exports){eval("module.exports = cross\n\n/**\n * Computes the cross product of two vec2's\n * Note that the cross product must by definition produce a 3D vector\n *\n * @param {vec3} out the receiving vector\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @returns {vec3} out\n */\nfunction cross(out, a, b) {\n var z = a[0] * b[1] - a[1] * b[0]\n out[0] = out[1] = 0\n out[2] = z\n return out\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZ2wtdmVjMi9jcm9zcy5qcz8zNzYxIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsS0FBSztBQUNoQixXQUFXLEtBQUs7QUFDaEIsYUFBYSxLQUFLO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6IjU1NS5qcyIsInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gY3Jvc3NcblxuLyoqXG4gKiBDb21wdXRlcyB0aGUgY3Jvc3MgcHJvZHVjdCBvZiB0d28gdmVjMidzXG4gKiBOb3RlIHRoYXQgdGhlIGNyb3NzIHByb2R1Y3QgbXVzdCBieSBkZWZpbml0aW9uIHByb2R1Y2UgYSAzRCB2ZWN0b3JcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3ZlYzJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cbmZ1bmN0aW9uIGNyb3NzKG91dCwgYSwgYikge1xuICAgIHZhciB6ID0gYVswXSAqIGJbMV0gLSBhWzFdICogYlswXVxuICAgIG91dFswXSA9IG91dFsxXSA9IDBcbiAgICBvdXRbMl0gPSB6XG4gICAgcmV0dXJuIG91dFxufSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///555\n")},function(module,exports){eval("module.exports = lerp\n\n/**\n * Performs a linear interpolation between two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @param {Number} t interpolation amount between the two inputs\n * @returns {vec2} out\n */\nfunction lerp(out, a, b, t) {\n var ax = a[0],\n ay = a[1]\n out[0] = ax + t * (b[0] - ax)\n out[1] = ay + t * (b[1] - ay)\n return out\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZ2wtdmVjMi9sZXJwLmpzP2M0MzUiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsS0FBSztBQUNoQixXQUFXLEtBQUs7QUFDaEIsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsS0FBSztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6IjU1Ni5qcyIsInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gbGVycFxuXG4vKipcbiAqIFBlcmZvcm1zIGEgbGluZWFyIGludGVycG9sYXRpb24gYmV0d2VlbiB0d28gdmVjMidzXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjMn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHBhcmFtIHtOdW1iZXJ9IHQgaW50ZXJwb2xhdGlvbiBhbW91bnQgYmV0d2VlbiB0aGUgdHdvIGlucHV0c1xuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG5mdW5jdGlvbiBsZXJwKG91dCwgYSwgYiwgdCkge1xuICAgIHZhciBheCA9IGFbMF0sXG4gICAgICAgIGF5ID0gYVsxXVxuICAgIG91dFswXSA9IGF4ICsgdCAqIChiWzBdIC0gYXgpXG4gICAgb3V0WzFdID0gYXkgKyB0ICogKGJbMV0gLSBheSlcbiAgICByZXR1cm4gb3V0XG59Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///556\n")},function(module,exports){eval("module.exports = random\n\n/**\n * Generates a random vector with the given scale\n *\n * @param {vec2} out the receiving vector\n * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned\n * @returns {vec2} out\n */\nfunction random(out, scale) {\n scale = scale || 1.0\n var r = Math.random() * 2.0 * Math.PI\n out[0] = Math.cos(r) * scale\n out[1] = Math.sin(r) * scale\n return out\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZ2wtdmVjMi9yYW5kb20uanM/MmY2ZSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsS0FBSztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6IjU1Ny5qcyIsInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gcmFuZG9tXG5cbi8qKlxuICogR2VuZXJhdGVzIGEgcmFuZG9tIHZlY3RvciB3aXRoIHRoZSBnaXZlbiBzY2FsZVxuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge051bWJlcn0gW3NjYWxlXSBMZW5ndGggb2YgdGhlIHJlc3VsdGluZyB2ZWN0b3IuIElmIG9tbWl0dGVkLCBhIHVuaXQgdmVjdG9yIHdpbGwgYmUgcmV0dXJuZWRcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xuZnVuY3Rpb24gcmFuZG9tKG91dCwgc2NhbGUpIHtcbiAgICBzY2FsZSA9IHNjYWxlIHx8IDEuMFxuICAgIHZhciByID0gTWF0aC5yYW5kb20oKSAqIDIuMCAqIE1hdGguUElcbiAgICBvdXRbMF0gPSBNYXRoLmNvcyhyKSAqIHNjYWxlXG4gICAgb3V0WzFdID0gTWF0aC5zaW4ocikgKiBzY2FsZVxuICAgIHJldHVybiBvdXRcbn0iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///557\n")},function(module,exports){eval("module.exports = transformMat2\n\n/**\n * Transforms the vec2 with a mat2\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the vector to transform\n * @param {mat2} m matrix to transform with\n * @returns {vec2} out\n */\nfunction transformMat2(out, a, m) {\n var x = a[0],\n y = a[1]\n out[0] = m[0] * x + m[2] * y\n out[1] = m[1] * x + m[3] * y\n return out\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZ2wtdmVjMi90cmFuc2Zvcm1NYXQyLmpzP2RmNGIiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsS0FBSztBQUNoQixXQUFXLEtBQUs7QUFDaEIsYUFBYSxLQUFLO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiNTU4LmpzIiwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSB0cmFuc2Zvcm1NYXQyXG5cbi8qKlxuICogVHJhbnNmb3JtcyB0aGUgdmVjMiB3aXRoIGEgbWF0MlxuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdGhlIHZlY3RvciB0byB0cmFuc2Zvcm1cbiAqIEBwYXJhbSB7bWF0Mn0gbSBtYXRyaXggdG8gdHJhbnNmb3JtIHdpdGhcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xuZnVuY3Rpb24gdHJhbnNmb3JtTWF0MihvdXQsIGEsIG0pIHtcbiAgICB2YXIgeCA9IGFbMF0sXG4gICAgICAgIHkgPSBhWzFdXG4gICAgb3V0WzBdID0gbVswXSAqIHggKyBtWzJdICogeVxuICAgIG91dFsxXSA9IG1bMV0gKiB4ICsgbVszXSAqIHlcbiAgICByZXR1cm4gb3V0XG59Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///558\n")},function(module,exports){eval("module.exports = transformMat2d\n\n/**\n * Transforms the vec2 with a mat2d\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the vector to transform\n * @param {mat2d} m matrix to transform with\n * @returns {vec2} out\n */\nfunction transformMat2d(out, a, m) {\n var x = a[0],\n y = a[1]\n out[0] = m[0] * x + m[2] * y + m[4]\n out[1] = m[1] * x + m[3] * y + m[5]\n return out\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZ2wtdmVjMi90cmFuc2Zvcm1NYXQyZC5qcz82ZTUzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLEtBQUs7QUFDaEIsV0FBVyxNQUFNO0FBQ2pCLGFBQWEsS0FBSztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6IjU1OS5qcyIsInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gdHJhbnNmb3JtTWF0MmRcblxuLyoqXG4gKiBUcmFuc2Zvcm1zIHRoZSB2ZWMyIHdpdGggYSBtYXQyZFxuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdGhlIHZlY3RvciB0byB0cmFuc2Zvcm1cbiAqIEBwYXJhbSB7bWF0MmR9IG0gbWF0cml4IHRvIHRyYW5zZm9ybSB3aXRoXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cbmZ1bmN0aW9uIHRyYW5zZm9ybU1hdDJkKG91dCwgYSwgbSkge1xuICAgIHZhciB4ID0gYVswXSxcbiAgICAgICAgeSA9IGFbMV1cbiAgICBvdXRbMF0gPSBtWzBdICogeCArIG1bMl0gKiB5ICsgbVs0XVxuICAgIG91dFsxXSA9IG1bMV0gKiB4ICsgbVszXSAqIHkgKyBtWzVdXG4gICAgcmV0dXJuIG91dFxufSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///559\n")},function(module,exports){eval("module.exports = transformMat3\n\n/**\n * Transforms the vec2 with a mat3\n * 3rd vector component is implicitly '1'\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the vector to transform\n * @param {mat3} m matrix to transform with\n * @returns {vec2} out\n */\nfunction transformMat3(out, a, m) {\n var x = a[0],\n y = a[1]\n out[0] = m[0] * x + m[3] * y + m[6]\n out[1] = m[1] * x + m[4] * y + m[7]\n return out\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZ2wtdmVjMi90cmFuc2Zvcm1NYXQzLmpzPzRmMDYiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxLQUFLO0FBQ2hCLFdBQVcsS0FBSztBQUNoQixhQUFhLEtBQUs7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiI1NjAuanMiLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IHRyYW5zZm9ybU1hdDNcblxuLyoqXG4gKiBUcmFuc2Zvcm1zIHRoZSB2ZWMyIHdpdGggYSBtYXQzXG4gKiAzcmQgdmVjdG9yIGNvbXBvbmVudCBpcyBpbXBsaWNpdGx5ICcxJ1xuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdGhlIHZlY3RvciB0byB0cmFuc2Zvcm1cbiAqIEBwYXJhbSB7bWF0M30gbSBtYXRyaXggdG8gdHJhbnNmb3JtIHdpdGhcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xuZnVuY3Rpb24gdHJhbnNmb3JtTWF0MyhvdXQsIGEsIG0pIHtcbiAgICB2YXIgeCA9IGFbMF0sXG4gICAgICAgIHkgPSBhWzFdXG4gICAgb3V0WzBdID0gbVswXSAqIHggKyBtWzNdICogeSArIG1bNl1cbiAgICBvdXRbMV0gPSBtWzFdICogeCArIG1bNF0gKiB5ICsgbVs3XVxuICAgIHJldHVybiBvdXRcbn0iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///560\n")},function(module,exports){eval("module.exports = transformMat4\n\n/**\n * Transforms the vec2 with a mat4\n * 3rd vector component is implicitly '0'\n * 4th vector component is implicitly '1'\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the vector to transform\n * @param {mat4} m matrix to transform with\n * @returns {vec2} out\n */\nfunction transformMat4(out, a, m) {\n var x = a[0], \n y = a[1]\n out[0] = m[0] * x + m[4] * y + m[12]\n out[1] = m[1] * x + m[5] * y + m[13]\n return out\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZ2wtdmVjMi90cmFuc2Zvcm1NYXQ0LmpzPzAwNDMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQixXQUFXLEtBQUs7QUFDaEIsV0FBVyxLQUFLO0FBQ2hCLGFBQWEsS0FBSztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6IjU2MS5qcyIsInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gdHJhbnNmb3JtTWF0NFxuXG4vKipcbiAqIFRyYW5zZm9ybXMgdGhlIHZlYzIgd2l0aCBhIG1hdDRcbiAqIDNyZCB2ZWN0b3IgY29tcG9uZW50IGlzIGltcGxpY2l0bHkgJzAnXG4gKiA0dGggdmVjdG9yIGNvbXBvbmVudCBpcyBpbXBsaWNpdGx5ICcxJ1xuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdGhlIHZlY3RvciB0byB0cmFuc2Zvcm1cbiAqIEBwYXJhbSB7bWF0NH0gbSBtYXRyaXggdG8gdHJhbnNmb3JtIHdpdGhcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xuZnVuY3Rpb24gdHJhbnNmb3JtTWF0NChvdXQsIGEsIG0pIHtcbiAgICB2YXIgeCA9IGFbMF0sIFxuICAgICAgICB5ID0gYVsxXVxuICAgIG91dFswXSA9IG1bMF0gKiB4ICsgbVs0XSAqIHkgKyBtWzEyXVxuICAgIG91dFsxXSA9IG1bMV0gKiB4ICsgbVs1XSAqIHkgKyBtWzEzXVxuICAgIHJldHVybiBvdXRcbn0iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///561\n")},function(module,exports,__webpack_require__){eval("module.exports = forEach\n\nvar vec = __webpack_require__(264)()\n\n/**\n * Perform some operation over an array of vec2s.\n *\n * @param {Array} a the array of vectors to iterate over\n * @param {Number} stride Number of elements between the start of each vec2. If 0 assumes tightly packed\n * @param {Number} offset Number of elements to skip at the beginning of the array\n * @param {Number} count Number of vec2s to iterate over. If 0 iterates over entire array\n * @param {Function} fn Function to call for each vector in the array\n * @param {Object} [arg] additional argument to pass to fn\n * @returns {Array} a\n * @function\n */\nfunction forEach(a, stride, offset, count, fn, arg) {\n var i, l\n if(!stride) {\n stride = 2\n }\n\n if(!offset) {\n offset = 0\n }\n \n if(count) {\n l = Math.min((count * stride) + offset, a.length)\n } else {\n l = a.length\n }\n\n for(i = offset; i < l; i += stride) {\n vec[0] = a[i]\n vec[1] = a[i+1]\n fn(vec, vec, arg)\n a[i] = vec[0]\n a[i+1] = vec[1]\n }\n \n return a\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZ2wtdmVjMi9mb3JFYWNoLmpzPzE0YTIiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0FBRUEsVUFBVSxtQkFBTyxDQUFDLEdBQVU7O0FBRTVCO0FBQ0E7QUFDQTtBQUNBLFdBQVcsTUFBTTtBQUNqQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixXQUFXLFNBQVM7QUFDcEIsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsTUFBTTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBLG1CQUFtQixPQUFPO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBIiwiZmlsZSI6IjU2Mi5qcyIsInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gZm9yRWFjaFxuXG52YXIgdmVjID0gcmVxdWlyZSgnLi9jcmVhdGUnKSgpXG5cbi8qKlxuICogUGVyZm9ybSBzb21lIG9wZXJhdGlvbiBvdmVyIGFuIGFycmF5IG9mIHZlYzJzLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IGEgdGhlIGFycmF5IG9mIHZlY3RvcnMgdG8gaXRlcmF0ZSBvdmVyXG4gKiBAcGFyYW0ge051bWJlcn0gc3RyaWRlIE51bWJlciBvZiBlbGVtZW50cyBiZXR3ZWVuIHRoZSBzdGFydCBvZiBlYWNoIHZlYzIuIElmIDAgYXNzdW1lcyB0aWdodGx5IHBhY2tlZFxuICogQHBhcmFtIHtOdW1iZXJ9IG9mZnNldCBOdW1iZXIgb2YgZWxlbWVudHMgdG8gc2tpcCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhcnJheVxuICogQHBhcmFtIHtOdW1iZXJ9IGNvdW50IE51bWJlciBvZiB2ZWMycyB0byBpdGVyYXRlIG92ZXIuIElmIDAgaXRlcmF0ZXMgb3ZlciBlbnRpcmUgYXJyYXlcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIEZ1bmN0aW9uIHRvIGNhbGwgZm9yIGVhY2ggdmVjdG9yIGluIHRoZSBhcnJheVxuICogQHBhcmFtIHtPYmplY3R9IFthcmddIGFkZGl0aW9uYWwgYXJndW1lbnQgdG8gcGFzcyB0byBmblxuICogQHJldHVybnMge0FycmF5fSBhXG4gKiBAZnVuY3Rpb25cbiAqL1xuZnVuY3Rpb24gZm9yRWFjaChhLCBzdHJpZGUsIG9mZnNldCwgY291bnQsIGZuLCBhcmcpIHtcbiAgICB2YXIgaSwgbFxuICAgIGlmKCFzdHJpZGUpIHtcbiAgICAgICAgc3RyaWRlID0gMlxuICAgIH1cblxuICAgIGlmKCFvZmZzZXQpIHtcbiAgICAgICAgb2Zmc2V0ID0gMFxuICAgIH1cbiAgICBcbiAgICBpZihjb3VudCkge1xuICAgICAgICBsID0gTWF0aC5taW4oKGNvdW50ICogc3RyaWRlKSArIG9mZnNldCwgYS5sZW5ndGgpXG4gICAgfSBlbHNlIHtcbiAgICAgICAgbCA9IGEubGVuZ3RoXG4gICAgfVxuXG4gICAgZm9yKGkgPSBvZmZzZXQ7IGkgPCBsOyBpICs9IHN0cmlkZSkge1xuICAgICAgICB2ZWNbMF0gPSBhW2ldXG4gICAgICAgIHZlY1sxXSA9IGFbaSsxXVxuICAgICAgICBmbih2ZWMsIHZlYywgYXJnKVxuICAgICAgICBhW2ldID0gdmVjWzBdXG4gICAgICAgIGFbaSsxXSA9IHZlY1sxXVxuICAgIH1cbiAgICBcbiAgICByZXR1cm4gYVxufSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///562\n")},function(module,exports){eval("module.exports = limit;\n\n/**\n * Limit the magnitude of this vector to the value used for the `max`\n * parameter.\n *\n * @param {vec2} the vector to limit\n * @param {Number} max the maximum magnitude for the vector\n * @returns {vec2} out\n */\nfunction limit(out, a, max) {\n var mSq = a[0] * a[0] + a[1] * a[1];\n\n if (mSq > max * max) {\n var n = Math.sqrt(mSq);\n out[0] = a[0] / n * max;\n out[1] = a[1] / n * max;\n } else {\n out[0] = a[0];\n out[1] = a[1];\n }\n\n return out;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZ2wtdmVjMi9saW1pdC5qcz9lNmI5Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxLQUFLO0FBQ2pCLFlBQVksT0FBTztBQUNuQixhQUFhLEtBQUs7QUFDbEI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBIiwiZmlsZSI6IjU2My5qcyIsInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gbGltaXQ7XG5cbi8qKlxuICogTGltaXQgdGhlIG1hZ25pdHVkZSBvZiB0aGlzIHZlY3RvciB0byB0aGUgdmFsdWUgdXNlZCBmb3IgdGhlIGBtYXhgXG4gKiBwYXJhbWV0ZXIuXG4gKlxuICogQHBhcmFtICB7dmVjMn0gdGhlIHZlY3RvciB0byBsaW1pdFxuICogQHBhcmFtICB7TnVtYmVyfSBtYXggdGhlIG1heGltdW0gbWFnbml0dWRlIGZvciB0aGUgdmVjdG9yXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cbmZ1bmN0aW9uIGxpbWl0KG91dCwgYSwgbWF4KSB7XG4gIHZhciBtU3EgPSBhWzBdICogYVswXSArIGFbMV0gKiBhWzFdO1xuXG4gIGlmIChtU3EgPiBtYXggKiBtYXgpIHtcbiAgICB2YXIgbiA9IE1hdGguc3FydChtU3EpO1xuICAgIG91dFswXSA9IGFbMF0gLyBuICogbWF4O1xuICAgIG91dFsxXSA9IGFbMV0gLyBuICogbWF4O1xuICB9IGVsc2Uge1xuICAgIG91dFswXSA9IGFbMF07XG4gICAgb3V0WzFdID0gYVsxXTtcbiAgfVxuXG4gIHJldHVybiBvdXQ7XG59XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///563\n")},function(module,exports,__webpack_require__){"use strict";eval("\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.InitViewBehaviors = void 0;\r\nfunction InitViewBehaviors(optionsTable) {\r\n const dragNodeTable = {}, selectNodeTable = {}, defaultModes = [];\r\n Object.keys(optionsTable).forEach(item => {\r\n dragNodeTable[item] = optionsTable[item].behavior.dragNode;\r\n selectNodeTable[item] = optionsTable[item].behavior.selectNode;\r\n });\r\n const dragNodeFilter = event => {\r\n let g6Item = event.item, node = g6Item.SVModel;\r\n if (g6Item === null || node.isNode() === false || node.leaked) {\r\n return false;\r\n }\r\n let dragNode = optionsTable[node.layout].behavior.dragNode;\r\n if (typeof dragNode === 'boolean') {\r\n return dragNode;\r\n }\r\n if (Array.isArray(dragNode) && dragNode.indexOf(node.sourceType) > -1) {\r\n return true;\r\n }\r\n return false;\r\n };\r\n const selectNodeFilter = event => {\r\n let g6Item = event.item, node = g6Item.SVModel;\r\n if (g6Item === null || node.isNode() === false || node.leaked) {\r\n return false;\r\n }\r\n let selectNode = optionsTable[node.layout].behavior.selectNode;\r\n if (typeof selectNode === 'boolean') {\r\n return selectNode;\r\n }\r\n if (Array.isArray(selectNode) && selectNode.indexOf(node.sourceType) > -1) {\r\n return true;\r\n }\r\n return false;\r\n };\r\n defaultModes.push({\r\n type: 'drag-node',\r\n shouldBegin: dragNodeFilter\r\n });\r\n defaultModes.push({\r\n type: 'drag-canvas'\r\n });\r\n defaultModes.push({\r\n type: 'click-select',\r\n shouldBegin: selectNodeFilter\r\n });\r\n return defaultModes;\r\n}\r\nexports.InitViewBehaviors = InitViewBehaviors;\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvQmVoYXZpb3JIZWxwZXIvaW5pdFZpZXdCZWhhdmlvcnMudHM/NjFjMCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFVQSxTQUFnQixpQkFBaUIsQ0FBQyxZQUFtRDtJQUNqRixNQUFNLGFBQWEsR0FBMEMsRUFBRSxFQUMzRCxlQUFlLEdBQTBDLEVBQUUsRUFDM0QsWUFBWSxHQUFHLEVBQUUsQ0FBQztJQUV0QixNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUNyQyxhQUFhLENBQUMsSUFBSSxDQUFDLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUM7UUFDM0QsZUFBZSxDQUFDLElBQUksQ0FBQyxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDO0lBQ25FLENBQUMsQ0FBQyxDQUFDO0lBRUgsTUFBTSxjQUFjLEdBQUcsS0FBSyxDQUFDLEVBQUU7UUFDM0IsSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDLElBQUksRUFDbkIsSUFBSSxHQUFZLE1BQU0sQ0FBQyxPQUFPLENBQUM7UUFFbkMsSUFBSSxNQUFNLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSyxLQUFLLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUMzRCxPQUFPLEtBQUssQ0FBQztTQUNoQjtRQUVELElBQUksUUFBUSxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztRQUUzRCxJQUFJLE9BQU8sUUFBUSxLQUFLLFNBQVMsRUFBRTtZQUMvQixPQUFPLFFBQVEsQ0FBQztTQUNuQjtRQUVELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTtZQUNuRSxPQUFPLElBQUksQ0FBQztTQUNmO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUVELE1BQU0sZ0JBQWdCLEdBQUcsS0FBSyxDQUFDLEVBQUU7UUFDN0IsSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDLElBQUksRUFDbkIsSUFBSSxHQUFZLE1BQU0sQ0FBQyxPQUFPLENBQUM7UUFFbkMsSUFBSSxNQUFNLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSyxLQUFLLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUMzRCxPQUFPLEtBQUssQ0FBQztTQUNoQjtRQUVELElBQUksVUFBVSxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQztRQUUvRCxJQUFJLE9BQU8sVUFBVSxLQUFLLFNBQVMsRUFBRTtZQUNqQyxPQUFPLFVBQVUsQ0FBQztTQUNyQjtRQUVELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxVQUFVLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTtZQUN2RSxPQUFPLElBQUksQ0FBQztTQUNmO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUVELFlBQVksQ0FBQyxJQUFJLENBQUM7UUFDZCxJQUFJLEVBQUUsV0FBVztRQUNqQixXQUFXLEVBQUUsY0FBYztLQUM5QixDQUFDLENBQUM7SUFFSCxZQUFZLENBQUMsSUFBSSxDQUFDO1FBQ2QsSUFBSSxFQUFFLGFBQWE7S0FDdEIsQ0FBQyxDQUFDO0lBRUgsWUFBWSxDQUFDLElBQUksQ0FBQztRQUNkLElBQUksRUFBRSxjQUFjO1FBQ3BCLFdBQVcsRUFBRSxnQkFBZ0I7S0FDaEMsQ0FBQyxDQUFDO0lBRUgsT0FBTyxZQUFZLENBQUM7QUFDeEIsQ0FBQztBQW5FRCw4Q0FtRUMiLCJmaWxlIjoiNTY0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU1ZNb2RlbCB9IGZyb20gXCIuLi9Nb2RlbC9TVk1vZGVsXCI7XHJcbmltcG9ydCB7IExheW91dEdyb3VwT3B0aW9ucyB9IGZyb20gXCIuLi9vcHRpb25zXCI7XHJcblxyXG5cclxuXHJcbi8qKlxyXG4gKiDliJ3lp4vljJZnNiDkuqTkupJvcHRpb25zXHJcbiAqIEBwYXJhbSBvcHRpb25zVGFibGUgXHJcbiAqIEByZXR1cm5zIFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIEluaXRWaWV3QmVoYXZpb3JzKG9wdGlvbnNUYWJsZTogeyBba2V5OiBzdHJpbmddOiBMYXlvdXRHcm91cE9wdGlvbnMgfSkge1xyXG4gICAgY29uc3QgZHJhZ05vZGVUYWJsZTogeyBba2V5OiBzdHJpbmddOiBib29sZWFuIHwgc3RyaW5nW10gfSA9IHt9LFxyXG4gICAgICAgIHNlbGVjdE5vZGVUYWJsZTogeyBba2V5OiBzdHJpbmddOiBib29sZWFuIHwgc3RyaW5nW10gfSA9IHt9LFxyXG4gICAgICAgIGRlZmF1bHRNb2RlcyA9IFtdO1xyXG5cclxuICAgIE9iamVjdC5rZXlzKG9wdGlvbnNUYWJsZSkuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICBkcmFnTm9kZVRhYmxlW2l0ZW1dID0gb3B0aW9uc1RhYmxlW2l0ZW1dLmJlaGF2aW9yLmRyYWdOb2RlO1xyXG4gICAgICAgIHNlbGVjdE5vZGVUYWJsZVtpdGVtXSA9IG9wdGlvbnNUYWJsZVtpdGVtXS5iZWhhdmlvci5zZWxlY3ROb2RlO1xyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3QgZHJhZ05vZGVGaWx0ZXIgPSBldmVudCA9PiB7XHJcbiAgICAgICAgbGV0IGc2SXRlbSA9IGV2ZW50Lml0ZW0sXHJcbiAgICAgICAgICAgIG5vZGU6IFNWTW9kZWwgPSBnNkl0ZW0uU1ZNb2RlbDtcclxuXHJcbiAgICAgICAgaWYgKGc2SXRlbSA9PT0gbnVsbCB8fCBub2RlLmlzTm9kZSgpID09PSBmYWxzZSB8fCBub2RlLmxlYWtlZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgZHJhZ05vZGUgPSBvcHRpb25zVGFibGVbbm9kZS5sYXlvdXRdLmJlaGF2aW9yLmRyYWdOb2RlO1xyXG5cclxuICAgICAgICBpZiAodHlwZW9mIGRyYWdOb2RlID09PSAnYm9vbGVhbicpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGRyYWdOb2RlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZHJhZ05vZGUpICYmIGRyYWdOb2RlLmluZGV4T2Yobm9kZS5zb3VyY2VUeXBlKSA+IC0xKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHNlbGVjdE5vZGVGaWx0ZXIgPSBldmVudCA9PiB7XHJcbiAgICAgICAgbGV0IGc2SXRlbSA9IGV2ZW50Lml0ZW0sXHJcbiAgICAgICAgICAgIG5vZGU6IFNWTW9kZWwgPSBnNkl0ZW0uU1ZNb2RlbDtcclxuXHJcbiAgICAgICAgaWYgKGc2SXRlbSA9PT0gbnVsbCB8fCBub2RlLmlzTm9kZSgpID09PSBmYWxzZSB8fCBub2RlLmxlYWtlZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgc2VsZWN0Tm9kZSA9IG9wdGlvbnNUYWJsZVtub2RlLmxheW91dF0uYmVoYXZpb3Iuc2VsZWN0Tm9kZTtcclxuXHJcbiAgICAgICAgaWYgKHR5cGVvZiBzZWxlY3ROb2RlID09PSAnYm9vbGVhbicpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHNlbGVjdE5vZGU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShzZWxlY3ROb2RlKSAmJiBzZWxlY3ROb2RlLmluZGV4T2Yobm9kZS5zb3VyY2VUeXBlKSA+IC0xKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGRlZmF1bHRNb2Rlcy5wdXNoKHtcclxuICAgICAgICB0eXBlOiAnZHJhZy1ub2RlJyxcclxuICAgICAgICBzaG91bGRCZWdpbjogZHJhZ05vZGVGaWx0ZXJcclxuICAgIH0pO1xyXG5cclxuICAgIGRlZmF1bHRNb2Rlcy5wdXNoKHtcclxuICAgICAgICB0eXBlOiAnZHJhZy1jYW52YXMnXHJcbiAgICB9KTtcclxuXHJcbiAgICBkZWZhdWx0TW9kZXMucHVzaCh7XHJcbiAgICAgICAgdHlwZTogJ2NsaWNrLXNlbGVjdCcsXHJcbiAgICAgICAgc2hvdWxkQmVnaW46IHNlbGVjdE5vZGVGaWx0ZXJcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiBkZWZhdWx0TW9kZXM7XHJcbn0iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///564\n")},function(module,exports,__webpack_require__){"use strict";eval("\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.Reconcile = void 0;\r\nconst eventBus_1 = __webpack_require__(97);\r\nconst util_1 = __webpack_require__(53);\r\nconst SVLink_1 = __webpack_require__(145);\r\nconst SVMarker_1 = __webpack_require__(173);\r\nconst SVNode_1 = __webpack_require__(174);\r\nconst animation_1 = __webpack_require__(566);\r\nclass Reconcile {\r\n constructor(engine, renderer) {\r\n this.engine = engine;\r\n this.renderer = renderer;\r\n this.isFirstPatch = true;\r\n }\r\n getContinuousModels(prevModelList, modelList) {\r\n const continuousModels = modelList.filter(item => prevModelList.find(prevModel => item.id === prevModel.id));\r\n return continuousModels;\r\n }\r\n getAppendModels(prevModelList, modelList, accumulateLeakModels) {\r\n const appendModels = modelList.filter(item => !prevModelList.find(model => model.id === item.id));\r\n appendModels.forEach(item => {\r\n let removeIndex = accumulateLeakModels.findIndex(leakModel => item.id === leakModel.id);\r\n if (removeIndex > -1) {\r\n accumulateLeakModels.splice(removeIndex, 1);\r\n }\r\n });\r\n return appendModels;\r\n }\r\n getLeakModels(prevModelList, modelList) {\r\n const potentialLeakModels = prevModelList.filter(item => !modelList.find(model => model.id === item.id) && !item.freed);\r\n const leakModels = [];\r\n potentialLeakModels.forEach(item => {\r\n if (item instanceof SVNode_1.SVNode) {\r\n item.leaked = true;\r\n leakModels.push(item);\r\n if (item.marker) {\r\n item.marker.leaked = true;\r\n leakModels.push(item.marker);\r\n }\r\n if (item.freedLabel) {\r\n item.marker.leaked = true;\r\n leakModels.push(item.freedLabel);\r\n }\r\n item.leakAddress.leaked = true;\r\n leakModels.push(item.leakAddress);\r\n }\r\n });\r\n potentialLeakModels.forEach(item => {\r\n if (item instanceof SVLink_1.SVLink && item.node.leaked !== false && item.target.leaked !== false) {\r\n item.leaked = true;\r\n leakModels.push(item);\r\n }\r\n });\r\n leakModels.forEach(item => {\r\n item.G6Item = null;\r\n });\r\n return leakModels;\r\n }\r\n getRemoveModels(prevModelList, modelList) {\r\n let removedModels = [];\r\n for (let i = 0; i < prevModelList.length; i++) {\r\n let prevModel = prevModelList[i], target = modelList.find(item => item.id === prevModel.id);\r\n if (target === undefined && !prevModel.leaked) {\r\n removedModels.push(prevModel);\r\n }\r\n }\r\n return removedModels;\r\n }\r\n getReTargetMarkers(prevModelList, modelList) {\r\n const prevMarkers = prevModelList.filter(item => item instanceof SVMarker_1.SVMarker), markers = modelList.filter(item => item instanceof SVMarker_1.SVMarker);\r\n return markers.filter(item => prevMarkers.find(prevItem => {\r\n return prevItem.id === item.id && prevItem.target.id !== item.target.id;\r\n }));\r\n }\r\n getLabelChangeModels(prevModelList, modelList) {\r\n let labelChangeModels = [];\r\n modelList.forEach(item => {\r\n const prevItem = prevModelList.find(prevItem => prevItem.id === item.id);\r\n if (prevItem === undefined) {\r\n return;\r\n }\r\n const prevLabel = prevItem.get('label'), label = item.get('label');\r\n if (prevLabel !== label) {\r\n labelChangeModels.push(item);\r\n }\r\n });\r\n return labelChangeModels;\r\n }\r\n getFreedModels(prevModelList, modelList) {\r\n const freedNodes = modelList.filter(item => item instanceof SVNode_1.SVNode && item.freed);\r\n freedNodes.forEach(item => {\r\n const prev = prevModelList.find(prevModel => item.id === prevModel.id);\r\n if (prev) {\r\n item.set('label', prev.get('label'));\r\n }\r\n });\r\n return freedNodes;\r\n }\r\n handleContinuousModels(continuousModels) {\r\n for (let i = 0; i < continuousModels.length; i++) {\r\n let model = continuousModels[i];\r\n if (model instanceof SVNode_1.SVNode) {\r\n const group = model.G6Item.getContainer();\r\n group.attr({ opacity: 1 });\r\n }\r\n }\r\n }\r\n handleAppendModels(appendModels) {\r\n let { duration, timingFunction } = this.engine.animationOptions;\r\n appendModels.forEach(item => {\r\n if (item instanceof SVNode_1.SVLeakAddress) {\r\n const leakAddressG6Group = item.G6Item.getContainer();\r\n leakAddressG6Group.attr({ opacity: 0 });\r\n }\r\n else {\r\n animation_1.Animations.APPEND(item.G6Item, {\r\n duration,\r\n timingFunction\r\n });\r\n }\r\n });\r\n }\r\n handleRemoveModels(removeModels) {\r\n let { duration, timingFunction } = this.engine.animationOptions;\r\n removeModels.forEach(item => {\r\n animation_1.Animations.REMOVE(item.G6Item, {\r\n duration,\r\n timingFunction,\r\n callback: () => {\r\n this.renderer.removeModel(item);\r\n }\r\n });\r\n });\r\n }\r\n handleLeakModels(leakModels) {\r\n let { duration, timingFunction } = this.engine.animationOptions;\r\n leakModels.forEach(item => {\r\n if (item instanceof SVNode_1.SVLeakAddress) {\r\n animation_1.Animations.FADE_IN(item.G6Item, {\r\n duration,\r\n timingFunction\r\n });\r\n }\r\n });\r\n eventBus_1.EventBus.emit('onLeak', leakModels);\r\n }\r\n handleAccumulateLeakModels(accumulateModels) {\r\n accumulateModels.forEach(item => {\r\n if (item.generalStyle) {\r\n item.set('style', Object.assign({}, item.generalStyle));\r\n }\r\n });\r\n }\r\n handleFreedModels(freedModes) {\r\n const { duration, timingFunction } = this.engine.animationOptions, alpha = 0.4;\r\n freedModes.forEach(item => {\r\n const nodeGroup = item.G6Item.getContainer();\r\n item.set('style', { fill: '#ccc' });\r\n nodeGroup.attr({ opacity: alpha });\r\n if (item.marker) {\r\n const markerGroup = item.marker.G6Item.getContainer();\r\n item.marker.set('style', { fill: '#ccc' });\r\n markerGroup.attr({ opacity: alpha + 0.5 });\r\n }\r\n item.freedLabel.G6Item.toFront();\r\n animation_1.Animations.FADE_IN(item.freedLabel.G6Item, { duration, timingFunction });\r\n });\r\n eventBus_1.EventBus.emit('onFreed', freedModes);\r\n }\r\n handleChangeModels(models) {\r\n const changeHighlightColor = this.engine.viewOptions.updateHighlight;\r\n if (!changeHighlightColor || typeof changeHighlightColor !== 'string') {\r\n return;\r\n }\r\n models.forEach(item => {\r\n if (item.generalStyle === undefined) {\r\n item.generalStyle = util_1.Util.objectClone(item.G6ModelProps.style);\r\n }\r\n if (item instanceof SVLink_1.SVLink) {\r\n item.set('style', {\r\n stroke: changeHighlightColor\r\n });\r\n }\r\n else {\r\n item.set('style', {\r\n fill: changeHighlightColor\r\n });\r\n }\r\n });\r\n }\r\n diff(prevModelList, modelList, accumulateLeakModels) {\r\n const continuousModels = this.getContinuousModels(prevModelList, modelList);\r\n const leakModels = this.getLeakModels(prevModelList, modelList);\r\n const appendModels = this.getAppendModels(prevModelList, modelList, accumulateLeakModels);\r\n const removeModels = this.getRemoveModels(prevModelList, modelList);\r\n const updateModels = [\r\n ...this.getReTargetMarkers(prevModelList, modelList),\r\n ...this.getLabelChangeModels(prevModelList, modelList),\r\n ...appendModels,\r\n ...leakModels\r\n ];\r\n const freedModels = this.getFreedModels(prevModelList, modelList);\r\n return {\r\n CONTINUOUS: continuousModels,\r\n APPEND: appendModels,\r\n REMOVE: removeModels,\r\n FREED: freedModels,\r\n LEAKED: leakModels,\r\n UPDATE: updateModels,\r\n ACCUMULATE_LEAK: [...accumulateLeakModels]\r\n };\r\n }\r\n patch(diffResult) {\r\n const { APPEND, REMOVE, FREED, LEAKED, UPDATE, CONTINUOUS, ACCUMULATE_LEAK } = diffResult;\r\n if (this.isFirstPatch === false) {\r\n this.handleChangeModels(UPDATE);\r\n }\r\n this.handleContinuousModels(CONTINUOUS);\r\n this.handleFreedModels(FREED);\r\n this.handleAppendModels(APPEND);\r\n this.handleLeakModels(LEAKED);\r\n this.handleRemoveModels(REMOVE);\r\n this.handleAccumulateLeakModels(ACCUMULATE_LEAK);\r\n if (this.isFirstPatch) {\r\n this.isFirstPatch = false;\r\n }\r\n }\r\n}\r\nexports.Reconcile = Reconcile;\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvVmlldy9yZWNvbmNpbGUudHM/NWIyNyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwyQ0FBOEM7QUFDOUMsdUNBQXNDO0FBRXRDLDBDQUF5QztBQUN6Qyw0Q0FBNkM7QUFFN0MsMENBQXdEO0FBQ3hELDZDQUF5QztBQWdCekMsTUFBYSxTQUFTO0lBTWxCLFlBQVksTUFBYyxFQUFFLFFBQWtCO1FBQzFDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO0lBQzdCLENBQUM7SUFPTyxtQkFBbUIsQ0FBQyxhQUF3QixFQUFFLFNBQW9CO1FBQ3RFLE1BQU0sZ0JBQWdCLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzdHLE9BQU8sZ0JBQWdCLENBQUM7SUFDNUIsQ0FBQztJQVNPLGVBQWUsQ0FBQyxhQUF3QixFQUFFLFNBQW9CLEVBQUUsb0JBQStCO1FBQ25HLE1BQU0sWUFBWSxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRWxHLFlBQVksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDeEIsSUFBSSxXQUFXLEdBQUcsb0JBQW9CLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7WUFFeEYsSUFBRyxXQUFXLEdBQUcsQ0FBQyxDQUFDLEVBQUU7Z0JBQ2pCLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUM7YUFDL0M7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sWUFBWSxDQUFDO0lBQ3hCLENBQUM7SUFRTyxhQUFhLENBQUMsYUFBd0IsRUFBRSxTQUFvQjtRQUNoRSxNQUFNLG1CQUFtQixHQUFjLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FDL0QsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsS0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUNoRSxDQUFDO1FBQ0YsTUFBTSxVQUFVLEdBQWMsRUFBRSxDQUFDO1FBRWpDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUMvQixJQUFJLElBQUksWUFBWSxlQUFNLEVBQUU7Z0JBQ3hCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO2dCQUNuQixVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUV0QixJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7b0JBQ2IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO29CQUMxQixVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztpQkFDaEM7Z0JBRUQsSUFBRyxJQUFJLENBQUMsVUFBVSxFQUFFO29CQUNoQixJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7b0JBQzFCLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2lCQUNwQztnQkFFRCxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7Z0JBQy9CLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2FBQ3JDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDL0IsSUFBSSxJQUFJLFlBQVksZUFBTSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxLQUFLLEtBQUssSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sS0FBSyxLQUFLLEVBQUU7Z0JBQ3RGLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO2dCQUNuQixVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ3pCO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxVQUFVLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBRXRCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ3ZCLENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxVQUFVLENBQUM7SUFDdEIsQ0FBQztJQU9PLGVBQWUsQ0FBQyxhQUF3QixFQUFFLFNBQW9CO1FBQ2xFLElBQUksYUFBYSxHQUFjLEVBQUUsQ0FBQztRQUVsQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsYUFBYSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUMzQyxJQUFJLFNBQVMsR0FBRyxhQUFhLENBQUMsQ0FBQyxDQUFDLEVBQzVCLE1BQU0sR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7WUFFOUQsSUFBSSxNQUFNLEtBQUssU0FBUyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRTtnQkFDM0MsYUFBYSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQzthQUNqQztTQUNKO1FBRUQsT0FBTyxhQUFhLENBQUM7SUFDekIsQ0FBQztJQVNPLGtCQUFrQixDQUFDLGFBQXdCLEVBQUUsU0FBb0I7UUFDckUsTUFBTSxXQUFXLEdBQWUsYUFBYSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksWUFBWSxtQkFBUSxDQUFlLEVBQ2hHLE9BQU8sR0FBZSxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxZQUFZLG1CQUFRLENBQWUsQ0FBQztRQUUzRixPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQ3RELE9BQU8sUUFBUSxDQUFDLEVBQUUsS0FBSyxJQUFJLENBQUMsRUFBRSxJQUFJLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxLQUFLLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRTtRQUMzRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ1IsQ0FBQztJQVFPLG9CQUFvQixDQUFDLGFBQXdCLEVBQUUsU0FBb0I7UUFDdkUsSUFBSSxpQkFBaUIsR0FBYyxFQUFFLENBQUM7UUFFdEMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNyQixNQUFNLFFBQVEsR0FBRyxhQUFhLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsS0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFFekUsSUFBSSxRQUFRLEtBQUssU0FBUyxFQUFFO2dCQUN4QixPQUFPO2FBQ1Y7WUFFRCxNQUFNLFNBQVMsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUNuQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUU5QixJQUFJLFNBQVMsS0FBSyxLQUFLLEVBQUU7Z0JBQ3JCLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUNoQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxpQkFBaUIsQ0FBQztJQUM3QixDQUFDO0lBUU8sY0FBYyxDQUFDLGFBQXdCLEVBQUcsU0FBb0I7UUFDbEUsTUFBTSxVQUFVLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksWUFBWSxlQUFNLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBYSxDQUFDO1FBRTlGLFVBQVUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDdEIsTUFBTSxJQUFJLEdBQUcsYUFBYSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBRXZFLElBQUcsSUFBSSxFQUFFO2dCQUNMLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQzthQUN4QztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxVQUFVLENBQUM7SUFDdEIsQ0FBQztJQVFPLHNCQUFzQixDQUFDLGdCQUEyQjtRQUN0RCxLQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzdDLElBQUksS0FBSyxHQUFHLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRWhDLElBQUcsS0FBSyxZQUFZLGVBQU0sRUFBRTtnQkFDeEIsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDMUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2FBQzlCO1NBQ0o7SUFDTCxDQUFDO0lBTU8sa0JBQWtCLENBQUMsWUFBdUI7UUFDOUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDO1FBRWhFLFlBQVksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDeEIsSUFBRyxJQUFJLFlBQVksc0JBQWEsRUFBRTtnQkFDOUIsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDO2dCQUN0RCxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQzthQUMzQztpQkFDSTtnQkFDRCxzQkFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFO29CQUMzQixRQUFRO29CQUNSLGNBQWM7aUJBQ2pCLENBQUMsQ0FBQzthQUNOO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBTU8sa0JBQWtCLENBQUMsWUFBdUI7UUFDOUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDO1FBRWhFLFlBQVksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDeEIsc0JBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtnQkFDM0IsUUFBUTtnQkFDUixjQUFjO2dCQUNkLFFBQVEsRUFBRSxHQUFHLEVBQUU7b0JBQ1gsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3BDLENBQUM7YUFDSixDQUFDLENBQUM7UUFDUCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFNTyxnQkFBZ0IsQ0FBQyxVQUFxQjtRQUMxQyxJQUFJLEVBQUUsUUFBUSxFQUFFLGNBQWMsRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUM7UUFFaEUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUN0QixJQUFHLElBQUksWUFBWSxzQkFBYSxFQUFFO2dCQUM5QixzQkFBVSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFO29CQUM1QixRQUFRO29CQUNSLGNBQWM7aUJBQ2pCLENBQUMsQ0FBQzthQUNOO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxtQkFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQU1PLDBCQUEwQixDQUFDLGdCQUEyQjtRQUMxRCxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDNUIsSUFBRyxJQUFJLENBQUMsWUFBWSxFQUFFO2dCQUNsQixJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sb0JBQU8sSUFBSSxDQUFDLFlBQVksRUFBRyxDQUFDO2FBQy9DO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBT08saUJBQWlCLENBQUMsVUFBb0I7UUFDMUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixFQUMzRCxLQUFLLEdBQUcsR0FBRyxDQUFDO1FBRWxCLFVBQVUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDdEIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUU3QyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1lBQ3BDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUVuQyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7Z0JBQ2IsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQ3RELElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO2dCQUMzQyxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDO2FBQzlDO1lBRUQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDakMsc0JBQVUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxRQUFRLEVBQUUsY0FBYyxFQUFFLENBQUMsQ0FBQztRQUM3RSxDQUFDLENBQUMsQ0FBQztRQUVILG1CQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBTU8sa0JBQWtCLENBQUMsTUFBaUI7UUFDeEMsTUFBTSxvQkFBb0IsR0FBVyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUM7UUFFN0UsSUFBSSxDQUFDLG9CQUFvQixJQUFJLE9BQU8sb0JBQW9CLEtBQUssUUFBUSxFQUFFO1lBQ25FLE9BQU87U0FDVjtRQUVELE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDbEIsSUFBRyxJQUFJLENBQUMsWUFBWSxLQUFLLFNBQVMsRUFBRTtnQkFDaEMsSUFBSSxDQUFDLFlBQVksR0FBRyxXQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDakU7WUFFRCxJQUFJLElBQUksWUFBWSxlQUFNLEVBQUU7Z0JBQ3hCLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFO29CQUNkLE1BQU0sRUFBRSxvQkFBb0I7aUJBQy9CLENBQUMsQ0FBQzthQUNOO2lCQUNJO2dCQUNELElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFO29CQUNkLElBQUksRUFBRSxvQkFBb0I7aUJBQzdCLENBQUMsQ0FBQzthQUNOO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBVU0sSUFBSSxDQUFDLGFBQXdCLEVBQUUsU0FBb0IsRUFBRSxvQkFBK0I7UUFDdkYsTUFBTSxnQkFBZ0IsR0FBYyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ3ZGLE1BQU0sVUFBVSxHQUFjLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQzNFLE1BQU0sWUFBWSxHQUFjLElBQUksQ0FBQyxlQUFlLENBQUMsYUFBYSxFQUFFLFNBQVMsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO1FBQ3JHLE1BQU0sWUFBWSxHQUFjLElBQUksQ0FBQyxlQUFlLENBQUMsYUFBYSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQy9FLE1BQU0sWUFBWSxHQUFjO1lBQzVCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGFBQWEsRUFBRSxTQUFTLENBQUM7WUFDcEQsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsYUFBYSxFQUFFLFNBQVMsQ0FBQztZQUN0RCxHQUFHLFlBQVk7WUFDZixHQUFHLFVBQVU7U0FDaEIsQ0FBQztRQUNGLE1BQU0sV0FBVyxHQUFhLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBRTVFLE9BQU87WUFDSCxVQUFVLEVBQUUsZ0JBQWdCO1lBQzVCLE1BQU0sRUFBRSxZQUFZO1lBQ3BCLE1BQU0sRUFBRSxZQUFZO1lBQ3BCLEtBQUssRUFBRSxXQUFXO1lBQ2xCLE1BQU0sRUFBRSxVQUFVO1lBQ2xCLE1BQU0sRUFBRSxZQUFZO1lBQ3BCLGVBQWUsRUFBRSxDQUFDLEdBQUcsb0JBQW9CLENBQUM7U0FDN0MsQ0FBQztJQUNOLENBQUM7SUFRTSxLQUFLLENBQUMsVUFBc0I7UUFDL0IsTUFBTSxFQUNGLE1BQU0sRUFDTixNQUFNLEVBQ04sS0FBSyxFQUNMLE1BQU0sRUFDTixNQUFNLEVBQ04sVUFBVSxFQUNWLGVBQWUsRUFDbEIsR0FBRyxVQUFVLENBQUM7UUFHZixJQUFJLElBQUksQ0FBQyxZQUFZLEtBQUssS0FBSyxFQUFFO1lBQzdCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUNuQztRQUVELElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN4QyxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDOUIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM5QixJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDaEMsSUFBSSxDQUFDLDBCQUEwQixDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBRWpELElBQUcsSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNsQixJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztTQUM3QjtJQUNMLENBQUM7Q0FDSjtBQTlYRCw4QkE4WEMiLCJmaWxlIjoiNTY1LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRXZlbnRCdXMgfSBmcm9tIFwiLi4vQ29tbW9uL2V2ZW50QnVzXCI7XHJcbmltcG9ydCB7IFV0aWwgfSBmcm9tIFwiLi4vQ29tbW9uL3V0aWxcIjtcclxuaW1wb3J0IHsgRW5naW5lIH0gZnJvbSBcIi4uL2VuZ2luZVwiO1xyXG5pbXBvcnQgeyBTVkxpbmsgfSBmcm9tIFwiLi4vTW9kZWwvU1ZMaW5rXCI7XHJcbmltcG9ydCB7IFNWTWFya2VyIH0gZnJvbSBcIi4uL01vZGVsL1NWTWFya2VyXCI7XHJcbmltcG9ydCB7IFNWTW9kZWwgfSBmcm9tIFwiLi4vTW9kZWwvU1ZNb2RlbFwiO1xyXG5pbXBvcnQgeyBTVkxlYWtBZGRyZXNzLCBTVk5vZGUgfSBmcm9tIFwiLi4vTW9kZWwvU1ZOb2RlXCI7XHJcbmltcG9ydCB7IEFuaW1hdGlvbnMgfSBmcm9tIFwiLi9hbmltYXRpb25cIjtcclxuaW1wb3J0IHsgUmVuZGVyZXIgfSBmcm9tIFwiLi9yZW5kZXJlclwiO1xyXG5cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRGlmZlJlc3VsdCB7XHJcbiAgICBDT05USU5VT1VTOiBTVk1vZGVsW107XHJcbiAgICBBUFBFTkQ6IFNWTW9kZWxbXTtcclxuICAgIFJFTU9WRTogU1ZNb2RlbFtdO1xyXG4gICAgRlJFRUQ6IFNWTm9kZVtdO1xyXG4gICAgTEVBS0VEOiBTVk1vZGVsW107XHJcbiAgICBVUERBVEU6IFNWTW9kZWxbXTtcclxuICAgIEFDQ1VNVUxBVEVfTEVBSzogU1ZNb2RlbFtdO1xyXG59XHJcblxyXG5cclxuXHJcbmV4cG9ydCBjbGFzcyBSZWNvbmNpbGUge1xyXG5cclxuICAgIHByaXZhdGUgZW5naW5lOiBFbmdpbmU7XHJcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjtcclxuICAgIHByaXZhdGUgaXNGaXJzdFBhdGNoOiBib29sZWFuO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGVuZ2luZTogRW5naW5lLCByZW5kZXJlcjogUmVuZGVyZXIpIHtcclxuICAgICAgICB0aGlzLmVuZ2luZSA9IGVuZ2luZTtcclxuICAgICAgICB0aGlzLnJlbmRlcmVyID0gcmVuZGVyZXI7XHJcbiAgICAgICAgdGhpcy5pc0ZpcnN0UGF0Y2ggPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6I635Y+W5LiK5LiA5qyh5riy5p+T5a2Y5Zyo55qE77yM6L+Z5LiA5qyh5riy5p+T5Lmf5a2Y5Zyo55qEbW9kZWxzXHJcbiAgICAgKiBAcGFyYW0gcHJldk1vZGVsTGlzdCBcclxuICAgICAqIEBwYXJhbSBtb2RlbExpc3QgXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZ2V0Q29udGludW91c01vZGVscyhwcmV2TW9kZWxMaXN0OiBTVk1vZGVsW10sIG1vZGVsTGlzdDogU1ZNb2RlbFtdKTogU1ZNb2RlbFtdIHtcclxuICAgICAgICBjb25zdCBjb250aW51b3VzTW9kZWxzID0gbW9kZWxMaXN0LmZpbHRlcihpdGVtID0+IHByZXZNb2RlbExpc3QuZmluZChwcmV2TW9kZWwgPT4gaXRlbS5pZCA9PT0gcHJldk1vZGVsLmlkKSk7XHJcbiAgICAgICAgcmV0dXJuIGNvbnRpbnVvdXNNb2RlbHM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDojrflj5bmlrDlop7nmoToioLngrnvvIzov5nkupvoioLngrnmnInlj6/og73mnaXoh6rms4TmvI/ljLrvvIjkuIrkuIDmraXnmoTmg4XlhrXvvIlcclxuICAgICAqIEBwYXJhbSBwcmV2TW9kZWxMaXN0IFxyXG4gICAgICogQHBhcmFtIG1vZGVsTGlzdCBcclxuICAgICAqIEBwYXJhbSBhY2N1bXVsYXRlTGVha01vZGVscyBcclxuICAgICAqIEByZXR1cm5zIFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGdldEFwcGVuZE1vZGVscyhwcmV2TW9kZWxMaXN0OiBTVk1vZGVsW10sIG1vZGVsTGlzdDogU1ZNb2RlbFtdLCBhY2N1bXVsYXRlTGVha01vZGVsczogU1ZNb2RlbFtdKTogU1ZNb2RlbFtdIHtcclxuICAgICAgICBjb25zdCBhcHBlbmRNb2RlbHMgPSBtb2RlbExpc3QuZmlsdGVyKGl0ZW0gPT4gIXByZXZNb2RlbExpc3QuZmluZChtb2RlbCA9PiBtb2RlbC5pZCA9PT0gaXRlbS5pZCkpO1xyXG5cclxuICAgICAgICBhcHBlbmRNb2RlbHMuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICAgICAgbGV0IHJlbW92ZUluZGV4ID0gYWNjdW11bGF0ZUxlYWtNb2RlbHMuZmluZEluZGV4KGxlYWtNb2RlbCA9PiBpdGVtLmlkID09PSBsZWFrTW9kZWwuaWQpO1xyXG5cclxuICAgICAgICAgICAgaWYocmVtb3ZlSW5kZXggPiAtMSkge1xyXG4gICAgICAgICAgICAgICAgYWNjdW11bGF0ZUxlYWtNb2RlbHMuc3BsaWNlKHJlbW92ZUluZGV4LCAxKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gYXBwZW5kTW9kZWxzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6I635Y+W6KKr5rOE6Zyy55qE6IqC54K5XHJcbiAgICAgKiBAcGFyYW0gcHJldk1vZGVsTGlzdCBcclxuICAgICAqIEBwYXJhbSBtb2RlbExpc3QgXHJcbiAgICAgKiBAcmV0dXJucyBcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBnZXRMZWFrTW9kZWxzKHByZXZNb2RlbExpc3Q6IFNWTW9kZWxbXSwgbW9kZWxMaXN0OiBTVk1vZGVsW10pOiBTVk1vZGVsW10ge1xyXG4gICAgICAgIGNvbnN0IHBvdGVudGlhbExlYWtNb2RlbHM6IFNWTW9kZWxbXSA9IHByZXZNb2RlbExpc3QuZmlsdGVyKGl0ZW0gPT5cclxuICAgICAgICAgICAgIW1vZGVsTGlzdC5maW5kKG1vZGVsID0+IG1vZGVsLmlkID09PSBpdGVtLmlkKSAmJiAhaXRlbS5mcmVlZFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgY29uc3QgbGVha01vZGVsczogU1ZNb2RlbFtdID0gW107XHJcblxyXG4gICAgICAgIHBvdGVudGlhbExlYWtNb2RlbHMuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICAgICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBTVk5vZGUpIHtcclxuICAgICAgICAgICAgICAgIGl0ZW0ubGVha2VkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGxlYWtNb2RlbHMucHVzaChpdGVtKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoaXRlbS5tYXJrZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICBpdGVtLm1hcmtlci5sZWFrZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGxlYWtNb2RlbHMucHVzaChpdGVtLm1hcmtlcik7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYoaXRlbS5mcmVlZExhYmVsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5tYXJrZXIubGVha2VkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICBsZWFrTW9kZWxzLnB1c2goaXRlbS5mcmVlZExhYmVsKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpdGVtLmxlYWtBZGRyZXNzLmxlYWtlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBsZWFrTW9kZWxzLnB1c2goaXRlbS5sZWFrQWRkcmVzcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcG90ZW50aWFsTGVha01vZGVscy5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIFNWTGluayAmJiBpdGVtLm5vZGUubGVha2VkICE9PSBmYWxzZSAmJiBpdGVtLnRhcmdldC5sZWFrZWQgIT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICBpdGVtLmxlYWtlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBsZWFrTW9kZWxzLnB1c2goaXRlbSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgbGVha01vZGVscy5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICAvLyDkuI3og73nlKjkuIrmrKHnmoRHNml0ZW3kuobvvIzkuI3nhLbluIPlsYDnmoTml7blgJnkvJrmsqHmnInliqjnlLtcclxuICAgICAgICAgICAgaXRlbS5HNkl0ZW0gPSBudWxsO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gbGVha01vZGVscztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOaJvuWHuumcgOimgeenu+mZpOeahOiKgueCuVxyXG4gICAgICogQHBhcmFtIHByZXZNb2RlbExpc3QgXHJcbiAgICAgKiBAcGFyYW0gbW9kZWxMaXN0IFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGdldFJlbW92ZU1vZGVscyhwcmV2TW9kZWxMaXN0OiBTVk1vZGVsW10sIG1vZGVsTGlzdDogU1ZNb2RlbFtdKTogU1ZNb2RlbFtdIHtcclxuICAgICAgICBsZXQgcmVtb3ZlZE1vZGVsczogU1ZNb2RlbFtdID0gW107XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJldk1vZGVsTGlzdC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBsZXQgcHJldk1vZGVsID0gcHJldk1vZGVsTGlzdFtpXSxcclxuICAgICAgICAgICAgICAgIHRhcmdldCA9IG1vZGVsTGlzdC5maW5kKGl0ZW0gPT4gaXRlbS5pZCA9PT0gcHJldk1vZGVsLmlkKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0YXJnZXQgPT09IHVuZGVmaW5lZCAmJiAhcHJldk1vZGVsLmxlYWtlZCkge1xyXG4gICAgICAgICAgICAgICAgcmVtb3ZlZE1vZGVscy5wdXNoKHByZXZNb2RlbCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiByZW1vdmVkTW9kZWxzO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIOaJvuWHuumHjeaWsOaMh+WQkeeahOWklumDqOaMh+mSiFxyXG4gICAgICogQHBhcmFtIHByZXZNb2RlbExpc3QgXHJcbiAgICAgKiBAcGFyYW0gbW9kZWxMaXN0IFxyXG4gICAgICogQHJldHVybnMgXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZ2V0UmVUYXJnZXRNYXJrZXJzKHByZXZNb2RlbExpc3Q6IFNWTW9kZWxbXSwgbW9kZWxMaXN0OiBTVk1vZGVsW10pOiBTVk1hcmtlcltdIHtcclxuICAgICAgICBjb25zdCBwcmV2TWFya2VyczogU1ZNYXJrZXJbXSA9IHByZXZNb2RlbExpc3QuZmlsdGVyKGl0ZW0gPT4gaXRlbSBpbnN0YW5jZW9mIFNWTWFya2VyKSBhcyBTVk1hcmtlcltdLFxyXG4gICAgICAgICAgICBtYXJrZXJzOiBTVk1hcmtlcltdID0gbW9kZWxMaXN0LmZpbHRlcihpdGVtID0+IGl0ZW0gaW5zdGFuY2VvZiBTVk1hcmtlcikgYXMgU1ZNYXJrZXJbXTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG1hcmtlcnMuZmlsdGVyKGl0ZW0gPT4gcHJldk1hcmtlcnMuZmluZChwcmV2SXRlbSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBwcmV2SXRlbS5pZCA9PT0gaXRlbS5pZCAmJiBwcmV2SXRlbS50YXJnZXQuaWQgIT09IGl0ZW0udGFyZ2V0LmlkXHJcbiAgICAgICAgfSkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5om+5Ye65YmN5ZCOIGxhYmVsIOWPkeeUn+WPmOWMlueahCBtb2RlbFxyXG4gICAgICogQHBhcmFtIHByZXZNb2RlbExpc3QgXHJcbiAgICAgKiBAcGFyYW0gbW9kZWxMaXN0IFxyXG4gICAgICogQHJldHVybnMgXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZ2V0TGFiZWxDaGFuZ2VNb2RlbHMocHJldk1vZGVsTGlzdDogU1ZNb2RlbFtdLCBtb2RlbExpc3Q6IFNWTW9kZWxbXSk6IFNWTW9kZWxbXSB7XHJcbiAgICAgICAgbGV0IGxhYmVsQ2hhbmdlTW9kZWxzOiBTVk1vZGVsW10gPSBbXTtcclxuXHJcbiAgICAgICAgbW9kZWxMaXN0LmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHByZXZJdGVtID0gcHJldk1vZGVsTGlzdC5maW5kKHByZXZJdGVtID0+IHByZXZJdGVtLmlkID09PSBpdGVtLmlkKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChwcmV2SXRlbSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHByZXZMYWJlbCA9IHByZXZJdGVtLmdldCgnbGFiZWwnKSxcclxuICAgICAgICAgICAgICAgIGxhYmVsID0gaXRlbS5nZXQoJ2xhYmVsJyk7XHJcblxyXG4gICAgICAgICAgICBpZiAocHJldkxhYmVsICE9PSBsYWJlbCkge1xyXG4gICAgICAgICAgICAgICAgbGFiZWxDaGFuZ2VNb2RlbHMucHVzaChpdGVtKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gbGFiZWxDaGFuZ2VNb2RlbHM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDojrflj5booqsgZnJlZSDnmoToioLngrlcclxuICAgICAqIEBwYXJhbSBwcmV2TW9kZWxMaXN0XHJcbiAgICAgKiBAcGFyYW0gbW9kZWxMaXN0IFxyXG4gICAgICogQHJldHVybnMgXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZ2V0RnJlZWRNb2RlbHMocHJldk1vZGVsTGlzdDogU1ZNb2RlbFtdLCAgbW9kZWxMaXN0OiBTVk1vZGVsW10pOiBTVk5vZGVbXSB7XHJcbiAgICAgICAgY29uc3QgZnJlZWROb2RlcyA9IG1vZGVsTGlzdC5maWx0ZXIoaXRlbSA9PiBpdGVtIGluc3RhbmNlb2YgU1ZOb2RlICYmIGl0ZW0uZnJlZWQpIGFzIFNWTm9kZVtdO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGZyZWVkTm9kZXMuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICAgICAgY29uc3QgcHJldiA9IHByZXZNb2RlbExpc3QuZmluZChwcmV2TW9kZWwgPT4gaXRlbS5pZCA9PT0gcHJldk1vZGVsLmlkKTtcclxuXHJcbiAgICAgICAgICAgIGlmKHByZXYpIHtcclxuICAgICAgICAgICAgICAgIGl0ZW0uc2V0KCdsYWJlbCcsIHByZXYuZ2V0KCdsYWJlbCcpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gZnJlZWROb2RlcztcclxuICAgIH1cclxuXHJcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOWkhOeQhuS4jeWPmOeahG1vZGVsc1xyXG4gICAgICogQHBhcmFtIGNvbnRpbnVvdXNNb2RlbHMgXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgaGFuZGxlQ29udGludW91c01vZGVscyhjb250aW51b3VzTW9kZWxzOiBTVk1vZGVsW10pIHtcclxuICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgY29udGludW91c01vZGVscy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBsZXQgbW9kZWwgPSBjb250aW51b3VzTW9kZWxzW2ldO1xyXG5cclxuICAgICAgICAgICAgaWYobW9kZWwgaW5zdGFuY2VvZiBTVk5vZGUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VwID0gbW9kZWwuRzZJdGVtLmdldENvbnRhaW5lcigpO1xyXG4gICAgICAgICAgICAgICAgZ3JvdXAuYXR0cih7IG9wYWNpdHk6IDEgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDlpITnkIbmlrDlop7nmoQgbW9kZWxzXHJcbiAgICAgKiBAcGFyYW0gYXBwZW5kRGF0YSBcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBoYW5kbGVBcHBlbmRNb2RlbHMoYXBwZW5kTW9kZWxzOiBTVk1vZGVsW10pIHtcclxuICAgICAgICBsZXQgeyBkdXJhdGlvbiwgdGltaW5nRnVuY3Rpb24gfSA9IHRoaXMuZW5naW5lLmFuaW1hdGlvbk9wdGlvbnM7XHJcblxyXG4gICAgICAgIGFwcGVuZE1vZGVscy5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICBpZihpdGVtIGluc3RhbmNlb2YgU1ZMZWFrQWRkcmVzcykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbGVha0FkZHJlc3NHNkdyb3VwID0gaXRlbS5HNkl0ZW0uZ2V0Q29udGFpbmVyKCk7XHJcbiAgICAgICAgICAgICAgICBsZWFrQWRkcmVzc0c2R3JvdXAuYXR0cih7IG9wYWNpdHk6IDAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBBbmltYXRpb25zLkFQUEVORChpdGVtLkc2SXRlbSwge1xyXG4gICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uLFxyXG4gICAgICAgICAgICAgICAgICAgIHRpbWluZ0Z1bmN0aW9uXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5aSE55CG6KKr56e76ZmkIG1vZGVsc1xyXG4gICAgICogQHBhcmFtIHJlbW92ZURhdGEgXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgaGFuZGxlUmVtb3ZlTW9kZWxzKHJlbW92ZU1vZGVsczogU1ZNb2RlbFtdKSB7XHJcbiAgICAgICAgbGV0IHsgZHVyYXRpb24sIHRpbWluZ0Z1bmN0aW9uIH0gPSB0aGlzLmVuZ2luZS5hbmltYXRpb25PcHRpb25zO1xyXG5cclxuICAgICAgICByZW1vdmVNb2RlbHMuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICAgICAgQW5pbWF0aW9ucy5SRU1PVkUoaXRlbS5HNkl0ZW0sIHtcclxuICAgICAgICAgICAgICAgIGR1cmF0aW9uLFxyXG4gICAgICAgICAgICAgICAgdGltaW5nRnVuY3Rpb24sXHJcbiAgICAgICAgICAgICAgICBjYWxsYmFjazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlTW9kZWwoaXRlbSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5aSE55CG5rOE5ryP5Yy6IG1vZGVsc1xyXG4gICAgICogQHBhcmFtIGxlYWtNb2RlbHMgXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgaGFuZGxlTGVha01vZGVscyhsZWFrTW9kZWxzOiBTVk1vZGVsW10pIHtcclxuICAgICAgICBsZXQgeyBkdXJhdGlvbiwgdGltaW5nRnVuY3Rpb24gfSA9IHRoaXMuZW5naW5lLmFuaW1hdGlvbk9wdGlvbnM7XHJcblxyXG4gICAgICAgIGxlYWtNb2RlbHMuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICAgICAgaWYoaXRlbSBpbnN0YW5jZW9mIFNWTGVha0FkZHJlc3MpIHtcclxuICAgICAgICAgICAgICAgIEFuaW1hdGlvbnMuRkFERV9JTihpdGVtLkc2SXRlbSwge1xyXG4gICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uLFxyXG4gICAgICAgICAgICAgICAgICAgIHRpbWluZ0Z1bmN0aW9uXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBFdmVudEJ1cy5lbWl0KCdvbkxlYWsnLCBsZWFrTW9kZWxzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOWkhOeQhuW3sue7j+Wghuenr+eahOazhOa8j+WMuiBtb2RlbHNcclxuICAgICAqIEBwYXJhbSBhY2N1bXVsYXRlTW9kZWxzIFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGhhbmRsZUFjY3VtdWxhdGVMZWFrTW9kZWxzKGFjY3VtdWxhdGVNb2RlbHM6IFNWTW9kZWxbXSkge1xyXG4gICAgICAgIGFjY3VtdWxhdGVNb2RlbHMuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICAgICAgaWYoaXRlbS5nZW5lcmFsU3R5bGUpIHtcclxuICAgICAgICAgICAgICAgIGl0ZW0uc2V0KCdzdHlsZScsIHsgLi4uaXRlbS5nZW5lcmFsU3R5bGUgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDlpITnkIbooqvph4rmlL7nmoToioLngrkgbW9kZWxzXHJcbiAgICAgKiBAcGFyYW0gZnJlZWRNb2RlcyBcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBoYW5kbGVGcmVlZE1vZGVscyhmcmVlZE1vZGVzOiBTVk5vZGVbXSkge1xyXG4gICAgICAgIGNvbnN0IHsgZHVyYXRpb24sIHRpbWluZ0Z1bmN0aW9uIH0gPSB0aGlzLmVuZ2luZS5hbmltYXRpb25PcHRpb25zLFxyXG4gICAgICAgICAgICAgIGFscGhhID0gMC40O1xyXG5cclxuICAgICAgICBmcmVlZE1vZGVzLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5vZGVHcm91cCA9IGl0ZW0uRzZJdGVtLmdldENvbnRhaW5lcigpO1xyXG5cclxuICAgICAgICAgICAgaXRlbS5zZXQoJ3N0eWxlJywgeyBmaWxsOiAnI2NjYycgfSk7XHJcbiAgICAgICAgICAgIG5vZGVHcm91cC5hdHRyKHsgb3BhY2l0eTogYWxwaGEgfSk7XHJcblxyXG4gICAgICAgICAgICBpZiAoaXRlbS5tYXJrZXIpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG1hcmtlckdyb3VwID0gaXRlbS5tYXJrZXIuRzZJdGVtLmdldENvbnRhaW5lcigpO1xyXG4gICAgICAgICAgICAgICAgaXRlbS5tYXJrZXIuc2V0KCdzdHlsZScsIHsgZmlsbDogJyNjY2MnIH0pO1xyXG4gICAgICAgICAgICAgICAgbWFya2VyR3JvdXAuYXR0cih7IG9wYWNpdHk6IGFscGhhICsgMC41IH0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpdGVtLmZyZWVkTGFiZWwuRzZJdGVtLnRvRnJvbnQoKTtcclxuICAgICAgICAgICAgQW5pbWF0aW9ucy5GQURFX0lOKGl0ZW0uZnJlZWRMYWJlbC5HNkl0ZW0sIHsgZHVyYXRpb24sIHRpbWluZ0Z1bmN0aW9uIH0pO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBFdmVudEJ1cy5lbWl0KCdvbkZyZWVkJywgZnJlZWRNb2Rlcyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDlpITnkIblj5HnlJ/lj5jljJbnmoQgbW9kZWxzXHJcbiAgICAgKiBAcGFyYW0gbW9kZWxzIFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGhhbmRsZUNoYW5nZU1vZGVscyhtb2RlbHM6IFNWTW9kZWxbXSkge1xyXG4gICAgICAgIGNvbnN0IGNoYW5nZUhpZ2hsaWdodENvbG9yOiBzdHJpbmcgPSB0aGlzLmVuZ2luZS52aWV3T3B0aW9ucy51cGRhdGVIaWdobGlnaHQ7XHJcblxyXG4gICAgICAgIGlmICghY2hhbmdlSGlnaGxpZ2h0Q29sb3IgfHwgdHlwZW9mIGNoYW5nZUhpZ2hsaWdodENvbG9yICE9PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBtb2RlbHMuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICAgICAgaWYoaXRlbS5nZW5lcmFsU3R5bGUgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgaXRlbS5nZW5lcmFsU3R5bGUgPSBVdGlsLm9iamVjdENsb25lKGl0ZW0uRzZNb2RlbFByb3BzLnN0eWxlKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBTVkxpbmspIHtcclxuICAgICAgICAgICAgICAgIGl0ZW0uc2V0KCdzdHlsZScsIHtcclxuICAgICAgICAgICAgICAgICAgICBzdHJva2U6IGNoYW5nZUhpZ2hsaWdodENvbG9yXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGl0ZW0uc2V0KCdzdHlsZScsIHtcclxuICAgICAgICAgICAgICAgICAgICBmaWxsOiBjaGFuZ2VIaWdobGlnaHRDb2xvclxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDov5vooYxkaWZmXHJcbiAgICAgKiBAcGFyYW0gcHJldkxheW91dEdyb3VwVGFibGUgXHJcbiAgICAgKiBAcGFyYW0gbGF5b3V0R3JvdXBUYWJsZSBcclxuICAgICAqIEBwYXJhbSBhY2N1bXVsYXRlTGVha01vZGVsc1xyXG4gICAgICogQHJldHVybnMgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBkaWZmKHByZXZNb2RlbExpc3Q6IFNWTW9kZWxbXSwgbW9kZWxMaXN0OiBTVk1vZGVsW10sIGFjY3VtdWxhdGVMZWFrTW9kZWxzOiBTVk1vZGVsW10pOiBEaWZmUmVzdWx0IHtcclxuICAgICAgICBjb25zdCBjb250aW51b3VzTW9kZWxzOiBTVk1vZGVsW10gPSB0aGlzLmdldENvbnRpbnVvdXNNb2RlbHMocHJldk1vZGVsTGlzdCwgbW9kZWxMaXN0KTtcclxuICAgICAgICBjb25zdCBsZWFrTW9kZWxzOiBTVk1vZGVsW10gPSB0aGlzLmdldExlYWtNb2RlbHMocHJldk1vZGVsTGlzdCwgbW9kZWxMaXN0KTtcclxuICAgICAgICBjb25zdCBhcHBlbmRNb2RlbHM6IFNWTW9kZWxbXSA9IHRoaXMuZ2V0QXBwZW5kTW9kZWxzKHByZXZNb2RlbExpc3QsIG1vZGVsTGlzdCwgYWNjdW11bGF0ZUxlYWtNb2RlbHMpO1xyXG4gICAgICAgIGNvbnN0IHJlbW92ZU1vZGVsczogU1ZNb2RlbFtdID0gdGhpcy5nZXRSZW1vdmVNb2RlbHMocHJldk1vZGVsTGlzdCwgbW9kZWxMaXN0KTtcclxuICAgICAgICBjb25zdCB1cGRhdGVNb2RlbHM6IFNWTW9kZWxbXSA9IFtcclxuICAgICAgICAgICAgLi4udGhpcy5nZXRSZVRhcmdldE1hcmtlcnMocHJldk1vZGVsTGlzdCwgbW9kZWxMaXN0KSxcclxuICAgICAgICAgICAgLi4udGhpcy5nZXRMYWJlbENoYW5nZU1vZGVscyhwcmV2TW9kZWxMaXN0LCBtb2RlbExpc3QpLFxyXG4gICAgICAgICAgICAuLi5hcHBlbmRNb2RlbHMsXHJcbiAgICAgICAgICAgIC4uLmxlYWtNb2RlbHNcclxuICAgICAgICBdO1xyXG4gICAgICAgIGNvbnN0IGZyZWVkTW9kZWxzOiBTVk5vZGVbXSA9IHRoaXMuZ2V0RnJlZWRNb2RlbHMocHJldk1vZGVsTGlzdCwgbW9kZWxMaXN0KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgQ09OVElOVU9VUzogY29udGludW91c01vZGVscyxcclxuICAgICAgICAgICAgQVBQRU5EOiBhcHBlbmRNb2RlbHMsXHJcbiAgICAgICAgICAgIFJFTU9WRTogcmVtb3ZlTW9kZWxzLFxyXG4gICAgICAgICAgICBGUkVFRDogZnJlZWRNb2RlbHMsXHJcbiAgICAgICAgICAgIExFQUtFRDogbGVha01vZGVscyxcclxuICAgICAgICAgICAgVVBEQVRFOiB1cGRhdGVNb2RlbHMsXHJcbiAgICAgICAgICAgIEFDQ1VNVUxBVEVfTEVBSzogWy4uLmFjY3VtdWxhdGVMZWFrTW9kZWxzXVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5omn6KGM6LCD5ZKM5pON5L2cXHJcbiAgICAgKiBAcGFyYW0gZGlmZlJlc3VsdCBcclxuICAgICAqIEBwYXJhbSBpc0ZpcnN0UmVuZGVyXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBwYXRjaChkaWZmUmVzdWx0OiBEaWZmUmVzdWx0KSB7XHJcbiAgICAgICAgY29uc3Qge1xyXG4gICAgICAgICAgICBBUFBFTkQsXHJcbiAgICAgICAgICAgIFJFTU9WRSxcclxuICAgICAgICAgICAgRlJFRUQsXHJcbiAgICAgICAgICAgIExFQUtFRCxcclxuICAgICAgICAgICAgVVBEQVRFLFxyXG4gICAgICAgICAgICBDT05USU5VT1VTLFxyXG4gICAgICAgICAgICBBQ0NVTVVMQVRFX0xFQUtcclxuICAgICAgICB9ID0gZGlmZlJlc3VsdDtcclxuXHJcbiAgICAgICAgLy8g56ys5LiA5qyh5riy5p+T55qE5pe25YCZ5LiN6auY5Lqu5Y+Y5YyW55qE5YWD57SgXHJcbiAgICAgICAgaWYgKHRoaXMuaXNGaXJzdFBhdGNoID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgICB0aGlzLmhhbmRsZUNoYW5nZU1vZGVscyhVUERBVEUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5oYW5kbGVDb250aW51b3VzTW9kZWxzKENPTlRJTlVPVVMpO1xyXG4gICAgICAgIHRoaXMuaGFuZGxlRnJlZWRNb2RlbHMoRlJFRUQpO1xyXG4gICAgICAgIHRoaXMuaGFuZGxlQXBwZW5kTW9kZWxzKEFQUEVORCk7XHJcbiAgICAgICAgdGhpcy5oYW5kbGVMZWFrTW9kZWxzKExFQUtFRCk7XHJcbiAgICAgICAgdGhpcy5oYW5kbGVSZW1vdmVNb2RlbHMoUkVNT1ZFKTtcclxuICAgICAgICB0aGlzLmhhbmRsZUFjY3VtdWxhdGVMZWFrTW9kZWxzKEFDQ1VNVUxBVEVfTEVBSyk7XHJcblxyXG4gICAgICAgIGlmKHRoaXMuaXNGaXJzdFBhdGNoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaXNGaXJzdFBhdGNoID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///565\n")},function(module,exports,__webpack_require__){"use strict";eval("\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.Animations = void 0;\r\nconst g6_1 = __webpack_require__(50);\r\nexports.Animations = {\r\n APPEND(G6Item, animationConfig) {\r\n const type = G6Item.getType(), group = G6Item.getContainer(), Mat3 = g6_1.Util.mat3, animateCfg = {\r\n duration: animationConfig.duration,\r\n easing: animationConfig.timingFunction,\r\n callback: animationConfig.callback\r\n };\r\n if (type === 'node') {\r\n let matrix = group.getMatrix(), targetMatrix = Mat3.clone(matrix);\r\n Mat3.scale(matrix, matrix, [0, 0]);\r\n Mat3.scale(targetMatrix, targetMatrix, [1, 1]);\r\n group.attr({ matrix, opacity: 0 });\r\n group.animate({ matrix: targetMatrix, opacity: 1 }, animateCfg);\r\n }\r\n if (type === 'edge') {\r\n const line = group.get('children')[0], length = line.getTotalLength();\r\n line.attr({ lineDash: [0, length], opacity: 0 });\r\n line.animate({ lineDash: [length, 0], opacity: 1 }, animateCfg);\r\n }\r\n },\r\n REMOVE(G6Item, animationConfig) {\r\n const type = G6Item.getType(), group = G6Item.getContainer(), Mat3 = g6_1.Util.mat3, animateCfg = {\r\n duration: animationConfig.duration,\r\n easing: animationConfig.timingFunction,\r\n callback: animationConfig.callback\r\n };\r\n if (type === 'node') {\r\n let matrix = Mat3.clone(group.getMatrix());\r\n Mat3.scale(matrix, matrix, [0, 0]);\r\n group.animate({ opacity: 0, matrix }, animateCfg);\r\n }\r\n if (type === 'edge') {\r\n const line = group.get('children')[0], length = line.getTotalLength();\r\n line.animate({ lineDash: [0, length], opacity: 0 }, animateCfg);\r\n }\r\n },\r\n FADE_IN(G6Item, animationConfig) {\r\n const group = G6Item.getContainer(), animateCfg = {\r\n duration: animationConfig.duration,\r\n easing: animationConfig.timingFunction,\r\n callback: animationConfig.callback\r\n };\r\n group.attr({ opacity: 0 });\r\n group.animate({ opacity: 1 }, animateCfg);\r\n }\r\n};\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvVmlldy9hbmltYXRpb24udHM/ZmRkYSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxxQ0FBZ0M7QUFjbkIsa0JBQVUsR0FBRztJQU90QixNQUFNLENBQUMsTUFBVyxFQUFFLGVBQWdDO1FBQ2hELE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxPQUFPLEVBQUUsRUFDekIsS0FBSyxHQUFHLE1BQU0sQ0FBQyxZQUFZLEVBQUUsRUFDN0IsSUFBSSxHQUFHLFNBQUksQ0FBQyxJQUFJLEVBQ2hCLFVBQVUsR0FBRztZQUNULFFBQVEsRUFBRSxlQUFlLENBQUMsUUFBUTtZQUNsQyxNQUFNLEVBQUUsZUFBZSxDQUFDLGNBQWM7WUFDdEMsUUFBUSxFQUFFLGVBQWUsQ0FBQyxRQUFRO1NBQ3JDLENBQUM7UUFFTixJQUFJLElBQUksS0FBSyxNQUFNLEVBQUU7WUFDakIsSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDLFNBQVMsRUFBRSxFQUMxQixZQUFZLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUV0QyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNuQyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUUvQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ25DLEtBQUssQ0FBQyxPQUFPLENBQUMsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsRUFBRSxVQUFVLENBQUMsQ0FBQztTQUNuRTtRQUVELElBQUksSUFBSSxLQUFLLE1BQU0sRUFBRTtZQUNqQixNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUNqQyxNQUFNLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBRW5DLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDakQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLEVBQUUsVUFBVSxDQUFDLENBQUM7U0FDbkU7SUFDTCxDQUFDO0lBT0QsTUFBTSxDQUFDLE1BQVcsRUFBRSxlQUFnQztRQUNoRCxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsT0FBTyxFQUFFLEVBQ3pCLEtBQUssR0FBRyxNQUFNLENBQUMsWUFBWSxFQUFFLEVBQzdCLElBQUksR0FBRyxTQUFJLENBQUMsSUFBSSxFQUNoQixVQUFVLEdBQUc7WUFDVCxRQUFRLEVBQUUsZUFBZSxDQUFDLFFBQVE7WUFDbEMsTUFBTSxFQUFFLGVBQWUsQ0FBQyxjQUFjO1lBQ3RDLFFBQVEsRUFBRSxlQUFlLENBQUMsUUFBUTtTQUNyQyxDQUFDO1FBRU4sSUFBSSxJQUFJLEtBQUssTUFBTSxFQUFFO1lBQ2pCLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7WUFFM0MsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbkMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUUsVUFBVSxDQUFDLENBQUM7U0FDckQ7UUFFRCxJQUFJLElBQUksS0FBSyxNQUFNLEVBQUU7WUFDakIsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFDakMsTUFBTSxHQUFHLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUVuQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsRUFBRSxVQUFVLENBQUMsQ0FBQztTQUNuRTtJQUNMLENBQUM7SUFPRCxPQUFPLENBQUMsTUFBVyxFQUFFLGVBQWdDO1FBQ2pELE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxZQUFZLEVBQUUsRUFDL0IsVUFBVSxHQUFHO1lBQ1QsUUFBUSxFQUFFLGVBQWUsQ0FBQyxRQUFRO1lBQ2xDLE1BQU0sRUFBRSxlQUFlLENBQUMsY0FBYztZQUN0QyxRQUFRLEVBQUUsZUFBZSxDQUFDLFFBQVE7U0FDckMsQ0FBQztRQUVOLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMzQixLQUFLLENBQUMsT0FBTyxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQzlDLENBQUM7Q0FDSixDQUFDIiwiZmlsZSI6IjU2Ni5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFV0aWwgfSBmcm9tICdAYW50di9nNic7XHJcblxyXG5cclxuZXhwb3J0IHR5cGUgYW5pbWF0aW9uQ29uZmlnID0ge1xyXG4gICAgZHVyYXRpb246IG51bWJlcjtcclxuICAgIHRpbWluZ0Z1bmN0aW9uOiBzdHJpbmc7XHJcbiAgICBjYWxsYmFjaz86IEZ1bmN0aW9uO1xyXG4gICAgW2tleTogc3RyaW5nXTogYW55O1xyXG59XHJcblxyXG5cclxuLyoqXHJcbiAqIOWKqOeUu+ihqFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IEFuaW1hdGlvbnMgPSB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmt7vliqDoioLngrkgLyDovrnml7bnmoTliqjnlLvmlYjmnpxcclxuICAgICAqIEBwYXJhbSBHNkl0ZW0gXHJcbiAgICAgKiBAcGFyYW0gYW5pbWF0aW9uQ29uZmlnXHJcbiAgICAgKi9cclxuICAgIEFQUEVORChHNkl0ZW06IGFueSwgYW5pbWF0aW9uQ29uZmlnOiBhbmltYXRpb25Db25maWcpIHtcclxuICAgICAgICBjb25zdCB0eXBlID0gRzZJdGVtLmdldFR5cGUoKSxcclxuICAgICAgICAgICAgZ3JvdXAgPSBHNkl0ZW0uZ2V0Q29udGFpbmVyKCksXHJcbiAgICAgICAgICAgIE1hdDMgPSBVdGlsLm1hdDMsXHJcbiAgICAgICAgICAgIGFuaW1hdGVDZmcgPSB7XHJcbiAgICAgICAgICAgICAgICBkdXJhdGlvbjogYW5pbWF0aW9uQ29uZmlnLmR1cmF0aW9uLFxyXG4gICAgICAgICAgICAgICAgZWFzaW5nOiBhbmltYXRpb25Db25maWcudGltaW5nRnVuY3Rpb24sXHJcbiAgICAgICAgICAgICAgICBjYWxsYmFjazogYW5pbWF0aW9uQ29uZmlnLmNhbGxiYWNrXHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgIGlmICh0eXBlID09PSAnbm9kZScpIHtcclxuICAgICAgICAgICAgbGV0IG1hdHJpeCA9IGdyb3VwLmdldE1hdHJpeCgpLFxyXG4gICAgICAgICAgICAgICAgdGFyZ2V0TWF0cml4ID0gTWF0My5jbG9uZShtYXRyaXgpO1xyXG5cclxuICAgICAgICAgICAgTWF0My5zY2FsZShtYXRyaXgsIG1hdHJpeCwgWzAsIDBdKTtcclxuICAgICAgICAgICAgTWF0My5zY2FsZSh0YXJnZXRNYXRyaXgsIHRhcmdldE1hdHJpeCwgWzEsIDFdKTtcclxuXHJcbiAgICAgICAgICAgIGdyb3VwLmF0dHIoeyBtYXRyaXgsIG9wYWNpdHk6IDAgfSk7XHJcbiAgICAgICAgICAgIGdyb3VwLmFuaW1hdGUoeyBtYXRyaXg6IHRhcmdldE1hdHJpeCwgb3BhY2l0eTogMSB9LCBhbmltYXRlQ2ZnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0eXBlID09PSAnZWRnZScpIHtcclxuICAgICAgICAgICAgY29uc3QgbGluZSA9IGdyb3VwLmdldCgnY2hpbGRyZW4nKVswXSxcclxuICAgICAgICAgICAgICAgIGxlbmd0aCA9IGxpbmUuZ2V0VG90YWxMZW5ndGgoKTtcclxuXHJcbiAgICAgICAgICAgIGxpbmUuYXR0cih7IGxpbmVEYXNoOiBbMCwgbGVuZ3RoXSwgb3BhY2l0eTogMCB9KTtcclxuICAgICAgICAgICAgbGluZS5hbmltYXRlKHsgbGluZURhc2g6IFtsZW5ndGgsIDBdLCBvcGFjaXR5OiAxIH0sIGFuaW1hdGVDZmcpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDnp7vpmaToioLngrkgLyDovrnml7bnmoTliqjnlLvmlYjmnpxcclxuICAgICAqIEBwYXJhbSBHNkl0ZW0gXHJcbiAgICAgKiBAcGFyYW0gYW5pbWF0aW9uQ29uZmlnXHJcbiAgICAgKi9cclxuICAgIFJFTU9WRShHNkl0ZW06IGFueSwgYW5pbWF0aW9uQ29uZmlnOiBhbmltYXRpb25Db25maWcpIHtcclxuICAgICAgICBjb25zdCB0eXBlID0gRzZJdGVtLmdldFR5cGUoKSxcclxuICAgICAgICAgICAgZ3JvdXAgPSBHNkl0ZW0uZ2V0Q29udGFpbmVyKCksXHJcbiAgICAgICAgICAgIE1hdDMgPSBVdGlsLm1hdDMsXHJcbiAgICAgICAgICAgIGFuaW1hdGVDZmcgPSB7XHJcbiAgICAgICAgICAgICAgICBkdXJhdGlvbjogYW5pbWF0aW9uQ29uZmlnLmR1cmF0aW9uLFxyXG4gICAgICAgICAgICAgICAgZWFzaW5nOiBhbmltYXRpb25Db25maWcudGltaW5nRnVuY3Rpb24sXHJcbiAgICAgICAgICAgICAgICBjYWxsYmFjazogYW5pbWF0aW9uQ29uZmlnLmNhbGxiYWNrXHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgIGlmICh0eXBlID09PSAnbm9kZScpIHtcclxuICAgICAgICAgICAgbGV0IG1hdHJpeCA9IE1hdDMuY2xvbmUoZ3JvdXAuZ2V0TWF0cml4KCkpO1xyXG5cclxuICAgICAgICAgICAgTWF0My5zY2FsZShtYXRyaXgsIG1hdHJpeCwgWzAsIDBdKTtcclxuICAgICAgICAgICAgZ3JvdXAuYW5pbWF0ZSh7IG9wYWNpdHk6IDAsIG1hdHJpeCB9LCBhbmltYXRlQ2ZnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0eXBlID09PSAnZWRnZScpIHtcclxuICAgICAgICAgICAgY29uc3QgbGluZSA9IGdyb3VwLmdldCgnY2hpbGRyZW4nKVswXSxcclxuICAgICAgICAgICAgICAgIGxlbmd0aCA9IGxpbmUuZ2V0VG90YWxMZW5ndGgoKTtcclxuXHJcbiAgICAgICAgICAgIGxpbmUuYW5pbWF0ZSh7IGxpbmVEYXNoOiBbMCwgbGVuZ3RoXSwgb3BhY2l0eTogMCB9LCBhbmltYXRlQ2ZnKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0gRzZJdGVtIFxyXG4gICAgICogQHBhcmFtIGFuaW1hdGlvbkNvbmZpZyBcclxuICAgICAqL1xyXG4gICAgRkFERV9JTihHNkl0ZW06IGFueSwgYW5pbWF0aW9uQ29uZmlnOiBhbmltYXRpb25Db25maWcpIHtcclxuICAgICAgICBjb25zdCBncm91cCA9IEc2SXRlbS5nZXRDb250YWluZXIoKSxcclxuICAgICAgICAgICAgYW5pbWF0ZUNmZyA9IHtcclxuICAgICAgICAgICAgICAgIGR1cmF0aW9uOiBhbmltYXRpb25Db25maWcuZHVyYXRpb24sXHJcbiAgICAgICAgICAgICAgICBlYXNpbmc6IGFuaW1hdGlvbkNvbmZpZy50aW1pbmdGdW5jdGlvbixcclxuICAgICAgICAgICAgICAgIGNhbGxiYWNrOiBhbmltYXRpb25Db25maWcuY2FsbGJhY2tcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgZ3JvdXAuYXR0cih7IG9wYWNpdHk6IDAgfSk7XHJcbiAgICAgICAgZ3JvdXAuYW5pbWF0ZSh7IG9wYWNpdHk6IDEgfSwgYW5pbWF0ZUNmZyk7XHJcbiAgICB9XHJcbn07XHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///566\n")},function(module,exports,__webpack_require__){"use strict";eval("\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.FixNodeMarkerDrag = void 0;\r\nfunction FixNodeMarkerDrag(g6Instance, optionsTable) {\r\n let dragActive = false;\r\n const nodeData = {\r\n node: null,\r\n startX: 0,\r\n startY: 0\r\n };\r\n const markerData = {\r\n marker: null,\r\n startX: 0,\r\n startY: 0\r\n };\r\n const freedLabelData = {\r\n freedLabel: null,\r\n startX: 0,\r\n startY: 0\r\n };\r\n g6Instance.on('node:dragstart', event => {\r\n nodeData.node = event.item['SVModel'];\r\n let node = nodeData.node;\r\n if (node.isNode() === false || node.leaked) {\r\n return false;\r\n }\r\n const dragNode = optionsTable[node.layout].behavior.dragNode;\r\n if (dragNode === false) {\r\n return;\r\n }\r\n if (Array.isArray(dragNode) && dragNode.find(item => item === node.sourceType) === undefined) {\r\n return;\r\n }\r\n dragActive = true;\r\n nodeData.startX = event.canvasX;\r\n nodeData.startY = event.canvasY;\r\n if (node.marker) {\r\n markerData.marker = node.marker;\r\n markerData.startX = markerData.marker.get('x');\r\n markerData.startY = markerData.marker.get('y');\r\n }\r\n if (node.freedLabel) {\r\n freedLabelData.freedLabel = node.freedLabel;\r\n freedLabelData.startX = freedLabelData.freedLabel.get('x');\r\n freedLabelData.startY = freedLabelData.freedLabel.get('y');\r\n }\r\n });\r\n g6Instance.on('node:dragend', event => {\r\n if (!dragActive) {\r\n return false;\r\n }\r\n let distanceX = event.canvasX - nodeData.startX, distanceY = event.canvasY - nodeData.startY, nodeX = nodeData.node.get('x'), nodeY = nodeData.node.get('y');\r\n nodeData.node.set({\r\n x: nodeX + distanceX,\r\n y: nodeY + distanceY\r\n });\r\n nodeData.node = null;\r\n nodeData.startX = 0;\r\n nodeData.startY = 0;\r\n markerData.marker = null;\r\n markerData.startX = 0;\r\n markerData.startY = 0;\r\n freedLabelData.freedLabel = null;\r\n freedLabelData.startX = 0;\r\n freedLabelData.startY = 0;\r\n dragActive = false;\r\n });\r\n g6Instance.on('node:drag', ev => {\r\n if (!dragActive) {\r\n return false;\r\n }\r\n let dx = ev.canvasX - nodeData.startX, dy = ev.canvasY - nodeData.startY, zoom = g6Instance.getZoom();\r\n if (markerData.marker) {\r\n markerData.marker.set({\r\n x: markerData.startX + dx / zoom,\r\n y: markerData.startY + dy / zoom\r\n });\r\n }\r\n if (freedLabelData.freedLabel) {\r\n freedLabelData.freedLabel.set({\r\n x: freedLabelData.startX + dx / zoom,\r\n y: freedLabelData.startY + dy / zoom\r\n });\r\n }\r\n });\r\n}\r\nexports.FixNodeMarkerDrag = FixNodeMarkerDrag;\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvQmVoYXZpb3JIZWxwZXIvZml4Tm9kZU1hcmtlckRyYWcudHM/Zjk3OCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFTQSxTQUFnQixpQkFBaUIsQ0FBQyxVQUFpQixFQUFFLFlBQW1EO0lBQ3BHLElBQUksVUFBVSxHQUFZLEtBQUssQ0FBQztJQUVoQyxNQUFNLFFBQVEsR0FBRztRQUNiLElBQUksRUFBRSxJQUFJO1FBQ1YsTUFBTSxFQUFFLENBQUM7UUFDVCxNQUFNLEVBQUUsQ0FBQztLQUNaLENBQUM7SUFFRixNQUFNLFVBQVUsR0FBRztRQUNmLE1BQU0sRUFBRSxJQUFJO1FBQ1osTUFBTSxFQUFFLENBQUM7UUFDVCxNQUFNLEVBQUUsQ0FBQztLQUNaLENBQUM7SUFFRixNQUFNLGNBQWMsR0FBRztRQUNuQixVQUFVLEVBQUUsSUFBSTtRQUNoQixNQUFNLEVBQUUsQ0FBQztRQUNULE1BQU0sRUFBRSxDQUFDO0tBQ1osQ0FBQztJQUVGLFVBQVUsQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLEVBQUU7UUFDcEMsUUFBUSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3RDLElBQUksSUFBSSxHQUFXLFFBQVEsQ0FBQyxJQUFJLENBQUM7UUFFakMsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssS0FBSyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDeEMsT0FBTyxLQUFLLENBQUM7U0FDaEI7UUFFRCxNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUM7UUFFN0QsSUFBSSxRQUFRLEtBQUssS0FBSyxFQUFFO1lBQ3BCLE9BQU87U0FDVjtRQUVELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxF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LENBQUMsTUFBTSxHQUFHLEVBQUUsR0FBRyxJQUFJO2dCQUNoQyxDQUFDLEVBQUUsVUFBVSxDQUFDLE1BQU0sR0FBRyxFQUFFLEdBQUcsSUFBSTthQUNuQyxDQUFDLENBQUM7U0FDTjtRQUVELElBQUcsY0FBYyxDQUFDLFVBQVUsRUFBRTtZQUMxQixjQUFjLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQztnQkFDMUIsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxNQUFNLEdBQUcsRUFBRSxHQUFHLElBQUk7Z0JBQ3BDLENBQUMsRUFBRSxjQUFjLENBQUMsTUFBTSxHQUFHLEVBQUUsR0FBRyxJQUFJO2FBQ3ZDLENBQUMsQ0FBQztTQUNOO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDO0FBMUdELDhDQTBHQyIsImZpbGUiOiI1NjcuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBHcmFwaCB9IGZyb20gXCJAYW50di9nNi1wY1wiO1xyXG5pbXBvcnQgeyBTVk5vZGUgfSBmcm9tIFwiLi4vTW9kZWwvU1ZOb2RlXCI7XHJcbmltcG9ydCB7IExheW91dEdyb3VwT3B0aW9ucyB9IGZyb20gXCIuLi9vcHRpb25zXCI7XHJcblxyXG5cclxuLyoqXHJcbiAqIOWcqOWIneWni+WMlua4suafk+WZqOS5i+WQju+8jOS/ruato+iKgueCueaLluaLveaXtu+8jOWklumDqOaMh+mSiOayoeaciei3n+edgOWKqOeahOmXrumimFxyXG4gKiBcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBGaXhOb2RlTWFya2VyRHJhZyhnNkluc3RhbmNlOiBHcmFwaCwgb3B0aW9uc1RhYmxlOiB7IFtrZXk6IHN0cmluZ106IExheW91dEdyb3VwT3B0aW9ucyB9KSB7XHJcbiAgICBsZXQgZHJhZ0FjdGl2ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIGNvbnN0IG5vZGVEYXRhID0ge1xyXG4gICAgICAgIG5vZGU6IG51bGwsXHJcbiAgICAgICAgc3RhcnRYOiAwLFxyXG4gICAgICAgIHN0YXJ0WTogMFxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBtYXJrZXJEYXRhID0ge1xyXG4gICAgICAgIG1hcmtlcjogbnVsbCxcclxuICAgICAgICBzdGFydFg6IDAsXHJcbiAgICAgICAgc3RhcnRZOiAwXHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IGZyZWVkTGFiZWxEYXRhID0ge1xyXG4gICAgICAgIGZyZWVkTGFiZWw6IG51bGwsXHJcbiAgICAgICAgc3RhcnRYOiAwLFxyXG4gICAgICAgIHN0YXJ0WTogMFxyXG4gICAgfTtcclxuXHJcbiAgICBnNkluc3RhbmNlLm9uKCdub2RlOmRyYWdzdGFydCcsIGV2ZW50ID0+IHtcclxuICAgICAgICBub2RlRGF0YS5ub2RlID0gZXZlbnQuaXRlbVsnU1ZNb2RlbCddO1xyXG4gICAgICAgIGxldCBub2RlOiBTVk5vZGUgPSBub2RlRGF0YS5ub2RlO1xyXG5cclxuICAgICAgICBpZiAobm9kZS5pc05vZGUoKSA9PT0gZmFsc2UgfHwgbm9kZS5sZWFrZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZHJhZ05vZGUgPSBvcHRpb25zVGFibGVbbm9kZS5sYXlvdXRdLmJlaGF2aW9yLmRyYWdOb2RlO1xyXG5cclxuICAgICAgICBpZiAoZHJhZ05vZGUgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGRyYWdOb2RlKSAmJiBkcmFnTm9kZS5maW5kKGl0ZW0gPT4gaXRlbSA9PT0gbm9kZS5zb3VyY2VUeXBlKSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGRyYWdBY3RpdmUgPSB0cnVlO1xyXG4gICAgICAgIG5vZGVEYXRhLnN0YXJ0WCA9IGV2ZW50LmNhbnZhc1g7XHJcbiAgICAgICAgbm9kZURhdGEuc3RhcnRZID0gZXZlbnQuY2FudmFzWTtcclxuXHJcbiAgICAgICAgaWYgKG5vZGUubWFya2VyKSB7XHJcbiAgICAgICAgICAgIG1hcmtlckRhdGEubWFya2VyID0gbm9kZS5tYXJrZXI7XHJcbiAgICAgICAgICAgIG1hcmtlckRhdGEuc3RhcnRYID0gbWFya2VyRGF0YS5tYXJrZXIuZ2V0KCd4Jyk7XHJcbiAgICAgICAgICAgIG1hcmtlckRhdGEuc3RhcnRZID0gbWFya2VyRGF0YS5tYXJrZXIuZ2V0KCd5Jyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZihub2RlLmZyZWVkTGFiZWwpIHtcclxuICAgICAgICAgICAgZnJlZWRMYWJlbERhdGEuZnJlZWRMYWJlbCA9IG5vZGUuZnJlZWRMYWJlbDtcclxuICAgICAgICAgICAgZnJlZWRMYWJlbERhdGEuc3RhcnRYID0gZnJlZWRMYWJlbERhdGEuZnJlZWRMYWJlbC5nZXQoJ3gnKTtcclxuICAgICAgICAgICAgZnJlZWRMYWJlbERhdGEuc3RhcnRZID0gZnJlZWRMYWJlbERhdGEuZnJlZWRMYWJlbC5nZXQoJ3knKTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBnNkluc3RhbmNlLm9uKCdub2RlOmRyYWdlbmQnLCBldmVudCA9PiB7XHJcbiAgICAgICAgaWYoIWRyYWdBY3RpdmUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGRpc3RhbmNlWCA9IGV2ZW50LmNhbnZhc1ggLSBub2RlRGF0YS5zdGFydFgsXHJcbiAgICAgICAgICAgIGRpc3RhbmNlWSA9IGV2ZW50LmNhbnZhc1kgLSBub2RlRGF0YS5zdGFydFksXHJcbiAgICAgICAgICAgIG5vZGVYID0gbm9kZURhdGEubm9kZS5nZXQoJ3gnKSxcclxuICAgICAgICAgICAgbm9kZVkgPSBub2RlRGF0YS5ub2RlLmdldCgneScpO1xyXG5cclxuICAgICAgICBub2RlRGF0YS5ub2RlLnNldCh7XHJcbiAgICAgICAgICAgIHg6IG5vZGVYICsgZGlzdGFuY2VYLFxyXG4gICAgICAgICAgICB5OiBub2RlWSArIGRpc3RhbmNlWVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBub2RlRGF0YS5ub2RlID0gbnVsbDtcclxuICAgICAgICBub2RlRGF0YS5zdGFydFggPSAwO1xyXG4gICAgICAgIG5vZGVEYXRhLnN0YXJ0WSA9IDA7XHJcbiAgICAgICAgbWFya2VyRGF0YS5tYXJrZXIgPSBudWxsO1xyXG4gICAgICAgIG1hcmtlckRhdGEuc3RhcnRYID0gMDtcclxuICAgICAgICBtYXJrZXJEYXRhLnN0YXJ0WSA9IDA7XHJcbiAgICAgICAgZnJlZWRMYWJlbERhdGEuZnJlZWRMYWJlbCA9IG51bGw7XHJcbiAgICAgICAgZnJlZWRMYWJlbERhdGEuc3RhcnRYID0gMDtcclxuICAgICAgICBmcmVlZExhYmVsRGF0YS5zdGFydFkgPSAwO1xyXG4gICAgICAgIGRyYWdBY3RpdmUgPSBmYWxzZTtcclxuICAgIH0pO1xyXG5cclxuICAgIGc2SW5zdGFuY2Uub24oJ25vZGU6ZHJhZycsIGV2ID0+IHtcclxuICAgICAgICBpZiAoIWRyYWdBY3RpdmUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGR4ID0gZXYuY2FudmFzWCAtIG5vZGVEYXRhLnN0YXJ0WCxcclxuICAgICAgICAgICAgZHkgPSBldi5jYW52YXNZIC0gbm9kZURhdGEuc3RhcnRZLFxyXG4gICAgICAgICAgICB6b29tID0gZzZJbnN0YW5jZS5nZXRab29tKCk7XHJcblxyXG4gICAgICAgIGlmKG1hcmtlckRhdGEubWFya2VyKSB7XHJcbiAgICAgICAgICAgIG1hcmtlckRhdGEubWFya2VyLnNldCh7XHJcbiAgICAgICAgICAgICAgICB4OiBtYXJrZXJEYXRhLnN0YXJ0WCArIGR4IC8gem9vbSxcclxuICAgICAgICAgICAgICAgIHk6IG1hcmtlckRhdGEuc3RhcnRZICsgZHkgLyB6b29tXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYoZnJlZWRMYWJlbERhdGEuZnJlZWRMYWJlbCkge1xyXG4gICAgICAgICAgICBmcmVlZExhYmVsRGF0YS5mcmVlZExhYmVsLnNldCh7XHJcbiAgICAgICAgICAgICAgICB4OiBmcmVlZExhYmVsRGF0YS5zdGFydFggKyBkeCAvIHpvb20sXHJcbiAgICAgICAgICAgICAgICB5OiBmcmVlZExhYmVsRGF0YS5zdGFydFkgKyBkeSAvIHpvb21cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcbn0iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///567\n")},function(module,exports,__webpack_require__){"use strict";eval("\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.InitDragCanvasWithLeak = void 0;\r\nconst eventBus_1 = __webpack_require__(97);\r\nfunction InitDragCanvasWithLeak(viewContainer) {\r\n let g6Instance = viewContainer.getG6Instance(), isDragStart = false, startPositionY = 0, currentLeakAreaY = 0, dragCounter = 0;\r\n g6Instance.on('canvas:dragstart', event => {\r\n isDragStart = true;\r\n startPositionY = event.canvasY;\r\n currentLeakAreaY = viewContainer.leakAreaY;\r\n dragCounter = 0;\r\n });\r\n g6Instance.on('canvas:drag', event => {\r\n if (!isDragStart) {\r\n return false;\r\n }\r\n let zoom = g6Instance.getZoom(), dy = (event.canvasY - startPositionY) / zoom, leakAreaY = currentLeakAreaY + dy;\r\n viewContainer.leakAreaY = leakAreaY;\r\n if (viewContainer.hasLeak) {\r\n eventBus_1.EventBus.emit('onLeakAreaUpdate', {\r\n leakAreaY: viewContainer.leakAreaY,\r\n hasLeak: viewContainer.hasLeak\r\n });\r\n }\r\n });\r\n g6Instance.on('canvas:dragend', event => {\r\n isDragStart = false;\r\n startPositionY = 0;\r\n dragCounter = 0;\r\n });\r\n}\r\nexports.InitDragCanvasWithLeak = InitDragCanvasWithLeak;\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvQmVoYXZpb3JIZWxwZXIvZHJhZ0NhbmF2c1dpdGhMZWFrLnRzP2ZlZmEiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMkNBQThDO0FBVzlDLFNBQWdCLHNCQUFzQixDQUFDLGFBQTRCO0lBQy9ELElBQUksVUFBVSxHQUFHLGFBQWEsQ0FBQyxhQUFhLEVBQUUsRUFDMUMsV0FBVyxHQUFHLEtBQUssRUFDbkIsY0FBYyxHQUFHLENBQUMsRUFDbEIsZ0JBQWdCLEdBQUcsQ0FBQyxFQUNwQixXQUFXLEdBQUcsQ0FBQyxDQUFDO0lBRXBCLFVBQVUsQ0FBQyxFQUFFLENBQUMsa0JBQWtCLEVBQUUsS0FBSyxDQUFDLEVBQUU7UUFDdEMsV0FBVyxHQUFHLElBQUksQ0FBQztRQUNuQixjQUFjLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQztRQUMvQixnQkFBZ0IsR0FBRyxhQUFhLENBQUMsU0FBUyxDQUFDO1FBQzNDLFdBQVcsR0FBRyxDQUFDLENBQUM7SUFDcEIsQ0FBQyxDQUFDLENBQUM7SUFFSCxVQUFVLENBQUMsRUFBRSxDQUFDLGFBQWEsRUFBRSxLQUFLLENBQUMsRUFBRTtRQUNqQyxJQUFHLENBQUMsV0FBVyxFQUFFO1lBQ2IsT0FBTyxLQUFLLENBQUM7U0FDaEI7UUFFRCxJQUFJLElBQUksR0FBRyxVQUFVLENBQUMsT0FBTyxFQUFFLEVBQzNCLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsY0FBYyxDQUFDLEdBQUcsSUFBSSxFQUM1QyxTQUFTLEdBQUcsZ0JBQWdCLEdBQUcsRUFBRSxDQUFDO1FBRXRDLGFBQWEsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1FBQ3BDLElBQUcsYUFBYSxDQUFDLE9BQU8sRUFBRTtZQUN0QixtQkFBUSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRTtnQkFDOUIsU0FBUyxFQUFFLGFBQWEsQ0FBQyxTQUFTO2dCQUNsQyxPQUFPLEVBQUUsYUFBYSxDQUFDLE9BQU87YUFDakMsQ0FBQyxDQUFDO1NBQ047SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFVBQVUsQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLEVBQUU7UUFDcEMsV0FBVyxHQUFHLEtBQUssQ0FBQztRQUNwQixjQUFjLEdBQUcsQ0FBQyxDQUFDO1FBQ25CLFdBQVcsR0FBRyxDQUFDLENBQUM7SUFDcEIsQ0FBQyxDQUFDO0FBQ04sQ0FBQztBQXJDRCx3REFxQ0MiLCJmaWxlIjoiNTY4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRXZlbnRCdXMgfSBmcm9tIFwiLi4vQ29tbW9uL2V2ZW50QnVzXCI7XHJcbmltcG9ydCB7IFZpZXdDb250YWluZXIgfSBmcm9tIFwiLi4vVmlldy92aWV3Q29udGFpbmVyXCI7XHJcblxyXG5cclxuXHJcblxyXG4vKipcclxuICog5Yid5aeL5YyW6KeG5Zu+5ouW5ou95Yqf6IO9XHJcbiAqIEBwYXJhbSBnNkluc3RhbmNlIFxyXG4gKiBAcGFyYW0gaGFzTGVhayBcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBJbml0RHJhZ0NhbnZhc1dpdGhMZWFrKHZpZXdDb250YWluZXI6IFZpZXdDb250YWluZXIpIHtcclxuICAgIGxldCBnNkluc3RhbmNlID0gdmlld0NvbnRhaW5lci5nZXRHNkluc3RhbmNlKCksXHJcbiAgICAgICAgaXNEcmFnU3RhcnQgPSBmYWxzZSxcclxuICAgICAgICBzdGFydFBvc2l0aW9uWSA9IDAsXHJcbiAgICAgICAgY3VycmVudExlYWtBcmVhWSA9IDAsXHJcbiAgICAgICAgZHJhZ0NvdW50ZXIgPSAwO1xyXG5cclxuICAgIGc2SW5zdGFuY2Uub24oJ2NhbnZhczpkcmFnc3RhcnQnLCBldmVudCA9PiB7XHJcbiAgICAgICAgaXNEcmFnU3RhcnQgPSB0cnVlO1xyXG4gICAgICAgIHN0YXJ0UG9zaXRpb25ZID0gZXZlbnQuY2FudmFzWTtcclxuICAgICAgICBjdXJyZW50TGVha0FyZWFZID0gdmlld0NvbnRhaW5lci5sZWFrQXJlYVk7XHJcbiAgICAgICAgZHJhZ0NvdW50ZXIgPSAwO1xyXG4gICAgfSk7XHJcblxyXG4gICAgZzZJbnN0YW5jZS5vbignY2FudmFzOmRyYWcnLCBldmVudCA9PiB7XHJcbiAgICAgICAgaWYoIWlzRHJhZ1N0YXJ0KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCB6b29tID0gZzZJbnN0YW5jZS5nZXRab29tKCksXHJcbiAgICAgICAgICAgIGR5ID0gKGV2ZW50LmNhbnZhc1kgLSBzdGFydFBvc2l0aW9uWSkgLyB6b29tLFxyXG4gICAgICAgICAgICBsZWFrQXJlYVkgPSBjdXJyZW50TGVha0FyZWFZICsgZHk7XHJcblxyXG4gICAgICAgIHZpZXdDb250YWluZXIubGVha0FyZWFZID0gbGVha0FyZWFZO1xyXG4gICAgICAgIGlmKHZpZXdDb250YWluZXIuaGFzTGVhaykge1xyXG4gICAgICAgICAgICBFdmVudEJ1cy5lbWl0KCdvbkxlYWtBcmVhVXBkYXRlJywgeyBcclxuICAgICAgICAgICAgICAgIGxlYWtBcmVhWTogdmlld0NvbnRhaW5lci5sZWFrQXJlYVksIFxyXG4gICAgICAgICAgICAgICAgaGFzTGVhazogdmlld0NvbnRhaW5lci5oYXNMZWFrIFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBnNkluc3RhbmNlLm9uKCdjYW52YXM6ZHJhZ2VuZCcsIGV2ZW50ID0+IHtcclxuICAgICAgICBpc0RyYWdTdGFydCA9IGZhbHNlO1xyXG4gICAgICAgIHN0YXJ0UG9zaXRpb25ZID0gMDtcclxuICAgICAgICBkcmFnQ291bnRlciA9IDA7XHJcbiAgICB9KVxyXG59XHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///568\n")},function(module,exports,__webpack_require__){"use strict";eval("\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nconst g6_1 = __webpack_require__(50);\r\nexports.default = g6_1.default.registerNode('pointer', {\r\n draw(cfg, group) {\r\n const keyShape = group.addShape('path', {\r\n attrs: {\r\n path: this.getPath(cfg),\r\n fill: cfg.style.fill,\r\n matrix: cfg.style.matrix\r\n },\r\n name: 'pointer-path'\r\n });\r\n if (cfg.label) {\r\n const style = (cfg.labelCfg && cfg.labelCfg.style) || {};\r\n const bgRect = group.addShape('rect', {\r\n attrs: {\r\n x: 0,\r\n y: 0,\r\n text: cfg.label,\r\n fill: null,\r\n radius: 2\r\n },\r\n name: 'bgRect'\r\n });\r\n const text = group.addShape('text', {\r\n attrs: {\r\n x: 0,\r\n y: 0,\r\n textAlign: 'center',\r\n textBaseline: 'middle',\r\n text: cfg.label,\r\n fill: style.fill || '#999',\r\n fontSize: style.fontSize || 16\r\n },\r\n name: 'pointer-text-shape'\r\n });\r\n const { width: textWidth, height: textHeight } = text.getBBox();\r\n bgRect.attr({\r\n width: textWidth + 6,\r\n height: textHeight + 6\r\n });\r\n const markerEndPosition = cfg.markerEndPosition;\r\n if (markerEndPosition) {\r\n let textX = markerEndPosition[0], textY = markerEndPosition[1];\r\n text.attr({\r\n x: textX,\r\n y: textY\r\n });\r\n bgRect.attr({\r\n x: textX - textWidth / 2 - 3,\r\n y: textY - textHeight / 2 - 3\r\n });\r\n }\r\n }\r\n return keyShape;\r\n },\r\n getPath(cfg) {\r\n let width = cfg.size[0], height = cfg.size[1], arrowWidth = width + 4, arrowHeight = height * 0.3;\r\n const path = [\r\n ['M', 0, 0],\r\n ['L', -width / 2 - (arrowWidth / 2), -arrowHeight],\r\n ['L', -width / 2, -arrowHeight],\r\n ['L', -width / 2, -height],\r\n ['L', width / 2, -height],\r\n ['L', width / 2, -arrowHeight],\r\n ['L', width / 2 + (arrowWidth / 2), -arrowHeight],\r\n ['Z'],\r\n ];\r\n return path;\r\n }\r\n});\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvUmVnaXN0ZXJlZFNoYXBlL3BvaW50ZXIudHM/YTJiZSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHFDQUEwQjtBQUcxQixrQkFBZSxZQUFFLENBQUMsWUFBWSxDQUFDLFNBQVMsRUFBRTtJQUN0QyxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUs7UUFDWCxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRTtZQUNwQyxLQUFLLEVBQUU7Z0JBQ0gsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDO2dCQUN2QixJQUFJLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJO2dCQUNwQixNQUFNLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNO2FBQzNCO1lBQ0QsSUFBSSxFQUFFLGNBQWM7U0FDdkIsQ0FBQyxDQUFDO1FBRUgsSUFBSSxHQUFHLENBQUMsS0FBSyxFQUFFO1lBQ1gsTUFBTSxLQUFLLEdBQUcsQ0FBQyxHQUFHLENBQUMsUUFBUSxJQUFJLEdBQUcsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO1lBRXpELE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFO2dCQUNsQyxLQUFLLEVBQUU7b0JBQ0gsQ0FBQyxFQUFFLENBQUM7b0JBQ0osQ0FBQyxFQUFFLENBQUM7b0JBQ0osSUFBSSxFQUFFLEdBQUcsQ0FBQyxLQUFLO29CQUNmLElBQUksRUFBRSxJQUFJO29CQUNWLE1BQU0sRUFBRSxDQUFDO2lCQUNaO2dCQUNELElBQUksRUFBRSxRQUFRO2FBQ2pCLENBQUMsQ0FBQztZQUVILE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFO2dCQUNoQyxLQUFLLEVBQUU7b0JBQ0gsQ0FBQyxFQUFFLENBQUM7b0JBQ0osQ0FBQyxFQUFFLENBQUM7b0JBQ0osU0FBUyxFQUFFLFFBQVE7b0JBQ25CLFlBQVksRUFBRSxRQUFRO29CQUN0QixJQUFJLEVBQUUsR0FBRyxDQUFDLEtBQUs7b0JBQ2YsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLElBQUksTUFBTTtvQkFDMUIsUUFBUSxFQUFFLEtBQUssQ0FBQyxRQUFRLElBQUksRUFBRTtpQkFDakM7Z0JBQ0QsSUFBSSxFQUFFLG9CQUFvQjthQUM3QixDQUFDLENBQUM7WUFFSCxNQUFNLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2hFLE1BQU0sQ0FBQyxJQUFJLENBQUM7Z0JBQ1IsS0FBSyxFQUFFLFNBQVMsR0FBRyxDQUFDO2dCQUNwQixNQUFNLEVBQUUsVUFBVSxHQUFHLENBQUM7YUFDekIsQ0FBQyxDQUFDO1lBR0gsTUFBTSxpQkFBaUIsR0FBRyxHQUFHLENBQUMsaUJBQWlCLENBQUM7WUFDaEQsSUFBRyxpQkFBaUIsRUFBRTtnQkFDbEIsSUFBSSxLQUFLLEdBQUcsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLEVBQzVCLEtBQUssR0FBRyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFFakMsSUFBSSxDQUFDLElBQUksQ0FBQztvQkFDTixDQUFDLEVBQUUsS0FBSztvQkFDUixDQUFDLEVBQUUsS0FBSztpQkFDWCxDQUFDLENBQUM7Z0JBRUgsTUFBTSxDQUFDLElBQUksQ0FBQztvQkFDUixDQUFDLEVBQUUsS0FBSyxHQUFHLFNBQVMsR0FBRyxDQUFDLEdBQUcsQ0FBQztvQkFDNUIsQ0FBQyxFQUFFLEtBQUssR0FBRyxVQUFVLEdBQUcsQ0FBQyxHQUFHLENBQUM7aUJBQ2hDLENBQUMsQ0FBQzthQUNOO1NBQ0o7UUFFRCxPQUFPLFFBQVEsQ0FBQztJQUNwQixDQUFDO0lBRUQsT0FBTyxDQUFDLEdBQUc7UUFDUCxJQUFJLEtBQUssR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUNuQixNQUFNLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFDcEIsVUFBVSxHQUFHLEtBQUssR0FBRyxDQUFDLEVBQ3RCLFdBQVcsR0FBRyxNQUFNLEdBQUcsR0FBRyxDQUFDO1FBRS9CLE1BQU0sSUFBSSxHQUFHO1lBQ1QsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNYLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxHQUFHLENBQUMsR0FBRyxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQztZQUNsRCxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUM7WUFDL0IsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDO1lBQzFCLENBQUMsR0FBRyxFQUFFLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUM7WUFDekIsQ0FBQyxHQUFHLEVBQUUsS0FBSyxHQUFHLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQztZQUM5QixDQUFDLEdBQUcsRUFBRSxLQUFLLEdBQUcsQ0FBQyxHQUFHLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDO1lBQ2pELENBQUMsR0FBRyxDQUFDO1NBQ1IsQ0FBQztRQUVGLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7Q0FDSixDQUFDLENBQUMiLCJmaWxlIjoiNTY5LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEc2IGZyb20gJ0BhbnR2L2c2JztcclxuXHJcblxyXG5leHBvcnQgZGVmYXVsdCBHNi5yZWdpc3Rlck5vZGUoJ3BvaW50ZXInLCB7XHJcbiAgICBkcmF3KGNmZywgZ3JvdXApIHtcclxuICAgICAgICBjb25zdCBrZXlTaGFwZSA9IGdyb3VwLmFkZFNoYXBlKCdwYXRoJywge1xyXG4gICAgICAgICAgICBhdHRyczoge1xyXG4gICAgICAgICAgICAgICAgcGF0aDogdGhpcy5nZXRQYXRoKGNmZyksXHJcbiAgICAgICAgICAgICAgICBmaWxsOiBjZmcuc3R5bGUuZmlsbCxcclxuICAgICAgICAgICAgICAgIG1hdHJpeDogY2ZnLnN0eWxlLm1hdHJpeFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBuYW1lOiAncG9pbnRlci1wYXRoJ1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpZiAoY2ZnLmxhYmVsKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0eWxlID0gKGNmZy5sYWJlbENmZyAmJiBjZmcubGFiZWxDZmcuc3R5bGUpIHx8IHt9O1xyXG5cclxuICAgICAgICAgICAgY29uc3QgYmdSZWN0ID0gZ3JvdXAuYWRkU2hhcGUoJ3JlY3QnLCB7XHJcbiAgICAgICAgICAgICAgICBhdHRyczoge1xyXG4gICAgICAgICAgICAgICAgICAgIHg6IDAsIFxyXG4gICAgICAgICAgICAgICAgICAgIHk6IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogY2ZnLmxhYmVsLFxyXG4gICAgICAgICAgICAgICAgICAgIGZpbGw6IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgcmFkaXVzOiAyXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgbmFtZTogJ2JnUmVjdCdcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCB0ZXh0ID0gZ3JvdXAuYWRkU2hhcGUoJ3RleHQnLCB7XHJcbiAgICAgICAgICAgICAgICBhdHRyczoge1xyXG4gICAgICAgICAgICAgICAgICAgIHg6IDAsIFxyXG4gICAgICAgICAgICAgICAgICAgIHk6IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgdGV4dEFsaWduOiAnY2VudGVyJyxcclxuICAgICAgICAgICAgICAgICAgICB0ZXh0QmFzZWxpbmU6ICdtaWRkbGUnLFxyXG4gICAgICAgICAgICAgICAgICAgIHRleHQ6IGNmZy5sYWJlbCxcclxuICAgICAgICAgICAgICAgICAgICBmaWxsOiBzdHlsZS5maWxsIHx8ICcjOTk5JyxcclxuICAgICAgICAgICAgICAgICAgICBmb250U2l6ZTogc3R5bGUuZm9udFNpemUgfHwgMTZcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBuYW1lOiAncG9pbnRlci10ZXh0LXNoYXBlJ1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHsgd2lkdGg6IHRleHRXaWR0aCwgaGVpZ2h0OiB0ZXh0SGVpZ2h0IH0gPSB0ZXh0LmdldEJCb3goKTtcclxuICAgICAgICAgICAgYmdSZWN0LmF0dHIoeyBcclxuICAgICAgICAgICAgICAgIHdpZHRoOiB0ZXh0V2lkdGggKyA2LFxyXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiB0ZXh0SGVpZ2h0ICsgNlxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIC8vIOaXi+i9rOaWh+Wtl1xyXG4gICAgICAgICAgICBjb25zdCBtYXJrZXJFbmRQb3NpdGlvbiA9IGNmZy5tYXJrZXJFbmRQb3NpdGlvbjtcclxuICAgICAgICAgICAgaWYobWFya2VyRW5kUG9zaXRpb24pIHtcclxuICAgICAgICAgICAgICAgIGxldCB0ZXh0WCA9IG1hcmtlckVuZFBvc2l0aW9uWzBdLFxyXG4gICAgICAgICAgICAgICAgICAgIHRleHRZID0gbWFya2VyRW5kUG9zaXRpb25bMV07XHJcblxyXG4gICAgICAgICAgICAgICAgdGV4dC5hdHRyKHsgXHJcbiAgICAgICAgICAgICAgICAgICAgeDogdGV4dFgsXHJcbiAgICAgICAgICAgICAgICAgICAgeTogdGV4dFlcclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIGJnUmVjdC5hdHRyKHsgXHJcbiAgICAgICAgICAgICAgICAgICAgeDogdGV4dFggLSB0ZXh0V2lkdGggLyAyIC0gMyxcclxuICAgICAgICAgICAgICAgICAgICB5OiB0ZXh0WSAtIHRleHRIZWlnaHQgLyAyIC0gM1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBrZXlTaGFwZTtcclxuICAgIH0sXHJcbiAgICBcclxuICAgIGdldFBhdGgoY2ZnKSB7XHJcbiAgICAgICAgbGV0IHdpZHRoID0gY2ZnLnNpemVbMF0sXHJcbiAgICAgICAgICAgIGhlaWdodCA9IGNmZy5zaXplWzFdLFxyXG4gICAgICAgICAgICBhcnJvd1dpZHRoID0gd2lkdGggKyA0LFxyXG4gICAgICAgICAgICBhcnJvd0hlaWdodCA9IGhlaWdodCAqIDAuMztcclxuXHJcbiAgICAgICAgY29uc3QgcGF0aCA9IFtcclxuICAgICAgICAgICAgWydNJywgMCwgMF0sIFxyXG4gICAgICAgICAgICBbJ0wnLCAtd2lkdGggLyAyIC0gKGFycm93V2lkdGggLyAyKSwgLWFycm93SGVpZ2h0XSxcclxuICAgICAgICAgICAgWydMJywgLXdpZHRoIC8gMiwgLWFycm93SGVpZ2h0XSxcclxuICAgICAgICAgICAgWydMJywgLXdpZHRoIC8gMiwgLWhlaWdodF0sXHJcbiAgICAgICAgICAgIFsnTCcsIHdpZHRoIC8gMiwgLWhlaWdodF0sXHJcbiAgICAgICAgICAgIFsnTCcsIHdpZHRoIC8gMiwgLWFycm93SGVpZ2h0XSxcclxuICAgICAgICAgICAgWydMJywgd2lkdGggLyAyICsgKGFycm93V2lkdGggLyAyKSwgLWFycm93SGVpZ2h0XSxcclxuICAgICAgICAgICAgWydaJ10sIFxyXG4gICAgICAgIF07XHJcblxyXG4gICAgICAgIHJldHVybiBwYXRoO1xyXG4gICAgfVxyXG59KTsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///569\n")},function(module,exports,__webpack_require__){"use strict";eval("\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nconst g6_1 = __webpack_require__(50);\r\nexports.default = g6_1.default.registerNode('link-list-node', {\r\n draw(cfg, group) {\r\n cfg.size = cfg.size || [30, 10];\r\n const width = cfg.size[0], height = cfg.size[1];\r\n const wrapperRect = group.addShape('rect', {\r\n attrs: {\r\n x: width / 2,\r\n y: height / 2,\r\n width: width,\r\n height: height,\r\n stroke: cfg.style.stroke || '#333',\r\n fill: '#eee',\r\n cursor: cfg.style.cursor\r\n },\r\n name: 'wrapper'\r\n });\r\n group.addShape('rect', {\r\n attrs: {\r\n x: width / 2,\r\n y: height / 2,\r\n width: width * (2 / 3),\r\n height: height,\r\n fill: cfg.style.fill,\r\n stroke: cfg.style.stroke || '#333',\r\n cursor: cfg.style.cursor\r\n },\r\n name: 'main-rect',\r\n draggable: true\r\n });\r\n if (cfg.label) {\r\n const style = (cfg.labelCfg && cfg.labelCfg.style) || {};\r\n group.addShape('text', {\r\n attrs: {\r\n x: width * (5 / 6),\r\n y: height,\r\n textAlign: 'center',\r\n textBaseline: 'middle',\r\n text: cfg.label,\r\n fill: style.fill || '#000',\r\n fontSize: style.fontSize || 16\r\n },\r\n name: 'text',\r\n draggable: true\r\n });\r\n }\r\n return wrapperRect;\r\n },\r\n getAnchorPoints() {\r\n return [\r\n [0.5, 0],\r\n [5 / 6, 0],\r\n [5 / 6, 0.5],\r\n [1, 0.5],\r\n [5 / 6, 1],\r\n [0.5, 1],\r\n [0, 0.5]\r\n ];\r\n }\r\n});\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvUmVnaXN0ZXJlZFNoYXBlL2xpbmtMaXN0Tm9kZS50cz9iMTk2Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEscUNBQTBCO0FBRzFCLGtCQUFlLFlBQUUsQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLEVBQUU7SUFDN0MsSUFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLO1FBQ1gsR0FBRyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWhDLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQ25CLE1BQU0sR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTNCLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFO1lBQ3ZDLEtBQUssRUFBRTtnQkFDSCxDQUFDLEVBQUUsS0FBSyxHQUFHLENBQUM7Z0JBQ1osQ0FBQyxFQUFFLE1BQU0sR0FBRyxDQUFDO2dCQUNiLEtBQUssRUFBRSxLQUFLO2dCQUNaLE1BQU0sRUFBRSxNQUFNO2dCQUNkLE1BQU0sRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sSUFBSSxNQUFNO2dCQUNsQyxJQUFJLEVBQUUsTUFBTTtnQkFDWixNQUFNLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNO2FBQzNCO1lBQ0QsSUFBSSxFQUFFLFNBQVM7U0FDbEIsQ0FBQyxDQUFDO1FBRUgsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUU7WUFDbkIsS0FBSyxFQUFFO2dCQUNILENBQUMsRUFBRSxLQUFLLEdBQUcsQ0FBQztnQkFDWixDQUFDLEVBQUUsTUFBTSxHQUFHLENBQUM7Z0JBQ2IsS0FBSyxFQUFFLEtBQUssR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3RCLE1BQU0sRUFBRSxNQUFNO2dCQUNkLElBQUksRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUk7Z0JBQ3BCLE1BQU0sRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sSUFBSSxNQUFNO2dCQUNsQyxNQUFNLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNO2FBQzNCO1lBQ0QsSUFBSSxFQUFFLFdBQVc7WUFDakIsU0FBUyxFQUFFLElBQUk7U0FDbEIsQ0FBQyxDQUFDO1FBRUgsSUFBSSxHQUFHLENBQUMsS0FBSyxFQUFFO1lBQ1gsTUFBTSxLQUFLLEdBQUcsQ0FBQyxHQUFHLENBQUMsUUFBUSxJQUFJLEdBQUcsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3pELEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFO2dCQUNuQixLQUFLLEVBQUU7b0JBQ0gsQ0FBQyxFQUFFLEtBQUssR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ2xCLENBQUMsRUFBRSxNQUFNO29CQUNULFNBQVMsRUFBRSxRQUFRO29CQUNuQixZQUFZLEVBQUUsUUFBUTtvQkFDdEIsSUFBSSxFQUFFLEdBQUcsQ0FBQyxLQUFLO29CQUNmLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxJQUFJLE1BQU07b0JBQzFCLFFBQVEsRUFBRSxLQUFLLENBQUMsUUFBUSxJQUFJLEVBQUU7aUJBQ2pDO2dCQUNELElBQUksRUFBRSxNQUFNO2dCQUNaLFNBQVMsRUFBRSxJQUFJO2FBQ2xCLENBQUMsQ0FBQztTQUNOO1FBRUQsT0FBTyxXQUFXLENBQUM7SUFDdkIsQ0FBQztJQUVELGVBQWU7UUFDWCxPQUFPO1lBQ0gsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBQ1IsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNWLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUM7WUFDWixDQUFDLENBQUMsRUFBRSxHQUFHLENBQUM7WUFDUixDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ1YsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBQ1IsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDO1NBQ1gsQ0FBQztJQUNOLENBQUM7Q0FDSixDQUFDLENBQUMiLCJmaWxlIjoiNTcwLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEc2IGZyb20gJ0BhbnR2L2c2JztcclxuXHJcblxyXG5leHBvcnQgZGVmYXVsdCBHNi5yZWdpc3Rlck5vZGUoJ2xpbmstbGlzdC1ub2RlJywge1xyXG4gICAgZHJhdyhjZmcsIGdyb3VwKSB7XHJcbiAgICAgICAgY2ZnLnNpemUgPSBjZmcuc2l6ZSB8fCBbMzAsIDEwXTtcclxuXHJcbiAgICAgICAgY29uc3Qgd2lkdGggPSBjZmcuc2l6ZVswXSxcclxuICAgICAgICAgICAgICBoZWlnaHQgPSBjZmcuc2l6ZVsxXTtcclxuICAgICAgICAgICAgICBcclxuICAgICAgICBjb25zdCB3cmFwcGVyUmVjdCA9IGdyb3VwLmFkZFNoYXBlKCdyZWN0Jywge1xyXG4gICAgICAgICAgICBhdHRyczoge1xyXG4gICAgICAgICAgICAgICAgeDogd2lkdGggLyAyLFxyXG4gICAgICAgICAgICAgICAgeTogaGVpZ2h0IC8gMixcclxuICAgICAgICAgICAgICAgIHdpZHRoOiB3aWR0aCxcclxuICAgICAgICAgICAgICAgIGhlaWdodDogaGVpZ2h0LFxyXG4gICAgICAgICAgICAgICAgc3Ryb2tlOiBjZmcuc3R5bGUuc3Ryb2tlIHx8ICcjMzMzJyxcclxuICAgICAgICAgICAgICAgIGZpbGw6ICcjZWVlJyxcclxuICAgICAgICAgICAgICAgIGN1cnNvcjogY2ZnLnN0eWxlLmN1cnNvclxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBuYW1lOiAnd3JhcHBlcidcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgZ3JvdXAuYWRkU2hhcGUoJ3JlY3QnLCB7XHJcbiAgICAgICAgICAgIGF0dHJzOiB7XHJcbiAgICAgICAgICAgICAgICB4OiB3aWR0aCAvIDIsXHJcbiAgICAgICAgICAgICAgICB5OiBoZWlnaHQgLyAyLFxyXG4gICAgICAgICAgICAgICAgd2lkdGg6IHdpZHRoICogKDIgLyAzKSxcclxuICAgICAgICAgICAgICAgIGhlaWdodDogaGVpZ2h0LFxyXG4gICAgICAgICAgICAgICAgZmlsbDogY2ZnLnN0eWxlLmZpbGwsXHJcbiAgICAgICAgICAgICAgICBzdHJva2U6IGNmZy5zdHlsZS5zdHJva2UgfHwgJyMzMzMnLFxyXG4gICAgICAgICAgICAgICAgY3Vyc29yOiBjZmcuc3R5bGUuY3Vyc29yXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIG5hbWU6ICdtYWluLXJlY3QnLFxyXG4gICAgICAgICAgICBkcmFnZ2FibGU6IHRydWVcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaWYgKGNmZy5sYWJlbCkge1xyXG4gICAgICAgICAgICBjb25zdCBzdHlsZSA9IChjZmcubGFiZWxDZmcgJiYgY2ZnLmxhYmVsQ2ZnLnN0eWxlKSB8fCB7fTtcclxuICAgICAgICAgICAgZ3JvdXAuYWRkU2hhcGUoJ3RleHQnLCB7XHJcbiAgICAgICAgICAgICAgICBhdHRyczoge1xyXG4gICAgICAgICAgICAgICAgICAgIHg6IHdpZHRoICogKDUgLyA2KSwgXHJcbiAgICAgICAgICAgICAgICAgICAgeTogaGVpZ2h0LFxyXG4gICAgICAgICAgICAgICAgICAgIHRleHRBbGlnbjogJ2NlbnRlcicsXHJcbiAgICAgICAgICAgICAgICAgICAgdGV4dEJhc2VsaW5lOiAnbWlkZGxlJyxcclxuICAgICAgICAgICAgICAgICAgICB0ZXh0OiBjZmcubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgZmlsbDogc3R5bGUuZmlsbCB8fCAnIzAwMCcsXHJcbiAgICAgICAgICAgICAgICAgICAgZm9udFNpemU6IHN0eWxlLmZvbnRTaXplIHx8IDE2XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgbmFtZTogJ3RleHQnLFxyXG4gICAgICAgICAgICAgICAgZHJhZ2dhYmxlOiB0cnVlXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHdyYXBwZXJSZWN0O1xyXG4gICAgfSxcclxuXHJcbiAgICBnZXRBbmNob3JQb2ludHMoKSB7XHJcbiAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgICAgWzAuNSwgMF0sXHJcbiAgICAgICAgICAgIFs1IC8gNiwgMF0sXHJcbiAgICAgICAgICAgIFs1IC8gNiwgMC41XSxcclxuICAgICAgICAgICAgWzEsIDAuNV0sXHJcbiAgICAgICAgICAgIFs1IC8gNiwgMV0sXHJcbiAgICAgICAgICAgIFswLjUsIDFdLFxyXG4gICAgICAgICAgICBbMCwgMC41XVxyXG4gICAgICAgIF07XHJcbiAgICB9XHJcbn0pOyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///570\n")},function(module,exports,__webpack_require__){"use strict";eval("\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nconst g6_1 = __webpack_require__(50);\r\nexports.default = g6_1.default.registerNode('binary-tree-node', {\r\n draw(cfg, group) {\r\n cfg.size = cfg.size;\r\n const width = cfg.size[0], height = cfg.size[1];\r\n const wrapperRect = group.addShape('rect', {\r\n attrs: {\r\n x: width / 2,\r\n y: height / 2,\r\n width: width,\r\n height: height,\r\n stroke: cfg.style.stroke || '#333',\r\n cursor: cfg.style.cursor,\r\n fill: '#eee'\r\n },\r\n name: 'wrapper'\r\n });\r\n group.addShape('rect', {\r\n attrs: {\r\n x: width / 4 + width / 2,\r\n y: height / 2,\r\n width: width / 2,\r\n height: height,\r\n fill: cfg.color || cfg.style.fill,\r\n stroke: cfg.style.stroke || '#333',\r\n cursor: cfg.style.cursor\r\n },\r\n name: 'mid',\r\n draggable: true\r\n });\r\n if (cfg.label) {\r\n const style = (cfg.labelCfg && cfg.labelCfg.style) || {};\r\n group.addShape('text', {\r\n attrs: {\r\n x: width,\r\n y: height,\r\n textAlign: 'center',\r\n textBaseline: 'middle',\r\n text: cfg.label,\r\n fill: style.fill || '#000',\r\n fontSize: style.fontSize || 16,\r\n cursor: cfg.style.cursor\r\n },\r\n name: 'text',\r\n draggable: true\r\n });\r\n }\r\n return wrapperRect;\r\n },\r\n getAnchorPoints() {\r\n return [\r\n [0.5, 0],\r\n [0.875, 0.5],\r\n [0.5, 1],\r\n [0.125, 0.5]\r\n ];\r\n },\r\n});\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvUmVnaXN0ZXJlZFNoYXBlL2JpbmFyeVRyZWVOb2RlLnRzPzZkMjQiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxxQ0FBMEI7QUFHMUIsa0JBQWUsWUFBRSxDQUFDLFlBQVksQ0FBQyxrQkFBa0IsRUFBRTtJQUMvQyxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUs7UUFDWCxHQUFHLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUM7UUFFcEIsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFDbkIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFM0IsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUU7WUFDdkMsS0FBSyxFQUFFO2dCQUNILENBQUMsRUFBRSxLQUFLLEdBQUcsQ0FBQztnQkFDWixDQUFDLEVBQUUsTUFBTSxHQUFHLENBQUM7Z0JBQ2IsS0FBSyxFQUFFLEtBQUs7Z0JBQ1osTUFBTSxFQUFFLE1BQU07Z0JBQ2QsTUFBTSxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxJQUFJLE1BQU07Z0JBQ2xDLE1BQU0sRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU07Z0JBQ3hCLElBQUksRUFBRSxNQUFNO2FBQ2Y7WUFDRCxJQUFJLEVBQUUsU0FBUztTQUNsQixDQUFDLENBQUM7UUFFSCxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRTtZQUNuQixLQUFLLEVBQUU7Z0JBQ0gsQ0FBQyxFQUFFLEtBQUssR0FBRyxDQUFDLEdBQUcsS0FBSyxHQUFHLENBQUM7Z0JBQ3hCLENBQUMsRUFBRSxNQUFNLEdBQUcsQ0FBQztnQkFDYixLQUFLLEVBQUUsS0FBSyxHQUFHLENBQUM7Z0JBQ2hCLE1BQU0sRUFBRSxNQUFNO2dCQUNkLElBQUksRUFBRSxHQUFHLENBQUMsS0FBSyxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSTtnQkFDakMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxJQUFJLE1BQU07Z0JBQ2xDLE1BQU0sRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU07YUFDM0I7WUFDRCxJQUFJLEVBQUUsS0FBSztZQUNYLFNBQVMsRUFBRSxJQUFJO1NBQ2xCLENBQUMsQ0FBQztRQUVILElBQUksR0FBRyxDQUFDLEtBQUssRUFBRTtZQUNYLE1BQU0sS0FBSyxHQUFHLENBQUMsR0FBRyxDQUFDLFFBQVEsSUFBSSxHQUFHLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN6RCxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRTtnQkFDbkIsS0FBSyxFQUFFO29CQUNILENBQUMsRUFBRSxLQUFLO29CQUNSLENBQUMsRUFBRSxNQUFNO29CQUNULFNBQVMsRUFBRSxRQUFRO29CQUNuQixZQUFZLEVBQUUsUUFBUTtvQkFDdEIsSUFBSSxFQUFFLEdBQUcsQ0FBQyxLQUFLO29CQUNmLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxJQUFJLE1BQU07b0JBQzFCLFFBQVEsRUFBRSxLQUFLLENBQUMsUUFBUSxJQUFJLEVBQUU7b0JBQzlCLE1BQU0sRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU07aUJBQzNCO2dCQUNELElBQUksRUFBRSxNQUFNO2dCQUNaLFNBQVMsRUFBRSxJQUFJO2FBQ2xCLENBQUMsQ0FBQztTQUNOO1FBRUQsT0FBTyxXQUFXLENBQUM7SUFDdkIsQ0FBQztJQUVELGVBQWU7UUFDWCxPQUFPO1lBQ0gsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBQ1IsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDO1lBQ1osQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBQ1IsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDO1NBQ2YsQ0FBQztJQUNOLENBQUM7Q0FDSixDQUFDLENBQUMiLCJmaWxlIjoiNTcxLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEc2IGZyb20gJ0BhbnR2L2c2JztcclxuXHJcblxyXG5leHBvcnQgZGVmYXVsdCBHNi5yZWdpc3Rlck5vZGUoJ2JpbmFyeS10cmVlLW5vZGUnLCB7XHJcbiAgICBkcmF3KGNmZywgZ3JvdXApIHtcclxuICAgICAgICBjZmcuc2l6ZSA9IGNmZy5zaXplO1xyXG5cclxuICAgICAgICBjb25zdCB3aWR0aCA9IGNmZy5zaXplWzBdLFxyXG4gICAgICAgICAgICAgIGhlaWdodCA9IGNmZy5zaXplWzFdO1xyXG5cclxuICAgICAgICBjb25zdCB3cmFwcGVyUmVjdCA9IGdyb3VwLmFkZFNoYXBlKCdyZWN0Jywge1xyXG4gICAgICAgICAgICBhdHRyczoge1xyXG4gICAgICAgICAgICAgICAgeDogd2lkdGggLyAyLFxyXG4gICAgICAgICAgICAgICAgeTogaGVpZ2h0IC8gMixcclxuICAgICAgICAgICAgICAgIHdpZHRoOiB3aWR0aCxcclxuICAgICAgICAgICAgICAgIGhlaWdodDogaGVpZ2h0LFxyXG4gICAgICAgICAgICAgICAgc3Ryb2tlOiBjZmcuc3R5bGUuc3Ryb2tlIHx8ICcjMzMzJyxcclxuICAgICAgICAgICAgICAgIGN1cnNvcjogY2ZnLnN0eWxlLmN1cnNvcixcclxuICAgICAgICAgICAgICAgIGZpbGw6ICcjZWVlJ1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBuYW1lOiAnd3JhcHBlcidcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgZ3JvdXAuYWRkU2hhcGUoJ3JlY3QnLCB7XHJcbiAgICAgICAgICAgIGF0dHJzOiB7XHJcbiAgICAgICAgICAgICAgICB4OiB3aWR0aCAvIDQgKyB3aWR0aCAvIDIsXHJcbiAgICAgICAgICAgICAgICB5OiBoZWlnaHQgLyAyLFxyXG4gICAgICAgICAgICAgICAgd2lkdGg6IHdpZHRoIC8gMixcclxuICAgICAgICAgICAgICAgIGhlaWdodDogaGVpZ2h0LFxyXG4gICAgICAgICAgICAgICAgZmlsbDogY2ZnLmNvbG9yIHx8IGNmZy5zdHlsZS5maWxsLFxyXG4gICAgICAgICAgICAgICAgc3Ryb2tlOiBjZmcuc3R5bGUuc3Ryb2tlIHx8ICcjMzMzJyxcclxuICAgICAgICAgICAgICAgIGN1cnNvcjogY2ZnLnN0eWxlLmN1cnNvclxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBuYW1lOiAnbWlkJyxcclxuICAgICAgICAgICAgZHJhZ2dhYmxlOiB0cnVlXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGlmIChjZmcubGFiZWwpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3R5bGUgPSAoY2ZnLmxhYmVsQ2ZnICYmIGNmZy5sYWJlbENmZy5zdHlsZSkgfHwge307XHJcbiAgICAgICAgICAgIGdyb3VwLmFkZFNoYXBlKCd0ZXh0Jywge1xyXG4gICAgICAgICAgICAgICAgYXR0cnM6IHtcclxuICAgICAgICAgICAgICAgICAgICB4OiB3aWR0aCwgLy8g5bGF5LitXHJcbiAgICAgICAgICAgICAgICAgICAgeTogaGVpZ2h0LFxyXG4gICAgICAgICAgICAgICAgICAgIHRleHRBbGlnbjogJ2NlbnRlcicsXHJcbiAgICAgICAgICAgICAgICAgICAgdGV4dEJhc2VsaW5lOiAnbWlkZGxlJyxcclxuICAgICAgICAgICAgICAgICAgICB0ZXh0OiBjZmcubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgZmlsbDogc3R5bGUuZmlsbCB8fCAnIzAwMCcsXHJcbiAgICAgICAgICAgICAgICAgICAgZm9udFNpemU6IHN0eWxlLmZvbnRTaXplIHx8IDE2LFxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnNvcjogY2ZnLnN0eWxlLmN1cnNvclxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIG5hbWU6ICd0ZXh0JyxcclxuICAgICAgICAgICAgICAgIGRyYWdnYWJsZTogdHJ1ZVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB3cmFwcGVyUmVjdDtcclxuICAgIH0sXHJcblxyXG4gICAgZ2V0QW5jaG9yUG9pbnRzKCkge1xyXG4gICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgIFswLjUsIDBdLFxyXG4gICAgICAgICAgICBbMC44NzUsIDAuNV0sXHJcbiAgICAgICAgICAgIFswLjUsIDFdLFxyXG4gICAgICAgICAgICBbMC4xMjUsIDAuNV1cclxuICAgICAgICBdO1xyXG4gICAgfSxcclxufSk7Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///571\n")},function(module,exports,__webpack_require__){"use strict";eval("\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nconst g6_1 = __webpack_require__(50);\r\nexports.default = g6_1.default.registerNode('clen-queue-pointer', {\r\n draw(cfg, group) {\r\n let id = cfg.id;\r\n const index = parseInt(id.split('-')[1]);\r\n const len = parseInt(id.split('-')[2]);\r\n const keyShape = group.addShape('path', {\r\n attrs: {\r\n x: 0,\r\n y: 0,\r\n path: this.getPath(cfg),\r\n fill: cfg.style.fill,\r\n },\r\n name: 'pointer-path'\r\n });\r\n const angle = index * Math.PI * 2 / len;\r\n if (cfg.label) {\r\n const style = (cfg.labelCfg && cfg.labelCfg.style) || {};\r\n const bgRect = group.addShape('rect', {\r\n attrs: {\r\n x: 0,\r\n y: 0,\r\n width: 0,\r\n height: 0,\r\n text: cfg.label,\r\n fill: null,\r\n radius: 2\r\n },\r\n name: 'bgRect'\r\n });\r\n let label = cfg.label;\r\n let pointerText = label.split('-')[0];\r\n let y = pointerText == \"front\" ? 30 : 15;\r\n const text = group.addShape('text', {\r\n attrs: {\r\n x: culcuRotate(Math.PI / 2 - angle, y).offsetX,\r\n y: culcuRotate(Math.PI / 2 - angle, y).offsetY,\r\n textAlign: 'center',\r\n textBaseline: 'middle',\r\n text: pointerText,\r\n fill: style.fill || '#999',\r\n fontSize: style.fontSize || 16\r\n },\r\n name: 'pointer-text-shape'\r\n });\r\n translate(text, 0, -75, g6_1.default.Util.transform);\r\n }\r\n rotate(keyShape, angle, g6_1.default.Util.transform);\r\n translate(keyShape, 0, -75, g6_1.default.Util.transform);\r\n return keyShape;\r\n },\r\n getPath(cfg) {\r\n let width = 1, height = 38, arrowWidth = width + 4, arrowHeight = height * 0.3;\r\n const path = [\r\n ['M', 0, 0],\r\n ['L', -width / 2, 0],\r\n ['L', -width / 2, -height],\r\n ['L', -width / 2 - (arrowWidth / 2), -height],\r\n ['L', 0, -height - arrowHeight],\r\n ['L', width / 2 + (arrowWidth / 2), -height],\r\n ['L', width / 2, -height],\r\n ['L', width / 2, 0],\r\n ['Z'],\r\n ];\r\n return path;\r\n },\r\n});\r\nfunction rotate(shape, angle, transform) {\r\n const matrix1 = shape.getMatrix();\r\n const newMatrix1 = transform(matrix1, [\r\n ['r', angle],\r\n ]);\r\n shape.setMatrix(newMatrix1);\r\n}\r\nfunction translate(shape, x, y, transform) {\r\n const matrix1 = shape.getMatrix();\r\n const newMatrix1 = transform(matrix1, [\r\n ['t', x, y],\r\n ]);\r\n shape.setMatrix(newMatrix1);\r\n}\r\nfunction culcuRotate(angle, R) {\r\n let offsetX = Math.cos(angle) * R;\r\n let offsetY = -Math.sin(angle) * R;\r\n console.log(offsetX, offsetY, R);\r\n return {\r\n offsetX,\r\n offsetY,\r\n };\r\n}\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvUmVnaXN0ZXJlZFNoYXBlL2NsZW5RdWV1ZVBvaW50ZXIudHM/ZGQ4OSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHFDQUEwQjtBQUcxQixrQkFBZSxZQUFFLENBQUMsWUFBWSxDQUFDLG9CQUFvQixFQUFFO0lBQ2pELElBQUksQ0FBQyxHQUFHLEVBQUUsS0FBSztRQUNYLElBQUksRUFBRSxHQUFHLEdBQUcsQ0FBQyxFQUFZLENBQUM7UUFFMUIsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN6QyxNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3ZDLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFO1lBQ3BDLEtBQUssRUFBRTtnQkFDSCxDQUFDLEVBQUUsQ0FBQztnQkFDSixDQUFDLEVBQUUsQ0FBQztnQkFDSixJQUFJLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUM7Z0JBQ3ZCLElBQUksRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUk7YUFFdkI7WUFDRCxJQUFJLEVBQUUsY0FBYztTQUN2QixDQUFDLENBQUM7UUFFSCxNQUFNLEtBQUssR0FBRyxLQUFLLEdBQUksSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ3pDLElBQUksR0FBRyxDQUFDLEtBQUssRUFBRTtZQUNYLE1BQU0sS0FBSyxHQUFHLENBQUMsR0FBRyxDQUFDLFFBQVEsSUFBSSxHQUFHLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUV6RCxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRTtnQkFDbEMsS0FB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Q0FBQztDQUVKLENBQUMsQ0FBQztBQUdILFNBQVMsTUFBTSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsU0FBUztJQUNuQyxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDbEMsTUFBTSxVQUFVLEdBQUcsU0FBUyxDQUFDLE9BQU8sRUFBRTtRQUNsQyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUM7S0FDZixDQUFDLENBQUM7SUFDSCxLQUFLLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQ2hDLENBQUM7QUFDRCxTQUFTLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxTQUFTO0lBQ3JDLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUNsQyxNQUFNLFVBQVUsR0FBRyxTQUFTLENBQUMsT0FBTyxFQUFFO1FBQ2xDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7S0FDZCxDQUFDLENBQUM7SUFDSCxLQUFLLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQ2hDLENBQUM7QUFDRCxTQUFTLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUN6QixJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNsQyxJQUFJLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ25DLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNqQyxPQUFPO1FBQ0gsT0FBTztRQUNQLE9BQU87S0FDVjtBQUNMLENBQUMiLCJmaWxlIjoiNTcyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEc2IGZyb20gJ0BhbnR2L2c2JztcclxuXHJcblxyXG5leHBvcnQgZGVmYXVsdCBHNi5yZWdpc3Rlck5vZGUoJ2NsZW4tcXVldWUtcG9pbnRlcicsIHtcclxuICAgIGRyYXcoY2ZnLCBncm91cCkge1xyXG4gICAgICAgIGxldCBpZCA9IGNmZy5pZCBhcyBzdHJpbmc7XHJcblxyXG4gICAgICAgIGNvbnN0IGluZGV4ID0gcGFyc2VJbnQoaWQuc3BsaXQoJy0nKVsxXSk7XHJcbiAgICAgICAgY29uc3QgbGVuID0gcGFyc2VJbnQoaWQuc3BsaXQoJy0nKVsyXSk7XHJcbiAgICAgICAgY29uc3Qga2V5U2hhcGUgPSBncm91cC5hZGRTaGFwZSgncGF0aCcsIHtcclxuICAgICAgICAgICAgYXR0cnM6IHtcclxuICAgICAgICAgICAgICAgIHg6IDAsXHJcbiAgICAgICAgICAgICAgICB5OiAwLFxyXG4gICAgICAgICAgICAgICAgcGF0aDogdGhpcy5nZXRQYXRoKGNmZyksXHJcbiAgICAgICAgICAgICAgICBmaWxsOiBjZmcuc3R5bGUuZmlsbCxcclxuICAgICAgICAgICAgICAgIC8vIG1hdHJpeDogY2ZnLnN0eWxlLm1hdHJpeFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBuYW1lOiAncG9pbnRlci1wYXRoJ1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBjb25zdCBhbmdsZSA9IGluZGV4ICogIE1hdGguUEkgKiAyIC8gbGVuO1xyXG4gICAgICAgIGlmIChjZmcubGFiZWwpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3R5bGUgPSAoY2ZnLmxhYmVsQ2ZnICYmIGNmZy5sYWJlbENmZy5zdHlsZSkgfHwge307XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBjb25zdCBiZ1JlY3QgPSBncm91cC5hZGRTaGFwZSgncmVjdCcsIHtcclxuICAgICAgICAgICAgICAgIGF0dHJzOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgeDogMCwgXHJcbiAgICAgICAgICAgICAgICAgICAgeTogMCxcclxuICAgICAgICAgICAgICAgICAgICB3aWR0aDogMCxcclxuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogY2ZnLmxhYmVsLFxyXG4gICAgICAgICAgICAgICAgICAgIGZpbGw6IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgcmFkaXVzOiAyXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgbmFtZTogJ2JnUmVjdCdcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBsZXQgbGFiZWwgPSBjZmcubGFiZWwgYXMgc3RyaW5nO1xyXG5cclxuICAgICAgICAgICAgbGV0IHBvaW50ZXJUZXh0ID0gbGFiZWwuc3BsaXQoJy0nKVswXTtcclxuICAgICAgICAgICAgbGV0IHkgPSBwb2ludGVyVGV4dD09XCJmcm9udFwiPzMwOjE1O1xyXG4gICAgICAgICAgICBjb25zdCB0ZXh0ID0gZ3JvdXAuYWRkU2hhcGUoJ3RleHQnLCB7XHJcbiAgICAgICAgICAgICAgICBhdHRyczoge1xyXG4gICAgICAgICAgICAgICAgICAgIHg6IGN1bGN1Um90YXRlKE1hdGguUEkvMiAtIGFuZ2xlLCB5KS5vZmZzZXRYLCBcclxuICAgICAgICAgICAgICAgICAgICB5OiBjdWxjdVJvdGF0ZShNYXRoLlBJLzIgLSBhbmdsZSwgeSkub2Zmc2V0WSxcclxuICAgICAgICAgICAgICAgICAgICAvLyB4OiAwLCBcclxuICAgICAgICAgICAgICAgICAgICAvLyB5OiAwLFxyXG4gICAgICAgICAgICAgICAgICAgIHRleHRBbGlnbjogJ2NlbnRlcicsXHJcbiAgICAgICAgICAgICAgICAgICAgdGV4dEJhc2VsaW5lOiAnbWlkZGxlJyxcclxuICAgICAgICAgICAgICAgICAgICB0ZXh0OiBwb2ludGVyVGV4dCxcclxuICAgICAgICAgICAgICAgICAgICBmaWxsOiBzdHlsZS5maWxsIHx8ICcjOTk5JyxcclxuICAgICAgICAgICAgICAgICAgICBmb250U2l6ZTogc3R5bGUuZm9udFNpemUgfHwgMTZcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBuYW1lOiAncG9pbnRlci10ZXh0LXNoYXBlJ1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIC8vIHJvdGF0ZSh0ZXh0LCBhbmdsZSwgRzYuVXRpbC50cmFuc2Zvcm0pO1xyXG4gICAgICAgICAgICB0cmFuc2xhdGUodGV4dCwgMCwgLTc1LCBHNi5VdGlsLnRyYW5zZm9ybSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJvdGF0ZShrZXlTaGFwZSwgYW5nbGUsIEc2LlV0aWwudHJhbnNmb3JtKTtcclxuICAgICAgICB0cmFuc2xhdGUoa2V5U2hhcGUsIDAsIC03NSwgRzYuVXRpbC50cmFuc2Zvcm0pO1xyXG5cclxuICAgICAgICByZXR1cm4ga2V5U2hhcGU7XHJcblxyXG4gICAgICAgIFxyXG4gICAgfSxcclxuICAgIFxyXG4gICAgZ2V0UGF0aChjZmcpIHtcclxuICAgICAgICBsZXQgd2lkdGggPSAxLFxyXG4gICAgICAgICAgICBoZWlnaHQgPSAzOCxcclxuICAgICAgICAgICAgYXJyb3dXaWR0aCA9IHdpZHRoICsgNCxcclxuICAgICAgICAgICAgYXJyb3dIZWlnaHQgPSBoZWlnaHQgKiAwLjM7XHJcblxyXG4gICAgICAgIGNvbnN0IHBhdGggPSBbXHJcbiAgICAgICAgICAgIFsnTScsIDAsIDBdLCBcclxuICAgICAgICAgICAgWydMJywgLXdpZHRoIC8gMiwgMF0sXHJcbiAgICAgICAgICAgIFsnTCcsIC13aWR0aCAvIDIsIC1oZWlnaHRdLFxyXG4gICAgICAgICAgICBbJ0wnLCAtd2lkdGggLyAyIC0gKGFycm93V2lkdGggLyAyKSwgLWhlaWdodF0sXHJcbiAgICAgICAgICAgIFsnTCcsIDAsIC1oZWlnaHQtYXJyb3dIZWlnaHRdLFxyXG4gICAgICAgICAgICBbJ0wnLCB3aWR0aCAvIDIgKyAoYXJyb3dXaWR0aCAvIDIpLCAtaGVpZ2h0XSxcclxuICAgICAgICAgICAgWydMJywgd2lkdGggLyAyLCAtaGVpZ2h0XSxcclxuICAgICAgICAgICAgWydMJywgd2lkdGggLyAyLCAwXSxcclxuICAgICAgICAgICAgWydaJ10sIFxyXG4gICAgICAgIF07XHJcblxyXG4gICAgICAgIHJldHVybiBwYXRoO1xyXG4gICAgfSxcclxuXHJcbn0pO1xyXG5cclxuICAgICAgICBcclxuZnVuY3Rpb24gcm90YXRlKHNoYXBlLCBhbmdsZSwgdHJhbnNmb3JtKSB7XHJcbiAgICBjb25zdCBtYXRyaXgxID0gc2hhcGUuZ2V0TWF0cml4KCk7XHJcbiAgICBjb25zdCBuZXdNYXRyaXgxID0gdHJhbnNmb3JtKG1hdHJpeDEsIFtcclxuICAgICAgICBbJ3InLCBhbmdsZV0sXHJcbiAgICBdKTtcclxuICAgIHNoYXBlLnNldE1hdHJpeChuZXdNYXRyaXgxKTtcclxufVxyXG5mdW5jdGlvbiB0cmFuc2xhdGUoc2hhcGUsIHgsIHksIHRyYW5zZm9ybSkge1xyXG4gICAgY29uc3QgbWF0cml4MSA9IHNoYXBlLmdldE1hdHJpeCgpO1xyXG4gICAgY29uc3QgbmV3TWF0cml4MSA9IHRyYW5zZm9ybShtYXRyaXgxLCBbXHJcbiAgICAgICAgWyd0JywgeCwgeV0sXHJcbiAgICBdKTtcclxuICAgIHNoYXBlLnNldE1hdHJpeChuZXdNYXRyaXgxKTtcclxufVxyXG5mdW5jdGlvbiBjdWxjdVJvdGF0ZShhbmdsZSwgUikge1xyXG4gICAgbGV0IG9mZnNldFggPSBNYXRoLmNvcyhhbmdsZSkgKiBSO1xyXG4gICAgbGV0IG9mZnNldFkgPSAtTWF0aC5zaW4oYW5nbGUpICogUjtcclxuICAgIGNvbnNvbGUubG9nKG9mZnNldFgsIG9mZnNldFksIFIpO1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBvZmZzZXRYLFxyXG4gICAgICAgIG9mZnNldFksXHJcbiAgICB9XHJcbn0iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///572\n")},function(module,exports,__webpack_require__){"use strict";eval("\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nconst g6_1 = __webpack_require__(50);\r\nexports.default = g6_1.default.registerNode('two-cell-node', {\r\n draw(cfg, group) {\r\n cfg.size = cfg.size || [30, 10];\r\n const width = cfg.size[0], height = cfg.size[1];\r\n const wrapperRect = group.addShape('rect', {\r\n attrs: {\r\n x: width / 2,\r\n y: height / 2,\r\n width: width,\r\n height: height,\r\n stroke: cfg.style.stroke,\r\n fill: '#eee'\r\n },\r\n name: 'wrapper'\r\n });\r\n group.addShape('rect', {\r\n attrs: {\r\n x: width / 2,\r\n y: height / 2,\r\n width: width / 2,\r\n height: height,\r\n fill: cfg.style.fill,\r\n stroke: cfg.style.stroke\r\n },\r\n name: 'left-rect',\r\n draggable: true\r\n });\r\n const style = (cfg.labelCfg && cfg.labelCfg.style) || {};\r\n if (cfg.label) {\r\n if (Array.isArray(cfg.label)) {\r\n let tag = cfg.label[0], data = cfg.label[1];\r\n group.addShape('text', {\r\n attrs: {\r\n x: width * (3 / 4),\r\n y: height,\r\n textAlign: 'center',\r\n textBaseline: 'middle',\r\n text: tag,\r\n fill: style.fill || '#000',\r\n fontSize: style.fontSize || 16,\r\n cursor: cfg.style.cursor,\r\n },\r\n name: 'text',\r\n draggable: true\r\n });\r\n group.addShape('text', {\r\n attrs: {\r\n x: width * (5 / 4),\r\n y: height,\r\n textAlign: 'center',\r\n textBaseline: 'middle',\r\n text: data,\r\n fill: style.fill || '#000',\r\n fontSize: style.fontSize || 16,\r\n cursor: cfg.style.cursor,\r\n },\r\n name: 'text',\r\n draggable: true\r\n });\r\n }\r\n else {\r\n group.addShape('text', {\r\n attrs: {\r\n x: width * (3 / 4),\r\n y: height,\r\n textAlign: 'center',\r\n textBaseline: 'middle',\r\n text: cfg.label,\r\n fill: style.fill || '#000',\r\n fontSize: style.fontSize || 16,\r\n cursor: cfg.style.cursor,\r\n },\r\n name: 'text',\r\n draggable: true\r\n });\r\n }\r\n }\r\n return wrapperRect;\r\n },\r\n getAnchorPoints() {\r\n return [\r\n [0.5, 0],\r\n [3 / 4, 0.5],\r\n [0.5, 1],\r\n [0, 0.5]\r\n ];\r\n }\r\n});\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvUmVnaXN0ZXJlZFNoYXBlL3R3b0NlbGxOb2RlLnRzP2RlYjMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxxQ0FBMEI7QUFJMUIsa0JBQWUsWUFBRSxDQUFDLFlBQVksQ0FBQyxlQUFlLEVBQUU7SUFDNUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLO1FBQ1gsR0FBRyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWhDLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQ25CLE1BQU0sR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTNCLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFO1lBQ3ZDLEtBQUssRUFBRTtnQkFDSCxDQUFDLEVBQUUsS0FBSyxHQUFHLENBQUM7Z0JBQ1osQ0FBQyxFQUFFLE1BQU0sR0FBRyxDQUFDO2dCQUNiLEtBQUssRUFBRSxLQUFLO2dCQUNaLE1BQU0sRUFBRSxNQUFNO2dCQUNkLE1BQU0sRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU07Z0JBQ3hCLElBQUksRUFBRSxNQUFNO2FBQ2Y7WUFDRCxJQUFJLEVBQUUsU0FBUztTQUNsQixDQUFDLENBQUM7UUFFSCxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRTtZQUNuQixLQUFLLEVBQUU7Z0JBQ0gsQ0FBQyxFQUFFLEtBQUssR0FBRyxDQUFDO2dCQUNaLENBQUMsRUFBRSxNQUFNLEdBQUcsQ0FBQztnQkFDYixLQUFLLEVBQUUsS0FBSyxHQUFHLENBQUM7Z0JBQ2hCLE1BQU0sRUFBRSxNQUFNO2dCQUNkLElBQUksRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUk7Z0JBQ3BCLE1BQU0sRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU07YUFDM0I7WUFDRCxJQUFJLEVBQUUsV0FBVztZQUNqQixTQUFTLEVBQUUsSUFBSTtTQUNsQixDQUFDLENBQUM7UUFFSCxNQUFNLEtBQUssR0FBRyxDQUFDLEdBQUcsQ0FBQyxRQUFRLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7UUFFekQsSUFBSSxHQUFHLENBQUMsS0FBSyxFQUFFO1lBQ1gsSUFBRyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDekIsSUFBSSxHQUFHLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFFNUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUU7b0JBQ25CLEtBQUssRUFBRTt3QkFDSCxDQUFDLEVBQUUsS0FBSyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQzt3QkFDbEIsQ0FBQyxFQUFFLE1BQU07d0JBQ1QsU0FBUyxFQUFFLFFBQVE7d0JBQ25CLFlBQVksRUFBRSxRQUFRO3dCQUN0QixJQUFJLEVBQUUsR0FBRzt3QkFDVCxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksSUFBSSxNQUFNO3dCQUMxQixRQUFRLEVBQUUsS0FBSyxDQUFDLFFBQVEsSUFBSSxFQUFFO3dCQUM5QixNQUFNLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNO3FCQUMzQjtvQkFDRCxJQUFJLEVBQUUsTUFBTTtvQkFDWixTQUFTLEVBQUUsSUFBSTtpQkFDbEIsQ0FBQyxDQUFDO2dCQUVILEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFO29CQUNuQixLQUFLLEVBQUU7d0JBQ0gsQ0FBQyxFQUFFLEtBQUssR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7d0JBQ2xCLENBQUMsRUFBRSxNQUFNO3dCQUNULFNBQVMsRUFBRSxRQUFRO3dCQUNuQixZQUFZLEVBQUUsUUFBUTt3QkFDdEIsSUFBSSxFQUFFLElBQUk7d0JBQ1YsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLElBQUksTUFBTTt3QkFDMUIsUUFBUSxFQUFFLEtBQUssQ0FBQyxRQUFRLElBQUksRUFBRTt3QkFDOUIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTTtxQkFDM0I7b0JBQ0QsSUFBSSxFQUFFLE1BQU07b0JBQ1osU0FBUyxFQUFFLElBQUk7aUJBQ2xCLENBQUMsQ0FBQzthQUNOO2lCQUNJO2dCQUNELEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFO29CQUNuQixLQUFLLEVBQUU7d0JBQ0gsQ0FBQyxFQUFFLEtBQUssR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7d0JBQ2xCLENBQUMsRUFBRSxNQUFNO3dCQUNULFNBQVMsRUFBRSxRQUFRO3dCQUNuQixZQUFZLEVBQUUsUUFBUTt3QkFDdEIsSUFBSSxFQUFFLEdBQUcsQ0FBQyxLQUFLO3dCQUNmLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxJQUFJLE1BQU07d0JBQzFCLFFBQVEsRUFBRSxLQUFLLENBQUMsUUFBUSxJQUFJLEVBQUU7d0JBQzlCLE1BQU0sRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU07cUJBQzNCO29CQUNELElBQUksRUFBRSxNQUFNO29CQUNaLFNBQVMsRUFBRSxJQUFJO2lCQUNsQixDQUFDLENBQUM7YUFDTjtTQUNKO1FBRUQsT0FBTyxXQUFXLENBQUM7SUFDdkIsQ0FBQztJQUVELGVBQWU7UUFDWCxPQUFPO1lBQ0gsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBQ1IsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQztZQUNaLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztZQUNSLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQztTQUNYLENBQUM7SUFDTixDQUFDO0NBQ0osQ0FBQyxDQUFDIiwiZmlsZSI6IjU3My5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBHNiBmcm9tICdAYW50di9nNic7XHJcblxyXG5cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEc2LnJlZ2lzdGVyTm9kZSgndHdvLWNlbGwtbm9kZScsIHtcclxuICAgIGRyYXcoY2ZnLCBncm91cCkge1xyXG4gICAgICAgIGNmZy5zaXplID0gY2ZnLnNpemUgfHwgWzMwLCAxMF07XHJcblxyXG4gICAgICAgIGNvbnN0IHdpZHRoID0gY2ZnLnNpemVbMF0sXHJcbiAgICAgICAgICAgICAgaGVpZ2h0ID0gY2ZnLnNpemVbMV07XHJcblxyXG4gICAgICAgIGNvbnN0IHdyYXBwZXJSZWN0ID0gZ3JvdXAuYWRkU2hhcGUoJ3JlY3QnLCB7XHJcbiAgICAgICAgICAgIGF0dHJzOiB7XHJcbiAgICAgICAgICAgICAgICB4OiB3aWR0aCAvIDIsXHJcbiAgICAgICAgICAgICAgICB5OiBoZWlnaHQgLyAyLFxyXG4gICAgICAgICAgICAgICAgd2lkdGg6IHdpZHRoLFxyXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiBoZWlnaHQsXHJcbiAgICAgICAgICAgICAgICBzdHJva2U6IGNmZy5zdHlsZS5zdHJva2UsXHJcbiAgICAgICAgICAgICAgICBmaWxsOiAnI2VlZSdcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgbmFtZTogJ3dyYXBwZXInXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGdyb3VwLmFkZFNoYXBlKCdyZWN0Jywge1xyXG4gICAgICAgICAgICBhdHRyczoge1xyXG4gICAgICAgICAgICAgICAgeDogd2lkdGggLyAyLFxyXG4gICAgICAgICAgICAgICAgeTogaGVpZ2h0IC8gMixcclxuICAgICAgICAgICAgICAgIHdpZHRoOiB3aWR0aCAvIDIsXHJcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IGhlaWdodCxcclxuICAgICAgICAgICAgICAgIGZpbGw6IGNmZy5zdHlsZS5maWxsLFxyXG4gICAgICAgICAgICAgICAgc3Ryb2tlOiBjZmcuc3R5bGUuc3Ryb2tlXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIG5hbWU6ICdsZWZ0LXJlY3QnLFxyXG4gICAgICAgICAgICBkcmFnZ2FibGU6IHRydWVcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgY29uc3Qgc3R5bGUgPSAoY2ZnLmxhYmVsQ2ZnICYmIGNmZy5sYWJlbENmZy5zdHlsZSkgfHwge307XHJcblxyXG4gICAgICAgIGlmIChjZmcubGFiZWwpIHtcclxuICAgICAgICAgICAgaWYoQXJyYXkuaXNBcnJheShjZmcubGFiZWwpKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgdGFnID0gY2ZnLmxhYmVsWzBdLCBkYXRhID0gY2ZnLmxhYmVsWzFdO1xyXG5cclxuICAgICAgICAgICAgICAgIGdyb3VwLmFkZFNoYXBlKCd0ZXh0Jywge1xyXG4gICAgICAgICAgICAgICAgICAgIGF0dHJzOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHg6IHdpZHRoICogKDMgLyA0KSwgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHk6IGhlaWdodCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dEFsaWduOiAnY2VudGVyJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dEJhc2VsaW5lOiAnbWlkZGxlJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogdGFnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxsOiBzdHlsZS5maWxsIHx8ICcjMDAwJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9udFNpemU6IHN0eWxlLmZvbnRTaXplIHx8IDE2LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJzb3I6IGNmZy5zdHlsZS5jdXJzb3IsXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICBuYW1lOiAndGV4dCcsXHJcbiAgICAgICAgICAgICAgICAgICAgZHJhZ2dhYmxlOiB0cnVlXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICBncm91cC5hZGRTaGFwZSgndGV4dCcsIHtcclxuICAgICAgICAgICAgICAgICAgICBhdHRyczoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB4OiB3aWR0aCAqICg1IC8gNCksIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB5OiBoZWlnaHQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHRBbGlnbjogJ2NlbnRlcicsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHRCYXNlbGluZTogJ21pZGRsZScsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IGRhdGEsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw6IHN0eWxlLmZpbGwgfHwgJyMwMDAnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb250U2l6ZTogc3R5bGUuZm9udFNpemUgfHwgMTYsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvcjogY2ZnLnN0eWxlLmN1cnNvcixcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICd0ZXh0JyxcclxuICAgICAgICAgICAgICAgICAgICBkcmFnZ2FibGU6IHRydWVcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZ3JvdXAuYWRkU2hhcGUoJ3RleHQnLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXR0cnM6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgeDogd2lkdGggKiAoMyAvIDQpLCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgeTogaGVpZ2h0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0QWxpZ246ICdjZW50ZXInLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0QmFzZWxpbmU6ICdtaWRkbGUnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBjZmcubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw6IHN0eWxlLmZpbGwgfHwgJyMwMDAnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb250U2l6ZTogc3R5bGUuZm9udFNpemUgfHwgMTYsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvcjogY2ZnLnN0eWxlLmN1cnNvcixcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICd0ZXh0JyxcclxuICAgICAgICAgICAgICAgICAgICBkcmFnZ2FibGU6IHRydWVcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gd3JhcHBlclJlY3Q7XHJcbiAgICB9LFxyXG5cclxuICAgIGdldEFuY2hvclBvaW50cygpIHtcclxuICAgICAgICByZXR1cm4gW1xyXG4gICAgICAgICAgICBbMC41LCAwXSxcclxuICAgICAgICAgICAgWzMgLyA0LCAwLjVdLFxyXG4gICAgICAgICAgICBbMC41LCAxXSxcclxuICAgICAgICAgICAgWzAsIDAuNV1cclxuICAgICAgICBdO1xyXG4gICAgfVxyXG59KTsiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///573\n")},function(module,exports,__webpack_require__){"use strict";eval("\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nconst g6_1 = __webpack_require__(50);\r\nexports.default = g6_1.default.registerNode('cursor', {\r\n draw(cfg, group) {\r\n const keyShape = group.addShape('path', {\r\n attrs: {\r\n path: this.getPath(cfg),\r\n fill: cfg.style.fill,\r\n matrix: cfg.style.matrix\r\n },\r\n name: 'cursor-path'\r\n });\r\n if (cfg.label) {\r\n const style = (cfg.labelCfg && cfg.labelCfg.style) || {};\r\n const bgRect = group.addShape('rect', {\r\n attrs: {\r\n x: 0,\r\n y: 0,\r\n text: cfg.label,\r\n fill: '#fafafa',\r\n radius: 2,\r\n },\r\n name: 'bgRect'\r\n });\r\n const text = group.addShape('text', {\r\n attrs: {\r\n x: 0,\r\n y: 0,\r\n textAlign: 'center',\r\n textBaseline: 'middle',\r\n text: cfg.label,\r\n fill: style.fill || '#999',\r\n fontSize: style.fontSize || 16\r\n },\r\n name: 'cursor-text-shape'\r\n });\r\n const { width: textWidth, height: textHeight } = text.getBBox();\r\n bgRect.attr({\r\n width: textWidth + 6,\r\n height: textHeight + 6\r\n });\r\n const markerEndPosition = cfg.markerEndPosition;\r\n if (markerEndPosition) {\r\n let textX = markerEndPosition[0], textY = markerEndPosition[1];\r\n text.attr({\r\n x: textX,\r\n y: textY\r\n });\r\n bgRect.attr({\r\n x: textX - textWidth / 2 - 3,\r\n y: textY - textHeight / 2 - 3\r\n });\r\n }\r\n }\r\n return keyShape;\r\n },\r\n getPath(cfg) {\r\n let width = cfg.size[0], height = cfg.size[1];\r\n const path = [\r\n ['M', 0, 0],\r\n ['L', -width / 2, -height],\r\n ['L', width / 2, -height],\r\n ['L', 0, 0],\r\n ['Z'],\r\n ];\r\n return path;\r\n }\r\n});\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvUmVnaXN0ZXJlZFNoYXBlL2N1cnNvci50cz9iNjZlIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEscUNBQTBCO0FBRzFCLGtCQUFlLFlBQUUsQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFO0lBQ3JDLElBQUksQ0FBQyxHQUFHLEVBQUUsS0FBSztRQUNYLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFO1lBQ3BDLEtBQUssRUFBRTtnQkFDSCxJQUFJLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUM7Z0JBQ3ZCLElBQUksRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUk7Z0JBQ3BCLE1BQU0sRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU07YUFDM0I7WUFDRCxJQUFJLEVBQUUsYUFBYTtTQUN0QixDQUFDLENBQUM7UUFFSCxJQUFJLEdBQUcsQ0FBQyxLQUFLLEVBQUU7WUFDWCxNQUFNLEtBQUssR0FBRyxDQUFDLEdBQUcsQ0FBQyxRQUFRLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7WUFFekQsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUU7Z0JBQ2xDLEtBQUssRUFBRTtvQkFDSCxDQUFDLEVBQUUsQ0FBQztvQkFDSixDQUFDLEVBQUUsQ0FBQztvQkFDSixJQUFJLEVBQUUsR0FBRyxDQUFDLEtBQUs7b0JBQ2YsSUFBSSxFQUFFLFNBQVM7b0JBQ2YsTUFBTSxFQUFFLENBQUM7aUJBQ1o7Z0JBQ0QsSUFBSSxFQUFFLFFBQVE7YUFDakIsQ0FBQyxDQUFDO1lBRUgsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUU7Z0JBQ2hDLEtBQUssRUFBRTtvQkFDSCxDQUFDLEVBQUUsQ0FBQztvQkFDSixDQUFDLEVBQUUsQ0FBQztvQkFDSixTQUFTLEVBQUUsUUFBUTtvQkFDbkIsWUFBWSxFQUFFLFFBQVE7b0JBQ3RCLElBQUksRUFBRSxHQUFHLENBQUMsS0FBSztvQkFDZixJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksSUFBSSxNQUFNO29CQUMxQixRQUFRLEVBQUUsS0FBSyxDQUFDLFFBQVEsSUFBSSxFQUFFO2lCQUNqQztnQkFDRCxJQUFJLEVBQUUsbUJBQW1CO2FBQzVCLENBQUMsQ0FBQztZQUVILE1BQU0sRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDaEUsTUFBTSxDQUFDLElBQUksQ0FBQztnQkFDUixLQUFLLEVBQUUsU0FBUyxHQUFHLENBQUM7Z0JBQ3BCLE1BQU0sRUFBRSxVQUFVLEdBQUcsQ0FBQzthQUN6QixDQUFDLENBQUM7WUFHSCxNQUFNLGlCQUFpQixHQUFHLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQztZQUNoRCxJQUFHLGlCQUFpQixFQUFFO2dCQUNsQixJQUFJLEtBQUssR0FBRyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsRUFDNUIsS0FBSyxHQUFHLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUVqQyxJQUFJLENBQUMsSUFBSSxDQUFDO29CQUNOLENBQUMsRUFBRSxLQUFLO29CQUNSLENBQUMsRUFBRSxLQUFLO2lCQUNYLENBQUMsQ0FBQztnQkFFSCxNQUFNLENBQUMsSUFBSSxDQUFDO29CQUNSLENBQUMsRUFBRSxLQUFLLEdBQUcsU0FBUyxHQUFHLENBQUMsR0FBRyxDQUFDO29CQUM1QixDQUFDLEVBQUUsS0FBSyxHQUFHLFVBQVUsR0FBRyxDQUFDLEdBQUcsQ0FBQztpQkFDaEMsQ0FBQyxDQUFDO2FBQ047U0FDSjtRQUVELE9BQU8sUUFBUSxDQUFDO0lBQ3BCLENBQUM7SUFHRCxPQUFPLENBQUMsR0FBRztRQUNQLElBQUksS0FBSyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQ25CLE1BQU0sR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXpCLE1BQU0sSUFBSSxHQUFHO1lBQ1QsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNYLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxHQUFHLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQztZQUMxQixDQUFDLEdBQUcsRUFBRSxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDO1lBQ3pCLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDWCxDQUFDLEdBQUcsQ0FBQztTQUNSLENBQUM7UUFFRixPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0NBQ0osQ0FBQyxDQUFDIiwiZmlsZSI6IjU3NC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBHNiBmcm9tICdAYW50di9nNic7XHJcblxyXG5cclxuZXhwb3J0IGRlZmF1bHQgRzYucmVnaXN0ZXJOb2RlKCdjdXJzb3InLCB7XHJcbiAgICBkcmF3KGNmZywgZ3JvdXApIHtcclxuICAgICAgICBjb25zdCBrZXlTaGFwZSA9IGdyb3VwLmFkZFNoYXBlKCdwYXRoJywge1xyXG4gICAgICAgICAgICBhdHRyczoge1xyXG4gICAgICAgICAgICAgICAgcGF0aDogdGhpcy5nZXRQYXRoKGNmZyksXHJcbiAgICAgICAgICAgICAgICBmaWxsOiBjZmcuc3R5bGUuZmlsbCxcclxuICAgICAgICAgICAgICAgIG1hdHJpeDogY2ZnLnN0eWxlLm1hdHJpeFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBuYW1lOiAnY3Vyc29yLXBhdGgnXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGlmIChjZmcubGFiZWwpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3R5bGUgPSAoY2ZnLmxhYmVsQ2ZnICYmIGNmZy5sYWJlbENmZy5zdHlsZSkgfHwge307XHJcblxyXG4gICAgICAgICAgICBjb25zdCBiZ1JlY3QgPSBncm91cC5hZGRTaGFwZSgncmVjdCcsIHtcclxuICAgICAgICAgICAgICAgIGF0dHJzOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgeDogMCwgXHJcbiAgICAgICAgICAgICAgICAgICAgeTogMCxcclxuICAgICAgICAgICAgICAgICAgICB0ZXh0OiBjZmcubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgZmlsbDogJyNmYWZhZmEnLFxyXG4gICAgICAgICAgICAgICAgICAgIHJhZGl1czogMixcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBuYW1lOiAnYmdSZWN0J1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHRleHQgPSBncm91cC5hZGRTaGFwZSgndGV4dCcsIHtcclxuICAgICAgICAgICAgICAgIGF0dHJzOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgeDogMCwgXHJcbiAgICAgICAgICAgICAgICAgICAgeTogMCxcclxuICAgICAgICAgICAgICAgICAgICB0ZXh0QWxpZ246ICdjZW50ZXInLFxyXG4gICAgICAgICAgICAgICAgICAgIHRleHRCYXNlbGluZTogJ21pZGRsZScsXHJcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogY2ZnLmxhYmVsLFxyXG4gICAgICAgICAgICAgICAgICAgIGZpbGw6IHN0eWxlLmZpbGwgfHwgJyM5OTknLFxyXG4gICAgICAgICAgICAgICAgICAgIGZvbnRTaXplOiBzdHlsZS5mb250U2l6ZSB8fCAxNlxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIG5hbWU6ICdjdXJzb3ItdGV4dC1zaGFwZSdcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCB7IHdpZHRoOiB0ZXh0V2lkdGgsIGhlaWdodDogdGV4dEhlaWdodCB9ID0gdGV4dC5nZXRCQm94KCk7XHJcbiAgICAgICAgICAgIGJnUmVjdC5hdHRyKHsgXHJcbiAgICAgICAgICAgICAgICB3aWR0aDogdGV4dFdpZHRoICsgNixcclxuICAgICAgICAgICAgICAgIGhlaWdodDogdGV4dEhlaWdodCArIDZcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAvLyDml4vovazmloflrZdcclxuICAgICAgICAgICAgY29uc3QgbWFya2VyRW5kUG9zaXRpb24gPSBjZmcubWFya2VyRW5kUG9zaXRpb247XHJcbiAgICAgICAgICAgIGlmKG1hcmtlckVuZFBvc2l0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgdGV4dFggPSBtYXJrZXJFbmRQb3NpdGlvblswXSxcclxuICAgICAgICAgICAgICAgICAgICB0ZXh0WSA9IG1hcmtlckVuZFBvc2l0aW9uWzFdO1xyXG5cclxuICAgICAgICAgICAgICAgIHRleHQuYXR0cih7IFxyXG4gICAgICAgICAgICAgICAgICAgIHg6IHRleHRYLFxyXG4gICAgICAgICAgICAgICAgICAgIHk6IHRleHRZXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICBiZ1JlY3QuYXR0cih7IFxyXG4gICAgICAgICAgICAgICAgICAgIHg6IHRleHRYIC0gdGV4dFdpZHRoIC8gMiAtIDMsXHJcbiAgICAgICAgICAgICAgICAgICAgeTogdGV4dFkgLSB0ZXh0SGVpZ2h0IC8gMiAtIDNcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4ga2V5U2hhcGU7XHJcbiAgICB9LFxyXG5cclxuICAgIFxyXG4gICAgZ2V0UGF0aChjZmcpIHtcclxuICAgICAgICBsZXQgd2lkdGggPSBjZmcuc2l6ZVswXSxcclxuICAgICAgICAgICAgaGVpZ2h0ID0gY2ZnLnNpemVbMV07XHJcblxyXG4gICAgICAgIGNvbnN0IHBhdGggPSBbXHJcbiAgICAgICAgICAgIFsnTScsIDAsIDBdLCBcclxuICAgICAgICAgICAgWydMJywgLXdpZHRoIC8gMiwgLWhlaWdodF0sXHJcbiAgICAgICAgICAgIFsnTCcsIHdpZHRoIC8gMiwgLWhlaWdodF0sXHJcbiAgICAgICAgICAgIFsnTCcsIDAsIDBdLFxyXG4gICAgICAgICAgICBbJ1onXSwgXHJcbiAgICAgICAgXTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHBhdGg7XHJcbiAgICB9XHJcbn0pOyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///574\n")},function(module,exports,__webpack_require__){"use strict";eval("\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nconst g6_1 = __webpack_require__(50);\r\nexports.default = g6_1.default.registerNode('indexed-node', {\r\n draw(cfg, group) {\r\n cfg.size = cfg.size || [30, 10];\r\n const width = cfg.size[0], height = cfg.size[1], disable = cfg.disable === undefined ? false : cfg.disable;\r\n const rect = group.addShape('rect', {\r\n attrs: {\r\n x: width / 2,\r\n y: height / 2,\r\n width: width,\r\n height: height,\r\n stroke: cfg.style.stroke || '#333',\r\n fill: disable ? '#ccc' : cfg.style.fill,\r\n cursor: cfg.style.cursor,\r\n },\r\n name: 'wrapper'\r\n });\r\n if (cfg.label) {\r\n const style = (cfg.labelCfg && cfg.labelCfg.style) || {};\r\n group.addShape('text', {\r\n attrs: {\r\n x: width,\r\n y: height,\r\n textAlign: 'center',\r\n textBaseline: 'middle',\r\n text: cfg.label,\r\n fill: style.fill || '#000',\r\n fontSize: style.fontSize || 16\r\n },\r\n name: 'text'\r\n });\r\n }\r\n const indexCfg = cfg.indexCfg;\r\n const offset = 20;\r\n const indexPositionMap = {\r\n top: (width, height) => ({ x: width, y: height / 2 - offset }),\r\n right: (width, height) => ({ x: width * 1.5 + offset, y: height }),\r\n bottom: (width, height) => ({ x: width, y: height * 1.5 + offset }),\r\n left: (width, height) => ({ x: width / 2 - offset, y: height })\r\n };\r\n if (indexCfg !== undefined) {\r\n Object.keys(indexCfg).map(key => {\r\n let indexCfgItem = indexCfg[key];\r\n let position = indexCfgItem.position || 'bottom';\r\n let { x: indexX, y: indexY } = indexPositionMap[position](width, height);\r\n group.addShape('text', {\r\n attrs: Object.assign({ x: indexX, y: indexY, textAlign: 'center', textBaseline: 'middle', text: indexCfgItem.value.toString(), fill: '#bbb', fontSize: 14, fontStyle: 'italic' }, indexCfgItem.style),\r\n name: 'index-text'\r\n });\r\n });\r\n }\r\n return rect;\r\n },\r\n getAnchorPoints() {\r\n return [\r\n [0.5, 0],\r\n [1, 0.5],\r\n [0.5, 1],\r\n [0, 0.5]\r\n ];\r\n }\r\n});\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvUmVnaXN0ZXJlZFNoYXBlL2luZGV4ZWROb2RlLnRzP2ZmZDgiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxxQ0FBMEI7QUFHMUIsa0JBQWUsWUFBRSxDQUFDLFlBQVksQ0FBQyxjQUFjLEVBQUU7SUFDM0MsSUFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLO1FBQ1gsR0FBRyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWhDLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQ3JCLE1BQU0sR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUNwQixPQUFPLEdBQUcsR0FBRyxDQUFDLE9BQU8sS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQztRQUU5RCxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRTtZQUNoQyxLQUFLLEVBQUU7Z0JBQ0gsQ0FBQyxFQUFFLEtBQUssR0FBRyxDQUFDO2dCQUNaLENBQUMsRUFBRSxNQUFNLEdBQUcsQ0FBQztnQkFDYixLQUFLLEVBQUUsS0FBSztnQkFDWixNQUFNLEVBQUUsTUFBTTtnQkFDZCxNQUFNLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLElBQUksTUFBTTtnQkFDbEMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUk7Z0JBQ3ZDLE1BQU0sRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU07YUFDM0I7WUFDRCxJQUFJLEVBQUUsU0FBUztTQUNsQixDQUFDLENBQUM7UUFFSCxJQUFJLEdBQUcsQ0FBQyxLQUFLLEVBQUU7WUFDWCxNQUFNLEtBQUssR0FBRyxDQUFD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Q0FBQztDQUNKLENBQUMsQ0FBQyIsImZpbGUiOiI1NzUuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgRzYgZnJvbSAnQGFudHYvZzYnO1xyXG5cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEc2LnJlZ2lzdGVyTm9kZSgnaW5kZXhlZC1ub2RlJywge1xyXG4gICAgZHJhdyhjZmcsIGdyb3VwKSB7XHJcbiAgICAgICAgY2ZnLnNpemUgPSBjZmcuc2l6ZSB8fCBbMzAsIDEwXTtcclxuXHJcbiAgICAgICAgY29uc3Qgd2lkdGggPSBjZmcuc2l6ZVswXSxcclxuICAgICAgICAgICAgaGVpZ2h0ID0gY2ZnLnNpemVbMV0sXHJcbiAgICAgICAgICAgIGRpc2FibGUgPSBjZmcuZGlzYWJsZSA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiBjZmcuZGlzYWJsZTtcclxuXHJcbiAgICAgICAgY29uc3QgcmVjdCA9IGdyb3VwLmFkZFNoYXBlKCdyZWN0Jywge1xyXG4gICAgICAgICAgICBhdHRyczoge1xyXG4gICAgICAgICAgICAgICAgeDogd2lkdGggLyAyLFxyXG4gICAgICAgICAgICAgICAgeTogaGVpZ2h0IC8gMixcclxuICAgICAgICAgICAgICAgIHdpZHRoOiB3aWR0aCxcclxuICAgICAgICAgICAgICAgIGhlaWdodDogaGVpZ2h0LFxyXG4gICAgICAgICAgICAgICAgc3Ryb2tlOiBjZmcuc3R5bGUuc3Ryb2tlIHx8ICcjMzMzJyxcclxuICAgICAgICAgICAgICAgIGZpbGw6IGRpc2FibGUgPyAnI2NjYycgOiBjZmcuc3R5bGUuZmlsbCxcclxuICAgICAgICAgICAgICAgIGN1cnNvcjogY2ZnLnN0eWxlLmN1cnNvcixcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgbmFtZTogJ3dyYXBwZXInXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGlmIChjZmcubGFiZWwpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3R5bGUgPSAoY2ZnLmxhYmVsQ2ZnICYmIGNmZy5sYWJlbENmZy5zdHlsZSkgfHwge307XHJcbiAgICAgICAgICAgIGdyb3VwLmFkZFNoYXBlKCd0ZXh0Jywge1xyXG4gICAgICAgICAgICAgICAgYXR0cnM6IHtcclxuICAgICAgICAgICAgICAgICAgICB4OiB3aWR0aCxcclxuICAgICAgICAgICAgICAgICAgICB5OiBoZWlnaHQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGV4dEFsaWduOiAnY2VudGVyJyxcclxuICAgICAgICAgICAgICAgICAgICB0ZXh0QmFzZWxpbmU6ICdtaWRkbGUnLFxyXG4gICAgICAgICAgICAgICAgICAgIHRleHQ6IGNmZy5sYWJlbCxcclxuICAgICAgICAgICAgICAgICAgICBmaWxsOiBzdHlsZS5maWxsIHx8ICcjMDAwJyxcclxuICAgICAgICAgICAgICAgICAgICBmb250U2l6ZTogc3R5bGUuZm9udFNpemUgfHwgMTZcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBuYW1lOiAndGV4dCdcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBpbmRleENmZyA9IGNmZy5pbmRleENmZztcclxuICAgICAgICBjb25zdCBvZmZzZXQgPSAyMDtcclxuICAgICAgICBjb25zdCBpbmRleFBvc2l0aW9uTWFwOiB7IFtrZXk6IHN0cmluZ106ICh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcikgPT4geyB4OiBudW1iZXIsIHk6IG51bWJlciB9IH0gPSB7XHJcbiAgICAgICAgICAgIHRvcDogKHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKSA9PiAoeyB4OiB3aWR0aCwgeTogaGVpZ2h0IC8gMiAtIG9mZnNldCB9KSxcclxuICAgICAgICAgICAgcmlnaHQ6ICh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcikgPT4gKHsgeDogd2lkdGggKiAxLjUgKyBvZmZzZXQsIHk6IGhlaWdodCB9KSxcclxuICAgICAgICAgICAgYm90dG9tOiAod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpID0+ICh7IHg6IHdpZHRoLCB5OiBoZWlnaHQgKiAxLjUgKyBvZmZzZXQgfSksXHJcbiAgICAgICAgICAgIGxlZnQ6ICh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcikgPT4gKHsgeDogd2lkdGggLyAyIC0gb2Zmc2V0LCB5OiBoZWlnaHQgfSlcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBpZiAoaW5kZXhDZmcgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBPYmplY3Qua2V5cyhpbmRleENmZykubWFwKGtleSA9PiB7XHJcbiAgICAgICAgICAgICAgICBsZXQgaW5kZXhDZmdJdGVtID0gaW5kZXhDZmdba2V5XTtcclxuICAgICAgICAgICAgICAgIGxldCBwb3NpdGlvbiA9IGluZGV4Q2ZnSXRlbS5wb3NpdGlvbiB8fCAnYm90dG9tJztcclxuICAgICAgICAgICAgICAgIGxldCB7IHg6IGluZGV4WCwgeTogaW5kZXhZIH0gPSBpbmRleFBvc2l0aW9uTWFwW3Bvc2l0aW9uXSh3aWR0aCwgaGVpZ2h0KTtcclxuXHJcbiAgICAgICAgICAgICAgICBncm91cC5hZGRTaGFwZSgndGV4dCcsIHtcclxuICAgICAgICAgICAgICAgICAgICBhdHRyczoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB4OiBpbmRleFgsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHk6IGluZGV4WSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dEFsaWduOiAnY2VudGVyJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dEJhc2VsaW5lOiAnbWlkZGxlJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogaW5kZXhDZmdJdGVtLnZhbHVlLnRvU3RyaW5nKCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw6ICcjYmJiJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9udFNpemU6IDE0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb250U3R5bGU6ICdpdGFsaWMnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5pbmRleENmZ0l0ZW0uc3R5bGVcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICdpbmRleC10ZXh0J1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHJlY3Q7XHJcbiAgICB9LFxyXG5cclxuICAgIGdldEFuY2hvclBvaW50cygpIHtcclxuICAgICAgICByZXR1cm4gW1xyXG4gICAgICAgICAgICBbMC41LCAwXSxcclxuICAgICAgICAgICAgWzEsIDAuNV0sXHJcbiAgICAgICAgICAgIFswLjUsIDFdLFxyXG4gICAgICAgICAgICBbMCwgMC41XVxyXG4gICAgICAgIF07XHJcbiAgICB9XHJcbn0pOyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///575\n")}])}));